diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 000000000..749ab62c5 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,16 @@ +--- +kind: pipeline +type: docker +name: EQEmulator Server Linux CI + +# Limits how many of these builds can run on the drone runner at a time, this isn't about cores +concurrency: + limit: 1 + +steps: + - name: server-build + # Source build script https://github.com/Akkadius/akk-stack/blob/master/containers/eqemu-server/Dockerfile#L20 + image: akkadius/eqemu-server:latest + commands: + - sudo chown eqemu:eqemu /drone/src/ * -R + - git submodule init && git submodule update && mkdir -p build && cd build && cmake -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_BOTS=ON -DEQEMU_BUILD_LUA=ON -G 'Unix Makefiles' .. && make -j$((`nproc`-4)) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 287c07412..1db525804 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,20 @@ perl/ submodules/* cmake-build-debug/ -.nfs.* \ No newline at end of file +.nfs.* + +# Visual Studio and CMAKE Generated Files +/.vs/ +*.vcxproj +*.vcxproj.filters +*.vcxproj.user +*.cmake +*.ilk +*.pdb +*.sln +*.dir/ +libs/ +bin/ +/Win32 +/x64 +/client_files/**/CMakeFiles/ diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1c6e5c871..a955aa60c 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -6,7 +6,7 @@ { "label": "make", "type": "shell", - "command": "cd build && make", + "command": "cd bin && make", "group": { "kind": "build", "isDefault": true @@ -18,7 +18,7 @@ { "label": "make clean", "type": "shell", - "command": "cd build && make clean", + "command": "cd bin && make clean", "group": { "kind": "build", "isDefault": true @@ -30,7 +30,7 @@ { "label": "cmake", "type": "shell", - "command": "mkdir -p build && cd build && rm CMakeCache.txt && cmake -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -G 'Unix Makefiles' ..", + "command": "mkdir -p bin && cd bin && rm CMakeCache.txt && cmake -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -G 'Unix Makefiles' ..", "group": { "kind": "build", "isDefault": true @@ -52,7 +52,7 @@ { "label": "download maps", "type": "shell", - "command": "mkdir -p build/bin && cd build/bin && wget https://codeload.github.com/Akkadius/EQEmuMaps/zip/master -O maps.zip && unzip -o maps.zip && rm ./maps -rf && mv EQEmuMaps-master maps && rm maps.zip", + "command": "mkdir -p bin && cd bin && wget https://codeload.github.com/Akkadius/EQEmuMaps/zip/master -O maps.zip && unzip -o maps.zip && rm ./maps -rf && mv EQEmuMaps-master maps && rm maps.zip", "group": { "kind": "build", "isDefault": true @@ -64,7 +64,7 @@ { "label": "download quests", "type": "shell", - "command": "mkdir -p build/bin && cd build/bin && cd server && git -C ./quests pull 2> /dev/null || git clone https://github.com/ProjectEQ/projecteqquests.git quests", + "command": "mkdir -p bin && cd bin && cd server && git -C ./quests pull 2> /dev/null || git clone https://github.com/ProjectEQ/projecteqquests.git quests", "group": { "kind": "build", "isDefault": true @@ -76,7 +76,7 @@ { "label": "download eqemu_config", "type": "shell", - "command": "mkdir -p build/bin && cd build/bin && wget --no-check-certificate https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/eqemu_config_docker.json -O eqemu_config.json", + "command": "mkdir -p bin && cd bin && wget --no-check-certificate https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/eqemu_config_docker.json -O eqemu_config.json", "group": { "kind": "build", "isDefault": true @@ -88,7 +88,7 @@ { "label": "rebuild database (mariadb must be started)", "type": "shell", - "command": "mkdir -p build/bin && cd build/bin && docker run -i --rm --privileged -v ${HOST_PROJECT_PATH}/build/bin:/src --network=eqemu -it eqemu/server:0.0.3 bash -c './eqemu_server.pl source_peq_db && ./eqemu_server.pl check_db_updates && ./eqemu_server.pl linux_login_server_setup'", + "command": "mkdir -p bin && cd bin && docker run -i --rm --privileged -v ${HOST_PROJECT_PATH}/bin:/src --network=eqemu -it eqemu/server:0.0.3 bash -c './eqemu_server.pl source_peq_db && ./eqemu_server.pl check_db_updates && ./eqemu_server.pl linux_login_server_setup'", "group": { "kind": "build", "isDefault": true @@ -100,7 +100,7 @@ { "label": "zone 7000", "type": "shell", - "command": "docker stop zone7000 | true && docker network create eqemu | true && docker run -i --rm --name zone7000 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/build/bin:/src --ulimit core=10000000 --network=eqemu -p 7000:7000/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./zone dynamic_zone7000:7000", + "command": "docker stop zone7000 | true && docker network create eqemu | true && docker run -i --rm --name zone7000 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 --network=eqemu -p 7000:7000/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./zone dynamic_zone7000:7000", "group": { "kind": "test", "isDefault": true @@ -109,7 +109,7 @@ { "label": "zone 7001", "type": "shell", - "command": "docker stop zone7001 | true && docker network create eqemu | true && docker run -i --rm --name zone7001 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/build/bin:/src --ulimit core=10000000 --network=eqemu -p 7001:7001/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./zone dynamic_zone7001:7001", + "command": "docker stop zone7001 | true && docker network create eqemu | true && docker run -i --rm --name zone7001 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 --network=eqemu -p 7001:7001/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./zone dynamic_zone7001:7001", "group": { "kind": "test", "isDefault": true @@ -118,7 +118,7 @@ { "label": "loginserver", "type": "shell", - "command": "docker stop loginserver | true && docker network create eqemu | true && docker run -i --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/build/bin:/src --ulimit core=10000000 --network=eqemu --name loginserver -p 5999:5999/udp -p 5998:5998/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./loginserver", + "command": "docker stop loginserver | true && docker network create eqemu | true && docker run -i --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 --network=eqemu --name loginserver -p 5999:5999/udp -p 5998:5998/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./loginserver", "group": { "kind": "test", "isDefault": true @@ -127,7 +127,7 @@ { "label": "shared_memory, world", "type": "shell", - "command": "docker stop sharedmemory | true && docker stop world | true && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/build/bin:/src --network=eqemu --name sharedmemory eqemu/server:0.0.3 ./shared_memory && docker run --rm -v ${HOST_PROJECT_PATH}/build/bin:/src --ulimit core=10000000 -e LD_LIBRARY_PATH=/src/ --network=eqemu --name world -p 9000:9000 -p 9000:9000/udp -p 9001:9001 -p 9080:9080 eqemu/server:0.0.3 gdb -ex run ./world", + "command": "docker stop sharedmemory | true && docker stop world | true && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src --network=eqemu --name sharedmemory eqemu/server:0.0.3 ./shared_memory && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 -e LD_LIBRARY_PATH=/src/ --network=eqemu --name world -p 9000:9000 -p 9000:9000/udp -p 9001:9001 -p 9080:9080 eqemu/server:0.0.3 gdb -ex run ./world", "group": { "kind": "test", "isDefault": true @@ -136,7 +136,7 @@ { "label": "queryserv", "type": "shell", - "command": "docker stop queryserv | true && docker run --rm -v ${HOST_PROJECT_PATH}/build/bin:/src --ulimit core=10000000 -e LD_LIBRARY_PATH=/src/ --network=eqemu --name queryserv eqemu/server:0.0.3 gdb -ex run ./queryserv", + "command": "docker stop queryserv | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 -e LD_LIBRARY_PATH=/src/ --network=eqemu --name queryserv eqemu/server:0.0.3 gdb -ex run ./queryserv", "group": { "kind": "test", "isDefault": true @@ -145,7 +145,16 @@ { "label": "mariadb", "type": "shell", - "command": "docker stop mariadb | true && cd build/bin && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/build/bin/db:/bitnami/mariadb -p 3306:3306 -e MARIADB_DATABASE=peq -e MARIADB_USER=eqemu -e MARIADB_PASSWORD=eqemupass -e ALLOW_EMPTY_PASSWORD=yes --name mariadb --network=eqemu bitnami/mariadb:latest", + "command": "docker stop mariadb | true && cd bin && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin/db:/bitnami/mariadb -p 3306:3306 -e MARIADB_DATABASE=peq -e MARIADB_USER=eqemu -e MARIADB_PASSWORD=eqemupass -e ALLOW_EMPTY_PASSWORD=yes --name mariadb --network=eqemu bitnami/mariadb:latest", + "group": { + "kind": "test", + "isDefault": true + } + }, + { + "label": "ucs", + "type": "shell", + "command": "docker stop ucs | true && cd bin && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src -p 7778:7778 --name ucs --network=eqemu eqemu/server:0.0.3 gdb -ex run ./ucs", "group": { "kind": "test", "isDefault": true diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b12e2ee1..526d68099 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) -SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD 14) SET(CMAKE_CXX_STANDARD_REQUIRED ON) SET(CMAKE_CXX_EXTENSIONS OFF) @@ -55,6 +55,7 @@ FIND_PACKAGE(MariaDB) FIND_PACKAGE(ZLIB) FIND_PACKAGE(OpenSSL) FIND_PACKAGE(Lua51) +FIND_PACKAGE(LuaJit) FIND_PACKAGE(PerlLibs) FIND_PACKAGE(Sodium) FIND_PACKAGE(mbedTLS) @@ -87,6 +88,12 @@ ELSE() MESSAGE(STATUS "* Lua: MISSING *") ENDIF() +IF(LuaJit_FOUND) + MESSAGE(STATUS "* LuaJIT: FOUND *") +ELSE() + MESSAGE(STATUS "* LuaJIT: MISSING *") +ENDIF() + IF(PerlLibs_FOUND) MESSAGE(STATUS "* Perl: FOUND *") ELSE() @@ -122,6 +129,7 @@ OPTION(EQEMU_BUILD_LOGIN "Build the login server." ON) OPTION(EQEMU_BUILD_HC "Build the headless client." OFF) OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF) OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON) +OPTION(EQEMU_PREFER_LUA "Build with normal Lua even if LuaJIT is found." OFF) IF(EQEMU_COMMANDS_LOGGING) ADD_DEFINITIONS(-DCOMMANDS_LOGGING) @@ -133,7 +141,7 @@ ENDIF(EQEMU_ENABLE_BOTS) #database IF(MySQL_FOUND AND MariaDB_FOUND) - SET(DATABASE_LIBRARY_SELECTION MySQL CACHE STRING "Database library to use: + SET(DATABASE_LIBRARY_SELECTION MariaDB CACHE STRING "Database library to use: MySQL MariaDB" ) @@ -212,7 +220,12 @@ ELSE() SET(SODIUM_LIBRARY_ENABLED OFF) ENDIF() -IF(Lua51_FOUND) +IF(LUAJIT_FOUND AND NOT (EQEMU_PREFER_LUA AND Lua51_FOUND)) + SET(LUA_LIBRARY_TYPE " LuaJIT") + SET(LUA_LIBRARY_ENABLED ON) + SET(LUA_LIBRARY_LIBS ${LUAJIT_LIBRARY} luabind) + SET(LUA_LIBRARY_INCLUDE ${LUAJIT_INCLUDE_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/libs/luabind") +ELSEIF(Lua51_FOUND ) SET(LUA_LIBRARY_TYPE " Lua 5.1") SET(LUA_LIBRARY_ENABLED ON) SET(LUA_LIBRARY_LIBS ${LUA_LIBRARY} luabind) @@ -239,6 +252,7 @@ IF(ZLIB_FOUND) SET(ZLIB_LIBRARY_TYPE "zlib-ng") SET(ZLIB_LIBRARY_LIBS "zlibstatic") SET(ZLIB_LIBRARY_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng") + INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_BINARY_DIR}/libs/zlibng") ELSE() SET(ZLIB_LIBRARY_TYPE " zlib") SET(ZLIB_LIBRARY_LIBS ${ZLIB_LIBRARY}) @@ -299,7 +313,7 @@ IF(LUA_LIBRARY_ENABLED) IF(EQEMU_BUILD_LUA) ADD_DEFINITIONS(-DLUA_EQEMU) - SET(SERVER_LIBS ${SERVER_LIBS} ${LUA_LIBRARY_LIBS}) + SET(ZONE_LIBS ${LUA_LIBRARY_LIBS}) INCLUDE_DIRECTORIES(SYSTEM "${LUA_LIBRARY_INCLUDE}") OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON) @@ -328,9 +342,14 @@ IF(UNIX) IF(NOT DARWIN) SET(SERVER_LIBS ${SERVER_LIBS} "rt") ENDIF() - SET(SERVER_LIBS ${SERVER_LIBS} "uuid") + # Freebsd provides uuids in the C library + IF(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") + SET(SERVER_LIBS ${SERVER_LIBS} "uuid") + ENDIF() ENDIF() +SET(ZONE_LIBS ${ZONE_LIBS} ${SERVER_LIBS}) + IF(EQEMU_BUILD_LOGIN AND NOT TLS_LIBRARY_ENABLED) MESSAGE(FATAL_ERROR "Login server requires a TLS Library to build.") ENDIF() diff --git a/README.md b/README.md index f3b829732..fea2c23a4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # EQEmulator Core Server -|Travis CI (Linux)|Appveyor w/ Bots (Windows) |Appveyor w/o Bots (Windows) | +|Travis CI (Linux)|Appveyor (Windows x86) |Appveyor (Windows x64) | |:---:|:---:|:---:| -|[![Linux CI](https://travis-ci.org/EQEmu/Server.svg?branch=master)](https://travis-ci.org/EQEmu/Server) |[![Build status](https://ci.appveyor.com/api/projects/status/scr25kmntx36c1ub/branch/master?svg=true)](https://ci.appveyor.com/project/KimLS/server-87crp/branch/master) |[![Build status](https://ci.appveyor.com/api/projects/status/mdwbr4o9l6mxqofj/branch/master?svg=true)](https://ci.appveyor.com/project/KimLS/server-w0pq2/branch/master) | +|[![Linux CI](https://travis-ci.org/EQEmu/Server.svg?branch=master)](https://travis-ci.org/EQEmu/Server) |[![Build status](https://ci.appveyor.com/api/projects/status/v3utuu0dttm2cqd0?svg=true)](https://ci.appveyor.com/project/KimLS/server) |[![Build status](https://ci.appveyor.com/api/projects/status/scr25kmntx36c1ub?svg=true)](https://ci.appveyor.com/project/KimLS/server-87crp) | *** @@ -17,9 +17,13 @@ |:---:|:---:|:---:| |**Install Count**|![Windows Install Count](http://analytics.akkadius.com/?install_count&windows_count)|![Linux Install Count](http://analytics.akkadius.com/?install_count&linux_count)| ### > Windows -* [Install](https://eqemu.gitbook.io/server/categories/how-to-guides/installation/server-installation-windows) + +* [Install Guide](https://eqemu.gitbook.io/server/categories/installation/server-installation-windows) ### > Debian/Ubuntu/CentOS/Fedora + +* [Install Guide](https://eqemu.gitbook.io/server/categories/installation/server-installation-linux) + * You can use curl or wget to kick off the installer (whichever your OS has) > curl -O https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/linux_installer/install.sh install.sh && chmod 755 install.sh && ./install.sh @@ -52,7 +56,7 @@ forum, although pull requests will be much quicker and easier on all parties. ## Resources - [EQEmulator Forums](http://www.eqemulator.org/forums) -- [EQEmulator Wiki](https://github.com/EQEmu/Server/wiki) +- [EQEmulator Wiki](https://eqemu.gitbook.io/) ## Related Repositories * [ProjectEQ Quests](https://github.com/ProjectEQ/projecteqquests) @@ -76,3 +80,4 @@ forum, although pull requests will be much quicker and easier on all parties. + diff --git a/appveyor-bots.yml b/appveyor-bots.yml index 9edb00593..540d9b3df 100644 --- a/appveyor-bots.yml +++ b/appveyor-bots.yml @@ -16,6 +16,6 @@ build: verbosity: minimal after_build: - cmd: >- - 7z a build_x64-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb + 7z a build_x64-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb C:\projects\eqemu\build\libs\zlibng\RelWithDebInfo\*.dll - appveyor PushArtifact build_x64-bots.zip \ No newline at end of file + appveyor PushArtifact build_x64-bots.zip diff --git a/appveyor-no-bots.yml b/appveyor-no-bots.yml index 7aea00332..0b0f5b8a2 100644 --- a/appveyor-no-bots.yml +++ b/appveyor-no-bots.yml @@ -16,6 +16,6 @@ build: verbosity: minimal after_build: - cmd: >- - 7z a build_x64-no-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb + 7z a build_x64-no-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb C:\projects\eqemu\build\libs\zlibng\RelWithDebInfo\*.dll - appveyor PushArtifact build_x64-no-bots.zip \ No newline at end of file + appveyor PushArtifact build_x64-no-bots.zip diff --git a/client_files/export/main.cpp b/client_files/export/main.cpp index a6f3c3bec..fd8b19026 100644 --- a/client_files/export/main.cpp +++ b/client_files/export/main.cpp @@ -26,8 +26,10 @@ #include "../../common/crash.h" #include "../../common/rulesys.h" #include "../../common/string_util.h" +#include "../../common/content/world_content_service.h" EQEmuLogSys LogSys; +WorldContentService content_service; void ExportSpells(SharedDatabase *db); void ExportSkillCaps(SharedDatabase *db); diff --git a/client_files/import/main.cpp b/client_files/import/main.cpp index 3c25fa618..64b2aee41 100644 --- a/client_files/import/main.cpp +++ b/client_files/import/main.cpp @@ -24,8 +24,10 @@ #include "../../common/crash.h" #include "../../common/rulesys.h" #include "../../common/string_util.h" +#include "../../common/content/world_content_service.h" EQEmuLogSys LogSys; +WorldContentService content_service; void ImportSpells(SharedDatabase *db); void ImportSkillCaps(SharedDatabase *db); @@ -87,7 +89,7 @@ int main(int argc, char **argv) { ImportDBStrings(&database); LogSys.CloseFileLogs(); - + return 0; } @@ -324,10 +326,10 @@ void ImportDBStrings(SharedDatabase *db) { std::string sql; int id, type; std::string value; - + id = atoi(split[0].c_str()); type = atoi(split[1].c_str()); - + if(split.size() >= 3) { value = ::EscapeString(split[2]); } diff --git a/cmake/FindLua51.cmake b/cmake/FindLua51.cmake index 47fa0aaae..0aab2bb82 100644 --- a/cmake/FindLua51.cmake +++ b/cmake/FindLua51.cmake @@ -38,7 +38,7 @@ locations other than lua/ find_path(LUA_INCLUDE_DIR lua.h HINTS ENV LUA_DIR - PATH_SUFFIXES include/lua51 include/lua5.1 include/lua-5.1 include/lua include/luajit include + PATH_SUFFIXES include/lua51 include/lua5.1 include/lua-5.1 include/lua include PATHS ~/Library/Frameworks /Library/Frameworks @@ -49,7 +49,7 @@ find_path(LUA_INCLUDE_DIR lua.h ) find_library(LUA_LIBRARY - NAMES lua51 lua5.1 lua-5.1 lua luajit + NAMES lua51 lua5.1 lua-5.1 lua HINTS ENV LUA_DIR PATH_SUFFIXES lib diff --git a/cmake/FindLuaJit.cmake b/cmake/FindLuaJit.cmake new file mode 100644 index 000000000..a7376dee1 --- /dev/null +++ b/cmake/FindLuaJit.cmake @@ -0,0 +1,91 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. +# Modified from the FindLua51 that comes with CMake + +#[=======================================================================[.rst: +FindLuaJit +--------- + + + +Locate LuaJit library This module defines + +:: + + LUAJIT_FOUND, if false, do not try to link to Lua + LUAJIT_LIBRARIES + LUAJIT_INCLUDE_DIR, where to find lua.h + LUAJIT_VERSION_STRING, the version of Lua found (since CMake 2.8.8) + + + +Note that the expected include convention is + +:: + + #include "lua.h" + +and not + +:: + + #include + +This is because, the lua location is not standardized and may exist in +locations other than lua/ +#]=======================================================================] + +find_path(LUAJIT_INCLUDE_DIR lua.h + HINTS + ENV LUA_DIR + PATH_SUFFIXES include/luajit include/luajit-2.0 include/luajit-2.1 include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt +) + +find_library(LUAJIT_LIBRARY + NAMES luajit51 luajit5.1 luajit-5.1 luajit lua51 + HINTS + ENV LUA_DIR + PATH_SUFFIXES lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /sw + /opt/local + /opt/csw + /opt +) + +if(LUAJIT_LIBRARY) + # include the math library for Unix + if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU) + find_library(LUAJIT_MATH_LIBRARY m) + set( LUAJIT_LIBRARIES "${LUAJIT_LIBRARY};${LUAJIT_MATH_LIBRARY}" CACHE STRING "Lua Libraries") + # For Windows and Mac, don't need to explicitly include the math library + else() + set( LUAJIT_LIBRARIES "${LUAJIT_LIBRARY}" CACHE STRING "Lua Libraries") + endif() +endif() + +if(LUAJIT_INCLUDE_DIR AND EXISTS "${LUAJIT_INCLUDE_DIR}/lua.h") + file(STRINGS "${LUAJIT_INCLUDE_DIR}/lua.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua .+\"") + + string(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua ([^\"]+)\".*" "\\1" LUAJIT_VERSION_STRING "${lua_version_str}") + unset(lua_version_str) +endif() + +include(${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) +# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJit + REQUIRED_VARS LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR + VERSION_VAR LUAJIT_VERSION_STRING) + +mark_as_advanced(LUAJIT_INCLUDE_DIR LUAJIT_LIBRARIES LUAJIT_LIBRARY LUAJIT_MATH_LIBRARY) + diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index d741ae81d..08db08585 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -6,6 +6,7 @@ SET(common_sources cli/eqemu_command_handler.cpp compression.cpp condition.cpp + content/world_content_service.cpp crash.cpp crc16.cpp crc32.cpp @@ -15,6 +16,7 @@ SET(common_sources database_instances.cpp dbcore.cpp deity.cpp + dynamic_zone_base.cpp emu_constants.cpp emu_limits.cpp emu_opcodes.cpp @@ -30,6 +32,8 @@ SET(common_sources eq_stream_proxy.cpp eqtime.cpp event_sub.cpp + expedition_base.cpp + expedition_lockout_timer.cpp extprofile.cpp faction.cpp file_util.cpp @@ -66,6 +70,7 @@ SET(common_sources rulesys.cpp say_link.cpp serialize_buffer.cpp + server_event_scheduler.cpp serverinfo.cpp shareddb.cpp skills.cpp @@ -108,6 +113,343 @@ SET(common_sources util/directory.cpp util/uuid.cpp) +SET(repositories + + # Criteria + repositories/criteria/content_filter_criteria.h + + # Base Repositories + repositories/base/base_aa_ability_repository.h + repositories/base/base_aa_ranks_repository.h + repositories/base/base_aa_rank_effects_repository.h + repositories/base/base_aa_rank_prereqs_repository.h + repositories/base/base_account_repository.h + repositories/base/base_account_flags_repository.h + repositories/base/base_account_ip_repository.h + repositories/base/base_account_rewards_repository.h + repositories/base/base_adventure_details_repository.h + repositories/base/base_adventure_members_repository.h + repositories/base/base_adventure_stats_repository.h + repositories/base/base_adventure_template_repository.h + repositories/base/base_adventure_template_entry_repository.h + repositories/base/base_adventure_template_entry_flavor_repository.h + repositories/base/base_alternate_currency_repository.h + repositories/base/base_auras_repository.h + repositories/base/base_base_data_repository.h + repositories/base/base_blocked_spells_repository.h + repositories/base/base_bugs_repository.h + repositories/base/base_bug_reports_repository.h + repositories/base/base_buyer_repository.h + repositories/base/base_character_activities_repository.h + repositories/base/base_character_alternate_abilities_repository.h + repositories/base/base_character_alt_currency_repository.h + repositories/base/base_character_auras_repository.h + repositories/base/base_character_bandolier_repository.h + repositories/base/base_character_bind_repository.h + repositories/base/base_character_buffs_repository.h + repositories/base/base_character_corpses_repository.h + repositories/base/base_character_corpse_items_repository.h + repositories/base/base_character_currency_repository.h + repositories/base/base_character_data_repository.h + repositories/base/base_character_disciplines_repository.h + repositories/base/base_character_expedition_lockouts_repository.h + repositories/base/base_character_inspect_messages_repository.h + repositories/base/base_character_item_recast_repository.h + repositories/base/base_character_languages_repository.h + repositories/base/base_character_leadership_abilities_repository.h + repositories/base/base_character_material_repository.h + repositories/base/base_character_memmed_spells_repository.h + repositories/base/base_character_pet_buffs_repository.h + repositories/base/base_character_pet_info_repository.h + repositories/base/base_character_pet_inventory_repository.h + repositories/base/base_character_potionbelt_repository.h + repositories/base/base_character_skills_repository.h + repositories/base/base_character_spells_repository.h + repositories/base/base_character_tasks_repository.h + repositories/base/base_char_create_combinations_repository.h + repositories/base/base_char_create_point_allocations_repository.h + repositories/base/base_char_recipe_list_repository.h + repositories/base/base_completed_tasks_repository.h + repositories/base/base_content_flags_repository.h + repositories/base/base_damageshieldtypes_repository.h + repositories/base/base_data_buckets_repository.h + repositories/base/base_db_str_repository.h + repositories/base/base_discovered_items_repository.h + repositories/base/base_doors_repository.h + repositories/base/base_dynamic_zones_repository.h + repositories/base/base_eventlog_repository.h + repositories/base/base_expeditions_repository.h + repositories/base/base_expedition_lockouts_repository.h + repositories/base/base_expedition_members_repository.h + repositories/base/base_faction_base_data_repository.h + repositories/base/base_faction_list_repository.h + repositories/base/base_faction_list_mod_repository.h + repositories/base/base_faction_values_repository.h + repositories/base/base_fishing_repository.h + repositories/base/base_forage_repository.h + repositories/base/base_friends_repository.h + repositories/base/base_global_loot_repository.h + repositories/base/base_gm_ips_repository.h + repositories/base/base_goallists_repository.h + repositories/base/base_graveyard_repository.h + repositories/base/base_grid_repository.h + repositories/base/base_grid_entries_repository.h + repositories/base/base_ground_spawns_repository.h + repositories/base/base_group_id_repository.h + repositories/base/base_group_leaders_repository.h + repositories/base/base_guilds_repository.h + repositories/base/base_guild_members_repository.h + repositories/base/base_guild_ranks_repository.h + repositories/base/base_guild_relations_repository.h + repositories/base/base_hackers_repository.h + repositories/base/base_instance_list_repository.h + repositories/base/base_instance_list_player_repository.h + repositories/base/base_inventory_repository.h + repositories/base/base_inventory_snapshots_repository.h + repositories/base/base_ip_exemptions_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_templates_repository.h + repositories/base/base_level_exp_mods_repository.h + repositories/base/base_lfguild_repository.h + repositories/base/base_login_accounts_repository.h + repositories/base/base_login_api_tokens_repository.h + repositories/base/base_login_server_admins_repository.h + repositories/base/base_login_server_list_types_repository.h + repositories/base/base_login_world_servers_repository.h + repositories/base/base_logsys_categories_repository.h + repositories/base/base_lootdrop_repository.h + repositories/base/base_lootdrop_entries_repository.h + repositories/base/base_loottable_repository.h + repositories/base/base_loottable_entries_repository.h + repositories/base/base_mail_repository.h + repositories/base/base_merchantlist_repository.h + repositories/base/base_merchantlist_temp_repository.h + repositories/base/base_name_filter_repository.h + repositories/base/base_npc_emotes_repository.h + repositories/base/base_npc_faction_repository.h + repositories/base/base_npc_faction_entries_repository.h + repositories/base/base_npc_scale_global_base_repository.h + repositories/base/base_npc_spells_repository.h + repositories/base/base_npc_spells_effects_repository.h + repositories/base/base_npc_spells_effects_entries_repository.h + repositories/base/base_npc_spells_entries_repository.h + repositories/base/base_npc_types_repository.h + repositories/base/base_npc_types_tint_repository.h + repositories/base/base_object_repository.h + repositories/base/base_object_contents_repository.h + repositories/base/base_perl_event_export_settings_repository.h + repositories/base/base_petitions_repository.h + repositories/base/base_pets_repository.h + repositories/base/base_pets_equipmentset_repository.h + repositories/base/base_pets_equipmentset_entries_repository.h + repositories/base/base_player_titlesets_repository.h + repositories/base/base_proximities_repository.h + repositories/base/base_quest_globals_repository.h + repositories/base/base_raid_details_repository.h + repositories/base/base_raid_members_repository.h + repositories/base/base_reports_repository.h + repositories/base/base_respawn_times_repository.h + repositories/base/base_rule_sets_repository.h + repositories/base/base_rule_values_repository.h + repositories/base/base_saylink_repository.h + repositories/base/base_server_scheduled_events_repository.h + repositories/base/base_skill_caps_repository.h + repositories/base/base_spawn2_repository.h + repositories/base/base_spawnentry_repository.h + repositories/base/base_spawngroup_repository.h + repositories/base/base_spawn_conditions_repository.h + repositories/base/base_spawn_condition_values_repository.h + repositories/base/base_spawn_events_repository.h + repositories/base/base_spells_new_repository.h + repositories/base/base_spell_buckets_repository.h + repositories/base/base_spell_globals_repository.h + repositories/base/base_starting_items_repository.h + repositories/base/base_start_zones_repository.h + repositories/base/base_tasks_repository.h + repositories/base/base_tasksets_repository.h + repositories/base/base_task_activities_repository.h + repositories/base/base_timers_repository.h + repositories/base/base_titles_repository.h + repositories/base/base_trader_repository.h + repositories/base/base_tradeskill_recipe_repository.h + repositories/base/base_tradeskill_recipe_entries_repository.h + repositories/base/base_traps_repository.h + repositories/base/base_tributes_repository.h + repositories/base/base_tribute_levels_repository.h + repositories/base/base_veteran_reward_templates_repository.h + repositories/base/base_zone_repository.h + repositories/base/base_zone_points_repository.h + + # Extended Repositories + repositories/aa_ability_repository.h + repositories/aa_ranks_repository.h + repositories/aa_rank_effects_repository.h + repositories/aa_rank_prereqs_repository.h + repositories/account_repository.h + repositories/account_flags_repository.h + repositories/account_ip_repository.h + repositories/account_rewards_repository.h + repositories/adventure_details_repository.h + repositories/adventure_members_repository.h + repositories/adventure_stats_repository.h + repositories/adventure_template_repository.h + repositories/adventure_template_entry_repository.h + repositories/adventure_template_entry_flavor_repository.h + repositories/alternate_currency_repository.h + repositories/auras_repository.h + repositories/base_data_repository.h + repositories/blocked_spells_repository.h + repositories/bugs_repository.h + repositories/bug_reports_repository.h + repositories/buyer_repository.h + repositories/character_activities_repository.h + repositories/character_alternate_abilities_repository.h + repositories/character_alt_currency_repository.h + repositories/character_auras_repository.h + repositories/character_bandolier_repository.h + repositories/character_bind_repository.h + repositories/character_buffs_repository.h + repositories/character_corpses_repository.h + repositories/character_corpse_items_repository.h + repositories/character_currency_repository.h + repositories/character_data_repository.h + repositories/character_disciplines_repository.h + repositories/character_expedition_lockouts_repository.h + repositories/character_inspect_messages_repository.h + repositories/character_item_recast_repository.h + repositories/character_languages_repository.h + repositories/character_leadership_abilities_repository.h + repositories/character_material_repository.h + repositories/character_memmed_spells_repository.h + repositories/character_pet_buffs_repository.h + repositories/character_pet_info_repository.h + repositories/character_pet_inventory_repository.h + repositories/character_potionbelt_repository.h + repositories/character_skills_repository.h + repositories/character_spells_repository.h + repositories/character_tasks_repository.h + repositories/char_create_combinations_repository.h + repositories/char_create_point_allocations_repository.h + repositories/char_recipe_list_repository.h + repositories/completed_tasks_repository.h + repositories/content_flags_repository.h + repositories/damageshieldtypes_repository.h + repositories/data_buckets_repository.h + repositories/db_str_repository.h + repositories/discovered_items_repository.h + repositories/doors_repository.h + repositories/dynamic_zones_repository.h + repositories/eventlog_repository.h + repositories/expeditions_repository.h + repositories/expedition_lockouts_repository.h + repositories/expedition_members_repository.h + repositories/faction_base_data_repository.h + repositories/faction_list_repository.h + repositories/faction_list_mod_repository.h + repositories/faction_values_repository.h + repositories/fishing_repository.h + repositories/forage_repository.h + repositories/friends_repository.h + repositories/global_loot_repository.h + repositories/gm_ips_repository.h + repositories/goallists_repository.h + repositories/graveyard_repository.h + repositories/grid_repository.h + repositories/grid_entries_repository.h + repositories/ground_spawns_repository.h + repositories/group_id_repository.h + repositories/group_leaders_repository.h + repositories/guilds_repository.h + repositories/guild_members_repository.h + repositories/guild_ranks_repository.h + repositories/guild_relations_repository.h + repositories/hackers_repository.h + repositories/instance_list_repository.h + repositories/instance_list_player_repository.h + repositories/inventory_repository.h + repositories/inventory_snapshots_repository.h + repositories/ip_exemptions_repository.h + repositories/items_repository.h + repositories/item_tick_repository.h + repositories/ldon_trap_entries_repository.h + repositories/ldon_trap_templates_repository.h + repositories/level_exp_mods_repository.h + repositories/lfguild_repository.h + repositories/login_accounts_repository.h + repositories/login_api_tokens_repository.h + repositories/login_server_admins_repository.h + repositories/login_server_list_types_repository.h + repositories/login_world_servers_repository.h + repositories/logsys_categories_repository.h + repositories/lootdrop_repository.h + repositories/lootdrop_entries_repository.h + repositories/loottable_repository.h + repositories/loottable_entries_repository.h + repositories/mail_repository.h + repositories/merchantlist_repository.h + repositories/merchantlist_temp_repository.h + repositories/name_filter_repository.h + repositories/npc_emotes_repository.h + repositories/npc_faction_repository.h + repositories/npc_faction_entries_repository.h + repositories/npc_scale_global_base_repository.h + repositories/npc_spells_repository.h + repositories/npc_spells_effects_repository.h + repositories/npc_spells_effects_entries_repository.h + repositories/npc_spells_entries_repository.h + repositories/npc_types_repository.h + repositories/npc_types_tint_repository.h + repositories/object_repository.h + repositories/object_contents_repository.h + repositories/perl_event_export_settings_repository.h + repositories/petitions_repository.h + repositories/pets_repository.h + repositories/pets_equipmentset_repository.h + repositories/pets_equipmentset_entries_repository.h + repositories/player_titlesets_repository.h + repositories/proximities_repository.h + repositories/quest_globals_repository.h + repositories/raid_details_repository.h + repositories/raid_members_repository.h + repositories/reports_repository.h + repositories/respawn_times_repository.h + repositories/rule_sets_repository.h + repositories/rule_values_repository.h + repositories/saylink_repository.h + repositories/server_scheduled_events_repository.h + repositories/skill_caps_repository.h + repositories/spawn2_repository.h + repositories/spawnentry_repository.h + repositories/spawngroup_repository.h + repositories/spawn_conditions_repository.h + repositories/spawn_condition_values_repository.h + repositories/spawn_events_repository.h + repositories/spells_new_repository.h + repositories/spell_buckets_repository.h + repositories/spell_globals_repository.h + repositories/starting_items_repository.h + repositories/start_zones_repository.h + repositories/tasks_repository.h + repositories/tasksets_repository.h + repositories/task_activities_repository.h + repositories/timers_repository.h + repositories/titles_repository.h + repositories/trader_repository.h + repositories/tradeskill_recipe_repository.h + repositories/tradeskill_recipe_entries_repository.h + repositories/traps_repository.h + repositories/tributes_repository.h + repositories/tribute_levels_repository.h + repositories/veteran_reward_templates_repository.h + repositories/zone_repository.h + repositories/zone_points_repository.h + + # Non-Comformative + repositories/character_recipe_list_repository.h +) + SET(common_headers any.h base_packet.h @@ -116,18 +458,21 @@ SET(common_headers classes.h compression.h condition.h + content/world_content_service.h crash.h crc16.h crc32.h cli/argh.h cli/eqemu_command_handler.h cli/terminal_color.hpp + cron/croncpp.h database/database_dump_service.h data_verification.h database.h database_schema.h dbcore.h deity.h + dynamic_zone_base.h emu_constants.h emu_limits.h emu_opcodes.h @@ -151,6 +496,8 @@ SET(common_headers eqtime.h errmsg.h event_sub.h + expedition_base.h + expedition_lockout_timer.h extprofile.h faction.h file_util.h @@ -196,17 +543,13 @@ SET(common_headers queue.h races.h random.h - repositories/character_recipe_list_repository.h - repositories/grid_repository.h - repositories/grid_entries_repository.h - repositories/spawngroup_repository.h - repositories/tradeskill_recipe_repository.h rdtsc.h rulesys.h ruletypes.h say_link.h seperator.h serialize_buffer.h + server_event_scheduler.h serverinfo.h servertalk.h shareddb.h @@ -385,7 +728,7 @@ SOURCE_GROUP(Util FILES INCLUDE_DIRECTORIES(Patches SocketLib StackWalker) -ADD_LIBRARY(common ${common_sources} ${common_headers}) +ADD_LIBRARY(common ${common_sources} ${common_headers} ${repositories}) IF(UNIX) SET_SOURCE_FILES_PROPERTIES("SocketLib/Mime.cpp" PROPERTY COMPILE_FLAGS -Wno-unused-result) diff --git a/common/any.h b/common/any.h index fd80fbc5f..1ec59cdb4 100644 --- a/common/any.h +++ b/common/any.h @@ -24,7 +24,7 @@ * DEALINGS IN THE SOFTWARE. */ -// EQEmu::Any is a modified version of Boost::Any and as such retains the Boost licensing. +// EQ::Any is a modified version of Boost::Any and as such retains the Boost licensing. #ifndef EQEMU_COMMON_ANY_H #define EQEMU_COMMON_ANY_H @@ -32,7 +32,7 @@ #include #include -namespace EQEmu +namespace EQ { class Any { diff --git a/common/classes.cpp b/common/classes.cpp index 3aaeeded3..b9445443f 100644 --- a/common/classes.cpp +++ b/common/classes.cpp @@ -378,6 +378,8 @@ const char *GetClassIDName(uint8 class_id, uint8 level) return "Berserker Guildmaster"; case MERCHANT: return "Merchant"; + case DISCORD_MERCHANT: + return "Discord Merchant"; case ADVENTURERECRUITER: return "Adventure Recruiter"; case ADVENTUREMERCHANT: @@ -388,6 +390,18 @@ const char *GetClassIDName(uint8 class_id, uint8 level) return "Tribute Master"; case GUILD_TRIBUTE_MASTER: return "Guild Tribute Master"; + case GUILD_BANKER: + return "Guild Banker"; + case NORRATHS_KEEPERS_MERCHANT: + return "Radiant Crystal Merchant"; + case DARK_REIGN_MERCHANT: + return "Ebon Crystal Merchant"; + case FELLOWSHIP_MASTER: + return "Fellowship Master"; + case ALT_CURRENCY_MERCHANT: + return "Alternate Currency Merchant"; + case MERCERNARY_MASTER: + return "Mercenary Liaison"; default: return "Unknown"; } diff --git a/common/classes.h b/common/classes.h index f63758937..a35014d94 100644 --- a/common/classes.h +++ b/common/classes.h @@ -61,6 +61,7 @@ #define CORPSE_CLASS 62 // only seen on Danvi's Corpse in Akheva so far.. #define TRIBUTE_MASTER 63 #define GUILD_TRIBUTE_MASTER 64 // not sure +#define GUILD_BANKER 66 #define NORRATHS_KEEPERS_MERCHANT 67 #define DARK_REIGN_MERCHANT 68 #define FELLOWSHIP_MASTER 69 diff --git a/common/cli/eqemu_command_handler.cpp b/common/cli/eqemu_command_handler.cpp index 96ed5a155..3162d400a 100644 --- a/common/cli/eqemu_command_handler.cpp +++ b/common/cli/eqemu_command_handler.cpp @@ -77,7 +77,7 @@ namespace EQEmuCommand { index++; } - if (!arguments_filled || argc == 2) { + if (!arguments_filled || argc == 2 || cmd[{"-h", "--help"}]) { std::string arguments_string; for (auto &arg : arguments) { arguments_string += " " + arg; @@ -101,7 +101,7 @@ namespace EQEmuCommand { std::cout << command_string.str() << std::endl; - exit(1); + exit(0); } } @@ -168,6 +168,11 @@ namespace EQEmuCommand { * Print section header */ std::string command_prefix = it.first.substr(0, it.first.find(":")); + + if (command_prefix.find("test") != std::string::npos) { + continue; + } + if (command_section != command_prefix) { command_section = command_prefix; std::cout << termcolor::reset << command_prefix << std::endl; @@ -183,11 +188,11 @@ namespace EQEmuCommand { std::cout << std::endl; - std::exit(1); + std::exit(0); } if (ran_command) { - std::exit(1); + std::exit(0); } } diff --git a/common/compression.cpp b/common/compression.cpp index c56d9bf6a..07fe13d65 100644 --- a/common/compression.cpp +++ b/common/compression.cpp @@ -3,7 +3,7 @@ #include #include -namespace EQEmu +namespace EQ { uint32 EstimateDeflateBuffer(uint32 len) { z_stream zstream; diff --git a/common/compression.h b/common/compression.h index cc2fac264..20a4103be 100644 --- a/common/compression.h +++ b/common/compression.h @@ -1,6 +1,6 @@ #pragma once -namespace EQEmu +namespace EQ { uint32 EstimateDeflateBuffer(uint32 len); uint32 DeflateData(const char *buffer, uint32 len, char *out_buffer, uint32 out_len_max); diff --git a/common/content/world_content_service.cpp b/common/content/world_content_service.cpp new file mode 100644 index 000000000..feb0f5b76 --- /dev/null +++ b/common/content/world_content_service.cpp @@ -0,0 +1,120 @@ +/** + * 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 "../database.h" +#include "../rulesys.h" +#include "../eqemu_logsys.h" +#include "../repositories/content_flags_repository.h" + + +WorldContentService::WorldContentService() +{ + SetCurrentExpansion(Expansion::EXPANSION_ALL); +} + +int WorldContentService::GetCurrentExpansion() const +{ + return current_expansion; +} + +void WorldContentService::SetExpansionContext() +{ + int expansion = RuleI(Expansion, CurrentExpansion); + if (expansion >= Expansion::Classic && expansion <= Expansion::MaxId) { + content_service.SetCurrentExpansion(expansion); + } + + LogInfo( + "Current expansion is [{}] ({})", + GetCurrentExpansion(), + GetCurrentExpansionName() + ); +} + +std::string WorldContentService::GetCurrentExpansionName() +{ + if (content_service.GetCurrentExpansion() == Expansion::EXPANSION_ALL) { + return "All Expansions"; + } + + if (current_expansion >= Expansion::Classic && current_expansion <= Expansion::MaxId) { + return Expansion::ExpansionName[content_service.GetCurrentExpansion()]; + } + + return "Unknown Expansion"; +} + +/** + * @param current_expansion + */ +void WorldContentService::SetCurrentExpansion(int current_expansion) +{ + WorldContentService::current_expansion = current_expansion; +} + +/** + * @return + */ +const std::vector &WorldContentService::GetContentFlags() const +{ + return content_flags; +} + +/** + * @param content_flags + */ +void WorldContentService::SetContentFlags(std::vector content_flags) +{ + WorldContentService::content_flags = content_flags; +} + +/** + * @param content_flag + * @return + */ +bool WorldContentService::IsContentFlagEnabled(const std::string& content_flag) +{ + for (auto &flag : GetContentFlags()) { + if (flag == content_flag) { + return true; + } + } + + return false; +} + +void WorldContentService::ReloadContentFlags(Database &db) +{ + std::vector set_content_flags; + auto content_flags = ContentFlagsRepository::GetWhere(db, "enabled = 1"); + + set_content_flags.reserve(content_flags.size()); + for (auto &flags: content_flags) { + set_content_flags.push_back(flags.flag_name); + } + + LogInfo( + "Enabled content flags [{}]", + implode(", ", set_content_flags) + ); + + SetContentFlags(set_content_flags); +} diff --git a/common/content/world_content_service.h b/common/content/world_content_service.h new file mode 100644 index 000000000..47220b349 --- /dev/null +++ b/common/content/world_content_service.h @@ -0,0 +1,176 @@ +/** + * 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 +#define EQEMU_WORLD_CONTENT_SERVICE_H + +#include +#include + +class Database; + +namespace Expansion { + static const int EXPANSION_ALL = -1; + static const int EXPANSION_FILTER_MAX = 99; + + enum ExpansionNumber { + Classic = 0, + TheRuinsOfKunark, + TheScarsOfVelious, + TheShadowsOfLuclin, + ThePlanesOfPower, + TheLegacyOfYkesha, + LostDungeonsOfNorrath, + GatesOfDiscord, + OmensOfWar, + DragonsOfNorrath, + DepthsOfDarkhollow, + ProphecyOfRo, + TheSerpentsSpine, + TheBuriedSea, + SecretsOfFaydwer, + SeedsOfDestruction, + Underfoot, + HouseOfThule, + VeilOfAlaris, + RainOfFear, + CallOfTheForsaken, + TheDarkendSea, + TheBrokenMirror, + EmpiresOfKunark, + RingOfScale, + TheBurningLands, + TormentOfVelious, + MaxId + }; + + /** + * If you add to this, make sure you update LogCategory + */ + static const char *ExpansionName[ExpansionNumber::MaxId] = { + "Classic", + "The Ruins of Kunark", + "The Scars of Velious", + "The Shadows of Luclin", + "The Planes of Power", + "The Legacy of Ykesha", + "Lost Dungeons of Norrath", + "Gates of Discord", + "Omens of War", + "Dragons of Norrath", + "Depths of Darkhollow", + "Prophecy of Ro", + "The Serpent's Spine", + "The Buried Sea", + "Secrets of Faydwer", + "Seeds of Destruction", + "Underfoot", + "House of Thule", + "Veil of Alaris", + "Rain of Fear", + "Call of the Forsaken", + "The Darkened Sea", + "The Broken Mirror", + "Empires of Kunark", + "Ring of Scale", + "The Burning Lands", + "Torment of Velious", + }; +} + +class WorldContentService { +public: + + WorldContentService(); + + std::string GetCurrentExpansionName(); + int GetCurrentExpansion() const; + void SetCurrentExpansion(int current_expansion); + + bool IsClassicEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::Classic || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheRuinsOfKunarkEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheRuinsOfKunark || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheScarsOfVeliousEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheScarsOfVelious || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheShadowsOfLuclinEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheShadowsOfLuclin || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsThePlanesOfPowerEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::ThePlanesOfPower || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheLegacyOfYkeshaEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheLegacyOfYkesha || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsLostDungeonsOfNorrathEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::LostDungeonsOfNorrath || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsGatesOfDiscordEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::GatesOfDiscord || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsOmensOfWarEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::OmensOfWar || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsDragonsOfNorrathEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::DragonsOfNorrath || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsDepthsOfDarkhollowEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::DepthsOfDarkhollow || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsProphecyOfRoEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::ProphecyOfRo || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheSerpentsSpineEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheSerpentsSpine || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheBuriedSeaEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheBuriedSea || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsSecretsOfFaydwerEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::SecretsOfFaydwer || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsSeedsOfDestructionEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::SeedsOfDestruction || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsUnderfootEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::Underfoot || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsHouseOfThuleEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::HouseOfThule || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsVeilOfAlarisEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::VeilOfAlaris || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsRainOfFearEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::RainOfFear || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsCallOfTheForsakenEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::CallOfTheForsaken || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheDarkendSeaEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheDarkendSea || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheBrokenMirrorEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheBrokenMirror || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsEmpiresOfKunarkEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::EmpiresOfKunark || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsRingOfScaleEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::RingOfScale || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTheBurningLandsEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TheBurningLands || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + bool IsTormentOfVeliousEnabled() { return GetCurrentExpansion() >= Expansion::ExpansionNumber::TormentOfVelious || GetCurrentExpansion() == Expansion::EXPANSION_ALL; } + + bool IsCurrentExpansionClassic() { return current_expansion == Expansion::ExpansionNumber::Classic; } + bool IsCurrentExpansionTheRuinsOfKunark() { return current_expansion == Expansion::ExpansionNumber::TheRuinsOfKunark; } + bool IsCurrentExpansionTheScarsOfVelious() { return current_expansion == Expansion::ExpansionNumber::TheScarsOfVelious; } + bool IsCurrentExpansionTheShadowsOfLuclin() { return current_expansion == Expansion::ExpansionNumber::TheShadowsOfLuclin; } + bool IsCurrentExpansionThePlanesOfPower() { return current_expansion == Expansion::ExpansionNumber::ThePlanesOfPower; } + bool IsCurrentExpansionTheLegacyOfYkesha() { return current_expansion == Expansion::ExpansionNumber::TheLegacyOfYkesha; } + bool IsCurrentExpansionLostDungeonsOfNorrath() { return current_expansion == Expansion::ExpansionNumber::LostDungeonsOfNorrath; } + bool IsCurrentExpansionGatesOfDiscord() { return current_expansion == Expansion::ExpansionNumber::GatesOfDiscord; } + bool IsCurrentExpansionOmensOfWar() { return current_expansion == Expansion::ExpansionNumber::OmensOfWar; } + bool IsCurrentExpansionDragonsOfNorrath() { return current_expansion == Expansion::ExpansionNumber::DragonsOfNorrath; } + bool IsCurrentExpansionDepthsOfDarkhollow() { return current_expansion == Expansion::ExpansionNumber::DepthsOfDarkhollow; } + bool IsCurrentExpansionProphecyOfRo() { return current_expansion == Expansion::ExpansionNumber::ProphecyOfRo; } + bool IsCurrentExpansionTheSerpentsSpine() { return current_expansion == Expansion::ExpansionNumber::TheSerpentsSpine; } + bool IsCurrentExpansionTheBuriedSea() { return current_expansion == Expansion::ExpansionNumber::TheBuriedSea; } + bool IsCurrentExpansionSecretsOfFaydwer() { return current_expansion == Expansion::ExpansionNumber::SecretsOfFaydwer; } + bool IsCurrentExpansionSeedsOfDestruction() { return current_expansion == Expansion::ExpansionNumber::SeedsOfDestruction; } + bool IsCurrentExpansionUnderfoot() { return current_expansion == Expansion::ExpansionNumber::Underfoot; } + bool IsCurrentExpansionHouseOfThule() { return current_expansion == Expansion::ExpansionNumber::HouseOfThule; } + bool IsCurrentExpansionVeilOfAlaris() { return current_expansion == Expansion::ExpansionNumber::VeilOfAlaris; } + bool IsCurrentExpansionRainOfFear() { return current_expansion == Expansion::ExpansionNumber::RainOfFear; } + bool IsCurrentExpansionCallOfTheForsaken() { return current_expansion == Expansion::ExpansionNumber::CallOfTheForsaken; } + bool IsCurrentExpansionTheDarkendSea() { return current_expansion == Expansion::ExpansionNumber::TheDarkendSea; } + bool IsCurrentExpansionTheBrokenMirror() { return current_expansion == Expansion::ExpansionNumber::TheBrokenMirror; } + bool IsCurrentExpansionEmpiresOfKunark() { return current_expansion == Expansion::ExpansionNumber::EmpiresOfKunark; } + bool IsCurrentExpansionRingOfScale() { return current_expansion == Expansion::ExpansionNumber::RingOfScale; } + bool IsCurrentExpansionTheBurningLands() { return current_expansion == Expansion::ExpansionNumber::TheBurningLands; } + bool IsCurrentExpansionTormentOfVelious() { return current_expansion == Expansion::ExpansionNumber::TormentOfVelious; } + +private: + int current_expansion{}; + std::vector content_flags; +public: + const std::vector &GetContentFlags() const; + bool IsContentFlagEnabled(const std::string& content_flag); + void SetContentFlags(std::vector content_flags); + void ReloadContentFlags(Database &db); + void SetExpansionContext(); +}; + +extern WorldContentService content_service; + +#endif //EQEMU_WORLD_CONTENT_SERVICE_H diff --git a/common/crash.cpp b/common/crash.cpp index 155bfcf2a..cecb52f02 100644 --- a/common/crash.cpp +++ b/common/crash.cpp @@ -118,6 +118,11 @@ void set_exception_handler() { #include #include +#ifdef __FreeBSD__ +#include +#include +#endif + void print_trace() { auto uid = geteuid(); diff --git a/common/cron/croncpp.h b/common/cron/croncpp.h new file mode 100644 index 000000000..5a22a7f72 --- /dev/null +++ b/common/cron/croncpp.h @@ -0,0 +1,876 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#if __cplusplus > 201402L +#include +#define CRONCPP_IS_CPP17 +#endif + +namespace cron +{ +#ifdef CRONCPP_IS_CPP17 + #define HAS_STRING_VIEW + #define STRING_VIEW std::string_view + #define STRING_VIEW_NPOS std::string_view::npos + #define CONSTEXPTR constexpr +#else +#define STRING_VIEW std::string const & +#define STRING_VIEW_NPOS std::string::npos +#define CONSTEXPTR +#endif + + using cron_int = uint8_t; + + constexpr std::time_t INVALID_TIME = static_cast(-1); + + constexpr size_t INVALID_CRON_INDEX = static_cast(-1); + + class cronexpr; + + namespace detail + { + enum class cron_field + { + second, + minute, + hour_of_day, + day_of_week, + day_of_month, + month, + year + }; + + template + static bool find_next(cronexpr const & cex, + std::tm& date, + size_t const dot); + } + + struct bad_cronexpr : public std::runtime_error + { + public: + explicit bad_cronexpr(STRING_VIEW message) : + std::runtime_error(message.data()) + {} + }; + + + struct cron_standard_traits + { + static const cron_int CRON_MIN_SECONDS = 0; + static const cron_int CRON_MAX_SECONDS = 59; + + static const cron_int CRON_MIN_MINUTES = 0; + static const cron_int CRON_MAX_MINUTES = 59; + + static const cron_int CRON_MIN_HOURS = 0; + static const cron_int CRON_MAX_HOURS = 23; + + static const cron_int CRON_MIN_DAYS_OF_WEEK = 0; + static const cron_int CRON_MAX_DAYS_OF_WEEK = 6; + + static const cron_int CRON_MIN_DAYS_OF_MONTH = 1; + static const cron_int CRON_MAX_DAYS_OF_MONTH = 31; + + static const cron_int CRON_MIN_MONTHS = 1; + static const cron_int CRON_MAX_MONTHS = 12; + + static const cron_int CRON_MAX_YEARS_DIFF = 4; + +#ifdef CRONCPP_IS_CPP17 + static const inline std::vector DAYS = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + static const inline std::vector MONTHS = { "NIL", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; +#else + static std::vector& DAYS() + { + static std::vector days = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + return days; + } + + static std::vector& MONTHS() + { + static std::vector months = { "NIL", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; + return months; + } +#endif + }; + + struct cron_oracle_traits + { + static const cron_int CRON_MIN_SECONDS = 0; + static const cron_int CRON_MAX_SECONDS = 59; + + static const cron_int CRON_MIN_MINUTES = 0; + static const cron_int CRON_MAX_MINUTES = 59; + + static const cron_int CRON_MIN_HOURS = 0; + static const cron_int CRON_MAX_HOURS = 23; + + static const cron_int CRON_MIN_DAYS_OF_WEEK = 1; + static const cron_int CRON_MAX_DAYS_OF_WEEK = 7; + + static const cron_int CRON_MIN_DAYS_OF_MONTH = 1; + static const cron_int CRON_MAX_DAYS_OF_MONTH = 31; + + static const cron_int CRON_MIN_MONTHS = 0; + static const cron_int CRON_MAX_MONTHS = 11; + + static const cron_int CRON_MAX_YEARS_DIFF = 4; + +#ifdef CRONCPP_IS_CPP17 + static const inline std::vector DAYS = { "NIL", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + static const inline std::vector MONTHS = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; +#else + + static std::vector& DAYS() + { + static std::vector days = { "NIL", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + return days; + } + + static std::vector& MONTHS() + { + static std::vector months = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; + return months; + } +#endif + }; + + struct cron_quartz_traits + { + static const cron_int CRON_MIN_SECONDS = 0; + static const cron_int CRON_MAX_SECONDS = 59; + + static const cron_int CRON_MIN_MINUTES = 0; + static const cron_int CRON_MAX_MINUTES = 59; + + static const cron_int CRON_MIN_HOURS = 0; + static const cron_int CRON_MAX_HOURS = 23; + + static const cron_int CRON_MIN_DAYS_OF_WEEK = 1; + static const cron_int CRON_MAX_DAYS_OF_WEEK = 7; + + static const cron_int CRON_MIN_DAYS_OF_MONTH = 1; + static const cron_int CRON_MAX_DAYS_OF_MONTH = 31; + + static const cron_int CRON_MIN_MONTHS = 1; + static const cron_int CRON_MAX_MONTHS = 12; + + static const cron_int CRON_MAX_YEARS_DIFF = 4; + +#ifdef CRONCPP_IS_CPP17 + static const inline std::vector DAYS = { "NIL", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + static const inline std::vector MONTHS = { "NIL", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; +#else + static std::vector& DAYS() + { + static std::vector days = { "NIL", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + return days; + } + + static std::vector& MONTHS() + { + static std::vector months = { "NIL", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; + return months; + } +#endif + }; + + class cronexpr; + + template + static cronexpr make_cron(STRING_VIEW expr); + + class cronexpr + { + std::bitset<60> seconds; + std::bitset<60> minutes; + std::bitset<24> hours; + std::bitset<7> days_of_week; + std::bitset<31> days_of_month; + std::bitset<12> months; + + friend bool operator==(cronexpr const & e1, cronexpr const & e2); + friend bool operator!=(cronexpr const & e1, cronexpr const & e2); + + template + friend bool detail::find_next(cronexpr const & cex, + std::tm& date, + size_t const dot); + + friend std::string to_string(cronexpr const & cex); + + template + friend cronexpr make_cron(STRING_VIEW expr); + }; + + inline bool operator==(cronexpr const & e1, cronexpr const & e2) + { + return + e1.seconds == e2.seconds && + e1.minutes == e2.minutes && + e1.hours == e2.hours && + e1.days_of_week == e2.days_of_week && + e1.days_of_month == e2.days_of_month && + e1.months == e2.months; + } + + inline bool operator!=(cronexpr const & e1, cronexpr const & e2) + { + return !(e1 == e2); + } + + inline std::string to_string(cronexpr const & cex) + { + return + cex.seconds.to_string() + " " + + cex.minutes.to_string() + " " + + cex.hours.to_string() + " " + + cex.days_of_month.to_string() + " " + + cex.months.to_string() + " " + + cex.days_of_week.to_string(); + } + + namespace utils + { + inline std::time_t tm_to_time(std::tm& date) + { + return std::mktime(&date); + } + + inline std::tm* time_to_tm(std::time_t const * date, std::tm* const out) + { +#ifdef _WIN32 + errno_t err = localtime_s(out, date); + return 0 == err ? out : nullptr; +#else + return localtime_r(date, out); +#endif + } + + inline std::tm to_tm(STRING_VIEW time) + { + std::istringstream str(time.data()); + str.imbue(std::locale(setlocale(LC_ALL, nullptr))); + + std::tm result; + str >> std::get_time(&result, "%Y-%m-%d %H:%M:%S"); + if (str.fail()) throw std::runtime_error("Parsing date failed!"); + + result.tm_isdst = -1; // DST info not available + + return result; + } + + inline std::string to_string(std::tm const & tm) + { + std::ostringstream str; + str.imbue(std::locale(setlocale(LC_ALL, nullptr))); + str << std::put_time(&tm, "%Y-%m-%d %H:%M:%S"); + if (str.fail()) throw std::runtime_error("Writing date failed!"); + + return str.str(); + } + + inline std::string to_upper(std::string text) + { + std::transform(std::begin(text), std::end(text), + std::begin(text), static_cast(std::toupper)); + + return text; + } + + static std::vector split(STRING_VIEW text, char const delimiter) + { + std::vector tokens; + std::string token; + std::istringstream tokenStream(text.data()); + while (std::getline(tokenStream, token, delimiter)) + { + tokens.push_back(token); + } + return tokens; + } + + CONSTEXPTR inline bool contains(STRING_VIEW text, char const ch) noexcept + { + return STRING_VIEW_NPOS != text.find_first_of(ch); + } + } + + namespace detail + { + + inline cron_int to_cron_int(STRING_VIEW text) + { + try + { + return static_cast(std::stoul(text.data())); + } + catch (std::exception const & ex) + { + throw bad_cronexpr(ex.what()); + } + } + + static std::string replace_ordinals( + std::string text, + std::vector const & replacement) + { + for (size_t i = 0; i < replacement.size(); ++i) + { + auto pos = text.find(replacement[i]); + if (std::string::npos != pos) + text.replace(pos, 3 ,std::to_string(i)); + } + + return text; + } + + static std::pair make_range( + STRING_VIEW field, + cron_int const minval, + cron_int const maxval) + { + cron_int first = 0; + cron_int last = 0; + if (field.size() == 1 && field[0] == '*') + { + first = minval; + last = maxval; + } + else if (!utils::contains(field, '-')) + { + first = to_cron_int(field); + last = first; + } + else + { + auto parts = utils::split(field, '-'); + if (parts.size() != 2) + throw bad_cronexpr("Specified range requires two fields"); + + first = to_cron_int(parts[0]); + last = to_cron_int(parts[1]); + } + + if (first > maxval || last > maxval) + { + throw bad_cronexpr("Specified range exceeds maximum"); + } + if (first < minval || last < minval) + { + throw bad_cronexpr("Specified range is less than minimum"); + } + if (first > last) + { + throw bad_cronexpr("Specified range start exceeds range end"); + } + + return { first, last }; + } + + template + static void set_cron_field( + STRING_VIEW value, + std::bitset& target, + cron_int const minval, + cron_int const maxval) + { + if(value.length() > 0 && value[value.length()-1] == ',') + throw bad_cronexpr("Value cannot end with comma"); + + auto fields = utils::split(value, ','); + if (fields.empty()) + throw bad_cronexpr("Expression parsing error"); + + for (auto const & field : fields) + { + if (!utils::contains(field, '/')) + { +#ifdef CRONCPP_IS_CPP17 + auto[first, last] = detail::make_range(field, minval, maxval); +#else + auto range = detail::make_range(field, minval, maxval); + auto first = range.first; + auto last = range.second; +#endif + for (cron_int i = first - minval; i <= last - minval; ++i) + { + target.set(i); + } + } + else + { + auto parts = utils::split(field, '/'); + if (parts.size() != 2) + throw bad_cronexpr("Incrementer must have two fields"); + +#ifdef CRONCPP_IS_CPP17 + auto[first, last] = detail::make_range(parts[0], minval, maxval); +#else + auto range = detail::make_range(parts[0], minval, maxval); + auto first = range.first; + auto last = range.second; +#endif + + if (!utils::contains(parts[0], '-')) + { + last = maxval; + } + + auto delta = detail::to_cron_int(parts[1]); + if(delta <= 0) + throw bad_cronexpr("Incrementer must be a positive value"); + + for (cron_int i = first - minval; i <= last - minval; i += delta) + { + target.set(i); + } + } + } + } + + template + static void set_cron_days_of_week( + std::string value, + std::bitset<7>& target) + { + auto days = utils::to_upper(value); + auto days_replaced = detail::replace_ordinals( + days, +#ifdef CRONCPP_IS_CPP17 + Traits::DAYS +#else + Traits::DAYS() +#endif + ); + + if (days_replaced.size() == 1 && days_replaced[0] == '?') + days_replaced[0] = '*'; + + set_cron_field( + days_replaced, + target, + Traits::CRON_MIN_DAYS_OF_WEEK, + Traits::CRON_MAX_DAYS_OF_WEEK); + } + + template + static void set_cron_days_of_month( + std::string value, + std::bitset<31>& target) + { + if (value.size() == 1 && value[0] == '?') + value[0] = '*'; + + set_cron_field( + value, + target, + Traits::CRON_MIN_DAYS_OF_MONTH, + Traits::CRON_MAX_DAYS_OF_MONTH); + } + + template + static void set_cron_month( + std::string value, + std::bitset<12>& target) + { + auto month = utils::to_upper(value); + auto month_replaced = replace_ordinals( + month, +#ifdef CRONCPP_IS_CPP17 + Traits::MONTHS +#else + Traits::MONTHS() +#endif + ); + + set_cron_field( + month_replaced, + target, + Traits::CRON_MIN_MONTHS, + Traits::CRON_MAX_MONTHS); + } + + template + inline size_t next_set_bit( + std::bitset const & target, + size_t /*minimum*/, + size_t /*maximum*/, + size_t offset) + { + for (auto i = offset; i < N; ++i) + { + if (target.test(i)) return i; + } + + return INVALID_CRON_INDEX; + } + + inline void add_to_field( + std::tm& date, + cron_field const field, + int const val) + { + switch (field) + { + case cron_field::second: + date.tm_sec += val; + break; + case cron_field::minute: + date.tm_min += val; + break; + case cron_field::hour_of_day: + date.tm_hour += val; + break; + case cron_field::day_of_week: + case cron_field::day_of_month: + date.tm_mday += val; + break; + case cron_field::month: + date.tm_mon += val; + break; + case cron_field::year: + date.tm_year += val; + break; + } + + if (INVALID_TIME == utils::tm_to_time(date)) + throw bad_cronexpr("Invalid time expression"); + } + + inline void set_field( + std::tm& date, + cron_field const field, + int const val) + { + switch (field) + { + case cron_field::second: + date.tm_sec = val; + break; + case cron_field::minute: + date.tm_min = val; + break; + case cron_field::hour_of_day: + date.tm_hour = val; + break; + case cron_field::day_of_week: + date.tm_wday = val; + break; + case cron_field::day_of_month: + date.tm_mday = val; + break; + case cron_field::month: + date.tm_mon = val; + break; + case cron_field::year: + date.tm_year = val; + break; + } + + if (INVALID_TIME == utils::tm_to_time(date)) + throw bad_cronexpr("Invalid time expression"); + } + + inline void reset_field( + std::tm& date, + cron_field const field) + { + switch (field) + { + case cron_field::second: + date.tm_sec = 0; + break; + case cron_field::minute: + date.tm_min = 0; + break; + case cron_field::hour_of_day: + date.tm_hour = 0; + break; + case cron_field::day_of_week: + date.tm_wday = 0; + break; + case cron_field::day_of_month: + date.tm_mday = 1; + break; + case cron_field::month: + date.tm_mon = 0; + break; + case cron_field::year: + date.tm_year = 0; + break; + } + + if (INVALID_TIME == utils::tm_to_time(date)) + throw bad_cronexpr("Invalid time expression"); + } + + inline void reset_all_fields( + std::tm& date, + std::bitset<7> const & marked_fields) + { + for (size_t i = 0; i < marked_fields.size(); ++i) + { + if (marked_fields.test(i)) + reset_field(date, static_cast(i)); + } + } + + inline void mark_field( + std::bitset<7> & orders, + cron_field const field) + { + if (!orders.test(static_cast(field))) + orders.set(static_cast(field)); + } + + template + static size_t find_next( + std::bitset const & target, + std::tm& date, + unsigned int const minimum, + unsigned int const maximum, + unsigned int const value, + cron_field const field, + cron_field const next_field, + std::bitset<7> const & marked_fields) + { + auto next_value = next_set_bit(target, minimum, maximum, value); + if (INVALID_CRON_INDEX == next_value) + { + add_to_field(date, next_field, 1); + reset_field(date, field); + next_value = next_set_bit(target, minimum, maximum, 0); + } + + if (INVALID_CRON_INDEX == next_value || next_value != value) + { + set_field(date, field, static_cast(next_value)); + reset_all_fields(date, marked_fields); + } + + return next_value; + } + + template + static size_t find_next_day( + std::tm& date, + std::bitset<31> const & days_of_month, + size_t day_of_month, + std::bitset<7> const & days_of_week, + size_t day_of_week, + std::bitset<7> const & marked_fields) + { + unsigned int count = 0; + unsigned int maximum = 366; + while ( + (!days_of_month.test(day_of_month - Traits::CRON_MIN_DAYS_OF_MONTH) || + !days_of_week.test(day_of_week - Traits::CRON_MIN_DAYS_OF_WEEK)) + && count++ < maximum) + { + add_to_field(date, cron_field::day_of_month, 1); + + day_of_month = date.tm_mday; + day_of_week = date.tm_wday; + + reset_all_fields(date, marked_fields); + } + + return day_of_month; + } + + template + static bool find_next(cronexpr const & cex, + std::tm& date, + size_t const dot) + { + bool res = true; + + std::bitset<7> marked_fields{ 0 }; + std::bitset<7> empty_list{ 0 }; + + unsigned int second = date.tm_sec; + auto updated_second = find_next( + cex.seconds, + date, + Traits::CRON_MIN_SECONDS, + Traits::CRON_MAX_SECONDS, + second, + cron_field::second, + cron_field::minute, + empty_list); + + if (second == updated_second) + { + mark_field(marked_fields, cron_field::second); + } + + unsigned int minute = date.tm_min; + auto update_minute = find_next( + cex.minutes, + date, + Traits::CRON_MIN_MINUTES, + Traits::CRON_MAX_MINUTES, + minute, + cron_field::minute, + cron_field::hour_of_day, + marked_fields); + if (minute == update_minute) + { + mark_field(marked_fields, cron_field::minute); + } + else + { + res = find_next(cex, date, dot); + if (!res) return res; + } + + unsigned int hour = date.tm_hour; + auto updated_hour = find_next( + cex.hours, + date, + Traits::CRON_MIN_HOURS, + Traits::CRON_MAX_HOURS, + hour, + cron_field::hour_of_day, + cron_field::day_of_week, + marked_fields); + if (hour == updated_hour) + { + mark_field(marked_fields, cron_field::hour_of_day); + } + else + { + res = find_next(cex, date, dot); + if (!res) return res; + } + + unsigned int day_of_week = date.tm_wday; + unsigned int day_of_month = date.tm_mday; + auto updated_day_of_month = find_next_day( + date, + cex.days_of_month, + day_of_month, + cex.days_of_week, + day_of_week, + marked_fields); + if (day_of_month == updated_day_of_month) + { + mark_field(marked_fields, cron_field::day_of_month); + } + else + { + res = find_next(cex, date, dot); + if (!res) return res; + } + + unsigned int month = date.tm_mon; + auto updated_month = find_next( + cex.months, + date, + Traits::CRON_MIN_MONTHS, + Traits::CRON_MAX_MONTHS, + month, + cron_field::month, + cron_field::year, + marked_fields); + if (month != updated_month) + { + if (date.tm_year - dot > Traits::CRON_MAX_YEARS_DIFF) + return false; + + res = find_next(cex, date, dot); + if (!res) return res; + } + + return res; + } + } + + template + static cronexpr make_cron(STRING_VIEW expr) + { + cronexpr cex; + + if (expr.empty()) + throw bad_cronexpr("Invalid empty cron expression"); + + auto fields = utils::split(expr, ' '); + fields.erase( + std::remove_if(std::begin(fields), std::end(fields), + [](STRING_VIEW s) {return s.empty(); }), + std::end(fields)); + if (fields.size() != 6) + throw bad_cronexpr("cron expression must have six fields"); + + detail::set_cron_field(fields[0], cex.seconds, Traits::CRON_MIN_SECONDS, Traits::CRON_MAX_SECONDS); + detail::set_cron_field(fields[1], cex.minutes, Traits::CRON_MIN_MINUTES, Traits::CRON_MAX_MINUTES); + detail::set_cron_field(fields[2], cex.hours, Traits::CRON_MIN_HOURS, Traits::CRON_MAX_HOURS); + + detail::set_cron_days_of_week(fields[5], cex.days_of_week); + + detail::set_cron_days_of_month(fields[3], cex.days_of_month); + + detail::set_cron_month(fields[4], cex.months); + + return cex; + } + + template + static std::tm cron_next(cronexpr const & cex, std::tm date) + { + time_t original = utils::tm_to_time(date); + if (INVALID_TIME == original) return {}; + + if (!detail::find_next(cex, date, date.tm_year)) + return {}; + + time_t calculated = utils::tm_to_time(date); + if (INVALID_TIME == calculated) return {}; + + if (calculated == original) + { + add_to_field(date, detail::cron_field::second, 1); + if (!detail::find_next(cex, date, date.tm_year)) + return {}; + } + + return date; + } + + template + static std::time_t cron_next(cronexpr const & cex, std::time_t const & date) + { + std::tm val; + std::tm* dt = utils::time_to_tm(&date, &val); + if (dt == nullptr) return INVALID_TIME; + + time_t original = utils::tm_to_time(*dt); + if (INVALID_TIME == original) return INVALID_TIME; + + if(!detail::find_next(cex, *dt, dt->tm_year)) + return INVALID_TIME; + + time_t calculated = utils::tm_to_time(*dt); + if (INVALID_TIME == calculated) return calculated; + + if (calculated == original) + { + add_to_field(*dt, detail::cron_field::second, 1); + if(!detail::find_next(cex, *dt, dt->tm_year)) + return INVALID_TIME; + } + + return utils::tm_to_time(*dt); + } +} diff --git a/common/data_verification.h b/common/data_verification.h index c56f3ce04..07a4b3bf0 100644 --- a/common/data_verification.h +++ b/common/data_verification.h @@ -23,7 +23,7 @@ #include #include -namespace EQEmu { +namespace EQ { template T Clamp(const T &value, const T &lower, const T &upper) { diff --git a/common/database.cpp b/common/database.cpp index b3a4c0bf4..385f07c18 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -61,15 +61,15 @@ Database::Database(const char* host, const char* user, const char* passwd, const Connect(host, user, passwd, database, port); } -bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port) { +bool Database::Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port, std::string connection_label) { uint32 errnum= 0; char errbuf[MYSQL_ERRMSG_SIZE]; if (!Open(host, user, passwd, database, port, &errnum, errbuf)) { - LogError("Failed to connect to database: Error: {}", errbuf); + LogError("[MySQL] Connection [{}] Failed to connect to database: Error [{}]", connection_label, errbuf); return false; } else { - LogInfo("Using database [{}] at [{}]:[{}]", database, host,port); + LogInfo("[MySQL] Connection [{}] database [{}] at [{}]:[{}]", connection_label, database, host,port); return true; } } @@ -339,7 +339,7 @@ bool Database::ReserveName(uint32 account_id, char* name) { query = StringFormat("INSERT INTO `character_data` SET `account_id` = %i, `name` = '%s'", account_id, name); results = QueryDatabase(query); if (!results.Success() || results.ErrorMessage() != ""){ return false; } - + // Put character into the default guild if rule is being used. int guild_id = RuleI(Character, DefaultGuild); @@ -353,7 +353,7 @@ bool Database::ReserveName(uint32 account_id, char* name) { } } } - + return true; } @@ -512,96 +512,96 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe "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," // 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," // 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," // 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 + "%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, " @@ -703,11 +703,11 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe "(%u, %u, %u, %f, %f, %f, %f, %i), " "(%u, %u, %u, %f, %f, %f, %f, %i), " "(%u, %u, %u, %f, %f, %f, %f, %i)", - character_id, pp->binds[0].zoneId, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading, 0, - character_id, pp->binds[1].zoneId, 0, pp->binds[1].x, pp->binds[1].y, pp->binds[1].z, pp->binds[1].heading, 1, - character_id, pp->binds[2].zoneId, 0, pp->binds[2].x, pp->binds[2].y, pp->binds[2].z, pp->binds[2].heading, 2, - character_id, pp->binds[3].zoneId, 0, pp->binds[3].x, pp->binds[3].y, pp->binds[3].z, pp->binds[3].heading, 3, - character_id, pp->binds[4].zoneId, 0, pp->binds[4].x, pp->binds[4].y, pp->binds[4].z, pp->binds[4].heading, 4 + 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, + 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, + 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, + 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, + 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 ); results = QueryDatabase(query); /* HoTT Ability */ @@ -870,6 +870,42 @@ void Database::GetCharName(uint32 char_id, char* name) { } } +std::string Database::GetCharNameByID(uint32 char_id) { + std::string query = fmt::format("SELECT `name` FROM `character_data` WHERE id = {}", char_id); + auto results = QueryDatabase(query); + std::string res; + + if (!results.Success()) { + return res; + } + + if (results.RowCount() == 0) { + return res; + } + + auto row = results.begin(); + res = row[0]; + return res; +} + +std::string Database::GetNPCNameByID(uint32 npc_id) { + std::string query = fmt::format("SELECT `name` FROM `npc_types` WHERE id = {}", npc_id); + auto results = QueryDatabase(query); + std::string res; + + if (!results.Success()) { + return res; + } + + if (results.RowCount() == 0) { + return res; + } + + auto row = results.begin(); + res = row[0]; + return res; +} + bool Database::LoadVariables() { auto results = QueryDatabase(StringFormat("SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp(ts) >= %d", varcache.last_update)); @@ -939,10 +975,24 @@ bool Database::SetVariable(const std::string varname, const std::string &varvalu } // Get zone starting points from DB -bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe_x, float* safe_y, float* safe_z, int16* minstatus, uint8* minlevel, char *flag_needed) { +bool Database::GetSafePoints(const char* zone_short_name, uint32 instance_version, float* safe_x, float* safe_y, float* safe_z, float* safe_heading, int16* min_status, uint8* min_level, char *flag_needed) { - std::string query = StringFormat("SELECT safe_x, safe_y, safe_z, min_status, min_level, flag_needed FROM zone " - " WHERE short_name='%s' AND (version=%i OR version=0) ORDER BY version DESC", short_name, version); + if (zone_short_name == nullptr) + return false; + + std::string query = fmt::format( + SQL( + SELECT + `safe_x`, `safe_y`, `safe_z`, `safe_heading`, `min_status`, `min_level`, `flag_needed` + FROM + zone + WHERE + `short_name` = '{}' + AND + (`version` = {} OR `version` = 0) + ORDER BY `version` DESC + ), zone_short_name, instance_version + ); auto results = QueryDatabase(query); if (!results.Success()) @@ -955,16 +1005,24 @@ bool Database::GetSafePoints(const char* short_name, uint32 version, float* safe if (safe_x != nullptr) *safe_x = atof(row[0]); + if (safe_y != nullptr) *safe_y = atof(row[1]); + if (safe_z != nullptr) *safe_z = atof(row[2]); - if (minstatus != nullptr) - *minstatus = atoi(row[3]); - if (minlevel != nullptr) - *minlevel = atoi(row[4]); + + if (safe_heading != nullptr) + *safe_heading = atof(row[3]); + + if (min_status != nullptr) + *min_status = atoi(row[4]); + + if (min_level != nullptr) + *min_level = atoi(row[5]); + if (flag_needed != nullptr) - strcpy(flag_needed, row[5]); + strcpy(flag_needed, row[6]); return true; } @@ -1050,50 +1108,6 @@ bool Database::GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zon return true; } -bool Database::LoadZoneNames() { - std::string query("SELECT zoneidnumber, short_name FROM zone"); - - auto results = QueryDatabase(query); - - if (!results.Success()) - { - return false; - } - - for (auto row= results.begin();row != results.end();++row) - { - uint32 zoneid = atoi(row[0]); - std::string zonename = row[1]; - zonename_array.insert(std::pair(zoneid,zonename)); - } - - return true; -} - -uint32 Database::GetZoneID(const char* zonename) { - - if (zonename == nullptr) - return 0; - - for (auto & iter : zonename_array) - if (strcasecmp(iter.second.c_str(), zonename) == 0) - return iter.first; - - return 0; -} - -const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) { - auto iter = zonename_array.find(zoneID); - - if (iter != zonename_array.end()) - return iter->second.c_str(); - - if (ErrorUnknown) - return "UNKNOWN"; - - return 0; -} - uint8 Database::GetPEQZone(uint32 zoneID, uint32 version){ std::string query = StringFormat("SELECT peqzone from zone where zoneidnumber='%i' AND (version=%i OR version=0) ORDER BY version DESC", zoneID, version); @@ -1310,29 +1324,31 @@ uint8 Database::GetServerType() { return atoi(row[0]); } -bool Database::MoveCharacterToZone(const char* charname, const char* zonename, uint32 zoneid) { - if(zonename == nullptr || strlen(zonename) == 0) - return false; +bool Database::MoveCharacterToZone(uint32 character_id, uint32 zone_id) +{ + std::string query = StringFormat( + "UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", + zone_id, + character_id + ); - std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `name` = '%s'", zoneid, charname); auto results = QueryDatabase(query); if (!results.Success()) { return false; } - if (results.RowsAffected() == 0) - return false; - - return true; + return results.RowsAffected() != 0; } -bool Database::MoveCharacterToZone(const char* charname, const char* zonename) { - return MoveCharacterToZone(charname, zonename, GetZoneID(zonename)); -} +bool Database::MoveCharacterToZone(const char *charname, uint32 zone_id) +{ + std::string query = StringFormat( + "UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `name` = '%s'", + zone_id, + charname + ); -bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) { - std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", GetZoneID(iZonename), iCharID); auto results = QueryDatabase(query); if (!results.Success()) { @@ -1366,6 +1382,20 @@ bool Database::SetMQDetectionFlag(const char* accountname, const char* character return results.RowsAffected() != 0; } +bool Database::SetMQDetectionFlag(const char* accountname, const char* charactername, const std::string &hacked, const char* zone) { + //Utilize the "hacker" table, but also give zone information. + auto query = fmt::format("INSERT INTO hackers(account, name, hacked, zone) values('{}', '{}', '{}', '{}')", + accountname, charactername, hacked, zone); + auto results = QueryDatabase(query); + + if (!results.Success()) + { + return false; + } + + return results.RowsAffected() != 0; +} + uint8 Database::GetRaceSkill(uint8 skillid, uint8 in_race) { uint16 race_cap = 0; @@ -2318,3 +2348,142 @@ int Database::GetInstanceID(uint32 char_id, uint32 zone_id) { return 0; } + +/** + * @param source_character_name + * @param destination_character_name + * @param destination_account_name + * @return + */ +bool Database::CopyCharacter( + std::string source_character_name, + std::string destination_character_name, + std::string destination_account_name +) +{ + auto results = QueryDatabase( + fmt::format( + "SELECT id FROM character_data WHERE name = '{}' and deleted_at is NULL LIMIT 1", + source_character_name + ) + ); + + if (results.RowCount() == 0) { + LogError("No character found with name [{}]", source_character_name); + } + + auto row = results.begin(); + std::string source_character_id = row[0]; + + results = QueryDatabase( + fmt::format( + "SELECT id FROM account WHERE name = '{}' LIMIT 1", + destination_account_name + ) + ); + + if (results.RowCount() == 0) { + LogError("No account found with name [{}]", destination_account_name); + } + + row = results.begin(); + std::string source_account_id = row[0]; + + /** + * Fresh ID + */ + results = QueryDatabase("SELECT (MAX(id) + 1) as new_id from character_data"); + row = results.begin(); + std::string new_character_id = row[0]; + + TransactionBegin(); + for (const auto &iter : DatabaseSchema::GetCharacterTables()) { + std::string table_name = iter.first; + std::string character_id_column_name = iter.second; + + /** + * Columns + */ + results = QueryDatabase(fmt::format("SHOW COLUMNS FROM {}", table_name)); + std::vector columns = {}; + int column_count = 0; + for (row = results.begin(); row != results.end(); ++row) { + columns.emplace_back(row[0]); + column_count++; + } + + results = QueryDatabase( + fmt::format( + "SELECT {} FROM {} WHERE {} = {}", + implode(",", wrap(columns, "`")), + table_name, + character_id_column_name, + source_character_id + ) + ); + + std::vector> new_rows; + for (row = results.begin(); row != results.end(); ++row) { + std::vector new_values = {}; + for (int column_index = 0; column_index < column_count; column_index++) { + std::string column = columns[column_index]; + std::string value = row[column_index] ? row[column_index] : "null"; + + if (column == character_id_column_name) { + value = new_character_id; + } + + if (column == "name" && table_name == "character_data") { + value = destination_character_name; + } + + if (column == "account_id" && table_name == "character_data") { + value = source_account_id; + } + + new_values.emplace_back(value); + } + + new_rows.emplace_back(new_values); + } + + std::string insert_values; + std::vector insert_rows; + + for (auto &r: new_rows) { + std::string insert_row = "(" + implode(",", wrap(r, "'")) + ")"; + insert_rows.emplace_back(insert_row); + } + + if (!insert_rows.empty()) { + QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + table_name, + character_id_column_name, + new_character_id + ) + ); + + auto insert = QueryDatabase( + fmt::format( + "INSERT INTO {} ({}) VALUES {}", + table_name, + implode(",", wrap(columns, "`")), + implode(",", insert_rows) + ) + ); + + if (!insert.ErrorMessage().empty()) { + TransactionRollback(); + return false; + break; + } + } + } + + TransactionCommit(); + + return true; +} + diff --git a/common/database.h b/common/database.h index 2239282ba..f6d93d5aa 100644 --- a/common/database.h +++ b/common/database.h @@ -40,29 +40,11 @@ class MySQLRequestResult; class Client; -namespace EQEmu +namespace EQ { class InventoryProfile; } -struct EventLogDetails_Struct { - uint32 id; - char accountname[64]; - uint32 account_id; - int16 status; - char charactername[64]; - char targetname[64]; - char timestamp[64]; - char descriptiontype[64]; - char details[128]; -}; - -struct CharacterEventLog_Struct { - uint32 count; - uint8 eventid; - EventLogDetails_Struct eld[255]; -}; - struct npcDecayTimes_Struct { uint16 minlvl; uint16 maxlvl; @@ -100,22 +82,41 @@ class Database : public DBcore { public: Database(); Database(const char* host, const char* user, const char* passwd, const char* database,uint32 port); - bool Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port); + bool Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port, std::string connection_label = "default"); ~Database(); /* Character Creation */ - bool AddToNameFilter(const char* name); - bool CreateCharacter(uint32 account_id, char* name, uint16 gender, uint16 race, uint16 class_, uint8 str, uint8 sta, uint8 cha, uint8 dex, uint8 int_, uint8 agi, uint8 wis, uint8 face); - bool DeleteCharacter(char* character_name); - bool MoveCharacterToZone(const char* charname, const char* zonename); - bool MoveCharacterToZone(const char* charname, const char* zonename,uint32 zoneid); - bool MoveCharacterToZone(uint32 iCharID, const char* iZonename); - bool ReserveName(uint32 account_id, char* name); - bool SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp); - bool SetHackerFlag(const char* accountname, const char* charactername, const char* hacked); - bool SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone); - bool UpdateName(const char* oldname, const char* newname); + bool AddToNameFilter(const char *name); + bool CreateCharacter( + uint32 account_id, + char *name, + uint16 gender, + uint16 race, + uint16 class_, + uint8 str, + uint8 sta, + uint8 cha, + uint8 dex, + uint8 int_, + uint8 agi, + uint8 wis, + uint8 face + ); + bool DeleteCharacter(char *character_name); + bool MoveCharacterToZone(const char *charname, uint32 zone_id); + bool MoveCharacterToZone(uint32 character_id, uint32 zone_id); + bool ReserveName(uint32 account_id, char *name); + bool SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct *pp); + bool SetHackerFlag(const char *accountname, const char *charactername, const char *hacked); + bool SetMQDetectionFlag(const char *accountname, const char *charactername, const char *hacked, const char *zone); + bool SetMQDetectionFlag(const char *accountname, const char *charactername, const std::string &hacked, const char *zone); + bool UpdateName(const char *oldname, const char *newname); + bool CopyCharacter( + std::string source_character_name, + std::string destination_character_name, + std::string destination_account_name + ); /* General Information Queries */ @@ -137,6 +138,8 @@ public: void GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID = 0); void GetCharName(uint32 char_id, char* name); + std::string GetCharNameByID(uint32 char_id); + std::string GetNPCNameByID(uint32 npc_id); void LoginIP(uint32 AccountID, const char* LoginIP); /* Instancing */ @@ -153,7 +156,6 @@ public: bool VerifyInstanceAlive(uint16 instance_id, uint32 char_id); bool VerifyZoneInstance(uint32 zone_id, uint16 instance_id); - uint16 GetInstanceID(const char* zone, uint32 charid, int16 version); uint16 GetInstanceID(uint32 zone, uint32 charid, int16 version); uint16 GetInstanceVersion(uint16 instance_id); uint32 GetTimeRemainingInstance(uint16 instance_id, bool &is_perma); @@ -193,19 +195,19 @@ public: void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus); void SetAgreementFlag(uint32 acctid); - + int GetIPExemption(std::string account_ip); int GetInstanceID(uint32 char_id, uint32 zone_id); /* Groups */ - + char* GetGroupLeaderForLogin(const char* name,char* leaderbuf); char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr, char *mentoree = nullptr, int *mentor_percent = nullptr, GroupLeadershipAA_Struct* GLAA = nullptr); - + uint32 GetGroupID(const char* name); - + void ClearGroup(uint32 gid = 0); void ClearGroupLeader(uint32 gid = 0); void SetGroupID(const char* name, uint32 id, uint32 charid, uint32 ismerc = false); @@ -240,17 +242,12 @@ public: /* General Queries */ - bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr); - bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); } + bool GetSafePoints(const char* zone_short_name, uint32 instance_version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, float* safe_heading = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr); bool GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid = 0, float* graveyard_x = 0, float* graveyard_y = 0, float* graveyard_z = 0, float* graveyard_heading = 0); bool GetZoneLongName(const char* short_name, char** long_name, char* file_name = 0, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, uint32* graveyard_id = 0, uint32* maxclients = 0); bool LoadPTimers(uint32 charid, PTimerList &into); - bool LoadZoneNames(); - - const char* GetZoneName(uint32 zoneID, bool ErrorUnknown = false); uint32 GetZoneGraveyardID(uint32 zone_id, uint32 version); - uint32 GetZoneID(const char* zonename); uint8 GetPEQZone(uint32 zoneID, uint32 version); uint8 GetRaceSkill(uint8 skillid, uint8 in_race); @@ -274,7 +271,6 @@ public: void LoadLogSettings(EQEmuLogSys::LogSettings* log_settings); private: - std::map zonename_array; Mutex Mvarcache; VarCache_Struct varcache; diff --git a/common/database/database_dump_service.cpp b/common/database/database_dump_service.cpp index c4aa971d6..7efd80f83 100644 --- a/common/database/database_dump_service.cpp +++ b/common/database/database_dump_service.cpp @@ -50,7 +50,11 @@ std::string DatabaseDumpService::execute(const std::string &cmd, bool return_res const char *file_name = "db-exec-result.txt"; if (return_result) { +#ifdef _WINDOWS + std::system((cmd + " > " + file_name + " 2>&1").c_str()); +#else std::system((cmd + " > " + file_name).c_str()); +#endif } else { std::system((cmd).c_str()); @@ -95,7 +99,7 @@ bool DatabaseDumpService::IsTarAvailable() */ bool DatabaseDumpService::Is7ZipAvailable() { - std::string version_output = execute("7z -help"); + std::string version_output = execute("7z --help"); return version_output.find("7-Zip") != std::string::npos; } @@ -124,12 +128,23 @@ std::string DatabaseDumpService::GetMySQLVersion() std::string DatabaseDumpService::GetBaseMySQLDumpCommand() { auto config = EQEmuConfig::get(); + if (IsDumpContentTables() && !config->ContentDbHost.empty()) { + return fmt::format( + "mysqldump -u {} -p{} -h {} --port={} {}", + config->ContentDbUsername, + config->ContentDbPassword, + config->ContentDbHost, + config->ContentDbPort, + config->ContentDbName + ); + }; return fmt::format( - "mysqldump -u {} -p{} -h {} {}", + "mysqldump -u {} -p{} -h {} --port={} {}", config->DatabaseUsername, config->DatabasePassword, config->DatabaseHost, + config->DatabasePort, config->DatabaseDB ); } @@ -285,8 +300,7 @@ void DatabaseDumpService::Dump() config->DatabaseUsername ); - std::string options = "--allow-keywords --extended-insert"; - + std::string options = "--allow-keywords --extended-insert --max-allowed-packet=1G --net-buffer-length=32704"; if (IsDumpWithNoData()) { options += " --no-data"; } @@ -396,9 +410,8 @@ void DatabaseDumpService::Dump() else if (Is7ZipAvailable()) { execute( fmt::format( - "7z a -t7z {}.zip -C {} {}.sql", + "7z a -t7z {}.zip {}.sql", GetDumpFileNameWithPath(), - GetSetDumpPath(), GetDumpFileNameWithPath() ) ); diff --git a/common/database_conversions.cpp b/common/database_conversions.cpp index ec973d9af..561e1679b 100644 --- a/common/database_conversions.cpp +++ b/common/database_conversions.cpp @@ -48,7 +48,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA namespace Convert { struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -189,7 +189,7 @@ namespace Convert { /*002*/ uint32 HP; /*006*/ uint32 Mana; /*010*/ Convert::SpellBuff_Struct Buffs[BUFF_COUNT]; - /*510*/ uint32 Items[EQEmu::textures::materialCount]; + /*510*/ uint32 Items[EQ::textures::materialCount]; /*546*/ char Name[64]; /*610*/ }; @@ -230,9 +230,9 @@ namespace Convert { /*0304*/ uint8 ability_time_minutes; /*0305*/ uint8 ability_time_hours; //place holder /*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag? - /*0312*/ uint32 item_material[EQEmu::textures::materialCount]; // Item texture/material of worn/held items + /*0312*/ uint32 item_material[EQ::textures::materialCount]; // Item texture/material of worn/held items /*0348*/ uint8 unknown0348[44]; - /*0392*/ Convert::Color_Struct item_tint[EQEmu::textures::materialCount]; + /*0392*/ Convert::Color_Struct item_tint[EQ::textures::materialCount]; /*0428*/ Convert::AA_Array aa_array[MAX_PP_AA_ARRAY]; /*2348*/ float unknown2384; //seen ~128, ~47 /*2352*/ char servername[32]; // length probably not right @@ -1320,18 +1320,18 @@ bool Database::CheckDatabaseConvertPPDeblob(){ if (rquery != ""){ results = QueryDatabase(rquery); } /* Run Bind Home Convert */ - if (pp->binds[4].zoneId < 999 && !_ISNAN_(pp->binds[4].x) && !_ISNAN_(pp->binds[4].y) && !_ISNAN_(pp->binds[4].z) && !_ISNAN_(pp->binds[4].heading)) { + if (pp->binds[4].zone_id < 999 && !_ISNAN_(pp->binds[4].x) && !_ISNAN_(pp->binds[4].y) && !_ISNAN_(pp->binds[4].z) && !_ISNAN_(pp->binds[4].heading)) { rquery = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, is_home)" " VALUES (%u, %u, %u, %f, %f, %f, %f, 1)", - character_id, pp->binds[4].zoneId, 0, pp->binds[4].x, pp->binds[4].y, pp->binds[4].z, pp->binds[4].heading); + character_id, pp->binds[4].zone_id, 0, pp->binds[4].x, pp->binds[4].y, pp->binds[4].z, pp->binds[4].heading); if (rquery != ""){ results = QueryDatabase(rquery); } } /* Run Bind Convert */ - if (pp->binds[0].zoneId < 999 && !_ISNAN_(pp->binds[0].x) && !_ISNAN_(pp->binds[0].y) && !_ISNAN_(pp->binds[0].z) && !_ISNAN_(pp->binds[0].heading)) { + if (pp->binds[0].zone_id < 999 && !_ISNAN_(pp->binds[0].x) && !_ISNAN_(pp->binds[0].y) && !_ISNAN_(pp->binds[0].z) && !_ISNAN_(pp->binds[0].heading)) { rquery = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, is_home)" " VALUES (%u, %u, %u, %f, %f, %f, %f, 0)", - character_id, pp->binds[0].zoneId, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading); + character_id, pp->binds[0].zone_id, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading); if (rquery != ""){ results = QueryDatabase(rquery); } } /* Run Language Convert */ @@ -1396,7 +1396,7 @@ bool Database::CheckDatabaseConvertPPDeblob(){ if (rquery != ""){ results = QueryDatabase(rquery); } /* Run Material Color Convert */ first_entry = 0; rquery = ""; - for (i = EQEmu::textures::textureBegin; i < EQEmu::textures::materialCount; i++){ + for (i = EQ::textures::textureBegin; i < EQ::textures::materialCount; i++){ if (pp->item_tint[i].color > 0){ if (first_entry != 1){ rquery = StringFormat("REPLACE INTO `character_material` (id, slot, blue, green, red, use_tint, color) VALUES (%u, %u, %u, %u, %u, %u, %u)", character_id, i, pp->item_tint[i].rgb.blue, pp->item_tint[i].rgb.green, pp->item_tint[i].rgb.red, pp->item_tint[i].rgb.use_tint, pp->item_tint[i].color); diff --git a/common/database_instances.cpp b/common/database_instances.cpp index 68496b61d..0c4be4bd6 100644 --- a/common/database_instances.cpp +++ b/common/database_instances.cpp @@ -34,6 +34,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #define strcasecmp _stricmp #else #include "unix.h" +#include "../zone/zonedb.h" #include #include #endif @@ -97,42 +98,53 @@ bool Database::CheckInstanceExists(uint16 instance_id) { bool Database::CheckInstanceExpired(uint16 instance_id) { - int32 start_time = 0; - int32 duration = 0; + int32 start_time = 0; + int32 duration = 0; uint32 never_expires = 0; - std::string query = StringFormat("SELECT start_time, duration, never_expires FROM instance_list WHERE id=%u", instance_id); + std::string query = StringFormat( + "SELECT start_time, duration, never_expires FROM instance_list WHERE id=%u", + instance_id + ); + auto results = QueryDatabase(query); - if (!results.Success()) + if (!results.Success()) { return true; + } - if (results.RowCount() == 0) + if (results.RowCount() == 0) { return true; + } auto row = results.begin(); - start_time = atoi(row[0]); - duration = atoi(row[1]); + start_time = atoi(row[0]); + duration = atoi(row[1]); never_expires = atoi(row[2]); - if (never_expires == 1) + if (never_expires == 1) { return false; + } - timeval tv; + timeval tv{}; gettimeofday(&tv, nullptr); - if ((start_time + duration) <= tv.tv_sec) - return true; + return (start_time + duration) <= tv.tv_sec; - return false; } bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration) { - std::string query = StringFormat("INSERT INTO instance_list (id, zone, version, start_time, duration)" - " values(%lu, %lu, %lu, UNIX_TIMESTAMP(), %lu)", - (unsigned long)instance_id, (unsigned long)zone_id, (unsigned long)version, (unsigned long)duration); + std::string query = StringFormat( + "INSERT INTO instance_list (id, zone, version, start_time, duration)" + " values (%u, %u, %u, UNIX_TIMESTAMP(), %u)", + instance_id, + zone_id, + version, + duration + ); + auto results = QueryDatabase(query); return results.Success(); @@ -140,66 +152,84 @@ bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version bool Database::GetUnusedInstanceID(uint16 &instance_id) { - uint32 count = RuleI(Zone, ReservedInstances); - uint32 max = 65535; + uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances); + uint32 max = 32000; + + std::string query = StringFormat( + "SELECT IFNULL(MAX(id),%u)+1 FROM instance_list WHERE id > %u", + max_reserved_instance_id, + max_reserved_instance_id + ); + + if (RuleB(Instances, RecycleInstanceIds)) { + query = ( + SQL( + SELECT i.id + 1 AS next_available + FROM instance_list i + LEFT JOIN instance_list i2 ON i2.id = i.id + 1 + WHERE i2.id IS NULL + ORDER BY i.id + LIMIT 0, 1; + + ) + ); + } - std::string query = StringFormat("SELECT IFNULL(MAX(id),%u)+1 FROM instance_list WHERE id > %u", count, count); auto results = QueryDatabase(query); - if (!results.Success()) - { + if (!results.Success()) { instance_id = 0; return false; } - if (results.RowCount() == 0) - { - instance_id = 0; - return false; + if (results.RowCount() == 0) { + instance_id = max_reserved_instance_id; + return true; } auto row = results.begin(); - if (atoi(row[0]) <= max) - { + if (atoi(row[0]) <= max) { instance_id = atoi(row[0]); + return true; } - query = StringFormat("SELECT id FROM instance_list where id > %u ORDER BY id", count); + if (instance_id < max_reserved_instance_id) { + instance_id = max_reserved_instance_id; + return true; + } + + query = StringFormat("SELECT id FROM instance_list where id > %u ORDER BY id", max_reserved_instance_id); results = QueryDatabase(query); - if (!results.Success()) - { + if (!results.Success()) { instance_id = 0; return false; } - if (results.RowCount() == 0) - { + if (results.RowCount() == 0) { instance_id = 0; return false; } - count++; - for (auto row = results.begin(); row != results.end(); ++row) - { - if (count < atoi(row[0])) - { - instance_id = count; + max_reserved_instance_id++; + for (auto row = results.begin(); row != results.end(); ++row) { + if (max_reserved_instance_id < atoi(row[0])) { + instance_id = max_reserved_instance_id; return true; } - if (count > max) - { + if (max_reserved_instance_id > max) { instance_id = 0; return false; } - count++; + max_reserved_instance_id++; } - instance_id = count; + instance_id = max_reserved_instance_id; + return true; } @@ -276,36 +306,6 @@ bool Database::VerifyZoneInstance(uint32 zone_id, uint16 instance_id) return true; } -uint16 Database::GetInstanceID(const char* zone, uint32 character_id, int16 version) { - - std::string query = StringFormat( - "SELECT " - "instance_list.id " - "FROM " - "instance_list, " - "instance_list_player " - "WHERE " - "instance_list.zone = %u " - "AND instance_list.version = %u " - "AND instance_list.id = instance_list_player.id " - "AND instance_list_player.charid = %u " - "LIMIT 1 ", - GetZoneID(zone), - version, - character_id - ); - auto results = QueryDatabase(query); - - if (!results.Success()) - return 0; - - if (results.RowCount() == 0) - return 0; - - auto row = results.begin(); - return atoi(row[0]); -} - uint16 Database::GetInstanceID(uint32 zone, uint32 character_id, int16 version) { if (!zone) @@ -482,9 +482,8 @@ void Database::BuryCorpsesInInstance(uint16 instance_id) { void Database::DeleteInstance(uint16 instance_id) { - std::string query = StringFormat("DELETE FROM instance_list WHERE id=%u", instance_id); - QueryDatabase(query); - + std::string query; + query = StringFormat("DELETE FROM instance_list_player WHERE id=%u", instance_id); QueryDatabase(query); @@ -494,6 +493,9 @@ void Database::DeleteInstance(uint16 instance_id) query = StringFormat("DELETE FROM spawn_condition_values WHERE instance_id=%u", instance_id); QueryDatabase(query); + query = fmt::format("DELETE FROM dynamic_zones WHERE instance_id={}", instance_id); + QueryDatabase(query); + BuryCorpsesInInstance(instance_id); } @@ -505,7 +507,7 @@ void Database::FlagInstanceByGroupLeader(uint32 zone, int16 version, uint32 char char ln[128]; memset(ln, 0, 128); - strcpy(ln, GetGroupLeadershipInfo(gid, ln)); + GetGroupLeadershipInfo(gid, ln); uint32 l_charid = GetCharacterID((const char*)ln); uint16 l_id = GetInstanceID(zone, l_charid, version); @@ -544,17 +546,46 @@ void Database::GetCharactersInInstance(uint16 instance_id, std::list &ch void Database::PurgeExpiredInstances() { - std::string query("SELECT id FROM instance_list where (start_time+duration) <= UNIX_TIMESTAMP() and never_expires = 0"); + + /** + * Delay purging by a day so that we can continue using adjacent free instance id's + * from the table without risking the chance we immediately re-allocate a zone that freshly expired but + * has not been fully de-allocated + */ + std::string query = + SQL( + SELECT + id + FROM + instance_list + where + (start_time + duration) <= (UNIX_TIMESTAMP() - 86400) + and never_expires = 0 + ); + auto results = QueryDatabase(query); - if (!results.Success()) + if (!results.Success()) { return; + } - if (results.RowCount() == 0) + if (results.RowCount() == 0) { return; + } - for (auto row = results.begin(); row != results.end(); ++row) - DeleteInstance(atoi(row[0])); + std::vector instance_ids; + for (auto row = results.begin(); row != results.end(); ++row) { + instance_ids.emplace_back(row[0]); + } + + std::string imploded_instance_ids = implode(",", instance_ids); + + QueryDatabase(fmt::format("DELETE FROM instance_list WHERE id IN ({})", imploded_instance_ids)); + QueryDatabase(fmt::format("DELETE FROM instance_list_player WHERE id IN ({})", imploded_instance_ids)); + QueryDatabase(fmt::format("DELETE FROM respawn_times WHERE instance_id IN ({})", imploded_instance_ids)); + QueryDatabase(fmt::format("DELETE FROM spawn_condition_values WHERE instance_id IN ({})", imploded_instance_ids)); + QueryDatabase(fmt::format("UPDATE character_corpses SET is_buried = 1, instance_id = 0 WHERE instance_id IN ({})", imploded_instance_ids)); + QueryDatabase(fmt::format("DELETE FROM dynamic_zones WHERE instance_id IN ({})", imploded_instance_ids)); } void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration) @@ -562,4 +593,4 @@ void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration) std::string query = StringFormat("UPDATE `instance_list` SET start_time=UNIX_TIMESTAMP(), " "duration=%u WHERE id=%u", new_duration, instance_id); auto results = QueryDatabase(query); -} \ No newline at end of file +} diff --git a/common/database_schema.h b/common/database_schema.h index 6a7ccf612..8d8e81441 100644 --- a/common/database_schema.h +++ b/common/database_schema.h @@ -50,6 +50,8 @@ namespace DatabaseSchema { {"character_data", "id"}, {"character_disciplines", "id"}, {"character_enabledtasks", "charid"}, + {"character_expedition_lockouts", "character_id"}, + {"character_exp_modifiers", "character_id"}, {"character_inspect_messages", "id"}, {"character_item_recast", "id"}, {"character_languages", "id"}, @@ -114,6 +116,8 @@ namespace DatabaseSchema { "character_data", "character_disciplines", "character_enabledtasks", + "character_expedition_lockouts", + "character_exp_modifiers", "character_inspect_messages", "character_item_recast", "character_languages", @@ -179,6 +183,7 @@ namespace DatabaseSchema { "books", "char_create_combinations", "char_create_point_allocations", + "damageshieldtypes", "doors", "faction_base_data", "faction_list", @@ -218,7 +223,6 @@ namespace DatabaseSchema { "skill_caps", "spawn2", "spawn_conditions", - "spawn_events", "spawnentry", "spawngroup", "spells_new", @@ -248,11 +252,13 @@ namespace DatabaseSchema { return { "chatchannels", "command_settings", + "content_flags", "db_str", "eqtime", "launcher", "launcher_zones", "spawn_condition_values", + "spawn_events", "level_exp_mods", "logsys_categories", "name_filter", @@ -303,7 +309,11 @@ namespace DatabaseSchema { "banned_ips", "bug_reports", "bugs", + "dynamic_zones", "eventlog", + "expedition_lockouts", + "expedition_members", + "expeditions", "gm_ips", "group_id", "group_leaders", @@ -320,7 +330,7 @@ namespace DatabaseSchema { "reports", "respawn_times", "saylink", - + "server_scheduled_events", }; } diff --git a/common/dbcore.cpp b/common/dbcore.cpp index bc3ce0a72..7f1f52363 100644 --- a/common/dbcore.cpp +++ b/common/dbcore.cpp @@ -51,7 +51,11 @@ DBcore::~DBcore() * are re-using the default database connection pointer when we dont have an * external configuration setup ex: (content_database) */ - std::string mysql_connection_host = mysql.host; + std::string mysql_connection_host; + if (mysql.host) { + mysql_connection_host = mysql.host; + } + if (GetOriginHost() != mysql_connection_host) { return; } @@ -79,6 +83,13 @@ MySQLRequestResult DBcore::QueryDatabase(std::string query, bool retryOnFailureO return QueryDatabase(query.c_str(), query.length(), retryOnFailureOnce); } +bool DBcore::DoesTableExist(std::string table_name) +{ + auto results = QueryDatabase(fmt::format("SHOW TABLES LIKE '{}'", table_name)); + + return results.RowCount() > 0; +} + MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, bool retryOnFailureOnce) { BenchTimer timer; @@ -212,10 +223,10 @@ bool DBcore::Open( ) { LockMutex lock(&MDatabase); - safe_delete(pHost); - safe_delete(pUser); - safe_delete(pPassword); - safe_delete(pDatabase); + safe_delete_array(pHost); + safe_delete_array(pUser); + safe_delete_array(pPassword); + safe_delete_array(pDatabase); pHost = strcpy(new char[strlen(iHost) + 1], iHost); pUser = strcpy(new char[strlen(iUser) + 1], iUser); pPassword = strcpy(new char[strlen(iPassword) + 1], iPassword); diff --git a/common/dbcore.h b/common/dbcore.h index 8c508255b..8e8e6b46b 100644 --- a/common/dbcore.h +++ b/common/dbcore.h @@ -35,6 +35,8 @@ public: const std::string &GetOriginHost() const; void SetOriginHost(const std::string &origin_host); + bool DoesTableExist(std::string table_name); + protected: bool Open( const char *iHost, diff --git a/common/deity.cpp b/common/deity.cpp index b8a2d87d7..0923c43d0 100644 --- a/common/deity.cpp +++ b/common/deity.cpp @@ -20,7 +20,7 @@ #include "deity.h" -EQEmu::deity::DeityTypeBit EQEmu::deity::ConvertDeityTypeToDeityTypeBit(DeityType deity_type) +EQ::deity::DeityTypeBit EQ::deity::ConvertDeityTypeToDeityTypeBit(DeityType deity_type) { switch (deity_type) { case DeityBertoxxulous: @@ -63,7 +63,7 @@ EQEmu::deity::DeityTypeBit EQEmu::deity::ConvertDeityTypeToDeityTypeBit(DeityTyp }; } -EQEmu::deity::DeityType EQEmu::deity::ConvertDeityTypeBitToDeityType(DeityTypeBit deity_type_bit) +EQ::deity::DeityType EQ::deity::ConvertDeityTypeBitToDeityType(DeityTypeBit deity_type_bit) { switch (deity_type_bit) { case bit_DeityAgnostic: @@ -105,7 +105,7 @@ EQEmu::deity::DeityType EQEmu::deity::ConvertDeityTypeBitToDeityType(DeityTypeBi }; } -const char* EQEmu::deity::DeityName(DeityType deity_type) +const char* EQ::deity::DeityName(DeityType deity_type) { switch (deity_type) { case DeityBertoxxulous: diff --git a/common/deity.h b/common/deity.h index f754352a0..8d0fe4c7a 100644 --- a/common/deity.h +++ b/common/deity.h @@ -23,7 +23,7 @@ #include "types.h" -namespace EQEmu +namespace EQ { namespace deity { enum DeityType { diff --git a/common/dynamic_zone_base.cpp b/common/dynamic_zone_base.cpp new file mode 100644 index 000000000..8e29722d3 --- /dev/null +++ b/common/dynamic_zone_base.cpp @@ -0,0 +1,289 @@ +#include "dynamic_zone_base.h" +#include "database.h" +#include "eqemu_logsys.h" +#include "repositories/instance_list_repository.h" +#include "repositories/instance_list_player_repository.h" +#include "servertalk.h" + +DynamicZoneBase::DynamicZoneBase(DynamicZonesRepository::DynamicZoneInstance&& entry) +{ + LoadRepositoryResult(std::move(entry)); +} + +uint32_t DynamicZoneBase::Create() +{ + if (m_id != 0) + { + return m_id; + } + + if (GetInstanceID() == 0) + { + CreateInstance(); + } + + m_id = SaveToDatabase(); + + return m_id; +} + +uint32_t DynamicZoneBase::CreateInstance() +{ + if (m_instance_id) + { + LogDynamicZones("CreateInstance failed, instance id [{}] already created", m_instance_id); + return 0; + } + + if (!m_zone_id) + { + LogDynamicZones("CreateInstance failed, invalid zone id [{}]", m_zone_id); + return 0; + } + + uint16_t unused_instance_id = 0; + if (!GetDatabase().GetUnusedInstanceID(unused_instance_id)) // todo: doesn't this race with insert? + { + LogDynamicZones("Failed to find unused instance id"); + return 0; + } + + m_start_time = std::chrono::system_clock::now(); + m_expire_time = m_start_time + m_duration; + + auto insert_instance = InstanceListRepository::NewEntity(); + insert_instance.id = unused_instance_id; + insert_instance.zone = m_zone_id; + insert_instance.version = m_zone_version; + insert_instance.start_time = static_cast(std::chrono::system_clock::to_time_t(m_start_time)); + insert_instance.duration = static_cast(m_duration.count()); + insert_instance.never_expires = m_never_expires; + + auto instance = InstanceListRepository::InsertOne(GetDatabase(), insert_instance); + if (instance.id == 0) + { + LogDynamicZones("Failed to create instance [{}] for zone [{}]", unused_instance_id, m_zone_id); + return 0; + } + + m_instance_id = instance.id; + + return m_instance_id; +} + +void DynamicZoneBase::LoadRepositoryResult(DynamicZonesRepository::DynamicZoneInstance&& dz_entry) +{ + m_id = dz_entry.id; + m_instance_id = dz_entry.instance_id; + m_type = static_cast(dz_entry.type); + m_compass.zone_id = dz_entry.compass_zone_id; + m_compass.x = dz_entry.compass_x; + m_compass.y = dz_entry.compass_y; + m_compass.z = dz_entry.compass_z; + m_safereturn.zone_id = dz_entry.safe_return_zone_id; + m_safereturn.x = dz_entry.safe_return_x; + m_safereturn.y = dz_entry.safe_return_y; + m_safereturn.z = dz_entry.safe_return_z; + m_safereturn.heading = dz_entry.safe_return_heading; + m_zonein.x = dz_entry.zone_in_x; + m_zonein.y = dz_entry.zone_in_y; + m_zonein.z = dz_entry.zone_in_z; + m_zonein.heading = dz_entry.zone_in_heading; + m_has_zonein = (dz_entry.has_zone_in != 0); + // instance_list portion + m_zone_id = dz_entry.zone; + m_zone_version = dz_entry.version; + m_start_time = std::chrono::system_clock::from_time_t(dz_entry.start_time); + m_duration = std::chrono::seconds(dz_entry.duration); + m_never_expires = (dz_entry.never_expires != 0); + m_expire_time = m_start_time + m_duration; +} + +uint32_t DynamicZoneBase::SaveToDatabase() +{ + LogDynamicZonesDetail("Saving dz instance [{}] to database", m_instance_id); + + if (m_instance_id != 0) + { + auto insert_dz = DynamicZonesRepository::NewEntity(); + insert_dz.instance_id = m_instance_id, + insert_dz.type = static_cast(m_type); + insert_dz.compass_zone_id = m_compass.zone_id; + insert_dz.compass_x = m_compass.x; + insert_dz.compass_y = m_compass.y; + insert_dz.compass_z = m_compass.z; + insert_dz.safe_return_zone_id = m_safereturn.zone_id; + insert_dz.safe_return_x = m_safereturn.x; + insert_dz.safe_return_y = m_safereturn.y; + insert_dz.safe_return_z = m_safereturn.z; + insert_dz.safe_return_heading = m_safereturn.heading; + insert_dz.zone_in_x = m_zonein.x; + insert_dz.zone_in_y = m_zonein.y; + insert_dz.zone_in_z = m_zonein.z; + insert_dz.zone_in_heading = m_zonein.heading; + insert_dz.has_zone_in = m_has_zonein; + + auto inserted_dz = DynamicZonesRepository::InsertOne(GetDatabase(), insert_dz); + return inserted_dz.id; + } + return 0; +} + +void DynamicZoneBase::AddCharacter(uint32_t character_id) +{ + GetDatabase().AddClientToInstance(m_instance_id, character_id); + SendInstanceAddRemoveCharacter(character_id, false); // stops client kick timer +} + +void DynamicZoneBase::RemoveCharacter(uint32_t character_id) +{ + GetDatabase().RemoveClientFromInstance(m_instance_id, character_id); + SendInstanceAddRemoveCharacter(character_id, true); // start client kick timer +} + +void DynamicZoneBase::RemoveAllCharacters(bool enable_removal_timers) +{ + if (GetInstanceID() == 0) + { + return; + } + + if (enable_removal_timers) + { + SendInstanceRemoveAllCharacters(); + } + + GetDatabase().RemoveClientsFromInstance(GetInstanceID()); +} + +void DynamicZoneBase::SaveInstanceMembersToDatabase(const std::vector& character_ids) +{ + LogDynamicZonesDetail("Saving [{}] members for instance [{}]", character_ids.size(), m_instance_id); + + std::vector insert_players; + + for (const auto& character_id : character_ids) + { + InstanceListPlayerRepository::InstanceListPlayer entry{}; + entry.id = static_cast(m_instance_id); + entry.charid = static_cast(character_id); + insert_players.emplace_back(entry); + } + + InstanceListPlayerRepository::InsertMany(GetDatabase(), insert_players); +} + +void DynamicZoneBase::SetCompass(const DynamicZoneLocation& location, bool update_db) +{ + ProcessCompassChange(location); + + if (update_db) + { + LogDynamicZonesDetail("Saving [{}] compass zone: [{}] xyz: ([{}], [{}], [{}])", + m_id, m_compass.zone_id, m_compass.x, m_compass.y, m_compass.z); + + DynamicZonesRepository::UpdateCompass(GetDatabase(), + m_id, m_compass.zone_id, m_compass.x, m_compass.y, m_compass.z); + + SendGlobalLocationChange(ServerOP_DzSetCompass, location); + } +} + +void DynamicZoneBase::SetCompass(uint32_t zone_id, float x, float y, float z, bool update_db) +{ + SetCompass({ zone_id, x, y, z, 0.0f }, update_db); +} + +void DynamicZoneBase::SetSafeReturn(const DynamicZoneLocation& location, bool update_db) +{ + m_safereturn = location; + + if (update_db) + { + LogDynamicZonesDetail("Saving [{}] safereturn zone: [{}] xyzh: ([{}], [{}], [{}], [{}])", + m_id, m_safereturn.zone_id, m_safereturn.x, m_safereturn.y, m_safereturn.z, m_safereturn.heading); + + DynamicZonesRepository::UpdateSafeReturn(GetDatabase(), m_id, m_safereturn.zone_id, + m_safereturn.x, m_safereturn.y, m_safereturn.z, m_safereturn.heading); + + SendGlobalLocationChange(ServerOP_DzSetSafeReturn, location); + } +} + +void DynamicZoneBase::SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading, bool update_db) +{ + SetSafeReturn({ zone_id, x, y, z, heading }, update_db); +} + +void DynamicZoneBase::SetZoneInLocation(const DynamicZoneLocation& location, bool update_db) +{ + m_zonein = location; + m_has_zonein = true; + + if (update_db) + { + LogDynamicZonesDetail("Saving [{}] zonein zone: [{}] xyzh: ([{}], [{}], [{}], [{}])", + m_id, m_zone_id, m_zonein.x, m_zonein.y, m_zonein.z, m_zonein.heading); + + DynamicZonesRepository::UpdateZoneIn(GetDatabase(), m_id, m_zone_id, + m_zonein.x, m_zonein.y, m_zonein.z, m_zonein.heading, m_has_zonein); + + SendGlobalLocationChange(ServerOP_DzSetZoneIn, location); + } +} + +void DynamicZoneBase::SetZoneInLocation(float x, float y, float z, float heading, bool update_db) +{ + SetZoneInLocation({ 0, x, y, z, heading }, update_db); +} + +uint32_t DynamicZoneBase::GetSecondsRemaining() const +{ + auto remaining = std::chrono::duration_cast(GetDurationRemaining()).count(); + return std::max(0, static_cast(remaining)); +} + +std::unique_ptr DynamicZoneBase::CreateServerAddRemoveCharacterPacket( + uint32_t character_id, bool removed) +{ + constexpr uint32_t pack_size = sizeof(ServerDzCharacter_Struct); + auto pack = std::make_unique(ServerOP_DzAddRemoveCharacter, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->zone_id = GetZoneID(); + buf->instance_id = GetInstanceID(); + buf->remove = removed; + buf->character_id = character_id; + + return pack; +} + +std::unique_ptr DynamicZoneBase::CreateServerRemoveAllCharactersPacket() +{ + constexpr uint32_t pack_size = sizeof(ServerDzCharacter_Struct); + auto pack = std::make_unique(ServerOP_DzRemoveAllCharacters, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->zone_id = GetZoneID(); + buf->instance_id = GetInstanceID(); + buf->remove = true; + buf->character_id = 0; + + return pack; +} + +std::unique_ptr DynamicZoneBase::CreateServerDzLocationPacket( + uint16_t server_opcode, const DynamicZoneLocation& location) +{ + constexpr uint32_t pack_size = sizeof(ServerDzLocation_Struct); + auto pack = std::make_unique(server_opcode, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->dz_id = GetID(); + buf->sender_zone_id = GetCurrentZoneID(); + buf->sender_instance_id = GetCurrentInstanceID(); + buf->zone_id = location.zone_id; + buf->x = location.x; + buf->y = location.y; + buf->z = location.z; + buf->heading = location.heading; + + return pack; +} diff --git a/common/dynamic_zone_base.h b/common/dynamic_zone_base.h new file mode 100644 index 000000000..5a84fa8fa --- /dev/null +++ b/common/dynamic_zone_base.h @@ -0,0 +1,135 @@ +#ifndef COMMON_DYNAMIC_ZONE_BASE_H +#define COMMON_DYNAMIC_ZONE_BASE_H + +#include "eq_constants.h" +#include "repositories/dynamic_zones_repository.h" +#include +#include +#include +#include +#include +#include + +class Database; +class ServerPacket; + +struct DynamicZoneMember +{ + uint32_t id = 0; + std::string name; + DynamicZoneMemberStatus status = DynamicZoneMemberStatus::Online; + + DynamicZoneMember() = default; + DynamicZoneMember(uint32_t id, std::string name_) + : id(id), name{std::move(name_)} {} + DynamicZoneMember(uint32_t id, std::string name_, DynamicZoneMemberStatus status_) + : id(id), name{std::move(name_)}, status(status_) {} + + bool IsOnline() const { return status == DynamicZoneMemberStatus::Online || + status == DynamicZoneMemberStatus::InDynamicZone; } + bool IsValid() const { return id != 0 && !name.empty(); } +}; + +struct DynamicZoneLocation +{ + uint32_t zone_id = 0; + float x = 0.0f; + float y = 0.0f; + float z = 0.0f; + float heading = 0.0f; + + DynamicZoneLocation() = default; + DynamicZoneLocation(uint32_t zone_id_, float x_, float y_, float z_, float heading_) + : zone_id(zone_id_), x(x_), y(y_), z(z_), heading(heading_) {} +}; + +class DynamicZoneBase +{ +public: + virtual ~DynamicZoneBase() = default; + DynamicZoneBase(const DynamicZoneBase&) = default; + DynamicZoneBase(DynamicZoneBase&&) = default; + DynamicZoneBase& operator=(const DynamicZoneBase&) = default; + DynamicZoneBase& operator=(DynamicZoneBase&&) = default; + DynamicZoneBase() = default; + DynamicZoneBase(uint32_t dz_id) : m_id(dz_id) {} + DynamicZoneBase(DynamicZoneType type) : m_type(type) {} + DynamicZoneBase(DynamicZonesRepository::DynamicZoneInstance&& entry); + + virtual void SetSecondsRemaining(uint32_t seconds_remaining) = 0; + + uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); } + uint32_t GetID() const { return m_id; } + uint16_t GetInstanceID() const { return static_cast(m_instance_id); } + uint32_t GetMaxPlayers() const { return m_max_players; } + uint32_t GetMinPlayers() const { return m_min_players; } + uint32_t GetSecondsRemaining() const; + uint16_t GetZoneID() const { return static_cast(m_zone_id); } + uint32_t GetZoneIndex() const { return (m_instance_id << 16) | (m_zone_id & 0xffff); } + uint32_t GetZoneVersion() const { return m_zone_version; } + DynamicZoneType GetType() const { return m_type; } + const std::string& GetLeaderName() const { return m_leader_name; } + const std::string& GetName() const { return m_name; } + const DynamicZoneLocation& GetCompassLocation() const { return m_compass; } + const DynamicZoneLocation& GetSafeReturnLocation() const { return m_safereturn; } + const DynamicZoneLocation& GetZoneInLocation() const { return m_zonein; } + std::chrono::system_clock::duration GetDurationRemaining() const { return m_expire_time - std::chrono::system_clock::now(); } + + void AddCharacter(uint32_t character_id); + uint32_t Create(); + bool HasZoneInLocation() const { return m_has_zonein; } + bool IsExpired() const { return m_expire_time < std::chrono::system_clock::now(); } + bool IsInstanceID(uint32_t instance_id) const { return (m_instance_id != 0 && m_instance_id == instance_id); } + bool IsValid() const { return m_instance_id != 0; } + bool IsSameDz(uint32_t zone_id, uint32_t instance_id) const { return zone_id == m_zone_id && instance_id == m_instance_id; } + void RemoveAllCharacters(bool enable_removal_timers = true); + void RemoveCharacter(uint32_t character_id); + void SaveInstanceMembersToDatabase(const std::vector& character_ids); + void SetCompass(const DynamicZoneLocation& location, bool update_db = false); + void SetCompass(uint32_t zone_id, float x, float y, float z, bool update_db = false); + void SetLeaderName(const std::string& leader_name) { m_leader_name = leader_name; } + void SetMaxPlayers(uint32_t max_players) { m_max_players = max_players; } + void SetMinPlayers(uint32_t min_players) { m_min_players = min_players; } + void SetName(const std::string& name) { m_name = name; } + void SetSafeReturn(const DynamicZoneLocation& location, bool update_db = false); + void SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading, bool update_db = false); + void SetZoneInLocation(const DynamicZoneLocation& location, bool update_db = false); + void SetZoneInLocation(float x, float y, float z, float heading, bool update_db = false); + +protected: + virtual uint16_t GetCurrentInstanceID() { return 0; } + virtual uint16_t GetCurrentZoneID() { return 0; } + virtual Database& GetDatabase() = 0; + virtual void ProcessCompassChange(const DynamicZoneLocation& location) { m_compass = location; } + virtual void SendInstanceAddRemoveCharacter(uint32_t character_id, bool remove) = 0; + virtual void SendInstanceRemoveAllCharacters() = 0; + virtual void SendGlobalLocationChange(uint16_t server_opcode, const DynamicZoneLocation& location) = 0; + + uint32_t CreateInstance(); + void LoadRepositoryResult(DynamicZonesRepository::DynamicZoneInstance&& dz_entry); + uint32_t SaveToDatabase(); + + std::unique_ptr CreateServerAddRemoveCharacterPacket(uint32_t character_id, bool removed); + std::unique_ptr CreateServerRemoveAllCharactersPacket(); + std::unique_ptr CreateServerDzLocationPacket(uint16_t server_opcode, const DynamicZoneLocation& location); + + uint32_t m_id = 0; + uint32_t m_zone_id = 0; + uint32_t m_instance_id = 0; + uint32_t m_zone_version = 0; + uint32_t m_min_players = 0; + uint32_t m_max_players = 0; + bool m_never_expires = false; + bool m_has_zonein = false; + std::string m_name; + std::string m_leader_name; + DynamicZoneType m_type{ DynamicZoneType::None }; + DynamicZoneLocation m_compass; + DynamicZoneLocation m_safereturn; + DynamicZoneLocation m_zonein; + std::chrono::seconds m_duration; + std::chrono::time_point m_start_time; + std::chrono::time_point m_expire_time; +}; + +#endif diff --git a/common/emu_constants.cpp b/common/emu_constants.cpp index 950bc5ebb..8a6d2a8bd 100644 --- a/common/emu_constants.cpp +++ b/common/emu_constants.cpp @@ -20,7 +20,7 @@ #include "emu_constants.h" -int16 EQEmu::invtype::GetInvTypeSize(int16 inv_type) { +int16 EQ::invtype::GetInvTypeSize(int16 inv_type) { static const int16 local_array[] = { POSSESSIONS_SIZE, BANK_SIZE, @@ -55,7 +55,7 @@ int16 EQEmu::invtype::GetInvTypeSize(int16 inv_type) { return local_array[inv_type]; } -const char* EQEmu::bug::CategoryIDToCategoryName(CategoryID category_id) { +const char* EQ::bug::CategoryIDToCategoryName(CategoryID category_id) { switch (category_id) { case catVideo: return "Video"; @@ -87,7 +87,7 @@ const char* EQEmu::bug::CategoryIDToCategoryName(CategoryID category_id) { } } -EQEmu::bug::CategoryID EQEmu::bug::CategoryNameToCategoryID(const char* category_name) { +EQ::bug::CategoryID EQ::bug::CategoryNameToCategoryID(const char* category_name) { if (!category_name) return catOther; @@ -119,7 +119,7 @@ EQEmu::bug::CategoryID EQEmu::bug::CategoryNameToCategoryID(const char* category return catOther; } -const char *EQEmu::constants::GetStanceName(StanceType stance_type) { +const char *EQ::constants::GetStanceName(StanceType stance_type) { switch (stance_type) { case stanceUnknown: return "Unknown"; @@ -146,9 +146,9 @@ const char *EQEmu::constants::GetStanceName(StanceType stance_type) { } } -int EQEmu::constants::ConvertStanceTypeToIndex(StanceType stance_type) { - if (stance_type >= EQEmu::constants::stancePassive && stance_type <= EQEmu::constants::stanceBurnAE) - return (stance_type - EQEmu::constants::stancePassive); +int EQ::constants::ConvertStanceTypeToIndex(StanceType stance_type) { + if (stance_type >= EQ::constants::stancePassive && stance_type <= EQ::constants::stanceBurnAE) + return (stance_type - EQ::constants::stancePassive); return 0; } diff --git a/common/emu_constants.h b/common/emu_constants.h index 945f513b5..a29418394 100644 --- a/common/emu_constants.h +++ b/common/emu_constants.h @@ -27,7 +27,7 @@ // local definitions are the result of using hybrid-client or server-only values and methods -namespace EQEmu +namespace EQ { using RoF2::IINVALID; using RoF2::INULL; @@ -193,7 +193,7 @@ namespace EQEmu } // namespace invaug namespace constants { - const EQEmu::versions::ClientVersion CHARACTER_CREATION_CLIENT = EQEmu::versions::ClientVersion::Titanium; + const EQ::versions::ClientVersion CHARACTER_CREATION_CLIENT = EQ::versions::ClientVersion::Titanium; using RoF2::constants::EXPANSION; using RoF2::constants::EXPANSION_BIT; @@ -332,6 +332,6 @@ namespace EQEmu /* hack list to prevent circular references - eq_limits.h:EQEmu::inventory::LookupEntry::InventoryTypeSize[n]; + eq_limits.h:EQ::inventory::LookupEntry::InventoryTypeSize[n]; */ diff --git a/common/emu_oplist.h b/common/emu_oplist.h index 5078cca68..46fd564e6 100644 --- a/common/emu_oplist.h +++ b/common/emu_oplist.h @@ -136,20 +136,22 @@ N(OP_Dye), N(OP_DynamicWall), N(OP_DzAddPlayer), N(OP_DzChooseZone), +N(OP_DzChooseZoneReply), N(OP_DzCompass), N(OP_DzExpeditionEndsWarning), N(OP_DzExpeditionInfo), -N(OP_DzExpeditionList), -N(OP_DzJoinExpeditionConfirm), -N(OP_DzJoinExpeditionReply), -N(OP_DzLeaderStatus), +N(OP_DzExpeditionInvite), +N(OP_DzExpeditionInviteResponse), +N(OP_DzExpeditionLockoutTimers), N(OP_DzListTimers), N(OP_DzMakeLeader), N(OP_DzMemberList), -N(OP_DzMemberStatus), +N(OP_DzMemberListName), +N(OP_DzMemberListStatus), N(OP_DzPlayerList), N(OP_DzQuit), N(OP_DzRemovePlayer), +N(OP_DzSetLeaderName), N(OP_DzSwapPlayer), N(OP_Emote), N(OP_EndLootRequest), @@ -271,6 +273,7 @@ N(OP_ItemVerifyRequest), N(OP_ItemViewUnknown), N(OP_Jump), N(OP_KeyRing), +N(OP_KickPlayers), N(OP_KnowledgeBase), N(OP_LDoNButton), N(OP_LDoNDisarmTraps), diff --git a/common/emu_versions.cpp b/common/emu_versions.cpp index e5b3c5e70..ea8ddba73 100644 --- a/common/emu_versions.cpp +++ b/common/emu_versions.cpp @@ -21,7 +21,7 @@ #include "emu_constants.h" -bool EQEmu::versions::IsValidClientVersion(ClientVersion client_version) +bool EQ::versions::IsValidClientVersion(ClientVersion client_version) { if (client_version <= ClientVersion::Unknown || client_version > LastClientVersion) return false; @@ -29,7 +29,7 @@ bool EQEmu::versions::IsValidClientVersion(ClientVersion client_version) return true; } -EQEmu::versions::ClientVersion EQEmu::versions::ValidateClientVersion(ClientVersion client_version) +EQ::versions::ClientVersion EQ::versions::ValidateClientVersion(ClientVersion client_version) { if (client_version <= ClientVersion::Unknown || client_version > LastClientVersion) return ClientVersion::Unknown; @@ -37,7 +37,7 @@ EQEmu::versions::ClientVersion EQEmu::versions::ValidateClientVersion(ClientVers return client_version; } -const char* EQEmu::versions::ClientVersionName(ClientVersion client_version) +const char* EQ::versions::ClientVersionName(ClientVersion client_version) { switch (client_version) { case ClientVersion::Unknown: @@ -61,7 +61,7 @@ const char* EQEmu::versions::ClientVersionName(ClientVersion client_version) }; } -uint32 EQEmu::versions::ConvertClientVersionToClientVersionBit(ClientVersion client_version) +uint32 EQ::versions::ConvertClientVersionToClientVersionBit(ClientVersion client_version) { switch (client_version) { case ClientVersion::Titanium: @@ -81,7 +81,7 @@ uint32 EQEmu::versions::ConvertClientVersionToClientVersionBit(ClientVersion cli } } -EQEmu::versions::ClientVersion EQEmu::versions::ConvertClientVersionBitToClientVersion(uint32 client_version_bit) +EQ::versions::ClientVersion EQ::versions::ConvertClientVersionBitToClientVersion(uint32 client_version_bit) { switch (client_version_bit) { case ((uint32)1 << (static_cast(ClientVersion::Titanium) - 1)) : @@ -101,7 +101,7 @@ EQEmu::versions::ClientVersion EQEmu::versions::ConvertClientVersionBitToClientV } } -bool EQEmu::versions::IsValidMobVersion(MobVersion mob_version) +bool EQ::versions::IsValidMobVersion(MobVersion mob_version) { if (mob_version <= MobVersion::Unknown || mob_version > LastMobVersion) return false; @@ -109,7 +109,7 @@ bool EQEmu::versions::IsValidMobVersion(MobVersion mob_version) return true; } -bool EQEmu::versions::IsValidPCMobVersion(MobVersion mob_version) +bool EQ::versions::IsValidPCMobVersion(MobVersion mob_version) { if (mob_version <= MobVersion::Unknown || mob_version > LastPCMobVersion) return false; @@ -117,7 +117,7 @@ bool EQEmu::versions::IsValidPCMobVersion(MobVersion mob_version) return true; } -bool EQEmu::versions::IsValidNonPCMobVersion(MobVersion mob_version) +bool EQ::versions::IsValidNonPCMobVersion(MobVersion mob_version) { if (mob_version <= LastPCMobVersion || mob_version > LastNonPCMobVersion) return false; @@ -125,7 +125,7 @@ bool EQEmu::versions::IsValidNonPCMobVersion(MobVersion mob_version) return true; } -bool EQEmu::versions::IsValidOfflinePCMobVersion(MobVersion mob_version) +bool EQ::versions::IsValidOfflinePCMobVersion(MobVersion mob_version) { if (mob_version <= LastNonPCMobVersion || mob_version > LastOfflinePCMobVersion) return false; @@ -133,7 +133,7 @@ bool EQEmu::versions::IsValidOfflinePCMobVersion(MobVersion mob_version) return true; } -EQEmu::versions::MobVersion EQEmu::versions::ValidateMobVersion(MobVersion mob_version) +EQ::versions::MobVersion EQ::versions::ValidateMobVersion(MobVersion mob_version) { if (mob_version <= MobVersion::Unknown || mob_version > LastMobVersion) return MobVersion::Unknown; @@ -141,7 +141,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ValidateMobVersion(MobVersion mob_v return mob_version; } -EQEmu::versions::MobVersion EQEmu::versions::ValidatePCMobVersion(MobVersion mob_version) +EQ::versions::MobVersion EQ::versions::ValidatePCMobVersion(MobVersion mob_version) { if (mob_version <= MobVersion::Unknown || mob_version > LastPCMobVersion) return MobVersion::Unknown; @@ -149,7 +149,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ValidatePCMobVersion(MobVersion mob return mob_version; } -EQEmu::versions::MobVersion EQEmu::versions::ValidateNonPCMobVersion(MobVersion mob_version) +EQ::versions::MobVersion EQ::versions::ValidateNonPCMobVersion(MobVersion mob_version) { if (mob_version <= LastPCMobVersion || mob_version > LastNonPCMobVersion) return MobVersion::Unknown; @@ -157,7 +157,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ValidateNonPCMobVersion(MobVersion return mob_version; } -EQEmu::versions::MobVersion EQEmu::versions::ValidateOfflinePCMobVersion(MobVersion mob_version) +EQ::versions::MobVersion EQ::versions::ValidateOfflinePCMobVersion(MobVersion mob_version) { if (mob_version <= LastNonPCMobVersion || mob_version > LastOfflinePCMobVersion) return MobVersion::Unknown; @@ -165,7 +165,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ValidateOfflinePCMobVersion(MobVers return mob_version; } -const char* EQEmu::versions::MobVersionName(MobVersion mob_version) +const char* EQ::versions::MobVersionName(MobVersion mob_version) { switch (mob_version) { case MobVersion::Unknown: @@ -217,7 +217,7 @@ const char* EQEmu::versions::MobVersionName(MobVersion mob_version) }; } -EQEmu::versions::ClientVersion EQEmu::versions::ConvertMobVersionToClientVersion(MobVersion mob_version) +EQ::versions::ClientVersion EQ::versions::ConvertMobVersionToClientVersion(MobVersion mob_version) { switch (mob_version) { case MobVersion::Unknown: @@ -240,7 +240,7 @@ EQEmu::versions::ClientVersion EQEmu::versions::ConvertMobVersionToClientVersion } } -EQEmu::versions::MobVersion EQEmu::versions::ConvertClientVersionToMobVersion(ClientVersion client_version) +EQ::versions::MobVersion EQ::versions::ConvertClientVersionToMobVersion(ClientVersion client_version) { switch (client_version) { case ClientVersion::Unknown: @@ -263,7 +263,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ConvertClientVersionToMobVersion(Cl } } -EQEmu::versions::MobVersion EQEmu::versions::ConvertPCMobVersionToOfflinePCMobVersion(MobVersion mob_version) +EQ::versions::MobVersion EQ::versions::ConvertPCMobVersionToOfflinePCMobVersion(MobVersion mob_version) { switch (mob_version) { case MobVersion::Titanium: @@ -283,7 +283,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ConvertPCMobVersionToOfflinePCMobVe } } -EQEmu::versions::MobVersion EQEmu::versions::ConvertOfflinePCMobVersionToPCMobVersion(MobVersion mob_version) +EQ::versions::MobVersion EQ::versions::ConvertOfflinePCMobVersionToPCMobVersion(MobVersion mob_version) { switch (mob_version) { case MobVersion::OfflineTitanium: @@ -303,7 +303,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ConvertOfflinePCMobVersionToPCMobVe } } -EQEmu::versions::ClientVersion EQEmu::versions::ConvertOfflinePCMobVersionToClientVersion(MobVersion mob_version) +EQ::versions::ClientVersion EQ::versions::ConvertOfflinePCMobVersionToClientVersion(MobVersion mob_version) { switch (mob_version) { case MobVersion::OfflineTitanium: @@ -323,7 +323,7 @@ EQEmu::versions::ClientVersion EQEmu::versions::ConvertOfflinePCMobVersionToClie } } -EQEmu::versions::MobVersion EQEmu::versions::ConvertClientVersionToOfflinePCMobVersion(ClientVersion client_version) +EQ::versions::MobVersion EQ::versions::ConvertClientVersionToOfflinePCMobVersion(ClientVersion client_version) { switch (client_version) { case ClientVersion::Titanium: @@ -343,7 +343,7 @@ EQEmu::versions::MobVersion EQEmu::versions::ConvertClientVersionToOfflinePCMobV } } -const char* EQEmu::expansions::ExpansionName(Expansion expansion) +const char* EQ::expansions::ExpansionName(Expansion expansion) { switch (expansion) { case Expansion::EverQuest: @@ -393,12 +393,12 @@ const char* EQEmu::expansions::ExpansionName(Expansion expansion) } } -const char* EQEmu::expansions::ExpansionName(uint32 expansion_bit) +const char* EQ::expansions::ExpansionName(uint32 expansion_bit) { return ExpansionName(ConvertExpansionBitToExpansion(expansion_bit)); } -uint32 EQEmu::expansions::ConvertExpansionToExpansionBit(Expansion expansion) +uint32 EQ::expansions::ConvertExpansionToExpansionBit(Expansion expansion) { switch (expansion) { case Expansion::RoK: @@ -446,7 +446,7 @@ uint32 EQEmu::expansions::ConvertExpansionToExpansionBit(Expansion expansion) } } -EQEmu::expansions::Expansion EQEmu::expansions::ConvertExpansionBitToExpansion(uint32 expansion_bit) +EQ::expansions::Expansion EQ::expansions::ConvertExpansionBitToExpansion(uint32 expansion_bit) { switch (expansion_bit) { case bitRoK: @@ -494,7 +494,7 @@ EQEmu::expansions::Expansion EQEmu::expansions::ConvertExpansionBitToExpansion(u } } -uint32 EQEmu::expansions::ConvertExpansionToExpansionsMask(Expansion expansion) +uint32 EQ::expansions::ConvertExpansionToExpansionsMask(Expansion expansion) { switch (expansion) { case Expansion::RoK: @@ -542,17 +542,17 @@ uint32 EQEmu::expansions::ConvertExpansionToExpansionsMask(Expansion expansion) } } -EQEmu::expansions::Expansion EQEmu::expansions::ConvertClientVersionToExpansion(versions::ClientVersion client_version) +EQ::expansions::Expansion EQ::expansions::ConvertClientVersionToExpansion(versions::ClientVersion client_version) { - return EQEmu::constants::StaticLookup(client_version)->Expansion; + return EQ::constants::StaticLookup(client_version)->Expansion; } -uint32 EQEmu::expansions::ConvertClientVersionToExpansionBit(versions::ClientVersion client_version) +uint32 EQ::expansions::ConvertClientVersionToExpansionBit(versions::ClientVersion client_version) { - return EQEmu::constants::StaticLookup(client_version)->ExpansionBit; + return EQ::constants::StaticLookup(client_version)->ExpansionBit; } -uint32 EQEmu::expansions::ConvertClientVersionToExpansionsMask(versions::ClientVersion client_version) +uint32 EQ::expansions::ConvertClientVersionToExpansionsMask(versions::ClientVersion client_version) { - return EQEmu::constants::StaticLookup(client_version)->ExpansionsMask; + return EQ::constants::StaticLookup(client_version)->ExpansionsMask; } diff --git a/common/emu_versions.h b/common/emu_versions.h index b55c32267..75f6808c3 100644 --- a/common/emu_versions.h +++ b/common/emu_versions.h @@ -25,7 +25,7 @@ #include -namespace EQEmu +namespace EQ { namespace versions { enum class ClientVersion : uint32 { diff --git a/common/eq_constants.h b/common/eq_constants.h index 4cc61c0b4..a585bdd87 100644 --- a/common/eq_constants.h +++ b/common/eq_constants.h @@ -318,7 +318,7 @@ static const uint8 DamageTypeUnknown = 0xFF; ** ** (indexed by 'Skill' of SkillUseTypes) */ -static const uint8 SkillDamageTypes[EQEmu::skills::HIGHEST_SKILL + 1] = // change to _SkillServerArraySize once activated +static const uint8 SkillDamageTypes[EQ::skills::HIGHEST_SKILL + 1] = // change to _SkillServerArraySize once activated { /*1HBlunt*/ 0, /*1HSlashing*/ 1, @@ -464,4 +464,23 @@ namespace ZoneBlockedSpellTypes { const uint8 Region = 2; }; +enum class DynamicZoneType +{ + None = 0, + Expedition, + Tutorial, + Task, + Mission, // Shared Task + Quest +}; + +enum class DynamicZoneMemberStatus : uint8_t +{ + Unknown = 0, + Online, + Offline, + InDynamicZone, + LinkDead +}; + #endif /*COMMON_EQ_CONSTANTS_H*/ diff --git a/common/eq_limits.cpp b/common/eq_limits.cpp index 9f52de30d..188c8f888 100644 --- a/common/eq_limits.cpp +++ b/common/eq_limits.cpp @@ -25,7 +25,7 @@ static bool global_dictionary_init = false; -void EQEmu::InitializeDynamicLookups() { +void EQ::InitializeDynamicLookups() { if (global_dictionary_init == true) return; @@ -37,12 +37,12 @@ void EQEmu::InitializeDynamicLookups() { global_dictionary_init = true; } -static std::unique_ptr constants_dynamic_nongm_lookup_entries[EQEmu::versions::ClientVersionCount]; -static std::unique_ptr constants_dynamic_gm_lookup_entries[EQEmu::versions::ClientVersionCount]; -static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu::versions::ClientVersionCount] = +static std::unique_ptr constants_dynamic_nongm_lookup_entries[EQ::versions::ClientVersionCount]; +static std::unique_ptr constants_dynamic_gm_lookup_entries[EQ::versions::ClientVersionCount]; +static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::versions::ClientVersionCount] = { /*[ClientVersion::Unknown] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( ClientUnknown::constants::EXPANSION, ClientUnknown::constants::EXPANSION_BIT, ClientUnknown::constants::EXPANSIONS_MASK, @@ -50,7 +50,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu ClientUnknown::INULL ), /*[ClientVersion::Client62] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( Client62::constants::EXPANSION, Client62::constants::EXPANSION_BIT, Client62::constants::EXPANSIONS_MASK, @@ -58,7 +58,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu Client62::INULL ), /*[ClientVersion::Titanium] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( Titanium::constants::EXPANSION, Titanium::constants::EXPANSION_BIT, Titanium::constants::EXPANSIONS_MASK, @@ -66,7 +66,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu Titanium::constants::SAY_LINK_BODY_SIZE ), /*[ClientVersion::SoF] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( SoF::constants::EXPANSION, SoF::constants::EXPANSION_BIT, SoF::constants::EXPANSIONS_MASK, @@ -74,7 +74,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu SoF::constants::SAY_LINK_BODY_SIZE ), /*[ClientVersion::SoD] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( SoD::constants::EXPANSION, SoD::constants::EXPANSION_BIT, SoD::constants::EXPANSIONS_MASK, @@ -82,7 +82,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu SoD::constants::SAY_LINK_BODY_SIZE ), /*[ClientVersion::UF] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( UF::constants::EXPANSION, UF::constants::EXPANSION_BIT, UF::constants::EXPANSIONS_MASK, @@ -90,7 +90,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu UF::constants::SAY_LINK_BODY_SIZE ), /*[ClientVersion::RoF] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( RoF::constants::EXPANSION, RoF::constants::EXPANSION_BIT, RoF::constants::EXPANSIONS_MASK, @@ -98,7 +98,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu RoF::constants::SAY_LINK_BODY_SIZE ), /*[ClientVersion::RoF2] =*/ - EQEmu::constants::LookupEntry( + EQ::constants::LookupEntry( RoF2::constants::EXPANSION, RoF2::constants::EXPANSION_BIT, RoF2::constants::EXPANSIONS_MASK, @@ -108,7 +108,7 @@ static const EQEmu::constants::LookupEntry constants_static_lookup_entries[EQEmu }; static bool constants_dictionary_init = false; -void EQEmu::constants::InitializeDynamicLookups() { +void EQ::constants::InitializeDynamicLookups() { if (constants_dictionary_init == true) return; constants_dictionary_init = true; @@ -119,7 +119,7 @@ void EQEmu::constants::InitializeDynamicLookups() { // use static references for now } -const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicLookup(versions::ClientVersion client_version, bool gm_flag) +const EQ::constants::LookupEntry* EQ::constants::DynamicLookup(versions::ClientVersion client_version, bool gm_flag) { if (gm_flag) return DynamicGMLookup(client_version); @@ -127,7 +127,7 @@ const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicLookup(versions::C return DynamicNonGMLookup(client_version); } -const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicNonGMLookup(versions::ClientVersion client_version) +const EQ::constants::LookupEntry* EQ::constants::DynamicNonGMLookup(versions::ClientVersion client_version) { client_version = versions::ValidateClientVersion(client_version); if (constants_dynamic_nongm_lookup_entries[static_cast(client_version)]) @@ -136,7 +136,7 @@ const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicNonGMLookup(versio return &constants_static_lookup_entries[static_cast(client_version)]; } -const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicGMLookup(versions::ClientVersion client_version) +const EQ::constants::LookupEntry* EQ::constants::DynamicGMLookup(versions::ClientVersion client_version) { client_version = versions::ValidateClientVersion(client_version); if (constants_dynamic_gm_lookup_entries[static_cast(client_version)]) @@ -145,18 +145,18 @@ const EQEmu::constants::LookupEntry* EQEmu::constants::DynamicGMLookup(versions: return &constants_static_lookup_entries[static_cast(client_version)]; } -const EQEmu::constants::LookupEntry* EQEmu::constants::StaticLookup(versions::ClientVersion client_version) +const EQ::constants::LookupEntry* EQ::constants::StaticLookup(versions::ClientVersion client_version) { return &constants_static_lookup_entries[static_cast(versions::ValidateClientVersion(client_version))]; } -static std::unique_ptr inventory_dynamic_nongm_lookup_entries[EQEmu::versions::MobVersionCount]; -static std::unique_ptr inventory_dynamic_gm_lookup_entries[EQEmu::versions::MobVersionCount]; -static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu::versions::MobVersionCount] = +static std::unique_ptr inventory_dynamic_nongm_lookup_entries[EQ::versions::MobVersionCount]; +static std::unique_ptr inventory_dynamic_gm_lookup_entries[EQ::versions::MobVersionCount]; +static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::versions::MobVersionCount] = { /*[MobVersion::Unknown] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, @@ -182,8 +182,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::Client62] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( Client62::INULL, Client62::INULL, Client62::INULL, Client62::INULL, Client62::INULL, Client62::INULL, Client62::INULL, Client62::INULL, Client62::INULL, @@ -209,9 +209,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::Titanium] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, Titanium::invtype::BANK_SIZE, Titanium::invtype::SHARED_BANK_SIZE, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, Titanium::invtype::BANK_SIZE, Titanium::invtype::SHARED_BANK_SIZE, Titanium::invtype::TRADE_SIZE, Titanium::invtype::WORLD_SIZE, Titanium::invtype::LIMBO_SIZE, Titanium::invtype::TRIBUTE_SIZE, Titanium::INULL, Titanium::invtype::GUILD_TRIBUTE_SIZE, Titanium::invtype::MERCHANT_SIZE, Titanium::INULL, Titanium::invtype::CORPSE_SIZE, @@ -236,9 +236,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu Titanium::inventory::AllowOverLevelEquipment ), /*[MobVersion::SoF] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, SoF::invtype::BANK_SIZE, SoF::invtype::SHARED_BANK_SIZE, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, SoF::invtype::BANK_SIZE, SoF::invtype::SHARED_BANK_SIZE, SoF::invtype::TRADE_SIZE, SoF::invtype::WORLD_SIZE, SoF::invtype::LIMBO_SIZE, SoF::invtype::TRIBUTE_SIZE, SoF::INULL, SoF::invtype::GUILD_TRIBUTE_SIZE, SoF::invtype::MERCHANT_SIZE, SoF::INULL, SoF::invtype::CORPSE_SIZE, @@ -263,9 +263,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu SoF::inventory::AllowOverLevelEquipment ), /*[MobVersion::SoD] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, SoD::invtype::BANK_SIZE, SoD::invtype::SHARED_BANK_SIZE, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, SoD::invtype::BANK_SIZE, SoD::invtype::SHARED_BANK_SIZE, SoD::invtype::TRADE_SIZE, SoD::invtype::WORLD_SIZE, SoD::invtype::LIMBO_SIZE, SoD::invtype::TRIBUTE_SIZE, SoD::INULL, SoD::invtype::GUILD_TRIBUTE_SIZE, SoD::invtype::MERCHANT_SIZE, SoD::INULL, SoD::invtype::CORPSE_SIZE, @@ -290,9 +290,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu SoD::inventory::AllowOverLevelEquipment ), /*[MobVersion::UF] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, UF::invtype::BANK_SIZE, UF::invtype::SHARED_BANK_SIZE, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, UF::invtype::BANK_SIZE, UF::invtype::SHARED_BANK_SIZE, UF::invtype::TRADE_SIZE, UF::invtype::WORLD_SIZE, UF::invtype::LIMBO_SIZE, UF::invtype::TRIBUTE_SIZE, UF::INULL, UF::invtype::GUILD_TRIBUTE_SIZE, UF::invtype::MERCHANT_SIZE, UF::INULL, UF::invtype::CORPSE_SIZE, @@ -317,9 +317,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu UF::inventory::AllowOverLevelEquipment ), /*[MobVersion::RoF] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, RoF::invtype::BANK_SIZE, RoF::invtype::SHARED_BANK_SIZE, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, RoF::invtype::BANK_SIZE, RoF::invtype::SHARED_BANK_SIZE, RoF::invtype::TRADE_SIZE, RoF::invtype::WORLD_SIZE, RoF::invtype::LIMBO_SIZE, RoF::invtype::TRIBUTE_SIZE, RoF::invtype::TROPHY_TRIBUTE_SIZE, RoF::invtype::GUILD_TRIBUTE_SIZE, RoF::invtype::MERCHANT_SIZE, RoF::invtype::DELETED_SIZE, RoF::invtype::CORPSE_SIZE, @@ -344,9 +344,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu RoF::inventory::AllowOverLevelEquipment ), /*[MobVersion::RoF2] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, RoF2::invtype::BANK_SIZE, RoF2::invtype::SHARED_BANK_SIZE, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, RoF2::invtype::BANK_SIZE, RoF2::invtype::SHARED_BANK_SIZE, RoF2::invtype::TRADE_SIZE, RoF2::invtype::WORLD_SIZE, RoF2::invtype::LIMBO_SIZE, RoF2::invtype::TRIBUTE_SIZE, RoF2::invtype::TROPHY_TRIBUTE_SIZE, RoF2::invtype::GUILD_TRIBUTE_SIZE, RoF2::invtype::MERCHANT_SIZE, RoF2::invtype::DELETED_SIZE, RoF2::invtype::CORPSE_SIZE, @@ -371,9 +371,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu RoF2::inventory::AllowOverLevelEquipment ), /*[MobVersion::NPC] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::invtype::TRADE_SIZE, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, /*InvTypeCorpseSize,*/ @@ -389,8 +389,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -398,9 +398,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::NPCMerchant] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::invtype::TRADE_SIZE, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, /*InvTypeCorpseSize,*/ @@ -416,8 +416,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -425,9 +425,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::Merc] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::invtype::TRADE_SIZE, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, /*InvTypeCorpseSize,*/ @@ -443,8 +443,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -452,9 +452,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::Bot] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::invtype::TRADE_SIZE, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, /*InvTypeCorpseSize,*/ @@ -470,8 +470,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::Bot::invslot::CURSOR_BITMASK, EntityLimits::Bot::invslot::POSSESSIONS_BITMASK, EntityLimits::Bot::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - EQEmu::invaug::SOCKET_COUNT, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + EQ::invaug::SOCKET_COUNT, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -479,9 +479,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::ClientPet] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::invtype::TRADE_SIZE, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, /*InvTypeCorpseSize,*/ @@ -497,8 +497,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -506,9 +506,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::NPCPet] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::invtype::TRADE_SIZE, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, /*InvTypeCorpseSize,*/ @@ -524,8 +524,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -533,9 +533,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::MercPet] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::invtype::TRADE_SIZE, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, /*InvTypeCorpseSize,*/ @@ -551,8 +551,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -560,9 +560,9 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::BotPet] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( - EQEmu::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::invtype::POSSESSIONS_SIZE, /*InvTypePossessionsSize,*/ EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::invtype::TRADE_SIZE, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, /*InvTypeCorpseSize,*/ @@ -578,8 +578,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, - 0, //EQEmu::inventory::ContainerCount, /*ItemBagSize,*/ - 0, //EQEmu::inventory::SocketCount, /*ItemAugSize,*/ + 0, //EQ::inventory::ContainerCount, /*ItemBagSize,*/ + 0, //EQ::inventory::SocketCount, /*ItemAugSize,*/ false, false, @@ -587,8 +587,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::OfflineTitanium] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( Titanium::INULL, Titanium::INULL, Titanium::INULL, Titanium::invtype::TRADE_SIZE, Titanium::INULL, Titanium::INULL, Titanium::INULL, Titanium::INULL, Titanium::INULL, @@ -614,8 +614,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::OfflineSoF] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( SoF::INULL, SoF::INULL, SoF::INULL, SoF::invtype::TRADE_SIZE, SoF::INULL, SoF::INULL, SoF::INULL, SoF::INULL, SoF::INULL, @@ -641,8 +641,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::OfflineSoD] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( SoD::INULL, SoD::INULL, SoD::INULL, SoD::invtype::TRADE_SIZE, SoD::INULL, SoD::INULL, SoD::INULL, SoD::INULL, SoD::INULL, @@ -668,8 +668,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::OfflineUF] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( UF::INULL, UF::INULL, UF::INULL, UF::invtype::TRADE_SIZE, UF::INULL, UF::INULL, UF::INULL, UF::INULL, UF::INULL, @@ -695,8 +695,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::OfflineRoF] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( RoF::INULL, RoF::INULL, RoF::INULL, RoF::invtype::TRADE_SIZE, RoF::INULL, RoF::INULL, RoF::INULL, RoF::INULL, RoF::INULL, @@ -722,8 +722,8 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu false ), /*[MobVersion::OfflineRoF2] =*/ - EQEmu::inventory::LookupEntry( - EQEmu::inventory::LookupEntry::InventoryTypeSize_Struct( + EQ::inventory::LookupEntry( + EQ::inventory::LookupEntry::InventoryTypeSize_Struct( RoF2::INULL, RoF2::INULL, RoF2::INULL, RoF2::invtype::TRADE_SIZE, RoF2::INULL, RoF2::INULL, RoF2::INULL, RoF2::INULL, RoF2::INULL, @@ -751,7 +751,7 @@ static const EQEmu::inventory::LookupEntry inventory_static_lookup_entries[EQEmu }; static bool inventory_dictionary_init = false; -void EQEmu::inventory::InitializeDynamicLookups() { +void EQ::inventory::InitializeDynamicLookups() { if (inventory_dictionary_init == true) return; inventory_dictionary_init = true; @@ -774,9 +774,9 @@ void EQEmu::inventory::InitializeDynamicLookups() { const uint32 dynamic_check_mask = ( - EQEmu::expansions::bitPoR | - EQEmu::expansions::bitTBS | - EQEmu::expansions::bitHoT + EQ::expansions::bitPoR | + EQ::expansions::bitTBS | + EQ::expansions::bitHoT ); // if all of the above expansion bits are present, then static references will suffice @@ -784,7 +784,7 @@ void EQEmu::inventory::InitializeDynamicLookups() { return; // Dynamic Lookups (promotive methodology) (all mob versions allowed) - for (uint32 iter = static_cast(EQEmu::versions::MobVersion::Unknown); iter <= static_cast(EQEmu::versions::LastPCMobVersion); ++iter) { + for (uint32 iter = static_cast(EQ::versions::MobVersion::Unknown); iter <= static_cast(EQ::versions::LastPCMobVersion); ++iter) { // no need to dynamic this condition since it is the lowest compatibility standard if ((dynamic_check_mask & ~constants_static_lookup_entries[iter].ExpansionsMask) == dynamic_check_mask) continue; @@ -794,7 +794,7 @@ void EQEmu::inventory::InitializeDynamicLookups() { continue; // direct manipulation of lookup indices is safe so long as (int)ClientVersion:: == (int)MobVersion:: - inventory_dynamic_nongm_lookup_entries[iter] = std::unique_ptr(new LookupEntry(inventory_static_lookup_entries[iter])); + inventory_dynamic_nongm_lookup_entries[iter] = std::make_unique(inventory_static_lookup_entries[iter]); // clamp affected fields to the lowest standard inventory_dynamic_nongm_lookup_entries[iter]->InventoryTypeSize.Bank = Titanium::invtype::BANK_SIZE; // bank size @@ -803,21 +803,21 @@ void EQEmu::inventory::InitializeDynamicLookups() { inventory_dynamic_nongm_lookup_entries[iter]->PossessionsBitmask = 0; // we'll fix later inventory_dynamic_nongm_lookup_entries[iter]->CorpseBitmask = 0; // we'll fix later - if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitPoR) { + if (RuleI(World, ExpansionSettings) & EQ::expansions::bitPoR) { // update bank size - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitPoR) + if (constants_static_lookup_entries[iter].ExpansionsMask & EQ::expansions::bitPoR) inventory_dynamic_nongm_lookup_entries[iter]->InventoryTypeSize.Bank = SoF::invtype::BANK_SIZE; } - if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitTBS) { + if (RuleI(World, ExpansionSettings) & EQ::expansions::bitTBS) { // update power source - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitTBS) + if (constants_static_lookup_entries[iter].ExpansionsMask & EQ::expansions::bitTBS) inventory_dynamic_nongm_lookup_entries[iter]->EquipmentBitmask = SoF::invslot::EQUIPMENT_BITMASK; } - if (RuleI(World, ExpansionSettings) & EQEmu::expansions::bitHoT) { + if (RuleI(World, ExpansionSettings) & EQ::expansions::bitHoT) { // update general size - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitHoT) + if (constants_static_lookup_entries[iter].ExpansionsMask & EQ::expansions::bitHoT) inventory_dynamic_nongm_lookup_entries[iter]->GeneralBitmask = RoF::invslot::GENERAL_BITMASK; } @@ -841,7 +841,7 @@ void EQEmu::inventory::InitializeDynamicLookups() { } // Dynamic GM Lookups (demotive methodology) (client-linked mob versions only) - for (uint32 iter = static_cast(EQEmu::versions::MobVersion::Unknown); iter <= static_cast(EQEmu::versions::LastPCMobVersion); ++iter) { + for (uint32 iter = static_cast(EQ::versions::MobVersion::Unknown); iter <= static_cast(EQ::versions::LastPCMobVersion); ++iter) { // no need to dynamic this condition since it is the lowest compatibility standard if ((dynamic_check_mask & ~constants_static_lookup_entries[iter].ExpansionsMask) == dynamic_check_mask) continue; @@ -864,18 +864,18 @@ void EQEmu::inventory::InitializeDynamicLookups() { } // direct manipulation of lookup indices is safe so long as (int)ClientVersion:: == (int)MobVersion:: - inventory_dynamic_gm_lookup_entries[iter] = std::unique_ptr(new LookupEntry(inventory_static_lookup_entries[iter])); + inventory_dynamic_gm_lookup_entries[iter] = std::make_unique(inventory_static_lookup_entries[iter]); inventory_dynamic_gm_lookup_entries[iter]->PossessionsBitmask = 0; // we'll fix later inventory_dynamic_gm_lookup_entries[iter]->CorpseBitmask = 0; // we'll fix later - if (~RuleI(World, ExpansionSettings) & EQEmu::expansions::bitPoR) { + if (~RuleI(World, ExpansionSettings) & EQ::expansions::bitPoR) { // update bank size - if (constants_static_lookup_entries[iter].ExpansionsMask & EQEmu::expansions::bitPoR) + if (constants_static_lookup_entries[iter].ExpansionsMask & EQ::expansions::bitPoR) inventory_dynamic_gm_lookup_entries[iter]->InventoryTypeSize.Bank = Titanium::invtype::BANK_SIZE; } - if (~RuleI(World, ExpansionSettings) & EQEmu::expansions::bitTBS) { + if (~RuleI(World, ExpansionSettings) & EQ::expansions::bitTBS) { // update power source switch (iter) { case versions::bitUF: @@ -890,7 +890,7 @@ void EQEmu::inventory::InitializeDynamicLookups() { } } - if (~RuleI(World, ExpansionSettings) & EQEmu::expansions::bitHoT) { + if (~RuleI(World, ExpansionSettings) & EQ::expansions::bitHoT) { // update general size switch (iter) { case versions::bitUF: @@ -927,7 +927,7 @@ void EQEmu::inventory::InitializeDynamicLookups() { // only client versions that require a change from their static definitions have been given a dynamic (gm) lookup entry } -const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicLookup(versions::MobVersion mob_version, bool gm_flag) +const EQ::inventory::LookupEntry* EQ::inventory::DynamicLookup(versions::MobVersion mob_version, bool gm_flag) { if (gm_flag) return DynamicGMLookup(mob_version); @@ -935,7 +935,7 @@ const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicLookup(versions::M return DynamicNonGMLookup(mob_version); } -const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicNonGMLookup(versions::MobVersion mob_version) +const EQ::inventory::LookupEntry* EQ::inventory::DynamicNonGMLookup(versions::MobVersion mob_version) { mob_version = versions::ValidateMobVersion(mob_version); if (inventory_dynamic_nongm_lookup_entries[static_cast(mob_version)]) @@ -944,7 +944,7 @@ const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicNonGMLookup(versio return &inventory_static_lookup_entries[static_cast(mob_version)]; } -const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicGMLookup(versions::MobVersion mob_version) +const EQ::inventory::LookupEntry* EQ::inventory::DynamicGMLookup(versions::MobVersion mob_version) { mob_version = versions::ValidateMobVersion(mob_version); if (inventory_dynamic_gm_lookup_entries[static_cast(mob_version)]) @@ -953,107 +953,107 @@ const EQEmu::inventory::LookupEntry* EQEmu::inventory::DynamicGMLookup(versions: return &inventory_static_lookup_entries[static_cast(mob_version)]; } -const EQEmu::inventory::LookupEntry* EQEmu::inventory::StaticLookup(versions::MobVersion mob_version) +const EQ::inventory::LookupEntry* EQ::inventory::StaticLookup(versions::MobVersion mob_version) { return &inventory_static_lookup_entries[static_cast(versions::ValidateMobVersion(mob_version))]; } -static std::unique_ptr behavior_dynamic_nongm_lookup_entries[EQEmu::versions::MobVersionCount]; -static std::unique_ptr behavior_dynamic_gm_lookup_entries[EQEmu::versions::MobVersionCount]; -static const EQEmu::behavior::LookupEntry behavior_static_lookup_entries[EQEmu::versions::MobVersionCount] = +static std::unique_ptr behavior_dynamic_nongm_lookup_entries[EQ::versions::MobVersionCount]; +static std::unique_ptr behavior_dynamic_gm_lookup_entries[EQ::versions::MobVersionCount]; +static const EQ::behavior::LookupEntry behavior_static_lookup_entries[EQ::versions::MobVersionCount] = { /*[MobVersion::Unknown] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( true ), /*[MobVersion::Client62] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( true ), /*[MobVersion::Titanium] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( Titanium::behavior::CoinHasWeight ), /*[MobVersion::SoF] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( SoF::behavior::CoinHasWeight ), /*[MobVersion::SoD] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( SoD::behavior::CoinHasWeight ), /*[MobVersion::UF] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( UF::behavior::CoinHasWeight ), /*[MobVersion::RoF] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( RoF::behavior::CoinHasWeight ), /*[MobVersion::RoF2] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( RoF2::behavior::CoinHasWeight ), /*[MobVersion::NPC] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::NPCMerchant] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::Merc] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::Bot] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::ClientPet] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::NPCPet] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::MercPet] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::BotPet] =*/ - EQEmu::behavior::LookupEntry( - EQEmu::behavior::CoinHasWeight + EQ::behavior::LookupEntry( + EQ::behavior::CoinHasWeight ), /*[MobVersion::OfflineTitanium] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( Titanium::behavior::CoinHasWeight ), /*[MobVersion::OfflineSoF] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( SoF::behavior::CoinHasWeight ), /*[MobVersion::OfflineSoD] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( SoD::behavior::CoinHasWeight ), /*[MobVersion::OfflineUF] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( UF::behavior::CoinHasWeight ), /*[MobVersion::OfflineRoF] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( RoF::behavior::CoinHasWeight ), /*[MobVersion::OfflineRoF2] =*/ - EQEmu::behavior::LookupEntry( + EQ::behavior::LookupEntry( RoF2::behavior::CoinHasWeight ) }; static bool behavior_dictionary_init = false; -void EQEmu::behavior::InitializeDynamicLookups() { +void EQ::behavior::InitializeDynamicLookups() { if (behavior_dictionary_init == true) return; behavior_dictionary_init = true; @@ -1064,7 +1064,7 @@ void EQEmu::behavior::InitializeDynamicLookups() { // use static references for now } -const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicLookup(versions::MobVersion mob_version, bool gm_flag) +const EQ::behavior::LookupEntry* EQ::behavior::DynamicLookup(versions::MobVersion mob_version, bool gm_flag) { if (gm_flag) return DynamicGMLookup(mob_version); @@ -1072,7 +1072,7 @@ const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicLookup(versions::Mob return DynamicNonGMLookup(mob_version); } -const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicNonGMLookup(versions::MobVersion mob_version) +const EQ::behavior::LookupEntry* EQ::behavior::DynamicNonGMLookup(versions::MobVersion mob_version) { mob_version = versions::ValidateMobVersion(mob_version); if (behavior_dynamic_nongm_lookup_entries[static_cast(mob_version)]) @@ -1081,7 +1081,7 @@ const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicNonGMLookup(versions return &behavior_static_lookup_entries[static_cast(mob_version)]; } -const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicGMLookup(versions::MobVersion mob_version) +const EQ::behavior::LookupEntry* EQ::behavior::DynamicGMLookup(versions::MobVersion mob_version) { mob_version = versions::ValidateMobVersion(mob_version); if (behavior_dynamic_gm_lookup_entries[static_cast(mob_version)]) @@ -1090,17 +1090,17 @@ const EQEmu::behavior::LookupEntry* EQEmu::behavior::DynamicGMLookup(versions::M return &behavior_static_lookup_entries[static_cast(mob_version)]; } -const EQEmu::behavior::LookupEntry* EQEmu::behavior::StaticLookup(versions::MobVersion mob_version) +const EQ::behavior::LookupEntry* EQ::behavior::StaticLookup(versions::MobVersion mob_version) { return &behavior_static_lookup_entries[static_cast(versions::ValidateMobVersion(mob_version))]; } -static std::unique_ptr spells_dynamic_nongm_lookup_entries[EQEmu::versions::ClientVersionCount]; -static std::unique_ptr spells_dynamic_gm_lookup_entries[EQEmu::versions::ClientVersionCount]; -static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::versions::ClientVersionCount] = +static std::unique_ptr spells_dynamic_nongm_lookup_entries[EQ::versions::ClientVersionCount]; +static std::unique_ptr spells_dynamic_gm_lookup_entries[EQ::versions::ClientVersionCount]; +static const EQ::spells::LookupEntry spells_static_lookup_entries[EQ::versions::ClientVersionCount] = { /*[ClientVersion::Unknown] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL, @@ -1113,7 +1113,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers ClientUnknown::INULL ), /*[ClientVersion::Client62] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( Client62::INULL, Client62::INULL, Client62::INULL, @@ -1126,7 +1126,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers Client62::INULL ), /*[ClientVersion::Titanium] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( Titanium::spells::SPELL_ID_MAX, Titanium::spells::SPELLBOOK_SIZE, Titanium::spells::SPELL_GEM_COUNT, @@ -1139,7 +1139,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers Titanium::spells::MERC_BUFFS ), /*[ClientVersion::SoF] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( SoF::spells::SPELL_ID_MAX, SoF::spells::SPELLBOOK_SIZE, SoF::spells::SPELL_GEM_COUNT, @@ -1152,7 +1152,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers SoF::spells::MERC_BUFFS ), /*[ClientVersion::SoD] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( SoD::spells::SPELL_ID_MAX, SoD::spells::SPELLBOOK_SIZE, SoD::spells::SPELL_GEM_COUNT, @@ -1165,7 +1165,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers SoD::spells::MERC_BUFFS ), /*[ClientVersion::UF] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( UF::spells::SPELL_ID_MAX, UF::spells::SPELLBOOK_SIZE, UF::spells::SPELL_GEM_COUNT, @@ -1178,7 +1178,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers UF::spells::MERC_BUFFS ), /*[ClientVersion::RoF] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( RoF::spells::SPELL_ID_MAX, RoF::spells::SPELLBOOK_SIZE, UF::spells::SPELL_GEM_COUNT, // client translators are setup to allow the max value a client supports..however, the top 4 indices are not valid in this case @@ -1191,7 +1191,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers RoF::spells::MERC_BUFFS ), /*[ClientVersion::RoF2] =*/ - EQEmu::spells::LookupEntry( + EQ::spells::LookupEntry( RoF2::spells::SPELL_ID_MAX, RoF2::spells::SPELLBOOK_SIZE, UF::spells::SPELL_GEM_COUNT, // client translators are setup to allow the max value a client supports..however, the top 4 indices are not valid in this case @@ -1206,7 +1206,7 @@ static const EQEmu::spells::LookupEntry spells_static_lookup_entries[EQEmu::vers }; static bool spells_dictionary_init = false; -void EQEmu::spells::InitializeDynamicLookups() { +void EQ::spells::InitializeDynamicLookups() { if (spells_dictionary_init == true) return; spells_dictionary_init = true; @@ -1217,7 +1217,7 @@ void EQEmu::spells::InitializeDynamicLookups() { // use static references for now } -const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicLookup(versions::ClientVersion client_version, bool gm_flag) +const EQ::spells::LookupEntry* EQ::spells::DynamicLookup(versions::ClientVersion client_version, bool gm_flag) { if (gm_flag) return DynamicGMLookup(client_version); @@ -1225,7 +1225,7 @@ const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicLookup(versions::ClientV return DynamicNonGMLookup(client_version); } -const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicNonGMLookup(versions::ClientVersion client_version) +const EQ::spells::LookupEntry* EQ::spells::DynamicNonGMLookup(versions::ClientVersion client_version) { client_version = versions::ValidateClientVersion(client_version); if (spells_dynamic_nongm_lookup_entries[static_cast(client_version)]) @@ -1234,7 +1234,7 @@ const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicNonGMLookup(versions::Cl return &spells_static_lookup_entries[static_cast(client_version)]; } -const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicGMLookup(versions::ClientVersion client_version) +const EQ::spells::LookupEntry* EQ::spells::DynamicGMLookup(versions::ClientVersion client_version) { client_version = versions::ValidateClientVersion(client_version); if (spells_dynamic_gm_lookup_entries[static_cast(client_version)]) @@ -1243,7 +1243,7 @@ const EQEmu::spells::LookupEntry* EQEmu::spells::DynamicGMLookup(versions::Clien return &spells_static_lookup_entries[static_cast(client_version)]; } -const EQEmu::spells::LookupEntry* EQEmu::spells::StaticLookup(versions::ClientVersion client_version) +const EQ::spells::LookupEntry* EQ::spells::StaticLookup(versions::ClientVersion client_version) { return &spells_static_lookup_entries[static_cast(versions::ValidateClientVersion(client_version))]; } diff --git a/common/eq_limits.h b/common/eq_limits.h index 5d62ced66..fe944c816 100644 --- a/common/eq_limits.h +++ b/common/eq_limits.h @@ -31,13 +31,13 @@ #include "../common/patches/rof2_limits.h" -namespace EQEmu +namespace EQ { void InitializeDynamicLookups(); namespace constants { struct LookupEntry { - EQEmu::expansions::Expansion Expansion; + EQ::expansions::Expansion Expansion; uint32 ExpansionBit; uint32 ExpansionsMask; int16 CharacterCreationLimit; @@ -45,7 +45,7 @@ namespace EQEmu LookupEntry(const LookupEntry *lookup_entry) { } LookupEntry( - EQEmu::expansions::Expansion Expansion, + EQ::expansions::Expansion Expansion, uint32 ExpansionBit, uint32 ExpansionsMask, int16 CharacterCreationLimit, @@ -111,7 +111,7 @@ namespace EQEmu union { InventoryTypeSize_Struct InventoryTypeSize; - int16 InventoryTypeSizeArray[25]; // should reflect EQEmu::invtype::TYPE_COUNT referenced in emu_constants.h + int16 InventoryTypeSizeArray[25]; // should reflect EQ::invtype::TYPE_COUNT referenced in emu_constants.h }; uint64 EquipmentBitmask; @@ -244,9 +244,9 @@ namespace ClientUnknown const int16 INULL = 0; namespace constants { - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::EverQuest; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitEverQuest; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskEverQuest; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::EverQuest; + const uint32 EXPANSION_BIT = EQ::expansions::bitEverQuest; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskEverQuest; } // namespace constants @@ -258,9 +258,9 @@ namespace Client62 const int16 INULL = 0; namespace constants { - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::EverQuest; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitEverQuest; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskEverQuest; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::EverQuest; + const uint32 EXPANSION_BIT = EQ::expansions::bitEverQuest; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskEverQuest; } // namespace constants diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index e9e7c5ef3..f5d47546e 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -129,7 +129,7 @@ struct LDoNTrapTemplate // All clients translate the character select information to some degree -struct CharSelectEquip : EQEmu::textures::Texture_Struct, EQEmu::textures::Tint_Struct {}; +struct CharSelectEquip : EQ::textures::Texture_Struct, EQ::textures::Tint_Struct {}; // RoF2-based hybrid struct struct CharacterSelectEntry_Struct @@ -144,7 +144,7 @@ struct CharacterSelectEntry_Struct uint16 Instance; uint8 Gender; uint8 Face; - CharSelectEquip Equip[EQEmu::textures::materialCount]; + CharSelectEquip Equip[EQ::textures::materialCount]; uint8 Unknown15; // Seen FF uint8 Unknown19; // Seen FF uint32 DrakkinTattoo; @@ -253,7 +253,7 @@ struct Spawn_Struct { /*0189*/ uint32 petOwnerId; // If this is a pet, the spawn id of owner /*0193*/ uint8 guildrank; // 0=normal, 1=officer, 2=leader /*0194*/ uint8 unknown0194[3]; -/*0197*/ EQEmu::TextureProfile equipment; +/*0197*/ EQ::TextureProfile equipment; /*0233*/ float runspeed; // Speed when running /*0036*/ uint8 afk; // 0=no, 1=afk /*0238*/ uint32 guildID; // Current guild @@ -284,7 +284,7 @@ union /*0340*/ uint32 spawnId; // Spawn Id /*0344*/ float bounding_radius; // used in melee, overrides calc /*0347*/ uint8 IsMercenary; -/*0348*/ EQEmu::TintProfile equipment_tint; +/*0348*/ EQ::TintProfile equipment_tint; /*0384*/ uint8 lfg; // 0=off, 1=lfg on /*0385*/ @@ -375,13 +375,16 @@ struct NewZone_Struct { /*0686*/ uint16 zone_instance; /*0688*/ uint32 unknown688; /*0692*/ uint8 unknown692[8]; +// Titanium doesn't have a translator, but we can still safely add stuff under here without issues since client memcpy's only what it knows +// Just wastes some bandwidth sending to tit clients /shrug /*0700*/ float fog_density; /*0704*/ uint32 SuspendBuffs; /*0708*/ uint32 FastRegenHP; /*0712*/ uint32 FastRegenMana; /*0716*/ uint32 FastRegenEndurance; /*0720*/ uint32 NPCAggroMaxDist; -/*0724*/ +/*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*/ }; /* @@ -736,7 +739,7 @@ struct BandolierItem_Struct struct Bandolier_Struct { char Name[32]; - BandolierItem_Struct Items[EQEmu::profile::BANDOLIER_ITEM_COUNT]; + BandolierItem_Struct Items[EQ::profile::BANDOLIER_ITEM_COUNT]; }; //len = 72 @@ -750,7 +753,7 @@ struct PotionBeltItem_Struct //len = 288 struct PotionBelt_Struct { - PotionBeltItem_Struct Items[EQEmu::profile::POTION_BELT_SIZE]; + PotionBeltItem_Struct Items[EQ::profile::POTION_BELT_SIZE]; }; struct MovePotionToBelt_Struct @@ -826,7 +829,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -841,7 +844,7 @@ struct SuspendedMinion_Struct /*002*/ uint32 HP; /*006*/ uint32 Mana; /*010*/ SpellBuff_Struct Buffs[BUFF_COUNT]; - /*510*/ EQEmu::TextureMaterialProfile Items; + /*510*/ EQ::TextureMaterialProfile Items; /*546*/ char Name[64]; /*610*/ }; @@ -933,7 +936,7 @@ struct PlayerProfile_Struct /*0245*/ uint8 guildbanker; /*0246*/ uint8 unknown0246[6]; // /*0252*/ uint32 intoxication; -/*0256*/ uint32 spellSlotRefresh[EQEmu::spells::SPELL_GEM_COUNT]; //in ms +/*0256*/ uint32 spellSlotRefresh[EQ::spells::SPELL_GEM_COUNT]; //in ms /*0292*/ uint32 abilitySlotRefresh; /*0296*/ uint8 haircolor; // Player hair color /*0297*/ uint8 beardcolor; // Player beard color @@ -946,9 +949,9 @@ struct PlayerProfile_Struct /*0304*/ uint8 ability_time_minutes; /*0305*/ uint8 ability_time_hours; //place holder /*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag? -/*0312*/ EQEmu::TextureMaterialProfile item_material; // Item texture/material of worn/held items +/*0312*/ EQ::TextureMaterialProfile item_material; // Item texture/material of worn/held items /*0348*/ uint8 unknown0348[44]; -/*0392*/ EQEmu::TintProfile item_tint; +/*0392*/ EQ::TintProfile item_tint; /*0428*/ AA_Array aa_array[MAX_PP_AA_ARRAY]; /*2348*/ float unknown2384; //seen ~128, ~47 /*2352*/ char servername[32]; // length probably not right @@ -972,9 +975,9 @@ struct PlayerProfile_Struct /*2505*/ uint8 unknown2541[47]; // ? /*2552*/ uint8 languages[MAX_PP_LANGUAGE]; /*2580*/ uint8 unknown2616[4]; -/*2584*/ uint32 spell_book[EQEmu::spells::SPELLBOOK_SIZE]; +/*2584*/ uint32 spell_book[EQ::spells::SPELLBOOK_SIZE]; /*4504*/ uint8 unknown4540[128]; // Was [428] all 0xff -/*4632*/ uint32 mem_spells[EQEmu::spells::SPELL_GEM_COUNT]; +/*4632*/ uint32 mem_spells[EQ::spells::SPELL_GEM_COUNT]; /*4668*/ uint8 unknown4704[32]; // /*4700*/ float y; // Player y position /*4704*/ float x; // Player x position @@ -1050,7 +1053,7 @@ struct PlayerProfile_Struct /*7212*/ uint32 tribute_points; /*7216*/ uint32 unknown7252; /*7220*/ uint32 tribute_active; //1=active -/*7224*/ Tribute_Struct tributes[EQEmu::invtype::TRIBUTE_SIZE]; +/*7224*/ Tribute_Struct tributes[EQ::invtype::TRIBUTE_SIZE]; /*7264*/ Disciplines_Struct disciplines; /*7664*/ uint32 recastTimers[MAX_RECAST_TYPES]; // Timers (GMT of last use) /*7744*/ char unknown7780[160]; @@ -1077,7 +1080,7 @@ struct PlayerProfile_Struct /*12800*/ uint32 expAA; /*12804*/ uint32 aapoints; //avaliable, unspent /*12808*/ uint8 unknown12844[36]; -/*12844*/ Bandolier_Struct bandoliers[EQEmu::profile::BANDOLIERS_SIZE]; +/*12844*/ Bandolier_Struct bandoliers[EQ::profile::BANDOLIERS_SIZE]; /*14124*/ uint8 unknown14160[4506]; /*18630*/ SuspendedMinion_Struct SuspendedMinion; // No longer in use /*19240*/ uint32 timeentitledonaccount; @@ -1095,16 +1098,16 @@ struct PlayerProfile_Struct /*19568*/ // All player profile packets are translated and this overhead is ignored in out-bound packets - PlayerProfile_Struct() : m_player_profile_version(EQEmu::versions::MobVersion::Unknown) { } + PlayerProfile_Struct() : m_player_profile_version(EQ::versions::MobVersion::Unknown) { } - EQEmu::versions::MobVersion PlayerProfileVersion() { return m_player_profile_version; } - void SetPlayerProfileVersion(EQEmu::versions::MobVersion mob_version) { m_player_profile_version = EQEmu::versions::ValidateMobVersion(mob_version); } - void SetPlayerProfileVersion(EQEmu::versions::ClientVersion client_version) { SetPlayerProfileVersion(EQEmu::versions::ConvertClientVersionToMobVersion(client_version)); } + EQ::versions::MobVersion PlayerProfileVersion() { return m_player_profile_version; } + void SetPlayerProfileVersion(EQ::versions::MobVersion mob_version) { m_player_profile_version = EQ::versions::ValidateMobVersion(mob_version); } + void SetPlayerProfileVersion(EQ::versions::ClientVersion client_version) { SetPlayerProfileVersion(EQ::versions::ConvertClientVersionToMobVersion(client_version)); } private: // No need for gm flag since pp already has one // No need for lookup pointer since this struct is not tied to any one system - EQEmu::versions::MobVersion m_player_profile_version; + EQ::versions::MobVersion m_player_profile_version; }; @@ -1215,7 +1218,7 @@ struct WearChange_Struct { /*010*/ uint32 elite_material; // 1 for Drakkin Elite Material /*014*/ uint32 hero_forge_model; // New to VoA /*018*/ uint32 unknown18; // New to RoF -/*022*/ EQEmu::textures::Tint_Struct color; +/*022*/ EQ::textures::Tint_Struct color; /*026*/ uint8 wear_slot_id; /*027*/ }; @@ -1769,7 +1772,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -2123,7 +2126,7 @@ struct AdventureLeaderboard_Struct /*struct Item_Shop_Struct { uint16 merchantid; uint8 itemtype; - EQEmu::ItemData item; + EQ::ItemData item; uint8 iss_unknown001[6]; };*/ @@ -2149,7 +2152,7 @@ struct Illusion_Struct { //size: 256 - SoF /*092*/ uint32 drakkin_heritage; // /*096*/ uint32 drakkin_tattoo; // /*100*/ uint32 drakkin_details; // -/*104*/ EQEmu::TintProfile armor_tint; // +/*104*/ EQ::TintProfile armor_tint; // /*140*/ uint8 eyecolor1; // Field Not Identified in any Illusion Struct /*141*/ uint8 eyecolor2; // Field Not Identified in any Illusion Struct /*142*/ uint8 unknown138[114]; // @@ -3244,7 +3247,7 @@ struct TraderClick_Struct{ }; struct FormattedMessage_Struct{ - uint32 unknown0; + uint32 unknown0; // 1 means from world server uint32 string_id; uint32 type; char message[0]; @@ -3252,7 +3255,7 @@ struct FormattedMessage_Struct{ struct SimpleMessage_Struct{ uint32 string_id; uint32 color; - uint32 unknown8; + uint32 unknown8; // 1 means from world server }; struct GuildMemberUpdate_Struct { @@ -3489,8 +3492,8 @@ struct SelectTributeReply_Struct { struct TributeInfo_Struct { uint32 active; //0 == inactive, 1 == active - uint32 tributes[EQEmu::invtype::TRIBUTE_SIZE]; //-1 == NONE - uint32 tiers[EQEmu::invtype::TRIBUTE_SIZE]; //all 00's + uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE + uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's uint32 tribute_master_id; }; @@ -4401,7 +4404,7 @@ struct AnnoyingZoneUnknown_Struct { }; struct LoadSpellSet_Struct { - uint32 spell[EQEmu::spells::SPELL_GEM_COUNT]; // 0xFFFFFFFF if no action, slot number if to unmem starting at 0 + uint32 spell[EQ::spells::SPELL_GEM_COUNT]; // 0xFFFFFFFF if no action, slot number if to unmem starting at 0 uint32 unknown; //there seems to be an extra field in this packet... }; @@ -4832,17 +4835,99 @@ struct BuffIcon_Struct BuffIconEntry_Struct entries[0]; }; -struct ExpeditionInfo_Struct +struct ExpeditionInvite_Struct { -/*000*/ uint32 max_players; -/*004*/ char expedition_name[128]; -/*132*/ char leader_name[64]; +/*000*/ uint32 client_id; // unique character id +/*004*/ uint32 unknown004; // added after titanium +/*008*/ char inviter_name[64]; +/*072*/ char expedition_name[128]; +/*200*/ uint8 swapping; // 0: adding 1: swapping +/*201*/ char swap_name[64]; // if swapping, swap name being removed +/*265*/ uint8 padding[3]; +/*268*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*270*/ uint16 dz_instance_id; }; -struct ExpeditionJoinPrompt_Struct +struct ExpeditionInviteResponse_Struct { -/*000*/ char player_name[64]; -/*064*/ char expedition_name[64]; +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; // added after titanium +/*008*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*010*/ uint16 dz_instance_id; +/*012*/ uint8 accepted; // 0: declined 1: accepted +/*013*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*014*/ char swap_name[64]; // swap name sent in invite +/*078*/ uint8 unknown078; // padding garbage? +/*079*/ uint8 unknown079; // padding garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; // added after titanium +/*008*/ uint32 assigned; // padded bool, 0: clear info, 1: fill window info +/*012*/ uint32 max_players; +/*016*/ char dz_name[128]; +/*144*/ char leader_name[64]; +//*208*/ uint32 dz_type; // only in newer clients, if not 1 (expedition type) window does not auto show when dz info assigned +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[64]; // variable length, null terminated, max 0x40 (64) +/*064*/ uint8 online_status; // 0: unknown, 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*012*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[128]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[256]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char add_player_name[64]; // swap to (player must confirm) +/*072*/ char rem_player_name[64]; // swap from }; struct ExpeditionExpireWarning @@ -4850,48 +4935,67 @@ struct ExpeditionExpireWarning /*008*/ uint32 minutes_remaining; }; -struct ExpeditionCompassEntry_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 enabled; //guess -/*004*/ float y; -/*008*/ float x; -/*012*/ float z; +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) +/*008*/ uint32 unknown008; +/*012*/ float y; +/*016*/ float x; +/*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { +/*000*/ uint32 client_id; /*000*/ uint32 count; -/*004*/ ExpeditionCompassEntry_Struct entries[0]; +/*004*/ DynamicZoneCompassEntry_Struct entries[0]; }; -struct ExpeditionMemberEntry_Struct +struct DynamicZoneChooseZoneEntry_Struct { - char name[64]; - char status; +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // seen 28 00 00 00 (40), sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[128]; // variable length, null terminated +/*144*/ char leader_name[64]; // variable length, null terminated }; -struct ExpeditionMemberList_Struct +struct DynamicZoneChooseZone_Struct { -/*000*/ uint32 count; -/*004*/ ExpeditionMemberEntry_Struct entries[0]; +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; }; -struct ExpeditionLockoutEntry_Struct +struct DynamicZoneChooseZoneReply_Struct { -/*000*/ uint32 time_left; -/*004*/ char expedition[128]; -/*132*/ char expedition_event[128]; +/*000*/ uint32 unknown000; // ff ff ff ff +/*004*/ uint32 unknown004; // seen 69 00 00 00 +/*008*/ uint32 unknown008; // ff ff ff ff +/*012*/ uint32 unknown_id1; // from choose zone entry message +/*016*/ uint16 dz_zone_id; // dz_id pair +/*018*/ uint16 dz_instance_id; +/*020*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*024*/ uint32 unknown_id2; // from choose zone entry message +/*028*/ uint32 unknown028; // 00 00 00 00 +/*032*/ uint32 unknown032; // always same as unknown044 +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; +/*044*/ uint32 unknown044; // always same as unknown032 +/*048*/ uint32 unknown048; // seen 01 00 00 00 and 02 00 00 00 }; -struct ExpeditionLockoutList_Struct +struct KickPlayers_Struct { -/*000*/ uint32 count; -/*004*/ ExpeditionLockoutEntry_Struct entries[0]; -}; - -struct ExpeditionLeaderSet_Struct -{ -/*000*/ char leader_name[64]; +/*000*/ char char_name[64]; +/*064*/ uint32 unknown064; // always 0 +/*068*/ uint8 kick_expedition; // true if /kickplayers exp +/*069*/ uint8 kick_task; // true if /kickplayers task +/*070*/ uint8 padding[2]; }; struct CorpseDrag_Struct @@ -5341,18 +5445,20 @@ struct MercenaryMerchantResponse_Struct { 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; - uint8 attuned; - uint8 min_level; - uint8 max_level; + 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; + uint8 attuned; + 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: diff --git a/common/eq_stream_intf.h b/common/eq_stream_intf.h index 68a25f41c..b2c889244 100644 --- a/common/eq_stream_intf.h +++ b/common/eq_stream_intf.h @@ -100,7 +100,7 @@ public: virtual MatchState CheckSignature(const Signature *sig) { return MatchFailed; } virtual EQStreamState GetState() = 0; virtual void SetOpcodeManager(OpcodeManager **opm) = 0; - virtual const EQEmu::versions::ClientVersion ClientVersion() const { return EQEmu::versions::ClientVersion::Unknown; } + virtual const EQ::versions::ClientVersion ClientVersion() const { return EQ::versions::ClientVersion::Unknown; } virtual Stats GetStats() const = 0; virtual void ResetStats() = 0; virtual EQStreamManagerInterface* GetManager() const = 0; diff --git a/common/eq_stream_proxy.cpp b/common/eq_stream_proxy.cpp index 587e55b64..ca8cb2142 100644 --- a/common/eq_stream_proxy.cpp +++ b/common/eq_stream_proxy.cpp @@ -22,7 +22,7 @@ std::string EQStreamProxy::Describe() const { return(m_structs->Describe()); } -const EQEmu::versions::ClientVersion EQStreamProxy::ClientVersion() const +const EQ::versions::ClientVersion EQStreamProxy::ClientVersion() const { return m_structs->ClientVersion(); } diff --git a/common/eq_stream_proxy.h b/common/eq_stream_proxy.h index 92de5a463..9d007b48e 100644 --- a/common/eq_stream_proxy.h +++ b/common/eq_stream_proxy.h @@ -28,7 +28,7 @@ public: virtual void RemoveData(); virtual bool CheckState(EQStreamState state); virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; virtual EQStreamState GetState(); virtual void SetOpcodeManager(OpcodeManager **opm); virtual Stats GetStats() const; diff --git a/common/eqemu_exception.cpp b/common/eqemu_exception.cpp index 88e1ea225..62376283f 100644 --- a/common/eqemu_exception.cpp +++ b/common/eqemu_exception.cpp @@ -18,7 +18,7 @@ #include "eqemu_exception.h" -namespace EQEmu +namespace EQ { Exception::Exception(const char* name, const std::string& description, const char* file, long line) : line_(line), diff --git a/common/eqemu_exception.h b/common/eqemu_exception.h index 1e888da85..9649c7a98 100644 --- a/common/eqemu_exception.h +++ b/common/eqemu_exception.h @@ -22,7 +22,7 @@ #include #include -namespace EQEmu +namespace EQ { //! EQEmu Exception Class /*! @@ -104,7 +104,7 @@ namespace EQEmu } // EQEmu #ifndef EQ_EXCEPT -#define EQ_EXCEPT(n, d) throw EQEmu::Exception(n, d, __FILE__, __LINE__) +#define EQ_EXCEPT(n, d) throw EQ::Exception(n, d, __FILE__, __LINE__) #endif #endif diff --git a/common/eqemu_logsys.cpp b/common/eqemu_logsys.cpp index dca47dfb8..ad43ee61d 100644 --- a/common/eqemu_logsys.cpp +++ b/common/eqemu_logsys.cpp @@ -126,6 +126,8 @@ void EQEmuLogSys::LoadLogSettingsDefaults() log_settings[Logs::NPCScaling].log_to_gmsay = static_cast(Logs::General); log_settings[Logs::HotReload].log_to_gmsay = static_cast(Logs::General); log_settings[Logs::HotReload].log_to_console = static_cast(Logs::General); + log_settings[Logs::Loot].log_to_gmsay = static_cast(Logs::General); + log_settings[Logs::Scheduler].log_to_console = static_cast(Logs::General); /** * RFC 5424 @@ -205,11 +207,7 @@ std::string EQEmuLogSys::FormatOutMessageString( const std::string &in_message ) { - std::string return_string; - - if (IsRfc5424LogCategory(log_category)) { - return_string = "[" + GetPlatformName() + "] "; - } + std::string return_string = "[" + GetPlatformName() + "] "; return return_string + "[" + Logs::LogCategoryName[log_category] + "] " + in_message; } diff --git a/common/eqemu_logsys.h b/common/eqemu_logsys.h index 51ec48bfc..0b33b55a3 100644 --- a/common/eqemu_logsys.h +++ b/common/eqemu_logsys.h @@ -116,6 +116,11 @@ namespace Logs { Aura, HotReload, Merchants, + ZonePoints, + Loot, + Expeditions, + DynamicZones, + Scheduler, MaxCategoryID /* Don't Remove this */ }; @@ -191,6 +196,11 @@ namespace Logs { "Aura", "HotReload", "Merchants", + "ZonePoints", + "Loot", + "Expeditions", + "DynamicZones", + "Scheduler", }; } diff --git a/common/eqemu_logsys_log_aliases.h b/common/eqemu_logsys_log_aliases.h index 42f973e79..ddd27335f 100644 --- a/common/eqemu_logsys_log_aliases.h +++ b/common/eqemu_logsys_log_aliases.h @@ -161,6 +161,16 @@ OutF(LogSys, Logs::Detail, Logs::Doors, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ } while (0) +#define LogGroup(message, ...) do {\ + if (LogSys.log_settings[Logs::Group].is_category_enabled == 1)\ + OutF(LogSys, Logs::General, Logs::Group, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogGroupDetail(message, ...) do {\ + if (LogSys.log_settings[Logs::Group].is_category_enabled == 1)\ + OutF(LogSys, Logs::Detail, Logs::Group, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + #define LogGuilds(message, ...) do {\ if (LogSys.log_settings[Logs::Guilds].is_category_enabled == 1)\ OutF(LogSys, Logs::General, Logs::Guilds, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ @@ -581,6 +591,61 @@ OutF(LogSys, Logs::Detail, Logs::Merchants, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ } while (0) +#define LogZonePoints(message, ...) do {\ + if (LogSys.log_settings[Logs::ZonePoints].is_category_enabled == 1)\ + OutF(LogSys, Logs::General, Logs::ZonePoints, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogZonePointsDetail(message, ...) do {\ + if (LogSys.log_settings[Logs::ZonePoints].is_category_enabled == 1)\ + OutF(LogSys, Logs::Detail, Logs::ZonePoints, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogLoot(message, ...) do {\ + if (LogSys.log_settings[Logs::Loot].is_category_enabled == 1)\ + OutF(LogSys, Logs::General, Logs::Loot, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogLootDetail(message, ...) do {\ + if (LogSys.log_settings[Logs::Loot].is_category_enabled == 1)\ + OutF(LogSys, Logs::Detail, Logs::Loot, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogExpeditions(message, ...) do {\ + if (LogSys.log_settings[Logs::Expeditions].is_category_enabled == 1)\ + OutF(LogSys, Logs::General, Logs::Expeditions, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogExpeditionsModerate(message, ...) do {\ + if (LogSys.log_settings[Logs::Expeditions].is_category_enabled == 1)\ + OutF(LogSys, Logs::Moderate, Logs::Expeditions, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogExpeditionsDetail(message, ...) do {\ + if (LogSys.log_settings[Logs::Expeditions].is_category_enabled == 1)\ + OutF(LogSys, Logs::Detail, Logs::Expeditions, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogDynamicZones(message, ...) do {\ + if (LogSys.log_settings[Logs::DynamicZones].is_category_enabled == 1)\ + OutF(LogSys, Logs::General, Logs::DynamicZones, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogDynamicZonesDetail(message, ...) do {\ + if (LogSys.log_settings[Logs::DynamicZones].is_category_enabled == 1)\ + OutF(LogSys, Logs::Detail, Logs::DynamicZones, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogScheduler(message, ...) do {\ + if (LogSys.log_settings[Logs::Scheduler].is_category_enabled == 1)\ + OutF(LogSys, Logs::General, Logs::Scheduler, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + +#define LogSchedulerDetail(message, ...) do {\ + if (LogSys.log_settings[Logs::Scheduler].is_category_enabled == 1)\ + OutF(LogSys, Logs::Detail, Logs::Scheduler, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ +} while (0) + #define Log(debug_level, log_category, message, ...) do {\ if (LogSys.log_settings[log_category].is_category_enabled == 1)\ LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\ @@ -674,6 +739,12 @@ #define LogDoorsDetail(message, ...) do {\ } while (0) +#define LogGroup(message, ...) do {\ +} while (0) + +#define LogGroupDetail(message, ...) do {\ +} while (0) + #define LogGuilds(message, ...) do {\ } while (0) @@ -926,6 +997,27 @@ #define LogMerchantsDetail(message, ...) do {\ } while (0) +#define LogZonePoints(message, ...) do {\ +} while (0) + +#define LogZonePointsDetail(message, ...) do {\ +} while (0) + +#define LogExpeditions(message, ...) do {\ +} while (0) + +#define LogExpeditionsModerate(message, ...) do {\ +} while (0) + +#define LogExpeditionsDetail(message, ...) do {\ +} while (0) + +#define LogDynamicZones(message, ...) do {\ +} while (0) + +#define LogDynamicZonesDetail(message, ...) do {\ +} while (0) + #define Log(debug_level, log_category, message, ...) do {\ } while (0) @@ -933,4 +1025,4 @@ } while (0) #endif -#endif //EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H \ No newline at end of file +#endif //EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H diff --git a/common/event/event_loop.h b/common/event/event_loop.h index 295c0532d..537c3280a 100644 --- a/common/event/event_loop.h +++ b/common/event/event_loop.h @@ -25,6 +25,10 @@ namespace EQ uv_run(&m_loop, UV_RUN_DEFAULT); } + void Shutdown() { + uv_stop(&m_loop); + } + uv_loop_t* Handle() { return &m_loop; } private: diff --git a/common/event/task.h b/common/event/task.h index ae19700a2..89077734f 100644 --- a/common/event/task.h +++ b/common/event/task.h @@ -8,7 +8,7 @@ namespace EQ { class Task { public: - typedef std::function ResolveFn; + typedef std::function ResolveFn; typedef std::function RejectFn; typedef std::function FinallyFn; typedef std::function TaskFn; @@ -19,7 +19,7 @@ namespace EQ { RejectFn on_catch; FinallyFn on_finally; bool has_result; - EQEmu::Any result; + EQ::Any result; bool has_error; std::exception error; }; @@ -63,7 +63,7 @@ namespace EQ { uv_queue_work(EventLoop::Get().Handle(), m_work, [](uv_work_t* req) { TaskBaton *baton = (TaskBaton*)req->data; - baton->fn([baton](const EQEmu::Any& result) { + baton->fn([baton](const EQ::Any& result) { baton->has_error = false; baton->has_result = true; baton->result = result; diff --git a/common/event/timer.h b/common/event/timer.h index e71459630..73ac7af35 100644 --- a/common/event/timer.h +++ b/common/event/timer.h @@ -51,7 +51,7 @@ namespace EQ { void Stop() { if (m_timer) { uv_close((uv_handle_t*)m_timer, [](uv_handle_t* handle) { - delete handle; + delete (uv_timer_t *)handle; }); m_timer = nullptr; } diff --git a/common/expedition_base.cpp b/common/expedition_base.cpp new file mode 100644 index 000000000..a5f890204 --- /dev/null +++ b/common/expedition_base.cpp @@ -0,0 +1,113 @@ +#include "expedition_base.h" +#include "repositories/expeditions_repository.h" +#include "rulesys.h" + +ExpeditionBase::ExpeditionBase(uint32_t id, const std::string& uuid, + const std::string& expedition_name, const DynamicZoneMember& leader +) : + m_id(id), + m_uuid(uuid), + m_expedition_name(expedition_name), + m_leader(leader) +{ +} + +void ExpeditionBase::LoadRepositoryResult(ExpeditionsRepository::ExpeditionWithLeader&& entry) +{ + m_id = entry.id; + m_uuid = std::move(entry.uuid); + m_expedition_name = std::move(entry.expedition_name); + m_add_replay_on_join = entry.add_replay_on_join; + m_is_locked = entry.is_locked; + m_leader.id = entry.leader_id; + m_leader.name = std::move(entry.leader_name); +} + +void ExpeditionBase::AddMemberFromRepositoryResult( + ExpeditionMembersRepository::MemberWithName&& entry) +{ + auto status = DynamicZoneMemberStatus::Unknown; + AddInternalMember({ entry.character_id, std::move(entry.character_name), status }); +} + +void ExpeditionBase::AddInternalMember(const DynamicZoneMember& member) +{ + if (!HasMember(member.id)) + { + m_members.emplace_back(member); + } +} + +void ExpeditionBase::RemoveInternalMember(uint32_t character_id) +{ + m_members.erase(std::remove_if(m_members.begin(), m_members.end(), + [&](const DynamicZoneMember& member) { return member.id == character_id; } + ), m_members.end()); +} + + +bool ExpeditionBase::HasMember(uint32_t character_id) +{ + return std::any_of(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) { + return member.id == character_id; + }); +} + +bool ExpeditionBase::HasMember(const std::string& character_name) +{ + return std::any_of(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) { + return (strcasecmp(member.name.c_str(), character_name.c_str()) == 0); + }); +} + +DynamicZoneMember ExpeditionBase::GetMemberData(uint32_t character_id) +{ + auto it = std::find_if(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) { + return member.id == character_id; + }); + + DynamicZoneMember member_data; + if (it != m_members.end()) + { + member_data = *it; + } + return member_data; +} + +DynamicZoneMember ExpeditionBase::GetMemberData(const std::string& character_name) +{ + auto it = std::find_if(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) { + return (strcasecmp(member.name.c_str(), character_name.c_str()) == 0); + }); + + DynamicZoneMember member_data; + if (it != m_members.end()) + { + member_data = *it; + } + return member_data; +} + +bool ExpeditionBase::SetInternalMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status) +{ + if (status == DynamicZoneMemberStatus::InDynamicZone && !RuleB(Expedition, EnableInDynamicZoneStatus)) + { + status = DynamicZoneMemberStatus::Online; + } + + if (character_id == m_leader.id) + { + m_leader.status = status; + } + + auto it = std::find_if(m_members.begin(), m_members.end(), + [&](const DynamicZoneMember& member) { return member.id == character_id; }); + + if (it != m_members.end() && it->status != status) + { + it->status = status; + return true; + } + + return false; +} diff --git a/common/expedition_base.h b/common/expedition_base.h new file mode 100644 index 000000000..e93c707b5 --- /dev/null +++ b/common/expedition_base.h @@ -0,0 +1,56 @@ +#ifndef COMMON_EXPEDITION_BASE_H +#define COMMON_EXPEDITION_BASE_H + +#include "dynamic_zone_base.h" +#include "repositories/expeditions_repository.h" +#include "repositories/expedition_members_repository.h" +#include +#include +#include + +class ExpeditionBase +{ +public: + virtual ~ExpeditionBase() = default; + ExpeditionBase(const ExpeditionBase&) = default; + ExpeditionBase(ExpeditionBase&&) = default; + ExpeditionBase& operator=(const ExpeditionBase&) = default; + ExpeditionBase& operator=(ExpeditionBase&&) = default; + + uint32_t GetID() const { return m_id; } + uint32_t GetLeaderID() const { return m_leader.id; } + uint32_t GetMemberCount() const { return static_cast(m_members.size()); } + const std::string& GetName() const { return m_expedition_name; } + const std::string& GetLeaderName() const { return m_leader.name; } + const std::string& GetUUID() const { return m_uuid; } + const std::vector& GetMembers() const { return m_members; } + + void AddInternalMember(const DynamicZoneMember& member); + void ClearInternalMembers() { m_members.clear(); } + bool HasMember(const std::string& character_name); + bool HasMember(uint32_t character_id); + bool IsEmpty() const { return m_members.empty(); } + void RemoveInternalMember(uint32_t character_id); + bool SetInternalMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status); + + void LoadRepositoryResult(ExpeditionsRepository::ExpeditionWithLeader&& entry); + void AddMemberFromRepositoryResult(ExpeditionMembersRepository::MemberWithName&& entry); + +protected: + ExpeditionBase() = default; + ExpeditionBase(uint32_t id, const std::string& uuid, const std::string& expedition_name, + const DynamicZoneMember& leader); + + DynamicZoneMember GetMemberData(uint32_t character_id); + DynamicZoneMember GetMemberData(const std::string& character_name); + + uint32_t m_id = 0; + bool m_is_locked = false; + bool m_add_replay_on_join = true; + std::string m_uuid; + std::string m_expedition_name; + DynamicZoneMember m_leader; + std::vector m_members; +}; + +#endif diff --git a/common/expedition_lockout_timer.cpp b/common/expedition_lockout_timer.cpp new file mode 100644 index 000000000..dc4cb97c6 --- /dev/null +++ b/common/expedition_lockout_timer.cpp @@ -0,0 +1,101 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition_lockout_timer.h" +#include "../common/string_util.h" +#include "../common/rulesys.h" +#include "../common/util/uuid.h" +#include + +const char* const DZ_REPLAY_TIMER_NAME = "Replay Timer"; // see December 14, 2016 patch notes + +ExpeditionLockoutTimer::ExpeditionLockoutTimer( + std::string expedition_uuid, std::string expedition_name, + std::string event_name, uint64_t expire_time, uint32_t duration +) : + m_expedition_uuid{std::move(expedition_uuid)}, + m_expedition_name{std::move(expedition_name)}, + m_event_name{std::move(event_name)}, + m_expire_time(std::chrono::system_clock::from_time_t(expire_time)), + m_duration(duration) +{ + if (m_event_name == DZ_REPLAY_TIMER_NAME) + { + m_is_replay_timer = true; + } +} + +ExpeditionLockoutTimer ExpeditionLockoutTimer::CreateLockout( + const std::string& expedition_name, const std::string& event_name, uint32_t seconds, std::string uuid) +{ + seconds = static_cast(seconds * RuleR(Expedition, LockoutDurationMultiplier)); + + if (uuid.empty()) + { + uuid = EQ::Util::UUID::Generate().ToString(); + } + + ExpeditionLockoutTimer lockout{uuid, expedition_name, event_name, 0, seconds}; + lockout.Reset(); // sets expire time + return lockout; +} + +uint32_t ExpeditionLockoutTimer::GetSecondsRemaining() const +{ + auto now = std::chrono::system_clock::now(); + if (m_expire_time > now) + { + auto remaining = m_expire_time - now; + return static_cast(std::chrono::duration_cast(remaining).count()); + } + return 0; +} + +ExpeditionLockoutTimer::DaysHoursMinutes ExpeditionLockoutTimer::GetDaysHoursMinutesRemaining() const +{ + auto seconds = GetSecondsRemaining(); + return ExpeditionLockoutTimer::DaysHoursMinutes{ + fmt::format_int(seconds / 86400).str(), // days + fmt::format_int((seconds / 3600) % 24).str(), // hours + fmt::format_int((seconds / 60) % 60).str() // minutes + }; +} + +bool ExpeditionLockoutTimer::IsSameLockout(const ExpeditionLockoutTimer& compare_lockout) const +{ + return compare_lockout.IsSameLockout(GetExpeditionName(), GetEventName()); +} + +bool ExpeditionLockoutTimer::IsSameLockout( + const std::string& expedition_name, const std::string& event_name) const +{ + return GetExpeditionName() == expedition_name && GetEventName() == event_name; +} + +void ExpeditionLockoutTimer::AddLockoutTime(int seconds) +{ + seconds = static_cast(seconds * RuleR(Expedition, LockoutDurationMultiplier)); + + auto new_duration = std::max(0, static_cast(m_duration.count()) + seconds); + + auto start_time = m_expire_time - m_duration; + m_duration = std::chrono::seconds(new_duration); + m_expire_time = start_time + m_duration; +} diff --git a/common/expedition_lockout_timer.h b/common/expedition_lockout_timer.h new file mode 100644 index 000000000..8cbf3da54 --- /dev/null +++ b/common/expedition_lockout_timer.h @@ -0,0 +1,76 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EXPEDITION_LOCKOUT_TIMER_H +#define EXPEDITION_LOCKOUT_TIMER_H + +#include +#include + +extern const char* const DZ_REPLAY_TIMER_NAME; + +class ExpeditionLockoutTimer +{ +public: + ExpeditionLockoutTimer() = default; + ExpeditionLockoutTimer( + std::string expedition_uuid, std::string expedition_name, + std::string event_name, uint64_t expire_time, uint32_t duration); + + static ExpeditionLockoutTimer CreateLockout( + const std::string& expedition_name, const std::string& event_name, + uint32_t seconds, std::string uuid = {}); + + struct DaysHoursMinutes + { + std::string days; + std::string hours; + std::string mins; + }; + + void AddLockoutTime(int seconds); + uint32_t GetDuration() const { return static_cast(m_duration.count()); } + uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); } + uint64_t GetStartTime() const { return std::chrono::system_clock::to_time_t(m_expire_time - m_duration); } + uint32_t GetSecondsRemaining() const; + DaysHoursMinutes GetDaysHoursMinutesRemaining() const; + const std::string& GetExpeditionName() const { return m_expedition_name; } + const std::string& GetExpeditionUUID() const { return m_expedition_uuid; } + const std::string& GetEventName() const { return m_event_name; } + bool IsExpired() const { return GetSecondsRemaining() == 0; } + bool IsFromExpedition(const std::string& uuid) const { return uuid == m_expedition_uuid; } + bool IsReplayTimer() const { return m_is_replay_timer; } + bool IsSameLockout(const ExpeditionLockoutTimer& compare_lockout) const; + bool IsSameLockout(const std::string& expedition_name, const std::string& event_name) const; + void Reset() { m_expire_time = std::chrono::system_clock::now() + m_duration; } + void SetDuration(uint32_t seconds) { m_duration = std::chrono::seconds(seconds); } + void SetExpireTime(uint64_t expire_time) { m_expire_time = std::chrono::system_clock::from_time_t(expire_time); } + void SetUUID(const std::string& uuid) { m_expedition_uuid = uuid; } + +private: + bool m_is_replay_timer = false; + std::string m_expedition_uuid; // expedition received in + std::string m_expedition_name; + std::string m_event_name; + std::chrono::seconds m_duration; + std::chrono::time_point m_expire_time; +}; + +#endif diff --git a/common/extprofile.h b/common/extprofile.h index bdb746068..5f69a449d 100644 --- a/common/extprofile.h +++ b/common/extprofile.h @@ -40,7 +40,7 @@ struct ExtendedProfile_Struct { uint16 old_pet_hp; /* Not Used */ uint16 old_pet_mana; /* Not Used */ SpellBuff_Struct pet_buffs[BUFF_COUNT]; /* Not Used */ - EQEmu::TextureMaterialProfile pet_items; /* Not Used */ + EQ::TextureMaterialProfile pet_items; /* Not Used */ char merc_name[64]; /* Used */ uint32 aa_effects; /* Used */ diff --git a/common/fixed_memory_hash_set.h b/common/fixed_memory_hash_set.h index 2b119bd3f..d02900260 100644 --- a/common/fixed_memory_hash_set.h +++ b/common/fixed_memory_hash_set.h @@ -23,7 +23,7 @@ #include "eqemu_exception.h" #include "types.h" -namespace EQEmu { +namespace EQ { /*! Simple HashSet designed to be used in fixed memory that may be difficult to use an allocator for (shared memory), we assume all keys are unsigned int diff --git a/common/fixed_memory_variable_hash_set.h b/common/fixed_memory_variable_hash_set.h index b25fe5b2f..cc0f7979e 100644 --- a/common/fixed_memory_variable_hash_set.h +++ b/common/fixed_memory_variable_hash_set.h @@ -23,7 +23,7 @@ #include "eqemu_exception.h" #include "types.h" -namespace EQEmu { +namespace EQ { /*! Simple HashSet designed to be used in fixed memory that may be difficult to use an allocator for (shared memory), we assume all keys are unsigned int, values are a pointer and size diff --git a/common/inventory_profile.cpp b/common/inventory_profile.cpp index a51b04998..e93146598 100644 --- a/common/inventory_profile.cpp +++ b/common/inventory_profile.cpp @@ -33,7 +33,7 @@ #include -std::list dirty_inst; +std::list dirty_inst; // @@ -48,50 +48,50 @@ ItemInstQueue::~ItemInstQueue() } // Put item onto back of queue -void ItemInstQueue::push(EQEmu::ItemInstance* inst) +void ItemInstQueue::push(EQ::ItemInstance* inst) { m_list.push_back(inst); } // Put item onto front of queue -void ItemInstQueue::push_front(EQEmu::ItemInstance* inst) +void ItemInstQueue::push_front(EQ::ItemInstance* inst) { m_list.push_front(inst); } // Remove item from front of queue -EQEmu::ItemInstance* ItemInstQueue::pop() +EQ::ItemInstance* ItemInstQueue::pop() { if (m_list.empty()) return nullptr; - EQEmu::ItemInstance* inst = m_list.front(); + EQ::ItemInstance* inst = m_list.front(); m_list.pop_front(); return inst; } // Remove item from back of queue -EQEmu::ItemInstance* ItemInstQueue::pop_back() +EQ::ItemInstance* ItemInstQueue::pop_back() { if (m_list.empty()) return nullptr; - EQEmu::ItemInstance* inst = m_list.back(); + EQ::ItemInstance* inst = m_list.back(); m_list.pop_back(); return inst; } // Look at item at front of queue -EQEmu::ItemInstance* ItemInstQueue::peek_front() const +EQ::ItemInstance* ItemInstQueue::peek_front() const { return (m_list.empty()) ? nullptr : m_list.front(); } // -// class EQEmu::InventoryProfile +// class EQ::InventoryProfile // -EQEmu::InventoryProfile::~InventoryProfile() +EQ::InventoryProfile::~InventoryProfile() { for (auto iter = m_worn.begin(); iter != m_worn.end(); ++iter) { safe_delete(iter->second); @@ -119,18 +119,18 @@ EQEmu::InventoryProfile::~InventoryProfile() m_trade.clear(); } -void EQEmu::InventoryProfile::SetInventoryVersion(versions::MobVersion inventory_version) { +void EQ::InventoryProfile::SetInventoryVersion(versions::MobVersion inventory_version) { m_mob_version = versions::ValidateMobVersion(inventory_version); SetGMInventory(m_gm_inventory); } -void EQEmu::InventoryProfile::SetGMInventory(bool gmi_flag) { +void EQ::InventoryProfile::SetGMInventory(bool gmi_flag) { m_gm_inventory = gmi_flag; m_lookup = inventory::DynamicLookup(m_mob_version, gmi_flag); } -void EQEmu::InventoryProfile::CleanDirty() { +void EQ::InventoryProfile::CleanDirty() { auto iter = dirty_inst.begin(); while (iter != dirty_inst.end()) { delete (*iter); @@ -139,14 +139,14 @@ void EQEmu::InventoryProfile::CleanDirty() { dirty_inst.clear(); } -void EQEmu::InventoryProfile::MarkDirty(ItemInstance *inst) { +void EQ::InventoryProfile::MarkDirty(ItemInstance *inst) { if (inst) { dirty_inst.push_back(inst); } } // Retrieve item at specified slot; returns false if item not found -EQEmu::ItemInstance* EQEmu::InventoryProfile::GetItem(int16 slot_id) const +EQ::ItemInstance* EQ::InventoryProfile::GetItem(int16 slot_id) const { ItemInstance* result = nullptr; @@ -219,31 +219,31 @@ EQEmu::ItemInstance* EQEmu::InventoryProfile::GetItem(int16 slot_id) const } // Retrieve item at specified position within bag -EQEmu::ItemInstance* EQEmu::InventoryProfile::GetItem(int16 slot_id, uint8 bagidx) const +EQ::ItemInstance* EQ::InventoryProfile::GetItem(int16 slot_id, uint8 bagidx) const { return GetItem(InventoryProfile::CalcSlotId(slot_id, bagidx)); } // Put an item snto specified slot -int16 EQEmu::InventoryProfile::PutItem(int16 slot_id, const ItemInstance& inst) +int16 EQ::InventoryProfile::PutItem(int16 slot_id, const ItemInstance& inst) { - if (slot_id <= EQEmu::invslot::POSSESSIONS_END && slot_id >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (slot_id <= EQ::invslot::POSSESSIONS_END && slot_id >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << slot_id) & m_lookup->PossessionsBitmask) == 0) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; } - else if (slot_id <= EQEmu::invbag::GENERAL_BAGS_END && slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (slot_id <= EQ::invbag::GENERAL_BAGS_END && slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & m_lookup->PossessionsBitmask) == 0) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; } - else if (slot_id <= EQEmu::invslot::BANK_END && slot_id >= EQEmu::invslot::BANK_BEGIN) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= m_lookup->InventoryTypeSize.Bank) - return EQEmu::invslot::SLOT_INVALID; + else if (slot_id <= EQ::invslot::BANK_END && slot_id >= EQ::invslot::BANK_BEGIN) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= m_lookup->InventoryTypeSize.Bank) + return EQ::invslot::SLOT_INVALID; } - else if (slot_id <= EQEmu::invbag::BANK_BAGS_END && slot_id >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + else if (slot_id <= EQ::invbag::BANK_BAGS_END && slot_id >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= m_lookup->InventoryTypeSize.Bank) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; } // Clean up item already in slot (if exists) @@ -259,17 +259,17 @@ int16 EQEmu::InventoryProfile::PutItem(int16 slot_id, const ItemInstance& inst) return _PutItem(slot_id, inst.Clone()); } -int16 EQEmu::InventoryProfile::PushCursor(const ItemInstance &inst) { +int16 EQ::InventoryProfile::PushCursor(const ItemInstance &inst) { m_cursor.push(inst.Clone()); return invslot::slotCursor; } -EQEmu::ItemInstance* EQEmu::InventoryProfile::GetCursorItem() { +EQ::ItemInstance* EQ::InventoryProfile::GetCursorItem() { return m_cursor.peek_front(); } // Swap items in inventory -bool EQEmu::InventoryProfile::SwapItem( +bool EQ::InventoryProfile::SwapItem( int16 source_slot, int16 destination_slot, SwapItemFailState &fail_state, @@ -280,54 +280,54 @@ bool EQEmu::InventoryProfile::SwapItem( ) { fail_state = swapInvalid; - if (source_slot <= EQEmu::invslot::POSSESSIONS_END && source_slot >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (source_slot <= EQ::invslot::POSSESSIONS_END && source_slot >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64) 1 << source_slot) & m_lookup->PossessionsBitmask) == 0) { fail_state = swapNotAllowed; return false; } } - else if (source_slot <= EQEmu::invbag::GENERAL_BAGS_END && source_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((source_slot - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (source_slot <= EQ::invbag::GENERAL_BAGS_END && source_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((source_slot - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & m_lookup->PossessionsBitmask) == 0) { fail_state = swapNotAllowed; return false; } } - else if (source_slot <= EQEmu::invslot::BANK_END && source_slot >= EQEmu::invslot::BANK_BEGIN) { - if ((source_slot - EQEmu::invslot::BANK_BEGIN) >= m_lookup->InventoryTypeSize.Bank) { + else if (source_slot <= EQ::invslot::BANK_END && source_slot >= EQ::invslot::BANK_BEGIN) { + if ((source_slot - EQ::invslot::BANK_BEGIN) >= m_lookup->InventoryTypeSize.Bank) { fail_state = swapNotAllowed; return false; } } - else if (source_slot <= EQEmu::invbag::BANK_BAGS_END && source_slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (source_slot - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + else if (source_slot <= EQ::invbag::BANK_BAGS_END && source_slot >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (source_slot - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= m_lookup->InventoryTypeSize.Bank) { fail_state = swapNotAllowed; return false; } } - if (destination_slot <= EQEmu::invslot::POSSESSIONS_END && destination_slot >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (destination_slot <= EQ::invslot::POSSESSIONS_END && destination_slot >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << destination_slot) & m_lookup->PossessionsBitmask) == 0) { fail_state = swapNotAllowed; return false; } } - else if (destination_slot <= EQEmu::invbag::GENERAL_BAGS_END && destination_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((destination_slot - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (destination_slot <= EQ::invbag::GENERAL_BAGS_END && destination_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((destination_slot - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & m_lookup->PossessionsBitmask) == 0) { fail_state = swapNotAllowed; return false; } } - else if (destination_slot <= EQEmu::invslot::BANK_END && destination_slot >= EQEmu::invslot::BANK_BEGIN) { - if ((destination_slot - EQEmu::invslot::BANK_BEGIN) >= m_lookup->InventoryTypeSize.Bank) { + else if (destination_slot <= EQ::invslot::BANK_END && destination_slot >= EQ::invslot::BANK_BEGIN) { + if ((destination_slot - EQ::invslot::BANK_BEGIN) >= m_lookup->InventoryTypeSize.Bank) { fail_state = swapNotAllowed; return false; } } - else if (destination_slot <= EQEmu::invbag::BANK_BAGS_END && destination_slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (destination_slot - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + else if (destination_slot <= EQ::invbag::BANK_BAGS_END && destination_slot >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (destination_slot - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= m_lookup->InventoryTypeSize.Bank) { fail_state = swapNotAllowed; return false; @@ -399,7 +399,7 @@ bool EQEmu::InventoryProfile::SwapItem( } // Remove item from inventory (with memory delete) -bool EQEmu::InventoryProfile::DeleteItem(int16 slot_id, uint8 quantity) { +bool EQ::InventoryProfile::DeleteItem(int16 slot_id, uint8 quantity) { // Pop item out of inventory map (or queue) ItemInstance *item_to_delete = PopItem(slot_id); @@ -434,7 +434,7 @@ bool EQEmu::InventoryProfile::DeleteItem(int16 slot_id, uint8 quantity) { } // Checks All items in a bag for No Drop -bool EQEmu::InventoryProfile::CheckNoDrop(int16 slot_id, bool recurse) +bool EQ::InventoryProfile::CheckNoDrop(int16 slot_id, bool recurse) { ItemInstance* inst = GetItem(slot_id); if (!inst) @@ -445,7 +445,7 @@ bool EQEmu::InventoryProfile::CheckNoDrop(int16 slot_id, bool recurse) // Remove item from bucket without memory delete // Returns item pointer if full delete was successful -EQEmu::ItemInstance* EQEmu::InventoryProfile::PopItem(int16 slot_id) +EQ::ItemInstance* EQ::InventoryProfile::PopItem(int16 slot_id) { ItemInstance* p = nullptr; @@ -488,7 +488,7 @@ EQEmu::ItemInstance* EQEmu::InventoryProfile::PopItem(int16 slot_id) return p; } -bool EQEmu::InventoryProfile::HasSpaceForItem(const ItemData *ItemToTry, int16 Quantity) { +bool EQ::InventoryProfile::HasSpaceForItem(const ItemData *ItemToTry, int16 Quantity) { if (ItemToTry->Stackable) { @@ -592,7 +592,7 @@ bool EQEmu::InventoryProfile::HasSpaceForItem(const ItemData *ItemToTry, int16 Q //This function has a flaw in that it only returns the last stack that it looked at //when quantity is greater than 1 and not all of quantity can be found in 1 stack. -int16 EQEmu::InventoryProfile::HasItem(uint32 item_id, uint8 quantity, uint8 where) +int16 EQ::InventoryProfile::HasItem(uint32 item_id, uint8 quantity, uint8 where) { int16 slot_id = INVALID_INDEX; @@ -642,7 +642,7 @@ int16 EQEmu::InventoryProfile::HasItem(uint32 item_id, uint8 quantity, uint8 whe } //this function has the same quantity flaw mentioned above in HasItem() -int16 EQEmu::InventoryProfile::HasItemByUse(uint8 use, uint8 quantity, uint8 where) +int16 EQ::InventoryProfile::HasItemByUse(uint8 use, uint8 quantity, uint8 where) { int16 slot_id = INVALID_INDEX; @@ -688,7 +688,7 @@ int16 EQEmu::InventoryProfile::HasItemByUse(uint8 use, uint8 quantity, uint8 whe return slot_id; } -int16 EQEmu::InventoryProfile::HasItemByLoreGroup(uint32 loregroup, uint8 where) +int16 EQ::InventoryProfile::HasItemByLoreGroup(uint32 loregroup, uint8 where) { int16 slot_id = INVALID_INDEX; @@ -736,7 +736,7 @@ int16 EQEmu::InventoryProfile::HasItemByLoreGroup(uint32 loregroup, uint8 where) // Locate an available inventory slot // Returns slot_id when there's one available, else SLOT_INVALID -int16 EQEmu::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 for (int16 i = invslot::GENERAL_BEGIN; i <= invslot::GENERAL_END; i++) { @@ -786,7 +786,7 @@ int16 EQEmu::InventoryProfile::FindFreeSlot(bool for_bag, bool try_cursor, uint8 } // This is a mix of HasSpaceForItem and FindFreeSlot..due to existing coding behavior, it was better to add a new helper function... -int16 EQEmu::InventoryProfile::FindFreeSlotForTradeItem(const ItemInstance* inst, int16 general_start, uint8 bag_start) { +int16 EQ::InventoryProfile::FindFreeSlotForTradeItem(const ItemInstance* inst, int16 general_start, uint8 bag_start) { // Do not arbitrarily use this function..it is designed for use with Client::ResetTrade() and Client::FinishTrade(). // If you have a need, use it..but, understand it is not a suitable replacement for InventoryProfile::FindFreeSlot(). // @@ -924,7 +924,7 @@ int16 EQEmu::InventoryProfile::FindFreeSlotForTradeItem(const ItemInstance* inst } // Opposite of below: Get parent bag slot_id from a slot inside of bag -int16 EQEmu::InventoryProfile::CalcSlotId(int16 slot_id) { +int16 EQ::InventoryProfile::CalcSlotId(int16 slot_id) { int16 parent_slot_id = INVALID_INDEX; // this is not a bag range... using this risks over-writing existing items @@ -952,7 +952,7 @@ int16 EQEmu::InventoryProfile::CalcSlotId(int16 slot_id) { } // Calculate slot_id for an item within a bag -int16 EQEmu::InventoryProfile::CalcSlotId(int16 bagslot_id, uint8 bagidx) { +int16 EQ::InventoryProfile::CalcSlotId(int16 bagslot_id, uint8 bagidx) { if (!InventoryProfile::SupportsContainers(bagslot_id)) return INVALID_INDEX; @@ -977,7 +977,7 @@ int16 EQEmu::InventoryProfile::CalcSlotId(int16 bagslot_id, uint8 bagidx) { return slot_id; } -uint8 EQEmu::InventoryProfile::CalcBagIdx(int16 slot_id) { +uint8 EQ::InventoryProfile::CalcBagIdx(int16 slot_id) { uint8 index = 0; // this is not a bag range... using this risks over-writing existing items @@ -1006,7 +1006,7 @@ uint8 EQEmu::InventoryProfile::CalcBagIdx(int16 slot_id) { return index; } -int16 EQEmu::InventoryProfile::CalcSlotFromMaterial(uint8 material) +int16 EQ::InventoryProfile::CalcSlotFromMaterial(uint8 material) { switch (material) { @@ -1033,7 +1033,7 @@ int16 EQEmu::InventoryProfile::CalcSlotFromMaterial(uint8 material) } } -uint8 EQEmu::InventoryProfile::CalcMaterialFromSlot(int16 equipslot) +uint8 EQ::InventoryProfile::CalcMaterialFromSlot(int16 equipslot) { switch (equipslot) { @@ -1061,7 +1061,7 @@ uint8 EQEmu::InventoryProfile::CalcMaterialFromSlot(int16 equipslot) } } -bool EQEmu::InventoryProfile::CanItemFitInContainer(const ItemData *ItemToTry, const ItemData *Container) { +bool EQ::InventoryProfile::CanItemFitInContainer(const ItemData *ItemToTry, const ItemData *Container) { if (!ItemToTry || !Container) return false; @@ -1078,7 +1078,7 @@ bool EQEmu::InventoryProfile::CanItemFitInContainer(const ItemData *ItemToTry, c return true; } -bool EQEmu::InventoryProfile::SupportsClickCasting(int16 slot_id) +bool EQ::InventoryProfile::SupportsClickCasting(int16 slot_id) { // there are a few non-potion items that identify as ItemTypePotion..so, we still need to ubiquitously include the equipment range if (slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) { @@ -1095,7 +1095,7 @@ bool EQEmu::InventoryProfile::SupportsClickCasting(int16 slot_id) return false; } -bool EQEmu::InventoryProfile::SupportsPotionBeltCasting(int16 slot_id) +bool EQ::InventoryProfile::SupportsPotionBeltCasting(int16 slot_id) { // does this have the same criteria as 'SupportsClickCasting' above? (bag clicking per client) if (slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) { @@ -1112,7 +1112,7 @@ bool EQEmu::InventoryProfile::SupportsPotionBeltCasting(int16 slot_id) } // Test whether a given slot can support a container item -bool EQEmu::InventoryProfile::SupportsContainers(int16 slot_id) +bool EQ::InventoryProfile::SupportsContainers(int16 slot_id) { if ((slot_id == invslot::slotCursor) || (slot_id >= invslot::GENERAL_BEGIN && slot_id <= invslot::GENERAL_END) || @@ -1126,7 +1126,7 @@ bool EQEmu::InventoryProfile::SupportsContainers(int16 slot_id) return false; } -int EQEmu::InventoryProfile::GetSlotByItemInst(ItemInstance *inst) { +int EQ::InventoryProfile::GetSlotByItemInst(ItemInstance *inst) { if (!inst) return INVALID_INDEX; @@ -1162,7 +1162,7 @@ int EQEmu::InventoryProfile::GetSlotByItemInst(ItemInstance *inst) { return INVALID_INDEX; } -uint8 EQEmu::InventoryProfile::FindBrightestLightType() +uint8 EQ::InventoryProfile::FindBrightestLightType() { uint8 brightest_light_type = 0; @@ -1213,7 +1213,7 @@ uint8 EQEmu::InventoryProfile::FindBrightestLightType() return brightest_light_type; } -void EQEmu::InventoryProfile::dumpEntireInventory() { +void EQ::InventoryProfile::dumpEntireInventory() { dumpWornItems(); dumpInventory(); @@ -1223,29 +1223,29 @@ void EQEmu::InventoryProfile::dumpEntireInventory() { std::cout << std::endl; } -void EQEmu::InventoryProfile::dumpWornItems() { +void EQ::InventoryProfile::dumpWornItems() { std::cout << "Worn items:" << std::endl; dumpItemCollection(m_worn); } -void EQEmu::InventoryProfile::dumpInventory() { +void EQ::InventoryProfile::dumpInventory() { std::cout << "Inventory items:" << std::endl; dumpItemCollection(m_inv); } -void EQEmu::InventoryProfile::dumpBankItems() { +void EQ::InventoryProfile::dumpBankItems() { std::cout << "Bank items:" << std::endl; dumpItemCollection(m_bank); } -void EQEmu::InventoryProfile::dumpSharedBankItems() { +void EQ::InventoryProfile::dumpSharedBankItems() { std::cout << "Shared Bank items:" << std::endl; dumpItemCollection(m_shbank); } -int EQEmu::InventoryProfile::GetSlotByItemInstCollection(const std::map &collection, ItemInstance *inst) { +int EQ::InventoryProfile::GetSlotByItemInstCollection(const std::map &collection, ItemInstance *inst) { for (auto iter = collection.begin(); iter != collection.end(); ++iter) { ItemInstance *t_inst = iter->second; if (t_inst == inst) { @@ -1261,10 +1261,10 @@ int EQEmu::InventoryProfile::GetSlotByItemInstCollection(const std::map &collection) +void EQ::InventoryProfile::dumpItemCollection(const std::map &collection) { for (auto it = collection.cbegin(); it != collection.cend(); ++it) { auto inst = it->second; @@ -1278,7 +1278,7 @@ void EQEmu::InventoryProfile::dumpItemCollection(const std::map::const_iterator *it) +void EQ::InventoryProfile::dumpBagContents(ItemInstance *inst, std::map::const_iterator *it) { if (!inst || !inst->IsClassBag()) return; @@ -1297,14 +1297,14 @@ void EQEmu::InventoryProfile::dumpBagContents(ItemInstance *inst, std::map& bucket, int16 slot_id) const +EQ::ItemInstance* EQ::InventoryProfile::_GetItem(const std::map& bucket, int16 slot_id) const { - if (slot_id <= EQEmu::invslot::POSSESSIONS_END && slot_id >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (slot_id <= EQ::invslot::POSSESSIONS_END && slot_id >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << slot_id) & m_lookup->PossessionsBitmask) == 0) return nullptr; } - else if (slot_id <= EQEmu::invslot::BANK_END && slot_id >= EQEmu::invslot::BANK_BEGIN) { - if (slot_id - EQEmu::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) + else if (slot_id <= EQ::invslot::BANK_END && slot_id >= EQ::invslot::BANK_BEGIN) { + if (slot_id - EQ::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) return nullptr; } @@ -1319,7 +1319,7 @@ EQEmu::ItemInstance* EQEmu::InventoryProfile::_GetItem(const std::map= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) { - if (slot_id - EQEmu::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) { + if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) { m_bank[slot_id] = inst; result = slot_id; } @@ -1389,17 +1389,17 @@ int16 EQEmu::InventoryProfile::_PutItem(int16 slot_id, ItemInstance* inst) } // Internal Method: Checks an inventory bucket for a particular item -int16 EQEmu::InventoryProfile::_HasItem(std::map& bucket, uint32 item_id, uint8 quantity) +int16 EQ::InventoryProfile::_HasItem(std::map& bucket, uint32 item_id, uint8 quantity) { uint32 quantity_found = 0; for (auto iter = bucket.begin(); iter != bucket.end(); ++iter) { - if (iter->first <= EQEmu::invslot::POSSESSIONS_END && iter->first >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (iter->first <= EQ::invslot::POSSESSIONS_END && iter->first >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << iter->first) & m_lookup->PossessionsBitmask) == 0) continue; } - else if (iter->first <= EQEmu::invslot::BANK_END && iter->first >= EQEmu::invslot::BANK_BEGIN) { - if (iter->first - EQEmu::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) + else if (iter->first <= EQ::invslot::BANK_END && iter->first >= EQ::invslot::BANK_BEGIN) { + if (iter->first - EQ::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) continue; } @@ -1440,7 +1440,7 @@ int16 EQEmu::InventoryProfile::_HasItem(std::map& bucket, } // Internal Method: Checks an inventory queue type bucket for a particular item -int16 EQEmu::InventoryProfile::_HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity) +int16 EQ::InventoryProfile::_HasItem(ItemInstQueue& iqueue, uint32 item_id, uint8 quantity) { // The downfall of this (these) queue procedure is that callers presume that when an item is // found, it is presented as being available on the cursor. In cases of a parity check, this @@ -1491,17 +1491,17 @@ int16 EQEmu::InventoryProfile::_HasItem(ItemInstQueue& iqueue, uint32 item_id, u } // Internal Method: Checks an inventory bucket for a particular item -int16 EQEmu::InventoryProfile::_HasItemByUse(std::map& bucket, uint8 use, uint8 quantity) +int16 EQ::InventoryProfile::_HasItemByUse(std::map& bucket, uint8 use, uint8 quantity) { uint32 quantity_found = 0; for (auto iter = bucket.begin(); iter != bucket.end(); ++iter) { - if (iter->first <= EQEmu::invslot::POSSESSIONS_END && iter->first >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (iter->first <= EQ::invslot::POSSESSIONS_END && iter->first >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << iter->first) & m_lookup->PossessionsBitmask) == 0) continue; } - else if (iter->first <= EQEmu::invslot::BANK_END && iter->first >= EQEmu::invslot::BANK_BEGIN) { - if (iter->first - EQEmu::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) + else if (iter->first <= EQ::invslot::BANK_END && iter->first >= EQ::invslot::BANK_BEGIN) { + if (iter->first - EQ::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) continue; } @@ -1532,7 +1532,7 @@ int16 EQEmu::InventoryProfile::_HasItemByUse(std::map& buc } // Internal Method: Checks an inventory queue type bucket for a particular item -int16 EQEmu::InventoryProfile::_HasItemByUse(ItemInstQueue& iqueue, uint8 use, uint8 quantity) +int16 EQ::InventoryProfile::_HasItemByUse(ItemInstQueue& iqueue, uint8 use, uint8 quantity) { uint32 quantity_found = 0; @@ -1566,15 +1566,15 @@ int16 EQEmu::InventoryProfile::_HasItemByUse(ItemInstQueue& iqueue, uint8 use, u return INVALID_INDEX; } -int16 EQEmu::InventoryProfile::_HasItemByLoreGroup(std::map& bucket, uint32 loregroup) +int16 EQ::InventoryProfile::_HasItemByLoreGroup(std::map& bucket, uint32 loregroup) { for (auto iter = bucket.begin(); iter != bucket.end(); ++iter) { - if (iter->first <= EQEmu::invslot::POSSESSIONS_END && iter->first >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (iter->first <= EQ::invslot::POSSESSIONS_END && iter->first >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << iter->first) & m_lookup->PossessionsBitmask) == 0) continue; } - else if (iter->first <= EQEmu::invslot::BANK_END && iter->first >= EQEmu::invslot::BANK_BEGIN) { - if (iter->first - EQEmu::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) + else if (iter->first <= EQ::invslot::BANK_END && iter->first >= EQ::invslot::BANK_BEGIN) { + if (iter->first - EQ::invslot::BANK_BEGIN >= m_lookup->InventoryTypeSize.Bank) continue; } @@ -1611,11 +1611,11 @@ int16 EQEmu::InventoryProfile::_HasItemByLoreGroup(std::map::const_iterator cbegin() { return m_list.cbegin(); } - inline std::list::const_iterator cend() { return m_list.cend(); } + inline std::list::const_iterator cbegin() { return m_list.cbegin(); } + inline std::list::const_iterator cend() { return m_list.cend(); } inline int size() { return static_cast(m_list.size()); } // TODO: change to size_t inline bool empty() { return m_list.empty(); } - void push(EQEmu::ItemInstance* inst); - void push_front(EQEmu::ItemInstance* inst); - EQEmu::ItemInstance* pop(); - EQEmu::ItemInstance* pop_back(); - EQEmu::ItemInstance* peek_front() const; + void push(EQ::ItemInstance* inst); + void push_front(EQ::ItemInstance* inst); + EQ::ItemInstance* pop(); + EQ::ItemInstance* pop_back(); + EQ::ItemInstance* peek_front() const; protected: ///////////////////////// // Protected Members ///////////////////////// - std::list m_list; + std::list m_list; }; // ######################################## -// Class: EQEmu::InventoryProfile +// Class: EQ::InventoryProfile // Character inventory -namespace EQEmu +namespace EQ { class InventoryProfile { diff --git a/common/inventory_slot.cpp b/common/inventory_slot.cpp index 21af3eb45..b86b5ca91 100644 --- a/common/inventory_slot.cpp +++ b/common/inventory_slot.cpp @@ -22,7 +22,7 @@ #include "string_util.h" -int8 EQEmu::inventory::ConvertEquipmentIndexToTextureIndex(int16 slot_index) +int8 EQ::inventory::ConvertEquipmentIndexToTextureIndex(int16 slot_index) { switch (slot_index) { case invslot::slotHead: @@ -48,7 +48,7 @@ int8 EQEmu::inventory::ConvertEquipmentIndexToTextureIndex(int16 slot_index) } } -int8 EQEmu::inventory::ConvertEquipmentSlotToTextureIndex(const InventorySlot& inventory_slot) +int8 EQ::inventory::ConvertEquipmentSlotToTextureIndex(const InventorySlot& inventory_slot) { if ((!inventory_slot.Typeless() && !inventory_slot.IsTypeIndex(invtype::typePossessions)) || !inventory_slot.IsContainerIndex(invbag::SLOT_INVALID) || !inventory_slot.IsSocketIndex(invaug::SOCKET_INVALID)) return textures::textureInvalid; @@ -56,7 +56,7 @@ int8 EQEmu::inventory::ConvertEquipmentSlotToTextureIndex(const InventorySlot& i return ConvertEquipmentIndexToTextureIndex(inventory_slot.SlotIndex()); } -int16 EQEmu::inventory::ConvertTextureIndexToEquipmentIndex(int8 texture_index) +int16 EQ::inventory::ConvertTextureIndexToEquipmentIndex(int8 texture_index) { switch (texture_index) { case textures::armorHead: @@ -82,7 +82,7 @@ int16 EQEmu::inventory::ConvertTextureIndexToEquipmentIndex(int8 texture_index) } } -bool EQEmu::InventorySlot::IsValidSlot() const +bool EQ::InventorySlot::IsValidSlot() const { if (_typeless) return false; @@ -100,7 +100,7 @@ bool EQEmu::InventorySlot::IsValidSlot() const return true; } -bool EQEmu::InventorySlot::IsDeleteSlot() const +bool EQ::InventorySlot::IsDeleteSlot() const { if (_typeless) return (_slot_index == invslot::SLOT_INVALID && _container_index == invbag::SLOT_INVALID && _socket_index == invaug::SOCKET_INVALID); @@ -108,7 +108,7 @@ bool EQEmu::InventorySlot::IsDeleteSlot() const return (_type_index == invtype::TYPE_INVALID && _slot_index == invslot::SLOT_INVALID && _container_index == invbag::SLOT_INVALID && _socket_index == invaug::SOCKET_INVALID); } -bool EQEmu::InventorySlot::IsEquipmentIndex(int16 slot_index) +bool EQ::InventorySlot::IsEquipmentIndex(int16 slot_index) { if (slot_index < invslot::EQUIPMENT_BEGIN || slot_index > invslot::EQUIPMENT_END) return false; @@ -116,7 +116,7 @@ bool EQEmu::InventorySlot::IsEquipmentIndex(int16 slot_index) return true; } -bool EQEmu::InventorySlot::IsGeneralIndex(int16 slot_index) +bool EQ::InventorySlot::IsGeneralIndex(int16 slot_index) { if (slot_index < invslot::GENERAL_BEGIN || slot_index > invslot::GENERAL_END) return false; @@ -124,7 +124,7 @@ bool EQEmu::InventorySlot::IsGeneralIndex(int16 slot_index) return true; } -bool EQEmu::InventorySlot::IsCursorIndex(int16 slot_index) +bool EQ::InventorySlot::IsCursorIndex(int16 slot_index) { if (slot_index == invslot::slotCursor) return true; @@ -132,7 +132,7 @@ bool EQEmu::InventorySlot::IsCursorIndex(int16 slot_index) return false; } -bool EQEmu::InventorySlot::IsWeaponIndex(int16 slot_index) +bool EQ::InventorySlot::IsWeaponIndex(int16 slot_index) { if (slot_index == invslot::slotPrimary || slot_index == invslot::slotSecondary || slot_index == invslot::slotRange) return true; @@ -140,7 +140,7 @@ bool EQEmu::InventorySlot::IsWeaponIndex(int16 slot_index) return false; } -bool EQEmu::InventorySlot::IsTextureIndex(int16 slot_index) +bool EQ::InventorySlot::IsTextureIndex(int16 slot_index) { switch (slot_index) { case invslot::slotHead: @@ -158,7 +158,7 @@ bool EQEmu::InventorySlot::IsTextureIndex(int16 slot_index) } } -bool EQEmu::InventorySlot::IsTintableIndex(int16 slot_index) +bool EQ::InventorySlot::IsTintableIndex(int16 slot_index) { switch (slot_index) { case invslot::slotHead: @@ -174,7 +174,7 @@ bool EQEmu::InventorySlot::IsTintableIndex(int16 slot_index) } } -bool EQEmu::InventorySlot::IsEquipmentSlot() const +bool EQ::InventorySlot::IsEquipmentSlot() const { if (!_typeless && (_type_index != invtype::typePossessions)) return false; @@ -185,7 +185,7 @@ bool EQEmu::InventorySlot::IsEquipmentSlot() const return IsEquipmentIndex(_slot_index); } -bool EQEmu::InventorySlot::IsGeneralSlot() const +bool EQ::InventorySlot::IsGeneralSlot() const { if (!_typeless && (_type_index != invtype::typePossessions)) return false; @@ -196,7 +196,7 @@ bool EQEmu::InventorySlot::IsGeneralSlot() const return IsGeneralIndex(_socket_index); } -bool EQEmu::InventorySlot::IsCursorSlot() const +bool EQ::InventorySlot::IsCursorSlot() const { if (!_typeless && (_type_index != invtype::typePossessions)) return false; @@ -207,7 +207,7 @@ bool EQEmu::InventorySlot::IsCursorSlot() const return IsCursorIndex(_slot_index); } -bool EQEmu::InventorySlot::IsWeaponSlot() const +bool EQ::InventorySlot::IsWeaponSlot() const { if (!_typeless && (_type_index != invtype::typePossessions)) return false; @@ -218,7 +218,7 @@ bool EQEmu::InventorySlot::IsWeaponSlot() const return IsWeaponIndex(_slot_index); } -bool EQEmu::InventorySlot::IsTextureSlot() const +bool EQ::InventorySlot::IsTextureSlot() const { if (!_typeless && (_type_index != invtype::typePossessions)) return false; @@ -229,7 +229,7 @@ bool EQEmu::InventorySlot::IsTextureSlot() const return IsTextureIndex(_slot_index); } -bool EQEmu::InventorySlot::IsTintableSlot() const +bool EQ::InventorySlot::IsTintableSlot() const { if (!_typeless && (_type_index != invtype::typePossessions)) return false; @@ -240,7 +240,7 @@ bool EQEmu::InventorySlot::IsTintableSlot() const return IsTintableIndex(_slot_index); } -bool EQEmu::InventorySlot::IsSlot() const +bool EQ::InventorySlot::IsSlot() const { if (!_typeless && (_type_index == invtype::TYPE_INVALID)) return false; @@ -254,7 +254,7 @@ bool EQEmu::InventorySlot::IsSlot() const return true; } -bool EQEmu::InventorySlot::IsSlotSocket() const +bool EQ::InventorySlot::IsSlotSocket() const { if (!_typeless && (_type_index == invtype::TYPE_INVALID)) return false; @@ -268,7 +268,7 @@ bool EQEmu::InventorySlot::IsSlotSocket() const return true; } -bool EQEmu::InventorySlot::IsContainer() const +bool EQ::InventorySlot::IsContainer() const { if (!_typeless && (_type_index == invtype::TYPE_INVALID)) return false; @@ -282,7 +282,7 @@ bool EQEmu::InventorySlot::IsContainer() const return true; } -bool EQEmu::InventorySlot::IsContainerSocket() const +bool EQ::InventorySlot::IsContainerSocket() const { if (!_typeless && (_type_index == invtype::TYPE_INVALID)) return false; @@ -296,12 +296,12 @@ bool EQEmu::InventorySlot::IsContainerSocket() const return true; } -EQEmu::InventorySlot EQEmu::InventorySlot::ToTopOwner() const +EQ::InventorySlot EQ::InventorySlot::ToTopOwner() const { return InventorySlot(_type_index, _slot_index); } -EQEmu::InventorySlot EQEmu::InventorySlot::ToOwner() const +EQ::InventorySlot EQ::InventorySlot::ToOwner() const { if (IsSlot() || IsSlotSocket() || IsContainer()) return InventorySlot(_type_index, _slot_index); @@ -312,17 +312,17 @@ EQEmu::InventorySlot EQEmu::InventorySlot::ToOwner() const return InventorySlot(); } -const std::string EQEmu::InventorySlot::ToString() const +const std::string EQ::InventorySlot::ToString() const { return StringFormat("(%i%s, %i, %i, %i)", _type_index, (_typeless ? " [typeless]" : ""), _slot_index, _container_index, _socket_index); } -const std::string EQEmu::InventorySlot::ToName() const +const std::string EQ::InventorySlot::ToName() const { return StringFormat("InventorySlot - _type_index: %i%s, _slot_index: %i, _container_index: %i, _socket_index: %i", _type_index, (_typeless ? " [typeless]" : ""), _slot_index, _container_index, _socket_index); } -void EQEmu::InventorySlot::SetInvalidSlot() +void EQ::InventorySlot::SetInvalidSlot() { _type_index = invtype::TYPE_INVALID; _slot_index = invslot::SLOT_INVALID; @@ -330,7 +330,7 @@ void EQEmu::InventorySlot::SetInvalidSlot() _socket_index = invaug::SOCKET_INVALID; } -//bool EQEmu::InventorySlot::IsBonusIndex(int16 slot_index) +//bool EQ::InventorySlot::IsBonusIndex(int16 slot_index) //{ // if ((slot_index >= inventory::EquipmentBegin) && (slot_index <= inventory::EquipmentEnd) && (slot_index != inventory::slotAmmo)) // return true; @@ -338,7 +338,7 @@ void EQEmu::InventorySlot::SetInvalidSlot() // return false; //} -//bool EQEmu::InventorySlot::IsBonusSlot() const +//bool EQ::InventorySlot::IsBonusSlot() const //{ // if ((_type_index != inventory::typePossessions) || (_container_index != inventory::containerInvalid) || (_socket_index != inventory::socketInvalid)) // return false; @@ -346,7 +346,7 @@ void EQEmu::InventorySlot::SetInvalidSlot() // return IsBonusIndex(_slot_index); //} -bool inventory_slot_typeless_lessthan(const EQEmu::InventorySlot& lhs, const EQEmu::InventorySlot& rhs) +bool inventory_slot_typeless_lessthan(const EQ::InventorySlot& lhs, const EQ::InventorySlot& rhs) { if (lhs.SlotIndex() < rhs.SlotIndex()) return true; @@ -360,7 +360,7 @@ bool inventory_slot_typeless_lessthan(const EQEmu::InventorySlot& lhs, const EQE return false; } -bool EQEmu::InventorySlot::operator<(const InventorySlot& rhs) const +bool EQ::InventorySlot::operator<(const InventorySlot& rhs) const { if (Typeless() || rhs.Typeless()) return inventory_slot_typeless_lessthan(*this, rhs); @@ -380,7 +380,7 @@ bool EQEmu::InventorySlot::operator<(const InventorySlot& rhs) const return false; } -bool EQEmu::operator==(const InventorySlot& lhs, const InventorySlot& rhs) +bool EQ::operator==(const InventorySlot& lhs, const InventorySlot& rhs) { if (lhs.Typeless() || rhs.Typeless()) return ((lhs.SlotIndex() == rhs.SlotIndex()) && (lhs.ContainerIndex() == rhs.ContainerIndex()) && (lhs.SocketIndex() == rhs.SocketIndex())); diff --git a/common/inventory_slot.h b/common/inventory_slot.h index 967673f99..d61d8acb0 100644 --- a/common/inventory_slot.h +++ b/common/inventory_slot.h @@ -23,7 +23,7 @@ #include "emu_constants.h" -namespace EQEmu +namespace EQ { class InventorySlot; diff --git a/common/ipc_mutex.cpp b/common/ipc_mutex.cpp index 75e0a63a1..5eb4eedfc 100644 --- a/common/ipc_mutex.cpp +++ b/common/ipc_mutex.cpp @@ -31,7 +31,7 @@ #include "eqemu_exception.h" #include "eqemu_config.h" -namespace EQEmu { +namespace EQ { struct IPCMutex::Implementation { #ifdef _WINDOWS HANDLE mut_; diff --git a/common/ipc_mutex.h b/common/ipc_mutex.h index ab0af4817..a8f2fd13c 100644 --- a/common/ipc_mutex.h +++ b/common/ipc_mutex.h @@ -21,7 +21,7 @@ #include -namespace EQEmu { +namespace EQ { //! Interprocess Named Binary Semaphore (Mutex) /*! diff --git a/common/item_data.cpp b/common/item_data.cpp index c0e70d72a..f3e13edf7 100644 --- a/common/item_data.cpp +++ b/common/item_data.cpp @@ -23,7 +23,7 @@ //#include "deity.h" -uint32 EQEmu::item::ConvertAugTypeToAugTypeBit(uint8 aug_type) +uint32 EQ::item::ConvertAugTypeToAugTypeBit(uint8 aug_type) { switch (aug_type) { case AugTypeGeneralSingleStat: @@ -95,7 +95,7 @@ uint32 EQEmu::item::ConvertAugTypeToAugTypeBit(uint8 aug_type) } } -uint8 EQEmu::item::ConvertAugTypeBitToAugType(uint32 aug_type_bit) +uint8 EQ::item::ConvertAugTypeBitToAugType(uint32 aug_type_bit) { switch (aug_type_bit) { case bit_AugTypeGeneralSingleStat: @@ -167,7 +167,7 @@ uint8 EQEmu::item::ConvertAugTypeBitToAugType(uint32 aug_type_bit) } } -bool EQEmu::ItemData::IsEquipable(uint16 race_id, uint16 class_id) const +bool EQ::ItemData::IsEquipable(uint16 race_id, uint16 class_id) const { if (!(Races & GetPlayerRaceBit(race_id))) return false; @@ -178,37 +178,37 @@ bool EQEmu::ItemData::IsEquipable(uint16 race_id, uint16 class_id) const return true; } -bool EQEmu::ItemData::IsClassCommon() const +bool EQ::ItemData::IsClassCommon() const { return (ItemClass == item::ItemClassCommon); } -bool EQEmu::ItemData::IsClassBag() const +bool EQ::ItemData::IsClassBag() const { return (ItemClass == item::ItemClassBag); } -bool EQEmu::ItemData::IsClassBook() const +bool EQ::ItemData::IsClassBook() const { return (ItemClass == item::ItemClassBook); } -bool EQEmu::ItemData::IsType1HWeapon() const +bool EQ::ItemData::IsType1HWeapon() const { return ((ItemType == item::ItemType1HBlunt) || (ItemType == item::ItemType1HSlash) || (ItemType == item::ItemType1HPiercing) || (ItemType == item::ItemTypeMartial)); } -bool EQEmu::ItemData::IsType2HWeapon() const +bool EQ::ItemData::IsType2HWeapon() const { return ((ItemType == item::ItemType2HBlunt) || (ItemType == item::ItemType2HSlash) || (ItemType == item::ItemType2HPiercing)); } -bool EQEmu::ItemData::IsTypeShield() const +bool EQ::ItemData::IsTypeShield() const { return (ItemType == item::ItemTypeShield); } -bool EQEmu::ItemData::CheckLoreConflict(const ItemData* l_item, const ItemData* r_item) +bool EQ::ItemData::CheckLoreConflict(const ItemData* l_item, const ItemData* r_item) { if (!l_item || !r_item) return false; diff --git a/common/item_data.h b/common/item_data.h index 58bc4c889..d3ae5f928 100644 --- a/common/item_data.h +++ b/common/item_data.h @@ -47,7 +47,7 @@ #include "emu_constants.h" -namespace EQEmu +namespace EQ { namespace item { enum ItemClass { @@ -434,6 +434,7 @@ namespace EQEmu //uint32 Unk054; int16 MaxCharges; // Maximum charges items can hold: -1 if not a chargeable item uint8 ItemType; // Item Type/Skill (itemClass* from above) + int32 SubType; // Some items have sub types that can be used for other things (unbreakable fishing poles, SE_FFItemClass) uint8 Material; // Item material type uint32 HerosForgeModel;// Hero's Forge Armor Model Type (2-13?) float SellRate; // Sell rate diff --git a/common/item_fieldlist.h b/common/item_fieldlist.h index 665783498..3c00f1e44 100644 --- a/common/item_fieldlist.h +++ b/common/item_fieldlist.h @@ -203,3 +203,4 @@ F(procname) F(wornname) F(focusname) F(scrollname) +F(subtype) diff --git a/common/item_instance.cpp b/common/item_instance.cpp index 2c186e066..d0bbbca50 100644 --- a/common/item_instance.cpp +++ b/common/item_instance.cpp @@ -54,9 +54,9 @@ static inline int32 GetNextItemInstSerialNumber() { } // -// class EQEmu::ItemInstance +// class EQ::ItemInstance // -EQEmu::ItemInstance::ItemInstance(const ItemData* item, int16 charges) { +EQ::ItemInstance::ItemInstance(const ItemData* item, int16 charges) { m_use_type = ItemInstNormal; if(item) { m_item = new ItemData(*item); @@ -87,7 +87,7 @@ EQEmu::ItemInstance::ItemInstance(const ItemData* item, int16 charges) { m_new_id_file = 0; } -EQEmu::ItemInstance::ItemInstance(SharedDatabase *db, uint32 item_id, int16 charges) { +EQ::ItemInstance::ItemInstance(SharedDatabase *db, uint32 item_id, int16 charges) { m_use_type = ItemInstNormal; m_item = db->GetItem(item_id); if(m_item) { @@ -121,7 +121,7 @@ EQEmu::ItemInstance::ItemInstance(SharedDatabase *db, uint32 item_id, int16 char m_new_id_file = 0; } -EQEmu::ItemInstance::ItemInstance(ItemInstTypes use_type) { +EQ::ItemInstance::ItemInstance(ItemInstTypes use_type) { m_use_type = use_type; m_item = nullptr; m_charges = 0; @@ -143,8 +143,8 @@ EQEmu::ItemInstance::ItemInstance(ItemInstTypes use_type) { m_new_id_file = 0; } -// Make a copy of an EQEmu::ItemInstance object -EQEmu::ItemInstance::ItemInstance(const ItemInstance& copy) +// Make a copy of an EQ::ItemInstance object +EQ::ItemInstance::ItemInstance(const ItemInstance& copy) { m_use_type=copy.m_use_type; if(copy.m_item) @@ -202,7 +202,7 @@ EQEmu::ItemInstance::ItemInstance(const ItemInstance& copy) } // Clean up container contents -EQEmu::ItemInstance::~ItemInstance() +EQ::ItemInstance::~ItemInstance() { Clear(); safe_delete(m_item); @@ -211,7 +211,7 @@ EQEmu::ItemInstance::~ItemInstance() } // Query item type -bool EQEmu::ItemInstance::IsType(item::ItemClass item_class) const +bool EQ::ItemInstance::IsType(item::ItemClass item_class) const { // IsType() does not protect against 'm_item = nullptr' @@ -225,23 +225,23 @@ bool EQEmu::ItemInstance::IsType(item::ItemClass item_class) const return (m_item->ItemClass == item_class); } -bool EQEmu::ItemInstance::IsClassCommon() const +bool EQ::ItemInstance::IsClassCommon() const { return (m_item && m_item->IsClassCommon()); } -bool EQEmu::ItemInstance::IsClassBag() const +bool EQ::ItemInstance::IsClassBag() const { return (m_item && m_item->IsClassBag()); } -bool EQEmu::ItemInstance::IsClassBook() const +bool EQ::ItemInstance::IsClassBook() const { return (m_item && m_item->IsClassBook()); } // Is item stackable? -bool EQEmu::ItemInstance::IsStackable() const +bool EQ::ItemInstance::IsStackable() const { if (!m_item) return false; @@ -249,7 +249,7 @@ bool EQEmu::ItemInstance::IsStackable() const return m_item->Stackable; } -bool EQEmu::ItemInstance::IsCharged() const +bool EQ::ItemInstance::IsCharged() const { if (!m_item) return false; @@ -261,7 +261,7 @@ bool EQEmu::ItemInstance::IsCharged() const } // Can item be equipped? -bool EQEmu::ItemInstance::IsEquipable(uint16 race, uint16 class_) const +bool EQ::ItemInstance::IsEquipable(uint16 race, uint16 class_) const { if (!m_item || (m_item->Slots == 0)) return false; @@ -270,18 +270,18 @@ bool EQEmu::ItemInstance::IsEquipable(uint16 race, uint16 class_) const } // Can equip at this slot? -bool EQEmu::ItemInstance::IsEquipable(int16 slot_id) const +bool EQ::ItemInstance::IsEquipable(int16 slot_id) const { if (!m_item) return false; - if (slot_id < EQEmu::invslot::EQUIPMENT_BEGIN || slot_id > EQEmu::invslot::EQUIPMENT_END) + if (slot_id < EQ::invslot::EQUIPMENT_BEGIN || slot_id > EQ::invslot::EQUIPMENT_END) return false; return ((m_item->Slots & (1 << slot_id)) != 0); } -bool EQEmu::ItemInstance::IsAugmentable() const +bool EQ::ItemInstance::IsAugmentable() const { if (!m_item) return false; @@ -294,7 +294,7 @@ bool EQEmu::ItemInstance::IsAugmentable() const return false; } -bool EQEmu::ItemInstance::AvailableWearSlot(uint32 aug_wear_slots) const { +bool EQ::ItemInstance::AvailableWearSlot(uint32 aug_wear_slots) const { if (!m_item || !m_item->IsClassCommon()) return false; @@ -306,10 +306,10 @@ bool EQEmu::ItemInstance::AvailableWearSlot(uint32 aug_wear_slots) const { } } - return (index <= EQEmu::invslot::EQUIPMENT_END); + return (index <= EQ::invslot::EQUIPMENT_END); } -int8 EQEmu::ItemInstance::AvailableAugmentSlot(int32 augtype) const +int8 EQ::ItemInstance::AvailableAugmentSlot(int32 augtype) const { if (!m_item || !m_item->IsClassCommon()) return INVALID_INDEX; @@ -324,7 +324,7 @@ int8 EQEmu::ItemInstance::AvailableAugmentSlot(int32 augtype) const return (index <= invaug::SOCKET_END) ? index : INVALID_INDEX; } -bool EQEmu::ItemInstance::IsAugmentSlotAvailable(int32 augtype, uint8 slot) const +bool EQ::ItemInstance::IsAugmentSlotAvailable(int32 augtype, uint8 slot) const { if (!m_item || !m_item->IsClassCommon()) return false; @@ -336,7 +336,7 @@ bool EQEmu::ItemInstance::IsAugmentSlotAvailable(int32 augtype, uint8 slot) cons } // Retrieve item inside container -EQEmu::ItemInstance* EQEmu::ItemInstance::GetItem(uint8 index) const +EQ::ItemInstance* EQ::ItemInstance::GetItem(uint8 index) const { auto it = m_contents.find(index); if (it != m_contents.end()) { @@ -346,7 +346,7 @@ EQEmu::ItemInstance* EQEmu::ItemInstance::GetItem(uint8 index) const return nullptr; } -uint32 EQEmu::ItemInstance::GetItemID(uint8 slot) const +uint32 EQ::ItemInstance::GetItemID(uint8 slot) const { ItemInstance *item = GetItem(slot); if (item) @@ -355,7 +355,7 @@ uint32 EQEmu::ItemInstance::GetItemID(uint8 slot) const return 0; } -void EQEmu::ItemInstance::PutItem(uint8 index, const ItemInstance& inst) +void EQ::ItemInstance::PutItem(uint8 index, const ItemInstance& inst) { // Clean up item already in slot (if exists) DeleteItem(index); @@ -365,7 +365,7 @@ void EQEmu::ItemInstance::PutItem(uint8 index, const ItemInstance& inst) } // Remove item inside container -void EQEmu::ItemInstance::DeleteItem(uint8 index) +void EQ::ItemInstance::DeleteItem(uint8 index) { ItemInstance* inst = PopItem(index); safe_delete(inst); @@ -373,7 +373,7 @@ void EQEmu::ItemInstance::DeleteItem(uint8 index) // Remove item from container without memory delete // Hands over memory ownership to client of this function call -EQEmu::ItemInstance* EQEmu::ItemInstance::PopItem(uint8 index) +EQ::ItemInstance* EQ::ItemInstance::PopItem(uint8 index) { auto iter = m_contents.find(index); if (iter != m_contents.end()) { @@ -386,7 +386,7 @@ EQEmu::ItemInstance* EQEmu::ItemInstance::PopItem(uint8 index) } // Remove all items from container -void EQEmu::ItemInstance::Clear() +void EQ::ItemInstance::Clear() { // Destroy container contents for (auto iter = m_contents.begin(); iter != m_contents.end(); ++iter) { @@ -396,7 +396,7 @@ void EQEmu::ItemInstance::Clear() } // Remove all items from container -void EQEmu::ItemInstance::ClearByFlags(byFlagSetting is_nodrop, byFlagSetting is_norent) +void EQ::ItemInstance::ClearByFlags(byFlagSetting is_nodrop, byFlagSetting is_norent) { // TODO: This needs work... @@ -458,7 +458,7 @@ void EQEmu::ItemInstance::ClearByFlags(byFlagSetting is_nodrop, byFlagSetting is } } -uint8 EQEmu::ItemInstance::FirstOpenSlot() const +uint8 EQ::ItemInstance::FirstOpenSlot() const { if (!m_item) return INVALID_INDEX; @@ -472,7 +472,7 @@ uint8 EQEmu::ItemInstance::FirstOpenSlot() const return (i < slots) ? i : INVALID_INDEX; } -uint8 EQEmu::ItemInstance::GetTotalItemCount() const +uint8 EQ::ItemInstance::GetTotalItemCount() const { if (!m_item) return 0; @@ -486,7 +486,7 @@ uint8 EQEmu::ItemInstance::GetTotalItemCount() const return item_count; } -bool EQEmu::ItemInstance::IsNoneEmptyContainer() +bool EQ::ItemInstance::IsNoneEmptyContainer() { if (!m_item || !m_item->IsClassBag()) return false; @@ -500,7 +500,7 @@ bool EQEmu::ItemInstance::IsNoneEmptyContainer() } // Retrieve augment inside item -EQEmu::ItemInstance* EQEmu::ItemInstance::GetAugment(uint8 slot) const +EQ::ItemInstance* EQ::ItemInstance::GetAugment(uint8 slot) const { if (m_item && m_item->IsClassCommon()) return GetItem(slot); @@ -508,7 +508,7 @@ EQEmu::ItemInstance* EQEmu::ItemInstance::GetAugment(uint8 slot) const return nullptr; } -EQEmu::ItemInstance* EQEmu::ItemInstance::GetOrnamentationAug(int32 ornamentationAugtype) const +EQ::ItemInstance* EQ::ItemInstance::GetOrnamentationAug(int32 ornamentationAugtype) const { if (!m_item || !m_item->IsClassCommon()) { return nullptr; } if (ornamentationAugtype == 0) { return nullptr; } @@ -533,7 +533,7 @@ EQEmu::ItemInstance* EQEmu::ItemInstance::GetOrnamentationAug(int32 ornamentatio return nullptr; } -uint32 EQEmu::ItemInstance::GetOrnamentHeroModel(int32 material_slot) const { +uint32 EQ::ItemInstance::GetOrnamentHeroModel(int32 material_slot) const { // Not a Hero Forge item. if (m_ornament_hero_model == 0 || material_slot < 0) return 0; @@ -546,7 +546,7 @@ uint32 EQEmu::ItemInstance::GetOrnamentHeroModel(int32 material_slot) const { return (m_ornament_hero_model * 100) + material_slot; } -bool EQEmu::ItemInstance::UpdateOrnamentationInfo() { +bool EQ::ItemInstance::UpdateOrnamentationInfo() { if (!m_item || !m_item->IsClassCommon()) return false; @@ -582,7 +582,7 @@ bool EQEmu::ItemInstance::UpdateOrnamentationInfo() { return ornamentSet; } -bool EQEmu::ItemInstance::CanTransform(const ItemData *ItemToTry, const ItemData *Container, bool AllowAll) { +bool EQ::ItemInstance::CanTransform(const ItemData *ItemToTry, const ItemData *Container, bool AllowAll) { if (!ItemToTry || !Container) return false; if (ItemToTry->ItemType == item::ItemTypeArrow || strnlen(Container->CharmFile, 30) == 0) @@ -629,7 +629,7 @@ bool EQEmu::ItemInstance::CanTransform(const ItemData *ItemToTry, const ItemData return false; } -uint32 EQEmu::ItemInstance::GetAugmentItemID(uint8 slot) const +uint32 EQ::ItemInstance::GetAugmentItemID(uint8 slot) const { if (!m_item || !m_item->IsClassCommon()) return 0; @@ -638,7 +638,7 @@ uint32 EQEmu::ItemInstance::GetAugmentItemID(uint8 slot) const } // Add an augment to the item -void EQEmu::ItemInstance::PutAugment(uint8 slot, const ItemInstance& augment) +void EQ::ItemInstance::PutAugment(uint8 slot, const ItemInstance& augment) { if (!m_item || !m_item->IsClassCommon()) return; @@ -646,7 +646,7 @@ void EQEmu::ItemInstance::PutAugment(uint8 slot, const ItemInstance& augment) PutItem(slot, augment); } -void EQEmu::ItemInstance::PutAugment(SharedDatabase *db, uint8 slot, uint32 item_id) +void EQ::ItemInstance::PutAugment(SharedDatabase *db, uint8 slot, uint32 item_id) { if (item_id == 0) { return; } if (db == nullptr) { return; /* TODO: add log message for nullptr */ } @@ -659,7 +659,7 @@ void EQEmu::ItemInstance::PutAugment(SharedDatabase *db, uint8 slot, uint32 item } // Remove augment from item and destroy it -void EQEmu::ItemInstance::DeleteAugment(uint8 index) +void EQ::ItemInstance::DeleteAugment(uint8 index) { if (!m_item || !m_item->IsClassCommon()) return; @@ -668,7 +668,7 @@ void EQEmu::ItemInstance::DeleteAugment(uint8 index) } // Remove augment from item and return it -EQEmu::ItemInstance* EQEmu::ItemInstance::RemoveAugment(uint8 index) +EQ::ItemInstance* EQ::ItemInstance::RemoveAugment(uint8 index) { if (!m_item || !m_item->IsClassCommon()) return nullptr; @@ -676,7 +676,7 @@ EQEmu::ItemInstance* EQEmu::ItemInstance::RemoveAugment(uint8 index) return PopItem(index); } -bool EQEmu::ItemInstance::IsAugmented() +bool EQ::ItemInstance::IsAugmented() { if (!m_item || !m_item->IsClassCommon()) return false; @@ -690,7 +690,7 @@ bool EQEmu::ItemInstance::IsAugmented() } // Has attack/delay? -bool EQEmu::ItemInstance::IsWeapon() const +bool EQ::ItemInstance::IsWeapon() const { if (!m_item || !m_item->IsClassCommon()) return false; @@ -701,7 +701,7 @@ bool EQEmu::ItemInstance::IsWeapon() const return ((m_item->Damage != 0) && (m_item->Delay != 0)); } -bool EQEmu::ItemInstance::IsAmmo() const +bool EQ::ItemInstance::IsAmmo() const { if (!m_item) return false; @@ -717,7 +717,7 @@ bool EQEmu::ItemInstance::IsAmmo() const } -const EQEmu::ItemData* EQEmu::ItemInstance::GetItem() const +const EQ::ItemData* EQ::ItemInstance::GetItem() const { if (!m_item) return nullptr; @@ -728,13 +728,13 @@ const EQEmu::ItemData* EQEmu::ItemInstance::GetItem() const return m_item; } -const EQEmu::ItemData* EQEmu::ItemInstance::GetUnscaledItem() const +const EQ::ItemData* EQ::ItemInstance::GetUnscaledItem() const { // No operator calls and defaults to nullptr return m_item; } -std::string EQEmu::ItemInstance::GetCustomDataString() const { +std::string EQ::ItemInstance::GetCustomDataString() const { std::string ret_val; auto iter = m_custom_data.begin(); while (iter != m_custom_data.end()) { @@ -753,7 +753,7 @@ std::string EQEmu::ItemInstance::GetCustomDataString() const { return ret_val; } -std::string EQEmu::ItemInstance::GetCustomData(std::string identifier) { +std::string EQ::ItemInstance::GetCustomData(std::string identifier) { std::map::const_iterator iter = m_custom_data.find(identifier); if (iter != m_custom_data.end()) { return iter->second; @@ -762,49 +762,49 @@ std::string EQEmu::ItemInstance::GetCustomData(std::string identifier) { return ""; } -void EQEmu::ItemInstance::SetCustomData(std::string identifier, std::string value) { +void EQ::ItemInstance::SetCustomData(std::string identifier, std::string value) { DeleteCustomData(identifier); m_custom_data[identifier] = value; } -void EQEmu::ItemInstance::SetCustomData(std::string identifier, int value) { +void EQ::ItemInstance::SetCustomData(std::string identifier, int value) { DeleteCustomData(identifier); std::stringstream ss; ss << value; m_custom_data[identifier] = ss.str(); } -void EQEmu::ItemInstance::SetCustomData(std::string identifier, float value) { +void EQ::ItemInstance::SetCustomData(std::string identifier, float value) { DeleteCustomData(identifier); std::stringstream ss; ss << value; m_custom_data[identifier] = ss.str(); } -void EQEmu::ItemInstance::SetCustomData(std::string identifier, bool value) { +void EQ::ItemInstance::SetCustomData(std::string identifier, bool value) { DeleteCustomData(identifier); std::stringstream ss; ss << value; m_custom_data[identifier] = ss.str(); } -void EQEmu::ItemInstance::DeleteCustomData(std::string identifier) { +void EQ::ItemInstance::DeleteCustomData(std::string identifier) { auto iter = m_custom_data.find(identifier); if (iter != m_custom_data.end()) { m_custom_data.erase(iter); } } -// Clone a type of EQEmu::ItemInstance object +// Clone a type of EQ::ItemInstance object // c++ doesn't allow a polymorphic copy constructor, // so we have to resort to a polymorphic Clone() -EQEmu::ItemInstance* EQEmu::ItemInstance::Clone() const +EQ::ItemInstance* EQ::ItemInstance::Clone() const { // Pseudo-polymorphic copy constructor return new ItemInstance(*this); } -bool EQEmu::ItemInstance::IsSlotAllowed(int16 slot_id) const { +bool EQ::ItemInstance::IsSlotAllowed(int16 slot_id) const { if (!m_item) { return false; } else if (InventoryProfile::SupportsContainers(slot_id)) { return true; } else if (m_item->Slots & (1 << slot_id)) { return true; } @@ -812,7 +812,7 @@ bool EQEmu::ItemInstance::IsSlotAllowed(int16 slot_id) const { else { return false; } } -bool EQEmu::ItemInstance::IsDroppable(bool recurse) const +bool EQ::ItemInstance::IsDroppable(bool recurse) const { if (!m_item) return false; @@ -838,7 +838,7 @@ bool EQEmu::ItemInstance::IsDroppable(bool recurse) const return true; } -void EQEmu::ItemInstance::Initialize(SharedDatabase *db) { +void EQ::ItemInstance::Initialize(SharedDatabase *db) { // if there's no actual item, don't do anything if (!m_item) return; @@ -855,7 +855,7 @@ void EQEmu::ItemInstance::Initialize(SharedDatabase *db) { } } -void EQEmu::ItemInstance::ScaleItem() { +void EQ::ItemInstance::ScaleItem() { if (!m_item) return; @@ -939,18 +939,18 @@ void EQEmu::ItemInstance::ScaleItem() { m_scaledItem->CharmFileID = 0; // this stops the client from trying to scale the item itself. } -bool EQEmu::ItemInstance::EvolveOnAllKills() const { +bool EQ::ItemInstance::EvolveOnAllKills() const { return (m_evolveInfo && m_evolveInfo->AllKills); } -int8 EQEmu::ItemInstance::GetMaxEvolveLvl() const { +int8 EQ::ItemInstance::GetMaxEvolveLvl() const { if (m_evolveInfo) return m_evolveInfo->MaxLvl; else return 0; } -uint32 EQEmu::ItemInstance::GetKillsNeeded(uint8 currentlevel) { +uint32 EQ::ItemInstance::GetKillsNeeded(uint8 currentlevel) { uint32 kills = -1; // default to -1 (max uint32 value) because this value is usually divided by, so we don't want to ever return zero. if (m_evolveInfo) if (currentlevel != m_evolveInfo->MaxLvl) @@ -962,24 +962,24 @@ uint32 EQEmu::ItemInstance::GetKillsNeeded(uint8 currentlevel) { return kills; } -void EQEmu::ItemInstance::SetTimer(std::string name, uint32 time) { +void EQ::ItemInstance::SetTimer(std::string name, uint32 time) { Timer t(time); t.Start(time, false); m_timers[name] = t; } -void EQEmu::ItemInstance::StopTimer(std::string name) { +void EQ::ItemInstance::StopTimer(std::string name) { auto iter = m_timers.find(name); if(iter != m_timers.end()) { m_timers.erase(iter); } } -void EQEmu::ItemInstance::ClearTimers() { +void EQ::ItemInstance::ClearTimers() { m_timers.clear(); } -int EQEmu::ItemInstance::GetItemArmorClass(bool augments) const +int EQ::ItemInstance::GetItemArmorClass(bool augments) const { int ac = 0; const auto item = GetItem(); @@ -993,7 +993,7 @@ int EQEmu::ItemInstance::GetItemArmorClass(bool augments) const return ac; } -int EQEmu::ItemInstance::GetItemElementalDamage(int &magic, int &fire, int &cold, int &poison, int &disease, int &chromatic, int &prismatic, int &physical, int &corruption, bool augments) const +int EQ::ItemInstance::GetItemElementalDamage(int &magic, int &fire, int &cold, int &poison, int &disease, int &chromatic, int &prismatic, int &physical, int &corruption, bool augments) const { const auto item = GetItem(); if (item) { @@ -1035,7 +1035,7 @@ int EQEmu::ItemInstance::GetItemElementalDamage(int &magic, int &fire, int &cold return magic + fire + cold + poison + disease + chromatic + prismatic + physical + corruption; } -int EQEmu::ItemInstance::GetItemElementalFlag(bool augments) const +int EQ::ItemInstance::GetItemElementalFlag(bool augments) const { int flag = 0; const auto item = GetItem(); @@ -1056,7 +1056,7 @@ int EQEmu::ItemInstance::GetItemElementalFlag(bool augments) const return flag; } -int EQEmu::ItemInstance::GetItemElementalDamage(bool augments) const +int EQ::ItemInstance::GetItemElementalDamage(bool augments) const { int damage = 0; const auto item = GetItem(); @@ -1077,7 +1077,7 @@ int EQEmu::ItemInstance::GetItemElementalDamage(bool augments) const return damage; } -int EQEmu::ItemInstance::GetItemRecommendedLevel(bool augments) const +int EQ::ItemInstance::GetItemRecommendedLevel(bool augments) const { int level = 0; const auto item = GetItem(); @@ -1099,7 +1099,7 @@ int EQEmu::ItemInstance::GetItemRecommendedLevel(bool augments) const return level; } -int EQEmu::ItemInstance::GetItemRequiredLevel(bool augments) const +int EQ::ItemInstance::GetItemRequiredLevel(bool augments) const { int level = 0; const auto item = GetItem(); @@ -1121,7 +1121,7 @@ int EQEmu::ItemInstance::GetItemRequiredLevel(bool augments) const return level; } -int EQEmu::ItemInstance::GetItemWeaponDamage(bool augments) const +int EQ::ItemInstance::GetItemWeaponDamage(bool augments) const { int damage = 0; const auto item = GetItem(); @@ -1137,7 +1137,7 @@ int EQEmu::ItemInstance::GetItemWeaponDamage(bool augments) const return damage; } -int EQEmu::ItemInstance::GetItemBackstabDamage(bool augments) const +int EQ::ItemInstance::GetItemBackstabDamage(bool augments) const { int damage = 0; const auto item = GetItem(); @@ -1153,7 +1153,7 @@ int EQEmu::ItemInstance::GetItemBackstabDamage(bool augments) const return damage; } -int EQEmu::ItemInstance::GetItemBaneDamageBody(bool augments) const +int EQ::ItemInstance::GetItemBaneDamageBody(bool augments) const { int body = 0; const auto item = GetItem(); @@ -1174,7 +1174,7 @@ int EQEmu::ItemInstance::GetItemBaneDamageBody(bool augments) const return body; } -int EQEmu::ItemInstance::GetItemBaneDamageRace(bool augments) const +int EQ::ItemInstance::GetItemBaneDamageRace(bool augments) const { int race = 0; const auto item = GetItem(); @@ -1195,7 +1195,7 @@ int EQEmu::ItemInstance::GetItemBaneDamageRace(bool augments) const return race; } -int EQEmu::ItemInstance::GetItemBaneDamageBody(bodyType against, bool augments) const +int EQ::ItemInstance::GetItemBaneDamageBody(bodyType against, bool augments) const { int damage = 0; const auto item = GetItem(); @@ -1212,7 +1212,7 @@ int EQEmu::ItemInstance::GetItemBaneDamageBody(bodyType against, bool augments) return damage; } -int EQEmu::ItemInstance::GetItemBaneDamageRace(uint16 against, bool augments) const +int EQ::ItemInstance::GetItemBaneDamageRace(uint16 against, bool augments) const { int damage = 0; const auto item = GetItem(); @@ -1229,7 +1229,7 @@ int EQEmu::ItemInstance::GetItemBaneDamageRace(uint16 against, bool augments) co return damage; } -int EQEmu::ItemInstance::GetItemMagical(bool augments) const +int EQ::ItemInstance::GetItemMagical(bool augments) const { const auto item = GetItem(); if (item) { @@ -1245,7 +1245,7 @@ int EQEmu::ItemInstance::GetItemMagical(bool augments) const return 0; } -int EQEmu::ItemInstance::GetItemHP(bool augments) const +int EQ::ItemInstance::GetItemHP(bool augments) const { int hp = 0; const auto item = GetItem(); @@ -1259,7 +1259,7 @@ int EQEmu::ItemInstance::GetItemHP(bool augments) const return hp; } -int EQEmu::ItemInstance::GetItemMana(bool augments) const +int EQ::ItemInstance::GetItemMana(bool augments) const { int mana = 0; const auto item = GetItem(); @@ -1273,7 +1273,7 @@ int EQEmu::ItemInstance::GetItemMana(bool augments) const return mana; } -int EQEmu::ItemInstance::GetItemEndur(bool augments) const +int EQ::ItemInstance::GetItemEndur(bool augments) const { int endur = 0; const auto item = GetItem(); @@ -1287,7 +1287,7 @@ int EQEmu::ItemInstance::GetItemEndur(bool augments) const return endur; } -int EQEmu::ItemInstance::GetItemAttack(bool augments) const +int EQ::ItemInstance::GetItemAttack(bool augments) const { int atk = 0; const auto item = GetItem(); @@ -1301,7 +1301,7 @@ int EQEmu::ItemInstance::GetItemAttack(bool augments) const return atk; } -int EQEmu::ItemInstance::GetItemStr(bool augments) const +int EQ::ItemInstance::GetItemStr(bool augments) const { int str = 0; const auto item = GetItem(); @@ -1315,7 +1315,7 @@ int EQEmu::ItemInstance::GetItemStr(bool augments) const return str; } -int EQEmu::ItemInstance::GetItemSta(bool augments) const +int EQ::ItemInstance::GetItemSta(bool augments) const { int sta = 0; const auto item = GetItem(); @@ -1329,7 +1329,7 @@ int EQEmu::ItemInstance::GetItemSta(bool augments) const return sta; } -int EQEmu::ItemInstance::GetItemDex(bool augments) const +int EQ::ItemInstance::GetItemDex(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1343,7 +1343,7 @@ int EQEmu::ItemInstance::GetItemDex(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemAgi(bool augments) const +int EQ::ItemInstance::GetItemAgi(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1357,7 +1357,7 @@ int EQEmu::ItemInstance::GetItemAgi(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemInt(bool augments) const +int EQ::ItemInstance::GetItemInt(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1371,7 +1371,7 @@ int EQEmu::ItemInstance::GetItemInt(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemWis(bool augments) const +int EQ::ItemInstance::GetItemWis(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1385,7 +1385,7 @@ int EQEmu::ItemInstance::GetItemWis(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemCha(bool augments) const +int EQ::ItemInstance::GetItemCha(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1399,7 +1399,7 @@ int EQEmu::ItemInstance::GetItemCha(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemMR(bool augments) const +int EQ::ItemInstance::GetItemMR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1413,7 +1413,7 @@ int EQEmu::ItemInstance::GetItemMR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemFR(bool augments) const +int EQ::ItemInstance::GetItemFR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1427,7 +1427,7 @@ int EQEmu::ItemInstance::GetItemFR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemCR(bool augments) const +int EQ::ItemInstance::GetItemCR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1441,7 +1441,7 @@ int EQEmu::ItemInstance::GetItemCR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemPR(bool augments) const +int EQ::ItemInstance::GetItemPR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1455,7 +1455,7 @@ int EQEmu::ItemInstance::GetItemPR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemDR(bool augments) const +int EQ::ItemInstance::GetItemDR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1469,7 +1469,7 @@ int EQEmu::ItemInstance::GetItemDR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemCorrup(bool augments) const +int EQ::ItemInstance::GetItemCorrup(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1483,7 +1483,7 @@ int EQEmu::ItemInstance::GetItemCorrup(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicStr(bool augments) const +int EQ::ItemInstance::GetItemHeroicStr(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1497,7 +1497,7 @@ int EQEmu::ItemInstance::GetItemHeroicStr(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicSta(bool augments) const +int EQ::ItemInstance::GetItemHeroicSta(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1511,7 +1511,7 @@ int EQEmu::ItemInstance::GetItemHeroicSta(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicDex(bool augments) const +int EQ::ItemInstance::GetItemHeroicDex(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1525,7 +1525,7 @@ int EQEmu::ItemInstance::GetItemHeroicDex(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicAgi(bool augments) const +int EQ::ItemInstance::GetItemHeroicAgi(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1539,7 +1539,7 @@ int EQEmu::ItemInstance::GetItemHeroicAgi(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicInt(bool augments) const +int EQ::ItemInstance::GetItemHeroicInt(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1553,7 +1553,7 @@ int EQEmu::ItemInstance::GetItemHeroicInt(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicWis(bool augments) const +int EQ::ItemInstance::GetItemHeroicWis(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1567,7 +1567,7 @@ int EQEmu::ItemInstance::GetItemHeroicWis(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicCha(bool augments) const +int EQ::ItemInstance::GetItemHeroicCha(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1581,7 +1581,7 @@ int EQEmu::ItemInstance::GetItemHeroicCha(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicMR(bool augments) const +int EQ::ItemInstance::GetItemHeroicMR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1595,7 +1595,7 @@ int EQEmu::ItemInstance::GetItemHeroicMR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicFR(bool augments) const +int EQ::ItemInstance::GetItemHeroicFR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1609,7 +1609,7 @@ int EQEmu::ItemInstance::GetItemHeroicFR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicCR(bool augments) const +int EQ::ItemInstance::GetItemHeroicCR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1623,7 +1623,7 @@ int EQEmu::ItemInstance::GetItemHeroicCR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicPR(bool augments) const +int EQ::ItemInstance::GetItemHeroicPR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1637,7 +1637,7 @@ int EQEmu::ItemInstance::GetItemHeroicPR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicDR(bool augments) const +int EQ::ItemInstance::GetItemHeroicDR(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1651,7 +1651,7 @@ int EQEmu::ItemInstance::GetItemHeroicDR(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHeroicCorrup(bool augments) const +int EQ::ItemInstance::GetItemHeroicCorrup(bool augments) const { int total = 0; const auto item = GetItem(); @@ -1665,7 +1665,7 @@ int EQEmu::ItemInstance::GetItemHeroicCorrup(bool augments) const return total; } -int EQEmu::ItemInstance::GetItemHaste(bool augments) const +int EQ::ItemInstance::GetItemHaste(bool augments) const { int total = 0; const auto item = GetItem(); diff --git a/common/item_instance.h b/common/item_instance.h index d38ad0868..297908a50 100644 --- a/common/item_instance.h +++ b/common/item_instance.h @@ -38,7 +38,7 @@ class EvolveInfo; // Stores information about an evolving item family #include -// Specifies usage type for item inside EQEmu::ItemInstance +// Specifies usage type for item inside EQ::ItemInstance enum ItemInstTypes { ItemInstNormal = 0, @@ -54,14 +54,14 @@ typedef enum { class SharedDatabase; // ######################################## -// Class: EQEmu::ItemInstance +// Class: EQ::ItemInstance // Base class for an instance of an item // An item instance encapsulates item data + data specific // to an item instance (includes dye, augments, charges, etc) -namespace EQEmu +namespace EQ { class InventoryProfile; - + class ItemInstance { public: ///////////////////////// @@ -222,7 +222,7 @@ namespace EQEmu inline int32 GetSerialNumber() const { return m_SerialNumber; } inline void SetSerialNumber(int32 id) { m_SerialNumber = id; } - std::map& GetTimers() { return m_timers; } + std::map& GetTimers() { return m_timers; } void SetTimer(std::string name, uint32 time); void StopTimer(std::string name); void ClearTimers(); @@ -316,13 +316,13 @@ namespace EQEmu // Items inside of this item (augs or contents); std::map m_contents; // Zero-based index: min=0, max=9 std::map m_custom_data; - std::map m_timers; + std::map m_timers; }; } class EvolveInfo { public: - friend class EQEmu::ItemInstance; + friend class EQ::ItemInstance; //temporary uint16 LvlKills[9]; uint32 FirstItem; diff --git a/common/light_source.cpp b/common/light_source.cpp index 476f315b8..7aeb4d166 100644 --- a/common/light_source.cpp +++ b/common/light_source.cpp @@ -22,7 +22,7 @@ #include -uint8 EQEmu::lightsource::TypeToLevel(uint8 light_type) +uint8 EQ::lightsource::TypeToLevel(uint8 light_type) { switch (light_type) { case LightTypeGlobeOfStars: @@ -55,7 +55,7 @@ uint8 EQEmu::lightsource::TypeToLevel(uint8 light_type) } } -bool EQEmu::lightsource::IsLevelGreater(uint8 left_type, uint8 right_type) +bool EQ::lightsource::IsLevelGreater(uint8 left_type, uint8 right_type) { static const uint8 light_levels[LightTypeCount] = { LightLevelUnlit, /* LightTypeNone */ @@ -82,17 +82,17 @@ bool EQEmu::lightsource::IsLevelGreater(uint8 left_type, uint8 right_type) return (light_levels[left_type] > light_levels[right_type]); } -EQEmu::LightSource_Struct::LightSource_Struct() +EQ::LightSource_Struct::LightSource_Struct() { Clear(); } -void EQEmu::LightSource_Struct::Clear() +void EQ::LightSource_Struct::Clear() { memset(&Slot, 0, (sizeof(uint8) * lightsource::LightCount)); } -void EQEmu::LightSourceProfile::Clear() +void EQ::LightSourceProfile::Clear() { Type.Clear(); Level.Clear(); diff --git a/common/light_source.h b/common/light_source.h index a77049e4f..f68f7fe87 100644 --- a/common/light_source.h +++ b/common/light_source.h @@ -23,7 +23,7 @@ #include "types.h" -namespace EQEmu +namespace EQ { namespace lightsource { enum LightSlot { diff --git a/common/loottable.h b/common/loottable.h index d046c0c08..2b9a13926 100644 --- a/common/loottable.h +++ b/common/loottable.h @@ -39,13 +39,15 @@ struct LootTable_Struct { }; struct LootDropEntries_Struct { - uint32 item_id; - int8 item_charges; - uint8 equip_item; - float chance; - uint8 minlevel; - uint8 maxlevel; - uint8 multiplier; + 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 { diff --git a/common/memory_buffer.cpp b/common/memory_buffer.cpp index 898851cb3..9cebd5ff2 100644 --- a/common/memory_buffer.cpp +++ b/common/memory_buffer.cpp @@ -20,7 +20,7 @@ #include "memory_buffer.h" -EQEmu::MemoryBuffer::MemoryBuffer() +EQ::MemoryBuffer::MemoryBuffer() { buffer_ = nullptr; size_ = 0; @@ -29,7 +29,7 @@ EQEmu::MemoryBuffer::MemoryBuffer() write_pos_ = 0; } -EQEmu::MemoryBuffer::MemoryBuffer(size_t sz) +EQ::MemoryBuffer::MemoryBuffer(size_t sz) { buffer_ = nullptr; size_ = 0; @@ -39,7 +39,7 @@ EQEmu::MemoryBuffer::MemoryBuffer(size_t sz) Resize(sz); } -EQEmu::MemoryBuffer::MemoryBuffer(const MemoryBuffer &other) +EQ::MemoryBuffer::MemoryBuffer(const MemoryBuffer &other) { if(other.capacity_) { buffer_ = new uchar[other.capacity_]; @@ -54,7 +54,7 @@ EQEmu::MemoryBuffer::MemoryBuffer(const MemoryBuffer &other) read_pos_ = other.read_pos_; } -EQEmu::MemoryBuffer::MemoryBuffer(MemoryBuffer &&other) +EQ::MemoryBuffer::MemoryBuffer(MemoryBuffer &&other) { uchar *tbuf = other.buffer_; size_t tsz = other.size_; @@ -75,7 +75,7 @@ EQEmu::MemoryBuffer::MemoryBuffer(MemoryBuffer &&other) read_pos_ = tread_pos; } -EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(const MemoryBuffer &other) +EQ::MemoryBuffer& EQ::MemoryBuffer::operator=(const MemoryBuffer &other) { if(this == &other) { return *this; @@ -100,7 +100,7 @@ EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(const MemoryBuffer &other) return *this; } -EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(MemoryBuffer &&other) +EQ::MemoryBuffer& EQ::MemoryBuffer::operator=(MemoryBuffer &&other) { uchar *tbuf = other.buffer_; size_t tsz = other.size_; @@ -122,7 +122,7 @@ EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator=(MemoryBuffer &&other) return *this; } -EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator+=(const MemoryBuffer &rhs) +EQ::MemoryBuffer& EQ::MemoryBuffer::operator+=(const MemoryBuffer &rhs) { if(!rhs.buffer_) { return *this; @@ -142,52 +142,52 @@ EQEmu::MemoryBuffer& EQEmu::MemoryBuffer::operator+=(const MemoryBuffer &rhs) return *this; } -EQEmu::MemoryBuffer::~MemoryBuffer() +EQ::MemoryBuffer::~MemoryBuffer() { Clear(); } -uchar& EQEmu::MemoryBuffer::operator[](size_t pos) +uchar& EQ::MemoryBuffer::operator[](size_t pos) { return buffer_[pos]; } -const uchar& EQEmu::MemoryBuffer::operator[](size_t pos) const +const uchar& EQ::MemoryBuffer::operator[](size_t pos) const { return buffer_[pos]; } -bool EQEmu::MemoryBuffer::Empty() +bool EQ::MemoryBuffer::Empty() { return size_ == 0; } -bool EQEmu::MemoryBuffer::Empty() const +bool EQ::MemoryBuffer::Empty() const { return size_ == 0; } -size_t EQEmu::MemoryBuffer::Size() +size_t EQ::MemoryBuffer::Size() { return size_; } -size_t EQEmu::MemoryBuffer::Size() const +size_t EQ::MemoryBuffer::Size() const { return size_; } -size_t EQEmu::MemoryBuffer::Capacity() +size_t EQ::MemoryBuffer::Capacity() { return capacity_; } -size_t EQEmu::MemoryBuffer::Capacity() const +size_t EQ::MemoryBuffer::Capacity() const { return capacity_; } -void EQEmu::MemoryBuffer::Resize(size_t sz) +void EQ::MemoryBuffer::Resize(size_t sz) { if(!buffer_) { size_t new_size = sz + 64; @@ -213,7 +213,7 @@ void EQEmu::MemoryBuffer::Resize(size_t sz) } } -void EQEmu::MemoryBuffer::Clear() +void EQ::MemoryBuffer::Clear() { if(buffer_) { delete[] buffer_; @@ -226,14 +226,14 @@ void EQEmu::MemoryBuffer::Clear() read_pos_ = 0; } -void EQEmu::MemoryBuffer::Zero() +void EQ::MemoryBuffer::Zero() { if(buffer_) { memset(buffer_, 0, capacity_); } } -void EQEmu::MemoryBuffer::Write(const char *val, size_t len) +void EQ::MemoryBuffer::Write(const char *val, size_t len) { size_t size_needed = write_pos_ + len; Resize(size_needed); @@ -242,20 +242,20 @@ void EQEmu::MemoryBuffer::Write(const char *val, size_t len) write_pos_ += len; } -void EQEmu::MemoryBuffer::Read(uchar *buf, size_t len) +void EQ::MemoryBuffer::Read(uchar *buf, size_t len) { memcpy(buf, &buffer_[read_pos_], len); read_pos_ += len; } -void EQEmu::MemoryBuffer::Read(char *str) +void EQ::MemoryBuffer::Read(char *str) { size_t len = strlen((const char*)&buffer_[read_pos_]); memcpy(str, &buffer_[read_pos_], len); read_pos_ += len; } -void EQEmu::OutBuffer::overwrite(OutBuffer::pos_type position, const char *_Str, std::streamsize _Count) +void EQ::OutBuffer::overwrite(OutBuffer::pos_type position, const char *_Str, std::streamsize _Count) { auto last_pos = tellp(); seekp(position); @@ -263,7 +263,7 @@ void EQEmu::OutBuffer::overwrite(OutBuffer::pos_type position, const char *_Str, seekp(last_pos); } -uchar* EQEmu::OutBuffer::detach() +uchar* EQ::OutBuffer::detach() { size_t buffer_size = tellp(); if (buffer_size == 0) diff --git a/common/memory_buffer.h b/common/memory_buffer.h index 474953f91..b1019a232 100644 --- a/common/memory_buffer.h +++ b/common/memory_buffer.h @@ -28,7 +28,7 @@ #include -namespace EQEmu +namespace EQ { class MemoryBuffer { public: diff --git a/common/memory_mapped_file.cpp b/common/memory_mapped_file.cpp index b8b5e2a4b..a11b3c5db 100644 --- a/common/memory_mapped_file.cpp +++ b/common/memory_mapped_file.cpp @@ -33,7 +33,7 @@ #include #endif -namespace EQEmu { +namespace EQ { struct MemoryMappedFile::Implementation { #ifdef _WINDOWS diff --git a/common/memory_mapped_file.h b/common/memory_mapped_file.h index cc4ed700d..d3e832cef 100644 --- a/common/memory_mapped_file.h +++ b/common/memory_mapped_file.h @@ -22,7 +22,7 @@ #include #include "types.h" -namespace EQEmu { +namespace EQ { //! Memory Backed Shared Memory /*! diff --git a/common/net/console_server.cpp b/common/net/console_server.cpp index ab420bd42..31b597bfb 100644 --- a/common/net/console_server.cpp +++ b/common/net/console_server.cpp @@ -4,7 +4,7 @@ EQ::Net::ConsoleServer::ConsoleServer(const std::string &addr, int port) { - m_server.reset(new EQ::Net::TCPServer()); + m_server = std::make_unique(); m_server->Listen(addr, port, false, [this](std::shared_ptr connection) { ConsoleServerConnection *c = new ConsoleServerConnection(this, connection); m_connections.insert(std::make_pair(c->GetUUID(), std::unique_ptr(c))); diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index bd0c39489..125a240dd 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -605,6 +605,8 @@ void EQ::Net::DaybreakConnection::ProcessDecodedPacket(const Packet &p) ProcessDecodedPacket(StaticPacket(current, subpacket_length)); current += subpacket_length; } + + break; } case OP_SessionRequest: @@ -1101,7 +1103,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) InternalBufferedSend(p); entry.second.last_sent = now; entry.second.times_resent++; - entry.second.resend_delay = EQEmu::Clamp(entry.second.resend_delay * 2, m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); + entry.second.resend_delay = EQ::Clamp(entry.second.resend_delay * 2, m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); resends++; } } @@ -1130,7 +1132,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) InternalBufferedSend(p); entry.second.last_sent = now; entry.second.times_resent++; - entry.second.resend_delay = EQEmu::Clamp(entry.second.resend_delay * 2, m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); + entry.second.resend_delay = EQ::Clamp(entry.second.resend_delay * 2, m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); resends++; } } @@ -1182,7 +1184,7 @@ void EQ::Net::DaybreakConnection::OutOfOrderAck(int stream, uint16_t seq) void EQ::Net::DaybreakConnection::UpdateDataBudget(double budget_add) { auto outgoing_data_rate = m_owner->m_options.outgoing_data_rate; - m_outgoing_budget = EQEmu::ClampUpper(m_outgoing_budget + budget_add, outgoing_data_rate); + m_outgoing_budget = EQ::ClampUpper(m_outgoing_budget + budget_add, outgoing_data_rate); } void EQ::Net::DaybreakConnection::SendAck(int stream_id, uint16_t seq) @@ -1403,7 +1405,7 @@ void EQ::Net::DaybreakConnection::InternalQueuePacket(Packet &p, int stream_id, sent.last_sent = Clock::now(); sent.first_sent = Clock::now(); sent.times_resent = 0; - sent.resend_delay = EQEmu::Clamp( + sent.resend_delay = EQ::Clamp( static_cast((m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms), m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); @@ -1435,7 +1437,7 @@ void EQ::Net::DaybreakConnection::InternalQueuePacket(Packet &p, int stream_id, sent.last_sent = Clock::now(); sent.first_sent = Clock::now(); sent.times_resent = 0; - sent.resend_delay = EQEmu::Clamp( + sent.resend_delay = EQ::Clamp( static_cast((m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms), m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); @@ -1459,7 +1461,7 @@ void EQ::Net::DaybreakConnection::InternalQueuePacket(Packet &p, int stream_id, sent.last_sent = Clock::now(); sent.first_sent = Clock::now(); sent.times_resent = 0; - sent.resend_delay = EQEmu::Clamp( + sent.resend_delay = EQ::Clamp( static_cast((m_rolling_ping * m_owner->m_options.resend_delay_factor) + m_owner->m_options.resend_delay_ms), m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 883ecefac..c2c714813 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -318,7 +318,7 @@ namespace EQ void Attach(uv_loop_t *loop); void Detach(); - EQEmu::Random m_rand; + EQ::Random m_rand; uv_timer_t m_timer; uv_udp_t m_socket; uv_loop_t *m_attached; diff --git a/common/net/servertalk_client_connection.cpp b/common/net/servertalk_client_connection.cpp index 0a5dceac6..88cfc021a 100644 --- a/common/net/servertalk_client_connection.cpp +++ b/common/net/servertalk_client_connection.cpp @@ -3,7 +3,7 @@ #include "../eqemu_logsys.h" EQ::Net::ServertalkClient::ServertalkClient(const std::string &addr, int port, bool ipv6, const std::string &identifier, const std::string &credentials) - : m_timer(std::unique_ptr(new EQ::Timer(100, true, std::bind(&EQ::Net::ServertalkClient::Connect, this)))) + : m_timer(std::make_unique(100, true, std::bind(&EQ::Net::ServertalkClient::Connect, this))) { m_port = port; m_ipv6 = ipv6; diff --git a/common/net/servertalk_legacy_client_connection.cpp b/common/net/servertalk_legacy_client_connection.cpp index 3cbe1c85a..8be329e65 100644 --- a/common/net/servertalk_legacy_client_connection.cpp +++ b/common/net/servertalk_legacy_client_connection.cpp @@ -3,7 +3,7 @@ #include "../eqemu_logsys.h" EQ::Net::ServertalkLegacyClient::ServertalkLegacyClient(const std::string &addr, int port, bool ipv6) - : m_timer(std::unique_ptr(new EQ::Timer(100, true, std::bind(&EQ::Net::ServertalkLegacyClient::Connect, this)))) + : m_timer(std::make_unique(100, true, std::bind(&EQ::Net::ServertalkLegacyClient::Connect, this))) { m_port = port; m_ipv6 = ipv6; diff --git a/common/net/servertalk_server.cpp b/common/net/servertalk_server.cpp index fcbea917c..297d4cd31 100644 --- a/common/net/servertalk_server.cpp +++ b/common/net/servertalk_server.cpp @@ -13,7 +13,7 @@ void EQ::Net::ServertalkServer::Listen(const ServertalkServerOptions& opts) m_encrypted = opts.encrypted; m_credentials = opts.credentials; m_allow_downgrade = opts.allow_downgrade; - m_server.reset(new EQ::Net::TCPServer()); + m_server = std::make_unique(); m_server->Listen(opts.port, opts.ipv6, [this](std::shared_ptr connection) { m_unident_connections.push_back(std::make_shared(connection, this, m_encrypted, m_allow_downgrade)); }); diff --git a/common/net/tcp_connection.cpp b/common/net/tcp_connection.cpp index 695ac7643..372442c7d 100644 --- a/common/net/tcp_connection.cpp +++ b/common/net/tcp_connection.cpp @@ -2,7 +2,7 @@ #include "../event/event_loop.h" void on_close_handle(uv_handle_t* handle) { - delete handle; + delete (uv_tcp_t *)handle; } EQ::Net::TCPConnection::TCPConnection(uv_tcp_t *socket) @@ -115,7 +115,7 @@ void EQ::Net::TCPConnection::Disconnect() connection->m_on_disconnect_cb(connection); } - delete handle; + delete (uv_tcp_t *)handle; }); m_socket = nullptr; } diff --git a/common/net/tcp_server.cpp b/common/net/tcp_server.cpp index ed68d54dc..777c92be5 100644 --- a/common/net/tcp_server.cpp +++ b/common/net/tcp_server.cpp @@ -2,7 +2,7 @@ #include "../event/event_loop.h" void on_close_tcp_server_handle(uv_handle_t* handle) { - delete handle; + delete (uv_tcp_t *)handle; } EQ::Net::TCPServer::TCPServer() diff --git a/common/net/websocket_server.cpp b/common/net/websocket_server.cpp index b46fc7953..dda1a4a96 100644 --- a/common/net/websocket_server.cpp +++ b/common/net/websocket_server.cpp @@ -34,8 +34,8 @@ struct EQ::Net::WebsocketServer::Impl EQ::Net::WebsocketServer::WebsocketServer(const std::string &addr, int port) { - _impl.reset(new Impl()); - _impl->server.reset(new EQ::Net::TCPServer()); + _impl = std::make_unique(); + _impl->server = std::make_unique(); _impl->server->Listen(addr, port, false, [this](std::shared_ptr connection) { auto wsc = _impl->ws_server.get_connection(); WebsocketServerConnection *c = new WebsocketServerConnection(this, connection, wsc); @@ -53,7 +53,7 @@ EQ::Net::WebsocketServer::WebsocketServer(const std::string &addr, int port) return websocketpp::lib::error_code(); }); - _impl->ping_timer.reset(new EQ::Timer(5000, true, [this](EQ::Timer *t) { + _impl->ping_timer = std::make_unique(5000, true, [this](EQ::Timer *t) { auto iter = _impl->connections.begin(); while (iter != _impl->connections.end()) { @@ -67,7 +67,7 @@ EQ::Net::WebsocketServer::WebsocketServer(const std::string &addr, int port) iter++; } - })); + }); _impl->methods.insert(std::make_pair("login", MethodHandlerEntry(std::bind(&WebsocketServer::Login, this, std::placeholders::_1, std::placeholders::_2), 0))); _impl->methods.insert(std::make_pair("subscribe", MethodHandlerEntry(std::bind(&WebsocketServer::Subscribe, this, std::placeholders::_1, std::placeholders::_2), 0))); diff --git a/common/net/websocket_server_connection.cpp b/common/net/websocket_server_connection.cpp index 50b117062..3c1271518 100644 --- a/common/net/websocket_server_connection.cpp +++ b/common/net/websocket_server_connection.cpp @@ -20,7 +20,7 @@ EQ::Net::WebsocketServerConnection::WebsocketServerConnection(WebsocketServer *p std::shared_ptr connection, std::shared_ptr ws_connection) { - _impl.reset(new Impl()); + _impl = std::make_unique(); _impl->parent = parent; _impl->connection = connection; _impl->id = EQ::Util::UUID::Generate().ToString(); diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index fd75cb3db..38b109677 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -45,7 +45,7 @@ namespace RoF static OpcodeManager *opcodes = nullptr; static Strategy struct_strategy; - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id, uint8 depth, ItemPacketType packet_type); + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id, uint8 depth, ItemPacketType packet_type); // server to client inventory location converters static inline structs::InventorySlot_Struct ServerToRoFSlot(uint32 server_slot); @@ -65,8 +65,8 @@ namespace RoF // client to server say link converter static inline void RoFToServerSayLink(std::string& serverSayLink, const std::string& rofSayLink); - static inline spells::CastingSlot ServerToRoFCastingSlot(EQEmu::spells::CastingSlot slot); - static inline EQEmu::spells::CastingSlot RoFToServerCastingSlot(spells::CastingSlot slot); + static inline spells::CastingSlot ServerToRoFCastingSlot(EQ::spells::CastingSlot slot); + static inline EQ::spells::CastingSlot RoFToServerCastingSlot(spells::CastingSlot slot); static inline int ServerToRoFBuffSlot(int index); static inline int RoFToServerBuffSlot(int index); @@ -147,9 +147,9 @@ namespace RoF return(r); } - const EQEmu::versions::ClientVersion Strategy::ClientVersion() const + const EQ::versions::ClientVersion Strategy::ClientVersion() const { - return EQEmu::versions::ClientVersion::RoF; + return EQ::versions::ClientVersion::RoF; } #include "ss_define.h" @@ -193,7 +193,7 @@ namespace RoF eq->unknown000 = 1; OUT(npcid); - eq->inventory_slot = ServerToRoFTypelessSlot(emu->slot, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoFTypelessSlot(emu->slot, EQ::invtype::typePossessions); OUT(charges); OUT(sell_price); @@ -246,7 +246,7 @@ namespace RoF SETUP_DIRECT_ENCODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct); OUT(merchant_entity_id); - eq->inventory_slot = ServerToRoFTypelessSlot(emu->slot_id, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoFTypelessSlot(emu->slot_id, EQ::invtype::typePossessions); OUT(charges); OUT(cost); @@ -270,7 +270,7 @@ namespace RoF ENCODE_LENGTH_EXACT(ApplyPoison_Struct); SETUP_DIRECT_ENCODE(ApplyPoison_Struct, structs::ApplyPoison_Struct); - eq->inventory_slot = ServerToRoFTypelessSlot(emu->inventorySlot, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoFTypelessSlot(emu->inventorySlot, EQ::invtype::typePossessions); OUT(success); FINISH_ENCODE(); @@ -502,7 +502,7 @@ namespace RoF ENCODE_LENGTH_EXACT(CastSpell_Struct); SETUP_DIRECT_ENCODE(CastSpell_Struct, structs::CastSpell_Struct); - eq->slot = static_cast(ServerToRoFCastingSlot(static_cast(emu->slot))); + eq->slot = static_cast(ServerToRoFCastingSlot(static_cast(emu->slot))); OUT(spell_id); eq->inventory_slot = ServerToRoFSlot(emu->inventoryslot); @@ -570,24 +570,24 @@ namespace RoF //store away the emu struct uchar* __emu_buffer = in->pBuffer; - int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct); - if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) { + int item_count = in->size / sizeof(EQ::InternalSerializedItem_Struct); + if (!item_count || (in->size % sizeof(EQ::InternalSerializedItem_Struct)) != 0) { Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct)); + opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQ::InternalSerializedItem_Struct)); delete in; return; } - EQEmu::InternalSerializedItem_Struct* eq = (EQEmu::InternalSerializedItem_Struct*)in->pBuffer; + EQ::InternalSerializedItem_Struct* eq = (EQ::InternalSerializedItem_Struct*)in->pBuffer; - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)&item_count, sizeof(uint32)); for (int index = 0; index < item_count; ++index, ++eq) { - SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0, ItemPacketCharInventory); + SerializeItem(ob, (const EQ::ItemInstance*)eq->inst, eq->slot_id, 0, ItemPacketCharInventory); if (ob.tellp() == last_pos) LogNetcode("RoF::ENCODE(OP_CharInventory) Serialization failed on item slot [{}] during OP_CharInventory. Item skipped", eq->slot_id); @@ -710,15 +710,48 @@ namespace RoF FINISH_ENCODE(); } + ENCODE(OP_DzChooseZone) + { + SETUP_VAR_ENCODE(DynamicZoneChooseZone_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + + for (uint32 i = 0; i < emu->count; ++i) + { + buf.WriteUInt16(emu->choices[i].dz_zone_id); + buf.WriteUInt16(emu->choices[i].dz_instance_id); + buf.WriteUInt32(emu->choices[i].unknown_id1); + buf.WriteUInt32(emu->choices[i].dz_type); + buf.WriteUInt32(emu->choices[i].unknown_id2); + buf.WriteString(emu->choices[i].description); + buf.WriteString(emu->choices[i].leader_name); + } + + __packet->size = buf.size(); + __packet->pBuffer = new unsigned char[__packet->size]; + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); + + FINISH_ENCODE(); + } + ENCODE(OP_DzCompass) { - SETUP_VAR_ENCODE(ExpeditionCompass_Struct); - ALLOC_VAR_ENCODE(structs::ExpeditionCompass_Struct, sizeof(structs::ExpeditionInfo_Struct) + sizeof(structs::ExpeditionCompassEntry_Struct) * emu->count); + SETUP_VAR_ENCODE(DynamicZoneCompass_Struct); + ALLOC_VAR_ENCODE(structs::DynamicZoneCompass_Struct, + sizeof(structs::DynamicZoneCompass_Struct) + + sizeof(structs::DynamicZoneCompassEntry_Struct) * emu->count + ); + OUT(client_id); OUT(count); for (uint32 i = 0; i < emu->count; ++i) { + OUT(entries[i].dz_zone_id); + OUT(entries[i].dz_instance_id); + OUT(entries[i].dz_type); OUT(entries[i].x); OUT(entries[i].y); OUT(entries[i].z); @@ -739,112 +772,108 @@ namespace RoF ENCODE(OP_DzExpeditionInfo) { - ENCODE_LENGTH_EXACT(ExpeditionInfo_Struct); - SETUP_DIRECT_ENCODE(ExpeditionInfo_Struct, structs::ExpeditionInfo_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneInfo_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneInfo_Struct, structs::DynamicZoneInfo_Struct); + OUT(client_id); + OUT(assigned); OUT(max_players); - eq->unknown004 = 785316192; - eq->unknown008 = 435601; - strncpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); - strncpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); + strn0cpy(eq->dz_name, emu->dz_name, sizeof(eq->dz_name)); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } - ENCODE(OP_DzExpeditionList) + ENCODE(OP_DzExpeditionInvite) { - SETUP_VAR_ENCODE(ExpeditionLockoutList_Struct); + ENCODE_LENGTH_EXACT(ExpeditionInvite_Struct); + SETUP_DIRECT_ENCODE(ExpeditionInvite_Struct, structs::ExpeditionInvite_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); + OUT(client_id); + strn0cpy(eq->inviter_name, emu->inviter_name, sizeof(eq->inviter_name)); + strn0cpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); + OUT(swapping); + strn0cpy(eq->swap_name, emu->swap_name, sizeof(eq->swap_name)); + OUT(dz_zone_id); + OUT(dz_instance_id); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzExpeditionLockoutTimers) + { + SETUP_VAR_ENCODE(ExpeditionLockoutTimers_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); for (uint32 i = 0; i < emu->count; ++i) { - ss.write(emu->entries[i].expedition, strlen(emu->entries[i].expedition)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].time_left, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->entries[i].expedition_event, strlen(emu->entries[i].expedition_event)); - ss.write((const char*)&null_term, sizeof(char)); + buf.WriteString(emu->timers[i].expedition_name); + buf.WriteUInt32(emu->timers[i].seconds_remaining); + buf.WriteInt32(emu->timers[i].event_type); + buf.WriteString(emu->timers[i].event_name); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } - ENCODE(OP_DzJoinExpeditionConfirm) + ENCODE(OP_DzSetLeaderName) { - ENCODE_LENGTH_EXACT(ExpeditionJoinPrompt_Struct); - SETUP_DIRECT_ENCODE(ExpeditionJoinPrompt_Struct, structs::ExpeditionJoinPrompt_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneLeaderName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneLeaderName_Struct, structs::DynamicZoneLeaderName_Struct); - strncpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); - strncpy(eq->player_name, emu->player_name, sizeof(eq->player_name)); - - FINISH_ENCODE(); - } - - ENCODE(OP_DzLeaderStatus) - { - SETUP_VAR_ENCODE(ExpeditionLeaderSet_Struct); - - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->leader_name, strlen(emu->leader_name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//0xffffffff - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//1 - ss.write((const char*)&client_id, sizeof(uint32)); - - __packet->size = ss.str().length(); - __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + OUT(client_id); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } ENCODE(OP_DzMemberList) { - SETUP_VAR_ENCODE(ExpeditionMemberList_Struct); + SETUP_VAR_ENCODE(DynamicZoneMemberList_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (uint32 i = 0; i < emu->count; ++i) + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->member_count); + for (uint32 i = 0; i < emu->member_count; ++i) { - ss.write(emu->entries[i].name, strlen(emu->entries[i].name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].status, sizeof(char)); + buf.WriteString(emu->members[i].name); + buf.WriteUInt8(emu->members[i].online_status); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } + ENCODE(OP_DzMemberListName) + { + ENCODE_LENGTH_EXACT(DynamicZoneMemberListName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneMemberListName_Struct, structs::DynamicZoneMemberListName_Struct); + + OUT(client_id); + OUT(add_name); + strn0cpy(eq->name, emu->name, sizeof(eq->name)); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzMemberListStatus) + { + auto emu = reinterpret_cast((*p)->pBuffer); + if (emu->member_count == 1) + { + ENCODE_FORWARD(OP_DzMemberList); + } + } + ENCODE(OP_Emote) { EQApplicationPacket *in = *p; @@ -1513,14 +1542,14 @@ namespace RoF uchar* __emu_buffer = in->pBuffer; ItemPacket_Struct* old_item_pkt = (ItemPacket_Struct*)__emu_buffer; - EQEmu::InternalSerializedItem_Struct* int_struct = (EQEmu::InternalSerializedItem_Struct*)(&__emu_buffer[4]); + EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)__emu_buffer, 4); - SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType); + SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType); if (ob.tellp() == last_pos) { LogNetcode("RoF::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id); delete in; @@ -1827,6 +1856,7 @@ namespace RoF OUT(FastRegenHP); OUT(FastRegenMana); OUT(FastRegenEndurance); + OUT(underworld_teleport_index); eq->FogDensity = emu->fog_density; @@ -1938,7 +1968,7 @@ namespace RoF for (int r = 0; r < 5; r++) { - outapp->WriteUInt32(emu->binds[r].zoneId); + outapp->WriteUInt32(emu->binds[r].zone_id); outapp->WriteFloat(emu->binds[r].x); outapp->WriteFloat(emu->binds[r].y); outapp->WriteFloat(emu->binds[r].z); @@ -1957,7 +1987,7 @@ namespace RoF outapp->WriteUInt32(22); // Equipment count - for (int r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) + for (int r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { outapp->WriteUInt32(emu->item_material.Slot[r].Material); outapp->WriteUInt32(0); @@ -1977,9 +2007,9 @@ namespace RoF outapp->WriteUInt32(0); } - outapp->WriteUInt32(EQEmu::textures::materialCount); // Equipment2 count + outapp->WriteUInt32(EQ::textures::materialCount); // Equipment2 count - for (int r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) + for (int r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { outapp->WriteUInt32(0); outapp->WriteUInt32(0); @@ -1988,7 +2018,7 @@ namespace RoF outapp->WriteUInt32(0); } - outapp->WriteUInt32(EQEmu::textures::materialCount); // Tint Count + outapp->WriteUInt32(EQ::textures::materialCount); // Tint Count for (int r = 0; r < 7; r++) { @@ -1998,7 +2028,7 @@ namespace RoF outapp->WriteUInt32(0); outapp->WriteUInt32(0); - outapp->WriteUInt32(EQEmu::textures::materialCount); // Tint2 Count + outapp->WriteUInt32(EQ::textures::materialCount); // Tint2 Count for (int r = 0; r < 7; r++) { @@ -2127,7 +2157,7 @@ namespace RoF outapp->WriteUInt32(spells::SPELLBOOK_SIZE); // Spellbook slots - if (spells::SPELLBOOK_SIZE <= EQEmu::spells::SPELLBOOK_SIZE) { + if (spells::SPELLBOOK_SIZE <= EQ::spells::SPELLBOOK_SIZE) { for (uint32 r = 0; r < spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) outapp->WriteUInt32(emu->spell_book[r]); @@ -2136,33 +2166,33 @@ namespace RoF } } else { - for (uint32 r = 0; r < EQEmu::spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = 0; r < EQ::spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) outapp->WriteUInt32(emu->spell_book[r]); else outapp->WriteUInt32(0xFFFFFFFFU); } // invalidate the rest of the spellbook slots - for (uint32 r = EQEmu::spells::SPELLBOOK_SIZE; r < spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = EQ::spells::SPELLBOOK_SIZE; r < spells::SPELLBOOK_SIZE; r++) { outapp->WriteUInt32(0xFFFFFFFFU); } } outapp->WriteUInt32(spells::SPELL_GEM_COUNT); // Memorised spell slots - for (uint32 r = 0; r < EQEmu::spells::SPELL_GEM_COUNT; r++) // first 12 + for (uint32 r = 0; r < EQ::spells::SPELL_GEM_COUNT; r++) // first 12 { outapp->WriteUInt32(emu->mem_spells[r]); } // zeroes for the rest of the slots -- the other 4 which don't work at all! - for (uint32 r = 0; r < spells::SPELL_GEM_COUNT - EQEmu::spells::SPELL_GEM_COUNT; r++) + for (uint32 r = 0; r < spells::SPELL_GEM_COUNT - EQ::spells::SPELL_GEM_COUNT; r++) { outapp->WriteUInt32(0xFFFFFFFFU); } outapp->WriteUInt32(13); // gem refresh count - for (uint32 r = 0; r < EQEmu::spells::SPELL_GEM_COUNT; r++) + for (uint32 r = 0; r < EQ::spells::SPELL_GEM_COUNT; r++) { outapp->WriteUInt32(emu->spellSlotRefresh[r]); // spell gem refresh } @@ -2251,7 +2281,7 @@ namespace RoF outapp->WriteUInt32(profile::BANDOLIERS_SIZE); // Copy bandoliers where server and client indices converge - for (uint32 r = 0; r < EQEmu::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { + for (uint32 r = 0; r < EQ::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { outapp->WriteString(emu->bandoliers[r].Name); for (uint32 j = 0; j < profile::BANDOLIER_ITEM_COUNT; ++j) { // Will need adjusting if 'server != client' is ever true outapp->WriteString(emu->bandoliers[r].Items[j].Name); @@ -2266,7 +2296,7 @@ namespace RoF } } // Nullify bandoliers where server and client indices diverge, with a client bias - for (uint32 r = EQEmu::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { + for (uint32 r = EQ::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { outapp->WriteString(""); for (uint32 j = 0; j < profile::BANDOLIER_ITEM_COUNT; ++j) { // Will need adjusting if 'server != client' is ever true outapp->WriteString(""); @@ -2278,7 +2308,7 @@ namespace RoF outapp->WriteUInt32(profile::POTION_BELT_SIZE); // Copy potion belt where server and client indices converge - for (uint32 r = 0; r < EQEmu::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { + for (uint32 r = 0; r < EQ::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { outapp->WriteString(emu->potionbelt.Items[r].Name); outapp->WriteUInt32(emu->potionbelt.Items[r].ID); if (emu->potionbelt.Items[r].Icon) { @@ -2290,7 +2320,7 @@ namespace RoF } } // Nullify potion belt where server and client indices diverge, with a client bias - for (uint32 r = EQEmu::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { + for (uint32 r = EQ::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { outapp->WriteString(""); outapp->WriteUInt32(0); outapp->WriteSInt32(-1); @@ -2412,9 +2442,9 @@ namespace RoF outapp->WriteUInt8(0); // Unknown outapp->WriteUInt8(0); // Unknown - outapp->WriteUInt32(EQEmu::invtype::TRIBUTE_SIZE); + outapp->WriteUInt32(EQ::invtype::TRIBUTE_SIZE); - for (uint32 r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) + for (uint32 r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { outapp->WriteUInt32(emu->tributes[r].tribute); outapp->WriteUInt32(emu->tributes[r].tier); @@ -2949,7 +2979,7 @@ namespace RoF eq_cse->Gender = emu_cse->Gender; eq_cse->Face = emu_cse->Face; - for (int equip_index = 0; equip_index < EQEmu::textures::materialCount; equip_index++) { + for (int equip_index = 0; equip_index < EQ::textures::materialCount; equip_index++) { eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; @@ -3066,7 +3096,7 @@ namespace RoF SETUP_DIRECT_ENCODE(Merchant_Purchase_Struct, structs::Merchant_Purchase_Struct); OUT(npcid); - eq->inventory_slot = ServerToRoFTypelessSlot(emu->itemslot, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoFTypelessSlot(emu->itemslot, EQ::invtype::typePossessions); //OUT(itemslot); OUT(quantity); OUT(price); @@ -3980,7 +4010,7 @@ namespace RoF if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)) { - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; ++k) + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k) { { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color); @@ -3989,7 +4019,7 @@ namespace RoF structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer; - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; k++) { + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) { Equipment[k].Material = emu->equipment.Slot[k].Material; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteModel; @@ -3997,7 +4027,7 @@ namespace RoF Equipment[k].Material2 = emu->equipment.Slot[k].Unknown2; } - Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::materialCount); + Buffer += (sizeof(structs::Texture_Struct) * EQ::textures::materialCount); } else { @@ -4387,6 +4417,84 @@ namespace RoF FINISH_DIRECT_DECODE(); } + DECODE(OP_DzAddPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzChooseZoneReply) + { + DECODE_LENGTH_EXACT(structs::DynamicZoneChooseZoneReply_Struct); + SETUP_DIRECT_DECODE(DynamicZoneChooseZoneReply_Struct, structs::DynamicZoneChooseZoneReply_Struct); + + IN(unknown000); + IN(unknown004); + IN(unknown008); + IN(unknown_id1); + IN(dz_zone_id); + IN(dz_instance_id); + IN(dz_type); + IN(unknown_id2); + IN(unknown028); + IN(unknown032); + IN(unknown036); + IN(unknown040); + IN(unknown044); + IN(unknown048); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzExpeditionInviteResponse) + { + DECODE_LENGTH_EXACT(structs::ExpeditionInviteResponse_Struct); + SETUP_DIRECT_DECODE(ExpeditionInviteResponse_Struct, structs::ExpeditionInviteResponse_Struct); + + IN(dz_zone_id); + IN(dz_instance_id); + IN(accepted); + IN(swapping); + strn0cpy(emu->swap_name, eq->swap_name, sizeof(emu->swap_name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzMakeLeader) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzRemovePlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzSwapPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommandSwap_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommandSwap_Struct, structs::ExpeditionCommandSwap_Struct); + + strn0cpy(emu->add_player_name, eq->add_player_name, sizeof(emu->add_player_name)); + strn0cpy(emu->rem_player_name, eq->rem_player_name, sizeof(emu->rem_player_name)); + + FINISH_DIRECT_DECODE(); + } + DECODE(OP_Emote) { unsigned char *__eq_buffer = __packet->pBuffer; @@ -4714,7 +4822,7 @@ namespace RoF IN(item_id); int r; - for (r = EQEmu::invaug::SOCKET_BEGIN; r <= EQEmu::invaug::SOCKET_END; r++) { + for (r = EQ::invaug::SOCKET_BEGIN; r <= EQ::invaug::SOCKET_END; r++) { IN(augments[r]); } IN(link_hash); @@ -4739,7 +4847,7 @@ namespace RoF DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct); SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct); - for (unsigned int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (unsigned int i = 0; i < EQ::spells::SPELL_GEM_COUNT; ++i) { if (eq->spell[i] == 0) emu->spell[i] = 0xFFFFFFFF; @@ -5091,9 +5199,9 @@ namespace RoF return NextItemInstSerialNumber; } - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth, ItemPacketType packet_type) + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth, ItemPacketType packet_type) { - const EQEmu::ItemData *item = inst->GetUnscaledItem(); + const EQ::ItemData *item = inst->GetUnscaledItem(); RoF::structs::ItemSerializationHeader hdr; @@ -5156,7 +5264,7 @@ namespace RoF uint32 hero_model = 0; if (inst->GetOrnamentationIDFile()) { - hero_model = inst->GetOrnamentHeroModel(EQEmu::InventoryProfile::CalcMaterialFromSlot(slot_id_in)); + hero_model = inst->GetOrnamentHeroModel(EQ::InventoryProfile::CalcMaterialFromSlot(slot_id_in)); char tmp[30]; memset(tmp, 0x0, 30); @@ -5356,6 +5464,12 @@ namespace RoF itbs.no_transfer = item->NoTransfer; itbs.expendablearrow = item->ExpendableArrow; + // Done to hack older clients to label expendable fishing poles as such + // July 28th, 2018 patch + if (item->ItemType == EQ::item::ItemTypeFishingPole && item->SubType == 0) { + itbs.expendablearrow = 1; + } + itbs.unknown8 = 0; itbs.unknown9 = 0; itbs.unknown10 = 0; @@ -5504,34 +5618,35 @@ namespace RoF iqbs.HealAmt = item->HealAmt; iqbs.SpellDmg = item->SpellDmg; iqbs.Clairvoyance = item->Clairvoyance; + iqbs.SubType = item->SubType; iqbs.unknown28 = 0; iqbs.unknown30 = 0; iqbs.unknown39 = 1; ob.write((const char*)&iqbs, sizeof(RoF::structs::ItemQuaternaryBodyStruct)); - EQEmu::OutBuffer::pos_type count_pos = ob.tellp(); + EQ::OutBuffer::pos_type count_pos = ob.tellp(); uint32 subitem_count = 0; ob.write((const char*)&subitem_count, sizeof(uint32)); // moved outside of loop since it is not modified within that scope - int16 SubSlotNumber = EQEmu::invbag::SLOT_INVALID; + int16 SubSlotNumber = EQ::invbag::SLOT_INVALID; - if (slot_id_in <= EQEmu::invslot::GENERAL_END && slot_id_in >= EQEmu::invslot::GENERAL_BEGIN) - SubSlotNumber = EQEmu::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in == EQEmu::invslot::slotCursor) - SubSlotNumber = EQEmu::invbag::CURSOR_BAG_BEGIN; - else if (slot_id_in <= EQEmu::invslot::BANK_END && slot_id_in >= EQEmu::invslot::BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::SHARED_BANK_END && slot_id_in >= EQEmu::invslot::SHARED_BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::SHARED_BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); + if (slot_id_in <= EQ::invslot::GENERAL_END && slot_id_in >= EQ::invslot::GENERAL_BEGIN) + SubSlotNumber = EQ::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQ::invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in == EQ::invslot::slotCursor) + SubSlotNumber = EQ::invbag::CURSOR_BAG_BEGIN; + else if (slot_id_in <= EQ::invslot::BANK_END && slot_id_in >= EQ::invslot::BANK_BEGIN) + SubSlotNumber = EQ::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::BANK_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::SHARED_BANK_END && slot_id_in >= EQ::invslot::SHARED_BANK_BEGIN) + SubSlotNumber = EQ::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::SHARED_BANK_BEGIN) * EQ::invbag::SLOT_COUNT); else SubSlotNumber = slot_id_in; // not sure if this is the best way to handle this..leaving for now - if (SubSlotNumber != EQEmu::invbag::SLOT_INVALID) { - for (uint32 index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { - EQEmu::ItemInstance* sub = inst->GetItem(index); + if (SubSlotNumber != EQ::invbag::SLOT_INVALID) { + for (uint32 index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; ++index) { + EQ::ItemInstance* sub = inst->GetItem(index); if (!sub) continue; @@ -5557,77 +5672,77 @@ namespace RoF RoFSlot.AugIndex = invaug::SOCKET_INVALID; RoFSlot.Unknown01 = INULL; - uint32 temp_slot = (uint32) EQEmu::invslot::SLOT_INVALID; + uint32 temp_slot = (uint32) EQ::invslot::SLOT_INVALID; - if (server_slot < EQEmu::invtype::POSSESSIONS_SIZE) { + if (server_slot < EQ::invtype::POSSESSIONS_SIZE) { RoFSlot.Type = invtype::typePossessions; RoFSlot.Slot = server_slot; } - else if (server_slot <= EQEmu::invbag::CURSOR_BAG_END && server_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - temp_slot = server_slot - EQEmu::invbag::GENERAL_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + temp_slot = server_slot - EQ::invbag::GENERAL_BAGS_BEGIN; RoFSlot.Type = invtype::typePossessions; - RoFSlot.Slot = invslot::GENERAL_BEGIN + (temp_slot / EQEmu::invbag::SLOT_COUNT); - RoFSlot.SubIndex = temp_slot - ((RoFSlot.Slot - invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); + RoFSlot.Slot = invslot::GENERAL_BEGIN + (temp_slot / EQ::invbag::SLOT_COUNT); + RoFSlot.SubIndex = temp_slot - ((RoFSlot.Slot - invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::TRIBUTE_END && server_slot >= EQEmu::invslot::TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) { RoFSlot.Type = invtype::typeTribute; - RoFSlot.Slot = server_slot - EQEmu::invslot::TRIBUTE_BEGIN; + RoFSlot.Slot = server_slot - EQ::invslot::TRIBUTE_BEGIN; } - else if (server_slot <= EQEmu::invslot::GUILD_TRIBUTE_END && server_slot >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::GUILD_TRIBUTE_END && server_slot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) { RoFSlot.Type = invtype::typeGuildTribute; - RoFSlot.Slot = server_slot - EQEmu::invslot::GUILD_TRIBUTE_BEGIN; + RoFSlot.Slot = server_slot - EQ::invslot::GUILD_TRIBUTE_BEGIN; } - else if (server_slot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + else if (server_slot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { RoFSlot.Type = invtype::typeWorld; } - else if (server_slot <= EQEmu::invslot::BANK_END && server_slot >= EQEmu::invslot::BANK_BEGIN) { + else if (server_slot <= EQ::invslot::BANK_END && server_slot >= EQ::invslot::BANK_BEGIN) { RoFSlot.Type = invtype::typeBank; - RoFSlot.Slot = server_slot - EQEmu::invslot::BANK_BEGIN; + RoFSlot.Slot = server_slot - EQ::invslot::BANK_BEGIN; } - else if (server_slot <= EQEmu::invbag::BANK_BAGS_END && server_slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { - temp_slot = server_slot - EQEmu::invbag::BANK_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::BANK_BAGS_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) { + temp_slot = server_slot - EQ::invbag::BANK_BAGS_BEGIN; RoFSlot.Type = invtype::typeBank; - RoFSlot.Slot = temp_slot / EQEmu::invbag::SLOT_COUNT; - RoFSlot.SubIndex = temp_slot - (RoFSlot.Slot * EQEmu::invbag::SLOT_COUNT); + RoFSlot.Slot = temp_slot / EQ::invbag::SLOT_COUNT; + RoFSlot.SubIndex = temp_slot - (RoFSlot.Slot * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::SHARED_BANK_END && server_slot >= EQEmu::invslot::SHARED_BANK_BEGIN) { + else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) { RoFSlot.Type = invtype::typeSharedBank; - RoFSlot.Slot = server_slot - EQEmu::invslot::SHARED_BANK_BEGIN; + RoFSlot.Slot = server_slot - EQ::invslot::SHARED_BANK_BEGIN; } - else if (server_slot <= EQEmu::invbag::SHARED_BANK_BAGS_END && server_slot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) { - temp_slot = server_slot - EQEmu::invbag::SHARED_BANK_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { + temp_slot = server_slot - EQ::invbag::SHARED_BANK_BAGS_BEGIN; RoFSlot.Type = invtype::typeSharedBank; - RoFSlot.Slot = temp_slot / EQEmu::invbag::SLOT_COUNT; - RoFSlot.SubIndex = temp_slot - (RoFSlot.Slot * EQEmu::invbag::SLOT_COUNT); + RoFSlot.Slot = temp_slot / EQ::invbag::SLOT_COUNT; + RoFSlot.SubIndex = temp_slot - (RoFSlot.Slot * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::TRADE_END && server_slot >= EQEmu::invslot::TRADE_BEGIN) { + else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) { RoFSlot.Type = invtype::typeTrade; - RoFSlot.Slot = server_slot - EQEmu::invslot::TRADE_BEGIN; + RoFSlot.Slot = server_slot - EQ::invslot::TRADE_BEGIN; } - else if (server_slot <= EQEmu::invbag::TRADE_BAGS_END && server_slot >= EQEmu::invbag::TRADE_BAGS_BEGIN) { - temp_slot = server_slot - EQEmu::invbag::TRADE_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) { + temp_slot = server_slot - EQ::invbag::TRADE_BAGS_BEGIN; RoFSlot.Type = invtype::typeTrade; - RoFSlot.Slot = temp_slot / EQEmu::invbag::SLOT_COUNT; - RoFSlot.SubIndex = temp_slot - (RoFSlot.Slot * EQEmu::invbag::SLOT_COUNT); + RoFSlot.Slot = temp_slot / EQ::invbag::SLOT_COUNT; + RoFSlot.SubIndex = temp_slot - (RoFSlot.Slot * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::WORLD_END && server_slot >= EQEmu::invslot::WORLD_BEGIN) { + else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) { RoFSlot.Type = invtype::typeWorld; - RoFSlot.Slot = server_slot - EQEmu::invslot::WORLD_BEGIN; + RoFSlot.Slot = server_slot - EQ::invslot::WORLD_BEGIN; } Log(Logs::Detail, @@ -5676,7 +5791,7 @@ namespace RoF { uint32 RoFSlot = invslot::SLOT_INVALID; - if (server_corpse_slot <= EQEmu::invslot::CORPSE_END && server_corpse_slot >= EQEmu::invslot::CORPSE_BEGIN) { + if (server_corpse_slot <= EQ::invslot::CORPSE_END && server_corpse_slot >= EQ::invslot::CORPSE_BEGIN) { RoFSlot = server_corpse_slot; } @@ -5693,18 +5808,18 @@ namespace RoF RoFSlot.AugIndex = invaug::SOCKET_INVALID; RoFSlot.Unknown01 = INULL; - uint32 TempSlot = EQEmu::invslot::SLOT_INVALID; + uint32 TempSlot = EQ::invslot::SLOT_INVALID; - if (server_type == EQEmu::invtype::typePossessions) { - if (server_slot < EQEmu::invtype::POSSESSIONS_SIZE) { + if (server_type == EQ::invtype::typePossessions) { + if (server_slot < EQ::invtype::POSSESSIONS_SIZE) { RoFSlot.Slot = server_slot; } - else if (server_slot <= EQEmu::invbag::CURSOR_BAG_END && server_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - TempSlot = server_slot - EQEmu::invbag::GENERAL_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + TempSlot = server_slot - EQ::invbag::GENERAL_BAGS_BEGIN; - RoFSlot.Slot = invslot::GENERAL_BEGIN + (TempSlot / EQEmu::invbag::SLOT_COUNT); - RoFSlot.SubIndex = TempSlot - ((RoFSlot.Slot - invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); + RoFSlot.Slot = invslot::GENERAL_BEGIN + (TempSlot / EQ::invbag::SLOT_COUNT); + RoFSlot.SubIndex = TempSlot - ((RoFSlot.Slot - invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); } } @@ -5725,12 +5840,12 @@ namespace RoF rof_slot.AugIndex, rof_slot.Unknown02, rof_slot.Unknown01, - EQEmu::invslot::SLOT_INVALID); + EQ::invslot::SLOT_INVALID); - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; } - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; uint32 temp_slot = invslot::SLOT_INVALID; switch (rof_slot.Type) { @@ -5740,10 +5855,10 @@ namespace RoF server_slot = rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { if (rof_slot.Slot < invslot::GENERAL_BEGIN) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; temp_slot = (rof_slot.Slot - invslot::GENERAL_BEGIN) * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::GENERAL_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::GENERAL_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5752,10 +5867,10 @@ namespace RoF case invtype::typeBank: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::BANK_SIZE) { if (rof_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::BANK_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::BANK_BEGIN + rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5764,10 +5879,10 @@ namespace RoF case invtype::typeSharedBank: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::SHARED_BANK_SIZE) { if (rof_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::SHARED_BANK_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::SHARED_BANK_BEGIN + rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::SHARED_BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5776,10 +5891,10 @@ namespace RoF case invtype::typeTrade: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::TRADE_SIZE) { if (rof_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::TRADE_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::TRADE_BEGIN + rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::TRADE_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::TRADE_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5787,32 +5902,32 @@ namespace RoF } case invtype::typeWorld: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::WORLD_SIZE) { - server_slot = EQEmu::invslot::WORLD_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::WORLD_BEGIN + rof_slot.Slot; } else if (rof_slot.Slot == invslot::SLOT_INVALID) { - server_slot = EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; + server_slot = EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; } break; } case invtype::typeLimbo: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::LIMBO_SIZE) { - server_slot = EQEmu::invslot::slotCursor; + server_slot = EQ::invslot::slotCursor; } break; } case invtype::typeTribute: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::TRIBUTE_SIZE) { - server_slot = EQEmu::invslot::TRIBUTE_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::TRIBUTE_BEGIN + rof_slot.Slot; } break; } case invtype::typeGuildTribute: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::GUILD_TRIBUTE_SIZE) { - server_slot = EQEmu::invslot::GUILD_TRIBUTE_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::GUILD_TRIBUTE_BEGIN + rof_slot.Slot; } break; @@ -5846,10 +5961,10 @@ namespace RoF static inline uint32 RoFToServerCorpseSlot(structs::InventorySlot_Struct rof_corpse_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (rof_corpse_slot.Type != invtype::typeCorpse || rof_corpse_slot.SubIndex != invbag::SLOT_INVALID || rof_corpse_slot.AugIndex != invaug::SOCKET_INVALID) { - server_slot = EQEmu::invslot::SLOT_INVALID; + server_slot = EQ::invslot::SLOT_INVALID; } else { @@ -5871,7 +5986,7 @@ namespace RoF } static inline uint32 RoFToServerCorpseMainSlot(uint32 rof_corpse_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (rof_corpse_slot <= invslot::CORPSE_END && rof_corpse_slot >= invslot::CORPSE_BEGIN) { server_slot = rof_corpse_slot; @@ -5897,12 +6012,12 @@ namespace RoF rof_slot.AugIndex, rof_type, rof_slot.Unknown01, - EQEmu::invslot::SLOT_INVALID); + EQ::invslot::SLOT_INVALID); - return (uint32) EQEmu::invslot::SLOT_INVALID; + return (uint32) EQ::invslot::SLOT_INVALID; } - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; uint32 temp_slot = invslot::SLOT_INVALID; switch (rof_type) { @@ -5912,10 +6027,10 @@ namespace RoF server_slot = rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { if (rof_slot.Slot < invslot::GENERAL_BEGIN) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; temp_slot = (rof_slot.Slot - invslot::GENERAL_BEGIN) * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::GENERAL_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::GENERAL_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5924,10 +6039,10 @@ namespace RoF case invtype::typeBank: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::BANK_SIZE) { if (rof_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::BANK_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::BANK_BEGIN + rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5936,10 +6051,10 @@ namespace RoF case invtype::typeSharedBank: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::SHARED_BANK_SIZE) { if (rof_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::SHARED_BANK_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::SHARED_BANK_BEGIN + rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::SHARED_BANK_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5948,10 +6063,10 @@ namespace RoF case invtype::typeTrade: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::TRADE_SIZE) { if (rof_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::TRADE_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::TRADE_BEGIN + rof_slot.Slot; } else if (rof_slot.SubIndex >= invbag::SLOT_BEGIN && rof_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::TRADE_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; + server_slot = EQ::invbag::TRADE_BAGS_BEGIN + temp_slot + rof_slot.SubIndex; } } @@ -5959,32 +6074,32 @@ namespace RoF } case invtype::typeWorld: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::WORLD_SIZE) { - server_slot = EQEmu::invslot::WORLD_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::WORLD_BEGIN + rof_slot.Slot; } else if (rof_slot.Slot == invslot::SLOT_INVALID) { - server_slot = EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; + server_slot = EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; } break; } case invtype::typeLimbo: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::LIMBO_SIZE) { - server_slot = EQEmu::invslot::slotCursor; + server_slot = EQ::invslot::slotCursor; } break; } case invtype::typeTribute: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::TRIBUTE_SIZE) { - server_slot = EQEmu::invslot::TRIBUTE_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::TRIBUTE_BEGIN + rof_slot.Slot; } break; } case invtype::typeGuildTribute: { if (rof_slot.Slot >= invslot::SLOT_BEGIN && rof_slot.Slot < invtype::GUILD_TRIBUTE_SIZE) { - server_slot = EQEmu::invslot::GUILD_TRIBUTE_BEGIN + rof_slot.Slot; + server_slot = EQ::invslot::GUILD_TRIBUTE_BEGIN + rof_slot.Slot; } break; @@ -6017,7 +6132,7 @@ namespace RoF static inline void ServerToRoFSayLink(std::string& rofSayLink, const std::string& serverSayLink) { - if ((constants::SAY_LINK_BODY_SIZE == EQEmu::constants::SAY_LINK_BODY_SIZE) || (serverSayLink.find('\x12') == std::string::npos)) { + if ((constants::SAY_LINK_BODY_SIZE == EQ::constants::SAY_LINK_BODY_SIZE) || (serverSayLink.find('\x12') == std::string::npos)) { rofSayLink = serverSayLink; return; } @@ -6026,7 +6141,7 @@ namespace RoF for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) { if (segment_iter & 1) { - if (segments[segment_iter].length() <= EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (segments[segment_iter].length() <= EQ::constants::SAY_LINK_BODY_SIZE) { rofSayLink.append(segments[segment_iter]); // TODO: log size mismatch error continue; @@ -6056,7 +6171,7 @@ namespace RoF static inline void RoFToServerSayLink(std::string& serverSayLink, const std::string& rofSayLink) { - if ((EQEmu::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (rofSayLink.find('\x12') == std::string::npos)) { + if ((EQ::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (rofSayLink.find('\x12') == std::string::npos)) { serverSayLink = rofSayLink; return; } @@ -6088,80 +6203,80 @@ namespace RoF } } - static inline spells::CastingSlot ServerToRoFCastingSlot(EQEmu::spells::CastingSlot slot) + static inline spells::CastingSlot ServerToRoFCastingSlot(EQ::spells::CastingSlot slot) { switch (slot) { - case EQEmu::spells::CastingSlot::Gem1: + case EQ::spells::CastingSlot::Gem1: return spells::CastingSlot::Gem1; - case EQEmu::spells::CastingSlot::Gem2: + case EQ::spells::CastingSlot::Gem2: return spells::CastingSlot::Gem2; - case EQEmu::spells::CastingSlot::Gem3: + case EQ::spells::CastingSlot::Gem3: return spells::CastingSlot::Gem3; - case EQEmu::spells::CastingSlot::Gem4: + case EQ::spells::CastingSlot::Gem4: return spells::CastingSlot::Gem4; - case EQEmu::spells::CastingSlot::Gem5: + case EQ::spells::CastingSlot::Gem5: return spells::CastingSlot::Gem5; - case EQEmu::spells::CastingSlot::Gem6: + case EQ::spells::CastingSlot::Gem6: return spells::CastingSlot::Gem6; - case EQEmu::spells::CastingSlot::Gem7: + case EQ::spells::CastingSlot::Gem7: return spells::CastingSlot::Gem7; - case EQEmu::spells::CastingSlot::Gem8: + case EQ::spells::CastingSlot::Gem8: return spells::CastingSlot::Gem8; - case EQEmu::spells::CastingSlot::Gem9: + case EQ::spells::CastingSlot::Gem9: return spells::CastingSlot::Gem9; - case EQEmu::spells::CastingSlot::Gem10: + case EQ::spells::CastingSlot::Gem10: return spells::CastingSlot::Gem10; - case EQEmu::spells::CastingSlot::Gem11: + case EQ::spells::CastingSlot::Gem11: return spells::CastingSlot::Gem11; - case EQEmu::spells::CastingSlot::Gem12: + case EQ::spells::CastingSlot::Gem12: return spells::CastingSlot::Gem12; - case EQEmu::spells::CastingSlot::Item: - case EQEmu::spells::CastingSlot::PotionBelt: + case EQ::spells::CastingSlot::Item: + case EQ::spells::CastingSlot::PotionBelt: return spells::CastingSlot::Item; - case EQEmu::spells::CastingSlot::Discipline: + case EQ::spells::CastingSlot::Discipline: return spells::CastingSlot::Discipline; - case EQEmu::spells::CastingSlot::AltAbility: + case EQ::spells::CastingSlot::AltAbility: return spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something return spells::CastingSlot::Discipline; } } - static inline EQEmu::spells::CastingSlot RoFToServerCastingSlot(spells::CastingSlot slot) + static inline EQ::spells::CastingSlot RoFToServerCastingSlot(spells::CastingSlot slot) { switch (slot) { case spells::CastingSlot::Gem1: - return EQEmu::spells::CastingSlot::Gem1; + return EQ::spells::CastingSlot::Gem1; case spells::CastingSlot::Gem2: - return EQEmu::spells::CastingSlot::Gem2; + return EQ::spells::CastingSlot::Gem2; case spells::CastingSlot::Gem3: - return EQEmu::spells::CastingSlot::Gem3; + return EQ::spells::CastingSlot::Gem3; case spells::CastingSlot::Gem4: - return EQEmu::spells::CastingSlot::Gem4; + return EQ::spells::CastingSlot::Gem4; case spells::CastingSlot::Gem5: - return EQEmu::spells::CastingSlot::Gem5; + return EQ::spells::CastingSlot::Gem5; case spells::CastingSlot::Gem6: - return EQEmu::spells::CastingSlot::Gem6; + return EQ::spells::CastingSlot::Gem6; case spells::CastingSlot::Gem7: - return EQEmu::spells::CastingSlot::Gem7; + return EQ::spells::CastingSlot::Gem7; case spells::CastingSlot::Gem8: - return EQEmu::spells::CastingSlot::Gem8; + return EQ::spells::CastingSlot::Gem8; case spells::CastingSlot::Gem9: - return EQEmu::spells::CastingSlot::Gem9; + return EQ::spells::CastingSlot::Gem9; case spells::CastingSlot::Gem10: - return EQEmu::spells::CastingSlot::Gem10; + return EQ::spells::CastingSlot::Gem10; case spells::CastingSlot::Gem11: - return EQEmu::spells::CastingSlot::Gem11; + return EQ::spells::CastingSlot::Gem11; case spells::CastingSlot::Gem12: - return EQEmu::spells::CastingSlot::Gem12; + return EQ::spells::CastingSlot::Gem12; case spells::CastingSlot::Discipline: - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; case spells::CastingSlot::Item: - return EQEmu::spells::CastingSlot::Item; + return EQ::spells::CastingSlot::Item; case spells::CastingSlot::AltAbility: - return EQEmu::spells::CastingSlot::AltAbility; + return EQ::spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; } } @@ -6170,12 +6285,12 @@ namespace RoF static inline int ServerToRoFBuffSlot(int index) { // we're a disc - if (index >= EQEmu::spells::LONG_BUFFS + EQEmu::spells::SHORT_BUFFS) - return index - EQEmu::spells::LONG_BUFFS - EQEmu::spells::SHORT_BUFFS + + if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS) + return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS + spells::LONG_BUFFS + spells::SHORT_BUFFS; // we're a song - if (index >= EQEmu::spells::LONG_BUFFS) - return index - EQEmu::spells::LONG_BUFFS + spells::LONG_BUFFS; + if (index >= EQ::spells::LONG_BUFFS) + return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } @@ -6184,11 +6299,11 @@ namespace RoF { // we're a disc if (index >= spells::LONG_BUFFS + spells::SHORT_BUFFS) - return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQEmu::spells::LONG_BUFFS + - EQEmu::spells::SHORT_BUFFS; + return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQ::spells::LONG_BUFFS + + EQ::spells::SHORT_BUFFS; // we're a song if (index >= spells::LONG_BUFFS) - return index - spells::LONG_BUFFS + EQEmu::spells::LONG_BUFFS; + return index - spells::LONG_BUFFS + EQ::spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } diff --git a/common/patches/rof.h b/common/patches/rof.h index 205998b32..21a525192 100644 --- a/common/patches/rof.h +++ b/common/patches/rof.h @@ -43,7 +43,7 @@ namespace RoF protected: virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; //magic macro to declare our opcode processors #include "ss_declare.h" diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 36257771b..55fbfe2c8 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -46,7 +46,7 @@ namespace RoF2 static OpcodeManager *opcodes = nullptr; static Strategy struct_strategy; - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id, uint8 depth, ItemPacketType packet_type); + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id, uint8 depth, ItemPacketType packet_type); // server to client inventory location converters static inline structs::InventorySlot_Struct ServerToRoF2Slot(uint32 server_slot); @@ -66,8 +66,8 @@ namespace RoF2 // client to server say link converter static inline void RoF2ToServerSayLink(std::string &server_saylink, const std::string &rof2_saylink); - static inline spells::CastingSlot ServerToRoF2CastingSlot(EQEmu::spells::CastingSlot slot); - static inline EQEmu::spells::CastingSlot RoF2ToServerCastingSlot(spells::CastingSlot slot); + static inline spells::CastingSlot ServerToRoF2CastingSlot(EQ::spells::CastingSlot slot); + static inline EQ::spells::CastingSlot RoF2ToServerCastingSlot(spells::CastingSlot slot); static inline int ServerToRoF2BuffSlot(int index); static inline int RoF2ToServerBuffSlot(int index); @@ -151,9 +151,9 @@ namespace RoF2 return(r); } - const EQEmu::versions::ClientVersion Strategy::ClientVersion() const + const EQ::versions::ClientVersion Strategy::ClientVersion() const { - return EQEmu::versions::ClientVersion::RoF2; + return EQ::versions::ClientVersion::RoF2; } #include "ss_define.h" @@ -263,7 +263,7 @@ namespace RoF2 eq->unknown000 = 1; OUT(npcid); - eq->inventory_slot = ServerToRoF2TypelessSlot(emu->slot, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoF2TypelessSlot(emu->slot, EQ::invtype::typePossessions); OUT(charges); OUT(sell_price); @@ -316,7 +316,7 @@ namespace RoF2 SETUP_DIRECT_ENCODE(AltCurrencySellItem_Struct, structs::AltCurrencySellItem_Struct); OUT(merchant_entity_id); - eq->inventory_slot = ServerToRoF2TypelessSlot(emu->slot_id, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoF2TypelessSlot(emu->slot_id, EQ::invtype::typePossessions); OUT(charges); OUT(cost); @@ -340,7 +340,7 @@ namespace RoF2 ENCODE_LENGTH_EXACT(ApplyPoison_Struct); SETUP_DIRECT_ENCODE(ApplyPoison_Struct, structs::ApplyPoison_Struct); - eq->inventorySlot = ServerToRoF2TypelessSlot(emu->inventorySlot, EQEmu::invtype::typePossessions); + eq->inventorySlot = ServerToRoF2TypelessSlot(emu->inventorySlot, EQ::invtype::typePossessions); OUT(success); FINISH_ENCODE(); @@ -571,7 +571,7 @@ namespace RoF2 ENCODE_LENGTH_EXACT(CastSpell_Struct); SETUP_DIRECT_ENCODE(CastSpell_Struct, structs::CastSpell_Struct); - eq->slot = static_cast(ServerToRoF2CastingSlot(static_cast(emu->slot))); + eq->slot = static_cast(ServerToRoF2CastingSlot(static_cast(emu->slot))); OUT(spell_id); eq->inventory_slot = ServerToRoF2Slot(emu->inventoryslot); @@ -639,24 +639,24 @@ namespace RoF2 //store away the emu struct uchar* __emu_buffer = in->pBuffer; - int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct); - if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) { + int item_count = in->size / sizeof(EQ::InternalSerializedItem_Struct); + if (!item_count || (in->size % sizeof(EQ::InternalSerializedItem_Struct)) != 0) { Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct)); + opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQ::InternalSerializedItem_Struct)); delete in; return; } - EQEmu::InternalSerializedItem_Struct* eq = (EQEmu::InternalSerializedItem_Struct*)in->pBuffer; + EQ::InternalSerializedItem_Struct* eq = (EQ::InternalSerializedItem_Struct*)in->pBuffer; - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)&item_count, sizeof(uint32)); for (int index = 0; index < item_count; ++index, ++eq) { - SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0, ItemPacketCharInventory); + SerializeItem(ob, (const EQ::ItemInstance*)eq->inst, eq->slot_id, 0, ItemPacketCharInventory); if (ob.tellp() == last_pos) LogNetcode("RoF2::ENCODE(OP_CharInventory) Serialization failed on item slot [{}] during OP_CharInventory. Item skipped", eq->slot_id); @@ -759,15 +759,48 @@ namespace RoF2 FINISH_ENCODE(); } + ENCODE(OP_DzChooseZone) + { + SETUP_VAR_ENCODE(DynamicZoneChooseZone_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + + for (uint32 i = 0; i < emu->count; ++i) + { + buf.WriteUInt16(emu->choices[i].dz_zone_id); + buf.WriteUInt16(emu->choices[i].dz_instance_id); + buf.WriteUInt32(emu->choices[i].unknown_id1); + buf.WriteUInt32(emu->choices[i].dz_type); + buf.WriteUInt32(emu->choices[i].unknown_id2); + buf.WriteString(emu->choices[i].description); + buf.WriteString(emu->choices[i].leader_name); + } + + __packet->size = buf.size(); + __packet->pBuffer = new unsigned char[__packet->size]; + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); + + FINISH_ENCODE(); + } + ENCODE(OP_DzCompass) { - SETUP_VAR_ENCODE(ExpeditionCompass_Struct); - ALLOC_VAR_ENCODE(structs::ExpeditionCompass_Struct, sizeof(structs::ExpeditionInfo_Struct) + sizeof(structs::ExpeditionCompassEntry_Struct) * emu->count); + SETUP_VAR_ENCODE(DynamicZoneCompass_Struct); + ALLOC_VAR_ENCODE(structs::DynamicZoneCompass_Struct, + sizeof(structs::DynamicZoneCompass_Struct) + + sizeof(structs::DynamicZoneCompassEntry_Struct) * emu->count + ); + OUT(client_id); OUT(count); for (uint32 i = 0; i < emu->count; ++i) { + OUT(entries[i].dz_zone_id); + OUT(entries[i].dz_instance_id); + OUT(entries[i].dz_type); OUT(entries[i].x); OUT(entries[i].y); OUT(entries[i].z); @@ -788,112 +821,108 @@ namespace RoF2 ENCODE(OP_DzExpeditionInfo) { - ENCODE_LENGTH_EXACT(ExpeditionInfo_Struct); - SETUP_DIRECT_ENCODE(ExpeditionInfo_Struct, structs::ExpeditionInfo_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneInfo_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneInfo_Struct, structs::DynamicZoneInfo_Struct); + OUT(client_id); + OUT(assigned); OUT(max_players); - eq->unknown004 = 785316192; - eq->unknown008 = 435601; - strncpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); - strncpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); + strn0cpy(eq->dz_name, emu->dz_name, sizeof(eq->dz_name)); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } - ENCODE(OP_DzExpeditionList) + ENCODE(OP_DzExpeditionInvite) { - SETUP_VAR_ENCODE(ExpeditionLockoutList_Struct); + ENCODE_LENGTH_EXACT(ExpeditionInvite_Struct); + SETUP_DIRECT_ENCODE(ExpeditionInvite_Struct, structs::ExpeditionInvite_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); + OUT(client_id); + strn0cpy(eq->inviter_name, emu->inviter_name, sizeof(eq->inviter_name)); + strn0cpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); + OUT(swapping); + strn0cpy(eq->swap_name, emu->swap_name, sizeof(eq->swap_name)); + OUT(dz_zone_id); + OUT(dz_instance_id); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzExpeditionLockoutTimers) + { + SETUP_VAR_ENCODE(ExpeditionLockoutTimers_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); for (uint32 i = 0; i < emu->count; ++i) { - ss.write(emu->entries[i].expedition, strlen(emu->entries[i].expedition)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].time_left, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->entries[i].expedition_event, strlen(emu->entries[i].expedition_event)); - ss.write((const char*)&null_term, sizeof(char)); + buf.WriteString(emu->timers[i].expedition_name); + buf.WriteUInt32(emu->timers[i].seconds_remaining); + buf.WriteInt32(emu->timers[i].event_type); + buf.WriteString(emu->timers[i].event_name); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } - ENCODE(OP_DzJoinExpeditionConfirm) + ENCODE(OP_DzSetLeaderName) { - ENCODE_LENGTH_EXACT(ExpeditionJoinPrompt_Struct); - SETUP_DIRECT_ENCODE(ExpeditionJoinPrompt_Struct, structs::ExpeditionJoinPrompt_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneLeaderName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneLeaderName_Struct, structs::DynamicZoneLeaderName_Struct); - strncpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); - strncpy(eq->player_name, emu->player_name, sizeof(eq->player_name)); - - FINISH_ENCODE(); - } - - ENCODE(OP_DzLeaderStatus) - { - SETUP_VAR_ENCODE(ExpeditionLeaderSet_Struct); - - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->leader_name, strlen(emu->leader_name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//0xffffffff - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//1 - ss.write((const char*)&client_id, sizeof(uint32)); - - __packet->size = ss.str().length(); - __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + OUT(client_id); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } ENCODE(OP_DzMemberList) { - SETUP_VAR_ENCODE(ExpeditionMemberList_Struct); + SETUP_VAR_ENCODE(DynamicZoneMemberList_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (uint32 i = 0; i < emu->count; ++i) + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->member_count); + for (uint32 i = 0; i < emu->member_count; ++i) { - ss.write(emu->entries[i].name, strlen(emu->entries[i].name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].status, sizeof(char)); + buf.WriteString(emu->members[i].name); + buf.WriteUInt8(emu->members[i].online_status); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } + ENCODE(OP_DzMemberListName) + { + ENCODE_LENGTH_EXACT(DynamicZoneMemberListName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneMemberListName_Struct, structs::DynamicZoneMemberListName_Struct); + + OUT(client_id); + OUT(add_name); + strn0cpy(eq->name, emu->name, sizeof(eq->name)); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzMemberListStatus) + { + auto emu = reinterpret_cast((*p)->pBuffer); + if (emu->member_count == 1) + { + ENCODE_FORWARD(OP_DzMemberList); + } + } + ENCODE(OP_Emote) { EQApplicationPacket *in = *p; @@ -1562,14 +1591,14 @@ namespace RoF2 uchar* __emu_buffer = in->pBuffer; ItemPacket_Struct* old_item_pkt = (ItemPacket_Struct*)__emu_buffer; - EQEmu::InternalSerializedItem_Struct* int_struct = (EQEmu::InternalSerializedItem_Struct*)(&__emu_buffer[4]); + EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)__emu_buffer, 4); - SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType); + SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType); if (ob.tellp() == last_pos) { LogNetcode("RoF2::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id); delete in; @@ -1876,6 +1905,7 @@ namespace RoF2 OUT(FastRegenHP); OUT(FastRegenMana); OUT(FastRegenEndurance); + OUT(underworld_teleport_index); eq->FogDensity = emu->fog_density; @@ -1995,7 +2025,7 @@ namespace RoF2 for (int r = 0; r < 5; r++) { - outapp->WriteUInt32(emu->binds[r].zoneId); + outapp->WriteUInt32(emu->binds[r].zone_id); outapp->WriteFloat(emu->binds[r].x); outapp->WriteFloat(emu->binds[r].y); outapp->WriteFloat(emu->binds[r].z); @@ -2014,7 +2044,7 @@ namespace RoF2 outapp->WriteUInt32(22); // Equipment count - for (int r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) + for (int r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { outapp->WriteUInt32(emu->item_material.Slot[r].Material); outapp->WriteUInt32(0); @@ -2034,9 +2064,9 @@ namespace RoF2 outapp->WriteUInt32(0); } - outapp->WriteUInt32(EQEmu::textures::materialCount); // Equipment2 count + outapp->WriteUInt32(EQ::textures::materialCount); // Equipment2 count - for (int r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) + for (int r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { outapp->WriteUInt32(0); outapp->WriteUInt32(0); @@ -2045,7 +2075,7 @@ namespace RoF2 outapp->WriteUInt32(0); } - outapp->WriteUInt32(EQEmu::textures::materialCount); // Tint Count + outapp->WriteUInt32(EQ::textures::materialCount); // Tint Count for (int r = 0; r < 7; r++) { @@ -2055,7 +2085,7 @@ namespace RoF2 outapp->WriteUInt32(0); outapp->WriteUInt32(0); - outapp->WriteUInt32(EQEmu::textures::materialCount); // Tint2 Count + outapp->WriteUInt32(EQ::textures::materialCount); // Tint2 Count for (int r = 0; r < 7; r++) { @@ -2184,7 +2214,7 @@ namespace RoF2 outapp->WriteUInt32(spells::SPELLBOOK_SIZE); // Spellbook slots - if (spells::SPELLBOOK_SIZE <= EQEmu::spells::SPELLBOOK_SIZE) { + if (spells::SPELLBOOK_SIZE <= EQ::spells::SPELLBOOK_SIZE) { for (uint32 r = 0; r < spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) outapp->WriteUInt32(emu->spell_book[r]); @@ -2193,33 +2223,33 @@ namespace RoF2 } } else { - for (uint32 r = 0; r < EQEmu::spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = 0; r < EQ::spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) outapp->WriteUInt32(emu->spell_book[r]); else outapp->WriteUInt32(0xFFFFFFFFU); } // invalidate the rest of the spellbook slots - for (uint32 r = EQEmu::spells::SPELLBOOK_SIZE; r < spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = EQ::spells::SPELLBOOK_SIZE; r < spells::SPELLBOOK_SIZE; r++) { outapp->WriteUInt32(0xFFFFFFFFU); } } outapp->WriteUInt32(spells::SPELL_GEM_COUNT); // Memorised spell slots - for (uint32 r = 0; r < EQEmu::spells::SPELL_GEM_COUNT; r++) // write first 12 + for (uint32 r = 0; r < EQ::spells::SPELL_GEM_COUNT; r++) // write first 12 { outapp->WriteUInt32(emu->mem_spells[r]); } // zeroes for the rest of the slots the other 4, which actually don't work on the client at all :D - for (uint32 r = 0; r < spells::SPELL_GEM_COUNT - EQEmu::spells::SPELL_GEM_COUNT; r++) + for (uint32 r = 0; r < spells::SPELL_GEM_COUNT - EQ::spells::SPELL_GEM_COUNT; r++) { outapp->WriteUInt32(0xFFFFFFFFU); } outapp->WriteUInt32(13); // gem refresh counts - for (uint32 r = 0; r < EQEmu::spells::SPELL_GEM_COUNT; r++) + for (uint32 r = 0; r < EQ::spells::SPELL_GEM_COUNT; r++) { outapp->WriteUInt32(emu->spellSlotRefresh[r]); // spell gem refresh } @@ -2308,7 +2338,7 @@ namespace RoF2 outapp->WriteUInt32(profile::BANDOLIERS_SIZE); // Copy bandoliers where server and client indices converge - for (uint32 r = 0; r < EQEmu::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { + for (uint32 r = 0; r < EQ::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { outapp->WriteString(emu->bandoliers[r].Name); for (uint32 j = 0; j < profile::BANDOLIER_ITEM_COUNT; ++j) { // Will need adjusting if 'server != client' is ever true outapp->WriteString(emu->bandoliers[r].Items[j].Name); @@ -2323,7 +2353,7 @@ namespace RoF2 } } // Nullify bandoliers where server and client indices diverge, with a client bias - for (uint32 r = EQEmu::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { + for (uint32 r = EQ::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { outapp->WriteString(""); for (uint32 j = 0; j < profile::BANDOLIER_ITEM_COUNT; ++j) { // Will need adjusting if 'server != client' is ever true outapp->WriteString(""); @@ -2335,7 +2365,7 @@ namespace RoF2 outapp->WriteUInt32(profile::POTION_BELT_SIZE); // Copy potion belt where server and client indices converge - for (uint32 r = 0; r < EQEmu::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { + for (uint32 r = 0; r < EQ::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { outapp->WriteString(emu->potionbelt.Items[r].Name); outapp->WriteUInt32(emu->potionbelt.Items[r].ID); if (emu->potionbelt.Items[r].Icon) { @@ -2347,7 +2377,7 @@ namespace RoF2 } } // Nullify potion belt where server and client indices diverge, with a client bias - for (uint32 r = EQEmu::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { + for (uint32 r = EQ::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { outapp->WriteString(""); outapp->WriteUInt32(0); outapp->WriteSInt32(-1); @@ -2464,9 +2494,9 @@ namespace RoF2 outapp->WriteUInt8(0); // Unknown outapp->WriteUInt8(0); // Unknown - outapp->WriteUInt32(EQEmu::invtype::TRIBUTE_SIZE); + outapp->WriteUInt32(EQ::invtype::TRIBUTE_SIZE); - for (uint32 r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) + for (uint32 r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { outapp->WriteUInt32(emu->tributes[r].tribute); outapp->WriteUInt32(emu->tributes[r].tier); @@ -3015,7 +3045,7 @@ namespace RoF2 eq_cse->Gender = emu_cse->Gender; eq_cse->Face = emu_cse->Face; - for (int equip_index = 0; equip_index < EQEmu::textures::materialCount; equip_index++) { + for (int equip_index = 0; equip_index < EQ::textures::materialCount; equip_index++) { eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; @@ -3114,7 +3144,7 @@ namespace RoF2 SETUP_DIRECT_ENCODE(Merchant_Purchase_Struct, structs::Merchant_Purchase_Struct); OUT(npcid); - eq->inventory_slot = ServerToRoF2TypelessSlot(emu->itemslot, EQEmu::invtype::typePossessions); + eq->inventory_slot = ServerToRoF2TypelessSlot(emu->itemslot, EQ::invtype::typePossessions); //OUT(itemslot); OUT(quantity); OUT(price); @@ -4183,7 +4213,7 @@ namespace RoF2 if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)) { - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; ++k) + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k) { { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color); @@ -4192,7 +4222,7 @@ namespace RoF2 structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer; - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; k++) { + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) { Equipment[k].Material = emu->equipment.Slot[k].Material; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteModel; @@ -4200,7 +4230,7 @@ namespace RoF2 Equipment[k].Material2 = emu->equipment.Slot[k].Unknown2; } - Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::materialCount); + Buffer += (sizeof(structs::Texture_Struct) * EQ::textures::materialCount); } else { @@ -4584,6 +4614,84 @@ namespace RoF2 FINISH_DIRECT_DECODE(); } + DECODE(OP_DzAddPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzChooseZoneReply) + { + DECODE_LENGTH_EXACT(structs::DynamicZoneChooseZoneReply_Struct); + SETUP_DIRECT_DECODE(DynamicZoneChooseZoneReply_Struct, structs::DynamicZoneChooseZoneReply_Struct); + + IN(unknown000); + IN(unknown004); + IN(unknown008); + IN(unknown_id1); + IN(dz_zone_id); + IN(dz_instance_id); + IN(dz_type); + IN(unknown_id2); + IN(unknown028); + IN(unknown032); + IN(unknown036); + IN(unknown040); + IN(unknown044); + IN(unknown048); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzExpeditionInviteResponse) + { + DECODE_LENGTH_EXACT(structs::ExpeditionInviteResponse_Struct); + SETUP_DIRECT_DECODE(ExpeditionInviteResponse_Struct, structs::ExpeditionInviteResponse_Struct); + + IN(dz_zone_id); + IN(dz_instance_id); + IN(accepted); + IN(swapping); + strn0cpy(emu->swap_name, eq->swap_name, sizeof(emu->swap_name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzMakeLeader) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzRemovePlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzSwapPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommandSwap_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommandSwap_Struct, structs::ExpeditionCommandSwap_Struct); + + strn0cpy(emu->add_player_name, eq->add_player_name, sizeof(emu->add_player_name)); + strn0cpy(emu->rem_player_name, eq->rem_player_name, sizeof(emu->rem_player_name)); + + FINISH_DIRECT_DECODE(); + } + DECODE(OP_Emote) { unsigned char *__eq_buffer = __packet->pBuffer; @@ -4911,7 +5019,7 @@ namespace RoF2 IN(item_id); int r; - for (r = EQEmu::invaug::SOCKET_BEGIN; r <= EQEmu::invaug::SOCKET_END; r++) { + for (r = EQ::invaug::SOCKET_BEGIN; r <= EQ::invaug::SOCKET_END; r++) { IN(augments[r]); } IN(link_hash); @@ -4936,7 +5044,7 @@ namespace RoF2 DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct); SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct); - for (unsigned int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (unsigned int i = 0; i < EQ::spells::SPELL_GEM_COUNT; ++i) { if (eq->spell[i] == 0) emu->spell[i] = 0xFFFFFFFF; @@ -5346,9 +5454,9 @@ namespace RoF2 return NextItemInstSerialNumber; } - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth, ItemPacketType packet_type) + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth, ItemPacketType packet_type) { - const EQEmu::ItemData *item = inst->GetUnscaledItem(); + const EQ::ItemData *item = inst->GetUnscaledItem(); RoF2::structs::ItemSerializationHeader hdr; @@ -5411,7 +5519,7 @@ namespace RoF2 uint32 hero_model = 0; if (inst->GetOrnamentationIDFile()) { - hero_model = inst->GetOrnamentHeroModel(EQEmu::InventoryProfile::CalcMaterialFromSlot(slot_id_in)); + hero_model = inst->GetOrnamentHeroModel(EQ::InventoryProfile::CalcMaterialFromSlot(slot_id_in)); char tmp[30]; memset(tmp, 0x0, 30); @@ -5611,6 +5719,12 @@ namespace RoF2 itbs.no_transfer = item->NoTransfer; itbs.expendablearrow = item->ExpendableArrow; + // Done to hack older clients to label expendable fishing poles as such + // July 28th, 2018 patch + if (item->ItemType == EQ::item::ItemTypeFishingPole && item->SubType == 0) { + itbs.expendablearrow = 1; + } + itbs.unknown8 = 0; itbs.unknown9 = 0; itbs.unknown10 = 0; @@ -5759,6 +5873,7 @@ namespace RoF2 iqbs.HealAmt = item->HealAmt; iqbs.SpellDmg = item->SpellDmg; iqbs.Clairvoyance = item->Clairvoyance; + iqbs.SubType = item->SubType; //unknown18; //Power Source Capacity or evolve filename? //evolve_string; // Some String, but being evolution related is just a guess @@ -5775,28 +5890,28 @@ namespace RoF2 ob.write((const char*)&iqbs, sizeof(RoF2::structs::ItemQuaternaryBodyStruct)); - EQEmu::OutBuffer::pos_type count_pos = ob.tellp(); + EQ::OutBuffer::pos_type count_pos = ob.tellp(); uint32 subitem_count = 0; ob.write((const char*)&subitem_count, sizeof(uint32)); // moved outside of loop since it is not modified within that scope - int16 SubSlotNumber = EQEmu::invbag::SLOT_INVALID; + int16 SubSlotNumber = EQ::invbag::SLOT_INVALID; - if (slot_id_in <= EQEmu::invslot::GENERAL_END && slot_id_in >= EQEmu::invslot::GENERAL_BEGIN) - SubSlotNumber = EQEmu::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in == EQEmu::invslot::slotCursor) - SubSlotNumber = EQEmu::invbag::CURSOR_BAG_BEGIN; - else if (slot_id_in <= EQEmu::invslot::BANK_END && slot_id_in >= EQEmu::invslot::BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::SHARED_BANK_END && slot_id_in >= EQEmu::invslot::SHARED_BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::SHARED_BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); + if (slot_id_in <= EQ::invslot::GENERAL_END && slot_id_in >= EQ::invslot::GENERAL_BEGIN) + SubSlotNumber = EQ::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQ::invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in == EQ::invslot::slotCursor) + SubSlotNumber = EQ::invbag::CURSOR_BAG_BEGIN; + else if (slot_id_in <= EQ::invslot::BANK_END && slot_id_in >= EQ::invslot::BANK_BEGIN) + SubSlotNumber = EQ::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::BANK_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::SHARED_BANK_END && slot_id_in >= EQ::invslot::SHARED_BANK_BEGIN) + SubSlotNumber = EQ::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::SHARED_BANK_BEGIN) * EQ::invbag::SLOT_COUNT); else SubSlotNumber = slot_id_in; // not sure if this is the best way to handle this..leaving for now - if (SubSlotNumber != EQEmu::invbag::SLOT_INVALID) { - for (uint32 index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { - EQEmu::ItemInstance* sub = inst->GetItem(index); + if (SubSlotNumber != EQ::invbag::SLOT_INVALID) { + for (uint32 index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; ++index) { + EQ::ItemInstance* sub = inst->GetItem(index); if (!sub) continue; @@ -5821,77 +5936,77 @@ namespace RoF2 RoF2Slot.AugIndex = invaug::SOCKET_INVALID; RoF2Slot.Unknown01 = INULL; - uint32 TempSlot = EQEmu::invslot::SLOT_INVALID; + uint32 TempSlot = EQ::invslot::SLOT_INVALID; - if (server_slot < EQEmu::invtype::POSSESSIONS_SIZE) { + if (server_slot < EQ::invtype::POSSESSIONS_SIZE) { RoF2Slot.Type = invtype::typePossessions; RoF2Slot.Slot = server_slot; } - else if (server_slot <= EQEmu::invbag::CURSOR_BAG_END && server_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - TempSlot = server_slot - EQEmu::invbag::GENERAL_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + TempSlot = server_slot - EQ::invbag::GENERAL_BAGS_BEGIN; RoF2Slot.Type = invtype::typePossessions; - RoF2Slot.Slot = invslot::GENERAL_BEGIN + (TempSlot / EQEmu::invbag::SLOT_COUNT); - RoF2Slot.SubIndex = TempSlot - ((RoF2Slot.Slot - invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); + RoF2Slot.Slot = invslot::GENERAL_BEGIN + (TempSlot / EQ::invbag::SLOT_COUNT); + RoF2Slot.SubIndex = TempSlot - ((RoF2Slot.Slot - invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::TRIBUTE_END && server_slot >= EQEmu::invslot::TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) { RoF2Slot.Type = invtype::typeTribute; - RoF2Slot.Slot = server_slot - EQEmu::invslot::TRIBUTE_BEGIN; + RoF2Slot.Slot = server_slot - EQ::invslot::TRIBUTE_BEGIN; } - else if (server_slot <= EQEmu::invslot::GUILD_TRIBUTE_END && server_slot >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::GUILD_TRIBUTE_END && server_slot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) { RoF2Slot.Type = invtype::typeGuildTribute; - RoF2Slot.Slot = server_slot - EQEmu::invslot::GUILD_TRIBUTE_BEGIN; + RoF2Slot.Slot = server_slot - EQ::invslot::GUILD_TRIBUTE_BEGIN; } - else if (server_slot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + else if (server_slot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { RoF2Slot.Type = invtype::typeWorld; } - else if (server_slot <= EQEmu::invslot::BANK_END && server_slot >= EQEmu::invslot::BANK_BEGIN) { + else if (server_slot <= EQ::invslot::BANK_END && server_slot >= EQ::invslot::BANK_BEGIN) { RoF2Slot.Type = invtype::typeBank; - RoF2Slot.Slot = server_slot - EQEmu::invslot::BANK_BEGIN; + RoF2Slot.Slot = server_slot - EQ::invslot::BANK_BEGIN; } - else if (server_slot <= EQEmu::invbag::BANK_BAGS_END && server_slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { - TempSlot = server_slot - EQEmu::invbag::BANK_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::BANK_BAGS_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) { + TempSlot = server_slot - EQ::invbag::BANK_BAGS_BEGIN; RoF2Slot.Type = invtype::typeBank; - RoF2Slot.Slot = TempSlot / EQEmu::invbag::SLOT_COUNT; - RoF2Slot.SubIndex = TempSlot - (RoF2Slot.Slot * EQEmu::invbag::SLOT_COUNT); + RoF2Slot.Slot = TempSlot / EQ::invbag::SLOT_COUNT; + RoF2Slot.SubIndex = TempSlot - (RoF2Slot.Slot * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::SHARED_BANK_END && server_slot >= EQEmu::invslot::SHARED_BANK_BEGIN) { + else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) { RoF2Slot.Type = invtype::typeSharedBank; - RoF2Slot.Slot = server_slot - EQEmu::invslot::SHARED_BANK_BEGIN; + RoF2Slot.Slot = server_slot - EQ::invslot::SHARED_BANK_BEGIN; } - else if (server_slot <= EQEmu::invbag::SHARED_BANK_BAGS_END && server_slot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) { - TempSlot = server_slot - EQEmu::invbag::SHARED_BANK_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { + TempSlot = server_slot - EQ::invbag::SHARED_BANK_BAGS_BEGIN; RoF2Slot.Type = invtype::typeSharedBank; - RoF2Slot.Slot = TempSlot / EQEmu::invbag::SLOT_COUNT; - RoF2Slot.SubIndex = TempSlot - (RoF2Slot.Slot * EQEmu::invbag::SLOT_COUNT); + RoF2Slot.Slot = TempSlot / EQ::invbag::SLOT_COUNT; + RoF2Slot.SubIndex = TempSlot - (RoF2Slot.Slot * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::TRADE_END && server_slot >= EQEmu::invslot::TRADE_BEGIN) { + else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) { RoF2Slot.Type = invtype::typeTrade; - RoF2Slot.Slot = server_slot - EQEmu::invslot::TRADE_BEGIN; + RoF2Slot.Slot = server_slot - EQ::invslot::TRADE_BEGIN; } - else if (server_slot <= EQEmu::invbag::TRADE_BAGS_END && server_slot >= EQEmu::invbag::TRADE_BAGS_BEGIN) { - TempSlot = server_slot - EQEmu::invbag::TRADE_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) { + TempSlot = server_slot - EQ::invbag::TRADE_BAGS_BEGIN; RoF2Slot.Type = invtype::typeTrade; - RoF2Slot.Slot = TempSlot / EQEmu::invbag::SLOT_COUNT; - RoF2Slot.SubIndex = TempSlot - (RoF2Slot.Slot * EQEmu::invbag::SLOT_COUNT); + RoF2Slot.Slot = TempSlot / EQ::invbag::SLOT_COUNT; + RoF2Slot.SubIndex = TempSlot - (RoF2Slot.Slot * EQ::invbag::SLOT_COUNT); } - else if (server_slot <= EQEmu::invslot::WORLD_END && server_slot >= EQEmu::invslot::WORLD_BEGIN) { + else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) { RoF2Slot.Type = invtype::typeWorld; - RoF2Slot.Slot = server_slot - EQEmu::invslot::WORLD_BEGIN; + RoF2Slot.Slot = server_slot - EQ::invslot::WORLD_BEGIN; } Log(Logs::Detail, Logs::Netcode, "Convert Server Slot %i to RoF2 Slot [%i, %i, %i, %i] (unk2: %i, unk1: %i)", @@ -5923,7 +6038,7 @@ namespace RoF2 { uint32 RoF2Slot = invslot::SLOT_INVALID; - if (server_corpse_slot <= EQEmu::invslot::CORPSE_END && server_corpse_slot >= EQEmu::invslot::CORPSE_BEGIN) { + if (server_corpse_slot <= EQ::invslot::CORPSE_END && server_corpse_slot >= EQ::invslot::CORPSE_BEGIN) { RoF2Slot = server_corpse_slot; } @@ -5940,18 +6055,18 @@ namespace RoF2 RoF2Slot.AugIndex = invaug::SOCKET_INVALID; RoF2Slot.Unknown01 = INULL; - uint32 TempSlot = EQEmu::invslot::SLOT_INVALID; + uint32 TempSlot = EQ::invslot::SLOT_INVALID; - if (server_type == EQEmu::invtype::typePossessions) { - if (server_slot < EQEmu::invtype::POSSESSIONS_SIZE) { + if (server_type == EQ::invtype::typePossessions) { + if (server_slot < EQ::invtype::POSSESSIONS_SIZE) { RoF2Slot.Slot = server_slot; } - else if (server_slot <= EQEmu::invbag::CURSOR_BAG_END && server_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - TempSlot = server_slot - EQEmu::invbag::GENERAL_BAGS_BEGIN; + else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + TempSlot = server_slot - EQ::invbag::GENERAL_BAGS_BEGIN; - RoF2Slot.Slot = invslot::GENERAL_BEGIN + (TempSlot / EQEmu::invbag::SLOT_COUNT); - RoF2Slot.SubIndex = TempSlot - ((RoF2Slot.Slot - invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); + RoF2Slot.Slot = invslot::GENERAL_BEGIN + (TempSlot / EQ::invbag::SLOT_COUNT); + RoF2Slot.SubIndex = TempSlot - ((RoF2Slot.Slot - invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); } } @@ -5965,12 +6080,12 @@ namespace RoF2 { if (rof2_slot.AugIndex < invaug::SOCKET_INVALID || rof2_slot.AugIndex >= invaug::SOCKET_COUNT) { Log(Logs::Detail, Logs::Netcode, "Convert RoF2 Slot [%i, %i, %i, %i] (unk2: %i, unk1: %i) to Server Slot %i", - rof2_slot.Type, rof2_slot.Slot, rof2_slot.SubIndex, rof2_slot.AugIndex, rof2_slot.Unknown02, rof2_slot.Unknown01, EQEmu::invslot::SLOT_INVALID); + rof2_slot.Type, rof2_slot.Slot, rof2_slot.SubIndex, rof2_slot.AugIndex, rof2_slot.Unknown02, rof2_slot.Unknown01, EQ::invslot::SLOT_INVALID); - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; } - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; uint32 temp_slot = invslot::SLOT_INVALID; switch (rof2_slot.Type) { @@ -5982,10 +6097,10 @@ namespace RoF2 else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { if (rof2_slot.Slot < invslot::GENERAL_BEGIN) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; temp_slot = (rof2_slot.Slot - invslot::GENERAL_BEGIN) * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::GENERAL_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; + server_slot = EQ::invbag::GENERAL_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; } } @@ -5994,12 +6109,12 @@ namespace RoF2 case invtype::typeBank: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::BANK_SIZE) { if (rof2_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::BANK_BEGIN + rof2_slot.Slot; + server_slot = EQ::invslot::BANK_BEGIN + rof2_slot.Slot; } else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof2_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::BANK_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; + server_slot = EQ::invbag::BANK_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; } } @@ -6008,12 +6123,12 @@ namespace RoF2 case invtype::typeSharedBank: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::SHARED_BANK_SIZE) { if (rof2_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::SHARED_BANK_BEGIN + rof2_slot.Slot; + server_slot = EQ::invslot::SHARED_BANK_BEGIN + rof2_slot.Slot; } else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof2_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; + server_slot = EQ::invbag::SHARED_BANK_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; } } @@ -6022,12 +6137,12 @@ namespace RoF2 case invtype::typeTrade: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::TRADE_SIZE) { if (rof2_slot.SubIndex == invbag::SLOT_INVALID) { - server_slot = EQEmu::invslot::TRADE_BEGIN + rof2_slot.Slot; + server_slot = EQ::invslot::TRADE_BEGIN + rof2_slot.Slot; } else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { temp_slot = rof2_slot.Slot * invbag::SLOT_COUNT; - server_slot = EQEmu::invbag::TRADE_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; + server_slot = EQ::invbag::TRADE_BAGS_BEGIN + temp_slot + rof2_slot.SubIndex; } } @@ -6035,32 +6150,32 @@ namespace RoF2 } case invtype::typeWorld: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::WORLD_SIZE) { - server_slot = EQEmu::invslot::WORLD_BEGIN + rof2_slot.Slot; + server_slot = EQ::invslot::WORLD_BEGIN + rof2_slot.Slot; } else if (rof2_slot.Slot == invslot::SLOT_INVALID) { - server_slot = EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; + server_slot = EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; } break; } case invtype::typeLimbo: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::LIMBO_SIZE) { - server_slot = EQEmu::invslot::slotCursor; + server_slot = EQ::invslot::slotCursor; } break; } case invtype::typeTribute: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::TRIBUTE_SIZE) { - server_slot = EQEmu::invslot::TRIBUTE_BEGIN + rof2_slot.Slot; + server_slot = EQ::invslot::TRIBUTE_BEGIN + rof2_slot.Slot; } break; } case invtype::typeGuildTribute: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::GUILD_TRIBUTE_SIZE) { - server_slot = EQEmu::invslot::GUILD_TRIBUTE_BEGIN + rof2_slot.Slot; + server_slot = EQ::invslot::GUILD_TRIBUTE_BEGIN + rof2_slot.Slot; } break; @@ -6086,10 +6201,10 @@ namespace RoF2 static inline uint32 RoF2ToServerCorpseSlot(structs::InventorySlot_Struct rof2_corpse_slot) { - uint32 ServerSlot = EQEmu::invslot::SLOT_INVALID; + uint32 ServerSlot = EQ::invslot::SLOT_INVALID; if (rof2_corpse_slot.Type != invtype::typeCorpse || rof2_corpse_slot.SubIndex != invbag::SLOT_INVALID || rof2_corpse_slot.AugIndex != invaug::SOCKET_INVALID) { - ServerSlot = EQEmu::invslot::SLOT_INVALID; + ServerSlot = EQ::invslot::SLOT_INVALID; } else { @@ -6104,7 +6219,7 @@ namespace RoF2 static inline uint32 RoF2ToServerCorpseMainSlot(uint32 rof2_corpse_slot) { - uint32 ServerSlot = EQEmu::invslot::SLOT_INVALID; + uint32 ServerSlot = EQ::invslot::SLOT_INVALID; if (rof2_corpse_slot <= invslot::CORPSE_END && rof2_corpse_slot >= invslot::CORPSE_BEGIN) { ServerSlot = rof2_corpse_slot; @@ -6119,12 +6234,12 @@ namespace RoF2 { if (rof2_slot.AugIndex < invaug::SOCKET_INVALID || rof2_slot.AugIndex >= invaug::SOCKET_COUNT) { Log(Logs::Detail, Logs::Netcode, "Convert RoF2 Typeless Slot [%i, %i, %i] (implied type: %i, unk1: %i) to Server Slot %i", - rof2_slot.Slot, rof2_slot.SubIndex, rof2_slot.AugIndex, rof2_type, rof2_slot.Unknown01, EQEmu::invslot::SLOT_INVALID); + rof2_slot.Slot, rof2_slot.SubIndex, rof2_slot.AugIndex, rof2_type, rof2_slot.Unknown01, EQ::invslot::SLOT_INVALID); - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; } - uint32 ServerSlot = EQEmu::invslot::SLOT_INVALID; + uint32 ServerSlot = EQ::invslot::SLOT_INVALID; uint32 TempSlot = invslot::SLOT_INVALID; switch (rof2_type) { @@ -6136,10 +6251,10 @@ namespace RoF2 else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { if (rof2_slot.Slot < invslot::GENERAL_BEGIN) - return EQEmu::invslot::SLOT_INVALID; + return EQ::invslot::SLOT_INVALID; TempSlot = (rof2_slot.Slot - invslot::GENERAL_BEGIN) * invbag::SLOT_COUNT; - ServerSlot = EQEmu::invbag::GENERAL_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; + ServerSlot = EQ::invbag::GENERAL_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; } } @@ -6148,12 +6263,12 @@ namespace RoF2 case invtype::typeBank: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::BANK_SIZE) { if (rof2_slot.SubIndex == invbag::SLOT_INVALID) { - ServerSlot = EQEmu::invslot::BANK_BEGIN + rof2_slot.Slot; + ServerSlot = EQ::invslot::BANK_BEGIN + rof2_slot.Slot; } else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { TempSlot = rof2_slot.Slot * invbag::SLOT_COUNT; - ServerSlot = EQEmu::invbag::BANK_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; + ServerSlot = EQ::invbag::BANK_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; } } @@ -6162,12 +6277,12 @@ namespace RoF2 case invtype::typeSharedBank: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::SHARED_BANK_SIZE) { if (rof2_slot.SubIndex == invbag::SLOT_INVALID) { - ServerSlot = EQEmu::invslot::SHARED_BANK_BEGIN + rof2_slot.Slot; + ServerSlot = EQ::invslot::SHARED_BANK_BEGIN + rof2_slot.Slot; } else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { TempSlot = rof2_slot.Slot * invbag::SLOT_COUNT; - ServerSlot = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; + ServerSlot = EQ::invbag::SHARED_BANK_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; } } @@ -6176,12 +6291,12 @@ namespace RoF2 case invtype::typeTrade: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::TRADE_SIZE) { if (rof2_slot.SubIndex == invbag::SLOT_INVALID) { - ServerSlot = EQEmu::invslot::TRADE_BEGIN + rof2_slot.Slot; + ServerSlot = EQ::invslot::TRADE_BEGIN + rof2_slot.Slot; } else if (rof2_slot.SubIndex >= invbag::SLOT_BEGIN && rof2_slot.SubIndex <= invbag::SLOT_END) { TempSlot = rof2_slot.Slot * invbag::SLOT_COUNT; - ServerSlot = EQEmu::invbag::TRADE_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; + ServerSlot = EQ::invbag::TRADE_BAGS_BEGIN + TempSlot + rof2_slot.SubIndex; } } @@ -6189,32 +6304,32 @@ namespace RoF2 } case invtype::typeWorld: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::WORLD_SIZE) { - ServerSlot = EQEmu::invslot::WORLD_BEGIN + rof2_slot.Slot; + ServerSlot = EQ::invslot::WORLD_BEGIN + rof2_slot.Slot; } else if (rof2_slot.Slot == invslot::SLOT_INVALID) { - ServerSlot = EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; + ServerSlot = EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; } break; } case invtype::typeLimbo: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::LIMBO_SIZE) { - ServerSlot = EQEmu::invslot::slotCursor; + ServerSlot = EQ::invslot::slotCursor; } break; } case invtype::typeTribute: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::TRIBUTE_SIZE) { - ServerSlot = EQEmu::invslot::TRIBUTE_BEGIN + rof2_slot.Slot; + ServerSlot = EQ::invslot::TRIBUTE_BEGIN + rof2_slot.Slot; } break; } case invtype::typeGuildTribute: { if (rof2_slot.Slot >= invslot::SLOT_BEGIN && rof2_slot.Slot < invtype::GUILD_TRIBUTE_SIZE) { - ServerSlot = EQEmu::invslot::GUILD_TRIBUTE_BEGIN + rof2_slot.Slot; + ServerSlot = EQ::invslot::GUILD_TRIBUTE_BEGIN + rof2_slot.Slot; } break; @@ -6240,7 +6355,7 @@ namespace RoF2 static inline void ServerToRoF2SayLink(std::string &rof2_saylink, const std::string &server_saylink) { - if ((constants::SAY_LINK_BODY_SIZE == EQEmu::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { + if ((constants::SAY_LINK_BODY_SIZE == EQ::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { rof2_saylink = server_saylink; return; } @@ -6249,7 +6364,7 @@ namespace RoF2 for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) { if (segment_iter & 1) { - if (segments[segment_iter].length() <= EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (segments[segment_iter].length() <= EQ::constants::SAY_LINK_BODY_SIZE) { rof2_saylink.append(segments[segment_iter]); // TODO: log size mismatch error continue; @@ -6272,7 +6387,7 @@ namespace RoF2 static inline void RoF2ToServerSayLink(std::string &server_saylink, const std::string &rof2_saylink) { - if ((EQEmu::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (rof2_saylink.find('\x12') == std::string::npos)) { + if ((EQ::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (rof2_saylink.find('\x12') == std::string::npos)) { server_saylink = rof2_saylink; return; } @@ -6302,80 +6417,80 @@ namespace RoF2 } } - static inline spells::CastingSlot ServerToRoF2CastingSlot(EQEmu::spells::CastingSlot slot) + static inline spells::CastingSlot ServerToRoF2CastingSlot(EQ::spells::CastingSlot slot) { switch (slot) { - case EQEmu::spells::CastingSlot::Gem1: + case EQ::spells::CastingSlot::Gem1: return spells::CastingSlot::Gem1; - case EQEmu::spells::CastingSlot::Gem2: + case EQ::spells::CastingSlot::Gem2: return spells::CastingSlot::Gem2; - case EQEmu::spells::CastingSlot::Gem3: + case EQ::spells::CastingSlot::Gem3: return spells::CastingSlot::Gem3; - case EQEmu::spells::CastingSlot::Gem4: + case EQ::spells::CastingSlot::Gem4: return spells::CastingSlot::Gem4; - case EQEmu::spells::CastingSlot::Gem5: + case EQ::spells::CastingSlot::Gem5: return spells::CastingSlot::Gem5; - case EQEmu::spells::CastingSlot::Gem6: + case EQ::spells::CastingSlot::Gem6: return spells::CastingSlot::Gem6; - case EQEmu::spells::CastingSlot::Gem7: + case EQ::spells::CastingSlot::Gem7: return spells::CastingSlot::Gem7; - case EQEmu::spells::CastingSlot::Gem8: + case EQ::spells::CastingSlot::Gem8: return spells::CastingSlot::Gem8; - case EQEmu::spells::CastingSlot::Gem9: + case EQ::spells::CastingSlot::Gem9: return spells::CastingSlot::Gem9; - case EQEmu::spells::CastingSlot::Gem10: + case EQ::spells::CastingSlot::Gem10: return spells::CastingSlot::Gem10; - case EQEmu::spells::CastingSlot::Gem11: + case EQ::spells::CastingSlot::Gem11: return spells::CastingSlot::Gem11; - case EQEmu::spells::CastingSlot::Gem12: + case EQ::spells::CastingSlot::Gem12: return spells::CastingSlot::Gem12; - case EQEmu::spells::CastingSlot::Item: - case EQEmu::spells::CastingSlot::PotionBelt: + case EQ::spells::CastingSlot::Item: + case EQ::spells::CastingSlot::PotionBelt: return spells::CastingSlot::Item; - case EQEmu::spells::CastingSlot::Discipline: + case EQ::spells::CastingSlot::Discipline: return spells::CastingSlot::Discipline; - case EQEmu::spells::CastingSlot::AltAbility: + case EQ::spells::CastingSlot::AltAbility: return spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something return spells::CastingSlot::Discipline; } } - static inline EQEmu::spells::CastingSlot RoF2ToServerCastingSlot(spells::CastingSlot slot) + static inline EQ::spells::CastingSlot RoF2ToServerCastingSlot(spells::CastingSlot slot) { switch (slot) { case spells::CastingSlot::Gem1: - return EQEmu::spells::CastingSlot::Gem1; + return EQ::spells::CastingSlot::Gem1; case spells::CastingSlot::Gem2: - return EQEmu::spells::CastingSlot::Gem2; + return EQ::spells::CastingSlot::Gem2; case spells::CastingSlot::Gem3: - return EQEmu::spells::CastingSlot::Gem3; + return EQ::spells::CastingSlot::Gem3; case spells::CastingSlot::Gem4: - return EQEmu::spells::CastingSlot::Gem4; + return EQ::spells::CastingSlot::Gem4; case spells::CastingSlot::Gem5: - return EQEmu::spells::CastingSlot::Gem5; + return EQ::spells::CastingSlot::Gem5; case spells::CastingSlot::Gem6: - return EQEmu::spells::CastingSlot::Gem6; + return EQ::spells::CastingSlot::Gem6; case spells::CastingSlot::Gem7: - return EQEmu::spells::CastingSlot::Gem7; + return EQ::spells::CastingSlot::Gem7; case spells::CastingSlot::Gem8: - return EQEmu::spells::CastingSlot::Gem8; + return EQ::spells::CastingSlot::Gem8; case spells::CastingSlot::Gem9: - return EQEmu::spells::CastingSlot::Gem9; + return EQ::spells::CastingSlot::Gem9; case spells::CastingSlot::Gem10: - return EQEmu::spells::CastingSlot::Gem10; + return EQ::spells::CastingSlot::Gem10; case spells::CastingSlot::Gem11: - return EQEmu::spells::CastingSlot::Gem11; + return EQ::spells::CastingSlot::Gem11; case spells::CastingSlot::Gem12: - return EQEmu::spells::CastingSlot::Gem12; + return EQ::spells::CastingSlot::Gem12; case spells::CastingSlot::Discipline: - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; case spells::CastingSlot::Item: - return EQEmu::spells::CastingSlot::Item; + return EQ::spells::CastingSlot::Item; case spells::CastingSlot::AltAbility: - return EQEmu::spells::CastingSlot::AltAbility; + return EQ::spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; } } @@ -6384,12 +6499,12 @@ namespace RoF2 static inline int ServerToRoF2BuffSlot(int index) { // we're a disc - if (index >= EQEmu::spells::LONG_BUFFS + EQEmu::spells::SHORT_BUFFS) - return index - EQEmu::spells::LONG_BUFFS - EQEmu::spells::SHORT_BUFFS + + if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS) + return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS + spells::LONG_BUFFS + spells::SHORT_BUFFS; // we're a song - if (index >= EQEmu::spells::LONG_BUFFS) - return index - EQEmu::spells::LONG_BUFFS + spells::LONG_BUFFS; + if (index >= EQ::spells::LONG_BUFFS) + return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } @@ -6398,11 +6513,11 @@ namespace RoF2 { // we're a disc if (index >= spells::LONG_BUFFS + spells::SHORT_BUFFS) - return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQEmu::spells::LONG_BUFFS + - EQEmu::spells::SHORT_BUFFS; + return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQ::spells::LONG_BUFFS + + EQ::spells::SHORT_BUFFS; // we're a song if (index >= spells::LONG_BUFFS) - return index - spells::LONG_BUFFS + EQEmu::spells::LONG_BUFFS; + return index - spells::LONG_BUFFS + EQ::spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } diff --git a/common/patches/rof2.h b/common/patches/rof2.h index 9eef8e596..f5f00db47 100644 --- a/common/patches/rof2.h +++ b/common/patches/rof2.h @@ -43,7 +43,7 @@ namespace RoF2 protected: virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; //magic macro to declare our opcode processors #include "ss_declare.h" diff --git a/common/patches/rof2_limits.h b/common/patches/rof2_limits.h index b3a1a4962..114db68aa 100644 --- a/common/patches/rof2_limits.h +++ b/common/patches/rof2_limits.h @@ -31,7 +31,7 @@ namespace RoF2 const int16 INULL = 0; namespace inventory { - inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::RoF2; } const bool ConcatenateInvTypeLimbo = false; @@ -43,7 +43,7 @@ namespace RoF2 } /*inventory*/ namespace invtype { - inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::RoF2; } namespace enum_ { enum InventoryTypes : int16 { @@ -118,7 +118,7 @@ namespace RoF2 } /*invtype*/ namespace invslot { - inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::RoF2; } namespace enum_ { enum InventorySlots : int16 { @@ -196,7 +196,7 @@ namespace RoF2 } /*invslot*/ namespace invbag { - inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::RoF2; } const int16 SLOT_INVALID = IINVALID; const int16 SLOT_BEGIN = INULL; @@ -208,7 +208,7 @@ namespace RoF2 } /*invbag*/ namespace invaug { - inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::RoF2; } const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_BEGIN = INULL; @@ -220,7 +220,7 @@ namespace RoF2 } /*invaug*/ namespace item { - inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::RoF2; } //enum Unknown : int { // looks like item class..but, RoF has it too - nothing in UF- // Unknown1 = 0, @@ -249,7 +249,7 @@ namespace RoF2 } /*item*/ namespace profile { - inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::RoF2; } const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance @@ -261,11 +261,11 @@ namespace RoF2 } /*profile*/ namespace constants { - inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::RoF2; } - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::RoF; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitRoF; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskRoF; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::RoF; + const uint32 EXPANSION_BIT = EQ::expansions::bitRoF; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskRoF; const size_t CHARACTER_CREATION_LIMIT = 12; @@ -274,21 +274,21 @@ namespace RoF2 } /*constants*/ namespace behavior { - inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::RoF2; } const bool CoinHasWeight = false; } /*behavior*/ namespace skills { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::RoF2; } - const size_t LastUsableSkill = EQEmu::skills::Skill2HPiercing; + const size_t LastUsableSkill = EQ::skills::Skill2HPiercing; } /*skills*/ namespace spells { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::RoF2; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::RoF2; } enum class CastingSlot : uint32 { Gem1 = 0, diff --git a/common/patches/rof2_ops.h b/common/patches/rof2_ops.h index 32798fef5..22b6e6662 100644 --- a/common/patches/rof2_ops.h +++ b/common/patches/rof2_ops.h @@ -58,13 +58,16 @@ E(OP_DeleteCharge) E(OP_DeleteItem) E(OP_DeleteSpawn) E(OP_DisciplineUpdate) +E(OP_DzChooseZone) E(OP_DzCompass) E(OP_DzExpeditionEndsWarning) E(OP_DzExpeditionInfo) -E(OP_DzExpeditionList) -E(OP_DzJoinExpeditionConfirm) -E(OP_DzLeaderStatus) +E(OP_DzExpeditionInvite) +E(OP_DzExpeditionLockoutTimers) E(OP_DzMemberList) +E(OP_DzMemberListName) +E(OP_DzMemberListStatus) +E(OP_DzSetLeaderName) E(OP_Emote) E(OP_ExpansionInfo) E(OP_FormattedMessage) @@ -159,6 +162,12 @@ D(OP_ConsiderCorpse) D(OP_Consume) D(OP_Damage) D(OP_DeleteItem) +D(OP_DzAddPlayer) +D(OP_DzChooseZoneReply) +D(OP_DzExpeditionInviteResponse) +D(OP_DzMakeLeader) +D(OP_DzRemovePlayer) +D(OP_DzSwapPlayer) D(OP_Emote) D(OP_EnvDamage) D(OP_FaceChange) diff --git a/common/patches/rof2_structs.h b/common/patches/rof2_structs.h index 10ce35654..a37e25d61 100644 --- a/common/patches/rof2_structs.h +++ b/common/patches/rof2_structs.h @@ -190,7 +190,7 @@ struct TintProfile Tint_Struct Primary; Tint_Struct Secondary; }; - Tint_Struct Slot[EQEmu::textures::materialCount]; + Tint_Struct Slot[EQ::textures::materialCount]; }; }; @@ -222,7 +222,7 @@ struct Texture_Struct // Texture_Struct Primary; // Texture_Struct Secondary; // }; -// Texture_Struct Slot[EQEmu::textures::TextureCount]; +// Texture_Struct Slot[EQ::textures::TextureCount]; // }; // // TextureProfile(); @@ -628,7 +628,7 @@ struct NewZone_Struct { /*0856*/ uint32 scriptNPCReceivedanItem; /*0860*/ uint32 bCheck; // padded bool /*0864*/ uint32 scriptIDSomething; - /*0868*/ uint32 scriptIDSomething2; + /*0868*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, -1 affects some collisions /*0872*/ uint32 scriptIDSomething3; /*0876*/ uint32 SuspendBuffs; // padded bool /*0880*/ uint32 LavaDamage; // LavaDamage value @@ -1053,7 +1053,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -1113,7 +1113,7 @@ union /*00184*/ Texture_Struct equipment[22]; // Total Slots }; /*00624*/ uint32 equip2_count; // Seen 9 -/*00628*/ Texture_Struct equipment2[EQEmu::textures::materialCount]; // Appears to be Visible slots, but all 0s +/*00628*/ Texture_Struct equipment2[EQ::textures::materialCount]; // Appears to be Visible slots, but all 0s /*00808*/ uint32 tint_count; // Seen 9 /*00812*/ TintProfile item_tint; // RR GG BB 00 /*00848*/ uint32 tint_count2; // Seen 9 @@ -2084,7 +2084,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -4804,8 +4804,8 @@ struct ItemQuaternaryBodyStruct int32 HealAmt; int32 SpellDmg; int32 Clairvoyance; - uint8 unknown18; //Power Source Capacity or evolve filename? - uint32 evolve_string; // Some String, but being evolution related is just a guess + int32 SubType; + uint8 evolve_string; // Some String, but being evolution related is just a guess uint8 unknown19; uint16 unknown20; uint8 unknown21; @@ -4882,52 +4882,169 @@ struct VeteranClaim /*076*/ uint32 action; }; -struct ExpeditionEntryHeader_Struct +struct ExpeditionInvite_Struct { -/*000*/ uint32 unknown000; -/*000*/ uint32 number_of_entries; +/*000*/ uint32 client_id; // unique character id +/*004*/ uint32 unknown004; +/*008*/ char inviter_name[64]; +/*072*/ char expedition_name[128]; +/*200*/ uint8 swapping; // 0: adding 1: swapping +/*201*/ char swap_name[64]; // if swapping, swap name being removed +/*265*/ uint8 padding[3]; +/*268*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*270*/ uint16 dz_instance_id; }; -struct ExpeditionJoinPrompt_Struct +struct ExpeditionInviteResponse_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 unknown000; /*004*/ uint32 unknown004; -/*008*/ char player_name[64]; -/*072*/ char expedition_name[64]; +/*008*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*010*/ uint16 dz_instance_id; +/*012*/ uint8 accepted; // 0: declined 1: accepted +/*013*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*014*/ char swap_name[64]; // swap name sent in invite +/*078*/ uint8 unknown078; // padding garbage? +/*079*/ uint8 unknown079; // padding garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 assigned; // padded bool, 0: clear info, 1: fill window info +/*012*/ uint32 max_players; +/*016*/ char dz_name[128]; +/*144*/ char leader_name[64]; +//*208*/ uint32 dz_type; // only in newer clients, if not 1 (expedition type) window does not auto show when dz info assigned +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[1]; // variable length, null terminated, max 0x40 (64) +/*000*/ uint8 online_status; // 0: unknown 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; // number of players in window +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*012*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[1]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char add_player_name[64]; // swap to (player must confirm) +/*072*/ char rem_player_name[64]; // swap from }; struct ExpeditionExpireWarning { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 unknown004; /*008*/ uint32 minutes_remaining; }; -struct ExpeditionInfo_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ uint32 unknown004; +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) /*008*/ uint32 unknown008; -/*012*/ uint32 max_players; -/*016*/ char expedition_name[128]; -/*142*/ char leader_name[64]; -}; - -struct ExpeditionCompassEntry_Struct -{ -/*000*/ float unknown000; //seen *((uint32*)) = 1584791871 -/*004*/ uint32 enabled; //guess -/*008*/ uint32 unknown008; //seen 1019 /*012*/ float y; /*016*/ float x; /*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 count; -/*008*/ ExpeditionCompassEntry_Struct entries[0]; +/*008*/ DynamicZoneCompassEntry_Struct entries[0]; +}; + +struct DynamicZoneChooseZoneEntry_Struct +{ +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // seen 28 00 00 00 (40), sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ char leader_name[1]; // variable length, null terminated, max 0x40 (64) +}; + +struct DynamicZoneChooseZone_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; +}; + +struct DynamicZoneChooseZoneReply_Struct +{ +/*000*/ uint32 unknown000; // ff ff ff ff +/*004*/ uint32 unknown004; // seen 69 00 00 00 +/*008*/ uint32 unknown008; // ff ff ff ff +/*012*/ uint32 unknown_id1; // from choose zone entry message +/*016*/ uint16 dz_zone_id; // dz_id pair +/*018*/ uint16 dz_instance_id; +/*020*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*024*/ uint32 unknown_id2; // from choose zone entry message +/*028*/ uint32 unknown028; // 00 00 00 00 +/*032*/ uint32 unknown032; // always same as unknown044 +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; +/*044*/ uint32 unknown044; // always same as unknown032 +/*048*/ uint32 unknown048; // seen 01 00 00 00 and 02 00 00 00 +}; + +struct KickPlayers_Struct +{ +/*000*/ char char_name[64]; +/*064*/ uint32 unknown064; // always 0 +/*068*/ uint8 kick_expedition; // true if /kickplayers exp +/*069*/ uint8 kick_task; // true if /kickplayers task +/*070*/ uint8 padding[2]; }; struct MaxCharacters_Struct diff --git a/common/patches/rof_limits.h b/common/patches/rof_limits.h index 460ebfddb..4df54d1c2 100644 --- a/common/patches/rof_limits.h +++ b/common/patches/rof_limits.h @@ -31,7 +31,7 @@ namespace RoF const int16 INULL = 0; namespace inventory { - inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::RoF; } const bool ConcatenateInvTypeLimbo = false; @@ -43,7 +43,7 @@ namespace RoF } /*inventory*/ namespace invtype { - inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::RoF; } namespace enum_ { enum InventoryTypes : int16 { @@ -116,7 +116,7 @@ namespace RoF } /*invtype*/ namespace invslot { - inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::RoF; } namespace enum_ { enum InventorySlots : int16 { @@ -194,7 +194,7 @@ namespace RoF } /*invslot*/ namespace invbag { - inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::RoF; } const int16 SLOT_INVALID = IINVALID; const int16 SLOT_BEGIN = INULL; @@ -206,7 +206,7 @@ namespace RoF } /*invbag*/ namespace invaug { - inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::RoF; } const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_BEGIN = INULL; @@ -218,7 +218,7 @@ namespace RoF } /*invaug*/ namespace item { - inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::RoF; } enum ItemPacketType : int { ItemPacketMerchant = 100, @@ -240,7 +240,7 @@ namespace RoF } /*item*/ namespace profile { - inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::RoF; } const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance @@ -252,11 +252,11 @@ namespace RoF } /*profile*/ namespace constants { - inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::RoF; } - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::RoF; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitRoF; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskRoF; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::RoF; + const uint32 EXPANSION_BIT = EQ::expansions::bitRoF; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskRoF; const size_t CHARACTER_CREATION_LIMIT = 12; @@ -265,21 +265,21 @@ namespace RoF } /*constants*/ namespace behavior { - inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::RoF; } const bool CoinHasWeight = false; } /*behavior*/ namespace skills { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::RoF; } - const size_t LastUsableSkill = EQEmu::skills::SkillTripleAttack; + const size_t LastUsableSkill = EQ::skills::SkillTripleAttack; } /*skills*/ namespace spells { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::RoF; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::RoF; } enum class CastingSlot : uint32 { Gem1 = 0, diff --git a/common/patches/rof_ops.h b/common/patches/rof_ops.h index 11fd83f51..f06834d21 100644 --- a/common/patches/rof_ops.h +++ b/common/patches/rof_ops.h @@ -44,13 +44,16 @@ E(OP_DeleteCharge) E(OP_DeleteItem) E(OP_DeleteSpawn) E(OP_DisciplineUpdate) +E(OP_DzChooseZone) E(OP_DzCompass) E(OP_DzExpeditionEndsWarning) E(OP_DzExpeditionInfo) -E(OP_DzExpeditionList) -E(OP_DzJoinExpeditionConfirm) -E(OP_DzLeaderStatus) +E(OP_DzExpeditionInvite) +E(OP_DzExpeditionLockoutTimers) E(OP_DzMemberList) +E(OP_DzMemberListName) +E(OP_DzMemberListStatus) +E(OP_DzSetLeaderName) E(OP_Emote) E(OP_ExpansionInfo) E(OP_FormattedMessage) @@ -145,6 +148,12 @@ D(OP_ConsiderCorpse) D(OP_Consume) D(OP_Damage) D(OP_DeleteItem) +D(OP_DzAddPlayer) +D(OP_DzChooseZoneReply) +D(OP_DzExpeditionInviteResponse) +D(OP_DzMakeLeader) +D(OP_DzRemovePlayer) +D(OP_DzSwapPlayer) D(OP_Emote) D(OP_EnvDamage) D(OP_FaceChange) diff --git a/common/patches/rof_structs.h b/common/patches/rof_structs.h index 03f1a951a..a8297b2ea 100644 --- a/common/patches/rof_structs.h +++ b/common/patches/rof_structs.h @@ -190,7 +190,7 @@ struct TintProfile Tint_Struct Primary; Tint_Struct Secondary; }; - Tint_Struct Slot[EQEmu::textures::materialCount]; + Tint_Struct Slot[EQ::textures::materialCount]; }; }; @@ -222,7 +222,7 @@ struct Texture_Struct // Texture_Struct Primary; // Texture_Struct Secondary; // }; -// Texture_Struct Slot[EQEmu::textures::TextureCount]; +// Texture_Struct Slot[EQ::textures::TextureCount]; // }; // // TextureProfile(); @@ -575,7 +575,11 @@ struct NewZone_Struct { /*0848*/ int32 unknown848; /*0852*/ uint16 zone_id; /*0854*/ uint16 zone_instance; -/*0856*/ char unknown856[20]; +/*0856*/ uint32 scriptNPCReceivedanItem; +/*0860*/ uint32 bCheck; // padded bool +/*0864*/ uint32 scriptIDSomething; +/*0868*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, -1 affects some collisions +/*0872*/ uint32 scriptIDSomething3; /*0876*/ uint32 SuspendBuffs; /*0880*/ uint32 unknown880; // Seen 50 /*0884*/ uint32 unknown884; // Seen 10 @@ -994,7 +998,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -2058,7 +2062,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -4744,8 +4748,8 @@ struct ItemQuaternaryBodyStruct int32 HealAmt; int32 SpellDmg; int32 Clairvoyance; - uint8 unknown18; //Power Source Capacity or evolve filename? - uint32 evolve_string; // Some String, but being evolution related is just a guess + int32 SubType; + uint8 evolve_string; // Some String, but being evolution related is just a guess uint8 unknown19; uint32 unknown20; // Bard Stuff? //uint32 unknown21; @@ -4811,52 +4815,159 @@ struct VeteranClaim /*076*/ uint32 action; }; -struct ExpeditionEntryHeader_Struct +struct ExpeditionInvite_Struct { -/*000*/ uint32 unknown000; -/*000*/ uint32 number_of_entries; +/*000*/ uint32 client_id; // unique character id +/*004*/ uint32 unknown004; +/*008*/ char inviter_name[64]; +/*072*/ char expedition_name[128]; +/*200*/ uint8 swapping; // 0: adding 1: swapping +/*201*/ char swap_name[64]; // if swapping, swap name being removed +/*265*/ uint8 padding[3]; +/*268*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*270*/ uint16 dz_instance_id; }; -struct ExpeditionJoinPrompt_Struct +struct ExpeditionInviteResponse_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 unknown000; /*004*/ uint32 unknown004; -/*008*/ char player_name[64]; -/*072*/ char expedition_name[64]; +/*008*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*010*/ uint16 dz_instance_id; +/*012*/ uint8 accepted; // 0: declined 1: accepted +/*013*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*014*/ char swap_name[64]; // swap name sent in invite +/*078*/ uint8 unknown078; // padding garbage? +/*079*/ uint8 unknown079; // padding garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 assigned; // padded bool +/*012*/ uint32 max_players; +/*016*/ char dz_name[128]; +/*144*/ char leader_name[64]; +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[1]; // variable length, null terminated, max 0x40 (64) +/*000*/ uint8 online_status; // 0: unknown 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; // number of players in window +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*012*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[1]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char add_player_name[64]; // swap to (player must confirm) +/*072*/ char rem_player_name[64]; // swap from }; struct ExpeditionExpireWarning { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 unknown004; /*008*/ uint32 minutes_remaining; }; -struct ExpeditionInfo_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ uint32 unknown004; +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) /*008*/ uint32 unknown008; -/*012*/ uint32 max_players; -/*016*/ char expedition_name[128]; -/*142*/ char leader_name[64]; -}; - -struct ExpeditionCompassEntry_Struct -{ -/*000*/ float unknown000; //seen *((uint32*)) = 1584791871 -/*004*/ uint32 enabled; //guess -/*008*/ uint32 unknown008; //seen 1019 /*012*/ float y; /*016*/ float x; /*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 count; -/*008*/ ExpeditionCompassEntry_Struct entries[0]; +/*008*/ DynamicZoneCompassEntry_Struct entries[0]; +}; + +struct DynamicZoneChooseZoneEntry_Struct +{ +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ char leader_name[1]; // variable length, null terminated, max 0x40 (64) +}; + +struct DynamicZoneChooseZone_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; +}; + +struct DynamicZoneChooseZoneReply_Struct +{ +/*000*/ uint32 unknown000; // ff ff ff ff +/*004*/ uint32 unknown004; // seen 69 00 00 00 +/*008*/ uint32 unknown008; // ff ff ff ff +/*012*/ uint32 unknown_id1; // from choose zone entry message +/*016*/ uint16 dz_zone_id; // dz_id pair +/*018*/ uint16 dz_instance_id; +/*020*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*024*/ uint32 unknown_id2; // from choose zone entry message +/*028*/ uint32 unknown028; // 00 00 00 00 +/*032*/ uint32 unknown032; // always same as unknown044 +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; +/*044*/ uint32 unknown044; // always same as unknown032 +/*048*/ uint32 unknown048; // seen 01 00 00 00 and 02 00 00 00 }; struct MaxCharacters_Struct diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index 709b07363..404190d09 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -43,7 +43,7 @@ namespace SoD static OpcodeManager *opcodes = nullptr; static Strategy struct_strategy; - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id, uint8 depth); + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id, uint8 depth); // server to client inventory location converters static inline uint32 ServerToSoDSlot(uint32 server_slot); @@ -59,8 +59,8 @@ namespace SoD // client to server say link converter static inline void SoDToServerSayLink(std::string &server_saylink, const std::string &sod_saylink); - static inline spells::CastingSlot ServerToSoDCastingSlot(EQEmu::spells::CastingSlot slot); - static inline EQEmu::spells::CastingSlot SoDToServerCastingSlot(spells::CastingSlot slot); + static inline spells::CastingSlot ServerToSoDCastingSlot(EQ::spells::CastingSlot slot); + static inline EQ::spells::CastingSlot SoDToServerCastingSlot(spells::CastingSlot slot); static inline int ServerToSoDBuffSlot(int index); static inline int SoDToServerBuffSlot(int index); @@ -144,9 +144,9 @@ namespace SoD return(r); } - const EQEmu::versions::ClientVersion Strategy::ClientVersion() const + const EQ::versions::ClientVersion Strategy::ClientVersion() const { - return EQEmu::versions::ClientVersion::SoD; + return EQ::versions::ClientVersion::SoD; } #include "ss_define.h" @@ -381,24 +381,24 @@ namespace SoD //store away the emu struct uchar* __emu_buffer = in->pBuffer; - int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct); - if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) { + int item_count = in->size / sizeof(EQ::InternalSerializedItem_Struct); + if (!item_count || (in->size % sizeof(EQ::InternalSerializedItem_Struct)) != 0) { Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct)); + opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQ::InternalSerializedItem_Struct)); delete in; return; } - EQEmu::InternalSerializedItem_Struct* eq = (EQEmu::InternalSerializedItem_Struct*)in->pBuffer; + EQ::InternalSerializedItem_Struct* eq = (EQ::InternalSerializedItem_Struct*)in->pBuffer; - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)&item_count, sizeof(uint32)); for (int index = 0; index < item_count; ++index, ++eq) { - SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0); + SerializeItem(ob, (const EQ::ItemInstance*)eq->inst, eq->slot_id, 0); if (ob.tellp() == last_pos) LogNetcode("SoD::ENCODE(OP_CharInventory) Serialization failed on item slot [{}] during OP_CharInventory. Item skipped", eq->slot_id); @@ -483,15 +483,48 @@ namespace SoD FINISH_ENCODE(); } + ENCODE(OP_DzChooseZone) + { + SETUP_VAR_ENCODE(DynamicZoneChooseZone_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + + for (uint32 i = 0; i < emu->count; ++i) + { + buf.WriteUInt16(emu->choices[i].dz_zone_id); + buf.WriteUInt16(emu->choices[i].dz_instance_id); + buf.WriteUInt32(emu->choices[i].unknown_id1); + buf.WriteUInt32(emu->choices[i].dz_type); + buf.WriteUInt32(emu->choices[i].unknown_id2); + buf.WriteString(emu->choices[i].description); + buf.WriteString(emu->choices[i].leader_name); + } + + __packet->size = buf.size(); + __packet->pBuffer = new unsigned char[__packet->size]; + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); + + FINISH_ENCODE(); + } + ENCODE(OP_DzCompass) { - SETUP_VAR_ENCODE(ExpeditionCompass_Struct); - ALLOC_VAR_ENCODE(structs::ExpeditionCompass_Struct, sizeof(structs::ExpeditionInfo_Struct) + sizeof(structs::ExpeditionCompassEntry_Struct) * emu->count); + SETUP_VAR_ENCODE(DynamicZoneCompass_Struct); + ALLOC_VAR_ENCODE(structs::DynamicZoneCompass_Struct, + sizeof(structs::DynamicZoneCompass_Struct) + + sizeof(structs::DynamicZoneCompassEntry_Struct) * emu->count + ); + OUT(client_id); OUT(count); for (uint32 i = 0; i < emu->count; ++i) { + OUT(entries[i].dz_zone_id); + OUT(entries[i].dz_instance_id); + OUT(entries[i].dz_type); OUT(entries[i].x); OUT(entries[i].y); OUT(entries[i].z); @@ -512,112 +545,109 @@ namespace SoD ENCODE(OP_DzExpeditionInfo) { - ENCODE_LENGTH_EXACT(ExpeditionInfo_Struct); - SETUP_DIRECT_ENCODE(ExpeditionInfo_Struct, structs::ExpeditionInfo_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneInfo_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneInfo_Struct, structs::DynamicZoneInfo_Struct); + OUT(client_id); + OUT(assigned); OUT(max_players); - eq->unknown004 = 785316192; - eq->unknown008 = 435601; - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->leader_name, emu->leader_name); + strn0cpy(eq->dz_name, emu->dz_name, sizeof(eq->dz_name)); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } - ENCODE(OP_DzExpeditionList) + ENCODE(OP_DzExpeditionInvite) { - SETUP_VAR_ENCODE(ExpeditionLockoutList_Struct); + ENCODE_LENGTH_EXACT(ExpeditionInvite_Struct); + SETUP_DIRECT_ENCODE(ExpeditionInvite_Struct, structs::ExpeditionInvite_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); + OUT(client_id); + strn0cpy(eq->inviter_name, emu->inviter_name, sizeof(eq->inviter_name)); + strn0cpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); + OUT(swapping); + strn0cpy(eq->swap_name, emu->swap_name, sizeof(eq->swap_name)); + OUT(dz_zone_id); + OUT(dz_instance_id); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzExpeditionLockoutTimers) + { + SETUP_VAR_ENCODE(ExpeditionLockoutTimers_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); for (uint32 i = 0; i < emu->count; ++i) { - ss.write(emu->entries[i].expedition, strlen(emu->entries[i].expedition)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].time_left, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->entries[i].expedition_event, strlen(emu->entries[i].expedition_event)); - ss.write((const char*)&null_term, sizeof(char)); + buf.WriteString(emu->timers[i].expedition_name); + buf.WriteUInt32(emu->timers[i].seconds_remaining); + buf.WriteInt32(emu->timers[i].event_type); + buf.WriteString(emu->timers[i].event_name); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } - ENCODE(OP_DzJoinExpeditionConfirm) + ENCODE(OP_DzSetLeaderName) { - ENCODE_LENGTH_EXACT(ExpeditionJoinPrompt_Struct); - SETUP_DIRECT_ENCODE(ExpeditionJoinPrompt_Struct, structs::ExpeditionJoinPrompt_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneLeaderName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneLeaderName_Struct, structs::DynamicZoneLeaderName_Struct); - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->player_name, emu->player_name); - - FINISH_ENCODE(); - } - - ENCODE(OP_DzLeaderStatus) - { - SETUP_VAR_ENCODE(ExpeditionLeaderSet_Struct); - - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->leader_name, strlen(emu->leader_name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//0xffffffff - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//1 - ss.write((const char*)&client_id, sizeof(uint32)); - - __packet->size = ss.str().length(); - __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + OUT(client_id); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } ENCODE(OP_DzMemberList) { - SETUP_VAR_ENCODE(ExpeditionMemberList_Struct); + SETUP_VAR_ENCODE(DynamicZoneMemberList_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (uint32 i = 0; i < emu->count; ++i) + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->member_count); + for (uint32 i = 0; i < emu->member_count; ++i) { - ss.write(emu->entries[i].name, strlen(emu->entries[i].name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].status, sizeof(char)); + buf.WriteString(emu->members[i].name); + buf.WriteUInt8(emu->members[i].online_status); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } + ENCODE(OP_DzMemberListName) + { + ENCODE_LENGTH_EXACT(DynamicZoneMemberListName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneMemberListName_Struct, structs::DynamicZoneMemberListName_Struct); + + OUT(client_id); + OUT(add_name); + strn0cpy(eq->name, emu->name, sizeof(eq->name)); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzMemberListStatus) + { + auto emu = reinterpret_cast((*p)->pBuffer); + if (emu->member_count == 1) + { + ENCODE_FORWARD(OP_DzMemberList); + } + } + + ENCODE(OP_Emote) { EQApplicationPacket *in = *p; @@ -1060,14 +1090,14 @@ namespace SoD //store away the emu struct uchar* __emu_buffer = in->pBuffer; - EQEmu::InternalSerializedItem_Struct* int_struct = (EQEmu::InternalSerializedItem_Struct*)(&__emu_buffer[4]); + EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)__emu_buffer, 4); - SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0); + SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, int_struct->slot_id, 0); if (ob.tellp() == last_pos) { LogNetcode("SoD::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id); delete in; @@ -1353,6 +1383,7 @@ namespace SoD OUT(FastRegenHP); OUT(FastRegenMana); OUT(FastRegenEndurance); + OUT(underworld_teleport_index); /*fill in some unknowns with observed values, hopefully it will help */ eq->unknown800 = -1; @@ -1444,7 +1475,7 @@ namespace SoD eq->level1 = emu->level; // OUT(unknown00022[2]); for (r = 0; r < 5; r++) { - OUT(binds[r].zoneId); + OUT(binds[r].zone_id); OUT(binds[r].x); OUT(binds[r].y); OUT(binds[r].z); @@ -1463,7 +1494,7 @@ namespace SoD OUT(hairstyle); OUT(beard); // OUT(unknown00178[10]); - for (r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) { + for (r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material; eq->equipment.Slot[r].Unknown1 = 0; eq->equipment.Slot[r].EliteMaterial = 0; @@ -1493,7 +1524,7 @@ namespace SoD OUT(face); // OUT(unknown02264[47]); - if (spells::SPELLBOOK_SIZE <= EQEmu::spells::SPELLBOOK_SIZE) { + if (spells::SPELLBOOK_SIZE <= EQ::spells::SPELLBOOK_SIZE) { for (uint32 r = 0; r < spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; @@ -1502,14 +1533,14 @@ namespace SoD } } else { - for (uint32 r = 0; r < EQEmu::spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = 0; r < EQ::spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; else eq->spell_book[r] = 0xFFFFFFFFU; } // invalidate the rest of the spellbook slots - memset(&eq->spell_book[EQEmu::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQEmu::spells::SPELLBOOK_SIZE))); + memset(&eq->spell_book[EQ::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQ::spells::SPELLBOOK_SIZE))); } // OUT(unknown4184[128]); @@ -1553,7 +1584,7 @@ namespace SoD // OUT(unknown06160[4]); // Copy bandoliers where server and client indices converge - for (r = 0; r < EQEmu::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { + for (r = 0; r < EQ::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { OUT_str(bandoliers[r].Name); for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true OUT(bandoliers[r].Items[k].ID); @@ -1562,7 +1593,7 @@ namespace SoD } } // Nullify bandoliers where server and client indices diverge, with a client bias - for (r = EQEmu::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { + for (r = EQ::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { eq->bandoliers[r].Name[0] = '\0'; for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true eq->bandoliers[r].Items[k].ID = 0; @@ -1574,13 +1605,13 @@ namespace SoD // OUT(unknown07444[5120]); // Copy potion belt where server and client indices converge - for (r = 0; r < EQEmu::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { + for (r = 0; r < EQ::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { OUT(potionbelt.Items[r].ID); OUT(potionbelt.Items[r].Icon); OUT_str(potionbelt.Items[r].Name); } // Nullify potion belt where server and client indices diverge, with a client bias - for (r = EQEmu::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { + for (r = EQ::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { eq->potionbelt.Items[r].ID = 0; eq->potionbelt.Items[r].Icon = 0; eq->potionbelt.Items[r].Name[0] = '\0'; @@ -1923,7 +1954,7 @@ namespace SoD eq_cse->HairColor = emu_cse->HairColor; eq_cse->Face = emu_cse->Face; - for (int equip_index = EQEmu::textures::textureBegin; equip_index < EQEmu::textures::materialCount; equip_index++) { + for (int equip_index = EQ::textures::textureBegin; equip_index < EQ::textures::materialCount; equip_index++) { eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; @@ -2484,7 +2515,7 @@ namespace SoD float SpawnSize = emu->size; if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))) { - PacketSize -= (sizeof(structs::Texture_Struct) * EQEmu::textures::materialCount); + PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount); if (emu->size == 0) { @@ -2681,7 +2712,7 @@ namespace SoD if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)) { - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; ++k) + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k) { { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color); @@ -2708,13 +2739,13 @@ namespace SoD { structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer; - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; k++) { + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) { Equipment[k].Material = emu->equipment.Slot[k].Material; Equipment[k].Unknown1 = emu->equipment.Slot[k].Unknown1; Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteModel; } - Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::materialCount); + Buffer += (sizeof(structs::Texture_Struct) * EQ::textures::materialCount); } if (strlen(emu->title)) { @@ -2973,6 +3004,84 @@ namespace SoD FINISH_DIRECT_DECODE(); } + DECODE(OP_DzAddPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzChooseZoneReply) + { + DECODE_LENGTH_EXACT(structs::DynamicZoneChooseZoneReply_Struct); + SETUP_DIRECT_DECODE(DynamicZoneChooseZoneReply_Struct, structs::DynamicZoneChooseZoneReply_Struct); + + IN(unknown000); + IN(unknown004); + IN(unknown008); + IN(unknown_id1); + IN(dz_zone_id); + IN(dz_instance_id); + IN(dz_type); + IN(unknown_id2); + IN(unknown028); + IN(unknown032); + IN(unknown036); + IN(unknown040); + IN(unknown044); + IN(unknown048); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzExpeditionInviteResponse) + { + DECODE_LENGTH_EXACT(structs::ExpeditionInviteResponse_Struct); + SETUP_DIRECT_DECODE(ExpeditionInviteResponse_Struct, structs::ExpeditionInviteResponse_Struct); + + IN(dz_zone_id); + IN(dz_instance_id); + IN(accepted); + IN(swapping); + strn0cpy(emu->swap_name, eq->swap_name, sizeof(emu->swap_name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzMakeLeader) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzRemovePlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzSwapPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommandSwap_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommandSwap_Struct, structs::ExpeditionCommandSwap_Struct); + + strn0cpy(emu->add_player_name, eq->add_player_name, sizeof(emu->add_player_name)); + strn0cpy(emu->rem_player_name, eq->rem_player_name, sizeof(emu->rem_player_name)); + + FINISH_DIRECT_DECODE(); + } + DECODE(OP_Emote) { unsigned char *__eq_buffer = __packet->pBuffer; @@ -3146,7 +3255,7 @@ namespace SoD for (int i = 0; i < spells::SPELL_GEM_COUNT; ++i) emu->spell[i] = eq->spell[i]; - for (int i = spells::SPELL_GEM_COUNT; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (int i = spells::SPELL_GEM_COUNT; i < EQ::spells::SPELL_GEM_COUNT; ++i) emu->spell[i] = 0xFFFFFFFF; FINISH_DIRECT_DECODE(); @@ -3440,9 +3549,9 @@ namespace SoD return NextItemInstSerialNumber; } - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth) + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth) { - const EQEmu::ItemData *item = inst->GetUnscaledItem(); + const EQ::ItemData *item = inst->GetUnscaledItem(); SoD::structs::ItemSerializationHeader hdr; @@ -3631,6 +3740,12 @@ namespace SoD itbs.no_transfer = item->NoTransfer; itbs.expendablearrow = item->ExpendableArrow; + // Done to hack older clients to label expendable fishing poles as such + // July 28th, 2018 patch + if (item->ItemType == EQ::item::ItemTypeFishingPole && item->SubType == 0) { + itbs.expendablearrow = 1; + } + ob.write((const char*)&itbs, sizeof(SoD::structs::ItemTertiaryBodyStruct)); // Effect Structures Broken down to allow variable length strings for effect names @@ -3751,30 +3866,30 @@ namespace SoD ob.write((const char*)&iqbs, sizeof(SoD::structs::ItemQuaternaryBodyStruct)); - EQEmu::OutBuffer::pos_type count_pos = ob.tellp(); + EQ::OutBuffer::pos_type count_pos = ob.tellp(); uint32 subitem_count = 0; ob.write((const char*)&subitem_count, sizeof(uint32)); // moved outside of loop since it is not modified within that scope - int16 SubSlotNumber = EQEmu::invbag::SLOT_INVALID; + int16 SubSlotNumber = EQ::invbag::SLOT_INVALID; - if (slot_id_in <= EQEmu::invslot::slotGeneral8 && slot_id_in >= EQEmu::invslot::GENERAL_BEGIN) - SubSlotNumber = EQEmu::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::GENERAL_END && slot_id_in >= EQEmu::invslot::slotGeneral9) - SubSlotNumber = EQEmu::invbag::SLOT_INVALID; - else if (slot_id_in == EQEmu::invslot::slotCursor) - SubSlotNumber = EQEmu::invbag::CURSOR_BAG_BEGIN; - else if (slot_id_in <= EQEmu::invslot::BANK_END && slot_id_in >= EQEmu::invslot::BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::SHARED_BANK_END && slot_id_in >= EQEmu::invslot::SHARED_BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::SHARED_BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); + if (slot_id_in <= EQ::invslot::slotGeneral8 && slot_id_in >= EQ::invslot::GENERAL_BEGIN) + SubSlotNumber = EQ::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQ::invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::GENERAL_END && slot_id_in >= EQ::invslot::slotGeneral9) + SubSlotNumber = EQ::invbag::SLOT_INVALID; + else if (slot_id_in == EQ::invslot::slotCursor) + SubSlotNumber = EQ::invbag::CURSOR_BAG_BEGIN; + else if (slot_id_in <= EQ::invslot::BANK_END && slot_id_in >= EQ::invslot::BANK_BEGIN) + SubSlotNumber = EQ::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::BANK_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::SHARED_BANK_END && slot_id_in >= EQ::invslot::SHARED_BANK_BEGIN) + SubSlotNumber = EQ::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::SHARED_BANK_BEGIN) * EQ::invbag::SLOT_COUNT); else SubSlotNumber = slot_id_in; // not sure if this is the best way to handle this..leaving for now - if (SubSlotNumber != EQEmu::invbag::SLOT_INVALID) { - for (uint32 index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { - EQEmu::ItemInstance* sub = inst->GetItem(index); + if (SubSlotNumber != EQ::invbag::SLOT_INVALID) { + for (uint32 index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; ++index) { + EQ::ItemInstance* sub = inst->GetItem(index); if (!sub) continue; @@ -3793,59 +3908,59 @@ namespace SoD { uint32 SoDSlot = invslot::SLOT_INVALID; - if (serverSlot <= EQEmu::invslot::slotGeneral8) { + if (serverSlot <= EQ::invslot::slotGeneral8) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::CORPSE_END && serverSlot >= EQEmu::invslot::slotCursor) { + else if (serverSlot <= EQ::invslot::CORPSE_END && serverSlot >= EQ::invslot::slotCursor) { SoDSlot = serverSlot - 2; } - else if (serverSlot <= EQEmu::invbag::GENERAL_BAGS_8_END && serverSlot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::GENERAL_BAGS_8_END && serverSlot >= EQ::invbag::GENERAL_BAGS_BEGIN) { SoDSlot = serverSlot + 11; } - else if (serverSlot <= EQEmu::invbag::CURSOR_BAG_END && serverSlot >= EQEmu::invbag::CURSOR_BAG_BEGIN) { + else if (serverSlot <= EQ::invbag::CURSOR_BAG_END && serverSlot >= EQ::invbag::CURSOR_BAG_BEGIN) { SoDSlot = serverSlot - 9; } - else if (serverSlot <= EQEmu::invslot::TRIBUTE_END && serverSlot >= EQEmu::invslot::TRIBUTE_BEGIN) { + else if (serverSlot <= EQ::invslot::TRIBUTE_END && serverSlot >= EQ::invslot::TRIBUTE_BEGIN) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::GUILD_TRIBUTE_END && serverSlot >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN) { + else if (serverSlot <= EQ::invslot::GUILD_TRIBUTE_END && serverSlot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) { SoDSlot = serverSlot; } - else if (serverSlot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + else if (serverSlot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::BANK_END && serverSlot >= EQEmu::invslot::BANK_BEGIN) { + else if (serverSlot <= EQ::invslot::BANK_END && serverSlot >= EQ::invslot::BANK_BEGIN) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invbag::BANK_BAGS_END && serverSlot >= EQEmu::invbag::BANK_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::BANK_BAGS_END && serverSlot >= EQ::invbag::BANK_BAGS_BEGIN) { SoDSlot = serverSlot + 1; } - else if (serverSlot <= EQEmu::invslot::SHARED_BANK_END && serverSlot >= EQEmu::invslot::SHARED_BANK_BEGIN) { + else if (serverSlot <= EQ::invslot::SHARED_BANK_END && serverSlot >= EQ::invslot::SHARED_BANK_BEGIN) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invbag::SHARED_BANK_BAGS_END && serverSlot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::SHARED_BANK_BAGS_END && serverSlot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { SoDSlot = serverSlot + 1; } - else if (serverSlot <= EQEmu::invslot::TRADE_END && serverSlot >= EQEmu::invslot::TRADE_BEGIN) { + else if (serverSlot <= EQ::invslot::TRADE_END && serverSlot >= EQ::invslot::TRADE_BEGIN) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invbag::TRADE_BAGS_END && serverSlot >= EQEmu::invbag::TRADE_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::TRADE_BAGS_END && serverSlot >= EQ::invbag::TRADE_BAGS_BEGIN) { SoDSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::WORLD_END && serverSlot >= EQEmu::invslot::WORLD_BEGIN) { + else if (serverSlot <= EQ::invslot::WORLD_END && serverSlot >= EQ::invslot::WORLD_BEGIN) { SoDSlot = serverSlot; } @@ -3858,11 +3973,11 @@ namespace SoD { uint32 SoDSlot = invslot::SLOT_INVALID; - if (server_corpse_slot <= EQEmu::invslot::slotGeneral8 && server_corpse_slot >= EQEmu::invslot::slotGeneral1) { + if (server_corpse_slot <= EQ::invslot::slotGeneral8 && server_corpse_slot >= EQ::invslot::slotGeneral1) { SoDSlot = server_corpse_slot; } - else if (server_corpse_slot <= EQEmu::invslot::CORPSE_END && server_corpse_slot >= EQEmu::invslot::slotCursor) { + else if (server_corpse_slot <= EQ::invslot::CORPSE_END && server_corpse_slot >= EQ::invslot::slotCursor) { SoDSlot = server_corpse_slot - 2; } @@ -3873,7 +3988,7 @@ namespace SoD static inline uint32 SoDToServerSlot(uint32 sod_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (sod_slot <= invslot::slotGeneral8) { server_slot = sod_slot; @@ -3938,7 +4053,7 @@ namespace SoD static inline uint32 SoDToServerCorpseSlot(uint32 sod_corpse_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (sod_corpse_slot <= invslot::slotGeneral8 && sod_corpse_slot >= invslot::slotGeneral1) { server_slot = sod_corpse_slot; @@ -3955,7 +4070,7 @@ namespace SoD static inline void ServerToSoDSayLink(std::string &sod_saylink, const std::string &server_saylink) { - if ((constants::SAY_LINK_BODY_SIZE == EQEmu::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { + if ((constants::SAY_LINK_BODY_SIZE == EQ::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { sod_saylink = server_saylink; return; } @@ -3964,7 +4079,7 @@ namespace SoD for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) { if (segment_iter & 1) { - if (segments[segment_iter].length() <= EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (segments[segment_iter].length() <= EQ::constants::SAY_LINK_BODY_SIZE) { sod_saylink.append(segments[segment_iter]); // TODO: log size mismatch error continue; @@ -3995,7 +4110,7 @@ namespace SoD static inline void SoDToServerSayLink(std::string &server_saylink, const std::string &sod_saylink) { - if ((EQEmu::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (sod_saylink.find('\x12') == std::string::npos)) { + if ((EQ::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (sod_saylink.find('\x12') == std::string::npos)) { server_saylink = sod_saylink; return; } @@ -4029,84 +4144,84 @@ namespace SoD } } - static inline spells::CastingSlot ServerToSoDCastingSlot(EQEmu::spells::CastingSlot slot) + static inline spells::CastingSlot ServerToSoDCastingSlot(EQ::spells::CastingSlot slot) { switch (slot) { - case EQEmu::spells::CastingSlot::Gem1: + case EQ::spells::CastingSlot::Gem1: return spells::CastingSlot::Gem1; - case EQEmu::spells::CastingSlot::Gem2: + case EQ::spells::CastingSlot::Gem2: return spells::CastingSlot::Gem2; - case EQEmu::spells::CastingSlot::Gem3: + case EQ::spells::CastingSlot::Gem3: return spells::CastingSlot::Gem3; - case EQEmu::spells::CastingSlot::Gem4: + case EQ::spells::CastingSlot::Gem4: return spells::CastingSlot::Gem4; - case EQEmu::spells::CastingSlot::Gem5: + case EQ::spells::CastingSlot::Gem5: return spells::CastingSlot::Gem5; - case EQEmu::spells::CastingSlot::Gem6: + case EQ::spells::CastingSlot::Gem6: return spells::CastingSlot::Gem6; - case EQEmu::spells::CastingSlot::Gem7: + case EQ::spells::CastingSlot::Gem7: return spells::CastingSlot::Gem7; - case EQEmu::spells::CastingSlot::Gem8: + case EQ::spells::CastingSlot::Gem8: return spells::CastingSlot::Gem8; - case EQEmu::spells::CastingSlot::Gem9: + case EQ::spells::CastingSlot::Gem9: return spells::CastingSlot::Gem9; - case EQEmu::spells::CastingSlot::Gem10: + case EQ::spells::CastingSlot::Gem10: return spells::CastingSlot::Gem10; - case EQEmu::spells::CastingSlot::Item: - case EQEmu::spells::CastingSlot::PotionBelt: + case EQ::spells::CastingSlot::Item: + case EQ::spells::CastingSlot::PotionBelt: return spells::CastingSlot::Item; - case EQEmu::spells::CastingSlot::Discipline: + case EQ::spells::CastingSlot::Discipline: return spells::CastingSlot::Discipline; - case EQEmu::spells::CastingSlot::AltAbility: + case EQ::spells::CastingSlot::AltAbility: return spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something return spells::CastingSlot::Discipline; } } - static inline EQEmu::spells::CastingSlot SoDToServerCastingSlot(spells::CastingSlot slot) + static inline EQ::spells::CastingSlot SoDToServerCastingSlot(spells::CastingSlot slot) { switch (slot) { case spells::CastingSlot::Gem1: - return EQEmu::spells::CastingSlot::Gem1; + return EQ::spells::CastingSlot::Gem1; case spells::CastingSlot::Gem2: - return EQEmu::spells::CastingSlot::Gem2; + return EQ::spells::CastingSlot::Gem2; case spells::CastingSlot::Gem3: - return EQEmu::spells::CastingSlot::Gem3; + return EQ::spells::CastingSlot::Gem3; case spells::CastingSlot::Gem4: - return EQEmu::spells::CastingSlot::Gem4; + return EQ::spells::CastingSlot::Gem4; case spells::CastingSlot::Gem5: - return EQEmu::spells::CastingSlot::Gem5; + return EQ::spells::CastingSlot::Gem5; case spells::CastingSlot::Gem6: - return EQEmu::spells::CastingSlot::Gem6; + return EQ::spells::CastingSlot::Gem6; case spells::CastingSlot::Gem7: - return EQEmu::spells::CastingSlot::Gem7; + return EQ::spells::CastingSlot::Gem7; case spells::CastingSlot::Gem8: - return EQEmu::spells::CastingSlot::Gem8; + return EQ::spells::CastingSlot::Gem8; case spells::CastingSlot::Gem9: - return EQEmu::spells::CastingSlot::Gem9; + return EQ::spells::CastingSlot::Gem9; case spells::CastingSlot::Gem10: - return EQEmu::spells::CastingSlot::Gem10; + return EQ::spells::CastingSlot::Gem10; case spells::CastingSlot::Discipline: - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; case spells::CastingSlot::Item: - return EQEmu::spells::CastingSlot::Item; + return EQ::spells::CastingSlot::Item; case spells::CastingSlot::AltAbility: - return EQEmu::spells::CastingSlot::AltAbility; + return EQ::spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; } } static inline int ServerToSoDBuffSlot(int index) { // we're a disc - if (index >= EQEmu::spells::LONG_BUFFS + EQEmu::spells::SHORT_BUFFS) - return index - EQEmu::spells::LONG_BUFFS - EQEmu::spells::SHORT_BUFFS + + if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS) + return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS + spells::LONG_BUFFS + spells::SHORT_BUFFS; // we're a song - if (index >= EQEmu::spells::LONG_BUFFS) - return index - EQEmu::spells::LONG_BUFFS + spells::LONG_BUFFS; + if (index >= EQ::spells::LONG_BUFFS) + return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } @@ -4115,11 +4230,11 @@ namespace SoD { // we're a disc if (index >= spells::LONG_BUFFS + spells::SHORT_BUFFS) - return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQEmu::spells::LONG_BUFFS + - EQEmu::spells::SHORT_BUFFS; + return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQ::spells::LONG_BUFFS + + EQ::spells::SHORT_BUFFS; // we're a song if (index >= spells::LONG_BUFFS) - return index - spells::LONG_BUFFS + EQEmu::spells::LONG_BUFFS; + return index - spells::LONG_BUFFS + EQ::spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } diff --git a/common/patches/sod.h b/common/patches/sod.h index 977645231..1a0188f6e 100644 --- a/common/patches/sod.h +++ b/common/patches/sod.h @@ -43,7 +43,7 @@ namespace SoD protected: virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; //magic macro to declare our opcode processors #include "ss_declare.h" diff --git a/common/patches/sod_limits.h b/common/patches/sod_limits.h index 7927a255b..46d8293fe 100644 --- a/common/patches/sod_limits.h +++ b/common/patches/sod_limits.h @@ -31,7 +31,7 @@ namespace SoD const int16 INULL = 0; namespace inventory { - inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::SoD; } const bool ConcatenateInvTypeLimbo = true; @@ -43,7 +43,7 @@ namespace SoD } /*inventory*/ namespace invtype { - inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::SoD; } namespace enum_ { enum InventoryTypes : int16 { @@ -106,7 +106,7 @@ namespace SoD } /*invtype*/ namespace invslot { - inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::SoD; } namespace enum_ { enum InventorySlots : int16 { @@ -205,7 +205,7 @@ namespace SoD } /*invslot*/ namespace invbag { - inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::SoD; } const int16 SLOT_INVALID = IINVALID; const int16 SLOT_BEGIN = INULL; @@ -237,7 +237,7 @@ namespace SoD } /*invbag*/ namespace invaug { - inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::SoD; } const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_BEGIN = INULL; @@ -249,7 +249,7 @@ namespace SoD } /*invaug*/ namespace item { - inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::SoD; } enum ItemPacketType : int { ItemPacketMerchant = 100, @@ -267,7 +267,7 @@ namespace SoD } /*item*/ namespace profile { - inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::SoD; } const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance @@ -279,11 +279,11 @@ namespace SoD } /*profile*/ namespace constants { - inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::SoD; } - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::SoD; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitSoD; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskSoD; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::SoD; + const uint32 EXPANSION_BIT = EQ::expansions::bitSoD; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskSoD; const size_t CHARACTER_CREATION_LIMIT = 12; @@ -292,21 +292,21 @@ namespace SoD } /*constants*/ namespace behavior { - inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::SoD; } const bool CoinHasWeight = false; } /*behavior*/ namespace skills { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SoD; } - const size_t LastUsableSkill = EQEmu::skills::SkillTripleAttack; + const size_t LastUsableSkill = EQ::skills::SkillTripleAttack; } /*skills*/ namespace spells { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::SoD; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SoD; } enum class CastingSlot : uint32 { Gem1 = 0, diff --git a/common/patches/sod_ops.h b/common/patches/sod_ops.h index 6909e1f28..5216a77ce 100644 --- a/common/patches/sod_ops.h +++ b/common/patches/sod_ops.h @@ -35,13 +35,16 @@ E(OP_Consider) E(OP_Damage) E(OP_DeleteCharge) E(OP_DeleteItem) +E(OP_DzChooseZone) E(OP_DzCompass) E(OP_DzExpeditionEndsWarning) E(OP_DzExpeditionInfo) -E(OP_DzExpeditionList) -E(OP_DzJoinExpeditionConfirm) -E(OP_DzLeaderStatus) +E(OP_DzExpeditionInvite) +E(OP_DzExpeditionLockoutTimers) E(OP_DzMemberList) +E(OP_DzMemberListName) +E(OP_DzMemberListStatus) +E(OP_DzSetLeaderName) E(OP_Emote) E(OP_ExpansionInfo) E(OP_FormattedMessage) @@ -111,6 +114,12 @@ D(OP_Consider) D(OP_ConsiderCorpse) D(OP_Consume) D(OP_DeleteItem) +D(OP_DzAddPlayer) +D(OP_DzChooseZoneReply) +D(OP_DzExpeditionInviteResponse) +D(OP_DzMakeLeader) +D(OP_DzRemovePlayer) +D(OP_DzSwapPlayer) D(OP_Emote) D(OP_FaceChange) D(OP_FindPersonRequest) diff --git a/common/patches/sod_structs.h b/common/patches/sod_structs.h index 76a534e6a..70866db8f 100644 --- a/common/patches/sod_structs.h +++ b/common/patches/sod_structs.h @@ -149,7 +149,7 @@ struct TintProfile Tint_Struct Primary; Tint_Struct Secondary; }; - Tint_Struct Slot[EQEmu::textures::materialCount]; + Tint_Struct Slot[EQ::textures::materialCount]; }; }; @@ -178,7 +178,7 @@ struct TextureProfile Texture_Struct Primary; Texture_Struct Secondary; }; - Texture_Struct Slot[EQEmu::textures::materialCount]; + Texture_Struct Slot[EQ::textures::materialCount]; }; TextureProfile(); @@ -195,7 +195,7 @@ struct CharacterSelectEntry_Struct /*0000*/ uint8 Beard; // /*0001*/ uint8 HairColor; // /*0000*/ uint8 Face; // -/*0000*/ CharSelectEquip Equip[EQEmu::textures::materialCount]; +/*0000*/ CharSelectEquip Equip[EQ::textures::materialCount]; /*0000*/ uint32 PrimaryIDFile; // /*0000*/ uint32 SecondaryIDFile; // /*0000*/ uint8 Unknown15; // 0xff @@ -444,7 +444,11 @@ struct NewZone_Struct { /*0848*/ int32 unknown848; /*0852*/ uint16 zone_id; /*0854*/ uint16 zone_instance; -/*0856*/ char unknown856[20]; +/*0856*/ uint32 scriptNPCReceivedanItem; +/*0860*/ uint32 bCheck; // padded bool +/*0864*/ uint32 scriptIDSomething; +/*0868*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, -1 affects some collisions +/*0872*/ uint32 scriptIDSomething3; /*0876*/ uint32 SuspendBuffs; /*0880*/ uint32 unknown880; //seen 50 /*0884*/ uint32 unknown884; //seen 10 @@ -799,7 +803,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -1710,7 +1714,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -4165,52 +4169,160 @@ struct VeteranReward /*012*/ VeteranRewardItem items[8]; }; -struct ExpeditionEntryHeader_Struct + +struct ExpeditionInvite_Struct { -/*000*/ uint32 unknown000; -/*000*/ uint32 number_of_entries; +/*000*/ uint32 client_id; // unique character id +/*004*/ uint32 unknown004; +/*008*/ char inviter_name[64]; +/*072*/ char expedition_name[128]; +/*200*/ uint8 swapping; // 0: adding 1: swapping +/*201*/ char swap_name[64]; // if swapping, swap name being removed +/*265*/ uint8 padding[3]; +/*268*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*270*/ uint16 dz_instance_id; }; -struct ExpeditionJoinPrompt_Struct +struct ExpeditionInviteResponse_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 unknown000; /*004*/ uint32 unknown004; -/*008*/ char player_name[64]; -/*072*/ char expedition_name[64]; +/*008*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*010*/ uint16 dz_instance_id; +/*012*/ uint8 accepted; // 0: declined 1: accepted +/*013*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*014*/ char swap_name[64]; // swap name sent in invite +/*078*/ uint8 unknown078; // padding garbage? +/*079*/ uint8 unknown079; // padding garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 assigned; // padded bool +/*012*/ uint32 max_players; +/*016*/ char dz_name[128]; +/*144*/ char leader_name[64]; +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[1]; // variable length, null terminated, max 0x40 (64) +/*000*/ uint8 online_status; // 0: unknown 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; // number of players in window +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*012*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[1]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char add_player_name[64]; // swap to (player must confirm) +/*072*/ char rem_player_name[64]; // swap from }; struct ExpeditionExpireWarning { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 unknown004; /*008*/ uint32 minutes_remaining; }; -struct ExpeditionInfo_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ uint32 unknown004; +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) /*008*/ uint32 unknown008; -/*012*/ uint32 max_players; -/*016*/ char expedition_name[128]; -/*142*/ char leader_name[64]; -}; - -struct ExpeditionCompassEntry_Struct -{ -/*000*/ float unknown000; //seen *((uint32*)) = 1584791871 -/*004*/ uint32 enabled; //guess -/*008*/ uint32 unknown008; //seen 1019 /*012*/ float y; /*016*/ float x; /*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 count; -/*008*/ ExpeditionCompassEntry_Struct entries[0]; +/*008*/ DynamicZoneCompassEntry_Struct entries[0]; +}; + +struct DynamicZoneChooseZoneEntry_Struct +{ +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ char leader_name[1]; // variable length, null terminated, max 0x40 (64) +}; + +struct DynamicZoneChooseZone_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; +}; + +struct DynamicZoneChooseZoneReply_Struct +{ +/*000*/ uint32 unknown000; // ff ff ff ff +/*004*/ uint32 unknown004; // seen 69 00 00 00 +/*008*/ uint32 unknown008; // ff ff ff ff +/*012*/ uint32 unknown_id1; // from choose zone entry message +/*016*/ uint16 dz_zone_id; // dz_id pair +/*018*/ uint16 dz_instance_id; +/*020*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*024*/ uint32 unknown_id2; // from choose zone entry message +/*028*/ uint32 unknown028; // 00 00 00 00 +/*032*/ uint32 unknown032; // always same as unknown044 +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; +/*044*/ uint32 unknown044; // always same as unknown032 +/*048*/ uint32 unknown048; // seen 01 00 00 00 and 02 00 00 00 }; struct AltCurrencySelectItem_Struct { diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index 9f5626100..07758bba6 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -43,7 +43,7 @@ namespace SoF static OpcodeManager *opcodes = nullptr; static Strategy struct_strategy; - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id, uint8 depth); + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id, uint8 depth); // server to client inventory location converters static inline uint32 ServerToSoFSlot(uint32 server_slot); @@ -59,8 +59,8 @@ namespace SoF // client to server say link converter static inline void SoFToServerSayLink(std::string &server_saylink, const std::string &sof_saylink); - static inline spells::CastingSlot ServerToSoFCastingSlot(EQEmu::spells::CastingSlot slot); - static inline EQEmu::spells::CastingSlot SoFToServerCastingSlot(spells::CastingSlot slot, uint32 item_location); + static inline spells::CastingSlot ServerToSoFCastingSlot(EQ::spells::CastingSlot slot); + static inline EQ::spells::CastingSlot SoFToServerCastingSlot(spells::CastingSlot slot, uint32 item_location); static inline int ServerToSoFBuffSlot(int index); static inline int SoFToServerBuffSlot(int index); @@ -142,9 +142,9 @@ namespace SoF return(r); } - const EQEmu::versions::ClientVersion Strategy::ClientVersion() const + const EQ::versions::ClientVersion Strategy::ClientVersion() const { - return EQEmu::versions::ClientVersion::SoF; + return EQ::versions::ClientVersion::SoF; } #include "ss_define.h" @@ -361,24 +361,24 @@ namespace SoF //store away the emu struct uchar* __emu_buffer = in->pBuffer; - int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct); - if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) { + int item_count = in->size / sizeof(EQ::InternalSerializedItem_Struct); + if (!item_count || (in->size % sizeof(EQ::InternalSerializedItem_Struct)) != 0) { Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct)); + opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQ::InternalSerializedItem_Struct)); delete in; return; } - EQEmu::InternalSerializedItem_Struct* eq = (EQEmu::InternalSerializedItem_Struct*)in->pBuffer; + EQ::InternalSerializedItem_Struct* eq = (EQ::InternalSerializedItem_Struct*)in->pBuffer; - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)&item_count, sizeof(uint32)); for (int index = 0; index < item_count; ++index, ++eq) { - SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0); + SerializeItem(ob, (const EQ::ItemInstance*)eq->inst, eq->slot_id, 0); if (ob.tellp() == last_pos) LogNetcode("SoF::ENCODE(OP_CharInventory) Serialization failed on item slot [{}] during OP_CharInventory. Item skipped", eq->slot_id); @@ -471,14 +471,48 @@ namespace SoF FINISH_ENCODE(); } + ENCODE(OP_DzChooseZone) + { + SETUP_VAR_ENCODE(DynamicZoneChooseZone_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + + for (uint32 i = 0; i < emu->count; ++i) + { + buf.WriteUInt16(emu->choices[i].dz_zone_id); + buf.WriteUInt16(emu->choices[i].dz_instance_id); + buf.WriteUInt32(emu->choices[i].unknown_id1); + buf.WriteUInt32(emu->choices[i].dz_type); + buf.WriteUInt32(emu->choices[i].unknown_id2); + buf.WriteString(emu->choices[i].description); + buf.WriteString(emu->choices[i].leader_name); + } + + __packet->size = buf.size(); + __packet->pBuffer = new unsigned char[__packet->size]; + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); + + FINISH_ENCODE(); + } + ENCODE(OP_DzCompass) { - SETUP_VAR_ENCODE(ExpeditionCompass_Struct); - ALLOC_VAR_ENCODE(structs::ExpeditionCompass_Struct, sizeof(structs::ExpeditionInfo_Struct) + sizeof(structs::ExpeditionCompassEntry_Struct) * emu->count); + SETUP_VAR_ENCODE(DynamicZoneCompass_Struct); + ALLOC_VAR_ENCODE(structs::DynamicZoneCompass_Struct, + sizeof(structs::DynamicZoneCompass_Struct) + + sizeof(structs::DynamicZoneCompassEntry_Struct) * emu->count + ); + + OUT(client_id); OUT(count); for (uint32 i = 0; i < emu->count; ++i) { + OUT(entries[i].dz_zone_id); + OUT(entries[i].dz_instance_id); + OUT(entries[i].dz_type); OUT(entries[i].x); OUT(entries[i].y); OUT(entries[i].z); @@ -499,111 +533,108 @@ namespace SoF ENCODE(OP_DzExpeditionInfo) { - ENCODE_LENGTH_EXACT(ExpeditionInfo_Struct); - SETUP_DIRECT_ENCODE(ExpeditionInfo_Struct, structs::ExpeditionInfo_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneInfo_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneInfo_Struct, structs::DynamicZoneInfo_Struct); + OUT(client_id); + OUT(assigned); OUT(max_players); - eq->enabled_max = 1; - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->leader_name, emu->leader_name); + strn0cpy(eq->dz_name, emu->dz_name, sizeof(eq->dz_name)); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } - ENCODE(OP_DzExpeditionList) + ENCODE(OP_DzExpeditionInvite) { - SETUP_VAR_ENCODE(ExpeditionLockoutList_Struct); + ENCODE_LENGTH_EXACT(ExpeditionInvite_Struct); + SETUP_DIRECT_ENCODE(ExpeditionInvite_Struct, structs::ExpeditionInvite_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (int i = 0; i < emu->count; ++i) + OUT(client_id); + strn0cpy(eq->inviter_name, emu->inviter_name, sizeof(eq->inviter_name)); + strn0cpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); + OUT(swapping); + strn0cpy(eq->swap_name, emu->swap_name, sizeof(eq->swap_name)); + OUT(dz_zone_id); + OUT(dz_instance_id); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzExpeditionLockoutTimers) + { + SETUP_VAR_ENCODE(ExpeditionLockoutTimers_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + for (uint32 i = 0; i < emu->count; ++i) { - ss.write(emu->entries[i].expedition, strlen(emu->entries[i].expedition)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].time_left, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->entries[i].expedition_event, strlen(emu->entries[i].expedition_event)); - ss.write((const char*)&null_term, sizeof(char)); + buf.WriteString(emu->timers[i].expedition_name); + buf.WriteUInt32(emu->timers[i].seconds_remaining); + buf.WriteInt32(emu->timers[i].event_type); + buf.WriteString(emu->timers[i].event_name); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } - ENCODE(OP_DzJoinExpeditionConfirm) + ENCODE(OP_DzSetLeaderName) { - ENCODE_LENGTH_EXACT(ExpeditionJoinPrompt_Struct); - SETUP_DIRECT_ENCODE(ExpeditionJoinPrompt_Struct, structs::ExpeditionJoinPrompt_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneLeaderName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneLeaderName_Struct, structs::DynamicZoneLeaderName_Struct); - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->player_name, emu->player_name); - - FINISH_ENCODE(); - } - - ENCODE(OP_DzLeaderStatus) - { - SETUP_VAR_ENCODE(ExpeditionLeaderSet_Struct); - - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - - ss.write((const char*)&client_id, sizeof(uint32)); - //ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->leader_name, strlen(emu->leader_name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//0xffffffff - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//1 - ss.write((const char*)&client_id, sizeof(uint32)); - - __packet->size = ss.str().length(); - __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + OUT(client_id); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } ENCODE(OP_DzMemberList) { - SETUP_VAR_ENCODE(ExpeditionMemberList_Struct); + SETUP_VAR_ENCODE(DynamicZoneMemberList_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (uint32 i = 0; i < emu->count; ++i) + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->member_count); + for (uint32 i = 0; i < emu->member_count; ++i) { - ss.write(emu->entries[i].name, strlen(emu->entries[i].name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].status, sizeof(char)); + buf.WriteString(emu->members[i].name); + buf.WriteUInt8(emu->members[i].online_status); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } + ENCODE(OP_DzMemberListName) + { + ENCODE_LENGTH_EXACT(DynamicZoneMemberListName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneMemberListName_Struct, structs::DynamicZoneMemberListName_Struct); + + OUT(client_id); + OUT(add_name); + strn0cpy(eq->name, emu->name, sizeof(eq->name)); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzMemberListStatus) + { + auto emu = reinterpret_cast((*p)->pBuffer); + if (emu->member_count == 1) + { + ENCODE_FORWARD(OP_DzMemberList); + } + } + ENCODE(OP_Emote) { EQApplicationPacket *in = *p; @@ -855,14 +886,14 @@ namespace SoF //store away the emu struct uchar* __emu_buffer = in->pBuffer; - EQEmu::InternalSerializedItem_Struct* int_struct = (EQEmu::InternalSerializedItem_Struct*)(&__emu_buffer[4]); + EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)__emu_buffer, 4); - SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0); + SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, int_struct->slot_id, 0); if (ob.tellp() == last_pos) { LogNetcode("SoF::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id); delete in; @@ -956,7 +987,7 @@ namespace SoF // Since HT/LoH are translated up, we need to translate down only for memSpellSpellbar case if (emu->scribing == 3) - eq->slot = static_cast(ServerToSoFCastingSlot(static_cast(emu->slot))); + eq->slot = static_cast(ServerToSoFCastingSlot(static_cast(emu->slot))); else OUT(slot); OUT(spell_id); @@ -1030,6 +1061,7 @@ namespace SoF OUT(FastRegenHP); OUT(FastRegenMana); OUT(FastRegenEndurance); + OUT(underworld_teleport_index); /*fill in some unknowns with observed values, hopefully it will help */ eq->unknown796 = -1; @@ -1108,7 +1140,7 @@ namespace SoF eq->level1 = emu->level; // OUT(unknown00022[2]); for (r = 0; r < 5; r++) { - OUT(binds[r].zoneId); + OUT(binds[r].zone_id); OUT(binds[r].x); OUT(binds[r].y); OUT(binds[r].z); @@ -1130,7 +1162,7 @@ namespace SoF OUT(hairstyle); OUT(beard); // OUT(unknown00178[10]); - for (r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) { + for (r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material; eq->equipment.Slot[r].Unknown1 = 0; eq->equipment.Slot[r].EliteMaterial = 0; @@ -1160,7 +1192,7 @@ namespace SoF OUT(face); // OUT(unknown02264[47]); - if (spells::SPELLBOOK_SIZE <= EQEmu::spells::SPELLBOOK_SIZE) { + if (spells::SPELLBOOK_SIZE <= EQ::spells::SPELLBOOK_SIZE) { for (uint32 r = 0; r < spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; @@ -1169,14 +1201,14 @@ namespace SoF } } else { - for (uint32 r = 0; r < EQEmu::spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = 0; r < EQ::spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; else eq->spell_book[r] = 0xFFFFFFFFU; } // invalidate the rest of the spellbook slots - memset(&eq->spell_book[EQEmu::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQEmu::spells::SPELLBOOK_SIZE))); + memset(&eq->spell_book[EQ::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQ::spells::SPELLBOOK_SIZE))); } // OUT(unknown4184[128]); @@ -1223,7 +1255,7 @@ namespace SoF // OUT(unknown06160[4]); // Copy bandoliers where server and client indices converge - for (r = 0; r < EQEmu::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { + for (r = 0; r < EQ::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { OUT_str(bandoliers[r].Name); for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true OUT(bandoliers[r].Items[k].ID); @@ -1232,7 +1264,7 @@ namespace SoF } } // Nullify bandoliers where server and client indices diverge, with a client bias - for (r = EQEmu::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { + for (r = EQ::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { eq->bandoliers[r].Name[0] = '\0'; for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true eq->bandoliers[r].Items[k].ID = 0; @@ -1244,13 +1276,13 @@ namespace SoF // OUT(unknown07444[5120]); // Copy potion belt where server and client indices converge - for (r = 0; r < EQEmu::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { + for (r = 0; r < EQ::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { OUT(potionbelt.Items[r].ID); OUT(potionbelt.Items[r].Icon); OUT_str(potionbelt.Items[r].Name); } // Nullify potion belt where server and client indices diverge, with a client bias - for (r = EQEmu::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { + for (r = EQ::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { eq->potionbelt.Items[r].ID = 0; eq->potionbelt.Items[r].Icon = 0; eq->potionbelt.Items[r].Name[0] = '\0'; @@ -1593,7 +1625,7 @@ namespace SoF eq_cse->HairColor = emu_cse->HairColor; eq_cse->Face = emu_cse->Face; - for (int equip_index = EQEmu::textures::textureBegin; equip_index < EQEmu::textures::materialCount; equip_index++) { + for (int equip_index = EQ::textures::textureBegin; equip_index < EQ::textures::materialCount; equip_index++) { eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; @@ -2015,7 +2047,7 @@ namespace SoF eq->deity = emu->deity; eq->drakkin_heritage = emu->drakkin_heritage; eq->gender = emu->gender; - for (k = EQEmu::textures::textureBegin; k < EQEmu::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].Unknown1 = emu->equipment.Slot[k].Unknown1; eq->equipment.Slot[k].EliteMaterial = emu->equipment.Slot[k].EliteModel; @@ -2081,7 +2113,7 @@ namespace SoF strcpy(eq->name, emu->name); eq->petOwnerId = emu->petOwnerId; eq->pvp = 0; // 0 = non-pvp colored name, 1 = red pvp name - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; k++) { + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) { eq->equipment_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color; } eq->anon = emu->anon; @@ -2300,7 +2332,7 @@ namespace SoF DECODE_LENGTH_EXACT(structs::BugReport_Struct); SETUP_DIRECT_DECODE(BugReport_Struct, structs::BugReport_Struct); - emu->category_id = EQEmu::bug::CategoryNameToCategoryID(eq->category_name); + emu->category_id = EQ::bug::CategoryNameToCategoryID(eq->category_name); memcpy(emu->category_name, eq, sizeof(structs::BugReport_Struct)); FINISH_DIRECT_DECODE(); @@ -2434,6 +2466,83 @@ namespace SoF FINISH_DIRECT_DECODE(); } + DECODE(OP_DzAddPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzChooseZoneReply) + { + DECODE_LENGTH_EXACT(structs::DynamicZoneChooseZoneReply_Struct); + SETUP_DIRECT_DECODE(DynamicZoneChooseZoneReply_Struct, structs::DynamicZoneChooseZoneReply_Struct); + + emu->unknown000 = eq->unknown000; + emu->unknown008 = eq->unknown004; + IN(unknown_id1); + IN(dz_zone_id); + IN(dz_instance_id); + IN(dz_type); + IN(unknown_id2); + emu->unknown028 = eq->unknown024; + emu->unknown032 = eq->unknown028; + emu->unknown036 = eq->unknown032; + emu->unknown040 = eq->unknown036; + emu->unknown044 = eq->unknown040; + emu->unknown048 = eq->unknown044; + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzExpeditionInviteResponse) + { + DECODE_LENGTH_EXACT(structs::ExpeditionInviteResponse_Struct); + SETUP_DIRECT_DECODE(ExpeditionInviteResponse_Struct, structs::ExpeditionInviteResponse_Struct); + + IN(dz_zone_id); + IN(dz_instance_id); + IN(accepted); + IN(swapping); + strn0cpy(emu->swap_name, eq->swap_name, sizeof(emu->swap_name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzMakeLeader) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzRemovePlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzSwapPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommandSwap_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommandSwap_Struct, structs::ExpeditionCommandSwap_Struct); + + strn0cpy(emu->add_player_name, eq->add_player_name, sizeof(emu->add_player_name)); + strn0cpy(emu->rem_player_name, eq->rem_player_name, sizeof(emu->rem_player_name)); + + FINISH_DIRECT_DECODE(); + } + DECODE(OP_Emote) { unsigned char *__eq_buffer = __packet->pBuffer; @@ -2556,7 +2665,7 @@ namespace SoF for (int i = 0; i < spells::SPELL_GEM_COUNT; ++i) IN(spell[i]); - for (int i = spells::SPELL_GEM_COUNT; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (int i = spells::SPELL_GEM_COUNT; i < EQ::spells::SPELL_GEM_COUNT; ++i) emu->spell[i] = 0xFFFFFFFF; IN(unknown); @@ -2838,9 +2947,9 @@ namespace SoF return NextItemInstSerialNumber; } - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth) + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth) { - const EQEmu::ItemData *item = inst->GetUnscaledItem(); + const EQ::ItemData *item = inst->GetUnscaledItem(); SoF::structs::ItemSerializationHeader hdr; @@ -3028,6 +3137,12 @@ namespace SoF itbs.no_transfer = item->NoTransfer; itbs.expendablearrow = item->ExpendableArrow; + // Done to hack older clients to label expendable fishing poles as such + // July 28th, 2018 patch + if (item->ItemType == EQ::item::ItemTypeFishingPole && item->SubType == 0) { + itbs.expendablearrow = 1; + } + ob.write((const char*)&itbs, sizeof(SoF::structs::ItemTertiaryBodyStruct)); // Effect Structures Broken down to allow variable length strings for effect names @@ -3147,30 +3262,30 @@ namespace SoF ob.write((const char*)&iqbs, sizeof(SoF::structs::ItemQuaternaryBodyStruct)); - EQEmu::OutBuffer::pos_type count_pos = ob.tellp(); + EQ::OutBuffer::pos_type count_pos = ob.tellp(); uint32 subitem_count = 0; ob.write((const char*)&subitem_count, sizeof(uint32)); // moved outside of loop since it is not modified within that scope - int16 SubSlotNumber = EQEmu::invbag::SLOT_INVALID; + int16 SubSlotNumber = EQ::invbag::SLOT_INVALID; - if (slot_id_in <= EQEmu::invslot::slotGeneral8 && slot_id_in >= EQEmu::invslot::GENERAL_BEGIN) - SubSlotNumber = EQEmu::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::GENERAL_END && slot_id_in >= EQEmu::invslot::slotGeneral9) - SubSlotNumber = EQEmu::invbag::SLOT_INVALID; - else if (slot_id_in == EQEmu::invslot::slotCursor) - SubSlotNumber = EQEmu::invbag::CURSOR_BAG_BEGIN; - else if (slot_id_in <= EQEmu::invslot::BANK_END && slot_id_in >= EQEmu::invslot::BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::SHARED_BANK_END && slot_id_in >= EQEmu::invslot::SHARED_BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::SHARED_BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); + if (slot_id_in <= EQ::invslot::slotGeneral8 && slot_id_in >= EQ::invslot::GENERAL_BEGIN) + SubSlotNumber = EQ::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQ::invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::GENERAL_END && slot_id_in >= EQ::invslot::slotGeneral9) + SubSlotNumber = EQ::invbag::SLOT_INVALID; + else if (slot_id_in == EQ::invslot::slotCursor) + SubSlotNumber = EQ::invbag::CURSOR_BAG_BEGIN; + else if (slot_id_in <= EQ::invslot::BANK_END && slot_id_in >= EQ::invslot::BANK_BEGIN) + SubSlotNumber = EQ::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::BANK_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::SHARED_BANK_END && slot_id_in >= EQ::invslot::SHARED_BANK_BEGIN) + SubSlotNumber = EQ::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::SHARED_BANK_BEGIN) * EQ::invbag::SLOT_COUNT); else SubSlotNumber = slot_id_in; // not sure if this is the best way to handle this..leaving for now - if (SubSlotNumber != EQEmu::invbag::SLOT_INVALID) { - for (uint32 index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { - EQEmu::ItemInstance* sub = inst->GetItem(index); + if (SubSlotNumber != EQ::invbag::SLOT_INVALID) { + for (uint32 index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; ++index) { + EQ::ItemInstance* sub = inst->GetItem(index); if (!sub) continue; @@ -3189,59 +3304,59 @@ namespace SoF { uint32 sof_slot = invslot::SLOT_INVALID; - if (server_slot <= EQEmu::invslot::slotGeneral8) { + if (server_slot <= EQ::invslot::slotGeneral8) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::CORPSE_END && server_slot >= EQEmu::invslot::slotCursor) { + else if (server_slot <= EQ::invslot::CORPSE_END && server_slot >= EQ::invslot::slotCursor) { sof_slot = server_slot - 2; } - else if (server_slot <= EQEmu::invbag::GENERAL_BAGS_8_END && server_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::GENERAL_BAGS_8_END && server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { sof_slot = server_slot + 11; } - else if (server_slot <= EQEmu::invbag::CURSOR_BAG_END && server_slot >= EQEmu::invbag::CURSOR_BAG_BEGIN) { + else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::CURSOR_BAG_BEGIN) { sof_slot = server_slot - 9; } - else if (server_slot <= EQEmu::invslot::TRIBUTE_END && server_slot >= EQEmu::invslot::TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::GUILD_TRIBUTE_END && server_slot >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::GUILD_TRIBUTE_END && server_slot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) { sof_slot = server_slot; } - else if (server_slot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + else if (server_slot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::BANK_END && server_slot >= EQEmu::invslot::BANK_BEGIN) { + else if (server_slot <= EQ::invslot::BANK_END && server_slot >= EQ::invslot::BANK_BEGIN) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::BANK_BAGS_END && server_slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::BANK_BAGS_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) { sof_slot = server_slot + 1; } - else if (server_slot <= EQEmu::invslot::SHARED_BANK_END && server_slot >= EQEmu::invslot::SHARED_BANK_BEGIN) { + else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::SHARED_BANK_BAGS_END && server_slot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { sof_slot = server_slot + 1; } - else if (server_slot <= EQEmu::invslot::TRADE_END && server_slot >= EQEmu::invslot::TRADE_BEGIN) { + else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::TRADE_BAGS_END && server_slot >= EQEmu::invbag::TRADE_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) { sof_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::WORLD_END && server_slot >= EQEmu::invslot::WORLD_BEGIN) { + else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) { sof_slot = server_slot; } @@ -3254,11 +3369,11 @@ namespace SoF { uint32 SoFSlot = invslot::SLOT_INVALID; - if (server_corpse_slot <= EQEmu::invslot::slotGeneral8 && server_corpse_slot >= EQEmu::invslot::slotGeneral1) { + if (server_corpse_slot <= EQ::invslot::slotGeneral8 && server_corpse_slot >= EQ::invslot::slotGeneral1) { SoFSlot = server_corpse_slot; } - else if (server_corpse_slot <= EQEmu::invslot::CORPSE_END && server_corpse_slot >= EQEmu::invslot::slotCursor) { + else if (server_corpse_slot <= EQ::invslot::CORPSE_END && server_corpse_slot >= EQ::invslot::slotCursor) { SoFSlot = server_corpse_slot - 2; } @@ -3273,7 +3388,7 @@ namespace SoF static inline uint32 SoFToServerSlot(uint32 sof_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (sof_slot <= invslot::slotGeneral8) { server_slot = sof_slot; @@ -3338,7 +3453,7 @@ namespace SoF static inline uint32 SoFToServerCorpseSlot(uint32 sof_corpse_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (sof_corpse_slot <= invslot::slotGeneral8 && sof_corpse_slot >= invslot::slotGeneral1) { server_slot = sof_corpse_slot; @@ -3359,7 +3474,7 @@ namespace SoF static inline void ServerToSoFSayLink(std::string &sof_saylink, const std::string &server_saylink) { - if ((constants::SAY_LINK_BODY_SIZE == EQEmu::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { + if ((constants::SAY_LINK_BODY_SIZE == EQ::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { sof_saylink = server_saylink; return; } @@ -3368,7 +3483,7 @@ namespace SoF for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) { if (segment_iter & 1) { - if (segments[segment_iter].length() <= EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (segments[segment_iter].length() <= EQ::constants::SAY_LINK_BODY_SIZE) { sof_saylink.append(segments[segment_iter]); // TODO: log size mismatch error continue; @@ -3399,7 +3514,7 @@ namespace SoF static inline void SoFToServerSayLink(std::string &server_saylink, const std::string &sof_saylink) { - if ((EQEmu::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (sof_saylink.find('\x12') == std::string::npos)) { + if ((EQ::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (sof_saylink.find('\x12') == std::string::npos)) { server_saylink = sof_saylink; return; } @@ -3433,84 +3548,84 @@ namespace SoF } } - static inline spells::CastingSlot ServerToSoFCastingSlot(EQEmu::spells::CastingSlot slot) { + static inline spells::CastingSlot ServerToSoFCastingSlot(EQ::spells::CastingSlot slot) { switch (slot) { - case EQEmu::spells::CastingSlot::Gem1: + case EQ::spells::CastingSlot::Gem1: return spells::CastingSlot::Gem1; - case EQEmu::spells::CastingSlot::Gem2: + case EQ::spells::CastingSlot::Gem2: return spells::CastingSlot::Gem2; - case EQEmu::spells::CastingSlot::Gem3: + case EQ::spells::CastingSlot::Gem3: return spells::CastingSlot::Gem3; - case EQEmu::spells::CastingSlot::Gem4: + case EQ::spells::CastingSlot::Gem4: return spells::CastingSlot::Gem4; - case EQEmu::spells::CastingSlot::Gem5: + case EQ::spells::CastingSlot::Gem5: return spells::CastingSlot::Gem5; - case EQEmu::spells::CastingSlot::Gem6: + case EQ::spells::CastingSlot::Gem6: return spells::CastingSlot::Gem6; - case EQEmu::spells::CastingSlot::Gem7: + case EQ::spells::CastingSlot::Gem7: return spells::CastingSlot::Gem7; - case EQEmu::spells::CastingSlot::Gem8: + case EQ::spells::CastingSlot::Gem8: return spells::CastingSlot::Gem8; - case EQEmu::spells::CastingSlot::Gem9: + case EQ::spells::CastingSlot::Gem9: return spells::CastingSlot::Gem9; - case EQEmu::spells::CastingSlot::Item: + case EQ::spells::CastingSlot::Item: return spells::CastingSlot::Item; - case EQEmu::spells::CastingSlot::PotionBelt: + case EQ::spells::CastingSlot::PotionBelt: return spells::CastingSlot::PotionBelt; - case EQEmu::spells::CastingSlot::Discipline: + case EQ::spells::CastingSlot::Discipline: return spells::CastingSlot::Discipline; - case EQEmu::spells::CastingSlot::AltAbility: + case EQ::spells::CastingSlot::AltAbility: return spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something return spells::CastingSlot::Discipline; } } - static inline EQEmu::spells::CastingSlot SoFToServerCastingSlot(spells::CastingSlot slot, uint32 item_location) { + static inline EQ::spells::CastingSlot SoFToServerCastingSlot(spells::CastingSlot slot, uint32 item_location) { switch (slot) { case spells::CastingSlot::Gem1: - return EQEmu::spells::CastingSlot::Gem1; + return EQ::spells::CastingSlot::Gem1; case spells::CastingSlot::Gem2: - return EQEmu::spells::CastingSlot::Gem2; + return EQ::spells::CastingSlot::Gem2; case spells::CastingSlot::Gem3: - return EQEmu::spells::CastingSlot::Gem3; + return EQ::spells::CastingSlot::Gem3; case spells::CastingSlot::Gem4: - return EQEmu::spells::CastingSlot::Gem4; + return EQ::spells::CastingSlot::Gem4; case spells::CastingSlot::Gem5: - return EQEmu::spells::CastingSlot::Gem5; + return EQ::spells::CastingSlot::Gem5; case spells::CastingSlot::Gem6: - return EQEmu::spells::CastingSlot::Gem6; + return EQ::spells::CastingSlot::Gem6; case spells::CastingSlot::Gem7: - return EQEmu::spells::CastingSlot::Gem7; + return EQ::spells::CastingSlot::Gem7; case spells::CastingSlot::Gem8: - return EQEmu::spells::CastingSlot::Gem8; + return EQ::spells::CastingSlot::Gem8; case spells::CastingSlot::Gem9: - return EQEmu::spells::CastingSlot::Gem9; + return EQ::spells::CastingSlot::Gem9; case spells::CastingSlot::Ability: - return EQEmu::spells::CastingSlot::Ability; + return EQ::spells::CastingSlot::Ability; // Tit uses 10 for item and discipline casting, but items have a valid location case spells::CastingSlot::Item: if (item_location == INVALID_INDEX) - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; else - return EQEmu::spells::CastingSlot::Item; + return EQ::spells::CastingSlot::Item; case spells::CastingSlot::PotionBelt: - return EQEmu::spells::CastingSlot::PotionBelt; + return EQ::spells::CastingSlot::PotionBelt; case spells::CastingSlot::AltAbility: - return EQEmu::spells::CastingSlot::AltAbility; + return EQ::spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; } } static inline int ServerToSoFBuffSlot(int index) { // we're a disc - if (index >= EQEmu::spells::LONG_BUFFS + EQEmu::spells::SHORT_BUFFS) - return index - EQEmu::spells::LONG_BUFFS - EQEmu::spells::SHORT_BUFFS + + if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS) + return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS + spells::LONG_BUFFS + spells::SHORT_BUFFS; // we're a song - if (index >= EQEmu::spells::LONG_BUFFS) - return index - EQEmu::spells::LONG_BUFFS + spells::LONG_BUFFS; + if (index >= EQ::spells::LONG_BUFFS) + return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } @@ -3519,11 +3634,11 @@ namespace SoF { // we're a disc if (index >= spells::LONG_BUFFS + spells::SHORT_BUFFS) - return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQEmu::spells::LONG_BUFFS + - EQEmu::spells::SHORT_BUFFS; + return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQ::spells::LONG_BUFFS + + EQ::spells::SHORT_BUFFS; // we're a song if (index >= spells::LONG_BUFFS) - return index - spells::LONG_BUFFS + EQEmu::spells::LONG_BUFFS; + return index - spells::LONG_BUFFS + EQ::spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } diff --git a/common/patches/sof.h b/common/patches/sof.h index dde55f9a3..47a6433ac 100644 --- a/common/patches/sof.h +++ b/common/patches/sof.h @@ -43,7 +43,7 @@ namespace SoF protected: virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; //magic macro to declare our opcode processors #include "ss_declare.h" diff --git a/common/patches/sof_limits.h b/common/patches/sof_limits.h index a03676f2d..063644e18 100644 --- a/common/patches/sof_limits.h +++ b/common/patches/sof_limits.h @@ -31,7 +31,7 @@ namespace SoF const int16 INULL = 0; namespace inventory { - inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::SoF; } const bool ConcatenateInvTypeLimbo = true; @@ -43,7 +43,7 @@ namespace SoF } /*inventory*/ namespace invtype { - inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::SoF; } namespace enum_ { enum InventoryTypes : int16 { @@ -106,7 +106,7 @@ namespace SoF } /*invtype*/ namespace invslot { - inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::SoF; } namespace enum_ { enum InventorySlots : int16 { @@ -205,7 +205,7 @@ namespace SoF } /*invslot*/ namespace invbag { - inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::SoF; } const int16 SLOT_INVALID = IINVALID; const int16 SLOT_BEGIN = INULL; @@ -237,7 +237,7 @@ namespace SoF } /*invbag*/ namespace invaug { - inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::SoF; } const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_BEGIN = INULL; @@ -249,7 +249,7 @@ namespace SoF } /*invaug*/ namespace item { - inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::SoF; } enum ItemPacketType : int { ItemPacketMerchant = 100, @@ -267,7 +267,7 @@ namespace SoF } /*item*/ namespace profile { - inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::SoF; } const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance @@ -279,11 +279,11 @@ namespace SoF } /*profile*/ namespace constants { - inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::SoF; } - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::SoF; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitSoF; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskSoF; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::SoF; + const uint32 EXPANSION_BIT = EQ::expansions::bitSoF; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskSoF; const size_t CHARACTER_CREATION_LIMIT = 12; @@ -292,21 +292,21 @@ namespace SoF } /*constants*/ namespace behavior { - inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::SoF; } const bool CoinHasWeight = true; } /*behavior*/ namespace skills { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SoF; } - const size_t LastUsableSkill = EQEmu::skills::SkillTripleAttack; + const size_t LastUsableSkill = EQ::skills::SkillTripleAttack; } /*skills*/ namespace spells { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::SoF; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SoF; } enum class CastingSlot : uint32 { Gem1 = 0, diff --git a/common/patches/sof_ops.h b/common/patches/sof_ops.h index 0ff2cfd2f..653bb5979 100644 --- a/common/patches/sof_ops.h +++ b/common/patches/sof_ops.h @@ -36,13 +36,16 @@ E(OP_Damage) E(OP_DeleteCharge) E(OP_DeleteItem) E(OP_DeleteSpawn) +E(OP_DzChooseZone) E(OP_DzCompass) E(OP_DzExpeditionEndsWarning) E(OP_DzExpeditionInfo) -E(OP_DzExpeditionList) -E(OP_DzJoinExpeditionConfirm) -E(OP_DzLeaderStatus) +E(OP_DzExpeditionInvite) +E(OP_DzExpeditionLockoutTimers) E(OP_DzMemberList) +E(OP_DzMemberListName) +E(OP_DzMemberListStatus) +E(OP_DzSetLeaderName) E(OP_Emote) E(OP_ExpansionInfo) E(OP_FormattedMessage) @@ -103,6 +106,12 @@ D(OP_Consider) D(OP_ConsiderCorpse) D(OP_Consume) D(OP_DeleteItem) +D(OP_DzAddPlayer) +D(OP_DzChooseZoneReply) +D(OP_DzExpeditionInviteResponse) +D(OP_DzMakeLeader) +D(OP_DzRemovePlayer) +D(OP_DzSwapPlayer) D(OP_Emote) D(OP_FaceChange) D(OP_FindPersonRequest) diff --git a/common/patches/sof_structs.h b/common/patches/sof_structs.h index 1507630bd..97b200a91 100644 --- a/common/patches/sof_structs.h +++ b/common/patches/sof_structs.h @@ -168,7 +168,7 @@ struct TintProfile Tint_Struct Primary; Tint_Struct Secondary; }; - Tint_Struct Slot[EQEmu::textures::materialCount]; + Tint_Struct Slot[EQ::textures::materialCount]; }; }; @@ -197,7 +197,7 @@ struct TextureProfile Texture_Struct Primary; Texture_Struct Secondary; }; - Texture_Struct Slot[EQEmu::textures::materialCount]; + Texture_Struct Slot[EQ::textures::materialCount]; }; TextureProfile(); @@ -214,7 +214,7 @@ struct CharacterSelectEntry_Struct /*0000*/ uint8 Beard; // /*0001*/ uint8 HairColor; // /*0000*/ uint8 Face; // -/*0000*/ CharSelectEquip Equip[EQEmu::textures::materialCount]; +/*0000*/ CharSelectEquip Equip[EQ::textures::materialCount]; /*0000*/ uint32 PrimaryIDFile; // /*0000*/ uint32 SecondaryIDFile; // /*0000*/ uint8 Unknown15; // 0xff @@ -448,7 +448,11 @@ struct NewZone_Struct { /*0844*/ int32 unknown844; /*0848*/ uint16 zone_id; /*0850*/ uint16 zone_instance; -/*0852*/ char unknown852[20]; +/*0852*/ uint32 scriptNPCReceivedanItem; +/*0856*/ uint32 bCheck; // padded bool +/*0860*/ uint32 scriptIDSomething; +/*0864*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, -1 affects some collisions +/*0868*/ uint32 scriptIDSomething3; /*0872*/ uint32 SuspendBuffs; /*0876*/ uint32 unknown876; //seen 50 /*0880*/ uint32 unknown880; //seen 10 @@ -800,7 +804,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -1738,7 +1742,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -4084,43 +4088,150 @@ struct VeteranReward /*012*/ VeteranRewardItem items[8]; }; -struct ExpeditionExpireWarning +struct ExpeditionInvite_Struct +{ +/*000*/ uint32 client_id; +/*004*/ char inviter_name[64]; +/*068*/ char expedition_name[128]; +/*196*/ uint8 swapping; // 0: adding 1: swapping +/*197*/ char swap_name[64]; // if swapping, swap name being removed +/*261*/ uint8 padding[3]; +/*264*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*268*/ uint16 dz_instance_id; +}; + +struct ExpeditionInviteResponse_Struct { /*000*/ uint32 unknown000; +/*004*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*006*/ uint16 dz_instance_id; +/*008*/ uint8 accepted; // 0: declined 1: accepted +/*009*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*010*/ char swap_name[64]; // swap name sent in invite +/*074*/ uint8 unknown078; // padding/garbage? +/*075*/ uint8 unknown079; // padding/garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 assigned; // padded bool +/*008*/ uint32 max_players; +/*012*/ char dz_name[128]; +/*140*/ char leader_name[64]; +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[1]; // variable length, null terminated, max 0x40 (64) +/*000*/ uint8 online_status; // 0: unknown 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*008*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[1]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ char add_player_name[64]; // swap to (player must confirm) +/*068*/ char rem_player_name[64]; // swap from +}; + +struct ExpeditionExpireWarning +{ +/*000*/ uint32 client_id; /*004*/ uint32 minutes_remaining; }; -struct ExpeditionInfo_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ uint32 enabled_max; -/*008*/ uint32 max_players; -/*012*/ char expedition_name[128]; -/*142*/ char leader_name[64]; -}; - -struct ExpeditionCompassEntry_Struct -{ -/*000*/ float unknown000; //seen *((uint32*)) = 1584791871 -/*004*/ uint32 enabled; //guess -/*008*/ uint32 unknown008; //seen 1019 +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) +/*008*/ uint32 unknown008; /*012*/ float y; /*016*/ float x; /*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 count; -/*008*/ ExpeditionCompassEntry_Struct entries[0]; +/*008*/ DynamicZoneCompassEntry_Struct entries[0]; }; -struct ExpeditionJoinPrompt_Struct +struct DynamicZoneChooseZoneEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ char player_name[64]; -/*068*/ char expedition_name[64]; +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ char leader_name[1]; // variable length, null terminated, max 0x40 (64) +}; + +struct DynamicZoneChooseZone_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; +}; + +struct DynamicZoneChooseZoneReply_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ uint32 unknown_id1; +/*012*/ uint16 dz_zone_id; +/*014*/ uint16 dz_instance_id; +/*016*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*020*/ uint32 unknown_id2; +/*024*/ uint32 unknown024; +/*028*/ uint32 unknown028; // always same as unknown040 +/*032*/ uint32 unknown032; +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; // always same as unknown028 +/*044*/ uint32 unknown044; }; struct AltCurrencySelectItem_Struct { diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index b612b9173..bb35d9f87 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -42,7 +42,7 @@ namespace Titanium static OpcodeManager *opcodes = nullptr; static Strategy struct_strategy; - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth); + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth); // server to client inventory location converters static inline int16 ServerToTitaniumSlot(uint32 server_slot); @@ -58,8 +58,8 @@ namespace Titanium // client to server say link converter static inline void TitaniumToServerSayLink(std::string &server_saylink, const std::string &titanium_saylink); - static inline spells::CastingSlot ServerToTitaniumCastingSlot(EQEmu::spells::CastingSlot slot); - static inline EQEmu::spells::CastingSlot TitaniumToServerCastingSlot(spells::CastingSlot slot, uint32 item_location); + static inline spells::CastingSlot ServerToTitaniumCastingSlot(EQ::spells::CastingSlot slot); + static inline EQ::spells::CastingSlot TitaniumToServerCastingSlot(spells::CastingSlot slot, uint32 item_location); static inline int ServerToTitaniumBuffSlot(int index); static inline int TitaniumToServerBuffSlot(int index); @@ -143,9 +143,9 @@ namespace Titanium return(r); } - const EQEmu::versions::ClientVersion Strategy::ClientVersion() const + const EQ::versions::ClientVersion Strategy::ClientVersion() const { - return EQEmu::versions::ClientVersion::Titanium; + return EQ::versions::ClientVersion::Titanium; } #include "ss_define.h" @@ -320,22 +320,22 @@ namespace Titanium //store away the emu struct uchar* __emu_buffer = in->pBuffer; - int itemcount = in->size / sizeof(EQEmu::InternalSerializedItem_Struct); - if (itemcount == 0 || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) { + int itemcount = in->size / sizeof(EQ::InternalSerializedItem_Struct); + if (itemcount == 0 || (in->size % sizeof(EQ::InternalSerializedItem_Struct)) != 0) { Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct)); + opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQ::InternalSerializedItem_Struct)); delete in; return; } - EQEmu::InternalSerializedItem_Struct* eq = (EQEmu::InternalSerializedItem_Struct*)in->pBuffer; + EQ::InternalSerializedItem_Struct* eq = (EQ::InternalSerializedItem_Struct*)in->pBuffer; //do the transform... - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); for (int r = 0; r < itemcount; r++, eq++) { - SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, ServerToTitaniumSlot(eq->slot_id), 0); + SerializeItem(ob, (const EQ::ItemInstance*)eq->inst, ServerToTitaniumSlot(eq->slot_id), 0); if (ob.tellp() == last_pos) LogNetcode("Titanium::ENCODE(OP_CharInventory) Serialization failed on item slot [{}] during OP_CharInventory. Item skipped", eq->slot_id); @@ -414,15 +414,48 @@ namespace Titanium FINISH_ENCODE(); } + ENCODE(OP_DzChooseZone) + { + SETUP_VAR_ENCODE(DynamicZoneChooseZone_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + + for (uint32 i = 0; i < emu->count; ++i) + { + buf.WriteUInt16(emu->choices[i].dz_zone_id); + buf.WriteUInt16(emu->choices[i].dz_instance_id); + buf.WriteUInt32(emu->choices[i].unknown_id1); + buf.WriteUInt32(emu->choices[i].dz_type); + buf.WriteUInt32(emu->choices[i].unknown_id2); + buf.WriteString(emu->choices[i].description); + buf.WriteString(emu->choices[i].leader_name); + } + + __packet->size = buf.size(); + __packet->pBuffer = new unsigned char[__packet->size]; + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); + + FINISH_ENCODE(); + } + ENCODE(OP_DzCompass) { - SETUP_VAR_ENCODE(ExpeditionCompass_Struct); - ALLOC_VAR_ENCODE(structs::ExpeditionCompass_Struct, sizeof(structs::ExpeditionInfo_Struct) + sizeof(structs::ExpeditionCompassEntry_Struct) * emu->count); + SETUP_VAR_ENCODE(DynamicZoneCompass_Struct); + ALLOC_VAR_ENCODE(structs::DynamicZoneCompass_Struct, + sizeof(structs::DynamicZoneCompass_Struct) + + sizeof(structs::DynamicZoneCompassEntry_Struct) * emu->count + ); + OUT(client_id); OUT(count); for (uint32 i = 0; i < emu->count; ++i) { + OUT(entries[i].dz_zone_id); + OUT(entries[i].dz_instance_id); + OUT(entries[i].dz_type); OUT(entries[i].x); OUT(entries[i].y); OUT(entries[i].z); @@ -443,111 +476,108 @@ namespace Titanium ENCODE(OP_DzExpeditionInfo) { - ENCODE_LENGTH_EXACT(ExpeditionInfo_Struct); - SETUP_DIRECT_ENCODE(ExpeditionInfo_Struct, structs::ExpeditionInfo_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneInfo_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneInfo_Struct, structs::DynamicZoneInfo_Struct); + OUT(client_id); + OUT(assigned); OUT(max_players); - eq->enabled_max = 1; - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->leader_name, emu->leader_name); + strn0cpy(eq->dz_name, emu->dz_name, sizeof(eq->dz_name)); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } - ENCODE(OP_DzExpeditionList) + ENCODE(OP_DzExpeditionInvite) { - SETUP_VAR_ENCODE(ExpeditionLockoutList_Struct); + ENCODE_LENGTH_EXACT(ExpeditionInvite_Struct); + SETUP_DIRECT_ENCODE(ExpeditionInvite_Struct, structs::ExpeditionInvite_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); + OUT(client_id); + strn0cpy(eq->inviter_name, emu->inviter_name, sizeof(eq->inviter_name)); + strn0cpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); + OUT(swapping); + strn0cpy(eq->swap_name, emu->swap_name, sizeof(eq->swap_name)); + OUT(dz_zone_id); + OUT(dz_instance_id); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzExpeditionLockoutTimers) + { + SETUP_VAR_ENCODE(ExpeditionLockoutTimers_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); for (uint32 i = 0; i < emu->count; ++i) { - ss.write(emu->entries[i].expedition, strlen(emu->entries[i].expedition)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].time_left, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->entries[i].expedition_event, strlen(emu->entries[i].expedition_event)); - ss.write((const char*)&null_term, sizeof(char)); + buf.WriteString(emu->timers[i].expedition_name); + buf.WriteUInt32(emu->timers[i].seconds_remaining); + buf.WriteInt32(emu->timers[i].event_type); + buf.WriteString(emu->timers[i].event_name); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } - ENCODE(OP_DzJoinExpeditionConfirm) + ENCODE(OP_DzSetLeaderName) { - ENCODE_LENGTH_EXACT(ExpeditionJoinPrompt_Struct); - SETUP_DIRECT_ENCODE(ExpeditionJoinPrompt_Struct, structs::ExpeditionJoinPrompt_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneLeaderName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneLeaderName_Struct, structs::DynamicZoneLeaderName_Struct); - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->player_name, emu->player_name); - - FINISH_ENCODE(); - } - - ENCODE(OP_DzLeaderStatus) - { - SETUP_VAR_ENCODE(ExpeditionLeaderSet_Struct); - - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - - ss.write((const char*)&client_id, sizeof(uint32)); - //ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->leader_name, strlen(emu->leader_name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//0xffffffff - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//1 - ss.write((const char*)&client_id, sizeof(uint32)); - - __packet->size = ss.str().length(); - __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + OUT(client_id); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } ENCODE(OP_DzMemberList) { - SETUP_VAR_ENCODE(ExpeditionMemberList_Struct); + SETUP_VAR_ENCODE(DynamicZoneMemberList_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (uint32 i = 0; i < emu->count; ++i) + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->member_count); + for (uint32 i = 0; i < emu->member_count; ++i) { - ss.write(emu->entries[i].name, strlen(emu->entries[i].name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].status, sizeof(char)); + buf.WriteString(emu->members[i].name); + buf.WriteUInt8(emu->members[i].online_status); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } + ENCODE(OP_DzMemberListName) + { + ENCODE_LENGTH_EXACT(DynamicZoneMemberListName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneMemberListName_Struct, structs::DynamicZoneMemberListName_Struct); + + OUT(client_id); + OUT(add_name); + strn0cpy(eq->name, emu->name, sizeof(eq->name)); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzMemberListStatus) + { + auto emu = reinterpret_cast((*p)->pBuffer); + if (emu->member_count == 1) + { + ENCODE_FORWARD(OP_DzMemberList); + } + } + ENCODE(OP_Emote) { EQApplicationPacket *in = *p; @@ -796,14 +826,14 @@ namespace Titanium OUT(TargetID); OUT(playerid); - for (int i = EQEmu::invslot::slotCharm; i <= EQEmu::invslot::slotWaist; ++i) { + for (int i = EQ::invslot::slotCharm; i <= EQ::invslot::slotWaist; ++i) { strn0cpy(eq->itemnames[i], emu->itemnames[i], sizeof(eq->itemnames[i])); OUT(itemicons[i]); } // move ammo down to last element in titanium array - strn0cpy(eq->itemnames[invslot::slotAmmo], emu->itemnames[EQEmu::invslot::slotAmmo], sizeof(eq->itemnames[invslot::slotAmmo])); - eq->itemicons[invslot::slotAmmo] = emu->itemicons[EQEmu::invslot::slotAmmo]; + strn0cpy(eq->itemnames[invslot::slotAmmo], emu->itemnames[EQ::invslot::slotAmmo], sizeof(eq->itemnames[invslot::slotAmmo])); + eq->itemicons[invslot::slotAmmo] = emu->itemicons[EQ::invslot::slotAmmo]; strn0cpy(eq->text, emu->text, sizeof(eq->text)); @@ -832,14 +862,14 @@ namespace Titanium //store away the emu struct uchar* __emu_buffer = in->pBuffer; - EQEmu::InternalSerializedItem_Struct* int_struct = (EQEmu::InternalSerializedItem_Struct*)(&__emu_buffer[4]); + EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)__emu_buffer, 4); - SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, ServerToTitaniumSlot(int_struct->slot_id), 0); + SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, ServerToTitaniumSlot(int_struct->slot_id), 0); if (ob.tellp() == last_pos) { LogNetcode("Titanium::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id); delete in; @@ -909,7 +939,7 @@ namespace Titanium // Since HT/LoH are translated up, we need to translate down only for memSpellSpellbar case if (emu->scribing == 3) - eq->slot = static_cast(ServerToTitaniumCastingSlot(static_cast(emu->slot))); + eq->slot = static_cast(ServerToTitaniumCastingSlot(static_cast(emu->slot))); else OUT(slot); OUT(spell_id); @@ -992,7 +1022,7 @@ namespace Titanium eq->level1 = emu->level; // OUT(unknown00022[2]); for (r = 0; r < 5; r++) { - OUT(binds[r].zoneId); + OUT(binds[r].zone_id); OUT(binds[r].x); OUT(binds[r].y); OUT(binds[r].z); @@ -1009,7 +1039,7 @@ namespace Titanium OUT(hairstyle); OUT(beard); // OUT(unknown00178[10]); - for (r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) { + for (r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { OUT(item_material.Slot[r].Material); OUT(item_tint.Slot[r].Color); } @@ -1032,7 +1062,7 @@ namespace Titanium OUT(face); // OUT(unknown02264[47]); - if (spells::SPELLBOOK_SIZE <= EQEmu::spells::SPELLBOOK_SIZE) { + if (spells::SPELLBOOK_SIZE <= EQ::spells::SPELLBOOK_SIZE) { for (uint32 r = 0; r < spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; @@ -1041,14 +1071,14 @@ namespace Titanium } } else { - for (uint32 r = 0; r < EQEmu::spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = 0; r < EQ::spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; else eq->spell_book[r] = 0xFFFFFFFFU; } // invalidate the rest of the spellbook slots - memset(&eq->spell_book[EQEmu::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQEmu::spells::SPELLBOOK_SIZE))); + memset(&eq->spell_book[EQ::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQ::spells::SPELLBOOK_SIZE))); } // OUT(unknown4184[448]); @@ -1092,7 +1122,7 @@ namespace Titanium // OUT(unknown06160[4]); // Copy bandoliers where server and client indices converge - for (r = 0; r < EQEmu::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { + for (r = 0; r < EQ::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { OUT_str(bandoliers[r].Name); for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true OUT(bandoliers[r].Items[k].ID); @@ -1101,7 +1131,7 @@ namespace Titanium } } // Nullify bandoliers where server and client indices diverge, with a client bias - for (r = EQEmu::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { + for (r = EQ::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { eq->bandoliers[r].Name[0] = '\0'; for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true eq->bandoliers[r].Items[k].ID = 0; @@ -1113,13 +1143,13 @@ namespace Titanium // OUT(unknown07444[5120]); // Copy potion belt where server and client indices converge - for (r = 0; r < EQEmu::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { + for (r = 0; r < EQ::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { OUT(potionbelt.Items[r].ID); OUT(potionbelt.Items[r].Icon); OUT_str(potionbelt.Items[r].Name); } // Nullify potion belt where server and client indices diverge, with a client bias - for (r = EQEmu::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { + for (r = EQ::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { eq->potionbelt.Items[r].ID = 0; eq->potionbelt.Items[r].Icon = 0; eq->potionbelt.Items[r].Name[0] = '\0'; @@ -1349,14 +1379,14 @@ namespace Titanium if (eq->Race[char_index] > 473) eq->Race[char_index] = 1; - for (int index = 0; index < EQEmu::textures::materialCount; ++index) { + for (int index = 0; index < EQ::textures::materialCount; ++index) { eq->CS_Colors[char_index].Slot[index].Color = emu_cse->Equip[index].Color; } eq->BeardColor[char_index] = emu_cse->BeardColor; eq->HairStyle[char_index] = emu_cse->HairStyle; - for (int index = 0; index < EQEmu::textures::materialCount; ++index) { + for (int index = 0; index < EQ::textures::materialCount; ++index) { eq->Equip[char_index].Slot[index].Material = emu_cse->Equip[index].Material; } @@ -1386,14 +1416,14 @@ namespace Titanium for (; char_index < 10; ++char_index) { eq->Race[char_index] = 0; - for (int index = 0; index < EQEmu::textures::materialCount; ++index) { + for (int index = 0; index < EQ::textures::materialCount; ++index) { eq->CS_Colors[char_index].Slot[index].Color = 0; } eq->BeardColor[char_index] = 0; eq->HairStyle[char_index] = 0; - for (int index = 0; index < EQEmu::textures::materialCount; ++index) { + for (int index = 0; index < EQ::textures::materialCount; ++index) { eq->Equip[char_index].Slot[index].Material = 0; } @@ -1717,7 +1747,7 @@ namespace Titanium eq->petOwnerId = emu->petOwnerId; eq->guildrank = emu->guildrank; // eq->unknown0194[3] = emu->unknown0194[3]; - for (k = EQEmu::textures::textureBegin; k < EQEmu::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_tint.Slot[k].Color = emu->equipment_tint.Slot[k].Color; } @@ -1830,7 +1860,7 @@ namespace Titanium DECODE_LENGTH_EXACT(structs::BugReport_Struct); SETUP_DIRECT_DECODE(BugReport_Struct, structs::BugReport_Struct); - emu->category_id = EQEmu::bug::CategoryNameToCategoryID(eq->category_name); + emu->category_id = EQ::bug::CategoryNameToCategoryID(eq->category_name); memcpy(emu->category_name, eq, sizeof(structs::BugReport_Struct)); FINISH_DIRECT_DECODE(); @@ -1943,6 +1973,83 @@ namespace Titanium FINISH_DIRECT_DECODE(); } + DECODE(OP_DzAddPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzChooseZoneReply) + { + DECODE_LENGTH_EXACT(structs::DynamicZoneChooseZoneReply_Struct); + SETUP_DIRECT_DECODE(DynamicZoneChooseZoneReply_Struct, structs::DynamicZoneChooseZoneReply_Struct); + + emu->unknown000 = eq->unknown000; + emu->unknown008 = eq->unknown004; + IN(unknown_id1); + IN(dz_zone_id); + IN(dz_instance_id); + IN(dz_type); + IN(unknown_id2); + emu->unknown028 = eq->unknown024; + emu->unknown032 = eq->unknown028; + emu->unknown036 = eq->unknown032; + emu->unknown040 = eq->unknown036; + emu->unknown044 = eq->unknown040; + emu->unknown048 = eq->unknown044; + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzExpeditionInviteResponse) + { + DECODE_LENGTH_EXACT(structs::ExpeditionInviteResponse_Struct); + SETUP_DIRECT_DECODE(ExpeditionInviteResponse_Struct, structs::ExpeditionInviteResponse_Struct); + + IN(dz_zone_id); + IN(dz_instance_id); + IN(accepted); + IN(swapping); + strn0cpy(emu->swap_name, eq->swap_name, sizeof(emu->swap_name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzMakeLeader) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzRemovePlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzSwapPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommandSwap_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommandSwap_Struct, structs::ExpeditionCommandSwap_Struct); + + strn0cpy(emu->add_player_name, eq->add_player_name, sizeof(emu->add_player_name)); + strn0cpy(emu->rem_player_name, eq->rem_player_name, sizeof(emu->rem_player_name)); + + FINISH_DIRECT_DECODE(); + } + DECODE(OP_Emote) { unsigned char *__eq_buffer = __packet->pBuffer; @@ -1993,12 +2100,12 @@ namespace Titanium } // move ammo up to last element in server array - strn0cpy(emu->itemnames[EQEmu::invslot::slotAmmo], eq->itemnames[invslot::slotAmmo], sizeof(emu->itemnames[EQEmu::invslot::slotAmmo])); - emu->itemicons[EQEmu::invslot::slotAmmo] = eq->itemicons[invslot::slotAmmo]; + strn0cpy(emu->itemnames[EQ::invslot::slotAmmo], eq->itemnames[invslot::slotAmmo], sizeof(emu->itemnames[EQ::invslot::slotAmmo])); + emu->itemicons[EQ::invslot::slotAmmo] = eq->itemicons[invslot::slotAmmo]; // nullify power source element in server array - strn0cpy(emu->itemnames[EQEmu::invslot::slotPowerSource], "", sizeof(emu->itemnames[EQEmu::invslot::slotPowerSource])); - emu->itemicons[EQEmu::invslot::slotPowerSource] = 0xFFFFFFFF; + strn0cpy(emu->itemnames[EQ::invslot::slotPowerSource], "", sizeof(emu->itemnames[EQ::invslot::slotPowerSource])); + emu->itemicons[EQ::invslot::slotPowerSource] = 0xFFFFFFFF; strn0cpy(emu->text, eq->text, sizeof(emu->text)); @@ -2053,7 +2160,7 @@ namespace Titanium for (int i = 0; i < spells::SPELL_GEM_COUNT; ++i) IN(spell[i]); - for (int i = spells::SPELL_GEM_COUNT; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (int i = spells::SPELL_GEM_COUNT; i < EQ::spells::SPELL_GEM_COUNT; ++i) emu->spell[i] = 0xFFFFFFFF; IN(unknown); @@ -2273,9 +2380,9 @@ namespace Titanium } // file scope helper methods - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth) { + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth) { const char *protection = "\\\\\\\\\\"; - const EQEmu::ItemData *item = inst->GetUnscaledItem(); + const EQ::ItemData *item = inst->GetUnscaledItem(); ob << StringFormat( "%.*s%s", @@ -2293,7 +2400,7 @@ namespace Titanium ob << '|' << itoa((!inst->GetMerchantSlot() ? inst->GetSerialNumber() : inst->GetMerchantSlot())); // merchant serial number ob << '|' << itoa(inst->GetRecastTimestamp()); // recast timestamp - ob << '|' << itoa(((inst->IsStackable() ? ((inst->GetItem()->ItemType == EQEmu::item::ItemTypePotion) ? 1 : 0) + ob << '|' << itoa(((inst->IsStackable() ? ((inst->GetItem()->ItemType == EQ::item::ItemTypePotion) ? 1 : 0) : inst->GetCharges()))); // charge count ob << '|' << itoa((inst->IsAttuned() ? 1 : 0)); // inst attuned ob << '|' << itoa(0); // unknown @@ -2502,10 +2609,10 @@ namespace Titanium ob << StringFormat("%.*s\"", depth, protection); // Quotes (and protection, if needed) around static data // Sub data - for (int index = EQEmu::invbag::SLOT_BEGIN; index <= invbag::SLOT_END; ++index) { + for (int index = EQ::invbag::SLOT_BEGIN; index <= invbag::SLOT_END; ++index) { ob << '|'; - EQEmu::ItemInstance *sub = inst->GetItem(index); + EQ::ItemInstance *sub = inst->GetItem(index); if (!sub) continue; @@ -2525,59 +2632,59 @@ namespace Titanium static inline int16 ServerToTitaniumSlot(uint32 server_slot) { int16 titanium_slot = invslot::SLOT_INVALID; - if (server_slot <= EQEmu::invslot::slotWaist) { + if (server_slot <= EQ::invslot::slotWaist) { titanium_slot = server_slot; } - else if (server_slot == EQEmu::invslot::slotAmmo) { + else if (server_slot == EQ::invslot::slotAmmo) { titanium_slot = server_slot - 1; } - else if (server_slot <= EQEmu::invslot::slotGeneral8 && server_slot >= EQEmu::invslot::slotGeneral1) { + else if (server_slot <= EQ::invslot::slotGeneral8 && server_slot >= EQ::invslot::slotGeneral1) { titanium_slot = server_slot - 1; } - else if (server_slot <= (EQEmu::invslot::POSSESSIONS_COUNT + EQEmu::invslot::slotWaist) && - server_slot >= EQEmu::invslot::slotCursor) { + else if (server_slot <= (EQ::invslot::POSSESSIONS_COUNT + EQ::invslot::slotWaist) && + server_slot >= EQ::invslot::slotCursor) { titanium_slot = server_slot - 3; } - else if (server_slot == (EQEmu::invslot::POSSESSIONS_COUNT + EQEmu::invslot::slotAmmo)) { + else if (server_slot == (EQ::invslot::POSSESSIONS_COUNT + EQ::invslot::slotAmmo)) { titanium_slot = server_slot - 4; } - else if (server_slot <= EQEmu::invbag::GENERAL_BAGS_8_END && - server_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::GENERAL_BAGS_8_END && + server_slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::CURSOR_BAG_END && server_slot >= EQEmu::invbag::CURSOR_BAG_BEGIN) { + else if (server_slot <= EQ::invbag::CURSOR_BAG_END && server_slot >= EQ::invbag::CURSOR_BAG_BEGIN) { titanium_slot = server_slot - 20; } - else if (server_slot <= EQEmu::invslot::TRIBUTE_END && server_slot >= EQEmu::invslot::TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::TRIBUTE_END && server_slot >= EQ::invslot::TRIBUTE_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::GUILD_TRIBUTE_END && - server_slot >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN) { + else if (server_slot <= EQ::invslot::GUILD_TRIBUTE_END && + server_slot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) { titanium_slot = server_slot; } - else if (server_slot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + else if (server_slot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::BANK_END && server_slot >= EQEmu::invslot::BANK_BEGIN) { + else if (server_slot <= EQ::invslot::BANK_END && server_slot >= EQ::invslot::BANK_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::BANK_BAGS_16_END && server_slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::BANK_BAGS_16_END && server_slot >= EQ::invbag::BANK_BAGS_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::SHARED_BANK_END && server_slot >= EQEmu::invslot::SHARED_BANK_BEGIN) { + else if (server_slot <= EQ::invslot::SHARED_BANK_END && server_slot >= EQ::invslot::SHARED_BANK_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::SHARED_BANK_BAGS_END && - server_slot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::SHARED_BANK_BAGS_END && + server_slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::TRADE_END && server_slot >= EQEmu::invslot::TRADE_BEGIN) { + else if (server_slot <= EQ::invslot::TRADE_END && server_slot >= EQ::invslot::TRADE_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invbag::TRADE_BAGS_END && server_slot >= EQEmu::invbag::TRADE_BAGS_BEGIN) { + else if (server_slot <= EQ::invbag::TRADE_BAGS_END && server_slot >= EQ::invbag::TRADE_BAGS_BEGIN) { titanium_slot = server_slot; } - else if (server_slot <= EQEmu::invslot::WORLD_END && server_slot >= EQEmu::invslot::WORLD_BEGIN) { + else if (server_slot <= EQ::invslot::WORLD_END && server_slot >= EQ::invslot::WORLD_BEGIN) { titanium_slot = server_slot; } @@ -2590,16 +2697,16 @@ namespace Titanium static inline int16 ServerToTitaniumCorpseSlot(uint32 server_corpse_slot) { int16 titanium_slot = invslot::SLOT_INVALID; - if (server_corpse_slot <= EQEmu::invslot::slotGeneral8 && server_corpse_slot >= EQEmu::invslot::slotGeneral1) { + if (server_corpse_slot <= EQ::invslot::slotGeneral8 && server_corpse_slot >= EQ::invslot::slotGeneral1) { titanium_slot = server_corpse_slot - 1; } - else if (server_corpse_slot <= (EQEmu::invslot::POSSESSIONS_COUNT + EQEmu::invslot::slotWaist) && - server_corpse_slot >= EQEmu::invslot::slotCursor) { + else if (server_corpse_slot <= (EQ::invslot::POSSESSIONS_COUNT + EQ::invslot::slotWaist) && + server_corpse_slot >= EQ::invslot::slotCursor) { titanium_slot = server_corpse_slot - 3; } - else if (server_corpse_slot == (EQEmu::invslot::POSSESSIONS_COUNT + EQEmu::invslot::slotAmmo)) { + else if (server_corpse_slot == (EQ::invslot::POSSESSIONS_COUNT + EQ::invslot::slotAmmo)) { titanium_slot = server_corpse_slot - 4; } @@ -2613,7 +2720,7 @@ namespace Titanium } static inline uint32 TitaniumToServerSlot(int16 titanium_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (titanium_slot <= invslot::slotWaist) { server_slot = titanium_slot; @@ -2675,7 +2782,7 @@ namespace Titanium static inline uint32 TitaniumToServerCorpseSlot(int16 titanium_corpse_slot) { - uint32 server_slot = EQEmu::invslot::SLOT_INVALID; + uint32 server_slot = EQ::invslot::SLOT_INVALID; if (titanium_corpse_slot <= invslot::slotGeneral8 && titanium_corpse_slot >= invslot::slotGeneral1) { server_slot = titanium_corpse_slot + 1; @@ -2696,7 +2803,7 @@ namespace Titanium static inline void ServerToTitaniumSayLink(std::string &titanium_saylink, const std::string &server_saylink) { - if ((constants::SAY_LINK_BODY_SIZE == EQEmu::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { + if ((constants::SAY_LINK_BODY_SIZE == EQ::constants::SAY_LINK_BODY_SIZE) || (server_saylink.find('\x12') == std::string::npos)) { titanium_saylink = server_saylink; return; } @@ -2705,7 +2812,7 @@ namespace Titanium for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) { if (segment_iter & 1) { - if (segments[segment_iter].length() <= EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (segments[segment_iter].length() <= EQ::constants::SAY_LINK_BODY_SIZE) { titanium_saylink.append(segments[segment_iter]); // TODO: log size mismatch error continue; @@ -2736,7 +2843,7 @@ namespace Titanium static inline void TitaniumToServerSayLink(std::string &server_saylink, const std::string &titanium_saylink) { - if ((EQEmu::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (titanium_saylink.find('\x12') == std::string::npos)) { + if ((EQ::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (titanium_saylink.find('\x12') == std::string::npos)) { server_saylink = titanium_saylink; return; } @@ -2772,85 +2879,85 @@ namespace Titanium } } - static inline spells::CastingSlot ServerToTitaniumCastingSlot(EQEmu::spells::CastingSlot slot) { + static inline spells::CastingSlot ServerToTitaniumCastingSlot(EQ::spells::CastingSlot slot) { switch (slot) { - case EQEmu::spells::CastingSlot::Gem1: + case EQ::spells::CastingSlot::Gem1: return spells::CastingSlot::Gem1; - case EQEmu::spells::CastingSlot::Gem2: + case EQ::spells::CastingSlot::Gem2: return spells::CastingSlot::Gem2; - case EQEmu::spells::CastingSlot::Gem3: + case EQ::spells::CastingSlot::Gem3: return spells::CastingSlot::Gem3; - case EQEmu::spells::CastingSlot::Gem4: + case EQ::spells::CastingSlot::Gem4: return spells::CastingSlot::Gem4; - case EQEmu::spells::CastingSlot::Gem5: + case EQ::spells::CastingSlot::Gem5: return spells::CastingSlot::Gem5; - case EQEmu::spells::CastingSlot::Gem6: + case EQ::spells::CastingSlot::Gem6: return spells::CastingSlot::Gem6; - case EQEmu::spells::CastingSlot::Gem7: + case EQ::spells::CastingSlot::Gem7: return spells::CastingSlot::Gem7; - case EQEmu::spells::CastingSlot::Gem8: + case EQ::spells::CastingSlot::Gem8: return spells::CastingSlot::Gem8; - case EQEmu::spells::CastingSlot::Gem9: + case EQ::spells::CastingSlot::Gem9: return spells::CastingSlot::Gem9; - case EQEmu::spells::CastingSlot::Item: + case EQ::spells::CastingSlot::Item: return spells::CastingSlot::Item; - case EQEmu::spells::CastingSlot::PotionBelt: + case EQ::spells::CastingSlot::PotionBelt: return spells::CastingSlot::PotionBelt; - case EQEmu::spells::CastingSlot::Discipline: + case EQ::spells::CastingSlot::Discipline: return spells::CastingSlot::Discipline; - case EQEmu::spells::CastingSlot::AltAbility: + case EQ::spells::CastingSlot::AltAbility: return spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something return spells::CastingSlot::Discipline; } } - static inline EQEmu::spells::CastingSlot TitaniumToServerCastingSlot(spells::CastingSlot slot, uint32 item_location) { + static inline EQ::spells::CastingSlot TitaniumToServerCastingSlot(spells::CastingSlot slot, uint32 item_location) { switch (slot) { case spells::CastingSlot::Gem1: - return EQEmu::spells::CastingSlot::Gem1; + return EQ::spells::CastingSlot::Gem1; case spells::CastingSlot::Gem2: - return EQEmu::spells::CastingSlot::Gem2; + return EQ::spells::CastingSlot::Gem2; case spells::CastingSlot::Gem3: - return EQEmu::spells::CastingSlot::Gem3; + return EQ::spells::CastingSlot::Gem3; case spells::CastingSlot::Gem4: - return EQEmu::spells::CastingSlot::Gem4; + return EQ::spells::CastingSlot::Gem4; case spells::CastingSlot::Gem5: - return EQEmu::spells::CastingSlot::Gem5; + return EQ::spells::CastingSlot::Gem5; case spells::CastingSlot::Gem6: - return EQEmu::spells::CastingSlot::Gem6; + return EQ::spells::CastingSlot::Gem6; case spells::CastingSlot::Gem7: - return EQEmu::spells::CastingSlot::Gem7; + return EQ::spells::CastingSlot::Gem7; case spells::CastingSlot::Gem8: - return EQEmu::spells::CastingSlot::Gem8; + return EQ::spells::CastingSlot::Gem8; case spells::CastingSlot::Gem9: - return EQEmu::spells::CastingSlot::Gem9; + return EQ::spells::CastingSlot::Gem9; case spells::CastingSlot::Ability: - return EQEmu::spells::CastingSlot::Ability; + return EQ::spells::CastingSlot::Ability; // Tit uses 10 for item and discipline casting, but items have a valid location case spells::CastingSlot::Item: if (item_location == INVALID_INDEX) - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; else - return EQEmu::spells::CastingSlot::Item; + return EQ::spells::CastingSlot::Item; case spells::CastingSlot::PotionBelt: - return EQEmu::spells::CastingSlot::PotionBelt; + return EQ::spells::CastingSlot::PotionBelt; case spells::CastingSlot::AltAbility: - return EQEmu::spells::CastingSlot::AltAbility; + return EQ::spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; } } static inline int ServerToTitaniumBuffSlot(int index) { // we're a disc - if (index >= EQEmu::spells::LONG_BUFFS + EQEmu::spells::SHORT_BUFFS) - return index - EQEmu::spells::LONG_BUFFS - EQEmu::spells::SHORT_BUFFS + + if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS) + return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS + spells::LONG_BUFFS + spells::SHORT_BUFFS; // we're a song - if (index >= EQEmu::spells::LONG_BUFFS) - return index - EQEmu::spells::LONG_BUFFS + spells::LONG_BUFFS; + if (index >= EQ::spells::LONG_BUFFS) + return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } @@ -2859,11 +2966,11 @@ namespace Titanium { // we're a disc if (index >= spells::LONG_BUFFS + spells::SHORT_BUFFS) - return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQEmu::spells::LONG_BUFFS + - EQEmu::spells::SHORT_BUFFS; + return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQ::spells::LONG_BUFFS + + EQ::spells::SHORT_BUFFS; // we're a song if (index >= spells::LONG_BUFFS) - return index - spells::LONG_BUFFS + EQEmu::spells::LONG_BUFFS; + return index - spells::LONG_BUFFS + EQ::spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } diff --git a/common/patches/titanium.h b/common/patches/titanium.h index 2f063c9ad..9e5cc7af5 100644 --- a/common/patches/titanium.h +++ b/common/patches/titanium.h @@ -43,7 +43,7 @@ namespace Titanium protected: virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; //magic macro to declare our opcode processors #include "ss_declare.h" diff --git a/common/patches/titanium_limits.h b/common/patches/titanium_limits.h index 5a804defb..09d3d99ca 100644 --- a/common/patches/titanium_limits.h +++ b/common/patches/titanium_limits.h @@ -31,7 +31,7 @@ namespace Titanium const int16 INULL = 0; namespace inventory { - inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::Titanium; } const bool ConcatenateInvTypeLimbo = true; @@ -43,7 +43,7 @@ namespace Titanium } /*inventory*/ namespace invtype { - inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::Titanium; } namespace enum_ { enum InventoryTypes : int16 { @@ -106,7 +106,7 @@ namespace Titanium } /*invtype*/ namespace invslot { - inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::Titanium; } namespace enum_ { enum InventorySlots : int16 { @@ -204,7 +204,7 @@ namespace Titanium } /*invslot*/ namespace invbag { - inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::Titanium; } const int16 SLOT_INVALID = IINVALID; const int16 SLOT_BEGIN = INULL; @@ -236,7 +236,7 @@ namespace Titanium } /*invbag*/ namespace invaug { - inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::Titanium; } const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_BEGIN = INULL; @@ -248,7 +248,7 @@ namespace Titanium } /*invaug*/ namespace item { - inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::Titanium; } enum ItemPacketType : int { ItemPacketMerchant = 100, @@ -266,7 +266,7 @@ namespace Titanium } /*item*/ namespace profile { - inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::Titanium; } const int16 BANDOLIERS_SIZE = 4; // number of bandolier instances const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance @@ -278,11 +278,11 @@ namespace Titanium } /*profile*/ namespace constants { - inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::Titanium; } - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::DoD; // Someone had this as PoR in another section... - const uint32 EXPANSION_BIT = EQEmu::expansions::bitDoD; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskDoD; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::DoD; // Someone had this as PoR in another section... + const uint32 EXPANSION_BIT = EQ::expansions::bitDoD; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskDoD; const size_t CHARACTER_CREATION_LIMIT = 8; // Hard-coded in client - DO NOT ALTER @@ -291,21 +291,21 @@ namespace Titanium } /*constants*/ namespace behavior { - inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::Titanium; } const bool CoinHasWeight = true; } /*behavior*/ namespace skills { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::Titanium; } - const size_t LastUsableSkill = EQEmu::skills::SkillFrenzy; + const size_t LastUsableSkill = EQ::skills::SkillFrenzy; } /*skills*/ namespace spells { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::Titanium; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::Titanium; } enum class CastingSlot : uint32 { Gem1 = 0, diff --git a/common/patches/titanium_ops.h b/common/patches/titanium_ops.h index d3c8c1dde..961c850fe 100644 --- a/common/patches/titanium_ops.h +++ b/common/patches/titanium_ops.h @@ -32,13 +32,16 @@ E(OP_Damage) E(OP_DeleteCharge) E(OP_DeleteItem) E(OP_DeleteSpawn) +E(OP_DzChooseZone) E(OP_DzCompass) E(OP_DzExpeditionEndsWarning) E(OP_DzExpeditionInfo) -E(OP_DzExpeditionList) -E(OP_DzJoinExpeditionConfirm) -E(OP_DzLeaderStatus) +E(OP_DzExpeditionInvite) +E(OP_DzExpeditionLockoutTimers) E(OP_DzMemberList) +E(OP_DzMemberListName) +E(OP_DzMemberListStatus) +E(OP_DzSetLeaderName) E(OP_Emote) E(OP_FormattedMessage) E(OP_GroundSpawn) @@ -86,6 +89,12 @@ D(OP_CharacterCreate) D(OP_ClientUpdate) D(OP_Consume) D(OP_DeleteItem) +D(OP_DzAddPlayer) +D(OP_DzChooseZoneReply) +D(OP_DzExpeditionInviteResponse) +D(OP_DzMakeLeader) +D(OP_DzRemovePlayer) +D(OP_DzSwapPlayer) D(OP_Emote) D(OP_FaceChange) D(OP_InspectAnswer) diff --git a/common/patches/titanium_structs.h b/common/patches/titanium_structs.h index de350db0b..2846288bc 100644 --- a/common/patches/titanium_structs.h +++ b/common/patches/titanium_structs.h @@ -161,7 +161,7 @@ struct TintProfile { Tint_Struct Primary; Tint_Struct Secondary; }; - Tint_Struct Slot[EQEmu::textures::materialCount]; + Tint_Struct Slot[EQ::textures::materialCount]; }; }; @@ -184,7 +184,7 @@ struct TextureProfile Texture_Struct Primary; Texture_Struct Secondary; }; - Texture_Struct Slot[EQEmu::textures::materialCount]; + Texture_Struct Slot[EQ::textures::materialCount]; }; TextureProfile(); @@ -738,7 +738,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -1509,7 +1509,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -3299,43 +3299,150 @@ struct VeteranReward /*004*/ VeteranRewardItem item; }; -struct ExpeditionExpireWarning +struct ExpeditionInvite_Struct +{ +/*000*/ uint32 client_id; +/*004*/ char inviter_name[64]; +/*068*/ char expedition_name[128]; +/*196*/ uint8 swapping; // 0: adding 1: swapping +/*197*/ char swap_name[64]; // if swapping, swap name being removed +/*261*/ uint8 padding[3]; +/*264*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*268*/ uint16 dz_instance_id; +}; + +struct ExpeditionInviteResponse_Struct { /*000*/ uint32 unknown000; +/*004*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*006*/ uint16 dz_instance_id; +/*008*/ uint8 accepted; // 0: declined 1: accepted +/*009*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*010*/ char swap_name[64]; // swap name sent in invite +/*074*/ uint8 unknown078; // padding/garbage? +/*075*/ uint8 unknown079; // padding/garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 assigned; // padded bool +/*008*/ uint32 max_players; +/*012*/ char dz_name[128]; +/*140*/ char leader_name[64]; +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[1]; // variable length, null terminated, max 0x40 (64) +/*000*/ uint8 online_status; // 0: unknown 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*008*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[1]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ char add_player_name[64]; // swap to (player must confirm) +/*068*/ char rem_player_name[64]; // swap from +}; + +struct ExpeditionExpireWarning +{ +/*000*/ uint32 client_id; /*004*/ uint32 minutes_remaining; }; -struct ExpeditionInfo_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ uint32 enabled_max; -/*008*/ uint32 max_players; -/*012*/ char expedition_name[128]; -/*142*/ char leader_name[64]; -}; - -struct ExpeditionCompassEntry_Struct -{ -/*000*/ float unknown000; //seen *((uint32*)) = 1584791871 -/*004*/ uint32 enabled; //guess -/*008*/ uint32 unknown008; //seen 1019 +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) +/*008*/ uint32 unknown008; /*012*/ float y; /*016*/ float x; /*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 count; -/*008*/ ExpeditionCompassEntry_Struct entries[0]; +/*008*/ DynamicZoneCompassEntry_Struct entries[0]; }; -struct ExpeditionJoinPrompt_Struct +struct DynamicZoneChooseZoneEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ char player_name[64]; -/*068*/ char expedition_name[64]; +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ char leader_name[1]; // variable length, null terminated, max 0x40 (64) +}; + +struct DynamicZoneChooseZone_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; +}; + +struct DynamicZoneChooseZoneReply_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ uint32 unknown_id1; +/*012*/ uint16 dz_zone_id; +/*014*/ uint16 dz_instance_id; +/*016*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*020*/ uint32 unknown_id2; +/*024*/ uint32 unknown024; +/*028*/ uint32 unknown028; // always same as unknown040 +/*032*/ uint32 unknown032; +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; // always same as unknown028 +/*044*/ uint32 unknown044; }; struct LFGuild_SearchPlayer_Struct diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index ef28e8e33..c23415737 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -43,7 +43,7 @@ namespace UF static OpcodeManager *opcodes = nullptr; static Strategy struct_strategy; - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id, uint8 depth); + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id, uint8 depth); // server to client inventory location converters static inline uint32 ServerToUFSlot(uint32 serverSlot); @@ -59,8 +59,8 @@ namespace UF // client to server say link converter static inline void UFToServerSayLink(std::string& serverSayLink, const std::string& ufSayLink); - static inline spells::CastingSlot ServerToUFCastingSlot(EQEmu::spells::CastingSlot slot); - static inline EQEmu::spells::CastingSlot UFToServerCastingSlot(spells::CastingSlot slot); + static inline spells::CastingSlot ServerToUFCastingSlot(EQ::spells::CastingSlot slot); + static inline EQ::spells::CastingSlot UFToServerCastingSlot(spells::CastingSlot slot); static inline int ServerToUFBuffSlot(int index); static inline int UFToServerBuffSlot(int index); @@ -144,9 +144,9 @@ namespace UF return(r); } - const EQEmu::versions::ClientVersion Strategy::ClientVersion() const + const EQ::versions::ClientVersion Strategy::ClientVersion() const { - return EQEmu::versions::ClientVersion::UF; + return EQ::versions::ClientVersion::UF; } #include "ss_define.h" @@ -501,24 +501,24 @@ namespace UF //store away the emu struct uchar* __emu_buffer = in->pBuffer; - int item_count = in->size / sizeof(EQEmu::InternalSerializedItem_Struct); - if (!item_count || (in->size % sizeof(EQEmu::InternalSerializedItem_Struct)) != 0) { + int item_count = in->size / sizeof(EQ::InternalSerializedItem_Struct); + if (!item_count || (in->size % sizeof(EQ::InternalSerializedItem_Struct)) != 0) { Log(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQEmu::InternalSerializedItem_Struct)); + opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(EQ::InternalSerializedItem_Struct)); delete in; return; } - EQEmu::InternalSerializedItem_Struct* eq = (EQEmu::InternalSerializedItem_Struct*)in->pBuffer; + EQ::InternalSerializedItem_Struct* eq = (EQ::InternalSerializedItem_Struct*)in->pBuffer; - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)&item_count, sizeof(uint32)); for (int index = 0; index < item_count; ++index, ++eq) { - SerializeItem(ob, (const EQEmu::ItemInstance*)eq->inst, eq->slot_id, 0); + SerializeItem(ob, (const EQ::ItemInstance*)eq->inst, eq->slot_id, 0); if (ob.tellp() == last_pos) LogNetcode("UF::ENCODE(OP_CharInventory) Serialization failed on item slot [{}] during OP_CharInventory. Item skipped", eq->slot_id); @@ -613,14 +613,48 @@ namespace UF FINISH_ENCODE(); } + ENCODE(OP_DzChooseZone) + { + SETUP_VAR_ENCODE(DynamicZoneChooseZone_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); + + for (uint32 i = 0; i < emu->count; ++i) + { + buf.WriteUInt16(emu->choices[i].dz_zone_id); + buf.WriteUInt16(emu->choices[i].dz_instance_id); + buf.WriteUInt32(emu->choices[i].unknown_id1); + buf.WriteUInt32(emu->choices[i].dz_type); + buf.WriteUInt32(emu->choices[i].unknown_id2); + buf.WriteString(emu->choices[i].description); + buf.WriteString(emu->choices[i].leader_name); + } + + __packet->size = buf.size(); + __packet->pBuffer = new unsigned char[__packet->size]; + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); + + FINISH_ENCODE(); + } + ENCODE(OP_DzCompass) { - SETUP_VAR_ENCODE(ExpeditionCompass_Struct); - ALLOC_VAR_ENCODE(structs::ExpeditionCompass_Struct, sizeof(structs::ExpeditionInfo_Struct) + sizeof(structs::ExpeditionCompassEntry_Struct) * emu->count); + SETUP_VAR_ENCODE(DynamicZoneCompass_Struct); + ALLOC_VAR_ENCODE(structs::DynamicZoneCompass_Struct, + sizeof(structs::DynamicZoneCompass_Struct) + + sizeof(structs::DynamicZoneCompassEntry_Struct) * emu->count + ); + + OUT(client_id); OUT(count); for (uint32 i = 0; i < emu->count; ++i) { + OUT(entries[i].dz_zone_id); + OUT(entries[i].dz_instance_id); + OUT(entries[i].dz_type); OUT(entries[i].x); OUT(entries[i].y); OUT(entries[i].z); @@ -641,112 +675,108 @@ namespace UF ENCODE(OP_DzExpeditionInfo) { - ENCODE_LENGTH_EXACT(ExpeditionInfo_Struct); - SETUP_DIRECT_ENCODE(ExpeditionInfo_Struct, structs::ExpeditionInfo_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneInfo_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneInfo_Struct, structs::DynamicZoneInfo_Struct); + OUT(client_id); + OUT(assigned); OUT(max_players); - eq->unknown004 = 785316192; - eq->unknown008 = 435601; - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->leader_name, emu->leader_name); + strn0cpy(eq->dz_name, emu->dz_name, sizeof(eq->dz_name)); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } - ENCODE(OP_DzExpeditionList) + ENCODE(OP_DzExpeditionInvite) { - SETUP_VAR_ENCODE(ExpeditionLockoutList_Struct); + ENCODE_LENGTH_EXACT(ExpeditionInvite_Struct); + SETUP_DIRECT_ENCODE(ExpeditionInvite_Struct, structs::ExpeditionInvite_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); + OUT(client_id); + strn0cpy(eq->inviter_name, emu->inviter_name, sizeof(eq->inviter_name)); + strn0cpy(eq->expedition_name, emu->expedition_name, sizeof(eq->expedition_name)); + OUT(swapping); + strn0cpy(eq->swap_name, emu->swap_name, sizeof(eq->swap_name)); + OUT(dz_zone_id); + OUT(dz_instance_id); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzExpeditionLockoutTimers) + { + SETUP_VAR_ENCODE(ExpeditionLockoutTimers_Struct); + + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->count); for (uint32 i = 0; i < emu->count; ++i) { - ss.write(emu->entries[i].expedition, strlen(emu->entries[i].expedition)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].time_left, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->entries[i].expedition_event, strlen(emu->entries[i].expedition_event)); - ss.write((const char*)&null_term, sizeof(char)); + buf.WriteString(emu->timers[i].expedition_name); + buf.WriteUInt32(emu->timers[i].seconds_remaining); + buf.WriteInt32(emu->timers[i].event_type); + buf.WriteString(emu->timers[i].event_name); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } - ENCODE(OP_DzJoinExpeditionConfirm) + ENCODE(OP_DzSetLeaderName) { - ENCODE_LENGTH_EXACT(ExpeditionJoinPrompt_Struct); - SETUP_DIRECT_ENCODE(ExpeditionJoinPrompt_Struct, structs::ExpeditionJoinPrompt_Struct); + ENCODE_LENGTH_EXACT(DynamicZoneLeaderName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneLeaderName_Struct, structs::DynamicZoneLeaderName_Struct); - strcpy(eq->expedition_name, emu->expedition_name); - strcpy(eq->player_name, emu->player_name); - - FINISH_ENCODE(); - } - - ENCODE(OP_DzLeaderStatus) - { - SETUP_VAR_ENCODE(ExpeditionLeaderSet_Struct); - - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - uint32 client_id = 0; - uint8 null_term = 0; - - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write(emu->leader_name, strlen(emu->leader_name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//0xffffffff - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&client_id, sizeof(uint32));//1 - ss.write((const char*)&client_id, sizeof(uint32)); - - __packet->size = ss.str().length(); - __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + OUT(client_id); + strn0cpy(eq->leader_name, emu->leader_name, sizeof(eq->leader_name)); FINISH_ENCODE(); } ENCODE(OP_DzMemberList) { - SETUP_VAR_ENCODE(ExpeditionMemberList_Struct); + SETUP_VAR_ENCODE(DynamicZoneMemberList_Struct); - std::stringstream ss(std::stringstream::in | std::stringstream::out | std::stringstream::binary); - - uint32 client_id = 0; - uint8 null_term = 0; - ss.write((const char*)&client_id, sizeof(uint32)); - ss.write((const char*)&emu->count, sizeof(uint32)); - for (uint32 i = 0; i < emu->count; ++i) + SerializeBuffer buf; + buf.WriteUInt32(emu->client_id); + buf.WriteUInt32(emu->member_count); + for (uint32 i = 0; i < emu->member_count; ++i) { - ss.write(emu->entries[i].name, strlen(emu->entries[i].name)); - ss.write((const char*)&null_term, sizeof(char)); - ss.write((const char*)&emu->entries[i].status, sizeof(char)); + buf.WriteString(emu->members[i].name); + buf.WriteUInt8(emu->members[i].online_status); } - __packet->size = ss.str().length(); + __packet->size = buf.size(); __packet->pBuffer = new unsigned char[__packet->size]; - memcpy(__packet->pBuffer, ss.str().c_str(), __packet->size); + memcpy(__packet->pBuffer, buf.buffer(), __packet->size); FINISH_ENCODE(); } + ENCODE(OP_DzMemberListName) + { + ENCODE_LENGTH_EXACT(DynamicZoneMemberListName_Struct); + SETUP_DIRECT_ENCODE(DynamicZoneMemberListName_Struct, structs::DynamicZoneMemberListName_Struct); + + OUT(client_id); + OUT(add_name); + strn0cpy(eq->name, emu->name, sizeof(eq->name)); + + FINISH_ENCODE(); + } + + ENCODE(OP_DzMemberListStatus) + { + auto emu = reinterpret_cast((*p)->pBuffer); + if (emu->member_count == 1) + { + ENCODE_FORWARD(OP_DzMemberList); + } + } + ENCODE(OP_Emote) { EQApplicationPacket *in = *p; @@ -1268,14 +1298,14 @@ namespace UF //store away the emu struct uchar* __emu_buffer = in->pBuffer; - EQEmu::InternalSerializedItem_Struct* int_struct = (EQEmu::InternalSerializedItem_Struct*)(&__emu_buffer[4]); + EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); ob.write((const char*)__emu_buffer, 4); - SerializeItem(ob, (const EQEmu::ItemInstance*)int_struct->inst, int_struct->slot_id, 0); + SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, int_struct->slot_id, 0); if (ob.tellp() == last_pos) { LogNetcode("UF::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id); delete in; @@ -1577,6 +1607,7 @@ namespace UF OUT(FastRegenHP); OUT(FastRegenMana); OUT(FastRegenEndurance); + OUT(underworld_teleport_index); eq->FogDensity = emu->fog_density; @@ -1674,7 +1705,7 @@ namespace UF eq->level1 = emu->level; // OUT(unknown00022[2]); for (r = 0; r < 5; r++) { - OUT(binds[r].zoneId); + OUT(binds[r].zone_id); OUT(binds[r].x); OUT(binds[r].y); OUT(binds[r].z); @@ -1693,7 +1724,7 @@ namespace UF OUT(hairstyle); OUT(beard); // OUT(unknown00178[10]); - for (r = EQEmu::textures::textureBegin; r < EQEmu::textures::materialCount; r++) { + for (r = EQ::textures::textureBegin; r < EQ::textures::materialCount; r++) { eq->equipment.Slot[r].Material = emu->item_material.Slot[r].Material; eq->equipment.Slot[r].Unknown1 = 0; eq->equipment.Slot[r].EliteMaterial = 0; @@ -1725,7 +1756,7 @@ namespace UF OUT(face); // OUT(unknown02264[47]); - if (spells::SPELLBOOK_SIZE <= EQEmu::spells::SPELLBOOK_SIZE) { + if (spells::SPELLBOOK_SIZE <= EQ::spells::SPELLBOOK_SIZE) { for (uint32 r = 0; r < spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; @@ -1734,14 +1765,14 @@ namespace UF } } else { - for (uint32 r = 0; r < EQEmu::spells::SPELLBOOK_SIZE; r++) { + for (uint32 r = 0; r < EQ::spells::SPELLBOOK_SIZE; r++) { if (emu->spell_book[r] <= spells::SPELL_ID_MAX) eq->spell_book[r] = emu->spell_book[r]; else eq->spell_book[r] = 0xFFFFFFFFU; } // invalidate the rest of the spellbook slots - memset(&eq->spell_book[EQEmu::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQEmu::spells::SPELLBOOK_SIZE))); + memset(&eq->spell_book[EQ::spells::SPELLBOOK_SIZE], 0xFF, (sizeof(uint32) * (spells::SPELLBOOK_SIZE - EQ::spells::SPELLBOOK_SIZE))); } // OUT(unknown4184[128]); @@ -1797,7 +1828,7 @@ namespace UF // OUT(unknown06160[4]); // Copy bandoliers where server and client indices converge - for (r = 0; r < EQEmu::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { + for (r = 0; r < EQ::profile::BANDOLIERS_SIZE && r < profile::BANDOLIERS_SIZE; ++r) { OUT_str(bandoliers[r].Name); for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true OUT(bandoliers[r].Items[k].ID); @@ -1806,7 +1837,7 @@ namespace UF } } // Nullify bandoliers where server and client indices diverge, with a client bias - for (r = EQEmu::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { + for (r = EQ::profile::BANDOLIERS_SIZE; r < profile::BANDOLIERS_SIZE; ++r) { eq->bandoliers[r].Name[0] = '\0'; for (uint32 k = 0; k < profile::BANDOLIER_ITEM_COUNT; ++k) { // Will need adjusting if 'server != client' is ever true eq->bandoliers[r].Items[k].ID = 0; @@ -1818,13 +1849,13 @@ namespace UF // OUT(unknown07444[5120]); // Copy potion belt where server and client indices converge - for (r = 0; r < EQEmu::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { + for (r = 0; r < EQ::profile::POTION_BELT_SIZE && r < profile::POTION_BELT_SIZE; ++r) { OUT(potionbelt.Items[r].ID); OUT(potionbelt.Items[r].Icon); OUT_str(potionbelt.Items[r].Name); } // Nullify potion belt where server and client indices diverge, with a client bias - for (r = EQEmu::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { + for (r = EQ::profile::POTION_BELT_SIZE; r < profile::POTION_BELT_SIZE; ++r) { eq->potionbelt.Items[r].ID = 0; eq->potionbelt.Items[r].Icon = 0; eq->potionbelt.Items[r].Name[0] = '\0'; @@ -2196,7 +2227,7 @@ namespace UF eq_cse->HairColor = emu_cse->HairColor; eq_cse->Face = emu_cse->Face; - for (int equip_index = EQEmu::textures::textureBegin; equip_index < EQEmu::textures::materialCount; equip_index++) { + for (int equip_index = EQ::textures::textureBegin; equip_index < EQ::textures::materialCount; equip_index++) { eq_cse->Equip[equip_index].Material = emu_cse->Equip[equip_index].Material; eq_cse->Equip[equip_index].Unknown1 = emu_cse->Equip[equip_index].Unknown1; eq_cse->Equip[equip_index].EliteMaterial = emu_cse->Equip[equip_index].EliteModel; @@ -2755,7 +2786,7 @@ namespace UF float SpawnSize = emu->size; if (!((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522))) { - PacketSize -= (sizeof(structs::Texture_Struct) * EQEmu::textures::materialCount); + PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount); if (emu->size == 0) { @@ -2954,7 +2985,7 @@ namespace UF if ((emu->NPC == 0) || (emu->race <= 12) || (emu->race == 128) || (emu->race == 130) || (emu->race == 330) || (emu->race == 522)) { - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; ++k) + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k) { { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->equipment_tint.Slot[k].Color); @@ -2990,7 +3021,7 @@ namespace UF { structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer; - for (k = EQEmu::textures::textureBegin; k < EQEmu::textures::materialCount; k++) { + for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) { if (emu->equipment.Slot[k].Material > 99999) { Equipment[k].Material = 63; } else { @@ -3000,7 +3031,7 @@ namespace UF Equipment[k].EliteMaterial = emu->equipment.Slot[k].EliteModel; } - Buffer += (sizeof(structs::Texture_Struct) * EQEmu::textures::materialCount); + Buffer += (sizeof(structs::Texture_Struct) * EQ::textures::materialCount); } if (strlen(emu->title)) { @@ -3314,6 +3345,84 @@ namespace UF FINISH_DIRECT_DECODE(); } + DECODE(OP_DzAddPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzChooseZoneReply) + { + DECODE_LENGTH_EXACT(structs::DynamicZoneChooseZoneReply_Struct); + SETUP_DIRECT_DECODE(DynamicZoneChooseZoneReply_Struct, structs::DynamicZoneChooseZoneReply_Struct); + + IN(unknown000); + IN(unknown004); + IN(unknown008); + IN(unknown_id1); + IN(dz_zone_id); + IN(dz_instance_id); + IN(dz_type); + IN(unknown_id2); + IN(unknown028); + IN(unknown032); + IN(unknown036); + IN(unknown040); + IN(unknown044); + IN(unknown048); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzExpeditionInviteResponse) + { + DECODE_LENGTH_EXACT(structs::ExpeditionInviteResponse_Struct); + SETUP_DIRECT_DECODE(ExpeditionInviteResponse_Struct, structs::ExpeditionInviteResponse_Struct); + + IN(dz_zone_id); + IN(dz_instance_id); + IN(accepted); + IN(swapping); + strn0cpy(emu->swap_name, eq->swap_name, sizeof(emu->swap_name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzMakeLeader) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzRemovePlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommand_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommand_Struct, structs::ExpeditionCommand_Struct); + + strn0cpy(emu->name, eq->name, sizeof(emu->name)); + + FINISH_DIRECT_DECODE(); + } + + DECODE(OP_DzSwapPlayer) + { + DECODE_LENGTH_EXACT(structs::ExpeditionCommandSwap_Struct); + SETUP_DIRECT_DECODE(ExpeditionCommandSwap_Struct, structs::ExpeditionCommandSwap_Struct); + + strn0cpy(emu->add_player_name, eq->add_player_name, sizeof(emu->add_player_name)); + strn0cpy(emu->rem_player_name, eq->rem_player_name, sizeof(emu->rem_player_name)); + + FINISH_DIRECT_DECODE(); + } + DECODE(OP_Emote) { unsigned char *__eq_buffer = __packet->pBuffer; @@ -3498,7 +3607,7 @@ namespace UF DECODE_LENGTH_EXACT(structs::LoadSpellSet_Struct); SETUP_DIRECT_DECODE(LoadSpellSet_Struct, structs::LoadSpellSet_Struct); - for (unsigned int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (unsigned int i = 0; i < EQ::spells::SPELL_GEM_COUNT; ++i) if (eq->spell[i] == 0) emu->spell[i] = 0xFFFFFFFF; else @@ -3737,9 +3846,9 @@ namespace UF return NextItemInstSerialNumber; } - void SerializeItem(EQEmu::OutBuffer& ob, const EQEmu::ItemInstance *inst, int16 slot_id_in, uint8 depth) + void SerializeItem(EQ::OutBuffer& ob, const EQ::ItemInstance *inst, int16 slot_id_in, uint8 depth) { - const EQEmu::ItemData *item = inst->GetUnscaledItem(); + const EQ::ItemData *item = inst->GetUnscaledItem(); UF::structs::ItemSerializationHeader hdr; @@ -3783,7 +3892,7 @@ namespace UF int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType); uint16 ornaIcon = 0; if (inst->GetOrnamentationAug(ornamentationAugtype)) { - const EQEmu::ItemData *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); + const EQ::ItemData *aug_weap = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); ornaIcon = aug_weap->Icon; ob.write(aug_weap->IDFile, strlen(aug_weap->IDFile)); @@ -3966,6 +4075,12 @@ namespace UF itbs.no_transfer = item->NoTransfer; itbs.expendablearrow = item->ExpendableArrow; + // Done to hack older clients to label expendable fishing poles as such + // July 28th, 2018 patch + if (item->ItemType == EQ::item::ItemTypeFishingPole && item->SubType == 0) { + itbs.expendablearrow = 1; + } + ob.write((const char*)&itbs, sizeof(UF::structs::ItemTertiaryBodyStruct)); // Effect Structures Broken down to allow variable length strings for effect names @@ -4106,33 +4221,34 @@ namespace UF iqbs.HealAmt = item->HealAmt; iqbs.SpellDmg = item->SpellDmg; iqbs.Clairvoyance = item->Clairvoyance; - + iqbs.SubType = item->SubType; + ob.write((const char*)&iqbs, sizeof(UF::structs::ItemQuaternaryBodyStruct)); - EQEmu::OutBuffer::pos_type count_pos = ob.tellp(); + EQ::OutBuffer::pos_type count_pos = ob.tellp(); uint32 subitem_count = 0; ob.write((const char*)&subitem_count, sizeof(uint32)); // moved outside of loop since it is not modified within that scope - int16 SubSlotNumber = EQEmu::invbag::SLOT_INVALID; + int16 SubSlotNumber = EQ::invbag::SLOT_INVALID; - if (slot_id_in <= EQEmu::invslot::slotGeneral8 && slot_id_in >= EQEmu::invslot::GENERAL_BEGIN) - SubSlotNumber = EQEmu::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::GENERAL_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::GENERAL_END && slot_id_in >= EQEmu::invslot::slotGeneral9) - SubSlotNumber = EQEmu::invbag::SLOT_INVALID; - else if (slot_id_in == EQEmu::invslot::slotCursor) - SubSlotNumber = EQEmu::invbag::CURSOR_BAG_BEGIN; - else if (slot_id_in <= EQEmu::invslot::BANK_END && slot_id_in >= EQEmu::invslot::BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); - else if (slot_id_in <= EQEmu::invslot::SHARED_BANK_END && slot_id_in >= EQEmu::invslot::SHARED_BANK_BEGIN) - SubSlotNumber = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQEmu::invslot::SHARED_BANK_BEGIN) * EQEmu::invbag::SLOT_COUNT); + if (slot_id_in <= EQ::invslot::slotGeneral8 && slot_id_in >= EQ::invslot::GENERAL_BEGIN) + SubSlotNumber = EQ::invbag::GENERAL_BAGS_BEGIN + ((slot_id_in - EQ::invslot::GENERAL_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::GENERAL_END && slot_id_in >= EQ::invslot::slotGeneral9) + SubSlotNumber = EQ::invbag::SLOT_INVALID; + else if (slot_id_in == EQ::invslot::slotCursor) + SubSlotNumber = EQ::invbag::CURSOR_BAG_BEGIN; + else if (slot_id_in <= EQ::invslot::BANK_END && slot_id_in >= EQ::invslot::BANK_BEGIN) + SubSlotNumber = EQ::invbag::BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::BANK_BEGIN) * EQ::invbag::SLOT_COUNT); + else if (slot_id_in <= EQ::invslot::SHARED_BANK_END && slot_id_in >= EQ::invslot::SHARED_BANK_BEGIN) + SubSlotNumber = EQ::invbag::SHARED_BANK_BAGS_BEGIN + ((slot_id_in - EQ::invslot::SHARED_BANK_BEGIN) * EQ::invbag::SLOT_COUNT); else SubSlotNumber = slot_id_in; // not sure if this is the best way to handle this..leaving for now - if (SubSlotNumber != EQEmu::invbag::SLOT_INVALID) { - for (uint32 index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { - EQEmu::ItemInstance* sub = inst->GetItem(index); + if (SubSlotNumber != EQ::invbag::SLOT_INVALID) { + for (uint32 index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; ++index) { + EQ::ItemInstance* sub = inst->GetItem(index); if (!sub) continue; @@ -4151,59 +4267,59 @@ namespace UF { uint32 UFSlot = invslot::SLOT_INVALID; - if (serverSlot <= EQEmu::invslot::slotGeneral8) { + if (serverSlot <= EQ::invslot::slotGeneral8) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::CORPSE_END && serverSlot >= EQEmu::invslot::slotCursor) { + else if (serverSlot <= EQ::invslot::CORPSE_END && serverSlot >= EQ::invslot::slotCursor) { UFSlot = serverSlot - 2; } - else if (serverSlot <= EQEmu::invbag::GENERAL_BAGS_8_END && serverSlot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::GENERAL_BAGS_8_END && serverSlot >= EQ::invbag::GENERAL_BAGS_BEGIN) { UFSlot = serverSlot + 11; } - else if (serverSlot <= EQEmu::invbag::CURSOR_BAG_END && serverSlot >= EQEmu::invbag::CURSOR_BAG_BEGIN) { + else if (serverSlot <= EQ::invbag::CURSOR_BAG_END && serverSlot >= EQ::invbag::CURSOR_BAG_BEGIN) { UFSlot = serverSlot - 9; } - else if (serverSlot <= EQEmu::invslot::TRIBUTE_END && serverSlot >= EQEmu::invslot::TRIBUTE_BEGIN) { + else if (serverSlot <= EQ::invslot::TRIBUTE_END && serverSlot >= EQ::invslot::TRIBUTE_BEGIN) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::GUILD_TRIBUTE_END && serverSlot >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN) { + else if (serverSlot <= EQ::invslot::GUILD_TRIBUTE_END && serverSlot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) { UFSlot = serverSlot; } - else if (serverSlot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + else if (serverSlot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::BANK_END && serverSlot >= EQEmu::invslot::BANK_BEGIN) { + else if (serverSlot <= EQ::invslot::BANK_END && serverSlot >= EQ::invslot::BANK_BEGIN) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invbag::BANK_BAGS_END && serverSlot >= EQEmu::invbag::BANK_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::BANK_BAGS_END && serverSlot >= EQ::invbag::BANK_BAGS_BEGIN) { UFSlot = serverSlot + 1; } - else if (serverSlot <= EQEmu::invslot::SHARED_BANK_END && serverSlot >= EQEmu::invslot::SHARED_BANK_BEGIN) { + else if (serverSlot <= EQ::invslot::SHARED_BANK_END && serverSlot >= EQ::invslot::SHARED_BANK_BEGIN) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invbag::SHARED_BANK_BAGS_END && serverSlot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::SHARED_BANK_BAGS_END && serverSlot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) { UFSlot = serverSlot + 1; } - else if (serverSlot <= EQEmu::invslot::TRADE_END && serverSlot >= EQEmu::invslot::TRADE_BEGIN) { + else if (serverSlot <= EQ::invslot::TRADE_END && serverSlot >= EQ::invslot::TRADE_BEGIN) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invbag::TRADE_BAGS_END && serverSlot >= EQEmu::invbag::TRADE_BAGS_BEGIN) { + else if (serverSlot <= EQ::invbag::TRADE_BAGS_END && serverSlot >= EQ::invbag::TRADE_BAGS_BEGIN) { UFSlot = serverSlot; } - else if (serverSlot <= EQEmu::invslot::WORLD_END && serverSlot >= EQEmu::invslot::WORLD_BEGIN) { + else if (serverSlot <= EQ::invslot::WORLD_END && serverSlot >= EQ::invslot::WORLD_BEGIN) { UFSlot = serverSlot; } @@ -4216,11 +4332,11 @@ namespace UF { uint32 UFSlot = invslot::SLOT_INVALID; - if (serverCorpseSlot <= EQEmu::invslot::slotGeneral8 && serverCorpseSlot >= EQEmu::invslot::slotGeneral1) { + if (serverCorpseSlot <= EQ::invslot::slotGeneral8 && serverCorpseSlot >= EQ::invslot::slotGeneral1) { UFSlot = serverCorpseSlot; } - else if (serverCorpseSlot <= EQEmu::invslot::CORPSE_END && serverCorpseSlot >= EQEmu::invslot::slotCursor) { + else if (serverCorpseSlot <= EQ::invslot::CORPSE_END && serverCorpseSlot >= EQ::invslot::slotCursor) { UFSlot = serverCorpseSlot - 2; } @@ -4231,7 +4347,7 @@ namespace UF static inline uint32 UFToServerSlot(uint32 ufSlot) { - uint32 ServerSlot = EQEmu::invslot::SLOT_INVALID; + uint32 ServerSlot = EQ::invslot::SLOT_INVALID; if (ufSlot <= invslot::slotGeneral8) { ServerSlot = ufSlot; @@ -4296,7 +4412,7 @@ namespace UF static inline uint32 UFToServerCorpseSlot(uint32 ufCorpseSlot) { - uint32 ServerSlot = EQEmu::invslot::SLOT_INVALID; + uint32 ServerSlot = EQ::invslot::SLOT_INVALID; if (ufCorpseSlot <= invslot::slotGeneral8 && ufCorpseSlot >= invslot::slotGeneral1) { ServerSlot = ufCorpseSlot; @@ -4313,7 +4429,7 @@ namespace UF static inline void ServerToUFSayLink(std::string& ufSayLink, const std::string& serverSayLink) { - if ((constants::SAY_LINK_BODY_SIZE == EQEmu::constants::SAY_LINK_BODY_SIZE) || (serverSayLink.find('\x12') == std::string::npos)) { + if ((constants::SAY_LINK_BODY_SIZE == EQ::constants::SAY_LINK_BODY_SIZE) || (serverSayLink.find('\x12') == std::string::npos)) { ufSayLink = serverSayLink; return; } @@ -4322,7 +4438,7 @@ namespace UF for (size_t segment_iter = 0; segment_iter < segments.size(); ++segment_iter) { if (segment_iter & 1) { - if (segments[segment_iter].length() <= EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (segments[segment_iter].length() <= EQ::constants::SAY_LINK_BODY_SIZE) { ufSayLink.append(segments[segment_iter]); // TODO: log size mismatch error continue; @@ -4353,7 +4469,7 @@ namespace UF static inline void UFToServerSayLink(std::string& serverSayLink, const std::string& ufSayLink) { - if ((EQEmu::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (ufSayLink.find('\x12') == std::string::npos)) { + if ((EQ::constants::SAY_LINK_BODY_SIZE == constants::SAY_LINK_BODY_SIZE) || (ufSayLink.find('\x12') == std::string::npos)) { serverSayLink = ufSayLink; return; } @@ -4387,92 +4503,92 @@ namespace UF } } - static inline spells::CastingSlot ServerToUFCastingSlot(EQEmu::spells::CastingSlot slot) + static inline spells::CastingSlot ServerToUFCastingSlot(EQ::spells::CastingSlot slot) { switch (slot) { - case EQEmu::spells::CastingSlot::Gem1: + case EQ::spells::CastingSlot::Gem1: return spells::CastingSlot::Gem1; - case EQEmu::spells::CastingSlot::Gem2: + case EQ::spells::CastingSlot::Gem2: return spells::CastingSlot::Gem2; - case EQEmu::spells::CastingSlot::Gem3: + case EQ::spells::CastingSlot::Gem3: return spells::CastingSlot::Gem3; - case EQEmu::spells::CastingSlot::Gem4: + case EQ::spells::CastingSlot::Gem4: return spells::CastingSlot::Gem4; - case EQEmu::spells::CastingSlot::Gem5: + case EQ::spells::CastingSlot::Gem5: return spells::CastingSlot::Gem5; - case EQEmu::spells::CastingSlot::Gem6: + case EQ::spells::CastingSlot::Gem6: return spells::CastingSlot::Gem6; - case EQEmu::spells::CastingSlot::Gem7: + case EQ::spells::CastingSlot::Gem7: return spells::CastingSlot::Gem7; - case EQEmu::spells::CastingSlot::Gem8: + case EQ::spells::CastingSlot::Gem8: return spells::CastingSlot::Gem8; - case EQEmu::spells::CastingSlot::Gem9: + case EQ::spells::CastingSlot::Gem9: return spells::CastingSlot::Gem9; - case EQEmu::spells::CastingSlot::Gem10: + case EQ::spells::CastingSlot::Gem10: return spells::CastingSlot::Gem10; - case EQEmu::spells::CastingSlot::Gem11: + case EQ::spells::CastingSlot::Gem11: return spells::CastingSlot::Gem11; - case EQEmu::spells::CastingSlot::Gem12: + case EQ::spells::CastingSlot::Gem12: return spells::CastingSlot::Gem12; - case EQEmu::spells::CastingSlot::Item: - case EQEmu::spells::CastingSlot::PotionBelt: + case EQ::spells::CastingSlot::Item: + case EQ::spells::CastingSlot::PotionBelt: return spells::CastingSlot::Item; - case EQEmu::spells::CastingSlot::Discipline: + case EQ::spells::CastingSlot::Discipline: return spells::CastingSlot::Discipline; - case EQEmu::spells::CastingSlot::AltAbility: + case EQ::spells::CastingSlot::AltAbility: return spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something return spells::CastingSlot::Discipline; } } - static inline EQEmu::spells::CastingSlot UFToServerCastingSlot(spells::CastingSlot slot) + static inline EQ::spells::CastingSlot UFToServerCastingSlot(spells::CastingSlot slot) { switch (slot) { case spells::CastingSlot::Gem1: - return EQEmu::spells::CastingSlot::Gem1; + return EQ::spells::CastingSlot::Gem1; case spells::CastingSlot::Gem2: - return EQEmu::spells::CastingSlot::Gem2; + return EQ::spells::CastingSlot::Gem2; case spells::CastingSlot::Gem3: - return EQEmu::spells::CastingSlot::Gem3; + return EQ::spells::CastingSlot::Gem3; case spells::CastingSlot::Gem4: - return EQEmu::spells::CastingSlot::Gem4; + return EQ::spells::CastingSlot::Gem4; case spells::CastingSlot::Gem5: - return EQEmu::spells::CastingSlot::Gem5; + return EQ::spells::CastingSlot::Gem5; case spells::CastingSlot::Gem6: - return EQEmu::spells::CastingSlot::Gem6; + return EQ::spells::CastingSlot::Gem6; case spells::CastingSlot::Gem7: - return EQEmu::spells::CastingSlot::Gem7; + return EQ::spells::CastingSlot::Gem7; case spells::CastingSlot::Gem8: - return EQEmu::spells::CastingSlot::Gem8; + return EQ::spells::CastingSlot::Gem8; case spells::CastingSlot::Gem9: - return EQEmu::spells::CastingSlot::Gem9; + return EQ::spells::CastingSlot::Gem9; case spells::CastingSlot::Gem10: - return EQEmu::spells::CastingSlot::Gem10; + return EQ::spells::CastingSlot::Gem10; case spells::CastingSlot::Gem11: - return EQEmu::spells::CastingSlot::Gem11; + return EQ::spells::CastingSlot::Gem11; case spells::CastingSlot::Gem12: - return EQEmu::spells::CastingSlot::Gem12; + return EQ::spells::CastingSlot::Gem12; case spells::CastingSlot::Discipline: - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; case spells::CastingSlot::Item: - return EQEmu::spells::CastingSlot::Item; + return EQ::spells::CastingSlot::Item; case spells::CastingSlot::AltAbility: - return EQEmu::spells::CastingSlot::AltAbility; + return EQ::spells::CastingSlot::AltAbility; default: // we shouldn't have any issues with other slots ... just return something - return EQEmu::spells::CastingSlot::Discipline; + return EQ::spells::CastingSlot::Discipline; } } static inline int ServerToUFBuffSlot(int index) { // we're a disc - if (index >= EQEmu::spells::LONG_BUFFS + EQEmu::spells::SHORT_BUFFS) - return index - EQEmu::spells::LONG_BUFFS - EQEmu::spells::SHORT_BUFFS + + if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS) + return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS + spells::LONG_BUFFS + spells::SHORT_BUFFS; // we're a song - if (index >= EQEmu::spells::LONG_BUFFS) - return index - EQEmu::spells::LONG_BUFFS + spells::LONG_BUFFS; + if (index >= EQ::spells::LONG_BUFFS) + return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } @@ -4481,11 +4597,11 @@ namespace UF { // we're a disc if (index >= spells::LONG_BUFFS + spells::SHORT_BUFFS) - return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQEmu::spells::LONG_BUFFS + - EQEmu::spells::SHORT_BUFFS; + return index - spells::LONG_BUFFS - spells::SHORT_BUFFS + EQ::spells::LONG_BUFFS + + EQ::spells::SHORT_BUFFS; // we're a song if (index >= spells::LONG_BUFFS) - return index - spells::LONG_BUFFS + EQEmu::spells::LONG_BUFFS; + return index - spells::LONG_BUFFS + EQ::spells::LONG_BUFFS; // we're a normal buff return index; // as long as we guard against bad slots server side, we should be fine } diff --git a/common/patches/uf.h b/common/patches/uf.h index c36d9e851..465f32e74 100644 --- a/common/patches/uf.h +++ b/common/patches/uf.h @@ -43,7 +43,7 @@ namespace UF protected: virtual std::string Describe() const; - virtual const EQEmu::versions::ClientVersion ClientVersion() const; + virtual const EQ::versions::ClientVersion ClientVersion() const; //magic macro to declare our opcode processors #include "ss_declare.h" diff --git a/common/patches/uf_limits.h b/common/patches/uf_limits.h index 429d57cd5..978699ed2 100644 --- a/common/patches/uf_limits.h +++ b/common/patches/uf_limits.h @@ -31,7 +31,7 @@ namespace UF const int16 INULL = 0; namespace inventory { - inline EQEmu::versions::ClientVersion GetInventoryRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::UF; } const bool ConcatenateInvTypeLimbo = true; @@ -43,7 +43,7 @@ namespace UF } /*inventory*/ namespace invtype { - inline EQEmu::versions::ClientVersion GetInvTypeRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::UF; } namespace enum_ { enum InventoryTypes : int16 { @@ -106,7 +106,7 @@ namespace UF } /*invtype*/ namespace invslot { - inline EQEmu::versions::ClientVersion GetInvSlotRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::UF; } namespace enum_ { enum InventorySlots : int16 { @@ -205,7 +205,7 @@ namespace UF } /*invslot*/ namespace invbag { - inline EQEmu::versions::ClientVersion GetInvBagRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::UF; } const int16 SLOT_INVALID = IINVALID; const int16 SLOT_BEGIN = INULL; @@ -237,7 +237,7 @@ namespace UF } /*invbag*/ namespace invaug { - inline EQEmu::versions::ClientVersion GetInvAugRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::UF; } const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_BEGIN = INULL; @@ -249,7 +249,7 @@ namespace UF } /*invaug*/ namespace item { - inline EQEmu::versions::ClientVersion GetItemRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::UF; } enum ItemPacketType : int { ItemPacketMerchant = 100, @@ -268,7 +268,7 @@ namespace UF } /*item*/ namespace profile { - inline EQEmu::versions::ClientVersion GetProfileRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::UF; } const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance @@ -280,11 +280,11 @@ namespace UF } /*profile*/ namespace constants { - inline EQEmu::versions::ClientVersion GetConstantsRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::UF; } - const EQEmu::expansions::Expansion EXPANSION = EQEmu::expansions::Expansion::UF; - const uint32 EXPANSION_BIT = EQEmu::expansions::bitUF; - const uint32 EXPANSIONS_MASK = EQEmu::expansions::maskUF; + const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::UF; + const uint32 EXPANSION_BIT = EQ::expansions::bitUF; + const uint32 EXPANSIONS_MASK = EQ::expansions::maskUF; const size_t CHARACTER_CREATION_LIMIT = 12; @@ -293,21 +293,21 @@ namespace UF } /*constants*/ namespace behavior { - inline EQEmu::versions::ClientVersion GetBehaviorRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::UF; } const bool CoinHasWeight = false; } /*behavior*/ namespace skills { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::UF; } - const size_t LastUsableSkill = EQEmu::skills::SkillTripleAttack; + const size_t LastUsableSkill = EQ::skills::SkillTripleAttack; } /*skills*/ namespace spells { - inline EQEmu::versions::ClientVersion GetSkillsRef() { return EQEmu::versions::ClientVersion::UF; } + inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::UF; } enum class CastingSlot : uint32 { Gem1 = 0, diff --git a/common/patches/uf_ops.h b/common/patches/uf_ops.h index 9d7742cf0..76b7e014b 100644 --- a/common/patches/uf_ops.h +++ b/common/patches/uf_ops.h @@ -38,13 +38,16 @@ E(OP_Damage) E(OP_DeleteCharge) E(OP_DeleteItem) E(OP_DisciplineUpdate) +E(OP_DzChooseZone) E(OP_DzCompass) E(OP_DzExpeditionEndsWarning) E(OP_DzExpeditionInfo) -E(OP_DzExpeditionList) -E(OP_DzJoinExpeditionConfirm) -E(OP_DzLeaderStatus) +E(OP_DzExpeditionInvite) +E(OP_DzExpeditionLockoutTimers) E(OP_DzMemberList) +E(OP_DzMemberListName) +E(OP_DzMemberListStatus) +E(OP_DzSetLeaderName) E(OP_Emote) E(OP_ExpansionInfo) E(OP_FormattedMessage) @@ -120,6 +123,12 @@ D(OP_ConsiderCorpse) D(OP_Consume) D(OP_Damage) D(OP_DeleteItem) +D(OP_DzAddPlayer) +D(OP_DzChooseZoneReply) +D(OP_DzExpeditionInviteResponse) +D(OP_DzMakeLeader) +D(OP_DzRemovePlayer) +D(OP_DzSwapPlayer) D(OP_Emote) D(OP_EnvDamage) D(OP_FaceChange) diff --git a/common/patches/uf_structs.h b/common/patches/uf_structs.h index b6eb414e1..6c1b4a4ed 100644 --- a/common/patches/uf_structs.h +++ b/common/patches/uf_structs.h @@ -149,7 +149,7 @@ struct TintProfile Tint_Struct Primary; Tint_Struct Secondary; }; - Tint_Struct Slot[EQEmu::textures::materialCount]; + Tint_Struct Slot[EQ::textures::materialCount]; }; }; @@ -178,7 +178,7 @@ struct TextureProfile Texture_Struct Primary; Texture_Struct Secondary; }; - Texture_Struct Slot[EQEmu::textures::materialCount]; + Texture_Struct Slot[EQ::textures::materialCount]; }; TextureProfile(); @@ -195,7 +195,7 @@ struct CharacterSelectEntry_Struct /*0000*/ uint8 Beard; // /*0001*/ uint8 HairColor; // /*0000*/ uint8 Face; // -/*0000*/ CharSelectEquip Equip[EQEmu::textures::materialCount]; +/*0000*/ CharSelectEquip Equip[EQ::textures::materialCount]; /*0000*/ uint32 PrimaryIDFile; // /*0000*/ uint32 SecondaryIDFile; // /*0000*/ uint8 Unknown15; // 0xff @@ -444,7 +444,11 @@ struct NewZone_Struct { /*0848*/ int32 unknown848; /*0852*/ uint16 zone_id; /*0854*/ uint16 zone_instance; -/*0856*/ char unknown856[20]; +/*0856*/ uint32 scriptNPCReceivedanItem; +/*0860*/ uint32 bCheck; // padded bool +/*0864*/ uint32 scriptIDSomething; +/*0868*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, -1 affects some collisions +/*0872*/ uint32 scriptIDSomething3; /*0876*/ uint32 SuspendBuffs; /*0880*/ uint32 unknown880; //seen 50 /*0884*/ uint32 unknown884; //seen 10 @@ -829,7 +833,7 @@ struct LeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -1751,7 +1755,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ uint32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ int8 success; // =0 client->server, =1 server->client, -X=specific error @@ -4215,8 +4219,8 @@ struct ItemQuaternaryBodyStruct int32 HealAmt; int32 SpellDmg; int32 Clairvoyance; - uint8 unknown18; //Power Source Capacity or evolve filename? - uint32 evolve_string; // Some String, but being evolution related is just a guess + int32 SubType; + uint8 evolve_string; // Some String, but being evolution related is just a guess uint8 unknown19; uint32 unknown20; // Bard Stuff? uint32 unknown21; @@ -4246,52 +4250,160 @@ struct VeteranReward /*012*/ VeteranRewardItem items[8]; }; -struct ExpeditionEntryHeader_Struct + +struct ExpeditionInvite_Struct { -/*000*/ uint32 unknown000; -/*000*/ uint32 number_of_entries; +/*000*/ uint32 client_id; // unique character id +/*004*/ uint32 unknown004; +/*008*/ char inviter_name[64]; +/*072*/ char expedition_name[128]; +/*200*/ uint8 swapping; // 0: adding 1: swapping +/*201*/ char swap_name[64]; // if swapping, swap name being removed +/*265*/ uint8 padding[3]; +/*268*/ uint16 dz_zone_id; // dz_id zone/instance pair, sent back in reply +/*270*/ uint16 dz_instance_id; }; -struct ExpeditionJoinPrompt_Struct +struct ExpeditionInviteResponse_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 unknown000; /*004*/ uint32 unknown004; -/*008*/ char player_name[64]; -/*072*/ char expedition_name[64]; +/*008*/ uint16 dz_zone_id; // dz_id pair sent in invite +/*010*/ uint16 dz_instance_id; +/*012*/ uint8 accepted; // 0: declined 1: accepted +/*013*/ uint8 swapping; // 0: adding 1: swapping (sent in invite) +/*014*/ char swap_name[64]; // swap name sent in invite +/*078*/ uint8 unknown078; // padding garbage? +/*079*/ uint8 unknown079; // padding garbage? +}; + +struct DynamicZoneInfo_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 assigned; // padded bool +/*012*/ uint32 max_players; +/*016*/ char dz_name[128]; +/*144*/ char leader_name[64]; +}; + +struct DynamicZoneMemberEntry_Struct +{ +/*000*/ char name[1]; // variable length, null terminated, max 0x40 (64) +/*000*/ uint8 online_status; // 0: unknown 1: Online, 2: Offline, 3: In Dynamic Zone, 4: Link Dead +}; + +struct DynamicZoneMemberList_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 member_count; // number of players in window +/*008*/ DynamicZoneMemberEntry_Struct members[0]; // variable length +}; + +struct DynamicZoneMemberListName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ uint32 add_name; // padded bool, 0: remove name, 1: add name with unknown status +/*012*/ char name[64]; +}; + +struct ExpeditionLockoutTimerEntry_Struct +{ +/*000*/ char expedition_name[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ uint32 seconds_remaining; +/*000*/ int32 event_type; // seen -1 (0xffffffff) for replay timers and 1 for event timers +/*000*/ char event_name[1]; // variable length, null terminated, max 0x100 (256) +}; + +struct ExpeditionLockoutTimers_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ ExpeditionLockoutTimerEntry_Struct timers[0]; +}; + +struct DynamicZoneLeaderName_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 unknown004; +/*008*/ char leader_name[64]; +}; + +struct ExpeditionCommand_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char name[64]; +}; + +struct ExpeditionCommandSwap_Struct +{ +/*000*/ uint32 unknown000; +/*004*/ uint32 unknown004; +/*008*/ char add_player_name[64]; // swap to (player must confirm) +/*072*/ char rem_player_name[64]; // swap from }; struct ExpeditionExpireWarning { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 unknown004; /*008*/ uint32 minutes_remaining; }; -struct ExpeditionInfo_Struct +struct DynamicZoneCompassEntry_Struct { -/*000*/ uint32 clientid; -/*004*/ uint32 unknown004; +/*000*/ uint16 dz_zone_id; // target dz id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 dz_type; // 1: Expedition, 2: Tutorial (purple), 3: Task, 4: Mission, 5: Quest (green) /*008*/ uint32 unknown008; -/*012*/ uint32 max_players; -/*016*/ char expedition_name[128]; -/*142*/ char leader_name[64]; -}; - -struct ExpeditionCompassEntry_Struct -{ -/*000*/ float unknown000; //seen *((uint32*)) = 1584791871 -/*004*/ uint32 enabled; //guess -/*008*/ uint32 unknown008; //seen 1019 /*012*/ float y; /*016*/ float x; /*020*/ float z; }; -struct ExpeditionCompass_Struct +struct DynamicZoneCompass_Struct { -/*000*/ uint32 clientid; +/*000*/ uint32 client_id; /*004*/ uint32 count; -/*008*/ ExpeditionCompassEntry_Struct entries[0]; +/*008*/ DynamicZoneCompassEntry_Struct entries[0]; +}; + +struct DynamicZoneChooseZoneEntry_Struct +{ +/*000*/ uint16 dz_zone_id; // dz_id pair +/*002*/ uint16 dz_instance_id; +/*004*/ uint32 unknown_id1; // sent back in reply +/*008*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest -- sent back in reply +/*012*/ uint32 unknown_id2; // possibly an id based on dz type, for expeditions this was same as dz_id (zone|instance) but task dz was different +/*016*/ char description[1]; // variable length, null terminated, max 0x80 (128) +/*000*/ char leader_name[1]; // variable length, null terminated, max 0x40 (64) +}; + +struct DynamicZoneChooseZone_Struct +{ +/*000*/ uint32 client_id; +/*004*/ uint32 count; +/*008*/ DynamicZoneChooseZoneEntry_Struct choices[0]; +}; + +struct DynamicZoneChooseZoneReply_Struct +{ +/*000*/ uint32 unknown000; // ff ff ff ff +/*004*/ uint32 unknown004; // seen 69 00 00 00 +/*008*/ uint32 unknown008; // ff ff ff ff +/*012*/ uint32 unknown_id1; // from choose zone entry message +/*016*/ uint16 dz_zone_id; // dz_id pair +/*018*/ uint16 dz_instance_id; +/*020*/ uint32 dz_type; // 1: Expedition, 2: Tutorial, 3: Task, 4: Mission, 5: Quest +/*024*/ uint32 unknown_id2; // from choose zone entry message +/*028*/ uint32 unknown028; // 00 00 00 00 +/*032*/ uint32 unknown032; // always same as unknown044 +/*036*/ uint32 unknown036; +/*040*/ uint32 unknown040; +/*044*/ uint32 unknown044; // always same as unknown032 +/*048*/ uint32 unknown048; // seen 01 00 00 00 and 02 00 00 00 }; struct AltCurrencySelectItem_Struct { diff --git a/common/platform.cpp b/common/platform.cpp index b67267155..e5481c339 100644 --- a/common/platform.cpp +++ b/common/platform.cpp @@ -46,15 +46,15 @@ std::string GetPlatformName() { switch (GetExecutablePlatformInt()) { case EQEmuExePlatform::ExePlatformWorld: - return "WorldServer"; + return "World"; case EQEmuExePlatform::ExePlatformQueryServ: - return "QueryServer"; + return "QS"; case EQEmuExePlatform::ExePlatformZone: - return "ZoneServer"; + return "Zone"; case EQEmuExePlatform::ExePlatformUCS: return "UCS"; case EQEmuExePlatform::ExePlatformLogin: - return "LoginServer"; + return "Login"; case EQEmuExePlatform::ExePlatformSocket_Server: return "SocketServer"; case EQEmuExePlatform::ExePlatformSharedMemory: @@ -70,4 +70,4 @@ std::string GetPlatformName() default: return ""; } -} \ No newline at end of file +} diff --git a/common/proc_launcher.h b/common/proc_launcher.h index 6289579cd..23b7e523c 100644 --- a/common/proc_launcher.h +++ b/common/proc_launcher.h @@ -24,6 +24,10 @@ #include #include +#ifdef __FreeBSD__ +#include +#endif + //I forced this object to become a singleton because it registers its //signal handler for UNIX class ProcLauncher { diff --git a/common/profanity_manager.cpp b/common/profanity_manager.cpp index 70817576f..005fc4909 100644 --- a/common/profanity_manager.cpp +++ b/common/profanity_manager.cpp @@ -28,7 +28,7 @@ static std::list profanity_list; static bool update_originator_flag = false; -bool EQEmu::ProfanityManager::LoadProfanityList(DBcore *db) { +bool EQ::ProfanityManager::LoadProfanityList(DBcore *db) { if (update_originator_flag == true) { update_originator_flag = false; return true; @@ -40,7 +40,7 @@ bool EQEmu::ProfanityManager::LoadProfanityList(DBcore *db) { return true; } -bool EQEmu::ProfanityManager::UpdateProfanityList(DBcore *db) { +bool EQ::ProfanityManager::UpdateProfanityList(DBcore *db) { if (!load_database_entries(db)) return false; @@ -49,7 +49,7 @@ bool EQEmu::ProfanityManager::UpdateProfanityList(DBcore *db) { return true; } -bool EQEmu::ProfanityManager::DeleteProfanityList(DBcore *db) { +bool EQ::ProfanityManager::DeleteProfanityList(DBcore *db) { if (!clear_database_entries(db)) return false; @@ -58,7 +58,7 @@ bool EQEmu::ProfanityManager::DeleteProfanityList(DBcore *db) { return true; } -bool EQEmu::ProfanityManager::AddProfanity(DBcore *db, const char *profanity) { +bool EQ::ProfanityManager::AddProfanity(DBcore *db, const char *profanity) { if (!db || !profanity) return false; @@ -86,7 +86,7 @@ bool EQEmu::ProfanityManager::AddProfanity(DBcore *db, const char *profanity) { return true; } -bool EQEmu::ProfanityManager::RemoveProfanity(DBcore *db, const char *profanity) { +bool EQ::ProfanityManager::RemoveProfanity(DBcore *db, const char *profanity) { if (!db || !profanity) return false; @@ -111,7 +111,7 @@ bool EQEmu::ProfanityManager::RemoveProfanity(DBcore *db, const char *profanity) return true; } -void EQEmu::ProfanityManager::RedactMessage(char *message) { +void EQ::ProfanityManager::RedactMessage(char *message) { if (!message) return; @@ -142,7 +142,7 @@ void EQEmu::ProfanityManager::RedactMessage(char *message) { } } -void EQEmu::ProfanityManager::RedactMessage(std::string &message) { +void EQ::ProfanityManager::RedactMessage(std::string &message) { if (message.length() < REDACTION_LENGTH_MIN || message.length() >= 4096) return; @@ -169,14 +169,14 @@ void EQEmu::ProfanityManager::RedactMessage(std::string &message) { } } -bool EQEmu::ProfanityManager::ContainsCensoredLanguage(const char *message) { +bool EQ::ProfanityManager::ContainsCensoredLanguage(const char *message) { if (!message) return false; return ContainsCensoredLanguage(std::string(message)); } -bool EQEmu::ProfanityManager::ContainsCensoredLanguage(const std::string &message) { +bool EQ::ProfanityManager::ContainsCensoredLanguage(const std::string &message) { if (message.length() < REDACTION_LENGTH_MIN || message.length() >= 4096) return false; @@ -192,15 +192,15 @@ bool EQEmu::ProfanityManager::ContainsCensoredLanguage(const std::string &messag return false; } -const std::list &EQEmu::ProfanityManager::GetProfanityList() { +const std::list &EQ::ProfanityManager::GetProfanityList() { return profanity_list; } -bool EQEmu::ProfanityManager::IsCensorshipActive() { +bool EQ::ProfanityManager::IsCensorshipActive() { return (profanity_list.size() != 0); } -bool EQEmu::ProfanityManager::load_database_entries(DBcore *db) { +bool EQ::ProfanityManager::load_database_entries(DBcore *db) { if (!db) return false; @@ -223,7 +223,7 @@ bool EQEmu::ProfanityManager::load_database_entries(DBcore *db) { return true; } -bool EQEmu::ProfanityManager::clear_database_entries(DBcore *db) { +bool EQ::ProfanityManager::clear_database_entries(DBcore *db) { if (!db) return false; @@ -237,7 +237,7 @@ bool EQEmu::ProfanityManager::clear_database_entries(DBcore *db) { return true; } -bool EQEmu::ProfanityManager::check_for_existing_entry(const char *profanity) { +bool EQ::ProfanityManager::check_for_existing_entry(const char *profanity) { if (!profanity) return false; diff --git a/common/profanity_manager.h b/common/profanity_manager.h index fa601f0f0..a1ad93a86 100644 --- a/common/profanity_manager.h +++ b/common/profanity_manager.h @@ -26,7 +26,7 @@ class DBcore; -namespace EQEmu +namespace EQ { class ProfanityManager { public: diff --git a/common/random.h b/common/random.h index 0c877bfea..203755efd 100644 --- a/common/random.h +++ b/common/random.h @@ -32,7 +32,7 @@ * Eventually this should be derived from an abstract base class */ -namespace EQEmu { +namespace EQ { class Random { public: // AKA old MakeRandomInt @@ -80,7 +80,7 @@ namespace EQEmu { { static_assert(std::is_same::iterator_category>::value, - "EQEmu::Random::Shuffle requires random access iterators"); + "EQ::Random::Shuffle requires random access iterators"); std::shuffle(first, last, m_gen); } diff --git a/common/repositories/aa_ability_repository.h b/common/repositories/aa_ability_repository.h new file mode 100644 index 000000000..cf452a7d0 --- /dev/null +++ b/common/repositories/aa_ability_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_AA_ABILITY_REPOSITORY_H +#define EQEMU_AA_ABILITY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_aa_ability_repository.h" + +class AaAbilityRepository: public BaseAaAbilityRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AaAbilityRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AaAbilityRepository::GetWhereNeverExpires() + * AaAbilityRepository::GetWhereXAndY() + * AaAbilityRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_AA_ABILITY_REPOSITORY_H diff --git a/common/repositories/aa_rank_effects_repository.h b/common/repositories/aa_rank_effects_repository.h new file mode 100644 index 000000000..7242e8f4a --- /dev/null +++ b/common/repositories/aa_rank_effects_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_AA_RANK_EFFECTS_REPOSITORY_H +#define EQEMU_AA_RANK_EFFECTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_aa_rank_effects_repository.h" + +class AaRankEffectsRepository: public BaseAaRankEffectsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AaRankEffectsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AaRankEffectsRepository::GetWhereNeverExpires() + * AaRankEffectsRepository::GetWhereXAndY() + * AaRankEffectsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_AA_RANK_EFFECTS_REPOSITORY_H diff --git a/common/repositories/aa_rank_prereqs_repository.h b/common/repositories/aa_rank_prereqs_repository.h new file mode 100644 index 000000000..cf0055870 --- /dev/null +++ b/common/repositories/aa_rank_prereqs_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_AA_RANK_PREREQS_REPOSITORY_H +#define EQEMU_AA_RANK_PREREQS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_aa_rank_prereqs_repository.h" + +class AaRankPrereqsRepository: public BaseAaRankPrereqsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AaRankPrereqsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AaRankPrereqsRepository::GetWhereNeverExpires() + * AaRankPrereqsRepository::GetWhereXAndY() + * AaRankPrereqsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_AA_RANK_PREREQS_REPOSITORY_H diff --git a/common/repositories/aa_ranks_repository.h b/common/repositories/aa_ranks_repository.h new file mode 100644 index 000000000..64ac64c84 --- /dev/null +++ b/common/repositories/aa_ranks_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_AA_RANKS_REPOSITORY_H +#define EQEMU_AA_RANKS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_aa_ranks_repository.h" + +class AaRanksRepository: public BaseAaRanksRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AaRanksRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AaRanksRepository::GetWhereNeverExpires() + * AaRanksRepository::GetWhereXAndY() + * AaRanksRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_AA_RANKS_REPOSITORY_H diff --git a/common/repositories/account_flags_repository.h b/common/repositories/account_flags_repository.h new file mode 100644 index 000000000..12614e860 --- /dev/null +++ b/common/repositories/account_flags_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ACCOUNT_FLAGS_REPOSITORY_H +#define EQEMU_ACCOUNT_FLAGS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_account_flags_repository.h" + +class AccountFlagsRepository: public BaseAccountFlagsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AccountFlagsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AccountFlagsRepository::GetWhereNeverExpires() + * AccountFlagsRepository::GetWhereXAndY() + * AccountFlagsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ACCOUNT_FLAGS_REPOSITORY_H diff --git a/common/repositories/account_ip_repository.h b/common/repositories/account_ip_repository.h new file mode 100644 index 000000000..50f10f168 --- /dev/null +++ b/common/repositories/account_ip_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ACCOUNT_IP_REPOSITORY_H +#define EQEMU_ACCOUNT_IP_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_account_ip_repository.h" + +class AccountIpRepository: public BaseAccountIpRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AccountIpRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AccountIpRepository::GetWhereNeverExpires() + * AccountIpRepository::GetWhereXAndY() + * AccountIpRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ACCOUNT_IP_REPOSITORY_H diff --git a/common/repositories/account_repository.h b/common/repositories/account_repository.h new file mode 100644 index 000000000..433be1b44 --- /dev/null +++ b/common/repositories/account_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ACCOUNT_REPOSITORY_H +#define EQEMU_ACCOUNT_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_account_repository.h" + +class AccountRepository: public BaseAccountRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AccountRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AccountRepository::GetWhereNeverExpires() + * AccountRepository::GetWhereXAndY() + * AccountRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ACCOUNT_REPOSITORY_H diff --git a/common/repositories/account_rewards_repository.h b/common/repositories/account_rewards_repository.h new file mode 100644 index 000000000..16e1a1a19 --- /dev/null +++ b/common/repositories/account_rewards_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ACCOUNT_REWARDS_REPOSITORY_H +#define EQEMU_ACCOUNT_REWARDS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_account_rewards_repository.h" + +class AccountRewardsRepository: public BaseAccountRewardsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AccountRewardsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AccountRewardsRepository::GetWhereNeverExpires() + * AccountRewardsRepository::GetWhereXAndY() + * AccountRewardsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ACCOUNT_REWARDS_REPOSITORY_H diff --git a/common/repositories/adventure_details_repository.h b/common/repositories/adventure_details_repository.h new file mode 100644 index 000000000..c616ccf0d --- /dev/null +++ b/common/repositories/adventure_details_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ADVENTURE_DETAILS_REPOSITORY_H +#define EQEMU_ADVENTURE_DETAILS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_adventure_details_repository.h" + +class AdventureDetailsRepository: public BaseAdventureDetailsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AdventureDetailsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AdventureDetailsRepository::GetWhereNeverExpires() + * AdventureDetailsRepository::GetWhereXAndY() + * AdventureDetailsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ADVENTURE_DETAILS_REPOSITORY_H diff --git a/common/repositories/adventure_members_repository.h b/common/repositories/adventure_members_repository.h new file mode 100644 index 000000000..84a18c14a --- /dev/null +++ b/common/repositories/adventure_members_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ADVENTURE_MEMBERS_REPOSITORY_H +#define EQEMU_ADVENTURE_MEMBERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_adventure_members_repository.h" + +class AdventureMembersRepository: public BaseAdventureMembersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AdventureMembersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AdventureMembersRepository::GetWhereNeverExpires() + * AdventureMembersRepository::GetWhereXAndY() + * AdventureMembersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ADVENTURE_MEMBERS_REPOSITORY_H diff --git a/common/repositories/adventure_stats_repository.h b/common/repositories/adventure_stats_repository.h new file mode 100644 index 000000000..6ad1c3fe6 --- /dev/null +++ b/common/repositories/adventure_stats_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ADVENTURE_STATS_REPOSITORY_H +#define EQEMU_ADVENTURE_STATS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_adventure_stats_repository.h" + +class AdventureStatsRepository: public BaseAdventureStatsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AdventureStatsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AdventureStatsRepository::GetWhereNeverExpires() + * AdventureStatsRepository::GetWhereXAndY() + * AdventureStatsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ADVENTURE_STATS_REPOSITORY_H diff --git a/common/repositories/adventure_template_entry_flavor_repository.h b/common/repositories/adventure_template_entry_flavor_repository.h new file mode 100644 index 000000000..8d9ae5406 --- /dev/null +++ b/common/repositories/adventure_template_entry_flavor_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H +#define EQEMU_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_adventure_template_entry_flavor_repository.h" + +class AdventureTemplateEntryFlavorRepository: public BaseAdventureTemplateEntryFlavorRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AdventureTemplateEntryFlavorRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AdventureTemplateEntryFlavorRepository::GetWhereNeverExpires() + * AdventureTemplateEntryFlavorRepository::GetWhereXAndY() + * AdventureTemplateEntryFlavorRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H diff --git a/common/repositories/adventure_template_entry_repository.h b/common/repositories/adventure_template_entry_repository.h new file mode 100644 index 000000000..756ddf417 --- /dev/null +++ b/common/repositories/adventure_template_entry_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H +#define EQEMU_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_adventure_template_entry_repository.h" + +class AdventureTemplateEntryRepository: public BaseAdventureTemplateEntryRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AdventureTemplateEntryRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AdventureTemplateEntryRepository::GetWhereNeverExpires() + * AdventureTemplateEntryRepository::GetWhereXAndY() + * AdventureTemplateEntryRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H diff --git a/common/repositories/adventure_template_repository.h b/common/repositories/adventure_template_repository.h new file mode 100644 index 000000000..b284670ee --- /dev/null +++ b/common/repositories/adventure_template_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ADVENTURE_TEMPLATE_REPOSITORY_H +#define EQEMU_ADVENTURE_TEMPLATE_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_adventure_template_repository.h" + +class AdventureTemplateRepository: public BaseAdventureTemplateRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AdventureTemplateRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AdventureTemplateRepository::GetWhereNeverExpires() + * AdventureTemplateRepository::GetWhereXAndY() + * AdventureTemplateRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ADVENTURE_TEMPLATE_REPOSITORY_H diff --git a/common/repositories/alternate_currency_repository.h b/common/repositories/alternate_currency_repository.h new file mode 100644 index 000000000..05b21a755 --- /dev/null +++ b/common/repositories/alternate_currency_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ALTERNATE_CURRENCY_REPOSITORY_H +#define EQEMU_ALTERNATE_CURRENCY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_alternate_currency_repository.h" + +class AlternateCurrencyRepository: public BaseAlternateCurrencyRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AlternateCurrencyRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AlternateCurrencyRepository::GetWhereNeverExpires() + * AlternateCurrencyRepository::GetWhereXAndY() + * AlternateCurrencyRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ALTERNATE_CURRENCY_REPOSITORY_H diff --git a/common/repositories/auras_repository.h b/common/repositories/auras_repository.h new file mode 100644 index 000000000..bacfd0be9 --- /dev/null +++ b/common/repositories/auras_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_AURAS_REPOSITORY_H +#define EQEMU_AURAS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_auras_repository.h" + +class AurasRepository: public BaseAurasRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * AurasRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * AurasRepository::GetWhereNeverExpires() + * AurasRepository::GetWhereXAndY() + * AurasRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_AURAS_REPOSITORY_H diff --git a/common/repositories/base/base_aa_ability_repository.h b/common/repositories/base/base_aa_ability_repository.h new file mode 100644 index 000000000..fbf16f0ba --- /dev/null +++ b/common/repositories/base/base_aa_ability_repository.h @@ -0,0 +1,401 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_AA_ABILITY_REPOSITORY_H +#define EQEMU_BASE_AA_ABILITY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAaAbilityRepository { +public: + struct AaAbility { + int id; + std::string name; + int category; + int classes; + int races; + int drakkin_heritage; + int deities; + int status; + int type; + int charges; + int grant_only; + int first_rank_id; + int enabled; + int reset_on_death; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "category", + "classes", + "races", + "drakkin_heritage", + "deities", + "status", + "type", + "charges", + "grant_only", + "first_rank_id", + "enabled", + "reset_on_death", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("aa_ability"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AaAbility NewEntity() + { + AaAbility entry{}; + + entry.id = 0; + entry.name = ""; + entry.category = -1; + entry.classes = 131070; + entry.races = 65535; + entry.drakkin_heritage = 127; + entry.deities = 131071; + entry.status = 0; + entry.type = 0; + entry.charges = 0; + entry.grant_only = 0; + entry.first_rank_id = -1; + entry.enabled = 1; + entry.reset_on_death = 0; + + return entry; + } + + static AaAbility GetAaAbilityEntry( + const std::vector &aa_abilitys, + int aa_ability_id + ) + { + for (auto &aa_ability : aa_abilitys) { + if (aa_ability.id == aa_ability_id) { + return aa_ability; + } + } + + return NewEntity(); + } + + static AaAbility FindOne( + Database& db, + int aa_ability_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + aa_ability_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AaAbility entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.category = atoi(row[2]); + entry.classes = atoi(row[3]); + entry.races = atoi(row[4]); + entry.drakkin_heritage = atoi(row[5]); + entry.deities = atoi(row[6]); + entry.status = atoi(row[7]); + entry.type = atoi(row[8]); + entry.charges = atoi(row[9]); + entry.grant_only = atoi(row[10]); + entry.first_rank_id = atoi(row[11]); + entry.enabled = atoi(row[12]); + entry.reset_on_death = atoi(row[13]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int aa_ability_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + aa_ability_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AaAbility aa_ability_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(aa_ability_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(aa_ability_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(aa_ability_entry.category)); + update_values.push_back(columns[3] + " = " + std::to_string(aa_ability_entry.classes)); + update_values.push_back(columns[4] + " = " + std::to_string(aa_ability_entry.races)); + update_values.push_back(columns[5] + " = " + std::to_string(aa_ability_entry.drakkin_heritage)); + update_values.push_back(columns[6] + " = " + std::to_string(aa_ability_entry.deities)); + update_values.push_back(columns[7] + " = " + std::to_string(aa_ability_entry.status)); + update_values.push_back(columns[8] + " = " + std::to_string(aa_ability_entry.type)); + update_values.push_back(columns[9] + " = " + std::to_string(aa_ability_entry.charges)); + update_values.push_back(columns[10] + " = " + std::to_string(aa_ability_entry.grant_only)); + update_values.push_back(columns[11] + " = " + std::to_string(aa_ability_entry.first_rank_id)); + update_values.push_back(columns[12] + " = " + std::to_string(aa_ability_entry.enabled)); + update_values.push_back(columns[13] + " = " + std::to_string(aa_ability_entry.reset_on_death)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + aa_ability_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AaAbility InsertOne( + Database& db, + AaAbility aa_ability_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_ability_entry.id)); + insert_values.push_back("'" + EscapeString(aa_ability_entry.name) + "'"); + insert_values.push_back(std::to_string(aa_ability_entry.category)); + insert_values.push_back(std::to_string(aa_ability_entry.classes)); + insert_values.push_back(std::to_string(aa_ability_entry.races)); + insert_values.push_back(std::to_string(aa_ability_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(aa_ability_entry.deities)); + insert_values.push_back(std::to_string(aa_ability_entry.status)); + insert_values.push_back(std::to_string(aa_ability_entry.type)); + insert_values.push_back(std::to_string(aa_ability_entry.charges)); + insert_values.push_back(std::to_string(aa_ability_entry.grant_only)); + insert_values.push_back(std::to_string(aa_ability_entry.first_rank_id)); + insert_values.push_back(std::to_string(aa_ability_entry.enabled)); + insert_values.push_back(std::to_string(aa_ability_entry.reset_on_death)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + aa_ability_entry.id = results.LastInsertedID(); + return aa_ability_entry; + } + + aa_ability_entry = NewEntity(); + + return aa_ability_entry; + } + + static int InsertMany( + Database& db, + std::vector aa_ability_entries + ) + { + std::vector insert_chunks; + + for (auto &aa_ability_entry: aa_ability_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_ability_entry.id)); + insert_values.push_back("'" + EscapeString(aa_ability_entry.name) + "'"); + insert_values.push_back(std::to_string(aa_ability_entry.category)); + insert_values.push_back(std::to_string(aa_ability_entry.classes)); + insert_values.push_back(std::to_string(aa_ability_entry.races)); + insert_values.push_back(std::to_string(aa_ability_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(aa_ability_entry.deities)); + insert_values.push_back(std::to_string(aa_ability_entry.status)); + insert_values.push_back(std::to_string(aa_ability_entry.type)); + insert_values.push_back(std::to_string(aa_ability_entry.charges)); + insert_values.push_back(std::to_string(aa_ability_entry.grant_only)); + insert_values.push_back(std::to_string(aa_ability_entry.first_rank_id)); + insert_values.push_back(std::to_string(aa_ability_entry.enabled)); + insert_values.push_back(std::to_string(aa_ability_entry.reset_on_death)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaAbility entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.category = atoi(row[2]); + entry.classes = atoi(row[3]); + entry.races = atoi(row[4]); + entry.drakkin_heritage = atoi(row[5]); + entry.deities = atoi(row[6]); + entry.status = atoi(row[7]); + entry.type = atoi(row[8]); + entry.charges = atoi(row[9]); + entry.grant_only = atoi(row[10]); + entry.first_rank_id = atoi(row[11]); + entry.enabled = atoi(row[12]); + entry.reset_on_death = atoi(row[13]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaAbility entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.category = atoi(row[2]); + entry.classes = atoi(row[3]); + entry.races = atoi(row[4]); + entry.drakkin_heritage = atoi(row[5]); + entry.deities = atoi(row[6]); + entry.status = atoi(row[7]); + entry.type = atoi(row[8]); + entry.charges = atoi(row[9]); + entry.grant_only = atoi(row[10]); + entry.first_rank_id = atoi(row[11]); + entry.enabled = atoi(row[12]); + entry.reset_on_death = atoi(row[13]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_AA_ABILITY_REPOSITORY_H diff --git a/common/repositories/base/base_aa_rank_effects_repository.h b/common/repositories/base/base_aa_rank_effects_repository.h new file mode 100644 index 000000000..fa0eebcd1 --- /dev/null +++ b/common/repositories/base/base_aa_rank_effects_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H +#define EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAaRankEffectsRepository { +public: + struct AaRankEffects { + int rank_id; + int slot; + int effect_id; + int base1; + int base2; + }; + + static std::string PrimaryKey() + { + return std::string("rank_id"); + } + + static std::vector Columns() + { + return { + "rank_id", + "slot", + "effect_id", + "base1", + "base2", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("aa_rank_effects"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AaRankEffects NewEntity() + { + AaRankEffects entry{}; + + entry.rank_id = 0; + entry.slot = 1; + entry.effect_id = 0; + entry.base1 = 0; + entry.base2 = 0; + + return entry; + } + + static AaRankEffects GetAaRankEffectsEntry( + const std::vector &aa_rank_effectss, + int aa_rank_effects_id + ) + { + for (auto &aa_rank_effects : aa_rank_effectss) { + if (aa_rank_effects.rank_id == aa_rank_effects_id) { + return aa_rank_effects; + } + } + + return NewEntity(); + } + + static AaRankEffects FindOne( + Database& db, + int aa_rank_effects_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + aa_rank_effects_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AaRankEffects entry{}; + + entry.rank_id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.effect_id = atoi(row[2]); + entry.base1 = atoi(row[3]); + entry.base2 = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int aa_rank_effects_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + aa_rank_effects_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AaRankEffects aa_rank_effects_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(aa_rank_effects_entry.rank_id)); + update_values.push_back(columns[1] + " = " + std::to_string(aa_rank_effects_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(aa_rank_effects_entry.effect_id)); + update_values.push_back(columns[3] + " = " + std::to_string(aa_rank_effects_entry.base1)); + update_values.push_back(columns[4] + " = " + std::to_string(aa_rank_effects_entry.base2)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + aa_rank_effects_entry.rank_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AaRankEffects InsertOne( + Database& db, + AaRankEffects aa_rank_effects_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_rank_effects_entry.rank_id)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.slot)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.effect_id)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.base1)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.base2)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + aa_rank_effects_entry.rank_id = results.LastInsertedID(); + return aa_rank_effects_entry; + } + + aa_rank_effects_entry = NewEntity(); + + return aa_rank_effects_entry; + } + + static int InsertMany( + Database& db, + std::vector aa_rank_effects_entries + ) + { + std::vector insert_chunks; + + for (auto &aa_rank_effects_entry: aa_rank_effects_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_rank_effects_entry.rank_id)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.slot)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.effect_id)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.base1)); + insert_values.push_back(std::to_string(aa_rank_effects_entry.base2)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaRankEffects entry{}; + + entry.rank_id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.effect_id = atoi(row[2]); + entry.base1 = atoi(row[3]); + entry.base2 = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaRankEffects entry{}; + + entry.rank_id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.effect_id = atoi(row[2]); + entry.base1 = atoi(row[3]); + entry.base2 = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H diff --git a/common/repositories/base/base_aa_rank_prereqs_repository.h b/common/repositories/base/base_aa_rank_prereqs_repository.h new file mode 100644 index 000000000..04b1a0a38 --- /dev/null +++ b/common/repositories/base/base_aa_rank_prereqs_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H +#define EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAaRankPrereqsRepository { +public: + struct AaRankPrereqs { + int rank_id; + int aa_id; + int points; + }; + + static std::string PrimaryKey() + { + return std::string("rank_id"); + } + + static std::vector Columns() + { + return { + "rank_id", + "aa_id", + "points", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("aa_rank_prereqs"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AaRankPrereqs NewEntity() + { + AaRankPrereqs entry{}; + + entry.rank_id = 0; + entry.aa_id = 0; + entry.points = 0; + + return entry; + } + + static AaRankPrereqs GetAaRankPrereqsEntry( + const std::vector &aa_rank_prereqss, + int aa_rank_prereqs_id + ) + { + for (auto &aa_rank_prereqs : aa_rank_prereqss) { + if (aa_rank_prereqs.rank_id == aa_rank_prereqs_id) { + return aa_rank_prereqs; + } + } + + return NewEntity(); + } + + static AaRankPrereqs FindOne( + Database& db, + int aa_rank_prereqs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + aa_rank_prereqs_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AaRankPrereqs entry{}; + + entry.rank_id = atoi(row[0]); + entry.aa_id = atoi(row[1]); + entry.points = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int aa_rank_prereqs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + aa_rank_prereqs_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AaRankPrereqs aa_rank_prereqs_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(aa_rank_prereqs_entry.rank_id)); + update_values.push_back(columns[1] + " = " + std::to_string(aa_rank_prereqs_entry.aa_id)); + update_values.push_back(columns[2] + " = " + std::to_string(aa_rank_prereqs_entry.points)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + aa_rank_prereqs_entry.rank_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AaRankPrereqs InsertOne( + Database& db, + AaRankPrereqs aa_rank_prereqs_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_rank_prereqs_entry.rank_id)); + insert_values.push_back(std::to_string(aa_rank_prereqs_entry.aa_id)); + insert_values.push_back(std::to_string(aa_rank_prereqs_entry.points)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + aa_rank_prereqs_entry.rank_id = results.LastInsertedID(); + return aa_rank_prereqs_entry; + } + + aa_rank_prereqs_entry = NewEntity(); + + return aa_rank_prereqs_entry; + } + + static int InsertMany( + Database& db, + std::vector aa_rank_prereqs_entries + ) + { + std::vector insert_chunks; + + for (auto &aa_rank_prereqs_entry: aa_rank_prereqs_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_rank_prereqs_entry.rank_id)); + insert_values.push_back(std::to_string(aa_rank_prereqs_entry.aa_id)); + insert_values.push_back(std::to_string(aa_rank_prereqs_entry.points)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaRankPrereqs entry{}; + + entry.rank_id = atoi(row[0]); + entry.aa_id = atoi(row[1]); + entry.points = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaRankPrereqs entry{}; + + entry.rank_id = atoi(row[0]); + entry.aa_id = atoi(row[1]); + entry.points = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H diff --git a/common/repositories/base/base_aa_ranks_repository.h b/common/repositories/base/base_aa_ranks_repository.h new file mode 100644 index 000000000..8145e3e96 --- /dev/null +++ b/common/repositories/base/base_aa_ranks_repository.h @@ -0,0 +1,392 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_AA_RANKS_REPOSITORY_H +#define EQEMU_BASE_AA_RANKS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAaRanksRepository { +public: + struct AaRanks { + int id; + int upper_hotkey_sid; + int lower_hotkey_sid; + int title_sid; + int desc_sid; + int cost; + int level_req; + int spell; + int spell_type; + int recast_time; + int expansion; + int prev_id; + int next_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "upper_hotkey_sid", + "lower_hotkey_sid", + "title_sid", + "desc_sid", + "cost", + "level_req", + "spell", + "spell_type", + "recast_time", + "expansion", + "prev_id", + "next_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("aa_ranks"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AaRanks NewEntity() + { + AaRanks entry{}; + + entry.id = 0; + entry.upper_hotkey_sid = -1; + entry.lower_hotkey_sid = -1; + entry.title_sid = -1; + entry.desc_sid = -1; + entry.cost = 1; + entry.level_req = 51; + entry.spell = -1; + entry.spell_type = 0; + entry.recast_time = 0; + entry.expansion = 0; + entry.prev_id = -1; + entry.next_id = -1; + + return entry; + } + + static AaRanks GetAaRanksEntry( + const std::vector &aa_rankss, + int aa_ranks_id + ) + { + for (auto &aa_ranks : aa_rankss) { + if (aa_ranks.id == aa_ranks_id) { + return aa_ranks; + } + } + + return NewEntity(); + } + + static AaRanks FindOne( + Database& db, + int aa_ranks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + aa_ranks_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AaRanks entry{}; + + entry.id = atoi(row[0]); + entry.upper_hotkey_sid = atoi(row[1]); + entry.lower_hotkey_sid = atoi(row[2]); + entry.title_sid = atoi(row[3]); + entry.desc_sid = atoi(row[4]); + entry.cost = atoi(row[5]); + entry.level_req = atoi(row[6]); + entry.spell = atoi(row[7]); + entry.spell_type = atoi(row[8]); + entry.recast_time = atoi(row[9]); + entry.expansion = atoi(row[10]); + entry.prev_id = atoi(row[11]); + entry.next_id = atoi(row[12]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int aa_ranks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + aa_ranks_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AaRanks aa_ranks_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(aa_ranks_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(aa_ranks_entry.upper_hotkey_sid)); + update_values.push_back(columns[2] + " = " + std::to_string(aa_ranks_entry.lower_hotkey_sid)); + update_values.push_back(columns[3] + " = " + std::to_string(aa_ranks_entry.title_sid)); + update_values.push_back(columns[4] + " = " + std::to_string(aa_ranks_entry.desc_sid)); + update_values.push_back(columns[5] + " = " + std::to_string(aa_ranks_entry.cost)); + update_values.push_back(columns[6] + " = " + std::to_string(aa_ranks_entry.level_req)); + update_values.push_back(columns[7] + " = " + std::to_string(aa_ranks_entry.spell)); + update_values.push_back(columns[8] + " = " + std::to_string(aa_ranks_entry.spell_type)); + update_values.push_back(columns[9] + " = " + std::to_string(aa_ranks_entry.recast_time)); + update_values.push_back(columns[10] + " = " + std::to_string(aa_ranks_entry.expansion)); + update_values.push_back(columns[11] + " = " + std::to_string(aa_ranks_entry.prev_id)); + update_values.push_back(columns[12] + " = " + std::to_string(aa_ranks_entry.next_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + aa_ranks_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AaRanks InsertOne( + Database& db, + AaRanks aa_ranks_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_ranks_entry.id)); + insert_values.push_back(std::to_string(aa_ranks_entry.upper_hotkey_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.lower_hotkey_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.title_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.desc_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.cost)); + insert_values.push_back(std::to_string(aa_ranks_entry.level_req)); + insert_values.push_back(std::to_string(aa_ranks_entry.spell)); + insert_values.push_back(std::to_string(aa_ranks_entry.spell_type)); + insert_values.push_back(std::to_string(aa_ranks_entry.recast_time)); + insert_values.push_back(std::to_string(aa_ranks_entry.expansion)); + insert_values.push_back(std::to_string(aa_ranks_entry.prev_id)); + insert_values.push_back(std::to_string(aa_ranks_entry.next_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + aa_ranks_entry.id = results.LastInsertedID(); + return aa_ranks_entry; + } + + aa_ranks_entry = NewEntity(); + + return aa_ranks_entry; + } + + static int InsertMany( + Database& db, + std::vector aa_ranks_entries + ) + { + std::vector insert_chunks; + + for (auto &aa_ranks_entry: aa_ranks_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(aa_ranks_entry.id)); + insert_values.push_back(std::to_string(aa_ranks_entry.upper_hotkey_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.lower_hotkey_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.title_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.desc_sid)); + insert_values.push_back(std::to_string(aa_ranks_entry.cost)); + insert_values.push_back(std::to_string(aa_ranks_entry.level_req)); + insert_values.push_back(std::to_string(aa_ranks_entry.spell)); + insert_values.push_back(std::to_string(aa_ranks_entry.spell_type)); + insert_values.push_back(std::to_string(aa_ranks_entry.recast_time)); + insert_values.push_back(std::to_string(aa_ranks_entry.expansion)); + insert_values.push_back(std::to_string(aa_ranks_entry.prev_id)); + insert_values.push_back(std::to_string(aa_ranks_entry.next_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaRanks entry{}; + + entry.id = atoi(row[0]); + entry.upper_hotkey_sid = atoi(row[1]); + entry.lower_hotkey_sid = atoi(row[2]); + entry.title_sid = atoi(row[3]); + entry.desc_sid = atoi(row[4]); + entry.cost = atoi(row[5]); + entry.level_req = atoi(row[6]); + entry.spell = atoi(row[7]); + entry.spell_type = atoi(row[8]); + entry.recast_time = atoi(row[9]); + entry.expansion = atoi(row[10]); + entry.prev_id = atoi(row[11]); + entry.next_id = atoi(row[12]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AaRanks entry{}; + + entry.id = atoi(row[0]); + entry.upper_hotkey_sid = atoi(row[1]); + entry.lower_hotkey_sid = atoi(row[2]); + entry.title_sid = atoi(row[3]); + entry.desc_sid = atoi(row[4]); + entry.cost = atoi(row[5]); + entry.level_req = atoi(row[6]); + entry.spell = atoi(row[7]); + entry.spell_type = atoi(row[8]); + entry.recast_time = atoi(row[9]); + entry.expansion = atoi(row[10]); + entry.prev_id = atoi(row[11]); + entry.next_id = atoi(row[12]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_AA_RANKS_REPOSITORY_H diff --git a/common/repositories/base/base_account_flags_repository.h b/common/repositories/base/base_account_flags_repository.h new file mode 100644 index 000000000..af9c9b223 --- /dev/null +++ b/common/repositories/base/base_account_flags_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H +#define EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAccountFlagsRepository { +public: + struct AccountFlags { + int p_accid; + std::string p_flag; + std::string p_value; + }; + + static std::string PrimaryKey() + { + return std::string("p_accid"); + } + + static std::vector Columns() + { + return { + "p_accid", + "p_flag", + "p_value", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("account_flags"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AccountFlags NewEntity() + { + AccountFlags entry{}; + + entry.p_accid = 0; + entry.p_flag = ""; + entry.p_value = ""; + + return entry; + } + + static AccountFlags GetAccountFlagsEntry( + const std::vector &account_flagss, + int account_flags_id + ) + { + for (auto &account_flags : account_flagss) { + if (account_flags.p_accid == account_flags_id) { + return account_flags; + } + } + + return NewEntity(); + } + + static AccountFlags FindOne( + Database& db, + int account_flags_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + account_flags_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AccountFlags entry{}; + + entry.p_accid = atoi(row[0]); + entry.p_flag = row[1] ? row[1] : ""; + entry.p_value = row[2] ? row[2] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int account_flags_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + account_flags_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AccountFlags account_flags_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(account_flags_entry.p_accid)); + update_values.push_back(columns[1] + " = '" + EscapeString(account_flags_entry.p_flag) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(account_flags_entry.p_value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + account_flags_entry.p_accid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AccountFlags InsertOne( + Database& db, + AccountFlags account_flags_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_flags_entry.p_accid)); + insert_values.push_back("'" + EscapeString(account_flags_entry.p_flag) + "'"); + insert_values.push_back("'" + EscapeString(account_flags_entry.p_value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + account_flags_entry.p_accid = results.LastInsertedID(); + return account_flags_entry; + } + + account_flags_entry = NewEntity(); + + return account_flags_entry; + } + + static int InsertMany( + Database& db, + std::vector account_flags_entries + ) + { + std::vector insert_chunks; + + for (auto &account_flags_entry: account_flags_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_flags_entry.p_accid)); + insert_values.push_back("'" + EscapeString(account_flags_entry.p_flag) + "'"); + insert_values.push_back("'" + EscapeString(account_flags_entry.p_value) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AccountFlags entry{}; + + entry.p_accid = atoi(row[0]); + entry.p_flag = row[1] ? row[1] : ""; + entry.p_value = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AccountFlags entry{}; + + entry.p_accid = atoi(row[0]); + entry.p_flag = row[1] ? row[1] : ""; + entry.p_value = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H diff --git a/common/repositories/base/base_account_ip_repository.h b/common/repositories/base/base_account_ip_repository.h new file mode 100644 index 000000000..1384c4ef2 --- /dev/null +++ b/common/repositories/base/base_account_ip_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H +#define EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAccountIpRepository { +public: + struct AccountIp { + int accid; + std::string ip; + int count; + std::string lastused; + }; + + static std::string PrimaryKey() + { + return std::string("accid"); + } + + static std::vector Columns() + { + return { + "accid", + "ip", + "count", + "lastused", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("account_ip"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AccountIp NewEntity() + { + AccountIp entry{}; + + entry.accid = 0; + entry.ip = ""; + entry.count = 1; + entry.lastused = current_timestamp(); + + return entry; + } + + static AccountIp GetAccountIpEntry( + const std::vector &account_ips, + int account_ip_id + ) + { + for (auto &account_ip : account_ips) { + if (account_ip.accid == account_ip_id) { + return account_ip; + } + } + + return NewEntity(); + } + + static AccountIp FindOne( + Database& db, + int account_ip_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + account_ip_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AccountIp entry{}; + + entry.accid = atoi(row[0]); + entry.ip = row[1] ? row[1] : ""; + entry.count = atoi(row[2]); + entry.lastused = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int account_ip_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + account_ip_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AccountIp account_ip_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(account_ip_entry.accid)); + update_values.push_back(columns[1] + " = '" + EscapeString(account_ip_entry.ip) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(account_ip_entry.count)); + update_values.push_back(columns[3] + " = '" + EscapeString(account_ip_entry.lastused) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + account_ip_entry.accid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AccountIp InsertOne( + Database& db, + AccountIp account_ip_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_ip_entry.accid)); + insert_values.push_back("'" + EscapeString(account_ip_entry.ip) + "'"); + insert_values.push_back(std::to_string(account_ip_entry.count)); + insert_values.push_back("'" + EscapeString(account_ip_entry.lastused) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + account_ip_entry.accid = results.LastInsertedID(); + return account_ip_entry; + } + + account_ip_entry = NewEntity(); + + return account_ip_entry; + } + + static int InsertMany( + Database& db, + std::vector account_ip_entries + ) + { + std::vector insert_chunks; + + for (auto &account_ip_entry: account_ip_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_ip_entry.accid)); + insert_values.push_back("'" + EscapeString(account_ip_entry.ip) + "'"); + insert_values.push_back(std::to_string(account_ip_entry.count)); + insert_values.push_back("'" + EscapeString(account_ip_entry.lastused) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AccountIp entry{}; + + entry.accid = atoi(row[0]); + entry.ip = row[1] ? row[1] : ""; + entry.count = atoi(row[2]); + entry.lastused = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AccountIp entry{}; + + entry.accid = atoi(row[0]); + entry.ip = row[1] ? row[1] : ""; + entry.count = atoi(row[2]); + entry.lastused = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H diff --git a/common/repositories/base/base_account_repository.h b/common/repositories/base/base_account_repository.h new file mode 100644 index 000000000..6283caf13 --- /dev/null +++ b/common/repositories/base/base_account_repository.h @@ -0,0 +1,445 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ACCOUNT_REPOSITORY_H +#define EQEMU_BASE_ACCOUNT_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAccountRepository { +public: + struct Account { + int id; + std::string name; + std::string charname; + int sharedplat; + std::string password; + int status; + std::string ls_id; + int lsaccount_id; + int gmspeed; + int revoked; + int karma; + std::string minilogin_ip; + int hideme; + int rulesflag; + std::string suspendeduntil; + int time_creation; + int expansion; + std::string ban_reason; + std::string suspend_reason; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "charname", + "sharedplat", + "password", + "status", + "ls_id", + "lsaccount_id", + "gmspeed", + "revoked", + "karma", + "minilogin_ip", + "hideme", + "rulesflag", + "suspendeduntil", + "time_creation", + "expansion", + "ban_reason", + "suspend_reason", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("account"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Account NewEntity() + { + Account entry{}; + + entry.id = 0; + entry.name = ""; + entry.charname = ""; + entry.sharedplat = 0; + entry.password = ""; + entry.status = 0; + entry.ls_id = "eqemu"; + entry.lsaccount_id = 0; + entry.gmspeed = 0; + entry.revoked = 0; + entry.karma = 0; + entry.minilogin_ip = ""; + entry.hideme = 0; + entry.rulesflag = 0; + entry.suspendeduntil = "0000-00-00 00:00:00"; + entry.time_creation = 0; + entry.expansion = 0; + entry.ban_reason = ""; + entry.suspend_reason = ""; + + return entry; + } + + static Account GetAccountEntry( + const std::vector &accounts, + int account_id + ) + { + for (auto &account : accounts) { + if (account.id == account_id) { + return account; + } + } + + return NewEntity(); + } + + static Account FindOne( + Database& db, + int account_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + account_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Account entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.charname = row[2] ? row[2] : ""; + entry.sharedplat = atoi(row[3]); + entry.password = row[4] ? row[4] : ""; + entry.status = atoi(row[5]); + entry.ls_id = row[6] ? row[6] : ""; + entry.lsaccount_id = atoi(row[7]); + entry.gmspeed = atoi(row[8]); + entry.revoked = atoi(row[9]); + entry.karma = atoi(row[10]); + entry.minilogin_ip = row[11] ? row[11] : ""; + entry.hideme = atoi(row[12]); + entry.rulesflag = atoi(row[13]); + entry.suspendeduntil = row[14] ? row[14] : ""; + entry.time_creation = atoi(row[15]); + entry.expansion = atoi(row[16]); + entry.ban_reason = row[17] ? row[17] : ""; + entry.suspend_reason = row[18] ? row[18] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int account_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + account_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Account account_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(account_entry.name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(account_entry.charname) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(account_entry.sharedplat)); + update_values.push_back(columns[4] + " = '" + EscapeString(account_entry.password) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(account_entry.status)); + update_values.push_back(columns[6] + " = '" + EscapeString(account_entry.ls_id) + "'"); + update_values.push_back(columns[7] + " = " + std::to_string(account_entry.lsaccount_id)); + update_values.push_back(columns[8] + " = " + std::to_string(account_entry.gmspeed)); + update_values.push_back(columns[9] + " = " + std::to_string(account_entry.revoked)); + update_values.push_back(columns[10] + " = " + std::to_string(account_entry.karma)); + update_values.push_back(columns[11] + " = '" + EscapeString(account_entry.minilogin_ip) + "'"); + update_values.push_back(columns[12] + " = " + std::to_string(account_entry.hideme)); + update_values.push_back(columns[13] + " = " + std::to_string(account_entry.rulesflag)); + update_values.push_back(columns[14] + " = '" + EscapeString(account_entry.suspendeduntil) + "'"); + update_values.push_back(columns[15] + " = " + std::to_string(account_entry.time_creation)); + update_values.push_back(columns[16] + " = " + std::to_string(account_entry.expansion)); + update_values.push_back(columns[17] + " = '" + EscapeString(account_entry.ban_reason) + "'"); + update_values.push_back(columns[18] + " = '" + EscapeString(account_entry.suspend_reason) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + account_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Account InsertOne( + Database& db, + Account account_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_entry.id)); + insert_values.push_back("'" + EscapeString(account_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(account_entry.charname) + "'"); + insert_values.push_back(std::to_string(account_entry.sharedplat)); + insert_values.push_back("'" + EscapeString(account_entry.password) + "'"); + insert_values.push_back(std::to_string(account_entry.status)); + insert_values.push_back("'" + EscapeString(account_entry.ls_id) + "'"); + insert_values.push_back(std::to_string(account_entry.lsaccount_id)); + insert_values.push_back(std::to_string(account_entry.gmspeed)); + insert_values.push_back(std::to_string(account_entry.revoked)); + insert_values.push_back(std::to_string(account_entry.karma)); + insert_values.push_back("'" + EscapeString(account_entry.minilogin_ip) + "'"); + insert_values.push_back(std::to_string(account_entry.hideme)); + insert_values.push_back(std::to_string(account_entry.rulesflag)); + insert_values.push_back("'" + EscapeString(account_entry.suspendeduntil) + "'"); + insert_values.push_back(std::to_string(account_entry.time_creation)); + insert_values.push_back(std::to_string(account_entry.expansion)); + insert_values.push_back("'" + EscapeString(account_entry.ban_reason) + "'"); + insert_values.push_back("'" + EscapeString(account_entry.suspend_reason) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + account_entry.id = results.LastInsertedID(); + return account_entry; + } + + account_entry = NewEntity(); + + return account_entry; + } + + static int InsertMany( + Database& db, + std::vector account_entries + ) + { + std::vector insert_chunks; + + for (auto &account_entry: account_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_entry.id)); + insert_values.push_back("'" + EscapeString(account_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(account_entry.charname) + "'"); + insert_values.push_back(std::to_string(account_entry.sharedplat)); + insert_values.push_back("'" + EscapeString(account_entry.password) + "'"); + insert_values.push_back(std::to_string(account_entry.status)); + insert_values.push_back("'" + EscapeString(account_entry.ls_id) + "'"); + insert_values.push_back(std::to_string(account_entry.lsaccount_id)); + insert_values.push_back(std::to_string(account_entry.gmspeed)); + insert_values.push_back(std::to_string(account_entry.revoked)); + insert_values.push_back(std::to_string(account_entry.karma)); + insert_values.push_back("'" + EscapeString(account_entry.minilogin_ip) + "'"); + insert_values.push_back(std::to_string(account_entry.hideme)); + insert_values.push_back(std::to_string(account_entry.rulesflag)); + insert_values.push_back("'" + EscapeString(account_entry.suspendeduntil) + "'"); + insert_values.push_back(std::to_string(account_entry.time_creation)); + insert_values.push_back(std::to_string(account_entry.expansion)); + insert_values.push_back("'" + EscapeString(account_entry.ban_reason) + "'"); + insert_values.push_back("'" + EscapeString(account_entry.suspend_reason) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Account entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.charname = row[2] ? row[2] : ""; + entry.sharedplat = atoi(row[3]); + entry.password = row[4] ? row[4] : ""; + entry.status = atoi(row[5]); + entry.ls_id = row[6] ? row[6] : ""; + entry.lsaccount_id = atoi(row[7]); + entry.gmspeed = atoi(row[8]); + entry.revoked = atoi(row[9]); + entry.karma = atoi(row[10]); + entry.minilogin_ip = row[11] ? row[11] : ""; + entry.hideme = atoi(row[12]); + entry.rulesflag = atoi(row[13]); + entry.suspendeduntil = row[14] ? row[14] : ""; + entry.time_creation = atoi(row[15]); + entry.expansion = atoi(row[16]); + entry.ban_reason = row[17] ? row[17] : ""; + entry.suspend_reason = row[18] ? row[18] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Account entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.charname = row[2] ? row[2] : ""; + entry.sharedplat = atoi(row[3]); + entry.password = row[4] ? row[4] : ""; + entry.status = atoi(row[5]); + entry.ls_id = row[6] ? row[6] : ""; + entry.lsaccount_id = atoi(row[7]); + entry.gmspeed = atoi(row[8]); + entry.revoked = atoi(row[9]); + entry.karma = atoi(row[10]); + entry.minilogin_ip = row[11] ? row[11] : ""; + entry.hideme = atoi(row[12]); + entry.rulesflag = atoi(row[13]); + entry.suspendeduntil = row[14] ? row[14] : ""; + entry.time_creation = atoi(row[15]); + entry.expansion = atoi(row[16]); + entry.ban_reason = row[17] ? row[17] : ""; + entry.suspend_reason = row[18] ? row[18] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ACCOUNT_REPOSITORY_H diff --git a/common/repositories/base/base_account_rewards_repository.h b/common/repositories/base/base_account_rewards_repository.h new file mode 100644 index 000000000..ee6213e16 --- /dev/null +++ b/common/repositories/base/base_account_rewards_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H +#define EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAccountRewardsRepository { +public: + struct AccountRewards { + int account_id; + int reward_id; + int amount; + }; + + static std::string PrimaryKey() + { + return std::string("account_id"); + } + + static std::vector Columns() + { + return { + "account_id", + "reward_id", + "amount", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("account_rewards"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AccountRewards NewEntity() + { + AccountRewards entry{}; + + entry.account_id = 0; + entry.reward_id = 0; + entry.amount = 0; + + return entry; + } + + static AccountRewards GetAccountRewardsEntry( + const std::vector &account_rewardss, + int account_rewards_id + ) + { + for (auto &account_rewards : account_rewardss) { + if (account_rewards.account_id == account_rewards_id) { + return account_rewards; + } + } + + return NewEntity(); + } + + static AccountRewards FindOne( + Database& db, + int account_rewards_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + account_rewards_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AccountRewards entry{}; + + entry.account_id = atoi(row[0]); + entry.reward_id = atoi(row[1]); + entry.amount = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int account_rewards_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + account_rewards_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AccountRewards account_rewards_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(account_rewards_entry.account_id)); + update_values.push_back(columns[1] + " = " + std::to_string(account_rewards_entry.reward_id)); + update_values.push_back(columns[2] + " = " + std::to_string(account_rewards_entry.amount)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + account_rewards_entry.account_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AccountRewards InsertOne( + Database& db, + AccountRewards account_rewards_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_rewards_entry.account_id)); + insert_values.push_back(std::to_string(account_rewards_entry.reward_id)); + insert_values.push_back(std::to_string(account_rewards_entry.amount)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + account_rewards_entry.account_id = results.LastInsertedID(); + return account_rewards_entry; + } + + account_rewards_entry = NewEntity(); + + return account_rewards_entry; + } + + static int InsertMany( + Database& db, + std::vector account_rewards_entries + ) + { + std::vector insert_chunks; + + for (auto &account_rewards_entry: account_rewards_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(account_rewards_entry.account_id)); + insert_values.push_back(std::to_string(account_rewards_entry.reward_id)); + insert_values.push_back(std::to_string(account_rewards_entry.amount)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AccountRewards entry{}; + + entry.account_id = atoi(row[0]); + entry.reward_id = atoi(row[1]); + entry.amount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AccountRewards entry{}; + + entry.account_id = atoi(row[0]); + entry.reward_id = atoi(row[1]); + entry.amount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H diff --git a/common/repositories/base/base_adventure_details_repository.h b/common/repositories/base/base_adventure_details_repository.h new file mode 100644 index 000000000..656ba8908 --- /dev/null +++ b/common/repositories/base/base_adventure_details_repository.h @@ -0,0 +1,355 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H +#define EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAdventureDetailsRepository { +public: + struct AdventureDetails { + int id; + int adventure_id; + int instance_id; + int count; + int assassinate_count; + int status; + int time_created; + int time_zoned; + int time_completed; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "adventure_id", + "instance_id", + "count", + "assassinate_count", + "status", + "time_created", + "time_zoned", + "time_completed", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("adventure_details"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AdventureDetails NewEntity() + { + AdventureDetails entry{}; + + entry.id = 0; + entry.adventure_id = 0; + entry.instance_id = -1; + entry.count = 0; + entry.assassinate_count = 0; + entry.status = 0; + entry.time_created = 0; + entry.time_zoned = 0; + entry.time_completed = 0; + + return entry; + } + + static AdventureDetails GetAdventureDetailsEntry( + const std::vector &adventure_detailss, + int adventure_details_id + ) + { + for (auto &adventure_details : adventure_detailss) { + if (adventure_details.id == adventure_details_id) { + return adventure_details; + } + } + + return NewEntity(); + } + + static AdventureDetails FindOne( + Database& db, + int adventure_details_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + adventure_details_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AdventureDetails entry{}; + + entry.id = atoi(row[0]); + entry.adventure_id = atoi(row[1]); + entry.instance_id = atoi(row[2]); + entry.count = atoi(row[3]); + entry.assassinate_count = atoi(row[4]); + entry.status = atoi(row[5]); + entry.time_created = atoi(row[6]); + entry.time_zoned = atoi(row[7]); + entry.time_completed = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int adventure_details_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + adventure_details_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AdventureDetails adventure_details_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(adventure_details_entry.adventure_id)); + update_values.push_back(columns[2] + " = " + std::to_string(adventure_details_entry.instance_id)); + update_values.push_back(columns[3] + " = " + std::to_string(adventure_details_entry.count)); + update_values.push_back(columns[4] + " = " + std::to_string(adventure_details_entry.assassinate_count)); + update_values.push_back(columns[5] + " = " + std::to_string(adventure_details_entry.status)); + update_values.push_back(columns[6] + " = " + std::to_string(adventure_details_entry.time_created)); + update_values.push_back(columns[7] + " = " + std::to_string(adventure_details_entry.time_zoned)); + update_values.push_back(columns[8] + " = " + std::to_string(adventure_details_entry.time_completed)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + adventure_details_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AdventureDetails InsertOne( + Database& db, + AdventureDetails adventure_details_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_details_entry.id)); + insert_values.push_back(std::to_string(adventure_details_entry.adventure_id)); + insert_values.push_back(std::to_string(adventure_details_entry.instance_id)); + insert_values.push_back(std::to_string(adventure_details_entry.count)); + insert_values.push_back(std::to_string(adventure_details_entry.assassinate_count)); + insert_values.push_back(std::to_string(adventure_details_entry.status)); + insert_values.push_back(std::to_string(adventure_details_entry.time_created)); + insert_values.push_back(std::to_string(adventure_details_entry.time_zoned)); + insert_values.push_back(std::to_string(adventure_details_entry.time_completed)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + adventure_details_entry.id = results.LastInsertedID(); + return adventure_details_entry; + } + + adventure_details_entry = NewEntity(); + + return adventure_details_entry; + } + + static int InsertMany( + Database& db, + std::vector adventure_details_entries + ) + { + std::vector insert_chunks; + + for (auto &adventure_details_entry: adventure_details_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_details_entry.id)); + insert_values.push_back(std::to_string(adventure_details_entry.adventure_id)); + insert_values.push_back(std::to_string(adventure_details_entry.instance_id)); + insert_values.push_back(std::to_string(adventure_details_entry.count)); + insert_values.push_back(std::to_string(adventure_details_entry.assassinate_count)); + insert_values.push_back(std::to_string(adventure_details_entry.status)); + insert_values.push_back(std::to_string(adventure_details_entry.time_created)); + insert_values.push_back(std::to_string(adventure_details_entry.time_zoned)); + insert_values.push_back(std::to_string(adventure_details_entry.time_completed)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureDetails entry{}; + + entry.id = atoi(row[0]); + entry.adventure_id = atoi(row[1]); + entry.instance_id = atoi(row[2]); + entry.count = atoi(row[3]); + entry.assassinate_count = atoi(row[4]); + entry.status = atoi(row[5]); + entry.time_created = atoi(row[6]); + entry.time_zoned = atoi(row[7]); + entry.time_completed = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureDetails entry{}; + + entry.id = atoi(row[0]); + entry.adventure_id = atoi(row[1]); + entry.instance_id = atoi(row[2]); + entry.count = atoi(row[3]); + entry.assassinate_count = atoi(row[4]); + entry.status = atoi(row[5]); + entry.time_created = atoi(row[6]); + entry.time_zoned = atoi(row[7]); + entry.time_completed = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H diff --git a/common/repositories/base/base_adventure_members_repository.h b/common/repositories/base/base_adventure_members_repository.h new file mode 100644 index 000000000..4cdc357fd --- /dev/null +++ b/common/repositories/base/base_adventure_members_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H +#define EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAdventureMembersRepository { +public: + struct AdventureMembers { + int id; + int charid; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "id", + "charid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("adventure_members"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AdventureMembers NewEntity() + { + AdventureMembers entry{}; + + entry.id = 0; + entry.charid = 0; + + return entry; + } + + static AdventureMembers GetAdventureMembersEntry( + const std::vector &adventure_memberss, + int adventure_members_id + ) + { + for (auto &adventure_members : adventure_memberss) { + if (adventure_members.charid == adventure_members_id) { + return adventure_members; + } + } + + return NewEntity(); + } + + static AdventureMembers FindOne( + Database& db, + int adventure_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + adventure_members_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AdventureMembers entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int adventure_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + adventure_members_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AdventureMembers adventure_members_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(adventure_members_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(adventure_members_entry.charid)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + adventure_members_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AdventureMembers InsertOne( + Database& db, + AdventureMembers adventure_members_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_members_entry.id)); + insert_values.push_back(std::to_string(adventure_members_entry.charid)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + adventure_members_entry.charid = results.LastInsertedID(); + return adventure_members_entry; + } + + adventure_members_entry = NewEntity(); + + return adventure_members_entry; + } + + static int InsertMany( + Database& db, + std::vector adventure_members_entries + ) + { + std::vector insert_chunks; + + for (auto &adventure_members_entry: adventure_members_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_members_entry.id)); + insert_values.push_back(std::to_string(adventure_members_entry.charid)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureMembers entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureMembers entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H diff --git a/common/repositories/base/base_adventure_stats_repository.h b/common/repositories/base/base_adventure_stats_repository.h new file mode 100644 index 000000000..b1634c080 --- /dev/null +++ b/common/repositories/base/base_adventure_stats_repository.h @@ -0,0 +1,374 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H +#define EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAdventureStatsRepository { +public: + struct AdventureStats { + int player_id; + int guk_wins; + int mir_wins; + int mmc_wins; + int ruj_wins; + int tak_wins; + int guk_losses; + int mir_losses; + int mmc_losses; + int ruj_losses; + int tak_losses; + }; + + static std::string PrimaryKey() + { + return std::string("player_id"); + } + + static std::vector Columns() + { + return { + "player_id", + "guk_wins", + "mir_wins", + "mmc_wins", + "ruj_wins", + "tak_wins", + "guk_losses", + "mir_losses", + "mmc_losses", + "ruj_losses", + "tak_losses", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("adventure_stats"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AdventureStats NewEntity() + { + AdventureStats entry{}; + + entry.player_id = 0; + entry.guk_wins = 0; + entry.mir_wins = 0; + entry.mmc_wins = 0; + entry.ruj_wins = 0; + entry.tak_wins = 0; + entry.guk_losses = 0; + entry.mir_losses = 0; + entry.mmc_losses = 0; + entry.ruj_losses = 0; + entry.tak_losses = 0; + + return entry; + } + + static AdventureStats GetAdventureStatsEntry( + const std::vector &adventure_statss, + int adventure_stats_id + ) + { + for (auto &adventure_stats : adventure_statss) { + if (adventure_stats.player_id == adventure_stats_id) { + return adventure_stats; + } + } + + return NewEntity(); + } + + static AdventureStats FindOne( + Database& db, + int adventure_stats_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + adventure_stats_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AdventureStats entry{}; + + entry.player_id = atoi(row[0]); + entry.guk_wins = atoi(row[1]); + entry.mir_wins = atoi(row[2]); + entry.mmc_wins = atoi(row[3]); + entry.ruj_wins = atoi(row[4]); + entry.tak_wins = atoi(row[5]); + entry.guk_losses = atoi(row[6]); + entry.mir_losses = atoi(row[7]); + entry.mmc_losses = atoi(row[8]); + entry.ruj_losses = atoi(row[9]); + entry.tak_losses = atoi(row[10]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int adventure_stats_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + adventure_stats_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AdventureStats adventure_stats_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(adventure_stats_entry.player_id)); + update_values.push_back(columns[1] + " = " + std::to_string(adventure_stats_entry.guk_wins)); + update_values.push_back(columns[2] + " = " + std::to_string(adventure_stats_entry.mir_wins)); + update_values.push_back(columns[3] + " = " + std::to_string(adventure_stats_entry.mmc_wins)); + update_values.push_back(columns[4] + " = " + std::to_string(adventure_stats_entry.ruj_wins)); + update_values.push_back(columns[5] + " = " + std::to_string(adventure_stats_entry.tak_wins)); + update_values.push_back(columns[6] + " = " + std::to_string(adventure_stats_entry.guk_losses)); + update_values.push_back(columns[7] + " = " + std::to_string(adventure_stats_entry.mir_losses)); + update_values.push_back(columns[8] + " = " + std::to_string(adventure_stats_entry.mmc_losses)); + update_values.push_back(columns[9] + " = " + std::to_string(adventure_stats_entry.ruj_losses)); + update_values.push_back(columns[10] + " = " + std::to_string(adventure_stats_entry.tak_losses)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + adventure_stats_entry.player_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AdventureStats InsertOne( + Database& db, + AdventureStats adventure_stats_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_stats_entry.player_id)); + insert_values.push_back(std::to_string(adventure_stats_entry.guk_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.mir_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.mmc_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.ruj_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.tak_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.guk_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.mir_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.mmc_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.ruj_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.tak_losses)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + adventure_stats_entry.player_id = results.LastInsertedID(); + return adventure_stats_entry; + } + + adventure_stats_entry = NewEntity(); + + return adventure_stats_entry; + } + + static int InsertMany( + Database& db, + std::vector adventure_stats_entries + ) + { + std::vector insert_chunks; + + for (auto &adventure_stats_entry: adventure_stats_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_stats_entry.player_id)); + insert_values.push_back(std::to_string(adventure_stats_entry.guk_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.mir_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.mmc_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.ruj_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.tak_wins)); + insert_values.push_back(std::to_string(adventure_stats_entry.guk_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.mir_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.mmc_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.ruj_losses)); + insert_values.push_back(std::to_string(adventure_stats_entry.tak_losses)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureStats entry{}; + + entry.player_id = atoi(row[0]); + entry.guk_wins = atoi(row[1]); + entry.mir_wins = atoi(row[2]); + entry.mmc_wins = atoi(row[3]); + entry.ruj_wins = atoi(row[4]); + entry.tak_wins = atoi(row[5]); + entry.guk_losses = atoi(row[6]); + entry.mir_losses = atoi(row[7]); + entry.mmc_losses = atoi(row[8]); + entry.ruj_losses = atoi(row[9]); + entry.tak_losses = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureStats entry{}; + + entry.player_id = atoi(row[0]); + entry.guk_wins = atoi(row[1]); + entry.mir_wins = atoi(row[2]); + entry.mmc_wins = atoi(row[3]); + entry.ruj_wins = atoi(row[4]); + entry.tak_wins = atoi(row[5]); + entry.guk_losses = atoi(row[6]); + entry.mir_losses = atoi(row[7]); + entry.mmc_losses = atoi(row[8]); + entry.ruj_losses = atoi(row[9]); + entry.tak_losses = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H diff --git a/common/repositories/base/base_adventure_template_entry_flavor_repository.h b/common/repositories/base/base_adventure_template_entry_flavor_repository.h new file mode 100644 index 000000000..8b4bfa7b6 --- /dev/null +++ b/common/repositories/base/base_adventure_template_entry_flavor_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H +#define EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAdventureTemplateEntryFlavorRepository { +public: + struct AdventureTemplateEntryFlavor { + int id; + std::string text; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "text", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("adventure_template_entry_flavor"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AdventureTemplateEntryFlavor NewEntity() + { + AdventureTemplateEntryFlavor entry{}; + + entry.id = 0; + entry.text = ""; + + return entry; + } + + static AdventureTemplateEntryFlavor GetAdventureTemplateEntryFlavorEntry( + const std::vector &adventure_template_entry_flavors, + int adventure_template_entry_flavor_id + ) + { + for (auto &adventure_template_entry_flavor : adventure_template_entry_flavors) { + if (adventure_template_entry_flavor.id == adventure_template_entry_flavor_id) { + return adventure_template_entry_flavor; + } + } + + return NewEntity(); + } + + static AdventureTemplateEntryFlavor FindOne( + Database& db, + int adventure_template_entry_flavor_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + adventure_template_entry_flavor_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AdventureTemplateEntryFlavor entry{}; + + entry.id = atoi(row[0]); + entry.text = row[1] ? row[1] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int adventure_template_entry_flavor_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + adventure_template_entry_flavor_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AdventureTemplateEntryFlavor adventure_template_entry_flavor_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(adventure_template_entry_flavor_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(adventure_template_entry_flavor_entry.text) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + adventure_template_entry_flavor_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AdventureTemplateEntryFlavor InsertOne( + Database& db, + AdventureTemplateEntryFlavor adventure_template_entry_flavor_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_template_entry_flavor_entry.id)); + insert_values.push_back("'" + EscapeString(adventure_template_entry_flavor_entry.text) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + adventure_template_entry_flavor_entry.id = results.LastInsertedID(); + return adventure_template_entry_flavor_entry; + } + + adventure_template_entry_flavor_entry = NewEntity(); + + return adventure_template_entry_flavor_entry; + } + + static int InsertMany( + Database& db, + std::vector adventure_template_entry_flavor_entries + ) + { + std::vector insert_chunks; + + for (auto &adventure_template_entry_flavor_entry: adventure_template_entry_flavor_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_template_entry_flavor_entry.id)); + insert_values.push_back("'" + EscapeString(adventure_template_entry_flavor_entry.text) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureTemplateEntryFlavor entry{}; + + entry.id = atoi(row[0]); + entry.text = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureTemplateEntryFlavor entry{}; + + entry.id = atoi(row[0]); + entry.text = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H diff --git a/common/repositories/base/base_adventure_template_entry_repository.h b/common/repositories/base/base_adventure_template_entry_repository.h new file mode 100644 index 000000000..5e4b9ca7c --- /dev/null +++ b/common/repositories/base/base_adventure_template_entry_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H +#define EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAdventureTemplateEntryRepository { +public: + struct AdventureTemplateEntry { + int id; + int template_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "template_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("adventure_template_entry"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AdventureTemplateEntry NewEntity() + { + AdventureTemplateEntry entry{}; + + entry.id = 0; + entry.template_id = 0; + + return entry; + } + + static AdventureTemplateEntry GetAdventureTemplateEntryEntry( + const std::vector &adventure_template_entrys, + int adventure_template_entry_id + ) + { + for (auto &adventure_template_entry : adventure_template_entrys) { + if (adventure_template_entry.id == adventure_template_entry_id) { + return adventure_template_entry; + } + } + + return NewEntity(); + } + + static AdventureTemplateEntry FindOne( + Database& db, + int adventure_template_entry_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + adventure_template_entry_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AdventureTemplateEntry entry{}; + + entry.id = atoi(row[0]); + entry.template_id = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int adventure_template_entry_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + adventure_template_entry_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AdventureTemplateEntry adventure_template_entry_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(adventure_template_entry_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(adventure_template_entry_entry.template_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + adventure_template_entry_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AdventureTemplateEntry InsertOne( + Database& db, + AdventureTemplateEntry adventure_template_entry_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_template_entry_entry.id)); + insert_values.push_back(std::to_string(adventure_template_entry_entry.template_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + adventure_template_entry_entry.id = results.LastInsertedID(); + return adventure_template_entry_entry; + } + + adventure_template_entry_entry = NewEntity(); + + return adventure_template_entry_entry; + } + + static int InsertMany( + Database& db, + std::vector adventure_template_entry_entries + ) + { + std::vector insert_chunks; + + for (auto &adventure_template_entry_entry: adventure_template_entry_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_template_entry_entry.id)); + insert_values.push_back(std::to_string(adventure_template_entry_entry.template_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureTemplateEntry entry{}; + + entry.id = atoi(row[0]); + entry.template_id = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureTemplateEntry entry{}; + + entry.id = atoi(row[0]); + entry.template_id = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H diff --git a/common/repositories/base/base_adventure_template_repository.h b/common/repositories/base/base_adventure_template_repository.h new file mode 100644 index 000000000..076b8abc5 --- /dev/null +++ b/common/repositories/base/base_adventure_template_repository.h @@ -0,0 +1,572 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H +#define EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAdventureTemplateRepository { +public: + struct AdventureTemplate { + int id; + std::string zone; + int zone_version; + int is_hard; + int is_raid; + int min_level; + int max_level; + int type; + int type_data; + int type_count; + float assa_x; + float assa_y; + float assa_z; + float assa_h; + std::string text; + int duration; + int zone_in_time; + int win_points; + int lose_points; + int theme; + int zone_in_zone_id; + float zone_in_x; + float zone_in_y; + int zone_in_object_id; + float dest_x; + float dest_y; + float dest_z; + float dest_h; + int graveyard_zone_id; + float graveyard_x; + float graveyard_y; + float graveyard_z; + float graveyard_radius; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "zone_version", + "is_hard", + "is_raid", + "min_level", + "max_level", + "type", + "type_data", + "type_count", + "assa_x", + "assa_y", + "assa_z", + "assa_h", + "text", + "duration", + "zone_in_time", + "win_points", + "lose_points", + "theme", + "zone_in_zone_id", + "zone_in_x", + "zone_in_y", + "zone_in_object_id", + "dest_x", + "dest_y", + "dest_z", + "dest_h", + "graveyard_zone_id", + "graveyard_x", + "graveyard_y", + "graveyard_z", + "graveyard_radius", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("adventure_template"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AdventureTemplate NewEntity() + { + AdventureTemplate entry{}; + + entry.id = 0; + entry.zone = ""; + entry.zone_version = 0; + entry.is_hard = 0; + entry.is_raid = 0; + entry.min_level = 1; + entry.max_level = 65; + entry.type = 0; + entry.type_data = 0; + entry.type_count = 0; + entry.assa_x = 0; + entry.assa_y = 0; + entry.assa_z = 0; + entry.assa_h = 0; + entry.text = ""; + entry.duration = 7200; + entry.zone_in_time = 1800; + entry.win_points = 0; + entry.lose_points = 0; + entry.theme = 1; + entry.zone_in_zone_id = 0; + entry.zone_in_x = 0; + entry.zone_in_y = 0; + entry.zone_in_object_id = 0; + entry.dest_x = 0; + entry.dest_y = 0; + entry.dest_z = 0; + entry.dest_h = 0; + entry.graveyard_zone_id = 0; + entry.graveyard_x = 0; + entry.graveyard_y = 0; + entry.graveyard_z = 0; + entry.graveyard_radius = 0; + + return entry; + } + + static AdventureTemplate GetAdventureTemplateEntry( + const std::vector &adventure_templates, + int adventure_template_id + ) + { + for (auto &adventure_template : adventure_templates) { + if (adventure_template.id == adventure_template_id) { + return adventure_template; + } + } + + return NewEntity(); + } + + static AdventureTemplate FindOne( + Database& db, + int adventure_template_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + adventure_template_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AdventureTemplate entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.zone_version = atoi(row[2]); + entry.is_hard = atoi(row[3]); + entry.is_raid = atoi(row[4]); + entry.min_level = atoi(row[5]); + entry.max_level = atoi(row[6]); + entry.type = atoi(row[7]); + entry.type_data = atoi(row[8]); + entry.type_count = atoi(row[9]); + entry.assa_x = static_cast(atof(row[10])); + entry.assa_y = static_cast(atof(row[11])); + entry.assa_z = static_cast(atof(row[12])); + entry.assa_h = static_cast(atof(row[13])); + entry.text = row[14] ? row[14] : ""; + entry.duration = atoi(row[15]); + entry.zone_in_time = atoi(row[16]); + entry.win_points = atoi(row[17]); + entry.lose_points = atoi(row[18]); + entry.theme = atoi(row[19]); + entry.zone_in_zone_id = atoi(row[20]); + entry.zone_in_x = static_cast(atof(row[21])); + entry.zone_in_y = static_cast(atof(row[22])); + entry.zone_in_object_id = atoi(row[23]); + entry.dest_x = static_cast(atof(row[24])); + entry.dest_y = static_cast(atof(row[25])); + entry.dest_z = static_cast(atof(row[26])); + entry.dest_h = static_cast(atof(row[27])); + entry.graveyard_zone_id = atoi(row[28]); + entry.graveyard_x = static_cast(atof(row[29])); + entry.graveyard_y = static_cast(atof(row[30])); + entry.graveyard_z = static_cast(atof(row[31])); + entry.graveyard_radius = static_cast(atof(row[32])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int adventure_template_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + adventure_template_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AdventureTemplate adventure_template_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(adventure_template_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(adventure_template_entry.zone) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(adventure_template_entry.zone_version)); + update_values.push_back(columns[3] + " = " + std::to_string(adventure_template_entry.is_hard)); + update_values.push_back(columns[4] + " = " + std::to_string(adventure_template_entry.is_raid)); + update_values.push_back(columns[5] + " = " + std::to_string(adventure_template_entry.min_level)); + update_values.push_back(columns[6] + " = " + std::to_string(adventure_template_entry.max_level)); + update_values.push_back(columns[7] + " = " + std::to_string(adventure_template_entry.type)); + update_values.push_back(columns[8] + " = " + std::to_string(adventure_template_entry.type_data)); + update_values.push_back(columns[9] + " = " + std::to_string(adventure_template_entry.type_count)); + update_values.push_back(columns[10] + " = " + std::to_string(adventure_template_entry.assa_x)); + update_values.push_back(columns[11] + " = " + std::to_string(adventure_template_entry.assa_y)); + update_values.push_back(columns[12] + " = " + std::to_string(adventure_template_entry.assa_z)); + update_values.push_back(columns[13] + " = " + std::to_string(adventure_template_entry.assa_h)); + update_values.push_back(columns[14] + " = '" + EscapeString(adventure_template_entry.text) + "'"); + update_values.push_back(columns[15] + " = " + std::to_string(adventure_template_entry.duration)); + update_values.push_back(columns[16] + " = " + std::to_string(adventure_template_entry.zone_in_time)); + update_values.push_back(columns[17] + " = " + std::to_string(adventure_template_entry.win_points)); + update_values.push_back(columns[18] + " = " + std::to_string(adventure_template_entry.lose_points)); + update_values.push_back(columns[19] + " = " + std::to_string(adventure_template_entry.theme)); + update_values.push_back(columns[20] + " = " + std::to_string(adventure_template_entry.zone_in_zone_id)); + update_values.push_back(columns[21] + " = " + std::to_string(adventure_template_entry.zone_in_x)); + update_values.push_back(columns[22] + " = " + std::to_string(adventure_template_entry.zone_in_y)); + update_values.push_back(columns[23] + " = " + std::to_string(adventure_template_entry.zone_in_object_id)); + update_values.push_back(columns[24] + " = " + std::to_string(adventure_template_entry.dest_x)); + update_values.push_back(columns[25] + " = " + std::to_string(adventure_template_entry.dest_y)); + update_values.push_back(columns[26] + " = " + std::to_string(adventure_template_entry.dest_z)); + update_values.push_back(columns[27] + " = " + std::to_string(adventure_template_entry.dest_h)); + update_values.push_back(columns[28] + " = " + std::to_string(adventure_template_entry.graveyard_zone_id)); + update_values.push_back(columns[29] + " = " + std::to_string(adventure_template_entry.graveyard_x)); + update_values.push_back(columns[30] + " = " + std::to_string(adventure_template_entry.graveyard_y)); + update_values.push_back(columns[31] + " = " + std::to_string(adventure_template_entry.graveyard_z)); + update_values.push_back(columns[32] + " = " + std::to_string(adventure_template_entry.graveyard_radius)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + adventure_template_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AdventureTemplate InsertOne( + Database& db, + AdventureTemplate adventure_template_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_template_entry.id)); + insert_values.push_back("'" + EscapeString(adventure_template_entry.zone) + "'"); + insert_values.push_back(std::to_string(adventure_template_entry.zone_version)); + insert_values.push_back(std::to_string(adventure_template_entry.is_hard)); + insert_values.push_back(std::to_string(adventure_template_entry.is_raid)); + insert_values.push_back(std::to_string(adventure_template_entry.min_level)); + insert_values.push_back(std::to_string(adventure_template_entry.max_level)); + insert_values.push_back(std::to_string(adventure_template_entry.type)); + insert_values.push_back(std::to_string(adventure_template_entry.type_data)); + insert_values.push_back(std::to_string(adventure_template_entry.type_count)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_x)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_y)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_z)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_h)); + insert_values.push_back("'" + EscapeString(adventure_template_entry.text) + "'"); + insert_values.push_back(std::to_string(adventure_template_entry.duration)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_time)); + insert_values.push_back(std::to_string(adventure_template_entry.win_points)); + insert_values.push_back(std::to_string(adventure_template_entry.lose_points)); + insert_values.push_back(std::to_string(adventure_template_entry.theme)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_zone_id)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_x)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_y)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_object_id)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_x)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_y)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_z)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_h)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_zone_id)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_x)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_y)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_z)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_radius)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + adventure_template_entry.id = results.LastInsertedID(); + return adventure_template_entry; + } + + adventure_template_entry = NewEntity(); + + return adventure_template_entry; + } + + static int InsertMany( + Database& db, + std::vector adventure_template_entries + ) + { + std::vector insert_chunks; + + for (auto &adventure_template_entry: adventure_template_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(adventure_template_entry.id)); + insert_values.push_back("'" + EscapeString(adventure_template_entry.zone) + "'"); + insert_values.push_back(std::to_string(adventure_template_entry.zone_version)); + insert_values.push_back(std::to_string(adventure_template_entry.is_hard)); + insert_values.push_back(std::to_string(adventure_template_entry.is_raid)); + insert_values.push_back(std::to_string(adventure_template_entry.min_level)); + insert_values.push_back(std::to_string(adventure_template_entry.max_level)); + insert_values.push_back(std::to_string(adventure_template_entry.type)); + insert_values.push_back(std::to_string(adventure_template_entry.type_data)); + insert_values.push_back(std::to_string(adventure_template_entry.type_count)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_x)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_y)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_z)); + insert_values.push_back(std::to_string(adventure_template_entry.assa_h)); + insert_values.push_back("'" + EscapeString(adventure_template_entry.text) + "'"); + insert_values.push_back(std::to_string(adventure_template_entry.duration)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_time)); + insert_values.push_back(std::to_string(adventure_template_entry.win_points)); + insert_values.push_back(std::to_string(adventure_template_entry.lose_points)); + insert_values.push_back(std::to_string(adventure_template_entry.theme)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_zone_id)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_x)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_y)); + insert_values.push_back(std::to_string(adventure_template_entry.zone_in_object_id)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_x)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_y)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_z)); + insert_values.push_back(std::to_string(adventure_template_entry.dest_h)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_zone_id)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_x)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_y)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_z)); + insert_values.push_back(std::to_string(adventure_template_entry.graveyard_radius)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureTemplate entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.zone_version = atoi(row[2]); + entry.is_hard = atoi(row[3]); + entry.is_raid = atoi(row[4]); + entry.min_level = atoi(row[5]); + entry.max_level = atoi(row[6]); + entry.type = atoi(row[7]); + entry.type_data = atoi(row[8]); + entry.type_count = atoi(row[9]); + entry.assa_x = static_cast(atof(row[10])); + entry.assa_y = static_cast(atof(row[11])); + entry.assa_z = static_cast(atof(row[12])); + entry.assa_h = static_cast(atof(row[13])); + entry.text = row[14] ? row[14] : ""; + entry.duration = atoi(row[15]); + entry.zone_in_time = atoi(row[16]); + entry.win_points = atoi(row[17]); + entry.lose_points = atoi(row[18]); + entry.theme = atoi(row[19]); + entry.zone_in_zone_id = atoi(row[20]); + entry.zone_in_x = static_cast(atof(row[21])); + entry.zone_in_y = static_cast(atof(row[22])); + entry.zone_in_object_id = atoi(row[23]); + entry.dest_x = static_cast(atof(row[24])); + entry.dest_y = static_cast(atof(row[25])); + entry.dest_z = static_cast(atof(row[26])); + entry.dest_h = static_cast(atof(row[27])); + entry.graveyard_zone_id = atoi(row[28]); + entry.graveyard_x = static_cast(atof(row[29])); + entry.graveyard_y = static_cast(atof(row[30])); + entry.graveyard_z = static_cast(atof(row[31])); + entry.graveyard_radius = static_cast(atof(row[32])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AdventureTemplate entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.zone_version = atoi(row[2]); + entry.is_hard = atoi(row[3]); + entry.is_raid = atoi(row[4]); + entry.min_level = atoi(row[5]); + entry.max_level = atoi(row[6]); + entry.type = atoi(row[7]); + entry.type_data = atoi(row[8]); + entry.type_count = atoi(row[9]); + entry.assa_x = static_cast(atof(row[10])); + entry.assa_y = static_cast(atof(row[11])); + entry.assa_z = static_cast(atof(row[12])); + entry.assa_h = static_cast(atof(row[13])); + entry.text = row[14] ? row[14] : ""; + entry.duration = atoi(row[15]); + entry.zone_in_time = atoi(row[16]); + entry.win_points = atoi(row[17]); + entry.lose_points = atoi(row[18]); + entry.theme = atoi(row[19]); + entry.zone_in_zone_id = atoi(row[20]); + entry.zone_in_x = static_cast(atof(row[21])); + entry.zone_in_y = static_cast(atof(row[22])); + entry.zone_in_object_id = atoi(row[23]); + entry.dest_x = static_cast(atof(row[24])); + entry.dest_y = static_cast(atof(row[25])); + entry.dest_z = static_cast(atof(row[26])); + entry.dest_h = static_cast(atof(row[27])); + entry.graveyard_zone_id = atoi(row[28]); + entry.graveyard_x = static_cast(atof(row[29])); + entry.graveyard_y = static_cast(atof(row[30])); + entry.graveyard_z = static_cast(atof(row[31])); + entry.graveyard_radius = static_cast(atof(row[32])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H diff --git a/common/repositories/base/base_alternate_currency_repository.h b/common/repositories/base/base_alternate_currency_repository.h new file mode 100644 index 000000000..832da0f84 --- /dev/null +++ b/common/repositories/base/base_alternate_currency_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H +#define EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAlternateCurrencyRepository { +public: + struct AlternateCurrency { + int id; + int item_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "item_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("alternate_currency"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static AlternateCurrency NewEntity() + { + AlternateCurrency entry{}; + + entry.id = 0; + entry.item_id = 0; + + return entry; + } + + static AlternateCurrency GetAlternateCurrencyEntry( + const std::vector &alternate_currencys, + int alternate_currency_id + ) + { + for (auto &alternate_currency : alternate_currencys) { + if (alternate_currency.id == alternate_currency_id) { + return alternate_currency; + } + } + + return NewEntity(); + } + + static AlternateCurrency FindOne( + Database& db, + int alternate_currency_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + alternate_currency_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + AlternateCurrency entry{}; + + entry.id = atoi(row[0]); + entry.item_id = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int alternate_currency_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + alternate_currency_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + AlternateCurrency alternate_currency_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(alternate_currency_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(alternate_currency_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + alternate_currency_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static AlternateCurrency InsertOne( + Database& db, + AlternateCurrency alternate_currency_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(alternate_currency_entry.id)); + insert_values.push_back(std::to_string(alternate_currency_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + alternate_currency_entry.id = results.LastInsertedID(); + return alternate_currency_entry; + } + + alternate_currency_entry = NewEntity(); + + return alternate_currency_entry; + } + + static int InsertMany( + Database& db, + std::vector alternate_currency_entries + ) + { + std::vector insert_chunks; + + for (auto &alternate_currency_entry: alternate_currency_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(alternate_currency_entry.id)); + insert_values.push_back(std::to_string(alternate_currency_entry.item_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AlternateCurrency entry{}; + + entry.id = atoi(row[0]); + entry.item_id = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + AlternateCurrency entry{}; + + entry.id = atoi(row[0]); + entry.item_id = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H diff --git a/common/repositories/base/base_auras_repository.h b/common/repositories/base/base_auras_repository.h new file mode 100644 index 000000000..e884fc50b --- /dev/null +++ b/common/repositories/base/base_auras_repository.h @@ -0,0 +1,374 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_AURAS_REPOSITORY_H +#define EQEMU_BASE_AURAS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseAurasRepository { +public: + struct Auras { + int type; + int npc_type; + std::string name; + int spell_id; + int distance; + int aura_type; + int spawn_type; + int movement; + int duration; + int icon; + int cast_time; + }; + + static std::string PrimaryKey() + { + return std::string("type"); + } + + static std::vector Columns() + { + return { + "type", + "npc_type", + "name", + "spell_id", + "distance", + "aura_type", + "spawn_type", + "movement", + "duration", + "icon", + "cast_time", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("auras"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Auras NewEntity() + { + Auras entry{}; + + entry.type = 0; + entry.npc_type = 0; + entry.name = ""; + entry.spell_id = 0; + entry.distance = 60; + entry.aura_type = 1; + entry.spawn_type = 0; + entry.movement = 0; + entry.duration = 5400; + entry.icon = -1; + entry.cast_time = 0; + + return entry; + } + + static Auras GetAurasEntry( + const std::vector &aurass, + int auras_id + ) + { + for (auto &auras : aurass) { + if (auras.type == auras_id) { + return auras; + } + } + + return NewEntity(); + } + + static Auras FindOne( + Database& db, + int auras_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + auras_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Auras entry{}; + + entry.type = atoi(row[0]); + entry.npc_type = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.spell_id = atoi(row[3]); + entry.distance = atoi(row[4]); + entry.aura_type = atoi(row[5]); + entry.spawn_type = atoi(row[6]); + entry.movement = atoi(row[7]); + entry.duration = atoi(row[8]); + entry.icon = atoi(row[9]); + entry.cast_time = atoi(row[10]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int auras_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + auras_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Auras auras_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(auras_entry.type)); + update_values.push_back(columns[1] + " = " + std::to_string(auras_entry.npc_type)); + update_values.push_back(columns[2] + " = '" + EscapeString(auras_entry.name) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(auras_entry.spell_id)); + update_values.push_back(columns[4] + " = " + std::to_string(auras_entry.distance)); + update_values.push_back(columns[5] + " = " + std::to_string(auras_entry.aura_type)); + update_values.push_back(columns[6] + " = " + std::to_string(auras_entry.spawn_type)); + update_values.push_back(columns[7] + " = " + std::to_string(auras_entry.movement)); + update_values.push_back(columns[8] + " = " + std::to_string(auras_entry.duration)); + update_values.push_back(columns[9] + " = " + std::to_string(auras_entry.icon)); + update_values.push_back(columns[10] + " = " + std::to_string(auras_entry.cast_time)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + auras_entry.type + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Auras InsertOne( + Database& db, + Auras auras_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(auras_entry.type)); + insert_values.push_back(std::to_string(auras_entry.npc_type)); + insert_values.push_back("'" + EscapeString(auras_entry.name) + "'"); + insert_values.push_back(std::to_string(auras_entry.spell_id)); + insert_values.push_back(std::to_string(auras_entry.distance)); + insert_values.push_back(std::to_string(auras_entry.aura_type)); + insert_values.push_back(std::to_string(auras_entry.spawn_type)); + insert_values.push_back(std::to_string(auras_entry.movement)); + insert_values.push_back(std::to_string(auras_entry.duration)); + insert_values.push_back(std::to_string(auras_entry.icon)); + insert_values.push_back(std::to_string(auras_entry.cast_time)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + auras_entry.type = results.LastInsertedID(); + return auras_entry; + } + + auras_entry = NewEntity(); + + return auras_entry; + } + + static int InsertMany( + Database& db, + std::vector auras_entries + ) + { + std::vector insert_chunks; + + for (auto &auras_entry: auras_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(auras_entry.type)); + insert_values.push_back(std::to_string(auras_entry.npc_type)); + insert_values.push_back("'" + EscapeString(auras_entry.name) + "'"); + insert_values.push_back(std::to_string(auras_entry.spell_id)); + insert_values.push_back(std::to_string(auras_entry.distance)); + insert_values.push_back(std::to_string(auras_entry.aura_type)); + insert_values.push_back(std::to_string(auras_entry.spawn_type)); + insert_values.push_back(std::to_string(auras_entry.movement)); + insert_values.push_back(std::to_string(auras_entry.duration)); + insert_values.push_back(std::to_string(auras_entry.icon)); + insert_values.push_back(std::to_string(auras_entry.cast_time)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Auras entry{}; + + entry.type = atoi(row[0]); + entry.npc_type = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.spell_id = atoi(row[3]); + entry.distance = atoi(row[4]); + entry.aura_type = atoi(row[5]); + entry.spawn_type = atoi(row[6]); + entry.movement = atoi(row[7]); + entry.duration = atoi(row[8]); + entry.icon = atoi(row[9]); + entry.cast_time = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Auras entry{}; + + entry.type = atoi(row[0]); + entry.npc_type = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.spell_id = atoi(row[3]); + entry.distance = atoi(row[4]); + entry.aura_type = atoi(row[5]); + entry.spawn_type = atoi(row[6]); + entry.movement = atoi(row[7]); + entry.duration = atoi(row[8]); + entry.icon = atoi(row[9]); + entry.cast_time = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_AURAS_REPOSITORY_H diff --git a/common/repositories/base/base_base_data_repository.h b/common/repositories/base/base_base_data_repository.h new file mode 100644 index 000000000..3574f254a --- /dev/null +++ b/common/repositories/base/base_base_data_repository.h @@ -0,0 +1,365 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_BASE_DATA_REPOSITORY_H +#define EQEMU_BASE_BASE_DATA_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseBaseDataRepository { +public: + struct BaseData { + int level; + int class; + float hp; + float mana; + float end; + float unk1; + float unk2; + float hp_fac; + float mana_fac; + float end_fac; + }; + + static std::string PrimaryKey() + { + return std::string("level"); + } + + static std::vector Columns() + { + return { + "level", + "class", + "hp", + "mana", + "end", + "unk1", + "unk2", + "hp_fac", + "mana_fac", + "end_fac", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("base_data"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static BaseData NewEntity() + { + BaseData entry{}; + + entry.level = 0; + entry.class = 0; + entry.hp = 0; + entry.mana = 0; + entry.end = 0; + entry.unk1 = 0; + entry.unk2 = 0; + entry.hp_fac = 0; + entry.mana_fac = 0; + entry.end_fac = 0; + + return entry; + } + + static BaseData GetBaseDataEntry( + const std::vector &base_datas, + int base_data_id + ) + { + for (auto &base_data : base_datas) { + if (base_data.level == base_data_id) { + return base_data; + } + } + + return NewEntity(); + } + + static BaseData FindOne( + Database& db, + int base_data_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + base_data_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + BaseData entry{}; + + entry.level = atoi(row[0]); + entry.class = atoi(row[1]); + entry.hp = static_cast(atof(row[2])); + entry.mana = static_cast(atof(row[3])); + entry.end = static_cast(atof(row[4])); + entry.unk1 = static_cast(atof(row[5])); + entry.unk2 = static_cast(atof(row[6])); + entry.hp_fac = static_cast(atof(row[7])); + entry.mana_fac = static_cast(atof(row[8])); + entry.end_fac = static_cast(atof(row[9])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int base_data_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + base_data_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + BaseData base_data_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(base_data_entry.level)); + update_values.push_back(columns[1] + " = " + std::to_string(base_data_entry.class)); + update_values.push_back(columns[2] + " = " + std::to_string(base_data_entry.hp)); + update_values.push_back(columns[3] + " = " + std::to_string(base_data_entry.mana)); + update_values.push_back(columns[4] + " = " + std::to_string(base_data_entry.end)); + update_values.push_back(columns[5] + " = " + std::to_string(base_data_entry.unk1)); + update_values.push_back(columns[6] + " = " + std::to_string(base_data_entry.unk2)); + update_values.push_back(columns[7] + " = " + std::to_string(base_data_entry.hp_fac)); + update_values.push_back(columns[8] + " = " + std::to_string(base_data_entry.mana_fac)); + update_values.push_back(columns[9] + " = " + std::to_string(base_data_entry.end_fac)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + base_data_entry.level + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static BaseData InsertOne( + Database& db, + BaseData base_data_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(base_data_entry.level)); + insert_values.push_back(std::to_string(base_data_entry.class)); + insert_values.push_back(std::to_string(base_data_entry.hp)); + insert_values.push_back(std::to_string(base_data_entry.mana)); + insert_values.push_back(std::to_string(base_data_entry.end)); + insert_values.push_back(std::to_string(base_data_entry.unk1)); + insert_values.push_back(std::to_string(base_data_entry.unk2)); + insert_values.push_back(std::to_string(base_data_entry.hp_fac)); + insert_values.push_back(std::to_string(base_data_entry.mana_fac)); + insert_values.push_back(std::to_string(base_data_entry.end_fac)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + base_data_entry.level = results.LastInsertedID(); + return base_data_entry; + } + + base_data_entry = NewEntity(); + + return base_data_entry; + } + + static int InsertMany( + Database& db, + std::vector base_data_entries + ) + { + std::vector insert_chunks; + + for (auto &base_data_entry: base_data_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(base_data_entry.level)); + insert_values.push_back(std::to_string(base_data_entry.class)); + insert_values.push_back(std::to_string(base_data_entry.hp)); + insert_values.push_back(std::to_string(base_data_entry.mana)); + insert_values.push_back(std::to_string(base_data_entry.end)); + insert_values.push_back(std::to_string(base_data_entry.unk1)); + insert_values.push_back(std::to_string(base_data_entry.unk2)); + insert_values.push_back(std::to_string(base_data_entry.hp_fac)); + insert_values.push_back(std::to_string(base_data_entry.mana_fac)); + insert_values.push_back(std::to_string(base_data_entry.end_fac)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + BaseData entry{}; + + entry.level = atoi(row[0]); + entry.class = atoi(row[1]); + entry.hp = static_cast(atof(row[2])); + entry.mana = static_cast(atof(row[3])); + entry.end = static_cast(atof(row[4])); + entry.unk1 = static_cast(atof(row[5])); + entry.unk2 = static_cast(atof(row[6])); + entry.hp_fac = static_cast(atof(row[7])); + entry.mana_fac = static_cast(atof(row[8])); + entry.end_fac = static_cast(atof(row[9])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + BaseData entry{}; + + entry.level = atoi(row[0]); + entry.class = atoi(row[1]); + entry.hp = static_cast(atof(row[2])); + entry.mana = static_cast(atof(row[3])); + entry.end = static_cast(atof(row[4])); + entry.unk1 = static_cast(atof(row[5])); + entry.unk2 = static_cast(atof(row[6])); + entry.hp_fac = static_cast(atof(row[7])); + entry.mana_fac = static_cast(atof(row[8])); + entry.end_fac = static_cast(atof(row[9])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_BASE_DATA_REPOSITORY_H diff --git a/common/repositories/base/base_blocked_spells_repository.h b/common/repositories/base/base_blocked_spells_repository.h new file mode 100644 index 000000000..d17524a2c --- /dev/null +++ b/common/repositories/base/base_blocked_spells_repository.h @@ -0,0 +1,382 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_BLOCKED_SPELLS_REPOSITORY_H +#define EQEMU_BASE_BLOCKED_SPELLS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseBlockedSpellsRepository { +public: + struct BlockedSpells { + int id; + int spellid; + int type; + int zoneid; + float x; + float y; + float z; + float x_diff; + float y_diff; + float z_diff; + std::string message; + std::string description; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "spellid", + "type", + "zoneid", + "x", + "y", + "z", + "x_diff", + "y_diff", + "z_diff", + "message", + "description", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("blocked_spells"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static BlockedSpells NewEntity() + { + BlockedSpells entry{}; + + entry.id = 0; + entry.spellid = 0; + entry.type = 0; + entry.zoneid = 0; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.x_diff = 0; + entry.y_diff = 0; + entry.z_diff = 0; + entry.message = ""; + entry.description = ""; + + return entry; + } + + static BlockedSpells GetBlockedSpellsEntry( + const std::vector &blocked_spellss, + int blocked_spells_id + ) + { + for (auto &blocked_spells : blocked_spellss) { + if (blocked_spells.id == blocked_spells_id) { + return blocked_spells; + } + } + + return NewEntity(); + } + + static BlockedSpells FindOne( + Database& db, + int blocked_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + blocked_spells_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + BlockedSpells entry{}; + + entry.id = atoi(row[0]); + entry.spellid = atoi(row[1]); + entry.type = atoi(row[2]); + entry.zoneid = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.x_diff = static_cast(atof(row[7])); + entry.y_diff = static_cast(atof(row[8])); + entry.z_diff = static_cast(atof(row[9])); + entry.message = row[10] ? row[10] : ""; + entry.description = row[11] ? row[11] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int blocked_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + blocked_spells_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + BlockedSpells blocked_spells_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(blocked_spells_entry.spellid)); + update_values.push_back(columns[2] + " = " + std::to_string(blocked_spells_entry.type)); + update_values.push_back(columns[3] + " = " + std::to_string(blocked_spells_entry.zoneid)); + update_values.push_back(columns[4] + " = " + std::to_string(blocked_spells_entry.x)); + update_values.push_back(columns[5] + " = " + std::to_string(blocked_spells_entry.y)); + update_values.push_back(columns[6] + " = " + std::to_string(blocked_spells_entry.z)); + update_values.push_back(columns[7] + " = " + std::to_string(blocked_spells_entry.x_diff)); + update_values.push_back(columns[8] + " = " + std::to_string(blocked_spells_entry.y_diff)); + update_values.push_back(columns[9] + " = " + std::to_string(blocked_spells_entry.z_diff)); + update_values.push_back(columns[10] + " = '" + EscapeString(blocked_spells_entry.message) + "'"); + update_values.push_back(columns[11] + " = '" + EscapeString(blocked_spells_entry.description) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + blocked_spells_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static BlockedSpells InsertOne( + Database& db, + BlockedSpells blocked_spells_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(blocked_spells_entry.id)); + insert_values.push_back(std::to_string(blocked_spells_entry.spellid)); + insert_values.push_back(std::to_string(blocked_spells_entry.type)); + insert_values.push_back(std::to_string(blocked_spells_entry.zoneid)); + insert_values.push_back(std::to_string(blocked_spells_entry.x)); + insert_values.push_back(std::to_string(blocked_spells_entry.y)); + insert_values.push_back(std::to_string(blocked_spells_entry.z)); + insert_values.push_back(std::to_string(blocked_spells_entry.x_diff)); + insert_values.push_back(std::to_string(blocked_spells_entry.y_diff)); + insert_values.push_back(std::to_string(blocked_spells_entry.z_diff)); + insert_values.push_back("'" + EscapeString(blocked_spells_entry.message) + "'"); + insert_values.push_back("'" + EscapeString(blocked_spells_entry.description) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + blocked_spells_entry.id = results.LastInsertedID(); + return blocked_spells_entry; + } + + blocked_spells_entry = NewEntity(); + + return blocked_spells_entry; + } + + static int InsertMany( + Database& db, + std::vector blocked_spells_entries + ) + { + std::vector insert_chunks; + + for (auto &blocked_spells_entry: blocked_spells_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(blocked_spells_entry.id)); + insert_values.push_back(std::to_string(blocked_spells_entry.spellid)); + insert_values.push_back(std::to_string(blocked_spells_entry.type)); + insert_values.push_back(std::to_string(blocked_spells_entry.zoneid)); + insert_values.push_back(std::to_string(blocked_spells_entry.x)); + insert_values.push_back(std::to_string(blocked_spells_entry.y)); + insert_values.push_back(std::to_string(blocked_spells_entry.z)); + insert_values.push_back(std::to_string(blocked_spells_entry.x_diff)); + insert_values.push_back(std::to_string(blocked_spells_entry.y_diff)); + insert_values.push_back(std::to_string(blocked_spells_entry.z_diff)); + insert_values.push_back("'" + EscapeString(blocked_spells_entry.message) + "'"); + insert_values.push_back("'" + EscapeString(blocked_spells_entry.description) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + BlockedSpells entry{}; + + entry.id = atoi(row[0]); + entry.spellid = atoi(row[1]); + entry.type = atoi(row[2]); + entry.zoneid = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.x_diff = static_cast(atof(row[7])); + entry.y_diff = static_cast(atof(row[8])); + entry.z_diff = static_cast(atof(row[9])); + entry.message = row[10] ? row[10] : ""; + entry.description = row[11] ? row[11] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + BlockedSpells entry{}; + + entry.id = atoi(row[0]); + entry.spellid = atoi(row[1]); + entry.type = atoi(row[2]); + entry.zoneid = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.x_diff = static_cast(atof(row[7])); + entry.y_diff = static_cast(atof(row[8])); + entry.z_diff = static_cast(atof(row[9])); + entry.message = row[10] ? row[10] : ""; + entry.description = row[11] ? row[11] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_BLOCKED_SPELLS_REPOSITORY_H diff --git a/common/repositories/base/base_bug_reports_repository.h b/common/repositories/base/base_bug_reports_repository.h new file mode 100644 index 000000000..ecd1335ef --- /dev/null +++ b/common/repositories/base/base_bug_reports_repository.h @@ -0,0 +1,562 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_BUG_REPORTS_REPOSITORY_H +#define EQEMU_BASE_BUG_REPORTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseBugReportsRepository { +public: + struct BugReports { + int id; + std::string zone; + int client_version_id; + std::string client_version_name; + int account_id; + int character_id; + std::string character_name; + int reporter_spoof; + int category_id; + std::string category_name; + std::string reporter_name; + std::string ui_path; + float pos_x; + float pos_y; + float pos_z; + int heading; + int time_played; + int target_id; + std::string target_name; + int optional_info_mask; + int _can_duplicate; + int _crash_bug; + int _target_info; + int _character_flags; + int _unknown_value; + std::string bug_report; + std::string system_info; + std::string report_datetime; + int bug_status; + std::string last_review; + std::string last_reviewer; + std::string reviewer_notes; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "client_version_id", + "client_version_name", + "account_id", + "character_id", + "character_name", + "reporter_spoof", + "category_id", + "category_name", + "reporter_name", + "ui_path", + "pos_x", + "pos_y", + "pos_z", + "heading", + "time_played", + "target_id", + "target_name", + "optional_info_mask", + "_can_duplicate", + "_crash_bug", + "_target_info", + "_character_flags", + "_unknown_value", + "bug_report", + "system_info", + "report_datetime", + "bug_status", + "last_review", + "last_reviewer", + "reviewer_notes", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("bug_reports"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static BugReports NewEntity() + { + BugReports entry{}; + + entry.id = 0; + entry.zone = "Unknown"; + entry.client_version_id = 0; + entry.client_version_name = "Unknown"; + entry.account_id = 0; + entry.character_id = 0; + entry.character_name = "Unknown"; + entry.reporter_spoof = 1; + entry.category_id = 0; + entry.category_name = "Other"; + entry.reporter_name = "Unknown"; + entry.ui_path = "Unknown"; + entry.pos_x = 0; + entry.pos_y = 0; + entry.pos_z = 0; + entry.heading = 0; + entry.time_played = 0; + entry.target_id = 0; + entry.target_name = "Unknown"; + entry.optional_info_mask = 0; + entry._can_duplicate = 0; + entry._crash_bug = 0; + entry._target_info = 0; + entry._character_flags = 0; + entry._unknown_value = 0; + entry.bug_report = ""; + entry.system_info = ""; + entry.report_datetime = current_timestamp(); + entry.bug_status = 0; + entry.last_review = current_timestamp(); + entry.last_reviewer = "None"; + entry.reviewer_notes = ""; + + return entry; + } + + static BugReports GetBugReportsEntry( + const std::vector &bug_reportss, + int bug_reports_id + ) + { + for (auto &bug_reports : bug_reportss) { + if (bug_reports.id == bug_reports_id) { + return bug_reports; + } + } + + return NewEntity(); + } + + static BugReports FindOne( + Database& db, + int bug_reports_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + bug_reports_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + BugReports entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.client_version_id = atoi(row[2]); + entry.client_version_name = row[3] ? row[3] : ""; + entry.account_id = atoi(row[4]); + entry.character_id = atoi(row[5]); + entry.character_name = row[6] ? row[6] : ""; + entry.reporter_spoof = atoi(row[7]); + entry.category_id = atoi(row[8]); + entry.category_name = row[9] ? row[9] : ""; + entry.reporter_name = row[10] ? row[10] : ""; + entry.ui_path = row[11] ? row[11] : ""; + entry.pos_x = static_cast(atof(row[12])); + entry.pos_y = static_cast(atof(row[13])); + entry.pos_z = static_cast(atof(row[14])); + entry.heading = atoi(row[15]); + entry.time_played = atoi(row[16]); + entry.target_id = atoi(row[17]); + entry.target_name = row[18] ? row[18] : ""; + entry.optional_info_mask = atoi(row[19]); + entry._can_duplicate = atoi(row[20]); + entry._crash_bug = atoi(row[21]); + entry._target_info = atoi(row[22]); + entry._character_flags = atoi(row[23]); + entry._unknown_value = atoi(row[24]); + entry.bug_report = row[25] ? row[25] : ""; + entry.system_info = row[26] ? row[26] : ""; + entry.report_datetime = row[27] ? row[27] : ""; + entry.bug_status = atoi(row[28]); + entry.last_review = row[29] ? row[29] : ""; + entry.last_reviewer = row[30] ? row[30] : ""; + entry.reviewer_notes = row[31] ? row[31] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int bug_reports_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + bug_reports_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + BugReports bug_reports_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(bug_reports_entry.zone) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(bug_reports_entry.client_version_id)); + update_values.push_back(columns[3] + " = '" + EscapeString(bug_reports_entry.client_version_name) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(bug_reports_entry.account_id)); + update_values.push_back(columns[5] + " = " + std::to_string(bug_reports_entry.character_id)); + update_values.push_back(columns[6] + " = '" + EscapeString(bug_reports_entry.character_name) + "'"); + update_values.push_back(columns[7] + " = " + std::to_string(bug_reports_entry.reporter_spoof)); + update_values.push_back(columns[8] + " = " + std::to_string(bug_reports_entry.category_id)); + update_values.push_back(columns[9] + " = '" + EscapeString(bug_reports_entry.category_name) + "'"); + update_values.push_back(columns[10] + " = '" + EscapeString(bug_reports_entry.reporter_name) + "'"); + update_values.push_back(columns[11] + " = '" + EscapeString(bug_reports_entry.ui_path) + "'"); + update_values.push_back(columns[12] + " = " + std::to_string(bug_reports_entry.pos_x)); + update_values.push_back(columns[13] + " = " + std::to_string(bug_reports_entry.pos_y)); + update_values.push_back(columns[14] + " = " + std::to_string(bug_reports_entry.pos_z)); + update_values.push_back(columns[15] + " = " + std::to_string(bug_reports_entry.heading)); + update_values.push_back(columns[16] + " = " + std::to_string(bug_reports_entry.time_played)); + update_values.push_back(columns[17] + " = " + std::to_string(bug_reports_entry.target_id)); + update_values.push_back(columns[18] + " = '" + EscapeString(bug_reports_entry.target_name) + "'"); + update_values.push_back(columns[19] + " = " + std::to_string(bug_reports_entry.optional_info_mask)); + update_values.push_back(columns[20] + " = " + std::to_string(bug_reports_entry._can_duplicate)); + update_values.push_back(columns[21] + " = " + std::to_string(bug_reports_entry._crash_bug)); + update_values.push_back(columns[22] + " = " + std::to_string(bug_reports_entry._target_info)); + update_values.push_back(columns[23] + " = " + std::to_string(bug_reports_entry._character_flags)); + update_values.push_back(columns[24] + " = " + std::to_string(bug_reports_entry._unknown_value)); + update_values.push_back(columns[25] + " = '" + EscapeString(bug_reports_entry.bug_report) + "'"); + update_values.push_back(columns[26] + " = '" + EscapeString(bug_reports_entry.system_info) + "'"); + update_values.push_back(columns[27] + " = '" + EscapeString(bug_reports_entry.report_datetime) + "'"); + update_values.push_back(columns[28] + " = " + std::to_string(bug_reports_entry.bug_status)); + update_values.push_back(columns[29] + " = '" + EscapeString(bug_reports_entry.last_review) + "'"); + update_values.push_back(columns[30] + " = '" + EscapeString(bug_reports_entry.last_reviewer) + "'"); + update_values.push_back(columns[31] + " = '" + EscapeString(bug_reports_entry.reviewer_notes) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + bug_reports_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static BugReports InsertOne( + Database& db, + BugReports bug_reports_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(bug_reports_entry.id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.zone) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.client_version_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.client_version_name) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.account_id)); + insert_values.push_back(std::to_string(bug_reports_entry.character_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.character_name) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.reporter_spoof)); + insert_values.push_back(std::to_string(bug_reports_entry.category_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.category_name) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.reporter_name) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.ui_path) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.pos_x)); + insert_values.push_back(std::to_string(bug_reports_entry.pos_y)); + insert_values.push_back(std::to_string(bug_reports_entry.pos_z)); + insert_values.push_back(std::to_string(bug_reports_entry.heading)); + insert_values.push_back(std::to_string(bug_reports_entry.time_played)); + insert_values.push_back(std::to_string(bug_reports_entry.target_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.target_name) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.optional_info_mask)); + insert_values.push_back(std::to_string(bug_reports_entry._can_duplicate)); + insert_values.push_back(std::to_string(bug_reports_entry._crash_bug)); + insert_values.push_back(std::to_string(bug_reports_entry._target_info)); + insert_values.push_back(std::to_string(bug_reports_entry._character_flags)); + insert_values.push_back(std::to_string(bug_reports_entry._unknown_value)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.bug_report) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.system_info) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.report_datetime) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.bug_status)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.last_review) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.last_reviewer) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.reviewer_notes) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + bug_reports_entry.id = results.LastInsertedID(); + return bug_reports_entry; + } + + bug_reports_entry = NewEntity(); + + return bug_reports_entry; + } + + static int InsertMany( + Database& db, + std::vector bug_reports_entries + ) + { + std::vector insert_chunks; + + for (auto &bug_reports_entry: bug_reports_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(bug_reports_entry.id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.zone) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.client_version_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.client_version_name) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.account_id)); + insert_values.push_back(std::to_string(bug_reports_entry.character_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.character_name) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.reporter_spoof)); + insert_values.push_back(std::to_string(bug_reports_entry.category_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.category_name) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.reporter_name) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.ui_path) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.pos_x)); + insert_values.push_back(std::to_string(bug_reports_entry.pos_y)); + insert_values.push_back(std::to_string(bug_reports_entry.pos_z)); + insert_values.push_back(std::to_string(bug_reports_entry.heading)); + insert_values.push_back(std::to_string(bug_reports_entry.time_played)); + insert_values.push_back(std::to_string(bug_reports_entry.target_id)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.target_name) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.optional_info_mask)); + insert_values.push_back(std::to_string(bug_reports_entry._can_duplicate)); + insert_values.push_back(std::to_string(bug_reports_entry._crash_bug)); + insert_values.push_back(std::to_string(bug_reports_entry._target_info)); + insert_values.push_back(std::to_string(bug_reports_entry._character_flags)); + insert_values.push_back(std::to_string(bug_reports_entry._unknown_value)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.bug_report) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.system_info) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.report_datetime) + "'"); + insert_values.push_back(std::to_string(bug_reports_entry.bug_status)); + insert_values.push_back("'" + EscapeString(bug_reports_entry.last_review) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.last_reviewer) + "'"); + insert_values.push_back("'" + EscapeString(bug_reports_entry.reviewer_notes) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + BugReports entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.client_version_id = atoi(row[2]); + entry.client_version_name = row[3] ? row[3] : ""; + entry.account_id = atoi(row[4]); + entry.character_id = atoi(row[5]); + entry.character_name = row[6] ? row[6] : ""; + entry.reporter_spoof = atoi(row[7]); + entry.category_id = atoi(row[8]); + entry.category_name = row[9] ? row[9] : ""; + entry.reporter_name = row[10] ? row[10] : ""; + entry.ui_path = row[11] ? row[11] : ""; + entry.pos_x = static_cast(atof(row[12])); + entry.pos_y = static_cast(atof(row[13])); + entry.pos_z = static_cast(atof(row[14])); + entry.heading = atoi(row[15]); + entry.time_played = atoi(row[16]); + entry.target_id = atoi(row[17]); + entry.target_name = row[18] ? row[18] : ""; + entry.optional_info_mask = atoi(row[19]); + entry._can_duplicate = atoi(row[20]); + entry._crash_bug = atoi(row[21]); + entry._target_info = atoi(row[22]); + entry._character_flags = atoi(row[23]); + entry._unknown_value = atoi(row[24]); + entry.bug_report = row[25] ? row[25] : ""; + entry.system_info = row[26] ? row[26] : ""; + entry.report_datetime = row[27] ? row[27] : ""; + entry.bug_status = atoi(row[28]); + entry.last_review = row[29] ? row[29] : ""; + entry.last_reviewer = row[30] ? row[30] : ""; + entry.reviewer_notes = row[31] ? row[31] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + BugReports entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.client_version_id = atoi(row[2]); + entry.client_version_name = row[3] ? row[3] : ""; + entry.account_id = atoi(row[4]); + entry.character_id = atoi(row[5]); + entry.character_name = row[6] ? row[6] : ""; + entry.reporter_spoof = atoi(row[7]); + entry.category_id = atoi(row[8]); + entry.category_name = row[9] ? row[9] : ""; + entry.reporter_name = row[10] ? row[10] : ""; + entry.ui_path = row[11] ? row[11] : ""; + entry.pos_x = static_cast(atof(row[12])); + entry.pos_y = static_cast(atof(row[13])); + entry.pos_z = static_cast(atof(row[14])); + entry.heading = atoi(row[15]); + entry.time_played = atoi(row[16]); + entry.target_id = atoi(row[17]); + entry.target_name = row[18] ? row[18] : ""; + entry.optional_info_mask = atoi(row[19]); + entry._can_duplicate = atoi(row[20]); + entry._crash_bug = atoi(row[21]); + entry._target_info = atoi(row[22]); + entry._character_flags = atoi(row[23]); + entry._unknown_value = atoi(row[24]); + entry.bug_report = row[25] ? row[25] : ""; + entry.system_info = row[26] ? row[26] : ""; + entry.report_datetime = row[27] ? row[27] : ""; + entry.bug_status = atoi(row[28]); + entry.last_review = row[29] ? row[29] : ""; + entry.last_reviewer = row[30] ? row[30] : ""; + entry.reviewer_notes = row[31] ? row[31] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_BUG_REPORTS_REPOSITORY_H diff --git a/common/repositories/base/base_bugs_repository.h b/common/repositories/base/base_bugs_repository.h new file mode 100644 index 000000000..9ac9b9330 --- /dev/null +++ b/common/repositories/base/base_bugs_repository.h @@ -0,0 +1,391 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_BUGS_REPOSITORY_H +#define EQEMU_BASE_BUGS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseBugsRepository { +public: + struct Bugs { + int id; + std::string zone; + std::string name; + std::string ui; + float x; + float y; + float z; + std::string type; + int flag; + std::string target; + std::string bug; + std::string date; + int status; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "name", + "ui", + "x", + "y", + "z", + "type", + "flag", + "target", + "bug", + "date", + "status", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("bugs"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Bugs NewEntity() + { + Bugs entry{}; + + entry.id = 0; + entry.zone = ""; + entry.name = ""; + entry.ui = ""; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.type = ""; + entry.flag = 0; + entry.target = ""; + entry.bug = ""; + entry.date = 0; + entry.status = 0; + + return entry; + } + + static Bugs GetBugsEntry( + const std::vector &bugss, + int bugs_id + ) + { + for (auto &bugs : bugss) { + if (bugs.id == bugs_id) { + return bugs; + } + } + + return NewEntity(); + } + + static Bugs FindOne( + Database& db, + int bugs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + bugs_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Bugs entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.name = row[2] ? row[2] : ""; + entry.ui = row[3] ? row[3] : ""; + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.type = row[7] ? row[7] : ""; + entry.flag = atoi(row[8]); + entry.target = row[9] ? row[9] : ""; + entry.bug = row[10] ? row[10] : ""; + entry.date = row[11] ? row[11] : ""; + entry.status = atoi(row[12]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int bugs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + bugs_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Bugs bugs_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(bugs_entry.zone) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(bugs_entry.name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(bugs_entry.ui) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(bugs_entry.x)); + update_values.push_back(columns[5] + " = " + std::to_string(bugs_entry.y)); + update_values.push_back(columns[6] + " = " + std::to_string(bugs_entry.z)); + update_values.push_back(columns[7] + " = '" + EscapeString(bugs_entry.type) + "'"); + update_values.push_back(columns[8] + " = " + std::to_string(bugs_entry.flag)); + update_values.push_back(columns[9] + " = '" + EscapeString(bugs_entry.target) + "'"); + update_values.push_back(columns[10] + " = '" + EscapeString(bugs_entry.bug) + "'"); + update_values.push_back(columns[11] + " = '" + EscapeString(bugs_entry.date) + "'"); + update_values.push_back(columns[12] + " = " + std::to_string(bugs_entry.status)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + bugs_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Bugs InsertOne( + Database& db, + Bugs bugs_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(bugs_entry.id)); + insert_values.push_back("'" + EscapeString(bugs_entry.zone) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.ui) + "'"); + insert_values.push_back(std::to_string(bugs_entry.x)); + insert_values.push_back(std::to_string(bugs_entry.y)); + insert_values.push_back(std::to_string(bugs_entry.z)); + insert_values.push_back("'" + EscapeString(bugs_entry.type) + "'"); + insert_values.push_back(std::to_string(bugs_entry.flag)); + insert_values.push_back("'" + EscapeString(bugs_entry.target) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.bug) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.date) + "'"); + insert_values.push_back(std::to_string(bugs_entry.status)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + bugs_entry.id = results.LastInsertedID(); + return bugs_entry; + } + + bugs_entry = NewEntity(); + + return bugs_entry; + } + + static int InsertMany( + Database& db, + std::vector bugs_entries + ) + { + std::vector insert_chunks; + + for (auto &bugs_entry: bugs_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(bugs_entry.id)); + insert_values.push_back("'" + EscapeString(bugs_entry.zone) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.ui) + "'"); + insert_values.push_back(std::to_string(bugs_entry.x)); + insert_values.push_back(std::to_string(bugs_entry.y)); + insert_values.push_back(std::to_string(bugs_entry.z)); + insert_values.push_back("'" + EscapeString(bugs_entry.type) + "'"); + insert_values.push_back(std::to_string(bugs_entry.flag)); + insert_values.push_back("'" + EscapeString(bugs_entry.target) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.bug) + "'"); + insert_values.push_back("'" + EscapeString(bugs_entry.date) + "'"); + insert_values.push_back(std::to_string(bugs_entry.status)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Bugs entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.name = row[2] ? row[2] : ""; + entry.ui = row[3] ? row[3] : ""; + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.type = row[7] ? row[7] : ""; + entry.flag = atoi(row[8]); + entry.target = row[9] ? row[9] : ""; + entry.bug = row[10] ? row[10] : ""; + entry.date = row[11] ? row[11] : ""; + entry.status = atoi(row[12]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Bugs entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.name = row[2] ? row[2] : ""; + entry.ui = row[3] ? row[3] : ""; + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.type = row[7] ? row[7] : ""; + entry.flag = atoi(row[8]); + entry.target = row[9] ? row[9] : ""; + entry.bug = row[10] ? row[10] : ""; + entry.date = row[11] ? row[11] : ""; + entry.status = atoi(row[12]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_BUGS_REPOSITORY_H diff --git a/common/repositories/base/base_buyer_repository.h b/common/repositories/base/base_buyer_repository.h new file mode 100644 index 000000000..1b1cb9800 --- /dev/null +++ b/common/repositories/base/base_buyer_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_BUYER_REPOSITORY_H +#define EQEMU_BASE_BUYER_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseBuyerRepository { +public: + struct Buyer { + int charid; + int buyslot; + int itemid; + std::string itemname; + int quantity; + int price; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "buyslot", + "itemid", + "itemname", + "quantity", + "price", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("buyer"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Buyer NewEntity() + { + Buyer entry{}; + + entry.charid = 0; + entry.buyslot = 0; + entry.itemid = 0; + entry.itemname = ""; + entry.quantity = 0; + entry.price = 0; + + return entry; + } + + static Buyer GetBuyerEntry( + const std::vector &buyers, + int buyer_id + ) + { + for (auto &buyer : buyers) { + if (buyer.charid == buyer_id) { + return buyer; + } + } + + return NewEntity(); + } + + static Buyer FindOne( + Database& db, + int buyer_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + buyer_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Buyer entry{}; + + entry.charid = atoi(row[0]); + entry.buyslot = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.itemname = row[3] ? row[3] : ""; + entry.quantity = atoi(row[4]); + entry.price = atoi(row[5]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int buyer_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + buyer_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Buyer buyer_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(buyer_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(buyer_entry.buyslot)); + update_values.push_back(columns[2] + " = " + std::to_string(buyer_entry.itemid)); + update_values.push_back(columns[3] + " = '" + EscapeString(buyer_entry.itemname) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(buyer_entry.quantity)); + update_values.push_back(columns[5] + " = " + std::to_string(buyer_entry.price)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + buyer_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Buyer InsertOne( + Database& db, + Buyer buyer_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(buyer_entry.charid)); + insert_values.push_back(std::to_string(buyer_entry.buyslot)); + insert_values.push_back(std::to_string(buyer_entry.itemid)); + insert_values.push_back("'" + EscapeString(buyer_entry.itemname) + "'"); + insert_values.push_back(std::to_string(buyer_entry.quantity)); + insert_values.push_back(std::to_string(buyer_entry.price)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + buyer_entry.charid = results.LastInsertedID(); + return buyer_entry; + } + + buyer_entry = NewEntity(); + + return buyer_entry; + } + + static int InsertMany( + Database& db, + std::vector buyer_entries + ) + { + std::vector insert_chunks; + + for (auto &buyer_entry: buyer_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(buyer_entry.charid)); + insert_values.push_back(std::to_string(buyer_entry.buyslot)); + insert_values.push_back(std::to_string(buyer_entry.itemid)); + insert_values.push_back("'" + EscapeString(buyer_entry.itemname) + "'"); + insert_values.push_back(std::to_string(buyer_entry.quantity)); + insert_values.push_back(std::to_string(buyer_entry.price)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Buyer entry{}; + + entry.charid = atoi(row[0]); + entry.buyslot = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.itemname = row[3] ? row[3] : ""; + entry.quantity = atoi(row[4]); + entry.price = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Buyer entry{}; + + entry.charid = atoi(row[0]); + entry.buyslot = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.itemname = row[3] ? row[3] : ""; + entry.quantity = atoi(row[4]); + entry.price = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_BUYER_REPOSITORY_H diff --git a/common/repositories/base/base_char_create_combinations_repository.h b/common/repositories/base/base_char_create_combinations_repository.h new file mode 100644 index 000000000..ed806d6bd --- /dev/null +++ b/common/repositories/base/base_char_create_combinations_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHAR_CREATE_COMBINATIONS_REPOSITORY_H +#define EQEMU_BASE_CHAR_CREATE_COMBINATIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharCreateCombinationsRepository { +public: + struct CharCreateCombinations { + int allocation_id; + int race; + int class; + int deity; + int start_zone; + int expansions_req; + }; + + static std::string PrimaryKey() + { + return std::string("race"); + } + + static std::vector Columns() + { + return { + "allocation_id", + "race", + "class", + "deity", + "start_zone", + "expansions_req", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("char_create_combinations"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharCreateCombinations NewEntity() + { + CharCreateCombinations entry{}; + + entry.allocation_id = 0; + entry.race = 0; + entry.class = 0; + entry.deity = 0; + entry.start_zone = 0; + entry.expansions_req = 0; + + return entry; + } + + static CharCreateCombinations GetCharCreateCombinationsEntry( + const std::vector &char_create_combinationss, + int char_create_combinations_id + ) + { + for (auto &char_create_combinations : char_create_combinationss) { + if (char_create_combinations.race == char_create_combinations_id) { + return char_create_combinations; + } + } + + return NewEntity(); + } + + static CharCreateCombinations FindOne( + Database& db, + int char_create_combinations_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + char_create_combinations_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharCreateCombinations entry{}; + + entry.allocation_id = atoi(row[0]); + entry.race = atoi(row[1]); + entry.class = atoi(row[2]); + entry.deity = atoi(row[3]); + entry.start_zone = atoi(row[4]); + entry.expansions_req = atoi(row[5]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int char_create_combinations_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + char_create_combinations_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharCreateCombinations char_create_combinations_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(char_create_combinations_entry.allocation_id)); + update_values.push_back(columns[1] + " = " + std::to_string(char_create_combinations_entry.race)); + update_values.push_back(columns[2] + " = " + std::to_string(char_create_combinations_entry.class)); + update_values.push_back(columns[3] + " = " + std::to_string(char_create_combinations_entry.deity)); + update_values.push_back(columns[4] + " = " + std::to_string(char_create_combinations_entry.start_zone)); + update_values.push_back(columns[5] + " = " + std::to_string(char_create_combinations_entry.expansions_req)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + char_create_combinations_entry.race + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharCreateCombinations InsertOne( + Database& db, + CharCreateCombinations char_create_combinations_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(char_create_combinations_entry.allocation_id)); + insert_values.push_back(std::to_string(char_create_combinations_entry.race)); + insert_values.push_back(std::to_string(char_create_combinations_entry.class)); + insert_values.push_back(std::to_string(char_create_combinations_entry.deity)); + insert_values.push_back(std::to_string(char_create_combinations_entry.start_zone)); + insert_values.push_back(std::to_string(char_create_combinations_entry.expansions_req)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + char_create_combinations_entry.race = results.LastInsertedID(); + return char_create_combinations_entry; + } + + char_create_combinations_entry = NewEntity(); + + return char_create_combinations_entry; + } + + static int InsertMany( + Database& db, + std::vector char_create_combinations_entries + ) + { + std::vector insert_chunks; + + for (auto &char_create_combinations_entry: char_create_combinations_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(char_create_combinations_entry.allocation_id)); + insert_values.push_back(std::to_string(char_create_combinations_entry.race)); + insert_values.push_back(std::to_string(char_create_combinations_entry.class)); + insert_values.push_back(std::to_string(char_create_combinations_entry.deity)); + insert_values.push_back(std::to_string(char_create_combinations_entry.start_zone)); + insert_values.push_back(std::to_string(char_create_combinations_entry.expansions_req)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharCreateCombinations entry{}; + + entry.allocation_id = atoi(row[0]); + entry.race = atoi(row[1]); + entry.class = atoi(row[2]); + entry.deity = atoi(row[3]); + entry.start_zone = atoi(row[4]); + entry.expansions_req = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharCreateCombinations entry{}; + + entry.allocation_id = atoi(row[0]); + entry.race = atoi(row[1]); + entry.class = atoi(row[2]); + entry.deity = atoi(row[3]); + entry.start_zone = atoi(row[4]); + entry.expansions_req = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHAR_CREATE_COMBINATIONS_REPOSITORY_H diff --git a/common/repositories/base/base_char_create_point_allocations_repository.h b/common/repositories/base/base_char_create_point_allocations_repository.h new file mode 100644 index 000000000..7b3f4a2d6 --- /dev/null +++ b/common/repositories/base/base_char_create_point_allocations_repository.h @@ -0,0 +1,410 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H +#define EQEMU_BASE_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharCreatePointAllocationsRepository { +public: + struct CharCreatePointAllocations { + int id; + int base_str; + int base_sta; + int base_dex; + int base_agi; + int base_int; + int base_wis; + int base_cha; + int alloc_str; + int alloc_sta; + int alloc_dex; + int alloc_agi; + int alloc_int; + int alloc_wis; + int alloc_cha; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "base_str", + "base_sta", + "base_dex", + "base_agi", + "base_int", + "base_wis", + "base_cha", + "alloc_str", + "alloc_sta", + "alloc_dex", + "alloc_agi", + "alloc_int", + "alloc_wis", + "alloc_cha", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("char_create_point_allocations"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharCreatePointAllocations NewEntity() + { + CharCreatePointAllocations entry{}; + + entry.id = 0; + entry.base_str = 0; + entry.base_sta = 0; + entry.base_dex = 0; + entry.base_agi = 0; + entry.base_int = 0; + entry.base_wis = 0; + entry.base_cha = 0; + entry.alloc_str = 0; + entry.alloc_sta = 0; + entry.alloc_dex = 0; + entry.alloc_agi = 0; + entry.alloc_int = 0; + entry.alloc_wis = 0; + entry.alloc_cha = 0; + + return entry; + } + + static CharCreatePointAllocations GetCharCreatePointAllocationsEntry( + const std::vector &char_create_point_allocationss, + int char_create_point_allocations_id + ) + { + for (auto &char_create_point_allocations : char_create_point_allocationss) { + if (char_create_point_allocations.id == char_create_point_allocations_id) { + return char_create_point_allocations; + } + } + + return NewEntity(); + } + + static CharCreatePointAllocations FindOne( + Database& db, + int char_create_point_allocations_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + char_create_point_allocations_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharCreatePointAllocations entry{}; + + entry.id = atoi(row[0]); + entry.base_str = atoi(row[1]); + entry.base_sta = atoi(row[2]); + entry.base_dex = atoi(row[3]); + entry.base_agi = atoi(row[4]); + entry.base_int = atoi(row[5]); + entry.base_wis = atoi(row[6]); + entry.base_cha = atoi(row[7]); + entry.alloc_str = atoi(row[8]); + entry.alloc_sta = atoi(row[9]); + entry.alloc_dex = atoi(row[10]); + entry.alloc_agi = atoi(row[11]); + entry.alloc_int = atoi(row[12]); + entry.alloc_wis = atoi(row[13]); + entry.alloc_cha = atoi(row[14]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int char_create_point_allocations_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + char_create_point_allocations_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharCreatePointAllocations char_create_point_allocations_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(char_create_point_allocations_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(char_create_point_allocations_entry.base_str)); + update_values.push_back(columns[2] + " = " + std::to_string(char_create_point_allocations_entry.base_sta)); + update_values.push_back(columns[3] + " = " + std::to_string(char_create_point_allocations_entry.base_dex)); + update_values.push_back(columns[4] + " = " + std::to_string(char_create_point_allocations_entry.base_agi)); + update_values.push_back(columns[5] + " = " + std::to_string(char_create_point_allocations_entry.base_int)); + update_values.push_back(columns[6] + " = " + std::to_string(char_create_point_allocations_entry.base_wis)); + update_values.push_back(columns[7] + " = " + std::to_string(char_create_point_allocations_entry.base_cha)); + update_values.push_back(columns[8] + " = " + std::to_string(char_create_point_allocations_entry.alloc_str)); + update_values.push_back(columns[9] + " = " + std::to_string(char_create_point_allocations_entry.alloc_sta)); + update_values.push_back(columns[10] + " = " + std::to_string(char_create_point_allocations_entry.alloc_dex)); + update_values.push_back(columns[11] + " = " + std::to_string(char_create_point_allocations_entry.alloc_agi)); + update_values.push_back(columns[12] + " = " + std::to_string(char_create_point_allocations_entry.alloc_int)); + update_values.push_back(columns[13] + " = " + std::to_string(char_create_point_allocations_entry.alloc_wis)); + update_values.push_back(columns[14] + " = " + std::to_string(char_create_point_allocations_entry.alloc_cha)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + char_create_point_allocations_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharCreatePointAllocations InsertOne( + Database& db, + CharCreatePointAllocations char_create_point_allocations_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(char_create_point_allocations_entry.id)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_str)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_sta)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_dex)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_agi)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_int)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_wis)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_cha)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_str)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_sta)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_dex)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_agi)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_int)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_wis)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_cha)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + char_create_point_allocations_entry.id = results.LastInsertedID(); + return char_create_point_allocations_entry; + } + + char_create_point_allocations_entry = NewEntity(); + + return char_create_point_allocations_entry; + } + + static int InsertMany( + Database& db, + std::vector char_create_point_allocations_entries + ) + { + std::vector insert_chunks; + + for (auto &char_create_point_allocations_entry: char_create_point_allocations_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(char_create_point_allocations_entry.id)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_str)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_sta)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_dex)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_agi)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_int)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_wis)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.base_cha)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_str)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_sta)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_dex)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_agi)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_int)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_wis)); + insert_values.push_back(std::to_string(char_create_point_allocations_entry.alloc_cha)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharCreatePointAllocations entry{}; + + entry.id = atoi(row[0]); + entry.base_str = atoi(row[1]); + entry.base_sta = atoi(row[2]); + entry.base_dex = atoi(row[3]); + entry.base_agi = atoi(row[4]); + entry.base_int = atoi(row[5]); + entry.base_wis = atoi(row[6]); + entry.base_cha = atoi(row[7]); + entry.alloc_str = atoi(row[8]); + entry.alloc_sta = atoi(row[9]); + entry.alloc_dex = atoi(row[10]); + entry.alloc_agi = atoi(row[11]); + entry.alloc_int = atoi(row[12]); + entry.alloc_wis = atoi(row[13]); + entry.alloc_cha = atoi(row[14]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharCreatePointAllocations entry{}; + + entry.id = atoi(row[0]); + entry.base_str = atoi(row[1]); + entry.base_sta = atoi(row[2]); + entry.base_dex = atoi(row[3]); + entry.base_agi = atoi(row[4]); + entry.base_int = atoi(row[5]); + entry.base_wis = atoi(row[6]); + entry.base_cha = atoi(row[7]); + entry.alloc_str = atoi(row[8]); + entry.alloc_sta = atoi(row[9]); + entry.alloc_dex = atoi(row[10]); + entry.alloc_agi = atoi(row[11]); + entry.alloc_int = atoi(row[12]); + entry.alloc_wis = atoi(row[13]); + entry.alloc_cha = atoi(row[14]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H diff --git a/common/repositories/base/base_char_recipe_list_repository.h b/common/repositories/base/base_char_recipe_list_repository.h new file mode 100644 index 000000000..cb3e33707 --- /dev/null +++ b/common/repositories/base/base_char_recipe_list_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHAR_RECIPE_LIST_REPOSITORY_H +#define EQEMU_BASE_CHAR_RECIPE_LIST_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharRecipeListRepository { +public: + struct CharRecipeList { + int char_id; + int recipe_id; + int madecount; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "recipe_id", + "madecount", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("char_recipe_list"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharRecipeList NewEntity() + { + CharRecipeList entry{}; + + entry.char_id = 0; + entry.recipe_id = 0; + entry.madecount = 0; + + return entry; + } + + static CharRecipeList GetCharRecipeListEntry( + const std::vector &char_recipe_lists, + int char_recipe_list_id + ) + { + for (auto &char_recipe_list : char_recipe_lists) { + if (char_recipe_list.char_id == char_recipe_list_id) { + return char_recipe_list; + } + } + + return NewEntity(); + } + + static CharRecipeList FindOne( + Database& db, + int char_recipe_list_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + char_recipe_list_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharRecipeList entry{}; + + entry.char_id = atoi(row[0]); + entry.recipe_id = atoi(row[1]); + entry.madecount = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int char_recipe_list_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + char_recipe_list_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharRecipeList char_recipe_list_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(char_recipe_list_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(char_recipe_list_entry.recipe_id)); + update_values.push_back(columns[2] + " = " + std::to_string(char_recipe_list_entry.madecount)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + char_recipe_list_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharRecipeList InsertOne( + Database& db, + CharRecipeList char_recipe_list_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(char_recipe_list_entry.char_id)); + insert_values.push_back(std::to_string(char_recipe_list_entry.recipe_id)); + insert_values.push_back(std::to_string(char_recipe_list_entry.madecount)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + char_recipe_list_entry.char_id = results.LastInsertedID(); + return char_recipe_list_entry; + } + + char_recipe_list_entry = NewEntity(); + + return char_recipe_list_entry; + } + + static int InsertMany( + Database& db, + std::vector char_recipe_list_entries + ) + { + std::vector insert_chunks; + + for (auto &char_recipe_list_entry: char_recipe_list_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(char_recipe_list_entry.char_id)); + insert_values.push_back(std::to_string(char_recipe_list_entry.recipe_id)); + insert_values.push_back(std::to_string(char_recipe_list_entry.madecount)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharRecipeList entry{}; + + entry.char_id = atoi(row[0]); + entry.recipe_id = atoi(row[1]); + entry.madecount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharRecipeList entry{}; + + entry.char_id = atoi(row[0]); + entry.recipe_id = atoi(row[1]); + entry.madecount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHAR_RECIPE_LIST_REPOSITORY_H diff --git a/common/repositories/base/base_character_activities_repository.h b/common/repositories/base/base_character_activities_repository.h new file mode 100644 index 000000000..9c4a7b144 --- /dev/null +++ b/common/repositories/base/base_character_activities_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_ACTIVITIES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_ACTIVITIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterActivitiesRepository { +public: + struct CharacterActivities { + int charid; + int taskid; + int activityid; + int donecount; + int completed; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "taskid", + "activityid", + "donecount", + "completed", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_activities"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterActivities NewEntity() + { + CharacterActivities entry{}; + + entry.charid = 0; + entry.taskid = 0; + entry.activityid = 0; + entry.donecount = 0; + entry.completed = 0; + + return entry; + } + + static CharacterActivities GetCharacterActivitiesEntry( + const std::vector &character_activitiess, + int character_activities_id + ) + { + for (auto &character_activities : character_activitiess) { + if (character_activities.charid == character_activities_id) { + return character_activities; + } + } + + return NewEntity(); + } + + static CharacterActivities FindOne( + Database& db, + int character_activities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_activities_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterActivities entry{}; + + entry.charid = atoi(row[0]); + entry.taskid = atoi(row[1]); + entry.activityid = atoi(row[2]); + entry.donecount = atoi(row[3]); + entry.completed = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_activities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_activities_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterActivities character_activities_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_activities_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(character_activities_entry.taskid)); + update_values.push_back(columns[2] + " = " + std::to_string(character_activities_entry.activityid)); + update_values.push_back(columns[3] + " = " + std::to_string(character_activities_entry.donecount)); + update_values.push_back(columns[4] + " = " + std::to_string(character_activities_entry.completed)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_activities_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterActivities InsertOne( + Database& db, + CharacterActivities character_activities_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_activities_entry.charid)); + insert_values.push_back(std::to_string(character_activities_entry.taskid)); + insert_values.push_back(std::to_string(character_activities_entry.activityid)); + insert_values.push_back(std::to_string(character_activities_entry.donecount)); + insert_values.push_back(std::to_string(character_activities_entry.completed)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_activities_entry.charid = results.LastInsertedID(); + return character_activities_entry; + } + + character_activities_entry = NewEntity(); + + return character_activities_entry; + } + + static int InsertMany( + Database& db, + std::vector character_activities_entries + ) + { + std::vector insert_chunks; + + for (auto &character_activities_entry: character_activities_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_activities_entry.charid)); + insert_values.push_back(std::to_string(character_activities_entry.taskid)); + insert_values.push_back(std::to_string(character_activities_entry.activityid)); + insert_values.push_back(std::to_string(character_activities_entry.donecount)); + insert_values.push_back(std::to_string(character_activities_entry.completed)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterActivities entry{}; + + entry.charid = atoi(row[0]); + entry.taskid = atoi(row[1]); + entry.activityid = atoi(row[2]); + entry.donecount = atoi(row[3]); + entry.completed = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterActivities entry{}; + + entry.charid = atoi(row[0]); + entry.taskid = atoi(row[1]); + entry.activityid = atoi(row[2]); + entry.donecount = atoi(row[3]); + entry.completed = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_ACTIVITIES_REPOSITORY_H diff --git a/common/repositories/base/base_character_alt_currency_repository.h b/common/repositories/base/base_character_alt_currency_repository.h new file mode 100644 index 000000000..9e2ebc695 --- /dev/null +++ b/common/repositories/base/base_character_alt_currency_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_ALT_CURRENCY_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_ALT_CURRENCY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterAltCurrencyRepository { +public: + struct CharacterAltCurrency { + int char_id; + int currency_id; + int amount; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "currency_id", + "amount", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_alt_currency"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterAltCurrency NewEntity() + { + CharacterAltCurrency entry{}; + + entry.char_id = 0; + entry.currency_id = 0; + entry.amount = 0; + + return entry; + } + + static CharacterAltCurrency GetCharacterAltCurrencyEntry( + const std::vector &character_alt_currencys, + int character_alt_currency_id + ) + { + for (auto &character_alt_currency : character_alt_currencys) { + if (character_alt_currency.char_id == character_alt_currency_id) { + return character_alt_currency; + } + } + + return NewEntity(); + } + + static CharacterAltCurrency FindOne( + Database& db, + int character_alt_currency_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_alt_currency_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterAltCurrency entry{}; + + entry.char_id = atoi(row[0]); + entry.currency_id = atoi(row[1]); + entry.amount = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_alt_currency_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_alt_currency_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterAltCurrency character_alt_currency_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_alt_currency_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_alt_currency_entry.currency_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_alt_currency_entry.amount)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_alt_currency_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterAltCurrency InsertOne( + Database& db, + CharacterAltCurrency character_alt_currency_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_alt_currency_entry.char_id)); + insert_values.push_back(std::to_string(character_alt_currency_entry.currency_id)); + insert_values.push_back(std::to_string(character_alt_currency_entry.amount)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_alt_currency_entry.char_id = results.LastInsertedID(); + return character_alt_currency_entry; + } + + character_alt_currency_entry = NewEntity(); + + return character_alt_currency_entry; + } + + static int InsertMany( + Database& db, + std::vector character_alt_currency_entries + ) + { + std::vector insert_chunks; + + for (auto &character_alt_currency_entry: character_alt_currency_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_alt_currency_entry.char_id)); + insert_values.push_back(std::to_string(character_alt_currency_entry.currency_id)); + insert_values.push_back(std::to_string(character_alt_currency_entry.amount)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterAltCurrency entry{}; + + entry.char_id = atoi(row[0]); + entry.currency_id = atoi(row[1]); + entry.amount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterAltCurrency entry{}; + + entry.char_id = atoi(row[0]); + entry.currency_id = atoi(row[1]); + entry.amount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_ALT_CURRENCY_REPOSITORY_H diff --git a/common/repositories/base/base_character_alternate_abilities_repository.h b/common/repositories/base/base_character_alternate_abilities_repository.h new file mode 100644 index 000000000..de4ef1cb4 --- /dev/null +++ b/common/repositories/base/base_character_alternate_abilities_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_ALTERNATE_ABILITIES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_ALTERNATE_ABILITIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterAlternateAbilitiesRepository { +public: + struct CharacterAlternateAbilities { + int id; + int aa_id; + int aa_value; + int charges; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "aa_id", + "aa_value", + "charges", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_alternate_abilities"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterAlternateAbilities NewEntity() + { + CharacterAlternateAbilities entry{}; + + entry.id = 0; + entry.aa_id = 0; + entry.aa_value = 0; + entry.charges = 0; + + return entry; + } + + static CharacterAlternateAbilities GetCharacterAlternateAbilitiesEntry( + const std::vector &character_alternate_abilitiess, + int character_alternate_abilities_id + ) + { + for (auto &character_alternate_abilities : character_alternate_abilitiess) { + if (character_alternate_abilities.id == character_alternate_abilities_id) { + return character_alternate_abilities; + } + } + + return NewEntity(); + } + + static CharacterAlternateAbilities FindOne( + Database& db, + int character_alternate_abilities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_alternate_abilities_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterAlternateAbilities entry{}; + + entry.id = atoi(row[0]); + entry.aa_id = atoi(row[1]); + entry.aa_value = atoi(row[2]); + entry.charges = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_alternate_abilities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_alternate_abilities_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterAlternateAbilities character_alternate_abilities_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_alternate_abilities_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_alternate_abilities_entry.aa_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_alternate_abilities_entry.aa_value)); + update_values.push_back(columns[3] + " = " + std::to_string(character_alternate_abilities_entry.charges)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_alternate_abilities_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterAlternateAbilities InsertOne( + Database& db, + CharacterAlternateAbilities character_alternate_abilities_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_alternate_abilities_entry.id)); + insert_values.push_back(std::to_string(character_alternate_abilities_entry.aa_id)); + insert_values.push_back(std::to_string(character_alternate_abilities_entry.aa_value)); + insert_values.push_back(std::to_string(character_alternate_abilities_entry.charges)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_alternate_abilities_entry.id = results.LastInsertedID(); + return character_alternate_abilities_entry; + } + + character_alternate_abilities_entry = NewEntity(); + + return character_alternate_abilities_entry; + } + + static int InsertMany( + Database& db, + std::vector character_alternate_abilities_entries + ) + { + std::vector insert_chunks; + + for (auto &character_alternate_abilities_entry: character_alternate_abilities_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_alternate_abilities_entry.id)); + insert_values.push_back(std::to_string(character_alternate_abilities_entry.aa_id)); + insert_values.push_back(std::to_string(character_alternate_abilities_entry.aa_value)); + insert_values.push_back(std::to_string(character_alternate_abilities_entry.charges)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterAlternateAbilities entry{}; + + entry.id = atoi(row[0]); + entry.aa_id = atoi(row[1]); + entry.aa_value = atoi(row[2]); + entry.charges = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterAlternateAbilities entry{}; + + entry.id = atoi(row[0]); + entry.aa_id = atoi(row[1]); + entry.aa_value = atoi(row[2]); + entry.charges = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_ALTERNATE_ABILITIES_REPOSITORY_H diff --git a/common/repositories/base/base_character_auras_repository.h b/common/repositories/base/base_character_auras_repository.h new file mode 100644 index 000000000..8ac89e458 --- /dev/null +++ b/common/repositories/base/base_character_auras_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_AURAS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_AURAS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterAurasRepository { +public: + struct CharacterAuras { + int id; + int slot; + int spell_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot", + "spell_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_auras"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterAuras NewEntity() + { + CharacterAuras entry{}; + + entry.id = 0; + entry.slot = 0; + entry.spell_id = 0; + + return entry; + } + + static CharacterAuras GetCharacterAurasEntry( + const std::vector &character_aurass, + int character_auras_id + ) + { + for (auto &character_auras : character_aurass) { + if (character_auras.id == character_auras_id) { + return character_auras; + } + } + + return NewEntity(); + } + + static CharacterAuras FindOne( + Database& db, + int character_auras_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_auras_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterAuras entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_auras_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_auras_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterAuras character_auras_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_auras_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_auras_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(character_auras_entry.spell_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_auras_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterAuras InsertOne( + Database& db, + CharacterAuras character_auras_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_auras_entry.id)); + insert_values.push_back(std::to_string(character_auras_entry.slot)); + insert_values.push_back(std::to_string(character_auras_entry.spell_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_auras_entry.id = results.LastInsertedID(); + return character_auras_entry; + } + + character_auras_entry = NewEntity(); + + return character_auras_entry; + } + + static int InsertMany( + Database& db, + std::vector character_auras_entries + ) + { + std::vector insert_chunks; + + for (auto &character_auras_entry: character_auras_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_auras_entry.id)); + insert_values.push_back(std::to_string(character_auras_entry.slot)); + insert_values.push_back(std::to_string(character_auras_entry.spell_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterAuras entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterAuras entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_AURAS_REPOSITORY_H diff --git a/common/repositories/base/base_character_bandolier_repository.h b/common/repositories/base/base_character_bandolier_repository.h new file mode 100644 index 000000000..a208ac9da --- /dev/null +++ b/common/repositories/base/base_character_bandolier_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_BANDOLIER_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_BANDOLIER_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterBandolierRepository { +public: + struct CharacterBandolier { + int id; + int bandolier_id; + int bandolier_slot; + int item_id; + int icon; + std::string bandolier_name; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "bandolier_id", + "bandolier_slot", + "item_id", + "icon", + "bandolier_name", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_bandolier"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterBandolier NewEntity() + { + CharacterBandolier entry{}; + + entry.id = 0; + entry.bandolier_id = 0; + entry.bandolier_slot = 0; + entry.item_id = 0; + entry.icon = 0; + entry.bandolier_name = "0"; + + return entry; + } + + static CharacterBandolier GetCharacterBandolierEntry( + const std::vector &character_bandoliers, + int character_bandolier_id + ) + { + for (auto &character_bandolier : character_bandoliers) { + if (character_bandolier.id == character_bandolier_id) { + return character_bandolier; + } + } + + return NewEntity(); + } + + static CharacterBandolier FindOne( + Database& db, + int character_bandolier_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_bandolier_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterBandolier entry{}; + + entry.id = atoi(row[0]); + entry.bandolier_id = atoi(row[1]); + entry.bandolier_slot = atoi(row[2]); + entry.item_id = atoi(row[3]); + entry.icon = atoi(row[4]); + entry.bandolier_name = row[5] ? row[5] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_bandolier_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_bandolier_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterBandolier character_bandolier_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_bandolier_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_bandolier_entry.bandolier_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_bandolier_entry.bandolier_slot)); + update_values.push_back(columns[3] + " = " + std::to_string(character_bandolier_entry.item_id)); + update_values.push_back(columns[4] + " = " + std::to_string(character_bandolier_entry.icon)); + update_values.push_back(columns[5] + " = '" + EscapeString(character_bandolier_entry.bandolier_name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_bandolier_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterBandolier InsertOne( + Database& db, + CharacterBandolier character_bandolier_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_bandolier_entry.id)); + insert_values.push_back(std::to_string(character_bandolier_entry.bandolier_id)); + insert_values.push_back(std::to_string(character_bandolier_entry.bandolier_slot)); + insert_values.push_back(std::to_string(character_bandolier_entry.item_id)); + insert_values.push_back(std::to_string(character_bandolier_entry.icon)); + insert_values.push_back("'" + EscapeString(character_bandolier_entry.bandolier_name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_bandolier_entry.id = results.LastInsertedID(); + return character_bandolier_entry; + } + + character_bandolier_entry = NewEntity(); + + return character_bandolier_entry; + } + + static int InsertMany( + Database& db, + std::vector character_bandolier_entries + ) + { + std::vector insert_chunks; + + for (auto &character_bandolier_entry: character_bandolier_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_bandolier_entry.id)); + insert_values.push_back(std::to_string(character_bandolier_entry.bandolier_id)); + insert_values.push_back(std::to_string(character_bandolier_entry.bandolier_slot)); + insert_values.push_back(std::to_string(character_bandolier_entry.item_id)); + insert_values.push_back(std::to_string(character_bandolier_entry.icon)); + insert_values.push_back("'" + EscapeString(character_bandolier_entry.bandolier_name) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterBandolier entry{}; + + entry.id = atoi(row[0]); + entry.bandolier_id = atoi(row[1]); + entry.bandolier_slot = atoi(row[2]); + entry.item_id = atoi(row[3]); + entry.icon = atoi(row[4]); + entry.bandolier_name = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterBandolier entry{}; + + entry.id = atoi(row[0]); + entry.bandolier_id = atoi(row[1]); + entry.bandolier_slot = atoi(row[2]); + entry.item_id = atoi(row[3]); + entry.icon = atoi(row[4]); + entry.bandolier_name = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_BANDOLIER_REPOSITORY_H diff --git a/common/repositories/base/base_character_bind_repository.h b/common/repositories/base/base_character_bind_repository.h new file mode 100644 index 000000000..6ae2aee1d --- /dev/null +++ b/common/repositories/base/base_character_bind_repository.h @@ -0,0 +1,346 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_BIND_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_BIND_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterBindRepository { +public: + struct CharacterBind { + int id; + int slot; + int zone_id; + int instance_id; + float x; + float y; + float z; + float heading; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot", + "zone_id", + "instance_id", + "x", + "y", + "z", + "heading", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_bind"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterBind NewEntity() + { + CharacterBind entry{}; + + entry.id = 0; + entry.slot = 0; + entry.zone_id = 0; + entry.instance_id = 0; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.heading = 0; + + return entry; + } + + static CharacterBind GetCharacterBindEntry( + const std::vector &character_binds, + int character_bind_id + ) + { + for (auto &character_bind : character_binds) { + if (character_bind.id == character_bind_id) { + return character_bind; + } + } + + return NewEntity(); + } + + static CharacterBind FindOne( + Database& db, + int character_bind_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_bind_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterBind entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.zone_id = atoi(row[2]); + entry.instance_id = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_bind_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_bind_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterBind character_bind_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_bind_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(character_bind_entry.zone_id)); + update_values.push_back(columns[3] + " = " + std::to_string(character_bind_entry.instance_id)); + update_values.push_back(columns[4] + " = " + std::to_string(character_bind_entry.x)); + update_values.push_back(columns[5] + " = " + std::to_string(character_bind_entry.y)); + update_values.push_back(columns[6] + " = " + std::to_string(character_bind_entry.z)); + update_values.push_back(columns[7] + " = " + std::to_string(character_bind_entry.heading)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_bind_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterBind InsertOne( + Database& db, + CharacterBind character_bind_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_bind_entry.id)); + insert_values.push_back(std::to_string(character_bind_entry.slot)); + insert_values.push_back(std::to_string(character_bind_entry.zone_id)); + insert_values.push_back(std::to_string(character_bind_entry.instance_id)); + insert_values.push_back(std::to_string(character_bind_entry.x)); + insert_values.push_back(std::to_string(character_bind_entry.y)); + insert_values.push_back(std::to_string(character_bind_entry.z)); + insert_values.push_back(std::to_string(character_bind_entry.heading)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_bind_entry.id = results.LastInsertedID(); + return character_bind_entry; + } + + character_bind_entry = NewEntity(); + + return character_bind_entry; + } + + static int InsertMany( + Database& db, + std::vector character_bind_entries + ) + { + std::vector insert_chunks; + + for (auto &character_bind_entry: character_bind_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_bind_entry.id)); + insert_values.push_back(std::to_string(character_bind_entry.slot)); + insert_values.push_back(std::to_string(character_bind_entry.zone_id)); + insert_values.push_back(std::to_string(character_bind_entry.instance_id)); + insert_values.push_back(std::to_string(character_bind_entry.x)); + insert_values.push_back(std::to_string(character_bind_entry.y)); + insert_values.push_back(std::to_string(character_bind_entry.z)); + insert_values.push_back(std::to_string(character_bind_entry.heading)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterBind entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.zone_id = atoi(row[2]); + entry.instance_id = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterBind entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.zone_id = atoi(row[2]); + entry.instance_id = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_BIND_REPOSITORY_H diff --git a/common/repositories/base/base_character_buffs_repository.h b/common/repositories/base/base_character_buffs_repository.h new file mode 100644 index 000000000..6e577e154 --- /dev/null +++ b/common/repositories/base/base_character_buffs_repository.h @@ -0,0 +1,428 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_BUFFS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_BUFFS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterBuffsRepository { +public: + struct CharacterBuffs { + int character_id; + int slot_id; + int spell_id; + int caster_level; + std::string caster_name; + int ticsremaining; + int counters; + int numhits; + int melee_rune; + int magic_rune; + int persistent; + int dot_rune; + int caston_x; + int caston_y; + int caston_z; + int ExtraDIChance; + int instrument_mod; + }; + + static std::string PrimaryKey() + { + return std::string("character_id"); + } + + static std::vector Columns() + { + return { + "character_id", + "slot_id", + "spell_id", + "caster_level", + "caster_name", + "ticsremaining", + "counters", + "numhits", + "melee_rune", + "magic_rune", + "persistent", + "dot_rune", + "caston_x", + "caston_y", + "caston_z", + "ExtraDIChance", + "instrument_mod", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_buffs"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterBuffs NewEntity() + { + CharacterBuffs entry{}; + + entry.character_id = 0; + entry.slot_id = 0; + entry.spell_id = 0; + entry.caster_level = 0; + entry.caster_name = ""; + entry.ticsremaining = 0; + entry.counters = 0; + entry.numhits = 0; + entry.melee_rune = 0; + entry.magic_rune = 0; + entry.persistent = 0; + entry.dot_rune = 0; + entry.caston_x = 0; + entry.caston_y = 0; + entry.caston_z = 0; + entry.ExtraDIChance = 0; + entry.instrument_mod = 10; + + return entry; + } + + static CharacterBuffs GetCharacterBuffsEntry( + const std::vector &character_buffss, + int character_buffs_id + ) + { + for (auto &character_buffs : character_buffss) { + if (character_buffs.character_id == character_buffs_id) { + return character_buffs; + } + } + + return NewEntity(); + } + + static CharacterBuffs FindOne( + Database& db, + int character_buffs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_buffs_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterBuffs entry{}; + + entry.character_id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + entry.caster_level = atoi(row[3]); + entry.caster_name = row[4] ? row[4] : ""; + entry.ticsremaining = atoi(row[5]); + entry.counters = atoi(row[6]); + entry.numhits = atoi(row[7]); + entry.melee_rune = atoi(row[8]); + entry.magic_rune = atoi(row[9]); + entry.persistent = atoi(row[10]); + entry.dot_rune = atoi(row[11]); + entry.caston_x = atoi(row[12]); + entry.caston_y = atoi(row[13]); + entry.caston_z = atoi(row[14]); + entry.ExtraDIChance = atoi(row[15]); + entry.instrument_mod = atoi(row[16]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_buffs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_buffs_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterBuffs character_buffs_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_buffs_entry.character_id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_buffs_entry.slot_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_buffs_entry.spell_id)); + update_values.push_back(columns[3] + " = " + std::to_string(character_buffs_entry.caster_level)); + update_values.push_back(columns[4] + " = '" + EscapeString(character_buffs_entry.caster_name) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(character_buffs_entry.ticsremaining)); + update_values.push_back(columns[6] + " = " + std::to_string(character_buffs_entry.counters)); + update_values.push_back(columns[7] + " = " + std::to_string(character_buffs_entry.numhits)); + update_values.push_back(columns[8] + " = " + std::to_string(character_buffs_entry.melee_rune)); + update_values.push_back(columns[9] + " = " + std::to_string(character_buffs_entry.magic_rune)); + update_values.push_back(columns[10] + " = " + std::to_string(character_buffs_entry.persistent)); + update_values.push_back(columns[11] + " = " + std::to_string(character_buffs_entry.dot_rune)); + update_values.push_back(columns[12] + " = " + std::to_string(character_buffs_entry.caston_x)); + update_values.push_back(columns[13] + " = " + std::to_string(character_buffs_entry.caston_y)); + update_values.push_back(columns[14] + " = " + std::to_string(character_buffs_entry.caston_z)); + update_values.push_back(columns[15] + " = " + std::to_string(character_buffs_entry.ExtraDIChance)); + update_values.push_back(columns[16] + " = " + std::to_string(character_buffs_entry.instrument_mod)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_buffs_entry.character_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterBuffs InsertOne( + Database& db, + CharacterBuffs character_buffs_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_buffs_entry.character_id)); + insert_values.push_back(std::to_string(character_buffs_entry.slot_id)); + insert_values.push_back(std::to_string(character_buffs_entry.spell_id)); + insert_values.push_back(std::to_string(character_buffs_entry.caster_level)); + insert_values.push_back("'" + EscapeString(character_buffs_entry.caster_name) + "'"); + insert_values.push_back(std::to_string(character_buffs_entry.ticsremaining)); + insert_values.push_back(std::to_string(character_buffs_entry.counters)); + insert_values.push_back(std::to_string(character_buffs_entry.numhits)); + insert_values.push_back(std::to_string(character_buffs_entry.melee_rune)); + insert_values.push_back(std::to_string(character_buffs_entry.magic_rune)); + insert_values.push_back(std::to_string(character_buffs_entry.persistent)); + insert_values.push_back(std::to_string(character_buffs_entry.dot_rune)); + insert_values.push_back(std::to_string(character_buffs_entry.caston_x)); + insert_values.push_back(std::to_string(character_buffs_entry.caston_y)); + insert_values.push_back(std::to_string(character_buffs_entry.caston_z)); + insert_values.push_back(std::to_string(character_buffs_entry.ExtraDIChance)); + insert_values.push_back(std::to_string(character_buffs_entry.instrument_mod)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_buffs_entry.character_id = results.LastInsertedID(); + return character_buffs_entry; + } + + character_buffs_entry = NewEntity(); + + return character_buffs_entry; + } + + static int InsertMany( + Database& db, + std::vector character_buffs_entries + ) + { + std::vector insert_chunks; + + for (auto &character_buffs_entry: character_buffs_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_buffs_entry.character_id)); + insert_values.push_back(std::to_string(character_buffs_entry.slot_id)); + insert_values.push_back(std::to_string(character_buffs_entry.spell_id)); + insert_values.push_back(std::to_string(character_buffs_entry.caster_level)); + insert_values.push_back("'" + EscapeString(character_buffs_entry.caster_name) + "'"); + insert_values.push_back(std::to_string(character_buffs_entry.ticsremaining)); + insert_values.push_back(std::to_string(character_buffs_entry.counters)); + insert_values.push_back(std::to_string(character_buffs_entry.numhits)); + insert_values.push_back(std::to_string(character_buffs_entry.melee_rune)); + insert_values.push_back(std::to_string(character_buffs_entry.magic_rune)); + insert_values.push_back(std::to_string(character_buffs_entry.persistent)); + insert_values.push_back(std::to_string(character_buffs_entry.dot_rune)); + insert_values.push_back(std::to_string(character_buffs_entry.caston_x)); + insert_values.push_back(std::to_string(character_buffs_entry.caston_y)); + insert_values.push_back(std::to_string(character_buffs_entry.caston_z)); + insert_values.push_back(std::to_string(character_buffs_entry.ExtraDIChance)); + insert_values.push_back(std::to_string(character_buffs_entry.instrument_mod)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterBuffs entry{}; + + entry.character_id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + entry.caster_level = atoi(row[3]); + entry.caster_name = row[4] ? row[4] : ""; + entry.ticsremaining = atoi(row[5]); + entry.counters = atoi(row[6]); + entry.numhits = atoi(row[7]); + entry.melee_rune = atoi(row[8]); + entry.magic_rune = atoi(row[9]); + entry.persistent = atoi(row[10]); + entry.dot_rune = atoi(row[11]); + entry.caston_x = atoi(row[12]); + entry.caston_y = atoi(row[13]); + entry.caston_z = atoi(row[14]); + entry.ExtraDIChance = atoi(row[15]); + entry.instrument_mod = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterBuffs entry{}; + + entry.character_id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + entry.caster_level = atoi(row[3]); + entry.caster_name = row[4] ? row[4] : ""; + entry.ticsremaining = atoi(row[5]); + entry.counters = atoi(row[6]); + entry.numhits = atoi(row[7]); + entry.melee_rune = atoi(row[8]); + entry.magic_rune = atoi(row[9]); + entry.persistent = atoi(row[10]); + entry.dot_rune = atoi(row[11]); + entry.caston_x = atoi(row[12]); + entry.caston_y = atoi(row[13]); + entry.caston_z = atoi(row[14]); + entry.ExtraDIChance = atoi(row[15]); + entry.instrument_mod = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_BUFFS_REPOSITORY_H diff --git a/common/repositories/base/base_character_corpse_items_repository.h b/common/repositories/base/base_character_corpse_items_repository.h new file mode 100644 index 000000000..a1d50d125 --- /dev/null +++ b/common/repositories/base/base_character_corpse_items_repository.h @@ -0,0 +1,374 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_CORPSE_ITEMS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_CORPSE_ITEMS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterCorpseItemsRepository { +public: + struct CharacterCorpseItems { + int corpse_id; + int equip_slot; + int item_id; + int charges; + int aug_1; + int aug_2; + int aug_3; + int aug_4; + int aug_5; + int aug_6; + int attuned; + }; + + static std::string PrimaryKey() + { + return std::string("corpse_id"); + } + + static std::vector Columns() + { + return { + "corpse_id", + "equip_slot", + "item_id", + "charges", + "aug_1", + "aug_2", + "aug_3", + "aug_4", + "aug_5", + "aug_6", + "attuned", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_corpse_items"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterCorpseItems NewEntity() + { + CharacterCorpseItems entry{}; + + entry.corpse_id = 0; + entry.equip_slot = 0; + entry.item_id = 0; + entry.charges = 0; + entry.aug_1 = 0; + entry.aug_2 = 0; + entry.aug_3 = 0; + entry.aug_4 = 0; + entry.aug_5 = 0; + entry.aug_6 = 0; + entry.attuned = 0; + + return entry; + } + + static CharacterCorpseItems GetCharacterCorpseItemsEntry( + const std::vector &character_corpse_itemss, + int character_corpse_items_id + ) + { + for (auto &character_corpse_items : character_corpse_itemss) { + if (character_corpse_items.corpse_id == character_corpse_items_id) { + return character_corpse_items; + } + } + + return NewEntity(); + } + + static CharacterCorpseItems FindOne( + Database& db, + int character_corpse_items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_corpse_items_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterCorpseItems entry{}; + + entry.corpse_id = atoi(row[0]); + entry.equip_slot = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.aug_1 = atoi(row[4]); + entry.aug_2 = atoi(row[5]); + entry.aug_3 = atoi(row[6]); + entry.aug_4 = atoi(row[7]); + entry.aug_5 = atoi(row[8]); + entry.aug_6 = atoi(row[9]); + entry.attuned = atoi(row[10]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_corpse_items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_corpse_items_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterCorpseItems character_corpse_items_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_corpse_items_entry.corpse_id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_corpse_items_entry.equip_slot)); + update_values.push_back(columns[2] + " = " + std::to_string(character_corpse_items_entry.item_id)); + update_values.push_back(columns[3] + " = " + std::to_string(character_corpse_items_entry.charges)); + update_values.push_back(columns[4] + " = " + std::to_string(character_corpse_items_entry.aug_1)); + update_values.push_back(columns[5] + " = " + std::to_string(character_corpse_items_entry.aug_2)); + update_values.push_back(columns[6] + " = " + std::to_string(character_corpse_items_entry.aug_3)); + update_values.push_back(columns[7] + " = " + std::to_string(character_corpse_items_entry.aug_4)); + update_values.push_back(columns[8] + " = " + std::to_string(character_corpse_items_entry.aug_5)); + update_values.push_back(columns[9] + " = " + std::to_string(character_corpse_items_entry.aug_6)); + update_values.push_back(columns[10] + " = " + std::to_string(character_corpse_items_entry.attuned)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_corpse_items_entry.corpse_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterCorpseItems InsertOne( + Database& db, + CharacterCorpseItems character_corpse_items_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_corpse_items_entry.corpse_id)); + insert_values.push_back(std::to_string(character_corpse_items_entry.equip_slot)); + insert_values.push_back(std::to_string(character_corpse_items_entry.item_id)); + insert_values.push_back(std::to_string(character_corpse_items_entry.charges)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_1)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_2)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_3)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_4)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_5)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_6)); + insert_values.push_back(std::to_string(character_corpse_items_entry.attuned)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_corpse_items_entry.corpse_id = results.LastInsertedID(); + return character_corpse_items_entry; + } + + character_corpse_items_entry = NewEntity(); + + return character_corpse_items_entry; + } + + static int InsertMany( + Database& db, + std::vector character_corpse_items_entries + ) + { + std::vector insert_chunks; + + for (auto &character_corpse_items_entry: character_corpse_items_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_corpse_items_entry.corpse_id)); + insert_values.push_back(std::to_string(character_corpse_items_entry.equip_slot)); + insert_values.push_back(std::to_string(character_corpse_items_entry.item_id)); + insert_values.push_back(std::to_string(character_corpse_items_entry.charges)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_1)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_2)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_3)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_4)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_5)); + insert_values.push_back(std::to_string(character_corpse_items_entry.aug_6)); + insert_values.push_back(std::to_string(character_corpse_items_entry.attuned)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterCorpseItems entry{}; + + entry.corpse_id = atoi(row[0]); + entry.equip_slot = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.aug_1 = atoi(row[4]); + entry.aug_2 = atoi(row[5]); + entry.aug_3 = atoi(row[6]); + entry.aug_4 = atoi(row[7]); + entry.aug_5 = atoi(row[8]); + entry.aug_6 = atoi(row[9]); + entry.attuned = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterCorpseItems entry{}; + + entry.corpse_id = atoi(row[0]); + entry.equip_slot = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.aug_1 = atoi(row[4]); + entry.aug_2 = atoi(row[5]); + entry.aug_3 = atoi(row[6]); + entry.aug_4 = atoi(row[7]); + entry.aug_5 = atoi(row[8]); + entry.aug_6 = atoi(row[9]); + entry.attuned = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_CORPSE_ITEMS_REPOSITORY_H diff --git a/common/repositories/base/base_character_corpses_repository.h b/common/repositories/base/base_character_corpses_repository.h new file mode 100644 index 000000000..bb7df4e0d --- /dev/null +++ b/common/repositories/base/base_character_corpses_repository.h @@ -0,0 +1,697 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_CORPSES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_CORPSES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterCorpsesRepository { +public: + struct CharacterCorpses { + int id; + int charid; + std::string charname; + int zone_id; + int instance_id; + float x; + float y; + float z; + float heading; + std::string time_of_death; + int guild_consent_id; + int is_rezzed; + int is_buried; + int was_at_graveyard; + int is_locked; + int exp; + int size; + int level; + int race; + int gender; + int class; + int deity; + int texture; + int helm_texture; + int copper; + int silver; + int gold; + int platinum; + int hair_color; + int beard_color; + int eye_color_1; + int eye_color_2; + int hair_style; + int face; + int beard; + int drakkin_heritage; + int drakkin_tattoo; + int drakkin_details; + int wc_1; + int wc_2; + int wc_3; + int wc_4; + int wc_5; + int wc_6; + int wc_7; + int wc_8; + int wc_9; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "charid", + "charname", + "zone_id", + "instance_id", + "x", + "y", + "z", + "heading", + "time_of_death", + "guild_consent_id", + "is_rezzed", + "is_buried", + "was_at_graveyard", + "is_locked", + "exp", + "size", + "level", + "race", + "gender", + "class", + "deity", + "texture", + "helm_texture", + "copper", + "silver", + "gold", + "platinum", + "hair_color", + "beard_color", + "eye_color_1", + "eye_color_2", + "hair_style", + "face", + "beard", + "drakkin_heritage", + "drakkin_tattoo", + "drakkin_details", + "wc_1", + "wc_2", + "wc_3", + "wc_4", + "wc_5", + "wc_6", + "wc_7", + "wc_8", + "wc_9", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_corpses"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterCorpses NewEntity() + { + CharacterCorpses entry{}; + + entry.id = 0; + entry.charid = 0; + entry.charname = ""; + entry.zone_id = 0; + entry.instance_id = 0; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.heading = 0; + entry.time_of_death = "0000-00-00 00:00:00"; + entry.guild_consent_id = 0; + entry.is_rezzed = 0; + entry.is_buried = 0; + entry.was_at_graveyard = 0; + entry.is_locked = 0; + entry.exp = 0; + entry.size = 0; + entry.level = 0; + entry.race = 0; + entry.gender = 0; + entry.class = 0; + entry.deity = 0; + entry.texture = 0; + entry.helm_texture = 0; + entry.copper = 0; + entry.silver = 0; + entry.gold = 0; + entry.platinum = 0; + entry.hair_color = 0; + entry.beard_color = 0; + entry.eye_color_1 = 0; + entry.eye_color_2 = 0; + entry.hair_style = 0; + entry.face = 0; + entry.beard = 0; + entry.drakkin_heritage = 0; + entry.drakkin_tattoo = 0; + entry.drakkin_details = 0; + entry.wc_1 = 0; + entry.wc_2 = 0; + entry.wc_3 = 0; + entry.wc_4 = 0; + entry.wc_5 = 0; + entry.wc_6 = 0; + entry.wc_7 = 0; + entry.wc_8 = 0; + entry.wc_9 = 0; + + return entry; + } + + static CharacterCorpses GetCharacterCorpsesEntry( + const std::vector &character_corpsess, + int character_corpses_id + ) + { + for (auto &character_corpses : character_corpsess) { + if (character_corpses.id == character_corpses_id) { + return character_corpses; + } + } + + return NewEntity(); + } + + static CharacterCorpses FindOne( + Database& db, + int character_corpses_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_corpses_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterCorpses entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.charname = row[2] ? row[2] : ""; + entry.zone_id = atoi(row[3]); + entry.instance_id = atoi(row[4]); + entry.x = static_cast(atof(row[5])); + entry.y = static_cast(atof(row[6])); + entry.z = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.time_of_death = row[9] ? row[9] : ""; + entry.guild_consent_id = atoi(row[10]); + entry.is_rezzed = atoi(row[11]); + entry.is_buried = atoi(row[12]); + entry.was_at_graveyard = atoi(row[13]); + entry.is_locked = atoi(row[14]); + entry.exp = atoi(row[15]); + entry.size = atoi(row[16]); + entry.level = atoi(row[17]); + entry.race = atoi(row[18]); + entry.gender = atoi(row[19]); + entry.class = atoi(row[20]); + entry.deity = atoi(row[21]); + entry.texture = atoi(row[22]); + entry.helm_texture = atoi(row[23]); + entry.copper = atoi(row[24]); + entry.silver = atoi(row[25]); + entry.gold = atoi(row[26]); + entry.platinum = atoi(row[27]); + entry.hair_color = atoi(row[28]); + entry.beard_color = atoi(row[29]); + entry.eye_color_1 = atoi(row[30]); + entry.eye_color_2 = atoi(row[31]); + entry.hair_style = atoi(row[32]); + entry.face = atoi(row[33]); + entry.beard = atoi(row[34]); + entry.drakkin_heritage = atoi(row[35]); + entry.drakkin_tattoo = atoi(row[36]); + entry.drakkin_details = atoi(row[37]); + entry.wc_1 = atoi(row[38]); + entry.wc_2 = atoi(row[39]); + entry.wc_3 = atoi(row[40]); + entry.wc_4 = atoi(row[41]); + entry.wc_5 = atoi(row[42]); + entry.wc_6 = atoi(row[43]); + entry.wc_7 = atoi(row[44]); + entry.wc_8 = atoi(row[45]); + entry.wc_9 = atoi(row[46]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_corpses_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_corpses_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterCorpses character_corpses_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_corpses_entry.charid)); + update_values.push_back(columns[2] + " = '" + EscapeString(character_corpses_entry.charname) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(character_corpses_entry.zone_id)); + update_values.push_back(columns[4] + " = " + std::to_string(character_corpses_entry.instance_id)); + update_values.push_back(columns[5] + " = " + std::to_string(character_corpses_entry.x)); + update_values.push_back(columns[6] + " = " + std::to_string(character_corpses_entry.y)); + update_values.push_back(columns[7] + " = " + std::to_string(character_corpses_entry.z)); + update_values.push_back(columns[8] + " = " + std::to_string(character_corpses_entry.heading)); + update_values.push_back(columns[9] + " = '" + EscapeString(character_corpses_entry.time_of_death) + "'"); + update_values.push_back(columns[10] + " = " + std::to_string(character_corpses_entry.guild_consent_id)); + update_values.push_back(columns[11] + " = " + std::to_string(character_corpses_entry.is_rezzed)); + update_values.push_back(columns[12] + " = " + std::to_string(character_corpses_entry.is_buried)); + update_values.push_back(columns[13] + " = " + std::to_string(character_corpses_entry.was_at_graveyard)); + update_values.push_back(columns[14] + " = " + std::to_string(character_corpses_entry.is_locked)); + update_values.push_back(columns[15] + " = " + std::to_string(character_corpses_entry.exp)); + update_values.push_back(columns[16] + " = " + std::to_string(character_corpses_entry.size)); + update_values.push_back(columns[17] + " = " + std::to_string(character_corpses_entry.level)); + update_values.push_back(columns[18] + " = " + std::to_string(character_corpses_entry.race)); + update_values.push_back(columns[19] + " = " + std::to_string(character_corpses_entry.gender)); + update_values.push_back(columns[20] + " = " + std::to_string(character_corpses_entry.class)); + update_values.push_back(columns[21] + " = " + std::to_string(character_corpses_entry.deity)); + update_values.push_back(columns[22] + " = " + std::to_string(character_corpses_entry.texture)); + update_values.push_back(columns[23] + " = " + std::to_string(character_corpses_entry.helm_texture)); + update_values.push_back(columns[24] + " = " + std::to_string(character_corpses_entry.copper)); + update_values.push_back(columns[25] + " = " + std::to_string(character_corpses_entry.silver)); + update_values.push_back(columns[26] + " = " + std::to_string(character_corpses_entry.gold)); + update_values.push_back(columns[27] + " = " + std::to_string(character_corpses_entry.platinum)); + update_values.push_back(columns[28] + " = " + std::to_string(character_corpses_entry.hair_color)); + update_values.push_back(columns[29] + " = " + std::to_string(character_corpses_entry.beard_color)); + update_values.push_back(columns[30] + " = " + std::to_string(character_corpses_entry.eye_color_1)); + update_values.push_back(columns[31] + " = " + std::to_string(character_corpses_entry.eye_color_2)); + update_values.push_back(columns[32] + " = " + std::to_string(character_corpses_entry.hair_style)); + update_values.push_back(columns[33] + " = " + std::to_string(character_corpses_entry.face)); + update_values.push_back(columns[34] + " = " + std::to_string(character_corpses_entry.beard)); + update_values.push_back(columns[35] + " = " + std::to_string(character_corpses_entry.drakkin_heritage)); + update_values.push_back(columns[36] + " = " + std::to_string(character_corpses_entry.drakkin_tattoo)); + update_values.push_back(columns[37] + " = " + std::to_string(character_corpses_entry.drakkin_details)); + update_values.push_back(columns[38] + " = " + std::to_string(character_corpses_entry.wc_1)); + update_values.push_back(columns[39] + " = " + std::to_string(character_corpses_entry.wc_2)); + update_values.push_back(columns[40] + " = " + std::to_string(character_corpses_entry.wc_3)); + update_values.push_back(columns[41] + " = " + std::to_string(character_corpses_entry.wc_4)); + update_values.push_back(columns[42] + " = " + std::to_string(character_corpses_entry.wc_5)); + update_values.push_back(columns[43] + " = " + std::to_string(character_corpses_entry.wc_6)); + update_values.push_back(columns[44] + " = " + std::to_string(character_corpses_entry.wc_7)); + update_values.push_back(columns[45] + " = " + std::to_string(character_corpses_entry.wc_8)); + update_values.push_back(columns[46] + " = " + std::to_string(character_corpses_entry.wc_9)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_corpses_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterCorpses InsertOne( + Database& db, + CharacterCorpses character_corpses_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_corpses_entry.id)); + insert_values.push_back(std::to_string(character_corpses_entry.charid)); + insert_values.push_back("'" + EscapeString(character_corpses_entry.charname) + "'"); + insert_values.push_back(std::to_string(character_corpses_entry.zone_id)); + insert_values.push_back(std::to_string(character_corpses_entry.instance_id)); + insert_values.push_back(std::to_string(character_corpses_entry.x)); + insert_values.push_back(std::to_string(character_corpses_entry.y)); + insert_values.push_back(std::to_string(character_corpses_entry.z)); + insert_values.push_back(std::to_string(character_corpses_entry.heading)); + insert_values.push_back("'" + EscapeString(character_corpses_entry.time_of_death) + "'"); + insert_values.push_back(std::to_string(character_corpses_entry.guild_consent_id)); + insert_values.push_back(std::to_string(character_corpses_entry.is_rezzed)); + insert_values.push_back(std::to_string(character_corpses_entry.is_buried)); + insert_values.push_back(std::to_string(character_corpses_entry.was_at_graveyard)); + insert_values.push_back(std::to_string(character_corpses_entry.is_locked)); + insert_values.push_back(std::to_string(character_corpses_entry.exp)); + insert_values.push_back(std::to_string(character_corpses_entry.size)); + insert_values.push_back(std::to_string(character_corpses_entry.level)); + insert_values.push_back(std::to_string(character_corpses_entry.race)); + insert_values.push_back(std::to_string(character_corpses_entry.gender)); + insert_values.push_back(std::to_string(character_corpses_entry.class)); + insert_values.push_back(std::to_string(character_corpses_entry.deity)); + insert_values.push_back(std::to_string(character_corpses_entry.texture)); + insert_values.push_back(std::to_string(character_corpses_entry.helm_texture)); + insert_values.push_back(std::to_string(character_corpses_entry.copper)); + insert_values.push_back(std::to_string(character_corpses_entry.silver)); + insert_values.push_back(std::to_string(character_corpses_entry.gold)); + insert_values.push_back(std::to_string(character_corpses_entry.platinum)); + insert_values.push_back(std::to_string(character_corpses_entry.hair_color)); + insert_values.push_back(std::to_string(character_corpses_entry.beard_color)); + insert_values.push_back(std::to_string(character_corpses_entry.eye_color_1)); + insert_values.push_back(std::to_string(character_corpses_entry.eye_color_2)); + insert_values.push_back(std::to_string(character_corpses_entry.hair_style)); + insert_values.push_back(std::to_string(character_corpses_entry.face)); + insert_values.push_back(std::to_string(character_corpses_entry.beard)); + insert_values.push_back(std::to_string(character_corpses_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(character_corpses_entry.drakkin_tattoo)); + insert_values.push_back(std::to_string(character_corpses_entry.drakkin_details)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_1)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_2)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_3)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_4)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_5)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_6)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_7)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_8)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_9)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_corpses_entry.id = results.LastInsertedID(); + return character_corpses_entry; + } + + character_corpses_entry = NewEntity(); + + return character_corpses_entry; + } + + static int InsertMany( + Database& db, + std::vector character_corpses_entries + ) + { + std::vector insert_chunks; + + for (auto &character_corpses_entry: character_corpses_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_corpses_entry.id)); + insert_values.push_back(std::to_string(character_corpses_entry.charid)); + insert_values.push_back("'" + EscapeString(character_corpses_entry.charname) + "'"); + insert_values.push_back(std::to_string(character_corpses_entry.zone_id)); + insert_values.push_back(std::to_string(character_corpses_entry.instance_id)); + insert_values.push_back(std::to_string(character_corpses_entry.x)); + insert_values.push_back(std::to_string(character_corpses_entry.y)); + insert_values.push_back(std::to_string(character_corpses_entry.z)); + insert_values.push_back(std::to_string(character_corpses_entry.heading)); + insert_values.push_back("'" + EscapeString(character_corpses_entry.time_of_death) + "'"); + insert_values.push_back(std::to_string(character_corpses_entry.guild_consent_id)); + insert_values.push_back(std::to_string(character_corpses_entry.is_rezzed)); + insert_values.push_back(std::to_string(character_corpses_entry.is_buried)); + insert_values.push_back(std::to_string(character_corpses_entry.was_at_graveyard)); + insert_values.push_back(std::to_string(character_corpses_entry.is_locked)); + insert_values.push_back(std::to_string(character_corpses_entry.exp)); + insert_values.push_back(std::to_string(character_corpses_entry.size)); + insert_values.push_back(std::to_string(character_corpses_entry.level)); + insert_values.push_back(std::to_string(character_corpses_entry.race)); + insert_values.push_back(std::to_string(character_corpses_entry.gender)); + insert_values.push_back(std::to_string(character_corpses_entry.class)); + insert_values.push_back(std::to_string(character_corpses_entry.deity)); + insert_values.push_back(std::to_string(character_corpses_entry.texture)); + insert_values.push_back(std::to_string(character_corpses_entry.helm_texture)); + insert_values.push_back(std::to_string(character_corpses_entry.copper)); + insert_values.push_back(std::to_string(character_corpses_entry.silver)); + insert_values.push_back(std::to_string(character_corpses_entry.gold)); + insert_values.push_back(std::to_string(character_corpses_entry.platinum)); + insert_values.push_back(std::to_string(character_corpses_entry.hair_color)); + insert_values.push_back(std::to_string(character_corpses_entry.beard_color)); + insert_values.push_back(std::to_string(character_corpses_entry.eye_color_1)); + insert_values.push_back(std::to_string(character_corpses_entry.eye_color_2)); + insert_values.push_back(std::to_string(character_corpses_entry.hair_style)); + insert_values.push_back(std::to_string(character_corpses_entry.face)); + insert_values.push_back(std::to_string(character_corpses_entry.beard)); + insert_values.push_back(std::to_string(character_corpses_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(character_corpses_entry.drakkin_tattoo)); + insert_values.push_back(std::to_string(character_corpses_entry.drakkin_details)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_1)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_2)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_3)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_4)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_5)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_6)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_7)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_8)); + insert_values.push_back(std::to_string(character_corpses_entry.wc_9)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterCorpses entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.charname = row[2] ? row[2] : ""; + entry.zone_id = atoi(row[3]); + entry.instance_id = atoi(row[4]); + entry.x = static_cast(atof(row[5])); + entry.y = static_cast(atof(row[6])); + entry.z = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.time_of_death = row[9] ? row[9] : ""; + entry.guild_consent_id = atoi(row[10]); + entry.is_rezzed = atoi(row[11]); + entry.is_buried = atoi(row[12]); + entry.was_at_graveyard = atoi(row[13]); + entry.is_locked = atoi(row[14]); + entry.exp = atoi(row[15]); + entry.size = atoi(row[16]); + entry.level = atoi(row[17]); + entry.race = atoi(row[18]); + entry.gender = atoi(row[19]); + entry.class = atoi(row[20]); + entry.deity = atoi(row[21]); + entry.texture = atoi(row[22]); + entry.helm_texture = atoi(row[23]); + entry.copper = atoi(row[24]); + entry.silver = atoi(row[25]); + entry.gold = atoi(row[26]); + entry.platinum = atoi(row[27]); + entry.hair_color = atoi(row[28]); + entry.beard_color = atoi(row[29]); + entry.eye_color_1 = atoi(row[30]); + entry.eye_color_2 = atoi(row[31]); + entry.hair_style = atoi(row[32]); + entry.face = atoi(row[33]); + entry.beard = atoi(row[34]); + entry.drakkin_heritage = atoi(row[35]); + entry.drakkin_tattoo = atoi(row[36]); + entry.drakkin_details = atoi(row[37]); + entry.wc_1 = atoi(row[38]); + entry.wc_2 = atoi(row[39]); + entry.wc_3 = atoi(row[40]); + entry.wc_4 = atoi(row[41]); + entry.wc_5 = atoi(row[42]); + entry.wc_6 = atoi(row[43]); + entry.wc_7 = atoi(row[44]); + entry.wc_8 = atoi(row[45]); + entry.wc_9 = atoi(row[46]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterCorpses entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.charname = row[2] ? row[2] : ""; + entry.zone_id = atoi(row[3]); + entry.instance_id = atoi(row[4]); + entry.x = static_cast(atof(row[5])); + entry.y = static_cast(atof(row[6])); + entry.z = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.time_of_death = row[9] ? row[9] : ""; + entry.guild_consent_id = atoi(row[10]); + entry.is_rezzed = atoi(row[11]); + entry.is_buried = atoi(row[12]); + entry.was_at_graveyard = atoi(row[13]); + entry.is_locked = atoi(row[14]); + entry.exp = atoi(row[15]); + entry.size = atoi(row[16]); + entry.level = atoi(row[17]); + entry.race = atoi(row[18]); + entry.gender = atoi(row[19]); + entry.class = atoi(row[20]); + entry.deity = atoi(row[21]); + entry.texture = atoi(row[22]); + entry.helm_texture = atoi(row[23]); + entry.copper = atoi(row[24]); + entry.silver = atoi(row[25]); + entry.gold = atoi(row[26]); + entry.platinum = atoi(row[27]); + entry.hair_color = atoi(row[28]); + entry.beard_color = atoi(row[29]); + entry.eye_color_1 = atoi(row[30]); + entry.eye_color_2 = atoi(row[31]); + entry.hair_style = atoi(row[32]); + entry.face = atoi(row[33]); + entry.beard = atoi(row[34]); + entry.drakkin_heritage = atoi(row[35]); + entry.drakkin_tattoo = atoi(row[36]); + entry.drakkin_details = atoi(row[37]); + entry.wc_1 = atoi(row[38]); + entry.wc_2 = atoi(row[39]); + entry.wc_3 = atoi(row[40]); + entry.wc_4 = atoi(row[41]); + entry.wc_5 = atoi(row[42]); + entry.wc_6 = atoi(row[43]); + entry.wc_7 = atoi(row[44]); + entry.wc_8 = atoi(row[45]); + entry.wc_9 = atoi(row[46]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_CORPSES_REPOSITORY_H diff --git a/common/repositories/base/base_character_currency_repository.h b/common/repositories/base/base_character_currency_repository.h new file mode 100644 index 000000000..17134a15d --- /dev/null +++ b/common/repositories/base/base_character_currency_repository.h @@ -0,0 +1,428 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_CURRENCY_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_CURRENCY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterCurrencyRepository { +public: + struct CharacterCurrency { + int id; + int platinum; + int gold; + int silver; + int copper; + int platinum_bank; + int gold_bank; + int silver_bank; + int copper_bank; + int platinum_cursor; + int gold_cursor; + int silver_cursor; + int copper_cursor; + int radiant_crystals; + int career_radiant_crystals; + int ebon_crystals; + int career_ebon_crystals; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "platinum", + "gold", + "silver", + "copper", + "platinum_bank", + "gold_bank", + "silver_bank", + "copper_bank", + "platinum_cursor", + "gold_cursor", + "silver_cursor", + "copper_cursor", + "radiant_crystals", + "career_radiant_crystals", + "ebon_crystals", + "career_ebon_crystals", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_currency"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterCurrency NewEntity() + { + CharacterCurrency entry{}; + + entry.id = 0; + entry.platinum = 0; + entry.gold = 0; + entry.silver = 0; + entry.copper = 0; + entry.platinum_bank = 0; + entry.gold_bank = 0; + entry.silver_bank = 0; + entry.copper_bank = 0; + entry.platinum_cursor = 0; + entry.gold_cursor = 0; + entry.silver_cursor = 0; + entry.copper_cursor = 0; + entry.radiant_crystals = 0; + entry.career_radiant_crystals = 0; + entry.ebon_crystals = 0; + entry.career_ebon_crystals = 0; + + return entry; + } + + static CharacterCurrency GetCharacterCurrencyEntry( + const std::vector &character_currencys, + int character_currency_id + ) + { + for (auto &character_currency : character_currencys) { + if (character_currency.id == character_currency_id) { + return character_currency; + } + } + + return NewEntity(); + } + + static CharacterCurrency FindOne( + Database& db, + int character_currency_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_currency_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterCurrency entry{}; + + entry.id = atoi(row[0]); + entry.platinum = atoi(row[1]); + entry.gold = atoi(row[2]); + entry.silver = atoi(row[3]); + entry.copper = atoi(row[4]); + entry.platinum_bank = atoi(row[5]); + entry.gold_bank = atoi(row[6]); + entry.silver_bank = atoi(row[7]); + entry.copper_bank = atoi(row[8]); + entry.platinum_cursor = atoi(row[9]); + entry.gold_cursor = atoi(row[10]); + entry.silver_cursor = atoi(row[11]); + entry.copper_cursor = atoi(row[12]); + entry.radiant_crystals = atoi(row[13]); + entry.career_radiant_crystals = atoi(row[14]); + entry.ebon_crystals = atoi(row[15]); + entry.career_ebon_crystals = atoi(row[16]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_currency_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_currency_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterCurrency character_currency_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_currency_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_currency_entry.platinum)); + update_values.push_back(columns[2] + " = " + std::to_string(character_currency_entry.gold)); + update_values.push_back(columns[3] + " = " + std::to_string(character_currency_entry.silver)); + update_values.push_back(columns[4] + " = " + std::to_string(character_currency_entry.copper)); + update_values.push_back(columns[5] + " = " + std::to_string(character_currency_entry.platinum_bank)); + update_values.push_back(columns[6] + " = " + std::to_string(character_currency_entry.gold_bank)); + update_values.push_back(columns[7] + " = " + std::to_string(character_currency_entry.silver_bank)); + update_values.push_back(columns[8] + " = " + std::to_string(character_currency_entry.copper_bank)); + update_values.push_back(columns[9] + " = " + std::to_string(character_currency_entry.platinum_cursor)); + update_values.push_back(columns[10] + " = " + std::to_string(character_currency_entry.gold_cursor)); + update_values.push_back(columns[11] + " = " + std::to_string(character_currency_entry.silver_cursor)); + update_values.push_back(columns[12] + " = " + std::to_string(character_currency_entry.copper_cursor)); + update_values.push_back(columns[13] + " = " + std::to_string(character_currency_entry.radiant_crystals)); + update_values.push_back(columns[14] + " = " + std::to_string(character_currency_entry.career_radiant_crystals)); + update_values.push_back(columns[15] + " = " + std::to_string(character_currency_entry.ebon_crystals)); + update_values.push_back(columns[16] + " = " + std::to_string(character_currency_entry.career_ebon_crystals)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_currency_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterCurrency InsertOne( + Database& db, + CharacterCurrency character_currency_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_currency_entry.id)); + insert_values.push_back(std::to_string(character_currency_entry.platinum)); + insert_values.push_back(std::to_string(character_currency_entry.gold)); + insert_values.push_back(std::to_string(character_currency_entry.silver)); + insert_values.push_back(std::to_string(character_currency_entry.copper)); + insert_values.push_back(std::to_string(character_currency_entry.platinum_bank)); + insert_values.push_back(std::to_string(character_currency_entry.gold_bank)); + insert_values.push_back(std::to_string(character_currency_entry.silver_bank)); + insert_values.push_back(std::to_string(character_currency_entry.copper_bank)); + insert_values.push_back(std::to_string(character_currency_entry.platinum_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.gold_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.silver_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.copper_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.radiant_crystals)); + insert_values.push_back(std::to_string(character_currency_entry.career_radiant_crystals)); + insert_values.push_back(std::to_string(character_currency_entry.ebon_crystals)); + insert_values.push_back(std::to_string(character_currency_entry.career_ebon_crystals)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_currency_entry.id = results.LastInsertedID(); + return character_currency_entry; + } + + character_currency_entry = NewEntity(); + + return character_currency_entry; + } + + static int InsertMany( + Database& db, + std::vector character_currency_entries + ) + { + std::vector insert_chunks; + + for (auto &character_currency_entry: character_currency_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_currency_entry.id)); + insert_values.push_back(std::to_string(character_currency_entry.platinum)); + insert_values.push_back(std::to_string(character_currency_entry.gold)); + insert_values.push_back(std::to_string(character_currency_entry.silver)); + insert_values.push_back(std::to_string(character_currency_entry.copper)); + insert_values.push_back(std::to_string(character_currency_entry.platinum_bank)); + insert_values.push_back(std::to_string(character_currency_entry.gold_bank)); + insert_values.push_back(std::to_string(character_currency_entry.silver_bank)); + insert_values.push_back(std::to_string(character_currency_entry.copper_bank)); + insert_values.push_back(std::to_string(character_currency_entry.platinum_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.gold_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.silver_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.copper_cursor)); + insert_values.push_back(std::to_string(character_currency_entry.radiant_crystals)); + insert_values.push_back(std::to_string(character_currency_entry.career_radiant_crystals)); + insert_values.push_back(std::to_string(character_currency_entry.ebon_crystals)); + insert_values.push_back(std::to_string(character_currency_entry.career_ebon_crystals)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterCurrency entry{}; + + entry.id = atoi(row[0]); + entry.platinum = atoi(row[1]); + entry.gold = atoi(row[2]); + entry.silver = atoi(row[3]); + entry.copper = atoi(row[4]); + entry.platinum_bank = atoi(row[5]); + entry.gold_bank = atoi(row[6]); + entry.silver_bank = atoi(row[7]); + entry.copper_bank = atoi(row[8]); + entry.platinum_cursor = atoi(row[9]); + entry.gold_cursor = atoi(row[10]); + entry.silver_cursor = atoi(row[11]); + entry.copper_cursor = atoi(row[12]); + entry.radiant_crystals = atoi(row[13]); + entry.career_radiant_crystals = atoi(row[14]); + entry.ebon_crystals = atoi(row[15]); + entry.career_ebon_crystals = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterCurrency entry{}; + + entry.id = atoi(row[0]); + entry.platinum = atoi(row[1]); + entry.gold = atoi(row[2]); + entry.silver = atoi(row[3]); + entry.copper = atoi(row[4]); + entry.platinum_bank = atoi(row[5]); + entry.gold_bank = atoi(row[6]); + entry.silver_bank = atoi(row[7]); + entry.copper_bank = atoi(row[8]); + entry.platinum_cursor = atoi(row[9]); + entry.gold_cursor = atoi(row[10]); + entry.silver_cursor = atoi(row[11]); + entry.copper_cursor = atoi(row[12]); + entry.radiant_crystals = atoi(row[13]); + entry.career_radiant_crystals = atoi(row[14]); + entry.ebon_crystals = atoi(row[15]); + entry.career_ebon_crystals = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_CURRENCY_REPOSITORY_H diff --git a/common/repositories/base/base_character_data_repository.h b/common/repositories/base/base_character_data_repository.h new file mode 100644 index 000000000..623a5a875 --- /dev/null +++ b/common/repositories/base/base_character_data_repository.h @@ -0,0 +1,1192 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_DATA_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_DATA_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterDataRepository { +public: + struct CharacterData { + int id; + int account_id; + std::string name; + std::string last_name; + std::string title; + std::string suffix; + int zone_id; + int zone_instance; + float y; + float x; + float z; + float heading; + int gender; + int race; + int class; + int level; + int deity; + int birthday; + int last_login; + int time_played; + int level2; + int anon; + int gm; + int face; + int hair_color; + int hair_style; + int beard; + int beard_color; + int eye_color_1; + int eye_color_2; + int drakkin_heritage; + int drakkin_tattoo; + int drakkin_details; + int ability_time_seconds; + int ability_number; + int ability_time_minutes; + int ability_time_hours; + int exp; + int aa_points_spent; + int aa_exp; + int aa_points; + int group_leadership_exp; + int raid_leadership_exp; + int group_leadership_points; + int raid_leadership_points; + int points; + int cur_hp; + int mana; + int endurance; + int intoxication; + int str; + int sta; + int cha; + int dex; + int int; + int agi; + int wis; + int zone_change_count; + int toxicity; + int hunger_level; + int thirst_level; + int ability_up; + int ldon_points_guk; + int ldon_points_mir; + int ldon_points_mmc; + int ldon_points_ruj; + int ldon_points_tak; + int ldon_points_available; + int tribute_time_remaining; + int career_tribute_points; + int tribute_points; + int tribute_active; + int pvp_status; + int pvp_kills; + int pvp_deaths; + int pvp_current_points; + int pvp_career_points; + int pvp_best_kill_streak; + int pvp_worst_death_streak; + int pvp_current_kill_streak; + int pvp2; + int pvp_type; + int show_helm; + int group_auto_consent; + int raid_auto_consent; + int guild_auto_consent; + int leadership_exp_on; + int RestTimer; + int air_remaining; + int autosplit_enabled; + int lfp; + int lfg; + std::string mailkey; + int xtargets; + int firstlogon; + int e_aa_effects; + int e_percent_to_aa; + int e_expended_aa_spent; + int aa_points_spent_old; + int aa_points_old; + int e_last_invsnapshot; + std::string deleted_at; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "account_id", + "name", + "last_name", + "title", + "suffix", + "zone_id", + "zone_instance", + "y", + "x", + "z", + "heading", + "gender", + "race", + "class", + "level", + "deity", + "birthday", + "last_login", + "time_played", + "level2", + "anon", + "gm", + "face", + "hair_color", + "hair_style", + "beard", + "beard_color", + "eye_color_1", + "eye_color_2", + "drakkin_heritage", + "drakkin_tattoo", + "drakkin_details", + "ability_time_seconds", + "ability_number", + "ability_time_minutes", + "ability_time_hours", + "exp", + "aa_points_spent", + "aa_exp", + "aa_points", + "group_leadership_exp", + "raid_leadership_exp", + "group_leadership_points", + "raid_leadership_points", + "points", + "cur_hp", + "mana", + "endurance", + "intoxication", + "str", + "sta", + "cha", + "dex", + "int", + "agi", + "wis", + "zone_change_count", + "toxicity", + "hunger_level", + "thirst_level", + "ability_up", + "ldon_points_guk", + "ldon_points_mir", + "ldon_points_mmc", + "ldon_points_ruj", + "ldon_points_tak", + "ldon_points_available", + "tribute_time_remaining", + "career_tribute_points", + "tribute_points", + "tribute_active", + "pvp_status", + "pvp_kills", + "pvp_deaths", + "pvp_current_points", + "pvp_career_points", + "pvp_best_kill_streak", + "pvp_worst_death_streak", + "pvp_current_kill_streak", + "pvp2", + "pvp_type", + "show_helm", + "group_auto_consent", + "raid_auto_consent", + "guild_auto_consent", + "leadership_exp_on", + "RestTimer", + "air_remaining", + "autosplit_enabled", + "lfp", + "lfg", + "mailkey", + "xtargets", + "firstlogon", + "e_aa_effects", + "e_percent_to_aa", + "e_expended_aa_spent", + "aa_points_spent_old", + "aa_points_old", + "e_last_invsnapshot", + "deleted_at", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_data"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterData NewEntity() + { + CharacterData entry{}; + + entry.id = 0; + entry.account_id = 0; + entry.name = ""; + entry.last_name = ""; + entry.title = ""; + entry.suffix = ""; + entry.zone_id = 0; + entry.zone_instance = 0; + entry.y = 0; + entry.x = 0; + entry.z = 0; + entry.heading = 0; + entry.gender = 0; + entry.race = 0; + entry.class = 0; + entry.level = 0; + entry.deity = 0; + entry.birthday = 0; + entry.last_login = 0; + entry.time_played = 0; + entry.level2 = 0; + entry.anon = 0; + entry.gm = 0; + entry.face = 0; + entry.hair_color = 0; + entry.hair_style = 0; + entry.beard = 0; + entry.beard_color = 0; + entry.eye_color_1 = 0; + entry.eye_color_2 = 0; + entry.drakkin_heritage = 0; + entry.drakkin_tattoo = 0; + entry.drakkin_details = 0; + entry.ability_time_seconds = 0; + entry.ability_number = 0; + entry.ability_time_minutes = 0; + entry.ability_time_hours = 0; + entry.exp = 0; + entry.aa_points_spent = 0; + entry.aa_exp = 0; + entry.aa_points = 0; + entry.group_leadership_exp = 0; + entry.raid_leadership_exp = 0; + entry.group_leadership_points = 0; + entry.raid_leadership_points = 0; + entry.points = 0; + entry.cur_hp = 0; + entry.mana = 0; + entry.endurance = 0; + entry.intoxication = 0; + entry.str = 0; + entry.sta = 0; + entry.cha = 0; + entry.dex = 0; + entry.int = 0; + entry.agi = 0; + entry.wis = 0; + entry.zone_change_count = 0; + entry.toxicity = 0; + entry.hunger_level = 0; + entry.thirst_level = 0; + entry.ability_up = 0; + entry.ldon_points_guk = 0; + entry.ldon_points_mir = 0; + entry.ldon_points_mmc = 0; + entry.ldon_points_ruj = 0; + entry.ldon_points_tak = 0; + entry.ldon_points_available = 0; + entry.tribute_time_remaining = 0; + entry.career_tribute_points = 0; + entry.tribute_points = 0; + entry.tribute_active = 0; + entry.pvp_status = 0; + entry.pvp_kills = 0; + entry.pvp_deaths = 0; + entry.pvp_current_points = 0; + entry.pvp_career_points = 0; + entry.pvp_best_kill_streak = 0; + entry.pvp_worst_death_streak = 0; + entry.pvp_current_kill_streak = 0; + entry.pvp2 = 0; + entry.pvp_type = 0; + entry.show_helm = 0; + entry.group_auto_consent = 0; + entry.raid_auto_consent = 0; + entry.guild_auto_consent = 0; + entry.leadership_exp_on = 0; + entry.RestTimer = 0; + entry.air_remaining = 0; + entry.autosplit_enabled = 0; + entry.lfp = 0; + entry.lfg = 0; + entry.mailkey = ""; + entry.xtargets = 5; + entry.firstlogon = 0; + entry.e_aa_effects = 0; + entry.e_percent_to_aa = 0; + entry.e_expended_aa_spent = 0; + entry.aa_points_spent_old = 0; + entry.aa_points_old = 0; + entry.e_last_invsnapshot = 0; + entry.deleted_at = 0; + + return entry; + } + + static CharacterData GetCharacterDataEntry( + const std::vector &character_datas, + int character_data_id + ) + { + for (auto &character_data : character_datas) { + if (character_data.id == character_data_id) { + return character_data; + } + } + + return NewEntity(); + } + + static CharacterData FindOne( + Database& db, + int character_data_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_data_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterData entry{}; + + entry.id = atoi(row[0]); + entry.account_id = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.last_name = row[3] ? row[3] : ""; + entry.title = row[4] ? row[4] : ""; + entry.suffix = row[5] ? row[5] : ""; + entry.zone_id = atoi(row[6]); + entry.zone_instance = atoi(row[7]); + entry.y = static_cast(atof(row[8])); + entry.x = static_cast(atof(row[9])); + entry.z = static_cast(atof(row[10])); + entry.heading = static_cast(atof(row[11])); + entry.gender = atoi(row[12]); + entry.race = atoi(row[13]); + entry.class = atoi(row[14]); + entry.level = atoi(row[15]); + entry.deity = atoi(row[16]); + entry.birthday = atoi(row[17]); + entry.last_login = atoi(row[18]); + entry.time_played = atoi(row[19]); + entry.level2 = atoi(row[20]); + entry.anon = atoi(row[21]); + entry.gm = atoi(row[22]); + entry.face = atoi(row[23]); + entry.hair_color = atoi(row[24]); + entry.hair_style = atoi(row[25]); + entry.beard = atoi(row[26]); + entry.beard_color = atoi(row[27]); + entry.eye_color_1 = atoi(row[28]); + entry.eye_color_2 = atoi(row[29]); + entry.drakkin_heritage = atoi(row[30]); + entry.drakkin_tattoo = atoi(row[31]); + entry.drakkin_details = atoi(row[32]); + entry.ability_time_seconds = atoi(row[33]); + entry.ability_number = atoi(row[34]); + entry.ability_time_minutes = atoi(row[35]); + entry.ability_time_hours = atoi(row[36]); + entry.exp = atoi(row[37]); + entry.aa_points_spent = atoi(row[38]); + entry.aa_exp = atoi(row[39]); + entry.aa_points = atoi(row[40]); + entry.group_leadership_exp = atoi(row[41]); + entry.raid_leadership_exp = atoi(row[42]); + entry.group_leadership_points = atoi(row[43]); + entry.raid_leadership_points = atoi(row[44]); + entry.points = atoi(row[45]); + entry.cur_hp = atoi(row[46]); + entry.mana = atoi(row[47]); + entry.endurance = atoi(row[48]); + entry.intoxication = atoi(row[49]); + entry.str = atoi(row[50]); + entry.sta = atoi(row[51]); + entry.cha = atoi(row[52]); + entry.dex = atoi(row[53]); + entry.int = atoi(row[54]); + entry.agi = atoi(row[55]); + entry.wis = atoi(row[56]); + entry.zone_change_count = atoi(row[57]); + entry.toxicity = atoi(row[58]); + entry.hunger_level = atoi(row[59]); + entry.thirst_level = atoi(row[60]); + entry.ability_up = atoi(row[61]); + entry.ldon_points_guk = atoi(row[62]); + entry.ldon_points_mir = atoi(row[63]); + entry.ldon_points_mmc = atoi(row[64]); + entry.ldon_points_ruj = atoi(row[65]); + entry.ldon_points_tak = atoi(row[66]); + entry.ldon_points_available = atoi(row[67]); + entry.tribute_time_remaining = atoi(row[68]); + entry.career_tribute_points = atoi(row[69]); + entry.tribute_points = atoi(row[70]); + entry.tribute_active = atoi(row[71]); + entry.pvp_status = atoi(row[72]); + entry.pvp_kills = atoi(row[73]); + entry.pvp_deaths = atoi(row[74]); + entry.pvp_current_points = atoi(row[75]); + entry.pvp_career_points = atoi(row[76]); + entry.pvp_best_kill_streak = atoi(row[77]); + entry.pvp_worst_death_streak = atoi(row[78]); + entry.pvp_current_kill_streak = atoi(row[79]); + entry.pvp2 = atoi(row[80]); + entry.pvp_type = atoi(row[81]); + entry.show_helm = atoi(row[82]); + entry.group_auto_consent = atoi(row[83]); + entry.raid_auto_consent = atoi(row[84]); + entry.guild_auto_consent = atoi(row[85]); + entry.leadership_exp_on = atoi(row[86]); + entry.RestTimer = atoi(row[87]); + entry.air_remaining = atoi(row[88]); + entry.autosplit_enabled = atoi(row[89]); + entry.lfp = atoi(row[90]); + entry.lfg = atoi(row[91]); + entry.mailkey = row[92] ? row[92] : ""; + entry.xtargets = atoi(row[93]); + entry.firstlogon = atoi(row[94]); + entry.e_aa_effects = atoi(row[95]); + entry.e_percent_to_aa = atoi(row[96]); + entry.e_expended_aa_spent = atoi(row[97]); + entry.aa_points_spent_old = atoi(row[98]); + entry.aa_points_old = atoi(row[99]); + entry.e_last_invsnapshot = atoi(row[100]); + entry.deleted_at = row[101] ? row[101] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_data_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_data_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterData character_data_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_data_entry.account_id)); + update_values.push_back(columns[2] + " = '" + EscapeString(character_data_entry.name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(character_data_entry.last_name) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(character_data_entry.title) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(character_data_entry.suffix) + "'"); + update_values.push_back(columns[6] + " = " + std::to_string(character_data_entry.zone_id)); + update_values.push_back(columns[7] + " = " + std::to_string(character_data_entry.zone_instance)); + update_values.push_back(columns[8] + " = " + std::to_string(character_data_entry.y)); + update_values.push_back(columns[9] + " = " + std::to_string(character_data_entry.x)); + update_values.push_back(columns[10] + " = " + std::to_string(character_data_entry.z)); + update_values.push_back(columns[11] + " = " + std::to_string(character_data_entry.heading)); + update_values.push_back(columns[12] + " = " + std::to_string(character_data_entry.gender)); + update_values.push_back(columns[13] + " = " + std::to_string(character_data_entry.race)); + update_values.push_back(columns[14] + " = " + std::to_string(character_data_entry.class)); + update_values.push_back(columns[15] + " = " + std::to_string(character_data_entry.level)); + update_values.push_back(columns[16] + " = " + std::to_string(character_data_entry.deity)); + update_values.push_back(columns[17] + " = " + std::to_string(character_data_entry.birthday)); + update_values.push_back(columns[18] + " = " + std::to_string(character_data_entry.last_login)); + update_values.push_back(columns[19] + " = " + std::to_string(character_data_entry.time_played)); + update_values.push_back(columns[20] + " = " + std::to_string(character_data_entry.level2)); + update_values.push_back(columns[21] + " = " + std::to_string(character_data_entry.anon)); + update_values.push_back(columns[22] + " = " + std::to_string(character_data_entry.gm)); + update_values.push_back(columns[23] + " = " + std::to_string(character_data_entry.face)); + update_values.push_back(columns[24] + " = " + std::to_string(character_data_entry.hair_color)); + update_values.push_back(columns[25] + " = " + std::to_string(character_data_entry.hair_style)); + update_values.push_back(columns[26] + " = " + std::to_string(character_data_entry.beard)); + update_values.push_back(columns[27] + " = " + std::to_string(character_data_entry.beard_color)); + update_values.push_back(columns[28] + " = " + std::to_string(character_data_entry.eye_color_1)); + update_values.push_back(columns[29] + " = " + std::to_string(character_data_entry.eye_color_2)); + update_values.push_back(columns[30] + " = " + std::to_string(character_data_entry.drakkin_heritage)); + update_values.push_back(columns[31] + " = " + std::to_string(character_data_entry.drakkin_tattoo)); + update_values.push_back(columns[32] + " = " + std::to_string(character_data_entry.drakkin_details)); + update_values.push_back(columns[33] + " = " + std::to_string(character_data_entry.ability_time_seconds)); + update_values.push_back(columns[34] + " = " + std::to_string(character_data_entry.ability_number)); + update_values.push_back(columns[35] + " = " + std::to_string(character_data_entry.ability_time_minutes)); + update_values.push_back(columns[36] + " = " + std::to_string(character_data_entry.ability_time_hours)); + update_values.push_back(columns[37] + " = " + std::to_string(character_data_entry.exp)); + update_values.push_back(columns[38] + " = " + std::to_string(character_data_entry.aa_points_spent)); + update_values.push_back(columns[39] + " = " + std::to_string(character_data_entry.aa_exp)); + update_values.push_back(columns[40] + " = " + std::to_string(character_data_entry.aa_points)); + update_values.push_back(columns[41] + " = " + std::to_string(character_data_entry.group_leadership_exp)); + update_values.push_back(columns[42] + " = " + std::to_string(character_data_entry.raid_leadership_exp)); + update_values.push_back(columns[43] + " = " + std::to_string(character_data_entry.group_leadership_points)); + update_values.push_back(columns[44] + " = " + std::to_string(character_data_entry.raid_leadership_points)); + update_values.push_back(columns[45] + " = " + std::to_string(character_data_entry.points)); + update_values.push_back(columns[46] + " = " + std::to_string(character_data_entry.cur_hp)); + update_values.push_back(columns[47] + " = " + std::to_string(character_data_entry.mana)); + update_values.push_back(columns[48] + " = " + std::to_string(character_data_entry.endurance)); + update_values.push_back(columns[49] + " = " + std::to_string(character_data_entry.intoxication)); + update_values.push_back(columns[50] + " = " + std::to_string(character_data_entry.str)); + update_values.push_back(columns[51] + " = " + std::to_string(character_data_entry.sta)); + update_values.push_back(columns[52] + " = " + std::to_string(character_data_entry.cha)); + update_values.push_back(columns[53] + " = " + std::to_string(character_data_entry.dex)); + update_values.push_back(columns[54] + " = " + std::to_string(character_data_entry.int)); + update_values.push_back(columns[55] + " = " + std::to_string(character_data_entry.agi)); + update_values.push_back(columns[56] + " = " + std::to_string(character_data_entry.wis)); + update_values.push_back(columns[57] + " = " + std::to_string(character_data_entry.zone_change_count)); + update_values.push_back(columns[58] + " = " + std::to_string(character_data_entry.toxicity)); + update_values.push_back(columns[59] + " = " + std::to_string(character_data_entry.hunger_level)); + update_values.push_back(columns[60] + " = " + std::to_string(character_data_entry.thirst_level)); + update_values.push_back(columns[61] + " = " + std::to_string(character_data_entry.ability_up)); + update_values.push_back(columns[62] + " = " + std::to_string(character_data_entry.ldon_points_guk)); + update_values.push_back(columns[63] + " = " + std::to_string(character_data_entry.ldon_points_mir)); + update_values.push_back(columns[64] + " = " + std::to_string(character_data_entry.ldon_points_mmc)); + update_values.push_back(columns[65] + " = " + std::to_string(character_data_entry.ldon_points_ruj)); + update_values.push_back(columns[66] + " = " + std::to_string(character_data_entry.ldon_points_tak)); + update_values.push_back(columns[67] + " = " + std::to_string(character_data_entry.ldon_points_available)); + update_values.push_back(columns[68] + " = " + std::to_string(character_data_entry.tribute_time_remaining)); + update_values.push_back(columns[69] + " = " + std::to_string(character_data_entry.career_tribute_points)); + update_values.push_back(columns[70] + " = " + std::to_string(character_data_entry.tribute_points)); + update_values.push_back(columns[71] + " = " + std::to_string(character_data_entry.tribute_active)); + update_values.push_back(columns[72] + " = " + std::to_string(character_data_entry.pvp_status)); + update_values.push_back(columns[73] + " = " + std::to_string(character_data_entry.pvp_kills)); + update_values.push_back(columns[74] + " = " + std::to_string(character_data_entry.pvp_deaths)); + update_values.push_back(columns[75] + " = " + std::to_string(character_data_entry.pvp_current_points)); + update_values.push_back(columns[76] + " = " + std::to_string(character_data_entry.pvp_career_points)); + update_values.push_back(columns[77] + " = " + std::to_string(character_data_entry.pvp_best_kill_streak)); + update_values.push_back(columns[78] + " = " + std::to_string(character_data_entry.pvp_worst_death_streak)); + update_values.push_back(columns[79] + " = " + std::to_string(character_data_entry.pvp_current_kill_streak)); + update_values.push_back(columns[80] + " = " + std::to_string(character_data_entry.pvp2)); + update_values.push_back(columns[81] + " = " + std::to_string(character_data_entry.pvp_type)); + update_values.push_back(columns[82] + " = " + std::to_string(character_data_entry.show_helm)); + update_values.push_back(columns[83] + " = " + std::to_string(character_data_entry.group_auto_consent)); + update_values.push_back(columns[84] + " = " + std::to_string(character_data_entry.raid_auto_consent)); + update_values.push_back(columns[85] + " = " + std::to_string(character_data_entry.guild_auto_consent)); + update_values.push_back(columns[86] + " = " + std::to_string(character_data_entry.leadership_exp_on)); + update_values.push_back(columns[87] + " = " + std::to_string(character_data_entry.RestTimer)); + update_values.push_back(columns[88] + " = " + std::to_string(character_data_entry.air_remaining)); + update_values.push_back(columns[89] + " = " + std::to_string(character_data_entry.autosplit_enabled)); + update_values.push_back(columns[90] + " = " + std::to_string(character_data_entry.lfp)); + update_values.push_back(columns[91] + " = " + std::to_string(character_data_entry.lfg)); + update_values.push_back(columns[92] + " = '" + EscapeString(character_data_entry.mailkey) + "'"); + update_values.push_back(columns[93] + " = " + std::to_string(character_data_entry.xtargets)); + update_values.push_back(columns[94] + " = " + std::to_string(character_data_entry.firstlogon)); + update_values.push_back(columns[95] + " = " + std::to_string(character_data_entry.e_aa_effects)); + update_values.push_back(columns[96] + " = " + std::to_string(character_data_entry.e_percent_to_aa)); + update_values.push_back(columns[97] + " = " + std::to_string(character_data_entry.e_expended_aa_spent)); + update_values.push_back(columns[98] + " = " + std::to_string(character_data_entry.aa_points_spent_old)); + update_values.push_back(columns[99] + " = " + std::to_string(character_data_entry.aa_points_old)); + update_values.push_back(columns[100] + " = " + std::to_string(character_data_entry.e_last_invsnapshot)); + update_values.push_back(columns[101] + " = '" + EscapeString(character_data_entry.deleted_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_data_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterData InsertOne( + Database& db, + CharacterData character_data_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_data_entry.id)); + insert_values.push_back(std::to_string(character_data_entry.account_id)); + insert_values.push_back("'" + EscapeString(character_data_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(character_data_entry.last_name) + "'"); + insert_values.push_back("'" + EscapeString(character_data_entry.title) + "'"); + insert_values.push_back("'" + EscapeString(character_data_entry.suffix) + "'"); + insert_values.push_back(std::to_string(character_data_entry.zone_id)); + insert_values.push_back(std::to_string(character_data_entry.zone_instance)); + insert_values.push_back(std::to_string(character_data_entry.y)); + insert_values.push_back(std::to_string(character_data_entry.x)); + insert_values.push_back(std::to_string(character_data_entry.z)); + insert_values.push_back(std::to_string(character_data_entry.heading)); + insert_values.push_back(std::to_string(character_data_entry.gender)); + insert_values.push_back(std::to_string(character_data_entry.race)); + insert_values.push_back(std::to_string(character_data_entry.class)); + insert_values.push_back(std::to_string(character_data_entry.level)); + insert_values.push_back(std::to_string(character_data_entry.deity)); + insert_values.push_back(std::to_string(character_data_entry.birthday)); + insert_values.push_back(std::to_string(character_data_entry.last_login)); + insert_values.push_back(std::to_string(character_data_entry.time_played)); + insert_values.push_back(std::to_string(character_data_entry.level2)); + insert_values.push_back(std::to_string(character_data_entry.anon)); + insert_values.push_back(std::to_string(character_data_entry.gm)); + insert_values.push_back(std::to_string(character_data_entry.face)); + insert_values.push_back(std::to_string(character_data_entry.hair_color)); + insert_values.push_back(std::to_string(character_data_entry.hair_style)); + insert_values.push_back(std::to_string(character_data_entry.beard)); + insert_values.push_back(std::to_string(character_data_entry.beard_color)); + insert_values.push_back(std::to_string(character_data_entry.eye_color_1)); + insert_values.push_back(std::to_string(character_data_entry.eye_color_2)); + insert_values.push_back(std::to_string(character_data_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(character_data_entry.drakkin_tattoo)); + insert_values.push_back(std::to_string(character_data_entry.drakkin_details)); + insert_values.push_back(std::to_string(character_data_entry.ability_time_seconds)); + insert_values.push_back(std::to_string(character_data_entry.ability_number)); + insert_values.push_back(std::to_string(character_data_entry.ability_time_minutes)); + insert_values.push_back(std::to_string(character_data_entry.ability_time_hours)); + insert_values.push_back(std::to_string(character_data_entry.exp)); + insert_values.push_back(std::to_string(character_data_entry.aa_points_spent)); + insert_values.push_back(std::to_string(character_data_entry.aa_exp)); + insert_values.push_back(std::to_string(character_data_entry.aa_points)); + insert_values.push_back(std::to_string(character_data_entry.group_leadership_exp)); + insert_values.push_back(std::to_string(character_data_entry.raid_leadership_exp)); + insert_values.push_back(std::to_string(character_data_entry.group_leadership_points)); + insert_values.push_back(std::to_string(character_data_entry.raid_leadership_points)); + insert_values.push_back(std::to_string(character_data_entry.points)); + insert_values.push_back(std::to_string(character_data_entry.cur_hp)); + insert_values.push_back(std::to_string(character_data_entry.mana)); + insert_values.push_back(std::to_string(character_data_entry.endurance)); + insert_values.push_back(std::to_string(character_data_entry.intoxication)); + insert_values.push_back(std::to_string(character_data_entry.str)); + insert_values.push_back(std::to_string(character_data_entry.sta)); + insert_values.push_back(std::to_string(character_data_entry.cha)); + insert_values.push_back(std::to_string(character_data_entry.dex)); + insert_values.push_back(std::to_string(character_data_entry.int)); + insert_values.push_back(std::to_string(character_data_entry.agi)); + insert_values.push_back(std::to_string(character_data_entry.wis)); + insert_values.push_back(std::to_string(character_data_entry.zone_change_count)); + insert_values.push_back(std::to_string(character_data_entry.toxicity)); + insert_values.push_back(std::to_string(character_data_entry.hunger_level)); + insert_values.push_back(std::to_string(character_data_entry.thirst_level)); + insert_values.push_back(std::to_string(character_data_entry.ability_up)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_guk)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_mir)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_mmc)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_ruj)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_tak)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_available)); + insert_values.push_back(std::to_string(character_data_entry.tribute_time_remaining)); + insert_values.push_back(std::to_string(character_data_entry.career_tribute_points)); + insert_values.push_back(std::to_string(character_data_entry.tribute_points)); + insert_values.push_back(std::to_string(character_data_entry.tribute_active)); + insert_values.push_back(std::to_string(character_data_entry.pvp_status)); + insert_values.push_back(std::to_string(character_data_entry.pvp_kills)); + insert_values.push_back(std::to_string(character_data_entry.pvp_deaths)); + insert_values.push_back(std::to_string(character_data_entry.pvp_current_points)); + insert_values.push_back(std::to_string(character_data_entry.pvp_career_points)); + insert_values.push_back(std::to_string(character_data_entry.pvp_best_kill_streak)); + insert_values.push_back(std::to_string(character_data_entry.pvp_worst_death_streak)); + insert_values.push_back(std::to_string(character_data_entry.pvp_current_kill_streak)); + insert_values.push_back(std::to_string(character_data_entry.pvp2)); + insert_values.push_back(std::to_string(character_data_entry.pvp_type)); + insert_values.push_back(std::to_string(character_data_entry.show_helm)); + insert_values.push_back(std::to_string(character_data_entry.group_auto_consent)); + insert_values.push_back(std::to_string(character_data_entry.raid_auto_consent)); + insert_values.push_back(std::to_string(character_data_entry.guild_auto_consent)); + insert_values.push_back(std::to_string(character_data_entry.leadership_exp_on)); + insert_values.push_back(std::to_string(character_data_entry.RestTimer)); + insert_values.push_back(std::to_string(character_data_entry.air_remaining)); + insert_values.push_back(std::to_string(character_data_entry.autosplit_enabled)); + insert_values.push_back(std::to_string(character_data_entry.lfp)); + insert_values.push_back(std::to_string(character_data_entry.lfg)); + insert_values.push_back("'" + EscapeString(character_data_entry.mailkey) + "'"); + insert_values.push_back(std::to_string(character_data_entry.xtargets)); + insert_values.push_back(std::to_string(character_data_entry.firstlogon)); + insert_values.push_back(std::to_string(character_data_entry.e_aa_effects)); + insert_values.push_back(std::to_string(character_data_entry.e_percent_to_aa)); + insert_values.push_back(std::to_string(character_data_entry.e_expended_aa_spent)); + insert_values.push_back(std::to_string(character_data_entry.aa_points_spent_old)); + insert_values.push_back(std::to_string(character_data_entry.aa_points_old)); + insert_values.push_back(std::to_string(character_data_entry.e_last_invsnapshot)); + insert_values.push_back("'" + EscapeString(character_data_entry.deleted_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_data_entry.id = results.LastInsertedID(); + return character_data_entry; + } + + character_data_entry = NewEntity(); + + return character_data_entry; + } + + static int InsertMany( + Database& db, + std::vector character_data_entries + ) + { + std::vector insert_chunks; + + for (auto &character_data_entry: character_data_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_data_entry.id)); + insert_values.push_back(std::to_string(character_data_entry.account_id)); + insert_values.push_back("'" + EscapeString(character_data_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(character_data_entry.last_name) + "'"); + insert_values.push_back("'" + EscapeString(character_data_entry.title) + "'"); + insert_values.push_back("'" + EscapeString(character_data_entry.suffix) + "'"); + insert_values.push_back(std::to_string(character_data_entry.zone_id)); + insert_values.push_back(std::to_string(character_data_entry.zone_instance)); + insert_values.push_back(std::to_string(character_data_entry.y)); + insert_values.push_back(std::to_string(character_data_entry.x)); + insert_values.push_back(std::to_string(character_data_entry.z)); + insert_values.push_back(std::to_string(character_data_entry.heading)); + insert_values.push_back(std::to_string(character_data_entry.gender)); + insert_values.push_back(std::to_string(character_data_entry.race)); + insert_values.push_back(std::to_string(character_data_entry.class)); + insert_values.push_back(std::to_string(character_data_entry.level)); + insert_values.push_back(std::to_string(character_data_entry.deity)); + insert_values.push_back(std::to_string(character_data_entry.birthday)); + insert_values.push_back(std::to_string(character_data_entry.last_login)); + insert_values.push_back(std::to_string(character_data_entry.time_played)); + insert_values.push_back(std::to_string(character_data_entry.level2)); + insert_values.push_back(std::to_string(character_data_entry.anon)); + insert_values.push_back(std::to_string(character_data_entry.gm)); + insert_values.push_back(std::to_string(character_data_entry.face)); + insert_values.push_back(std::to_string(character_data_entry.hair_color)); + insert_values.push_back(std::to_string(character_data_entry.hair_style)); + insert_values.push_back(std::to_string(character_data_entry.beard)); + insert_values.push_back(std::to_string(character_data_entry.beard_color)); + insert_values.push_back(std::to_string(character_data_entry.eye_color_1)); + insert_values.push_back(std::to_string(character_data_entry.eye_color_2)); + insert_values.push_back(std::to_string(character_data_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(character_data_entry.drakkin_tattoo)); + insert_values.push_back(std::to_string(character_data_entry.drakkin_details)); + insert_values.push_back(std::to_string(character_data_entry.ability_time_seconds)); + insert_values.push_back(std::to_string(character_data_entry.ability_number)); + insert_values.push_back(std::to_string(character_data_entry.ability_time_minutes)); + insert_values.push_back(std::to_string(character_data_entry.ability_time_hours)); + insert_values.push_back(std::to_string(character_data_entry.exp)); + insert_values.push_back(std::to_string(character_data_entry.aa_points_spent)); + insert_values.push_back(std::to_string(character_data_entry.aa_exp)); + insert_values.push_back(std::to_string(character_data_entry.aa_points)); + insert_values.push_back(std::to_string(character_data_entry.group_leadership_exp)); + insert_values.push_back(std::to_string(character_data_entry.raid_leadership_exp)); + insert_values.push_back(std::to_string(character_data_entry.group_leadership_points)); + insert_values.push_back(std::to_string(character_data_entry.raid_leadership_points)); + insert_values.push_back(std::to_string(character_data_entry.points)); + insert_values.push_back(std::to_string(character_data_entry.cur_hp)); + insert_values.push_back(std::to_string(character_data_entry.mana)); + insert_values.push_back(std::to_string(character_data_entry.endurance)); + insert_values.push_back(std::to_string(character_data_entry.intoxication)); + insert_values.push_back(std::to_string(character_data_entry.str)); + insert_values.push_back(std::to_string(character_data_entry.sta)); + insert_values.push_back(std::to_string(character_data_entry.cha)); + insert_values.push_back(std::to_string(character_data_entry.dex)); + insert_values.push_back(std::to_string(character_data_entry.int)); + insert_values.push_back(std::to_string(character_data_entry.agi)); + insert_values.push_back(std::to_string(character_data_entry.wis)); + insert_values.push_back(std::to_string(character_data_entry.zone_change_count)); + insert_values.push_back(std::to_string(character_data_entry.toxicity)); + insert_values.push_back(std::to_string(character_data_entry.hunger_level)); + insert_values.push_back(std::to_string(character_data_entry.thirst_level)); + insert_values.push_back(std::to_string(character_data_entry.ability_up)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_guk)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_mir)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_mmc)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_ruj)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_tak)); + insert_values.push_back(std::to_string(character_data_entry.ldon_points_available)); + insert_values.push_back(std::to_string(character_data_entry.tribute_time_remaining)); + insert_values.push_back(std::to_string(character_data_entry.career_tribute_points)); + insert_values.push_back(std::to_string(character_data_entry.tribute_points)); + insert_values.push_back(std::to_string(character_data_entry.tribute_active)); + insert_values.push_back(std::to_string(character_data_entry.pvp_status)); + insert_values.push_back(std::to_string(character_data_entry.pvp_kills)); + insert_values.push_back(std::to_string(character_data_entry.pvp_deaths)); + insert_values.push_back(std::to_string(character_data_entry.pvp_current_points)); + insert_values.push_back(std::to_string(character_data_entry.pvp_career_points)); + insert_values.push_back(std::to_string(character_data_entry.pvp_best_kill_streak)); + insert_values.push_back(std::to_string(character_data_entry.pvp_worst_death_streak)); + insert_values.push_back(std::to_string(character_data_entry.pvp_current_kill_streak)); + insert_values.push_back(std::to_string(character_data_entry.pvp2)); + insert_values.push_back(std::to_string(character_data_entry.pvp_type)); + insert_values.push_back(std::to_string(character_data_entry.show_helm)); + insert_values.push_back(std::to_string(character_data_entry.group_auto_consent)); + insert_values.push_back(std::to_string(character_data_entry.raid_auto_consent)); + insert_values.push_back(std::to_string(character_data_entry.guild_auto_consent)); + insert_values.push_back(std::to_string(character_data_entry.leadership_exp_on)); + insert_values.push_back(std::to_string(character_data_entry.RestTimer)); + insert_values.push_back(std::to_string(character_data_entry.air_remaining)); + insert_values.push_back(std::to_string(character_data_entry.autosplit_enabled)); + insert_values.push_back(std::to_string(character_data_entry.lfp)); + insert_values.push_back(std::to_string(character_data_entry.lfg)); + insert_values.push_back("'" + EscapeString(character_data_entry.mailkey) + "'"); + insert_values.push_back(std::to_string(character_data_entry.xtargets)); + insert_values.push_back(std::to_string(character_data_entry.firstlogon)); + insert_values.push_back(std::to_string(character_data_entry.e_aa_effects)); + insert_values.push_back(std::to_string(character_data_entry.e_percent_to_aa)); + insert_values.push_back(std::to_string(character_data_entry.e_expended_aa_spent)); + insert_values.push_back(std::to_string(character_data_entry.aa_points_spent_old)); + insert_values.push_back(std::to_string(character_data_entry.aa_points_old)); + insert_values.push_back(std::to_string(character_data_entry.e_last_invsnapshot)); + insert_values.push_back("'" + EscapeString(character_data_entry.deleted_at) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterData entry{}; + + entry.id = atoi(row[0]); + entry.account_id = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.last_name = row[3] ? row[3] : ""; + entry.title = row[4] ? row[4] : ""; + entry.suffix = row[5] ? row[5] : ""; + entry.zone_id = atoi(row[6]); + entry.zone_instance = atoi(row[7]); + entry.y = static_cast(atof(row[8])); + entry.x = static_cast(atof(row[9])); + entry.z = static_cast(atof(row[10])); + entry.heading = static_cast(atof(row[11])); + entry.gender = atoi(row[12]); + entry.race = atoi(row[13]); + entry.class = atoi(row[14]); + entry.level = atoi(row[15]); + entry.deity = atoi(row[16]); + entry.birthday = atoi(row[17]); + entry.last_login = atoi(row[18]); + entry.time_played = atoi(row[19]); + entry.level2 = atoi(row[20]); + entry.anon = atoi(row[21]); + entry.gm = atoi(row[22]); + entry.face = atoi(row[23]); + entry.hair_color = atoi(row[24]); + entry.hair_style = atoi(row[25]); + entry.beard = atoi(row[26]); + entry.beard_color = atoi(row[27]); + entry.eye_color_1 = atoi(row[28]); + entry.eye_color_2 = atoi(row[29]); + entry.drakkin_heritage = atoi(row[30]); + entry.drakkin_tattoo = atoi(row[31]); + entry.drakkin_details = atoi(row[32]); + entry.ability_time_seconds = atoi(row[33]); + entry.ability_number = atoi(row[34]); + entry.ability_time_minutes = atoi(row[35]); + entry.ability_time_hours = atoi(row[36]); + entry.exp = atoi(row[37]); + entry.aa_points_spent = atoi(row[38]); + entry.aa_exp = atoi(row[39]); + entry.aa_points = atoi(row[40]); + entry.group_leadership_exp = atoi(row[41]); + entry.raid_leadership_exp = atoi(row[42]); + entry.group_leadership_points = atoi(row[43]); + entry.raid_leadership_points = atoi(row[44]); + entry.points = atoi(row[45]); + entry.cur_hp = atoi(row[46]); + entry.mana = atoi(row[47]); + entry.endurance = atoi(row[48]); + entry.intoxication = atoi(row[49]); + entry.str = atoi(row[50]); + entry.sta = atoi(row[51]); + entry.cha = atoi(row[52]); + entry.dex = atoi(row[53]); + entry.int = atoi(row[54]); + entry.agi = atoi(row[55]); + entry.wis = atoi(row[56]); + entry.zone_change_count = atoi(row[57]); + entry.toxicity = atoi(row[58]); + entry.hunger_level = atoi(row[59]); + entry.thirst_level = atoi(row[60]); + entry.ability_up = atoi(row[61]); + entry.ldon_points_guk = atoi(row[62]); + entry.ldon_points_mir = atoi(row[63]); + entry.ldon_points_mmc = atoi(row[64]); + entry.ldon_points_ruj = atoi(row[65]); + entry.ldon_points_tak = atoi(row[66]); + entry.ldon_points_available = atoi(row[67]); + entry.tribute_time_remaining = atoi(row[68]); + entry.career_tribute_points = atoi(row[69]); + entry.tribute_points = atoi(row[70]); + entry.tribute_active = atoi(row[71]); + entry.pvp_status = atoi(row[72]); + entry.pvp_kills = atoi(row[73]); + entry.pvp_deaths = atoi(row[74]); + entry.pvp_current_points = atoi(row[75]); + entry.pvp_career_points = atoi(row[76]); + entry.pvp_best_kill_streak = atoi(row[77]); + entry.pvp_worst_death_streak = atoi(row[78]); + entry.pvp_current_kill_streak = atoi(row[79]); + entry.pvp2 = atoi(row[80]); + entry.pvp_type = atoi(row[81]); + entry.show_helm = atoi(row[82]); + entry.group_auto_consent = atoi(row[83]); + entry.raid_auto_consent = atoi(row[84]); + entry.guild_auto_consent = atoi(row[85]); + entry.leadership_exp_on = atoi(row[86]); + entry.RestTimer = atoi(row[87]); + entry.air_remaining = atoi(row[88]); + entry.autosplit_enabled = atoi(row[89]); + entry.lfp = atoi(row[90]); + entry.lfg = atoi(row[91]); + entry.mailkey = row[92] ? row[92] : ""; + entry.xtargets = atoi(row[93]); + entry.firstlogon = atoi(row[94]); + entry.e_aa_effects = atoi(row[95]); + entry.e_percent_to_aa = atoi(row[96]); + entry.e_expended_aa_spent = atoi(row[97]); + entry.aa_points_spent_old = atoi(row[98]); + entry.aa_points_old = atoi(row[99]); + entry.e_last_invsnapshot = atoi(row[100]); + entry.deleted_at = row[101] ? row[101] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterData entry{}; + + entry.id = atoi(row[0]); + entry.account_id = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.last_name = row[3] ? row[3] : ""; + entry.title = row[4] ? row[4] : ""; + entry.suffix = row[5] ? row[5] : ""; + entry.zone_id = atoi(row[6]); + entry.zone_instance = atoi(row[7]); + entry.y = static_cast(atof(row[8])); + entry.x = static_cast(atof(row[9])); + entry.z = static_cast(atof(row[10])); + entry.heading = static_cast(atof(row[11])); + entry.gender = atoi(row[12]); + entry.race = atoi(row[13]); + entry.class = atoi(row[14]); + entry.level = atoi(row[15]); + entry.deity = atoi(row[16]); + entry.birthday = atoi(row[17]); + entry.last_login = atoi(row[18]); + entry.time_played = atoi(row[19]); + entry.level2 = atoi(row[20]); + entry.anon = atoi(row[21]); + entry.gm = atoi(row[22]); + entry.face = atoi(row[23]); + entry.hair_color = atoi(row[24]); + entry.hair_style = atoi(row[25]); + entry.beard = atoi(row[26]); + entry.beard_color = atoi(row[27]); + entry.eye_color_1 = atoi(row[28]); + entry.eye_color_2 = atoi(row[29]); + entry.drakkin_heritage = atoi(row[30]); + entry.drakkin_tattoo = atoi(row[31]); + entry.drakkin_details = atoi(row[32]); + entry.ability_time_seconds = atoi(row[33]); + entry.ability_number = atoi(row[34]); + entry.ability_time_minutes = atoi(row[35]); + entry.ability_time_hours = atoi(row[36]); + entry.exp = atoi(row[37]); + entry.aa_points_spent = atoi(row[38]); + entry.aa_exp = atoi(row[39]); + entry.aa_points = atoi(row[40]); + entry.group_leadership_exp = atoi(row[41]); + entry.raid_leadership_exp = atoi(row[42]); + entry.group_leadership_points = atoi(row[43]); + entry.raid_leadership_points = atoi(row[44]); + entry.points = atoi(row[45]); + entry.cur_hp = atoi(row[46]); + entry.mana = atoi(row[47]); + entry.endurance = atoi(row[48]); + entry.intoxication = atoi(row[49]); + entry.str = atoi(row[50]); + entry.sta = atoi(row[51]); + entry.cha = atoi(row[52]); + entry.dex = atoi(row[53]); + entry.int = atoi(row[54]); + entry.agi = atoi(row[55]); + entry.wis = atoi(row[56]); + entry.zone_change_count = atoi(row[57]); + entry.toxicity = atoi(row[58]); + entry.hunger_level = atoi(row[59]); + entry.thirst_level = atoi(row[60]); + entry.ability_up = atoi(row[61]); + entry.ldon_points_guk = atoi(row[62]); + entry.ldon_points_mir = atoi(row[63]); + entry.ldon_points_mmc = atoi(row[64]); + entry.ldon_points_ruj = atoi(row[65]); + entry.ldon_points_tak = atoi(row[66]); + entry.ldon_points_available = atoi(row[67]); + entry.tribute_time_remaining = atoi(row[68]); + entry.career_tribute_points = atoi(row[69]); + entry.tribute_points = atoi(row[70]); + entry.tribute_active = atoi(row[71]); + entry.pvp_status = atoi(row[72]); + entry.pvp_kills = atoi(row[73]); + entry.pvp_deaths = atoi(row[74]); + entry.pvp_current_points = atoi(row[75]); + entry.pvp_career_points = atoi(row[76]); + entry.pvp_best_kill_streak = atoi(row[77]); + entry.pvp_worst_death_streak = atoi(row[78]); + entry.pvp_current_kill_streak = atoi(row[79]); + entry.pvp2 = atoi(row[80]); + entry.pvp_type = atoi(row[81]); + entry.show_helm = atoi(row[82]); + entry.group_auto_consent = atoi(row[83]); + entry.raid_auto_consent = atoi(row[84]); + entry.guild_auto_consent = atoi(row[85]); + entry.leadership_exp_on = atoi(row[86]); + entry.RestTimer = atoi(row[87]); + entry.air_remaining = atoi(row[88]); + entry.autosplit_enabled = atoi(row[89]); + entry.lfp = atoi(row[90]); + entry.lfg = atoi(row[91]); + entry.mailkey = row[92] ? row[92] : ""; + entry.xtargets = atoi(row[93]); + entry.firstlogon = atoi(row[94]); + entry.e_aa_effects = atoi(row[95]); + entry.e_percent_to_aa = atoi(row[96]); + entry.e_expended_aa_spent = atoi(row[97]); + entry.aa_points_spent_old = atoi(row[98]); + entry.aa_points_old = atoi(row[99]); + entry.e_last_invsnapshot = atoi(row[100]); + entry.deleted_at = row[101] ? row[101] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_DATA_REPOSITORY_H diff --git a/common/repositories/base/base_character_disciplines_repository.h b/common/repositories/base/base_character_disciplines_repository.h new file mode 100644 index 000000000..941e36056 --- /dev/null +++ b/common/repositories/base/base_character_disciplines_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_DISCIPLINES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_DISCIPLINES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterDisciplinesRepository { +public: + struct CharacterDisciplines { + int id; + int slot_id; + int disc_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot_id", + "disc_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_disciplines"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterDisciplines NewEntity() + { + CharacterDisciplines entry{}; + + entry.id = 0; + entry.slot_id = 0; + entry.disc_id = 0; + + return entry; + } + + static CharacterDisciplines GetCharacterDisciplinesEntry( + const std::vector &character_discipliness, + int character_disciplines_id + ) + { + for (auto &character_disciplines : character_discipliness) { + if (character_disciplines.id == character_disciplines_id) { + return character_disciplines; + } + } + + return NewEntity(); + } + + static CharacterDisciplines FindOne( + Database& db, + int character_disciplines_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_disciplines_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterDisciplines entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.disc_id = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_disciplines_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_disciplines_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterDisciplines character_disciplines_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_disciplines_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_disciplines_entry.slot_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_disciplines_entry.disc_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_disciplines_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterDisciplines InsertOne( + Database& db, + CharacterDisciplines character_disciplines_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_disciplines_entry.id)); + insert_values.push_back(std::to_string(character_disciplines_entry.slot_id)); + insert_values.push_back(std::to_string(character_disciplines_entry.disc_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_disciplines_entry.id = results.LastInsertedID(); + return character_disciplines_entry; + } + + character_disciplines_entry = NewEntity(); + + return character_disciplines_entry; + } + + static int InsertMany( + Database& db, + std::vector character_disciplines_entries + ) + { + std::vector insert_chunks; + + for (auto &character_disciplines_entry: character_disciplines_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_disciplines_entry.id)); + insert_values.push_back(std::to_string(character_disciplines_entry.slot_id)); + insert_values.push_back(std::to_string(character_disciplines_entry.disc_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterDisciplines entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.disc_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterDisciplines entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.disc_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_DISCIPLINES_REPOSITORY_H diff --git a/common/repositories/base/base_character_expedition_lockouts_repository.h b/common/repositories/base/base_character_expedition_lockouts_repository.h new file mode 100644 index 000000000..d50dd1f9e --- /dev/null +++ b/common/repositories/base/base_character_expedition_lockouts_repository.h @@ -0,0 +1,337 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_EXPEDITION_LOCKOUTS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_EXPEDITION_LOCKOUTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterExpeditionLockoutsRepository { +public: + struct CharacterExpeditionLockouts { + int id; + int character_id; + std::string expedition_name; + std::string event_name; + std::string expire_time; + int duration; + std::string from_expedition_uuid; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "character_id", + "expedition_name", + "event_name", + "expire_time", + "duration", + "from_expedition_uuid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_expedition_lockouts"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterExpeditionLockouts NewEntity() + { + CharacterExpeditionLockouts entry{}; + + entry.id = 0; + entry.character_id = 0; + entry.expedition_name = ""; + entry.event_name = ""; + entry.expire_time = ""; + entry.duration = 0; + entry.from_expedition_uuid = ""; + + return entry; + } + + static CharacterExpeditionLockouts GetCharacterExpeditionLockoutsEntry( + const std::vector &character_expedition_lockoutss, + int character_expedition_lockouts_id + ) + { + for (auto &character_expedition_lockouts : character_expedition_lockoutss) { + if (character_expedition_lockouts.id == character_expedition_lockouts_id) { + return character_expedition_lockouts; + } + } + + return NewEntity(); + } + + static CharacterExpeditionLockouts FindOne( + Database& db, + int character_expedition_lockouts_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_expedition_lockouts_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterExpeditionLockouts entry{}; + + entry.id = atoi(row[0]); + entry.character_id = atoi(row[1]); + entry.expedition_name = row[2] ? row[2] : ""; + entry.event_name = row[3] ? row[3] : ""; + entry.expire_time = row[4] ? row[4] : ""; + entry.duration = atoi(row[5]); + entry.from_expedition_uuid = row[6] ? row[6] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_expedition_lockouts_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_expedition_lockouts_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterExpeditionLockouts character_expedition_lockouts_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_expedition_lockouts_entry.character_id)); + update_values.push_back(columns[2] + " = '" + EscapeString(character_expedition_lockouts_entry.expedition_name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(character_expedition_lockouts_entry.event_name) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(character_expedition_lockouts_entry.expire_time) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(character_expedition_lockouts_entry.duration)); + update_values.push_back(columns[6] + " = '" + EscapeString(character_expedition_lockouts_entry.from_expedition_uuid) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_expedition_lockouts_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterExpeditionLockouts InsertOne( + Database& db, + CharacterExpeditionLockouts character_expedition_lockouts_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_expedition_lockouts_entry.id)); + insert_values.push_back(std::to_string(character_expedition_lockouts_entry.character_id)); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.expedition_name) + "'"); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.event_name) + "'"); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.expire_time) + "'"); + insert_values.push_back(std::to_string(character_expedition_lockouts_entry.duration)); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.from_expedition_uuid) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_expedition_lockouts_entry.id = results.LastInsertedID(); + return character_expedition_lockouts_entry; + } + + character_expedition_lockouts_entry = NewEntity(); + + return character_expedition_lockouts_entry; + } + + static int InsertMany( + Database& db, + std::vector character_expedition_lockouts_entries + ) + { + std::vector insert_chunks; + + for (auto &character_expedition_lockouts_entry: character_expedition_lockouts_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_expedition_lockouts_entry.id)); + insert_values.push_back(std::to_string(character_expedition_lockouts_entry.character_id)); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.expedition_name) + "'"); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.event_name) + "'"); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.expire_time) + "'"); + insert_values.push_back(std::to_string(character_expedition_lockouts_entry.duration)); + insert_values.push_back("'" + EscapeString(character_expedition_lockouts_entry.from_expedition_uuid) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterExpeditionLockouts entry{}; + + entry.id = atoi(row[0]); + entry.character_id = atoi(row[1]); + entry.expedition_name = row[2] ? row[2] : ""; + entry.event_name = row[3] ? row[3] : ""; + entry.expire_time = row[4] ? row[4] : ""; + entry.duration = atoi(row[5]); + entry.from_expedition_uuid = row[6] ? row[6] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterExpeditionLockouts entry{}; + + entry.id = atoi(row[0]); + entry.character_id = atoi(row[1]); + entry.expedition_name = row[2] ? row[2] : ""; + entry.event_name = row[3] ? row[3] : ""; + entry.expire_time = row[4] ? row[4] : ""; + entry.duration = atoi(row[5]); + entry.from_expedition_uuid = row[6] ? row[6] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_EXPEDITION_LOCKOUTS_REPOSITORY_H diff --git a/common/repositories/base/base_character_inspect_messages_repository.h b/common/repositories/base/base_character_inspect_messages_repository.h new file mode 100644 index 000000000..0a8cbc3e6 --- /dev/null +++ b/common/repositories/base/base_character_inspect_messages_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_INSPECT_MESSAGES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_INSPECT_MESSAGES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterInspectMessagesRepository { +public: + struct CharacterInspectMessages { + int id; + std::string inspect_message; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "inspect_message", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_inspect_messages"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterInspectMessages NewEntity() + { + CharacterInspectMessages entry{}; + + entry.id = 0; + entry.inspect_message = ""; + + return entry; + } + + static CharacterInspectMessages GetCharacterInspectMessagesEntry( + const std::vector &character_inspect_messagess, + int character_inspect_messages_id + ) + { + for (auto &character_inspect_messages : character_inspect_messagess) { + if (character_inspect_messages.id == character_inspect_messages_id) { + return character_inspect_messages; + } + } + + return NewEntity(); + } + + static CharacterInspectMessages FindOne( + Database& db, + int character_inspect_messages_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_inspect_messages_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterInspectMessages entry{}; + + entry.id = atoi(row[0]); + entry.inspect_message = row[1] ? row[1] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_inspect_messages_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_inspect_messages_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterInspectMessages character_inspect_messages_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_inspect_messages_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(character_inspect_messages_entry.inspect_message) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_inspect_messages_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterInspectMessages InsertOne( + Database& db, + CharacterInspectMessages character_inspect_messages_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_inspect_messages_entry.id)); + insert_values.push_back("'" + EscapeString(character_inspect_messages_entry.inspect_message) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_inspect_messages_entry.id = results.LastInsertedID(); + return character_inspect_messages_entry; + } + + character_inspect_messages_entry = NewEntity(); + + return character_inspect_messages_entry; + } + + static int InsertMany( + Database& db, + std::vector character_inspect_messages_entries + ) + { + std::vector insert_chunks; + + for (auto &character_inspect_messages_entry: character_inspect_messages_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_inspect_messages_entry.id)); + insert_values.push_back("'" + EscapeString(character_inspect_messages_entry.inspect_message) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterInspectMessages entry{}; + + entry.id = atoi(row[0]); + entry.inspect_message = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterInspectMessages entry{}; + + entry.id = atoi(row[0]); + entry.inspect_message = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_INSPECT_MESSAGES_REPOSITORY_H diff --git a/common/repositories/base/base_character_item_recast_repository.h b/common/repositories/base/base_character_item_recast_repository.h new file mode 100644 index 000000000..433d0f0f0 --- /dev/null +++ b/common/repositories/base/base_character_item_recast_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_ITEM_RECAST_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_ITEM_RECAST_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterItemRecastRepository { +public: + struct CharacterItemRecast { + int id; + int recast_type; + int timestamp; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "recast_type", + "timestamp", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_item_recast"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterItemRecast NewEntity() + { + CharacterItemRecast entry{}; + + entry.id = 0; + entry.recast_type = 0; + entry.timestamp = 0; + + return entry; + } + + static CharacterItemRecast GetCharacterItemRecastEntry( + const std::vector &character_item_recasts, + int character_item_recast_id + ) + { + for (auto &character_item_recast : character_item_recasts) { + if (character_item_recast.id == character_item_recast_id) { + return character_item_recast; + } + } + + return NewEntity(); + } + + static CharacterItemRecast FindOne( + Database& db, + int character_item_recast_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_item_recast_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterItemRecast entry{}; + + entry.id = atoi(row[0]); + entry.recast_type = atoi(row[1]); + entry.timestamp = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_item_recast_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_item_recast_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterItemRecast character_item_recast_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_item_recast_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_item_recast_entry.recast_type)); + update_values.push_back(columns[2] + " = " + std::to_string(character_item_recast_entry.timestamp)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_item_recast_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterItemRecast InsertOne( + Database& db, + CharacterItemRecast character_item_recast_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_item_recast_entry.id)); + insert_values.push_back(std::to_string(character_item_recast_entry.recast_type)); + insert_values.push_back(std::to_string(character_item_recast_entry.timestamp)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_item_recast_entry.id = results.LastInsertedID(); + return character_item_recast_entry; + } + + character_item_recast_entry = NewEntity(); + + return character_item_recast_entry; + } + + static int InsertMany( + Database& db, + std::vector character_item_recast_entries + ) + { + std::vector insert_chunks; + + for (auto &character_item_recast_entry: character_item_recast_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_item_recast_entry.id)); + insert_values.push_back(std::to_string(character_item_recast_entry.recast_type)); + insert_values.push_back(std::to_string(character_item_recast_entry.timestamp)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterItemRecast entry{}; + + entry.id = atoi(row[0]); + entry.recast_type = atoi(row[1]); + entry.timestamp = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterItemRecast entry{}; + + entry.id = atoi(row[0]); + entry.recast_type = atoi(row[1]); + entry.timestamp = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_ITEM_RECAST_REPOSITORY_H diff --git a/common/repositories/base/base_character_languages_repository.h b/common/repositories/base/base_character_languages_repository.h new file mode 100644 index 000000000..64217e8d7 --- /dev/null +++ b/common/repositories/base/base_character_languages_repository.h @@ -0,0 +1,301 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_LANGUAGES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_LANGUAGES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterLanguagesRepository { +public: + struct CharacterLanguages { + int id; + int lang_id; + int value; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "lang_id", + "value", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_languages"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterLanguages NewEntity() + { + CharacterLanguages entry{}; + + entry.id = 0; + entry.lang_id = 0; + entry.value = 0; + + return entry; + } + + static CharacterLanguages GetCharacterLanguagesEntry( + const std::vector &character_languagess, + int character_languages_id + ) + { + for (auto &character_languages : character_languagess) { + if (character_languages.id == character_languages_id) { + return character_languages; + } + } + + return NewEntity(); + } + + static CharacterLanguages FindOne( + Database& db, + int character_languages_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_languages_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterLanguages entry{}; + + entry.id = atoi(row[0]); + entry.lang_id = atoi(row[1]); + entry.value = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_languages_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_languages_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterLanguages character_languages_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_languages_entry.lang_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_languages_entry.value)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_languages_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterLanguages InsertOne( + Database& db, + CharacterLanguages character_languages_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_languages_entry.id)); + insert_values.push_back(std::to_string(character_languages_entry.lang_id)); + insert_values.push_back(std::to_string(character_languages_entry.value)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_languages_entry.id = results.LastInsertedID(); + return character_languages_entry; + } + + character_languages_entry = NewEntity(); + + return character_languages_entry; + } + + static int InsertMany( + Database& db, + std::vector character_languages_entries + ) + { + std::vector insert_chunks; + + for (auto &character_languages_entry: character_languages_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_languages_entry.id)); + insert_values.push_back(std::to_string(character_languages_entry.lang_id)); + insert_values.push_back(std::to_string(character_languages_entry.value)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterLanguages entry{}; + + entry.id = atoi(row[0]); + entry.lang_id = atoi(row[1]); + entry.value = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterLanguages entry{}; + + entry.id = atoi(row[0]); + entry.lang_id = atoi(row[1]); + entry.value = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_LANGUAGES_REPOSITORY_H diff --git a/common/repositories/base/base_character_leadership_abilities_repository.h b/common/repositories/base/base_character_leadership_abilities_repository.h new file mode 100644 index 000000000..ac872d88b --- /dev/null +++ b/common/repositories/base/base_character_leadership_abilities_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_LEADERSHIP_ABILITIES_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_LEADERSHIP_ABILITIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterLeadershipAbilitiesRepository { +public: + struct CharacterLeadershipAbilities { + int id; + int slot; + int rank; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot", + "rank", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_leadership_abilities"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterLeadershipAbilities NewEntity() + { + CharacterLeadershipAbilities entry{}; + + entry.id = 0; + entry.slot = 0; + entry.rank = 0; + + return entry; + } + + static CharacterLeadershipAbilities GetCharacterLeadershipAbilitiesEntry( + const std::vector &character_leadership_abilitiess, + int character_leadership_abilities_id + ) + { + for (auto &character_leadership_abilities : character_leadership_abilitiess) { + if (character_leadership_abilities.id == character_leadership_abilities_id) { + return character_leadership_abilities; + } + } + + return NewEntity(); + } + + static CharacterLeadershipAbilities FindOne( + Database& db, + int character_leadership_abilities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_leadership_abilities_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterLeadershipAbilities entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.rank = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_leadership_abilities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_leadership_abilities_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterLeadershipAbilities character_leadership_abilities_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_leadership_abilities_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_leadership_abilities_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(character_leadership_abilities_entry.rank)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_leadership_abilities_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterLeadershipAbilities InsertOne( + Database& db, + CharacterLeadershipAbilities character_leadership_abilities_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_leadership_abilities_entry.id)); + insert_values.push_back(std::to_string(character_leadership_abilities_entry.slot)); + insert_values.push_back(std::to_string(character_leadership_abilities_entry.rank)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_leadership_abilities_entry.id = results.LastInsertedID(); + return character_leadership_abilities_entry; + } + + character_leadership_abilities_entry = NewEntity(); + + return character_leadership_abilities_entry; + } + + static int InsertMany( + Database& db, + std::vector character_leadership_abilities_entries + ) + { + std::vector insert_chunks; + + for (auto &character_leadership_abilities_entry: character_leadership_abilities_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_leadership_abilities_entry.id)); + insert_values.push_back(std::to_string(character_leadership_abilities_entry.slot)); + insert_values.push_back(std::to_string(character_leadership_abilities_entry.rank)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterLeadershipAbilities entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.rank = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterLeadershipAbilities entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.rank = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_LEADERSHIP_ABILITIES_REPOSITORY_H diff --git a/common/repositories/base/base_character_material_repository.h b/common/repositories/base/base_character_material_repository.h new file mode 100644 index 000000000..1b434cf2c --- /dev/null +++ b/common/repositories/base/base_character_material_repository.h @@ -0,0 +1,337 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_MATERIAL_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_MATERIAL_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterMaterialRepository { +public: + struct CharacterMaterial { + int id; + int slot; + int blue; + int green; + int red; + int use_tint; + int color; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot", + "blue", + "green", + "red", + "use_tint", + "color", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_material"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterMaterial NewEntity() + { + CharacterMaterial entry{}; + + entry.id = 0; + entry.slot = 0; + entry.blue = 0; + entry.green = 0; + entry.red = 0; + entry.use_tint = 0; + entry.color = 0; + + return entry; + } + + static CharacterMaterial GetCharacterMaterialEntry( + const std::vector &character_materials, + int character_material_id + ) + { + for (auto &character_material : character_materials) { + if (character_material.id == character_material_id) { + return character_material; + } + } + + return NewEntity(); + } + + static CharacterMaterial FindOne( + Database& db, + int character_material_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_material_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterMaterial entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.blue = atoi(row[2]); + entry.green = atoi(row[3]); + entry.red = atoi(row[4]); + entry.use_tint = atoi(row[5]); + entry.color = atoi(row[6]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_material_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_material_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterMaterial character_material_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_material_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(character_material_entry.blue)); + update_values.push_back(columns[3] + " = " + std::to_string(character_material_entry.green)); + update_values.push_back(columns[4] + " = " + std::to_string(character_material_entry.red)); + update_values.push_back(columns[5] + " = " + std::to_string(character_material_entry.use_tint)); + update_values.push_back(columns[6] + " = " + std::to_string(character_material_entry.color)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_material_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterMaterial InsertOne( + Database& db, + CharacterMaterial character_material_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_material_entry.id)); + insert_values.push_back(std::to_string(character_material_entry.slot)); + insert_values.push_back(std::to_string(character_material_entry.blue)); + insert_values.push_back(std::to_string(character_material_entry.green)); + insert_values.push_back(std::to_string(character_material_entry.red)); + insert_values.push_back(std::to_string(character_material_entry.use_tint)); + insert_values.push_back(std::to_string(character_material_entry.color)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_material_entry.id = results.LastInsertedID(); + return character_material_entry; + } + + character_material_entry = NewEntity(); + + return character_material_entry; + } + + static int InsertMany( + Database& db, + std::vector character_material_entries + ) + { + std::vector insert_chunks; + + for (auto &character_material_entry: character_material_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_material_entry.id)); + insert_values.push_back(std::to_string(character_material_entry.slot)); + insert_values.push_back(std::to_string(character_material_entry.blue)); + insert_values.push_back(std::to_string(character_material_entry.green)); + insert_values.push_back(std::to_string(character_material_entry.red)); + insert_values.push_back(std::to_string(character_material_entry.use_tint)); + insert_values.push_back(std::to_string(character_material_entry.color)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterMaterial entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.blue = atoi(row[2]); + entry.green = atoi(row[3]); + entry.red = atoi(row[4]); + entry.use_tint = atoi(row[5]); + entry.color = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterMaterial entry{}; + + entry.id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.blue = atoi(row[2]); + entry.green = atoi(row[3]); + entry.red = atoi(row[4]); + entry.use_tint = atoi(row[5]); + entry.color = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_MATERIAL_REPOSITORY_H diff --git a/common/repositories/base/base_character_memmed_spells_repository.h b/common/repositories/base/base_character_memmed_spells_repository.h new file mode 100644 index 000000000..b47750533 --- /dev/null +++ b/common/repositories/base/base_character_memmed_spells_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_MEMMED_SPELLS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_MEMMED_SPELLS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterMemmedSpellsRepository { +public: + struct CharacterMemmedSpells { + int id; + int slot_id; + int spell_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot_id", + "spell_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_memmed_spells"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterMemmedSpells NewEntity() + { + CharacterMemmedSpells entry{}; + + entry.id = 0; + entry.slot_id = 0; + entry.spell_id = 0; + + return entry; + } + + static CharacterMemmedSpells GetCharacterMemmedSpellsEntry( + const std::vector &character_memmed_spellss, + int character_memmed_spells_id + ) + { + for (auto &character_memmed_spells : character_memmed_spellss) { + if (character_memmed_spells.id == character_memmed_spells_id) { + return character_memmed_spells; + } + } + + return NewEntity(); + } + + static CharacterMemmedSpells FindOne( + Database& db, + int character_memmed_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_memmed_spells_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterMemmedSpells entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_memmed_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_memmed_spells_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterMemmedSpells character_memmed_spells_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_memmed_spells_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_memmed_spells_entry.slot_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_memmed_spells_entry.spell_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_memmed_spells_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterMemmedSpells InsertOne( + Database& db, + CharacterMemmedSpells character_memmed_spells_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_memmed_spells_entry.id)); + insert_values.push_back(std::to_string(character_memmed_spells_entry.slot_id)); + insert_values.push_back(std::to_string(character_memmed_spells_entry.spell_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_memmed_spells_entry.id = results.LastInsertedID(); + return character_memmed_spells_entry; + } + + character_memmed_spells_entry = NewEntity(); + + return character_memmed_spells_entry; + } + + static int InsertMany( + Database& db, + std::vector character_memmed_spells_entries + ) + { + std::vector insert_chunks; + + for (auto &character_memmed_spells_entry: character_memmed_spells_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_memmed_spells_entry.id)); + insert_values.push_back(std::to_string(character_memmed_spells_entry.slot_id)); + insert_values.push_back(std::to_string(character_memmed_spells_entry.spell_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterMemmedSpells entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterMemmedSpells entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_MEMMED_SPELLS_REPOSITORY_H diff --git a/common/repositories/base/base_character_pet_buffs_repository.h b/common/repositories/base/base_character_pet_buffs_repository.h new file mode 100644 index 000000000..3dc6eb689 --- /dev/null +++ b/common/repositories/base/base_character_pet_buffs_repository.h @@ -0,0 +1,374 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_PET_BUFFS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_PET_BUFFS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterPetBuffsRepository { +public: + struct CharacterPetBuffs { + int char_id; + int pet; + int slot; + int spell_id; + int caster_level; + std::string castername; + int ticsremaining; + int counters; + int numhits; + int rune; + int instrument_mod; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "pet", + "slot", + "spell_id", + "caster_level", + "castername", + "ticsremaining", + "counters", + "numhits", + "rune", + "instrument_mod", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_pet_buffs"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterPetBuffs NewEntity() + { + CharacterPetBuffs entry{}; + + entry.char_id = 0; + entry.pet = 0; + entry.slot = 0; + entry.spell_id = 0; + entry.caster_level = 0; + entry.castername = ""; + entry.ticsremaining = 0; + entry.counters = 0; + entry.numhits = 0; + entry.rune = 0; + entry.instrument_mod = 10; + + return entry; + } + + static CharacterPetBuffs GetCharacterPetBuffsEntry( + const std::vector &character_pet_buffss, + int character_pet_buffs_id + ) + { + for (auto &character_pet_buffs : character_pet_buffss) { + if (character_pet_buffs.char_id == character_pet_buffs_id) { + return character_pet_buffs; + } + } + + return NewEntity(); + } + + static CharacterPetBuffs FindOne( + Database& db, + int character_pet_buffs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_pet_buffs_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterPetBuffs entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.spell_id = atoi(row[3]); + entry.caster_level = atoi(row[4]); + entry.castername = row[5] ? row[5] : ""; + entry.ticsremaining = atoi(row[6]); + entry.counters = atoi(row[7]); + entry.numhits = atoi(row[8]); + entry.rune = atoi(row[9]); + entry.instrument_mod = atoi(row[10]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_pet_buffs_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_pet_buffs_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterPetBuffs character_pet_buffs_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_pet_buffs_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_pet_buffs_entry.pet)); + update_values.push_back(columns[2] + " = " + std::to_string(character_pet_buffs_entry.slot)); + update_values.push_back(columns[3] + " = " + std::to_string(character_pet_buffs_entry.spell_id)); + update_values.push_back(columns[4] + " = " + std::to_string(character_pet_buffs_entry.caster_level)); + update_values.push_back(columns[5] + " = '" + EscapeString(character_pet_buffs_entry.castername) + "'"); + update_values.push_back(columns[6] + " = " + std::to_string(character_pet_buffs_entry.ticsremaining)); + update_values.push_back(columns[7] + " = " + std::to_string(character_pet_buffs_entry.counters)); + update_values.push_back(columns[8] + " = " + std::to_string(character_pet_buffs_entry.numhits)); + update_values.push_back(columns[9] + " = " + std::to_string(character_pet_buffs_entry.rune)); + update_values.push_back(columns[10] + " = " + std::to_string(character_pet_buffs_entry.instrument_mod)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_pet_buffs_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterPetBuffs InsertOne( + Database& db, + CharacterPetBuffs character_pet_buffs_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_pet_buffs_entry.char_id)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.pet)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.slot)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.spell_id)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.caster_level)); + insert_values.push_back("'" + EscapeString(character_pet_buffs_entry.castername) + "'"); + insert_values.push_back(std::to_string(character_pet_buffs_entry.ticsremaining)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.counters)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.numhits)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.rune)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.instrument_mod)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_pet_buffs_entry.char_id = results.LastInsertedID(); + return character_pet_buffs_entry; + } + + character_pet_buffs_entry = NewEntity(); + + return character_pet_buffs_entry; + } + + static int InsertMany( + Database& db, + std::vector character_pet_buffs_entries + ) + { + std::vector insert_chunks; + + for (auto &character_pet_buffs_entry: character_pet_buffs_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_pet_buffs_entry.char_id)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.pet)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.slot)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.spell_id)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.caster_level)); + insert_values.push_back("'" + EscapeString(character_pet_buffs_entry.castername) + "'"); + insert_values.push_back(std::to_string(character_pet_buffs_entry.ticsremaining)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.counters)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.numhits)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.rune)); + insert_values.push_back(std::to_string(character_pet_buffs_entry.instrument_mod)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPetBuffs entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.spell_id = atoi(row[3]); + entry.caster_level = atoi(row[4]); + entry.castername = row[5] ? row[5] : ""; + entry.ticsremaining = atoi(row[6]); + entry.counters = atoi(row[7]); + entry.numhits = atoi(row[8]); + entry.rune = atoi(row[9]); + entry.instrument_mod = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPetBuffs entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.spell_id = atoi(row[3]); + entry.caster_level = atoi(row[4]); + entry.castername = row[5] ? row[5] : ""; + entry.ticsremaining = atoi(row[6]); + entry.counters = atoi(row[7]); + entry.numhits = atoi(row[8]); + entry.rune = atoi(row[9]); + entry.instrument_mod = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_PET_BUFFS_REPOSITORY_H diff --git a/common/repositories/base/base_character_pet_info_repository.h b/common/repositories/base/base_character_pet_info_repository.h new file mode 100644 index 000000000..91f65d216 --- /dev/null +++ b/common/repositories/base/base_character_pet_info_repository.h @@ -0,0 +1,356 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_PET_INFO_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_PET_INFO_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterPetInfoRepository { +public: + struct CharacterPetInfo { + int char_id; + int pet; + std::string petname; + int petpower; + int spell_id; + int hp; + int mana; + float size; + int taunting; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "pet", + "petname", + "petpower", + "spell_id", + "hp", + "mana", + "size", + "taunting", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_pet_info"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterPetInfo NewEntity() + { + CharacterPetInfo entry{}; + + entry.char_id = 0; + entry.pet = 0; + entry.petname = ""; + entry.petpower = 0; + entry.spell_id = 0; + entry.hp = 0; + entry.mana = 0; + entry.size = 0; + entry.taunting = 1; + + return entry; + } + + static CharacterPetInfo GetCharacterPetInfoEntry( + const std::vector &character_pet_infos, + int character_pet_info_id + ) + { + for (auto &character_pet_info : character_pet_infos) { + if (character_pet_info.char_id == character_pet_info_id) { + return character_pet_info; + } + } + + return NewEntity(); + } + + static CharacterPetInfo FindOne( + Database& db, + int character_pet_info_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_pet_info_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterPetInfo entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.petname = row[2] ? row[2] : ""; + entry.petpower = atoi(row[3]); + entry.spell_id = atoi(row[4]); + entry.hp = atoi(row[5]); + entry.mana = atoi(row[6]); + entry.size = static_cast(atof(row[7])); + entry.taunting = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_pet_info_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_pet_info_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterPetInfo character_pet_info_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_pet_info_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_pet_info_entry.pet)); + update_values.push_back(columns[2] + " = '" + EscapeString(character_pet_info_entry.petname) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(character_pet_info_entry.petpower)); + update_values.push_back(columns[4] + " = " + std::to_string(character_pet_info_entry.spell_id)); + update_values.push_back(columns[5] + " = " + std::to_string(character_pet_info_entry.hp)); + update_values.push_back(columns[6] + " = " + std::to_string(character_pet_info_entry.mana)); + update_values.push_back(columns[7] + " = " + std::to_string(character_pet_info_entry.size)); + update_values.push_back(columns[8] + " = " + std::to_string(character_pet_info_entry.taunting)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_pet_info_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterPetInfo InsertOne( + Database& db, + CharacterPetInfo character_pet_info_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_pet_info_entry.char_id)); + insert_values.push_back(std::to_string(character_pet_info_entry.pet)); + insert_values.push_back("'" + EscapeString(character_pet_info_entry.petname) + "'"); + insert_values.push_back(std::to_string(character_pet_info_entry.petpower)); + insert_values.push_back(std::to_string(character_pet_info_entry.spell_id)); + insert_values.push_back(std::to_string(character_pet_info_entry.hp)); + insert_values.push_back(std::to_string(character_pet_info_entry.mana)); + insert_values.push_back(std::to_string(character_pet_info_entry.size)); + insert_values.push_back(std::to_string(character_pet_info_entry.taunting)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_pet_info_entry.char_id = results.LastInsertedID(); + return character_pet_info_entry; + } + + character_pet_info_entry = NewEntity(); + + return character_pet_info_entry; + } + + static int InsertMany( + Database& db, + std::vector character_pet_info_entries + ) + { + std::vector insert_chunks; + + for (auto &character_pet_info_entry: character_pet_info_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_pet_info_entry.char_id)); + insert_values.push_back(std::to_string(character_pet_info_entry.pet)); + insert_values.push_back("'" + EscapeString(character_pet_info_entry.petname) + "'"); + insert_values.push_back(std::to_string(character_pet_info_entry.petpower)); + insert_values.push_back(std::to_string(character_pet_info_entry.spell_id)); + insert_values.push_back(std::to_string(character_pet_info_entry.hp)); + insert_values.push_back(std::to_string(character_pet_info_entry.mana)); + insert_values.push_back(std::to_string(character_pet_info_entry.size)); + insert_values.push_back(std::to_string(character_pet_info_entry.taunting)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPetInfo entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.petname = row[2] ? row[2] : ""; + entry.petpower = atoi(row[3]); + entry.spell_id = atoi(row[4]); + entry.hp = atoi(row[5]); + entry.mana = atoi(row[6]); + entry.size = static_cast(atof(row[7])); + entry.taunting = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPetInfo entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.petname = row[2] ? row[2] : ""; + entry.petpower = atoi(row[3]); + entry.spell_id = atoi(row[4]); + entry.hp = atoi(row[5]); + entry.mana = atoi(row[6]); + entry.size = static_cast(atof(row[7])); + entry.taunting = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_PET_INFO_REPOSITORY_H diff --git a/common/repositories/base/base_character_pet_inventory_repository.h b/common/repositories/base/base_character_pet_inventory_repository.h new file mode 100644 index 000000000..4e7e26456 --- /dev/null +++ b/common/repositories/base/base_character_pet_inventory_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_PET_INVENTORY_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_PET_INVENTORY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterPetInventoryRepository { +public: + struct CharacterPetInventory { + int char_id; + int pet; + int slot; + int item_id; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "pet", + "slot", + "item_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_pet_inventory"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterPetInventory NewEntity() + { + CharacterPetInventory entry{}; + + entry.char_id = 0; + entry.pet = 0; + entry.slot = 0; + entry.item_id = 0; + + return entry; + } + + static CharacterPetInventory GetCharacterPetInventoryEntry( + const std::vector &character_pet_inventorys, + int character_pet_inventory_id + ) + { + for (auto &character_pet_inventory : character_pet_inventorys) { + if (character_pet_inventory.char_id == character_pet_inventory_id) { + return character_pet_inventory; + } + } + + return NewEntity(); + } + + static CharacterPetInventory FindOne( + Database& db, + int character_pet_inventory_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_pet_inventory_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterPetInventory entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.item_id = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_pet_inventory_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_pet_inventory_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterPetInventory character_pet_inventory_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_pet_inventory_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_pet_inventory_entry.pet)); + update_values.push_back(columns[2] + " = " + std::to_string(character_pet_inventory_entry.slot)); + update_values.push_back(columns[3] + " = " + std::to_string(character_pet_inventory_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_pet_inventory_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterPetInventory InsertOne( + Database& db, + CharacterPetInventory character_pet_inventory_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_pet_inventory_entry.char_id)); + insert_values.push_back(std::to_string(character_pet_inventory_entry.pet)); + insert_values.push_back(std::to_string(character_pet_inventory_entry.slot)); + insert_values.push_back(std::to_string(character_pet_inventory_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_pet_inventory_entry.char_id = results.LastInsertedID(); + return character_pet_inventory_entry; + } + + character_pet_inventory_entry = NewEntity(); + + return character_pet_inventory_entry; + } + + static int InsertMany( + Database& db, + std::vector character_pet_inventory_entries + ) + { + std::vector insert_chunks; + + for (auto &character_pet_inventory_entry: character_pet_inventory_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_pet_inventory_entry.char_id)); + insert_values.push_back(std::to_string(character_pet_inventory_entry.pet)); + insert_values.push_back(std::to_string(character_pet_inventory_entry.slot)); + insert_values.push_back(std::to_string(character_pet_inventory_entry.item_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPetInventory entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.item_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPetInventory entry{}; + + entry.char_id = atoi(row[0]); + entry.pet = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.item_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_PET_INVENTORY_REPOSITORY_H diff --git a/common/repositories/base/base_character_potionbelt_repository.h b/common/repositories/base/base_character_potionbelt_repository.h new file mode 100644 index 000000000..16d1cbfcd --- /dev/null +++ b/common/repositories/base/base_character_potionbelt_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_POTIONBELT_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_POTIONBELT_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterPotionbeltRepository { +public: + struct CharacterPotionbelt { + int id; + int potion_id; + int item_id; + int icon; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "potion_id", + "item_id", + "icon", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_potionbelt"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterPotionbelt NewEntity() + { + CharacterPotionbelt entry{}; + + entry.id = 0; + entry.potion_id = 0; + entry.item_id = 0; + entry.icon = 0; + + return entry; + } + + static CharacterPotionbelt GetCharacterPotionbeltEntry( + const std::vector &character_potionbelts, + int character_potionbelt_id + ) + { + for (auto &character_potionbelt : character_potionbelts) { + if (character_potionbelt.id == character_potionbelt_id) { + return character_potionbelt; + } + } + + return NewEntity(); + } + + static CharacterPotionbelt FindOne( + Database& db, + int character_potionbelt_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_potionbelt_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterPotionbelt entry{}; + + entry.id = atoi(row[0]); + entry.potion_id = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.icon = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_potionbelt_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_potionbelt_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterPotionbelt character_potionbelt_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_potionbelt_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(character_potionbelt_entry.potion_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_potionbelt_entry.item_id)); + update_values.push_back(columns[3] + " = " + std::to_string(character_potionbelt_entry.icon)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_potionbelt_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterPotionbelt InsertOne( + Database& db, + CharacterPotionbelt character_potionbelt_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_potionbelt_entry.id)); + insert_values.push_back(std::to_string(character_potionbelt_entry.potion_id)); + insert_values.push_back(std::to_string(character_potionbelt_entry.item_id)); + insert_values.push_back(std::to_string(character_potionbelt_entry.icon)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_potionbelt_entry.id = results.LastInsertedID(); + return character_potionbelt_entry; + } + + character_potionbelt_entry = NewEntity(); + + return character_potionbelt_entry; + } + + static int InsertMany( + Database& db, + std::vector character_potionbelt_entries + ) + { + std::vector insert_chunks; + + for (auto &character_potionbelt_entry: character_potionbelt_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_potionbelt_entry.id)); + insert_values.push_back(std::to_string(character_potionbelt_entry.potion_id)); + insert_values.push_back(std::to_string(character_potionbelt_entry.item_id)); + insert_values.push_back(std::to_string(character_potionbelt_entry.icon)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPotionbelt entry{}; + + entry.id = atoi(row[0]); + entry.potion_id = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.icon = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterPotionbelt entry{}; + + entry.id = atoi(row[0]); + entry.potion_id = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.icon = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_POTIONBELT_REPOSITORY_H diff --git a/common/repositories/base/base_character_skills_repository.h b/common/repositories/base/base_character_skills_repository.h new file mode 100644 index 000000000..d654fd448 --- /dev/null +++ b/common/repositories/base/base_character_skills_repository.h @@ -0,0 +1,301 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_SKILLS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_SKILLS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterSkillsRepository { +public: + struct CharacterSkills { + int id; + int skill_id; + int value; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "skill_id", + "value", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_skills"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterSkills NewEntity() + { + CharacterSkills entry{}; + + entry.id = 0; + entry.skill_id = 0; + entry.value = 0; + + return entry; + } + + static CharacterSkills GetCharacterSkillsEntry( + const std::vector &character_skillss, + int character_skills_id + ) + { + for (auto &character_skills : character_skillss) { + if (character_skills.id == character_skills_id) { + return character_skills; + } + } + + return NewEntity(); + } + + static CharacterSkills FindOne( + Database& db, + int character_skills_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_skills_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterSkills entry{}; + + entry.id = atoi(row[0]); + entry.skill_id = atoi(row[1]); + entry.value = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_skills_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_skills_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterSkills character_skills_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_skills_entry.skill_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_skills_entry.value)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_skills_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterSkills InsertOne( + Database& db, + CharacterSkills character_skills_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_skills_entry.id)); + insert_values.push_back(std::to_string(character_skills_entry.skill_id)); + insert_values.push_back(std::to_string(character_skills_entry.value)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_skills_entry.id = results.LastInsertedID(); + return character_skills_entry; + } + + character_skills_entry = NewEntity(); + + return character_skills_entry; + } + + static int InsertMany( + Database& db, + std::vector character_skills_entries + ) + { + std::vector insert_chunks; + + for (auto &character_skills_entry: character_skills_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_skills_entry.id)); + insert_values.push_back(std::to_string(character_skills_entry.skill_id)); + insert_values.push_back(std::to_string(character_skills_entry.value)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterSkills entry{}; + + entry.id = atoi(row[0]); + entry.skill_id = atoi(row[1]); + entry.value = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterSkills entry{}; + + entry.id = atoi(row[0]); + entry.skill_id = atoi(row[1]); + entry.value = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_SKILLS_REPOSITORY_H diff --git a/common/repositories/base/base_character_spells_repository.h b/common/repositories/base/base_character_spells_repository.h new file mode 100644 index 000000000..eb34b0d43 --- /dev/null +++ b/common/repositories/base/base_character_spells_repository.h @@ -0,0 +1,301 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_SPELLS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_SPELLS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterSpellsRepository { +public: + struct CharacterSpells { + int id; + int slot_id; + int spell_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "slot_id", + "spell_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_spells"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterSpells NewEntity() + { + CharacterSpells entry{}; + + entry.id = 0; + entry.slot_id = 0; + entry.spell_id = 0; + + return entry; + } + + static CharacterSpells GetCharacterSpellsEntry( + const std::vector &character_spellss, + int character_spells_id + ) + { + for (auto &character_spells : character_spellss) { + if (character_spells.id == character_spells_id) { + return character_spells; + } + } + + return NewEntity(); + } + + static CharacterSpells FindOne( + Database& db, + int character_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_spells_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterSpells entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_spells_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterSpells character_spells_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(character_spells_entry.slot_id)); + update_values.push_back(columns[2] + " = " + std::to_string(character_spells_entry.spell_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_spells_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterSpells InsertOne( + Database& db, + CharacterSpells character_spells_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_spells_entry.id)); + insert_values.push_back(std::to_string(character_spells_entry.slot_id)); + insert_values.push_back(std::to_string(character_spells_entry.spell_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_spells_entry.id = results.LastInsertedID(); + return character_spells_entry; + } + + character_spells_entry = NewEntity(); + + return character_spells_entry; + } + + static int InsertMany( + Database& db, + std::vector character_spells_entries + ) + { + std::vector insert_chunks; + + for (auto &character_spells_entry: character_spells_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_spells_entry.id)); + insert_values.push_back(std::to_string(character_spells_entry.slot_id)); + insert_values.push_back(std::to_string(character_spells_entry.spell_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterSpells entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterSpells entry{}; + + entry.id = atoi(row[0]); + entry.slot_id = atoi(row[1]); + entry.spell_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_SPELLS_REPOSITORY_H diff --git a/common/repositories/base/base_character_tasks_repository.h b/common/repositories/base/base_character_tasks_repository.h new file mode 100644 index 000000000..9d8371f34 --- /dev/null +++ b/common/repositories/base/base_character_tasks_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CHARACTER_TASKS_REPOSITORY_H +#define EQEMU_BASE_CHARACTER_TASKS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCharacterTasksRepository { +public: + struct CharacterTasks { + int charid; + int taskid; + int slot; + int type; + int acceptedtime; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "taskid", + "slot", + "type", + "acceptedtime", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("character_tasks"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CharacterTasks NewEntity() + { + CharacterTasks entry{}; + + entry.charid = 0; + entry.taskid = 0; + entry.slot = 0; + entry.type = 0; + entry.acceptedtime = 0; + + return entry; + } + + static CharacterTasks GetCharacterTasksEntry( + const std::vector &character_taskss, + int character_tasks_id + ) + { + for (auto &character_tasks : character_taskss) { + if (character_tasks.charid == character_tasks_id) { + return character_tasks; + } + } + + return NewEntity(); + } + + static CharacterTasks FindOne( + Database& db, + int character_tasks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + character_tasks_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CharacterTasks entry{}; + + entry.charid = atoi(row[0]); + entry.taskid = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.type = atoi(row[3]); + entry.acceptedtime = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int character_tasks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + character_tasks_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CharacterTasks character_tasks_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(character_tasks_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(character_tasks_entry.taskid)); + update_values.push_back(columns[2] + " = " + std::to_string(character_tasks_entry.slot)); + update_values.push_back(columns[3] + " = " + std::to_string(character_tasks_entry.type)); + update_values.push_back(columns[4] + " = " + std::to_string(character_tasks_entry.acceptedtime)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + character_tasks_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CharacterTasks InsertOne( + Database& db, + CharacterTasks character_tasks_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_tasks_entry.charid)); + insert_values.push_back(std::to_string(character_tasks_entry.taskid)); + insert_values.push_back(std::to_string(character_tasks_entry.slot)); + insert_values.push_back(std::to_string(character_tasks_entry.type)); + insert_values.push_back(std::to_string(character_tasks_entry.acceptedtime)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + character_tasks_entry.charid = results.LastInsertedID(); + return character_tasks_entry; + } + + character_tasks_entry = NewEntity(); + + return character_tasks_entry; + } + + static int InsertMany( + Database& db, + std::vector character_tasks_entries + ) + { + std::vector insert_chunks; + + for (auto &character_tasks_entry: character_tasks_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(character_tasks_entry.charid)); + insert_values.push_back(std::to_string(character_tasks_entry.taskid)); + insert_values.push_back(std::to_string(character_tasks_entry.slot)); + insert_values.push_back(std::to_string(character_tasks_entry.type)); + insert_values.push_back(std::to_string(character_tasks_entry.acceptedtime)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterTasks entry{}; + + entry.charid = atoi(row[0]); + entry.taskid = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.type = atoi(row[3]); + entry.acceptedtime = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CharacterTasks entry{}; + + entry.charid = atoi(row[0]); + entry.taskid = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.type = atoi(row[3]); + entry.acceptedtime = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CHARACTER_TASKS_REPOSITORY_H diff --git a/common/repositories/base/base_completed_tasks_repository.h b/common/repositories/base/base_completed_tasks_repository.h new file mode 100644 index 000000000..bee95bf79 --- /dev/null +++ b/common/repositories/base/base_completed_tasks_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_COMPLETED_TASKS_REPOSITORY_H +#define EQEMU_BASE_COMPLETED_TASKS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseCompletedTasksRepository { +public: + struct CompletedTasks { + int charid; + int completedtime; + int taskid; + int activityid; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "completedtime", + "taskid", + "activityid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("completed_tasks"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static CompletedTasks NewEntity() + { + CompletedTasks entry{}; + + entry.charid = 0; + entry.completedtime = 0; + entry.taskid = 0; + entry.activityid = 0; + + return entry; + } + + static CompletedTasks GetCompletedTasksEntry( + const std::vector &completed_taskss, + int completed_tasks_id + ) + { + for (auto &completed_tasks : completed_taskss) { + if (completed_tasks.charid == completed_tasks_id) { + return completed_tasks; + } + } + + return NewEntity(); + } + + static CompletedTasks FindOne( + Database& db, + int completed_tasks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + completed_tasks_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + CompletedTasks entry{}; + + entry.charid = atoi(row[0]); + entry.completedtime = atoi(row[1]); + entry.taskid = atoi(row[2]); + entry.activityid = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int completed_tasks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + completed_tasks_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + CompletedTasks completed_tasks_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(completed_tasks_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(completed_tasks_entry.completedtime)); + update_values.push_back(columns[2] + " = " + std::to_string(completed_tasks_entry.taskid)); + update_values.push_back(columns[3] + " = " + std::to_string(completed_tasks_entry.activityid)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + completed_tasks_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static CompletedTasks InsertOne( + Database& db, + CompletedTasks completed_tasks_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(completed_tasks_entry.charid)); + insert_values.push_back(std::to_string(completed_tasks_entry.completedtime)); + insert_values.push_back(std::to_string(completed_tasks_entry.taskid)); + insert_values.push_back(std::to_string(completed_tasks_entry.activityid)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + completed_tasks_entry.charid = results.LastInsertedID(); + return completed_tasks_entry; + } + + completed_tasks_entry = NewEntity(); + + return completed_tasks_entry; + } + + static int InsertMany( + Database& db, + std::vector completed_tasks_entries + ) + { + std::vector insert_chunks; + + for (auto &completed_tasks_entry: completed_tasks_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(completed_tasks_entry.charid)); + insert_values.push_back(std::to_string(completed_tasks_entry.completedtime)); + insert_values.push_back(std::to_string(completed_tasks_entry.taskid)); + insert_values.push_back(std::to_string(completed_tasks_entry.activityid)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CompletedTasks entry{}; + + entry.charid = atoi(row[0]); + entry.completedtime = atoi(row[1]); + entry.taskid = atoi(row[2]); + entry.activityid = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + CompletedTasks entry{}; + + entry.charid = atoi(row[0]); + entry.completedtime = atoi(row[1]); + entry.taskid = atoi(row[2]); + entry.activityid = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_COMPLETED_TASKS_REPOSITORY_H diff --git a/common/repositories/base/base_content_flags_repository.h b/common/repositories/base/base_content_flags_repository.h new file mode 100644 index 000000000..f59ad8663 --- /dev/null +++ b/common/repositories/base/base_content_flags_repository.h @@ -0,0 +1,310 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_CONTENT_FLAGS_REPOSITORY_H +#define EQEMU_BASE_CONTENT_FLAGS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseContentFlagsRepository { +public: + struct ContentFlags { + int id; + std::string flag_name; + int enabled; + std::string notes; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "flag_name", + "enabled", + "notes", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("content_flags"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ContentFlags NewEntity() + { + ContentFlags entry{}; + + entry.id = 0; + entry.flag_name = ""; + entry.enabled = 0; + entry.notes = ""; + + return entry; + } + + static ContentFlags GetContentFlagsEntry( + const std::vector &content_flagss, + int content_flags_id + ) + { + for (auto &content_flags : content_flagss) { + if (content_flags.id == content_flags_id) { + return content_flags; + } + } + + return NewEntity(); + } + + static ContentFlags FindOne( + Database& db, + int content_flags_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + content_flags_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ContentFlags entry{}; + + entry.id = atoi(row[0]); + entry.flag_name = row[1] ? row[1] : ""; + entry.enabled = atoi(row[2]); + entry.notes = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int content_flags_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + content_flags_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ContentFlags content_flags_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(content_flags_entry.flag_name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(content_flags_entry.enabled)); + update_values.push_back(columns[3] + " = '" + EscapeString(content_flags_entry.notes) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + content_flags_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ContentFlags InsertOne( + Database& db, + ContentFlags content_flags_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(content_flags_entry.id)); + insert_values.push_back("'" + EscapeString(content_flags_entry.flag_name) + "'"); + insert_values.push_back(std::to_string(content_flags_entry.enabled)); + insert_values.push_back("'" + EscapeString(content_flags_entry.notes) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + content_flags_entry.id = results.LastInsertedID(); + return content_flags_entry; + } + + content_flags_entry = NewEntity(); + + return content_flags_entry; + } + + static int InsertMany( + Database& db, + std::vector content_flags_entries + ) + { + std::vector insert_chunks; + + for (auto &content_flags_entry: content_flags_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(content_flags_entry.id)); + insert_values.push_back("'" + EscapeString(content_flags_entry.flag_name) + "'"); + insert_values.push_back(std::to_string(content_flags_entry.enabled)); + insert_values.push_back("'" + EscapeString(content_flags_entry.notes) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ContentFlags entry{}; + + entry.id = atoi(row[0]); + entry.flag_name = row[1] ? row[1] : ""; + entry.enabled = atoi(row[2]); + entry.notes = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ContentFlags entry{}; + + entry.id = atoi(row[0]); + entry.flag_name = row[1] ? row[1] : ""; + entry.enabled = atoi(row[2]); + entry.notes = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_CONTENT_FLAGS_REPOSITORY_H diff --git a/common/repositories/base/base_damageshieldtypes_repository.h b/common/repositories/base/base_damageshieldtypes_repository.h new file mode 100644 index 000000000..b2c6be57e --- /dev/null +++ b/common/repositories/base/base_damageshieldtypes_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_DAMAGESHIELDTYPES_REPOSITORY_H +#define EQEMU_BASE_DAMAGESHIELDTYPES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseDamageshieldtypesRepository { +public: + struct Damageshieldtypes { + int spellid; + int type; + }; + + static std::string PrimaryKey() + { + return std::string("spellid"); + } + + static std::vector Columns() + { + return { + "spellid", + "type", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("damageshieldtypes"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Damageshieldtypes NewEntity() + { + Damageshieldtypes entry{}; + + entry.spellid = 0; + entry.type = 0; + + return entry; + } + + static Damageshieldtypes GetDamageshieldtypesEntry( + const std::vector &damageshieldtypess, + int damageshieldtypes_id + ) + { + for (auto &damageshieldtypes : damageshieldtypess) { + if (damageshieldtypes.spellid == damageshieldtypes_id) { + return damageshieldtypes; + } + } + + return NewEntity(); + } + + static Damageshieldtypes FindOne( + Database& db, + int damageshieldtypes_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + damageshieldtypes_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Damageshieldtypes entry{}; + + entry.spellid = atoi(row[0]); + entry.type = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int damageshieldtypes_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + damageshieldtypes_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Damageshieldtypes damageshieldtypes_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(damageshieldtypes_entry.spellid)); + update_values.push_back(columns[1] + " = " + std::to_string(damageshieldtypes_entry.type)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + damageshieldtypes_entry.spellid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Damageshieldtypes InsertOne( + Database& db, + Damageshieldtypes damageshieldtypes_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(damageshieldtypes_entry.spellid)); + insert_values.push_back(std::to_string(damageshieldtypes_entry.type)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + damageshieldtypes_entry.spellid = results.LastInsertedID(); + return damageshieldtypes_entry; + } + + damageshieldtypes_entry = NewEntity(); + + return damageshieldtypes_entry; + } + + static int InsertMany( + Database& db, + std::vector damageshieldtypes_entries + ) + { + std::vector insert_chunks; + + for (auto &damageshieldtypes_entry: damageshieldtypes_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(damageshieldtypes_entry.spellid)); + insert_values.push_back(std::to_string(damageshieldtypes_entry.type)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Damageshieldtypes entry{}; + + entry.spellid = atoi(row[0]); + entry.type = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Damageshieldtypes entry{}; + + entry.spellid = atoi(row[0]); + entry.type = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_DAMAGESHIELDTYPES_REPOSITORY_H diff --git a/common/repositories/base/base_data_buckets_repository.h b/common/repositories/base/base_data_buckets_repository.h new file mode 100644 index 000000000..cef173a69 --- /dev/null +++ b/common/repositories/base/base_data_buckets_repository.h @@ -0,0 +1,310 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_DATA_BUCKETS_REPOSITORY_H +#define EQEMU_BASE_DATA_BUCKETS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseDataBucketsRepository { +public: + struct DataBuckets { + int id; + std::string key; + std::string value; + int expires; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "key", + "value", + "expires", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("data_buckets"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static DataBuckets NewEntity() + { + DataBuckets entry{}; + + entry.id = 0; + entry.key = ""; + entry.value = ""; + entry.expires = 0; + + return entry; + } + + static DataBuckets GetDataBucketsEntry( + const std::vector &data_bucketss, + int data_buckets_id + ) + { + for (auto &data_buckets : data_bucketss) { + if (data_buckets.id == data_buckets_id) { + return data_buckets; + } + } + + return NewEntity(); + } + + static DataBuckets FindOne( + Database& db, + int data_buckets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + data_buckets_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + DataBuckets entry{}; + + entry.id = atoi(row[0]); + entry.key = row[1] ? row[1] : ""; + entry.value = row[2] ? row[2] : ""; + entry.expires = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int data_buckets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + data_buckets_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + DataBuckets data_buckets_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(data_buckets_entry.key) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(data_buckets_entry.value) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(data_buckets_entry.expires)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + data_buckets_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static DataBuckets InsertOne( + Database& db, + DataBuckets data_buckets_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(data_buckets_entry.id)); + insert_values.push_back("'" + EscapeString(data_buckets_entry.key) + "'"); + insert_values.push_back("'" + EscapeString(data_buckets_entry.value) + "'"); + insert_values.push_back(std::to_string(data_buckets_entry.expires)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + data_buckets_entry.id = results.LastInsertedID(); + return data_buckets_entry; + } + + data_buckets_entry = NewEntity(); + + return data_buckets_entry; + } + + static int InsertMany( + Database& db, + std::vector data_buckets_entries + ) + { + std::vector insert_chunks; + + for (auto &data_buckets_entry: data_buckets_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(data_buckets_entry.id)); + insert_values.push_back("'" + EscapeString(data_buckets_entry.key) + "'"); + insert_values.push_back("'" + EscapeString(data_buckets_entry.value) + "'"); + insert_values.push_back(std::to_string(data_buckets_entry.expires)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DataBuckets entry{}; + + entry.id = atoi(row[0]); + entry.key = row[1] ? row[1] : ""; + entry.value = row[2] ? row[2] : ""; + entry.expires = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DataBuckets entry{}; + + entry.id = atoi(row[0]); + entry.key = row[1] ? row[1] : ""; + entry.value = row[2] ? row[2] : ""; + entry.expires = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_DATA_BUCKETS_REPOSITORY_H diff --git a/common/repositories/base/base_db_str_repository.h b/common/repositories/base/base_db_str_repository.h new file mode 100644 index 000000000..f9a827d95 --- /dev/null +++ b/common/repositories/base/base_db_str_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_DB_STR_REPOSITORY_H +#define EQEMU_BASE_DB_STR_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseDbStrRepository { +public: + struct DbStr { + int id; + int type; + std::string value; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "type", + "value", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("db_str"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static DbStr NewEntity() + { + DbStr entry{}; + + entry.id = 0; + entry.type = 0; + entry.value = ""; + + return entry; + } + + static DbStr GetDbStrEntry( + const std::vector &db_strs, + int db_str_id + ) + { + for (auto &db_str : db_strs) { + if (db_str.id == db_str_id) { + return db_str; + } + } + + return NewEntity(); + } + + static DbStr FindOne( + Database& db, + int db_str_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + db_str_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + DbStr entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.value = row[2] ? row[2] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int db_str_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + db_str_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + DbStr db_str_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(db_str_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(db_str_entry.type)); + update_values.push_back(columns[2] + " = '" + EscapeString(db_str_entry.value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + db_str_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static DbStr InsertOne( + Database& db, + DbStr db_str_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(db_str_entry.id)); + insert_values.push_back(std::to_string(db_str_entry.type)); + insert_values.push_back("'" + EscapeString(db_str_entry.value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + db_str_entry.id = results.LastInsertedID(); + return db_str_entry; + } + + db_str_entry = NewEntity(); + + return db_str_entry; + } + + static int InsertMany( + Database& db, + std::vector db_str_entries + ) + { + std::vector insert_chunks; + + for (auto &db_str_entry: db_str_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(db_str_entry.id)); + insert_values.push_back(std::to_string(db_str_entry.type)); + insert_values.push_back("'" + EscapeString(db_str_entry.value) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DbStr entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.value = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DbStr entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.value = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_DB_STR_REPOSITORY_H diff --git a/common/repositories/base/base_discovered_items_repository.h b/common/repositories/base/base_discovered_items_repository.h new file mode 100644 index 000000000..555566f9d --- /dev/null +++ b/common/repositories/base/base_discovered_items_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_DISCOVERED_ITEMS_REPOSITORY_H +#define EQEMU_BASE_DISCOVERED_ITEMS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseDiscoveredItemsRepository { +public: + struct DiscoveredItems { + int item_id; + std::string char_name; + int discovered_date; + int account_status; + }; + + static std::string PrimaryKey() + { + return std::string("item_id"); + } + + static std::vector Columns() + { + return { + "item_id", + "char_name", + "discovered_date", + "account_status", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("discovered_items"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static DiscoveredItems NewEntity() + { + DiscoveredItems entry{}; + + entry.item_id = 0; + entry.char_name = ""; + entry.discovered_date = 0; + entry.account_status = 0; + + return entry; + } + + static DiscoveredItems GetDiscoveredItemsEntry( + const std::vector &discovered_itemss, + int discovered_items_id + ) + { + for (auto &discovered_items : discovered_itemss) { + if (discovered_items.item_id == discovered_items_id) { + return discovered_items; + } + } + + return NewEntity(); + } + + static DiscoveredItems FindOne( + Database& db, + int discovered_items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + discovered_items_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + DiscoveredItems entry{}; + + entry.item_id = atoi(row[0]); + entry.char_name = row[1] ? row[1] : ""; + entry.discovered_date = atoi(row[2]); + entry.account_status = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int discovered_items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + discovered_items_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + DiscoveredItems discovered_items_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(discovered_items_entry.item_id)); + update_values.push_back(columns[1] + " = '" + EscapeString(discovered_items_entry.char_name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(discovered_items_entry.discovered_date)); + update_values.push_back(columns[3] + " = " + std::to_string(discovered_items_entry.account_status)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + discovered_items_entry.item_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static DiscoveredItems InsertOne( + Database& db, + DiscoveredItems discovered_items_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(discovered_items_entry.item_id)); + insert_values.push_back("'" + EscapeString(discovered_items_entry.char_name) + "'"); + insert_values.push_back(std::to_string(discovered_items_entry.discovered_date)); + insert_values.push_back(std::to_string(discovered_items_entry.account_status)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + discovered_items_entry.item_id = results.LastInsertedID(); + return discovered_items_entry; + } + + discovered_items_entry = NewEntity(); + + return discovered_items_entry; + } + + static int InsertMany( + Database& db, + std::vector discovered_items_entries + ) + { + std::vector insert_chunks; + + for (auto &discovered_items_entry: discovered_items_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(discovered_items_entry.item_id)); + insert_values.push_back("'" + EscapeString(discovered_items_entry.char_name) + "'"); + insert_values.push_back(std::to_string(discovered_items_entry.discovered_date)); + insert_values.push_back(std::to_string(discovered_items_entry.account_status)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DiscoveredItems entry{}; + + entry.item_id = atoi(row[0]); + entry.char_name = row[1] ? row[1] : ""; + entry.discovered_date = atoi(row[2]); + entry.account_status = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DiscoveredItems entry{}; + + entry.item_id = atoi(row[0]); + entry.char_name = row[1] ? row[1] : ""; + entry.discovered_date = atoi(row[2]); + entry.account_status = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_DISCOVERED_ITEMS_REPOSITORY_H diff --git a/common/repositories/base/base_doors_repository.h b/common/repositories/base/base_doors_repository.h new file mode 100644 index 000000000..75d740742 --- /dev/null +++ b/common/repositories/base/base_doors_repository.h @@ -0,0 +1,598 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_DOORS_REPOSITORY_H +#define EQEMU_BASE_DOORS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseDoorsRepository { +public: + struct Doors { + int id; + int doorid; + std::string zone; + int version; + std::string name; + float pos_y; + float pos_x; + float pos_z; + float heading; + int opentype; + int guild; + int lockpick; + int keyitem; + int nokeyring; + int triggerdoor; + int triggertype; + int disable_timer; + int doorisopen; + int door_param; + std::string dest_zone; + int dest_instance; + float dest_x; + float dest_y; + float dest_z; + float dest_heading; + int invert_state; + int incline; + int size; + float buffer; + int client_version_mask; + int is_ldon_door; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + int is_instance_door; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "doorid", + "zone", + "version", + "name", + "pos_y", + "pos_x", + "pos_z", + "heading", + "opentype", + "guild", + "lockpick", + "keyitem", + "nokeyring", + "triggerdoor", + "triggertype", + "disable_timer", + "doorisopen", + "door_param", + "dest_zone", + "dest_instance", + "dest_x", + "dest_y", + "dest_z", + "dest_heading", + "invert_state", + "incline", + "size", + "buffer", + "client_version_mask", + "is_ldon_door", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + "is_instance_door", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("doors"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Doors NewEntity() + { + Doors entry{}; + + entry.id = 0; + entry.doorid = 0; + entry.zone = ""; + entry.version = 0; + entry.name = ""; + entry.pos_y = 0; + entry.pos_x = 0; + entry.pos_z = 0; + entry.heading = 0; + entry.opentype = 0; + entry.guild = 0; + entry.lockpick = 0; + entry.keyitem = 0; + entry.nokeyring = 0; + entry.triggerdoor = 0; + entry.triggertype = 0; + entry.disable_timer = 0; + entry.doorisopen = 0; + entry.door_param = 0; + entry.dest_zone = "NONE"; + entry.dest_instance = 0; + entry.dest_x = 0; + entry.dest_y = 0; + entry.dest_z = 0; + entry.dest_heading = 0; + entry.invert_state = 0; + entry.incline = 0; + entry.size = 100; + entry.buffer = 0; + entry.client_version_mask = 4294967295; + entry.is_ldon_door = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + entry.is_instance_door = 0; + + return entry; + } + + static Doors GetDoorsEntry( + const std::vector &doorss, + int doors_id + ) + { + for (auto &doors : doorss) { + if (doors.id == doors_id) { + return doors; + } + } + + return NewEntity(); + } + + static Doors FindOne( + Database& db, + int doors_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + doors_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Doors entry{}; + + entry.id = atoi(row[0]); + entry.doorid = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.version = atoi(row[3]); + entry.name = row[4] ? row[4] : ""; + entry.pos_y = static_cast(atof(row[5])); + entry.pos_x = static_cast(atof(row[6])); + entry.pos_z = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.opentype = atoi(row[9]); + entry.guild = atoi(row[10]); + entry.lockpick = atoi(row[11]); + entry.keyitem = atoi(row[12]); + entry.nokeyring = atoi(row[13]); + entry.triggerdoor = atoi(row[14]); + entry.triggertype = atoi(row[15]); + entry.disable_timer = atoi(row[16]); + entry.doorisopen = atoi(row[17]); + entry.door_param = atoi(row[18]); + entry.dest_zone = row[19] ? row[19] : ""; + entry.dest_instance = atoi(row[20]); + entry.dest_x = static_cast(atof(row[21])); + entry.dest_y = static_cast(atof(row[22])); + entry.dest_z = static_cast(atof(row[23])); + entry.dest_heading = static_cast(atof(row[24])); + entry.invert_state = atoi(row[25]); + entry.incline = atoi(row[26]); + entry.size = atoi(row[27]); + entry.buffer = static_cast(atof(row[28])); + entry.client_version_mask = atoi(row[29]); + entry.is_ldon_door = atoi(row[30]); + entry.min_expansion = atoi(row[31]); + entry.max_expansion = atoi(row[32]); + entry.content_flags = row[33] ? row[33] : ""; + entry.content_flags_disabled = row[34] ? row[34] : ""; + entry.is_instance_door = atoi(row[35]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int doors_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + doors_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Doors doors_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(doors_entry.doorid)); + update_values.push_back(columns[2] + " = '" + EscapeString(doors_entry.zone) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(doors_entry.version)); + update_values.push_back(columns[4] + " = '" + EscapeString(doors_entry.name) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(doors_entry.pos_y)); + update_values.push_back(columns[6] + " = " + std::to_string(doors_entry.pos_x)); + update_values.push_back(columns[7] + " = " + std::to_string(doors_entry.pos_z)); + update_values.push_back(columns[8] + " = " + std::to_string(doors_entry.heading)); + update_values.push_back(columns[9] + " = " + std::to_string(doors_entry.opentype)); + update_values.push_back(columns[10] + " = " + std::to_string(doors_entry.guild)); + update_values.push_back(columns[11] + " = " + std::to_string(doors_entry.lockpick)); + update_values.push_back(columns[12] + " = " + std::to_string(doors_entry.keyitem)); + update_values.push_back(columns[13] + " = " + std::to_string(doors_entry.nokeyring)); + update_values.push_back(columns[14] + " = " + std::to_string(doors_entry.triggerdoor)); + update_values.push_back(columns[15] + " = " + std::to_string(doors_entry.triggertype)); + update_values.push_back(columns[16] + " = " + std::to_string(doors_entry.disable_timer)); + update_values.push_back(columns[17] + " = " + std::to_string(doors_entry.doorisopen)); + update_values.push_back(columns[18] + " = " + std::to_string(doors_entry.door_param)); + update_values.push_back(columns[19] + " = '" + EscapeString(doors_entry.dest_zone) + "'"); + update_values.push_back(columns[20] + " = " + std::to_string(doors_entry.dest_instance)); + update_values.push_back(columns[21] + " = " + std::to_string(doors_entry.dest_x)); + update_values.push_back(columns[22] + " = " + std::to_string(doors_entry.dest_y)); + update_values.push_back(columns[23] + " = " + std::to_string(doors_entry.dest_z)); + update_values.push_back(columns[24] + " = " + std::to_string(doors_entry.dest_heading)); + update_values.push_back(columns[25] + " = " + std::to_string(doors_entry.invert_state)); + update_values.push_back(columns[26] + " = " + std::to_string(doors_entry.incline)); + update_values.push_back(columns[27] + " = " + std::to_string(doors_entry.size)); + update_values.push_back(columns[28] + " = " + std::to_string(doors_entry.buffer)); + update_values.push_back(columns[29] + " = " + std::to_string(doors_entry.client_version_mask)); + update_values.push_back(columns[30] + " = " + std::to_string(doors_entry.is_ldon_door)); + update_values.push_back(columns[31] + " = " + std::to_string(doors_entry.min_expansion)); + update_values.push_back(columns[32] + " = " + std::to_string(doors_entry.max_expansion)); + update_values.push_back(columns[33] + " = '" + EscapeString(doors_entry.content_flags) + "'"); + update_values.push_back(columns[34] + " = '" + EscapeString(doors_entry.content_flags_disabled) + "'"); + update_values.push_back(columns[35] + " = " + std::to_string(doors_entry.is_instance_door)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + doors_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Doors InsertOne( + Database& db, + Doors doors_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(doors_entry.id)); + insert_values.push_back(std::to_string(doors_entry.doorid)); + insert_values.push_back("'" + EscapeString(doors_entry.zone) + "'"); + insert_values.push_back(std::to_string(doors_entry.version)); + insert_values.push_back("'" + EscapeString(doors_entry.name) + "'"); + insert_values.push_back(std::to_string(doors_entry.pos_y)); + insert_values.push_back(std::to_string(doors_entry.pos_x)); + insert_values.push_back(std::to_string(doors_entry.pos_z)); + insert_values.push_back(std::to_string(doors_entry.heading)); + insert_values.push_back(std::to_string(doors_entry.opentype)); + insert_values.push_back(std::to_string(doors_entry.guild)); + insert_values.push_back(std::to_string(doors_entry.lockpick)); + insert_values.push_back(std::to_string(doors_entry.keyitem)); + insert_values.push_back(std::to_string(doors_entry.nokeyring)); + insert_values.push_back(std::to_string(doors_entry.triggerdoor)); + insert_values.push_back(std::to_string(doors_entry.triggertype)); + insert_values.push_back(std::to_string(doors_entry.disable_timer)); + insert_values.push_back(std::to_string(doors_entry.doorisopen)); + insert_values.push_back(std::to_string(doors_entry.door_param)); + insert_values.push_back("'" + EscapeString(doors_entry.dest_zone) + "'"); + insert_values.push_back(std::to_string(doors_entry.dest_instance)); + insert_values.push_back(std::to_string(doors_entry.dest_x)); + insert_values.push_back(std::to_string(doors_entry.dest_y)); + insert_values.push_back(std::to_string(doors_entry.dest_z)); + insert_values.push_back(std::to_string(doors_entry.dest_heading)); + insert_values.push_back(std::to_string(doors_entry.invert_state)); + insert_values.push_back(std::to_string(doors_entry.incline)); + insert_values.push_back(std::to_string(doors_entry.size)); + insert_values.push_back(std::to_string(doors_entry.buffer)); + insert_values.push_back(std::to_string(doors_entry.client_version_mask)); + insert_values.push_back(std::to_string(doors_entry.is_ldon_door)); + insert_values.push_back(std::to_string(doors_entry.min_expansion)); + insert_values.push_back(std::to_string(doors_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(doors_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(doors_entry.content_flags_disabled) + "'"); + insert_values.push_back(std::to_string(doors_entry.is_instance_door)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + doors_entry.id = results.LastInsertedID(); + return doors_entry; + } + + doors_entry = NewEntity(); + + return doors_entry; + } + + static int InsertMany( + Database& db, + std::vector doors_entries + ) + { + std::vector insert_chunks; + + for (auto &doors_entry: doors_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(doors_entry.id)); + insert_values.push_back(std::to_string(doors_entry.doorid)); + insert_values.push_back("'" + EscapeString(doors_entry.zone) + "'"); + insert_values.push_back(std::to_string(doors_entry.version)); + insert_values.push_back("'" + EscapeString(doors_entry.name) + "'"); + insert_values.push_back(std::to_string(doors_entry.pos_y)); + insert_values.push_back(std::to_string(doors_entry.pos_x)); + insert_values.push_back(std::to_string(doors_entry.pos_z)); + insert_values.push_back(std::to_string(doors_entry.heading)); + insert_values.push_back(std::to_string(doors_entry.opentype)); + insert_values.push_back(std::to_string(doors_entry.guild)); + insert_values.push_back(std::to_string(doors_entry.lockpick)); + insert_values.push_back(std::to_string(doors_entry.keyitem)); + insert_values.push_back(std::to_string(doors_entry.nokeyring)); + insert_values.push_back(std::to_string(doors_entry.triggerdoor)); + insert_values.push_back(std::to_string(doors_entry.triggertype)); + insert_values.push_back(std::to_string(doors_entry.disable_timer)); + insert_values.push_back(std::to_string(doors_entry.doorisopen)); + insert_values.push_back(std::to_string(doors_entry.door_param)); + insert_values.push_back("'" + EscapeString(doors_entry.dest_zone) + "'"); + insert_values.push_back(std::to_string(doors_entry.dest_instance)); + insert_values.push_back(std::to_string(doors_entry.dest_x)); + insert_values.push_back(std::to_string(doors_entry.dest_y)); + insert_values.push_back(std::to_string(doors_entry.dest_z)); + insert_values.push_back(std::to_string(doors_entry.dest_heading)); + insert_values.push_back(std::to_string(doors_entry.invert_state)); + insert_values.push_back(std::to_string(doors_entry.incline)); + insert_values.push_back(std::to_string(doors_entry.size)); + insert_values.push_back(std::to_string(doors_entry.buffer)); + insert_values.push_back(std::to_string(doors_entry.client_version_mask)); + insert_values.push_back(std::to_string(doors_entry.is_ldon_door)); + insert_values.push_back(std::to_string(doors_entry.min_expansion)); + insert_values.push_back(std::to_string(doors_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(doors_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(doors_entry.content_flags_disabled) + "'"); + insert_values.push_back(std::to_string(doors_entry.is_instance_door)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Doors entry{}; + + entry.id = atoi(row[0]); + entry.doorid = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.version = atoi(row[3]); + entry.name = row[4] ? row[4] : ""; + entry.pos_y = static_cast(atof(row[5])); + entry.pos_x = static_cast(atof(row[6])); + entry.pos_z = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.opentype = atoi(row[9]); + entry.guild = atoi(row[10]); + entry.lockpick = atoi(row[11]); + entry.keyitem = atoi(row[12]); + entry.nokeyring = atoi(row[13]); + entry.triggerdoor = atoi(row[14]); + entry.triggertype = atoi(row[15]); + entry.disable_timer = atoi(row[16]); + entry.doorisopen = atoi(row[17]); + entry.door_param = atoi(row[18]); + entry.dest_zone = row[19] ? row[19] : ""; + entry.dest_instance = atoi(row[20]); + entry.dest_x = static_cast(atof(row[21])); + entry.dest_y = static_cast(atof(row[22])); + entry.dest_z = static_cast(atof(row[23])); + entry.dest_heading = static_cast(atof(row[24])); + entry.invert_state = atoi(row[25]); + entry.incline = atoi(row[26]); + entry.size = atoi(row[27]); + entry.buffer = static_cast(atof(row[28])); + entry.client_version_mask = atoi(row[29]); + entry.is_ldon_door = atoi(row[30]); + entry.min_expansion = atoi(row[31]); + entry.max_expansion = atoi(row[32]); + entry.content_flags = row[33] ? row[33] : ""; + entry.content_flags_disabled = row[34] ? row[34] : ""; + entry.is_instance_door = atoi(row[35]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Doors entry{}; + + entry.id = atoi(row[0]); + entry.doorid = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.version = atoi(row[3]); + entry.name = row[4] ? row[4] : ""; + entry.pos_y = static_cast(atof(row[5])); + entry.pos_x = static_cast(atof(row[6])); + entry.pos_z = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.opentype = atoi(row[9]); + entry.guild = atoi(row[10]); + entry.lockpick = atoi(row[11]); + entry.keyitem = atoi(row[12]); + entry.nokeyring = atoi(row[13]); + entry.triggerdoor = atoi(row[14]); + entry.triggertype = atoi(row[15]); + entry.disable_timer = atoi(row[16]); + entry.doorisopen = atoi(row[17]); + entry.door_param = atoi(row[18]); + entry.dest_zone = row[19] ? row[19] : ""; + entry.dest_instance = atoi(row[20]); + entry.dest_x = static_cast(atof(row[21])); + entry.dest_y = static_cast(atof(row[22])); + entry.dest_z = static_cast(atof(row[23])); + entry.dest_heading = static_cast(atof(row[24])); + entry.invert_state = atoi(row[25]); + entry.incline = atoi(row[26]); + entry.size = atoi(row[27]); + entry.buffer = static_cast(atof(row[28])); + entry.client_version_mask = atoi(row[29]); + entry.is_ldon_door = atoi(row[30]); + entry.min_expansion = atoi(row[31]); + entry.max_expansion = atoi(row[32]); + entry.content_flags = row[33] ? row[33] : ""; + entry.content_flags_disabled = row[34] ? row[34] : ""; + entry.is_instance_door = atoi(row[35]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_DOORS_REPOSITORY_H diff --git a/common/repositories/base/base_dynamic_zones_repository.h b/common/repositories/base/base_dynamic_zones_repository.h new file mode 100644 index 000000000..13aabb07b --- /dev/null +++ b/common/repositories/base/base_dynamic_zones_repository.h @@ -0,0 +1,427 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_DYNAMIC_ZONES_REPOSITORY_H +#define EQEMU_BASE_DYNAMIC_ZONES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseDynamicZonesRepository { +public: + struct DynamicZones { + int id; + int instance_id; + int type; + int compass_zone_id; + float compass_x; + float compass_y; + float compass_z; + int safe_return_zone_id; + float safe_return_x; + float safe_return_y; + float safe_return_z; + float safe_return_heading; + float zone_in_x; + float zone_in_y; + float zone_in_z; + float zone_in_heading; + int has_zone_in; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "instance_id", + "type", + "compass_zone_id", + "compass_x", + "compass_y", + "compass_z", + "safe_return_zone_id", + "safe_return_x", + "safe_return_y", + "safe_return_z", + "safe_return_heading", + "zone_in_x", + "zone_in_y", + "zone_in_z", + "zone_in_heading", + "has_zone_in", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("dynamic_zones"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static DynamicZones NewEntity() + { + DynamicZones entry{}; + + entry.id = 0; + entry.instance_id = 0; + entry.type = 0; + entry.compass_zone_id = 0; + entry.compass_x = 0; + entry.compass_y = 0; + entry.compass_z = 0; + entry.safe_return_zone_id = 0; + entry.safe_return_x = 0; + entry.safe_return_y = 0; + entry.safe_return_z = 0; + entry.safe_return_heading = 0; + entry.zone_in_x = 0; + entry.zone_in_y = 0; + entry.zone_in_z = 0; + entry.zone_in_heading = 0; + entry.has_zone_in = 0; + + return entry; + } + + static DynamicZones GetDynamicZonesEntry( + const std::vector &dynamic_zoness, + int dynamic_zones_id + ) + { + for (auto &dynamic_zones : dynamic_zoness) { + if (dynamic_zones.id == dynamic_zones_id) { + return dynamic_zones; + } + } + + return NewEntity(); + } + + static DynamicZones FindOne( + Database& db, + int dynamic_zones_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + dynamic_zones_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + DynamicZones entry{}; + + entry.id = atoi(row[0]); + entry.instance_id = atoi(row[1]); + entry.type = atoi(row[2]); + entry.compass_zone_id = atoi(row[3]); + entry.compass_x = static_cast(atof(row[4])); + entry.compass_y = static_cast(atof(row[5])); + entry.compass_z = static_cast(atof(row[6])); + entry.safe_return_zone_id = atoi(row[7]); + entry.safe_return_x = static_cast(atof(row[8])); + entry.safe_return_y = static_cast(atof(row[9])); + entry.safe_return_z = static_cast(atof(row[10])); + entry.safe_return_heading = static_cast(atof(row[11])); + entry.zone_in_x = static_cast(atof(row[12])); + entry.zone_in_y = static_cast(atof(row[13])); + entry.zone_in_z = static_cast(atof(row[14])); + entry.zone_in_heading = static_cast(atof(row[15])); + entry.has_zone_in = atoi(row[16]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int dynamic_zones_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + dynamic_zones_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + DynamicZones dynamic_zones_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(dynamic_zones_entry.instance_id)); + update_values.push_back(columns[2] + " = " + std::to_string(dynamic_zones_entry.type)); + update_values.push_back(columns[3] + " = " + std::to_string(dynamic_zones_entry.compass_zone_id)); + update_values.push_back(columns[4] + " = " + std::to_string(dynamic_zones_entry.compass_x)); + update_values.push_back(columns[5] + " = " + std::to_string(dynamic_zones_entry.compass_y)); + update_values.push_back(columns[6] + " = " + std::to_string(dynamic_zones_entry.compass_z)); + update_values.push_back(columns[7] + " = " + std::to_string(dynamic_zones_entry.safe_return_zone_id)); + update_values.push_back(columns[8] + " = " + std::to_string(dynamic_zones_entry.safe_return_x)); + update_values.push_back(columns[9] + " = " + std::to_string(dynamic_zones_entry.safe_return_y)); + update_values.push_back(columns[10] + " = " + std::to_string(dynamic_zones_entry.safe_return_z)); + update_values.push_back(columns[11] + " = " + std::to_string(dynamic_zones_entry.safe_return_heading)); + update_values.push_back(columns[12] + " = " + std::to_string(dynamic_zones_entry.zone_in_x)); + update_values.push_back(columns[13] + " = " + std::to_string(dynamic_zones_entry.zone_in_y)); + update_values.push_back(columns[14] + " = " + std::to_string(dynamic_zones_entry.zone_in_z)); + update_values.push_back(columns[15] + " = " + std::to_string(dynamic_zones_entry.zone_in_heading)); + update_values.push_back(columns[16] + " = " + std::to_string(dynamic_zones_entry.has_zone_in)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + dynamic_zones_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static DynamicZones InsertOne( + Database& db, + DynamicZones dynamic_zones_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(dynamic_zones_entry.id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.instance_id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.type)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_zone_id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_x)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_y)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_z)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_zone_id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_x)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_y)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_z)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_heading)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_x)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_y)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_z)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_heading)); + insert_values.push_back(std::to_string(dynamic_zones_entry.has_zone_in)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + dynamic_zones_entry.id = results.LastInsertedID(); + return dynamic_zones_entry; + } + + dynamic_zones_entry = NewEntity(); + + return dynamic_zones_entry; + } + + static int InsertMany( + Database& db, + std::vector dynamic_zones_entries + ) + { + std::vector insert_chunks; + + for (auto &dynamic_zones_entry: dynamic_zones_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(dynamic_zones_entry.id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.instance_id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.type)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_zone_id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_x)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_y)); + insert_values.push_back(std::to_string(dynamic_zones_entry.compass_z)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_zone_id)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_x)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_y)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_z)); + insert_values.push_back(std::to_string(dynamic_zones_entry.safe_return_heading)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_x)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_y)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_z)); + insert_values.push_back(std::to_string(dynamic_zones_entry.zone_in_heading)); + insert_values.push_back(std::to_string(dynamic_zones_entry.has_zone_in)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DynamicZones entry{}; + + entry.id = atoi(row[0]); + entry.instance_id = atoi(row[1]); + entry.type = atoi(row[2]); + entry.compass_zone_id = atoi(row[3]); + entry.compass_x = static_cast(atof(row[4])); + entry.compass_y = static_cast(atof(row[5])); + entry.compass_z = static_cast(atof(row[6])); + entry.safe_return_zone_id = atoi(row[7]); + entry.safe_return_x = static_cast(atof(row[8])); + entry.safe_return_y = static_cast(atof(row[9])); + entry.safe_return_z = static_cast(atof(row[10])); + entry.safe_return_heading = static_cast(atof(row[11])); + entry.zone_in_x = static_cast(atof(row[12])); + entry.zone_in_y = static_cast(atof(row[13])); + entry.zone_in_z = static_cast(atof(row[14])); + entry.zone_in_heading = static_cast(atof(row[15])); + entry.has_zone_in = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + DynamicZones entry{}; + + entry.id = atoi(row[0]); + entry.instance_id = atoi(row[1]); + entry.type = atoi(row[2]); + entry.compass_zone_id = atoi(row[3]); + entry.compass_x = static_cast(atof(row[4])); + entry.compass_y = static_cast(atof(row[5])); + entry.compass_z = static_cast(atof(row[6])); + entry.safe_return_zone_id = atoi(row[7]); + entry.safe_return_x = static_cast(atof(row[8])); + entry.safe_return_y = static_cast(atof(row[9])); + entry.safe_return_z = static_cast(atof(row[10])); + entry.safe_return_heading = static_cast(atof(row[11])); + entry.zone_in_x = static_cast(atof(row[12])); + entry.zone_in_y = static_cast(atof(row[13])); + entry.zone_in_z = static_cast(atof(row[14])); + entry.zone_in_heading = static_cast(atof(row[15])); + entry.has_zone_in = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_DYNAMIC_ZONES_REPOSITORY_H diff --git a/common/repositories/base/base_eventlog_repository.h b/common/repositories/base/base_eventlog_repository.h new file mode 100644 index 000000000..999fb455b --- /dev/null +++ b/common/repositories/base/base_eventlog_repository.h @@ -0,0 +1,364 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_EVENTLOG_REPOSITORY_H +#define EQEMU_BASE_EVENTLOG_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseEventlogRepository { +public: + struct Eventlog { + int id; + std::string accountname; + int accountid; + int status; + std::string charname; + std::string target; + std::string time; + std::string descriptiontype; + std::string description; + int event_nid; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "accountname", + "accountid", + "status", + "charname", + "target", + "time", + "descriptiontype", + "description", + "event_nid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("eventlog"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Eventlog NewEntity() + { + Eventlog entry{}; + + entry.id = 0; + entry.accountname = ""; + entry.accountid = 0; + entry.status = 0; + entry.charname = ""; + entry.target = "None"; + entry.time = current_timestamp(); + entry.descriptiontype = ""; + entry.description = ""; + entry.event_nid = 0; + + return entry; + } + + static Eventlog GetEventlogEntry( + const std::vector &eventlogs, + int eventlog_id + ) + { + for (auto &eventlog : eventlogs) { + if (eventlog.id == eventlog_id) { + return eventlog; + } + } + + return NewEntity(); + } + + static Eventlog FindOne( + Database& db, + int eventlog_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + eventlog_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Eventlog entry{}; + + entry.id = atoi(row[0]); + entry.accountname = row[1] ? row[1] : ""; + entry.accountid = atoi(row[2]); + entry.status = atoi(row[3]); + entry.charname = row[4] ? row[4] : ""; + entry.target = row[5] ? row[5] : ""; + entry.time = row[6] ? row[6] : ""; + entry.descriptiontype = row[7] ? row[7] : ""; + entry.description = row[8] ? row[8] : ""; + entry.event_nid = atoi(row[9]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int eventlog_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + eventlog_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Eventlog eventlog_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(eventlog_entry.accountname) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(eventlog_entry.accountid)); + update_values.push_back(columns[3] + " = " + std::to_string(eventlog_entry.status)); + update_values.push_back(columns[4] + " = '" + EscapeString(eventlog_entry.charname) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(eventlog_entry.target) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(eventlog_entry.time) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(eventlog_entry.descriptiontype) + "'"); + update_values.push_back(columns[8] + " = '" + EscapeString(eventlog_entry.description) + "'"); + update_values.push_back(columns[9] + " = " + std::to_string(eventlog_entry.event_nid)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + eventlog_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Eventlog InsertOne( + Database& db, + Eventlog eventlog_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(eventlog_entry.id)); + insert_values.push_back("'" + EscapeString(eventlog_entry.accountname) + "'"); + insert_values.push_back(std::to_string(eventlog_entry.accountid)); + insert_values.push_back(std::to_string(eventlog_entry.status)); + insert_values.push_back("'" + EscapeString(eventlog_entry.charname) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.target) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.time) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.descriptiontype) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.description) + "'"); + insert_values.push_back(std::to_string(eventlog_entry.event_nid)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + eventlog_entry.id = results.LastInsertedID(); + return eventlog_entry; + } + + eventlog_entry = NewEntity(); + + return eventlog_entry; + } + + static int InsertMany( + Database& db, + std::vector eventlog_entries + ) + { + std::vector insert_chunks; + + for (auto &eventlog_entry: eventlog_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(eventlog_entry.id)); + insert_values.push_back("'" + EscapeString(eventlog_entry.accountname) + "'"); + insert_values.push_back(std::to_string(eventlog_entry.accountid)); + insert_values.push_back(std::to_string(eventlog_entry.status)); + insert_values.push_back("'" + EscapeString(eventlog_entry.charname) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.target) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.time) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.descriptiontype) + "'"); + insert_values.push_back("'" + EscapeString(eventlog_entry.description) + "'"); + insert_values.push_back(std::to_string(eventlog_entry.event_nid)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Eventlog entry{}; + + entry.id = atoi(row[0]); + entry.accountname = row[1] ? row[1] : ""; + entry.accountid = atoi(row[2]); + entry.status = atoi(row[3]); + entry.charname = row[4] ? row[4] : ""; + entry.target = row[5] ? row[5] : ""; + entry.time = row[6] ? row[6] : ""; + entry.descriptiontype = row[7] ? row[7] : ""; + entry.description = row[8] ? row[8] : ""; + entry.event_nid = atoi(row[9]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Eventlog entry{}; + + entry.id = atoi(row[0]); + entry.accountname = row[1] ? row[1] : ""; + entry.accountid = atoi(row[2]); + entry.status = atoi(row[3]); + entry.charname = row[4] ? row[4] : ""; + entry.target = row[5] ? row[5] : ""; + entry.time = row[6] ? row[6] : ""; + entry.descriptiontype = row[7] ? row[7] : ""; + entry.description = row[8] ? row[8] : ""; + entry.event_nid = atoi(row[9]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_EVENTLOG_REPOSITORY_H diff --git a/common/repositories/base/base_expedition_lockouts_repository.h b/common/repositories/base/base_expedition_lockouts_repository.h new file mode 100644 index 000000000..e9c5ceda2 --- /dev/null +++ b/common/repositories/base/base_expedition_lockouts_repository.h @@ -0,0 +1,328 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_EXPEDITION_LOCKOUTS_REPOSITORY_H +#define EQEMU_BASE_EXPEDITION_LOCKOUTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseExpeditionLockoutsRepository { +public: + struct ExpeditionLockouts { + int id; + int expedition_id; + std::string event_name; + std::string expire_time; + int duration; + std::string from_expedition_uuid; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "expedition_id", + "event_name", + "expire_time", + "duration", + "from_expedition_uuid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("expedition_lockouts"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ExpeditionLockouts NewEntity() + { + ExpeditionLockouts entry{}; + + entry.id = 0; + entry.expedition_id = 0; + entry.event_name = ""; + entry.expire_time = ""; + entry.duration = 0; + entry.from_expedition_uuid = ""; + + return entry; + } + + static ExpeditionLockouts GetExpeditionLockoutsEntry( + const std::vector &expedition_lockoutss, + int expedition_lockouts_id + ) + { + for (auto &expedition_lockouts : expedition_lockoutss) { + if (expedition_lockouts.id == expedition_lockouts_id) { + return expedition_lockouts; + } + } + + return NewEntity(); + } + + static ExpeditionLockouts FindOne( + Database& db, + int expedition_lockouts_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + expedition_lockouts_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ExpeditionLockouts entry{}; + + entry.id = atoi(row[0]); + entry.expedition_id = atoi(row[1]); + entry.event_name = row[2] ? row[2] : ""; + entry.expire_time = row[3] ? row[3] : ""; + entry.duration = atoi(row[4]); + entry.from_expedition_uuid = row[5] ? row[5] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int expedition_lockouts_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + expedition_lockouts_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ExpeditionLockouts expedition_lockouts_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(expedition_lockouts_entry.expedition_id)); + update_values.push_back(columns[2] + " = '" + EscapeString(expedition_lockouts_entry.event_name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(expedition_lockouts_entry.expire_time) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(expedition_lockouts_entry.duration)); + update_values.push_back(columns[5] + " = '" + EscapeString(expedition_lockouts_entry.from_expedition_uuid) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + expedition_lockouts_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ExpeditionLockouts InsertOne( + Database& db, + ExpeditionLockouts expedition_lockouts_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(expedition_lockouts_entry.id)); + insert_values.push_back(std::to_string(expedition_lockouts_entry.expedition_id)); + insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.event_name) + "'"); + insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.expire_time) + "'"); + insert_values.push_back(std::to_string(expedition_lockouts_entry.duration)); + insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.from_expedition_uuid) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + expedition_lockouts_entry.id = results.LastInsertedID(); + return expedition_lockouts_entry; + } + + expedition_lockouts_entry = NewEntity(); + + return expedition_lockouts_entry; + } + + static int InsertMany( + Database& db, + std::vector expedition_lockouts_entries + ) + { + std::vector insert_chunks; + + for (auto &expedition_lockouts_entry: expedition_lockouts_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(expedition_lockouts_entry.id)); + insert_values.push_back(std::to_string(expedition_lockouts_entry.expedition_id)); + insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.event_name) + "'"); + insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.expire_time) + "'"); + insert_values.push_back(std::to_string(expedition_lockouts_entry.duration)); + insert_values.push_back("'" + EscapeString(expedition_lockouts_entry.from_expedition_uuid) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ExpeditionLockouts entry{}; + + entry.id = atoi(row[0]); + entry.expedition_id = atoi(row[1]); + entry.event_name = row[2] ? row[2] : ""; + entry.expire_time = row[3] ? row[3] : ""; + entry.duration = atoi(row[4]); + entry.from_expedition_uuid = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ExpeditionLockouts entry{}; + + entry.id = atoi(row[0]); + entry.expedition_id = atoi(row[1]); + entry.event_name = row[2] ? row[2] : ""; + entry.expire_time = row[3] ? row[3] : ""; + entry.duration = atoi(row[4]); + entry.from_expedition_uuid = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_EXPEDITION_LOCKOUTS_REPOSITORY_H diff --git a/common/repositories/base/base_expedition_members_repository.h b/common/repositories/base/base_expedition_members_repository.h new file mode 100644 index 000000000..dde0be588 --- /dev/null +++ b/common/repositories/base/base_expedition_members_repository.h @@ -0,0 +1,310 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_EXPEDITION_MEMBERS_REPOSITORY_H +#define EQEMU_BASE_EXPEDITION_MEMBERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseExpeditionMembersRepository { +public: + struct ExpeditionMembers { + int id; + int expedition_id; + int character_id; + int is_current_member; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "expedition_id", + "character_id", + "is_current_member", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("expedition_members"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ExpeditionMembers NewEntity() + { + ExpeditionMembers entry{}; + + entry.id = 0; + entry.expedition_id = 0; + entry.character_id = 0; + entry.is_current_member = 1; + + return entry; + } + + static ExpeditionMembers GetExpeditionMembersEntry( + const std::vector &expedition_memberss, + int expedition_members_id + ) + { + for (auto &expedition_members : expedition_memberss) { + if (expedition_members.id == expedition_members_id) { + return expedition_members; + } + } + + return NewEntity(); + } + + static ExpeditionMembers FindOne( + Database& db, + int expedition_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + expedition_members_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ExpeditionMembers entry{}; + + entry.id = atoi(row[0]); + entry.expedition_id = atoi(row[1]); + entry.character_id = atoi(row[2]); + entry.is_current_member = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int expedition_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + expedition_members_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ExpeditionMembers expedition_members_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(expedition_members_entry.expedition_id)); + update_values.push_back(columns[2] + " = " + std::to_string(expedition_members_entry.character_id)); + update_values.push_back(columns[3] + " = " + std::to_string(expedition_members_entry.is_current_member)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + expedition_members_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ExpeditionMembers InsertOne( + Database& db, + ExpeditionMembers expedition_members_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(expedition_members_entry.id)); + insert_values.push_back(std::to_string(expedition_members_entry.expedition_id)); + insert_values.push_back(std::to_string(expedition_members_entry.character_id)); + insert_values.push_back(std::to_string(expedition_members_entry.is_current_member)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + expedition_members_entry.id = results.LastInsertedID(); + return expedition_members_entry; + } + + expedition_members_entry = NewEntity(); + + return expedition_members_entry; + } + + static int InsertMany( + Database& db, + std::vector expedition_members_entries + ) + { + std::vector insert_chunks; + + for (auto &expedition_members_entry: expedition_members_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(expedition_members_entry.id)); + insert_values.push_back(std::to_string(expedition_members_entry.expedition_id)); + insert_values.push_back(std::to_string(expedition_members_entry.character_id)); + insert_values.push_back(std::to_string(expedition_members_entry.is_current_member)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ExpeditionMembers entry{}; + + entry.id = atoi(row[0]); + entry.expedition_id = atoi(row[1]); + entry.character_id = atoi(row[2]); + entry.is_current_member = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ExpeditionMembers entry{}; + + entry.id = atoi(row[0]); + entry.expedition_id = atoi(row[1]); + entry.character_id = atoi(row[2]); + entry.is_current_member = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_EXPEDITION_MEMBERS_REPOSITORY_H diff --git a/common/repositories/base/base_expeditions_repository.h b/common/repositories/base/base_expeditions_repository.h new file mode 100644 index 000000000..8fea9a698 --- /dev/null +++ b/common/repositories/base/base_expeditions_repository.h @@ -0,0 +1,355 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_EXPEDITIONS_REPOSITORY_H +#define EQEMU_BASE_EXPEDITIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseExpeditionsRepository { +public: + struct Expeditions { + int id; + std::string uuid; + int dynamic_zone_id; + std::string expedition_name; + int leader_id; + int min_players; + int max_players; + int add_replay_on_join; + int is_locked; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "uuid", + "dynamic_zone_id", + "expedition_name", + "leader_id", + "min_players", + "max_players", + "add_replay_on_join", + "is_locked", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("expeditions"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Expeditions NewEntity() + { + Expeditions entry{}; + + entry.id = 0; + entry.uuid = ""; + entry.dynamic_zone_id = 0; + entry.expedition_name = ""; + entry.leader_id = 0; + entry.min_players = 0; + entry.max_players = 0; + entry.add_replay_on_join = 1; + entry.is_locked = 0; + + return entry; + } + + static Expeditions GetExpeditionsEntry( + const std::vector &expeditionss, + int expeditions_id + ) + { + for (auto &expeditions : expeditionss) { + if (expeditions.id == expeditions_id) { + return expeditions; + } + } + + return NewEntity(); + } + + static Expeditions FindOne( + Database& db, + int expeditions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + expeditions_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Expeditions entry{}; + + entry.id = atoi(row[0]); + entry.uuid = row[1] ? row[1] : ""; + entry.dynamic_zone_id = atoi(row[2]); + entry.expedition_name = row[3] ? row[3] : ""; + entry.leader_id = atoi(row[4]); + entry.min_players = atoi(row[5]); + entry.max_players = atoi(row[6]); + entry.add_replay_on_join = atoi(row[7]); + entry.is_locked = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int expeditions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + expeditions_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Expeditions expeditions_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(expeditions_entry.uuid) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(expeditions_entry.dynamic_zone_id)); + update_values.push_back(columns[3] + " = '" + EscapeString(expeditions_entry.expedition_name) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(expeditions_entry.leader_id)); + update_values.push_back(columns[5] + " = " + std::to_string(expeditions_entry.min_players)); + update_values.push_back(columns[6] + " = " + std::to_string(expeditions_entry.max_players)); + update_values.push_back(columns[7] + " = " + std::to_string(expeditions_entry.add_replay_on_join)); + update_values.push_back(columns[8] + " = " + std::to_string(expeditions_entry.is_locked)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + expeditions_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Expeditions InsertOne( + Database& db, + Expeditions expeditions_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(expeditions_entry.id)); + insert_values.push_back("'" + EscapeString(expeditions_entry.uuid) + "'"); + insert_values.push_back(std::to_string(expeditions_entry.dynamic_zone_id)); + insert_values.push_back("'" + EscapeString(expeditions_entry.expedition_name) + "'"); + insert_values.push_back(std::to_string(expeditions_entry.leader_id)); + insert_values.push_back(std::to_string(expeditions_entry.min_players)); + insert_values.push_back(std::to_string(expeditions_entry.max_players)); + insert_values.push_back(std::to_string(expeditions_entry.add_replay_on_join)); + insert_values.push_back(std::to_string(expeditions_entry.is_locked)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + expeditions_entry.id = results.LastInsertedID(); + return expeditions_entry; + } + + expeditions_entry = NewEntity(); + + return expeditions_entry; + } + + static int InsertMany( + Database& db, + std::vector expeditions_entries + ) + { + std::vector insert_chunks; + + for (auto &expeditions_entry: expeditions_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(expeditions_entry.id)); + insert_values.push_back("'" + EscapeString(expeditions_entry.uuid) + "'"); + insert_values.push_back(std::to_string(expeditions_entry.dynamic_zone_id)); + insert_values.push_back("'" + EscapeString(expeditions_entry.expedition_name) + "'"); + insert_values.push_back(std::to_string(expeditions_entry.leader_id)); + insert_values.push_back(std::to_string(expeditions_entry.min_players)); + insert_values.push_back(std::to_string(expeditions_entry.max_players)); + insert_values.push_back(std::to_string(expeditions_entry.add_replay_on_join)); + insert_values.push_back(std::to_string(expeditions_entry.is_locked)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Expeditions entry{}; + + entry.id = atoi(row[0]); + entry.uuid = row[1] ? row[1] : ""; + entry.dynamic_zone_id = atoi(row[2]); + entry.expedition_name = row[3] ? row[3] : ""; + entry.leader_id = atoi(row[4]); + entry.min_players = atoi(row[5]); + entry.max_players = atoi(row[6]); + entry.add_replay_on_join = atoi(row[7]); + entry.is_locked = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Expeditions entry{}; + + entry.id = atoi(row[0]); + entry.uuid = row[1] ? row[1] : ""; + entry.dynamic_zone_id = atoi(row[2]); + entry.expedition_name = row[3] ? row[3] : ""; + entry.leader_id = atoi(row[4]); + entry.min_players = atoi(row[5]); + entry.max_players = atoi(row[6]); + entry.add_replay_on_join = atoi(row[7]); + entry.is_locked = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_EXPEDITIONS_REPOSITORY_H diff --git a/common/repositories/base/base_faction_base_data_repository.h b/common/repositories/base/base_faction_base_data_repository.h new file mode 100644 index 000000000..c5bfc8c43 --- /dev/null +++ b/common/repositories/base/base_faction_base_data_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FACTION_BASE_DATA_REPOSITORY_H +#define EQEMU_BASE_FACTION_BASE_DATA_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseFactionBaseDataRepository { +public: + struct FactionBaseData { + int client_faction_id; + int min; + int max; + int unk_hero1; + int unk_hero2; + int unk_hero3; + }; + + static std::string PrimaryKey() + { + return std::string("client_faction_id"); + } + + static std::vector Columns() + { + return { + "client_faction_id", + "min", + "max", + "unk_hero1", + "unk_hero2", + "unk_hero3", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("faction_base_data"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static FactionBaseData NewEntity() + { + FactionBaseData entry{}; + + entry.client_faction_id = 0; + entry.min = -2000; + entry.max = 2000; + entry.unk_hero1 = 0; + entry.unk_hero2 = 0; + entry.unk_hero3 = 0; + + return entry; + } + + static FactionBaseData GetFactionBaseDataEntry( + const std::vector &faction_base_datas, + int faction_base_data_id + ) + { + for (auto &faction_base_data : faction_base_datas) { + if (faction_base_data.client_faction_id == faction_base_data_id) { + return faction_base_data; + } + } + + return NewEntity(); + } + + static FactionBaseData FindOne( + Database& db, + int faction_base_data_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + faction_base_data_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + FactionBaseData entry{}; + + entry.client_faction_id = atoi(row[0]); + entry.min = atoi(row[1]); + entry.max = atoi(row[2]); + entry.unk_hero1 = atoi(row[3]); + entry.unk_hero2 = atoi(row[4]); + entry.unk_hero3 = atoi(row[5]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int faction_base_data_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + faction_base_data_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + FactionBaseData faction_base_data_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(faction_base_data_entry.client_faction_id)); + update_values.push_back(columns[1] + " = " + std::to_string(faction_base_data_entry.min)); + update_values.push_back(columns[2] + " = " + std::to_string(faction_base_data_entry.max)); + update_values.push_back(columns[3] + " = " + std::to_string(faction_base_data_entry.unk_hero1)); + update_values.push_back(columns[4] + " = " + std::to_string(faction_base_data_entry.unk_hero2)); + update_values.push_back(columns[5] + " = " + std::to_string(faction_base_data_entry.unk_hero3)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + faction_base_data_entry.client_faction_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static FactionBaseData InsertOne( + Database& db, + FactionBaseData faction_base_data_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_base_data_entry.client_faction_id)); + insert_values.push_back(std::to_string(faction_base_data_entry.min)); + insert_values.push_back(std::to_string(faction_base_data_entry.max)); + insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero1)); + insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero2)); + insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero3)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + faction_base_data_entry.client_faction_id = results.LastInsertedID(); + return faction_base_data_entry; + } + + faction_base_data_entry = NewEntity(); + + return faction_base_data_entry; + } + + static int InsertMany( + Database& db, + std::vector faction_base_data_entries + ) + { + std::vector insert_chunks; + + for (auto &faction_base_data_entry: faction_base_data_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_base_data_entry.client_faction_id)); + insert_values.push_back(std::to_string(faction_base_data_entry.min)); + insert_values.push_back(std::to_string(faction_base_data_entry.max)); + insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero1)); + insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero2)); + insert_values.push_back(std::to_string(faction_base_data_entry.unk_hero3)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionBaseData entry{}; + + entry.client_faction_id = atoi(row[0]); + entry.min = atoi(row[1]); + entry.max = atoi(row[2]); + entry.unk_hero1 = atoi(row[3]); + entry.unk_hero2 = atoi(row[4]); + entry.unk_hero3 = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionBaseData entry{}; + + entry.client_faction_id = atoi(row[0]); + entry.min = atoi(row[1]); + entry.max = atoi(row[2]); + entry.unk_hero1 = atoi(row[3]); + entry.unk_hero2 = atoi(row[4]); + entry.unk_hero3 = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FACTION_BASE_DATA_REPOSITORY_H diff --git a/common/repositories/base/base_faction_list_mod_repository.h b/common/repositories/base/base_faction_list_mod_repository.h new file mode 100644 index 000000000..673c6ac96 --- /dev/null +++ b/common/repositories/base/base_faction_list_mod_repository.h @@ -0,0 +1,310 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FACTION_LIST_MOD_REPOSITORY_H +#define EQEMU_BASE_FACTION_LIST_MOD_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseFactionListModRepository { +public: + struct FactionListMod { + int id; + int faction_id; + int mod; + std::string mod_name; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "faction_id", + "mod", + "mod_name", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("faction_list_mod"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static FactionListMod NewEntity() + { + FactionListMod entry{}; + + entry.id = 0; + entry.faction_id = 0; + entry.mod = 0; + entry.mod_name = ""; + + return entry; + } + + static FactionListMod GetFactionListModEntry( + const std::vector &faction_list_mods, + int faction_list_mod_id + ) + { + for (auto &faction_list_mod : faction_list_mods) { + if (faction_list_mod.id == faction_list_mod_id) { + return faction_list_mod; + } + } + + return NewEntity(); + } + + static FactionListMod FindOne( + Database& db, + int faction_list_mod_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + faction_list_mod_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + FactionListMod entry{}; + + entry.id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.mod = atoi(row[2]); + entry.mod_name = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int faction_list_mod_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + faction_list_mod_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + FactionListMod faction_list_mod_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(faction_list_mod_entry.faction_id)); + update_values.push_back(columns[2] + " = " + std::to_string(faction_list_mod_entry.mod)); + update_values.push_back(columns[3] + " = '" + EscapeString(faction_list_mod_entry.mod_name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + faction_list_mod_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static FactionListMod InsertOne( + Database& db, + FactionListMod faction_list_mod_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_list_mod_entry.id)); + insert_values.push_back(std::to_string(faction_list_mod_entry.faction_id)); + insert_values.push_back(std::to_string(faction_list_mod_entry.mod)); + insert_values.push_back("'" + EscapeString(faction_list_mod_entry.mod_name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + faction_list_mod_entry.id = results.LastInsertedID(); + return faction_list_mod_entry; + } + + faction_list_mod_entry = NewEntity(); + + return faction_list_mod_entry; + } + + static int InsertMany( + Database& db, + std::vector faction_list_mod_entries + ) + { + std::vector insert_chunks; + + for (auto &faction_list_mod_entry: faction_list_mod_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_list_mod_entry.id)); + insert_values.push_back(std::to_string(faction_list_mod_entry.faction_id)); + insert_values.push_back(std::to_string(faction_list_mod_entry.mod)); + insert_values.push_back("'" + EscapeString(faction_list_mod_entry.mod_name) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionListMod entry{}; + + entry.id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.mod = atoi(row[2]); + entry.mod_name = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionListMod entry{}; + + entry.id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.mod = atoi(row[2]); + entry.mod_name = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FACTION_LIST_MOD_REPOSITORY_H diff --git a/common/repositories/base/base_faction_list_repository.h b/common/repositories/base/base_faction_list_repository.h new file mode 100644 index 000000000..32e20bb6c --- /dev/null +++ b/common/repositories/base/base_faction_list_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FACTION_LIST_REPOSITORY_H +#define EQEMU_BASE_FACTION_LIST_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseFactionListRepository { +public: + struct FactionList { + int id; + std::string name; + int base; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "base", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("faction_list"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static FactionList NewEntity() + { + FactionList entry{}; + + entry.id = 0; + entry.name = ""; + entry.base = 0; + + return entry; + } + + static FactionList GetFactionListEntry( + const std::vector &faction_lists, + int faction_list_id + ) + { + for (auto &faction_list : faction_lists) { + if (faction_list.id == faction_list_id) { + return faction_list; + } + } + + return NewEntity(); + } + + static FactionList FindOne( + Database& db, + int faction_list_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + faction_list_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + FactionList entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.base = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int faction_list_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + faction_list_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + FactionList faction_list_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(faction_list_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(faction_list_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(faction_list_entry.base)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + faction_list_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static FactionList InsertOne( + Database& db, + FactionList faction_list_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_list_entry.id)); + insert_values.push_back("'" + EscapeString(faction_list_entry.name) + "'"); + insert_values.push_back(std::to_string(faction_list_entry.base)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + faction_list_entry.id = results.LastInsertedID(); + return faction_list_entry; + } + + faction_list_entry = NewEntity(); + + return faction_list_entry; + } + + static int InsertMany( + Database& db, + std::vector faction_list_entries + ) + { + std::vector insert_chunks; + + for (auto &faction_list_entry: faction_list_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_list_entry.id)); + insert_values.push_back("'" + EscapeString(faction_list_entry.name) + "'"); + insert_values.push_back(std::to_string(faction_list_entry.base)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionList entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.base = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionList entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.base = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FACTION_LIST_REPOSITORY_H diff --git a/common/repositories/base/base_faction_values_repository.h b/common/repositories/base/base_faction_values_repository.h new file mode 100644 index 000000000..181779da3 --- /dev/null +++ b/common/repositories/base/base_faction_values_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FACTION_VALUES_REPOSITORY_H +#define EQEMU_BASE_FACTION_VALUES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseFactionValuesRepository { +public: + struct FactionValues { + int char_id; + int faction_id; + int current_value; + int temp; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "faction_id", + "current_value", + "temp", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("faction_values"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static FactionValues NewEntity() + { + FactionValues entry{}; + + entry.char_id = 0; + entry.faction_id = 0; + entry.current_value = 0; + entry.temp = 0; + + return entry; + } + + static FactionValues GetFactionValuesEntry( + const std::vector &faction_valuess, + int faction_values_id + ) + { + for (auto &faction_values : faction_valuess) { + if (faction_values.char_id == faction_values_id) { + return faction_values; + } + } + + return NewEntity(); + } + + static FactionValues FindOne( + Database& db, + int faction_values_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + faction_values_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + FactionValues entry{}; + + entry.char_id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.current_value = atoi(row[2]); + entry.temp = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int faction_values_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + faction_values_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + FactionValues faction_values_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(faction_values_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(faction_values_entry.faction_id)); + update_values.push_back(columns[2] + " = " + std::to_string(faction_values_entry.current_value)); + update_values.push_back(columns[3] + " = " + std::to_string(faction_values_entry.temp)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + faction_values_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static FactionValues InsertOne( + Database& db, + FactionValues faction_values_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_values_entry.char_id)); + insert_values.push_back(std::to_string(faction_values_entry.faction_id)); + insert_values.push_back(std::to_string(faction_values_entry.current_value)); + insert_values.push_back(std::to_string(faction_values_entry.temp)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + faction_values_entry.char_id = results.LastInsertedID(); + return faction_values_entry; + } + + faction_values_entry = NewEntity(); + + return faction_values_entry; + } + + static int InsertMany( + Database& db, + std::vector faction_values_entries + ) + { + std::vector insert_chunks; + + for (auto &faction_values_entry: faction_values_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(faction_values_entry.char_id)); + insert_values.push_back(std::to_string(faction_values_entry.faction_id)); + insert_values.push_back(std::to_string(faction_values_entry.current_value)); + insert_values.push_back(std::to_string(faction_values_entry.temp)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionValues entry{}; + + entry.char_id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.current_value = atoi(row[2]); + entry.temp = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + FactionValues entry{}; + + entry.char_id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.current_value = atoi(row[2]); + entry.temp = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FACTION_VALUES_REPOSITORY_H diff --git a/common/repositories/base/base_fishing_repository.h b/common/repositories/base/base_fishing_repository.h new file mode 100644 index 000000000..6ee2bf098 --- /dev/null +++ b/common/repositories/base/base_fishing_repository.h @@ -0,0 +1,373 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FISHING_REPOSITORY_H +#define EQEMU_BASE_FISHING_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseFishingRepository { +public: + struct Fishing { + int id; + int zoneid; + int Itemid; + int skill_level; + int chance; + int npc_id; + int npc_chance; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zoneid", + "Itemid", + "skill_level", + "chance", + "npc_id", + "npc_chance", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("fishing"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Fishing NewEntity() + { + Fishing entry{}; + + entry.id = 0; + entry.zoneid = 0; + entry.Itemid = 0; + entry.skill_level = 0; + entry.chance = 0; + entry.npc_id = 0; + entry.npc_chance = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Fishing GetFishingEntry( + const std::vector &fishings, + int fishing_id + ) + { + for (auto &fishing : fishings) { + if (fishing.id == fishing_id) { + return fishing; + } + } + + return NewEntity(); + } + + static Fishing FindOne( + Database& db, + int fishing_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + fishing_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Fishing entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.Itemid = atoi(row[2]); + entry.skill_level = atoi(row[3]); + entry.chance = atoi(row[4]); + entry.npc_id = atoi(row[5]); + entry.npc_chance = atoi(row[6]); + entry.min_expansion = atoi(row[7]); + entry.max_expansion = atoi(row[8]); + entry.content_flags = row[9] ? row[9] : ""; + entry.content_flags_disabled = row[10] ? row[10] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int fishing_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + fishing_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Fishing fishing_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(fishing_entry.zoneid)); + update_values.push_back(columns[2] + " = " + std::to_string(fishing_entry.Itemid)); + update_values.push_back(columns[3] + " = " + std::to_string(fishing_entry.skill_level)); + update_values.push_back(columns[4] + " = " + std::to_string(fishing_entry.chance)); + update_values.push_back(columns[5] + " = " + std::to_string(fishing_entry.npc_id)); + update_values.push_back(columns[6] + " = " + std::to_string(fishing_entry.npc_chance)); + update_values.push_back(columns[7] + " = " + std::to_string(fishing_entry.min_expansion)); + update_values.push_back(columns[8] + " = " + std::to_string(fishing_entry.max_expansion)); + update_values.push_back(columns[9] + " = '" + EscapeString(fishing_entry.content_flags) + "'"); + update_values.push_back(columns[10] + " = '" + EscapeString(fishing_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + fishing_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Fishing InsertOne( + Database& db, + Fishing fishing_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(fishing_entry.id)); + insert_values.push_back(std::to_string(fishing_entry.zoneid)); + insert_values.push_back(std::to_string(fishing_entry.Itemid)); + insert_values.push_back(std::to_string(fishing_entry.skill_level)); + insert_values.push_back(std::to_string(fishing_entry.chance)); + insert_values.push_back(std::to_string(fishing_entry.npc_id)); + insert_values.push_back(std::to_string(fishing_entry.npc_chance)); + insert_values.push_back(std::to_string(fishing_entry.min_expansion)); + insert_values.push_back(std::to_string(fishing_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(fishing_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(fishing_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + fishing_entry.id = results.LastInsertedID(); + return fishing_entry; + } + + fishing_entry = NewEntity(); + + return fishing_entry; + } + + static int InsertMany( + Database& db, + std::vector fishing_entries + ) + { + std::vector insert_chunks; + + for (auto &fishing_entry: fishing_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(fishing_entry.id)); + insert_values.push_back(std::to_string(fishing_entry.zoneid)); + insert_values.push_back(std::to_string(fishing_entry.Itemid)); + insert_values.push_back(std::to_string(fishing_entry.skill_level)); + insert_values.push_back(std::to_string(fishing_entry.chance)); + insert_values.push_back(std::to_string(fishing_entry.npc_id)); + insert_values.push_back(std::to_string(fishing_entry.npc_chance)); + insert_values.push_back(std::to_string(fishing_entry.min_expansion)); + insert_values.push_back(std::to_string(fishing_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(fishing_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(fishing_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Fishing entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.Itemid = atoi(row[2]); + entry.skill_level = atoi(row[3]); + entry.chance = atoi(row[4]); + entry.npc_id = atoi(row[5]); + entry.npc_chance = atoi(row[6]); + entry.min_expansion = atoi(row[7]); + entry.max_expansion = atoi(row[8]); + entry.content_flags = row[9] ? row[9] : ""; + entry.content_flags_disabled = row[10] ? row[10] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Fishing entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.Itemid = atoi(row[2]); + entry.skill_level = atoi(row[3]); + entry.chance = atoi(row[4]); + entry.npc_id = atoi(row[5]); + entry.npc_chance = atoi(row[6]); + entry.min_expansion = atoi(row[7]); + entry.max_expansion = atoi(row[8]); + entry.content_flags = row[9] ? row[9] : ""; + entry.content_flags_disabled = row[10] ? row[10] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FISHING_REPOSITORY_H diff --git a/common/repositories/base/base_forage_repository.h b/common/repositories/base/base_forage_repository.h new file mode 100644 index 000000000..0aa684b1b --- /dev/null +++ b/common/repositories/base/base_forage_repository.h @@ -0,0 +1,355 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FORAGE_REPOSITORY_H +#define EQEMU_BASE_FORAGE_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseForageRepository { +public: + struct Forage { + int id; + int zoneid; + int Itemid; + int level; + int chance; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zoneid", + "Itemid", + "level", + "chance", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("forage"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Forage NewEntity() + { + Forage entry{}; + + entry.id = 0; + entry.zoneid = 0; + entry.Itemid = 0; + entry.level = 0; + entry.chance = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Forage GetForageEntry( + const std::vector &forages, + int forage_id + ) + { + for (auto &forage : forages) { + if (forage.id == forage_id) { + return forage; + } + } + + return NewEntity(); + } + + static Forage FindOne( + Database& db, + int forage_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + forage_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Forage entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.Itemid = atoi(row[2]); + entry.level = atoi(row[3]); + entry.chance = atoi(row[4]); + entry.min_expansion = atoi(row[5]); + entry.max_expansion = atoi(row[6]); + entry.content_flags = row[7] ? row[7] : ""; + entry.content_flags_disabled = row[8] ? row[8] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int forage_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + forage_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Forage forage_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(forage_entry.zoneid)); + update_values.push_back(columns[2] + " = " + std::to_string(forage_entry.Itemid)); + update_values.push_back(columns[3] + " = " + std::to_string(forage_entry.level)); + update_values.push_back(columns[4] + " = " + std::to_string(forage_entry.chance)); + update_values.push_back(columns[5] + " = " + std::to_string(forage_entry.min_expansion)); + update_values.push_back(columns[6] + " = " + std::to_string(forage_entry.max_expansion)); + update_values.push_back(columns[7] + " = '" + EscapeString(forage_entry.content_flags) + "'"); + update_values.push_back(columns[8] + " = '" + EscapeString(forage_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + forage_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Forage InsertOne( + Database& db, + Forage forage_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(forage_entry.id)); + insert_values.push_back(std::to_string(forage_entry.zoneid)); + insert_values.push_back(std::to_string(forage_entry.Itemid)); + insert_values.push_back(std::to_string(forage_entry.level)); + insert_values.push_back(std::to_string(forage_entry.chance)); + insert_values.push_back(std::to_string(forage_entry.min_expansion)); + insert_values.push_back(std::to_string(forage_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(forage_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(forage_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + forage_entry.id = results.LastInsertedID(); + return forage_entry; + } + + forage_entry = NewEntity(); + + return forage_entry; + } + + static int InsertMany( + Database& db, + std::vector forage_entries + ) + { + std::vector insert_chunks; + + for (auto &forage_entry: forage_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(forage_entry.id)); + insert_values.push_back(std::to_string(forage_entry.zoneid)); + insert_values.push_back(std::to_string(forage_entry.Itemid)); + insert_values.push_back(std::to_string(forage_entry.level)); + insert_values.push_back(std::to_string(forage_entry.chance)); + insert_values.push_back(std::to_string(forage_entry.min_expansion)); + insert_values.push_back(std::to_string(forage_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(forage_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(forage_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Forage entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.Itemid = atoi(row[2]); + entry.level = atoi(row[3]); + entry.chance = atoi(row[4]); + entry.min_expansion = atoi(row[5]); + entry.max_expansion = atoi(row[6]); + entry.content_flags = row[7] ? row[7] : ""; + entry.content_flags_disabled = row[8] ? row[8] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Forage entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.Itemid = atoi(row[2]); + entry.level = atoi(row[3]); + entry.chance = atoi(row[4]); + entry.min_expansion = atoi(row[5]); + entry.max_expansion = atoi(row[6]); + entry.content_flags = row[7] ? row[7] : ""; + entry.content_flags_disabled = row[8] ? row[8] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FORAGE_REPOSITORY_H diff --git a/common/repositories/base/base_friends_repository.h b/common/repositories/base/base_friends_repository.h new file mode 100644 index 000000000..187994a85 --- /dev/null +++ b/common/repositories/base/base_friends_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_FRIENDS_REPOSITORY_H +#define EQEMU_BASE_FRIENDS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseFriendsRepository { +public: + struct Friends { + int charid; + int type; + std::string name; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "type", + "name", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("friends"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Friends NewEntity() + { + Friends entry{}; + + entry.charid = 0; + entry.type = 1; + entry.name = ""; + + return entry; + } + + static Friends GetFriendsEntry( + const std::vector &friendss, + int friends_id + ) + { + for (auto &friends : friendss) { + if (friends.charid == friends_id) { + return friends; + } + } + + return NewEntity(); + } + + static Friends FindOne( + Database& db, + int friends_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + friends_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Friends entry{}; + + entry.charid = atoi(row[0]); + entry.type = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int friends_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + friends_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Friends friends_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(friends_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(friends_entry.type)); + update_values.push_back(columns[2] + " = '" + EscapeString(friends_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + friends_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Friends InsertOne( + Database& db, + Friends friends_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(friends_entry.charid)); + insert_values.push_back(std::to_string(friends_entry.type)); + insert_values.push_back("'" + EscapeString(friends_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + friends_entry.charid = results.LastInsertedID(); + return friends_entry; + } + + friends_entry = NewEntity(); + + return friends_entry; + } + + static int InsertMany( + Database& db, + std::vector friends_entries + ) + { + std::vector insert_chunks; + + for (auto &friends_entry: friends_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(friends_entry.charid)); + insert_values.push_back(std::to_string(friends_entry.type)); + insert_values.push_back("'" + EscapeString(friends_entry.name) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Friends entry{}; + + entry.charid = atoi(row[0]); + entry.type = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Friends entry{}; + + entry.charid = atoi(row[0]); + entry.type = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_FRIENDS_REPOSITORY_H diff --git a/common/repositories/base/base_global_loot_repository.h b/common/repositories/base/base_global_loot_repository.h new file mode 100644 index 000000000..98170acf5 --- /dev/null +++ b/common/repositories/base/base_global_loot_repository.h @@ -0,0 +1,427 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GLOBAL_LOOT_REPOSITORY_H +#define EQEMU_BASE_GLOBAL_LOOT_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGlobalLootRepository { +public: + struct GlobalLoot { + int id; + std::string description; + int loottable_id; + int enabled; + int min_level; + int max_level; + int rare; + int raid; + std::string race; + std::string class; + std::string bodytype; + std::string zone; + int hot_zone; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "description", + "loottable_id", + "enabled", + "min_level", + "max_level", + "rare", + "raid", + "race", + "class", + "bodytype", + "zone", + "hot_zone", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("global_loot"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GlobalLoot NewEntity() + { + GlobalLoot entry{}; + + entry.id = 0; + entry.description = ""; + entry.loottable_id = 0; + entry.enabled = 1; + entry.min_level = 0; + entry.max_level = 0; + entry.rare = 0; + entry.raid = 0; + entry.race = ""; + entry.class = ""; + entry.bodytype = ""; + entry.zone = ""; + entry.hot_zone = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static GlobalLoot GetGlobalLootEntry( + const std::vector &global_loots, + int global_loot_id + ) + { + for (auto &global_loot : global_loots) { + if (global_loot.id == global_loot_id) { + return global_loot; + } + } + + return NewEntity(); + } + + static GlobalLoot FindOne( + Database& db, + int global_loot_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + global_loot_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GlobalLoot entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + entry.loottable_id = atoi(row[2]); + entry.enabled = atoi(row[3]); + entry.min_level = atoi(row[4]); + entry.max_level = atoi(row[5]); + entry.rare = atoi(row[6]); + entry.raid = atoi(row[7]); + entry.race = row[8] ? row[8] : ""; + entry.class = row[9] ? row[9] : ""; + entry.bodytype = row[10] ? row[10] : ""; + entry.zone = row[11] ? row[11] : ""; + entry.hot_zone = atoi(row[12]); + entry.min_expansion = atoi(row[13]); + entry.max_expansion = atoi(row[14]); + entry.content_flags = row[15] ? row[15] : ""; + entry.content_flags_disabled = row[16] ? row[16] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int global_loot_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + global_loot_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GlobalLoot global_loot_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(global_loot_entry.description) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(global_loot_entry.loottable_id)); + update_values.push_back(columns[3] + " = " + std::to_string(global_loot_entry.enabled)); + update_values.push_back(columns[4] + " = " + std::to_string(global_loot_entry.min_level)); + update_values.push_back(columns[5] + " = " + std::to_string(global_loot_entry.max_level)); + update_values.push_back(columns[6] + " = " + std::to_string(global_loot_entry.rare)); + update_values.push_back(columns[7] + " = " + std::to_string(global_loot_entry.raid)); + update_values.push_back(columns[8] + " = '" + EscapeString(global_loot_entry.race) + "'"); + update_values.push_back(columns[9] + " = '" + EscapeString(global_loot_entry.class) + "'"); + update_values.push_back(columns[10] + " = '" + EscapeString(global_loot_entry.bodytype) + "'"); + update_values.push_back(columns[11] + " = '" + EscapeString(global_loot_entry.zone) + "'"); + update_values.push_back(columns[12] + " = " + std::to_string(global_loot_entry.hot_zone)); + update_values.push_back(columns[13] + " = " + std::to_string(global_loot_entry.min_expansion)); + update_values.push_back(columns[14] + " = " + std::to_string(global_loot_entry.max_expansion)); + update_values.push_back(columns[15] + " = '" + EscapeString(global_loot_entry.content_flags) + "'"); + update_values.push_back(columns[16] + " = '" + EscapeString(global_loot_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + global_loot_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GlobalLoot InsertOne( + Database& db, + GlobalLoot global_loot_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(global_loot_entry.id)); + insert_values.push_back("'" + EscapeString(global_loot_entry.description) + "'"); + insert_values.push_back(std::to_string(global_loot_entry.loottable_id)); + insert_values.push_back(std::to_string(global_loot_entry.enabled)); + insert_values.push_back(std::to_string(global_loot_entry.min_level)); + insert_values.push_back(std::to_string(global_loot_entry.max_level)); + insert_values.push_back(std::to_string(global_loot_entry.rare)); + insert_values.push_back(std::to_string(global_loot_entry.raid)); + insert_values.push_back("'" + EscapeString(global_loot_entry.race) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.class) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.bodytype) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.zone) + "'"); + insert_values.push_back(std::to_string(global_loot_entry.hot_zone)); + insert_values.push_back(std::to_string(global_loot_entry.min_expansion)); + insert_values.push_back(std::to_string(global_loot_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(global_loot_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + global_loot_entry.id = results.LastInsertedID(); + return global_loot_entry; + } + + global_loot_entry = NewEntity(); + + return global_loot_entry; + } + + static int InsertMany( + Database& db, + std::vector global_loot_entries + ) + { + std::vector insert_chunks; + + for (auto &global_loot_entry: global_loot_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(global_loot_entry.id)); + insert_values.push_back("'" + EscapeString(global_loot_entry.description) + "'"); + insert_values.push_back(std::to_string(global_loot_entry.loottable_id)); + insert_values.push_back(std::to_string(global_loot_entry.enabled)); + insert_values.push_back(std::to_string(global_loot_entry.min_level)); + insert_values.push_back(std::to_string(global_loot_entry.max_level)); + insert_values.push_back(std::to_string(global_loot_entry.rare)); + insert_values.push_back(std::to_string(global_loot_entry.raid)); + insert_values.push_back("'" + EscapeString(global_loot_entry.race) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.class) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.bodytype) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.zone) + "'"); + insert_values.push_back(std::to_string(global_loot_entry.hot_zone)); + insert_values.push_back(std::to_string(global_loot_entry.min_expansion)); + insert_values.push_back(std::to_string(global_loot_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(global_loot_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(global_loot_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GlobalLoot entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + entry.loottable_id = atoi(row[2]); + entry.enabled = atoi(row[3]); + entry.min_level = atoi(row[4]); + entry.max_level = atoi(row[5]); + entry.rare = atoi(row[6]); + entry.raid = atoi(row[7]); + entry.race = row[8] ? row[8] : ""; + entry.class = row[9] ? row[9] : ""; + entry.bodytype = row[10] ? row[10] : ""; + entry.zone = row[11] ? row[11] : ""; + entry.hot_zone = atoi(row[12]); + entry.min_expansion = atoi(row[13]); + entry.max_expansion = atoi(row[14]); + entry.content_flags = row[15] ? row[15] : ""; + entry.content_flags_disabled = row[16] ? row[16] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GlobalLoot entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + entry.loottable_id = atoi(row[2]); + entry.enabled = atoi(row[3]); + entry.min_level = atoi(row[4]); + entry.max_level = atoi(row[5]); + entry.rare = atoi(row[6]); + entry.raid = atoi(row[7]); + entry.race = row[8] ? row[8] : ""; + entry.class = row[9] ? row[9] : ""; + entry.bodytype = row[10] ? row[10] : ""; + entry.zone = row[11] ? row[11] : ""; + entry.hot_zone = atoi(row[12]); + entry.min_expansion = atoi(row[13]); + entry.max_expansion = atoi(row[14]); + entry.content_flags = row[15] ? row[15] : ""; + entry.content_flags_disabled = row[16] ? row[16] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GLOBAL_LOOT_REPOSITORY_H diff --git a/common/repositories/base/base_gm_ips_repository.h b/common/repositories/base/base_gm_ips_repository.h new file mode 100644 index 000000000..56027c7a2 --- /dev/null +++ b/common/repositories/base/base_gm_ips_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GM_IPS_REPOSITORY_H +#define EQEMU_BASE_GM_IPS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGmIpsRepository { +public: + struct GmIps { + std::string name; + int account_id; + std::string ip_address; + }; + + static std::string PrimaryKey() + { + return std::string("account_id"); + } + + static std::vector Columns() + { + return { + "name", + "account_id", + "ip_address", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("gm_ips"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GmIps NewEntity() + { + GmIps entry{}; + + entry.name = ""; + entry.account_id = 0; + entry.ip_address = ""; + + return entry; + } + + static GmIps GetGmIpsEntry( + const std::vector &gm_ipss, + int gm_ips_id + ) + { + for (auto &gm_ips : gm_ipss) { + if (gm_ips.account_id == gm_ips_id) { + return gm_ips; + } + } + + return NewEntity(); + } + + static GmIps FindOne( + Database& db, + int gm_ips_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + gm_ips_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GmIps entry{}; + + entry.name = row[0] ? row[0] : ""; + entry.account_id = atoi(row[1]); + entry.ip_address = row[2] ? row[2] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int gm_ips_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + gm_ips_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GmIps gm_ips_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(gm_ips_entry.name) + "'"); + update_values.push_back(columns[1] + " = " + std::to_string(gm_ips_entry.account_id)); + update_values.push_back(columns[2] + " = '" + EscapeString(gm_ips_entry.ip_address) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + gm_ips_entry.account_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GmIps InsertOne( + Database& db, + GmIps gm_ips_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(gm_ips_entry.name) + "'"); + insert_values.push_back(std::to_string(gm_ips_entry.account_id)); + insert_values.push_back("'" + EscapeString(gm_ips_entry.ip_address) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + gm_ips_entry.account_id = results.LastInsertedID(); + return gm_ips_entry; + } + + gm_ips_entry = NewEntity(); + + return gm_ips_entry; + } + + static int InsertMany( + Database& db, + std::vector gm_ips_entries + ) + { + std::vector insert_chunks; + + for (auto &gm_ips_entry: gm_ips_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(gm_ips_entry.name) + "'"); + insert_values.push_back(std::to_string(gm_ips_entry.account_id)); + insert_values.push_back("'" + EscapeString(gm_ips_entry.ip_address) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GmIps entry{}; + + entry.name = row[0] ? row[0] : ""; + entry.account_id = atoi(row[1]); + entry.ip_address = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GmIps entry{}; + + entry.name = row[0] ? row[0] : ""; + entry.account_id = atoi(row[1]); + entry.ip_address = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GM_IPS_REPOSITORY_H diff --git a/common/repositories/base/base_goallists_repository.h b/common/repositories/base/base_goallists_repository.h new file mode 100644 index 000000000..c736d9e01 --- /dev/null +++ b/common/repositories/base/base_goallists_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GOALLISTS_REPOSITORY_H +#define EQEMU_BASE_GOALLISTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGoallistsRepository { +public: + struct Goallists { + int listid; + int entry; + }; + + static std::string PrimaryKey() + { + return std::string("listid"); + } + + static std::vector Columns() + { + return { + "listid", + "entry", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("goallists"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Goallists NewEntity() + { + Goallists entry{}; + + entry.listid = 0; + entry.entry = 0; + + return entry; + } + + static Goallists GetGoallistsEntry( + const std::vector &goallistss, + int goallists_id + ) + { + for (auto &goallists : goallistss) { + if (goallists.listid == goallists_id) { + return goallists; + } + } + + return NewEntity(); + } + + static Goallists FindOne( + Database& db, + int goallists_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + goallists_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Goallists entry{}; + + entry.listid = atoi(row[0]); + entry.entry = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int goallists_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + goallists_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Goallists goallists_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(goallists_entry.listid)); + update_values.push_back(columns[1] + " = " + std::to_string(goallists_entry.entry)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + goallists_entry.listid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Goallists InsertOne( + Database& db, + Goallists goallists_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(goallists_entry.listid)); + insert_values.push_back(std::to_string(goallists_entry.entry)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + goallists_entry.listid = results.LastInsertedID(); + return goallists_entry; + } + + goallists_entry = NewEntity(); + + return goallists_entry; + } + + static int InsertMany( + Database& db, + std::vector goallists_entries + ) + { + std::vector insert_chunks; + + for (auto &goallists_entry: goallists_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(goallists_entry.listid)); + insert_values.push_back(std::to_string(goallists_entry.entry)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Goallists entry{}; + + entry.listid = atoi(row[0]); + entry.entry = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Goallists entry{}; + + entry.listid = atoi(row[0]); + entry.entry = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GOALLISTS_REPOSITORY_H diff --git a/common/repositories/base/base_graveyard_repository.h b/common/repositories/base/base_graveyard_repository.h new file mode 100644 index 000000000..500775a94 --- /dev/null +++ b/common/repositories/base/base_graveyard_repository.h @@ -0,0 +1,328 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GRAVEYARD_REPOSITORY_H +#define EQEMU_BASE_GRAVEYARD_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGraveyardRepository { +public: + struct Graveyard { + int id; + int zone_id; + float x; + float y; + float z; + float heading; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone_id", + "x", + "y", + "z", + "heading", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("graveyard"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Graveyard NewEntity() + { + Graveyard entry{}; + + entry.id = 0; + entry.zone_id = 0; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.heading = 0; + + return entry; + } + + static Graveyard GetGraveyardEntry( + const std::vector &graveyards, + int graveyard_id + ) + { + for (auto &graveyard : graveyards) { + if (graveyard.id == graveyard_id) { + return graveyard; + } + } + + return NewEntity(); + } + + static Graveyard FindOne( + Database& db, + int graveyard_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + graveyard_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Graveyard entry{}; + + entry.id = atoi(row[0]); + entry.zone_id = atoi(row[1]); + entry.x = static_cast(atof(row[2])); + entry.y = static_cast(atof(row[3])); + entry.z = static_cast(atof(row[4])); + entry.heading = static_cast(atof(row[5])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int graveyard_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + graveyard_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Graveyard graveyard_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(graveyard_entry.zone_id)); + update_values.push_back(columns[2] + " = " + std::to_string(graveyard_entry.x)); + update_values.push_back(columns[3] + " = " + std::to_string(graveyard_entry.y)); + update_values.push_back(columns[4] + " = " + std::to_string(graveyard_entry.z)); + update_values.push_back(columns[5] + " = " + std::to_string(graveyard_entry.heading)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + graveyard_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Graveyard InsertOne( + Database& db, + Graveyard graveyard_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(graveyard_entry.id)); + insert_values.push_back(std::to_string(graveyard_entry.zone_id)); + insert_values.push_back(std::to_string(graveyard_entry.x)); + insert_values.push_back(std::to_string(graveyard_entry.y)); + insert_values.push_back(std::to_string(graveyard_entry.z)); + insert_values.push_back(std::to_string(graveyard_entry.heading)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + graveyard_entry.id = results.LastInsertedID(); + return graveyard_entry; + } + + graveyard_entry = NewEntity(); + + return graveyard_entry; + } + + static int InsertMany( + Database& db, + std::vector graveyard_entries + ) + { + std::vector insert_chunks; + + for (auto &graveyard_entry: graveyard_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(graveyard_entry.id)); + insert_values.push_back(std::to_string(graveyard_entry.zone_id)); + insert_values.push_back(std::to_string(graveyard_entry.x)); + insert_values.push_back(std::to_string(graveyard_entry.y)); + insert_values.push_back(std::to_string(graveyard_entry.z)); + insert_values.push_back(std::to_string(graveyard_entry.heading)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Graveyard entry{}; + + entry.id = atoi(row[0]); + entry.zone_id = atoi(row[1]); + entry.x = static_cast(atof(row[2])); + entry.y = static_cast(atof(row[3])); + entry.z = static_cast(atof(row[4])); + entry.heading = static_cast(atof(row[5])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Graveyard entry{}; + + entry.id = atoi(row[0]); + entry.zone_id = atoi(row[1]); + entry.x = static_cast(atof(row[2])); + entry.y = static_cast(atof(row[3])); + entry.z = static_cast(atof(row[4])); + entry.heading = static_cast(atof(row[5])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GRAVEYARD_REPOSITORY_H diff --git a/common/repositories/base/base_grid_entries_repository.h b/common/repositories/base/base_grid_entries_repository.h new file mode 100644 index 000000000..6b0f3fcd2 --- /dev/null +++ b/common/repositories/base/base_grid_entries_repository.h @@ -0,0 +1,363 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + */ + +/** + * This repository was automatically generated on Apr 5, 2020 and is NOT + * to be modified directly. Any repository modifications are meant to be made to + * the repository extending the base. Any modifications to base repositories are to + * be made by the generator only + */ + +#ifndef EQEMU_BASE_GRID_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_GRID_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGridEntriesRepository { +public: + struct GridEntries { + int gridid; + int zoneid; + int number; + float x; + float y; + float z; + float heading; + int pause; + int8 centerpoint; + }; + + static std::string PrimaryKey() + { + return std::string("number"); + } + + static std::vector Columns() + { + return { + "gridid", + "zoneid", + "number", + "x", + "y", + "z", + "heading", + "pause", + "centerpoint", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("grid_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static GridEntries NewEntity() + { + GridEntries entry{}; + + entry.gridid = 0; + entry.zoneid = 0; + entry.number = 0; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.heading = 0; + entry.pause = 0; + entry.centerpoint = 0; + + return entry; + } + + static GridEntries GetGridEntriesEntry( + const std::vector &grid_entriess, + int grid_entries_id + ) + { + for (auto &grid_entries : grid_entriess) { + if (grid_entries.number == grid_entries_id) { + return grid_entries; + } + } + + return NewEntity(); + } + + static GridEntries FindOne( + int grid_entries_id + ) + { + auto results = content_db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + grid_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GridEntries entry{}; + + entry.gridid = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.number = atoi(row[2]); + entry.x = atof(row[3]); + entry.y = atof(row[4]); + entry.z = atof(row[5]); + entry.heading = atof(row[6]); + entry.pause = atoi(row[7]); + entry.centerpoint = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int grid_entries_id + ) + { + auto results = content_db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + grid_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + GridEntries grid_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[3] + " = " + std::to_string(grid_entries_entry.x)); + update_values.push_back(columns[4] + " = " + std::to_string(grid_entries_entry.y)); + update_values.push_back(columns[5] + " = " + std::to_string(grid_entries_entry.z)); + update_values.push_back(columns[6] + " = " + std::to_string(grid_entries_entry.heading)); + update_values.push_back(columns[7] + " = " + std::to_string(grid_entries_entry.pause)); + update_values.push_back(columns[8] + " = " + std::to_string(grid_entries_entry.centerpoint)); + + auto results = content_db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + grid_entries_entry.number + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GridEntries InsertOne( + GridEntries grid_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(grid_entries_entry.x)); + insert_values.push_back(std::to_string(grid_entries_entry.y)); + insert_values.push_back(std::to_string(grid_entries_entry.z)); + insert_values.push_back(std::to_string(grid_entries_entry.heading)); + insert_values.push_back(std::to_string(grid_entries_entry.pause)); + insert_values.push_back(std::to_string(grid_entries_entry.centerpoint)); + + auto results = content_db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + grid_entries_entry.id = results.LastInsertedID(); + return grid_entries_entry; + } + + grid_entries_entry = NewEntity(); + + return grid_entries_entry; + } + + static int InsertMany( + std::vector grid_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &grid_entries_entry: grid_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(grid_entries_entry.x)); + insert_values.push_back(std::to_string(grid_entries_entry.y)); + insert_values.push_back(std::to_string(grid_entries_entry.z)); + insert_values.push_back(std::to_string(grid_entries_entry.heading)); + insert_values.push_back(std::to_string(grid_entries_entry.pause)); + insert_values.push_back(std::to_string(grid_entries_entry.centerpoint)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = content_db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = content_db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GridEntries entry{}; + + entry.gridid = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.number = atoi(row[2]); + entry.x = atof(row[3]); + entry.y = atof(row[4]); + entry.z = atof(row[5]); + entry.heading = atof(row[6]); + entry.pause = atoi(row[7]); + entry.centerpoint = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(std::string where_filter) + { + std::vector all_entries; + + auto results = content_db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GridEntries entry{}; + + entry.gridid = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.number = atoi(row[2]); + entry.x = atof(row[3]); + entry.y = atof(row[4]); + entry.z = atof(row[5]); + entry.heading = atof(row[6]); + entry.pause = atoi(row[7]); + entry.centerpoint = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(std::string where_filter) + { + auto results = content_db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + PrimaryKey(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GRID_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_grid_repository.h b/common/repositories/base/base_grid_repository.h new file mode 100644 index 000000000..be0574fc0 --- /dev/null +++ b/common/repositories/base/base_grid_repository.h @@ -0,0 +1,326 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + */ + +/** + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to + * the repository extending the base. Any modifications to base repositories are to + * be made by the generator only + */ + +#ifndef EQEMU_BASE_GRID_REPOSITORY_H +#define EQEMU_BASE_GRID_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGridRepository { +public: + struct Grid { + int id; + int zoneid; + int type; + int type2; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zoneid", + "type", + "type2", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("grid"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static Grid NewEntity() + { + Grid entry{}; + + entry.id = 0; + entry.zoneid = 0; + entry.type = 0; + entry.type2 = 0; + + return entry; + } + + static Grid GetGridEntry( + const std::vector &grids, + int grid_id + ) + { + for (auto &grid : grids) { + if (grid.id == grid_id) { + return grid; + } + } + + return NewEntity(); + } + + static Grid FindOne( + int grid_id + ) + { + auto results = content_db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + grid_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Grid entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.type = atoi(row[2]); + entry.type2 = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int grid_id + ) + { + auto results = content_db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + grid_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Grid grid_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(grid_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(grid_entry.zoneid)); + update_values.push_back(columns[2] + " = " + std::to_string(grid_entry.type)); + update_values.push_back(columns[3] + " = " + std::to_string(grid_entry.type2)); + + auto results = content_db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + grid_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Grid InsertOne( + Grid grid_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(grid_entry.id)); + insert_values.push_back(std::to_string(grid_entry.zoneid)); + insert_values.push_back(std::to_string(grid_entry.type)); + insert_values.push_back(std::to_string(grid_entry.type2)); + + auto results = content_db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + grid_entry.id = results.LastInsertedID(); + return grid_entry; + } + + grid_entry = NewEntity(); + + return grid_entry; + } + + static int InsertMany( + std::vector grid_entries + ) + { + std::vector insert_chunks; + + for (auto &grid_entry: grid_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(grid_entry.id)); + insert_values.push_back(std::to_string(grid_entry.zoneid)); + insert_values.push_back(std::to_string(grid_entry.type)); + insert_values.push_back(std::to_string(grid_entry.type2)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = content_db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = content_db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Grid entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.type = atoi(row[2]); + entry.type2 = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(std::string where_filter) + { + std::vector all_entries; + + auto results = content_db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Grid entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.type = atoi(row[2]); + entry.type2 = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(std::string where_filter) + { + auto results = content_db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GRID_REPOSITORY_H diff --git a/common/repositories/base/base_ground_spawns_repository.h b/common/repositories/base/base_ground_spawns_repository.h new file mode 100644 index 000000000..6b2a0d5cc --- /dev/null +++ b/common/repositories/base/base_ground_spawns_repository.h @@ -0,0 +1,436 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GROUND_SPAWNS_REPOSITORY_H +#define EQEMU_BASE_GROUND_SPAWNS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGroundSpawnsRepository { +public: + struct GroundSpawns { + int id; + int zoneid; + int version; + float max_x; + float max_y; + float max_z; + float min_x; + float min_y; + float heading; + std::string name; + int item; + int max_allowed; + std::string comment; + int respawn_timer; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zoneid", + "version", + "max_x", + "max_y", + "max_z", + "min_x", + "min_y", + "heading", + "name", + "item", + "max_allowed", + "comment", + "respawn_timer", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("ground_spawns"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GroundSpawns NewEntity() + { + GroundSpawns entry{}; + + entry.id = 0; + entry.zoneid = 0; + entry.version = 0; + entry.max_x = 2000; + entry.max_y = 2000; + entry.max_z = 10000; + entry.min_x = -2000; + entry.min_y = -2000; + entry.heading = 0; + entry.name = ""; + entry.item = 0; + entry.max_allowed = 1; + entry.comment = ""; + entry.respawn_timer = 300; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static GroundSpawns GetGroundSpawnsEntry( + const std::vector &ground_spawnss, + int ground_spawns_id + ) + { + for (auto &ground_spawns : ground_spawnss) { + if (ground_spawns.id == ground_spawns_id) { + return ground_spawns; + } + } + + return NewEntity(); + } + + static GroundSpawns FindOne( + Database& db, + int ground_spawns_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + ground_spawns_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GroundSpawns entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.version = atoi(row[2]); + entry.max_x = static_cast(atof(row[3])); + entry.max_y = static_cast(atof(row[4])); + entry.max_z = static_cast(atof(row[5])); + entry.min_x = static_cast(atof(row[6])); + entry.min_y = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.name = row[9] ? row[9] : ""; + entry.item = atoi(row[10]); + entry.max_allowed = atoi(row[11]); + entry.comment = row[12] ? row[12] : ""; + entry.respawn_timer = atoi(row[13]); + entry.min_expansion = atoi(row[14]); + entry.max_expansion = atoi(row[15]); + entry.content_flags = row[16] ? row[16] : ""; + entry.content_flags_disabled = row[17] ? row[17] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int ground_spawns_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + ground_spawns_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GroundSpawns ground_spawns_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(ground_spawns_entry.zoneid)); + update_values.push_back(columns[2] + " = " + std::to_string(ground_spawns_entry.version)); + update_values.push_back(columns[3] + " = " + std::to_string(ground_spawns_entry.max_x)); + update_values.push_back(columns[4] + " = " + std::to_string(ground_spawns_entry.max_y)); + update_values.push_back(columns[5] + " = " + std::to_string(ground_spawns_entry.max_z)); + update_values.push_back(columns[6] + " = " + std::to_string(ground_spawns_entry.min_x)); + update_values.push_back(columns[7] + " = " + std::to_string(ground_spawns_entry.min_y)); + update_values.push_back(columns[8] + " = " + std::to_string(ground_spawns_entry.heading)); + update_values.push_back(columns[9] + " = '" + EscapeString(ground_spawns_entry.name) + "'"); + update_values.push_back(columns[10] + " = " + std::to_string(ground_spawns_entry.item)); + update_values.push_back(columns[11] + " = " + std::to_string(ground_spawns_entry.max_allowed)); + update_values.push_back(columns[12] + " = '" + EscapeString(ground_spawns_entry.comment) + "'"); + update_values.push_back(columns[13] + " = " + std::to_string(ground_spawns_entry.respawn_timer)); + update_values.push_back(columns[14] + " = " + std::to_string(ground_spawns_entry.min_expansion)); + update_values.push_back(columns[15] + " = " + std::to_string(ground_spawns_entry.max_expansion)); + update_values.push_back(columns[16] + " = '" + EscapeString(ground_spawns_entry.content_flags) + "'"); + update_values.push_back(columns[17] + " = '" + EscapeString(ground_spawns_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + ground_spawns_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GroundSpawns InsertOne( + Database& db, + GroundSpawns ground_spawns_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(ground_spawns_entry.id)); + insert_values.push_back(std::to_string(ground_spawns_entry.zoneid)); + insert_values.push_back(std::to_string(ground_spawns_entry.version)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_x)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_y)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_z)); + insert_values.push_back(std::to_string(ground_spawns_entry.min_x)); + insert_values.push_back(std::to_string(ground_spawns_entry.min_y)); + insert_values.push_back(std::to_string(ground_spawns_entry.heading)); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.name) + "'"); + insert_values.push_back(std::to_string(ground_spawns_entry.item)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_allowed)); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.comment) + "'"); + insert_values.push_back(std::to_string(ground_spawns_entry.respawn_timer)); + insert_values.push_back(std::to_string(ground_spawns_entry.min_expansion)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + ground_spawns_entry.id = results.LastInsertedID(); + return ground_spawns_entry; + } + + ground_spawns_entry = NewEntity(); + + return ground_spawns_entry; + } + + static int InsertMany( + Database& db, + std::vector ground_spawns_entries + ) + { + std::vector insert_chunks; + + for (auto &ground_spawns_entry: ground_spawns_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(ground_spawns_entry.id)); + insert_values.push_back(std::to_string(ground_spawns_entry.zoneid)); + insert_values.push_back(std::to_string(ground_spawns_entry.version)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_x)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_y)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_z)); + insert_values.push_back(std::to_string(ground_spawns_entry.min_x)); + insert_values.push_back(std::to_string(ground_spawns_entry.min_y)); + insert_values.push_back(std::to_string(ground_spawns_entry.heading)); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.name) + "'"); + insert_values.push_back(std::to_string(ground_spawns_entry.item)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_allowed)); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.comment) + "'"); + insert_values.push_back(std::to_string(ground_spawns_entry.respawn_timer)); + insert_values.push_back(std::to_string(ground_spawns_entry.min_expansion)); + insert_values.push_back(std::to_string(ground_spawns_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(ground_spawns_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GroundSpawns entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.version = atoi(row[2]); + entry.max_x = static_cast(atof(row[3])); + entry.max_y = static_cast(atof(row[4])); + entry.max_z = static_cast(atof(row[5])); + entry.min_x = static_cast(atof(row[6])); + entry.min_y = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.name = row[9] ? row[9] : ""; + entry.item = atoi(row[10]); + entry.max_allowed = atoi(row[11]); + entry.comment = row[12] ? row[12] : ""; + entry.respawn_timer = atoi(row[13]); + entry.min_expansion = atoi(row[14]); + entry.max_expansion = atoi(row[15]); + entry.content_flags = row[16] ? row[16] : ""; + entry.content_flags_disabled = row[17] ? row[17] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GroundSpawns entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.version = atoi(row[2]); + entry.max_x = static_cast(atof(row[3])); + entry.max_y = static_cast(atof(row[4])); + entry.max_z = static_cast(atof(row[5])); + entry.min_x = static_cast(atof(row[6])); + entry.min_y = static_cast(atof(row[7])); + entry.heading = static_cast(atof(row[8])); + entry.name = row[9] ? row[9] : ""; + entry.item = atoi(row[10]); + entry.max_allowed = atoi(row[11]); + entry.comment = row[12] ? row[12] : ""; + entry.respawn_timer = atoi(row[13]); + entry.min_expansion = atoi(row[14]); + entry.max_expansion = atoi(row[15]); + entry.content_flags = row[16] ? row[16] : ""; + entry.content_flags_disabled = row[17] ? row[17] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GROUND_SPAWNS_REPOSITORY_H diff --git a/common/repositories/base/base_group_id_repository.h b/common/repositories/base/base_group_id_repository.h new file mode 100644 index 000000000..8005f003e --- /dev/null +++ b/common/repositories/base/base_group_id_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GROUP_ID_REPOSITORY_H +#define EQEMU_BASE_GROUP_ID_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGroupIdRepository { +public: + struct GroupId { + int groupid; + int charid; + std::string name; + int ismerc; + }; + + static std::string PrimaryKey() + { + return std::string("groupid"); + } + + static std::vector Columns() + { + return { + "groupid", + "charid", + "name", + "ismerc", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("group_id"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GroupId NewEntity() + { + GroupId entry{}; + + entry.groupid = 0; + entry.charid = 0; + entry.name = ""; + entry.ismerc = 0; + + return entry; + } + + static GroupId GetGroupIdEntry( + const std::vector &group_ids, + int group_id_id + ) + { + for (auto &group_id : group_ids) { + if (group_id.groupid == group_id_id) { + return group_id; + } + } + + return NewEntity(); + } + + static GroupId FindOne( + Database& db, + int group_id_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + group_id_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GroupId entry{}; + + entry.groupid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.ismerc = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int group_id_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + group_id_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GroupId group_id_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(group_id_entry.groupid)); + update_values.push_back(columns[1] + " = " + std::to_string(group_id_entry.charid)); + update_values.push_back(columns[2] + " = '" + EscapeString(group_id_entry.name) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(group_id_entry.ismerc)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + group_id_entry.groupid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GroupId InsertOne( + Database& db, + GroupId group_id_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(group_id_entry.groupid)); + insert_values.push_back(std::to_string(group_id_entry.charid)); + insert_values.push_back("'" + EscapeString(group_id_entry.name) + "'"); + insert_values.push_back(std::to_string(group_id_entry.ismerc)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + group_id_entry.groupid = results.LastInsertedID(); + return group_id_entry; + } + + group_id_entry = NewEntity(); + + return group_id_entry; + } + + static int InsertMany( + Database& db, + std::vector group_id_entries + ) + { + std::vector insert_chunks; + + for (auto &group_id_entry: group_id_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(group_id_entry.groupid)); + insert_values.push_back(std::to_string(group_id_entry.charid)); + insert_values.push_back("'" + EscapeString(group_id_entry.name) + "'"); + insert_values.push_back(std::to_string(group_id_entry.ismerc)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GroupId entry{}; + + entry.groupid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.ismerc = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GroupId entry{}; + + entry.groupid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.ismerc = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GROUP_ID_REPOSITORY_H diff --git a/common/repositories/base/base_group_leaders_repository.h b/common/repositories/base/base_group_leaders_repository.h new file mode 100644 index 000000000..97e7028cd --- /dev/null +++ b/common/repositories/base/base_group_leaders_repository.h @@ -0,0 +1,356 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GROUP_LEADERS_REPOSITORY_H +#define EQEMU_BASE_GROUP_LEADERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGroupLeadersRepository { +public: + struct GroupLeaders { + int gid; + std::string leadername; + std::string marknpc; + std::string leadershipaa; + std::string maintank; + std::string assist; + std::string puller; + std::string mentoree; + int mentor_percent; + }; + + static std::string PrimaryKey() + { + return std::string("gid"); + } + + static std::vector Columns() + { + return { + "gid", + "leadername", + "marknpc", + "leadershipaa", + "maintank", + "assist", + "puller", + "mentoree", + "mentor_percent", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("group_leaders"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GroupLeaders NewEntity() + { + GroupLeaders entry{}; + + entry.gid = 0; + entry.leadername = ""; + entry.marknpc = ""; + entry.leadershipaa = 0; + entry.maintank = ""; + entry.assist = ""; + entry.puller = ""; + entry.mentoree = ""; + entry.mentor_percent = 0; + + return entry; + } + + static GroupLeaders GetGroupLeadersEntry( + const std::vector &group_leaderss, + int group_leaders_id + ) + { + for (auto &group_leaders : group_leaderss) { + if (group_leaders.gid == group_leaders_id) { + return group_leaders; + } + } + + return NewEntity(); + } + + static GroupLeaders FindOne( + Database& db, + int group_leaders_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + group_leaders_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GroupLeaders entry{}; + + entry.gid = atoi(row[0]); + entry.leadername = row[1] ? row[1] : ""; + entry.marknpc = row[2] ? row[2] : ""; + entry.leadershipaa = row[3] ? row[3] : ""; + entry.maintank = row[4] ? row[4] : ""; + entry.assist = row[5] ? row[5] : ""; + entry.puller = row[6] ? row[6] : ""; + entry.mentoree = row[7] ? row[7] : ""; + entry.mentor_percent = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int group_leaders_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + group_leaders_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GroupLeaders group_leaders_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(group_leaders_entry.gid)); + update_values.push_back(columns[1] + " = '" + EscapeString(group_leaders_entry.leadername) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(group_leaders_entry.marknpc) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(group_leaders_entry.leadershipaa) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(group_leaders_entry.maintank) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(group_leaders_entry.assist) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(group_leaders_entry.puller) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(group_leaders_entry.mentoree) + "'"); + update_values.push_back(columns[8] + " = " + std::to_string(group_leaders_entry.mentor_percent)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + group_leaders_entry.gid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GroupLeaders InsertOne( + Database& db, + GroupLeaders group_leaders_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(group_leaders_entry.gid)); + insert_values.push_back("'" + EscapeString(group_leaders_entry.leadername) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.marknpc) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.leadershipaa) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.maintank) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.assist) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.puller) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.mentoree) + "'"); + insert_values.push_back(std::to_string(group_leaders_entry.mentor_percent)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + group_leaders_entry.gid = results.LastInsertedID(); + return group_leaders_entry; + } + + group_leaders_entry = NewEntity(); + + return group_leaders_entry; + } + + static int InsertMany( + Database& db, + std::vector group_leaders_entries + ) + { + std::vector insert_chunks; + + for (auto &group_leaders_entry: group_leaders_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(group_leaders_entry.gid)); + insert_values.push_back("'" + EscapeString(group_leaders_entry.leadername) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.marknpc) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.leadershipaa) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.maintank) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.assist) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.puller) + "'"); + insert_values.push_back("'" + EscapeString(group_leaders_entry.mentoree) + "'"); + insert_values.push_back(std::to_string(group_leaders_entry.mentor_percent)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GroupLeaders entry{}; + + entry.gid = atoi(row[0]); + entry.leadername = row[1] ? row[1] : ""; + entry.marknpc = row[2] ? row[2] : ""; + entry.leadershipaa = row[3] ? row[3] : ""; + entry.maintank = row[4] ? row[4] : ""; + entry.assist = row[5] ? row[5] : ""; + entry.puller = row[6] ? row[6] : ""; + entry.mentoree = row[7] ? row[7] : ""; + entry.mentor_percent = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GroupLeaders entry{}; + + entry.gid = atoi(row[0]); + entry.leadername = row[1] ? row[1] : ""; + entry.marknpc = row[2] ? row[2] : ""; + entry.leadershipaa = row[3] ? row[3] : ""; + entry.maintank = row[4] ? row[4] : ""; + entry.assist = row[5] ? row[5] : ""; + entry.puller = row[6] ? row[6] : ""; + entry.mentoree = row[7] ? row[7] : ""; + entry.mentor_percent = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GROUP_LEADERS_REPOSITORY_H diff --git a/common/repositories/base/base_guild_members_repository.h b/common/repositories/base/base_guild_members_repository.h new file mode 100644 index 000000000..931d0bdf6 --- /dev/null +++ b/common/repositories/base/base_guild_members_repository.h @@ -0,0 +1,356 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GUILD_MEMBERS_REPOSITORY_H +#define EQEMU_BASE_GUILD_MEMBERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGuildMembersRepository { +public: + struct GuildMembers { + int char_id; + int guild_id; + int rank; + int tribute_enable; + int total_tribute; + int last_tribute; + int banker; + std::string public_note; + int alt; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "guild_id", + "rank", + "tribute_enable", + "total_tribute", + "last_tribute", + "banker", + "public_note", + "alt", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("guild_members"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GuildMembers NewEntity() + { + GuildMembers entry{}; + + entry.char_id = 0; + entry.guild_id = 0; + entry.rank = 0; + entry.tribute_enable = 0; + entry.total_tribute = 0; + entry.last_tribute = 0; + entry.banker = 0; + entry.public_note = ""; + entry.alt = 0; + + return entry; + } + + static GuildMembers GetGuildMembersEntry( + const std::vector &guild_memberss, + int guild_members_id + ) + { + for (auto &guild_members : guild_memberss) { + if (guild_members.char_id == guild_members_id) { + return guild_members; + } + } + + return NewEntity(); + } + + static GuildMembers FindOne( + Database& db, + int guild_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + guild_members_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GuildMembers entry{}; + + entry.char_id = atoi(row[0]); + entry.guild_id = atoi(row[1]); + entry.rank = atoi(row[2]); + entry.tribute_enable = atoi(row[3]); + entry.total_tribute = atoi(row[4]); + entry.last_tribute = atoi(row[5]); + entry.banker = atoi(row[6]); + entry.public_note = row[7] ? row[7] : ""; + entry.alt = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int guild_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + guild_members_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GuildMembers guild_members_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(guild_members_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(guild_members_entry.guild_id)); + update_values.push_back(columns[2] + " = " + std::to_string(guild_members_entry.rank)); + update_values.push_back(columns[3] + " = " + std::to_string(guild_members_entry.tribute_enable)); + update_values.push_back(columns[4] + " = " + std::to_string(guild_members_entry.total_tribute)); + update_values.push_back(columns[5] + " = " + std::to_string(guild_members_entry.last_tribute)); + update_values.push_back(columns[6] + " = " + std::to_string(guild_members_entry.banker)); + update_values.push_back(columns[7] + " = '" + EscapeString(guild_members_entry.public_note) + "'"); + update_values.push_back(columns[8] + " = " + std::to_string(guild_members_entry.alt)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + guild_members_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GuildMembers InsertOne( + Database& db, + GuildMembers guild_members_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_members_entry.char_id)); + insert_values.push_back(std::to_string(guild_members_entry.guild_id)); + insert_values.push_back(std::to_string(guild_members_entry.rank)); + insert_values.push_back(std::to_string(guild_members_entry.tribute_enable)); + insert_values.push_back(std::to_string(guild_members_entry.total_tribute)); + insert_values.push_back(std::to_string(guild_members_entry.last_tribute)); + insert_values.push_back(std::to_string(guild_members_entry.banker)); + insert_values.push_back("'" + EscapeString(guild_members_entry.public_note) + "'"); + insert_values.push_back(std::to_string(guild_members_entry.alt)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + guild_members_entry.char_id = results.LastInsertedID(); + return guild_members_entry; + } + + guild_members_entry = NewEntity(); + + return guild_members_entry; + } + + static int InsertMany( + Database& db, + std::vector guild_members_entries + ) + { + std::vector insert_chunks; + + for (auto &guild_members_entry: guild_members_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_members_entry.char_id)); + insert_values.push_back(std::to_string(guild_members_entry.guild_id)); + insert_values.push_back(std::to_string(guild_members_entry.rank)); + insert_values.push_back(std::to_string(guild_members_entry.tribute_enable)); + insert_values.push_back(std::to_string(guild_members_entry.total_tribute)); + insert_values.push_back(std::to_string(guild_members_entry.last_tribute)); + insert_values.push_back(std::to_string(guild_members_entry.banker)); + insert_values.push_back("'" + EscapeString(guild_members_entry.public_note) + "'"); + insert_values.push_back(std::to_string(guild_members_entry.alt)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildMembers entry{}; + + entry.char_id = atoi(row[0]); + entry.guild_id = atoi(row[1]); + entry.rank = atoi(row[2]); + entry.tribute_enable = atoi(row[3]); + entry.total_tribute = atoi(row[4]); + entry.last_tribute = atoi(row[5]); + entry.banker = atoi(row[6]); + entry.public_note = row[7] ? row[7] : ""; + entry.alt = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildMembers entry{}; + + entry.char_id = atoi(row[0]); + entry.guild_id = atoi(row[1]); + entry.rank = atoi(row[2]); + entry.tribute_enable = atoi(row[3]); + entry.total_tribute = atoi(row[4]); + entry.last_tribute = atoi(row[5]); + entry.banker = atoi(row[6]); + entry.public_note = row[7] ? row[7] : ""; + entry.alt = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GUILD_MEMBERS_REPOSITORY_H diff --git a/common/repositories/base/base_guild_ranks_repository.h b/common/repositories/base/base_guild_ranks_repository.h new file mode 100644 index 000000000..b608cfaa5 --- /dev/null +++ b/common/repositories/base/base_guild_ranks_repository.h @@ -0,0 +1,374 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GUILD_RANKS_REPOSITORY_H +#define EQEMU_BASE_GUILD_RANKS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGuildRanksRepository { +public: + struct GuildRanks { + int guild_id; + int rank; + std::string title; + int can_hear; + int can_speak; + int can_invite; + int can_remove; + int can_promote; + int can_demote; + int can_motd; + int can_warpeace; + }; + + static std::string PrimaryKey() + { + return std::string("guild_id"); + } + + static std::vector Columns() + { + return { + "guild_id", + "rank", + "title", + "can_hear", + "can_speak", + "can_invite", + "can_remove", + "can_promote", + "can_demote", + "can_motd", + "can_warpeace", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("guild_ranks"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GuildRanks NewEntity() + { + GuildRanks entry{}; + + entry.guild_id = 0; + entry.rank = 0; + entry.title = ""; + entry.can_hear = 0; + entry.can_speak = 0; + entry.can_invite = 0; + entry.can_remove = 0; + entry.can_promote = 0; + entry.can_demote = 0; + entry.can_motd = 0; + entry.can_warpeace = 0; + + return entry; + } + + static GuildRanks GetGuildRanksEntry( + const std::vector &guild_rankss, + int guild_ranks_id + ) + { + for (auto &guild_ranks : guild_rankss) { + if (guild_ranks.guild_id == guild_ranks_id) { + return guild_ranks; + } + } + + return NewEntity(); + } + + static GuildRanks FindOne( + Database& db, + int guild_ranks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + guild_ranks_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GuildRanks entry{}; + + entry.guild_id = atoi(row[0]); + entry.rank = atoi(row[1]); + entry.title = row[2] ? row[2] : ""; + entry.can_hear = atoi(row[3]); + entry.can_speak = atoi(row[4]); + entry.can_invite = atoi(row[5]); + entry.can_remove = atoi(row[6]); + entry.can_promote = atoi(row[7]); + entry.can_demote = atoi(row[8]); + entry.can_motd = atoi(row[9]); + entry.can_warpeace = atoi(row[10]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int guild_ranks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + guild_ranks_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GuildRanks guild_ranks_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(guild_ranks_entry.guild_id)); + update_values.push_back(columns[1] + " = " + std::to_string(guild_ranks_entry.rank)); + update_values.push_back(columns[2] + " = '" + EscapeString(guild_ranks_entry.title) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(guild_ranks_entry.can_hear)); + update_values.push_back(columns[4] + " = " + std::to_string(guild_ranks_entry.can_speak)); + update_values.push_back(columns[5] + " = " + std::to_string(guild_ranks_entry.can_invite)); + update_values.push_back(columns[6] + " = " + std::to_string(guild_ranks_entry.can_remove)); + update_values.push_back(columns[7] + " = " + std::to_string(guild_ranks_entry.can_promote)); + update_values.push_back(columns[8] + " = " + std::to_string(guild_ranks_entry.can_demote)); + update_values.push_back(columns[9] + " = " + std::to_string(guild_ranks_entry.can_motd)); + update_values.push_back(columns[10] + " = " + std::to_string(guild_ranks_entry.can_warpeace)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + guild_ranks_entry.guild_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GuildRanks InsertOne( + Database& db, + GuildRanks guild_ranks_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_ranks_entry.guild_id)); + insert_values.push_back(std::to_string(guild_ranks_entry.rank)); + insert_values.push_back("'" + EscapeString(guild_ranks_entry.title) + "'"); + insert_values.push_back(std::to_string(guild_ranks_entry.can_hear)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_speak)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_invite)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_remove)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_promote)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_demote)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_motd)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_warpeace)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + guild_ranks_entry.guild_id = results.LastInsertedID(); + return guild_ranks_entry; + } + + guild_ranks_entry = NewEntity(); + + return guild_ranks_entry; + } + + static int InsertMany( + Database& db, + std::vector guild_ranks_entries + ) + { + std::vector insert_chunks; + + for (auto &guild_ranks_entry: guild_ranks_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_ranks_entry.guild_id)); + insert_values.push_back(std::to_string(guild_ranks_entry.rank)); + insert_values.push_back("'" + EscapeString(guild_ranks_entry.title) + "'"); + insert_values.push_back(std::to_string(guild_ranks_entry.can_hear)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_speak)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_invite)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_remove)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_promote)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_demote)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_motd)); + insert_values.push_back(std::to_string(guild_ranks_entry.can_warpeace)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildRanks entry{}; + + entry.guild_id = atoi(row[0]); + entry.rank = atoi(row[1]); + entry.title = row[2] ? row[2] : ""; + entry.can_hear = atoi(row[3]); + entry.can_speak = atoi(row[4]); + entry.can_invite = atoi(row[5]); + entry.can_remove = atoi(row[6]); + entry.can_promote = atoi(row[7]); + entry.can_demote = atoi(row[8]); + entry.can_motd = atoi(row[9]); + entry.can_warpeace = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildRanks entry{}; + + entry.guild_id = atoi(row[0]); + entry.rank = atoi(row[1]); + entry.title = row[2] ? row[2] : ""; + entry.can_hear = atoi(row[3]); + entry.can_speak = atoi(row[4]); + entry.can_invite = atoi(row[5]); + entry.can_remove = atoi(row[6]); + entry.can_promote = atoi(row[7]); + entry.can_demote = atoi(row[8]); + entry.can_motd = atoi(row[9]); + entry.can_warpeace = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GUILD_RANKS_REPOSITORY_H diff --git a/common/repositories/base/base_guild_relations_repository.h b/common/repositories/base/base_guild_relations_repository.h new file mode 100644 index 000000000..2ddcd854f --- /dev/null +++ b/common/repositories/base/base_guild_relations_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GUILD_RELATIONS_REPOSITORY_H +#define EQEMU_BASE_GUILD_RELATIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGuildRelationsRepository { +public: + struct GuildRelations { + int guild1; + int guild2; + int relation; + }; + + static std::string PrimaryKey() + { + return std::string("guild1"); + } + + static std::vector Columns() + { + return { + "guild1", + "guild2", + "relation", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("guild_relations"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static GuildRelations NewEntity() + { + GuildRelations entry{}; + + entry.guild1 = 0; + entry.guild2 = 0; + entry.relation = 0; + + return entry; + } + + static GuildRelations GetGuildRelationsEntry( + const std::vector &guild_relationss, + int guild_relations_id + ) + { + for (auto &guild_relations : guild_relationss) { + if (guild_relations.guild1 == guild_relations_id) { + return guild_relations; + } + } + + return NewEntity(); + } + + static GuildRelations FindOne( + Database& db, + int guild_relations_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + guild_relations_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GuildRelations entry{}; + + entry.guild1 = atoi(row[0]); + entry.guild2 = atoi(row[1]); + entry.relation = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int guild_relations_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + guild_relations_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + GuildRelations guild_relations_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(guild_relations_entry.guild1)); + update_values.push_back(columns[1] + " = " + std::to_string(guild_relations_entry.guild2)); + update_values.push_back(columns[2] + " = " + std::to_string(guild_relations_entry.relation)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + guild_relations_entry.guild1 + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GuildRelations InsertOne( + Database& db, + GuildRelations guild_relations_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_relations_entry.guild1)); + insert_values.push_back(std::to_string(guild_relations_entry.guild2)); + insert_values.push_back(std::to_string(guild_relations_entry.relation)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + guild_relations_entry.guild1 = results.LastInsertedID(); + return guild_relations_entry; + } + + guild_relations_entry = NewEntity(); + + return guild_relations_entry; + } + + static int InsertMany( + Database& db, + std::vector guild_relations_entries + ) + { + std::vector insert_chunks; + + for (auto &guild_relations_entry: guild_relations_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_relations_entry.guild1)); + insert_values.push_back(std::to_string(guild_relations_entry.guild2)); + insert_values.push_back(std::to_string(guild_relations_entry.relation)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildRelations entry{}; + + entry.guild1 = atoi(row[0]); + entry.guild2 = atoi(row[1]); + entry.relation = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildRelations entry{}; + + entry.guild1 = atoi(row[0]); + entry.guild2 = atoi(row[1]); + entry.relation = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GUILD_RELATIONS_REPOSITORY_H diff --git a/common/repositories/base/base_guilds_repository.h b/common/repositories/base/base_guilds_repository.h new file mode 100644 index 000000000..e1cd14f14 --- /dev/null +++ b/common/repositories/base/base_guilds_repository.h @@ -0,0 +1,355 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_GUILDS_REPOSITORY_H +#define EQEMU_BASE_GUILDS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseGuildsRepository { +public: + struct Guilds { + int id; + std::string name; + int leader; + int minstatus; + std::string motd; + int tribute; + std::string motd_setter; + std::string channel; + std::string url; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "leader", + "minstatus", + "motd", + "tribute", + "motd_setter", + "channel", + "url", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("guilds"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Guilds NewEntity() + { + Guilds entry{}; + + entry.id = 0; + entry.name = ""; + entry.leader = 0; + entry.minstatus = 0; + entry.motd = ""; + entry.tribute = 0; + entry.motd_setter = ""; + entry.channel = ""; + entry.url = ""; + + return entry; + } + + static Guilds GetGuildsEntry( + const std::vector &guildss, + int guilds_id + ) + { + for (auto &guilds : guildss) { + if (guilds.id == guilds_id) { + return guilds; + } + } + + return NewEntity(); + } + + static Guilds FindOne( + Database& db, + int guilds_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + guilds_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Guilds entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.leader = atoi(row[2]); + entry.minstatus = atoi(row[3]); + entry.motd = row[4] ? row[4] : ""; + entry.tribute = atoi(row[5]); + entry.motd_setter = row[6] ? row[6] : ""; + entry.channel = row[7] ? row[7] : ""; + entry.url = row[8] ? row[8] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int guilds_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + guilds_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Guilds guilds_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(guilds_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(guilds_entry.leader)); + update_values.push_back(columns[3] + " = " + std::to_string(guilds_entry.minstatus)); + update_values.push_back(columns[4] + " = '" + EscapeString(guilds_entry.motd) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(guilds_entry.tribute)); + update_values.push_back(columns[6] + " = '" + EscapeString(guilds_entry.motd_setter) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(guilds_entry.channel) + "'"); + update_values.push_back(columns[8] + " = '" + EscapeString(guilds_entry.url) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + guilds_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Guilds InsertOne( + Database& db, + Guilds guilds_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(guilds_entry.id)); + insert_values.push_back("'" + EscapeString(guilds_entry.name) + "'"); + insert_values.push_back(std::to_string(guilds_entry.leader)); + insert_values.push_back(std::to_string(guilds_entry.minstatus)); + insert_values.push_back("'" + EscapeString(guilds_entry.motd) + "'"); + insert_values.push_back(std::to_string(guilds_entry.tribute)); + insert_values.push_back("'" + EscapeString(guilds_entry.motd_setter) + "'"); + insert_values.push_back("'" + EscapeString(guilds_entry.channel) + "'"); + insert_values.push_back("'" + EscapeString(guilds_entry.url) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + guilds_entry.id = results.LastInsertedID(); + return guilds_entry; + } + + guilds_entry = NewEntity(); + + return guilds_entry; + } + + static int InsertMany( + Database& db, + std::vector guilds_entries + ) + { + std::vector insert_chunks; + + for (auto &guilds_entry: guilds_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(guilds_entry.id)); + insert_values.push_back("'" + EscapeString(guilds_entry.name) + "'"); + insert_values.push_back(std::to_string(guilds_entry.leader)); + insert_values.push_back(std::to_string(guilds_entry.minstatus)); + insert_values.push_back("'" + EscapeString(guilds_entry.motd) + "'"); + insert_values.push_back(std::to_string(guilds_entry.tribute)); + insert_values.push_back("'" + EscapeString(guilds_entry.motd_setter) + "'"); + insert_values.push_back("'" + EscapeString(guilds_entry.channel) + "'"); + insert_values.push_back("'" + EscapeString(guilds_entry.url) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Guilds entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.leader = atoi(row[2]); + entry.minstatus = atoi(row[3]); + entry.motd = row[4] ? row[4] : ""; + entry.tribute = atoi(row[5]); + entry.motd_setter = row[6] ? row[6] : ""; + entry.channel = row[7] ? row[7] : ""; + entry.url = row[8] ? row[8] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Guilds entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.leader = atoi(row[2]); + entry.minstatus = atoi(row[3]); + entry.motd = row[4] ? row[4] : ""; + entry.tribute = atoi(row[5]); + entry.motd_setter = row[6] ? row[6] : ""; + entry.channel = row[7] ? row[7] : ""; + entry.url = row[8] ? row[8] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_GUILDS_REPOSITORY_H diff --git a/common/repositories/base/base_hackers_repository.h b/common/repositories/base/base_hackers_repository.h new file mode 100644 index 000000000..4a492deac --- /dev/null +++ b/common/repositories/base/base_hackers_repository.h @@ -0,0 +1,328 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_HACKERS_REPOSITORY_H +#define EQEMU_BASE_HACKERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseHackersRepository { +public: + struct Hackers { + int id; + std::string account; + std::string name; + std::string hacked; + std::string zone; + std::string date; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "account", + "name", + "hacked", + "zone", + "date", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("hackers"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Hackers NewEntity() + { + Hackers entry{}; + + entry.id = 0; + entry.account = ""; + entry.name = ""; + entry.hacked = ""; + entry.zone = ""; + entry.date = current_timestamp(); + + return entry; + } + + static Hackers GetHackersEntry( + const std::vector &hackerss, + int hackers_id + ) + { + for (auto &hackers : hackerss) { + if (hackers.id == hackers_id) { + return hackers; + } + } + + return NewEntity(); + } + + static Hackers FindOne( + Database& db, + int hackers_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + hackers_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Hackers entry{}; + + entry.id = atoi(row[0]); + entry.account = row[1] ? row[1] : ""; + entry.name = row[2] ? row[2] : ""; + entry.hacked = row[3] ? row[3] : ""; + entry.zone = row[4] ? row[4] : ""; + entry.date = row[5] ? row[5] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int hackers_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + hackers_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Hackers hackers_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(hackers_entry.account) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(hackers_entry.name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(hackers_entry.hacked) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(hackers_entry.zone) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(hackers_entry.date) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + hackers_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Hackers InsertOne( + Database& db, + Hackers hackers_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(hackers_entry.id)); + insert_values.push_back("'" + EscapeString(hackers_entry.account) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.hacked) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.zone) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.date) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + hackers_entry.id = results.LastInsertedID(); + return hackers_entry; + } + + hackers_entry = NewEntity(); + + return hackers_entry; + } + + static int InsertMany( + Database& db, + std::vector hackers_entries + ) + { + std::vector insert_chunks; + + for (auto &hackers_entry: hackers_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(hackers_entry.id)); + insert_values.push_back("'" + EscapeString(hackers_entry.account) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.hacked) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.zone) + "'"); + insert_values.push_back("'" + EscapeString(hackers_entry.date) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Hackers entry{}; + + entry.id = atoi(row[0]); + entry.account = row[1] ? row[1] : ""; + entry.name = row[2] ? row[2] : ""; + entry.hacked = row[3] ? row[3] : ""; + entry.zone = row[4] ? row[4] : ""; + entry.date = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Hackers entry{}; + + entry.id = atoi(row[0]); + entry.account = row[1] ? row[1] : ""; + entry.name = row[2] ? row[2] : ""; + entry.hacked = row[3] ? row[3] : ""; + entry.zone = row[4] ? row[4] : ""; + entry.date = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_HACKERS_REPOSITORY_H diff --git a/common/repositories/base/base_horses_repository.h b/common/repositories/base/base_horses_repository.h new file mode 100644 index 000000000..2282e3da0 --- /dev/null +++ b/common/repositories/base/base_horses_repository.h @@ -0,0 +1,345 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + */ + +/** + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to + * the repository extending the base. Any modifications to base repositories are to + * be made by the generator only + */ + +#ifndef EQEMU_BASE_HORSES_REPOSITORY_H +#define EQEMU_BASE_HORSES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseHorsesRepository { +public: + struct Horses { + std::string filename; + int16 race; + int8 gender; + int8 texture; + float mountspeed; + std::string notes; + }; + + static std::string PrimaryKey() + { + return std::string("filename"); + } + + static std::vector Columns() + { + return { + "filename", + "race", + "gender", + "texture", + "mountspeed", + "notes", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("horses"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static Horses NewEntity() + { + Horses entry{}; + + entry.filename = ""; + entry.race = 216; + entry.gender = 0; + entry.texture = 0; + entry.mountspeed = 0.75; + entry.notes = "Notes"; + + return entry; + } + + static Horses GetHorsesEntry( + const std::vector &horsess, + int horses_id + ) + { + for (auto &horses : horsess) { + if (horses.filename == horses_id) { + return horses; + } + } + + return NewEntity(); + } + + static Horses FindOne( + int horses_id + ) + { + auto results = content_db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + horses_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Horses entry{}; + + entry.filename = row[0] ? row[0] : ""; + entry.race = atoi(row[1]); + entry.gender = atoi(row[2]); + entry.texture = atoi(row[3]); + entry.mountspeed = atof(row[4]); + entry.notes = row[5] ? row[5] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int horses_id + ) + { + auto results = content_db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + horses_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Horses horses_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(horses_entry.filename) + "'"); + update_values.push_back(columns[1] + " = " + std::to_string(horses_entry.race)); + update_values.push_back(columns[2] + " = " + std::to_string(horses_entry.gender)); + update_values.push_back(columns[3] + " = " + std::to_string(horses_entry.texture)); + update_values.push_back(columns[4] + " = " + std::to_string(horses_entry.mountspeed)); + update_values.push_back(columns[5] + " = '" + EscapeString(horses_entry.notes) + "'"); + + auto results = content_db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + horses_entry.filename + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Horses InsertOne( + Horses horses_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(horses_entry.filename) + "'"); + insert_values.push_back(std::to_string(horses_entry.race)); + insert_values.push_back(std::to_string(horses_entry.gender)); + insert_values.push_back(std::to_string(horses_entry.texture)); + insert_values.push_back(std::to_string(horses_entry.mountspeed)); + insert_values.push_back("'" + EscapeString(horses_entry.notes) + "'"); + + auto results = content_db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + horses_entry.filename = results.LastInsertedID(); + return horses_entry; + } + + horses_entry = NewEntity(); + + return horses_entry; + } + + static int InsertMany( + std::vector horses_entries + ) + { + std::vector insert_chunks; + + for (auto &horses_entry: horses_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(horses_entry.filename) + "'"); + insert_values.push_back(std::to_string(horses_entry.race)); + insert_values.push_back(std::to_string(horses_entry.gender)); + insert_values.push_back(std::to_string(horses_entry.texture)); + insert_values.push_back(std::to_string(horses_entry.mountspeed)); + insert_values.push_back("'" + EscapeString(horses_entry.notes) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = content_db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = content_db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Horses entry{}; + + entry.filename = row[0] ? row[0] : ""; + entry.race = atoi(row[1]); + entry.gender = atoi(row[2]); + entry.texture = atoi(row[3]); + entry.mountspeed = atof(row[4]); + entry.notes = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(std::string where_filter) + { + std::vector all_entries; + + auto results = content_db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Horses entry{}; + + entry.filename = row[0] ? row[0] : ""; + entry.race = atoi(row[1]); + entry.gender = atoi(row[2]); + entry.texture = atoi(row[3]); + entry.mountspeed = atof(row[4]); + entry.notes = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(std::string where_filter) + { + auto results = content_db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + PrimaryKey(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_HORSES_REPOSITORY_H diff --git a/common/repositories/base/base_instance_list_player_repository.h b/common/repositories/base/base_instance_list_player_repository.h new file mode 100644 index 000000000..4b8aed4ee --- /dev/null +++ b/common/repositories/base/base_instance_list_player_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_INSTANCE_LIST_PLAYER_REPOSITORY_H +#define EQEMU_BASE_INSTANCE_LIST_PLAYER_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseInstanceListPlayerRepository { +public: + struct InstanceListPlayer { + int id; + int charid; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "charid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("instance_list_player"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static InstanceListPlayer NewEntity() + { + InstanceListPlayer entry{}; + + entry.id = 0; + entry.charid = 0; + + return entry; + } + + static InstanceListPlayer GetInstanceListPlayerEntry( + const std::vector &instance_list_players, + int instance_list_player_id + ) + { + for (auto &instance_list_player : instance_list_players) { + if (instance_list_player.id == instance_list_player_id) { + return instance_list_player; + } + } + + return NewEntity(); + } + + static InstanceListPlayer FindOne( + Database& db, + int instance_list_player_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + instance_list_player_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + InstanceListPlayer entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int instance_list_player_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + instance_list_player_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + InstanceListPlayer instance_list_player_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(instance_list_player_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(instance_list_player_entry.charid)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + instance_list_player_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static InstanceListPlayer InsertOne( + Database& db, + InstanceListPlayer instance_list_player_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(instance_list_player_entry.id)); + insert_values.push_back(std::to_string(instance_list_player_entry.charid)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + instance_list_player_entry.id = results.LastInsertedID(); + return instance_list_player_entry; + } + + instance_list_player_entry = NewEntity(); + + return instance_list_player_entry; + } + + static int InsertMany( + Database& db, + std::vector instance_list_player_entries + ) + { + std::vector insert_chunks; + + for (auto &instance_list_player_entry: instance_list_player_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(instance_list_player_entry.id)); + insert_values.push_back(std::to_string(instance_list_player_entry.charid)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InstanceListPlayer entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InstanceListPlayer entry{}; + + entry.id = atoi(row[0]); + entry.charid = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_INSTANCE_LIST_PLAYER_REPOSITORY_H diff --git a/common/repositories/base/base_instance_list_repository.h b/common/repositories/base/base_instance_list_repository.h new file mode 100644 index 000000000..55b31703f --- /dev/null +++ b/common/repositories/base/base_instance_list_repository.h @@ -0,0 +1,337 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_INSTANCE_LIST_REPOSITORY_H +#define EQEMU_BASE_INSTANCE_LIST_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseInstanceListRepository { +public: + struct InstanceList { + int id; + int zone; + int version; + int is_global; + int start_time; + int duration; + int never_expires; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "version", + "is_global", + "start_time", + "duration", + "never_expires", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("instance_list"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static InstanceList NewEntity() + { + InstanceList entry{}; + + entry.id = 0; + entry.zone = 0; + entry.version = 0; + entry.is_global = 0; + entry.start_time = 0; + entry.duration = 0; + entry.never_expires = 0; + + return entry; + } + + static InstanceList GetInstanceListEntry( + const std::vector &instance_lists, + int instance_list_id + ) + { + for (auto &instance_list : instance_lists) { + if (instance_list.id == instance_list_id) { + return instance_list; + } + } + + return NewEntity(); + } + + static InstanceList FindOne( + Database& db, + int instance_list_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + instance_list_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + InstanceList entry{}; + + entry.id = atoi(row[0]); + entry.zone = atoi(row[1]); + entry.version = atoi(row[2]); + entry.is_global = atoi(row[3]); + entry.start_time = atoi(row[4]); + entry.duration = atoi(row[5]); + entry.never_expires = atoi(row[6]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int instance_list_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + instance_list_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + InstanceList instance_list_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(instance_list_entry.zone)); + update_values.push_back(columns[2] + " = " + std::to_string(instance_list_entry.version)); + update_values.push_back(columns[3] + " = " + std::to_string(instance_list_entry.is_global)); + update_values.push_back(columns[4] + " = " + std::to_string(instance_list_entry.start_time)); + update_values.push_back(columns[5] + " = " + std::to_string(instance_list_entry.duration)); + update_values.push_back(columns[6] + " = " + std::to_string(instance_list_entry.never_expires)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + instance_list_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static InstanceList InsertOne( + Database& db, + InstanceList instance_list_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(instance_list_entry.id)); + insert_values.push_back(std::to_string(instance_list_entry.zone)); + insert_values.push_back(std::to_string(instance_list_entry.version)); + insert_values.push_back(std::to_string(instance_list_entry.is_global)); + insert_values.push_back(std::to_string(instance_list_entry.start_time)); + insert_values.push_back(std::to_string(instance_list_entry.duration)); + insert_values.push_back(std::to_string(instance_list_entry.never_expires)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + instance_list_entry.id = results.LastInsertedID(); + return instance_list_entry; + } + + instance_list_entry = NewEntity(); + + return instance_list_entry; + } + + static int InsertMany( + Database& db, + std::vector instance_list_entries + ) + { + std::vector insert_chunks; + + for (auto &instance_list_entry: instance_list_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(instance_list_entry.id)); + insert_values.push_back(std::to_string(instance_list_entry.zone)); + insert_values.push_back(std::to_string(instance_list_entry.version)); + insert_values.push_back(std::to_string(instance_list_entry.is_global)); + insert_values.push_back(std::to_string(instance_list_entry.start_time)); + insert_values.push_back(std::to_string(instance_list_entry.duration)); + insert_values.push_back(std::to_string(instance_list_entry.never_expires)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InstanceList entry{}; + + entry.id = atoi(row[0]); + entry.zone = atoi(row[1]); + entry.version = atoi(row[2]); + entry.is_global = atoi(row[3]); + entry.start_time = atoi(row[4]); + entry.duration = atoi(row[5]); + entry.never_expires = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InstanceList entry{}; + + entry.id = atoi(row[0]); + entry.zone = atoi(row[1]); + entry.version = atoi(row[2]); + entry.is_global = atoi(row[3]); + entry.start_time = atoi(row[4]); + entry.duration = atoi(row[5]); + entry.never_expires = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_INSTANCE_LIST_REPOSITORY_H diff --git a/common/repositories/base/base_inventory_repository.h b/common/repositories/base/base_inventory_repository.h new file mode 100644 index 000000000..62308ebdf --- /dev/null +++ b/common/repositories/base/base_inventory_repository.h @@ -0,0 +1,419 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_INVENTORY_REPOSITORY_H +#define EQEMU_BASE_INVENTORY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseInventoryRepository { +public: + struct Inventory { + int charid; + int slotid; + int itemid; + int charges; + int color; + int augslot1; + int augslot2; + int augslot3; + int augslot4; + int augslot5; + int augslot6; + int instnodrop; + std::string custom_data; + int ornamenticon; + int ornamentidfile; + int ornament_hero_model; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "slotid", + "itemid", + "charges", + "color", + "augslot1", + "augslot2", + "augslot3", + "augslot4", + "augslot5", + "augslot6", + "instnodrop", + "custom_data", + "ornamenticon", + "ornamentidfile", + "ornament_hero_model", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("inventory"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Inventory NewEntity() + { + Inventory entry{}; + + entry.charid = 0; + entry.slotid = 0; + entry.itemid = 0; + entry.charges = 0; + entry.color = 0; + entry.augslot1 = 0; + entry.augslot2 = 0; + entry.augslot3 = 0; + entry.augslot4 = 0; + entry.augslot5 = 0; + entry.augslot6 = 0; + entry.instnodrop = 0; + entry.custom_data = ""; + entry.ornamenticon = 0; + entry.ornamentidfile = 0; + entry.ornament_hero_model = 0; + + return entry; + } + + static Inventory GetInventoryEntry( + const std::vector &inventorys, + int inventory_id + ) + { + for (auto &inventory : inventorys) { + if (inventory.charid == inventory_id) { + return inventory; + } + } + + return NewEntity(); + } + + static Inventory FindOne( + Database& db, + int inventory_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + inventory_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Inventory entry{}; + + entry.charid = atoi(row[0]); + entry.slotid = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.color = atoi(row[4]); + entry.augslot1 = atoi(row[5]); + entry.augslot2 = atoi(row[6]); + entry.augslot3 = atoi(row[7]); + entry.augslot4 = atoi(row[8]); + entry.augslot5 = atoi(row[9]); + entry.augslot6 = atoi(row[10]); + entry.instnodrop = atoi(row[11]); + entry.custom_data = row[12] ? row[12] : ""; + entry.ornamenticon = atoi(row[13]); + entry.ornamentidfile = atoi(row[14]); + entry.ornament_hero_model = atoi(row[15]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int inventory_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + inventory_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Inventory inventory_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(inventory_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(inventory_entry.slotid)); + update_values.push_back(columns[2] + " = " + std::to_string(inventory_entry.itemid)); + update_values.push_back(columns[3] + " = " + std::to_string(inventory_entry.charges)); + update_values.push_back(columns[4] + " = " + std::to_string(inventory_entry.color)); + update_values.push_back(columns[5] + " = " + std::to_string(inventory_entry.augslot1)); + update_values.push_back(columns[6] + " = " + std::to_string(inventory_entry.augslot2)); + update_values.push_back(columns[7] + " = " + std::to_string(inventory_entry.augslot3)); + update_values.push_back(columns[8] + " = " + std::to_string(inventory_entry.augslot4)); + update_values.push_back(columns[9] + " = " + std::to_string(inventory_entry.augslot5)); + update_values.push_back(columns[10] + " = " + std::to_string(inventory_entry.augslot6)); + update_values.push_back(columns[11] + " = " + std::to_string(inventory_entry.instnodrop)); + update_values.push_back(columns[12] + " = '" + EscapeString(inventory_entry.custom_data) + "'"); + update_values.push_back(columns[13] + " = " + std::to_string(inventory_entry.ornamenticon)); + update_values.push_back(columns[14] + " = " + std::to_string(inventory_entry.ornamentidfile)); + update_values.push_back(columns[15] + " = " + std::to_string(inventory_entry.ornament_hero_model)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + inventory_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Inventory InsertOne( + Database& db, + Inventory inventory_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(inventory_entry.charid)); + insert_values.push_back(std::to_string(inventory_entry.slotid)); + insert_values.push_back(std::to_string(inventory_entry.itemid)); + insert_values.push_back(std::to_string(inventory_entry.charges)); + insert_values.push_back(std::to_string(inventory_entry.color)); + insert_values.push_back(std::to_string(inventory_entry.augslot1)); + insert_values.push_back(std::to_string(inventory_entry.augslot2)); + insert_values.push_back(std::to_string(inventory_entry.augslot3)); + insert_values.push_back(std::to_string(inventory_entry.augslot4)); + insert_values.push_back(std::to_string(inventory_entry.augslot5)); + insert_values.push_back(std::to_string(inventory_entry.augslot6)); + insert_values.push_back(std::to_string(inventory_entry.instnodrop)); + insert_values.push_back("'" + EscapeString(inventory_entry.custom_data) + "'"); + insert_values.push_back(std::to_string(inventory_entry.ornamenticon)); + insert_values.push_back(std::to_string(inventory_entry.ornamentidfile)); + insert_values.push_back(std::to_string(inventory_entry.ornament_hero_model)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + inventory_entry.charid = results.LastInsertedID(); + return inventory_entry; + } + + inventory_entry = NewEntity(); + + return inventory_entry; + } + + static int InsertMany( + Database& db, + std::vector inventory_entries + ) + { + std::vector insert_chunks; + + for (auto &inventory_entry: inventory_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(inventory_entry.charid)); + insert_values.push_back(std::to_string(inventory_entry.slotid)); + insert_values.push_back(std::to_string(inventory_entry.itemid)); + insert_values.push_back(std::to_string(inventory_entry.charges)); + insert_values.push_back(std::to_string(inventory_entry.color)); + insert_values.push_back(std::to_string(inventory_entry.augslot1)); + insert_values.push_back(std::to_string(inventory_entry.augslot2)); + insert_values.push_back(std::to_string(inventory_entry.augslot3)); + insert_values.push_back(std::to_string(inventory_entry.augslot4)); + insert_values.push_back(std::to_string(inventory_entry.augslot5)); + insert_values.push_back(std::to_string(inventory_entry.augslot6)); + insert_values.push_back(std::to_string(inventory_entry.instnodrop)); + insert_values.push_back("'" + EscapeString(inventory_entry.custom_data) + "'"); + insert_values.push_back(std::to_string(inventory_entry.ornamenticon)); + insert_values.push_back(std::to_string(inventory_entry.ornamentidfile)); + insert_values.push_back(std::to_string(inventory_entry.ornament_hero_model)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Inventory entry{}; + + entry.charid = atoi(row[0]); + entry.slotid = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.color = atoi(row[4]); + entry.augslot1 = atoi(row[5]); + entry.augslot2 = atoi(row[6]); + entry.augslot3 = atoi(row[7]); + entry.augslot4 = atoi(row[8]); + entry.augslot5 = atoi(row[9]); + entry.augslot6 = atoi(row[10]); + entry.instnodrop = atoi(row[11]); + entry.custom_data = row[12] ? row[12] : ""; + entry.ornamenticon = atoi(row[13]); + entry.ornamentidfile = atoi(row[14]); + entry.ornament_hero_model = atoi(row[15]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Inventory entry{}; + + entry.charid = atoi(row[0]); + entry.slotid = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.color = atoi(row[4]); + entry.augslot1 = atoi(row[5]); + entry.augslot2 = atoi(row[6]); + entry.augslot3 = atoi(row[7]); + entry.augslot4 = atoi(row[8]); + entry.augslot5 = atoi(row[9]); + entry.augslot6 = atoi(row[10]); + entry.instnodrop = atoi(row[11]); + entry.custom_data = row[12] ? row[12] : ""; + entry.ornamenticon = atoi(row[13]); + entry.ornamentidfile = atoi(row[14]); + entry.ornament_hero_model = atoi(row[15]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_INVENTORY_REPOSITORY_H diff --git a/common/repositories/base/base_inventory_snapshots_repository.h b/common/repositories/base/base_inventory_snapshots_repository.h new file mode 100644 index 000000000..4d34062f3 --- /dev/null +++ b/common/repositories/base/base_inventory_snapshots_repository.h @@ -0,0 +1,428 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_INVENTORY_SNAPSHOTS_REPOSITORY_H +#define EQEMU_BASE_INVENTORY_SNAPSHOTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseInventorySnapshotsRepository { +public: + struct InventorySnapshots { + int time_index; + int charid; + int slotid; + int itemid; + int charges; + int color; + int augslot1; + int augslot2; + int augslot3; + int augslot4; + int augslot5; + int augslot6; + int instnodrop; + std::string custom_data; + int ornamenticon; + int ornamentidfile; + int ornament_hero_model; + }; + + static std::string PrimaryKey() + { + return std::string("time_index"); + } + + static std::vector Columns() + { + return { + "time_index", + "charid", + "slotid", + "itemid", + "charges", + "color", + "augslot1", + "augslot2", + "augslot3", + "augslot4", + "augslot5", + "augslot6", + "instnodrop", + "custom_data", + "ornamenticon", + "ornamentidfile", + "ornament_hero_model", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("inventory_snapshots"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static InventorySnapshots NewEntity() + { + InventorySnapshots entry{}; + + entry.time_index = 0; + entry.charid = 0; + entry.slotid = 0; + entry.itemid = 0; + entry.charges = 0; + entry.color = 0; + entry.augslot1 = 0; + entry.augslot2 = 0; + entry.augslot3 = 0; + entry.augslot4 = 0; + entry.augslot5 = 0; + entry.augslot6 = 0; + entry.instnodrop = 0; + entry.custom_data = ""; + entry.ornamenticon = 0; + entry.ornamentidfile = 0; + entry.ornament_hero_model = 0; + + return entry; + } + + static InventorySnapshots GetInventorySnapshotsEntry( + const std::vector &inventory_snapshotss, + int inventory_snapshots_id + ) + { + for (auto &inventory_snapshots : inventory_snapshotss) { + if (inventory_snapshots.time_index == inventory_snapshots_id) { + return inventory_snapshots; + } + } + + return NewEntity(); + } + + static InventorySnapshots FindOne( + Database& db, + int inventory_snapshots_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + inventory_snapshots_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + InventorySnapshots entry{}; + + entry.time_index = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.slotid = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.charges = atoi(row[4]); + entry.color = atoi(row[5]); + entry.augslot1 = atoi(row[6]); + entry.augslot2 = atoi(row[7]); + entry.augslot3 = atoi(row[8]); + entry.augslot4 = atoi(row[9]); + entry.augslot5 = atoi(row[10]); + entry.augslot6 = atoi(row[11]); + entry.instnodrop = atoi(row[12]); + entry.custom_data = row[13] ? row[13] : ""; + entry.ornamenticon = atoi(row[14]); + entry.ornamentidfile = atoi(row[15]); + entry.ornament_hero_model = atoi(row[16]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int inventory_snapshots_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + inventory_snapshots_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + InventorySnapshots inventory_snapshots_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(inventory_snapshots_entry.time_index)); + update_values.push_back(columns[1] + " = " + std::to_string(inventory_snapshots_entry.charid)); + update_values.push_back(columns[2] + " = " + std::to_string(inventory_snapshots_entry.slotid)); + update_values.push_back(columns[3] + " = " + std::to_string(inventory_snapshots_entry.itemid)); + update_values.push_back(columns[4] + " = " + std::to_string(inventory_snapshots_entry.charges)); + update_values.push_back(columns[5] + " = " + std::to_string(inventory_snapshots_entry.color)); + update_values.push_back(columns[6] + " = " + std::to_string(inventory_snapshots_entry.augslot1)); + update_values.push_back(columns[7] + " = " + std::to_string(inventory_snapshots_entry.augslot2)); + update_values.push_back(columns[8] + " = " + std::to_string(inventory_snapshots_entry.augslot3)); + update_values.push_back(columns[9] + " = " + std::to_string(inventory_snapshots_entry.augslot4)); + update_values.push_back(columns[10] + " = " + std::to_string(inventory_snapshots_entry.augslot5)); + update_values.push_back(columns[11] + " = " + std::to_string(inventory_snapshots_entry.augslot6)); + update_values.push_back(columns[12] + " = " + std::to_string(inventory_snapshots_entry.instnodrop)); + update_values.push_back(columns[13] + " = '" + EscapeString(inventory_snapshots_entry.custom_data) + "'"); + update_values.push_back(columns[14] + " = " + std::to_string(inventory_snapshots_entry.ornamenticon)); + update_values.push_back(columns[15] + " = " + std::to_string(inventory_snapshots_entry.ornamentidfile)); + update_values.push_back(columns[16] + " = " + std::to_string(inventory_snapshots_entry.ornament_hero_model)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + inventory_snapshots_entry.time_index + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static InventorySnapshots InsertOne( + Database& db, + InventorySnapshots inventory_snapshots_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(inventory_snapshots_entry.time_index)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.charid)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.slotid)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.itemid)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.charges)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.color)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot1)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot2)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot3)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot4)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot5)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot6)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.instnodrop)); + insert_values.push_back("'" + EscapeString(inventory_snapshots_entry.custom_data) + "'"); + insert_values.push_back(std::to_string(inventory_snapshots_entry.ornamenticon)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.ornamentidfile)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.ornament_hero_model)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + inventory_snapshots_entry.time_index = results.LastInsertedID(); + return inventory_snapshots_entry; + } + + inventory_snapshots_entry = NewEntity(); + + return inventory_snapshots_entry; + } + + static int InsertMany( + Database& db, + std::vector inventory_snapshots_entries + ) + { + std::vector insert_chunks; + + for (auto &inventory_snapshots_entry: inventory_snapshots_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(inventory_snapshots_entry.time_index)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.charid)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.slotid)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.itemid)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.charges)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.color)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot1)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot2)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot3)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot4)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot5)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.augslot6)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.instnodrop)); + insert_values.push_back("'" + EscapeString(inventory_snapshots_entry.custom_data) + "'"); + insert_values.push_back(std::to_string(inventory_snapshots_entry.ornamenticon)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.ornamentidfile)); + insert_values.push_back(std::to_string(inventory_snapshots_entry.ornament_hero_model)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InventorySnapshots entry{}; + + entry.time_index = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.slotid = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.charges = atoi(row[4]); + entry.color = atoi(row[5]); + entry.augslot1 = atoi(row[6]); + entry.augslot2 = atoi(row[7]); + entry.augslot3 = atoi(row[8]); + entry.augslot4 = atoi(row[9]); + entry.augslot5 = atoi(row[10]); + entry.augslot6 = atoi(row[11]); + entry.instnodrop = atoi(row[12]); + entry.custom_data = row[13] ? row[13] : ""; + entry.ornamenticon = atoi(row[14]); + entry.ornamentidfile = atoi(row[15]); + entry.ornament_hero_model = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InventorySnapshots entry{}; + + entry.time_index = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.slotid = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.charges = atoi(row[4]); + entry.color = atoi(row[5]); + entry.augslot1 = atoi(row[6]); + entry.augslot2 = atoi(row[7]); + entry.augslot3 = atoi(row[8]); + entry.augslot4 = atoi(row[9]); + entry.augslot5 = atoi(row[10]); + entry.augslot6 = atoi(row[11]); + entry.instnodrop = atoi(row[12]); + entry.custom_data = row[13] ? row[13] : ""; + entry.ornamenticon = atoi(row[14]); + entry.ornamentidfile = atoi(row[15]); + entry.ornament_hero_model = atoi(row[16]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_INVENTORY_SNAPSHOTS_REPOSITORY_H diff --git a/common/repositories/base/base_ip_exemptions_repository.h b/common/repositories/base/base_ip_exemptions_repository.h new file mode 100644 index 000000000..dadd49b8e --- /dev/null +++ b/common/repositories/base/base_ip_exemptions_repository.h @@ -0,0 +1,301 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_IP_EXEMPTIONS_REPOSITORY_H +#define EQEMU_BASE_IP_EXEMPTIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseIpExemptionsRepository { +public: + struct IpExemptions { + int exemption_id; + std::string exemption_ip; + int exemption_amount; + }; + + static std::string PrimaryKey() + { + return std::string("exemption_id"); + } + + static std::vector Columns() + { + return { + "exemption_id", + "exemption_ip", + "exemption_amount", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("ip_exemptions"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static IpExemptions NewEntity() + { + IpExemptions entry{}; + + entry.exemption_id = 0; + entry.exemption_ip = ""; + entry.exemption_amount = 0; + + return entry; + } + + static IpExemptions GetIpExemptionsEntry( + const std::vector &ip_exemptionss, + int ip_exemptions_id + ) + { + for (auto &ip_exemptions : ip_exemptionss) { + if (ip_exemptions.exemption_id == ip_exemptions_id) { + return ip_exemptions; + } + } + + return NewEntity(); + } + + static IpExemptions FindOne( + Database& db, + int ip_exemptions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + ip_exemptions_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + IpExemptions entry{}; + + entry.exemption_id = atoi(row[0]); + entry.exemption_ip = row[1] ? row[1] : ""; + entry.exemption_amount = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int ip_exemptions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + ip_exemptions_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + IpExemptions ip_exemptions_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(ip_exemptions_entry.exemption_ip) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(ip_exemptions_entry.exemption_amount)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + ip_exemptions_entry.exemption_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static IpExemptions InsertOne( + Database& db, + IpExemptions ip_exemptions_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(ip_exemptions_entry.exemption_id)); + insert_values.push_back("'" + EscapeString(ip_exemptions_entry.exemption_ip) + "'"); + insert_values.push_back(std::to_string(ip_exemptions_entry.exemption_amount)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + ip_exemptions_entry.exemption_id = results.LastInsertedID(); + return ip_exemptions_entry; + } + + ip_exemptions_entry = NewEntity(); + + return ip_exemptions_entry; + } + + static int InsertMany( + Database& db, + std::vector ip_exemptions_entries + ) + { + std::vector insert_chunks; + + for (auto &ip_exemptions_entry: ip_exemptions_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(ip_exemptions_entry.exemption_id)); + insert_values.push_back("'" + EscapeString(ip_exemptions_entry.exemption_ip) + "'"); + insert_values.push_back(std::to_string(ip_exemptions_entry.exemption_amount)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + IpExemptions entry{}; + + entry.exemption_id = atoi(row[0]); + entry.exemption_ip = row[1] ? row[1] : ""; + entry.exemption_amount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + IpExemptions entry{}; + + entry.exemption_id = atoi(row[0]); + entry.exemption_ip = row[1] ? row[1] : ""; + entry.exemption_amount = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_IP_EXEMPTIONS_REPOSITORY_H diff --git a/common/repositories/base/base_item_tick_repository.h b/common/repositories/base/base_item_tick_repository.h new file mode 100644 index 000000000..77b0ec71e --- /dev/null +++ b/common/repositories/base/base_item_tick_repository.h @@ -0,0 +1,328 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ITEM_TICK_REPOSITORY_H +#define EQEMU_BASE_ITEM_TICK_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseItemTickRepository { +public: + struct ItemTick { + int it_itemid; + int it_chance; + int it_level; + int it_id; + std::string it_qglobal; + int it_bagslot; + }; + + static std::string PrimaryKey() + { + return std::string("it_id"); + } + + static std::vector Columns() + { + return { + "it_itemid", + "it_chance", + "it_level", + "it_id", + "it_qglobal", + "it_bagslot", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("item_tick"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ItemTick NewEntity() + { + ItemTick entry{}; + + entry.it_itemid = 0; + entry.it_chance = 0; + entry.it_level = 0; + entry.it_id = 0; + entry.it_qglobal = ""; + entry.it_bagslot = 0; + + return entry; + } + + static ItemTick GetItemTickEntry( + const std::vector &item_ticks, + int item_tick_id + ) + { + for (auto &item_tick : item_ticks) { + if (item_tick.it_id == item_tick_id) { + return item_tick; + } + } + + return NewEntity(); + } + + static ItemTick FindOne( + Database& db, + int item_tick_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + item_tick_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ItemTick entry{}; + + entry.it_itemid = atoi(row[0]); + entry.it_chance = atoi(row[1]); + entry.it_level = atoi(row[2]); + entry.it_id = atoi(row[3]); + entry.it_qglobal = row[4] ? row[4] : ""; + entry.it_bagslot = atoi(row[5]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int item_tick_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + item_tick_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ItemTick item_tick_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(item_tick_entry.it_itemid)); + update_values.push_back(columns[1] + " = " + std::to_string(item_tick_entry.it_chance)); + update_values.push_back(columns[2] + " = " + std::to_string(item_tick_entry.it_level)); + update_values.push_back(columns[4] + " = '" + EscapeString(item_tick_entry.it_qglobal) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(item_tick_entry.it_bagslot)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + item_tick_entry.it_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ItemTick InsertOne( + Database& db, + ItemTick item_tick_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(item_tick_entry.it_itemid)); + insert_values.push_back(std::to_string(item_tick_entry.it_chance)); + insert_values.push_back(std::to_string(item_tick_entry.it_level)); + insert_values.push_back(std::to_string(item_tick_entry.it_id)); + insert_values.push_back("'" + EscapeString(item_tick_entry.it_qglobal) + "'"); + insert_values.push_back(std::to_string(item_tick_entry.it_bagslot)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + item_tick_entry.it_id = results.LastInsertedID(); + return item_tick_entry; + } + + item_tick_entry = NewEntity(); + + return item_tick_entry; + } + + static int InsertMany( + Database& db, + std::vector item_tick_entries + ) + { + std::vector insert_chunks; + + for (auto &item_tick_entry: item_tick_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(item_tick_entry.it_itemid)); + insert_values.push_back(std::to_string(item_tick_entry.it_chance)); + insert_values.push_back(std::to_string(item_tick_entry.it_level)); + insert_values.push_back(std::to_string(item_tick_entry.it_id)); + insert_values.push_back("'" + EscapeString(item_tick_entry.it_qglobal) + "'"); + insert_values.push_back(std::to_string(item_tick_entry.it_bagslot)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ItemTick entry{}; + + entry.it_itemid = atoi(row[0]); + entry.it_chance = atoi(row[1]); + entry.it_level = atoi(row[2]); + entry.it_id = atoi(row[3]); + entry.it_qglobal = row[4] ? row[4] : ""; + entry.it_bagslot = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ItemTick entry{}; + + entry.it_itemid = atoi(row[0]); + entry.it_chance = atoi(row[1]); + entry.it_level = atoi(row[2]); + entry.it_id = atoi(row[3]); + entry.it_qglobal = row[4] ? row[4] : ""; + entry.it_bagslot = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ITEM_TICK_REPOSITORY_H diff --git a/common/repositories/base/base_items_repository.h b/common/repositories/base/base_items_repository.h new file mode 100644 index 000000000..da124eca0 --- /dev/null +++ b/common/repositories/base/base_items_repository.h @@ -0,0 +1,2840 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ITEMS_REPOSITORY_H +#define EQEMU_BASE_ITEMS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseItemsRepository { +public: + struct Items { + int id; + int minstatus; + std::string Name; + int aagi; + int ac; + int accuracy; + int acha; + int adex; + int aint; + int artifactflag; + int asta; + int astr; + int attack; + int augrestrict; + int augslot1type; + int augslot1visible; + int augslot2type; + int augslot2visible; + int augslot3type; + int augslot3visible; + int augslot4type; + int augslot4visible; + int augslot5type; + int augslot5visible; + int augslot6type; + int augslot6visible; + int augtype; + int avoidance; + int awis; + int bagsize; + int bagslots; + int bagtype; + int bagwr; + int banedmgamt; + int banedmgraceamt; + int banedmgbody; + int banedmgrace; + int bardtype; + int bardvalue; + int book; + int casttime; + int casttime_; + std::string charmfile; + std::string charmfileid; + int classes; + int color; + std::string combateffects; + int extradmgskill; + int extradmgamt; + int price; + int cr; + int damage; + int damageshield; + int deity; + int delay; + int augdistiller; + int dotshielding; + int dr; + int clicktype; + int clicklevel2; + int elemdmgtype; + int elemdmgamt; + int endur; + int factionamt1; + int factionamt2; + int factionamt3; + int factionamt4; + int factionmod1; + int factionmod2; + int factionmod3; + int factionmod4; + std::string filename; + int focuseffect; + int fr; + int fvnodrop; + int haste; + int clicklevel; + int hp; + int regen; + int icon; + std::string idfile; + int itemclass; + int itemtype; + int ldonprice; + int ldontheme; + int ldonsold; + int light; + std::string lore; + int loregroup; + int magic; + int mana; + int manaregen; + int enduranceregen; + int material; + int herosforgemodel; + int maxcharges; + int mr; + int nodrop; + int norent; + int pendingloreflag; + int pr; + int procrate; + int races; + int range; + int reclevel; + int recskill; + int reqlevel; + float sellrate; + int shielding; + int size; + int skillmodtype; + int skillmodvalue; + int slots; + int clickeffect; + int spellshield; + int strikethrough; + int stunresist; + int summonedflag; + int tradeskills; + int favor; + int weight; + int UNK012; + int UNK013; + int benefitflag; + int UNK054; + int UNK059; + int booktype; + int recastdelay; + int recasttype; + int guildfavor; + int UNK123; + int UNK124; + int attuneable; + int nopet; + std::string updated; + std::string comment; + int UNK127; + int pointtype; + int potionbelt; + int potionbeltslots; + int stacksize; + int notransfer; + int stackable; + std::string UNK134; + int UNK137; + int proceffect; + int proctype; + int proclevel2; + int proclevel; + int UNK142; + int worneffect; + int worntype; + int wornlevel2; + int wornlevel; + int UNK147; + int focustype; + int focuslevel2; + int focuslevel; + int UNK152; + int scrolleffect; + int scrolltype; + int scrolllevel2; + int scrolllevel; + int UNK157; + std::string serialized; + std::string verified; + std::string serialization; + std::string source; + int UNK033; + std::string lorefile; + int UNK014; + int svcorruption; + int skillmodmax; + int UNK060; + int augslot1unk2; + int augslot2unk2; + int augslot3unk2; + int augslot4unk2; + int augslot5unk2; + int augslot6unk2; + int UNK120; + int UNK121; + int questitemflag; + std::string UNK132; + int clickunk5; + std::string clickunk6; + int clickunk7; + int procunk1; + int procunk2; + int procunk3; + int procunk4; + std::string procunk6; + int procunk7; + int wornunk1; + int wornunk2; + int wornunk3; + int wornunk4; + int wornunk5; + std::string wornunk6; + int wornunk7; + int focusunk1; + int focusunk2; + int focusunk3; + int focusunk4; + int focusunk5; + std::string focusunk6; + int focusunk7; + int scrollunk1; + int scrollunk2; + int scrollunk3; + int scrollunk4; + int scrollunk5; + std::string scrollunk6; + int scrollunk7; + int UNK193; + int purity; + int evoitem; + int evoid; + int evolvinglevel; + int evomax; + std::string clickname; + std::string procname; + std::string wornname; + std::string focusname; + std::string scrollname; + int dsmitigation; + int heroic_str; + int heroic_int; + int heroic_wis; + int heroic_agi; + int heroic_dex; + int heroic_sta; + int heroic_cha; + int heroic_pr; + int heroic_dr; + int heroic_fr; + int heroic_cr; + int heroic_mr; + int heroic_svcorrup; + int healamt; + int spelldmg; + int clairvoyance; + int backstabdmg; + std::string created; + int elitematerial; + int ldonsellbackrate; + int scriptfileid; + int expendablearrow; + int powersourcecapacity; + int bardeffect; + int bardeffecttype; + int bardlevel2; + int bardlevel; + int bardunk1; + int bardunk2; + int bardunk3; + int bardunk4; + int bardunk5; + std::string bardname; + int bardunk7; + int UNK214; + int subtype; + int UNK220; + int UNK221; + int heirloom; + int UNK223; + int UNK224; + int UNK225; + int UNK226; + int UNK227; + int UNK228; + int UNK229; + int UNK230; + int UNK231; + int UNK232; + int UNK233; + int UNK234; + int placeable; + int UNK236; + int UNK237; + int UNK238; + int UNK239; + int UNK240; + int UNK241; + int epicitem; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "minstatus", + "Name", + "aagi", + "ac", + "accuracy", + "acha", + "adex", + "aint", + "artifactflag", + "asta", + "astr", + "attack", + "augrestrict", + "augslot1type", + "augslot1visible", + "augslot2type", + "augslot2visible", + "augslot3type", + "augslot3visible", + "augslot4type", + "augslot4visible", + "augslot5type", + "augslot5visible", + "augslot6type", + "augslot6visible", + "augtype", + "avoidance", + "awis", + "bagsize", + "bagslots", + "bagtype", + "bagwr", + "banedmgamt", + "banedmgraceamt", + "banedmgbody", + "banedmgrace", + "bardtype", + "bardvalue", + "book", + "casttime", + "casttime_", + "charmfile", + "charmfileid", + "classes", + "color", + "combateffects", + "extradmgskill", + "extradmgamt", + "price", + "cr", + "damage", + "damageshield", + "deity", + "delay", + "augdistiller", + "dotshielding", + "dr", + "clicktype", + "clicklevel2", + "elemdmgtype", + "elemdmgamt", + "endur", + "factionamt1", + "factionamt2", + "factionamt3", + "factionamt4", + "factionmod1", + "factionmod2", + "factionmod3", + "factionmod4", + "filename", + "focuseffect", + "fr", + "fvnodrop", + "haste", + "clicklevel", + "hp", + "regen", + "icon", + "idfile", + "itemclass", + "itemtype", + "ldonprice", + "ldontheme", + "ldonsold", + "light", + "lore", + "loregroup", + "magic", + "mana", + "manaregen", + "enduranceregen", + "material", + "herosforgemodel", + "maxcharges", + "mr", + "nodrop", + "norent", + "pendingloreflag", + "pr", + "procrate", + "races", + "range", + "reclevel", + "recskill", + "reqlevel", + "sellrate", + "shielding", + "size", + "skillmodtype", + "skillmodvalue", + "slots", + "clickeffect", + "spellshield", + "strikethrough", + "stunresist", + "summonedflag", + "tradeskills", + "favor", + "weight", + "UNK012", + "UNK013", + "benefitflag", + "UNK054", + "UNK059", + "booktype", + "recastdelay", + "recasttype", + "guildfavor", + "UNK123", + "UNK124", + "attuneable", + "nopet", + "updated", + "comment", + "UNK127", + "pointtype", + "potionbelt", + "potionbeltslots", + "stacksize", + "notransfer", + "stackable", + "UNK134", + "UNK137", + "proceffect", + "proctype", + "proclevel2", + "proclevel", + "UNK142", + "worneffect", + "worntype", + "wornlevel2", + "wornlevel", + "UNK147", + "focustype", + "focuslevel2", + "focuslevel", + "UNK152", + "scrolleffect", + "scrolltype", + "scrolllevel2", + "scrolllevel", + "UNK157", + "serialized", + "verified", + "serialization", + "source", + "UNK033", + "lorefile", + "UNK014", + "svcorruption", + "skillmodmax", + "UNK060", + "augslot1unk2", + "augslot2unk2", + "augslot3unk2", + "augslot4unk2", + "augslot5unk2", + "augslot6unk2", + "UNK120", + "UNK121", + "questitemflag", + "UNK132", + "clickunk5", + "clickunk6", + "clickunk7", + "procunk1", + "procunk2", + "procunk3", + "procunk4", + "procunk6", + "procunk7", + "wornunk1", + "wornunk2", + "wornunk3", + "wornunk4", + "wornunk5", + "wornunk6", + "wornunk7", + "focusunk1", + "focusunk2", + "focusunk3", + "focusunk4", + "focusunk5", + "focusunk6", + "focusunk7", + "scrollunk1", + "scrollunk2", + "scrollunk3", + "scrollunk4", + "scrollunk5", + "scrollunk6", + "scrollunk7", + "UNK193", + "purity", + "evoitem", + "evoid", + "evolvinglevel", + "evomax", + "clickname", + "procname", + "wornname", + "focusname", + "scrollname", + "dsmitigation", + "heroic_str", + "heroic_int", + "heroic_wis", + "heroic_agi", + "heroic_dex", + "heroic_sta", + "heroic_cha", + "heroic_pr", + "heroic_dr", + "heroic_fr", + "heroic_cr", + "heroic_mr", + "heroic_svcorrup", + "healamt", + "spelldmg", + "clairvoyance", + "backstabdmg", + "created", + "elitematerial", + "ldonsellbackrate", + "scriptfileid", + "expendablearrow", + "powersourcecapacity", + "bardeffect", + "bardeffecttype", + "bardlevel2", + "bardlevel", + "bardunk1", + "bardunk2", + "bardunk3", + "bardunk4", + "bardunk5", + "bardname", + "bardunk7", + "UNK214", + "subtype", + "UNK220", + "UNK221", + "heirloom", + "UNK223", + "UNK224", + "UNK225", + "UNK226", + "UNK227", + "UNK228", + "UNK229", + "UNK230", + "UNK231", + "UNK232", + "UNK233", + "UNK234", + "placeable", + "UNK236", + "UNK237", + "UNK238", + "UNK239", + "UNK240", + "UNK241", + "epicitem", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("items"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Items NewEntity() + { + Items entry{}; + + entry.id = 0; + entry.minstatus = 0; + entry.Name = ""; + entry.aagi = 0; + entry.ac = 0; + entry.accuracy = 0; + entry.acha = 0; + entry.adex = 0; + entry.aint = 0; + entry.artifactflag = 0; + entry.asta = 0; + entry.astr = 0; + entry.attack = 0; + entry.augrestrict = 0; + entry.augslot1type = 0; + entry.augslot1visible = 0; + entry.augslot2type = 0; + entry.augslot2visible = 0; + entry.augslot3type = 0; + entry.augslot3visible = 0; + entry.augslot4type = 0; + entry.augslot4visible = 0; + entry.augslot5type = 0; + entry.augslot5visible = 0; + entry.augslot6type = 0; + entry.augslot6visible = 0; + entry.augtype = 0; + entry.avoidance = 0; + entry.awis = 0; + entry.bagsize = 0; + entry.bagslots = 0; + entry.bagtype = 0; + entry.bagwr = 0; + entry.banedmgamt = 0; + entry.banedmgraceamt = 0; + entry.banedmgbody = 0; + entry.banedmgrace = 0; + entry.bardtype = 0; + entry.bardvalue = 0; + entry.book = 0; + entry.casttime = 0; + entry.casttime_ = 0; + entry.charmfile = ""; + entry.charmfileid = ""; + entry.classes = 0; + entry.color = 0; + entry.combateffects = ""; + entry.extradmgskill = 0; + entry.extradmgamt = 0; + entry.price = 0; + entry.cr = 0; + entry.damage = 0; + entry.damageshield = 0; + entry.deity = 0; + entry.delay = 0; + entry.augdistiller = 0; + entry.dotshielding = 0; + entry.dr = 0; + entry.clicktype = 0; + entry.clicklevel2 = 0; + entry.elemdmgtype = 0; + entry.elemdmgamt = 0; + entry.endur = 0; + entry.factionamt1 = 0; + entry.factionamt2 = 0; + entry.factionamt3 = 0; + entry.factionamt4 = 0; + entry.factionmod1 = 0; + entry.factionmod2 = 0; + entry.factionmod3 = 0; + entry.factionmod4 = 0; + entry.filename = ""; + entry.focuseffect = 0; + entry.fr = 0; + entry.fvnodrop = 0; + entry.haste = 0; + entry.clicklevel = 0; + entry.hp = 0; + entry.regen = 0; + entry.icon = 0; + entry.idfile = ""; + entry.itemclass = 0; + entry.itemtype = 0; + entry.ldonprice = 0; + entry.ldontheme = 0; + entry.ldonsold = 0; + entry.light = 0; + entry.lore = ""; + entry.loregroup = 0; + entry.magic = 0; + entry.mana = 0; + entry.manaregen = 0; + entry.enduranceregen = 0; + entry.material = 0; + entry.herosforgemodel = 0; + entry.maxcharges = 0; + entry.mr = 0; + entry.nodrop = 0; + entry.norent = 0; + entry.pendingloreflag = 0; + entry.pr = 0; + entry.procrate = 0; + entry.races = 0; + entry.range = 0; + entry.reclevel = 0; + entry.recskill = 0; + entry.reqlevel = 0; + entry.sellrate = 0; + entry.shielding = 0; + entry.size = 0; + entry.skillmodtype = 0; + entry.skillmodvalue = 0; + entry.slots = 0; + entry.clickeffect = 0; + entry.spellshield = 0; + entry.strikethrough = 0; + entry.stunresist = 0; + entry.summonedflag = 0; + entry.tradeskills = 0; + entry.favor = 0; + entry.weight = 0; + entry.UNK012 = 0; + entry.UNK013 = 0; + entry.benefitflag = 0; + entry.UNK054 = 0; + entry.UNK059 = 0; + entry.booktype = 0; + entry.recastdelay = 0; + entry.recasttype = 0; + entry.guildfavor = 0; + entry.UNK123 = 0; + entry.UNK124 = 0; + entry.attuneable = 0; + entry.nopet = 0; + entry.updated = "0000-00-00 00:00:00"; + entry.comment = ""; + entry.UNK127 = 0; + entry.pointtype = 0; + entry.potionbelt = 0; + entry.potionbeltslots = 0; + entry.stacksize = 0; + entry.notransfer = 0; + entry.stackable = 0; + entry.UNK134 = ""; + entry.UNK137 = 0; + entry.proceffect = 0; + entry.proctype = 0; + entry.proclevel2 = 0; + entry.proclevel = 0; + entry.UNK142 = 0; + entry.worneffect = 0; + entry.worntype = 0; + entry.wornlevel2 = 0; + entry.wornlevel = 0; + entry.UNK147 = 0; + entry.focustype = 0; + entry.focuslevel2 = 0; + entry.focuslevel = 0; + entry.UNK152 = 0; + entry.scrolleffect = 0; + entry.scrolltype = 0; + entry.scrolllevel2 = 0; + entry.scrolllevel = 0; + entry.UNK157 = 0; + entry.serialized = 0; + entry.verified = 0; + entry.serialization = ""; + entry.source = ""; + entry.UNK033 = 0; + entry.lorefile = ""; + entry.UNK014 = 0; + entry.svcorruption = 0; + entry.skillmodmax = 0; + entry.UNK060 = 0; + entry.augslot1unk2 = 0; + entry.augslot2unk2 = 0; + entry.augslot3unk2 = 0; + entry.augslot4unk2 = 0; + entry.augslot5unk2 = 0; + entry.augslot6unk2 = 0; + entry.UNK120 = 0; + entry.UNK121 = 0; + entry.questitemflag = 0; + entry.UNK132 = ""; + entry.clickunk5 = 0; + entry.clickunk6 = ""; + entry.clickunk7 = 0; + entry.procunk1 = 0; + entry.procunk2 = 0; + entry.procunk3 = 0; + entry.procunk4 = 0; + entry.procunk6 = ""; + entry.procunk7 = 0; + entry.wornunk1 = 0; + entry.wornunk2 = 0; + entry.wornunk3 = 0; + entry.wornunk4 = 0; + entry.wornunk5 = 0; + entry.wornunk6 = ""; + entry.wornunk7 = 0; + entry.focusunk1 = 0; + entry.focusunk2 = 0; + entry.focusunk3 = 0; + entry.focusunk4 = 0; + entry.focusunk5 = 0; + entry.focusunk6 = ""; + entry.focusunk7 = 0; + entry.scrollunk1 = 0; + entry.scrollunk2 = 0; + entry.scrollunk3 = 0; + entry.scrollunk4 = 0; + entry.scrollunk5 = 0; + entry.scrollunk6 = ""; + entry.scrollunk7 = 0; + entry.UNK193 = 0; + entry.purity = 0; + entry.evoitem = 0; + entry.evoid = 0; + entry.evolvinglevel = 0; + entry.evomax = 0; + entry.clickname = ""; + entry.procname = ""; + entry.wornname = ""; + entry.focusname = ""; + entry.scrollname = ""; + entry.dsmitigation = 0; + entry.heroic_str = 0; + entry.heroic_int = 0; + entry.heroic_wis = 0; + entry.heroic_agi = 0; + entry.heroic_dex = 0; + entry.heroic_sta = 0; + entry.heroic_cha = 0; + entry.heroic_pr = 0; + entry.heroic_dr = 0; + entry.heroic_fr = 0; + entry.heroic_cr = 0; + entry.heroic_mr = 0; + entry.heroic_svcorrup = 0; + entry.healamt = 0; + entry.spelldmg = 0; + entry.clairvoyance = 0; + entry.backstabdmg = 0; + entry.created = ""; + entry.elitematerial = 0; + entry.ldonsellbackrate = 0; + entry.scriptfileid = 0; + entry.expendablearrow = 0; + entry.powersourcecapacity = 0; + entry.bardeffect = 0; + entry.bardeffecttype = 0; + entry.bardlevel2 = 0; + entry.bardlevel = 0; + entry.bardunk1 = 0; + entry.bardunk2 = 0; + entry.bardunk3 = 0; + entry.bardunk4 = 0; + entry.bardunk5 = 0; + entry.bardname = ""; + entry.bardunk7 = 0; + entry.UNK214 = 0; + entry.subtype = 0; + entry.UNK220 = 0; + entry.UNK221 = 0; + entry.heirloom = 0; + entry.UNK223 = 0; + entry.UNK224 = 0; + entry.UNK225 = 0; + entry.UNK226 = 0; + entry.UNK227 = 0; + entry.UNK228 = 0; + entry.UNK229 = 0; + entry.UNK230 = 0; + entry.UNK231 = 0; + entry.UNK232 = 0; + entry.UNK233 = 0; + entry.UNK234 = 0; + entry.placeable = 0; + entry.UNK236 = 0; + entry.UNK237 = 0; + entry.UNK238 = 0; + entry.UNK239 = 0; + entry.UNK240 = 0; + entry.UNK241 = 0; + entry.epicitem = 0; + + return entry; + } + + static Items GetItemsEntry( + const std::vector &itemss, + int items_id + ) + { + for (auto &items : itemss) { + if (items.id == items_id) { + return items; + } + } + + return NewEntity(); + } + + static Items FindOne( + Database& db, + int items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + items_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Items entry{}; + + entry.id = atoi(row[0]); + entry.minstatus = atoi(row[1]); + entry.Name = row[2] ? row[2] : ""; + entry.aagi = atoi(row[3]); + entry.ac = atoi(row[4]); + entry.accuracy = atoi(row[5]); + entry.acha = atoi(row[6]); + entry.adex = atoi(row[7]); + entry.aint = atoi(row[8]); + entry.artifactflag = atoi(row[9]); + entry.asta = atoi(row[10]); + entry.astr = atoi(row[11]); + entry.attack = atoi(row[12]); + entry.augrestrict = atoi(row[13]); + entry.augslot1type = atoi(row[14]); + entry.augslot1visible = atoi(row[15]); + entry.augslot2type = atoi(row[16]); + entry.augslot2visible = atoi(row[17]); + entry.augslot3type = atoi(row[18]); + entry.augslot3visible = atoi(row[19]); + entry.augslot4type = atoi(row[20]); + entry.augslot4visible = atoi(row[21]); + entry.augslot5type = atoi(row[22]); + entry.augslot5visible = atoi(row[23]); + entry.augslot6type = atoi(row[24]); + entry.augslot6visible = atoi(row[25]); + entry.augtype = atoi(row[26]); + entry.avoidance = atoi(row[27]); + entry.awis = atoi(row[28]); + entry.bagsize = atoi(row[29]); + entry.bagslots = atoi(row[30]); + entry.bagtype = atoi(row[31]); + entry.bagwr = atoi(row[32]); + entry.banedmgamt = atoi(row[33]); + entry.banedmgraceamt = atoi(row[34]); + entry.banedmgbody = atoi(row[35]); + entry.banedmgrace = atoi(row[36]); + entry.bardtype = atoi(row[37]); + entry.bardvalue = atoi(row[38]); + entry.book = atoi(row[39]); + entry.casttime = atoi(row[40]); + entry.casttime_ = atoi(row[41]); + entry.charmfile = row[42] ? row[42] : ""; + entry.charmfileid = row[43] ? row[43] : ""; + entry.classes = atoi(row[44]); + entry.color = atoi(row[45]); + entry.combateffects = row[46] ? row[46] : ""; + entry.extradmgskill = atoi(row[47]); + entry.extradmgamt = atoi(row[48]); + entry.price = atoi(row[49]); + entry.cr = atoi(row[50]); + entry.damage = atoi(row[51]); + entry.damageshield = atoi(row[52]); + entry.deity = atoi(row[53]); + entry.delay = atoi(row[54]); + entry.augdistiller = atoi(row[55]); + entry.dotshielding = atoi(row[56]); + entry.dr = atoi(row[57]); + entry.clicktype = atoi(row[58]); + entry.clicklevel2 = atoi(row[59]); + entry.elemdmgtype = atoi(row[60]); + entry.elemdmgamt = atoi(row[61]); + entry.endur = atoi(row[62]); + entry.factionamt1 = atoi(row[63]); + entry.factionamt2 = atoi(row[64]); + entry.factionamt3 = atoi(row[65]); + entry.factionamt4 = atoi(row[66]); + entry.factionmod1 = atoi(row[67]); + entry.factionmod2 = atoi(row[68]); + entry.factionmod3 = atoi(row[69]); + entry.factionmod4 = atoi(row[70]); + entry.filename = row[71] ? row[71] : ""; + entry.focuseffect = atoi(row[72]); + entry.fr = atoi(row[73]); + entry.fvnodrop = atoi(row[74]); + entry.haste = atoi(row[75]); + entry.clicklevel = atoi(row[76]); + entry.hp = atoi(row[77]); + entry.regen = atoi(row[78]); + entry.icon = atoi(row[79]); + entry.idfile = row[80] ? row[80] : ""; + entry.itemclass = atoi(row[81]); + entry.itemtype = atoi(row[82]); + entry.ldonprice = atoi(row[83]); + entry.ldontheme = atoi(row[84]); + entry.ldonsold = atoi(row[85]); + entry.light = atoi(row[86]); + entry.lore = row[87] ? row[87] : ""; + entry.loregroup = atoi(row[88]); + entry.magic = atoi(row[89]); + entry.mana = atoi(row[90]); + entry.manaregen = atoi(row[91]); + entry.enduranceregen = atoi(row[92]); + entry.material = atoi(row[93]); + entry.herosforgemodel = atoi(row[94]); + entry.maxcharges = atoi(row[95]); + entry.mr = atoi(row[96]); + entry.nodrop = atoi(row[97]); + entry.norent = atoi(row[98]); + entry.pendingloreflag = atoi(row[99]); + entry.pr = atoi(row[100]); + entry.procrate = atoi(row[101]); + entry.races = atoi(row[102]); + entry.range = atoi(row[103]); + entry.reclevel = atoi(row[104]); + entry.recskill = atoi(row[105]); + entry.reqlevel = atoi(row[106]); + entry.sellrate = static_cast(atof(row[107])); + entry.shielding = atoi(row[108]); + entry.size = atoi(row[109]); + entry.skillmodtype = atoi(row[110]); + entry.skillmodvalue = atoi(row[111]); + entry.slots = atoi(row[112]); + entry.clickeffect = atoi(row[113]); + entry.spellshield = atoi(row[114]); + entry.strikethrough = atoi(row[115]); + entry.stunresist = atoi(row[116]); + entry.summonedflag = atoi(row[117]); + entry.tradeskills = atoi(row[118]); + entry.favor = atoi(row[119]); + entry.weight = atoi(row[120]); + entry.UNK012 = atoi(row[121]); + entry.UNK013 = atoi(row[122]); + entry.benefitflag = atoi(row[123]); + entry.UNK054 = atoi(row[124]); + entry.UNK059 = atoi(row[125]); + entry.booktype = atoi(row[126]); + entry.recastdelay = atoi(row[127]); + entry.recasttype = atoi(row[128]); + entry.guildfavor = atoi(row[129]); + entry.UNK123 = atoi(row[130]); + entry.UNK124 = atoi(row[131]); + entry.attuneable = atoi(row[132]); + entry.nopet = atoi(row[133]); + entry.updated = row[134] ? row[134] : ""; + entry.comment = row[135] ? row[135] : ""; + entry.UNK127 = atoi(row[136]); + entry.pointtype = atoi(row[137]); + entry.potionbelt = atoi(row[138]); + entry.potionbeltslots = atoi(row[139]); + entry.stacksize = atoi(row[140]); + entry.notransfer = atoi(row[141]); + entry.stackable = atoi(row[142]); + entry.UNK134 = row[143] ? row[143] : ""; + entry.UNK137 = atoi(row[144]); + entry.proceffect = atoi(row[145]); + entry.proctype = atoi(row[146]); + entry.proclevel2 = atoi(row[147]); + entry.proclevel = atoi(row[148]); + entry.UNK142 = atoi(row[149]); + entry.worneffect = atoi(row[150]); + entry.worntype = atoi(row[151]); + entry.wornlevel2 = atoi(row[152]); + entry.wornlevel = atoi(row[153]); + entry.UNK147 = atoi(row[154]); + entry.focustype = atoi(row[155]); + entry.focuslevel2 = atoi(row[156]); + entry.focuslevel = atoi(row[157]); + entry.UNK152 = atoi(row[158]); + entry.scrolleffect = atoi(row[159]); + entry.scrolltype = atoi(row[160]); + entry.scrolllevel2 = atoi(row[161]); + entry.scrolllevel = atoi(row[162]); + entry.UNK157 = atoi(row[163]); + entry.serialized = row[164] ? row[164] : ""; + entry.verified = row[165] ? row[165] : ""; + entry.serialization = row[166] ? row[166] : ""; + entry.source = row[167] ? row[167] : ""; + entry.UNK033 = atoi(row[168]); + entry.lorefile = row[169] ? row[169] : ""; + entry.UNK014 = atoi(row[170]); + entry.svcorruption = atoi(row[171]); + entry.skillmodmax = atoi(row[172]); + entry.UNK060 = atoi(row[173]); + entry.augslot1unk2 = atoi(row[174]); + entry.augslot2unk2 = atoi(row[175]); + entry.augslot3unk2 = atoi(row[176]); + entry.augslot4unk2 = atoi(row[177]); + entry.augslot5unk2 = atoi(row[178]); + entry.augslot6unk2 = atoi(row[179]); + entry.UNK120 = atoi(row[180]); + entry.UNK121 = atoi(row[181]); + entry.questitemflag = atoi(row[182]); + entry.UNK132 = row[183] ? row[183] : ""; + entry.clickunk5 = atoi(row[184]); + entry.clickunk6 = row[185] ? row[185] : ""; + entry.clickunk7 = atoi(row[186]); + entry.procunk1 = atoi(row[187]); + entry.procunk2 = atoi(row[188]); + entry.procunk3 = atoi(row[189]); + entry.procunk4 = atoi(row[190]); + entry.procunk6 = row[191] ? row[191] : ""; + entry.procunk7 = atoi(row[192]); + entry.wornunk1 = atoi(row[193]); + entry.wornunk2 = atoi(row[194]); + entry.wornunk3 = atoi(row[195]); + entry.wornunk4 = atoi(row[196]); + entry.wornunk5 = atoi(row[197]); + entry.wornunk6 = row[198] ? row[198] : ""; + entry.wornunk7 = atoi(row[199]); + entry.focusunk1 = atoi(row[200]); + entry.focusunk2 = atoi(row[201]); + entry.focusunk3 = atoi(row[202]); + entry.focusunk4 = atoi(row[203]); + entry.focusunk5 = atoi(row[204]); + entry.focusunk6 = row[205] ? row[205] : ""; + entry.focusunk7 = atoi(row[206]); + entry.scrollunk1 = atoi(row[207]); + entry.scrollunk2 = atoi(row[208]); + entry.scrollunk3 = atoi(row[209]); + entry.scrollunk4 = atoi(row[210]); + entry.scrollunk5 = atoi(row[211]); + entry.scrollunk6 = row[212] ? row[212] : ""; + entry.scrollunk7 = atoi(row[213]); + entry.UNK193 = atoi(row[214]); + entry.purity = atoi(row[215]); + entry.evoitem = atoi(row[216]); + entry.evoid = atoi(row[217]); + entry.evolvinglevel = atoi(row[218]); + entry.evomax = atoi(row[219]); + entry.clickname = row[220] ? row[220] : ""; + entry.procname = row[221] ? row[221] : ""; + entry.wornname = row[222] ? row[222] : ""; + entry.focusname = row[223] ? row[223] : ""; + entry.scrollname = row[224] ? row[224] : ""; + entry.dsmitigation = atoi(row[225]); + entry.heroic_str = atoi(row[226]); + entry.heroic_int = atoi(row[227]); + entry.heroic_wis = atoi(row[228]); + entry.heroic_agi = atoi(row[229]); + entry.heroic_dex = atoi(row[230]); + entry.heroic_sta = atoi(row[231]); + entry.heroic_cha = atoi(row[232]); + entry.heroic_pr = atoi(row[233]); + entry.heroic_dr = atoi(row[234]); + entry.heroic_fr = atoi(row[235]); + entry.heroic_cr = atoi(row[236]); + entry.heroic_mr = atoi(row[237]); + entry.heroic_svcorrup = atoi(row[238]); + entry.healamt = atoi(row[239]); + entry.spelldmg = atoi(row[240]); + entry.clairvoyance = atoi(row[241]); + entry.backstabdmg = atoi(row[242]); + entry.created = row[243] ? row[243] : ""; + entry.elitematerial = atoi(row[244]); + entry.ldonsellbackrate = atoi(row[245]); + entry.scriptfileid = atoi(row[246]); + entry.expendablearrow = atoi(row[247]); + entry.powersourcecapacity = atoi(row[248]); + entry.bardeffect = atoi(row[249]); + entry.bardeffecttype = atoi(row[250]); + entry.bardlevel2 = atoi(row[251]); + entry.bardlevel = atoi(row[252]); + entry.bardunk1 = atoi(row[253]); + entry.bardunk2 = atoi(row[254]); + entry.bardunk3 = atoi(row[255]); + entry.bardunk4 = atoi(row[256]); + entry.bardunk5 = atoi(row[257]); + entry.bardname = row[258] ? row[258] : ""; + entry.bardunk7 = atoi(row[259]); + entry.UNK214 = atoi(row[260]); + entry.subtype = atoi(row[261]); + entry.UNK220 = atoi(row[262]); + entry.UNK221 = atoi(row[263]); + entry.heirloom = atoi(row[264]); + entry.UNK223 = atoi(row[265]); + entry.UNK224 = atoi(row[266]); + entry.UNK225 = atoi(row[267]); + entry.UNK226 = atoi(row[268]); + entry.UNK227 = atoi(row[269]); + entry.UNK228 = atoi(row[270]); + entry.UNK229 = atoi(row[271]); + entry.UNK230 = atoi(row[272]); + entry.UNK231 = atoi(row[273]); + entry.UNK232 = atoi(row[274]); + entry.UNK233 = atoi(row[275]); + entry.UNK234 = atoi(row[276]); + entry.placeable = atoi(row[277]); + entry.UNK236 = atoi(row[278]); + entry.UNK237 = atoi(row[279]); + entry.UNK238 = atoi(row[280]); + entry.UNK239 = atoi(row[281]); + entry.UNK240 = atoi(row[282]); + entry.UNK241 = atoi(row[283]); + entry.epicitem = atoi(row[284]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + items_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Items items_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(items_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(items_entry.minstatus)); + update_values.push_back(columns[2] + " = '" + EscapeString(items_entry.Name) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(items_entry.aagi)); + update_values.push_back(columns[4] + " = " + std::to_string(items_entry.ac)); + update_values.push_back(columns[5] + " = " + std::to_string(items_entry.accuracy)); + update_values.push_back(columns[6] + " = " + std::to_string(items_entry.acha)); + update_values.push_back(columns[7] + " = " + std::to_string(items_entry.adex)); + update_values.push_back(columns[8] + " = " + std::to_string(items_entry.aint)); + update_values.push_back(columns[9] + " = " + std::to_string(items_entry.artifactflag)); + update_values.push_back(columns[10] + " = " + std::to_string(items_entry.asta)); + update_values.push_back(columns[11] + " = " + std::to_string(items_entry.astr)); + update_values.push_back(columns[12] + " = " + std::to_string(items_entry.attack)); + update_values.push_back(columns[13] + " = " + std::to_string(items_entry.augrestrict)); + update_values.push_back(columns[14] + " = " + std::to_string(items_entry.augslot1type)); + update_values.push_back(columns[15] + " = " + std::to_string(items_entry.augslot1visible)); + update_values.push_back(columns[16] + " = " + std::to_string(items_entry.augslot2type)); + update_values.push_back(columns[17] + " = " + std::to_string(items_entry.augslot2visible)); + update_values.push_back(columns[18] + " = " + std::to_string(items_entry.augslot3type)); + update_values.push_back(columns[19] + " = " + std::to_string(items_entry.augslot3visible)); + update_values.push_back(columns[20] + " = " + std::to_string(items_entry.augslot4type)); + update_values.push_back(columns[21] + " = " + std::to_string(items_entry.augslot4visible)); + update_values.push_back(columns[22] + " = " + std::to_string(items_entry.augslot5type)); + update_values.push_back(columns[23] + " = " + std::to_string(items_entry.augslot5visible)); + update_values.push_back(columns[24] + " = " + std::to_string(items_entry.augslot6type)); + update_values.push_back(columns[25] + " = " + std::to_string(items_entry.augslot6visible)); + update_values.push_back(columns[26] + " = " + std::to_string(items_entry.augtype)); + update_values.push_back(columns[27] + " = " + std::to_string(items_entry.avoidance)); + update_values.push_back(columns[28] + " = " + std::to_string(items_entry.awis)); + update_values.push_back(columns[29] + " = " + std::to_string(items_entry.bagsize)); + update_values.push_back(columns[30] + " = " + std::to_string(items_entry.bagslots)); + update_values.push_back(columns[31] + " = " + std::to_string(items_entry.bagtype)); + update_values.push_back(columns[32] + " = " + std::to_string(items_entry.bagwr)); + update_values.push_back(columns[33] + " = " + std::to_string(items_entry.banedmgamt)); + update_values.push_back(columns[34] + " = " + std::to_string(items_entry.banedmgraceamt)); + update_values.push_back(columns[35] + " = " + std::to_string(items_entry.banedmgbody)); + update_values.push_back(columns[36] + " = " + std::to_string(items_entry.banedmgrace)); + update_values.push_back(columns[37] + " = " + std::to_string(items_entry.bardtype)); + update_values.push_back(columns[38] + " = " + std::to_string(items_entry.bardvalue)); + update_values.push_back(columns[39] + " = " + std::to_string(items_entry.book)); + update_values.push_back(columns[40] + " = " + std::to_string(items_entry.casttime)); + update_values.push_back(columns[41] + " = " + std::to_string(items_entry.casttime_)); + update_values.push_back(columns[42] + " = '" + EscapeString(items_entry.charmfile) + "'"); + update_values.push_back(columns[43] + " = '" + EscapeString(items_entry.charmfileid) + "'"); + update_values.push_back(columns[44] + " = " + std::to_string(items_entry.classes)); + update_values.push_back(columns[45] + " = " + std::to_string(items_entry.color)); + update_values.push_back(columns[46] + " = '" + EscapeString(items_entry.combateffects) + "'"); + update_values.push_back(columns[47] + " = " + std::to_string(items_entry.extradmgskill)); + update_values.push_back(columns[48] + " = " + std::to_string(items_entry.extradmgamt)); + update_values.push_back(columns[49] + " = " + std::to_string(items_entry.price)); + update_values.push_back(columns[50] + " = " + std::to_string(items_entry.cr)); + update_values.push_back(columns[51] + " = " + std::to_string(items_entry.damage)); + update_values.push_back(columns[52] + " = " + std::to_string(items_entry.damageshield)); + update_values.push_back(columns[53] + " = " + std::to_string(items_entry.deity)); + update_values.push_back(columns[54] + " = " + std::to_string(items_entry.delay)); + update_values.push_back(columns[55] + " = " + std::to_string(items_entry.augdistiller)); + update_values.push_back(columns[56] + " = " + std::to_string(items_entry.dotshielding)); + update_values.push_back(columns[57] + " = " + std::to_string(items_entry.dr)); + update_values.push_back(columns[58] + " = " + std::to_string(items_entry.clicktype)); + update_values.push_back(columns[59] + " = " + std::to_string(items_entry.clicklevel2)); + update_values.push_back(columns[60] + " = " + std::to_string(items_entry.elemdmgtype)); + update_values.push_back(columns[61] + " = " + std::to_string(items_entry.elemdmgamt)); + update_values.push_back(columns[62] + " = " + std::to_string(items_entry.endur)); + update_values.push_back(columns[63] + " = " + std::to_string(items_entry.factionamt1)); + update_values.push_back(columns[64] + " = " + std::to_string(items_entry.factionamt2)); + update_values.push_back(columns[65] + " = " + std::to_string(items_entry.factionamt3)); + update_values.push_back(columns[66] + " = " + std::to_string(items_entry.factionamt4)); + update_values.push_back(columns[67] + " = " + std::to_string(items_entry.factionmod1)); + update_values.push_back(columns[68] + " = " + std::to_string(items_entry.factionmod2)); + update_values.push_back(columns[69] + " = " + std::to_string(items_entry.factionmod3)); + update_values.push_back(columns[70] + " = " + std::to_string(items_entry.factionmod4)); + update_values.push_back(columns[71] + " = '" + EscapeString(items_entry.filename) + "'"); + update_values.push_back(columns[72] + " = " + std::to_string(items_entry.focuseffect)); + update_values.push_back(columns[73] + " = " + std::to_string(items_entry.fr)); + update_values.push_back(columns[74] + " = " + std::to_string(items_entry.fvnodrop)); + update_values.push_back(columns[75] + " = " + std::to_string(items_entry.haste)); + update_values.push_back(columns[76] + " = " + std::to_string(items_entry.clicklevel)); + update_values.push_back(columns[77] + " = " + std::to_string(items_entry.hp)); + update_values.push_back(columns[78] + " = " + std::to_string(items_entry.regen)); + update_values.push_back(columns[79] + " = " + std::to_string(items_entry.icon)); + update_values.push_back(columns[80] + " = '" + EscapeString(items_entry.idfile) + "'"); + update_values.push_back(columns[81] + " = " + std::to_string(items_entry.itemclass)); + update_values.push_back(columns[82] + " = " + std::to_string(items_entry.itemtype)); + update_values.push_back(columns[83] + " = " + std::to_string(items_entry.ldonprice)); + update_values.push_back(columns[84] + " = " + std::to_string(items_entry.ldontheme)); + update_values.push_back(columns[85] + " = " + std::to_string(items_entry.ldonsold)); + update_values.push_back(columns[86] + " = " + std::to_string(items_entry.light)); + update_values.push_back(columns[87] + " = '" + EscapeString(items_entry.lore) + "'"); + update_values.push_back(columns[88] + " = " + std::to_string(items_entry.loregroup)); + update_values.push_back(columns[89] + " = " + std::to_string(items_entry.magic)); + update_values.push_back(columns[90] + " = " + std::to_string(items_entry.mana)); + update_values.push_back(columns[91] + " = " + std::to_string(items_entry.manaregen)); + update_values.push_back(columns[92] + " = " + std::to_string(items_entry.enduranceregen)); + update_values.push_back(columns[93] + " = " + std::to_string(items_entry.material)); + update_values.push_back(columns[94] + " = " + std::to_string(items_entry.herosforgemodel)); + update_values.push_back(columns[95] + " = " + std::to_string(items_entry.maxcharges)); + update_values.push_back(columns[96] + " = " + std::to_string(items_entry.mr)); + update_values.push_back(columns[97] + " = " + std::to_string(items_entry.nodrop)); + update_values.push_back(columns[98] + " = " + std::to_string(items_entry.norent)); + update_values.push_back(columns[99] + " = " + std::to_string(items_entry.pendingloreflag)); + update_values.push_back(columns[100] + " = " + std::to_string(items_entry.pr)); + update_values.push_back(columns[101] + " = " + std::to_string(items_entry.procrate)); + update_values.push_back(columns[102] + " = " + std::to_string(items_entry.races)); + update_values.push_back(columns[103] + " = " + std::to_string(items_entry.range)); + update_values.push_back(columns[104] + " = " + std::to_string(items_entry.reclevel)); + update_values.push_back(columns[105] + " = " + std::to_string(items_entry.recskill)); + update_values.push_back(columns[106] + " = " + std::to_string(items_entry.reqlevel)); + update_values.push_back(columns[107] + " = " + std::to_string(items_entry.sellrate)); + update_values.push_back(columns[108] + " = " + std::to_string(items_entry.shielding)); + update_values.push_back(columns[109] + " = " + std::to_string(items_entry.size)); + update_values.push_back(columns[110] + " = " + std::to_string(items_entry.skillmodtype)); + update_values.push_back(columns[111] + " = " + std::to_string(items_entry.skillmodvalue)); + update_values.push_back(columns[112] + " = " + std::to_string(items_entry.slots)); + update_values.push_back(columns[113] + " = " + std::to_string(items_entry.clickeffect)); + update_values.push_back(columns[114] + " = " + std::to_string(items_entry.spellshield)); + update_values.push_back(columns[115] + " = " + std::to_string(items_entry.strikethrough)); + update_values.push_back(columns[116] + " = " + std::to_string(items_entry.stunresist)); + update_values.push_back(columns[117] + " = " + std::to_string(items_entry.summonedflag)); + update_values.push_back(columns[118] + " = " + std::to_string(items_entry.tradeskills)); + update_values.push_back(columns[119] + " = " + std::to_string(items_entry.favor)); + update_values.push_back(columns[120] + " = " + std::to_string(items_entry.weight)); + update_values.push_back(columns[121] + " = " + std::to_string(items_entry.UNK012)); + update_values.push_back(columns[122] + " = " + std::to_string(items_entry.UNK013)); + update_values.push_back(columns[123] + " = " + std::to_string(items_entry.benefitflag)); + update_values.push_back(columns[124] + " = " + std::to_string(items_entry.UNK054)); + update_values.push_back(columns[125] + " = " + std::to_string(items_entry.UNK059)); + update_values.push_back(columns[126] + " = " + std::to_string(items_entry.booktype)); + update_values.push_back(columns[127] + " = " + std::to_string(items_entry.recastdelay)); + update_values.push_back(columns[128] + " = " + std::to_string(items_entry.recasttype)); + update_values.push_back(columns[129] + " = " + std::to_string(items_entry.guildfavor)); + update_values.push_back(columns[130] + " = " + std::to_string(items_entry.UNK123)); + update_values.push_back(columns[131] + " = " + std::to_string(items_entry.UNK124)); + update_values.push_back(columns[132] + " = " + std::to_string(items_entry.attuneable)); + update_values.push_back(columns[133] + " = " + std::to_string(items_entry.nopet)); + update_values.push_back(columns[134] + " = '" + EscapeString(items_entry.updated) + "'"); + update_values.push_back(columns[135] + " = '" + EscapeString(items_entry.comment) + "'"); + update_values.push_back(columns[136] + " = " + std::to_string(items_entry.UNK127)); + update_values.push_back(columns[137] + " = " + std::to_string(items_entry.pointtype)); + update_values.push_back(columns[138] + " = " + std::to_string(items_entry.potionbelt)); + update_values.push_back(columns[139] + " = " + std::to_string(items_entry.potionbeltslots)); + update_values.push_back(columns[140] + " = " + std::to_string(items_entry.stacksize)); + update_values.push_back(columns[141] + " = " + std::to_string(items_entry.notransfer)); + update_values.push_back(columns[142] + " = " + std::to_string(items_entry.stackable)); + update_values.push_back(columns[143] + " = '" + EscapeString(items_entry.UNK134) + "'"); + update_values.push_back(columns[144] + " = " + std::to_string(items_entry.UNK137)); + update_values.push_back(columns[145] + " = " + std::to_string(items_entry.proceffect)); + update_values.push_back(columns[146] + " = " + std::to_string(items_entry.proctype)); + update_values.push_back(columns[147] + " = " + std::to_string(items_entry.proclevel2)); + update_values.push_back(columns[148] + " = " + std::to_string(items_entry.proclevel)); + update_values.push_back(columns[149] + " = " + std::to_string(items_entry.UNK142)); + update_values.push_back(columns[150] + " = " + std::to_string(items_entry.worneffect)); + update_values.push_back(columns[151] + " = " + std::to_string(items_entry.worntype)); + update_values.push_back(columns[152] + " = " + std::to_string(items_entry.wornlevel2)); + update_values.push_back(columns[153] + " = " + std::to_string(items_entry.wornlevel)); + update_values.push_back(columns[154] + " = " + std::to_string(items_entry.UNK147)); + update_values.push_back(columns[155] + " = " + std::to_string(items_entry.focustype)); + update_values.push_back(columns[156] + " = " + std::to_string(items_entry.focuslevel2)); + update_values.push_back(columns[157] + " = " + std::to_string(items_entry.focuslevel)); + update_values.push_back(columns[158] + " = " + std::to_string(items_entry.UNK152)); + update_values.push_back(columns[159] + " = " + std::to_string(items_entry.scrolleffect)); + update_values.push_back(columns[160] + " = " + std::to_string(items_entry.scrolltype)); + update_values.push_back(columns[161] + " = " + std::to_string(items_entry.scrolllevel2)); + update_values.push_back(columns[162] + " = " + std::to_string(items_entry.scrolllevel)); + update_values.push_back(columns[163] + " = " + std::to_string(items_entry.UNK157)); + update_values.push_back(columns[164] + " = '" + EscapeString(items_entry.serialized) + "'"); + update_values.push_back(columns[165] + " = '" + EscapeString(items_entry.verified) + "'"); + update_values.push_back(columns[166] + " = '" + EscapeString(items_entry.serialization) + "'"); + update_values.push_back(columns[167] + " = '" + EscapeString(items_entry.source) + "'"); + update_values.push_back(columns[168] + " = " + std::to_string(items_entry.UNK033)); + update_values.push_back(columns[169] + " = '" + EscapeString(items_entry.lorefile) + "'"); + update_values.push_back(columns[170] + " = " + std::to_string(items_entry.UNK014)); + update_values.push_back(columns[171] + " = " + std::to_string(items_entry.svcorruption)); + update_values.push_back(columns[172] + " = " + std::to_string(items_entry.skillmodmax)); + update_values.push_back(columns[173] + " = " + std::to_string(items_entry.UNK060)); + update_values.push_back(columns[174] + " = " + std::to_string(items_entry.augslot1unk2)); + update_values.push_back(columns[175] + " = " + std::to_string(items_entry.augslot2unk2)); + update_values.push_back(columns[176] + " = " + std::to_string(items_entry.augslot3unk2)); + update_values.push_back(columns[177] + " = " + std::to_string(items_entry.augslot4unk2)); + update_values.push_back(columns[178] + " = " + std::to_string(items_entry.augslot5unk2)); + update_values.push_back(columns[179] + " = " + std::to_string(items_entry.augslot6unk2)); + update_values.push_back(columns[180] + " = " + std::to_string(items_entry.UNK120)); + update_values.push_back(columns[181] + " = " + std::to_string(items_entry.UNK121)); + update_values.push_back(columns[182] + " = " + std::to_string(items_entry.questitemflag)); + update_values.push_back(columns[183] + " = '" + EscapeString(items_entry.UNK132) + "'"); + update_values.push_back(columns[184] + " = " + std::to_string(items_entry.clickunk5)); + update_values.push_back(columns[185] + " = '" + EscapeString(items_entry.clickunk6) + "'"); + update_values.push_back(columns[186] + " = " + std::to_string(items_entry.clickunk7)); + update_values.push_back(columns[187] + " = " + std::to_string(items_entry.procunk1)); + update_values.push_back(columns[188] + " = " + std::to_string(items_entry.procunk2)); + update_values.push_back(columns[189] + " = " + std::to_string(items_entry.procunk3)); + update_values.push_back(columns[190] + " = " + std::to_string(items_entry.procunk4)); + update_values.push_back(columns[191] + " = '" + EscapeString(items_entry.procunk6) + "'"); + update_values.push_back(columns[192] + " = " + std::to_string(items_entry.procunk7)); + update_values.push_back(columns[193] + " = " + std::to_string(items_entry.wornunk1)); + update_values.push_back(columns[194] + " = " + std::to_string(items_entry.wornunk2)); + update_values.push_back(columns[195] + " = " + std::to_string(items_entry.wornunk3)); + update_values.push_back(columns[196] + " = " + std::to_string(items_entry.wornunk4)); + update_values.push_back(columns[197] + " = " + std::to_string(items_entry.wornunk5)); + update_values.push_back(columns[198] + " = '" + EscapeString(items_entry.wornunk6) + "'"); + update_values.push_back(columns[199] + " = " + std::to_string(items_entry.wornunk7)); + update_values.push_back(columns[200] + " = " + std::to_string(items_entry.focusunk1)); + update_values.push_back(columns[201] + " = " + std::to_string(items_entry.focusunk2)); + update_values.push_back(columns[202] + " = " + std::to_string(items_entry.focusunk3)); + update_values.push_back(columns[203] + " = " + std::to_string(items_entry.focusunk4)); + update_values.push_back(columns[204] + " = " + std::to_string(items_entry.focusunk5)); + update_values.push_back(columns[205] + " = '" + EscapeString(items_entry.focusunk6) + "'"); + update_values.push_back(columns[206] + " = " + std::to_string(items_entry.focusunk7)); + update_values.push_back(columns[207] + " = " + std::to_string(items_entry.scrollunk1)); + update_values.push_back(columns[208] + " = " + std::to_string(items_entry.scrollunk2)); + update_values.push_back(columns[209] + " = " + std::to_string(items_entry.scrollunk3)); + update_values.push_back(columns[210] + " = " + std::to_string(items_entry.scrollunk4)); + update_values.push_back(columns[211] + " = " + std::to_string(items_entry.scrollunk5)); + update_values.push_back(columns[212] + " = '" + EscapeString(items_entry.scrollunk6) + "'"); + update_values.push_back(columns[213] + " = " + std::to_string(items_entry.scrollunk7)); + update_values.push_back(columns[214] + " = " + std::to_string(items_entry.UNK193)); + update_values.push_back(columns[215] + " = " + std::to_string(items_entry.purity)); + update_values.push_back(columns[216] + " = " + std::to_string(items_entry.evoitem)); + update_values.push_back(columns[217] + " = " + std::to_string(items_entry.evoid)); + update_values.push_back(columns[218] + " = " + std::to_string(items_entry.evolvinglevel)); + update_values.push_back(columns[219] + " = " + std::to_string(items_entry.evomax)); + update_values.push_back(columns[220] + " = '" + EscapeString(items_entry.clickname) + "'"); + update_values.push_back(columns[221] + " = '" + EscapeString(items_entry.procname) + "'"); + update_values.push_back(columns[222] + " = '" + EscapeString(items_entry.wornname) + "'"); + update_values.push_back(columns[223] + " = '" + EscapeString(items_entry.focusname) + "'"); + update_values.push_back(columns[224] + " = '" + EscapeString(items_entry.scrollname) + "'"); + update_values.push_back(columns[225] + " = " + std::to_string(items_entry.dsmitigation)); + update_values.push_back(columns[226] + " = " + std::to_string(items_entry.heroic_str)); + update_values.push_back(columns[227] + " = " + std::to_string(items_entry.heroic_int)); + update_values.push_back(columns[228] + " = " + std::to_string(items_entry.heroic_wis)); + update_values.push_back(columns[229] + " = " + std::to_string(items_entry.heroic_agi)); + update_values.push_back(columns[230] + " = " + std::to_string(items_entry.heroic_dex)); + update_values.push_back(columns[231] + " = " + std::to_string(items_entry.heroic_sta)); + update_values.push_back(columns[232] + " = " + std::to_string(items_entry.heroic_cha)); + update_values.push_back(columns[233] + " = " + std::to_string(items_entry.heroic_pr)); + update_values.push_back(columns[234] + " = " + std::to_string(items_entry.heroic_dr)); + update_values.push_back(columns[235] + " = " + std::to_string(items_entry.heroic_fr)); + update_values.push_back(columns[236] + " = " + std::to_string(items_entry.heroic_cr)); + update_values.push_back(columns[237] + " = " + std::to_string(items_entry.heroic_mr)); + update_values.push_back(columns[238] + " = " + std::to_string(items_entry.heroic_svcorrup)); + update_values.push_back(columns[239] + " = " + std::to_string(items_entry.healamt)); + update_values.push_back(columns[240] + " = " + std::to_string(items_entry.spelldmg)); + update_values.push_back(columns[241] + " = " + std::to_string(items_entry.clairvoyance)); + update_values.push_back(columns[242] + " = " + std::to_string(items_entry.backstabdmg)); + update_values.push_back(columns[243] + " = '" + EscapeString(items_entry.created) + "'"); + update_values.push_back(columns[244] + " = " + std::to_string(items_entry.elitematerial)); + update_values.push_back(columns[245] + " = " + std::to_string(items_entry.ldonsellbackrate)); + update_values.push_back(columns[246] + " = " + std::to_string(items_entry.scriptfileid)); + update_values.push_back(columns[247] + " = " + std::to_string(items_entry.expendablearrow)); + update_values.push_back(columns[248] + " = " + std::to_string(items_entry.powersourcecapacity)); + update_values.push_back(columns[249] + " = " + std::to_string(items_entry.bardeffect)); + update_values.push_back(columns[250] + " = " + std::to_string(items_entry.bardeffecttype)); + update_values.push_back(columns[251] + " = " + std::to_string(items_entry.bardlevel2)); + update_values.push_back(columns[252] + " = " + std::to_string(items_entry.bardlevel)); + update_values.push_back(columns[253] + " = " + std::to_string(items_entry.bardunk1)); + update_values.push_back(columns[254] + " = " + std::to_string(items_entry.bardunk2)); + update_values.push_back(columns[255] + " = " + std::to_string(items_entry.bardunk3)); + update_values.push_back(columns[256] + " = " + std::to_string(items_entry.bardunk4)); + update_values.push_back(columns[257] + " = " + std::to_string(items_entry.bardunk5)); + update_values.push_back(columns[258] + " = '" + EscapeString(items_entry.bardname) + "'"); + update_values.push_back(columns[259] + " = " + std::to_string(items_entry.bardunk7)); + update_values.push_back(columns[260] + " = " + std::to_string(items_entry.UNK214)); + update_values.push_back(columns[261] + " = " + std::to_string(items_entry.subtype)); + update_values.push_back(columns[262] + " = " + std::to_string(items_entry.UNK220)); + update_values.push_back(columns[263] + " = " + std::to_string(items_entry.UNK221)); + update_values.push_back(columns[264] + " = " + std::to_string(items_entry.heirloom)); + update_values.push_back(columns[265] + " = " + std::to_string(items_entry.UNK223)); + update_values.push_back(columns[266] + " = " + std::to_string(items_entry.UNK224)); + update_values.push_back(columns[267] + " = " + std::to_string(items_entry.UNK225)); + update_values.push_back(columns[268] + " = " + std::to_string(items_entry.UNK226)); + update_values.push_back(columns[269] + " = " + std::to_string(items_entry.UNK227)); + update_values.push_back(columns[270] + " = " + std::to_string(items_entry.UNK228)); + update_values.push_back(columns[271] + " = " + std::to_string(items_entry.UNK229)); + update_values.push_back(columns[272] + " = " + std::to_string(items_entry.UNK230)); + update_values.push_back(columns[273] + " = " + std::to_string(items_entry.UNK231)); + update_values.push_back(columns[274] + " = " + std::to_string(items_entry.UNK232)); + update_values.push_back(columns[275] + " = " + std::to_string(items_entry.UNK233)); + update_values.push_back(columns[276] + " = " + std::to_string(items_entry.UNK234)); + update_values.push_back(columns[277] + " = " + std::to_string(items_entry.placeable)); + update_values.push_back(columns[278] + " = " + std::to_string(items_entry.UNK236)); + update_values.push_back(columns[279] + " = " + std::to_string(items_entry.UNK237)); + update_values.push_back(columns[280] + " = " + std::to_string(items_entry.UNK238)); + update_values.push_back(columns[281] + " = " + std::to_string(items_entry.UNK239)); + update_values.push_back(columns[282] + " = " + std::to_string(items_entry.UNK240)); + update_values.push_back(columns[283] + " = " + std::to_string(items_entry.UNK241)); + update_values.push_back(columns[284] + " = " + std::to_string(items_entry.epicitem)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + items_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Items InsertOne( + Database& db, + Items items_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(items_entry.id)); + insert_values.push_back(std::to_string(items_entry.minstatus)); + insert_values.push_back("'" + EscapeString(items_entry.Name) + "'"); + insert_values.push_back(std::to_string(items_entry.aagi)); + insert_values.push_back(std::to_string(items_entry.ac)); + insert_values.push_back(std::to_string(items_entry.accuracy)); + insert_values.push_back(std::to_string(items_entry.acha)); + insert_values.push_back(std::to_string(items_entry.adex)); + insert_values.push_back(std::to_string(items_entry.aint)); + insert_values.push_back(std::to_string(items_entry.artifactflag)); + insert_values.push_back(std::to_string(items_entry.asta)); + insert_values.push_back(std::to_string(items_entry.astr)); + insert_values.push_back(std::to_string(items_entry.attack)); + insert_values.push_back(std::to_string(items_entry.augrestrict)); + insert_values.push_back(std::to_string(items_entry.augslot1type)); + insert_values.push_back(std::to_string(items_entry.augslot1visible)); + insert_values.push_back(std::to_string(items_entry.augslot2type)); + insert_values.push_back(std::to_string(items_entry.augslot2visible)); + insert_values.push_back(std::to_string(items_entry.augslot3type)); + insert_values.push_back(std::to_string(items_entry.augslot3visible)); + insert_values.push_back(std::to_string(items_entry.augslot4type)); + insert_values.push_back(std::to_string(items_entry.augslot4visible)); + insert_values.push_back(std::to_string(items_entry.augslot5type)); + insert_values.push_back(std::to_string(items_entry.augslot5visible)); + insert_values.push_back(std::to_string(items_entry.augslot6type)); + insert_values.push_back(std::to_string(items_entry.augslot6visible)); + insert_values.push_back(std::to_string(items_entry.augtype)); + insert_values.push_back(std::to_string(items_entry.avoidance)); + insert_values.push_back(std::to_string(items_entry.awis)); + insert_values.push_back(std::to_string(items_entry.bagsize)); + insert_values.push_back(std::to_string(items_entry.bagslots)); + insert_values.push_back(std::to_string(items_entry.bagtype)); + insert_values.push_back(std::to_string(items_entry.bagwr)); + insert_values.push_back(std::to_string(items_entry.banedmgamt)); + insert_values.push_back(std::to_string(items_entry.banedmgraceamt)); + insert_values.push_back(std::to_string(items_entry.banedmgbody)); + insert_values.push_back(std::to_string(items_entry.banedmgrace)); + insert_values.push_back(std::to_string(items_entry.bardtype)); + insert_values.push_back(std::to_string(items_entry.bardvalue)); + insert_values.push_back(std::to_string(items_entry.book)); + insert_values.push_back(std::to_string(items_entry.casttime)); + insert_values.push_back(std::to_string(items_entry.casttime_)); + insert_values.push_back("'" + EscapeString(items_entry.charmfile) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.charmfileid) + "'"); + insert_values.push_back(std::to_string(items_entry.classes)); + insert_values.push_back(std::to_string(items_entry.color)); + insert_values.push_back("'" + EscapeString(items_entry.combateffects) + "'"); + insert_values.push_back(std::to_string(items_entry.extradmgskill)); + insert_values.push_back(std::to_string(items_entry.extradmgamt)); + insert_values.push_back(std::to_string(items_entry.price)); + insert_values.push_back(std::to_string(items_entry.cr)); + insert_values.push_back(std::to_string(items_entry.damage)); + insert_values.push_back(std::to_string(items_entry.damageshield)); + insert_values.push_back(std::to_string(items_entry.deity)); + insert_values.push_back(std::to_string(items_entry.delay)); + insert_values.push_back(std::to_string(items_entry.augdistiller)); + insert_values.push_back(std::to_string(items_entry.dotshielding)); + insert_values.push_back(std::to_string(items_entry.dr)); + insert_values.push_back(std::to_string(items_entry.clicktype)); + insert_values.push_back(std::to_string(items_entry.clicklevel2)); + insert_values.push_back(std::to_string(items_entry.elemdmgtype)); + insert_values.push_back(std::to_string(items_entry.elemdmgamt)); + insert_values.push_back(std::to_string(items_entry.endur)); + insert_values.push_back(std::to_string(items_entry.factionamt1)); + insert_values.push_back(std::to_string(items_entry.factionamt2)); + insert_values.push_back(std::to_string(items_entry.factionamt3)); + insert_values.push_back(std::to_string(items_entry.factionamt4)); + insert_values.push_back(std::to_string(items_entry.factionmod1)); + insert_values.push_back(std::to_string(items_entry.factionmod2)); + insert_values.push_back(std::to_string(items_entry.factionmod3)); + insert_values.push_back(std::to_string(items_entry.factionmod4)); + insert_values.push_back("'" + EscapeString(items_entry.filename) + "'"); + insert_values.push_back(std::to_string(items_entry.focuseffect)); + insert_values.push_back(std::to_string(items_entry.fr)); + insert_values.push_back(std::to_string(items_entry.fvnodrop)); + insert_values.push_back(std::to_string(items_entry.haste)); + insert_values.push_back(std::to_string(items_entry.clicklevel)); + insert_values.push_back(std::to_string(items_entry.hp)); + insert_values.push_back(std::to_string(items_entry.regen)); + insert_values.push_back(std::to_string(items_entry.icon)); + insert_values.push_back("'" + EscapeString(items_entry.idfile) + "'"); + insert_values.push_back(std::to_string(items_entry.itemclass)); + insert_values.push_back(std::to_string(items_entry.itemtype)); + insert_values.push_back(std::to_string(items_entry.ldonprice)); + insert_values.push_back(std::to_string(items_entry.ldontheme)); + insert_values.push_back(std::to_string(items_entry.ldonsold)); + insert_values.push_back(std::to_string(items_entry.light)); + insert_values.push_back("'" + EscapeString(items_entry.lore) + "'"); + insert_values.push_back(std::to_string(items_entry.loregroup)); + insert_values.push_back(std::to_string(items_entry.magic)); + insert_values.push_back(std::to_string(items_entry.mana)); + insert_values.push_back(std::to_string(items_entry.manaregen)); + insert_values.push_back(std::to_string(items_entry.enduranceregen)); + insert_values.push_back(std::to_string(items_entry.material)); + insert_values.push_back(std::to_string(items_entry.herosforgemodel)); + insert_values.push_back(std::to_string(items_entry.maxcharges)); + insert_values.push_back(std::to_string(items_entry.mr)); + insert_values.push_back(std::to_string(items_entry.nodrop)); + insert_values.push_back(std::to_string(items_entry.norent)); + insert_values.push_back(std::to_string(items_entry.pendingloreflag)); + insert_values.push_back(std::to_string(items_entry.pr)); + insert_values.push_back(std::to_string(items_entry.procrate)); + insert_values.push_back(std::to_string(items_entry.races)); + insert_values.push_back(std::to_string(items_entry.range)); + insert_values.push_back(std::to_string(items_entry.reclevel)); + insert_values.push_back(std::to_string(items_entry.recskill)); + insert_values.push_back(std::to_string(items_entry.reqlevel)); + insert_values.push_back(std::to_string(items_entry.sellrate)); + insert_values.push_back(std::to_string(items_entry.shielding)); + insert_values.push_back(std::to_string(items_entry.size)); + insert_values.push_back(std::to_string(items_entry.skillmodtype)); + insert_values.push_back(std::to_string(items_entry.skillmodvalue)); + insert_values.push_back(std::to_string(items_entry.slots)); + insert_values.push_back(std::to_string(items_entry.clickeffect)); + insert_values.push_back(std::to_string(items_entry.spellshield)); + insert_values.push_back(std::to_string(items_entry.strikethrough)); + insert_values.push_back(std::to_string(items_entry.stunresist)); + insert_values.push_back(std::to_string(items_entry.summonedflag)); + insert_values.push_back(std::to_string(items_entry.tradeskills)); + insert_values.push_back(std::to_string(items_entry.favor)); + insert_values.push_back(std::to_string(items_entry.weight)); + insert_values.push_back(std::to_string(items_entry.UNK012)); + insert_values.push_back(std::to_string(items_entry.UNK013)); + insert_values.push_back(std::to_string(items_entry.benefitflag)); + insert_values.push_back(std::to_string(items_entry.UNK054)); + insert_values.push_back(std::to_string(items_entry.UNK059)); + insert_values.push_back(std::to_string(items_entry.booktype)); + insert_values.push_back(std::to_string(items_entry.recastdelay)); + insert_values.push_back(std::to_string(items_entry.recasttype)); + insert_values.push_back(std::to_string(items_entry.guildfavor)); + insert_values.push_back(std::to_string(items_entry.UNK123)); + insert_values.push_back(std::to_string(items_entry.UNK124)); + insert_values.push_back(std::to_string(items_entry.attuneable)); + insert_values.push_back(std::to_string(items_entry.nopet)); + insert_values.push_back("'" + EscapeString(items_entry.updated) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.comment) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK127)); + insert_values.push_back(std::to_string(items_entry.pointtype)); + insert_values.push_back(std::to_string(items_entry.potionbelt)); + insert_values.push_back(std::to_string(items_entry.potionbeltslots)); + insert_values.push_back(std::to_string(items_entry.stacksize)); + insert_values.push_back(std::to_string(items_entry.notransfer)); + insert_values.push_back(std::to_string(items_entry.stackable)); + insert_values.push_back("'" + EscapeString(items_entry.UNK134) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK137)); + insert_values.push_back(std::to_string(items_entry.proceffect)); + insert_values.push_back(std::to_string(items_entry.proctype)); + insert_values.push_back(std::to_string(items_entry.proclevel2)); + insert_values.push_back(std::to_string(items_entry.proclevel)); + insert_values.push_back(std::to_string(items_entry.UNK142)); + insert_values.push_back(std::to_string(items_entry.worneffect)); + insert_values.push_back(std::to_string(items_entry.worntype)); + insert_values.push_back(std::to_string(items_entry.wornlevel2)); + insert_values.push_back(std::to_string(items_entry.wornlevel)); + insert_values.push_back(std::to_string(items_entry.UNK147)); + insert_values.push_back(std::to_string(items_entry.focustype)); + insert_values.push_back(std::to_string(items_entry.focuslevel2)); + insert_values.push_back(std::to_string(items_entry.focuslevel)); + insert_values.push_back(std::to_string(items_entry.UNK152)); + insert_values.push_back(std::to_string(items_entry.scrolleffect)); + insert_values.push_back(std::to_string(items_entry.scrolltype)); + insert_values.push_back(std::to_string(items_entry.scrolllevel2)); + insert_values.push_back(std::to_string(items_entry.scrolllevel)); + insert_values.push_back(std::to_string(items_entry.UNK157)); + insert_values.push_back("'" + EscapeString(items_entry.serialized) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.verified) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.serialization) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.source) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK033)); + insert_values.push_back("'" + EscapeString(items_entry.lorefile) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK014)); + insert_values.push_back(std::to_string(items_entry.svcorruption)); + insert_values.push_back(std::to_string(items_entry.skillmodmax)); + insert_values.push_back(std::to_string(items_entry.UNK060)); + insert_values.push_back(std::to_string(items_entry.augslot1unk2)); + insert_values.push_back(std::to_string(items_entry.augslot2unk2)); + insert_values.push_back(std::to_string(items_entry.augslot3unk2)); + insert_values.push_back(std::to_string(items_entry.augslot4unk2)); + insert_values.push_back(std::to_string(items_entry.augslot5unk2)); + insert_values.push_back(std::to_string(items_entry.augslot6unk2)); + insert_values.push_back(std::to_string(items_entry.UNK120)); + insert_values.push_back(std::to_string(items_entry.UNK121)); + insert_values.push_back(std::to_string(items_entry.questitemflag)); + insert_values.push_back("'" + EscapeString(items_entry.UNK132) + "'"); + insert_values.push_back(std::to_string(items_entry.clickunk5)); + insert_values.push_back("'" + EscapeString(items_entry.clickunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.clickunk7)); + insert_values.push_back(std::to_string(items_entry.procunk1)); + insert_values.push_back(std::to_string(items_entry.procunk2)); + insert_values.push_back(std::to_string(items_entry.procunk3)); + insert_values.push_back(std::to_string(items_entry.procunk4)); + insert_values.push_back("'" + EscapeString(items_entry.procunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.procunk7)); + insert_values.push_back(std::to_string(items_entry.wornunk1)); + insert_values.push_back(std::to_string(items_entry.wornunk2)); + insert_values.push_back(std::to_string(items_entry.wornunk3)); + insert_values.push_back(std::to_string(items_entry.wornunk4)); + insert_values.push_back(std::to_string(items_entry.wornunk5)); + insert_values.push_back("'" + EscapeString(items_entry.wornunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.wornunk7)); + insert_values.push_back(std::to_string(items_entry.focusunk1)); + insert_values.push_back(std::to_string(items_entry.focusunk2)); + insert_values.push_back(std::to_string(items_entry.focusunk3)); + insert_values.push_back(std::to_string(items_entry.focusunk4)); + insert_values.push_back(std::to_string(items_entry.focusunk5)); + insert_values.push_back("'" + EscapeString(items_entry.focusunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.focusunk7)); + insert_values.push_back(std::to_string(items_entry.scrollunk1)); + insert_values.push_back(std::to_string(items_entry.scrollunk2)); + insert_values.push_back(std::to_string(items_entry.scrollunk3)); + insert_values.push_back(std::to_string(items_entry.scrollunk4)); + insert_values.push_back(std::to_string(items_entry.scrollunk5)); + insert_values.push_back("'" + EscapeString(items_entry.scrollunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.scrollunk7)); + insert_values.push_back(std::to_string(items_entry.UNK193)); + insert_values.push_back(std::to_string(items_entry.purity)); + insert_values.push_back(std::to_string(items_entry.evoitem)); + insert_values.push_back(std::to_string(items_entry.evoid)); + insert_values.push_back(std::to_string(items_entry.evolvinglevel)); + insert_values.push_back(std::to_string(items_entry.evomax)); + insert_values.push_back("'" + EscapeString(items_entry.clickname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.procname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.wornname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.focusname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.scrollname) + "'"); + insert_values.push_back(std::to_string(items_entry.dsmitigation)); + insert_values.push_back(std::to_string(items_entry.heroic_str)); + insert_values.push_back(std::to_string(items_entry.heroic_int)); + insert_values.push_back(std::to_string(items_entry.heroic_wis)); + insert_values.push_back(std::to_string(items_entry.heroic_agi)); + insert_values.push_back(std::to_string(items_entry.heroic_dex)); + insert_values.push_back(std::to_string(items_entry.heroic_sta)); + insert_values.push_back(std::to_string(items_entry.heroic_cha)); + insert_values.push_back(std::to_string(items_entry.heroic_pr)); + insert_values.push_back(std::to_string(items_entry.heroic_dr)); + insert_values.push_back(std::to_string(items_entry.heroic_fr)); + insert_values.push_back(std::to_string(items_entry.heroic_cr)); + insert_values.push_back(std::to_string(items_entry.heroic_mr)); + insert_values.push_back(std::to_string(items_entry.heroic_svcorrup)); + insert_values.push_back(std::to_string(items_entry.healamt)); + insert_values.push_back(std::to_string(items_entry.spelldmg)); + insert_values.push_back(std::to_string(items_entry.clairvoyance)); + insert_values.push_back(std::to_string(items_entry.backstabdmg)); + insert_values.push_back("'" + EscapeString(items_entry.created) + "'"); + insert_values.push_back(std::to_string(items_entry.elitematerial)); + insert_values.push_back(std::to_string(items_entry.ldonsellbackrate)); + insert_values.push_back(std::to_string(items_entry.scriptfileid)); + insert_values.push_back(std::to_string(items_entry.expendablearrow)); + insert_values.push_back(std::to_string(items_entry.powersourcecapacity)); + insert_values.push_back(std::to_string(items_entry.bardeffect)); + insert_values.push_back(std::to_string(items_entry.bardeffecttype)); + insert_values.push_back(std::to_string(items_entry.bardlevel2)); + insert_values.push_back(std::to_string(items_entry.bardlevel)); + insert_values.push_back(std::to_string(items_entry.bardunk1)); + insert_values.push_back(std::to_string(items_entry.bardunk2)); + insert_values.push_back(std::to_string(items_entry.bardunk3)); + insert_values.push_back(std::to_string(items_entry.bardunk4)); + insert_values.push_back(std::to_string(items_entry.bardunk5)); + insert_values.push_back("'" + EscapeString(items_entry.bardname) + "'"); + insert_values.push_back(std::to_string(items_entry.bardunk7)); + insert_values.push_back(std::to_string(items_entry.UNK214)); + insert_values.push_back(std::to_string(items_entry.subtype)); + insert_values.push_back(std::to_string(items_entry.UNK220)); + insert_values.push_back(std::to_string(items_entry.UNK221)); + insert_values.push_back(std::to_string(items_entry.heirloom)); + insert_values.push_back(std::to_string(items_entry.UNK223)); + insert_values.push_back(std::to_string(items_entry.UNK224)); + insert_values.push_back(std::to_string(items_entry.UNK225)); + insert_values.push_back(std::to_string(items_entry.UNK226)); + insert_values.push_back(std::to_string(items_entry.UNK227)); + insert_values.push_back(std::to_string(items_entry.UNK228)); + insert_values.push_back(std::to_string(items_entry.UNK229)); + insert_values.push_back(std::to_string(items_entry.UNK230)); + insert_values.push_back(std::to_string(items_entry.UNK231)); + insert_values.push_back(std::to_string(items_entry.UNK232)); + insert_values.push_back(std::to_string(items_entry.UNK233)); + insert_values.push_back(std::to_string(items_entry.UNK234)); + insert_values.push_back(std::to_string(items_entry.placeable)); + insert_values.push_back(std::to_string(items_entry.UNK236)); + insert_values.push_back(std::to_string(items_entry.UNK237)); + insert_values.push_back(std::to_string(items_entry.UNK238)); + insert_values.push_back(std::to_string(items_entry.UNK239)); + insert_values.push_back(std::to_string(items_entry.UNK240)); + insert_values.push_back(std::to_string(items_entry.UNK241)); + insert_values.push_back(std::to_string(items_entry.epicitem)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + items_entry.id = results.LastInsertedID(); + return items_entry; + } + + items_entry = NewEntity(); + + return items_entry; + } + + static int InsertMany( + Database& db, + std::vector items_entries + ) + { + std::vector insert_chunks; + + for (auto &items_entry: items_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(items_entry.id)); + insert_values.push_back(std::to_string(items_entry.minstatus)); + insert_values.push_back("'" + EscapeString(items_entry.Name) + "'"); + insert_values.push_back(std::to_string(items_entry.aagi)); + insert_values.push_back(std::to_string(items_entry.ac)); + insert_values.push_back(std::to_string(items_entry.accuracy)); + insert_values.push_back(std::to_string(items_entry.acha)); + insert_values.push_back(std::to_string(items_entry.adex)); + insert_values.push_back(std::to_string(items_entry.aint)); + insert_values.push_back(std::to_string(items_entry.artifactflag)); + insert_values.push_back(std::to_string(items_entry.asta)); + insert_values.push_back(std::to_string(items_entry.astr)); + insert_values.push_back(std::to_string(items_entry.attack)); + insert_values.push_back(std::to_string(items_entry.augrestrict)); + insert_values.push_back(std::to_string(items_entry.augslot1type)); + insert_values.push_back(std::to_string(items_entry.augslot1visible)); + insert_values.push_back(std::to_string(items_entry.augslot2type)); + insert_values.push_back(std::to_string(items_entry.augslot2visible)); + insert_values.push_back(std::to_string(items_entry.augslot3type)); + insert_values.push_back(std::to_string(items_entry.augslot3visible)); + insert_values.push_back(std::to_string(items_entry.augslot4type)); + insert_values.push_back(std::to_string(items_entry.augslot4visible)); + insert_values.push_back(std::to_string(items_entry.augslot5type)); + insert_values.push_back(std::to_string(items_entry.augslot5visible)); + insert_values.push_back(std::to_string(items_entry.augslot6type)); + insert_values.push_back(std::to_string(items_entry.augslot6visible)); + insert_values.push_back(std::to_string(items_entry.augtype)); + insert_values.push_back(std::to_string(items_entry.avoidance)); + insert_values.push_back(std::to_string(items_entry.awis)); + insert_values.push_back(std::to_string(items_entry.bagsize)); + insert_values.push_back(std::to_string(items_entry.bagslots)); + insert_values.push_back(std::to_string(items_entry.bagtype)); + insert_values.push_back(std::to_string(items_entry.bagwr)); + insert_values.push_back(std::to_string(items_entry.banedmgamt)); + insert_values.push_back(std::to_string(items_entry.banedmgraceamt)); + insert_values.push_back(std::to_string(items_entry.banedmgbody)); + insert_values.push_back(std::to_string(items_entry.banedmgrace)); + insert_values.push_back(std::to_string(items_entry.bardtype)); + insert_values.push_back(std::to_string(items_entry.bardvalue)); + insert_values.push_back(std::to_string(items_entry.book)); + insert_values.push_back(std::to_string(items_entry.casttime)); + insert_values.push_back(std::to_string(items_entry.casttime_)); + insert_values.push_back("'" + EscapeString(items_entry.charmfile) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.charmfileid) + "'"); + insert_values.push_back(std::to_string(items_entry.classes)); + insert_values.push_back(std::to_string(items_entry.color)); + insert_values.push_back("'" + EscapeString(items_entry.combateffects) + "'"); + insert_values.push_back(std::to_string(items_entry.extradmgskill)); + insert_values.push_back(std::to_string(items_entry.extradmgamt)); + insert_values.push_back(std::to_string(items_entry.price)); + insert_values.push_back(std::to_string(items_entry.cr)); + insert_values.push_back(std::to_string(items_entry.damage)); + insert_values.push_back(std::to_string(items_entry.damageshield)); + insert_values.push_back(std::to_string(items_entry.deity)); + insert_values.push_back(std::to_string(items_entry.delay)); + insert_values.push_back(std::to_string(items_entry.augdistiller)); + insert_values.push_back(std::to_string(items_entry.dotshielding)); + insert_values.push_back(std::to_string(items_entry.dr)); + insert_values.push_back(std::to_string(items_entry.clicktype)); + insert_values.push_back(std::to_string(items_entry.clicklevel2)); + insert_values.push_back(std::to_string(items_entry.elemdmgtype)); + insert_values.push_back(std::to_string(items_entry.elemdmgamt)); + insert_values.push_back(std::to_string(items_entry.endur)); + insert_values.push_back(std::to_string(items_entry.factionamt1)); + insert_values.push_back(std::to_string(items_entry.factionamt2)); + insert_values.push_back(std::to_string(items_entry.factionamt3)); + insert_values.push_back(std::to_string(items_entry.factionamt4)); + insert_values.push_back(std::to_string(items_entry.factionmod1)); + insert_values.push_back(std::to_string(items_entry.factionmod2)); + insert_values.push_back(std::to_string(items_entry.factionmod3)); + insert_values.push_back(std::to_string(items_entry.factionmod4)); + insert_values.push_back("'" + EscapeString(items_entry.filename) + "'"); + insert_values.push_back(std::to_string(items_entry.focuseffect)); + insert_values.push_back(std::to_string(items_entry.fr)); + insert_values.push_back(std::to_string(items_entry.fvnodrop)); + insert_values.push_back(std::to_string(items_entry.haste)); + insert_values.push_back(std::to_string(items_entry.clicklevel)); + insert_values.push_back(std::to_string(items_entry.hp)); + insert_values.push_back(std::to_string(items_entry.regen)); + insert_values.push_back(std::to_string(items_entry.icon)); + insert_values.push_back("'" + EscapeString(items_entry.idfile) + "'"); + insert_values.push_back(std::to_string(items_entry.itemclass)); + insert_values.push_back(std::to_string(items_entry.itemtype)); + insert_values.push_back(std::to_string(items_entry.ldonprice)); + insert_values.push_back(std::to_string(items_entry.ldontheme)); + insert_values.push_back(std::to_string(items_entry.ldonsold)); + insert_values.push_back(std::to_string(items_entry.light)); + insert_values.push_back("'" + EscapeString(items_entry.lore) + "'"); + insert_values.push_back(std::to_string(items_entry.loregroup)); + insert_values.push_back(std::to_string(items_entry.magic)); + insert_values.push_back(std::to_string(items_entry.mana)); + insert_values.push_back(std::to_string(items_entry.manaregen)); + insert_values.push_back(std::to_string(items_entry.enduranceregen)); + insert_values.push_back(std::to_string(items_entry.material)); + insert_values.push_back(std::to_string(items_entry.herosforgemodel)); + insert_values.push_back(std::to_string(items_entry.maxcharges)); + insert_values.push_back(std::to_string(items_entry.mr)); + insert_values.push_back(std::to_string(items_entry.nodrop)); + insert_values.push_back(std::to_string(items_entry.norent)); + insert_values.push_back(std::to_string(items_entry.pendingloreflag)); + insert_values.push_back(std::to_string(items_entry.pr)); + insert_values.push_back(std::to_string(items_entry.procrate)); + insert_values.push_back(std::to_string(items_entry.races)); + insert_values.push_back(std::to_string(items_entry.range)); + insert_values.push_back(std::to_string(items_entry.reclevel)); + insert_values.push_back(std::to_string(items_entry.recskill)); + insert_values.push_back(std::to_string(items_entry.reqlevel)); + insert_values.push_back(std::to_string(items_entry.sellrate)); + insert_values.push_back(std::to_string(items_entry.shielding)); + insert_values.push_back(std::to_string(items_entry.size)); + insert_values.push_back(std::to_string(items_entry.skillmodtype)); + insert_values.push_back(std::to_string(items_entry.skillmodvalue)); + insert_values.push_back(std::to_string(items_entry.slots)); + insert_values.push_back(std::to_string(items_entry.clickeffect)); + insert_values.push_back(std::to_string(items_entry.spellshield)); + insert_values.push_back(std::to_string(items_entry.strikethrough)); + insert_values.push_back(std::to_string(items_entry.stunresist)); + insert_values.push_back(std::to_string(items_entry.summonedflag)); + insert_values.push_back(std::to_string(items_entry.tradeskills)); + insert_values.push_back(std::to_string(items_entry.favor)); + insert_values.push_back(std::to_string(items_entry.weight)); + insert_values.push_back(std::to_string(items_entry.UNK012)); + insert_values.push_back(std::to_string(items_entry.UNK013)); + insert_values.push_back(std::to_string(items_entry.benefitflag)); + insert_values.push_back(std::to_string(items_entry.UNK054)); + insert_values.push_back(std::to_string(items_entry.UNK059)); + insert_values.push_back(std::to_string(items_entry.booktype)); + insert_values.push_back(std::to_string(items_entry.recastdelay)); + insert_values.push_back(std::to_string(items_entry.recasttype)); + insert_values.push_back(std::to_string(items_entry.guildfavor)); + insert_values.push_back(std::to_string(items_entry.UNK123)); + insert_values.push_back(std::to_string(items_entry.UNK124)); + insert_values.push_back(std::to_string(items_entry.attuneable)); + insert_values.push_back(std::to_string(items_entry.nopet)); + insert_values.push_back("'" + EscapeString(items_entry.updated) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.comment) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK127)); + insert_values.push_back(std::to_string(items_entry.pointtype)); + insert_values.push_back(std::to_string(items_entry.potionbelt)); + insert_values.push_back(std::to_string(items_entry.potionbeltslots)); + insert_values.push_back(std::to_string(items_entry.stacksize)); + insert_values.push_back(std::to_string(items_entry.notransfer)); + insert_values.push_back(std::to_string(items_entry.stackable)); + insert_values.push_back("'" + EscapeString(items_entry.UNK134) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK137)); + insert_values.push_back(std::to_string(items_entry.proceffect)); + insert_values.push_back(std::to_string(items_entry.proctype)); + insert_values.push_back(std::to_string(items_entry.proclevel2)); + insert_values.push_back(std::to_string(items_entry.proclevel)); + insert_values.push_back(std::to_string(items_entry.UNK142)); + insert_values.push_back(std::to_string(items_entry.worneffect)); + insert_values.push_back(std::to_string(items_entry.worntype)); + insert_values.push_back(std::to_string(items_entry.wornlevel2)); + insert_values.push_back(std::to_string(items_entry.wornlevel)); + insert_values.push_back(std::to_string(items_entry.UNK147)); + insert_values.push_back(std::to_string(items_entry.focustype)); + insert_values.push_back(std::to_string(items_entry.focuslevel2)); + insert_values.push_back(std::to_string(items_entry.focuslevel)); + insert_values.push_back(std::to_string(items_entry.UNK152)); + insert_values.push_back(std::to_string(items_entry.scrolleffect)); + insert_values.push_back(std::to_string(items_entry.scrolltype)); + insert_values.push_back(std::to_string(items_entry.scrolllevel2)); + insert_values.push_back(std::to_string(items_entry.scrolllevel)); + insert_values.push_back(std::to_string(items_entry.UNK157)); + insert_values.push_back("'" + EscapeString(items_entry.serialized) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.verified) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.serialization) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.source) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK033)); + insert_values.push_back("'" + EscapeString(items_entry.lorefile) + "'"); + insert_values.push_back(std::to_string(items_entry.UNK014)); + insert_values.push_back(std::to_string(items_entry.svcorruption)); + insert_values.push_back(std::to_string(items_entry.skillmodmax)); + insert_values.push_back(std::to_string(items_entry.UNK060)); + insert_values.push_back(std::to_string(items_entry.augslot1unk2)); + insert_values.push_back(std::to_string(items_entry.augslot2unk2)); + insert_values.push_back(std::to_string(items_entry.augslot3unk2)); + insert_values.push_back(std::to_string(items_entry.augslot4unk2)); + insert_values.push_back(std::to_string(items_entry.augslot5unk2)); + insert_values.push_back(std::to_string(items_entry.augslot6unk2)); + insert_values.push_back(std::to_string(items_entry.UNK120)); + insert_values.push_back(std::to_string(items_entry.UNK121)); + insert_values.push_back(std::to_string(items_entry.questitemflag)); + insert_values.push_back("'" + EscapeString(items_entry.UNK132) + "'"); + insert_values.push_back(std::to_string(items_entry.clickunk5)); + insert_values.push_back("'" + EscapeString(items_entry.clickunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.clickunk7)); + insert_values.push_back(std::to_string(items_entry.procunk1)); + insert_values.push_back(std::to_string(items_entry.procunk2)); + insert_values.push_back(std::to_string(items_entry.procunk3)); + insert_values.push_back(std::to_string(items_entry.procunk4)); + insert_values.push_back("'" + EscapeString(items_entry.procunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.procunk7)); + insert_values.push_back(std::to_string(items_entry.wornunk1)); + insert_values.push_back(std::to_string(items_entry.wornunk2)); + insert_values.push_back(std::to_string(items_entry.wornunk3)); + insert_values.push_back(std::to_string(items_entry.wornunk4)); + insert_values.push_back(std::to_string(items_entry.wornunk5)); + insert_values.push_back("'" + EscapeString(items_entry.wornunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.wornunk7)); + insert_values.push_back(std::to_string(items_entry.focusunk1)); + insert_values.push_back(std::to_string(items_entry.focusunk2)); + insert_values.push_back(std::to_string(items_entry.focusunk3)); + insert_values.push_back(std::to_string(items_entry.focusunk4)); + insert_values.push_back(std::to_string(items_entry.focusunk5)); + insert_values.push_back("'" + EscapeString(items_entry.focusunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.focusunk7)); + insert_values.push_back(std::to_string(items_entry.scrollunk1)); + insert_values.push_back(std::to_string(items_entry.scrollunk2)); + insert_values.push_back(std::to_string(items_entry.scrollunk3)); + insert_values.push_back(std::to_string(items_entry.scrollunk4)); + insert_values.push_back(std::to_string(items_entry.scrollunk5)); + insert_values.push_back("'" + EscapeString(items_entry.scrollunk6) + "'"); + insert_values.push_back(std::to_string(items_entry.scrollunk7)); + insert_values.push_back(std::to_string(items_entry.UNK193)); + insert_values.push_back(std::to_string(items_entry.purity)); + insert_values.push_back(std::to_string(items_entry.evoitem)); + insert_values.push_back(std::to_string(items_entry.evoid)); + insert_values.push_back(std::to_string(items_entry.evolvinglevel)); + insert_values.push_back(std::to_string(items_entry.evomax)); + insert_values.push_back("'" + EscapeString(items_entry.clickname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.procname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.wornname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.focusname) + "'"); + insert_values.push_back("'" + EscapeString(items_entry.scrollname) + "'"); + insert_values.push_back(std::to_string(items_entry.dsmitigation)); + insert_values.push_back(std::to_string(items_entry.heroic_str)); + insert_values.push_back(std::to_string(items_entry.heroic_int)); + insert_values.push_back(std::to_string(items_entry.heroic_wis)); + insert_values.push_back(std::to_string(items_entry.heroic_agi)); + insert_values.push_back(std::to_string(items_entry.heroic_dex)); + insert_values.push_back(std::to_string(items_entry.heroic_sta)); + insert_values.push_back(std::to_string(items_entry.heroic_cha)); + insert_values.push_back(std::to_string(items_entry.heroic_pr)); + insert_values.push_back(std::to_string(items_entry.heroic_dr)); + insert_values.push_back(std::to_string(items_entry.heroic_fr)); + insert_values.push_back(std::to_string(items_entry.heroic_cr)); + insert_values.push_back(std::to_string(items_entry.heroic_mr)); + insert_values.push_back(std::to_string(items_entry.heroic_svcorrup)); + insert_values.push_back(std::to_string(items_entry.healamt)); + insert_values.push_back(std::to_string(items_entry.spelldmg)); + insert_values.push_back(std::to_string(items_entry.clairvoyance)); + insert_values.push_back(std::to_string(items_entry.backstabdmg)); + insert_values.push_back("'" + EscapeString(items_entry.created) + "'"); + insert_values.push_back(std::to_string(items_entry.elitematerial)); + insert_values.push_back(std::to_string(items_entry.ldonsellbackrate)); + insert_values.push_back(std::to_string(items_entry.scriptfileid)); + insert_values.push_back(std::to_string(items_entry.expendablearrow)); + insert_values.push_back(std::to_string(items_entry.powersourcecapacity)); + insert_values.push_back(std::to_string(items_entry.bardeffect)); + insert_values.push_back(std::to_string(items_entry.bardeffecttype)); + insert_values.push_back(std::to_string(items_entry.bardlevel2)); + insert_values.push_back(std::to_string(items_entry.bardlevel)); + insert_values.push_back(std::to_string(items_entry.bardunk1)); + insert_values.push_back(std::to_string(items_entry.bardunk2)); + insert_values.push_back(std::to_string(items_entry.bardunk3)); + insert_values.push_back(std::to_string(items_entry.bardunk4)); + insert_values.push_back(std::to_string(items_entry.bardunk5)); + insert_values.push_back("'" + EscapeString(items_entry.bardname) + "'"); + insert_values.push_back(std::to_string(items_entry.bardunk7)); + insert_values.push_back(std::to_string(items_entry.UNK214)); + insert_values.push_back(std::to_string(items_entry.subtype)); + insert_values.push_back(std::to_string(items_entry.UNK220)); + insert_values.push_back(std::to_string(items_entry.UNK221)); + insert_values.push_back(std::to_string(items_entry.heirloom)); + insert_values.push_back(std::to_string(items_entry.UNK223)); + insert_values.push_back(std::to_string(items_entry.UNK224)); + insert_values.push_back(std::to_string(items_entry.UNK225)); + insert_values.push_back(std::to_string(items_entry.UNK226)); + insert_values.push_back(std::to_string(items_entry.UNK227)); + insert_values.push_back(std::to_string(items_entry.UNK228)); + insert_values.push_back(std::to_string(items_entry.UNK229)); + insert_values.push_back(std::to_string(items_entry.UNK230)); + insert_values.push_back(std::to_string(items_entry.UNK231)); + insert_values.push_back(std::to_string(items_entry.UNK232)); + insert_values.push_back(std::to_string(items_entry.UNK233)); + insert_values.push_back(std::to_string(items_entry.UNK234)); + insert_values.push_back(std::to_string(items_entry.placeable)); + insert_values.push_back(std::to_string(items_entry.UNK236)); + insert_values.push_back(std::to_string(items_entry.UNK237)); + insert_values.push_back(std::to_string(items_entry.UNK238)); + insert_values.push_back(std::to_string(items_entry.UNK239)); + insert_values.push_back(std::to_string(items_entry.UNK240)); + insert_values.push_back(std::to_string(items_entry.UNK241)); + insert_values.push_back(std::to_string(items_entry.epicitem)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Items entry{}; + + entry.id = atoi(row[0]); + entry.minstatus = atoi(row[1]); + entry.Name = row[2] ? row[2] : ""; + entry.aagi = atoi(row[3]); + entry.ac = atoi(row[4]); + entry.accuracy = atoi(row[5]); + entry.acha = atoi(row[6]); + entry.adex = atoi(row[7]); + entry.aint = atoi(row[8]); + entry.artifactflag = atoi(row[9]); + entry.asta = atoi(row[10]); + entry.astr = atoi(row[11]); + entry.attack = atoi(row[12]); + entry.augrestrict = atoi(row[13]); + entry.augslot1type = atoi(row[14]); + entry.augslot1visible = atoi(row[15]); + entry.augslot2type = atoi(row[16]); + entry.augslot2visible = atoi(row[17]); + entry.augslot3type = atoi(row[18]); + entry.augslot3visible = atoi(row[19]); + entry.augslot4type = atoi(row[20]); + entry.augslot4visible = atoi(row[21]); + entry.augslot5type = atoi(row[22]); + entry.augslot5visible = atoi(row[23]); + entry.augslot6type = atoi(row[24]); + entry.augslot6visible = atoi(row[25]); + entry.augtype = atoi(row[26]); + entry.avoidance = atoi(row[27]); + entry.awis = atoi(row[28]); + entry.bagsize = atoi(row[29]); + entry.bagslots = atoi(row[30]); + entry.bagtype = atoi(row[31]); + entry.bagwr = atoi(row[32]); + entry.banedmgamt = atoi(row[33]); + entry.banedmgraceamt = atoi(row[34]); + entry.banedmgbody = atoi(row[35]); + entry.banedmgrace = atoi(row[36]); + entry.bardtype = atoi(row[37]); + entry.bardvalue = atoi(row[38]); + entry.book = atoi(row[39]); + entry.casttime = atoi(row[40]); + entry.casttime_ = atoi(row[41]); + entry.charmfile = row[42] ? row[42] : ""; + entry.charmfileid = row[43] ? row[43] : ""; + entry.classes = atoi(row[44]); + entry.color = atoi(row[45]); + entry.combateffects = row[46] ? row[46] : ""; + entry.extradmgskill = atoi(row[47]); + entry.extradmgamt = atoi(row[48]); + entry.price = atoi(row[49]); + entry.cr = atoi(row[50]); + entry.damage = atoi(row[51]); + entry.damageshield = atoi(row[52]); + entry.deity = atoi(row[53]); + entry.delay = atoi(row[54]); + entry.augdistiller = atoi(row[55]); + entry.dotshielding = atoi(row[56]); + entry.dr = atoi(row[57]); + entry.clicktype = atoi(row[58]); + entry.clicklevel2 = atoi(row[59]); + entry.elemdmgtype = atoi(row[60]); + entry.elemdmgamt = atoi(row[61]); + entry.endur = atoi(row[62]); + entry.factionamt1 = atoi(row[63]); + entry.factionamt2 = atoi(row[64]); + entry.factionamt3 = atoi(row[65]); + entry.factionamt4 = atoi(row[66]); + entry.factionmod1 = atoi(row[67]); + entry.factionmod2 = atoi(row[68]); + entry.factionmod3 = atoi(row[69]); + entry.factionmod4 = atoi(row[70]); + entry.filename = row[71] ? row[71] : ""; + entry.focuseffect = atoi(row[72]); + entry.fr = atoi(row[73]); + entry.fvnodrop = atoi(row[74]); + entry.haste = atoi(row[75]); + entry.clicklevel = atoi(row[76]); + entry.hp = atoi(row[77]); + entry.regen = atoi(row[78]); + entry.icon = atoi(row[79]); + entry.idfile = row[80] ? row[80] : ""; + entry.itemclass = atoi(row[81]); + entry.itemtype = atoi(row[82]); + entry.ldonprice = atoi(row[83]); + entry.ldontheme = atoi(row[84]); + entry.ldonsold = atoi(row[85]); + entry.light = atoi(row[86]); + entry.lore = row[87] ? row[87] : ""; + entry.loregroup = atoi(row[88]); + entry.magic = atoi(row[89]); + entry.mana = atoi(row[90]); + entry.manaregen = atoi(row[91]); + entry.enduranceregen = atoi(row[92]); + entry.material = atoi(row[93]); + entry.herosforgemodel = atoi(row[94]); + entry.maxcharges = atoi(row[95]); + entry.mr = atoi(row[96]); + entry.nodrop = atoi(row[97]); + entry.norent = atoi(row[98]); + entry.pendingloreflag = atoi(row[99]); + entry.pr = atoi(row[100]); + entry.procrate = atoi(row[101]); + entry.races = atoi(row[102]); + entry.range = atoi(row[103]); + entry.reclevel = atoi(row[104]); + entry.recskill = atoi(row[105]); + entry.reqlevel = atoi(row[106]); + entry.sellrate = static_cast(atof(row[107])); + entry.shielding = atoi(row[108]); + entry.size = atoi(row[109]); + entry.skillmodtype = atoi(row[110]); + entry.skillmodvalue = atoi(row[111]); + entry.slots = atoi(row[112]); + entry.clickeffect = atoi(row[113]); + entry.spellshield = atoi(row[114]); + entry.strikethrough = atoi(row[115]); + entry.stunresist = atoi(row[116]); + entry.summonedflag = atoi(row[117]); + entry.tradeskills = atoi(row[118]); + entry.favor = atoi(row[119]); + entry.weight = atoi(row[120]); + entry.UNK012 = atoi(row[121]); + entry.UNK013 = atoi(row[122]); + entry.benefitflag = atoi(row[123]); + entry.UNK054 = atoi(row[124]); + entry.UNK059 = atoi(row[125]); + entry.booktype = atoi(row[126]); + entry.recastdelay = atoi(row[127]); + entry.recasttype = atoi(row[128]); + entry.guildfavor = atoi(row[129]); + entry.UNK123 = atoi(row[130]); + entry.UNK124 = atoi(row[131]); + entry.attuneable = atoi(row[132]); + entry.nopet = atoi(row[133]); + entry.updated = row[134] ? row[134] : ""; + entry.comment = row[135] ? row[135] : ""; + entry.UNK127 = atoi(row[136]); + entry.pointtype = atoi(row[137]); + entry.potionbelt = atoi(row[138]); + entry.potionbeltslots = atoi(row[139]); + entry.stacksize = atoi(row[140]); + entry.notransfer = atoi(row[141]); + entry.stackable = atoi(row[142]); + entry.UNK134 = row[143] ? row[143] : ""; + entry.UNK137 = atoi(row[144]); + entry.proceffect = atoi(row[145]); + entry.proctype = atoi(row[146]); + entry.proclevel2 = atoi(row[147]); + entry.proclevel = atoi(row[148]); + entry.UNK142 = atoi(row[149]); + entry.worneffect = atoi(row[150]); + entry.worntype = atoi(row[151]); + entry.wornlevel2 = atoi(row[152]); + entry.wornlevel = atoi(row[153]); + entry.UNK147 = atoi(row[154]); + entry.focustype = atoi(row[155]); + entry.focuslevel2 = atoi(row[156]); + entry.focuslevel = atoi(row[157]); + entry.UNK152 = atoi(row[158]); + entry.scrolleffect = atoi(row[159]); + entry.scrolltype = atoi(row[160]); + entry.scrolllevel2 = atoi(row[161]); + entry.scrolllevel = atoi(row[162]); + entry.UNK157 = atoi(row[163]); + entry.serialized = row[164] ? row[164] : ""; + entry.verified = row[165] ? row[165] : ""; + entry.serialization = row[166] ? row[166] : ""; + entry.source = row[167] ? row[167] : ""; + entry.UNK033 = atoi(row[168]); + entry.lorefile = row[169] ? row[169] : ""; + entry.UNK014 = atoi(row[170]); + entry.svcorruption = atoi(row[171]); + entry.skillmodmax = atoi(row[172]); + entry.UNK060 = atoi(row[173]); + entry.augslot1unk2 = atoi(row[174]); + entry.augslot2unk2 = atoi(row[175]); + entry.augslot3unk2 = atoi(row[176]); + entry.augslot4unk2 = atoi(row[177]); + entry.augslot5unk2 = atoi(row[178]); + entry.augslot6unk2 = atoi(row[179]); + entry.UNK120 = atoi(row[180]); + entry.UNK121 = atoi(row[181]); + entry.questitemflag = atoi(row[182]); + entry.UNK132 = row[183] ? row[183] : ""; + entry.clickunk5 = atoi(row[184]); + entry.clickunk6 = row[185] ? row[185] : ""; + entry.clickunk7 = atoi(row[186]); + entry.procunk1 = atoi(row[187]); + entry.procunk2 = atoi(row[188]); + entry.procunk3 = atoi(row[189]); + entry.procunk4 = atoi(row[190]); + entry.procunk6 = row[191] ? row[191] : ""; + entry.procunk7 = atoi(row[192]); + entry.wornunk1 = atoi(row[193]); + entry.wornunk2 = atoi(row[194]); + entry.wornunk3 = atoi(row[195]); + entry.wornunk4 = atoi(row[196]); + entry.wornunk5 = atoi(row[197]); + entry.wornunk6 = row[198] ? row[198] : ""; + entry.wornunk7 = atoi(row[199]); + entry.focusunk1 = atoi(row[200]); + entry.focusunk2 = atoi(row[201]); + entry.focusunk3 = atoi(row[202]); + entry.focusunk4 = atoi(row[203]); + entry.focusunk5 = atoi(row[204]); + entry.focusunk6 = row[205] ? row[205] : ""; + entry.focusunk7 = atoi(row[206]); + entry.scrollunk1 = atoi(row[207]); + entry.scrollunk2 = atoi(row[208]); + entry.scrollunk3 = atoi(row[209]); + entry.scrollunk4 = atoi(row[210]); + entry.scrollunk5 = atoi(row[211]); + entry.scrollunk6 = row[212] ? row[212] : ""; + entry.scrollunk7 = atoi(row[213]); + entry.UNK193 = atoi(row[214]); + entry.purity = atoi(row[215]); + entry.evoitem = atoi(row[216]); + entry.evoid = atoi(row[217]); + entry.evolvinglevel = atoi(row[218]); + entry.evomax = atoi(row[219]); + entry.clickname = row[220] ? row[220] : ""; + entry.procname = row[221] ? row[221] : ""; + entry.wornname = row[222] ? row[222] : ""; + entry.focusname = row[223] ? row[223] : ""; + entry.scrollname = row[224] ? row[224] : ""; + entry.dsmitigation = atoi(row[225]); + entry.heroic_str = atoi(row[226]); + entry.heroic_int = atoi(row[227]); + entry.heroic_wis = atoi(row[228]); + entry.heroic_agi = atoi(row[229]); + entry.heroic_dex = atoi(row[230]); + entry.heroic_sta = atoi(row[231]); + entry.heroic_cha = atoi(row[232]); + entry.heroic_pr = atoi(row[233]); + entry.heroic_dr = atoi(row[234]); + entry.heroic_fr = atoi(row[235]); + entry.heroic_cr = atoi(row[236]); + entry.heroic_mr = atoi(row[237]); + entry.heroic_svcorrup = atoi(row[238]); + entry.healamt = atoi(row[239]); + entry.spelldmg = atoi(row[240]); + entry.clairvoyance = atoi(row[241]); + entry.backstabdmg = atoi(row[242]); + entry.created = row[243] ? row[243] : ""; + entry.elitematerial = atoi(row[244]); + entry.ldonsellbackrate = atoi(row[245]); + entry.scriptfileid = atoi(row[246]); + entry.expendablearrow = atoi(row[247]); + entry.powersourcecapacity = atoi(row[248]); + entry.bardeffect = atoi(row[249]); + entry.bardeffecttype = atoi(row[250]); + entry.bardlevel2 = atoi(row[251]); + entry.bardlevel = atoi(row[252]); + entry.bardunk1 = atoi(row[253]); + entry.bardunk2 = atoi(row[254]); + entry.bardunk3 = atoi(row[255]); + entry.bardunk4 = atoi(row[256]); + entry.bardunk5 = atoi(row[257]); + entry.bardname = row[258] ? row[258] : ""; + entry.bardunk7 = atoi(row[259]); + entry.UNK214 = atoi(row[260]); + entry.subtype = atoi(row[261]); + entry.UNK220 = atoi(row[262]); + entry.UNK221 = atoi(row[263]); + entry.heirloom = atoi(row[264]); + entry.UNK223 = atoi(row[265]); + entry.UNK224 = atoi(row[266]); + entry.UNK225 = atoi(row[267]); + entry.UNK226 = atoi(row[268]); + entry.UNK227 = atoi(row[269]); + entry.UNK228 = atoi(row[270]); + entry.UNK229 = atoi(row[271]); + entry.UNK230 = atoi(row[272]); + entry.UNK231 = atoi(row[273]); + entry.UNK232 = atoi(row[274]); + entry.UNK233 = atoi(row[275]); + entry.UNK234 = atoi(row[276]); + entry.placeable = atoi(row[277]); + entry.UNK236 = atoi(row[278]); + entry.UNK237 = atoi(row[279]); + entry.UNK238 = atoi(row[280]); + entry.UNK239 = atoi(row[281]); + entry.UNK240 = atoi(row[282]); + entry.UNK241 = atoi(row[283]); + entry.epicitem = atoi(row[284]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Items entry{}; + + entry.id = atoi(row[0]); + entry.minstatus = atoi(row[1]); + entry.Name = row[2] ? row[2] : ""; + entry.aagi = atoi(row[3]); + entry.ac = atoi(row[4]); + entry.accuracy = atoi(row[5]); + entry.acha = atoi(row[6]); + entry.adex = atoi(row[7]); + entry.aint = atoi(row[8]); + entry.artifactflag = atoi(row[9]); + entry.asta = atoi(row[10]); + entry.astr = atoi(row[11]); + entry.attack = atoi(row[12]); + entry.augrestrict = atoi(row[13]); + entry.augslot1type = atoi(row[14]); + entry.augslot1visible = atoi(row[15]); + entry.augslot2type = atoi(row[16]); + entry.augslot2visible = atoi(row[17]); + entry.augslot3type = atoi(row[18]); + entry.augslot3visible = atoi(row[19]); + entry.augslot4type = atoi(row[20]); + entry.augslot4visible = atoi(row[21]); + entry.augslot5type = atoi(row[22]); + entry.augslot5visible = atoi(row[23]); + entry.augslot6type = atoi(row[24]); + entry.augslot6visible = atoi(row[25]); + entry.augtype = atoi(row[26]); + entry.avoidance = atoi(row[27]); + entry.awis = atoi(row[28]); + entry.bagsize = atoi(row[29]); + entry.bagslots = atoi(row[30]); + entry.bagtype = atoi(row[31]); + entry.bagwr = atoi(row[32]); + entry.banedmgamt = atoi(row[33]); + entry.banedmgraceamt = atoi(row[34]); + entry.banedmgbody = atoi(row[35]); + entry.banedmgrace = atoi(row[36]); + entry.bardtype = atoi(row[37]); + entry.bardvalue = atoi(row[38]); + entry.book = atoi(row[39]); + entry.casttime = atoi(row[40]); + entry.casttime_ = atoi(row[41]); + entry.charmfile = row[42] ? row[42] : ""; + entry.charmfileid = row[43] ? row[43] : ""; + entry.classes = atoi(row[44]); + entry.color = atoi(row[45]); + entry.combateffects = row[46] ? row[46] : ""; + entry.extradmgskill = atoi(row[47]); + entry.extradmgamt = atoi(row[48]); + entry.price = atoi(row[49]); + entry.cr = atoi(row[50]); + entry.damage = atoi(row[51]); + entry.damageshield = atoi(row[52]); + entry.deity = atoi(row[53]); + entry.delay = atoi(row[54]); + entry.augdistiller = atoi(row[55]); + entry.dotshielding = atoi(row[56]); + entry.dr = atoi(row[57]); + entry.clicktype = atoi(row[58]); + entry.clicklevel2 = atoi(row[59]); + entry.elemdmgtype = atoi(row[60]); + entry.elemdmgamt = atoi(row[61]); + entry.endur = atoi(row[62]); + entry.factionamt1 = atoi(row[63]); + entry.factionamt2 = atoi(row[64]); + entry.factionamt3 = atoi(row[65]); + entry.factionamt4 = atoi(row[66]); + entry.factionmod1 = atoi(row[67]); + entry.factionmod2 = atoi(row[68]); + entry.factionmod3 = atoi(row[69]); + entry.factionmod4 = atoi(row[70]); + entry.filename = row[71] ? row[71] : ""; + entry.focuseffect = atoi(row[72]); + entry.fr = atoi(row[73]); + entry.fvnodrop = atoi(row[74]); + entry.haste = atoi(row[75]); + entry.clicklevel = atoi(row[76]); + entry.hp = atoi(row[77]); + entry.regen = atoi(row[78]); + entry.icon = atoi(row[79]); + entry.idfile = row[80] ? row[80] : ""; + entry.itemclass = atoi(row[81]); + entry.itemtype = atoi(row[82]); + entry.ldonprice = atoi(row[83]); + entry.ldontheme = atoi(row[84]); + entry.ldonsold = atoi(row[85]); + entry.light = atoi(row[86]); + entry.lore = row[87] ? row[87] : ""; + entry.loregroup = atoi(row[88]); + entry.magic = atoi(row[89]); + entry.mana = atoi(row[90]); + entry.manaregen = atoi(row[91]); + entry.enduranceregen = atoi(row[92]); + entry.material = atoi(row[93]); + entry.herosforgemodel = atoi(row[94]); + entry.maxcharges = atoi(row[95]); + entry.mr = atoi(row[96]); + entry.nodrop = atoi(row[97]); + entry.norent = atoi(row[98]); + entry.pendingloreflag = atoi(row[99]); + entry.pr = atoi(row[100]); + entry.procrate = atoi(row[101]); + entry.races = atoi(row[102]); + entry.range = atoi(row[103]); + entry.reclevel = atoi(row[104]); + entry.recskill = atoi(row[105]); + entry.reqlevel = atoi(row[106]); + entry.sellrate = static_cast(atof(row[107])); + entry.shielding = atoi(row[108]); + entry.size = atoi(row[109]); + entry.skillmodtype = atoi(row[110]); + entry.skillmodvalue = atoi(row[111]); + entry.slots = atoi(row[112]); + entry.clickeffect = atoi(row[113]); + entry.spellshield = atoi(row[114]); + entry.strikethrough = atoi(row[115]); + entry.stunresist = atoi(row[116]); + entry.summonedflag = atoi(row[117]); + entry.tradeskills = atoi(row[118]); + entry.favor = atoi(row[119]); + entry.weight = atoi(row[120]); + entry.UNK012 = atoi(row[121]); + entry.UNK013 = atoi(row[122]); + entry.benefitflag = atoi(row[123]); + entry.UNK054 = atoi(row[124]); + entry.UNK059 = atoi(row[125]); + entry.booktype = atoi(row[126]); + entry.recastdelay = atoi(row[127]); + entry.recasttype = atoi(row[128]); + entry.guildfavor = atoi(row[129]); + entry.UNK123 = atoi(row[130]); + entry.UNK124 = atoi(row[131]); + entry.attuneable = atoi(row[132]); + entry.nopet = atoi(row[133]); + entry.updated = row[134] ? row[134] : ""; + entry.comment = row[135] ? row[135] : ""; + entry.UNK127 = atoi(row[136]); + entry.pointtype = atoi(row[137]); + entry.potionbelt = atoi(row[138]); + entry.potionbeltslots = atoi(row[139]); + entry.stacksize = atoi(row[140]); + entry.notransfer = atoi(row[141]); + entry.stackable = atoi(row[142]); + entry.UNK134 = row[143] ? row[143] : ""; + entry.UNK137 = atoi(row[144]); + entry.proceffect = atoi(row[145]); + entry.proctype = atoi(row[146]); + entry.proclevel2 = atoi(row[147]); + entry.proclevel = atoi(row[148]); + entry.UNK142 = atoi(row[149]); + entry.worneffect = atoi(row[150]); + entry.worntype = atoi(row[151]); + entry.wornlevel2 = atoi(row[152]); + entry.wornlevel = atoi(row[153]); + entry.UNK147 = atoi(row[154]); + entry.focustype = atoi(row[155]); + entry.focuslevel2 = atoi(row[156]); + entry.focuslevel = atoi(row[157]); + entry.UNK152 = atoi(row[158]); + entry.scrolleffect = atoi(row[159]); + entry.scrolltype = atoi(row[160]); + entry.scrolllevel2 = atoi(row[161]); + entry.scrolllevel = atoi(row[162]); + entry.UNK157 = atoi(row[163]); + entry.serialized = row[164] ? row[164] : ""; + entry.verified = row[165] ? row[165] : ""; + entry.serialization = row[166] ? row[166] : ""; + entry.source = row[167] ? row[167] : ""; + entry.UNK033 = atoi(row[168]); + entry.lorefile = row[169] ? row[169] : ""; + entry.UNK014 = atoi(row[170]); + entry.svcorruption = atoi(row[171]); + entry.skillmodmax = atoi(row[172]); + entry.UNK060 = atoi(row[173]); + entry.augslot1unk2 = atoi(row[174]); + entry.augslot2unk2 = atoi(row[175]); + entry.augslot3unk2 = atoi(row[176]); + entry.augslot4unk2 = atoi(row[177]); + entry.augslot5unk2 = atoi(row[178]); + entry.augslot6unk2 = atoi(row[179]); + entry.UNK120 = atoi(row[180]); + entry.UNK121 = atoi(row[181]); + entry.questitemflag = atoi(row[182]); + entry.UNK132 = row[183] ? row[183] : ""; + entry.clickunk5 = atoi(row[184]); + entry.clickunk6 = row[185] ? row[185] : ""; + entry.clickunk7 = atoi(row[186]); + entry.procunk1 = atoi(row[187]); + entry.procunk2 = atoi(row[188]); + entry.procunk3 = atoi(row[189]); + entry.procunk4 = atoi(row[190]); + entry.procunk6 = row[191] ? row[191] : ""; + entry.procunk7 = atoi(row[192]); + entry.wornunk1 = atoi(row[193]); + entry.wornunk2 = atoi(row[194]); + entry.wornunk3 = atoi(row[195]); + entry.wornunk4 = atoi(row[196]); + entry.wornunk5 = atoi(row[197]); + entry.wornunk6 = row[198] ? row[198] : ""; + entry.wornunk7 = atoi(row[199]); + entry.focusunk1 = atoi(row[200]); + entry.focusunk2 = atoi(row[201]); + entry.focusunk3 = atoi(row[202]); + entry.focusunk4 = atoi(row[203]); + entry.focusunk5 = atoi(row[204]); + entry.focusunk6 = row[205] ? row[205] : ""; + entry.focusunk7 = atoi(row[206]); + entry.scrollunk1 = atoi(row[207]); + entry.scrollunk2 = atoi(row[208]); + entry.scrollunk3 = atoi(row[209]); + entry.scrollunk4 = atoi(row[210]); + entry.scrollunk5 = atoi(row[211]); + entry.scrollunk6 = row[212] ? row[212] : ""; + entry.scrollunk7 = atoi(row[213]); + entry.UNK193 = atoi(row[214]); + entry.purity = atoi(row[215]); + entry.evoitem = atoi(row[216]); + entry.evoid = atoi(row[217]); + entry.evolvinglevel = atoi(row[218]); + entry.evomax = atoi(row[219]); + entry.clickname = row[220] ? row[220] : ""; + entry.procname = row[221] ? row[221] : ""; + entry.wornname = row[222] ? row[222] : ""; + entry.focusname = row[223] ? row[223] : ""; + entry.scrollname = row[224] ? row[224] : ""; + entry.dsmitigation = atoi(row[225]); + entry.heroic_str = atoi(row[226]); + entry.heroic_int = atoi(row[227]); + entry.heroic_wis = atoi(row[228]); + entry.heroic_agi = atoi(row[229]); + entry.heroic_dex = atoi(row[230]); + entry.heroic_sta = atoi(row[231]); + entry.heroic_cha = atoi(row[232]); + entry.heroic_pr = atoi(row[233]); + entry.heroic_dr = atoi(row[234]); + entry.heroic_fr = atoi(row[235]); + entry.heroic_cr = atoi(row[236]); + entry.heroic_mr = atoi(row[237]); + entry.heroic_svcorrup = atoi(row[238]); + entry.healamt = atoi(row[239]); + entry.spelldmg = atoi(row[240]); + entry.clairvoyance = atoi(row[241]); + entry.backstabdmg = atoi(row[242]); + entry.created = row[243] ? row[243] : ""; + entry.elitematerial = atoi(row[244]); + entry.ldonsellbackrate = atoi(row[245]); + entry.scriptfileid = atoi(row[246]); + entry.expendablearrow = atoi(row[247]); + entry.powersourcecapacity = atoi(row[248]); + entry.bardeffect = atoi(row[249]); + entry.bardeffecttype = atoi(row[250]); + entry.bardlevel2 = atoi(row[251]); + entry.bardlevel = atoi(row[252]); + entry.bardunk1 = atoi(row[253]); + entry.bardunk2 = atoi(row[254]); + entry.bardunk3 = atoi(row[255]); + entry.bardunk4 = atoi(row[256]); + entry.bardunk5 = atoi(row[257]); + entry.bardname = row[258] ? row[258] : ""; + entry.bardunk7 = atoi(row[259]); + entry.UNK214 = atoi(row[260]); + entry.subtype = atoi(row[261]); + entry.UNK220 = atoi(row[262]); + entry.UNK221 = atoi(row[263]); + entry.heirloom = atoi(row[264]); + entry.UNK223 = atoi(row[265]); + entry.UNK224 = atoi(row[266]); + entry.UNK225 = atoi(row[267]); + entry.UNK226 = atoi(row[268]); + entry.UNK227 = atoi(row[269]); + entry.UNK228 = atoi(row[270]); + entry.UNK229 = atoi(row[271]); + entry.UNK230 = atoi(row[272]); + entry.UNK231 = atoi(row[273]); + entry.UNK232 = atoi(row[274]); + entry.UNK233 = atoi(row[275]); + entry.UNK234 = atoi(row[276]); + entry.placeable = atoi(row[277]); + entry.UNK236 = atoi(row[278]); + entry.UNK237 = atoi(row[279]); + entry.UNK238 = atoi(row[280]); + entry.UNK239 = atoi(row[281]); + entry.UNK240 = atoi(row[282]); + entry.UNK241 = atoi(row[283]); + entry.epicitem = atoi(row[284]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ITEMS_REPOSITORY_H diff --git a/common/repositories/base/base_launcher_repository.h b/common/repositories/base/base_launcher_repository.h new file mode 100644 index 000000000..047f027ce --- /dev/null +++ b/common/repositories/base/base_launcher_repository.h @@ -0,0 +1,309 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + */ + +/** + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to + * the repository extending the base. Any modifications to base repositories are to + * be made by the generator only + */ + +#ifndef EQEMU_BASE_LAUNCHER_REPOSITORY_H +#define EQEMU_BASE_LAUNCHER_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLauncherRepository { +public: + struct Launcher { + std::string name; + int8 dynamics; + }; + + static std::string PrimaryKey() + { + return std::string("name"); + } + + static std::vector Columns() + { + return { + "name", + "dynamics", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("launcher"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static Launcher NewEntity() + { + Launcher entry{}; + + entry.name = ""; + entry.dynamics = 0; + + return entry; + } + + static Launcher GetLauncherEntry( + const std::vector &launchers, + int launcher_id + ) + { + for (auto &launcher : launchers) { + if (launcher.name == launcher_id) { + return launcher; + } + } + + return NewEntity(); + } + + static Launcher FindOne( + int launcher_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + launcher_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Launcher entry{}; + + entry.name = row[0] ? row[0] : ""; + entry.dynamics = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int launcher_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + launcher_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Launcher launcher_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(launcher_entry.name) + "'"); + update_values.push_back(columns[1] + " = " + std::to_string(launcher_entry.dynamics)); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + launcher_entry.name + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Launcher InsertOne( + Launcher launcher_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(launcher_entry.name) + "'"); + insert_values.push_back(std::to_string(launcher_entry.dynamics)); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + launcher_entry.name = results.LastInsertedID(); + return launcher_entry; + } + + launcher_entry = NewEntity(); + + return launcher_entry; + } + + static int InsertMany( + std::vector launcher_entries + ) + { + std::vector insert_chunks; + + for (auto &launcher_entry: launcher_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(launcher_entry.name) + "'"); + insert_values.push_back(std::to_string(launcher_entry.dynamics)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Launcher entry{}; + + entry.name = row[0] ? row[0] : ""; + entry.dynamics = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(std::string where_filter) + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Launcher entry{}; + + entry.name = row[0] ? row[0] : ""; + entry.dynamics = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(std::string where_filter) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + PrimaryKey(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LAUNCHER_REPOSITORY_H diff --git a/common/repositories/base/base_ldon_trap_entries_repository.h b/common/repositories/base/base_ldon_trap_entries_repository.h new file mode 100644 index 000000000..05fc73bf5 --- /dev/null +++ b/common/repositories/base/base_ldon_trap_entries_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LDON_TRAP_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_LDON_TRAP_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLdonTrapEntriesRepository { +public: + struct LdonTrapEntries { + int id; + int trap_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "trap_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("ldon_trap_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LdonTrapEntries NewEntity() + { + LdonTrapEntries entry{}; + + entry.id = 0; + entry.trap_id = 0; + + return entry; + } + + static LdonTrapEntries GetLdonTrapEntriesEntry( + const std::vector &ldon_trap_entriess, + int ldon_trap_entries_id + ) + { + for (auto &ldon_trap_entries : ldon_trap_entriess) { + if (ldon_trap_entries.id == ldon_trap_entries_id) { + return ldon_trap_entries; + } + } + + return NewEntity(); + } + + static LdonTrapEntries FindOne( + Database& db, + int ldon_trap_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + ldon_trap_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LdonTrapEntries entry{}; + + entry.id = atoi(row[0]); + entry.trap_id = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int ldon_trap_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + ldon_trap_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LdonTrapEntries ldon_trap_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(ldon_trap_entries_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(ldon_trap_entries_entry.trap_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + ldon_trap_entries_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LdonTrapEntries InsertOne( + Database& db, + LdonTrapEntries ldon_trap_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(ldon_trap_entries_entry.id)); + insert_values.push_back(std::to_string(ldon_trap_entries_entry.trap_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + ldon_trap_entries_entry.id = results.LastInsertedID(); + return ldon_trap_entries_entry; + } + + ldon_trap_entries_entry = NewEntity(); + + return ldon_trap_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector ldon_trap_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &ldon_trap_entries_entry: ldon_trap_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(ldon_trap_entries_entry.id)); + insert_values.push_back(std::to_string(ldon_trap_entries_entry.trap_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LdonTrapEntries entry{}; + + entry.id = atoi(row[0]); + entry.trap_id = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LdonTrapEntries entry{}; + + entry.id = atoi(row[0]); + entry.trap_id = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LDON_TRAP_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_ldon_trap_templates_repository.h b/common/repositories/base/base_ldon_trap_templates_repository.h new file mode 100644 index 000000000..27def1890 --- /dev/null +++ b/common/repositories/base/base_ldon_trap_templates_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LDON_TRAP_TEMPLATES_REPOSITORY_H +#define EQEMU_BASE_LDON_TRAP_TEMPLATES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLdonTrapTemplatesRepository { +public: + struct LdonTrapTemplates { + int id; + int type; + int spell_id; + int skill; + int locked; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "type", + "spell_id", + "skill", + "locked", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("ldon_trap_templates"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LdonTrapTemplates NewEntity() + { + LdonTrapTemplates entry{}; + + entry.id = 0; + entry.type = 1; + entry.spell_id = 0; + entry.skill = 0; + entry.locked = 0; + + return entry; + } + + static LdonTrapTemplates GetLdonTrapTemplatesEntry( + const std::vector &ldon_trap_templatess, + int ldon_trap_templates_id + ) + { + for (auto &ldon_trap_templates : ldon_trap_templatess) { + if (ldon_trap_templates.id == ldon_trap_templates_id) { + return ldon_trap_templates; + } + } + + return NewEntity(); + } + + static LdonTrapTemplates FindOne( + Database& db, + int ldon_trap_templates_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + ldon_trap_templates_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LdonTrapTemplates entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.spell_id = atoi(row[2]); + entry.skill = atoi(row[3]); + entry.locked = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int ldon_trap_templates_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + ldon_trap_templates_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LdonTrapTemplates ldon_trap_templates_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(ldon_trap_templates_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(ldon_trap_templates_entry.type)); + update_values.push_back(columns[2] + " = " + std::to_string(ldon_trap_templates_entry.spell_id)); + update_values.push_back(columns[3] + " = " + std::to_string(ldon_trap_templates_entry.skill)); + update_values.push_back(columns[4] + " = " + std::to_string(ldon_trap_templates_entry.locked)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + ldon_trap_templates_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LdonTrapTemplates InsertOne( + Database& db, + LdonTrapTemplates ldon_trap_templates_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(ldon_trap_templates_entry.id)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.type)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.spell_id)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.skill)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.locked)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + ldon_trap_templates_entry.id = results.LastInsertedID(); + return ldon_trap_templates_entry; + } + + ldon_trap_templates_entry = NewEntity(); + + return ldon_trap_templates_entry; + } + + static int InsertMany( + Database& db, + std::vector ldon_trap_templates_entries + ) + { + std::vector insert_chunks; + + for (auto &ldon_trap_templates_entry: ldon_trap_templates_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(ldon_trap_templates_entry.id)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.type)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.spell_id)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.skill)); + insert_values.push_back(std::to_string(ldon_trap_templates_entry.locked)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LdonTrapTemplates entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.spell_id = atoi(row[2]); + entry.skill = atoi(row[3]); + entry.locked = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LdonTrapTemplates entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.spell_id = atoi(row[2]); + entry.skill = atoi(row[3]); + entry.locked = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LDON_TRAP_TEMPLATES_REPOSITORY_H diff --git a/common/repositories/base/base_level_exp_mods_repository.h b/common/repositories/base/base_level_exp_mods_repository.h new file mode 100644 index 000000000..eaa4a5f4a --- /dev/null +++ b/common/repositories/base/base_level_exp_mods_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LEVEL_EXP_MODS_REPOSITORY_H +#define EQEMU_BASE_LEVEL_EXP_MODS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLevelExpModsRepository { +public: + struct LevelExpMods { + int level; + float exp_mod; + float aa_exp_mod; + }; + + static std::string PrimaryKey() + { + return std::string("level"); + } + + static std::vector Columns() + { + return { + "level", + "exp_mod", + "aa_exp_mod", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("level_exp_mods"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LevelExpMods NewEntity() + { + LevelExpMods entry{}; + + entry.level = 0; + entry.exp_mod = 0; + entry.aa_exp_mod = 0; + + return entry; + } + + static LevelExpMods GetLevelExpModsEntry( + const std::vector &level_exp_modss, + int level_exp_mods_id + ) + { + for (auto &level_exp_mods : level_exp_modss) { + if (level_exp_mods.level == level_exp_mods_id) { + return level_exp_mods; + } + } + + return NewEntity(); + } + + static LevelExpMods FindOne( + Database& db, + int level_exp_mods_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + level_exp_mods_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LevelExpMods entry{}; + + entry.level = atoi(row[0]); + entry.exp_mod = static_cast(atof(row[1])); + entry.aa_exp_mod = static_cast(atof(row[2])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int level_exp_mods_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + level_exp_mods_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LevelExpMods level_exp_mods_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(level_exp_mods_entry.level)); + update_values.push_back(columns[1] + " = " + std::to_string(level_exp_mods_entry.exp_mod)); + update_values.push_back(columns[2] + " = " + std::to_string(level_exp_mods_entry.aa_exp_mod)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + level_exp_mods_entry.level + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LevelExpMods InsertOne( + Database& db, + LevelExpMods level_exp_mods_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(level_exp_mods_entry.level)); + insert_values.push_back(std::to_string(level_exp_mods_entry.exp_mod)); + insert_values.push_back(std::to_string(level_exp_mods_entry.aa_exp_mod)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + level_exp_mods_entry.level = results.LastInsertedID(); + return level_exp_mods_entry; + } + + level_exp_mods_entry = NewEntity(); + + return level_exp_mods_entry; + } + + static int InsertMany( + Database& db, + std::vector level_exp_mods_entries + ) + { + std::vector insert_chunks; + + for (auto &level_exp_mods_entry: level_exp_mods_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(level_exp_mods_entry.level)); + insert_values.push_back(std::to_string(level_exp_mods_entry.exp_mod)); + insert_values.push_back(std::to_string(level_exp_mods_entry.aa_exp_mod)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LevelExpMods entry{}; + + entry.level = atoi(row[0]); + entry.exp_mod = static_cast(atof(row[1])); + entry.aa_exp_mod = static_cast(atof(row[2])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LevelExpMods entry{}; + + entry.level = atoi(row[0]); + entry.exp_mod = static_cast(atof(row[1])); + entry.aa_exp_mod = static_cast(atof(row[2])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LEVEL_EXP_MODS_REPOSITORY_H diff --git a/common/repositories/base/base_lfguild_repository.h b/common/repositories/base/base_lfguild_repository.h new file mode 100644 index 000000000..10e2f0682 --- /dev/null +++ b/common/repositories/base/base_lfguild_repository.h @@ -0,0 +1,356 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LFGUILD_REPOSITORY_H +#define EQEMU_BASE_LFGUILD_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLfguildRepository { +public: + struct Lfguild { + int type; + std::string name; + std::string comment; + int fromlevel; + int tolevel; + int classes; + int aacount; + int timezone; + int timeposted; + }; + + static std::string PrimaryKey() + { + return std::string("type"); + } + + static std::vector Columns() + { + return { + "type", + "name", + "comment", + "fromlevel", + "tolevel", + "classes", + "aacount", + "timezone", + "timeposted", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("lfguild"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Lfguild NewEntity() + { + Lfguild entry{}; + + entry.type = 0; + entry.name = ""; + entry.comment = ""; + entry.fromlevel = 0; + entry.tolevel = 0; + entry.classes = 0; + entry.aacount = 0; + entry.timezone = 0; + entry.timeposted = 0; + + return entry; + } + + static Lfguild GetLfguildEntry( + const std::vector &lfguilds, + int lfguild_id + ) + { + for (auto &lfguild : lfguilds) { + if (lfguild.type == lfguild_id) { + return lfguild; + } + } + + return NewEntity(); + } + + static Lfguild FindOne( + Database& db, + int lfguild_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + lfguild_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Lfguild entry{}; + + entry.type = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.comment = row[2] ? row[2] : ""; + entry.fromlevel = atoi(row[3]); + entry.tolevel = atoi(row[4]); + entry.classes = atoi(row[5]); + entry.aacount = atoi(row[6]); + entry.timezone = atoi(row[7]); + entry.timeposted = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int lfguild_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + lfguild_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Lfguild lfguild_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(lfguild_entry.type)); + update_values.push_back(columns[1] + " = '" + EscapeString(lfguild_entry.name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(lfguild_entry.comment) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(lfguild_entry.fromlevel)); + update_values.push_back(columns[4] + " = " + std::to_string(lfguild_entry.tolevel)); + update_values.push_back(columns[5] + " = " + std::to_string(lfguild_entry.classes)); + update_values.push_back(columns[6] + " = " + std::to_string(lfguild_entry.aacount)); + update_values.push_back(columns[7] + " = " + std::to_string(lfguild_entry.timezone)); + update_values.push_back(columns[8] + " = " + std::to_string(lfguild_entry.timeposted)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + lfguild_entry.type + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Lfguild InsertOne( + Database& db, + Lfguild lfguild_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(lfguild_entry.type)); + insert_values.push_back("'" + EscapeString(lfguild_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(lfguild_entry.comment) + "'"); + insert_values.push_back(std::to_string(lfguild_entry.fromlevel)); + insert_values.push_back(std::to_string(lfguild_entry.tolevel)); + insert_values.push_back(std::to_string(lfguild_entry.classes)); + insert_values.push_back(std::to_string(lfguild_entry.aacount)); + insert_values.push_back(std::to_string(lfguild_entry.timezone)); + insert_values.push_back(std::to_string(lfguild_entry.timeposted)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + lfguild_entry.type = results.LastInsertedID(); + return lfguild_entry; + } + + lfguild_entry = NewEntity(); + + return lfguild_entry; + } + + static int InsertMany( + Database& db, + std::vector lfguild_entries + ) + { + std::vector insert_chunks; + + for (auto &lfguild_entry: lfguild_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(lfguild_entry.type)); + insert_values.push_back("'" + EscapeString(lfguild_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(lfguild_entry.comment) + "'"); + insert_values.push_back(std::to_string(lfguild_entry.fromlevel)); + insert_values.push_back(std::to_string(lfguild_entry.tolevel)); + insert_values.push_back(std::to_string(lfguild_entry.classes)); + insert_values.push_back(std::to_string(lfguild_entry.aacount)); + insert_values.push_back(std::to_string(lfguild_entry.timezone)); + insert_values.push_back(std::to_string(lfguild_entry.timeposted)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Lfguild entry{}; + + entry.type = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.comment = row[2] ? row[2] : ""; + entry.fromlevel = atoi(row[3]); + entry.tolevel = atoi(row[4]); + entry.classes = atoi(row[5]); + entry.aacount = atoi(row[6]); + entry.timezone = atoi(row[7]); + entry.timeposted = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Lfguild entry{}; + + entry.type = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.comment = row[2] ? row[2] : ""; + entry.fromlevel = atoi(row[3]); + entry.tolevel = atoi(row[4]); + entry.classes = atoi(row[5]); + entry.aacount = atoi(row[6]); + entry.timezone = atoi(row[7]); + entry.timeposted = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LFGUILD_REPOSITORY_H diff --git a/common/repositories/base/base_login_accounts_repository.h b/common/repositories/base/base_login_accounts_repository.h new file mode 100644 index 000000000..25dc167d1 --- /dev/null +++ b/common/repositories/base/base_login_accounts_repository.h @@ -0,0 +1,356 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOGIN_ACCOUNTS_REPOSITORY_H +#define EQEMU_BASE_LOGIN_ACCOUNTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoginAccountsRepository { +public: + struct LoginAccounts { + int id; + std::string account_name; + std::string account_password; + std::string account_email; + std::string source_loginserver; + std::string last_ip_address; + std::string last_login_date; + std::string created_at; + std::string updated_at; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "account_name", + "account_password", + "account_email", + "source_loginserver", + "last_ip_address", + "last_login_date", + "created_at", + "updated_at", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("login_accounts"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LoginAccounts NewEntity() + { + LoginAccounts entry{}; + + entry.id = 0; + entry.account_name = ""; + entry.account_password = ""; + entry.account_email = ""; + entry.source_loginserver = ""; + entry.last_ip_address = ""; + entry.last_login_date = 0; + entry.created_at = 0; + entry.updated_at = current_timestamp(); + + return entry; + } + + static LoginAccounts GetLoginAccountsEntry( + const std::vector &login_accountss, + int login_accounts_id + ) + { + for (auto &login_accounts : login_accountss) { + if (login_accounts.id == login_accounts_id) { + return login_accounts; + } + } + + return NewEntity(); + } + + static LoginAccounts FindOne( + Database& db, + int login_accounts_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + login_accounts_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LoginAccounts entry{}; + + entry.id = atoi(row[0]); + entry.account_name = row[1] ? row[1] : ""; + entry.account_password = row[2] ? row[2] : ""; + entry.account_email = row[3] ? row[3] : ""; + entry.source_loginserver = row[4] ? row[4] : ""; + entry.last_ip_address = row[5] ? row[5] : ""; + entry.last_login_date = row[6] ? row[6] : ""; + entry.created_at = row[7] ? row[7] : ""; + entry.updated_at = row[8] ? row[8] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int login_accounts_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + login_accounts_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LoginAccounts login_accounts_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(login_accounts_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(login_accounts_entry.account_name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(login_accounts_entry.account_password) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(login_accounts_entry.account_email) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(login_accounts_entry.source_loginserver) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(login_accounts_entry.last_ip_address) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(login_accounts_entry.last_login_date) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(login_accounts_entry.created_at) + "'"); + update_values.push_back(columns[8] + " = '" + EscapeString(login_accounts_entry.updated_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + login_accounts_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LoginAccounts InsertOne( + Database& db, + LoginAccounts login_accounts_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_accounts_entry.id)); + insert_values.push_back("'" + EscapeString(login_accounts_entry.account_name) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.account_password) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.account_email) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.source_loginserver) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.last_ip_address) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.last_login_date) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.created_at) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.updated_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + login_accounts_entry.id = results.LastInsertedID(); + return login_accounts_entry; + } + + login_accounts_entry = NewEntity(); + + return login_accounts_entry; + } + + static int InsertMany( + Database& db, + std::vector login_accounts_entries + ) + { + std::vector insert_chunks; + + for (auto &login_accounts_entry: login_accounts_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_accounts_entry.id)); + insert_values.push_back("'" + EscapeString(login_accounts_entry.account_name) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.account_password) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.account_email) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.source_loginserver) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.last_ip_address) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.last_login_date) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.created_at) + "'"); + insert_values.push_back("'" + EscapeString(login_accounts_entry.updated_at) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginAccounts entry{}; + + entry.id = atoi(row[0]); + entry.account_name = row[1] ? row[1] : ""; + entry.account_password = row[2] ? row[2] : ""; + entry.account_email = row[3] ? row[3] : ""; + entry.source_loginserver = row[4] ? row[4] : ""; + entry.last_ip_address = row[5] ? row[5] : ""; + entry.last_login_date = row[6] ? row[6] : ""; + entry.created_at = row[7] ? row[7] : ""; + entry.updated_at = row[8] ? row[8] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginAccounts entry{}; + + entry.id = atoi(row[0]); + entry.account_name = row[1] ? row[1] : ""; + entry.account_password = row[2] ? row[2] : ""; + entry.account_email = row[3] ? row[3] : ""; + entry.source_loginserver = row[4] ? row[4] : ""; + entry.last_ip_address = row[5] ? row[5] : ""; + entry.last_login_date = row[6] ? row[6] : ""; + entry.created_at = row[7] ? row[7] : ""; + entry.updated_at = row[8] ? row[8] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOGIN_ACCOUNTS_REPOSITORY_H diff --git a/common/repositories/base/base_login_api_tokens_repository.h b/common/repositories/base/base_login_api_tokens_repository.h new file mode 100644 index 000000000..88ed5c74a --- /dev/null +++ b/common/repositories/base/base_login_api_tokens_repository.h @@ -0,0 +1,328 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOGIN_API_TOKENS_REPOSITORY_H +#define EQEMU_BASE_LOGIN_API_TOKENS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoginApiTokensRepository { +public: + struct LoginApiTokens { + int id; + std::string token; + int can_write; + int can_read; + std::string created_at; + std::string updated_at; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "token", + "can_write", + "can_read", + "created_at", + "updated_at", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("login_api_tokens"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LoginApiTokens NewEntity() + { + LoginApiTokens entry{}; + + entry.id = 0; + entry.token = ""; + entry.can_write = 0; + entry.can_read = 0; + entry.created_at = 0; + entry.updated_at = current_timestamp(); + + return entry; + } + + static LoginApiTokens GetLoginApiTokensEntry( + const std::vector &login_api_tokenss, + int login_api_tokens_id + ) + { + for (auto &login_api_tokens : login_api_tokenss) { + if (login_api_tokens.id == login_api_tokens_id) { + return login_api_tokens; + } + } + + return NewEntity(); + } + + static LoginApiTokens FindOne( + Database& db, + int login_api_tokens_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + login_api_tokens_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LoginApiTokens entry{}; + + entry.id = atoi(row[0]); + entry.token = row[1] ? row[1] : ""; + entry.can_write = atoi(row[2]); + entry.can_read = atoi(row[3]); + entry.created_at = row[4] ? row[4] : ""; + entry.updated_at = row[5] ? row[5] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int login_api_tokens_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + login_api_tokens_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LoginApiTokens login_api_tokens_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(login_api_tokens_entry.token) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(login_api_tokens_entry.can_write)); + update_values.push_back(columns[3] + " = " + std::to_string(login_api_tokens_entry.can_read)); + update_values.push_back(columns[4] + " = '" + EscapeString(login_api_tokens_entry.created_at) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(login_api_tokens_entry.updated_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + login_api_tokens_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LoginApiTokens InsertOne( + Database& db, + LoginApiTokens login_api_tokens_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_api_tokens_entry.id)); + insert_values.push_back("'" + EscapeString(login_api_tokens_entry.token) + "'"); + insert_values.push_back(std::to_string(login_api_tokens_entry.can_write)); + insert_values.push_back(std::to_string(login_api_tokens_entry.can_read)); + insert_values.push_back("'" + EscapeString(login_api_tokens_entry.created_at) + "'"); + insert_values.push_back("'" + EscapeString(login_api_tokens_entry.updated_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + login_api_tokens_entry.id = results.LastInsertedID(); + return login_api_tokens_entry; + } + + login_api_tokens_entry = NewEntity(); + + return login_api_tokens_entry; + } + + static int InsertMany( + Database& db, + std::vector login_api_tokens_entries + ) + { + std::vector insert_chunks; + + for (auto &login_api_tokens_entry: login_api_tokens_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_api_tokens_entry.id)); + insert_values.push_back("'" + EscapeString(login_api_tokens_entry.token) + "'"); + insert_values.push_back(std::to_string(login_api_tokens_entry.can_write)); + insert_values.push_back(std::to_string(login_api_tokens_entry.can_read)); + insert_values.push_back("'" + EscapeString(login_api_tokens_entry.created_at) + "'"); + insert_values.push_back("'" + EscapeString(login_api_tokens_entry.updated_at) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginApiTokens entry{}; + + entry.id = atoi(row[0]); + entry.token = row[1] ? row[1] : ""; + entry.can_write = atoi(row[2]); + entry.can_read = atoi(row[3]); + entry.created_at = row[4] ? row[4] : ""; + entry.updated_at = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginApiTokens entry{}; + + entry.id = atoi(row[0]); + entry.token = row[1] ? row[1] : ""; + entry.can_write = atoi(row[2]); + entry.can_read = atoi(row[3]); + entry.created_at = row[4] ? row[4] : ""; + entry.updated_at = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOGIN_API_TOKENS_REPOSITORY_H diff --git a/common/repositories/base/base_login_server_admins_repository.h b/common/repositories/base/base_login_server_admins_repository.h new file mode 100644 index 000000000..771eb014f --- /dev/null +++ b/common/repositories/base/base_login_server_admins_repository.h @@ -0,0 +1,346 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOGIN_SERVER_ADMINS_REPOSITORY_H +#define EQEMU_BASE_LOGIN_SERVER_ADMINS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoginServerAdminsRepository { +public: + struct LoginServerAdmins { + int id; + std::string account_name; + std::string account_password; + std::string first_name; + std::string last_name; + std::string email; + std::string registration_date; + std::string registration_ip_address; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "account_name", + "account_password", + "first_name", + "last_name", + "email", + "registration_date", + "registration_ip_address", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("login_server_admins"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LoginServerAdmins NewEntity() + { + LoginServerAdmins entry{}; + + entry.id = 0; + entry.account_name = ""; + entry.account_password = ""; + entry.first_name = ""; + entry.last_name = ""; + entry.email = ""; + entry.registration_date = 0; + entry.registration_ip_address = ""; + + return entry; + } + + static LoginServerAdmins GetLoginServerAdminsEntry( + const std::vector &login_server_adminss, + int login_server_admins_id + ) + { + for (auto &login_server_admins : login_server_adminss) { + if (login_server_admins.id == login_server_admins_id) { + return login_server_admins; + } + } + + return NewEntity(); + } + + static LoginServerAdmins FindOne( + Database& db, + int login_server_admins_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + login_server_admins_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LoginServerAdmins entry{}; + + entry.id = atoi(row[0]); + entry.account_name = row[1] ? row[1] : ""; + entry.account_password = row[2] ? row[2] : ""; + entry.first_name = row[3] ? row[3] : ""; + entry.last_name = row[4] ? row[4] : ""; + entry.email = row[5] ? row[5] : ""; + entry.registration_date = row[6] ? row[6] : ""; + entry.registration_ip_address = row[7] ? row[7] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int login_server_admins_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + login_server_admins_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LoginServerAdmins login_server_admins_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(login_server_admins_entry.account_name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(login_server_admins_entry.account_password) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(login_server_admins_entry.first_name) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(login_server_admins_entry.last_name) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(login_server_admins_entry.email) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(login_server_admins_entry.registration_date) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(login_server_admins_entry.registration_ip_address) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + login_server_admins_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LoginServerAdmins InsertOne( + Database& db, + LoginServerAdmins login_server_admins_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_server_admins_entry.id)); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.account_name) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.account_password) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.first_name) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.last_name) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.email) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.registration_date) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.registration_ip_address) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + login_server_admins_entry.id = results.LastInsertedID(); + return login_server_admins_entry; + } + + login_server_admins_entry = NewEntity(); + + return login_server_admins_entry; + } + + static int InsertMany( + Database& db, + std::vector login_server_admins_entries + ) + { + std::vector insert_chunks; + + for (auto &login_server_admins_entry: login_server_admins_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_server_admins_entry.id)); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.account_name) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.account_password) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.first_name) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.last_name) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.email) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.registration_date) + "'"); + insert_values.push_back("'" + EscapeString(login_server_admins_entry.registration_ip_address) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginServerAdmins entry{}; + + entry.id = atoi(row[0]); + entry.account_name = row[1] ? row[1] : ""; + entry.account_password = row[2] ? row[2] : ""; + entry.first_name = row[3] ? row[3] : ""; + entry.last_name = row[4] ? row[4] : ""; + entry.email = row[5] ? row[5] : ""; + entry.registration_date = row[6] ? row[6] : ""; + entry.registration_ip_address = row[7] ? row[7] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginServerAdmins entry{}; + + entry.id = atoi(row[0]); + entry.account_name = row[1] ? row[1] : ""; + entry.account_password = row[2] ? row[2] : ""; + entry.first_name = row[3] ? row[3] : ""; + entry.last_name = row[4] ? row[4] : ""; + entry.email = row[5] ? row[5] : ""; + entry.registration_date = row[6] ? row[6] : ""; + entry.registration_ip_address = row[7] ? row[7] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOGIN_SERVER_ADMINS_REPOSITORY_H diff --git a/common/repositories/base/base_login_server_list_types_repository.h b/common/repositories/base/base_login_server_list_types_repository.h new file mode 100644 index 000000000..16b47381c --- /dev/null +++ b/common/repositories/base/base_login_server_list_types_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOGIN_SERVER_LIST_TYPES_REPOSITORY_H +#define EQEMU_BASE_LOGIN_SERVER_LIST_TYPES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoginServerListTypesRepository { +public: + struct LoginServerListTypes { + int id; + std::string description; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "description", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("login_server_list_types"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LoginServerListTypes NewEntity() + { + LoginServerListTypes entry{}; + + entry.id = 0; + entry.description = ""; + + return entry; + } + + static LoginServerListTypes GetLoginServerListTypesEntry( + const std::vector &login_server_list_typess, + int login_server_list_types_id + ) + { + for (auto &login_server_list_types : login_server_list_typess) { + if (login_server_list_types.id == login_server_list_types_id) { + return login_server_list_types; + } + } + + return NewEntity(); + } + + static LoginServerListTypes FindOne( + Database& db, + int login_server_list_types_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + login_server_list_types_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LoginServerListTypes entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int login_server_list_types_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + login_server_list_types_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LoginServerListTypes login_server_list_types_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(login_server_list_types_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(login_server_list_types_entry.description) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + login_server_list_types_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LoginServerListTypes InsertOne( + Database& db, + LoginServerListTypes login_server_list_types_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_server_list_types_entry.id)); + insert_values.push_back("'" + EscapeString(login_server_list_types_entry.description) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + login_server_list_types_entry.id = results.LastInsertedID(); + return login_server_list_types_entry; + } + + login_server_list_types_entry = NewEntity(); + + return login_server_list_types_entry; + } + + static int InsertMany( + Database& db, + std::vector login_server_list_types_entries + ) + { + std::vector insert_chunks; + + for (auto &login_server_list_types_entry: login_server_list_types_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_server_list_types_entry.id)); + insert_values.push_back("'" + EscapeString(login_server_list_types_entry.description) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginServerListTypes entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginServerListTypes entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOGIN_SERVER_LIST_TYPES_REPOSITORY_H diff --git a/common/repositories/base/base_login_world_servers_repository.h b/common/repositories/base/base_login_world_servers_repository.h new file mode 100644 index 000000000..96dc1f8ae --- /dev/null +++ b/common/repositories/base/base_login_world_servers_repository.h @@ -0,0 +1,364 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOGIN_WORLD_SERVERS_REPOSITORY_H +#define EQEMU_BASE_LOGIN_WORLD_SERVERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoginWorldServersRepository { +public: + struct LoginWorldServers { + int id; + std::string long_name; + std::string short_name; + std::string tag_description; + int login_server_list_type_id; + std::string last_login_date; + std::string last_ip_address; + int login_server_admin_id; + int is_server_trusted; + std::string note; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "long_name", + "short_name", + "tag_description", + "login_server_list_type_id", + "last_login_date", + "last_ip_address", + "login_server_admin_id", + "is_server_trusted", + "note", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("login_world_servers"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LoginWorldServers NewEntity() + { + LoginWorldServers entry{}; + + entry.id = 0; + entry.long_name = ""; + entry.short_name = ""; + entry.tag_description = ""; + entry.login_server_list_type_id = 0; + entry.last_login_date = 0; + entry.last_ip_address = ""; + entry.login_server_admin_id = 0; + entry.is_server_trusted = 0; + entry.note = ""; + + return entry; + } + + static LoginWorldServers GetLoginWorldServersEntry( + const std::vector &login_world_serverss, + int login_world_servers_id + ) + { + for (auto &login_world_servers : login_world_serverss) { + if (login_world_servers.id == login_world_servers_id) { + return login_world_servers; + } + } + + return NewEntity(); + } + + static LoginWorldServers FindOne( + Database& db, + int login_world_servers_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + login_world_servers_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LoginWorldServers entry{}; + + entry.id = atoi(row[0]); + entry.long_name = row[1] ? row[1] : ""; + entry.short_name = row[2] ? row[2] : ""; + entry.tag_description = row[3] ? row[3] : ""; + entry.login_server_list_type_id = atoi(row[4]); + entry.last_login_date = row[5] ? row[5] : ""; + entry.last_ip_address = row[6] ? row[6] : ""; + entry.login_server_admin_id = atoi(row[7]); + entry.is_server_trusted = atoi(row[8]); + entry.note = row[9] ? row[9] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int login_world_servers_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + login_world_servers_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LoginWorldServers login_world_servers_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(login_world_servers_entry.long_name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(login_world_servers_entry.short_name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(login_world_servers_entry.tag_description) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(login_world_servers_entry.login_server_list_type_id)); + update_values.push_back(columns[5] + " = '" + EscapeString(login_world_servers_entry.last_login_date) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(login_world_servers_entry.last_ip_address) + "'"); + update_values.push_back(columns[7] + " = " + std::to_string(login_world_servers_entry.login_server_admin_id)); + update_values.push_back(columns[8] + " = " + std::to_string(login_world_servers_entry.is_server_trusted)); + update_values.push_back(columns[9] + " = '" + EscapeString(login_world_servers_entry.note) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + login_world_servers_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LoginWorldServers InsertOne( + Database& db, + LoginWorldServers login_world_servers_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_world_servers_entry.id)); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.long_name) + "'"); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.short_name) + "'"); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.tag_description) + "'"); + insert_values.push_back(std::to_string(login_world_servers_entry.login_server_list_type_id)); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.last_login_date) + "'"); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.last_ip_address) + "'"); + insert_values.push_back(std::to_string(login_world_servers_entry.login_server_admin_id)); + insert_values.push_back(std::to_string(login_world_servers_entry.is_server_trusted)); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.note) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + login_world_servers_entry.id = results.LastInsertedID(); + return login_world_servers_entry; + } + + login_world_servers_entry = NewEntity(); + + return login_world_servers_entry; + } + + static int InsertMany( + Database& db, + std::vector login_world_servers_entries + ) + { + std::vector insert_chunks; + + for (auto &login_world_servers_entry: login_world_servers_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(login_world_servers_entry.id)); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.long_name) + "'"); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.short_name) + "'"); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.tag_description) + "'"); + insert_values.push_back(std::to_string(login_world_servers_entry.login_server_list_type_id)); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.last_login_date) + "'"); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.last_ip_address) + "'"); + insert_values.push_back(std::to_string(login_world_servers_entry.login_server_admin_id)); + insert_values.push_back(std::to_string(login_world_servers_entry.is_server_trusted)); + insert_values.push_back("'" + EscapeString(login_world_servers_entry.note) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginWorldServers entry{}; + + entry.id = atoi(row[0]); + entry.long_name = row[1] ? row[1] : ""; + entry.short_name = row[2] ? row[2] : ""; + entry.tag_description = row[3] ? row[3] : ""; + entry.login_server_list_type_id = atoi(row[4]); + entry.last_login_date = row[5] ? row[5] : ""; + entry.last_ip_address = row[6] ? row[6] : ""; + entry.login_server_admin_id = atoi(row[7]); + entry.is_server_trusted = atoi(row[8]); + entry.note = row[9] ? row[9] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoginWorldServers entry{}; + + entry.id = atoi(row[0]); + entry.long_name = row[1] ? row[1] : ""; + entry.short_name = row[2] ? row[2] : ""; + entry.tag_description = row[3] ? row[3] : ""; + entry.login_server_list_type_id = atoi(row[4]); + entry.last_login_date = row[5] ? row[5] : ""; + entry.last_ip_address = row[6] ? row[6] : ""; + entry.login_server_admin_id = atoi(row[7]); + entry.is_server_trusted = atoi(row[8]); + entry.note = row[9] ? row[9] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOGIN_WORLD_SERVERS_REPOSITORY_H diff --git a/common/repositories/base/base_logsys_categories_repository.h b/common/repositories/base/base_logsys_categories_repository.h new file mode 100644 index 000000000..4077e32f7 --- /dev/null +++ b/common/repositories/base/base_logsys_categories_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H +#define EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLogsysCategoriesRepository { +public: + struct LogsysCategories { + int log_category_id; + std::string log_category_description; + int log_to_console; + int log_to_file; + int log_to_gmsay; + }; + + static std::string PrimaryKey() + { + return std::string("log_category_id"); + } + + static std::vector Columns() + { + return { + "log_category_id", + "log_category_description", + "log_to_console", + "log_to_file", + "log_to_gmsay", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("logsys_categories"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LogsysCategories NewEntity() + { + LogsysCategories entry{}; + + entry.log_category_id = 0; + entry.log_category_description = ""; + entry.log_to_console = 0; + entry.log_to_file = 0; + entry.log_to_gmsay = 0; + + return entry; + } + + static LogsysCategories GetLogsysCategoriesEntry( + const std::vector &logsys_categoriess, + int logsys_categories_id + ) + { + for (auto &logsys_categories : logsys_categoriess) { + if (logsys_categories.log_category_id == logsys_categories_id) { + return logsys_categories; + } + } + + return NewEntity(); + } + + static LogsysCategories FindOne( + Database& db, + int logsys_categories_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + logsys_categories_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LogsysCategories entry{}; + + entry.log_category_id = atoi(row[0]); + entry.log_category_description = row[1] ? row[1] : ""; + entry.log_to_console = atoi(row[2]); + entry.log_to_file = atoi(row[3]); + entry.log_to_gmsay = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int logsys_categories_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + logsys_categories_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LogsysCategories logsys_categories_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(logsys_categories_entry.log_category_id)); + update_values.push_back(columns[1] + " = '" + EscapeString(logsys_categories_entry.log_category_description) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(logsys_categories_entry.log_to_console)); + update_values.push_back(columns[3] + " = " + std::to_string(logsys_categories_entry.log_to_file)); + update_values.push_back(columns[4] + " = " + std::to_string(logsys_categories_entry.log_to_gmsay)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + logsys_categories_entry.log_category_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LogsysCategories InsertOne( + Database& db, + LogsysCategories logsys_categories_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(logsys_categories_entry.log_category_id)); + insert_values.push_back("'" + EscapeString(logsys_categories_entry.log_category_description) + "'"); + insert_values.push_back(std::to_string(logsys_categories_entry.log_to_console)); + insert_values.push_back(std::to_string(logsys_categories_entry.log_to_file)); + insert_values.push_back(std::to_string(logsys_categories_entry.log_to_gmsay)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + logsys_categories_entry.log_category_id = results.LastInsertedID(); + return logsys_categories_entry; + } + + logsys_categories_entry = NewEntity(); + + return logsys_categories_entry; + } + + static int InsertMany( + Database& db, + std::vector logsys_categories_entries + ) + { + std::vector insert_chunks; + + for (auto &logsys_categories_entry: logsys_categories_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(logsys_categories_entry.log_category_id)); + insert_values.push_back("'" + EscapeString(logsys_categories_entry.log_category_description) + "'"); + insert_values.push_back(std::to_string(logsys_categories_entry.log_to_console)); + insert_values.push_back(std::to_string(logsys_categories_entry.log_to_file)); + insert_values.push_back(std::to_string(logsys_categories_entry.log_to_gmsay)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LogsysCategories entry{}; + + entry.log_category_id = atoi(row[0]); + entry.log_category_description = row[1] ? row[1] : ""; + entry.log_to_console = atoi(row[2]); + entry.log_to_file = atoi(row[3]); + entry.log_to_gmsay = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LogsysCategories entry{}; + + entry.log_category_id = atoi(row[0]); + entry.log_category_description = row[1] ? row[1] : ""; + entry.log_to_console = atoi(row[2]); + entry.log_to_file = atoi(row[3]); + entry.log_to_gmsay = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H diff --git a/common/repositories/base/base_lootdrop_entries_repository.h b/common/repositories/base/base_lootdrop_entries_repository.h new file mode 100644 index 000000000..524b00588 --- /dev/null +++ b/common/repositories/base/base_lootdrop_entries_repository.h @@ -0,0 +1,374 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOOTDROP_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_LOOTDROP_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLootdropEntriesRepository { +public: + struct LootdropEntries { + int lootdrop_id; + int item_id; + int item_charges; + int equip_item; + float chance; + float disabled_chance; + int trivial_min_level; + int trivial_max_level; + int multiplier; + int npc_min_level; + int npc_max_level; + }; + + static std::string PrimaryKey() + { + return std::string("lootdrop_id"); + } + + static std::vector Columns() + { + return { + "lootdrop_id", + "item_id", + "item_charges", + "equip_item", + "chance", + "disabled_chance", + "trivial_min_level", + "trivial_max_level", + "multiplier", + "npc_min_level", + "npc_max_level", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("lootdrop_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LootdropEntries NewEntity() + { + LootdropEntries entry{}; + + entry.lootdrop_id = 0; + entry.item_id = 0; + entry.item_charges = 1; + entry.equip_item = 0; + entry.chance = 1; + entry.disabled_chance = 0; + entry.trivial_min_level = 0; + entry.trivial_max_level = 0; + entry.multiplier = 1; + entry.npc_min_level = 0; + entry.npc_max_level = 0; + + return entry; + } + + static LootdropEntries GetLootdropEntriesEntry( + const std::vector &lootdrop_entriess, + int lootdrop_entries_id + ) + { + for (auto &lootdrop_entries : lootdrop_entriess) { + if (lootdrop_entries.lootdrop_id == lootdrop_entries_id) { + return lootdrop_entries; + } + } + + return NewEntity(); + } + + static LootdropEntries FindOne( + Database& db, + int lootdrop_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + lootdrop_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LootdropEntries entry{}; + + entry.lootdrop_id = atoi(row[0]); + entry.item_id = atoi(row[1]); + entry.item_charges = atoi(row[2]); + entry.equip_item = atoi(row[3]); + entry.chance = static_cast(atof(row[4])); + entry.disabled_chance = static_cast(atof(row[5])); + entry.trivial_min_level = atoi(row[6]); + entry.trivial_max_level = atoi(row[7]); + entry.multiplier = atoi(row[8]); + entry.npc_min_level = atoi(row[9]); + entry.npc_max_level = atoi(row[10]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int lootdrop_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + lootdrop_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LootdropEntries lootdrop_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(lootdrop_entries_entry.lootdrop_id)); + update_values.push_back(columns[1] + " = " + std::to_string(lootdrop_entries_entry.item_id)); + update_values.push_back(columns[2] + " = " + std::to_string(lootdrop_entries_entry.item_charges)); + update_values.push_back(columns[3] + " = " + std::to_string(lootdrop_entries_entry.equip_item)); + update_values.push_back(columns[4] + " = " + std::to_string(lootdrop_entries_entry.chance)); + update_values.push_back(columns[5] + " = " + std::to_string(lootdrop_entries_entry.disabled_chance)); + update_values.push_back(columns[6] + " = " + std::to_string(lootdrop_entries_entry.trivial_min_level)); + update_values.push_back(columns[7] + " = " + std::to_string(lootdrop_entries_entry.trivial_max_level)); + update_values.push_back(columns[8] + " = " + std::to_string(lootdrop_entries_entry.multiplier)); + update_values.push_back(columns[9] + " = " + std::to_string(lootdrop_entries_entry.npc_min_level)); + update_values.push_back(columns[10] + " = " + std::to_string(lootdrop_entries_entry.npc_max_level)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + lootdrop_entries_entry.lootdrop_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LootdropEntries InsertOne( + Database& db, + LootdropEntries lootdrop_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(lootdrop_entries_entry.lootdrop_id)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.item_id)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.item_charges)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.equip_item)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.chance)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.disabled_chance)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.trivial_min_level)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.trivial_max_level)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.multiplier)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.npc_min_level)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.npc_max_level)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + lootdrop_entries_entry.lootdrop_id = results.LastInsertedID(); + return lootdrop_entries_entry; + } + + lootdrop_entries_entry = NewEntity(); + + return lootdrop_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector lootdrop_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &lootdrop_entries_entry: lootdrop_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(lootdrop_entries_entry.lootdrop_id)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.item_id)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.item_charges)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.equip_item)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.chance)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.disabled_chance)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.trivial_min_level)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.trivial_max_level)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.multiplier)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.npc_min_level)); + insert_values.push_back(std::to_string(lootdrop_entries_entry.npc_max_level)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LootdropEntries entry{}; + + entry.lootdrop_id = atoi(row[0]); + entry.item_id = atoi(row[1]); + entry.item_charges = atoi(row[2]); + entry.equip_item = atoi(row[3]); + entry.chance = static_cast(atof(row[4])); + entry.disabled_chance = static_cast(atof(row[5])); + entry.trivial_min_level = atoi(row[6]); + entry.trivial_max_level = atoi(row[7]); + entry.multiplier = atoi(row[8]); + entry.npc_min_level = atoi(row[9]); + entry.npc_max_level = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LootdropEntries entry{}; + + entry.lootdrop_id = atoi(row[0]); + entry.item_id = atoi(row[1]); + entry.item_charges = atoi(row[2]); + entry.equip_item = atoi(row[3]); + entry.chance = static_cast(atof(row[4])); + entry.disabled_chance = static_cast(atof(row[5])); + entry.trivial_min_level = atoi(row[6]); + entry.trivial_max_level = atoi(row[7]); + entry.multiplier = atoi(row[8]); + entry.npc_min_level = atoi(row[9]); + entry.npc_max_level = atoi(row[10]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOOTDROP_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_lootdrop_repository.h b/common/repositories/base/base_lootdrop_repository.h new file mode 100644 index 000000000..abacd5f8b --- /dev/null +++ b/common/repositories/base/base_lootdrop_repository.h @@ -0,0 +1,328 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOOTDROP_REPOSITORY_H +#define EQEMU_BASE_LOOTDROP_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLootdropRepository { +public: + struct Lootdrop { + int id; + std::string name; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("lootdrop"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Lootdrop NewEntity() + { + Lootdrop entry{}; + + entry.id = 0; + entry.name = ""; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Lootdrop GetLootdropEntry( + const std::vector &lootdrops, + int lootdrop_id + ) + { + for (auto &lootdrop : lootdrops) { + if (lootdrop.id == lootdrop_id) { + return lootdrop; + } + } + + return NewEntity(); + } + + static Lootdrop FindOne( + Database& db, + int lootdrop_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + lootdrop_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Lootdrop entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.min_expansion = atoi(row[2]); + entry.max_expansion = atoi(row[3]); + entry.content_flags = row[4] ? row[4] : ""; + entry.content_flags_disabled = row[5] ? row[5] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int lootdrop_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + lootdrop_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Lootdrop lootdrop_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(lootdrop_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(lootdrop_entry.min_expansion)); + update_values.push_back(columns[3] + " = " + std::to_string(lootdrop_entry.max_expansion)); + update_values.push_back(columns[4] + " = '" + EscapeString(lootdrop_entry.content_flags) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(lootdrop_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + lootdrop_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Lootdrop InsertOne( + Database& db, + Lootdrop lootdrop_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(lootdrop_entry.id)); + insert_values.push_back("'" + EscapeString(lootdrop_entry.name) + "'"); + insert_values.push_back(std::to_string(lootdrop_entry.min_expansion)); + insert_values.push_back(std::to_string(lootdrop_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(lootdrop_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(lootdrop_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + lootdrop_entry.id = results.LastInsertedID(); + return lootdrop_entry; + } + + lootdrop_entry = NewEntity(); + + return lootdrop_entry; + } + + static int InsertMany( + Database& db, + std::vector lootdrop_entries + ) + { + std::vector insert_chunks; + + for (auto &lootdrop_entry: lootdrop_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(lootdrop_entry.id)); + insert_values.push_back("'" + EscapeString(lootdrop_entry.name) + "'"); + insert_values.push_back(std::to_string(lootdrop_entry.min_expansion)); + insert_values.push_back(std::to_string(lootdrop_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(lootdrop_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(lootdrop_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Lootdrop entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.min_expansion = atoi(row[2]); + entry.max_expansion = atoi(row[3]); + entry.content_flags = row[4] ? row[4] : ""; + entry.content_flags_disabled = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Lootdrop entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.min_expansion = atoi(row[2]); + entry.max_expansion = atoi(row[3]); + entry.content_flags = row[4] ? row[4] : ""; + entry.content_flags_disabled = row[5] ? row[5] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOOTDROP_REPOSITORY_H diff --git a/common/repositories/base/base_loottable_entries_repository.h b/common/repositories/base/base_loottable_entries_repository.h new file mode 100644 index 000000000..e8143e7e3 --- /dev/null +++ b/common/repositories/base/base_loottable_entries_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOOTTABLE_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_LOOTTABLE_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoottableEntriesRepository { +public: + struct LoottableEntries { + int loottable_id; + int lootdrop_id; + int multiplier; + int droplimit; + int mindrop; + float probability; + }; + + static std::string PrimaryKey() + { + return std::string("loottable_id"); + } + + static std::vector Columns() + { + return { + "loottable_id", + "lootdrop_id", + "multiplier", + "droplimit", + "mindrop", + "probability", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("loottable_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static LoottableEntries NewEntity() + { + LoottableEntries entry{}; + + entry.loottable_id = 0; + entry.lootdrop_id = 0; + entry.multiplier = 1; + entry.droplimit = 0; + entry.mindrop = 0; + entry.probability = 100; + + return entry; + } + + static LoottableEntries GetLoottableEntriesEntry( + const std::vector &loottable_entriess, + int loottable_entries_id + ) + { + for (auto &loottable_entries : loottable_entriess) { + if (loottable_entries.loottable_id == loottable_entries_id) { + return loottable_entries; + } + } + + return NewEntity(); + } + + static LoottableEntries FindOne( + Database& db, + int loottable_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + loottable_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + LoottableEntries entry{}; + + entry.loottable_id = atoi(row[0]); + entry.lootdrop_id = atoi(row[1]); + entry.multiplier = atoi(row[2]); + entry.droplimit = atoi(row[3]); + entry.mindrop = atoi(row[4]); + entry.probability = static_cast(atof(row[5])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int loottable_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + loottable_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + LoottableEntries loottable_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(loottable_entries_entry.loottable_id)); + update_values.push_back(columns[1] + " = " + std::to_string(loottable_entries_entry.lootdrop_id)); + update_values.push_back(columns[2] + " = " + std::to_string(loottable_entries_entry.multiplier)); + update_values.push_back(columns[3] + " = " + std::to_string(loottable_entries_entry.droplimit)); + update_values.push_back(columns[4] + " = " + std::to_string(loottable_entries_entry.mindrop)); + update_values.push_back(columns[5] + " = " + std::to_string(loottable_entries_entry.probability)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + loottable_entries_entry.loottable_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static LoottableEntries InsertOne( + Database& db, + LoottableEntries loottable_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(loottable_entries_entry.loottable_id)); + insert_values.push_back(std::to_string(loottable_entries_entry.lootdrop_id)); + insert_values.push_back(std::to_string(loottable_entries_entry.multiplier)); + insert_values.push_back(std::to_string(loottable_entries_entry.droplimit)); + insert_values.push_back(std::to_string(loottable_entries_entry.mindrop)); + insert_values.push_back(std::to_string(loottable_entries_entry.probability)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + loottable_entries_entry.loottable_id = results.LastInsertedID(); + return loottable_entries_entry; + } + + loottable_entries_entry = NewEntity(); + + return loottable_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector loottable_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &loottable_entries_entry: loottable_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(loottable_entries_entry.loottable_id)); + insert_values.push_back(std::to_string(loottable_entries_entry.lootdrop_id)); + insert_values.push_back(std::to_string(loottable_entries_entry.multiplier)); + insert_values.push_back(std::to_string(loottable_entries_entry.droplimit)); + insert_values.push_back(std::to_string(loottable_entries_entry.mindrop)); + insert_values.push_back(std::to_string(loottable_entries_entry.probability)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoottableEntries entry{}; + + entry.loottable_id = atoi(row[0]); + entry.lootdrop_id = atoi(row[1]); + entry.multiplier = atoi(row[2]); + entry.droplimit = atoi(row[3]); + entry.mindrop = atoi(row[4]); + entry.probability = static_cast(atof(row[5])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + LoottableEntries entry{}; + + entry.loottable_id = atoi(row[0]); + entry.lootdrop_id = atoi(row[1]); + entry.multiplier = atoi(row[2]); + entry.droplimit = atoi(row[3]); + entry.mindrop = atoi(row[4]); + entry.probability = static_cast(atof(row[5])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOOTTABLE_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_loottable_repository.h b/common/repositories/base/base_loottable_repository.h new file mode 100644 index 000000000..88ff30ec9 --- /dev/null +++ b/common/repositories/base/base_loottable_repository.h @@ -0,0 +1,364 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_LOOTTABLE_REPOSITORY_H +#define EQEMU_BASE_LOOTTABLE_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseLoottableRepository { +public: + struct Loottable { + int id; + std::string name; + int mincash; + int maxcash; + int avgcoin; + int done; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "mincash", + "maxcash", + "avgcoin", + "done", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("loottable"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Loottable NewEntity() + { + Loottable entry{}; + + entry.id = 0; + entry.name = ""; + entry.mincash = 0; + entry.maxcash = 0; + entry.avgcoin = 0; + entry.done = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Loottable GetLoottableEntry( + const std::vector &loottables, + int loottable_id + ) + { + for (auto &loottable : loottables) { + if (loottable.id == loottable_id) { + return loottable; + } + } + + return NewEntity(); + } + + static Loottable FindOne( + Database& db, + int loottable_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + loottable_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Loottable entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.mincash = atoi(row[2]); + entry.maxcash = atoi(row[3]); + entry.avgcoin = atoi(row[4]); + entry.done = atoi(row[5]); + entry.min_expansion = atoi(row[6]); + entry.max_expansion = atoi(row[7]); + entry.content_flags = row[8] ? row[8] : ""; + entry.content_flags_disabled = row[9] ? row[9] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int loottable_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + loottable_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Loottable loottable_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(loottable_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(loottable_entry.mincash)); + update_values.push_back(columns[3] + " = " + std::to_string(loottable_entry.maxcash)); + update_values.push_back(columns[4] + " = " + std::to_string(loottable_entry.avgcoin)); + update_values.push_back(columns[5] + " = " + std::to_string(loottable_entry.done)); + update_values.push_back(columns[6] + " = " + std::to_string(loottable_entry.min_expansion)); + update_values.push_back(columns[7] + " = " + std::to_string(loottable_entry.max_expansion)); + update_values.push_back(columns[8] + " = '" + EscapeString(loottable_entry.content_flags) + "'"); + update_values.push_back(columns[9] + " = '" + EscapeString(loottable_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + loottable_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Loottable InsertOne( + Database& db, + Loottable loottable_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(loottable_entry.id)); + insert_values.push_back("'" + EscapeString(loottable_entry.name) + "'"); + insert_values.push_back(std::to_string(loottable_entry.mincash)); + insert_values.push_back(std::to_string(loottable_entry.maxcash)); + insert_values.push_back(std::to_string(loottable_entry.avgcoin)); + insert_values.push_back(std::to_string(loottable_entry.done)); + insert_values.push_back(std::to_string(loottable_entry.min_expansion)); + insert_values.push_back(std::to_string(loottable_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(loottable_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(loottable_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + loottable_entry.id = results.LastInsertedID(); + return loottable_entry; + } + + loottable_entry = NewEntity(); + + return loottable_entry; + } + + static int InsertMany( + Database& db, + std::vector loottable_entries + ) + { + std::vector insert_chunks; + + for (auto &loottable_entry: loottable_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(loottable_entry.id)); + insert_values.push_back("'" + EscapeString(loottable_entry.name) + "'"); + insert_values.push_back(std::to_string(loottable_entry.mincash)); + insert_values.push_back(std::to_string(loottable_entry.maxcash)); + insert_values.push_back(std::to_string(loottable_entry.avgcoin)); + insert_values.push_back(std::to_string(loottable_entry.done)); + insert_values.push_back(std::to_string(loottable_entry.min_expansion)); + insert_values.push_back(std::to_string(loottable_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(loottable_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(loottable_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Loottable entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.mincash = atoi(row[2]); + entry.maxcash = atoi(row[3]); + entry.avgcoin = atoi(row[4]); + entry.done = atoi(row[5]); + entry.min_expansion = atoi(row[6]); + entry.max_expansion = atoi(row[7]); + entry.content_flags = row[8] ? row[8] : ""; + entry.content_flags_disabled = row[9] ? row[9] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Loottable entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.mincash = atoi(row[2]); + entry.maxcash = atoi(row[3]); + entry.avgcoin = atoi(row[4]); + entry.done = atoi(row[5]); + entry.min_expansion = atoi(row[6]); + entry.max_expansion = atoi(row[7]); + entry.content_flags = row[8] ? row[8] : ""; + entry.content_flags_disabled = row[9] ? row[9] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_LOOTTABLE_REPOSITORY_H diff --git a/common/repositories/base/base_mail_repository.h b/common/repositories/base/base_mail_repository.h new file mode 100644 index 000000000..674881b64 --- /dev/null +++ b/common/repositories/base/base_mail_repository.h @@ -0,0 +1,346 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_MAIL_REPOSITORY_H +#define EQEMU_BASE_MAIL_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseMailRepository { +public: + struct Mail { + int msgid; + int charid; + int timestamp; + std::string from; + std::string subject; + std::string body; + std::string to; + int status; + }; + + static std::string PrimaryKey() + { + return std::string("msgid"); + } + + static std::vector Columns() + { + return { + "msgid", + "charid", + "timestamp", + "from", + "subject", + "body", + "to", + "status", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("mail"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Mail NewEntity() + { + Mail entry{}; + + entry.msgid = 0; + entry.charid = 0; + entry.timestamp = 0; + entry.from = ""; + entry.subject = ""; + entry.body = ""; + entry.to = ""; + entry.status = 0; + + return entry; + } + + static Mail GetMailEntry( + const std::vector &mails, + int mail_id + ) + { + for (auto &mail : mails) { + if (mail.msgid == mail_id) { + return mail; + } + } + + return NewEntity(); + } + + static Mail FindOne( + Database& db, + int mail_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + mail_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Mail entry{}; + + entry.msgid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.timestamp = atoi(row[2]); + entry.from = row[3] ? row[3] : ""; + entry.subject = row[4] ? row[4] : ""; + entry.body = row[5] ? row[5] : ""; + entry.to = row[6] ? row[6] : ""; + entry.status = atoi(row[7]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int mail_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + mail_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Mail mail_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(mail_entry.charid)); + update_values.push_back(columns[2] + " = " + std::to_string(mail_entry.timestamp)); + update_values.push_back(columns[3] + " = '" + EscapeString(mail_entry.from) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(mail_entry.subject) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(mail_entry.body) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(mail_entry.to) + "'"); + update_values.push_back(columns[7] + " = " + std::to_string(mail_entry.status)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + mail_entry.msgid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Mail InsertOne( + Database& db, + Mail mail_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(mail_entry.msgid)); + insert_values.push_back(std::to_string(mail_entry.charid)); + insert_values.push_back(std::to_string(mail_entry.timestamp)); + insert_values.push_back("'" + EscapeString(mail_entry.from) + "'"); + insert_values.push_back("'" + EscapeString(mail_entry.subject) + "'"); + insert_values.push_back("'" + EscapeString(mail_entry.body) + "'"); + insert_values.push_back("'" + EscapeString(mail_entry.to) + "'"); + insert_values.push_back(std::to_string(mail_entry.status)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + mail_entry.msgid = results.LastInsertedID(); + return mail_entry; + } + + mail_entry = NewEntity(); + + return mail_entry; + } + + static int InsertMany( + Database& db, + std::vector mail_entries + ) + { + std::vector insert_chunks; + + for (auto &mail_entry: mail_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(mail_entry.msgid)); + insert_values.push_back(std::to_string(mail_entry.charid)); + insert_values.push_back(std::to_string(mail_entry.timestamp)); + insert_values.push_back("'" + EscapeString(mail_entry.from) + "'"); + insert_values.push_back("'" + EscapeString(mail_entry.subject) + "'"); + insert_values.push_back("'" + EscapeString(mail_entry.body) + "'"); + insert_values.push_back("'" + EscapeString(mail_entry.to) + "'"); + insert_values.push_back(std::to_string(mail_entry.status)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Mail entry{}; + + entry.msgid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.timestamp = atoi(row[2]); + entry.from = row[3] ? row[3] : ""; + entry.subject = row[4] ? row[4] : ""; + entry.body = row[5] ? row[5] : ""; + entry.to = row[6] ? row[6] : ""; + entry.status = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Mail entry{}; + + entry.msgid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.timestamp = atoi(row[2]); + entry.from = row[3] ? row[3] : ""; + entry.subject = row[4] ? row[4] : ""; + entry.body = row[5] ? row[5] : ""; + entry.to = row[6] ? row[6] : ""; + entry.status = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_MAIL_REPOSITORY_H diff --git a/common/repositories/base/base_merchantlist_repository.h b/common/repositories/base/base_merchantlist_repository.h new file mode 100644 index 000000000..437b419cd --- /dev/null +++ b/common/repositories/base/base_merchantlist_repository.h @@ -0,0 +1,383 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_MERCHANTLIST_REPOSITORY_H +#define EQEMU_BASE_MERCHANTLIST_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseMerchantlistRepository { +public: + struct Merchantlist { + int merchantid; + int slot; + int item; + int faction_required; + int level_required; + int alt_currency_cost; + int classes_required; + int probability; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("merchantid"); + } + + static std::vector Columns() + { + return { + "merchantid", + "slot", + "item", + "faction_required", + "level_required", + "alt_currency_cost", + "classes_required", + "probability", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("merchantlist"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Merchantlist NewEntity() + { + Merchantlist entry{}; + + entry.merchantid = 0; + entry.slot = 0; + entry.item = 0; + entry.faction_required = -100; + entry.level_required = 0; + entry.alt_currency_cost = 0; + entry.classes_required = 65535; + entry.probability = 100; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Merchantlist GetMerchantlistEntry( + const std::vector &merchantlists, + int merchantlist_id + ) + { + for (auto &merchantlist : merchantlists) { + if (merchantlist.merchantid == merchantlist_id) { + return merchantlist; + } + } + + return NewEntity(); + } + + static Merchantlist FindOne( + Database& db, + int merchantlist_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + merchantlist_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Merchantlist entry{}; + + entry.merchantid = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.item = atoi(row[2]); + entry.faction_required = atoi(row[3]); + entry.level_required = atoi(row[4]); + entry.alt_currency_cost = atoi(row[5]); + entry.classes_required = atoi(row[6]); + entry.probability = atoi(row[7]); + entry.min_expansion = atoi(row[8]); + entry.max_expansion = atoi(row[9]); + entry.content_flags = row[10] ? row[10] : ""; + entry.content_flags_disabled = row[11] ? row[11] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int merchantlist_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + merchantlist_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Merchantlist merchantlist_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(merchantlist_entry.merchantid)); + update_values.push_back(columns[1] + " = " + std::to_string(merchantlist_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(merchantlist_entry.item)); + update_values.push_back(columns[3] + " = " + std::to_string(merchantlist_entry.faction_required)); + update_values.push_back(columns[4] + " = " + std::to_string(merchantlist_entry.level_required)); + update_values.push_back(columns[5] + " = " + std::to_string(merchantlist_entry.alt_currency_cost)); + update_values.push_back(columns[6] + " = " + std::to_string(merchantlist_entry.classes_required)); + update_values.push_back(columns[7] + " = " + std::to_string(merchantlist_entry.probability)); + update_values.push_back(columns[8] + " = " + std::to_string(merchantlist_entry.min_expansion)); + update_values.push_back(columns[9] + " = " + std::to_string(merchantlist_entry.max_expansion)); + update_values.push_back(columns[10] + " = '" + EscapeString(merchantlist_entry.content_flags) + "'"); + update_values.push_back(columns[11] + " = '" + EscapeString(merchantlist_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + merchantlist_entry.merchantid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Merchantlist InsertOne( + Database& db, + Merchantlist merchantlist_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(merchantlist_entry.merchantid)); + insert_values.push_back(std::to_string(merchantlist_entry.slot)); + insert_values.push_back(std::to_string(merchantlist_entry.item)); + insert_values.push_back(std::to_string(merchantlist_entry.faction_required)); + insert_values.push_back(std::to_string(merchantlist_entry.level_required)); + insert_values.push_back(std::to_string(merchantlist_entry.alt_currency_cost)); + insert_values.push_back(std::to_string(merchantlist_entry.classes_required)); + insert_values.push_back(std::to_string(merchantlist_entry.probability)); + insert_values.push_back(std::to_string(merchantlist_entry.min_expansion)); + insert_values.push_back(std::to_string(merchantlist_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(merchantlist_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(merchantlist_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + merchantlist_entry.merchantid = results.LastInsertedID(); + return merchantlist_entry; + } + + merchantlist_entry = NewEntity(); + + return merchantlist_entry; + } + + static int InsertMany( + Database& db, + std::vector merchantlist_entries + ) + { + std::vector insert_chunks; + + for (auto &merchantlist_entry: merchantlist_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(merchantlist_entry.merchantid)); + insert_values.push_back(std::to_string(merchantlist_entry.slot)); + insert_values.push_back(std::to_string(merchantlist_entry.item)); + insert_values.push_back(std::to_string(merchantlist_entry.faction_required)); + insert_values.push_back(std::to_string(merchantlist_entry.level_required)); + insert_values.push_back(std::to_string(merchantlist_entry.alt_currency_cost)); + insert_values.push_back(std::to_string(merchantlist_entry.classes_required)); + insert_values.push_back(std::to_string(merchantlist_entry.probability)); + insert_values.push_back(std::to_string(merchantlist_entry.min_expansion)); + insert_values.push_back(std::to_string(merchantlist_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(merchantlist_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(merchantlist_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Merchantlist entry{}; + + entry.merchantid = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.item = atoi(row[2]); + entry.faction_required = atoi(row[3]); + entry.level_required = atoi(row[4]); + entry.alt_currency_cost = atoi(row[5]); + entry.classes_required = atoi(row[6]); + entry.probability = atoi(row[7]); + entry.min_expansion = atoi(row[8]); + entry.max_expansion = atoi(row[9]); + entry.content_flags = row[10] ? row[10] : ""; + entry.content_flags_disabled = row[11] ? row[11] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Merchantlist entry{}; + + entry.merchantid = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.item = atoi(row[2]); + entry.faction_required = atoi(row[3]); + entry.level_required = atoi(row[4]); + entry.alt_currency_cost = atoi(row[5]); + entry.classes_required = atoi(row[6]); + entry.probability = atoi(row[7]); + entry.min_expansion = atoi(row[8]); + entry.max_expansion = atoi(row[9]); + entry.content_flags = row[10] ? row[10] : ""; + entry.content_flags_disabled = row[11] ? row[11] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_MERCHANTLIST_REPOSITORY_H diff --git a/common/repositories/base/base_merchantlist_temp_repository.h b/common/repositories/base/base_merchantlist_temp_repository.h new file mode 100644 index 000000000..1db32b796 --- /dev/null +++ b/common/repositories/base/base_merchantlist_temp_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_MERCHANTLIST_TEMP_REPOSITORY_H +#define EQEMU_BASE_MERCHANTLIST_TEMP_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseMerchantlistTempRepository { +public: + struct MerchantlistTemp { + int npcid; + int slot; + int itemid; + int charges; + }; + + static std::string PrimaryKey() + { + return std::string("npcid"); + } + + static std::vector Columns() + { + return { + "npcid", + "slot", + "itemid", + "charges", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("merchantlist_temp"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static MerchantlistTemp NewEntity() + { + MerchantlistTemp entry{}; + + entry.npcid = 0; + entry.slot = 0; + entry.itemid = 0; + entry.charges = 1; + + return entry; + } + + static MerchantlistTemp GetMerchantlistTempEntry( + const std::vector &merchantlist_temps, + int merchantlist_temp_id + ) + { + for (auto &merchantlist_temp : merchantlist_temps) { + if (merchantlist_temp.npcid == merchantlist_temp_id) { + return merchantlist_temp; + } + } + + return NewEntity(); + } + + static MerchantlistTemp FindOne( + Database& db, + int merchantlist_temp_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + merchantlist_temp_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + MerchantlistTemp entry{}; + + entry.npcid = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int merchantlist_temp_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + merchantlist_temp_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + MerchantlistTemp merchantlist_temp_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(merchantlist_temp_entry.npcid)); + update_values.push_back(columns[1] + " = " + std::to_string(merchantlist_temp_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(merchantlist_temp_entry.itemid)); + update_values.push_back(columns[3] + " = " + std::to_string(merchantlist_temp_entry.charges)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + merchantlist_temp_entry.npcid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static MerchantlistTemp InsertOne( + Database& db, + MerchantlistTemp merchantlist_temp_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(merchantlist_temp_entry.npcid)); + insert_values.push_back(std::to_string(merchantlist_temp_entry.slot)); + insert_values.push_back(std::to_string(merchantlist_temp_entry.itemid)); + insert_values.push_back(std::to_string(merchantlist_temp_entry.charges)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + merchantlist_temp_entry.npcid = results.LastInsertedID(); + return merchantlist_temp_entry; + } + + merchantlist_temp_entry = NewEntity(); + + return merchantlist_temp_entry; + } + + static int InsertMany( + Database& db, + std::vector merchantlist_temp_entries + ) + { + std::vector insert_chunks; + + for (auto &merchantlist_temp_entry: merchantlist_temp_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(merchantlist_temp_entry.npcid)); + insert_values.push_back(std::to_string(merchantlist_temp_entry.slot)); + insert_values.push_back(std::to_string(merchantlist_temp_entry.itemid)); + insert_values.push_back(std::to_string(merchantlist_temp_entry.charges)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + MerchantlistTemp entry{}; + + entry.npcid = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + MerchantlistTemp entry{}; + + entry.npcid = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_MERCHANTLIST_TEMP_REPOSITORY_H diff --git a/common/repositories/base/base_name_filter_repository.h b/common/repositories/base/base_name_filter_repository.h new file mode 100644 index 000000000..5f9c19a8b --- /dev/null +++ b/common/repositories/base/base_name_filter_repository.h @@ -0,0 +1,292 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NAME_FILTER_REPOSITORY_H +#define EQEMU_BASE_NAME_FILTER_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNameFilterRepository { +public: + struct NameFilter { + int id; + std::string name; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("name_filter"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NameFilter NewEntity() + { + NameFilter entry{}; + + entry.id = 0; + entry.name = ""; + + return entry; + } + + static NameFilter GetNameFilterEntry( + const std::vector &name_filters, + int name_filter_id + ) + { + for (auto &name_filter : name_filters) { + if (name_filter.id == name_filter_id) { + return name_filter; + } + } + + return NewEntity(); + } + + static NameFilter FindOne( + Database& db, + int name_filter_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + name_filter_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NameFilter entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int name_filter_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + name_filter_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NameFilter name_filter_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(name_filter_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + name_filter_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NameFilter InsertOne( + Database& db, + NameFilter name_filter_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(name_filter_entry.id)); + insert_values.push_back("'" + EscapeString(name_filter_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + name_filter_entry.id = results.LastInsertedID(); + return name_filter_entry; + } + + name_filter_entry = NewEntity(); + + return name_filter_entry; + } + + static int InsertMany( + Database& db, + std::vector name_filter_entries + ) + { + std::vector insert_chunks; + + for (auto &name_filter_entry: name_filter_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(name_filter_entry.id)); + insert_values.push_back("'" + EscapeString(name_filter_entry.name) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NameFilter entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NameFilter entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NAME_FILTER_REPOSITORY_H diff --git a/common/repositories/base/base_npc_emotes_repository.h b/common/repositories/base/base_npc_emotes_repository.h new file mode 100644 index 000000000..cc0503d16 --- /dev/null +++ b/common/repositories/base/base_npc_emotes_repository.h @@ -0,0 +1,319 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_EMOTES_REPOSITORY_H +#define EQEMU_BASE_NPC_EMOTES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcEmotesRepository { +public: + struct NpcEmotes { + int id; + int emoteid; + int event_; + int type; + std::string text; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "emoteid", + "event_", + "type", + "text", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_emotes"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcEmotes NewEntity() + { + NpcEmotes entry{}; + + entry.id = 0; + entry.emoteid = 0; + entry.event_ = 0; + entry.type = 0; + entry.text = ""; + + return entry; + } + + static NpcEmotes GetNpcEmotesEntry( + const std::vector &npc_emotess, + int npc_emotes_id + ) + { + for (auto &npc_emotes : npc_emotess) { + if (npc_emotes.id == npc_emotes_id) { + return npc_emotes; + } + } + + return NewEntity(); + } + + static NpcEmotes FindOne( + Database& db, + int npc_emotes_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_emotes_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcEmotes entry{}; + + entry.id = atoi(row[0]); + entry.emoteid = atoi(row[1]); + entry.event_ = atoi(row[2]); + entry.type = atoi(row[3]); + entry.text = row[4] ? row[4] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_emotes_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_emotes_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcEmotes npc_emotes_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(npc_emotes_entry.emoteid)); + update_values.push_back(columns[2] + " = " + std::to_string(npc_emotes_entry.event_)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_emotes_entry.type)); + update_values.push_back(columns[4] + " = '" + EscapeString(npc_emotes_entry.text) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_emotes_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcEmotes InsertOne( + Database& db, + NpcEmotes npc_emotes_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_emotes_entry.id)); + insert_values.push_back(std::to_string(npc_emotes_entry.emoteid)); + insert_values.push_back(std::to_string(npc_emotes_entry.event_)); + insert_values.push_back(std::to_string(npc_emotes_entry.type)); + insert_values.push_back("'" + EscapeString(npc_emotes_entry.text) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_emotes_entry.id = results.LastInsertedID(); + return npc_emotes_entry; + } + + npc_emotes_entry = NewEntity(); + + return npc_emotes_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_emotes_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_emotes_entry: npc_emotes_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_emotes_entry.id)); + insert_values.push_back(std::to_string(npc_emotes_entry.emoteid)); + insert_values.push_back(std::to_string(npc_emotes_entry.event_)); + insert_values.push_back(std::to_string(npc_emotes_entry.type)); + insert_values.push_back("'" + EscapeString(npc_emotes_entry.text) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcEmotes entry{}; + + entry.id = atoi(row[0]); + entry.emoteid = atoi(row[1]); + entry.event_ = atoi(row[2]); + entry.type = atoi(row[3]); + entry.text = row[4] ? row[4] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcEmotes entry{}; + + entry.id = atoi(row[0]); + entry.emoteid = atoi(row[1]); + entry.event_ = atoi(row[2]); + entry.type = atoi(row[3]); + entry.text = row[4] ? row[4] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_EMOTES_REPOSITORY_H diff --git a/common/repositories/base/base_npc_faction_entries_repository.h b/common/repositories/base/base_npc_faction_entries_repository.h new file mode 100644 index 000000000..a25a9a258 --- /dev/null +++ b/common/repositories/base/base_npc_faction_entries_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_FACTION_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_NPC_FACTION_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcFactionEntriesRepository { +public: + struct NpcFactionEntries { + int npc_faction_id; + int faction_id; + int value; + int npc_value; + int temp; + }; + + static std::string PrimaryKey() + { + return std::string("npc_faction_id"); + } + + static std::vector Columns() + { + return { + "npc_faction_id", + "faction_id", + "value", + "npc_value", + "temp", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_faction_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcFactionEntries NewEntity() + { + NpcFactionEntries entry{}; + + entry.npc_faction_id = 0; + entry.faction_id = 0; + entry.value = 0; + entry.npc_value = 0; + entry.temp = 0; + + return entry; + } + + static NpcFactionEntries GetNpcFactionEntriesEntry( + const std::vector &npc_faction_entriess, + int npc_faction_entries_id + ) + { + for (auto &npc_faction_entries : npc_faction_entriess) { + if (npc_faction_entries.npc_faction_id == npc_faction_entries_id) { + return npc_faction_entries; + } + } + + return NewEntity(); + } + + static NpcFactionEntries FindOne( + Database& db, + int npc_faction_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_faction_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcFactionEntries entry{}; + + entry.npc_faction_id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.value = atoi(row[2]); + entry.npc_value = atoi(row[3]); + entry.temp = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_faction_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_faction_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcFactionEntries npc_faction_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(npc_faction_entries_entry.npc_faction_id)); + update_values.push_back(columns[1] + " = " + std::to_string(npc_faction_entries_entry.faction_id)); + update_values.push_back(columns[2] + " = " + std::to_string(npc_faction_entries_entry.value)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_faction_entries_entry.npc_value)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_faction_entries_entry.temp)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_faction_entries_entry.npc_faction_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcFactionEntries InsertOne( + Database& db, + NpcFactionEntries npc_faction_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_faction_entries_entry.npc_faction_id)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.faction_id)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.value)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.npc_value)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.temp)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_faction_entries_entry.npc_faction_id = results.LastInsertedID(); + return npc_faction_entries_entry; + } + + npc_faction_entries_entry = NewEntity(); + + return npc_faction_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_faction_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_faction_entries_entry: npc_faction_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_faction_entries_entry.npc_faction_id)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.faction_id)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.value)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.npc_value)); + insert_values.push_back(std::to_string(npc_faction_entries_entry.temp)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcFactionEntries entry{}; + + entry.npc_faction_id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.value = atoi(row[2]); + entry.npc_value = atoi(row[3]); + entry.temp = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcFactionEntries entry{}; + + entry.npc_faction_id = atoi(row[0]); + entry.faction_id = atoi(row[1]); + entry.value = atoi(row[2]); + entry.npc_value = atoi(row[3]); + entry.temp = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_FACTION_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_npc_faction_repository.h b/common/repositories/base/base_npc_faction_repository.h new file mode 100644 index 000000000..5cb58fafa --- /dev/null +++ b/common/repositories/base/base_npc_faction_repository.h @@ -0,0 +1,310 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_FACTION_REPOSITORY_H +#define EQEMU_BASE_NPC_FACTION_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcFactionRepository { +public: + struct NpcFaction { + int id; + std::string name; + int primaryfaction; + int ignore_primary_assist; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "primaryfaction", + "ignore_primary_assist", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_faction"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcFaction NewEntity() + { + NpcFaction entry{}; + + entry.id = 0; + entry.name = ""; + entry.primaryfaction = 0; + entry.ignore_primary_assist = 0; + + return entry; + } + + static NpcFaction GetNpcFactionEntry( + const std::vector &npc_factions, + int npc_faction_id + ) + { + for (auto &npc_faction : npc_factions) { + if (npc_faction.id == npc_faction_id) { + return npc_faction; + } + } + + return NewEntity(); + } + + static NpcFaction FindOne( + Database& db, + int npc_faction_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_faction_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcFaction entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.primaryfaction = atoi(row[2]); + entry.ignore_primary_assist = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_faction_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_faction_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcFaction npc_faction_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(npc_faction_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(npc_faction_entry.primaryfaction)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_faction_entry.ignore_primary_assist)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_faction_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcFaction InsertOne( + Database& db, + NpcFaction npc_faction_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_faction_entry.id)); + insert_values.push_back("'" + EscapeString(npc_faction_entry.name) + "'"); + insert_values.push_back(std::to_string(npc_faction_entry.primaryfaction)); + insert_values.push_back(std::to_string(npc_faction_entry.ignore_primary_assist)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_faction_entry.id = results.LastInsertedID(); + return npc_faction_entry; + } + + npc_faction_entry = NewEntity(); + + return npc_faction_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_faction_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_faction_entry: npc_faction_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_faction_entry.id)); + insert_values.push_back("'" + EscapeString(npc_faction_entry.name) + "'"); + insert_values.push_back(std::to_string(npc_faction_entry.primaryfaction)); + insert_values.push_back(std::to_string(npc_faction_entry.ignore_primary_assist)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcFaction entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.primaryfaction = atoi(row[2]); + entry.ignore_primary_assist = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcFaction entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.primaryfaction = atoi(row[2]); + entry.ignore_primary_assist = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_FACTION_REPOSITORY_H diff --git a/common/repositories/base/base_npc_scale_global_base_repository.h b/common/repositories/base/base_npc_scale_global_base_repository.h new file mode 100644 index 000000000..e701c7686 --- /dev/null +++ b/common/repositories/base/base_npc_scale_global_base_repository.h @@ -0,0 +1,527 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_SCALE_GLOBAL_BASE_REPOSITORY_H +#define EQEMU_BASE_NPC_SCALE_GLOBAL_BASE_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcScaleGlobalBaseRepository { +public: + struct NpcScaleGlobalBase { + int type; + int level; + int ac; + int hp; + int accuracy; + int slow_mitigation; + int attack; + int strength; + int stamina; + int dexterity; + int agility; + int intelligence; + int wisdom; + int charisma; + int magic_resist; + int cold_resist; + int fire_resist; + int poison_resist; + int disease_resist; + int corruption_resist; + int physical_resist; + int min_dmg; + int max_dmg; + int hp_regen_rate; + int attack_delay; + int spell_scale; + int heal_scale; + std::string special_abilities; + }; + + static std::string PrimaryKey() + { + return std::string("type"); + } + + static std::vector Columns() + { + return { + "type", + "level", + "ac", + "hp", + "accuracy", + "slow_mitigation", + "attack", + "strength", + "stamina", + "dexterity", + "agility", + "intelligence", + "wisdom", + "charisma", + "magic_resist", + "cold_resist", + "fire_resist", + "poison_resist", + "disease_resist", + "corruption_resist", + "physical_resist", + "min_dmg", + "max_dmg", + "hp_regen_rate", + "attack_delay", + "spell_scale", + "heal_scale", + "special_abilities", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_scale_global_base"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcScaleGlobalBase NewEntity() + { + NpcScaleGlobalBase entry{}; + + entry.type = 0; + entry.level = 0; + entry.ac = 0; + entry.hp = 0; + entry.accuracy = 0; + entry.slow_mitigation = 0; + entry.attack = 0; + entry.strength = 0; + entry.stamina = 0; + entry.dexterity = 0; + entry.agility = 0; + entry.intelligence = 0; + entry.wisdom = 0; + entry.charisma = 0; + entry.magic_resist = 0; + entry.cold_resist = 0; + entry.fire_resist = 0; + entry.poison_resist = 0; + entry.disease_resist = 0; + entry.corruption_resist = 0; + entry.physical_resist = 0; + entry.min_dmg = 0; + entry.max_dmg = 0; + entry.hp_regen_rate = 0; + entry.attack_delay = 0; + entry.spell_scale = 100; + entry.heal_scale = 100; + entry.special_abilities = ""; + + return entry; + } + + static NpcScaleGlobalBase GetNpcScaleGlobalBaseEntry( + const std::vector &npc_scale_global_bases, + int npc_scale_global_base_id + ) + { + for (auto &npc_scale_global_base : npc_scale_global_bases) { + if (npc_scale_global_base.type == npc_scale_global_base_id) { + return npc_scale_global_base; + } + } + + return NewEntity(); + } + + static NpcScaleGlobalBase FindOne( + Database& db, + int npc_scale_global_base_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_scale_global_base_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcScaleGlobalBase entry{}; + + entry.type = atoi(row[0]); + entry.level = atoi(row[1]); + entry.ac = atoi(row[2]); + entry.hp = atoi(row[3]); + entry.accuracy = atoi(row[4]); + entry.slow_mitigation = atoi(row[5]); + entry.attack = atoi(row[6]); + entry.strength = atoi(row[7]); + entry.stamina = atoi(row[8]); + entry.dexterity = atoi(row[9]); + entry.agility = atoi(row[10]); + entry.intelligence = atoi(row[11]); + entry.wisdom = atoi(row[12]); + entry.charisma = atoi(row[13]); + entry.magic_resist = atoi(row[14]); + entry.cold_resist = atoi(row[15]); + entry.fire_resist = atoi(row[16]); + entry.poison_resist = atoi(row[17]); + entry.disease_resist = atoi(row[18]); + entry.corruption_resist = atoi(row[19]); + entry.physical_resist = atoi(row[20]); + entry.min_dmg = atoi(row[21]); + entry.max_dmg = atoi(row[22]); + entry.hp_regen_rate = atoi(row[23]); + entry.attack_delay = atoi(row[24]); + entry.spell_scale = atoi(row[25]); + entry.heal_scale = atoi(row[26]); + entry.special_abilities = row[27] ? row[27] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_scale_global_base_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_scale_global_base_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcScaleGlobalBase npc_scale_global_base_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(npc_scale_global_base_entry.type)); + update_values.push_back(columns[1] + " = " + std::to_string(npc_scale_global_base_entry.level)); + update_values.push_back(columns[2] + " = " + std::to_string(npc_scale_global_base_entry.ac)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_scale_global_base_entry.hp)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_scale_global_base_entry.accuracy)); + update_values.push_back(columns[5] + " = " + std::to_string(npc_scale_global_base_entry.slow_mitigation)); + update_values.push_back(columns[6] + " = " + std::to_string(npc_scale_global_base_entry.attack)); + update_values.push_back(columns[7] + " = " + std::to_string(npc_scale_global_base_entry.strength)); + update_values.push_back(columns[8] + " = " + std::to_string(npc_scale_global_base_entry.stamina)); + update_values.push_back(columns[9] + " = " + std::to_string(npc_scale_global_base_entry.dexterity)); + update_values.push_back(columns[10] + " = " + std::to_string(npc_scale_global_base_entry.agility)); + update_values.push_back(columns[11] + " = " + std::to_string(npc_scale_global_base_entry.intelligence)); + update_values.push_back(columns[12] + " = " + std::to_string(npc_scale_global_base_entry.wisdom)); + update_values.push_back(columns[13] + " = " + std::to_string(npc_scale_global_base_entry.charisma)); + update_values.push_back(columns[14] + " = " + std::to_string(npc_scale_global_base_entry.magic_resist)); + update_values.push_back(columns[15] + " = " + std::to_string(npc_scale_global_base_entry.cold_resist)); + update_values.push_back(columns[16] + " = " + std::to_string(npc_scale_global_base_entry.fire_resist)); + update_values.push_back(columns[17] + " = " + std::to_string(npc_scale_global_base_entry.poison_resist)); + update_values.push_back(columns[18] + " = " + std::to_string(npc_scale_global_base_entry.disease_resist)); + update_values.push_back(columns[19] + " = " + std::to_string(npc_scale_global_base_entry.corruption_resist)); + update_values.push_back(columns[20] + " = " + std::to_string(npc_scale_global_base_entry.physical_resist)); + update_values.push_back(columns[21] + " = " + std::to_string(npc_scale_global_base_entry.min_dmg)); + update_values.push_back(columns[22] + " = " + std::to_string(npc_scale_global_base_entry.max_dmg)); + update_values.push_back(columns[23] + " = " + std::to_string(npc_scale_global_base_entry.hp_regen_rate)); + update_values.push_back(columns[24] + " = " + std::to_string(npc_scale_global_base_entry.attack_delay)); + update_values.push_back(columns[25] + " = " + std::to_string(npc_scale_global_base_entry.spell_scale)); + update_values.push_back(columns[26] + " = " + std::to_string(npc_scale_global_base_entry.heal_scale)); + update_values.push_back(columns[27] + " = '" + EscapeString(npc_scale_global_base_entry.special_abilities) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_scale_global_base_entry.type + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcScaleGlobalBase InsertOne( + Database& db, + NpcScaleGlobalBase npc_scale_global_base_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_scale_global_base_entry.type)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.level)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.ac)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.hp)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.accuracy)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.slow_mitigation)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.attack)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.strength)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.stamina)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.dexterity)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.agility)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.intelligence)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.wisdom)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.charisma)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.magic_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.cold_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.fire_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.poison_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.disease_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.corruption_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.physical_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.min_dmg)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.max_dmg)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.hp_regen_rate)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.attack_delay)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.spell_scale)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.heal_scale)); + insert_values.push_back("'" + EscapeString(npc_scale_global_base_entry.special_abilities) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_scale_global_base_entry.type = results.LastInsertedID(); + return npc_scale_global_base_entry; + } + + npc_scale_global_base_entry = NewEntity(); + + return npc_scale_global_base_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_scale_global_base_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_scale_global_base_entry: npc_scale_global_base_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_scale_global_base_entry.type)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.level)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.ac)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.hp)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.accuracy)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.slow_mitigation)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.attack)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.strength)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.stamina)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.dexterity)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.agility)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.intelligence)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.wisdom)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.charisma)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.magic_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.cold_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.fire_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.poison_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.disease_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.corruption_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.physical_resist)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.min_dmg)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.max_dmg)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.hp_regen_rate)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.attack_delay)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.spell_scale)); + insert_values.push_back(std::to_string(npc_scale_global_base_entry.heal_scale)); + insert_values.push_back("'" + EscapeString(npc_scale_global_base_entry.special_abilities) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcScaleGlobalBase entry{}; + + entry.type = atoi(row[0]); + entry.level = atoi(row[1]); + entry.ac = atoi(row[2]); + entry.hp = atoi(row[3]); + entry.accuracy = atoi(row[4]); + entry.slow_mitigation = atoi(row[5]); + entry.attack = atoi(row[6]); + entry.strength = atoi(row[7]); + entry.stamina = atoi(row[8]); + entry.dexterity = atoi(row[9]); + entry.agility = atoi(row[10]); + entry.intelligence = atoi(row[11]); + entry.wisdom = atoi(row[12]); + entry.charisma = atoi(row[13]); + entry.magic_resist = atoi(row[14]); + entry.cold_resist = atoi(row[15]); + entry.fire_resist = atoi(row[16]); + entry.poison_resist = atoi(row[17]); + entry.disease_resist = atoi(row[18]); + entry.corruption_resist = atoi(row[19]); + entry.physical_resist = atoi(row[20]); + entry.min_dmg = atoi(row[21]); + entry.max_dmg = atoi(row[22]); + entry.hp_regen_rate = atoi(row[23]); + entry.attack_delay = atoi(row[24]); + entry.spell_scale = atoi(row[25]); + entry.heal_scale = atoi(row[26]); + entry.special_abilities = row[27] ? row[27] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcScaleGlobalBase entry{}; + + entry.type = atoi(row[0]); + entry.level = atoi(row[1]); + entry.ac = atoi(row[2]); + entry.hp = atoi(row[3]); + entry.accuracy = atoi(row[4]); + entry.slow_mitigation = atoi(row[5]); + entry.attack = atoi(row[6]); + entry.strength = atoi(row[7]); + entry.stamina = atoi(row[8]); + entry.dexterity = atoi(row[9]); + entry.agility = atoi(row[10]); + entry.intelligence = atoi(row[11]); + entry.wisdom = atoi(row[12]); + entry.charisma = atoi(row[13]); + entry.magic_resist = atoi(row[14]); + entry.cold_resist = atoi(row[15]); + entry.fire_resist = atoi(row[16]); + entry.poison_resist = atoi(row[17]); + entry.disease_resist = atoi(row[18]); + entry.corruption_resist = atoi(row[19]); + entry.physical_resist = atoi(row[20]); + entry.min_dmg = atoi(row[21]); + entry.max_dmg = atoi(row[22]); + entry.hp_regen_rate = atoi(row[23]); + entry.attack_delay = atoi(row[24]); + entry.spell_scale = atoi(row[25]); + entry.heal_scale = atoi(row[26]); + entry.special_abilities = row[27] ? row[27] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_SCALE_GLOBAL_BASE_REPOSITORY_H diff --git a/common/repositories/base/base_npc_spells_effects_entries_repository.h b/common/repositories/base/base_npc_spells_effects_entries_repository.h new file mode 100644 index 000000000..563176079 --- /dev/null +++ b/common/repositories/base/base_npc_spells_effects_entries_repository.h @@ -0,0 +1,346 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_SPELLS_EFFECTS_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_NPC_SPELLS_EFFECTS_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcSpellsEffectsEntriesRepository { +public: + struct NpcSpellsEffectsEntries { + int id; + int npc_spells_effects_id; + int spell_effect_id; + int minlevel; + int maxlevel; + int se_base; + int se_limit; + int se_max; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "npc_spells_effects_id", + "spell_effect_id", + "minlevel", + "maxlevel", + "se_base", + "se_limit", + "se_max", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_spells_effects_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcSpellsEffectsEntries NewEntity() + { + NpcSpellsEffectsEntries entry{}; + + entry.id = 0; + entry.npc_spells_effects_id = 0; + entry.spell_effect_id = 0; + entry.minlevel = 0; + entry.maxlevel = 255; + entry.se_base = 0; + entry.se_limit = 0; + entry.se_max = 0; + + return entry; + } + + static NpcSpellsEffectsEntries GetNpcSpellsEffectsEntriesEntry( + const std::vector &npc_spells_effects_entriess, + int npc_spells_effects_entries_id + ) + { + for (auto &npc_spells_effects_entries : npc_spells_effects_entriess) { + if (npc_spells_effects_entries.id == npc_spells_effects_entries_id) { + return npc_spells_effects_entries; + } + } + + return NewEntity(); + } + + static NpcSpellsEffectsEntries FindOne( + Database& db, + int npc_spells_effects_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_spells_effects_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcSpellsEffectsEntries entry{}; + + entry.id = atoi(row[0]); + entry.npc_spells_effects_id = atoi(row[1]); + entry.spell_effect_id = atoi(row[2]); + entry.minlevel = atoi(row[3]); + entry.maxlevel = atoi(row[4]); + entry.se_base = atoi(row[5]); + entry.se_limit = atoi(row[6]); + entry.se_max = atoi(row[7]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_spells_effects_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_spells_effects_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcSpellsEffectsEntries npc_spells_effects_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(npc_spells_effects_entries_entry.npc_spells_effects_id)); + update_values.push_back(columns[2] + " = " + std::to_string(npc_spells_effects_entries_entry.spell_effect_id)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_spells_effects_entries_entry.minlevel)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_spells_effects_entries_entry.maxlevel)); + update_values.push_back(columns[5] + " = " + std::to_string(npc_spells_effects_entries_entry.se_base)); + update_values.push_back(columns[6] + " = " + std::to_string(npc_spells_effects_entries_entry.se_limit)); + update_values.push_back(columns[7] + " = " + std::to_string(npc_spells_effects_entries_entry.se_max)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_spells_effects_entries_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcSpellsEffectsEntries InsertOne( + Database& db, + NpcSpellsEffectsEntries npc_spells_effects_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.id)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.npc_spells_effects_id)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.spell_effect_id)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.minlevel)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.maxlevel)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_base)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_limit)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_max)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_spells_effects_entries_entry.id = results.LastInsertedID(); + return npc_spells_effects_entries_entry; + } + + npc_spells_effects_entries_entry = NewEntity(); + + return npc_spells_effects_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_spells_effects_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_spells_effects_entries_entry: npc_spells_effects_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.id)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.npc_spells_effects_id)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.spell_effect_id)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.minlevel)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.maxlevel)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_base)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_limit)); + insert_values.push_back(std::to_string(npc_spells_effects_entries_entry.se_max)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpellsEffectsEntries entry{}; + + entry.id = atoi(row[0]); + entry.npc_spells_effects_id = atoi(row[1]); + entry.spell_effect_id = atoi(row[2]); + entry.minlevel = atoi(row[3]); + entry.maxlevel = atoi(row[4]); + entry.se_base = atoi(row[5]); + entry.se_limit = atoi(row[6]); + entry.se_max = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpellsEffectsEntries entry{}; + + entry.id = atoi(row[0]); + entry.npc_spells_effects_id = atoi(row[1]); + entry.spell_effect_id = atoi(row[2]); + entry.minlevel = atoi(row[3]); + entry.maxlevel = atoi(row[4]); + entry.se_base = atoi(row[5]); + entry.se_limit = atoi(row[6]); + entry.se_max = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_SPELLS_EFFECTS_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_npc_spells_effects_repository.h b/common/repositories/base/base_npc_spells_effects_repository.h new file mode 100644 index 000000000..a6b5e52bd --- /dev/null +++ b/common/repositories/base/base_npc_spells_effects_repository.h @@ -0,0 +1,301 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_SPELLS_EFFECTS_REPOSITORY_H +#define EQEMU_BASE_NPC_SPELLS_EFFECTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcSpellsEffectsRepository { +public: + struct NpcSpellsEffects { + int id; + std::string name; + int parent_list; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "parent_list", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_spells_effects"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcSpellsEffects NewEntity() + { + NpcSpellsEffects entry{}; + + entry.id = 0; + entry.name = ""; + entry.parent_list = 0; + + return entry; + } + + static NpcSpellsEffects GetNpcSpellsEffectsEntry( + const std::vector &npc_spells_effectss, + int npc_spells_effects_id + ) + { + for (auto &npc_spells_effects : npc_spells_effectss) { + if (npc_spells_effects.id == npc_spells_effects_id) { + return npc_spells_effects; + } + } + + return NewEntity(); + } + + static NpcSpellsEffects FindOne( + Database& db, + int npc_spells_effects_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_spells_effects_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcSpellsEffects entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.parent_list = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_spells_effects_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_spells_effects_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcSpellsEffects npc_spells_effects_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(npc_spells_effects_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(npc_spells_effects_entry.parent_list)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_spells_effects_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcSpellsEffects InsertOne( + Database& db, + NpcSpellsEffects npc_spells_effects_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_effects_entry.id)); + insert_values.push_back("'" + EscapeString(npc_spells_effects_entry.name) + "'"); + insert_values.push_back(std::to_string(npc_spells_effects_entry.parent_list)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_spells_effects_entry.id = results.LastInsertedID(); + return npc_spells_effects_entry; + } + + npc_spells_effects_entry = NewEntity(); + + return npc_spells_effects_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_spells_effects_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_spells_effects_entry: npc_spells_effects_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_effects_entry.id)); + insert_values.push_back("'" + EscapeString(npc_spells_effects_entry.name) + "'"); + insert_values.push_back(std::to_string(npc_spells_effects_entry.parent_list)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpellsEffects entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.parent_list = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpellsEffects entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.parent_list = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_SPELLS_EFFECTS_REPOSITORY_H diff --git a/common/repositories/base/base_npc_spells_entries_repository.h b/common/repositories/base/base_npc_spells_entries_repository.h new file mode 100644 index 000000000..97139ab2b --- /dev/null +++ b/common/repositories/base/base_npc_spells_entries_repository.h @@ -0,0 +1,382 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_SPELLS_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_NPC_SPELLS_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcSpellsEntriesRepository { +public: + struct NpcSpellsEntries { + int id; + int npc_spells_id; + int spellid; + int type; + int minlevel; + int maxlevel; + int manacost; + int recast_delay; + int priority; + int resist_adjust; + int min_hp; + int max_hp; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "npc_spells_id", + "spellid", + "type", + "minlevel", + "maxlevel", + "manacost", + "recast_delay", + "priority", + "resist_adjust", + "min_hp", + "max_hp", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_spells_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcSpellsEntries NewEntity() + { + NpcSpellsEntries entry{}; + + entry.id = 0; + entry.npc_spells_id = 0; + entry.spellid = 0; + entry.type = 0; + entry.minlevel = 0; + entry.maxlevel = 255; + entry.manacost = -1; + entry.recast_delay = -1; + entry.priority = 0; + entry.resist_adjust = 0; + entry.min_hp = 0; + entry.max_hp = 0; + + return entry; + } + + static NpcSpellsEntries GetNpcSpellsEntriesEntry( + const std::vector &npc_spells_entriess, + int npc_spells_entries_id + ) + { + for (auto &npc_spells_entries : npc_spells_entriess) { + if (npc_spells_entries.id == npc_spells_entries_id) { + return npc_spells_entries; + } + } + + return NewEntity(); + } + + static NpcSpellsEntries FindOne( + Database& db, + int npc_spells_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_spells_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcSpellsEntries entry{}; + + entry.id = atoi(row[0]); + entry.npc_spells_id = atoi(row[1]); + entry.spellid = atoi(row[2]); + entry.type = atoi(row[3]); + entry.minlevel = atoi(row[4]); + entry.maxlevel = atoi(row[5]); + entry.manacost = atoi(row[6]); + entry.recast_delay = atoi(row[7]); + entry.priority = atoi(row[8]); + entry.resist_adjust = atoi(row[9]); + entry.min_hp = atoi(row[10]); + entry.max_hp = atoi(row[11]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_spells_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_spells_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcSpellsEntries npc_spells_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(npc_spells_entries_entry.npc_spells_id)); + update_values.push_back(columns[2] + " = " + std::to_string(npc_spells_entries_entry.spellid)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_spells_entries_entry.type)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_spells_entries_entry.minlevel)); + update_values.push_back(columns[5] + " = " + std::to_string(npc_spells_entries_entry.maxlevel)); + update_values.push_back(columns[6] + " = " + std::to_string(npc_spells_entries_entry.manacost)); + update_values.push_back(columns[7] + " = " + std::to_string(npc_spells_entries_entry.recast_delay)); + update_values.push_back(columns[8] + " = " + std::to_string(npc_spells_entries_entry.priority)); + update_values.push_back(columns[9] + " = " + std::to_string(npc_spells_entries_entry.resist_adjust)); + update_values.push_back(columns[10] + " = " + std::to_string(npc_spells_entries_entry.min_hp)); + update_values.push_back(columns[11] + " = " + std::to_string(npc_spells_entries_entry.max_hp)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_spells_entries_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcSpellsEntries InsertOne( + Database& db, + NpcSpellsEntries npc_spells_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_entries_entry.id)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.npc_spells_id)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.spellid)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.type)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.minlevel)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.maxlevel)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.manacost)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.recast_delay)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.priority)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.resist_adjust)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.min_hp)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.max_hp)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_spells_entries_entry.id = results.LastInsertedID(); + return npc_spells_entries_entry; + } + + npc_spells_entries_entry = NewEntity(); + + return npc_spells_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_spells_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_spells_entries_entry: npc_spells_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_entries_entry.id)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.npc_spells_id)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.spellid)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.type)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.minlevel)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.maxlevel)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.manacost)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.recast_delay)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.priority)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.resist_adjust)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.min_hp)); + insert_values.push_back(std::to_string(npc_spells_entries_entry.max_hp)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpellsEntries entry{}; + + entry.id = atoi(row[0]); + entry.npc_spells_id = atoi(row[1]); + entry.spellid = atoi(row[2]); + entry.type = atoi(row[3]); + entry.minlevel = atoi(row[4]); + entry.maxlevel = atoi(row[5]); + entry.manacost = atoi(row[6]); + entry.recast_delay = atoi(row[7]); + entry.priority = atoi(row[8]); + entry.resist_adjust = atoi(row[9]); + entry.min_hp = atoi(row[10]); + entry.max_hp = atoi(row[11]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpellsEntries entry{}; + + entry.id = atoi(row[0]); + entry.npc_spells_id = atoi(row[1]); + entry.spellid = atoi(row[2]); + entry.type = atoi(row[3]); + entry.minlevel = atoi(row[4]); + entry.maxlevel = atoi(row[5]); + entry.manacost = atoi(row[6]); + entry.recast_delay = atoi(row[7]); + entry.priority = atoi(row[8]); + entry.resist_adjust = atoi(row[9]); + entry.min_hp = atoi(row[10]); + entry.max_hp = atoi(row[11]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_SPELLS_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_npc_spells_repository.h b/common/repositories/base/base_npc_spells_repository.h new file mode 100644 index 000000000..448683064 --- /dev/null +++ b/common/repositories/base/base_npc_spells_repository.h @@ -0,0 +1,463 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_SPELLS_REPOSITORY_H +#define EQEMU_BASE_NPC_SPELLS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcSpellsRepository { +public: + struct NpcSpells { + int id; + std::string name; + int parent_list; + int attack_proc; + int proc_chance; + int range_proc; + int rproc_chance; + int defensive_proc; + int dproc_chance; + int fail_recast; + int engaged_no_sp_recast_min; + int engaged_no_sp_recast_max; + int engaged_b_self_chance; + int engaged_b_other_chance; + int engaged_d_chance; + int pursue_no_sp_recast_min; + int pursue_no_sp_recast_max; + int pursue_d_chance; + int idle_no_sp_recast_min; + int idle_no_sp_recast_max; + int idle_b_chance; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "parent_list", + "attack_proc", + "proc_chance", + "range_proc", + "rproc_chance", + "defensive_proc", + "dproc_chance", + "fail_recast", + "engaged_no_sp_recast_min", + "engaged_no_sp_recast_max", + "engaged_b_self_chance", + "engaged_b_other_chance", + "engaged_d_chance", + "pursue_no_sp_recast_min", + "pursue_no_sp_recast_max", + "pursue_d_chance", + "idle_no_sp_recast_min", + "idle_no_sp_recast_max", + "idle_b_chance", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_spells"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcSpells NewEntity() + { + NpcSpells entry{}; + + entry.id = 0; + entry.name = ""; + entry.parent_list = 0; + entry.attack_proc = -1; + entry.proc_chance = 3; + entry.range_proc = -1; + entry.rproc_chance = 0; + entry.defensive_proc = -1; + entry.dproc_chance = 0; + entry.fail_recast = 0; + entry.engaged_no_sp_recast_min = 0; + entry.engaged_no_sp_recast_max = 0; + entry.engaged_b_self_chance = 0; + entry.engaged_b_other_chance = 0; + entry.engaged_d_chance = 0; + entry.pursue_no_sp_recast_min = 0; + entry.pursue_no_sp_recast_max = 0; + entry.pursue_d_chance = 0; + entry.idle_no_sp_recast_min = 0; + entry.idle_no_sp_recast_max = 0; + entry.idle_b_chance = 0; + + return entry; + } + + static NpcSpells GetNpcSpellsEntry( + const std::vector &npc_spellss, + int npc_spells_id + ) + { + for (auto &npc_spells : npc_spellss) { + if (npc_spells.id == npc_spells_id) { + return npc_spells; + } + } + + return NewEntity(); + } + + static NpcSpells FindOne( + Database& db, + int npc_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_spells_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcSpells entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.parent_list = atoi(row[2]); + entry.attack_proc = atoi(row[3]); + entry.proc_chance = atoi(row[4]); + entry.range_proc = atoi(row[5]); + entry.rproc_chance = atoi(row[6]); + entry.defensive_proc = atoi(row[7]); + entry.dproc_chance = atoi(row[8]); + entry.fail_recast = atoi(row[9]); + entry.engaged_no_sp_recast_min = atoi(row[10]); + entry.engaged_no_sp_recast_max = atoi(row[11]); + entry.engaged_b_self_chance = atoi(row[12]); + entry.engaged_b_other_chance = atoi(row[13]); + entry.engaged_d_chance = atoi(row[14]); + entry.pursue_no_sp_recast_min = atoi(row[15]); + entry.pursue_no_sp_recast_max = atoi(row[16]); + entry.pursue_d_chance = atoi(row[17]); + entry.idle_no_sp_recast_min = atoi(row[18]); + entry.idle_no_sp_recast_max = atoi(row[19]); + entry.idle_b_chance = atoi(row[20]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_spells_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_spells_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcSpells npc_spells_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(npc_spells_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(npc_spells_entry.parent_list)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_spells_entry.attack_proc)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_spells_entry.proc_chance)); + update_values.push_back(columns[5] + " = " + std::to_string(npc_spells_entry.range_proc)); + update_values.push_back(columns[6] + " = " + std::to_string(npc_spells_entry.rproc_chance)); + update_values.push_back(columns[7] + " = " + std::to_string(npc_spells_entry.defensive_proc)); + update_values.push_back(columns[8] + " = " + std::to_string(npc_spells_entry.dproc_chance)); + update_values.push_back(columns[9] + " = " + std::to_string(npc_spells_entry.fail_recast)); + update_values.push_back(columns[10] + " = " + std::to_string(npc_spells_entry.engaged_no_sp_recast_min)); + update_values.push_back(columns[11] + " = " + std::to_string(npc_spells_entry.engaged_no_sp_recast_max)); + update_values.push_back(columns[12] + " = " + std::to_string(npc_spells_entry.engaged_b_self_chance)); + update_values.push_back(columns[13] + " = " + std::to_string(npc_spells_entry.engaged_b_other_chance)); + update_values.push_back(columns[14] + " = " + std::to_string(npc_spells_entry.engaged_d_chance)); + update_values.push_back(columns[15] + " = " + std::to_string(npc_spells_entry.pursue_no_sp_recast_min)); + update_values.push_back(columns[16] + " = " + std::to_string(npc_spells_entry.pursue_no_sp_recast_max)); + update_values.push_back(columns[17] + " = " + std::to_string(npc_spells_entry.pursue_d_chance)); + update_values.push_back(columns[18] + " = " + std::to_string(npc_spells_entry.idle_no_sp_recast_min)); + update_values.push_back(columns[19] + " = " + std::to_string(npc_spells_entry.idle_no_sp_recast_max)); + update_values.push_back(columns[20] + " = " + std::to_string(npc_spells_entry.idle_b_chance)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_spells_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcSpells InsertOne( + Database& db, + NpcSpells npc_spells_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_entry.id)); + insert_values.push_back("'" + EscapeString(npc_spells_entry.name) + "'"); + insert_values.push_back(std::to_string(npc_spells_entry.parent_list)); + insert_values.push_back(std::to_string(npc_spells_entry.attack_proc)); + insert_values.push_back(std::to_string(npc_spells_entry.proc_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.range_proc)); + insert_values.push_back(std::to_string(npc_spells_entry.rproc_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.defensive_proc)); + insert_values.push_back(std::to_string(npc_spells_entry.dproc_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.fail_recast)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_no_sp_recast_min)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_no_sp_recast_max)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_b_self_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_b_other_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_d_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.pursue_no_sp_recast_min)); + insert_values.push_back(std::to_string(npc_spells_entry.pursue_no_sp_recast_max)); + insert_values.push_back(std::to_string(npc_spells_entry.pursue_d_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.idle_no_sp_recast_min)); + insert_values.push_back(std::to_string(npc_spells_entry.idle_no_sp_recast_max)); + insert_values.push_back(std::to_string(npc_spells_entry.idle_b_chance)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_spells_entry.id = results.LastInsertedID(); + return npc_spells_entry; + } + + npc_spells_entry = NewEntity(); + + return npc_spells_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_spells_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_spells_entry: npc_spells_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_spells_entry.id)); + insert_values.push_back("'" + EscapeString(npc_spells_entry.name) + "'"); + insert_values.push_back(std::to_string(npc_spells_entry.parent_list)); + insert_values.push_back(std::to_string(npc_spells_entry.attack_proc)); + insert_values.push_back(std::to_string(npc_spells_entry.proc_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.range_proc)); + insert_values.push_back(std::to_string(npc_spells_entry.rproc_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.defensive_proc)); + insert_values.push_back(std::to_string(npc_spells_entry.dproc_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.fail_recast)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_no_sp_recast_min)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_no_sp_recast_max)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_b_self_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_b_other_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.engaged_d_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.pursue_no_sp_recast_min)); + insert_values.push_back(std::to_string(npc_spells_entry.pursue_no_sp_recast_max)); + insert_values.push_back(std::to_string(npc_spells_entry.pursue_d_chance)); + insert_values.push_back(std::to_string(npc_spells_entry.idle_no_sp_recast_min)); + insert_values.push_back(std::to_string(npc_spells_entry.idle_no_sp_recast_max)); + insert_values.push_back(std::to_string(npc_spells_entry.idle_b_chance)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpells entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.parent_list = atoi(row[2]); + entry.attack_proc = atoi(row[3]); + entry.proc_chance = atoi(row[4]); + entry.range_proc = atoi(row[5]); + entry.rproc_chance = atoi(row[6]); + entry.defensive_proc = atoi(row[7]); + entry.dproc_chance = atoi(row[8]); + entry.fail_recast = atoi(row[9]); + entry.engaged_no_sp_recast_min = atoi(row[10]); + entry.engaged_no_sp_recast_max = atoi(row[11]); + entry.engaged_b_self_chance = atoi(row[12]); + entry.engaged_b_other_chance = atoi(row[13]); + entry.engaged_d_chance = atoi(row[14]); + entry.pursue_no_sp_recast_min = atoi(row[15]); + entry.pursue_no_sp_recast_max = atoi(row[16]); + entry.pursue_d_chance = atoi(row[17]); + entry.idle_no_sp_recast_min = atoi(row[18]); + entry.idle_no_sp_recast_max = atoi(row[19]); + entry.idle_b_chance = atoi(row[20]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcSpells entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.parent_list = atoi(row[2]); + entry.attack_proc = atoi(row[3]); + entry.proc_chance = atoi(row[4]); + entry.range_proc = atoi(row[5]); + entry.rproc_chance = atoi(row[6]); + entry.defensive_proc = atoi(row[7]); + entry.dproc_chance = atoi(row[8]); + entry.fail_recast = atoi(row[9]); + entry.engaged_no_sp_recast_min = atoi(row[10]); + entry.engaged_no_sp_recast_max = atoi(row[11]); + entry.engaged_b_self_chance = atoi(row[12]); + entry.engaged_b_other_chance = atoi(row[13]); + entry.engaged_d_chance = atoi(row[14]); + entry.pursue_no_sp_recast_min = atoi(row[15]); + entry.pursue_no_sp_recast_max = atoi(row[16]); + entry.pursue_d_chance = atoi(row[17]); + entry.idle_no_sp_recast_min = atoi(row[18]); + entry.idle_no_sp_recast_max = atoi(row[19]); + entry.idle_b_chance = atoi(row[20]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_SPELLS_REPOSITORY_H diff --git a/common/repositories/base/base_npc_types_repository.h b/common/repositories/base/base_npc_types_repository.h new file mode 100644 index 000000000..b127988fa --- /dev/null +++ b/common/repositories/base/base_npc_types_repository.h @@ -0,0 +1,1372 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_TYPES_REPOSITORY_H +#define EQEMU_BASE_NPC_TYPES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcTypesRepository { +public: + struct NpcTypes { + int id; + std::string name; + std::string lastname; + int level; + int race; + int class; + int bodytype; + int hp; + int mana; + int gender; + int texture; + int helmtexture; + int herosforgemodel; + float size; + int hp_regen_rate; + int mana_regen_rate; + int loottable_id; + int merchant_id; + int alt_currency_id; + int npc_spells_id; + int npc_spells_effects_id; + int npc_faction_id; + int adventure_template_id; + int trap_template; + int mindmg; + int maxdmg; + int attack_count; + std::string npcspecialattks; + std::string special_abilities; + int aggroradius; + int assistradius; + int face; + int luclin_hairstyle; + int luclin_haircolor; + int luclin_eyecolor; + int luclin_eyecolor2; + int luclin_beardcolor; + int luclin_beard; + int drakkin_heritage; + int drakkin_tattoo; + int drakkin_details; + int armortint_id; + int armortint_red; + int armortint_green; + int armortint_blue; + int d_melee_texture1; + int d_melee_texture2; + std::string ammo_idfile; + int prim_melee_type; + int sec_melee_type; + int ranged_type; + float runspeed; + int MR; + int CR; + int DR; + int FR; + int PR; + int Corrup; + int PhR; + int see_invis; + int see_invis_undead; + int qglobal; + int AC; + int npc_aggro; + int spawn_limit; + float attack_speed; + int attack_delay; + int findable; + int STR; + int STA; + int DEX; + int AGI; + int _INT; + int WIS; + int CHA; + int see_hide; + int see_improved_hide; + int trackable; + int isbot; + int exclude; + int ATK; + int Accuracy; + int Avoidance; + int slow_mitigation; + int version; + int maxlevel; + int scalerate; + int private_corpse; + int unique_spawn_by_name; + int underwater; + int isquest; + int emoteid; + float spellscale; + float healscale; + int no_target_hotkey; + int raid_target; + int armtexture; + int bracertexture; + int handtexture; + int legtexture; + int feettexture; + int light; + int walkspeed; + int peqid; + int unique_; + int fixed; + int ignore_despawn; + int show_name; + int untargetable; + int charm_ac; + int charm_min_dmg; + int charm_max_dmg; + int charm_attack_delay; + int charm_accuracy_rating; + int charm_avoidance_rating; + int charm_atk; + int skip_global_loot; + int rare_spawn; + int stuck_behavior; + int model; + int flymode; + int always_aggro; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "lastname", + "level", + "race", + "class", + "bodytype", + "hp", + "mana", + "gender", + "texture", + "helmtexture", + "herosforgemodel", + "size", + "hp_regen_rate", + "mana_regen_rate", + "loottable_id", + "merchant_id", + "alt_currency_id", + "npc_spells_id", + "npc_spells_effects_id", + "npc_faction_id", + "adventure_template_id", + "trap_template", + "mindmg", + "maxdmg", + "attack_count", + "npcspecialattks", + "special_abilities", + "aggroradius", + "assistradius", + "face", + "luclin_hairstyle", + "luclin_haircolor", + "luclin_eyecolor", + "luclin_eyecolor2", + "luclin_beardcolor", + "luclin_beard", + "drakkin_heritage", + "drakkin_tattoo", + "drakkin_details", + "armortint_id", + "armortint_red", + "armortint_green", + "armortint_blue", + "d_melee_texture1", + "d_melee_texture2", + "ammo_idfile", + "prim_melee_type", + "sec_melee_type", + "ranged_type", + "runspeed", + "MR", + "CR", + "DR", + "FR", + "PR", + "Corrup", + "PhR", + "see_invis", + "see_invis_undead", + "qglobal", + "AC", + "npc_aggro", + "spawn_limit", + "attack_speed", + "attack_delay", + "findable", + "STR", + "STA", + "DEX", + "AGI", + "_INT", + "WIS", + "CHA", + "see_hide", + "see_improved_hide", + "trackable", + "isbot", + "exclude", + "ATK", + "Accuracy", + "Avoidance", + "slow_mitigation", + "version", + "maxlevel", + "scalerate", + "private_corpse", + "unique_spawn_by_name", + "underwater", + "isquest", + "emoteid", + "spellscale", + "healscale", + "no_target_hotkey", + "raid_target", + "armtexture", + "bracertexture", + "handtexture", + "legtexture", + "feettexture", + "light", + "walkspeed", + "peqid", + "unique_", + "fixed", + "ignore_despawn", + "show_name", + "untargetable", + "charm_ac", + "charm_min_dmg", + "charm_max_dmg", + "charm_attack_delay", + "charm_accuracy_rating", + "charm_avoidance_rating", + "charm_atk", + "skip_global_loot", + "rare_spawn", + "stuck_behavior", + "model", + "flymode", + "always_aggro", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_types"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcTypes NewEntity() + { + NpcTypes entry{}; + + entry.id = 0; + entry.name = ""; + entry.lastname = ""; + entry.level = 0; + entry.race = 0; + entry.class = 0; + entry.bodytype = 1; + entry.hp = 0; + entry.mana = 0; + entry.gender = 0; + entry.texture = 0; + entry.helmtexture = 0; + entry.herosforgemodel = 0; + entry.size = 0; + entry.hp_regen_rate = 0; + entry.mana_regen_rate = 0; + entry.loottable_id = 0; + entry.merchant_id = 0; + entry.alt_currency_id = 0; + entry.npc_spells_id = 0; + entry.npc_spells_effects_id = 0; + entry.npc_faction_id = 0; + entry.adventure_template_id = 0; + entry.trap_template = 0; + entry.mindmg = 0; + entry.maxdmg = 0; + entry.attack_count = -1; + entry.npcspecialattks = ""; + entry.special_abilities = ""; + entry.aggroradius = 0; + entry.assistradius = 0; + entry.face = 1; + entry.luclin_hairstyle = 1; + entry.luclin_haircolor = 1; + entry.luclin_eyecolor = 1; + entry.luclin_eyecolor2 = 1; + entry.luclin_beardcolor = 1; + entry.luclin_beard = 0; + entry.drakkin_heritage = 0; + entry.drakkin_tattoo = 0; + entry.drakkin_details = 0; + entry.armortint_id = 0; + entry.armortint_red = 0; + entry.armortint_green = 0; + entry.armortint_blue = 0; + entry.d_melee_texture1 = 0; + entry.d_melee_texture2 = 0; + entry.ammo_idfile = "IT10"; + entry.prim_melee_type = 28; + entry.sec_melee_type = 28; + entry.ranged_type = 7; + entry.runspeed = 0; + entry.MR = 0; + entry.CR = 0; + entry.DR = 0; + entry.FR = 0; + entry.PR = 0; + entry.Corrup = 0; + entry.PhR = 0; + entry.see_invis = 0; + entry.see_invis_undead = 0; + entry.qglobal = 0; + entry.AC = 0; + entry.npc_aggro = 0; + entry.spawn_limit = 0; + entry.attack_speed = 0; + entry.attack_delay = 30; + entry.findable = 0; + entry.STR = 75; + entry.STA = 75; + entry.DEX = 75; + entry.AGI = 75; + entry._INT = 80; + entry.WIS = 75; + entry.CHA = 75; + entry.see_hide = 0; + entry.see_improved_hide = 0; + entry.trackable = 1; + entry.isbot = 0; + entry.exclude = 1; + entry.ATK = 0; + entry.Accuracy = 0; + entry.Avoidance = 0; + entry.slow_mitigation = 0; + entry.version = 0; + entry.maxlevel = 0; + entry.scalerate = 100; + entry.private_corpse = 0; + entry.unique_spawn_by_name = 0; + entry.underwater = 0; + entry.isquest = 0; + entry.emoteid = 0; + entry.spellscale = 100; + entry.healscale = 100; + entry.no_target_hotkey = 0; + entry.raid_target = 0; + entry.armtexture = 0; + entry.bracertexture = 0; + entry.handtexture = 0; + entry.legtexture = 0; + entry.feettexture = 0; + entry.light = 0; + entry.walkspeed = 0; + entry.peqid = 0; + entry.unique_ = 0; + entry.fixed = 0; + entry.ignore_despawn = 0; + entry.show_name = 1; + entry.untargetable = 0; + entry.charm_ac = 0; + entry.charm_min_dmg = 0; + entry.charm_max_dmg = 0; + entry.charm_attack_delay = 0; + entry.charm_accuracy_rating = 0; + entry.charm_avoidance_rating = 0; + entry.charm_atk = 0; + entry.skip_global_loot = 0; + entry.rare_spawn = 0; + entry.stuck_behavior = 0; + entry.model = 0; + entry.flymode = -1; + entry.always_aggro = 0; + + return entry; + } + + static NpcTypes GetNpcTypesEntry( + const std::vector &npc_typess, + int npc_types_id + ) + { + for (auto &npc_types : npc_typess) { + if (npc_types.id == npc_types_id) { + return npc_types; + } + } + + return NewEntity(); + } + + static NpcTypes FindOne( + Database& db, + int npc_types_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_types_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcTypes entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.lastname = row[2] ? row[2] : ""; + entry.level = atoi(row[3]); + entry.race = atoi(row[4]); + entry.class = atoi(row[5]); + entry.bodytype = atoi(row[6]); + entry.hp = atoi(row[7]); + entry.mana = atoi(row[8]); + entry.gender = atoi(row[9]); + entry.texture = atoi(row[10]); + entry.helmtexture = atoi(row[11]); + entry.herosforgemodel = atoi(row[12]); + entry.size = static_cast(atof(row[13])); + entry.hp_regen_rate = atoi(row[14]); + entry.mana_regen_rate = atoi(row[15]); + entry.loottable_id = atoi(row[16]); + entry.merchant_id = atoi(row[17]); + entry.alt_currency_id = atoi(row[18]); + entry.npc_spells_id = atoi(row[19]); + entry.npc_spells_effects_id = atoi(row[20]); + entry.npc_faction_id = atoi(row[21]); + entry.adventure_template_id = atoi(row[22]); + entry.trap_template = atoi(row[23]); + entry.mindmg = atoi(row[24]); + entry.maxdmg = atoi(row[25]); + entry.attack_count = atoi(row[26]); + entry.npcspecialattks = row[27] ? row[27] : ""; + entry.special_abilities = row[28] ? row[28] : ""; + entry.aggroradius = atoi(row[29]); + entry.assistradius = atoi(row[30]); + entry.face = atoi(row[31]); + entry.luclin_hairstyle = atoi(row[32]); + entry.luclin_haircolor = atoi(row[33]); + entry.luclin_eyecolor = atoi(row[34]); + entry.luclin_eyecolor2 = atoi(row[35]); + entry.luclin_beardcolor = atoi(row[36]); + entry.luclin_beard = atoi(row[37]); + entry.drakkin_heritage = atoi(row[38]); + entry.drakkin_tattoo = atoi(row[39]); + entry.drakkin_details = atoi(row[40]); + entry.armortint_id = atoi(row[41]); + entry.armortint_red = atoi(row[42]); + entry.armortint_green = atoi(row[43]); + entry.armortint_blue = atoi(row[44]); + entry.d_melee_texture1 = atoi(row[45]); + entry.d_melee_texture2 = atoi(row[46]); + entry.ammo_idfile = row[47] ? row[47] : ""; + entry.prim_melee_type = atoi(row[48]); + entry.sec_melee_type = atoi(row[49]); + entry.ranged_type = atoi(row[50]); + entry.runspeed = static_cast(atof(row[51])); + entry.MR = atoi(row[52]); + entry.CR = atoi(row[53]); + entry.DR = atoi(row[54]); + entry.FR = atoi(row[55]); + entry.PR = atoi(row[56]); + entry.Corrup = atoi(row[57]); + entry.PhR = atoi(row[58]); + entry.see_invis = atoi(row[59]); + entry.see_invis_undead = atoi(row[60]); + entry.qglobal = atoi(row[61]); + entry.AC = atoi(row[62]); + entry.npc_aggro = atoi(row[63]); + entry.spawn_limit = atoi(row[64]); + entry.attack_speed = static_cast(atof(row[65])); + entry.attack_delay = atoi(row[66]); + entry.findable = atoi(row[67]); + entry.STR = atoi(row[68]); + entry.STA = atoi(row[69]); + entry.DEX = atoi(row[70]); + entry.AGI = atoi(row[71]); + entry._INT = atoi(row[72]); + entry.WIS = atoi(row[73]); + entry.CHA = atoi(row[74]); + entry.see_hide = atoi(row[75]); + entry.see_improved_hide = atoi(row[76]); + entry.trackable = atoi(row[77]); + entry.isbot = atoi(row[78]); + entry.exclude = atoi(row[79]); + entry.ATK = atoi(row[80]); + entry.Accuracy = atoi(row[81]); + entry.Avoidance = atoi(row[82]); + entry.slow_mitigation = atoi(row[83]); + entry.version = atoi(row[84]); + entry.maxlevel = atoi(row[85]); + entry.scalerate = atoi(row[86]); + entry.private_corpse = atoi(row[87]); + entry.unique_spawn_by_name = atoi(row[88]); + entry.underwater = atoi(row[89]); + entry.isquest = atoi(row[90]); + entry.emoteid = atoi(row[91]); + entry.spellscale = static_cast(atof(row[92])); + entry.healscale = static_cast(atof(row[93])); + entry.no_target_hotkey = atoi(row[94]); + entry.raid_target = atoi(row[95]); + entry.armtexture = atoi(row[96]); + entry.bracertexture = atoi(row[97]); + entry.handtexture = atoi(row[98]); + entry.legtexture = atoi(row[99]); + entry.feettexture = atoi(row[100]); + entry.light = atoi(row[101]); + entry.walkspeed = atoi(row[102]); + entry.peqid = atoi(row[103]); + entry.unique_ = atoi(row[104]); + entry.fixed = atoi(row[105]); + entry.ignore_despawn = atoi(row[106]); + entry.show_name = atoi(row[107]); + entry.untargetable = atoi(row[108]); + entry.charm_ac = atoi(row[109]); + entry.charm_min_dmg = atoi(row[110]); + entry.charm_max_dmg = atoi(row[111]); + entry.charm_attack_delay = atoi(row[112]); + entry.charm_accuracy_rating = atoi(row[113]); + entry.charm_avoidance_rating = atoi(row[114]); + entry.charm_atk = atoi(row[115]); + entry.skip_global_loot = atoi(row[116]); + entry.rare_spawn = atoi(row[117]); + entry.stuck_behavior = atoi(row[118]); + entry.model = atoi(row[119]); + entry.flymode = atoi(row[120]); + entry.always_aggro = atoi(row[121]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_types_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_types_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcTypes npc_types_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(npc_types_entry.name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(npc_types_entry.lastname) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(npc_types_entry.level)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_types_entry.race)); + update_values.push_back(columns[5] + " = " + std::to_string(npc_types_entry.class)); + update_values.push_back(columns[6] + " = " + std::to_string(npc_types_entry.bodytype)); + update_values.push_back(columns[7] + " = " + std::to_string(npc_types_entry.hp)); + update_values.push_back(columns[8] + " = " + std::to_string(npc_types_entry.mana)); + update_values.push_back(columns[9] + " = " + std::to_string(npc_types_entry.gender)); + update_values.push_back(columns[10] + " = " + std::to_string(npc_types_entry.texture)); + update_values.push_back(columns[11] + " = " + std::to_string(npc_types_entry.helmtexture)); + update_values.push_back(columns[12] + " = " + std::to_string(npc_types_entry.herosforgemodel)); + update_values.push_back(columns[13] + " = " + std::to_string(npc_types_entry.size)); + update_values.push_back(columns[14] + " = " + std::to_string(npc_types_entry.hp_regen_rate)); + update_values.push_back(columns[15] + " = " + std::to_string(npc_types_entry.mana_regen_rate)); + update_values.push_back(columns[16] + " = " + std::to_string(npc_types_entry.loottable_id)); + update_values.push_back(columns[17] + " = " + std::to_string(npc_types_entry.merchant_id)); + update_values.push_back(columns[18] + " = " + std::to_string(npc_types_entry.alt_currency_id)); + update_values.push_back(columns[19] + " = " + std::to_string(npc_types_entry.npc_spells_id)); + update_values.push_back(columns[20] + " = " + std::to_string(npc_types_entry.npc_spells_effects_id)); + update_values.push_back(columns[21] + " = " + std::to_string(npc_types_entry.npc_faction_id)); + update_values.push_back(columns[22] + " = " + std::to_string(npc_types_entry.adventure_template_id)); + update_values.push_back(columns[23] + " = " + std::to_string(npc_types_entry.trap_template)); + update_values.push_back(columns[24] + " = " + std::to_string(npc_types_entry.mindmg)); + update_values.push_back(columns[25] + " = " + std::to_string(npc_types_entry.maxdmg)); + update_values.push_back(columns[26] + " = " + std::to_string(npc_types_entry.attack_count)); + update_values.push_back(columns[27] + " = '" + EscapeString(npc_types_entry.npcspecialattks) + "'"); + update_values.push_back(columns[28] + " = '" + EscapeString(npc_types_entry.special_abilities) + "'"); + update_values.push_back(columns[29] + " = " + std::to_string(npc_types_entry.aggroradius)); + update_values.push_back(columns[30] + " = " + std::to_string(npc_types_entry.assistradius)); + update_values.push_back(columns[31] + " = " + std::to_string(npc_types_entry.face)); + update_values.push_back(columns[32] + " = " + std::to_string(npc_types_entry.luclin_hairstyle)); + update_values.push_back(columns[33] + " = " + std::to_string(npc_types_entry.luclin_haircolor)); + update_values.push_back(columns[34] + " = " + std::to_string(npc_types_entry.luclin_eyecolor)); + update_values.push_back(columns[35] + " = " + std::to_string(npc_types_entry.luclin_eyecolor2)); + update_values.push_back(columns[36] + " = " + std::to_string(npc_types_entry.luclin_beardcolor)); + update_values.push_back(columns[37] + " = " + std::to_string(npc_types_entry.luclin_beard)); + update_values.push_back(columns[38] + " = " + std::to_string(npc_types_entry.drakkin_heritage)); + update_values.push_back(columns[39] + " = " + std::to_string(npc_types_entry.drakkin_tattoo)); + update_values.push_back(columns[40] + " = " + std::to_string(npc_types_entry.drakkin_details)); + update_values.push_back(columns[41] + " = " + std::to_string(npc_types_entry.armortint_id)); + update_values.push_back(columns[42] + " = " + std::to_string(npc_types_entry.armortint_red)); + update_values.push_back(columns[43] + " = " + std::to_string(npc_types_entry.armortint_green)); + update_values.push_back(columns[44] + " = " + std::to_string(npc_types_entry.armortint_blue)); + update_values.push_back(columns[45] + " = " + std::to_string(npc_types_entry.d_melee_texture1)); + update_values.push_back(columns[46] + " = " + std::to_string(npc_types_entry.d_melee_texture2)); + update_values.push_back(columns[47] + " = '" + EscapeString(npc_types_entry.ammo_idfile) + "'"); + update_values.push_back(columns[48] + " = " + std::to_string(npc_types_entry.prim_melee_type)); + update_values.push_back(columns[49] + " = " + std::to_string(npc_types_entry.sec_melee_type)); + update_values.push_back(columns[50] + " = " + std::to_string(npc_types_entry.ranged_type)); + update_values.push_back(columns[51] + " = " + std::to_string(npc_types_entry.runspeed)); + update_values.push_back(columns[52] + " = " + std::to_string(npc_types_entry.MR)); + update_values.push_back(columns[53] + " = " + std::to_string(npc_types_entry.CR)); + update_values.push_back(columns[54] + " = " + std::to_string(npc_types_entry.DR)); + update_values.push_back(columns[55] + " = " + std::to_string(npc_types_entry.FR)); + update_values.push_back(columns[56] + " = " + std::to_string(npc_types_entry.PR)); + update_values.push_back(columns[57] + " = " + std::to_string(npc_types_entry.Corrup)); + update_values.push_back(columns[58] + " = " + std::to_string(npc_types_entry.PhR)); + update_values.push_back(columns[59] + " = " + std::to_string(npc_types_entry.see_invis)); + update_values.push_back(columns[60] + " = " + std::to_string(npc_types_entry.see_invis_undead)); + update_values.push_back(columns[61] + " = " + std::to_string(npc_types_entry.qglobal)); + update_values.push_back(columns[62] + " = " + std::to_string(npc_types_entry.AC)); + update_values.push_back(columns[63] + " = " + std::to_string(npc_types_entry.npc_aggro)); + update_values.push_back(columns[64] + " = " + std::to_string(npc_types_entry.spawn_limit)); + update_values.push_back(columns[65] + " = " + std::to_string(npc_types_entry.attack_speed)); + update_values.push_back(columns[66] + " = " + std::to_string(npc_types_entry.attack_delay)); + update_values.push_back(columns[67] + " = " + std::to_string(npc_types_entry.findable)); + update_values.push_back(columns[68] + " = " + std::to_string(npc_types_entry.STR)); + update_values.push_back(columns[69] + " = " + std::to_string(npc_types_entry.STA)); + update_values.push_back(columns[70] + " = " + std::to_string(npc_types_entry.DEX)); + update_values.push_back(columns[71] + " = " + std::to_string(npc_types_entry.AGI)); + update_values.push_back(columns[72] + " = " + std::to_string(npc_types_entry._INT)); + update_values.push_back(columns[73] + " = " + std::to_string(npc_types_entry.WIS)); + update_values.push_back(columns[74] + " = " + std::to_string(npc_types_entry.CHA)); + update_values.push_back(columns[75] + " = " + std::to_string(npc_types_entry.see_hide)); + update_values.push_back(columns[76] + " = " + std::to_string(npc_types_entry.see_improved_hide)); + update_values.push_back(columns[77] + " = " + std::to_string(npc_types_entry.trackable)); + update_values.push_back(columns[78] + " = " + std::to_string(npc_types_entry.isbot)); + update_values.push_back(columns[79] + " = " + std::to_string(npc_types_entry.exclude)); + update_values.push_back(columns[80] + " = " + std::to_string(npc_types_entry.ATK)); + update_values.push_back(columns[81] + " = " + std::to_string(npc_types_entry.Accuracy)); + update_values.push_back(columns[82] + " = " + std::to_string(npc_types_entry.Avoidance)); + update_values.push_back(columns[83] + " = " + std::to_string(npc_types_entry.slow_mitigation)); + update_values.push_back(columns[84] + " = " + std::to_string(npc_types_entry.version)); + update_values.push_back(columns[85] + " = " + std::to_string(npc_types_entry.maxlevel)); + update_values.push_back(columns[86] + " = " + std::to_string(npc_types_entry.scalerate)); + update_values.push_back(columns[87] + " = " + std::to_string(npc_types_entry.private_corpse)); + update_values.push_back(columns[88] + " = " + std::to_string(npc_types_entry.unique_spawn_by_name)); + update_values.push_back(columns[89] + " = " + std::to_string(npc_types_entry.underwater)); + update_values.push_back(columns[90] + " = " + std::to_string(npc_types_entry.isquest)); + update_values.push_back(columns[91] + " = " + std::to_string(npc_types_entry.emoteid)); + update_values.push_back(columns[92] + " = " + std::to_string(npc_types_entry.spellscale)); + update_values.push_back(columns[93] + " = " + std::to_string(npc_types_entry.healscale)); + update_values.push_back(columns[94] + " = " + std::to_string(npc_types_entry.no_target_hotkey)); + update_values.push_back(columns[95] + " = " + std::to_string(npc_types_entry.raid_target)); + update_values.push_back(columns[96] + " = " + std::to_string(npc_types_entry.armtexture)); + update_values.push_back(columns[97] + " = " + std::to_string(npc_types_entry.bracertexture)); + update_values.push_back(columns[98] + " = " + std::to_string(npc_types_entry.handtexture)); + update_values.push_back(columns[99] + " = " + std::to_string(npc_types_entry.legtexture)); + update_values.push_back(columns[100] + " = " + std::to_string(npc_types_entry.feettexture)); + update_values.push_back(columns[101] + " = " + std::to_string(npc_types_entry.light)); + update_values.push_back(columns[102] + " = " + std::to_string(npc_types_entry.walkspeed)); + update_values.push_back(columns[103] + " = " + std::to_string(npc_types_entry.peqid)); + update_values.push_back(columns[104] + " = " + std::to_string(npc_types_entry.unique_)); + update_values.push_back(columns[105] + " = " + std::to_string(npc_types_entry.fixed)); + update_values.push_back(columns[106] + " = " + std::to_string(npc_types_entry.ignore_despawn)); + update_values.push_back(columns[107] + " = " + std::to_string(npc_types_entry.show_name)); + update_values.push_back(columns[108] + " = " + std::to_string(npc_types_entry.untargetable)); + update_values.push_back(columns[109] + " = " + std::to_string(npc_types_entry.charm_ac)); + update_values.push_back(columns[110] + " = " + std::to_string(npc_types_entry.charm_min_dmg)); + update_values.push_back(columns[111] + " = " + std::to_string(npc_types_entry.charm_max_dmg)); + update_values.push_back(columns[112] + " = " + std::to_string(npc_types_entry.charm_attack_delay)); + update_values.push_back(columns[113] + " = " + std::to_string(npc_types_entry.charm_accuracy_rating)); + update_values.push_back(columns[114] + " = " + std::to_string(npc_types_entry.charm_avoidance_rating)); + update_values.push_back(columns[115] + " = " + std::to_string(npc_types_entry.charm_atk)); + update_values.push_back(columns[116] + " = " + std::to_string(npc_types_entry.skip_global_loot)); + update_values.push_back(columns[117] + " = " + std::to_string(npc_types_entry.rare_spawn)); + update_values.push_back(columns[118] + " = " + std::to_string(npc_types_entry.stuck_behavior)); + update_values.push_back(columns[119] + " = " + std::to_string(npc_types_entry.model)); + update_values.push_back(columns[120] + " = " + std::to_string(npc_types_entry.flymode)); + update_values.push_back(columns[121] + " = " + std::to_string(npc_types_entry.always_aggro)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_types_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcTypes InsertOne( + Database& db, + NpcTypes npc_types_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_types_entry.id)); + insert_values.push_back("'" + EscapeString(npc_types_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(npc_types_entry.lastname) + "'"); + insert_values.push_back(std::to_string(npc_types_entry.level)); + insert_values.push_back(std::to_string(npc_types_entry.race)); + insert_values.push_back(std::to_string(npc_types_entry.class)); + insert_values.push_back(std::to_string(npc_types_entry.bodytype)); + insert_values.push_back(std::to_string(npc_types_entry.hp)); + insert_values.push_back(std::to_string(npc_types_entry.mana)); + insert_values.push_back(std::to_string(npc_types_entry.gender)); + insert_values.push_back(std::to_string(npc_types_entry.texture)); + insert_values.push_back(std::to_string(npc_types_entry.helmtexture)); + insert_values.push_back(std::to_string(npc_types_entry.herosforgemodel)); + insert_values.push_back(std::to_string(npc_types_entry.size)); + insert_values.push_back(std::to_string(npc_types_entry.hp_regen_rate)); + insert_values.push_back(std::to_string(npc_types_entry.mana_regen_rate)); + insert_values.push_back(std::to_string(npc_types_entry.loottable_id)); + insert_values.push_back(std::to_string(npc_types_entry.merchant_id)); + insert_values.push_back(std::to_string(npc_types_entry.alt_currency_id)); + insert_values.push_back(std::to_string(npc_types_entry.npc_spells_id)); + insert_values.push_back(std::to_string(npc_types_entry.npc_spells_effects_id)); + insert_values.push_back(std::to_string(npc_types_entry.npc_faction_id)); + insert_values.push_back(std::to_string(npc_types_entry.adventure_template_id)); + insert_values.push_back(std::to_string(npc_types_entry.trap_template)); + insert_values.push_back(std::to_string(npc_types_entry.mindmg)); + insert_values.push_back(std::to_string(npc_types_entry.maxdmg)); + insert_values.push_back(std::to_string(npc_types_entry.attack_count)); + insert_values.push_back("'" + EscapeString(npc_types_entry.npcspecialattks) + "'"); + insert_values.push_back("'" + EscapeString(npc_types_entry.special_abilities) + "'"); + insert_values.push_back(std::to_string(npc_types_entry.aggroradius)); + insert_values.push_back(std::to_string(npc_types_entry.assistradius)); + insert_values.push_back(std::to_string(npc_types_entry.face)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_hairstyle)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_haircolor)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_eyecolor)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_eyecolor2)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_beardcolor)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_beard)); + insert_values.push_back(std::to_string(npc_types_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(npc_types_entry.drakkin_tattoo)); + insert_values.push_back(std::to_string(npc_types_entry.drakkin_details)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_id)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_red)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_green)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_blue)); + insert_values.push_back(std::to_string(npc_types_entry.d_melee_texture1)); + insert_values.push_back(std::to_string(npc_types_entry.d_melee_texture2)); + insert_values.push_back("'" + EscapeString(npc_types_entry.ammo_idfile) + "'"); + insert_values.push_back(std::to_string(npc_types_entry.prim_melee_type)); + insert_values.push_back(std::to_string(npc_types_entry.sec_melee_type)); + insert_values.push_back(std::to_string(npc_types_entry.ranged_type)); + insert_values.push_back(std::to_string(npc_types_entry.runspeed)); + insert_values.push_back(std::to_string(npc_types_entry.MR)); + insert_values.push_back(std::to_string(npc_types_entry.CR)); + insert_values.push_back(std::to_string(npc_types_entry.DR)); + insert_values.push_back(std::to_string(npc_types_entry.FR)); + insert_values.push_back(std::to_string(npc_types_entry.PR)); + insert_values.push_back(std::to_string(npc_types_entry.Corrup)); + insert_values.push_back(std::to_string(npc_types_entry.PhR)); + insert_values.push_back(std::to_string(npc_types_entry.see_invis)); + insert_values.push_back(std::to_string(npc_types_entry.see_invis_undead)); + insert_values.push_back(std::to_string(npc_types_entry.qglobal)); + insert_values.push_back(std::to_string(npc_types_entry.AC)); + insert_values.push_back(std::to_string(npc_types_entry.npc_aggro)); + insert_values.push_back(std::to_string(npc_types_entry.spawn_limit)); + insert_values.push_back(std::to_string(npc_types_entry.attack_speed)); + insert_values.push_back(std::to_string(npc_types_entry.attack_delay)); + insert_values.push_back(std::to_string(npc_types_entry.findable)); + insert_values.push_back(std::to_string(npc_types_entry.STR)); + insert_values.push_back(std::to_string(npc_types_entry.STA)); + insert_values.push_back(std::to_string(npc_types_entry.DEX)); + insert_values.push_back(std::to_string(npc_types_entry.AGI)); + insert_values.push_back(std::to_string(npc_types_entry._INT)); + insert_values.push_back(std::to_string(npc_types_entry.WIS)); + insert_values.push_back(std::to_string(npc_types_entry.CHA)); + insert_values.push_back(std::to_string(npc_types_entry.see_hide)); + insert_values.push_back(std::to_string(npc_types_entry.see_improved_hide)); + insert_values.push_back(std::to_string(npc_types_entry.trackable)); + insert_values.push_back(std::to_string(npc_types_entry.isbot)); + insert_values.push_back(std::to_string(npc_types_entry.exclude)); + insert_values.push_back(std::to_string(npc_types_entry.ATK)); + insert_values.push_back(std::to_string(npc_types_entry.Accuracy)); + insert_values.push_back(std::to_string(npc_types_entry.Avoidance)); + insert_values.push_back(std::to_string(npc_types_entry.slow_mitigation)); + insert_values.push_back(std::to_string(npc_types_entry.version)); + insert_values.push_back(std::to_string(npc_types_entry.maxlevel)); + insert_values.push_back(std::to_string(npc_types_entry.scalerate)); + insert_values.push_back(std::to_string(npc_types_entry.private_corpse)); + insert_values.push_back(std::to_string(npc_types_entry.unique_spawn_by_name)); + insert_values.push_back(std::to_string(npc_types_entry.underwater)); + insert_values.push_back(std::to_string(npc_types_entry.isquest)); + insert_values.push_back(std::to_string(npc_types_entry.emoteid)); + insert_values.push_back(std::to_string(npc_types_entry.spellscale)); + insert_values.push_back(std::to_string(npc_types_entry.healscale)); + insert_values.push_back(std::to_string(npc_types_entry.no_target_hotkey)); + insert_values.push_back(std::to_string(npc_types_entry.raid_target)); + insert_values.push_back(std::to_string(npc_types_entry.armtexture)); + insert_values.push_back(std::to_string(npc_types_entry.bracertexture)); + insert_values.push_back(std::to_string(npc_types_entry.handtexture)); + insert_values.push_back(std::to_string(npc_types_entry.legtexture)); + insert_values.push_back(std::to_string(npc_types_entry.feettexture)); + insert_values.push_back(std::to_string(npc_types_entry.light)); + insert_values.push_back(std::to_string(npc_types_entry.walkspeed)); + insert_values.push_back(std::to_string(npc_types_entry.peqid)); + insert_values.push_back(std::to_string(npc_types_entry.unique_)); + insert_values.push_back(std::to_string(npc_types_entry.fixed)); + insert_values.push_back(std::to_string(npc_types_entry.ignore_despawn)); + insert_values.push_back(std::to_string(npc_types_entry.show_name)); + insert_values.push_back(std::to_string(npc_types_entry.untargetable)); + insert_values.push_back(std::to_string(npc_types_entry.charm_ac)); + insert_values.push_back(std::to_string(npc_types_entry.charm_min_dmg)); + insert_values.push_back(std::to_string(npc_types_entry.charm_max_dmg)); + insert_values.push_back(std::to_string(npc_types_entry.charm_attack_delay)); + insert_values.push_back(std::to_string(npc_types_entry.charm_accuracy_rating)); + insert_values.push_back(std::to_string(npc_types_entry.charm_avoidance_rating)); + insert_values.push_back(std::to_string(npc_types_entry.charm_atk)); + insert_values.push_back(std::to_string(npc_types_entry.skip_global_loot)); + insert_values.push_back(std::to_string(npc_types_entry.rare_spawn)); + insert_values.push_back(std::to_string(npc_types_entry.stuck_behavior)); + insert_values.push_back(std::to_string(npc_types_entry.model)); + insert_values.push_back(std::to_string(npc_types_entry.flymode)); + insert_values.push_back(std::to_string(npc_types_entry.always_aggro)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_types_entry.id = results.LastInsertedID(); + return npc_types_entry; + } + + npc_types_entry = NewEntity(); + + return npc_types_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_types_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_types_entry: npc_types_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_types_entry.id)); + insert_values.push_back("'" + EscapeString(npc_types_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(npc_types_entry.lastname) + "'"); + insert_values.push_back(std::to_string(npc_types_entry.level)); + insert_values.push_back(std::to_string(npc_types_entry.race)); + insert_values.push_back(std::to_string(npc_types_entry.class)); + insert_values.push_back(std::to_string(npc_types_entry.bodytype)); + insert_values.push_back(std::to_string(npc_types_entry.hp)); + insert_values.push_back(std::to_string(npc_types_entry.mana)); + insert_values.push_back(std::to_string(npc_types_entry.gender)); + insert_values.push_back(std::to_string(npc_types_entry.texture)); + insert_values.push_back(std::to_string(npc_types_entry.helmtexture)); + insert_values.push_back(std::to_string(npc_types_entry.herosforgemodel)); + insert_values.push_back(std::to_string(npc_types_entry.size)); + insert_values.push_back(std::to_string(npc_types_entry.hp_regen_rate)); + insert_values.push_back(std::to_string(npc_types_entry.mana_regen_rate)); + insert_values.push_back(std::to_string(npc_types_entry.loottable_id)); + insert_values.push_back(std::to_string(npc_types_entry.merchant_id)); + insert_values.push_back(std::to_string(npc_types_entry.alt_currency_id)); + insert_values.push_back(std::to_string(npc_types_entry.npc_spells_id)); + insert_values.push_back(std::to_string(npc_types_entry.npc_spells_effects_id)); + insert_values.push_back(std::to_string(npc_types_entry.npc_faction_id)); + insert_values.push_back(std::to_string(npc_types_entry.adventure_template_id)); + insert_values.push_back(std::to_string(npc_types_entry.trap_template)); + insert_values.push_back(std::to_string(npc_types_entry.mindmg)); + insert_values.push_back(std::to_string(npc_types_entry.maxdmg)); + insert_values.push_back(std::to_string(npc_types_entry.attack_count)); + insert_values.push_back("'" + EscapeString(npc_types_entry.npcspecialattks) + "'"); + insert_values.push_back("'" + EscapeString(npc_types_entry.special_abilities) + "'"); + insert_values.push_back(std::to_string(npc_types_entry.aggroradius)); + insert_values.push_back(std::to_string(npc_types_entry.assistradius)); + insert_values.push_back(std::to_string(npc_types_entry.face)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_hairstyle)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_haircolor)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_eyecolor)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_eyecolor2)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_beardcolor)); + insert_values.push_back(std::to_string(npc_types_entry.luclin_beard)); + insert_values.push_back(std::to_string(npc_types_entry.drakkin_heritage)); + insert_values.push_back(std::to_string(npc_types_entry.drakkin_tattoo)); + insert_values.push_back(std::to_string(npc_types_entry.drakkin_details)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_id)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_red)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_green)); + insert_values.push_back(std::to_string(npc_types_entry.armortint_blue)); + insert_values.push_back(std::to_string(npc_types_entry.d_melee_texture1)); + insert_values.push_back(std::to_string(npc_types_entry.d_melee_texture2)); + insert_values.push_back("'" + EscapeString(npc_types_entry.ammo_idfile) + "'"); + insert_values.push_back(std::to_string(npc_types_entry.prim_melee_type)); + insert_values.push_back(std::to_string(npc_types_entry.sec_melee_type)); + insert_values.push_back(std::to_string(npc_types_entry.ranged_type)); + insert_values.push_back(std::to_string(npc_types_entry.runspeed)); + insert_values.push_back(std::to_string(npc_types_entry.MR)); + insert_values.push_back(std::to_string(npc_types_entry.CR)); + insert_values.push_back(std::to_string(npc_types_entry.DR)); + insert_values.push_back(std::to_string(npc_types_entry.FR)); + insert_values.push_back(std::to_string(npc_types_entry.PR)); + insert_values.push_back(std::to_string(npc_types_entry.Corrup)); + insert_values.push_back(std::to_string(npc_types_entry.PhR)); + insert_values.push_back(std::to_string(npc_types_entry.see_invis)); + insert_values.push_back(std::to_string(npc_types_entry.see_invis_undead)); + insert_values.push_back(std::to_string(npc_types_entry.qglobal)); + insert_values.push_back(std::to_string(npc_types_entry.AC)); + insert_values.push_back(std::to_string(npc_types_entry.npc_aggro)); + insert_values.push_back(std::to_string(npc_types_entry.spawn_limit)); + insert_values.push_back(std::to_string(npc_types_entry.attack_speed)); + insert_values.push_back(std::to_string(npc_types_entry.attack_delay)); + insert_values.push_back(std::to_string(npc_types_entry.findable)); + insert_values.push_back(std::to_string(npc_types_entry.STR)); + insert_values.push_back(std::to_string(npc_types_entry.STA)); + insert_values.push_back(std::to_string(npc_types_entry.DEX)); + insert_values.push_back(std::to_string(npc_types_entry.AGI)); + insert_values.push_back(std::to_string(npc_types_entry._INT)); + insert_values.push_back(std::to_string(npc_types_entry.WIS)); + insert_values.push_back(std::to_string(npc_types_entry.CHA)); + insert_values.push_back(std::to_string(npc_types_entry.see_hide)); + insert_values.push_back(std::to_string(npc_types_entry.see_improved_hide)); + insert_values.push_back(std::to_string(npc_types_entry.trackable)); + insert_values.push_back(std::to_string(npc_types_entry.isbot)); + insert_values.push_back(std::to_string(npc_types_entry.exclude)); + insert_values.push_back(std::to_string(npc_types_entry.ATK)); + insert_values.push_back(std::to_string(npc_types_entry.Accuracy)); + insert_values.push_back(std::to_string(npc_types_entry.Avoidance)); + insert_values.push_back(std::to_string(npc_types_entry.slow_mitigation)); + insert_values.push_back(std::to_string(npc_types_entry.version)); + insert_values.push_back(std::to_string(npc_types_entry.maxlevel)); + insert_values.push_back(std::to_string(npc_types_entry.scalerate)); + insert_values.push_back(std::to_string(npc_types_entry.private_corpse)); + insert_values.push_back(std::to_string(npc_types_entry.unique_spawn_by_name)); + insert_values.push_back(std::to_string(npc_types_entry.underwater)); + insert_values.push_back(std::to_string(npc_types_entry.isquest)); + insert_values.push_back(std::to_string(npc_types_entry.emoteid)); + insert_values.push_back(std::to_string(npc_types_entry.spellscale)); + insert_values.push_back(std::to_string(npc_types_entry.healscale)); + insert_values.push_back(std::to_string(npc_types_entry.no_target_hotkey)); + insert_values.push_back(std::to_string(npc_types_entry.raid_target)); + insert_values.push_back(std::to_string(npc_types_entry.armtexture)); + insert_values.push_back(std::to_string(npc_types_entry.bracertexture)); + insert_values.push_back(std::to_string(npc_types_entry.handtexture)); + insert_values.push_back(std::to_string(npc_types_entry.legtexture)); + insert_values.push_back(std::to_string(npc_types_entry.feettexture)); + insert_values.push_back(std::to_string(npc_types_entry.light)); + insert_values.push_back(std::to_string(npc_types_entry.walkspeed)); + insert_values.push_back(std::to_string(npc_types_entry.peqid)); + insert_values.push_back(std::to_string(npc_types_entry.unique_)); + insert_values.push_back(std::to_string(npc_types_entry.fixed)); + insert_values.push_back(std::to_string(npc_types_entry.ignore_despawn)); + insert_values.push_back(std::to_string(npc_types_entry.show_name)); + insert_values.push_back(std::to_string(npc_types_entry.untargetable)); + insert_values.push_back(std::to_string(npc_types_entry.charm_ac)); + insert_values.push_back(std::to_string(npc_types_entry.charm_min_dmg)); + insert_values.push_back(std::to_string(npc_types_entry.charm_max_dmg)); + insert_values.push_back(std::to_string(npc_types_entry.charm_attack_delay)); + insert_values.push_back(std::to_string(npc_types_entry.charm_accuracy_rating)); + insert_values.push_back(std::to_string(npc_types_entry.charm_avoidance_rating)); + insert_values.push_back(std::to_string(npc_types_entry.charm_atk)); + insert_values.push_back(std::to_string(npc_types_entry.skip_global_loot)); + insert_values.push_back(std::to_string(npc_types_entry.rare_spawn)); + insert_values.push_back(std::to_string(npc_types_entry.stuck_behavior)); + insert_values.push_back(std::to_string(npc_types_entry.model)); + insert_values.push_back(std::to_string(npc_types_entry.flymode)); + insert_values.push_back(std::to_string(npc_types_entry.always_aggro)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcTypes entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.lastname = row[2] ? row[2] : ""; + entry.level = atoi(row[3]); + entry.race = atoi(row[4]); + entry.class = atoi(row[5]); + entry.bodytype = atoi(row[6]); + entry.hp = atoi(row[7]); + entry.mana = atoi(row[8]); + entry.gender = atoi(row[9]); + entry.texture = atoi(row[10]); + entry.helmtexture = atoi(row[11]); + entry.herosforgemodel = atoi(row[12]); + entry.size = static_cast(atof(row[13])); + entry.hp_regen_rate = atoi(row[14]); + entry.mana_regen_rate = atoi(row[15]); + entry.loottable_id = atoi(row[16]); + entry.merchant_id = atoi(row[17]); + entry.alt_currency_id = atoi(row[18]); + entry.npc_spells_id = atoi(row[19]); + entry.npc_spells_effects_id = atoi(row[20]); + entry.npc_faction_id = atoi(row[21]); + entry.adventure_template_id = atoi(row[22]); + entry.trap_template = atoi(row[23]); + entry.mindmg = atoi(row[24]); + entry.maxdmg = atoi(row[25]); + entry.attack_count = atoi(row[26]); + entry.npcspecialattks = row[27] ? row[27] : ""; + entry.special_abilities = row[28] ? row[28] : ""; + entry.aggroradius = atoi(row[29]); + entry.assistradius = atoi(row[30]); + entry.face = atoi(row[31]); + entry.luclin_hairstyle = atoi(row[32]); + entry.luclin_haircolor = atoi(row[33]); + entry.luclin_eyecolor = atoi(row[34]); + entry.luclin_eyecolor2 = atoi(row[35]); + entry.luclin_beardcolor = atoi(row[36]); + entry.luclin_beard = atoi(row[37]); + entry.drakkin_heritage = atoi(row[38]); + entry.drakkin_tattoo = atoi(row[39]); + entry.drakkin_details = atoi(row[40]); + entry.armortint_id = atoi(row[41]); + entry.armortint_red = atoi(row[42]); + entry.armortint_green = atoi(row[43]); + entry.armortint_blue = atoi(row[44]); + entry.d_melee_texture1 = atoi(row[45]); + entry.d_melee_texture2 = atoi(row[46]); + entry.ammo_idfile = row[47] ? row[47] : ""; + entry.prim_melee_type = atoi(row[48]); + entry.sec_melee_type = atoi(row[49]); + entry.ranged_type = atoi(row[50]); + entry.runspeed = static_cast(atof(row[51])); + entry.MR = atoi(row[52]); + entry.CR = atoi(row[53]); + entry.DR = atoi(row[54]); + entry.FR = atoi(row[55]); + entry.PR = atoi(row[56]); + entry.Corrup = atoi(row[57]); + entry.PhR = atoi(row[58]); + entry.see_invis = atoi(row[59]); + entry.see_invis_undead = atoi(row[60]); + entry.qglobal = atoi(row[61]); + entry.AC = atoi(row[62]); + entry.npc_aggro = atoi(row[63]); + entry.spawn_limit = atoi(row[64]); + entry.attack_speed = static_cast(atof(row[65])); + entry.attack_delay = atoi(row[66]); + entry.findable = atoi(row[67]); + entry.STR = atoi(row[68]); + entry.STA = atoi(row[69]); + entry.DEX = atoi(row[70]); + entry.AGI = atoi(row[71]); + entry._INT = atoi(row[72]); + entry.WIS = atoi(row[73]); + entry.CHA = atoi(row[74]); + entry.see_hide = atoi(row[75]); + entry.see_improved_hide = atoi(row[76]); + entry.trackable = atoi(row[77]); + entry.isbot = atoi(row[78]); + entry.exclude = atoi(row[79]); + entry.ATK = atoi(row[80]); + entry.Accuracy = atoi(row[81]); + entry.Avoidance = atoi(row[82]); + entry.slow_mitigation = atoi(row[83]); + entry.version = atoi(row[84]); + entry.maxlevel = atoi(row[85]); + entry.scalerate = atoi(row[86]); + entry.private_corpse = atoi(row[87]); + entry.unique_spawn_by_name = atoi(row[88]); + entry.underwater = atoi(row[89]); + entry.isquest = atoi(row[90]); + entry.emoteid = atoi(row[91]); + entry.spellscale = static_cast(atof(row[92])); + entry.healscale = static_cast(atof(row[93])); + entry.no_target_hotkey = atoi(row[94]); + entry.raid_target = atoi(row[95]); + entry.armtexture = atoi(row[96]); + entry.bracertexture = atoi(row[97]); + entry.handtexture = atoi(row[98]); + entry.legtexture = atoi(row[99]); + entry.feettexture = atoi(row[100]); + entry.light = atoi(row[101]); + entry.walkspeed = atoi(row[102]); + entry.peqid = atoi(row[103]); + entry.unique_ = atoi(row[104]); + entry.fixed = atoi(row[105]); + entry.ignore_despawn = atoi(row[106]); + entry.show_name = atoi(row[107]); + entry.untargetable = atoi(row[108]); + entry.charm_ac = atoi(row[109]); + entry.charm_min_dmg = atoi(row[110]); + entry.charm_max_dmg = atoi(row[111]); + entry.charm_attack_delay = atoi(row[112]); + entry.charm_accuracy_rating = atoi(row[113]); + entry.charm_avoidance_rating = atoi(row[114]); + entry.charm_atk = atoi(row[115]); + entry.skip_global_loot = atoi(row[116]); + entry.rare_spawn = atoi(row[117]); + entry.stuck_behavior = atoi(row[118]); + entry.model = atoi(row[119]); + entry.flymode = atoi(row[120]); + entry.always_aggro = atoi(row[121]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcTypes entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.lastname = row[2] ? row[2] : ""; + entry.level = atoi(row[3]); + entry.race = atoi(row[4]); + entry.class = atoi(row[5]); + entry.bodytype = atoi(row[6]); + entry.hp = atoi(row[7]); + entry.mana = atoi(row[8]); + entry.gender = atoi(row[9]); + entry.texture = atoi(row[10]); + entry.helmtexture = atoi(row[11]); + entry.herosforgemodel = atoi(row[12]); + entry.size = static_cast(atof(row[13])); + entry.hp_regen_rate = atoi(row[14]); + entry.mana_regen_rate = atoi(row[15]); + entry.loottable_id = atoi(row[16]); + entry.merchant_id = atoi(row[17]); + entry.alt_currency_id = atoi(row[18]); + entry.npc_spells_id = atoi(row[19]); + entry.npc_spells_effects_id = atoi(row[20]); + entry.npc_faction_id = atoi(row[21]); + entry.adventure_template_id = atoi(row[22]); + entry.trap_template = atoi(row[23]); + entry.mindmg = atoi(row[24]); + entry.maxdmg = atoi(row[25]); + entry.attack_count = atoi(row[26]); + entry.npcspecialattks = row[27] ? row[27] : ""; + entry.special_abilities = row[28] ? row[28] : ""; + entry.aggroradius = atoi(row[29]); + entry.assistradius = atoi(row[30]); + entry.face = atoi(row[31]); + entry.luclin_hairstyle = atoi(row[32]); + entry.luclin_haircolor = atoi(row[33]); + entry.luclin_eyecolor = atoi(row[34]); + entry.luclin_eyecolor2 = atoi(row[35]); + entry.luclin_beardcolor = atoi(row[36]); + entry.luclin_beard = atoi(row[37]); + entry.drakkin_heritage = atoi(row[38]); + entry.drakkin_tattoo = atoi(row[39]); + entry.drakkin_details = atoi(row[40]); + entry.armortint_id = atoi(row[41]); + entry.armortint_red = atoi(row[42]); + entry.armortint_green = atoi(row[43]); + entry.armortint_blue = atoi(row[44]); + entry.d_melee_texture1 = atoi(row[45]); + entry.d_melee_texture2 = atoi(row[46]); + entry.ammo_idfile = row[47] ? row[47] : ""; + entry.prim_melee_type = atoi(row[48]); + entry.sec_melee_type = atoi(row[49]); + entry.ranged_type = atoi(row[50]); + entry.runspeed = static_cast(atof(row[51])); + entry.MR = atoi(row[52]); + entry.CR = atoi(row[53]); + entry.DR = atoi(row[54]); + entry.FR = atoi(row[55]); + entry.PR = atoi(row[56]); + entry.Corrup = atoi(row[57]); + entry.PhR = atoi(row[58]); + entry.see_invis = atoi(row[59]); + entry.see_invis_undead = atoi(row[60]); + entry.qglobal = atoi(row[61]); + entry.AC = atoi(row[62]); + entry.npc_aggro = atoi(row[63]); + entry.spawn_limit = atoi(row[64]); + entry.attack_speed = static_cast(atof(row[65])); + entry.attack_delay = atoi(row[66]); + entry.findable = atoi(row[67]); + entry.STR = atoi(row[68]); + entry.STA = atoi(row[69]); + entry.DEX = atoi(row[70]); + entry.AGI = atoi(row[71]); + entry._INT = atoi(row[72]); + entry.WIS = atoi(row[73]); + entry.CHA = atoi(row[74]); + entry.see_hide = atoi(row[75]); + entry.see_improved_hide = atoi(row[76]); + entry.trackable = atoi(row[77]); + entry.isbot = atoi(row[78]); + entry.exclude = atoi(row[79]); + entry.ATK = atoi(row[80]); + entry.Accuracy = atoi(row[81]); + entry.Avoidance = atoi(row[82]); + entry.slow_mitigation = atoi(row[83]); + entry.version = atoi(row[84]); + entry.maxlevel = atoi(row[85]); + entry.scalerate = atoi(row[86]); + entry.private_corpse = atoi(row[87]); + entry.unique_spawn_by_name = atoi(row[88]); + entry.underwater = atoi(row[89]); + entry.isquest = atoi(row[90]); + entry.emoteid = atoi(row[91]); + entry.spellscale = static_cast(atof(row[92])); + entry.healscale = static_cast(atof(row[93])); + entry.no_target_hotkey = atoi(row[94]); + entry.raid_target = atoi(row[95]); + entry.armtexture = atoi(row[96]); + entry.bracertexture = atoi(row[97]); + entry.handtexture = atoi(row[98]); + entry.legtexture = atoi(row[99]); + entry.feettexture = atoi(row[100]); + entry.light = atoi(row[101]); + entry.walkspeed = atoi(row[102]); + entry.peqid = atoi(row[103]); + entry.unique_ = atoi(row[104]); + entry.fixed = atoi(row[105]); + entry.ignore_despawn = atoi(row[106]); + entry.show_name = atoi(row[107]); + entry.untargetable = atoi(row[108]); + entry.charm_ac = atoi(row[109]); + entry.charm_min_dmg = atoi(row[110]); + entry.charm_max_dmg = atoi(row[111]); + entry.charm_attack_delay = atoi(row[112]); + entry.charm_accuracy_rating = atoi(row[113]); + entry.charm_avoidance_rating = atoi(row[114]); + entry.charm_atk = atoi(row[115]); + entry.skip_global_loot = atoi(row[116]); + entry.rare_spawn = atoi(row[117]); + entry.stuck_behavior = atoi(row[118]); + entry.model = atoi(row[119]); + entry.flymode = atoi(row[120]); + entry.always_aggro = atoi(row[121]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_TYPES_REPOSITORY_H diff --git a/common/repositories/base/base_npc_types_tint_repository.h b/common/repositories/base/base_npc_types_tint_repository.h new file mode 100644 index 000000000..3ba577f36 --- /dev/null +++ b/common/repositories/base/base_npc_types_tint_repository.h @@ -0,0 +1,536 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_NPC_TYPES_TINT_REPOSITORY_H +#define EQEMU_BASE_NPC_TYPES_TINT_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseNpcTypesTintRepository { +public: + struct NpcTypesTint { + int id; + std::string tint_set_name; + int red1h; + int grn1h; + int blu1h; + int red2c; + int grn2c; + int blu2c; + int red3a; + int grn3a; + int blu3a; + int red4b; + int grn4b; + int blu4b; + int red5g; + int grn5g; + int blu5g; + int red6l; + int grn6l; + int blu6l; + int red7f; + int grn7f; + int blu7f; + int red8x; + int grn8x; + int blu8x; + int red9x; + int grn9x; + int blu9x; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "tint_set_name", + "red1h", + "grn1h", + "blu1h", + "red2c", + "grn2c", + "blu2c", + "red3a", + "grn3a", + "blu3a", + "red4b", + "grn4b", + "blu4b", + "red5g", + "grn5g", + "blu5g", + "red6l", + "grn6l", + "blu6l", + "red7f", + "grn7f", + "blu7f", + "red8x", + "grn8x", + "blu8x", + "red9x", + "grn9x", + "blu9x", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("npc_types_tint"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static NpcTypesTint NewEntity() + { + NpcTypesTint entry{}; + + entry.id = 0; + entry.tint_set_name = ""; + entry.red1h = 0; + entry.grn1h = 0; + entry.blu1h = 0; + entry.red2c = 0; + entry.grn2c = 0; + entry.blu2c = 0; + entry.red3a = 0; + entry.grn3a = 0; + entry.blu3a = 0; + entry.red4b = 0; + entry.grn4b = 0; + entry.blu4b = 0; + entry.red5g = 0; + entry.grn5g = 0; + entry.blu5g = 0; + entry.red6l = 0; + entry.grn6l = 0; + entry.blu6l = 0; + entry.red7f = 0; + entry.grn7f = 0; + entry.blu7f = 0; + entry.red8x = 0; + entry.grn8x = 0; + entry.blu8x = 0; + entry.red9x = 0; + entry.grn9x = 0; + entry.blu9x = 0; + + return entry; + } + + static NpcTypesTint GetNpcTypesTintEntry( + const std::vector &npc_types_tints, + int npc_types_tint_id + ) + { + for (auto &npc_types_tint : npc_types_tints) { + if (npc_types_tint.id == npc_types_tint_id) { + return npc_types_tint; + } + } + + return NewEntity(); + } + + static NpcTypesTint FindOne( + Database& db, + int npc_types_tint_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + npc_types_tint_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + NpcTypesTint entry{}; + + entry.id = atoi(row[0]); + entry.tint_set_name = row[1] ? row[1] : ""; + entry.red1h = atoi(row[2]); + entry.grn1h = atoi(row[3]); + entry.blu1h = atoi(row[4]); + entry.red2c = atoi(row[5]); + entry.grn2c = atoi(row[6]); + entry.blu2c = atoi(row[7]); + entry.red3a = atoi(row[8]); + entry.grn3a = atoi(row[9]); + entry.blu3a = atoi(row[10]); + entry.red4b = atoi(row[11]); + entry.grn4b = atoi(row[12]); + entry.blu4b = atoi(row[13]); + entry.red5g = atoi(row[14]); + entry.grn5g = atoi(row[15]); + entry.blu5g = atoi(row[16]); + entry.red6l = atoi(row[17]); + entry.grn6l = atoi(row[18]); + entry.blu6l = atoi(row[19]); + entry.red7f = atoi(row[20]); + entry.grn7f = atoi(row[21]); + entry.blu7f = atoi(row[22]); + entry.red8x = atoi(row[23]); + entry.grn8x = atoi(row[24]); + entry.blu8x = atoi(row[25]); + entry.red9x = atoi(row[26]); + entry.grn9x = atoi(row[27]); + entry.blu9x = atoi(row[28]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int npc_types_tint_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + npc_types_tint_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + NpcTypesTint npc_types_tint_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(npc_types_tint_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(npc_types_tint_entry.tint_set_name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(npc_types_tint_entry.red1h)); + update_values.push_back(columns[3] + " = " + std::to_string(npc_types_tint_entry.grn1h)); + update_values.push_back(columns[4] + " = " + std::to_string(npc_types_tint_entry.blu1h)); + update_values.push_back(columns[5] + " = " + std::to_string(npc_types_tint_entry.red2c)); + update_values.push_back(columns[6] + " = " + std::to_string(npc_types_tint_entry.grn2c)); + update_values.push_back(columns[7] + " = " + std::to_string(npc_types_tint_entry.blu2c)); + update_values.push_back(columns[8] + " = " + std::to_string(npc_types_tint_entry.red3a)); + update_values.push_back(columns[9] + " = " + std::to_string(npc_types_tint_entry.grn3a)); + update_values.push_back(columns[10] + " = " + std::to_string(npc_types_tint_entry.blu3a)); + update_values.push_back(columns[11] + " = " + std::to_string(npc_types_tint_entry.red4b)); + update_values.push_back(columns[12] + " = " + std::to_string(npc_types_tint_entry.grn4b)); + update_values.push_back(columns[13] + " = " + std::to_string(npc_types_tint_entry.blu4b)); + update_values.push_back(columns[14] + " = " + std::to_string(npc_types_tint_entry.red5g)); + update_values.push_back(columns[15] + " = " + std::to_string(npc_types_tint_entry.grn5g)); + update_values.push_back(columns[16] + " = " + std::to_string(npc_types_tint_entry.blu5g)); + update_values.push_back(columns[17] + " = " + std::to_string(npc_types_tint_entry.red6l)); + update_values.push_back(columns[18] + " = " + std::to_string(npc_types_tint_entry.grn6l)); + update_values.push_back(columns[19] + " = " + std::to_string(npc_types_tint_entry.blu6l)); + update_values.push_back(columns[20] + " = " + std::to_string(npc_types_tint_entry.red7f)); + update_values.push_back(columns[21] + " = " + std::to_string(npc_types_tint_entry.grn7f)); + update_values.push_back(columns[22] + " = " + std::to_string(npc_types_tint_entry.blu7f)); + update_values.push_back(columns[23] + " = " + std::to_string(npc_types_tint_entry.red8x)); + update_values.push_back(columns[24] + " = " + std::to_string(npc_types_tint_entry.grn8x)); + update_values.push_back(columns[25] + " = " + std::to_string(npc_types_tint_entry.blu8x)); + update_values.push_back(columns[26] + " = " + std::to_string(npc_types_tint_entry.red9x)); + update_values.push_back(columns[27] + " = " + std::to_string(npc_types_tint_entry.grn9x)); + update_values.push_back(columns[28] + " = " + std::to_string(npc_types_tint_entry.blu9x)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + npc_types_tint_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static NpcTypesTint InsertOne( + Database& db, + NpcTypesTint npc_types_tint_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_types_tint_entry.id)); + insert_values.push_back("'" + EscapeString(npc_types_tint_entry.tint_set_name) + "'"); + insert_values.push_back(std::to_string(npc_types_tint_entry.red1h)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn1h)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu1h)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red2c)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn2c)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu2c)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red3a)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn3a)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu3a)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red4b)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn4b)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu4b)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red5g)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn5g)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu5g)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red6l)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn6l)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu6l)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red7f)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn7f)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu7f)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red8x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn8x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu8x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red9x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn9x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu9x)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + npc_types_tint_entry.id = results.LastInsertedID(); + return npc_types_tint_entry; + } + + npc_types_tint_entry = NewEntity(); + + return npc_types_tint_entry; + } + + static int InsertMany( + Database& db, + std::vector npc_types_tint_entries + ) + { + std::vector insert_chunks; + + for (auto &npc_types_tint_entry: npc_types_tint_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(npc_types_tint_entry.id)); + insert_values.push_back("'" + EscapeString(npc_types_tint_entry.tint_set_name) + "'"); + insert_values.push_back(std::to_string(npc_types_tint_entry.red1h)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn1h)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu1h)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red2c)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn2c)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu2c)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red3a)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn3a)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu3a)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red4b)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn4b)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu4b)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red5g)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn5g)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu5g)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red6l)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn6l)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu6l)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red7f)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn7f)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu7f)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red8x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn8x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu8x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.red9x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.grn9x)); + insert_values.push_back(std::to_string(npc_types_tint_entry.blu9x)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcTypesTint entry{}; + + entry.id = atoi(row[0]); + entry.tint_set_name = row[1] ? row[1] : ""; + entry.red1h = atoi(row[2]); + entry.grn1h = atoi(row[3]); + entry.blu1h = atoi(row[4]); + entry.red2c = atoi(row[5]); + entry.grn2c = atoi(row[6]); + entry.blu2c = atoi(row[7]); + entry.red3a = atoi(row[8]); + entry.grn3a = atoi(row[9]); + entry.blu3a = atoi(row[10]); + entry.red4b = atoi(row[11]); + entry.grn4b = atoi(row[12]); + entry.blu4b = atoi(row[13]); + entry.red5g = atoi(row[14]); + entry.grn5g = atoi(row[15]); + entry.blu5g = atoi(row[16]); + entry.red6l = atoi(row[17]); + entry.grn6l = atoi(row[18]); + entry.blu6l = atoi(row[19]); + entry.red7f = atoi(row[20]); + entry.grn7f = atoi(row[21]); + entry.blu7f = atoi(row[22]); + entry.red8x = atoi(row[23]); + entry.grn8x = atoi(row[24]); + entry.blu8x = atoi(row[25]); + entry.red9x = atoi(row[26]); + entry.grn9x = atoi(row[27]); + entry.blu9x = atoi(row[28]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + NpcTypesTint entry{}; + + entry.id = atoi(row[0]); + entry.tint_set_name = row[1] ? row[1] : ""; + entry.red1h = atoi(row[2]); + entry.grn1h = atoi(row[3]); + entry.blu1h = atoi(row[4]); + entry.red2c = atoi(row[5]); + entry.grn2c = atoi(row[6]); + entry.blu2c = atoi(row[7]); + entry.red3a = atoi(row[8]); + entry.grn3a = atoi(row[9]); + entry.blu3a = atoi(row[10]); + entry.red4b = atoi(row[11]); + entry.grn4b = atoi(row[12]); + entry.blu4b = atoi(row[13]); + entry.red5g = atoi(row[14]); + entry.grn5g = atoi(row[15]); + entry.blu5g = atoi(row[16]); + entry.red6l = atoi(row[17]); + entry.grn6l = atoi(row[18]); + entry.blu6l = atoi(row[19]); + entry.red7f = atoi(row[20]); + entry.grn7f = atoi(row[21]); + entry.blu7f = atoi(row[22]); + entry.red8x = atoi(row[23]); + entry.grn8x = atoi(row[24]); + entry.blu8x = atoi(row[25]); + entry.red9x = atoi(row[26]); + entry.grn9x = atoi(row[27]); + entry.blu9x = atoi(row[28]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_NPC_TYPES_TINT_REPOSITORY_H diff --git a/common/repositories/base/base_object_contents_repository.h b/common/repositories/base/base_object_contents_repository.h new file mode 100644 index 000000000..576429ba0 --- /dev/null +++ b/common/repositories/base/base_object_contents_repository.h @@ -0,0 +1,383 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_OBJECT_CONTENTS_REPOSITORY_H +#define EQEMU_BASE_OBJECT_CONTENTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseObjectContentsRepository { +public: + struct ObjectContents { + int zoneid; + int parentid; + int bagidx; + int itemid; + int charges; + std::string droptime; + int augslot1; + int augslot2; + int augslot3; + int augslot4; + int augslot5; + int augslot6; + }; + + static std::string PrimaryKey() + { + return std::string("parentid"); + } + + static std::vector Columns() + { + return { + "zoneid", + "parentid", + "bagidx", + "itemid", + "charges", + "droptime", + "augslot1", + "augslot2", + "augslot3", + "augslot4", + "augslot5", + "augslot6", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("object_contents"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ObjectContents NewEntity() + { + ObjectContents entry{}; + + entry.zoneid = 0; + entry.parentid = 0; + entry.bagidx = 0; + entry.itemid = 0; + entry.charges = 0; + entry.droptime = "0000-00-00 00:00:00"; + entry.augslot1 = 0; + entry.augslot2 = 0; + entry.augslot3 = 0; + entry.augslot4 = 0; + entry.augslot5 = 0; + entry.augslot6 = 0; + + return entry; + } + + static ObjectContents GetObjectContentsEntry( + const std::vector &object_contentss, + int object_contents_id + ) + { + for (auto &object_contents : object_contentss) { + if (object_contents.parentid == object_contents_id) { + return object_contents; + } + } + + return NewEntity(); + } + + static ObjectContents FindOne( + Database& db, + int object_contents_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + object_contents_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ObjectContents entry{}; + + entry.zoneid = atoi(row[0]); + entry.parentid = atoi(row[1]); + entry.bagidx = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.charges = atoi(row[4]); + entry.droptime = row[5] ? row[5] : ""; + entry.augslot1 = atoi(row[6]); + entry.augslot2 = atoi(row[7]); + entry.augslot3 = atoi(row[8]); + entry.augslot4 = atoi(row[9]); + entry.augslot5 = atoi(row[10]); + entry.augslot6 = atoi(row[11]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int object_contents_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + object_contents_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ObjectContents object_contents_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(object_contents_entry.zoneid)); + update_values.push_back(columns[1] + " = " + std::to_string(object_contents_entry.parentid)); + update_values.push_back(columns[2] + " = " + std::to_string(object_contents_entry.bagidx)); + update_values.push_back(columns[3] + " = " + std::to_string(object_contents_entry.itemid)); + update_values.push_back(columns[4] + " = " + std::to_string(object_contents_entry.charges)); + update_values.push_back(columns[5] + " = '" + EscapeString(object_contents_entry.droptime) + "'"); + update_values.push_back(columns[6] + " = " + std::to_string(object_contents_entry.augslot1)); + update_values.push_back(columns[7] + " = " + std::to_string(object_contents_entry.augslot2)); + update_values.push_back(columns[8] + " = " + std::to_string(object_contents_entry.augslot3)); + update_values.push_back(columns[9] + " = " + std::to_string(object_contents_entry.augslot4)); + update_values.push_back(columns[10] + " = " + std::to_string(object_contents_entry.augslot5)); + update_values.push_back(columns[11] + " = " + std::to_string(object_contents_entry.augslot6)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + object_contents_entry.parentid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ObjectContents InsertOne( + Database& db, + ObjectContents object_contents_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(object_contents_entry.zoneid)); + insert_values.push_back(std::to_string(object_contents_entry.parentid)); + insert_values.push_back(std::to_string(object_contents_entry.bagidx)); + insert_values.push_back(std::to_string(object_contents_entry.itemid)); + insert_values.push_back(std::to_string(object_contents_entry.charges)); + insert_values.push_back("'" + EscapeString(object_contents_entry.droptime) + "'"); + insert_values.push_back(std::to_string(object_contents_entry.augslot1)); + insert_values.push_back(std::to_string(object_contents_entry.augslot2)); + insert_values.push_back(std::to_string(object_contents_entry.augslot3)); + insert_values.push_back(std::to_string(object_contents_entry.augslot4)); + insert_values.push_back(std::to_string(object_contents_entry.augslot5)); + insert_values.push_back(std::to_string(object_contents_entry.augslot6)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + object_contents_entry.parentid = results.LastInsertedID(); + return object_contents_entry; + } + + object_contents_entry = NewEntity(); + + return object_contents_entry; + } + + static int InsertMany( + Database& db, + std::vector object_contents_entries + ) + { + std::vector insert_chunks; + + for (auto &object_contents_entry: object_contents_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(object_contents_entry.zoneid)); + insert_values.push_back(std::to_string(object_contents_entry.parentid)); + insert_values.push_back(std::to_string(object_contents_entry.bagidx)); + insert_values.push_back(std::to_string(object_contents_entry.itemid)); + insert_values.push_back(std::to_string(object_contents_entry.charges)); + insert_values.push_back("'" + EscapeString(object_contents_entry.droptime) + "'"); + insert_values.push_back(std::to_string(object_contents_entry.augslot1)); + insert_values.push_back(std::to_string(object_contents_entry.augslot2)); + insert_values.push_back(std::to_string(object_contents_entry.augslot3)); + insert_values.push_back(std::to_string(object_contents_entry.augslot4)); + insert_values.push_back(std::to_string(object_contents_entry.augslot5)); + insert_values.push_back(std::to_string(object_contents_entry.augslot6)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ObjectContents entry{}; + + entry.zoneid = atoi(row[0]); + entry.parentid = atoi(row[1]); + entry.bagidx = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.charges = atoi(row[4]); + entry.droptime = row[5] ? row[5] : ""; + entry.augslot1 = atoi(row[6]); + entry.augslot2 = atoi(row[7]); + entry.augslot3 = atoi(row[8]); + entry.augslot4 = atoi(row[9]); + entry.augslot5 = atoi(row[10]); + entry.augslot6 = atoi(row[11]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ObjectContents entry{}; + + entry.zoneid = atoi(row[0]); + entry.parentid = atoi(row[1]); + entry.bagidx = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.charges = atoi(row[4]); + entry.droptime = row[5] ? row[5] : ""; + entry.augslot1 = atoi(row[6]); + entry.augslot2 = atoi(row[7]); + entry.augslot3 = atoi(row[8]); + entry.augslot4 = atoi(row[9]); + entry.augslot5 = atoi(row[10]); + entry.augslot6 = atoi(row[11]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_OBJECT_CONTENTS_REPOSITORY_H diff --git a/common/repositories/base/base_object_repository.h b/common/repositories/base/base_object_repository.h new file mode 100644 index 000000000..a572ed712 --- /dev/null +++ b/common/repositories/base/base_object_repository.h @@ -0,0 +1,544 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_OBJECT_REPOSITORY_H +#define EQEMU_BASE_OBJECT_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseObjectRepository { +public: + struct Object { + int id; + int zoneid; + int version; + float xpos; + float ypos; + float zpos; + float heading; + int itemid; + int charges; + std::string objectname; + int type; + int icon; + int unknown08; + int unknown10; + int unknown20; + int unknown24; + int unknown60; + int unknown64; + int unknown68; + int unknown72; + int unknown76; + int unknown84; + float size; + float tilt_x; + float tilt_y; + std::string display_name; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zoneid", + "version", + "xpos", + "ypos", + "zpos", + "heading", + "itemid", + "charges", + "objectname", + "type", + "icon", + "unknown08", + "unknown10", + "unknown20", + "unknown24", + "unknown60", + "unknown64", + "unknown68", + "unknown72", + "unknown76", + "unknown84", + "size", + "tilt_x", + "tilt_y", + "display_name", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("object"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Object NewEntity() + { + Object entry{}; + + entry.id = 0; + entry.zoneid = 0; + entry.version = 0; + entry.xpos = 0; + entry.ypos = 0; + entry.zpos = 0; + entry.heading = 0; + entry.itemid = 0; + entry.charges = 0; + entry.objectname = ""; + entry.type = 0; + entry.icon = 0; + entry.unknown08 = 0; + entry.unknown10 = 0; + entry.unknown20 = 0; + entry.unknown24 = 0; + entry.unknown60 = 0; + entry.unknown64 = 0; + entry.unknown68 = 0; + entry.unknown72 = 0; + entry.unknown76 = 0; + entry.unknown84 = 0; + entry.size = 100; + entry.tilt_x = 0; + entry.tilt_y = 0; + entry.display_name = ""; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Object GetObjectEntry( + const std::vector &objects, + int object_id + ) + { + for (auto &object : objects) { + if (object.id == object_id) { + return object; + } + } + + return NewEntity(); + } + + static Object FindOne( + Database& db, + int object_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + object_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Object entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.version = atoi(row[2]); + entry.xpos = static_cast(atof(row[3])); + entry.ypos = static_cast(atof(row[4])); + entry.zpos = static_cast(atof(row[5])); + entry.heading = static_cast(atof(row[6])); + entry.itemid = atoi(row[7]); + entry.charges = atoi(row[8]); + entry.objectname = row[9] ? row[9] : ""; + entry.type = atoi(row[10]); + entry.icon = atoi(row[11]); + entry.unknown08 = atoi(row[12]); + entry.unknown10 = atoi(row[13]); + entry.unknown20 = atoi(row[14]); + entry.unknown24 = atoi(row[15]); + entry.unknown60 = atoi(row[16]); + entry.unknown64 = atoi(row[17]); + entry.unknown68 = atoi(row[18]); + entry.unknown72 = atoi(row[19]); + entry.unknown76 = atoi(row[20]); + entry.unknown84 = atoi(row[21]); + entry.size = static_cast(atof(row[22])); + entry.tilt_x = static_cast(atof(row[23])); + entry.tilt_y = static_cast(atof(row[24])); + entry.display_name = row[25] ? row[25] : ""; + entry.min_expansion = atoi(row[26]); + entry.max_expansion = atoi(row[27]); + entry.content_flags = row[28] ? row[28] : ""; + entry.content_flags_disabled = row[29] ? row[29] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int object_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + object_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Object object_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(object_entry.zoneid)); + update_values.push_back(columns[2] + " = " + std::to_string(object_entry.version)); + update_values.push_back(columns[3] + " = " + std::to_string(object_entry.xpos)); + update_values.push_back(columns[4] + " = " + std::to_string(object_entry.ypos)); + update_values.push_back(columns[5] + " = " + std::to_string(object_entry.zpos)); + update_values.push_back(columns[6] + " = " + std::to_string(object_entry.heading)); + update_values.push_back(columns[7] + " = " + std::to_string(object_entry.itemid)); + update_values.push_back(columns[8] + " = " + std::to_string(object_entry.charges)); + update_values.push_back(columns[9] + " = '" + EscapeString(object_entry.objectname) + "'"); + update_values.push_back(columns[10] + " = " + std::to_string(object_entry.type)); + update_values.push_back(columns[11] + " = " + std::to_string(object_entry.icon)); + update_values.push_back(columns[12] + " = " + std::to_string(object_entry.unknown08)); + update_values.push_back(columns[13] + " = " + std::to_string(object_entry.unknown10)); + update_values.push_back(columns[14] + " = " + std::to_string(object_entry.unknown20)); + update_values.push_back(columns[15] + " = " + std::to_string(object_entry.unknown24)); + update_values.push_back(columns[16] + " = " + std::to_string(object_entry.unknown60)); + update_values.push_back(columns[17] + " = " + std::to_string(object_entry.unknown64)); + update_values.push_back(columns[18] + " = " + std::to_string(object_entry.unknown68)); + update_values.push_back(columns[19] + " = " + std::to_string(object_entry.unknown72)); + update_values.push_back(columns[20] + " = " + std::to_string(object_entry.unknown76)); + update_values.push_back(columns[21] + " = " + std::to_string(object_entry.unknown84)); + update_values.push_back(columns[22] + " = " + std::to_string(object_entry.size)); + update_values.push_back(columns[23] + " = " + std::to_string(object_entry.tilt_x)); + update_values.push_back(columns[24] + " = " + std::to_string(object_entry.tilt_y)); + update_values.push_back(columns[25] + " = '" + EscapeString(object_entry.display_name) + "'"); + update_values.push_back(columns[26] + " = " + std::to_string(object_entry.min_expansion)); + update_values.push_back(columns[27] + " = " + std::to_string(object_entry.max_expansion)); + update_values.push_back(columns[28] + " = '" + EscapeString(object_entry.content_flags) + "'"); + update_values.push_back(columns[29] + " = '" + EscapeString(object_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + object_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Object InsertOne( + Database& db, + Object object_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(object_entry.id)); + insert_values.push_back(std::to_string(object_entry.zoneid)); + insert_values.push_back(std::to_string(object_entry.version)); + insert_values.push_back(std::to_string(object_entry.xpos)); + insert_values.push_back(std::to_string(object_entry.ypos)); + insert_values.push_back(std::to_string(object_entry.zpos)); + insert_values.push_back(std::to_string(object_entry.heading)); + insert_values.push_back(std::to_string(object_entry.itemid)); + insert_values.push_back(std::to_string(object_entry.charges)); + insert_values.push_back("'" + EscapeString(object_entry.objectname) + "'"); + insert_values.push_back(std::to_string(object_entry.type)); + insert_values.push_back(std::to_string(object_entry.icon)); + insert_values.push_back(std::to_string(object_entry.unknown08)); + insert_values.push_back(std::to_string(object_entry.unknown10)); + insert_values.push_back(std::to_string(object_entry.unknown20)); + insert_values.push_back(std::to_string(object_entry.unknown24)); + insert_values.push_back(std::to_string(object_entry.unknown60)); + insert_values.push_back(std::to_string(object_entry.unknown64)); + insert_values.push_back(std::to_string(object_entry.unknown68)); + insert_values.push_back(std::to_string(object_entry.unknown72)); + insert_values.push_back(std::to_string(object_entry.unknown76)); + insert_values.push_back(std::to_string(object_entry.unknown84)); + insert_values.push_back(std::to_string(object_entry.size)); + insert_values.push_back(std::to_string(object_entry.tilt_x)); + insert_values.push_back(std::to_string(object_entry.tilt_y)); + insert_values.push_back("'" + EscapeString(object_entry.display_name) + "'"); + insert_values.push_back(std::to_string(object_entry.min_expansion)); + insert_values.push_back(std::to_string(object_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(object_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(object_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + object_entry.id = results.LastInsertedID(); + return object_entry; + } + + object_entry = NewEntity(); + + return object_entry; + } + + static int InsertMany( + Database& db, + std::vector object_entries + ) + { + std::vector insert_chunks; + + for (auto &object_entry: object_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(object_entry.id)); + insert_values.push_back(std::to_string(object_entry.zoneid)); + insert_values.push_back(std::to_string(object_entry.version)); + insert_values.push_back(std::to_string(object_entry.xpos)); + insert_values.push_back(std::to_string(object_entry.ypos)); + insert_values.push_back(std::to_string(object_entry.zpos)); + insert_values.push_back(std::to_string(object_entry.heading)); + insert_values.push_back(std::to_string(object_entry.itemid)); + insert_values.push_back(std::to_string(object_entry.charges)); + insert_values.push_back("'" + EscapeString(object_entry.objectname) + "'"); + insert_values.push_back(std::to_string(object_entry.type)); + insert_values.push_back(std::to_string(object_entry.icon)); + insert_values.push_back(std::to_string(object_entry.unknown08)); + insert_values.push_back(std::to_string(object_entry.unknown10)); + insert_values.push_back(std::to_string(object_entry.unknown20)); + insert_values.push_back(std::to_string(object_entry.unknown24)); + insert_values.push_back(std::to_string(object_entry.unknown60)); + insert_values.push_back(std::to_string(object_entry.unknown64)); + insert_values.push_back(std::to_string(object_entry.unknown68)); + insert_values.push_back(std::to_string(object_entry.unknown72)); + insert_values.push_back(std::to_string(object_entry.unknown76)); + insert_values.push_back(std::to_string(object_entry.unknown84)); + insert_values.push_back(std::to_string(object_entry.size)); + insert_values.push_back(std::to_string(object_entry.tilt_x)); + insert_values.push_back(std::to_string(object_entry.tilt_y)); + insert_values.push_back("'" + EscapeString(object_entry.display_name) + "'"); + insert_values.push_back(std::to_string(object_entry.min_expansion)); + insert_values.push_back(std::to_string(object_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(object_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(object_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Object entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.version = atoi(row[2]); + entry.xpos = static_cast(atof(row[3])); + entry.ypos = static_cast(atof(row[4])); + entry.zpos = static_cast(atof(row[5])); + entry.heading = static_cast(atof(row[6])); + entry.itemid = atoi(row[7]); + entry.charges = atoi(row[8]); + entry.objectname = row[9] ? row[9] : ""; + entry.type = atoi(row[10]); + entry.icon = atoi(row[11]); + entry.unknown08 = atoi(row[12]); + entry.unknown10 = atoi(row[13]); + entry.unknown20 = atoi(row[14]); + entry.unknown24 = atoi(row[15]); + entry.unknown60 = atoi(row[16]); + entry.unknown64 = atoi(row[17]); + entry.unknown68 = atoi(row[18]); + entry.unknown72 = atoi(row[19]); + entry.unknown76 = atoi(row[20]); + entry.unknown84 = atoi(row[21]); + entry.size = static_cast(atof(row[22])); + entry.tilt_x = static_cast(atof(row[23])); + entry.tilt_y = static_cast(atof(row[24])); + entry.display_name = row[25] ? row[25] : ""; + entry.min_expansion = atoi(row[26]); + entry.max_expansion = atoi(row[27]); + entry.content_flags = row[28] ? row[28] : ""; + entry.content_flags_disabled = row[29] ? row[29] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Object entry{}; + + entry.id = atoi(row[0]); + entry.zoneid = atoi(row[1]); + entry.version = atoi(row[2]); + entry.xpos = static_cast(atof(row[3])); + entry.ypos = static_cast(atof(row[4])); + entry.zpos = static_cast(atof(row[5])); + entry.heading = static_cast(atof(row[6])); + entry.itemid = atoi(row[7]); + entry.charges = atoi(row[8]); + entry.objectname = row[9] ? row[9] : ""; + entry.type = atoi(row[10]); + entry.icon = atoi(row[11]); + entry.unknown08 = atoi(row[12]); + entry.unknown10 = atoi(row[13]); + entry.unknown20 = atoi(row[14]); + entry.unknown24 = atoi(row[15]); + entry.unknown60 = atoi(row[16]); + entry.unknown64 = atoi(row[17]); + entry.unknown68 = atoi(row[18]); + entry.unknown72 = atoi(row[19]); + entry.unknown76 = atoi(row[20]); + entry.unknown84 = atoi(row[21]); + entry.size = static_cast(atof(row[22])); + entry.tilt_x = static_cast(atof(row[23])); + entry.tilt_y = static_cast(atof(row[24])); + entry.display_name = row[25] ? row[25] : ""; + entry.min_expansion = atoi(row[26]); + entry.max_expansion = atoi(row[27]); + entry.content_flags = row[28] ? row[28] : ""; + entry.content_flags_disabled = row[29] ? row[29] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_OBJECT_REPOSITORY_H diff --git a/common/repositories/base/base_perl_event_export_settings_repository.h b/common/repositories/base/base_perl_event_export_settings_repository.h new file mode 100644 index 000000000..d58084463 --- /dev/null +++ b/common/repositories/base/base_perl_event_export_settings_repository.h @@ -0,0 +1,338 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PERL_EVENT_EXPORT_SETTINGS_REPOSITORY_H +#define EQEMU_BASE_PERL_EVENT_EXPORT_SETTINGS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BasePerlEventExportSettingsRepository { +public: + struct PerlEventExportSettings { + int event_id; + std::string event_description; + int export_qglobals; + int export_mob; + int export_zone; + int export_item; + int export_event; + }; + + static std::string PrimaryKey() + { + return std::string("event_id"); + } + + static std::vector Columns() + { + return { + "event_id", + "event_description", + "export_qglobals", + "export_mob", + "export_zone", + "export_item", + "export_event", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("perl_event_export_settings"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static PerlEventExportSettings NewEntity() + { + PerlEventExportSettings entry{}; + + entry.event_id = 0; + entry.event_description = ""; + entry.export_qglobals = 0; + entry.export_mob = 0; + entry.export_zone = 0; + entry.export_item = 0; + entry.export_event = 0; + + return entry; + } + + static PerlEventExportSettings GetPerlEventExportSettingsEntry( + const std::vector &perl_event_export_settingss, + int perl_event_export_settings_id + ) + { + for (auto &perl_event_export_settings : perl_event_export_settingss) { + if (perl_event_export_settings.event_id == perl_event_export_settings_id) { + return perl_event_export_settings; + } + } + + return NewEntity(); + } + + static PerlEventExportSettings FindOne( + Database& db, + int perl_event_export_settings_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + perl_event_export_settings_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + PerlEventExportSettings entry{}; + + entry.event_id = atoi(row[0]); + entry.event_description = row[1] ? row[1] : ""; + entry.export_qglobals = atoi(row[2]); + entry.export_mob = atoi(row[3]); + entry.export_zone = atoi(row[4]); + entry.export_item = atoi(row[5]); + entry.export_event = atoi(row[6]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int perl_event_export_settings_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + perl_event_export_settings_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + PerlEventExportSettings perl_event_export_settings_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(perl_event_export_settings_entry.event_id)); + update_values.push_back(columns[1] + " = '" + EscapeString(perl_event_export_settings_entry.event_description) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(perl_event_export_settings_entry.export_qglobals)); + update_values.push_back(columns[3] + " = " + std::to_string(perl_event_export_settings_entry.export_mob)); + update_values.push_back(columns[4] + " = " + std::to_string(perl_event_export_settings_entry.export_zone)); + update_values.push_back(columns[5] + " = " + std::to_string(perl_event_export_settings_entry.export_item)); + update_values.push_back(columns[6] + " = " + std::to_string(perl_event_export_settings_entry.export_event)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + perl_event_export_settings_entry.event_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static PerlEventExportSettings InsertOne( + Database& db, + PerlEventExportSettings perl_event_export_settings_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(perl_event_export_settings_entry.event_id)); + insert_values.push_back("'" + EscapeString(perl_event_export_settings_entry.event_description) + "'"); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_qglobals)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_mob)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_zone)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_item)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_event)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + perl_event_export_settings_entry.event_id = results.LastInsertedID(); + return perl_event_export_settings_entry; + } + + perl_event_export_settings_entry = NewEntity(); + + return perl_event_export_settings_entry; + } + + static int InsertMany( + Database& db, + std::vector perl_event_export_settings_entries + ) + { + std::vector insert_chunks; + + for (auto &perl_event_export_settings_entry: perl_event_export_settings_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(perl_event_export_settings_entry.event_id)); + insert_values.push_back("'" + EscapeString(perl_event_export_settings_entry.event_description) + "'"); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_qglobals)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_mob)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_zone)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_item)); + insert_values.push_back(std::to_string(perl_event_export_settings_entry.export_event)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PerlEventExportSettings entry{}; + + entry.event_id = atoi(row[0]); + entry.event_description = row[1] ? row[1] : ""; + entry.export_qglobals = atoi(row[2]); + entry.export_mob = atoi(row[3]); + entry.export_zone = atoi(row[4]); + entry.export_item = atoi(row[5]); + entry.export_event = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PerlEventExportSettings entry{}; + + entry.event_id = atoi(row[0]); + entry.event_description = row[1] ? row[1] : ""; + entry.export_qglobals = atoi(row[2]); + entry.export_mob = atoi(row[3]); + entry.export_zone = atoi(row[4]); + entry.export_item = atoi(row[5]); + entry.export_event = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PERL_EVENT_EXPORT_SETTINGS_REPOSITORY_H diff --git a/common/repositories/base/base_petitions_repository.h b/common/repositories/base/base_petitions_repository.h new file mode 100644 index 000000000..30dd9feaa --- /dev/null +++ b/common/repositories/base/base_petitions_repository.h @@ -0,0 +1,418 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PETITIONS_REPOSITORY_H +#define EQEMU_BASE_PETITIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BasePetitionsRepository { +public: + struct Petitions { + int dib; + int petid; + std::string charname; + std::string accountname; + std::string lastgm; + std::string petitiontext; + std::string gmtext; + std::string zone; + int urgency; + int charclass; + int charrace; + int charlevel; + int checkouts; + int unavailables; + int ischeckedout; + int senttime; + }; + + static std::string PrimaryKey() + { + return std::string("dib"); + } + + static std::vector Columns() + { + return { + "dib", + "petid", + "charname", + "accountname", + "lastgm", + "petitiontext", + "gmtext", + "zone", + "urgency", + "charclass", + "charrace", + "charlevel", + "checkouts", + "unavailables", + "ischeckedout", + "senttime", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("petitions"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Petitions NewEntity() + { + Petitions entry{}; + + entry.dib = 0; + entry.petid = 0; + entry.charname = ""; + entry.accountname = ""; + entry.lastgm = ""; + entry.petitiontext = ""; + entry.gmtext = ""; + entry.zone = ""; + entry.urgency = 0; + entry.charclass = 0; + entry.charrace = 0; + entry.charlevel = 0; + entry.checkouts = 0; + entry.unavailables = 0; + entry.ischeckedout = 0; + entry.senttime = 0; + + return entry; + } + + static Petitions GetPetitionsEntry( + const std::vector &petitionss, + int petitions_id + ) + { + for (auto &petitions : petitionss) { + if (petitions.dib == petitions_id) { + return petitions; + } + } + + return NewEntity(); + } + + static Petitions FindOne( + Database& db, + int petitions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + petitions_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Petitions entry{}; + + entry.dib = atoi(row[0]); + entry.petid = atoi(row[1]); + entry.charname = row[2] ? row[2] : ""; + entry.accountname = row[3] ? row[3] : ""; + entry.lastgm = row[4] ? row[4] : ""; + entry.petitiontext = row[5] ? row[5] : ""; + entry.gmtext = row[6] ? row[6] : ""; + entry.zone = row[7] ? row[7] : ""; + entry.urgency = atoi(row[8]); + entry.charclass = atoi(row[9]); + entry.charrace = atoi(row[10]); + entry.charlevel = atoi(row[11]); + entry.checkouts = atoi(row[12]); + entry.unavailables = atoi(row[13]); + entry.ischeckedout = atoi(row[14]); + entry.senttime = atoi(row[15]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int petitions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + petitions_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Petitions petitions_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(petitions_entry.petid)); + update_values.push_back(columns[2] + " = '" + EscapeString(petitions_entry.charname) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(petitions_entry.accountname) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(petitions_entry.lastgm) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(petitions_entry.petitiontext) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(petitions_entry.gmtext) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(petitions_entry.zone) + "'"); + update_values.push_back(columns[8] + " = " + std::to_string(petitions_entry.urgency)); + update_values.push_back(columns[9] + " = " + std::to_string(petitions_entry.charclass)); + update_values.push_back(columns[10] + " = " + std::to_string(petitions_entry.charrace)); + update_values.push_back(columns[11] + " = " + std::to_string(petitions_entry.charlevel)); + update_values.push_back(columns[12] + " = " + std::to_string(petitions_entry.checkouts)); + update_values.push_back(columns[13] + " = " + std::to_string(petitions_entry.unavailables)); + update_values.push_back(columns[14] + " = " + std::to_string(petitions_entry.ischeckedout)); + update_values.push_back(columns[15] + " = " + std::to_string(petitions_entry.senttime)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + petitions_entry.dib + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Petitions InsertOne( + Database& db, + Petitions petitions_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(petitions_entry.dib)); + insert_values.push_back(std::to_string(petitions_entry.petid)); + insert_values.push_back("'" + EscapeString(petitions_entry.charname) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.accountname) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.lastgm) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.petitiontext) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.gmtext) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.zone) + "'"); + insert_values.push_back(std::to_string(petitions_entry.urgency)); + insert_values.push_back(std::to_string(petitions_entry.charclass)); + insert_values.push_back(std::to_string(petitions_entry.charrace)); + insert_values.push_back(std::to_string(petitions_entry.charlevel)); + insert_values.push_back(std::to_string(petitions_entry.checkouts)); + insert_values.push_back(std::to_string(petitions_entry.unavailables)); + insert_values.push_back(std::to_string(petitions_entry.ischeckedout)); + insert_values.push_back(std::to_string(petitions_entry.senttime)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + petitions_entry.dib = results.LastInsertedID(); + return petitions_entry; + } + + petitions_entry = NewEntity(); + + return petitions_entry; + } + + static int InsertMany( + Database& db, + std::vector petitions_entries + ) + { + std::vector insert_chunks; + + for (auto &petitions_entry: petitions_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(petitions_entry.dib)); + insert_values.push_back(std::to_string(petitions_entry.petid)); + insert_values.push_back("'" + EscapeString(petitions_entry.charname) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.accountname) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.lastgm) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.petitiontext) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.gmtext) + "'"); + insert_values.push_back("'" + EscapeString(petitions_entry.zone) + "'"); + insert_values.push_back(std::to_string(petitions_entry.urgency)); + insert_values.push_back(std::to_string(petitions_entry.charclass)); + insert_values.push_back(std::to_string(petitions_entry.charrace)); + insert_values.push_back(std::to_string(petitions_entry.charlevel)); + insert_values.push_back(std::to_string(petitions_entry.checkouts)); + insert_values.push_back(std::to_string(petitions_entry.unavailables)); + insert_values.push_back(std::to_string(petitions_entry.ischeckedout)); + insert_values.push_back(std::to_string(petitions_entry.senttime)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Petitions entry{}; + + entry.dib = atoi(row[0]); + entry.petid = atoi(row[1]); + entry.charname = row[2] ? row[2] : ""; + entry.accountname = row[3] ? row[3] : ""; + entry.lastgm = row[4] ? row[4] : ""; + entry.petitiontext = row[5] ? row[5] : ""; + entry.gmtext = row[6] ? row[6] : ""; + entry.zone = row[7] ? row[7] : ""; + entry.urgency = atoi(row[8]); + entry.charclass = atoi(row[9]); + entry.charrace = atoi(row[10]); + entry.charlevel = atoi(row[11]); + entry.checkouts = atoi(row[12]); + entry.unavailables = atoi(row[13]); + entry.ischeckedout = atoi(row[14]); + entry.senttime = atoi(row[15]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Petitions entry{}; + + entry.dib = atoi(row[0]); + entry.petid = atoi(row[1]); + entry.charname = row[2] ? row[2] : ""; + entry.accountname = row[3] ? row[3] : ""; + entry.lastgm = row[4] ? row[4] : ""; + entry.petitiontext = row[5] ? row[5] : ""; + entry.gmtext = row[6] ? row[6] : ""; + entry.zone = row[7] ? row[7] : ""; + entry.urgency = atoi(row[8]); + entry.charclass = atoi(row[9]); + entry.charrace = atoi(row[10]); + entry.charlevel = atoi(row[11]); + entry.checkouts = atoi(row[12]); + entry.unavailables = atoi(row[13]); + entry.ischeckedout = atoi(row[14]); + entry.senttime = atoi(row[15]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PETITIONS_REPOSITORY_H diff --git a/common/repositories/base/base_pets_equipmentset_entries_repository.h b/common/repositories/base/base_pets_equipmentset_entries_repository.h new file mode 100644 index 000000000..ecd9b2643 --- /dev/null +++ b/common/repositories/base/base_pets_equipmentset_entries_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PETS_EQUIPMENTSET_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_PETS_EQUIPMENTSET_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BasePetsEquipmentsetEntriesRepository { +public: + struct PetsEquipmentsetEntries { + int set_id; + int slot; + int item_id; + }; + + static std::string PrimaryKey() + { + return std::string("set_id"); + } + + static std::vector Columns() + { + return { + "set_id", + "slot", + "item_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("pets_equipmentset_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static PetsEquipmentsetEntries NewEntity() + { + PetsEquipmentsetEntries entry{}; + + entry.set_id = 0; + entry.slot = 0; + entry.item_id = 0; + + return entry; + } + + static PetsEquipmentsetEntries GetPetsEquipmentsetEntriesEntry( + const std::vector &pets_equipmentset_entriess, + int pets_equipmentset_entries_id + ) + { + for (auto &pets_equipmentset_entries : pets_equipmentset_entriess) { + if (pets_equipmentset_entries.set_id == pets_equipmentset_entries_id) { + return pets_equipmentset_entries; + } + } + + return NewEntity(); + } + + static PetsEquipmentsetEntries FindOne( + Database& db, + int pets_equipmentset_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + pets_equipmentset_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + PetsEquipmentsetEntries entry{}; + + entry.set_id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.item_id = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int pets_equipmentset_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + pets_equipmentset_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + PetsEquipmentsetEntries pets_equipmentset_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(pets_equipmentset_entries_entry.set_id)); + update_values.push_back(columns[1] + " = " + std::to_string(pets_equipmentset_entries_entry.slot)); + update_values.push_back(columns[2] + " = " + std::to_string(pets_equipmentset_entries_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + pets_equipmentset_entries_entry.set_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static PetsEquipmentsetEntries InsertOne( + Database& db, + PetsEquipmentsetEntries pets_equipmentset_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.set_id)); + insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.slot)); + insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + pets_equipmentset_entries_entry.set_id = results.LastInsertedID(); + return pets_equipmentset_entries_entry; + } + + pets_equipmentset_entries_entry = NewEntity(); + + return pets_equipmentset_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector pets_equipmentset_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &pets_equipmentset_entries_entry: pets_equipmentset_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.set_id)); + insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.slot)); + insert_values.push_back(std::to_string(pets_equipmentset_entries_entry.item_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PetsEquipmentsetEntries entry{}; + + entry.set_id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.item_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PetsEquipmentsetEntries entry{}; + + entry.set_id = atoi(row[0]); + entry.slot = atoi(row[1]); + entry.item_id = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PETS_EQUIPMENTSET_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_pets_equipmentset_repository.h b/common/repositories/base/base_pets_equipmentset_repository.h new file mode 100644 index 000000000..0f27a879f --- /dev/null +++ b/common/repositories/base/base_pets_equipmentset_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PETS_EQUIPMENTSET_REPOSITORY_H +#define EQEMU_BASE_PETS_EQUIPMENTSET_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BasePetsEquipmentsetRepository { +public: + struct PetsEquipmentset { + int set_id; + std::string setname; + int nested_set; + }; + + static std::string PrimaryKey() + { + return std::string("set_id"); + } + + static std::vector Columns() + { + return { + "set_id", + "setname", + "nested_set", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("pets_equipmentset"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static PetsEquipmentset NewEntity() + { + PetsEquipmentset entry{}; + + entry.set_id = 0; + entry.setname = ""; + entry.nested_set = -1; + + return entry; + } + + static PetsEquipmentset GetPetsEquipmentsetEntry( + const std::vector &pets_equipmentsets, + int pets_equipmentset_id + ) + { + for (auto &pets_equipmentset : pets_equipmentsets) { + if (pets_equipmentset.set_id == pets_equipmentset_id) { + return pets_equipmentset; + } + } + + return NewEntity(); + } + + static PetsEquipmentset FindOne( + Database& db, + int pets_equipmentset_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + pets_equipmentset_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + PetsEquipmentset entry{}; + + entry.set_id = atoi(row[0]); + entry.setname = row[1] ? row[1] : ""; + entry.nested_set = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int pets_equipmentset_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + pets_equipmentset_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + PetsEquipmentset pets_equipmentset_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(pets_equipmentset_entry.set_id)); + update_values.push_back(columns[1] + " = '" + EscapeString(pets_equipmentset_entry.setname) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(pets_equipmentset_entry.nested_set)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + pets_equipmentset_entry.set_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static PetsEquipmentset InsertOne( + Database& db, + PetsEquipmentset pets_equipmentset_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(pets_equipmentset_entry.set_id)); + insert_values.push_back("'" + EscapeString(pets_equipmentset_entry.setname) + "'"); + insert_values.push_back(std::to_string(pets_equipmentset_entry.nested_set)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + pets_equipmentset_entry.set_id = results.LastInsertedID(); + return pets_equipmentset_entry; + } + + pets_equipmentset_entry = NewEntity(); + + return pets_equipmentset_entry; + } + + static int InsertMany( + Database& db, + std::vector pets_equipmentset_entries + ) + { + std::vector insert_chunks; + + for (auto &pets_equipmentset_entry: pets_equipmentset_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(pets_equipmentset_entry.set_id)); + insert_values.push_back("'" + EscapeString(pets_equipmentset_entry.setname) + "'"); + insert_values.push_back(std::to_string(pets_equipmentset_entry.nested_set)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PetsEquipmentset entry{}; + + entry.set_id = atoi(row[0]); + entry.setname = row[1] ? row[1] : ""; + entry.nested_set = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PetsEquipmentset entry{}; + + entry.set_id = atoi(row[0]); + entry.setname = row[1] ? row[1] : ""; + entry.nested_set = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PETS_EQUIPMENTSET_REPOSITORY_H diff --git a/common/repositories/base/base_pets_repository.h b/common/repositories/base/base_pets_repository.h new file mode 100644 index 000000000..75681e6c4 --- /dev/null +++ b/common/repositories/base/base_pets_repository.h @@ -0,0 +1,347 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PETS_REPOSITORY_H +#define EQEMU_BASE_PETS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BasePetsRepository { +public: + struct Pets { + std::string type; + int petpower; + int npcID; + int temp; + int petcontrol; + int petnaming; + int monsterflag; + int equipmentset; + }; + + static std::string PrimaryKey() + { + return std::string("petpower"); + } + + static std::vector Columns() + { + return { + "type", + "petpower", + "npcID", + "temp", + "petcontrol", + "petnaming", + "monsterflag", + "equipmentset", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("pets"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Pets NewEntity() + { + Pets entry{}; + + entry.type = ""; + entry.petpower = 0; + entry.npcID = 0; + entry.temp = 0; + entry.petcontrol = 0; + entry.petnaming = 0; + entry.monsterflag = 0; + entry.equipmentset = -1; + + return entry; + } + + static Pets GetPetsEntry( + const std::vector &petss, + int pets_id + ) + { + for (auto &pets : petss) { + if (pets.petpower == pets_id) { + return pets; + } + } + + return NewEntity(); + } + + static Pets FindOne( + Database& db, + int pets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + pets_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Pets entry{}; + + entry.type = row[0] ? row[0] : ""; + entry.petpower = atoi(row[1]); + entry.npcID = atoi(row[2]); + entry.temp = atoi(row[3]); + entry.petcontrol = atoi(row[4]); + entry.petnaming = atoi(row[5]); + entry.monsterflag = atoi(row[6]); + entry.equipmentset = atoi(row[7]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int pets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + pets_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Pets pets_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(pets_entry.type) + "'"); + update_values.push_back(columns[1] + " = " + std::to_string(pets_entry.petpower)); + update_values.push_back(columns[2] + " = " + std::to_string(pets_entry.npcID)); + update_values.push_back(columns[3] + " = " + std::to_string(pets_entry.temp)); + update_values.push_back(columns[4] + " = " + std::to_string(pets_entry.petcontrol)); + update_values.push_back(columns[5] + " = " + std::to_string(pets_entry.petnaming)); + update_values.push_back(columns[6] + " = " + std::to_string(pets_entry.monsterflag)); + update_values.push_back(columns[7] + " = " + std::to_string(pets_entry.equipmentset)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + pets_entry.petpower + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Pets InsertOne( + Database& db, + Pets pets_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(pets_entry.type) + "'"); + insert_values.push_back(std::to_string(pets_entry.petpower)); + insert_values.push_back(std::to_string(pets_entry.npcID)); + insert_values.push_back(std::to_string(pets_entry.temp)); + insert_values.push_back(std::to_string(pets_entry.petcontrol)); + insert_values.push_back(std::to_string(pets_entry.petnaming)); + insert_values.push_back(std::to_string(pets_entry.monsterflag)); + insert_values.push_back(std::to_string(pets_entry.equipmentset)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + pets_entry.petpower = results.LastInsertedID(); + return pets_entry; + } + + pets_entry = NewEntity(); + + return pets_entry; + } + + static int InsertMany( + Database& db, + std::vector pets_entries + ) + { + std::vector insert_chunks; + + for (auto &pets_entry: pets_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(pets_entry.type) + "'"); + insert_values.push_back(std::to_string(pets_entry.petpower)); + insert_values.push_back(std::to_string(pets_entry.npcID)); + insert_values.push_back(std::to_string(pets_entry.temp)); + insert_values.push_back(std::to_string(pets_entry.petcontrol)); + insert_values.push_back(std::to_string(pets_entry.petnaming)); + insert_values.push_back(std::to_string(pets_entry.monsterflag)); + insert_values.push_back(std::to_string(pets_entry.equipmentset)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Pets entry{}; + + entry.type = row[0] ? row[0] : ""; + entry.petpower = atoi(row[1]); + entry.npcID = atoi(row[2]); + entry.temp = atoi(row[3]); + entry.petcontrol = atoi(row[4]); + entry.petnaming = atoi(row[5]); + entry.monsterflag = atoi(row[6]); + entry.equipmentset = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Pets entry{}; + + entry.type = row[0] ? row[0] : ""; + entry.petpower = atoi(row[1]); + entry.npcID = atoi(row[2]); + entry.temp = atoi(row[3]); + entry.petcontrol = atoi(row[4]); + entry.petnaming = atoi(row[5]); + entry.monsterflag = atoi(row[6]); + entry.equipmentset = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PETS_REPOSITORY_H diff --git a/common/repositories/base/base_player_titlesets_repository.h b/common/repositories/base/base_player_titlesets_repository.h new file mode 100644 index 000000000..12c800953 --- /dev/null +++ b/common/repositories/base/base_player_titlesets_repository.h @@ -0,0 +1,301 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PLAYER_TITLESETS_REPOSITORY_H +#define EQEMU_BASE_PLAYER_TITLESETS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BasePlayerTitlesetsRepository { +public: + struct PlayerTitlesets { + int id; + int char_id; + int title_set; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "char_id", + "title_set", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("player_titlesets"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static PlayerTitlesets NewEntity() + { + PlayerTitlesets entry{}; + + entry.id = 0; + entry.char_id = 0; + entry.title_set = 0; + + return entry; + } + + static PlayerTitlesets GetPlayerTitlesetsEntry( + const std::vector &player_titlesetss, + int player_titlesets_id + ) + { + for (auto &player_titlesets : player_titlesetss) { + if (player_titlesets.id == player_titlesets_id) { + return player_titlesets; + } + } + + return NewEntity(); + } + + static PlayerTitlesets FindOne( + Database& db, + int player_titlesets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + player_titlesets_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + PlayerTitlesets entry{}; + + entry.id = atoi(row[0]); + entry.char_id = atoi(row[1]); + entry.title_set = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int player_titlesets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + player_titlesets_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + PlayerTitlesets player_titlesets_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(player_titlesets_entry.char_id)); + update_values.push_back(columns[2] + " = " + std::to_string(player_titlesets_entry.title_set)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + player_titlesets_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static PlayerTitlesets InsertOne( + Database& db, + PlayerTitlesets player_titlesets_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(player_titlesets_entry.id)); + insert_values.push_back(std::to_string(player_titlesets_entry.char_id)); + insert_values.push_back(std::to_string(player_titlesets_entry.title_set)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + player_titlesets_entry.id = results.LastInsertedID(); + return player_titlesets_entry; + } + + player_titlesets_entry = NewEntity(); + + return player_titlesets_entry; + } + + static int InsertMany( + Database& db, + std::vector player_titlesets_entries + ) + { + std::vector insert_chunks; + + for (auto &player_titlesets_entry: player_titlesets_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(player_titlesets_entry.id)); + insert_values.push_back(std::to_string(player_titlesets_entry.char_id)); + insert_values.push_back(std::to_string(player_titlesets_entry.title_set)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PlayerTitlesets entry{}; + + entry.id = atoi(row[0]); + entry.char_id = atoi(row[1]); + entry.title_set = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + PlayerTitlesets entry{}; + + entry.id = atoi(row[0]); + entry.char_id = atoi(row[1]); + entry.title_set = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PLAYER_TITLESETS_REPOSITORY_H diff --git a/common/repositories/base/base_proximities_repository.h b/common/repositories/base/base_proximities_repository.h new file mode 100644 index 000000000..6b1f697b0 --- /dev/null +++ b/common/repositories/base/base_proximities_repository.h @@ -0,0 +1,347 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_PROXIMITIES_REPOSITORY_H +#define EQEMU_BASE_PROXIMITIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseProximitiesRepository { +public: + struct Proximities { + int zoneid; + int exploreid; + float minx; + float maxx; + float miny; + float maxy; + float minz; + float maxz; + }; + + static std::string PrimaryKey() + { + return std::string("zoneid"); + } + + static std::vector Columns() + { + return { + "zoneid", + "exploreid", + "minx", + "maxx", + "miny", + "maxy", + "minz", + "maxz", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("proximities"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Proximities NewEntity() + { + Proximities entry{}; + + entry.zoneid = 0; + entry.exploreid = 0; + entry.minx = 0.000000; + entry.maxx = 0.000000; + entry.miny = 0.000000; + entry.maxy = 0.000000; + entry.minz = 0.000000; + entry.maxz = 0.000000; + + return entry; + } + + static Proximities GetProximitiesEntry( + const std::vector &proximitiess, + int proximities_id + ) + { + for (auto &proximities : proximitiess) { + if (proximities.zoneid == proximities_id) { + return proximities; + } + } + + return NewEntity(); + } + + static Proximities FindOne( + Database& db, + int proximities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + proximities_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Proximities entry{}; + + entry.zoneid = atoi(row[0]); + entry.exploreid = atoi(row[1]); + entry.minx = static_cast(atof(row[2])); + entry.maxx = static_cast(atof(row[3])); + entry.miny = static_cast(atof(row[4])); + entry.maxy = static_cast(atof(row[5])); + entry.minz = static_cast(atof(row[6])); + entry.maxz = static_cast(atof(row[7])); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int proximities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + proximities_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Proximities proximities_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(proximities_entry.zoneid)); + update_values.push_back(columns[1] + " = " + std::to_string(proximities_entry.exploreid)); + update_values.push_back(columns[2] + " = " + std::to_string(proximities_entry.minx)); + update_values.push_back(columns[3] + " = " + std::to_string(proximities_entry.maxx)); + update_values.push_back(columns[4] + " = " + std::to_string(proximities_entry.miny)); + update_values.push_back(columns[5] + " = " + std::to_string(proximities_entry.maxy)); + update_values.push_back(columns[6] + " = " + std::to_string(proximities_entry.minz)); + update_values.push_back(columns[7] + " = " + std::to_string(proximities_entry.maxz)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + proximities_entry.zoneid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Proximities InsertOne( + Database& db, + Proximities proximities_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(proximities_entry.zoneid)); + insert_values.push_back(std::to_string(proximities_entry.exploreid)); + insert_values.push_back(std::to_string(proximities_entry.minx)); + insert_values.push_back(std::to_string(proximities_entry.maxx)); + insert_values.push_back(std::to_string(proximities_entry.miny)); + insert_values.push_back(std::to_string(proximities_entry.maxy)); + insert_values.push_back(std::to_string(proximities_entry.minz)); + insert_values.push_back(std::to_string(proximities_entry.maxz)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + proximities_entry.zoneid = results.LastInsertedID(); + return proximities_entry; + } + + proximities_entry = NewEntity(); + + return proximities_entry; + } + + static int InsertMany( + Database& db, + std::vector proximities_entries + ) + { + std::vector insert_chunks; + + for (auto &proximities_entry: proximities_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(proximities_entry.zoneid)); + insert_values.push_back(std::to_string(proximities_entry.exploreid)); + insert_values.push_back(std::to_string(proximities_entry.minx)); + insert_values.push_back(std::to_string(proximities_entry.maxx)); + insert_values.push_back(std::to_string(proximities_entry.miny)); + insert_values.push_back(std::to_string(proximities_entry.maxy)); + insert_values.push_back(std::to_string(proximities_entry.minz)); + insert_values.push_back(std::to_string(proximities_entry.maxz)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Proximities entry{}; + + entry.zoneid = atoi(row[0]); + entry.exploreid = atoi(row[1]); + entry.minx = static_cast(atof(row[2])); + entry.maxx = static_cast(atof(row[3])); + entry.miny = static_cast(atof(row[4])); + entry.maxy = static_cast(atof(row[5])); + entry.minz = static_cast(atof(row[6])); + entry.maxz = static_cast(atof(row[7])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Proximities entry{}; + + entry.zoneid = atoi(row[0]); + entry.exploreid = atoi(row[1]); + entry.minx = static_cast(atof(row[2])); + entry.maxx = static_cast(atof(row[3])); + entry.miny = static_cast(atof(row[4])); + entry.maxy = static_cast(atof(row[5])); + entry.minz = static_cast(atof(row[6])); + entry.maxz = static_cast(atof(row[7])); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_PROXIMITIES_REPOSITORY_H diff --git a/common/repositories/base/base_quest_globals_repository.h b/common/repositories/base/base_quest_globals_repository.h new file mode 100644 index 000000000..0870938fd --- /dev/null +++ b/common/repositories/base/base_quest_globals_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_QUEST_GLOBALS_REPOSITORY_H +#define EQEMU_BASE_QUEST_GLOBALS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseQuestGlobalsRepository { +public: + struct QuestGlobals { + int charid; + int npcid; + int zoneid; + std::string name; + std::string value; + int expdate; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "charid", + "npcid", + "zoneid", + "name", + "value", + "expdate", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("quest_globals"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static QuestGlobals NewEntity() + { + QuestGlobals entry{}; + + entry.charid = 0; + entry.npcid = 0; + entry.zoneid = 0; + entry.name = ""; + entry.value = "?"; + entry.expdate = 0; + + return entry; + } + + static QuestGlobals GetQuestGlobalsEntry( + const std::vector &quest_globalss, + int quest_globals_id + ) + { + for (auto &quest_globals : quest_globalss) { + if (quest_globals.charid == quest_globals_id) { + return quest_globals; + } + } + + return NewEntity(); + } + + static QuestGlobals FindOne( + Database& db, + int quest_globals_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + quest_globals_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + QuestGlobals entry{}; + + entry.charid = atoi(row[0]); + entry.npcid = atoi(row[1]); + entry.zoneid = atoi(row[2]); + entry.name = row[3] ? row[3] : ""; + entry.value = row[4] ? row[4] : ""; + entry.expdate = atoi(row[5]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int quest_globals_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + quest_globals_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + QuestGlobals quest_globals_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(quest_globals_entry.charid)); + update_values.push_back(columns[1] + " = " + std::to_string(quest_globals_entry.npcid)); + update_values.push_back(columns[2] + " = " + std::to_string(quest_globals_entry.zoneid)); + update_values.push_back(columns[3] + " = '" + EscapeString(quest_globals_entry.name) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(quest_globals_entry.value) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(quest_globals_entry.expdate)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + quest_globals_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static QuestGlobals InsertOne( + Database& db, + QuestGlobals quest_globals_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(quest_globals_entry.charid)); + insert_values.push_back(std::to_string(quest_globals_entry.npcid)); + insert_values.push_back(std::to_string(quest_globals_entry.zoneid)); + insert_values.push_back("'" + EscapeString(quest_globals_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(quest_globals_entry.value) + "'"); + insert_values.push_back(std::to_string(quest_globals_entry.expdate)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + quest_globals_entry.charid = results.LastInsertedID(); + return quest_globals_entry; + } + + quest_globals_entry = NewEntity(); + + return quest_globals_entry; + } + + static int InsertMany( + Database& db, + std::vector quest_globals_entries + ) + { + std::vector insert_chunks; + + for (auto &quest_globals_entry: quest_globals_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(quest_globals_entry.charid)); + insert_values.push_back(std::to_string(quest_globals_entry.npcid)); + insert_values.push_back(std::to_string(quest_globals_entry.zoneid)); + insert_values.push_back("'" + EscapeString(quest_globals_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(quest_globals_entry.value) + "'"); + insert_values.push_back(std::to_string(quest_globals_entry.expdate)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + QuestGlobals entry{}; + + entry.charid = atoi(row[0]); + entry.npcid = atoi(row[1]); + entry.zoneid = atoi(row[2]); + entry.name = row[3] ? row[3] : ""; + entry.value = row[4] ? row[4] : ""; + entry.expdate = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + QuestGlobals entry{}; + + entry.charid = atoi(row[0]); + entry.npcid = atoi(row[1]); + entry.zoneid = atoi(row[2]); + entry.name = row[3] ? row[3] : ""; + entry.value = row[4] ? row[4] : ""; + entry.expdate = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_QUEST_GLOBALS_REPOSITORY_H diff --git a/common/repositories/base/base_raid_details_repository.h b/common/repositories/base/base_raid_details_repository.h new file mode 100644 index 000000000..a0f717bc6 --- /dev/null +++ b/common/repositories/base/base_raid_details_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_RAID_DETAILS_REPOSITORY_H +#define EQEMU_BASE_RAID_DETAILS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseRaidDetailsRepository { +public: + struct RaidDetails { + int raidid; + int loottype; + int locked; + std::string motd; + }; + + static std::string PrimaryKey() + { + return std::string("raidid"); + } + + static std::vector Columns() + { + return { + "raidid", + "loottype", + "locked", + "motd", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("raid_details"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static RaidDetails NewEntity() + { + RaidDetails entry{}; + + entry.raidid = 0; + entry.loottype = 0; + entry.locked = 0; + entry.motd = ""; + + return entry; + } + + static RaidDetails GetRaidDetailsEntry( + const std::vector &raid_detailss, + int raid_details_id + ) + { + for (auto &raid_details : raid_detailss) { + if (raid_details.raidid == raid_details_id) { + return raid_details; + } + } + + return NewEntity(); + } + + static RaidDetails FindOne( + Database& db, + int raid_details_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + raid_details_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + RaidDetails entry{}; + + entry.raidid = atoi(row[0]); + entry.loottype = atoi(row[1]); + entry.locked = atoi(row[2]); + entry.motd = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int raid_details_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + raid_details_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + RaidDetails raid_details_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(raid_details_entry.raidid)); + update_values.push_back(columns[1] + " = " + std::to_string(raid_details_entry.loottype)); + update_values.push_back(columns[2] + " = " + std::to_string(raid_details_entry.locked)); + update_values.push_back(columns[3] + " = '" + EscapeString(raid_details_entry.motd) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + raid_details_entry.raidid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static RaidDetails InsertOne( + Database& db, + RaidDetails raid_details_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(raid_details_entry.raidid)); + insert_values.push_back(std::to_string(raid_details_entry.loottype)); + insert_values.push_back(std::to_string(raid_details_entry.locked)); + insert_values.push_back("'" + EscapeString(raid_details_entry.motd) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + raid_details_entry.raidid = results.LastInsertedID(); + return raid_details_entry; + } + + raid_details_entry = NewEntity(); + + return raid_details_entry; + } + + static int InsertMany( + Database& db, + std::vector raid_details_entries + ) + { + std::vector insert_chunks; + + for (auto &raid_details_entry: raid_details_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(raid_details_entry.raidid)); + insert_values.push_back(std::to_string(raid_details_entry.loottype)); + insert_values.push_back(std::to_string(raid_details_entry.locked)); + insert_values.push_back("'" + EscapeString(raid_details_entry.motd) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RaidDetails entry{}; + + entry.raidid = atoi(row[0]); + entry.loottype = atoi(row[1]); + entry.locked = atoi(row[2]); + entry.motd = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RaidDetails entry{}; + + entry.raidid = atoi(row[0]); + entry.loottype = atoi(row[1]); + entry.locked = atoi(row[2]); + entry.motd = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_RAID_DETAILS_REPOSITORY_H diff --git a/common/repositories/base/base_raid_members_repository.h b/common/repositories/base/base_raid_members_repository.h new file mode 100644 index 000000000..b4c9ef94f --- /dev/null +++ b/common/repositories/base/base_raid_members_repository.h @@ -0,0 +1,356 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_RAID_MEMBERS_REPOSITORY_H +#define EQEMU_BASE_RAID_MEMBERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseRaidMembersRepository { +public: + struct RaidMembers { + int raidid; + int charid; + int groupid; + int _class; + int level; + std::string name; + int isgroupleader; + int israidleader; + int islooter; + }; + + static std::string PrimaryKey() + { + return std::string("charid"); + } + + static std::vector Columns() + { + return { + "raidid", + "charid", + "groupid", + "_class", + "level", + "name", + "isgroupleader", + "israidleader", + "islooter", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("raid_members"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static RaidMembers NewEntity() + { + RaidMembers entry{}; + + entry.raidid = 0; + entry.charid = 0; + entry.groupid = 0; + entry._class = 0; + entry.level = 0; + entry.name = ""; + entry.isgroupleader = 0; + entry.israidleader = 0; + entry.islooter = 0; + + return entry; + } + + static RaidMembers GetRaidMembersEntry( + const std::vector &raid_memberss, + int raid_members_id + ) + { + for (auto &raid_members : raid_memberss) { + if (raid_members.charid == raid_members_id) { + return raid_members; + } + } + + return NewEntity(); + } + + static RaidMembers FindOne( + Database& db, + int raid_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + raid_members_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + RaidMembers entry{}; + + entry.raidid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.groupid = atoi(row[2]); + entry._class = atoi(row[3]); + entry.level = atoi(row[4]); + entry.name = row[5] ? row[5] : ""; + entry.isgroupleader = atoi(row[6]); + entry.israidleader = atoi(row[7]); + entry.islooter = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int raid_members_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + raid_members_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + RaidMembers raid_members_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(raid_members_entry.raidid)); + update_values.push_back(columns[1] + " = " + std::to_string(raid_members_entry.charid)); + update_values.push_back(columns[2] + " = " + std::to_string(raid_members_entry.groupid)); + update_values.push_back(columns[3] + " = " + std::to_string(raid_members_entry._class)); + update_values.push_back(columns[4] + " = " + std::to_string(raid_members_entry.level)); + update_values.push_back(columns[5] + " = '" + EscapeString(raid_members_entry.name) + "'"); + update_values.push_back(columns[6] + " = " + std::to_string(raid_members_entry.isgroupleader)); + update_values.push_back(columns[7] + " = " + std::to_string(raid_members_entry.israidleader)); + update_values.push_back(columns[8] + " = " + std::to_string(raid_members_entry.islooter)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + raid_members_entry.charid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static RaidMembers InsertOne( + Database& db, + RaidMembers raid_members_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(raid_members_entry.raidid)); + insert_values.push_back(std::to_string(raid_members_entry.charid)); + insert_values.push_back(std::to_string(raid_members_entry.groupid)); + insert_values.push_back(std::to_string(raid_members_entry._class)); + insert_values.push_back(std::to_string(raid_members_entry.level)); + insert_values.push_back("'" + EscapeString(raid_members_entry.name) + "'"); + insert_values.push_back(std::to_string(raid_members_entry.isgroupleader)); + insert_values.push_back(std::to_string(raid_members_entry.israidleader)); + insert_values.push_back(std::to_string(raid_members_entry.islooter)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + raid_members_entry.charid = results.LastInsertedID(); + return raid_members_entry; + } + + raid_members_entry = NewEntity(); + + return raid_members_entry; + } + + static int InsertMany( + Database& db, + std::vector raid_members_entries + ) + { + std::vector insert_chunks; + + for (auto &raid_members_entry: raid_members_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(raid_members_entry.raidid)); + insert_values.push_back(std::to_string(raid_members_entry.charid)); + insert_values.push_back(std::to_string(raid_members_entry.groupid)); + insert_values.push_back(std::to_string(raid_members_entry._class)); + insert_values.push_back(std::to_string(raid_members_entry.level)); + insert_values.push_back("'" + EscapeString(raid_members_entry.name) + "'"); + insert_values.push_back(std::to_string(raid_members_entry.isgroupleader)); + insert_values.push_back(std::to_string(raid_members_entry.israidleader)); + insert_values.push_back(std::to_string(raid_members_entry.islooter)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RaidMembers entry{}; + + entry.raidid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.groupid = atoi(row[2]); + entry._class = atoi(row[3]); + entry.level = atoi(row[4]); + entry.name = row[5] ? row[5] : ""; + entry.isgroupleader = atoi(row[6]); + entry.israidleader = atoi(row[7]); + entry.islooter = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RaidMembers entry{}; + + entry.raidid = atoi(row[0]); + entry.charid = atoi(row[1]); + entry.groupid = atoi(row[2]); + entry._class = atoi(row[3]); + entry.level = atoi(row[4]); + entry.name = row[5] ? row[5] : ""; + entry.isgroupleader = atoi(row[6]); + entry.israidleader = atoi(row[7]); + entry.islooter = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_RAID_MEMBERS_REPOSITORY_H diff --git a/common/repositories/base/base_reports_repository.h b/common/repositories/base/base_reports_repository.h new file mode 100644 index 000000000..caebd4107 --- /dev/null +++ b/common/repositories/base/base_reports_repository.h @@ -0,0 +1,310 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_REPORTS_REPOSITORY_H +#define EQEMU_BASE_REPORTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseReportsRepository { +public: + struct Reports { + int id; + std::string name; + std::string reported; + std::string reported_text; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "reported", + "reported_text", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("reports"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Reports NewEntity() + { + Reports entry{}; + + entry.id = 0; + entry.name = ""; + entry.reported = ""; + entry.reported_text = ""; + + return entry; + } + + static Reports GetReportsEntry( + const std::vector &reportss, + int reports_id + ) + { + for (auto &reports : reportss) { + if (reports.id == reports_id) { + return reports; + } + } + + return NewEntity(); + } + + static Reports FindOne( + Database& db, + int reports_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + reports_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Reports entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.reported = row[2] ? row[2] : ""; + entry.reported_text = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int reports_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + reports_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Reports reports_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(reports_entry.name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(reports_entry.reported) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(reports_entry.reported_text) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + reports_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Reports InsertOne( + Database& db, + Reports reports_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(reports_entry.id)); + insert_values.push_back("'" + EscapeString(reports_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(reports_entry.reported) + "'"); + insert_values.push_back("'" + EscapeString(reports_entry.reported_text) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + reports_entry.id = results.LastInsertedID(); + return reports_entry; + } + + reports_entry = NewEntity(); + + return reports_entry; + } + + static int InsertMany( + Database& db, + std::vector reports_entries + ) + { + std::vector insert_chunks; + + for (auto &reports_entry: reports_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(reports_entry.id)); + insert_values.push_back("'" + EscapeString(reports_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(reports_entry.reported) + "'"); + insert_values.push_back("'" + EscapeString(reports_entry.reported_text) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Reports entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.reported = row[2] ? row[2] : ""; + entry.reported_text = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Reports entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.reported = row[2] ? row[2] : ""; + entry.reported_text = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_REPORTS_REPOSITORY_H diff --git a/common/repositories/base/base_respawn_times_repository.h b/common/repositories/base/base_respawn_times_repository.h new file mode 100644 index 000000000..df69f2be9 --- /dev/null +++ b/common/repositories/base/base_respawn_times_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_RESPAWN_TIMES_REPOSITORY_H +#define EQEMU_BASE_RESPAWN_TIMES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseRespawnTimesRepository { +public: + struct RespawnTimes { + int id; + int start; + int duration; + int instance_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "start", + "duration", + "instance_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("respawn_times"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static RespawnTimes NewEntity() + { + RespawnTimes entry{}; + + entry.id = 0; + entry.start = 0; + entry.duration = 0; + entry.instance_id = 0; + + return entry; + } + + static RespawnTimes GetRespawnTimesEntry( + const std::vector &respawn_timess, + int respawn_times_id + ) + { + for (auto &respawn_times : respawn_timess) { + if (respawn_times.id == respawn_times_id) { + return respawn_times; + } + } + + return NewEntity(); + } + + static RespawnTimes FindOne( + Database& db, + int respawn_times_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + respawn_times_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + RespawnTimes entry{}; + + entry.id = atoi(row[0]); + entry.start = atoi(row[1]); + entry.duration = atoi(row[2]); + entry.instance_id = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int respawn_times_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + respawn_times_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + RespawnTimes respawn_times_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(respawn_times_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(respawn_times_entry.start)); + update_values.push_back(columns[2] + " = " + std::to_string(respawn_times_entry.duration)); + update_values.push_back(columns[3] + " = " + std::to_string(respawn_times_entry.instance_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + respawn_times_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static RespawnTimes InsertOne( + Database& db, + RespawnTimes respawn_times_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(respawn_times_entry.id)); + insert_values.push_back(std::to_string(respawn_times_entry.start)); + insert_values.push_back(std::to_string(respawn_times_entry.duration)); + insert_values.push_back(std::to_string(respawn_times_entry.instance_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + respawn_times_entry.id = results.LastInsertedID(); + return respawn_times_entry; + } + + respawn_times_entry = NewEntity(); + + return respawn_times_entry; + } + + static int InsertMany( + Database& db, + std::vector respawn_times_entries + ) + { + std::vector insert_chunks; + + for (auto &respawn_times_entry: respawn_times_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(respawn_times_entry.id)); + insert_values.push_back(std::to_string(respawn_times_entry.start)); + insert_values.push_back(std::to_string(respawn_times_entry.duration)); + insert_values.push_back(std::to_string(respawn_times_entry.instance_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RespawnTimes entry{}; + + entry.id = atoi(row[0]); + entry.start = atoi(row[1]); + entry.duration = atoi(row[2]); + entry.instance_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RespawnTimes entry{}; + + entry.id = atoi(row[0]); + entry.start = atoi(row[1]); + entry.duration = atoi(row[2]); + entry.instance_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_RESPAWN_TIMES_REPOSITORY_H diff --git a/common/repositories/base/base_rule_sets_repository.h b/common/repositories/base/base_rule_sets_repository.h new file mode 100644 index 000000000..31dab96d9 --- /dev/null +++ b/common/repositories/base/base_rule_sets_repository.h @@ -0,0 +1,292 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_RULE_SETS_REPOSITORY_H +#define EQEMU_BASE_RULE_SETS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseRuleSetsRepository { +public: + struct RuleSets { + int ruleset_id; + std::string name; + }; + + static std::string PrimaryKey() + { + return std::string("ruleset_id"); + } + + static std::vector Columns() + { + return { + "ruleset_id", + "name", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("rule_sets"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static RuleSets NewEntity() + { + RuleSets entry{}; + + entry.ruleset_id = 0; + entry.name = ""; + + return entry; + } + + static RuleSets GetRuleSetsEntry( + const std::vector &rule_setss, + int rule_sets_id + ) + { + for (auto &rule_sets : rule_setss) { + if (rule_sets.ruleset_id == rule_sets_id) { + return rule_sets; + } + } + + return NewEntity(); + } + + static RuleSets FindOne( + Database& db, + int rule_sets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + rule_sets_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + RuleSets entry{}; + + entry.ruleset_id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int rule_sets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + rule_sets_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + RuleSets rule_sets_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(rule_sets_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + rule_sets_entry.ruleset_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static RuleSets InsertOne( + Database& db, + RuleSets rule_sets_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(rule_sets_entry.ruleset_id)); + insert_values.push_back("'" + EscapeString(rule_sets_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + rule_sets_entry.ruleset_id = results.LastInsertedID(); + return rule_sets_entry; + } + + rule_sets_entry = NewEntity(); + + return rule_sets_entry; + } + + static int InsertMany( + Database& db, + std::vector rule_sets_entries + ) + { + std::vector insert_chunks; + + for (auto &rule_sets_entry: rule_sets_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(rule_sets_entry.ruleset_id)); + insert_values.push_back("'" + EscapeString(rule_sets_entry.name) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RuleSets entry{}; + + entry.ruleset_id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RuleSets entry{}; + + entry.ruleset_id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_RULE_SETS_REPOSITORY_H diff --git a/common/repositories/base/base_rule_values_repository.h b/common/repositories/base/base_rule_values_repository.h new file mode 100644 index 000000000..6bd6fe2d6 --- /dev/null +++ b/common/repositories/base/base_rule_values_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_RULE_VALUES_REPOSITORY_H +#define EQEMU_BASE_RULE_VALUES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseRuleValuesRepository { +public: + struct RuleValues { + int ruleset_id; + std::string rule_name; + std::string rule_value; + std::string notes; + }; + + static std::string PrimaryKey() + { + return std::string("ruleset_id"); + } + + static std::vector Columns() + { + return { + "ruleset_id", + "rule_name", + "rule_value", + "notes", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("rule_values"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static RuleValues NewEntity() + { + RuleValues entry{}; + + entry.ruleset_id = 0; + entry.rule_name = ""; + entry.rule_value = ""; + entry.notes = ""; + + return entry; + } + + static RuleValues GetRuleValuesEntry( + const std::vector &rule_valuess, + int rule_values_id + ) + { + for (auto &rule_values : rule_valuess) { + if (rule_values.ruleset_id == rule_values_id) { + return rule_values; + } + } + + return NewEntity(); + } + + static RuleValues FindOne( + Database& db, + int rule_values_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + rule_values_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + RuleValues entry{}; + + entry.ruleset_id = atoi(row[0]); + entry.rule_name = row[1] ? row[1] : ""; + entry.rule_value = row[2] ? row[2] : ""; + entry.notes = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int rule_values_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + rule_values_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + RuleValues rule_values_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(rule_values_entry.ruleset_id)); + update_values.push_back(columns[1] + " = '" + EscapeString(rule_values_entry.rule_name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(rule_values_entry.rule_value) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(rule_values_entry.notes) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + rule_values_entry.ruleset_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static RuleValues InsertOne( + Database& db, + RuleValues rule_values_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(rule_values_entry.ruleset_id)); + insert_values.push_back("'" + EscapeString(rule_values_entry.rule_name) + "'"); + insert_values.push_back("'" + EscapeString(rule_values_entry.rule_value) + "'"); + insert_values.push_back("'" + EscapeString(rule_values_entry.notes) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + rule_values_entry.ruleset_id = results.LastInsertedID(); + return rule_values_entry; + } + + rule_values_entry = NewEntity(); + + return rule_values_entry; + } + + static int InsertMany( + Database& db, + std::vector rule_values_entries + ) + { + std::vector insert_chunks; + + for (auto &rule_values_entry: rule_values_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(rule_values_entry.ruleset_id)); + insert_values.push_back("'" + EscapeString(rule_values_entry.rule_name) + "'"); + insert_values.push_back("'" + EscapeString(rule_values_entry.rule_value) + "'"); + insert_values.push_back("'" + EscapeString(rule_values_entry.notes) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RuleValues entry{}; + + entry.ruleset_id = atoi(row[0]); + entry.rule_name = row[1] ? row[1] : ""; + entry.rule_value = row[2] ? row[2] : ""; + entry.notes = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RuleValues entry{}; + + entry.ruleset_id = atoi(row[0]); + entry.rule_name = row[1] ? row[1] : ""; + entry.rule_value = row[2] ? row[2] : ""; + entry.notes = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_RULE_VALUES_REPOSITORY_H diff --git a/common/repositories/base/base_saylink_repository.h b/common/repositories/base/base_saylink_repository.h new file mode 100644 index 000000000..e02b1954c --- /dev/null +++ b/common/repositories/base/base_saylink_repository.h @@ -0,0 +1,292 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SAYLINK_REPOSITORY_H +#define EQEMU_BASE_SAYLINK_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSaylinkRepository { +public: + struct Saylink { + int id; + std::string phrase; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "phrase", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("saylink"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Saylink NewEntity() + { + Saylink entry{}; + + entry.id = 0; + entry.phrase = ""; + + return entry; + } + + static Saylink GetSaylinkEntry( + const std::vector &saylinks, + int saylink_id + ) + { + for (auto &saylink : saylinks) { + if (saylink.id == saylink_id) { + return saylink; + } + } + + return NewEntity(); + } + + static Saylink FindOne( + Database& db, + int saylink_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + saylink_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Saylink entry{}; + + entry.id = atoi(row[0]); + entry.phrase = row[1] ? row[1] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int saylink_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + saylink_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Saylink saylink_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(saylink_entry.phrase) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + saylink_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Saylink InsertOne( + Database& db, + Saylink saylink_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(saylink_entry.id)); + insert_values.push_back("'" + EscapeString(saylink_entry.phrase) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + saylink_entry.id = results.LastInsertedID(); + return saylink_entry; + } + + saylink_entry = NewEntity(); + + return saylink_entry; + } + + static int InsertMany( + Database& db, + std::vector saylink_entries + ) + { + std::vector insert_chunks; + + for (auto &saylink_entry: saylink_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(saylink_entry.id)); + insert_values.push_back("'" + EscapeString(saylink_entry.phrase) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Saylink entry{}; + + entry.id = atoi(row[0]); + entry.phrase = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Saylink entry{}; + + entry.id = atoi(row[0]); + entry.phrase = row[1] ? row[1] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SAYLINK_REPOSITORY_H diff --git a/common/repositories/base/base_server_scheduled_events_repository.h b/common/repositories/base/base_server_scheduled_events_repository.h new file mode 100644 index 000000000..1cc319d6a --- /dev/null +++ b/common/repositories/base/base_server_scheduled_events_repository.h @@ -0,0 +1,427 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SERVER_SCHEDULED_EVENTS_REPOSITORY_H +#define EQEMU_BASE_SERVER_SCHEDULED_EVENTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseServerScheduledEventsRepository { +public: + struct ServerScheduledEvents { + int id; + std::string description; + std::string event_type; + std::string event_data; + int minute_start; + int hour_start; + int day_start; + int month_start; + int year_start; + int minute_end; + int hour_end; + int day_end; + int month_end; + int year_end; + std::string cron_expression; + std::string created_at; + std::string deleted_at; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "description", + "event_type", + "event_data", + "minute_start", + "hour_start", + "day_start", + "month_start", + "year_start", + "minute_end", + "hour_end", + "day_end", + "month_end", + "year_end", + "cron_expression", + "created_at", + "deleted_at", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("server_scheduled_events"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ServerScheduledEvents NewEntity() + { + ServerScheduledEvents entry{}; + + entry.id = 0; + entry.description = ""; + entry.event_type = ""; + entry.event_data = ""; + entry.minute_start = 0; + entry.hour_start = 0; + entry.day_start = 0; + entry.month_start = 0; + entry.year_start = 0; + entry.minute_end = 0; + entry.hour_end = 0; + entry.day_end = 0; + entry.month_end = 0; + entry.year_end = 0; + entry.cron_expression = ""; + entry.created_at = ""; + entry.deleted_at = ""; + + return entry; + } + + static ServerScheduledEvents GetServerScheduledEventsEntry( + const std::vector &server_scheduled_eventss, + int server_scheduled_events_id + ) + { + for (auto &server_scheduled_events : server_scheduled_eventss) { + if (server_scheduled_events.id == server_scheduled_events_id) { + return server_scheduled_events; + } + } + + return NewEntity(); + } + + static ServerScheduledEvents FindOne( + Database& db, + int server_scheduled_events_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + server_scheduled_events_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ServerScheduledEvents entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + entry.event_type = row[2] ? row[2] : ""; + entry.event_data = row[3] ? row[3] : ""; + entry.minute_start = atoi(row[4]); + entry.hour_start = atoi(row[5]); + entry.day_start = atoi(row[6]); + entry.month_start = atoi(row[7]); + entry.year_start = atoi(row[8]); + entry.minute_end = atoi(row[9]); + entry.hour_end = atoi(row[10]); + entry.day_end = atoi(row[11]); + entry.month_end = atoi(row[12]); + entry.year_end = atoi(row[13]); + entry.cron_expression = row[14] ? row[14] : ""; + entry.created_at = row[15] ? row[15] : ""; + entry.deleted_at = row[16] ? row[16] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int server_scheduled_events_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + server_scheduled_events_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ServerScheduledEvents server_scheduled_events_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(server_scheduled_events_entry.description) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(server_scheduled_events_entry.event_type) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(server_scheduled_events_entry.event_data) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(server_scheduled_events_entry.minute_start)); + update_values.push_back(columns[5] + " = " + std::to_string(server_scheduled_events_entry.hour_start)); + update_values.push_back(columns[6] + " = " + std::to_string(server_scheduled_events_entry.day_start)); + update_values.push_back(columns[7] + " = " + std::to_string(server_scheduled_events_entry.month_start)); + update_values.push_back(columns[8] + " = " + std::to_string(server_scheduled_events_entry.year_start)); + update_values.push_back(columns[9] + " = " + std::to_string(server_scheduled_events_entry.minute_end)); + update_values.push_back(columns[10] + " = " + std::to_string(server_scheduled_events_entry.hour_end)); + update_values.push_back(columns[11] + " = " + std::to_string(server_scheduled_events_entry.day_end)); + update_values.push_back(columns[12] + " = " + std::to_string(server_scheduled_events_entry.month_end)); + update_values.push_back(columns[13] + " = " + std::to_string(server_scheduled_events_entry.year_end)); + update_values.push_back(columns[14] + " = '" + EscapeString(server_scheduled_events_entry.cron_expression) + "'"); + update_values.push_back(columns[15] + " = '" + EscapeString(server_scheduled_events_entry.created_at) + "'"); + update_values.push_back(columns[16] + " = '" + EscapeString(server_scheduled_events_entry.deleted_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + server_scheduled_events_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ServerScheduledEvents InsertOne( + Database& db, + ServerScheduledEvents server_scheduled_events_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(server_scheduled_events_entry.id)); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.description) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.event_type) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.event_data) + "'"); + insert_values.push_back(std::to_string(server_scheduled_events_entry.minute_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.hour_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.day_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.month_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.year_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.minute_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.hour_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.day_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.month_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.year_end)); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.cron_expression) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.created_at) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.deleted_at) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + server_scheduled_events_entry.id = results.LastInsertedID(); + return server_scheduled_events_entry; + } + + server_scheduled_events_entry = NewEntity(); + + return server_scheduled_events_entry; + } + + static int InsertMany( + Database& db, + std::vector server_scheduled_events_entries + ) + { + std::vector insert_chunks; + + for (auto &server_scheduled_events_entry: server_scheduled_events_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(server_scheduled_events_entry.id)); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.description) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.event_type) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.event_data) + "'"); + insert_values.push_back(std::to_string(server_scheduled_events_entry.minute_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.hour_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.day_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.month_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.year_start)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.minute_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.hour_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.day_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.month_end)); + insert_values.push_back(std::to_string(server_scheduled_events_entry.year_end)); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.cron_expression) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.created_at) + "'"); + insert_values.push_back("'" + EscapeString(server_scheduled_events_entry.deleted_at) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ServerScheduledEvents entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + entry.event_type = row[2] ? row[2] : ""; + entry.event_data = row[3] ? row[3] : ""; + entry.minute_start = atoi(row[4]); + entry.hour_start = atoi(row[5]); + entry.day_start = atoi(row[6]); + entry.month_start = atoi(row[7]); + entry.year_start = atoi(row[8]); + entry.minute_end = atoi(row[9]); + entry.hour_end = atoi(row[10]); + entry.day_end = atoi(row[11]); + entry.month_end = atoi(row[12]); + entry.year_end = atoi(row[13]); + entry.cron_expression = row[14] ? row[14] : ""; + entry.created_at = row[15] ? row[15] : ""; + entry.deleted_at = row[16] ? row[16] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ServerScheduledEvents entry{}; + + entry.id = atoi(row[0]); + entry.description = row[1] ? row[1] : ""; + entry.event_type = row[2] ? row[2] : ""; + entry.event_data = row[3] ? row[3] : ""; + entry.minute_start = atoi(row[4]); + entry.hour_start = atoi(row[5]); + entry.day_start = atoi(row[6]); + entry.month_start = atoi(row[7]); + entry.year_start = atoi(row[8]); + entry.minute_end = atoi(row[9]); + entry.hour_end = atoi(row[10]); + entry.day_end = atoi(row[11]); + entry.month_end = atoi(row[12]); + entry.year_end = atoi(row[13]); + entry.cron_expression = row[14] ? row[14] : ""; + entry.created_at = row[15] ? row[15] : ""; + entry.deleted_at = row[16] ? row[16] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SERVER_SCHEDULED_EVENTS_REPOSITORY_H diff --git a/common/repositories/base/base_skill_caps_repository.h b/common/repositories/base/base_skill_caps_repository.h new file mode 100644 index 000000000..b17753782 --- /dev/null +++ b/common/repositories/base/base_skill_caps_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SKILL_CAPS_REPOSITORY_H +#define EQEMU_BASE_SKILL_CAPS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSkillCapsRepository { +public: + struct SkillCaps { + int skillID; + int class; + int level; + int cap; + int class_; + }; + + static std::string PrimaryKey() + { + return std::string("skillID"); + } + + static std::vector Columns() + { + return { + "skillID", + "class", + "level", + "cap", + "class_", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("skill_caps"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SkillCaps NewEntity() + { + SkillCaps entry{}; + + entry.skillID = 0; + entry.class = 0; + entry.level = 0; + entry.cap = 0; + entry.class_ = 0; + + return entry; + } + + static SkillCaps GetSkillCapsEntry( + const std::vector &skill_capss, + int skill_caps_id + ) + { + for (auto &skill_caps : skill_capss) { + if (skill_caps.skillID == skill_caps_id) { + return skill_caps; + } + } + + return NewEntity(); + } + + static SkillCaps FindOne( + Database& db, + int skill_caps_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + skill_caps_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SkillCaps entry{}; + + entry.skillID = atoi(row[0]); + entry.class = atoi(row[1]); + entry.level = atoi(row[2]); + entry.cap = atoi(row[3]); + entry.class_ = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int skill_caps_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + skill_caps_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SkillCaps skill_caps_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(skill_caps_entry.skillID)); + update_values.push_back(columns[1] + " = " + std::to_string(skill_caps_entry.class)); + update_values.push_back(columns[2] + " = " + std::to_string(skill_caps_entry.level)); + update_values.push_back(columns[3] + " = " + std::to_string(skill_caps_entry.cap)); + update_values.push_back(columns[4] + " = " + std::to_string(skill_caps_entry.class_)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + skill_caps_entry.skillID + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SkillCaps InsertOne( + Database& db, + SkillCaps skill_caps_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(skill_caps_entry.skillID)); + insert_values.push_back(std::to_string(skill_caps_entry.class)); + insert_values.push_back(std::to_string(skill_caps_entry.level)); + insert_values.push_back(std::to_string(skill_caps_entry.cap)); + insert_values.push_back(std::to_string(skill_caps_entry.class_)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + skill_caps_entry.skillID = results.LastInsertedID(); + return skill_caps_entry; + } + + skill_caps_entry = NewEntity(); + + return skill_caps_entry; + } + + static int InsertMany( + Database& db, + std::vector skill_caps_entries + ) + { + std::vector insert_chunks; + + for (auto &skill_caps_entry: skill_caps_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(skill_caps_entry.skillID)); + insert_values.push_back(std::to_string(skill_caps_entry.class)); + insert_values.push_back(std::to_string(skill_caps_entry.level)); + insert_values.push_back(std::to_string(skill_caps_entry.cap)); + insert_values.push_back(std::to_string(skill_caps_entry.class_)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SkillCaps entry{}; + + entry.skillID = atoi(row[0]); + entry.class = atoi(row[1]); + entry.level = atoi(row[2]); + entry.cap = atoi(row[3]); + entry.class_ = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SkillCaps entry{}; + + entry.skillID = atoi(row[0]); + entry.class = atoi(row[1]); + entry.level = atoi(row[2]); + entry.cap = atoi(row[3]); + entry.class_ = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SKILL_CAPS_REPOSITORY_H diff --git a/common/repositories/base/base_spawn2_repository.h b/common/repositories/base/base_spawn2_repository.h new file mode 100644 index 000000000..921c9262d --- /dev/null +++ b/common/repositories/base/base_spawn2_repository.h @@ -0,0 +1,445 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPAWN2_REPOSITORY_H +#define EQEMU_BASE_SPAWN2_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpawn2Repository { +public: + struct Spawn2 { + int id; + int spawngroupID; + std::string zone; + int version; + float x; + float y; + float z; + float heading; + int respawntime; + int variance; + int pathgrid; + int _condition; + int cond_value; + int enabled; + int animation; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "spawngroupID", + "zone", + "version", + "x", + "y", + "z", + "heading", + "respawntime", + "variance", + "pathgrid", + "_condition", + "cond_value", + "enabled", + "animation", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spawn2"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Spawn2 NewEntity() + { + Spawn2 entry{}; + + entry.id = 0; + entry.spawngroupID = 0; + entry.zone = ""; + entry.version = 0; + entry.x = 0.000000; + entry.y = 0.000000; + entry.z = 0.000000; + entry.heading = 0.000000; + entry.respawntime = 0; + entry.variance = 0; + entry.pathgrid = 0; + entry._condition = 0; + entry.cond_value = 1; + entry.enabled = 1; + entry.animation = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Spawn2 GetSpawn2Entry( + const std::vector &spawn2s, + int spawn2_id + ) + { + for (auto &spawn2 : spawn2s) { + if (spawn2.id == spawn2_id) { + return spawn2; + } + } + + return NewEntity(); + } + + static Spawn2 FindOne( + Database& db, + int spawn2_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spawn2_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Spawn2 entry{}; + + entry.id = atoi(row[0]); + entry.spawngroupID = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.version = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + entry.respawntime = atoi(row[8]); + entry.variance = atoi(row[9]); + entry.pathgrid = atoi(row[10]); + entry._condition = atoi(row[11]); + entry.cond_value = atoi(row[12]); + entry.enabled = atoi(row[13]); + entry.animation = atoi(row[14]); + entry.min_expansion = atoi(row[15]); + entry.max_expansion = atoi(row[16]); + entry.content_flags = row[17] ? row[17] : ""; + entry.content_flags_disabled = row[18] ? row[18] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spawn2_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spawn2_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Spawn2 spawn2_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(spawn2_entry.spawngroupID)); + update_values.push_back(columns[2] + " = '" + EscapeString(spawn2_entry.zone) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(spawn2_entry.version)); + update_values.push_back(columns[4] + " = " + std::to_string(spawn2_entry.x)); + update_values.push_back(columns[5] + " = " + std::to_string(spawn2_entry.y)); + update_values.push_back(columns[6] + " = " + std::to_string(spawn2_entry.z)); + update_values.push_back(columns[7] + " = " + std::to_string(spawn2_entry.heading)); + update_values.push_back(columns[8] + " = " + std::to_string(spawn2_entry.respawntime)); + update_values.push_back(columns[9] + " = " + std::to_string(spawn2_entry.variance)); + update_values.push_back(columns[10] + " = " + std::to_string(spawn2_entry.pathgrid)); + update_values.push_back(columns[11] + " = " + std::to_string(spawn2_entry._condition)); + update_values.push_back(columns[12] + " = " + std::to_string(spawn2_entry.cond_value)); + update_values.push_back(columns[13] + " = " + std::to_string(spawn2_entry.enabled)); + update_values.push_back(columns[14] + " = " + std::to_string(spawn2_entry.animation)); + update_values.push_back(columns[15] + " = " + std::to_string(spawn2_entry.min_expansion)); + update_values.push_back(columns[16] + " = " + std::to_string(spawn2_entry.max_expansion)); + update_values.push_back(columns[17] + " = '" + EscapeString(spawn2_entry.content_flags) + "'"); + update_values.push_back(columns[18] + " = '" + EscapeString(spawn2_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spawn2_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Spawn2 InsertOne( + Database& db, + Spawn2 spawn2_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawn2_entry.id)); + insert_values.push_back(std::to_string(spawn2_entry.spawngroupID)); + insert_values.push_back("'" + EscapeString(spawn2_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn2_entry.version)); + insert_values.push_back(std::to_string(spawn2_entry.x)); + insert_values.push_back(std::to_string(spawn2_entry.y)); + insert_values.push_back(std::to_string(spawn2_entry.z)); + insert_values.push_back(std::to_string(spawn2_entry.heading)); + insert_values.push_back(std::to_string(spawn2_entry.respawntime)); + insert_values.push_back(std::to_string(spawn2_entry.variance)); + insert_values.push_back(std::to_string(spawn2_entry.pathgrid)); + insert_values.push_back(std::to_string(spawn2_entry._condition)); + insert_values.push_back(std::to_string(spawn2_entry.cond_value)); + insert_values.push_back(std::to_string(spawn2_entry.enabled)); + insert_values.push_back(std::to_string(spawn2_entry.animation)); + insert_values.push_back(std::to_string(spawn2_entry.min_expansion)); + insert_values.push_back(std::to_string(spawn2_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(spawn2_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(spawn2_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spawn2_entry.id = results.LastInsertedID(); + return spawn2_entry; + } + + spawn2_entry = NewEntity(); + + return spawn2_entry; + } + + static int InsertMany( + Database& db, + std::vector spawn2_entries + ) + { + std::vector insert_chunks; + + for (auto &spawn2_entry: spawn2_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawn2_entry.id)); + insert_values.push_back(std::to_string(spawn2_entry.spawngroupID)); + insert_values.push_back("'" + EscapeString(spawn2_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn2_entry.version)); + insert_values.push_back(std::to_string(spawn2_entry.x)); + insert_values.push_back(std::to_string(spawn2_entry.y)); + insert_values.push_back(std::to_string(spawn2_entry.z)); + insert_values.push_back(std::to_string(spawn2_entry.heading)); + insert_values.push_back(std::to_string(spawn2_entry.respawntime)); + insert_values.push_back(std::to_string(spawn2_entry.variance)); + insert_values.push_back(std::to_string(spawn2_entry.pathgrid)); + insert_values.push_back(std::to_string(spawn2_entry._condition)); + insert_values.push_back(std::to_string(spawn2_entry.cond_value)); + insert_values.push_back(std::to_string(spawn2_entry.enabled)); + insert_values.push_back(std::to_string(spawn2_entry.animation)); + insert_values.push_back(std::to_string(spawn2_entry.min_expansion)); + insert_values.push_back(std::to_string(spawn2_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(spawn2_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(spawn2_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Spawn2 entry{}; + + entry.id = atoi(row[0]); + entry.spawngroupID = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.version = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + entry.respawntime = atoi(row[8]); + entry.variance = atoi(row[9]); + entry.pathgrid = atoi(row[10]); + entry._condition = atoi(row[11]); + entry.cond_value = atoi(row[12]); + entry.enabled = atoi(row[13]); + entry.animation = atoi(row[14]); + entry.min_expansion = atoi(row[15]); + entry.max_expansion = atoi(row[16]); + entry.content_flags = row[17] ? row[17] : ""; + entry.content_flags_disabled = row[18] ? row[18] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Spawn2 entry{}; + + entry.id = atoi(row[0]); + entry.spawngroupID = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.version = atoi(row[3]); + entry.x = static_cast(atof(row[4])); + entry.y = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + entry.respawntime = atoi(row[8]); + entry.variance = atoi(row[9]); + entry.pathgrid = atoi(row[10]); + entry._condition = atoi(row[11]); + entry.cond_value = atoi(row[12]); + entry.enabled = atoi(row[13]); + entry.animation = atoi(row[14]); + entry.min_expansion = atoi(row[15]); + entry.max_expansion = atoi(row[16]); + entry.content_flags = row[17] ? row[17] : ""; + entry.content_flags_disabled = row[18] ? row[18] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPAWN2_REPOSITORY_H diff --git a/common/repositories/base/base_spawn_condition_values_repository.h b/common/repositories/base/base_spawn_condition_values_repository.h new file mode 100644 index 000000000..c54eee597 --- /dev/null +++ b/common/repositories/base/base_spawn_condition_values_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPAWN_CONDITION_VALUES_REPOSITORY_H +#define EQEMU_BASE_SPAWN_CONDITION_VALUES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpawnConditionValuesRepository { +public: + struct SpawnConditionValues { + int id; + int value; + std::string zone; + int instance_id; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "value", + "zone", + "instance_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spawn_condition_values"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SpawnConditionValues NewEntity() + { + SpawnConditionValues entry{}; + + entry.id = 0; + entry.value = 0; + entry.zone = ""; + entry.instance_id = 0; + + return entry; + } + + static SpawnConditionValues GetSpawnConditionValuesEntry( + const std::vector &spawn_condition_valuess, + int spawn_condition_values_id + ) + { + for (auto &spawn_condition_values : spawn_condition_valuess) { + if (spawn_condition_values.id == spawn_condition_values_id) { + return spawn_condition_values; + } + } + + return NewEntity(); + } + + static SpawnConditionValues FindOne( + Database& db, + int spawn_condition_values_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spawn_condition_values_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SpawnConditionValues entry{}; + + entry.id = atoi(row[0]); + entry.value = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.instance_id = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spawn_condition_values_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spawn_condition_values_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SpawnConditionValues spawn_condition_values_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(spawn_condition_values_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(spawn_condition_values_entry.value)); + update_values.push_back(columns[2] + " = '" + EscapeString(spawn_condition_values_entry.zone) + "'"); + update_values.push_back(columns[3] + " = " + std::to_string(spawn_condition_values_entry.instance_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spawn_condition_values_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SpawnConditionValues InsertOne( + Database& db, + SpawnConditionValues spawn_condition_values_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawn_condition_values_entry.id)); + insert_values.push_back(std::to_string(spawn_condition_values_entry.value)); + insert_values.push_back("'" + EscapeString(spawn_condition_values_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn_condition_values_entry.instance_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spawn_condition_values_entry.id = results.LastInsertedID(); + return spawn_condition_values_entry; + } + + spawn_condition_values_entry = NewEntity(); + + return spawn_condition_values_entry; + } + + static int InsertMany( + Database& db, + std::vector spawn_condition_values_entries + ) + { + std::vector insert_chunks; + + for (auto &spawn_condition_values_entry: spawn_condition_values_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawn_condition_values_entry.id)); + insert_values.push_back(std::to_string(spawn_condition_values_entry.value)); + insert_values.push_back("'" + EscapeString(spawn_condition_values_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn_condition_values_entry.instance_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpawnConditionValues entry{}; + + entry.id = atoi(row[0]); + entry.value = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.instance_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpawnConditionValues entry{}; + + entry.id = atoi(row[0]); + entry.value = atoi(row[1]); + entry.zone = row[2] ? row[2] : ""; + entry.instance_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPAWN_CONDITION_VALUES_REPOSITORY_H diff --git a/common/repositories/base/base_spawn_conditions_repository.h b/common/repositories/base/base_spawn_conditions_repository.h new file mode 100644 index 000000000..e0e7fa0ab --- /dev/null +++ b/common/repositories/base/base_spawn_conditions_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPAWN_CONDITIONS_REPOSITORY_H +#define EQEMU_BASE_SPAWN_CONDITIONS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpawnConditionsRepository { +public: + struct SpawnConditions { + std::string zone; + int id; + int value; + int onchange; + std::string name; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "zone", + "id", + "value", + "onchange", + "name", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spawn_conditions"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SpawnConditions NewEntity() + { + SpawnConditions entry{}; + + entry.zone = ""; + entry.id = 1; + entry.value = 0; + entry.onchange = 0; + entry.name = ""; + + return entry; + } + + static SpawnConditions GetSpawnConditionsEntry( + const std::vector &spawn_conditionss, + int spawn_conditions_id + ) + { + for (auto &spawn_conditions : spawn_conditionss) { + if (spawn_conditions.id == spawn_conditions_id) { + return spawn_conditions; + } + } + + return NewEntity(); + } + + static SpawnConditions FindOne( + Database& db, + int spawn_conditions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spawn_conditions_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SpawnConditions entry{}; + + entry.zone = row[0] ? row[0] : ""; + entry.id = atoi(row[1]); + entry.value = atoi(row[2]); + entry.onchange = atoi(row[3]); + entry.name = row[4] ? row[4] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spawn_conditions_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spawn_conditions_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SpawnConditions spawn_conditions_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(spawn_conditions_entry.zone) + "'"); + update_values.push_back(columns[1] + " = " + std::to_string(spawn_conditions_entry.id)); + update_values.push_back(columns[2] + " = " + std::to_string(spawn_conditions_entry.value)); + update_values.push_back(columns[3] + " = " + std::to_string(spawn_conditions_entry.onchange)); + update_values.push_back(columns[4] + " = '" + EscapeString(spawn_conditions_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spawn_conditions_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SpawnConditions InsertOne( + Database& db, + SpawnConditions spawn_conditions_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(spawn_conditions_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn_conditions_entry.id)); + insert_values.push_back(std::to_string(spawn_conditions_entry.value)); + insert_values.push_back(std::to_string(spawn_conditions_entry.onchange)); + insert_values.push_back("'" + EscapeString(spawn_conditions_entry.name) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spawn_conditions_entry.id = results.LastInsertedID(); + return spawn_conditions_entry; + } + + spawn_conditions_entry = NewEntity(); + + return spawn_conditions_entry; + } + + static int InsertMany( + Database& db, + std::vector spawn_conditions_entries + ) + { + std::vector insert_chunks; + + for (auto &spawn_conditions_entry: spawn_conditions_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(spawn_conditions_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn_conditions_entry.id)); + insert_values.push_back(std::to_string(spawn_conditions_entry.value)); + insert_values.push_back(std::to_string(spawn_conditions_entry.onchange)); + insert_values.push_back("'" + EscapeString(spawn_conditions_entry.name) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpawnConditions entry{}; + + entry.zone = row[0] ? row[0] : ""; + entry.id = atoi(row[1]); + entry.value = atoi(row[2]); + entry.onchange = atoi(row[3]); + entry.name = row[4] ? row[4] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpawnConditions entry{}; + + entry.zone = row[0] ? row[0] : ""; + entry.id = atoi(row[1]); + entry.value = atoi(row[2]); + entry.onchange = atoi(row[3]); + entry.name = row[4] ? row[4] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPAWN_CONDITIONS_REPOSITORY_H diff --git a/common/repositories/base/base_spawn_events_repository.h b/common/repositories/base/base_spawn_events_repository.h new file mode 100644 index 000000000..da52bbb8a --- /dev/null +++ b/common/repositories/base/base_spawn_events_repository.h @@ -0,0 +1,400 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPAWN_EVENTS_REPOSITORY_H +#define EQEMU_BASE_SPAWN_EVENTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpawnEventsRepository { +public: + struct SpawnEvents { + int id; + std::string zone; + int cond_id; + std::string name; + int period; + int next_minute; + int next_hour; + int next_day; + int next_month; + int next_year; + int enabled; + int action; + int argument; + int strict; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "cond_id", + "name", + "period", + "next_minute", + "next_hour", + "next_day", + "next_month", + "next_year", + "enabled", + "action", + "argument", + "strict", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spawn_events"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SpawnEvents NewEntity() + { + SpawnEvents entry{}; + + entry.id = 0; + entry.zone = ""; + entry.cond_id = 0; + entry.name = ""; + entry.period = 0; + entry.next_minute = 0; + entry.next_hour = 0; + entry.next_day = 0; + entry.next_month = 0; + entry.next_year = 0; + entry.enabled = 1; + entry.action = 0; + entry.argument = 0; + entry.strict = 0; + + return entry; + } + + static SpawnEvents GetSpawnEventsEntry( + const std::vector &spawn_eventss, + int spawn_events_id + ) + { + for (auto &spawn_events : spawn_eventss) { + if (spawn_events.id == spawn_events_id) { + return spawn_events; + } + } + + return NewEntity(); + } + + static SpawnEvents FindOne( + Database& db, + int spawn_events_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spawn_events_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SpawnEvents entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.cond_id = atoi(row[2]); + entry.name = row[3] ? row[3] : ""; + entry.period = atoi(row[4]); + entry.next_minute = atoi(row[5]); + entry.next_hour = atoi(row[6]); + entry.next_day = atoi(row[7]); + entry.next_month = atoi(row[8]); + entry.next_year = atoi(row[9]); + entry.enabled = atoi(row[10]); + entry.action = atoi(row[11]); + entry.argument = atoi(row[12]); + entry.strict = atoi(row[13]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spawn_events_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spawn_events_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SpawnEvents spawn_events_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(spawn_events_entry.zone) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(spawn_events_entry.cond_id)); + update_values.push_back(columns[3] + " = '" + EscapeString(spawn_events_entry.name) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(spawn_events_entry.period)); + update_values.push_back(columns[5] + " = " + std::to_string(spawn_events_entry.next_minute)); + update_values.push_back(columns[6] + " = " + std::to_string(spawn_events_entry.next_hour)); + update_values.push_back(columns[7] + " = " + std::to_string(spawn_events_entry.next_day)); + update_values.push_back(columns[8] + " = " + std::to_string(spawn_events_entry.next_month)); + update_values.push_back(columns[9] + " = " + std::to_string(spawn_events_entry.next_year)); + update_values.push_back(columns[10] + " = " + std::to_string(spawn_events_entry.enabled)); + update_values.push_back(columns[11] + " = " + std::to_string(spawn_events_entry.action)); + update_values.push_back(columns[12] + " = " + std::to_string(spawn_events_entry.argument)); + update_values.push_back(columns[13] + " = " + std::to_string(spawn_events_entry.strict)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spawn_events_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SpawnEvents InsertOne( + Database& db, + SpawnEvents spawn_events_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawn_events_entry.id)); + insert_values.push_back("'" + EscapeString(spawn_events_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn_events_entry.cond_id)); + insert_values.push_back("'" + EscapeString(spawn_events_entry.name) + "'"); + insert_values.push_back(std::to_string(spawn_events_entry.period)); + insert_values.push_back(std::to_string(spawn_events_entry.next_minute)); + insert_values.push_back(std::to_string(spawn_events_entry.next_hour)); + insert_values.push_back(std::to_string(spawn_events_entry.next_day)); + insert_values.push_back(std::to_string(spawn_events_entry.next_month)); + insert_values.push_back(std::to_string(spawn_events_entry.next_year)); + insert_values.push_back(std::to_string(spawn_events_entry.enabled)); + insert_values.push_back(std::to_string(spawn_events_entry.action)); + insert_values.push_back(std::to_string(spawn_events_entry.argument)); + insert_values.push_back(std::to_string(spawn_events_entry.strict)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spawn_events_entry.id = results.LastInsertedID(); + return spawn_events_entry; + } + + spawn_events_entry = NewEntity(); + + return spawn_events_entry; + } + + static int InsertMany( + Database& db, + std::vector spawn_events_entries + ) + { + std::vector insert_chunks; + + for (auto &spawn_events_entry: spawn_events_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawn_events_entry.id)); + insert_values.push_back("'" + EscapeString(spawn_events_entry.zone) + "'"); + insert_values.push_back(std::to_string(spawn_events_entry.cond_id)); + insert_values.push_back("'" + EscapeString(spawn_events_entry.name) + "'"); + insert_values.push_back(std::to_string(spawn_events_entry.period)); + insert_values.push_back(std::to_string(spawn_events_entry.next_minute)); + insert_values.push_back(std::to_string(spawn_events_entry.next_hour)); + insert_values.push_back(std::to_string(spawn_events_entry.next_day)); + insert_values.push_back(std::to_string(spawn_events_entry.next_month)); + insert_values.push_back(std::to_string(spawn_events_entry.next_year)); + insert_values.push_back(std::to_string(spawn_events_entry.enabled)); + insert_values.push_back(std::to_string(spawn_events_entry.action)); + insert_values.push_back(std::to_string(spawn_events_entry.argument)); + insert_values.push_back(std::to_string(spawn_events_entry.strict)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpawnEvents entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.cond_id = atoi(row[2]); + entry.name = row[3] ? row[3] : ""; + entry.period = atoi(row[4]); + entry.next_minute = atoi(row[5]); + entry.next_hour = atoi(row[6]); + entry.next_day = atoi(row[7]); + entry.next_month = atoi(row[8]); + entry.next_year = atoi(row[9]); + entry.enabled = atoi(row[10]); + entry.action = atoi(row[11]); + entry.argument = atoi(row[12]); + entry.strict = atoi(row[13]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpawnEvents entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.cond_id = atoi(row[2]); + entry.name = row[3] ? row[3] : ""; + entry.period = atoi(row[4]); + entry.next_minute = atoi(row[5]); + entry.next_hour = atoi(row[6]); + entry.next_day = atoi(row[7]); + entry.next_month = atoi(row[8]); + entry.next_year = atoi(row[9]); + entry.enabled = atoi(row[10]); + entry.action = atoi(row[11]); + entry.argument = atoi(row[12]); + entry.strict = atoi(row[13]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPAWN_EVENTS_REPOSITORY_H diff --git a/common/repositories/base/base_spawnentry_repository.h b/common/repositories/base/base_spawnentry_repository.h new file mode 100644 index 000000000..4a04bf7d6 --- /dev/null +++ b/common/repositories/base/base_spawnentry_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPAWNENTRY_REPOSITORY_H +#define EQEMU_BASE_SPAWNENTRY_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpawnentryRepository { +public: + struct Spawnentry { + int spawngroupID; + int npcID; + int chance; + int condition_value_filter; + }; + + static std::string PrimaryKey() + { + return std::string("spawngroupID"); + } + + static std::vector Columns() + { + return { + "spawngroupID", + "npcID", + "chance", + "condition_value_filter", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spawnentry"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Spawnentry NewEntity() + { + Spawnentry entry{}; + + entry.spawngroupID = 0; + entry.npcID = 0; + entry.chance = 0; + entry.condition_value_filter = 1; + + return entry; + } + + static Spawnentry GetSpawnentryEntry( + const std::vector &spawnentrys, + int spawnentry_id + ) + { + for (auto &spawnentry : spawnentrys) { + if (spawnentry.spawngroupID == spawnentry_id) { + return spawnentry; + } + } + + return NewEntity(); + } + + static Spawnentry FindOne( + Database& db, + int spawnentry_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spawnentry_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Spawnentry entry{}; + + entry.spawngroupID = atoi(row[0]); + entry.npcID = atoi(row[1]); + entry.chance = atoi(row[2]); + entry.condition_value_filter = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spawnentry_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spawnentry_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Spawnentry spawnentry_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(spawnentry_entry.spawngroupID)); + update_values.push_back(columns[1] + " = " + std::to_string(spawnentry_entry.npcID)); + update_values.push_back(columns[2] + " = " + std::to_string(spawnentry_entry.chance)); + update_values.push_back(columns[3] + " = " + std::to_string(spawnentry_entry.condition_value_filter)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spawnentry_entry.spawngroupID + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Spawnentry InsertOne( + Database& db, + Spawnentry spawnentry_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawnentry_entry.spawngroupID)); + insert_values.push_back(std::to_string(spawnentry_entry.npcID)); + insert_values.push_back(std::to_string(spawnentry_entry.chance)); + insert_values.push_back(std::to_string(spawnentry_entry.condition_value_filter)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spawnentry_entry.spawngroupID = results.LastInsertedID(); + return spawnentry_entry; + } + + spawnentry_entry = NewEntity(); + + return spawnentry_entry; + } + + static int InsertMany( + Database& db, + std::vector spawnentry_entries + ) + { + std::vector insert_chunks; + + for (auto &spawnentry_entry: spawnentry_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawnentry_entry.spawngroupID)); + insert_values.push_back(std::to_string(spawnentry_entry.npcID)); + insert_values.push_back(std::to_string(spawnentry_entry.chance)); + insert_values.push_back(std::to_string(spawnentry_entry.condition_value_filter)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Spawnentry entry{}; + + entry.spawngroupID = atoi(row[0]); + entry.npcID = atoi(row[1]); + entry.chance = atoi(row[2]); + entry.condition_value_filter = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Spawnentry entry{}; + + entry.spawngroupID = atoi(row[0]); + entry.npcID = atoi(row[1]); + entry.chance = atoi(row[2]); + entry.condition_value_filter = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPAWNENTRY_REPOSITORY_H diff --git a/common/repositories/base/base_spawngroup_repository.h b/common/repositories/base/base_spawngroup_repository.h new file mode 100644 index 000000000..0baba76aa --- /dev/null +++ b/common/repositories/base/base_spawngroup_repository.h @@ -0,0 +1,391 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPAWNGROUP_REPOSITORY_H +#define EQEMU_BASE_SPAWNGROUP_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpawngroupRepository { +public: + struct Spawngroup { + int id; + std::string name; + int spawn_limit; + float dist; + float max_x; + float min_x; + float max_y; + float min_y; + int delay; + int mindelay; + int despawn; + int despawn_timer; + int wp_spawns; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "spawn_limit", + "dist", + "max_x", + "min_x", + "max_y", + "min_y", + "delay", + "mindelay", + "despawn", + "despawn_timer", + "wp_spawns", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spawngroup"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Spawngroup NewEntity() + { + Spawngroup entry{}; + + entry.id = 0; + entry.name = ""; + entry.spawn_limit = 0; + entry.dist = 0; + entry.max_x = 0; + entry.min_x = 0; + entry.max_y = 0; + entry.min_y = 0; + entry.delay = 45000; + entry.mindelay = 15000; + entry.despawn = 0; + entry.despawn_timer = 100; + entry.wp_spawns = 0; + + return entry; + } + + static Spawngroup GetSpawngroupEntry( + const std::vector &spawngroups, + int spawngroup_id + ) + { + for (auto &spawngroup : spawngroups) { + if (spawngroup.id == spawngroup_id) { + return spawngroup; + } + } + + return NewEntity(); + } + + static Spawngroup FindOne( + Database& db, + int spawngroup_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spawngroup_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Spawngroup entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.spawn_limit = atoi(row[2]); + entry.dist = static_cast(atof(row[3])); + entry.max_x = static_cast(atof(row[4])); + entry.min_x = static_cast(atof(row[5])); + entry.max_y = static_cast(atof(row[6])); + entry.min_y = static_cast(atof(row[7])); + entry.delay = atoi(row[8]); + entry.mindelay = atoi(row[9]); + entry.despawn = atoi(row[10]); + entry.despawn_timer = atoi(row[11]); + entry.wp_spawns = atoi(row[12]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spawngroup_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spawngroup_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Spawngroup spawngroup_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(spawngroup_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(spawngroup_entry.spawn_limit)); + update_values.push_back(columns[3] + " = " + std::to_string(spawngroup_entry.dist)); + update_values.push_back(columns[4] + " = " + std::to_string(spawngroup_entry.max_x)); + update_values.push_back(columns[5] + " = " + std::to_string(spawngroup_entry.min_x)); + update_values.push_back(columns[6] + " = " + std::to_string(spawngroup_entry.max_y)); + update_values.push_back(columns[7] + " = " + std::to_string(spawngroup_entry.min_y)); + update_values.push_back(columns[8] + " = " + std::to_string(spawngroup_entry.delay)); + update_values.push_back(columns[9] + " = " + std::to_string(spawngroup_entry.mindelay)); + update_values.push_back(columns[10] + " = " + std::to_string(spawngroup_entry.despawn)); + update_values.push_back(columns[11] + " = " + std::to_string(spawngroup_entry.despawn_timer)); + update_values.push_back(columns[12] + " = " + std::to_string(spawngroup_entry.wp_spawns)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spawngroup_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Spawngroup InsertOne( + Database& db, + Spawngroup spawngroup_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawngroup_entry.id)); + insert_values.push_back("'" + EscapeString(spawngroup_entry.name) + "'"); + insert_values.push_back(std::to_string(spawngroup_entry.spawn_limit)); + insert_values.push_back(std::to_string(spawngroup_entry.dist)); + insert_values.push_back(std::to_string(spawngroup_entry.max_x)); + insert_values.push_back(std::to_string(spawngroup_entry.min_x)); + insert_values.push_back(std::to_string(spawngroup_entry.max_y)); + insert_values.push_back(std::to_string(spawngroup_entry.min_y)); + insert_values.push_back(std::to_string(spawngroup_entry.delay)); + insert_values.push_back(std::to_string(spawngroup_entry.mindelay)); + insert_values.push_back(std::to_string(spawngroup_entry.despawn)); + insert_values.push_back(std::to_string(spawngroup_entry.despawn_timer)); + insert_values.push_back(std::to_string(spawngroup_entry.wp_spawns)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spawngroup_entry.id = results.LastInsertedID(); + return spawngroup_entry; + } + + spawngroup_entry = NewEntity(); + + return spawngroup_entry; + } + + static int InsertMany( + Database& db, + std::vector spawngroup_entries + ) + { + std::vector insert_chunks; + + for (auto &spawngroup_entry: spawngroup_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spawngroup_entry.id)); + insert_values.push_back("'" + EscapeString(spawngroup_entry.name) + "'"); + insert_values.push_back(std::to_string(spawngroup_entry.spawn_limit)); + insert_values.push_back(std::to_string(spawngroup_entry.dist)); + insert_values.push_back(std::to_string(spawngroup_entry.max_x)); + insert_values.push_back(std::to_string(spawngroup_entry.min_x)); + insert_values.push_back(std::to_string(spawngroup_entry.max_y)); + insert_values.push_back(std::to_string(spawngroup_entry.min_y)); + insert_values.push_back(std::to_string(spawngroup_entry.delay)); + insert_values.push_back(std::to_string(spawngroup_entry.mindelay)); + insert_values.push_back(std::to_string(spawngroup_entry.despawn)); + insert_values.push_back(std::to_string(spawngroup_entry.despawn_timer)); + insert_values.push_back(std::to_string(spawngroup_entry.wp_spawns)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Spawngroup entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.spawn_limit = atoi(row[2]); + entry.dist = static_cast(atof(row[3])); + entry.max_x = static_cast(atof(row[4])); + entry.min_x = static_cast(atof(row[5])); + entry.max_y = static_cast(atof(row[6])); + entry.min_y = static_cast(atof(row[7])); + entry.delay = atoi(row[8]); + entry.mindelay = atoi(row[9]); + entry.despawn = atoi(row[10]); + entry.despawn_timer = atoi(row[11]); + entry.wp_spawns = atoi(row[12]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Spawngroup entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.spawn_limit = atoi(row[2]); + entry.dist = static_cast(atof(row[3])); + entry.max_x = static_cast(atof(row[4])); + entry.min_x = static_cast(atof(row[5])); + entry.max_y = static_cast(atof(row[6])); + entry.min_y = static_cast(atof(row[7])); + entry.delay = atoi(row[8]); + entry.mindelay = atoi(row[9]); + entry.despawn = atoi(row[10]); + entry.despawn_timer = atoi(row[11]); + entry.wp_spawns = atoi(row[12]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPAWNGROUP_REPOSITORY_H diff --git a/common/repositories/base/base_spell_buckets_repository.h b/common/repositories/base/base_spell_buckets_repository.h new file mode 100644 index 000000000..39ce3ff42 --- /dev/null +++ b/common/repositories/base/base_spell_buckets_repository.h @@ -0,0 +1,302 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPELL_BUCKETS_REPOSITORY_H +#define EQEMU_BASE_SPELL_BUCKETS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpellBucketsRepository { +public: + struct SpellBuckets { + int spellid; + std::string key; + std::string value; + }; + + static std::string PrimaryKey() + { + return std::string("spellid"); + } + + static std::vector Columns() + { + return { + "spellid", + "key", + "value", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spell_buckets"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SpellBuckets NewEntity() + { + SpellBuckets entry{}; + + entry.spellid = 0; + entry.key = ""; + entry.value = ""; + + return entry; + } + + static SpellBuckets GetSpellBucketsEntry( + const std::vector &spell_bucketss, + int spell_buckets_id + ) + { + for (auto &spell_buckets : spell_bucketss) { + if (spell_buckets.spellid == spell_buckets_id) { + return spell_buckets; + } + } + + return NewEntity(); + } + + static SpellBuckets FindOne( + Database& db, + int spell_buckets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spell_buckets_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SpellBuckets entry{}; + + entry.spellid = atoi(row[0]); + entry.key = row[1] ? row[1] : ""; + entry.value = row[2] ? row[2] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spell_buckets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spell_buckets_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SpellBuckets spell_buckets_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(spell_buckets_entry.spellid)); + update_values.push_back(columns[1] + " = '" + EscapeString(spell_buckets_entry.key) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(spell_buckets_entry.value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spell_buckets_entry.spellid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SpellBuckets InsertOne( + Database& db, + SpellBuckets spell_buckets_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spell_buckets_entry.spellid)); + insert_values.push_back("'" + EscapeString(spell_buckets_entry.key) + "'"); + insert_values.push_back("'" + EscapeString(spell_buckets_entry.value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spell_buckets_entry.spellid = results.LastInsertedID(); + return spell_buckets_entry; + } + + spell_buckets_entry = NewEntity(); + + return spell_buckets_entry; + } + + static int InsertMany( + Database& db, + std::vector spell_buckets_entries + ) + { + std::vector insert_chunks; + + for (auto &spell_buckets_entry: spell_buckets_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spell_buckets_entry.spellid)); + insert_values.push_back("'" + EscapeString(spell_buckets_entry.key) + "'"); + insert_values.push_back("'" + EscapeString(spell_buckets_entry.value) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpellBuckets entry{}; + + entry.spellid = atoi(row[0]); + entry.key = row[1] ? row[1] : ""; + entry.value = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpellBuckets entry{}; + + entry.spellid = atoi(row[0]); + entry.key = row[1] ? row[1] : ""; + entry.value = row[2] ? row[2] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPELL_BUCKETS_REPOSITORY_H diff --git a/common/repositories/base/base_spell_globals_repository.h b/common/repositories/base/base_spell_globals_repository.h new file mode 100644 index 000000000..40ce563ce --- /dev/null +++ b/common/repositories/base/base_spell_globals_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPELL_GLOBALS_REPOSITORY_H +#define EQEMU_BASE_SPELL_GLOBALS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpellGlobalsRepository { +public: + struct SpellGlobals { + int spellid; + std::string spell_name; + std::string qglobal; + std::string value; + }; + + static std::string PrimaryKey() + { + return std::string("spellid"); + } + + static std::vector Columns() + { + return { + "spellid", + "spell_name", + "qglobal", + "value", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spell_globals"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SpellGlobals NewEntity() + { + SpellGlobals entry{}; + + entry.spellid = 0; + entry.spell_name = ""; + entry.qglobal = ""; + entry.value = ""; + + return entry; + } + + static SpellGlobals GetSpellGlobalsEntry( + const std::vector &spell_globalss, + int spell_globals_id + ) + { + for (auto &spell_globals : spell_globalss) { + if (spell_globals.spellid == spell_globals_id) { + return spell_globals; + } + } + + return NewEntity(); + } + + static SpellGlobals FindOne( + Database& db, + int spell_globals_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spell_globals_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SpellGlobals entry{}; + + entry.spellid = atoi(row[0]); + entry.spell_name = row[1] ? row[1] : ""; + entry.qglobal = row[2] ? row[2] : ""; + entry.value = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spell_globals_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spell_globals_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SpellGlobals spell_globals_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(spell_globals_entry.spellid)); + update_values.push_back(columns[1] + " = '" + EscapeString(spell_globals_entry.spell_name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(spell_globals_entry.qglobal) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(spell_globals_entry.value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spell_globals_entry.spellid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SpellGlobals InsertOne( + Database& db, + SpellGlobals spell_globals_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spell_globals_entry.spellid)); + insert_values.push_back("'" + EscapeString(spell_globals_entry.spell_name) + "'"); + insert_values.push_back("'" + EscapeString(spell_globals_entry.qglobal) + "'"); + insert_values.push_back("'" + EscapeString(spell_globals_entry.value) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spell_globals_entry.spellid = results.LastInsertedID(); + return spell_globals_entry; + } + + spell_globals_entry = NewEntity(); + + return spell_globals_entry; + } + + static int InsertMany( + Database& db, + std::vector spell_globals_entries + ) + { + std::vector insert_chunks; + + for (auto &spell_globals_entry: spell_globals_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spell_globals_entry.spellid)); + insert_values.push_back("'" + EscapeString(spell_globals_entry.spell_name) + "'"); + insert_values.push_back("'" + EscapeString(spell_globals_entry.qglobal) + "'"); + insert_values.push_back("'" + EscapeString(spell_globals_entry.value) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpellGlobals entry{}; + + entry.spellid = atoi(row[0]); + entry.spell_name = row[1] ? row[1] : ""; + entry.qglobal = row[2] ? row[2] : ""; + entry.value = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpellGlobals entry{}; + + entry.spellid = atoi(row[0]); + entry.spell_name = row[1] ? row[1] : ""; + entry.qglobal = row[2] ? row[2] : ""; + entry.value = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPELL_GLOBALS_REPOSITORY_H diff --git a/common/repositories/base/base_spells_new_repository.h b/common/repositories/base/base_spells_new_repository.h new file mode 100644 index 000000000..e59ce3b28 --- /dev/null +++ b/common/repositories/base/base_spells_new_repository.h @@ -0,0 +1,2408 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_SPELLS_NEW_REPOSITORY_H +#define EQEMU_BASE_SPELLS_NEW_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseSpellsNewRepository { +public: + struct SpellsNew { + int id; + std::string name; + std::string player_1; + std::string teleport_zone; + std::string you_cast; + std::string other_casts; + std::string cast_on_you; + std::string cast_on_other; + std::string spell_fades; + int range; + int aoerange; + int pushback; + int pushup; + int cast_time; + int recovery_time; + int recast_time; + int buffdurationformula; + int buffduration; + int AEDuration; + int mana; + int effect_base_value1; + int effect_base_value2; + int effect_base_value3; + int effect_base_value4; + int effect_base_value5; + int effect_base_value6; + int effect_base_value7; + int effect_base_value8; + int effect_base_value9; + int effect_base_value10; + int effect_base_value11; + int effect_base_value12; + int effect_limit_value1; + int effect_limit_value2; + int effect_limit_value3; + int effect_limit_value4; + int effect_limit_value5; + int effect_limit_value6; + int effect_limit_value7; + int effect_limit_value8; + int effect_limit_value9; + int effect_limit_value10; + int effect_limit_value11; + int effect_limit_value12; + int max1; + int max2; + int max3; + int max4; + int max5; + int max6; + int max7; + int max8; + int max9; + int max10; + int max11; + int max12; + int icon; + int memicon; + int components1; + int components2; + int components3; + int components4; + int component_counts1; + int component_counts2; + int component_counts3; + int component_counts4; + int NoexpendReagent1; + int NoexpendReagent2; + int NoexpendReagent3; + int NoexpendReagent4; + int formula1; + int formula2; + int formula3; + int formula4; + int formula5; + int formula6; + int formula7; + int formula8; + int formula9; + int formula10; + int formula11; + int formula12; + int LightType; + int goodEffect; + int Activated; + int resisttype; + int effectid1; + int effectid2; + int effectid3; + int effectid4; + int effectid5; + int effectid6; + int effectid7; + int effectid8; + int effectid9; + int effectid10; + int effectid11; + int effectid12; + int targettype; + int basediff; + int skill; + int zonetype; + int EnvironmentType; + int TimeOfDay; + int classes1; + int classes2; + int classes3; + int classes4; + int classes5; + int classes6; + int classes7; + int classes8; + int classes9; + int classes10; + int classes11; + int classes12; + int classes13; + int classes14; + int classes15; + int classes16; + int CastingAnim; + int TargetAnim; + int TravelType; + int SpellAffectIndex; + int disallow_sit; + int deities0; + int deities1; + int deities2; + int deities3; + int deities4; + int deities5; + int deities6; + int deities7; + int deities8; + int deities9; + int deities10; + int deities11; + int deities12; + int deities13; + int deities14; + int deities15; + int deities16; + int field142; + int field143; + int new_icon; + int spellanim; + int uninterruptable; + int ResistDiff; + int dot_stacking_exempt; + int deleteable; + int RecourseLink; + int no_partial_resist; + int field152; + int field153; + int short_buff_box; + int descnum; + int typedescnum; + int effectdescnum; + int effectdescnum2; + int npc_no_los; + int field160; + int reflectable; + int bonushate; + int field163; + int field164; + int ldon_trap; + int EndurCost; + int EndurTimerIndex; + int IsDiscipline; + int field169; + int field170; + int field171; + int field172; + int HateAdded; + int EndurUpkeep; + int numhitstype; + int numhits; + int pvpresistbase; + int pvpresistcalc; + int pvpresistcap; + int spell_category; + int field181; + int field182; + int pcnpc_only_flag; + int cast_not_standing; + int can_mgb; + int nodispell; + int npc_category; + int npc_usefulness; + int MinResist; + int MaxResist; + int viral_targets; + int viral_timer; + int nimbuseffect; + int ConeStartAngle; + int ConeStopAngle; + int sneaking; + int not_extendable; + int field198; + int field199; + int suspendable; + int viral_range; + int songcap; + int field203; + int field204; + int no_block; + int field206; + int spellgroup; + int rank; + int field209; + int field210; + int CastRestriction; + int allowrest; + int InCombat; + int OutofCombat; + int field215; + int field216; + int field217; + int aemaxtargets; + int maxtargets; + int field220; + int field221; + int field222; + int field223; + int persistdeath; + int field225; + int field226; + float min_dist; + float min_dist_mod; + float max_dist; + float max_dist_mod; + int min_range; + int field232; + int field233; + int field234; + int field235; + int field236; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "player_1", + "teleport_zone", + "you_cast", + "other_casts", + "cast_on_you", + "cast_on_other", + "spell_fades", + "range", + "aoerange", + "pushback", + "pushup", + "cast_time", + "recovery_time", + "recast_time", + "buffdurationformula", + "buffduration", + "AEDuration", + "mana", + "effect_base_value1", + "effect_base_value2", + "effect_base_value3", + "effect_base_value4", + "effect_base_value5", + "effect_base_value6", + "effect_base_value7", + "effect_base_value8", + "effect_base_value9", + "effect_base_value10", + "effect_base_value11", + "effect_base_value12", + "effect_limit_value1", + "effect_limit_value2", + "effect_limit_value3", + "effect_limit_value4", + "effect_limit_value5", + "effect_limit_value6", + "effect_limit_value7", + "effect_limit_value8", + "effect_limit_value9", + "effect_limit_value10", + "effect_limit_value11", + "effect_limit_value12", + "max1", + "max2", + "max3", + "max4", + "max5", + "max6", + "max7", + "max8", + "max9", + "max10", + "max11", + "max12", + "icon", + "memicon", + "components1", + "components2", + "components3", + "components4", + "component_counts1", + "component_counts2", + "component_counts3", + "component_counts4", + "NoexpendReagent1", + "NoexpendReagent2", + "NoexpendReagent3", + "NoexpendReagent4", + "formula1", + "formula2", + "formula3", + "formula4", + "formula5", + "formula6", + "formula7", + "formula8", + "formula9", + "formula10", + "formula11", + "formula12", + "LightType", + "goodEffect", + "Activated", + "resisttype", + "effectid1", + "effectid2", + "effectid3", + "effectid4", + "effectid5", + "effectid6", + "effectid7", + "effectid8", + "effectid9", + "effectid10", + "effectid11", + "effectid12", + "targettype", + "basediff", + "skill", + "zonetype", + "EnvironmentType", + "TimeOfDay", + "classes1", + "classes2", + "classes3", + "classes4", + "classes5", + "classes6", + "classes7", + "classes8", + "classes9", + "classes10", + "classes11", + "classes12", + "classes13", + "classes14", + "classes15", + "classes16", + "CastingAnim", + "TargetAnim", + "TravelType", + "SpellAffectIndex", + "disallow_sit", + "deities0", + "deities1", + "deities2", + "deities3", + "deities4", + "deities5", + "deities6", + "deities7", + "deities8", + "deities9", + "deities10", + "deities11", + "deities12", + "deities13", + "deities14", + "deities15", + "deities16", + "field142", + "field143", + "new_icon", + "spellanim", + "uninterruptable", + "ResistDiff", + "dot_stacking_exempt", + "deleteable", + "RecourseLink", + "no_partial_resist", + "field152", + "field153", + "short_buff_box", + "descnum", + "typedescnum", + "effectdescnum", + "effectdescnum2", + "npc_no_los", + "field160", + "reflectable", + "bonushate", + "field163", + "field164", + "ldon_trap", + "EndurCost", + "EndurTimerIndex", + "IsDiscipline", + "field169", + "field170", + "field171", + "field172", + "HateAdded", + "EndurUpkeep", + "numhitstype", + "numhits", + "pvpresistbase", + "pvpresistcalc", + "pvpresistcap", + "spell_category", + "field181", + "field182", + "pcnpc_only_flag", + "cast_not_standing", + "can_mgb", + "nodispell", + "npc_category", + "npc_usefulness", + "MinResist", + "MaxResist", + "viral_targets", + "viral_timer", + "nimbuseffect", + "ConeStartAngle", + "ConeStopAngle", + "sneaking", + "not_extendable", + "field198", + "field199", + "suspendable", + "viral_range", + "songcap", + "field203", + "field204", + "no_block", + "field206", + "spellgroup", + "rank", + "field209", + "field210", + "CastRestriction", + "allowrest", + "InCombat", + "OutofCombat", + "field215", + "field216", + "field217", + "aemaxtargets", + "maxtargets", + "field220", + "field221", + "field222", + "field223", + "persistdeath", + "field225", + "field226", + "min_dist", + "min_dist_mod", + "max_dist", + "max_dist_mod", + "min_range", + "field232", + "field233", + "field234", + "field235", + "field236", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("spells_new"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static SpellsNew NewEntity() + { + SpellsNew entry{}; + + entry.id = 0; + entry.name = ""; + entry.player_1 = "BLUE_TRAIL"; + entry.teleport_zone = ""; + entry.you_cast = ""; + entry.other_casts = ""; + entry.cast_on_you = ""; + entry.cast_on_other = ""; + entry.spell_fades = ""; + entry.range = 100; + entry.aoerange = 0; + entry.pushback = 0; + entry.pushup = 0; + entry.cast_time = 0; + entry.recovery_time = 0; + entry.recast_time = 0; + entry.buffdurationformula = 7; + entry.buffduration = 65; + entry.AEDuration = 0; + entry.mana = 0; + entry.effect_base_value1 = 100; + entry.effect_base_value2 = 0; + entry.effect_base_value3 = 0; + entry.effect_base_value4 = 0; + entry.effect_base_value5 = 0; + entry.effect_base_value6 = 0; + entry.effect_base_value7 = 0; + entry.effect_base_value8 = 0; + entry.effect_base_value9 = 0; + entry.effect_base_value10 = 0; + entry.effect_base_value11 = 0; + entry.effect_base_value12 = 0; + entry.effect_limit_value1 = 0; + entry.effect_limit_value2 = 0; + entry.effect_limit_value3 = 0; + entry.effect_limit_value4 = 0; + entry.effect_limit_value5 = 0; + entry.effect_limit_value6 = 0; + entry.effect_limit_value7 = 0; + entry.effect_limit_value8 = 0; + entry.effect_limit_value9 = 0; + entry.effect_limit_value10 = 0; + entry.effect_limit_value11 = 0; + entry.effect_limit_value12 = 0; + entry.max1 = 0; + entry.max2 = 0; + entry.max3 = 0; + entry.max4 = 0; + entry.max5 = 0; + entry.max6 = 0; + entry.max7 = 0; + entry.max8 = 0; + entry.max9 = 0; + entry.max10 = 0; + entry.max11 = 0; + entry.max12 = 0; + entry.icon = 0; + entry.memicon = 0; + entry.components1 = -1; + entry.components2 = -1; + entry.components3 = -1; + entry.components4 = -1; + entry.component_counts1 = 1; + entry.component_counts2 = 1; + entry.component_counts3 = 1; + entry.component_counts4 = 1; + entry.NoexpendReagent1 = -1; + entry.NoexpendReagent2 = -1; + entry.NoexpendReagent3 = -1; + entry.NoexpendReagent4 = -1; + entry.formula1 = 100; + entry.formula2 = 100; + entry.formula3 = 100; + entry.formula4 = 100; + entry.formula5 = 100; + entry.formula6 = 100; + entry.formula7 = 100; + entry.formula8 = 100; + entry.formula9 = 100; + entry.formula10 = 100; + entry.formula11 = 100; + entry.formula12 = 100; + entry.LightType = 0; + entry.goodEffect = 0; + entry.Activated = 0; + entry.resisttype = 0; + entry.effectid1 = 254; + entry.effectid2 = 254; + entry.effectid3 = 254; + entry.effectid4 = 254; + entry.effectid5 = 254; + entry.effectid6 = 254; + entry.effectid7 = 254; + entry.effectid8 = 254; + entry.effectid9 = 254; + entry.effectid10 = 254; + entry.effectid11 = 254; + entry.effectid12 = 254; + entry.targettype = 2; + entry.basediff = 0; + entry.skill = 98; + entry.zonetype = -1; + entry.EnvironmentType = 0; + entry.TimeOfDay = 0; + entry.classes1 = 255; + entry.classes2 = 255; + entry.classes3 = 255; + entry.classes4 = 255; + entry.classes5 = 255; + entry.classes6 = 255; + entry.classes7 = 255; + entry.classes8 = 255; + entry.classes9 = 255; + entry.classes10 = 255; + entry.classes11 = 255; + entry.classes12 = 255; + entry.classes13 = 255; + entry.classes14 = 255; + entry.classes15 = 255; + entry.classes16 = 255; + entry.CastingAnim = 44; + entry.TargetAnim = 13; + entry.TravelType = 0; + entry.SpellAffectIndex = -1; + entry.disallow_sit = 0; + entry.deities0 = 0; + entry.deities1 = 0; + entry.deities2 = 0; + entry.deities3 = 0; + entry.deities4 = 0; + entry.deities5 = 0; + entry.deities6 = 0; + entry.deities7 = 0; + entry.deities8 = 0; + entry.deities9 = 0; + entry.deities10 = 0; + entry.deities11 = 0; + entry.deities12 = 0; + entry.deities13 = 0; + entry.deities14 = 0; + entry.deities15 = 0; + entry.deities16 = 0; + entry.field142 = 100; + entry.field143 = 0; + entry.new_icon = 161; + entry.spellanim = 0; + entry.uninterruptable = 0; + entry.ResistDiff = -150; + entry.dot_stacking_exempt = 0; + entry.deleteable = 0; + entry.RecourseLink = 0; + entry.no_partial_resist = 0; + entry.field152 = 0; + entry.field153 = 0; + entry.short_buff_box = -1; + entry.descnum = 0; + entry.typedescnum = 0; + entry.effectdescnum = 0; + entry.effectdescnum2 = 0; + entry.npc_no_los = 0; + entry.field160 = 0; + entry.reflectable = 0; + entry.bonushate = 0; + entry.field163 = 100; + entry.field164 = -150; + entry.ldon_trap = 0; + entry.EndurCost = 0; + entry.EndurTimerIndex = 0; + entry.IsDiscipline = 0; + entry.field169 = 0; + entry.field170 = 0; + entry.field171 = 0; + entry.field172 = 0; + entry.HateAdded = 0; + entry.EndurUpkeep = 0; + entry.numhitstype = 0; + entry.numhits = 0; + entry.pvpresistbase = -150; + entry.pvpresistcalc = 100; + entry.pvpresistcap = -150; + entry.spell_category = -99; + entry.field181 = 7; + entry.field182 = 65; + entry.pcnpc_only_flag = 0; + entry.cast_not_standing = 0; + entry.can_mgb = 0; + entry.nodispell = -1; + entry.npc_category = 0; + entry.npc_usefulness = 0; + entry.MinResist = 0; + entry.MaxResist = 0; + entry.viral_targets = 0; + entry.viral_timer = 0; + entry.nimbuseffect = 0; + entry.ConeStartAngle = 0; + entry.ConeStopAngle = 0; + entry.sneaking = 0; + entry.not_extendable = 0; + entry.field198 = 0; + entry.field199 = 1; + entry.suspendable = 0; + entry.viral_range = 0; + entry.songcap = 0; + entry.field203 = 0; + entry.field204 = 0; + entry.no_block = 0; + entry.field206 = -1; + entry.spellgroup = 0; + entry.rank = 0; + entry.field209 = 0; + entry.field210 = 1; + entry.CastRestriction = 0; + entry.allowrest = 0; + entry.InCombat = 0; + entry.OutofCombat = 0; + entry.field215 = 0; + entry.field216 = 0; + entry.field217 = 0; + entry.aemaxtargets = 0; + entry.maxtargets = 0; + entry.field220 = 0; + entry.field221 = 0; + entry.field222 = 0; + entry.field223 = 0; + entry.persistdeath = 0; + entry.field225 = 0; + entry.field226 = 0; + entry.min_dist = 0; + entry.min_dist_mod = 0; + entry.max_dist = 0; + entry.max_dist_mod = 0; + entry.min_range = 0; + entry.field232 = 0; + entry.field233 = 0; + entry.field234 = 0; + entry.field235 = 0; + entry.field236 = 0; + + return entry; + } + + static SpellsNew GetSpellsNewEntry( + const std::vector &spells_news, + int spells_new_id + ) + { + for (auto &spells_new : spells_news) { + if (spells_new.id == spells_new_id) { + return spells_new; + } + } + + return NewEntity(); + } + + static SpellsNew FindOne( + Database& db, + int spells_new_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + spells_new_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + SpellsNew entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.player_1 = row[2] ? row[2] : ""; + entry.teleport_zone = row[3] ? row[3] : ""; + entry.you_cast = row[4] ? row[4] : ""; + entry.other_casts = row[5] ? row[5] : ""; + entry.cast_on_you = row[6] ? row[6] : ""; + entry.cast_on_other = row[7] ? row[7] : ""; + entry.spell_fades = row[8] ? row[8] : ""; + entry.range = atoi(row[9]); + entry.aoerange = atoi(row[10]); + entry.pushback = atoi(row[11]); + entry.pushup = atoi(row[12]); + entry.cast_time = atoi(row[13]); + entry.recovery_time = atoi(row[14]); + entry.recast_time = atoi(row[15]); + entry.buffdurationformula = atoi(row[16]); + entry.buffduration = atoi(row[17]); + entry.AEDuration = atoi(row[18]); + entry.mana = atoi(row[19]); + entry.effect_base_value1 = atoi(row[20]); + entry.effect_base_value2 = atoi(row[21]); + entry.effect_base_value3 = atoi(row[22]); + entry.effect_base_value4 = atoi(row[23]); + entry.effect_base_value5 = atoi(row[24]); + entry.effect_base_value6 = atoi(row[25]); + entry.effect_base_value7 = atoi(row[26]); + entry.effect_base_value8 = atoi(row[27]); + entry.effect_base_value9 = atoi(row[28]); + entry.effect_base_value10 = atoi(row[29]); + entry.effect_base_value11 = atoi(row[30]); + entry.effect_base_value12 = atoi(row[31]); + entry.effect_limit_value1 = atoi(row[32]); + entry.effect_limit_value2 = atoi(row[33]); + entry.effect_limit_value3 = atoi(row[34]); + entry.effect_limit_value4 = atoi(row[35]); + entry.effect_limit_value5 = atoi(row[36]); + entry.effect_limit_value6 = atoi(row[37]); + entry.effect_limit_value7 = atoi(row[38]); + entry.effect_limit_value8 = atoi(row[39]); + entry.effect_limit_value9 = atoi(row[40]); + entry.effect_limit_value10 = atoi(row[41]); + entry.effect_limit_value11 = atoi(row[42]); + entry.effect_limit_value12 = atoi(row[43]); + entry.max1 = atoi(row[44]); + entry.max2 = atoi(row[45]); + entry.max3 = atoi(row[46]); + entry.max4 = atoi(row[47]); + entry.max5 = atoi(row[48]); + entry.max6 = atoi(row[49]); + entry.max7 = atoi(row[50]); + entry.max8 = atoi(row[51]); + entry.max9 = atoi(row[52]); + entry.max10 = atoi(row[53]); + entry.max11 = atoi(row[54]); + entry.max12 = atoi(row[55]); + entry.icon = atoi(row[56]); + entry.memicon = atoi(row[57]); + entry.components1 = atoi(row[58]); + entry.components2 = atoi(row[59]); + entry.components3 = atoi(row[60]); + entry.components4 = atoi(row[61]); + entry.component_counts1 = atoi(row[62]); + entry.component_counts2 = atoi(row[63]); + entry.component_counts3 = atoi(row[64]); + entry.component_counts4 = atoi(row[65]); + entry.NoexpendReagent1 = atoi(row[66]); + entry.NoexpendReagent2 = atoi(row[67]); + entry.NoexpendReagent3 = atoi(row[68]); + entry.NoexpendReagent4 = atoi(row[69]); + entry.formula1 = atoi(row[70]); + entry.formula2 = atoi(row[71]); + entry.formula3 = atoi(row[72]); + entry.formula4 = atoi(row[73]); + entry.formula5 = atoi(row[74]); + entry.formula6 = atoi(row[75]); + entry.formula7 = atoi(row[76]); + entry.formula8 = atoi(row[77]); + entry.formula9 = atoi(row[78]); + entry.formula10 = atoi(row[79]); + entry.formula11 = atoi(row[80]); + entry.formula12 = atoi(row[81]); + entry.LightType = atoi(row[82]); + entry.goodEffect = atoi(row[83]); + entry.Activated = atoi(row[84]); + entry.resisttype = atoi(row[85]); + entry.effectid1 = atoi(row[86]); + entry.effectid2 = atoi(row[87]); + entry.effectid3 = atoi(row[88]); + entry.effectid4 = atoi(row[89]); + entry.effectid5 = atoi(row[90]); + entry.effectid6 = atoi(row[91]); + entry.effectid7 = atoi(row[92]); + entry.effectid8 = atoi(row[93]); + entry.effectid9 = atoi(row[94]); + entry.effectid10 = atoi(row[95]); + entry.effectid11 = atoi(row[96]); + entry.effectid12 = atoi(row[97]); + entry.targettype = atoi(row[98]); + entry.basediff = atoi(row[99]); + entry.skill = atoi(row[100]); + entry.zonetype = atoi(row[101]); + entry.EnvironmentType = atoi(row[102]); + entry.TimeOfDay = atoi(row[103]); + entry.classes1 = atoi(row[104]); + entry.classes2 = atoi(row[105]); + entry.classes3 = atoi(row[106]); + entry.classes4 = atoi(row[107]); + entry.classes5 = atoi(row[108]); + entry.classes6 = atoi(row[109]); + entry.classes7 = atoi(row[110]); + entry.classes8 = atoi(row[111]); + entry.classes9 = atoi(row[112]); + entry.classes10 = atoi(row[113]); + entry.classes11 = atoi(row[114]); + entry.classes12 = atoi(row[115]); + entry.classes13 = atoi(row[116]); + entry.classes14 = atoi(row[117]); + entry.classes15 = atoi(row[118]); + entry.classes16 = atoi(row[119]); + entry.CastingAnim = atoi(row[120]); + entry.TargetAnim = atoi(row[121]); + entry.TravelType = atoi(row[122]); + entry.SpellAffectIndex = atoi(row[123]); + entry.disallow_sit = atoi(row[124]); + entry.deities0 = atoi(row[125]); + entry.deities1 = atoi(row[126]); + entry.deities2 = atoi(row[127]); + entry.deities3 = atoi(row[128]); + entry.deities4 = atoi(row[129]); + entry.deities5 = atoi(row[130]); + entry.deities6 = atoi(row[131]); + entry.deities7 = atoi(row[132]); + entry.deities8 = atoi(row[133]); + entry.deities9 = atoi(row[134]); + entry.deities10 = atoi(row[135]); + entry.deities11 = atoi(row[136]); + entry.deities12 = atoi(row[137]); + entry.deities13 = atoi(row[138]); + entry.deities14 = atoi(row[139]); + entry.deities15 = atoi(row[140]); + entry.deities16 = atoi(row[141]); + entry.field142 = atoi(row[142]); + entry.field143 = atoi(row[143]); + entry.new_icon = atoi(row[144]); + entry.spellanim = atoi(row[145]); + entry.uninterruptable = atoi(row[146]); + entry.ResistDiff = atoi(row[147]); + entry.dot_stacking_exempt = atoi(row[148]); + entry.deleteable = atoi(row[149]); + entry.RecourseLink = atoi(row[150]); + entry.no_partial_resist = atoi(row[151]); + entry.field152 = atoi(row[152]); + entry.field153 = atoi(row[153]); + entry.short_buff_box = atoi(row[154]); + entry.descnum = atoi(row[155]); + entry.typedescnum = atoi(row[156]); + entry.effectdescnum = atoi(row[157]); + entry.effectdescnum2 = atoi(row[158]); + entry.npc_no_los = atoi(row[159]); + entry.field160 = atoi(row[160]); + entry.reflectable = atoi(row[161]); + entry.bonushate = atoi(row[162]); + entry.field163 = atoi(row[163]); + entry.field164 = atoi(row[164]); + entry.ldon_trap = atoi(row[165]); + entry.EndurCost = atoi(row[166]); + entry.EndurTimerIndex = atoi(row[167]); + entry.IsDiscipline = atoi(row[168]); + entry.field169 = atoi(row[169]); + entry.field170 = atoi(row[170]); + entry.field171 = atoi(row[171]); + entry.field172 = atoi(row[172]); + entry.HateAdded = atoi(row[173]); + entry.EndurUpkeep = atoi(row[174]); + entry.numhitstype = atoi(row[175]); + entry.numhits = atoi(row[176]); + entry.pvpresistbase = atoi(row[177]); + entry.pvpresistcalc = atoi(row[178]); + entry.pvpresistcap = atoi(row[179]); + entry.spell_category = atoi(row[180]); + entry.field181 = atoi(row[181]); + entry.field182 = atoi(row[182]); + entry.pcnpc_only_flag = atoi(row[183]); + entry.cast_not_standing = atoi(row[184]); + entry.can_mgb = atoi(row[185]); + entry.nodispell = atoi(row[186]); + entry.npc_category = atoi(row[187]); + entry.npc_usefulness = atoi(row[188]); + entry.MinResist = atoi(row[189]); + entry.MaxResist = atoi(row[190]); + entry.viral_targets = atoi(row[191]); + entry.viral_timer = atoi(row[192]); + entry.nimbuseffect = atoi(row[193]); + entry.ConeStartAngle = atoi(row[194]); + entry.ConeStopAngle = atoi(row[195]); + entry.sneaking = atoi(row[196]); + entry.not_extendable = atoi(row[197]); + entry.field198 = atoi(row[198]); + entry.field199 = atoi(row[199]); + entry.suspendable = atoi(row[200]); + entry.viral_range = atoi(row[201]); + entry.songcap = atoi(row[202]); + entry.field203 = atoi(row[203]); + entry.field204 = atoi(row[204]); + entry.no_block = atoi(row[205]); + entry.field206 = atoi(row[206]); + entry.spellgroup = atoi(row[207]); + entry.rank = atoi(row[208]); + entry.field209 = atoi(row[209]); + entry.field210 = atoi(row[210]); + entry.CastRestriction = atoi(row[211]); + entry.allowrest = atoi(row[212]); + entry.InCombat = atoi(row[213]); + entry.OutofCombat = atoi(row[214]); + entry.field215 = atoi(row[215]); + entry.field216 = atoi(row[216]); + entry.field217 = atoi(row[217]); + entry.aemaxtargets = atoi(row[218]); + entry.maxtargets = atoi(row[219]); + entry.field220 = atoi(row[220]); + entry.field221 = atoi(row[221]); + entry.field222 = atoi(row[222]); + entry.field223 = atoi(row[223]); + entry.persistdeath = atoi(row[224]); + entry.field225 = atoi(row[225]); + entry.field226 = atoi(row[226]); + entry.min_dist = static_cast(atof(row[227])); + entry.min_dist_mod = static_cast(atof(row[228])); + entry.max_dist = static_cast(atof(row[229])); + entry.max_dist_mod = static_cast(atof(row[230])); + entry.min_range = atoi(row[231]); + entry.field232 = atoi(row[232]); + entry.field233 = atoi(row[233]); + entry.field234 = atoi(row[234]); + entry.field235 = atoi(row[235]); + entry.field236 = atoi(row[236]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int spells_new_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + spells_new_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + SpellsNew spells_new_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(spells_new_entry.id)); + update_values.push_back(columns[1] + " = '" + EscapeString(spells_new_entry.name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(spells_new_entry.player_1) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(spells_new_entry.teleport_zone) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(spells_new_entry.you_cast) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(spells_new_entry.other_casts) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(spells_new_entry.cast_on_you) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(spells_new_entry.cast_on_other) + "'"); + update_values.push_back(columns[8] + " = '" + EscapeString(spells_new_entry.spell_fades) + "'"); + update_values.push_back(columns[9] + " = " + std::to_string(spells_new_entry.range)); + update_values.push_back(columns[10] + " = " + std::to_string(spells_new_entry.aoerange)); + update_values.push_back(columns[11] + " = " + std::to_string(spells_new_entry.pushback)); + update_values.push_back(columns[12] + " = " + std::to_string(spells_new_entry.pushup)); + update_values.push_back(columns[13] + " = " + std::to_string(spells_new_entry.cast_time)); + update_values.push_back(columns[14] + " = " + std::to_string(spells_new_entry.recovery_time)); + update_values.push_back(columns[15] + " = " + std::to_string(spells_new_entry.recast_time)); + update_values.push_back(columns[16] + " = " + std::to_string(spells_new_entry.buffdurationformula)); + update_values.push_back(columns[17] + " = " + std::to_string(spells_new_entry.buffduration)); + update_values.push_back(columns[18] + " = " + std::to_string(spells_new_entry.AEDuration)); + update_values.push_back(columns[19] + " = " + std::to_string(spells_new_entry.mana)); + update_values.push_back(columns[20] + " = " + std::to_string(spells_new_entry.effect_base_value1)); + update_values.push_back(columns[21] + " = " + std::to_string(spells_new_entry.effect_base_value2)); + update_values.push_back(columns[22] + " = " + std::to_string(spells_new_entry.effect_base_value3)); + update_values.push_back(columns[23] + " = " + std::to_string(spells_new_entry.effect_base_value4)); + update_values.push_back(columns[24] + " = " + std::to_string(spells_new_entry.effect_base_value5)); + update_values.push_back(columns[25] + " = " + std::to_string(spells_new_entry.effect_base_value6)); + update_values.push_back(columns[26] + " = " + std::to_string(spells_new_entry.effect_base_value7)); + update_values.push_back(columns[27] + " = " + std::to_string(spells_new_entry.effect_base_value8)); + update_values.push_back(columns[28] + " = " + std::to_string(spells_new_entry.effect_base_value9)); + update_values.push_back(columns[29] + " = " + std::to_string(spells_new_entry.effect_base_value10)); + update_values.push_back(columns[30] + " = " + std::to_string(spells_new_entry.effect_base_value11)); + update_values.push_back(columns[31] + " = " + std::to_string(spells_new_entry.effect_base_value12)); + update_values.push_back(columns[32] + " = " + std::to_string(spells_new_entry.effect_limit_value1)); + update_values.push_back(columns[33] + " = " + std::to_string(spells_new_entry.effect_limit_value2)); + update_values.push_back(columns[34] + " = " + std::to_string(spells_new_entry.effect_limit_value3)); + update_values.push_back(columns[35] + " = " + std::to_string(spells_new_entry.effect_limit_value4)); + update_values.push_back(columns[36] + " = " + std::to_string(spells_new_entry.effect_limit_value5)); + update_values.push_back(columns[37] + " = " + std::to_string(spells_new_entry.effect_limit_value6)); + update_values.push_back(columns[38] + " = " + std::to_string(spells_new_entry.effect_limit_value7)); + update_values.push_back(columns[39] + " = " + std::to_string(spells_new_entry.effect_limit_value8)); + update_values.push_back(columns[40] + " = " + std::to_string(spells_new_entry.effect_limit_value9)); + update_values.push_back(columns[41] + " = " + std::to_string(spells_new_entry.effect_limit_value10)); + update_values.push_back(columns[42] + " = " + std::to_string(spells_new_entry.effect_limit_value11)); + update_values.push_back(columns[43] + " = " + std::to_string(spells_new_entry.effect_limit_value12)); + update_values.push_back(columns[44] + " = " + std::to_string(spells_new_entry.max1)); + update_values.push_back(columns[45] + " = " + std::to_string(spells_new_entry.max2)); + update_values.push_back(columns[46] + " = " + std::to_string(spells_new_entry.max3)); + update_values.push_back(columns[47] + " = " + std::to_string(spells_new_entry.max4)); + update_values.push_back(columns[48] + " = " + std::to_string(spells_new_entry.max5)); + update_values.push_back(columns[49] + " = " + std::to_string(spells_new_entry.max6)); + update_values.push_back(columns[50] + " = " + std::to_string(spells_new_entry.max7)); + update_values.push_back(columns[51] + " = " + std::to_string(spells_new_entry.max8)); + update_values.push_back(columns[52] + " = " + std::to_string(spells_new_entry.max9)); + update_values.push_back(columns[53] + " = " + std::to_string(spells_new_entry.max10)); + update_values.push_back(columns[54] + " = " + std::to_string(spells_new_entry.max11)); + update_values.push_back(columns[55] + " = " + std::to_string(spells_new_entry.max12)); + update_values.push_back(columns[56] + " = " + std::to_string(spells_new_entry.icon)); + update_values.push_back(columns[57] + " = " + std::to_string(spells_new_entry.memicon)); + update_values.push_back(columns[58] + " = " + std::to_string(spells_new_entry.components1)); + update_values.push_back(columns[59] + " = " + std::to_string(spells_new_entry.components2)); + update_values.push_back(columns[60] + " = " + std::to_string(spells_new_entry.components3)); + update_values.push_back(columns[61] + " = " + std::to_string(spells_new_entry.components4)); + update_values.push_back(columns[62] + " = " + std::to_string(spells_new_entry.component_counts1)); + update_values.push_back(columns[63] + " = " + std::to_string(spells_new_entry.component_counts2)); + update_values.push_back(columns[64] + " = " + std::to_string(spells_new_entry.component_counts3)); + update_values.push_back(columns[65] + " = " + std::to_string(spells_new_entry.component_counts4)); + update_values.push_back(columns[66] + " = " + std::to_string(spells_new_entry.NoexpendReagent1)); + update_values.push_back(columns[67] + " = " + std::to_string(spells_new_entry.NoexpendReagent2)); + update_values.push_back(columns[68] + " = " + std::to_string(spells_new_entry.NoexpendReagent3)); + update_values.push_back(columns[69] + " = " + std::to_string(spells_new_entry.NoexpendReagent4)); + update_values.push_back(columns[70] + " = " + std::to_string(spells_new_entry.formula1)); + update_values.push_back(columns[71] + " = " + std::to_string(spells_new_entry.formula2)); + update_values.push_back(columns[72] + " = " + std::to_string(spells_new_entry.formula3)); + update_values.push_back(columns[73] + " = " + std::to_string(spells_new_entry.formula4)); + update_values.push_back(columns[74] + " = " + std::to_string(spells_new_entry.formula5)); + update_values.push_back(columns[75] + " = " + std::to_string(spells_new_entry.formula6)); + update_values.push_back(columns[76] + " = " + std::to_string(spells_new_entry.formula7)); + update_values.push_back(columns[77] + " = " + std::to_string(spells_new_entry.formula8)); + update_values.push_back(columns[78] + " = " + std::to_string(spells_new_entry.formula9)); + update_values.push_back(columns[79] + " = " + std::to_string(spells_new_entry.formula10)); + update_values.push_back(columns[80] + " = " + std::to_string(spells_new_entry.formula11)); + update_values.push_back(columns[81] + " = " + std::to_string(spells_new_entry.formula12)); + update_values.push_back(columns[82] + " = " + std::to_string(spells_new_entry.LightType)); + update_values.push_back(columns[83] + " = " + std::to_string(spells_new_entry.goodEffect)); + update_values.push_back(columns[84] + " = " + std::to_string(spells_new_entry.Activated)); + update_values.push_back(columns[85] + " = " + std::to_string(spells_new_entry.resisttype)); + update_values.push_back(columns[86] + " = " + std::to_string(spells_new_entry.effectid1)); + update_values.push_back(columns[87] + " = " + std::to_string(spells_new_entry.effectid2)); + update_values.push_back(columns[88] + " = " + std::to_string(spells_new_entry.effectid3)); + update_values.push_back(columns[89] + " = " + std::to_string(spells_new_entry.effectid4)); + update_values.push_back(columns[90] + " = " + std::to_string(spells_new_entry.effectid5)); + update_values.push_back(columns[91] + " = " + std::to_string(spells_new_entry.effectid6)); + update_values.push_back(columns[92] + " = " + std::to_string(spells_new_entry.effectid7)); + update_values.push_back(columns[93] + " = " + std::to_string(spells_new_entry.effectid8)); + update_values.push_back(columns[94] + " = " + std::to_string(spells_new_entry.effectid9)); + update_values.push_back(columns[95] + " = " + std::to_string(spells_new_entry.effectid10)); + update_values.push_back(columns[96] + " = " + std::to_string(spells_new_entry.effectid11)); + update_values.push_back(columns[97] + " = " + std::to_string(spells_new_entry.effectid12)); + update_values.push_back(columns[98] + " = " + std::to_string(spells_new_entry.targettype)); + update_values.push_back(columns[99] + " = " + std::to_string(spells_new_entry.basediff)); + update_values.push_back(columns[100] + " = " + std::to_string(spells_new_entry.skill)); + update_values.push_back(columns[101] + " = " + std::to_string(spells_new_entry.zonetype)); + update_values.push_back(columns[102] + " = " + std::to_string(spells_new_entry.EnvironmentType)); + update_values.push_back(columns[103] + " = " + std::to_string(spells_new_entry.TimeOfDay)); + update_values.push_back(columns[104] + " = " + std::to_string(spells_new_entry.classes1)); + update_values.push_back(columns[105] + " = " + std::to_string(spells_new_entry.classes2)); + update_values.push_back(columns[106] + " = " + std::to_string(spells_new_entry.classes3)); + update_values.push_back(columns[107] + " = " + std::to_string(spells_new_entry.classes4)); + update_values.push_back(columns[108] + " = " + std::to_string(spells_new_entry.classes5)); + update_values.push_back(columns[109] + " = " + std::to_string(spells_new_entry.classes6)); + update_values.push_back(columns[110] + " = " + std::to_string(spells_new_entry.classes7)); + update_values.push_back(columns[111] + " = " + std::to_string(spells_new_entry.classes8)); + update_values.push_back(columns[112] + " = " + std::to_string(spells_new_entry.classes9)); + update_values.push_back(columns[113] + " = " + std::to_string(spells_new_entry.classes10)); + update_values.push_back(columns[114] + " = " + std::to_string(spells_new_entry.classes11)); + update_values.push_back(columns[115] + " = " + std::to_string(spells_new_entry.classes12)); + update_values.push_back(columns[116] + " = " + std::to_string(spells_new_entry.classes13)); + update_values.push_back(columns[117] + " = " + std::to_string(spells_new_entry.classes14)); + update_values.push_back(columns[118] + " = " + std::to_string(spells_new_entry.classes15)); + update_values.push_back(columns[119] + " = " + std::to_string(spells_new_entry.classes16)); + update_values.push_back(columns[120] + " = " + std::to_string(spells_new_entry.CastingAnim)); + update_values.push_back(columns[121] + " = " + std::to_string(spells_new_entry.TargetAnim)); + update_values.push_back(columns[122] + " = " + std::to_string(spells_new_entry.TravelType)); + update_values.push_back(columns[123] + " = " + std::to_string(spells_new_entry.SpellAffectIndex)); + update_values.push_back(columns[124] + " = " + std::to_string(spells_new_entry.disallow_sit)); + update_values.push_back(columns[125] + " = " + std::to_string(spells_new_entry.deities0)); + update_values.push_back(columns[126] + " = " + std::to_string(spells_new_entry.deities1)); + update_values.push_back(columns[127] + " = " + std::to_string(spells_new_entry.deities2)); + update_values.push_back(columns[128] + " = " + std::to_string(spells_new_entry.deities3)); + update_values.push_back(columns[129] + " = " + std::to_string(spells_new_entry.deities4)); + update_values.push_back(columns[130] + " = " + std::to_string(spells_new_entry.deities5)); + update_values.push_back(columns[131] + " = " + std::to_string(spells_new_entry.deities6)); + update_values.push_back(columns[132] + " = " + std::to_string(spells_new_entry.deities7)); + update_values.push_back(columns[133] + " = " + std::to_string(spells_new_entry.deities8)); + update_values.push_back(columns[134] + " = " + std::to_string(spells_new_entry.deities9)); + update_values.push_back(columns[135] + " = " + std::to_string(spells_new_entry.deities10)); + update_values.push_back(columns[136] + " = " + std::to_string(spells_new_entry.deities11)); + update_values.push_back(columns[137] + " = " + std::to_string(spells_new_entry.deities12)); + update_values.push_back(columns[138] + " = " + std::to_string(spells_new_entry.deities13)); + update_values.push_back(columns[139] + " = " + std::to_string(spells_new_entry.deities14)); + update_values.push_back(columns[140] + " = " + std::to_string(spells_new_entry.deities15)); + update_values.push_back(columns[141] + " = " + std::to_string(spells_new_entry.deities16)); + update_values.push_back(columns[142] + " = " + std::to_string(spells_new_entry.field142)); + update_values.push_back(columns[143] + " = " + std::to_string(spells_new_entry.field143)); + update_values.push_back(columns[144] + " = " + std::to_string(spells_new_entry.new_icon)); + update_values.push_back(columns[145] + " = " + std::to_string(spells_new_entry.spellanim)); + update_values.push_back(columns[146] + " = " + std::to_string(spells_new_entry.uninterruptable)); + update_values.push_back(columns[147] + " = " + std::to_string(spells_new_entry.ResistDiff)); + update_values.push_back(columns[148] + " = " + std::to_string(spells_new_entry.dot_stacking_exempt)); + update_values.push_back(columns[149] + " = " + std::to_string(spells_new_entry.deleteable)); + update_values.push_back(columns[150] + " = " + std::to_string(spells_new_entry.RecourseLink)); + update_values.push_back(columns[151] + " = " + std::to_string(spells_new_entry.no_partial_resist)); + update_values.push_back(columns[152] + " = " + std::to_string(spells_new_entry.field152)); + update_values.push_back(columns[153] + " = " + std::to_string(spells_new_entry.field153)); + update_values.push_back(columns[154] + " = " + std::to_string(spells_new_entry.short_buff_box)); + update_values.push_back(columns[155] + " = " + std::to_string(spells_new_entry.descnum)); + update_values.push_back(columns[156] + " = " + std::to_string(spells_new_entry.typedescnum)); + update_values.push_back(columns[157] + " = " + std::to_string(spells_new_entry.effectdescnum)); + update_values.push_back(columns[158] + " = " + std::to_string(spells_new_entry.effectdescnum2)); + update_values.push_back(columns[159] + " = " + std::to_string(spells_new_entry.npc_no_los)); + update_values.push_back(columns[160] + " = " + std::to_string(spells_new_entry.field160)); + update_values.push_back(columns[161] + " = " + std::to_string(spells_new_entry.reflectable)); + update_values.push_back(columns[162] + " = " + std::to_string(spells_new_entry.bonushate)); + update_values.push_back(columns[163] + " = " + std::to_string(spells_new_entry.field163)); + update_values.push_back(columns[164] + " = " + std::to_string(spells_new_entry.field164)); + update_values.push_back(columns[165] + " = " + std::to_string(spells_new_entry.ldon_trap)); + update_values.push_back(columns[166] + " = " + std::to_string(spells_new_entry.EndurCost)); + update_values.push_back(columns[167] + " = " + std::to_string(spells_new_entry.EndurTimerIndex)); + update_values.push_back(columns[168] + " = " + std::to_string(spells_new_entry.IsDiscipline)); + update_values.push_back(columns[169] + " = " + std::to_string(spells_new_entry.field169)); + update_values.push_back(columns[170] + " = " + std::to_string(spells_new_entry.field170)); + update_values.push_back(columns[171] + " = " + std::to_string(spells_new_entry.field171)); + update_values.push_back(columns[172] + " = " + std::to_string(spells_new_entry.field172)); + update_values.push_back(columns[173] + " = " + std::to_string(spells_new_entry.HateAdded)); + update_values.push_back(columns[174] + " = " + std::to_string(spells_new_entry.EndurUpkeep)); + update_values.push_back(columns[175] + " = " + std::to_string(spells_new_entry.numhitstype)); + update_values.push_back(columns[176] + " = " + std::to_string(spells_new_entry.numhits)); + update_values.push_back(columns[177] + " = " + std::to_string(spells_new_entry.pvpresistbase)); + update_values.push_back(columns[178] + " = " + std::to_string(spells_new_entry.pvpresistcalc)); + update_values.push_back(columns[179] + " = " + std::to_string(spells_new_entry.pvpresistcap)); + update_values.push_back(columns[180] + " = " + std::to_string(spells_new_entry.spell_category)); + update_values.push_back(columns[181] + " = " + std::to_string(spells_new_entry.field181)); + update_values.push_back(columns[182] + " = " + std::to_string(spells_new_entry.field182)); + update_values.push_back(columns[183] + " = " + std::to_string(spells_new_entry.pcnpc_only_flag)); + update_values.push_back(columns[184] + " = " + std::to_string(spells_new_entry.cast_not_standing)); + update_values.push_back(columns[185] + " = " + std::to_string(spells_new_entry.can_mgb)); + update_values.push_back(columns[186] + " = " + std::to_string(spells_new_entry.nodispell)); + update_values.push_back(columns[187] + " = " + std::to_string(spells_new_entry.npc_category)); + update_values.push_back(columns[188] + " = " + std::to_string(spells_new_entry.npc_usefulness)); + update_values.push_back(columns[189] + " = " + std::to_string(spells_new_entry.MinResist)); + update_values.push_back(columns[190] + " = " + std::to_string(spells_new_entry.MaxResist)); + update_values.push_back(columns[191] + " = " + std::to_string(spells_new_entry.viral_targets)); + update_values.push_back(columns[192] + " = " + std::to_string(spells_new_entry.viral_timer)); + update_values.push_back(columns[193] + " = " + std::to_string(spells_new_entry.nimbuseffect)); + update_values.push_back(columns[194] + " = " + std::to_string(spells_new_entry.ConeStartAngle)); + update_values.push_back(columns[195] + " = " + std::to_string(spells_new_entry.ConeStopAngle)); + update_values.push_back(columns[196] + " = " + std::to_string(spells_new_entry.sneaking)); + update_values.push_back(columns[197] + " = " + std::to_string(spells_new_entry.not_extendable)); + update_values.push_back(columns[198] + " = " + std::to_string(spells_new_entry.field198)); + update_values.push_back(columns[199] + " = " + std::to_string(spells_new_entry.field199)); + update_values.push_back(columns[200] + " = " + std::to_string(spells_new_entry.suspendable)); + update_values.push_back(columns[201] + " = " + std::to_string(spells_new_entry.viral_range)); + update_values.push_back(columns[202] + " = " + std::to_string(spells_new_entry.songcap)); + update_values.push_back(columns[203] + " = " + std::to_string(spells_new_entry.field203)); + update_values.push_back(columns[204] + " = " + std::to_string(spells_new_entry.field204)); + update_values.push_back(columns[205] + " = " + std::to_string(spells_new_entry.no_block)); + update_values.push_back(columns[206] + " = " + std::to_string(spells_new_entry.field206)); + update_values.push_back(columns[207] + " = " + std::to_string(spells_new_entry.spellgroup)); + update_values.push_back(columns[208] + " = " + std::to_string(spells_new_entry.rank)); + update_values.push_back(columns[209] + " = " + std::to_string(spells_new_entry.field209)); + update_values.push_back(columns[210] + " = " + std::to_string(spells_new_entry.field210)); + update_values.push_back(columns[211] + " = " + std::to_string(spells_new_entry.CastRestriction)); + update_values.push_back(columns[212] + " = " + std::to_string(spells_new_entry.allowrest)); + update_values.push_back(columns[213] + " = " + std::to_string(spells_new_entry.InCombat)); + update_values.push_back(columns[214] + " = " + std::to_string(spells_new_entry.OutofCombat)); + update_values.push_back(columns[215] + " = " + std::to_string(spells_new_entry.field215)); + update_values.push_back(columns[216] + " = " + std::to_string(spells_new_entry.field216)); + update_values.push_back(columns[217] + " = " + std::to_string(spells_new_entry.field217)); + update_values.push_back(columns[218] + " = " + std::to_string(spells_new_entry.aemaxtargets)); + update_values.push_back(columns[219] + " = " + std::to_string(spells_new_entry.maxtargets)); + update_values.push_back(columns[220] + " = " + std::to_string(spells_new_entry.field220)); + update_values.push_back(columns[221] + " = " + std::to_string(spells_new_entry.field221)); + update_values.push_back(columns[222] + " = " + std::to_string(spells_new_entry.field222)); + update_values.push_back(columns[223] + " = " + std::to_string(spells_new_entry.field223)); + update_values.push_back(columns[224] + " = " + std::to_string(spells_new_entry.persistdeath)); + update_values.push_back(columns[225] + " = " + std::to_string(spells_new_entry.field225)); + update_values.push_back(columns[226] + " = " + std::to_string(spells_new_entry.field226)); + update_values.push_back(columns[227] + " = " + std::to_string(spells_new_entry.min_dist)); + update_values.push_back(columns[228] + " = " + std::to_string(spells_new_entry.min_dist_mod)); + update_values.push_back(columns[229] + " = " + std::to_string(spells_new_entry.max_dist)); + update_values.push_back(columns[230] + " = " + std::to_string(spells_new_entry.max_dist_mod)); + update_values.push_back(columns[231] + " = " + std::to_string(spells_new_entry.min_range)); + update_values.push_back(columns[232] + " = " + std::to_string(spells_new_entry.field232)); + update_values.push_back(columns[233] + " = " + std::to_string(spells_new_entry.field233)); + update_values.push_back(columns[234] + " = " + std::to_string(spells_new_entry.field234)); + update_values.push_back(columns[235] + " = " + std::to_string(spells_new_entry.field235)); + update_values.push_back(columns[236] + " = " + std::to_string(spells_new_entry.field236)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + spells_new_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static SpellsNew InsertOne( + Database& db, + SpellsNew spells_new_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(spells_new_entry.id)); + insert_values.push_back("'" + EscapeString(spells_new_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.player_1) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.teleport_zone) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.you_cast) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.other_casts) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.cast_on_you) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.cast_on_other) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.spell_fades) + "'"); + insert_values.push_back(std::to_string(spells_new_entry.range)); + insert_values.push_back(std::to_string(spells_new_entry.aoerange)); + insert_values.push_back(std::to_string(spells_new_entry.pushback)); + insert_values.push_back(std::to_string(spells_new_entry.pushup)); + insert_values.push_back(std::to_string(spells_new_entry.cast_time)); + insert_values.push_back(std::to_string(spells_new_entry.recovery_time)); + insert_values.push_back(std::to_string(spells_new_entry.recast_time)); + insert_values.push_back(std::to_string(spells_new_entry.buffdurationformula)); + insert_values.push_back(std::to_string(spells_new_entry.buffduration)); + insert_values.push_back(std::to_string(spells_new_entry.AEDuration)); + insert_values.push_back(std::to_string(spells_new_entry.mana)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value1)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value2)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value3)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value4)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value5)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value6)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value7)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value8)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value9)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value10)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value11)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value12)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value1)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value2)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value3)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value4)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value5)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value6)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value7)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value8)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value9)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value10)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value11)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value12)); + insert_values.push_back(std::to_string(spells_new_entry.max1)); + insert_values.push_back(std::to_string(spells_new_entry.max2)); + insert_values.push_back(std::to_string(spells_new_entry.max3)); + insert_values.push_back(std::to_string(spells_new_entry.max4)); + insert_values.push_back(std::to_string(spells_new_entry.max5)); + insert_values.push_back(std::to_string(spells_new_entry.max6)); + insert_values.push_back(std::to_string(spells_new_entry.max7)); + insert_values.push_back(std::to_string(spells_new_entry.max8)); + insert_values.push_back(std::to_string(spells_new_entry.max9)); + insert_values.push_back(std::to_string(spells_new_entry.max10)); + insert_values.push_back(std::to_string(spells_new_entry.max11)); + insert_values.push_back(std::to_string(spells_new_entry.max12)); + insert_values.push_back(std::to_string(spells_new_entry.icon)); + insert_values.push_back(std::to_string(spells_new_entry.memicon)); + insert_values.push_back(std::to_string(spells_new_entry.components1)); + insert_values.push_back(std::to_string(spells_new_entry.components2)); + insert_values.push_back(std::to_string(spells_new_entry.components3)); + insert_values.push_back(std::to_string(spells_new_entry.components4)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts1)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts2)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts3)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts4)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent1)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent2)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent3)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent4)); + insert_values.push_back(std::to_string(spells_new_entry.formula1)); + insert_values.push_back(std::to_string(spells_new_entry.formula2)); + insert_values.push_back(std::to_string(spells_new_entry.formula3)); + insert_values.push_back(std::to_string(spells_new_entry.formula4)); + insert_values.push_back(std::to_string(spells_new_entry.formula5)); + insert_values.push_back(std::to_string(spells_new_entry.formula6)); + insert_values.push_back(std::to_string(spells_new_entry.formula7)); + insert_values.push_back(std::to_string(spells_new_entry.formula8)); + insert_values.push_back(std::to_string(spells_new_entry.formula9)); + insert_values.push_back(std::to_string(spells_new_entry.formula10)); + insert_values.push_back(std::to_string(spells_new_entry.formula11)); + insert_values.push_back(std::to_string(spells_new_entry.formula12)); + insert_values.push_back(std::to_string(spells_new_entry.LightType)); + insert_values.push_back(std::to_string(spells_new_entry.goodEffect)); + insert_values.push_back(std::to_string(spells_new_entry.Activated)); + insert_values.push_back(std::to_string(spells_new_entry.resisttype)); + insert_values.push_back(std::to_string(spells_new_entry.effectid1)); + insert_values.push_back(std::to_string(spells_new_entry.effectid2)); + insert_values.push_back(std::to_string(spells_new_entry.effectid3)); + insert_values.push_back(std::to_string(spells_new_entry.effectid4)); + insert_values.push_back(std::to_string(spells_new_entry.effectid5)); + insert_values.push_back(std::to_string(spells_new_entry.effectid6)); + insert_values.push_back(std::to_string(spells_new_entry.effectid7)); + insert_values.push_back(std::to_string(spells_new_entry.effectid8)); + insert_values.push_back(std::to_string(spells_new_entry.effectid9)); + insert_values.push_back(std::to_string(spells_new_entry.effectid10)); + insert_values.push_back(std::to_string(spells_new_entry.effectid11)); + insert_values.push_back(std::to_string(spells_new_entry.effectid12)); + insert_values.push_back(std::to_string(spells_new_entry.targettype)); + insert_values.push_back(std::to_string(spells_new_entry.basediff)); + insert_values.push_back(std::to_string(spells_new_entry.skill)); + insert_values.push_back(std::to_string(spells_new_entry.zonetype)); + insert_values.push_back(std::to_string(spells_new_entry.EnvironmentType)); + insert_values.push_back(std::to_string(spells_new_entry.TimeOfDay)); + insert_values.push_back(std::to_string(spells_new_entry.classes1)); + insert_values.push_back(std::to_string(spells_new_entry.classes2)); + insert_values.push_back(std::to_string(spells_new_entry.classes3)); + insert_values.push_back(std::to_string(spells_new_entry.classes4)); + insert_values.push_back(std::to_string(spells_new_entry.classes5)); + insert_values.push_back(std::to_string(spells_new_entry.classes6)); + insert_values.push_back(std::to_string(spells_new_entry.classes7)); + insert_values.push_back(std::to_string(spells_new_entry.classes8)); + insert_values.push_back(std::to_string(spells_new_entry.classes9)); + insert_values.push_back(std::to_string(spells_new_entry.classes10)); + insert_values.push_back(std::to_string(spells_new_entry.classes11)); + insert_values.push_back(std::to_string(spells_new_entry.classes12)); + insert_values.push_back(std::to_string(spells_new_entry.classes13)); + insert_values.push_back(std::to_string(spells_new_entry.classes14)); + insert_values.push_back(std::to_string(spells_new_entry.classes15)); + insert_values.push_back(std::to_string(spells_new_entry.classes16)); + insert_values.push_back(std::to_string(spells_new_entry.CastingAnim)); + insert_values.push_back(std::to_string(spells_new_entry.TargetAnim)); + insert_values.push_back(std::to_string(spells_new_entry.TravelType)); + insert_values.push_back(std::to_string(spells_new_entry.SpellAffectIndex)); + insert_values.push_back(std::to_string(spells_new_entry.disallow_sit)); + insert_values.push_back(std::to_string(spells_new_entry.deities0)); + insert_values.push_back(std::to_string(spells_new_entry.deities1)); + insert_values.push_back(std::to_string(spells_new_entry.deities2)); + insert_values.push_back(std::to_string(spells_new_entry.deities3)); + insert_values.push_back(std::to_string(spells_new_entry.deities4)); + insert_values.push_back(std::to_string(spells_new_entry.deities5)); + insert_values.push_back(std::to_string(spells_new_entry.deities6)); + insert_values.push_back(std::to_string(spells_new_entry.deities7)); + insert_values.push_back(std::to_string(spells_new_entry.deities8)); + insert_values.push_back(std::to_string(spells_new_entry.deities9)); + insert_values.push_back(std::to_string(spells_new_entry.deities10)); + insert_values.push_back(std::to_string(spells_new_entry.deities11)); + insert_values.push_back(std::to_string(spells_new_entry.deities12)); + insert_values.push_back(std::to_string(spells_new_entry.deities13)); + insert_values.push_back(std::to_string(spells_new_entry.deities14)); + insert_values.push_back(std::to_string(spells_new_entry.deities15)); + insert_values.push_back(std::to_string(spells_new_entry.deities16)); + insert_values.push_back(std::to_string(spells_new_entry.field142)); + insert_values.push_back(std::to_string(spells_new_entry.field143)); + insert_values.push_back(std::to_string(spells_new_entry.new_icon)); + insert_values.push_back(std::to_string(spells_new_entry.spellanim)); + insert_values.push_back(std::to_string(spells_new_entry.uninterruptable)); + insert_values.push_back(std::to_string(spells_new_entry.ResistDiff)); + insert_values.push_back(std::to_string(spells_new_entry.dot_stacking_exempt)); + insert_values.push_back(std::to_string(spells_new_entry.deleteable)); + insert_values.push_back(std::to_string(spells_new_entry.RecourseLink)); + insert_values.push_back(std::to_string(spells_new_entry.no_partial_resist)); + insert_values.push_back(std::to_string(spells_new_entry.field152)); + insert_values.push_back(std::to_string(spells_new_entry.field153)); + insert_values.push_back(std::to_string(spells_new_entry.short_buff_box)); + insert_values.push_back(std::to_string(spells_new_entry.descnum)); + insert_values.push_back(std::to_string(spells_new_entry.typedescnum)); + insert_values.push_back(std::to_string(spells_new_entry.effectdescnum)); + insert_values.push_back(std::to_string(spells_new_entry.effectdescnum2)); + insert_values.push_back(std::to_string(spells_new_entry.npc_no_los)); + insert_values.push_back(std::to_string(spells_new_entry.field160)); + insert_values.push_back(std::to_string(spells_new_entry.reflectable)); + insert_values.push_back(std::to_string(spells_new_entry.bonushate)); + insert_values.push_back(std::to_string(spells_new_entry.field163)); + insert_values.push_back(std::to_string(spells_new_entry.field164)); + insert_values.push_back(std::to_string(spells_new_entry.ldon_trap)); + insert_values.push_back(std::to_string(spells_new_entry.EndurCost)); + insert_values.push_back(std::to_string(spells_new_entry.EndurTimerIndex)); + insert_values.push_back(std::to_string(spells_new_entry.IsDiscipline)); + insert_values.push_back(std::to_string(spells_new_entry.field169)); + insert_values.push_back(std::to_string(spells_new_entry.field170)); + insert_values.push_back(std::to_string(spells_new_entry.field171)); + insert_values.push_back(std::to_string(spells_new_entry.field172)); + insert_values.push_back(std::to_string(spells_new_entry.HateAdded)); + insert_values.push_back(std::to_string(spells_new_entry.EndurUpkeep)); + insert_values.push_back(std::to_string(spells_new_entry.numhitstype)); + insert_values.push_back(std::to_string(spells_new_entry.numhits)); + insert_values.push_back(std::to_string(spells_new_entry.pvpresistbase)); + insert_values.push_back(std::to_string(spells_new_entry.pvpresistcalc)); + insert_values.push_back(std::to_string(spells_new_entry.pvpresistcap)); + insert_values.push_back(std::to_string(spells_new_entry.spell_category)); + insert_values.push_back(std::to_string(spells_new_entry.field181)); + insert_values.push_back(std::to_string(spells_new_entry.field182)); + insert_values.push_back(std::to_string(spells_new_entry.pcnpc_only_flag)); + insert_values.push_back(std::to_string(spells_new_entry.cast_not_standing)); + insert_values.push_back(std::to_string(spells_new_entry.can_mgb)); + insert_values.push_back(std::to_string(spells_new_entry.nodispell)); + insert_values.push_back(std::to_string(spells_new_entry.npc_category)); + insert_values.push_back(std::to_string(spells_new_entry.npc_usefulness)); + insert_values.push_back(std::to_string(spells_new_entry.MinResist)); + insert_values.push_back(std::to_string(spells_new_entry.MaxResist)); + insert_values.push_back(std::to_string(spells_new_entry.viral_targets)); + insert_values.push_back(std::to_string(spells_new_entry.viral_timer)); + insert_values.push_back(std::to_string(spells_new_entry.nimbuseffect)); + insert_values.push_back(std::to_string(spells_new_entry.ConeStartAngle)); + insert_values.push_back(std::to_string(spells_new_entry.ConeStopAngle)); + insert_values.push_back(std::to_string(spells_new_entry.sneaking)); + insert_values.push_back(std::to_string(spells_new_entry.not_extendable)); + insert_values.push_back(std::to_string(spells_new_entry.field198)); + insert_values.push_back(std::to_string(spells_new_entry.field199)); + insert_values.push_back(std::to_string(spells_new_entry.suspendable)); + insert_values.push_back(std::to_string(spells_new_entry.viral_range)); + insert_values.push_back(std::to_string(spells_new_entry.songcap)); + insert_values.push_back(std::to_string(spells_new_entry.field203)); + insert_values.push_back(std::to_string(spells_new_entry.field204)); + insert_values.push_back(std::to_string(spells_new_entry.no_block)); + insert_values.push_back(std::to_string(spells_new_entry.field206)); + insert_values.push_back(std::to_string(spells_new_entry.spellgroup)); + insert_values.push_back(std::to_string(spells_new_entry.rank)); + insert_values.push_back(std::to_string(spells_new_entry.field209)); + insert_values.push_back(std::to_string(spells_new_entry.field210)); + insert_values.push_back(std::to_string(spells_new_entry.CastRestriction)); + insert_values.push_back(std::to_string(spells_new_entry.allowrest)); + insert_values.push_back(std::to_string(spells_new_entry.InCombat)); + insert_values.push_back(std::to_string(spells_new_entry.OutofCombat)); + insert_values.push_back(std::to_string(spells_new_entry.field215)); + insert_values.push_back(std::to_string(spells_new_entry.field216)); + insert_values.push_back(std::to_string(spells_new_entry.field217)); + insert_values.push_back(std::to_string(spells_new_entry.aemaxtargets)); + insert_values.push_back(std::to_string(spells_new_entry.maxtargets)); + insert_values.push_back(std::to_string(spells_new_entry.field220)); + insert_values.push_back(std::to_string(spells_new_entry.field221)); + insert_values.push_back(std::to_string(spells_new_entry.field222)); + insert_values.push_back(std::to_string(spells_new_entry.field223)); + insert_values.push_back(std::to_string(spells_new_entry.persistdeath)); + insert_values.push_back(std::to_string(spells_new_entry.field225)); + insert_values.push_back(std::to_string(spells_new_entry.field226)); + insert_values.push_back(std::to_string(spells_new_entry.min_dist)); + insert_values.push_back(std::to_string(spells_new_entry.min_dist_mod)); + insert_values.push_back(std::to_string(spells_new_entry.max_dist)); + insert_values.push_back(std::to_string(spells_new_entry.max_dist_mod)); + insert_values.push_back(std::to_string(spells_new_entry.min_range)); + insert_values.push_back(std::to_string(spells_new_entry.field232)); + insert_values.push_back(std::to_string(spells_new_entry.field233)); + insert_values.push_back(std::to_string(spells_new_entry.field234)); + insert_values.push_back(std::to_string(spells_new_entry.field235)); + insert_values.push_back(std::to_string(spells_new_entry.field236)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + spells_new_entry.id = results.LastInsertedID(); + return spells_new_entry; + } + + spells_new_entry = NewEntity(); + + return spells_new_entry; + } + + static int InsertMany( + Database& db, + std::vector spells_new_entries + ) + { + std::vector insert_chunks; + + for (auto &spells_new_entry: spells_new_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(spells_new_entry.id)); + insert_values.push_back("'" + EscapeString(spells_new_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.player_1) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.teleport_zone) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.you_cast) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.other_casts) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.cast_on_you) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.cast_on_other) + "'"); + insert_values.push_back("'" + EscapeString(spells_new_entry.spell_fades) + "'"); + insert_values.push_back(std::to_string(spells_new_entry.range)); + insert_values.push_back(std::to_string(spells_new_entry.aoerange)); + insert_values.push_back(std::to_string(spells_new_entry.pushback)); + insert_values.push_back(std::to_string(spells_new_entry.pushup)); + insert_values.push_back(std::to_string(spells_new_entry.cast_time)); + insert_values.push_back(std::to_string(spells_new_entry.recovery_time)); + insert_values.push_back(std::to_string(spells_new_entry.recast_time)); + insert_values.push_back(std::to_string(spells_new_entry.buffdurationformula)); + insert_values.push_back(std::to_string(spells_new_entry.buffduration)); + insert_values.push_back(std::to_string(spells_new_entry.AEDuration)); + insert_values.push_back(std::to_string(spells_new_entry.mana)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value1)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value2)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value3)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value4)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value5)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value6)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value7)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value8)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value9)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value10)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value11)); + insert_values.push_back(std::to_string(spells_new_entry.effect_base_value12)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value1)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value2)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value3)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value4)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value5)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value6)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value7)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value8)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value9)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value10)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value11)); + insert_values.push_back(std::to_string(spells_new_entry.effect_limit_value12)); + insert_values.push_back(std::to_string(spells_new_entry.max1)); + insert_values.push_back(std::to_string(spells_new_entry.max2)); + insert_values.push_back(std::to_string(spells_new_entry.max3)); + insert_values.push_back(std::to_string(spells_new_entry.max4)); + insert_values.push_back(std::to_string(spells_new_entry.max5)); + insert_values.push_back(std::to_string(spells_new_entry.max6)); + insert_values.push_back(std::to_string(spells_new_entry.max7)); + insert_values.push_back(std::to_string(spells_new_entry.max8)); + insert_values.push_back(std::to_string(spells_new_entry.max9)); + insert_values.push_back(std::to_string(spells_new_entry.max10)); + insert_values.push_back(std::to_string(spells_new_entry.max11)); + insert_values.push_back(std::to_string(spells_new_entry.max12)); + insert_values.push_back(std::to_string(spells_new_entry.icon)); + insert_values.push_back(std::to_string(spells_new_entry.memicon)); + insert_values.push_back(std::to_string(spells_new_entry.components1)); + insert_values.push_back(std::to_string(spells_new_entry.components2)); + insert_values.push_back(std::to_string(spells_new_entry.components3)); + insert_values.push_back(std::to_string(spells_new_entry.components4)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts1)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts2)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts3)); + insert_values.push_back(std::to_string(spells_new_entry.component_counts4)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent1)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent2)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent3)); + insert_values.push_back(std::to_string(spells_new_entry.NoexpendReagent4)); + insert_values.push_back(std::to_string(spells_new_entry.formula1)); + insert_values.push_back(std::to_string(spells_new_entry.formula2)); + insert_values.push_back(std::to_string(spells_new_entry.formula3)); + insert_values.push_back(std::to_string(spells_new_entry.formula4)); + insert_values.push_back(std::to_string(spells_new_entry.formula5)); + insert_values.push_back(std::to_string(spells_new_entry.formula6)); + insert_values.push_back(std::to_string(spells_new_entry.formula7)); + insert_values.push_back(std::to_string(spells_new_entry.formula8)); + insert_values.push_back(std::to_string(spells_new_entry.formula9)); + insert_values.push_back(std::to_string(spells_new_entry.formula10)); + insert_values.push_back(std::to_string(spells_new_entry.formula11)); + insert_values.push_back(std::to_string(spells_new_entry.formula12)); + insert_values.push_back(std::to_string(spells_new_entry.LightType)); + insert_values.push_back(std::to_string(spells_new_entry.goodEffect)); + insert_values.push_back(std::to_string(spells_new_entry.Activated)); + insert_values.push_back(std::to_string(spells_new_entry.resisttype)); + insert_values.push_back(std::to_string(spells_new_entry.effectid1)); + insert_values.push_back(std::to_string(spells_new_entry.effectid2)); + insert_values.push_back(std::to_string(spells_new_entry.effectid3)); + insert_values.push_back(std::to_string(spells_new_entry.effectid4)); + insert_values.push_back(std::to_string(spells_new_entry.effectid5)); + insert_values.push_back(std::to_string(spells_new_entry.effectid6)); + insert_values.push_back(std::to_string(spells_new_entry.effectid7)); + insert_values.push_back(std::to_string(spells_new_entry.effectid8)); + insert_values.push_back(std::to_string(spells_new_entry.effectid9)); + insert_values.push_back(std::to_string(spells_new_entry.effectid10)); + insert_values.push_back(std::to_string(spells_new_entry.effectid11)); + insert_values.push_back(std::to_string(spells_new_entry.effectid12)); + insert_values.push_back(std::to_string(spells_new_entry.targettype)); + insert_values.push_back(std::to_string(spells_new_entry.basediff)); + insert_values.push_back(std::to_string(spells_new_entry.skill)); + insert_values.push_back(std::to_string(spells_new_entry.zonetype)); + insert_values.push_back(std::to_string(spells_new_entry.EnvironmentType)); + insert_values.push_back(std::to_string(spells_new_entry.TimeOfDay)); + insert_values.push_back(std::to_string(spells_new_entry.classes1)); + insert_values.push_back(std::to_string(spells_new_entry.classes2)); + insert_values.push_back(std::to_string(spells_new_entry.classes3)); + insert_values.push_back(std::to_string(spells_new_entry.classes4)); + insert_values.push_back(std::to_string(spells_new_entry.classes5)); + insert_values.push_back(std::to_string(spells_new_entry.classes6)); + insert_values.push_back(std::to_string(spells_new_entry.classes7)); + insert_values.push_back(std::to_string(spells_new_entry.classes8)); + insert_values.push_back(std::to_string(spells_new_entry.classes9)); + insert_values.push_back(std::to_string(spells_new_entry.classes10)); + insert_values.push_back(std::to_string(spells_new_entry.classes11)); + insert_values.push_back(std::to_string(spells_new_entry.classes12)); + insert_values.push_back(std::to_string(spells_new_entry.classes13)); + insert_values.push_back(std::to_string(spells_new_entry.classes14)); + insert_values.push_back(std::to_string(spells_new_entry.classes15)); + insert_values.push_back(std::to_string(spells_new_entry.classes16)); + insert_values.push_back(std::to_string(spells_new_entry.CastingAnim)); + insert_values.push_back(std::to_string(spells_new_entry.TargetAnim)); + insert_values.push_back(std::to_string(spells_new_entry.TravelType)); + insert_values.push_back(std::to_string(spells_new_entry.SpellAffectIndex)); + insert_values.push_back(std::to_string(spells_new_entry.disallow_sit)); + insert_values.push_back(std::to_string(spells_new_entry.deities0)); + insert_values.push_back(std::to_string(spells_new_entry.deities1)); + insert_values.push_back(std::to_string(spells_new_entry.deities2)); + insert_values.push_back(std::to_string(spells_new_entry.deities3)); + insert_values.push_back(std::to_string(spells_new_entry.deities4)); + insert_values.push_back(std::to_string(spells_new_entry.deities5)); + insert_values.push_back(std::to_string(spells_new_entry.deities6)); + insert_values.push_back(std::to_string(spells_new_entry.deities7)); + insert_values.push_back(std::to_string(spells_new_entry.deities8)); + insert_values.push_back(std::to_string(spells_new_entry.deities9)); + insert_values.push_back(std::to_string(spells_new_entry.deities10)); + insert_values.push_back(std::to_string(spells_new_entry.deities11)); + insert_values.push_back(std::to_string(spells_new_entry.deities12)); + insert_values.push_back(std::to_string(spells_new_entry.deities13)); + insert_values.push_back(std::to_string(spells_new_entry.deities14)); + insert_values.push_back(std::to_string(spells_new_entry.deities15)); + insert_values.push_back(std::to_string(spells_new_entry.deities16)); + insert_values.push_back(std::to_string(spells_new_entry.field142)); + insert_values.push_back(std::to_string(spells_new_entry.field143)); + insert_values.push_back(std::to_string(spells_new_entry.new_icon)); + insert_values.push_back(std::to_string(spells_new_entry.spellanim)); + insert_values.push_back(std::to_string(spells_new_entry.uninterruptable)); + insert_values.push_back(std::to_string(spells_new_entry.ResistDiff)); + insert_values.push_back(std::to_string(spells_new_entry.dot_stacking_exempt)); + insert_values.push_back(std::to_string(spells_new_entry.deleteable)); + insert_values.push_back(std::to_string(spells_new_entry.RecourseLink)); + insert_values.push_back(std::to_string(spells_new_entry.no_partial_resist)); + insert_values.push_back(std::to_string(spells_new_entry.field152)); + insert_values.push_back(std::to_string(spells_new_entry.field153)); + insert_values.push_back(std::to_string(spells_new_entry.short_buff_box)); + insert_values.push_back(std::to_string(spells_new_entry.descnum)); + insert_values.push_back(std::to_string(spells_new_entry.typedescnum)); + insert_values.push_back(std::to_string(spells_new_entry.effectdescnum)); + insert_values.push_back(std::to_string(spells_new_entry.effectdescnum2)); + insert_values.push_back(std::to_string(spells_new_entry.npc_no_los)); + insert_values.push_back(std::to_string(spells_new_entry.field160)); + insert_values.push_back(std::to_string(spells_new_entry.reflectable)); + insert_values.push_back(std::to_string(spells_new_entry.bonushate)); + insert_values.push_back(std::to_string(spells_new_entry.field163)); + insert_values.push_back(std::to_string(spells_new_entry.field164)); + insert_values.push_back(std::to_string(spells_new_entry.ldon_trap)); + insert_values.push_back(std::to_string(spells_new_entry.EndurCost)); + insert_values.push_back(std::to_string(spells_new_entry.EndurTimerIndex)); + insert_values.push_back(std::to_string(spells_new_entry.IsDiscipline)); + insert_values.push_back(std::to_string(spells_new_entry.field169)); + insert_values.push_back(std::to_string(spells_new_entry.field170)); + insert_values.push_back(std::to_string(spells_new_entry.field171)); + insert_values.push_back(std::to_string(spells_new_entry.field172)); + insert_values.push_back(std::to_string(spells_new_entry.HateAdded)); + insert_values.push_back(std::to_string(spells_new_entry.EndurUpkeep)); + insert_values.push_back(std::to_string(spells_new_entry.numhitstype)); + insert_values.push_back(std::to_string(spells_new_entry.numhits)); + insert_values.push_back(std::to_string(spells_new_entry.pvpresistbase)); + insert_values.push_back(std::to_string(spells_new_entry.pvpresistcalc)); + insert_values.push_back(std::to_string(spells_new_entry.pvpresistcap)); + insert_values.push_back(std::to_string(spells_new_entry.spell_category)); + insert_values.push_back(std::to_string(spells_new_entry.field181)); + insert_values.push_back(std::to_string(spells_new_entry.field182)); + insert_values.push_back(std::to_string(spells_new_entry.pcnpc_only_flag)); + insert_values.push_back(std::to_string(spells_new_entry.cast_not_standing)); + insert_values.push_back(std::to_string(spells_new_entry.can_mgb)); + insert_values.push_back(std::to_string(spells_new_entry.nodispell)); + insert_values.push_back(std::to_string(spells_new_entry.npc_category)); + insert_values.push_back(std::to_string(spells_new_entry.npc_usefulness)); + insert_values.push_back(std::to_string(spells_new_entry.MinResist)); + insert_values.push_back(std::to_string(spells_new_entry.MaxResist)); + insert_values.push_back(std::to_string(spells_new_entry.viral_targets)); + insert_values.push_back(std::to_string(spells_new_entry.viral_timer)); + insert_values.push_back(std::to_string(spells_new_entry.nimbuseffect)); + insert_values.push_back(std::to_string(spells_new_entry.ConeStartAngle)); + insert_values.push_back(std::to_string(spells_new_entry.ConeStopAngle)); + insert_values.push_back(std::to_string(spells_new_entry.sneaking)); + insert_values.push_back(std::to_string(spells_new_entry.not_extendable)); + insert_values.push_back(std::to_string(spells_new_entry.field198)); + insert_values.push_back(std::to_string(spells_new_entry.field199)); + insert_values.push_back(std::to_string(spells_new_entry.suspendable)); + insert_values.push_back(std::to_string(spells_new_entry.viral_range)); + insert_values.push_back(std::to_string(spells_new_entry.songcap)); + insert_values.push_back(std::to_string(spells_new_entry.field203)); + insert_values.push_back(std::to_string(spells_new_entry.field204)); + insert_values.push_back(std::to_string(spells_new_entry.no_block)); + insert_values.push_back(std::to_string(spells_new_entry.field206)); + insert_values.push_back(std::to_string(spells_new_entry.spellgroup)); + insert_values.push_back(std::to_string(spells_new_entry.rank)); + insert_values.push_back(std::to_string(spells_new_entry.field209)); + insert_values.push_back(std::to_string(spells_new_entry.field210)); + insert_values.push_back(std::to_string(spells_new_entry.CastRestriction)); + insert_values.push_back(std::to_string(spells_new_entry.allowrest)); + insert_values.push_back(std::to_string(spells_new_entry.InCombat)); + insert_values.push_back(std::to_string(spells_new_entry.OutofCombat)); + insert_values.push_back(std::to_string(spells_new_entry.field215)); + insert_values.push_back(std::to_string(spells_new_entry.field216)); + insert_values.push_back(std::to_string(spells_new_entry.field217)); + insert_values.push_back(std::to_string(spells_new_entry.aemaxtargets)); + insert_values.push_back(std::to_string(spells_new_entry.maxtargets)); + insert_values.push_back(std::to_string(spells_new_entry.field220)); + insert_values.push_back(std::to_string(spells_new_entry.field221)); + insert_values.push_back(std::to_string(spells_new_entry.field222)); + insert_values.push_back(std::to_string(spells_new_entry.field223)); + insert_values.push_back(std::to_string(spells_new_entry.persistdeath)); + insert_values.push_back(std::to_string(spells_new_entry.field225)); + insert_values.push_back(std::to_string(spells_new_entry.field226)); + insert_values.push_back(std::to_string(spells_new_entry.min_dist)); + insert_values.push_back(std::to_string(spells_new_entry.min_dist_mod)); + insert_values.push_back(std::to_string(spells_new_entry.max_dist)); + insert_values.push_back(std::to_string(spells_new_entry.max_dist_mod)); + insert_values.push_back(std::to_string(spells_new_entry.min_range)); + insert_values.push_back(std::to_string(spells_new_entry.field232)); + insert_values.push_back(std::to_string(spells_new_entry.field233)); + insert_values.push_back(std::to_string(spells_new_entry.field234)); + insert_values.push_back(std::to_string(spells_new_entry.field235)); + insert_values.push_back(std::to_string(spells_new_entry.field236)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpellsNew entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.player_1 = row[2] ? row[2] : ""; + entry.teleport_zone = row[3] ? row[3] : ""; + entry.you_cast = row[4] ? row[4] : ""; + entry.other_casts = row[5] ? row[5] : ""; + entry.cast_on_you = row[6] ? row[6] : ""; + entry.cast_on_other = row[7] ? row[7] : ""; + entry.spell_fades = row[8] ? row[8] : ""; + entry.range = atoi(row[9]); + entry.aoerange = atoi(row[10]); + entry.pushback = atoi(row[11]); + entry.pushup = atoi(row[12]); + entry.cast_time = atoi(row[13]); + entry.recovery_time = atoi(row[14]); + entry.recast_time = atoi(row[15]); + entry.buffdurationformula = atoi(row[16]); + entry.buffduration = atoi(row[17]); + entry.AEDuration = atoi(row[18]); + entry.mana = atoi(row[19]); + entry.effect_base_value1 = atoi(row[20]); + entry.effect_base_value2 = atoi(row[21]); + entry.effect_base_value3 = atoi(row[22]); + entry.effect_base_value4 = atoi(row[23]); + entry.effect_base_value5 = atoi(row[24]); + entry.effect_base_value6 = atoi(row[25]); + entry.effect_base_value7 = atoi(row[26]); + entry.effect_base_value8 = atoi(row[27]); + entry.effect_base_value9 = atoi(row[28]); + entry.effect_base_value10 = atoi(row[29]); + entry.effect_base_value11 = atoi(row[30]); + entry.effect_base_value12 = atoi(row[31]); + entry.effect_limit_value1 = atoi(row[32]); + entry.effect_limit_value2 = atoi(row[33]); + entry.effect_limit_value3 = atoi(row[34]); + entry.effect_limit_value4 = atoi(row[35]); + entry.effect_limit_value5 = atoi(row[36]); + entry.effect_limit_value6 = atoi(row[37]); + entry.effect_limit_value7 = atoi(row[38]); + entry.effect_limit_value8 = atoi(row[39]); + entry.effect_limit_value9 = atoi(row[40]); + entry.effect_limit_value10 = atoi(row[41]); + entry.effect_limit_value11 = atoi(row[42]); + entry.effect_limit_value12 = atoi(row[43]); + entry.max1 = atoi(row[44]); + entry.max2 = atoi(row[45]); + entry.max3 = atoi(row[46]); + entry.max4 = atoi(row[47]); + entry.max5 = atoi(row[48]); + entry.max6 = atoi(row[49]); + entry.max7 = atoi(row[50]); + entry.max8 = atoi(row[51]); + entry.max9 = atoi(row[52]); + entry.max10 = atoi(row[53]); + entry.max11 = atoi(row[54]); + entry.max12 = atoi(row[55]); + entry.icon = atoi(row[56]); + entry.memicon = atoi(row[57]); + entry.components1 = atoi(row[58]); + entry.components2 = atoi(row[59]); + entry.components3 = atoi(row[60]); + entry.components4 = atoi(row[61]); + entry.component_counts1 = atoi(row[62]); + entry.component_counts2 = atoi(row[63]); + entry.component_counts3 = atoi(row[64]); + entry.component_counts4 = atoi(row[65]); + entry.NoexpendReagent1 = atoi(row[66]); + entry.NoexpendReagent2 = atoi(row[67]); + entry.NoexpendReagent3 = atoi(row[68]); + entry.NoexpendReagent4 = atoi(row[69]); + entry.formula1 = atoi(row[70]); + entry.formula2 = atoi(row[71]); + entry.formula3 = atoi(row[72]); + entry.formula4 = atoi(row[73]); + entry.formula5 = atoi(row[74]); + entry.formula6 = atoi(row[75]); + entry.formula7 = atoi(row[76]); + entry.formula8 = atoi(row[77]); + entry.formula9 = atoi(row[78]); + entry.formula10 = atoi(row[79]); + entry.formula11 = atoi(row[80]); + entry.formula12 = atoi(row[81]); + entry.LightType = atoi(row[82]); + entry.goodEffect = atoi(row[83]); + entry.Activated = atoi(row[84]); + entry.resisttype = atoi(row[85]); + entry.effectid1 = atoi(row[86]); + entry.effectid2 = atoi(row[87]); + entry.effectid3 = atoi(row[88]); + entry.effectid4 = atoi(row[89]); + entry.effectid5 = atoi(row[90]); + entry.effectid6 = atoi(row[91]); + entry.effectid7 = atoi(row[92]); + entry.effectid8 = atoi(row[93]); + entry.effectid9 = atoi(row[94]); + entry.effectid10 = atoi(row[95]); + entry.effectid11 = atoi(row[96]); + entry.effectid12 = atoi(row[97]); + entry.targettype = atoi(row[98]); + entry.basediff = atoi(row[99]); + entry.skill = atoi(row[100]); + entry.zonetype = atoi(row[101]); + entry.EnvironmentType = atoi(row[102]); + entry.TimeOfDay = atoi(row[103]); + entry.classes1 = atoi(row[104]); + entry.classes2 = atoi(row[105]); + entry.classes3 = atoi(row[106]); + entry.classes4 = atoi(row[107]); + entry.classes5 = atoi(row[108]); + entry.classes6 = atoi(row[109]); + entry.classes7 = atoi(row[110]); + entry.classes8 = atoi(row[111]); + entry.classes9 = atoi(row[112]); + entry.classes10 = atoi(row[113]); + entry.classes11 = atoi(row[114]); + entry.classes12 = atoi(row[115]); + entry.classes13 = atoi(row[116]); + entry.classes14 = atoi(row[117]); + entry.classes15 = atoi(row[118]); + entry.classes16 = atoi(row[119]); + entry.CastingAnim = atoi(row[120]); + entry.TargetAnim = atoi(row[121]); + entry.TravelType = atoi(row[122]); + entry.SpellAffectIndex = atoi(row[123]); + entry.disallow_sit = atoi(row[124]); + entry.deities0 = atoi(row[125]); + entry.deities1 = atoi(row[126]); + entry.deities2 = atoi(row[127]); + entry.deities3 = atoi(row[128]); + entry.deities4 = atoi(row[129]); + entry.deities5 = atoi(row[130]); + entry.deities6 = atoi(row[131]); + entry.deities7 = atoi(row[132]); + entry.deities8 = atoi(row[133]); + entry.deities9 = atoi(row[134]); + entry.deities10 = atoi(row[135]); + entry.deities11 = atoi(row[136]); + entry.deities12 = atoi(row[137]); + entry.deities13 = atoi(row[138]); + entry.deities14 = atoi(row[139]); + entry.deities15 = atoi(row[140]); + entry.deities16 = atoi(row[141]); + entry.field142 = atoi(row[142]); + entry.field143 = atoi(row[143]); + entry.new_icon = atoi(row[144]); + entry.spellanim = atoi(row[145]); + entry.uninterruptable = atoi(row[146]); + entry.ResistDiff = atoi(row[147]); + entry.dot_stacking_exempt = atoi(row[148]); + entry.deleteable = atoi(row[149]); + entry.RecourseLink = atoi(row[150]); + entry.no_partial_resist = atoi(row[151]); + entry.field152 = atoi(row[152]); + entry.field153 = atoi(row[153]); + entry.short_buff_box = atoi(row[154]); + entry.descnum = atoi(row[155]); + entry.typedescnum = atoi(row[156]); + entry.effectdescnum = atoi(row[157]); + entry.effectdescnum2 = atoi(row[158]); + entry.npc_no_los = atoi(row[159]); + entry.field160 = atoi(row[160]); + entry.reflectable = atoi(row[161]); + entry.bonushate = atoi(row[162]); + entry.field163 = atoi(row[163]); + entry.field164 = atoi(row[164]); + entry.ldon_trap = atoi(row[165]); + entry.EndurCost = atoi(row[166]); + entry.EndurTimerIndex = atoi(row[167]); + entry.IsDiscipline = atoi(row[168]); + entry.field169 = atoi(row[169]); + entry.field170 = atoi(row[170]); + entry.field171 = atoi(row[171]); + entry.field172 = atoi(row[172]); + entry.HateAdded = atoi(row[173]); + entry.EndurUpkeep = atoi(row[174]); + entry.numhitstype = atoi(row[175]); + entry.numhits = atoi(row[176]); + entry.pvpresistbase = atoi(row[177]); + entry.pvpresistcalc = atoi(row[178]); + entry.pvpresistcap = atoi(row[179]); + entry.spell_category = atoi(row[180]); + entry.field181 = atoi(row[181]); + entry.field182 = atoi(row[182]); + entry.pcnpc_only_flag = atoi(row[183]); + entry.cast_not_standing = atoi(row[184]); + entry.can_mgb = atoi(row[185]); + entry.nodispell = atoi(row[186]); + entry.npc_category = atoi(row[187]); + entry.npc_usefulness = atoi(row[188]); + entry.MinResist = atoi(row[189]); + entry.MaxResist = atoi(row[190]); + entry.viral_targets = atoi(row[191]); + entry.viral_timer = atoi(row[192]); + entry.nimbuseffect = atoi(row[193]); + entry.ConeStartAngle = atoi(row[194]); + entry.ConeStopAngle = atoi(row[195]); + entry.sneaking = atoi(row[196]); + entry.not_extendable = atoi(row[197]); + entry.field198 = atoi(row[198]); + entry.field199 = atoi(row[199]); + entry.suspendable = atoi(row[200]); + entry.viral_range = atoi(row[201]); + entry.songcap = atoi(row[202]); + entry.field203 = atoi(row[203]); + entry.field204 = atoi(row[204]); + entry.no_block = atoi(row[205]); + entry.field206 = atoi(row[206]); + entry.spellgroup = atoi(row[207]); + entry.rank = atoi(row[208]); + entry.field209 = atoi(row[209]); + entry.field210 = atoi(row[210]); + entry.CastRestriction = atoi(row[211]); + entry.allowrest = atoi(row[212]); + entry.InCombat = atoi(row[213]); + entry.OutofCombat = atoi(row[214]); + entry.field215 = atoi(row[215]); + entry.field216 = atoi(row[216]); + entry.field217 = atoi(row[217]); + entry.aemaxtargets = atoi(row[218]); + entry.maxtargets = atoi(row[219]); + entry.field220 = atoi(row[220]); + entry.field221 = atoi(row[221]); + entry.field222 = atoi(row[222]); + entry.field223 = atoi(row[223]); + entry.persistdeath = atoi(row[224]); + entry.field225 = atoi(row[225]); + entry.field226 = atoi(row[226]); + entry.min_dist = static_cast(atof(row[227])); + entry.min_dist_mod = static_cast(atof(row[228])); + entry.max_dist = static_cast(atof(row[229])); + entry.max_dist_mod = static_cast(atof(row[230])); + entry.min_range = atoi(row[231]); + entry.field232 = atoi(row[232]); + entry.field233 = atoi(row[233]); + entry.field234 = atoi(row[234]); + entry.field235 = atoi(row[235]); + entry.field236 = atoi(row[236]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + SpellsNew entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.player_1 = row[2] ? row[2] : ""; + entry.teleport_zone = row[3] ? row[3] : ""; + entry.you_cast = row[4] ? row[4] : ""; + entry.other_casts = row[5] ? row[5] : ""; + entry.cast_on_you = row[6] ? row[6] : ""; + entry.cast_on_other = row[7] ? row[7] : ""; + entry.spell_fades = row[8] ? row[8] : ""; + entry.range = atoi(row[9]); + entry.aoerange = atoi(row[10]); + entry.pushback = atoi(row[11]); + entry.pushup = atoi(row[12]); + entry.cast_time = atoi(row[13]); + entry.recovery_time = atoi(row[14]); + entry.recast_time = atoi(row[15]); + entry.buffdurationformula = atoi(row[16]); + entry.buffduration = atoi(row[17]); + entry.AEDuration = atoi(row[18]); + entry.mana = atoi(row[19]); + entry.effect_base_value1 = atoi(row[20]); + entry.effect_base_value2 = atoi(row[21]); + entry.effect_base_value3 = atoi(row[22]); + entry.effect_base_value4 = atoi(row[23]); + entry.effect_base_value5 = atoi(row[24]); + entry.effect_base_value6 = atoi(row[25]); + entry.effect_base_value7 = atoi(row[26]); + entry.effect_base_value8 = atoi(row[27]); + entry.effect_base_value9 = atoi(row[28]); + entry.effect_base_value10 = atoi(row[29]); + entry.effect_base_value11 = atoi(row[30]); + entry.effect_base_value12 = atoi(row[31]); + entry.effect_limit_value1 = atoi(row[32]); + entry.effect_limit_value2 = atoi(row[33]); + entry.effect_limit_value3 = atoi(row[34]); + entry.effect_limit_value4 = atoi(row[35]); + entry.effect_limit_value5 = atoi(row[36]); + entry.effect_limit_value6 = atoi(row[37]); + entry.effect_limit_value7 = atoi(row[38]); + entry.effect_limit_value8 = atoi(row[39]); + entry.effect_limit_value9 = atoi(row[40]); + entry.effect_limit_value10 = atoi(row[41]); + entry.effect_limit_value11 = atoi(row[42]); + entry.effect_limit_value12 = atoi(row[43]); + entry.max1 = atoi(row[44]); + entry.max2 = atoi(row[45]); + entry.max3 = atoi(row[46]); + entry.max4 = atoi(row[47]); + entry.max5 = atoi(row[48]); + entry.max6 = atoi(row[49]); + entry.max7 = atoi(row[50]); + entry.max8 = atoi(row[51]); + entry.max9 = atoi(row[52]); + entry.max10 = atoi(row[53]); + entry.max11 = atoi(row[54]); + entry.max12 = atoi(row[55]); + entry.icon = atoi(row[56]); + entry.memicon = atoi(row[57]); + entry.components1 = atoi(row[58]); + entry.components2 = atoi(row[59]); + entry.components3 = atoi(row[60]); + entry.components4 = atoi(row[61]); + entry.component_counts1 = atoi(row[62]); + entry.component_counts2 = atoi(row[63]); + entry.component_counts3 = atoi(row[64]); + entry.component_counts4 = atoi(row[65]); + entry.NoexpendReagent1 = atoi(row[66]); + entry.NoexpendReagent2 = atoi(row[67]); + entry.NoexpendReagent3 = atoi(row[68]); + entry.NoexpendReagent4 = atoi(row[69]); + entry.formula1 = atoi(row[70]); + entry.formula2 = atoi(row[71]); + entry.formula3 = atoi(row[72]); + entry.formula4 = atoi(row[73]); + entry.formula5 = atoi(row[74]); + entry.formula6 = atoi(row[75]); + entry.formula7 = atoi(row[76]); + entry.formula8 = atoi(row[77]); + entry.formula9 = atoi(row[78]); + entry.formula10 = atoi(row[79]); + entry.formula11 = atoi(row[80]); + entry.formula12 = atoi(row[81]); + entry.LightType = atoi(row[82]); + entry.goodEffect = atoi(row[83]); + entry.Activated = atoi(row[84]); + entry.resisttype = atoi(row[85]); + entry.effectid1 = atoi(row[86]); + entry.effectid2 = atoi(row[87]); + entry.effectid3 = atoi(row[88]); + entry.effectid4 = atoi(row[89]); + entry.effectid5 = atoi(row[90]); + entry.effectid6 = atoi(row[91]); + entry.effectid7 = atoi(row[92]); + entry.effectid8 = atoi(row[93]); + entry.effectid9 = atoi(row[94]); + entry.effectid10 = atoi(row[95]); + entry.effectid11 = atoi(row[96]); + entry.effectid12 = atoi(row[97]); + entry.targettype = atoi(row[98]); + entry.basediff = atoi(row[99]); + entry.skill = atoi(row[100]); + entry.zonetype = atoi(row[101]); + entry.EnvironmentType = atoi(row[102]); + entry.TimeOfDay = atoi(row[103]); + entry.classes1 = atoi(row[104]); + entry.classes2 = atoi(row[105]); + entry.classes3 = atoi(row[106]); + entry.classes4 = atoi(row[107]); + entry.classes5 = atoi(row[108]); + entry.classes6 = atoi(row[109]); + entry.classes7 = atoi(row[110]); + entry.classes8 = atoi(row[111]); + entry.classes9 = atoi(row[112]); + entry.classes10 = atoi(row[113]); + entry.classes11 = atoi(row[114]); + entry.classes12 = atoi(row[115]); + entry.classes13 = atoi(row[116]); + entry.classes14 = atoi(row[117]); + entry.classes15 = atoi(row[118]); + entry.classes16 = atoi(row[119]); + entry.CastingAnim = atoi(row[120]); + entry.TargetAnim = atoi(row[121]); + entry.TravelType = atoi(row[122]); + entry.SpellAffectIndex = atoi(row[123]); + entry.disallow_sit = atoi(row[124]); + entry.deities0 = atoi(row[125]); + entry.deities1 = atoi(row[126]); + entry.deities2 = atoi(row[127]); + entry.deities3 = atoi(row[128]); + entry.deities4 = atoi(row[129]); + entry.deities5 = atoi(row[130]); + entry.deities6 = atoi(row[131]); + entry.deities7 = atoi(row[132]); + entry.deities8 = atoi(row[133]); + entry.deities9 = atoi(row[134]); + entry.deities10 = atoi(row[135]); + entry.deities11 = atoi(row[136]); + entry.deities12 = atoi(row[137]); + entry.deities13 = atoi(row[138]); + entry.deities14 = atoi(row[139]); + entry.deities15 = atoi(row[140]); + entry.deities16 = atoi(row[141]); + entry.field142 = atoi(row[142]); + entry.field143 = atoi(row[143]); + entry.new_icon = atoi(row[144]); + entry.spellanim = atoi(row[145]); + entry.uninterruptable = atoi(row[146]); + entry.ResistDiff = atoi(row[147]); + entry.dot_stacking_exempt = atoi(row[148]); + entry.deleteable = atoi(row[149]); + entry.RecourseLink = atoi(row[150]); + entry.no_partial_resist = atoi(row[151]); + entry.field152 = atoi(row[152]); + entry.field153 = atoi(row[153]); + entry.short_buff_box = atoi(row[154]); + entry.descnum = atoi(row[155]); + entry.typedescnum = atoi(row[156]); + entry.effectdescnum = atoi(row[157]); + entry.effectdescnum2 = atoi(row[158]); + entry.npc_no_los = atoi(row[159]); + entry.field160 = atoi(row[160]); + entry.reflectable = atoi(row[161]); + entry.bonushate = atoi(row[162]); + entry.field163 = atoi(row[163]); + entry.field164 = atoi(row[164]); + entry.ldon_trap = atoi(row[165]); + entry.EndurCost = atoi(row[166]); + entry.EndurTimerIndex = atoi(row[167]); + entry.IsDiscipline = atoi(row[168]); + entry.field169 = atoi(row[169]); + entry.field170 = atoi(row[170]); + entry.field171 = atoi(row[171]); + entry.field172 = atoi(row[172]); + entry.HateAdded = atoi(row[173]); + entry.EndurUpkeep = atoi(row[174]); + entry.numhitstype = atoi(row[175]); + entry.numhits = atoi(row[176]); + entry.pvpresistbase = atoi(row[177]); + entry.pvpresistcalc = atoi(row[178]); + entry.pvpresistcap = atoi(row[179]); + entry.spell_category = atoi(row[180]); + entry.field181 = atoi(row[181]); + entry.field182 = atoi(row[182]); + entry.pcnpc_only_flag = atoi(row[183]); + entry.cast_not_standing = atoi(row[184]); + entry.can_mgb = atoi(row[185]); + entry.nodispell = atoi(row[186]); + entry.npc_category = atoi(row[187]); + entry.npc_usefulness = atoi(row[188]); + entry.MinResist = atoi(row[189]); + entry.MaxResist = atoi(row[190]); + entry.viral_targets = atoi(row[191]); + entry.viral_timer = atoi(row[192]); + entry.nimbuseffect = atoi(row[193]); + entry.ConeStartAngle = atoi(row[194]); + entry.ConeStopAngle = atoi(row[195]); + entry.sneaking = atoi(row[196]); + entry.not_extendable = atoi(row[197]); + entry.field198 = atoi(row[198]); + entry.field199 = atoi(row[199]); + entry.suspendable = atoi(row[200]); + entry.viral_range = atoi(row[201]); + entry.songcap = atoi(row[202]); + entry.field203 = atoi(row[203]); + entry.field204 = atoi(row[204]); + entry.no_block = atoi(row[205]); + entry.field206 = atoi(row[206]); + entry.spellgroup = atoi(row[207]); + entry.rank = atoi(row[208]); + entry.field209 = atoi(row[209]); + entry.field210 = atoi(row[210]); + entry.CastRestriction = atoi(row[211]); + entry.allowrest = atoi(row[212]); + entry.InCombat = atoi(row[213]); + entry.OutofCombat = atoi(row[214]); + entry.field215 = atoi(row[215]); + entry.field216 = atoi(row[216]); + entry.field217 = atoi(row[217]); + entry.aemaxtargets = atoi(row[218]); + entry.maxtargets = atoi(row[219]); + entry.field220 = atoi(row[220]); + entry.field221 = atoi(row[221]); + entry.field222 = atoi(row[222]); + entry.field223 = atoi(row[223]); + entry.persistdeath = atoi(row[224]); + entry.field225 = atoi(row[225]); + entry.field226 = atoi(row[226]); + entry.min_dist = static_cast(atof(row[227])); + entry.min_dist_mod = static_cast(atof(row[228])); + entry.max_dist = static_cast(atof(row[229])); + entry.max_dist_mod = static_cast(atof(row[230])); + entry.min_range = atoi(row[231]); + entry.field232 = atoi(row[232]); + entry.field233 = atoi(row[233]); + entry.field234 = atoi(row[234]); + entry.field235 = atoi(row[235]); + entry.field236 = atoi(row[236]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_SPELLS_NEW_REPOSITORY_H diff --git a/common/repositories/base/base_start_zones_repository.h b/common/repositories/base/base_start_zones_repository.h new file mode 100644 index 000000000..75a8595ca --- /dev/null +++ b/common/repositories/base/base_start_zones_repository.h @@ -0,0 +1,446 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_START_ZONES_REPOSITORY_H +#define EQEMU_BASE_START_ZONES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseStartZonesRepository { +public: + struct StartZones { + float x; + float y; + float z; + float heading; + int zone_id; + int bind_id; + int player_choice; + int player_class; + int player_deity; + int player_race; + int start_zone; + float bind_x; + float bind_y; + float bind_z; + int select_rank; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("player_choice"); + } + + static std::vector Columns() + { + return { + "x", + "y", + "z", + "heading", + "zone_id", + "bind_id", + "player_choice", + "player_class", + "player_deity", + "player_race", + "start_zone", + "bind_x", + "bind_y", + "bind_z", + "select_rank", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("start_zones"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static StartZones NewEntity() + { + StartZones entry{}; + + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.heading = 0; + entry.zone_id = 0; + entry.bind_id = 0; + entry.player_choice = 0; + entry.player_class = 0; + entry.player_deity = 0; + entry.player_race = 0; + entry.start_zone = 0; + entry.bind_x = 0; + entry.bind_y = 0; + entry.bind_z = 0; + entry.select_rank = 50; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static StartZones GetStartZonesEntry( + const std::vector &start_zoness, + int start_zones_id + ) + { + for (auto &start_zones : start_zoness) { + if (start_zones.player_choice == start_zones_id) { + return start_zones; + } + } + + return NewEntity(); + } + + static StartZones FindOne( + Database& db, + int start_zones_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + start_zones_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + StartZones entry{}; + + entry.x = static_cast(atof(row[0])); + entry.y = static_cast(atof(row[1])); + entry.z = static_cast(atof(row[2])); + entry.heading = static_cast(atof(row[3])); + entry.zone_id = atoi(row[4]); + entry.bind_id = atoi(row[5]); + entry.player_choice = atoi(row[6]); + entry.player_class = atoi(row[7]); + entry.player_deity = atoi(row[8]); + entry.player_race = atoi(row[9]); + entry.start_zone = atoi(row[10]); + entry.bind_x = static_cast(atof(row[11])); + entry.bind_y = static_cast(atof(row[12])); + entry.bind_z = static_cast(atof(row[13])); + entry.select_rank = atoi(row[14]); + entry.min_expansion = atoi(row[15]); + entry.max_expansion = atoi(row[16]); + entry.content_flags = row[17] ? row[17] : ""; + entry.content_flags_disabled = row[18] ? row[18] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int start_zones_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + start_zones_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + StartZones start_zones_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(start_zones_entry.x)); + update_values.push_back(columns[1] + " = " + std::to_string(start_zones_entry.y)); + update_values.push_back(columns[2] + " = " + std::to_string(start_zones_entry.z)); + update_values.push_back(columns[3] + " = " + std::to_string(start_zones_entry.heading)); + update_values.push_back(columns[4] + " = " + std::to_string(start_zones_entry.zone_id)); + update_values.push_back(columns[5] + " = " + std::to_string(start_zones_entry.bind_id)); + update_values.push_back(columns[6] + " = " + std::to_string(start_zones_entry.player_choice)); + update_values.push_back(columns[7] + " = " + std::to_string(start_zones_entry.player_class)); + update_values.push_back(columns[8] + " = " + std::to_string(start_zones_entry.player_deity)); + update_values.push_back(columns[9] + " = " + std::to_string(start_zones_entry.player_race)); + update_values.push_back(columns[10] + " = " + std::to_string(start_zones_entry.start_zone)); + update_values.push_back(columns[11] + " = " + std::to_string(start_zones_entry.bind_x)); + update_values.push_back(columns[12] + " = " + std::to_string(start_zones_entry.bind_y)); + update_values.push_back(columns[13] + " = " + std::to_string(start_zones_entry.bind_z)); + update_values.push_back(columns[14] + " = " + std::to_string(start_zones_entry.select_rank)); + update_values.push_back(columns[15] + " = " + std::to_string(start_zones_entry.min_expansion)); + update_values.push_back(columns[16] + " = " + std::to_string(start_zones_entry.max_expansion)); + update_values.push_back(columns[17] + " = '" + EscapeString(start_zones_entry.content_flags) + "'"); + update_values.push_back(columns[18] + " = '" + EscapeString(start_zones_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + start_zones_entry.player_choice + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static StartZones InsertOne( + Database& db, + StartZones start_zones_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(start_zones_entry.x)); + insert_values.push_back(std::to_string(start_zones_entry.y)); + insert_values.push_back(std::to_string(start_zones_entry.z)); + insert_values.push_back(std::to_string(start_zones_entry.heading)); + insert_values.push_back(std::to_string(start_zones_entry.zone_id)); + insert_values.push_back(std::to_string(start_zones_entry.bind_id)); + insert_values.push_back(std::to_string(start_zones_entry.player_choice)); + insert_values.push_back(std::to_string(start_zones_entry.player_class)); + insert_values.push_back(std::to_string(start_zones_entry.player_deity)); + insert_values.push_back(std::to_string(start_zones_entry.player_race)); + insert_values.push_back(std::to_string(start_zones_entry.start_zone)); + insert_values.push_back(std::to_string(start_zones_entry.bind_x)); + insert_values.push_back(std::to_string(start_zones_entry.bind_y)); + insert_values.push_back(std::to_string(start_zones_entry.bind_z)); + insert_values.push_back(std::to_string(start_zones_entry.select_rank)); + insert_values.push_back(std::to_string(start_zones_entry.min_expansion)); + insert_values.push_back(std::to_string(start_zones_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(start_zones_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(start_zones_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + start_zones_entry.player_choice = results.LastInsertedID(); + return start_zones_entry; + } + + start_zones_entry = NewEntity(); + + return start_zones_entry; + } + + static int InsertMany( + Database& db, + std::vector start_zones_entries + ) + { + std::vector insert_chunks; + + for (auto &start_zones_entry: start_zones_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(start_zones_entry.x)); + insert_values.push_back(std::to_string(start_zones_entry.y)); + insert_values.push_back(std::to_string(start_zones_entry.z)); + insert_values.push_back(std::to_string(start_zones_entry.heading)); + insert_values.push_back(std::to_string(start_zones_entry.zone_id)); + insert_values.push_back(std::to_string(start_zones_entry.bind_id)); + insert_values.push_back(std::to_string(start_zones_entry.player_choice)); + insert_values.push_back(std::to_string(start_zones_entry.player_class)); + insert_values.push_back(std::to_string(start_zones_entry.player_deity)); + insert_values.push_back(std::to_string(start_zones_entry.player_race)); + insert_values.push_back(std::to_string(start_zones_entry.start_zone)); + insert_values.push_back(std::to_string(start_zones_entry.bind_x)); + insert_values.push_back(std::to_string(start_zones_entry.bind_y)); + insert_values.push_back(std::to_string(start_zones_entry.bind_z)); + insert_values.push_back(std::to_string(start_zones_entry.select_rank)); + insert_values.push_back(std::to_string(start_zones_entry.min_expansion)); + insert_values.push_back(std::to_string(start_zones_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(start_zones_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(start_zones_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + StartZones entry{}; + + entry.x = static_cast(atof(row[0])); + entry.y = static_cast(atof(row[1])); + entry.z = static_cast(atof(row[2])); + entry.heading = static_cast(atof(row[3])); + entry.zone_id = atoi(row[4]); + entry.bind_id = atoi(row[5]); + entry.player_choice = atoi(row[6]); + entry.player_class = atoi(row[7]); + entry.player_deity = atoi(row[8]); + entry.player_race = atoi(row[9]); + entry.start_zone = atoi(row[10]); + entry.bind_x = static_cast(atof(row[11])); + entry.bind_y = static_cast(atof(row[12])); + entry.bind_z = static_cast(atof(row[13])); + entry.select_rank = atoi(row[14]); + entry.min_expansion = atoi(row[15]); + entry.max_expansion = atoi(row[16]); + entry.content_flags = row[17] ? row[17] : ""; + entry.content_flags_disabled = row[18] ? row[18] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + StartZones entry{}; + + entry.x = static_cast(atof(row[0])); + entry.y = static_cast(atof(row[1])); + entry.z = static_cast(atof(row[2])); + entry.heading = static_cast(atof(row[3])); + entry.zone_id = atoi(row[4]); + entry.bind_id = atoi(row[5]); + entry.player_choice = atoi(row[6]); + entry.player_class = atoi(row[7]); + entry.player_deity = atoi(row[8]); + entry.player_race = atoi(row[9]); + entry.start_zone = atoi(row[10]); + entry.bind_x = static_cast(atof(row[11])); + entry.bind_y = static_cast(atof(row[12])); + entry.bind_z = static_cast(atof(row[13])); + entry.select_rank = atoi(row[14]); + entry.min_expansion = atoi(row[15]); + entry.max_expansion = atoi(row[16]); + entry.content_flags = row[17] ? row[17] : ""; + entry.content_flags_disabled = row[18] ? row[18] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_START_ZONES_REPOSITORY_H diff --git a/common/repositories/base/base_starting_items_repository.h b/common/repositories/base/base_starting_items_repository.h new file mode 100644 index 000000000..edb2cafa9 --- /dev/null +++ b/common/repositories/base/base_starting_items_repository.h @@ -0,0 +1,391 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_STARTING_ITEMS_REPOSITORY_H +#define EQEMU_BASE_STARTING_ITEMS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseStartingItemsRepository { +public: + struct StartingItems { + int id; + int race; + int class; + int deityid; + int zoneid; + int itemid; + int item_charges; + int gm; + int slot; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "race", + "class", + "deityid", + "zoneid", + "itemid", + "item_charges", + "gm", + "slot", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("starting_items"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static StartingItems NewEntity() + { + StartingItems entry{}; + + entry.id = 0; + entry.race = 0; + entry.class = 0; + entry.deityid = 0; + entry.zoneid = 0; + entry.itemid = 0; + entry.item_charges = 1; + entry.gm = 0; + entry.slot = -1; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static StartingItems GetStartingItemsEntry( + const std::vector &starting_itemss, + int starting_items_id + ) + { + for (auto &starting_items : starting_itemss) { + if (starting_items.id == starting_items_id) { + return starting_items; + } + } + + return NewEntity(); + } + + static StartingItems FindOne( + Database& db, + int starting_items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + starting_items_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + StartingItems entry{}; + + entry.id = atoi(row[0]); + entry.race = atoi(row[1]); + entry.class = atoi(row[2]); + entry.deityid = atoi(row[3]); + entry.zoneid = atoi(row[4]); + entry.itemid = atoi(row[5]); + entry.item_charges = atoi(row[6]); + entry.gm = atoi(row[7]); + entry.slot = atoi(row[8]); + entry.min_expansion = atoi(row[9]); + entry.max_expansion = atoi(row[10]); + entry.content_flags = row[11] ? row[11] : ""; + entry.content_flags_disabled = row[12] ? row[12] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int starting_items_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + starting_items_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + StartingItems starting_items_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(starting_items_entry.race)); + update_values.push_back(columns[2] + " = " + std::to_string(starting_items_entry.class)); + update_values.push_back(columns[3] + " = " + std::to_string(starting_items_entry.deityid)); + update_values.push_back(columns[4] + " = " + std::to_string(starting_items_entry.zoneid)); + update_values.push_back(columns[5] + " = " + std::to_string(starting_items_entry.itemid)); + update_values.push_back(columns[6] + " = " + std::to_string(starting_items_entry.item_charges)); + update_values.push_back(columns[7] + " = " + std::to_string(starting_items_entry.gm)); + update_values.push_back(columns[8] + " = " + std::to_string(starting_items_entry.slot)); + update_values.push_back(columns[9] + " = " + std::to_string(starting_items_entry.min_expansion)); + update_values.push_back(columns[10] + " = " + std::to_string(starting_items_entry.max_expansion)); + update_values.push_back(columns[11] + " = '" + EscapeString(starting_items_entry.content_flags) + "'"); + update_values.push_back(columns[12] + " = '" + EscapeString(starting_items_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + starting_items_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static StartingItems InsertOne( + Database& db, + StartingItems starting_items_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(starting_items_entry.id)); + insert_values.push_back(std::to_string(starting_items_entry.race)); + insert_values.push_back(std::to_string(starting_items_entry.class)); + insert_values.push_back(std::to_string(starting_items_entry.deityid)); + insert_values.push_back(std::to_string(starting_items_entry.zoneid)); + insert_values.push_back(std::to_string(starting_items_entry.itemid)); + insert_values.push_back(std::to_string(starting_items_entry.item_charges)); + insert_values.push_back(std::to_string(starting_items_entry.gm)); + insert_values.push_back(std::to_string(starting_items_entry.slot)); + insert_values.push_back(std::to_string(starting_items_entry.min_expansion)); + insert_values.push_back(std::to_string(starting_items_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(starting_items_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(starting_items_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + starting_items_entry.id = results.LastInsertedID(); + return starting_items_entry; + } + + starting_items_entry = NewEntity(); + + return starting_items_entry; + } + + static int InsertMany( + Database& db, + std::vector starting_items_entries + ) + { + std::vector insert_chunks; + + for (auto &starting_items_entry: starting_items_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(starting_items_entry.id)); + insert_values.push_back(std::to_string(starting_items_entry.race)); + insert_values.push_back(std::to_string(starting_items_entry.class)); + insert_values.push_back(std::to_string(starting_items_entry.deityid)); + insert_values.push_back(std::to_string(starting_items_entry.zoneid)); + insert_values.push_back(std::to_string(starting_items_entry.itemid)); + insert_values.push_back(std::to_string(starting_items_entry.item_charges)); + insert_values.push_back(std::to_string(starting_items_entry.gm)); + insert_values.push_back(std::to_string(starting_items_entry.slot)); + insert_values.push_back(std::to_string(starting_items_entry.min_expansion)); + insert_values.push_back(std::to_string(starting_items_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(starting_items_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(starting_items_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + StartingItems entry{}; + + entry.id = atoi(row[0]); + entry.race = atoi(row[1]); + entry.class = atoi(row[2]); + entry.deityid = atoi(row[3]); + entry.zoneid = atoi(row[4]); + entry.itemid = atoi(row[5]); + entry.item_charges = atoi(row[6]); + entry.gm = atoi(row[7]); + entry.slot = atoi(row[8]); + entry.min_expansion = atoi(row[9]); + entry.max_expansion = atoi(row[10]); + entry.content_flags = row[11] ? row[11] : ""; + entry.content_flags_disabled = row[12] ? row[12] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + StartingItems entry{}; + + entry.id = atoi(row[0]); + entry.race = atoi(row[1]); + entry.class = atoi(row[2]); + entry.deityid = atoi(row[3]); + entry.zoneid = atoi(row[4]); + entry.itemid = atoi(row[5]); + entry.item_charges = atoi(row[6]); + entry.gm = atoi(row[7]); + entry.slot = atoi(row[8]); + entry.min_expansion = atoi(row[9]); + entry.max_expansion = atoi(row[10]); + entry.content_flags = row[11] ? row[11] : ""; + entry.content_flags_disabled = row[12] ? row[12] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_STARTING_ITEMS_REPOSITORY_H diff --git a/common/repositories/base/base_task_activities_repository.h b/common/repositories/base/base_task_activities_repository.h new file mode 100644 index 000000000..ad7f1fee4 --- /dev/null +++ b/common/repositories/base/base_task_activities_repository.h @@ -0,0 +1,410 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TASK_ACTIVITIES_REPOSITORY_H +#define EQEMU_BASE_TASK_ACTIVITIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTaskActivitiesRepository { +public: + struct TaskActivities { + int taskid; + int activityid; + int step; + int activitytype; + std::string target_name; + std::string item_list; + std::string skill_list; + std::string spell_list; + std::string description_override; + int goalid; + int goalmethod; + int goalcount; + int delivertonpc; + std::string zones; + int optional; + }; + + static std::string PrimaryKey() + { + return std::string("taskid"); + } + + static std::vector Columns() + { + return { + "taskid", + "activityid", + "step", + "activitytype", + "target_name", + "item_list", + "skill_list", + "spell_list", + "description_override", + "goalid", + "goalmethod", + "goalcount", + "delivertonpc", + "zones", + "optional", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("task_activities"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static TaskActivities NewEntity() + { + TaskActivities entry{}; + + entry.taskid = 0; + entry.activityid = 0; + entry.step = 0; + entry.activitytype = 0; + entry.target_name = ""; + entry.item_list = ""; + entry.skill_list = "-1"; + entry.spell_list = "0"; + entry.description_override = ""; + entry.goalid = 0; + entry.goalmethod = 0; + entry.goalcount = 1; + entry.delivertonpc = 0; + entry.zones = ""; + entry.optional = 0; + + return entry; + } + + static TaskActivities GetTaskActivitiesEntry( + const std::vector &task_activitiess, + int task_activities_id + ) + { + for (auto &task_activities : task_activitiess) { + if (task_activities.taskid == task_activities_id) { + return task_activities; + } + } + + return NewEntity(); + } + + static TaskActivities FindOne( + Database& db, + int task_activities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + task_activities_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + TaskActivities entry{}; + + entry.taskid = atoi(row[0]); + entry.activityid = atoi(row[1]); + entry.step = atoi(row[2]); + entry.activitytype = atoi(row[3]); + entry.target_name = row[4] ? row[4] : ""; + entry.item_list = row[5] ? row[5] : ""; + entry.skill_list = row[6] ? row[6] : ""; + entry.spell_list = row[7] ? row[7] : ""; + entry.description_override = row[8] ? row[8] : ""; + entry.goalid = atoi(row[9]); + entry.goalmethod = atoi(row[10]); + entry.goalcount = atoi(row[11]); + entry.delivertonpc = atoi(row[12]); + entry.zones = row[13] ? row[13] : ""; + entry.optional = atoi(row[14]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int task_activities_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + task_activities_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + TaskActivities task_activities_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(task_activities_entry.taskid)); + update_values.push_back(columns[1] + " = " + std::to_string(task_activities_entry.activityid)); + update_values.push_back(columns[2] + " = " + std::to_string(task_activities_entry.step)); + update_values.push_back(columns[3] + " = " + std::to_string(task_activities_entry.activitytype)); + update_values.push_back(columns[4] + " = '" + EscapeString(task_activities_entry.target_name) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(task_activities_entry.item_list) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(task_activities_entry.skill_list) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(task_activities_entry.spell_list) + "'"); + update_values.push_back(columns[8] + " = '" + EscapeString(task_activities_entry.description_override) + "'"); + update_values.push_back(columns[9] + " = " + std::to_string(task_activities_entry.goalid)); + update_values.push_back(columns[10] + " = " + std::to_string(task_activities_entry.goalmethod)); + update_values.push_back(columns[11] + " = " + std::to_string(task_activities_entry.goalcount)); + update_values.push_back(columns[12] + " = " + std::to_string(task_activities_entry.delivertonpc)); + update_values.push_back(columns[13] + " = '" + EscapeString(task_activities_entry.zones) + "'"); + update_values.push_back(columns[14] + " = " + std::to_string(task_activities_entry.optional)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + task_activities_entry.taskid + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static TaskActivities InsertOne( + Database& db, + TaskActivities task_activities_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(task_activities_entry.taskid)); + insert_values.push_back(std::to_string(task_activities_entry.activityid)); + insert_values.push_back(std::to_string(task_activities_entry.step)); + insert_values.push_back(std::to_string(task_activities_entry.activitytype)); + insert_values.push_back("'" + EscapeString(task_activities_entry.target_name) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.item_list) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.skill_list) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.spell_list) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.description_override) + "'"); + insert_values.push_back(std::to_string(task_activities_entry.goalid)); + insert_values.push_back(std::to_string(task_activities_entry.goalmethod)); + insert_values.push_back(std::to_string(task_activities_entry.goalcount)); + insert_values.push_back(std::to_string(task_activities_entry.delivertonpc)); + insert_values.push_back("'" + EscapeString(task_activities_entry.zones) + "'"); + insert_values.push_back(std::to_string(task_activities_entry.optional)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + task_activities_entry.taskid = results.LastInsertedID(); + return task_activities_entry; + } + + task_activities_entry = NewEntity(); + + return task_activities_entry; + } + + static int InsertMany( + Database& db, + std::vector task_activities_entries + ) + { + std::vector insert_chunks; + + for (auto &task_activities_entry: task_activities_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(task_activities_entry.taskid)); + insert_values.push_back(std::to_string(task_activities_entry.activityid)); + insert_values.push_back(std::to_string(task_activities_entry.step)); + insert_values.push_back(std::to_string(task_activities_entry.activitytype)); + insert_values.push_back("'" + EscapeString(task_activities_entry.target_name) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.item_list) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.skill_list) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.spell_list) + "'"); + insert_values.push_back("'" + EscapeString(task_activities_entry.description_override) + "'"); + insert_values.push_back(std::to_string(task_activities_entry.goalid)); + insert_values.push_back(std::to_string(task_activities_entry.goalmethod)); + insert_values.push_back(std::to_string(task_activities_entry.goalcount)); + insert_values.push_back(std::to_string(task_activities_entry.delivertonpc)); + insert_values.push_back("'" + EscapeString(task_activities_entry.zones) + "'"); + insert_values.push_back(std::to_string(task_activities_entry.optional)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TaskActivities entry{}; + + entry.taskid = atoi(row[0]); + entry.activityid = atoi(row[1]); + entry.step = atoi(row[2]); + entry.activitytype = atoi(row[3]); + entry.target_name = row[4] ? row[4] : ""; + entry.item_list = row[5] ? row[5] : ""; + entry.skill_list = row[6] ? row[6] : ""; + entry.spell_list = row[7] ? row[7] : ""; + entry.description_override = row[8] ? row[8] : ""; + entry.goalid = atoi(row[9]); + entry.goalmethod = atoi(row[10]); + entry.goalcount = atoi(row[11]); + entry.delivertonpc = atoi(row[12]); + entry.zones = row[13] ? row[13] : ""; + entry.optional = atoi(row[14]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TaskActivities entry{}; + + entry.taskid = atoi(row[0]); + entry.activityid = atoi(row[1]); + entry.step = atoi(row[2]); + entry.activitytype = atoi(row[3]); + entry.target_name = row[4] ? row[4] : ""; + entry.item_list = row[5] ? row[5] : ""; + entry.skill_list = row[6] ? row[6] : ""; + entry.spell_list = row[7] ? row[7] : ""; + entry.description_override = row[8] ? row[8] : ""; + entry.goalid = atoi(row[9]); + entry.goalmethod = atoi(row[10]); + entry.goalcount = atoi(row[11]); + entry.delivertonpc = atoi(row[12]); + entry.zones = row[13] ? row[13] : ""; + entry.optional = atoi(row[14]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TASK_ACTIVITIES_REPOSITORY_H diff --git a/common/repositories/base/base_tasks_repository.h b/common/repositories/base/base_tasks_repository.h new file mode 100644 index 000000000..3d1982bf2 --- /dev/null +++ b/common/repositories/base/base_tasks_repository.h @@ -0,0 +1,419 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TASKS_REPOSITORY_H +#define EQEMU_BASE_TASKS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTasksRepository { +public: + struct Tasks { + int id; + int type; + int duration; + int duration_code; + std::string title; + std::string description; + std::string reward; + int rewardid; + int cashreward; + int xpreward; + int rewardmethod; + int minlevel; + int maxlevel; + int repeatable; + int faction_reward; + std::string completion_emote; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "type", + "duration", + "duration_code", + "title", + "description", + "reward", + "rewardid", + "cashreward", + "xpreward", + "rewardmethod", + "minlevel", + "maxlevel", + "repeatable", + "faction_reward", + "completion_emote", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("tasks"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Tasks NewEntity() + { + Tasks entry{}; + + entry.id = 0; + entry.type = 0; + entry.duration = 0; + entry.duration_code = 0; + entry.title = ""; + entry.description = ""; + entry.reward = ""; + entry.rewardid = 0; + entry.cashreward = 0; + entry.xpreward = 0; + entry.rewardmethod = 2; + entry.minlevel = 0; + entry.maxlevel = 0; + entry.repeatable = 1; + entry.faction_reward = 0; + entry.completion_emote = ""; + + return entry; + } + + static Tasks GetTasksEntry( + const std::vector &taskss, + int tasks_id + ) + { + for (auto &tasks : taskss) { + if (tasks.id == tasks_id) { + return tasks; + } + } + + return NewEntity(); + } + + static Tasks FindOne( + Database& db, + int tasks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + tasks_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Tasks entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.duration = atoi(row[2]); + entry.duration_code = atoi(row[3]); + entry.title = row[4] ? row[4] : ""; + entry.description = row[5] ? row[5] : ""; + entry.reward = row[6] ? row[6] : ""; + entry.rewardid = atoi(row[7]); + entry.cashreward = atoi(row[8]); + entry.xpreward = atoi(row[9]); + entry.rewardmethod = atoi(row[10]); + entry.minlevel = atoi(row[11]); + entry.maxlevel = atoi(row[12]); + entry.repeatable = atoi(row[13]); + entry.faction_reward = atoi(row[14]); + entry.completion_emote = row[15] ? row[15] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int tasks_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + tasks_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Tasks tasks_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(tasks_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(tasks_entry.type)); + update_values.push_back(columns[2] + " = " + std::to_string(tasks_entry.duration)); + update_values.push_back(columns[3] + " = " + std::to_string(tasks_entry.duration_code)); + update_values.push_back(columns[4] + " = '" + EscapeString(tasks_entry.title) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(tasks_entry.description) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(tasks_entry.reward) + "'"); + update_values.push_back(columns[7] + " = " + std::to_string(tasks_entry.rewardid)); + update_values.push_back(columns[8] + " = " + std::to_string(tasks_entry.cashreward)); + update_values.push_back(columns[9] + " = " + std::to_string(tasks_entry.xpreward)); + update_values.push_back(columns[10] + " = " + std::to_string(tasks_entry.rewardmethod)); + update_values.push_back(columns[11] + " = " + std::to_string(tasks_entry.minlevel)); + update_values.push_back(columns[12] + " = " + std::to_string(tasks_entry.maxlevel)); + update_values.push_back(columns[13] + " = " + std::to_string(tasks_entry.repeatable)); + update_values.push_back(columns[14] + " = " + std::to_string(tasks_entry.faction_reward)); + update_values.push_back(columns[15] + " = '" + EscapeString(tasks_entry.completion_emote) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + tasks_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Tasks InsertOne( + Database& db, + Tasks tasks_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(tasks_entry.id)); + insert_values.push_back(std::to_string(tasks_entry.type)); + insert_values.push_back(std::to_string(tasks_entry.duration)); + insert_values.push_back(std::to_string(tasks_entry.duration_code)); + insert_values.push_back("'" + EscapeString(tasks_entry.title) + "'"); + insert_values.push_back("'" + EscapeString(tasks_entry.description) + "'"); + insert_values.push_back("'" + EscapeString(tasks_entry.reward) + "'"); + insert_values.push_back(std::to_string(tasks_entry.rewardid)); + insert_values.push_back(std::to_string(tasks_entry.cashreward)); + insert_values.push_back(std::to_string(tasks_entry.xpreward)); + insert_values.push_back(std::to_string(tasks_entry.rewardmethod)); + insert_values.push_back(std::to_string(tasks_entry.minlevel)); + insert_values.push_back(std::to_string(tasks_entry.maxlevel)); + insert_values.push_back(std::to_string(tasks_entry.repeatable)); + insert_values.push_back(std::to_string(tasks_entry.faction_reward)); + insert_values.push_back("'" + EscapeString(tasks_entry.completion_emote) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + tasks_entry.id = results.LastInsertedID(); + return tasks_entry; + } + + tasks_entry = NewEntity(); + + return tasks_entry; + } + + static int InsertMany( + Database& db, + std::vector tasks_entries + ) + { + std::vector insert_chunks; + + for (auto &tasks_entry: tasks_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(tasks_entry.id)); + insert_values.push_back(std::to_string(tasks_entry.type)); + insert_values.push_back(std::to_string(tasks_entry.duration)); + insert_values.push_back(std::to_string(tasks_entry.duration_code)); + insert_values.push_back("'" + EscapeString(tasks_entry.title) + "'"); + insert_values.push_back("'" + EscapeString(tasks_entry.description) + "'"); + insert_values.push_back("'" + EscapeString(tasks_entry.reward) + "'"); + insert_values.push_back(std::to_string(tasks_entry.rewardid)); + insert_values.push_back(std::to_string(tasks_entry.cashreward)); + insert_values.push_back(std::to_string(tasks_entry.xpreward)); + insert_values.push_back(std::to_string(tasks_entry.rewardmethod)); + insert_values.push_back(std::to_string(tasks_entry.minlevel)); + insert_values.push_back(std::to_string(tasks_entry.maxlevel)); + insert_values.push_back(std::to_string(tasks_entry.repeatable)); + insert_values.push_back(std::to_string(tasks_entry.faction_reward)); + insert_values.push_back("'" + EscapeString(tasks_entry.completion_emote) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Tasks entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.duration = atoi(row[2]); + entry.duration_code = atoi(row[3]); + entry.title = row[4] ? row[4] : ""; + entry.description = row[5] ? row[5] : ""; + entry.reward = row[6] ? row[6] : ""; + entry.rewardid = atoi(row[7]); + entry.cashreward = atoi(row[8]); + entry.xpreward = atoi(row[9]); + entry.rewardmethod = atoi(row[10]); + entry.minlevel = atoi(row[11]); + entry.maxlevel = atoi(row[12]); + entry.repeatable = atoi(row[13]); + entry.faction_reward = atoi(row[14]); + entry.completion_emote = row[15] ? row[15] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Tasks entry{}; + + entry.id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.duration = atoi(row[2]); + entry.duration_code = atoi(row[3]); + entry.title = row[4] ? row[4] : ""; + entry.description = row[5] ? row[5] : ""; + entry.reward = row[6] ? row[6] : ""; + entry.rewardid = atoi(row[7]); + entry.cashreward = atoi(row[8]); + entry.xpreward = atoi(row[9]); + entry.rewardmethod = atoi(row[10]); + entry.minlevel = atoi(row[11]); + entry.maxlevel = atoi(row[12]); + entry.repeatable = atoi(row[13]); + entry.faction_reward = atoi(row[14]); + entry.completion_emote = row[15] ? row[15] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TASKS_REPOSITORY_H diff --git a/common/repositories/base/base_tasksets_repository.h b/common/repositories/base/base_tasksets_repository.h new file mode 100644 index 000000000..c3feb4ccd --- /dev/null +++ b/common/repositories/base/base_tasksets_repository.h @@ -0,0 +1,293 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TASKSETS_REPOSITORY_H +#define EQEMU_BASE_TASKSETS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTasksetsRepository { +public: + struct Tasksets { + int id; + int taskid; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "taskid", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("tasksets"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Tasksets NewEntity() + { + Tasksets entry{}; + + entry.id = 0; + entry.taskid = 0; + + return entry; + } + + static Tasksets GetTasksetsEntry( + const std::vector &tasksetss, + int tasksets_id + ) + { + for (auto &tasksets : tasksetss) { + if (tasksets.id == tasksets_id) { + return tasksets; + } + } + + return NewEntity(); + } + + static Tasksets FindOne( + Database& db, + int tasksets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + tasksets_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Tasksets entry{}; + + entry.id = atoi(row[0]); + entry.taskid = atoi(row[1]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int tasksets_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + tasksets_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Tasksets tasksets_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(tasksets_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(tasksets_entry.taskid)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + tasksets_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Tasksets InsertOne( + Database& db, + Tasksets tasksets_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(tasksets_entry.id)); + insert_values.push_back(std::to_string(tasksets_entry.taskid)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + tasksets_entry.id = results.LastInsertedID(); + return tasksets_entry; + } + + tasksets_entry = NewEntity(); + + return tasksets_entry; + } + + static int InsertMany( + Database& db, + std::vector tasksets_entries + ) + { + std::vector insert_chunks; + + for (auto &tasksets_entry: tasksets_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(tasksets_entry.id)); + insert_values.push_back(std::to_string(tasksets_entry.taskid)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Tasksets entry{}; + + entry.id = atoi(row[0]); + entry.taskid = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Tasksets entry{}; + + entry.id = atoi(row[0]); + entry.taskid = atoi(row[1]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TASKSETS_REPOSITORY_H diff --git a/common/repositories/base/base_timers_repository.h b/common/repositories/base/base_timers_repository.h new file mode 100644 index 000000000..f1d6d97b1 --- /dev/null +++ b/common/repositories/base/base_timers_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TIMERS_REPOSITORY_H +#define EQEMU_BASE_TIMERS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTimersRepository { +public: + struct Timers { + int char_id; + int type; + int start; + int duration; + int enable; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "type", + "start", + "duration", + "enable", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("timers"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Timers NewEntity() + { + Timers entry{}; + + entry.char_id = 0; + entry.type = 0; + entry.start = 0; + entry.duration = 0; + entry.enable = 0; + + return entry; + } + + static Timers GetTimersEntry( + const std::vector &timerss, + int timers_id + ) + { + for (auto &timers : timerss) { + if (timers.char_id == timers_id) { + return timers; + } + } + + return NewEntity(); + } + + static Timers FindOne( + Database& db, + int timers_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + timers_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Timers entry{}; + + entry.char_id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.start = atoi(row[2]); + entry.duration = atoi(row[3]); + entry.enable = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int timers_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + timers_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Timers timers_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(timers_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(timers_entry.type)); + update_values.push_back(columns[2] + " = " + std::to_string(timers_entry.start)); + update_values.push_back(columns[3] + " = " + std::to_string(timers_entry.duration)); + update_values.push_back(columns[4] + " = " + std::to_string(timers_entry.enable)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + timers_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Timers InsertOne( + Database& db, + Timers timers_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(timers_entry.char_id)); + insert_values.push_back(std::to_string(timers_entry.type)); + insert_values.push_back(std::to_string(timers_entry.start)); + insert_values.push_back(std::to_string(timers_entry.duration)); + insert_values.push_back(std::to_string(timers_entry.enable)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + timers_entry.char_id = results.LastInsertedID(); + return timers_entry; + } + + timers_entry = NewEntity(); + + return timers_entry; + } + + static int InsertMany( + Database& db, + std::vector timers_entries + ) + { + std::vector insert_chunks; + + for (auto &timers_entry: timers_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(timers_entry.char_id)); + insert_values.push_back(std::to_string(timers_entry.type)); + insert_values.push_back(std::to_string(timers_entry.start)); + insert_values.push_back(std::to_string(timers_entry.duration)); + insert_values.push_back(std::to_string(timers_entry.enable)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Timers entry{}; + + entry.char_id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.start = atoi(row[2]); + entry.duration = atoi(row[3]); + entry.enable = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Timers entry{}; + + entry.char_id = atoi(row[0]); + entry.type = atoi(row[1]); + entry.start = atoi(row[2]); + entry.duration = atoi(row[3]); + entry.enable = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TIMERS_REPOSITORY_H diff --git a/common/repositories/base/base_titles_repository.h b/common/repositories/base/base_titles_repository.h new file mode 100644 index 000000000..c108c887b --- /dev/null +++ b/common/repositories/base/base_titles_repository.h @@ -0,0 +1,400 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TITLES_REPOSITORY_H +#define EQEMU_BASE_TITLES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTitlesRepository { +public: + struct Titles { + int id; + int skill_id; + int min_skill_value; + int max_skill_value; + int min_aa_points; + int max_aa_points; + int class; + int gender; + int char_id; + int status; + int item_id; + std::string prefix; + std::string suffix; + int title_set; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "skill_id", + "min_skill_value", + "max_skill_value", + "min_aa_points", + "max_aa_points", + "class", + "gender", + "char_id", + "status", + "item_id", + "prefix", + "suffix", + "title_set", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("titles"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Titles NewEntity() + { + Titles entry{}; + + entry.id = 0; + entry.skill_id = -1; + entry.min_skill_value = -1; + entry.max_skill_value = -1; + entry.min_aa_points = -1; + entry.max_aa_points = -1; + entry.class = -1; + entry.gender = -1; + entry.char_id = -1; + entry.status = -1; + entry.item_id = -1; + entry.prefix = ""; + entry.suffix = ""; + entry.title_set = 0; + + return entry; + } + + static Titles GetTitlesEntry( + const std::vector &titless, + int titles_id + ) + { + for (auto &titles : titless) { + if (titles.id == titles_id) { + return titles; + } + } + + return NewEntity(); + } + + static Titles FindOne( + Database& db, + int titles_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + titles_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Titles entry{}; + + entry.id = atoi(row[0]); + entry.skill_id = atoi(row[1]); + entry.min_skill_value = atoi(row[2]); + entry.max_skill_value = atoi(row[3]); + entry.min_aa_points = atoi(row[4]); + entry.max_aa_points = atoi(row[5]); + entry.class = atoi(row[6]); + entry.gender = atoi(row[7]); + entry.char_id = atoi(row[8]); + entry.status = atoi(row[9]); + entry.item_id = atoi(row[10]); + entry.prefix = row[11] ? row[11] : ""; + entry.suffix = row[12] ? row[12] : ""; + entry.title_set = atoi(row[13]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int titles_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + titles_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Titles titles_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(titles_entry.skill_id)); + update_values.push_back(columns[2] + " = " + std::to_string(titles_entry.min_skill_value)); + update_values.push_back(columns[3] + " = " + std::to_string(titles_entry.max_skill_value)); + update_values.push_back(columns[4] + " = " + std::to_string(titles_entry.min_aa_points)); + update_values.push_back(columns[5] + " = " + std::to_string(titles_entry.max_aa_points)); + update_values.push_back(columns[6] + " = " + std::to_string(titles_entry.class)); + update_values.push_back(columns[7] + " = " + std::to_string(titles_entry.gender)); + update_values.push_back(columns[8] + " = " + std::to_string(titles_entry.char_id)); + update_values.push_back(columns[9] + " = " + std::to_string(titles_entry.status)); + update_values.push_back(columns[10] + " = " + std::to_string(titles_entry.item_id)); + update_values.push_back(columns[11] + " = '" + EscapeString(titles_entry.prefix) + "'"); + update_values.push_back(columns[12] + " = '" + EscapeString(titles_entry.suffix) + "'"); + update_values.push_back(columns[13] + " = " + std::to_string(titles_entry.title_set)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + titles_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Titles InsertOne( + Database& db, + Titles titles_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(titles_entry.id)); + insert_values.push_back(std::to_string(titles_entry.skill_id)); + insert_values.push_back(std::to_string(titles_entry.min_skill_value)); + insert_values.push_back(std::to_string(titles_entry.max_skill_value)); + insert_values.push_back(std::to_string(titles_entry.min_aa_points)); + insert_values.push_back(std::to_string(titles_entry.max_aa_points)); + insert_values.push_back(std::to_string(titles_entry.class)); + insert_values.push_back(std::to_string(titles_entry.gender)); + insert_values.push_back(std::to_string(titles_entry.char_id)); + insert_values.push_back(std::to_string(titles_entry.status)); + insert_values.push_back(std::to_string(titles_entry.item_id)); + insert_values.push_back("'" + EscapeString(titles_entry.prefix) + "'"); + insert_values.push_back("'" + EscapeString(titles_entry.suffix) + "'"); + insert_values.push_back(std::to_string(titles_entry.title_set)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + titles_entry.id = results.LastInsertedID(); + return titles_entry; + } + + titles_entry = NewEntity(); + + return titles_entry; + } + + static int InsertMany( + Database& db, + std::vector titles_entries + ) + { + std::vector insert_chunks; + + for (auto &titles_entry: titles_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(titles_entry.id)); + insert_values.push_back(std::to_string(titles_entry.skill_id)); + insert_values.push_back(std::to_string(titles_entry.min_skill_value)); + insert_values.push_back(std::to_string(titles_entry.max_skill_value)); + insert_values.push_back(std::to_string(titles_entry.min_aa_points)); + insert_values.push_back(std::to_string(titles_entry.max_aa_points)); + insert_values.push_back(std::to_string(titles_entry.class)); + insert_values.push_back(std::to_string(titles_entry.gender)); + insert_values.push_back(std::to_string(titles_entry.char_id)); + insert_values.push_back(std::to_string(titles_entry.status)); + insert_values.push_back(std::to_string(titles_entry.item_id)); + insert_values.push_back("'" + EscapeString(titles_entry.prefix) + "'"); + insert_values.push_back("'" + EscapeString(titles_entry.suffix) + "'"); + insert_values.push_back(std::to_string(titles_entry.title_set)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Titles entry{}; + + entry.id = atoi(row[0]); + entry.skill_id = atoi(row[1]); + entry.min_skill_value = atoi(row[2]); + entry.max_skill_value = atoi(row[3]); + entry.min_aa_points = atoi(row[4]); + entry.max_aa_points = atoi(row[5]); + entry.class = atoi(row[6]); + entry.gender = atoi(row[7]); + entry.char_id = atoi(row[8]); + entry.status = atoi(row[9]); + entry.item_id = atoi(row[10]); + entry.prefix = row[11] ? row[11] : ""; + entry.suffix = row[12] ? row[12] : ""; + entry.title_set = atoi(row[13]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Titles entry{}; + + entry.id = atoi(row[0]); + entry.skill_id = atoi(row[1]); + entry.min_skill_value = atoi(row[2]); + entry.max_skill_value = atoi(row[3]); + entry.min_aa_points = atoi(row[4]); + entry.max_aa_points = atoi(row[5]); + entry.class = atoi(row[6]); + entry.gender = atoi(row[7]); + entry.char_id = atoi(row[8]); + entry.status = atoi(row[9]); + entry.item_id = atoi(row[10]); + entry.prefix = row[11] ? row[11] : ""; + entry.suffix = row[12] ? row[12] : ""; + entry.title_set = atoi(row[13]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TITLES_REPOSITORY_H diff --git a/common/repositories/base/base_trader_repository.h b/common/repositories/base/base_trader_repository.h new file mode 100644 index 000000000..1eded1551 --- /dev/null +++ b/common/repositories/base/base_trader_repository.h @@ -0,0 +1,329 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TRADER_REPOSITORY_H +#define EQEMU_BASE_TRADER_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTraderRepository { +public: + struct Trader { + int char_id; + int item_id; + int serialnumber; + int charges; + int item_cost; + int slot_id; + }; + + static std::string PrimaryKey() + { + return std::string("char_id"); + } + + static std::vector Columns() + { + return { + "char_id", + "item_id", + "serialnumber", + "charges", + "item_cost", + "slot_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("trader"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Trader NewEntity() + { + Trader entry{}; + + entry.char_id = 0; + entry.item_id = 0; + entry.serialnumber = 0; + entry.charges = 0; + entry.item_cost = 0; + entry.slot_id = 0; + + return entry; + } + + static Trader GetTraderEntry( + const std::vector &traders, + int trader_id + ) + { + for (auto &trader : traders) { + if (trader.char_id == trader_id) { + return trader; + } + } + + return NewEntity(); + } + + static Trader FindOne( + Database& db, + int trader_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + trader_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Trader entry{}; + + entry.char_id = atoi(row[0]); + entry.item_id = atoi(row[1]); + entry.serialnumber = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.item_cost = atoi(row[4]); + entry.slot_id = atoi(row[5]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int trader_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + trader_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Trader trader_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(trader_entry.char_id)); + update_values.push_back(columns[1] + " = " + std::to_string(trader_entry.item_id)); + update_values.push_back(columns[2] + " = " + std::to_string(trader_entry.serialnumber)); + update_values.push_back(columns[3] + " = " + std::to_string(trader_entry.charges)); + update_values.push_back(columns[4] + " = " + std::to_string(trader_entry.item_cost)); + update_values.push_back(columns[5] + " = " + std::to_string(trader_entry.slot_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + trader_entry.char_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Trader InsertOne( + Database& db, + Trader trader_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(trader_entry.char_id)); + insert_values.push_back(std::to_string(trader_entry.item_id)); + insert_values.push_back(std::to_string(trader_entry.serialnumber)); + insert_values.push_back(std::to_string(trader_entry.charges)); + insert_values.push_back(std::to_string(trader_entry.item_cost)); + insert_values.push_back(std::to_string(trader_entry.slot_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + trader_entry.char_id = results.LastInsertedID(); + return trader_entry; + } + + trader_entry = NewEntity(); + + return trader_entry; + } + + static int InsertMany( + Database& db, + std::vector trader_entries + ) + { + std::vector insert_chunks; + + for (auto &trader_entry: trader_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(trader_entry.char_id)); + insert_values.push_back(std::to_string(trader_entry.item_id)); + insert_values.push_back(std::to_string(trader_entry.serialnumber)); + insert_values.push_back(std::to_string(trader_entry.charges)); + insert_values.push_back(std::to_string(trader_entry.item_cost)); + insert_values.push_back(std::to_string(trader_entry.slot_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Trader entry{}; + + entry.char_id = atoi(row[0]); + entry.item_id = atoi(row[1]); + entry.serialnumber = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.item_cost = atoi(row[4]); + entry.slot_id = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Trader entry{}; + + entry.char_id = atoi(row[0]); + entry.item_id = atoi(row[1]); + entry.serialnumber = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.item_cost = atoi(row[4]); + entry.slot_id = atoi(row[5]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TRADER_REPOSITORY_H diff --git a/common/repositories/base/base_tradeskill_recipe_entries_repository.h b/common/repositories/base/base_tradeskill_recipe_entries_repository.h new file mode 100644 index 000000000..13c293c77 --- /dev/null +++ b/common/repositories/base/base_tradeskill_recipe_entries_repository.h @@ -0,0 +1,346 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TRADESKILL_RECIPE_ENTRIES_REPOSITORY_H +#define EQEMU_BASE_TRADESKILL_RECIPE_ENTRIES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTradeskillRecipeEntriesRepository { +public: + struct TradeskillRecipeEntries { + int id; + int recipe_id; + int item_id; + int successcount; + int failcount; + int componentcount; + int salvagecount; + int iscontainer; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "recipe_id", + "item_id", + "successcount", + "failcount", + "componentcount", + "salvagecount", + "iscontainer", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("tradeskill_recipe_entries"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static TradeskillRecipeEntries NewEntity() + { + TradeskillRecipeEntries entry{}; + + entry.id = 0; + entry.recipe_id = 0; + entry.item_id = 0; + entry.successcount = 0; + entry.failcount = 0; + entry.componentcount = 1; + entry.salvagecount = 0; + entry.iscontainer = 0; + + return entry; + } + + static TradeskillRecipeEntries GetTradeskillRecipeEntriesEntry( + const std::vector &tradeskill_recipe_entriess, + int tradeskill_recipe_entries_id + ) + { + for (auto &tradeskill_recipe_entries : tradeskill_recipe_entriess) { + if (tradeskill_recipe_entries.id == tradeskill_recipe_entries_id) { + return tradeskill_recipe_entries; + } + } + + return NewEntity(); + } + + static TradeskillRecipeEntries FindOne( + Database& db, + int tradeskill_recipe_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + tradeskill_recipe_entries_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + TradeskillRecipeEntries entry{}; + + entry.id = atoi(row[0]); + entry.recipe_id = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.successcount = atoi(row[3]); + entry.failcount = atoi(row[4]); + entry.componentcount = atoi(row[5]); + entry.salvagecount = atoi(row[6]); + entry.iscontainer = atoi(row[7]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int tradeskill_recipe_entries_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + tradeskill_recipe_entries_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + TradeskillRecipeEntries tradeskill_recipe_entries_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = " + std::to_string(tradeskill_recipe_entries_entry.recipe_id)); + update_values.push_back(columns[2] + " = " + std::to_string(tradeskill_recipe_entries_entry.item_id)); + update_values.push_back(columns[3] + " = " + std::to_string(tradeskill_recipe_entries_entry.successcount)); + update_values.push_back(columns[4] + " = " + std::to_string(tradeskill_recipe_entries_entry.failcount)); + update_values.push_back(columns[5] + " = " + std::to_string(tradeskill_recipe_entries_entry.componentcount)); + update_values.push_back(columns[6] + " = " + std::to_string(tradeskill_recipe_entries_entry.salvagecount)); + update_values.push_back(columns[7] + " = " + std::to_string(tradeskill_recipe_entries_entry.iscontainer)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + tradeskill_recipe_entries_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static TradeskillRecipeEntries InsertOne( + Database& db, + TradeskillRecipeEntries tradeskill_recipe_entries_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.id)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.recipe_id)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.item_id)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.successcount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.failcount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.componentcount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.salvagecount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.iscontainer)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + tradeskill_recipe_entries_entry.id = results.LastInsertedID(); + return tradeskill_recipe_entries_entry; + } + + tradeskill_recipe_entries_entry = NewEntity(); + + return tradeskill_recipe_entries_entry; + } + + static int InsertMany( + Database& db, + std::vector tradeskill_recipe_entries_entries + ) + { + std::vector insert_chunks; + + for (auto &tradeskill_recipe_entries_entry: tradeskill_recipe_entries_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.id)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.recipe_id)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.item_id)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.successcount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.failcount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.componentcount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.salvagecount)); + insert_values.push_back(std::to_string(tradeskill_recipe_entries_entry.iscontainer)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TradeskillRecipeEntries entry{}; + + entry.id = atoi(row[0]); + entry.recipe_id = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.successcount = atoi(row[3]); + entry.failcount = atoi(row[4]); + entry.componentcount = atoi(row[5]); + entry.salvagecount = atoi(row[6]); + entry.iscontainer = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TradeskillRecipeEntries entry{}; + + entry.id = atoi(row[0]); + entry.recipe_id = atoi(row[1]); + entry.item_id = atoi(row[2]); + entry.successcount = atoi(row[3]); + entry.failcount = atoi(row[4]); + entry.componentcount = atoi(row[5]); + entry.salvagecount = atoi(row[6]); + entry.iscontainer = atoi(row[7]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TRADESKILL_RECIPE_ENTRIES_REPOSITORY_H diff --git a/common/repositories/base/base_tradeskill_recipe_repository.h b/common/repositories/base/base_tradeskill_recipe_repository.h new file mode 100644 index 000000000..453d8b7dc --- /dev/null +++ b/common/repositories/base/base_tradeskill_recipe_repository.h @@ -0,0 +1,409 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TRADESKILL_RECIPE_REPOSITORY_H +#define EQEMU_BASE_TRADESKILL_RECIPE_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTradeskillRecipeRepository { +public: + struct TradeskillRecipe { + int id; + std::string name; + int tradeskill; + int skillneeded; + int trivial; + int nofail; + int replace_container; + std::string notes; + int must_learn; + int quest; + int enabled; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "name", + "tradeskill", + "skillneeded", + "trivial", + "nofail", + "replace_container", + "notes", + "must_learn", + "quest", + "enabled", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("tradeskill_recipe"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static TradeskillRecipe NewEntity() + { + TradeskillRecipe entry{}; + + entry.id = 0; + entry.name = ""; + entry.tradeskill = 0; + entry.skillneeded = 0; + entry.trivial = 0; + entry.nofail = 0; + entry.replace_container = 0; + entry.notes = ""; + entry.must_learn = 0; + entry.quest = 0; + entry.enabled = 1; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static TradeskillRecipe GetTradeskillRecipeEntry( + const std::vector &tradeskill_recipes, + int tradeskill_recipe_id + ) + { + for (auto &tradeskill_recipe : tradeskill_recipes) { + if (tradeskill_recipe.id == tradeskill_recipe_id) { + return tradeskill_recipe; + } + } + + return NewEntity(); + } + + static TradeskillRecipe FindOne( + Database& db, + int tradeskill_recipe_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + tradeskill_recipe_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + TradeskillRecipe entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.tradeskill = atoi(row[2]); + entry.skillneeded = atoi(row[3]); + entry.trivial = atoi(row[4]); + entry.nofail = atoi(row[5]); + entry.replace_container = atoi(row[6]); + entry.notes = row[7] ? row[7] : ""; + entry.must_learn = atoi(row[8]); + entry.quest = atoi(row[9]); + entry.enabled = atoi(row[10]); + entry.min_expansion = atoi(row[11]); + entry.max_expansion = atoi(row[12]); + entry.content_flags = row[13] ? row[13] : ""; + entry.content_flags_disabled = row[14] ? row[14] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int tradeskill_recipe_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + tradeskill_recipe_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + TradeskillRecipe tradeskill_recipe_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(tradeskill_recipe_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(tradeskill_recipe_entry.tradeskill)); + update_values.push_back(columns[3] + " = " + std::to_string(tradeskill_recipe_entry.skillneeded)); + update_values.push_back(columns[4] + " = " + std::to_string(tradeskill_recipe_entry.trivial)); + update_values.push_back(columns[5] + " = " + std::to_string(tradeskill_recipe_entry.nofail)); + update_values.push_back(columns[6] + " = " + std::to_string(tradeskill_recipe_entry.replace_container)); + update_values.push_back(columns[7] + " = '" + EscapeString(tradeskill_recipe_entry.notes) + "'"); + update_values.push_back(columns[8] + " = " + std::to_string(tradeskill_recipe_entry.must_learn)); + update_values.push_back(columns[9] + " = " + std::to_string(tradeskill_recipe_entry.quest)); + update_values.push_back(columns[10] + " = " + std::to_string(tradeskill_recipe_entry.enabled)); + update_values.push_back(columns[11] + " = " + std::to_string(tradeskill_recipe_entry.min_expansion)); + update_values.push_back(columns[12] + " = " + std::to_string(tradeskill_recipe_entry.max_expansion)); + update_values.push_back(columns[13] + " = '" + EscapeString(tradeskill_recipe_entry.content_flags) + "'"); + update_values.push_back(columns[14] + " = '" + EscapeString(tradeskill_recipe_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + tradeskill_recipe_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static TradeskillRecipe InsertOne( + Database& db, + TradeskillRecipe tradeskill_recipe_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(tradeskill_recipe_entry.id)); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.name) + "'"); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.tradeskill)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.skillneeded)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.trivial)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.nofail)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.replace_container)); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.notes) + "'"); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.must_learn)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.quest)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.enabled)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.min_expansion)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + tradeskill_recipe_entry.id = results.LastInsertedID(); + return tradeskill_recipe_entry; + } + + tradeskill_recipe_entry = NewEntity(); + + return tradeskill_recipe_entry; + } + + static int InsertMany( + Database& db, + std::vector tradeskill_recipe_entries + ) + { + std::vector insert_chunks; + + for (auto &tradeskill_recipe_entry: tradeskill_recipe_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(tradeskill_recipe_entry.id)); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.name) + "'"); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.tradeskill)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.skillneeded)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.trivial)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.nofail)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.replace_container)); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.notes) + "'"); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.must_learn)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.quest)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.enabled)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.min_expansion)); + insert_values.push_back(std::to_string(tradeskill_recipe_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(tradeskill_recipe_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TradeskillRecipe entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.tradeskill = atoi(row[2]); + entry.skillneeded = atoi(row[3]); + entry.trivial = atoi(row[4]); + entry.nofail = atoi(row[5]); + entry.replace_container = atoi(row[6]); + entry.notes = row[7] ? row[7] : ""; + entry.must_learn = atoi(row[8]); + entry.quest = atoi(row[9]); + entry.enabled = atoi(row[10]); + entry.min_expansion = atoi(row[11]); + entry.max_expansion = atoi(row[12]); + entry.content_flags = row[13] ? row[13] : ""; + entry.content_flags_disabled = row[14] ? row[14] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TradeskillRecipe entry{}; + + entry.id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.tradeskill = atoi(row[2]); + entry.skillneeded = atoi(row[3]); + entry.trivial = atoi(row[4]); + entry.nofail = atoi(row[5]); + entry.replace_container = atoi(row[6]); + entry.notes = row[7] ? row[7] : ""; + entry.must_learn = atoi(row[8]); + entry.quest = atoi(row[9]); + entry.enabled = atoi(row[10]); + entry.min_expansion = atoi(row[11]); + entry.max_expansion = atoi(row[12]); + entry.content_flags = row[13] ? row[13] : ""; + entry.content_flags_disabled = row[14] ? row[14] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TRADESKILL_RECIPE_REPOSITORY_H diff --git a/common/repositories/base/base_traps_repository.h b/common/repositories/base/base_traps_repository.h new file mode 100644 index 000000000..b76072525 --- /dev/null +++ b/common/repositories/base/base_traps_repository.h @@ -0,0 +1,499 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TRAPS_REPOSITORY_H +#define EQEMU_BASE_TRAPS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTrapsRepository { +public: + struct Traps { + int id; + std::string zone; + int version; + int x; + int y; + int z; + int chance; + float maxzdiff; + float radius; + int effect; + int effectvalue; + int effectvalue2; + std::string message; + int skill; + int level; + int respawn_time; + int respawn_var; + int triggered_number; + int group; + int despawn_when_triggered; + int undetectable; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "version", + "x", + "y", + "z", + "chance", + "maxzdiff", + "radius", + "effect", + "effectvalue", + "effectvalue2", + "message", + "skill", + "level", + "respawn_time", + "respawn_var", + "triggered_number", + "group", + "despawn_when_triggered", + "undetectable", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("traps"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Traps NewEntity() + { + Traps entry{}; + + entry.id = 0; + entry.zone = ""; + entry.version = 0; + entry.x = 0; + entry.y = 0; + entry.z = 0; + entry.chance = 0; + entry.maxzdiff = 0; + entry.radius = 0; + entry.effect = 0; + entry.effectvalue = 0; + entry.effectvalue2 = 0; + entry.message = ""; + entry.skill = 0; + entry.level = 1; + entry.respawn_time = 60; + entry.respawn_var = 0; + entry.triggered_number = 0; + entry.group = 0; + entry.despawn_when_triggered = 0; + entry.undetectable = 0; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + + return entry; + } + + static Traps GetTrapsEntry( + const std::vector &trapss, + int traps_id + ) + { + for (auto &traps : trapss) { + if (traps.id == traps_id) { + return traps; + } + } + + return NewEntity(); + } + + static Traps FindOne( + Database& db, + int traps_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + traps_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Traps entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.version = atoi(row[2]); + entry.x = atoi(row[3]); + entry.y = atoi(row[4]); + entry.z = atoi(row[5]); + entry.chance = atoi(row[6]); + entry.maxzdiff = static_cast(atof(row[7])); + entry.radius = static_cast(atof(row[8])); + entry.effect = atoi(row[9]); + entry.effectvalue = atoi(row[10]); + entry.effectvalue2 = atoi(row[11]); + entry.message = row[12] ? row[12] : ""; + entry.skill = atoi(row[13]); + entry.level = atoi(row[14]); + entry.respawn_time = atoi(row[15]); + entry.respawn_var = atoi(row[16]); + entry.triggered_number = atoi(row[17]); + entry.group = atoi(row[18]); + entry.despawn_when_triggered = atoi(row[19]); + entry.undetectable = atoi(row[20]); + entry.min_expansion = atoi(row[21]); + entry.max_expansion = atoi(row[22]); + entry.content_flags = row[23] ? row[23] : ""; + entry.content_flags_disabled = row[24] ? row[24] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int traps_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + traps_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Traps traps_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(traps_entry.zone) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(traps_entry.version)); + update_values.push_back(columns[3] + " = " + std::to_string(traps_entry.x)); + update_values.push_back(columns[4] + " = " + std::to_string(traps_entry.y)); + update_values.push_back(columns[5] + " = " + std::to_string(traps_entry.z)); + update_values.push_back(columns[6] + " = " + std::to_string(traps_entry.chance)); + update_values.push_back(columns[7] + " = " + std::to_string(traps_entry.maxzdiff)); + update_values.push_back(columns[8] + " = " + std::to_string(traps_entry.radius)); + update_values.push_back(columns[9] + " = " + std::to_string(traps_entry.effect)); + update_values.push_back(columns[10] + " = " + std::to_string(traps_entry.effectvalue)); + update_values.push_back(columns[11] + " = " + std::to_string(traps_entry.effectvalue2)); + update_values.push_back(columns[12] + " = '" + EscapeString(traps_entry.message) + "'"); + update_values.push_back(columns[13] + " = " + std::to_string(traps_entry.skill)); + update_values.push_back(columns[14] + " = " + std::to_string(traps_entry.level)); + update_values.push_back(columns[15] + " = " + std::to_string(traps_entry.respawn_time)); + update_values.push_back(columns[16] + " = " + std::to_string(traps_entry.respawn_var)); + update_values.push_back(columns[17] + " = " + std::to_string(traps_entry.triggered_number)); + update_values.push_back(columns[18] + " = " + std::to_string(traps_entry.group)); + update_values.push_back(columns[19] + " = " + std::to_string(traps_entry.despawn_when_triggered)); + update_values.push_back(columns[20] + " = " + std::to_string(traps_entry.undetectable)); + update_values.push_back(columns[21] + " = " + std::to_string(traps_entry.min_expansion)); + update_values.push_back(columns[22] + " = " + std::to_string(traps_entry.max_expansion)); + update_values.push_back(columns[23] + " = '" + EscapeString(traps_entry.content_flags) + "'"); + update_values.push_back(columns[24] + " = '" + EscapeString(traps_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + traps_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Traps InsertOne( + Database& db, + Traps traps_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(traps_entry.id)); + insert_values.push_back("'" + EscapeString(traps_entry.zone) + "'"); + insert_values.push_back(std::to_string(traps_entry.version)); + insert_values.push_back(std::to_string(traps_entry.x)); + insert_values.push_back(std::to_string(traps_entry.y)); + insert_values.push_back(std::to_string(traps_entry.z)); + insert_values.push_back(std::to_string(traps_entry.chance)); + insert_values.push_back(std::to_string(traps_entry.maxzdiff)); + insert_values.push_back(std::to_string(traps_entry.radius)); + insert_values.push_back(std::to_string(traps_entry.effect)); + insert_values.push_back(std::to_string(traps_entry.effectvalue)); + insert_values.push_back(std::to_string(traps_entry.effectvalue2)); + insert_values.push_back("'" + EscapeString(traps_entry.message) + "'"); + insert_values.push_back(std::to_string(traps_entry.skill)); + insert_values.push_back(std::to_string(traps_entry.level)); + insert_values.push_back(std::to_string(traps_entry.respawn_time)); + insert_values.push_back(std::to_string(traps_entry.respawn_var)); + insert_values.push_back(std::to_string(traps_entry.triggered_number)); + insert_values.push_back(std::to_string(traps_entry.group)); + insert_values.push_back(std::to_string(traps_entry.despawn_when_triggered)); + insert_values.push_back(std::to_string(traps_entry.undetectable)); + insert_values.push_back(std::to_string(traps_entry.min_expansion)); + insert_values.push_back(std::to_string(traps_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(traps_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(traps_entry.content_flags_disabled) + "'"); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + traps_entry.id = results.LastInsertedID(); + return traps_entry; + } + + traps_entry = NewEntity(); + + return traps_entry; + } + + static int InsertMany( + Database& db, + std::vector traps_entries + ) + { + std::vector insert_chunks; + + for (auto &traps_entry: traps_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(traps_entry.id)); + insert_values.push_back("'" + EscapeString(traps_entry.zone) + "'"); + insert_values.push_back(std::to_string(traps_entry.version)); + insert_values.push_back(std::to_string(traps_entry.x)); + insert_values.push_back(std::to_string(traps_entry.y)); + insert_values.push_back(std::to_string(traps_entry.z)); + insert_values.push_back(std::to_string(traps_entry.chance)); + insert_values.push_back(std::to_string(traps_entry.maxzdiff)); + insert_values.push_back(std::to_string(traps_entry.radius)); + insert_values.push_back(std::to_string(traps_entry.effect)); + insert_values.push_back(std::to_string(traps_entry.effectvalue)); + insert_values.push_back(std::to_string(traps_entry.effectvalue2)); + insert_values.push_back("'" + EscapeString(traps_entry.message) + "'"); + insert_values.push_back(std::to_string(traps_entry.skill)); + insert_values.push_back(std::to_string(traps_entry.level)); + insert_values.push_back(std::to_string(traps_entry.respawn_time)); + insert_values.push_back(std::to_string(traps_entry.respawn_var)); + insert_values.push_back(std::to_string(traps_entry.triggered_number)); + insert_values.push_back(std::to_string(traps_entry.group)); + insert_values.push_back(std::to_string(traps_entry.despawn_when_triggered)); + insert_values.push_back(std::to_string(traps_entry.undetectable)); + insert_values.push_back(std::to_string(traps_entry.min_expansion)); + insert_values.push_back(std::to_string(traps_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(traps_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(traps_entry.content_flags_disabled) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Traps entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.version = atoi(row[2]); + entry.x = atoi(row[3]); + entry.y = atoi(row[4]); + entry.z = atoi(row[5]); + entry.chance = atoi(row[6]); + entry.maxzdiff = static_cast(atof(row[7])); + entry.radius = static_cast(atof(row[8])); + entry.effect = atoi(row[9]); + entry.effectvalue = atoi(row[10]); + entry.effectvalue2 = atoi(row[11]); + entry.message = row[12] ? row[12] : ""; + entry.skill = atoi(row[13]); + entry.level = atoi(row[14]); + entry.respawn_time = atoi(row[15]); + entry.respawn_var = atoi(row[16]); + entry.triggered_number = atoi(row[17]); + entry.group = atoi(row[18]); + entry.despawn_when_triggered = atoi(row[19]); + entry.undetectable = atoi(row[20]); + entry.min_expansion = atoi(row[21]); + entry.max_expansion = atoi(row[22]); + entry.content_flags = row[23] ? row[23] : ""; + entry.content_flags_disabled = row[24] ? row[24] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Traps entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.version = atoi(row[2]); + entry.x = atoi(row[3]); + entry.y = atoi(row[4]); + entry.z = atoi(row[5]); + entry.chance = atoi(row[6]); + entry.maxzdiff = static_cast(atof(row[7])); + entry.radius = static_cast(atof(row[8])); + entry.effect = atoi(row[9]); + entry.effectvalue = atoi(row[10]); + entry.effectvalue2 = atoi(row[11]); + entry.message = row[12] ? row[12] : ""; + entry.skill = atoi(row[13]); + entry.level = atoi(row[14]); + entry.respawn_time = atoi(row[15]); + entry.respawn_var = atoi(row[16]); + entry.triggered_number = atoi(row[17]); + entry.group = atoi(row[18]); + entry.despawn_when_triggered = atoi(row[19]); + entry.undetectable = atoi(row[20]); + entry.min_expansion = atoi(row[21]); + entry.max_expansion = atoi(row[22]); + entry.content_flags = row[23] ? row[23] : ""; + entry.content_flags_disabled = row[24] ? row[24] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TRAPS_REPOSITORY_H diff --git a/common/repositories/base/base_tribute_levels_repository.h b/common/repositories/base/base_tribute_levels_repository.h new file mode 100644 index 000000000..2e49dab99 --- /dev/null +++ b/common/repositories/base/base_tribute_levels_repository.h @@ -0,0 +1,311 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TRIBUTE_LEVELS_REPOSITORY_H +#define EQEMU_BASE_TRIBUTE_LEVELS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTributeLevelsRepository { +public: + struct TributeLevels { + int tribute_id; + int level; + int cost; + int item_id; + }; + + static std::string PrimaryKey() + { + return std::string("tribute_id"); + } + + static std::vector Columns() + { + return { + "tribute_id", + "level", + "cost", + "item_id", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("tribute_levels"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static TributeLevels NewEntity() + { + TributeLevels entry{}; + + entry.tribute_id = 0; + entry.level = 0; + entry.cost = 0; + entry.item_id = 0; + + return entry; + } + + static TributeLevels GetTributeLevelsEntry( + const std::vector &tribute_levelss, + int tribute_levels_id + ) + { + for (auto &tribute_levels : tribute_levelss) { + if (tribute_levels.tribute_id == tribute_levels_id) { + return tribute_levels; + } + } + + return NewEntity(); + } + + static TributeLevels FindOne( + Database& db, + int tribute_levels_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + tribute_levels_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + TributeLevels entry{}; + + entry.tribute_id = atoi(row[0]); + entry.level = atoi(row[1]); + entry.cost = atoi(row[2]); + entry.item_id = atoi(row[3]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int tribute_levels_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + tribute_levels_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + TributeLevels tribute_levels_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(tribute_levels_entry.tribute_id)); + update_values.push_back(columns[1] + " = " + std::to_string(tribute_levels_entry.level)); + update_values.push_back(columns[2] + " = " + std::to_string(tribute_levels_entry.cost)); + update_values.push_back(columns[3] + " = " + std::to_string(tribute_levels_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + tribute_levels_entry.tribute_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static TributeLevels InsertOne( + Database& db, + TributeLevels tribute_levels_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(tribute_levels_entry.tribute_id)); + insert_values.push_back(std::to_string(tribute_levels_entry.level)); + insert_values.push_back(std::to_string(tribute_levels_entry.cost)); + insert_values.push_back(std::to_string(tribute_levels_entry.item_id)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + tribute_levels_entry.tribute_id = results.LastInsertedID(); + return tribute_levels_entry; + } + + tribute_levels_entry = NewEntity(); + + return tribute_levels_entry; + } + + static int InsertMany( + Database& db, + std::vector tribute_levels_entries + ) + { + std::vector insert_chunks; + + for (auto &tribute_levels_entry: tribute_levels_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(tribute_levels_entry.tribute_id)); + insert_values.push_back(std::to_string(tribute_levels_entry.level)); + insert_values.push_back(std::to_string(tribute_levels_entry.cost)); + insert_values.push_back(std::to_string(tribute_levels_entry.item_id)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TributeLevels entry{}; + + entry.tribute_id = atoi(row[0]); + entry.level = atoi(row[1]); + entry.cost = atoi(row[2]); + entry.item_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TributeLevels entry{}; + + entry.tribute_id = atoi(row[0]); + entry.level = atoi(row[1]); + entry.cost = atoi(row[2]); + entry.item_id = atoi(row[3]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TRIBUTE_LEVELS_REPOSITORY_H diff --git a/common/repositories/base/base_tributes_repository.h b/common/repositories/base/base_tributes_repository.h new file mode 100644 index 000000000..1acd2f63b --- /dev/null +++ b/common/repositories/base/base_tributes_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_TRIBUTES_REPOSITORY_H +#define EQEMU_BASE_TRIBUTES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseTributesRepository { +public: + struct Tributes { + int id; + int unknown; + std::string name; + std::string descr; + int isguild; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "unknown", + "name", + "descr", + "isguild", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("tributes"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Tributes NewEntity() + { + Tributes entry{}; + + entry.id = 0; + entry.unknown = 0; + entry.name = ""; + entry.descr = ""; + entry.isguild = 0; + + return entry; + } + + static Tributes GetTributesEntry( + const std::vector &tributess, + int tributes_id + ) + { + for (auto &tributes : tributess) { + if (tributes.id == tributes_id) { + return tributes; + } + } + + return NewEntity(); + } + + static Tributes FindOne( + Database& db, + int tributes_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + tributes_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Tributes entry{}; + + entry.id = atoi(row[0]); + entry.unknown = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.descr = row[3] ? row[3] : ""; + entry.isguild = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int tributes_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + tributes_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Tributes tributes_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(tributes_entry.id)); + update_values.push_back(columns[1] + " = " + std::to_string(tributes_entry.unknown)); + update_values.push_back(columns[2] + " = '" + EscapeString(tributes_entry.name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(tributes_entry.descr) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(tributes_entry.isguild)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + tributes_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Tributes InsertOne( + Database& db, + Tributes tributes_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(tributes_entry.id)); + insert_values.push_back(std::to_string(tributes_entry.unknown)); + insert_values.push_back("'" + EscapeString(tributes_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(tributes_entry.descr) + "'"); + insert_values.push_back(std::to_string(tributes_entry.isguild)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + tributes_entry.id = results.LastInsertedID(); + return tributes_entry; + } + + tributes_entry = NewEntity(); + + return tributes_entry; + } + + static int InsertMany( + Database& db, + std::vector tributes_entries + ) + { + std::vector insert_chunks; + + for (auto &tributes_entry: tributes_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(tributes_entry.id)); + insert_values.push_back(std::to_string(tributes_entry.unknown)); + insert_values.push_back("'" + EscapeString(tributes_entry.name) + "'"); + insert_values.push_back("'" + EscapeString(tributes_entry.descr) + "'"); + insert_values.push_back(std::to_string(tributes_entry.isguild)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Tributes entry{}; + + entry.id = atoi(row[0]); + entry.unknown = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.descr = row[3] ? row[3] : ""; + entry.isguild = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Tributes entry{}; + + entry.id = atoi(row[0]); + entry.unknown = atoi(row[1]); + entry.name = row[2] ? row[2] : ""; + entry.descr = row[3] ? row[3] : ""; + entry.isguild = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_TRIBUTES_REPOSITORY_H diff --git a/common/repositories/base/base_variables_repository.h b/common/repositories/base/base_variables_repository.h new file mode 100644 index 000000000..8c18ded15 --- /dev/null +++ b/common/repositories/base/base_variables_repository.h @@ -0,0 +1,327 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + */ + +/** + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to + * the repository extending the base. Any modifications to base repositories are to + * be made by the generator only + */ + +#ifndef EQEMU_BASE_VARIABLES_REPOSITORY_H +#define EQEMU_BASE_VARIABLES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseVariablesRepository { +public: + struct Variables { + std::string varname; + std::string value; + std::string information; + std::string ts; + }; + + static std::string PrimaryKey() + { + return std::string("varname"); + } + + static std::vector Columns() + { + return { + "varname", + "value", + "information", + "ts", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("variables"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static Variables NewEntity() + { + Variables entry{}; + + entry.varname = ""; + entry.value = ""; + entry.information = ""; + entry.ts = current_timestamp(); + + return entry; + } + + static Variables GetVariablesEntry( + const std::vector &variabless, + int variables_id + ) + { + for (auto &variables : variabless) { + if (variables.varname == variables_id) { + return variables; + } + } + + return NewEntity(); + } + + static Variables FindOne( + int variables_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + variables_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Variables entry{}; + + entry.varname = row[0] ? row[0] : ""; + entry.value = row[1] ? row[1] : ""; + entry.information = row[2] ? row[2] : ""; + entry.ts = row[3] ? row[3] : ""; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int variables_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + variables_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Variables variables_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(variables_entry.varname) + "'"); + update_values.push_back(columns[1] + " = '" + EscapeString(variables_entry.value) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(variables_entry.information) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(variables_entry.ts) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + variables_entry.varname + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Variables InsertOne( + Variables variables_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(variables_entry.varname) + "'"); + insert_values.push_back("'" + EscapeString(variables_entry.value) + "'"); + insert_values.push_back("'" + EscapeString(variables_entry.information) + "'"); + insert_values.push_back("'" + EscapeString(variables_entry.ts) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + variables_entry.varname = results.LastInsertedID(); + return variables_entry; + } + + variables_entry = NewEntity(); + + return variables_entry; + } + + static int InsertMany( + std::vector variables_entries + ) + { + std::vector insert_chunks; + + for (auto &variables_entry: variables_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(variables_entry.varname) + "'"); + insert_values.push_back("'" + EscapeString(variables_entry.value) + "'"); + insert_values.push_back("'" + EscapeString(variables_entry.information) + "'"); + insert_values.push_back("'" + EscapeString(variables_entry.ts) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Variables entry{}; + + entry.varname = row[0] ? row[0] : ""; + entry.value = row[1] ? row[1] : ""; + entry.information = row[2] ? row[2] : ""; + entry.ts = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(std::string where_filter) + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Variables entry{}; + + entry.varname = row[0] ? row[0] : ""; + entry.value = row[1] ? row[1] : ""; + entry.information = row[2] ? row[2] : ""; + entry.ts = row[3] ? row[3] : ""; + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(std::string where_filter) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + PrimaryKey(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_VARIABLES_REPOSITORY_H diff --git a/common/repositories/base/base_veteran_reward_templates_repository.h b/common/repositories/base/base_veteran_reward_templates_repository.h new file mode 100644 index 000000000..f41c1da3c --- /dev/null +++ b/common/repositories/base/base_veteran_reward_templates_repository.h @@ -0,0 +1,320 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_VETERAN_REWARD_TEMPLATES_REPOSITORY_H +#define EQEMU_BASE_VETERAN_REWARD_TEMPLATES_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseVeteranRewardTemplatesRepository { +public: + struct VeteranRewardTemplates { + int claim_id; + std::string name; + int item_id; + int charges; + int reward_slot; + }; + + static std::string PrimaryKey() + { + return std::string("claim_id"); + } + + static std::vector Columns() + { + return { + "claim_id", + "name", + "item_id", + "charges", + "reward_slot", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("veteran_reward_templates"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static VeteranRewardTemplates NewEntity() + { + VeteranRewardTemplates entry{}; + + entry.claim_id = 0; + entry.name = ""; + entry.item_id = 0; + entry.charges = 0; + entry.reward_slot = 0; + + return entry; + } + + static VeteranRewardTemplates GetVeteranRewardTemplatesEntry( + const std::vector &veteran_reward_templatess, + int veteran_reward_templates_id + ) + { + for (auto &veteran_reward_templates : veteran_reward_templatess) { + if (veteran_reward_templates.claim_id == veteran_reward_templates_id) { + return veteran_reward_templates; + } + } + + return NewEntity(); + } + + static VeteranRewardTemplates FindOne( + Database& db, + int veteran_reward_templates_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + veteran_reward_templates_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + VeteranRewardTemplates entry{}; + + entry.claim_id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.item_id = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.reward_slot = atoi(row[4]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int veteran_reward_templates_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + veteran_reward_templates_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + VeteranRewardTemplates veteran_reward_templates_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(veteran_reward_templates_entry.claim_id)); + update_values.push_back(columns[1] + " = '" + EscapeString(veteran_reward_templates_entry.name) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(veteran_reward_templates_entry.item_id)); + update_values.push_back(columns[3] + " = " + std::to_string(veteran_reward_templates_entry.charges)); + update_values.push_back(columns[4] + " = " + std::to_string(veteran_reward_templates_entry.reward_slot)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + veteran_reward_templates_entry.claim_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static VeteranRewardTemplates InsertOne( + Database& db, + VeteranRewardTemplates veteran_reward_templates_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(veteran_reward_templates_entry.claim_id)); + insert_values.push_back("'" + EscapeString(veteran_reward_templates_entry.name) + "'"); + insert_values.push_back(std::to_string(veteran_reward_templates_entry.item_id)); + insert_values.push_back(std::to_string(veteran_reward_templates_entry.charges)); + insert_values.push_back(std::to_string(veteran_reward_templates_entry.reward_slot)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + veteran_reward_templates_entry.claim_id = results.LastInsertedID(); + return veteran_reward_templates_entry; + } + + veteran_reward_templates_entry = NewEntity(); + + return veteran_reward_templates_entry; + } + + static int InsertMany( + Database& db, + std::vector veteran_reward_templates_entries + ) + { + std::vector insert_chunks; + + for (auto &veteran_reward_templates_entry: veteran_reward_templates_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(veteran_reward_templates_entry.claim_id)); + insert_values.push_back("'" + EscapeString(veteran_reward_templates_entry.name) + "'"); + insert_values.push_back(std::to_string(veteran_reward_templates_entry.item_id)); + insert_values.push_back(std::to_string(veteran_reward_templates_entry.charges)); + insert_values.push_back(std::to_string(veteran_reward_templates_entry.reward_slot)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + VeteranRewardTemplates entry{}; + + entry.claim_id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.item_id = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.reward_slot = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + VeteranRewardTemplates entry{}; + + entry.claim_id = atoi(row[0]); + entry.name = row[1] ? row[1] : ""; + entry.item_id = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.reward_slot = atoi(row[4]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_VETERAN_REWARD_TEMPLATES_REPOSITORY_H diff --git a/common/repositories/base/base_zone_points_repository.h b/common/repositories/base/base_zone_points_repository.h new file mode 100644 index 000000000..e34d9bafb --- /dev/null +++ b/common/repositories/base/base_zone_points_repository.h @@ -0,0 +1,490 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ZONE_POINTS_REPOSITORY_H +#define EQEMU_BASE_ZONE_POINTS_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseZonePointsRepository { +public: + struct ZonePoints { + int id; + std::string zone; + int version; + int number; + float y; + float x; + float z; + float heading; + float target_y; + float target_x; + float target_z; + float target_heading; + int zoneinst; + int target_zone_id; + int target_instance; + float buffer; + int client_version_mask; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + int is_virtual; + int height; + int width; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "id", + "zone", + "version", + "number", + "y", + "x", + "z", + "heading", + "target_y", + "target_x", + "target_z", + "target_heading", + "zoneinst", + "target_zone_id", + "target_instance", + "buffer", + "client_version_mask", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + "is_virtual", + "height", + "width", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("zone_points"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static ZonePoints NewEntity() + { + ZonePoints entry{}; + + entry.id = 0; + entry.zone = ""; + entry.version = 0; + entry.number = 1; + entry.y = 0; + entry.x = 0; + entry.z = 0; + entry.heading = 0; + entry.target_y = 0; + entry.target_x = 0; + entry.target_z = 0; + entry.target_heading = 0; + entry.zoneinst = 0; + entry.target_zone_id = 0; + entry.target_instance = 0; + entry.buffer = 0; + entry.client_version_mask = 4294967295; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + entry.is_virtual = 0; + entry.height = 0; + entry.width = 0; + + return entry; + } + + static ZonePoints GetZonePointsEntry( + const std::vector &zone_pointss, + int zone_points_id + ) + { + for (auto &zone_points : zone_pointss) { + if (zone_points.id == zone_points_id) { + return zone_points; + } + } + + return NewEntity(); + } + + static ZonePoints FindOne( + Database& db, + int zone_points_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + zone_points_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + ZonePoints entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.version = atoi(row[2]); + entry.number = atoi(row[3]); + entry.y = static_cast(atof(row[4])); + entry.x = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + entry.target_y = static_cast(atof(row[8])); + entry.target_x = static_cast(atof(row[9])); + entry.target_z = static_cast(atof(row[10])); + entry.target_heading = static_cast(atof(row[11])); + entry.zoneinst = atoi(row[12]); + entry.target_zone_id = atoi(row[13]); + entry.target_instance = atoi(row[14]); + entry.buffer = static_cast(atof(row[15])); + entry.client_version_mask = atoi(row[16]); + entry.min_expansion = atoi(row[17]); + entry.max_expansion = atoi(row[18]); + entry.content_flags = row[19] ? row[19] : ""; + entry.content_flags_disabled = row[20] ? row[20] : ""; + entry.is_virtual = atoi(row[21]); + entry.height = atoi(row[22]); + entry.width = atoi(row[23]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int zone_points_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + zone_points_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + ZonePoints zone_points_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[1] + " = '" + EscapeString(zone_points_entry.zone) + "'"); + update_values.push_back(columns[2] + " = " + std::to_string(zone_points_entry.version)); + update_values.push_back(columns[3] + " = " + std::to_string(zone_points_entry.number)); + update_values.push_back(columns[4] + " = " + std::to_string(zone_points_entry.y)); + update_values.push_back(columns[5] + " = " + std::to_string(zone_points_entry.x)); + update_values.push_back(columns[6] + " = " + std::to_string(zone_points_entry.z)); + update_values.push_back(columns[7] + " = " + std::to_string(zone_points_entry.heading)); + update_values.push_back(columns[8] + " = " + std::to_string(zone_points_entry.target_y)); + update_values.push_back(columns[9] + " = " + std::to_string(zone_points_entry.target_x)); + update_values.push_back(columns[10] + " = " + std::to_string(zone_points_entry.target_z)); + update_values.push_back(columns[11] + " = " + std::to_string(zone_points_entry.target_heading)); + update_values.push_back(columns[12] + " = " + std::to_string(zone_points_entry.zoneinst)); + update_values.push_back(columns[13] + " = " + std::to_string(zone_points_entry.target_zone_id)); + update_values.push_back(columns[14] + " = " + std::to_string(zone_points_entry.target_instance)); + update_values.push_back(columns[15] + " = " + std::to_string(zone_points_entry.buffer)); + update_values.push_back(columns[16] + " = " + std::to_string(zone_points_entry.client_version_mask)); + update_values.push_back(columns[17] + " = " + std::to_string(zone_points_entry.min_expansion)); + update_values.push_back(columns[18] + " = " + std::to_string(zone_points_entry.max_expansion)); + update_values.push_back(columns[19] + " = '" + EscapeString(zone_points_entry.content_flags) + "'"); + update_values.push_back(columns[20] + " = '" + EscapeString(zone_points_entry.content_flags_disabled) + "'"); + update_values.push_back(columns[21] + " = " + std::to_string(zone_points_entry.is_virtual)); + update_values.push_back(columns[22] + " = " + std::to_string(zone_points_entry.height)); + update_values.push_back(columns[23] + " = " + std::to_string(zone_points_entry.width)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + zone_points_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static ZonePoints InsertOne( + Database& db, + ZonePoints zone_points_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(zone_points_entry.id)); + insert_values.push_back("'" + EscapeString(zone_points_entry.zone) + "'"); + insert_values.push_back(std::to_string(zone_points_entry.version)); + insert_values.push_back(std::to_string(zone_points_entry.number)); + insert_values.push_back(std::to_string(zone_points_entry.y)); + insert_values.push_back(std::to_string(zone_points_entry.x)); + insert_values.push_back(std::to_string(zone_points_entry.z)); + insert_values.push_back(std::to_string(zone_points_entry.heading)); + insert_values.push_back(std::to_string(zone_points_entry.target_y)); + insert_values.push_back(std::to_string(zone_points_entry.target_x)); + insert_values.push_back(std::to_string(zone_points_entry.target_z)); + insert_values.push_back(std::to_string(zone_points_entry.target_heading)); + insert_values.push_back(std::to_string(zone_points_entry.zoneinst)); + insert_values.push_back(std::to_string(zone_points_entry.target_zone_id)); + insert_values.push_back(std::to_string(zone_points_entry.target_instance)); + insert_values.push_back(std::to_string(zone_points_entry.buffer)); + insert_values.push_back(std::to_string(zone_points_entry.client_version_mask)); + insert_values.push_back(std::to_string(zone_points_entry.min_expansion)); + insert_values.push_back(std::to_string(zone_points_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(zone_points_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(zone_points_entry.content_flags_disabled) + "'"); + insert_values.push_back(std::to_string(zone_points_entry.is_virtual)); + insert_values.push_back(std::to_string(zone_points_entry.height)); + insert_values.push_back(std::to_string(zone_points_entry.width)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + zone_points_entry.id = results.LastInsertedID(); + return zone_points_entry; + } + + zone_points_entry = NewEntity(); + + return zone_points_entry; + } + + static int InsertMany( + Database& db, + std::vector zone_points_entries + ) + { + std::vector insert_chunks; + + for (auto &zone_points_entry: zone_points_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(zone_points_entry.id)); + insert_values.push_back("'" + EscapeString(zone_points_entry.zone) + "'"); + insert_values.push_back(std::to_string(zone_points_entry.version)); + insert_values.push_back(std::to_string(zone_points_entry.number)); + insert_values.push_back(std::to_string(zone_points_entry.y)); + insert_values.push_back(std::to_string(zone_points_entry.x)); + insert_values.push_back(std::to_string(zone_points_entry.z)); + insert_values.push_back(std::to_string(zone_points_entry.heading)); + insert_values.push_back(std::to_string(zone_points_entry.target_y)); + insert_values.push_back(std::to_string(zone_points_entry.target_x)); + insert_values.push_back(std::to_string(zone_points_entry.target_z)); + insert_values.push_back(std::to_string(zone_points_entry.target_heading)); + insert_values.push_back(std::to_string(zone_points_entry.zoneinst)); + insert_values.push_back(std::to_string(zone_points_entry.target_zone_id)); + insert_values.push_back(std::to_string(zone_points_entry.target_instance)); + insert_values.push_back(std::to_string(zone_points_entry.buffer)); + insert_values.push_back(std::to_string(zone_points_entry.client_version_mask)); + insert_values.push_back(std::to_string(zone_points_entry.min_expansion)); + insert_values.push_back(std::to_string(zone_points_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(zone_points_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(zone_points_entry.content_flags_disabled) + "'"); + insert_values.push_back(std::to_string(zone_points_entry.is_virtual)); + insert_values.push_back(std::to_string(zone_points_entry.height)); + insert_values.push_back(std::to_string(zone_points_entry.width)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ZonePoints entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.version = atoi(row[2]); + entry.number = atoi(row[3]); + entry.y = static_cast(atof(row[4])); + entry.x = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + entry.target_y = static_cast(atof(row[8])); + entry.target_x = static_cast(atof(row[9])); + entry.target_z = static_cast(atof(row[10])); + entry.target_heading = static_cast(atof(row[11])); + entry.zoneinst = atoi(row[12]); + entry.target_zone_id = atoi(row[13]); + entry.target_instance = atoi(row[14]); + entry.buffer = static_cast(atof(row[15])); + entry.client_version_mask = atoi(row[16]); + entry.min_expansion = atoi(row[17]); + entry.max_expansion = atoi(row[18]); + entry.content_flags = row[19] ? row[19] : ""; + entry.content_flags_disabled = row[20] ? row[20] : ""; + entry.is_virtual = atoi(row[21]); + entry.height = atoi(row[22]); + entry.width = atoi(row[23]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + ZonePoints entry{}; + + entry.id = atoi(row[0]); + entry.zone = row[1] ? row[1] : ""; + entry.version = atoi(row[2]); + entry.number = atoi(row[3]); + entry.y = static_cast(atof(row[4])); + entry.x = static_cast(atof(row[5])); + entry.z = static_cast(atof(row[6])); + entry.heading = static_cast(atof(row[7])); + entry.target_y = static_cast(atof(row[8])); + entry.target_x = static_cast(atof(row[9])); + entry.target_z = static_cast(atof(row[10])); + entry.target_heading = static_cast(atof(row[11])); + entry.zoneinst = atoi(row[12]); + entry.target_zone_id = atoi(row[13]); + entry.target_instance = atoi(row[14]); + entry.buffer = static_cast(atof(row[15])); + entry.client_version_mask = atoi(row[16]); + entry.min_expansion = atoi(row[17]); + entry.max_expansion = atoi(row[18]); + entry.content_flags = row[19] ? row[19] : ""; + entry.content_flags_disabled = row[20] ? row[20] : ""; + entry.is_virtual = atoi(row[21]); + entry.height = atoi(row[22]); + entry.width = atoi(row[23]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ZONE_POINTS_REPOSITORY_H diff --git a/common/repositories/base/base_zone_repository.h b/common/repositories/base/base_zone_repository.h new file mode 100644 index 000000000..f31b98491 --- /dev/null +++ b/common/repositories/base/base_zone_repository.h @@ -0,0 +1,1093 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_ZONE_REPOSITORY_H +#define EQEMU_BASE_ZONE_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class BaseZoneRepository { +public: + struct Zone { + std::string short_name; + int id; + std::string file_name; + std::string long_name; + std::string map_file_name; + float safe_x; + float safe_y; + float safe_z; + float graveyard_id; + int min_level; + int min_status; + int zoneidnumber; + int version; + int timezone; + int maxclients; + int ruleset; + std::string note; + float underworld; + float minclip; + float maxclip; + float fog_minclip; + float fog_maxclip; + int fog_blue; + int fog_red; + int fog_green; + int sky; + int ztype; + float zone_exp_multiplier; + float walkspeed; + int time_type; + int fog_red1; + int fog_green1; + int fog_blue1; + float fog_minclip1; + float fog_maxclip1; + int fog_red2; + int fog_green2; + int fog_blue2; + float fog_minclip2; + float fog_maxclip2; + int fog_red3; + int fog_green3; + int fog_blue3; + float fog_minclip3; + float fog_maxclip3; + int fog_red4; + int fog_green4; + int fog_blue4; + float fog_minclip4; + float fog_maxclip4; + float fog_density; + std::string flag_needed; + int canbind; + int cancombat; + int canlevitate; + int castoutdoor; + int hotzone; + int insttype; + int shutdowndelay; + int peqzone; + int expansion; + int suspendbuffs; + int rain_chance1; + int rain_chance2; + int rain_chance3; + int rain_chance4; + int rain_duration1; + int rain_duration2; + int rain_duration3; + int rain_duration4; + int snow_chance1; + int snow_chance2; + int snow_chance3; + int snow_chance4; + int snow_duration1; + int snow_duration2; + int snow_duration3; + int snow_duration4; + float gravity; + int type; + int skylock; + int fast_regen_hp; + int fast_regen_mana; + int fast_regen_endurance; + int npc_max_aggro_dist; + int max_movement_update_range; + int min_expansion; + int max_expansion; + std::string content_flags; + std::string content_flags_disabled; + int underworld_teleport_index; + }; + + static std::string PrimaryKey() + { + return std::string("id"); + } + + static std::vector Columns() + { + return { + "short_name", + "id", + "file_name", + "long_name", + "map_file_name", + "safe_x", + "safe_y", + "safe_z", + "graveyard_id", + "min_level", + "min_status", + "zoneidnumber", + "version", + "timezone", + "maxclients", + "ruleset", + "note", + "underworld", + "minclip", + "maxclip", + "fog_minclip", + "fog_maxclip", + "fog_blue", + "fog_red", + "fog_green", + "sky", + "ztype", + "zone_exp_multiplier", + "walkspeed", + "time_type", + "fog_red1", + "fog_green1", + "fog_blue1", + "fog_minclip1", + "fog_maxclip1", + "fog_red2", + "fog_green2", + "fog_blue2", + "fog_minclip2", + "fog_maxclip2", + "fog_red3", + "fog_green3", + "fog_blue3", + "fog_minclip3", + "fog_maxclip3", + "fog_red4", + "fog_green4", + "fog_blue4", + "fog_minclip4", + "fog_maxclip4", + "fog_density", + "flag_needed", + "canbind", + "cancombat", + "canlevitate", + "castoutdoor", + "hotzone", + "insttype", + "shutdowndelay", + "peqzone", + "expansion", + "suspendbuffs", + "rain_chance1", + "rain_chance2", + "rain_chance3", + "rain_chance4", + "rain_duration1", + "rain_duration2", + "rain_duration3", + "rain_duration4", + "snow_chance1", + "snow_chance2", + "snow_chance3", + "snow_chance4", + "snow_duration1", + "snow_duration2", + "snow_duration3", + "snow_duration4", + "gravity", + "type", + "skylock", + "fast_regen_hp", + "fast_regen_mana", + "fast_regen_endurance", + "npc_max_aggro_dist", + "max_movement_update_range", + "min_expansion", + "max_expansion", + "content_flags", + "content_flags_disabled", + "underworld_teleport_index", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("zone"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static Zone NewEntity() + { + Zone entry{}; + + entry.short_name = ""; + entry.id = 0; + entry.file_name = ""; + entry.long_name = ""; + entry.map_file_name = ""; + entry.safe_x = 0; + entry.safe_y = 0; + entry.safe_z = 0; + entry.graveyard_id = 0; + entry.min_level = 0; + entry.min_status = 0; + entry.zoneidnumber = 0; + entry.version = 0; + entry.timezone = 0; + entry.maxclients = 0; + entry.ruleset = 0; + entry.note = ""; + entry.underworld = 0; + entry.minclip = 450; + entry.maxclip = 450; + entry.fog_minclip = 450; + entry.fog_maxclip = 450; + entry.fog_blue = 0; + entry.fog_red = 0; + entry.fog_green = 0; + entry.sky = 1; + entry.ztype = 1; + entry.zone_exp_multiplier = 0.00; + entry.walkspeed = 0.4; + entry.time_type = 2; + entry.fog_red1 = 0; + entry.fog_green1 = 0; + entry.fog_blue1 = 0; + entry.fog_minclip1 = 450; + entry.fog_maxclip1 = 450; + entry.fog_red2 = 0; + entry.fog_green2 = 0; + entry.fog_blue2 = 0; + entry.fog_minclip2 = 450; + entry.fog_maxclip2 = 450; + entry.fog_red3 = 0; + entry.fog_green3 = 0; + entry.fog_blue3 = 0; + entry.fog_minclip3 = 450; + entry.fog_maxclip3 = 450; + entry.fog_red4 = 0; + entry.fog_green4 = 0; + entry.fog_blue4 = 0; + entry.fog_minclip4 = 450; + entry.fog_maxclip4 = 450; + entry.fog_density = 0; + entry.flag_needed = ""; + entry.canbind = 1; + entry.cancombat = 1; + entry.canlevitate = 1; + entry.castoutdoor = 1; + entry.hotzone = 0; + entry.insttype = 0; + entry.shutdowndelay = 5000; + entry.peqzone = 1; + entry.expansion = 0; + entry.suspendbuffs = 0; + entry.rain_chance1 = 0; + entry.rain_chance2 = 0; + entry.rain_chance3 = 0; + entry.rain_chance4 = 0; + entry.rain_duration1 = 0; + entry.rain_duration2 = 0; + entry.rain_duration3 = 0; + entry.rain_duration4 = 0; + entry.snow_chance1 = 0; + entry.snow_chance2 = 0; + entry.snow_chance3 = 0; + entry.snow_chance4 = 0; + entry.snow_duration1 = 0; + entry.snow_duration2 = 0; + entry.snow_duration3 = 0; + entry.snow_duration4 = 0; + entry.gravity = 0.4; + entry.type = 0; + entry.skylock = 0; + entry.fast_regen_hp = 180; + entry.fast_regen_mana = 180; + entry.fast_regen_endurance = 180; + entry.npc_max_aggro_dist = 600; + entry.max_movement_update_range = 600; + entry.min_expansion = 0; + entry.max_expansion = 0; + entry.content_flags = ""; + entry.content_flags_disabled = ""; + entry.underworld_teleport_index = 0; + + return entry; + } + + static Zone GetZoneEntry( + const std::vector &zones, + int zone_id + ) + { + for (auto &zone : zones) { + if (zone.id == zone_id) { + return zone; + } + } + + return NewEntity(); + } + + static Zone FindOne( + Database& db, + int zone_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + zone_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Zone entry{}; + + entry.short_name = row[0] ? row[0] : ""; + entry.id = atoi(row[1]); + entry.file_name = row[2] ? row[2] : ""; + entry.long_name = row[3] ? row[3] : ""; + entry.map_file_name = row[4] ? row[4] : ""; + entry.safe_x = static_cast(atof(row[5])); + entry.safe_y = static_cast(atof(row[6])); + entry.safe_z = static_cast(atof(row[7])); + entry.graveyard_id = static_cast(atof(row[8])); + entry.min_level = atoi(row[9]); + entry.min_status = atoi(row[10]); + entry.zoneidnumber = atoi(row[11]); + entry.version = atoi(row[12]); + entry.timezone = atoi(row[13]); + entry.maxclients = atoi(row[14]); + entry.ruleset = atoi(row[15]); + entry.note = row[16] ? row[16] : ""; + entry.underworld = static_cast(atof(row[17])); + entry.minclip = static_cast(atof(row[18])); + entry.maxclip = static_cast(atof(row[19])); + entry.fog_minclip = static_cast(atof(row[20])); + entry.fog_maxclip = static_cast(atof(row[21])); + entry.fog_blue = atoi(row[22]); + entry.fog_red = atoi(row[23]); + entry.fog_green = atoi(row[24]); + entry.sky = atoi(row[25]); + entry.ztype = atoi(row[26]); + entry.zone_exp_multiplier = static_cast(atof(row[27])); + entry.walkspeed = static_cast(atof(row[28])); + entry.time_type = atoi(row[29]); + entry.fog_red1 = atoi(row[30]); + entry.fog_green1 = atoi(row[31]); + entry.fog_blue1 = atoi(row[32]); + entry.fog_minclip1 = static_cast(atof(row[33])); + entry.fog_maxclip1 = static_cast(atof(row[34])); + entry.fog_red2 = atoi(row[35]); + entry.fog_green2 = atoi(row[36]); + entry.fog_blue2 = atoi(row[37]); + entry.fog_minclip2 = static_cast(atof(row[38])); + entry.fog_maxclip2 = static_cast(atof(row[39])); + entry.fog_red3 = atoi(row[40]); + entry.fog_green3 = atoi(row[41]); + entry.fog_blue3 = atoi(row[42]); + entry.fog_minclip3 = static_cast(atof(row[43])); + entry.fog_maxclip3 = static_cast(atof(row[44])); + entry.fog_red4 = atoi(row[45]); + entry.fog_green4 = atoi(row[46]); + entry.fog_blue4 = atoi(row[47]); + entry.fog_minclip4 = static_cast(atof(row[48])); + entry.fog_maxclip4 = static_cast(atof(row[49])); + entry.fog_density = static_cast(atof(row[50])); + entry.flag_needed = row[51] ? row[51] : ""; + entry.canbind = atoi(row[52]); + entry.cancombat = atoi(row[53]); + entry.canlevitate = atoi(row[54]); + entry.castoutdoor = atoi(row[55]); + entry.hotzone = atoi(row[56]); + entry.insttype = atoi(row[57]); + entry.shutdowndelay = atoi(row[58]); + entry.peqzone = atoi(row[59]); + entry.expansion = atoi(row[60]); + entry.suspendbuffs = atoi(row[61]); + entry.rain_chance1 = atoi(row[62]); + entry.rain_chance2 = atoi(row[63]); + entry.rain_chance3 = atoi(row[64]); + entry.rain_chance4 = atoi(row[65]); + entry.rain_duration1 = atoi(row[66]); + entry.rain_duration2 = atoi(row[67]); + entry.rain_duration3 = atoi(row[68]); + entry.rain_duration4 = atoi(row[69]); + entry.snow_chance1 = atoi(row[70]); + entry.snow_chance2 = atoi(row[71]); + entry.snow_chance3 = atoi(row[72]); + entry.snow_chance4 = atoi(row[73]); + entry.snow_duration1 = atoi(row[74]); + entry.snow_duration2 = atoi(row[75]); + entry.snow_duration3 = atoi(row[76]); + entry.snow_duration4 = atoi(row[77]); + entry.gravity = static_cast(atof(row[78])); + entry.type = atoi(row[79]); + entry.skylock = atoi(row[80]); + entry.fast_regen_hp = atoi(row[81]); + entry.fast_regen_mana = atoi(row[82]); + entry.fast_regen_endurance = atoi(row[83]); + entry.npc_max_aggro_dist = atoi(row[84]); + entry.max_movement_update_range = atoi(row[85]); + entry.min_expansion = atoi(row[86]); + entry.max_expansion = atoi(row[87]); + entry.content_flags = row[88] ? row[88] : ""; + entry.content_flags_disabled = row[89] ? row[89] : ""; + entry.underworld_teleport_index = atoi(row[90]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int zone_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + zone_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + Zone zone_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(zone_entry.short_name) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(zone_entry.file_name) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(zone_entry.long_name) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(zone_entry.map_file_name) + "'"); + update_values.push_back(columns[5] + " = " + std::to_string(zone_entry.safe_x)); + update_values.push_back(columns[6] + " = " + std::to_string(zone_entry.safe_y)); + update_values.push_back(columns[7] + " = " + std::to_string(zone_entry.safe_z)); + update_values.push_back(columns[8] + " = " + std::to_string(zone_entry.graveyard_id)); + update_values.push_back(columns[9] + " = " + std::to_string(zone_entry.min_level)); + update_values.push_back(columns[10] + " = " + std::to_string(zone_entry.min_status)); + update_values.push_back(columns[11] + " = " + std::to_string(zone_entry.zoneidnumber)); + update_values.push_back(columns[12] + " = " + std::to_string(zone_entry.version)); + update_values.push_back(columns[13] + " = " + std::to_string(zone_entry.timezone)); + update_values.push_back(columns[14] + " = " + std::to_string(zone_entry.maxclients)); + update_values.push_back(columns[15] + " = " + std::to_string(zone_entry.ruleset)); + update_values.push_back(columns[16] + " = '" + EscapeString(zone_entry.note) + "'"); + update_values.push_back(columns[17] + " = " + std::to_string(zone_entry.underworld)); + update_values.push_back(columns[18] + " = " + std::to_string(zone_entry.minclip)); + update_values.push_back(columns[19] + " = " + std::to_string(zone_entry.maxclip)); + update_values.push_back(columns[20] + " = " + std::to_string(zone_entry.fog_minclip)); + update_values.push_back(columns[21] + " = " + std::to_string(zone_entry.fog_maxclip)); + update_values.push_back(columns[22] + " = " + std::to_string(zone_entry.fog_blue)); + update_values.push_back(columns[23] + " = " + std::to_string(zone_entry.fog_red)); + update_values.push_back(columns[24] + " = " + std::to_string(zone_entry.fog_green)); + update_values.push_back(columns[25] + " = " + std::to_string(zone_entry.sky)); + update_values.push_back(columns[26] + " = " + std::to_string(zone_entry.ztype)); + update_values.push_back(columns[27] + " = " + std::to_string(zone_entry.zone_exp_multiplier)); + update_values.push_back(columns[28] + " = " + std::to_string(zone_entry.walkspeed)); + update_values.push_back(columns[29] + " = " + std::to_string(zone_entry.time_type)); + update_values.push_back(columns[30] + " = " + std::to_string(zone_entry.fog_red1)); + update_values.push_back(columns[31] + " = " + std::to_string(zone_entry.fog_green1)); + update_values.push_back(columns[32] + " = " + std::to_string(zone_entry.fog_blue1)); + update_values.push_back(columns[33] + " = " + std::to_string(zone_entry.fog_minclip1)); + update_values.push_back(columns[34] + " = " + std::to_string(zone_entry.fog_maxclip1)); + update_values.push_back(columns[35] + " = " + std::to_string(zone_entry.fog_red2)); + update_values.push_back(columns[36] + " = " + std::to_string(zone_entry.fog_green2)); + update_values.push_back(columns[37] + " = " + std::to_string(zone_entry.fog_blue2)); + update_values.push_back(columns[38] + " = " + std::to_string(zone_entry.fog_minclip2)); + update_values.push_back(columns[39] + " = " + std::to_string(zone_entry.fog_maxclip2)); + update_values.push_back(columns[40] + " = " + std::to_string(zone_entry.fog_red3)); + update_values.push_back(columns[41] + " = " + std::to_string(zone_entry.fog_green3)); + update_values.push_back(columns[42] + " = " + std::to_string(zone_entry.fog_blue3)); + update_values.push_back(columns[43] + " = " + std::to_string(zone_entry.fog_minclip3)); + update_values.push_back(columns[44] + " = " + std::to_string(zone_entry.fog_maxclip3)); + update_values.push_back(columns[45] + " = " + std::to_string(zone_entry.fog_red4)); + update_values.push_back(columns[46] + " = " + std::to_string(zone_entry.fog_green4)); + update_values.push_back(columns[47] + " = " + std::to_string(zone_entry.fog_blue4)); + update_values.push_back(columns[48] + " = " + std::to_string(zone_entry.fog_minclip4)); + update_values.push_back(columns[49] + " = " + std::to_string(zone_entry.fog_maxclip4)); + update_values.push_back(columns[50] + " = " + std::to_string(zone_entry.fog_density)); + update_values.push_back(columns[51] + " = '" + EscapeString(zone_entry.flag_needed) + "'"); + update_values.push_back(columns[52] + " = " + std::to_string(zone_entry.canbind)); + update_values.push_back(columns[53] + " = " + std::to_string(zone_entry.cancombat)); + update_values.push_back(columns[54] + " = " + std::to_string(zone_entry.canlevitate)); + update_values.push_back(columns[55] + " = " + std::to_string(zone_entry.castoutdoor)); + update_values.push_back(columns[56] + " = " + std::to_string(zone_entry.hotzone)); + update_values.push_back(columns[57] + " = " + std::to_string(zone_entry.insttype)); + update_values.push_back(columns[58] + " = " + std::to_string(zone_entry.shutdowndelay)); + update_values.push_back(columns[59] + " = " + std::to_string(zone_entry.peqzone)); + update_values.push_back(columns[60] + " = " + std::to_string(zone_entry.expansion)); + update_values.push_back(columns[61] + " = " + std::to_string(zone_entry.suspendbuffs)); + update_values.push_back(columns[62] + " = " + std::to_string(zone_entry.rain_chance1)); + update_values.push_back(columns[63] + " = " + std::to_string(zone_entry.rain_chance2)); + update_values.push_back(columns[64] + " = " + std::to_string(zone_entry.rain_chance3)); + update_values.push_back(columns[65] + " = " + std::to_string(zone_entry.rain_chance4)); + update_values.push_back(columns[66] + " = " + std::to_string(zone_entry.rain_duration1)); + update_values.push_back(columns[67] + " = " + std::to_string(zone_entry.rain_duration2)); + update_values.push_back(columns[68] + " = " + std::to_string(zone_entry.rain_duration3)); + update_values.push_back(columns[69] + " = " + std::to_string(zone_entry.rain_duration4)); + update_values.push_back(columns[70] + " = " + std::to_string(zone_entry.snow_chance1)); + update_values.push_back(columns[71] + " = " + std::to_string(zone_entry.snow_chance2)); + update_values.push_back(columns[72] + " = " + std::to_string(zone_entry.snow_chance3)); + update_values.push_back(columns[73] + " = " + std::to_string(zone_entry.snow_chance4)); + update_values.push_back(columns[74] + " = " + std::to_string(zone_entry.snow_duration1)); + update_values.push_back(columns[75] + " = " + std::to_string(zone_entry.snow_duration2)); + update_values.push_back(columns[76] + " = " + std::to_string(zone_entry.snow_duration3)); + update_values.push_back(columns[77] + " = " + std::to_string(zone_entry.snow_duration4)); + update_values.push_back(columns[78] + " = " + std::to_string(zone_entry.gravity)); + update_values.push_back(columns[79] + " = " + std::to_string(zone_entry.type)); + update_values.push_back(columns[80] + " = " + std::to_string(zone_entry.skylock)); + update_values.push_back(columns[81] + " = " + std::to_string(zone_entry.fast_regen_hp)); + update_values.push_back(columns[82] + " = " + std::to_string(zone_entry.fast_regen_mana)); + update_values.push_back(columns[83] + " = " + std::to_string(zone_entry.fast_regen_endurance)); + update_values.push_back(columns[84] + " = " + std::to_string(zone_entry.npc_max_aggro_dist)); + update_values.push_back(columns[85] + " = " + std::to_string(zone_entry.max_movement_update_range)); + update_values.push_back(columns[86] + " = " + std::to_string(zone_entry.min_expansion)); + update_values.push_back(columns[87] + " = " + std::to_string(zone_entry.max_expansion)); + update_values.push_back(columns[88] + " = '" + EscapeString(zone_entry.content_flags) + "'"); + update_values.push_back(columns[89] + " = '" + EscapeString(zone_entry.content_flags_disabled) + "'"); + update_values.push_back(columns[90] + " = " + std::to_string(zone_entry.underworld_teleport_index)); + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + zone_entry.id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Zone InsertOne( + Database& db, + Zone zone_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(zone_entry.short_name) + "'"); + insert_values.push_back(std::to_string(zone_entry.id)); + insert_values.push_back("'" + EscapeString(zone_entry.file_name) + "'"); + insert_values.push_back("'" + EscapeString(zone_entry.long_name) + "'"); + insert_values.push_back("'" + EscapeString(zone_entry.map_file_name) + "'"); + insert_values.push_back(std::to_string(zone_entry.safe_x)); + insert_values.push_back(std::to_string(zone_entry.safe_y)); + insert_values.push_back(std::to_string(zone_entry.safe_z)); + insert_values.push_back(std::to_string(zone_entry.graveyard_id)); + insert_values.push_back(std::to_string(zone_entry.min_level)); + insert_values.push_back(std::to_string(zone_entry.min_status)); + insert_values.push_back(std::to_string(zone_entry.zoneidnumber)); + insert_values.push_back(std::to_string(zone_entry.version)); + insert_values.push_back(std::to_string(zone_entry.timezone)); + insert_values.push_back(std::to_string(zone_entry.maxclients)); + insert_values.push_back(std::to_string(zone_entry.ruleset)); + insert_values.push_back("'" + EscapeString(zone_entry.note) + "'"); + insert_values.push_back(std::to_string(zone_entry.underworld)); + insert_values.push_back(std::to_string(zone_entry.minclip)); + insert_values.push_back(std::to_string(zone_entry.maxclip)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip)); + insert_values.push_back(std::to_string(zone_entry.fog_blue)); + insert_values.push_back(std::to_string(zone_entry.fog_red)); + insert_values.push_back(std::to_string(zone_entry.fog_green)); + insert_values.push_back(std::to_string(zone_entry.sky)); + insert_values.push_back(std::to_string(zone_entry.ztype)); + insert_values.push_back(std::to_string(zone_entry.zone_exp_multiplier)); + insert_values.push_back(std::to_string(zone_entry.walkspeed)); + insert_values.push_back(std::to_string(zone_entry.time_type)); + insert_values.push_back(std::to_string(zone_entry.fog_red1)); + insert_values.push_back(std::to_string(zone_entry.fog_green1)); + insert_values.push_back(std::to_string(zone_entry.fog_blue1)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip1)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip1)); + insert_values.push_back(std::to_string(zone_entry.fog_red2)); + insert_values.push_back(std::to_string(zone_entry.fog_green2)); + insert_values.push_back(std::to_string(zone_entry.fog_blue2)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip2)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip2)); + insert_values.push_back(std::to_string(zone_entry.fog_red3)); + insert_values.push_back(std::to_string(zone_entry.fog_green3)); + insert_values.push_back(std::to_string(zone_entry.fog_blue3)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip3)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip3)); + insert_values.push_back(std::to_string(zone_entry.fog_red4)); + insert_values.push_back(std::to_string(zone_entry.fog_green4)); + insert_values.push_back(std::to_string(zone_entry.fog_blue4)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip4)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip4)); + insert_values.push_back(std::to_string(zone_entry.fog_density)); + insert_values.push_back("'" + EscapeString(zone_entry.flag_needed) + "'"); + insert_values.push_back(std::to_string(zone_entry.canbind)); + insert_values.push_back(std::to_string(zone_entry.cancombat)); + insert_values.push_back(std::to_string(zone_entry.canlevitate)); + insert_values.push_back(std::to_string(zone_entry.castoutdoor)); + insert_values.push_back(std::to_string(zone_entry.hotzone)); + insert_values.push_back(std::to_string(zone_entry.insttype)); + insert_values.push_back(std::to_string(zone_entry.shutdowndelay)); + insert_values.push_back(std::to_string(zone_entry.peqzone)); + insert_values.push_back(std::to_string(zone_entry.expansion)); + insert_values.push_back(std::to_string(zone_entry.suspendbuffs)); + insert_values.push_back(std::to_string(zone_entry.rain_chance1)); + insert_values.push_back(std::to_string(zone_entry.rain_chance2)); + insert_values.push_back(std::to_string(zone_entry.rain_chance3)); + insert_values.push_back(std::to_string(zone_entry.rain_chance4)); + insert_values.push_back(std::to_string(zone_entry.rain_duration1)); + insert_values.push_back(std::to_string(zone_entry.rain_duration2)); + insert_values.push_back(std::to_string(zone_entry.rain_duration3)); + insert_values.push_back(std::to_string(zone_entry.rain_duration4)); + insert_values.push_back(std::to_string(zone_entry.snow_chance1)); + insert_values.push_back(std::to_string(zone_entry.snow_chance2)); + insert_values.push_back(std::to_string(zone_entry.snow_chance3)); + insert_values.push_back(std::to_string(zone_entry.snow_chance4)); + insert_values.push_back(std::to_string(zone_entry.snow_duration1)); + insert_values.push_back(std::to_string(zone_entry.snow_duration2)); + insert_values.push_back(std::to_string(zone_entry.snow_duration3)); + insert_values.push_back(std::to_string(zone_entry.snow_duration4)); + insert_values.push_back(std::to_string(zone_entry.gravity)); + insert_values.push_back(std::to_string(zone_entry.type)); + insert_values.push_back(std::to_string(zone_entry.skylock)); + insert_values.push_back(std::to_string(zone_entry.fast_regen_hp)); + insert_values.push_back(std::to_string(zone_entry.fast_regen_mana)); + insert_values.push_back(std::to_string(zone_entry.fast_regen_endurance)); + insert_values.push_back(std::to_string(zone_entry.npc_max_aggro_dist)); + insert_values.push_back(std::to_string(zone_entry.max_movement_update_range)); + insert_values.push_back(std::to_string(zone_entry.min_expansion)); + insert_values.push_back(std::to_string(zone_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(zone_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(zone_entry.content_flags_disabled) + "'"); + insert_values.push_back(std::to_string(zone_entry.underworld_teleport_index)); + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + zone_entry.id = results.LastInsertedID(); + return zone_entry; + } + + zone_entry = NewEntity(); + + return zone_entry; + } + + static int InsertMany( + Database& db, + std::vector zone_entries + ) + { + std::vector insert_chunks; + + for (auto &zone_entry: zone_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(zone_entry.short_name) + "'"); + insert_values.push_back(std::to_string(zone_entry.id)); + insert_values.push_back("'" + EscapeString(zone_entry.file_name) + "'"); + insert_values.push_back("'" + EscapeString(zone_entry.long_name) + "'"); + insert_values.push_back("'" + EscapeString(zone_entry.map_file_name) + "'"); + insert_values.push_back(std::to_string(zone_entry.safe_x)); + insert_values.push_back(std::to_string(zone_entry.safe_y)); + insert_values.push_back(std::to_string(zone_entry.safe_z)); + insert_values.push_back(std::to_string(zone_entry.graveyard_id)); + insert_values.push_back(std::to_string(zone_entry.min_level)); + insert_values.push_back(std::to_string(zone_entry.min_status)); + insert_values.push_back(std::to_string(zone_entry.zoneidnumber)); + insert_values.push_back(std::to_string(zone_entry.version)); + insert_values.push_back(std::to_string(zone_entry.timezone)); + insert_values.push_back(std::to_string(zone_entry.maxclients)); + insert_values.push_back(std::to_string(zone_entry.ruleset)); + insert_values.push_back("'" + EscapeString(zone_entry.note) + "'"); + insert_values.push_back(std::to_string(zone_entry.underworld)); + insert_values.push_back(std::to_string(zone_entry.minclip)); + insert_values.push_back(std::to_string(zone_entry.maxclip)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip)); + insert_values.push_back(std::to_string(zone_entry.fog_blue)); + insert_values.push_back(std::to_string(zone_entry.fog_red)); + insert_values.push_back(std::to_string(zone_entry.fog_green)); + insert_values.push_back(std::to_string(zone_entry.sky)); + insert_values.push_back(std::to_string(zone_entry.ztype)); + insert_values.push_back(std::to_string(zone_entry.zone_exp_multiplier)); + insert_values.push_back(std::to_string(zone_entry.walkspeed)); + insert_values.push_back(std::to_string(zone_entry.time_type)); + insert_values.push_back(std::to_string(zone_entry.fog_red1)); + insert_values.push_back(std::to_string(zone_entry.fog_green1)); + insert_values.push_back(std::to_string(zone_entry.fog_blue1)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip1)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip1)); + insert_values.push_back(std::to_string(zone_entry.fog_red2)); + insert_values.push_back(std::to_string(zone_entry.fog_green2)); + insert_values.push_back(std::to_string(zone_entry.fog_blue2)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip2)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip2)); + insert_values.push_back(std::to_string(zone_entry.fog_red3)); + insert_values.push_back(std::to_string(zone_entry.fog_green3)); + insert_values.push_back(std::to_string(zone_entry.fog_blue3)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip3)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip3)); + insert_values.push_back(std::to_string(zone_entry.fog_red4)); + insert_values.push_back(std::to_string(zone_entry.fog_green4)); + insert_values.push_back(std::to_string(zone_entry.fog_blue4)); + insert_values.push_back(std::to_string(zone_entry.fog_minclip4)); + insert_values.push_back(std::to_string(zone_entry.fog_maxclip4)); + insert_values.push_back(std::to_string(zone_entry.fog_density)); + insert_values.push_back("'" + EscapeString(zone_entry.flag_needed) + "'"); + insert_values.push_back(std::to_string(zone_entry.canbind)); + insert_values.push_back(std::to_string(zone_entry.cancombat)); + insert_values.push_back(std::to_string(zone_entry.canlevitate)); + insert_values.push_back(std::to_string(zone_entry.castoutdoor)); + insert_values.push_back(std::to_string(zone_entry.hotzone)); + insert_values.push_back(std::to_string(zone_entry.insttype)); + insert_values.push_back(std::to_string(zone_entry.shutdowndelay)); + insert_values.push_back(std::to_string(zone_entry.peqzone)); + insert_values.push_back(std::to_string(zone_entry.expansion)); + insert_values.push_back(std::to_string(zone_entry.suspendbuffs)); + insert_values.push_back(std::to_string(zone_entry.rain_chance1)); + insert_values.push_back(std::to_string(zone_entry.rain_chance2)); + insert_values.push_back(std::to_string(zone_entry.rain_chance3)); + insert_values.push_back(std::to_string(zone_entry.rain_chance4)); + insert_values.push_back(std::to_string(zone_entry.rain_duration1)); + insert_values.push_back(std::to_string(zone_entry.rain_duration2)); + insert_values.push_back(std::to_string(zone_entry.rain_duration3)); + insert_values.push_back(std::to_string(zone_entry.rain_duration4)); + insert_values.push_back(std::to_string(zone_entry.snow_chance1)); + insert_values.push_back(std::to_string(zone_entry.snow_chance2)); + insert_values.push_back(std::to_string(zone_entry.snow_chance3)); + insert_values.push_back(std::to_string(zone_entry.snow_chance4)); + insert_values.push_back(std::to_string(zone_entry.snow_duration1)); + insert_values.push_back(std::to_string(zone_entry.snow_duration2)); + insert_values.push_back(std::to_string(zone_entry.snow_duration3)); + insert_values.push_back(std::to_string(zone_entry.snow_duration4)); + insert_values.push_back(std::to_string(zone_entry.gravity)); + insert_values.push_back(std::to_string(zone_entry.type)); + insert_values.push_back(std::to_string(zone_entry.skylock)); + insert_values.push_back(std::to_string(zone_entry.fast_regen_hp)); + insert_values.push_back(std::to_string(zone_entry.fast_regen_mana)); + insert_values.push_back(std::to_string(zone_entry.fast_regen_endurance)); + insert_values.push_back(std::to_string(zone_entry.npc_max_aggro_dist)); + insert_values.push_back(std::to_string(zone_entry.max_movement_update_range)); + insert_values.push_back(std::to_string(zone_entry.min_expansion)); + insert_values.push_back(std::to_string(zone_entry.max_expansion)); + insert_values.push_back("'" + EscapeString(zone_entry.content_flags) + "'"); + insert_values.push_back("'" + EscapeString(zone_entry.content_flags_disabled) + "'"); + insert_values.push_back(std::to_string(zone_entry.underworld_teleport_index)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Zone entry{}; + + entry.short_name = row[0] ? row[0] : ""; + entry.id = atoi(row[1]); + entry.file_name = row[2] ? row[2] : ""; + entry.long_name = row[3] ? row[3] : ""; + entry.map_file_name = row[4] ? row[4] : ""; + entry.safe_x = static_cast(atof(row[5])); + entry.safe_y = static_cast(atof(row[6])); + entry.safe_z = static_cast(atof(row[7])); + entry.graveyard_id = static_cast(atof(row[8])); + entry.min_level = atoi(row[9]); + entry.min_status = atoi(row[10]); + entry.zoneidnumber = atoi(row[11]); + entry.version = atoi(row[12]); + entry.timezone = atoi(row[13]); + entry.maxclients = atoi(row[14]); + entry.ruleset = atoi(row[15]); + entry.note = row[16] ? row[16] : ""; + entry.underworld = static_cast(atof(row[17])); + entry.minclip = static_cast(atof(row[18])); + entry.maxclip = static_cast(atof(row[19])); + entry.fog_minclip = static_cast(atof(row[20])); + entry.fog_maxclip = static_cast(atof(row[21])); + entry.fog_blue = atoi(row[22]); + entry.fog_red = atoi(row[23]); + entry.fog_green = atoi(row[24]); + entry.sky = atoi(row[25]); + entry.ztype = atoi(row[26]); + entry.zone_exp_multiplier = static_cast(atof(row[27])); + entry.walkspeed = static_cast(atof(row[28])); + entry.time_type = atoi(row[29]); + entry.fog_red1 = atoi(row[30]); + entry.fog_green1 = atoi(row[31]); + entry.fog_blue1 = atoi(row[32]); + entry.fog_minclip1 = static_cast(atof(row[33])); + entry.fog_maxclip1 = static_cast(atof(row[34])); + entry.fog_red2 = atoi(row[35]); + entry.fog_green2 = atoi(row[36]); + entry.fog_blue2 = atoi(row[37]); + entry.fog_minclip2 = static_cast(atof(row[38])); + entry.fog_maxclip2 = static_cast(atof(row[39])); + entry.fog_red3 = atoi(row[40]); + entry.fog_green3 = atoi(row[41]); + entry.fog_blue3 = atoi(row[42]); + entry.fog_minclip3 = static_cast(atof(row[43])); + entry.fog_maxclip3 = static_cast(atof(row[44])); + entry.fog_red4 = atoi(row[45]); + entry.fog_green4 = atoi(row[46]); + entry.fog_blue4 = atoi(row[47]); + entry.fog_minclip4 = static_cast(atof(row[48])); + entry.fog_maxclip4 = static_cast(atof(row[49])); + entry.fog_density = static_cast(atof(row[50])); + entry.flag_needed = row[51] ? row[51] : ""; + entry.canbind = atoi(row[52]); + entry.cancombat = atoi(row[53]); + entry.canlevitate = atoi(row[54]); + entry.castoutdoor = atoi(row[55]); + entry.hotzone = atoi(row[56]); + entry.insttype = atoi(row[57]); + entry.shutdowndelay = atoi(row[58]); + entry.peqzone = atoi(row[59]); + entry.expansion = atoi(row[60]); + entry.suspendbuffs = atoi(row[61]); + entry.rain_chance1 = atoi(row[62]); + entry.rain_chance2 = atoi(row[63]); + entry.rain_chance3 = atoi(row[64]); + entry.rain_chance4 = atoi(row[65]); + entry.rain_duration1 = atoi(row[66]); + entry.rain_duration2 = atoi(row[67]); + entry.rain_duration3 = atoi(row[68]); + entry.rain_duration4 = atoi(row[69]); + entry.snow_chance1 = atoi(row[70]); + entry.snow_chance2 = atoi(row[71]); + entry.snow_chance3 = atoi(row[72]); + entry.snow_chance4 = atoi(row[73]); + entry.snow_duration1 = atoi(row[74]); + entry.snow_duration2 = atoi(row[75]); + entry.snow_duration3 = atoi(row[76]); + entry.snow_duration4 = atoi(row[77]); + entry.gravity = static_cast(atof(row[78])); + entry.type = atoi(row[79]); + entry.skylock = atoi(row[80]); + entry.fast_regen_hp = atoi(row[81]); + entry.fast_regen_mana = atoi(row[82]); + entry.fast_regen_endurance = atoi(row[83]); + entry.npc_max_aggro_dist = atoi(row[84]); + entry.max_movement_update_range = atoi(row[85]); + entry.min_expansion = atoi(row[86]); + entry.max_expansion = atoi(row[87]); + entry.content_flags = row[88] ? row[88] : ""; + entry.content_flags_disabled = row[89] ? row[89] : ""; + entry.underworld_teleport_index = atoi(row[90]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector GetWhere(Database& db, std::string where_filter) + { + std::vector all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Zone entry{}; + + entry.short_name = row[0] ? row[0] : ""; + entry.id = atoi(row[1]); + entry.file_name = row[2] ? row[2] : ""; + entry.long_name = row[3] ? row[3] : ""; + entry.map_file_name = row[4] ? row[4] : ""; + entry.safe_x = static_cast(atof(row[5])); + entry.safe_y = static_cast(atof(row[6])); + entry.safe_z = static_cast(atof(row[7])); + entry.graveyard_id = static_cast(atof(row[8])); + entry.min_level = atoi(row[9]); + entry.min_status = atoi(row[10]); + entry.zoneidnumber = atoi(row[11]); + entry.version = atoi(row[12]); + entry.timezone = atoi(row[13]); + entry.maxclients = atoi(row[14]); + entry.ruleset = atoi(row[15]); + entry.note = row[16] ? row[16] : ""; + entry.underworld = static_cast(atof(row[17])); + entry.minclip = static_cast(atof(row[18])); + entry.maxclip = static_cast(atof(row[19])); + entry.fog_minclip = static_cast(atof(row[20])); + entry.fog_maxclip = static_cast(atof(row[21])); + entry.fog_blue = atoi(row[22]); + entry.fog_red = atoi(row[23]); + entry.fog_green = atoi(row[24]); + entry.sky = atoi(row[25]); + entry.ztype = atoi(row[26]); + entry.zone_exp_multiplier = static_cast(atof(row[27])); + entry.walkspeed = static_cast(atof(row[28])); + entry.time_type = atoi(row[29]); + entry.fog_red1 = atoi(row[30]); + entry.fog_green1 = atoi(row[31]); + entry.fog_blue1 = atoi(row[32]); + entry.fog_minclip1 = static_cast(atof(row[33])); + entry.fog_maxclip1 = static_cast(atof(row[34])); + entry.fog_red2 = atoi(row[35]); + entry.fog_green2 = atoi(row[36]); + entry.fog_blue2 = atoi(row[37]); + entry.fog_minclip2 = static_cast(atof(row[38])); + entry.fog_maxclip2 = static_cast(atof(row[39])); + entry.fog_red3 = atoi(row[40]); + entry.fog_green3 = atoi(row[41]); + entry.fog_blue3 = atoi(row[42]); + entry.fog_minclip3 = static_cast(atof(row[43])); + entry.fog_maxclip3 = static_cast(atof(row[44])); + entry.fog_red4 = atoi(row[45]); + entry.fog_green4 = atoi(row[46]); + entry.fog_blue4 = atoi(row[47]); + entry.fog_minclip4 = static_cast(atof(row[48])); + entry.fog_maxclip4 = static_cast(atof(row[49])); + entry.fog_density = static_cast(atof(row[50])); + entry.flag_needed = row[51] ? row[51] : ""; + entry.canbind = atoi(row[52]); + entry.cancombat = atoi(row[53]); + entry.canlevitate = atoi(row[54]); + entry.castoutdoor = atoi(row[55]); + entry.hotzone = atoi(row[56]); + entry.insttype = atoi(row[57]); + entry.shutdowndelay = atoi(row[58]); + entry.peqzone = atoi(row[59]); + entry.expansion = atoi(row[60]); + entry.suspendbuffs = atoi(row[61]); + entry.rain_chance1 = atoi(row[62]); + entry.rain_chance2 = atoi(row[63]); + entry.rain_chance3 = atoi(row[64]); + entry.rain_chance4 = atoi(row[65]); + entry.rain_duration1 = atoi(row[66]); + entry.rain_duration2 = atoi(row[67]); + entry.rain_duration3 = atoi(row[68]); + entry.rain_duration4 = atoi(row[69]); + entry.snow_chance1 = atoi(row[70]); + entry.snow_chance2 = atoi(row[71]); + entry.snow_chance3 = atoi(row[72]); + entry.snow_chance4 = atoi(row[73]); + entry.snow_duration1 = atoi(row[74]); + entry.snow_duration2 = atoi(row[75]); + entry.snow_duration3 = atoi(row[76]); + entry.snow_duration4 = atoi(row[77]); + entry.gravity = static_cast(atof(row[78])); + entry.type = atoi(row[79]); + entry.skylock = atoi(row[80]); + entry.fast_regen_hp = atoi(row[81]); + entry.fast_regen_mana = atoi(row[82]); + entry.fast_regen_endurance = atoi(row[83]); + entry.npc_max_aggro_dist = atoi(row[84]); + entry.max_movement_update_range = atoi(row[85]); + entry.min_expansion = atoi(row[86]); + entry.max_expansion = atoi(row[87]); + entry.content_flags = row[88] ? row[88] : ""; + entry.content_flags_disabled = row[89] ? row[89] : ""; + entry.underworld_teleport_index = atoi(row[90]); + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_ZONE_REPOSITORY_H diff --git a/common/repositories/base_data_repository.h b/common/repositories/base_data_repository.h new file mode 100644 index 000000000..55bbb781b --- /dev/null +++ b/common/repositories/base_data_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_BASE_DATA_REPOSITORY_H +#define EQEMU_BASE_DATA_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_base_data_repository.h" + +class BaseDataRepository: public BaseBaseDataRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * BaseDataRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * BaseDataRepository::GetWhereNeverExpires() + * BaseDataRepository::GetWhereXAndY() + * BaseDataRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_BASE_DATA_REPOSITORY_H diff --git a/common/repositories/blocked_spells_repository.h b/common/repositories/blocked_spells_repository.h new file mode 100644 index 000000000..54d66e493 --- /dev/null +++ b/common/repositories/blocked_spells_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_BLOCKED_SPELLS_REPOSITORY_H +#define EQEMU_BLOCKED_SPELLS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_blocked_spells_repository.h" + +class BlockedSpellsRepository: public BaseBlockedSpellsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * BlockedSpellsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * BlockedSpellsRepository::GetWhereNeverExpires() + * BlockedSpellsRepository::GetWhereXAndY() + * BlockedSpellsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_BLOCKED_SPELLS_REPOSITORY_H diff --git a/common/repositories/bug_reports_repository.h b/common/repositories/bug_reports_repository.h new file mode 100644 index 000000000..36b2258d2 --- /dev/null +++ b/common/repositories/bug_reports_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_BUG_REPORTS_REPOSITORY_H +#define EQEMU_BUG_REPORTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_bug_reports_repository.h" + +class BugReportsRepository: public BaseBugReportsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * BugReportsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * BugReportsRepository::GetWhereNeverExpires() + * BugReportsRepository::GetWhereXAndY() + * BugReportsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_BUG_REPORTS_REPOSITORY_H diff --git a/common/repositories/bugs_repository.h b/common/repositories/bugs_repository.h new file mode 100644 index 000000000..8ca1ac25c --- /dev/null +++ b/common/repositories/bugs_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_BUGS_REPOSITORY_H +#define EQEMU_BUGS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_bugs_repository.h" + +class BugsRepository: public BaseBugsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * BugsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * BugsRepository::GetWhereNeverExpires() + * BugsRepository::GetWhereXAndY() + * BugsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_BUGS_REPOSITORY_H diff --git a/common/repositories/buyer_repository.h b/common/repositories/buyer_repository.h new file mode 100644 index 000000000..d3ecb7585 --- /dev/null +++ b/common/repositories/buyer_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_BUYER_REPOSITORY_H +#define EQEMU_BUYER_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_buyer_repository.h" + +class BuyerRepository: public BaseBuyerRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * BuyerRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * BuyerRepository::GetWhereNeverExpires() + * BuyerRepository::GetWhereXAndY() + * BuyerRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_BUYER_REPOSITORY_H diff --git a/common/repositories/char_create_combinations_repository.h b/common/repositories/char_create_combinations_repository.h new file mode 100644 index 000000000..1d0260958 --- /dev/null +++ b/common/repositories/char_create_combinations_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHAR_CREATE_COMBINATIONS_REPOSITORY_H +#define EQEMU_CHAR_CREATE_COMBINATIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_char_create_combinations_repository.h" + +class CharCreateCombinationsRepository: public BaseCharCreateCombinationsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharCreateCombinationsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharCreateCombinationsRepository::GetWhereNeverExpires() + * CharCreateCombinationsRepository::GetWhereXAndY() + * CharCreateCombinationsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHAR_CREATE_COMBINATIONS_REPOSITORY_H diff --git a/common/repositories/char_create_point_allocations_repository.h b/common/repositories/char_create_point_allocations_repository.h new file mode 100644 index 000000000..1fd6cdcb9 --- /dev/null +++ b/common/repositories/char_create_point_allocations_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H +#define EQEMU_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_char_create_point_allocations_repository.h" + +class CharCreatePointAllocationsRepository: public BaseCharCreatePointAllocationsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharCreatePointAllocationsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharCreatePointAllocationsRepository::GetWhereNeverExpires() + * CharCreatePointAllocationsRepository::GetWhereXAndY() + * CharCreatePointAllocationsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H diff --git a/common/repositories/char_recipe_list_repository.h b/common/repositories/char_recipe_list_repository.h new file mode 100644 index 000000000..f8ff81f01 --- /dev/null +++ b/common/repositories/char_recipe_list_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHAR_RECIPE_LIST_REPOSITORY_H +#define EQEMU_CHAR_RECIPE_LIST_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_char_recipe_list_repository.h" + +class CharRecipeListRepository: public BaseCharRecipeListRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharRecipeListRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharRecipeListRepository::GetWhereNeverExpires() + * CharRecipeListRepository::GetWhereXAndY() + * CharRecipeListRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHAR_RECIPE_LIST_REPOSITORY_H diff --git a/common/repositories/character_activities_repository.h b/common/repositories/character_activities_repository.h new file mode 100644 index 000000000..9b442958c --- /dev/null +++ b/common/repositories/character_activities_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_ACTIVITIES_REPOSITORY_H +#define EQEMU_CHARACTER_ACTIVITIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_activities_repository.h" + +class CharacterActivitiesRepository: public BaseCharacterActivitiesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterActivitiesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterActivitiesRepository::GetWhereNeverExpires() + * CharacterActivitiesRepository::GetWhereXAndY() + * CharacterActivitiesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_ACTIVITIES_REPOSITORY_H diff --git a/common/repositories/character_alt_currency_repository.h b/common/repositories/character_alt_currency_repository.h new file mode 100644 index 000000000..3f657b817 --- /dev/null +++ b/common/repositories/character_alt_currency_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_ALT_CURRENCY_REPOSITORY_H +#define EQEMU_CHARACTER_ALT_CURRENCY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_alt_currency_repository.h" + +class CharacterAltCurrencyRepository: public BaseCharacterAltCurrencyRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterAltCurrencyRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterAltCurrencyRepository::GetWhereNeverExpires() + * CharacterAltCurrencyRepository::GetWhereXAndY() + * CharacterAltCurrencyRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_ALT_CURRENCY_REPOSITORY_H diff --git a/common/repositories/character_alternate_abilities_repository.h b/common/repositories/character_alternate_abilities_repository.h new file mode 100644 index 000000000..6c4bb6f16 --- /dev/null +++ b/common/repositories/character_alternate_abilities_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_ALTERNATE_ABILITIES_REPOSITORY_H +#define EQEMU_CHARACTER_ALTERNATE_ABILITIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_alternate_abilities_repository.h" + +class CharacterAlternateAbilitiesRepository: public BaseCharacterAlternateAbilitiesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterAlternateAbilitiesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterAlternateAbilitiesRepository::GetWhereNeverExpires() + * CharacterAlternateAbilitiesRepository::GetWhereXAndY() + * CharacterAlternateAbilitiesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_ALTERNATE_ABILITIES_REPOSITORY_H diff --git a/common/repositories/character_auras_repository.h b/common/repositories/character_auras_repository.h new file mode 100644 index 000000000..5f2669c2a --- /dev/null +++ b/common/repositories/character_auras_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_AURAS_REPOSITORY_H +#define EQEMU_CHARACTER_AURAS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_auras_repository.h" + +class CharacterAurasRepository: public BaseCharacterAurasRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterAurasRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterAurasRepository::GetWhereNeverExpires() + * CharacterAurasRepository::GetWhereXAndY() + * CharacterAurasRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_AURAS_REPOSITORY_H diff --git a/common/repositories/character_bandolier_repository.h b/common/repositories/character_bandolier_repository.h new file mode 100644 index 000000000..aacaf042d --- /dev/null +++ b/common/repositories/character_bandolier_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_BANDOLIER_REPOSITORY_H +#define EQEMU_CHARACTER_BANDOLIER_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_bandolier_repository.h" + +class CharacterBandolierRepository: public BaseCharacterBandolierRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterBandolierRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterBandolierRepository::GetWhereNeverExpires() + * CharacterBandolierRepository::GetWhereXAndY() + * CharacterBandolierRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_BANDOLIER_REPOSITORY_H diff --git a/common/repositories/character_bind_repository.h b/common/repositories/character_bind_repository.h new file mode 100644 index 000000000..28556c296 --- /dev/null +++ b/common/repositories/character_bind_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_BIND_REPOSITORY_H +#define EQEMU_CHARACTER_BIND_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_bind_repository.h" + +class CharacterBindRepository: public BaseCharacterBindRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterBindRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterBindRepository::GetWhereNeverExpires() + * CharacterBindRepository::GetWhereXAndY() + * CharacterBindRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_BIND_REPOSITORY_H diff --git a/common/repositories/character_buffs_repository.h b/common/repositories/character_buffs_repository.h new file mode 100644 index 000000000..d5a05dc3e --- /dev/null +++ b/common/repositories/character_buffs_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_BUFFS_REPOSITORY_H +#define EQEMU_CHARACTER_BUFFS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_buffs_repository.h" + +class CharacterBuffsRepository: public BaseCharacterBuffsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterBuffsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterBuffsRepository::GetWhereNeverExpires() + * CharacterBuffsRepository::GetWhereXAndY() + * CharacterBuffsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_BUFFS_REPOSITORY_H diff --git a/common/repositories/character_corpse_items_repository.h b/common/repositories/character_corpse_items_repository.h new file mode 100644 index 000000000..44ff0c7e2 --- /dev/null +++ b/common/repositories/character_corpse_items_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_CORPSE_ITEMS_REPOSITORY_H +#define EQEMU_CHARACTER_CORPSE_ITEMS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_corpse_items_repository.h" + +class CharacterCorpseItemsRepository: public BaseCharacterCorpseItemsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterCorpseItemsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterCorpseItemsRepository::GetWhereNeverExpires() + * CharacterCorpseItemsRepository::GetWhereXAndY() + * CharacterCorpseItemsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_CORPSE_ITEMS_REPOSITORY_H diff --git a/common/repositories/character_corpses_repository.h b/common/repositories/character_corpses_repository.h new file mode 100644 index 000000000..7a0d5af55 --- /dev/null +++ b/common/repositories/character_corpses_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_CORPSES_REPOSITORY_H +#define EQEMU_CHARACTER_CORPSES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_corpses_repository.h" + +class CharacterCorpsesRepository: public BaseCharacterCorpsesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterCorpsesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterCorpsesRepository::GetWhereNeverExpires() + * CharacterCorpsesRepository::GetWhereXAndY() + * CharacterCorpsesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_CORPSES_REPOSITORY_H diff --git a/common/repositories/character_currency_repository.h b/common/repositories/character_currency_repository.h new file mode 100644 index 000000000..661e4e7fa --- /dev/null +++ b/common/repositories/character_currency_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_CURRENCY_REPOSITORY_H +#define EQEMU_CHARACTER_CURRENCY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_currency_repository.h" + +class CharacterCurrencyRepository: public BaseCharacterCurrencyRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterCurrencyRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterCurrencyRepository::GetWhereNeverExpires() + * CharacterCurrencyRepository::GetWhereXAndY() + * CharacterCurrencyRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_CURRENCY_REPOSITORY_H diff --git a/common/repositories/character_data_repository.h b/common/repositories/character_data_repository.h new file mode 100644 index 000000000..e8ec2d21d --- /dev/null +++ b/common/repositories/character_data_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_DATA_REPOSITORY_H +#define EQEMU_CHARACTER_DATA_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_data_repository.h" + +class CharacterDataRepository: public BaseCharacterDataRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterDataRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterDataRepository::GetWhereNeverExpires() + * CharacterDataRepository::GetWhereXAndY() + * CharacterDataRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_DATA_REPOSITORY_H diff --git a/common/repositories/character_disciplines_repository.h b/common/repositories/character_disciplines_repository.h new file mode 100644 index 000000000..dd8dd029b --- /dev/null +++ b/common/repositories/character_disciplines_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_DISCIPLINES_REPOSITORY_H +#define EQEMU_CHARACTER_DISCIPLINES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_disciplines_repository.h" + +class CharacterDisciplinesRepository: public BaseCharacterDisciplinesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterDisciplinesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterDisciplinesRepository::GetWhereNeverExpires() + * CharacterDisciplinesRepository::GetWhereXAndY() + * CharacterDisciplinesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_DISCIPLINES_REPOSITORY_H diff --git a/common/repositories/character_expedition_lockouts_repository.h b/common/repositories/character_expedition_lockouts_repository.h new file mode 100644 index 000000000..006bacae1 --- /dev/null +++ b/common/repositories/character_expedition_lockouts_repository.h @@ -0,0 +1,144 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_EXPEDITION_LOCKOUTS_REPOSITORY_H +#define EQEMU_CHARACTER_EXPEDITION_LOCKOUTS_REPOSITORY_H + +#include "../database.h" +#include "../expedition_lockout_timer.h" +#include "../string_util.h" +#include "base/base_character_expedition_lockouts_repository.h" +#include + +class CharacterExpeditionLockoutsRepository: public BaseCharacterExpeditionLockoutsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterExpeditionLockoutsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterExpeditionLockoutsRepository::GetWhereNeverExpires() + * CharacterExpeditionLockoutsRepository::GetWhereXAndY() + * CharacterExpeditionLockoutsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + + struct CharacterExpeditionLockoutsTimeStamp { + int id; + int character_id; + std::string expedition_name; + std::string event_name; + time_t expire_time; + int duration; + std::string from_expedition_uuid; + }; + + static ExpeditionLockoutTimer GetExpeditionLockoutTimerFromEntry( + CharacterExpeditionLockoutsTimeStamp&& entry) + { + ExpeditionLockoutTimer lockout_timer{ + std::move(entry.from_expedition_uuid), + std::move(entry.expedition_name), + std::move(entry.event_name), + static_cast(entry.expire_time), + static_cast(entry.duration) + }; + + return lockout_timer; + } + + static std::unordered_map> GetManyCharacterLockoutTimers( + Database& db, const std::vector& character_ids, + const std::string& expedition_name, const std::string& ordered_event_name) + { + auto joined_character_ids = fmt::join(character_ids, ","); + + auto results = db.QueryDatabase(fmt::format(SQL( + SELECT + character_id, + UNIX_TIMESTAMP(expire_time), + duration, + event_name, + from_expedition_uuid + FROM character_expedition_lockouts + WHERE + character_id IN ({}) + AND expire_time > NOW() + AND expedition_name = '{}' + ORDER BY + FIELD(character_id, {}), + FIELD(event_name, '{}') DESC + ), + joined_character_ids, + EscapeString(expedition_name), + joined_character_ids, + EscapeString(ordered_event_name) + )); + + std::unordered_map> lockouts; + + for (auto row = results.begin(); row != results.end(); ++row) + { + CharacterExpeditionLockoutsTimeStamp entry{}; + + int col = 0; + entry.character_id = std::strtoul(row[col++], nullptr, 10); + entry.expire_time = std::strtoull(row[col++], nullptr, 10); + entry.duration = std::strtoul(row[col++], nullptr, 10); + entry.event_name = row[col++]; + entry.expedition_name = expedition_name; + entry.from_expedition_uuid = row[col++]; + + auto lockout = GetExpeditionLockoutTimerFromEntry(std::move(entry)); + lockouts[entry.character_id].emplace_back(std::move(lockout)); + } + + return lockouts; + } +}; + +#endif //EQEMU_CHARACTER_EXPEDITION_LOCKOUTS_REPOSITORY_H diff --git a/common/repositories/character_inspect_messages_repository.h b/common/repositories/character_inspect_messages_repository.h new file mode 100644 index 000000000..e916fd6e3 --- /dev/null +++ b/common/repositories/character_inspect_messages_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_INSPECT_MESSAGES_REPOSITORY_H +#define EQEMU_CHARACTER_INSPECT_MESSAGES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_inspect_messages_repository.h" + +class CharacterInspectMessagesRepository: public BaseCharacterInspectMessagesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterInspectMessagesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterInspectMessagesRepository::GetWhereNeverExpires() + * CharacterInspectMessagesRepository::GetWhereXAndY() + * CharacterInspectMessagesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_INSPECT_MESSAGES_REPOSITORY_H diff --git a/common/repositories/character_item_recast_repository.h b/common/repositories/character_item_recast_repository.h new file mode 100644 index 000000000..00814ad63 --- /dev/null +++ b/common/repositories/character_item_recast_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_ITEM_RECAST_REPOSITORY_H +#define EQEMU_CHARACTER_ITEM_RECAST_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_item_recast_repository.h" + +class CharacterItemRecastRepository: public BaseCharacterItemRecastRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterItemRecastRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterItemRecastRepository::GetWhereNeverExpires() + * CharacterItemRecastRepository::GetWhereXAndY() + * CharacterItemRecastRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_ITEM_RECAST_REPOSITORY_H diff --git a/common/repositories/character_languages_repository.h b/common/repositories/character_languages_repository.h new file mode 100644 index 000000000..de53ea979 --- /dev/null +++ b/common/repositories/character_languages_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_LANGUAGES_REPOSITORY_H +#define EQEMU_CHARACTER_LANGUAGES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_languages_repository.h" + +class CharacterLanguagesRepository: public BaseCharacterLanguagesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterLanguagesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterLanguagesRepository::GetWhereNeverExpires() + * CharacterLanguagesRepository::GetWhereXAndY() + * CharacterLanguagesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_LANGUAGES_REPOSITORY_H diff --git a/common/repositories/character_leadership_abilities_repository.h b/common/repositories/character_leadership_abilities_repository.h new file mode 100644 index 000000000..a2d496001 --- /dev/null +++ b/common/repositories/character_leadership_abilities_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_LEADERSHIP_ABILITIES_REPOSITORY_H +#define EQEMU_CHARACTER_LEADERSHIP_ABILITIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_leadership_abilities_repository.h" + +class CharacterLeadershipAbilitiesRepository: public BaseCharacterLeadershipAbilitiesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterLeadershipAbilitiesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterLeadershipAbilitiesRepository::GetWhereNeverExpires() + * CharacterLeadershipAbilitiesRepository::GetWhereXAndY() + * CharacterLeadershipAbilitiesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_LEADERSHIP_ABILITIES_REPOSITORY_H diff --git a/common/repositories/character_material_repository.h b/common/repositories/character_material_repository.h new file mode 100644 index 000000000..c80f5b050 --- /dev/null +++ b/common/repositories/character_material_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_MATERIAL_REPOSITORY_H +#define EQEMU_CHARACTER_MATERIAL_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_material_repository.h" + +class CharacterMaterialRepository: public BaseCharacterMaterialRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterMaterialRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterMaterialRepository::GetWhereNeverExpires() + * CharacterMaterialRepository::GetWhereXAndY() + * CharacterMaterialRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_MATERIAL_REPOSITORY_H diff --git a/common/repositories/character_memmed_spells_repository.h b/common/repositories/character_memmed_spells_repository.h new file mode 100644 index 000000000..8e4ac4be7 --- /dev/null +++ b/common/repositories/character_memmed_spells_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_MEMMED_SPELLS_REPOSITORY_H +#define EQEMU_CHARACTER_MEMMED_SPELLS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_memmed_spells_repository.h" + +class CharacterMemmedSpellsRepository: public BaseCharacterMemmedSpellsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterMemmedSpellsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterMemmedSpellsRepository::GetWhereNeverExpires() + * CharacterMemmedSpellsRepository::GetWhereXAndY() + * CharacterMemmedSpellsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_MEMMED_SPELLS_REPOSITORY_H diff --git a/common/repositories/character_pet_buffs_repository.h b/common/repositories/character_pet_buffs_repository.h new file mode 100644 index 000000000..1667e86df --- /dev/null +++ b/common/repositories/character_pet_buffs_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_PET_BUFFS_REPOSITORY_H +#define EQEMU_CHARACTER_PET_BUFFS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_pet_buffs_repository.h" + +class CharacterPetBuffsRepository: public BaseCharacterPetBuffsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterPetBuffsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterPetBuffsRepository::GetWhereNeverExpires() + * CharacterPetBuffsRepository::GetWhereXAndY() + * CharacterPetBuffsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_PET_BUFFS_REPOSITORY_H diff --git a/common/repositories/character_pet_info_repository.h b/common/repositories/character_pet_info_repository.h new file mode 100644 index 000000000..fcbf2a8d3 --- /dev/null +++ b/common/repositories/character_pet_info_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_PET_INFO_REPOSITORY_H +#define EQEMU_CHARACTER_PET_INFO_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_pet_info_repository.h" + +class CharacterPetInfoRepository: public BaseCharacterPetInfoRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterPetInfoRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterPetInfoRepository::GetWhereNeverExpires() + * CharacterPetInfoRepository::GetWhereXAndY() + * CharacterPetInfoRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_PET_INFO_REPOSITORY_H diff --git a/common/repositories/character_pet_inventory_repository.h b/common/repositories/character_pet_inventory_repository.h new file mode 100644 index 000000000..ab0570ab2 --- /dev/null +++ b/common/repositories/character_pet_inventory_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_PET_INVENTORY_REPOSITORY_H +#define EQEMU_CHARACTER_PET_INVENTORY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_pet_inventory_repository.h" + +class CharacterPetInventoryRepository: public BaseCharacterPetInventoryRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterPetInventoryRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterPetInventoryRepository::GetWhereNeverExpires() + * CharacterPetInventoryRepository::GetWhereXAndY() + * CharacterPetInventoryRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_PET_INVENTORY_REPOSITORY_H diff --git a/common/repositories/character_potionbelt_repository.h b/common/repositories/character_potionbelt_repository.h new file mode 100644 index 000000000..8ce1bb71b --- /dev/null +++ b/common/repositories/character_potionbelt_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_POTIONBELT_REPOSITORY_H +#define EQEMU_CHARACTER_POTIONBELT_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_potionbelt_repository.h" + +class CharacterPotionbeltRepository: public BaseCharacterPotionbeltRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterPotionbeltRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterPotionbeltRepository::GetWhereNeverExpires() + * CharacterPotionbeltRepository::GetWhereXAndY() + * CharacterPotionbeltRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_POTIONBELT_REPOSITORY_H diff --git a/common/repositories/character_skills_repository.h b/common/repositories/character_skills_repository.h new file mode 100644 index 000000000..de2f40f90 --- /dev/null +++ b/common/repositories/character_skills_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_SKILLS_REPOSITORY_H +#define EQEMU_CHARACTER_SKILLS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_skills_repository.h" + +class CharacterSkillsRepository: public BaseCharacterSkillsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterSkillsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterSkillsRepository::GetWhereNeverExpires() + * CharacterSkillsRepository::GetWhereXAndY() + * CharacterSkillsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_SKILLS_REPOSITORY_H diff --git a/common/repositories/character_spells_repository.h b/common/repositories/character_spells_repository.h new file mode 100644 index 000000000..982956ce3 --- /dev/null +++ b/common/repositories/character_spells_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_SPELLS_REPOSITORY_H +#define EQEMU_CHARACTER_SPELLS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_spells_repository.h" + +class CharacterSpellsRepository: public BaseCharacterSpellsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterSpellsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterSpellsRepository::GetWhereNeverExpires() + * CharacterSpellsRepository::GetWhereXAndY() + * CharacterSpellsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_SPELLS_REPOSITORY_H diff --git a/common/repositories/character_tasks_repository.h b/common/repositories/character_tasks_repository.h new file mode 100644 index 000000000..71ead2aeb --- /dev/null +++ b/common/repositories/character_tasks_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CHARACTER_TASKS_REPOSITORY_H +#define EQEMU_CHARACTER_TASKS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_character_tasks_repository.h" + +class CharacterTasksRepository: public BaseCharacterTasksRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CharacterTasksRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CharacterTasksRepository::GetWhereNeverExpires() + * CharacterTasksRepository::GetWhereXAndY() + * CharacterTasksRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CHARACTER_TASKS_REPOSITORY_H diff --git a/common/repositories/completed_tasks_repository.h b/common/repositories/completed_tasks_repository.h new file mode 100644 index 000000000..65a9a2c5c --- /dev/null +++ b/common/repositories/completed_tasks_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_COMPLETED_TASKS_REPOSITORY_H +#define EQEMU_COMPLETED_TASKS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_completed_tasks_repository.h" + +class CompletedTasksRepository: public BaseCompletedTasksRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * CompletedTasksRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * CompletedTasksRepository::GetWhereNeverExpires() + * CompletedTasksRepository::GetWhereXAndY() + * CompletedTasksRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_COMPLETED_TASKS_REPOSITORY_H diff --git a/common/repositories/content_flags_repository.h b/common/repositories/content_flags_repository.h new file mode 100644 index 000000000..d9bf0098c --- /dev/null +++ b/common/repositories/content_flags_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CONTENT_FLAGS_REPOSITORY_H +#define EQEMU_CONTENT_FLAGS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_content_flags_repository.h" + +class ContentFlagsRepository: public BaseContentFlagsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ContentFlagsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ContentFlagsRepository::GetWhereNeverExpires() + * ContentFlagsRepository::GetWhereXAndY() + * ContentFlagsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_CONTENT_FLAGS_REPOSITORY_H diff --git a/common/repositories/criteria/content_filter_criteria.h b/common/repositories/criteria/content_filter_criteria.h new file mode 100644 index 000000000..6fa1adc71 --- /dev/null +++ b/common/repositories/criteria/content_filter_criteria.h @@ -0,0 +1,88 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_CONTENT_FILTER_CRITERIA_H +#define EQEMU_CONTENT_FILTER_CRITERIA_H + +#include +#include "../../content/world_content_service.h" +#include "../../string_util.h" + +namespace ContentFilterCriteria { + static std::string apply(std::string table_prefix = "") + { + std::string criteria; + + if (!table_prefix.empty()) { + table_prefix = table_prefix + "."; + } + + int current_expansion_filter_criteria = content_service.GetCurrentExpansion(); + if (current_expansion_filter_criteria == Expansion::EXPANSION_ALL) { + current_expansion_filter_criteria = Expansion::EXPANSION_FILTER_MAX; + } + + criteria += fmt::format( + " AND ({}min_expansion <= {} OR {}min_expansion = 0)", + table_prefix, + current_expansion_filter_criteria, + table_prefix + ); + + criteria += fmt::format( + " AND ({}max_expansion >= {} OR {}max_expansion = 0)", + table_prefix, + current_expansion_filter_criteria, + table_prefix + ); + + std::vector flags = content_service.GetContentFlags(); + std::string flags_in_filter_enabled; + std::string flags_in_filter_disabled; + if (!flags.empty()) { + flags_in_filter_enabled = fmt::format( + " OR CONCAT(',', {}content_flags, ',') REGEXP ',({}),' ", + table_prefix, + implode("|", flags) + ); + flags_in_filter_disabled = fmt::format( + " OR CONCAT(',', {}content_flags_disabled, ',') NOT REGEXP ',({}),' ", + table_prefix, + implode("|", flags) + ); + } + + criteria += fmt::format( + " AND ({}content_flags IS NULL{}) ", + table_prefix, + flags_in_filter_enabled + ); + + criteria += fmt::format( + " AND ({}content_flags_disabled IS NULL{}) ", + table_prefix, + flags_in_filter_disabled + ); + + return std::string(criteria); + }; +} + +#endif //EQEMU_CONTENT_FILTER_CRITERIA_H diff --git a/common/repositories/damageshieldtypes_repository.h b/common/repositories/damageshieldtypes_repository.h new file mode 100644 index 000000000..3bb4b4fd2 --- /dev/null +++ b/common/repositories/damageshieldtypes_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_DAMAGESHIELDTYPES_REPOSITORY_H +#define EQEMU_DAMAGESHIELDTYPES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_damageshieldtypes_repository.h" + +class DamageshieldtypesRepository: public BaseDamageshieldtypesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * DamageshieldtypesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * DamageshieldtypesRepository::GetWhereNeverExpires() + * DamageshieldtypesRepository::GetWhereXAndY() + * DamageshieldtypesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_DAMAGESHIELDTYPES_REPOSITORY_H diff --git a/common/repositories/data_buckets_repository.h b/common/repositories/data_buckets_repository.h new file mode 100644 index 000000000..d33a56304 --- /dev/null +++ b/common/repositories/data_buckets_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_DATA_BUCKETS_REPOSITORY_H +#define EQEMU_DATA_BUCKETS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_data_buckets_repository.h" + +class DataBucketsRepository: public BaseDataBucketsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * DataBucketsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * DataBucketsRepository::GetWhereNeverExpires() + * DataBucketsRepository::GetWhereXAndY() + * DataBucketsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_DATA_BUCKETS_REPOSITORY_H diff --git a/common/repositories/db_str_repository.h b/common/repositories/db_str_repository.h new file mode 100644 index 000000000..95662cdfa --- /dev/null +++ b/common/repositories/db_str_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_DB_STR_REPOSITORY_H +#define EQEMU_DB_STR_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_db_str_repository.h" + +class DbStrRepository: public BaseDbStrRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * DbStrRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * DbStrRepository::GetWhereNeverExpires() + * DbStrRepository::GetWhereXAndY() + * DbStrRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_DB_STR_REPOSITORY_H diff --git a/common/repositories/discovered_items_repository.h b/common/repositories/discovered_items_repository.h new file mode 100644 index 000000000..512ebbbd7 --- /dev/null +++ b/common/repositories/discovered_items_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_DISCOVERED_ITEMS_REPOSITORY_H +#define EQEMU_DISCOVERED_ITEMS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_discovered_items_repository.h" + +class DiscoveredItemsRepository: public BaseDiscoveredItemsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * DiscoveredItemsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * DiscoveredItemsRepository::GetWhereNeverExpires() + * DiscoveredItemsRepository::GetWhereXAndY() + * DiscoveredItemsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_DISCOVERED_ITEMS_REPOSITORY_H diff --git a/common/repositories/doors_repository.h b/common/repositories/doors_repository.h new file mode 100644 index 000000000..aa67d8e20 --- /dev/null +++ b/common/repositories/doors_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_DOORS_REPOSITORY_H +#define EQEMU_DOORS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_doors_repository.h" + +class DoorsRepository: public BaseDoorsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * DoorsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * DoorsRepository::GetWhereNeverExpires() + * DoorsRepository::GetWhereXAndY() + * DoorsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_DOORS_REPOSITORY_H diff --git a/common/repositories/dynamic_zones_repository.h b/common/repositories/dynamic_zones_repository.h new file mode 100644 index 000000000..27fd406ca --- /dev/null +++ b/common/repositories/dynamic_zones_repository.h @@ -0,0 +1,305 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_DYNAMIC_ZONES_REPOSITORY_H +#define EQEMU_DYNAMIC_ZONES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_dynamic_zones_repository.h" + +class DynamicZonesRepository: public BaseDynamicZonesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * DynamicZonesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * DynamicZonesRepository::GetWhereNeverExpires() + * DynamicZonesRepository::GetWhereXAndY() + * DynamicZonesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + + struct DynamicZoneInstance + { + uint32_t id; + int instance_id; + int type; + int compass_zone_id; + float compass_x; + float compass_y; + float compass_z; + int safe_return_zone_id; + float safe_return_x; + float safe_return_y; + float safe_return_z; + float safe_return_heading; + float zone_in_x; + float zone_in_y; + float zone_in_z; + float zone_in_heading; + int has_zone_in; + int zone; + int version; + int is_global; + uint32_t start_time; + int duration; + int never_expires; + }; + + static std::string SelectDynamicZoneJoinInstance() + { + return std::string(SQL( + SELECT + dynamic_zones.id, + dynamic_zones.instance_id, + dynamic_zones.type, + dynamic_zones.compass_zone_id, + dynamic_zones.compass_x, + dynamic_zones.compass_y, + dynamic_zones.compass_z, + dynamic_zones.safe_return_zone_id, + dynamic_zones.safe_return_x, + dynamic_zones.safe_return_y, + dynamic_zones.safe_return_z, + dynamic_zones.safe_return_heading, + dynamic_zones.zone_in_x, + dynamic_zones.zone_in_y, + dynamic_zones.zone_in_z, + dynamic_zones.zone_in_heading, + dynamic_zones.has_zone_in, + instance_list.zone, + instance_list.version, + instance_list.is_global, + instance_list.start_time, + instance_list.duration, + instance_list.never_expires + FROM dynamic_zones + INNER JOIN instance_list ON dynamic_zones.instance_id = instance_list.id + )); + } + + static DynamicZoneInstance FillWithInstanceFromRow(MySQLRequestRow& row) + { + DynamicZoneInstance entry{}; + + int col = 0; + entry.id = strtoul(row[col++], nullptr, 10); + entry.instance_id = strtol(row[col++], nullptr, 10); + entry.type = strtol(row[col++], nullptr, 10); + entry.compass_zone_id = strtol(row[col++], nullptr, 10); + entry.compass_x = strtof(row[col++], nullptr); + entry.compass_y = strtof(row[col++], nullptr); + entry.compass_z = strtof(row[col++], nullptr); + entry.safe_return_zone_id = strtol(row[col++], nullptr, 10); + entry.safe_return_x = strtof(row[col++], nullptr); + entry.safe_return_y = strtof(row[col++], nullptr); + entry.safe_return_z = strtof(row[col++], nullptr); + entry.safe_return_heading = strtof(row[col++], nullptr); + entry.zone_in_x = strtof(row[col++], nullptr); + entry.zone_in_y = strtof(row[col++], nullptr); + entry.zone_in_z = strtof(row[col++], nullptr); + entry.zone_in_heading = strtof(row[col++], nullptr); + entry.has_zone_in = strtol(row[col++], nullptr, 10) != 0; + // from instance_list + entry.zone = strtol(row[col++], nullptr, 10); + entry.version = strtol(row[col++], nullptr, 10); + entry.is_global = strtol(row[col++], nullptr, 10); + entry.start_time = strtoul(row[col++], nullptr, 10); + entry.duration = strtol(row[col++], nullptr, 10); + entry.never_expires = strtol(row[col++], nullptr, 10); + + return entry; + } + + static std::vector GetWithInstance(Database& db, + const std::vector& dynamic_zone_ids) + { + if (dynamic_zone_ids.empty()) + { + return {}; + } + + std::vector all_entries; + + auto results = db.QueryDatabase(fmt::format( + "{} WHERE dynamic_zones.id IN ({}) ORDER BY dynamic_zones.id;", + SelectDynamicZoneJoinInstance(), + fmt::join(dynamic_zone_ids, ",") + )); + + if (results.Success()) + { + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) + { + DynamicZoneInstance entry = FillWithInstanceFromRow(row); + all_entries.emplace_back(std::move(entry)); + } + } + + return all_entries; + } + + static void UpdateCompass(Database& db, uint32_t dz_id, int zone_id, float x, float y, float z) + { + if (dz_id != 0) + { + std::string query = fmt::format(SQL( + UPDATE {} SET + compass_zone_id = {}, + compass_x = {}, + compass_y = {}, + compass_z = {} + WHERE {} = {}; + ), TableName(), zone_id, x, y, z, PrimaryKey(), dz_id); + + db.QueryDatabase(query); + } + } + + static void UpdateSafeReturn(Database& db, uint32_t dz_id, int zone_id, float x, float y, float z, float heading) + { + if (dz_id != 0) + { + std::string query = fmt::format(SQL( + UPDATE {} SET + safe_return_zone_id = {}, + safe_return_x = {}, + safe_return_y = {}, + safe_return_z = {}, + safe_return_heading = {} + WHERE {} = {}; + ), TableName(), zone_id, x, y, z, heading, PrimaryKey(), dz_id); + + db.QueryDatabase(query); + } + } + + static void UpdateZoneIn(Database& db, uint32_t dz_id, uint32_t zone_id, float x, float y, float z, float heading, bool has_zone_in) + { + if (dz_id != 0) + { + std::string query = fmt::format(SQL( + UPDATE {} SET + zone_in_x = {}, + zone_in_y = {}, + zone_in_z = {}, + zone_in_heading = {}, + has_zone_in = {} + WHERE {} = {}; + ), TableName(), x, y, z, heading, has_zone_in, PrimaryKey(), dz_id); + + db.QueryDatabase(query); + } + } + + struct DynamicZoneInstancePlayerCount + { + uint32_t id; + int type; + int instance; + int zone; + int version; + uint32_t start_time; + int duration; + int player_count; + }; + + static std::string SelectDynamicZoneInstancePlayerCount() + { + return std::string(SQL( + SELECT + dynamic_zones.id, + dynamic_zones.type, + instance_list.id, + instance_list.zone, + instance_list.version, + instance_list.start_time, + instance_list.duration, + COUNT(instance_list_player.id) member_count + FROM dynamic_zones + INNER JOIN instance_list ON dynamic_zones.instance_id = instance_list.id + LEFT JOIN instance_list_player ON instance_list.id = instance_list_player.id + GROUP BY instance_list.id + ORDER BY dynamic_zones.id; + )); + }; + + static std::vector AllDzInstancePlayerCounts(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase(SelectDynamicZoneInstancePlayerCount()); + if (results.Success()) + { + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) + { + DynamicZoneInstancePlayerCount entry{}; + + int col = 0; + entry.id = strtoul(row[col++], nullptr, 10); + entry.type = strtol(row[col++], nullptr, 10); + entry.instance = strtol(row[col++], nullptr, 10); + entry.zone = strtol(row[col++], nullptr, 10); + entry.version = strtol(row[col++], nullptr, 10); + entry.start_time = strtoul(row[col++], nullptr, 10); + entry.duration = strtol(row[col++], nullptr, 10); + entry.player_count = strtol(row[col++], nullptr, 10); + + all_entries.emplace_back(std::move(entry)); + } + } + return all_entries; + } +}; + +#endif //EQEMU_DYNAMIC_ZONES_REPOSITORY_H diff --git a/common/repositories/eventlog_repository.h b/common/repositories/eventlog_repository.h new file mode 100644 index 000000000..f2d7ba369 --- /dev/null +++ b/common/repositories/eventlog_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_EVENTLOG_REPOSITORY_H +#define EQEMU_EVENTLOG_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_eventlog_repository.h" + +class EventlogRepository: public BaseEventlogRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * EventlogRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * EventlogRepository::GetWhereNeverExpires() + * EventlogRepository::GetWhereXAndY() + * EventlogRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_EVENTLOG_REPOSITORY_H diff --git a/common/repositories/expedition_lockouts_repository.h b/common/repositories/expedition_lockouts_repository.h new file mode 100644 index 000000000..5eab18915 --- /dev/null +++ b/common/repositories/expedition_lockouts_repository.h @@ -0,0 +1,122 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_EXPEDITION_LOCKOUTS_REPOSITORY_H +#define EQEMU_EXPEDITION_LOCKOUTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_expedition_lockouts_repository.h" + +class ExpeditionLockoutsRepository: public BaseExpeditionLockoutsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ExpeditionLockoutsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ExpeditionLockoutsRepository::GetWhereNeverExpires() + * ExpeditionLockoutsRepository::GetWhereXAndY() + * ExpeditionLockoutsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + + struct ExpeditionLockoutsWithTimestamp { + uint32_t id; + uint32_t expedition_id; + std::string event_name; + time_t expire_time; + int duration; + std::string from_expedition_uuid; + }; + + static std::vector GetWithTimestamp( + Database& db, const std::vector& expedition_ids) + { + if (expedition_ids.empty()) + { + return {}; + } + + std::vector all_entries; + + auto results = db.QueryDatabase(fmt::format(SQL( + SELECT + id, + expedition_id, + event_name, + UNIX_TIMESTAMP(expire_time), + duration, + from_expedition_uuid + FROM expedition_lockouts + WHERE expedition_id IN ({}) + ), + fmt::join(expedition_ids, ",") + )); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) + { + ExpeditionLockoutsWithTimestamp entry{}; + + int col = 0; + entry.id = strtoul(row[col++], nullptr, 10); + entry.expedition_id = strtoul(row[col++], nullptr, 10); + entry.event_name = row[col++]; + entry.expire_time = strtoull(row[col++], nullptr, 10); + entry.duration = strtol(row[col++], nullptr, 10); + entry.from_expedition_uuid = row[col++]; + + all_entries.emplace_back(std::move(entry)); + } + + return all_entries; + } +}; + +#endif //EQEMU_EXPEDITION_LOCKOUTS_REPOSITORY_H diff --git a/common/repositories/expedition_members_repository.h b/common/repositories/expedition_members_repository.h new file mode 100644 index 000000000..55b5bddd7 --- /dev/null +++ b/common/repositories/expedition_members_repository.h @@ -0,0 +1,132 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_EXPEDITION_MEMBERS_REPOSITORY_H +#define EQEMU_EXPEDITION_MEMBERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_expedition_members_repository.h" + +class ExpeditionMembersRepository: public BaseExpeditionMembersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ExpeditionMembersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ExpeditionMembersRepository::GetWhereNeverExpires() + * ExpeditionMembersRepository::GetWhereXAndY() + * ExpeditionMembersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + + struct MemberWithName { + uint32_t id; + uint32_t expedition_id; + uint32_t character_id; + int is_current_member; + std::string character_name; + }; + + static std::string SelectMembersWithNames() + { + return std::string(SQL( + SELECT + expedition_members.id, + expedition_members.expedition_id, + expedition_members.character_id, + expedition_members.is_current_member, + character_data.name + FROM expedition_members + INNER JOIN character_data ON expedition_members.character_id = character_data.id + )); + } + + static std::vector GetWithNames(Database& db, + const std::vector& expedition_ids) + { + if (expedition_ids.empty()) + { + return {}; + } + + std::vector all_entries; + + auto results = db.QueryDatabase(fmt::format(SQL( + {} + WHERE expedition_members.expedition_id IN ({}) + AND expedition_members.is_current_member = TRUE; + ), + SelectMembersWithNames(), + fmt::join(expedition_ids, ",") + )); + + if (results.Success()) + { + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) + { + MemberWithName entry{}; + + int col = 0; + entry.id = strtoul(row[col++], nullptr, 10); + entry.expedition_id = strtoul(row[col++], nullptr, 10); + entry.character_id = strtoul(row[col++], nullptr, 10); + entry.is_current_member = strtoul(row[col++], nullptr, 10); + entry.character_name = row[col++]; + + all_entries.emplace_back(std::move(entry)); + } + } + + return all_entries; + } +}; + +#endif //EQEMU_EXPEDITION_MEMBERS_REPOSITORY_H diff --git a/common/repositories/expeditions_repository.h b/common/repositories/expeditions_repository.h new file mode 100644 index 000000000..47c821060 --- /dev/null +++ b/common/repositories/expeditions_repository.h @@ -0,0 +1,219 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_EXPEDITIONS_REPOSITORY_H +#define EQEMU_EXPEDITIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_expeditions_repository.h" + +class ExpeditionsRepository: public BaseExpeditionsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ExpeditionsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ExpeditionsRepository::GetWhereNeverExpires() + * ExpeditionsRepository::GetWhereXAndY() + * ExpeditionsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + + struct ExpeditionWithLeader + { + uint32_t id; + std::string uuid; + uint32_t dynamic_zone_id; + std::string expedition_name; + uint32_t min_players; + uint32_t max_players; + int add_replay_on_join; + int is_locked; + uint32_t leader_id; + std::string leader_name; + }; + + static std::string SelectExpeditionsJoinLeader() + { + return std::string(SQL( + SELECT + expeditions.id, + expeditions.uuid, + expeditions.dynamic_zone_id, + expeditions.expedition_name, + expeditions.min_players, + expeditions.max_players, + expeditions.add_replay_on_join, + expeditions.is_locked, + expeditions.leader_id, + character_data.name leader_name + FROM expeditions + INNER JOIN character_data ON expeditions.leader_id = character_data.id + )); + } + + static ExpeditionWithLeader FillExpeditionWithLeaderFromRow(MySQLRequestRow& row) + { + ExpeditionWithLeader entry{}; + + int col = 0; + entry.id = strtoul(row[col++], nullptr, 10); + entry.uuid = row[col++]; + entry.dynamic_zone_id = strtoul(row[col++], nullptr, 10); + entry.expedition_name = row[col++]; + entry.min_players = strtoul(row[col++], nullptr, 10); + entry.max_players = strtoul(row[col++], nullptr, 10); + entry.add_replay_on_join = strtoul(row[col++], nullptr, 10); + entry.is_locked = strtoul(row[col++], nullptr, 10); + entry.leader_id = strtoul(row[col++], nullptr, 10); + entry.leader_name = row[col++]; + + return entry; + } + + static std::vector GetAllWithLeaderName(Database& db) + { + std::vector all_entries; + + auto results = db.QueryDatabase(fmt::format( + "{} ORDER BY expeditions.id;", + SelectExpeditionsJoinLeader() + )); + + if (results.Success()) + { + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) + { + ExpeditionWithLeader entry = FillExpeditionWithLeaderFromRow(row); + all_entries.emplace_back(std::move(entry)); + } + } + + return all_entries; + } + + static ExpeditionWithLeader GetWithLeaderName(Database& db, uint32_t expedition_id) + { + ExpeditionWithLeader entry{}; + + auto results = db.QueryDatabase(fmt::format( + "{} WHERE expeditions.id = {};", + SelectExpeditionsJoinLeader(), + expedition_id + )); + + if (results.Success() && results.RowCount() > 0) + { + auto row = results.begin(); + entry = FillExpeditionWithLeaderFromRow(row); + } + + return entry; + } + + struct CharacterExpedition + { + uint32_t id; + std::string name; + uint32_t expedition_id; + }; + + static std::vector GetCharactersWithExpedition( + Database& db, const std::vector& character_names) + { + if (character_names.empty()) + { + return {}; + } + + std::vector entries; + + auto joined_character_names = fmt::format("'{}'", fmt::join(character_names, "','")); + + auto results = db.QueryDatabase(fmt::format(SQL( + SELECT + character_data.id, + character_data.name, + MAX(expeditions.id) + FROM character_data + LEFT JOIN expedition_members + ON character_data.id = expedition_members.character_id + AND expedition_members.is_current_member = TRUE + LEFT JOIN expeditions + ON expedition_members.expedition_id = expeditions.id + WHERE character_data.name IN ({}) + GROUP BY character_data.id + ORDER BY FIELD(character_data.name, {}) + ), + joined_character_names, + joined_character_names + )); + + if (results.Success()) + { + entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) + { + CharacterExpedition entry{}; + entry.id = std::strtoul(row[0], nullptr, 10); + entry.name = row[1]; + entry.expedition_id = row[2] ? std::strtoul(row[2], nullptr, 10) : 0; + + entries.emplace_back(std::move(entry)); + } + } + + return entries; + } +}; + +#endif //EQEMU_EXPEDITIONS_REPOSITORY_H diff --git a/common/repositories/faction_base_data_repository.h b/common/repositories/faction_base_data_repository.h new file mode 100644 index 000000000..f62890768 --- /dev/null +++ b/common/repositories/faction_base_data_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FACTION_BASE_DATA_REPOSITORY_H +#define EQEMU_FACTION_BASE_DATA_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_faction_base_data_repository.h" + +class FactionBaseDataRepository: public BaseFactionBaseDataRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * FactionBaseDataRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * FactionBaseDataRepository::GetWhereNeverExpires() + * FactionBaseDataRepository::GetWhereXAndY() + * FactionBaseDataRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FACTION_BASE_DATA_REPOSITORY_H diff --git a/common/repositories/faction_list_mod_repository.h b/common/repositories/faction_list_mod_repository.h new file mode 100644 index 000000000..2999a273b --- /dev/null +++ b/common/repositories/faction_list_mod_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FACTION_LIST_MOD_REPOSITORY_H +#define EQEMU_FACTION_LIST_MOD_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_faction_list_mod_repository.h" + +class FactionListModRepository: public BaseFactionListModRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * FactionListModRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * FactionListModRepository::GetWhereNeverExpires() + * FactionListModRepository::GetWhereXAndY() + * FactionListModRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FACTION_LIST_MOD_REPOSITORY_H diff --git a/common/repositories/faction_list_repository.h b/common/repositories/faction_list_repository.h new file mode 100644 index 000000000..ef14bac7f --- /dev/null +++ b/common/repositories/faction_list_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FACTION_LIST_REPOSITORY_H +#define EQEMU_FACTION_LIST_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_faction_list_repository.h" + +class FactionListRepository: public BaseFactionListRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * FactionListRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * FactionListRepository::GetWhereNeverExpires() + * FactionListRepository::GetWhereXAndY() + * FactionListRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FACTION_LIST_REPOSITORY_H diff --git a/common/repositories/faction_values_repository.h b/common/repositories/faction_values_repository.h new file mode 100644 index 000000000..5c8ca4fe6 --- /dev/null +++ b/common/repositories/faction_values_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FACTION_VALUES_REPOSITORY_H +#define EQEMU_FACTION_VALUES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_faction_values_repository.h" + +class FactionValuesRepository: public BaseFactionValuesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * FactionValuesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * FactionValuesRepository::GetWhereNeverExpires() + * FactionValuesRepository::GetWhereXAndY() + * FactionValuesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FACTION_VALUES_REPOSITORY_H diff --git a/common/repositories/fishing_repository.h b/common/repositories/fishing_repository.h new file mode 100644 index 000000000..d5cd78cb7 --- /dev/null +++ b/common/repositories/fishing_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FISHING_REPOSITORY_H +#define EQEMU_FISHING_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_fishing_repository.h" + +class FishingRepository: public BaseFishingRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * FishingRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * FishingRepository::GetWhereNeverExpires() + * FishingRepository::GetWhereXAndY() + * FishingRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FISHING_REPOSITORY_H diff --git a/common/repositories/forage_repository.h b/common/repositories/forage_repository.h new file mode 100644 index 000000000..7f8e67c19 --- /dev/null +++ b/common/repositories/forage_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FORAGE_REPOSITORY_H +#define EQEMU_FORAGE_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_forage_repository.h" + +class ForageRepository: public BaseForageRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ForageRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ForageRepository::GetWhereNeverExpires() + * ForageRepository::GetWhereXAndY() + * ForageRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FORAGE_REPOSITORY_H diff --git a/common/repositories/friends_repository.h b/common/repositories/friends_repository.h new file mode 100644 index 000000000..0e0d0469a --- /dev/null +++ b/common/repositories/friends_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_FRIENDS_REPOSITORY_H +#define EQEMU_FRIENDS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_friends_repository.h" + +class FriendsRepository: public BaseFriendsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * FriendsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * FriendsRepository::GetWhereNeverExpires() + * FriendsRepository::GetWhereXAndY() + * FriendsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_FRIENDS_REPOSITORY_H diff --git a/common/repositories/global_loot_repository.h b/common/repositories/global_loot_repository.h new file mode 100644 index 000000000..519fee2d4 --- /dev/null +++ b/common/repositories/global_loot_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GLOBAL_LOOT_REPOSITORY_H +#define EQEMU_GLOBAL_LOOT_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_global_loot_repository.h" + +class GlobalLootRepository: public BaseGlobalLootRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GlobalLootRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GlobalLootRepository::GetWhereNeverExpires() + * GlobalLootRepository::GetWhereXAndY() + * GlobalLootRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GLOBAL_LOOT_REPOSITORY_H diff --git a/common/repositories/gm_ips_repository.h b/common/repositories/gm_ips_repository.h new file mode 100644 index 000000000..94289a519 --- /dev/null +++ b/common/repositories/gm_ips_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GM_IPS_REPOSITORY_H +#define EQEMU_GM_IPS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_gm_ips_repository.h" + +class GmIpsRepository: public BaseGmIpsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GmIpsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GmIpsRepository::GetWhereNeverExpires() + * GmIpsRepository::GetWhereXAndY() + * GmIpsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GM_IPS_REPOSITORY_H diff --git a/common/repositories/goallists_repository.h b/common/repositories/goallists_repository.h new file mode 100644 index 000000000..781fd6200 --- /dev/null +++ b/common/repositories/goallists_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GOALLISTS_REPOSITORY_H +#define EQEMU_GOALLISTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_goallists_repository.h" + +class GoallistsRepository: public BaseGoallistsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GoallistsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GoallistsRepository::GetWhereNeverExpires() + * GoallistsRepository::GetWhereXAndY() + * GoallistsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GOALLISTS_REPOSITORY_H diff --git a/common/repositories/graveyard_repository.h b/common/repositories/graveyard_repository.h new file mode 100644 index 000000000..b427587a4 --- /dev/null +++ b/common/repositories/graveyard_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GRAVEYARD_REPOSITORY_H +#define EQEMU_GRAVEYARD_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_graveyard_repository.h" + +class GraveyardRepository: public BaseGraveyardRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GraveyardRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GraveyardRepository::GetWhereNeverExpires() + * GraveyardRepository::GetWhereXAndY() + * GraveyardRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GRAVEYARD_REPOSITORY_H diff --git a/common/repositories/grid_repository.h b/common/repositories/grid_repository.h index 49305c33b..ea965546e 100644 --- a/common/repositories/grid_repository.h +++ b/common/repositories/grid_repository.h @@ -23,58 +23,45 @@ #include "../database.h" #include "../string_util.h" +#include "base/base_grid_repository.h" -class GridRepository { +class GridRepository : public BaseGridRepository { public: - struct Grid { - int id; - int zoneid; - int type; - int type2; - }; - static std::vector Columns() - { - return { - "id", - "zoneid", - "type", - "type2", - }; - } + /** + * This file was auto generated on Apr 5, 2020 and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators + * + * Base Methods (Subject to be expanded upon in time) + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GridRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GridRepository::GetWhereNeverExpires() + * GridRepository::GetWhereXAndY() + * GridRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ - static std::string ColumnsRaw() - { - return std::string(implode(", ", Columns())); - } - - static std::string TableName() - { - return std::string("grid"); - } - - static std::string BaseSelect() - { - return std::string( - fmt::format( - "SELECT {} FROM {}", - ColumnsRaw(), - TableName() - ) - ); - } - - static Grid NewEntity() - { - Grid entry{}; - - entry.id = 0; - entry.zoneid = 0; - entry.type = 0; - entry.type2 = 0; - - return entry; - } + // Custom extended repository methods here static std::vector GetZoneGrids(int zone_id) { @@ -103,7 +90,7 @@ public: } static Grid GetGrid( - const std::vector& grids, + const std::vector &grids, int grid_id ) { @@ -118,4 +105,4 @@ public: }; -#endif +#endif //EQEMU_GRID_REPOSITORY_H diff --git a/common/repositories/ground_spawns_repository.h b/common/repositories/ground_spawns_repository.h new file mode 100644 index 000000000..79d0e9454 --- /dev/null +++ b/common/repositories/ground_spawns_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GROUND_SPAWNS_REPOSITORY_H +#define EQEMU_GROUND_SPAWNS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_ground_spawns_repository.h" + +class GroundSpawnsRepository: public BaseGroundSpawnsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GroundSpawnsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GroundSpawnsRepository::GetWhereNeverExpires() + * GroundSpawnsRepository::GetWhereXAndY() + * GroundSpawnsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GROUND_SPAWNS_REPOSITORY_H diff --git a/common/repositories/group_id_repository.h b/common/repositories/group_id_repository.h new file mode 100644 index 000000000..403dec551 --- /dev/null +++ b/common/repositories/group_id_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GROUP_ID_REPOSITORY_H +#define EQEMU_GROUP_ID_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_group_id_repository.h" + +class GroupIdRepository: public BaseGroupIdRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GroupIdRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GroupIdRepository::GetWhereNeverExpires() + * GroupIdRepository::GetWhereXAndY() + * GroupIdRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GROUP_ID_REPOSITORY_H diff --git a/common/repositories/group_leaders_repository.h b/common/repositories/group_leaders_repository.h new file mode 100644 index 000000000..811a6757e --- /dev/null +++ b/common/repositories/group_leaders_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GROUP_LEADERS_REPOSITORY_H +#define EQEMU_GROUP_LEADERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_group_leaders_repository.h" + +class GroupLeadersRepository: public BaseGroupLeadersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GroupLeadersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GroupLeadersRepository::GetWhereNeverExpires() + * GroupLeadersRepository::GetWhereXAndY() + * GroupLeadersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GROUP_LEADERS_REPOSITORY_H diff --git a/common/repositories/guild_bank_repository.h b/common/repositories/guild_bank_repository.h new file mode 100644 index 000000000..d23b66653 --- /dev/null +++ b/common/repositories/guild_bank_repository.h @@ -0,0 +1,309 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GUILD_BANK_REPOSITORY_H +#define EQEMU_GUILD_BANK_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" + +class GuildBankRepository { +public: + struct GuildBank { + int guildid; + int8 area; + int slot; + int itemid; + int qty; + std::string donator; + int8 permissions; + std::string whofor; + }; + + static std::string PrimaryKey() + { + return std::string(""); + } + + static std::vector Columns() + { + return { + "guildid", + "area", + "slot", + "itemid", + "qty", + "donator", + "permissions", + "whofor", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("guild_bank"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static GuildBank NewEntity() + { + GuildBank entry{}; + + entry.guildid = 0; + entry.area = 0; + entry.slot = 0; + entry.itemid = 0; + entry.qty = 0; + entry.donator = 0; + entry.permissions = 0; + entry.whofor = 0; + + return entry; + } + + static GuildBank GetGuildBankEntry( + const std::vector &guild_banks, + int guild_bank_id + ) + { + for (auto &guild_bank : guild_banks) { + if (guild_bank. == guild_bank_id) { + return guild_bank; + } + } + + return NewEntity(); + } + + static GuildBank FindOne( + int guild_bank_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + guild_bank_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + GuildBank entry{}; + + entry.guildid = atoi(row[0]); + entry.area = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.qty = atoi(row[4]); + entry.donator = row[5]; + entry.permissions = atoi(row[6]); + entry.whofor = row[7]; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int guild_bank_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + guild_bank_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + GuildBank guild_bank_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(guild_bank_entry.guildid)); + update_values.push_back(columns[1] + " = " + std::to_string(guild_bank_entry.area)); + update_values.push_back(columns[2] + " = " + std::to_string(guild_bank_entry.slot)); + update_values.push_back(columns[3] + " = " + std::to_string(guild_bank_entry.itemid)); + update_values.push_back(columns[4] + " = " + std::to_string(guild_bank_entry.qty)); + update_values.push_back(columns[5] + " = '" + EscapeString(guild_bank_entry.donator) + "'"); + update_values.push_back(columns[6] + " = " + std::to_string(guild_bank_entry.permissions)); + update_values.push_back(columns[7] + " = '" + EscapeString(guild_bank_entry.whofor) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + guild_bank_entry. + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static GuildBank InsertOne( + GuildBank guild_bank_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_bank_entry.guildid)); + insert_values.push_back(std::to_string(guild_bank_entry.area)); + insert_values.push_back(std::to_string(guild_bank_entry.slot)); + insert_values.push_back(std::to_string(guild_bank_entry.itemid)); + insert_values.push_back(std::to_string(guild_bank_entry.qty)); + insert_values.push_back("'" + EscapeString(guild_bank_entry.donator) + "'"); + insert_values.push_back(std::to_string(guild_bank_entry.permissions)); + insert_values.push_back("'" + EscapeString(guild_bank_entry.whofor) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + guild_bank_entry.id = results.LastInsertedID(); + return guild_bank_entry; + } + + guild_bank_entry = InstanceListRepository::NewEntity(); + + return guild_bank_entry; + } + + static int InsertMany( + std::vector guild_bank_entries + ) + { + std::vector insert_chunks; + + for (auto &guild_bank_entry: guild_bank_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(guild_bank_entry.guildid)); + insert_values.push_back(std::to_string(guild_bank_entry.area)); + insert_values.push_back(std::to_string(guild_bank_entry.slot)); + insert_values.push_back(std::to_string(guild_bank_entry.itemid)); + insert_values.push_back(std::to_string(guild_bank_entry.qty)); + insert_values.push_back("'" + EscapeString(guild_bank_entry.donator) + "'"); + insert_values.push_back(std::to_string(guild_bank_entry.permissions)); + insert_values.push_back("'" + EscapeString(guild_bank_entry.whofor) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + GuildBank entry{}; + + entry.guildid = atoi(row[0]); + entry.area = atoi(row[1]); + entry.slot = atoi(row[2]); + entry.itemid = atoi(row[3]); + entry.qty = atoi(row[4]); + entry.donator = row[5]; + entry.permissions = atoi(row[6]); + entry.whofor = row[7]; + + all_entries.push_back(entry); + } + + return all_entries; + } + +}; + +#endif //EQEMU_GUILD_BANK_REPOSITORY_H diff --git a/common/repositories/guild_members_repository.h b/common/repositories/guild_members_repository.h new file mode 100644 index 000000000..3afa2f198 --- /dev/null +++ b/common/repositories/guild_members_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GUILD_MEMBERS_REPOSITORY_H +#define EQEMU_GUILD_MEMBERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_guild_members_repository.h" + +class GuildMembersRepository: public BaseGuildMembersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GuildMembersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GuildMembersRepository::GetWhereNeverExpires() + * GuildMembersRepository::GetWhereXAndY() + * GuildMembersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GUILD_MEMBERS_REPOSITORY_H diff --git a/common/repositories/guild_ranks_repository.h b/common/repositories/guild_ranks_repository.h new file mode 100644 index 000000000..949227b49 --- /dev/null +++ b/common/repositories/guild_ranks_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GUILD_RANKS_REPOSITORY_H +#define EQEMU_GUILD_RANKS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_guild_ranks_repository.h" + +class GuildRanksRepository: public BaseGuildRanksRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GuildRanksRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GuildRanksRepository::GetWhereNeverExpires() + * GuildRanksRepository::GetWhereXAndY() + * GuildRanksRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GUILD_RANKS_REPOSITORY_H diff --git a/common/repositories/guild_relations_repository.h b/common/repositories/guild_relations_repository.h new file mode 100644 index 000000000..59b5cca5e --- /dev/null +++ b/common/repositories/guild_relations_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GUILD_RELATIONS_REPOSITORY_H +#define EQEMU_GUILD_RELATIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_guild_relations_repository.h" + +class GuildRelationsRepository: public BaseGuildRelationsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GuildRelationsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GuildRelationsRepository::GetWhereNeverExpires() + * GuildRelationsRepository::GetWhereXAndY() + * GuildRelationsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GUILD_RELATIONS_REPOSITORY_H diff --git a/common/repositories/guilds_repository.h b/common/repositories/guilds_repository.h new file mode 100644 index 000000000..c563f5cad --- /dev/null +++ b/common/repositories/guilds_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_GUILDS_REPOSITORY_H +#define EQEMU_GUILDS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_guilds_repository.h" + +class GuildsRepository: public BaseGuildsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * GuildsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * GuildsRepository::GetWhereNeverExpires() + * GuildsRepository::GetWhereXAndY() + * GuildsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_GUILDS_REPOSITORY_H diff --git a/common/repositories/hackers_repository.h b/common/repositories/hackers_repository.h new file mode 100644 index 000000000..89c5de5b1 --- /dev/null +++ b/common/repositories/hackers_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_HACKERS_REPOSITORY_H +#define EQEMU_HACKERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_hackers_repository.h" + +class HackersRepository: public BaseHackersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * HackersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * HackersRepository::GetWhereNeverExpires() + * HackersRepository::GetWhereXAndY() + * HackersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_HACKERS_REPOSITORY_H diff --git a/common/repositories/horses_repository.h b/common/repositories/horses_repository.h new file mode 100644 index 000000000..108d7c1da --- /dev/null +++ b/common/repositories/horses_repository.h @@ -0,0 +1,68 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_HORSES_REPOSITORY_H +#define EQEMU_HORSES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_horses_repository.h" + +class HorsesRepository: public BaseHorsesRepository { +public: + + /** + * This file was auto generated on Apr 5, 2020 and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators + * + * Base Methods (Subject to be expanded upon in time) + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * HorsesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * HorsesRepository::GetWhereNeverExpires() + * HorsesRepository::GetWhereXAndY() + * HorsesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_HORSES_REPOSITORY_H diff --git a/common/repositories/instance_list_player_repository.h b/common/repositories/instance_list_player_repository.h new file mode 100644 index 000000000..f865e5fd8 --- /dev/null +++ b/common/repositories/instance_list_player_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_INSTANCE_LIST_PLAYER_REPOSITORY_H +#define EQEMU_INSTANCE_LIST_PLAYER_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_instance_list_player_repository.h" + +class InstanceListPlayerRepository: public BaseInstanceListPlayerRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * InstanceListPlayerRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * InstanceListPlayerRepository::GetWhereNeverExpires() + * InstanceListPlayerRepository::GetWhereXAndY() + * InstanceListPlayerRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_INSTANCE_LIST_PLAYER_REPOSITORY_H diff --git a/common/repositories/instance_list_repository.h b/common/repositories/instance_list_repository.h new file mode 100644 index 000000000..6af82e302 --- /dev/null +++ b/common/repositories/instance_list_repository.h @@ -0,0 +1,79 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_INSTANCE_LIST_REPOSITORY_H +#define EQEMU_INSTANCE_LIST_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_instance_list_repository.h" + +class InstanceListRepository: public BaseInstanceListRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * InstanceListRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * InstanceListRepository::GetWhereNeverExpires() + * InstanceListRepository::GetWhereXAndY() + * InstanceListRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + + static int UpdateDuration(Database& db, int instance_id, uint32_t new_duration) + { + auto results = db.QueryDatabase(fmt::format( + "UPDATE {} SET duration = {} WHERE {} = {};", + TableName(), new_duration, PrimaryKey(), instance_id + )); + + return (results.Success() ? results.RowsAffected() : 0); + } +}; + +#endif //EQEMU_INSTANCE_LIST_REPOSITORY_H diff --git a/common/repositories/inventory_repository.h b/common/repositories/inventory_repository.h new file mode 100644 index 000000000..176cd2989 --- /dev/null +++ b/common/repositories/inventory_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_INVENTORY_REPOSITORY_H +#define EQEMU_INVENTORY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_inventory_repository.h" + +class InventoryRepository: public BaseInventoryRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * InventoryRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * InventoryRepository::GetWhereNeverExpires() + * InventoryRepository::GetWhereXAndY() + * InventoryRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_INVENTORY_REPOSITORY_H diff --git a/common/repositories/inventory_snapshots_repository.h b/common/repositories/inventory_snapshots_repository.h new file mode 100644 index 000000000..2ad48abe4 --- /dev/null +++ b/common/repositories/inventory_snapshots_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_INVENTORY_SNAPSHOTS_REPOSITORY_H +#define EQEMU_INVENTORY_SNAPSHOTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_inventory_snapshots_repository.h" + +class InventorySnapshotsRepository: public BaseInventorySnapshotsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * InventorySnapshotsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * InventorySnapshotsRepository::GetWhereNeverExpires() + * InventorySnapshotsRepository::GetWhereXAndY() + * InventorySnapshotsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_INVENTORY_SNAPSHOTS_REPOSITORY_H diff --git a/common/repositories/inventory_versions_repository.h b/common/repositories/inventory_versions_repository.h new file mode 100644 index 000000000..4469756de --- /dev/null +++ b/common/repositories/inventory_versions_repository.h @@ -0,0 +1,269 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_INVENTORY_VERSIONS_REPOSITORY_H +#define EQEMU_INVENTORY_VERSIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" + +class InventoryVersionsRepository { +public: + struct InventoryVersions { + int version; + int step; + int bot_step; + }; + + static std::string PrimaryKey() + { + return std::string(""); + } + + static std::vector Columns() + { + return { + "version", + "step", + "bot_step", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("inventory_versions"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static InventoryVersions NewEntity() + { + InventoryVersions entry{}; + + entry.version = 0; + entry.step = 0; + entry.bot_step = 0; + + return entry; + } + + static InventoryVersions GetInventoryVersionsEntry( + const std::vector &inventory_versionss, + int inventory_versions_id + ) + { + for (auto &inventory_versions : inventory_versionss) { + if (inventory_versions. == inventory_versions_id) { + return inventory_versions; + } + } + + return NewEntity(); + } + + static InventoryVersions FindOne( + int inventory_versions_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + inventory_versions_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + InventoryVersions entry{}; + + entry.version = atoi(row[0]); + entry.step = atoi(row[1]); + entry.bot_step = atoi(row[2]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int inventory_versions_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + inventory_versions_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + InventoryVersions inventory_versions_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(inventory_versions_entry.version)); + update_values.push_back(columns[1] + " = " + std::to_string(inventory_versions_entry.step)); + update_values.push_back(columns[2] + " = " + std::to_string(inventory_versions_entry.bot_step)); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + inventory_versions_entry. + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static InventoryVersions InsertOne( + InventoryVersions inventory_versions_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(inventory_versions_entry.version)); + insert_values.push_back(std::to_string(inventory_versions_entry.step)); + insert_values.push_back(std::to_string(inventory_versions_entry.bot_step)); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + inventory_versions_entry.id = results.LastInsertedID(); + return inventory_versions_entry; + } + + inventory_versions_entry = InstanceListRepository::NewEntity(); + + return inventory_versions_entry; + } + + static int InsertMany( + std::vector inventory_versions_entries + ) + { + std::vector insert_chunks; + + for (auto &inventory_versions_entry: inventory_versions_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(inventory_versions_entry.version)); + insert_values.push_back(std::to_string(inventory_versions_entry.step)); + insert_values.push_back(std::to_string(inventory_versions_entry.bot_step)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + InventoryVersions entry{}; + + entry.version = atoi(row[0]); + entry.step = atoi(row[1]); + entry.bot_step = atoi(row[2]); + + all_entries.push_back(entry); + } + + return all_entries; + } + +}; + +#endif //EQEMU_INVENTORY_VERSIONS_REPOSITORY_H diff --git a/common/repositories/ip_exemptions_repository.h b/common/repositories/ip_exemptions_repository.h new file mode 100644 index 000000000..e21ea22a0 --- /dev/null +++ b/common/repositories/ip_exemptions_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_IP_EXEMPTIONS_REPOSITORY_H +#define EQEMU_IP_EXEMPTIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_ip_exemptions_repository.h" + +class IpExemptionsRepository: public BaseIpExemptionsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * IpExemptionsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * IpExemptionsRepository::GetWhereNeverExpires() + * IpExemptionsRepository::GetWhereXAndY() + * IpExemptionsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_IP_EXEMPTIONS_REPOSITORY_H diff --git a/common/repositories/item_tick_repository.h b/common/repositories/item_tick_repository.h new file mode 100644 index 000000000..0cd798479 --- /dev/null +++ b/common/repositories/item_tick_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ITEM_TICK_REPOSITORY_H +#define EQEMU_ITEM_TICK_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_item_tick_repository.h" + +class ItemTickRepository: public BaseItemTickRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ItemTickRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ItemTickRepository::GetWhereNeverExpires() + * ItemTickRepository::GetWhereXAndY() + * ItemTickRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ITEM_TICK_REPOSITORY_H diff --git a/common/repositories/items_repository.h b/common/repositories/items_repository.h new file mode 100644 index 000000000..20be4f024 --- /dev/null +++ b/common/repositories/items_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ITEMS_REPOSITORY_H +#define EQEMU_ITEMS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_items_repository.h" + +class ItemsRepository: public BaseItemsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ItemsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ItemsRepository::GetWhereNeverExpires() + * ItemsRepository::GetWhereXAndY() + * ItemsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ITEMS_REPOSITORY_H diff --git a/common/repositories/ldon_trap_entries_repository.h b/common/repositories/ldon_trap_entries_repository.h new file mode 100644 index 000000000..38847056b --- /dev/null +++ b/common/repositories/ldon_trap_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LDON_TRAP_ENTRIES_REPOSITORY_H +#define EQEMU_LDON_TRAP_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_ldon_trap_entries_repository.h" + +class LdonTrapEntriesRepository: public BaseLdonTrapEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LdonTrapEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LdonTrapEntriesRepository::GetWhereNeverExpires() + * LdonTrapEntriesRepository::GetWhereXAndY() + * LdonTrapEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LDON_TRAP_ENTRIES_REPOSITORY_H diff --git a/common/repositories/ldon_trap_templates_repository.h b/common/repositories/ldon_trap_templates_repository.h new file mode 100644 index 000000000..1f0aaffc1 --- /dev/null +++ b/common/repositories/ldon_trap_templates_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LDON_TRAP_TEMPLATES_REPOSITORY_H +#define EQEMU_LDON_TRAP_TEMPLATES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_ldon_trap_templates_repository.h" + +class LdonTrapTemplatesRepository: public BaseLdonTrapTemplatesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LdonTrapTemplatesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LdonTrapTemplatesRepository::GetWhereNeverExpires() + * LdonTrapTemplatesRepository::GetWhereXAndY() + * LdonTrapTemplatesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LDON_TRAP_TEMPLATES_REPOSITORY_H diff --git a/common/repositories/level_exp_mods_repository.h b/common/repositories/level_exp_mods_repository.h new file mode 100644 index 000000000..cd52eb4fb --- /dev/null +++ b/common/repositories/level_exp_mods_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LEVEL_EXP_MODS_REPOSITORY_H +#define EQEMU_LEVEL_EXP_MODS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_level_exp_mods_repository.h" + +class LevelExpModsRepository: public BaseLevelExpModsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LevelExpModsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LevelExpModsRepository::GetWhereNeverExpires() + * LevelExpModsRepository::GetWhereXAndY() + * LevelExpModsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LEVEL_EXP_MODS_REPOSITORY_H diff --git a/common/repositories/lfguild_repository.h b/common/repositories/lfguild_repository.h new file mode 100644 index 000000000..202e0c0dd --- /dev/null +++ b/common/repositories/lfguild_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LFGUILD_REPOSITORY_H +#define EQEMU_LFGUILD_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_lfguild_repository.h" + +class LfguildRepository: public BaseLfguildRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LfguildRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LfguildRepository::GetWhereNeverExpires() + * LfguildRepository::GetWhereXAndY() + * LfguildRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LFGUILD_REPOSITORY_H diff --git a/common/repositories/login_accounts_repository.h b/common/repositories/login_accounts_repository.h new file mode 100644 index 000000000..0bc1a1340 --- /dev/null +++ b/common/repositories/login_accounts_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOGIN_ACCOUNTS_REPOSITORY_H +#define EQEMU_LOGIN_ACCOUNTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_login_accounts_repository.h" + +class LoginAccountsRepository: public BaseLoginAccountsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoginAccountsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoginAccountsRepository::GetWhereNeverExpires() + * LoginAccountsRepository::GetWhereXAndY() + * LoginAccountsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOGIN_ACCOUNTS_REPOSITORY_H diff --git a/common/repositories/login_api_tokens_repository.h b/common/repositories/login_api_tokens_repository.h new file mode 100644 index 000000000..a0b941c9e --- /dev/null +++ b/common/repositories/login_api_tokens_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOGIN_API_TOKENS_REPOSITORY_H +#define EQEMU_LOGIN_API_TOKENS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_login_api_tokens_repository.h" + +class LoginApiTokensRepository: public BaseLoginApiTokensRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoginApiTokensRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoginApiTokensRepository::GetWhereNeverExpires() + * LoginApiTokensRepository::GetWhereXAndY() + * LoginApiTokensRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOGIN_API_TOKENS_REPOSITORY_H diff --git a/common/repositories/login_server_admins_repository.h b/common/repositories/login_server_admins_repository.h new file mode 100644 index 000000000..cb75cf60e --- /dev/null +++ b/common/repositories/login_server_admins_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOGIN_SERVER_ADMINS_REPOSITORY_H +#define EQEMU_LOGIN_SERVER_ADMINS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_login_server_admins_repository.h" + +class LoginServerAdminsRepository: public BaseLoginServerAdminsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoginServerAdminsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoginServerAdminsRepository::GetWhereNeverExpires() + * LoginServerAdminsRepository::GetWhereXAndY() + * LoginServerAdminsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOGIN_SERVER_ADMINS_REPOSITORY_H diff --git a/common/repositories/login_server_list_types_repository.h b/common/repositories/login_server_list_types_repository.h new file mode 100644 index 000000000..84554c769 --- /dev/null +++ b/common/repositories/login_server_list_types_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOGIN_SERVER_LIST_TYPES_REPOSITORY_H +#define EQEMU_LOGIN_SERVER_LIST_TYPES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_login_server_list_types_repository.h" + +class LoginServerListTypesRepository: public BaseLoginServerListTypesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoginServerListTypesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoginServerListTypesRepository::GetWhereNeverExpires() + * LoginServerListTypesRepository::GetWhereXAndY() + * LoginServerListTypesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOGIN_SERVER_LIST_TYPES_REPOSITORY_H diff --git a/common/repositories/login_world_servers_repository.h b/common/repositories/login_world_servers_repository.h new file mode 100644 index 000000000..c0af6aaa1 --- /dev/null +++ b/common/repositories/login_world_servers_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOGIN_WORLD_SERVERS_REPOSITORY_H +#define EQEMU_LOGIN_WORLD_SERVERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_login_world_servers_repository.h" + +class LoginWorldServersRepository: public BaseLoginWorldServersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoginWorldServersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoginWorldServersRepository::GetWhereNeverExpires() + * LoginWorldServersRepository::GetWhereXAndY() + * LoginWorldServersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOGIN_WORLD_SERVERS_REPOSITORY_H diff --git a/common/repositories/logsys_categories_repository.h b/common/repositories/logsys_categories_repository.h new file mode 100644 index 000000000..ab494f1e8 --- /dev/null +++ b/common/repositories/logsys_categories_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOGSYS_CATEGORIES_REPOSITORY_H +#define EQEMU_LOGSYS_CATEGORIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_logsys_categories_repository.h" + +class LogsysCategoriesRepository: public BaseLogsysCategoriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LogsysCategoriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LogsysCategoriesRepository::GetWhereNeverExpires() + * LogsysCategoriesRepository::GetWhereXAndY() + * LogsysCategoriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOGSYS_CATEGORIES_REPOSITORY_H diff --git a/common/repositories/lootdrop_entries_repository.h b/common/repositories/lootdrop_entries_repository.h new file mode 100644 index 000000000..39d4abf3a --- /dev/null +++ b/common/repositories/lootdrop_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOOTDROP_ENTRIES_REPOSITORY_H +#define EQEMU_LOOTDROP_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_lootdrop_entries_repository.h" + +class LootdropEntriesRepository: public BaseLootdropEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LootdropEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LootdropEntriesRepository::GetWhereNeverExpires() + * LootdropEntriesRepository::GetWhereXAndY() + * LootdropEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOOTDROP_ENTRIES_REPOSITORY_H diff --git a/common/repositories/lootdrop_repository.h b/common/repositories/lootdrop_repository.h new file mode 100644 index 000000000..732e23a0b --- /dev/null +++ b/common/repositories/lootdrop_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOOTDROP_REPOSITORY_H +#define EQEMU_LOOTDROP_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_lootdrop_repository.h" + +class LootdropRepository: public BaseLootdropRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LootdropRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LootdropRepository::GetWhereNeverExpires() + * LootdropRepository::GetWhereXAndY() + * LootdropRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOOTDROP_REPOSITORY_H diff --git a/common/repositories/loottable_entries_repository.h b/common/repositories/loottable_entries_repository.h new file mode 100644 index 000000000..52720c10a --- /dev/null +++ b/common/repositories/loottable_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOOTTABLE_ENTRIES_REPOSITORY_H +#define EQEMU_LOOTTABLE_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_loottable_entries_repository.h" + +class LoottableEntriesRepository: public BaseLoottableEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoottableEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoottableEntriesRepository::GetWhereNeverExpires() + * LoottableEntriesRepository::GetWhereXAndY() + * LoottableEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOOTTABLE_ENTRIES_REPOSITORY_H diff --git a/common/repositories/loottable_repository.h b/common/repositories/loottable_repository.h new file mode 100644 index 000000000..c16d6cea7 --- /dev/null +++ b/common/repositories/loottable_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LOOTTABLE_REPOSITORY_H +#define EQEMU_LOOTTABLE_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_loottable_repository.h" + +class LoottableRepository: public BaseLoottableRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * LoottableRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * LoottableRepository::GetWhereNeverExpires() + * LoottableRepository::GetWhereXAndY() + * LoottableRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_LOOTTABLE_REPOSITORY_H diff --git a/common/repositories/mail_repository.h b/common/repositories/mail_repository.h new file mode 100644 index 000000000..04aec17f2 --- /dev/null +++ b/common/repositories/mail_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_MAIL_REPOSITORY_H +#define EQEMU_MAIL_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_mail_repository.h" + +class MailRepository: public BaseMailRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * MailRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * MailRepository::GetWhereNeverExpires() + * MailRepository::GetWhereXAndY() + * MailRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_MAIL_REPOSITORY_H diff --git a/common/repositories/merchantlist_repository.h b/common/repositories/merchantlist_repository.h new file mode 100644 index 000000000..ab0229315 --- /dev/null +++ b/common/repositories/merchantlist_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_MERCHANTLIST_REPOSITORY_H +#define EQEMU_MERCHANTLIST_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_merchantlist_repository.h" + +class MerchantlistRepository: public BaseMerchantlistRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * MerchantlistRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * MerchantlistRepository::GetWhereNeverExpires() + * MerchantlistRepository::GetWhereXAndY() + * MerchantlistRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_MERCHANTLIST_REPOSITORY_H diff --git a/common/repositories/merchantlist_temp_repository.h b/common/repositories/merchantlist_temp_repository.h new file mode 100644 index 000000000..ceaae788f --- /dev/null +++ b/common/repositories/merchantlist_temp_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_MERCHANTLIST_TEMP_REPOSITORY_H +#define EQEMU_MERCHANTLIST_TEMP_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_merchantlist_temp_repository.h" + +class MerchantlistTempRepository: public BaseMerchantlistTempRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * MerchantlistTempRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * MerchantlistTempRepository::GetWhereNeverExpires() + * MerchantlistTempRepository::GetWhereXAndY() + * MerchantlistTempRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_MERCHANTLIST_TEMP_REPOSITORY_H diff --git a/common/repositories/name_filter_repository.h b/common/repositories/name_filter_repository.h new file mode 100644 index 000000000..3cf63f55b --- /dev/null +++ b/common/repositories/name_filter_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NAME_FILTER_REPOSITORY_H +#define EQEMU_NAME_FILTER_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_name_filter_repository.h" + +class NameFilterRepository: public BaseNameFilterRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NameFilterRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NameFilterRepository::GetWhereNeverExpires() + * NameFilterRepository::GetWhereXAndY() + * NameFilterRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NAME_FILTER_REPOSITORY_H diff --git a/common/repositories/npc_emotes_repository.h b/common/repositories/npc_emotes_repository.h new file mode 100644 index 000000000..ef855b1f0 --- /dev/null +++ b/common/repositories/npc_emotes_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_EMOTES_REPOSITORY_H +#define EQEMU_NPC_EMOTES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_emotes_repository.h" + +class NpcEmotesRepository: public BaseNpcEmotesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcEmotesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcEmotesRepository::GetWhereNeverExpires() + * NpcEmotesRepository::GetWhereXAndY() + * NpcEmotesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_EMOTES_REPOSITORY_H diff --git a/common/repositories/npc_faction_entries_repository.h b/common/repositories/npc_faction_entries_repository.h new file mode 100644 index 000000000..48182fd24 --- /dev/null +++ b/common/repositories/npc_faction_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_FACTION_ENTRIES_REPOSITORY_H +#define EQEMU_NPC_FACTION_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_faction_entries_repository.h" + +class NpcFactionEntriesRepository: public BaseNpcFactionEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcFactionEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcFactionEntriesRepository::GetWhereNeverExpires() + * NpcFactionEntriesRepository::GetWhereXAndY() + * NpcFactionEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_FACTION_ENTRIES_REPOSITORY_H diff --git a/common/repositories/npc_faction_repository.h b/common/repositories/npc_faction_repository.h new file mode 100644 index 000000000..73bf0a94a --- /dev/null +++ b/common/repositories/npc_faction_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_FACTION_REPOSITORY_H +#define EQEMU_NPC_FACTION_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_faction_repository.h" + +class NpcFactionRepository: public BaseNpcFactionRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcFactionRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcFactionRepository::GetWhereNeverExpires() + * NpcFactionRepository::GetWhereXAndY() + * NpcFactionRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_FACTION_REPOSITORY_H diff --git a/common/repositories/npc_scale_global_base_repository.h b/common/repositories/npc_scale_global_base_repository.h new file mode 100644 index 000000000..b0748e18a --- /dev/null +++ b/common/repositories/npc_scale_global_base_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_SCALE_GLOBAL_BASE_REPOSITORY_H +#define EQEMU_NPC_SCALE_GLOBAL_BASE_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_scale_global_base_repository.h" + +class NpcScaleGlobalBaseRepository: public BaseNpcScaleGlobalBaseRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcScaleGlobalBaseRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcScaleGlobalBaseRepository::GetWhereNeverExpires() + * NpcScaleGlobalBaseRepository::GetWhereXAndY() + * NpcScaleGlobalBaseRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_SCALE_GLOBAL_BASE_REPOSITORY_H diff --git a/common/repositories/npc_spells_effects_entries_repository.h b/common/repositories/npc_spells_effects_entries_repository.h new file mode 100644 index 000000000..101edc188 --- /dev/null +++ b/common/repositories/npc_spells_effects_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_SPELLS_EFFECTS_ENTRIES_REPOSITORY_H +#define EQEMU_NPC_SPELLS_EFFECTS_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_spells_effects_entries_repository.h" + +class NpcSpellsEffectsEntriesRepository: public BaseNpcSpellsEffectsEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcSpellsEffectsEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcSpellsEffectsEntriesRepository::GetWhereNeverExpires() + * NpcSpellsEffectsEntriesRepository::GetWhereXAndY() + * NpcSpellsEffectsEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_SPELLS_EFFECTS_ENTRIES_REPOSITORY_H diff --git a/common/repositories/npc_spells_effects_repository.h b/common/repositories/npc_spells_effects_repository.h new file mode 100644 index 000000000..eeeb500b9 --- /dev/null +++ b/common/repositories/npc_spells_effects_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_SPELLS_EFFECTS_REPOSITORY_H +#define EQEMU_NPC_SPELLS_EFFECTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_spells_effects_repository.h" + +class NpcSpellsEffectsRepository: public BaseNpcSpellsEffectsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcSpellsEffectsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcSpellsEffectsRepository::GetWhereNeverExpires() + * NpcSpellsEffectsRepository::GetWhereXAndY() + * NpcSpellsEffectsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_SPELLS_EFFECTS_REPOSITORY_H diff --git a/common/repositories/npc_spells_entries_repository.h b/common/repositories/npc_spells_entries_repository.h new file mode 100644 index 000000000..15a971843 --- /dev/null +++ b/common/repositories/npc_spells_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_SPELLS_ENTRIES_REPOSITORY_H +#define EQEMU_NPC_SPELLS_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_spells_entries_repository.h" + +class NpcSpellsEntriesRepository: public BaseNpcSpellsEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcSpellsEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcSpellsEntriesRepository::GetWhereNeverExpires() + * NpcSpellsEntriesRepository::GetWhereXAndY() + * NpcSpellsEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_SPELLS_ENTRIES_REPOSITORY_H diff --git a/common/repositories/npc_spells_repository.h b/common/repositories/npc_spells_repository.h new file mode 100644 index 000000000..3ecd8d4f9 --- /dev/null +++ b/common/repositories/npc_spells_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_SPELLS_REPOSITORY_H +#define EQEMU_NPC_SPELLS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_spells_repository.h" + +class NpcSpellsRepository: public BaseNpcSpellsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcSpellsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcSpellsRepository::GetWhereNeverExpires() + * NpcSpellsRepository::GetWhereXAndY() + * NpcSpellsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_SPELLS_REPOSITORY_H diff --git a/common/repositories/npc_types_repository.h b/common/repositories/npc_types_repository.h new file mode 100644 index 000000000..d89a306a0 --- /dev/null +++ b/common/repositories/npc_types_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_TYPES_REPOSITORY_H +#define EQEMU_NPC_TYPES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_types_repository.h" + +class NpcTypesRepository: public BaseNpcTypesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcTypesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcTypesRepository::GetWhereNeverExpires() + * NpcTypesRepository::GetWhereXAndY() + * NpcTypesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_TYPES_REPOSITORY_H diff --git a/common/repositories/npc_types_tint_repository.h b/common/repositories/npc_types_tint_repository.h new file mode 100644 index 000000000..21bf02322 --- /dev/null +++ b/common/repositories/npc_types_tint_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_NPC_TYPES_TINT_REPOSITORY_H +#define EQEMU_NPC_TYPES_TINT_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_npc_types_tint_repository.h" + +class NpcTypesTintRepository: public BaseNpcTypesTintRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * NpcTypesTintRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * NpcTypesTintRepository::GetWhereNeverExpires() + * NpcTypesTintRepository::GetWhereXAndY() + * NpcTypesTintRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_NPC_TYPES_TINT_REPOSITORY_H diff --git a/common/repositories/object_contents_repository.h b/common/repositories/object_contents_repository.h new file mode 100644 index 000000000..c7a308241 --- /dev/null +++ b/common/repositories/object_contents_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_OBJECT_CONTENTS_REPOSITORY_H +#define EQEMU_OBJECT_CONTENTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_object_contents_repository.h" + +class ObjectContentsRepository: public BaseObjectContentsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ObjectContentsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ObjectContentsRepository::GetWhereNeverExpires() + * ObjectContentsRepository::GetWhereXAndY() + * ObjectContentsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_OBJECT_CONTENTS_REPOSITORY_H diff --git a/common/repositories/object_repository.h b/common/repositories/object_repository.h new file mode 100644 index 000000000..30df82443 --- /dev/null +++ b/common/repositories/object_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_OBJECT_REPOSITORY_H +#define EQEMU_OBJECT_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_object_repository.h" + +class ObjectRepository: public BaseObjectRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ObjectRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ObjectRepository::GetWhereNeverExpires() + * ObjectRepository::GetWhereXAndY() + * ObjectRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_OBJECT_REPOSITORY_H diff --git a/common/repositories/perl_event_export_settings_repository.h b/common/repositories/perl_event_export_settings_repository.h new file mode 100644 index 000000000..1c441bb76 --- /dev/null +++ b/common/repositories/perl_event_export_settings_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PERL_EVENT_EXPORT_SETTINGS_REPOSITORY_H +#define EQEMU_PERL_EVENT_EXPORT_SETTINGS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_perl_event_export_settings_repository.h" + +class PerlEventExportSettingsRepository: public BasePerlEventExportSettingsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * PerlEventExportSettingsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * PerlEventExportSettingsRepository::GetWhereNeverExpires() + * PerlEventExportSettingsRepository::GetWhereXAndY() + * PerlEventExportSettingsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PERL_EVENT_EXPORT_SETTINGS_REPOSITORY_H diff --git a/common/repositories/petitions_repository.h b/common/repositories/petitions_repository.h new file mode 100644 index 000000000..505f97986 --- /dev/null +++ b/common/repositories/petitions_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PETITIONS_REPOSITORY_H +#define EQEMU_PETITIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_petitions_repository.h" + +class PetitionsRepository: public BasePetitionsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * PetitionsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * PetitionsRepository::GetWhereNeverExpires() + * PetitionsRepository::GetWhereXAndY() + * PetitionsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PETITIONS_REPOSITORY_H diff --git a/common/repositories/pets_equipmentset_entries_repository.h b/common/repositories/pets_equipmentset_entries_repository.h new file mode 100644 index 000000000..866b65e31 --- /dev/null +++ b/common/repositories/pets_equipmentset_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PETS_EQUIPMENTSET_ENTRIES_REPOSITORY_H +#define EQEMU_PETS_EQUIPMENTSET_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_pets_equipmentset_entries_repository.h" + +class PetsEquipmentsetEntriesRepository: public BasePetsEquipmentsetEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * PetsEquipmentsetEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * PetsEquipmentsetEntriesRepository::GetWhereNeverExpires() + * PetsEquipmentsetEntriesRepository::GetWhereXAndY() + * PetsEquipmentsetEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PETS_EQUIPMENTSET_ENTRIES_REPOSITORY_H diff --git a/common/repositories/pets_equipmentset_repository.h b/common/repositories/pets_equipmentset_repository.h new file mode 100644 index 000000000..1042972ab --- /dev/null +++ b/common/repositories/pets_equipmentset_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PETS_EQUIPMENTSET_REPOSITORY_H +#define EQEMU_PETS_EQUIPMENTSET_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_pets_equipmentset_repository.h" + +class PetsEquipmentsetRepository: public BasePetsEquipmentsetRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * PetsEquipmentsetRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * PetsEquipmentsetRepository::GetWhereNeverExpires() + * PetsEquipmentsetRepository::GetWhereXAndY() + * PetsEquipmentsetRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PETS_EQUIPMENTSET_REPOSITORY_H diff --git a/common/repositories/pets_repository.h b/common/repositories/pets_repository.h new file mode 100644 index 000000000..8aa99fde5 --- /dev/null +++ b/common/repositories/pets_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PETS_REPOSITORY_H +#define EQEMU_PETS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_pets_repository.h" + +class PetsRepository: public BasePetsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * PetsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * PetsRepository::GetWhereNeverExpires() + * PetsRepository::GetWhereXAndY() + * PetsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PETS_REPOSITORY_H diff --git a/common/repositories/player_titlesets_repository.h b/common/repositories/player_titlesets_repository.h new file mode 100644 index 000000000..330b9ba48 --- /dev/null +++ b/common/repositories/player_titlesets_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PLAYER_TITLESETS_REPOSITORY_H +#define EQEMU_PLAYER_TITLESETS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_player_titlesets_repository.h" + +class PlayerTitlesetsRepository: public BasePlayerTitlesetsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * PlayerTitlesetsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * PlayerTitlesetsRepository::GetWhereNeverExpires() + * PlayerTitlesetsRepository::GetWhereXAndY() + * PlayerTitlesetsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PLAYER_TITLESETS_REPOSITORY_H diff --git a/common/repositories/proximities_repository.h b/common/repositories/proximities_repository.h new file mode 100644 index 000000000..3044c2348 --- /dev/null +++ b/common/repositories/proximities_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_PROXIMITIES_REPOSITORY_H +#define EQEMU_PROXIMITIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_proximities_repository.h" + +class ProximitiesRepository: public BaseProximitiesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ProximitiesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ProximitiesRepository::GetWhereNeverExpires() + * ProximitiesRepository::GetWhereXAndY() + * ProximitiesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_PROXIMITIES_REPOSITORY_H diff --git a/common/repositories/quest_globals_repository.h b/common/repositories/quest_globals_repository.h new file mode 100644 index 000000000..6be19d286 --- /dev/null +++ b/common/repositories/quest_globals_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_QUEST_GLOBALS_REPOSITORY_H +#define EQEMU_QUEST_GLOBALS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_quest_globals_repository.h" + +class QuestGlobalsRepository: public BaseQuestGlobalsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * QuestGlobalsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * QuestGlobalsRepository::GetWhereNeverExpires() + * QuestGlobalsRepository::GetWhereXAndY() + * QuestGlobalsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_QUEST_GLOBALS_REPOSITORY_H diff --git a/common/repositories/raid_details_repository.h b/common/repositories/raid_details_repository.h new file mode 100644 index 000000000..a9763096c --- /dev/null +++ b/common/repositories/raid_details_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_RAID_DETAILS_REPOSITORY_H +#define EQEMU_RAID_DETAILS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_raid_details_repository.h" + +class RaidDetailsRepository: public BaseRaidDetailsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * RaidDetailsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * RaidDetailsRepository::GetWhereNeverExpires() + * RaidDetailsRepository::GetWhereXAndY() + * RaidDetailsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_RAID_DETAILS_REPOSITORY_H diff --git a/common/repositories/raid_leaders_repository.h b/common/repositories/raid_leaders_repository.h new file mode 100644 index 000000000..592f0ca01 --- /dev/null +++ b/common/repositories/raid_leaders_repository.h @@ -0,0 +1,317 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_RAID_LEADERS_REPOSITORY_H +#define EQEMU_RAID_LEADERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" + +class RaidLeadersRepository { +public: + struct RaidLeaders { + int gid; + int rid; + std::string marknpc; + std::string maintank; + std::string assist; + std::string puller; + std::string leadershipaa; + std::string mentoree; + int mentor_percent; + }; + + static std::string PrimaryKey() + { + return std::string(""); + } + + static std::vector Columns() + { + return { + "gid", + "rid", + "marknpc", + "maintank", + "assist", + "puller", + "leadershipaa", + "mentoree", + "mentor_percent", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("raid_leaders"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static RaidLeaders NewEntity() + { + RaidLeaders entry{}; + + entry.gid = 0; + entry.rid = 0; + entry.marknpc = ""; + entry.maintank = ""; + entry.assist = ""; + entry.puller = ""; + entry.leadershipaa = 0; + entry.mentoree = ""; + entry.mentor_percent = 0; + + return entry; + } + + static RaidLeaders GetRaidLeadersEntry( + const std::vector &raid_leaderss, + int raid_leaders_id + ) + { + for (auto &raid_leaders : raid_leaderss) { + if (raid_leaders. == raid_leaders_id) { + return raid_leaders; + } + } + + return NewEntity(); + } + + static RaidLeaders FindOne( + int raid_leaders_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + raid_leaders_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + RaidLeaders entry{}; + + entry.gid = atoi(row[0]); + entry.rid = atoi(row[1]); + entry.marknpc = row[2]; + entry.maintank = row[3]; + entry.assist = row[4]; + entry.puller = row[5]; + entry.leadershipaa = row[6]; + entry.mentoree = row[7]; + entry.mentor_percent = atoi(row[8]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int raid_leaders_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + raid_leaders_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + RaidLeaders raid_leaders_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(raid_leaders_entry.gid)); + update_values.push_back(columns[1] + " = " + std::to_string(raid_leaders_entry.rid)); + update_values.push_back(columns[2] + " = '" + EscapeString(raid_leaders_entry.marknpc) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(raid_leaders_entry.maintank) + "'"); + update_values.push_back(columns[4] + " = '" + EscapeString(raid_leaders_entry.assist) + "'"); + update_values.push_back(columns[5] + " = '" + EscapeString(raid_leaders_entry.puller) + "'"); + update_values.push_back(columns[6] + " = '" + EscapeString(raid_leaders_entry.leadershipaa) + "'"); + update_values.push_back(columns[7] + " = '" + EscapeString(raid_leaders_entry.mentoree) + "'"); + update_values.push_back(columns[8] + " = " + std::to_string(raid_leaders_entry.mentor_percent)); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + raid_leaders_entry. + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static RaidLeaders InsertOne( + RaidLeaders raid_leaders_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(raid_leaders_entry.gid)); + insert_values.push_back(std::to_string(raid_leaders_entry.rid)); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.marknpc) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.maintank) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.assist) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.puller) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.leadershipaa) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.mentoree) + "'"); + insert_values.push_back(std::to_string(raid_leaders_entry.mentor_percent)); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + raid_leaders_entry.id = results.LastInsertedID(); + return raid_leaders_entry; + } + + raid_leaders_entry = InstanceListRepository::NewEntity(); + + return raid_leaders_entry; + } + + static int InsertMany( + std::vector raid_leaders_entries + ) + { + std::vector insert_chunks; + + for (auto &raid_leaders_entry: raid_leaders_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(raid_leaders_entry.gid)); + insert_values.push_back(std::to_string(raid_leaders_entry.rid)); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.marknpc) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.maintank) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.assist) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.puller) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.leadershipaa) + "'"); + insert_values.push_back("'" + EscapeString(raid_leaders_entry.mentoree) + "'"); + insert_values.push_back(std::to_string(raid_leaders_entry.mentor_percent)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + RaidLeaders entry{}; + + entry.gid = atoi(row[0]); + entry.rid = atoi(row[1]); + entry.marknpc = row[2]; + entry.maintank = row[3]; + entry.assist = row[4]; + entry.puller = row[5]; + entry.leadershipaa = row[6]; + entry.mentoree = row[7]; + entry.mentor_percent = atoi(row[8]); + + all_entries.push_back(entry); + } + + return all_entries; + } + +}; + +#endif //EQEMU_RAID_LEADERS_REPOSITORY_H diff --git a/common/repositories/raid_members_repository.h b/common/repositories/raid_members_repository.h new file mode 100644 index 000000000..1d904dfa6 --- /dev/null +++ b/common/repositories/raid_members_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_RAID_MEMBERS_REPOSITORY_H +#define EQEMU_RAID_MEMBERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_raid_members_repository.h" + +class RaidMembersRepository: public BaseRaidMembersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * RaidMembersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * RaidMembersRepository::GetWhereNeverExpires() + * RaidMembersRepository::GetWhereXAndY() + * RaidMembersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_RAID_MEMBERS_REPOSITORY_H diff --git a/common/repositories/reports_repository.h b/common/repositories/reports_repository.h new file mode 100644 index 000000000..4b94ce7c8 --- /dev/null +++ b/common/repositories/reports_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_REPORTS_REPOSITORY_H +#define EQEMU_REPORTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_reports_repository.h" + +class ReportsRepository: public BaseReportsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ReportsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ReportsRepository::GetWhereNeverExpires() + * ReportsRepository::GetWhereXAndY() + * ReportsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_REPORTS_REPOSITORY_H diff --git a/common/repositories/respawn_times_repository.h b/common/repositories/respawn_times_repository.h new file mode 100644 index 000000000..09561f056 --- /dev/null +++ b/common/repositories/respawn_times_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_RESPAWN_TIMES_REPOSITORY_H +#define EQEMU_RESPAWN_TIMES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_respawn_times_repository.h" + +class RespawnTimesRepository: public BaseRespawnTimesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * RespawnTimesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * RespawnTimesRepository::GetWhereNeverExpires() + * RespawnTimesRepository::GetWhereXAndY() + * RespawnTimesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_RESPAWN_TIMES_REPOSITORY_H diff --git a/common/repositories/rule_sets_repository.h b/common/repositories/rule_sets_repository.h new file mode 100644 index 000000000..20fae60d6 --- /dev/null +++ b/common/repositories/rule_sets_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_RULE_SETS_REPOSITORY_H +#define EQEMU_RULE_SETS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_rule_sets_repository.h" + +class RuleSetsRepository: public BaseRuleSetsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * RuleSetsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * RuleSetsRepository::GetWhereNeverExpires() + * RuleSetsRepository::GetWhereXAndY() + * RuleSetsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_RULE_SETS_REPOSITORY_H diff --git a/common/repositories/rule_values_repository.h b/common/repositories/rule_values_repository.h new file mode 100644 index 000000000..703fd07a1 --- /dev/null +++ b/common/repositories/rule_values_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_RULE_VALUES_REPOSITORY_H +#define EQEMU_RULE_VALUES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_rule_values_repository.h" + +class RuleValuesRepository: public BaseRuleValuesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * RuleValuesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * RuleValuesRepository::GetWhereNeverExpires() + * RuleValuesRepository::GetWhereXAndY() + * RuleValuesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_RULE_VALUES_REPOSITORY_H diff --git a/common/repositories/saylink_repository.h b/common/repositories/saylink_repository.h new file mode 100644 index 000000000..a2abaceae --- /dev/null +++ b/common/repositories/saylink_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SAYLINK_REPOSITORY_H +#define EQEMU_SAYLINK_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_saylink_repository.h" + +class SaylinkRepository: public BaseSaylinkRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SaylinkRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SaylinkRepository::GetWhereNeverExpires() + * SaylinkRepository::GetWhereXAndY() + * SaylinkRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SAYLINK_REPOSITORY_H diff --git a/common/repositories/server_scheduled_events_repository.h b/common/repositories/server_scheduled_events_repository.h new file mode 100644 index 000000000..edcc21dbc --- /dev/null +++ b/common/repositories/server_scheduled_events_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SERVER_SCHEDULED_EVENTS_REPOSITORY_H +#define EQEMU_SERVER_SCHEDULED_EVENTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_server_scheduled_events_repository.h" + +class ServerScheduledEventsRepository: public BaseServerScheduledEventsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ServerScheduledEventsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ServerScheduledEventsRepository::GetWhereNeverExpires() + * ServerScheduledEventsRepository::GetWhereXAndY() + * ServerScheduledEventsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SERVER_SCHEDULED_EVENTS_REPOSITORY_H diff --git a/common/repositories/sharedbank_repository.h b/common/repositories/sharedbank_repository.h new file mode 100644 index 000000000..440412ff4 --- /dev/null +++ b/common/repositories/sharedbank_repository.h @@ -0,0 +1,333 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SHAREDBANK_REPOSITORY_H +#define EQEMU_SHAREDBANK_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" + +class SharedbankRepository { +public: + struct Sharedbank { + int acctid; + int slotid; + int itemid; + int16 charges; + int augslot1; + int augslot2; + int augslot3; + int augslot4; + int augslot5; + int augslot6; + std::string custom_data; + }; + + static std::string PrimaryKey() + { + return std::string(""); + } + + static std::vector Columns() + { + return { + "acctid", + "slotid", + "itemid", + "charges", + "augslot1", + "augslot2", + "augslot3", + "augslot4", + "augslot5", + "augslot6", + "custom_data", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("sharedbank"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static Sharedbank NewEntity() + { + Sharedbank entry{}; + + entry.acctid = 0; + entry.slotid = 0; + entry.itemid = 0; + entry.charges = 0; + entry.augslot1 = 0; + entry.augslot2 = 0; + entry.augslot3 = 0; + entry.augslot4 = 0; + entry.augslot5 = 0; + entry.augslot6 = 0; + entry.custom_data = 0; + + return entry; + } + + static Sharedbank GetSharedbankEntry( + const std::vector &sharedbanks, + int sharedbank_id + ) + { + for (auto &sharedbank : sharedbanks) { + if (sharedbank. == sharedbank_id) { + return sharedbank; + } + } + + return NewEntity(); + } + + static Sharedbank FindOne( + int sharedbank_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + sharedbank_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + Sharedbank entry{}; + + entry.acctid = atoi(row[0]); + entry.slotid = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.augslot1 = atoi(row[4]); + entry.augslot2 = atoi(row[5]); + entry.augslot3 = atoi(row[6]); + entry.augslot4 = atoi(row[7]); + entry.augslot5 = atoi(row[8]); + entry.augslot6 = atoi(row[9]); + entry.custom_data = row[10]; + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int sharedbank_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + sharedbank_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Sharedbank sharedbank_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = " + std::to_string(sharedbank_entry.acctid)); + update_values.push_back(columns[1] + " = " + std::to_string(sharedbank_entry.slotid)); + update_values.push_back(columns[2] + " = " + std::to_string(sharedbank_entry.itemid)); + update_values.push_back(columns[3] + " = " + std::to_string(sharedbank_entry.charges)); + update_values.push_back(columns[4] + " = " + std::to_string(sharedbank_entry.augslot1)); + update_values.push_back(columns[5] + " = " + std::to_string(sharedbank_entry.augslot2)); + update_values.push_back(columns[6] + " = " + std::to_string(sharedbank_entry.augslot3)); + update_values.push_back(columns[7] + " = " + std::to_string(sharedbank_entry.augslot4)); + update_values.push_back(columns[8] + " = " + std::to_string(sharedbank_entry.augslot5)); + update_values.push_back(columns[9] + " = " + std::to_string(sharedbank_entry.augslot6)); + update_values.push_back(columns[10] + " = '" + EscapeString(sharedbank_entry.custom_data) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + sharedbank_entry. + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static Sharedbank InsertOne( + Sharedbank sharedbank_entry + ) + { + std::vector insert_values; + + insert_values.push_back(std::to_string(sharedbank_entry.acctid)); + insert_values.push_back(std::to_string(sharedbank_entry.slotid)); + insert_values.push_back(std::to_string(sharedbank_entry.itemid)); + insert_values.push_back(std::to_string(sharedbank_entry.charges)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot1)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot2)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot3)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot4)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot5)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot6)); + insert_values.push_back("'" + EscapeString(sharedbank_entry.custom_data) + "'"); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + sharedbank_entry.id = results.LastInsertedID(); + return sharedbank_entry; + } + + sharedbank_entry = InstanceListRepository::NewEntity(); + + return sharedbank_entry; + } + + static int InsertMany( + std::vector sharedbank_entries + ) + { + std::vector insert_chunks; + + for (auto &sharedbank_entry: sharedbank_entries) { + std::vector insert_values; + + insert_values.push_back(std::to_string(sharedbank_entry.acctid)); + insert_values.push_back(std::to_string(sharedbank_entry.slotid)); + insert_values.push_back(std::to_string(sharedbank_entry.itemid)); + insert_values.push_back(std::to_string(sharedbank_entry.charges)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot1)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot2)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot3)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot4)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot5)); + insert_values.push_back(std::to_string(sharedbank_entry.augslot6)); + insert_values.push_back("'" + EscapeString(sharedbank_entry.custom_data) + "'"); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + Sharedbank entry{}; + + entry.acctid = atoi(row[0]); + entry.slotid = atoi(row[1]); + entry.itemid = atoi(row[2]); + entry.charges = atoi(row[3]); + entry.augslot1 = atoi(row[4]); + entry.augslot2 = atoi(row[5]); + entry.augslot3 = atoi(row[6]); + entry.augslot4 = atoi(row[7]); + entry.augslot5 = atoi(row[8]); + entry.augslot6 = atoi(row[9]); + entry.custom_data = row[10]; + + all_entries.push_back(entry); + } + + return all_entries; + } + +}; + +#endif //EQEMU_SHAREDBANK_REPOSITORY_H diff --git a/common/repositories/skill_caps_repository.h b/common/repositories/skill_caps_repository.h new file mode 100644 index 000000000..9ecbe24f2 --- /dev/null +++ b/common/repositories/skill_caps_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SKILL_CAPS_REPOSITORY_H +#define EQEMU_SKILL_CAPS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_skill_caps_repository.h" + +class SkillCapsRepository: public BaseSkillCapsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SkillCapsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SkillCapsRepository::GetWhereNeverExpires() + * SkillCapsRepository::GetWhereXAndY() + * SkillCapsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SKILL_CAPS_REPOSITORY_H diff --git a/common/repositories/spawn2_repository.h b/common/repositories/spawn2_repository.h new file mode 100644 index 000000000..fd633c738 --- /dev/null +++ b/common/repositories/spawn2_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPAWN2_REPOSITORY_H +#define EQEMU_SPAWN2_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spawn2_repository.h" + +class Spawn2Repository: public BaseSpawn2Repository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * Spawn2Repository::GetByZoneAndVersion(int zone_id, int zone_version) + * Spawn2Repository::GetWhereNeverExpires() + * Spawn2Repository::GetWhereXAndY() + * Spawn2Repository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPAWN2_REPOSITORY_H diff --git a/common/repositories/spawn_condition_values_repository.h b/common/repositories/spawn_condition_values_repository.h new file mode 100644 index 000000000..96a5a7ee7 --- /dev/null +++ b/common/repositories/spawn_condition_values_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPAWN_CONDITION_VALUES_REPOSITORY_H +#define EQEMU_SPAWN_CONDITION_VALUES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spawn_condition_values_repository.h" + +class SpawnConditionValuesRepository: public BaseSpawnConditionValuesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpawnConditionValuesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpawnConditionValuesRepository::GetWhereNeverExpires() + * SpawnConditionValuesRepository::GetWhereXAndY() + * SpawnConditionValuesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPAWN_CONDITION_VALUES_REPOSITORY_H diff --git a/common/repositories/spawn_conditions_repository.h b/common/repositories/spawn_conditions_repository.h new file mode 100644 index 000000000..3e0197eb0 --- /dev/null +++ b/common/repositories/spawn_conditions_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPAWN_CONDITIONS_REPOSITORY_H +#define EQEMU_SPAWN_CONDITIONS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spawn_conditions_repository.h" + +class SpawnConditionsRepository: public BaseSpawnConditionsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpawnConditionsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpawnConditionsRepository::GetWhereNeverExpires() + * SpawnConditionsRepository::GetWhereXAndY() + * SpawnConditionsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPAWN_CONDITIONS_REPOSITORY_H diff --git a/common/repositories/spawn_events_repository.h b/common/repositories/spawn_events_repository.h new file mode 100644 index 000000000..2df6b981e --- /dev/null +++ b/common/repositories/spawn_events_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPAWN_EVENTS_REPOSITORY_H +#define EQEMU_SPAWN_EVENTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spawn_events_repository.h" + +class SpawnEventsRepository: public BaseSpawnEventsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpawnEventsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpawnEventsRepository::GetWhereNeverExpires() + * SpawnEventsRepository::GetWhereXAndY() + * SpawnEventsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPAWN_EVENTS_REPOSITORY_H diff --git a/common/repositories/spawnentry_repository.h b/common/repositories/spawnentry_repository.h new file mode 100644 index 000000000..67416e61c --- /dev/null +++ b/common/repositories/spawnentry_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPAWNENTRY_REPOSITORY_H +#define EQEMU_SPAWNENTRY_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spawnentry_repository.h" + +class SpawnentryRepository: public BaseSpawnentryRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpawnentryRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpawnentryRepository::GetWhereNeverExpires() + * SpawnentryRepository::GetWhereXAndY() + * SpawnentryRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPAWNENTRY_REPOSITORY_H diff --git a/common/repositories/spawngroup_repository.h b/common/repositories/spawngroup_repository.h index 7c55711b6..b9390b958 100644 --- a/common/repositories/spawngroup_repository.h +++ b/common/repositories/spawngroup_repository.h @@ -17,148 +17,54 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ + #ifndef EQEMU_SPAWNGROUP_REPOSITORY_H #define EQEMU_SPAWNGROUP_REPOSITORY_H #include "../database.h" #include "../string_util.h" +#include "base/base_spawngroup_repository.h" -class SpawnGroupRepository { +class SpawngroupRepository: public BaseSpawngroupRepository { public: - struct SpawnGroup { - int id; - std::string name; - int8 spawn_limit; - int dist; - float max_x; - float min_x; - float max_y; - float min_y; - int delay; - int mindelay; - int despawn; - int despawn_timer; - int wp_spawns; - }; - static std::vector Columns() - { - return { - "id", - "name", - "spawn_limit", - "dist", - "max_x", - "min_x", - "max_y", - "min_y", - "delay", - "mindelay", - "despawn", - "despawn_timer", - "wp_spawns", - }; - } + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpawngroupRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpawngroupRepository::GetWhereNeverExpires() + * SpawngroupRepository::GetWhereXAndY() + * SpawngroupRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ - static std::string ColumnsRaw() - { - return std::string(implode(", ", Columns())); - } - - static std::string TableName() - { - return std::string("spawngroup"); - } - - static std::string BaseSelect() - { - return std::string( - fmt::format( - "SELECT {} FROM {}", - ColumnsRaw(), - TableName() - ) - ); - } - - static SpawnGroup NewEntity() - { - SpawnGroup entry; - - entry.id = 0; - entry.name = ""; - entry.spawn_limit = 0; - entry.dist = 0; - entry.max_x = 0; - entry.min_x = 0; - entry.max_y = 0; - entry.min_y = 0; - entry.delay = 0; - entry.mindelay = 0; - entry.despawn = 0; - entry.despawn_timer = 0; - entry.wp_spawns = 0; - - return entry; - } - - static std::vector GetZoneSpawnGroups( - const std::string &zone_short_name, - int zone_version - ) - { - std::vector spawn_groups; - - auto results = content_db.QueryDatabase( - fmt::format( - SQL ( - {} INNER JOIN spawn2 ON spawn2.spawngroupID = spawngroup.id - WHERE spawn2.zone = '{}' and spawn2.version = {} - ), - BaseSelect(), - zone_short_name, - zone_version - ) - ); - - for (auto row = results.begin(); row != results.end(); ++row) { - SpawnGroup entry{}; - - entry.id = atoi(row[0]); - entry.name = row[1]; - entry.spawn_limit = atoi(row[2]); - entry.dist = atof(row[3]); - entry.max_x = atof(row[4]); - entry.min_x = atof(row[5]); - entry.max_y = atof(row[6]); - entry.min_y = atof(row[7]); - entry.delay = atoi(row[8]); - entry.mindelay = atoi(row[9]); - entry.despawn = atoi(row[10]); - entry.despawn_timer = atoi(row[11]); - entry.wp_spawns = atoi(row[12]); - - spawn_groups.push_back(entry); - } - - return spawn_groups; - } - - static SpawnGroup GetGrid( - const std::vector &spawn_groups, - int spawn_group_id - ) - { - for (auto &row : spawn_groups) { - if (row.id == spawn_group_id) { - return row; - } - } - - return NewEntity(); - } + // Custom extended repository methods here }; - #endif //EQEMU_SPAWNGROUP_REPOSITORY_H diff --git a/common/repositories/spell_buckets_repository.h b/common/repositories/spell_buckets_repository.h new file mode 100644 index 000000000..547ac3a3b --- /dev/null +++ b/common/repositories/spell_buckets_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPELL_BUCKETS_REPOSITORY_H +#define EQEMU_SPELL_BUCKETS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spell_buckets_repository.h" + +class SpellBucketsRepository: public BaseSpellBucketsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpellBucketsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpellBucketsRepository::GetWhereNeverExpires() + * SpellBucketsRepository::GetWhereXAndY() + * SpellBucketsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPELL_BUCKETS_REPOSITORY_H diff --git a/common/repositories/spell_globals_repository.h b/common/repositories/spell_globals_repository.h new file mode 100644 index 000000000..eb6f19587 --- /dev/null +++ b/common/repositories/spell_globals_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPELL_GLOBALS_REPOSITORY_H +#define EQEMU_SPELL_GLOBALS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spell_globals_repository.h" + +class SpellGlobalsRepository: public BaseSpellGlobalsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpellGlobalsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpellGlobalsRepository::GetWhereNeverExpires() + * SpellGlobalsRepository::GetWhereXAndY() + * SpellGlobalsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPELL_GLOBALS_REPOSITORY_H diff --git a/common/repositories/spells_new_repository.h b/common/repositories/spells_new_repository.h new file mode 100644 index 000000000..3da162558 --- /dev/null +++ b/common/repositories/spells_new_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_SPELLS_NEW_REPOSITORY_H +#define EQEMU_SPELLS_NEW_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_spells_new_repository.h" + +class SpellsNewRepository: public BaseSpellsNewRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * SpellsNewRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * SpellsNewRepository::GetWhereNeverExpires() + * SpellsNewRepository::GetWhereXAndY() + * SpellsNewRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_SPELLS_NEW_REPOSITORY_H diff --git a/common/repositories/start_zones_repository.h b/common/repositories/start_zones_repository.h new file mode 100644 index 000000000..fedafb7d9 --- /dev/null +++ b/common/repositories/start_zones_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_START_ZONES_REPOSITORY_H +#define EQEMU_START_ZONES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_start_zones_repository.h" + +class StartZonesRepository: public BaseStartZonesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * StartZonesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * StartZonesRepository::GetWhereNeverExpires() + * StartZonesRepository::GetWhereXAndY() + * StartZonesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_START_ZONES_REPOSITORY_H diff --git a/common/repositories/starting_items_repository.h b/common/repositories/starting_items_repository.h new file mode 100644 index 000000000..2a8d25f45 --- /dev/null +++ b/common/repositories/starting_items_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_STARTING_ITEMS_REPOSITORY_H +#define EQEMU_STARTING_ITEMS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_starting_items_repository.h" + +class StartingItemsRepository: public BaseStartingItemsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * StartingItemsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * StartingItemsRepository::GetWhereNeverExpires() + * StartingItemsRepository::GetWhereXAndY() + * StartingItemsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_STARTING_ITEMS_REPOSITORY_H diff --git a/common/repositories/task_activities_repository.h b/common/repositories/task_activities_repository.h new file mode 100644 index 000000000..b66bb8eee --- /dev/null +++ b/common/repositories/task_activities_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TASK_ACTIVITIES_REPOSITORY_H +#define EQEMU_TASK_ACTIVITIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_task_activities_repository.h" + +class TaskActivitiesRepository: public BaseTaskActivitiesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TaskActivitiesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TaskActivitiesRepository::GetWhereNeverExpires() + * TaskActivitiesRepository::GetWhereXAndY() + * TaskActivitiesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TASK_ACTIVITIES_REPOSITORY_H diff --git a/common/repositories/tasks_repository.h b/common/repositories/tasks_repository.h new file mode 100644 index 000000000..1e91ca9f6 --- /dev/null +++ b/common/repositories/tasks_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TASKS_REPOSITORY_H +#define EQEMU_TASKS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_tasks_repository.h" + +class TasksRepository: public BaseTasksRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TasksRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TasksRepository::GetWhereNeverExpires() + * TasksRepository::GetWhereXAndY() + * TasksRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TASKS_REPOSITORY_H diff --git a/common/repositories/tasksets_repository.h b/common/repositories/tasksets_repository.h new file mode 100644 index 000000000..a98364993 --- /dev/null +++ b/common/repositories/tasksets_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TASKSETS_REPOSITORY_H +#define EQEMU_TASKSETS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_tasksets_repository.h" + +class TasksetsRepository: public BaseTasksetsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TasksetsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TasksetsRepository::GetWhereNeverExpires() + * TasksetsRepository::GetWhereXAndY() + * TasksetsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TASKSETS_REPOSITORY_H diff --git a/common/repositories/template/base_repository.template b/common/repositories/template/base_repository.template new file mode 100644 index 000000000..8b1695049 --- /dev/null +++ b/common/repositories/template/base_repository.template @@ -0,0 +1,283 @@ +/** + * DO NOT MODIFY THIS FILE + * + * This repository was automatically generated and is NOT to be modified directly. + * Any repository modifications are meant to be made to the repository extending the base. + * Any modifications to base repositories are to be made by the generator only + * + * @generator ./utils/scripts/generators/repository-generator.pl + * @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories + */ + +#ifndef EQEMU_BASE_{{TABLE_NAME_UPPER}}_REPOSITORY_H +#define EQEMU_BASE_{{TABLE_NAME_UPPER}}_REPOSITORY_H + +#include "../../database.h" +#include "../../string_util.h" + +class Base{{TABLE_NAME_CLASS}}Repository { +public: + struct {{TABLE_NAME_STRUCT}} { +{{TABLE_STRUCT_COLUMNS}} + }; + + static std::string PrimaryKey() + { + return std::string("{{PRIMARY_KEY_STRING}}"); + } + + static std::vector Columns() + { + return { +{{COLUMNS_LIST_QUOTED}} + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string TableName() + { + return std::string("{{TABLE_NAME_VAR}}"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + ColumnsRaw() + ); + } + + static {{TABLE_NAME_STRUCT}} NewEntity() + { + {{TABLE_NAME_STRUCT}} entry{}; + +{{DEFAULT_ENTRIES}} + + return entry; + } + + static {{TABLE_NAME_STRUCT}} Get{{TABLE_NAME_STRUCT}}Entry( + const std::vector<{{TABLE_NAME_STRUCT}}> &{{TABLE_NAME_VAR}}s, + int {{TABLE_NAME_VAR}}_id + ) + { + for (auto &{{TABLE_NAME_VAR}} : {{TABLE_NAME_VAR}}s) { + if ({{TABLE_NAME_VAR}}.{{PRIMARY_KEY_STRING}} == {{TABLE_NAME_VAR}}_id) { + return {{TABLE_NAME_VAR}}; + } + } + + return NewEntity(); + } + + static {{TABLE_NAME_STRUCT}} FindOne( + Database& db, + int {{TABLE_NAME_VAR}}_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + {{TABLE_NAME_VAR}}_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + {{TABLE_NAME_STRUCT}} entry{}; + +{{FIND_ONE_ENTRIES}} + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + Database& db, + int {{TABLE_NAME_VAR}}_id + ) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + {{TABLE_NAME_VAR}}_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + Database& db, + {{TABLE_NAME_STRUCT}} {{TABLE_NAME_VAR}}_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + +{{UPDATE_ONE_ENTRIES}} + + auto results = db.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + {{TABLE_NAME_VAR}}_entry.{{PRIMARY_KEY_STRING}} + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static {{TABLE_NAME_STRUCT}} InsertOne( + Database& db, + {{TABLE_NAME_STRUCT}} {{TABLE_NAME_VAR}}_entry + ) + { + std::vector insert_values; + +{{INSERT_ONE_ENTRIES}} + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + {{TABLE_NAME_VAR}}_entry.{{PRIMARY_KEY_STRING}} = results.LastInsertedID(); + return {{TABLE_NAME_VAR}}_entry; + } + + {{TABLE_NAME_VAR}}_entry = NewEntity(); + + return {{TABLE_NAME_VAR}}_entry; + } + + static int InsertMany( + Database& db, + std::vector<{{TABLE_NAME_STRUCT}}> {{TABLE_NAME_VAR}}_entries + ) + { + std::vector insert_chunks; + + for (auto &{{TABLE_NAME_VAR}}_entry: {{TABLE_NAME_VAR}}_entries) { + std::vector insert_values; + +{{INSERT_MANY_ENTRIES}} + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = db.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector<{{TABLE_NAME_STRUCT}}> All(Database& db) + { + std::vector<{{TABLE_NAME_STRUCT}}> all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + {{TABLE_NAME_STRUCT}} entry{}; + +{{ALL_ENTRIES}} + + all_entries.push_back(entry); + } + + return all_entries; + } + + static std::vector<{{TABLE_NAME_STRUCT}}> GetWhere(Database& db, std::string where_filter) + { + std::vector<{{TABLE_NAME_STRUCT}}> all_entries; + + auto results = db.QueryDatabase( + fmt::format( + "{} WHERE {}", + BaseSelect(), + where_filter + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + {{TABLE_NAME_STRUCT}} entry{}; + +{{ALL_ENTRIES}} + + all_entries.push_back(entry); + } + + return all_entries; + } + + static int DeleteWhere(Database& db, std::string where_filter) + { + auto results = db.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {}", + TableName(), + where_filter + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int Truncate(Database& db) + { + auto results = db.QueryDatabase( + fmt::format( + "TRUNCATE TABLE {}", + TableName() + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + +}; + +#endif //EQEMU_BASE_{{TABLE_NAME_UPPER}}_REPOSITORY_H diff --git a/common/repositories/template/repository.template b/common/repositories/template/repository.template new file mode 100644 index 000000000..00d5b6db3 --- /dev/null +++ b/common/repositories/template/repository.template @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_{{TABLE_NAME_UPPER}}_REPOSITORY_H +#define EQEMU_{{TABLE_NAME_UPPER}}_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_{{TABLE_NAME_VAR}}_repository.h" + +class {{TABLE_NAME_CLASS}}Repository: public Base{{TABLE_NAME_CLASS}}Repository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * {{TABLE_NAME_CLASS}}Repository::GetByZoneAndVersion(int zone_id, int zone_version) + * {{TABLE_NAME_CLASS}}Repository::GetWhereNeverExpires() + * {{TABLE_NAME_CLASS}}Repository::GetWhereXAndY() + * {{TABLE_NAME_CLASS}}Repository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_{{TABLE_NAME_UPPER}}_REPOSITORY_H diff --git a/common/repositories/timers_repository.h b/common/repositories/timers_repository.h new file mode 100644 index 000000000..dcd867210 --- /dev/null +++ b/common/repositories/timers_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TIMERS_REPOSITORY_H +#define EQEMU_TIMERS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_timers_repository.h" + +class TimersRepository: public BaseTimersRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TimersRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TimersRepository::GetWhereNeverExpires() + * TimersRepository::GetWhereXAndY() + * TimersRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TIMERS_REPOSITORY_H diff --git a/common/repositories/titles_repository.h b/common/repositories/titles_repository.h new file mode 100644 index 000000000..32b9fd5e3 --- /dev/null +++ b/common/repositories/titles_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TITLES_REPOSITORY_H +#define EQEMU_TITLES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_titles_repository.h" + +class TitlesRepository: public BaseTitlesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TitlesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TitlesRepository::GetWhereNeverExpires() + * TitlesRepository::GetWhereXAndY() + * TitlesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TITLES_REPOSITORY_H diff --git a/common/repositories/trader_audit_repository.h b/common/repositories/trader_audit_repository.h new file mode 100644 index 000000000..e7be6f677 --- /dev/null +++ b/common/repositories/trader_audit_repository.h @@ -0,0 +1,301 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TRADER_AUDIT_REPOSITORY_H +#define EQEMU_TRADER_AUDIT_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" + +class TraderAuditRepository { +public: + struct TraderAudit { + std::string time; + std::string seller; + std::string buyer; + std::string itemname; + int quantity; + int totalcost; + int8 trantype; + }; + + static std::string PrimaryKey() + { + return std::string(""); + } + + static std::vector Columns() + { + return { + "time", + "seller", + "buyer", + "itemname", + "quantity", + "totalcost", + "trantype", + }; + } + + static std::string ColumnsRaw() + { + return std::string(implode(", ", Columns())); + } + + static std::string InsertColumnsRaw() + { + std::vector insert_columns; + + for (auto &column : Columns()) { + if (column == PrimaryKey()) { + continue; + } + + insert_columns.push_back(column); + } + + return std::string(implode(", ", insert_columns)); + } + + static std::string TableName() + { + return std::string("trader_audit"); + } + + static std::string BaseSelect() + { + return fmt::format( + "SELECT {} FROM {}", + ColumnsRaw(), + TableName() + ); + } + + static std::string BaseInsert() + { + return fmt::format( + "INSERT INTO {} ({}) ", + TableName(), + InsertColumnsRaw() + ); + } + + static TraderAudit NewEntity() + { + TraderAudit entry{}; + + entry.time = '0000-00-00 00:00:00'; + entry.seller = ""; + entry.buyer = ""; + entry.itemname = ""; + entry.quantity = 0; + entry.totalcost = 0; + entry.trantype = 0; + + return entry; + } + + static TraderAudit GetTraderAuditEntry( + const std::vector &trader_audits, + int trader_audit_id + ) + { + for (auto &trader_audit : trader_audits) { + if (trader_audit. == trader_audit_id) { + return trader_audit; + } + } + + return NewEntity(); + } + + static TraderAudit FindOne( + int trader_audit_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "{} WHERE id = {} LIMIT 1", + BaseSelect(), + trader_audit_id + ) + ); + + auto row = results.begin(); + if (results.RowCount() == 1) { + TraderAudit entry{}; + + entry.time = row[0]; + entry.seller = row[1]; + entry.buyer = row[2]; + entry.itemname = row[3]; + entry.quantity = atoi(row[4]); + entry.totalcost = atoi(row[5]); + entry.trantype = atoi(row[6]); + + return entry; + } + + return NewEntity(); + } + + static int DeleteOne( + int trader_audit_id + ) + { + auto results = database.QueryDatabase( + fmt::format( + "DELETE FROM {} WHERE {} = {}", + TableName(), + PrimaryKey(), + trader_audit_id + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static int UpdateOne( + TraderAudit trader_audit_entry + ) + { + std::vector update_values; + + auto columns = Columns(); + + update_values.push_back(columns[0] + " = '" + EscapeString(trader_audit_entry.time) + "'"); + update_values.push_back(columns[1] + " = '" + EscapeString(trader_audit_entry.seller) + "'"); + update_values.push_back(columns[2] + " = '" + EscapeString(trader_audit_entry.buyer) + "'"); + update_values.push_back(columns[3] + " = '" + EscapeString(trader_audit_entry.itemname) + "'"); + update_values.push_back(columns[4] + " = " + std::to_string(trader_audit_entry.quantity)); + update_values.push_back(columns[5] + " = " + std::to_string(trader_audit_entry.totalcost)); + update_values.push_back(columns[6] + " = " + std::to_string(trader_audit_entry.trantype)); + + auto results = database.QueryDatabase( + fmt::format( + "UPDATE {} SET {} WHERE {} = {}", + TableName(), + implode(", ", update_values), + PrimaryKey(), + trader_audit_entry. + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static TraderAudit InsertOne( + TraderAudit trader_audit_entry + ) + { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(trader_audit_entry.time) + "'"); + insert_values.push_back("'" + EscapeString(trader_audit_entry.seller) + "'"); + insert_values.push_back("'" + EscapeString(trader_audit_entry.buyer) + "'"); + insert_values.push_back("'" + EscapeString(trader_audit_entry.itemname) + "'"); + insert_values.push_back(std::to_string(trader_audit_entry.quantity)); + insert_values.push_back(std::to_string(trader_audit_entry.totalcost)); + insert_values.push_back(std::to_string(trader_audit_entry.trantype)); + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES ({})", + BaseInsert(), + implode(",", insert_values) + ) + ); + + if (results.Success()) { + trader_audit_entry.id = results.LastInsertedID(); + return trader_audit_entry; + } + + trader_audit_entry = InstanceListRepository::NewEntity(); + + return trader_audit_entry; + } + + static int InsertMany( + std::vector trader_audit_entries + ) + { + std::vector insert_chunks; + + for (auto &trader_audit_entry: trader_audit_entries) { + std::vector insert_values; + + insert_values.push_back("'" + EscapeString(trader_audit_entry.time) + "'"); + insert_values.push_back("'" + EscapeString(trader_audit_entry.seller) + "'"); + insert_values.push_back("'" + EscapeString(trader_audit_entry.buyer) + "'"); + insert_values.push_back("'" + EscapeString(trader_audit_entry.itemname) + "'"); + insert_values.push_back(std::to_string(trader_audit_entry.quantity)); + insert_values.push_back(std::to_string(trader_audit_entry.totalcost)); + insert_values.push_back(std::to_string(trader_audit_entry.trantype)); + + insert_chunks.push_back("(" + implode(",", insert_values) + ")"); + } + + std::vector insert_values; + + auto results = database.QueryDatabase( + fmt::format( + "{} VALUES {}", + BaseInsert(), + implode(",", insert_chunks) + ) + ); + + return (results.Success() ? results.RowsAffected() : 0); + } + + static std::vector All() + { + std::vector all_entries; + + auto results = database.QueryDatabase( + fmt::format( + "{}", + BaseSelect() + ) + ); + + all_entries.reserve(results.RowCount()); + + for (auto row = results.begin(); row != results.end(); ++row) { + TraderAudit entry{}; + + entry.time = row[0]; + entry.seller = row[1]; + entry.buyer = row[2]; + entry.itemname = row[3]; + entry.quantity = atoi(row[4]); + entry.totalcost = atoi(row[5]); + entry.trantype = atoi(row[6]); + + all_entries.push_back(entry); + } + + return all_entries; + } + +}; + +#endif //EQEMU_TRADER_AUDIT_REPOSITORY_H diff --git a/common/repositories/trader_repository.h b/common/repositories/trader_repository.h new file mode 100644 index 000000000..50cf496f5 --- /dev/null +++ b/common/repositories/trader_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TRADER_REPOSITORY_H +#define EQEMU_TRADER_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_trader_repository.h" + +class TraderRepository: public BaseTraderRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TraderRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TraderRepository::GetWhereNeverExpires() + * TraderRepository::GetWhereXAndY() + * TraderRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TRADER_REPOSITORY_H diff --git a/common/repositories/tradeskill_recipe_entries_repository.h b/common/repositories/tradeskill_recipe_entries_repository.h new file mode 100644 index 000000000..5a2f3b1ea --- /dev/null +++ b/common/repositories/tradeskill_recipe_entries_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TRADESKILL_RECIPE_ENTRIES_REPOSITORY_H +#define EQEMU_TRADESKILL_RECIPE_ENTRIES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_tradeskill_recipe_entries_repository.h" + +class TradeskillRecipeEntriesRepository: public BaseTradeskillRecipeEntriesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TradeskillRecipeEntriesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TradeskillRecipeEntriesRepository::GetWhereNeverExpires() + * TradeskillRecipeEntriesRepository::GetWhereXAndY() + * TradeskillRecipeEntriesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TRADESKILL_RECIPE_ENTRIES_REPOSITORY_H diff --git a/common/repositories/tradeskill_recipe_repository.h b/common/repositories/tradeskill_recipe_repository.h index 15ee26ce3..2f94d586f 100644 --- a/common/repositories/tradeskill_recipe_repository.h +++ b/common/repositories/tradeskill_recipe_repository.h @@ -23,112 +23,48 @@ #include "../database.h" #include "../string_util.h" +#include "base/base_tradeskill_recipe_repository.h" -class TradeskillRecipeRepository { +class TradeskillRecipeRepository: public BaseTradeskillRecipeRepository { public: - struct TradeskillRecipe { - int id; - std::string name; - int tradeskill; - int skillneeded; - int trivial; - uint8 nofail; - int replace_container; - std::string notes; - uint8 must_learn; - uint8 quest; - uint8 enabled; - }; - static std::vector Columns() - { - return { - "id", - "name", - "tradeskill", - "skillneeded", - "trivial", - "nofail", - "replace_container", - "notes", - "must_learn", - "quest", - "enabled", - }; - } + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TradeskillRecipeRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TradeskillRecipeRepository::GetWhereNeverExpires() + * TradeskillRecipeRepository::GetWhereXAndY() + * TradeskillRecipeRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ - static std::string ColumnsRaw() - { - return std::string(implode(", ", Columns())); - } - - static std::string TableName() - { - return std::string("tradeskill_recipe"); - } - - static std::string BaseSelect() - { - return std::string( - fmt::format( - "SELECT {} FROM {}", - ColumnsRaw(), - TableName() - ) - ); - } - - static TradeskillRecipe NewEntity() - { - TradeskillRecipe entry; - - entry.id = 0; - entry.name = ""; - entry.tradeskill = 0; - entry.skillneeded = 0; - entry.trivial = 0; - entry.nofail = 0; - entry.replace_container = 0; - entry.notes = ""; - entry.must_learn = 0; - entry.quest = 0; - entry.enabled = 0; - - return entry; - } - - static TradeskillRecipe GetRecipe(int recipe_id) - { - auto results = content_db.QueryDatabase( - fmt::format( - "{} WHERE id = {}", - BaseSelect(), - recipe_id - ) - ); - - TradeskillRecipe tradeskill_recipe = NewEntity(); - - auto row = results.begin(); - if (results.RowCount() == 0) { - return tradeskill_recipe; - } - - tradeskill_recipe.id = atoi(row[0]); - tradeskill_recipe.name = (row[1] ? row[1] : ""); - tradeskill_recipe.tradeskill = atoi(row[2]); - tradeskill_recipe.skillneeded = atoi(row[3]); - tradeskill_recipe.trivial = atoi(row[4]); - tradeskill_recipe.nofail = atoi(row[5]); - tradeskill_recipe.replace_container = atoi(row[6]); - tradeskill_recipe.notes = (row[7] ? row[7] : ""); - tradeskill_recipe.must_learn = atoi(row[8]); - tradeskill_recipe.quest = atoi(row[9]); - tradeskill_recipe.enabled = atoi(row[10]); - - return tradeskill_recipe; - } + // Custom extended repository methods here }; -#endif +#endif //EQEMU_TRADESKILL_RECIPE_REPOSITORY_H diff --git a/common/repositories/traps_repository.h b/common/repositories/traps_repository.h new file mode 100644 index 000000000..76d1e217b --- /dev/null +++ b/common/repositories/traps_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TRAPS_REPOSITORY_H +#define EQEMU_TRAPS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_traps_repository.h" + +class TrapsRepository: public BaseTrapsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TrapsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TrapsRepository::GetWhereNeverExpires() + * TrapsRepository::GetWhereXAndY() + * TrapsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TRAPS_REPOSITORY_H diff --git a/common/repositories/tribute_levels_repository.h b/common/repositories/tribute_levels_repository.h new file mode 100644 index 000000000..04391798d --- /dev/null +++ b/common/repositories/tribute_levels_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TRIBUTE_LEVELS_REPOSITORY_H +#define EQEMU_TRIBUTE_LEVELS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_tribute_levels_repository.h" + +class TributeLevelsRepository: public BaseTributeLevelsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TributeLevelsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TributeLevelsRepository::GetWhereNeverExpires() + * TributeLevelsRepository::GetWhereXAndY() + * TributeLevelsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TRIBUTE_LEVELS_REPOSITORY_H diff --git a/common/repositories/tributes_repository.h b/common/repositories/tributes_repository.h new file mode 100644 index 000000000..860588524 --- /dev/null +++ b/common/repositories/tributes_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_TRIBUTES_REPOSITORY_H +#define EQEMU_TRIBUTES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_tributes_repository.h" + +class TributesRepository: public BaseTributesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * TributesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * TributesRepository::GetWhereNeverExpires() + * TributesRepository::GetWhereXAndY() + * TributesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_TRIBUTES_REPOSITORY_H diff --git a/common/repositories/variables_repository.h b/common/repositories/variables_repository.h new file mode 100644 index 000000000..6e07e1bb2 --- /dev/null +++ b/common/repositories/variables_repository.h @@ -0,0 +1,68 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_VARIABLES_REPOSITORY_H +#define EQEMU_VARIABLES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_variables_repository.h" + +class VariablesRepository: public BaseVariablesRepository { +public: + + /** + * This file was auto generated on Apr 5, 2020 and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators + * + * Base Methods (Subject to be expanded upon in time) + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * VariablesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * VariablesRepository::GetWhereNeverExpires() + * VariablesRepository::GetWhereXAndY() + * VariablesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_VARIABLES_REPOSITORY_H diff --git a/common/repositories/veteran_reward_templates_repository.h b/common/repositories/veteran_reward_templates_repository.h new file mode 100644 index 000000000..3e9ad2745 --- /dev/null +++ b/common/repositories/veteran_reward_templates_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_VETERAN_REWARD_TEMPLATES_REPOSITORY_H +#define EQEMU_VETERAN_REWARD_TEMPLATES_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_veteran_reward_templates_repository.h" + +class VeteranRewardTemplatesRepository: public BaseVeteranRewardTemplatesRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * VeteranRewardTemplatesRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * VeteranRewardTemplatesRepository::GetWhereNeverExpires() + * VeteranRewardTemplatesRepository::GetWhereXAndY() + * VeteranRewardTemplatesRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_VETERAN_REWARD_TEMPLATES_REPOSITORY_H diff --git a/common/repositories/zone_points_repository.h b/common/repositories/zone_points_repository.h new file mode 100644 index 000000000..a4f885fc6 --- /dev/null +++ b/common/repositories/zone_points_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ZONE_POINTS_REPOSITORY_H +#define EQEMU_ZONE_POINTS_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_zone_points_repository.h" + +class ZonePointsRepository: public BaseZonePointsRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ZonePointsRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ZonePointsRepository::GetWhereNeverExpires() + * ZonePointsRepository::GetWhereXAndY() + * ZonePointsRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ZONE_POINTS_REPOSITORY_H diff --git a/common/repositories/zone_repository.h b/common/repositories/zone_repository.h new file mode 100644 index 000000000..41115ef44 --- /dev/null +++ b/common/repositories/zone_repository.h @@ -0,0 +1,70 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ZONE_REPOSITORY_H +#define EQEMU_ZONE_REPOSITORY_H + +#include "../database.h" +#include "../string_util.h" +#include "base/base_zone_repository.h" + +class ZoneRepository: public BaseZoneRepository { +public: + + /** + * This file was auto generated and can be modified and extended upon + * + * Base repository methods are automatically + * generated in the "base" version of this repository. The base repository + * is immutable and to be left untouched, while methods in this class + * are used as extension methods for more specific persistence-layer + * accessors or mutators. + * + * Base Methods (Subject to be expanded upon in time) + * + * Note: Not all tables are designed appropriately to fit functionality with all base methods + * + * InsertOne + * UpdateOne + * DeleteOne + * FindOne + * GetWhere(std::string where_filter) + * DeleteWhere(std::string where_filter) + * InsertMany + * All + * + * Example custom methods in a repository + * + * ZoneRepository::GetByZoneAndVersion(int zone_id, int zone_version) + * ZoneRepository::GetWhereNeverExpires() + * ZoneRepository::GetWhereXAndY() + * ZoneRepository::DeleteWhereXAndY() + * + * Most of the above could be covered by base methods, but if you as a developer + * find yourself re-using logic for other parts of the code, its best to just make a + * method that can be re-used easily elsewhere especially if it can use a base repository + * method and encapsulate filters there + */ + + // Custom extended repository methods here + +}; + +#endif //EQEMU_ZONE_REPOSITORY_H diff --git a/common/rulesys.cpp b/common/rulesys.cpp index fed83d097..4c6063042 100644 --- a/common/rulesys.cpp +++ b/common/rulesys.cpp @@ -274,7 +274,7 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name, bool r Log(Logs::Detail, Logs::Rules, "Processing rule set '%s' (%d) load...", default_ruleset_name.c_str(), default_ruleset_id); std::string query = StringFormat( - "SELECT `rule_name`, `rule_value` FROM `rule_values` WHERE `ruleset_id` = '%d'", + "SELECT `rule_name`, `rule_value` FROM `rule_values` WHERE `ruleset_id` = %d", default_ruleset_id ); @@ -292,7 +292,7 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name, bool r Log(Logs::Detail, Logs::Rules, "Processing rule set '%s' (%d) load...", ruleset_name, ruleset_id); - std::string query = StringFormat("SELECT `rule_name`, `rule_value` FROM `rule_values` WHERE `ruleset_id` = '%d'", ruleset_id); + std::string query = StringFormat("SELECT `rule_name`, `rule_value` FROM `rule_values` WHERE `ruleset_id` = %d", ruleset_id); auto results = database->QueryDatabase(query); if (!results.Success()) { diff --git a/common/ruletypes.h b/common/ruletypes.h index f1d00529f..5a30bfc2c 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -36,275 +36,258 @@ RULE_CATEGORY(Character) -RULE_INT(Character, MaxLevel, 65, "") -RULE_BOOL(Character, PerCharacterQglobalMaxLevel, false, "This will check for qglobal 'CharMaxLevel' character qglobal (Type 5, \"\"), if player tries to level beyond that point, it will not go beyond that level") -RULE_BOOL(Character, PerCharacterBucketMaxLevel, false, "This will check for data bucket 'CharMaxLevel', if player tries to level beyond that point, it will not go beyond that level") -RULE_INT(Character, MaxExpLevel, 0, "Sets the Max Level attainable via Experience") -RULE_INT(Character, DeathExpLossLevel, 10, "Any level greater than this will lose exp on death") -RULE_INT(Character, DeathExpLossMaxLevel, 255, "Any level greater than this will no longer lose exp on death") -RULE_INT(Character, DeathItemLossLevel, 10, "") -RULE_INT(Character, DeathExpLossMultiplier, 3, "Adjust how much exp is lost") -RULE_BOOL(Character, UseDeathExpLossMult, false, "Adjust to use the above multiplier or to use code default") -RULE_BOOL(Character, UseOldRaceRezEffects, false, "older clients had ID 757 for races with high starting STR, but it doesn't seem used anymore") -RULE_INT(Character, CorpseDecayTimeMS, 10800000, "") -RULE_INT(Character, CorpseResTimeMS, 10800000, "time before cant res corpse(3 hours)") -RULE_BOOL(Character, LeaveCorpses, true, "") -RULE_BOOL(Character, LeaveNakedCorpses, false, "") -RULE_INT(Character, MaxDraggedCorpses, 2, "") -RULE_REAL(Character, DragCorpseDistance, 400, "If the corpse is <= this distance from the player, it won't move") -RULE_REAL(Character, ExpMultiplier, 0.5, "") -RULE_REAL(Character, AAExpMultiplier, 0.5, "") -RULE_REAL(Character, GroupExpMultiplier, 0.5, "") -RULE_REAL(Character, RaidExpMultiplier, 0.2, "") -RULE_BOOL(Character, UseXPConScaling, true, "") -RULE_INT(Character, ShowExpValues, 0, "0 - normal, 1 - Show raw experience values, 2 - Show raw experience values AND percent") -RULE_INT(Character, GreenModifier, 20, "") -RULE_INT(Character, LightBlueModifier, 40, "") -RULE_INT(Character, BlueModifier, 90, "") -RULE_INT(Character, WhiteModifier, 100, "") -RULE_INT(Character, YellowModifier, 125, "") -RULE_INT(Character, RedModifier, 150, "") -RULE_INT(Character, AutosaveIntervalS, 300, "0 = disabled") -RULE_INT(Character, HPRegenMultiplier, 100, "") -RULE_INT(Character, ManaRegenMultiplier, 100, "") -RULE_INT(Character, EnduranceRegenMultiplier, 100, "") -RULE_BOOL(Character, OldMinMana, false, "this is used for servers that want to follow older skill cap formulas so they can still have some regen w/o mediate") -RULE_INT(Character, ConsumptionMultiplier, 100, "item's hunger restored = this value * item's food level, 100 = normal, 50 = people eat 2x as fast, 200 = people eat 2x as slow") -RULE_BOOL(Character, HealOnLevel, false, "") -RULE_BOOL(Character, FeignKillsPet, false, "") -RULE_INT(Character, ItemManaRegenCap, 15, "") -RULE_INT(Character, ItemHealthRegenCap, 30, "") -RULE_INT(Character, ItemDamageShieldCap, 30, "") -RULE_INT(Character, ItemAccuracyCap, 150, "") -RULE_INT(Character, ItemAvoidanceCap, 100, "") -RULE_INT(Character, ItemCombatEffectsCap, 100, "") -RULE_INT(Character, ItemShieldingCap, 35, "") -RULE_INT(Character, ItemSpellShieldingCap, 35, "") -RULE_INT(Character, ItemDoTShieldingCap, 35, "") -RULE_INT(Character, ItemStunResistCap, 35, "") -RULE_INT(Character, ItemStrikethroughCap, 35, "") -RULE_INT(Character, ItemATKCap, 250, "") -RULE_INT(Character, ItemHealAmtCap, 250, "") -RULE_INT(Character, ItemSpellDmgCap, 250, "") -RULE_INT(Character, ItemClairvoyanceCap, 250, "") -RULE_INT(Character, ItemDSMitigationCap, 50, "") -RULE_INT(Character, ItemEnduranceRegenCap, 15, "") -RULE_INT(Character, ItemExtraDmgCap, 150, "Cap for bonuses to melee skills like Bash, Frenzy, etc") -RULE_INT(Character, HasteCap, 100, "Haste cap for non-v3(overhaste) haste") -RULE_INT(Character, SkillUpModifier, 100, "skill ups are at 100%") -RULE_BOOL(Character, SharedBankPlat, false, "off by default to prevent duping for now") -RULE_BOOL(Character, BindAnywhere, false, "") -RULE_BOOL(Character, RestRegenEnabled, true, "Enable OOC Regen") +RULE_INT(Character, MaxLevel, 65, "Sets the highest level for players that can be reached through experience") +RULE_BOOL(Character, PerCharacterQglobalMaxLevel, false, "Check for qglobal 'CharMaxLevel' character qglobal (Type 5, \"\"), if player tries to level beyond that point, it will not go beyond that level") +RULE_BOOL(Character, PerCharacterBucketMaxLevel, false, "Check for data bucket 'CharMaxLevel', if player tries to level beyond that point, it will not go beyond that level") +RULE_INT(Character, MaxExpLevel, 0, "Defines the maximum level that can be reached through experience") +RULE_INT(Character, DeathExpLossLevel, 10, "Any level equal to or greater than this will lose experience at death") +RULE_INT(Character, DeathExpLossMaxLevel, 255, "Every higher level will no longer lose experience at death") +RULE_INT(Character, DeathItemLossLevel, 10, "From this level on, items are left in the corpse when LeaveCorpses is activated") +RULE_INT(Character, DeathExpLossMultiplier, 3, "Adjust how much experience is lost. Default 3.5% (0=0.5%, 1=1.5%, 2=2.5%, 3=3.5%, 4=4.5%, 5=5.5%, 6=6.5%, 7=7.5%, 8=8.5%, 9=9.5%, 10=11%)") +RULE_BOOL(Character, UseDeathExpLossMult, false, "Setting to control whether DeathExpLossMultiplier or the code default is used: (Level x Level / 18.0) x 12000") +RULE_BOOL(Character, UseOldRaceRezEffects, false, "Older clients had ID 757 for races with high starting STR, but it doesn't seem used anymore") +RULE_INT(Character, CorpseDecayTimeMS, 10800000, "Time after which the corpse decays (milliseconds)") +RULE_INT(Character, CorpseResTimeMS, 10800000, "Time after which the corpse can no longer be resurrected (milliseconds)") +RULE_BOOL(Character, LeaveCorpses, true, "Setting whether you leave a corpse behind") +RULE_BOOL(Character, LeaveNakedCorpses, false, "Setting whether you leave a corpse without items") +RULE_INT(Character, MaxDraggedCorpses, 2, "Maximum number of corpses you can drag at once") +RULE_REAL(Character, DragCorpseDistance, 400, "If a player is using /corpsedrag and moving, the corpse will not move until the player exceeds this distance") +RULE_REAL(Character, FinalExpMultiplier, 1, "Added on top of everything else, easy for setting EXP events") +RULE_REAL(Character, ExpMultiplier, 0.5, "If greater than 0, the experience gained is multiplied by this value. ") +RULE_REAL(Character, AAExpMultiplier, 0.5, "If greater than 0, the AA experience gained is multiplied by this value. ") +RULE_REAL(Character, GroupExpMultiplier, 0.5, "The experience in a group is multiplied by this value in addition to the group multiplier. The group multiplier is: 2 members=x 1.2, 3=x1.4, 4=x1.6, 5=x1.8, 6=x2.16") +RULE_REAL(Character, RaidExpMultiplier, 0.2, "The experience gained in raids is multiplied by (1-RaidExpMultiplier) ") +RULE_BOOL(Character, UseXPConScaling, true, "When activated, the experience is modified depending on the difference between player level and NPC level. The values from the rules GreenModifier to RedModifier are used") +RULE_INT(Character, ShowExpValues, 0, "Show experience values. 0=normal, 1=show raw experience values, 2=show raw experience values and percent") +RULE_INT(Character, GreenModifier, 20, "The experience obtained for green con mobs is multiplied by value/100") +RULE_INT(Character, LightBlueModifier, 40, "The experience obtained for light-blue con mobs is multiplied by value/100") +RULE_INT(Character, BlueModifier, 90, "The experience obtained for blue con mobs is multiplied by value/100") +RULE_INT(Character, WhiteModifier, 100, "The experience obtained for white con mobs is multiplied by value/100") +RULE_INT(Character, YellowModifier, 125, "The experience obtained for yellow con mobs is multiplied by value/100") +RULE_INT(Character, RedModifier, 150, "The experience obtained for red con mobs is multiplied by value/100") +RULE_INT(Character, AutosaveIntervalS, 300, "Number of seconds after which a timer is triggered which stores the character data. The value 0 means no periodic automatic saving.") +RULE_INT(Character, HPRegenMultiplier, 100, "The hitpoint regeneration is multiplied by value/100 (up to the caps)") +RULE_INT(Character, ManaRegenMultiplier, 100, "The mana regeneration is multiplied by value/100 (up to the caps)") +RULE_INT(Character, EnduranceRegenMultiplier, 100, "The endurance regeneration is multiplied by value/100 (up to the caps)") +RULE_BOOL(Character, OldMinMana, false, "This is used for servers that want to follow older skill cap formulas so they can still have some regen w/o mediate") +RULE_BOOL(Character, HealOnLevel, false, "Setting whether a player should heal completely when leveling") +RULE_BOOL(Character, FeignKillsPet, false, "Setting whether Feign Death kills the player pet") +RULE_INT(Character, ItemManaRegenCap, 15, "Limit on mana regeneration granted by items") +RULE_INT(Character, ItemHealthRegenCap, 30, "Limit on health regeneration granted by items") +RULE_INT(Character, ItemDamageShieldCap, 30, "Limit on damage shields granted by items") +RULE_INT(Character, ItemAccuracyCap, 150, "Limit on accuracy granted by items") +RULE_INT(Character, ItemAvoidanceCap, 100, "Limit on avoidance granted by items") +RULE_INT(Character, ItemCombatEffectsCap, 100, "Limit on combat effects granted by items") +RULE_INT(Character, ItemShieldingCap, 35, "Limit on shielding granted by items") +RULE_INT(Character, ItemSpellShieldingCap, 35, "Limit on spell shielding granted by items") +RULE_INT(Character, ItemDoTShieldingCap, 35, "Limit on DoT shielding granted by items") +RULE_INT(Character, ItemStunResistCap, 35, "Limit on resistance granted by items") +RULE_INT(Character, ItemStrikethroughCap, 35, "Limit on strikethrough granted by items") +RULE_INT(Character, ItemATKCap, 250, "Limit on ATK granted by items") +RULE_INT(Character, ItemHealAmtCap, 250, "Limit on heal amount granted by items") +RULE_INT(Character, ItemSpellDmgCap, 250, "Limit on spell damage granted by items") +RULE_INT(Character, ItemClairvoyanceCap, 250, "Limit on clairvoyance granted by items") +RULE_INT(Character, ItemDSMitigationCap, 50, "Limit on damageshield mitigation granted by items") +RULE_INT(Character, ItemEnduranceRegenCap, 15, "Limit on endurance regeneration granted by items") +RULE_INT(Character, ItemExtraDmgCap, 150, "Cap for bonuses to melee skills like Bash, Frenzy, etc.") +RULE_INT(Character, HasteCap, 100, "Haste cap for non-v3(over haste) haste") +RULE_INT(Character, SkillUpModifier, 100, "The probability for a skill-up is multiplied by value/100") +RULE_BOOL(Character, SharedBankPlat, false, "Shared bank platinum. Off by default to prevent duplication") +RULE_BOOL(Character, BindAnywhere, false, "Allows players to bind their soul anywhere in the world") +RULE_BOOL(Character, RestRegenEnabled, true, "Setting to activate out-of-combat regeneration") RULE_INT(Character, RestRegenTimeToActivate, 30, "Time in seconds for rest state regen to kick in") RULE_INT(Character, RestRegenRaidTimeToActivate, 300, "Time in seconds for rest state regen to kick in with a raid target") -RULE_INT(Character, KillsPerGroupLeadershipAA, 250, "Number of dark blues or above per Group Leadership AA") -RULE_INT(Character, KillsPerRaidLeadershipAA, 250, "Number of dark blues or above per Raid Leadership AA") -RULE_INT(Character, MaxFearDurationForPlayerCharacter, 4, "4 tics, each tic calculates every 6 seconds") -RULE_INT(Character, MaxCharmDurationForPlayerCharacter, 15, "") -RULE_INT(Character, BaseHPRegenBonusRaces, 4352, "a bitmask of race(s) that receive the regen bonus. Iksar (4096) & Troll (256) = 4352. see common/races.h for the bitmask values") +RULE_INT(Character, KillsPerGroupLeadershipAA, 250, "Minimum number of dark blue mobs that must be killed to get a Group Leadership AA") +RULE_INT(Character, KillsPerRaidLeadershipAA, 250, "Minimum number of dark blue mobs that must be killed to get a Raid Leadership AAA") +RULE_INT(Character, MaxFearDurationForPlayerCharacter, 4, "Maximum number of tics a player can be feared. 1 tic equls 6 seconds") +RULE_INT(Character, MaxCharmDurationForPlayerCharacter, 15, "Maximum number of tics a player can be charmed. 1 tic equls 6 seconds") +RULE_INT(Character, BaseHPRegenBonusRaces, 4352, "A bitmask of race(s) that receive the regen bonus. Iksar (4096) & Troll (256) = 4352. See common/races.h for the bitmask values") RULE_BOOL(Character, SoDClientUseSoDHPManaEnd, false, "Setting this to true will allow SoD clients to use the SoD HP/Mana/End formulas and previous clients will use the old formulas") RULE_BOOL(Character, UseRaceClassExpBonuses, true, "Setting this to true will enable Class and Racial experience rate bonuses") -RULE_BOOL(Character, UseOldRaceExpPenalties, false, "Setting this to true will enable racial exp penalties for Iksar, Troll, Ogre, and Barbarian, as well as the bonus for Halflings") -RULE_BOOL(Character, UseOldClassExpPenalties, false, "Setting this to true will enable old class exp penalties for Paladin, SK, Ranger, Bard, Monk, Wizard, Enchanter, Magician, and Necromancer, as well as the bonus for Rogues and Warriors") -RULE_BOOL(Character, RespawnFromHover, false, "Use Respawn window, or not") -RULE_INT(Character, RespawnFromHoverTimer, 300, "Respawn Window countdown timer, in SECONDS") -RULE_BOOL(Character, UseNewStatsWindow, true, "New stats window shows everything") -RULE_BOOL(Character, ItemCastsUseFocus, false, "If true, this allows item clickies to use focuses that have limited max levels on them") +RULE_BOOL(Character, UseOldRaceExpPenalties, false, "Setting this to true will enable racial experience penalties for Iksar, Troll, Ogre, and Barbarian, as well as the bonus for Halflings") +RULE_BOOL(Character, UseOldClassExpPenalties, false, "Setting this to true will enable old class experience penalties for Paladin, SK, Ranger, Bard, Monk, Wizard, Enchanter, Magician, and Necromancer, as well as the bonus for Rogues and Warriors") +RULE_BOOL(Character, RespawnFromHover, false, "Setting whether the respawn window should be used") +RULE_INT(Character, RespawnFromHoverTimer, 300, "Respawn Window countdown timer, in seconds") +RULE_BOOL(Character, UseNewStatsWindow, true, "Setting whether the new Stats window, which displays all information, should be used") +RULE_BOOL(Character, ItemCastsUseFocus, false, "If true, this allows item clickies to use focuses that have limited maximum levels on them") RULE_INT(Character, MinStatusForNoDropExemptions, 80, "This allows status x and higher to trade no drop items") -RULE_INT(Character, SkillCapMaxLevel, 75, "Sets the Max Level used for Skill Caps (from skill_caps table). -1 makes it use MaxLevel rule value. It is set to 75 because PEQ only has skillcaps up to that level, and grabbing the players' skill past 75 will return 0, breaking all skills past that level. This helps servers with obsurd level caps (75+ level cap) function without any modifications") -RULE_INT(Character, StatCap, 0, "") +RULE_INT(Character, SkillCapMaxLevel, 75, "Sets the Maximum Level used for Skill Caps (from skill_caps table). -1 makes it use MaxLevel rule value. It is set to 75 because PEQ only has skill caps up to that level, and grabbing the players' skill past 75 will return 0, breaking all skills past that level. This helps servers with obsurd level caps (75+ level cap) function without any modifications") +RULE_INT(Character, StatCap, 0, "If StatCap > 0 then this value is used. If it is 0, the value of the following code is used: If Level < 61: 255. If Level >= 61 and the client SoF or newer: 255 + 5 x (level -60). If the client is older than SoF and the level < 71 then: 255 + x (level-60). In all other cases: 330.") RULE_BOOL(Character, CheckCursorEmptyWhenLooting, true, "If true, a player cannot loot a corpse (player or NPC) with an item on their cursor") RULE_BOOL(Character, MaintainIntoxicationAcrossZones, true, "If true, alcohol effects are maintained across zoning and logging out/in") RULE_BOOL(Character, EnableDiscoveredItems, true, "If enabled, it enables EVENT_DISCOVER_ITEM and also saves character names and timestamps for the first time an item is discovered") -RULE_BOOL(Character, EnableXTargetting, true, "Enable Extended Targetting Window, for users with UF and later clients") +RULE_BOOL(Character, EnableXTargetting, true, "Enable Extended Targeting Window, for users with UF and later clients") RULE_BOOL(Character, EnableAggroMeter, true, "Enable Aggro Meter, for users with RoF and later clients") -RULE_BOOL(Character, KeepLevelOverMax, false, "Don't delevel a character that has somehow gone over the level cap") +RULE_BOOL(Character, KeepLevelOverMax, false, "Don't de-level a character that has somehow gone over the level cap") RULE_INT(Character, FoodLossPerUpdate, 32, "How much food/water you lose per stamina update") -RULE_BOOL(Character, EnableHungerPenalties, false, "being hungry/thirsty has negative effects -- it does appear normal live servers do not have penalties") -RULE_BOOL(Character, EnableFoodRequirement, true, "if disabled, food is no longer required") -RULE_INT(Character, BaseInstrumentSoftCap, 36, "Softcap for instrument mods, 36 commonly referred to as \"3.6\" as well") +RULE_BOOL(Character, EnableHungerPenalties, false, "Being hungry/thirsty has negative effects -- it does appear normal live servers do not have penalties") +RULE_BOOL(Character, EnableFoodRequirement, true, "If disabled, food is no longer required") +RULE_INT(Character, BaseInstrumentSoftCap, 36, "Softcap for instrument mods, 36 commonly referred to as 3.6 as well") RULE_BOOL(Character, UseSpellFileSongCap, true, "When they removed the AA that increased the cap they removed the above and just use the spell field") RULE_INT(Character, BaseRunSpeedCap, 158, "Base Run Speed Cap, on live it's 158% which will give you a runspeed of 1.580 hard capped to 225") RULE_INT(Character, OrnamentationAugmentType, 20, "Ornamentation Augment Type") -RULE_REAL(Character, EnvironmentDamageMulipliter, 1, "") -RULE_BOOL(Character, UnmemSpellsOnDeath, true, "") -RULE_INT(Character, TradeskillUpAlchemy, 2, "Alchemy skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpBaking, 2, "Baking skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpBlacksmithing, 2, "Blacksmithing skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpBrewing, 3, "Brewing skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpFletching, 2, "Fletching skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpJewelcrafting, 2, "Jewelcrafting skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpMakePoison, 2, "Make Poison skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpPottery, 4, "Pottery skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpResearch, 1, "Research skillup rate adjust. Lower is faster") -RULE_INT(Character, TradeskillUpTinkering, 2, "Tinkering skillup rate adjust. Lower is faster") -RULE_BOOL(Character, MarqueeHPUpdates, false, "Will show Health % in center of screen < 100%") -RULE_INT(Character, IksarCommonTongue, 95, "95 By default (live-like?)") -RULE_INT(Character, OgreCommonTongue, 95, "95 By default (live-like?)") -RULE_INT(Character, TrollCommonTongue, 95, "95 By default (live-like?)") +RULE_REAL(Character, EnvironmentDamageMulipliter, 1, "Multiplier for environmental damage like fall damage.") +RULE_BOOL(Character, UnmemSpellsOnDeath, true, "Setting whether at death all memorized Spells are forgotten") +RULE_INT(Character, TradeskillUpAlchemy, 2, "Alchemy skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpBaking, 2, "Baking skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpBlacksmithing, 2, "Blacksmithing skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpBrewing, 3, "Brewing skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpFletching, 2, "Fletching skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpJewelcrafting, 2, "Jewelcrafting skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpMakePoison, 2, "Make Poison skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpPottery, 4, "Pottery skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpResearch, 1, "Research skillup rate adjustment. Lower is faster") +RULE_INT(Character, TradeskillUpTinkering, 2, "Tinkering skillup rate adjustment. Lower is faster") +RULE_BOOL(Character, MarqueeHPUpdates, false, "Will show health percentage in center of screen if health lesser than 100%") +RULE_INT(Character, IksarCommonTongue, 95, "Starting value for Common Tongue for Iksars") +RULE_INT(Character, OgreCommonTongue, 95, "Starting value for Common Tongue for Ogres") +RULE_INT(Character, TrollCommonTongue, 95, "Starting value for Common Tongue for Trolls") RULE_BOOL(Character, ActiveInvSnapshots, false, "Takes a periodic snapshot of inventory contents from online players") -RULE_INT(Character, InvSnapshotMinIntervalM, 180, "Minimum time (in minutes) between inventory snapshots") -RULE_INT(Character, InvSnapshotMinRetryM, 30, "Time (in minutes) to re-attempt an inventory snapshot after a failure") -RULE_INT(Character, InvSnapshotHistoryD, 30, "Time (in days) to keep snapshot entries") -RULE_BOOL(Character, RestrictSpellScribing, false, "Restricts spell scribing to allowable races/classes of spell scroll, if true") +RULE_INT(Character, InvSnapshotMinIntervalM, 180, "Minimum time between inventory snapshots (minutes)") +RULE_INT(Character, InvSnapshotMinRetryM, 30, "Time to re-attempt an inventory snapshot after a failure (minutes)") +RULE_INT(Character, InvSnapshotHistoryD, 30, "Time to keep snapshot entries (days)") +RULE_BOOL(Character, RestrictSpellScribing, false, "Setting whether to restrict spell scribing to allowable races/classes of spell scroll") RULE_BOOL(Character, UseStackablePickPocketing, true, "Allows stackable pickpocketed items to stack instead of only being allowed in empty inventory slots") -RULE_BOOL(Character, EnableAvoidanceCap, false, "") +RULE_BOOL(Character, EnableAvoidanceCap, false, "Setting whether the avoidance cap should be activated") RULE_INT(Character, AvoidanceCap, 750, "750 Is a pretty good value, seen people dodge all attacks beyond 1,000 Avoidance") RULE_BOOL(Character, AllowMQTarget, false, "Disables putting players in the 'hackers' list for targeting beyond the clip plane or attempting to target something untargetable") RULE_BOOL(Character, UseOldBindWound, false, "Uses the original bind wound behavior") RULE_BOOL(Character, GrantHoTTOnCreate, false, "Grant Health of Target's Target leadership AA on character creation") -RULE_BOOL(Character, UseOldConSystem, false, "Grant Health of Target's Target leadership AA on character creation") +RULE_BOOL(Character, UseOldConSystem, false, "Setting whether the pre SoF era consider system should be used") RULE_BOOL(Character, OPClientUpdateVisualDebug, false, "Shows a pulse and forward directional particle each time the client sends its position to server") -RULE_BOOL(Character, AllowCrossClassTrainers, false, "") -RULE_BOOL(Character, PetsUseReagents, true, "Pets use reagent on spells") +RULE_BOOL(Character, AllowCrossClassTrainers, false, "If the value is true, a player can also train with other class Guildmasters.") +RULE_BOOL(Character, PetsUseReagents, true, "Conjuring pets consumes reagents") RULE_BOOL(Character, DismountWater, true, "Dismount horses when entering water") RULE_BOOL(Character, UseNoJunkFishing, false, "Disregards junk items when fishing") RULE_BOOL(Character, SoftDeletes, true, "When characters are deleted in character select, they are only soft deleted") RULE_INT(Character, DefaultGuild, 0, "If not 0, new characters placed into the guild # indicated") +RULE_BOOL(Character, ProcessFearedProximity, false, "Processes proximity checks when feared") +RULE_BOOL(Character, EnableCharacterEXPMods, false, "Enables character zone-based experience modifiers.") RULE_CATEGORY_END() RULE_CATEGORY(Mercs) -RULE_INT(Mercs, SuspendIntervalMS, 10000, "") -RULE_INT(Mercs, UpkeepIntervalMS, 180000, "") -RULE_INT(Mercs, SuspendIntervalS, 10, "") -RULE_INT(Mercs, UpkeepIntervalS, 180, "") -RULE_BOOL(Mercs, AllowMercs, false, "") -RULE_BOOL(Mercs, ChargeMercPurchaseCost, false, "") -RULE_BOOL(Mercs, ChargeMercUpkeepCost, false, "") +RULE_INT(Mercs, SuspendIntervalMS, 10000, "Time interval for merc suspend (milliseconds)") +RULE_INT(Mercs, UpkeepIntervalMS, 180000, "Time interval for merc upkeep (milliseconds)") +RULE_INT(Mercs, SuspendIntervalS, 10, "Time interval for merc suspend command (seconds)") +RULE_BOOL(Mercs, AllowMercs, false, "Allow the use of mercs") +RULE_BOOL(Mercs, ChargeMercPurchaseCost, false, "Turns Mercenary purchase costs on or off") +RULE_BOOL(Mercs, ChargeMercUpkeepCost, false, "Turns Mercenary upkeep costs on or off") RULE_INT(Mercs, AggroRadius, 100, "Determines the distance from which a merc will aggro group member's target(also used to determine the distance at which a healer merc will begin healing a group member)") RULE_INT(Mercs, AggroRadiusPuller, 25, "Determines the distance from which a merc will aggro group member's target, if they have the group role of puller (also used to determine the distance at which a healer merc will begin healing a group member, if they have the group role of puller)") RULE_INT(Mercs, ResurrectRadius, 50, "Determines the distance from which a healer merc will attempt to resurrect a group member's corpse") -RULE_INT(Mercs, ScaleRate, 100, "") -RULE_BOOL(Mercs, MercsUsePathing, true, "Mercs will use node pathing when moving") -RULE_BOOL(Mercs, AllowMercSuspendInCombat, true, "") +RULE_INT(Mercs, ScaleRate, 100, "Merc scale factor") +RULE_BOOL(Mercs, AllowMercSuspendInCombat, true, "Allow merc suspend in combat") RULE_CATEGORY_END() RULE_CATEGORY(Guild) -RULE_INT(Guild, MaxMembers, 2048, "") RULE_BOOL(Guild, PlayerCreationAllowed, false, "Allow players to create a guild using the window in Underfoot+") RULE_INT(Guild, PlayerCreationLimit, 1, "Only allow use of the UF+ window if the account has < than this number of guild leaders on it") -RULE_INT(Guild, PlayerCreationRequiredStatus, 0, "Required admin status") -RULE_INT(Guild, PlayerCreationRequiredLevel, 0, "Required Level of the player attempting to create the guild") -RULE_INT(Guild, PlayerCreationRequiredTime, 0, "Required Time Entitled On Account (in Minutes) to create the guild") +RULE_INT(Guild, PlayerCreationRequiredStatus, 0, "Required status to create a guild") +RULE_INT(Guild, PlayerCreationRequiredLevel, 0, "Required level of the player attempting to create the guild") +RULE_INT(Guild, PlayerCreationRequiredTime, 0, "Time needed online on the account to create a guild (in minutes)") RULE_CATEGORY_END() RULE_CATEGORY(Skills) -RULE_INT(Skills, MaxTrainTradeskills, 21, "") -RULE_BOOL(Skills, UseLimitTradeskillSearchSkillDiff, true, "") -RULE_INT(Skills, MaxTradeskillSearchSkillDiff, 50, "") -RULE_INT(Skills, MaxTrainSpecializations, 50, "Max level a GM trainer will train casting specializations") -RULE_INT(Skills, SwimmingStartValue, 100, "") -RULE_BOOL(Skills, TrainSenseHeading, false, "") -RULE_INT(Skills, SenseHeadingStartValue, 200, "") -RULE_BOOL(Skills, SelfLanguageLearning, true, "") -RULE_BOOL(Skills, RequireTomeHandin, false, "Disable click-to-learn and force turnin to Guild Master") +RULE_INT(Skills, MaxTrainTradeskills, 21, "Highest level for trading skills that can be learnt by the trainer") +RULE_BOOL(Skills, UseLimitTradeskillSearchSkillDiff, true, "Enables the limit for the maximum difference between trivial and skill for recipe searches and favorites") +RULE_INT(Skills, MaxTradeskillSearchSkillDiff, 50, "The maximum difference in skill between the trivial of an item and the skill of the player if the trivial is higher than the skill. Recipes that have not been learnt or made at least once via the Experiment mode will be removed from searches based on this criteria.") +RULE_INT(Skills, MaxTrainSpecializations, 50, "Maximum level a GM trainer will train casting specializations") +RULE_INT(Skills, SwimmingStartValue, 100, "Start value of swimming skill") +RULE_BOOL(Skills, TrainSenseHeading, false, "Switch whether SenseHeading is trained by use") +RULE_INT(Skills, SenseHeadingStartValue, 200, "Start value of sense heading skill") +RULE_BOOL(Skills, SelfLanguageLearning, true, "Enabling self-learning of languages") +RULE_BOOL(Skills, RequireTomeHandin, false, "Disable click-to-learn and force hand in to Guild Master") RULE_CATEGORY_END() RULE_CATEGORY(Pets) -RULE_REAL(Pets, AttackCommandRange, 150, "") -RULE_BOOL(Pets, UnTargetableSwarmPet, false, "") -RULE_REAL(Pets, PetPowerLevelCap, 10, "Max number of levels your pet can go up with pet power") -RULE_BOOL(Pets, CanTakeNoDrop, false, "Can everyone trade nodrop gear to pets") +RULE_REAL(Pets, AttackCommandRange, 150, "Range at which a pet will respond to attack commands") +RULE_BOOL(Pets, UnTargetableSwarmPet, false, "Setting whether swarm pets should be targetable") +RULE_REAL(Pets, PetPowerLevelCap, 10, "Maximum number of levels a player pet can go up with pet power") +RULE_BOOL(Pets, CanTakeNoDrop, false, "Setting whether anyone can give no-drop items to pets") RULE_CATEGORY_END() RULE_CATEGORY(GM) -RULE_INT(GM, MinStatusToSummonItem, 250, "") -RULE_INT(GM, MinStatusToZoneAnywhere, 250, "") -RULE_INT(GM, MinStatusToLevelTarget, 100, "") +RULE_INT(GM, MinStatusToSummonItem, 250, "Minimum required status to summon items") +RULE_INT(GM, MinStatusToZoneAnywhere, 250, "Minimum required status to zone anywhere") +RULE_INT(GM, MinStatusToLevelTarget, 100, "Minimum required status to set the level of a player") +RULE_INT(GM, MinStatusToBypassLockedServer, 100, "Players >= this status can log in to the server even when it is locked") RULE_CATEGORY_END() RULE_CATEGORY(World) -RULE_INT(World, ZoneAutobootTimeoutMS, 60000, "") -RULE_INT(World, ClientKeepaliveTimeoutMS, 65000, "") +RULE_INT(World, ZoneAutobootTimeoutMS, 60000, "Time out for automatic booting of zones in milliseconds") RULE_BOOL(World, UseBannedIPsTable, false, "Toggle whether or not to check incoming client connections against the banned_ips table. Set this value to false to disable this feature") -RULE_BOOL(World, EnableTutorialButton, true, "") -RULE_BOOL(World, EnableReturnHomeButton, true, "") -RULE_INT(World, MaxLevelForTutorial, 10, "") -RULE_INT(World, TutorialZoneID, 189, "") -RULE_INT(World, GuildBankZoneID, 345, "") -RULE_INT(World, MinOfflineTimeToReturnHome, 21600, "21600 seconds is 6 Hours") +RULE_BOOL(World, EnableTutorialButton, true, "Setting whether the Tutorial button should be active. At least in RoF2 you can always press the button, but it loses its effect") +RULE_BOOL(World, EnableReturnHomeButton, true, "Setting whether the Return Home button should be active") +RULE_INT(World, MaxLevelForTutorial, 10, "The highest level with which you can enter the tutorial") +RULE_INT(World, TutorialZoneID, 189, "Zone ID of the tutorial") +RULE_INT(World, GuildBankZoneID, 345, "Zone ID of the guild bank") +RULE_INT(World, MinOfflineTimeToReturnHome, 21600, "Minimum offline time to activate the Return Home button. 21600 seconds is 6 Hours") RULE_INT(World, MaxClientsPerIP, -1, "Maximum number of clients allowed to connect per IP address if account status is < AddMaxClientsStatus. Default value: -1 (feature disabled)") RULE_INT(World, ExemptMaxClientsStatus, -1, "Exempt accounts from the MaxClientsPerIP and AddMaxClientsStatus rules, if their status is >= this value. Default value: -1 (feature disabled)") RULE_INT(World, AddMaxClientsPerIP, -1, "Maximum number of clients allowed to connect per IP address if account status is < ExemptMaxClientsStatus. Default value: -1 (feature disabled)") RULE_INT(World, AddMaxClientsStatus, -1, "Accounts with status >= this rule will be allowed to use the amount of accounts defined in the AddMaxClientsPerIP. Default value: -1 (feature disabled)") -RULE_BOOL(World, MaxClientsSetByStatus, false, "If True, IP Limiting will be set to the status on the account as long as the status is > MaxClientsPerIP") -RULE_BOOL(World, EnableIPExemptions, false, "If True, ip_exemptions table is used, if there is no entry for the IP it will default to RuleI(World, MaxClientsPerIP)") +RULE_BOOL(World, MaxClientsSetByStatus, false, "If true, IP Limiting will be set to the status on the account as long as the status is > MaxClientsPerIP") +RULE_BOOL(World, EnableIPExemptions, false, "If true, ip_exemptions table is used, if there is no entry for the IP it will default to RuleI(World, MaxClientsPerIP)") RULE_BOOL(World, ClearTempMerchantlist, true, "Clears temp merchant items when world boots") -RULE_BOOL(World, DeleteStaleCorpeBackups, true, "Deletes stale corpse backups older than 2 weeks") -RULE_BOOL(World, GMAccountIPList, false, "Check ip list against GM Accounts, AntiHack GM Accounts") -RULE_INT(World, MinGMAntiHackStatus, 1, "Minimum GM status to check against AntiHack list") +RULE_BOOL(World, GMAccountIPList, false, "Check IP list against GM accounts. This increases the security of GM accounts, e.g. if you only allow localhost '127.0.0.1' for GM accounts. Think carefully about what you enter!") +RULE_INT(World, MinGMAntiHackStatus, 1, "Minimum status to check against AntiHack list") RULE_INT(World, SoFStartZoneID, -1, "Sets the Starting Zone for SoF Clients separate from Titanium Clients (-1 is disabled)") RULE_INT(World, TitaniumStartZoneID, -1, "Sets the Starting Zone for Titanium Clients (-1 is disabled). Replaces the old method") -RULE_INT(World, ExpansionSettings, 16383, "Sets the expansion settings for the server, This is sent on login to world and affects client expansion settings. Defaults to all expansions enabled up to TSS") -RULE_BOOL(World, UseClientBasedExpansionSettings, true, "if true it will overrule World, ExpansionSettings and set someone's expansion based on the client they're using") -RULE_INT(World, PVPSettings, 0, "Sets the PVP settings for the server, 1 = Rallos Zek RuleSet, 2 = Tallon/Vallon Zek Ruleset, 4 = Sullon Zek Ruleset, 6 = Discord Ruleset, anything above 6 is the Discord Ruleset without the no-drop restrictions removed. TODO: Edit IsAttackAllowed in Zone to accomodate for these rules") -RULE_INT(World, PVPMinLevel, 0, "minimum level to pvp") -RULE_BOOL (World, IsGMPetitionWindowEnabled, false, "") -RULE_INT (World, FVNoDropFlag, 0, "Sets the Firiona Vie settings on the client. If set to 2, the flag will be set for GMs only, allowing trading of no-drop items") -RULE_BOOL (World, IPLimitDisconnectAll, false, "") -RULE_BOOL(World, MaxClientsSimplifiedLogic, false, "New logic that only uses ExemptMaxClientsStatus and MaxClientsPerIP. Done on the loginserver. This mimics the P99-style special IP rules") -RULE_INT (World, TellQueueSize, 20, "") -RULE_BOOL(World, StartZoneSameAsBindOnCreation, true, "Should the start zone ALWAYS be the same location as your bind?") -RULE_BOOL(World, EnforceCharacterLimitAtLogin, false, "") +RULE_INT(World, ExpansionSettings, 16383, "Sets the expansion settings for the server, This is sent on login to world and affects client expansion settings. Defaults to all expansions enabled up to TSS, value is bitmask") +RULE_BOOL(World, UseClientBasedExpansionSettings, true, "If true it will overrule World, ExpansionSettings and set someone's expansion based on the client they're using") +RULE_INT(World, PVPSettings, 0, "Sets the PVP settings for the server. 1=Rallos Zek RuleSet, 2=Tallon/Vallon Zek Ruleset, 4=Sullon Zek Ruleset, 6=Discord Ruleset, anything above 6 is the Discord Ruleset without the no-drop restrictions removed. NOTE: edit IsAttackAllowed in Zone-table to accomodate for these rules") +RULE_INT(World, PVPMinLevel, 0, "Minimum level to pvp") +RULE_BOOL (World, IsGMPetitionWindowEnabled, false, "Setting whether the GM petition window is available") +RULE_INT (World, FVNoDropFlag, 0, "Sets the Firiona Vie settings on the client, allowing trading of no-drop items. 1=for all players, 2=for GM only") +RULE_BOOL (World, IPLimitDisconnectAll, false, "Disconnect all current clients by IP if they go over the IP limit. This should allow people to quickly reconnect in the case of dead sessions waiting to timeout") +RULE_INT (World, TellQueueSize, 20, "Maximum tell queue size") +RULE_BOOL(World, StartZoneSameAsBindOnCreation, true, "Should the start zone always be the same location as your bind?") +RULE_BOOL(World, EnforceCharacterLimitAtLogin, false, "Enforce the limit for characters that are online at login") +RULE_BOOL(World, EnableDevTools, true, "Enable or Disable the Developer Tools globally (Most of the time you want this enabled)") RULE_CATEGORY_END() RULE_CATEGORY(Zone) -RULE_INT(Zone, ClientLinkdeadMS, 90000, "the time a client remains link dead on the server after a sudden disconnection") -RULE_INT(Zone, GraveyardTimeMS, 1200000, "ms time until a player corpse is moved to a zone's graveyard, if one is specified for the zone") -RULE_BOOL(Zone, EnableShadowrest, 1, "enables or disables the shadowrest zone feature for player corpses. Default is turned on") -RULE_BOOL(Zone, UsePlayerCorpseBackups, true, "Keeps backups of player corpses") -RULE_INT(Zone, MQWarpExemptStatus, -1, "Required status level to exempt the MQWarpDetector. Set to -1 to disable this feature") -RULE_INT(Zone, MQZoneExemptStatus, -1, "Required status level to exempt the MQZoneDetector. Set to -1 to disable this feature") -RULE_INT(Zone, MQGateExemptStatus, -1, "Required status level to exempt the MQGateDetector. Set to -1 to disable this feature") -RULE_INT(Zone, MQGhostExemptStatus, -1, "Required status level to exempt the MGhostDetector. Set to -1 to disable this feature") -RULE_BOOL(Zone, EnableMQWarpDetector, true, "Enable the MQWarp Detector. Set to False to disable this feature") -RULE_BOOL(Zone, EnableMQZoneDetector, true, "Enable the MQZone Detector. Set to False to disable this feature") -RULE_BOOL(Zone, EnableMQGateDetector, true, "Enable the MQGate Detector. Set to False to disable this feature") -RULE_BOOL(Zone, EnableMQGhostDetector, true, "Enable the MQGhost Detector. Set to False to disable this feature") -RULE_REAL(Zone, MQWarpDetectionDistanceFactor, 9.0, "clients move at 4.4 about if in a straight line but with movement and to acct for lag we raise it a bit") -RULE_BOOL(Zone, MarkMQWarpLT, false, "") -RULE_INT(Zone, AutoShutdownDelay, 5000, "How long a dynamic zone stays loaded while empty") -RULE_INT(Zone, PEQZoneReuseTime, 900, "How long, in seconds, until you can reuse the #peqzone command") +RULE_INT(Zone, ClientLinkdeadMS, 90000, "The time a client remains link dead on the server after a sudden disconnection (milliseconds)") +RULE_INT(Zone, GraveyardTimeMS, 1200000, "Time until a player corpse is moved to a zone's graveyard, if one is specified for the zone (milliseconds)") +RULE_BOOL(Zone, EnableShadowrest, 1, "Enables or disables the Shadowrest zone feature for player corpses. Default is turned on") +RULE_INT(Zone, AutoShutdownDelay, 5000, "How long a dynamic zone stays loaded while empty (milliseconds)") +RULE_INT(Zone, PEQZoneReuseTime, 900, "Time between two uses of the #peqzone command (seconds)") RULE_INT(Zone, PEQZoneDebuff1, 4454, "First debuff casted by #peqzone Default is Cursed Keeper's Blight") RULE_INT(Zone, PEQZoneDebuff2, 2209, "Second debuff casted by #peqzone Default is Tendrils of Apathy") -RULE_BOOL(Zone, UsePEQZoneDebuffs, true, "Will determine if #peqzone will debuff players or not when used") -RULE_REAL(Zone, HotZoneBonus, 0.75, "") -RULE_INT(Zone, ReservedInstances, 30, "Will reserve this many instance ids for globals... probably not a good idea to change this while a server is running") -RULE_INT(Zone, EbonCrystalItemID, 40902, "") -RULE_INT(Zone, RadiantCrystalItemID, 40903, "") -RULE_BOOL(Zone, LevelBasedEXPMods, false, "Allows you to use the level_exp_mods table in consideration to your players EXP hits") +RULE_BOOL(Zone, UsePEQZoneDebuffs, true, "Setting if the command #peqzone applies the defined debuffs") +RULE_REAL(Zone, HotZoneBonus, 0.75, "Value which is added to the experience multiplier. This also applies to AA experience.") +RULE_INT(Zone, EbonCrystalItemID, 40902, "Item ID for Ebon Crystal") +RULE_INT(Zone, RadiantCrystalItemID, 40903, "Item ID for Radiant Crystal") +RULE_BOOL(Zone, LevelBasedEXPMods, false, "Allows you to use the level_exp_mods table in consideration to your players experience hits") RULE_INT(Zone, WeatherTimer, 600, "Weather timer when no duration is available") -RULE_BOOL(Zone, EnableLoggedOffReplenishments, true, "") -RULE_INT(Zone, MinOfflineTimeToReplenishments, 21600, "21600 seconds is 6 Hours") +RULE_BOOL(Zone, EnableLoggedOffReplenishments, true, "'Replenish mana/hp/end if logged off for MinOfflineTimeToReplenishments") +RULE_INT(Zone, MinOfflineTimeToReplenishments, 21600, "Minimum time a player must be offline before LoggedOffReplenishments becomes active (seconds)") RULE_BOOL(Zone, UseZoneController, true, "Enables the ability to use persistent quest based zone controllers (zone_controller.pl/lua)") RULE_BOOL(Zone, EnableZoneControllerGlobals, false, "Enables the ability to use quest globals with the zone controller NPC") RULE_INT(Zone, GlobalLootMultiplier, 1, "Sets Global Loot drop multiplier for database based drops, useful for double, triple loot etc") RULE_BOOL(Zone, KillProcessOnDynamicShutdown, true, "When process has booted a zone and has hit its zone shut down timer, it will hard kill the process to free memory back to the OS") +RULE_INT(Zone, SecondsBeforeIdle, 60, "Seconds before IDLE_WHEN_EMPTY define kicks in") RULE_CATEGORY_END() RULE_CATEGORY(Map) -RULE_BOOL(Map, FixPathingZOnSendTo, false, "try to repair Z coords in the SendTo routine as well") +RULE_BOOL(Map, FixPathingZOnSendTo, false, "Try to repair Z coordinates in the SendTo routine as well") RULE_BOOL(Map, FixZWhenPathing, true, "Automatically fix NPC Z coordinates when moving/pathing/engaged (Far less CPU intensive than its predecessor)") -RULE_REAL(Map, DistanceCanTravelBeforeAdjustment, 10.0, "distance a mob can path before FixZ is called, depends on FixZWhenPathing") +RULE_REAL(Map, DistanceCanTravelBeforeAdjustment, 10.0, "Distance a mob can path before FixZ is called, depends on FixZWhenPathing") RULE_BOOL(Map, MobZVisualDebug, false, "Displays spell effects determining whether or not NPC is hitting Best Z calcs (blue for hit, red for miss)") -RULE_REAL(Map, FixPathingZMaxDeltaSendTo, 20, "at runtime in SendTo: max change in Z to allow the BestZ code to apply") +RULE_REAL(Map, FixPathingZMaxDeltaSendTo, 20, "At runtime in SendTo: maximum change in Z to allow the BestZ code to apply") RULE_INT(Map, FindBestZHeightAdjust, 1, "Adds this to the current Z before seeking the best Z position") RULE_CATEGORY_END() RULE_CATEGORY(Pathing) -RULE_BOOL(Pathing, Guard, true, "Enable pathing for mobs moving to their guard point") RULE_BOOL(Pathing, Find, true, "Enable pathing for FindPerson requests from the client") RULE_BOOL(Pathing, Fear, true, "Enable pathing for fear") -RULE_REAL(Pathing, NavmeshStepSize, 100.0f, "") -RULE_REAL(Pathing, ShortMovementUpdateRange, 130.0f, "") -RULE_INT(Pathing, MaxNavmeshNodes, 4092, "Max navmesh nodes in a traversable path") +RULE_REAL(Pathing, NavmeshStepSize, 100.0f, "Step size for the movement manager") +RULE_REAL(Pathing, ShortMovementUpdateRange, 130.0f, "Range for short movement updates") +RULE_INT(Pathing, MaxNavmeshNodes, 4092, "Maximum navmesh nodes in a traversable path") RULE_CATEGORY_END() RULE_CATEGORY(Watermap) // enable these to use the water detection code. Requires Water Maps generated by awater utility -RULE_BOOL(Watermap, CheckWaypointsInWaterWhenLoading, false, "Does not apply BestZ as waypoints are loaded if they are in water") -RULE_BOOL(Watermap, CheckForWaterAtWaypoints, false, "Check if a mob has moved into/out of water when at waypoints and sets flymode") -RULE_BOOL(Watermap, CheckForWaterWhenMoving, false, "Checks if a mob has moved into/out of water each time it's loc is recalculated") RULE_BOOL(Watermap, CheckForWaterOnSendTo, false, "Checks if a mob has moved into/out of water on SendTo") RULE_BOOL(Watermap, CheckForWaterWhenFishing, false, "Only lets a player fish near water (if a water map exists for the zone)") RULE_REAL(Watermap, FishingRodLength, 30, "How far in front of player water must be for fishing to work") @@ -313,48 +296,42 @@ RULE_REAL(Watermap, FishingLineStepSize, 1, "Basic step size for fishing calc, t RULE_CATEGORY_END() RULE_CATEGORY(Spells) -RULE_INT(Spells, AutoResistDiff, 15, "") -RULE_REAL(Spells, ResistChance, 2.0, "chance to resist given no resists and same level") -RULE_REAL(Spells, ResistMod, 0.40, "multiplier, chance to resist = this * ResistAmount") -RULE_REAL(Spells, PartialHitChance, 0.7, "The chance when a spell is resisted that it will partial hit") -RULE_REAL(Spells, PartialHitChanceFear, 0.25, "The chance when a fear spell is resisted that it will partial hit") -RULE_INT(Spells, BaseCritChance, 0, "base % chance that everyone has to crit a spell") -RULE_INT(Spells, BaseCritRatio, 100, "base % bonus to damage on a successful spell crit. 100 = 2x damage") -RULE_INT(Spells, WizCritLevel, 12, "level wizards first get spell crits") -RULE_INT(Spells, WizCritChance, 7, "wiz's crit chance, on top of BaseCritChance") -RULE_INT(Spells, WizCritRatio, 0, "wiz's crit bonus, on top of BaseCritRatio (should be 0 for Live-like)") -RULE_INT(Spells, ResistPerLevelDiff, 85, "8.5 resist per level difference") +RULE_INT(Spells, BaseCritChance, 0, "Base percentage chance that everyone has to crit a spell") +RULE_INT(Spells, BaseCritRatio, 100, "Base percentage bonus to damage on a successful spell crit. 100=2xdamage") +RULE_INT(Spells, WizCritLevel, 12, "Level wizards first get spell crits") +RULE_INT(Spells, WizCritChance, 7, "Wizards crit chance, on top of BaseCritChance") +RULE_INT(Spells, WizCritRatio, 0, "Wizards crit bonus, on top of BaseCritRatio (should be 0 for Live-like)") RULE_INT(Spells, TranslocateTimeLimit, 0, "If not zero, time in seconds to accept a Translocate") -RULE_INT(Spells, SacrificeMinLevel, 46, "first level Sacrifice will work on") -RULE_INT(Spells, SacrificeMaxLevel, 69, "last level Sacrifice will work on") -RULE_INT(Spells, SacrificeItemID, 9963, "Item ID of the item Sacrifice will return (defaults to an EE)") -RULE_BOOL(Spells, EnableSpellGlobals, false, "If Enabled, spells check the spell_globals table and compare character data from their quest globals before allowing the spell to scribe with scribespells/traindiscs") -RULE_BOOL(Spells, EnableSpellBuckets, false, "If Enabled, spells check the spell_buckets table and compare character data from their data buckets before allowing the spell to scribe with scribespells/traindiscs") -RULE_INT(Spells, MaxBuffSlotsNPC, 60, "default to Tit's limit") -RULE_INT(Spells, MaxSongSlotsNPC, 0, "NPCs don't have songs ...") -RULE_INT(Spells, MaxDiscSlotsNPC, 0, "NPCs don't have discs ...") -RULE_INT(Spells, MaxTotalSlotsNPC, 60, "default to Tit's limit") -RULE_INT(Spells, MaxTotalSlotsPET, 30, "default to Tit's limit") -RULE_BOOL (Spells, EnableBlockedBuffs, true, "") -RULE_INT(Spells, ReflectType, 3, "0 = disabled, 1 = single target player spells only, 2 = all player spells, 3 = all single target spells, 4 = all spells") -RULE_BOOL(Spells, ReflectMessagesClose, true, "Live functionality is for Reflect messages to show to players within close proximity, false shows just player reflecting") +RULE_INT(Spells, SacrificeMinLevel, 46, "First level the spell Sacrifice will work on") +RULE_INT(Spells, SacrificeMaxLevel, 69, "Last level the spell Sacrifice will work on") +RULE_INT(Spells, SacrificeItemID, 9963, "Item ID of the item Sacrifice will return (defaults to an Essence Emerald)") +RULE_BOOL(Spells, EnableSpellGlobals, false, "If enabled, spells check the spell_globals table and compare character data from their quest globals before allowing the spell to scribe with scribespells/traindiscs") +RULE_BOOL(Spells, EnableSpellBuckets, false, "If enabled, spells check the spell_buckets table and compare character data from their data buckets before allowing the spell to scribe with scribespells/traindiscs") +RULE_INT(Spells, MaxBuffSlotsNPC, 60, "Maximum number of NPC buff slots. The default value is the limit of the Titanium client") +RULE_INT(Spells, MaxSongSlotsNPC, 0, "Maximum number of NPC song slots. NPC don't have songs, so it should be 0") +RULE_INT(Spells, MaxDiscSlotsNPC, 0, "Maximum number of NPC disc slots. NPC don't have discs, so it should be 0") +RULE_INT(Spells, MaxTotalSlotsNPC, 60, "Maximum total of NPC slots. The default value is the limit of the Titanium client") +RULE_INT(Spells, MaxTotalSlotsPET, 30, "Maximum total of pet slots. The default value is the limit of the Titanium client") +RULE_BOOL (Spells, EnableBlockedBuffs, true, "Allow blocked spells") +RULE_INT(Spells, ReflectType, 3, "Reflect type. 0=disabled, 1=single target player spells only, 2=all player spells, 3=all single target spells, 4=all spells") +RULE_BOOL(Spells, ReflectMessagesClose, true, "True (Live functionality) is for Reflect messages to show to players within close proximity. False shows just player reflecting") RULE_INT(Spells, VirusSpreadDistance, 30, "The distance a viral spell will jump to its next victim") RULE_BOOL(Spells, LiveLikeFocusEffects, true, "Determines whether specific healing, dmg and mana reduction focuses are randomized") -RULE_INT(Spells, BaseImmunityLevel, 55, "The level that targets start to be immune to stun, fear and mez spells with a max level of 0") -RULE_BOOL(Spells, NPCIgnoreBaseImmunity, true, "Whether or not NPCs get to ignore the BaseImmunityLevel for their spells") +RULE_INT(Spells, BaseImmunityLevel, 55, "The level that targets start to be immune to stun, fear and mez spells with a maximum level of 0") +RULE_BOOL(Spells, NPCIgnoreBaseImmunity, true, "Whether or not NPC get to ignore the BaseImmunityLevel for their spells") RULE_REAL(Spells, AvgSpellProcsPerMinute, 6.0, "Adjust rate for sympathetic spell procs") -RULE_INT(Spells, ResistFalloff, 67, "Max that level that will adjust our resist chance based on level modifiers") -RULE_INT(Spells, CharismaEffectiveness, 10, "Deterimes how much resist modification charisma applies to charm/pacify checks. Default 10 CHA = -1 resist mod") -RULE_INT(Spells, CharismaEffectivenessCap, 255, "Deterimes how much resist modification charisma applies to charm/pacify checks. Default 10 CHA = -1 resist mod") +RULE_INT(Spells, ResistFalloff, 67, "Maximum that level that will adjust our resist chance based on level modifiers") +RULE_INT(Spells, CharismaEffectiveness, 10, "Determines how much resist modification charisma applies to charm/pacify checks. Default 10 CHA = -1 resist mod") +RULE_INT(Spells, CharismaEffectivenessCap, 255, "Determines how much resist modification charisma applies to charm/pacify checks. Default 10 CHA = -1 resist mod") RULE_BOOL(Spells, CharismaCharmDuration, false, "Allow CHA resist mod to extend charm duration") RULE_INT(Spells, CharmBreakCheckChance, 25, "Determines chance for a charm break check to occur each buff tick") RULE_BOOL(Spells, CharmDisablesSpecialAbilities, false, "When charm is cast on an NPC, strip their special abilities") -RULE_INT(Spells, MaxCastTimeReduction, 50, "Max percent your spell cast time can be reduced by spell haste") +RULE_INT(Spells, MaxCastTimeReduction, 50, "Maximum percent your spell cast time can be reduced by spell haste") RULE_INT(Spells, RootBreakFromSpells, 55, "Chance for root to break when cast on") RULE_INT(Spells, DeathSaveCharismaMod, 3, "Determines how much charisma effects chance of death save firing") RULE_INT(Spells, DivineInterventionHeal, 8000, "Divine intervention heal amount") RULE_INT(Spells, AdditiveBonusWornType, 0, "Calc worn bonuses to add together (instead of taking highest) if set to THIS worn type. (2=Will covert live items automatically)") -RULE_BOOL(Spells, UseCHAScribeHack, false, "ScribeSpells and TrainDiscs quest functions will ignore entries where field 12 is CHA. What's the best way to do this?") +RULE_BOOL(Spells, UseCHAScribeHack, false, "ScribeSpells and TrainDiscs quest functions will ignore entries where field 12 is CHA") RULE_BOOL(Spells, BuffLevelRestrictions, true, "Buffs will not land on low level toons like live") RULE_INT(Spells, RootBreakCheckChance, 70, "Determines chance for a root break check to occur each buff tick") RULE_INT(Spells, FearBreakCheckChance, 70, "Determines chance for a fear break check to occur each buff tick") @@ -365,216 +342,203 @@ RULE_INT(Spells, FRProjectileItem_NPC, 80684, "Item id for NPC Fire 'spell proje RULE_BOOL(Spells, UseLiveSpellProjectileGFX, false, "Use spell projectile graphics set in the spells_new table (player_1). Server must be using UF+ spell file") RULE_BOOL(Spells, FocusCombatProcs, false, "Allow all combat procs to receive focus effects") RULE_BOOL(Spells, PreNerfBardAEDoT, false, "Allow bard AOE dots to damage targets when moving") -RULE_INT(Spells, AI_SpellCastFinishedFailRecast, 800, "AI spell recast time(MS) when an spell is cast but fails (ie stunned)") -RULE_INT(Spells, AI_EngagedNoSpellMinRecast, 500, "AI spell recast time(MS) check when no spell is cast while engaged. (min time in random)") -RULE_INT(Spells, AI_EngagedNoSpellMaxRecast, 1000, "AI spell recast time(MS) check when no spell is cast engaged.(max time in random)") +RULE_INT(Spells, AI_SpellCastFinishedFailRecast, 800, "AI spell recast time when an spell is cast but fails, ie if stunned (milliseconds)") +RULE_INT(Spells, AI_EngagedNoSpellMinRecast, 500, "AI spell recast time check when no spell is cast while engaged. Min time in random (milliseconds)") +RULE_INT(Spells, AI_EngagedNoSpellMaxRecast, 1000, "AI spell recast time check when no spell is cast engaged. Mmaximum time in random (milliseconds)") RULE_INT(Spells, AI_EngagedBeneficialSelfChance, 100, "Chance during first AI Cast check to do a beneficial spell on self") RULE_INT(Spells, AI_EngagedBeneficialOtherChance, 25, "Chance during second AI Cast check to do a beneficial spell on others") RULE_INT(Spells, AI_EngagedDetrimentalChance, 20, "Chance during third AI Cast check to do a determental spell on others") -RULE_INT(Spells, AI_PursueNoSpellMinRecast, 500, "AI spell recast time(MS) check when no spell is cast while chasing target. (min time in random)") -RULE_INT(Spells, AI_PursueNoSpellMaxRecast, 2000, "AI spell recast time(MS) check when no spell is cast while chasing target. (max time in random)") +RULE_INT(Spells, AI_PursueNoSpellMinRecast, 500, "AI spell recast time check when no spell is cast while chasing target. Mmin time in random (milliseconds)") +RULE_INT(Spells, AI_PursueNoSpellMaxRecast, 2000, "AI spell recast time check when no spell is cast while chasing target. Maximum time in random (milliseconds)") RULE_INT(Spells, AI_PursueDetrimentalChance, 90, "Chance while chasing target to cast a detrimental spell") -RULE_INT(Spells, AI_IdleNoSpellMinRecast, 6000, "AI spell recast time(MS) check when no spell is cast while idle. (min time in random)") -RULE_INT(Spells, AI_IdleNoSpellMaxRecast, 60000, "AI spell recast time(MS) check when no spell is cast while chasing target. (max time in random)") +RULE_INT(Spells, AI_IdleNoSpellMinRecast, 6000, "AI spell recast time check when no spell is cast while idle. Mmin time in random (milliseconds)") +RULE_INT(Spells, AI_IdleNoSpellMaxRecast, 60000, "AI spell recast time check when no spell is cast while chasing target. Maximum time in random (milliseconds)") RULE_INT(Spells, AI_IdleBeneficialChance, 100, "Chance while idle to do a beneficial spell on self or others") -RULE_INT(Spells, AI_HealHPPct, 50, "HP Pct NPCs will start heals at (in and out of combat) if spell's max_hp is not set") -RULE_BOOL(Spells, SHDProcIDOffByOne, true, "pre June 2009 SHD spell procs were off by 1, they stopped doing this in June 2009 (so UF+ spell files need this false)") -RULE_BOOL(Spells, Jun182014HundredHandsRevamp, false, "this should be true for if you import a spell file newer than June 18, 2014") +RULE_INT(Spells, AI_HealHPPct, 50, "Hitpoint percentage at which NPC starts healing when max_hp of the spell is not set (inside and outside combat)") +RULE_BOOL(Spells, SHDProcIDOffByOne, true, "Pre June 2009 SHD spell procs were off by 1, they stopped doing this in June 2009 (UF+ spell files need this false)") +RULE_BOOL(Spells, Jun182014HundredHandsRevamp, false, "This should be true for if you import a spell file newer than June 18, 2014") RULE_BOOL(Spells, SwarmPetTargetLock, false, "Use old method of swarm pets target locking till target dies then despawning") -RULE_BOOL(Spells, NPC_UseFocusFromSpells, true, "Allow npcs to use most spell derived focus effects") -RULE_BOOL(Spells, NPC_UseFocusFromItems, false, "Allow npcs to use most item derived focus effects") +RULE_BOOL(Spells, NPC_UseFocusFromSpells, true, "Allow NPC to use most spell derived focus effects") +RULE_BOOL(Spells, NPC_UseFocusFromItems, false, "Allow NPC to use most item derived focus effects") RULE_BOOL(Spells, UseAdditiveFocusFromWornSlot, false, "Allows an additive focus effect to be calculated from worn slot") -RULE_BOOL(Spells, AlwaysSendTargetsBuffs, false, "ignore LAA level if true") -RULE_BOOL(Spells, FlatItemExtraSpellAmt, false, "allow SpellDmg stat to affect all spells, regardless of cast time/cooldown/etc") -RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false, "ignore the 5 level spread on applying SpellDmg") -RULE_BOOL(Spells, AllowItemTGB, false, "TGB doesn't work with items on live, custom servers want it though") +RULE_BOOL(Spells, AlwaysSendTargetsBuffs, false, "Ignore Leadership Alternate Abilities level if true") +RULE_BOOL(Spells, FlatItemExtraSpellAmt, false, "Allow SpellDmg stat to affect all spells, regardless of cast time/cooldown/etc") +RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false, "Ignore the 5 level spread on applying SpellDmg") +RULE_BOOL(Spells, AllowItemTGB, false, "Target group buff (/tgb) doesn't work with items on live, custom servers want it though") RULE_BOOL(Spells, NPCInnateProcOverride, true, "NPC innate procs override the target type to single target") -RULE_BOOL(Spells, OldRainTargets, false, "use old incorrectly implemented max targets for rains") -RULE_BOOL(Spells, NPCSpellPush, false, "enable spell push on NPCs") +RULE_BOOL(Spells, OldRainTargets, false, "Use old incorrectly implemented maximum targets for rains") +RULE_BOOL(Spells, NPCSpellPush, false, "Enable spell push on NPCs") +RULE_BOOL(Spells, July242002PetResists, true, "Enable Pets using PCs resist change from July 24 2002") RULE_CATEGORY_END() RULE_CATEGORY(Combat) -RULE_INT(Combat, PetBaseCritChance, 0, "Pet Base crit chance") -RULE_INT(Combat, NPCBashKickLevel, 6, "The level that npcs can KICK/BASH") -RULE_INT(Combat, NPCBashKickStunChance, 15, "Percent chance that a bash/kick will stun") -RULE_INT(Combat, MeleeCritDifficulty, 8900, "lower is easier") -RULE_INT(Combat, ArcheryCritDifficulty, 3400, "lower is easier") -RULE_INT(Combat, ThrowingCritDifficulty, 1100, "lower is easier") -RULE_BOOL(Combat, NPCCanCrit, false, "true allows non PC pet NPCs to crit") -RULE_BOOL(Combat, UseIntervalAC, true, "") -RULE_INT(Combat, PetAttackMagicLevel, 30, "") -RULE_BOOL(Combat, EnableFearPathing, true, "") -RULE_REAL(Combat, FleeMultiplier, 2.0, "Determines how quickly a NPC will slow down while fleeing. Decrease multiplier to slow NPC down quicker") +RULE_REAL(Combat, AERampageSafeZone, 0.018, "max hit ae ramp reduction range") +RULE_INT(Combat, PetBaseCritChance, 0, "Pet base crit chance") +RULE_INT(Combat, NPCBashKickLevel, 6, "The level that NPCcan KICK/BASH") +RULE_INT(Combat, MeleeCritDifficulty, 8900, "Value against which is rolled to check if a melee crit is triggered. Lower is easier") +RULE_INT(Combat, ArcheryCritDifficulty, 3400, "Value against which is rolled to check if an archery crit is triggered. Lower is easier") +RULE_INT(Combat, ThrowingCritDifficulty, 1100, "Value against which is rolled to check if a throwing crit is triggered. Lower is easier") +RULE_BOOL(Combat, NPCCanCrit, false, "Setting whether an NPC can land critical hits") +RULE_BOOL(Combat, UseIntervalAC, true, "Switch whether bonuses, armour class, multipliers, classes and caps should be considered in the calculation of damage values") +RULE_INT(Combat, PetAttackMagicLevel, 30, "Level at which pets can cause magic damage") +RULE_BOOL(Combat, EnableFearPathing, true, "Setting whether to use pathing during fear") RULE_BOOL(Combat, FleeGray, true, "If true FleeGrayHPRatio will be used") -RULE_INT(Combat, FleeGrayHPRatio, 50, "HP % when a Gray NPC begins to flee") -RULE_INT(Combat, FleeGrayMaxLevel, 18, "NPC's above this level won't do gray/green con flee") -RULE_INT(Combat, FleeHPRatio, 25, "HP % when a NPC begins to flee") +RULE_INT(Combat, FleeGrayHPRatio, 50, "HP percentage when a Gray NPC begins to flee") +RULE_INT(Combat, FleeGrayMaxLevel, 18, "NPC above this level won't do gray/green con flee") +RULE_INT(Combat, FleeHPRatio, 25, "HP percentage when a NPC begins to flee") RULE_BOOL(Combat, FleeIfNotAlone, false, "If false, mobs won't flee if other mobs are in combat with it") -RULE_BOOL(Combat, AdjustProcPerMinute, true, "") -RULE_REAL(Combat, AvgProcsPerMinute, 2.0, "") -RULE_REAL(Combat, ProcPerMinDexContrib, 0.075, "") -RULE_REAL(Combat, BaseProcChance, 0.035, "") -RULE_REAL(Combat, ProcDexDivideBy, 11000, "") -RULE_BOOL(Combat, AdjustSpecialProcPerMinute, true, "Set PPM for special abilities like HeadShot (Live does this as of 4-14)") -RULE_REAL(Combat, AvgSpecialProcsPerMinute, 2.0, "Unclear what best value is atm") -RULE_REAL(Combat, BaseHitChance, 69.0, "") -RULE_REAL(Combat, NPCBonusHitChance, 26.0, "") -RULE_REAL(Combat, HitFalloffMinor, 5.0, "hit will fall off up to 5% over the initial level range") -RULE_REAL(Combat, HitFalloffModerate, 7.0, "hit will fall off up to 7% over the three levels after the initial level range") -RULE_REAL(Combat, HitFalloffMajor, 50.0, "hit will fall off sharply if we're outside the minor and moderate range") -RULE_REAL(Combat, HitBonusPerLevel, 1.2, "You gain this % of hit for every level you are above your target") -RULE_REAL(Combat, WeaponSkillFalloff, 0.33, "For every weapon skill point that's not maxed you lose this % of hit") +RULE_BOOL(Combat, AdjustProcPerMinute, true, "Adapt the average proc rate to the speed of the weapon") +RULE_REAL(Combat, AvgProcsPerMinute, 2.0, "Average proc rate per minute") +RULE_REAL(Combat, ProcPerMinDexContrib, 0.075, "Increases the probability of a proc increased by DEX by the value indicated") +RULE_REAL(Combat, BaseProcChance, 0.035, "Base chance for procs") +RULE_REAL(Combat, ProcDexDivideBy, 11000, "Divisor for the probability of a proc increased by dexterity") +RULE_REAL(Combat, BaseHitChance, 69.0, "Base chance to hit") +RULE_REAL(Combat, NPCBonusHitChance, 26.0, "Bonus chance to hit for NPC") +RULE_REAL(Combat, HitFalloffMinor, 5.0, "Hit will fall off up to value over the initial level range (percent)") +RULE_REAL(Combat, HitFalloffModerate, 7.0, "Hit will fall off up to value over the three levels after the initial level range (percent)") +RULE_REAL(Combat, HitFalloffMajor, 50.0, "Hit will fall off sharply if we're outside the minor and moderate range") +RULE_REAL(Combat, HitBonusPerLevel, 1.2, "You gain this percentage of hit for every level you are above your target") +RULE_REAL(Combat, WeaponSkillFalloff, 0.33, "For every weapon skill point that's not maxed you lose this percentage of hit") RULE_REAL(Combat, ArcheryHitPenalty, 0.25, "Archery has a hit penalty to try to help balance it with the plethora of long term +hit modifiers for it") -RULE_REAL(Combat, AgiHitFactor, 0.01, "") -RULE_REAL(Combat, MinChancetoHit, 5.0, "Minimum % chance to hit with regular melee/ranged") -RULE_REAL(Combat, MaxChancetoHit, 95.0, "Maximum % chance to hit with regular melee/ranged") +RULE_REAL(Combat, AgiHitFactor, 0.01, "Factor with which agility is taken into account in the hit probability. Higher is better") +RULE_REAL(Combat, MinChancetoHit, 5.0, "Minimum percentage chance to hit with regular melee/ranged") +RULE_REAL(Combat, MaxChancetoHit, 95.0, "Maximum percentage chance to hit with regular melee/ranged") RULE_INT(Combat, MinRangedAttackDist, 25, "Minimum Distance to use Ranged Attacks") RULE_BOOL(Combat, ArcheryBonusRequiresStationary, true, "does the 2x archery bonus chance require a stationary npc") -RULE_REAL(Combat, ArcheryBaseDamageBonus, 1, "% Modifier to Base Archery Damage (.5 = 50% base damage, 1 = 100%, 2 = 200%)") -RULE_REAL(Combat, ArcheryNPCMultiplier, 1.0, "this is multiplied by the regular dmg to get the archery dmg") -RULE_BOOL(Combat, AssistNoTargetSelf, true, "when assisting a target that does not have a target: true = target self, false = leave target as was before assist (false = live like)") -RULE_INT(Combat, MaxRampageTargets, 3, "max number of people hit with rampage") -RULE_INT(Combat, DefaultRampageTargets, 1, "default number of people to hit with rampage") -RULE_BOOL(Combat, RampageHitsTarget, false, "rampage will hit the target if it still has targets left") -RULE_INT(Combat, MaxFlurryHits, 2, "max number of extra hits from flurry") -RULE_INT(Combat, MonkDamageTableBonus, 5, "% bonus monks get to their damage table calcs") -RULE_INT(Combat, FlyingKickBonus, 25, "% Modifier that this skill gets to str and skill bonuses") -RULE_INT(Combat, DragonPunchBonus, 20, "% Modifier that this skill gets to str and skill bonuses") -RULE_INT(Combat, EagleStrikeBonus, 15, "% Modifier that this skill gets to str and skill bonuses") -RULE_INT(Combat, TigerClawBonus, 10, "% Modifier that this skill gets to str and skill bonuses") -RULE_INT(Combat, RoundKickBonus, 5, "% Modifier that this skill gets to str and skill bonuses") -RULE_INT(Combat, FrenzyBonus, 0, "% Modifier to damage") -RULE_INT(Combat, BackstabBonus, 0, "% Modifier to damage") -RULE_BOOL(Combat, ProcTargetOnly, true, "true = procs will only affect our target, false = procs will affect all of our targets") -RULE_REAL(Combat, NPCACFactor, 2.25, "") -RULE_INT(Combat, ClothACSoftcap, 75, "") -RULE_INT(Combat, LeatherACSoftcap, 100, "") -RULE_INT(Combat, MonkACSoftcap, 120, "") -RULE_INT(Combat, ChainACSoftcap, 200, "") -RULE_INT(Combat, PlateACSoftcap, 300, "") -RULE_REAL(Combat, AAMitigationACFactor, 3.0, "") -RULE_REAL(Combat, WarriorACSoftcapReturn, 0.45, "") -RULE_REAL(Combat, KnightACSoftcapReturn, 0.33, "") -RULE_REAL(Combat, LowPlateChainACSoftcapReturn, 0.23, "") -RULE_REAL(Combat, LowChainLeatherACSoftcapReturn, 0.17, "") -RULE_REAL(Combat, CasterACSoftcapReturn, 0.06, "") -RULE_REAL(Combat, MiscACSoftcapReturn, 0.3, "") -RULE_BOOL(Combat, OldACSoftcapRules, false, "use old softcaps") -RULE_BOOL(Combat, UseOldDamageIntervalRules, false, "use old damage formulas for everything") -RULE_REAL(Combat, WarACSoftcapReturn, 0.3448, "new AC returns") -RULE_REAL(Combat, ClrRngMnkBrdACSoftcapReturn, 0.3030, "") -RULE_REAL(Combat, PalShdACSoftcapReturn, 0.3226, "") -RULE_REAL(Combat, DruNecWizEncMagACSoftcapReturn, 0.2000, "") -RULE_REAL(Combat, RogShmBstBerACSoftcapReturn, 0.2500, "") -RULE_REAL(Combat, SoftcapFactor, 1.88, "") -RULE_REAL(Combat, ACthac0Factor, 0.55, "") -RULE_REAL(Combat, ACthac20Factor, 0.55, "") -RULE_INT(Combat, HitCapPre20, 40, "live has it capped at 40 for whatever dumb reason... this is mainly for custom servers") -RULE_INT(Combat, HitCapPre10, 20, "live has it capped at 20, see above") -RULE_INT(Combat, MinHastedDelay, 400, "how fast we can get with haste") -RULE_REAL(Combat, AvgDefProcsPerMinute, 2.0, "") +RULE_REAL(Combat, ArcheryNPCMultiplier, 1.0, "Value is multiplied by the regular dmg to get the archery dmg") +RULE_BOOL(Combat, AssistNoTargetSelf, true, "When assisting a target that does not have a target: true = target self, false = leave target as was before assist (false = live like)") +RULE_INT(Combat, MaxRampageTargets, 3, "Maximum number of people hit with rampage") +RULE_INT(Combat, DefaultRampageTargets, 1, "Default number of people to hit with rampage") +RULE_BOOL(Combat, RampageHitsTarget, false, "Rampage will hit the target if it still has targets left") +RULE_INT(Combat, MaxFlurryHits, 2, "Maximum number of extra hits from flurry") +RULE_REAL(Combat, NPCACFactor, 2.25, "If UseIntervalAC is enabled, the armor class for NPC is divided by this value") +RULE_INT(Combat, ClothACSoftcap, 75, "If OldACSoftcapRules is true: armorclass softcap for cloth armor") +RULE_INT(Combat, LeatherACSoftcap, 100, "If OldACSoftcapRules is true: armorclass softcap for leather armor") +RULE_INT(Combat, MonkACSoftcap, 120, "If OldACSoftcapRules is true: armorclass softcap for monks") +RULE_INT(Combat, ChainACSoftcap, 200, "If OldACSoftcapRules is true: armorclass softcap for chain armor") +RULE_INT(Combat, PlateACSoftcap, 300, "If OldACSoftcapRules is true: armorclass softcap for plate armor") +RULE_REAL(Combat, AAMitigationACFactor, 3.0, "If OldACSoftcapRules: AA mitgation armorclass factor") +RULE_REAL(Combat, WarriorACSoftcapReturn, 0.45, "If OldACSoftcapRules: warrior armorclass softcap increase-factor") +RULE_REAL(Combat, KnightACSoftcapReturn, 0.33, "If OldACSoftcapRules: SHD/PAL/MNK armorclass softcap increase-factor") +RULE_REAL(Combat, LowPlateChainACSoftcapReturn, 0.23, "If OldACSoftcapRules: CLR/BRD/BSK/ROG/SHA/MNK armorclass softcap increase-factor") +RULE_REAL(Combat, LowChainLeatherACSoftcapReturn, 0.17, "If OldACSoftcapRules: RNG/BST armorclass softcap increase-factor") +RULE_REAL(Combat, CasterACSoftcapReturn, 0.06, "If OldACSoftcapRules: WIZ/MAG/NEC/ENC/DRU armorclass softcap increase-factor") +RULE_REAL(Combat, MiscACSoftcapReturn, 0.3, "If OldACSoftcapRules true/false: unspecified classes armorclass softcap increase-factor") +RULE_BOOL(Combat, OldACSoftcapRules, false, "Setting if the old softcap values should be used") +RULE_BOOL(Combat, UseOldDamageIntervalRules, false, "Use old damage formulas for everything") +RULE_REAL(Combat, WarACSoftcapReturn, 0.3448, "WAR armorclass softcap increase-factor") +RULE_REAL(Combat, ClrRngMnkBrdACSoftcapReturn, 0.3030, "CLR/RNG/MNK/BRD armorclass softcap increase-factor") +RULE_REAL(Combat, PalShdACSoftcapReturn, 0.3226, "SHD/PAL armorclass softcap increase-factor") +RULE_REAL(Combat, DruNecWizEncMagACSoftcapReturn, 0.2000, "DRU/NEC/WIZ/ENC/MAG softcap increase-factor") +RULE_REAL(Combat, RogShmBstBerACSoftcapReturn, 0.2500, "ROG/SHM/BST/BER softcap increase-factor") +RULE_REAL(Combat, SoftcapFactor, 1.88, "When UseIntervalAC is enabled, the softcap for mitigation capability is multiplied by this value") +RULE_REAL(Combat, ACthac0Factor, 0.55, "If a mob is attacked and the attack roll is greater than his defense roll, the attack rating is multiplied by this value") +RULE_REAL(Combat, ACthac20Factor, 0.55, "If a mob is attacked and his defense roll is greater than the attack roll, the attack rating is multiplied by this value") +RULE_INT(Combat, HitCapPre20, 40, "Hit cap before level 20. Live has it capped at 40") +RULE_INT(Combat, HitCapPre10, 20, "Hit cap before level 10. Live has it capped at 20") +RULE_INT(Combat, MinHastedDelay, 400, "Minimum hasted combat delay") +RULE_REAL(Combat, AvgDefProcsPerMinute, 2.0, "Average defense procs per minute") RULE_REAL(Combat, DefProcPerMinAgiContrib, 0.075, "How much agility contributes to defensive proc rate") RULE_INT(Combat, SpecialAttackACBonus, 15, "Percent amount of damage per AC gained for certain special attacks (damage = AC*SpecialAttackACBonus/100)") RULE_INT(Combat, NPCFlurryChance, 20, "Chance for NPC to flurry") RULE_BOOL (Combat,TauntOverLevel, 1, "Allows you to taunt NPC's over warriors level") -RULE_REAL (Combat,TauntSkillFalloff, 0.33, "For every taunt skill point that's not maxed you lose this % chance to taunt") -RULE_BOOL (Combat,EXPFromDmgShield, false, "Determine if damage from a damage shield counts for EXP gain") -RULE_INT(Combat, MonkACBonusWeight, 15, "") -RULE_INT(Combat, ClientStunLevel, 55, "This is the level where client kicks and bashes can stun the target") +RULE_REAL (Combat,TauntSkillFalloff, 0.33, "For every taunt skill point that's not maxed you lose this percentage chance to taunt") +RULE_BOOL (Combat,EXPFromDmgShield, false, "Determine if damage from a damage shield counts for experience gain") +RULE_INT(Combat, MonkACBonusWeight, 15, "Usually, a monk under this weight threshold gets an AC bonus") RULE_INT(Combat, QuiverHasteCap, 1000, "Quiver haste cap 1000 on live for a while, currently 700 on live") -RULE_BOOL(Combat, UseArcheryBonusRoll, false, "Make the 51+ archery bonus require an actual roll") -RULE_INT(Combat, ArcheryBonusChance, 50, "") -RULE_INT(Combat, BerserkerFrenzyStart, 35, "") -RULE_INT(Combat, BerserkerFrenzyEnd, 45, "") +RULE_INT(Combat, BerserkerFrenzyStart, 35, "Percentage Health Points below which Warrior and Berserker start frenzy") +RULE_INT(Combat, BerserkerFrenzyEnd, 45, "Percentage Health Points above which Warrior and Berserker end frenzy") RULE_BOOL(Combat, OneProcPerWeapon, true, "If enabled, One proc per weapon per round") -RULE_BOOL(Combat, ProjectileDmgOnImpact, true, "If enabled, projectiles (ie arrows) will hit on impact, instead of instantly") -RULE_BOOL(Combat, MeleePush, true, "enable melee push") -RULE_INT(Combat, MeleePushChance, 50, "(NPCs) chance the target will be pushed. Made up, 100 actually isn't that bad") -RULE_BOOL(Combat, UseLiveCombatRounds, true, "turn this false if you don't want to worry about fixing up combat rounds for NPCs") -RULE_INT(Combat, NPCAssistCap, 5, "Maxiumium number of NPCs that will assist another NPC at once") -RULE_INT(Combat, NPCAssistCapTimer, 6000, "Time in milliseconds a NPC will take to clear assist aggro cap space") -RULE_BOOL(Combat, UseRevampHandToHand, false, "use h2h revamped dmg/delays I believe this was implemented during SoF") -RULE_BOOL(Combat, ClassicMasterWu, false, "classic master wu uses a random special, modern doesn't") -RULE_INT(Combat, LevelToStopDamageCaps, 0, "1 will effectively disable them, 20 should give basically same results as old incorrect system") -RULE_INT(Combat, LevelToStopACTwinkControl, 50, "1 will effectively disable it, 50 should give basically same results as current system") -RULE_BOOL(Combat, ClassicNPCBackstab, false, "true disables npc facestab - npcs get normal attack if not behind") +RULE_BOOL(Combat, ProjectileDmgOnImpact, true, "If enabled, projectiles (i.e. arrows) will hit on impact, instead of instantly") +RULE_BOOL(Combat, MeleePush, true, "Enable melee push") +RULE_INT(Combat, MeleePushChance, 50, "NPC chance the target will be pushed. Made up, 100 actually isn't that bad") +RULE_BOOL(Combat, UseLiveCombatRounds, true, "Turn this false if you don't want to worry about fixing up combat rounds for NPCs") +RULE_INT(Combat, NPCAssistCap, 5, "Maximum number of NPC that will assist another NPC at once") +RULE_INT(Combat, NPCAssistCapTimer, 6000, "Time a NPC will take to clear assist aggro cap space (milliseconds)") +RULE_BOOL(Combat, UseRevampHandToHand, false, "Use h2h revamped dmg/delays I believe this was implemented during SoF") +RULE_BOOL(Combat, ClassicMasterWu, false, "Classic Master Wu uses a random special, modern doesn't") +RULE_REAL(Combat, HitBoxMod, 1.00, "Added to test hit boxes.") +RULE_INT(Combat, LevelToStopDamageCaps, 0, "Level to stop damage caps. 1 will effectively disable them, 20 should give basically same results as old incorrect system") +RULE_INT(Combat, LevelToStopACTwinkControl, 50, "Level to stop armorclass twink control. 1 will effectively disable it, 50 should give basically same results as current system") +RULE_BOOL(Combat, ClassicNPCBackstab, false, "True disables NPC facestab - NPC get normal attack if not behind") RULE_BOOL(Combat, UseNPCDamageClassLevelMods, true, "Uses GetClassLevelDamageMod calc in npc_scale_manager") RULE_BOOL(Combat, UseExtendedPoisonProcs, false, "Allow old school poisons to last until characrer zones, at a lower proc rate") +RULE_BOOL(Combat, EnableSneakPull, false, "Enable implementation of Sneak Pull") +RULE_INT(Combat, SneakPullAssistRange, 400, "Modified range of assist for sneak pull") RULE_CATEGORY_END() RULE_CATEGORY(NPC) -RULE_INT(NPC, MinorNPCCorpseDecayTimeMS, 450000, "level < 55") -RULE_INT(NPC, MajorNPCCorpseDecayTimeMS, 1500000, "level >= 55") -RULE_INT(NPC, CorpseUnlockTimer, 150000, "") -RULE_INT(NPC, EmptyNPCCorpseDecayTimeMS, 0, "") -RULE_BOOL(NPC, UseItemBonusesForNonPets, true, "") -RULE_BOOL(NPC, UseBaneDamage, false, "") -RULE_INT(NPC, SayPauseTimeInSec, 5, "") -RULE_INT(NPC, OOCRegen, 0, "") -RULE_BOOL(NPC, BuffFriends, false, "") -RULE_BOOL(NPC, EnableNPCQuestJournal, false, "") -RULE_INT(NPC, LastFightingDelayMovingMin, 10000, "") -RULE_INT(NPC, LastFightingDelayMovingMax, 20000, "") -RULE_BOOL(NPC, SmartLastFightingDelayMoving, true, "") -RULE_BOOL(NPC, ReturnNonQuestNoDropItems, false, "Returns NO DROP items on NPCs that don't have an EVENT_TRADE sub in their script") -RULE_INT(NPC, StartEnrageValue, 9, "% HP that an NPC will begin to enrage") +RULE_INT(NPC, MinorNPCCorpseDecayTimeMS, 450000, "NPC corpse decay time, if NPC below level 55 (milliseconds)") +RULE_INT(NPC, MajorNPCCorpseDecayTimeMS, 1500000, "NPC corpse decay time, if NPC equal or greater than level 55 (milliseconds)") +RULE_INT(NPC, CorpseUnlockTimer, 150000, "Time after which corpses are unlocked for everyone to loot (milliseconds)") +RULE_INT(NPC, EmptyNPCCorpseDecayTimeMS, 0, "NPC corpse decay time, if no items are left on the corpse (milliseconds)") +RULE_BOOL(NPC, UseItemBonusesForNonPets, true, "Switch whether item bonuses should be used for NPCs who are not pets") +RULE_BOOL(NPC, UseBaneDamage, false, "If NPCs can't inherently hit the target we don't add bane/magic dmg which isn't exactly the same as PCs") +RULE_INT(NPC, SayPauseTimeInSec, 5, "Time span in which an NPC pauses his movement after a Say event without aggro (seconds)") +RULE_INT(NPC, OOCRegen, 0, "Enable out-of-combat regeneration for NPC") +RULE_BOOL(NPC, BuffFriends, false, "Setting whether NPC should buff other NPC") +RULE_BOOL(NPC, EnableNPCQuestJournal, false, "Setting whether the NPC Quest Journal is active") +RULE_INT(NPC, LastFightingDelayMovingMin, 10000, "Minimum time before mob goes home after all aggro loss (milliseconds)") +RULE_INT(NPC, LastFightingDelayMovingMax, 20000, "Maximum time before mob goes home after all aggro loss (milliseconds)") +RULE_BOOL(NPC, SmartLastFightingDelayMoving, true, "When true, mobs that started going home previously will do so again immediately if still on FD hate list") +RULE_BOOL(NPC, ReturnNonQuestNoDropItems, false, "Returns NO DROP items on NPC that don't have an EVENT_TRADE sub in their script") +RULE_INT(NPC, StartEnrageValue, 9, " Percentage HP that an NPC will begin to enrage") RULE_BOOL(NPC, LiveLikeEnrage, false, "If set to true then only player controlled pets will enrage") -RULE_BOOL(NPC, EnableMeritBasedFaction, false, "If set to true, faction will given in the same way as experience (solo/group/raid)") -RULE_INT(NPC, NPCToNPCAggroTimerMin, 500, "") -RULE_INT(NPC, NPCToNPCAggroTimerMax, 6000, "") -RULE_BOOL(NPC, UseClassAsLastName, true, "Uses class archetype as LastName for npcs with none") +RULE_BOOL(NPC, EnableMeritBasedFaction, false, "If set to true, faction will be given in the same way as experience (solo/group/raid)") +RULE_INT(NPC, NPCToNPCAggroTimerMin, 500, "Minimum time span after which one NPC aggro another NPC (milliseconds)") +RULE_INT(NPC, NPCToNPCAggroTimerMax, 6000, "Maximum time span after which one NPC aggro another NPC (milliseconds)") +RULE_BOOL(NPC, UseClassAsLastName, true, "Uses class archetype as LastName for NPC with none") RULE_BOOL(NPC, NewLevelScaling, true, "Better level scaling, use old if new formulas would break your server") -RULE_INT(NPC, NPCGatePercent, 20, "% at which the NPC Will attempt to gate at") +RULE_INT(NPC, NPCGatePercent, 20, " Percentage at which the NPC Will attempt to gate at") RULE_BOOL(NPC, NPCGateNearBind, false, "Will NPC attempt to gate when near bind location?") RULE_INT(NPC, NPCGateDistanceBind, 75, "Distance from bind before NPC will attempt to gate") RULE_BOOL(NPC, NPCHealOnGate, true, "Will the NPC Heal on Gate") RULE_BOOL(NPC, UseMeditateBasedManaRegen, false, "Based NPC ooc regen on Meditate skill") -RULE_REAL(NPC, NPCHealOnGateAmount, 25, "How much the npc will heal on gate if enabled") +RULE_REAL(NPC, NPCHealOnGateAmount, 25, "How much the NPC will heal on gate if enabled") +RULE_BOOL(NPC, AnimalsOpenDoors, true, "Determines or not whether animals open doors or not when they approach them") RULE_CATEGORY_END() RULE_CATEGORY(Aggro) -RULE_BOOL(Aggro, SmartAggroList, true, "") -RULE_INT(Aggro, SittingAggroMod, 35, "35%") -RULE_INT(Aggro, MeleeRangeAggroMod, 10, "10%") -RULE_INT(Aggro, CurrentTargetAggroMod, 0, "0% -- will prefer our current target to any other; makes it harder for our npcs to switch targets") -RULE_INT(Aggro, CriticallyWoundedAggroMod, 100, "100%") -RULE_INT(Aggro, SpellAggroMod, 100, "") -RULE_INT(Aggro, SongAggroMod, 33, "") -RULE_INT(Aggro, PetSpellAggroMod, 10, "") -RULE_REAL(Aggro, TunnelVisionAggroMod, 0.75, "people not currently the top hate generate this much hate on a Tunnel Vision mob") -RULE_INT(Aggro, MaxScalingProcAggro, 400, "Set to -1 for no limit. Maxmimum amount of aggro that HP scaling SPA effect in a proc will add") -RULE_INT(Aggro, IntAggroThreshold, 75, "Int <= this will aggro regardless of level difference") +RULE_BOOL(Aggro, SmartAggroList, true, "Smart aggro list attempts to choose targets in a much smarter fashion, prefering players to pets, sitting and critically injured players to normal players, and players in melee range to players not") +RULE_INT(Aggro, SittingAggroMod, 35, "Aggro increase against sitting targets. 35=35%") +RULE_INT(Aggro, MeleeRangeAggroMod, 10, "Aggro increase against targets in melee range. 10=10%") +RULE_INT(Aggro, CurrentTargetAggroMod, 0, "Aggro increase against current target. 0% = prefer the current target to any other. Makes it harder for our NPC to switch targets") +RULE_INT(Aggro, CriticallyWoundedAggroMod, 100, "Aggro increase against critical wounded targets") +RULE_INT(Aggro, SpellAggroMod, 100, "Aggro increase for spells") +RULE_INT(Aggro, PetSpellAggroMod, 10, "Aggro increase for pet spells") +RULE_REAL(Aggro, TunnelVisionAggroMod, 0.75, "People not currently the top hate generate this much hate on a Tunnel Vision mob") +RULE_INT(Aggro, MaxScalingProcAggro, 400, "Set to -1 for no limit. Maximum amount of aggro that HP scaling SPA effect in a proc will add") +RULE_INT(Aggro, IntAggroThreshold, 75, "Int lesser or equal the value will aggro regardless of level difference") RULE_BOOL(Aggro, AllowTickPulling, false, "tick pulling is an exploit in an NPC's call for help fixed sometime in 2006 on live") -RULE_INT(Aggro, MinAggroLevel, 18, "For use with UseLevelAggro") -RULE_BOOL(Aggro, UseLevelAggro, true, "MinAggroLevel rule value+ and Undead will aggro regardless of level difference. (this will disabled Rule:IntAggroThreshold if set to true)") -RULE_INT(Aggro, ClientAggroCheckInterval, 6, "Interval in which clients actually check for aggro - in seconds") -RULE_REAL(Aggro, PetAttackRange, 40000.0, "max squared range /pet attack works at default is 200") +RULE_INT(Aggro, MinAggroLevel, 18, "Minimum level for use with UseLevelAggro") +RULE_BOOL(Aggro, UseLevelAggro, true, "MinAggroLevel rule value+ and Undead will aggro regardless of level difference. This will disabled Rule:IntAggroThreshold if set to true") +RULE_INT(Aggro, ClientAggroCheckMovingInterval, 1000, "Interval in which clients actually check for aggro while moving - in milliseconds - this should be lower than ClientAggroCheckIdleInterval") +RULE_INT(Aggro, ClientAggroCheckIdleInterval, 6000, "Interval in which clients actually check for aggro while idle - in milliseconds - this should be higher than ClientAggroCheckMovingInterval") +RULE_REAL(Aggro, PetAttackRange, 40000.0, "Maximum squared range /pet attack works at default is 200") RULE_BOOL(Aggro, NPCAggroMaxDistanceEnabled, true, "If enabled, NPC's will drop aggro beyond 600 units or what is defined at the zone level") RULE_CATEGORY_END() RULE_CATEGORY(TaskSystem) RULE_BOOL(TaskSystem, EnableTaskSystem, true, "Globally enable or disable the Task system") RULE_INT(TaskSystem, PeriodicCheckTimer, 5, "Seconds between checks for failed tasks. Also used by the 'Touch' activity") -RULE_BOOL(TaskSystem, RecordCompletedTasks, true, "") -RULE_BOOL(TaskSystem, RecordCompletedOptionalActivities, false, "") -RULE_BOOL(TaskSystem, KeepOneRecordPerCompletedTask, true, "") -RULE_BOOL(TaskSystem, EnableTaskProximity, true, "") +RULE_BOOL(TaskSystem, RecordCompletedTasks, true, "Record completed tasks") +RULE_BOOL(TaskSystem, RecordCompletedOptionalActivities, false, "Record completed optional activities") +RULE_BOOL(TaskSystem, KeepOneRecordPerCompletedTask, true, "Keep only one record per completed task") +RULE_BOOL(TaskSystem, EnableTaskProximity, true, "Enable task proximity system") RULE_CATEGORY_END() RULE_CATEGORY(Range) -RULE_INT(Range, Say, 15, "") -RULE_INT(Range, Emote, 135, "") -RULE_INT(Range, BeginCast, 200, "") -RULE_INT(Range, Anims, 135, "") -RULE_INT(Range, SpellParticles, 135, "") -RULE_INT(Range, DamageMessages, 50, "") -RULE_INT(Range, SpellMessages, 75, "") -RULE_INT(Range, SongMessages, 75, "") -RULE_INT(Range, MobPositionUpdates, 600, "") -RULE_INT(Range, ClientPositionUpdates, 300, "") -RULE_INT(Range, ClientForceSpawnUpdateRange, 1000, "") -RULE_INT(Range, CriticalDamage, 80, "") -RULE_INT(Range, MobCloseScanDistance, 600, "") +RULE_INT(Range, Say, 15, "The range that is required before /say or hail messages will work to an NPC") +RULE_INT(Range, Emote, 135, "The packet range in which emote messages are sent'") +RULE_INT(Range, BeginCast, 200, "The packet range in which begin cast messages are sent") +RULE_INT(Range, Anims, 135, "The packet range in which begin cast messages are sent") +RULE_INT(Range, SpellParticles, 135, "The packet range in which spell particles are sent") +RULE_INT(Range, DamageMessages, 50, "The packet range in which damage messages are sent (non-crit)") +RULE_INT(Range, SpellMessages, 75, "The packet range in which spell damage messages are sent") +RULE_INT(Range, SongMessages, 75, "The packet range in which song messages are sent") +RULE_INT(Range, ClientPositionUpdates, 300, "Distance in which the own changed position is communicated to other clients") +RULE_INT(Range, CriticalDamage, 80, "The packet range in which critical hit messages are sent") +RULE_INT(Range, MobCloseScanDistance, 600, "Close scan distance") RULE_CATEGORY_END() @@ -582,7 +546,7 @@ RULE_CATEGORY_END() RULE_CATEGORY(Bots) RULE_INT(Bots, BotExpansionSettings, 16383, "Sets the expansion settings for bot use. Defaults to all expansions enabled up to TSS") RULE_BOOL(Bots, AllowCamelCaseNames, false, "Allows the use of 'MyBot' type names") -RULE_INT(Bots, CommandSpellRank, 1, "Filters bot command spells by rank (1, 2 and 3 are valid filters - any other number allows all ranks)") +RULE_INT(Bots, CommandSpellRank, 1, "Filters bot command spells by rank. 1, 2 and 3 are valid filters - any other number allows all ranks") RULE_INT(Bots, CreationLimit, 150, "Number of bots that each account can create") RULE_BOOL(Bots, FinishBuffing, false, "Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat") RULE_BOOL(Bots, GroupBuffing, false, "Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB") @@ -591,15 +555,10 @@ RULE_INT(Bots, HealRotationMaxTargets, 12, "Maximum number of heal rotation targ RULE_REAL(Bots, ManaRegen, 2.0, "Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players") RULE_BOOL(Bots, PreferNoManaCommandSpells, true, "Give sorting priority to newer no-mana spells (i.e., 'Bind Affinity')") RULE_BOOL(Bots, QuestableSpawnLimit, false, "Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl") -RULE_BOOL(Bots, QuestableSpells, false, "Anita Thrall's (Anita_Thrall.pl) Bot Spell Scriber quests") -RULE_INT(Bots, SpawnLimit, 71, "Number of bots a character can have spawned at one time, You + 71 bots is a 12 group pseudo-raid (bots are not raidable at this time)") -RULE_BOOL(Bots, UpdatePositionWithTimer, false, "Sends a position update with every positive movement timer check") -RULE_BOOL(Bots, UsePathing, true, "Bots will use node pathing when moving") -RULE_BOOL(Bots, BotGroupXP, false, "Determines whether client gets xp for bots outside their group") -RULE_BOOL(Bots, BotBardUseOutOfCombatSongs, true, "Determines whether bard bots use additional out of combat songs (optional script)") +RULE_INT(Bots, SpawnLimit, 71, "Number of bots a character can have spawned at one time, You + 71 bots is a 12 group pseudo-raid") +RULE_BOOL(Bots, BotGroupXP, false, "Determines whether client gets experience for bots outside their group") RULE_BOOL(Bots, BotLevelsWithOwner, false, "Auto-updates spawned bots as owner levels/de-levels (false is original behavior)") -RULE_BOOL(Bots, BotCharacterLevelEnabled, false, "Enables required level to spawn bots") -RULE_INT(Bots, BotCharacterLevel, 0, "0 as default (if level > this value you can spawn bots if BotCharacterLevelEnabled is true)") +RULE_INT(Bots, BotCharacterLevel, 0, "If level is greater that value player can spawn bots if BotCharacterLevelEnabled is true") RULE_INT(Bots, CasterStopMeleeLevel, 13, "Level at which caster bots stop melee attacks") RULE_INT(Bots, AllowedClasses, 0xFFFFFFFF, "Bitmask of allowed bot classes") RULE_INT(Bots, AllowedRaces, 0xFFFFFFFF, "Bitmask of allowed bot races") @@ -614,20 +573,20 @@ RULE_CATEGORY_END() #endif RULE_CATEGORY(Chat) -RULE_BOOL(Chat, ServerWideOOC, true, "") -RULE_BOOL(Chat, ServerWideAuction, true, "") -RULE_BOOL(Chat, EnableVoiceMacros, true, "") -RULE_BOOL(Chat, EnableMailKeyIPVerification, true, "") -RULE_BOOL(Chat, EnableAntiSpam, true, "") -RULE_BOOL(Chat, SuppressCommandErrors, false, "Do not suppress by default") -RULE_INT(Chat, MinStatusToBypassAntiSpam, 100, "") -RULE_INT(Chat, MinimumMessagesPerInterval, 4, "") -RULE_INT(Chat, MaximumMessagesPerInterval, 12, "") -RULE_INT(Chat, MaxMessagesBeforeKick, 20, "") -RULE_INT(Chat, IntervalDurationMS, 60000, "") -RULE_INT(Chat, KarmaUpdateIntervalMS, 1200000, "") -RULE_INT(Chat, KarmaGlobalChatLimit, 72, "amount of karma you need to be able to talk in ooc/auction/chat below the level limit") -RULE_INT(Chat, GlobalChatLevelLimit, 8, "level limit you need to of reached to talk in ooc/auction/chat if your karma is too low") +RULE_BOOL(Chat, ServerWideOOC, true, "Enable server wide ooc-chat") +RULE_BOOL(Chat, ServerWideAuction, true, "Enable server wide auction-chat") +RULE_BOOL(Chat, EnableVoiceMacros, true, "Enable voice macros") +RULE_BOOL(Chat, EnableMailKeyIPVerification, true, "Setting whether the authenticity of the client should be verified via its IP address when accessing the InGame mailbox") +RULE_BOOL(Chat, EnableAntiSpam, true, "Enable anti-spam system for chat") +RULE_BOOL(Chat, SuppressCommandErrors, false, "Do not suppress command errors by default") +RULE_INT(Chat, MinStatusToBypassAntiSpam, 100, "Minimum status to bypass the anti-spam system") +RULE_INT(Chat, MinimumMessagesPerInterval, 4, "Minimum number of chat messages allowed per interval. The karma value is added to this value") +RULE_INT(Chat, MaximumMessagesPerInterval, 12, "Maximum value of chat messages allowed per interval") +RULE_INT(Chat, MaxMessagesBeforeKick, 20, "If an attempt is made to send more than the maximum allowed number of chat messages per interval, the client will be disconnected after this absolute number of messages") +RULE_INT(Chat, IntervalDurationMS, 60000, "Interval length in milliseconds") +RULE_INT(Chat, KarmaUpdateIntervalMS, 1200000, "Karma update interval in milliseconds") +RULE_INT(Chat, KarmaGlobalChatLimit, 72, "Amount of karma you need to be able to talk in ooc/auction/chat below the level limit") +RULE_INT(Chat, GlobalChatLevelLimit, 8, "Level limit you need to of reached to talk in ooc/auction/chat if your karma is too low") RULE_CATEGORY_END() RULE_CATEGORY(Merchant) @@ -639,21 +598,21 @@ RULE_INT(Merchant, PricePenaltyPct, 4, "Determines maximum price penalty from ha RULE_REAL(Merchant, ChaBonusMod, 3.45, "Determines CHA cap, from 104 CHA. 3.45 is 132 CHA at apprehensive. 0.34 is 400 CHA at apprehensive") RULE_REAL(Merchant, ChaPenaltyMod, 1.52, "Determines CHA bottom, up to 102 CHA. 1.52 is 37 CHA at apprehensive. 0.98 is 0 CHA at apprehensive") RULE_BOOL(Merchant, EnableAltCurrencySell, true, "Enables the ability to resell items to alternate currency merchants") -RULE_BOOL(Merchant, AllowCorpse, false, "Can merchants generate a corpse") +RULE_BOOL(Merchant, AllowCorpse, false, "Setting whether dealers leave a corpse behind ") RULE_CATEGORY_END() RULE_CATEGORY(Bazaar) -RULE_BOOL(Bazaar, AuditTrail, false, "") -RULE_INT(Bazaar, MaxSearchResults, 50, "") -RULE_BOOL(Bazaar, EnableWarpToTrader, true, "") -RULE_INT(Bazaar, MaxBarterSearchResults, 200, "The max results returned in the /barter search") +RULE_BOOL(Bazaar, AuditTrail, false, "Setting whether a path to the trader should be displayed in the bazaar") +RULE_INT(Bazaar, MaxSearchResults, 50, "Maximum number of search results in Bazaar") +RULE_BOOL(Bazaar, EnableWarpToTrader, true, "Setting whether teleport to the selected trader should be active") +RULE_INT(Bazaar, MaxBarterSearchResults, 200, "The maximum results returned in the /barter search") RULE_CATEGORY_END() RULE_CATEGORY(Mail) -RULE_BOOL(Mail, EnableMailSystem, true, "If false, client won't bring up the Mail window") -RULE_INT(Mail, ExpireTrash, 0, "Time in seconds. 0 will delete all messages in the trash when the mailserver starts") -RULE_INT(Mail, ExpireRead, 31536000, "1 Year. Set to -1 for never") -RULE_INT(Mail, ExpireUnread, 31536000, "1 Year. Set to -1 for never") +RULE_BOOL(Mail, EnableMailSystem, true, "Setting whether the mail system is activated. If false, client won't bring up the Mail window") +RULE_INT(Mail, ExpireTrash, 0, "Setting when the mail trash is emptied. Time in seconds. 0 will delete all messages in the trash when the mailserver starts") +RULE_INT(Mail, ExpireRead, 31536000, "Setting when read mails expire. 31536000=1 Year. Set to -1 for never") +RULE_INT(Mail, ExpireUnread, 31536000, "Setting when unread mails expire. 31536000=1 Year. Set to -1 for never") RULE_CATEGORY_END() RULE_CATEGORY(Channels) @@ -668,30 +627,27 @@ RULE_BOOL(EventLog, RecordBuyFromMerchant, false, "Record purchases by a player RULE_CATEGORY_END() RULE_CATEGORY(Adventure) -RULE_INT(Adventure, MinNumberForGroup, 2, "") -RULE_INT(Adventure, MaxNumberForGroup, 6, "") -RULE_INT(Adventure, MinNumberForRaid, 18, "") -RULE_INT(Adventure, MaxNumberForRaid, 36, "") -RULE_INT(Adventure, MaxLevelRange, 9, "") -RULE_INT(Adventure, NumberKillsForBossSpawn, 45, "") -RULE_REAL(Adventure, DistanceForRescueAccept, 10000.0, "") -RULE_REAL(Adventure, DistanceForRescueComplete, 2500.0, "") -RULE_INT(Adventure, ItemIDToEnablePorts, 41000, "0 to disable, otherwise using a LDoN portal will require the user to have this item") -RULE_INT(Adventure, LDoNTrapDistanceUse, 625, "") -RULE_REAL(Adventure, LDoNBaseTrapDifficulty, 15.0, "") -RULE_REAL(Adventure, LDoNCriticalFailTrapThreshold, 10.0, "") -RULE_INT(Adventure, LDoNAdventureExpireTime, 1800, "30 minutes to expire") +RULE_INT(Adventure, MinNumberForGroup, 2, "Minimum members for adventure group") +RULE_INT(Adventure, MaxNumberForGroup, 6, "Maximum members for adventure group") +RULE_INT(Adventure, MaxLevelRange, 9, "Maximum level range for adventure") +RULE_INT(Adventure, NumberKillsForBossSpawn, 45, "Number of adventure kills to make the boss spawn") +RULE_REAL(Adventure, DistanceForRescueAccept, 10000.0, "Distance for adventure rescue accept") +RULE_REAL(Adventure, DistanceForRescueComplete, 2500.0, "Distance for adventure rescue complete") +RULE_INT(Adventure, ItemIDToEnablePorts, 41000, "ItemID to enable adventure ports. 0 to disable, otherwise using a LDoN portal will require the user to have this item") +RULE_INT(Adventure, LDoNTrapDistanceUse, 625, "LDoN trap distance use") +RULE_REAL(Adventure, LDoNBaseTrapDifficulty, 15.0, "LDoN base trap difficulty") +RULE_REAL(Adventure, LDoNCriticalFailTrapThreshold, 10.0, "LDoN critical fail trap threshold") RULE_CATEGORY_END() RULE_CATEGORY(AA) -RULE_INT(AA, ExpPerPoint, 23976503, "Amount of exp per AA. Is the same as the amount of exp to go from level 51 to level 52") -RULE_BOOL(AA, Stacking, true, "Allow AA that belong to the same group to stack on SOF+ clients") -RULE_BOOL(AA, NormalizedAAEnabled, false, "TSS+ change to AA that normalizes AA XP to a fixed # of white con kills independent of level") +RULE_INT(AA, ExpPerPoint, 23976503, "Amount of experience per AA. Is the same as the amount of experience to go from level 51 to level 52") +RULE_BOOL(AA, NormalizedAAEnabled, false, "TSS+ change to AA that normalizes AA experience to a fixed # of white con kills independent of level") RULE_INT(AA, NormalizedAANumberOfWhiteConPerAA, 25, "The number of white con kills per AA point") -RULE_BOOL(AA, ModernAAScalingEnabled, false, "Are we linearly scaling AA XP based on total # of earned AA?") -RULE_REAL(AA, ModernAAScalingStartPercent, 1000, "1000% or 10x AA XP at the start of the scaling range") -RULE_INT(AA, ModernAAScalingAAMinimum, 0, "The minimum number of earned AA before AA XP scaling begins") -RULE_INT(AA, ModernAAScalingAALimit, 4000, "The number of earned AA when AA XP scaling ends") +RULE_BOOL(AA, ModernAAScalingEnabled, false, "Are we linearly scaling AA experience based on total # of earned AA?") +RULE_REAL(AA, ModernAAScalingStartPercent, 1000, "1000% or 10x AA experience at the start of the scaling range") +RULE_INT(AA, ModernAAScalingAAMinimum, 0, "The minimum number of earned AA before AA experience scaling begins") +RULE_INT(AA, ModernAAScalingAALimit, 4000, "The number of earned AA when AA experience scaling ends") +RULE_BOOL(AA, SoundForAAEarned, false, "Play sound when AA point earned") RULE_CATEGORY_END() RULE_CATEGORY(Console) @@ -699,38 +655,34 @@ RULE_INT(Console, SessionTimeOut, 600000, "Amount of time in ms for the console RULE_CATEGORY_END() RULE_CATEGORY(Network) -RULE_INT(Network, ResendDelayBaseMS, 100, "") -RULE_REAL(Network, ResendDelayFactor, 1.5, "") -RULE_INT(Network, ResendDelayMinMS, 300, "") -RULE_INT(Network, ResendDelayMaxMS, 5000, "") +RULE_INT(Network, ResendDelayBaseMS, 100, "Base delay for resending data in EQStreamManager (milliseconds)") +RULE_REAL(Network, ResendDelayFactor, 1.5, "Multiplier for the base delay when resending data in EQStreamManager") +RULE_INT(Network, ResendDelayMinMS, 300, "Minimum timespan between two send retries (milliseconds)") +RULE_INT(Network, ResendDelayMaxMS, 5000, "Maximum timespan between two send retries (milliseconds)") RULE_REAL(Network, ClientDataRate, 0.0, "KB / sec, 0.0 disabled") -RULE_BOOL(Network, CompressZoneStream, true, "") +RULE_BOOL(Network, CompressZoneStream, true, "Setting whether the zone stream should be compressed for transmission") RULE_CATEGORY_END() RULE_CATEGORY(QueryServ) -RULE_BOOL(QueryServ, PlayerLogChat, false, "Logs Player Chat") -RULE_BOOL(QueryServ, PlayerLogTrades, false, "Logs Player Trades") -RULE_BOOL(QueryServ, PlayerDropItems, false, "Logs Player dropping items") -RULE_BOOL(QueryServ, PlayerLogHandins, false, "Logs Player Handins") -RULE_BOOL(QueryServ, PlayerLogNPCKills, false, "Logs Player NPC Kills") -RULE_BOOL(QueryServ, PlayerLogDeletes, false, "Logs Player Deletes") -RULE_BOOL(QueryServ, PlayerLogMoves, false, "Logs Player Moves") -RULE_BOOL(QueryServ, PlayerLogMerchantTransactions, false, "Logs Merchant Transactions") -RULE_BOOL(QueryServ, PlayerLogPCCoordinates, false, "Logs Player Coordinates with certain events") -RULE_BOOL(QueryServ, PlayerLogDropItem, false, "Logs Player Drop Item") -RULE_BOOL(QueryServ, PlayerLogZone, false, "Logs Player Zone Events") -RULE_BOOL(QueryServ, PlayerLogDeaths, false, "Logs Player Deaths") -RULE_BOOL(QueryServ, PlayerLogConnectDisconnect, false, "Logs Player Connect Disconnect State") -RULE_BOOL(QueryServ, PlayerLogLevels, false, "Logs Player Leveling/Deleveling") -RULE_BOOL(QueryServ, PlayerLogAARate, false, "Logs Player AA Experience Rates") -RULE_BOOL(QueryServ, PlayerLogQGlobalUpdate, false, "Logs Player QGlobal Updates") -RULE_BOOL(QueryServ, PlayerLogTaskUpdates, false, "Logs Player Task Updates") -RULE_BOOL(QueryServ, PlayerLogKeyringAddition, false, "Log PLayer Keyring additions") -RULE_BOOL(QueryServ, PlayerLogAAPurchases, false, "Log Player AA Purchases") -RULE_BOOL(QueryServ, PlayerLogTradeSkillEvents, false, "Log Player Tradeskill Transactions") -RULE_BOOL(QueryServ, PlayerLogIssuedCommandes, false, "Log Player Issued Commands") -RULE_BOOL(QueryServ, PlayerLogMoneyTransactions, false, "Log Player Money Transaction/Splits") -RULE_BOOL(QueryServ, PlayerLogAlternateCurrencyTransactions, false, "Log Player Alternate Currency Transactions") +RULE_BOOL(QueryServ, PlayerLogChat, false, "Log player chat") +RULE_BOOL(QueryServ, PlayerLogTrades, false, "Log player trades") +RULE_BOOL(QueryServ, PlayerDropItems, false, "Log player dropping items") +RULE_BOOL(QueryServ, PlayerLogHandins, false, "Log player hand ins") +RULE_BOOL(QueryServ, PlayerLogNPCKills, false, "Log player NPC kills") +RULE_BOOL(QueryServ, PlayerLogDeletes, false, "Log player deletes") +RULE_BOOL(QueryServ, PlayerLogMoves, false, "Log player moves") +RULE_BOOL(QueryServ, PlayerLogMerchantTransactions, false, "Log merchant transactions") +RULE_BOOL(QueryServ, PlayerLogZone, false, "Log player zone events") +RULE_BOOL(QueryServ, PlayerLogDeaths, false, "Log player deaths") +RULE_BOOL(QueryServ, PlayerLogConnectDisconnect, false, "Logs player connect/disconnect state") +RULE_BOOL(QueryServ, PlayerLogLevels, false, "Log player leveling/deleveling") +RULE_BOOL(QueryServ, PlayerLogAARate, false, "Log player AA experience rates") +RULE_BOOL(QueryServ, PlayerLogQGlobalUpdate, false, "Log player QGlobal updates") +RULE_BOOL(QueryServ, PlayerLogTaskUpdates, false, "Log player Task updates") +RULE_BOOL(QueryServ, PlayerLogAAPurchases, false, "Log player AA purchases") +RULE_BOOL(QueryServ, PlayerLogTradeSkillEvents, false, "Log player tradeskill transactions") +RULE_BOOL(QueryServ, PlayerLogIssuedCommandes, false, "Log player issued commands") +RULE_BOOL(QueryServ, PlayerLogAlternateCurrencyTransactions, false, "Log player alternate currency transactions") RULE_CATEGORY_END() RULE_CATEGORY(Inventory) @@ -743,8 +695,8 @@ RULE_BOOL(Inventory, TransformSummonedBags, false, "Transforms summoned bags int RULE_CATEGORY_END() RULE_CATEGORY(Client) -RULE_BOOL(Client, UseLiveFactionMessage, false, "Allows players to see faction adjustments like Live") -RULE_BOOL(Client, UseLiveBlockedMessage, false, "Allows players to see faction adjustments like Live") +RULE_BOOL(Client, UseLiveFactionMessage, false, "Allows players to see detailed faction adjustments as on the live servers") +RULE_BOOL(Client, UseLiveBlockedMessage, false, "Setting whether detailed spell block messages should be used as on the live servers") RULE_CATEGORY_END() RULE_CATEGORY(Bugs) @@ -754,14 +706,14 @@ RULE_BOOL(Bugs, DumpTargetEntity, false, "Dumps the target entity, if one is pro RULE_CATEGORY_END() RULE_CATEGORY(Faction) -RULE_INT(Faction, AllyFactionMinimum, 1100, "") -RULE_INT(Faction, WarmlyFactionMinimum, 750, "") -RULE_INT(Faction, KindlyFactionMinimum, 500, "") -RULE_INT(Faction, AmiablyFactionMinimum, 100, "") -RULE_INT(Faction, IndifferentlyFactionMinimum, 0, "") -RULE_INT(Faction, ApprehensivelyFactionMinimum, -100, "") -RULE_INT(Faction, DubiouslyFactionMinimum, -500, "") -RULE_INT(Faction, ThreateninglyFactionMinimum, -750, "") +RULE_INT(Faction, AllyFactionMinimum, 1100, "Minimum faction for ally") +RULE_INT(Faction, WarmlyFactionMinimum, 750, "Minimum faction for warmly") +RULE_INT(Faction, KindlyFactionMinimum, 500, "Minimum faction for kindly") +RULE_INT(Faction, AmiablyFactionMinimum, 100, "Minimum faction for amiably") +RULE_INT(Faction, IndifferentlyFactionMinimum, 0, "Minimum faction for indifferently") +RULE_INT(Faction, ApprehensivelyFactionMinimum, -100, "Minimum faction for apprehensively") +RULE_INT(Faction, DubiouslyFactionMinimum, -500, "Minimum faction for dubiously") +RULE_INT(Faction, ThreateninglyFactionMinimum, -750, "Minimum faction for threateningly") RULE_CATEGORY_END() RULE_CATEGORY(Logging) @@ -772,6 +724,32 @@ RULE_CATEGORY(HotReload) RULE_BOOL(HotReload, QuestsRepopWithReload, true, "When a hot reload is triggered, the zone will repop") RULE_BOOL(HotReload, QuestsRepopWhenPlayersNotInCombat, true, "When a hot reload is triggered, the zone will repop when no clients are in combat") RULE_BOOL(HotReload, QuestsResetTimersWithReload, true, "When a hot reload is triggered, quest timers will be reset") +RULE_BOOL(HotReload, QuestsAutoReloadGlobalScripts, false, "When a quest, plugin, or global script changes, auto reload.") +RULE_CATEGORY_END() + +RULE_CATEGORY(Expansion) +RULE_INT(Expansion, CurrentExpansion, -1, "The current expansion enabled for the server [-1 = ALL, 0 = Classic, 1 = Kunark etc.]") +RULE_CATEGORY_END() + +RULE_CATEGORY(Instances) +RULE_INT(Instances, ReservedInstances, 30, "Number of instance IDs which are reserved for globals. This value should not be changed while a server is running") +RULE_BOOL(Instances, RecycleInstanceIds, true, "Setting whether free instance IDs should be recycled to prevent them from gradually running out at 32k") +RULE_INT(Instances, GuildHallExpirationDays, 90, "Amount of days before a Guild Hall instance expires") +RULE_CATEGORY_END() + +RULE_CATEGORY(Expedition) +RULE_INT(Expedition, MinStatusToBypassPlayerCountRequirements, 80, "Minimum GM status to bypass minimum player requirements for Expedition creation") +RULE_BOOL(Expedition, AlwaysNotifyNewLeaderOnChange, false, "Always notify clients when made expedition leader. If false (live-like) new leaders are only notified when made leader via /dzmakeleader") +RULE_REAL(Expedition, LockoutDurationMultiplier, 1.0, "Multiplies lockout duration by this value when new lockouts are added") +RULE_BOOL(Expedition, EnableInDynamicZoneStatus, false, "Enables the 'In Dynamic Zone' member status in expedition window. If false (live-like) players inside the dynamic zone will show as 'Online'") +RULE_INT(Expedition, ChooseLeaderCooldownTime, 2000, "Cooldown time (milliseconds) between choosing a new leader for automatic leader changes") +RULE_CATEGORY_END() + +RULE_CATEGORY(DynamicZone) +RULE_INT(DynamicZone, ClientRemovalDelayMS, 60000, "Delay (milliseconds) until a client is teleported out of dynamic zone after being removed as member") +RULE_BOOL(DynamicZone, EmptyShutdownEnabled, true, "Enable early instance shutdown for dynamic zones that have no members") +RULE_INT(DynamicZone, EmptyShutdownDelaySeconds, 1500, "Seconds to set dynamic zone instance expiration if early shutdown enabled") +RULE_INT(DynamicZone, WorldProcessRate, 6000, "Timer interval (milliseconds) that systems check their dynamic zone states") RULE_CATEGORY_END() #undef RULE_CATEGORY diff --git a/common/say_link.cpp b/common/say_link.cpp index f4937fe88..b47897112 100644 --- a/common/say_link.cpp +++ b/common/say_link.cpp @@ -26,10 +26,10 @@ #include "../zone/zonedb.h" -bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct &say_link_body_struct, const std::string &say_link_body) +bool EQ::saylink::DegenerateLinkBody(SayLinkBody_Struct &say_link_body_struct, const std::string &say_link_body) { memset(&say_link_body_struct, 0, sizeof(say_link_body_struct)); - if (say_link_body.length() != EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (say_link_body.length() != EQ::constants::SAY_LINK_BODY_SIZE) { return false; } @@ -50,7 +50,7 @@ bool EQEmu::saylink::DegenerateLinkBody(SayLinkBody_Struct &say_link_body_struct return true; } -bool EQEmu::saylink::GenerateLinkBody(std::string &say_link_body, const SayLinkBody_Struct &say_link_body_struct) +bool EQ::saylink::GenerateLinkBody(std::string &say_link_body, const SayLinkBody_Struct &say_link_body_struct) { say_link_body = StringFormat( "%1X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%05X" "%1X" "%04X" "%02X" "%05X" "%08X", @@ -69,19 +69,19 @@ bool EQEmu::saylink::GenerateLinkBody(std::string &say_link_body, const SayLinkB (0xFFFFFFFF & say_link_body_struct.hash) ); - if (say_link_body.length() != EQEmu::constants::SAY_LINK_BODY_SIZE) { + if (say_link_body.length() != EQ::constants::SAY_LINK_BODY_SIZE) { return false; } return true; } -EQEmu::SayLinkEngine::SayLinkEngine() +EQ::SayLinkEngine::SayLinkEngine() { Reset(); } -const std::string &EQEmu::SayLinkEngine::GenerateLink() +const std::string &EQ::SayLinkEngine::GenerateLink() { m_Link.clear(); m_LinkBody.clear(); @@ -90,25 +90,25 @@ const std::string &EQEmu::SayLinkEngine::GenerateLink() generate_body(); generate_text(); - if ((m_LinkBody.length() == EQEmu::constants::SAY_LINK_BODY_SIZE) && (m_LinkText.length() > 0)) { + if ((m_LinkBody.length() == EQ::constants::SAY_LINK_BODY_SIZE) && (m_LinkText.length() > 0)) { m_Link.push_back(0x12); m_Link.append(m_LinkBody); m_Link.append(m_LinkText); m_Link.push_back(0x12); } - if ((m_Link.length() == 0) || (m_Link.length() > (EQEmu::constants::SAY_LINK_MAXIMUM_SIZE))) { + if ((m_Link.length() == 0) || (m_Link.length() > (EQ::constants::SAY_LINK_MAXIMUM_SIZE))) { m_Error = true; m_Link = ""; LogError("SayLinkEngine::GenerateLink() failed to generate a useable say link"); - LogError(">> LinkType: {}, Lengths: {link: {}({}), body: {}({}), text: {}({})}", + LogError(">> LinkType: {}, Lengths: [link: {}({}), body: {}({}), text: {}({})]", m_LinkType, m_Link.length(), - EQEmu::constants::SAY_LINK_MAXIMUM_SIZE, + EQ::constants::SAY_LINK_MAXIMUM_SIZE, m_LinkBody.length(), - EQEmu::constants::SAY_LINK_BODY_SIZE, + EQ::constants::SAY_LINK_BODY_SIZE, m_LinkText.length(), - EQEmu::constants::SAY_LINK_TEXT_SIZE + EQ::constants::SAY_LINK_TEXT_SIZE ); LogError(">> LinkBody: {}", m_LinkBody.c_str()); LogError(">> LinkText: {}", m_LinkText.c_str()); @@ -117,7 +117,7 @@ const std::string &EQEmu::SayLinkEngine::GenerateLink() return m_Link; } -void EQEmu::SayLinkEngine::Reset() +void EQ::SayLinkEngine::Reset() { m_LinkType = saylink::SayLinkBlank; m_ItemData = nullptr; @@ -134,7 +134,7 @@ void EQEmu::SayLinkEngine::Reset() m_Error = false; } -void EQEmu::SayLinkEngine::generate_body() +void EQ::SayLinkEngine::generate_body() { /* Current server mask: EQClientRoF2 @@ -147,7 +147,7 @@ void EQEmu::SayLinkEngine::generate_body() memset(&m_LinkBodyStruct, 0, sizeof(SayLinkBody_Struct)); - const EQEmu::ItemData *item_data = nullptr; + const EQ::ItemData *item_data = nullptr; switch (m_LinkType) { case saylink::SayLinkBlank: @@ -257,14 +257,14 @@ void EQEmu::SayLinkEngine::generate_body() ); } -void EQEmu::SayLinkEngine::generate_text() +void EQ::SayLinkEngine::generate_text() { if (m_LinkProxyStruct.text != nullptr) { m_LinkText = m_LinkProxyStruct.text; return; } - const EQEmu::ItemData *item_data = nullptr; + const EQ::ItemData *item_data = nullptr; switch (m_LinkType) { case saylink::SayLinkBlank: @@ -291,7 +291,7 @@ void EQEmu::SayLinkEngine::generate_text() m_LinkText = "null"; } -std::string EQEmu::SayLinkEngine::GenerateQuestSaylink(std::string saylink_text, bool silent, std::string link_name) +std::string EQ::SayLinkEngine::GenerateQuestSaylink(std::string saylink_text, bool silent, std::string link_name) { uint32 saylink_id = 0; @@ -327,7 +327,7 @@ std::string EQEmu::SayLinkEngine::GenerateQuestSaylink(std::string saylink_text, /** * Generate the actual link */ - EQEmu::SayLinkEngine linker; + EQ::SayLinkEngine linker; linker.SetProxyItemID(SAYLINK_ITEM_ID); if (silent) { linker.SetProxyAugment2ID(saylink_id); diff --git a/common/say_link.h b/common/say_link.h index c282bde05..c0ea5a235 100644 --- a/common/say_link.h +++ b/common/say_link.h @@ -27,7 +27,7 @@ struct ServerLootItem_Struct; -namespace EQEmu +namespace EQ { struct ItemData; class ItemInstance; @@ -72,7 +72,7 @@ namespace EQEmu SayLinkEngine(); void SetLinkType(saylink::SayLinkType link_type) { m_LinkType = link_type; } - void SetItemData(const EQEmu::ItemData* item_data) { m_ItemData = item_data; } + void SetItemData(const EQ::ItemData* item_data) { m_ItemData = item_data; } void SetLootData(const ServerLootItem_Struct* loot_data) { m_LootData = loot_data; } void SetItemInst(const ItemInstance* item_inst) { m_ItemInst = item_inst; } diff --git a/common/server_event_scheduler.cpp b/common/server_event_scheduler.cpp new file mode 100644 index 000000000..1034eebfe --- /dev/null +++ b/common/server_event_scheduler.cpp @@ -0,0 +1,247 @@ +#include "../common/database.h" +#include "../common/string_util.h" +#include "server_event_scheduler.h" +#include "../common/cron/croncpp.h" +#include +#include +#include + +ServerEventScheduler::ServerEventScheduler() +{ + m_last_polled_minute = -1; + m_events = {}; + m_active_events = {}; +} + +ServerEventScheduler::~ServerEventScheduler() = default; + +void ServerEventScheduler::LoadScheduledEvents() +{ + if (!ValidateDatabaseConnection()) { + return; + } + + std::time_t time = std::time(nullptr); + std::tm *now = std::localtime(&time); + + m_events = ServerScheduledEventsRepository::GetWhere(*m_database, "deleted_at is null"); + for (auto &e: m_events) { + + auto start = BuildStartTimeFromEvent(e, now); + auto end = BuildEndTimeFromEvent(e, now); + + // data excluded from output because it can be very large + + LogScheduler( + "Loaded Event ({}) [{}] type [{}] start [{}/{}/{} {:02}:{:02}:00] end [{}/{}/{} {:02}:{:02}:00] cron [{}] created [{}]", + e.id, + e.description, + e.event_type, + start.tm_mon + 1, + start.tm_mday, + start.tm_year + 1900, + start.tm_hour, + start.tm_min, + end.tm_mon + 1, + end.tm_mday, + end.tm_year + 1900, + end.tm_hour, + end.tm_min, + e.cron_expression, + e.created_at + ); + } + + LogScheduler("Loaded scheduled events [{}]", m_events.size()); +} + +// checks to see if event is ready to be activated +bool ServerEventScheduler::ValidateEventReadyToActivate( + ServerScheduledEventsRepository::ServerScheduledEvents &e +) +{ + + // if there is a cron expression, it will try to parse it first before falling back to + // alternative time logic + if (!e.cron_expression.empty()) { + try { + auto cron = cron::make_cron(e.cron_expression); + std::time_t cron_now = std::time(nullptr); + std::time_t cron_next = cron::cron_next(cron, cron_now); + + // we have to pad our now window just a tad so we don't miss the cron window + if ((cron_now + 10) >= cron_next) { + LogScheduler("Cron time has been met! Event scheduling ({}) [{}]", e.id, e.description); + return true; + } + + LogSchedulerDetail("Cron now [{}] cron next [{}]\n", cron_now, cron_next); + } + catch (cron::bad_cronexpr const &ex) { + LogScheduler( + "Error: Cron expression error [{}] see [https://github.com/mariusbancila/croncpp#cron-expressions]", + ex.what() + ); + } + + return false; + } + + std::time_t time = std::time(nullptr); + std::tm *now = std::localtime(&time); + time_t now_time_unix = mktime(now); + auto start = BuildStartTimeFromEvent(e, now); + auto end = BuildEndTimeFromEvent(e, now); + time_t start_time_unix = mktime(&start); + + bool doesnt_end = ( + e.year_end == 0 && + e.month_end == 0 && + e.day_end == 0 && + e.hour_end == 0 && + e.minute_end == 0 + ); + + time_t end_time_unix; + if (!doesnt_end) { + end_time_unix = mktime(&end); + } + + if (now_time_unix >= start_time_unix && (doesnt_end || now_time_unix < end_time_unix)) { + LogSchedulerDetail( + "[ValidateEventReadyToActivate] now_time [{}] start_time [{}] doesnt_end [{}] end_time [{}]", + now_time_unix, + start_time_unix, + doesnt_end ? "true" : "false", + end_time_unix + ); + return true; + } + + return false; +} + +ServerEventScheduler *ServerEventScheduler::SetDatabase(Database *db) +{ + m_database = db; + + return this; +} + +bool ServerEventScheduler::ValidateDatabaseConnection() +{ + if (!m_database) { + LogError("[ServerEventScheduler::LoadScheduledEvents] No database connection"); + return false; + } + + return true; +} + +// in this function we simply look at events we have internally and events +// in the database and determine if any edits have been made +// this helps inform decisions to tell all zones to reload their events +bool ServerEventScheduler::CheckIfEventsChanged() +{ + auto events = ServerScheduledEventsRepository::GetWhere(*m_database, "deleted_at is null"); + + // first check if the size changed, if it did this is the easiest step + if (m_events.size() != events.size()) { + LogSchedulerDetail("[CheckIfEventsChanged] Event size has changed"); + m_events = events; + return true; + } + + // compare fields of database fields to internal events to see if any fields changed + for (auto &e: m_events) { + for (auto &dbe: events) { + if (dbe.id == e.id) { + if ( + dbe.description != e.description || + dbe.event_type != e.event_type || + dbe.event_data != e.event_data || + dbe.minute_start != e.minute_start || + dbe.hour_start != e.hour_start || + dbe.day_start != e.day_start || + dbe.month_start != e.month_start || + dbe.year_start != e.year_start || + dbe.minute_end != e.minute_end || + dbe.hour_end != e.hour_end || + dbe.day_end != e.day_end || + dbe.month_end != e.month_end || + dbe.year_end != e.year_end || + dbe.cron_expression != e.cron_expression || + dbe.created_at != e.created_at || + dbe.deleted_at != e.deleted_at + ) { + LogSchedulerDetail("[CheckIfEventsChanged] Field change detected"); + m_events = events; + return true; + } + } + } + } + + return false; +} + +// checks if event is active +bool ServerEventScheduler::IsEventActive(ServerScheduledEventsRepository::ServerScheduledEvents &e) +{ + for (auto &a: m_active_events) { + if (a.id == e.id) { + return true; + } + } + + return false; +} + +bool ServerEventScheduler::RemoveActiveEvent(ServerScheduledEventsRepository::ServerScheduledEvents &e) +{ + m_active_events.erase( + std::remove_if( + m_active_events.begin(), + m_active_events.end(), + [&](ServerScheduledEventsRepository::ServerScheduledEvents const &active_event) { + return active_event.id == e.id; + } + ), + m_active_events.end()); + + return false; +} + +std::tm ServerEventScheduler::BuildStartTimeFromEvent( + ServerScheduledEventsRepository::ServerScheduledEvents &e, + std::tm *now +) +{ + struct tm time{}; + time.tm_year = ((e.year_start > 0) ? e.year_start - 1900 : now->tm_year); + time.tm_mon = ((e.month_start > 0) ? e.month_start - 1 : now->tm_mon); + time.tm_mday = ((e.day_start > 0) ? e.day_start : now->tm_mday); + time.tm_hour = ((e.hour_start > 0) ? e.hour_start : now->tm_hour); + time.tm_min = ((e.minute_start > 0) ? e.minute_start : now->tm_min); + time.tm_sec = 0; + time.tm_isdst = now->tm_isdst; + + return time; +} + +std::tm ServerEventScheduler::BuildEndTimeFromEvent( + ServerScheduledEventsRepository::ServerScheduledEvents &e, + std::tm *now +) +{ + struct tm time{}; + time.tm_year = ((e.year_end > 0) ? e.year_end - 1900 : now->tm_year); + time.tm_mon = ((e.month_end > 0) ? e.month_end - 1 : now->tm_mon); + time.tm_mday = ((e.day_end > 0) ? e.day_end : now->tm_mday); + time.tm_hour = ((e.hour_end > 0) ? e.hour_end : now->tm_hour); + time.tm_min = ((e.minute_end > 0) ? e.minute_end : now->tm_min); + time.tm_sec = 0; + time.tm_isdst = now->tm_isdst; + + return time; +} diff --git a/common/server_event_scheduler.h b/common/server_event_scheduler.h new file mode 100644 index 000000000..5671eaf7c --- /dev/null +++ b/common/server_event_scheduler.h @@ -0,0 +1,57 @@ +#ifndef EQEMU_SERVER_EVENT_SCHEDULER_H +#define EQEMU_SERVER_EVENT_SCHEDULER_H + +#include "../common/repositories/server_scheduled_events_repository.h" +#include +#include + +namespace ServerEvents { + static const std::string EVENT_TYPE_HOT_ZONE_ACTIVE = "hot_zone_activate"; + static const std::string EVENT_TYPE_BROADCAST = "broadcast"; + static const std::string EVENT_TYPE_RELOAD_WORLD = "reload_world"; + static const std::string EVENT_TYPE_RULE_CHANGE = "rule_change"; + static const std::string EVENT_TYPE_CONTENT_FLAG_CHANGE = "content_flag_change"; +} + +class ServerEventScheduler { +public: + virtual ~ServerEventScheduler(); + ServerEventScheduler(); + ServerEventScheduler *SetDatabase(Database *db); + void LoadScheduledEvents(); + bool CheckIfEventsChanged(); + +protected: + + // events directly from the database + std::vector m_events; + + // used to track only when it is convenient to undo an action from an active event + // typically there should be two separate events to turn something on / off + // hotzones use this right now simply to keep us from toggling off the hotzone + // every minute we trigger and then immediately turning it right back on + std::vector m_active_events; + + // simple ticker used to determine when the last polled minute was so that when the minute + // changes we fire checking the scheduler + int m_last_polled_minute; + + // validates an event is currently active or not + bool ValidateEventReadyToActivate(ServerScheduledEventsRepository::ServerScheduledEvents &e); + + // is event active + bool IsEventActive(ServerScheduledEventsRepository::ServerScheduledEvents &e); + + // remove active event + bool RemoveActiveEvent(ServerScheduledEventsRepository::ServerScheduledEvents &e); + + // build time object from event + std::tm BuildStartTimeFromEvent(ServerScheduledEventsRepository::ServerScheduledEvents &e, tm *now); + std::tm BuildEndTimeFromEvent(ServerScheduledEventsRepository::ServerScheduledEvents &e, tm *now); + + // reference to database + Database *m_database; + bool ValidateDatabaseConnection(); +}; + +#endif //EQEMU_SERVER_EVENT_SCHEDULER_H diff --git a/common/servertalk.h b/common/servertalk.h index 032df1ddc..b7c59e123 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -27,7 +27,6 @@ #define ServerOP_Who 0x000B // #who #define ServerOP_ZonePlayer 0x000C // #zone, or #summon #define ServerOP_KickPlayer 0x000D // #kick - #define ServerOP_RefreshGuild 0x000E // Notice to all zoneservers to refresh their guild cache for ID# in packet (ServerGuildRefresh_Struct) #define ServerOP_VoiceMacro 0x000F //#define ServerOP_GuildInvite 0x0010 @@ -141,6 +140,34 @@ #define ServerOP_LFPUpdate 0x0213 #define ServerOP_LFPMatches 0x0214 #define ServerOP_ClientVersionSummary 0x0215 + +#define ServerOP_ExpeditionCreate 0x0400 +#define ServerOP_ExpeditionDeleted 0x0401 +#define ServerOP_ExpeditionLeaderChanged 0x0402 +#define ServerOP_ExpeditionLockout 0x0403 +#define ServerOP_ExpeditionMemberChange 0x0404 +#define ServerOP_ExpeditionMemberSwap 0x0405 +#define ServerOP_ExpeditionMemberStatus 0x0406 +#define ServerOP_ExpeditionGetMemberStatuses 0x0407 +#define ServerOP_ExpeditionDzAddPlayer 0x0408 +#define ServerOP_ExpeditionDzMakeLeader 0x0409 +#define ServerOP_ExpeditionCharacterLockout 0x040d +#define ServerOP_ExpeditionSaveInvite 0x040e +#define ServerOP_ExpeditionRequestInvite 0x040f +#define ServerOP_ExpeditionReplayOnJoin 0x0410 +#define ServerOP_ExpeditionLockState 0x0411 +#define ServerOP_ExpeditionMembersRemoved 0x0412 +#define ServerOP_ExpeditionLockoutDuration 0x0414 +#define ServerOP_ExpeditionExpireWarning 0x0416 + +#define ServerOP_DzAddRemoveCharacter 0x0450 +#define ServerOP_DzRemoveAllCharacters 0x0451 +#define ServerOP_DzSetSecondsRemaining 0x0452 +#define ServerOP_DzDurationUpdate 0x0453 +#define ServerOP_DzSetCompass 0x0454 +#define ServerOP_DzSetSafeReturn 0x0455 +#define ServerOP_DzSetZoneIn 0x0456 + #define ServerOP_LSInfo 0x1000 #define ServerOP_LSStatus 0x1001 #define ServerOP_LSClientAuthLeg 0x1002 @@ -188,38 +215,116 @@ #define ServerOP_ReloadRulesWorld 0x4003 #define ServerOP_CameraShake 0x4004 #define ServerOP_QueryServGeneric 0x4005 -#define ServerOP_CZSignalClient 0x4006 -#define ServerOP_CZSignalClientByName 0x4007 -#define ServerOP_CZMessagePlayer 0x4008 -#define ServerOP_ReloadWorld 0x4009 -#define ServerOP_ReloadLogs 0x4010 -#define ServerOP_ReloadPerlExportSettings 0x4011 -#define ServerOP_CZSetEntityVariableByClientName 0x4012 -#define ServerOP_UCSServerStatusRequest 0x4013 -#define ServerOP_UCSServerStatusReply 0x4014 -#define ServerOP_HotReloadQuests 0x4015 +#define ServerOP_ReloadWorld 0x4006 +#define ServerOP_ReloadLogs 0x4007 +#define ServerOP_ReloadPerlExportSettings 0x4008 +#define ServerOP_UCSServerStatusRequest 0x4009 +#define ServerOP_UCSServerStatusReply 0x4010 +#define ServerOP_HotReloadQuests 0x4011 +#define ServerOP_UpdateSchedulerEvents 0x4012 + +#define ServerOP_CZCastSpellPlayer 0x4500 +#define ServerOP_CZCastSpellGroup 0x4501 +#define ServerOP_CZCastSpellRaid 0x4502 +#define ServerOP_CZCastSpellGuild 0x4503 +#define ServerOP_CZMarqueePlayer 0x4504 +#define ServerOP_CZMarqueeGroup 0x4505 +#define ServerOP_CZMarqueeRaid 0x4506 +#define ServerOP_CZMarqueeGuild 0x4507 +#define ServerOP_CZMessagePlayer 0x4508 +#define ServerOP_CZMessageGroup 0x4509 +#define ServerOP_CZMessageRaid 0x4510 +#define ServerOP_CZMessageGuild 0x4511 +#define ServerOP_CZMovePlayer 0x4512 +#define ServerOP_CZMoveGroup 0x4513 +#define ServerOP_CZMoveRaid 0x4514 +#define ServerOP_CZMoveGuild 0x4515 +#define ServerOP_CZMoveInstancePlayer 0x4516 +#define ServerOP_CZMoveInstanceGroup 0x4517 +#define ServerOP_CZMoveInstanceRaid 0x4518 +#define ServerOP_CZMoveInstanceGuild 0x4519 +#define ServerOP_CZRemoveSpellPlayer 0x4520 +#define ServerOP_CZRemoveSpellGroup 0x4521 +#define ServerOP_CZRemoveSpellRaid 0x4522 +#define ServerOP_CZRemoveSpellGuild 0x4523 +#define ServerOP_CZSetEntityVariableByClientName 0x4524 +#define ServerOP_CZSetEntityVariableByNPCTypeID 0x4525 +#define ServerOP_CZSetEntityVariableByGroupID 0x4526 +#define ServerOP_CZSetEntityVariableByRaidID 0x4527 +#define ServerOP_CZSetEntityVariableByGuildID 0x4528 +#define ServerOP_CZSignalClient 0x4529 +#define ServerOP_CZSignalClientByName 0x4530 +#define ServerOP_CZSignalNPC 0x4531 +#define ServerOP_CZSignalGroup 0x4532 +#define ServerOP_CZSignalRaid 0x4533 +#define ServerOP_CZSignalGuild 0x4534 +#define ServerOP_CZTaskActivityResetPlayer 0x4535 +#define ServerOP_CZTaskActivityResetGroup 0x4536 +#define ServerOP_CZTaskActivityResetRaid 0x4537 +#define ServerOP_CZTaskActivityResetGuild 0x4538 +#define ServerOP_CZTaskActivityUpdatePlayer 0x4539 +#define ServerOP_CZTaskActivityUpdateGroup 0x4540 +#define ServerOP_CZTaskActivityUpdateRaid 0x4541 +#define ServerOP_CZTaskActivityUpdateGuild 0x4542 +#define ServerOP_CZTaskAssignPlayer 0x4543 +#define ServerOP_CZTaskAssignGroup 0x4544 +#define ServerOP_CZTaskAssignRaid 0x4545 +#define ServerOP_CZTaskAssignGuild 0x4546 +#define ServerOP_CZTaskDisablePlayer 0x4547 +#define ServerOP_CZTaskDisableGroup 0x4548 +#define ServerOP_CZTaskDisableRaid 0x4549 +#define ServerOP_CZTaskDisableGuild 0x4550 +#define ServerOP_CZTaskEnablePlayer 0x4551 +#define ServerOP_CZTaskEnableGroup 0x4552 +#define ServerOP_CZTaskEnableRaid 0x4553 +#define ServerOP_CZTaskEnableGuild 0x4554 +#define ServerOP_CZTaskFailPlayer 0x4555 +#define ServerOP_CZTaskFailGroup 0x4556 +#define ServerOP_CZTaskFailRaid 0x4557 +#define ServerOP_CZTaskFailGuild 0x4558 +#define ServerOP_CZTaskRemovePlayer 0x4559 +#define ServerOP_CZTaskRemoveGroup 0x4560 +#define ServerOP_CZTaskRemoveRaid 0x4561 +#define ServerOP_CZTaskRemoveGuild 0x4562 +#define ServerOP_CZClientMessageString 0x4563 + +#define ServerOP_WWAssignTask 0x4750 +#define ServerOP_WWCastSpell 0x4751 +#define ServerOP_WWCompleteActivity 0x4752 +#define ServerOP_WWDisableTask 0x4753 +#define ServerOP_WWEnableTask 0x4754 +#define ServerOP_WWFailTask 0x4755 +#define ServerOP_WWMarquee 0x4756 +#define ServerOP_WWMessage 0x4757 +#define ServerOP_WWMove 0x4758 +#define ServerOP_WWMoveInstance 0x4759 +#define ServerOP_WWRemoveSpell 0x4760 +#define ServerOP_WWRemoveTask 0x4761 +#define ServerOP_WWResetActivity 0x4762 +#define ServerOP_WWSetEntityVariableClient 0x4763 +#define ServerOP_WWSetEntityVariableNPC 0x4764 +#define ServerOP_WWSignalClient 0x4765 +#define ServerOP_WWSignalNPC 0x4766 +#define ServerOP_WWUpdateActivity 0x4767 /** * QueryServer */ -#define ServerOP_QSPlayerLogTrades 0x5010 -#define ServerOP_QSPlayerLogHandins 0x5011 -#define ServerOP_QSPlayerLogNPCKills 0x5012 -#define ServerOP_QSPlayerLogDeletes 0x5013 -#define ServerOP_QSPlayerLogMoves 0x5014 -#define ServerOP_QSPlayerLogMerchantTransactions 0x5015 -#define ServerOP_QSSendQuery 0x5016 -#define ServerOP_CZSignalNPC 0x5017 -#define ServerOP_CZSetEntityVariableByNPCTypeID 0x5018 -#define ServerOP_WWMarquee 0x5019 -#define ServerOP_QSPlayerDropItem 0x5020 +#define ServerOP_QSPlayerLogTrades 0x5000 +#define ServerOP_QSPlayerLogHandins 0x5001 +#define ServerOP_QSPlayerLogNPCKills 0x5002 +#define ServerOP_QSPlayerLogDeletes 0x5003 +#define ServerOP_QSPlayerLogMoves 0x5004 +#define ServerOP_QSPlayerLogMerchantTransactions 0x5005 +#define ServerOP_QSSendQuery 0x5006 +#define ServerOP_QSPlayerDropItem 0x5007 /* Query Serv Generic Packet Flag/Type Enumeration */ -enum { QSG_LFGuild = 0 }; +enum { QSG_LFGuild = 0 }; enum { QSG_LFGuild_PlayerMatches = 0, QSG_LFGuild_UpdatePlayerInfo, QSG_LFGuild_RequestPlayerInfo, QSG_LFGuild_UpdateGuildInfo, QSG_LFGuild_GuildMatches, QSG_LFGuild_RequestGuildInfo }; -#define ServerOP_Speech 0x4513 +#define ServerOP_Speech 0x5500 enum { UserToWorldStatusWorldUnavail = 0, @@ -322,7 +427,7 @@ struct ServerZoneIncomingClient_Struct { uint32 accid; int16 admin; uint32 charid; - uint32 lsid; + uint32 lsid; bool tellsoff; char charname[64]; char lskey[30]; @@ -463,34 +568,34 @@ struct ServerKickPlayer_Struct { }; struct ServerLSInfo_Struct { - char name[201]; // name the worldserver wants + char name[201]; // name the worldserver wants char address[250]; // DNS address of the server char account[31]; // account name for the worldserver char password[31]; // password for the name char protocolversion[25]; // Major protocol version number char serverversion[64]; // minor server software version number - uint8 servertype; // 0=world, 1=chat, 2=login, 3=MeshLogin + uint8 servertype; // 0=world, 1=chat, 2=login, 3=MeshLogin }; struct ServerNewLSInfo_Struct { - char server_long_name[201]; // name the worldserver wants - char server_short_name[50]; // shortname the worldserver wants + char server_long_name[201]; // name the worldserver wants + char server_short_name[50]; // shortname the worldserver wants char remote_ip_address[125]; // DNS address of the server char local_ip_address[125]; // DNS address of the server char account_name[31]; // account name for the worldserver char account_password[31]; // password for the name char protocol_version[25]; // Major protocol version number char server_version[64]; // minor server software version number - uint8 server_process_type; // 0=world, 1=chat, 2=login, 3=MeshLogin + uint8 server_process_type; // 0=world, 1=chat, 2=login, 3=MeshLogin }; struct ServerLSAccountUpdate_Struct { // for updating info on login server char worldaccount[31]; // account name for the worldserver char worldpassword[31]; // password for the name - uint32 useraccountid; // player account ID + uint32 useraccountid; // player account ID char useraccount[31]; // player account name char userpassword[51]; // player account password - char user_email[101]; // player account email address + char user_email[101]; // player account email address }; struct ServerLSStatus_Struct { @@ -585,7 +690,7 @@ struct ServerConnectInfo { char address[250]; char local_address[250]; uint16 port; - uint32 process_id; + uint32 process_id; }; struct ServerGMGoto_Struct { @@ -713,7 +818,7 @@ struct UsertoWorldRequest_Struct { struct UsertoWorldResponseLegacy_Struct { uint32 lsaccountid; uint32 worldid; - int8 response; // -3) World Full, -2) Banned, -1) Suspended, 0) Denied, 1) Allowed + int8 response; // -3) World Full, -2) Banned, -1) Suspended, 0) Denied, 1) Allowed uint32 FromID; uint32 ToID; }; @@ -721,10 +826,10 @@ struct UsertoWorldResponseLegacy_Struct { struct UsertoWorldResponse_Struct { uint32 lsaccountid; uint32 worldid; - int8 response; // -3) World Full, -2) Banned, -1) Suspended, 0) Denied, 1) Allowed + int8 response; // -3) World Full, -2) Banned, -1) Suspended, 0) Denied, 1) Allowed uint32 FromID; uint32 ToID; - char login[64]; + char login[64]; }; // generic struct to be used for alot of simple zone->world questions @@ -874,7 +979,7 @@ struct ServerOP_Consent_Struct { uint8 permission; uint32 zone_id; uint16 instance_id; - uint8 consent_type; // 0 = normal, 1 = group, 2 = raid, 3 = guild + uint8 consent_type; // 0 = normal, 1 = group, 2 = raid, 3 = guild uint32 consent_id; }; @@ -1162,21 +1267,6 @@ struct Server_Speech_Struct { char message[0]; }; -struct CZClientSignal_Struct { - int charid; - uint32 data; -}; - -struct CZNPCSignal_Struct { - uint32 npctype_id; - uint32 data; -}; - -struct CZClientSignalByName_Struct { - char Name[64]; - uint32 data; -}; - struct QSTradeItems_Struct { uint32 from_id; uint16 from_slot; @@ -1192,13 +1282,13 @@ struct QSTradeItems_Struct { }; struct QSPlayerLogTrade_Struct { - uint32 char1_id; + uint32 char1_id; MoneyUpdate_Struct char1_money; - uint16 char1_count; - uint32 char2_id; + uint16 char1_count; + uint32 char2_id; MoneyUpdate_Struct char2_money; - uint16 char2_count; - uint16 _detail_count; + uint16 char2_count; + uint16 _detail_count; QSTradeItems_Struct items[0]; }; @@ -1236,14 +1326,14 @@ struct QSHandinItems_Struct { }; struct QSPlayerLogHandin_Struct { - uint32 quest_id; - uint32 char_id; + uint32 quest_id; + uint32 char_id; MoneyUpdate_Struct char_money; - uint16 char_count; - uint32 npc_id; + uint16 char_count; + uint32 npc_id; MoneyUpdate_Struct npc_money; - uint16 npc_count; - uint16 _detail_count; + uint16 npc_count; + uint16 _detail_count; QSHandinItems_Struct items[0]; }; @@ -1274,9 +1364,9 @@ struct QSDeleteItems_Struct { }; struct QSPlayerLogDelete_Struct { - uint32 char_id; - uint16 stack_size; // '0' indicates full stack or non-stackable item move - uint16 char_count; + uint32 char_id; + uint16 stack_size; // '0' indicates full stack or non-stackable item move + uint16 char_count; QSDeleteItems_Struct items[0]; }; @@ -1314,13 +1404,13 @@ struct QSTransactionItems_Struct { }; struct QSMerchantLogTransaction_Struct { - uint32 zone_id; - uint32 merchant_id; + uint32 zone_id; + uint32 merchant_id; MoneyUpdate_Struct merchant_money; - uint16 merchant_count; - uint32 char_id; + uint16 merchant_count; + uint32 char_id; MoneyUpdate_Struct char_money; - uint16 char_count; + uint16 char_count; QSTransactionItems_Struct items[0]; }; @@ -1328,31 +1418,559 @@ struct QSGeneralQuery_Struct { char QueryString[0]; }; -struct CZMessagePlayer_Struct { - uint32 Type; - char CharName[64]; - char Message[512]; +struct CZCastSpellPlayer_Struct { + int character_id; + uint32 spell_id; }; -struct WWMarquee_Struct { - uint32 Type; - uint32 Priority; - uint32 FadeIn; - uint32 FadeOut; - uint32 Duration; - char Message[512]; +struct CZCastSpellGroup_Struct { + int group_id; + uint32 spell_id; +}; + +struct CZCastSpellRaid_Struct { + int raid_id; + uint32 spell_id; +}; + +struct CZCastSpellGuild_Struct { + int guild_id; + uint32 spell_id; +}; + +struct CZClientSignal_Struct { + int character_id; + uint32 signal; +}; + +struct CZGroupSignal_Struct { + int group_id; + uint32 signal; +}; + +struct CZRaidSignal_Struct { + int raid_id; + uint32 signal; +}; + +struct CZGuildSignal_Struct { + int guild_id; + uint32 signal; +}; + +struct CZNPCSignal_Struct { + uint32 npctype_id; + uint32 signal; +}; + +struct CZClientMessageString_Struct { + uint32 string_id; + uint16 chat_type; + char character_name[64]; + uint32 args_size; + char args[1]; // null delimited +}; + +struct CZClientSignalByName_Struct { + char character_name[64]; + uint32 signal; +}; + +struct CZCompleteActivityPlayer_Struct { + int character_id; + uint32 task_id; + int activity_id; +}; + +struct CZCompleteActivityGroup_Struct { + int group_id; + uint32 task_id; + int activity_id; +}; + +struct CZCompleteActivityRaid_Struct { + int raid_id; + uint32 task_id; + int activity_id; +}; + +struct CZCompleteActivityGuild_Struct { + int guild_id; + uint32 task_id; + int activity_id; +}; + +struct CZMovePlayer_Struct { + int character_id; + char zone_short_name[32]; +}; + +struct CZMarqueePlayer_Struct { + int character_id; + uint32 type; + uint32 priority; + uint32 fade_in; + uint32 fade_out; + uint32 duration; + char message[512]; +}; + +struct CZMarqueeGroup_Struct { + int group_id; + uint32 type; + uint32 priority; + uint32 fade_in; + uint32 fade_out; + uint32 duration; + char message[512]; +}; + +struct CZMarqueeRaid_Struct { + int raid_id; + uint32 type; + uint32 priority; + uint32 fade_in; + uint32 fade_out; + uint32 duration; + char message[512]; +}; + +struct CZMarqueeGuild_Struct { + int guild_id; + uint32 type; + uint32 priority; + uint32 fade_in; + uint32 fade_out; + uint32 duration; + char message[512]; +}; + +struct CZMessagePlayer_Struct { + uint32 type; + char character_name[64]; + char message[512]; +}; + +struct CZMessageGroup_Struct { + uint32 type; + int group_id; + char message[512]; +}; + +struct CZMessageRaid_Struct { + uint32 type; + int raid_id; + char message[512]; +}; + +struct CZMessageGuild_Struct { + uint32 type; + int guild_id; + char message[512]; +}; + +struct CZMoveGroup_Struct { + int group_id; + char zone_short_name[32]; +}; + +struct CZMoveRaid_Struct { + int raid_id; + char zone_short_name[32]; +}; + +struct CZMoveGuild_Struct { + int guild_id; + char zone_short_name[32]; +}; + +struct CZMoveInstancePlayer_Struct { + int character_id; + uint16 instance_id; +}; + +struct CZMoveInstanceGroup_Struct { + int group_id; + uint16 instance_id; +}; + +struct CZMoveInstanceRaid_Struct { + int raid_id; + uint16 instance_id; +}; + +struct CZMoveInstanceGuild_Struct { + int guild_id; + uint16 instance_id; +}; + +struct CZRemoveSpellPlayer_Struct { + int character_id; + uint32 spell_id; +}; + +struct CZRemoveSpellGroup_Struct { + int group_id; + uint32 spell_id; +}; + +struct CZRemoveSpellRaid_Struct { + int raid_id; + uint32 spell_id; +}; + +struct CZRemoveSpellGuild_Struct { + int guild_id; + uint32 spell_id; +}; + +struct CZRemoveTaskPlayer_Struct { + int character_id; + uint32 task_id; +}; + +struct CZRemoveTaskGroup_Struct { + int group_id; + uint32 task_id; +}; + +struct CZRemoveTaskRaid_Struct { + int raid_id; + uint32 task_id; +}; + +struct CZRemoveTaskGuild_Struct { + int guild_id; + uint32 task_id; +}; + +struct CZResetActivityPlayer_Struct { + int character_id; + uint32 task_id; + int activity_id; +}; + +struct CZResetActivityGroup_Struct { + int group_id; + uint32 task_id; + int activity_id; +}; + +struct CZResetActivityRaid_Struct { + int raid_id; + uint32 task_id; + int activity_id; +}; + +struct CZResetActivityGuild_Struct { + int guild_id; + uint32 task_id; + int activity_id; }; struct CZSetEntVarByNPCTypeID_Struct { uint32 npctype_id; - char id[256]; - char m_var[256]; + char variable_name[256]; + char variable_value[256]; }; struct CZSetEntVarByClientName_Struct { - char CharName[64]; - char id[256]; - char m_var[256]; + char character_name[64]; + char variable_name[256]; + char variable_value[256]; +}; + +struct CZSetEntVarByGroupID_Struct { + int group_id; + char variable_name[256]; + char variable_value[256]; +}; + +struct CZSetEntVarByRaidID_Struct { + int raid_id; + char variable_name[256]; + char variable_value[256]; +}; + +struct CZSetEntVarByGuildID_Struct { + int guild_id; + char variable_name[256]; + char variable_value[256]; +}; + +struct CZTaskActivityResetPlayer_Struct { + int character_id; + uint32 task_id; + int activity_id; +}; + +struct CZTaskActivityResetGroup_Struct { + int group_id; + uint32 task_id; + int activity_id; +}; + +struct CZTaskActivityResetRaid_Struct { + int raid_id; + uint32 task_id; + int activity_id; +}; + +struct CZTaskActivityResetGuild_Struct { + int guild_id; + uint32 task_id; + int activity_id; +}; + +struct CZTaskActivityUpdatePlayer_Struct { + int character_id; + uint32 task_id; + int activity_id; + int activity_count; +}; + +struct CZTaskActivityUpdateGroup_Struct { + int group_id; + uint32 task_id; + int activity_id; + int activity_count; +}; + +struct CZTaskActivityUpdateRaid_Struct { + int raid_id; + uint32 task_id; + int activity_id; + int activity_count; +}; + +struct CZTaskActivityUpdateGuild_Struct { + int guild_id; + uint32 task_id; + int activity_id; + int activity_count; +}; + +struct CZTaskAssignPlayer_Struct { + uint16 npc_entity_id; + int character_id; + uint32 task_id; + bool enforce_level_requirement; +}; + +struct CZTaskAssignGroup_Struct { + uint16 npc_entity_id; + int group_id; + uint32 task_id; + bool enforce_level_requirement; +}; + +struct CZTaskAssignRaid_Struct { + uint16 npc_entity_id; + int raid_id; + uint32 task_id; + bool enforce_level_requirement; +}; + +struct CZTaskAssignGuild_Struct { + uint16 npc_entity_id; + int guild_id; + uint32 task_id; + bool enforce_level_requirement; +}; + +struct CZTaskDisablePlayer_Struct { + int character_id; + uint32 task_id; +}; + +struct CZTaskDisableGroup_Struct { + int group_id; + uint32 task_id; +}; + +struct CZTaskDisableRaid_Struct { + int raid_id; + uint32 task_id; +}; + +struct CZTaskDisableGuild_Struct { + int guild_id; + uint32 task_id; +}; + +struct CZTaskEnablePlayer_Struct { + int character_id; + uint32 task_id; +}; + +struct CZTaskEnableGroup_Struct { + int group_id; + uint32 task_id; +}; + +struct CZTaskEnableRaid_Struct { + int raid_id; + uint32 task_id; +}; + +struct CZTaskEnableGuild_Struct { + int guild_id; + uint32 task_id; +}; + +struct CZTaskFailPlayer_Struct { + int character_id; + uint32 task_id; +}; + +struct CZTaskFailGroup_Struct { + int group_id; + uint32 task_id; +}; + +struct CZTaskFailRaid_Struct { + int raid_id; + uint32 task_id; +}; + +struct CZTaskFailGuild_Struct { + int guild_id; + uint32 task_id; +}; + +struct CZTaskRemovePlayer_Struct { + uint16 npc_entity_id; + int character_id; + uint32 task_id; +}; + +struct CZTaskRemoveGroup_Struct { + uint16 npc_entity_id; + int group_id; + uint32 task_id; +}; + +struct CZTaskRemoveRaid_Struct { + uint16 npc_entity_id; + int raid_id; + uint32 task_id; +}; + +struct CZTaskRemoveGuild_Struct { + uint16 npc_entity_id; + int guild_id; + uint32 task_id; +}; + +struct WWAssignTask_Struct { + uint16 npc_entity_id; + uint32 task_id; + bool enforce_level_requirement; + uint8 min_status; + uint8 max_status; +}; + +struct WWCastSpell_Struct { + uint32 spell_id; + uint8 min_status; + uint8 max_status; +}; + +struct WWDisableTask_Struct { + uint32 task_id; + uint8 min_status; + uint8 max_status; +}; + +struct WWEnableTask_Struct { + uint32 task_id; + uint8 min_status; + uint8 max_status; +}; + +struct WWFailTask_Struct { + uint32 task_id; + uint8 min_status; + uint8 max_status; +}; +struct WWMarquee_Struct { + uint32 type; + uint32 priority; + uint32 fade_in; + uint32 fade_out; + uint32 duration; + char message[512]; + uint8 min_status; + uint8 max_status; +}; + +struct WWMessage_Struct { + uint32 type; + char message[512]; + uint8 min_status; + uint8 max_status; +}; + +struct WWMove_Struct { + char zone_short_name[32]; + uint8 min_status; + uint8 max_status; +}; + +struct WWMoveInstance_Struct { + uint16 instance_id; + uint8 min_status; + uint8 max_status; +}; + +struct WWRemoveSpell_Struct { + uint32 spell_id; + uint8 min_status; + uint8 max_status; +}; + +struct WWRemoveTask_Struct { + uint32 task_id; + uint8 min_status; + uint8 max_status; + +}; + +struct WWResetActivity_Struct { + uint32 task_id; + int activity_id; + uint8 min_status; + uint8 max_status; +}; + +struct WWSetEntVarClient_Struct { + char variable_name[256]; + char variable_value[256]; + uint8 min_status; + uint8 max_status; +}; + +struct WWSetEntVarNPC_Struct { + char variable_name[256]; + char variable_value[256]; +}; + +struct WWSignalClient_Struct { + uint32 signal; + uint8 min_status; + uint8 max_status; +}; + +struct WWSignalNPC_Struct { + uint32 signal; +}; + +struct WWUpdateActivity_Struct { + uint32 task_id; + int activity_id; + int activity_count; + uint8 min_status; + uint8 max_status; }; struct ReloadWorld_Struct { @@ -1378,6 +1996,140 @@ struct UCSServerStatus_Struct { }; }; +struct ServerExpeditionID_Struct { + uint32 expedition_id; + uint32 sender_zone_id; + uint32 sender_instance_id; +}; + +struct ServerExpeditionLeaderID_Struct { + uint32 expedition_id; + uint32 leader_id; +}; + +struct ServerExpeditionMemberChange_Struct { + uint32 expedition_id; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint8 removed; // 0: added, 1: removed + uint32 char_id; + char char_name[64]; +}; + +struct ServerExpeditionMemberSwap_Struct { + uint32 expedition_id; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint32 add_char_id; + uint32 remove_char_id; + char add_char_name[64]; + char remove_char_name[64]; +}; + +struct ServerExpeditionMemberStatus_Struct { + uint32 expedition_id; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint8 status; // 0: unknown 1: Online 2: Offline 3: In Dynamic Zone 4: Link Dead + uint32 character_id; +}; + +struct ServerExpeditionMemberStatusEntry_Struct { + uint32 character_id; + uint8 online_status; // 0: unknown 1: Online 2: Offline 3: In Dynamic Zone 4: Link Dead +}; + +struct ServerExpeditionMemberStatuses_Struct { + uint32 expedition_id; + uint32 count; + ServerExpeditionMemberStatusEntry_Struct entries[0]; +}; + +struct ServerExpeditionLockout_Struct { + uint32 expedition_id; + uint64 expire_time; + uint32 duration; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint8 remove; + uint8 members_only; + int seconds_adjust; + char event_name[256]; +}; + +struct ServerExpeditionLockState_Struct { + uint32 expedition_id; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint8 enabled; + uint8 lock_msg; // 0: none, 1: closing 2: trial begin +}; + +struct ServerExpeditionSetting_Struct { + uint32 expedition_id; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint8 enabled; +}; + +struct ServerExpeditionCharacterLockout_Struct { + uint8 remove; + uint32 character_id; + uint64 expire_time; + uint32 duration; + char uuid[37]; + char expedition_name[128]; + char event_name[256]; +}; + +struct ServerExpeditionCharacterID_Struct { + uint32_t character_id; +}; + +struct ServerExpeditionExpireWarning_Struct { + uint32_t expedition_id; + uint32_t minutes_remaining; +}; + +struct ServerDzCommand_Struct { + uint32 expedition_id; + uint8 is_char_online; // 0: target name is offline, 1: online + char requester_name[64]; + char target_name[64]; + char remove_name[64]; // used for swap command +}; + +struct ServerDzCommandMakeLeader_Struct { + uint32 expedition_id; + uint32 requester_id; + uint8 is_online; // set by world, 0: new leader name offline, 1: online + uint8 is_success; // set by world, 0: makeleader failed, 1: success (is online member) + char new_leader_name[64]; +}; + +struct ServerDzLocation_Struct { + uint32 dz_id; + uint32 sender_zone_id; + uint16 sender_instance_id; + uint32 zone_id; + float y; + float x; + float z; + float heading; +}; + +struct ServerDzCharacter_Struct { + uint16 zone_id; + uint16 instance_id; + uint8 remove; // 0: added 1: removed + uint32 character_id; +}; + +struct ServerDzSetDuration_Struct { + uint32 dz_id; + uint32 seconds; +}; + #pragma pack() #endif diff --git a/common/shareddb.cpp b/common/shareddb.cpp index 48cc1309d..6f2af55a3 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -38,6 +38,7 @@ #include "shareddb.h" #include "string_util.h" #include "eqemu_config.h" +#include "repositories/criteria/content_filter_criteria.h" namespace ItemField { @@ -164,14 +165,14 @@ std::string SharedDatabase::GetMailKey(int CharID, bool key_only) } } -bool SharedDatabase::SaveCursor(uint32 char_id, std::list::const_iterator &start, std::list::const_iterator &end) +bool SharedDatabase::SaveCursor(uint32 char_id, std::list::const_iterator &start, std::list::const_iterator &end) { // Delete cursor items std::string query = StringFormat("DELETE FROM inventory WHERE charid = %i " "AND ((slotid >= 8000 AND slotid <= 8999) " "OR slotid = %i OR (slotid >= %i AND slotid <= %i) )", - char_id, EQEmu::invslot::slotCursor, - EQEmu::invbag::CURSOR_BAG_BEGIN, EQEmu::invbag::CURSOR_BAG_END); + char_id, EQ::invslot::slotCursor, + EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END); auto results = QueryDatabase(query); if (!results.Success()) { std::cout << "Clearing cursor failed: " << results.ErrorMessage() << std::endl; @@ -181,8 +182,8 @@ bool SharedDatabase::SaveCursor(uint32 char_id, std::list: int i = 8000; for(auto it = start; it != end; ++it, i++) { if (i > 8999) { break; } // shouldn't be anything in the queue that indexes this high - EQEmu::ItemInstance *inst = *it; - int16 use_slot = (i == 8000) ? EQEmu::invslot::slotCursor : i; + EQ::ItemInstance *inst = *it; + int16 use_slot = (i == 8000) ? EQ::invslot::slotCursor : i; if (!SaveInventory(char_id, inst, use_slot)) { return false; } @@ -191,7 +192,7 @@ bool SharedDatabase::SaveCursor(uint32 char_id, std::list: return true; } -bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const EQEmu::ItemInstance* inst) +bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const EQ::ItemInstance* inst) { // Delete cursor items std::string query = StringFormat("SELECT itemid, charges FROM sharedbank " @@ -224,15 +225,15 @@ bool SharedDatabase::VerifyInventory(uint32 account_id, int16 slot_id, const EQE return true; } -bool SharedDatabase::SaveInventory(uint32 char_id, const EQEmu::ItemInstance* inst, int16 slot_id) { +bool SharedDatabase::SaveInventory(uint32 char_id, const EQ::ItemInstance* inst, int16 slot_id) { //never save tribute slots: - if (slot_id >= EQEmu::invslot::TRIBUTE_BEGIN && slot_id <= EQEmu::invslot::TRIBUTE_END) + if (slot_id >= EQ::invslot::TRIBUTE_BEGIN && slot_id <= EQ::invslot::TRIBUTE_END) return true; - if (slot_id >= EQEmu::invslot::GUILD_TRIBUTE_BEGIN && slot_id <= EQEmu::invslot::GUILD_TRIBUTE_END) + if (slot_id >= EQ::invslot::GUILD_TRIBUTE_BEGIN && slot_id <= EQ::invslot::GUILD_TRIBUTE_END) return true; - if (slot_id >= EQEmu::invslot::SHARED_BANK_BEGIN && slot_id <= EQEmu::invbag::SHARED_BANK_BAGS_END) { + if (slot_id >= EQ::invslot::SHARED_BANK_BEGIN && slot_id <= EQ::invbag::SHARED_BANK_BAGS_END) { // Shared bank inventory if (!inst) { return DeleteSharedBankSlot(char_id, slot_id); @@ -240,7 +241,7 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const EQEmu::ItemInstance* in else { // Needed to clear out bag slots that 'REPLACE' in UpdateSharedBankSlot does not overwrite..otherwise, duplication occurs // (This requires that parent then child items be sent..which should be how they are currently passed) - if (EQEmu::InventoryProfile::SupportsContainers(slot_id)) + if (EQ::InventoryProfile::SupportsContainers(slot_id)) DeleteSharedBankSlot(char_id, slot_id); return UpdateSharedBankSlot(char_id, inst, slot_id); } @@ -251,18 +252,18 @@ bool SharedDatabase::SaveInventory(uint32 char_id, const EQEmu::ItemInstance* in // Needed to clear out bag slots that 'REPLACE' in UpdateInventorySlot does not overwrite..otherwise, duplication occurs // (This requires that parent then child items be sent..which should be how they are currently passed) - if (EQEmu::InventoryProfile::SupportsContainers(slot_id)) + if (EQ::InventoryProfile::SupportsContainers(slot_id)) DeleteInventorySlot(char_id, slot_id); return UpdateInventorySlot(char_id, inst, slot_id); } -bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const EQEmu::ItemInstance* inst, int16 slot_id) { +bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const EQ::ItemInstance* inst, int16 slot_id) { // need to check 'inst' argument for valid pointer - uint32 augslot[EQEmu::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; + uint32 augslot[EQ::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; if (inst->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { - EQEmu::ItemInstance *auginst = inst->GetItem(i); + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { + EQ::ItemInstance *auginst = inst->GetItem(i); augslot[i] = (auginst && auginst->GetItem()) ? auginst->GetItem()->ID : 0; } } @@ -288,12 +289,12 @@ bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const EQEmu::ItemInstan auto results = QueryDatabase(query); // Save bag contents, if slot supports bag contents - if (inst->IsClassBag() && EQEmu::InventoryProfile::SupportsContainers(slot_id)) + if (inst->IsClassBag() && EQ::InventoryProfile::SupportsContainers(slot_id)) // Limiting to bag slot count will get rid of 'hidden' duplicated items and 'Invalid Slot ID' // messages through attrition (and the modded code in SaveInventory) - for (uint8 idx = EQEmu::invbag::SLOT_BEGIN; idx < inst->GetItem()->BagSlots && idx <= EQEmu::invbag::SLOT_END; idx++) { - const EQEmu::ItemInstance* baginst = inst->GetItem(idx); - SaveInventory(char_id, baginst, EQEmu::InventoryProfile::CalcSlotId(slot_id, idx)); + for (uint8 idx = EQ::invbag::SLOT_BEGIN; idx < inst->GetItem()->BagSlots && idx <= EQ::invbag::SLOT_END; idx++) { + const EQ::ItemInstance* baginst = inst->GetItem(idx); + SaveInventory(char_id, baginst, EQ::InventoryProfile::CalcSlotId(slot_id, idx)); } if (!results.Success()) { @@ -303,13 +304,13 @@ bool SharedDatabase::UpdateInventorySlot(uint32 char_id, const EQEmu::ItemInstan return true; } -bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const EQEmu::ItemInstance* inst, int16 slot_id) { +bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const EQ::ItemInstance* inst, int16 slot_id) { // need to check 'inst' argument for valid pointer - uint32 augslot[EQEmu::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; + uint32 augslot[EQ::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; if (inst->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { - EQEmu::ItemInstance *auginst = inst->GetItem(i); + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { + EQ::ItemInstance *auginst = inst->GetItem(i); augslot[i] = (auginst && auginst->GetItem()) ? auginst->GetItem()->ID : 0; } } @@ -334,12 +335,12 @@ bool SharedDatabase::UpdateSharedBankSlot(uint32 char_id, const EQEmu::ItemInsta auto results = QueryDatabase(query); // Save bag contents, if slot supports bag contents - if (inst->IsClassBag() && EQEmu::InventoryProfile::SupportsContainers(slot_id)) { + if (inst->IsClassBag() && EQ::InventoryProfile::SupportsContainers(slot_id)) { // Limiting to bag slot count will get rid of 'hidden' duplicated items and 'Invalid Slot ID' // messages through attrition (and the modded code in SaveInventory) - for (uint8 idx = EQEmu::invbag::SLOT_BEGIN; idx < inst->GetItem()->BagSlots && idx <= EQEmu::invbag::SLOT_END; idx++) { - const EQEmu::ItemInstance* baginst = inst->GetItem(idx); - SaveInventory(char_id, baginst, EQEmu::InventoryProfile::CalcSlotId(slot_id, idx)); + for (uint8 idx = EQ::invbag::SLOT_BEGIN; idx < inst->GetItem()->BagSlots && idx <= EQ::invbag::SLOT_END; idx++) { + const EQ::ItemInstance* baginst = inst->GetItem(idx); + SaveInventory(char_id, baginst, EQ::InventoryProfile::CalcSlotId(slot_id, idx)); } } @@ -360,10 +361,10 @@ bool SharedDatabase::DeleteInventorySlot(uint32 char_id, int16 slot_id) { } // Delete bag slots, if need be - if (!EQEmu::InventoryProfile::SupportsContainers(slot_id)) + if (!EQ::InventoryProfile::SupportsContainers(slot_id)) return true; - int16 base_slot_id = EQEmu::InventoryProfile::CalcSlotId(slot_id, EQEmu::invbag::SLOT_BEGIN); + int16 base_slot_id = EQ::InventoryProfile::CalcSlotId(slot_id, EQ::invbag::SLOT_BEGIN); query = StringFormat("DELETE FROM inventory WHERE charid = %i AND slotid >= %i AND slotid < %i", char_id, base_slot_id, (base_slot_id+10)); results = QueryDatabase(query); @@ -386,10 +387,10 @@ bool SharedDatabase::DeleteSharedBankSlot(uint32 char_id, int16 slot_id) { } // Delete bag slots, if need be - if (!EQEmu::InventoryProfile::SupportsContainers(slot_id)) + if (!EQ::InventoryProfile::SupportsContainers(slot_id)) return true; - int16 base_slot_id = EQEmu::InventoryProfile::CalcSlotId(slot_id, EQEmu::invbag::SLOT_BEGIN); + int16 base_slot_id = EQ::InventoryProfile::CalcSlotId(slot_id, EQ::invbag::SLOT_BEGIN); query = StringFormat("DELETE FROM sharedbank WHERE acctid = %i " "AND slotid >= %i AND slotid < %i", account_id, base_slot_id, (base_slot_id+10)); @@ -429,18 +430,27 @@ bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) { return true; } -bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, EQEmu::InventoryProfile* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) { +bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, EQ::InventoryProfile* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin_level) { - const EQEmu::ItemData* myitem; + const EQ::ItemData *myitem; - std::string query = StringFormat("SELECT itemid, item_charges, slot FROM starting_items " - "WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND " - "(deityid = %i or deityid = 0) AND (zoneid = %i or zoneid = 0) AND " - "gm <= %i ORDER BY id", - si_race, si_class, si_deity, si_current_zone, admin_level); - auto results = QueryDatabase(query); - if (!results.Success()) - return false; + std::string query = StringFormat( + "SELECT itemid, item_charges, slot FROM starting_items " + "WHERE (race = %i or race = 0) AND (class = %i or class = 0) AND " + "(deityid = %i or deityid = 0) AND (zoneid = %i or zoneid = 0) AND " + "gm <= %i %s ORDER BY id", + si_race, + si_class, + si_deity, + si_current_zone, + admin_level, + ContentFilterCriteria::apply().c_str() + ); + + auto results = QueryDatabase(query); + if (!results.Success()) { + return false; + } for (auto row = results.begin(); row != results.end(); ++row) { @@ -452,7 +462,7 @@ bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, EQEmu::Inventory if(!myitem) continue; - EQEmu::ItemInstance* myinst = CreateBaseItem(myitem, charges); + EQ::ItemInstance* myinst = CreateBaseItem(myitem, charges); if(slot < 0) slot = inv->FindFreeSlot(0, 0); @@ -466,7 +476,7 @@ bool SharedDatabase::SetStartingItems(PlayerProfile_Struct* pp, EQEmu::Inventory // Retrieve shared bank inventory based on either account or character -bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool is_charid) +bool SharedDatabase::GetSharedBank(uint32 id, EQ::InventoryProfile *inv, bool is_charid) { std::string query; @@ -493,7 +503,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool uint32 item_id = (uint32)atoi(row[1]); int8 charges = (int8)atoi(row[2]); - uint32 aug[EQEmu::invaug::SOCKET_COUNT]; + uint32 aug[EQ::invaug::SOCKET_COUNT]; aug[0] = (uint32)atoi(row[3]); aug[1] = (uint32)atoi(row[4]); aug[2] = (uint32)atoi(row[5]); @@ -501,7 +511,7 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool aug[4] = (uint32)atoi(row[7]); aug[5] = (uint32)atoi(row[8]); - const EQEmu::ItemData *item = GetItem(item_id); + const EQ::ItemData *item = GetItem(item_id); if (!item) { LogError("Warning: [{}] [{}] has an invalid item_id [{}] in inventory slot [{}]", @@ -511,9 +521,9 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool int16 put_slot_id = INVALID_INDEX; - EQEmu::ItemInstance *inst = CreateBaseItem(item, charges); + EQ::ItemInstance *inst = CreateBaseItem(item, charges); if (inst && item->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if (aug[i]) inst->PutAugment(this, i, aug[i]); } @@ -563,11 +573,11 @@ bool SharedDatabase::GetSharedBank(uint32 id, EQEmu::InventoryProfile *inv, bool } // Overloaded: Retrieve character inventory based on character id (zone entry) -bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) +bool SharedDatabase::GetInventory(uint32 char_id, EQ::InventoryProfile *inv) { if (!char_id || !inv) return false; - + // Retrieve character inventory std::string query = StringFormat("SELECT slotid, itemid, charges, color, augslot1, augslot2, augslot3, augslot4, augslot5, " @@ -591,28 +601,28 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) for (auto row = results.begin(); row != results.end(); ++row) { int16 slot_id = atoi(row[0]); - if (slot_id <= EQEmu::invslot::POSSESSIONS_END && slot_id >= EQEmu::invslot::POSSESSIONS_BEGIN) { // Titanium thru UF check + if (slot_id <= EQ::invslot::POSSESSIONS_END && slot_id >= EQ::invslot::POSSESSIONS_BEGIN) { // Titanium thru UF check if ((((uint64)1 << slot_id) & pmask) == 0) { cv_conflict = true; continue; } } - else if (slot_id <= EQEmu::invbag::GENERAL_BAGS_END && slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { // Titanium thru UF check - auto parent_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (slot_id <= EQ::invbag::GENERAL_BAGS_END && slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN) { // Titanium thru UF check + auto parent_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << parent_slot) & pmask) == 0) { cv_conflict = true; continue; } } - else if (slot_id <= EQEmu::invslot::BANK_END && slot_id >= EQEmu::invslot::BANK_BEGIN) { // Titanium check - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= bank_size) { + else if (slot_id <= EQ::invslot::BANK_END && slot_id >= EQ::invslot::BANK_BEGIN) { // Titanium check + if ((slot_id - EQ::invslot::BANK_BEGIN) >= bank_size) { cv_conflict = true; continue; } } - else if (slot_id <= EQEmu::invbag::BANK_BAGS_END && slot_id >= EQEmu::invbag::BANK_BAGS_BEGIN) { // Titanium check - auto parent_index = ((slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); - if (parent_index < EQEmu::invslot::SLOT_BEGIN || parent_index >= bank_size) { + else if (slot_id <= EQ::invbag::BANK_BAGS_END && slot_id >= EQ::invbag::BANK_BAGS_BEGIN) { // Titanium check + auto parent_index = ((slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); + if (parent_index < EQ::invslot::SLOT_BEGIN || parent_index >= bank_size) { cv_conflict = true; continue; } @@ -622,7 +632,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) uint16 charges = atoi(row[2]); uint32 color = atoul(row[3]); - uint32 aug[EQEmu::invaug::SOCKET_COUNT]; + uint32 aug[EQ::invaug::SOCKET_COUNT]; aug[0] = (uint32)atoul(row[4]); aug[1] = (uint32)atoul(row[5]); @@ -637,7 +647,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) uint32 ornament_idfile = (uint32)atoul(row[13]); uint32 ornament_hero_model = (uint32)atoul(row[14]); - const EQEmu::ItemData *item = GetItem(item_id); + const EQ::ItemData *item = GetItem(item_id); if (!item) { LogError("Warning: charid [{}] has an invalid item_id [{}] in inventory slot [{}]", char_id, item_id, @@ -647,7 +657,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) int16 put_slot_id = INVALID_INDEX; - EQEmu::ItemInstance *inst = CreateBaseItem(item, charges); + EQ::ItemInstance *inst = CreateBaseItem(item, charges); if (inst == nullptr) continue; @@ -682,7 +692,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) inst->SetOrnamentationIDFile(ornament_idfile); inst->SetOrnamentHeroModel(item->HerosForgeModel); - if (instnodrop || (inst->GetItem()->Attuneable && slot_id >= EQEmu::invslot::EQUIPMENT_BEGIN && slot_id <= EQEmu::invslot::EQUIPMENT_END)) + if (instnodrop || (inst->GetItem()->Attuneable && slot_id >= EQ::invslot::EQUIPMENT_BEGIN && slot_id <= EQ::invslot::EQUIPMENT_END)) inst->SetAttuned(true); if (color > 0) @@ -703,7 +713,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) } if (item->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if (aug[i]) inst->PutAugment(this, i, aug[i]); } @@ -728,14 +738,14 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) char_id, item_id, slot_id); } } - + if (cv_conflict) { char char_name[64] = ""; GetCharName(char_id, char_name); LogError("ClientVersion/Expansion conflict during inventory load at zone entry for [{}] (charid: [{}], inver: [{}], gmi: [{}])", char_name, char_id, - EQEmu::versions::MobVersionName(inv->InventoryVersion()), + EQ::versions::MobVersionName(inv->InventoryVersion()), (inv->GMInventory() ? "true" : "false") ); } @@ -745,7 +755,7 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQEmu::InventoryProfile *inv) } // Overloaded: Retrieve character inventory based on account_id and character name (char select) -bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQEmu::InventoryProfile *inv) // deprecated +bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQ::InventoryProfile *inv) // deprecated { // Retrieve character inventory std::string query = @@ -769,7 +779,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQEmu::Inventor int8 charges = atoi(row[2]); uint32 color = atoul(row[3]); - uint32 aug[EQEmu::invaug::SOCKET_COUNT]; + uint32 aug[EQ::invaug::SOCKET_COUNT]; aug[0] = (uint32)atoi(row[4]); aug[1] = (uint32)atoi(row[5]); aug[2] = (uint32)atoi(row[6]); @@ -782,12 +792,12 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQEmu::Inventor uint32 ornament_idfile = (uint32)atoul(row[13]); uint32 ornament_hero_model = (uint32)atoul(row[14]); - const EQEmu::ItemData *item = GetItem(item_id); + const EQ::ItemData *item = GetItem(item_id); int16 put_slot_id = INVALID_INDEX; if (!item) continue; - EQEmu::ItemInstance *inst = CreateBaseItem(item, charges); + EQ::ItemInstance *inst = CreateBaseItem(item, charges); if (inst == nullptr) continue; @@ -830,7 +840,7 @@ bool SharedDatabase::GetInventory(uint32 account_id, char *name, EQEmu::Inventor inst->SetCharges(charges); if (item->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if (aug[i]) inst->PutAugment(this, i, aug[i]); } @@ -914,11 +924,12 @@ bool SharedDatabase::LoadItems(const std::string &prefix) { try { auto Config = EQEmuConfig::get(); - EQEmu::IPCMutex mutex("items"); + EQ::IPCMutex mutex("items"); mutex.Lock(); std::string file_name = Config->SharedMemDir + prefix + std::string("items"); - items_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name)); - items_hash = std::unique_ptr>(new EQEmu::FixedMemoryHashSet(reinterpret_cast(items_mmf->Get()), items_mmf->Size())); + LogInfo("[Shared Memory] Attempting to load file [{}]", file_name); + items_mmf = std::make_unique(file_name); + items_hash = std::make_unique>(reinterpret_cast(items_mmf->Get()), items_mmf->Size()); mutex.Unlock(); } catch(std::exception& ex) { LogError("Error Loading Items: {}", ex.what()); @@ -930,7 +941,7 @@ bool SharedDatabase::LoadItems(const std::string &prefix) { void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id) { - EQEmu::FixedMemoryHashSet hash(reinterpret_cast(data), size, items, max_item_id); + EQ::FixedMemoryHashSet hash(reinterpret_cast(data), size, items, max_item_id); std::string ndbuffer; bool disableNoRent = false; @@ -958,7 +969,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ } } - EQEmu::ItemData item; + EQ::ItemData item; const std::string query = "SELECT source," #define F(x) "`"#x"`," @@ -971,7 +982,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ } for (auto row = results.begin(); row != results.end(); ++row) { - memset(&item, 0, sizeof(EQEmu::ItemData)); + memset(&item, 0, sizeof(EQ::ItemData)); item.ItemClass = (uint8)atoi(row[ItemField::itemclass]); strcpy(item.Name, row[ItemField::name]); @@ -1029,6 +1040,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ item.MaxCharges = (int16)atoi(row[ItemField::maxcharges]); item.ItemType = (uint8)atoi(row[ItemField::itemtype]); + item.SubType = atoi(row[ItemField::subtype]); item.Material = (uint8)atoi(row[ItemField::material]); item.HerosForgeModel = (uint32)atoi(row[ItemField::herosforgemodel]); item.SellRate = (float)atof(row[ItemField::sellrate]); @@ -1188,7 +1200,7 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_ } } -const EQEmu::ItemData *SharedDatabase::GetItem(uint32 id) +const EQ::ItemData *SharedDatabase::GetItem(uint32 id) { if (id == 0) { return nullptr; @@ -1205,7 +1217,7 @@ const EQEmu::ItemData *SharedDatabase::GetItem(uint32 id) return nullptr; } -const EQEmu::ItemData* SharedDatabase::IterateItems(uint32* id) { +const EQ::ItemData* SharedDatabase::IterateItems(uint32* id) { if(!items_hash || !id) { return nullptr; } @@ -1283,7 +1295,7 @@ const NPCFactionList* SharedDatabase::GetNPCFactionEntry(uint32 id) { } void SharedDatabase::LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists) { - EQEmu::FixedMemoryHashSet hash(reinterpret_cast(data), size, list_count, max_lists); + EQ::FixedMemoryHashSet hash(reinterpret_cast(data), size, list_count, max_lists); NPCFactionList faction; const std::string query = "SELECT npc_faction.id, npc_faction.primaryfaction, npc_faction.ignore_primary_assist, " @@ -1337,11 +1349,12 @@ bool SharedDatabase::LoadNPCFactionLists(const std::string &prefix) { try { auto Config = EQEmuConfig::get(); - EQEmu::IPCMutex mutex("faction"); + EQ::IPCMutex mutex("faction"); mutex.Lock(); std::string file_name = Config->SharedMemDir + prefix + std::string("faction"); - faction_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name)); - faction_hash = std::unique_ptr>(new EQEmu::FixedMemoryHashSet(reinterpret_cast(faction_mmf->Get()), faction_mmf->Size())); + LogInfo("[Shared Memory] Attempting to load file [{}]", file_name); + faction_mmf = std::make_unique(file_name); + faction_hash = std::make_unique>(reinterpret_cast(faction_mmf->Get()), faction_mmf->Size()); mutex.Unlock(); } catch(std::exception& ex) { LogError("Error Loading npc factions: {}", ex.what()); @@ -1351,18 +1364,18 @@ bool SharedDatabase::LoadNPCFactionLists(const std::string &prefix) { return true; } -// Create appropriate EQEmu::ItemInstance class -EQEmu::ItemInstance* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned) +// Create appropriate EQ::ItemInstance class +EQ::ItemInstance* SharedDatabase::CreateItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned) { - const EQEmu::ItemData* item = nullptr; - EQEmu::ItemInstance* inst = nullptr; + const EQ::ItemData* item = nullptr; + EQ::ItemInstance* inst = nullptr; item = GetItem(item_id); if (item) { inst = CreateBaseItem(item, charges); if (inst == nullptr) { - LogError("Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateItem()"); + LogError("Error: valid item data returned a null reference for EQ::ItemInstance creation in SharedDatabase::CreateItem()"); LogError("Item Data = ID: {}, Name: {}, Charges: {}", item->ID, item->Name, charges); return nullptr; } @@ -1380,15 +1393,15 @@ EQEmu::ItemInstance* SharedDatabase::CreateItem(uint32 item_id, int16 charges, u } -// Create appropriate EQEmu::ItemInstance class -EQEmu::ItemInstance* SharedDatabase::CreateItem(const EQEmu::ItemData* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned) +// Create appropriate EQ::ItemInstance class +EQ::ItemInstance* SharedDatabase::CreateItem(const EQ::ItemData* item, int16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6, uint8 attuned) { - EQEmu::ItemInstance* inst = nullptr; + EQ::ItemInstance* inst = nullptr; if (item) { inst = CreateBaseItem(item, charges); if (inst == nullptr) { - LogError("Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateItem()"); + LogError("Error: valid item data returned a null reference for EQ::ItemInstance creation in SharedDatabase::CreateItem()"); LogError("Item Data = ID: {}, Name: {}, Charges: {}", item->ID, item->Name, charges); return nullptr; } @@ -1405,8 +1418,8 @@ EQEmu::ItemInstance* SharedDatabase::CreateItem(const EQEmu::ItemData* item, int return inst; } -EQEmu::ItemInstance* SharedDatabase::CreateBaseItem(const EQEmu::ItemData* item, int16 charges) { - EQEmu::ItemInstance* inst = nullptr; +EQ::ItemInstance* SharedDatabase::CreateBaseItem(const EQ::ItemData* item, int16 charges) { + EQ::ItemInstance* inst = nullptr; if (item) { // if maxcharges is -1 that means it is an unlimited use item. // set it to 1 charge so that it is usable on creation @@ -1416,10 +1429,10 @@ EQEmu::ItemInstance* SharedDatabase::CreateBaseItem(const EQEmu::ItemData* item, if(charges <= 0 && item->Stackable) charges = 1; - inst = new EQEmu::ItemInstance(item, charges); + inst = new EQ::ItemInstance(item, charges); if (inst == nullptr) { - LogError("Error: valid item data returned a null reference for EQEmu::ItemInstance creation in SharedDatabase::CreateBaseItem()"); + LogError("Error: valid item data returned a null reference for EQ::ItemInstance creation in SharedDatabase::CreateBaseItem()"); LogError("Item Data = ID: {}, Name: {}, Charges: {}", item->ID, item->Name, charges); return nullptr; } @@ -1462,7 +1475,7 @@ bool SharedDatabase::GetCommandSettings(std::mapSharedMemDir + prefix + std::string("skill_caps"); - skill_caps_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name)); + LogInfo("[Shared Memory] Attempting to load file [{}]", file_name); + skill_caps_mmf = std::make_unique(file_name); mutex.Unlock(); } catch(std::exception &ex) { LogError("Error loading skill caps: {}", ex.what()); @@ -1553,7 +1567,7 @@ bool SharedDatabase::LoadSkillCaps(const std::string &prefix) { void SharedDatabase::LoadSkillCaps(void *data) { uint32 class_count = PLAYER_CLASS_COUNT; - uint32 skill_count = EQEmu::skills::HIGHEST_SKILL + 1; + uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; uint32 level_count = HARD_LEVEL_CAP + 1; uint16 *skill_caps_table = reinterpret_cast(data); @@ -1578,7 +1592,7 @@ void SharedDatabase::LoadSkillCaps(void *data) { } } -uint16 SharedDatabase::GetSkillCap(uint8 Class_, EQEmu::skills::SkillType Skill, uint8 Level) { +uint16 SharedDatabase::GetSkillCap(uint8 Class_, EQ::skills::SkillType Skill, uint8 Level) { if(!skill_caps_mmf) { return 0; } @@ -1592,7 +1606,7 @@ uint16 SharedDatabase::GetSkillCap(uint8 Class_, EQEmu::skills::SkillType Skill, } uint32 class_count = PLAYER_CLASS_COUNT; - uint32 skill_count = EQEmu::skills::HIGHEST_SKILL + 1; + uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; uint32 level_count = HARD_LEVEL_CAP + 1; if(Class_ > class_count || static_cast(Skill) > skill_count || Level > level_count) { return 0; @@ -1607,7 +1621,7 @@ uint16 SharedDatabase::GetSkillCap(uint8 Class_, EQEmu::skills::SkillType Skill, return skill_caps_table[index]; } -uint8 SharedDatabase::GetTrainLevel(uint8 Class_, EQEmu::skills::SkillType Skill, uint8 Level) { +uint8 SharedDatabase::GetTrainLevel(uint8 Class_, EQ::skills::SkillType Skill, uint8 Level) { if(!skill_caps_mmf) { return 0; } @@ -1621,7 +1635,7 @@ uint8 SharedDatabase::GetTrainLevel(uint8 Class_, EQEmu::skills::SkillType Skill } uint32 class_count = PLAYER_CLASS_COUNT; - uint32 skill_count = EQEmu::skills::HIGHEST_SKILL + 1; + uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; uint32 level_count = HARD_LEVEL_CAP + 1; if(Class_ > class_count || static_cast(Skill) > skill_count || Level > level_count) { return 0; @@ -1694,11 +1708,12 @@ bool SharedDatabase::LoadSpells(const std::string &prefix, int32 *records, const try { auto Config = EQEmuConfig::get(); - EQEmu::IPCMutex mutex("spells"); + EQ::IPCMutex mutex("spells"); mutex.Lock(); - + std::string file_name = Config->SharedMemDir + prefix + std::string("spells"); - spells_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name)); + spells_mmf = std::make_unique(file_name); + LogInfo("[Shared Memory] Attempting to load file [{}]", file_name); *records = *reinterpret_cast(spells_mmf->Get()); *sp = reinterpret_cast((char*)spells_mmf->Get() + 4); mutex.Unlock(); @@ -1792,10 +1807,10 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) { int tmp_skill = atoi(row[100]);; - if (tmp_skill < 0 || tmp_skill > EQEmu::skills::HIGHEST_SKILL) - sp[tempid].skill = EQEmu::skills::SkillBegging; /* not much better we can do. */ // can probably be changed to client-based 'SkillNone' once activated + if (tmp_skill < 0 || tmp_skill > EQ::skills::HIGHEST_SKILL) + sp[tempid].skill = EQ::skills::SkillBegging; /* not much better we can do. */ // can probably be changed to client-based 'SkillNone' once activated else - sp[tempid].skill = (EQEmu::skills::SkillType) tmp_skill; + sp[tempid].skill = (EQ::skills::SkillType) tmp_skill; sp[tempid].zonetype=atoi(row[101]); sp[tempid].EnvironmentType=atoi(row[102]); @@ -1901,11 +1916,11 @@ bool SharedDatabase::LoadBaseData(const std::string &prefix) { try { auto Config = EQEmuConfig::get(); - EQEmu::IPCMutex mutex("base_data"); + EQ::IPCMutex mutex("base_data"); mutex.Lock(); std::string file_name = Config->SharedMemDir + prefix + std::string("base_data"); - base_data_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name)); + base_data_mmf = std::make_unique(file_name); mutex.Unlock(); } catch(std::exception& ex) { LogError("Error Loading Base Data: {}", ex.what()); @@ -1996,7 +2011,11 @@ void SharedDatabase::GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot loot_table_count = 0; max_loot_table = 0; loot_table_entries = 0; - const std::string query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable"; + const std::string query = + fmt::format( + "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM loottable_entries) FROM loottable WHERE TRUE {}", + ContentFilterCriteria::apply() + ); auto results = QueryDatabase(query); if (!results.Success()) { return; @@ -2017,7 +2036,11 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d max_loot_drop = 0; loot_drop_entries = 0; - const std::string query = "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop"; + const std::string query = fmt::format( + "SELECT COUNT(*), MAX(id), (SELECT COUNT(*) FROM lootdrop_entries) FROM lootdrop WHERE TRUE {}", + ContentFilterCriteria::apply() + ); + auto results = QueryDatabase(query); if (!results.Success()) { return; @@ -2034,104 +2057,160 @@ void SharedDatabase::GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_d } void SharedDatabase::LoadLootTables(void *data, uint32 size) { - EQEmu::FixedMemoryVariableHashSet hash(reinterpret_cast(data), size); + EQ::FixedMemoryVariableHashSet hash(reinterpret_cast(data), size); uint8 loot_table[sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)]; LootTable_Struct *lt = reinterpret_cast(loot_table); - const std::string query = "SELECT loottable.id, loottable.mincash, loottable.maxcash, loottable.avgcoin, " - "loottable_entries.lootdrop_id, loottable_entries.multiplier, loottable_entries.droplimit, " - "loottable_entries.mindrop, loottable_entries.probability FROM loottable LEFT JOIN loottable_entries " - "ON loottable.id = loottable_entries.loottable_id ORDER BY id"; + const std::string query = fmt::format( + SQL( + SELECT + loottable.id, + loottable.mincash, + loottable.maxcash, + loottable.avgcoin, + loottable_entries.lootdrop_id, + loottable_entries.multiplier, + loottable_entries.droplimit, + loottable_entries.mindrop, + loottable_entries.probability + FROM + loottable + LEFT JOIN loottable_entries ON loottable.id = loottable_entries.loottable_id + WHERE TRUE {} + ORDER BY + id + ), + ContentFilterCriteria::apply() + ); + auto results = QueryDatabase(query); if (!results.Success()) { return; } - uint32 current_id = 0; - uint32 current_entry = 0; + uint32 current_id = 0; + uint32 current_entry = 0; - for (auto row = results.begin(); row != results.end(); ++row) { - uint32 id = static_cast(atoul(row[0])); - if(id != current_id) { - if(current_id != 0) - hash.insert(current_id, loot_table, (sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * lt->NumEntries))); + for (auto row = results.begin(); row != results.end(); ++row) { + uint32 id = static_cast(atoul(row[0])); + if (id != current_id) { + if (current_id != 0) { + hash.insert( + current_id, + loot_table, + (sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * lt->NumEntries))); + } - memset(loot_table, 0, sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)); - current_entry = 0; - current_id = id; - lt->mincash = static_cast(atoul(row[1])); - lt->maxcash = static_cast(atoul(row[2])); - lt->avgcoin = static_cast(atoul(row[3])); - } + memset(loot_table, 0, sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * 128)); + current_entry = 0; + current_id = id; + lt->mincash = static_cast(atoul(row[1])); + lt->maxcash = static_cast(atoul(row[2])); + lt->avgcoin = static_cast(atoul(row[3])); + } - if(current_entry > 128) - continue; + if (current_entry > 128) { + continue; + } - if(!row[4]) - continue; + if (!row[4]) { + continue; + } - lt->Entries[current_entry].lootdrop_id = static_cast(atoul(row[4])); - lt->Entries[current_entry].multiplier = static_cast(atoi(row[5])); - lt->Entries[current_entry].droplimit = static_cast(atoi(row[6])); - lt->Entries[current_entry].mindrop = static_cast(atoi(row[7])); - lt->Entries[current_entry].probability = static_cast(atof(row[8])); + lt->Entries[current_entry].lootdrop_id = static_cast(atoul(row[4])); + lt->Entries[current_entry].multiplier = static_cast(atoi(row[5])); + lt->Entries[current_entry].droplimit = static_cast(atoi(row[6])); + lt->Entries[current_entry].mindrop = static_cast(atoi(row[7])); + lt->Entries[current_entry].probability = static_cast(atof(row[8])); - ++(lt->NumEntries); - ++current_entry; - } + ++(lt->NumEntries); + ++current_entry; + } - if(current_id != 0) - hash.insert(current_id, loot_table, (sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * lt->NumEntries))); + if (current_id != 0) { + hash.insert( + current_id, + loot_table, + (sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * lt->NumEntries)) + ); + } } void SharedDatabase::LoadLootDrops(void *data, uint32 size) { - EQEmu::FixedMemoryVariableHashSet hash(reinterpret_cast(data), size); + EQ::FixedMemoryVariableHashSet hash(reinterpret_cast(data), size); uint8 loot_drop[sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)]; - LootDrop_Struct *ld = reinterpret_cast(loot_drop); + LootDrop_Struct *p_loot_drop_struct = reinterpret_cast(loot_drop); + + const std::string query = fmt::format( + SQL( + SELECT + lootdrop.id, + lootdrop_entries.item_id, + lootdrop_entries.item_charges, + lootdrop_entries.equip_item, + lootdrop_entries.chance, + lootdrop_entries.trivial_min_level, + lootdrop_entries.trivial_max_level, + lootdrop_entries.npc_min_level, + lootdrop_entries.npc_max_level, + lootdrop_entries.multiplier + FROM + lootdrop + JOIN lootdrop_entries ON lootdrop.id = lootdrop_entries.lootdrop_id + WHERE + TRUE {} + ORDER BY + lootdrop_id + ), + ContentFilterCriteria::apply() + ); - const std::string query = "SELECT lootdrop.id, lootdrop_entries.item_id, lootdrop_entries.item_charges, " - "lootdrop_entries.equip_item, lootdrop_entries.chance, lootdrop_entries.minlevel, " - "lootdrop_entries.maxlevel, lootdrop_entries.multiplier FROM lootdrop JOIN lootdrop_entries " - "ON lootdrop.id = lootdrop_entries.lootdrop_id ORDER BY lootdrop_id"; auto results = QueryDatabase(query); if (!results.Success()) { return; } - uint32 current_id = 0; - uint32 current_entry = 0; + uint32 current_id = 0; + uint32 current_entry = 0; - for (auto row = results.begin(); row != results.end(); ++row) { - uint32 id = static_cast(atoul(row[0])); - if(id != current_id) { - if(current_id != 0) - hash.insert(current_id, loot_drop, (sizeof(LootDrop_Struct) +(sizeof(LootDropEntries_Struct) * ld->NumEntries))); + for (auto row = results.begin(); row != results.end(); ++row) { + auto id = static_cast(atoul(row[0])); + if (id != current_id) { + if (current_id != 0) { + hash.insert( + current_id, + loot_drop, + (sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * p_loot_drop_struct->NumEntries))); + } - memset(loot_drop, 0, sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)); + memset(loot_drop, 0, sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * 1260)); current_entry = 0; - current_id = id; - } + current_id = id; + } - if(current_entry >= 1260) - continue; + if (current_entry >= 1260) { + continue; + } - ld->Entries[current_entry].item_id = static_cast(atoul(row[1])); - ld->Entries[current_entry].item_charges = static_cast(atoi(row[2])); - ld->Entries[current_entry].equip_item = static_cast(atoi(row[3])); - ld->Entries[current_entry].chance = static_cast(atof(row[4])); - ld->Entries[current_entry].minlevel = static_cast(atoi(row[5])); - ld->Entries[current_entry].maxlevel = static_cast(atoi(row[6])); - ld->Entries[current_entry].multiplier = static_cast(atoi(row[7])); + p_loot_drop_struct->Entries[current_entry].item_id = static_cast(atoul(row[1])); + p_loot_drop_struct->Entries[current_entry].item_charges = static_cast(atoi(row[2])); + p_loot_drop_struct->Entries[current_entry].equip_item = static_cast(atoi(row[3])); + p_loot_drop_struct->Entries[current_entry].chance = static_cast(atof(row[4])); + p_loot_drop_struct->Entries[current_entry].trivial_min_level = static_cast(atoi(row[5])); + p_loot_drop_struct->Entries[current_entry].trivial_max_level = static_cast(atoi(row[6])); + p_loot_drop_struct->Entries[current_entry].npc_min_level = static_cast(atoi(row[7])); + p_loot_drop_struct->Entries[current_entry].npc_max_level = static_cast(atoi(row[8])); + p_loot_drop_struct->Entries[current_entry].multiplier = static_cast(atoi(row[9])); - ++(ld->NumEntries); - ++current_entry; - } + ++(p_loot_drop_struct->NumEntries); + ++current_entry; + } - if(current_id != 0) - hash.insert(current_id, loot_drop, (sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * ld->NumEntries))); + if(current_id != 0) + hash.insert(current_id, loot_drop, (sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * p_loot_drop_struct->NumEntries))); } @@ -2141,18 +2220,18 @@ bool SharedDatabase::LoadLoot(const std::string &prefix) { try { auto Config = EQEmuConfig::get(); - EQEmu::IPCMutex mutex("loot"); + EQ::IPCMutex mutex("loot"); mutex.Lock(); std::string file_name_lt = Config->SharedMemDir + prefix + std::string("loot_table"); - loot_table_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name_lt)); - loot_table_hash = std::unique_ptr>(new EQEmu::FixedMemoryVariableHashSet( + loot_table_mmf = std::make_unique(file_name_lt); + loot_table_hash = std::make_unique>( reinterpret_cast(loot_table_mmf->Get()), - loot_table_mmf->Size())); + loot_table_mmf->Size()); std::string file_name_ld = Config->SharedMemDir + prefix + std::string("loot_drop"); - loot_drop_mmf = std::unique_ptr(new EQEmu::MemoryMappedFile(file_name_ld)); - loot_drop_hash = std::unique_ptr>(new EQEmu::FixedMemoryVariableHashSet( + loot_drop_mmf = std::make_unique(file_name_ld); + loot_drop_hash = std::make_unique>( reinterpret_cast(loot_drop_mmf->Get()), - loot_drop_mmf->Size())); + loot_drop_mmf->Size()); mutex.Unlock(); } catch(std::exception &ex) { LogError("Error loading loot: {}", ex.what()); diff --git a/common/shareddb.h b/common/shareddb.h index 8deb65126..13548c0d3 100644 --- a/common/shareddb.h +++ b/common/shareddb.h @@ -1,25 +1,27 @@ -/* EQEMu: Everquest Server Emulator - Copyright (C) 2001-2016 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 -*/ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ #ifndef SHAREDDB_H_ #define SHAREDDB_H_ -#define MAX_ITEM_ID 200000 +#define MAX_ITEM_ID 200000 #include "database.h" #include "skills.h" @@ -27,6 +29,7 @@ #include "base_data.h" #include "fixed_memory_hash_set.h" #include "fixed_memory_variable_hash_set.h" +#include "say_link.h" #include #include @@ -41,8 +44,10 @@ struct NPCFactionList; struct LootTable_Struct; struct LootDrop_Struct; -namespace EQEmu + +namespace EQ { + struct ItemData; class ItemInstance; class InventoryProfile; @@ -54,114 +59,158 @@ namespace EQEmu and is mainly here to facilitate shared memory, and other things which only world and zone need. */ -class SharedDatabase : public Database -{ - public: - SharedDatabase(); - SharedDatabase(const char* host, const char* user, const char* passwd, const char* database, uint32 port); - virtual ~SharedDatabase(); - /* - General Character Related Stuff - */ - bool SetGMSpeed(uint32 account_id, uint8 gmspeed); - uint8 GetGMSpeed(uint32 account_id); - bool SetHideMe(uint32 account_id, uint8 hideme); - int32 DeleteStalePlayerCorpses(); - void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message); - void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message); - bool GetCommandSettings(std::map>> &command_settings); - bool UpdateInjectedCommandSettings(const std::vector> &injected); - bool UpdateOrphanedCommandSettings(const std::vector &orphaned); - uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID); - void SetMailKey(int CharID, int IPAddress, int MailKey); - std::string GetMailKey(int CharID, bool key_only = false); +class SharedDatabase : public Database { +public: + SharedDatabase(); + SharedDatabase(const char *host, const char *user, const char *passwd, const char *database, uint32 port); + virtual ~SharedDatabase(); - /* - Character InventoryProfile - */ - bool SaveCursor(uint32 char_id, std::list::const_iterator &start, std::list::const_iterator &end); - bool SaveInventory(uint32 char_id, const EQEmu::ItemInstance* inst, int16 slot_id); - bool DeleteSharedBankSlot(uint32 char_id, int16 slot_id); - bool DeleteInventorySlot(uint32 char_id, int16 slot_id); - bool UpdateInventorySlot(uint32 char_id, const EQEmu::ItemInstance* inst, int16 slot_id); - bool UpdateSharedBankSlot(uint32 char_id, const EQEmu::ItemInstance* inst, int16 slot_id); - bool VerifyInventory(uint32 account_id, int16 slot_id, const EQEmu::ItemInstance* inst); - bool GetSharedBank(uint32 id, EQEmu::InventoryProfile* inv, bool is_charid); - int32 GetSharedPlatinum(uint32 account_id); - bool SetSharedPlatinum(uint32 account_id, int32 amount_to_add); - bool GetInventory(uint32 char_id, EQEmu::InventoryProfile* inv); - bool GetInventory(uint32 account_id, char* name, EQEmu::InventoryProfile* inv); // deprecated - std::map GetItemRecastTimestamps(uint32 char_id); - uint32 GetItemRecastTimestamp(uint32 char_id, uint32 recast_type); - void ClearOldRecastTimestamps(uint32 char_id); - bool SetStartingItems(PlayerProfile_Struct* pp, EQEmu::InventoryProfile* inv, uint32 si_race, uint32 si_class, uint32 si_deity, uint32 si_current_zone, char* si_name, int admin); + /** + * Character + */ + bool SetGMSpeed(uint32 account_id, uint8 gmspeed); + uint8 GetGMSpeed(uint32 account_id); + bool SetHideMe(uint32 account_id, uint8 hideme); + int32 DeleteStalePlayerCorpses(); + void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct *message); + void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct *message); + bool GetCommandSettings(std::map>> &command_settings); + bool UpdateInjectedCommandSettings(const std::vector> &injected); + bool UpdateOrphanedCommandSettings(const std::vector &orphaned); + uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID); + void SetMailKey(int CharID, int IPAddress, int MailKey); + std::string GetMailKey(int CharID, bool key_only = false); + bool SaveCursor( + uint32 char_id, + std::list::const_iterator &start, + std::list::const_iterator &end + ); + bool SaveInventory(uint32 char_id, const EQ::ItemInstance *inst, int16 slot_id); + bool DeleteSharedBankSlot(uint32 char_id, int16 slot_id); + bool DeleteInventorySlot(uint32 char_id, int16 slot_id); + bool UpdateInventorySlot(uint32 char_id, const EQ::ItemInstance *inst, int16 slot_id); + bool UpdateSharedBankSlot(uint32 char_id, const EQ::ItemInstance *inst, int16 slot_id); + bool VerifyInventory(uint32 account_id, int16 slot_id, const EQ::ItemInstance *inst); + bool GetSharedBank(uint32 id, EQ::InventoryProfile *inv, bool is_charid); + int32 GetSharedPlatinum(uint32 account_id); + bool SetSharedPlatinum(uint32 account_id, int32 amount_to_add); + bool GetInventory(uint32 char_id, EQ::InventoryProfile *inv); + bool GetInventory(uint32 account_id, char *name, EQ::InventoryProfile *inv); // deprecated + std::map GetItemRecastTimestamps(uint32 char_id); + uint32 GetItemRecastTimestamp(uint32 char_id, uint32 recast_type); + void ClearOldRecastTimestamps(uint32 char_id); + bool SetStartingItems( + PlayerProfile_Struct *pp, + EQ::InventoryProfile *inv, + uint32 si_race, + uint32 si_class, + uint32 si_deity, + uint32 si_current_zone, + char *si_name, + int admin + ); + std::string GetBook(const char *txtfile, int16 *language); - std::string GetBook(const char *txtfile, int16 *language); + /** + * items + */ + EQ::ItemInstance *CreateItem( + uint32 item_id, + int16 charges = 0, + uint32 aug1 = 0, + uint32 aug2 = 0, + uint32 aug3 = 0, + uint32 aug4 = 0, + uint32 aug5 = 0, + uint32 aug6 = 0, + uint8 attuned = 0 + ); + EQ::ItemInstance *CreateItem( + const EQ::ItemData *item, + int16 charges = 0, + uint32 aug1 = 0, + uint32 aug2 = 0, + uint32 aug3 = 0, + uint32 aug4 = 0, + uint32 aug5 = 0, + uint32 aug6 = 0, + uint8 attuned = 0 + ); + EQ::ItemInstance *CreateBaseItem(const EQ::ItemData *item, int16 charges = 0); - /* - Item Methods - */ - EQEmu::ItemInstance* CreateItem(uint32 item_id, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0); - EQEmu::ItemInstance* CreateItem(const EQEmu::ItemData* item, int16 charges = 0, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, uint8 attuned = 0); - EQEmu::ItemInstance* CreateBaseItem(const EQEmu::ItemData* item, int16 charges = 0); + void GetItemsCount(int32 &item_count, uint32 &max_id); + void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id); + bool LoadItems(const std::string &prefix); + const EQ::ItemData *IterateItems(uint32 *id); + const EQ::ItemData *GetItem(uint32 id); + const EvolveInfo *GetEvolveInfo(uint32 loregroup); - /* - Shared Memory crap - */ + /** + * faction + */ + void GetFactionListInfo(uint32 &list_count, uint32 &max_lists); + const NPCFactionList *GetNPCFactionEntry(uint32 id); + void LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists); + bool LoadNPCFactionLists(const std::string &prefix); - //items - void GetItemsCount(int32 &item_count, uint32 &max_id); - void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id); - bool LoadItems(const std::string &prefix); - const EQEmu::ItemData* IterateItems(uint32* id); - const EQEmu::ItemData* GetItem(uint32 id); - const EvolveInfo* GetEvolveInfo(uint32 loregroup); + /** + * loot + */ + void GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot_table, uint32 &loot_table_entries); + void GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_drop, uint32 &loot_drop_entries); + void LoadLootTables(void *data, uint32 size); + void LoadLootDrops(void *data, uint32 size); + bool LoadLoot(const std::string &prefix); + const LootTable_Struct *GetLootTable(uint32 loottable_id); + const LootDrop_Struct *GetLootDrop(uint32 lootdrop_id); - //faction lists - void GetFactionListInfo(uint32 &list_count, uint32 &max_lists); - const NPCFactionList* GetNPCFactionEntry(uint32 id); - void LoadNPCFactionLists(void *data, uint32 size, uint32 list_count, uint32 max_lists); - bool LoadNPCFactionLists(const std::string &prefix); + /** + * skills + */ + void LoadSkillCaps(void *data); + bool LoadSkillCaps(const std::string &prefix); + uint16 GetSkillCap(uint8 Class_, EQ::skills::SkillType Skill, uint8 Level); + uint8 GetTrainLevel(uint8 Class_, EQ::skills::SkillType Skill, uint8 Level); - //loot - void GetLootTableInfo(uint32 &loot_table_count, uint32 &max_loot_table, uint32 &loot_table_entries); - void GetLootDropInfo(uint32 &loot_drop_count, uint32 &max_loot_drop, uint32 &loot_drop_entries); - void LoadLootTables(void *data, uint32 size); - void LoadLootDrops(void *data, uint32 size); - bool LoadLoot(const std::string &prefix); - const LootTable_Struct* GetLootTable(uint32 loottable_id); - const LootDrop_Struct* GetLootDrop(uint32 lootdrop_id); + /** + * spells + */ + int GetMaxSpellID(); + bool LoadSpells(const std::string &prefix, int32 *records, const SPDat_Spell_Struct **sp); + void LoadSpells(void *data, int max_spells); + void LoadDamageShieldTypes(SPDat_Spell_Struct *sp, int32 iMaxSpellID); - void LoadSkillCaps(void *data); - bool LoadSkillCaps(const std::string &prefix); - uint16 GetSkillCap(uint8 Class_, EQEmu::skills::SkillType Skill, uint8 Level); - uint8 GetTrainLevel(uint8 Class_, EQEmu::skills::SkillType Skill, uint8 Level); + /** + * basedata + */ + int GetMaxBaseDataLevel(); + bool LoadBaseData(const std::string &prefix); + void LoadBaseData(void *data, int max_level); + const BaseDataStruct *GetBaseData(int lvl, int cl); - int GetMaxSpellID(); - bool LoadSpells(const std::string &prefix, int32 *records, const SPDat_Spell_Struct **sp); - void LoadSpells(void *data, int max_spells); - void LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID); + std::string CreateItemLink(uint32 item_id) { + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); + const EQ::ItemData *item = GetItem(item_id); + linker.SetItemData(item); + return linker.GenerateLink(); + } - int GetMaxBaseDataLevel(); - bool LoadBaseData(const std::string &prefix); - void LoadBaseData(void *data, int max_level); - const BaseDataStruct* GetBaseData(int lvl, int cl); +protected: - protected: - - std::unique_ptr skill_caps_mmf; - std::unique_ptr items_mmf; - std::unique_ptr> items_hash; - std::unique_ptr faction_mmf; - std::unique_ptr> faction_hash; - std::unique_ptr loot_table_mmf; - std::unique_ptr> loot_table_hash; - std::unique_ptr loot_drop_mmf; - std::unique_ptr> loot_drop_hash; - std::unique_ptr base_data_mmf; - std::unique_ptr spells_mmf; + std::unique_ptr skill_caps_mmf; + std::unique_ptr items_mmf; + std::unique_ptr> items_hash; + std::unique_ptr faction_mmf; + std::unique_ptr> faction_hash; + std::unique_ptr loot_table_mmf; + std::unique_ptr> loot_table_hash; + std::unique_ptr loot_drop_mmf; + std::unique_ptr> loot_drop_hash; + std::unique_ptr base_data_mmf; + std::unique_ptr spells_mmf; }; #endif /*SHAREDDB_H_*/ diff --git a/common/skills.cpp b/common/skills.cpp index 947861163..81b1a926c 100644 --- a/common/skills.cpp +++ b/common/skills.cpp @@ -22,7 +22,7 @@ #include -bool EQEmu::skills::IsTradeskill(SkillType skill) +bool EQ::skills::IsTradeskill(SkillType skill) { switch (skill) { case SkillFishing: @@ -43,7 +43,7 @@ bool EQEmu::skills::IsTradeskill(SkillType skill) } } -bool EQEmu::skills::IsSpecializedSkill(SkillType skill) +bool EQ::skills::IsSpecializedSkill(SkillType skill) { // this could be a simple if, but if this is more portable if any IDs change (probably won't) // or any other specialized are added (also unlikely) @@ -59,7 +59,7 @@ bool EQEmu::skills::IsSpecializedSkill(SkillType skill) } } -float EQEmu::skills::GetSkillMeleePushForce(SkillType skill) +float EQ::skills::GetSkillMeleePushForce(SkillType skill) { // This is the force/magnitude of the push from an attack of this skill type // You can find these numbers in the clients skill struct @@ -96,7 +96,7 @@ float EQEmu::skills::GetSkillMeleePushForce(SkillType skill) } } -bool EQEmu::skills::IsBardInstrumentSkill(SkillType skill) +bool EQ::skills::IsBardInstrumentSkill(SkillType skill) { switch (skill) { case SkillBrassInstruments: @@ -110,7 +110,7 @@ bool EQEmu::skills::IsBardInstrumentSkill(SkillType skill) } } -bool EQEmu::skills::IsCastingSkill(SkillType skill) +bool EQ::skills::IsCastingSkill(SkillType skill) { switch (skill) { case SkillAbjuration: @@ -124,7 +124,7 @@ bool EQEmu::skills::IsCastingSkill(SkillType skill) } } -int32 EQEmu::skills::GetBaseDamage(SkillType skill) +int32 EQ::skills::GetBaseDamage(SkillType skill) { switch (skill) { case SkillBash: @@ -148,7 +148,7 @@ int32 EQEmu::skills::GetBaseDamage(SkillType skill) } } -bool EQEmu::skills::IsMeleeDmg(SkillType skill) +bool EQ::skills::IsMeleeDmg(SkillType skill) { switch (skill) { case Skill1HBlunt: @@ -175,7 +175,7 @@ bool EQEmu::skills::IsMeleeDmg(SkillType skill) } } -const std::map& EQEmu::skills::GetSkillTypeMap() +const std::map& EQ::skills::GetSkillTypeMap() { /* VS2013 code static const std::map skill_use_types_map = { @@ -355,12 +355,12 @@ const std::map& EQEmu::skills::GetSkillTy return skill_type_map; } -EQEmu::SkillProfile::SkillProfile() +EQ::SkillProfile::SkillProfile() { memset(&Skill, 0, (sizeof(uint32) * PACKET_SKILL_ARRAY_SIZE)); } -uint32 EQEmu::SkillProfile::GetSkill(int skill_id) +uint32 EQ::SkillProfile::GetSkill(int skill_id) { if (skill_id < 0 || skill_id >= PACKET_SKILL_ARRAY_SIZE) return 0; diff --git a/common/skills.h b/common/skills.h index 43a31ed15..81790ede1 100644 --- a/common/skills.h +++ b/common/skills.h @@ -26,7 +26,7 @@ #include -namespace EQEmu +namespace EQ { namespace skills { enum SkillType : int { @@ -287,7 +287,7 @@ namespace EQEmu uint32* GetSkills() { return reinterpret_cast(&Skill); } - skills::SkillType GetLastUseableSkill() { return EQEmu::skills::Skill2HPiercing; } + skills::SkillType GetLastUseableSkill() { return EQ::skills::Skill2HPiercing; } size_t GetSkillsArraySize() { return PACKET_SKILL_ARRAY_SIZE; } uint32 GetSkill(int skill_id); diff --git a/common/spdat.cpp b/common/spdat.cpp index 3f0ae6e41..fe6e4db9c 100644 --- a/common/spdat.cpp +++ b/common/spdat.cpp @@ -1271,7 +1271,7 @@ bool IsSpellUsableThisZoneType(uint16 spell_id, uint8 zone_type) return false; } -const char* GetSpellName(int16 spell_id) +const char* GetSpellName(uint16 spell_id) { return spells[spell_id].name; } diff --git a/common/spdat.h b/common/spdat.h index c7c6027c6..d6d6ef144 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -634,7 +634,7 @@ typedef enum { #define SE_LimitRace 412 // implemented - Limits to spells cast by a certain race (Note: not used in any known live spells) #define SE_FcBaseEffects 413 // implemented - Increases the power of bard songs, skill attacks, runes, bard allowed foci, damage/heal #define SE_LimitCastingSkill 414 // implemented - Limit a focus to include spells cast using a specific skill. -//#define SE_FFItemClass 415 // not used +//#define SE_FFItemClass 415 // not used - base1 matches ItemType, base2 matches SubType, -1 ignored, max is bitmask of valid slots #define SE_ACv2 416 // implemented - New AC spell effect #define SE_ManaRegen_v2 417 // implemented - New mana regen effect #define SE_SkillDamageAmount2 418 // implemented - adds skill damage directly to certain attacks @@ -748,7 +748,7 @@ struct SPDat_Spell_Struct /* 086 */ int effectid[EFFECT_COUNT]; // Spell's effects -- SPELLAFFECT1 ... SPELLAFFECT12 /* 098 */ SpellTargetType targettype; // Spell's Target -- TYPENUMBER /* 099 */ int basediff; // base difficulty fizzle adjustment -- BASEDIFFICULTY -/* 100 */ EQEmu::skills::SkillType skill; // -- CASTINGSKILL +/* 100 */ EQ::skills::SkillType skill; // -- CASTINGSKILL /* 101 */ int8 zonetype; // 01=Outdoors, 02=dungeons, ff=Any -- ZONETYPE /* 102 */ int8 EnvironmentType; // -- ENVIRONMENTTYPE /* 103 */ int8 TimeOfDay; // -- TIMEOFDAY @@ -981,6 +981,6 @@ uint32 GetNimbusEffect(uint16 spell_id); int32 GetFuriousBash(uint16 spell_id); bool IsShortDurationBuff(uint16 spell_id); bool IsSpellUsableThisZoneType(uint16 spell_id, uint8 zone_type); -const char *GetSpellName(int16 spell_id); +const char *GetSpellName(uint16 spell_id); #endif diff --git a/common/string_util.cpp b/common/string_util.cpp index df3790def..6c97dd076 100644 --- a/common/string_util.cpp +++ b/common/string_util.cpp @@ -35,7 +35,7 @@ #define va_copy(d,s) ((d) = (s)) #endif -// original source: +// original source: // https://github.com/facebook/folly/blob/master/folly/String.cpp // const std::string vStringFormat(const char* format, va_list args) @@ -74,18 +74,6 @@ const std::string str_tolower(std::string s) return s; } -std::vector split(std::string str_to_split, char delimiter) -{ - std::stringstream ss(str_to_split); - std::string item; - std::vector exploded_values; - while (std::getline(ss, item, delimiter)) { - exploded_values.push_back(item); - } - - return exploded_values; -} - const std::string str_toupper(std::string s) { std::transform( @@ -113,18 +101,34 @@ const std::string StringFormat(const char *format, ...) return output; } -std::vector SplitString(const std::string &str, char delim) { +std::vector SplitString(const std::string &str, const char delim) { std::vector ret; - std::stringstream ss(str); - std::string item; - - while(std::getline(ss, item, delim)) { - ret.push_back(item); - } - + std::string::size_type start = 0; + auto end = str.find(delim); + while (end != std::string::npos) { + ret.emplace_back(str, start, end - start); + start = end + 1; + end = str.find(delim, start); + } + // this will catch the last word since the string is unlikely to end with a delimiter + if (str.length() > start) + ret.emplace_back(str, start, str.length() - start); return ret; } +std::string::size_type search_deliminated_string(const std::string &haystack, const std::string &needle, const char deliminator) +{ + // this shouldn't go out of bounds, even without obvious bounds checks + auto pos = haystack.find(needle); + while (pos != std::string::npos) { + auto c = haystack[pos + needle.length()]; + if ((c == '\0' || c == deliminator) && (pos == 0 || haystack[pos - 1] == deliminator)) + return pos; + pos = haystack.find(needle, pos + needle.length()); + } + return std::string::npos; +} + std::string implode(std::string glue, std::vector src) { if (src.empty()) { @@ -144,6 +148,23 @@ std::string implode(std::string glue, std::vector src) return final_output; } +std::vector wrap(std::vector &src, std::string character) +{ + std::vector new_vector; + new_vector.reserve(src.size()); + + for (auto &e: src) { + if (e == "null") { + new_vector.emplace_back(e); + continue; + } + + new_vector.emplace_back(character + e + character); + } + + return new_vector; +} + std::string EscapeString(const std::string &s) { std::string ret; @@ -325,54 +346,6 @@ void MakeLowerString(const char *source, char *target) { *target = 0; } -int MakeAnyLenString(char** ret, const char* format, ...) { - int buf_len = 128; - int chars = -1; - va_list argptr, tmpargptr; - va_start(argptr, format); - while (chars == -1 || chars >= buf_len) { - safe_delete_array(*ret); - if (chars == -1) - buf_len *= 2; - else - buf_len = chars + 1; - *ret = new char[buf_len]; - va_copy(tmpargptr, argptr); - chars = vsnprintf(*ret, buf_len, format, tmpargptr); - } - va_end(argptr); - return chars; -} - -uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...) { - if (*bufsize == 0) - *bufsize = 256; - if (*ret == 0) - *strlen = 0; - int chars = -1; - char* oldret = 0; - va_list argptr, tmpargptr; - va_start(argptr, format); - while (chars == -1 || chars >= (int32)(*bufsize - *strlen)) { - if (chars == -1) - *bufsize += 256; - else - *bufsize += chars + 25; - oldret = *ret; - *ret = new char[*bufsize]; - if (oldret) { - if (*strlen) - memcpy(*ret, oldret, *strlen); - safe_delete_array(oldret); - } - va_copy(tmpargptr, argptr); - chars = vsnprintf(&(*ret)[*strlen], (*bufsize - *strlen), format, tmpargptr); - } - va_end(argptr); - *strlen += chars; - return *strlen; -} - uint32 hextoi(const char* num) { if (num == nullptr) return 0; @@ -527,3 +500,63 @@ bool isAlphaNumeric(const char *text) return true; } + +// Function to convert single digit or two digit number into words +std::string convert2digit(int n, std::string suffix) +{ + // if n is zero + if (n == 0) { + return ""; + } + + // split n if it is more than 19 + if (n > 19) { + return NUM_TO_ENGLISH_Y[n / 10] + NUM_TO_ENGLISH_X[n % 10] + suffix; + } + else { + return NUM_TO_ENGLISH_X[n] + suffix; + } +} + +// Function to convert a given number (max 9-digits) into words +std::string numberToWords(unsigned long long int n) +{ + // string to store word representation of given number + std::string res; + + // this handles digits at ones & tens place + res = convert2digit((n % 100), ""); + + if (n > 100 && n % 100) { + res = "and " + res; + } + + // this handles digit at hundreds place + res = convert2digit(((n / 100) % 10), "Hundred ") + res; + + // this handles digits at thousands & tens thousands place + res = convert2digit(((n / 1000) % 100), "Thousand ") + res; + + // this handles digits at hundred thousands & one millions place + res = convert2digit(((n / 100000) % 100), "Lakh, ") + res; + + // this handles digits at ten millions & hundred millions place + res = convert2digit((n / 10000000) % 100, "Crore, ") + res; + + // this handles digits at ten millions & hundred millions place + res = convert2digit((n / 1000000000) % 100, "Billion, ") + res; + + return res; +} + +// first letter capitalized and rest made lower case +std::string FormatName(const std::string& char_name) +{ + std::string formatted(char_name); + if (!formatted.empty()) + { + std::transform(formatted.begin(), formatted.end(), formatted.begin(), ::tolower); + formatted[0] = ::toupper(formatted[0]); + } + return formatted; +} diff --git a/common/string_util.h b/common/string_util.h index 037d6a2d8..5fd91281c 100644 --- a/common/string_util.h +++ b/common/string_util.h @@ -39,10 +39,24 @@ const std::string str_tolower(std::string s); const std::string str_toupper(std::string s); const std::string ucfirst(std::string s); -std::vector split(std::string str_to_split, char delimiter); const std::string StringFormat(const char* format, ...); const std::string vStringFormat(const char* format, va_list args); +std::vector wrap(std::vector &src, std::string character); std::string implode(std::string glue, std::vector src); +std::string convert2digit(int n, std::string suffix); +std::string numberToWords(unsigned long long int n); + +// For converstion of numerics into English +// Used for grid nodes, as NPC names remove numerals. +// But general purpose + +const std::string NUM_TO_ENGLISH_X[] = { "", "One ", "Two ", "Three ", "Four ", + "Five ", "Six ", "Seven ", "Eight ", "Nine ", "Ten ", "Eleven ", + "Twelve ", "Thirteen ", "Fourteen ", "Fifteen ", + "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen " }; + +const std::string NUM_TO_ENGLISH_Y[] = { "", "", "Twenty ", "Thirty ", "Forty ", + "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety " }; /** * @param str @@ -84,14 +98,14 @@ std::string implode(const std::string &glue, const std::pair &encaps } std::ostringstream oss; - + for (const T &src_iter : src) { oss << encapsulation.first << src_iter << encapsulation.second << glue; } std::string output(oss.str()); output.resize(output.size() - glue.size()); - + return output; } @@ -107,7 +121,7 @@ std::vector join_pair(const std::string &glue, const std::pair &src_iter : src) { output.push_back( - + fmt::format( "{}{}{}{}{}{}{}", encapsulation.first, @@ -137,7 +151,7 @@ std::vector join_tuple(const std::string &glue, const std::pair &src_iter : src) { output.push_back( - + fmt::format( "{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}", encapsulation.first, @@ -162,7 +176,8 @@ std::vector join_tuple(const std::string &glue, const std::pair SplitString(const std::string &s, char delim); +std::vector SplitString(const std::string &s, const char delim = ','); +std::string::size_type search_deliminated_string(const std::string &haystack, const std::string &needle, const char deliminator = ','); std::string EscapeString(const char *src, size_t sz); std::string EscapeString(const std::string &s); bool StringIsNumber(const std::string &s); @@ -183,11 +198,12 @@ char* strn0cpy(char* dest, const char* source, uint32 size); const char *ConvertArray(int input, char *returnchar); const char *ConvertArrayF(float input, char *returnchar); const char *MakeLowerString(const char *source); -int MakeAnyLenString(char** ret, const char* format, ...); -uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...); uint32 hextoi(const char* num); uint64 hextoi64(const char* num); void MakeLowerString(const char *source, char *target); void RemoveApostrophes(std::string &s); +std::string convert2digit(int n, std::string suffix); +std::string numberToWords(unsigned long long int n); +std::string FormatName(const std::string& char_name); #endif diff --git a/common/struct_strategy.h b/common/struct_strategy.h index 3c92cf060..da4142295 100644 --- a/common/struct_strategy.h +++ b/common/struct_strategy.h @@ -25,7 +25,7 @@ public: void Decode(EQApplicationPacket *p) const; virtual std::string Describe() const = 0; - virtual const EQEmu::versions::ClientVersion ClientVersion() const = 0; + virtual const EQ::versions::ClientVersion ClientVersion() const = 0; protected: //some common coders: diff --git a/common/textures.h b/common/textures.h index f489977ce..b415c442c 100644 --- a/common/textures.h +++ b/common/textures.h @@ -23,7 +23,7 @@ #include "types.h" -namespace EQEmu +namespace EQ { namespace textures { enum : int8 { textureInvalid = -1, textureBegin }; diff --git a/common/timer.cpp b/common/timer.cpp index 120e3dea7..f4d931764 100644 --- a/common/timer.cpp +++ b/common/timer.cpp @@ -129,13 +129,17 @@ void Timer::SetTimer(uint32 set_timer_time) { } } -uint32 Timer::GetRemainingTime() const { +uint32 Timer::GetRemainingTime() const +{ if (enabled) { - if (current_time - start_time > timer_time) + if (current_time - start_time > timer_time) { return 0; - else + } + else { return (start_time + timer_time) - current_time; - } else { + } + } + else { return 0xFFFFFFFF; } } diff --git a/common/util/uuid.cpp b/common/util/uuid.cpp index c5b6b9a4d..7acd1517f 100644 --- a/common/util/uuid.cpp +++ b/common/util/uuid.cpp @@ -1,5 +1,6 @@ #include "uuid.h" +#include #include #ifdef _WIN32 @@ -14,6 +15,10 @@ #include #endif +#ifdef __FreeBSD__ +#include +#endif + unsigned char hexDigitToChar(char ch) { if (ch > 47 && ch < 58) @@ -126,6 +131,15 @@ EQ::Util::UUID EQ::Util::UUID::Generate() return buffer; #endif + +#ifdef __FreeBSD__ + uuid_t l_id; + char l_uuid[37]; + uint32_t l_ignored; + uuid_create(&l_id, &l_ignored); + uuid_to_string(&l_id, (char**) &l_uuid, &l_ignored); + return FromString(l_uuid); +#endif } EQ::Util::UUID EQ::Util::UUID::FromString(const std::string &str) diff --git a/common/util/uuid.h b/common/util/uuid.h index 3b37fc2d2..d1e49a0e7 100644 --- a/common/util/uuid.h +++ b/common/util/uuid.h @@ -2,7 +2,7 @@ #include #include -#include +#include namespace EQ { @@ -32,4 +32,4 @@ namespace EQ std::vector m_bytes; }; } -} \ No newline at end of file +} diff --git a/common/version.h b/common/version.h index 99261fe83..af6a207e5 100644 --- a/common/version.h +++ b/common/version.h @@ -34,10 +34,10 @@ * Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9152 +#define CURRENT_BINARY_DATABASE_VERSION 9165 #ifdef BOTS - #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9026 + #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9027 #else #define CURRENT_BINARY_BOTS_DATABASE_VERSION 0 // must be 0 #endif diff --git a/eqlaunch/worldserver.cpp b/eqlaunch/worldserver.cpp index ea0eee4ac..c50b58e09 100644 --- a/eqlaunch/worldserver.cpp +++ b/eqlaunch/worldserver.cpp @@ -29,7 +29,7 @@ WorldServer::WorldServer(std::map &zones, const char m_config(config), m_zones(zones) { - m_connection.reset(new EQ::Net::ServertalkClient(config->WorldIP, config->WorldTCPPort, false, "Launcher", config->SharedKey)); + m_connection = std::make_unique(config->WorldIP, config->WorldTCPPort, false, "Launcher", config->SharedKey); m_connection->OnConnect([this](EQ::Net::ServertalkClient *client) { OnConnected(); }); @@ -138,4 +138,4 @@ void WorldServer::SendStatus(const char *short_name, uint32 start_count, bool ru m_connection->SendPacket(pack); safe_delete(pack); -} \ No newline at end of file +} diff --git a/libs/zlibng/.github/workflows/analyze.yml b/libs/zlibng/.github/workflows/analyze.yml new file mode 100644 index 000000000..7c848ef02 --- /dev/null +++ b/libs/zlibng/.github/workflows/analyze.yml @@ -0,0 +1,39 @@ +name: CI Static Analysis +on: [push, pull_request] +jobs: + GCC-10: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Install packages (Ubuntu) + run: | + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt-get update + sudo apt-get install -y gcc-10 + - name: Generate project files + run: | + cmake . -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_FUZZERS=OFF -DWITH_CODE_COVERAGE=OFF -DWITH_MAINTAINER_WARNINGS=OFF + env: + CC: gcc-10 + CFLAGS: "-fanalyzer -Werror -Wanalyzer-double-fclose -Wanalyzer-double-free -Wanalyzer-exposure-through-output-file -Wanalyzer-file-leak -Wanalyzer-free-of-non-heap -Wanalyzer-malloc-leak -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-stale-setjmp-buffer -Wanalyzer-tainted-array-index -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame" + CI: true + - name: Compile source code + run: | + cmake --build . --config Release > /dev/null + Clang-12: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Install packages (Ubuntu) + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - + sudo apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic main" -y + sudo apt install clang-tools-12 -y + - name: Generate project files + run: | + scan-build-12 --status-bugs cmake . -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_FUZZERS=OFF -DWITH_CODE_COVERAGE=OFF -DWITH_MAINTAINER_WARNINGS=OFF + env: + CI: true + - name: Compile source code + run: | + scan-build-12 --status-bugs cmake --build . --config Release > /dev/null diff --git a/libs/zlibng/.github/workflows/cmake.yml b/libs/zlibng/.github/workflows/cmake.yml new file mode 100644 index 000000000..4eaec6c4b --- /dev/null +++ b/libs/zlibng/.github/workflows/cmake.yml @@ -0,0 +1,381 @@ +name: CI CMake +on: [push, pull_request] +jobs: + ci-cmake: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Ubuntu GCC + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_SANITIZER=Address + codecov: ubuntu_gcc + + - name: Ubuntu GCC OSB -O1 No Unaligned64 + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_UNALIGNED=ON -DUNALIGNED64_OK=OFF -DWITH_SANITIZER=Undefined + build-dir: ../build + build-src-dir: ../zlib-ng + codecov: ubuntu_gcc_osb + cflags: -O1 -g3 + + - name: Ubuntu GCC -O3 No Unaligned + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_UNALIGNED=OFF + codecov: ubuntu_gcc_o3 + cflags: -O3 + + - name: Ubuntu GCC Link Zlib + os: ubuntu-latest + compiler: gcc + cmake-args: -DZLIB_DUAL_LINK=ON + + - name: Ubuntu GCC No AVX2 + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_AVX2=OFF -DWITH_SANITIZER=Undefined + codecov: ubuntu_gcc_no_avx2 + + - name: Ubuntu GCC No SSE2 + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_SSE2=OFF -DWITH_SANITIZER=Undefined + codecov: ubuntu_gcc_no_sse2 + + - name: Ubuntu GCC No SSE4 + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_SSE4=OFF -DWITH_SANITIZER=Undefined + codecov: ubuntu_gcc_no_sse4 + + - name: Ubuntu GCC No PCLMULQDQ + os: ubuntu-latest + compiler: gcc + cmake-args: -DWITH_PCLMULQDQ=OFF -DWITH_SANITIZER=Undefined + codecov: ubuntu_gcc_no_pclmulqdq + + - name: Ubuntu GCC Compat No Opt + os: ubuntu-latest + compiler: gcc + cmake-args: -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Address + codecov: ubuntu_gcc_compat_no_opt + cflags: -DNOT_TWEAK_COMPILER + + - name: Ubuntu GCC ARM SF + os: ubuntu-latest + compiler: arm-linux-gnueabi-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabi -DWITH_SANITIZER=Address + packages: qemu gcc-arm-linux-gnueabi libc-dev-armel-cross + codecov: ubuntu_gcc_armsf + + - name: Ubuntu GCC ARM SF Compat No Opt + os: ubuntu-latest + compiler: arm-linux-gnueabi-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabi -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Undefined + packages: qemu gcc-arm-linux-gnueabi libc-dev-armel-cross + codecov: ubuntu_gcc_armsf_compat_no_opt + + - name: Ubuntu GCC ARM HF + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf -DWITH_SANITIZER=Address + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + codecov: ubuntu_gcc_armhf + + - name: Ubuntu GCC ARM HF No ACLE + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf -DWITH_ACLE=OFF -DWITH_SANITIZER=Address + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + codecov: ubuntu_gcc_armhf_no_acle + + - name: Ubuntu GCC ARM HF No NEON + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf -DWITH_NEON=OFF -DWITH_SANITIZER=Address + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + codecov: ubuntu_gcc_armhf_no_neon + + - name: Ubuntu GCC ARM HF Compat No Opt + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Undefined + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + codecov: ubuntu_gcc_armhf_compat_no_opt + + - name: Ubuntu GCC AARCH64 + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DWITH_SANITIZER=Address + asan-options: detect_leaks=0 + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + codecov: ubuntu_gcc_aarch64 + + - name: Ubuntu GCC AARCH64 No ACLE + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DWITH_ACLE=OFF -DWITH_SANITIZER=Undefined + asan-options: detect_leaks=0 + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + codecov: ubuntu_gcc_aarch64_no_acle + + - name: Ubuntu GCC AARCH64 No NEON + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DWITH_NEON=OFF -DWITH_SANITIZER=Undefined + asan-options: detect_leaks=0 + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + codecov: ubuntu_gcc_aarch64_no_neon + + - name: Ubuntu GCC AARCH64 Compat No Opt + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Undefined + asan-options: detect_leaks=0 + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + codecov: ubuntu_gcc_aarch64_compat_no_opt + + - name: Ubuntu GCC PPC + os: ubuntu-latest + compiler: powerpc-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake + packages: qemu gcc-powerpc-linux-gnu libc-dev-powerpc-cross + ldflags: -static + codecov: ubuntu_gcc_ppc + + - name: Ubuntu GCC PPC64 + os: ubuntu-latest + compiler: powerpc64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64.cmake + packages: qemu gcc-powerpc64-linux-gnu libc-dev-ppc64-cross + ldflags: -static + codecov: ubuntu_gcc_ppc64 + + - name: Ubuntu GCC PPC64LE + os: ubuntu-latest + compiler: powerpc64le-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake + packages: qemu gcc-powerpc64le-linux-gnu libc-dev-ppc64el-cross + codecov: ubuntu_gcc_ppc64le + + - name: Ubuntu GCC SPARC64 + os: ubuntu-latest + compiler: sparc64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-sparc64.cmake + packages: qemu gcc-sparc64-linux-gnu libc-dev-sparc64-cross + ldflags: -static + codecov: ubuntu_gcc_sparc64 + + - name: Ubuntu GCC S390X + os: ubuntu-latest + compiler: s390x-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DWITH_SANITIZER=Address + packages: qemu gcc-s390x-linux-gnu libc-dev-s390x-cross + ldflags: -static + codecov: ubuntu_gcc_s390x + + - name: Ubuntu GCC S390X DFLTCC + os: ubuntu-latest + compiler: s390x-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_SANITIZER=Address + packages: qemu gcc-s390x-linux-gnu libc-dev-s390x-cross + ldflags: -static + codecov: ubuntu_gcc_s390x + + - name: Ubuntu GCC S390X DFLTCC Compat + os: ubuntu-latest + compiler: s390x-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DZLIB_COMPAT=ON -DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_SANITIZER=Undefined + packages: qemu gcc-s390x-linux-gnu libc-dev-s390x-cross + ldflags: -static + codecov: ubuntu_gcc_s390x + + - name: Ubuntu MinGW i686 + os: ubuntu-latest + compiler: i686-w64-mingw32-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw-i686.cmake + packages: wine32 gcc-mingw-w64 + # Codecov disabled due to gcov locking issue error + + - name: Ubuntu MinGW x86_64 + os: ubuntu-latest + compiler: x86_64-w64-mingw32-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw-x86_64.cmake + packages: wine-stable gcc-mingw-w64 + codecov: ubuntu_gcc_mingw_x86_64 + + - name: Ubuntu Clang + os: ubuntu-latest + compiler: clang + packages: llvm-6.0 + gcov-exec: llvm-cov-6.0 gcov + codecov: ubuntu_clang + + - name: Ubuntu Clang Inflate Strict + os: ubuntu-latest + compiler: clang + cmake-args: -DWITH_INFLATE_STRICT=ON + packages: llvm-6.0 + gcov-exec: llvm-cov-6.0 gcov + codecov: ubuntu_clang_inflate_strict + + - name: Ubuntu Clang Inflate Allow Invalid Dist + os: ubuntu-latest + compiler: clang + cmake-args: -DWITH_INFLATE_ALLOW_INVALID_DIST=ON + packages: llvm-6.0 + gcov-exec: llvm-cov-6.0 gcov + codecov: ubuntu_clang_inflate_allow_invalid_dist + + - name: Ubuntu Clang Memory Map + os: ubuntu-latest + compiler: clang + cflags: -DUSE_MMAP + packages: llvm-6.0 + gcov-exec: llvm-cov-6.0 gcov + codecov: ubuntu_clang_mmap + + - name: Ubuntu Clang Debug + os: ubuntu-latest + compiler: clang + packages: llvm-6.0 + gcov-exec: llvm-cov-6.0 gcov + codecov: ubuntu_clang_debug + build-config: Debug + + - name: Ubuntu Clang MSAN + os: ubuntu-latest + compiler: clang + cmake-args: -GNinja -DWITH_SANITIZER=Memory + packages: ninja-build llvm-6.0 + gcov-exec: llvm-cov-6.0 gcov + cflags: -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize-memory-track-origins + codecov: ubuntu_clang_msan + + - name: Windows MSVC Win32 + os: windows-latest + compiler: cl + cmake-args: -A Win32 + + - name: Windows MSVC Win64 + os: windows-latest + compiler: cl + cmake-args: -A x64 + + - name: Windows MSVC ARM No Test + os: windows-latest + compiler: cl + cmake-args: -A ARM + + - name: Windows MSVC ARM64 No Test + os: windows-latest + compiler: cl + cmake-args: -A ARM64 + + - name: Windows GCC + os: windows-latest + compiler: gcc + cmake-args: -G Ninja + codecov: win64_gcc + + - name: Windows GCC Compat No Opt + os: windows-latest + compiler: gcc + cmake-args: -G Ninja -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF + codecov: win64_gcc_compat_no_opt + + - name: macOS Clang + os: macos-latest + compiler: clang + cmake-args: -DWITH_SANITIZER=Address + codecov: macos_clang + + - name: macOS GCC + os: macos-latest + compiler: gcc-10 + cmake-args: -DWITH_SANITIZER=Undefined + packages: gcc@10 + gcov-exec: gcov-10 + codecov: macos_gcc + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Checkout test corpora + uses: actions/checkout@v2 + with: + repository: nmoinvaz/corpora + path: test/data/corpora + + - name: Install packages (Ubuntu) + if: runner.os == 'Linux' && matrix.packages + run: | + sudo dpkg --add-architecture i386 # Required for wine32 + sudo apt-get update + sudo apt-get install -y ${{ matrix.packages }} + + - name: Install packages (Windows) + if: runner.os == 'Windows' + run: | + choco install ninja ${{ matrix.packages }} --no-progress + + - name: Install packages (macOS) + if: runner.os == 'macOS' + run: | + brew install ninja ${{ matrix.packages }} + env: + HOMEBREW_NO_INSTALL_CLEANUP: 1 + + - name: Install codecov.io tools + if: matrix.codecov + run: | + python -u -m pip install codecov + + - name: Generate project files + # Shared libaries turned off for qemu ppc* and sparc & reduce code coverage sources + run: | + mkdir ${{ matrix.build-dir || '.not-used' }} + cd ${{ matrix.build-dir || '.' }} + cmake ${{ matrix.build-src-dir || '.' }} ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} -DBUILD_SHARED_LIBS=OFF -DWITH_FUZZERS=ON -DWITH_CODE_COVERAGE=ON -DWITH_MAINTAINER_WARNINGS=ON + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + LDFLAGS: ${{ matrix.ldflags }} + CI: true + + - name: Compile source code + run: | + cd ${{ matrix.build-dir || '.' }} + cmake --build . --config ${{ matrix.build-config || 'Release' }} + + - name: Run test cases + # Don't run tests on Windows ARM + if: runner.os != 'Windows' || contains(matrix.name, 'ARM') == false + run: | + cd ${{ matrix.build-dir || '.' }} + ctest --verbose -C Release --output-on-failure --max-width 120 -j 6 + env: + ASAN_OPTIONS: ${{ matrix.asan-options || 'verbosity=0' }}:abort_on_error=1 + MSAN_OPTIONS: ${{ matrix.msan-options || 'verbosity=0' }}:abort_on_error=1 + TSAN_OPTIONS: ${{ matrix.tsan-options || 'verbosity=0' }}:abort_on_error=1 + LSAN_OPTIONS: ${{ matrix.lsan-options || 'verbosity=0' }}:abort_on_error=1 + + - name: Upload coverage report + if: matrix.codecov && ( env.CODECOV_TOKEN_SECRET != '' || github.repository == 'zlib-ng/zlib-ng' ) + shell: bash + run: | + bash tools/codecov-upload.sh + env: + # Codecov does not yet support GitHub Actions + CODECOV_TOKEN_SECRET: "${{secrets.CODECOV_TOKEN}}" + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN || 'e4fdf847-f541-4ab1-9d50-3d27e5913906' }}" + CODECOV_FLAGS: "${{ matrix.codecov }}" + CODECOV_NAME: "${{ matrix.name }}" + CODECOV_EXEC: "${{ matrix.gcov-exec || 'gcov' }}" + CODECOV_DIR: "${{ matrix.build-dir || '.' }}" diff --git a/libs/zlibng/.github/workflows/configure.yml b/libs/zlibng/.github/workflows/configure.yml new file mode 100644 index 000000000..750f30d71 --- /dev/null +++ b/libs/zlibng/.github/workflows/configure.yml @@ -0,0 +1,185 @@ +name: CI Configure +on: [push, pull_request] +jobs: + ci-configure: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Ubuntu GCC + os: ubuntu-latest + compiler: gcc + configure-args: --warn + + - name: Ubuntu GCC OSB + os: ubuntu-latest + compiler: gcc + configure-args: --warn + build-dir: ../build + build-src-dir: ../zlib-ng + + - name: Ubuntu GCC Compat No Opt + os: ubuntu-latest + compiler: gcc + configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies + + - name: Ubuntu GCC ARM SF + os: ubuntu-latest + compiler: arm-linux-gnueabi-gcc + configure-args: --warn + chost: arm-linux-gnueabi + packages: qemu gcc-arm-linux-gnueabi libc-dev-armel-cross + + - name: Ubuntu GCC ARM SF Compat No Opt + os: ubuntu-latest + compiler: arm-linux-gnueabi-gcc + configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies + chost: arm-linux-gnueabi + packages: qemu gcc-arm-linux-gnueabi libc-dev-armel-cross + + - name: Ubuntu GCC ARM HF + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + configure-args: --warn + chost: arm-linux-gnueabihf + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + + - name: Ubuntu GCC ARM HF No ACLE + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + configure-args: --warn --without-acle + chost: arm-linux-gnueabihf + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + + - name: Ubuntu GCC ARM HF No NEON + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + configure-args: --warn --without-neon + chost: arm-linux-gnueabihf + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + + - name: Ubuntu GCC ARM HF Compat No Opt + os: ubuntu-latest + compiler: arm-linux-gnueabihf-gcc + configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies + chost: arm-linux-gnueabihf + packages: qemu gcc-arm-linux-gnueabihf libc-dev-armel-cross + + - name: Ubuntu GCC AARCH64 + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + configure-args: --warn + chost: aarch64-linux-gnu + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + + - name: Ubuntu GCC AARCH64 No ACLE + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + configure-args: --warn --without-acle + chost: aarch64-linux-gnu + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + + - name: Ubuntu GCC AARCH64 No NEON + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + configure-args: --warn --without-neon + chost: aarch64-linux-gnu + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + + - name: Ubuntu GCC AARCH64 Compat No Opt + os: ubuntu-latest + compiler: aarch64-linux-gnu-gcc + configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies + chost: aarch64-linux-gnu + packages: qemu gcc-aarch64-linux-gnu libc-dev-arm64-cross + + - name: Ubuntu GCC PPC + os: ubuntu-latest + compiler: powerpc-linux-gnu-gcc + configure-args: --warn --static + chost: powerpc-linux-gnu + packages: qemu gcc-powerpc-linux-gnu libc-dev-powerpc-cross + cflags: -static + ldflags: -static + + - name: Ubuntu GCC PPC64 + os: ubuntu-latest + compiler: powerpc64-linux-gnu-gcc + configure-args: --warn --static + chost: powerpc-linux-gnu + packages: qemu gcc-powerpc64-linux-gnu libc-dev-ppc64-cross + cflags: -static + ldflags: -static + + - name: Ubuntu GCC PPC64LE + os: ubuntu-latest + compiler: powerpc64le-linux-gnu-gcc + configure-args: --warn + chost: powerpc64le-linux-gnu + packages: qemu gcc-powerpc64le-linux-gnu libc-dev-ppc64el-cross + + - name: Ubuntu GCC S390X + os: ubuntu-latest + compiler: s390x-linux-gnu-gcc + configure-args: --warn --static + chost: s390x-linux-gnu + packages: qemu gcc-s390x-linux-gnu libc-dev-s390x-cross + cflags: -static + ldflags: -static + + - name: Ubuntu GCC S390X DFLTCC + os: ubuntu-latest + compiler: s390x-linux-gnu-gcc + configure-args: --warn --static --with-dfltcc-deflate --with-dfltcc-inflate + chost: s390x-linux-gnu + packages: qemu gcc-s390x-linux-gnu libc-dev-s390x-cross + cflags: -static + ldflags: -static + + - name: Ubuntu GCC S390X DFLTCC Compat + os: ubuntu-latest + compiler: s390x-linux-gnu-gcc + configure-args: --warn --zlib-compat --static --with-dfltcc-deflate --with-dfltcc-inflate + chost: s390x-linux-gnu + packages: qemu gcc-s390x-linux-gnu libc-dev-s390x-cross + cflags: -static + ldflags: -static + + - name: macOS GCC + os: macOS-latest + compiler: gcc + configure-args: --warn + + steps: + - name: Checkout repository + uses: actions/checkout@v1 + + - name: Install packages (Ubuntu) + if: runner.os == 'Linux' && matrix.packages + run: | + sudo apt-get update + sudo apt-get install -y ${{ matrix.packages }} + + - name: Generate project files + run: | + mkdir ${{ matrix.build-dir || '.not-used' }} + cd ${{ matrix.build-dir || '.' }} + ${{ matrix.build-src-dir || '.' }}/configure ${{ matrix.configure-args }} + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + LDFLAGS: ${{ matrix.ldflags }} + CHOST: ${{ matrix.chost }} + CI: true + + - name: Compile source code + run: | + cd ${{ matrix.build-dir || '.' }} + make -j2 + + - name: Run test cases + run: | + cd ${{ matrix.build-dir || '.' }} + make test diff --git a/libs/zlibng/.github/workflows/fuzz.yml b/libs/zlibng/.github/workflows/fuzz.yml new file mode 100644 index 000000000..e7ddaea5b --- /dev/null +++ b/libs/zlibng/.github/workflows/fuzz.yml @@ -0,0 +1,23 @@ +name: CI Fuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'zlib-ng' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'zlib-ng' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() + with: + name: artifacts + path: ./out/artifacts diff --git a/libs/zlibng/.github/workflows/libpng.yml b/libs/zlibng/.github/workflows/libpng.yml new file mode 100644 index 000000000..fe970dd15 --- /dev/null +++ b/libs/zlibng/.github/workflows/libpng.yml @@ -0,0 +1,46 @@ +name: CI Libpng +on: [pull_request] +jobs: + pngtest: + name: Ubuntu Clang + runs-on: ubuntu-latest + + steps: + - name: Checkout repository (zlib-ng) + uses: actions/checkout@v1 + + - name: Generate project files (zlib-ng) + run: | + cmake . -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DZLIB_COMPAT=ON -DZLIB_ENABLE_TESTS=OFF + env: + CC: clang + CFLAGS: -fPIC + CI: true + + - name: Compile source code (zlib-ng) + run: | + cmake --build . --config Release + + - name: Checkout repository (libpng) + uses: actions/checkout@v2 + with: + repository: glennrp/libpng + path: libpng + + - name: Generate project files (libpng) + run: | + cd libpng + cmake . -DCMAKE_BUILD_TYPE=Release -DPNG_TESTS=ON -DPNG_STATIC=OFF -DZLIB_INCLUDE_DIR=.. -DZLIB_LIBRARY=$PWD/../libz.a + env: + CC: clang + CI: true + + - name: Compile source code (libpng) + run: | + cd libpng + cmake --build . --config Release + + - name: Run test cases (libpng) + run: | + cd libpng + ctest -C Release --output-on-failure --max-width 120 diff --git a/libs/zlibng/.github/workflows/nmake.yml b/libs/zlibng/.github/workflows/nmake.yml new file mode 100644 index 000000000..38c0b42eb --- /dev/null +++ b/libs/zlibng/.github/workflows/nmake.yml @@ -0,0 +1,48 @@ +name: CI NMake +on: [push, pull_request] +jobs: + ci-cmake: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Windows NMake x86 + os: windows-latest + makefile: win32/Makefile.msc + vc-vars: x86 + + - name: Windows NMake x64 + os: windows-latest + makefile: win32/Makefile.msc + vc-vars: x86_amd64 + + - name: Windows NMake ARM No Test + os: windows-latest + makefile: win32/Makefile.arm + vc-vars: x86_arm + + - name: Windows NMake ARM64 No Test + os: windows-latest + makefile: win32/Makefile.a64 + vc-vars: x86_arm64 + + steps: + - name: Checkout repository + uses: actions/checkout@v1 + + - name: Compile source code + shell: cmd + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.vc-vars }} + nmake -f ${{ matrix.makefile }} + + - name: Run test cases + shell: cmd + # Don't run tests on Windows ARM + if: contains(matrix.vc-vars, 'arm') == false + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.vc-vars }} + nmake -f ${{ matrix.makefile }} test + nmake -f ${{ matrix.makefile }} testdll diff --git a/libs/zlibng/.github/workflows/pkgcheck.yml b/libs/zlibng/.github/workflows/pkgcheck.yml new file mode 100644 index 000000000..a34ad94f3 --- /dev/null +++ b/libs/zlibng/.github/workflows/pkgcheck.yml @@ -0,0 +1,121 @@ +name: CI Pkgcheck +on: [push, pull_request] +jobs: + ci-pkgcheck: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Ubuntu GCC + os: ubuntu-latest + compiler: gcc + + - name: Ubuntu GCC -m32 + os: ubuntu-latest + compiler: gcc + packages: gcc-multilib + cmake-args: -DCMAKE_C_FLAGS=-m32 + cflags: -m32 + ldflags: -m32 + + - name: Ubuntu GCC ARM HF + os: ubuntu-latest + chost: arm-linux-gnueabihf + compiler: arm-linux-gnueabihf-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf + packages: qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross + + - name: Ubuntu GCC AARCH64 + os: ubuntu-latest + chost: aarch64-linux-gnu + compiler: aarch64-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake + packages: qemu gcc-aarch64-linux-gnu libc6-dev-arm64-cross + + - name: Ubuntu GCC PPC + os: ubuntu-latest + chost: powerpc-linux-gnu + compiler: powerpc-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake + packages: qemu gcc-powerpc-linux-gnu libc6-dev-powerpc-cross + + - name: Ubuntu GCC PPC64LE + os: ubuntu-latest + chost: powerpc64le-linux-gnu + compiler: powerpc64le-linux-gnu-gcc + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake + packages: qemu gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross + + - name: macOS Clang + os: macOS-latest + compiler: clang + + steps: + - name: Checkout repository + uses: actions/checkout@v1 + + - name: Install packages (Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends abigail-tools ninja-build diffoscope ${{ matrix.packages }} + + - name: Install packages (macOS) + if: runner.os == 'macOS' + run: | + brew install ninja diffoscope ${{ matrix.packages }} + env: + HOMEBREW_NO_INSTALL_CLEANUP: 1 + + - name: Select Xcode version (macOS) + # Use a version of Xcode that supports ZERO_AR_DATE until CMake supports + # AppleClang linking with libtool using -D argument + # https://gitlab.kitware.com/cmake/cmake/-/issues/19852 + if: runner.os == 'macOS' + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '12.1.1' + + - name: Compare builds + run: | + sh test/pkgcheck.sh + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + CHOST: ${{ matrix.chost }} + CMAKE_ARGS: ${{ matrix.cmake-args }} + LDFLAGS: ${{ matrix.ldflags }} + + - name: Compare builds (compat) + run: | + sh test/pkgcheck.sh --zlib-compat + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + CHOST: ${{ matrix.chost }} + CMAKE_ARGS: ${{ matrix.cmake-args }} + LDFLAGS: ${{ matrix.ldflags }} + + - name: Check ABI + # macOS runner does not contain abigail + if: runner.os != 'macOS' + run: | + sh test/abicheck.sh --refresh_if + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + CHOST: ${{ matrix.chost }} + LDFLAGS: ${{ matrix.ldflags }} + + - name: Check ABI (compat) + # macOS runner does not contain abigail + if: runner.os != 'macOS' + run: | + sh test/abicheck.sh --zlib-compat --refresh_if + env: + CC: ${{ matrix.compiler }} + CFLAGS: ${{ matrix.cflags }} + CHOST: ${{ matrix.chost }} + LDFLAGS: ${{ matrix.ldflags }} diff --git a/libs/zlibng/.github/workflows/release.yml b/libs/zlibng/.github/workflows/release.yml new file mode 100644 index 000000000..c2a306172 --- /dev/null +++ b/libs/zlibng/.github/workflows/release.yml @@ -0,0 +1,73 @@ +name: CI Release +on: + push: + tags: + - '*' +jobs: + ci-cmake: + name: ${{ matrix.name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - name: Windows MSVC Win32 + os: windows-latest + compiler: cl + cmake-args: -A Win32 + deploy-name: win32 + + - name: Windows MSVC Win32 Compat + os: windows-latest + compiler: cl + cmake-args: -A Win32 -DZLIB_COMPAT=ON + deploy-name: win32-compat + + - name: Windows MSVC Win64 + os: windows-latest + compiler: cl + cmake-args: -A x64 + deploy-name: win64 + + - name: Windows MSVC Win64 Compat + os: windows-latest + compiler: cl + cmake-args: -A x64 -DZLIB_COMPAT=ON + deploy-name: win64-compat + + steps: + - name: Checkout repository + uses: actions/checkout@v1 + + - name: Set environment variables + shell: bash + run: echo "tag=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV + + - name: Generate project files + run: | + cmake . ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=Release -DZLIB_ENABLE_TESTS=ON -DCMAKE_INSTALL_PREFIX=out -DINSTALL_UTILS=ON + env: + CC: ${{ matrix.compiler }} + CI: true + + - name: Compile source code + run: | + cmake --build . --config Release --target install + + - name: Package release (Windows) + if: runner.os == 'Windows' + run: | + cd out + 7z a -tzip ../zlib-ng-${{ matrix.deploy-name }}.zip bin include lib ../LICENSE.md ../README.md + + - name: Upload release (Windows) + uses: svenstaro/upload-release-action@v1-release + if: runner.os == 'Windows' + with: + asset_name: zlib-ng-${{ matrix.deploy-name }}.zip + file: zlib-ng-${{ matrix.deploy-name }}.zip + tag: ${{env.tag}} + repo_token: ${{ secrets.GITHUB_TOKEN }} + overwrite: true + env: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/libs/zlibng/.gitignore b/libs/zlibng/.gitignore index 50e5ee6fa..23f9fd159 100644 --- a/libs/zlibng/.gitignore +++ b/libs/zlibng/.gitignore @@ -13,14 +13,18 @@ *.gcno *.gcov +/adler32_test +/adler32_testsh /example /example64 /examplesh /libz.so* /libz-ng.so* +/makefixed /minigzip /minigzip64 /minigzipsh +/switchlevels /zlib.pc /zlib-ng.pc /CVE-2003-0107 @@ -46,8 +50,9 @@ foo.gz CMakeCache.txt CMakeFiles Testing -*.cmake +/*.cmake *.stackdump +*._h zconf.h zconf.h.cmakein zconf.h.included @@ -61,6 +66,7 @@ a.out /Makefile /arch/arm/Makefile /arch/generic/Makefile +/arch/power/Makefile /arch/x86/Makefile .kdev4 *.kdev4 @@ -71,6 +77,10 @@ a.out /zlib.dir /zlibstatic.dir /win32/Debug +/build/ +/build[.-]*/ +/btmp[12]/ +/pkgtmp[12]/ /.idea /cmake-build-debug diff --git a/libs/zlibng/.shellcheckrc b/libs/zlibng/.shellcheckrc new file mode 100644 index 000000000..89a1625ff --- /dev/null +++ b/libs/zlibng/.shellcheckrc @@ -0,0 +1 @@ +disable=SC2140,SC2086,SC2046,SC2015,SC1097,SC1035,SC1036,SC1007,SC2154,SC2155,SC2000,SC2034,SC2016,SC1091,SC1090,SC2212,SC2143,SC2129,SC2102,SC2069,SC1041,SC1042,SC1044,SC1046,SC1119,SC1110,SC1111,SC1112,SC1102,SC1105,SC1101,SC1004,SC1003,SC1012,SC2068,SC2065,SC2064,SC2063,SC2059,SC2053,SC2048,SC2044,SC2032,SC2031,SC2030,SC2029,SC2025,SC2024,SC2022,SC2018,SC2019,SC2017,SC2014,SC2013,SC2012,SC2009,SC2001,SC2098,SC2096,SC2094,SC2091,SC2092,SC2088,SC2087,SC2076,SC2072,SC2071,SC2223,SC2221,SC2222,SC2217,SC2207,SC2206,SC2205,SC2190,SC2188,SC2187,SC2185,SC2179,SC2178,SC2174,SC2168,SC2167,SC2163,SC2161,SC2160,SC2153,SC2150,SC2148,SC2147,SC2146,SC2142,SC2139,SC2126,SC2123,SC2120,SC2119,SC2117,SC2114,SC1117,SC2164,SC1083,SC2004,SC2125,SC2128,SC2011,SC1008,SC1019,SC2093,SC1132,SC1129,SC2236,SC2237,SC2231,SC2230,SC2229,SC2106,SC2102,SC2243,SC2244,SC2245,SC2247,SC2248,SC2249,SC2250,SC2251,SC2252,SC2181 diff --git a/libs/zlibng/.travis.yml b/libs/zlibng/.travis.yml deleted file mode 100644 index a27e41472..000000000 --- a/libs/zlibng/.travis.yml +++ /dev/null @@ -1,283 +0,0 @@ -language: c -cache: ccache -dist: xenial - -env: - global: - - BUILDDIR=. - - MAKER="make -j2" - - TESTER="make test" - -matrix: - include: - - os: windows - compiler: clang - env: - - GENERATOR="cmake . " - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - os: windows - compiler: clang - env: - - GENERATOR="cmake ..\\zlib-ng -DZLIB_COMPAT=ON" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - BUILDDIR=..\\build - - os: windows - compiler: gcc - env: - - GENERATOR="cmake ." - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - - os: linux - compiler: gcc - env: GENERATOR="./configure --warn" - - os: linux - compiler: gcc - env: GENERATOR="cmake . -DZLIB_COMPAT=OFF -DWITH_GZFILEOP=ON -DWITH_NEW_STRATEGIES=YES -DWITH_OPTIM=ON" - - os: linux - compiler: gcc - env: - - GENERATOR="../zlib-ng/configure --warn --zlib-compat" - - BUILDDIR=../build - - os: linux - compiler: gcc - env: GENERATOR="./configure --warn --zlib-compat --without-optimizations --without-new-strategies" - - os: linux - compiler: gcc - env: GENERATOR="cmake ." - - os: linux - compiler: gcc - env: - - GENERATOR="cmake ../zlib-ng" - - BUILDDIR=../build - - - os: linux - compiler: clang - env: GENERATOR="./configure --warn --zlib-compat" - - os: linux - compiler: clang - env: - - GENERATOR="cmake ../zlib-ng" - - BUILDDIR=../build - - os: linux - compiler: clang - env: - - GENERATOR="scan-build -v --status-bugs cmake ../zlib-ng" - - MAKER="scan-build -v --status-bugs make" - - BUILDDIR=../build - - - os: osx - compiler: gcc - env: GENERATOR="./configure --warn --zlib-compat" - - os: osx - compiler: gcc - env: - - GENERATOR="../zlib-ng/configure --warn --zlib-compat" - - BUILDDIR=../build - - os: osx - compiler: gcc - env: GENERATOR="cmake ." - - - os: osx - compiler: clang - env: GENERATOR="./configure --warn --zlib-compat" - - os: osx - compiler: clang - env: - - GENERATOR="cmake ../zlib-ng" - - BUILDDIR=../build - - # compiling for linux-ppc64le variants - - os: linux-ppc64le - compiler: gcc - env: GENERATOR="cmake ." - - os: linux-ppc64le - compiler: gcc - env: - - GENERATOR="cmake ../zlib-ng" - - BUILDDIR=../build - - - os: linux-ppc64le - compiler: clang - env: GENERATOR="./configure --warn --zlib-compat" - - os: linux-ppc64le - compiler: clang - env: - - GENERATOR="cmake ../zlib-ng" - - BUILDDIR=../build - - # Cross compiling for arm variants - - os: linux - compiler: aarch64-linux-gnu-gcc - addons: - apt: - packages: - - qemu - - gcc-aarch64-linux-gnu - - libc-dev-arm64-cross - # For all aarch64 implementations NEON is mandatory, while crypto/crc are not. - env: - - GENERATOR="./configure --warn --zlib-compat" - - CHOST=aarch64-linux-gnu - - os: linux - compiler: aarch64-linux-gnu-gcc - addons: - apt: - packages: - - qemu - - gcc-aarch64-linux-gnu - - libc-dev-arm64-cross - # For all aarch64 implementations NEON is mandatory, while crypto/crc are not. - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake . -DZLIB_COMPAT=ON" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - os: linux - compiler: aarch64-linux-gnu-gcc - addons: - apt: - packages: - - qemu - - gcc-aarch64-linux-gnu - - libc-dev-arm64-cross - env: - - GENERATOR="./configure --warn --zlib-compat" - - CHOST=aarch64-linux-gnu - - os: linux - compiler: aarch64-linux-gnu-gcc - addons: - apt: - packages: - - qemu - - gcc-aarch64-linux-gnu - - libc-dev-arm64-cross - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake ." - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - # Hard-float subsets - - os: linux - compiler: arm-linux-gnueabihf-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabihf - - libc-dev-armhf-cross - env: - - GENERATOR="./configure --warn" - - CHOST=arm-linux-gnueabihf - - os: linux - compiler: arm-linux-gnueabihf-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabihf - - libc-dev-armhf-cross - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake . -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - os: linux - compiler: arm-linux-gnueabihf-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabihf - - libc-dev-armhf-cross - env: - - GENERATOR="./configure --warn --zlib-compat --without-neon" - - CHOST=arm-linux-gnueabihf - - os: linux - compiler: arm-linux-gnueabihf-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabihf - - libc-dev-armhf-cross - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake . -DZLIB_COMPAT=ON -DWITH_NEON=OFF -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - os: linux - compiler: arm-linux-gnueabihf-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabihf - - libc-dev-armhf-cross - env: - - GENERATOR="./configure --warn --zlib-compat" - - CHOST=arm-linux-gnueabihf - - os: linux - compiler: arm-linux-gnueabihf-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabihf - - libc-dev-armhf-cross - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake . -DZLIB_COMPAT=ON -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabihf" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - # Soft-float subset - - os: linux - compiler: arm-linux-gnueabi-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabi - - libc-dev-armel-cross - env: - - GENERATOR="./configure" - - CHOST=arm-linux-gnueabi - - os: linux - compiler: arm-linux-gnueabi-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabi - - libc-dev-armel-cross - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake . -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabi" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - - os: linux - compiler: arm-linux-gnueabi-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabi - - libc-dev-armel-cross - env: - - GENERATOR="./configure --zlib-compat" - - CHOST=arm-linux-gnueabi - - os: linux - compiler: arm-linux-gnueabi-gcc - addons: - apt: - packages: - - qemu - - gcc-arm-linux-gnueabi - - libc-dev-armel-cross - env: - - GENERATOR="cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake . -DZLIB_COMPAT=ON -DCMAKE_C_COMPILER_TARGET=arm-linux-gnueabi" - - MAKER="cmake --build . --config Release" - - TESTER="ctest --verbose -C Release" - -script: - - mkdir -p $BUILDDIR - - cd $BUILDDIR - - $GENERATOR - - $MAKER - - $TESTER diff --git a/libs/zlibng/CMakeLists.txt b/libs/zlibng/CMakeLists.txt index 9767a00c8..05087781e 100644 --- a/libs/zlibng/CMakeLists.txt +++ b/libs/zlibng/CMakeLists.txt @@ -1,9 +1,10 @@ cmake_minimum_required(VERSION 3.5.1) if(CMAKE_VERSION VERSION_LESS 3.12) - cmake_policy(VERSION ${CMAKE_VERSION}) + cmake_policy(VERSION ${CMAKE_VERSION}) else() - cmake_policy(VERSION 3.5.1...3.13.2) + cmake_policy(VERSION 3.5.1...3.13.2) endif() +message(STATUS "Using CMake version ${CMAKE_VERSION}") set(CMAKE_MACOSX_RPATH 1) @@ -11,17 +12,17 @@ set(CMAKE_MACOSX_RPATH 1) # Configuration items that affect the global compiler envirionment standards # should be issued before the "project" command. if(NOT CMAKE_C_STANDARD) - set (CMAKE_C_STANDARD 99) # The C standard whose features are requested to build this target + set(CMAKE_C_STANDARD 99) # The C standard whose features are requested to build this target endif() if(NOT CMAKE_C_STANDARD_REQUIRED) - set (CMAKE_C_STANDARD_REQUIRED ON) # Boolean describing whether the value of C_STANDARD is a requirement + set(CMAKE_C_STANDARD_REQUIRED ON) # Boolean describing whether the value of C_STANDARD is a requirement endif() if(NOT CMAKE_C_EXTENSIONS) - set (CMAKE_C_EXTENSIONS OFF) # Boolean specifying whether compiler specific extensions are requested + set(CMAKE_C_EXTENSIONS OFF) # Boolean specifying whether compiler specific extensions are requested endif() set(VALID_C_STANDARDS "99" "11") -if(NOT CMAKE_C_STANDARD IN_LIST VALID_C_STANDARDS ) - MESSAGE(FATAL_ERROR "CMAKE_C_STANDARD:STRING=${CMAKE_C_STANDARD} not in know standards list\n ${VALID_C_STANDARDS}") +if(NOT CMAKE_C_STANDARD IN_LIST VALID_C_STANDARDS) + MESSAGE(FATAL_ERROR "CMAKE_C_STANDARD:STRING=${CMAKE_C_STANDARD} not in know standards list\n ${VALID_C_STANDARDS}") endif() # Parse the full version number from zlib.h and include in ZLIB_FULL_VERSION @@ -33,15 +34,13 @@ string(REGEX REPLACE ".*#define[ \t]+ZLIBNG_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" message(STATUS "ZLIB_HEADER_VERSION: ${ZLIB_HEADER_VERSION}") message(STATUS "ZLIBNG_HEADER_VERSION: ${ZLIBNG_HEADER_VERSION}") -project(zlib - VERSION ${ZLIB_HEADER_VERSION} - LANGUAGES C) +project(zlib VERSION ${ZLIB_HEADER_VERSION} LANGUAGES C) -set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") -set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") -set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") -set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages") -set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files") +set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") +set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") +set(INC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") +set(MAN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages") +set(PKGCONFIG_INSTALL_DIR "${LIB_INSTALL_DIR}/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files") include(CheckTypeSize) include(CheckSymbolExists) @@ -52,6 +51,13 @@ include(CheckCSourceRuns) include(CMakeDependentOption) include(FeatureSummary) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/detect-arch.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/detect-sanitizer.cmake) + +if(CMAKE_TOOLCHAIN_FILE) + message(STATUS "Using CMake toolchain: ${CMAKE_TOOLCHAIN_FILE}") +endif() + # Make sure we use an appropriate BUILD_TYPE by default, "Release" to be exact # this should select the maximum generic optimisation on the current platform (i.e. -O3 for gcc/clang) if(NOT CMAKE_BUILD_TYPE) @@ -63,64 +69,67 @@ else() add_feature_info(CMAKE_BUILD_TYPE 1 "Build type: ${CMAKE_BUILD_TYPE} (selected)") endif() -check_include_file(sys/types.h HAVE_SYS_TYPES_H) -check_include_file(stdint.h HAVE_STDINT_H) -check_include_file(stddef.h HAVE_STDDEF_H) -check_include_file(sys/sdt.h HAVE_SYS_SDT_H) - -if(CMAKE_OSX_ARCHITECTURES) - # If multiple architectures are requested (universal build), pick only the first - list(GET CMAKE_OSX_ARCHITECTURES 0 ARCH) -else() - set(ARCH ${CMAKE_SYSTEM_PROCESSOR}) -endif() -message(STATUS "Architecture: ${ARCH}") -if(CMAKE_TOOLCHAIN_FILE) - message(STATUS "Using cmake toolchain: ${CMAKE_TOOLCHAIN_FILE}") -endif() - # # Options parsing # -option(WITH_GZFILEOP "Compile with support for gzFile related functions" OFF) -option(ZLIB_COMPAT "Compile with zlib compatible API" OFF) -option(ZLIB_ENABLE_TESTS "Build test binaries" ON) -option(WITH_SANITIZERS "Build with address sanitizer and all supported sanitizers other than memory sanitizer" OFF) -option(WITH_MSAN "Build with memory sanitizer" OFF) -option(WITH_FUZZERS "Build test/fuzz" OFF) -option(WITH_OPTIM "Build with optimisation" ON) -option(WITH_NEW_STRATEGIES "Use new strategies" ON) -option(WITH_NATIVE_INSTRUCTIONS +macro(add_option name description value) + option(${name} ${description} ${value}) + add_feature_info(${name} ${name} ${description}) +endmacro() + +add_option(WITH_GZFILEOP "Compile with support for gzFile related functions" ON) +add_option(ZLIB_COMPAT "Compile with zlib compatible API" OFF) +add_option(ZLIB_ENABLE_TESTS "Build test binaries" ON) +add_option(ZLIB_DUAL_LINK "Dual link tests against system zlib" OFF) +add_option(WITH_SANITIZER "Build with sanitizer (Memory, Address, Undefined)" OFF) +add_option(WITH_FUZZERS "Build test/fuzz" OFF) +add_option(WITH_OPTIM "Build with optimisation" ON) +add_option(WITH_NEW_STRATEGIES "Use new strategies" ON) +add_option(WITH_NATIVE_INSTRUCTIONS "Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)" OFF) -if("${ARCH}" MATCHES "arm" OR "${ARCH}" MATCHES "aarch64") - option(WITH_ACLE "Build with ACLE CRC" ON) - option(WITH_NEON "Build with NEON intrinsics" ON) -elseif("${ARCH}" MATCHES "s390x") - option(WITH_DFLTCC_DEFLATE "Use DEFLATE CONVERSION CALL instruction for compression on IBM Z" OFF) - option(WITH_DFLTCC_INFLATE "Use DEFLATE CONVERSION CALL instruction for decompression on IBM Z" OFF) -endif() +add_option(WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings" OFF) +add_option(WITH_CODE_COVERAGE "Enable code coverage reporting" OFF) +add_option(WITH_INFLATE_STRICT "Build with strict inflate distance checking" OFF) +add_option(WITH_INFLATE_ALLOW_INVALID_DIST "Build with zero fill for inflate invalid distances" OFF) +add_option(WITH_UNALIGNED "Support unaligned reads on platforms that support it" ON) -add_feature_info(ZLIB_COMPAT ZLIB_COMPAT "Provide a zlib-compatible API") -add_feature_info(WITH_GZFILEOP WITH_GZFILEOP "Compile with support for gzFile-related functions") -add_feature_info(WITH_OPTIM WITH_OPTIM "Build with optimisation") -add_feature_info(WITH_SANITIZERS WITH_SANITIZERS "Build with address sanitizer and all supported sanitizers other than memory sanitizer") -add_feature_info(WITH_MSAN WITH_MSAN "Build with memory sanitizer") -add_feature_info(WITH_FUZZERS WITH_FUZZERS "Build test/fuzz") -add_feature_info(WITH_NEW_STRATEGIES WITH_NEW_STRATEGIES "Use new strategies") -if("${ARCH}" MATCHES "arm" OR "${ARCH}" MATCHES "aarch64") - add_feature_info(WITH_ACLE WITH_ACLE "Build with ACLE CRC") - add_feature_info(WITH_NEON WITH_NEON "Build with NEON intrinsics") +if(BASEARCH_ARM_FOUND) + add_option(WITH_ACLE "Build with ACLE" ON) + add_option(WITH_NEON "Build with NEON intrinsics" ON) +elseif(BASEARCH_PPC_FOUND) + add_option(WITH_POWER8 "Build with optimisations for POWER8" ON) +elseif(BASEARCH_S360_FOUND) + add_option(WITH_DFLTCC_DEFLATE "Use DEFLATE CONVERSION CALL instruction for compression on IBM Z" OFF) + add_option(WITH_DFLTCC_INFLATE "Use DEFLATE CONVERSION CALL instruction for decompression on IBM Z" OFF) +elseif(BASEARCH_X86_FOUND) + add_option(WITH_AVX2 "Build with AVX2" ON) + add_option(WITH_SSE2 "Build with SSE2" ON) + add_option(WITH_SSSE3 "Build with SSSE3" ON) + add_option(WITH_SSE4 "Build with SSE4" ON) + add_option(WITH_PCLMULQDQ "Build with PCLMULQDQ" ON) endif() +add_option(INSTALL_UTILS "Copy minigzip and minideflate during install" OFF) -if (ZLIB_COMPAT) +mark_as_advanced(FORCE + ZLIB_DUAL_LINK + WITH_ACLE WITH_NEON + WITH_DFLTCC_DEFLATE + WITH_DFLTCC_INFLATE + WITH_AVX2 WITH_SSE2 + WITH_SSSE3 WITH_SSE4 + WITH_PCLMULQDQ + WITH_POWER8 + WITH_INFLATE_STRICT + WITH_INFLATE_ALLOW_INVALID_DIST + WITH_UNALIGNED + INSTALL_UTILS + ) + +if(ZLIB_COMPAT) add_definitions(-DZLIB_COMPAT) set(WITH_GZFILEOP ON) - set(LIBNAME1 libz) - set(LIBNAME2 zlib) - set(SUFFIX "") + set(SUFFIX "-ng") else() - set(LIBNAME1 libz-ng) - set(LIBNAME2 zlib-ng) set(SUFFIX "-ng") endif() @@ -128,36 +137,48 @@ if(WITH_GZFILEOP) add_definitions(-DWITH_GZFILEOP) endif() -if(${CMAKE_C_COMPILER} MATCHES "icc" OR ${CMAKE_C_COMPILER} MATCHES "icpc" OR ${CMAKE_C_COMPILER} MATCHES "icl") - if(WITH_NATIVE_INSTRUCTIONS) - message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not supported on this configuration") - endif() - if(CMAKE_HOST_UNIX) - if(NOT SSE2FLAG) +if("${CMAKE_C_COMPILER}" MATCHES "icc" OR "${CMAKE_C_COMPILER}" MATCHES "icpc" OR "${CMAKE_C_COMPILER}" MATCHES "icl") + if(CMAKE_HOST_UNIX OR APPLE) + set(WARNFLAGS "-w3") + set(WARNFLAGS_MAINTAINER "-w3 -Wcheck -Wremarks") + set(WARNFLAGS_DISABLE "") + if(BASEARCH_X86_FOUND) + set(AVX2FLAG "-mavx2") set(SSE2FLAG "-msse2") - endif() - if(NOT SSE4FLAG) + set(SSSE3FLAG "-mssse3") set(SSE4FLAG "-msse4.2") endif() else() - if(NOT SSE2FLAG) + set(WARNFLAGS "/W3") + set(WARNFLAGS_MAINTAINER "/W5") + set(WARNFLAGS_DISABLE "") + if(BASEARCH_X86_FOUND) + set(AVX2FLAG "/arch:AVX2") set(SSE2FLAG "/arch:SSE2") - endif() - if(NOT SSE4FLAG) + set(SSSE3FLAG "/arch:SSSE3") set(SSE4FLAG "/arch:SSE4.2") endif() endif() + if(WITH_NATIVE_INSTRUCTIONS) + message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not supported on this configuration") + endif() elseif(MSVC) # TODO. ICC can be used through MSVC. I'm not sure if we'd ever see that combination # (who'd use cmake from an IDE...) but checking for ICC before checking for MSVC should # avoid mistakes. # /Oi ? - if(NOT ${ARCH} MATCHES "AMD64") - set(SSE2FLAG "/arch:SSE2") - endif() - if("${ARCH}" MATCHES "arm") - add_definitions("-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1") - set(NEONFLAG "/arch:VFPv4") + set(WARNFLAGS "/W3") + set(WARNFLAGS_MAINTAINER "/W4") + set(WARNFLAGS_DISABLE "") + if(BASEARCH_ARM_FOUND) + add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE) + if(NOT "${ARCH}" MATCHES "aarch64") + set(NEONFLAG "/arch:VFPv4") + endif() + elseif(BASEARCH_X86_FOUND) + if(NOT "${ARCH}" MATCHES "x86_64") + set(SSE2FLAG "/arch:SSE2") + endif() endif() if(WITH_NATIVE_INSTRUCTIONS) message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not supported on this configuration") @@ -167,85 +188,160 @@ else() if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") set(__GNUC__ ON) endif() + # Enable warnings in GCC and Clang + if(__GNUC__) + set(WARNFLAGS "-Wall") + set(WARNFLAGS_MAINTAINER "-Wextra -Wpedantic") + set(WARNFLAGS_DISABLE "-Wno-implicit-fallthrough") + endif() if(WITH_NATIVE_INSTRUCTIONS) if(__GNUC__) - set(NATIVEFLAG "-march=native") + if(BASEARCH_PPC_FOUND) + set(NATIVEFLAG "-mcpu=native") + else() + set(NATIVEFLAG "-march=native") + endif() else() message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not implemented yet on this configuration") endif() endif() - if(__GNUC__ AND "${ARCH}" MATCHES "arm") - execute_process(COMMAND ${CMAKE_C_COMPILER} "-dumpmachine" - OUTPUT_VARIABLE GCC_MACHINE) - if ("${GCC_MACHINE}" MATCHES "eabihf") - set(FLOATABI "-mfloat-abi=hard") - else() - set(FLOATABI "-mfloat-abi=softfp") - endif() - endif() if(NOT NATIVEFLAG) - if(NOT SSE2FLAG) - if(__GNUC__) + if(__GNUC__) + if(BASEARCH_ARM_FOUND) + if(NOT CMAKE_C_FLAGS MATCHES "-mfloat-abi") + # Check support for ARM floating point + execute_process(COMMAND ${CMAKE_C_COMPILER} "-dumpmachine" + OUTPUT_VARIABLE GCC_MACHINE) + if("${GCC_MACHINE}" MATCHES "gnueabihf") + set(FLOATABI "-mfloat-abi=hard") + elseif("${GCC_MACHINE}" MATCHES ".*gnueabi") + set(FLOATABI "-mfloat-abi=softfp") + endif() + message(STATUS "ARM floating point arch: ${FLOATABI}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLOATABI}") + endif() + # NEON + if("${ARCH}" MATCHES "aarch64") + set(NEONFLAG "-march=armv8-a+simd") + else() + # Check whether -mfpu=neon is available + set(CMAKE_REQUIRED_FLAGS "-mfpu=neon") + check_c_source_compiles( + "int main() { return 0; }" + MFPU_NEON_AVAILABLE FAIL_REGEX "not supported") + set(CMAKE_REQUIRED_FLAGS) + if(MFPU_NEON_AVAILABLE) + set(NEONFLAG "-mfpu=neon") + endif() + endif() + # ACLE + set(ACLEFLAG "-march=armv8-a+crc") + elseif(BASEARCH_PPC_FOUND) + set(POWER8FLAG "-mcpu=power8") + elseif(BASEARCH_X86_FOUND) + set(AVX2FLAG "-mavx2") set(SSE2FLAG "-msse2") - endif() - endif() - if(NOT SSE4FLAG) - if(__GNUC__) + set(SSSE3FLAG "-mssse3") set(SSE4FLAG "-msse4") - endif() - endif() - if(NOT PCLMULFLAG) - if(__GNUC__) set(PCLMULFLAG "-mpclmul") endif() endif() - if("${ARCH}" MATCHES "arm") - set(ACLEFLAG "-march=armv8-a+crc") - set(NEONFLAG "${FLOATABI} -mfpu=neon") - elseif("${ARCH}" MATCHES "aarch64") - set(ACLEFLAG "-march=armv8-a+crc") - set(NEONFLAG "-march=armv8-a+crc+simd") - endif() - else() - set(SSE2FLAG ${NATIVEFLAG}) - set(SSE4FLAG ${NATIVEFLAG}) - set(PCLMULFLAG ${NATIVEFLAG}) - if("${ARCH}" MATCHES "arm") - set(ACLEFLAG "${NATIVEFLAG}") - set(NEONFLAG "${FLOATABI} -mfpu=neon") - elseif("${ARCH}" MATCHES "aarch64") - set(ACLEFLAG "${NATIVEFLAG}") - set(NEONFLAG "${NATIVEFLAG}") - endif() endif() endif() +# Replace optimization level 3 added by default with level 2 +if(NOT MSVC AND NOT CMAKE_C_FLAGS MATCHES "([\\/\\-]O)3") + string(REGEX REPLACE "([\\/\\-]O)3" "\\12" + CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) +endif() + +# Set architecture alignment requirements +if(WITH_UNALIGNED) + if(BASEARCH_ARM_FOUND OR (BASEARCH_PPC_FOUND AND "${ARCH}" MATCHES "powerpc64le") OR BASEARCH_X86_FOUND) + if(NOT DEFINED UNALIGNED_OK) + set(UNALIGNED_OK TRUE) + endif() + endif() + if(UNALIGNED_OK) + add_definitions(-DUNALIGNED_OK) + message(STATUS "Architecture supports unaligned reads") + endif() + if(BASEARCH_ARM_FOUND) + if(NOT DEFINED UNALIGNED64_OK) + if("${ARCH}" MATCHES "(arm(v[8-9])?|aarch64)") + set(UNALIGNED64_OK TRUE) + endif() + endif() + endif() + if(BASEARCH_PPC_FOUND) + if(NOT DEFINED UNALIGNED64_OK) + if("${ARCH}" MATCHES "powerpc64le") + set(UNALIGNED64_OK TRUE) + endif() + endif() + endif() + if(BASEARCH_X86_FOUND) + if(NOT DEFINED UNALIGNED64_OK) + set(UNALIGNED64_OK TRUE) + endif() + endif() + if(UNALIGNED64_OK) + add_definitions(-DUNALIGNED64_OK) + message(STATUS "Architecture supports unaligned reads of > 4 bytes") + endif() +else() + message(STATUS "Unaligned reads manually disabled") +endif() + +# Apply warning compiler flags +if(WITH_MAINTAINER_WARNINGS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNFLAGS} ${WARNFLAGS_MAINTAINER} ${WARNFLAGS_DISABLE}") +else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNFLAGS} ${WARNFLAGS_DISABLE}") +endif() + +# Set code coverage compiler flags +if(WITH_CODE_COVERAGE) + if(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(CMAKE_C_FLAGS "-O0 ${CMAKE_C_FLAGS} -coverage") + elseif(__GNUC__) + # Some versions of GCC don't support -coverage shorthand + set(CMAKE_C_FLAGS "-O0 ${CMAKE_C_FLAGS} -ftest-coverage -fprofile-arcs -fprofile-values") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov -fprofile-arcs") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lgcov -fprofile-arcs") + endif() +endif() + +# Set native instruction set compiler flag +if(WITH_NATIVE_INSTRUCTIONS AND DEFINED NATIVEFLAG) + # Apply flag to all source files and compilation checks + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NATIVEFLAG}") +endif() + +# +# Check for stndard/system includes +# +check_include_file(sys/types.h HAVE_SYS_TYPES_H) +check_include_file(stdarg.h HAVE_STDARG_H) +check_include_file(stdint.h HAVE_STDINT_H) +check_include_file(stddef.h HAVE_STDDEF_H) +check_include_file(sys/sdt.h HAVE_SYS_SDT_H) +check_include_file(unistd.h HAVE_UNISTD_H) + # # Check to see if we have large file support # set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64) -# We add these other definitions here because CheckTypeSize.cmake -# in CMake 2.4.x does not automatically do so and we want -# compatibility with CMake 2.4.x. -if(HAVE_SYS_TYPES_H) - list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H) -endif() -if(HAVE_STDINT_H) - list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H) -endif() -if(HAVE_STDDEF_H) - list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H) -endif() check_type_size(off64_t OFF64_T) if(HAVE_OFF64_T) - add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64) + add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64) else() - check_type_size(_off64_t _OFF64_T) - if(HAVE__OFF64_T) - add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64) - else() - check_type_size(__off64_t __OFF64_T) - endif() + check_type_size(_off64_t _OFF64_T) + if(HAVE__OFF64_T) + add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64) + else() + check_type_size(__off64_t __OFF64_T) + endif() endif() set(CMAKE_REQUIRED_DEFINITIONS) # clear variable @@ -261,104 +357,81 @@ if(NOT HAVE_STRERROR) add_definitions(-DNO_STRERROR) endif() +if(WITH_SANITIZER STREQUAL "Address") + add_address_sanitizer() +elseif(WITH_SANITIZER STREQUAL "Memory") + add_memory_sanitizer() +elseif(WITH_SANITIZER STREQUAL "Undefined") + add_undefined_sanitizer() +endif() + # -# Check for unistd.h and stdarg.h +# Check whether compiler supports -fno-semantic-interposition parameter # -check_include_file(unistd.h Z_HAVE_UNISTD_H) - -if(WITH_SANITIZERS AND WITH_MSAN) - message(FATAL_ERROR "Memory sanitizer is incompatible with address sanitizer") -endif() - -if(WITH_MSAN) - set(CMAKE_REQUIRED_FLAGS "-fsanitize=memory") - check_c_source_compiles("int main() { return 0; }" HAS_MSAN FAIL_REGEX "not supported") - if(${HAS_MSAN}) - set(SANITIZERS_FLAGS "-fsanitize=memory") - message(STATUS "Adding memory sanitizer flag: ${SANITIZERS_FLAGS}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZERS_FLAGS}") - endif() -endif() - -if(WITH_SANITIZERS) - set(_sanitize_flags - bool - address - array-bounds - float-divide-by-zero - function - integer-divide-by-zero - return - shift - signed-integer-overflow - undefined - unsigned-integer-overflow - vla-bound - vptr - ) - set(SANITIZERS_FLAGS "") - foreach(_flag ${_sanitize_flags}) - set(CMAKE_REQUIRED_FLAGS "-fsanitize=${_flag}") - check_c_source_compiles("int main() { return 0; }" - HAS_SANITIZER_${_flag} FAIL_REGEX "not supported") - if(${HAS_SANITIZER_${_flag}}) - if("${SANITIZERS_FLAGS}" STREQUAL "") - set(SANITIZERS_FLAGS "-fsanitize=${_flag}") - else() - set(SANITIZERS_FLAGS "${SANITIZERS_FLAGS},${_flag}") - endif() - endif() - set(CMAKE_REQUIRED_FLAGS) - endforeach() - message(STATUS "Adding sanitizers flags: ${SANITIZERS_FLAGS}") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZERS_FLAGS}") -endif() +set(CMAKE_REQUIRED_FLAGS "-fno-semantic-interposition") +check_c_source_compiles( + "int main() { return 0; }" + HAVE_NO_INTERPOSITION +) +set(CMAKE_REQUIRED_FLAGS) # # Check if we can hide zlib internal symbols that are linked between separate source files using hidden # check_c_source_compiles( - "#define ZLIB_INTERNAL __attribute__((visibility (\"hidden\"))) - int ZLIB_INTERNAL foo; - int main() - { - return 0; + "#define Z_INTERNAL __attribute__((visibility (\"hidden\"))) + int Z_INTERNAL foo; + int main() { + return 0; }" HAVE_ATTRIBUTE_VISIBILITY_HIDDEN FAIL_REGEX "not supported") if(HAVE_ATTRIBUTE_VISIBILITY_HIDDEN) - add_definitions(-DHAVE_HIDDEN) + add_definitions(-DHAVE_VISIBILITY_HIDDEN) endif() # # Check if we can hide zlib internal symbols that are linked between separate source files using internal # check_c_source_compiles( - "#define ZLIB_INTERNAL __attribute__((visibility (\"internal\"))) - int ZLIB_INTERNAL foo; - int main() - { - return 0; + "#define Z_INTERNAL __attribute__((visibility (\"internal\"))) + int Z_INTERNAL foo; + int main() { + return 0; }" HAVE_ATTRIBUTE_VISIBILITY_INTERNAL FAIL_REGEX "not supported") if(HAVE_ATTRIBUTE_VISIBILITY_INTERNAL) - add_definitions(-DHAVE_INTERNAL) + add_definitions(-DHAVE_VISIBILITY_INTERNAL) endif() # -# check for __builtin_ctzl() support in the compiler +# check for __builtin_ctz() support in the compiler # check_c_source_compiles( - "int main(void) - { + "int main(void) { unsigned int zero = 0; - long test = __builtin_ctzl(zero); + long test = __builtin_ctz(zero); (void)test; return 0; }" - HAVE_BUILTIN_CTZL + HAVE_BUILTIN_CTZ ) -if(HAVE_BUILTIN_CTZL) - add_definitions(-DHAVE_BUILTIN_CTZL) +if(HAVE_BUILTIN_CTZ) + add_definitions(-DHAVE_BUILTIN_CTZ) +endif() +# +# check for __builtin_ctzll() support in the compiler +# +check_c_source_compiles( + "int main(void) { + unsigned int zero = 0; + long test = __builtin_ctzll(zero); + (void)test; + return 0; + }" + HAVE_BUILTIN_CTZLL +) +if(HAVE_BUILTIN_CTZLL) + add_definitions(-DHAVE_BUILTIN_CTZLL) endif() # @@ -366,28 +439,32 @@ endif() # check_c_source_compiles( "#include - int main() { ptrdiff_t *a; return 0; }" + int main() { + ptrdiff_t *a; + (void)a; + return 0; + }" HAVE_PTRDIFF_T ) if(NOT HAVE_PTRDIFF_T) - set(NEED_PTRDIFF_T 1) + set(NEED_PTRDIFF_T 1) - check_type_size("void *" SIZEOF_DATA_PTR) - message(STATUS "sizeof(void *) is ${SIZEOF_DATA_PTR} bytes") + check_type_size("void *" SIZEOF_DATA_PTR) + message(STATUS "sizeof(void *) is ${SIZEOF_DATA_PTR} bytes") - if(${SIZEOF_DATA_PTR} MATCHES "4") - set(PTRDIFF_TYPE "uint32_t") - elseif(${SIZEOF_DATA_PTR} MATCHES "8") - set(PTRDIFF_TYPE "uint64_t") - else() - message(FATAL_ERROR "sizeof(void *) is neither 32 nor 64 bit") - endif() + if(${SIZEOF_DATA_PTR} MATCHES "4") + set(PTRDIFF_TYPE "uint32_t") + elseif(${SIZEOF_DATA_PTR} MATCHES "8") + set(PTRDIFF_TYPE "uint64_t") + else() + message(FATAL_ERROR "sizeof(void *) is neither 32 nor 64 bit") + endif() endif() -# Macro to check if source compiles when cross-compiling -# or runs when compiling natively +# Macro to check if source compiles +# (and, when compiling very natively, also runs). macro(check_c_source_compile_or_run source flag) - if(CMAKE_CROSSCOMPILING) + if(CMAKE_CROSSCOMPILING OR NOT WITH_NATIVE_INSTRUCTIONS) check_c_source_compiles("${source}" ${flag}) else() check_c_source_runs("${source}" ${flag}) @@ -400,67 +477,95 @@ if(MSVC) set(CMAKE_DEBUG_POSTFIX "d") add_definitions(-D_CRT_SECURE_NO_DEPRECATE) add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) -else() - # - # Not MSVC, so we need to check if we have the MS-style SSE etc. intrinsics - # - if(WITH_NATIVE_INSTRUCTIONS) - set(CMAKE_REQUIRED_FLAGS "${NATIVEFLAG}") - else() - set(CMAKE_REQUIRED_FLAGS "${SSE2FLAG}") - endif() +endif() + +if(BASEARCH_PPC_FOUND) + # Check if we have what we need for POWER8 optimizations + set(CMAKE_REQUIRED_FLAGS "${POWER8FLAG}") + check_c_source_compiles( + "#include + int main() { + return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07); + }" + HAVE_POWER8 + ) + set(CMAKE_REQUIRED_FLAGS) +elseif(BASEARCH_X86_FOUND) + # Check whether compiler supports SSE2 instrinics + set(CMAKE_REQUIRED_FLAGS "${SSE2FLAG}") check_c_source_compile_or_run( "#include - int main(void) - { + int main(void) { __m128i zero = _mm_setzero_si128(); (void)zero; return 0; }" HAVE_SSE2_INTRIN ) - set(CMAKE_REQUIRED_FLAGS) - - if(WITH_NATIVE_INSTRUCTIONS) - set(CMAKE_REQUIRED_FLAGS "${NATIVEFLAG}") - else() - # Use the generic SSE4 enabler option to check for the SSE4.2 instruction we require: - set(CMAKE_REQUIRED_FLAGS "${SSE4FLAG}") - endif() + # Check whether compiler supports SSSE3 intrinsics + set(CMAKE_REQUIRED_FLAGS "${SSSE3FLAG}") check_c_source_compile_or_run( - "int main(void) - { - unsigned val = 0, h = 0; - __asm__ __volatile__ ( \"crc32 %1,%0\" : \"+r\" (h) : \"r\" (val) ); - return (int) h; + "#include + int main(void) { + __m128i u, v, w; + u = _mm_set1_epi32(1); + v = _mm_set1_epi32(2); + w = _mm_hadd_epi32(u, v); + (void)w; + return 0; }" - HAVE_SSE42_INTRIN + HAVE_SSSE3_INTRIN ) + # Check whether compiler supports SSE4 CRC inline asm + set(CMAKE_REQUIRED_FLAGS "${SSE4FLAG}") check_c_source_compile_or_run( - "int main(void) - { + "int main(void) { + unsigned val = 0, h = 0; + #if defined(_MSC_VER) + { __asm mov edx, h __asm mov eax, val __asm crc32 eax, edx __asm mov val, eax } + #else + __asm__ __volatile__ ( \"crc32 %1,%0\" : \"+r\" (h) : \"r\" (val) ); + #endif + return (int)h; + }" + HAVE_SSE42CRC_INLINE_ASM + ) + # Check whether compiler supports SSE4 CRC intrinsics + check_c_source_compile_or_run( + "#include + int main(void) { unsigned crc = 0; char c = 'c'; + #if defined(_MSC_VER) + crc = _mm_crc32_u32(crc, c); + #else crc = __builtin_ia32_crc32qi(crc, c); + #endif (void)crc; return 0; }" HAVE_SSE42CRC_INTRIN ) - set(CMAKE_REQUIRED_FLAGS) - - if(WITH_NATIVE_INSTRUCTIONS) - set(CMAKE_REQUIRED_FLAGS "${NATIVEFLAG}") - else() - set(CMAKE_REQUIRED_FLAGS "${PCLMULFLAG}") - endif() - if(NOT (APPLE AND ${ARCH} MATCHES "i386")) + # Check whether compiler supports SSE4.2 compare string instrinics + check_c_source_compile_or_run( + "#include + int main(void) { + unsigned char a[64] = { 0 }; + unsigned char b[64] = { 0 }; + __m128i xmm_src0, xmm_src1; + xmm_src0 = _mm_loadu_si128((__m128i *)(char *)a); + xmm_src1 = _mm_loadu_si128((__m128i *)(char *)b); + return _mm_cmpestri(xmm_src0, 16, xmm_src1, 16, 0); + }" + HAVE_SSE42CMPSTR_INTRIN + ) + # Check whether compiler supports PCLMULQDQ intrinsics + set(CMAKE_REQUIRED_FLAGS "${PCLMULFLAG}") + if(NOT (APPLE AND "${ARCH}" MATCHES "i386")) # The pclmul code currently crashes on Mac in 32bit mode. Avoid for now. check_c_source_compile_or_run( "#include - #include - int main(void) - { + int main(void) { __m128i a = _mm_setzero_si128(); __m128i b = _mm_setzero_si128(); __m128i c = _mm_clmulepi64_si128(a, b, 0x10); @@ -472,150 +577,180 @@ else() else() set(HAVE_PCLMULQDQ_INTRIN NO) endif() + # Check whether compiler supports AVX2 intrinics + set(CMAKE_REQUIRED_FLAGS "${AVX2FLAG}") + check_c_source_compile_or_run( + "#include + int main(void) { + __m256i x = _mm256_set1_epi16(2); + const __m256i y = _mm256_set1_epi16(1); + x = _mm256_subs_epu16(x, y); + (void)x; + return 0; + }" + HAVE_AVX2_INTRIN + ) set(CMAKE_REQUIRED_FLAGS) + + # FORCE_SSE2 option will only be shown if HAVE_SSE2_INTRIN is true + if("${ARCH}" MATCHES "i[3-6]86") + cmake_dependent_option(FORCE_SSE2 "Always assume CPU is SSE2 capable" OFF "HAVE_SSE2_INTRIN" OFF) + endif() endif() -# Check whether -mfpu=neon is available -set(CMAKE_REQUIRED_FLAGS "-mfpu=neon") -check_c_source_compiles( - "int main() - { - return 0; - }" - MFPU_NEON_AVAILABLE FAIL_REGEX "not supported") -set(CMAKE_REQUIRED_FLAGS) - -# FORCE_SSE2 option will only be shown if HAVE_SSE2_INTRIN is true -if("${ARCH}" MATCHES "i[3-6]86") - cmake_dependent_option(FORCE_SSE2 "Always assume CPU is SSE2 capable" OFF "HAVE_SSE2_INTRIN" OFF) +# +# Enable deflate_quick at level 1 +# +if(NOT WITH_NEW_STRATEGIES) + add_definitions(-DNO_QUICK_STRATEGY) endif() - # # Enable deflate_medium at level 4-6 # if(NOT WITH_NEW_STRATEGIES) add_definitions(-DNO_MEDIUM_STRATEGY) endif() +# +# Enable inflate compilation options +# +if(WITH_INFLATE_STRICT) + add_definitions(-DINFLATE_STRICT) + message(STATUS "Inflate strict distance checking enabled") +endif() +if(WITH_INFLATE_ALLOW_INVALID_DIST) + add_definitions(-DINFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR) + message(STATUS "Inflate zero data for invalid distances enabled") +endif() -# -# Macro to add either the given intrinsics option to the global compiler options, -# or ${NATIVEFLAG} (-march=native) if that is appropriate and possible. -# An alternative version of this macro would take a file argument, and set ${flag} -# only for that file as opposed to ${NATIVEFLAG} globally, to limit side-effect of -# using ${flag} globally. -# -macro(add_intrinsics_option flag) - if(WITH_NATIVE_INSTRUCTIONS AND NATIVEFLAG) - if (NOT "${CMAKE_C_FLAGS} " MATCHES ".*${NATIVEFLAG} .*") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NATIVEFLAG}") - endif() - else() - if (NOT "${CMAKE_C_FLAGS} " MATCHES ".*${flag} .*") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") - endif() - endif() -endmacro() set(ZLIB_ARCH_SRCS) +set(ZLIB_ARCH_HDRS) set(ARCHDIR "arch/generic") -if("${ARCH}" MATCHES "x86_64" OR "${ARCH}" MATCHES "AMD64" OR "${ARCH}" MATCHES "i[3-6]86") - set(ARCHDIR "arch/x86") - add_definitions(-DUNALIGNED_OK) - add_feature_info(SSE2 1 "Support the SSE2 instruction set, using \"${SSE2FLAG}\"") -elseif("${ARCH}" MATCHES "arm" OR "${ARCH}" MATCHES "aarch64") +if(BASEARCH_ARM_FOUND) set(ARCHDIR "arch/arm") - add_definitions(-DUNALIGNED_OK) -elseif("${ARCH}" MATCHES "s390x") +elseif(BASEARCH_PPC_FOUND) + set(ARCHDIR "arch/power") +elseif(BASEARCH_S360_FOUND) set(ARCHDIR "arch/s390") +elseif(BASEARCH_X86_FOUND) + set(ARCHDIR "arch/x86") + if(NOT ${ARCH} MATCHES "x86_64") + add_feature_info(SSE2 1 "Support the SSE2 instruction set, using \"${SSE2FLAG}\"") + endif() else() message(STATUS "No optimized architecture: using ${ARCHDIR}") endif() -if("${ARCH}" MATCHES "arm" OR "${ARCH}" MATCHES "aarch64") - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/armfeature.c ${ARCHDIR}/fill_window_arm.c) -endif() + if(WITH_OPTIM) - if("${ARCH}" MATCHES "arm") - if(WITH_ACLE) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ACLEFLAG}") - add_definitions("-DARM_ACLE_CRC_HASH") - add_feature_info(ACLE_CRC 1 "Support CRC hash generation using the ACLE instruction set, using \"${ACLEFLAG}\"") + if(BASEARCH_ARM_FOUND) + add_definitions(-DARM_FEATURES) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/armfeature.c) + if(WITH_ACLE AND NOT MSVC) + add_definitions(-DARM_ACLE_CRC_HASH) + set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c) + set_property(SOURCE ${ACLE_SRCS} PROPERTY COMPILE_FLAGS "${ACLEFLAG}") + list(APPEND ZLIB_ARCH_SRCS ${ACLE_SRCS}) + add_feature_info(ACLE_CRC 1 "Support ACLE optimized CRC hash generation, using \"${ACLEFLAG}\"") endif() if(WITH_NEON) - if(MFPU_NEON_AVAILABLE) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NEONFLAG}") - endif() - add_definitions("-DARM_NEON_ADLER32") + add_definitions(-DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH) + set(NEON_SRCS ${ARCHDIR}/adler32_neon.c ${ARCHDIR}/chunkset_neon.c ${ARCHDIR}/slide_neon.c) + list(APPEND ZLIB_ARCH_SRCS ${NEON_SRCS}) + set_property(SOURCE ${NEON_SRCS} PROPERTY COMPILE_FLAGS "${NEONFLAG}") if(MSVC) - add_definitions("-D__ARM_NEON__=1") - endif(MSVC) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/adler32_neon.c) - add_feature_info(NEON_FILLWINDOW 1 "Support NEON instructions in fill_window_arm, using \"${NEONFLAG}\"") + add_definitions(-D__ARM_NEON__) + endif() + add_feature_info(NEON_ADLER32 1 "Support NEON instructions in adler32, using \"${NEONFLAG}\"") + add_feature_info(NEON_SLIDEHASH 1 "Support NEON instructions in slide_hash, using \"${NEONFLAG}\"") endif() - elseif("${ARCH}" MATCHES "aarch64") - if(WITH_ACLE) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c) - add_definitions("-DARM_ACLE_CRC_HASH") - add_feature_info(ACLE_CRC 1 "Support CRC hash generation using the ACLE instruction set, using \"${ACLEFLAG}\"") + elseif(BASEARCH_PPC_FOUND) + if(WITH_POWER8 AND HAVE_POWER8) + add_definitions(-DPOWER8) + add_definitions(-DPOWER_FEATURES) + add_definitions(-DPOWER8_VSX_ADLER32) + add_definitions(-DPOWER8_VSX_SLIDEHASH) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/power.c) + set(POWER8_SRCS ${ARCHDIR}/adler32_power8.c ${ARCHDIR}/slide_hash_power8.c) + list(APPEND ZLIB_ARCH_SRCS ${POWER8_SRCS}) + set_property(SOURCE ${POWER8_SRCS} PROPERTY COMPILE_FLAGS "${POWER8FLAG}") endif() - # We need to check WITH_NEON first - if(WITH_NEON) - add_definitions("-DARM_NEON_ADLER32") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${NEONFLAG}") - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/adler32_neon.c) - add_feature_info(NEON_FILLWINDOW 1 "Support NEON instructions in fill_window_arm, using \"${NEONFLAG}\"") - elseif(WITH_ACLE) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ACLEFLAG}") + elseif(BASEARCH_S360_FOUND) + if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_common.c) + add_definitions(-DGZBUFSIZE=262144) endif() - elseif("${ARCHDIR}" MATCHES "arch/x86") - add_definitions("-DX86_CPUID") - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/x86.c) - if(HAVE_SSE42_INTRIN) - add_definitions(-DX86_SSE4_2_CRC_HASH) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/insert_string_sse.c) - add_feature_info(SSE4_CRC 1 "Support CRC hash generation using the SSE4.2 instruction set, using \"${SSE4FLAG}\"") - add_intrinsics_option("${SSE4FLAG}") + if(WITH_DFLTCC_DEFLATE) + add_definitions(-DS390_DFLTCC_DEFLATE) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_deflate.c) + endif() + if(WITH_DFLTCC_INFLATE) + add_definitions(-DS390_DFLTCC_INFLATE) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_inflate.c) + endif() + elseif(BASEARCH_X86_FOUND) + add_definitions(-DX86_FEATURES) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/x86.c) + if(MSVC) + list(APPEND ZLIB_ARCH_HDRS fallback_builtins.h) + endif() + if(WITH_AVX2 AND HAVE_AVX2_INTRIN) + add_definitions(-DX86_AVX2 -DX86_AVX2_ADLER32 -DX86_AVX_CHUNKSET) + set(AVX2_SRCS ${ARCHDIR}/slide_avx.c) + add_feature_info(AVX2_SLIDEHASH 1 "Support AVX2 optimized slide_hash, using \"${AVX2FLAG}\"") + list(APPEND AVX2_SRCS ${ARCHDIR}/chunkset_avx.c) + add_feature_info(AVX_CHUNKSET 1 "Support AVX optimized chunkset, using \"${AVX2FLAG}\"") + list(APPEND AVX2_SRCS ${ARCHDIR}/compare258_avx.c) + add_feature_info(AVX2_COMPARE258 1 "Support AVX2 optimized compare258, using \"${AVX2FLAG}\"") + list(APPEND AVX2_SRCS ${ARCHDIR}/adler32_avx.c) + add_feature_info(AVX2_ADLER32 1 "Support AVX2-accelerated adler32, using \"${AVX2FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${AVX2_SRCS}) + set_property(SOURCE ${AVX2_SRCS} PROPERTY COMPILE_FLAGS "${AVX2FLAG}") + endif() + if(WITH_SSE4 AND (HAVE_SSE42CRC_INLINE_ASM OR HAVE_SSE42CRC_INTRIN)) + add_definitions(-DX86_SSE42_CRC_HASH) + set(SSE42_SRCS ${ARCHDIR}/insert_string_sse.c) + add_feature_info(SSE42_CRC 1 "Support SSE4.2 optimized CRC hash generation, using \"${SSE4FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${SSE42_SRCS}) + set_property(SOURCE ${SSE42_SRCS} PROPERTY COMPILE_FLAGS "${SSE4FLAG}") if(HAVE_SSE42CRC_INTRIN) - add_definitions(-DX86_SSE4_2_CRC_INTRIN) - endif() - if(WITH_NEW_STRATEGIES) - add_definitions(-DX86_QUICK_STRATEGY) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/deflate_quick.c) - add_feature_info(SSE4DEFLATE 1 "Support SSE4.2-accelerated quick compression") + add_definitions(-DX86_SSE42_CRC_INTRIN) endif() endif() - if(HAVE_SSE2_INTRIN) - add_definitions(-DX86_SSE2) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/fill_window_sse.c) + if(HAVE_SSE42CMPSTR_INTRIN) + add_definitions(-DX86_SSE42_CMP_STR) + set(SSE42_SRCS ${ARCHDIR}/compare258_sse.c) + add_feature_info(SSE42_COMPARE258 1 "Support SSE4.2 optimized compare258, using \"${SSE4FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${SSE42_SRCS}) + set_property(SOURCE ${SSE42_SRCS} PROPERTY COMPILE_FLAGS "${SSE4FLAG}") + endif() + if(WITH_SSE2 AND HAVE_SSE2_INTRIN) + add_definitions(-DX86_SSE2 -DX86_SSE2_CHUNKSET -DX86_SSE2_SLIDEHASH) + set(SSE2_SRCS ${ARCHDIR}/chunkset_sse.c ${ARCHDIR}/slide_sse.c) + list(APPEND ZLIB_ARCH_SRCS ${SSE2_SRCS}) if(NOT ${ARCH} MATCHES "x86_64") - add_intrinsics_option("${SSE2FLAG}") + set_property(SOURCE ${SSE2_SRCS} PROPERTY COMPILE_FLAGS "${SSE2FLAG}") add_feature_info(FORCE_SSE2 FORCE_SSE2 "Assume CPU is SSE2 capable") if(FORCE_SSE2) add_definitions(-DX86_NOCHECK_SSE2) endif() endif() endif() - if(HAVE_PCLMULQDQ_INTRIN) + if(WITH_SSSE3 AND HAVE_SSSE3_INTRIN) + add_definitions(-DX86_SSSE3 -DX86_SSSE3_ADLER32) + set(SSSE3_SRCS ${ARCHDIR}/adler32_ssse3.c) + add_feature_info(SSSE3_ADLER32 1 "Support SSSE3-accelerated adler32, using \"${SSSE3FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${SSSE3_SRCS}) + set_property(SOURCE ${SSSE3_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG}") + endif() + if(WITH_PCLMULQDQ AND HAVE_PCLMULQDQ_INTRIN AND WITH_SSSE3 AND WITH_SSE4) add_definitions(-DX86_PCLMULQDQ_CRC) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/crc_folding.c) - add_intrinsics_option("${PCLMULFLAG}") - if(HAVE_SSE42_INTRIN) - add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${PCLMULFLAG}\"") - else() - add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${PCLMULFLAG} ${SSE4FLAG}\"") - endif() - endif() - elseif("${ARCH}" MATCHES "s390x") - if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/dfltcc_common.c) - endif() - if(WITH_DFLTCC_DEFLATE) - add_definitions(-DS390_DFLTCC_DEFLATE) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/dfltcc_deflate.c) - endif() - if(WITH_DFLTCC_INFLATE) - add_definitions(-DS390_DFLTCC_INFLATE) - set(ZLIB_ARCH_SRCS ${ZLIB_ARCH_SRCS} ${ARCHDIR}/dfltcc_inflate.c) + set(PCLMULQDQ_SRCS ${ARCHDIR}/crc_folding.c) + add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${SSSE3FLAG} ${SSE4FLAG} ${PCLMULFLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${PCLMULQDQ_SRCS}) + set_property(SOURCE ${PCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${SSE4FLAG} ${PCLMULFLAG}") endif() endif() endif() @@ -629,15 +764,13 @@ macro(generate_cmakein input output) file(REMOVE ${output}) file(STRINGS ${input} _lines) foreach(_line IN LISTS _lines) - file(APPEND ${output} "${_line}\n") - - if (_line STREQUAL "#define ZCONF_H" OR _line STREQUAL "#define ZCONFNG_H") - file(APPEND ${output} "#cmakedefine Z_HAVE_UNISTD_H\n") - if(NOT HAVE_PTRDIFF_T) - file(APPEND ${output} "#cmakedefine NEED_PTRDIFF_T\n") - file(APPEND ${output} "#cmakedefine PTRDIFF_TYPE ${PTRDIFF_TYPE}\n") - endif() + string(REGEX REPLACE "#ifdef HAVE_UNISTD_H.*" "@ZCONF_UNISTD_LINE@" _line "${_line}") + string(REGEX REPLACE "#ifdef HAVE_STDARG_H.*" "@ZCONF_STDARG_LINE@" _line "${_line}") + string(REGEX REPLACE "#ifdef NEED_PTRDIFF_T.*" "@ZCONF_PTRDIFF_LINE@" _line "${_line}") + if(NEED_PTRDIFF_T) + string(REGEX REPLACE "typedef PTRDIFF_TYPE" "typedef @PTRDIFF_TYPE@" _line "${_line}") endif() + file(APPEND ${output} "${_line}\n") endforeach() endmacro(generate_cmakein) @@ -665,12 +798,18 @@ if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) endif() endif() -set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/${LIBNAME2}.pc) -configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein - ${ZLIB_PC} @ONLY) -configure_file(${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein - ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h @ONLY) - +# Refer to prefix symbolically to ease relocation by end user, +# as Makefile-generated .pc file does. +if(INC_INSTALL_DIR STREQUAL "${CMAKE_INSTALL_PREFIX}/include") + set(PC_INC_INSTALL_DIR "\${prefix}/include") +else() + set(PC_INC_INSTALL_DIR "${INSTALL_INC_DIR}") +endif() +if(LIB_INSTALL_DIR STREQUAL "${CMAKE_INSTALL_PREFIX}/lib") + set(PC_LIB_INSTALL_DIR "\${exec_prefix}/lib") +else() + set(PC_LIB_INSTALL_DIR "${INSTALL_LIB_DIR}") +endif() #============================================================================ # zlib @@ -681,37 +820,55 @@ set(ZLIB_PUBLIC_HDRS zlib${SUFFIX}.h ) set(ZLIB_PRIVATE_HDRS - crc32.h + adler32_p.h + chunkset_tpl.h + crc32_p.h + crc32_tbl.h + crc32_comb_tbl.h deflate.h + deflate_p.h functable.h - gzguts.h inffast.h - inffixed.h + inffixed_tbl.h inflate.h + inflate_p.h inftrees.h + insert_string_tpl.h + match_tpl.h trees.h + trees_emit.h + trees_tbl.h + zbuild.h + zendian.h zutil.h ) set(ZLIB_SRCS adler32.c + chunkset.c + compare258.c compress.c crc32.c + crc32_comb.c deflate.c deflate_fast.c deflate_medium.c + deflate_quick.c deflate_slow.c functable.c - inflate.c infback.c - inftrees.c inffast.c + inflate.c + inftrees.c + insert_string.c trees.c uncompr.c zutil.c ) +set(ZLIB_GZFILE_PRIVATE_HDRS + gzguts.h +) set(ZLIB_GZFILE_SRCS - gzclose.c gzlib.c gzread.c gzwrite.c @@ -739,65 +896,120 @@ if(MINGW OR MSYS) set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) endif() -add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ARCH_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -target_include_directories(zlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ARCH_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -target_include_directories(zlibstatic PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) - +set(ZLIB_ALL_SRCS ${ZLIB_SRCS} ${ZLIB_ARCH_HDRS} ${ZLIB_ARCH_SRCS} ${ZLIB_DLL_SRCS} + ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) if(WITH_GZFILEOP) - target_sources(zlib PRIVATE ${ZLIB_GZFILE_SRCS}) - target_sources(zlibstatic PRIVATE ${ZLIB_GZFILE_SRCS}) + list(APPEND ZLIB_ALL_SRCS ${ZLIB_GZFILE_PRIVATE_HDRS} ${ZLIB_GZFILE_SRCS}) endif() -set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) -set_target_properties(zlib PROPERTIES SOVERSION 1) +if(NOT DEFINED BUILD_SHARED_LIBS) + add_library(zlib SHARED ${ZLIB_ALL_SRCS}) + add_library(zlibstatic STATIC ${ZLIB_ALL_SRCS}) -if (ZLIB_COMPAT) - set(ZLIB_FULL_VERSION ${ZLIB_HEADER_VERSION}) + set(ZLIB_INSTALL_LIBRARIES zlib zlibstatic) else() - set(ZLIB_FULL_VERSION ${ZLIBNG_HEADER_VERSION}) -endif() -if(NOT CYGWIN) - # This property causes shared libraries on Linux to have the full version - # encoded into their final filename. We disable this on Cygwin because - # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll - # seems to be the default. - # - # This has no effect with MSVC, on that platform the version info for - # the DLL comes from the resource file win32/zlib1.rc - set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION}) + add_library(zlib ${ZLIB_ALL_SRCS}) + + set(ZLIB_INSTALL_LIBRARIES zlib) endif() +foreach(ZLIB_INSTALL_LIBRARY ${ZLIB_INSTALL_LIBRARIES}) + target_include_directories(${ZLIB_INSTALL_LIBRARY} PUBLIC + ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) +endforeach() -if(UNIX) +if(WIN32) + set_target_properties(${ZLIB_INSTALL_LIBRARIES} PROPERTIES OUTPUT_NAME zlib${SUFFIX}) +else() # On unix-like platforms the library is almost always called libz - set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z${SUFFIX}) - if(NOT APPLE) - set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/${LIBNAME2}.map\"") - endif() -elseif(MSYS) - # Suppress version number from shared library name - set(CMAKE_SHARED_LIBRARY_NAME_WITH_VERSION 0) -elseif(BUILD_SHARED_LIBS AND WIN32) - # Creates zlib1.dll when building shared library version - set_target_properties(zlib PROPERTIES SUFFIX "1.dll") + set_target_properties(${ZLIB_INSTALL_LIBRARIES} PROPERTIES OUTPUT_NAME z${SUFFIX}) endif() -if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) - install(TARGETS zlib zlibstatic - RUNTIME DESTINATION "${INSTALL_BIN_DIR}" - ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" - LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) +if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) + set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) + + if(ZLIB_COMPAT) + set(ZLIB_FULL_VERSION ${ZLIB_HEADER_VERSION}.zlib-ng) + set_target_properties(zlib PROPERTIES SOVERSION 1) + else() + set(ZLIB_FULL_VERSION ${ZLIBNG_HEADER_VERSION}) + set_target_properties(zlib PROPERTIES SOVERSION 2) + endif() + + if(NOT CYGWIN) + # This property causes shared libraries on Linux to have the full version + # encoded into their final filename. We disable this on Cygwin because + # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll + # seems to be the default. + # + # This has no effect with MSVC, on that platform the version info for + # the DLL comes from the resource file win32/zlib1.rc + set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION}) + endif() + + if(UNIX) + if(HAVE_NO_INTERPOSITION) + set_target_properties(zlib PROPERTIES COMPILE_FLAGS "-fno-semantic-interposition") + endif() + if(NOT APPLE) + set_target_properties(zlib PROPERTIES LINK_FLAGS + "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.map\"") + else() + # Match configure/make's behavior (i.e. don't use @rpath on mac). + set_target_properties(zlib PROPERTIES INSTALL_NAME_DIR "${LIB_INSTALL_DIR}") + endif() + elseif(MSYS) + # Suppress version number from shared library name + set(CMAKE_SHARED_LIBRARY_NAME_WITH_VERSION 0) + elseif(WIN32) + # Creates zlib1.dll when building shared library version + if(ZLIB_COMPAT) + set_target_properties(zlib PROPERTIES SUFFIX "1.dll") + else() + set_target_properties(zlib PROPERTIES SUFFIX "2.dll") + endif() + endif() endif() -if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) - install(FILES zlib${SUFFIX}.h DESTINATION "${INSTALL_INC_DIR}" RENAME zlib${SUFFIX}.h) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h DESTINATION "${INSTALL_INC_DIR}" RENAME zconf${SUFFIX}.h) + +if(HAVE_STDARG_H) + SET(ZCONF_STDARG_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */") +else() + SET(ZCONF_STDARG_LINE "#ifdef HAVE_STDARG_H /* may be set to #if 1 by configure/cmake/etc */") endif() -if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) - install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3" RENAME zlib${SUFFIX}.3) +if(HAVE_UNISTD_H) + SET(ZCONF_UNISTD_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */") +else() + SET(ZCONF_UNISTD_LINE "#ifdef HAVE_UNISTD_H /* may be set to #if 1 by configure/cmake/etc */") endif() -if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) - install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}") +if(NEED_PTRDIFF_T) + SET(ZCONF_PTRDIFF_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */") +else() + SET(ZCONF_PTRDIFF_LINE "#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by configure/cmake/etc */") +endif() + +set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.pc) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein + ${ZLIB_PC} @ONLY) +configure_file(${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein + ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h @ONLY) + +if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL) + install(TARGETS ${ZLIB_INSTALL_LIBRARIES} + RUNTIME DESTINATION "${BIN_INSTALL_DIR}" + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}") +endif() +if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL) + install(FILES zlib${SUFFIX}.h + DESTINATION "${INC_INSTALL_DIR}" RENAME zlib${SUFFIX}.h) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h + DESTINATION "${INC_INSTALL_DIR}" RENAME zconf${SUFFIX}.h) +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL) + install(FILES zlib.3 DESTINATION "${MAN_INSTALL_DIR}/man3" RENAME zlib${SUFFIX}.3) +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL) + install(FILES ${ZLIB_PC} DESTINATION "${PKGCONFIG_INSTALL_DIR}") endif() #============================================================================ @@ -805,33 +1017,115 @@ endif() #============================================================================ option(ZLIB_ENABLE_TESTS "Build test binaries" ON) -if (ZLIB_ENABLE_TESTS) +if(ZLIB_ENABLE_TESTS) enable_testing() macro(configure_test_executable target) - target_link_libraries(${target} zlib) + target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) if(NOT WITH_GZFILEOP) target_compile_definitions(${target} PUBLIC -DWITH_GZFILEOP) - target_sources(${target} PRIVATE ${ZLIB_GZFILE_SRCS}) + target_sources(${target} PRIVATE ${ZLIB_GZFILE_PRIVATE_HDRS} ${ZLIB_GZFILE_SRCS}) + endif() + if(ZLIB_DUAL_LINK) + find_package(ZLIB) + if(ZLIB_FOUND) + target_link_libraries(${target} ${ZLIB_LIBRARIES}) + endif() endif() endmacro() + add_executable(adler32_test test/adler32_test.c) + configure_test_executable(adler32_test) + target_link_libraries(adler32_test zlib) + + set(ADLER32TEST_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME adler32_test COMMAND ${ADLER32TEST_COMMAND}) + add_executable(example test/example.c) configure_test_executable(example) - add_test(NAME example COMMAND example${CMAKE_EXECUTABLE_SUFFIX}) + target_link_libraries(example zlib) + set(EXAMPLE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME example COMMAND ${EXAMPLE_COMMAND}) + + set(MINIGZIP_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) add_executable(minigzip test/minigzip.c) configure_test_executable(minigzip) - - if(HAVE_OFF64_T) - add_executable(example64 test/example.c) - configure_test_executable(example64) - set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") - add_test(NAME example64 COMMAND example64${CMAKE_EXECUTABLE_SUFFIX}) - - add_executable(minigzip64 test/minigzip.c) - configure_test_executable(minigzip64) - set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") + if(NOT DEFINED BUILD_SHARED_LIBS) + target_link_libraries(minigzip zlibstatic) + else() + target_link_libraries(minigzip zlib) endif() + if(BASEARCH_S360_FOUND) + if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE) + set_source_files_properties(test/minigzip.c PROPERTIES COMPILE_DEFINITIONS BUFLEN=262144) + endif() + endif() + + set(MINIDEFLATE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_executable(minideflate test/minideflate.c) + configure_test_executable(minideflate) + target_link_libraries(minideflate zlib) + + if(INSTALL_UTILS) + install(TARGETS minigzip minideflate + RUNTIME DESTINATION "${BIN_INSTALL_DIR}" + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}") + endif() + + set(SWITCHLEVELS_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_executable(switchlevels test/switchlevels.c) + configure_test_executable(switchlevels) + target_link_libraries(switchlevels zlib) + + add_executable(infcover test/infcover.c inftrees.c) + configure_test_executable(infcover) + target_link_libraries(infcover zlib) + + add_executable(makefixed tools/makefixed.c inftrees.c) + target_include_directories(makefixed PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + + set(MAKEFIXED_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME makefixed + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKEFIXED_COMMAND}" + -DOUTPUT=${CMAKE_CURRENT_SOURCE_DIR}/inffixed_tbl._h + -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/inffixed_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) + + add_executable(maketrees tools/maketrees.c trees.c zutil.c) + target_include_directories(maketrees PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + + set(MAKETREES_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME maketrees + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKETREES_COMMAND}" + -DOUTPUT=${CMAKE_CURRENT_SOURCE_DIR}/trees_tbl._h + -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/trees_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) + + add_executable(makecrct tools/makecrct.c) + target_include_directories(makecrct PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + + set(MAKECRCT_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME makecrct-crc32 + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKECRCT_COMMAND}" + -DOUTPUT=${CMAKE_CURRENT_SOURCE_DIR}/crc32_tbl._h + -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/crc32_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) + + set(MAKECRCT_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ -c) + add_test(NAME makecrct-crc32-combine + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKECRCT_COMMAND}" + -DOUTPUT=${CMAKE_CURRENT_SOURCE_DIR}/crc32_comb_tbl._h + -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/crc32_comb_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) if(WITH_FUZZERS) set(FUZZERS checksum compress example_small example_large example_flush example_dict minigzip) @@ -839,10 +1133,73 @@ if (ZLIB_ENABLE_TESTS) foreach(FUZZER ${FUZZERS}) add_executable(${FUZZER}_fuzzer test/fuzz/${FUZZER}_fuzzer.c test/fuzz/standalone_fuzz_target_runner.c) configure_test_executable(${FUZZER}_fuzzer) - add_test(${FUZZER}_fuzzer ${FUZZER}_fuzzer${CMAKE_EXECUTABLE_SUFFIX} ${ALL_SRC_FILES}) + target_link_libraries(${FUZZER}_fuzzer zlib) + set(FUZZER_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ ${ALL_SRC_FILES}) + add_test(NAME ${FUZZER}_fuzzer COMMAND ${FUZZER_COMMAND}) endforeach() endif() + macro(test_minigzip name path) + # Construct compression arguments for minigzip + set(compress_args -k -c) + foreach(extra_arg IN ITEMS "${ARGN}") + list(APPEND compress_args ${extra_arg}) + endforeach() + + # Create unique friendly string for test + string(REPLACE ";" "" arg_list "${ARGN}") + string(REPLACE " " "" arg_list "${arg_list}") + string(REPLACE "-" "" arg_list "${arg_list}") + + set(test_id minigzip-${name}-${arg_list}) + + if(NOT TEST ${test_id}) + add_test(NAME ${test_id} + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIGZIP_COMMAND}" + "-DCOMPRESS_ARGS=${compress_args}" + "-DDECOMPRESS_ARGS=-d;-c" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${path} + -DOUTPUT=${CMAKE_CURRENT_SOURCE_DIR}/${path}-${test_id}.gz + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + endif() + endmacro() + + set(TEST_CONFIGS + -R # Z_RLE + -h # Z_HUFFMAN_ONLY + -T # Direct store + -0 # No compression + -1 # Deflate quick + -4 # Deflate medium (lazy matches) + "-5;-F" # Deflate medium (Z_FIXED) + -6 # Deflate medium + -9 # Deflate slow + "-9;-f" # Deflate slow (Z_FILTERED) + ) + + file(GLOB_RECURSE TEST_FILE_PATHS + LIST_DIRECTORIES false + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/*) + + foreach(TEST_FILE_PATH ${TEST_FILE_PATHS}) + if("${TEST_FILE_PATH}" MATCHES ".gz$" OR "${TEST_FILE_PATH}" MATCHES ".out$" OR + "${TEST_FILE_PATH}" MATCHES "/.git/" OR "${TEST_FILE_PATH}" MATCHES ".md$") + continue() + endif() + foreach(TEST_CONFIG ${TEST_CONFIGS}) + get_filename_component(TEST_NAME ${TEST_FILE_PATH} NAME_WE) + if (TEST_NAME STREQUAL "") + continue() + endif() + test_minigzip(${TEST_NAME} ${TEST_FILE_PATH} ${TEST_CONFIG}) + endforeach() + endforeach() + + test_minigzip("detect-text" "test/data/lcet10.txt" -A) + test_minigzip("detect-binary" "test/data/paper-100k.pdf" -A) + set(CVES CVE-2002-0059 CVE-2004-0797 CVE-2005-1849 CVE-2005-2096) foreach(CVE ${CVES}) set(CVE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ -d) @@ -857,9 +1214,72 @@ if (ZLIB_ENABLE_TESTS) if(NOT WIN32 AND ZLIB_COMPAT) add_executable(CVE-2003-0107 test/CVE-2003-0107.c) target_link_libraries(CVE-2003-0107 zlib) - add_test(NAME CVE-2003-0107 COMMAND CVE-2003-0107) + set(CVE20030107_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME CVE-2003-0107 COMMAND ${CVE20030107_COMMAND}) endif() + + set(INFCOVER_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + add_test(NAME infcover COMMAND ${INFCOVER_COMMAND}) + + add_test(NAME GH-361 + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIGZIP_COMMAND}" + "-DCOMPRESS_ARGS=-c;-k;-4" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-361/test.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + + add_test(NAME GH-364 + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=1;5;9;3" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-364/test.bin + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + + add_test(NAME GH-382 + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIDEFLATE_COMMAND}" + "-DCOMPRESS_ARGS=-c;-m;1;-w;-15;-1;-s;4" + "-DDECOMPRESS_ARGS=-c;-d;-m;1;-w;-15" + -DGZIP_VERIFY=OFF + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-382/defneg3.dat + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + + add_test(NAME GH-536-segfault + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=6;9744;1;91207" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DCOMPARE=OFF + -DGZIP_VERIFY=OFF + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + + add_test(NAME GH-536-incomplete-read + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=6;88933;1;195840;2;45761" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DCOMPARE=OFF + -DGZIP_VERIFY=OFF + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + + add_test(NAME GH-536-zero-stored-block + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=6;15248;1;1050;2;25217" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DCOMPARE=OFF + -DGZIP_VERIFY=OFF + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + + add_test(NAME GH-751 + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIGZIP_COMMAND}" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-751/test.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) endif() -# FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES) - +FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES) diff --git a/libs/zlibng/ChangeLog.zlib b/libs/zlibng/ChangeLog.zlib deleted file mode 100644 index d38c0a842..000000000 --- a/libs/zlibng/ChangeLog.zlib +++ /dev/null @@ -1,1521 +0,0 @@ -## -# THIS IS AN UNMAINTAINED COPY OF THE ORIGINAL FILE DISTRIBUTED WITH ZLIB 1.2.9 -## - - - - - ChangeLog file for zlib - -Changes in 1.2.11 (15 Jan 2017) -- Fix deflate stored bug when pulling last block from window -- Permit immediate deflateParams changes before any deflate input - -Changes in 1.2.10 (2 Jan 2017) -- Avoid warnings on snprintf() return value -- Fix bug in deflate_stored() for zero-length input -- Fix bug in gzwrite.c that produced corrupt gzip files -- Remove files to be installed before copying them in Makefile.in -- Add warnings when compiling with assembler code - -Changes in 1.2.9 (31 Dec 2016) -- Fix contrib/minizip to permit unzipping with desktop API [Zouzou] -- Improve contrib/blast to return unused bytes -- Assure that gzoffset() is correct when appending -- Improve compress() and uncompress() to support large lengths -- Fix bug in test/example.c where error code not saved -- Remedy Coverity warning [Randers-Pehrson] -- Improve speed of gzprintf() in transparent mode -- Fix inflateInit2() bug when windowBits is 16 or 32 -- Change DEBUG macro to ZLIB_DEBUG -- Avoid uninitialized access by gzclose_w() -- Allow building zlib outside of the source directory -- Fix bug that accepted invalid zlib header when windowBits is zero -- Fix gzseek() problem on MinGW due to buggy _lseeki64 there -- Loop on write() calls in gzwrite.c in case of non-blocking I/O -- Add --warn (-w) option to ./configure for more compiler warnings -- Reject a window size of 256 bytes if not using the zlib wrapper -- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE -- Add --debug (-d) option to ./configure to define ZLIB_DEBUG -- Fix bugs in creating a very large gzip header -- Add uncompress2() function, which returns the input size used -- Assure that deflateParams() will not switch functions mid-block -- Dramatically speed up deflation for level 0 (storing) -- Add gzfread(), duplicating the interface of fread() -- Add gzfwrite(), duplicating the interface of fwrite() -- Add deflateGetDictionary() function -- Use snprintf() for later versions of Microsoft C -- Fix *Init macros to use z_ prefix when requested -- Replace as400 with os400 for OS/400 support [Monnerat] -- Add crc32_z() and adler32_z() functions with size_t lengths -- Update Visual Studio project files [AraHaan] - -Changes in 1.2.8 (28 Apr 2013) -- Update contrib/minizip/iowin32.c for Windows RT [Vollant] -- Do not force Z_CONST for C++ -- Clean up contrib/vstudio [Roß] -- Correct spelling error in zlib.h -- Fix mixed line endings in contrib/vstudio - -Changes in 1.2.7.3 (13 Apr 2013) -- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc - -Changes in 1.2.7.2 (13 Apr 2013) -- Change check for a four-byte type back to hexadecimal -- Fix typo in win32/Makefile.msc -- Add casts in gzwrite.c for pointer differences - -Changes in 1.2.7.1 (24 Mar 2013) -- Replace use of unsafe string functions with snprintf if available -- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] -- Fix gzgetc undefine when Z_PREFIX set [Turk] -- Eliminate use of mktemp in Makefile (not always available) -- Fix bug in 'F' mode for gzopen() -- Add inflateGetDictionary() function -- Correct comment in deflate.h -- Use _snprintf for snprintf in Microsoft C -- On Darwin, only use /usr/bin/libtool if libtool is not Apple -- Delete "--version" file if created by "ar --version" [Richard G.] -- Fix configure check for veracity of compiler error return codes -- Fix CMake compilation of static lib for MSVC2010 x64 -- Remove unused variable in infback9.c -- Fix argument checks in gzlog_compress() and gzlog_write() -- Clean up the usage of z_const and respect const usage within zlib -- Clean up examples/gzlog.[ch] comparisons of different types -- Avoid shift equal to bits in type (caused endless loop) -- Fix uninitialized value bug in gzputc() introduced by const patches -- Fix memory allocation error in examples/zran.c [Nor] -- Fix bug where gzopen(), gzclose() would write an empty file -- Fix bug in gzclose() when gzwrite() runs out of memory -- Check for input buffer malloc failure in examples/gzappend.c -- Add note to contrib/blast to use binary mode in stdio -- Fix comparisons of differently signed integers in contrib/blast -- Check for invalid code length codes in contrib/puff -- Fix serious but very rare decompression bug in inftrees.c -- Update inflateBack() comments, since inflate() can be faster -- Use underscored I/O function names for WINAPI_FAMILY -- Add _tr_flush_bits to the external symbols prefixed by --zprefix -- Add contrib/vstudio/vc10 pre-build step for static only -- Quote --version-script argument in CMakeLists.txt -- Don't specify --version-script on Apple platforms in CMakeLists.txt -- Fix casting error in contrib/testzlib/testzlib.c -- Fix types in contrib/minizip to match result of get_crc_table() -- Simplify contrib/vstudio/vc10 with 'd' suffix -- Add TOP support to win32/Makefile.msc -- Suport i686 and amd64 assembler builds in CMakeLists.txt -- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h -- Add vc11 and vc12 build files to contrib/vstudio -- Add gzvprintf() as an undocumented function in zlib -- Fix configure for Sun shell -- Remove runtime check in configure for four-byte integer type -- Add casts and consts to ease user conversion to C++ -- Add man pages for minizip and miniunzip -- In Makefile uninstall, don't rm if preceding cd fails -- Do not return Z_BUF_ERROR if deflateParam() has nothing to write - -Changes in 1.2.7 (2 May 2012) -- Replace use of memmove() with a simple copy for portability -- Test for existence of strerror -- Restore gzgetc_ for backward compatibility with 1.2.6 -- Fix build with non-GNU make on Solaris -- Require gcc 4.0 or later on Mac OS X to use the hidden attribute -- Include unistd.h for Watcom C -- Use __WATCOMC__ instead of __WATCOM__ -- Do not use the visibility attribute if NO_VIZ defined -- Improve the detection of no hidden visibility attribute -- Avoid using __int64 for gcc or solo compilation -- Cast to char * in gzprintf to avoid warnings [Zinser] -- Fix make_vms.com for VAX [Zinser] -- Don't use library or built-in byte swaps -- Simplify test and use of gcc hidden attribute -- Fix bug in gzclose_w() when gzwrite() fails to allocate memory -- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() -- Fix bug in test/minigzip.c for configure --solo -- Fix contrib/vstudio project link errors [Mohanathas] -- Add ability to choose the builder in make_vms.com [Schweda] -- Add DESTDIR support to mingw32 win32/Makefile.gcc -- Fix comments in win32/Makefile.gcc for proper usage -- Allow overriding the default install locations for cmake -- Generate and install the pkg-config file with cmake -- Build both a static and a shared version of zlib with cmake -- Include version symbols for cmake builds -- If using cmake with MSVC, add the source directory to the includes -- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] -- Move obsolete emx makefile to old [Truta] -- Allow the use of -Wundef when compiling or using zlib -- Avoid the use of the -u option with mktemp -- Improve inflate() documentation on the use of Z_FINISH -- Recognize clang as gcc -- Add gzopen_w() in Windows for wide character path names -- Rename zconf.h in CMakeLists.txt to move it out of the way -- Add source directory in CMakeLists.txt for building examples -- Look in build directory for zlib.pc in CMakeLists.txt -- Remove gzflags from zlibvc.def in vc9 and vc10 -- Fix contrib/minizip compilation in the MinGW environment -- Update ./configure for Solaris, support --64 [Mooney] -- Remove -R. from Solaris shared build (possible security issue) -- Avoid race condition for parallel make (-j) running example -- Fix type mismatch between get_crc_table() and crc_table -- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] -- Fix the path to zlib.map in CMakeLists.txt -- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] -- Add instructions to win32/Makefile.gcc for shared install [Torri] - -Changes in 1.2.6.1 (12 Feb 2012) -- Avoid the use of the Objective-C reserved name "id" -- Include io.h in gzguts.h for Microsoft compilers -- Fix problem with ./configure --prefix and gzgetc macro -- Include gz_header definition when compiling zlib solo -- Put gzflags() functionality back in zutil.c -- Avoid library header include in crc32.c for Z_SOLO -- Use name in GCC_CLASSIC as C compiler for coverage testing, if set -- Minor cleanup in contrib/minizip/zip.c [Vollant] -- Update make_vms.com [Zinser] -- Remove unnecessary gzgetc_ function -- Use optimized byte swap operations for Microsoft and GNU [Snyder] -- Fix minor typo in zlib.h comments [Rzesniowiecki] - -Changes in 1.2.6 (29 Jan 2012) -- Update the Pascal interface in contrib/pascal -- Fix function numbers for gzgetc_ in zlibvc.def files -- Fix configure.ac for contrib/minizip [Schiffer] -- Fix large-entry detection in minizip on 64-bit systems [Schiffer] -- Have ./configure use the compiler return code for error indication -- Fix CMakeLists.txt for cross compilation [McClure] -- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] -- Fix compilation of contrib/minizip on FreeBSD [Marquez] -- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] -- Include io.h for Turbo C / Borland C on all platforms [Truta] -- Make version explicit in contrib/minizip/configure.ac [Bosmans] -- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] -- Minor cleanup up contrib/minizip/unzip.c [Vollant] -- Fix bug when compiling minizip with C++ [Vollant] -- Protect for long name and extra fields in contrib/minizip [Vollant] -- Avoid some warnings in contrib/minizip [Vollant] -- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip -- Add missing libs to minizip linker command -- Add support for VPATH builds in contrib/minizip -- Add an --enable-demos option to contrib/minizip/configure -- Add the generation of configure.log by ./configure -- Exit when required parameters not provided to win32/Makefile.gcc -- Have gzputc return the character written instead of the argument -- Use the -m option on ldconfig for BSD systems [Tobias] -- Correct in zlib.map when deflateResetKeep was added - -Changes in 1.2.5.3 (15 Jan 2012) -- Restore gzgetc function for binary compatibility -- Do not use _lseeki64 under Borland C++ [Truta] -- Update win32/Makefile.msc to build test/*.c [Truta] -- Remove old/visualc6 given CMakefile and other alternatives -- Update AS400 build files and documentation [Monnerat] -- Update win32/Makefile.gcc to build test/*.c [Truta] -- Permit stronger flushes after Z_BLOCK flushes -- Avoid extraneous empty blocks when doing empty flushes -- Permit Z_NULL arguments to deflatePending -- Allow deflatePrime() to insert bits in the middle of a stream -- Remove second empty static block for Z_PARTIAL_FLUSH -- Write out all of the available bits when using Z_BLOCK -- Insert the first two strings in the hash table after a flush - -Changes in 1.2.5.2 (17 Dec 2011) -- fix ld error: unable to find version dependency 'ZLIB_1.2.5' -- use relative symlinks for shared libs -- Avoid searching past window for Z_RLE strategy -- Assure that high-water mark initialization is always applied in deflate -- Add assertions to fill_window() in deflate.c to match comments -- Update python link in README -- Correct spelling error in gzread.c -- Fix bug in gzgets() for a concatenated empty gzip stream -- Correct error in comment for gz_make() -- Change gzread() and related to ignore junk after gzip streams -- Allow gzread() and related to continue after gzclearerr() -- Allow gzrewind() and gzseek() after a premature end-of-file -- Simplify gzseek() now that raw after gzip is ignored -- Change gzgetc() to a macro for speed (~40% speedup in testing) -- Fix gzclose() to return the actual error last encountered -- Always add large file support for windows -- Include zconf.h for windows large file support -- Include zconf.h.cmakein for windows large file support -- Update zconf.h.cmakein on make distclean -- Merge vestigial vsnprintf determination from zutil.h to gzguts.h -- Clarify how gzopen() appends in zlib.h comments -- Correct documentation of gzdirect() since junk at end now ignored -- Add a transparent write mode to gzopen() when 'T' is in the mode -- Update python link in zlib man page -- Get inffixed.h and MAKEFIXED result to match -- Add a ./config --solo option to make zlib subset with no library use -- Add undocumented inflateResetKeep() function for CAB file decoding -- Add --cover option to ./configure for gcc coverage testing -- Add #define ZLIB_CONST option to use const in the z_stream interface -- Add comment to gzdopen() in zlib.h to use dup() when using fileno() -- Note behavior of uncompress() to provide as much data as it can -- Add files in contrib/minizip to aid in building libminizip -- Split off AR options in Makefile.in and configure -- Change ON macro to Z_ARG to avoid application conflicts -- Facilitate compilation with Borland C++ for pragmas and vsnprintf -- Include io.h for Turbo C / Borland C++ -- Move example.c and minigzip.c to test/ -- Simplify incomplete code table filling in inflate_table() -- Remove code from inflate.c and infback.c that is impossible to execute -- Test the inflate code with full coverage -- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) -- Add deflateResetKeep and fix inflateResetKeep to retain dictionary -- Fix gzwrite.c to accommodate reduced memory zlib compilation -- Have inflate() with Z_FINISH avoid the allocation of a window -- Do not set strm->adler when doing raw inflate -- Fix gzeof() to behave just like feof() when read is not past end of file -- Fix bug in gzread.c when end-of-file is reached -- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF -- Document gzread() capability to read concurrently written files -- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] - -Changes in 1.2.5.1 (10 Sep 2011) -- Update FAQ entry on shared builds (#13) -- Avoid symbolic argument to chmod in Makefile.in -- Fix bug and add consts in contrib/puff [Oberhumer] -- Update contrib/puff/zeros.raw test file to have all block types -- Add full coverage test for puff in contrib/puff/Makefile -- Fix static-only-build install in Makefile.in -- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] -- Add libz.a dependency to shared in Makefile.in for parallel builds -- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out -- Replace $(...) with `...` in configure for non-bash sh [Bowler] -- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] -- Add solaris* to Linux* in configure to allow gcc use [Groffen] -- Add *bsd* to Linux* case in configure [Bar-Lev] -- Add inffast.obj to dependencies in win32/Makefile.msc -- Correct spelling error in deflate.h [Kohler] -- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc -- Add test to configure for GNU C looking for gcc in output of $cc -v -- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] -- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not -- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense -- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) -- Make stronger test in zconf.h to include unistd.h for LFS -- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] -- Fix zlib.h LFS support when Z_PREFIX used -- Add updated as400 support (removed from old) [Monnerat] -- Avoid deflate sensitivity to volatile input data -- Avoid division in adler32_combine for NO_DIVIDE -- Clarify the use of Z_FINISH with deflateBound() amount of space -- Set binary for output file in puff.c -- Use u4 type for crc_table to avoid conversion warnings -- Apply casts in zlib.h to avoid conversion warnings -- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] -- Improve inflateSync() documentation to note indeterminancy -- Add deflatePending() function to return the amount of pending output -- Correct the spelling of "specification" in FAQ [Randers-Pehrson] -- Add a check in configure for stdarg.h, use for gzprintf() -- Check that pointers fit in ints when gzprint() compiled old style -- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] -- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] -- Add debug records in assmebler code [Londer] -- Update RFC references to use http://tools.ietf.org/html/... [Li] -- Add --archs option, use of libtool to configure for Mac OS X [Borstel] - -Changes in 1.2.5 (19 Apr 2010) -- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] -- Default to libdir as sharedlibdir in configure [Nieder] -- Update copyright dates on modified source files -- Update trees.c to be able to generate modified trees.h -- Exit configure for MinGW, suggesting win32/Makefile.gcc -- Check for NULL path in gz_open [Homurlu] - -Changes in 1.2.4.5 (18 Apr 2010) -- Set sharedlibdir in configure [Torok] -- Set LDFLAGS in Makefile.in [Bar-Lev] -- Avoid mkdir objs race condition in Makefile.in [Bowler] -- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays -- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C -- Don't use hidden attribute when it is a warning generator (e.g. Solaris) - -Changes in 1.2.4.4 (18 Apr 2010) -- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] -- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty -- Try to use bash or ksh regardless of functionality of /bin/sh -- Fix configure incompatibility with NetBSD sh -- Remove attempt to run under bash or ksh since have better NetBSD fix -- Fix win32/Makefile.gcc for MinGW [Bar-Lev] -- Add diagnostic messages when using CROSS_PREFIX in configure -- Added --sharedlibdir option to configure [Weigelt] -- Use hidden visibility attribute when available [Frysinger] - -Changes in 1.2.4.3 (10 Apr 2010) -- Only use CROSS_PREFIX in configure for ar and ranlib if they exist -- Use CROSS_PREFIX for nm [Bar-Lev] -- Assume _LARGEFILE64_SOURCE defined is equivalent to true -- Avoid use of undefined symbols in #if with && and || -- Make *64 prototypes in gzguts.h consistent with functions -- Add -shared load option for MinGW in configure [Bowler] -- Move z_off64_t to public interface, use instead of off64_t -- Remove ! from shell test in configure (not portable to Solaris) -- Change +0 macro tests to -0 for possibly increased portability - -Changes in 1.2.4.2 (9 Apr 2010) -- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 -- Really provide prototypes for *64 functions when building without LFS -- Only define unlink() in minigzip.c if unistd.h not included -- Update README to point to contrib/vstudio project files -- Move projects/vc6 to old/ and remove projects/ -- Include stdlib.h in minigzip.c for setmode() definition under WinCE -- Clean up assembler builds in win32/Makefile.msc [Rowe] -- Include sys/types.h for Microsoft for off_t definition -- Fix memory leak on error in gz_open() -- Symbolize nm as $NM in configure [Weigelt] -- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] -- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined -- Fix bug in gzeof() to take into account unused input data -- Avoid initialization of structures with variables in puff.c -- Updated win32/README-WIN32.txt [Rowe] - -Changes in 1.2.4.1 (28 Mar 2010) -- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] -- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] -- Restore "for debugging" comment on sprintf() in gzlib.c -- Remove fdopen for MVS from gzguts.h -- Put new README-WIN32.txt in win32 [Rowe] -- Add check for shell to configure and invoke another shell if needed -- Fix big fat stinking bug in gzseek() on uncompressed files -- Remove vestigial F_OPEN64 define in zutil.h -- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE -- Avoid errors on non-LFS systems when applications define LFS macros -- Set EXE to ".exe" in configure for MINGW [Kahle] -- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] -- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] -- Add DLL install in win32/makefile.gcc [Bar-Lev] -- Allow Linux* or linux* from uname in configure [Bar-Lev] -- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] -- Add cross-compilation prefixes to configure [Bar-Lev] -- Match type exactly in gz_load() invocation in gzread.c -- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func -- Provide prototypes for *64 functions when building zlib without LFS -- Don't use -lc when linking shared library on MinGW -- Remove errno.h check in configure and vestigial errno code in zutil.h - -Changes in 1.2.4 (14 Mar 2010) -- Fix VER3 extraction in configure for no fourth subversion -- Update zlib.3, add docs to Makefile.in to make .pdf out of it -- Add zlib.3.pdf to distribution -- Don't set error code in gzerror() if passed pointer is NULL -- Apply destination directory fixes to CMakeLists.txt [Lowman] -- Move #cmakedefine's to a new zconf.in.cmakein -- Restore zconf.h for builds that don't use configure or cmake -- Add distclean to dummy Makefile for convenience -- Update and improve INDEX, README, and FAQ -- Update CMakeLists.txt for the return of zconf.h [Lowman] -- Update contrib/vstudio/vc9 and vc10 [Vollant] -- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc -- Apply license and readme changes to contrib/asm686 [Raiter] -- Check file name lengths and add -c option in minigzip.c [Li] -- Update contrib/amd64 and contrib/masmx86/ [Vollant] -- Avoid use of "eof" parameter in trees.c to not shadow library variable -- Update make_vms.com for removal of zlibdefs.h [Zinser] -- Update assembler code and vstudio projects in contrib [Vollant] -- Remove outdated assembler code contrib/masm686 and contrib/asm586 -- Remove old vc7 and vc8 from contrib/vstudio -- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] -- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() -- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] -- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) -- Fix bug in void-returning vsprintf() case in gzwrite.c -- Fix name change from inflate.h in contrib/inflate86/inffas86.c -- Check if temporary file exists before removing in make_vms.com [Zinser] -- Fix make install and uninstall for --static option -- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] -- Update readme.txt in contrib/masmx64 and masmx86 to assemble - -Changes in 1.2.3.9 (21 Feb 2010) -- Expunge gzio.c -- Move as400 build information to old -- Fix updates in contrib/minizip and contrib/vstudio -- Add const to vsnprintf test in configure to avoid warnings [Weigelt] -- Delete zconf.h (made by configure) [Weigelt] -- Change zconf.in.h to zconf.h.in per convention [Weigelt] -- Check for NULL buf in gzgets() -- Return empty string for gzgets() with len == 1 (like fgets()) -- Fix description of gzgets() in zlib.h for end-of-file, NULL return -- Update minizip to 1.1 [Vollant] -- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c -- Note in zlib.h that gzerror() should be used to distinguish from EOF -- Remove use of snprintf() from gzlib.c -- Fix bug in gzseek() -- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] -- Fix zconf.h generation in CMakeLists.txt [Lowman] -- Improve comments in zconf.h where modified by configure - -Changes in 1.2.3.8 (13 Feb 2010) -- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] -- Use z_off64_t in gz_zero() and gz_skip() to match state->skip -- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) -- Revert to Makefile.in from 1.2.3.6 (live with the clutter) -- Fix missing error return in gzflush(), add zlib.h note -- Add *64 functions to zlib.map [Levin] -- Fix signed/unsigned comparison in gz_comp() -- Use SFLAGS when testing shared linking in configure -- Add --64 option to ./configure to use -m64 with gcc -- Fix ./configure --help to correctly name options -- Have make fail if a test fails [Levin] -- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] -- Remove assembler object files from contrib - -Changes in 1.2.3.7 (24 Jan 2010) -- Always gzopen() with O_LARGEFILE if available -- Fix gzdirect() to work immediately after gzopen() or gzdopen() -- Make gzdirect() more precise when the state changes while reading -- Improve zlib.h documentation in many places -- Catch memory allocation failure in gz_open() -- Complete close operation if seek forward in gzclose_w() fails -- Return Z_ERRNO from gzclose_r() if close() fails -- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL -- Return zero for gzwrite() errors to match zlib.h description -- Return -1 on gzputs() error to match zlib.h description -- Add zconf.in.h to allow recovery from configure modification [Weigelt] -- Fix static library permissions in Makefile.in [Weigelt] -- Avoid warnings in configure tests that hide functionality [Weigelt] -- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] -- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] -- Avoid access of uninitialized data for first inflateReset2 call [Gomes] -- Keep object files in subdirectories to reduce the clutter somewhat -- Remove default Makefile and zlibdefs.h, add dummy Makefile -- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ -- Remove zlibdefs.h completely -- modify zconf.h instead - -Changes in 1.2.3.6 (17 Jan 2010) -- Avoid void * arithmetic in gzread.c and gzwrite.c -- Make compilers happier with const char * for gz_error message -- Avoid unused parameter warning in inflate.c -- Avoid signed-unsigned comparison warning in inflate.c -- Indent #pragma's for traditional C -- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() -- Correct email address in configure for system options -- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] -- Update zlib.map [Brown] -- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] -- Apply various fixes to CMakeLists.txt [Lowman] -- Add checks on len in gzread() and gzwrite() -- Add error message for no more room for gzungetc() -- Remove zlib version check in gzwrite() -- Defer compression of gzprintf() result until need to -- Use snprintf() in gzdopen() if available -- Remove USE_MMAP configuration determination (only used by minigzip) -- Remove examples/pigz.c (available separately) -- Update examples/gun.c to 1.6 - -Changes in 1.2.3.5 (8 Jan 2010) -- Add space after #if in zutil.h for some compilers -- Fix relatively harmless bug in deflate_fast() [Exarevsky] -- Fix same problem in deflate_slow() -- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] -- Add deflate_rle() for faster Z_RLE strategy run-length encoding -- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding -- Change name of "write" variable in inffast.c to avoid library collisions -- Fix premature EOF from gzread() in gzio.c [Brown] -- Use zlib header window size if windowBits is 0 in inflateInit2() -- Remove compressBound() call in deflate.c to avoid linking compress.o -- Replace use of errno in gz* with functions, support WinCE [Alves] -- Provide alternative to perror() in minigzip.c for WinCE [Alves] -- Don't use _vsnprintf on later versions of MSVC [Lowman] -- Add CMake build script and input file [Lowman] -- Update contrib/minizip to 1.1 [Svensson, Vollant] -- Moved nintendods directory from contrib to . -- Replace gzio.c with a new set of routines with the same functionality -- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above -- Update contrib/minizip to 1.1b -- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h - -Changes in 1.2.3.4 (21 Dec 2009) -- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility -- Update comments in configure and Makefile.in for default --shared -- Fix test -z's in configure [Marquess] -- Build examplesh and minigzipsh when not testing -- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h -- Import LDFLAGS from the environment in configure -- Fix configure to populate SFLAGS with discovered CFLAGS options -- Adapt make_vms.com to the new Makefile.in [Zinser] -- Add zlib2ansi script for C++ compilation [Marquess] -- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) -- Add AMD64 assembler code for longest match to contrib [Teterin] -- Include options from $SFLAGS when doing $LDSHARED -- Simplify 64-bit file support by introducing z_off64_t type -- Make shared object files in objs directory to work around old Sun cc -- Use only three-part version number for Darwin shared compiles -- Add rc option to ar in Makefile.in for when ./configure not run -- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* -- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile -- Protect against _FILE_OFFSET_BITS being defined when compiling zlib -- Rename Makefile.in targets allstatic to static and allshared to shared -- Fix static and shared Makefile.in targets to be independent -- Correct error return bug in gz_open() by setting state [Brown] -- Put spaces before ;;'s in configure for better sh compatibility -- Add pigz.c (parallel implementation of gzip) to examples/ -- Correct constant in crc32.c to UL [Leventhal] -- Reject negative lengths in crc32_combine() -- Add inflateReset2() function to work like inflateEnd()/inflateInit2() -- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] -- Correct typo in doc/algorithm.txt [Janik] -- Fix bug in adler32_combine() [Zhu] -- Catch missing-end-of-block-code error in all inflates and in puff - Assures that random input to inflate eventually results in an error -- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ -- Update ENOUGH and its usage to reflect discovered bounds -- Fix gzerror() error report on empty input file [Brown] -- Add ush casts in trees.c to avoid pedantic runtime errors -- Fix typo in zlib.h uncompress() description [Reiss] -- Correct inflate() comments with regard to automatic header detection -- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) -- Put new version of gzlog (2.0) in examples with interruption recovery -- Add puff compile option to permit invalid distance-too-far streams -- Add puff TEST command options, ability to read piped input -- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but - _LARGEFILE64_SOURCE not defined -- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart -- Fix deflateSetDictionary() to use all 32K for output consistency -- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) -- Clear bytes after deflate lookahead to avoid use of uninitialized data -- Change a limit in inftrees.c to be more transparent to Coverity Prevent -- Update win32/zlib.def with exported symbols from zlib.h -- Correct spelling errors in zlib.h [Willem, Sobrado] -- Allow Z_BLOCK for deflate() to force a new block -- Allow negative bits in inflatePrime() to delete existing bit buffer -- Add Z_TREES flush option to inflate() to return at end of trees -- Add inflateMark() to return current state information for random access -- Add Makefile for NintendoDS to contrib [Costa] -- Add -w in configure compile tests to avoid spurious warnings [Beucler] -- Fix typos in zlib.h comments for deflateSetDictionary() -- Fix EOF detection in transparent gzread() [Maier] - -Changes in 1.2.3.3 (2 October 2006) -- Make --shared the default for configure, add a --static option -- Add compile option to permit invalid distance-too-far streams -- Add inflateUndermine() function which is required to enable above -- Remove use of "this" variable name for C++ compatibility [Marquess] -- Add testing of shared library in make test, if shared library built -- Use ftello() and fseeko() if available instead of ftell() and fseek() -- Provide two versions of all functions that use the z_off_t type for - binary compatibility -- a normal version and a 64-bit offset version, - per the Large File Support Extension when _LARGEFILE64_SOURCE is - defined; use the 64-bit versions by default when _FILE_OFFSET_BITS - is defined to be 64 -- Add a --uname= option to configure to perhaps help with cross-compiling - -Changes in 1.2.3.2 (3 September 2006) -- Turn off silly Borland warnings [Hay] -- Use off64_t and define _LARGEFILE64_SOURCE when present -- Fix missing dependency on inffixed.h in Makefile.in -- Rig configure --shared to build both shared and static [Teredesai, Truta] -- Remove zconf.in.h and instead create a new zlibdefs.h file -- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] -- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] - -Changes in 1.2.3.1 (16 August 2006) -- Add watcom directory with OpenWatcom make files [Daniel] -- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] -- Update make_vms.com [Zinser] -- Use -fPIC for shared build in configure [Teredesai, Nicholson] -- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] -- Use fdopen() (not _fdopen()) for Interix in zutil.h [Bäck] -- Add some FAQ entries about the contrib directory -- Update the MVS question in the FAQ -- Avoid extraneous reads after EOF in gzio.c [Brown] -- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] -- Add comments to zlib.h about gzerror() usage [Brown] -- Set extra flags in gzip header in gzopen() like deflate() does -- Make configure options more compatible with double-dash conventions - [Weigelt] -- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] -- Fix uninstall target in Makefile.in [Truta] -- Add pkgconfig support [Weigelt] -- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] -- Replace set_data_type() with a more accurate detect_data_type() in - trees.c, according to the txtvsbin.txt document [Truta] -- Swap the order of #include and #include "zlib.h" in - gzio.c, example.c and minigzip.c [Truta] -- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, - Truta] (where?) -- Fix target "clean" from win32/Makefile.bor [Truta] -- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] -- Update zlib www home address in win32/DLL_FAQ.txt [Truta] -- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] -- Enable browse info in the "Debug" and "ASM Debug" configurations in - the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] -- Add pkgconfig support [Weigelt] -- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, - for use in win32/zlib1.rc [Polushin, Rowe, Truta] -- Add a document that explains the new text detection scheme to - doc/txtvsbin.txt [Truta] -- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] -- Move algorithm.txt into doc/ [Truta] -- Synchronize FAQ with website -- Fix compressBound(), was low for some pathological cases [Fearnley] -- Take into account wrapper variations in deflateBound() -- Set examples/zpipe.c input and output to binary mode for Windows -- Update examples/zlib_how.html with new zpipe.c (also web site) -- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems - that gcc became pickier in 4.0) -- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain - un-versioned, the patch adds versioning only for symbols introduced in - zlib-1.2.0 or later. It also declares as local those symbols which are - not designed to be exported." [Levin] -- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure -- Do not initialize global static by default in trees.c, add a response - NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] -- Don't use strerror() in gzio.c under WinCE [Yakimov] -- Don't use errno.h in zutil.h under WinCE [Yakimov] -- Move arguments for AR to its usage to allow replacing ar [Marot] -- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] -- Improve inflateInit() and inflateInit2() documentation -- Fix structure size comment in inflate.h -- Change configure help option from --h* to --help [Santos] - -Changes in 1.2.3 (18 July 2005) -- Apply security vulnerability fixes to contrib/infback9 as well -- Clean up some text files (carriage returns, trailing space) -- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] - -Changes in 1.2.2.4 (11 July 2005) -- Add inflatePrime() function for starting inflation at bit boundary -- Avoid some Visual C warnings in deflate.c -- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit - compile -- Fix some spelling errors in comments [Betts] -- Correct inflateInit2() error return documentation in zlib.h -- Add zran.c example of compressed data random access to examples - directory, shows use of inflatePrime() -- Fix cast for assignments to strm->state in inflate.c and infback.c -- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] -- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] -- Add cast in trees.c t avoid a warning [Oberhumer] -- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] -- Update make_vms.com [Zinser] -- Initialize state->write in inflateReset() since copied in inflate_fast() -- Be more strict on incomplete code sets in inflate_table() and increase - ENOUGH and MAXD -- this repairs a possible security vulnerability for - invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for - discovering the vulnerability and providing test cases. -- Add ia64 support to configure for HP-UX [Smith] -- Add error return to gzread() for format or i/o error [Levin] -- Use malloc.h for OS/2 [Necasek] - -Changes in 1.2.2.3 (27 May 2005) -- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile -- Typecast fread() return values in gzio.c [Vollant] -- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) -- Fix crc check bug in gzread() after gzungetc() [Heiner] -- Add the deflateTune() function to adjust internal compression parameters -- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) -- Remove an incorrect assertion in examples/zpipe.c -- Add C++ wrapper in infback9.h [Donais] -- Fix bug in inflateCopy() when decoding fixed codes -- Note in zlib.h how much deflateSetDictionary() actually uses -- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) -- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] -- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] -- Add gzdirect() function to indicate transparent reads -- Update contrib/minizip [Vollant] -- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] -- Add casts in crc32.c to avoid warnings [Oberhumer] -- Add contrib/masmx64 [Vollant] -- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] - -Changes in 1.2.2.2 (30 December 2004) -- Replace structure assignments in deflate.c and inflate.c with zmemcpy to - avoid implicit memcpy calls (portability for no-library compilation) -- Increase sprintf() buffer size in gzdopen() to allow for large numbers -- Add INFLATE_STRICT to check distances against zlib header -- Improve WinCE errno handling and comments [Chang] -- Remove comment about no gzip header processing in FAQ -- Add Z_FIXED strategy option to deflateInit2() to force fixed trees -- Add updated make_vms.com [Coghlan], update README -- Create a new "examples" directory, move gzappend.c there, add zpipe.c, - fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. -- Add FAQ entry and comments in deflate.c on uninitialized memory access -- Add Solaris 9 make options in configure [Gilbert] -- Allow strerror() usage in gzio.c for STDC -- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] -- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] -- Use z_off_t for adler32_combine() and crc32_combine() lengths -- Make adler32() much faster for small len -- Use OS_CODE in deflate() default gzip header - -Changes in 1.2.2.1 (31 October 2004) -- Allow inflateSetDictionary() call for raw inflate -- Fix inflate header crc check bug for file names and comments -- Add deflateSetHeader() and gz_header structure for custom gzip headers -- Add inflateGetheader() to retrieve gzip headers -- Add crc32_combine() and adler32_combine() functions -- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list -- Use zstreamp consistently in zlib.h (inflate_back functions) -- Remove GUNZIP condition from definition of inflate_mode in inflate.h - and in contrib/inflate86/inffast.S [Truta, Anderson] -- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] -- Update projects/README.projects and projects/visualc6 [Truta] -- Update win32/DLL_FAQ.txt [Truta] -- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] -- Deprecate Z_ASCII; use Z_TEXT instead [Truta] -- Use a new algorithm for setting strm->data_type in trees.c [Truta] -- Do not define an exit() prototype in zutil.c unless DEBUG defined -- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] -- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() -- Fix Darwin build version identification [Peterson] - -Changes in 1.2.2 (3 October 2004) -- Update zlib.h comments on gzip in-memory processing -- Set adler to 1 in inflateReset() to support Java test suite [Walles] -- Add contrib/dotzlib [Ravn] -- Update win32/DLL_FAQ.txt [Truta] -- Update contrib/minizip [Vollant] -- Move contrib/visual-basic.txt to old/ [Truta] -- Fix assembler builds in projects/visualc6/ [Truta] - -Changes in 1.2.1.2 (9 September 2004) -- Update INDEX file -- Fix trees.c to update strm->data_type (no one ever noticed!) -- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] -- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) -- Add limited multitasking protection to DYNAMIC_CRC_TABLE -- Add NO_vsnprintf for VMS in zutil.h [Mozilla] -- Don't declare strerror() under VMS [Mozilla] -- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize -- Update contrib/ada [Anisimkov] -- Update contrib/minizip [Vollant] -- Fix configure to not hardcode directories for Darwin [Peterson] -- Fix gzio.c to not return error on empty files [Brown] -- Fix indentation; update version in contrib/delphi/ZLib.pas and - contrib/pascal/zlibpas.pas [Truta] -- Update mkasm.bat in contrib/masmx86 [Truta] -- Update contrib/untgz [Truta] -- Add projects/README.projects [Truta] -- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] -- Update win32/DLL_FAQ.txt [Truta] -- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] -- Remove an unnecessary assignment to curr in inftrees.c [Truta] -- Add OS/2 to exe builds in configure [Poltorak] -- Remove err dummy parameter in zlib.h [Kientzle] - -Changes in 1.2.1.1 (9 January 2004) -- Update email address in README -- Several FAQ updates -- Fix a big fat bug in inftrees.c that prevented decoding valid - dynamic blocks with only literals and no distance codes -- - Thanks to "Hot Emu" for the bug report and sample file -- Add a note to puff.c on no distance codes case. - -Changes in 1.2.1 (17 November 2003) -- Remove a tab in contrib/gzappend/gzappend.c -- Update some interfaces in contrib for new zlib functions -- Update zlib version number in some contrib entries -- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] -- Support shared libraries on Hurd and KFreeBSD [Brown] -- Fix error in NO_DIVIDE option of adler32.c - -Changes in 1.2.0.8 (4 November 2003) -- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas -- Add experimental NO_DIVIDE #define in adler32.c - - Possibly faster on some processors (let me know if it is) -- Correct Z_BLOCK to not return on first inflate call if no wrap -- Fix strm->data_type on inflate() return to correctly indicate EOB -- Add deflatePrime() function for appending in the middle of a byte -- Add contrib/gzappend for an example of appending to a stream -- Update win32/DLL_FAQ.txt [Truta] -- Delete Turbo C comment in README [Truta] -- Improve some indentation in zconf.h [Truta] -- Fix infinite loop on bad input in configure script [Church] -- Fix gzeof() for concatenated gzip files [Johnson] -- Add example to contrib/visual-basic.txt [Michael B.] -- Add -p to mkdir's in Makefile.in [vda] -- Fix configure to properly detect presence or lack of printf functions -- Add AS400 support [Monnerat] -- Add a little Cygwin support [Wilson] - -Changes in 1.2.0.7 (21 September 2003) -- Correct some debug formats in contrib/infback9 -- Cast a type in a debug statement in trees.c -- Change search and replace delimiter in configure from % to # [Beebe] -- Update contrib/untgz to 0.2 with various fixes [Truta] -- Add build support for Amiga [Nikl] -- Remove some directories in old that have been updated to 1.2 -- Add dylib building for Mac OS X in configure and Makefile.in -- Remove old distribution stuff from Makefile -- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X -- Update links in README - -Changes in 1.2.0.6 (13 September 2003) -- Minor FAQ updates -- Update contrib/minizip to 1.00 [Vollant] -- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] -- Update POSTINC comment for 68060 [Nikl] -- Add contrib/infback9 with deflate64 decoding (unsupported) -- For MVS define NO_vsnprintf and undefine FAR [van Burik] -- Add pragma for fdopen on MVS [van Burik] - -Changes in 1.2.0.5 (8 September 2003) -- Add OF to inflateBackEnd() declaration in zlib.h -- Remember start when using gzdopen in the middle of a file -- Use internal off_t counters in gz* functions to properly handle seeks -- Perform more rigorous check for distance-too-far in inffast.c -- Add Z_BLOCK flush option to return from inflate at block boundary -- Set strm->data_type on return from inflate - - Indicate bits unused, if at block boundary, and if in last block -- Replace size_t with ptrdiff_t in crc32.c, and check for correct size -- Add condition so old NO_DEFLATE define still works for compatibility -- FAQ update regarding the Windows DLL [Truta] -- INDEX update: add qnx entry, remove aix entry [Truta] -- Install zlib.3 into mandir [Wilson] -- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] -- Adapt the zlib interface to the new DLL convention guidelines [Truta] -- Introduce ZLIB_WINAPI macro to allow the export of functions using - the WINAPI calling convention, for Visual Basic [Vollant, Truta] -- Update msdos and win32 scripts and makefiles [Truta] -- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] -- Add contrib/ada [Anisimkov] -- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] -- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] -- Add contrib/masm686 [Truta] -- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm - [Truta, Vollant] -- Update contrib/delphi; rename to contrib/pascal; add example [Truta] -- Remove contrib/delphi2; add a new contrib/delphi [Truta] -- Avoid inclusion of the nonstandard in contrib/iostream, - and fix some method prototypes [Truta] -- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip - [Truta] -- Avoid the use of backslash (\) in contrib/minizip [Vollant] -- Fix file time handling in contrib/untgz; update makefiles [Truta] -- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines - [Vollant] -- Remove contrib/vstudio/vc15_16 [Vollant] -- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] -- Update README.contrib [Truta] -- Invert the assignment order of match_head and s->prev[...] in - INSERT_STRING [Truta] -- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings - [Truta] -- Compare function pointers with 0, not with NULL or Z_NULL [Truta] -- Fix prototype of syncsearch in inflate.c [Truta] -- Introduce ASMINF macro to be enabled when using an ASM implementation - of inflate_fast [Truta] -- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] -- Modify test_gzio in example.c to take a single file name as a - parameter [Truta] -- Exit the example.c program if gzopen fails [Truta] -- Add type casts around strlen in example.c [Truta] -- Remove casting to sizeof in minigzip.c; give a proper type - to the variable compared with SUFFIX_LEN [Truta] -- Update definitions of STDC and STDC99 in zconf.h [Truta] -- Synchronize zconf.h with the new Windows DLL interface [Truta] -- Use SYS16BIT instead of __32BIT__ to distinguish between - 16- and 32-bit platforms [Truta] -- Use far memory allocators in small 16-bit memory models for - Turbo C [Truta] -- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in - zlibCompileFlags [Truta] -- Cygwin has vsnprintf [Wilson] -- In Windows16, OS_CODE is 0, as in MSDOS [Truta] -- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] - -Changes in 1.2.0.4 (10 August 2003) -- Minor FAQ updates -- Be more strict when checking inflateInit2's windowBits parameter -- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well -- Add gzip wrapper option to deflateInit2 using windowBits -- Add updated QNX rule in configure and qnx directory [Bonnefoy] -- Make inflate distance-too-far checks more rigorous -- Clean up FAR usage in inflate -- Add casting to sizeof() in gzio.c and minigzip.c - -Changes in 1.2.0.3 (19 July 2003) -- Fix silly error in gzungetc() implementation [Vollant] -- Update contrib/minizip and contrib/vstudio [Vollant] -- Fix printf format in example.c -- Correct cdecl support in zconf.in.h [Anisimkov] -- Minor FAQ updates - -Changes in 1.2.0.2 (13 July 2003) -- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons -- Attempt to avoid warnings in crc32.c for pointer-int conversion -- Add AIX to configure, remove aix directory [Bakker] -- Add some casts to minigzip.c -- Improve checking after insecure sprintf() or vsprintf() calls -- Remove #elif's from crc32.c -- Change leave label to inf_leave in inflate.c and infback.c to avoid - library conflicts -- Remove inflate gzip decoding by default--only enable gzip decoding by - special request for stricter backward compatibility -- Add zlibCompileFlags() function to return compilation information -- More typecasting in deflate.c to avoid warnings -- Remove leading underscore from _Capital #defines [Truta] -- Fix configure to link shared library when testing -- Add some Windows CE target adjustments [Mai] -- Remove #define ZLIB_DLL in zconf.h [Vollant] -- Add zlib.3 [Rodgers] -- Update RFC URL in deflate.c and algorithm.txt [Mai] -- Add zlib_dll_FAQ.txt to contrib [Truta] -- Add UL to some constants [Truta] -- Update minizip and vstudio [Vollant] -- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h -- Expand use of NO_DUMMY_DECL to avoid all dummy structures -- Added iostream3 to contrib [Schwardt] -- Replace rewind() with fseek() for WinCE [Truta] -- Improve setting of zlib format compression level flags - - Report 0 for huffman and rle strategies and for level == 0 or 1 - - Report 2 only for level == 6 -- Only deal with 64K limit when necessary at compile time [Truta] -- Allow TOO_FAR check to be turned off at compile time [Truta] -- Add gzclearerr() function [Souza] -- Add gzungetc() function - -Changes in 1.2.0.1 (17 March 2003) -- Add Z_RLE strategy for run-length encoding [Truta] - - When Z_RLE requested, restrict matches to distance one - - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE -- Correct FASTEST compilation to allow level == 0 -- Clean up what gets compiled for FASTEST -- Incorporate changes to zconf.in.h [Vollant] - - Refine detection of Turbo C need for dummy returns - - Refine ZLIB_DLL compilation - - Include additional header file on VMS for off_t typedef -- Try to use _vsnprintf where it supplants vsprintf [Vollant] -- Add some casts in inffast.c -- Enchance comments in zlib.h on what happens if gzprintf() tries to - write more than 4095 bytes before compression -- Remove unused state from inflateBackEnd() -- Remove exit(0) from minigzip.c, example.c -- Get rid of all those darn tabs -- Add "check" target to Makefile.in that does the same thing as "test" -- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in -- Update contrib/inflate86 [Anderson] -- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] -- Add msdos and win32 directories with makefiles [Truta] -- More additions and improvements to the FAQ - -Changes in 1.2.0 (9 March 2003) -- New and improved inflate code - - About 20% faster - - Does not allocate 32K window unless and until needed - - Automatically detects and decompresses gzip streams - - Raw inflate no longer needs an extra dummy byte at end - - Added inflateBack functions using a callback interface--even faster - than inflate, useful for file utilities (gzip, zip) - - Added inflateCopy() function to record state for random access on - externally generated deflate streams (e.g. in gzip files) - - More readable code (I hope) -- New and improved crc32() - - About 50% faster, thanks to suggestions from Rodney Brown -- Add deflateBound() and compressBound() functions -- Fix memory leak in deflateInit2() -- Permit setting dictionary for raw deflate (for parallel deflate) -- Fix const declaration for gzwrite() -- Check for some malloc() failures in gzio.c -- Fix bug in gzopen() on single-byte file 0x1f -- Fix bug in gzread() on concatenated file with 0x1f at end of buffer - and next buffer doesn't start with 0x8b -- Fix uncompress() to return Z_DATA_ERROR on truncated input -- Free memory at end of example.c -- Remove MAX #define in trees.c (conflicted with some libraries) -- Fix static const's in deflate.c, gzio.c, and zutil.[ch] -- Declare malloc() and free() in gzio.c if STDC not defined -- Use malloc() instead of calloc() in zutil.c if int big enough -- Define STDC for AIX -- Add aix/ with approach for compiling shared library on AIX -- Add HP-UX support for shared libraries in configure -- Add OpenUNIX support for shared libraries in configure -- Use $cc instead of gcc to build shared library -- Make prefix directory if needed when installing -- Correct Macintosh avoidance of typedef Byte in zconf.h -- Correct Turbo C memory allocation when under Linux -- Use libz.a instead of -lz in Makefile (assure use of compiled library) -- Update configure to check for snprintf or vsnprintf functions and their - return value, warn during make if using an insecure function -- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that - is lost when library is used--resolution is to build new zconf.h -- Documentation improvements (in zlib.h): - - Document raw deflate and inflate - - Update RFCs URL - - Point out that zlib and gzip formats are different - - Note that Z_BUF_ERROR is not fatal - - Document string limit for gzprintf() and possible buffer overflow - - Note requirement on avail_out when flushing - - Note permitted values of flush parameter of inflate() -- Add some FAQs (and even answers) to the FAQ -- Add contrib/inflate86/ for x86 faster inflate -- Add contrib/blast/ for PKWare Data Compression Library decompression -- Add contrib/puff/ simple inflate for deflate format description - -Changes in 1.1.4 (11 March 2002) -- ZFREE was repeated on same allocation on some error conditions. - This creates a security problem described in - http://www.zlib.org/advisory-2002-03-11.txt -- Returned incorrect error (Z_MEM_ERROR) on some invalid data -- Avoid accesses before window for invalid distances with inflate window - less than 32K. -- force windowBits > 8 to avoid a bug in the encoder for a window size - of 256 bytes. (A complete fix will be available in 1.1.5). - -Changes in 1.1.3 (9 July 1998) -- fix "an inflate input buffer bug that shows up on rare but persistent - occasions" (Mark) -- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) -- fix gzseek(..., SEEK_SET) in write mode -- fix crc check after a gzeek (Frank Faubert) -- fix miniunzip when the last entry in a zip file is itself a zip file - (J Lillge) -- add contrib/asm586 and contrib/asm686 (Brian Raiter) - See http://www.muppetlabs.com/~breadbox/software/assembly.html -- add support for Delphi 3 in contrib/delphi (Bob Dellaca) -- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) -- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) -- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) -- added a FAQ file - -- Support gzdopen on Mac with Metrowerks (Jason Linhart) -- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) -- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) -- avoid some warnings with Borland C (Tom Tanner) -- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) -- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) -- allow several arguments to configure (Tim Mooney, Frodo Looijaard) -- use libdir and includedir in Makefile.in (Tim Mooney) -- support shared libraries on OSF1 V4 (Tim Mooney) -- remove so_locations in "make clean" (Tim Mooney) -- fix maketree.c compilation error (Glenn, Mark) -- Python interface to zlib now in Python 1.5 (Jeremy Hylton) -- new Makefile.riscos (Rich Walker) -- initialize static descriptors in trees.c for embedded targets (Nick Smith) -- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) -- add the OS/2 files in Makefile.in too (Andrew Zabolotny) -- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) -- fix maketree.c to allow clean compilation of inffixed.h (Mark) -- fix parameter check in deflateCopy (Gunther Nikl) -- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) -- Many portability patches by Christian Spieler: - . zutil.c, zutil.h: added "const" for zmem* - . Make_vms.com: fixed some typos - . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists - . msdos/Makefile.msc: remove "default rtl link library" info from obj files - . msdos/Makefile.*: use model-dependent name for the built zlib library - . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: - new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) -- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) -- replace __far with _far for better portability (Christian Spieler, Tom Lane) -- fix test for errno.h in configure (Tim Newsham) - -Changes in 1.1.2 (19 March 98) -- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) - See http://www.winimage.com/zLibDll/unzip.html -- preinitialize the inflate tables for fixed codes, to make the code - completely thread safe (Mark) -- some simplifications and slight speed-up to the inflate code (Mark) -- fix gzeof on non-compressed files (Allan Schrum) -- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) -- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) -- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) -- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) -- do not wrap extern "C" around system includes (Tom Lane) -- mention zlib binding for TCL in README (Andreas Kupries) -- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) -- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) -- allow "configure --prefix $HOME" (Tim Mooney) -- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) -- move Makefile.sas to amiga/Makefile.sas - -Changes in 1.1.1 (27 Feb 98) -- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) -- remove block truncation heuristic which had very marginal effect for zlib - (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the - compression ratio on some files. This also allows inlining _tr_tally for - matches in deflate_slow. -- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) - -Changes in 1.1.0 (24 Feb 98) -- do not return STREAM_END prematurely in inflate (John Bowler) -- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) -- compile with -DFASTEST to get compression code optimized for speed only -- in minigzip, try mmap'ing the input file first (Miguel Albrecht) -- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain - on Sun but significant on HP) - -- add a pointer to experimental unzip library in README (Gilles Vollant) -- initialize variable gcc in configure (Chris Herborth) - -Changes in 1.0.9 (17 Feb 1998) -- added gzputs and gzgets functions -- do not clear eof flag in gzseek (Mark Diekhans) -- fix gzseek for files in transparent mode (Mark Diekhans) -- do not assume that vsprintf returns the number of bytes written (Jens Krinke) -- replace EXPORT with ZEXPORT to avoid conflict with other programs -- added compress2 in zconf.h, zlib.def, zlib.dnt -- new asm code from Gilles Vollant in contrib/asm386 -- simplify the inflate code (Mark): - . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() - . ZALLOC the length list in inflate_trees_fixed() instead of using stack - . ZALLOC the value area for huft_build() instead of using stack - . Simplify Z_FINISH check in inflate() - -- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 -- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) -- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with - the declaration of FAR (Gilles VOllant) -- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) -- read_buf buf parameter of type Bytef* instead of charf* -- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) -- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) -- fix check for presence of directories in "make install" (Ian Willis) - -Changes in 1.0.8 (27 Jan 1998) -- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) -- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) -- added compress2() to allow setting the compression level -- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) -- use constant arrays for the static trees in trees.c instead of computing - them at run time (thanks to Ken Raeburn for this suggestion). To create - trees.h, compile with GEN_TREES_H and run "make test". -- check return code of example in "make test" and display result -- pass minigzip command line options to file_compress -- simplifying code of inflateSync to avoid gcc 2.8 bug - -- support CC="gcc -Wall" in configure -s (QingLong) -- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) -- fix test for shared library support to avoid compiler warnings -- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) -- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) -- do not use fdopen for Metrowerks on Mac (Brad Pettit)) -- add checks for gzputc and gzputc in example.c -- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) -- use const for the CRC table (Ken Raeburn) -- fixed "make uninstall" for shared libraries -- use Tracev instead of Trace in infblock.c -- in example.c use correct compressed length for test_sync -- suppress +vnocompatwarnings in configure for HPUX (not always supported) - -Changes in 1.0.7 (20 Jan 1998) -- fix gzseek which was broken in write mode -- return error for gzseek to negative absolute position -- fix configure for Linux (Chun-Chung Chen) -- increase stack space for MSC (Tim Wegner) -- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) -- define EXPORTVA for gzprintf (Gilles Vollant) -- added man page zlib.3 (Rick Rodgers) -- for contrib/untgz, fix makedir() and improve Makefile - -- check gzseek in write mode in example.c -- allocate extra buffer for seeks only if gzseek is actually called -- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) -- add inflateSyncPoint in zconf.h -- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def - -Changes in 1.0.6 (19 Jan 1998) -- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and - gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) -- Fix a deflate bug occurring only with compression level 0 (thanks to - Andy Buckler for finding this one). -- In minigzip, pass transparently also the first byte for .Z files. -- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() -- check Z_FINISH in inflate (thanks to Marc Schluper) -- Implement deflateCopy (thanks to Adam Costello) -- make static libraries by default in configure, add --shared option. -- move MSDOS or Windows specific files to directory msdos -- suppress the notion of partial flush to simplify the interface - (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) -- suppress history buffer provided by application to simplify the interface - (this feature was not implemented anyway in 1.0.4) -- next_in and avail_in must be initialized before calling inflateInit or - inflateInit2 -- add EXPORT in all exported functions (for Windows DLL) -- added Makefile.nt (thanks to Stephen Williams) -- added the unsupported "contrib" directory: - contrib/asm386/ by Gilles Vollant - 386 asm code replacing longest_match(). - contrib/iostream/ by Kevin Ruland - A C++ I/O streams interface to the zlib gz* functions - contrib/iostream2/ by Tyge Løvset - Another C++ I/O streams interface - contrib/untgz/ by "Pedro A. Aranda Guti\irrez" - A very simple tar.gz file extractor using zlib - contrib/visual-basic.txt by Carlos Rios - How to use compress(), uncompress() and the gz* functions from VB. -- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression - level) in minigzip (thanks to Tom Lane) - -- use const for rommable constants in deflate -- added test for gzseek and gztell in example.c -- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) -- add undocumented function zError to convert error code to string - (for Tim Smithers) -- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. -- Use default memcpy for Symantec MSDOS compiler. -- Add EXPORT keyword for check_func (needed for Windows DLL) -- add current directory to LD_LIBRARY_PATH for "make test" -- create also a link for libz.so.1 -- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) -- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) -- added -soname for Linux in configure (Chun-Chung Chen, -- assign numbers to the exported functions in zlib.def (for Windows DLL) -- add advice in zlib.h for best usage of deflateSetDictionary -- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) -- allow compilation with ANSI keywords only enabled for TurboC in large model -- avoid "versionString"[0] (Borland bug) -- add NEED_DUMMY_RETURN for Borland -- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). -- allow compilation with CC -- defined STDC for OS/2 (David Charlap) -- limit external names to 8 chars for MVS (Thomas Lund) -- in minigzip.c, use static buffers only for 16-bit systems -- fix suffix check for "minigzip -d foo.gz" -- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) -- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) -- added makelcc.bat for lcc-win32 (Tom St Denis) -- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) -- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. -- check for unistd.h in configure (for off_t) -- remove useless check parameter in inflate_blocks_free -- avoid useless assignment of s->check to itself in inflate_blocks_new -- do not flush twice in gzclose (thanks to Ken Raeburn) -- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h -- use NO_ERRNO_H instead of enumeration of operating systems with errno.h -- work around buggy fclose on pipes for HP/UX -- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) -- fix configure if CC is already equal to gcc - -Changes in 1.0.5 (3 Jan 98) -- Fix inflate to terminate gracefully when fed corrupted or invalid data -- Use const for rommable constants in inflate -- Eliminate memory leaks on error conditions in inflate -- Removed some vestigial code in inflate -- Update web address in README - -Changes in 1.0.4 (24 Jul 96) -- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF - bit, so the decompressor could decompress all the correct data but went - on to attempt decompressing extra garbage data. This affected minigzip too. -- zlibVersion and gzerror return const char* (needed for DLL) -- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) -- use z_error only for DEBUG (avoid problem with DLLs) - -Changes in 1.0.3 (2 Jul 96) -- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS - small and medium models; this makes the library incompatible with previous - versions for these models. (No effect in large model or on other systems.) -- return OK instead of BUF_ERROR if previous deflate call returned with - avail_out as zero but there is nothing to do -- added memcmp for non STDC compilers -- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) -- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) -- better check for 16-bit mode MSC (avoids problem with Symantec) - -Changes in 1.0.2 (23 May 96) -- added Windows DLL support -- added a function zlibVersion (for the DLL support) -- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) -- Bytef is define's instead of typedef'd only for Borland C -- avoid reading uninitialized memory in example.c -- mention in README that the zlib format is now RFC1950 -- updated Makefile.dj2 -- added algorithm.doc - -Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] -- fix array overlay in deflate.c which sometimes caused bad compressed data -- fix inflate bug with empty stored block -- fix MSDOS medium model which was broken in 0.99 -- fix deflateParams() which could generate bad compressed data. -- Bytef is define'd instead of typedef'ed (work around Borland bug) -- added an INDEX file -- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), - Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) -- speed up adler32 for modern machines without auto-increment -- added -ansi for IRIX in configure -- static_init_done in trees.c is an int -- define unlink as delete for VMS -- fix configure for QNX -- add configure branch for SCO and HPUX -- avoid many warnings (unused variables, dead assignments, etc...) -- no fdopen for BeOS -- fix the Watcom fix for 32 bit mode (define FAR as empty) -- removed redefinition of Byte for MKWERKS -- work around an MWKERKS bug (incorrect merge of all .h files) - -Changes in 0.99 (27 Jan 96) -- allow preset dictionary shared between compressor and decompressor -- allow compression level 0 (no compression) -- add deflateParams in zlib.h: allow dynamic change of compression level - and compression strategy. -- test large buffers and deflateParams in example.c -- add optional "configure" to build zlib as a shared library -- suppress Makefile.qnx, use configure instead -- fixed deflate for 64-bit systems (detected on Cray) -- fixed inflate_blocks for 64-bit systems (detected on Alpha) -- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) -- always return Z_BUF_ERROR when deflate() has nothing to do -- deflateInit and inflateInit are now macros to allow version checking -- prefix all global functions and types with z_ with -DZ_PREFIX -- make falloc completely reentrant (inftrees.c) -- fixed very unlikely race condition in ct_static_init -- free in reverse order of allocation to help memory manager -- use zlib-1.0/* instead of zlib/* inside the tar.gz -- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith - -Wconversion -Wstrict-prototypes -Wmissing-prototypes" -- allow gzread on concatenated .gz files -- deflateEnd now returns Z_DATA_ERROR if it was premature -- deflate is finally (?) fully deterministic (no matches beyond end of input) -- Document Z_SYNC_FLUSH -- add uninstall in Makefile -- Check for __cpluplus in zlib.h -- Better test in ct_align for partial flush -- avoid harmless warnings for Borland C++ -- initialize hash_head in deflate.c -- avoid warning on fdopen (gzio.c) for HP cc -Aa -- include stdlib.h for STDC compilers -- include errno.h for Cray -- ignore error if ranlib doesn't exist -- call ranlib twice for NeXTSTEP -- use exec_prefix instead of prefix for libz.a -- renamed ct_* as _tr_* to avoid conflict with applications -- clear z->msg in inflateInit2 before any error return -- initialize opaque in example.c, gzio.c, deflate.c and inflate.c -- fixed typo in zconf.h (_GNUC__ => __GNUC__) -- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) -- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) -- in fcalloc, normalize pointer if size > 65520 bytes -- don't use special fcalloc for 32 bit Borland C++ -- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... -- use Z_BINARY instead of BINARY -- document that gzclose after gzdopen will close the file -- allow "a" as mode in gzopen. -- fix error checking in gzread -- allow skipping .gz extra-field on pipes -- added reference to Perl interface in README -- put the crc table in FAR data (I dislike more and more the medium model :) -- added get_crc_table -- added a dimension to all arrays (Borland C can't count). -- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast -- guard against multiple inclusion of *.h (for precompiled header on Mac) -- Watcom C pretends to be Microsoft C small model even in 32 bit mode. -- don't use unsized arrays to avoid silly warnings by Visual C++: - warning C4746: 'inflate_mask' : unsized array treated as '__far' - (what's wrong with far data in far model?). -- define enum out of inflate_blocks_state to allow compilation with C++ - -Changes in 0.95 (16 Aug 95) -- fix MSDOS small and medium model (now easier to adapt to any compiler) -- inlined send_bits -- fix the final (:-) bug for deflate with flush (output was correct but - not completely flushed in rare occasions). -- default window size is same for compression and decompression - (it's now sufficient to set MAX_WBITS in zconf.h). -- voidp -> voidpf and voidnp -> voidp (for consistency with other - typedefs and because voidnp was not near in large model). - -Changes in 0.94 (13 Aug 95) -- support MSDOS medium model -- fix deflate with flush (could sometimes generate bad output) -- fix deflateReset (zlib header was incorrectly suppressed) -- added support for VMS -- allow a compression level in gzopen() -- gzflush now calls fflush -- For deflate with flush, flush even if no more input is provided. -- rename libgz.a as libz.a -- avoid complex expression in infcodes.c triggering Turbo C bug -- work around a problem with gcc on Alpha (in INSERT_STRING) -- don't use inline functions (problem with some gcc versions) -- allow renaming of Byte, uInt, etc... with #define. -- avoid warning about (unused) pointer before start of array in deflate.c -- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c -- avoid reserved word 'new' in trees.c - -Changes in 0.93 (25 June 95) -- temporarily disable inline functions -- make deflate deterministic -- give enough lookahead for PARTIAL_FLUSH -- Set binary mode for stdin/stdout in minigzip.c for OS/2 -- don't even use signed char in inflate (not portable enough) -- fix inflate memory leak for segmented architectures - -Changes in 0.92 (3 May 95) -- don't assume that char is signed (problem on SGI) -- Clear bit buffer when starting a stored block -- no memcpy on Pyramid -- suppressed inftest.c -- optimized fill_window, put longest_match inline for gcc -- optimized inflate on stored blocks. -- untabify all sources to simplify patches - -Changes in 0.91 (2 May 95) -- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h -- Document the memory requirements in zconf.h -- added "make install" -- fix sync search logic in inflateSync -- deflate(Z_FULL_FLUSH) now works even if output buffer too short -- after inflateSync, don't scare people with just "lo world" -- added support for DJGPP - -Changes in 0.9 (1 May 95) -- don't assume that zalloc clears the allocated memory (the TurboC bug - was Mark's bug after all :) -- let again gzread copy uncompressed data unchanged (was working in 0.71) -- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented -- added a test of inflateSync in example.c -- moved MAX_WBITS to zconf.h because users might want to change that. -- document explicitly that zalloc(64K) on MSDOS must return a normalized - pointer (zero offset) -- added Makefiles for Microsoft C, Turbo C, Borland C++ -- faster crc32() - -Changes in 0.8 (29 April 95) -- added fast inflate (inffast.c) -- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this - is incompatible with previous versions of zlib which returned Z_OK. -- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) - (actually that was not a compiler bug, see 0.81 above) -- gzread no longer reads one extra byte in certain cases -- In gzio destroy(), don't reference a freed structure -- avoid many warnings for MSDOS -- avoid the ERROR symbol which is used by MS Windows - -Changes in 0.71 (14 April 95) -- Fixed more MSDOS compilation problems :( There is still a bug with - TurboC large model. - -Changes in 0.7 (14 April 95) -- Added full inflate support. -- Simplified the crc32() interface. The pre- and post-conditioning - (one's complement) is now done inside crc32(). WARNING: this is - incompatible with previous versions; see zlib.h for the new usage. - -Changes in 0.61 (12 April 95) -- workaround for a bug in TurboC. example and minigzip now work on MSDOS. - -Changes in 0.6 (11 April 95) -- added minigzip.c -- added gzdopen to reopen a file descriptor as gzFile -- added transparent reading of non-gziped files in gzread. -- fixed bug in gzread (don't read crc as data) -- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). -- don't allocate big arrays in the stack (for MSDOS) -- fix some MSDOS compilation problems - -Changes in 0.5: -- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but - not yet Z_FULL_FLUSH. -- support decompression but only in a single step (forced Z_FINISH) -- added opaque object for zalloc and zfree. -- added deflateReset and inflateReset -- added a variable zlib_version for consistency checking. -- renamed the 'filter' parameter of deflateInit2 as 'strategy'. - Added Z_FILTERED and Z_HUFFMAN_ONLY constants. - -Changes in 0.4: -- avoid "zip" everywhere, use zlib instead of ziplib. -- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush - if compression method == 8. -- added adler32 and crc32 -- renamed deflateOptions as deflateInit2, call one or the other but not both -- added the method parameter for deflateInit2. -- added inflateInit2 -- simplied considerably deflateInit and inflateInit by not supporting - user-provided history buffer. This is supported only in deflateInit2 - and inflateInit2. - -Changes in 0.3: -- prefix all macro names with Z_ -- use Z_FINISH instead of deflateEnd to finish compression. -- added Z_HUFFMAN_ONLY -- added gzerror() diff --git a/libs/zlibng/INDEX b/libs/zlibng/INDEX deleted file mode 100644 index 34c80ad9e..000000000 --- a/libs/zlibng/INDEX +++ /dev/null @@ -1,55 +0,0 @@ -CMakeLists.txt cmake build file -ChangeLog.zlib history of changes up to the fork from zlib 1.2.11 -FAQ.zlib Frequently Asked Questions about zlib, as distributed in zlib 1.2.11 -INDEX this file -Makefile dummy Makefile that tells you to ./configure -Makefile.in template for Unix Makefile -README guess what -README.zlib Copy of the original README file distributed in zlib 1.2.11 -configure configure script for Unix -test/example.c zlib usages examples for build testing -test/minigzip.c minimal gzip-like functionality for build testing -test/infcover.c inf*.c code coverage for build coverage testing -treebuild.xml XML description of source file dependencies -zconf.h.cmakein zconf.h template for cmake -zconf.h.in zconf.h template for configure -zlib.3 Man page for zlib -zlib.3.pdf Man page in PDF format -zlib.map Linux symbol information -zlib.pc.in Template for pkg-config descriptor -zlib.pc.cmakein zlib.pc template for cmake -zlib2ansi perl script to convert source files for C++ compilation - -arch/ architecture-specific code -doc/ documentation for formats and algorithms -win32/ makefiles for Windows - - zlib public header files (required for library use): -zconf.h -zlib.h - - private source files used to build the zlib library: -adler32.c -compress.c -crc32.c -crc32.h -deflate.c -deflate.h -gzclose.c -gzguts.h -gzlib.c -gzread.c -gzwrite.c -infback.c -inffast.c -inffast.h -inffixed.h -inflate.c -inflate.h -inftrees.c -inftrees.h -trees.c -trees.h -uncompr.c -zutil.c -zutil.h diff --git a/libs/zlibng/INDEX.md b/libs/zlibng/INDEX.md new file mode 100644 index 000000000..5be081c4e --- /dev/null +++ b/libs/zlibng/INDEX.md @@ -0,0 +1,37 @@ +Contents +-------- + +| Name | Description | +|:-----------------|:---------------------------------------------------------------| +| arch/ | Architecture-specific code | +| doc/ | Documentation for formats and algorithms | +| test/example.c | Zlib usages examples for build testing | +| test/minigzip.c | Minimal gzip-like functionality for build testing | +| test/infcover.c | Inflate code coverage for build testing | +| win32/ | Shared library version resources for Windows | +| CMakeLists.txt | Cmake build script | +| configure | Bash configure/build script | +| adler32.c | Compute the Adler-32 checksum of a data stream | +| chunkset.* | Inline functions to copy small data chunks | +| compress.c | Compress a memory buffer | +| deflate.* | Compress data using the deflate algorithm | +| deflate_fast.c | Compress data using the deflate algorithm with fast strategy | +| deflate_medium.c | Compress data using the deflate algorithm with medium strategy | +| deflate_slow.c | Compress data using the deflate algorithm with slow strategy | +| functable.* | Struct containing function pointers to optimized functions | +| gzguts.h | Internal definitions for gzip operations | +| gzlib.c | Functions common to reading and writing gzip files | +| gzread.c | Read gzip files | +| gzwrite.c | Write gzip files | +| infback.* | Inflate using a callback interface | +| inflate.* | Decompress data | +| inffast.* | Decompress data with speed optimizations | +| inffixed_tbl.h | Table for decoding fixed codes | +| inftrees.h | Generate Huffman trees for efficient decoding | +| trees.* | Output deflated data using Huffman coding | +| uncompr.c | Decompress a memory buffer | +| zconf.h.cmakein | zconf.h template for cmake | +| zendian.h | BYTE_ORDER for endian tests | +| zlib.3 | Man page for zlib | +| zlib.map | Linux symbol information | +| zlib.pc.in | Pkg-config template | diff --git a/libs/zlibng/INSTALL b/libs/zlibng/INSTALL deleted file mode 100644 index 7aa87a50d..000000000 --- a/libs/zlibng/INSTALL +++ /dev/null @@ -1,64 +0,0 @@ -Overview -======== - -There are several methods for compiling and installing zlib-ng, depending -on your favorite operating system and development toolkits. -This document will attempt to give a general overview of some of them. - -PS: We do not recommend running 'make install' unless you know what you - are doing, as this can override the system default zlib library, and - any wrong configuration or incompatability of zlib-ng can make the - whole system unusable. - -On linux distros, an alternative way to use zlib-ng instead of zlib -for specific programs exist, use LD_PRELOAD. -If the program is dynamically linked with zlib, then zlib-ng can take -its place without risking system-wide instability. Ex: -LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.11.zlib-ng /usr/bin/program - - -Configure -========= - -Using the configure script is currently the main method of setting up the -makefiles and preparing for compilation. Configure will attempt to detect -the specifics of your system, and enable some of the relevant options for you. - -Configure accepts several command-line options, some of the most important -ones are detailed below. - ---zlib-compat - This enables options that will ensure that zlib-ng is compiled with all the - functions that a standard zlib library contains, you will need to use this - if you are going to be using zlib-ng as a drop-in replacement for zlib. - ---without-optimizations - This will disable zlib-ng specific optimizations (does not disable strategies). - ---without-new-strategies - This will disable specially optimized strategies, such as deflate_quick and - deflate_medium. - -Run configure like this: -./configure --zlib-compat - -Then you can compile using make: -make -make test - - -Cmake -===== - -Cmake is an alternative to configure, basically letting you do the same thing, -but with different tools and user interfaces. - -Start by initializing cmake: -cmake . - -Then you can start the configuration tui to set the wanted options -ccmake . - -You can now compile using make: -make -make test diff --git a/libs/zlibng/Makefile.in b/libs/zlibng/Makefile.in index 69fe01165..8de3192c9 100644 --- a/libs/zlibng/Makefile.in +++ b/libs/zlibng/Makefile.in @@ -29,8 +29,8 @@ TEST_LIBS=$(LIBNAME1).a LDSHARED=$(CC) LDSHAREDFLAGS=-shared -VER=1.9.9 -VER1=1 +VER=2.0.0-RC2 +VER1=2 STATICLIB=$(LIBNAME1).a SHAREDLIB=$(LIBNAME1).so @@ -51,7 +51,7 @@ RCOBJS= STRIP= RANLIB=ranlib LDCONFIG=ldconfig -LDSHAREDLIBC=-lc +LDSHAREDLIBC= EXE= SRCDIR=. @@ -71,12 +71,64 @@ mandir = ${prefix}/share/man man3dir = ${mandir}/man3 pkgconfigdir = ${libdir}/pkgconfig -OBJZ = adler32.o compress.o crc32.o deflate.o deflate_fast.o deflate_medium.o deflate_slow.o functable.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o $(ARCH_STATIC_OBJS) -OBJG = gzclose.o gzlib.o gzread.o gzwrite.o +OBJZ = \ + adler32.o \ + chunkset.o \ + compare258.o \ + compress.o \ + crc32.o \ + crc32_comb.o \ + deflate.o \ + deflate_fast.o \ + deflate_medium.o \ + deflate_quick.o \ + deflate_slow.o \ + functable.o \ + infback.o \ + inffast.o \ + inflate.o \ + inftrees.o \ + insert_string.o \ + trees.o \ + uncompr.o \ + zutil.o \ + $(ARCH_STATIC_OBJS) + +OBJG = \ + gzlib.o \ + gzread.o \ + gzwrite.o + OBJC = $(OBJZ) $(OBJG) -PIC_OBJZ = adler32.lo compress.lo crc32.lo deflate.lo deflate_fast.lo deflate_medium.lo deflate_slow.lo functable.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo $(ARCH_SHARED_OBJS) -PIC_OBJG = gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJZ = \ + adler32.lo \ + chunkset.lo \ + compare258.lo \ + compress.lo \ + crc32.lo \ + crc32_comb.lo \ + deflate.lo \ + deflate_fast.lo \ + deflate_medium.lo \ + deflate_quick.lo \ + deflate_slow.lo \ + functable.lo \ + infback.lo \ + inffast.lo \ + inflate.lo \ + inftrees.lo \ + insert_string.lo \ + trees.lo \ + uncompr.lo \ + zutil.lo \ + $(ARCH_SHARED_OBJS) + +PIC_OBJG = \ + gzlib.lo \ + gzread.lo \ + gzwrite.lo + PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) OBJS = $(OBJC) @@ -85,11 +137,9 @@ PIC_OBJS = $(PIC_OBJC) all: static shared -static: example$(EXE) minigzip$(EXE) fuzzers +static: adler32_test$(EXE) example$(EXE) minigzip$(EXE) fuzzers makefixed$(EXE) maketrees$(EXE) makecrct$(EXE) -shared: examplesh$(EXE) minigzipsh$(EXE) - -all64: example64$(EXE) minigzip64$(EXE) +shared: adler32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) check: test @@ -181,17 +231,23 @@ $(STATICLIB): $(OBJS) $(AR) $(ARFLAGS) $@ $(OBJS) -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 +adler32_test.o: + $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/test/adler32_test.c + example.o: $(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $(SRCDIR)/test/example.c minigzip.o: $(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $(SRCDIR)/test/minigzip.c -example64.o: - $(CC) $(CFLAGS) -DWITH_GZFILEOP -D_FILE_OFFSET_BITS=64 $(INCLUDES) -c -o $@ $(SRCDIR)/test/example.c +makefixed.o: + $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/tools/makefixed.c -minigzip64.o: - $(CC) $(CFLAGS) -DWITH_GZFILEOP -D_FILE_OFFSET_BITS=64 $(INCLUDES) -c -o $@ $(SRCDIR)/test/minigzip.c +maketrees.o: + $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/tools/maketrees.c + +makecrct.o: + $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/tools/makecrct.c zlibrc.o: win32/zlib$(SUFFIX)1.rc $(RC) $(RCFLAGS) -o $@ win32/zlib$(SUFFIX)1.rc @@ -209,7 +265,7 @@ $(OBJG): %.o: $(SRCDIR)/%.c $(SHAREDTARGET): $(PIC_OBJS) $(DEFFILE) $(RCOBJS) ifneq ($(SHAREDTARGET),) - $(LDSHARED) $(LDSHAREDFLAGS) $(LDFLAGS) -o $@ $(DEFFILE) $(PIC_OBJS) $(RCOBJS) $(LDSHAREDLIBC) + $(LDSHARED) $(CFLAGS) $(LDSHAREDFLAGS) $(LDFLAGS) -o $@ $(DEFFILE) $(PIC_OBJS) $(RCOBJS) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif @@ -220,38 +276,56 @@ ifneq ($(SHAREDLIB),$(SHAREDTARGET)) endif endif +adler32_test$(EXE): adler32_test.o $(OBJG) $(STATICLIB) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ adler32_test.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) +ifneq ($(STRIP),) + $(STRIP) $@ +endif + example$(EXE): example.o $(OBJG) $(STATICLIB) - $(CC) $(LDFLAGS) -o $@ example.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif minigzip$(EXE): minigzip.o $(OBJG) $(STATICLIB) - $(CC) $(LDFLAGS) -o $@ minigzip.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) +ifneq ($(STRIP),) + $(STRIP) $@ +endif + +adler32_testsh$(EXE): adler32_test.o $(OBJG) $(SHAREDTARGET) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ adler32_test.o $(OBJG) $(SHAREDTARGET) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif examplesh$(EXE): example.o $(OBJG) $(SHAREDTARGET) - $(CC) $(LDFLAGS) -o $@ example.o $(OBJG) $(SHAREDTARGET) $(LDSHAREDLIBC) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(OBJG) $(SHAREDTARGET) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif minigzipsh$(EXE): minigzip.o $(OBJG) $(SHAREDTARGET) - $(CC) $(LDFLAGS) -o $@ minigzip.o $(OBJG) $(SHAREDTARGET) $(LDSHAREDLIBC) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(OBJG) $(SHAREDTARGET) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif -example64$(EXE): example64.o $(OBJG) $(STATICLIB) - $(CC) $(LDFLAGS) -o $@ example64.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) +makefixed$(EXE): makefixed.o $(OBJG) $(STATICLIB) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ makefixed.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif -minigzip64$(EXE): minigzip64.o $(OBJG) $(STATICLIB) - $(CC) $(LDFLAGS) -o $@ minigzip64.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) +maketrees$(EXE): maketrees.o $(OBJG) $(STATICLIB) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ maketrees.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) +ifneq ($(STRIP),) + $(STRIP) $@ +endif + +makecrct$(EXE): makecrct.o $(OBJG) $(STATICLIB) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ makecrct.o $(OBJG) $(TEST_LIBS) $(LDSHAREDLIBC) ifneq ($(STRIP),) $(STRIP) $@ endif @@ -326,11 +400,11 @@ clean: @if [ -f $(ARCHDIR)/Makefile ]; then $(MAKE) -C $(ARCHDIR) clean; fi @if [ -f test/Makefile ]; then $(MAKE) -C test clean; fi rm -f *.o *.lo *~ \ - example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ - example64$(EXE) minigzip64$(EXE) \ + adler32_test$(EXE) example$(EXE) minigzip$(EXE) \ + adler32_testsh$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ checksum_fuzzer$(EXE) compress_fuzzer$(EXE) example_small_fuzzer$(EXE) example_large_fuzzer$(EXE) \ example_flush_fuzzer$(EXE) example_dict_fuzzer$(EXE) minigzip_fuzzer$(EXE) \ - infcover \ + infcover makefixed$(EXE) maketrees$(EXE) makecrct$(EXE) \ $(STATICLIB) $(IMPORTLIB) $(SHAREDLIB) $(SHAREDLIBV) $(SHAREDLIBM) \ foo.gz so_locations \ _match.s maketree @@ -338,6 +412,8 @@ clean: rm -f *.gcda *.gcno *.gcov rm -f a.out a.exe rm -f *.pc + rm -f *._h + rm -rf btmp1 btmp2 pkgtmp1 pkgtmp2 maintainer-clean: distclean distclean: clean diff --git a/libs/zlibng/README.md b/libs/zlibng/README.md index b2be6e59f..ad14c3ff4 100644 --- a/libs/zlibng/README.md +++ b/libs/zlibng/README.md @@ -1,10 +1,41 @@ -zlib-ng - zlib for the next generation systems +## zlib-ng +*zlib data compression library for the next generation systems* Maintained by Hans Kristian Rosbach aka Dead2 (zlib-ng àt circlestorm dót org) +|CI|Status| +|:-|-| +|GitHub Actions|[![Master Branch Status](https://github.com/zlib-ng/zlib-ng/workflows/CI%20CMake/badge.svg)](https://github.com/zlib-ng/zlib-ng/actions) [![Master Branch Status](https://github.com/zlib-ng/zlib-ng/workflows/CI%20Configure/badge.svg)](https://github.com/zlib-ng/zlib-ng/actions) [![Master Branch Status](https://github.com/zlib-ng/zlib-ng/workflows/CI%20NMake/badge.svg)](https://github.com/zlib-ng/zlib-ng/actions)| +|Buildkite|[![Build status](https://badge.buildkite.com/7bb1ef84356d3baee26202706cc053ee1de871c0c712b65d26.svg?branch=develop)](https://buildkite.com/circlestorm-productions/zlib-ng)| +|CodeFactor|[![CodeFactor](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/badge)](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng)| +|OSS-Fuzz|[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/zlib-ng.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:zlib-ng) +|Codecov|[![codecov.io](https://codecov.io/github/zlib-ng/zlib-ng/coverage.svg?branch=develop)](https://codecov.io/github/zlib-ng/zlib-ng/)| -Fork Motivation and History +Features +-------- + +* Zlib compatible API with support for dual-linking +* Modernized native API based on zlib API for ease of porting +* Modern C99 syntax and a clean code layout +* Deflate medium and quick algorithms based on Intels zlib fork +* Support for CPU intrinsics when available + * Adler32 implementation using SSSE3, AVX2, Neon & VSX + * CRC32-B implementation using PCLMULQDQ & ACLE + * Hash table implementation using CRC32-C intrinsics on x86 and ARM + * Slide hash implementations using SSE2, AVX2, Neon & VSX + * Compare256/258 implementations using SSE4.2 & AVX2 + * Inflate chunk copying using SSE2, AVX2 & Neon + * Support for hardware-accelerated deflate using IBM Z DFLTCC +* Unaligned memory read/writes and large bit buffer improvements +* Includes improvements from Cloudflare and Intel forks +* Configure, CMake, and NMake build system support +* Comprehensive set of CMake unit tests +* Code sanitizers, fuzzing, and coverage +* GitHub Actions continuous integration on Windows, macOS, and Linux + * Emulated CI for ARM, AARCH64, PPC, PPC64, SPARC64, S390x using qemu + +Fork Motivation --------------------------- The motivation for this fork was due to seeing several 3rd party @@ -38,17 +69,97 @@ various dead code, all contrib and example code as there is little point in having those in this fork for various reasons. A lot of improvements have gone into zlib-ng since its start, and -numerous people have contributed both small and big improvements, -or valuable testing. +numerous people and companies have contributed both small and big +improvements, or valuable testing. Please read LICENSE.md, it is very simple and very liberal. +Build +----- + +There are two ways to build zlib-ng: + +### Cmake + +To build zlib-ng using the cross-platform makefile generator cmake. + +``` +cmake . +cmake --build . --config Release +ctest --verbose -C Release +``` + +Alternatively, you can use the cmake configuration GUI tool ccmake: + +``` +ccmake . +``` + +### Configure + +To build zlib-ng using the bash configure script: + +``` +./configure +make +make test +``` + +Build Options +------------- +| CMake | configure | Description | Default | +|:-------------------------|:-------------------------|:--------------------------------------------------------------------------------------|---------| +| ZLIB_COMPAT | --zlib-compat | Compile with zlib compatible API | OFF | +| ZLIB_ENABLE_TESTS | | Build test binaries | ON | +| WITH_GZFILEOP | --without-gzfileops | Compile with support for gzFile related functions | ON | +| WITH_OPTIM | --without-optimizations | Build with optimisations | ON | +| WITH_NEW_STRATEGIES | --without-new-strategies | Use new strategies | ON | +| WITH_NATIVE_INSTRUCTIONS | --native | Compiles with full instruction set supported on this host (gcc/clang -march=native) | OFF | +| WITH_SANITIZER | --with-sanitizer | Build with sanitizer (memory, address, undefined) | OFF | +| WITH_FUZZERS | --with-fuzzers | Build test/fuzz | OFF | +| WITH_MAINTAINER_WARNINGS | | Build with project maintainer warnings | OFF | +| WITH_CODE_COVERAGE | | Enable code coverage reporting | OFF | + +Install +------- + +WARNING: We do not recommend manually installing unless you really +know what you are doing, because this can potentially override the system +default zlib library, and any incompatibility or wrong configuration of +zlib-ng can make the whole system unusable, requiring recovery or reinstall. +If you still want a manual install, we recommend using the /opt/ path prefix. + +For Linux distros, an alternative way to use zlib-ng (if compiled in +zlib-compat mode) instead of zlib, is through the use of the +_LD_PRELOAD_ environment variable. If the program is dynamically linked +with zlib, then zlib-ng will temporarily be used instead by the program, +without risking system-wide instability. + +``` +LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.11.zlib-ng /usr/bin/program +``` + +### Cmake + +To install zlib-ng system-wide using cmake: + +``` +cmake --build . --target install +``` + +### Configure + +To install zlib-ng system-wide using the configure script: + +``` +make install +``` Contributing ------------ -Zlib-ng is a young project, and we aim to be open to contributions, -and we would be delighted to receive pull requests on github. +Zlib-ng is a aiming to be open to contributions, and we would be +delighted to receive pull requests on github. Just remember that any code you submit must be your own and it must be zlib licensed. Help with testing and reviewing of pull requests etc is also very @@ -73,9 +184,23 @@ The deflate and zlib specifications were written by L. Peter Deutsch. zlib was originally created by Jean-loup Gailly (compression) and Mark Adler (decompression). +Advanced Build Options +---------------------- -Build Status ------------- - -Travis CI: [![build status](https://api.travis-ci.org/zlib-ng/zlib-ng.svg)](https://travis-ci.org/zlib-ng/zlib-ng/) -Buildkite: [![Build status](https://badge.buildkite.com/7bb1ef84356d3baee26202706cc053ee1de871c0c712b65d26.svg?branch=develop)](https://buildkite.com/circlestorm-productions/zlib-ng) +| CMake | configure | Description | Default | +|:--------------------------------|:----------------------|:--------------------------------------------------------------------|------------------------| +| ZLIB_DUAL_LINK | | Dual link tests with system zlib | OFF | +| | --force-sse2 | Assume SSE2 instructions are always available | ON (x86), OFF (x86_64) | +| WITH_AVX2 | | Build with AVX2 intrinsics | ON | +| WITH_SSE2 | | Build with SSE2 intrinsics | ON | +| WITH_SSE4 | | Build with SSE4 intrinsics | ON | +| WITH_PCLMULQDQ | | Build with PCLMULQDQ intrinsics | ON | +| WITH_ACLE | --without-acle | Build with ACLE intrinsics | ON | +| WITH_NEON | --without-neon | Build with NEON intrinsics | ON | +| WITH_POWER8 | | Build with POWER8 optimisations | ON | +| WITH_DFLTCC_DEFLATE | --with-dfltcc-deflate | Use DEFLATE COMPRESSION CALL instruction for compression on IBM Z | OFF | +| WITH_DFLTCC_INFLATE | --with-dfltcc-inflate | Use DEFLATE COMPRESSION CALL instruction for decompression on IBM Z | OFF | +| WITH_UNALIGNED | | Allow optimizations that use unaligned reads if safe on current arch| ON | +| WITH_INFLATE_STRICT | | Build with strict inflate distance checking | OFF | +| WITH_INFLATE_ALLOW_INVALID_DIST | | Build with zero fill for inflate invalid distances | OFF | +| INSTALL_UTILS | | Copy minigzip and minideflate during install | OFF | diff --git a/libs/zlibng/README.zlib b/libs/zlibng/README.zlib deleted file mode 100644 index edaad58bc..000000000 --- a/libs/zlibng/README.zlib +++ /dev/null @@ -1,118 +0,0 @@ -ZLIB DATA COMPRESSION LIBRARY - -zlib 1.2.11 is a general purpose data compression library. All the code is -thread safe. The data format used by the zlib library is described by RFCs -(Request for Comments) 1950 to 1952 in the files -http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and -rfc1952 (gzip format). - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file test/example.c which also tests that -the library is working correctly. Another example is given in the file -test/minigzip.c. The compression library itself is composed of all source -files in the root directory. - -To compile all files and run the test program, follow the instructions given at -the top of Makefile.in. In short "./configure; make test", and if that goes -well, "make install" should work for most flavors of Unix. For Windows, use -one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use -make_vms.com. - -Questions about zlib should be sent to , or to Gilles Vollant - for the Windows DLL version. The zlib home page is -http://zlib.net/ . Before reporting a problem, please check this site to -verify that you have the latest version of zlib; otherwise get the latest -version and check whether the problem still exists or not. - -PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. - -Mark Nelson wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available at -http://marknelson.us/1997/01/01/zlib-engine/ . - -The changes made in version 1.2.11 are documented in the file ChangeLog. - -Unsupported third party contributions are provided in directory contrib/ . - -zlib is available in Java using the java.util.zip package, documented at -http://java.sun.com/developer/technicalArticles/Programming/compression/ . - -A Perl interface to zlib written by Paul Marquess is available -at CPAN (Comprehensive Perl Archive Network) sites, including -http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . - -A Python interface to zlib written by A.M. Kuchling is -available in Python 1.5 and later versions, see -http://docs.python.org/library/zlib.html . - -zlib is built into tcl: http://wiki.tcl.tk/4610 . - -An experimental package to read and write files in .zip format, written on top -of zlib by Gilles Vollant , is available in the -contrib/minizip directory of zlib. - - -Notes for some targets: - -- For Windows DLL versions, please see win32/DLL_FAQ.txt - -- For 64-bit Irix, deflate.c must be compiled without any optimization. With - -O, one libpng test fails. The test works in 32 bit mode (with the -n32 - compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works - when compiled with cc. - -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is - necessary to get gzprintf working correctly. This is done by configure. - -- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with - other compilers. Use "make test" to check your compiler. - -- gzdopen is not supported on RISCOS or BEOS. - -- For PalmOs, see http://palmzlib.sourceforge.net/ - - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate and - zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; they - are too numerous to cite here. - -Copyright notice: - - (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -If you use the zlib library in a product, we would appreciate *not* receiving -lengthy legal documents to sign. The sources are provided for free but without -warranty of any kind. The library has been entirely written by Jean-loup -Gailly and Mark Adler; it does not include third-party code. We make all -contributions to and distributions of this project solely in our personal -capacity, and are not conveying any rights to any intellectual property of -any third parties. - -If you redistribute modified sources, we would appreciate that you include in -the file ChangeLog history information documenting your changes. Please read -the FAQ for more information on the distribution of modified source versions. diff --git a/libs/zlibng/adler32.c b/libs/zlibng/adler32.c index af4104778..7b245fc84 100644 --- a/libs/zlibng/adler32.c +++ b/libs/zlibng/adler32.c @@ -3,24 +3,13 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - #include "zbuild.h" #include "zutil.h" #include "functable.h" #include "adler32_p.h" -uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len); -static uint32_t adler32_combine_(uint32_t adler1, uint32_t adler2, z_off64_t len2); - -#define DO1(buf, i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf, i) DO1(buf, i); DO1(buf, i+1); -#define DO4(buf, i) DO2(buf, i); DO2(buf, i+2); -#define DO8(buf, i) DO4(buf, i); DO4(buf, i+4); -#define DO16(buf) DO8(buf, 0); DO8(buf, 8); - /* ========================================================================= */ -uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len) { +Z_INTERNAL uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len) { uint32_t sum2; unsigned n; @@ -29,15 +18,15 @@ uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len) { adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) + if (UNLIKELY(len == 1)) return adler32_len_1(adler, buf, sum2); /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == NULL) + if (UNLIKELY(buf == NULL)) return 1L; /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) + if (UNLIKELY(len < 16)) return adler32_len_16(adler, buf, len, sum2); /* do length NMAX blocks -- requires just one modulo operation */ @@ -50,15 +39,15 @@ uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len) { #endif do { #ifdef UNROLL_MORE - DO16(buf); /* 16 sums unrolled */ + DO16(adler, sum2, buf); /* 16 sums unrolled */ buf += 16; #else - DO8(buf, 0); /* 8 sums unrolled */ + DO8(adler, sum2, buf, 0); /* 8 sums unrolled */ buf += 8; #endif } while (--n); - MOD(adler); - MOD(sum2); + adler %= BASE; + sum2 %= BASE; } /* do remaining bytes (less than NMAX, still just one modulo) */ @@ -66,12 +55,12 @@ uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len) { #ifdef UNROLL_MORE while (len >= 16) { len -= 16; - DO16(buf); + DO16(adler, sum2, buf); buf += 16; #else while (len >= 8) { len -= 8; - DO8(buf, 0); + DO8(adler, sum2, buf, 0); buf += 8; #endif } @@ -80,22 +69,34 @@ uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len) { adler += *buf++; sum2 += adler; } - MOD(adler); - MOD(sum2); + adler %= BASE; + sum2 %= BASE; } /* return recombined sums */ return adler | (sum2 << 16); } -uint32_t ZEXPORT PREFIX(adler32_z)(uint32_t adler, const unsigned char *buf, size_t len) { +#ifdef ZLIB_COMPAT +unsigned long Z_EXPORT PREFIX(adler32_z)(unsigned long adler, const unsigned char *buf, size_t len) { + return (unsigned long)functable.adler32((uint32_t)adler, buf, len); +} +#else +uint32_t Z_EXPORT PREFIX(adler32_z)(uint32_t adler, const unsigned char *buf, size_t len) { return functable.adler32(adler, buf, len); } +#endif /* ========================================================================= */ -uint32_t ZEXPORT PREFIX(adler32)(uint32_t adler, const unsigned char *buf, uint32_t len) { +#ifdef ZLIB_COMPAT +unsigned long Z_EXPORT PREFIX(adler32)(unsigned long adler, const unsigned char *buf, unsigned int len) { + return (unsigned long)functable.adler32((uint32_t)adler, buf, len); +} +#else +uint32_t Z_EXPORT PREFIX(adler32)(uint32_t adler, const unsigned char *buf, uint32_t len) { return functable.adler32(adler, buf, len); } +#endif /* ========================================================================= */ static uint32_t adler32_combine_(uint32_t adler1, uint32_t adler2, z_off64_t len2) { @@ -108,11 +109,11 @@ static uint32_t adler32_combine_(uint32_t adler1, uint32_t adler2, z_off64_t len return 0xffffffff; /* the derivation of this formula is left as an exercise for the reader */ - MOD63(len2); /* assumes len2 >= 0 */ + len2 %= BASE; /* assumes len2 >= 0 */ rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; - MOD(sum2); + sum2 %= BASE; sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 >= BASE) sum1 -= BASE; @@ -123,10 +124,16 @@ static uint32_t adler32_combine_(uint32_t adler1, uint32_t adler2, z_off64_t len } /* ========================================================================= */ -uint32_t ZEXPORT PREFIX(adler32_combine)(uint32_t adler1, uint32_t adler2, z_off_t len2) { - return adler32_combine_(adler1, adler2, len2); +#ifdef ZLIB_COMPAT +unsigned long Z_EXPORT PREFIX(adler32_combine)(unsigned long adler1, unsigned long adler2, z_off_t len2) { + return (unsigned long)adler32_combine_((uint32_t)adler1, (uint32_t)adler2, len2); } -uint32_t ZEXPORT PREFIX(adler32_combine64)(uint32_t adler1, uint32_t adler2, z_off64_t len2) { +unsigned long Z_EXPORT PREFIX4(adler32_combine)(unsigned long adler1, unsigned long adler2, z_off64_t len2) { + return (unsigned long)adler32_combine_((uint32_t)adler1, (uint32_t)adler2, len2); +} +#else +uint32_t Z_EXPORT PREFIX4(adler32_combine)(uint32_t adler1, uint32_t adler2, z_off64_t len2) { return adler32_combine_(adler1, adler2, len2); } +#endif diff --git a/libs/zlibng/adler32_p.h b/libs/zlibng/adler32_p.h index 676653040..7f75c71e2 100644 --- a/libs/zlibng/adler32_p.h +++ b/libs/zlibng/adler32_p.h @@ -12,45 +12,11 @@ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ -/* use NO_DIVIDE if your processor does not do division in hardware -- - try it both ways to see which is faster */ -#ifdef NO_DIVIDE -/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 - (thank you to John Reiser for pointing this out) */ -# define CHOP(a) \ - do { \ - uint32_t tmp = a >> 16; \ - a &= 0xffff; \ - a += (tmp << 4) - tmp; \ - } while (0) -# define MOD28(a) \ - do { \ - CHOP(a); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD(a) \ - do { \ - CHOP(a); \ - MOD28(a); \ - } while (0) -# define MOD63(a) \ - do { /* this assumes a is not negative */ \ - z_off64_t tmp = a >> 32; \ - a &= 0xffffffffL; \ - a += (tmp << 8) - (tmp << 5) + tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD28(a) a %= BASE -# define MOD63(a) a %= BASE -#endif +#define DO1(sum1, sum2, buf, i) {(sum1) += buf[(i)]; (sum2) += (sum1);} +#define DO2(sum1, sum2, buf, i) {DO1(sum1, sum2, buf, i); DO1(sum1, sum2, buf, i+1);} +#define DO4(sum1, sum2, buf, i) {DO2(sum1, sum2, buf, i); DO2(sum1, sum2, buf, i+2);} +#define DO8(sum1, sum2, buf, i) {DO4(sum1, sum2, buf, i); DO4(sum1, sum2, buf, i+4);} +#define DO16(sum1, sum2, buf) {DO8(sum1, sum2, buf, 0); DO8(sum1, sum2, buf, 8);} static inline uint32_t adler32_len_1(uint32_t adler, const unsigned char *buf, uint32_t sum2) { adler += buf[0]; @@ -70,8 +36,18 @@ static inline uint32_t adler32_len_16(uint32_t adler, const unsigned char *buf, } if (adler >= BASE) adler -= BASE; - MOD28(sum2); /* only added so many BASE's */ + sum2 %= BASE; /* only added so many BASE's */ return adler | (sum2 << 16); } +static inline uint32_t adler32_len_64(uint32_t adler, const unsigned char *buf, size_t len, uint32_t sum2) { + while (len >= 16) { + len -= 16; + DO16(adler, sum2, buf); + buf += 16; + } + /* Process tail (len < 16). */ + return adler32_len_16(adler, buf, len, sum2); +} + #endif /* ADLER32_P_H */ diff --git a/libs/zlibng/arch/arm/Makefile.in b/libs/zlibng/arch/arm/Makefile.in index a64d591e5..a728d5ab2 100644 --- a/libs/zlibng/arch/arm/Makefile.in +++ b/libs/zlibng/arch/arm/Makefile.in @@ -6,19 +6,27 @@ CC= CFLAGS= SFLAGS= INCLUDES= +ACLEFLAG= +NEONFLAG= SUFFIX= SRCDIR=. SRCTOP=../.. TOPDIR=$(SRCTOP) -all: adler32_neon.o adler32_neon.lo armfeature.o armfeature.lo crc32_acle.o crc32_acle.lo fill_window_arm.o fill_window_arm.lo insert_string_acle.o insert_string_acle.lo +all: \ + adler32_neon.o adler32_neon.lo \ + armfeature.o armfeature.lo \ + chunkset_neon.o chunkset_neon.lo \ + crc32_acle.o crc32_acle.lo \ + slide_neon.o slide_neon.lo \ + insert_string_acle.o insert_string_acle.lo adler32_neon.o: - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_neon.c + $(CC) $(CFLAGS) $(NEONFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_neon.c adler32_neon.lo: - $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_neon.c + $(CC) $(SFLAGS) $(NEONFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_neon.c armfeature.o: $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/armfeature.c @@ -26,23 +34,29 @@ armfeature.o: armfeature.lo: $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/armfeature.c +chunkset_neon.o: + $(CC) $(CFLAGS) $(NEONFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_neon.c + +chunkset_neon.lo: + $(CC) $(SFLAGS) $(NEONFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_neon.c + crc32_acle.o: - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_acle.c + $(CC) $(CFLAGS) $(ACLEFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_acle.c crc32_acle.lo: - $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_acle.c + $(CC) $(SFLAGS) $(ACLEFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_acle.c -fill_window_arm.o: - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/fill_window_arm.c +slide_neon.o: + $(CC) $(CFLAGS) $(NEONFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_neon.c -fill_window_arm.lo: - $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/fill_window_arm.c +slide_neon.lo: + $(CC) $(SFLAGS) $(NEONFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_neon.c insert_string_acle.o: - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_acle.c + $(CC) $(CFLAGS) $(ACLEFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_acle.c insert_string_acle.lo: - $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_acle.c + $(CC) $(SFLAGS) $(ACLEFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_acle.c mostlyclean: clean clean: diff --git a/libs/zlibng/arch/arm/adler32_neon.c b/libs/zlibng/arch/arm/adler32_neon.c index 3e0ee4dd8..adda6f61d 100644 --- a/libs/zlibng/arch/arm/adler32_neon.c +++ b/libs/zlibng/arch/arm/adler32_neon.c @@ -2,24 +2,16 @@ * Copyright (C) 2017 ARM Holdings Inc. * Author: Adenilson Cavalcanti * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. + * For conditions of distribution and use, see copyright notice in zlib.h */ -#include "adler32_neon.h" -#if defined(__ARM_NEON__) || defined(__ARM_NEON) -#include -#include "adler32_p.h" +#ifdef ARM_NEON_ADLER32 +#ifdef _M_ARM64 +# include +#else +# include +#endif +#include "../../zutil.h" +#include "../../adler32_p.h" static void NEON_accum32(uint32_t *s, const unsigned char *buf, size_t len) { static const uint8_t taps[32] = { @@ -109,7 +101,7 @@ uint32_t adler32_neon(uint32_t adler, const unsigned char *buf, size_t len) { for (i = 0; i < len; i += n) { if ((i + n) > len) - n = len - i; + n = (int)(len - i); if (n < 16) break; diff --git a/libs/zlibng/arch/arm/adler32_neon.h b/libs/zlibng/arch/arm/adler32_neon.h deleted file mode 100644 index 1cb278c7c..000000000 --- a/libs/zlibng/arch/arm/adler32_neon.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (C) 1995-2011, 2016 Mark Adler - * Copyright (C) 2017 ARM Holdings Inc. - * Author: Adenilson Cavalcanti - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - */ -#ifndef __ADLER32_NEON__ -#define __ADLER32_NEON__ - -#if defined(__ARM_NEON__) || defined(__ARM_NEON) -// Depending on the compiler flavor, size_t may be defined in one or the other header. See: -// http://stackoverflow.com/questions/26410466/gcc-linaro-compiler-throws-error-unknown-type-name-size-t -#include -#include -uint32_t adler32_neon(uint32_t adler, const unsigned char *buf, size_t len); -#endif -#endif diff --git a/libs/zlibng/arch/arm/arm.h b/libs/zlibng/arch/arm/arm.h index baee87f18..378006efb 100644 --- a/libs/zlibng/arch/arm/arm.h +++ b/libs/zlibng/arch/arm/arm.h @@ -8,6 +8,6 @@ extern int arm_cpu_has_neon; extern int arm_cpu_has_crc32; -void ZLIB_INTERNAL arm_check_features(void); +void Z_INTERNAL arm_check_features(void); #endif /* ARM_H_ */ diff --git a/libs/zlibng/arch/arm/armfeature.c b/libs/zlibng/arch/arm/armfeature.c index f7ccdc460..cf31a48f0 100644 --- a/libs/zlibng/arch/arm/armfeature.c +++ b/libs/zlibng/arch/arm/armfeature.c @@ -1,50 +1,69 @@ -#include "zutil.h" +#include "../../zutil.h" #if defined(__linux__) -# include -# include +# include +# include +#elif defined(__FreeBSD__) && defined(__aarch64__) +# include +# ifndef ID_AA64ISAR0_CRC32_VAL +# define ID_AA64ISAR0_CRC32_VAL ID_AA64ISAR0_CRC32 +# endif +#elif defined(__APPLE__) +# include #elif defined(_WIN32) -# include +# include #endif static int arm_has_crc32() { #if defined(__linux__) && defined(HWCAP2_CRC32) - return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0 ? 1 : 0; + return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0 ? 1 : 0; +#elif defined(__FreeBSD__) && defined(__aarch64__) + return getenv("QEMU_EMULATING") == NULL + && ID_AA64ISAR0_CRC32_VAL(READ_SPECIALREG(id_aa64isar0_el1)) >= ID_AA64ISAR0_CRC32_BASE; +#elif defined(__APPLE__) + int hascrc32; + size_t size = sizeof(hascrc32); + return sysctlbyname("hw.optional.armv8_crc32", &hascrc32, &size, NULL, 0) == 0 + && hascrc32 == 1; #elif defined(ARM_NOCHECK_ACLE) - return 1; + return 1; #else - return 0; + return 0; #endif } /* AArch64 has neon. */ -#if !defined(__aarch64__) -static inline int arm_has_neon() -{ - #if defined(__linux__) && defined(HWCAP_NEON) +#if !defined(__aarch64__) && !defined(_M_ARM64) +static inline int arm_has_neon() { +#if defined(__linux__) && defined(HWCAP_NEON) return (getauxval(AT_HWCAP) & HWCAP_NEON) != 0 ? 1 : 0; - #elif defined(_M_ARM) && defined(WINAPI_FAMILY_PARTITION) - #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) +#elif defined(__APPLE__) + int hasneon; + size_t size = sizeof(hasneon); + return sysctlbyname("hw.optional.neon", &hasneon, &size, NULL, 0) == 0 + && hasneon == 1; +#elif defined(_M_ARM) && defined(WINAPI_FAMILY_PARTITION) +# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) return 1; /* Always supported */ - #endif - #endif +# endif +#endif - #if defined(ARM_NOCHECK_NEON) +#if defined(ARM_NOCHECK_NEON) return 1; - #else - return 0; - #endif -} -#endif - -ZLIB_INTERNAL int arm_cpu_has_neon; -ZLIB_INTERNAL int arm_cpu_has_crc32; - -void ZLIB_INTERNAL arm_check_features(void) { -#if defined(__aarch64__) - arm_cpu_has_neon = 1; /* always available */ #else - arm_cpu_has_neon = arm_has_neon(); + return 0; #endif - arm_cpu_has_crc32 = arm_has_crc32(); +} +#endif + +Z_INTERNAL int arm_cpu_has_neon; +Z_INTERNAL int arm_cpu_has_crc32; + +void Z_INTERNAL arm_check_features(void) { +#if defined(__aarch64__) || defined(_M_ARM64) + arm_cpu_has_neon = 1; /* always available */ +#else + arm_cpu_has_neon = arm_has_neon(); +#endif + arm_cpu_has_crc32 = arm_has_crc32(); } diff --git a/libs/zlibng/arch/arm/chunkset_neon.c b/libs/zlibng/arch/arm/chunkset_neon.c new file mode 100644 index 000000000..e9cbcb1ba --- /dev/null +++ b/libs/zlibng/arch/arm/chunkset_neon.c @@ -0,0 +1,54 @@ +/* chunkset_neon.c -- NEON inline functions to copy small data chunks. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef ARM_NEON_CHUNKSET +#ifdef _M_ARM64 +# include +#else +# include +#endif +#include "../../zbuild.h" +#include "../../zutil.h" + +typedef uint8x16_t chunk_t; + +#define HAVE_CHUNKMEMSET_1 +#define HAVE_CHUNKMEMSET_2 +#define HAVE_CHUNKMEMSET_4 +#define HAVE_CHUNKMEMSET_8 + +static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) { + *chunk = vld1q_dup_u8(from); +} + +static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) { + *chunk = vreinterpretq_u8_s16(vdupq_n_s16(*(int16_t *)from)); +} + +static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) { + *chunk = vreinterpretq_u8_s32(vdupq_n_s32(*(int32_t *)from)); +} + +static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) { + *chunk = vcombine_u8(vld1_u8(from), vld1_u8(from)); +} + +#define CHUNKSIZE chunksize_neon +#define CHUNKCOPY chunkcopy_neon +#define CHUNKCOPY_SAFE chunkcopy_safe_neon +#define CHUNKUNROLL chunkunroll_neon +#define CHUNKMEMSET chunkmemset_neon +#define CHUNKMEMSET_SAFE chunkmemset_safe_neon + +static inline void loadchunk(uint8_t const *s, chunk_t *chunk) { + *chunk = vld1q_u8(s); +} + +static inline void storechunk(uint8_t *out, chunk_t *chunk) { + vst1q_u8(out, *chunk); +} + +#include "chunkset_tpl.h" + +#endif diff --git a/libs/zlibng/arch/arm/crc32_acle.c b/libs/zlibng/arch/arm/crc32_acle.c index 540603545..88ba6c38c 100644 --- a/libs/zlibng/arch/arm/crc32_acle.c +++ b/libs/zlibng/arch/arm/crc32_acle.c @@ -5,21 +5,16 @@ * */ -#ifdef __ARM_FEATURE_CRC32 -# include -# ifdef ZLIB_COMPAT -# include -# else -# include -# endif -# ifdef __linux__ -# include -# endif +#ifdef ARM_ACLE_CRC_HASH +#ifndef _MSC_VER +# include +#endif +#include "../../zutil.h" uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { - register uint32_t c; - register const uint16_t *buf2; - register const uint32_t *buf4; + Z_REGISTER uint32_t c; + Z_REGISTER const uint16_t *buf2; + Z_REGISTER const uint32_t *buf4; c = ~crc; if (len && ((ptrdiff_t)buf & 1)) { @@ -36,7 +31,7 @@ uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { buf4 = (const uint32_t *) buf; } -# if defined(__aarch64__) +#if defined(__aarch64__) if ((len > sizeof(uint32_t)) && ((ptrdiff_t)buf & sizeof(uint32_t))) { c = __crc32w(c, *buf4++); len -= sizeof(uint32_t); @@ -44,7 +39,7 @@ uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { const uint64_t *buf8 = (const uint64_t *) buf4; -# ifdef UNROLL_MORE +#ifdef UNROLL_MORE while (len >= 4 * sizeof(uint64_t)) { c = __crc32d(c, *buf8++); c = __crc32d(c, *buf8++); @@ -52,7 +47,7 @@ uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { c = __crc32d(c, *buf8++); len -= 4 * sizeof(uint64_t); } -# endif +#endif while (len >= sizeof(uint64_t)) { c = __crc32d(c, *buf8++); @@ -74,7 +69,7 @@ uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { } buf = (const unsigned char *) buf2; -# else /* __aarch64__ */ +#else /* __aarch64__ */ # ifdef UNROLL_MORE while (len >= 8 * sizeof(uint32_t)) { @@ -103,7 +98,7 @@ uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { } else { buf = (const unsigned char *) buf4; } -# endif /* __aarch64__ */ +#endif /* __aarch64__ */ if (len) { c = __crc32b(c, *buf); @@ -112,4 +107,4 @@ uint32_t crc32_acle(uint32_t crc, const unsigned char *buf, uint64_t len) { c = ~c; return c; } -#endif /* __ARM_FEATURE_CRC32 */ +#endif diff --git a/libs/zlibng/arch/arm/ctzl.h b/libs/zlibng/arch/arm/ctzl.h index 5ebbde456..77218deec 100644 --- a/libs/zlibng/arch/arm/ctzl.h +++ b/libs/zlibng/arch/arm/ctzl.h @@ -5,7 +5,7 @@ #if defined(_MSC_VER) && !defined(__clang__) static __forceinline unsigned long __builtin_ctzl(unsigned long value) { - return _arm_clz(_arm_rbit(value)); + return _arm_clz(_arm_rbit(value)); } #endif diff --git a/libs/zlibng/arch/arm/fill_window_arm.c b/libs/zlibng/arch/arm/fill_window_arm.c deleted file mode 100644 index c9f042a0d..000000000 --- a/libs/zlibng/arch/arm/fill_window_arm.c +++ /dev/null @@ -1,169 +0,0 @@ -/* fill_window_arm.c -- Optimized hash table shifting for ARM with support for NEON instructions - * Copyright (C) 2017 Mika T. Lindqvist - * - * Authors: - * Mika T. Lindqvist - * Jun He - * - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zbuild.h" -#include "deflate.h" -#include "deflate_p.h" -#include "functable.h" - -extern ZLIB_INTERNAL int read_buf(PREFIX3(stream) *strm, unsigned char *buf, unsigned size); - -#if defined(__ARM_NEON__) || defined(__ARM_NEON) -#include - -/* SIMD version of hash_chain rebase */ -static inline void slide_hash_chain(Pos *table, unsigned int entries, uint16_t window_size) { - register uint16x8_t v, *p; - register size_t n; - - size_t size = entries*sizeof(table[0]); - Assert((size % sizeof(uint16x8_t) * 8 == 0), "hash table size err"); - - Assert(sizeof(Pos) == 2, "Wrong Pos size"); - v = vdupq_n_u16(window_size); - - p = (uint16x8_t *)table; - n = size / (sizeof(uint16x8_t) * 8); - do { - p[0] = vqsubq_u16(p[0], v); - p[1] = vqsubq_u16(p[1], v); - p[2] = vqsubq_u16(p[2], v); - p[3] = vqsubq_u16(p[3], v); - p[4] = vqsubq_u16(p[4], v); - p[5] = vqsubq_u16(p[5], v); - p[6] = vqsubq_u16(p[6], v); - p[7] = vqsubq_u16(p[7], v); - p += 8; - } while (--n); -} -#else -/* generic version for hash rebase */ -static inline void slide_hash_chain(Pos *table, unsigned int entries, uint16_t window_size) { - unsigned int i; - for (i = 0; i < entries; i++) { - table[i] = (table[i] >= window_size) ? (table[i] - window_size) : NIL; - } -} -#endif - -void fill_window_arm(deflate_state *s) { - register unsigned n; - unsigned long more; /* Amount of free space at the end of the window. */ - unsigned int wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = s->window_size - s->lookahead - s->strstart; - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - memcpy(s->window, s->window+wsize, wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - - slide_hash_chain(s->head, s->hash_size, wsize); - slide_hash_chain(s->prev, wsize, wsize); - more += wsize; - } - if (s->strm->avail_in == 0) - break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - unsigned int str = s->strstart - s->insert; - unsigned int insert_cnt = s->insert; - unsigned int slen; - - s->ins_h = s->window[str]; - - if (unlikely(s->lookahead < MIN_MATCH)) - insert_cnt += s->lookahead - MIN_MATCH; - slen = insert_cnt; - if (str >= (MIN_MATCH - 2)) - { - str += 2 - MIN_MATCH; - insert_cnt += MIN_MATCH - 2; - } - if (insert_cnt > 0) - { - functable.insert_string(s, str, insert_cnt); - s->insert -= slen; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - unsigned long curr = s->strstart + (unsigned long)s->lookahead; - unsigned long init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - memset(s->window + curr, 0, init); - s->high_water = curr + init; - } else if (s->high_water < curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = curr + WIN_INIT; - if (init > s->window_size) - init = s->window_size; - init -= s->high_water; - memset(s->window + s->high_water, 0, init); - s->high_water += init; - } - } - - Assert((unsigned long)s->strstart <= s->window_size - MIN_LOOKAHEAD, "not enough room for search"); -} diff --git a/libs/zlibng/arch/arm/insert_string_acle.c b/libs/zlibng/arch/arm/insert_string_acle.c index 081b936ce..2daf9ba3e 100644 --- a/libs/zlibng/arch/arm/insert_string_acle.c +++ b/libs/zlibng/arch/arm/insert_string_acle.c @@ -5,49 +5,18 @@ * */ -#if defined(__ARM_FEATURE_CRC32) && defined(ARM_ACLE_CRC_HASH) -#include -#include "zbuild.h" -#include "deflate.h" - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count) { - Pos p, lp, ret; - - if (unlikely(count == 0)) { - return s->prev[str & s->w_mask]; - } - - ret = 0; - lp = str + count - 1; /* last position */ - - for (p = str; p <= lp; p++) { - uint32_t val, h, hm; - memcpy(&val, &s->window[p], sizeof(val)); - - if (s->level >= TRIGGER_LEVEL) - val &= 0xFFFFFF; - - h = __crc32w(0, val); - hm = h & s->hash_mask; - - Pos head = s->head[hm]; - if (head != p) { - s->prev[p & s->w_mask] = head; - s->head[hm] = p; - if (p == lp) - ret = head; - } else if (p == lp) { - ret = p; - } - } - return ret; -} +#ifdef ARM_ACLE_CRC_HASH +#ifndef _MSC_VER +# include +#endif +#include "../../zbuild.h" +#include "../../deflate.h" + +#define UPDATE_HASH(s, h, val) \ + h = __crc32w(0, val) + +#define INSERT_STRING insert_string_acle +#define QUICK_INSERT_STRING quick_insert_string_acle + +#include "../../insert_string_tpl.h" #endif diff --git a/libs/zlibng/arch/arm/slide_neon.c b/libs/zlibng/arch/arm/slide_neon.c new file mode 100644 index 000000000..f64fa5b5b --- /dev/null +++ b/libs/zlibng/arch/arm/slide_neon.c @@ -0,0 +1,52 @@ +/* slide_neon.c -- Optimized hash table shifting for ARM with support for NEON instructions + * Copyright (C) 2017-2020 Mika T. Lindqvist + * + * Authors: + * Mika T. Lindqvist + * Jun He + * + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#if defined(ARM_NEON_SLIDEHASH) +#ifdef _M_ARM64 +# include +#else +# include +#endif +#include "../../zbuild.h" +#include "../../deflate.h" + +/* SIMD version of hash_chain rebase */ +static inline void slide_hash_chain(Pos *table, unsigned int entries, uint16_t window_size) { + Z_REGISTER uint16x8_t v, *p; + Z_REGISTER size_t n; + + size_t size = entries*sizeof(table[0]); + Assert((size % sizeof(uint16x8_t) * 8 == 0), "hash table size err"); + + Assert(sizeof(Pos) == 2, "Wrong Pos size"); + v = vdupq_n_u16(window_size); + + p = (uint16x8_t *)table; + n = size / (sizeof(uint16x8_t) * 8); + do { + p[0] = vqsubq_u16(p[0], v); + p[1] = vqsubq_u16(p[1], v); + p[2] = vqsubq_u16(p[2], v); + p[3] = vqsubq_u16(p[3], v); + p[4] = vqsubq_u16(p[4], v); + p[5] = vqsubq_u16(p[5], v); + p[6] = vqsubq_u16(p[6], v); + p[7] = vqsubq_u16(p[7], v); + p += 8; + } while (--n); +} + +Z_INTERNAL void slide_hash_neon(deflate_state *s) { + unsigned int wsize = s->w_size; + + slide_hash_chain(s->head, HASH_SIZE, wsize); + slide_hash_chain(s->prev, wsize, wsize); +} +#endif diff --git a/libs/zlibng/arch/power/Makefile.in b/libs/zlibng/arch/power/Makefile.in new file mode 100644 index 000000000..25ebc9d1d --- /dev/null +++ b/libs/zlibng/arch/power/Makefile.in @@ -0,0 +1,49 @@ +# Makefile for POWER-specific files +# Copyright (C) 2020 Matheus Castanho , IBM +# For conditions of distribution and use, see copyright notice in zlib.h + +CC= +CFLAGS= +SFLAGS= +INCLUDES= +SUFFIX= + +SRCDIR=. +SRCTOP=../.. +TOPDIR=$(SRCTOP) + +P8FLAGS=-mcpu=power8 + +all: power.o \ + power.lo \ + adler32_power8.o \ + adler32_power8.lo \ + slide_hash_power8.o \ + slide_hash_power8.lo + +power.o: + $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/power.c + +power.lo: + $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/power.c + +adler32_power8.o: + $(CC) $(CFLAGS) $(P8FLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_power8.c + +adler32_power8.lo: + $(CC) $(SFLAGS) $(P8FLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_power8.c + +slide_hash_power8.o: + $(CC) $(CFLAGS) $(P8FLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_power8.c + +slide_hash_power8.lo: + $(CC) $(SFLAGS) $(P8FLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_power8.c + +mostlyclean: clean +clean: + rm -f *.o *.lo *~ + rm -rf objs + rm -f *.gcda *.gcno *.gcov + +distclean: + rm -f Makefile diff --git a/libs/zlibng/arch/power/adler32_power8.c b/libs/zlibng/arch/power/adler32_power8.c new file mode 100644 index 000000000..cda51aa80 --- /dev/null +++ b/libs/zlibng/arch/power/adler32_power8.c @@ -0,0 +1,154 @@ +/* Adler32 for POWER8 using VSX instructions. + * Copyright (C) 2020 IBM Corporation + * Author: Rogerio Alves + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Calculate adler32 checksum for 16 bytes at once using POWER8+ VSX (vector) + * instructions. + * + * If adler32 do 1 byte at time on the first iteration s1 is s1_0 (_n means + * iteration n) is the initial value of adler - at start _0 is 1 unless + * adler initial value is different than 1. So s1_1 = s1_0 + c[0] after + * the first calculation. For the iteration s1_2 = s1_1 + c[1] and so on. + * Hence, for iteration N, s1_N = s1_(N-1) + c[N] is the value of s1 on + * after iteration N. + * + * Therefore, for s2 and iteration N, s2_N = s2_0 + N*s1_N + N*c[0] + + * N-1*c[1] + ... + c[N] + * + * In a more general way: + * + * s1_N = s1_0 + sum(i=1 to N)c[i] + * s2_N = s2_0 + N*s1 + sum (i=1 to N)(N-i+1)*c[i] + * + * Where s1_N, s2_N are the values for s1, s2 after N iterations. So if we + * can process N-bit at time we can do this at once. + * + * Since VSX can support 16-bit vector instructions, we can process + * 16-bit at time using N = 16 we have: + * + * s1 = s1_16 = s1_(16-1) + c[16] = s1_0 + sum(i=1 to 16)c[i] + * s2 = s2_16 = s2_0 + 16*s1 + sum(i=1 to 16)(16-i+1)*c[i] + * + * After the first iteration we calculate the adler32 checksum for 16 bytes. + * + * For more background about adler32 please check the RFC: + * https://www.ietf.org/rfc/rfc1950.txt + */ + +#ifdef POWER8_VSX_ADLER32 + +#include +#include "zbuild.h" +#include "zutil.h" +#include "adler32_p.h" + +/* Vector across sum unsigned int (saturate). */ +inline vector unsigned int vec_sumsu(vector unsigned int __a, vector unsigned int __b) { + __b = vec_sld(__a, __a, 8); + __b = vec_add(__b, __a); + __a = vec_sld(__b, __b, 4); + __a = vec_add(__a, __b); + + return __a; +} + +uint32_t adler32_power8(uint32_t adler, const unsigned char* buf, size_t len) { + uint32_t s1 = adler & 0xffff; + uint32_t s2 = (adler >> 16) & 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (UNLIKELY(len == 1)) + return adler32_len_1(s1, buf, s2); + + /* If buffer is empty or len=0 we need to return adler initial value. */ + if (UNLIKELY(buf == NULL)) + return 1; + + /* This is faster than VSX code for len < 64. */ + if (len < 64) + return adler32_len_64(s1, buf, len, s2); + + /* Use POWER VSX instructions for len >= 64. */ + const vector unsigned int v_zeros = { 0 }; + const vector unsigned char v_mul = {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, + 6, 5, 4, 3, 2, 1}; + const vector unsigned char vsh = vec_splat_u8(4); + const vector unsigned int vmask = {0xffffffff, 0x0, 0x0, 0x0}; + vector unsigned int vs1 = { 0 }; + vector unsigned int vs2 = { 0 }; + vector unsigned int vs1_save = { 0 }; + vector unsigned int vsum1, vsum2; + vector unsigned char vbuf; + int n; + + vs1[0] = s1; + vs2[0] = s2; + + /* Do length bigger than NMAX in blocks of NMAX size. */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; + do { + vbuf = vec_xl(0, (unsigned char *) buf); + vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */ + /* sum(i=1 to 16) buf[i]*(16-i+1). */ + vsum2 = vec_msum(vbuf, v_mul, v_zeros); + /* Save vs1. */ + vs1_save = vec_add(vs1_save, vs1); + /* Accumulate the sums. */ + vs1 = vec_add(vsum1, vs1); + vs2 = vec_add(vsum2, vs2); + + buf += 16; + } while (--n); + /* Once each block of NMAX size. */ + vs1 = vec_sumsu(vs1, vsum1); + vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */ + vs2 = vec_add(vs1_save, vs2); + vs2 = vec_sumsu(vs2, vsum2); + + /* vs1[0] = (s1_i + sum(i=1 to 16)buf[i]) mod 65521. */ + vs1[0] = vs1[0] % BASE; + /* vs2[0] = s2_i + 16*s1_save + + sum(i=1 to 16)(16-i+1)*buf[i] mod 65521. */ + vs2[0] = vs2[0] % BASE; + + vs1 = vec_and(vs1, vmask); + vs2 = vec_and(vs2, vmask); + vs1_save = v_zeros; + } + + /* len is less than NMAX one modulo is needed. */ + if (len >= 16) { + while (len >= 16) { + len -= 16; + + vbuf = vec_xl(0, (unsigned char *) buf); + + vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */ + /* sum(i=1 to 16) buf[i]*(16-i+1). */ + vsum2 = vec_msum(vbuf, v_mul, v_zeros); + /* Save vs1. */ + vs1_save = vec_add(vs1_save, vs1); + /* Accumulate the sums. */ + vs1 = vec_add(vsum1, vs1); + vs2 = vec_add(vsum2, vs2); + + buf += 16; + } + /* Since the size will be always less than NMAX we do this once. */ + vs1 = vec_sumsu(vs1, vsum1); + vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */ + vs2 = vec_add(vs1_save, vs2); + vs2 = vec_sumsu(vs2, vsum2); + } + /* Copy result back to s1, s2 (mod 65521). */ + s1 = vs1[0] % BASE; + s2 = vs2[0] % BASE; + + /* Process tail (len < 16).and return */ + return adler32_len_16(s1, buf, len, s2); +} + +#endif /* POWER8_VSX_ADLER32 */ diff --git a/libs/zlibng/arch/power/power.c b/libs/zlibng/arch/power/power.c new file mode 100644 index 000000000..f93b586d5 --- /dev/null +++ b/libs/zlibng/arch/power/power.c @@ -0,0 +1,19 @@ +/* POWER feature check + * Copyright (C) 2020 Matheus Castanho , IBM + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include +#include "../../zutil.h" + +Z_INTERNAL int power_cpu_has_arch_2_07; + +void Z_INTERNAL power_check_features(void) { + unsigned long hwcap2; + hwcap2 = getauxval(AT_HWCAP2); + +#ifdef POWER8 + if (hwcap2 & PPC_FEATURE2_ARCH_2_07) + power_cpu_has_arch_2_07 = 1; +#endif +} diff --git a/libs/zlibng/arch/power/power.h b/libs/zlibng/arch/power/power.h new file mode 100644 index 000000000..b36c26141 --- /dev/null +++ b/libs/zlibng/arch/power/power.h @@ -0,0 +1,13 @@ +/* power.h -- check for POWER CPU features + * Copyright (C) 2020 Matheus Castanho , IBM + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifndef POWER_H_ +#define POWER_H_ + +extern int power_cpu_has_arch_2_07; + +void Z_INTERNAL power_check_features(void); + +#endif /* POWER_H_ */ diff --git a/libs/zlibng/arch/power/slide_hash_power8.c b/libs/zlibng/arch/power/slide_hash_power8.c new file mode 100644 index 000000000..b1e30cea0 --- /dev/null +++ b/libs/zlibng/arch/power/slide_hash_power8.c @@ -0,0 +1,60 @@ +/* Optimized slide_hash for POWER processors + * Copyright (C) 2019-2020 IBM Corporation + * Author: Matheus Castanho + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef POWER8_VSX_SLIDEHASH + +#include +#include "zbuild.h" +#include "deflate.h" + +static inline void slide_hash_power8_loop(deflate_state *s, unsigned n_elems, Pos *table_end) { + vector unsigned short vw, vm, *vp; + unsigned chunks; + + /* Each vector register (chunk) corresponds to 128 bits == 8 Posf, + * so instead of processing each of the n_elems in the hash table + * individually, we can do it in chunks of 8 with vector instructions. + * + * This function is only called from slide_hash_power8(), and both calls + * pass n_elems as a power of 2 higher than 2^7, as defined by + * deflateInit2_(), so n_elems will always be a multiple of 8. */ + chunks = n_elems >> 3; + Assert(n_elems % 8 == 0, "Weird hash table size!"); + + /* This type casting is safe since s->w_size is always <= 64KB + * as defined by deflateInit2_() and Posf == unsigned short */ + vw[0] = (Pos) s->w_size; + vw = vec_splat(vw,0); + + vp = (vector unsigned short *) table_end; + + do { + /* Processing 8 elements at a time */ + vp--; + vm = *vp; + + /* This is equivalent to: m >= w_size ? m - w_size : 0 + * Since we are using a saturated unsigned subtraction, any + * values that are > w_size will be set to 0, while the others + * will be subtracted by w_size. */ + *vp = vec_subs(vm,vw); + } while (--chunks); +} + +void Z_INTERNAL slide_hash_power8(deflate_state *s) { + unsigned int n; + Pos *p; + + n = HASH_SIZE; + p = &s->head[n]; + slide_hash_power8_loop(s,n,p); + + n = s->w_size; + p = &s->prev[n]; + slide_hash_power8_loop(s,n,p); +} + +#endif /* POWER8_VSX_SLIDEHASH */ diff --git a/libs/zlibng/arch/s390/README.md b/libs/zlibng/arch/s390/README.md index 6995b106e..641c63a83 100644 --- a/libs/zlibng/arch/s390/README.md +++ b/libs/zlibng/arch/s390/README.md @@ -1,6 +1,7 @@ -This directory contains IBM Z DEFLATE CONVERSION CALL support for -zlib-ng. In order to enable it, the following build commands should be -used: +# Introduction + +This directory contains SystemZ deflate hardware acceleration support. +It can be enabled using the following build commands: $ ./configure --with-dfltcc-deflate --with-dfltcc-inflate $ make @@ -10,60 +11,206 @@ or $ cmake -DWITH_DFLTCC_DEFLATE=1 -DWITH_DFLTCC_INFLATE=1 . $ make -When built like this, zlib-ng would compress in hardware on level 1, -and in software on all other levels. Decompression will always happen -in hardware. In order to enable DFLTCC compression for levels 1-6 (i.e. -to make it used by default) one could add -DDFLTCC_LEVEL_MASK=0x7e to -CFLAGS when building zlib-ng. +When built like this, zlib-ng would compress using hardware on level 1, +and using software on all other levels. Decompression will always happen +in hardware. In order to enable hardware compression for levels 1-6 +(i.e. to make it used by default) one could add +`-DDFLTCC_LEVEL_MASK=0x7e` to CFLAGS when building zlib-ng. -Two DFLTCC compression calls produce the same results only when they -both are made on machines of the same generation, and when the -respective buffers have the same offset relative to the start of the -page. Therefore care should be taken when using hardware compression -when reproducible results are desired. +SystemZ deflate hardware acceleration is available on [IBM z15]( +https://www.ibm.com/products/z15) and newer machines under the name [ +"Integrated Accelerator for zEnterprise Data Compression"]( +https://www.ibm.com/support/z-content-solutions/compression/). The +programming interface to it is a machine instruction called DEFLATE +CONVERSION CALL (DFLTCC). It is documented in Chapter 26 of [Principles +of Operation](http://publibfp.dhe.ibm.com/epubs/pdf/a227832c.pdf). Both +the code and the rest of this document refer to this feature simply as +"DFLTCC". + +# Performance + +Performance figures are published [here]( +https://github.com/iii-i/zlib-ng/wiki/Performance-with-dfltcc-patch-applied-and-dfltcc-support-built-on-dfltcc-enabled-machine +). The compression speed-up can be as high as 110x and the decompression +speed-up can be as high as 15x. + +# Limitations + +Two DFLTCC compression calls with identical inputs are not guaranteed to +produce identical outputs. Therefore care should be taken when using +hardware compression when reproducible results are desired. In +particular, zlib-ng-specific `zng_deflateSetParams` call allows setting +`Z_DEFLATE_REPRODUCIBLE` parameter, which disables DFLTCC support for a +particular stream. DFLTCC does not support every single zlib-ng feature, in particular: -* inflate(Z_BLOCK) and inflate(Z_TREES) -* inflateMark() -* inflatePrime() -* deflateParams() after the first deflate() call +* `inflate(Z_BLOCK)` and `inflate(Z_TREES)` +* `inflateMark()` +* `inflatePrime()` +* `inflateSyncPoint()` When used, these functions will either switch to software, or, in case this is not possible, gracefully fail. -All SystemZ-specific code lives in a separate file and is integrated -with the rest of zlib-ng using hook macros, which are explained below. +# Code structure + +All SystemZ-specific code lives in `arch/s390` directory and is +integrated with the rest of zlib-ng using hook macros. + +## Hook macros DFLTCC takes as arguments a parameter block, an input buffer, an output -buffer and a window. ZALLOC_STATE, ZFREE_STATE, ZCOPY_STATE, -ZALLOC_WINDOW and TRY_FREE_WINDOW macros encapsulate allocation details -for the parameter block (which is allocated alongside zlib-ng state) -and the window (which must be page-aligned). +buffer and a window. `ZALLOC_STATE()`, `ZFREE_STATE()`, `ZCOPY_STATE()`, +`ZALLOC_WINDOW()` and `TRY_FREE_WINDOW()` macros encapsulate allocation +details for the parameter block (which is allocated alongside zlib-ng +state) and the window (which must be page-aligned). -While for inflate software and hardware window formats match, this is -not the case for deflate. Therefore, deflateSetDictionary and -deflateGetDictionary need special handling, which is triggered using -the DEFLATE_SET_DICTIONARY_HOOK and DEFLATE_GET_DICTIONARY_HOOK macros. +While inflate software and hardware window formats match, this is not +the case for deflate. Therefore, `deflateSetDictionary()` and +`deflateGetDictionary()` need special handling, which is triggered using +`DEFLATE_SET_DICTIONARY_HOOK()` and `DEFLATE_GET_DICTIONARY_HOOK()` +macros. -deflateResetKeep() and inflateResetKeep() update the DFLTCC parameter -block using DEFLATE_RESET_KEEP_HOOK and INFLATE_RESET_KEEP_HOOK macros. +`deflateResetKeep()` and `inflateResetKeep()` update the DFLTCC +parameter block using `DEFLATE_RESET_KEEP_HOOK()` and +`INFLATE_RESET_KEEP_HOOK()` macros. -DEFLATE_PARAMS_HOOK, INFLATE_PRIME_HOOK and INFLATE_MARK_HOOK macros -make the unsupported deflateParams(), inflatePrime() and inflateMark() -calls fail gracefully. +`INFLATE_PRIME_HOOK()`, `INFLATE_MARK_HOOK()` and +`INFLATE_SYNC_POINT_HOOK()` macros make the respective unsupported +calls gracefully fail. + +`DEFLATE_PARAMS_HOOK()` implements switching between hardware and +software compression mid-stream using `deflateParams()`. Switching +normally entails flushing the current block, which might not be possible +in low memory situations. `deflateParams()` uses `DEFLATE_DONE()` hook +in order to detect and gracefully handle such situations. The algorithm implemented in hardware has different compression ratio -than the one implemented in software. DEFLATE_BOUND_ADJUST_COMPLEN and -DEFLATE_NEED_CONSERVATIVE_BOUND macros make deflateBound() return the -correct results for the hardware implementation. +than the one implemented in software. `DEFLATE_BOUND_ADJUST_COMPLEN()` +and `DEFLATE_NEED_CONSERVATIVE_BOUND()` macros make `deflateBound()` +return the correct results for the hardware implementation. -Actual compression and decompression are handled by DEFLATE_HOOK and -INFLATE_TYPEDO_HOOK macros. Since inflation with DFLTCC manages the -window on its own, calling updatewindow() is suppressed using -INFLATE_NEED_UPDATEWINDOW() macro. +Actual compression and decompression are handled by `DEFLATE_HOOK()` and +`INFLATE_TYPEDO_HOOK()` macros. Since inflation with DFLTCC manages the +window on its own, calling `updatewindow()` is suppressed using +`INFLATE_NEED_UPDATEWINDOW()` macro. In addition to compression, DFLTCC computes CRC-32 and Adler-32 checksums, therefore, whenever it's used, software checksumming is -suppressed using DEFLATE_NEED_CHECKSUM and INFLATE_NEED_CHECKSUM +suppressed using `DEFLATE_NEED_CHECKSUM()` and `INFLATE_NEED_CHECKSUM()` macros. + +While software always produces reproducible compression results, this +is not the case for DFLTCC. Therefore, zlib-ng users are given the +ability to specify whether or not reproducible compression results +are required. While it is always possible to specify this setting +before the compression begins, it is not always possible to do so in +the middle of a deflate stream - the exact conditions for that are +determined by `DEFLATE_CAN_SET_REPRODUCIBLE()` macro. + +## SystemZ-specific code + +When zlib-ng is built with DFLTCC, the hooks described above are +converted to calls to functions, which are implemented in +`arch/s390/dfltcc_*` files. The functions can be grouped in three broad +categories: + +* Base DFLTCC support, e.g. wrapping the machine instruction - + `dfltcc()` and allocating aligned memory - `dfltcc_alloc_state()`. +* Translating between software and hardware data formats, e.g. + `dfltcc_deflate_set_dictionary()`. +* Translating between software and hardware state machines, e.g. + `dfltcc_deflate()` and `dfltcc_inflate()`. + +The functions from the first two categories are fairly simple, however, +various quirks in both software and hardware state machines make the +functions from the third category quite complicated. + +### `dfltcc_deflate()` function + +This function is called by `deflate()` and has the following +responsibilities: + +* Checking whether DFLTCC can be used with the current stream. If this + is not the case, then it returns `0`, making `deflate()` use some + other function in order to compress in software. Otherwise it returns + `1`. +* Block management and Huffman table generation. DFLTCC ends blocks only + when explicitly instructed to do so by the software. Furthermore, + whether to use fixed or dynamic Huffman tables must also be determined + by the software. Since looking at data in order to gather statistics + would negate performance benefits, the following approach is used: the + first `DFLTCC_FIRST_FHT_BLOCK_SIZE` bytes are placed into a fixed + block, and every next `DFLTCC_BLOCK_SIZE` bytes are placed into + dynamic blocks. +* Writing EOBS. Block Closing Control bit in the parameter block + instructs DFLTCC to write EOBS, however, certain conditions need to be + met: input data length must be non-zero or Continuation Flag must be + set. To put this in simpler terms, DFLTCC will silently refuse to + write EOBS if this is the only thing that it is asked to do. Since the + code has to be able to emit EOBS in software anyway, in order to avoid + tricky corner cases Block Closing Control is never used. Whether to + write EOBS is instead controlled by `soft_bcc` variable. +* Triggering block post-processing. Depending on flush mode, `deflate()` + must perform various additional actions when a block or a stream ends. + `dfltcc_deflate()` informs `deflate()` about this using + `block_state *result` parameter. +* Converting software state fields into hardware parameter block fields, + and vice versa. For example, `wrap` and Check Value Type or `bi_valid` + and Sub-Byte Boundary. Certain fields cannot be translated and must + persist untouched in the parameter block between calls, for example, + Continuation Flag or Continuation State Buffer. +* Handling flush modes and low-memory situations. These aspects are + quite intertwined and pervasive. The general idea here is that the + code must not do anything in software - whether explicitly by e.g. + calling `send_eobs()`, or implicitly - by returning to `deflate()` + with certain return and `*result` values, when Continuation Flag is + set. +* Ending streams. When a new block is started and flush mode is + `Z_FINISH`, Block Header Final parameter block bit is used to mark + this block as final. However, sometimes an empty final block is + needed, and, unfortunately, just like with EOBS, DFLTCC will silently + refuse to do this. The general idea of DFLTCC implementation is to + rely as much as possible on the existing code. Here in order to do + this, the code pretends that it does not support DFLTCC, which makes + `deflate()` call a software compression function, which writes an + empty final block. Whether this is required is controlled by + `need_empty_block` variable. +* Error handling. This is simply converting + Operation-Ending-Supplemental Code to string. Errors can only happen + due to things like memory corruption, and therefore they don't affect + the `deflate()` return code. + +### `dfltcc_inflate()` function + +This function is called by `inflate()` from the `TYPEDO` state (that is, +when all the metadata is parsed and the stream is positioned at the type +bits of deflate block header) and it's responsible for the following: + +* Falling back to software when flush mode is `Z_BLOCK` or `Z_TREES`. + Unfortunately, there is no way to ask DFLTCC to stop decompressing on + block or tree boundary. +* `inflate()` decompression loop management. This is controlled using + the return value, which can be either `DFLTCC_INFLATE_BREAK` or + `DFLTCC_INFLATE_CONTINUE`. +* Converting software state fields into hardware parameter block fields, + and vice versa. For example, `whave` and History Length or `wnext` and + History Offset. +* Ending streams. This instructs `inflate()` to return `Z_STREAM_END` + and is controlled by `last` state field. +* Error handling. Like deflate, error handling comprises + Operation-Ending-Supplemental Code to string conversion. Unlike + deflate, errors may happen due to bad inputs, therefore they are + propagated to `inflate()` by setting `mode` field to `MEM` or `BAD`. + +# Testing + +Given complexity of DFLTCC machine instruction, it is not clear whether +QEMU TCG will ever support it. At the time of writing, one has to have +access to an IBM z15+ VM or LPAR in order to test DFLTCC support. Since +DFLTCC is a non-privileged instruction, neither special VM/LPAR +configuration nor root are required. + +Still, zlib-ng CI has a few QEMU TCG-based configurations that check +whether fallback to software is working. diff --git a/libs/zlibng/arch/s390/dfltcc_common.c b/libs/zlibng/arch/s390/dfltcc_common.c index 2f2e22fd0..c82c3b220 100644 --- a/libs/zlibng/arch/s390/dfltcc_common.c +++ b/libs/zlibng/arch/s390/dfltcc_common.c @@ -1,6 +1,6 @@ /* dfltcc_deflate.c - IBM Z DEFLATE CONVERSION CALL general support. */ -#include "zbuild.h" +#include "../../zbuild.h" #include "dfltcc_common.h" #include "dfltcc_detail.h" @@ -12,20 +12,31 @@ `posix_memalign' is not an option. Thus, we overallocate and take the aligned portion of the buffer. */ -static inline int is_dfltcc_enabled(void) -{ +static inline int is_dfltcc_enabled(void) { uint64_t facilities[(DFLTCC_FACILITY / 64) + 1]; - register uint8_t r0 __asm__("r0"); + Z_REGISTER uint8_t r0 __asm__("r0"); memset(facilities, 0, sizeof(facilities)); r0 = sizeof(facilities) / sizeof(facilities[0]) - 1; - __asm__ volatile("stfle %[facilities]\n" : [facilities] "=Q" (facilities), [r0] "+r" (r0) :: "cc"); + /* STFLE is supported since z9-109 and only in z/Architecture mode. When + * compiling with -m31, gcc defaults to ESA mode, however, since the kernel + * is 64-bit, it's always z/Architecture mode at runtime. + */ + __asm__ volatile( +#ifndef __clang__ + ".machinemode push\n" + ".machinemode zarch\n" +#endif + "stfle %[facilities]\n" +#ifndef __clang__ + ".machinemode pop\n" +#endif + : [facilities] "=Q" (facilities), [r0] "+r" (r0) :: "cc"); return is_bit_set((const char *)facilities, DFLTCC_FACILITY); } -void ZLIB_INTERNAL dfltcc_reset(PREFIX3(streamp) strm, uInt size) -{ - struct dfltcc_state *dfltcc_state = (struct dfltcc_state *)((char *)strm->state + size); +void Z_INTERNAL dfltcc_reset(PREFIX3(streamp) strm, uInt size) { + struct dfltcc_state *dfltcc_state = (struct dfltcc_state *)((char *)strm->state + ALIGN_UP(size, 8)); struct dfltcc_qaf_param *param = (struct dfltcc_qaf_param *)&dfltcc_state->param; /* Initialize available functions */ @@ -47,24 +58,17 @@ void ZLIB_INTERNAL dfltcc_reset(PREFIX3(streamp) strm, uInt size) dfltcc_state->param.ribm = DFLTCC_RIBM; } -void ZLIB_INTERNAL *dfltcc_alloc_state(PREFIX3(streamp) strm, uInt items, uInt size) -{ - Assert((items * size) % 8 == 0, - "The size of zlib-ng state must be a multiple of 8"); - return ZALLOC(strm, items * size + sizeof(struct dfltcc_state), sizeof(unsigned char)); +void Z_INTERNAL *dfltcc_alloc_state(PREFIX3(streamp) strm, uInt items, uInt size) { + return ZALLOC(strm, ALIGN_UP(items * size, 8) + sizeof(struct dfltcc_state), sizeof(unsigned char)); } -void ZLIB_INTERNAL dfltcc_copy_state(void *dst, const void *src, uInt size) -{ - memcpy(dst, src, size + sizeof(struct dfltcc_state)); +void Z_INTERNAL dfltcc_copy_state(void *dst, const void *src, uInt size) { + memcpy(dst, src, ALIGN_UP(size, 8) + sizeof(struct dfltcc_state)); } static const int PAGE_ALIGN = 0x1000; -#define ALIGN_UP(p, size) (__typeof__(p))(((uintptr_t)(p) + ((size) - 1)) & ~((size) - 1)) - -void ZLIB_INTERNAL *dfltcc_alloc_window(PREFIX3(streamp) strm, uInt items, uInt size) -{ +void Z_INTERNAL *dfltcc_alloc_window(PREFIX3(streamp) strm, uInt items, uInt size) { void *p; void *w; @@ -79,8 +83,7 @@ void ZLIB_INTERNAL *dfltcc_alloc_window(PREFIX3(streamp) strm, uInt items, uInt return w; } -void ZLIB_INTERNAL dfltcc_free_window(PREFIX3(streamp) strm, void *w) -{ +void Z_INTERNAL dfltcc_free_window(PREFIX3(streamp) strm, void *w) { if (w) ZFREE(strm, *(void **)((unsigned char *)w - sizeof(void *))); } diff --git a/libs/zlibng/arch/s390/dfltcc_common.h b/libs/zlibng/arch/s390/dfltcc_common.h index e206e0431..5c3be91b9 100644 --- a/libs/zlibng/arch/s390/dfltcc_common.h +++ b/libs/zlibng/arch/s390/dfltcc_common.h @@ -2,17 +2,17 @@ #define DFLTCC_COMMON_H #ifdef ZLIB_COMPAT -#include "zlib.h" +#include "../../zlib.h" #else -#include "zlib-ng.h" +#include "../../zlib-ng.h" #endif -#include "zutil.h" +#include "../../zutil.h" -void ZLIB_INTERNAL *dfltcc_alloc_state(PREFIX3(streamp) strm, uInt items, uInt size); -void ZLIB_INTERNAL dfltcc_copy_state(void *dst, const void *src, uInt size); -void ZLIB_INTERNAL dfltcc_reset(PREFIX3(streamp) strm, uInt size); -void ZLIB_INTERNAL *dfltcc_alloc_window(PREFIX3(streamp) strm, uInt items, uInt size); -void ZLIB_INTERNAL dfltcc_free_window(PREFIX3(streamp) strm, void *w); +void Z_INTERNAL *dfltcc_alloc_state(PREFIX3(streamp) strm, uInt items, uInt size); +void Z_INTERNAL dfltcc_copy_state(void *dst, const void *src, uInt size); +void Z_INTERNAL dfltcc_reset(PREFIX3(streamp) strm, uInt size); +void Z_INTERNAL *dfltcc_alloc_window(PREFIX3(streamp) strm, uInt items, uInt size); +void Z_INTERNAL dfltcc_free_window(PREFIX3(streamp) strm, void *w); #define ZALLOC_STATE dfltcc_alloc_state diff --git a/libs/zlibng/arch/s390/dfltcc_deflate.c b/libs/zlibng/arch/s390/dfltcc_deflate.c index adab3e000..187865667 100644 --- a/libs/zlibng/arch/s390/dfltcc_deflate.c +++ b/libs/zlibng/arch/s390/dfltcc_deflate.c @@ -13,27 +13,26 @@ $ make */ -#include "zbuild.h" -#include "zutil.h" -#include "deflate.h" +#include "../../zbuild.h" +#include "../../zutil.h" +#include "../../deflate.h" +#include "../../trees_emit.h" #include "dfltcc_deflate.h" #include "dfltcc_detail.h" -static inline int dfltcc_are_params_ok(int level, uInt window_bits, int strategy, uint16_t level_mask) -{ - return (level_mask & ((uint16_t)1 << level)) != 0 && - (window_bits == HB_BITS) && - (strategy == Z_FIXED || strategy == Z_DEFAULT_STRATEGY); -} - - -int ZLIB_INTERNAL dfltcc_can_deflate(PREFIX3(streamp) strm) -{ +static inline int dfltcc_can_deflate_with_params(PREFIX3(streamp) strm, int level, uInt window_bits, int strategy, + int reproducible) { deflate_state *state = (deflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); /* Unsupported compression settings */ - if (!dfltcc_are_params_ok(state->level, state->w_bits, state->strategy, dfltcc_state->level_mask)) + if ((dfltcc_state->level_mask & (1 << level)) == 0) + return 0; + if (window_bits != HB_BITS) + return 0; + if (strategy != Z_FIXED && strategy != Z_DEFAULT_STRATEGY) + return 0; + if (reproducible) return 0; /* Unsupported hardware */ @@ -45,8 +44,13 @@ int ZLIB_INTERNAL dfltcc_can_deflate(PREFIX3(streamp) strm) return 1; } -static inline void dfltcc_gdht(PREFIX3(streamp) strm) -{ +int Z_INTERNAL dfltcc_can_deflate(PREFIX3(streamp) strm) { + deflate_state *state = (deflate_state *)strm->state; + + return dfltcc_can_deflate_with_params(strm, state->level, state->w_bits, state->strategy, state->reproducible); +} + +static inline void dfltcc_gdht(PREFIX3(streamp) strm) { deflate_state *state = (deflate_state *)strm->state; struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param; size_t avail_in = strm->avail_in; @@ -54,8 +58,7 @@ static inline void dfltcc_gdht(PREFIX3(streamp) strm) dfltcc(DFLTCC_GDHT, param, NULL, NULL, &strm->next_in, &avail_in, NULL); } -static inline dfltcc_cc dfltcc_cmpr(PREFIX3(streamp) strm) -{ +static inline dfltcc_cc dfltcc_cmpr(PREFIX3(streamp) strm) { deflate_state *state = (deflate_state *)strm->state; struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param; size_t avail_in = strm->avail_in; @@ -72,11 +75,10 @@ static inline dfltcc_cc dfltcc_cmpr(PREFIX3(streamp) strm) return cc; } -static inline void send_eobs(PREFIX3(streamp) strm, const struct dfltcc_param_v0 *param) -{ +static inline void send_eobs(PREFIX3(streamp) strm, const struct dfltcc_param_v0 *param) { deflate_state *state = (deflate_state *)strm->state; - send_bits(state, bi_reverse(param->eobs >> (15 - param->eobl), param->eobl), param->eobl); + send_bits(state, bi_reverse(param->eobs >> (15 - param->eobl), param->eobl), param->eobl, state->bi_buf, state->bi_valid); flush_pending(strm); if (state->pending != 0) { /* The remaining data is located in pending_out[0:pending]. If someone @@ -93,8 +95,7 @@ static inline void send_eobs(PREFIX3(streamp) strm, const struct dfltcc_param_v0 #endif } -int ZLIB_INTERNAL dfltcc_deflate(PREFIX3(streamp) strm, int flush, block_state *result) -{ +int Z_INTERNAL dfltcc_deflate(PREFIX3(streamp) strm, int flush, block_state *result) { deflate_state *state = (deflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); struct dfltcc_param_v0 *param = &dfltcc_state->param; @@ -104,31 +105,38 @@ int ZLIB_INTERNAL dfltcc_deflate(PREFIX3(streamp) strm, int flush, block_state * int soft_bcc; int no_flush; - if (!dfltcc_can_deflate(strm)) + if (!dfltcc_can_deflate(strm)) { + /* Clear history. */ + if (flush == Z_FULL_FLUSH) + param->hl = 0; return 0; + } again: masked_avail_in = 0; soft_bcc = 0; no_flush = flush == Z_NO_FLUSH; - /* Trailing empty block. Switch to software, except when Continuation Flag - * is set, which means that DFLTCC has buffered some output in the - * parameter block and needs to be called again in order to flush it. + /* No input data. Return, except when Continuation Flag is set, which means + * that DFLTCC has buffered some output in the parameter block and needs to + * be called again in order to flush it. */ - if (flush == Z_FINISH && strm->avail_in == 0 && !param->cf) { - if (param->bcf) { - /* A block is still open, and the hardware does not support closing - * blocks without adding data. Thus, close it manually. - */ + if (strm->avail_in == 0 && !param->cf) { + /* A block is still open, and the hardware does not support closing + * blocks without adding data. Thus, close it manually. + */ + if (!no_flush && param->bcf) { send_eobs(strm, param); param->bcf = 0; } - return 0; - } - - if (strm->avail_in == 0 && !param->cf) { - *result = need_more; + /* Let one of deflate_* functions write a trailing empty block. */ + if (flush == Z_FINISH) + return 0; + /* Clear history. */ + if (flush == Z_FULL_FLUSH) + param->hl = 0; + /* Trigger block post-processing if necessary. */ + *result = no_flush ? need_more : block_done; return 1; } @@ -154,13 +162,18 @@ again: send_eobs(strm, param); param->bcf = 0; dfltcc_state->block_threshold = strm->total_in + dfltcc_state->block_size; - if (strm->avail_out == 0) { - *result = need_more; - return 1; - } } } + /* No space for compressed data. If we proceed, dfltcc_cmpr() will return + * DFLTCC_CC_OP1_TOO_SHORT without buffering header bits, but we will still + * set BCF=1, which is wrong. Avoid complications and return early. + */ + if (strm->avail_out == 0) { + *result = need_more; + return 1; + } + /* The caller gave us too much data. Pass only one block worth of * uncompressed data to DFLTCC and mask the rest, so that on the next * iteration we start a new block. @@ -180,7 +193,7 @@ again: param->cvt = state->wrap == 2 ? CVT_CRC32 : CVT_ADLER32; if (!no_flush) /* We need to close a block. Always do this in software - when there is - * no input data, the hardware will not nohor BCC. */ + * no input data, the hardware will not honor BCC. */ soft_bcc = 1; if (flush == Z_FINISH && !param->bcf) /* We are about to open a BFINAL block, set Block Header Final bit @@ -195,8 +208,8 @@ again: param->sbb = (unsigned int)state->bi_valid; if (param->sbb > 0) *strm->next_out = (unsigned char)state->bi_buf; - if (param->hl) - param->nt = 0; /* Honor history */ + /* Honor history and check value */ + param->nt = 0; param->cv = state->wrap == 2 ? ZSWAP32(strm->adler) : strm->adler; /* When opening a block, choose a Huffman-Table Type */ @@ -277,31 +290,60 @@ again: fly with deflateParams, we need to convert between hardware and software window formats. */ -int ZLIB_INTERNAL dfltcc_deflate_params(PREFIX3(streamp) strm, int level, int strategy) -{ +static int dfltcc_was_deflate_used(PREFIX3(streamp) strm) { + deflate_state *state = (deflate_state *)strm->state; + struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param; + + return strm->total_in > 0 || param->nt == 0 || param->hl > 0; +} + +int Z_INTERNAL dfltcc_deflate_params(PREFIX3(streamp) strm, int level, int strategy, int *flush) { deflate_state *state = (deflate_state *)strm->state; - struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); - struct dfltcc_param_v0 *param = &dfltcc_state->param; int could_deflate = dfltcc_can_deflate(strm); - int can_deflate = dfltcc_are_params_ok(level, state->w_bits, strategy, dfltcc_state->level_mask); + int can_deflate = dfltcc_can_deflate_with_params(strm, level, state->w_bits, strategy, state->reproducible); if (can_deflate == could_deflate) /* We continue to work in the same mode - no changes needed */ return Z_OK; - if (strm->total_in == 0 && param->nt == 1 && param->hl == 0) + if (!dfltcc_was_deflate_used(strm)) /* DFLTCC was not used yet - no changes needed */ return Z_OK; - /* Switching between hardware and software is not implemented */ - return Z_STREAM_ERROR; + /* For now, do not convert between window formats - simply get rid of the old data instead */ + *flush = Z_FULL_FLUSH; + return Z_OK; +} + +int Z_INTERNAL dfltcc_deflate_done(PREFIX3(streamp) strm, int flush) { + deflate_state *state = (deflate_state *)strm->state; + struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); + struct dfltcc_param_v0 *param = &dfltcc_state->param; + + /* When deflate(Z_FULL_FLUSH) is called with small avail_out, it might + * close the block without resetting the compression state. Detect this + * situation and return that deflation is not done. + */ + if (flush == Z_FULL_FLUSH && strm->avail_out == 0) + return 0; + + /* Return that deflation is not done if DFLTCC is used and either it + * buffered some data (Continuation Flag is set), or has not written EOBS + * yet (Block-Continuation Flag is set). + */ + return !dfltcc_can_deflate(strm) || (!param->cf && !param->bcf); +} + +int Z_INTERNAL dfltcc_can_set_reproducible(PREFIX3(streamp) strm, int reproducible) { + deflate_state *state = (deflate_state *)strm->state; + + return reproducible != state->reproducible && !dfltcc_was_deflate_used(strm); } /* Preloading history. */ -static void append_history(struct dfltcc_param_v0 *param, unsigned char *history, const unsigned char *buf, uInt count) -{ +static void append_history(struct dfltcc_param_v0 *param, unsigned char *history, const unsigned char *buf, uInt count) { size_t offset; size_t n; @@ -331,20 +373,19 @@ static void append_history(struct dfltcc_param_v0 *param, unsigned char *history } } -int ZLIB_INTERNAL dfltcc_deflate_set_dictionary(PREFIX3(streamp) strm, - const unsigned char *dictionary, uInt dict_length) -{ +int Z_INTERNAL dfltcc_deflate_set_dictionary(PREFIX3(streamp) strm, + const unsigned char *dictionary, uInt dict_length) { deflate_state *state = (deflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); struct dfltcc_param_v0 *param = &dfltcc_state->param; append_history(param, state->window, dictionary, dict_length); state->strstart = 1; /* Add FDICT to zlib header */ + state->block_start = state->strstart; /* Make deflate_stored happy */ return Z_OK; } -int ZLIB_INTERNAL dfltcc_deflate_get_dictionary(PREFIX3(streamp) strm, unsigned char *dictionary, uInt *dict_length) -{ +int Z_INTERNAL dfltcc_deflate_get_dictionary(PREFIX3(streamp) strm, unsigned char *dictionary, uInt *dict_length) { deflate_state *state = (deflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); struct dfltcc_param_v0 *param = &dfltcc_state->param; diff --git a/libs/zlibng/arch/s390/dfltcc_deflate.h b/libs/zlibng/arch/s390/dfltcc_deflate.h index 93945f0a0..7e32380bd 100644 --- a/libs/zlibng/arch/s390/dfltcc_deflate.h +++ b/libs/zlibng/arch/s390/dfltcc_deflate.h @@ -3,12 +3,14 @@ #include "dfltcc_common.h" -int ZLIB_INTERNAL dfltcc_can_deflate(PREFIX3(streamp) strm); -int ZLIB_INTERNAL dfltcc_deflate(PREFIX3(streamp) strm, int flush, block_state *result); -int ZLIB_INTERNAL dfltcc_deflate_params(PREFIX3(streamp) strm, int level, int strategy); -int ZLIB_INTERNAL dfltcc_deflate_set_dictionary(PREFIX3(streamp) strm, +int Z_INTERNAL dfltcc_can_deflate(PREFIX3(streamp) strm); +int Z_INTERNAL dfltcc_deflate(PREFIX3(streamp) strm, int flush, block_state *result); +int Z_INTERNAL dfltcc_deflate_params(PREFIX3(streamp) strm, int level, int strategy, int *flush); +int Z_INTERNAL dfltcc_deflate_done(PREFIX3(streamp) strm, int flush); +int Z_INTERNAL dfltcc_can_set_reproducible(PREFIX3(streamp) strm, int reproducible); +int Z_INTERNAL dfltcc_deflate_set_dictionary(PREFIX3(streamp) strm, const unsigned char *dictionary, uInt dict_length); -int ZLIB_INTERNAL dfltcc_deflate_get_dictionary(PREFIX3(streamp) strm, unsigned char *dictionary, uInt* dict_length); +int Z_INTERNAL dfltcc_deflate_get_dictionary(PREFIX3(streamp) strm, unsigned char *dictionary, uInt* dict_length); #define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) \ do { \ @@ -25,15 +27,17 @@ int ZLIB_INTERNAL dfltcc_deflate_get_dictionary(PREFIX3(streamp) strm, unsigned #define DEFLATE_RESET_KEEP_HOOK(strm) \ dfltcc_reset((strm), sizeof(deflate_state)) -#define DEFLATE_PARAMS_HOOK(strm, level, strategy) \ +#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) \ do { \ int err; \ \ - err = dfltcc_deflate_params((strm), (level), (strategy)); \ + err = dfltcc_deflate_params((strm), (level), (strategy), (hook_flush)); \ if (err == Z_STREAM_ERROR) \ return err; \ } while (0) +#define DEFLATE_DONE dfltcc_deflate_done + #define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \ do { \ if (dfltcc_can_deflate((strm))) \ @@ -47,4 +51,6 @@ int ZLIB_INTERNAL dfltcc_deflate_get_dictionary(PREFIX3(streamp) strm, unsigned #define DEFLATE_NEED_CHECKSUM(strm) (!dfltcc_can_deflate((strm))) +#define DEFLATE_CAN_SET_REPRODUCIBLE dfltcc_can_set_reproducible + #endif diff --git a/libs/zlibng/arch/s390/dfltcc_detail.h b/libs/zlibng/arch/s390/dfltcc_detail.h index 156b2a289..4ec03f809 100644 --- a/libs/zlibng/arch/s390/dfltcc_detail.h +++ b/libs/zlibng/arch/s390/dfltcc_detail.h @@ -46,18 +46,17 @@ typedef enum { #define DFLTCC_FACILITY 151 static inline dfltcc_cc dfltcc(int fn, void *param, - unsigned char **op1, size_t *len1, const unsigned char **op2, size_t *len2, void *hist) -{ + unsigned char **op1, size_t *len1, z_const unsigned char **op2, size_t *len2, void *hist) { unsigned char *t2 = op1 ? *op1 : NULL; size_t t3 = len1 ? *len1 : 0; - const unsigned char *t4 = op2 ? *op2 : NULL; + z_const unsigned char *t4 = op2 ? *op2 : NULL; size_t t5 = len2 ? *len2 : 0; - register int r0 __asm__("r0") = fn; - register void *r1 __asm__("r1") = param; - register unsigned char *r2 __asm__("r2") = t2; - register size_t r3 __asm__("r3") = t3; - register const unsigned char *r4 __asm__("r4") = t4; - register size_t r5 __asm__("r5") = t5; + Z_REGISTER int r0 __asm__("r0") = fn; + Z_REGISTER void *r1 __asm__("r1") = param; + Z_REGISTER unsigned char *r2 __asm__("r2") = t2; + Z_REGISTER size_t r3 __asm__("r3") = t3; + Z_REGISTER z_const unsigned char *r4 __asm__("r4") = t4; + Z_REGISTER size_t r5 __asm__("r5") = t5; int cc; __asm__ volatile( @@ -108,13 +107,11 @@ struct dfltcc_qaf_param { static_assert(sizeof(struct dfltcc_qaf_param) == 32, sizeof_struct_dfltcc_qaf_param_is_32); -static inline int is_bit_set(const char *bits, int n) -{ +static inline int is_bit_set(const char *bits, int n) { return bits[n / 8] & (1 << (7 - (n % 8))); } -static inline void clear_bit(char *bits, int n) -{ +static inline void clear_bit(char *bits, int n) { bits[n / 8] &= ~(1 << (7 - (n % 8))); } @@ -175,8 +172,7 @@ struct dfltcc_param_v0 { static_assert(sizeof(struct dfltcc_param_v0) == 1536, sizeof_struct_dfltcc_param_v0_is_1536); -static inline const char *oesc_msg(char *buf, int oesc) -{ +static inline z_const char *oesc_msg(char *buf, int oesc) { if (oesc == 0x00) return NULL; /* Successful completion */ else { @@ -198,4 +194,6 @@ struct dfltcc_state { char msg[64]; /* Buffer for strm->msg */ }; -#define GET_DFLTCC_STATE(state) ((struct dfltcc_state *)((state) + 1)) +#define ALIGN_UP(p, size) (__typeof__(p))(((uintptr_t)(p) + ((size) - 1)) & ~((size) - 1)) + +#define GET_DFLTCC_STATE(state) ((struct dfltcc_state *)((char *)(state) + ALIGN_UP(sizeof(*state), 8))) diff --git a/libs/zlibng/arch/s390/dfltcc_inflate.c b/libs/zlibng/arch/s390/dfltcc_inflate.c index cec25f41f..f6a7e8f86 100644 --- a/libs/zlibng/arch/s390/dfltcc_inflate.c +++ b/libs/zlibng/arch/s390/dfltcc_inflate.c @@ -13,15 +13,14 @@ $ make */ -#include "zbuild.h" -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" +#include "../../zbuild.h" +#include "../../zutil.h" +#include "../../inftrees.h" +#include "../../inflate.h" #include "dfltcc_inflate.h" #include "dfltcc_detail.h" -int ZLIB_INTERNAL dfltcc_can_inflate(PREFIX3(streamp) strm) -{ +int Z_INTERNAL dfltcc_can_inflate(PREFIX3(streamp) strm) { struct inflate_state *state = (struct inflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); @@ -33,8 +32,7 @@ int ZLIB_INTERNAL dfltcc_can_inflate(PREFIX3(streamp) strm) return is_bit_set(dfltcc_state->af.fns, DFLTCC_XPND) && is_bit_set(dfltcc_state->af.fmts, DFLTCC_FMT0); } -static inline dfltcc_cc dfltcc_xpnd(PREFIX3(streamp) strm) -{ +static inline dfltcc_cc dfltcc_xpnd(PREFIX3(streamp) strm) { struct inflate_state *state = (struct inflate_state *)strm->state; struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param; size_t avail_in = strm->avail_in; @@ -49,8 +47,7 @@ static inline dfltcc_cc dfltcc_xpnd(PREFIX3(streamp) strm) return cc; } -dfltcc_inflate_action ZLIB_INTERNAL dfltcc_inflate(PREFIX3(streamp) strm, int flush, int *ret) -{ +dfltcc_inflate_action Z_INTERNAL dfltcc_inflate(PREFIX3(streamp) strm, int flush, int *ret) { struct inflate_state *state = (struct inflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); struct dfltcc_param_v0 *param = &dfltcc_state->param; @@ -115,16 +112,14 @@ dfltcc_inflate_action ZLIB_INTERNAL dfltcc_inflate(PREFIX3(streamp) strm, int fl DFLTCC_INFLATE_BREAK : DFLTCC_INFLATE_CONTINUE; } -int ZLIB_INTERNAL dfltcc_was_inflate_used(PREFIX3(streamp) strm) -{ +int Z_INTERNAL dfltcc_was_inflate_used(PREFIX3(streamp) strm) { struct inflate_state *state = (struct inflate_state *)strm->state; struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param; return !param->nt; } -int ZLIB_INTERNAL dfltcc_inflate_disable(PREFIX3(streamp) strm) -{ +int Z_INTERNAL dfltcc_inflate_disable(PREFIX3(streamp) strm) { struct inflate_state *state = (struct inflate_state *)strm->state; struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state); diff --git a/libs/zlibng/arch/s390/dfltcc_inflate.h b/libs/zlibng/arch/s390/dfltcc_inflate.h index aea2bbb73..fc8a000f7 100644 --- a/libs/zlibng/arch/s390/dfltcc_inflate.h +++ b/libs/zlibng/arch/s390/dfltcc_inflate.h @@ -3,15 +3,15 @@ #include "dfltcc_common.h" -int ZLIB_INTERNAL dfltcc_can_inflate(PREFIX3(streamp) strm); +int Z_INTERNAL dfltcc_can_inflate(PREFIX3(streamp) strm); typedef enum { DFLTCC_INFLATE_CONTINUE, DFLTCC_INFLATE_BREAK, DFLTCC_INFLATE_SOFTWARE, } dfltcc_inflate_action; -dfltcc_inflate_action ZLIB_INTERNAL dfltcc_inflate(PREFIX3(streamp) strm, int flush, int *ret); -int ZLIB_INTERNAL dfltcc_was_inflate_used(PREFIX3(streamp) strm); -int ZLIB_INTERNAL dfltcc_inflate_disable(PREFIX3(streamp) strm); +dfltcc_inflate_action Z_INTERNAL dfltcc_inflate(PREFIX3(streamp) strm, int flush, int *ret); +int Z_INTERNAL dfltcc_was_inflate_used(PREFIX3(streamp) strm); +int Z_INTERNAL dfltcc_inflate_disable(PREFIX3(streamp) strm); #define INFLATE_RESET_KEEP_HOOK(strm) \ dfltcc_reset((strm), sizeof(struct inflate_state)) @@ -41,4 +41,9 @@ int ZLIB_INTERNAL dfltcc_inflate_disable(PREFIX3(streamp) strm); if (dfltcc_was_inflate_used((strm))) return -(1L << 16); \ } while (0) +#define INFLATE_SYNC_POINT_HOOK(strm) \ + do { \ + if (dfltcc_was_inflate_used((strm))) return Z_STREAM_ERROR; \ + } while (0) + #endif diff --git a/libs/zlibng/arch/x86/INDEX b/libs/zlibng/arch/x86/INDEX deleted file mode 100644 index 9ee3802a2..000000000 --- a/libs/zlibng/arch/x86/INDEX +++ /dev/null @@ -1,3 +0,0 @@ -fill_window_sse.c SSE2 optimized fill_window -deflate_quick.c SSE4 optimized deflate strategy for use as level 1 -crc_folding.c SSE4 + PCLMULQDQ optimized CRC folding implementation diff --git a/libs/zlibng/arch/x86/INDEX.md b/libs/zlibng/arch/x86/INDEX.md new file mode 100644 index 000000000..8bf6d08e5 --- /dev/null +++ b/libs/zlibng/arch/x86/INDEX.md @@ -0,0 +1,8 @@ +Contents +-------- + +|Name|Description| +|:-|:-| +|deflate_quick.c|SSE4 optimized deflate strategy for use as level 1| +|crc_folding.c|SSE4 + PCLMULQDQ optimized CRC folding implementation| +|slide_sse2.c|SSE2 optimized slide_hash| diff --git a/libs/zlibng/arch/x86/Makefile.in b/libs/zlibng/arch/x86/Makefile.in index 2e473c626..4f6594e6d 100644 --- a/libs/zlibng/arch/x86/Makefile.in +++ b/libs/zlibng/arch/x86/Makefile.in @@ -8,7 +8,9 @@ SFLAGS= INCLUDES= SUFFIX= +AVX2FLAG=-mavx2 SSE2FLAG=-msse2 +SSSE3FLAG=-mssse3 SSE4FLAG=-msse4 PCLMULFLAG=-mpclmul @@ -16,7 +18,18 @@ SRCDIR=. SRCTOP=../.. TOPDIR=$(SRCTOP) -all: x86.o x86.lo fill_window_sse.o fill_window_sse.lo deflate_quick.o deflate_quick.lo insert_string_sse.o insert_string_sse.lo crc_folding.o crc_folding.lo +all: \ + x86.o x86.lo \ + adler32_avx.o adler32.lo \ + adler32_ssse3.o adler32_ssse3.lo \ + chunkset_avx.o chunkset_avx.lo \ + chunkset_sse.o chunkset_sse.lo \ + compare258_avx.o compare258_avx.lo \ + compare258_sse.o compare258_sse.lo \ + insert_string_sse.o insert_string_sse.lo \ + crc_folding.o crc_folding.lo \ + slide_avx.o slide_avx.lo \ + slide_sse.o slide_sse.lo x86.o: $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/x86.c @@ -24,17 +37,29 @@ x86.o: x86.lo: $(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/x86.c -fill_window_sse.o: - $(CC) $(CFLAGS) $(SSE2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/fill_window_sse.c +chunkset_avx.o: + $(CC) $(CFLAGS) $(AVX2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_avx.c -fill_window_sse.lo: - $(CC) $(SFLAGS) $(SSE2FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/fill_window_sse.c +chunkset_avx.lo: + $(CC) $(SFLAGS) $(AVX2FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_avx.c -deflate_quick.o: - $(CC) $(CFLAGS) $(SSE4FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/deflate_quick.c +chunkset_sse.o: + $(CC) $(CFLAGS) $(SSE2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_sse.c -deflate_quick.lo: - $(CC) $(SFLAGS) $(SSE4FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/deflate_quick.c +chunkset_sse.lo: + $(CC) $(SFLAGS) $(SSE2FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_sse.c + +compare258_avx.o: + $(CC) $(CFLAGS) $(AVX2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare258_avx.c + +compare258_avx.lo: + $(CC) $(SFLAGS) $(AVX2FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/compare258_avx.c + +compare258_sse.o: + $(CC) $(CFLAGS) $(SSE4FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare258_sse.c + +compare258_sse.lo: + $(CC) $(SFLAGS) $(SSE4FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/compare258_sse.c insert_string_sse.o: $(CC) $(CFLAGS) $(SSE4FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_sse.c @@ -48,6 +73,30 @@ crc_folding.o: crc_folding.lo: $(CC) $(SFLAGS) $(PCLMULFLAG) $(SSE4FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/crc_folding.c +slide_avx.o: + $(CC) $(CFLAGS) $(AVX2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_avx.c + +slide_avx.lo: + $(CC) $(SFLAGS) $(AVX2FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/slide_avx.c + +slide_sse.o: + $(CC) $(CFLAGS) $(SSE2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_sse.c + +slide_sse.lo: + $(CC) $(SFLAGS) $(SSE2FLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/slide_sse.c + +adler32_avx.o: $(SRCDIR)/adler32_avx.c + $(CC) $(CFLAGS) $(AVX2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx.c + +adler32_avx.lo: $(SRCDIR)/adler32_avx.c + $(CC) $(SFLAGS) $(AVX2FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx.c + +adler32_ssse3.o: $(SRCDIR)/adler32_ssse3.c + $(CC) $(CFLAGS) $(SSSE3FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_ssse3.c + +adler32_ssse3.lo: $(SRCDIR)/adler32_ssse3.c + $(CC) $(SFLAGS) $(SSSE3FLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_ssse3.c + mostlyclean: clean clean: rm -f *.o *.lo *~ diff --git a/libs/zlibng/arch/x86/adler32_avx.c b/libs/zlibng/arch/x86/adler32_avx.c new file mode 100644 index 000000000..106324654 --- /dev/null +++ b/libs/zlibng/arch/x86/adler32_avx.c @@ -0,0 +1,117 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011 Mark Adler + * Authors: + * Brian Bockelman + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "../../zbuild.h" +#include "../../zutil.h" + +#include "../../adler32_p.h" + +#include + +#ifdef X86_AVX2_ADLER32 + +Z_INTERNAL uint32_t adler32_avx2(uint32_t adler, const unsigned char *buf, size_t len) { + uint32_t sum2; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (UNLIKELY(len == 1)) + return adler32_len_1(adler, buf, sum2); + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (UNLIKELY(buf == NULL)) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (UNLIKELY(len < 16)) + return adler32_len_16(adler, buf, len, sum2); + + uint32_t ALIGNED_(32) s1[8], s2[8]; + + memset(s1, 0, sizeof(s1)); s1[7] = adler; // TODO: would a masked load be faster? + memset(s2, 0, sizeof(s2)); s2[7] = sum2; + + char ALIGNED_(32) dot1[32] = \ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + __m256i dot1v = _mm256_load_si256((__m256i*)dot1); + char ALIGNED_(32) dot2[32] = \ + {32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, + 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; + __m256i dot2v = _mm256_load_si256((__m256i*)dot2); + short ALIGNED_(32) dot3[16] = \ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + __m256i dot3v = _mm256_load_si256((__m256i*)dot3); + + // We will need to multiply by + char ALIGNED_(32) shift[16] = {5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + __m128i shiftv = _mm_load_si128((__m128i*)shift); + + while (len >= 32) { + __m256i vs1 = _mm256_load_si256((__m256i*)s1); + __m256i vs2 = _mm256_load_si256((__m256i*)s2); + __m256i vs1_0 = vs1; + + int k = (len < NMAX ? (int)len : NMAX); + k -= k % 32; + len -= k; + + while (k >= 32) { + /* + vs1 = adler + sum(c[i]) + vs2 = sum2 + 16 vs1 + sum( (16-i+1) c[i] ) + */ + __m256i vbuf = _mm256_loadu_si256((__m256i*)buf); + buf += 32; + k -= 32; + + __m256i v_short_sum1 = _mm256_maddubs_epi16(vbuf, dot1v); // multiply-add, resulting in 8 shorts. + __m256i vsum1 = _mm256_madd_epi16(v_short_sum1, dot3v); // sum 8 shorts to 4 int32_t; + __m256i v_short_sum2 = _mm256_maddubs_epi16(vbuf, dot2v); + vs1 = _mm256_add_epi32(vsum1, vs1); + __m256i vsum2 = _mm256_madd_epi16(v_short_sum2, dot3v); + vs1_0 = _mm256_sll_epi32(vs1_0, shiftv); + vsum2 = _mm256_add_epi32(vsum2, vs2); + vs2 = _mm256_add_epi32(vsum2, vs1_0); + vs1_0 = vs1; + } + + // At this point, we have partial sums stored in vs1 and vs2. There are AVX512 instructions that + // would allow us to sum these quickly (VP4DPWSSD). For now, just unpack and move on. + uint32_t ALIGNED_(32) s1_unpack[8]; + uint32_t ALIGNED_(32) s2_unpack[8]; + + _mm256_store_si256((__m256i*)s1_unpack, vs1); + _mm256_store_si256((__m256i*)s2_unpack, vs2); + + adler = (s1_unpack[0] % BASE) + (s1_unpack[1] % BASE) + (s1_unpack[2] % BASE) + (s1_unpack[3] % BASE) + + (s1_unpack[4] % BASE) + (s1_unpack[5] % BASE) + (s1_unpack[6] % BASE) + (s1_unpack[7] % BASE); + adler %= BASE; + s1[7] = adler; + + sum2 = (s2_unpack[0] % BASE) + (s2_unpack[1] % BASE) + (s2_unpack[2] % BASE) + (s2_unpack[3] % BASE) + + (s2_unpack[4] % BASE) + (s2_unpack[5] % BASE) + (s2_unpack[6] % BASE) + (s2_unpack[7] % BASE); + sum2 %= BASE; + s2[7] = sum2; + } + + while (len) { + len--; + adler += *buf++; + sum2 += adler; + } + adler %= BASE; + sum2 %= BASE; + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +#endif diff --git a/libs/zlibng/arch/x86/adler32_ssse3.c b/libs/zlibng/arch/x86/adler32_ssse3.c new file mode 100644 index 000000000..101df4fe4 --- /dev/null +++ b/libs/zlibng/arch/x86/adler32_ssse3.c @@ -0,0 +1,118 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011 Mark Adler + * Authors: + * Brian Bockelman + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "../../zbuild.h" +#include "../../zutil.h" + +#include "../../adler32_p.h" + +#ifdef X86_SSSE3_ADLER32 + +#include + +Z_INTERNAL uint32_t adler32_ssse3(uint32_t adler, const unsigned char *buf, size_t len) { + uint32_t sum2; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (UNLIKELY(len == 1)) + return adler32_len_1(adler, buf, sum2); + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (UNLIKELY(buf == NULL)) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (UNLIKELY(len < 16)) + return adler32_len_16(adler, buf, len, sum2); + + uint32_t ALIGNED_(16) s1[4], s2[4]; + + s1[0] = s1[1] = s1[2] = 0; s1[3] = adler; + s2[0] = s2[1] = s2[2] = 0; s2[3] = sum2; + + char ALIGNED_(16) dot1[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + __m128i dot1v = _mm_load_si128((__m128i*)dot1); + char ALIGNED_(16) dot2[16] = {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; + __m128i dot2v = _mm_load_si128((__m128i*)dot2); + short ALIGNED_(16) dot3[8] = {1, 1, 1, 1, 1, 1, 1, 1}; + __m128i dot3v = _mm_load_si128((__m128i*)dot3); + + // We will need to multiply by + //char ALIGNED_(16) shift[4] = {0, 0, 0, 4}; //{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}; + + char ALIGNED_(16) shift[16] = {4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + __m128i shiftv = _mm_load_si128((__m128i*)shift); + + while (len >= 16) { + __m128i vs1 = _mm_load_si128((__m128i*)s1); + __m128i vs2 = _mm_load_si128((__m128i*)s2); + __m128i vs1_0 = vs1; + + int k = (len < NMAX ? (int)len : NMAX); + k -= k % 16; + len -= k; + + while (k >= 16) { + /* + vs1 = adler + sum(c[i]) + vs2 = sum2 + 16 vs1 + sum( (16-i+1) c[i] ) + + NOTE: 256-bit equivalents are: + _mm256_maddubs_epi16 <- operates on 32 bytes to 16 shorts + _mm256_madd_epi16 <- Sums 16 shorts to 8 int32_t. + We could rewrite the below to use 256-bit instructions instead of 128-bit. + */ + __m128i vbuf = _mm_loadu_si128((__m128i*)buf); + buf += 16; + k -= 16; + + __m128i v_short_sum1 = _mm_maddubs_epi16(vbuf, dot1v); // multiply-add, resulting in 8 shorts. + __m128i vsum1 = _mm_madd_epi16(v_short_sum1, dot3v); // sum 8 shorts to 4 int32_t; + __m128i v_short_sum2 = _mm_maddubs_epi16(vbuf, dot2v); + vs1 = _mm_add_epi32(vsum1, vs1); + __m128i vsum2 = _mm_madd_epi16(v_short_sum2, dot3v); + vs1_0 = _mm_sll_epi32(vs1_0, shiftv); + vsum2 = _mm_add_epi32(vsum2, vs2); + vs2 = _mm_add_epi32(vsum2, vs1_0); + vs1_0 = vs1; + } + + // At this point, we have partial sums stored in vs1 and vs2. There are AVX512 instructions that + // would allow us to sum these quickly (VP4DPWSSD). For now, just unpack and move on. + + uint32_t ALIGNED_(16) s1_unpack[4]; + uint32_t ALIGNED_(16) s2_unpack[4]; + + _mm_store_si128((__m128i*)s1_unpack, vs1); + _mm_store_si128((__m128i*)s2_unpack, vs2); + + adler = (s1_unpack[0] % BASE) + (s1_unpack[1] % BASE) + (s1_unpack[2] % BASE) + (s1_unpack[3] % BASE); + adler %= BASE; + s1[3] = adler; + + sum2 = (s2_unpack[0] % BASE) + (s2_unpack[1] % BASE) + (s2_unpack[2] % BASE) + (s2_unpack[3] % BASE); + sum2 %= BASE; + s2[3] = sum2; + } + + while (len) { + len--; + adler += *buf++; + sum2 += adler; + } + adler %= BASE; + sum2 %= BASE; + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +#endif diff --git a/libs/zlibng/arch/x86/chunkset_avx.c b/libs/zlibng/arch/x86/chunkset_avx.c new file mode 100644 index 000000000..eb76c0db9 --- /dev/null +++ b/libs/zlibng/arch/x86/chunkset_avx.c @@ -0,0 +1,50 @@ +/* chunkset_avx.c -- AVX inline functions to copy small data chunks. + * For conditions of distribution and use, see copyright notice in zlib.h + */ +#include "zbuild.h" +#include "zutil.h" + +#ifdef X86_AVX_CHUNKSET +#include + +typedef __m256i chunk_t; + +#define HAVE_CHUNKMEMSET_1 +#define HAVE_CHUNKMEMSET_2 +#define HAVE_CHUNKMEMSET_4 +#define HAVE_CHUNKMEMSET_8 + +static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) { + *chunk = _mm256_set1_epi8(*(int8_t *)from); +} + +static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) { + *chunk = _mm256_set1_epi16(*(int16_t *)from); +} + +static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) { + *chunk = _mm256_set1_epi32(*(int32_t *)from); +} + +static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) { + *chunk = _mm256_set1_epi64x(*(int64_t *)from); +} + +static inline void loadchunk(uint8_t const *s, chunk_t *chunk) { + *chunk = _mm256_loadu_si256((__m256i *)s); +} + +static inline void storechunk(uint8_t *out, chunk_t *chunk) { + _mm256_storeu_si256((__m256i *)out, *chunk); +} + +#define CHUNKSIZE chunksize_avx +#define CHUNKCOPY chunkcopy_avx +#define CHUNKCOPY_SAFE chunkcopy_safe_avx +#define CHUNKUNROLL chunkunroll_avx +#define CHUNKMEMSET chunkmemset_avx +#define CHUNKMEMSET_SAFE chunkmemset_safe_avx + +#include "chunkset_tpl.h" + +#endif diff --git a/libs/zlibng/arch/x86/chunkset_sse.c b/libs/zlibng/arch/x86/chunkset_sse.c new file mode 100644 index 000000000..1d5a0faa9 --- /dev/null +++ b/libs/zlibng/arch/x86/chunkset_sse.c @@ -0,0 +1,51 @@ +/* chunkset_sse.c -- SSE inline functions to copy small data chunks. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zbuild.h" +#include "zutil.h" + +#ifdef X86_SSE2 +#include + +typedef __m128i chunk_t; + +#define HAVE_CHUNKMEMSET_1 +#define HAVE_CHUNKMEMSET_2 +#define HAVE_CHUNKMEMSET_4 +#define HAVE_CHUNKMEMSET_8 + +static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) { + *chunk = _mm_set1_epi8(*(int8_t *)from); +} + +static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) { + *chunk = _mm_set1_epi16(*(int16_t *)from); +} + +static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) { + *chunk = _mm_set1_epi32(*(int32_t *)from); +} + +static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) { + *chunk = _mm_set1_epi64x(*(int64_t *)from); +} + +static inline void loadchunk(uint8_t const *s, chunk_t *chunk) { + *chunk = _mm_loadu_si128((__m128i *)s); +} + +static inline void storechunk(uint8_t *out, chunk_t *chunk) { + _mm_storeu_si128((__m128i *)out, *chunk); +} + +#define CHUNKSIZE chunksize_sse2 +#define CHUNKCOPY chunkcopy_sse2 +#define CHUNKCOPY_SAFE chunkcopy_safe_sse2 +#define CHUNKUNROLL chunkunroll_sse2 +#define CHUNKMEMSET chunkmemset_sse2 +#define CHUNKMEMSET_SAFE chunkmemset_safe_sse2 + +#include "chunkset_tpl.h" + +#endif diff --git a/libs/zlibng/arch/x86/compare258_avx.c b/libs/zlibng/arch/x86/compare258_avx.c new file mode 100644 index 000000000..d9108fdeb --- /dev/null +++ b/libs/zlibng/arch/x86/compare258_avx.c @@ -0,0 +1,67 @@ +/* compare258_avx.c -- AVX2 version of compare258 + * Copyright Mika T. Lindqvist + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "../../zbuild.h" +#include "../../zutil.h" + +#include "fallback_builtins.h" + +#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ) + +#include +#ifdef _MSC_VER +# include +#endif + +/* UNALIGNED_OK, AVX2 intrinsic comparison */ +static inline uint32_t compare256_unaligned_avx2_static(const unsigned char *src0, const unsigned char *src1) { + uint32_t len = 0; + + do { + __m256i ymm_src0, ymm_src1, ymm_cmp; + ymm_src0 = _mm256_loadu_si256((__m256i*)src0); + ymm_src1 = _mm256_loadu_si256((__m256i*)src1); + ymm_cmp = _mm256_cmpeq_epi8(ymm_src0, ymm_src1); /* non-identical bytes = 00, identical bytes = FF */ + unsigned mask = (unsigned)_mm256_movemask_epi8(ymm_cmp); + if (mask != 0xFFFFFFFF) { + uint32_t match_byte = (uint32_t)__builtin_ctz(~mask); /* Invert bits so identical = 0 */ + return len + match_byte; + } + + src0 += 32, src1 += 32, len += 32; + + ymm_src0 = _mm256_loadu_si256((__m256i*)src0); + ymm_src1 = _mm256_loadu_si256((__m256i*)src1); + ymm_cmp = _mm256_cmpeq_epi8(ymm_src0, ymm_src1); + mask = (unsigned)_mm256_movemask_epi8(ymm_cmp); + if (mask != 0xFFFFFFFF) { + uint32_t match_byte = (uint32_t)__builtin_ctz(~mask); + return len + match_byte; + } + + src0 += 32, src1 += 32, len += 32; + } while (len < 256); + + return 256; +} + +static inline uint32_t compare258_unaligned_avx2_static(const unsigned char *src0, const unsigned char *src1) { + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return (*src0 == *src1); + + return compare256_unaligned_avx2_static(src0+2, src1+2) + 2; +} + +Z_INTERNAL uint32_t compare258_unaligned_avx2(const unsigned char *src0, const unsigned char *src1) { + return compare258_unaligned_avx2_static(src0, src1); +} + +#define LONGEST_MATCH longest_match_unaligned_avx2 +#define COMPARE256 compare256_unaligned_avx2_static +#define COMPARE258 compare258_unaligned_avx2_static + +#include "match_tpl.h" + +#endif diff --git a/libs/zlibng/arch/x86/compare258_sse.c b/libs/zlibng/arch/x86/compare258_sse.c new file mode 100644 index 000000000..17534c051 --- /dev/null +++ b/libs/zlibng/arch/x86/compare258_sse.c @@ -0,0 +1,74 @@ +/* compare258_sse.c -- SSE4.2 version of compare258 + * + * Copyright (C) 2013 Intel Corporation. All rights reserved. + * Authors: + * Wajdi Feghali + * Jim Guilford + * Vinodh Gopal + * Erdinc Ozturk + * Jim Kukunas + * + * Portions are Copyright (C) 2016 12Sided Technology, LLC. + * Author: + * Phil Vachon + * + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "../../zbuild.h" +#include "../../zutil.h" + +#ifdef X86_SSE42_CMP_STR + +#include +#ifdef _MSC_VER +# include +#endif + +/* UNALIGNED_OK, SSE4.2 intrinsic comparison */ +static inline uint32_t compare256_unaligned_sse4_static(const unsigned char *src0, const unsigned char *src1) { + uint32_t len = 0; + + do { + #define mode _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_NEGATIVE_POLARITY + __m128i xmm_src0, xmm_src1; + uint32_t ret; + + xmm_src0 = _mm_loadu_si128((__m128i *)src0); + xmm_src1 = _mm_loadu_si128((__m128i *)src1); + ret = (uint32_t)_mm_cmpestri(xmm_src0, 16, xmm_src1, 16, mode); + if (_mm_cmpestrc(xmm_src0, 16, xmm_src1, 16, mode)) { + return len + ret; + } + src0 += 16, src1 += 16, len += 16; + + xmm_src0 = _mm_loadu_si128((__m128i *)src0); + xmm_src1 = _mm_loadu_si128((__m128i *)src1); + ret = (uint32_t)_mm_cmpestri(xmm_src0, 16, xmm_src1, 16, mode); + if (_mm_cmpestrc(xmm_src0, 16, xmm_src1, 16, mode)) { + return len + ret; + } + src0 += 16, src1 += 16, len += 16; + } while (len < 256); + + return 256; +} + +static inline uint32_t compare258_unaligned_sse4_static(const unsigned char *src0, const unsigned char *src1) { + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return (*src0 == *src1); + + return compare256_unaligned_sse4_static(src0+2, src1+2) + 2; +} + +Z_INTERNAL uint32_t compare258_unaligned_sse4(const unsigned char *src0, const unsigned char *src1) { + return compare258_unaligned_sse4_static(src0, src1); +} + +#define LONGEST_MATCH longest_match_unaligned_sse4 +#define COMPARE256 compare256_unaligned_sse4_static +#define COMPARE258 compare258_unaligned_sse4_static + +#include "match_tpl.h" + +#endif diff --git a/libs/zlibng/arch/x86/crc_folding.c b/libs/zlibng/arch/x86/crc_folding.c index eb178f55c..918bd9468 100644 --- a/libs/zlibng/arch/x86/crc_folding.c +++ b/libs/zlibng/arch/x86/crc_folding.c @@ -1,5 +1,5 @@ /* - * Compute the CRC32 using a parallelized folding approach with the PCLMULQDQ + * Compute the CRC32 using a parallelized folding approach with the PCLMULQDQ * instruction. * * A white paper describing this algorithm can be found at: @@ -18,14 +18,14 @@ #ifdef X86_PCLMULQDQ_CRC -#include "zbuild.h" +#include "../../zbuild.h" #include #include #include #include "crc_folding.h" -ZLIB_INTERNAL void crc_fold_init(deflate_state *const s) { +Z_INTERNAL void crc_fold_init(deflate_state *const s) { /* CRC_SAVE */ _mm_storeu_si128((__m128i *)s->crc0 + 0, _mm_cvtsi32_si128(0x9db42487)); _mm_storeu_si128((__m128i *)s->crc0 + 1, _mm_setzero_si128()); @@ -227,9 +227,10 @@ static void partial_fold(const size_t len, __m128i *xmm_crc0, __m128i *xmm_crc1, *xmm_crc3 = _mm_castps_si128(ps_res); } -ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, const unsigned char *src, long len) { +Z_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, const unsigned char *src, long len) { unsigned long algn_diff; __m128i xmm_t0, xmm_t1, xmm_t2, xmm_t3; + char ALIGNED_(16) partial_buf[16] = { 0 }; /* CRC_LOAD */ __m128i xmm_crc0 = _mm_loadu_si128((__m128i *)s->crc0 + 0); @@ -241,11 +242,14 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, con if (len < 16) { if (len == 0) return; - xmm_crc_part = _mm_loadu_si128((__m128i *)src); + + memcpy(partial_buf, src, len); + xmm_crc_part = _mm_loadu_si128((const __m128i *)partial_buf); + memcpy(dst, partial_buf, len); goto partial; } - algn_diff = (0 - (uintptr_t)src) & 0xF; + algn_diff = ((uintptr_t)16 - ((uintptr_t)src & 0xF)) & 0xF; if (algn_diff) { xmm_crc_part = _mm_loadu_si128((__m128i *)src); _mm_storeu_si128((__m128i *)dst, xmm_crc_part); @@ -255,6 +259,8 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, con len -= algn_diff; partial_fold(algn_diff, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, &xmm_crc_part); + } else { + xmm_crc_part = _mm_setzero_si128(); } while ((len -= 64) >= 0) { @@ -305,7 +311,7 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, con goto done; dst += 48; - xmm_crc_part = _mm_load_si128((__m128i *)src + 3); + memcpy(&xmm_crc_part, (__m128i *)src + 3, len); } else if (len + 32 >= 0) { len += 32; @@ -324,7 +330,7 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, con goto done; dst += 32; - xmm_crc_part = _mm_load_si128((__m128i *)src + 2); + memcpy(&xmm_crc_part, (__m128i *)src + 2, len); } else if (len + 48 >= 0) { len += 48; @@ -340,16 +346,18 @@ ZLIB_INTERNAL void crc_fold_copy(deflate_state *const s, unsigned char *dst, con goto done; dst += 16; - xmm_crc_part = _mm_load_si128((__m128i *)src + 1); + memcpy(&xmm_crc_part, (__m128i *)src + 1, len); } else { len += 64; if (len == 0) goto done; - xmm_crc_part = _mm_load_si128((__m128i *)src); + memcpy(&xmm_crc_part, src, len); } + _mm_storeu_si128((__m128i *)partial_buf, xmm_crc_part); + memcpy(dst, partial_buf, len); + partial: - _mm_storeu_si128((__m128i *)dst, xmm_crc_part); partial_fold(len, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, &xmm_crc_part); done: /* CRC_SAVE */ @@ -377,7 +385,7 @@ static const unsigned ALIGNED_(16) crc_mask2[4] = { 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; -uint32_t ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) { +uint32_t Z_INTERNAL crc_fold_512to32(deflate_state *const s) { const __m128i xmm_mask = _mm_load_si128((__m128i *)crc_mask); const __m128i xmm_mask2 = _mm_load_si128((__m128i *)crc_mask2); @@ -447,4 +455,3 @@ uint32_t ZLIB_INTERNAL crc_fold_512to32(deflate_state *const s) { } #endif - diff --git a/libs/zlibng/arch/x86/crc_folding.h b/libs/zlibng/arch/x86/crc_folding.h index 22bfa9864..0d3c24b29 100644 --- a/libs/zlibng/arch/x86/crc_folding.h +++ b/libs/zlibng/arch/x86/crc_folding.h @@ -10,10 +10,10 @@ #ifndef CRC_FOLDING_H_ #define CRC_FOLDING_H_ -#include "deflate.h" +#include "../../deflate.h" -ZLIB_INTERNAL void crc_fold_init(deflate_state *const); -ZLIB_INTERNAL uint32_t crc_fold_512to32(deflate_state *const); -ZLIB_INTERNAL void crc_fold_copy(deflate_state *const, unsigned char *, const unsigned char *, long); +Z_INTERNAL void crc_fold_init(deflate_state *const); +Z_INTERNAL uint32_t crc_fold_512to32(deflate_state *const); +Z_INTERNAL void crc_fold_copy(deflate_state *const, unsigned char *, const unsigned char *, long); #endif diff --git a/libs/zlibng/arch/x86/ctzl.h b/libs/zlibng/arch/x86/ctzl.h deleted file mode 100644 index bc9e9bd5b..000000000 --- a/libs/zlibng/arch/x86/ctzl.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef X86_CTZL_H -#define X86_CTZL_H - -#include -#ifdef X86_CPUID -# include "x86.h" -#endif - -#if defined(_MSC_VER) && !defined(__clang__) -/* This is not a general purpose replacement for __builtin_ctzl. The function expects that value is != 0 - * Because of that assumption trailing_zero is not initialized and the return value of _BitScanForward is not checked - */ -static __forceinline unsigned long __builtin_ctzl(unsigned long value) -{ -#ifdef X86_CPUID - if (x86_cpu_has_tzcnt) - return _tzcnt_u32(value); -#endif - unsigned long trailing_zero; - _BitScanForward(&trailing_zero, value); - return trailing_zero; -} -#endif - -#endif diff --git a/libs/zlibng/arch/x86/deflate_quick.c b/libs/zlibng/arch/x86/deflate_quick.c deleted file mode 100644 index 0c5196926..000000000 --- a/libs/zlibng/arch/x86/deflate_quick.c +++ /dev/null @@ -1,2405 +0,0 @@ -/* - * The deflate_quick deflate strategy, designed to be used when cycles are - * at a premium. - * - * Copyright (C) 2013 Intel Corporation. All rights reserved. - * Authors: - * Wajdi Feghali - * Jim Guilford - * Vinodh Gopal - * Erdinc Ozturk - * Jim Kukunas - * - * Portions are Copyright (C) 2016 12Sided Technology, LLC. - * Author: - * Phil Vachon - * - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zbuild.h" -#include -#ifdef _MSC_VER -# include -#endif -#include "deflate.h" -#include "memcopy.h" - -#ifdef ZLIB_DEBUG -#include -#endif - -extern void fill_window_sse(deflate_state *s); -extern void flush_pending(PREFIX3(stream) *strm); - -static inline long compare258(const unsigned char *const src0, const unsigned char *const src1) { -#ifdef _MSC_VER - long cnt; - - cnt = 0; - do { -#define mode _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_NEGATIVE_POLARITY - - int ret; - __m128i xmm_src0, xmm_src1; - - xmm_src0 = _mm_loadu_si128((__m128i *)(src0 + cnt)); - xmm_src1 = _mm_loadu_si128((__m128i *)(src1 + cnt)); - ret = _mm_cmpestri(xmm_src0, 16, xmm_src1, 16, mode); - if (_mm_cmpestrc(xmm_src0, 16, xmm_src1, 16, mode)) { - cnt += ret; - break; - } - cnt += 16; - - xmm_src0 = _mm_loadu_si128((__m128i *)(src0 + cnt)); - xmm_src1 = _mm_loadu_si128((__m128i *)(src1 + cnt)); - ret = _mm_cmpestri(xmm_src0, 16, xmm_src1, 16, mode); - if (_mm_cmpestrc(xmm_src0, 16, xmm_src1, 16, mode)) { - cnt += ret; - break; - } - cnt += 16; - } while (cnt < 256); - - if (*(unsigned short *)(src0 + cnt) == *(unsigned short *)(src1 + cnt)) { - cnt += 2; - } else if (*(src0 + cnt) == *(src1 + cnt)) { - cnt++; - } - return cnt; -#else - uintptr_t ax, dx, cx; - __m128i xmm_src0; - - ax = 16; - dx = 16; - /* set cx to something, otherwise gcc thinks it's used - uninitalised */ - cx = 0; - - __asm__ __volatile__ ( - "1:" - "movdqu -16(%[src0], %[ax]), %[xmm_src0]\n\t" - "pcmpestri $0x18, -16(%[src1], %[ax]), %[xmm_src0]\n\t" - "jc 2f\n\t" - "add $16, %[ax]\n\t" - - "movdqu -16(%[src0], %[ax]), %[xmm_src0]\n\t" - "pcmpestri $0x18, -16(%[src1], %[ax]), %[xmm_src0]\n\t" - "jc 2f\n\t" - "add $16, %[ax]\n\t" - - "cmp $256 + 16, %[ax]\n\t" - "jb 1b\n\t" - -# if !defined(__x86_64__) - "movzwl -16(%[src0], %[ax]), %[dx]\n\t" -# else - "movzwq -16(%[src0], %[ax]), %[dx]\n\t" -# endif - "xorw -16(%[src1], %[ax]), %%dx\n\t" - "jnz 3f\n\t" - - "add $2, %[ax]\n\t" - "jmp 4f\n\t" - "3:\n\t" - "rep; bsf %[dx], %[cx]\n\t" - "shr $3, %[cx]\n\t" - "2:" - "add %[cx], %[ax]\n\t" - "4:" - : [ax] "+a" (ax), - [cx] "+c" (cx), - [dx] "+d" (dx), - [xmm_src0] "=x" (xmm_src0) - : [src0] "r" (src0), - [src1] "r" (src1) - : "cc" - ); - return ax - 16; -#endif -} - -static const unsigned quick_len_codes[MAX_MATCH-MIN_MATCH+1]; -static const unsigned quick_dist_codes[8192]; - -static inline void quick_send_bits(deflate_state *const s, - const int value1, const int length1, - const int value2, const int length2) { - unsigned offset2 = s->bi_valid + length1; - unsigned width = s->bi_valid + length1 + length2; - unsigned bytes_out = width / 8; - - /* Concatenate the new bits with the bits currently in the buffer */ - unsigned out = s->bi_buf | (value1 << s->bi_valid); - if (width < 32) { - out |= (value2 << offset2); - /* Shift out the valid LSBs written out. */ - s->bi_buf = out >> (bytes_out * 8); - } else /* width => 32 */ { - unsigned bits_that_fit = 32 - offset2; - unsigned mask = (1 << bits_that_fit) - 1; - /* Zero out the high bits of value2 such that the shift by offset2 will - not cause undefined behavior. */ - out |= ((value2 & mask) << offset2); - - /* Save in s->bi_buf the bits of value2 that do not fit: they will be - written in a next full byte. */ - s->bi_buf = (width == 32) ? 0 : value2 >> bits_that_fit; - } - - s->bi_valid = width - (bytes_out * 8); - - /* Taking advantage of the fact that LSB comes first, write to output buffer */ - memcpy(s->pending_buf + s->pending, &out, sizeof(out)); - - s->pending += bytes_out; -} - -static inline void static_emit_ptr(deflate_state *const s, const int lc, const unsigned dist) { - unsigned code1 = quick_len_codes[lc] >> 8; - unsigned len1 = quick_len_codes[lc] & 0xFF; - unsigned code2 = quick_dist_codes[dist-1] >> 8; - unsigned len2 = quick_dist_codes[dist-1] & 0xFF; - quick_send_bits(s, code1, len1, code2, len2); -} - -const ct_data static_ltree[L_CODES+2]; - -static inline void static_emit_lit(deflate_state *const s, const int lit) { - quick_send_bits(s, static_ltree[lit].Code, static_ltree[lit].Len, 0, 0); - Tracecv(isgraph(lit), (stderr, " '%c' ", lit)); -} - -static void static_emit_tree(deflate_state *const s, const int flush) { - unsigned last; - - last = flush == Z_FINISH ? 1 : 0; - Tracev((stderr, "\n--- Emit Tree: Last: %u\n", last)); - send_bits(s, (STATIC_TREES << 1)+ last, 3); -#ifdef ZLIB_DEBUG - s->compressed_len += 3; -#endif -} - -static void static_emit_end_block(deflate_state *const s, int last) { - send_code(s, END_BLOCK, static_ltree); -#ifdef ZLIB_DEBUG - s->compressed_len += 7; /* 7 bits for EOB */ -#endif - Tracev((stderr, "\n+++ Emit End Block: Last: %u Pending: %u Total Out: %zu\n", last, s->pending, s->strm->total_out)); - - if (last) - bi_windup(s); - - s->block_start = s->strstart; - flush_pending(s->strm); - s->block_open = 0; -} - -static inline Pos quick_insert_string(deflate_state *const s, const Pos str) { - Pos ret; - unsigned h = 0; - -#ifdef _MSC_VER - h = _mm_crc32_u32(h, *(unsigned *)(s->window + str)); -#else - __asm__ __volatile__ ( - "crc32l (%[window], %[str], 1), %0\n\t" - : "+r" (h) - : [window] "r" (s->window), - [str] "r" ((uintptr_t)str) - ); -#endif - - ret = s->head[h & s->hash_mask]; - s->head[h & s->hash_mask] = str; - return ret; -} - -ZLIB_INTERNAL block_state deflate_quick(deflate_state *s, int flush) { - IPos hash_head; - unsigned dist, match_len; - - if (s->block_open == 0) { - static_emit_tree(s, flush); - s->block_open = 1; - } - - do { - if (s->pending + 4 >= s->pending_buf_size) { - flush_pending(s->strm); - return need_more; - } - - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window_sse(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - static_emit_end_block(s, 0); - return need_more; - } - if (s->lookahead == 0) - break; - } - - if (s->lookahead >= MIN_MATCH) { - hash_head = quick_insert_string(s, s->strstart); - dist = s->strstart - hash_head; - - if (dist > 0 && (dist-1) < (s->w_size - 1)) { - match_len = compare258(s->window + s->strstart, s->window + s->strstart - dist); - - if (match_len >= MIN_MATCH) { - if (match_len > s->lookahead) - match_len = s->lookahead; - - if (match_len > MAX_MATCH) - match_len = MAX_MATCH; - - static_emit_ptr(s, match_len - MIN_MATCH, s->strstart - hash_head); - s->lookahead -= match_len; - s->strstart += match_len; - continue; - } - } - } - - static_emit_lit(s, s->window[s->strstart]); - s->strstart++; - s->lookahead--; - } while (s->strm->avail_out != 0); - - if (s->strm->avail_out == 0 && flush != Z_FINISH) - return need_more; - - s->insert = s->strstart < MIN_MATCH - 1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { - static_emit_end_block(s, 1); - if (s->strm->avail_out == 0) - return s->strm->avail_in == 0 ? finish_started : need_more; - else - return finish_done; - } - - static_emit_end_block(s, 0); - return block_done; -} - -static const unsigned quick_len_codes[MAX_MATCH-MIN_MATCH+1] = { - 0x00004007, 0x00002007, 0x00006007, 0x00001007, - 0x00005007, 0x00003007, 0x00007007, 0x00000807, - 0x00004808, 0x0000c808, 0x00002808, 0x0000a808, - 0x00006808, 0x0000e808, 0x00001808, 0x00009808, - 0x00005809, 0x0000d809, 0x00015809, 0x0001d809, - 0x00003809, 0x0000b809, 0x00013809, 0x0001b809, - 0x00007809, 0x0000f809, 0x00017809, 0x0001f809, - 0x00000409, 0x00008409, 0x00010409, 0x00018409, - 0x0000440a, 0x0000c40a, 0x0001440a, 0x0001c40a, - 0x0002440a, 0x0002c40a, 0x0003440a, 0x0003c40a, - 0x0000240a, 0x0000a40a, 0x0001240a, 0x0001a40a, - 0x0002240a, 0x0002a40a, 0x0003240a, 0x0003a40a, - 0x0000640a, 0x0000e40a, 0x0001640a, 0x0001e40a, - 0x0002640a, 0x0002e40a, 0x0003640a, 0x0003e40a, - 0x0000140a, 0x0000940a, 0x0001140a, 0x0001940a, - 0x0002140a, 0x0002940a, 0x0003140a, 0x0003940a, - 0x0000540b, 0x0000d40b, 0x0001540b, 0x0001d40b, - 0x0002540b, 0x0002d40b, 0x0003540b, 0x0003d40b, - 0x0004540b, 0x0004d40b, 0x0005540b, 0x0005d40b, - 0x0006540b, 0x0006d40b, 0x0007540b, 0x0007d40b, - 0x0000340b, 0x0000b40b, 0x0001340b, 0x0001b40b, - 0x0002340b, 0x0002b40b, 0x0003340b, 0x0003b40b, - 0x0004340b, 0x0004b40b, 0x0005340b, 0x0005b40b, - 0x0006340b, 0x0006b40b, 0x0007340b, 0x0007b40b, - 0x0000740b, 0x0000f40b, 0x0001740b, 0x0001f40b, - 0x0002740b, 0x0002f40b, 0x0003740b, 0x0003f40b, - 0x0004740b, 0x0004f40b, 0x0005740b, 0x0005f40b, - 0x0006740b, 0x0006f40b, 0x0007740b, 0x0007f40b, - 0x0000030c, 0x0001030c, 0x0002030c, 0x0003030c, - 0x0004030c, 0x0005030c, 0x0006030c, 0x0007030c, - 0x0008030c, 0x0009030c, 0x000a030c, 0x000b030c, - 0x000c030c, 0x000d030c, 0x000e030c, 0x000f030c, - 0x0000830d, 0x0001830d, 0x0002830d, 0x0003830d, - 0x0004830d, 0x0005830d, 0x0006830d, 0x0007830d, - 0x0008830d, 0x0009830d, 0x000a830d, 0x000b830d, - 0x000c830d, 0x000d830d, 0x000e830d, 0x000f830d, - 0x0010830d, 0x0011830d, 0x0012830d, 0x0013830d, - 0x0014830d, 0x0015830d, 0x0016830d, 0x0017830d, - 0x0018830d, 0x0019830d, 0x001a830d, 0x001b830d, - 0x001c830d, 0x001d830d, 0x001e830d, 0x001f830d, - 0x0000430d, 0x0001430d, 0x0002430d, 0x0003430d, - 0x0004430d, 0x0005430d, 0x0006430d, 0x0007430d, - 0x0008430d, 0x0009430d, 0x000a430d, 0x000b430d, - 0x000c430d, 0x000d430d, 0x000e430d, 0x000f430d, - 0x0010430d, 0x0011430d, 0x0012430d, 0x0013430d, - 0x0014430d, 0x0015430d, 0x0016430d, 0x0017430d, - 0x0018430d, 0x0019430d, 0x001a430d, 0x001b430d, - 0x001c430d, 0x001d430d, 0x001e430d, 0x001f430d, - 0x0000c30d, 0x0001c30d, 0x0002c30d, 0x0003c30d, - 0x0004c30d, 0x0005c30d, 0x0006c30d, 0x0007c30d, - 0x0008c30d, 0x0009c30d, 0x000ac30d, 0x000bc30d, - 0x000cc30d, 0x000dc30d, 0x000ec30d, 0x000fc30d, - 0x0010c30d, 0x0011c30d, 0x0012c30d, 0x0013c30d, - 0x0014c30d, 0x0015c30d, 0x0016c30d, 0x0017c30d, - 0x0018c30d, 0x0019c30d, 0x001ac30d, 0x001bc30d, - 0x001cc30d, 0x001dc30d, 0x001ec30d, 0x001fc30d, - 0x0000230d, 0x0001230d, 0x0002230d, 0x0003230d, - 0x0004230d, 0x0005230d, 0x0006230d, 0x0007230d, - 0x0008230d, 0x0009230d, 0x000a230d, 0x000b230d, - 0x000c230d, 0x000d230d, 0x000e230d, 0x000f230d, - 0x0010230d, 0x0011230d, 0x0012230d, 0x0013230d, - 0x0014230d, 0x0015230d, 0x0016230d, 0x0017230d, - 0x0018230d, 0x0019230d, 0x001a230d, 0x001b230d, - 0x001c230d, 0x001d230d, 0x001e230d, 0x0000a308, -}; - -static const unsigned quick_dist_codes[8192] = { - 0x00000005, 0x00001005, 0x00000805, 0x00001805, - 0x00000406, 0x00002406, 0x00001406, 0x00003406, - 0x00000c07, 0x00002c07, 0x00004c07, 0x00006c07, - 0x00001c07, 0x00003c07, 0x00005c07, 0x00007c07, - 0x00000208, 0x00002208, 0x00004208, 0x00006208, - 0x00008208, 0x0000a208, 0x0000c208, 0x0000e208, - 0x00001208, 0x00003208, 0x00005208, 0x00007208, - 0x00009208, 0x0000b208, 0x0000d208, 0x0000f208, - 0x00000a09, 0x00002a09, 0x00004a09, 0x00006a09, - 0x00008a09, 0x0000aa09, 0x0000ca09, 0x0000ea09, - 0x00010a09, 0x00012a09, 0x00014a09, 0x00016a09, - 0x00018a09, 0x0001aa09, 0x0001ca09, 0x0001ea09, - 0x00001a09, 0x00003a09, 0x00005a09, 0x00007a09, - 0x00009a09, 0x0000ba09, 0x0000da09, 0x0000fa09, - 0x00011a09, 0x00013a09, 0x00015a09, 0x00017a09, - 0x00019a09, 0x0001ba09, 0x0001da09, 0x0001fa09, - 0x0000060a, 0x0000260a, 0x0000460a, 0x0000660a, - 0x0000860a, 0x0000a60a, 0x0000c60a, 0x0000e60a, - 0x0001060a, 0x0001260a, 0x0001460a, 0x0001660a, - 0x0001860a, 0x0001a60a, 0x0001c60a, 0x0001e60a, - 0x0002060a, 0x0002260a, 0x0002460a, 0x0002660a, - 0x0002860a, 0x0002a60a, 0x0002c60a, 0x0002e60a, - 0x0003060a, 0x0003260a, 0x0003460a, 0x0003660a, - 0x0003860a, 0x0003a60a, 0x0003c60a, 0x0003e60a, - 0x0000160a, 0x0000360a, 0x0000560a, 0x0000760a, - 0x0000960a, 0x0000b60a, 0x0000d60a, 0x0000f60a, - 0x0001160a, 0x0001360a, 0x0001560a, 0x0001760a, - 0x0001960a, 0x0001b60a, 0x0001d60a, 0x0001f60a, - 0x0002160a, 0x0002360a, 0x0002560a, 0x0002760a, - 0x0002960a, 0x0002b60a, 0x0002d60a, 0x0002f60a, - 0x0003160a, 0x0003360a, 0x0003560a, 0x0003760a, - 0x0003960a, 0x0003b60a, 0x0003d60a, 0x0003f60a, - 0x00000e0b, 0x00002e0b, 0x00004e0b, 0x00006e0b, - 0x00008e0b, 0x0000ae0b, 0x0000ce0b, 0x0000ee0b, - 0x00010e0b, 0x00012e0b, 0x00014e0b, 0x00016e0b, - 0x00018e0b, 0x0001ae0b, 0x0001ce0b, 0x0001ee0b, - 0x00020e0b, 0x00022e0b, 0x00024e0b, 0x00026e0b, - 0x00028e0b, 0x0002ae0b, 0x0002ce0b, 0x0002ee0b, - 0x00030e0b, 0x00032e0b, 0x00034e0b, 0x00036e0b, - 0x00038e0b, 0x0003ae0b, 0x0003ce0b, 0x0003ee0b, - 0x00040e0b, 0x00042e0b, 0x00044e0b, 0x00046e0b, - 0x00048e0b, 0x0004ae0b, 0x0004ce0b, 0x0004ee0b, - 0x00050e0b, 0x00052e0b, 0x00054e0b, 0x00056e0b, - 0x00058e0b, 0x0005ae0b, 0x0005ce0b, 0x0005ee0b, - 0x00060e0b, 0x00062e0b, 0x00064e0b, 0x00066e0b, - 0x00068e0b, 0x0006ae0b, 0x0006ce0b, 0x0006ee0b, - 0x00070e0b, 0x00072e0b, 0x00074e0b, 0x00076e0b, - 0x00078e0b, 0x0007ae0b, 0x0007ce0b, 0x0007ee0b, - 0x00001e0b, 0x00003e0b, 0x00005e0b, 0x00007e0b, - 0x00009e0b, 0x0000be0b, 0x0000de0b, 0x0000fe0b, - 0x00011e0b, 0x00013e0b, 0x00015e0b, 0x00017e0b, - 0x00019e0b, 0x0001be0b, 0x0001de0b, 0x0001fe0b, - 0x00021e0b, 0x00023e0b, 0x00025e0b, 0x00027e0b, - 0x00029e0b, 0x0002be0b, 0x0002de0b, 0x0002fe0b, - 0x00031e0b, 0x00033e0b, 0x00035e0b, 0x00037e0b, - 0x00039e0b, 0x0003be0b, 0x0003de0b, 0x0003fe0b, - 0x00041e0b, 0x00043e0b, 0x00045e0b, 0x00047e0b, - 0x00049e0b, 0x0004be0b, 0x0004de0b, 0x0004fe0b, - 0x00051e0b, 0x00053e0b, 0x00055e0b, 0x00057e0b, - 0x00059e0b, 0x0005be0b, 0x0005de0b, 0x0005fe0b, - 0x00061e0b, 0x00063e0b, 0x00065e0b, 0x00067e0b, - 0x00069e0b, 0x0006be0b, 0x0006de0b, 0x0006fe0b, - 0x00071e0b, 0x00073e0b, 0x00075e0b, 0x00077e0b, - 0x00079e0b, 0x0007be0b, 0x0007de0b, 0x0007fe0b, - 0x0000010c, 0x0000210c, 0x0000410c, 0x0000610c, - 0x0000810c, 0x0000a10c, 0x0000c10c, 0x0000e10c, - 0x0001010c, 0x0001210c, 0x0001410c, 0x0001610c, - 0x0001810c, 0x0001a10c, 0x0001c10c, 0x0001e10c, - 0x0002010c, 0x0002210c, 0x0002410c, 0x0002610c, - 0x0002810c, 0x0002a10c, 0x0002c10c, 0x0002e10c, - 0x0003010c, 0x0003210c, 0x0003410c, 0x0003610c, - 0x0003810c, 0x0003a10c, 0x0003c10c, 0x0003e10c, - 0x0004010c, 0x0004210c, 0x0004410c, 0x0004610c, - 0x0004810c, 0x0004a10c, 0x0004c10c, 0x0004e10c, - 0x0005010c, 0x0005210c, 0x0005410c, 0x0005610c, - 0x0005810c, 0x0005a10c, 0x0005c10c, 0x0005e10c, - 0x0006010c, 0x0006210c, 0x0006410c, 0x0006610c, - 0x0006810c, 0x0006a10c, 0x0006c10c, 0x0006e10c, - 0x0007010c, 0x0007210c, 0x0007410c, 0x0007610c, - 0x0007810c, 0x0007a10c, 0x0007c10c, 0x0007e10c, - 0x0008010c, 0x0008210c, 0x0008410c, 0x0008610c, - 0x0008810c, 0x0008a10c, 0x0008c10c, 0x0008e10c, - 0x0009010c, 0x0009210c, 0x0009410c, 0x0009610c, - 0x0009810c, 0x0009a10c, 0x0009c10c, 0x0009e10c, - 0x000a010c, 0x000a210c, 0x000a410c, 0x000a610c, - 0x000a810c, 0x000aa10c, 0x000ac10c, 0x000ae10c, - 0x000b010c, 0x000b210c, 0x000b410c, 0x000b610c, - 0x000b810c, 0x000ba10c, 0x000bc10c, 0x000be10c, - 0x000c010c, 0x000c210c, 0x000c410c, 0x000c610c, - 0x000c810c, 0x000ca10c, 0x000cc10c, 0x000ce10c, - 0x000d010c, 0x000d210c, 0x000d410c, 0x000d610c, - 0x000d810c, 0x000da10c, 0x000dc10c, 0x000de10c, - 0x000e010c, 0x000e210c, 0x000e410c, 0x000e610c, - 0x000e810c, 0x000ea10c, 0x000ec10c, 0x000ee10c, - 0x000f010c, 0x000f210c, 0x000f410c, 0x000f610c, - 0x000f810c, 0x000fa10c, 0x000fc10c, 0x000fe10c, - 0x0000110c, 0x0000310c, 0x0000510c, 0x0000710c, - 0x0000910c, 0x0000b10c, 0x0000d10c, 0x0000f10c, - 0x0001110c, 0x0001310c, 0x0001510c, 0x0001710c, - 0x0001910c, 0x0001b10c, 0x0001d10c, 0x0001f10c, - 0x0002110c, 0x0002310c, 0x0002510c, 0x0002710c, - 0x0002910c, 0x0002b10c, 0x0002d10c, 0x0002f10c, - 0x0003110c, 0x0003310c, 0x0003510c, 0x0003710c, - 0x0003910c, 0x0003b10c, 0x0003d10c, 0x0003f10c, - 0x0004110c, 0x0004310c, 0x0004510c, 0x0004710c, - 0x0004910c, 0x0004b10c, 0x0004d10c, 0x0004f10c, - 0x0005110c, 0x0005310c, 0x0005510c, 0x0005710c, - 0x0005910c, 0x0005b10c, 0x0005d10c, 0x0005f10c, - 0x0006110c, 0x0006310c, 0x0006510c, 0x0006710c, - 0x0006910c, 0x0006b10c, 0x0006d10c, 0x0006f10c, - 0x0007110c, 0x0007310c, 0x0007510c, 0x0007710c, - 0x0007910c, 0x0007b10c, 0x0007d10c, 0x0007f10c, - 0x0008110c, 0x0008310c, 0x0008510c, 0x0008710c, - 0x0008910c, 0x0008b10c, 0x0008d10c, 0x0008f10c, - 0x0009110c, 0x0009310c, 0x0009510c, 0x0009710c, - 0x0009910c, 0x0009b10c, 0x0009d10c, 0x0009f10c, - 0x000a110c, 0x000a310c, 0x000a510c, 0x000a710c, - 0x000a910c, 0x000ab10c, 0x000ad10c, 0x000af10c, - 0x000b110c, 0x000b310c, 0x000b510c, 0x000b710c, - 0x000b910c, 0x000bb10c, 0x000bd10c, 0x000bf10c, - 0x000c110c, 0x000c310c, 0x000c510c, 0x000c710c, - 0x000c910c, 0x000cb10c, 0x000cd10c, 0x000cf10c, - 0x000d110c, 0x000d310c, 0x000d510c, 0x000d710c, - 0x000d910c, 0x000db10c, 0x000dd10c, 0x000df10c, - 0x000e110c, 0x000e310c, 0x000e510c, 0x000e710c, - 0x000e910c, 0x000eb10c, 0x000ed10c, 0x000ef10c, - 0x000f110c, 0x000f310c, 0x000f510c, 0x000f710c, - 0x000f910c, 0x000fb10c, 0x000fd10c, 0x000ff10c, - 0x0000090d, 0x0000290d, 0x0000490d, 0x0000690d, - 0x0000890d, 0x0000a90d, 0x0000c90d, 0x0000e90d, - 0x0001090d, 0x0001290d, 0x0001490d, 0x0001690d, - 0x0001890d, 0x0001a90d, 0x0001c90d, 0x0001e90d, - 0x0002090d, 0x0002290d, 0x0002490d, 0x0002690d, - 0x0002890d, 0x0002a90d, 0x0002c90d, 0x0002e90d, - 0x0003090d, 0x0003290d, 0x0003490d, 0x0003690d, - 0x0003890d, 0x0003a90d, 0x0003c90d, 0x0003e90d, - 0x0004090d, 0x0004290d, 0x0004490d, 0x0004690d, - 0x0004890d, 0x0004a90d, 0x0004c90d, 0x0004e90d, - 0x0005090d, 0x0005290d, 0x0005490d, 0x0005690d, - 0x0005890d, 0x0005a90d, 0x0005c90d, 0x0005e90d, - 0x0006090d, 0x0006290d, 0x0006490d, 0x0006690d, - 0x0006890d, 0x0006a90d, 0x0006c90d, 0x0006e90d, - 0x0007090d, 0x0007290d, 0x0007490d, 0x0007690d, - 0x0007890d, 0x0007a90d, 0x0007c90d, 0x0007e90d, - 0x0008090d, 0x0008290d, 0x0008490d, 0x0008690d, - 0x0008890d, 0x0008a90d, 0x0008c90d, 0x0008e90d, - 0x0009090d, 0x0009290d, 0x0009490d, 0x0009690d, - 0x0009890d, 0x0009a90d, 0x0009c90d, 0x0009e90d, - 0x000a090d, 0x000a290d, 0x000a490d, 0x000a690d, - 0x000a890d, 0x000aa90d, 0x000ac90d, 0x000ae90d, - 0x000b090d, 0x000b290d, 0x000b490d, 0x000b690d, - 0x000b890d, 0x000ba90d, 0x000bc90d, 0x000be90d, - 0x000c090d, 0x000c290d, 0x000c490d, 0x000c690d, - 0x000c890d, 0x000ca90d, 0x000cc90d, 0x000ce90d, - 0x000d090d, 0x000d290d, 0x000d490d, 0x000d690d, - 0x000d890d, 0x000da90d, 0x000dc90d, 0x000de90d, - 0x000e090d, 0x000e290d, 0x000e490d, 0x000e690d, - 0x000e890d, 0x000ea90d, 0x000ec90d, 0x000ee90d, - 0x000f090d, 0x000f290d, 0x000f490d, 0x000f690d, - 0x000f890d, 0x000fa90d, 0x000fc90d, 0x000fe90d, - 0x0010090d, 0x0010290d, 0x0010490d, 0x0010690d, - 0x0010890d, 0x0010a90d, 0x0010c90d, 0x0010e90d, - 0x0011090d, 0x0011290d, 0x0011490d, 0x0011690d, - 0x0011890d, 0x0011a90d, 0x0011c90d, 0x0011e90d, - 0x0012090d, 0x0012290d, 0x0012490d, 0x0012690d, - 0x0012890d, 0x0012a90d, 0x0012c90d, 0x0012e90d, - 0x0013090d, 0x0013290d, 0x0013490d, 0x0013690d, - 0x0013890d, 0x0013a90d, 0x0013c90d, 0x0013e90d, - 0x0014090d, 0x0014290d, 0x0014490d, 0x0014690d, - 0x0014890d, 0x0014a90d, 0x0014c90d, 0x0014e90d, - 0x0015090d, 0x0015290d, 0x0015490d, 0x0015690d, - 0x0015890d, 0x0015a90d, 0x0015c90d, 0x0015e90d, - 0x0016090d, 0x0016290d, 0x0016490d, 0x0016690d, - 0x0016890d, 0x0016a90d, 0x0016c90d, 0x0016e90d, - 0x0017090d, 0x0017290d, 0x0017490d, 0x0017690d, - 0x0017890d, 0x0017a90d, 0x0017c90d, 0x0017e90d, - 0x0018090d, 0x0018290d, 0x0018490d, 0x0018690d, - 0x0018890d, 0x0018a90d, 0x0018c90d, 0x0018e90d, - 0x0019090d, 0x0019290d, 0x0019490d, 0x0019690d, - 0x0019890d, 0x0019a90d, 0x0019c90d, 0x0019e90d, - 0x001a090d, 0x001a290d, 0x001a490d, 0x001a690d, - 0x001a890d, 0x001aa90d, 0x001ac90d, 0x001ae90d, - 0x001b090d, 0x001b290d, 0x001b490d, 0x001b690d, - 0x001b890d, 0x001ba90d, 0x001bc90d, 0x001be90d, - 0x001c090d, 0x001c290d, 0x001c490d, 0x001c690d, - 0x001c890d, 0x001ca90d, 0x001cc90d, 0x001ce90d, - 0x001d090d, 0x001d290d, 0x001d490d, 0x001d690d, - 0x001d890d, 0x001da90d, 0x001dc90d, 0x001de90d, - 0x001e090d, 0x001e290d, 0x001e490d, 0x001e690d, - 0x001e890d, 0x001ea90d, 0x001ec90d, 0x001ee90d, - 0x001f090d, 0x001f290d, 0x001f490d, 0x001f690d, - 0x001f890d, 0x001fa90d, 0x001fc90d, 0x001fe90d, - 0x0000190d, 0x0000390d, 0x0000590d, 0x0000790d, - 0x0000990d, 0x0000b90d, 0x0000d90d, 0x0000f90d, - 0x0001190d, 0x0001390d, 0x0001590d, 0x0001790d, - 0x0001990d, 0x0001b90d, 0x0001d90d, 0x0001f90d, - 0x0002190d, 0x0002390d, 0x0002590d, 0x0002790d, - 0x0002990d, 0x0002b90d, 0x0002d90d, 0x0002f90d, - 0x0003190d, 0x0003390d, 0x0003590d, 0x0003790d, - 0x0003990d, 0x0003b90d, 0x0003d90d, 0x0003f90d, - 0x0004190d, 0x0004390d, 0x0004590d, 0x0004790d, - 0x0004990d, 0x0004b90d, 0x0004d90d, 0x0004f90d, - 0x0005190d, 0x0005390d, 0x0005590d, 0x0005790d, - 0x0005990d, 0x0005b90d, 0x0005d90d, 0x0005f90d, - 0x0006190d, 0x0006390d, 0x0006590d, 0x0006790d, - 0x0006990d, 0x0006b90d, 0x0006d90d, 0x0006f90d, - 0x0007190d, 0x0007390d, 0x0007590d, 0x0007790d, - 0x0007990d, 0x0007b90d, 0x0007d90d, 0x0007f90d, - 0x0008190d, 0x0008390d, 0x0008590d, 0x0008790d, - 0x0008990d, 0x0008b90d, 0x0008d90d, 0x0008f90d, - 0x0009190d, 0x0009390d, 0x0009590d, 0x0009790d, - 0x0009990d, 0x0009b90d, 0x0009d90d, 0x0009f90d, - 0x000a190d, 0x000a390d, 0x000a590d, 0x000a790d, - 0x000a990d, 0x000ab90d, 0x000ad90d, 0x000af90d, - 0x000b190d, 0x000b390d, 0x000b590d, 0x000b790d, - 0x000b990d, 0x000bb90d, 0x000bd90d, 0x000bf90d, - 0x000c190d, 0x000c390d, 0x000c590d, 0x000c790d, - 0x000c990d, 0x000cb90d, 0x000cd90d, 0x000cf90d, - 0x000d190d, 0x000d390d, 0x000d590d, 0x000d790d, - 0x000d990d, 0x000db90d, 0x000dd90d, 0x000df90d, - 0x000e190d, 0x000e390d, 0x000e590d, 0x000e790d, - 0x000e990d, 0x000eb90d, 0x000ed90d, 0x000ef90d, - 0x000f190d, 0x000f390d, 0x000f590d, 0x000f790d, - 0x000f990d, 0x000fb90d, 0x000fd90d, 0x000ff90d, - 0x0010190d, 0x0010390d, 0x0010590d, 0x0010790d, - 0x0010990d, 0x0010b90d, 0x0010d90d, 0x0010f90d, - 0x0011190d, 0x0011390d, 0x0011590d, 0x0011790d, - 0x0011990d, 0x0011b90d, 0x0011d90d, 0x0011f90d, - 0x0012190d, 0x0012390d, 0x0012590d, 0x0012790d, - 0x0012990d, 0x0012b90d, 0x0012d90d, 0x0012f90d, - 0x0013190d, 0x0013390d, 0x0013590d, 0x0013790d, - 0x0013990d, 0x0013b90d, 0x0013d90d, 0x0013f90d, - 0x0014190d, 0x0014390d, 0x0014590d, 0x0014790d, - 0x0014990d, 0x0014b90d, 0x0014d90d, 0x0014f90d, - 0x0015190d, 0x0015390d, 0x0015590d, 0x0015790d, - 0x0015990d, 0x0015b90d, 0x0015d90d, 0x0015f90d, - 0x0016190d, 0x0016390d, 0x0016590d, 0x0016790d, - 0x0016990d, 0x0016b90d, 0x0016d90d, 0x0016f90d, - 0x0017190d, 0x0017390d, 0x0017590d, 0x0017790d, - 0x0017990d, 0x0017b90d, 0x0017d90d, 0x0017f90d, - 0x0018190d, 0x0018390d, 0x0018590d, 0x0018790d, - 0x0018990d, 0x0018b90d, 0x0018d90d, 0x0018f90d, - 0x0019190d, 0x0019390d, 0x0019590d, 0x0019790d, - 0x0019990d, 0x0019b90d, 0x0019d90d, 0x0019f90d, - 0x001a190d, 0x001a390d, 0x001a590d, 0x001a790d, - 0x001a990d, 0x001ab90d, 0x001ad90d, 0x001af90d, - 0x001b190d, 0x001b390d, 0x001b590d, 0x001b790d, - 0x001b990d, 0x001bb90d, 0x001bd90d, 0x001bf90d, - 0x001c190d, 0x001c390d, 0x001c590d, 0x001c790d, - 0x001c990d, 0x001cb90d, 0x001cd90d, 0x001cf90d, - 0x001d190d, 0x001d390d, 0x001d590d, 0x001d790d, - 0x001d990d, 0x001db90d, 0x001dd90d, 0x001df90d, - 0x001e190d, 0x001e390d, 0x001e590d, 0x001e790d, - 0x001e990d, 0x001eb90d, 0x001ed90d, 0x001ef90d, - 0x001f190d, 0x001f390d, 0x001f590d, 0x001f790d, - 0x001f990d, 0x001fb90d, 0x001fd90d, 0x001ff90d, - 0x0000050e, 0x0000250e, 0x0000450e, 0x0000650e, - 0x0000850e, 0x0000a50e, 0x0000c50e, 0x0000e50e, - 0x0001050e, 0x0001250e, 0x0001450e, 0x0001650e, - 0x0001850e, 0x0001a50e, 0x0001c50e, 0x0001e50e, - 0x0002050e, 0x0002250e, 0x0002450e, 0x0002650e, - 0x0002850e, 0x0002a50e, 0x0002c50e, 0x0002e50e, - 0x0003050e, 0x0003250e, 0x0003450e, 0x0003650e, - 0x0003850e, 0x0003a50e, 0x0003c50e, 0x0003e50e, - 0x0004050e, 0x0004250e, 0x0004450e, 0x0004650e, - 0x0004850e, 0x0004a50e, 0x0004c50e, 0x0004e50e, - 0x0005050e, 0x0005250e, 0x0005450e, 0x0005650e, - 0x0005850e, 0x0005a50e, 0x0005c50e, 0x0005e50e, - 0x0006050e, 0x0006250e, 0x0006450e, 0x0006650e, - 0x0006850e, 0x0006a50e, 0x0006c50e, 0x0006e50e, - 0x0007050e, 0x0007250e, 0x0007450e, 0x0007650e, - 0x0007850e, 0x0007a50e, 0x0007c50e, 0x0007e50e, - 0x0008050e, 0x0008250e, 0x0008450e, 0x0008650e, - 0x0008850e, 0x0008a50e, 0x0008c50e, 0x0008e50e, - 0x0009050e, 0x0009250e, 0x0009450e, 0x0009650e, - 0x0009850e, 0x0009a50e, 0x0009c50e, 0x0009e50e, - 0x000a050e, 0x000a250e, 0x000a450e, 0x000a650e, - 0x000a850e, 0x000aa50e, 0x000ac50e, 0x000ae50e, - 0x000b050e, 0x000b250e, 0x000b450e, 0x000b650e, - 0x000b850e, 0x000ba50e, 0x000bc50e, 0x000be50e, - 0x000c050e, 0x000c250e, 0x000c450e, 0x000c650e, - 0x000c850e, 0x000ca50e, 0x000cc50e, 0x000ce50e, - 0x000d050e, 0x000d250e, 0x000d450e, 0x000d650e, - 0x000d850e, 0x000da50e, 0x000dc50e, 0x000de50e, - 0x000e050e, 0x000e250e, 0x000e450e, 0x000e650e, - 0x000e850e, 0x000ea50e, 0x000ec50e, 0x000ee50e, - 0x000f050e, 0x000f250e, 0x000f450e, 0x000f650e, - 0x000f850e, 0x000fa50e, 0x000fc50e, 0x000fe50e, - 0x0010050e, 0x0010250e, 0x0010450e, 0x0010650e, - 0x0010850e, 0x0010a50e, 0x0010c50e, 0x0010e50e, - 0x0011050e, 0x0011250e, 0x0011450e, 0x0011650e, - 0x0011850e, 0x0011a50e, 0x0011c50e, 0x0011e50e, - 0x0012050e, 0x0012250e, 0x0012450e, 0x0012650e, - 0x0012850e, 0x0012a50e, 0x0012c50e, 0x0012e50e, - 0x0013050e, 0x0013250e, 0x0013450e, 0x0013650e, - 0x0013850e, 0x0013a50e, 0x0013c50e, 0x0013e50e, - 0x0014050e, 0x0014250e, 0x0014450e, 0x0014650e, - 0x0014850e, 0x0014a50e, 0x0014c50e, 0x0014e50e, - 0x0015050e, 0x0015250e, 0x0015450e, 0x0015650e, - 0x0015850e, 0x0015a50e, 0x0015c50e, 0x0015e50e, - 0x0016050e, 0x0016250e, 0x0016450e, 0x0016650e, - 0x0016850e, 0x0016a50e, 0x0016c50e, 0x0016e50e, - 0x0017050e, 0x0017250e, 0x0017450e, 0x0017650e, - 0x0017850e, 0x0017a50e, 0x0017c50e, 0x0017e50e, - 0x0018050e, 0x0018250e, 0x0018450e, 0x0018650e, - 0x0018850e, 0x0018a50e, 0x0018c50e, 0x0018e50e, - 0x0019050e, 0x0019250e, 0x0019450e, 0x0019650e, - 0x0019850e, 0x0019a50e, 0x0019c50e, 0x0019e50e, - 0x001a050e, 0x001a250e, 0x001a450e, 0x001a650e, - 0x001a850e, 0x001aa50e, 0x001ac50e, 0x001ae50e, - 0x001b050e, 0x001b250e, 0x001b450e, 0x001b650e, - 0x001b850e, 0x001ba50e, 0x001bc50e, 0x001be50e, - 0x001c050e, 0x001c250e, 0x001c450e, 0x001c650e, - 0x001c850e, 0x001ca50e, 0x001cc50e, 0x001ce50e, - 0x001d050e, 0x001d250e, 0x001d450e, 0x001d650e, - 0x001d850e, 0x001da50e, 0x001dc50e, 0x001de50e, - 0x001e050e, 0x001e250e, 0x001e450e, 0x001e650e, - 0x001e850e, 0x001ea50e, 0x001ec50e, 0x001ee50e, - 0x001f050e, 0x001f250e, 0x001f450e, 0x001f650e, - 0x001f850e, 0x001fa50e, 0x001fc50e, 0x001fe50e, - 0x0020050e, 0x0020250e, 0x0020450e, 0x0020650e, - 0x0020850e, 0x0020a50e, 0x0020c50e, 0x0020e50e, - 0x0021050e, 0x0021250e, 0x0021450e, 0x0021650e, - 0x0021850e, 0x0021a50e, 0x0021c50e, 0x0021e50e, - 0x0022050e, 0x0022250e, 0x0022450e, 0x0022650e, - 0x0022850e, 0x0022a50e, 0x0022c50e, 0x0022e50e, - 0x0023050e, 0x0023250e, 0x0023450e, 0x0023650e, - 0x0023850e, 0x0023a50e, 0x0023c50e, 0x0023e50e, - 0x0024050e, 0x0024250e, 0x0024450e, 0x0024650e, - 0x0024850e, 0x0024a50e, 0x0024c50e, 0x0024e50e, - 0x0025050e, 0x0025250e, 0x0025450e, 0x0025650e, - 0x0025850e, 0x0025a50e, 0x0025c50e, 0x0025e50e, - 0x0026050e, 0x0026250e, 0x0026450e, 0x0026650e, - 0x0026850e, 0x0026a50e, 0x0026c50e, 0x0026e50e, - 0x0027050e, 0x0027250e, 0x0027450e, 0x0027650e, - 0x0027850e, 0x0027a50e, 0x0027c50e, 0x0027e50e, - 0x0028050e, 0x0028250e, 0x0028450e, 0x0028650e, - 0x0028850e, 0x0028a50e, 0x0028c50e, 0x0028e50e, - 0x0029050e, 0x0029250e, 0x0029450e, 0x0029650e, - 0x0029850e, 0x0029a50e, 0x0029c50e, 0x0029e50e, - 0x002a050e, 0x002a250e, 0x002a450e, 0x002a650e, - 0x002a850e, 0x002aa50e, 0x002ac50e, 0x002ae50e, - 0x002b050e, 0x002b250e, 0x002b450e, 0x002b650e, - 0x002b850e, 0x002ba50e, 0x002bc50e, 0x002be50e, - 0x002c050e, 0x002c250e, 0x002c450e, 0x002c650e, - 0x002c850e, 0x002ca50e, 0x002cc50e, 0x002ce50e, - 0x002d050e, 0x002d250e, 0x002d450e, 0x002d650e, - 0x002d850e, 0x002da50e, 0x002dc50e, 0x002de50e, - 0x002e050e, 0x002e250e, 0x002e450e, 0x002e650e, - 0x002e850e, 0x002ea50e, 0x002ec50e, 0x002ee50e, - 0x002f050e, 0x002f250e, 0x002f450e, 0x002f650e, - 0x002f850e, 0x002fa50e, 0x002fc50e, 0x002fe50e, - 0x0030050e, 0x0030250e, 0x0030450e, 0x0030650e, - 0x0030850e, 0x0030a50e, 0x0030c50e, 0x0030e50e, - 0x0031050e, 0x0031250e, 0x0031450e, 0x0031650e, - 0x0031850e, 0x0031a50e, 0x0031c50e, 0x0031e50e, - 0x0032050e, 0x0032250e, 0x0032450e, 0x0032650e, - 0x0032850e, 0x0032a50e, 0x0032c50e, 0x0032e50e, - 0x0033050e, 0x0033250e, 0x0033450e, 0x0033650e, - 0x0033850e, 0x0033a50e, 0x0033c50e, 0x0033e50e, - 0x0034050e, 0x0034250e, 0x0034450e, 0x0034650e, - 0x0034850e, 0x0034a50e, 0x0034c50e, 0x0034e50e, - 0x0035050e, 0x0035250e, 0x0035450e, 0x0035650e, - 0x0035850e, 0x0035a50e, 0x0035c50e, 0x0035e50e, - 0x0036050e, 0x0036250e, 0x0036450e, 0x0036650e, - 0x0036850e, 0x0036a50e, 0x0036c50e, 0x0036e50e, - 0x0037050e, 0x0037250e, 0x0037450e, 0x0037650e, - 0x0037850e, 0x0037a50e, 0x0037c50e, 0x0037e50e, - 0x0038050e, 0x0038250e, 0x0038450e, 0x0038650e, - 0x0038850e, 0x0038a50e, 0x0038c50e, 0x0038e50e, - 0x0039050e, 0x0039250e, 0x0039450e, 0x0039650e, - 0x0039850e, 0x0039a50e, 0x0039c50e, 0x0039e50e, - 0x003a050e, 0x003a250e, 0x003a450e, 0x003a650e, - 0x003a850e, 0x003aa50e, 0x003ac50e, 0x003ae50e, - 0x003b050e, 0x003b250e, 0x003b450e, 0x003b650e, - 0x003b850e, 0x003ba50e, 0x003bc50e, 0x003be50e, - 0x003c050e, 0x003c250e, 0x003c450e, 0x003c650e, - 0x003c850e, 0x003ca50e, 0x003cc50e, 0x003ce50e, - 0x003d050e, 0x003d250e, 0x003d450e, 0x003d650e, - 0x003d850e, 0x003da50e, 0x003dc50e, 0x003de50e, - 0x003e050e, 0x003e250e, 0x003e450e, 0x003e650e, - 0x003e850e, 0x003ea50e, 0x003ec50e, 0x003ee50e, - 0x003f050e, 0x003f250e, 0x003f450e, 0x003f650e, - 0x003f850e, 0x003fa50e, 0x003fc50e, 0x003fe50e, - 0x0000150e, 0x0000350e, 0x0000550e, 0x0000750e, - 0x0000950e, 0x0000b50e, 0x0000d50e, 0x0000f50e, - 0x0001150e, 0x0001350e, 0x0001550e, 0x0001750e, - 0x0001950e, 0x0001b50e, 0x0001d50e, 0x0001f50e, - 0x0002150e, 0x0002350e, 0x0002550e, 0x0002750e, - 0x0002950e, 0x0002b50e, 0x0002d50e, 0x0002f50e, - 0x0003150e, 0x0003350e, 0x0003550e, 0x0003750e, - 0x0003950e, 0x0003b50e, 0x0003d50e, 0x0003f50e, - 0x0004150e, 0x0004350e, 0x0004550e, 0x0004750e, - 0x0004950e, 0x0004b50e, 0x0004d50e, 0x0004f50e, - 0x0005150e, 0x0005350e, 0x0005550e, 0x0005750e, - 0x0005950e, 0x0005b50e, 0x0005d50e, 0x0005f50e, - 0x0006150e, 0x0006350e, 0x0006550e, 0x0006750e, - 0x0006950e, 0x0006b50e, 0x0006d50e, 0x0006f50e, - 0x0007150e, 0x0007350e, 0x0007550e, 0x0007750e, - 0x0007950e, 0x0007b50e, 0x0007d50e, 0x0007f50e, - 0x0008150e, 0x0008350e, 0x0008550e, 0x0008750e, - 0x0008950e, 0x0008b50e, 0x0008d50e, 0x0008f50e, - 0x0009150e, 0x0009350e, 0x0009550e, 0x0009750e, - 0x0009950e, 0x0009b50e, 0x0009d50e, 0x0009f50e, - 0x000a150e, 0x000a350e, 0x000a550e, 0x000a750e, - 0x000a950e, 0x000ab50e, 0x000ad50e, 0x000af50e, - 0x000b150e, 0x000b350e, 0x000b550e, 0x000b750e, - 0x000b950e, 0x000bb50e, 0x000bd50e, 0x000bf50e, - 0x000c150e, 0x000c350e, 0x000c550e, 0x000c750e, - 0x000c950e, 0x000cb50e, 0x000cd50e, 0x000cf50e, - 0x000d150e, 0x000d350e, 0x000d550e, 0x000d750e, - 0x000d950e, 0x000db50e, 0x000dd50e, 0x000df50e, - 0x000e150e, 0x000e350e, 0x000e550e, 0x000e750e, - 0x000e950e, 0x000eb50e, 0x000ed50e, 0x000ef50e, - 0x000f150e, 0x000f350e, 0x000f550e, 0x000f750e, - 0x000f950e, 0x000fb50e, 0x000fd50e, 0x000ff50e, - 0x0010150e, 0x0010350e, 0x0010550e, 0x0010750e, - 0x0010950e, 0x0010b50e, 0x0010d50e, 0x0010f50e, - 0x0011150e, 0x0011350e, 0x0011550e, 0x0011750e, - 0x0011950e, 0x0011b50e, 0x0011d50e, 0x0011f50e, - 0x0012150e, 0x0012350e, 0x0012550e, 0x0012750e, - 0x0012950e, 0x0012b50e, 0x0012d50e, 0x0012f50e, - 0x0013150e, 0x0013350e, 0x0013550e, 0x0013750e, - 0x0013950e, 0x0013b50e, 0x0013d50e, 0x0013f50e, - 0x0014150e, 0x0014350e, 0x0014550e, 0x0014750e, - 0x0014950e, 0x0014b50e, 0x0014d50e, 0x0014f50e, - 0x0015150e, 0x0015350e, 0x0015550e, 0x0015750e, - 0x0015950e, 0x0015b50e, 0x0015d50e, 0x0015f50e, - 0x0016150e, 0x0016350e, 0x0016550e, 0x0016750e, - 0x0016950e, 0x0016b50e, 0x0016d50e, 0x0016f50e, - 0x0017150e, 0x0017350e, 0x0017550e, 0x0017750e, - 0x0017950e, 0x0017b50e, 0x0017d50e, 0x0017f50e, - 0x0018150e, 0x0018350e, 0x0018550e, 0x0018750e, - 0x0018950e, 0x0018b50e, 0x0018d50e, 0x0018f50e, - 0x0019150e, 0x0019350e, 0x0019550e, 0x0019750e, - 0x0019950e, 0x0019b50e, 0x0019d50e, 0x0019f50e, - 0x001a150e, 0x001a350e, 0x001a550e, 0x001a750e, - 0x001a950e, 0x001ab50e, 0x001ad50e, 0x001af50e, - 0x001b150e, 0x001b350e, 0x001b550e, 0x001b750e, - 0x001b950e, 0x001bb50e, 0x001bd50e, 0x001bf50e, - 0x001c150e, 0x001c350e, 0x001c550e, 0x001c750e, - 0x001c950e, 0x001cb50e, 0x001cd50e, 0x001cf50e, - 0x001d150e, 0x001d350e, 0x001d550e, 0x001d750e, - 0x001d950e, 0x001db50e, 0x001dd50e, 0x001df50e, - 0x001e150e, 0x001e350e, 0x001e550e, 0x001e750e, - 0x001e950e, 0x001eb50e, 0x001ed50e, 0x001ef50e, - 0x001f150e, 0x001f350e, 0x001f550e, 0x001f750e, - 0x001f950e, 0x001fb50e, 0x001fd50e, 0x001ff50e, - 0x0020150e, 0x0020350e, 0x0020550e, 0x0020750e, - 0x0020950e, 0x0020b50e, 0x0020d50e, 0x0020f50e, - 0x0021150e, 0x0021350e, 0x0021550e, 0x0021750e, - 0x0021950e, 0x0021b50e, 0x0021d50e, 0x0021f50e, - 0x0022150e, 0x0022350e, 0x0022550e, 0x0022750e, - 0x0022950e, 0x0022b50e, 0x0022d50e, 0x0022f50e, - 0x0023150e, 0x0023350e, 0x0023550e, 0x0023750e, - 0x0023950e, 0x0023b50e, 0x0023d50e, 0x0023f50e, - 0x0024150e, 0x0024350e, 0x0024550e, 0x0024750e, - 0x0024950e, 0x0024b50e, 0x0024d50e, 0x0024f50e, - 0x0025150e, 0x0025350e, 0x0025550e, 0x0025750e, - 0x0025950e, 0x0025b50e, 0x0025d50e, 0x0025f50e, - 0x0026150e, 0x0026350e, 0x0026550e, 0x0026750e, - 0x0026950e, 0x0026b50e, 0x0026d50e, 0x0026f50e, - 0x0027150e, 0x0027350e, 0x0027550e, 0x0027750e, - 0x0027950e, 0x0027b50e, 0x0027d50e, 0x0027f50e, - 0x0028150e, 0x0028350e, 0x0028550e, 0x0028750e, - 0x0028950e, 0x0028b50e, 0x0028d50e, 0x0028f50e, - 0x0029150e, 0x0029350e, 0x0029550e, 0x0029750e, - 0x0029950e, 0x0029b50e, 0x0029d50e, 0x0029f50e, - 0x002a150e, 0x002a350e, 0x002a550e, 0x002a750e, - 0x002a950e, 0x002ab50e, 0x002ad50e, 0x002af50e, - 0x002b150e, 0x002b350e, 0x002b550e, 0x002b750e, - 0x002b950e, 0x002bb50e, 0x002bd50e, 0x002bf50e, - 0x002c150e, 0x002c350e, 0x002c550e, 0x002c750e, - 0x002c950e, 0x002cb50e, 0x002cd50e, 0x002cf50e, - 0x002d150e, 0x002d350e, 0x002d550e, 0x002d750e, - 0x002d950e, 0x002db50e, 0x002dd50e, 0x002df50e, - 0x002e150e, 0x002e350e, 0x002e550e, 0x002e750e, - 0x002e950e, 0x002eb50e, 0x002ed50e, 0x002ef50e, - 0x002f150e, 0x002f350e, 0x002f550e, 0x002f750e, - 0x002f950e, 0x002fb50e, 0x002fd50e, 0x002ff50e, - 0x0030150e, 0x0030350e, 0x0030550e, 0x0030750e, - 0x0030950e, 0x0030b50e, 0x0030d50e, 0x0030f50e, - 0x0031150e, 0x0031350e, 0x0031550e, 0x0031750e, - 0x0031950e, 0x0031b50e, 0x0031d50e, 0x0031f50e, - 0x0032150e, 0x0032350e, 0x0032550e, 0x0032750e, - 0x0032950e, 0x0032b50e, 0x0032d50e, 0x0032f50e, - 0x0033150e, 0x0033350e, 0x0033550e, 0x0033750e, - 0x0033950e, 0x0033b50e, 0x0033d50e, 0x0033f50e, - 0x0034150e, 0x0034350e, 0x0034550e, 0x0034750e, - 0x0034950e, 0x0034b50e, 0x0034d50e, 0x0034f50e, - 0x0035150e, 0x0035350e, 0x0035550e, 0x0035750e, - 0x0035950e, 0x0035b50e, 0x0035d50e, 0x0035f50e, - 0x0036150e, 0x0036350e, 0x0036550e, 0x0036750e, - 0x0036950e, 0x0036b50e, 0x0036d50e, 0x0036f50e, - 0x0037150e, 0x0037350e, 0x0037550e, 0x0037750e, - 0x0037950e, 0x0037b50e, 0x0037d50e, 0x0037f50e, - 0x0038150e, 0x0038350e, 0x0038550e, 0x0038750e, - 0x0038950e, 0x0038b50e, 0x0038d50e, 0x0038f50e, - 0x0039150e, 0x0039350e, 0x0039550e, 0x0039750e, - 0x0039950e, 0x0039b50e, 0x0039d50e, 0x0039f50e, - 0x003a150e, 0x003a350e, 0x003a550e, 0x003a750e, - 0x003a950e, 0x003ab50e, 0x003ad50e, 0x003af50e, - 0x003b150e, 0x003b350e, 0x003b550e, 0x003b750e, - 0x003b950e, 0x003bb50e, 0x003bd50e, 0x003bf50e, - 0x003c150e, 0x003c350e, 0x003c550e, 0x003c750e, - 0x003c950e, 0x003cb50e, 0x003cd50e, 0x003cf50e, - 0x003d150e, 0x003d350e, 0x003d550e, 0x003d750e, - 0x003d950e, 0x003db50e, 0x003dd50e, 0x003df50e, - 0x003e150e, 0x003e350e, 0x003e550e, 0x003e750e, - 0x003e950e, 0x003eb50e, 0x003ed50e, 0x003ef50e, - 0x003f150e, 0x003f350e, 0x003f550e, 0x003f750e, - 0x003f950e, 0x003fb50e, 0x003fd50e, 0x003ff50e, - 0x00000d0f, 0x00002d0f, 0x00004d0f, 0x00006d0f, - 0x00008d0f, 0x0000ad0f, 0x0000cd0f, 0x0000ed0f, - 0x00010d0f, 0x00012d0f, 0x00014d0f, 0x00016d0f, - 0x00018d0f, 0x0001ad0f, 0x0001cd0f, 0x0001ed0f, - 0x00020d0f, 0x00022d0f, 0x00024d0f, 0x00026d0f, - 0x00028d0f, 0x0002ad0f, 0x0002cd0f, 0x0002ed0f, - 0x00030d0f, 0x00032d0f, 0x00034d0f, 0x00036d0f, - 0x00038d0f, 0x0003ad0f, 0x0003cd0f, 0x0003ed0f, - 0x00040d0f, 0x00042d0f, 0x00044d0f, 0x00046d0f, - 0x00048d0f, 0x0004ad0f, 0x0004cd0f, 0x0004ed0f, - 0x00050d0f, 0x00052d0f, 0x00054d0f, 0x00056d0f, - 0x00058d0f, 0x0005ad0f, 0x0005cd0f, 0x0005ed0f, - 0x00060d0f, 0x00062d0f, 0x00064d0f, 0x00066d0f, - 0x00068d0f, 0x0006ad0f, 0x0006cd0f, 0x0006ed0f, - 0x00070d0f, 0x00072d0f, 0x00074d0f, 0x00076d0f, - 0x00078d0f, 0x0007ad0f, 0x0007cd0f, 0x0007ed0f, - 0x00080d0f, 0x00082d0f, 0x00084d0f, 0x00086d0f, - 0x00088d0f, 0x0008ad0f, 0x0008cd0f, 0x0008ed0f, - 0x00090d0f, 0x00092d0f, 0x00094d0f, 0x00096d0f, - 0x00098d0f, 0x0009ad0f, 0x0009cd0f, 0x0009ed0f, - 0x000a0d0f, 0x000a2d0f, 0x000a4d0f, 0x000a6d0f, - 0x000a8d0f, 0x000aad0f, 0x000acd0f, 0x000aed0f, - 0x000b0d0f, 0x000b2d0f, 0x000b4d0f, 0x000b6d0f, - 0x000b8d0f, 0x000bad0f, 0x000bcd0f, 0x000bed0f, - 0x000c0d0f, 0x000c2d0f, 0x000c4d0f, 0x000c6d0f, - 0x000c8d0f, 0x000cad0f, 0x000ccd0f, 0x000ced0f, - 0x000d0d0f, 0x000d2d0f, 0x000d4d0f, 0x000d6d0f, - 0x000d8d0f, 0x000dad0f, 0x000dcd0f, 0x000ded0f, - 0x000e0d0f, 0x000e2d0f, 0x000e4d0f, 0x000e6d0f, - 0x000e8d0f, 0x000ead0f, 0x000ecd0f, 0x000eed0f, - 0x000f0d0f, 0x000f2d0f, 0x000f4d0f, 0x000f6d0f, - 0x000f8d0f, 0x000fad0f, 0x000fcd0f, 0x000fed0f, - 0x00100d0f, 0x00102d0f, 0x00104d0f, 0x00106d0f, - 0x00108d0f, 0x0010ad0f, 0x0010cd0f, 0x0010ed0f, - 0x00110d0f, 0x00112d0f, 0x00114d0f, 0x00116d0f, - 0x00118d0f, 0x0011ad0f, 0x0011cd0f, 0x0011ed0f, - 0x00120d0f, 0x00122d0f, 0x00124d0f, 0x00126d0f, - 0x00128d0f, 0x0012ad0f, 0x0012cd0f, 0x0012ed0f, - 0x00130d0f, 0x00132d0f, 0x00134d0f, 0x00136d0f, - 0x00138d0f, 0x0013ad0f, 0x0013cd0f, 0x0013ed0f, - 0x00140d0f, 0x00142d0f, 0x00144d0f, 0x00146d0f, - 0x00148d0f, 0x0014ad0f, 0x0014cd0f, 0x0014ed0f, - 0x00150d0f, 0x00152d0f, 0x00154d0f, 0x00156d0f, - 0x00158d0f, 0x0015ad0f, 0x0015cd0f, 0x0015ed0f, - 0x00160d0f, 0x00162d0f, 0x00164d0f, 0x00166d0f, - 0x00168d0f, 0x0016ad0f, 0x0016cd0f, 0x0016ed0f, - 0x00170d0f, 0x00172d0f, 0x00174d0f, 0x00176d0f, - 0x00178d0f, 0x0017ad0f, 0x0017cd0f, 0x0017ed0f, - 0x00180d0f, 0x00182d0f, 0x00184d0f, 0x00186d0f, - 0x00188d0f, 0x0018ad0f, 0x0018cd0f, 0x0018ed0f, - 0x00190d0f, 0x00192d0f, 0x00194d0f, 0x00196d0f, - 0x00198d0f, 0x0019ad0f, 0x0019cd0f, 0x0019ed0f, - 0x001a0d0f, 0x001a2d0f, 0x001a4d0f, 0x001a6d0f, - 0x001a8d0f, 0x001aad0f, 0x001acd0f, 0x001aed0f, - 0x001b0d0f, 0x001b2d0f, 0x001b4d0f, 0x001b6d0f, - 0x001b8d0f, 0x001bad0f, 0x001bcd0f, 0x001bed0f, - 0x001c0d0f, 0x001c2d0f, 0x001c4d0f, 0x001c6d0f, - 0x001c8d0f, 0x001cad0f, 0x001ccd0f, 0x001ced0f, - 0x001d0d0f, 0x001d2d0f, 0x001d4d0f, 0x001d6d0f, - 0x001d8d0f, 0x001dad0f, 0x001dcd0f, 0x001ded0f, - 0x001e0d0f, 0x001e2d0f, 0x001e4d0f, 0x001e6d0f, - 0x001e8d0f, 0x001ead0f, 0x001ecd0f, 0x001eed0f, - 0x001f0d0f, 0x001f2d0f, 0x001f4d0f, 0x001f6d0f, - 0x001f8d0f, 0x001fad0f, 0x001fcd0f, 0x001fed0f, - 0x00200d0f, 0x00202d0f, 0x00204d0f, 0x00206d0f, - 0x00208d0f, 0x0020ad0f, 0x0020cd0f, 0x0020ed0f, - 0x00210d0f, 0x00212d0f, 0x00214d0f, 0x00216d0f, - 0x00218d0f, 0x0021ad0f, 0x0021cd0f, 0x0021ed0f, - 0x00220d0f, 0x00222d0f, 0x00224d0f, 0x00226d0f, - 0x00228d0f, 0x0022ad0f, 0x0022cd0f, 0x0022ed0f, - 0x00230d0f, 0x00232d0f, 0x00234d0f, 0x00236d0f, - 0x00238d0f, 0x0023ad0f, 0x0023cd0f, 0x0023ed0f, - 0x00240d0f, 0x00242d0f, 0x00244d0f, 0x00246d0f, - 0x00248d0f, 0x0024ad0f, 0x0024cd0f, 0x0024ed0f, - 0x00250d0f, 0x00252d0f, 0x00254d0f, 0x00256d0f, - 0x00258d0f, 0x0025ad0f, 0x0025cd0f, 0x0025ed0f, - 0x00260d0f, 0x00262d0f, 0x00264d0f, 0x00266d0f, - 0x00268d0f, 0x0026ad0f, 0x0026cd0f, 0x0026ed0f, - 0x00270d0f, 0x00272d0f, 0x00274d0f, 0x00276d0f, - 0x00278d0f, 0x0027ad0f, 0x0027cd0f, 0x0027ed0f, - 0x00280d0f, 0x00282d0f, 0x00284d0f, 0x00286d0f, - 0x00288d0f, 0x0028ad0f, 0x0028cd0f, 0x0028ed0f, - 0x00290d0f, 0x00292d0f, 0x00294d0f, 0x00296d0f, - 0x00298d0f, 0x0029ad0f, 0x0029cd0f, 0x0029ed0f, - 0x002a0d0f, 0x002a2d0f, 0x002a4d0f, 0x002a6d0f, - 0x002a8d0f, 0x002aad0f, 0x002acd0f, 0x002aed0f, - 0x002b0d0f, 0x002b2d0f, 0x002b4d0f, 0x002b6d0f, - 0x002b8d0f, 0x002bad0f, 0x002bcd0f, 0x002bed0f, - 0x002c0d0f, 0x002c2d0f, 0x002c4d0f, 0x002c6d0f, - 0x002c8d0f, 0x002cad0f, 0x002ccd0f, 0x002ced0f, - 0x002d0d0f, 0x002d2d0f, 0x002d4d0f, 0x002d6d0f, - 0x002d8d0f, 0x002dad0f, 0x002dcd0f, 0x002ded0f, - 0x002e0d0f, 0x002e2d0f, 0x002e4d0f, 0x002e6d0f, - 0x002e8d0f, 0x002ead0f, 0x002ecd0f, 0x002eed0f, - 0x002f0d0f, 0x002f2d0f, 0x002f4d0f, 0x002f6d0f, - 0x002f8d0f, 0x002fad0f, 0x002fcd0f, 0x002fed0f, - 0x00300d0f, 0x00302d0f, 0x00304d0f, 0x00306d0f, - 0x00308d0f, 0x0030ad0f, 0x0030cd0f, 0x0030ed0f, - 0x00310d0f, 0x00312d0f, 0x00314d0f, 0x00316d0f, - 0x00318d0f, 0x0031ad0f, 0x0031cd0f, 0x0031ed0f, - 0x00320d0f, 0x00322d0f, 0x00324d0f, 0x00326d0f, - 0x00328d0f, 0x0032ad0f, 0x0032cd0f, 0x0032ed0f, - 0x00330d0f, 0x00332d0f, 0x00334d0f, 0x00336d0f, - 0x00338d0f, 0x0033ad0f, 0x0033cd0f, 0x0033ed0f, - 0x00340d0f, 0x00342d0f, 0x00344d0f, 0x00346d0f, - 0x00348d0f, 0x0034ad0f, 0x0034cd0f, 0x0034ed0f, - 0x00350d0f, 0x00352d0f, 0x00354d0f, 0x00356d0f, - 0x00358d0f, 0x0035ad0f, 0x0035cd0f, 0x0035ed0f, - 0x00360d0f, 0x00362d0f, 0x00364d0f, 0x00366d0f, - 0x00368d0f, 0x0036ad0f, 0x0036cd0f, 0x0036ed0f, - 0x00370d0f, 0x00372d0f, 0x00374d0f, 0x00376d0f, - 0x00378d0f, 0x0037ad0f, 0x0037cd0f, 0x0037ed0f, - 0x00380d0f, 0x00382d0f, 0x00384d0f, 0x00386d0f, - 0x00388d0f, 0x0038ad0f, 0x0038cd0f, 0x0038ed0f, - 0x00390d0f, 0x00392d0f, 0x00394d0f, 0x00396d0f, - 0x00398d0f, 0x0039ad0f, 0x0039cd0f, 0x0039ed0f, - 0x003a0d0f, 0x003a2d0f, 0x003a4d0f, 0x003a6d0f, - 0x003a8d0f, 0x003aad0f, 0x003acd0f, 0x003aed0f, - 0x003b0d0f, 0x003b2d0f, 0x003b4d0f, 0x003b6d0f, - 0x003b8d0f, 0x003bad0f, 0x003bcd0f, 0x003bed0f, - 0x003c0d0f, 0x003c2d0f, 0x003c4d0f, 0x003c6d0f, - 0x003c8d0f, 0x003cad0f, 0x003ccd0f, 0x003ced0f, - 0x003d0d0f, 0x003d2d0f, 0x003d4d0f, 0x003d6d0f, - 0x003d8d0f, 0x003dad0f, 0x003dcd0f, 0x003ded0f, - 0x003e0d0f, 0x003e2d0f, 0x003e4d0f, 0x003e6d0f, - 0x003e8d0f, 0x003ead0f, 0x003ecd0f, 0x003eed0f, - 0x003f0d0f, 0x003f2d0f, 0x003f4d0f, 0x003f6d0f, - 0x003f8d0f, 0x003fad0f, 0x003fcd0f, 0x003fed0f, - 0x00400d0f, 0x00402d0f, 0x00404d0f, 0x00406d0f, - 0x00408d0f, 0x0040ad0f, 0x0040cd0f, 0x0040ed0f, - 0x00410d0f, 0x00412d0f, 0x00414d0f, 0x00416d0f, - 0x00418d0f, 0x0041ad0f, 0x0041cd0f, 0x0041ed0f, - 0x00420d0f, 0x00422d0f, 0x00424d0f, 0x00426d0f, - 0x00428d0f, 0x0042ad0f, 0x0042cd0f, 0x0042ed0f, - 0x00430d0f, 0x00432d0f, 0x00434d0f, 0x00436d0f, - 0x00438d0f, 0x0043ad0f, 0x0043cd0f, 0x0043ed0f, - 0x00440d0f, 0x00442d0f, 0x00444d0f, 0x00446d0f, - 0x00448d0f, 0x0044ad0f, 0x0044cd0f, 0x0044ed0f, - 0x00450d0f, 0x00452d0f, 0x00454d0f, 0x00456d0f, - 0x00458d0f, 0x0045ad0f, 0x0045cd0f, 0x0045ed0f, - 0x00460d0f, 0x00462d0f, 0x00464d0f, 0x00466d0f, - 0x00468d0f, 0x0046ad0f, 0x0046cd0f, 0x0046ed0f, - 0x00470d0f, 0x00472d0f, 0x00474d0f, 0x00476d0f, - 0x00478d0f, 0x0047ad0f, 0x0047cd0f, 0x0047ed0f, - 0x00480d0f, 0x00482d0f, 0x00484d0f, 0x00486d0f, - 0x00488d0f, 0x0048ad0f, 0x0048cd0f, 0x0048ed0f, - 0x00490d0f, 0x00492d0f, 0x00494d0f, 0x00496d0f, - 0x00498d0f, 0x0049ad0f, 0x0049cd0f, 0x0049ed0f, - 0x004a0d0f, 0x004a2d0f, 0x004a4d0f, 0x004a6d0f, - 0x004a8d0f, 0x004aad0f, 0x004acd0f, 0x004aed0f, - 0x004b0d0f, 0x004b2d0f, 0x004b4d0f, 0x004b6d0f, - 0x004b8d0f, 0x004bad0f, 0x004bcd0f, 0x004bed0f, - 0x004c0d0f, 0x004c2d0f, 0x004c4d0f, 0x004c6d0f, - 0x004c8d0f, 0x004cad0f, 0x004ccd0f, 0x004ced0f, - 0x004d0d0f, 0x004d2d0f, 0x004d4d0f, 0x004d6d0f, - 0x004d8d0f, 0x004dad0f, 0x004dcd0f, 0x004ded0f, - 0x004e0d0f, 0x004e2d0f, 0x004e4d0f, 0x004e6d0f, - 0x004e8d0f, 0x004ead0f, 0x004ecd0f, 0x004eed0f, - 0x004f0d0f, 0x004f2d0f, 0x004f4d0f, 0x004f6d0f, - 0x004f8d0f, 0x004fad0f, 0x004fcd0f, 0x004fed0f, - 0x00500d0f, 0x00502d0f, 0x00504d0f, 0x00506d0f, - 0x00508d0f, 0x0050ad0f, 0x0050cd0f, 0x0050ed0f, - 0x00510d0f, 0x00512d0f, 0x00514d0f, 0x00516d0f, - 0x00518d0f, 0x0051ad0f, 0x0051cd0f, 0x0051ed0f, - 0x00520d0f, 0x00522d0f, 0x00524d0f, 0x00526d0f, - 0x00528d0f, 0x0052ad0f, 0x0052cd0f, 0x0052ed0f, - 0x00530d0f, 0x00532d0f, 0x00534d0f, 0x00536d0f, - 0x00538d0f, 0x0053ad0f, 0x0053cd0f, 0x0053ed0f, - 0x00540d0f, 0x00542d0f, 0x00544d0f, 0x00546d0f, - 0x00548d0f, 0x0054ad0f, 0x0054cd0f, 0x0054ed0f, - 0x00550d0f, 0x00552d0f, 0x00554d0f, 0x00556d0f, - 0x00558d0f, 0x0055ad0f, 0x0055cd0f, 0x0055ed0f, - 0x00560d0f, 0x00562d0f, 0x00564d0f, 0x00566d0f, - 0x00568d0f, 0x0056ad0f, 0x0056cd0f, 0x0056ed0f, - 0x00570d0f, 0x00572d0f, 0x00574d0f, 0x00576d0f, - 0x00578d0f, 0x0057ad0f, 0x0057cd0f, 0x0057ed0f, - 0x00580d0f, 0x00582d0f, 0x00584d0f, 0x00586d0f, - 0x00588d0f, 0x0058ad0f, 0x0058cd0f, 0x0058ed0f, - 0x00590d0f, 0x00592d0f, 0x00594d0f, 0x00596d0f, - 0x00598d0f, 0x0059ad0f, 0x0059cd0f, 0x0059ed0f, - 0x005a0d0f, 0x005a2d0f, 0x005a4d0f, 0x005a6d0f, - 0x005a8d0f, 0x005aad0f, 0x005acd0f, 0x005aed0f, - 0x005b0d0f, 0x005b2d0f, 0x005b4d0f, 0x005b6d0f, - 0x005b8d0f, 0x005bad0f, 0x005bcd0f, 0x005bed0f, - 0x005c0d0f, 0x005c2d0f, 0x005c4d0f, 0x005c6d0f, - 0x005c8d0f, 0x005cad0f, 0x005ccd0f, 0x005ced0f, - 0x005d0d0f, 0x005d2d0f, 0x005d4d0f, 0x005d6d0f, - 0x005d8d0f, 0x005dad0f, 0x005dcd0f, 0x005ded0f, - 0x005e0d0f, 0x005e2d0f, 0x005e4d0f, 0x005e6d0f, - 0x005e8d0f, 0x005ead0f, 0x005ecd0f, 0x005eed0f, - 0x005f0d0f, 0x005f2d0f, 0x005f4d0f, 0x005f6d0f, - 0x005f8d0f, 0x005fad0f, 0x005fcd0f, 0x005fed0f, - 0x00600d0f, 0x00602d0f, 0x00604d0f, 0x00606d0f, - 0x00608d0f, 0x0060ad0f, 0x0060cd0f, 0x0060ed0f, - 0x00610d0f, 0x00612d0f, 0x00614d0f, 0x00616d0f, - 0x00618d0f, 0x0061ad0f, 0x0061cd0f, 0x0061ed0f, - 0x00620d0f, 0x00622d0f, 0x00624d0f, 0x00626d0f, - 0x00628d0f, 0x0062ad0f, 0x0062cd0f, 0x0062ed0f, - 0x00630d0f, 0x00632d0f, 0x00634d0f, 0x00636d0f, - 0x00638d0f, 0x0063ad0f, 0x0063cd0f, 0x0063ed0f, - 0x00640d0f, 0x00642d0f, 0x00644d0f, 0x00646d0f, - 0x00648d0f, 0x0064ad0f, 0x0064cd0f, 0x0064ed0f, - 0x00650d0f, 0x00652d0f, 0x00654d0f, 0x00656d0f, - 0x00658d0f, 0x0065ad0f, 0x0065cd0f, 0x0065ed0f, - 0x00660d0f, 0x00662d0f, 0x00664d0f, 0x00666d0f, - 0x00668d0f, 0x0066ad0f, 0x0066cd0f, 0x0066ed0f, - 0x00670d0f, 0x00672d0f, 0x00674d0f, 0x00676d0f, - 0x00678d0f, 0x0067ad0f, 0x0067cd0f, 0x0067ed0f, - 0x00680d0f, 0x00682d0f, 0x00684d0f, 0x00686d0f, - 0x00688d0f, 0x0068ad0f, 0x0068cd0f, 0x0068ed0f, - 0x00690d0f, 0x00692d0f, 0x00694d0f, 0x00696d0f, - 0x00698d0f, 0x0069ad0f, 0x0069cd0f, 0x0069ed0f, - 0x006a0d0f, 0x006a2d0f, 0x006a4d0f, 0x006a6d0f, - 0x006a8d0f, 0x006aad0f, 0x006acd0f, 0x006aed0f, - 0x006b0d0f, 0x006b2d0f, 0x006b4d0f, 0x006b6d0f, - 0x006b8d0f, 0x006bad0f, 0x006bcd0f, 0x006bed0f, - 0x006c0d0f, 0x006c2d0f, 0x006c4d0f, 0x006c6d0f, - 0x006c8d0f, 0x006cad0f, 0x006ccd0f, 0x006ced0f, - 0x006d0d0f, 0x006d2d0f, 0x006d4d0f, 0x006d6d0f, - 0x006d8d0f, 0x006dad0f, 0x006dcd0f, 0x006ded0f, - 0x006e0d0f, 0x006e2d0f, 0x006e4d0f, 0x006e6d0f, - 0x006e8d0f, 0x006ead0f, 0x006ecd0f, 0x006eed0f, - 0x006f0d0f, 0x006f2d0f, 0x006f4d0f, 0x006f6d0f, - 0x006f8d0f, 0x006fad0f, 0x006fcd0f, 0x006fed0f, - 0x00700d0f, 0x00702d0f, 0x00704d0f, 0x00706d0f, - 0x00708d0f, 0x0070ad0f, 0x0070cd0f, 0x0070ed0f, - 0x00710d0f, 0x00712d0f, 0x00714d0f, 0x00716d0f, - 0x00718d0f, 0x0071ad0f, 0x0071cd0f, 0x0071ed0f, - 0x00720d0f, 0x00722d0f, 0x00724d0f, 0x00726d0f, - 0x00728d0f, 0x0072ad0f, 0x0072cd0f, 0x0072ed0f, - 0x00730d0f, 0x00732d0f, 0x00734d0f, 0x00736d0f, - 0x00738d0f, 0x0073ad0f, 0x0073cd0f, 0x0073ed0f, - 0x00740d0f, 0x00742d0f, 0x00744d0f, 0x00746d0f, - 0x00748d0f, 0x0074ad0f, 0x0074cd0f, 0x0074ed0f, - 0x00750d0f, 0x00752d0f, 0x00754d0f, 0x00756d0f, - 0x00758d0f, 0x0075ad0f, 0x0075cd0f, 0x0075ed0f, - 0x00760d0f, 0x00762d0f, 0x00764d0f, 0x00766d0f, - 0x00768d0f, 0x0076ad0f, 0x0076cd0f, 0x0076ed0f, - 0x00770d0f, 0x00772d0f, 0x00774d0f, 0x00776d0f, - 0x00778d0f, 0x0077ad0f, 0x0077cd0f, 0x0077ed0f, - 0x00780d0f, 0x00782d0f, 0x00784d0f, 0x00786d0f, - 0x00788d0f, 0x0078ad0f, 0x0078cd0f, 0x0078ed0f, - 0x00790d0f, 0x00792d0f, 0x00794d0f, 0x00796d0f, - 0x00798d0f, 0x0079ad0f, 0x0079cd0f, 0x0079ed0f, - 0x007a0d0f, 0x007a2d0f, 0x007a4d0f, 0x007a6d0f, - 0x007a8d0f, 0x007aad0f, 0x007acd0f, 0x007aed0f, - 0x007b0d0f, 0x007b2d0f, 0x007b4d0f, 0x007b6d0f, - 0x007b8d0f, 0x007bad0f, 0x007bcd0f, 0x007bed0f, - 0x007c0d0f, 0x007c2d0f, 0x007c4d0f, 0x007c6d0f, - 0x007c8d0f, 0x007cad0f, 0x007ccd0f, 0x007ced0f, - 0x007d0d0f, 0x007d2d0f, 0x007d4d0f, 0x007d6d0f, - 0x007d8d0f, 0x007dad0f, 0x007dcd0f, 0x007ded0f, - 0x007e0d0f, 0x007e2d0f, 0x007e4d0f, 0x007e6d0f, - 0x007e8d0f, 0x007ead0f, 0x007ecd0f, 0x007eed0f, - 0x007f0d0f, 0x007f2d0f, 0x007f4d0f, 0x007f6d0f, - 0x007f8d0f, 0x007fad0f, 0x007fcd0f, 0x007fed0f, - 0x00001d0f, 0x00003d0f, 0x00005d0f, 0x00007d0f, - 0x00009d0f, 0x0000bd0f, 0x0000dd0f, 0x0000fd0f, - 0x00011d0f, 0x00013d0f, 0x00015d0f, 0x00017d0f, - 0x00019d0f, 0x0001bd0f, 0x0001dd0f, 0x0001fd0f, - 0x00021d0f, 0x00023d0f, 0x00025d0f, 0x00027d0f, - 0x00029d0f, 0x0002bd0f, 0x0002dd0f, 0x0002fd0f, - 0x00031d0f, 0x00033d0f, 0x00035d0f, 0x00037d0f, - 0x00039d0f, 0x0003bd0f, 0x0003dd0f, 0x0003fd0f, - 0x00041d0f, 0x00043d0f, 0x00045d0f, 0x00047d0f, - 0x00049d0f, 0x0004bd0f, 0x0004dd0f, 0x0004fd0f, - 0x00051d0f, 0x00053d0f, 0x00055d0f, 0x00057d0f, - 0x00059d0f, 0x0005bd0f, 0x0005dd0f, 0x0005fd0f, - 0x00061d0f, 0x00063d0f, 0x00065d0f, 0x00067d0f, - 0x00069d0f, 0x0006bd0f, 0x0006dd0f, 0x0006fd0f, - 0x00071d0f, 0x00073d0f, 0x00075d0f, 0x00077d0f, - 0x00079d0f, 0x0007bd0f, 0x0007dd0f, 0x0007fd0f, - 0x00081d0f, 0x00083d0f, 0x00085d0f, 0x00087d0f, - 0x00089d0f, 0x0008bd0f, 0x0008dd0f, 0x0008fd0f, - 0x00091d0f, 0x00093d0f, 0x00095d0f, 0x00097d0f, - 0x00099d0f, 0x0009bd0f, 0x0009dd0f, 0x0009fd0f, - 0x000a1d0f, 0x000a3d0f, 0x000a5d0f, 0x000a7d0f, - 0x000a9d0f, 0x000abd0f, 0x000add0f, 0x000afd0f, - 0x000b1d0f, 0x000b3d0f, 0x000b5d0f, 0x000b7d0f, - 0x000b9d0f, 0x000bbd0f, 0x000bdd0f, 0x000bfd0f, - 0x000c1d0f, 0x000c3d0f, 0x000c5d0f, 0x000c7d0f, - 0x000c9d0f, 0x000cbd0f, 0x000cdd0f, 0x000cfd0f, - 0x000d1d0f, 0x000d3d0f, 0x000d5d0f, 0x000d7d0f, - 0x000d9d0f, 0x000dbd0f, 0x000ddd0f, 0x000dfd0f, - 0x000e1d0f, 0x000e3d0f, 0x000e5d0f, 0x000e7d0f, - 0x000e9d0f, 0x000ebd0f, 0x000edd0f, 0x000efd0f, - 0x000f1d0f, 0x000f3d0f, 0x000f5d0f, 0x000f7d0f, - 0x000f9d0f, 0x000fbd0f, 0x000fdd0f, 0x000ffd0f, - 0x00101d0f, 0x00103d0f, 0x00105d0f, 0x00107d0f, - 0x00109d0f, 0x0010bd0f, 0x0010dd0f, 0x0010fd0f, - 0x00111d0f, 0x00113d0f, 0x00115d0f, 0x00117d0f, - 0x00119d0f, 0x0011bd0f, 0x0011dd0f, 0x0011fd0f, - 0x00121d0f, 0x00123d0f, 0x00125d0f, 0x00127d0f, - 0x00129d0f, 0x0012bd0f, 0x0012dd0f, 0x0012fd0f, - 0x00131d0f, 0x00133d0f, 0x00135d0f, 0x00137d0f, - 0x00139d0f, 0x0013bd0f, 0x0013dd0f, 0x0013fd0f, - 0x00141d0f, 0x00143d0f, 0x00145d0f, 0x00147d0f, - 0x00149d0f, 0x0014bd0f, 0x0014dd0f, 0x0014fd0f, - 0x00151d0f, 0x00153d0f, 0x00155d0f, 0x00157d0f, - 0x00159d0f, 0x0015bd0f, 0x0015dd0f, 0x0015fd0f, - 0x00161d0f, 0x00163d0f, 0x00165d0f, 0x00167d0f, - 0x00169d0f, 0x0016bd0f, 0x0016dd0f, 0x0016fd0f, - 0x00171d0f, 0x00173d0f, 0x00175d0f, 0x00177d0f, - 0x00179d0f, 0x0017bd0f, 0x0017dd0f, 0x0017fd0f, - 0x00181d0f, 0x00183d0f, 0x00185d0f, 0x00187d0f, - 0x00189d0f, 0x0018bd0f, 0x0018dd0f, 0x0018fd0f, - 0x00191d0f, 0x00193d0f, 0x00195d0f, 0x00197d0f, - 0x00199d0f, 0x0019bd0f, 0x0019dd0f, 0x0019fd0f, - 0x001a1d0f, 0x001a3d0f, 0x001a5d0f, 0x001a7d0f, - 0x001a9d0f, 0x001abd0f, 0x001add0f, 0x001afd0f, - 0x001b1d0f, 0x001b3d0f, 0x001b5d0f, 0x001b7d0f, - 0x001b9d0f, 0x001bbd0f, 0x001bdd0f, 0x001bfd0f, - 0x001c1d0f, 0x001c3d0f, 0x001c5d0f, 0x001c7d0f, - 0x001c9d0f, 0x001cbd0f, 0x001cdd0f, 0x001cfd0f, - 0x001d1d0f, 0x001d3d0f, 0x001d5d0f, 0x001d7d0f, - 0x001d9d0f, 0x001dbd0f, 0x001ddd0f, 0x001dfd0f, - 0x001e1d0f, 0x001e3d0f, 0x001e5d0f, 0x001e7d0f, - 0x001e9d0f, 0x001ebd0f, 0x001edd0f, 0x001efd0f, - 0x001f1d0f, 0x001f3d0f, 0x001f5d0f, 0x001f7d0f, - 0x001f9d0f, 0x001fbd0f, 0x001fdd0f, 0x001ffd0f, - 0x00201d0f, 0x00203d0f, 0x00205d0f, 0x00207d0f, - 0x00209d0f, 0x0020bd0f, 0x0020dd0f, 0x0020fd0f, - 0x00211d0f, 0x00213d0f, 0x00215d0f, 0x00217d0f, - 0x00219d0f, 0x0021bd0f, 0x0021dd0f, 0x0021fd0f, - 0x00221d0f, 0x00223d0f, 0x00225d0f, 0x00227d0f, - 0x00229d0f, 0x0022bd0f, 0x0022dd0f, 0x0022fd0f, - 0x00231d0f, 0x00233d0f, 0x00235d0f, 0x00237d0f, - 0x00239d0f, 0x0023bd0f, 0x0023dd0f, 0x0023fd0f, - 0x00241d0f, 0x00243d0f, 0x00245d0f, 0x00247d0f, - 0x00249d0f, 0x0024bd0f, 0x0024dd0f, 0x0024fd0f, - 0x00251d0f, 0x00253d0f, 0x00255d0f, 0x00257d0f, - 0x00259d0f, 0x0025bd0f, 0x0025dd0f, 0x0025fd0f, - 0x00261d0f, 0x00263d0f, 0x00265d0f, 0x00267d0f, - 0x00269d0f, 0x0026bd0f, 0x0026dd0f, 0x0026fd0f, - 0x00271d0f, 0x00273d0f, 0x00275d0f, 0x00277d0f, - 0x00279d0f, 0x0027bd0f, 0x0027dd0f, 0x0027fd0f, - 0x00281d0f, 0x00283d0f, 0x00285d0f, 0x00287d0f, - 0x00289d0f, 0x0028bd0f, 0x0028dd0f, 0x0028fd0f, - 0x00291d0f, 0x00293d0f, 0x00295d0f, 0x00297d0f, - 0x00299d0f, 0x0029bd0f, 0x0029dd0f, 0x0029fd0f, - 0x002a1d0f, 0x002a3d0f, 0x002a5d0f, 0x002a7d0f, - 0x002a9d0f, 0x002abd0f, 0x002add0f, 0x002afd0f, - 0x002b1d0f, 0x002b3d0f, 0x002b5d0f, 0x002b7d0f, - 0x002b9d0f, 0x002bbd0f, 0x002bdd0f, 0x002bfd0f, - 0x002c1d0f, 0x002c3d0f, 0x002c5d0f, 0x002c7d0f, - 0x002c9d0f, 0x002cbd0f, 0x002cdd0f, 0x002cfd0f, - 0x002d1d0f, 0x002d3d0f, 0x002d5d0f, 0x002d7d0f, - 0x002d9d0f, 0x002dbd0f, 0x002ddd0f, 0x002dfd0f, - 0x002e1d0f, 0x002e3d0f, 0x002e5d0f, 0x002e7d0f, - 0x002e9d0f, 0x002ebd0f, 0x002edd0f, 0x002efd0f, - 0x002f1d0f, 0x002f3d0f, 0x002f5d0f, 0x002f7d0f, - 0x002f9d0f, 0x002fbd0f, 0x002fdd0f, 0x002ffd0f, - 0x00301d0f, 0x00303d0f, 0x00305d0f, 0x00307d0f, - 0x00309d0f, 0x0030bd0f, 0x0030dd0f, 0x0030fd0f, - 0x00311d0f, 0x00313d0f, 0x00315d0f, 0x00317d0f, - 0x00319d0f, 0x0031bd0f, 0x0031dd0f, 0x0031fd0f, - 0x00321d0f, 0x00323d0f, 0x00325d0f, 0x00327d0f, - 0x00329d0f, 0x0032bd0f, 0x0032dd0f, 0x0032fd0f, - 0x00331d0f, 0x00333d0f, 0x00335d0f, 0x00337d0f, - 0x00339d0f, 0x0033bd0f, 0x0033dd0f, 0x0033fd0f, - 0x00341d0f, 0x00343d0f, 0x00345d0f, 0x00347d0f, - 0x00349d0f, 0x0034bd0f, 0x0034dd0f, 0x0034fd0f, - 0x00351d0f, 0x00353d0f, 0x00355d0f, 0x00357d0f, - 0x00359d0f, 0x0035bd0f, 0x0035dd0f, 0x0035fd0f, - 0x00361d0f, 0x00363d0f, 0x00365d0f, 0x00367d0f, - 0x00369d0f, 0x0036bd0f, 0x0036dd0f, 0x0036fd0f, - 0x00371d0f, 0x00373d0f, 0x00375d0f, 0x00377d0f, - 0x00379d0f, 0x0037bd0f, 0x0037dd0f, 0x0037fd0f, - 0x00381d0f, 0x00383d0f, 0x00385d0f, 0x00387d0f, - 0x00389d0f, 0x0038bd0f, 0x0038dd0f, 0x0038fd0f, - 0x00391d0f, 0x00393d0f, 0x00395d0f, 0x00397d0f, - 0x00399d0f, 0x0039bd0f, 0x0039dd0f, 0x0039fd0f, - 0x003a1d0f, 0x003a3d0f, 0x003a5d0f, 0x003a7d0f, - 0x003a9d0f, 0x003abd0f, 0x003add0f, 0x003afd0f, - 0x003b1d0f, 0x003b3d0f, 0x003b5d0f, 0x003b7d0f, - 0x003b9d0f, 0x003bbd0f, 0x003bdd0f, 0x003bfd0f, - 0x003c1d0f, 0x003c3d0f, 0x003c5d0f, 0x003c7d0f, - 0x003c9d0f, 0x003cbd0f, 0x003cdd0f, 0x003cfd0f, - 0x003d1d0f, 0x003d3d0f, 0x003d5d0f, 0x003d7d0f, - 0x003d9d0f, 0x003dbd0f, 0x003ddd0f, 0x003dfd0f, - 0x003e1d0f, 0x003e3d0f, 0x003e5d0f, 0x003e7d0f, - 0x003e9d0f, 0x003ebd0f, 0x003edd0f, 0x003efd0f, - 0x003f1d0f, 0x003f3d0f, 0x003f5d0f, 0x003f7d0f, - 0x003f9d0f, 0x003fbd0f, 0x003fdd0f, 0x003ffd0f, - 0x00401d0f, 0x00403d0f, 0x00405d0f, 0x00407d0f, - 0x00409d0f, 0x0040bd0f, 0x0040dd0f, 0x0040fd0f, - 0x00411d0f, 0x00413d0f, 0x00415d0f, 0x00417d0f, - 0x00419d0f, 0x0041bd0f, 0x0041dd0f, 0x0041fd0f, - 0x00421d0f, 0x00423d0f, 0x00425d0f, 0x00427d0f, - 0x00429d0f, 0x0042bd0f, 0x0042dd0f, 0x0042fd0f, - 0x00431d0f, 0x00433d0f, 0x00435d0f, 0x00437d0f, - 0x00439d0f, 0x0043bd0f, 0x0043dd0f, 0x0043fd0f, - 0x00441d0f, 0x00443d0f, 0x00445d0f, 0x00447d0f, - 0x00449d0f, 0x0044bd0f, 0x0044dd0f, 0x0044fd0f, - 0x00451d0f, 0x00453d0f, 0x00455d0f, 0x00457d0f, - 0x00459d0f, 0x0045bd0f, 0x0045dd0f, 0x0045fd0f, - 0x00461d0f, 0x00463d0f, 0x00465d0f, 0x00467d0f, - 0x00469d0f, 0x0046bd0f, 0x0046dd0f, 0x0046fd0f, - 0x00471d0f, 0x00473d0f, 0x00475d0f, 0x00477d0f, - 0x00479d0f, 0x0047bd0f, 0x0047dd0f, 0x0047fd0f, - 0x00481d0f, 0x00483d0f, 0x00485d0f, 0x00487d0f, - 0x00489d0f, 0x0048bd0f, 0x0048dd0f, 0x0048fd0f, - 0x00491d0f, 0x00493d0f, 0x00495d0f, 0x00497d0f, - 0x00499d0f, 0x0049bd0f, 0x0049dd0f, 0x0049fd0f, - 0x004a1d0f, 0x004a3d0f, 0x004a5d0f, 0x004a7d0f, - 0x004a9d0f, 0x004abd0f, 0x004add0f, 0x004afd0f, - 0x004b1d0f, 0x004b3d0f, 0x004b5d0f, 0x004b7d0f, - 0x004b9d0f, 0x004bbd0f, 0x004bdd0f, 0x004bfd0f, - 0x004c1d0f, 0x004c3d0f, 0x004c5d0f, 0x004c7d0f, - 0x004c9d0f, 0x004cbd0f, 0x004cdd0f, 0x004cfd0f, - 0x004d1d0f, 0x004d3d0f, 0x004d5d0f, 0x004d7d0f, - 0x004d9d0f, 0x004dbd0f, 0x004ddd0f, 0x004dfd0f, - 0x004e1d0f, 0x004e3d0f, 0x004e5d0f, 0x004e7d0f, - 0x004e9d0f, 0x004ebd0f, 0x004edd0f, 0x004efd0f, - 0x004f1d0f, 0x004f3d0f, 0x004f5d0f, 0x004f7d0f, - 0x004f9d0f, 0x004fbd0f, 0x004fdd0f, 0x004ffd0f, - 0x00501d0f, 0x00503d0f, 0x00505d0f, 0x00507d0f, - 0x00509d0f, 0x0050bd0f, 0x0050dd0f, 0x0050fd0f, - 0x00511d0f, 0x00513d0f, 0x00515d0f, 0x00517d0f, - 0x00519d0f, 0x0051bd0f, 0x0051dd0f, 0x0051fd0f, - 0x00521d0f, 0x00523d0f, 0x00525d0f, 0x00527d0f, - 0x00529d0f, 0x0052bd0f, 0x0052dd0f, 0x0052fd0f, - 0x00531d0f, 0x00533d0f, 0x00535d0f, 0x00537d0f, - 0x00539d0f, 0x0053bd0f, 0x0053dd0f, 0x0053fd0f, - 0x00541d0f, 0x00543d0f, 0x00545d0f, 0x00547d0f, - 0x00549d0f, 0x0054bd0f, 0x0054dd0f, 0x0054fd0f, - 0x00551d0f, 0x00553d0f, 0x00555d0f, 0x00557d0f, - 0x00559d0f, 0x0055bd0f, 0x0055dd0f, 0x0055fd0f, - 0x00561d0f, 0x00563d0f, 0x00565d0f, 0x00567d0f, - 0x00569d0f, 0x0056bd0f, 0x0056dd0f, 0x0056fd0f, - 0x00571d0f, 0x00573d0f, 0x00575d0f, 0x00577d0f, - 0x00579d0f, 0x0057bd0f, 0x0057dd0f, 0x0057fd0f, - 0x00581d0f, 0x00583d0f, 0x00585d0f, 0x00587d0f, - 0x00589d0f, 0x0058bd0f, 0x0058dd0f, 0x0058fd0f, - 0x00591d0f, 0x00593d0f, 0x00595d0f, 0x00597d0f, - 0x00599d0f, 0x0059bd0f, 0x0059dd0f, 0x0059fd0f, - 0x005a1d0f, 0x005a3d0f, 0x005a5d0f, 0x005a7d0f, - 0x005a9d0f, 0x005abd0f, 0x005add0f, 0x005afd0f, - 0x005b1d0f, 0x005b3d0f, 0x005b5d0f, 0x005b7d0f, - 0x005b9d0f, 0x005bbd0f, 0x005bdd0f, 0x005bfd0f, - 0x005c1d0f, 0x005c3d0f, 0x005c5d0f, 0x005c7d0f, - 0x005c9d0f, 0x005cbd0f, 0x005cdd0f, 0x005cfd0f, - 0x005d1d0f, 0x005d3d0f, 0x005d5d0f, 0x005d7d0f, - 0x005d9d0f, 0x005dbd0f, 0x005ddd0f, 0x005dfd0f, - 0x005e1d0f, 0x005e3d0f, 0x005e5d0f, 0x005e7d0f, - 0x005e9d0f, 0x005ebd0f, 0x005edd0f, 0x005efd0f, - 0x005f1d0f, 0x005f3d0f, 0x005f5d0f, 0x005f7d0f, - 0x005f9d0f, 0x005fbd0f, 0x005fdd0f, 0x005ffd0f, - 0x00601d0f, 0x00603d0f, 0x00605d0f, 0x00607d0f, - 0x00609d0f, 0x0060bd0f, 0x0060dd0f, 0x0060fd0f, - 0x00611d0f, 0x00613d0f, 0x00615d0f, 0x00617d0f, - 0x00619d0f, 0x0061bd0f, 0x0061dd0f, 0x0061fd0f, - 0x00621d0f, 0x00623d0f, 0x00625d0f, 0x00627d0f, - 0x00629d0f, 0x0062bd0f, 0x0062dd0f, 0x0062fd0f, - 0x00631d0f, 0x00633d0f, 0x00635d0f, 0x00637d0f, - 0x00639d0f, 0x0063bd0f, 0x0063dd0f, 0x0063fd0f, - 0x00641d0f, 0x00643d0f, 0x00645d0f, 0x00647d0f, - 0x00649d0f, 0x0064bd0f, 0x0064dd0f, 0x0064fd0f, - 0x00651d0f, 0x00653d0f, 0x00655d0f, 0x00657d0f, - 0x00659d0f, 0x0065bd0f, 0x0065dd0f, 0x0065fd0f, - 0x00661d0f, 0x00663d0f, 0x00665d0f, 0x00667d0f, - 0x00669d0f, 0x0066bd0f, 0x0066dd0f, 0x0066fd0f, - 0x00671d0f, 0x00673d0f, 0x00675d0f, 0x00677d0f, - 0x00679d0f, 0x0067bd0f, 0x0067dd0f, 0x0067fd0f, - 0x00681d0f, 0x00683d0f, 0x00685d0f, 0x00687d0f, - 0x00689d0f, 0x0068bd0f, 0x0068dd0f, 0x0068fd0f, - 0x00691d0f, 0x00693d0f, 0x00695d0f, 0x00697d0f, - 0x00699d0f, 0x0069bd0f, 0x0069dd0f, 0x0069fd0f, - 0x006a1d0f, 0x006a3d0f, 0x006a5d0f, 0x006a7d0f, - 0x006a9d0f, 0x006abd0f, 0x006add0f, 0x006afd0f, - 0x006b1d0f, 0x006b3d0f, 0x006b5d0f, 0x006b7d0f, - 0x006b9d0f, 0x006bbd0f, 0x006bdd0f, 0x006bfd0f, - 0x006c1d0f, 0x006c3d0f, 0x006c5d0f, 0x006c7d0f, - 0x006c9d0f, 0x006cbd0f, 0x006cdd0f, 0x006cfd0f, - 0x006d1d0f, 0x006d3d0f, 0x006d5d0f, 0x006d7d0f, - 0x006d9d0f, 0x006dbd0f, 0x006ddd0f, 0x006dfd0f, - 0x006e1d0f, 0x006e3d0f, 0x006e5d0f, 0x006e7d0f, - 0x006e9d0f, 0x006ebd0f, 0x006edd0f, 0x006efd0f, - 0x006f1d0f, 0x006f3d0f, 0x006f5d0f, 0x006f7d0f, - 0x006f9d0f, 0x006fbd0f, 0x006fdd0f, 0x006ffd0f, - 0x00701d0f, 0x00703d0f, 0x00705d0f, 0x00707d0f, - 0x00709d0f, 0x0070bd0f, 0x0070dd0f, 0x0070fd0f, - 0x00711d0f, 0x00713d0f, 0x00715d0f, 0x00717d0f, - 0x00719d0f, 0x0071bd0f, 0x0071dd0f, 0x0071fd0f, - 0x00721d0f, 0x00723d0f, 0x00725d0f, 0x00727d0f, - 0x00729d0f, 0x0072bd0f, 0x0072dd0f, 0x0072fd0f, - 0x00731d0f, 0x00733d0f, 0x00735d0f, 0x00737d0f, - 0x00739d0f, 0x0073bd0f, 0x0073dd0f, 0x0073fd0f, - 0x00741d0f, 0x00743d0f, 0x00745d0f, 0x00747d0f, - 0x00749d0f, 0x0074bd0f, 0x0074dd0f, 0x0074fd0f, - 0x00751d0f, 0x00753d0f, 0x00755d0f, 0x00757d0f, - 0x00759d0f, 0x0075bd0f, 0x0075dd0f, 0x0075fd0f, - 0x00761d0f, 0x00763d0f, 0x00765d0f, 0x00767d0f, - 0x00769d0f, 0x0076bd0f, 0x0076dd0f, 0x0076fd0f, - 0x00771d0f, 0x00773d0f, 0x00775d0f, 0x00777d0f, - 0x00779d0f, 0x0077bd0f, 0x0077dd0f, 0x0077fd0f, - 0x00781d0f, 0x00783d0f, 0x00785d0f, 0x00787d0f, - 0x00789d0f, 0x0078bd0f, 0x0078dd0f, 0x0078fd0f, - 0x00791d0f, 0x00793d0f, 0x00795d0f, 0x00797d0f, - 0x00799d0f, 0x0079bd0f, 0x0079dd0f, 0x0079fd0f, - 0x007a1d0f, 0x007a3d0f, 0x007a5d0f, 0x007a7d0f, - 0x007a9d0f, 0x007abd0f, 0x007add0f, 0x007afd0f, - 0x007b1d0f, 0x007b3d0f, 0x007b5d0f, 0x007b7d0f, - 0x007b9d0f, 0x007bbd0f, 0x007bdd0f, 0x007bfd0f, - 0x007c1d0f, 0x007c3d0f, 0x007c5d0f, 0x007c7d0f, - 0x007c9d0f, 0x007cbd0f, 0x007cdd0f, 0x007cfd0f, - 0x007d1d0f, 0x007d3d0f, 0x007d5d0f, 0x007d7d0f, - 0x007d9d0f, 0x007dbd0f, 0x007ddd0f, 0x007dfd0f, - 0x007e1d0f, 0x007e3d0f, 0x007e5d0f, 0x007e7d0f, - 0x007e9d0f, 0x007ebd0f, 0x007edd0f, 0x007efd0f, - 0x007f1d0f, 0x007f3d0f, 0x007f5d0f, 0x007f7d0f, - 0x007f9d0f, 0x007fbd0f, 0x007fdd0f, 0x007ffd0f, - 0x00000310, 0x00002310, 0x00004310, 0x00006310, - 0x00008310, 0x0000a310, 0x0000c310, 0x0000e310, - 0x00010310, 0x00012310, 0x00014310, 0x00016310, - 0x00018310, 0x0001a310, 0x0001c310, 0x0001e310, - 0x00020310, 0x00022310, 0x00024310, 0x00026310, - 0x00028310, 0x0002a310, 0x0002c310, 0x0002e310, - 0x00030310, 0x00032310, 0x00034310, 0x00036310, - 0x00038310, 0x0003a310, 0x0003c310, 0x0003e310, - 0x00040310, 0x00042310, 0x00044310, 0x00046310, - 0x00048310, 0x0004a310, 0x0004c310, 0x0004e310, - 0x00050310, 0x00052310, 0x00054310, 0x00056310, - 0x00058310, 0x0005a310, 0x0005c310, 0x0005e310, - 0x00060310, 0x00062310, 0x00064310, 0x00066310, - 0x00068310, 0x0006a310, 0x0006c310, 0x0006e310, - 0x00070310, 0x00072310, 0x00074310, 0x00076310, - 0x00078310, 0x0007a310, 0x0007c310, 0x0007e310, - 0x00080310, 0x00082310, 0x00084310, 0x00086310, - 0x00088310, 0x0008a310, 0x0008c310, 0x0008e310, - 0x00090310, 0x00092310, 0x00094310, 0x00096310, - 0x00098310, 0x0009a310, 0x0009c310, 0x0009e310, - 0x000a0310, 0x000a2310, 0x000a4310, 0x000a6310, - 0x000a8310, 0x000aa310, 0x000ac310, 0x000ae310, - 0x000b0310, 0x000b2310, 0x000b4310, 0x000b6310, - 0x000b8310, 0x000ba310, 0x000bc310, 0x000be310, - 0x000c0310, 0x000c2310, 0x000c4310, 0x000c6310, - 0x000c8310, 0x000ca310, 0x000cc310, 0x000ce310, - 0x000d0310, 0x000d2310, 0x000d4310, 0x000d6310, - 0x000d8310, 0x000da310, 0x000dc310, 0x000de310, - 0x000e0310, 0x000e2310, 0x000e4310, 0x000e6310, - 0x000e8310, 0x000ea310, 0x000ec310, 0x000ee310, - 0x000f0310, 0x000f2310, 0x000f4310, 0x000f6310, - 0x000f8310, 0x000fa310, 0x000fc310, 0x000fe310, - 0x00100310, 0x00102310, 0x00104310, 0x00106310, - 0x00108310, 0x0010a310, 0x0010c310, 0x0010e310, - 0x00110310, 0x00112310, 0x00114310, 0x00116310, - 0x00118310, 0x0011a310, 0x0011c310, 0x0011e310, - 0x00120310, 0x00122310, 0x00124310, 0x00126310, - 0x00128310, 0x0012a310, 0x0012c310, 0x0012e310, - 0x00130310, 0x00132310, 0x00134310, 0x00136310, - 0x00138310, 0x0013a310, 0x0013c310, 0x0013e310, - 0x00140310, 0x00142310, 0x00144310, 0x00146310, - 0x00148310, 0x0014a310, 0x0014c310, 0x0014e310, - 0x00150310, 0x00152310, 0x00154310, 0x00156310, - 0x00158310, 0x0015a310, 0x0015c310, 0x0015e310, - 0x00160310, 0x00162310, 0x00164310, 0x00166310, - 0x00168310, 0x0016a310, 0x0016c310, 0x0016e310, - 0x00170310, 0x00172310, 0x00174310, 0x00176310, - 0x00178310, 0x0017a310, 0x0017c310, 0x0017e310, - 0x00180310, 0x00182310, 0x00184310, 0x00186310, - 0x00188310, 0x0018a310, 0x0018c310, 0x0018e310, - 0x00190310, 0x00192310, 0x00194310, 0x00196310, - 0x00198310, 0x0019a310, 0x0019c310, 0x0019e310, - 0x001a0310, 0x001a2310, 0x001a4310, 0x001a6310, - 0x001a8310, 0x001aa310, 0x001ac310, 0x001ae310, - 0x001b0310, 0x001b2310, 0x001b4310, 0x001b6310, - 0x001b8310, 0x001ba310, 0x001bc310, 0x001be310, - 0x001c0310, 0x001c2310, 0x001c4310, 0x001c6310, - 0x001c8310, 0x001ca310, 0x001cc310, 0x001ce310, - 0x001d0310, 0x001d2310, 0x001d4310, 0x001d6310, - 0x001d8310, 0x001da310, 0x001dc310, 0x001de310, - 0x001e0310, 0x001e2310, 0x001e4310, 0x001e6310, - 0x001e8310, 0x001ea310, 0x001ec310, 0x001ee310, - 0x001f0310, 0x001f2310, 0x001f4310, 0x001f6310, - 0x001f8310, 0x001fa310, 0x001fc310, 0x001fe310, - 0x00200310, 0x00202310, 0x00204310, 0x00206310, - 0x00208310, 0x0020a310, 0x0020c310, 0x0020e310, - 0x00210310, 0x00212310, 0x00214310, 0x00216310, - 0x00218310, 0x0021a310, 0x0021c310, 0x0021e310, - 0x00220310, 0x00222310, 0x00224310, 0x00226310, - 0x00228310, 0x0022a310, 0x0022c310, 0x0022e310, - 0x00230310, 0x00232310, 0x00234310, 0x00236310, - 0x00238310, 0x0023a310, 0x0023c310, 0x0023e310, - 0x00240310, 0x00242310, 0x00244310, 0x00246310, - 0x00248310, 0x0024a310, 0x0024c310, 0x0024e310, - 0x00250310, 0x00252310, 0x00254310, 0x00256310, - 0x00258310, 0x0025a310, 0x0025c310, 0x0025e310, - 0x00260310, 0x00262310, 0x00264310, 0x00266310, - 0x00268310, 0x0026a310, 0x0026c310, 0x0026e310, - 0x00270310, 0x00272310, 0x00274310, 0x00276310, - 0x00278310, 0x0027a310, 0x0027c310, 0x0027e310, - 0x00280310, 0x00282310, 0x00284310, 0x00286310, - 0x00288310, 0x0028a310, 0x0028c310, 0x0028e310, - 0x00290310, 0x00292310, 0x00294310, 0x00296310, - 0x00298310, 0x0029a310, 0x0029c310, 0x0029e310, - 0x002a0310, 0x002a2310, 0x002a4310, 0x002a6310, - 0x002a8310, 0x002aa310, 0x002ac310, 0x002ae310, - 0x002b0310, 0x002b2310, 0x002b4310, 0x002b6310, - 0x002b8310, 0x002ba310, 0x002bc310, 0x002be310, - 0x002c0310, 0x002c2310, 0x002c4310, 0x002c6310, - 0x002c8310, 0x002ca310, 0x002cc310, 0x002ce310, - 0x002d0310, 0x002d2310, 0x002d4310, 0x002d6310, - 0x002d8310, 0x002da310, 0x002dc310, 0x002de310, - 0x002e0310, 0x002e2310, 0x002e4310, 0x002e6310, - 0x002e8310, 0x002ea310, 0x002ec310, 0x002ee310, - 0x002f0310, 0x002f2310, 0x002f4310, 0x002f6310, - 0x002f8310, 0x002fa310, 0x002fc310, 0x002fe310, - 0x00300310, 0x00302310, 0x00304310, 0x00306310, - 0x00308310, 0x0030a310, 0x0030c310, 0x0030e310, - 0x00310310, 0x00312310, 0x00314310, 0x00316310, - 0x00318310, 0x0031a310, 0x0031c310, 0x0031e310, - 0x00320310, 0x00322310, 0x00324310, 0x00326310, - 0x00328310, 0x0032a310, 0x0032c310, 0x0032e310, - 0x00330310, 0x00332310, 0x00334310, 0x00336310, - 0x00338310, 0x0033a310, 0x0033c310, 0x0033e310, - 0x00340310, 0x00342310, 0x00344310, 0x00346310, - 0x00348310, 0x0034a310, 0x0034c310, 0x0034e310, - 0x00350310, 0x00352310, 0x00354310, 0x00356310, - 0x00358310, 0x0035a310, 0x0035c310, 0x0035e310, - 0x00360310, 0x00362310, 0x00364310, 0x00366310, - 0x00368310, 0x0036a310, 0x0036c310, 0x0036e310, - 0x00370310, 0x00372310, 0x00374310, 0x00376310, - 0x00378310, 0x0037a310, 0x0037c310, 0x0037e310, - 0x00380310, 0x00382310, 0x00384310, 0x00386310, - 0x00388310, 0x0038a310, 0x0038c310, 0x0038e310, - 0x00390310, 0x00392310, 0x00394310, 0x00396310, - 0x00398310, 0x0039a310, 0x0039c310, 0x0039e310, - 0x003a0310, 0x003a2310, 0x003a4310, 0x003a6310, - 0x003a8310, 0x003aa310, 0x003ac310, 0x003ae310, - 0x003b0310, 0x003b2310, 0x003b4310, 0x003b6310, - 0x003b8310, 0x003ba310, 0x003bc310, 0x003be310, - 0x003c0310, 0x003c2310, 0x003c4310, 0x003c6310, - 0x003c8310, 0x003ca310, 0x003cc310, 0x003ce310, - 0x003d0310, 0x003d2310, 0x003d4310, 0x003d6310, - 0x003d8310, 0x003da310, 0x003dc310, 0x003de310, - 0x003e0310, 0x003e2310, 0x003e4310, 0x003e6310, - 0x003e8310, 0x003ea310, 0x003ec310, 0x003ee310, - 0x003f0310, 0x003f2310, 0x003f4310, 0x003f6310, - 0x003f8310, 0x003fa310, 0x003fc310, 0x003fe310, - 0x00400310, 0x00402310, 0x00404310, 0x00406310, - 0x00408310, 0x0040a310, 0x0040c310, 0x0040e310, - 0x00410310, 0x00412310, 0x00414310, 0x00416310, - 0x00418310, 0x0041a310, 0x0041c310, 0x0041e310, - 0x00420310, 0x00422310, 0x00424310, 0x00426310, - 0x00428310, 0x0042a310, 0x0042c310, 0x0042e310, - 0x00430310, 0x00432310, 0x00434310, 0x00436310, - 0x00438310, 0x0043a310, 0x0043c310, 0x0043e310, - 0x00440310, 0x00442310, 0x00444310, 0x00446310, - 0x00448310, 0x0044a310, 0x0044c310, 0x0044e310, - 0x00450310, 0x00452310, 0x00454310, 0x00456310, - 0x00458310, 0x0045a310, 0x0045c310, 0x0045e310, - 0x00460310, 0x00462310, 0x00464310, 0x00466310, - 0x00468310, 0x0046a310, 0x0046c310, 0x0046e310, - 0x00470310, 0x00472310, 0x00474310, 0x00476310, - 0x00478310, 0x0047a310, 0x0047c310, 0x0047e310, - 0x00480310, 0x00482310, 0x00484310, 0x00486310, - 0x00488310, 0x0048a310, 0x0048c310, 0x0048e310, - 0x00490310, 0x00492310, 0x00494310, 0x00496310, - 0x00498310, 0x0049a310, 0x0049c310, 0x0049e310, - 0x004a0310, 0x004a2310, 0x004a4310, 0x004a6310, - 0x004a8310, 0x004aa310, 0x004ac310, 0x004ae310, - 0x004b0310, 0x004b2310, 0x004b4310, 0x004b6310, - 0x004b8310, 0x004ba310, 0x004bc310, 0x004be310, - 0x004c0310, 0x004c2310, 0x004c4310, 0x004c6310, - 0x004c8310, 0x004ca310, 0x004cc310, 0x004ce310, - 0x004d0310, 0x004d2310, 0x004d4310, 0x004d6310, - 0x004d8310, 0x004da310, 0x004dc310, 0x004de310, - 0x004e0310, 0x004e2310, 0x004e4310, 0x004e6310, - 0x004e8310, 0x004ea310, 0x004ec310, 0x004ee310, - 0x004f0310, 0x004f2310, 0x004f4310, 0x004f6310, - 0x004f8310, 0x004fa310, 0x004fc310, 0x004fe310, - 0x00500310, 0x00502310, 0x00504310, 0x00506310, - 0x00508310, 0x0050a310, 0x0050c310, 0x0050e310, - 0x00510310, 0x00512310, 0x00514310, 0x00516310, - 0x00518310, 0x0051a310, 0x0051c310, 0x0051e310, - 0x00520310, 0x00522310, 0x00524310, 0x00526310, - 0x00528310, 0x0052a310, 0x0052c310, 0x0052e310, - 0x00530310, 0x00532310, 0x00534310, 0x00536310, - 0x00538310, 0x0053a310, 0x0053c310, 0x0053e310, - 0x00540310, 0x00542310, 0x00544310, 0x00546310, - 0x00548310, 0x0054a310, 0x0054c310, 0x0054e310, - 0x00550310, 0x00552310, 0x00554310, 0x00556310, - 0x00558310, 0x0055a310, 0x0055c310, 0x0055e310, - 0x00560310, 0x00562310, 0x00564310, 0x00566310, - 0x00568310, 0x0056a310, 0x0056c310, 0x0056e310, - 0x00570310, 0x00572310, 0x00574310, 0x00576310, - 0x00578310, 0x0057a310, 0x0057c310, 0x0057e310, - 0x00580310, 0x00582310, 0x00584310, 0x00586310, - 0x00588310, 0x0058a310, 0x0058c310, 0x0058e310, - 0x00590310, 0x00592310, 0x00594310, 0x00596310, - 0x00598310, 0x0059a310, 0x0059c310, 0x0059e310, - 0x005a0310, 0x005a2310, 0x005a4310, 0x005a6310, - 0x005a8310, 0x005aa310, 0x005ac310, 0x005ae310, - 0x005b0310, 0x005b2310, 0x005b4310, 0x005b6310, - 0x005b8310, 0x005ba310, 0x005bc310, 0x005be310, - 0x005c0310, 0x005c2310, 0x005c4310, 0x005c6310, - 0x005c8310, 0x005ca310, 0x005cc310, 0x005ce310, - 0x005d0310, 0x005d2310, 0x005d4310, 0x005d6310, - 0x005d8310, 0x005da310, 0x005dc310, 0x005de310, - 0x005e0310, 0x005e2310, 0x005e4310, 0x005e6310, - 0x005e8310, 0x005ea310, 0x005ec310, 0x005ee310, - 0x005f0310, 0x005f2310, 0x005f4310, 0x005f6310, - 0x005f8310, 0x005fa310, 0x005fc310, 0x005fe310, - 0x00600310, 0x00602310, 0x00604310, 0x00606310, - 0x00608310, 0x0060a310, 0x0060c310, 0x0060e310, - 0x00610310, 0x00612310, 0x00614310, 0x00616310, - 0x00618310, 0x0061a310, 0x0061c310, 0x0061e310, - 0x00620310, 0x00622310, 0x00624310, 0x00626310, - 0x00628310, 0x0062a310, 0x0062c310, 0x0062e310, - 0x00630310, 0x00632310, 0x00634310, 0x00636310, - 0x00638310, 0x0063a310, 0x0063c310, 0x0063e310, - 0x00640310, 0x00642310, 0x00644310, 0x00646310, - 0x00648310, 0x0064a310, 0x0064c310, 0x0064e310, - 0x00650310, 0x00652310, 0x00654310, 0x00656310, - 0x00658310, 0x0065a310, 0x0065c310, 0x0065e310, - 0x00660310, 0x00662310, 0x00664310, 0x00666310, - 0x00668310, 0x0066a310, 0x0066c310, 0x0066e310, - 0x00670310, 0x00672310, 0x00674310, 0x00676310, - 0x00678310, 0x0067a310, 0x0067c310, 0x0067e310, - 0x00680310, 0x00682310, 0x00684310, 0x00686310, - 0x00688310, 0x0068a310, 0x0068c310, 0x0068e310, - 0x00690310, 0x00692310, 0x00694310, 0x00696310, - 0x00698310, 0x0069a310, 0x0069c310, 0x0069e310, - 0x006a0310, 0x006a2310, 0x006a4310, 0x006a6310, - 0x006a8310, 0x006aa310, 0x006ac310, 0x006ae310, - 0x006b0310, 0x006b2310, 0x006b4310, 0x006b6310, - 0x006b8310, 0x006ba310, 0x006bc310, 0x006be310, - 0x006c0310, 0x006c2310, 0x006c4310, 0x006c6310, - 0x006c8310, 0x006ca310, 0x006cc310, 0x006ce310, - 0x006d0310, 0x006d2310, 0x006d4310, 0x006d6310, - 0x006d8310, 0x006da310, 0x006dc310, 0x006de310, - 0x006e0310, 0x006e2310, 0x006e4310, 0x006e6310, - 0x006e8310, 0x006ea310, 0x006ec310, 0x006ee310, - 0x006f0310, 0x006f2310, 0x006f4310, 0x006f6310, - 0x006f8310, 0x006fa310, 0x006fc310, 0x006fe310, - 0x00700310, 0x00702310, 0x00704310, 0x00706310, - 0x00708310, 0x0070a310, 0x0070c310, 0x0070e310, - 0x00710310, 0x00712310, 0x00714310, 0x00716310, - 0x00718310, 0x0071a310, 0x0071c310, 0x0071e310, - 0x00720310, 0x00722310, 0x00724310, 0x00726310, - 0x00728310, 0x0072a310, 0x0072c310, 0x0072e310, - 0x00730310, 0x00732310, 0x00734310, 0x00736310, - 0x00738310, 0x0073a310, 0x0073c310, 0x0073e310, - 0x00740310, 0x00742310, 0x00744310, 0x00746310, - 0x00748310, 0x0074a310, 0x0074c310, 0x0074e310, - 0x00750310, 0x00752310, 0x00754310, 0x00756310, - 0x00758310, 0x0075a310, 0x0075c310, 0x0075e310, - 0x00760310, 0x00762310, 0x00764310, 0x00766310, - 0x00768310, 0x0076a310, 0x0076c310, 0x0076e310, - 0x00770310, 0x00772310, 0x00774310, 0x00776310, - 0x00778310, 0x0077a310, 0x0077c310, 0x0077e310, - 0x00780310, 0x00782310, 0x00784310, 0x00786310, - 0x00788310, 0x0078a310, 0x0078c310, 0x0078e310, - 0x00790310, 0x00792310, 0x00794310, 0x00796310, - 0x00798310, 0x0079a310, 0x0079c310, 0x0079e310, - 0x007a0310, 0x007a2310, 0x007a4310, 0x007a6310, - 0x007a8310, 0x007aa310, 0x007ac310, 0x007ae310, - 0x007b0310, 0x007b2310, 0x007b4310, 0x007b6310, - 0x007b8310, 0x007ba310, 0x007bc310, 0x007be310, - 0x007c0310, 0x007c2310, 0x007c4310, 0x007c6310, - 0x007c8310, 0x007ca310, 0x007cc310, 0x007ce310, - 0x007d0310, 0x007d2310, 0x007d4310, 0x007d6310, - 0x007d8310, 0x007da310, 0x007dc310, 0x007de310, - 0x007e0310, 0x007e2310, 0x007e4310, 0x007e6310, - 0x007e8310, 0x007ea310, 0x007ec310, 0x007ee310, - 0x007f0310, 0x007f2310, 0x007f4310, 0x007f6310, - 0x007f8310, 0x007fa310, 0x007fc310, 0x007fe310, - 0x00800310, 0x00802310, 0x00804310, 0x00806310, - 0x00808310, 0x0080a310, 0x0080c310, 0x0080e310, - 0x00810310, 0x00812310, 0x00814310, 0x00816310, - 0x00818310, 0x0081a310, 0x0081c310, 0x0081e310, - 0x00820310, 0x00822310, 0x00824310, 0x00826310, - 0x00828310, 0x0082a310, 0x0082c310, 0x0082e310, - 0x00830310, 0x00832310, 0x00834310, 0x00836310, - 0x00838310, 0x0083a310, 0x0083c310, 0x0083e310, - 0x00840310, 0x00842310, 0x00844310, 0x00846310, - 0x00848310, 0x0084a310, 0x0084c310, 0x0084e310, - 0x00850310, 0x00852310, 0x00854310, 0x00856310, - 0x00858310, 0x0085a310, 0x0085c310, 0x0085e310, - 0x00860310, 0x00862310, 0x00864310, 0x00866310, - 0x00868310, 0x0086a310, 0x0086c310, 0x0086e310, - 0x00870310, 0x00872310, 0x00874310, 0x00876310, - 0x00878310, 0x0087a310, 0x0087c310, 0x0087e310, - 0x00880310, 0x00882310, 0x00884310, 0x00886310, - 0x00888310, 0x0088a310, 0x0088c310, 0x0088e310, - 0x00890310, 0x00892310, 0x00894310, 0x00896310, - 0x00898310, 0x0089a310, 0x0089c310, 0x0089e310, - 0x008a0310, 0x008a2310, 0x008a4310, 0x008a6310, - 0x008a8310, 0x008aa310, 0x008ac310, 0x008ae310, - 0x008b0310, 0x008b2310, 0x008b4310, 0x008b6310, - 0x008b8310, 0x008ba310, 0x008bc310, 0x008be310, - 0x008c0310, 0x008c2310, 0x008c4310, 0x008c6310, - 0x008c8310, 0x008ca310, 0x008cc310, 0x008ce310, - 0x008d0310, 0x008d2310, 0x008d4310, 0x008d6310, - 0x008d8310, 0x008da310, 0x008dc310, 0x008de310, - 0x008e0310, 0x008e2310, 0x008e4310, 0x008e6310, - 0x008e8310, 0x008ea310, 0x008ec310, 0x008ee310, - 0x008f0310, 0x008f2310, 0x008f4310, 0x008f6310, - 0x008f8310, 0x008fa310, 0x008fc310, 0x008fe310, - 0x00900310, 0x00902310, 0x00904310, 0x00906310, - 0x00908310, 0x0090a310, 0x0090c310, 0x0090e310, - 0x00910310, 0x00912310, 0x00914310, 0x00916310, - 0x00918310, 0x0091a310, 0x0091c310, 0x0091e310, - 0x00920310, 0x00922310, 0x00924310, 0x00926310, - 0x00928310, 0x0092a310, 0x0092c310, 0x0092e310, - 0x00930310, 0x00932310, 0x00934310, 0x00936310, - 0x00938310, 0x0093a310, 0x0093c310, 0x0093e310, - 0x00940310, 0x00942310, 0x00944310, 0x00946310, - 0x00948310, 0x0094a310, 0x0094c310, 0x0094e310, - 0x00950310, 0x00952310, 0x00954310, 0x00956310, - 0x00958310, 0x0095a310, 0x0095c310, 0x0095e310, - 0x00960310, 0x00962310, 0x00964310, 0x00966310, - 0x00968310, 0x0096a310, 0x0096c310, 0x0096e310, - 0x00970310, 0x00972310, 0x00974310, 0x00976310, - 0x00978310, 0x0097a310, 0x0097c310, 0x0097e310, - 0x00980310, 0x00982310, 0x00984310, 0x00986310, - 0x00988310, 0x0098a310, 0x0098c310, 0x0098e310, - 0x00990310, 0x00992310, 0x00994310, 0x00996310, - 0x00998310, 0x0099a310, 0x0099c310, 0x0099e310, - 0x009a0310, 0x009a2310, 0x009a4310, 0x009a6310, - 0x009a8310, 0x009aa310, 0x009ac310, 0x009ae310, - 0x009b0310, 0x009b2310, 0x009b4310, 0x009b6310, - 0x009b8310, 0x009ba310, 0x009bc310, 0x009be310, - 0x009c0310, 0x009c2310, 0x009c4310, 0x009c6310, - 0x009c8310, 0x009ca310, 0x009cc310, 0x009ce310, - 0x009d0310, 0x009d2310, 0x009d4310, 0x009d6310, - 0x009d8310, 0x009da310, 0x009dc310, 0x009de310, - 0x009e0310, 0x009e2310, 0x009e4310, 0x009e6310, - 0x009e8310, 0x009ea310, 0x009ec310, 0x009ee310, - 0x009f0310, 0x009f2310, 0x009f4310, 0x009f6310, - 0x009f8310, 0x009fa310, 0x009fc310, 0x009fe310, - 0x00a00310, 0x00a02310, 0x00a04310, 0x00a06310, - 0x00a08310, 0x00a0a310, 0x00a0c310, 0x00a0e310, - 0x00a10310, 0x00a12310, 0x00a14310, 0x00a16310, - 0x00a18310, 0x00a1a310, 0x00a1c310, 0x00a1e310, - 0x00a20310, 0x00a22310, 0x00a24310, 0x00a26310, - 0x00a28310, 0x00a2a310, 0x00a2c310, 0x00a2e310, - 0x00a30310, 0x00a32310, 0x00a34310, 0x00a36310, - 0x00a38310, 0x00a3a310, 0x00a3c310, 0x00a3e310, - 0x00a40310, 0x00a42310, 0x00a44310, 0x00a46310, - 0x00a48310, 0x00a4a310, 0x00a4c310, 0x00a4e310, - 0x00a50310, 0x00a52310, 0x00a54310, 0x00a56310, - 0x00a58310, 0x00a5a310, 0x00a5c310, 0x00a5e310, - 0x00a60310, 0x00a62310, 0x00a64310, 0x00a66310, - 0x00a68310, 0x00a6a310, 0x00a6c310, 0x00a6e310, - 0x00a70310, 0x00a72310, 0x00a74310, 0x00a76310, - 0x00a78310, 0x00a7a310, 0x00a7c310, 0x00a7e310, - 0x00a80310, 0x00a82310, 0x00a84310, 0x00a86310, - 0x00a88310, 0x00a8a310, 0x00a8c310, 0x00a8e310, - 0x00a90310, 0x00a92310, 0x00a94310, 0x00a96310, - 0x00a98310, 0x00a9a310, 0x00a9c310, 0x00a9e310, - 0x00aa0310, 0x00aa2310, 0x00aa4310, 0x00aa6310, - 0x00aa8310, 0x00aaa310, 0x00aac310, 0x00aae310, - 0x00ab0310, 0x00ab2310, 0x00ab4310, 0x00ab6310, - 0x00ab8310, 0x00aba310, 0x00abc310, 0x00abe310, - 0x00ac0310, 0x00ac2310, 0x00ac4310, 0x00ac6310, - 0x00ac8310, 0x00aca310, 0x00acc310, 0x00ace310, - 0x00ad0310, 0x00ad2310, 0x00ad4310, 0x00ad6310, - 0x00ad8310, 0x00ada310, 0x00adc310, 0x00ade310, - 0x00ae0310, 0x00ae2310, 0x00ae4310, 0x00ae6310, - 0x00ae8310, 0x00aea310, 0x00aec310, 0x00aee310, - 0x00af0310, 0x00af2310, 0x00af4310, 0x00af6310, - 0x00af8310, 0x00afa310, 0x00afc310, 0x00afe310, - 0x00b00310, 0x00b02310, 0x00b04310, 0x00b06310, - 0x00b08310, 0x00b0a310, 0x00b0c310, 0x00b0e310, - 0x00b10310, 0x00b12310, 0x00b14310, 0x00b16310, - 0x00b18310, 0x00b1a310, 0x00b1c310, 0x00b1e310, - 0x00b20310, 0x00b22310, 0x00b24310, 0x00b26310, - 0x00b28310, 0x00b2a310, 0x00b2c310, 0x00b2e310, - 0x00b30310, 0x00b32310, 0x00b34310, 0x00b36310, - 0x00b38310, 0x00b3a310, 0x00b3c310, 0x00b3e310, - 0x00b40310, 0x00b42310, 0x00b44310, 0x00b46310, - 0x00b48310, 0x00b4a310, 0x00b4c310, 0x00b4e310, - 0x00b50310, 0x00b52310, 0x00b54310, 0x00b56310, - 0x00b58310, 0x00b5a310, 0x00b5c310, 0x00b5e310, - 0x00b60310, 0x00b62310, 0x00b64310, 0x00b66310, - 0x00b68310, 0x00b6a310, 0x00b6c310, 0x00b6e310, - 0x00b70310, 0x00b72310, 0x00b74310, 0x00b76310, - 0x00b78310, 0x00b7a310, 0x00b7c310, 0x00b7e310, - 0x00b80310, 0x00b82310, 0x00b84310, 0x00b86310, - 0x00b88310, 0x00b8a310, 0x00b8c310, 0x00b8e310, - 0x00b90310, 0x00b92310, 0x00b94310, 0x00b96310, - 0x00b98310, 0x00b9a310, 0x00b9c310, 0x00b9e310, - 0x00ba0310, 0x00ba2310, 0x00ba4310, 0x00ba6310, - 0x00ba8310, 0x00baa310, 0x00bac310, 0x00bae310, - 0x00bb0310, 0x00bb2310, 0x00bb4310, 0x00bb6310, - 0x00bb8310, 0x00bba310, 0x00bbc310, 0x00bbe310, - 0x00bc0310, 0x00bc2310, 0x00bc4310, 0x00bc6310, - 0x00bc8310, 0x00bca310, 0x00bcc310, 0x00bce310, - 0x00bd0310, 0x00bd2310, 0x00bd4310, 0x00bd6310, - 0x00bd8310, 0x00bda310, 0x00bdc310, 0x00bde310, - 0x00be0310, 0x00be2310, 0x00be4310, 0x00be6310, - 0x00be8310, 0x00bea310, 0x00bec310, 0x00bee310, - 0x00bf0310, 0x00bf2310, 0x00bf4310, 0x00bf6310, - 0x00bf8310, 0x00bfa310, 0x00bfc310, 0x00bfe310, - 0x00c00310, 0x00c02310, 0x00c04310, 0x00c06310, - 0x00c08310, 0x00c0a310, 0x00c0c310, 0x00c0e310, - 0x00c10310, 0x00c12310, 0x00c14310, 0x00c16310, - 0x00c18310, 0x00c1a310, 0x00c1c310, 0x00c1e310, - 0x00c20310, 0x00c22310, 0x00c24310, 0x00c26310, - 0x00c28310, 0x00c2a310, 0x00c2c310, 0x00c2e310, - 0x00c30310, 0x00c32310, 0x00c34310, 0x00c36310, - 0x00c38310, 0x00c3a310, 0x00c3c310, 0x00c3e310, - 0x00c40310, 0x00c42310, 0x00c44310, 0x00c46310, - 0x00c48310, 0x00c4a310, 0x00c4c310, 0x00c4e310, - 0x00c50310, 0x00c52310, 0x00c54310, 0x00c56310, - 0x00c58310, 0x00c5a310, 0x00c5c310, 0x00c5e310, - 0x00c60310, 0x00c62310, 0x00c64310, 0x00c66310, - 0x00c68310, 0x00c6a310, 0x00c6c310, 0x00c6e310, - 0x00c70310, 0x00c72310, 0x00c74310, 0x00c76310, - 0x00c78310, 0x00c7a310, 0x00c7c310, 0x00c7e310, - 0x00c80310, 0x00c82310, 0x00c84310, 0x00c86310, - 0x00c88310, 0x00c8a310, 0x00c8c310, 0x00c8e310, - 0x00c90310, 0x00c92310, 0x00c94310, 0x00c96310, - 0x00c98310, 0x00c9a310, 0x00c9c310, 0x00c9e310, - 0x00ca0310, 0x00ca2310, 0x00ca4310, 0x00ca6310, - 0x00ca8310, 0x00caa310, 0x00cac310, 0x00cae310, - 0x00cb0310, 0x00cb2310, 0x00cb4310, 0x00cb6310, - 0x00cb8310, 0x00cba310, 0x00cbc310, 0x00cbe310, - 0x00cc0310, 0x00cc2310, 0x00cc4310, 0x00cc6310, - 0x00cc8310, 0x00cca310, 0x00ccc310, 0x00cce310, - 0x00cd0310, 0x00cd2310, 0x00cd4310, 0x00cd6310, - 0x00cd8310, 0x00cda310, 0x00cdc310, 0x00cde310, - 0x00ce0310, 0x00ce2310, 0x00ce4310, 0x00ce6310, - 0x00ce8310, 0x00cea310, 0x00cec310, 0x00cee310, - 0x00cf0310, 0x00cf2310, 0x00cf4310, 0x00cf6310, - 0x00cf8310, 0x00cfa310, 0x00cfc310, 0x00cfe310, - 0x00d00310, 0x00d02310, 0x00d04310, 0x00d06310, - 0x00d08310, 0x00d0a310, 0x00d0c310, 0x00d0e310, - 0x00d10310, 0x00d12310, 0x00d14310, 0x00d16310, - 0x00d18310, 0x00d1a310, 0x00d1c310, 0x00d1e310, - 0x00d20310, 0x00d22310, 0x00d24310, 0x00d26310, - 0x00d28310, 0x00d2a310, 0x00d2c310, 0x00d2e310, - 0x00d30310, 0x00d32310, 0x00d34310, 0x00d36310, - 0x00d38310, 0x00d3a310, 0x00d3c310, 0x00d3e310, - 0x00d40310, 0x00d42310, 0x00d44310, 0x00d46310, - 0x00d48310, 0x00d4a310, 0x00d4c310, 0x00d4e310, - 0x00d50310, 0x00d52310, 0x00d54310, 0x00d56310, - 0x00d58310, 0x00d5a310, 0x00d5c310, 0x00d5e310, - 0x00d60310, 0x00d62310, 0x00d64310, 0x00d66310, - 0x00d68310, 0x00d6a310, 0x00d6c310, 0x00d6e310, - 0x00d70310, 0x00d72310, 0x00d74310, 0x00d76310, - 0x00d78310, 0x00d7a310, 0x00d7c310, 0x00d7e310, - 0x00d80310, 0x00d82310, 0x00d84310, 0x00d86310, - 0x00d88310, 0x00d8a310, 0x00d8c310, 0x00d8e310, - 0x00d90310, 0x00d92310, 0x00d94310, 0x00d96310, - 0x00d98310, 0x00d9a310, 0x00d9c310, 0x00d9e310, - 0x00da0310, 0x00da2310, 0x00da4310, 0x00da6310, - 0x00da8310, 0x00daa310, 0x00dac310, 0x00dae310, - 0x00db0310, 0x00db2310, 0x00db4310, 0x00db6310, - 0x00db8310, 0x00dba310, 0x00dbc310, 0x00dbe310, - 0x00dc0310, 0x00dc2310, 0x00dc4310, 0x00dc6310, - 0x00dc8310, 0x00dca310, 0x00dcc310, 0x00dce310, - 0x00dd0310, 0x00dd2310, 0x00dd4310, 0x00dd6310, - 0x00dd8310, 0x00dda310, 0x00ddc310, 0x00dde310, - 0x00de0310, 0x00de2310, 0x00de4310, 0x00de6310, - 0x00de8310, 0x00dea310, 0x00dec310, 0x00dee310, - 0x00df0310, 0x00df2310, 0x00df4310, 0x00df6310, - 0x00df8310, 0x00dfa310, 0x00dfc310, 0x00dfe310, - 0x00e00310, 0x00e02310, 0x00e04310, 0x00e06310, - 0x00e08310, 0x00e0a310, 0x00e0c310, 0x00e0e310, - 0x00e10310, 0x00e12310, 0x00e14310, 0x00e16310, - 0x00e18310, 0x00e1a310, 0x00e1c310, 0x00e1e310, - 0x00e20310, 0x00e22310, 0x00e24310, 0x00e26310, - 0x00e28310, 0x00e2a310, 0x00e2c310, 0x00e2e310, - 0x00e30310, 0x00e32310, 0x00e34310, 0x00e36310, - 0x00e38310, 0x00e3a310, 0x00e3c310, 0x00e3e310, - 0x00e40310, 0x00e42310, 0x00e44310, 0x00e46310, - 0x00e48310, 0x00e4a310, 0x00e4c310, 0x00e4e310, - 0x00e50310, 0x00e52310, 0x00e54310, 0x00e56310, - 0x00e58310, 0x00e5a310, 0x00e5c310, 0x00e5e310, - 0x00e60310, 0x00e62310, 0x00e64310, 0x00e66310, - 0x00e68310, 0x00e6a310, 0x00e6c310, 0x00e6e310, - 0x00e70310, 0x00e72310, 0x00e74310, 0x00e76310, - 0x00e78310, 0x00e7a310, 0x00e7c310, 0x00e7e310, - 0x00e80310, 0x00e82310, 0x00e84310, 0x00e86310, - 0x00e88310, 0x00e8a310, 0x00e8c310, 0x00e8e310, - 0x00e90310, 0x00e92310, 0x00e94310, 0x00e96310, - 0x00e98310, 0x00e9a310, 0x00e9c310, 0x00e9e310, - 0x00ea0310, 0x00ea2310, 0x00ea4310, 0x00ea6310, - 0x00ea8310, 0x00eaa310, 0x00eac310, 0x00eae310, - 0x00eb0310, 0x00eb2310, 0x00eb4310, 0x00eb6310, - 0x00eb8310, 0x00eba310, 0x00ebc310, 0x00ebe310, - 0x00ec0310, 0x00ec2310, 0x00ec4310, 0x00ec6310, - 0x00ec8310, 0x00eca310, 0x00ecc310, 0x00ece310, - 0x00ed0310, 0x00ed2310, 0x00ed4310, 0x00ed6310, - 0x00ed8310, 0x00eda310, 0x00edc310, 0x00ede310, - 0x00ee0310, 0x00ee2310, 0x00ee4310, 0x00ee6310, - 0x00ee8310, 0x00eea310, 0x00eec310, 0x00eee310, - 0x00ef0310, 0x00ef2310, 0x00ef4310, 0x00ef6310, - 0x00ef8310, 0x00efa310, 0x00efc310, 0x00efe310, - 0x00f00310, 0x00f02310, 0x00f04310, 0x00f06310, - 0x00f08310, 0x00f0a310, 0x00f0c310, 0x00f0e310, - 0x00f10310, 0x00f12310, 0x00f14310, 0x00f16310, - 0x00f18310, 0x00f1a310, 0x00f1c310, 0x00f1e310, - 0x00f20310, 0x00f22310, 0x00f24310, 0x00f26310, - 0x00f28310, 0x00f2a310, 0x00f2c310, 0x00f2e310, - 0x00f30310, 0x00f32310, 0x00f34310, 0x00f36310, - 0x00f38310, 0x00f3a310, 0x00f3c310, 0x00f3e310, - 0x00f40310, 0x00f42310, 0x00f44310, 0x00f46310, - 0x00f48310, 0x00f4a310, 0x00f4c310, 0x00f4e310, - 0x00f50310, 0x00f52310, 0x00f54310, 0x00f56310, - 0x00f58310, 0x00f5a310, 0x00f5c310, 0x00f5e310, - 0x00f60310, 0x00f62310, 0x00f64310, 0x00f66310, - 0x00f68310, 0x00f6a310, 0x00f6c310, 0x00f6e310, - 0x00f70310, 0x00f72310, 0x00f74310, 0x00f76310, - 0x00f78310, 0x00f7a310, 0x00f7c310, 0x00f7e310, - 0x00f80310, 0x00f82310, 0x00f84310, 0x00f86310, - 0x00f88310, 0x00f8a310, 0x00f8c310, 0x00f8e310, - 0x00f90310, 0x00f92310, 0x00f94310, 0x00f96310, - 0x00f98310, 0x00f9a310, 0x00f9c310, 0x00f9e310, - 0x00fa0310, 0x00fa2310, 0x00fa4310, 0x00fa6310, - 0x00fa8310, 0x00faa310, 0x00fac310, 0x00fae310, - 0x00fb0310, 0x00fb2310, 0x00fb4310, 0x00fb6310, - 0x00fb8310, 0x00fba310, 0x00fbc310, 0x00fbe310, - 0x00fc0310, 0x00fc2310, 0x00fc4310, 0x00fc6310, - 0x00fc8310, 0x00fca310, 0x00fcc310, 0x00fce310, - 0x00fd0310, 0x00fd2310, 0x00fd4310, 0x00fd6310, - 0x00fd8310, 0x00fda310, 0x00fdc310, 0x00fde310, - 0x00fe0310, 0x00fe2310, 0x00fe4310, 0x00fe6310, - 0x00fe8310, 0x00fea310, 0x00fec310, 0x00fee310, - 0x00ff0310, 0x00ff2310, 0x00ff4310, 0x00ff6310, - 0x00ff8310, 0x00ffa310, 0x00ffc310, 0x00ffe310, - 0x00001310, 0x00003310, 0x00005310, 0x00007310, - 0x00009310, 0x0000b310, 0x0000d310, 0x0000f310, - 0x00011310, 0x00013310, 0x00015310, 0x00017310, - 0x00019310, 0x0001b310, 0x0001d310, 0x0001f310, - 0x00021310, 0x00023310, 0x00025310, 0x00027310, - 0x00029310, 0x0002b310, 0x0002d310, 0x0002f310, - 0x00031310, 0x00033310, 0x00035310, 0x00037310, - 0x00039310, 0x0003b310, 0x0003d310, 0x0003f310, - 0x00041310, 0x00043310, 0x00045310, 0x00047310, - 0x00049310, 0x0004b310, 0x0004d310, 0x0004f310, - 0x00051310, 0x00053310, 0x00055310, 0x00057310, - 0x00059310, 0x0005b310, 0x0005d310, 0x0005f310, - 0x00061310, 0x00063310, 0x00065310, 0x00067310, - 0x00069310, 0x0006b310, 0x0006d310, 0x0006f310, - 0x00071310, 0x00073310, 0x00075310, 0x00077310, - 0x00079310, 0x0007b310, 0x0007d310, 0x0007f310, - 0x00081310, 0x00083310, 0x00085310, 0x00087310, - 0x00089310, 0x0008b310, 0x0008d310, 0x0008f310, - 0x00091310, 0x00093310, 0x00095310, 0x00097310, - 0x00099310, 0x0009b310, 0x0009d310, 0x0009f310, - 0x000a1310, 0x000a3310, 0x000a5310, 0x000a7310, - 0x000a9310, 0x000ab310, 0x000ad310, 0x000af310, - 0x000b1310, 0x000b3310, 0x000b5310, 0x000b7310, - 0x000b9310, 0x000bb310, 0x000bd310, 0x000bf310, - 0x000c1310, 0x000c3310, 0x000c5310, 0x000c7310, - 0x000c9310, 0x000cb310, 0x000cd310, 0x000cf310, - 0x000d1310, 0x000d3310, 0x000d5310, 0x000d7310, - 0x000d9310, 0x000db310, 0x000dd310, 0x000df310, - 0x000e1310, 0x000e3310, 0x000e5310, 0x000e7310, - 0x000e9310, 0x000eb310, 0x000ed310, 0x000ef310, - 0x000f1310, 0x000f3310, 0x000f5310, 0x000f7310, - 0x000f9310, 0x000fb310, 0x000fd310, 0x000ff310, - 0x00101310, 0x00103310, 0x00105310, 0x00107310, - 0x00109310, 0x0010b310, 0x0010d310, 0x0010f310, - 0x00111310, 0x00113310, 0x00115310, 0x00117310, - 0x00119310, 0x0011b310, 0x0011d310, 0x0011f310, - 0x00121310, 0x00123310, 0x00125310, 0x00127310, - 0x00129310, 0x0012b310, 0x0012d310, 0x0012f310, - 0x00131310, 0x00133310, 0x00135310, 0x00137310, - 0x00139310, 0x0013b310, 0x0013d310, 0x0013f310, - 0x00141310, 0x00143310, 0x00145310, 0x00147310, - 0x00149310, 0x0014b310, 0x0014d310, 0x0014f310, - 0x00151310, 0x00153310, 0x00155310, 0x00157310, - 0x00159310, 0x0015b310, 0x0015d310, 0x0015f310, - 0x00161310, 0x00163310, 0x00165310, 0x00167310, - 0x00169310, 0x0016b310, 0x0016d310, 0x0016f310, - 0x00171310, 0x00173310, 0x00175310, 0x00177310, - 0x00179310, 0x0017b310, 0x0017d310, 0x0017f310, - 0x00181310, 0x00183310, 0x00185310, 0x00187310, - 0x00189310, 0x0018b310, 0x0018d310, 0x0018f310, - 0x00191310, 0x00193310, 0x00195310, 0x00197310, - 0x00199310, 0x0019b310, 0x0019d310, 0x0019f310, - 0x001a1310, 0x001a3310, 0x001a5310, 0x001a7310, - 0x001a9310, 0x001ab310, 0x001ad310, 0x001af310, - 0x001b1310, 0x001b3310, 0x001b5310, 0x001b7310, - 0x001b9310, 0x001bb310, 0x001bd310, 0x001bf310, - 0x001c1310, 0x001c3310, 0x001c5310, 0x001c7310, - 0x001c9310, 0x001cb310, 0x001cd310, 0x001cf310, - 0x001d1310, 0x001d3310, 0x001d5310, 0x001d7310, - 0x001d9310, 0x001db310, 0x001dd310, 0x001df310, - 0x001e1310, 0x001e3310, 0x001e5310, 0x001e7310, - 0x001e9310, 0x001eb310, 0x001ed310, 0x001ef310, - 0x001f1310, 0x001f3310, 0x001f5310, 0x001f7310, - 0x001f9310, 0x001fb310, 0x001fd310, 0x001ff310, - 0x00201310, 0x00203310, 0x00205310, 0x00207310, - 0x00209310, 0x0020b310, 0x0020d310, 0x0020f310, - 0x00211310, 0x00213310, 0x00215310, 0x00217310, - 0x00219310, 0x0021b310, 0x0021d310, 0x0021f310, - 0x00221310, 0x00223310, 0x00225310, 0x00227310, - 0x00229310, 0x0022b310, 0x0022d310, 0x0022f310, - 0x00231310, 0x00233310, 0x00235310, 0x00237310, - 0x00239310, 0x0023b310, 0x0023d310, 0x0023f310, - 0x00241310, 0x00243310, 0x00245310, 0x00247310, - 0x00249310, 0x0024b310, 0x0024d310, 0x0024f310, - 0x00251310, 0x00253310, 0x00255310, 0x00257310, - 0x00259310, 0x0025b310, 0x0025d310, 0x0025f310, - 0x00261310, 0x00263310, 0x00265310, 0x00267310, - 0x00269310, 0x0026b310, 0x0026d310, 0x0026f310, - 0x00271310, 0x00273310, 0x00275310, 0x00277310, - 0x00279310, 0x0027b310, 0x0027d310, 0x0027f310, - 0x00281310, 0x00283310, 0x00285310, 0x00287310, - 0x00289310, 0x0028b310, 0x0028d310, 0x0028f310, - 0x00291310, 0x00293310, 0x00295310, 0x00297310, - 0x00299310, 0x0029b310, 0x0029d310, 0x0029f310, - 0x002a1310, 0x002a3310, 0x002a5310, 0x002a7310, - 0x002a9310, 0x002ab310, 0x002ad310, 0x002af310, - 0x002b1310, 0x002b3310, 0x002b5310, 0x002b7310, - 0x002b9310, 0x002bb310, 0x002bd310, 0x002bf310, - 0x002c1310, 0x002c3310, 0x002c5310, 0x002c7310, - 0x002c9310, 0x002cb310, 0x002cd310, 0x002cf310, - 0x002d1310, 0x002d3310, 0x002d5310, 0x002d7310, - 0x002d9310, 0x002db310, 0x002dd310, 0x002df310, - 0x002e1310, 0x002e3310, 0x002e5310, 0x002e7310, - 0x002e9310, 0x002eb310, 0x002ed310, 0x002ef310, - 0x002f1310, 0x002f3310, 0x002f5310, 0x002f7310, - 0x002f9310, 0x002fb310, 0x002fd310, 0x002ff310, - 0x00301310, 0x00303310, 0x00305310, 0x00307310, - 0x00309310, 0x0030b310, 0x0030d310, 0x0030f310, - 0x00311310, 0x00313310, 0x00315310, 0x00317310, - 0x00319310, 0x0031b310, 0x0031d310, 0x0031f310, - 0x00321310, 0x00323310, 0x00325310, 0x00327310, - 0x00329310, 0x0032b310, 0x0032d310, 0x0032f310, - 0x00331310, 0x00333310, 0x00335310, 0x00337310, - 0x00339310, 0x0033b310, 0x0033d310, 0x0033f310, - 0x00341310, 0x00343310, 0x00345310, 0x00347310, - 0x00349310, 0x0034b310, 0x0034d310, 0x0034f310, - 0x00351310, 0x00353310, 0x00355310, 0x00357310, - 0x00359310, 0x0035b310, 0x0035d310, 0x0035f310, - 0x00361310, 0x00363310, 0x00365310, 0x00367310, - 0x00369310, 0x0036b310, 0x0036d310, 0x0036f310, - 0x00371310, 0x00373310, 0x00375310, 0x00377310, - 0x00379310, 0x0037b310, 0x0037d310, 0x0037f310, - 0x00381310, 0x00383310, 0x00385310, 0x00387310, - 0x00389310, 0x0038b310, 0x0038d310, 0x0038f310, - 0x00391310, 0x00393310, 0x00395310, 0x00397310, - 0x00399310, 0x0039b310, 0x0039d310, 0x0039f310, - 0x003a1310, 0x003a3310, 0x003a5310, 0x003a7310, - 0x003a9310, 0x003ab310, 0x003ad310, 0x003af310, - 0x003b1310, 0x003b3310, 0x003b5310, 0x003b7310, - 0x003b9310, 0x003bb310, 0x003bd310, 0x003bf310, - 0x003c1310, 0x003c3310, 0x003c5310, 0x003c7310, - 0x003c9310, 0x003cb310, 0x003cd310, 0x003cf310, - 0x003d1310, 0x003d3310, 0x003d5310, 0x003d7310, - 0x003d9310, 0x003db310, 0x003dd310, 0x003df310, - 0x003e1310, 0x003e3310, 0x003e5310, 0x003e7310, - 0x003e9310, 0x003eb310, 0x003ed310, 0x003ef310, - 0x003f1310, 0x003f3310, 0x003f5310, 0x003f7310, - 0x003f9310, 0x003fb310, 0x003fd310, 0x003ff310, - 0x00401310, 0x00403310, 0x00405310, 0x00407310, - 0x00409310, 0x0040b310, 0x0040d310, 0x0040f310, - 0x00411310, 0x00413310, 0x00415310, 0x00417310, - 0x00419310, 0x0041b310, 0x0041d310, 0x0041f310, - 0x00421310, 0x00423310, 0x00425310, 0x00427310, - 0x00429310, 0x0042b310, 0x0042d310, 0x0042f310, - 0x00431310, 0x00433310, 0x00435310, 0x00437310, - 0x00439310, 0x0043b310, 0x0043d310, 0x0043f310, - 0x00441310, 0x00443310, 0x00445310, 0x00447310, - 0x00449310, 0x0044b310, 0x0044d310, 0x0044f310, - 0x00451310, 0x00453310, 0x00455310, 0x00457310, - 0x00459310, 0x0045b310, 0x0045d310, 0x0045f310, - 0x00461310, 0x00463310, 0x00465310, 0x00467310, - 0x00469310, 0x0046b310, 0x0046d310, 0x0046f310, - 0x00471310, 0x00473310, 0x00475310, 0x00477310, - 0x00479310, 0x0047b310, 0x0047d310, 0x0047f310, - 0x00481310, 0x00483310, 0x00485310, 0x00487310, - 0x00489310, 0x0048b310, 0x0048d310, 0x0048f310, - 0x00491310, 0x00493310, 0x00495310, 0x00497310, - 0x00499310, 0x0049b310, 0x0049d310, 0x0049f310, - 0x004a1310, 0x004a3310, 0x004a5310, 0x004a7310, - 0x004a9310, 0x004ab310, 0x004ad310, 0x004af310, - 0x004b1310, 0x004b3310, 0x004b5310, 0x004b7310, - 0x004b9310, 0x004bb310, 0x004bd310, 0x004bf310, - 0x004c1310, 0x004c3310, 0x004c5310, 0x004c7310, - 0x004c9310, 0x004cb310, 0x004cd310, 0x004cf310, - 0x004d1310, 0x004d3310, 0x004d5310, 0x004d7310, - 0x004d9310, 0x004db310, 0x004dd310, 0x004df310, - 0x004e1310, 0x004e3310, 0x004e5310, 0x004e7310, - 0x004e9310, 0x004eb310, 0x004ed310, 0x004ef310, - 0x004f1310, 0x004f3310, 0x004f5310, 0x004f7310, - 0x004f9310, 0x004fb310, 0x004fd310, 0x004ff310, - 0x00501310, 0x00503310, 0x00505310, 0x00507310, - 0x00509310, 0x0050b310, 0x0050d310, 0x0050f310, - 0x00511310, 0x00513310, 0x00515310, 0x00517310, - 0x00519310, 0x0051b310, 0x0051d310, 0x0051f310, - 0x00521310, 0x00523310, 0x00525310, 0x00527310, - 0x00529310, 0x0052b310, 0x0052d310, 0x0052f310, - 0x00531310, 0x00533310, 0x00535310, 0x00537310, - 0x00539310, 0x0053b310, 0x0053d310, 0x0053f310, - 0x00541310, 0x00543310, 0x00545310, 0x00547310, - 0x00549310, 0x0054b310, 0x0054d310, 0x0054f310, - 0x00551310, 0x00553310, 0x00555310, 0x00557310, - 0x00559310, 0x0055b310, 0x0055d310, 0x0055f310, - 0x00561310, 0x00563310, 0x00565310, 0x00567310, - 0x00569310, 0x0056b310, 0x0056d310, 0x0056f310, - 0x00571310, 0x00573310, 0x00575310, 0x00577310, - 0x00579310, 0x0057b310, 0x0057d310, 0x0057f310, - 0x00581310, 0x00583310, 0x00585310, 0x00587310, - 0x00589310, 0x0058b310, 0x0058d310, 0x0058f310, - 0x00591310, 0x00593310, 0x00595310, 0x00597310, - 0x00599310, 0x0059b310, 0x0059d310, 0x0059f310, - 0x005a1310, 0x005a3310, 0x005a5310, 0x005a7310, - 0x005a9310, 0x005ab310, 0x005ad310, 0x005af310, - 0x005b1310, 0x005b3310, 0x005b5310, 0x005b7310, - 0x005b9310, 0x005bb310, 0x005bd310, 0x005bf310, - 0x005c1310, 0x005c3310, 0x005c5310, 0x005c7310, - 0x005c9310, 0x005cb310, 0x005cd310, 0x005cf310, - 0x005d1310, 0x005d3310, 0x005d5310, 0x005d7310, - 0x005d9310, 0x005db310, 0x005dd310, 0x005df310, - 0x005e1310, 0x005e3310, 0x005e5310, 0x005e7310, - 0x005e9310, 0x005eb310, 0x005ed310, 0x005ef310, - 0x005f1310, 0x005f3310, 0x005f5310, 0x005f7310, - 0x005f9310, 0x005fb310, 0x005fd310, 0x005ff310, - 0x00601310, 0x00603310, 0x00605310, 0x00607310, - 0x00609310, 0x0060b310, 0x0060d310, 0x0060f310, - 0x00611310, 0x00613310, 0x00615310, 0x00617310, - 0x00619310, 0x0061b310, 0x0061d310, 0x0061f310, - 0x00621310, 0x00623310, 0x00625310, 0x00627310, - 0x00629310, 0x0062b310, 0x0062d310, 0x0062f310, - 0x00631310, 0x00633310, 0x00635310, 0x00637310, - 0x00639310, 0x0063b310, 0x0063d310, 0x0063f310, - 0x00641310, 0x00643310, 0x00645310, 0x00647310, - 0x00649310, 0x0064b310, 0x0064d310, 0x0064f310, - 0x00651310, 0x00653310, 0x00655310, 0x00657310, - 0x00659310, 0x0065b310, 0x0065d310, 0x0065f310, - 0x00661310, 0x00663310, 0x00665310, 0x00667310, - 0x00669310, 0x0066b310, 0x0066d310, 0x0066f310, - 0x00671310, 0x00673310, 0x00675310, 0x00677310, - 0x00679310, 0x0067b310, 0x0067d310, 0x0067f310, - 0x00681310, 0x00683310, 0x00685310, 0x00687310, - 0x00689310, 0x0068b310, 0x0068d310, 0x0068f310, - 0x00691310, 0x00693310, 0x00695310, 0x00697310, - 0x00699310, 0x0069b310, 0x0069d310, 0x0069f310, - 0x006a1310, 0x006a3310, 0x006a5310, 0x006a7310, - 0x006a9310, 0x006ab310, 0x006ad310, 0x006af310, - 0x006b1310, 0x006b3310, 0x006b5310, 0x006b7310, - 0x006b9310, 0x006bb310, 0x006bd310, 0x006bf310, - 0x006c1310, 0x006c3310, 0x006c5310, 0x006c7310, - 0x006c9310, 0x006cb310, 0x006cd310, 0x006cf310, - 0x006d1310, 0x006d3310, 0x006d5310, 0x006d7310, - 0x006d9310, 0x006db310, 0x006dd310, 0x006df310, - 0x006e1310, 0x006e3310, 0x006e5310, 0x006e7310, - 0x006e9310, 0x006eb310, 0x006ed310, 0x006ef310, - 0x006f1310, 0x006f3310, 0x006f5310, 0x006f7310, - 0x006f9310, 0x006fb310, 0x006fd310, 0x006ff310, - 0x00701310, 0x00703310, 0x00705310, 0x00707310, - 0x00709310, 0x0070b310, 0x0070d310, 0x0070f310, - 0x00711310, 0x00713310, 0x00715310, 0x00717310, - 0x00719310, 0x0071b310, 0x0071d310, 0x0071f310, - 0x00721310, 0x00723310, 0x00725310, 0x00727310, - 0x00729310, 0x0072b310, 0x0072d310, 0x0072f310, - 0x00731310, 0x00733310, 0x00735310, 0x00737310, - 0x00739310, 0x0073b310, 0x0073d310, 0x0073f310, - 0x00741310, 0x00743310, 0x00745310, 0x00747310, - 0x00749310, 0x0074b310, 0x0074d310, 0x0074f310, - 0x00751310, 0x00753310, 0x00755310, 0x00757310, - 0x00759310, 0x0075b310, 0x0075d310, 0x0075f310, - 0x00761310, 0x00763310, 0x00765310, 0x00767310, - 0x00769310, 0x0076b310, 0x0076d310, 0x0076f310, - 0x00771310, 0x00773310, 0x00775310, 0x00777310, - 0x00779310, 0x0077b310, 0x0077d310, 0x0077f310, - 0x00781310, 0x00783310, 0x00785310, 0x00787310, - 0x00789310, 0x0078b310, 0x0078d310, 0x0078f310, - 0x00791310, 0x00793310, 0x00795310, 0x00797310, - 0x00799310, 0x0079b310, 0x0079d310, 0x0079f310, - 0x007a1310, 0x007a3310, 0x007a5310, 0x007a7310, - 0x007a9310, 0x007ab310, 0x007ad310, 0x007af310, - 0x007b1310, 0x007b3310, 0x007b5310, 0x007b7310, - 0x007b9310, 0x007bb310, 0x007bd310, 0x007bf310, - 0x007c1310, 0x007c3310, 0x007c5310, 0x007c7310, - 0x007c9310, 0x007cb310, 0x007cd310, 0x007cf310, - 0x007d1310, 0x007d3310, 0x007d5310, 0x007d7310, - 0x007d9310, 0x007db310, 0x007dd310, 0x007df310, - 0x007e1310, 0x007e3310, 0x007e5310, 0x007e7310, - 0x007e9310, 0x007eb310, 0x007ed310, 0x007ef310, - 0x007f1310, 0x007f3310, 0x007f5310, 0x007f7310, - 0x007f9310, 0x007fb310, 0x007fd310, 0x007ff310, - 0x00801310, 0x00803310, 0x00805310, 0x00807310, - 0x00809310, 0x0080b310, 0x0080d310, 0x0080f310, - 0x00811310, 0x00813310, 0x00815310, 0x00817310, - 0x00819310, 0x0081b310, 0x0081d310, 0x0081f310, - 0x00821310, 0x00823310, 0x00825310, 0x00827310, - 0x00829310, 0x0082b310, 0x0082d310, 0x0082f310, - 0x00831310, 0x00833310, 0x00835310, 0x00837310, - 0x00839310, 0x0083b310, 0x0083d310, 0x0083f310, - 0x00841310, 0x00843310, 0x00845310, 0x00847310, - 0x00849310, 0x0084b310, 0x0084d310, 0x0084f310, - 0x00851310, 0x00853310, 0x00855310, 0x00857310, - 0x00859310, 0x0085b310, 0x0085d310, 0x0085f310, - 0x00861310, 0x00863310, 0x00865310, 0x00867310, - 0x00869310, 0x0086b310, 0x0086d310, 0x0086f310, - 0x00871310, 0x00873310, 0x00875310, 0x00877310, - 0x00879310, 0x0087b310, 0x0087d310, 0x0087f310, - 0x00881310, 0x00883310, 0x00885310, 0x00887310, - 0x00889310, 0x0088b310, 0x0088d310, 0x0088f310, - 0x00891310, 0x00893310, 0x00895310, 0x00897310, - 0x00899310, 0x0089b310, 0x0089d310, 0x0089f310, - 0x008a1310, 0x008a3310, 0x008a5310, 0x008a7310, - 0x008a9310, 0x008ab310, 0x008ad310, 0x008af310, - 0x008b1310, 0x008b3310, 0x008b5310, 0x008b7310, - 0x008b9310, 0x008bb310, 0x008bd310, 0x008bf310, - 0x008c1310, 0x008c3310, 0x008c5310, 0x008c7310, - 0x008c9310, 0x008cb310, 0x008cd310, 0x008cf310, - 0x008d1310, 0x008d3310, 0x008d5310, 0x008d7310, - 0x008d9310, 0x008db310, 0x008dd310, 0x008df310, - 0x008e1310, 0x008e3310, 0x008e5310, 0x008e7310, - 0x008e9310, 0x008eb310, 0x008ed310, 0x008ef310, - 0x008f1310, 0x008f3310, 0x008f5310, 0x008f7310, - 0x008f9310, 0x008fb310, 0x008fd310, 0x008ff310, - 0x00901310, 0x00903310, 0x00905310, 0x00907310, - 0x00909310, 0x0090b310, 0x0090d310, 0x0090f310, - 0x00911310, 0x00913310, 0x00915310, 0x00917310, - 0x00919310, 0x0091b310, 0x0091d310, 0x0091f310, - 0x00921310, 0x00923310, 0x00925310, 0x00927310, - 0x00929310, 0x0092b310, 0x0092d310, 0x0092f310, - 0x00931310, 0x00933310, 0x00935310, 0x00937310, - 0x00939310, 0x0093b310, 0x0093d310, 0x0093f310, - 0x00941310, 0x00943310, 0x00945310, 0x00947310, - 0x00949310, 0x0094b310, 0x0094d310, 0x0094f310, - 0x00951310, 0x00953310, 0x00955310, 0x00957310, - 0x00959310, 0x0095b310, 0x0095d310, 0x0095f310, - 0x00961310, 0x00963310, 0x00965310, 0x00967310, - 0x00969310, 0x0096b310, 0x0096d310, 0x0096f310, - 0x00971310, 0x00973310, 0x00975310, 0x00977310, - 0x00979310, 0x0097b310, 0x0097d310, 0x0097f310, - 0x00981310, 0x00983310, 0x00985310, 0x00987310, - 0x00989310, 0x0098b310, 0x0098d310, 0x0098f310, - 0x00991310, 0x00993310, 0x00995310, 0x00997310, - 0x00999310, 0x0099b310, 0x0099d310, 0x0099f310, - 0x009a1310, 0x009a3310, 0x009a5310, 0x009a7310, - 0x009a9310, 0x009ab310, 0x009ad310, 0x009af310, - 0x009b1310, 0x009b3310, 0x009b5310, 0x009b7310, - 0x009b9310, 0x009bb310, 0x009bd310, 0x009bf310, - 0x009c1310, 0x009c3310, 0x009c5310, 0x009c7310, - 0x009c9310, 0x009cb310, 0x009cd310, 0x009cf310, - 0x009d1310, 0x009d3310, 0x009d5310, 0x009d7310, - 0x009d9310, 0x009db310, 0x009dd310, 0x009df310, - 0x009e1310, 0x009e3310, 0x009e5310, 0x009e7310, - 0x009e9310, 0x009eb310, 0x009ed310, 0x009ef310, - 0x009f1310, 0x009f3310, 0x009f5310, 0x009f7310, - 0x009f9310, 0x009fb310, 0x009fd310, 0x009ff310, - 0x00a01310, 0x00a03310, 0x00a05310, 0x00a07310, - 0x00a09310, 0x00a0b310, 0x00a0d310, 0x00a0f310, - 0x00a11310, 0x00a13310, 0x00a15310, 0x00a17310, - 0x00a19310, 0x00a1b310, 0x00a1d310, 0x00a1f310, - 0x00a21310, 0x00a23310, 0x00a25310, 0x00a27310, - 0x00a29310, 0x00a2b310, 0x00a2d310, 0x00a2f310, - 0x00a31310, 0x00a33310, 0x00a35310, 0x00a37310, - 0x00a39310, 0x00a3b310, 0x00a3d310, 0x00a3f310, - 0x00a41310, 0x00a43310, 0x00a45310, 0x00a47310, - 0x00a49310, 0x00a4b310, 0x00a4d310, 0x00a4f310, - 0x00a51310, 0x00a53310, 0x00a55310, 0x00a57310, - 0x00a59310, 0x00a5b310, 0x00a5d310, 0x00a5f310, - 0x00a61310, 0x00a63310, 0x00a65310, 0x00a67310, - 0x00a69310, 0x00a6b310, 0x00a6d310, 0x00a6f310, - 0x00a71310, 0x00a73310, 0x00a75310, 0x00a77310, - 0x00a79310, 0x00a7b310, 0x00a7d310, 0x00a7f310, - 0x00a81310, 0x00a83310, 0x00a85310, 0x00a87310, - 0x00a89310, 0x00a8b310, 0x00a8d310, 0x00a8f310, - 0x00a91310, 0x00a93310, 0x00a95310, 0x00a97310, - 0x00a99310, 0x00a9b310, 0x00a9d310, 0x00a9f310, - 0x00aa1310, 0x00aa3310, 0x00aa5310, 0x00aa7310, - 0x00aa9310, 0x00aab310, 0x00aad310, 0x00aaf310, - 0x00ab1310, 0x00ab3310, 0x00ab5310, 0x00ab7310, - 0x00ab9310, 0x00abb310, 0x00abd310, 0x00abf310, - 0x00ac1310, 0x00ac3310, 0x00ac5310, 0x00ac7310, - 0x00ac9310, 0x00acb310, 0x00acd310, 0x00acf310, - 0x00ad1310, 0x00ad3310, 0x00ad5310, 0x00ad7310, - 0x00ad9310, 0x00adb310, 0x00add310, 0x00adf310, - 0x00ae1310, 0x00ae3310, 0x00ae5310, 0x00ae7310, - 0x00ae9310, 0x00aeb310, 0x00aed310, 0x00aef310, - 0x00af1310, 0x00af3310, 0x00af5310, 0x00af7310, - 0x00af9310, 0x00afb310, 0x00afd310, 0x00aff310, - 0x00b01310, 0x00b03310, 0x00b05310, 0x00b07310, - 0x00b09310, 0x00b0b310, 0x00b0d310, 0x00b0f310, - 0x00b11310, 0x00b13310, 0x00b15310, 0x00b17310, - 0x00b19310, 0x00b1b310, 0x00b1d310, 0x00b1f310, - 0x00b21310, 0x00b23310, 0x00b25310, 0x00b27310, - 0x00b29310, 0x00b2b310, 0x00b2d310, 0x00b2f310, - 0x00b31310, 0x00b33310, 0x00b35310, 0x00b37310, - 0x00b39310, 0x00b3b310, 0x00b3d310, 0x00b3f310, - 0x00b41310, 0x00b43310, 0x00b45310, 0x00b47310, - 0x00b49310, 0x00b4b310, 0x00b4d310, 0x00b4f310, - 0x00b51310, 0x00b53310, 0x00b55310, 0x00b57310, - 0x00b59310, 0x00b5b310, 0x00b5d310, 0x00b5f310, - 0x00b61310, 0x00b63310, 0x00b65310, 0x00b67310, - 0x00b69310, 0x00b6b310, 0x00b6d310, 0x00b6f310, - 0x00b71310, 0x00b73310, 0x00b75310, 0x00b77310, - 0x00b79310, 0x00b7b310, 0x00b7d310, 0x00b7f310, - 0x00b81310, 0x00b83310, 0x00b85310, 0x00b87310, - 0x00b89310, 0x00b8b310, 0x00b8d310, 0x00b8f310, - 0x00b91310, 0x00b93310, 0x00b95310, 0x00b97310, - 0x00b99310, 0x00b9b310, 0x00b9d310, 0x00b9f310, - 0x00ba1310, 0x00ba3310, 0x00ba5310, 0x00ba7310, - 0x00ba9310, 0x00bab310, 0x00bad310, 0x00baf310, - 0x00bb1310, 0x00bb3310, 0x00bb5310, 0x00bb7310, - 0x00bb9310, 0x00bbb310, 0x00bbd310, 0x00bbf310, - 0x00bc1310, 0x00bc3310, 0x00bc5310, 0x00bc7310, - 0x00bc9310, 0x00bcb310, 0x00bcd310, 0x00bcf310, - 0x00bd1310, 0x00bd3310, 0x00bd5310, 0x00bd7310, - 0x00bd9310, 0x00bdb310, 0x00bdd310, 0x00bdf310, - 0x00be1310, 0x00be3310, 0x00be5310, 0x00be7310, - 0x00be9310, 0x00beb310, 0x00bed310, 0x00bef310, - 0x00bf1310, 0x00bf3310, 0x00bf5310, 0x00bf7310, - 0x00bf9310, 0x00bfb310, 0x00bfd310, 0x00bff310, - 0x00c01310, 0x00c03310, 0x00c05310, 0x00c07310, - 0x00c09310, 0x00c0b310, 0x00c0d310, 0x00c0f310, - 0x00c11310, 0x00c13310, 0x00c15310, 0x00c17310, - 0x00c19310, 0x00c1b310, 0x00c1d310, 0x00c1f310, - 0x00c21310, 0x00c23310, 0x00c25310, 0x00c27310, - 0x00c29310, 0x00c2b310, 0x00c2d310, 0x00c2f310, - 0x00c31310, 0x00c33310, 0x00c35310, 0x00c37310, - 0x00c39310, 0x00c3b310, 0x00c3d310, 0x00c3f310, - 0x00c41310, 0x00c43310, 0x00c45310, 0x00c47310, - 0x00c49310, 0x00c4b310, 0x00c4d310, 0x00c4f310, - 0x00c51310, 0x00c53310, 0x00c55310, 0x00c57310, - 0x00c59310, 0x00c5b310, 0x00c5d310, 0x00c5f310, - 0x00c61310, 0x00c63310, 0x00c65310, 0x00c67310, - 0x00c69310, 0x00c6b310, 0x00c6d310, 0x00c6f310, - 0x00c71310, 0x00c73310, 0x00c75310, 0x00c77310, - 0x00c79310, 0x00c7b310, 0x00c7d310, 0x00c7f310, - 0x00c81310, 0x00c83310, 0x00c85310, 0x00c87310, - 0x00c89310, 0x00c8b310, 0x00c8d310, 0x00c8f310, - 0x00c91310, 0x00c93310, 0x00c95310, 0x00c97310, - 0x00c99310, 0x00c9b310, 0x00c9d310, 0x00c9f310, - 0x00ca1310, 0x00ca3310, 0x00ca5310, 0x00ca7310, - 0x00ca9310, 0x00cab310, 0x00cad310, 0x00caf310, - 0x00cb1310, 0x00cb3310, 0x00cb5310, 0x00cb7310, - 0x00cb9310, 0x00cbb310, 0x00cbd310, 0x00cbf310, - 0x00cc1310, 0x00cc3310, 0x00cc5310, 0x00cc7310, - 0x00cc9310, 0x00ccb310, 0x00ccd310, 0x00ccf310, - 0x00cd1310, 0x00cd3310, 0x00cd5310, 0x00cd7310, - 0x00cd9310, 0x00cdb310, 0x00cdd310, 0x00cdf310, - 0x00ce1310, 0x00ce3310, 0x00ce5310, 0x00ce7310, - 0x00ce9310, 0x00ceb310, 0x00ced310, 0x00cef310, - 0x00cf1310, 0x00cf3310, 0x00cf5310, 0x00cf7310, - 0x00cf9310, 0x00cfb310, 0x00cfd310, 0x00cff310, - 0x00d01310, 0x00d03310, 0x00d05310, 0x00d07310, - 0x00d09310, 0x00d0b310, 0x00d0d310, 0x00d0f310, - 0x00d11310, 0x00d13310, 0x00d15310, 0x00d17310, - 0x00d19310, 0x00d1b310, 0x00d1d310, 0x00d1f310, - 0x00d21310, 0x00d23310, 0x00d25310, 0x00d27310, - 0x00d29310, 0x00d2b310, 0x00d2d310, 0x00d2f310, - 0x00d31310, 0x00d33310, 0x00d35310, 0x00d37310, - 0x00d39310, 0x00d3b310, 0x00d3d310, 0x00d3f310, - 0x00d41310, 0x00d43310, 0x00d45310, 0x00d47310, - 0x00d49310, 0x00d4b310, 0x00d4d310, 0x00d4f310, - 0x00d51310, 0x00d53310, 0x00d55310, 0x00d57310, - 0x00d59310, 0x00d5b310, 0x00d5d310, 0x00d5f310, - 0x00d61310, 0x00d63310, 0x00d65310, 0x00d67310, - 0x00d69310, 0x00d6b310, 0x00d6d310, 0x00d6f310, - 0x00d71310, 0x00d73310, 0x00d75310, 0x00d77310, - 0x00d79310, 0x00d7b310, 0x00d7d310, 0x00d7f310, - 0x00d81310, 0x00d83310, 0x00d85310, 0x00d87310, - 0x00d89310, 0x00d8b310, 0x00d8d310, 0x00d8f310, - 0x00d91310, 0x00d93310, 0x00d95310, 0x00d97310, - 0x00d99310, 0x00d9b310, 0x00d9d310, 0x00d9f310, - 0x00da1310, 0x00da3310, 0x00da5310, 0x00da7310, - 0x00da9310, 0x00dab310, 0x00dad310, 0x00daf310, - 0x00db1310, 0x00db3310, 0x00db5310, 0x00db7310, - 0x00db9310, 0x00dbb310, 0x00dbd310, 0x00dbf310, - 0x00dc1310, 0x00dc3310, 0x00dc5310, 0x00dc7310, - 0x00dc9310, 0x00dcb310, 0x00dcd310, 0x00dcf310, - 0x00dd1310, 0x00dd3310, 0x00dd5310, 0x00dd7310, - 0x00dd9310, 0x00ddb310, 0x00ddd310, 0x00ddf310, - 0x00de1310, 0x00de3310, 0x00de5310, 0x00de7310, - 0x00de9310, 0x00deb310, 0x00ded310, 0x00def310, - 0x00df1310, 0x00df3310, 0x00df5310, 0x00df7310, - 0x00df9310, 0x00dfb310, 0x00dfd310, 0x00dff310, - 0x00e01310, 0x00e03310, 0x00e05310, 0x00e07310, - 0x00e09310, 0x00e0b310, 0x00e0d310, 0x00e0f310, - 0x00e11310, 0x00e13310, 0x00e15310, 0x00e17310, - 0x00e19310, 0x00e1b310, 0x00e1d310, 0x00e1f310, - 0x00e21310, 0x00e23310, 0x00e25310, 0x00e27310, - 0x00e29310, 0x00e2b310, 0x00e2d310, 0x00e2f310, - 0x00e31310, 0x00e33310, 0x00e35310, 0x00e37310, - 0x00e39310, 0x00e3b310, 0x00e3d310, 0x00e3f310, - 0x00e41310, 0x00e43310, 0x00e45310, 0x00e47310, - 0x00e49310, 0x00e4b310, 0x00e4d310, 0x00e4f310, - 0x00e51310, 0x00e53310, 0x00e55310, 0x00e57310, - 0x00e59310, 0x00e5b310, 0x00e5d310, 0x00e5f310, - 0x00e61310, 0x00e63310, 0x00e65310, 0x00e67310, - 0x00e69310, 0x00e6b310, 0x00e6d310, 0x00e6f310, - 0x00e71310, 0x00e73310, 0x00e75310, 0x00e77310, - 0x00e79310, 0x00e7b310, 0x00e7d310, 0x00e7f310, - 0x00e81310, 0x00e83310, 0x00e85310, 0x00e87310, - 0x00e89310, 0x00e8b310, 0x00e8d310, 0x00e8f310, - 0x00e91310, 0x00e93310, 0x00e95310, 0x00e97310, - 0x00e99310, 0x00e9b310, 0x00e9d310, 0x00e9f310, - 0x00ea1310, 0x00ea3310, 0x00ea5310, 0x00ea7310, - 0x00ea9310, 0x00eab310, 0x00ead310, 0x00eaf310, - 0x00eb1310, 0x00eb3310, 0x00eb5310, 0x00eb7310, - 0x00eb9310, 0x00ebb310, 0x00ebd310, 0x00ebf310, - 0x00ec1310, 0x00ec3310, 0x00ec5310, 0x00ec7310, - 0x00ec9310, 0x00ecb310, 0x00ecd310, 0x00ecf310, - 0x00ed1310, 0x00ed3310, 0x00ed5310, 0x00ed7310, - 0x00ed9310, 0x00edb310, 0x00edd310, 0x00edf310, - 0x00ee1310, 0x00ee3310, 0x00ee5310, 0x00ee7310, - 0x00ee9310, 0x00eeb310, 0x00eed310, 0x00eef310, - 0x00ef1310, 0x00ef3310, 0x00ef5310, 0x00ef7310, - 0x00ef9310, 0x00efb310, 0x00efd310, 0x00eff310, - 0x00f01310, 0x00f03310, 0x00f05310, 0x00f07310, - 0x00f09310, 0x00f0b310, 0x00f0d310, 0x00f0f310, - 0x00f11310, 0x00f13310, 0x00f15310, 0x00f17310, - 0x00f19310, 0x00f1b310, 0x00f1d310, 0x00f1f310, - 0x00f21310, 0x00f23310, 0x00f25310, 0x00f27310, - 0x00f29310, 0x00f2b310, 0x00f2d310, 0x00f2f310, - 0x00f31310, 0x00f33310, 0x00f35310, 0x00f37310, - 0x00f39310, 0x00f3b310, 0x00f3d310, 0x00f3f310, - 0x00f41310, 0x00f43310, 0x00f45310, 0x00f47310, - 0x00f49310, 0x00f4b310, 0x00f4d310, 0x00f4f310, - 0x00f51310, 0x00f53310, 0x00f55310, 0x00f57310, - 0x00f59310, 0x00f5b310, 0x00f5d310, 0x00f5f310, - 0x00f61310, 0x00f63310, 0x00f65310, 0x00f67310, - 0x00f69310, 0x00f6b310, 0x00f6d310, 0x00f6f310, - 0x00f71310, 0x00f73310, 0x00f75310, 0x00f77310, - 0x00f79310, 0x00f7b310, 0x00f7d310, 0x00f7f310, - 0x00f81310, 0x00f83310, 0x00f85310, 0x00f87310, - 0x00f89310, 0x00f8b310, 0x00f8d310, 0x00f8f310, - 0x00f91310, 0x00f93310, 0x00f95310, 0x00f97310, - 0x00f99310, 0x00f9b310, 0x00f9d310, 0x00f9f310, - 0x00fa1310, 0x00fa3310, 0x00fa5310, 0x00fa7310, - 0x00fa9310, 0x00fab310, 0x00fad310, 0x00faf310, - 0x00fb1310, 0x00fb3310, 0x00fb5310, 0x00fb7310, - 0x00fb9310, 0x00fbb310, 0x00fbd310, 0x00fbf310, - 0x00fc1310, 0x00fc3310, 0x00fc5310, 0x00fc7310, - 0x00fc9310, 0x00fcb310, 0x00fcd310, 0x00fcf310, - 0x00fd1310, 0x00fd3310, 0x00fd5310, 0x00fd7310, - 0x00fd9310, 0x00fdb310, 0x00fdd310, 0x00fdf310, - 0x00fe1310, 0x00fe3310, 0x00fe5310, 0x00fe7310, - 0x00fe9310, 0x00feb310, 0x00fed310, 0x00fef310, - 0x00ff1310, 0x00ff3310, 0x00ff5310, 0x00ff7310, - 0x00ff9310, 0x00ffb310, 0x00ffd310, 0x00fff310, -}; diff --git a/libs/zlibng/arch/x86/fill_window_sse.c b/libs/zlibng/arch/x86/fill_window_sse.c deleted file mode 100644 index 1c0f863bd..000000000 --- a/libs/zlibng/arch/x86/fill_window_sse.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Fill Window with SSE2-optimized hash shifting - * - * Copyright (C) 2013 Intel Corporation - * Authors: - * Arjan van de Ven - * Jim Kukunas - * - * For conditions of distribution and use, see copyright notice in zlib.h - */ -#ifdef X86_SSE2 - -#include "zbuild.h" -#include -#include "deflate.h" -#include "deflate_p.h" -#include "functable.h" - -extern int read_buf(PREFIX3(stream) *strm, unsigned char *buf, unsigned size); - -ZLIB_INTERNAL void fill_window_sse(deflate_state *s) { - const __m128i xmm_wsize = _mm_set1_epi16(s->w_size); - - register unsigned n; - register Pos *p; - unsigned more; /* Amount of free space at the end of the window. */ - unsigned int wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(unsigned long)s->lookahead -(unsigned long)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - memcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start = (s->match_start >= wsize) ? s->match_start - wsize : 0; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - p -= 8; - do { - __m128i value, result; - - value = _mm_loadu_si128((__m128i *)p); - result = _mm_subs_epu16(value, xmm_wsize); - _mm_storeu_si128((__m128i *)p, result); - - p -= 8; - n -= 8; - } while (n > 0); - - n = wsize; - p = &s->prev[n]; - p -= 8; - do { - __m128i value, result; - - value = _mm_loadu_si128((__m128i *)p); - result = _mm_subs_epu16(value, xmm_wsize); - _mm_storeu_si128((__m128i *)p, result); - - p -= 8; - n -= 8; - } while (n > 0); - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - unsigned int str = s->strstart - s->insert; - s->ins_h = s->window[str]; - if (str >= 1) - functable.insert_string(s, str + 2 - MIN_MATCH, 1); -#if MIN_MATCH != 3 -#error Call insert_string() MIN_MATCH-3 more times - while (s->insert) { - functable.insert_string(s, str, 1); - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } -#else - unsigned int count; - if (unlikely(s->lookahead == 1)){ - count = s->insert - 1; - }else{ - count = s->insert; - } - functable.insert_string(s, str, count); - s->insert -= count; -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - unsigned long curr = s->strstart + (unsigned long)(s->lookahead); - unsigned long init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - memset(s->window + curr, 0, (unsigned)init); - s->high_water = curr + init; - } else if (s->high_water < (unsigned long)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (unsigned long)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - memset(s->window + s->high_water, 0, (unsigned)init); - s->high_water += init; - } - } - - Assert((unsigned long)s->strstart <= s->window_size - MIN_LOOKAHEAD, "not enough room for search"); -} -#endif diff --git a/libs/zlibng/arch/x86/insert_string_sse.c b/libs/zlibng/arch/x86/insert_string_sse.c index 394e50937..d0c316b19 100644 --- a/libs/zlibng/arch/x86/insert_string_sse.c +++ b/libs/zlibng/arch/x86/insert_string_sse.c @@ -5,52 +5,42 @@ * */ -#include "zbuild.h" -#include "deflate.h" - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef X86_SSE4_2_CRC_HASH -ZLIB_INTERNAL Pos insert_string_sse(deflate_state *const s, const Pos str, unsigned int count) { - Pos ret = 0; - unsigned int idx; - unsigned int *ip, val, h; - - for (idx = 0; idx < count; idx++) { - ip = (unsigned *)&s->window[str+idx]; - memcpy(&val, ip, sizeof(val)); - h = 0; - - if (s->level >= TRIGGER_LEVEL) - val &= 0xFFFFFF; - +#include "../../zbuild.h" +#include #ifdef _MSC_VER - h = _mm_crc32_u32(h, val); -#elif defined(X86_SSE4_2_CRC_INTRIN) - h = __builtin_ia32_crc32si(h, val); +# include +#endif +#include "../../deflate.h" + +#ifdef X86_SSE42_CRC_INTRIN +# ifdef _MSC_VER +# define UPDATE_HASH(s, h, val)\ + h = _mm_crc32_u32(h, val) +# else +# define UPDATE_HASH(s, h, val)\ + h = __builtin_ia32_crc32si(h, val) +# endif #else - __asm__ __volatile__ ( - "crc32 %1,%0\n\t" - : "+r" (h) - : "r" (val) - ); -#endif - Pos head = s->head[h & s->hash_mask]; - if (head != str+idx) { - s->prev[(str+idx) & s->w_mask] = head; - s->head[h & s->hash_mask] = str+idx; - if (idx == count-1) - ret = head; - } else if (idx == count - 1) { - ret = str + idx; - } +# ifdef _MSC_VER +# define UPDATE_HASH(s, h, val) {\ + __asm mov edx, h\ + __asm mov eax, val\ + __asm crc32 eax, edx\ + __asm mov val, eax\ } - return ret; -} +# else +# define UPDATE_HASH(s, h, val) \ + __asm__ __volatile__ (\ + "crc32 %1,%0\n\t"\ + : "+r" (h)\ + : "r" (val)\ + ); +# endif +#endif + +#define INSERT_STRING insert_string_sse4 +#define QUICK_INSERT_STRING quick_insert_string_sse4 + +#ifdef X86_SSE42_CRC_HASH +# include "../../insert_string_tpl.h" #endif diff --git a/libs/zlibng/arch/x86/slide_avx.c b/libs/zlibng/arch/x86/slide_avx.c new file mode 100644 index 000000000..be9a9b7ea --- /dev/null +++ b/libs/zlibng/arch/x86/slide_avx.c @@ -0,0 +1,47 @@ +/* + * AVX2 optimized hash slide, based on Intel's slide_sse implementation + * + * Copyright (C) 2017 Intel Corporation + * Authors: + * Arjan van de Ven + * Jim Kukunas + * Mika T. Lindqvist + * + * For conditions of distribution and use, see copyright notice in zlib.h + */ +#include "../../zbuild.h" +#include "../../deflate.h" + +#include + +Z_INTERNAL void slide_hash_avx2(deflate_state *s) { + Pos *p; + unsigned n; + uint16_t wsize = (uint16_t)s->w_size; + const __m256i ymm_wsize = _mm256_set1_epi16((short)wsize); + + n = HASH_SIZE; + p = &s->head[n] - 16; + do { + __m256i value, result; + + value = _mm256_loadu_si256((__m256i *)p); + result= _mm256_subs_epu16(value, ymm_wsize); + _mm256_storeu_si256((__m256i *)p, result); + p -= 16; + n -= 16; + } while (n > 0); + + n = wsize; + p = &s->prev[n] - 16; + do { + __m256i value, result; + + value = _mm256_loadu_si256((__m256i *)p); + result= _mm256_subs_epu16(value, ymm_wsize); + _mm256_storeu_si256((__m256i *)p, result); + + p -= 16; + n -= 16; + } while (n > 0); +} diff --git a/libs/zlibng/arch/x86/slide_sse.c b/libs/zlibng/arch/x86/slide_sse.c new file mode 100644 index 000000000..abf447475 --- /dev/null +++ b/libs/zlibng/arch/x86/slide_sse.c @@ -0,0 +1,46 @@ +/* + * SSE optimized hash slide + * + * Copyright (C) 2017 Intel Corporation + * Authors: + * Arjan van de Ven + * Jim Kukunas + * + * For conditions of distribution and use, see copyright notice in zlib.h + */ +#include "../../zbuild.h" +#include "../../deflate.h" + +#include + +Z_INTERNAL void slide_hash_sse2(deflate_state *s) { + Pos *p; + unsigned n; + uint16_t wsize = (uint16_t)s->w_size; + const __m128i xmm_wsize = _mm_set1_epi16((short)wsize); + + n = HASH_SIZE; + p = &s->head[n] - 8; + do { + __m128i value, result; + + value = _mm_loadu_si128((__m128i *)p); + result= _mm_subs_epu16(value, xmm_wsize); + _mm_storeu_si128((__m128i *)p, result); + p -= 8; + n -= 8; + } while (n > 0); + + n = wsize; + p = &s->prev[n] - 8; + do { + __m128i value, result; + + value = _mm_loadu_si128((__m128i *)p); + result= _mm_subs_epu16(value, xmm_wsize); + _mm_storeu_si128((__m128i *)p, result); + + p -= 8; + n -= 8; + } while (n > 0); +} diff --git a/libs/zlibng/arch/x86/x86.c b/libs/zlibng/arch/x86/x86.c index 382f72a2b..e782cb8ee 100644 --- a/libs/zlibng/arch/x86/x86.c +++ b/libs/zlibng/arch/x86/x86.c @@ -8,61 +8,73 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -#include "zutil.h" +#include "../../zutil.h" #ifdef _MSC_VER -#include +# include #else // Newer versions of GCC and clang come with cpuid.h -#include +# include #endif -ZLIB_INTERNAL int x86_cpu_has_sse2; -ZLIB_INTERNAL int x86_cpu_has_sse42; -ZLIB_INTERNAL int x86_cpu_has_pclmulqdq; -ZLIB_INTERNAL int x86_cpu_has_tzcnt; +Z_INTERNAL int x86_cpu_has_avx2; +Z_INTERNAL int x86_cpu_has_sse2; +Z_INTERNAL int x86_cpu_has_ssse3; +Z_INTERNAL int x86_cpu_has_sse42; +Z_INTERNAL int x86_cpu_has_pclmulqdq; +Z_INTERNAL int x86_cpu_has_tzcnt; static void cpuid(int info, unsigned* eax, unsigned* ebx, unsigned* ecx, unsigned* edx) { #ifdef _MSC_VER - unsigned int registers[4]; - __cpuid(registers, info); + unsigned int registers[4]; + __cpuid((int *)registers, info); - *eax = registers[0]; - *ebx = registers[1]; - *ecx = registers[2]; - *edx = registers[3]; + *eax = registers[0]; + *ebx = registers[1]; + *ecx = registers[2]; + *edx = registers[3]; #else - unsigned int _eax; - unsigned int _ebx; - unsigned int _ecx; - unsigned int _edx; - __cpuid(info, _eax, _ebx, _ecx, _edx); - *eax = _eax; - *ebx = _ebx; - *ecx = _ecx; - *edx = _edx; + __cpuid(info, *eax, *ebx, *ecx, *edx); #endif } -void ZLIB_INTERNAL x86_check_features(void) { - unsigned eax, ebx, ecx, edx; - unsigned maxbasic; +static void cpuidex(int info, int subinfo, unsigned* eax, unsigned* ebx, unsigned* ecx, unsigned* edx) { +#ifdef _MSC_VER + unsigned int registers[4]; + __cpuidex((int *)registers, info, subinfo); - cpuid(0, &maxbasic, &ebx, &ecx, &edx); - - cpuid(1 /*CPU_PROCINFO_AND_FEATUREBITS*/, &eax, &ebx, &ecx, &edx); - - x86_cpu_has_sse2 = edx & 0x4000000; - x86_cpu_has_sse42 = ecx & 0x100000; - x86_cpu_has_pclmulqdq = ecx & 0x2; - - if (maxbasic >= 7) { - cpuid(7, &eax, &ebx, &ecx, &edx); - - // check BMI1 bit - // Reference: https://software.intel.com/sites/default/files/article/405250/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family.pdf - x86_cpu_has_tzcnt = ebx & 0x8; - } else { - x86_cpu_has_tzcnt = 0; - } + *eax = registers[0]; + *ebx = registers[1]; + *ecx = registers[2]; + *edx = registers[3]; +#else + __cpuid_count(info, subinfo, *eax, *ebx, *ecx, *edx); +#endif +} + +void Z_INTERNAL x86_check_features(void) { + unsigned eax, ebx, ecx, edx; + unsigned maxbasic; + + cpuid(0, &maxbasic, &ebx, &ecx, &edx); + + cpuid(1 /*CPU_PROCINFO_AND_FEATUREBITS*/, &eax, &ebx, &ecx, &edx); + + x86_cpu_has_sse2 = edx & 0x4000000; + x86_cpu_has_ssse3 = ecx & 0x200; + x86_cpu_has_sse42 = ecx & 0x100000; + x86_cpu_has_pclmulqdq = ecx & 0x2; + + if (maxbasic >= 7) { + cpuidex(7, 0, &eax, &ebx, &ecx, &edx); + + // check BMI1 bit + // Reference: https://software.intel.com/sites/default/files/article/405250/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family.pdf + x86_cpu_has_tzcnt = ebx & 0x8; + // check AVX2 bit + x86_cpu_has_avx2 = ebx & 0x20; + } else { + x86_cpu_has_tzcnt = 0; + x86_cpu_has_avx2 = 0; + } } diff --git a/libs/zlibng/arch/x86/x86.h b/libs/zlibng/arch/x86/x86.h index 860e64154..8471e155c 100644 --- a/libs/zlibng/arch/x86/x86.h +++ b/libs/zlibng/arch/x86/x86.h @@ -1,16 +1,18 @@ - /* cpu.h -- check for CPU features - * Copyright (C) 2013 Intel Corporation Jim Kukunas - * For conditions of distribution and use, see copyright notice in zlib.h - */ +/* cpu.h -- check for CPU features +* Copyright (C) 2013 Intel Corporation Jim Kukunas +* For conditions of distribution and use, see copyright notice in zlib.h +*/ #ifndef CPU_H_ #define CPU_H_ +extern int x86_cpu_has_avx2; extern int x86_cpu_has_sse2; +extern int x86_cpu_has_ssse3; extern int x86_cpu_has_sse42; extern int x86_cpu_has_pclmulqdq; extern int x86_cpu_has_tzcnt; -void ZLIB_INTERNAL x86_check_features(void); +void Z_INTERNAL x86_check_features(void); #endif /* CPU_H_ */ diff --git a/libs/zlibng/chunkset.c b/libs/zlibng/chunkset.c new file mode 100644 index 000000000..2aa8d4e47 --- /dev/null +++ b/libs/zlibng/chunkset.c @@ -0,0 +1,81 @@ +/* chunkset.c -- inline functions to copy small data chunks. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zbuild.h" +#include "zutil.h" + +// We need sizeof(chunk_t) to be 8, no matter what. +#if defined(UNALIGNED64_OK) +typedef uint64_t chunk_t; +#elif defined(UNALIGNED_OK) +typedef struct chunk_t { uint32_t u32[2]; } chunk_t; +#else +typedef struct chunk_t { uint8_t u8[8]; } chunk_t; +#endif + +#define HAVE_CHUNKMEMSET_1 +#define HAVE_CHUNKMEMSET_4 +#define HAVE_CHUNKMEMSET_8 + +static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) { +#if defined(UNALIGNED64_OK) + *chunk = 0x0101010101010101 * (uint8_t)*from; +#elif defined(UNALIGNED_OK) + chunk->u32[0] = 0x01010101 * (uint8_t)*from; + chunk->u32[1] = chunk->u32[0]; +#else + memset(chunk, *from, sizeof(chunk_t)); +#endif +} + +static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) { +#if defined(UNALIGNED64_OK) + uint32_t half_chunk; + half_chunk = *(uint32_t *)from; + *chunk = 0x0000000100000001 * (uint64_t)half_chunk; +#elif defined(UNALIGNED_OK) + chunk->u32[0] = *(uint32_t *)from; + chunk->u32[1] = chunk->u32[0]; +#else + uint8_t *chunkptr = (uint8_t *)chunk; + memcpy(chunkptr, from, 4); + memcpy(chunkptr+4, from, 4); +#endif +} + +static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) { +#if defined(UNALIGNED64_OK) + *chunk = *(uint64_t *)from; +#elif defined(UNALIGNED_OK) + uint32_t* p = (uint32_t *)from; + chunk->u32[0] = p[0]; + chunk->u32[1] = p[1]; +#else + memcpy(chunk, from, sizeof(chunk_t)); +#endif +} + +static inline void loadchunk(uint8_t const *s, chunk_t *chunk) { + chunkmemset_8((uint8_t *)s, chunk); +} + +static inline void storechunk(uint8_t *out, chunk_t *chunk) { +#if defined(UNALIGNED64_OK) + *(uint64_t *)out = *chunk; +#elif defined(UNALIGNED_OK) + ((uint32_t *)out)[0] = chunk->u32[0]; + ((uint32_t *)out)[1] = chunk->u32[1]; +#else + memcpy(out, chunk, sizeof(chunk_t)); +#endif +} + +#define CHUNKSIZE chunksize_c +#define CHUNKCOPY chunkcopy_c +#define CHUNKCOPY_SAFE chunkcopy_safe_c +#define CHUNKUNROLL chunkunroll_c +#define CHUNKMEMSET chunkmemset_c +#define CHUNKMEMSET_SAFE chunkmemset_safe_c + +#include "chunkset_tpl.h" diff --git a/libs/zlibng/chunkset_tpl.h b/libs/zlibng/chunkset_tpl.h new file mode 100644 index 000000000..9e8ede559 --- /dev/null +++ b/libs/zlibng/chunkset_tpl.h @@ -0,0 +1,172 @@ +/* chunkset_tpl.h -- inline functions to copy small data chunks. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* Returns the chunk size */ +Z_INTERNAL uint32_t CHUNKSIZE(void) { + return sizeof(chunk_t); +} + +/* Behave like memcpy, but assume that it's OK to overwrite at least + chunk_t bytes of output even if the length is shorter than this, + that the length is non-zero, and that `from` lags `out` by at least + sizeof chunk_t bytes (or that they don't overlap at all or simply that + the distance is less than the length of the copy). + + Aside from better memory bus utilisation, this means that short copies + (chunk_t bytes or fewer) will fall straight through the loop + without iteration, which will hopefully make the branch prediction more + reliable. */ +Z_INTERNAL uint8_t* CHUNKCOPY(uint8_t *out, uint8_t const *from, unsigned len) { + chunk_t chunk; + --len; + loadchunk(from, &chunk); + storechunk(out, &chunk); + out += (len % sizeof(chunk_t)) + 1; + from += (len % sizeof(chunk_t)) + 1; + len /= sizeof(chunk_t); + while (len > 0) { + loadchunk(from, &chunk); + storechunk(out, &chunk); + out += sizeof(chunk_t); + from += sizeof(chunk_t); + --len; + } + return out; +} + +/* Behave like chunkcopy, but avoid writing beyond of legal output. */ +Z_INTERNAL uint8_t* CHUNKCOPY_SAFE(uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe) { + if ((safe - out) < (ptrdiff_t)sizeof(chunk_t)) { + int32_t use_chunk16 = sizeof(chunk_t) > 16 && (len & 16); + if (use_chunk16) { + memcpy(out, from, 16); + out += 16; + from += 16; + } + if (len & 8) { + memcpy(out, from, 8); + out += 8; + from += 8; + } + if (len & 4) { + memcpy(out, from, 4); + out += 4; + from += 4; + } + if (len & 2) { + memcpy(out, from, 2); + out += 2; + from += 2; + } + if (len & 1) { + *out++ = *from++; + } + return out; + } + return CHUNKCOPY(out, from, len); +} + +/* Perform short copies until distance can be rewritten as being at least + sizeof chunk_t. + + This assumes that it's OK to overwrite at least the first + 2*sizeof(chunk_t) bytes of output even if the copy is shorter than this. + This assumption holds because inflate_fast() starts every iteration with at + least 258 bytes of output space available (258 being the maximum length + output from a single token; see inflate_fast()'s assumptions below). */ +Z_INTERNAL uint8_t* CHUNKUNROLL(uint8_t *out, unsigned *dist, unsigned *len) { + unsigned char const *from = out - *dist; + chunk_t chunk; + while (*dist < *len && *dist < sizeof(chunk_t)) { + loadchunk(from, &chunk); + storechunk(out, &chunk); + out += *dist; + *len -= *dist; + *dist += *dist; + } + return out; +} + +/* Copy DIST bytes from OUT - DIST into OUT + DIST * k, for 0 <= k < LEN/DIST. + Return OUT + LEN. */ +Z_INTERNAL uint8_t* CHUNKMEMSET(uint8_t *out, unsigned dist, unsigned len) { + /* Debug performance related issues when len < sizeof(uint64_t): + Assert(len >= sizeof(uint64_t), "chunkmemset should be called on larger chunks"); */ + Assert(dist > 0, "cannot have a distance 0"); + + unsigned char *from = out - dist; + chunk_t chunk; + unsigned sz = sizeof(chunk); + if (len < sz) { + do { + *out++ = *from++; + --len; + } while (len != 0); + return out; + } + +#ifdef HAVE_CHUNKMEMSET_1 + if (dist == 1) { + chunkmemset_1(from, &chunk); + } else +#endif +#ifdef HAVE_CHUNKMEMSET_2 + if (dist == 2) { + chunkmemset_2(from, &chunk); + } else +#endif +#ifdef HAVE_CHUNKMEMSET_4 + if (dist == 4) { + chunkmemset_4(from, &chunk); + } else +#endif +#ifdef HAVE_CHUNKMEMSET_8 + if (dist == 8) { + chunkmemset_8(from, &chunk); + } else +#endif + if (dist == sz) { + loadchunk(from, &chunk); + } else if (dist < sz) { + unsigned char *end = out + len - 1; + while (len > dist) { + out = CHUNKCOPY_SAFE(out, from, dist, end); + len -= dist; + } + if (len > 0) { + out = CHUNKCOPY_SAFE(out, from, len, end); + } + return out; + } else { + out = CHUNKUNROLL(out, &dist, &len); + return CHUNKCOPY(out, out - dist, len); + } + + unsigned rem = len % sz; + len -= rem; + while (len) { + storechunk(out, &chunk); + out += sz; + len -= sz; + } + + /* Last, deal with the case when LEN is not a multiple of SZ. */ + if (rem) + memcpy(out, from, rem); + out += rem; + + return out; +} + +Z_INTERNAL uint8_t* CHUNKMEMSET_SAFE(uint8_t *out, unsigned dist, unsigned len, unsigned left) { + if (left < (unsigned)(3 * sizeof(chunk_t))) { + while (len > 0) { + *out = *(out - dist); + out++; + --len; + } + return out; + } + return CHUNKMEMSET(out, dist, len); +} diff --git a/libs/zlibng/cmake/detect-arch.c b/libs/zlibng/cmake/detect-arch.c new file mode 100644 index 000000000..571553582 --- /dev/null +++ b/libs/zlibng/cmake/detect-arch.c @@ -0,0 +1,99 @@ +// archdetect.c -- Detect compiler architecture and raise preprocessor error +// containing a simple arch identifier. +// Copyright (C) 2019 Hans Kristian Rosbach +// Licensed under the Zlib license, see LICENSE.md for details + +// x86_64 +#if defined(__x86_64__) || defined(_M_X64) + #error archfound x86_64 + +// x86 +#elif defined(__i386) || defined(_M_IX86) + #error archfound i686 + +// ARM +#elif defined(__aarch64__) || defined(_M_ARM64) + #error archfound aarch64 +#elif defined(__arm__) || defined(__arm) || defined(_M_ARM) || defined(__TARGET_ARCH_ARM) + #if defined(__ARM64_ARCH_8__) || defined(__ARMv8__) || defined(__ARMv8_A__) + #error archfound armv8 + #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) + #error archfound armv7 + #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6M__) + #error archfound armv6 + #elif defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) + #error archfound armv5 + #elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARCH_5E__) + #error archfound armv4 + #elif defined(__ARM_ARCH_3__) || defined(__TARGET_ARCH_3M__) + #error archfound armv3 + #elif defined(__ARM_ARCH_2__) + #error archfound armv2 + #endif + +// PowerPC +#elif defined(__powerpc__) || defined(_ppc__) || defined(__PPC__) + #if defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__) + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + #error archfound powerpc64le + #else + #error archfound powerpc64 + #endif + #else + #error archfound powerpc + #endif + +// --------------- Less common architectures alphabetically below --------------- + +// ALPHA +#elif defined(__alpha__) || defined(__alpha) + #error archfound alpha + +// Blackfin +#elif defined(__BFIN__) + #error archfound blackfin + +// Itanium +#elif defined(__ia64) || defined(_M_IA64) + #error archfound ia64 + +// MIPS +#elif defined(__mips__) || defined(__mips) + #error archfound mips + +// Motorola 68000-series +#elif defined(__m68k__) + #error archfound m68k + +// SuperH +#elif defined(__sh__) + #error archfound sh + +// SPARC +#elif defined(__sparc__) || defined(__sparc) + #if defined(__sparcv9) || defined(__sparc_v9__) + #error archfound sparc9 + #elif defined(__sparcv8) || defined(__sparc_v8__) + #error archfound sparc8 + #endif + +// SystemZ +#elif defined(__370__) + #error archfound s370 +#elif defined(__s390__) + #error archfound s390 +#elif defined(__s390x) || defined(__zarch__) + #error archfound s390x + +// PARISC +#elif defined(__hppa__) + #error archfound parisc + +// RS-6000 +#elif defined(__THW_RS6000) + #error archfound rs6000 + +// return 'unrecognized' if we do not know what architecture this is +#else + #error archfound unrecognized +#endif diff --git a/libs/zlibng/cmake/detect-arch.cmake b/libs/zlibng/cmake/detect-arch.cmake new file mode 100644 index 000000000..b80d6666f --- /dev/null +++ b/libs/zlibng/cmake/detect-arch.cmake @@ -0,0 +1,93 @@ +# detect-arch.cmake -- Detect compiler architecture and set ARCH and BASEARCH +# Copyright (C) 2019 Hans Kristian Rosbach +# Licensed under the Zlib license, see LICENSE.md for details +set(ARCHDETECT_FOUND TRUE) + +if(CMAKE_OSX_ARCHITECTURES) + # If multiple architectures are requested (universal build), pick only the first + list(GET CMAKE_OSX_ARCHITECTURES 0 ARCH) +elseif(MSVC) + if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86") + set(ARCH "i686") + elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64") + set(ARCH "x86_64") + elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARMV7") + set(ARCH "arm") + elseif ("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64") + set(ARCH "aarch64") + endif() +elseif(CMAKE_CROSSCOMPILING) + set(ARCH ${CMAKE_C_COMPILER_TARGET}) +else() + # Let preprocessor parse archdetect.c and raise an error containing the arch identifier + enable_language(C) + try_run( + run_result_unused + compile_result_unused + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/detect-arch.c + COMPILE_OUTPUT_VARIABLE RAWOUTPUT + CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} + ) + + # Find basearch tag, and extract the arch word into BASEARCH variable + string(REGEX REPLACE ".*archfound ([a-zA-Z0-9_]+).*" "\\1" ARCH "${RAWOUTPUT}") + if(NOT ARCH) + set(ARCH unknown) + endif() +endif() + +# Make sure we have ARCH set +if(NOT ARCH OR ARCH STREQUAL "unknown") + set(ARCH ${CMAKE_SYSTEM_PROCESSOR}) + message(STATUS "Arch not recognized, falling back to cmake arch: '${ARCH}'") +else() + message(STATUS "Arch detected: '${ARCH}'") +endif() + +# Base arch detection +if("${ARCH}" MATCHES "(x86_64|AMD64|i[3-6]86)") + set(BASEARCH "x86") + set(BASEARCH_X86_FOUND TRUE) +elseif("${ARCH}" MATCHES "(arm(v[0-9])?|aarch64)") + set(BASEARCH "arm") + set(BASEARCH_ARM_FOUND TRUE) +elseif("${ARCH}" MATCHES "ppc(64(le)?)?|powerpc(64(le)?)?") + set(BASEARCH "ppc") + set(BASEARCH_PPC_FOUND TRUE) +elseif("${ARCH}" MATCHES "alpha") + set(BASEARCH "alpha") + set(BASEARCH_ALPHA_FOUND TRUE) +elseif("${ARCH}" MATCHES "blackfin") + set(BASEARCH "blackfin") + set(BASEARCH_BLACKFIN_FOUND TRUE) +elseif("${ARCH}" MATCHES "ia64") + set(BASEARCH "ia64") + set(BASEARCH_IA64_FOUND TRUE) +elseif("${ARCH}" MATCHES "mips") + set(BASEARCH "mips") + set(BASEARCH_MIPS_FOUND TRUE) +elseif("${ARCH}" MATCHES "m68k") + set(BASEARCH "m68k") + set(BASEARCH_M68K_FOUND TRUE) +elseif("${ARCH}" MATCHES "sh") + set(BASEARCH "sh") + set(BASEARCH_SH_FOUND TRUE) +elseif("${ARCH}" MATCHES "sparc[89]?") + set(BASEARCH "sparc") + set(BASEARCH_SPARC_FOUND TRUE) +elseif("${ARCH}" MATCHES "s3[679]0x?") + set(BASEARCH "s360") + set(BASEARCH_S360_FOUND TRUE) +elseif("${ARCH}" MATCHES "parisc") + set(BASEARCH "parisc") + set(BASEARCH_PARISC_FOUND TRUE) +elseif("${ARCH}" MATCHES "rs6000") + set(BASEARCH "rs6000") + set(BASEARCH_RS6000_FOUND TRUE) +else() + set(BASEARCH "x86") + set(BASEARCH_X86_FOUND TRUE) + message(STATUS "Basearch '${ARCH}' not recognized, defaulting to 'x86'.") +endif() +message(STATUS "Basearch of '${ARCH}' has been detected as: '${BASEARCH}'") diff --git a/libs/zlibng/cmake/detect-sanitizer.cmake b/libs/zlibng/cmake/detect-sanitizer.cmake new file mode 100644 index 000000000..172a8d558 --- /dev/null +++ b/libs/zlibng/cmake/detect-sanitizer.cmake @@ -0,0 +1,123 @@ +# detect-sanitizer.cmake -- Detect supported compiler sanitizer flags +# Licensed under the Zlib license, see LICENSE.md for details + +macro(check_sanitizer_support known_checks supported_checks) + set(available_checks "") + + # Build list of supported sanitizer flags by incrementally trying compilation with + # known sanitizer checks + + foreach(check ${known_checks}) + if(available_checks STREQUAL "") + set(compile_checks "${check}") + else() + set(compile_checks "${available_checks},${check}") + endif() + + set(CMAKE_REQUIRED_FLAGS "-fsanitize=${compile_checks}") + + check_c_source_compiles("int main() { return 0; }" HAS_SANITIZER_${check} + FAIL_REGEX "not supported|unrecognized command|unknown option") + + set(CMAKE_REQUIRED_FLAGS) + + if(HAS_SANITIZER_${check}) + set(available_checks ${compile_checks}) + endif() + endforeach() + + set(${supported_checks} ${available_checks}) +endmacro() + +macro(add_address_sanitizer) + set(known_checks + address + pointer-compare + pointer-subtract + ) + + check_sanitizer_support("${known_checks}" supported_checks) + if(NOT ${supported_checks} STREQUAL "") + message(STATUS "Address sanitizer is enabled: ${supported_checks}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${supported_checks}") + else() + message(STATUS "Address sanitizer is not supported") + endif() + + if(CMAKE_CROSSCOMPILING_EMULATOR) + # Only check for leak sanitizer if not cross-compiling due to qemu crash + message(WARNING "Leak sanitizer is not supported when cross compiling") + else() + # Leak sanitizer requires address sanitizer + check_sanitizer_support("leak" supported_checks) + if(NOT ${supported_checks} STREQUAL "") + message(STATUS "Leak sanitizer is enabled: ${supported_checks}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${supported_checks}") + else() + message(STATUS "Leak sanitizer is not supported") + endif() + endif() +endmacro() + +macro(add_memory_sanitizer) + check_sanitizer_support("memory" supported_checks) + if(NOT ${supported_checks} STREQUAL "") + message(STATUS "Memory sanitizer is enabled: ${supported_checks}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${supported_checks}") + else() + message(STATUS "Memory sanitizer is not supported") + endif() +endmacro() + +macro(add_undefined_sanitizer) + set(known_checks + array-bounds + bool + bounds + builtin + enum + float-cast-overflow + float-divide-by-zero + function + integer-divide-by-zero + local-bounds + null + nonnull-attribute + pointer-overflow + return + returns-nonnull-attribute + shift + shift-base + shift-exponent + signed-integer-overflow + undefined + unsigned-integer-overflow + unsigned-shift-base + vla-bound + vptr + ) + + # Only check for alignment sanitizer flag if unaligned access is not supported + if(NOT UNALIGNED_OK) + list(APPEND known_checks alignment) + endif() + # Object size sanitizer has no effect at -O0 and produces compiler warning if enabled + if(NOT CMAKE_C_FLAGS MATCHES "-O0") + list(APPEND known_checks object-size) + endif() + + check_sanitizer_support("${known_checks}" supported_checks) + + if(NOT ${supported_checks} STREQUAL "") + message(STATUS "Undefined behavior sanitizer is enabled: ${supported_checks}") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${supported_checks}") + + # Group sanitizer flag -fsanitize=undefined will automatically add alignment, even if + # it is not in our sanitize flag list, so we need to explicitly disable alignment sanitizing. + if(UNALIGNED_OK) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=alignment") + endif() + else() + message(STATUS "UNdefined behavior sanitizer is not supported") + endif() +endmacro() \ No newline at end of file diff --git a/libs/zlibng/cmake/run-and-compare.cmake b/libs/zlibng/cmake/run-and-compare.cmake new file mode 100644 index 000000000..0e9343373 --- /dev/null +++ b/libs/zlibng/cmake/run-and-compare.cmake @@ -0,0 +1,48 @@ +if(NOT DEFINED OUTPUT OR NOT DEFINED COMPARE OR NOT DEFINED COMMAND) + message(FATAL_ERROR "Run and compare arguments missing") +endif() + +if(INPUT) + # Run command with stdin input and redirect stdout to output + execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${COMMAND}" + -DINPUT=${INPUT} + -DOUTPUT=${OUTPUT} + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) +else() + # Run command and redirect stdout to output + execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${COMMAND}" + -DOUTPUT=${OUTPUT} + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) +endif() + +if(CMD_RESULT) + message(FATAL_ERROR "Run before compare failed: ${CMD_RESULT}") +endif() + +# Use configure_file to normalize line-endings +if(IGNORE_LINE_ENDINGS) + configure_file(${COMPARE} ${COMPARE}.cmp NEWLINE_STYLE LF) + set(COMPARE ${COMPARE}.cmp) + configure_file(${OUTPUT} ${OUTPUT}.cmp NEWLINE_STYLE LF) + set(OUTPUT ${OUTPUT}.cmp) +endif() + +# Compare that output is equal to specified file +execute_process(COMMAND ${CMAKE_COMMAND} + -E compare_files ${COMPARE} ${OUTPUT} + RESULT_VARIABLE CMD_RESULT) + +# Delete temporary files used to normalize line-endings +if(IGNORE_LINE_ENDINGS) + file(REMOVE ${COMPARE} ${OUTPUT}) +endif() + +if(CMD_RESULT) + message(FATAL_ERROR "Run compare failed: ${CMD_RESULT}") +endif() \ No newline at end of file diff --git a/libs/zlibng/cmake/run-and-redirect.cmake b/libs/zlibng/cmake/run-and-redirect.cmake new file mode 100644 index 000000000..30c574112 --- /dev/null +++ b/libs/zlibng/cmake/run-and-redirect.cmake @@ -0,0 +1,38 @@ +# If no output is specified, discard output +if(NOT DEFINED OUTPUT) + if(WIN32) + set(OUTPUT NUL) + else() + set(OUTPUT /dev/null) + endif() +endif() + +if(INPUT) + # Check to see that input file exists + if(NOT EXISTS ${INPUT}) + message(FATAL_ERROR "Cannot find input: ${INPUT}") + endif() + # Execute with both stdin and stdout file + execute_process(COMMAND ${COMMAND} + RESULT_VARIABLE CMD_RESULT + INPUT_FILE ${INPUT} + OUTPUT_FILE ${OUTPUT}) +else() + # Execute with only stdout file + execute_process(COMMAND ${COMMAND} + RESULT_VARIABLE CMD_RESULT + OUTPUT_FILE ${OUTPUT}) +endif() + +# Check if exit code is in list of successful exit codes +if(SUCCESS_EXIT) + list(FIND SUCCESS_EXIT ${CMD_RESULT} _INDEX) + if (${_INDEX} GREATER -1) + set(CMD_RESULT 0) + endif() +endif() + +# Check to see if successful +if(CMD_RESULT) + message(FATAL_ERROR "${COMMAND} failed: ${CMD_RESULT}") +endif() diff --git a/libs/zlibng/cmake/test-compress.cmake b/libs/zlibng/cmake/test-compress.cmake new file mode 100644 index 000000000..75355bc73 --- /dev/null +++ b/libs/zlibng/cmake/test-compress.cmake @@ -0,0 +1,188 @@ +if(TARGET) + set(COMPRESS_TARGET ${TARGET}) + set(DECOMPRESS_TARGET ${TARGET}) +endif() + +if(NOT DEFINED INPUT OR NOT DEFINED COMPRESS_TARGET OR NOT DEFINED DECOMPRESS_TARGET) + message(FATAL_ERROR "Compress test arguments missing") +endif() + +# Set default values +if(NOT DEFINED COMPARE) + set(COMPARE ON) +endif() +if(NOT DEFINED COMPRESS_ARGS) + set(COMPRESS_ARGS -c -k) +endif() +if(NOT DEFINED DECOMPRESS_ARGS) + set(DECOMPRESS_ARGS -d -c) +endif() +if(NOT DEFINED GZIP_VERIFY) + set(GZIP_VERIFY ON) +endif() +if(NOT DEFINED SUCCESS_EXIT) + set(SUCCESS_EXIT 0) +endif() + +# Generate unique output path so multiple tests can be executed at the same time +if(NOT OUTPUT) + # Output name based on input and unique id + string(RANDOM UNIQUE_ID) + set(OUTPUT ${INPUT}-${UNIQUE_ID}) +else() + # Output name appends unique id in case multiple tests with same output name + string(RANDOM LENGTH 6 UNIQUE_ID) + set(OUTPUT ${OUTPUT}-${UNIQUE_ID}) +endif() +string(REPLACE ".gz" "" OUTPUT "${OUTPUT}") + +macro(cleanup) + # Cleanup temporary mingizip files + file(REMOVE ${OUTPUT}.gz ${OUTPUT}.out) + # Cleanup temporary gzip files + file(REMOVE ${OUTPUT}.gzip.gz ${OUTPUT}.gzip.out) +endmacro() + +# Compress input file +if(NOT EXISTS ${INPUT}) + message(FATAL_ERROR "Cannot find compress input: ${INPUT}") +endif() + +set(COMPRESS_COMMAND ${COMPRESS_TARGET} ${COMPRESS_ARGS}) + +execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${COMPRESS_COMMAND}" + -DINPUT=${INPUT} + -DOUTPUT=${OUTPUT}.gz + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) + +if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Compress failed: ${CMD_RESULT}") +endif() + +# Decompress output +if(NOT EXISTS ${OUTPUT}.gz) + cleanup() + message(FATAL_ERROR "Cannot find decompress input: ${OUTPUT}.gz") +endif() + +set(DECOMPRESS_COMMAND ${DECOMPRESS_TARGET} ${DECOMPRESS_ARGS}) + +execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${DECOMPRESS_COMMAND}" + -DINPUT=${OUTPUT}.gz + -DOUTPUT=${OUTPUT}.out + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) + +if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Decompress failed: ${CMD_RESULT}") +endif() + +if(COMPARE) + # Compare decompressed output with original input file + execute_process(COMMAND ${CMAKE_COMMAND} + -E compare_files ${INPUT} ${OUTPUT}.out + RESULT_VARIABLE CMD_RESULT) + + if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Compare minigzip decompress failed: ${CMD_RESULT}") + endif() +endif() + +if(GZIP_VERIFY AND NOT "${COMPRESS_ARGS}" MATCHES "-T") + # Transparent writing does not use gzip format + find_program(GZIP gzip) + if(GZIP) + if(NOT EXISTS ${OUTPUT}.gz) + cleanup() + message(FATAL_ERROR "Cannot find gzip decompress input: ${OUTPUT}.gz") + endif() + + # Check gzip can decompress our compressed output + set(GZ_DECOMPRESS_COMMAND ${GZIP} --decompress) + + execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${GZ_DECOMPRESS_COMMAND}" + -DINPUT=${OUTPUT}.gz + -DOUTPUT=${OUTPUT}.gzip.out + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) + + if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Gzip decompress failed: ${CMD_RESULT}") + endif() + + # Compare gzip output with original input file + execute_process(COMMAND ${CMAKE_COMMAND} + -E compare_files ${INPUT} ${OUTPUT}.gzip.out + RESULT_VARIABLE CMD_RESULT) + + if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Compare gzip decompress failed: ${CMD_RESULT}") + endif() + + if(NOT EXISTS ${OUTPUT}.gz) + cleanup() + message(FATAL_ERROR "Cannot find gzip compress input: ${INPUT}") + endif() + + # Compress input file with gzip + set(GZ_COMPRESS_COMMAND ${GZIP} --stdout) + + execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${GZ_COMPRESS_COMMAND}" + -DINPUT=${INPUT} + -DOUTPUT=${OUTPUT}.gzip.gz + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) + + if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Gzip compress failed: ${CMD_RESULT}") + endif() + + if(NOT EXISTS ${OUTPUT}.gz) + cleanup() + message(FATAL_ERROR "Cannot find minigzip decompress input: ${OUTPUT}.gzip.gz") + endif() + + # Check minigzip can decompress gzip compressed output + execute_process(COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${DECOMPRESS_COMMAND}" + -DINPUT=${OUTPUT}.gzip.gz + -DOUTPUT=${OUTPUT}.gzip.out + "-DSUCCESS_EXIT=${SUCCESS_EXIT}" + -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake + RESULT_VARIABLE CMD_RESULT) + + if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Minigzip decompress gzip failed: ${CMD_RESULT}") + endif() + + if(COMPARE) + # Compare original input file with gzip decompressed output + execute_process(COMMAND ${CMAKE_COMMAND} + -E compare_files ${INPUT} ${OUTPUT}.gzip.out + RESULT_VARIABLE CMD_RESULT) + + if(CMD_RESULT) + cleanup() + message(FATAL_ERROR "Compare minigzip decompress gzip failed: ${CMD_RESULT}") + endif() + endif() + endif() +endif() + +cleanup() \ No newline at end of file diff --git a/libs/zlibng/cmake/toolchain-aarch64.cmake b/libs/zlibng/cmake/toolchain-aarch64.cmake new file mode 100644 index 000000000..31894fdcd --- /dev/null +++ b/libs/zlibng/cmake/toolchain-aarch64.cmake @@ -0,0 +1,26 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(CMAKE_SYSTEM_VERSION 1) + +message(STATUS "Using cross-compile toolchain: ${CROSS_COMPILE_TOOLCHAIN}") + +set(CMAKE_C_COMPILER_TARGET "aarch64-linux-gnu") +set(CMAKE_CXX_COMPILER_TARGET "aarch64-linux-gnu") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-aarch64 -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/cmake/toolchain-arm.cmake b/libs/zlibng/cmake/toolchain-arm.cmake new file mode 100644 index 000000000..0e3c5c377 --- /dev/null +++ b/libs/zlibng/cmake/toolchain-arm.cmake @@ -0,0 +1,24 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_SYSTEM_VERSION 1) + +message(STATUS "Using cross-compile toolchain: ${CMAKE_C_COMPILER_TARGET}") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/cmake/toolchain-mingw-i686.cmake b/libs/zlibng/cmake/toolchain-mingw-i686.cmake new file mode 100644 index 000000000..588ec0ef9 --- /dev/null +++ b/libs/zlibng/cmake/toolchain-mingw-i686.cmake @@ -0,0 +1,16 @@ +set(CMAKE_SYSTEM_NAME Windows) + +set(CMAKE_C_COMPILER_TARGET i686) +set(CMAKE_CXX_COMPILER_TARGET i686) + +set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) +set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR wine) + +set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/libs/zlibng/cmake/toolchain-mingw-x86_64.cmake b/libs/zlibng/cmake/toolchain-mingw-x86_64.cmake new file mode 100644 index 000000000..c778b7222 --- /dev/null +++ b/libs/zlibng/cmake/toolchain-mingw-x86_64.cmake @@ -0,0 +1,16 @@ +set(CMAKE_SYSTEM_NAME Windows) + +set(CMAKE_C_COMPILER_TARGET x86_64) +set(CMAKE_CXX_COMPILER_TARGET x86_64) + +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) +set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR wine) + +set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/libs/zlibng/cmake/toolchain-powerpc.cmake b/libs/zlibng/cmake/toolchain-powerpc.cmake new file mode 100644 index 000000000..4f7f8e92f --- /dev/null +++ b/libs/zlibng/cmake/toolchain-powerpc.cmake @@ -0,0 +1,25 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR powerpc) +set(CMAKE_SYSTEM_VERSION 1) + +set(CMAKE_C_COMPILER_TARGET "powerpc-linux-gnu") +set(CMAKE_CXX_COMPILER_TARGET "powerpc-linux-gnu") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/cmake/toolchain-powerpc64.cmake b/libs/zlibng/cmake/toolchain-powerpc64.cmake new file mode 100644 index 000000000..4be3bbd59 --- /dev/null +++ b/libs/zlibng/cmake/toolchain-powerpc64.cmake @@ -0,0 +1,25 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR ppc64) +set(CMAKE_SYSTEM_VERSION 1) + +set(CMAKE_C_COMPILER_TARGET "powerpc64-linux-gnu") +set(CMAKE_CXX_COMPILER_TARGET "powerpc64-linux-gnu") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64 -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/cmake/toolchain-powerpc64le.cmake b/libs/zlibng/cmake/toolchain-powerpc64le.cmake new file mode 100644 index 000000000..5535f616f --- /dev/null +++ b/libs/zlibng/cmake/toolchain-powerpc64le.cmake @@ -0,0 +1,25 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR ppc64le) +set(CMAKE_SYSTEM_VERSION 1) + +set(CMAKE_C_COMPILER_TARGET "powerpc64le-linux-gnu") +set(CMAKE_CXX_COMPILER_TARGET "powerpc64le-linux-gnu") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64le -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/cmake/toolchain-s390x.cmake b/libs/zlibng/cmake/toolchain-s390x.cmake new file mode 100644 index 000000000..41bc0d101 --- /dev/null +++ b/libs/zlibng/cmake/toolchain-s390x.cmake @@ -0,0 +1,25 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR s390x) +set(CMAKE_SYSTEM_VERSION 1) + +set(CMAKE_C_COMPILER_TARGET "s390x-linux-gnu") +set(CMAKE_CXX_COMPILER_TARGET "s390x-linux-gnu") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-s390x -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/cmake/toolchain-sparc64.cmake b/libs/zlibng/cmake/toolchain-sparc64.cmake new file mode 100644 index 000000000..f0cd99565 --- /dev/null +++ b/libs/zlibng/cmake/toolchain-sparc64.cmake @@ -0,0 +1,25 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR sparc64) +set(CMAKE_SYSTEM_VERSION 1) + +set(CMAKE_C_COMPILER_TARGET "sparc64-linux-gnu") +set(CMAKE_CXX_COMPILER_TARGET "sparc64-linux-gnu") + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_CROSSCOMPILING_EMULATOR qemu-sparc64 -L /usr/${CMAKE_C_COMPILER_TARGET}/) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-gcc) +if(NOT C_COMPILER_FULL_PATH) + message(FATAL_ERROR "Cross-compiler ${CMAKE_C_COMPILER_TARGET}-gcc not found") +endif() +set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH}) + +find_program(CXX_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-g++) +if(CXX_COMPILER_FULL_PATH) + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH}) +endif() diff --git a/libs/zlibng/compare258.c b/libs/zlibng/compare258.c new file mode 100644 index 000000000..bc41638ae --- /dev/null +++ b/libs/zlibng/compare258.c @@ -0,0 +1,186 @@ +/* compare258.c -- aligned and unaligned versions of compare258 + * Copyright (C) 2020 Nathan Moinvaziri + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zbuild.h" +#include "zutil.h" + +#include "fallback_builtins.h" + +/* ALIGNED, byte comparison */ +static inline uint32_t compare256_c_static(const unsigned char *src0, const unsigned char *src1) { + uint32_t len = 0; + + do { + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + if (*src0 != *src1) + return len + (*src0 == *src1); + src0 += 1, src1 += 1, len += 1; + } while (len < 256); + + return 256; +} + +static inline uint32_t compare258_c_static(const unsigned char *src0, const unsigned char *src1) { + if (*src0 != *src1) + return 0; + src0 += 1, src1 += 1; + if (*src0 != *src1) + return 1; + src0 += 1, src1 += 1; + + return compare256_c_static(src0, src1) + 2; +} + +Z_INTERNAL uint32_t compare258_c(const unsigned char *src0, const unsigned char *src1) { + return compare258_c_static(src0, src1); +} + +#define LONGEST_MATCH longest_match_c +#define COMPARE256 compare256_c_static +#define COMPARE258 compare258_c_static + +#include "match_tpl.h" + +#ifdef UNALIGNED_OK +/* UNALIGNED_OK, 16-bit integer comparison */ +static inline uint32_t compare256_unaligned_16_static(const unsigned char *src0, const unsigned char *src1) { + uint32_t len = 0; + + do { + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return len + (*src0 == *src1); + src0 += 2, src1 += 2, len += 2; + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return len + (*src0 == *src1); + src0 += 2, src1 += 2, len += 2; + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return len + (*src0 == *src1); + src0 += 2, src1 += 2, len += 2; + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return len + (*src0 == *src1); + src0 += 2, src1 += 2, len += 2; + } while (len < 256); + + return 256; +} + +static inline uint32_t compare258_unaligned_16_static(const unsigned char *src0, const unsigned char *src1) { + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return (*src0 == *src1); + + return compare256_unaligned_16_static(src0+2, src1+2) + 2; +} + +Z_INTERNAL uint32_t compare258_unaligned_16(const unsigned char *src0, const unsigned char *src1) { + return compare258_unaligned_16_static(src0, src1); +} + +#define LONGEST_MATCH longest_match_unaligned_16 +#define COMPARE256 compare256_unaligned_16_static +#define COMPARE258 compare258_unaligned_16_static + +#include "match_tpl.h" + +#ifdef HAVE_BUILTIN_CTZ +/* UNALIGNED_OK, 32-bit integer comparison */ +static inline uint32_t compare256_unaligned_32_static(const unsigned char *src0, const unsigned char *src1) { + uint32_t len = 0; + + do { + uint32_t sv = *(uint32_t *)src0; + uint32_t mv = *(uint32_t *)src1; + uint32_t diff = sv ^ mv; + + if (diff) { + uint32_t match_byte = __builtin_ctz(diff) / 8; + return len + match_byte; + } + + src0 += 4, src1 += 4, len += 4; + } while (len < 256); + + return 256; +} + +static inline uint32_t compare258_unaligned_32_static(const unsigned char *src0, const unsigned char *src1) { + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return (*src0 == *src1); + + return compare256_unaligned_32_static(src0+2, src1+2) + 2; +} + +Z_INTERNAL uint32_t compare258_unaligned_32(const unsigned char *src0, const unsigned char *src1) { + return compare258_unaligned_32_static(src0, src1); +} + +#define LONGEST_MATCH longest_match_unaligned_32 +#define COMPARE256 compare256_unaligned_32_static +#define COMPARE258 compare258_unaligned_32_static + +#include "match_tpl.h" + +#endif + +#if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL) +/* UNALIGNED64_OK, 64-bit integer comparison */ +static inline uint32_t compare256_unaligned_64_static(const unsigned char *src0, const unsigned char *src1) { + uint32_t len = 0; + + do { + uint64_t sv = *(uint64_t *)src0; + uint64_t mv = *(uint64_t *)src1; + uint64_t diff = sv ^ mv; + + if (diff) { + uint64_t match_byte = __builtin_ctzll(diff) / 8; + return len + (uint32_t)match_byte; + } + + src0 += 8, src1 += 8, len += 8; + } while (len < 256); + + return 256; +} + +static inline uint32_t compare258_unaligned_64_static(const unsigned char *src0, const unsigned char *src1) { + if (*(uint16_t *)src0 != *(uint16_t *)src1) + return (*src0 == *src1); + + return compare256_unaligned_64_static(src0+2, src1+2) + 2; +} + +Z_INTERNAL uint32_t compare258_unaligned_64(const unsigned char *src0, const unsigned char *src1) { + return compare258_unaligned_64_static(src0, src1); +} + +#define LONGEST_MATCH longest_match_unaligned_64 +#define COMPARE256 compare256_unaligned_64_static +#define COMPARE258 compare258_unaligned_64_static + +#include "match_tpl.h" + +#endif + +#endif diff --git a/libs/zlibng/compress.c b/libs/zlibng/compress.c index 6b493fda5..d5379591d 100644 --- a/libs/zlibng/compress.c +++ b/libs/zlibng/compress.c @@ -3,14 +3,12 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - #define ZLIB_INTERNAL #include "zbuild.h" #if defined(ZLIB_COMPAT) -# include "zlib.h" +# include "zlib.h" #else -# include "zlib-ng.h" +# include "zlib-ng.h" #endif /* =========================================================================== @@ -24,7 +22,7 @@ memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ -int ZEXPORT PREFIX(compress2)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, +int Z_EXPORT PREFIX(compress2)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t sourceLen, int level) { PREFIX3(stream) stream; int err; @@ -44,7 +42,7 @@ int ZEXPORT PREFIX(compress2)(unsigned char *dest, z_size_t *destLen, const unsi stream.next_out = dest; stream.avail_out = 0; - stream.next_in = (const unsigned char *)source; + stream.next_in = (z_const unsigned char *)source; stream.avail_in = 0; do { @@ -66,7 +64,7 @@ int ZEXPORT PREFIX(compress2)(unsigned char *dest, z_size_t *destLen, const unsi /* =========================================================================== */ -int ZEXPORT PREFIX(compress)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t sourceLen) { +int Z_EXPORT PREFIX(compress)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t sourceLen) { return PREFIX(compress2)(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } @@ -74,6 +72,12 @@ int ZEXPORT PREFIX(compress)(unsigned char *dest, z_size_t *destLen, const unsig If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ -z_size_t ZEXPORT PREFIX(compressBound)(z_size_t sourceLen) { +z_size_t Z_EXPORT PREFIX(compressBound)(z_size_t sourceLen) { +#ifndef NO_QUICK_STRATEGY + /* Quick deflate strategy worse case is 9 bits per literal, rounded to nearest byte, + plus the size of block & gzip headers and footers */ + return sourceLen + ((sourceLen + 13 + 7) >> 3) + 18; +#else return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; +#endif } diff --git a/libs/zlibng/configure b/libs/zlibng/configure index 5f50a33cb..171a76876 100644 --- a/libs/zlibng/configure +++ b/libs/zlibng/configure @@ -23,9 +23,11 @@ BUILDDIR=$(pwd) # set command prefix for cross-compilation if [ -n "${CHOST}" ]; then - uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" + # normalize the chost before parsing it + NORM_CHOST=$(sh "$SRCDIR"/tools/config.sub $CHOST) + uname="$(echo "${NORM_CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/')" CROSS_PREFIX="${CHOST}-" - ARCH="`echo "${CHOST}" | sed -e 's/-.*//'`" + ARCH="$(echo "${NORM_CHOST}" | sed -e 's/-.*//')" else ARCH="`uname -m`" fi @@ -68,8 +70,8 @@ fi # set defaults before processing command line options LDCONFIG=${LDCONFIG-"ldconfig"} -LDFLAGS=${LDFLAGS-"-L."} -LDSHAREDLIBC="${LDSHAREDLIBC--lc}" +LDFLAGS=${LDFLAGS} +LDSHAREDLIBC="${LDSHAREDLIBC}" DEFFILE= RC= RCFLAGS= @@ -85,7 +87,7 @@ includedir=${includedir-'${prefix}/include'} mandir=${mandir-'${prefix}/share/man'} shared_ext='.so' shared=1 -gzfileops=0 +gzfileops=1 compat=0 cover=0 build32=0 @@ -94,16 +96,19 @@ buildacle=1 buildneon=1 builddfltccdeflate=0 builddfltccinflate=0 -with_sanitizers=0 -with_msan=0 +with_sanitizer="" with_fuzzers=0 floatabi= native=0 forcesse2=0 +avx2flag="-mavx2" sse2flag="-msse2" +ssse3flag="-mssse3" sse4flag="-msse4" sse42flag="-msse4.2" pclmulflag="-mpclmul" +acleflag= +neonflag= without_optimizations=0 without_new_strategies=0 gcc=0 @@ -143,7 +148,7 @@ case "$1" in echo ' [--warn] Enables extra compiler warnings' | tee -a configure.log echo ' [--debug] Enables extra debug prints during operation' | tee -a configure.log echo ' [--zlib-compat] Compiles for zlib-compatible API instead of zlib-ng API' | tee -a configure.log - echo ' [--with-gzfileops] Compiles with the gzfile parts of the API enabled' | tee -a configure.log + echo ' [--without-gzfileops] Compiles with the gzfile parts of the API enabled' | tee -a configure.log echo ' [--without-optimizations] Compiles without support for optional instruction sets' | tee -a configure.log echo ' [--without-new-strategies] Compiles without using new additional deflate strategies' | tee -a configure.log echo ' [--without-acle] Compiles without ARM C Language Extensions' | tee -a configure.log @@ -151,9 +156,9 @@ case "$1" in echo ' [--with-dfltcc-deflate] Use DEFLATE CONVERSION CALL instruction for compression on IBM Z' | tee -a configure.log echo ' [--with-dfltcc-inflate] Use DEFLATE CONVERSION CALL instruction for decompression on IBM Z' | tee -a configure.log echo ' [--force-sse2] Assume SSE2 instructions are always available (disabled by default on x86, enabled on x86_64)' | tee -a configure.log - echo ' [--with-sanitizers] Build with address sanitizer and all supported sanitizers other than memory sanitizer (disabled by default)' | tee -a configure.log - echo ' [--with-msan] Build with memory sanitizer (disabled by default)' | tee -a configure.log + echo ' [--with-sanitizer] Build with sanitizer (memory, address, undefined)' | tee -a configure.log echo ' [--with-fuzzers] Build test/fuzz (disabled by default)' | tee -a configure.log + echo ' [--native] Compiles with full instruction set supported on this host' | tee -a configure.log exit 0 ;; -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; @@ -168,7 +173,7 @@ case "$1" in -s* | --shared | --enable-shared) shared=1; shift ;; -t | --static) shared=0; shift ;; --zlib-compat) compat=1; shift ;; - --with-gzfileops) gzfileops=1; shift ;; + --without-gzfileops) gzfileops=0; shift ;; --cover) cover=1; shift ;; -3* | --32) build32=1; shift ;; -6* | --64) build64=1; shift ;; @@ -185,8 +190,7 @@ case "$1" in -oldstrat | --without-new-strategies) without_new_strategies=1; shift;; -w* | --warn) warn=1; shift ;; -d* | --debug) debug=1; shift ;; - --with-sanitizers) with_sanitizers=1; shift ;; - --with-msan) with_msan=1; shift ;; + --with-sanitizer=*) with_sanitizer=`echo $1 | sed 's/.*=//'`; shift ;; --with-fuzzers) with_fuzzers=1; shift ;; *) @@ -325,6 +329,12 @@ if test "$gcc" -eq 1 && ($cc $CFLAGS -c $test.c) >> configure.log 2>&1; then else ARCH=native fi ;; + powerpc | ppc) + ARCH=powerpc ;; + powerpc64 | ppc64) + ARCH=powerpc64 ;; + powerpc64le | ppc64le) + ARCH=powerpc64le ;; esac CFLAGS="-O2 ${CFLAGS}" if test -n "${ARCHS}"; then @@ -332,13 +342,19 @@ if test "$gcc" -eq 1 && ($cc $CFLAGS -c $test.c) >> configure.log 2>&1; then LDFLAGS="${LDFLAGS} ${ARCHS}" fi CFLAGS="${CFLAGS} -Wall" - SFLAGS="-O2 ${CFLAGS} -fPIC" + SFLAGS="${CFLAGS} -fPIC" if test $native -eq 1; then - CFLAGS="${CFLAGS} -march=native" - SFLAGS="${SFLAGS} -march=native" + case $ARCH in + powerpc*) + NATIVE_FLAG="-mcpu=native" ;; + *) + NATIVE_FLAG="-march=native" ;; + esac + CFLAGS="${CFLAGS} ${NATIVE_FLAG}" + SFLAGS="${SFLAGS} ${NATIVE_FLAG}" fi if test "$warn" -eq 1; then - CFLAGS="${CFLAGS} -Wextra -Wpedantic" + CFLAGS="${CFLAGS} -Wextra -Wpedantic -Wno-implicit-fallthrough" fi if test $debug -eq 1; then CFLAGS="${CFLAGS} -DZLIB_DEBUG" @@ -350,10 +366,10 @@ if test "$gcc" -eq 1 && ($cc $CFLAGS -c $test.c) >> configure.log 2>&1; then case "$uname" in Linux* | linux* | GNU | GNU/* | solaris*) LDSHARED=${LDSHARED-"$cc"} - LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.1,--version-script,${SRCDIR}/${MAPNAME}" ;; + LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.${VER1},--version-script,${SRCDIR}/${MAPNAME}" ;; *BSD | *bsd* | DragonFly) LDSHARED=${LDSHARED-"$cc"} - LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.1,--version-script,${SRCDIR}/${MAPNAME}" + LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.${VER1},--version-script,${SRCDIR}/${MAPNAME}" LDCONFIG="ldconfig -m" ;; CYGWIN* | Cygwin* | cygwin*) ARFLAGS="rcs" @@ -429,7 +445,7 @@ if test "$gcc" -eq 1 && ($cc $CFLAGS -c $test.c) >> configure.log 2>&1; then QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 # (alain.bonnefoy@icbt.com) LDSHARED=${LDSHARED-"$cc"} - LDSHAREDFLAGS="-shared -Wl,-h${LIBNAME}.so.1" ;; + LDSHAREDFLAGS="-shared -Wl,-h${LIBNAME}.so.${VER1}" ;; HP-UX*) LDSHARED=${LDSHARED-"$cc"} LDSHAREDFLAGS="-shared" @@ -457,7 +473,7 @@ if test "$gcc" -eq 1 && ($cc $CFLAGS -c $test.c) >> configure.log 2>&1; then ARFLAGS="-o" ;; aarch64) LDSHARED=${LDSHARED-"$cc"} - LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.1 -Wl,--version-script,${SRCDIR}/${MAPNAME}" + LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.${VER1} -Wl,--version-script,${SRCDIR}/${MAPNAME}" LDSHAREDLIBC="-Wl,--start-group -lc -lrdimon -Wl,--end-group" ;; *) LDSHARED=${LDSHARED-"$cc"} @@ -555,14 +571,10 @@ fi echo >> configure.log -if test $with_sanitizers -eq 1; then - if test $with_msan -eq 1; then - echo "Error: --with-sanitizers and --with-msan cannot be used together" - exit 1 - fi - echo -n "Checking for sanitizers ASan/UBSan... " | tee -a configure.log +if test "$with_sanitizer" = "address"; then + echo -n "Checking for address sanitizer... " | tee -a configure.log sanitizers="" - for san in bool address array-bounds float-divide-by-zero function integer-divide-by-zero return shift signed-integer-overflow undefined unsigned-integer-overflow vla-bound vptr; do + for san in address pointer-compare pointer-subtract; do if try $CC -c $CFLAGS $test.c -fsanitize=$san ; then if test -n "$sanitizers"; then sanitizers="$sanitizers,$san" @@ -581,11 +593,21 @@ if test $with_sanitizers -eq 1; then echo No | tee -a configure.log fi + echo -n "Checking for leak sanitizer... " | tee -a configure.log + if try $CC -c $CFLAGS $test.c -fsanitize=leak; then + echo "-fsanitize=leak" | tee -a configure.log + CFLAGS="$CFLAGS -fsanitize=leak" + SFLAGS="$SFLAGS -fsanitize=leak" + LDFLAGS="$LDFLAGS -fsanitize=leak" + else + echo No | tee -a configure.log + fi + echo >> configure.log fi -if test $with_msan -eq 1; then - echo -n "Checking for MSan... " | tee -a configure.log +if test "$with_sanitizer" = "memory"; then + echo -n "Checking for memory sanitizer... " | tee -a configure.log if try $CC -c $CFLAGS $test.c -fsanitize=memory ; then echo "-fsanitize=memory" | tee -a configure.log CFLAGS="$CFLAGS -fsanitize=memory" @@ -598,6 +620,31 @@ if test $with_msan -eq 1; then echo >> configure.log fi +if test "$with_sanitizer" = "undefined"; then + echo -n "Checking for undefined behavior sanitizer... " | tee -a configure.log + sanitizers="" + for san in array-bounds bool bounds builtin enum float-cast-overflow float-divide-by-zero function integer-divide-by-zero local-bounds null nonnull-attribute object-size pointer-overflow return returns-nonnull-attribute shift shift-base shift-exponent signed-integer-overflow undefined unsigned-integer-overflow unsigned-shift-base vla-bound vptr; do + if try $CC -c $CFLAGS $test.c -fsanitize=$san; then + if test -n "$sanitizers"; then + sanitizers="$sanitizers,$san" + else + sanitizers="$san" + fi + fi + done + + if test -n "$sanitizers"; then + echo "-fsanitize=$sanitizers" | tee -a configure.log + CFLAGS="$CFLAGS -fsanitize=$sanitizers" + SFLAGS="$SFLAGS -fsanitize=$sanitizers" + LDFLAGS="$LDFLAGS -fsanitize=$sanitizers" + else + echo No | tee -a configure.log + fi + + echo >> configure.log +fi + # see if shared library build supported cat > $test.c < test.c + cat > $test.c <> configure.log 2>&1; then + echo "Checking for -no-semantic-interposition... Yes." | tee -a configure.log + SFLAGS="$SFLAGS -fno-semantic-interposition" +else + echo "Checking for -no-semantic-interposition... No." | tee -a configure.log +fi + # see if we can hide zlib internal symbols that are linked between separate source files using hidden if test "$gcc" -eq 1; then echo >> configure.log cat > $test.c <> configure.log echo "Checking for attribute(visibility(hidden)) support... Yes." | tee -a configure.log else @@ -836,13 +891,13 @@ fi if test "$gcc" -eq 1; then echo >> configure.log cat > $test.c <> configure.log echo "Checking for attribute(visibility(internal)) support... Yes." | tee -a configure.log else @@ -851,26 +906,43 @@ EOF fi fi -# Check for __builtin_ctzl() support in compiler +# Check for __builtin_ctz() support in compiler cat > $test.c << EOF int main(void) { unsigned int zero = 0; - long test = __builtin_ctzl(zero); + long test = __builtin_ctz(zero); (void)test; return 0; } EOF if try ${CC} ${CFLAGS} $test.c $LDSHAREDLIBC; then - echo "Checking for __builtin_ctzl ... Yes." | tee -a configure.log - CFLAGS="$CFLAGS -DHAVE_BUILTIN_CTZL" - SFLAGS="$SFLAGS -DHAVE_BUILTIN_CTZL" + echo "Checking for __builtin_ctz ... Yes." | tee -a configure.log + CFLAGS="$CFLAGS -DHAVE_BUILTIN_CTZ" + SFLAGS="$SFLAGS -DHAVE_BUILTIN_CTZ" else - echo "Checking for __builtin_ctzl ... No." | tee -a configure.log + echo "Checking for __builtin_ctz ... No." | tee -a configure.log +fi + +# Check for __builtin_ctzll() support in compiler +cat > $test.c << EOF +int main(void) { + unsigned long long zero = 0; + long test = __builtin_ctzll(zero); + (void)test; + return 0; +} +EOF +if try ${CC} ${CFLAGS} $test.c $LDSHAREDLIBC; then + echo "Checking for __builtin_ctzll ... Yes." | tee -a configure.log + CFLAGS="$CFLAGS -DHAVE_BUILTIN_CTZLL" + SFLAGS="$SFLAGS -DHAVE_BUILTIN_CTZLL" +else + echo "Checking for __builtin_ctzll ... No." | tee -a configure.log fi # Check for SSE2 intrinsics case "${ARCH}" in - i386 | i486 | i586 | i686) + i386 | i486 | i586 | i686 | x86_64) cat > $test.c << EOF #include int main(void) { @@ -889,6 +961,48 @@ EOF ;; esac +# Check for SSSE3 intrinsics + +cat > $test.c << EOF +#include +int main(void) +{ + __m128i u, v, w; + u = _mm_set1_epi32(1); + v = _mm_set1_epi32(2); + w = _mm_hadd_epi32(u, v); + (void)w; + return 0; +} +EOF +if try ${CC} ${CFLAGS} ${ssse3flag} $test.c; then + echo "Checking for SSSE3 intrinsics ... Yes." | tee -a configure.log + HAVE_SSSE3_INTRIN=1 +else + echo "Checking for SSSE3 intrinsics ... No." | tee -a configure.log + HAVE_SSSE3_INTRIN=0 +fi + +# Check for SSE4.2 CRC inline assembly +case "${ARCH}" in + i386 | i486 | i586 | i686 | x86_64) + cat > $test.c << EOF +int main(void) { + unsigned val = 0, h = 0; + __asm__ __volatile__ ( "crc32 %1,%0" : "+r" (h) : "r" (val) ); + return (int) h; +} +EOF + if try ${CC} ${CFLAGS} ${sse42flag} $test.c; then + echo "Checking for SSE4.2 CRC inline assembly ... Yes." | tee -a configure.log + HAVE_SSE42CRC_INLINE_ASM=1 + else + echo "Checking for SSE4.2 CRC inline assembly ... No." | tee -a configure.log + HAVE_SSE42CRC_INLINE_ASM=0 + fi + ;; +esac + # Check for SSE4.2 CRC intrinsics case "${ARCH}" in i386 | i486 | i586 | i686 | x86_64) @@ -911,6 +1025,31 @@ EOF ;; esac +# Check for SSE4.2 compare string intrinsics +case "${ARCH}" in + i386 | i486 | i586 | i686 | x86_64) + cat > $test.c << EOF +#include +int main(void) +{ + unsigned char a[64] = { 0 }; + unsigned char b[64] = { 0 }; + __m128i xmm_src0, xmm_src1; + xmm_src0 = _mm_loadu_si128((__m128i *)(char *)a); + xmm_src1 = _mm_loadu_si128((__m128i *)(char *)b); + return _mm_cmpestri(xmm_src0, 16, xmm_src1, 16, 0); +} +EOF + if try ${CC} ${CFLAGS} ${sse42flag} $test.c; then + echo "Checking for SSE4.2 compare string intrinsics ... Yes." | tee -a configure.log + HAVE_SSE42CMPSTR_INTRIN=1 + else + echo "Checking for SSE4.2 compare string intrinsics ... No." | tee -a configure.log + HAVE_SSE42CMPSTR_INTRIN=0 + fi + ;; +esac + # Check for PCLMULQDQ intrinsics case "${ARCH}" in i386 | i486 | i586 | i686 | x86_64) @@ -933,6 +1072,11 @@ EOF HAVE_PCLMULQDQ_INTRIN=0 fi + # Enable deflate_medium at level 1 + if test $without_new_strategies -eq 1; then + CFLAGS="${CFLAGS} -DNO_QUICK_STRATEGY" + SFLAGS="${SFLAGS} -DNO_QUICK_STRATEGY" + fi # Enable deflate_medium at level 4-6 if test $without_new_strategies -eq 1; then CFLAGS="${CFLAGS} -DNO_MEDIUM_STRATEGY" @@ -941,6 +1085,30 @@ EOF ;; esac +# Check for AVX2 intrinsics +case "${ARCH}" in + i386 | i486 | i586 | i686 | x86_64) + cat > $test.c << EOF +#include +int main(void) { + __m256i x = _mm256_set1_epi16(2); + const __m256i y = _mm256_set1_epi16(1); + x = _mm256_subs_epu16(x, y); + (void)x; + return 0; +} +EOF + if try ${CC} ${CFLAGS} ${avx2flag} $test.c; then + echo "Checking for AVX2 intrinsics ... Yes." | tee -a configure.log + HAVE_AVX2_INTRIN=1 + else + echo "Checking for AVX2 intrinsics ... No." | tee -a configure.log + HAVE_AVX2_INTRIN=0 + fi + ;; +esac + + # Check whether -mfpu=neon is available on ARM processors. case "${ARCH}" in arm*) @@ -957,6 +1125,22 @@ EOF ;; esac +# Check whether features needed by POWER optimisations are available +case "${ARCH}" in + powerpc*) + cat > $test.c << EOF +#include +int main() { return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07); } +EOF + if try $CC -c $CFLAGS -mcpu=power8 $test.c; then + HAVE_POWER8=1 + echo "Check whether POWER8 instructions are available ... Yes." | tee -a configure.log + else + HAVE_POWER8=0 + echo "Check whether POWER8 instructions are available ... No." | tee -a configure.log + fi +esac + # Check whether sys/sdt.h is available cat > $test.c << EOF #include @@ -976,81 +1160,66 @@ ARCH_SHARED_OBJS='' # Set ARCH specific FLAGS case "${ARCH}" in - # x86 specific optimizations - i386 | i486 | i586 | i686) + # x86/amd64 specific optimizations + i386 | i486 | i586 | i686 |x86_64) ARCHDIR=arch/x86 - CFLAGS="${CFLAGS} -DUNALIGNED_OK" - SFLAGS="${SFLAGS} -DUNALIGNED_OK" + CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" + SFLAGS="${SFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" - # Enable arch-specific optimizations? + # Enable arch-specific optimizations if test $without_optimizations -eq 0; then - CFLAGS="${CFLAGS} -DX86_CPUID" - SFLAGS="${SFLAGS} -DX86_CPUID" + CFLAGS="${CFLAGS} -DX86_FEATURES" + SFLAGS="${SFLAGS} -DX86_FEATURES" ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} x86.o" ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} x86.lo" + if test ${HAVE_AVX2_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32 -DX86_AVX_CHUNKSET" + SFLAGS="${SFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32 -DX86_AVX_CHUNKSET" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} slide_avx.o chunkset_avx.o compare258_avx.o adler32_avx.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} slide_avx.lo chunkset_avx.lo compare258_avx.lo adler32_avx.lo" + fi + + if test ${HAVE_SSE42CRC_INTRIN} -eq 1 || test ${HAVE_SSE42CRC_INLINE_ASM} -eq 1; then + CFLAGS="${CFLAGS} -DX86_SSE42_CRC_HASH" + SFLAGS="${SFLAGS} -DX86_SSE42_CRC_HASH" + + if test ${HAVE_SSE42CRC_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_SSE42_CRC_INTRIN" + SFLAGS="${SFLAGS} -DX86_SSE42_CRC_INTRIN" + fi + + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} insert_string_sse.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} insert_string_sse.lo" + fi + + if test ${HAVE_SSE42CMPSTR_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_SSE42_CMP_STR" + SFLAGS="${SFLAGS} -DX86_SSE42_CMP_STR" + + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare258_sse.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare258_sse.lo" + fi + if test ${HAVE_SSE2_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE2" - SFLAGS="${SFLAGS} -DX86_SSE2" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} fill_window_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} fill_window_sse.lo" + CFLAGS="${CFLAGS} -DX86_SSE2 -DX86_SSE2_CHUNKSET" + SFLAGS="${SFLAGS} -DX86_SSE2 -DX86_SSE2_CHUNKSET" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} chunkset_sse.o slide_sse.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} chunkset_sse.lo slide_sse.lo" if test $forcesse2 -eq 1; then CFLAGS="${CFLAGS} -DX86_NOCHECK_SSE2" SFLAGS="${SFLAGS} -DX86_NOCHECK_SSE2" fi - - # Enable deflate_quick at level 1? - # requires SSE2: code uses fill_window_sse - if test $without_new_strategies -eq 0; then - CFLAGS="${CFLAGS} -DX86_QUICK_STRATEGY" - SFLAGS="${SFLAGS} -DX86_QUICK_STRATEGY" - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} deflate_quick.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} deflate_quick.lo" - fi fi - if test ${HAVE_SSE42CRC_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE4_2_CRC_INTRIN" - SFLAGS="${SFLAGS} -DX86_SSE4_2_CRC_INTRIN" - fi - - CFLAGS="${CFLAGS} -DX86_SSE4_2_CRC_HASH" - SFLAGS="${SFLAGS} -DX86_SSE4_2_CRC_HASH" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} insert_string_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} insert_string_sse.lo" - - if test ${HAVE_PCLMULQDQ_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_PCLMULQDQ_CRC" - SFLAGS="${SFLAGS} -DX86_PCLMULQDQ_CRC" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc_folding.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc_folding.lo" - fi - - fi - ;; - - # x86_64 specific optimizations - x86_64) - ARCHDIR=arch/x86 - - CFLAGS="${CFLAGS} -DUNALIGNED_OK" - SFLAGS="${SFLAGS} -DUNALIGNED_OK" - - # Enable arch-specific optimizations? - if test $without_optimizations -eq 0; then - CFLAGS="${CFLAGS} -DX86_CPUID -DX86_SSE2 -DX86_SSE4_2_CRC_HASH" - SFLAGS="${SFLAGS} -DX86_CPUID -DX86_SSE2 -DX86_SSE4_2_CRC_HASH" - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} x86.o fill_window_sse.o insert_string_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} x86.lo fill_window_sse.lo insert_string_sse.lo" - - if test ${HAVE_SSE42CRC_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE4_2_CRC_INTRIN" - SFLAGS="${SFLAGS} -DX86_SSE4_2_CRC_INTRIN" + if test ${HAVE_SSSE3_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_SSSE3 -DX86_SSSE3_ADLER32" + SFLAGS="${SFLAGS} -DX86_SSSE3 -DX86_SSSE3_ADLER32" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_ssse3.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_ssse3.lo" fi if test ${HAVE_PCLMULQDQ_INTRIN} -eq 1; then @@ -1059,24 +1228,20 @@ case "${ARCH}" in ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc_folding.o" ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc_folding.lo" fi - - # Enable deflate_quick at level 1? - if test $without_new_strategies -eq 0; then - CFLAGS="${CFLAGS} -DX86_QUICK_STRATEGY" - SFLAGS="${SFLAGS} -DX86_QUICK_STRATEGY" - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} deflate_quick.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} deflate_quick.lo" - fi fi ;; # ARM specific optimizations - arm | armv[3467]l | armv4b | armv4tl | armv5tel | armv5tejl | armv[67]hl | armv7hnl | armv[78]-a | armv8-a+* | armv8.[1234]-a | armv8.[1234]-a+*) + arm*) [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=arm ARCHDIR=arch/arm - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} armfeature.o fill_window_arm.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} armfeature.lo fill_window_arm.lo" + + if test $without_optimizations -eq 0; then + CFLAGS="${CFLAGS} -DARM_FEATURES" + SFLAGS="${SFLAGS} -DARM_FEATURES" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} armfeature.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} armfeature.lo" + fi GCC_MACHINE=$(${CC} -dumpmachine) case "${GCC_MACHINE}" in @@ -1085,90 +1250,103 @@ case "${ARCH}" in *gnueabi) floatabi="-mfloat-abi=softfp" ;; esac + CFLAGS="${CFLAGS} ${floatabi}" + SFLAGS="${SFLAGS} ${floatabi}" case "${ARCH}" in armv[345]*) - if test $buildacle -eq 1; then - echo ACLE support not available - fi + if test $without_optimizations -eq 0; then + if test $buildacle -eq 1; then + echo ACLE support not available + fi - if test $buildneon -eq 1; then - echo NEON support not available + if test $buildneon -eq 1; then + echo NEON support not available + fi fi ;; armv6l | armv6hl) CFLAGS="${CFLAGS} -DUNALIGNED_OK" SFLAGS="${SFLAGS} -DUNALIGNED_OK" - if test $buildacle -eq 1; then - echo ACLE support not available - fi + if test $without_optimizations -eq 0; then + if test $buildacle -eq 1; then + echo ACLE support not available + fi - if test $buildneon -eq 1; then - echo NEON support not available + if test $buildneon -eq 1; then + echo NEON support not available + fi fi ;; arm | armv7*) CFLAGS="${CFLAGS} -DUNALIGNED_OK" SFLAGS="${SFLAGS} -DUNALIGNED_OK" - if test $buildacle -eq 1; then - echo ACLE support not available - fi + if test $without_optimizations -eq 0; then + if test $buildacle -eq 1; then + echo ACLE support not available + fi - if test $buildneon -eq 1; then - CFLAGS="${CFLAGS} ${floatabi} -mfpu=neon -DARM_NEON_ADLER32" - SFLAGS="${SFLAGS} ${floatabi} -mfpu=neon -DARM_NEON_ADLER32" + if test $buildneon -eq 1; then + if test $MFPU_NEON_AVAILABLE -eq 1;then + neonflag="-mfpu=neon" + fi - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo" + CFLAGS="${CFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + SFLAGS="${SFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o chunkset_neon.o slide_neon.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo chunkset_neon.lo slide_neon.lo" + fi fi ;; armv8-a | armv8-a+simd) - CFLAGS="${CFLAGS} -DUNALIGNED_OK" - SFLAGS="${SFLAGS} -DUNALIGNED_OK" + CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" + SFLAGS="${SFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" - if test $buildacle -eq 1; then - echo ACLE support not available - fi - - if test $buildneon -eq 1; then - CFLAGS="${CFLAGS} ${floatabi}" - SFLAGS="${SFLAGS} ${floatabi}" - - if test $MFPU_NEON_AVAILABLE -eq 1;then - CFLAGS="${CFLAGS} -mfpu=neon" - SFLAGS="${SFLAGS} -mfpu=neon" + if test $without_optimizations -eq 0; then + if test $buildacle -eq 1; then + echo ACLE support not available fi - CFLAGS="${CFLAGS} -DARM_NEON_ADLER32" - SFLAGS="${SFLAGS} -DARM_NEON_ADLER32" + if test $buildneon -eq 1; then + if test $MFPU_NEON_AVAILABLE -eq 1;then + neonflag="-mfpu=neon" + fi - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo" + CFLAGS="${CFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + SFLAGS="${SFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o chunkset_neon.o slide_neon.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo chunkset_neon.lo slide_neon.lo" + fi fi ;; armv8-a+crc | armv8-a+crc+simd | armv8.[1234]-a | armv8.[1234]-a+simd) - CFLAGS="-march=${ARCH} ${CFLAGS} -DARM_ACLE_CRC_HASH -DUNALIGNED_OK" - SFLAGS="-march=${ARCH} ${SFLAGS} -DARM_ACLE_CRC_HASH -DUNALIGNED_OK" + CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" + SFLAGS="${SFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo" + acleflag="-march=${ARCH}" - if test $buildneon -eq 1; then - CFLAGS="${CFLAGS} ${floatabi}" - SFLAGS="${SFLAGS} ${floatabi}" + if test $without_optimizations -eq 0; then + CFLAGS="${CFLAGS} -DARM_ACLE_CRC_HASH" + SFLAGS="${SFLAGS} -DARM_ACLE_CRC_HASH" - if test $MFPU_NEON_AVAILABLE -eq 1;then - CFLAGS="${CFLAGS} -mfpu=neon" - SFLAGS="${SFLAGS} -mfpu=neon" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo" + + if test $buildneon -eq 1; then + if test $MFPU_NEON_AVAILABLE -eq 1;then + neonflag="-mfpu=neon" + fi + + CFLAGS="${CFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + SFLAGS="${SFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o chunkset_neon.o slide_neon.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo chunkset_neon.lo slide_neon.lo" fi - - CFLAGS="${CFLAGS} -DARM_NEON_ADLER32" - SFLAGS="${SFLAGS} -DARM_NEON_ADLER32" - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo" fi ;; esac @@ -1178,61 +1356,98 @@ case "${ARCH}" in aarch64) [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=aarch64 ARCHDIR=arch/arm - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} armfeature.o fill_window_arm.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} armfeature.lo fill_window_arm.lo" if test $native -eq 0; then - ARCH="armv8-a" + ARCH="armv8-a" else - ARCH="native" + ARCH="native" fi - if test $buildacle -eq 1; then - if test $native -eq 0; then - ARCH="${ARCH}+crc" - fi - CFLAGS="${CFLAGS} -DARM_ACLE_CRC_HASH" - SFLAGS="${SFLAGS} -DARM_ACLE_CRC_HASH" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo" - fi - if test $buildneon -eq 1; then - if test $native -eq 0; then - ARCH="${ARCH}+simd" + + if test $without_optimizations -eq 0; then + CFLAGS="${CFLAGS} -DARM_FEATURES" + SFLAGS="${SFLAGS} -DARM_FEATURES" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} armfeature.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} armfeature.lo" + + if test $buildacle -eq 1; then + if test $native -eq 0; then + ARCH="${ARCH}+crc" + fi + CFLAGS="${CFLAGS} -DARM_ACLE_CRC_HASH" + SFLAGS="${SFLAGS} -DARM_ACLE_CRC_HASH" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo" + fi + + if test $buildneon -eq 1; then + if test $native -eq 0; then + ARCH="${ARCH}+simd" + fi + CFLAGS="${CFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + SFLAGS="${SFLAGS} -DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o chunkset_neon.o slide_neon.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo chunkset_neon.lo slide_neon.lo" fi - CFLAGS="${CFLAGS} -DARM_NEON_ADLER32" - SFLAGS="${SFLAGS} -DARM_NEON_ADLER32" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo" fi - CFLAGS="-march=${ARCH} ${CFLAGS} -DUNALIGNED_OK" - SFLAGS="-march=${ARCH} ${SFLAGS} -DUNALIGNED_OK" + + neonflag="-march=${ARCH}" + acleflag="-march=${ARCH}" + + CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" + SFLAGS="${SFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" ;; - powerpc) - [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc - ;; - powerpc64) - [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc64 + powerpc*) + case "${ARCH}" in + powerpc) + [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc + ;; + powerpc64) + [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc64 + ;; + powerpc64le) + [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc64le + CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" + SFLAGS="${SFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" + ;; + esac + + ARCHDIR=arch/power + + if test $without_optimizations -eq 0; then + if test $HAVE_POWER8 -eq 1; then + CFLAGS="${CFLAGS} -DPOWER8 -DPOWER_FEATURES -DPOWER8_VSX_ADLER32 -DPOWER8_VSX_SLIDEHASH" + SFLAGS="${SFLAGS} -DPOWER8 -DPOWER_FEATURES -DPOWER8_VSX_ADLER32 -DPOWER8_VSX_SLIDEHASH" + + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} power.o adler32_power8.o slide_hash_power8.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} power.lo adler32_power8.lo slide_hash_power8.lo" + fi + fi ;; s390x) [ ! -z $CROSS_PREFIX ] && QEMU_ARCH=s390x ARCHDIR=arch/s390 - if test $builddfltccdeflate -eq 1 -o $builddfltccinflate -eq 1; then - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_common.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_common.lo" - fi - if test $builddfltccdeflate -eq 1; then - CFLAGS="${CFLAGS} -DS390_DFLTCC_DEFLATE" - SFLAGS="${SFLAGS} -DS390_DFLTCC_DEFLATE" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_deflate.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_deflate.lo" - ARCH="${ARCH}+dfltcc-deflate" - fi - if test $builddfltccinflate -eq 1; then - CFLAGS="${CFLAGS} -DS390_DFLTCC_INFLATE" - SFLAGS="${SFLAGS} -DS390_DFLTCC_INFLATE" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_inflate.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_inflate.lo" - ARCH="${ARCH}+dfltcc-inflate" + + if test $without_optimizations -eq 0; then + if test $builddfltccdeflate -eq 1 -o $builddfltccinflate -eq 1; then + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_common.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_common.lo" + fi + + if test $builddfltccdeflate -eq 1; then + CFLAGS="${CFLAGS} -DS390_DFLTCC_DEFLATE" + SFLAGS="${SFLAGS} -DS390_DFLTCC_DEFLATE" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_deflate.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_deflate.lo" + ARCH="${ARCH}+dfltcc-deflate" + fi + + if test $builddfltccinflate -eq 1; then + CFLAGS="${CFLAGS} -DS390_DFLTCC_INFLATE" + SFLAGS="${SFLAGS} -DS390_DFLTCC_INFLATE" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_inflate.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_inflate.lo" + ARCH="${ARCH}+dfltcc-inflate" + fi fi ;; *) @@ -1286,12 +1501,24 @@ echo prefix = $prefix >> configure.log echo sharedlibdir = $sharedlibdir >> configure.log echo uname = $uname >> configure.log echo sse2flag = $sse2flag >> configure.log +echo ssse3flag = $ssse3flag >> configure.log echo sse4flag = $sse4flag >> configure.log echo pclmulflag = $pclmulflag >> configure.log +echo acleflag = $acleflag >> configure.log +echo neonflag = $neonflag >> configure.log echo ARCHDIR = ${ARCHDIR} >> configure.log echo ARCH_STATIC_OBJS = ${ARCH_STATIC_OBJS} >> configure.log echo ARCH_SHARED_OBJS = ${ARCH_SHARED_OBJS} >> configure.log +# Handle sed incompatibilities when using -i +replace_in_file() { + if [ "$OS" = 'Darwin' ]; then + sed -i '.tmp' -e "$1" "$2" + else + sed -i'.tmp' -e "$1" "$2" + fi +} + # update Makefile with the configure results INCLUDES="-I$SRCDIR" @@ -1347,7 +1574,7 @@ sed < $SRCDIR/Makefile.in " " > Makefile # Append header files dependences. -for file in $(ls -1 $SRCDIR/*.c $SRCDIR/test/*.c $SRCDIR/test/fuzz/*.c $SRCDIR/$ARCHDIR/*.c); do +for file in $(ls -1 $SRCDIR/*.c $SRCDIR/test/*.c $SRCDIR/test/fuzz/*.c $SRCDIR/$ARCHDIR/*.c $SRCDIR/tools/*.c); do short_name=$(echo $file | sed -e "s#$SRCDIR/##g") incs=$(grep -h include $file | sed -n 's/# *\include *"\(.*\.h\)".*/\1/p' | sort | uniq) includes=$(for i in $incs; do @@ -1366,17 +1593,7 @@ for file in $(ls -1 $SRCDIR/*.c $SRCDIR/test/*.c $SRCDIR/test/fuzz/*.c $SRCDIR/$ if grep -q "^$obj:" Makefile; then # Replace the existing line with a line with all dependences. - sed -i "s#$obj:.*#$obj: \$(SRCDIR)/$short_name $includes#g" Makefile - - # Special case example64 and minigzip64. - case "$obj" in - example.o) - sed -i "s#example64.o:.*#example64.o: \$(SRCDIR)/$short_name $includes#g" Makefile - ;; - minigzip.o) - sed -i "s#minigzip64.o:.*#minigzip64.o: \$(SRCDIR)/$short_name $includes#g" Makefile - ;; - esac + $(replace_in_file "s#$obj:.*#$obj: \$(SRCDIR)/$short_name $includes#g" Makefile) else # Append at the end of Makefile a new line with the header dependences. echo "$obj: \$(SRCDIR)/$short_name $includes" >> Makefile @@ -1391,7 +1608,7 @@ for file in $(ls -1 $SRCDIR/*.c $SRCDIR/test/*.c $SRCDIR/test/fuzz/*.c $SRCDIR/$ if grep -q "^$lobj:" Makefile; then # Replace the existing line with a line with all dependences. - sed -i "s#$lobj:.*#$lobj: \$(SRCDIR)/$short_name $includes#g" Makefile + $(replace_in_file "s#$lobj:.*#$lobj: \$(SRCDIR)/$short_name $includes#g" Makefile) else # Append at the end of Makefile a new line with the header dependences. echo "$lobj: \$(SRCDIR)/$short_name $includes" >> Makefile @@ -1414,9 +1631,13 @@ sed < $SRCDIR/$ARCHDIR/Makefile.in " /^SRCDIR *=/s#=.*#=$SRCDIR/$ARCHDIR# /^SRCTOP *=/s#=.*#=$SRCDIR# /^TOPDIR *=/s#=.*#=$BUILDDIR# +/^AVX2FLAG *=/s#=.*#=$avx2flag# /^SSE2FLAG *=/s#=.*#=$sse2flag# +/^SSSE3FLAG *=/s#=.*#=$ssse3flag# /^SSE4FLAG *=/s#=.*#=$sse4flag# /^PCLMULFLAG *=/s#=.*#=$pclmulflag# +/^ACLEFLAG *=/s#=.*#=$acleflag# +/^NEONFLAG *=/s#=.*#=$neonflag# " > $ARCHDIR/Makefile # Append header files dependences. @@ -1438,7 +1659,7 @@ for file in $(ls -1 $SRCDIR/$ARCHDIR/*.c); do short_name=$(basename $file) if grep -q "^$obj:" $ARCHDIR/Makefile; then # Replace the existing line with a line with all dependences. - sed -i "s#$obj:.*#$obj: \$(SRCDIR)/$short_name $includes#g" $ARCHDIR/Makefile + $(replace_in_file "s#$obj:.*#$obj: \$(SRCDIR)/$short_name $includes#g" $ARCHDIR/Makefile) else # Append at the end of Makefile a new line with the header dependences. echo "$obj: \$(SRCDIR)/$short_name $includes" >> $ARCHDIR/Makefile @@ -1446,7 +1667,7 @@ for file in $(ls -1 $SRCDIR/$ARCHDIR/*.c); do if grep -q "^$lobj:" $ARCHDIR/Makefile; then # Replace the existing line with a line with all dependences. - sed -i "s#$lobj:.*#$lobj: \$(SRCDIR)/$short_name $includes#g" $ARCHDIR/Makefile + $(replace_in_file "s#$lobj:.*#$lobj: \$(SRCDIR)/$short_name $includes#g" $ARCHDIR/Makefile) else # Append at the end of Makefile a new line with the header dependences. echo "$lobj: \$(SRCDIR)/$short_name $includes" >> $ARCHDIR/Makefile @@ -1468,6 +1689,7 @@ sed < $SRCDIR/test/Makefile.in " /^COMPATTESTS *=/s#=.*#=$COMPATTESTS# /^QEMU_RUN *=/s#=.*#=$QEMU_RUN# /^WITH_FUZZERS *=/s#=.*#=$with_fuzzers# +/^LIBNAME *=/s#=.*#=$LIBNAME# " > test/Makefile # create zlib.pc with the configure results diff --git a/libs/zlibng/crc32.c b/libs/zlibng/crc32.c index 6c495a57a..4b488e617 100644 --- a/libs/zlibng/crc32.c +++ b/libs/zlibng/crc32.c @@ -9,251 +9,40 @@ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ -/* @(#) $Id$ */ - -# include "zbuild.h" -# include "gzendian.h" -# include - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. A main() - routine is also produced, so that this one source file can be compiled to an - executable. - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - +#include "zbuild.h" +#include "zendian.h" +#include #include "deflate.h" #include "functable.h" - - -/* Local functions for crc concatenation */ -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ -static uint32_t gf2_matrix_times(const uint32_t *mat, uint32_t vec); -static uint32_t crc32_combine_(uint32_t crc1, uint32_t crc2, z_off64_t len2); -static void crc32_combine_gen_(uint32_t *op, z_off64_t len2); - -/* ========================================================================= */ -static uint32_t gf2_matrix_times(const uint32_t *mat, uint32_t vec) { - uint32_t sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -#ifdef DYNAMIC_CRC_TABLE -volatile int crc_table_empty = 1; -static uint32_t crc_table[8][256]; -static uint32_t crc_comb[GF2_DIM][GF2_DIM]; -void make_crc_table(void); -static void gf2_matrix_square(uint32_t *square, const uint32_t *mat); -#ifdef MAKECRCH -static void write_table(FILE *, const uint32_t *, int); -#endif /* MAKECRCH */ - -/* ========================================================================= */ -static void gf2_matrix_square(uint32_t *square, const uint32_t *mat) { - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -void make_crc_table() { - uint32_t c; - int n, k; - uint32_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (uint32_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (uint32_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } - - /* generate zero operators table for crc32_combine() */ - - /* generate the operator to apply a single zero bit to a CRC -- the - first row adds the polynomial if the low bit is a 1, and the - remaining rows shift the CRC right one bit */ - k = GF2_DIM - 3; - crc_comb[k][0] = 0xedb88320UL; /* CRC-32 polynomial */ - uint32_t row = 1; - for (n = 1; n < GF2_DIM; n++) { - crc_comb[k][n] = row; - row <<= 1; - } - - /* generate operators that apply 2, 4, and 8 zeros to a CRC, putting - the last one, the operator for one zero byte, at the 0 position */ - gf2_matrix_square(crc_comb[k + 1], crc_comb[k]); - gf2_matrix_square(crc_comb[k + 2], crc_comb[k + 1]); - gf2_matrix_square(crc_comb[0], crc_comb[k + 2]); - - /* generate operators for applying 2^n zero bytes to a CRC, filling out - the remainder of the table -- the operators repeat after GF2_DIM - values of n, so the table only needs GF2_DIM entries, regardless of - the size of the length being processed */ - for (n = 1; n < k; n++) - gf2_matrix_square(crc_comb[n], crc_comb[n - 1]); - - /* mark tables as complete, in case someone else is waiting */ - crc_table_empty = 0; - } else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - {} - } -#ifdef MAKECRCH - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - - /* write out CRC table to crc32.h */ - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "static const uint32_t "); - fprintf(out, "crc_table[8][256] =\n{\n {\n"); - write_table(out, crc_table[0], 256); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k], 256); - } - fprintf(out, " }\n};\n"); - - /* write out zero operator table to crc32.h */ - fprintf(out, "\nstatic const uint32_t "); - fprintf(out, "crc_comb[%d][%d] =\n{\n {\n", GF2_DIM, GF2_DIM); - write_table(out, crc_comb[0], GF2_DIM); - for (k = 1; k < GF2_DIM; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_comb[k], GF2_DIM); - } - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -static void write_table(FILE *out, const uint32_t *table, int k) { - int n; - - for (n = 0; n < k; n++) - fprintf(out, "%s0x%08" PRIx32 "%s", n % 5 ? "" : " ", - (uint32_t)(table[n]), - n == k - 1 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} - -int main() -{ - make_crc_table(); - return 0; -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(), - * and tables of zero operator matrices for crc32_combine(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ +#include "crc32_tbl.h" /* ========================================================================= * This function can be used by asm versions of crc32() */ -const uint32_t * ZEXPORT PREFIX(get_crc_table)(void) { -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ +const uint32_t * Z_EXPORT PREFIX(get_crc_table)(void) { return (const uint32_t *)crc_table; } -uint32_t ZEXPORT PREFIX(crc32_z)(uint32_t crc, const unsigned char *buf, size_t len) { +#ifdef ZLIB_COMPAT +unsigned long Z_EXPORT PREFIX(crc32_z)(unsigned long crc, const unsigned char *buf, size_t len) { + if (buf == NULL) return 0; + + return (unsigned long)functable.crc32((uint32_t)crc, buf, len); +} +#else +uint32_t Z_EXPORT PREFIX(crc32_z)(uint32_t crc, const unsigned char *buf, size_t len) { if (buf == NULL) return 0; return functable.crc32(crc, buf, len); } +#endif /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 #define DO4 DO1; DO1; DO1; DO1 /* ========================================================================= */ -ZLIB_INTERNAL uint32_t crc32_generic(uint32_t crc, const unsigned char *buf, uint64_t len) -{ +Z_INTERNAL uint32_t crc32_generic(uint32_t crc, const unsigned char *buf, uint64_t len) { crc = crc ^ 0xffffffff; #ifdef UNROLL_MORE @@ -274,9 +63,15 @@ ZLIB_INTERNAL uint32_t crc32_generic(uint32_t crc, const unsigned char *buf, uin return crc ^ 0xffffffff; } -uint32_t ZEXPORT PREFIX(crc32)(uint32_t crc, const unsigned char *buf, uint32_t len) { +#ifdef ZLIB_COMPAT +unsigned long Z_EXPORT PREFIX(crc32)(unsigned long crc, const unsigned char *buf, unsigned int len) { + return (unsigned long)PREFIX(crc32_z)((uint32_t)crc, buf, len); +} +#else +uint32_t Z_EXPORT PREFIX(crc32)(uint32_t crc, const unsigned char *buf, uint32_t len) { return PREFIX(crc32_z)(crc, buf, len); } +#endif /* This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit @@ -298,9 +93,9 @@ uint32_t ZEXPORT PREFIX(crc32)(uint32_t crc, const unsigned char *buf, uint32_t #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ -ZLIB_INTERNAL uint32_t crc32_little(uint32_t crc, const unsigned char *buf, uint64_t len) { - register uint32_t c; - register const uint32_t *buf4; +Z_INTERNAL uint32_t crc32_little(uint32_t crc, const unsigned char *buf, uint64_t len) { + Z_REGISTER uint32_t c; + Z_REGISTER const uint32_t *buf4; c = crc; c = ~c; @@ -340,9 +135,9 @@ ZLIB_INTERNAL uint32_t crc32_little(uint32_t crc, const unsigned char *buf, uint #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ -ZLIB_INTERNAL uint32_t crc32_big(uint32_t crc, const unsigned char *buf, uint64_t len) { - register uint32_t c; - register const uint32_t *buf4; +Z_INTERNAL uint32_t crc32_big(uint32_t crc, const unsigned char *buf, uint64_t len) { + Z_REGISTER uint32_t c; + Z_REGISTER const uint32_t *buf4; c = ZSWAP32(crc); c = ~c; @@ -374,45 +169,19 @@ ZLIB_INTERNAL uint32_t crc32_big(uint32_t crc, const unsigned char *buf, uint64_ } #endif /* BYTE_ORDER == BIG_ENDIAN */ - -/* ========================================================================= */ -static uint32_t crc32_combine_(uint32_t crc1, uint32_t crc2, z_off64_t len2) { - int n; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - - if (len2 > 0) - /* operator for 2^n zeros repeats every GF2_DIM n values */ - for (n = 0; len2; n = (n + 1) % GF2_DIM, len2 >>= 1) - if (len2 & 1) - crc1 = gf2_matrix_times(crc_comb[n], crc1); - return crc1 ^ crc2; -} - -/* ========================================================================= */ -uint32_t ZEXPORT PREFIX(crc32_combine)(uint32_t crc1, uint32_t crc2, z_off_t len2) { - return crc32_combine_(crc1, crc2, len2); -} - -uint32_t ZEXPORT PREFIX(crc32_combine64)(uint32_t crc1, uint32_t crc2, z_off64_t len2) { - return crc32_combine_(crc1, crc2, len2); -} - #ifdef X86_PCLMULQDQ_CRC #include "arch/x86/x86.h" #include "arch/x86/crc_folding.h" -ZLIB_INTERNAL void crc_finalize(deflate_state *const s) { +Z_INTERNAL void crc_finalize(deflate_state *const s) { if (x86_cpu_has_pclmulqdq) s->strm->adler = crc_fold_512to32(s); } #endif -ZLIB_INTERNAL void crc_reset(deflate_state *const s) { +Z_INTERNAL void crc_reset(deflate_state *const s) { #ifdef X86_PCLMULQDQ_CRC + x86_check_features(); if (x86_cpu_has_pclmulqdq) { crc_fold_init(s); return; @@ -421,7 +190,7 @@ ZLIB_INTERNAL void crc_reset(deflate_state *const s) { s->strm->adler = PREFIX(crc32)(0L, NULL, 0); } -ZLIB_INTERNAL void copy_with_crc(PREFIX3(stream) *strm, unsigned char *dst, unsigned long size) { +Z_INTERNAL void copy_with_crc(PREFIX3(stream) *strm, unsigned char *dst, unsigned long size) { #ifdef X86_PCLMULQDQ_CRC if (x86_cpu_has_pclmulqdq) { crc_fold_copy(strm->state, dst, strm->next_in, size); @@ -431,68 +200,3 @@ ZLIB_INTERNAL void copy_with_crc(PREFIX3(stream) *strm, unsigned char *dst, unsi memcpy(dst, strm->next_in, size); strm->adler = PREFIX(crc32)(strm->adler, dst, size); } - -/* ========================================================================= */ -static void crc32_combine_gen_(uint32_t *op, z_off64_t len2) -{ - uint32_t row; - int j; - unsigned i; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - - /* if len2 is zero or negative, return the identity matrix */ - if (len2 <= 0) { - row = 1; - for (j = 0; j < GF2_DIM; j++) { - op[j] = row; - row <<= 1; - } - return; - } - - /* at least one bit in len2 is set -- find it, and copy the operator - corresponding to that position into op */ - i = 0; - for (;;) { - if (len2 & 1) { - for (j = 0; j < GF2_DIM; j++) - op[j] = crc_comb[i][j]; - break; - } - len2 >>= 1; - i = (i + 1) % GF2_DIM; - } - - /* for each remaining bit set in len2 (if any), multiply op by the operator - corresponding to that position */ - for (;;) { - len2 >>= 1; - i = (i + 1) % GF2_DIM; - if (len2 == 0) - break; - if (len2 & 1) - for (j = 0; j < GF2_DIM; j++) - op[j] = gf2_matrix_times(crc_comb[i], op[j]); - } -} - -/* ========================================================================= */ -void ZEXPORT PREFIX(crc32_combine_gen)(uint32_t *op, z_off_t len2) -{ - crc32_combine_gen_(op, len2); -} - -void ZEXPORT PREFIX(crc32_combine_gen64)(uint32_t *op, z_off64_t len2) -{ - crc32_combine_gen_(op, len2); -} - -/* ========================================================================= */ -uint32_t ZEXPORT PREFIX(crc32_combine_op)(uint32_t crc1, uint32_t crc2, const uint32_t *op) -{ - return gf2_matrix_times(op, crc1) ^ crc2; -} diff --git a/libs/zlibng/crc32_comb.c b/libs/zlibng/crc32_comb.c new file mode 100644 index 000000000..092c595d9 --- /dev/null +++ b/libs/zlibng/crc32_comb.c @@ -0,0 +1,108 @@ +/* crc32_comb.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016, 2018 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +#include "zbuild.h" +#include +#include "deflate.h" +#include "crc32_p.h" +#include "crc32_comb_tbl.h" + + +/* Local functions for crc concatenation */ +static uint32_t crc32_combine_(uint32_t crc1, uint32_t crc2, z_off64_t len2); +static void crc32_combine_gen_(uint32_t *op, z_off64_t len2); + +/* ========================================================================= */ +static uint32_t crc32_combine_(uint32_t crc1, uint32_t crc2, z_off64_t len2) { + int n; + + if (len2 > 0) + /* operator for 2^n zeros repeats every GF2_DIM n values */ + for (n = 0; len2; n = (n + 1) % GF2_DIM, len2 >>= 1) + if (len2 & 1) + crc1 = gf2_matrix_times(crc_comb[n], crc1); + return crc1 ^ crc2; +} + +/* ========================================================================= */ +#ifdef ZLIB_COMPAT +unsigned long Z_EXPORT PREFIX(crc32_combine)(unsigned long crc1, unsigned long crc2, z_off_t len2) { + return (unsigned long)crc32_combine_((uint32_t)crc1, (uint32_t)crc2, len2); +} + +unsigned long Z_EXPORT PREFIX4(crc32_combine)(unsigned long crc1, unsigned long crc2, z_off64_t len2) { + return (unsigned long)crc32_combine_((uint32_t)crc1, (uint32_t)crc2, len2); +} +#else +uint32_t Z_EXPORT PREFIX4(crc32_combine)(uint32_t crc1, uint32_t crc2, z_off64_t len2) { + return crc32_combine_(crc1, crc2, len2); +} +#endif + +/* ========================================================================= */ + +static void crc32_combine_gen_(uint32_t *op, z_off64_t len2) { + uint32_t row; + int j; + unsigned i; + + /* if len2 is zero or negative, return the identity matrix */ + if (len2 <= 0) { + row = 1; + for (j = 0; j < GF2_DIM; j++) { + op[j] = row; + row <<= 1; + } + return; + } + + /* at least one bit in len2 is set -- find it, and copy the operator + corresponding to that position into op */ + i = 0; + for (;;) { + if (len2 & 1) { + for (j = 0; j < GF2_DIM; j++) + op[j] = crc_comb[i][j]; + break; + } + len2 >>= 1; + i = (i + 1) % GF2_DIM; + } + + /* for each remaining bit set in len2 (if any), multiply op by the operator + corresponding to that position */ + for (;;) { + len2 >>= 1; + i = (i + 1) % GF2_DIM; + if (len2 == 0) + break; + if (len2 & 1) + for (j = 0; j < GF2_DIM; j++) + op[j] = gf2_matrix_times(crc_comb[i], op[j]); + } +} + +/* ========================================================================= */ + +#ifdef ZLIB_COMPAT +void Z_EXPORT PREFIX(crc32_combine_gen)(uint32_t *op, z_off_t len2) { + crc32_combine_gen_(op, len2); +} +#endif + +void Z_EXPORT PREFIX4(crc32_combine_gen)(uint32_t *op, z_off64_t len2) { + crc32_combine_gen_(op, len2); +} + +/* ========================================================================= */ +uint32_t Z_EXPORT PREFIX(crc32_combine_op)(uint32_t crc1, uint32_t crc2, const uint32_t *op) { + return gf2_matrix_times(op, crc1) ^ crc2; +} diff --git a/libs/zlibng/crc32_comb_tbl.h b/libs/zlibng/crc32_comb_tbl.h new file mode 100644 index 000000000..43818c3e0 --- /dev/null +++ b/libs/zlibng/crc32_comb_tbl.h @@ -0,0 +1,300 @@ +#ifndef CRC32_COMB_TBL_H_ +#define CRC32_COMB_TBL_H_ + +/* crc32_comb_tbl.h -- zero operators table for CRC combine + * Generated automatically by makecrct.c + */ + +static const uint32_t crc_comb[32][32] = +{ + { + 0x77073096, 0xee0e612c, 0x076dc419, 0x0edb8832, 0x1db71064, + 0x3b6e20c8, 0x76dc4190, 0xedb88320, 0x00000001, 0x00000002, + 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, + 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, + 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, + 0x00400000, 0x00800000 + }, + { + 0x191b3141, 0x32366282, 0x646cc504, 0xc8d98a08, 0x4ac21251, + 0x958424a2, 0xf0794f05, 0x3b83984b, 0x77073096, 0xee0e612c, + 0x076dc419, 0x0edb8832, 0x1db71064, 0x3b6e20c8, 0x76dc4190, + 0xedb88320, 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, + 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, + 0x00004000, 0x00008000 + }, + { + 0xb8bc6765, 0xaa09c88b, 0x8f629757, 0xc5b428ef, 0x5019579f, + 0xa032af3e, 0x9b14583d, 0xed59b63b, 0x01c26a37, 0x0384d46e, + 0x0709a8dc, 0x0e1351b8, 0x1c26a370, 0x384d46e0, 0x709a8dc0, + 0xe1351b80, 0x191b3141, 0x32366282, 0x646cc504, 0xc8d98a08, + 0x4ac21251, 0x958424a2, 0xf0794f05, 0x3b83984b, 0x77073096, + 0xee0e612c, 0x076dc419, 0x0edb8832, 0x1db71064, 0x3b6e20c8, + 0x76dc4190, 0xedb88320 + }, + { + 0xccaa009e, 0x4225077d, 0x844a0efa, 0xd3e51bb5, 0x7cbb312b, + 0xf9766256, 0x299dc2ed, 0x533b85da, 0xa6770bb4, 0x979f1129, + 0xf44f2413, 0x33ef4e67, 0x67de9cce, 0xcfbd399c, 0x440b7579, + 0x8816eaf2, 0xcb5cd3a5, 0x4dc8a10b, 0x9b914216, 0xec53826d, + 0x03d6029b, 0x07ac0536, 0x0f580a6c, 0x1eb014d8, 0x3d6029b0, + 0x7ac05360, 0xf580a6c0, 0x30704bc1, 0x60e09782, 0xc1c12f04, + 0x58f35849, 0xb1e6b092 + }, + { + 0xae689191, 0x87a02563, 0xd4314c87, 0x73139f4f, 0xe6273e9e, + 0x173f7b7d, 0x2e7ef6fa, 0x5cfdedf4, 0xb9fbdbe8, 0xa886b191, + 0x8a7c6563, 0xcf89cc87, 0x44629f4f, 0x88c53e9e, 0xcafb7b7d, + 0x4e87f0bb, 0x9d0fe176, 0xe16ec4ad, 0x19ac8f1b, 0x33591e36, + 0x66b23c6c, 0xcd6478d8, 0x41b9f7f1, 0x8373efe2, 0xdd96d985, + 0x605cb54b, 0xc0b96a96, 0x5a03d36d, 0xb407a6da, 0xb37e4bf5, + 0xbd8d91ab, 0xa06a2517 + }, + { + 0xf1da05aa, 0x38c50d15, 0x718a1a2a, 0xe3143454, 0x1d596ee9, + 0x3ab2ddd2, 0x7565bba4, 0xeacb7748, 0x0ee7e8d1, 0x1dcfd1a2, + 0x3b9fa344, 0x773f4688, 0xee7e8d10, 0x078c1c61, 0x0f1838c2, + 0x1e307184, 0x3c60e308, 0x78c1c610, 0xf1838c20, 0x38761e01, + 0x70ec3c02, 0xe1d87804, 0x18c1f649, 0x3183ec92, 0x6307d924, + 0xc60fb248, 0x576e62d1, 0xaedcc5a2, 0x86c88d05, 0xd6e01c4b, + 0x76b13ed7, 0xed627dae + }, + { + 0x8f352d95, 0xc51b5d6b, 0x5147bc97, 0xa28f792e, 0x9e6ff41d, + 0xe7aeee7b, 0x142cdab7, 0x2859b56e, 0x50b36adc, 0xa166d5b8, + 0x99bcad31, 0xe8085c23, 0x0b61be07, 0x16c37c0e, 0x2d86f81c, + 0x5b0df038, 0xb61be070, 0xb746c6a1, 0xb5fc8b03, 0xb0881047, + 0xba6126cf, 0xafb34bdf, 0x841791ff, 0xd35e25bf, 0x7dcd4d3f, + 0xfb9a9a7e, 0x2c4432bd, 0x5888657a, 0xb110caf4, 0xb95093a9, + 0xa9d02113, 0x88d14467 + }, + { + 0x33fff533, 0x67ffea66, 0xcfffd4cc, 0x448eafd9, 0x891d5fb2, + 0xc94bb925, 0x49e6740b, 0x93cce816, 0xfce8d66d, 0x22a0aa9b, + 0x45415536, 0x8a82aa6c, 0xce745299, 0x4799a373, 0x8f3346e6, + 0xc5178b8d, 0x515e115b, 0xa2bc22b6, 0x9e09432d, 0xe763801b, + 0x15b60677, 0x2b6c0cee, 0x56d819dc, 0xadb033b8, 0x80116131, + 0xdb53c423, 0x6dd68e07, 0xdbad1c0e, 0x6c2b3e5d, 0xd8567cba, + 0x6bddff35, 0xd7bbfe6a + }, + { + 0xce3371cb, 0x4717e5d7, 0x8e2fcbae, 0xc72e911d, 0x552c247b, + 0xaa5848f6, 0x8fc197ad, 0xc4f2291b, 0x52955477, 0xa52aa8ee, + 0x9124579d, 0xf939a97b, 0x290254b7, 0x5204a96e, 0xa40952dc, + 0x9363a3f9, 0xfdb641b3, 0x201d8527, 0x403b0a4e, 0x8076149c, + 0xdb9d2f79, 0x6c4b58b3, 0xd896b166, 0x6a5c648d, 0xd4b8c91a, + 0x72009475, 0xe40128ea, 0x13735795, 0x26e6af2a, 0x4dcd5e54, + 0x9b9abca8, 0xec447f11 + }, + { + 0x1072db28, 0x20e5b650, 0x41cb6ca0, 0x8396d940, 0xdc5cb4c1, + 0x63c86fc3, 0xc790df86, 0x5450b94d, 0xa8a1729a, 0x8a33e375, + 0xcf16c0ab, 0x455c8717, 0x8ab90e2e, 0xce031a1d, 0x4777327b, + 0x8eee64f6, 0xc6adcfad, 0x562a991b, 0xac553236, 0x83db622d, + 0xdcc7c21b, 0x62fe8277, 0xc5fd04ee, 0x508b0f9d, 0xa1161f3a, + 0x995d3835, 0xe9cb762b, 0x08e7ea17, 0x11cfd42e, 0x239fa85c, + 0x473f50b8, 0x8e7ea170 + }, + { + 0xf891f16f, 0x2a52e49f, 0x54a5c93e, 0xa94b927c, 0x89e622b9, + 0xc8bd4333, 0x4a0b8027, 0x9417004e, 0xf35f06dd, 0x3dcf0bfb, + 0x7b9e17f6, 0xf73c2fec, 0x35095999, 0x6a12b332, 0xd4256664, + 0x733bca89, 0xe6779512, 0x179e2c65, 0x2f3c58ca, 0x5e78b194, + 0xbcf16328, 0xa293c011, 0x9e568663, 0xe7dc0a87, 0x14c9134f, + 0x2992269e, 0x53244d3c, 0xa6489a78, 0x97e032b1, 0xf4b16323, + 0x3213c007, 0x6427800e + }, + { + 0x88b6ba63, 0xca1c7287, 0x4f49e34f, 0x9e93c69e, 0xe6568b7d, + 0x17dc10bb, 0x2fb82176, 0x5f7042ec, 0xbee085d8, 0xa6b00df1, + 0x96111da3, 0xf7533d07, 0x35d77c4f, 0x6baef89e, 0xd75df13c, + 0x75cae439, 0xeb95c872, 0x0c5a96a5, 0x18b52d4a, 0x316a5a94, + 0x62d4b528, 0xc5a96a50, 0x5023d2e1, 0xa047a5c2, 0x9bfe4dc5, + 0xec8d9dcb, 0x026a3dd7, 0x04d47bae, 0x09a8f75c, 0x1351eeb8, + 0x26a3dd70, 0x4d47bae0 + }, + { + 0x5ad8a92c, 0xb5b15258, 0xb013a2f1, 0xbb5643a3, 0xaddd8107, + 0x80ca044f, 0xdae50edf, 0x6ebb1bff, 0xdd7637fe, 0x619d69bd, + 0xc33ad37a, 0x5d04a0b5, 0xba09416a, 0xaf638495, 0x85b60f6b, + 0xd01d1897, 0x7b4b376f, 0xf6966ede, 0x365ddbfd, 0x6cbbb7fa, + 0xd9776ff4, 0x699fd9a9, 0xd33fb352, 0x7d0e60e5, 0xfa1cc1ca, + 0x2f4885d5, 0x5e910baa, 0xbd221754, 0xa13528e9, 0x991b5793, + 0xe947a967, 0x09fe548f + }, + { + 0xb566f6e2, 0xb1bceb85, 0xb808d14b, 0xab60a4d7, 0x8db04fef, + 0xc011999f, 0x5b52357f, 0xb6a46afe, 0xb639d3bd, 0xb702a13b, + 0xb5744437, 0xb1998e2f, 0xb8421a1f, 0xabf5327f, 0x8c9b62bf, + 0xc247c33f, 0x5ffe803f, 0xbffd007e, 0xa48b06bd, 0x92670b3b, + 0xffbf1037, 0x240f262f, 0x481e4c5e, 0x903c98bc, 0xfb083739, + 0x2d616833, 0x5ac2d066, 0xb585a0cc, 0xb07a47d9, 0xbb8589f3, + 0xac7a15a7, 0x83852d0f + }, + { + 0x9d9129bf, 0xe053553f, 0x1bd7ac3f, 0x37af587e, 0x6f5eb0fc, + 0xdebd61f8, 0x660bc5b1, 0xcc178b62, 0x435e1085, 0x86bc210a, + 0xd6094455, 0x77638eeb, 0xeec71dd6, 0x06ff3ded, 0x0dfe7bda, + 0x1bfcf7b4, 0x37f9ef68, 0x6ff3ded0, 0xdfe7bda0, 0x64be7d01, + 0xc97cfa02, 0x4988f245, 0x9311e48a, 0xfd52cf55, 0x21d498eb, + 0x43a931d6, 0x875263ac, 0xd5d5c119, 0x70da8473, 0xe1b508e6, + 0x181b178d, 0x30362f1a + }, + { + 0x2ee43a2c, 0x5dc87458, 0xbb90e8b0, 0xac50d721, 0x83d0a803, + 0xdcd05647, 0x62d1aacf, 0xc5a3559e, 0x5037ad7d, 0xa06f5afa, + 0x9bafb3b5, 0xec2e612b, 0x032dc417, 0x065b882e, 0x0cb7105c, + 0x196e20b8, 0x32dc4170, 0x65b882e0, 0xcb7105c0, 0x4d930dc1, + 0x9b261b82, 0xed3d3145, 0x010b64cb, 0x0216c996, 0x042d932c, + 0x085b2658, 0x10b64cb0, 0x216c9960, 0x42d932c0, 0x85b26580, + 0xd015cd41, 0x7b5a9cc3 + }, + { + 0x1b4511ee, 0x368a23dc, 0x6d1447b8, 0xda288f70, 0x6f2018a1, + 0xde403142, 0x67f164c5, 0xcfe2c98a, 0x44b49555, 0x89692aaa, + 0xc9a35315, 0x4837a06b, 0x906f40d6, 0xfbaf87ed, 0x2c2e099b, + 0x585c1336, 0xb0b8266c, 0xba014a99, 0xaf739373, 0x859620a7, + 0xd05d470f, 0x7bcb885f, 0xf79710be, 0x345f273d, 0x68be4e7a, + 0xd17c9cf4, 0x79883fa9, 0xf3107f52, 0x3d51f8e5, 0x7aa3f1ca, + 0xf547e394, 0x31fec169 + }, + { + 0xbce15202, 0xa2b3a245, 0x9e1642cb, 0xe75d83d7, 0x15ca01ef, + 0x2b9403de, 0x572807bc, 0xae500f78, 0x87d118b1, 0xd4d33723, + 0x72d76807, 0xe5aed00e, 0x102ca65d, 0x20594cba, 0x40b29974, + 0x816532e8, 0xd9bb6391, 0x6807c163, 0xd00f82c6, 0x7b6e03cd, + 0xf6dc079a, 0x36c90975, 0x6d9212ea, 0xdb2425d4, 0x6d394de9, + 0xda729bd2, 0x6f9431e5, 0xdf2863ca, 0x6521c1d5, 0xca4383aa, + 0x4ff60115, 0x9fec022a + }, + { + 0xff08e5ef, 0x2560cd9f, 0x4ac19b3e, 0x9583367c, 0xf0776ab9, + 0x3b9fd333, 0x773fa666, 0xee7f4ccc, 0x078f9fd9, 0x0f1f3fb2, + 0x1e3e7f64, 0x3c7cfec8, 0x78f9fd90, 0xf1f3fb20, 0x3896f001, + 0x712de002, 0xe25bc004, 0x1fc68649, 0x3f8d0c92, 0x7f1a1924, + 0xfe343248, 0x271962d1, 0x4e32c5a2, 0x9c658b44, 0xe3ba10c9, + 0x1c0527d3, 0x380a4fa6, 0x70149f4c, 0xe0293e98, 0x1b237b71, + 0x3646f6e2, 0x6c8dedc4 + }, + { + 0x6f76172e, 0xdeec2e5c, 0x66a95af9, 0xcd52b5f2, 0x41d46da5, + 0x83a8db4a, 0xdc20b0d5, 0x633067eb, 0xc660cfd6, 0x57b099ed, + 0xaf6133da, 0x85b361f5, 0xd017c5ab, 0x7b5e8d17, 0xf6bd1a2e, + 0x360b321d, 0x6c16643a, 0xd82cc874, 0x6b2896a9, 0xd6512d52, + 0x77d35ce5, 0xefa6b9ca, 0x043c75d5, 0x0878ebaa, 0x10f1d754, + 0x21e3aea8, 0x43c75d50, 0x878ebaa0, 0xd46c7301, 0x73a9e043, + 0xe753c086, 0x15d6874d + }, + { + 0x56f5cab9, 0xadeb9572, 0x80a62ca5, 0xda3d5f0b, 0x6f0bb857, + 0xde1770ae, 0x675fe71d, 0xcebfce3a, 0x460e9a35, 0x8c1d346a, + 0xc34b6e95, 0x5de7db6b, 0xbbcfb6d6, 0xacee6bed, 0x82add19b, + 0xde2aa577, 0x67244caf, 0xce48995e, 0x47e034fd, 0x8fc069fa, + 0xc4f1d5b5, 0x5292ad2b, 0xa5255a56, 0x913bb2ed, 0xf906639b, + 0x297dc177, 0x52fb82ee, 0xa5f705dc, 0x909f0df9, 0xfa4f1db3, + 0x2fef3d27, 0x5fde7a4e + }, + { + 0x385993ac, 0x70b32758, 0xe1664eb0, 0x19bd9b21, 0x337b3642, + 0x66f66c84, 0xcdecd908, 0x40a8b451, 0x815168a2, 0xd9d3d705, + 0x68d6a84b, 0xd1ad5096, 0x782ba76d, 0xf0574eda, 0x3bdf9bf5, + 0x77bf37ea, 0xef7e6fd4, 0x058dd9e9, 0x0b1bb3d2, 0x163767a4, + 0x2c6ecf48, 0x58dd9e90, 0xb1bb3d20, 0xb8077c01, 0xab7ffe43, + 0x8d8efac7, 0xc06cf3cf, 0x5ba8e1df, 0xb751c3be, 0xb5d2813d, + 0xb0d4043b, 0xbad90e37 + }, + { + 0xb4247b20, 0xb339f001, 0xbd02e643, 0xa174cac7, 0x999893cf, + 0xe84021df, 0x0bf145ff, 0x17e28bfe, 0x2fc517fc, 0x5f8a2ff8, + 0xbf145ff0, 0xa559b9a1, 0x91c27503, 0xf8f5ec47, 0x2a9adecf, + 0x5535bd9e, 0xaa6b7b3c, 0x8fa7f039, 0xc43ee633, 0x530cca27, + 0xa619944e, 0x97422edd, 0xf5f55bfb, 0x309bb1b7, 0x6137636e, + 0xc26ec6dc, 0x5fac8bf9, 0xbf5917f2, 0xa5c329a5, 0x90f7550b, + 0xfa9fac57, 0x2e4e5eef + }, + { + 0x695186a7, 0xd2a30d4e, 0x7e371cdd, 0xfc6e39ba, 0x23ad7535, + 0x475aea6a, 0x8eb5d4d4, 0xc61aafe9, 0x57445993, 0xae88b326, + 0x8660600d, 0xd7b1c65b, 0x74128af7, 0xe82515ee, 0x0b3b2d9d, + 0x16765b3a, 0x2cecb674, 0x59d96ce8, 0xb3b2d9d0, 0xbc14b5e1, + 0xa3586d83, 0x9dc1dd47, 0xe0f2bccf, 0x1a947fdf, 0x3528ffbe, + 0x6a51ff7c, 0xd4a3fef8, 0x7236fbb1, 0xe46df762, 0x13aae885, + 0x2755d10a, 0x4eaba214 + }, + { + 0x66bc001e, 0xcd78003c, 0x41810639, 0x83020c72, 0xdd751ea5, + 0x619b3b0b, 0xc3367616, 0x5d1dea6d, 0xba3bd4da, 0xaf06aff5, + 0x857c59ab, 0xd189b517, 0x78626c6f, 0xf0c4d8de, 0x3af8b7fd, + 0x75f16ffa, 0xebe2dff4, 0x0cb4b9a9, 0x19697352, 0x32d2e6a4, + 0x65a5cd48, 0xcb4b9a90, 0x4de63361, 0x9bcc66c2, 0xece9cbc5, + 0x02a291cb, 0x05452396, 0x0a8a472c, 0x15148e58, 0x2a291cb0, + 0x54523960, 0xa8a472c0 + }, + { + 0xb58b27b3, 0xb0674927, 0xbbbf940f, 0xac0e2e5f, 0x836d5aff, + 0xddabb3bf, 0x6026613f, 0xc04cc27e, 0x5be882bd, 0xb7d1057a, + 0xb4d30cb5, 0xb2d71f2b, 0xbedf3817, 0xa6cf766f, 0x96efea9f, + 0xf6aed37f, 0x362ca0bf, 0x6c59417e, 0xd8b282fc, 0x6a1403b9, + 0xd4280772, 0x732108a5, 0xe642114a, 0x17f524d5, 0x2fea49aa, + 0x5fd49354, 0xbfa926a8, 0xa4234b11, 0x93379063, 0xfd1e2687, + 0x214d4b4f, 0x429a969e + }, + { + 0xfe273162, 0x273f6485, 0x4e7ec90a, 0x9cfd9214, 0xe28a2269, + 0x1e654293, 0x3cca8526, 0x79950a4c, 0xf32a1498, 0x3d252f71, + 0x7a4a5ee2, 0xf494bdc4, 0x32587dc9, 0x64b0fb92, 0xc961f724, + 0x49b2e809, 0x9365d012, 0xfdbaa665, 0x20044a8b, 0x40089516, + 0x80112a2c, 0xdb535219, 0x6dd7a273, 0xdbaf44e6, 0x6c2f8f8d, + 0xd85f1f1a, 0x6bcf3875, 0xd79e70ea, 0x744de795, 0xe89bcf2a, + 0x0a469815, 0x148d302a + }, + { + 0xd3c98813, 0x7ce21667, 0xf9c42cce, 0x28f95fdd, 0x51f2bfba, + 0xa3e57f74, 0x9cbbf8a9, 0xe206f713, 0x1f7ce867, 0x3ef9d0ce, + 0x7df3a19c, 0xfbe74338, 0x2cbf8031, 0x597f0062, 0xb2fe00c4, + 0xbe8d07c9, 0xa66b09d3, 0x97a715e7, 0xf43f2d8f, 0x330f5d5f, + 0x661ebabe, 0xcc3d757c, 0x430becb9, 0x8617d972, 0xd75eb4a5, + 0x75cc6f0b, 0xeb98de16, 0x0c40ba6d, 0x188174da, 0x3102e9b4, + 0x6205d368, 0xc40ba6d0 + }, + { + 0xf7d6deb4, 0x34dcbb29, 0x69b97652, 0xd372eca4, 0x7d94df09, + 0xfb29be12, 0x2d227a65, 0x5a44f4ca, 0xb489e994, 0xb262d569, + 0xbfb4ac93, 0xa4185f67, 0x9341b88f, 0xfdf2775f, 0x2095e8ff, + 0x412bd1fe, 0x8257a3fc, 0xdfde41b9, 0x64cd8533, 0xc99b0a66, + 0x4847128d, 0x908e251a, 0xfa6d4c75, 0x2fab9eab, 0x5f573d56, + 0xbeae7aac, 0xa62df319, 0x972ae073, 0xf524c6a7, 0x31388b0f, + 0x6271161e, 0xc4e22c3c + }, + { + 0xedb88320, 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, + 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, + 0x00004000, 0x00008000, 0x00010000, 0x00020000, 0x00040000, + 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000 + }, + { + 0x76dc4190, 0xedb88320, 0x00000001, 0x00000002, 0x00000004, + 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, + 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, + 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, + 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000 + }, + { + 0x1db71064, 0x3b6e20c8, 0x76dc4190, 0xedb88320, 0x00000001, + 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, + 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, + 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, + 0x00200000, 0x00400000, 0x00800000, 0x01000000, 0x02000000, + 0x04000000, 0x08000000 + } +}; + +#endif /* CRC32_COMB_TBL_H_ */ diff --git a/libs/zlibng/crc32_p.h b/libs/zlibng/crc32_p.h new file mode 100644 index 000000000..47b4b3751 --- /dev/null +++ b/libs/zlibng/crc32_p.h @@ -0,0 +1,19 @@ +#ifndef CRC32_P_H_ +#define CRC32_P_H_ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + + +static inline uint32_t gf2_matrix_times(const uint32_t *mat, uint32_t vec) { + uint32_t sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + + +#endif /* CRC32_P_H_ */ diff --git a/libs/zlibng/crc32.h b/libs/zlibng/crc32_tbl.h similarity index 62% rename from libs/zlibng/crc32.h rename to libs/zlibng/crc32_tbl.h index 47ca7c068..ee2030c6c 100644 --- a/libs/zlibng/crc32.h +++ b/libs/zlibng/crc32_tbl.h @@ -1,8 +1,8 @@ -#ifndef CRC32_H_ -#define CRC32_H_ +#ifndef CRC32_TBL_H_ +#define CRC32_TBL_H_ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c +/* crc32_tbl.h -- tables for rapid CRC calculation + * Generated automatically by makecrct.c */ static const uint32_t crc_table[8][256] = @@ -441,295 +441,4 @@ static const uint32_t crc_table[8][256] = } }; -static const uint32_t crc_comb[32][32] = -{ - { - 0x77073096UL, 0xee0e612cUL, 0x076dc419UL, 0x0edb8832UL, 0x1db71064UL, - 0x3b6e20c8UL, 0x76dc4190UL, 0xedb88320UL, 0x00000001UL, 0x00000002UL, - 0x00000004UL, 0x00000008UL, 0x00000010UL, 0x00000020UL, 0x00000040UL, - 0x00000080UL, 0x00000100UL, 0x00000200UL, 0x00000400UL, 0x00000800UL, - 0x00001000UL, 0x00002000UL, 0x00004000UL, 0x00008000UL, 0x00010000UL, - 0x00020000UL, 0x00040000UL, 0x00080000UL, 0x00100000UL, 0x00200000UL, - 0x00400000UL, 0x00800000UL - }, - { - 0x191b3141UL, 0x32366282UL, 0x646cc504UL, 0xc8d98a08UL, 0x4ac21251UL, - 0x958424a2UL, 0xf0794f05UL, 0x3b83984bUL, 0x77073096UL, 0xee0e612cUL, - 0x076dc419UL, 0x0edb8832UL, 0x1db71064UL, 0x3b6e20c8UL, 0x76dc4190UL, - 0xedb88320UL, 0x00000001UL, 0x00000002UL, 0x00000004UL, 0x00000008UL, - 0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL, 0x00000100UL, - 0x00000200UL, 0x00000400UL, 0x00000800UL, 0x00001000UL, 0x00002000UL, - 0x00004000UL, 0x00008000UL - }, - { - 0xb8bc6765UL, 0xaa09c88bUL, 0x8f629757UL, 0xc5b428efUL, 0x5019579fUL, - 0xa032af3eUL, 0x9b14583dUL, 0xed59b63bUL, 0x01c26a37UL, 0x0384d46eUL, - 0x0709a8dcUL, 0x0e1351b8UL, 0x1c26a370UL, 0x384d46e0UL, 0x709a8dc0UL, - 0xe1351b80UL, 0x191b3141UL, 0x32366282UL, 0x646cc504UL, 0xc8d98a08UL, - 0x4ac21251UL, 0x958424a2UL, 0xf0794f05UL, 0x3b83984bUL, 0x77073096UL, - 0xee0e612cUL, 0x076dc419UL, 0x0edb8832UL, 0x1db71064UL, 0x3b6e20c8UL, - 0x76dc4190UL, 0xedb88320UL - }, - { - 0xccaa009eUL, 0x4225077dUL, 0x844a0efaUL, 0xd3e51bb5UL, 0x7cbb312bUL, - 0xf9766256UL, 0x299dc2edUL, 0x533b85daUL, 0xa6770bb4UL, 0x979f1129UL, - 0xf44f2413UL, 0x33ef4e67UL, 0x67de9cceUL, 0xcfbd399cUL, 0x440b7579UL, - 0x8816eaf2UL, 0xcb5cd3a5UL, 0x4dc8a10bUL, 0x9b914216UL, 0xec53826dUL, - 0x03d6029bUL, 0x07ac0536UL, 0x0f580a6cUL, 0x1eb014d8UL, 0x3d6029b0UL, - 0x7ac05360UL, 0xf580a6c0UL, 0x30704bc1UL, 0x60e09782UL, 0xc1c12f04UL, - 0x58f35849UL, 0xb1e6b092UL - }, - { - 0xae689191UL, 0x87a02563UL, 0xd4314c87UL, 0x73139f4fUL, 0xe6273e9eUL, - 0x173f7b7dUL, 0x2e7ef6faUL, 0x5cfdedf4UL, 0xb9fbdbe8UL, 0xa886b191UL, - 0x8a7c6563UL, 0xcf89cc87UL, 0x44629f4fUL, 0x88c53e9eUL, 0xcafb7b7dUL, - 0x4e87f0bbUL, 0x9d0fe176UL, 0xe16ec4adUL, 0x19ac8f1bUL, 0x33591e36UL, - 0x66b23c6cUL, 0xcd6478d8UL, 0x41b9f7f1UL, 0x8373efe2UL, 0xdd96d985UL, - 0x605cb54bUL, 0xc0b96a96UL, 0x5a03d36dUL, 0xb407a6daUL, 0xb37e4bf5UL, - 0xbd8d91abUL, 0xa06a2517UL - }, - { - 0xf1da05aaUL, 0x38c50d15UL, 0x718a1a2aUL, 0xe3143454UL, 0x1d596ee9UL, - 0x3ab2ddd2UL, 0x7565bba4UL, 0xeacb7748UL, 0x0ee7e8d1UL, 0x1dcfd1a2UL, - 0x3b9fa344UL, 0x773f4688UL, 0xee7e8d10UL, 0x078c1c61UL, 0x0f1838c2UL, - 0x1e307184UL, 0x3c60e308UL, 0x78c1c610UL, 0xf1838c20UL, 0x38761e01UL, - 0x70ec3c02UL, 0xe1d87804UL, 0x18c1f649UL, 0x3183ec92UL, 0x6307d924UL, - 0xc60fb248UL, 0x576e62d1UL, 0xaedcc5a2UL, 0x86c88d05UL, 0xd6e01c4bUL, - 0x76b13ed7UL, 0xed627daeUL - }, - { - 0x8f352d95UL, 0xc51b5d6bUL, 0x5147bc97UL, 0xa28f792eUL, 0x9e6ff41dUL, - 0xe7aeee7bUL, 0x142cdab7UL, 0x2859b56eUL, 0x50b36adcUL, 0xa166d5b8UL, - 0x99bcad31UL, 0xe8085c23UL, 0x0b61be07UL, 0x16c37c0eUL, 0x2d86f81cUL, - 0x5b0df038UL, 0xb61be070UL, 0xb746c6a1UL, 0xb5fc8b03UL, 0xb0881047UL, - 0xba6126cfUL, 0xafb34bdfUL, 0x841791ffUL, 0xd35e25bfUL, 0x7dcd4d3fUL, - 0xfb9a9a7eUL, 0x2c4432bdUL, 0x5888657aUL, 0xb110caf4UL, 0xb95093a9UL, - 0xa9d02113UL, 0x88d14467UL - }, - { - 0x33fff533UL, 0x67ffea66UL, 0xcfffd4ccUL, 0x448eafd9UL, 0x891d5fb2UL, - 0xc94bb925UL, 0x49e6740bUL, 0x93cce816UL, 0xfce8d66dUL, 0x22a0aa9bUL, - 0x45415536UL, 0x8a82aa6cUL, 0xce745299UL, 0x4799a373UL, 0x8f3346e6UL, - 0xc5178b8dUL, 0x515e115bUL, 0xa2bc22b6UL, 0x9e09432dUL, 0xe763801bUL, - 0x15b60677UL, 0x2b6c0ceeUL, 0x56d819dcUL, 0xadb033b8UL, 0x80116131UL, - 0xdb53c423UL, 0x6dd68e07UL, 0xdbad1c0eUL, 0x6c2b3e5dUL, 0xd8567cbaUL, - 0x6bddff35UL, 0xd7bbfe6aUL - }, - { - 0xce3371cbUL, 0x4717e5d7UL, 0x8e2fcbaeUL, 0xc72e911dUL, 0x552c247bUL, - 0xaa5848f6UL, 0x8fc197adUL, 0xc4f2291bUL, 0x52955477UL, 0xa52aa8eeUL, - 0x9124579dUL, 0xf939a97bUL, 0x290254b7UL, 0x5204a96eUL, 0xa40952dcUL, - 0x9363a3f9UL, 0xfdb641b3UL, 0x201d8527UL, 0x403b0a4eUL, 0x8076149cUL, - 0xdb9d2f79UL, 0x6c4b58b3UL, 0xd896b166UL, 0x6a5c648dUL, 0xd4b8c91aUL, - 0x72009475UL, 0xe40128eaUL, 0x13735795UL, 0x26e6af2aUL, 0x4dcd5e54UL, - 0x9b9abca8UL, 0xec447f11UL - }, - { - 0x1072db28UL, 0x20e5b650UL, 0x41cb6ca0UL, 0x8396d940UL, 0xdc5cb4c1UL, - 0x63c86fc3UL, 0xc790df86UL, 0x5450b94dUL, 0xa8a1729aUL, 0x8a33e375UL, - 0xcf16c0abUL, 0x455c8717UL, 0x8ab90e2eUL, 0xce031a1dUL, 0x4777327bUL, - 0x8eee64f6UL, 0xc6adcfadUL, 0x562a991bUL, 0xac553236UL, 0x83db622dUL, - 0xdcc7c21bUL, 0x62fe8277UL, 0xc5fd04eeUL, 0x508b0f9dUL, 0xa1161f3aUL, - 0x995d3835UL, 0xe9cb762bUL, 0x08e7ea17UL, 0x11cfd42eUL, 0x239fa85cUL, - 0x473f50b8UL, 0x8e7ea170UL - }, - { - 0xf891f16fUL, 0x2a52e49fUL, 0x54a5c93eUL, 0xa94b927cUL, 0x89e622b9UL, - 0xc8bd4333UL, 0x4a0b8027UL, 0x9417004eUL, 0xf35f06ddUL, 0x3dcf0bfbUL, - 0x7b9e17f6UL, 0xf73c2fecUL, 0x35095999UL, 0x6a12b332UL, 0xd4256664UL, - 0x733bca89UL, 0xe6779512UL, 0x179e2c65UL, 0x2f3c58caUL, 0x5e78b194UL, - 0xbcf16328UL, 0xa293c011UL, 0x9e568663UL, 0xe7dc0a87UL, 0x14c9134fUL, - 0x2992269eUL, 0x53244d3cUL, 0xa6489a78UL, 0x97e032b1UL, 0xf4b16323UL, - 0x3213c007UL, 0x6427800eUL - }, - { - 0x88b6ba63UL, 0xca1c7287UL, 0x4f49e34fUL, 0x9e93c69eUL, 0xe6568b7dUL, - 0x17dc10bbUL, 0x2fb82176UL, 0x5f7042ecUL, 0xbee085d8UL, 0xa6b00df1UL, - 0x96111da3UL, 0xf7533d07UL, 0x35d77c4fUL, 0x6baef89eUL, 0xd75df13cUL, - 0x75cae439UL, 0xeb95c872UL, 0x0c5a96a5UL, 0x18b52d4aUL, 0x316a5a94UL, - 0x62d4b528UL, 0xc5a96a50UL, 0x5023d2e1UL, 0xa047a5c2UL, 0x9bfe4dc5UL, - 0xec8d9dcbUL, 0x026a3dd7UL, 0x04d47baeUL, 0x09a8f75cUL, 0x1351eeb8UL, - 0x26a3dd70UL, 0x4d47bae0UL - }, - { - 0x5ad8a92cUL, 0xb5b15258UL, 0xb013a2f1UL, 0xbb5643a3UL, 0xaddd8107UL, - 0x80ca044fUL, 0xdae50edfUL, 0x6ebb1bffUL, 0xdd7637feUL, 0x619d69bdUL, - 0xc33ad37aUL, 0x5d04a0b5UL, 0xba09416aUL, 0xaf638495UL, 0x85b60f6bUL, - 0xd01d1897UL, 0x7b4b376fUL, 0xf6966edeUL, 0x365ddbfdUL, 0x6cbbb7faUL, - 0xd9776ff4UL, 0x699fd9a9UL, 0xd33fb352UL, 0x7d0e60e5UL, 0xfa1cc1caUL, - 0x2f4885d5UL, 0x5e910baaUL, 0xbd221754UL, 0xa13528e9UL, 0x991b5793UL, - 0xe947a967UL, 0x09fe548fUL - }, - { - 0xb566f6e2UL, 0xb1bceb85UL, 0xb808d14bUL, 0xab60a4d7UL, 0x8db04fefUL, - 0xc011999fUL, 0x5b52357fUL, 0xb6a46afeUL, 0xb639d3bdUL, 0xb702a13bUL, - 0xb5744437UL, 0xb1998e2fUL, 0xb8421a1fUL, 0xabf5327fUL, 0x8c9b62bfUL, - 0xc247c33fUL, 0x5ffe803fUL, 0xbffd007eUL, 0xa48b06bdUL, 0x92670b3bUL, - 0xffbf1037UL, 0x240f262fUL, 0x481e4c5eUL, 0x903c98bcUL, 0xfb083739UL, - 0x2d616833UL, 0x5ac2d066UL, 0xb585a0ccUL, 0xb07a47d9UL, 0xbb8589f3UL, - 0xac7a15a7UL, 0x83852d0fUL - }, - { - 0x9d9129bfUL, 0xe053553fUL, 0x1bd7ac3fUL, 0x37af587eUL, 0x6f5eb0fcUL, - 0xdebd61f8UL, 0x660bc5b1UL, 0xcc178b62UL, 0x435e1085UL, 0x86bc210aUL, - 0xd6094455UL, 0x77638eebUL, 0xeec71dd6UL, 0x06ff3dedUL, 0x0dfe7bdaUL, - 0x1bfcf7b4UL, 0x37f9ef68UL, 0x6ff3ded0UL, 0xdfe7bda0UL, 0x64be7d01UL, - 0xc97cfa02UL, 0x4988f245UL, 0x9311e48aUL, 0xfd52cf55UL, 0x21d498ebUL, - 0x43a931d6UL, 0x875263acUL, 0xd5d5c119UL, 0x70da8473UL, 0xe1b508e6UL, - 0x181b178dUL, 0x30362f1aUL - }, - { - 0x2ee43a2cUL, 0x5dc87458UL, 0xbb90e8b0UL, 0xac50d721UL, 0x83d0a803UL, - 0xdcd05647UL, 0x62d1aacfUL, 0xc5a3559eUL, 0x5037ad7dUL, 0xa06f5afaUL, - 0x9bafb3b5UL, 0xec2e612bUL, 0x032dc417UL, 0x065b882eUL, 0x0cb7105cUL, - 0x196e20b8UL, 0x32dc4170UL, 0x65b882e0UL, 0xcb7105c0UL, 0x4d930dc1UL, - 0x9b261b82UL, 0xed3d3145UL, 0x010b64cbUL, 0x0216c996UL, 0x042d932cUL, - 0x085b2658UL, 0x10b64cb0UL, 0x216c9960UL, 0x42d932c0UL, 0x85b26580UL, - 0xd015cd41UL, 0x7b5a9cc3UL - }, - { - 0x1b4511eeUL, 0x368a23dcUL, 0x6d1447b8UL, 0xda288f70UL, 0x6f2018a1UL, - 0xde403142UL, 0x67f164c5UL, 0xcfe2c98aUL, 0x44b49555UL, 0x89692aaaUL, - 0xc9a35315UL, 0x4837a06bUL, 0x906f40d6UL, 0xfbaf87edUL, 0x2c2e099bUL, - 0x585c1336UL, 0xb0b8266cUL, 0xba014a99UL, 0xaf739373UL, 0x859620a7UL, - 0xd05d470fUL, 0x7bcb885fUL, 0xf79710beUL, 0x345f273dUL, 0x68be4e7aUL, - 0xd17c9cf4UL, 0x79883fa9UL, 0xf3107f52UL, 0x3d51f8e5UL, 0x7aa3f1caUL, - 0xf547e394UL, 0x31fec169UL - }, - { - 0xbce15202UL, 0xa2b3a245UL, 0x9e1642cbUL, 0xe75d83d7UL, 0x15ca01efUL, - 0x2b9403deUL, 0x572807bcUL, 0xae500f78UL, 0x87d118b1UL, 0xd4d33723UL, - 0x72d76807UL, 0xe5aed00eUL, 0x102ca65dUL, 0x20594cbaUL, 0x40b29974UL, - 0x816532e8UL, 0xd9bb6391UL, 0x6807c163UL, 0xd00f82c6UL, 0x7b6e03cdUL, - 0xf6dc079aUL, 0x36c90975UL, 0x6d9212eaUL, 0xdb2425d4UL, 0x6d394de9UL, - 0xda729bd2UL, 0x6f9431e5UL, 0xdf2863caUL, 0x6521c1d5UL, 0xca4383aaUL, - 0x4ff60115UL, 0x9fec022aUL - }, - { - 0xff08e5efUL, 0x2560cd9fUL, 0x4ac19b3eUL, 0x9583367cUL, 0xf0776ab9UL, - 0x3b9fd333UL, 0x773fa666UL, 0xee7f4cccUL, 0x078f9fd9UL, 0x0f1f3fb2UL, - 0x1e3e7f64UL, 0x3c7cfec8UL, 0x78f9fd90UL, 0xf1f3fb20UL, 0x3896f001UL, - 0x712de002UL, 0xe25bc004UL, 0x1fc68649UL, 0x3f8d0c92UL, 0x7f1a1924UL, - 0xfe343248UL, 0x271962d1UL, 0x4e32c5a2UL, 0x9c658b44UL, 0xe3ba10c9UL, - 0x1c0527d3UL, 0x380a4fa6UL, 0x70149f4cUL, 0xe0293e98UL, 0x1b237b71UL, - 0x3646f6e2UL, 0x6c8dedc4UL - }, - { - 0x6f76172eUL, 0xdeec2e5cUL, 0x66a95af9UL, 0xcd52b5f2UL, 0x41d46da5UL, - 0x83a8db4aUL, 0xdc20b0d5UL, 0x633067ebUL, 0xc660cfd6UL, 0x57b099edUL, - 0xaf6133daUL, 0x85b361f5UL, 0xd017c5abUL, 0x7b5e8d17UL, 0xf6bd1a2eUL, - 0x360b321dUL, 0x6c16643aUL, 0xd82cc874UL, 0x6b2896a9UL, 0xd6512d52UL, - 0x77d35ce5UL, 0xefa6b9caUL, 0x043c75d5UL, 0x0878ebaaUL, 0x10f1d754UL, - 0x21e3aea8UL, 0x43c75d50UL, 0x878ebaa0UL, 0xd46c7301UL, 0x73a9e043UL, - 0xe753c086UL, 0x15d6874dUL - }, - { - 0x56f5cab9UL, 0xadeb9572UL, 0x80a62ca5UL, 0xda3d5f0bUL, 0x6f0bb857UL, - 0xde1770aeUL, 0x675fe71dUL, 0xcebfce3aUL, 0x460e9a35UL, 0x8c1d346aUL, - 0xc34b6e95UL, 0x5de7db6bUL, 0xbbcfb6d6UL, 0xacee6bedUL, 0x82add19bUL, - 0xde2aa577UL, 0x67244cafUL, 0xce48995eUL, 0x47e034fdUL, 0x8fc069faUL, - 0xc4f1d5b5UL, 0x5292ad2bUL, 0xa5255a56UL, 0x913bb2edUL, 0xf906639bUL, - 0x297dc177UL, 0x52fb82eeUL, 0xa5f705dcUL, 0x909f0df9UL, 0xfa4f1db3UL, - 0x2fef3d27UL, 0x5fde7a4eUL - }, - { - 0x385993acUL, 0x70b32758UL, 0xe1664eb0UL, 0x19bd9b21UL, 0x337b3642UL, - 0x66f66c84UL, 0xcdecd908UL, 0x40a8b451UL, 0x815168a2UL, 0xd9d3d705UL, - 0x68d6a84bUL, 0xd1ad5096UL, 0x782ba76dUL, 0xf0574edaUL, 0x3bdf9bf5UL, - 0x77bf37eaUL, 0xef7e6fd4UL, 0x058dd9e9UL, 0x0b1bb3d2UL, 0x163767a4UL, - 0x2c6ecf48UL, 0x58dd9e90UL, 0xb1bb3d20UL, 0xb8077c01UL, 0xab7ffe43UL, - 0x8d8efac7UL, 0xc06cf3cfUL, 0x5ba8e1dfUL, 0xb751c3beUL, 0xb5d2813dUL, - 0xb0d4043bUL, 0xbad90e37UL - }, - { - 0xb4247b20UL, 0xb339f001UL, 0xbd02e643UL, 0xa174cac7UL, 0x999893cfUL, - 0xe84021dfUL, 0x0bf145ffUL, 0x17e28bfeUL, 0x2fc517fcUL, 0x5f8a2ff8UL, - 0xbf145ff0UL, 0xa559b9a1UL, 0x91c27503UL, 0xf8f5ec47UL, 0x2a9adecfUL, - 0x5535bd9eUL, 0xaa6b7b3cUL, 0x8fa7f039UL, 0xc43ee633UL, 0x530cca27UL, - 0xa619944eUL, 0x97422eddUL, 0xf5f55bfbUL, 0x309bb1b7UL, 0x6137636eUL, - 0xc26ec6dcUL, 0x5fac8bf9UL, 0xbf5917f2UL, 0xa5c329a5UL, 0x90f7550bUL, - 0xfa9fac57UL, 0x2e4e5eefUL - }, - { - 0x695186a7UL, 0xd2a30d4eUL, 0x7e371cddUL, 0xfc6e39baUL, 0x23ad7535UL, - 0x475aea6aUL, 0x8eb5d4d4UL, 0xc61aafe9UL, 0x57445993UL, 0xae88b326UL, - 0x8660600dUL, 0xd7b1c65bUL, 0x74128af7UL, 0xe82515eeUL, 0x0b3b2d9dUL, - 0x16765b3aUL, 0x2cecb674UL, 0x59d96ce8UL, 0xb3b2d9d0UL, 0xbc14b5e1UL, - 0xa3586d83UL, 0x9dc1dd47UL, 0xe0f2bccfUL, 0x1a947fdfUL, 0x3528ffbeUL, - 0x6a51ff7cUL, 0xd4a3fef8UL, 0x7236fbb1UL, 0xe46df762UL, 0x13aae885UL, - 0x2755d10aUL, 0x4eaba214UL - }, - { - 0x66bc001eUL, 0xcd78003cUL, 0x41810639UL, 0x83020c72UL, 0xdd751ea5UL, - 0x619b3b0bUL, 0xc3367616UL, 0x5d1dea6dUL, 0xba3bd4daUL, 0xaf06aff5UL, - 0x857c59abUL, 0xd189b517UL, 0x78626c6fUL, 0xf0c4d8deUL, 0x3af8b7fdUL, - 0x75f16ffaUL, 0xebe2dff4UL, 0x0cb4b9a9UL, 0x19697352UL, 0x32d2e6a4UL, - 0x65a5cd48UL, 0xcb4b9a90UL, 0x4de63361UL, 0x9bcc66c2UL, 0xece9cbc5UL, - 0x02a291cbUL, 0x05452396UL, 0x0a8a472cUL, 0x15148e58UL, 0x2a291cb0UL, - 0x54523960UL, 0xa8a472c0UL - }, - { - 0xb58b27b3UL, 0xb0674927UL, 0xbbbf940fUL, 0xac0e2e5fUL, 0x836d5affUL, - 0xddabb3bfUL, 0x6026613fUL, 0xc04cc27eUL, 0x5be882bdUL, 0xb7d1057aUL, - 0xb4d30cb5UL, 0xb2d71f2bUL, 0xbedf3817UL, 0xa6cf766fUL, 0x96efea9fUL, - 0xf6aed37fUL, 0x362ca0bfUL, 0x6c59417eUL, 0xd8b282fcUL, 0x6a1403b9UL, - 0xd4280772UL, 0x732108a5UL, 0xe642114aUL, 0x17f524d5UL, 0x2fea49aaUL, - 0x5fd49354UL, 0xbfa926a8UL, 0xa4234b11UL, 0x93379063UL, 0xfd1e2687UL, - 0x214d4b4fUL, 0x429a969eUL - }, - { - 0xfe273162UL, 0x273f6485UL, 0x4e7ec90aUL, 0x9cfd9214UL, 0xe28a2269UL, - 0x1e654293UL, 0x3cca8526UL, 0x79950a4cUL, 0xf32a1498UL, 0x3d252f71UL, - 0x7a4a5ee2UL, 0xf494bdc4UL, 0x32587dc9UL, 0x64b0fb92UL, 0xc961f724UL, - 0x49b2e809UL, 0x9365d012UL, 0xfdbaa665UL, 0x20044a8bUL, 0x40089516UL, - 0x80112a2cUL, 0xdb535219UL, 0x6dd7a273UL, 0xdbaf44e6UL, 0x6c2f8f8dUL, - 0xd85f1f1aUL, 0x6bcf3875UL, 0xd79e70eaUL, 0x744de795UL, 0xe89bcf2aUL, - 0x0a469815UL, 0x148d302aUL - }, - { - 0xd3c98813UL, 0x7ce21667UL, 0xf9c42cceUL, 0x28f95fddUL, 0x51f2bfbaUL, - 0xa3e57f74UL, 0x9cbbf8a9UL, 0xe206f713UL, 0x1f7ce867UL, 0x3ef9d0ceUL, - 0x7df3a19cUL, 0xfbe74338UL, 0x2cbf8031UL, 0x597f0062UL, 0xb2fe00c4UL, - 0xbe8d07c9UL, 0xa66b09d3UL, 0x97a715e7UL, 0xf43f2d8fUL, 0x330f5d5fUL, - 0x661ebabeUL, 0xcc3d757cUL, 0x430becb9UL, 0x8617d972UL, 0xd75eb4a5UL, - 0x75cc6f0bUL, 0xeb98de16UL, 0x0c40ba6dUL, 0x188174daUL, 0x3102e9b4UL, - 0x6205d368UL, 0xc40ba6d0UL - }, - { - 0xf7d6deb4UL, 0x34dcbb29UL, 0x69b97652UL, 0xd372eca4UL, 0x7d94df09UL, - 0xfb29be12UL, 0x2d227a65UL, 0x5a44f4caUL, 0xb489e994UL, 0xb262d569UL, - 0xbfb4ac93UL, 0xa4185f67UL, 0x9341b88fUL, 0xfdf2775fUL, 0x2095e8ffUL, - 0x412bd1feUL, 0x8257a3fcUL, 0xdfde41b9UL, 0x64cd8533UL, 0xc99b0a66UL, - 0x4847128dUL, 0x908e251aUL, 0xfa6d4c75UL, 0x2fab9eabUL, 0x5f573d56UL, - 0xbeae7aacUL, 0xa62df319UL, 0x972ae073UL, 0xf524c6a7UL, 0x31388b0fUL, - 0x6271161eUL, 0xc4e22c3cUL - }, - { - 0xedb88320UL, 0x00000001UL, 0x00000002UL, 0x00000004UL, 0x00000008UL, - 0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL, 0x00000100UL, - 0x00000200UL, 0x00000400UL, 0x00000800UL, 0x00001000UL, 0x00002000UL, - 0x00004000UL, 0x00008000UL, 0x00010000UL, 0x00020000UL, 0x00040000UL, - 0x00080000UL, 0x00100000UL, 0x00200000UL, 0x00400000UL, 0x00800000UL, - 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL, 0x10000000UL, - 0x20000000UL, 0x40000000UL - }, - { - 0x76dc4190UL, 0xedb88320UL, 0x00000001UL, 0x00000002UL, 0x00000004UL, - 0x00000008UL, 0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL, - 0x00000100UL, 0x00000200UL, 0x00000400UL, 0x00000800UL, 0x00001000UL, - 0x00002000UL, 0x00004000UL, 0x00008000UL, 0x00010000UL, 0x00020000UL, - 0x00040000UL, 0x00080000UL, 0x00100000UL, 0x00200000UL, 0x00400000UL, - 0x00800000UL, 0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL, - 0x10000000UL, 0x20000000UL - }, - { - 0x1db71064UL, 0x3b6e20c8UL, 0x76dc4190UL, 0xedb88320UL, 0x00000001UL, - 0x00000002UL, 0x00000004UL, 0x00000008UL, 0x00000010UL, 0x00000020UL, - 0x00000040UL, 0x00000080UL, 0x00000100UL, 0x00000200UL, 0x00000400UL, - 0x00000800UL, 0x00001000UL, 0x00002000UL, 0x00004000UL, 0x00008000UL, - 0x00010000UL, 0x00020000UL, 0x00040000UL, 0x00080000UL, 0x00100000UL, - 0x00200000UL, 0x00400000UL, 0x00800000UL, 0x01000000UL, 0x02000000UL, - 0x04000000UL, 0x08000000UL - } -}; -#endif /* CRC32_H_ */ +#endif /* CRC32_TBL_H_ */ diff --git a/libs/zlibng/deflate.c b/libs/zlibng/deflate.c index dd4edff0e..1707f75c2 100644 --- a/libs/zlibng/deflate.c +++ b/libs/zlibng/deflate.c @@ -47,15 +47,12 @@ * */ -/* @(#) $Id$ */ - #include "zbuild.h" #include "deflate.h" #include "deflate_p.h" -#include "match_p.h" #include "functable.h" -const char deflate_copyright[] = " deflate 1.2.11.f Copyright 1995-2016 Jean-loup Gailly and Mark Adler "; +const char PREFIX(deflate_copyright)[] = " deflate 1.2.11.f Copyright 1995-2016 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -83,7 +80,9 @@ const char deflate_copyright[] = " deflate 1.2.11.f Copyright 1995-2016 Jean-lou /* Invoked at the end of deflateResetKeep(). Useful for initializing arch-specific extension blocks. */ # define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0) /* Invoked at the beginning of deflateParams(). Useful for updating arch-specific compression parameters. */ -# define DEFLATE_PARAMS_HOOK(strm, level, strategy) do {} while (0) +# define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0) +/* Returns whether the last deflate(flush) operation did everything it's supposed to do. */ +# define DEFLATE_DONE(strm, flush) 1 /* Adjusts the upper bound on compressed data length based on compression parameters and uncompressed data length. * Useful when arch-specific deflation code behaves differently than regular zlib-ng algorithms. */ # define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0) @@ -94,6 +93,8 @@ const char deflate_copyright[] = " deflate 1.2.11.f Copyright 1995-2016 Jean-lou # define DEFLATE_HOOK(strm, flush, bstate) 0 /* Returns whether zlib-ng should compute a checksum. Set to 0 if arch-specific deflation code already does that. */ # define DEFLATE_NEED_CHECKSUM(strm) 1 +/* Returns whether reproducibility parameter can be set to a given value. */ +# define DEFLATE_CAN_SET_REPRODUCIBLE(strm, reproducible) 1 #endif /* =========================================================================== @@ -103,19 +104,17 @@ typedef block_state (*compress_func) (deflate_state *s, int flush); /* Compression function. Returns the block state after the call. */ static int deflateStateCheck (PREFIX3(stream) *strm); -static void slide_hash (deflate_state *s); static block_state deflate_stored (deflate_state *s, int flush); -ZLIB_INTERNAL block_state deflate_fast (deflate_state *s, int flush); -ZLIB_INTERNAL block_state deflate_quick (deflate_state *s, int flush); +Z_INTERNAL block_state deflate_fast (deflate_state *s, int flush); +Z_INTERNAL block_state deflate_quick (deflate_state *s, int flush); #ifndef NO_MEDIUM_STRATEGY -ZLIB_INTERNAL block_state deflate_medium (deflate_state *s, int flush); +Z_INTERNAL block_state deflate_medium (deflate_state *s, int flush); #endif -ZLIB_INTERNAL block_state deflate_slow (deflate_state *s, int flush); +Z_INTERNAL block_state deflate_slow (deflate_state *s, int flush); static block_state deflate_rle (deflate_state *s, int flush); static block_state deflate_huff (deflate_state *s, int flush); static void lm_init (deflate_state *s); -static void putShortMSB (deflate_state *s, uint16_t b); -ZLIB_INTERNAL unsigned read_buf (PREFIX3(stream) *strm, unsigned char *buf, unsigned size); +Z_INTERNAL unsigned read_buf (PREFIX3(stream) *strm, unsigned char *buf, unsigned size); extern void crc_reset(deflate_state *const s); #ifdef X86_PCLMULQDQ_CRC @@ -127,9 +126,6 @@ extern void copy_with_crc(PREFIX3(stream) *strm, unsigned char *dst, unsigned lo * Local data */ -#define NIL 0 -/* Tail of hash chains */ - /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be @@ -147,7 +143,7 @@ static const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -#ifdef X86_QUICK_STRATEGY +#ifndef NO_QUICK_STRATEGY /* 1 */ {4, 4, 8, 4, deflate_quick}, /* 2 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ #else @@ -181,12 +177,10 @@ static const config configuration_table[10] = { /* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. + * Initialize the hash table. prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) do { \ - s->head[s->hash_size - 1] = NIL; \ - memset((unsigned char *)s->head, 0, (unsigned)(s->hash_size - 1) * sizeof(*s->head)); \ + memset((unsigned char *)s->head, 0, HASH_SIZE * sizeof(*s->head)); \ } while (0) /* =========================================================================== @@ -194,80 +188,80 @@ static const config configuration_table[10] = { * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ -static void slide_hash(deflate_state *s) { - unsigned n; +Z_INTERNAL void slide_hash_c(deflate_state *s) { Pos *p; + unsigned n; unsigned int wsize = s->w_size; - n = s->hash_size; + n = HASH_SIZE; p = &s->head[n]; #ifdef NOT_TWEAK_COMPILER - do { - unsigned m; - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); + do { + unsigned m; + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : 0); + } while (--n); #else - /* As of I make this change, gcc (4.8.*) isn't able to vectorize - * this hot loop using saturated-subtraction on x86-64 architecture. - * To avoid this defect, we can change the loop such that - * o. the pointer advance forward, and - * o. demote the variable 'm' to be local to the loop, and - * choose type "Pos" (instead of 'unsigned int') for the - * variable to avoid unncessary zero-extension. - */ - { - unsigned int i; - Pos *q = p - n; - for (i = 0; i < n; i++) { - Pos m = *q; - Pos t = wsize; - *q++ = (Pos)(m >= t ? m-t: NIL); - } - } - + /* As of I make this change, gcc (4.8.*) isn't able to vectorize + * this hot loop using saturated-subtraction on x86-64 architecture. + * To avoid this defect, we can change the loop such that + * o. the pointer advance forward, and + * o. demote the variable 'm' to be local to the loop, and + * choose type "Pos" (instead of 'unsigned int') for the + * variable to avoid unncessary zero-extension. + */ + { + unsigned int i; + Pos *q = p - n; + for (i = 0; i < n; i++) { + Pos m = *q; + Pos t = (Pos)wsize; + *q++ = (Pos)(m >= t ? m-t: 0); + } + } #endif /* NOT_TWEAK_COMPILER */ - n = wsize; - p = &s->prev[n]; + + n = wsize; + p = &s->prev[n]; #ifdef NOT_TWEAK_COMPILER - do { - unsigned m; - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); + do { + unsigned m; + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); #else - { - unsigned int i; - Pos *q = p - n; - for (i = 0; i < n; i++) { - Pos m = *q; - Pos t = wsize; - *q++ = (Pos)(m >= t ? m-t: NIL); - } - } + { + unsigned int i; + Pos *q = p - n; + for (i = 0; i < n; i++) { + Pos m = *q; + Pos t = (Pos)wsize; + *q++ = (Pos)(m >= t ? m-t: 0); + } + } #endif /* NOT_TWEAK_COMPILER */ } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateInit_)(PREFIX3(stream) *strm, int level, const char *version, int stream_size) { +int32_t Z_EXPORT PREFIX(deflateInit_)(PREFIX3(stream) *strm, int32_t level, const char *version, int32_t stream_size) { return PREFIX(deflateInit2_)(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* Todo: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, int windowBits, - int memLevel, int strategy, const char *version, int stream_size) { - unsigned window_padding = 0; +int32_t Z_EXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int32_t level, int32_t method, int32_t windowBits, + int32_t memLevel, int32_t strategy, const char *version, int32_t stream_size) { + uint32_t window_padding = 0; deflate_state *s; int wrap = 1; static const char my_version[] = PREFIX2(VERSION); -#ifdef X86_CPUID +#if defined(X86_FEATURES) x86_check_features(); -#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) +#elif defined(ARM_FEATURES) arm_check_features(); #endif @@ -279,11 +273,11 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, strm->msg = NULL; if (strm->zalloc == NULL) { - strm->zalloc = zcalloc; + strm->zalloc = zng_calloc; strm->opaque = NULL; } if (strm->zfree == NULL) - strm->zfree = zcfree; + strm->zfree = zng_cfree; if (level == Z_DEFAULT_COMPRESSION) level = 6; @@ -305,7 +299,7 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ -#ifdef X86_QUICK_STRATEGY +#if !defined(NO_QUICK_STRATEGY) && !defined(S390_DFLTCC_DEFLATE) if (level == 1) windowBits = 13; #endif @@ -323,19 +317,6 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; -#ifdef X86_SSE4_2_CRC_HASH - if (x86_cpu_has_sse42) - s->hash_bits = (unsigned int)15; - else -#endif - s->hash_bits = (unsigned int)memLevel + 7; - - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; -#if !defined(__x86_64__) && !defined(_M_X64) && !defined(__i386) && !defined(_M_IX86) - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); -#endif - #ifdef X86_PCLMULQDQ_CRC window_padding = 8; #endif @@ -343,7 +324,7 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, s->window = (unsigned char *) ZALLOC_WINDOW(strm, s->w_size + window_padding, 2*sizeof(unsigned char)); s->prev = (Pos *) ZALLOC(strm, s->w_size, sizeof(Pos)); memset(s->prev, 0, s->w_size * sizeof(Pos)); - s->head = (Pos *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + s->head = (Pos *) ZALLOC(strm, HASH_SIZE, sizeof(Pos)); s->high_water = 0; /* nothing written to s->window yet */ @@ -389,10 +370,9 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, */ s->pending_buf = (unsigned char *) ZALLOC(strm, s->lit_bufsize, 4); - s->pending_buf_size = (unsigned long)s->lit_bufsize * 4; + s->pending_buf_size = s->lit_bufsize * 4; - if (s->window == NULL || s->prev == NULL || s->head == NULL || - s->pending_buf == NULL) { + if (s->window == NULL || s->prev == NULL || s->head == NULL || s->pending_buf == NULL) { s->status = FINISH_STATE; strm->msg = ERR_MSG(Z_MEM_ERROR); PREFIX(deflateEnd)(strm); @@ -407,8 +387,8 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, s->level = level; s->strategy = strategy; - s->method = (unsigned char)method; s->block_open = 0; + s->reproducible = 0; return PREFIX(deflateReset)(strm); } @@ -418,8 +398,7 @@ int ZEXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int level, int method, */ static int deflateStateCheck (PREFIX3(stream) *strm) { deflate_state *s; - if (strm == NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + if (strm == NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) return 1; s = strm->state; if (s == NULL || s->strm != strm || (s->status != INIT_STATE && @@ -437,7 +416,7 @@ static int deflateStateCheck (PREFIX3(stream) *strm) { } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateSetDictionary)(PREFIX3(stream) *strm, const unsigned char *dictionary, unsigned int dictLength) { +int32_t Z_EXPORT PREFIX(deflateSetDictionary)(PREFIX3(stream) *strm, const uint8_t *dictionary, uint32_t dictLength) { deflate_state *s; unsigned int str, n; int wrap; @@ -462,7 +441,7 @@ int ZEXPORT PREFIX(deflateSetDictionary)(PREFIX3(stream) *strm, const unsigned c if (wrap == 0) { /* already empty otherwise */ CLEAR_HASH(s); s->strstart = 0; - s->block_start = 0L; + s->block_start = 0; s->insert = 0; } dictionary += dictLength - s->w_size; /* use the tail */ @@ -473,30 +452,30 @@ int ZEXPORT PREFIX(deflateSetDictionary)(PREFIX3(stream) *strm, const unsigned c avail = strm->avail_in; next = strm->next_in; strm->avail_in = dictLength; - strm->next_in = (const unsigned char *)dictionary; - functable.fill_window(s); + strm->next_in = (z_const unsigned char *)dictionary; + fill_window(s); while (s->lookahead >= MIN_MATCH) { str = s->strstart; n = s->lookahead - (MIN_MATCH-1); functable.insert_string(s, str, n); s->strstart = str + n; s->lookahead = MIN_MATCH-1; - functable.fill_window(s); + fill_window(s); } s->strstart += s->lookahead; - s->block_start = (long)s->strstart; + s->block_start = (int)s->strstart; s->insert = s->lookahead; s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; + s->prev_length = MIN_MATCH-1; s->match_available = 0; - strm->next_in = next; + strm->next_in = (z_const unsigned char *)next; strm->avail_in = avail; s->wrap = wrap; return Z_OK; } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateGetDictionary)(PREFIX3(stream) *strm, unsigned char *dictionary, unsigned int *dictLength) { +int32_t Z_EXPORT PREFIX(deflateGetDictionary)(PREFIX3(stream) *strm, uint8_t *dictionary, uint32_t *dictLength) { deflate_state *s; unsigned int len; @@ -515,12 +494,11 @@ int ZEXPORT PREFIX(deflateGetDictionary)(PREFIX3(stream) *strm, unsigned char *d } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateResetKeep)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(deflateResetKeep)(PREFIX3(stream) *strm) { deflate_state *s; - if (deflateStateCheck(strm)) { + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; - } strm->total_in = strm->total_out = 0; strm->msg = NULL; /* use zfree if we ever allocate msg dynamically */ @@ -530,9 +508,9 @@ int ZEXPORT PREFIX(deflateResetKeep)(PREFIX3(stream) *strm) { s->pending = 0; s->pending_out = s->pending_buf; - if (s->wrap < 0) { + if (s->wrap < 0) s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } + s->status = #ifdef GZIP s->wrap == 2 ? GZIP_STATE : @@ -544,10 +522,10 @@ int ZEXPORT PREFIX(deflateResetKeep)(PREFIX3(stream) *strm) { crc_reset(s); else #endif - strm->adler = functable.adler32(0L, NULL, 0); + strm->adler = ADLER32_INITIAL_VALUE; s->last_flush = -2; - _tr_init(s); + zng_tr_init(s); DEFLATE_RESET_KEEP_HOOK(strm); /* hook for IBM Z DFLTCC */ @@ -555,7 +533,7 @@ int ZEXPORT PREFIX(deflateResetKeep)(PREFIX3(stream) *strm) { } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateReset)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(deflateReset)(PREFIX3(stream) *strm) { int ret; ret = PREFIX(deflateResetKeep)(strm); @@ -565,7 +543,7 @@ int ZEXPORT PREFIX(deflateReset)(PREFIX3(stream) *strm) { } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateSetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) head) { +int32_t Z_EXPORT PREFIX(deflateSetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) head) { if (deflateStateCheck(strm) || strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; @@ -573,7 +551,7 @@ int ZEXPORT PREFIX(deflateSetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) h } /* ========================================================================= */ -int ZEXPORT PREFIX(deflatePending)(PREFIX3(stream) *strm, uint32_t *pending, int *bits) { +int32_t Z_EXPORT PREFIX(deflatePending)(PREFIX3(stream) *strm, uint32_t *pending, int32_t *bits) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != NULL) @@ -584,33 +562,38 @@ int ZEXPORT PREFIX(deflatePending)(PREFIX3(stream) *strm, uint32_t *pending, int } /* ========================================================================= */ -int ZEXPORT PREFIX(deflatePrime)(PREFIX3(stream) *strm, int bits, int value) { +int32_t Z_EXPORT PREFIX(deflatePrime)(PREFIX3(stream) *strm, int32_t bits, int32_t value) { deflate_state *s; - int put; + uint64_t value64 = (uint64_t)value; + int32_t put; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - if (bits < 0 || bits > 16 || - s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) + if (bits < 0 || bits > BIT_BUF_SIZE || bits > (int32_t)(sizeof(value) << 3) || + s->sym_buf < s->pending_out + ((BIT_BUF_SIZE + 7) >> 3)) return Z_BUF_ERROR; do { - put = Buf_size - s->bi_valid; + put = BIT_BUF_SIZE - s->bi_valid; if (put > bits) put = bits; - s->bi_buf |= (uint16_t)((value & ((1 << put) - 1)) << s->bi_valid); + if (s->bi_valid == 0) + s->bi_buf = value64; + else + s->bi_buf |= (value64 & ((UINT64_C(1) << put) - 1)) << s->bi_valid; s->bi_valid += put; - _tr_flush_bits(s); - value >>= put; + zng_tr_flush_bits(s); + value64 >>= put; bits -= put; } while (bits); return Z_OK; } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateParams)(PREFIX3(stream) *strm, int level, int strategy) { +int32_t Z_EXPORT PREFIX(deflateParams)(PREFIX3(stream) *strm, int32_t level, int32_t strategy) { deflate_state *s; compress_func func; + int hook_flush = Z_NO_FLUSH; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -618,25 +601,25 @@ int ZEXPORT PREFIX(deflateParams)(PREFIX3(stream) *strm, int level, int strategy if (level == Z_DEFAULT_COMPRESSION) level = 6; - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) return Z_STREAM_ERROR; - } - DEFLATE_PARAMS_HOOK(strm, level, strategy); /* hook for IBM Z DFLTCC */ + DEFLATE_PARAMS_HOOK(strm, level, strategy, &hook_flush); /* hook for IBM Z DFLTCC */ func = configuration_table[s->level].func; - if ((strategy != s->strategy || func != configuration_table[level].func) && - s->last_flush != -2) { - /* Flush the last buffer: */ - int err = PREFIX(deflate)(strm, Z_BLOCK); + if (((strategy != s->strategy || func != configuration_table[level].func) && s->last_flush != -2) + || hook_flush != Z_NO_FLUSH) { + /* Flush the last buffer. Use Z_BLOCK mode, unless the hook requests a "stronger" one. */ + int flush = RANK(hook_flush) > RANK(Z_BLOCK) ? hook_flush : Z_BLOCK; + int err = PREFIX(deflate)(strm, flush); if (err == Z_STREAM_ERROR) return err; - if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) + if (strm->avail_in || ((int)s->strstart - s->block_start) + s->lookahead || !DEFLATE_DONE(strm, flush)) return Z_BUF_ERROR; } if (s->level != level) { if (s->level == 0 && s->matches != 0) { if (s->matches == 1) { - slide_hash(s); + functable.slide_hash(s); } else { CLEAR_HASH(s); } @@ -653,7 +636,7 @@ int ZEXPORT PREFIX(deflateParams)(PREFIX3(stream) *strm, int level, int strategy } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateTune)(PREFIX3(stream) *strm, int good_length, int max_lazy, int nice_length, int max_chain) { +int32_t Z_EXPORT PREFIX(deflateTune)(PREFIX3(stream) *strm, int32_t good_length, int32_t max_lazy, int32_t nice_length, int32_t max_chain) { deflate_state *s; if (deflateStateCheck(strm)) @@ -683,7 +666,7 @@ int ZEXPORT PREFIX(deflateTune)(PREFIX3(stream) *strm, int good_length, int max_ * upper bound of about 14% expansion does not seem onerous for output buffer * allocation. */ -unsigned long ZEXPORT PREFIX(deflateBound)(PREFIX3(stream) *strm, unsigned long sourceLen) { +unsigned long Z_EXPORT PREFIX(deflateBound)(PREFIX3(stream) *strm, unsigned long sourceLen) { deflate_state *s; unsigned long complen, wraplen; @@ -735,49 +718,39 @@ unsigned long ZEXPORT PREFIX(deflateBound)(PREFIX3(stream) *strm, unsigned long /* if not default parameters, return conservative bound */ if (DEFLATE_NEED_CONSERVATIVE_BOUND(strm) || /* hook for IBM Z DFLTCC */ - s->w_bits != 15 || s->hash_bits != 8 + 7) + s->w_bits != 15 || HASH_BITS < 15) return complen + wraplen; /* default settings: return tight bound for that case */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -static void putShortMSB(deflate_state *s, uint16_t b) { - put_byte(s, (unsigned char)(b >> 8)); - put_byte(s, (unsigned char)(b & 0xff)); -} - /* ========================================================================= * Flush as much pending output as possible. All deflate() output, except for * some deflate_stored() output, goes through this function so some * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ -ZLIB_INTERNAL void flush_pending(PREFIX3(stream) *strm) { +Z_INTERNAL void flush_pending(PREFIX3(stream) *strm) { uint32_t len; deflate_state *s = strm->state; - _tr_flush_bits(s); + zng_tr_flush_bits(s); len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; + Tracev((stderr, "[FLUSH]")); memcpy(strm->next_out, s->pending_out, len); strm->next_out += len; s->pending_out += len; strm->total_out += len; strm->avail_out -= len; s->pending -= len; - if (s->pending == 0) { + if (s->pending == 0) s->pending_out = s->pending_buf; - } } /* =========================================================================== @@ -790,21 +763,21 @@ ZLIB_INTERNAL void flush_pending(PREFIX3(stream) *strm) { } while (0) /* ========================================================================= */ -int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { - int old_flush; /* value of flush param for previous deflate call */ +int32_t Z_EXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int32_t flush) { + int32_t old_flush; /* value of flush param for previous deflate call */ deflate_state *s; - if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) return Z_STREAM_ERROR; - } s = strm->state; - if (strm->next_out == NULL || (strm->avail_in != 0 && strm->next_in == NULL) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { + if (strm->next_out == NULL || (strm->avail_in != 0 && strm->next_in == NULL) + || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } - if (strm->avail_out == 0) + if (strm->avail_out == 0) { ERR_RETURN(strm, Z_BUF_ERROR); + } old_flush = s->last_flush; s->last_flush = flush; @@ -823,17 +796,16 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { return Z_OK; } - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && - flush != Z_FINISH) { + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { + if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } @@ -854,17 +826,16 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { else level_flags = 3; header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; + if (s->strstart != 0) + header |= PRESET_DICT; header += 31 - (header % 31); - putShortMSB(s, header); + put_short_msb(s, (uint16_t)header); /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uint16_t)(strm->adler >> 16)); - putShortMSB(s, (uint16_t)(strm->adler)); - } - strm->adler = functable.adler32(0L, NULL, 0); + if (s->strstart != 0) + put_uint32_msb(s, strm->adler); + strm->adler = ADLER32_INITIAL_VALUE; s->status = BUSY_STATE; /* Compression must start with an empty pending buffer */ @@ -882,10 +853,7 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { put_byte(s, 139); put_byte(s, 8); if (s->gzhead == NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); + put_uint32(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); @@ -898,25 +866,18 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { s->last_flush = -1; return Z_OK; } - } - else { + } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == NULL ? 0 : 4) + (s->gzhead->name == NULL ? 0 : 8) + (s->gzhead->comment == NULL ? 0 : 16) ); - put_byte(s, (unsigned char)(s->gzhead->time & 0xff)); - put_byte(s, (unsigned char)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (unsigned char)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (unsigned char)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); + put_uint32(s, s->gzhead->time); + put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } + if (s->gzhead->extra != NULL) + put_short(s, (uint16_t)s->gzhead->extra_len); if (s->gzhead->hcrc) strm->adler = PREFIX(crc32)(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; @@ -952,7 +913,7 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { if (s->status == NAME_STATE) { if (s->gzhead->name != NULL) { uint32_t beg = s->pending; /* start of bytes to update crc */ - int val; + unsigned char val; do { if (s->pending == s->pending_buf_size) { @@ -975,7 +936,7 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { if (s->status == COMMENT_STATE) { if (s->gzhead->comment != NULL) { uint32_t beg = s->pending; /* start of bytes to update crc */ - int val; + unsigned char val; do { if (s->pending == s->pending_buf_size) { @@ -1003,8 +964,7 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { return Z_OK; } } - put_byte(s, (unsigned char)(strm->adler & 0xff)); - put_byte(s, (unsigned char)((strm->adler >> 8) & 0xff)); + put_short(s, (uint16_t)strm->adler); crc_reset(s); } s->status = BUSY_STATE; @@ -1027,9 +987,6 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { s->level == 0 ? deflate_stored(s, flush) : s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s->strategy == Z_RLE ? deflate_rle(s, flush) : -#ifdef X86_QUICK_STRATEGY - (s->level == 1 && !x86_cpu_has_sse42) ? deflate_fast(s, flush) : -#endif (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { @@ -1050,9 +1007,9 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); + zng_tr_align(s); } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); + zng_tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ @@ -1060,23 +1017,21 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { CLEAR_HASH(s); /* forget history */ if (s->lookahead == 0) { s->strstart = 0; - s->block_start = 0L; + s->block_start = 0; s->insert = 0; } } } flush_pending(strm); if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; } } } if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) - return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP @@ -1084,32 +1039,28 @@ int ZEXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int flush) { # ifdef X86_PCLMULQDQ_CRC crc_finalize(s); # endif - put_byte(s, (unsigned char)(strm->adler & 0xff)); - put_byte(s, (unsigned char)((strm->adler >> 8) & 0xff)); - put_byte(s, (unsigned char)((strm->adler >> 16) & 0xff)); - put_byte(s, (unsigned char)((strm->adler >> 24) & 0xff)); - put_byte(s, (unsigned char)(strm->total_in & 0xff)); - put_byte(s, (unsigned char)((strm->total_in >> 8) & 0xff)); - put_byte(s, (unsigned char)((strm->total_in >> 16) & 0xff)); - put_byte(s, (unsigned char)((strm->total_in >> 24) & 0xff)); + put_uint32(s, strm->adler); + put_uint32(s, (uint32_t)strm->total_in); } else #endif - { - putShortMSB(s, (uint16_t)(strm->adler >> 16)); - putShortMSB(s, (uint16_t)strm->adler); - } + if (s->wrap == 1) + put_uint32_msb(s, strm->adler); flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; + if (s->pending == 0) { + Assert(s->bi_valid == 0, "bi_buf not flushed"); + return Z_STREAM_END; + } + return Z_OK; } /* ========================================================================= */ -int ZEXPORT PREFIX(deflateEnd)(PREFIX3(stream) *strm) { - int status; +int32_t Z_EXPORT PREFIX(deflateEnd)(PREFIX3(stream) *strm) { + int32_t status; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1131,13 +1082,13 @@ int ZEXPORT PREFIX(deflateEnd)(PREFIX3(stream) *strm) { /* ========================================================================= * Copy the source state to the destination state. */ -int ZEXPORT PREFIX(deflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) { +int32_t Z_EXPORT PREFIX(deflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) { deflate_state *ds; deflate_state *ss; + uint32_t window_padding = 0; - if (deflateStateCheck(source) || dest == NULL) { + if (deflateStateCheck(source) || dest == NULL) return Z_STREAM_ERROR; - } ss = source->state; @@ -1150,9 +1101,13 @@ int ZEXPORT PREFIX(deflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) ZCOPY_STATE((void *)ds, (void *)ss, sizeof(deflate_state)); ds->strm = dest; - ds->window = (unsigned char *) ZALLOC_WINDOW(dest, ds->w_size, 2*sizeof(unsigned char)); +#ifdef X86_PCLMULQDQ_CRC + window_padding = 8; +#endif + + ds->window = (unsigned char *) ZALLOC_WINDOW(dest, ds->w_size + window_padding, 2*sizeof(unsigned char)); ds->prev = (Pos *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Pos *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + ds->head = (Pos *) ZALLOC(dest, HASH_SIZE, sizeof(Pos)); ds->pending_buf = (unsigned char *) ZALLOC(dest, ds->lit_bufsize, 4); if (ds->window == NULL || ds->prev == NULL || ds->head == NULL || ds->pending_buf == NULL) { @@ -1162,8 +1117,8 @@ int ZEXPORT PREFIX(deflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) memcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(unsigned char)); memcpy((void *)ds->prev, (void *)ss->prev, ds->w_size * sizeof(Pos)); - memcpy((void *)ds->head, (void *)ss->head, ds->hash_size * sizeof(Pos)); - memcpy(ds->pending_buf, ss->pending_buf, (unsigned int)ds->pending_buf_size); + memcpy((void *)ds->head, (void *)ss->head, HASH_SIZE * sizeof(Pos)); + memcpy(ds->pending_buf, ss->pending_buf, ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->sym_buf = ds->pending_buf + ds->lit_bufsize; @@ -1182,7 +1137,7 @@ int ZEXPORT PREFIX(deflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ -ZLIB_INTERNAL unsigned read_buf(PREFIX3(stream) *strm, unsigned char *buf, unsigned size) { +Z_INTERNAL unsigned read_buf(PREFIX3(stream) *strm, unsigned char *buf, unsigned size) { uint32_t len = strm->avail_in; if (len > size) @@ -1194,13 +1149,11 @@ ZLIB_INTERNAL unsigned read_buf(PREFIX3(stream) *strm, unsigned char *buf, unsig if (!DEFLATE_NEED_CHECKSUM(strm)) { memcpy(buf, strm->next_in, len); - } else #ifdef GZIP - if (strm->state->wrap == 2) + } else if (strm->state->wrap == 2) { copy_with_crc(strm, buf, len); - else #endif - { + } else { memcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) strm->adler = functable.adler32(strm->adler, buf, len); @@ -1215,7 +1168,7 @@ ZLIB_INTERNAL unsigned read_buf(PREFIX3(stream) *strm, unsigned char *buf, unsig * Initialize the "longest match" routines for a new zlib stream */ static void lm_init(deflate_state *s) { - s->window_size = (unsigned long)2L*s->w_size; + s->window_size = 2 * s->w_size; CLEAR_HASH(s); @@ -1227,13 +1180,12 @@ static void lm_init(deflate_state *s) { s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; - s->block_start = 0L; + s->block_start = 0; s->lookahead = 0; s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; + s->prev_length = MIN_MATCH-1; s->match_available = 0; s->match_start = 0; - s->ins_h = 0; } #ifdef ZLIB_DEBUG @@ -1243,12 +1195,23 @@ static void lm_init(deflate_state *s) { /* =========================================================================== * Check that the match at match_start is indeed a match. */ -void check_match(deflate_state *s, IPos start, IPos match, int length) { +void check_match(deflate_state *s, Pos start, Pos match, int length) { + /* check that the match length is valid*/ + if (length < MIN_MATCH || length > MAX_MATCH) { + fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); + z_error("invalid match length"); + } + /* check that the match isn't at the same position as the start string */ + if (match == start) { + fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); + z_error("invalid match position"); + } /* check that the match is indeed a match */ if (memcmp(s->window + match, s->window + start, length) != EQUAL) { + int32_t i = 0; fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + fprintf(stderr, " %03d: match [%02x] start [%02x]\n", i++, s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } @@ -1274,27 +1237,32 @@ void check_match(deflate_state *s, IPos start, IPos match, int length) { * option -- not supported here). */ -void ZLIB_INTERNAL fill_window_c(deflate_state *s) { +void Z_INTERNAL fill_window(deflate_state *s) { unsigned n; - unsigned more; /* Amount of free space at the end of the window. */ + unsigned int more; /* Amount of free space at the end of the window. */ unsigned int wsize = s->w_size; Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); do { - more = (unsigned)(s->window_size -(unsigned long)s->lookahead -(unsigned long)s->strstart); + more = s->window_size - s->lookahead - s->strstart; /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { - memcpy(s->window, s->window+wsize, (unsigned)wsize - more); - s->match_start -= wsize; + memcpy(s->window, s->window+wsize, (unsigned)wsize); + if (s->match_start >= wsize) { + s->match_start -= wsize; + } else { + s->match_start = 0; + s->prev_length = 0; + } s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; + s->block_start -= (int)wsize; if (s->insert > s->strstart) s->insert = s->strstart; - slide_hash(s); + functable.slide_hash(s); more += wsize; } if (s->strm->avail_in == 0) @@ -1319,13 +1287,12 @@ void ZLIB_INTERNAL fill_window_c(deflate_state *s) { /* Initialize the hash value now that we have some input: */ if (s->lookahead + s->insert >= MIN_MATCH) { unsigned int str = s->strstart - s->insert; - s->ins_h = s->window[str]; if (str >= 1) - functable.insert_string(s, str + 2 - MIN_MATCH, 1); + functable.quick_insert_string(s, str + 2 - MIN_MATCH); #if MIN_MATCH != 3 #error Call insert_string() MIN_MATCH-3 more times while (s->insert) { - functable.insert_string(s, str, 1); + functable.quick_insert_string(s, str); str++; s->insert--; if (s->lookahead + s->insert < MIN_MATCH) @@ -1333,13 +1300,15 @@ void ZLIB_INTERNAL fill_window_c(deflate_state *s) { } #else unsigned int count; - if (unlikely(s->lookahead == 1)){ + if (UNLIKELY(s->lookahead == 1)) { count = s->insert - 1; - }else{ + } else { count = s->insert; } - functable.insert_string(s,str,count); - s->insert -= count; + if (count > 0) { + functable.insert_string(s, str, count); + s->insert -= count; + } #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, @@ -1355,8 +1324,8 @@ void ZLIB_INTERNAL fill_window_c(deflate_state *s) { * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. */ if (s->high_water < s->window_size) { - unsigned long curr = s->strstart + (unsigned long)(s->lookahead); - unsigned long init; + unsigned int curr = s->strstart + s->lookahead; + unsigned int init; if (s->high_water < curr) { /* Previous high water mark below current data -- zero WIN_INIT @@ -1365,17 +1334,17 @@ void ZLIB_INTERNAL fill_window_c(deflate_state *s) { init = s->window_size - curr; if (init > WIN_INIT) init = WIN_INIT; - memset(s->window + curr, 0, (unsigned)init); + memset(s->window + curr, 0, init); s->high_water = curr + init; - } else if (s->high_water < (unsigned long)curr + WIN_INIT) { + } else if (s->high_water < curr + WIN_INIT) { /* High water mark at or above current data, but below current data * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up * to end of window, whichever is less. */ - init = (unsigned long)curr + WIN_INIT - s->high_water; + init = curr + WIN_INIT - s->high_water; if (init > s->window_size - s->high_water) init = s->window_size - s->high_water; - memset(s->window + s->high_water, 0, (unsigned)init); + memset(s->window + s->high_water, 0, init); s->high_water += init; } } @@ -1423,7 +1392,7 @@ static block_state deflate_stored(deflate_state *s, int flush) { break; /* maximum stored block length that will fit in avail_out: */ have = s->strm->avail_out - have; - left = s->strstart - s->block_start; /* bytes left in window */ + left = (int)s->strstart - s->block_start; /* bytes left in window */ if (len > (unsigned long)left + s->strm->avail_in) len = left + s->strm->avail_in; /* limit len to the input */ if (len > have) @@ -1441,22 +1410,19 @@ static block_state deflate_stored(deflate_state *s, int flush) { * including any pending bits. This also updates the debugging counts. */ last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; - _tr_stored_block(s, (char *)0, 0L, last); + zng_tr_stored_block(s, (char *)0, 0L, last); /* Replace the lengths in the dummy stored block with len. */ - s->pending_buf[s->pending - 4] = len; - s->pending_buf[s->pending - 3] = len >> 8; - s->pending_buf[s->pending - 2] = ~len; - s->pending_buf[s->pending - 1] = ~len >> 8; + s->pending -= 4; + put_short(s, (uint16_t)len); + put_short(s, (uint16_t)~len); /* Write the stored block header bytes. */ flush_pending(s->strm); -#ifdef ZLIB_DEBUG /* Update debugging counts for the data about to be copied. */ - s->compressed_len += len << 3; - s->bits_sent += len << 3; -#endif + cmpr_bits_add(s, len << 3); + sent_bits_add(s, len << 3); /* Copy uncompressed bytes from the window to next_out. */ if (left) { @@ -1466,7 +1432,7 @@ static block_state deflate_stored(deflate_state *s, int flush) { s->strm->next_out += left; s->strm->avail_out -= left; s->strm->total_out += left; - s->block_start += left; + s->block_start += (int)left; len -= left; } @@ -1497,8 +1463,7 @@ static block_state deflate_stored(deflate_state *s, int flush) { memcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; s->insert = s->strstart; - } - else { + } else { if (s->window_size - s->strstart <= used) { /* Slide the window down. */ s->strstart -= s->w_size; @@ -1512,7 +1477,7 @@ static block_state deflate_stored(deflate_state *s, int flush) { s->strstart += used; s->insert += MIN(used, s->w_size - s->insert); } - s->block_start = s->strstart; + s->block_start = (int)s->strstart; } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1522,15 +1487,14 @@ static block_state deflate_stored(deflate_state *s, int flush) { return finish_done; /* If flushing and all input has been consumed, then done. */ - if (flush != Z_NO_FLUSH && flush != Z_FINISH && - s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + if (flush != Z_NO_FLUSH && flush != Z_FINISH && s->strm->avail_in == 0 && (int)s->strstart == s->block_start) return block_done; /* Fill the window with any remaining input. */ have = s->window_size - s->strstart; - if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + if (s->strm->avail_in > have && s->block_start >= (int)s->w_size) { /* Slide the window down. */ - s->block_start -= s->w_size; + s->block_start -= (int)s->w_size; s->strstart -= s->w_size; memcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) @@ -1558,15 +1522,12 @@ static block_state deflate_stored(deflate_state *s, int flush) { /* maximum stored block length that will fit in pending: */ have = MIN(s->pending_buf_size - have, MAX_STORED); min_block = MIN(have, s->w_size); - left = s->strstart - s->block_start; - if (left >= min_block || - ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && - s->strm->avail_in == 0 && left <= have)) { + left = (int)s->strstart - s->block_start; + if (left >= min_block || ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && s->strm->avail_in == 0 && left <= have)) { len = MIN(left, have); - last = flush == Z_FINISH && s->strm->avail_in == 0 && - len == left ? 1 : 0; - _tr_stored_block(s, (char *)s->window + s->block_start, len, last); - s->block_start += len; + last = flush == Z_FINISH && s->strm->avail_in == 0 && len == left ? 1 : 0; + zng_tr_stored_block(s, (char *)s->window + s->block_start, len, last); + s->block_start += (int)len; flush_pending(s->strm); } @@ -1581,9 +1542,10 @@ static block_state deflate_stored(deflate_state *s, int flush) { * deflate switches away from Z_RLE.) */ static block_state deflate_rle(deflate_state *s, int flush) { - int bflush; /* set if current block must be flushed */ + int bflush = 0; /* set if current block must be flushed */ unsigned int prev; /* byte at distance one to match */ unsigned char *scan, *strend; /* scan goes up to strend for length of run */ + uint32_t match_len = 0; for (;;) { /* Make sure that we always have enough lookahead, except @@ -1591,16 +1553,14 @@ static block_state deflate_rle(deflate_state *s, int flush) { * for the longest run, plus one for the unrolled loop. */ if (s->lookahead <= MAX_MATCH) { - functable.fill_window(s); - if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) return need_more; - } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ - s->match_length = 0; if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; prev = *scan; @@ -1612,26 +1572,25 @@ static block_state deflate_rle(deflate_state *s, int flush) { prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && scan < strend); - s->match_length = MAX_MATCH - (unsigned int)(strend - scan); - if (s->match_length > s->lookahead) - s->match_length = s->lookahead; + match_len = MAX_MATCH - (unsigned int)(strend - scan); + if (match_len > s->lookahead) + match_len = s->lookahead; } - Assert(scan <= s->window+(unsigned int)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + s->window_size - 1, "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, s->match_length); + if (match_len >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, match_len); - _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + bflush = zng_tr_tally_dist(s, 1, match_len - MIN_MATCH); - s->lookahead -= s->match_length; - s->strstart += s->match_length; - s->match_length = 0; + s->lookahead -= match_len; + s->strstart += match_len; + match_len = 0; } else { /* No match, output a literal byte */ - Tracevv((stderr, "%c", s->window[s->strstart])); - _tr_tally_lit(s, s->window[s->strstart], bflush); + bflush = zng_tr_tally_lit(s, s->window[s->strstart]); s->lookahead--; s->strstart++; } @@ -1653,12 +1612,12 @@ static block_state deflate_rle(deflate_state *s, int flush) { * (It will be regenerated if this run of deflate switches away from Huffman.) */ static block_state deflate_huff(deflate_state *s, int flush) { - int bflush; /* set if current block must be flushed */ + int bflush = 0; /* set if current block must be flushed */ for (;;) { /* Make sure that we have a literal to write. */ if (s->lookahead == 0) { - functable.fill_window(s); + fill_window(s); if (s->lookahead == 0) { if (flush == Z_NO_FLUSH) return need_more; @@ -1667,9 +1626,7 @@ static block_state deflate_huff(deflate_state *s, int flush) { } /* Output a literal byte */ - s->match_length = 0; - Tracevv((stderr, "%c", s->window[s->strstart])); - _tr_tally_lit(s, s->window[s->strstart], bflush); + bflush = zng_tr_tally_lit(s, s->window[s->strstart]); s->lookahead--; s->strstart++; if (bflush) @@ -1685,28 +1642,141 @@ static block_state deflate_huff(deflate_state *s, int flush) { return block_done; } -#ifdef ZLIB_DEBUG -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. +#ifndef ZLIB_COMPAT +/* ========================================================================= + * Checks whether buffer size is sufficient and whether this parameter is a duplicate. */ -void send_bits(deflate_state *s, int value, int length) { - Tracevv((stderr, " l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (unsigned long)length; +static int32_t deflateSetParamPre(zng_deflate_param_value **out, size_t min_size, zng_deflate_param_value *param) { + int32_t buf_error = param->size < min_size; - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (uint16_t)value << s->bi_valid; - put_short(s, s->bi_buf); - s->bi_buf = (uint16_t)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= (uint16_t)value << s->bi_valid; - s->bi_valid += length; + if (*out != NULL) { + (*out)->status = Z_BUF_ERROR; + buf_error = 1; } + *out = param; + return buf_error; +} + +/* ========================================================================= */ +int32_t Z_EXPORT zng_deflateSetParams(zng_stream *strm, zng_deflate_param_value *params, size_t count) { + size_t i; + deflate_state *s; + zng_deflate_param_value *new_level = NULL; + zng_deflate_param_value *new_strategy = NULL; + zng_deflate_param_value *new_reproducible = NULL; + int param_buf_error; + int version_error = 0; + int buf_error = 0; + int stream_error = 0; + int ret; + int val; + + /* Initialize the statuses. */ + for (i = 0; i < count; i++) + params[i].status = Z_OK; + + /* Check whether the stream state is consistent. */ + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + + /* Check buffer sizes and detect duplicates. */ + for (i = 0; i < count; i++) { + switch (params[i].param) { + case Z_DEFLATE_LEVEL: + param_buf_error = deflateSetParamPre(&new_level, sizeof(int), ¶ms[i]); + break; + case Z_DEFLATE_STRATEGY: + param_buf_error = deflateSetParamPre(&new_strategy, sizeof(int), ¶ms[i]); + break; + case Z_DEFLATE_REPRODUCIBLE: + param_buf_error = deflateSetParamPre(&new_reproducible, sizeof(int), ¶ms[i]); + break; + default: + params[i].status = Z_VERSION_ERROR; + version_error = 1; + param_buf_error = 0; + break; + } + if (param_buf_error) { + params[i].status = Z_BUF_ERROR; + buf_error = 1; + } + } + /* Exit early if small buffers or duplicates are detected. */ + if (buf_error) + return Z_BUF_ERROR; + + /* Apply changes, remember if there were errors. */ + if (new_level != NULL || new_strategy != NULL) { + ret = PREFIX(deflateParams)(strm, new_level == NULL ? s->level : *(int *)new_level->buf, + new_strategy == NULL ? s->strategy : *(int *)new_strategy->buf); + if (ret != Z_OK) { + if (new_level != NULL) + new_level->status = Z_STREAM_ERROR; + if (new_strategy != NULL) + new_strategy->status = Z_STREAM_ERROR; + stream_error = 1; + } + } + if (new_reproducible != NULL) { + val = *(int *)new_reproducible->buf; + if (DEFLATE_CAN_SET_REPRODUCIBLE(strm, val)) { + s->reproducible = val; + } else { + new_reproducible->status = Z_STREAM_ERROR; + stream_error = 1; + } + } + + /* Report version errors only if there are no real errors. */ + return stream_error ? Z_STREAM_ERROR : (version_error ? Z_VERSION_ERROR : Z_OK); +} + +/* ========================================================================= */ +int32_t Z_EXPORT zng_deflateGetParams(zng_stream *strm, zng_deflate_param_value *params, size_t count) { + deflate_state *s; + size_t i; + int32_t buf_error = 0; + int32_t version_error = 0; + + /* Initialize the statuses. */ + for (i = 0; i < count; i++) + params[i].status = Z_OK; + + /* Check whether the stream state is consistent. */ + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + + for (i = 0; i < count; i++) { + switch (params[i].param) { + case Z_DEFLATE_LEVEL: + if (params[i].size < sizeof(int)) + params[i].status = Z_BUF_ERROR; + else + *(int *)params[i].buf = s->level; + break; + case Z_DEFLATE_STRATEGY: + if (params[i].size < sizeof(int)) + params[i].status = Z_BUF_ERROR; + else + *(int *)params[i].buf = s->strategy; + break; + case Z_DEFLATE_REPRODUCIBLE: + if (params[i].size < sizeof(int)) + params[i].status = Z_BUF_ERROR; + else + *(int *)params[i].buf = s->reproducible; + break; + default: + params[i].status = Z_VERSION_ERROR; + version_error = 1; + break; + } + if (params[i].status == Z_BUF_ERROR) + buf_error = 1; + } + return buf_error ? Z_BUF_ERROR : (version_error ? Z_VERSION_ERROR : Z_OK); } #endif diff --git a/libs/zlibng/deflate.h b/libs/zlibng/deflate.h index bbe8f6b07..03ea3126f 100644 --- a/libs/zlibng/deflate.h +++ b/libs/zlibng/deflate.h @@ -10,10 +10,8 @@ subject to change. Applications should only use zlib.h. */ -/* @(#) $Id$ */ - #include "zutil.h" -#include "gzendian.h" +#include "zendian.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in @@ -23,10 +21,6 @@ # define GZIP #endif -#define NIL 0 -/* Tail of hash chains */ - - /* =========================================================================== * Internal compression state. */ @@ -52,7 +46,7 @@ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ -#define Buf_size 16 +#define BIT_BUF_SIZE 64 /* size of bit buffer in bi_buf */ #define END_BLOCK 256 @@ -70,6 +64,10 @@ #define FINISH_STATE 666 /* stream complete */ /* Stream status */ +#define HASH_BITS 16u /* log2(HASH_SIZE) */ +#define HASH_SIZE 65536u /* number of elements in hash table */ +#define HASH_MASK (HASH_SIZE - 1u) /* HASH_SIZE-1 */ + /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { @@ -97,34 +95,47 @@ typedef struct tree_desc_s { } tree_desc; typedef uint16_t Pos; -typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. + * save space in the various tables. */ typedef struct internal_state { PREFIX3(stream) *strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ unsigned char *pending_buf; /* output still pending */ - unsigned long pending_buf_size; /* size of pending_buf */ unsigned char *pending_out; /* next pending byte to output to the stream */ + uint32_t pending_buf_size; /* size of pending_buf */ uint32_t pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - PREFIX(gz_headerp) gzhead; /* gzip header information to write */ uint32_t gzindex; /* where in extra, name, or comment */ - unsigned char method; /* can only be DEFLATED */ + PREFIX(gz_headerp) gzhead; /* gzip header information to write */ + int status; /* as the name implies */ int last_flush; /* value of flush param for previous deflate call */ + int reproducible; /* Whether reproducible compression results are required. */ -#ifdef X86_PCLMULQDQ_CRC - unsigned crc0[4 * 5]; -#endif + int block_open; + /* Whether or not a block is currently open for the QUICK deflation scheme. + * This is set to 1 if there is an active block, or 0 if the block was just closed. + */ /* used by deflate.c: */ unsigned int w_size; /* LZ77 window size (32K by default) */ unsigned int w_bits; /* log2(w_size) (8..16) */ unsigned int w_mask; /* w_size - 1 */ + unsigned int lookahead; /* number of valid bytes ahead in window */ + + unsigned int high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + + unsigned int window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ unsigned char *window; /* Sliding window. Input bytes are read into the second half of the window, @@ -136,44 +147,24 @@ typedef struct internal_state { * To do: use the user input buffer as sliding window. */ - unsigned long window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - Pos *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ - Pos *head; /* Heads of the hash chains or NIL. */ + Pos *head; /* Heads of the hash chains or 0. */ - unsigned int ins_h; /* hash index of string to be inserted */ - unsigned int hash_size; /* number of elements in hash table */ - unsigned int hash_bits; /* log2(hash_size) */ - unsigned int hash_mask; /* hash_size-1 */ - - #if !defined(__x86_64__) && !defined(_M_X64) && !defined(__i386) && !defined(_M_IX86) - unsigned int hash_shift; - #endif - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; + int block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ unsigned int match_length; /* length of best match */ - IPos prev_match; /* previous match */ + Pos prev_match; /* previous match */ int match_available; /* set if previous match exists */ unsigned int strstart; /* start of string to insert */ unsigned int match_start; /* start of matching string */ - unsigned int lookahead; /* number of valid bytes ahead in window */ unsigned int prev_length; /* Length of the best match at previous step. Matches not greater than this @@ -181,15 +172,13 @@ typedef struct internal_state { */ unsigned int max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. + /* To speed up deflation, hash chains are never searched beyond this length. + * A higher limit improves compression ratio but degrades the speed. */ unsigned int max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. + /* Attempt to find a better match only when the current match is strictly smaller + * than this value. This mechanism is used only for compression levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not @@ -205,6 +194,11 @@ typedef struct internal_state { int nice_match; /* Stop searching when current match exceeds this */ +#if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86) + /* Only used if X86_PCLMULQDQ_CRC is defined */ + unsigned crc0[4 * 5]; +#endif + /* used by trees.c: */ /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ @@ -229,8 +223,6 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ - unsigned char *sym_buf; /* buffer for distances and literals/lengths */ - unsigned int lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: @@ -251,41 +243,31 @@ typedef struct internal_state { * - I can't count above 4 */ - unsigned int sym_next; /* running index in sym_buf */ - unsigned int sym_end; /* symbol table full when sym_next reaches this */ + unsigned char *sym_buf; /* buffer for distances and literals/lengths */ + unsigned int sym_next; /* running index in sym_buf */ + unsigned int sym_end; /* symbol table full when sym_next reaches this */ unsigned long opt_len; /* bit length of current block with optimal trees */ unsigned long static_len; /* bit length of current block with static trees */ unsigned int matches; /* number of string matches in current block */ unsigned int insert; /* bytes at end of window left to insert */ -#ifdef ZLIB_DEBUG + /* compressed_len and bits_sent are only used if ZLIB_DEBUG is defined */ unsigned long compressed_len; /* total bit length of compressed file mod 2^32 */ unsigned long bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - uint16_t bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ + /* Reserved for future use and alignment purposes */ + char *reserved_p; - unsigned long high_water; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - int block_open; - /* Whether or not a block is currently open for the QUICK deflation scheme. - * This is set to 1 if there is an active block, or 0 if the block was just - * closed. - */ + uint64_t bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least significant bits). */ -} deflate_state; + int32_t bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit are always zero. */ + + /* Reserved for future use and alignment purposes */ + int32_t reserved[11]; +} ALIGNED_(8) deflate_state; typedef enum { need_more, /* block not completed, need more input or more output */ @@ -297,18 +279,88 @@ typedef enum { /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (unsigned char)(c);} +#define put_byte(s, c) { \ + s->pending_buf[s->pending++] = (unsigned char)(c); \ +} /* =========================================================================== * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. + * IN assertion: there is enough room in pending_buf. */ static inline void put_short(deflate_state *s, uint16_t w) { -#if BYTE_ORDER == BIG_ENDIAN - w = ZSWAP16(w); +#if defined(UNALIGNED_OK) + *(uint16_t *)(&s->pending_buf[s->pending]) = w; + s->pending += 2; +#else + put_byte(s, (w & 0xff)); + put_byte(s, ((w >> 8) & 0xff)); +#endif +} + +/* =========================================================================== + * Output a short MSB first on the stream. + * IN assertion: there is enough room in pending_buf. + */ +static inline void put_short_msb(deflate_state *s, uint16_t w) { + put_byte(s, ((w >> 8) & 0xff)); + put_byte(s, (w & 0xff)); +} + +/* =========================================================================== + * Output a 32-bit unsigned int LSB first on the stream. + * IN assertion: there is enough room in pending_buf. + */ +static inline void put_uint32(deflate_state *s, uint32_t dw) { +#if defined(UNALIGNED_OK) + *(uint32_t *)(&s->pending_buf[s->pending]) = dw; + s->pending += 4; +#else + put_byte(s, (dw & 0xff)); + put_byte(s, ((dw >> 8) & 0xff)); + put_byte(s, ((dw >> 16) & 0xff)); + put_byte(s, ((dw >> 24) & 0xff)); +#endif +} + +/* =========================================================================== + * Output a 32-bit unsigned int MSB first on the stream. + * IN assertion: there is enough room in pending_buf. + */ +static inline void put_uint32_msb(deflate_state *s, uint32_t dw) { +#if defined(UNALIGNED_OK) + *(uint32_t *)(&s->pending_buf[s->pending]) = ZSWAP32(dw); + s->pending += 4; +#else + put_byte(s, ((dw >> 24) & 0xff)); + put_byte(s, ((dw >> 16) & 0xff)); + put_byte(s, ((dw >> 8) & 0xff)); + put_byte(s, (dw & 0xff)); +#endif +} + +/* =========================================================================== + * Output a 64-bit unsigned int LSB first on the stream. + * IN assertion: there is enough room in pending_buf. + */ +static inline void put_uint64(deflate_state *s, uint64_t lld) { +#if defined(UNALIGNED64_OK) + *(uint64_t *)(&s->pending_buf[s->pending]) = lld; + s->pending += 8; +#elif defined(UNALIGNED_OK) + *(uint32_t *)(&s->pending_buf[s->pending]) = lld & 0xffffffff; + s->pending += 4; + *(uint32_t *)(&s->pending_buf[s->pending]) = (lld >> 32) & 0xffffffff; + s->pending += 4; +#else + put_byte(s, (lld & 0xff)); + put_byte(s, ((lld >> 8) & 0xff)); + put_byte(s, ((lld >> 16) & 0xff)); + put_byte(s, ((lld >> 24) & 0xff)); + put_byte(s, ((lld >> 32) & 0xff)); + put_byte(s, ((lld >> 40) & 0xff)); + put_byte(s, ((lld >> 48) & 0xff)); + put_byte(s, ((lld >> 56) & 0xff)); #endif - memcpy(&(s->pending_buf[s->pending]), &w, sizeof(uint16_t)); - s->pending += 2; } #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) @@ -326,120 +378,34 @@ static inline void put_short(deflate_state *s, uint16_t w) { memory checker errors from longest match routines */ -void ZLIB_INTERNAL fill_window_c(deflate_state *s); +void Z_INTERNAL fill_window(deflate_state *s); +void Z_INTERNAL slide_hash_c(deflate_state *s); /* in trees.c */ -void ZLIB_INTERNAL _tr_init(deflate_state *s); -int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc); -void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, char *buf, unsigned long stored_len, int last); -void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s); -void ZLIB_INTERNAL _tr_align(deflate_state *s); -void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, char *buf, unsigned long stored_len, int last); -void ZLIB_INTERNAL bi_windup(deflate_state *s); -unsigned ZLIB_INTERNAL bi_reverse(unsigned code, int len); -void ZLIB_INTERNAL flush_pending(PREFIX3(streamp) strm); - -#define d_code(dist) ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +void Z_INTERNAL zng_tr_init(deflate_state *s); +void Z_INTERNAL zng_tr_flush_block(deflate_state *s, char *buf, uint32_t stored_len, int last); +void Z_INTERNAL zng_tr_flush_bits(deflate_state *s); +void Z_INTERNAL zng_tr_align(deflate_state *s); +void Z_INTERNAL zng_tr_stored_block(deflate_state *s, char *buf, uint32_t stored_len, int last); +unsigned Z_INTERNAL bi_reverse(unsigned code, int len); +void Z_INTERNAL flush_pending(PREFIX3(streamp) strm); +#define d_code(dist) ((dist) < 256 ? zng_dist_code[dist] : zng_dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never + * must not have side effects. zng_dist_code[256] and zng_dist_code[257] are never * used. */ -#ifndef ZLIB_DEBUG -/* Inline versions of _tr_tally for speed: */ - -# if defined(GEN_TREES_H) - extern unsigned char ZLIB_INTERNAL _length_code[]; - extern unsigned char ZLIB_INTERNAL _dist_code[]; -# else - extern const unsigned char ZLIB_INTERNAL _length_code[]; - extern const unsigned char ZLIB_INTERNAL _dist_code[]; -# endif - -# define _tr_tally_lit(s, c, flush) \ - { unsigned char cc = (c); \ - s->sym_buf[s->sym_next++] = 0; \ - s->sym_buf[s->sym_next++] = 0; \ - s->sym_buf[s->sym_next++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->sym_next == s->sym_end); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { unsigned char len = (unsigned char)(length); \ - uint16_t dist = (uint16_t)(distance); \ - s->sym_buf[s->sym_next++] = dist; \ - s->sym_buf[s->sym_next++] = dist >> 8; \ - s->sym_buf[s->sym_next++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->sym_next == s->sym_end); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, (unsigned)(distance), (unsigned)(length)) -#endif - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ - -#ifdef NOT_TWEAK_COMPILER -#define TRIGGER_LEVEL 6 -#else -#define TRIGGER_LEVEL 5 -#endif - -#if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86) -#define UPDATE_HASH(s, h, i) \ - do {\ - if (s->level < TRIGGER_LEVEL) \ - h = (3483 * (s->window[i]) +\ - 23081* (s->window[i+1]) +\ - 6954 * (s->window[i+2]) +\ - 20947* (s->window[i+3])) & s->hash_mask;\ - else\ - h = (25881* (s->window[i]) +\ - 24674* (s->window[i+1]) +\ - 25811* (s->window[i+2])) & s->hash_mask;\ - } while (0) -#else -# define UPDATE_HASH(s, h, i) (h = (((h) << s->hash_shift) ^ (s->window[i + (MIN_MATCH-1)])) & s->hash_mask) -#endif - -#ifndef ZLIB_DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) -/* Send a code of the given tree. c and tree must not have side effects */ - -#else /* ZLIB_DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose > 2) { \ - fprintf(stderr, "\ncd %3d ", (c)); \ - } \ - send_bits(s, tree[c].Code, tree[c].Len); \ - } -#endif - +/* Bit buffer and compress bits calculation debugging */ #ifdef ZLIB_DEBUG -void send_bits(deflate_state *s, int value, int length); +# define cmpr_bits_add(s, len) s->compressed_len += (len) +# define cmpr_bits_align(s) s->compressed_len = (s->compressed_len + 7) & ~7L +# define sent_bits_add(s, bits) s->bits_sent += (bits) +# define sent_bits_align(s) s->bits_sent = (s->bits_sent + 7) & ~7L #else -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = (int)value;\ - s->bi_buf |= (uint16_t)val << s->bi_valid;\ - put_short(s, s->bi_buf);\ - s->bi_buf = (uint16_t)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (uint16_t)(value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} +# define cmpr_bits_add(s, len) (void)(len) +# define cmpr_bits_align(s) +# define sent_bits_add(s, bits) (void)(bits) +# define sent_bits_align(s) #endif #endif /* DEFLATE_H_ */ diff --git a/libs/zlibng/deflate_fast.c b/libs/zlibng/deflate_fast.c index 07f29f396..14718ba14 100644 --- a/libs/zlibng/deflate_fast.c +++ b/libs/zlibng/deflate_fast.c @@ -7,7 +7,6 @@ #include "zbuild.h" #include "deflate.h" #include "deflate_p.h" -#include "match_p.h" #include "functable.h" /* =========================================================================== @@ -17,9 +16,11 @@ * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ -ZLIB_INTERNAL block_state deflate_fast(deflate_state *s, int flush) { - IPos hash_head; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ +Z_INTERNAL block_state deflate_fast(deflate_state *s, int flush) { + Pos hash_head; /* head of the hash chain */ + int bflush = 0; /* set if current block must be flushed */ + int64_t dist; + uint32_t match_len = 0; for (;;) { /* Make sure that we always have enough lookahead, except @@ -28,93 +29,78 @@ ZLIB_INTERNAL block_state deflate_fast(deflate_state *s, int flush) { * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { - functable.fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + fill_window(s); + if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH)) { return need_more; } - if (s->lookahead == 0) + if (UNLIKELY(s->lookahead == 0)) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ - hash_head = NIL; if (s->lookahead >= MIN_MATCH) { - hash_head = functable.insert_string(s, s->strstart, 1); - } + hash_head = functable.quick_insert_string(s, s->strstart); + dist = (int64_t)s->strstart - hash_head; - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match length < MIN_MATCH */ - s->match_length = longest_match(s, hash_head); - /* longest_match() sets match_start */ + + if (dist <= MAX_DIST(s) && dist > 0) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + match_len = functable.longest_match(s, hash_head); + /* longest_match() sets match_start */ + } } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); + if (match_len >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, match_len); - s->lookahead -= s->match_length; + bflush = zng_tr_tally_dist(s, s->strstart - s->match_start, match_len - MIN_MATCH); + + s->lookahead -= match_len; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ - if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ + if (match_len <= s->max_insert_length && s->lookahead >= MIN_MATCH) { + match_len--; /* string at strstart already in table */ s->strstart++; -#ifdef NOT_TWEAK_COMPILER - do { - functable.insert_string(s, s->strstart, 1); - s->strstart++; - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); -#else - { - functable.insert_string(s, s->strstart, s->match_length); - s->strstart += s->match_length; - s->match_length = 0; - } -#endif + + functable.insert_string(s, s->strstart, match_len); + s->strstart += match_len; } else { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; -#ifndef NOT_TWEAK_COMPILER + s->strstart += match_len; +#if MIN_MATCH != 3 functable.insert_string(s, s->strstart + 2 - MIN_MATCH, MIN_MATCH - 2); #else - functable.insert_string(s, s->strstart + 2 - MIN_MATCH, 1); -#if MIN_MATCH != 3 -#warning Call insert_string() MIN_MATCH-3 more times -#endif + functable.quick_insert_string(s, s->strstart + 2 - MIN_MATCH); #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } + match_len = 0; } else { /* No match, output a literal byte */ - Tracevv((stderr, "%c", s->window[s->strstart])); - _tr_tally_lit(s, s->window[s->strstart], bflush); + bflush = zng_tr_tally_lit(s, s->window[s->strstart]); s->lookahead--; s->strstart++; } - if (bflush) + if (UNLIKELY(bflush)) FLUSH_BLOCK(s, 0); } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { + if (UNLIKELY(flush == Z_FINISH)) { FLUSH_BLOCK(s, 1); return finish_done; } - if (s->sym_next) + if (UNLIKELY(s->sym_next)) FLUSH_BLOCK(s, 0); return block_done; } diff --git a/libs/zlibng/deflate_medium.c b/libs/zlibng/deflate_medium.c index 330d255c8..dad550cd1 100644 --- a/libs/zlibng/deflate_medium.c +++ b/libs/zlibng/deflate_medium.c @@ -7,72 +7,50 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef NO_MEDIUM_STRATEGY +#include #include "zbuild.h" #include "deflate.h" #include "deflate_p.h" -#include "match_p.h" #include "functable.h" struct match { - unsigned int match_start; - unsigned int match_length; - unsigned int strstart; - unsigned int orgstart; + uint16_t match_start; + uint16_t match_length; + uint16_t strstart; + uint16_t orgstart; }; -#define MAX_DIST2 ((1 << MAX_WBITS) - MIN_LOOKAHEAD) - -static int tr_tally_dist(deflate_state *s, int distance, int length) { - return _tr_tally(s, distance, length); -} - -static int tr_tally_lit(deflate_state *s, int c) { - return _tr_tally(s, 0, c); -} - static int emit_match(deflate_state *s, struct match match) { - int flush = 0; + int bflush = 0; /* matches that are not long enough we need to emit as literals */ if (match.match_length < MIN_MATCH) { while (match.match_length) { - flush += tr_tally_lit(s, s->window[match.strstart]); + bflush += zng_tr_tally_lit(s, s->window[match.strstart]); s->lookahead--; match.strstart++; match.match_length--; } - return flush; + return bflush; } check_match(s, match.strstart, match.match_start, match.match_length); - flush += tr_tally_dist(s, match.strstart - match.match_start, match.match_length - MIN_MATCH); + bflush += zng_tr_tally_dist(s, match.strstart - match.match_start, match.match_length - MIN_MATCH); s->lookahead -= match.match_length; - return flush; + return bflush; } static void insert_match(deflate_state *s, struct match match) { - if (unlikely(s->lookahead <= match.match_length + MIN_MATCH)) + if (UNLIKELY(s->lookahead <= (unsigned int)(match.match_length + MIN_MATCH))) return; /* matches that are not long enough we need to emit as literals */ - if (match.match_length < MIN_MATCH) { -#ifdef NOT_TWEAK_COMPILER - while (match.match_length) { - match.strstart++; - match.match_length--; - - if (match.match_length) { - if (match.strstart >= match.orgstart) { - functable.insert_string(s, match.strstart, 1); - } - } - } -#else + if (LIKELY(match.match_length < MIN_MATCH)) { match.strstart++; match.match_length--; - if (match.match_length > 0) { + if (UNLIKELY(match.match_length > 0)) { if (match.strstart >= match.orgstart) { if (match.strstart + match.match_length - 1 >= match.orgstart) { functable.insert_string(s, match.strstart, match.match_length); @@ -83,7 +61,6 @@ static void insert_match(deflate_state *s, struct match match) { match.match_length = 0; } } -#endif return; } @@ -93,48 +70,35 @@ static void insert_match(deflate_state *s, struct match match) { if (match.match_length <= 16* s->max_insert_length && s->lookahead >= MIN_MATCH) { match.match_length--; /* string at strstart already in table */ match.strstart++; -#ifdef NOT_TWEAK_COMPILER - do { - if (likely(match.strstart >= match.orgstart)) { - functable.insert_string(s, match.strstart, 1); - } - match.strstart++; - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--match.match_length != 0); -#else - if (likely(match.strstart >= match.orgstart)) { - if (likely(match.strstart + match.match_length - 1 >= match.orgstart)) { + + if (LIKELY(match.strstart >= match.orgstart)) { + if (LIKELY(match.strstart + match.match_length - 1 >= match.orgstart)) { functable.insert_string(s, match.strstart, match.match_length); } else { functable.insert_string(s, match.strstart, match.orgstart - match.strstart + 1); } + } else if (match.orgstart < match.strstart + match.match_length) { + functable.insert_string(s, match.orgstart, match.strstart + match.match_length - match.orgstart); } match.strstart += match.match_length; match.match_length = 0; -#endif } else { match.strstart += match.match_length; match.match_length = 0; - s->ins_h = s->window[match.strstart]; if (match.strstart >= (MIN_MATCH - 2)) -#ifndef NOT_TWEAK_COMPILER +#if MIN_MATCH != 3 functable.insert_string(s, match.strstart + 2 - MIN_MATCH, MIN_MATCH - 2); #else - functable.insert_string(s, match.strstart + 2 - MIN_MATCH, 1); -#if MIN_MATCH != 3 -#warning Call insert_string() MIN_MATCH-3 more times + functable.quick_insert_string(s, match.strstart + 2 - MIN_MATCH); #endif -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ } } static void fizzle_matches(deflate_state *s, struct match *current, struct match *next) { - IPos limit; + Pos limit; unsigned char *match, *orig; int changed = 0; struct match c, n; @@ -143,36 +107,36 @@ static void fizzle_matches(deflate_state *s, struct match *current, struct match if (current->match_length <= 1) return; - if (unlikely(current->match_length > 1 + next->match_start)) + if (UNLIKELY(current->match_length > 1 + next->match_start)) return; - if (unlikely(current->match_length > 1 + next->strstart)) + if (UNLIKELY(current->match_length > 1 + next->strstart)) return; match = s->window - current->match_length + 1 + next->match_start; orig = s->window - current->match_length + 1 + next->strstart; /* quick exit check.. if this fails then don't bother with anything else */ - if (likely(*match != *orig)) + if (LIKELY(*match != *orig)) return; c = *current; n = *next; /* step one: try to move the "next" match to the left as much as possible */ - limit = next->strstart > MAX_DIST2 ? next->strstart - MAX_DIST2 : 0; + limit = next->strstart > MAX_DIST(s) ? next->strstart - (Pos)MAX_DIST(s) : 0; match = s->window + n.match_start - 1; orig = s->window + n.strstart - 1; while (*match == *orig) { - if (c.match_length < 1) + if (UNLIKELY(c.match_length < 1)) break; - if (n.strstart <= limit) + if (UNLIKELY(n.strstart <= limit)) break; - if (n.match_length >= 256) + if (UNLIKELY(n.match_length >= 256)) break; - if (n.match_start <= 1) + if (UNLIKELY(n.match_start <= 1)) break; n.strstart--; @@ -196,15 +160,18 @@ static void fizzle_matches(deflate_state *s, struct match *current, struct match } } -ZLIB_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { - struct match current_match, next_match; +Z_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { + /* Align the first struct to start on a new cacheline, this allows us to fit both structs in one cacheline */ + ALIGNED_(16) struct match current_match; + struct match next_match; memset(¤t_match, 0, sizeof(struct match)); memset(&next_match, 0, sizeof(struct match)); for (;;) { - IPos hash_head = 0; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ + Pos hash_head = 0; /* head of the hash chain */ + int bflush = 0; /* set if current block must be flushed */ + int64_t dist; /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes @@ -212,15 +179,14 @@ ZLIB_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { * string following the next current_match. */ if (s->lookahead < MIN_LOOKAHEAD) { - functable.fill_window(s); + fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } - if (s->lookahead == 0) + if (UNLIKELY(s->lookahead == 0)) break; /* flush the current block */ next_match.match_length = 0; } - s->prev_length = 2; /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: @@ -230,63 +196,63 @@ ZLIB_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { if (next_match.match_length > 0) { current_match = next_match; next_match.match_length = 0; - } else { hash_head = 0; if (s->lookahead >= MIN_MATCH) { - hash_head = functable.insert_string(s, s->strstart, 1); + hash_head = functable.quick_insert_string(s, s->strstart); } - /* set up the initial match to be a 1 byte literal */ - current_match.match_start = 0; - current_match.match_length = 1; - current_match.strstart = s->strstart; + current_match.strstart = (uint16_t)s->strstart; current_match.orgstart = current_match.strstart; /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ - if (hash_head != 0 && s->strstart - hash_head <= MAX_DIST2) { + dist = (int64_t)s->strstart - hash_head; + if (dist <= MAX_DIST(s) && dist > 0) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ - current_match.match_length = longest_match(s, hash_head); - current_match.match_start = s->match_start; - if (current_match.match_length < MIN_MATCH) + current_match.match_length = (uint16_t)functable.longest_match(s, hash_head); + current_match.match_start = (uint16_t)s->match_start; + if (UNLIKELY(current_match.match_length < MIN_MATCH)) current_match.match_length = 1; - if (current_match.match_start >= current_match.strstart) { + if (UNLIKELY(current_match.match_start >= current_match.strstart)) { /* this can happen due to some restarts */ current_match.match_length = 1; } + } else { + /* Set up the match to be a 1 byte literal */ + current_match.match_start = 0; + current_match.match_length = 1; } } insert_match(s, current_match); /* now, look ahead one */ - if (s->lookahead > MIN_LOOKAHEAD && (current_match.strstart + current_match.match_length) < (s->window_size - MIN_LOOKAHEAD)) { + if (LIKELY(s->lookahead > MIN_LOOKAHEAD && (uint32_t)(current_match.strstart + current_match.match_length) < (s->window_size - MIN_LOOKAHEAD))) { s->strstart = current_match.strstart + current_match.match_length; - hash_head = functable.insert_string(s, s->strstart, 1); + hash_head = functable.quick_insert_string(s, s->strstart); - /* set up the initial match to be a 1 byte literal */ - next_match.match_start = 0; - next_match.match_length = 1; - next_match.strstart = s->strstart; + next_match.strstart = (uint16_t)s->strstart; next_match.orgstart = next_match.strstart; /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ - if (hash_head != 0 && s->strstart - hash_head <= MAX_DIST2) { + + dist = (int64_t)s->strstart - hash_head; + if (dist <= MAX_DIST(s) && dist > 0) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ - next_match.match_length = longest_match(s, hash_head); - next_match.match_start = s->match_start; - if (next_match.match_start >= next_match.strstart) { + next_match.match_length = (uint16_t)functable.longest_match(s, hash_head); + next_match.match_start = (uint16_t)s->match_start; + if (UNLIKELY(next_match.match_start >= next_match.strstart)) { /* this can happen due to some restarts */ next_match.match_length = 1; } @@ -294,13 +260,13 @@ ZLIB_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { next_match.match_length = 1; else fizzle_matches(s, ¤t_match, &next_match); + } else { + /* Set up the match to be a 1 byte literal */ + next_match.match_start = 0; + next_match.match_length = 1; } - /* short matches with a very long distance are rarely a good idea encoding wise */ - if (next_match.match_length == 3 && (next_match.strstart - next_match.match_start) > 12000) - next_match.match_length = 1; s->strstart = current_match.strstart; - } else { next_match.match_length = 0; } @@ -311,7 +277,7 @@ ZLIB_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { /* move the "cursor" forward */ s->strstart += current_match.match_length; - if (bflush) + if (UNLIKELY(bflush)) FLUSH_BLOCK(s, 0); } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; @@ -319,7 +285,7 @@ ZLIB_INTERNAL block_state deflate_medium(deflate_state *s, int flush) { FLUSH_BLOCK(s, 1); return finish_done; } - if (s->sym_next) + if (UNLIKELY(s->sym_next)) FLUSH_BLOCK(s, 0); return block_done; diff --git a/libs/zlibng/deflate_p.h b/libs/zlibng/deflate_p.h index 69a7c82a0..102a4de06 100644 --- a/libs/zlibng/deflate_p.h +++ b/libs/zlibng/deflate_p.h @@ -12,39 +12,45 @@ /* Forward declare common non-inlined functions declared in deflate.c */ #ifdef ZLIB_DEBUG -void check_match(deflate_state *s, IPos start, IPos match, int length); +void check_match(deflate_state *s, Pos start, Pos match, int length); #else #define check_match(s, start, match, length) #endif void flush_pending(PREFIX3(stream) *strm); /* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. */ -static inline Pos insert_string_c(deflate_state *const s, const Pos str, unsigned int count) { - Pos ret = 0; - unsigned int idx; +extern const unsigned char Z_INTERNAL zng_length_code[]; +extern const unsigned char Z_INTERNAL zng_dist_code[]; - for (idx = 0; idx < count; idx++) { - UPDATE_HASH(s, s->ins_h, str+idx); +static inline int zng_tr_tally_lit(deflate_state *s, unsigned char c) { + /* c is the unmatched char */ + s->sym_buf[s->sym_next++] = 0; + s->sym_buf[s->sym_next++] = 0; + s->sym_buf[s->sym_next++] = c; + s->dyn_ltree[c].Freq++; + Tracevv((stderr, "%c", c)); + Assert(c <= (MAX_MATCH-MIN_MATCH), "zng_tr_tally: bad literal"); + return (s->sym_next == s->sym_end); +} - Pos head = s->head[s->ins_h]; - if (head != str+idx) { - s->prev[(str+idx) & s->w_mask] = head; - s->head[s->ins_h] = str+idx; - if (idx == count - 1) - ret = head; - } else if (idx == count - 1) { - ret = str + idx; - } - } - return ret; +static inline int zng_tr_tally_dist(deflate_state *s, uint32_t dist, uint32_t len) { + /* dist: distance of matched string */ + /* len: match length-MIN_MATCH */ + s->sym_buf[s->sym_next++] = (uint8_t)(dist); + s->sym_buf[s->sym_next++] = (uint8_t)(dist >> 8); + s->sym_buf[s->sym_next++] = (uint8_t)len; + s->matches++; + dist--; + Assert(dist < MAX_DIST(s) && (uint16_t)d_code(dist) < (uint16_t)D_CODES, + "zng_tr_tally: bad match"); + + s->dyn_ltree[zng_length_code[len]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + return (s->sym_next == s->sym_end); } /* =========================================================================== @@ -52,14 +58,13 @@ static inline Pos insert_string_c(deflate_state *const s, const Pos str, unsigne * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, last) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ + zng_tr_flush_block(s, (s->block_start >= 0 ? \ (char *)&s->window[(unsigned)s->block_start] : \ NULL), \ - (unsigned long)((long)s->strstart - s->block_start), \ + (uint32_t)((int)s->strstart - s->block_start), \ (last)); \ - s->block_start = s->strstart; \ + s->block_start = (int)s->strstart; \ flush_pending(s->strm); \ - Tracev((stderr, "[FLUSH]")); \ } /* Same but force premature exit if necessary. */ diff --git a/libs/zlibng/deflate_quick.c b/libs/zlibng/deflate_quick.c new file mode 100644 index 000000000..268cce80d --- /dev/null +++ b/libs/zlibng/deflate_quick.c @@ -0,0 +1,121 @@ +/* + * The deflate_quick deflate strategy, designed to be used when cycles are + * at a premium. + * + * Copyright (C) 2013 Intel Corporation. All rights reserved. + * Authors: + * Wajdi Feghali + * Jim Guilford + * Vinodh Gopal + * Erdinc Ozturk + * Jim Kukunas + * + * Portions are Copyright (C) 2016 12Sided Technology, LLC. + * Author: + * Phil Vachon + * + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zbuild.h" +#include "deflate.h" +#include "deflate_p.h" +#include "functable.h" +#include "trees_emit.h" + +extern const ct_data static_ltree[L_CODES+2]; +extern const ct_data static_dtree[D_CODES]; + +#define QUICK_START_BLOCK(s, last) { \ + zng_tr_emit_tree(s, STATIC_TREES, last); \ + s->block_open = 1 + (int)last; \ + s->block_start = (int)s->strstart; \ +} + +#define QUICK_END_BLOCK(s, last) { \ + if (s->block_open) { \ + zng_tr_emit_end_block(s, static_ltree, last); \ + s->block_open = 0; \ + s->block_start = (int)s->strstart; \ + flush_pending(s->strm); \ + if (s->strm->avail_out == 0) \ + return (last) ? finish_started : need_more; \ + } \ +} + +Z_INTERNAL block_state deflate_quick(deflate_state *s, int flush) { + Pos hash_head; + int64_t dist; + unsigned match_len, last; + + + last = (flush == Z_FINISH) ? 1 : 0; + if (UNLIKELY(last && s->block_open != 2)) { + /* Emit end of previous block */ + QUICK_END_BLOCK(s, 0); + /* Emit start of last block */ + QUICK_START_BLOCK(s, last); + } else if (UNLIKELY(s->block_open == 0 && s->lookahead > 0)) { + /* Start new block only when we have lookahead data, so that if no + input data is given an empty block will not be written */ + QUICK_START_BLOCK(s, last); + } + + for (;;) { + if (UNLIKELY(s->pending + ((BIT_BUF_SIZE + 7) >> 3) >= s->pending_buf_size)) { + flush_pending(s->strm); + if (s->strm->avail_out == 0) { + return (last && s->strm->avail_in == 0) ? finish_started : need_more; + } + } + + if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD)) { + fill_window(s); + if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH)) { + return need_more; + } + if (UNLIKELY(s->lookahead == 0)) + break; + + if (UNLIKELY(s->block_open == 0)) { + /* Start new block when we have lookahead data, so that if no + input data is given an empty block will not be written */ + QUICK_START_BLOCK(s, last); + } + } + + if (LIKELY(s->lookahead >= MIN_MATCH)) { + hash_head = functable.quick_insert_string(s, s->strstart); + dist = (int64_t)s->strstart - hash_head; + + if (dist <= MAX_DIST(s) && dist > 0) { + match_len = functable.compare258(s->window + s->strstart, s->window + hash_head); + + if (match_len >= MIN_MATCH) { + if (UNLIKELY(match_len > s->lookahead)) + match_len = s->lookahead; + + check_match(s, s->strstart, hash_head, match_len); + + zng_tr_emit_dist(s, static_ltree, static_dtree, match_len - MIN_MATCH, (uint32_t)dist); + s->lookahead -= match_len; + s->strstart += match_len; + continue; + } + } + } + + zng_tr_emit_lit(s, static_ltree, s->window[s->strstart]); + s->strstart++; + s->lookahead--; + } + + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (UNLIKELY(last)) { + QUICK_END_BLOCK(s, 1); + return finish_done; + } + + QUICK_END_BLOCK(s, 0); + return block_done; +} diff --git a/libs/zlibng/deflate_slow.c b/libs/zlibng/deflate_slow.c index f4c8af769..cac8a9629 100644 --- a/libs/zlibng/deflate_slow.c +++ b/libs/zlibng/deflate_slow.c @@ -7,26 +7,18 @@ #include "zbuild.h" #include "deflate.h" #include "deflate_p.h" -#include "match_p.h" #include "functable.h" -/* =========================================================================== - * Local data - */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - /* =========================================================================== * Same as deflate_medium, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ -ZLIB_INTERNAL block_state deflate_slow(deflate_state *s, int flush) { - IPos hash_head; /* head of hash chain */ +Z_INTERNAL block_state deflate_slow(deflate_state *s, int flush) { + Pos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ + int64_t dist; + uint32_t match_len; /* Process the input block. */ for (;;) { @@ -36,57 +28,53 @@ ZLIB_INTERNAL block_state deflate_slow(deflate_state *s, int flush) { * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { - functable.fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + fill_window(s); + if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH)) { return need_more; } - if (s->lookahead == 0) + if (UNLIKELY(s->lookahead == 0)) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - hash_head = functable.insert_string(s, s->strstart, 1); + hash_head = 0; + if (LIKELY(s->lookahead >= MIN_MATCH)) { + hash_head = functable.quick_insert_string(s, s->strstart); } /* Find the longest match, discarding those <= prev_length. */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; + s->prev_match = (Pos)s->match_start; + match_len = MIN_MATCH-1; + dist = (int64_t)s->strstart - hash_head; - if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { + if (dist <= MAX_DIST(s) && dist > 0 && s->prev_length < s->max_lazy_match) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ - s->match_length = longest_match(s, hash_head); + match_len = functable.longest_match(s, hash_head); /* longest_match() sets match_start */ - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) -#endif - )) { - + if (match_len <= 5 && (s->strategy == Z_FILTERED)) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ - s->match_length = MIN_MATCH-1; + match_len = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + if (s->prev_length >= MIN_MATCH && match_len <= s->prev_length) { unsigned int max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); - _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); + bflush = zng_tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not @@ -95,70 +83,55 @@ ZLIB_INTERNAL block_state deflate_slow(deflate_state *s, int flush) { */ s->lookahead -= s->prev_length-1; -#ifdef NOT_TWEAK_COMPILER - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - functable.insert_string(s, s->strstart, 1); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; -#else - { - unsigned int mov_fwd = s->prev_length - 2; - if (max_insert > s->strstart) { - unsigned int insert_cnt = mov_fwd; - if (unlikely(insert_cnt > max_insert - s->strstart)) - insert_cnt = max_insert - s->strstart; + unsigned int mov_fwd = s->prev_length - 2; + if (max_insert > s->strstart) { + unsigned int insert_cnt = mov_fwd; + if (UNLIKELY(insert_cnt > max_insert - s->strstart)) + insert_cnt = max_insert - s->strstart; - functable.insert_string(s, s->strstart + 1, insert_cnt); - } - s->prev_length = 0; - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart += mov_fwd + 1; + functable.insert_string(s, s->strstart + 1, insert_cnt); } -#endif /*NOT_TWEAK_COMPILER*/ + s->prev_length = 0; + s->match_available = 0; + s->strstart += mov_fwd + 1; - if (bflush) FLUSH_BLOCK(s, 0); + if (UNLIKELY(bflush)) + FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ - Tracevv((stderr, "%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { + bflush = zng_tr_tally_lit(s, s->window[s->strstart-1]); + if (UNLIKELY(bflush)) FLUSH_BLOCK_ONLY(s, 0); - } + s->prev_length = match_len; s->strstart++; s->lookahead--; - if (s->strm->avail_out == 0) + if (UNLIKELY(s->strm->avail_out == 0)) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ + s->prev_length = match_len; s->match_available = 1; s->strstart++; s->lookahead--; } } Assert(flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr, "%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (UNLIKELY(s->match_available)) { + (void) zng_tr_tally_lit(s, s->window[s->strstart-1]); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { + if (UNLIKELY(flush == Z_FINISH)) { FLUSH_BLOCK(s, 1); return finish_done; } - if (s->sym_next) + if (UNLIKELY(s->sym_next)) FLUSH_BLOCK(s, 0); return block_done; } diff --git a/libs/zlibng/fallback_builtins.h b/libs/zlibng/fallback_builtins.h new file mode 100644 index 000000000..314ad3267 --- /dev/null +++ b/libs/zlibng/fallback_builtins.h @@ -0,0 +1,44 @@ +#ifndef X86_BUILTIN_CTZ_H +#define X86_BUILTIN_CTZ_H + +#if defined(_MSC_VER) && !defined(__clang__) +#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) || defined(_M_ARM) || defined(_M_ARM64) + +#include +#ifdef X86_FEATURES +# include "arch/x86/x86.h" +#endif + +/* This is not a general purpose replacement for __builtin_ctz. The function expects that value is != 0 + * Because of that assumption trailing_zero is not initialized and the return value of _BitScanForward is not checked + */ +static __forceinline unsigned long __builtin_ctz(uint32_t value) { +#ifdef X86_FEATURES + if (x86_cpu_has_tzcnt) + return _tzcnt_u32(value); +#endif + unsigned long trailing_zero; + _BitScanForward(&trailing_zero, value); + return trailing_zero; +} +#define HAVE_BUILTIN_CTZ + +#ifdef _M_AMD64 +/* This is not a general purpose replacement for __builtin_ctzll. The function expects that value is != 0 + * Because of that assumption trailing_zero is not initialized and the return value of _BitScanForward64 is not checked + */ +static __forceinline unsigned long long __builtin_ctzll(uint64_t value) { +#ifdef X86_FEATURES + if (x86_cpu_has_tzcnt) + return _tzcnt_u64(value); +#endif + unsigned long trailing_zero; + _BitScanForward64(&trailing_zero, value); + return trailing_zero; +} +#define HAVE_BUILTIN_CTZLL +#endif + +#endif +#endif +#endif diff --git a/libs/zlibng/functable.c b/libs/zlibng/functable.c index 108509798..acae44641 100644 --- a/libs/zlibng/functable.c +++ b/libs/zlibng/functable.c @@ -4,40 +4,95 @@ */ #include "zbuild.h" -#include "functable.h" +#include "zendian.h" #include "deflate.h" #include "deflate_p.h" -#include "gzendian.h" +#include "functable.h" -/* insert_string */ -#ifdef X86_SSE4_2_CRC_HASH -extern Pos insert_string_sse(deflate_state *const s, const Pos str, unsigned int count); -#elif defined(ARM_ACLE_CRC_HASH) -extern Pos insert_string_acle(deflate_state *const s, const Pos str, unsigned int count); +#ifdef X86_FEATURES +# include "fallback_builtins.h" #endif -/* fill_window */ +/* insert_string */ +extern void insert_string_c(deflate_state *const s, const uint32_t str, uint32_t count); +#ifdef X86_SSE42_CRC_HASH +extern void insert_string_sse4(deflate_state *const s, const uint32_t str, uint32_t count); +#elif defined(ARM_ACLE_CRC_HASH) +extern void insert_string_acle(deflate_state *const s, const uint32_t str, uint32_t count); +#endif + +/* quick_insert_string */ +extern Pos quick_insert_string_c(deflate_state *const s, const uint32_t str); +#ifdef X86_SSE42_CRC_HASH +extern Pos quick_insert_string_sse4(deflate_state *const s, const uint32_t str); +#elif defined(ARM_ACLE_CRC_HASH) +extern Pos quick_insert_string_acle(deflate_state *const s, const uint32_t str); +#endif + +/* slide_hash */ #ifdef X86_SSE2 -extern void fill_window_sse(deflate_state *s); -#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) -extern void fill_window_arm(deflate_state *s); +void slide_hash_sse2(deflate_state *s); +#elif defined(ARM_NEON_SLIDEHASH) +void slide_hash_neon(deflate_state *s); +#elif defined(POWER8_VSX_SLIDEHASH) +void slide_hash_power8(deflate_state *s); +#endif +#ifdef X86_AVX2 +void slide_hash_avx2(deflate_state *s); #endif /* adler32 */ extern uint32_t adler32_c(uint32_t adler, const unsigned char *buf, size_t len); -#if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && defined(ARM_NEON_ADLER32) +#ifdef ARM_NEON_ADLER32 extern uint32_t adler32_neon(uint32_t adler, const unsigned char *buf, size_t len); #endif - -ZLIB_INTERNAL uint32_t crc32_generic(uint32_t, const unsigned char *, uint64_t); - -#ifdef DYNAMIC_CRC_TABLE -extern volatile int crc_table_empty; -extern void make_crc_table(void); +#ifdef X86_SSSE3_ADLER32 +extern uint32_t adler32_ssse3(uint32_t adler, const unsigned char *buf, size_t len); +#endif +#ifdef X86_AVX2_ADLER32 +extern uint32_t adler32_avx2(uint32_t adler, const unsigned char *buf, size_t len); +#endif +#ifdef POWER8_VSX_ADLER32 +extern uint32_t adler32_power8(uint32_t adler, const unsigned char* buf, size_t len); #endif -#ifdef __ARM_FEATURE_CRC32 +/* memory chunking */ +extern uint32_t chunksize_c(void); +extern uint8_t* chunkcopy_c(uint8_t *out, uint8_t const *from, unsigned len); +extern uint8_t* chunkcopy_safe_c(uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe); +extern uint8_t* chunkunroll_c(uint8_t *out, unsigned *dist, unsigned *len); +extern uint8_t* chunkmemset_c(uint8_t *out, unsigned dist, unsigned len); +extern uint8_t* chunkmemset_safe_c(uint8_t *out, unsigned dist, unsigned len, unsigned left); +#ifdef X86_SSE2_CHUNKSET +extern uint32_t chunksize_sse2(void); +extern uint8_t* chunkcopy_sse2(uint8_t *out, uint8_t const *from, unsigned len); +extern uint8_t* chunkcopy_safe_sse2(uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe); +extern uint8_t* chunkunroll_sse2(uint8_t *out, unsigned *dist, unsigned *len); +extern uint8_t* chunkmemset_sse2(uint8_t *out, unsigned dist, unsigned len); +extern uint8_t* chunkmemset_safe_sse2(uint8_t *out, unsigned dist, unsigned len, unsigned left); +#endif +#ifdef X86_AVX_CHUNKSET +extern uint32_t chunksize_avx(void); +extern uint8_t* chunkcopy_avx(uint8_t *out, uint8_t const *from, unsigned len); +extern uint8_t* chunkcopy_safe_avx(uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe); +extern uint8_t* chunkunroll_avx(uint8_t *out, unsigned *dist, unsigned *len); +extern uint8_t* chunkmemset_avx(uint8_t *out, unsigned dist, unsigned len); +extern uint8_t* chunkmemset_safe_avx(uint8_t *out, unsigned dist, unsigned len, unsigned left); +#endif +#ifdef ARM_NEON_CHUNKSET +extern uint32_t chunksize_neon(void); +extern uint8_t* chunkcopy_neon(uint8_t *out, uint8_t const *from, unsigned len); +extern uint8_t* chunkcopy_safe_neon(uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe); +extern uint8_t* chunkunroll_neon(uint8_t *out, unsigned *dist, unsigned *len); +extern uint8_t* chunkmemset_neon(uint8_t *out, unsigned dist, unsigned len); +extern uint8_t* chunkmemset_safe_neon(uint8_t *out, unsigned dist, unsigned len, unsigned left); +#endif + +/* CRC32 */ +Z_INTERNAL uint32_t crc32_generic(uint32_t, const unsigned char *, uint64_t); + +#ifdef ARM_ACLE_CRC_HASH extern uint32_t crc32_acle(uint32_t, const unsigned char *, uint64_t); #endif @@ -47,87 +102,365 @@ extern uint32_t crc32_little(uint32_t, const unsigned char *, uint64_t); extern uint32_t crc32_big(uint32_t, const unsigned char *, uint64_t); #endif -/* stub definitions */ -ZLIB_INTERNAL Pos insert_string_stub(deflate_state *const s, const Pos str, unsigned int count); -ZLIB_INTERNAL void fill_window_stub(deflate_state *s); -ZLIB_INTERNAL uint32_t adler32_stub(uint32_t adler, const unsigned char *buf, size_t len); -ZLIB_INTERNAL uint32_t crc32_stub(uint32_t crc, const unsigned char *buf, uint64_t len); +/* compare258 */ +extern uint32_t compare258_c(const unsigned char *src0, const unsigned char *src1); +#ifdef UNALIGNED_OK +extern uint32_t compare258_unaligned_16(const unsigned char *src0, const unsigned char *src1); +extern uint32_t compare258_unaligned_32(const unsigned char *src0, const unsigned char *src1); +#ifdef UNALIGNED64_OK +extern uint32_t compare258_unaligned_64(const unsigned char *src0, const unsigned char *src1); +#endif +#ifdef X86_SSE42_CMP_STR +extern uint32_t compare258_unaligned_sse4(const unsigned char *src0, const unsigned char *src1); +#endif +#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ) +extern uint32_t compare258_unaligned_avx2(const unsigned char *src0, const unsigned char *src1); +#endif +#endif -/* functable init */ -ZLIB_INTERNAL __thread struct functable_s functable = {fill_window_stub,insert_string_stub,adler32_stub,crc32_stub}; +/* longest_match */ +extern uint32_t longest_match_c(deflate_state *const s, Pos cur_match); +#ifdef UNALIGNED_OK +extern uint32_t longest_match_unaligned_16(deflate_state *const s, Pos cur_match); +extern uint32_t longest_match_unaligned_32(deflate_state *const s, Pos cur_match); +#ifdef UNALIGNED64_OK +extern uint32_t longest_match_unaligned_64(deflate_state *const s, Pos cur_match); +#endif +#ifdef X86_SSE42_CMP_STR +extern uint32_t longest_match_unaligned_sse4(deflate_state *const s, Pos cur_match); +#endif +#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ) +extern uint32_t longest_match_unaligned_avx2(deflate_state *const s, Pos cur_match); +#endif +#endif +Z_INTERNAL Z_TLS struct functable_s functable; + +Z_INTERNAL void cpu_check_features(void) +{ + static int features_checked = 0; + if (features_checked) + return; +#if defined(X86_FEATURES) + x86_check_features(); +#elif defined(ARM_FEATURES) + arm_check_features(); +#elif defined(POWER_FEATURES) + power_check_features(); +#endif + features_checked = 1; +} /* stub functions */ -ZLIB_INTERNAL Pos insert_string_stub(deflate_state *const s, const Pos str, unsigned int count) { +Z_INTERNAL void insert_string_stub(deflate_state *const s, const uint32_t str, uint32_t count) { // Initialize default - functable.insert_string=&insert_string_c; - #ifdef X86_SSE4_2_CRC_HASH + functable.insert_string = &insert_string_c; + cpu_check_features(); + +#ifdef X86_SSE42_CRC_HASH if (x86_cpu_has_sse42) - functable.insert_string=&insert_string_sse; - #elif defined(__ARM_FEATURE_CRC32) && defined(ARM_ACLE_CRC_HASH) + functable.insert_string = &insert_string_sse4; +#elif defined(ARM_ACLE_CRC_HASH) if (arm_cpu_has_crc32) - functable.insert_string=&insert_string_acle; - #endif + functable.insert_string = &insert_string_acle; +#endif - return functable.insert_string(s, str, count); + functable.insert_string(s, str, count); } -ZLIB_INTERNAL void fill_window_stub(deflate_state *s) { - // Initialize default - functable.fill_window=&fill_window_c; +Z_INTERNAL Pos quick_insert_string_stub(deflate_state *const s, const uint32_t str) { + functable.quick_insert_string = &quick_insert_string_c; - #ifdef X86_SSE2 - # if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) +#ifdef X86_SSE42_CRC_HASH + if (x86_cpu_has_sse42) + functable.quick_insert_string = &quick_insert_string_sse4; +#elif defined(ARM_ACLE_CRC_HASH) + if (arm_cpu_has_crc32) + functable.quick_insert_string = &quick_insert_string_acle; +#endif + + return functable.quick_insert_string(s, str); +} + +Z_INTERNAL void slide_hash_stub(deflate_state *s) { + + functable.slide_hash = &slide_hash_c; + cpu_check_features(); + +#ifdef X86_SSE2 +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) if (x86_cpu_has_sse2) - # endif - functable.fill_window=&fill_window_sse; - #elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) - functable.fill_window=&fill_window_arm; - #endif +# endif + functable.slide_hash = &slide_hash_sse2; +#elif defined(ARM_NEON_SLIDEHASH) +# ifndef ARM_NOCHECK_NEON + if (arm_cpu_has_neon) +# endif + functable.slide_hash = &slide_hash_neon; +#endif +#ifdef X86_AVX2 + if (x86_cpu_has_avx2) + functable.slide_hash = &slide_hash_avx2; +#endif +#ifdef POWER8_VSX_SLIDEHASH + if (power_cpu_has_arch_2_07) + functable.slide_hash = &slide_hash_power8; +#endif - functable.fill_window(s); + functable.slide_hash(s); } -ZLIB_INTERNAL uint32_t adler32_stub(uint32_t adler, const unsigned char *buf, size_t len) { +Z_INTERNAL uint32_t adler32_stub(uint32_t adler, const unsigned char *buf, size_t len) { // Initialize default - functable.adler32=&adler32_c; + functable.adler32 = &adler32_c; + cpu_check_features(); - #if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && defined(ARM_NEON_ADLER32) +#ifdef ARM_NEON_ADLER32 +# ifndef ARM_NOCHECK_NEON if (arm_cpu_has_neon) - functable.adler32=&adler32_neon; - #endif +# endif + functable.adler32 = &adler32_neon; +#endif +#ifdef X86_SSSE3_ADLER32 + if (x86_cpu_has_ssse3) + functable.adler32 = &adler32_ssse3; +#endif +#ifdef X86_AVX2_ADLER32 + if (x86_cpu_has_avx2) + functable.adler32 = &adler32_avx2; +#endif +#ifdef POWER8_VSX_ADLER32 + if (power_cpu_has_arch_2_07) + functable.adler32 = &adler32_power8; +#endif return functable.adler32(adler, buf, len); } -ZLIB_INTERNAL uint32_t crc32_stub(uint32_t crc, const unsigned char *buf, uint64_t len) { +Z_INTERNAL uint32_t chunksize_stub(void) { + // Initialize default + functable.chunksize = &chunksize_c; +#ifdef X86_SSE2_CHUNKSET +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) + if (x86_cpu_has_sse2) +# endif + functable.chunksize = &chunksize_sse2; +#endif +#ifdef X86_AVX_CHUNKSET + if (x86_cpu_has_avx2) + functable.chunksize = &chunksize_avx; +#endif +#ifdef ARM_NEON_CHUNKSET + if (arm_cpu_has_neon) + functable.chunksize = &chunksize_neon; +#endif - Assert(sizeof(uint64_t) >= sizeof(size_t), - "crc32_z takes size_t but internally we have a uint64_t len"); -/* return a function pointer for optimized arches here after a capability test */ + return functable.chunksize(); +} -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ +Z_INTERNAL uint8_t* chunkcopy_stub(uint8_t *out, uint8_t const *from, unsigned len) { + // Initialize default + functable.chunkcopy = &chunkcopy_c; - if (sizeof(void *) == sizeof(ptrdiff_t)) { +#ifdef X86_SSE2_CHUNKSET +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) + if (x86_cpu_has_sse2) +# endif + functable.chunkcopy = &chunkcopy_sse2; +#endif +#ifdef X86_AVX_CHUNKSET + if (x86_cpu_has_avx2) + functable.chunkcopy = &chunkcopy_avx; +#endif +#ifdef ARM_NEON_CHUNKSET + if (arm_cpu_has_neon) + functable.chunkcopy = &chunkcopy_neon; +#endif + + return functable.chunkcopy(out, from, len); +} + +Z_INTERNAL uint8_t* chunkcopy_safe_stub(uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe) { + // Initialize default + functable.chunkcopy_safe = &chunkcopy_safe_c; + +#ifdef X86_SSE2_CHUNKSET +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) + if (x86_cpu_has_sse2) +# endif + functable.chunkcopy_safe = &chunkcopy_safe_sse2; +#endif +#ifdef X86_AVX_CHUNKSET + if (x86_cpu_has_avx2) + functable.chunkcopy_safe = &chunkcopy_safe_avx; +#endif +#ifdef ARM_NEON_CHUNKSET + if (arm_cpu_has_neon) + functable.chunkcopy_safe = &chunkcopy_safe_neon; +#endif + + return functable.chunkcopy_safe(out, from, len, safe); +} + +Z_INTERNAL uint8_t* chunkunroll_stub(uint8_t *out, unsigned *dist, unsigned *len) { + // Initialize default + functable.chunkunroll = &chunkunroll_c; + +#ifdef X86_SSE2_CHUNKSET +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) + if (x86_cpu_has_sse2) +# endif + functable.chunkunroll = &chunkunroll_sse2; +#endif +#ifdef X86_AVX_CHUNKSET + if (x86_cpu_has_avx2) + functable.chunkunroll = &chunkunroll_avx; +#endif +#ifdef ARM_NEON_CHUNKSET + if (arm_cpu_has_neon) + functable.chunkunroll = &chunkunroll_neon; +#endif + + return functable.chunkunroll(out, dist, len); +} + +Z_INTERNAL uint8_t* chunkmemset_stub(uint8_t *out, unsigned dist, unsigned len) { + // Initialize default + functable.chunkmemset = &chunkmemset_c; + +#ifdef X86_SSE2_CHUNKSET +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) + if (x86_cpu_has_sse2) +# endif + functable.chunkmemset = &chunkmemset_sse2; +#endif +#ifdef X86_AVX_CHUNKSET + if (x86_cpu_has_avx2) + functable.chunkmemset = &chunkmemset_avx; +#endif +#ifdef ARM_NEON_CHUNKSET + if (arm_cpu_has_neon) + functable.chunkmemset = &chunkmemset_neon; +#endif + + return functable.chunkmemset(out, dist, len); +} + +Z_INTERNAL uint8_t* chunkmemset_safe_stub(uint8_t *out, unsigned dist, unsigned len, unsigned left) { + // Initialize default + functable.chunkmemset_safe = &chunkmemset_safe_c; + +#ifdef X86_SSE2_CHUNKSET +# if !defined(__x86_64__) && !defined(_M_X64) && !defined(X86_NOCHECK_SSE2) + if (x86_cpu_has_sse2) +# endif + functable.chunkmemset_safe = &chunkmemset_safe_sse2; +#endif +#ifdef X86_AVX_CHUNKSET + if (x86_cpu_has_avx2) + functable.chunkmemset_safe = &chunkmemset_safe_avx; +#endif +#ifdef ARM_NEON_CHUNKSET + if (arm_cpu_has_neon) + functable.chunkmemset_safe = &chunkmemset_safe_neon; +#endif + + return functable.chunkmemset_safe(out, dist, len, left); +} + +Z_INTERNAL uint32_t crc32_stub(uint32_t crc, const unsigned char *buf, uint64_t len) { + int32_t use_byfour = sizeof(void *) == sizeof(ptrdiff_t); + + Assert(sizeof(uint64_t) >= sizeof(size_t), + "crc32_z takes size_t but internally we have a uint64_t len"); + /* return a function pointer for optimized arches here after a capability test */ + + cpu_check_features(); + + if (use_byfour) { #if BYTE_ORDER == LITTLE_ENDIAN - functable.crc32=crc32_little; -# if defined(__ARM_FEATURE_CRC32) && defined(ARM_ACLE_CRC_HASH) - if (arm_cpu_has_crc32) - functable.crc32=crc32_acle; + functable.crc32 = crc32_little; +# if defined(ARM_ACLE_CRC_HASH) + if (arm_cpu_has_crc32) + functable.crc32 = crc32_acle; # endif #elif BYTE_ORDER == BIG_ENDIAN - functable.crc32=crc32_big; + functable.crc32 = crc32_big; #else # error No endian defined #endif } else { - functable.crc32=crc32_generic; + functable.crc32 = crc32_generic; } return functable.crc32(crc, buf, len); } + +Z_INTERNAL uint32_t compare258_stub(const unsigned char *src0, const unsigned char *src1) { + + functable.compare258 = &compare258_c; + +#ifdef UNALIGNED_OK +# if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL) + functable.compare258 = &compare258_unaligned_64; +# elif defined(HAVE_BUILTIN_CTZ) + functable.compare258 = &compare258_unaligned_32; +# else + functable.compare258 = &compare258_unaligned_16; +# endif +# ifdef X86_SSE42_CMP_STR + if (x86_cpu_has_sse42) + functable.compare258 = &compare258_unaligned_sse4; +# endif +# if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ) + if (x86_cpu_has_avx2) + functable.compare258 = &compare258_unaligned_avx2; +# endif +#endif + + return functable.compare258(src0, src1); +} + +Z_INTERNAL uint32_t longest_match_stub(deflate_state *const s, Pos cur_match) { + + functable.longest_match = &longest_match_c; + +#ifdef UNALIGNED_OK +# if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL) + functable.longest_match = &longest_match_unaligned_64; +# elif defined(HAVE_BUILTIN_CTZ) + functable.longest_match = &longest_match_unaligned_32; +# else + functable.longest_match = &longest_match_unaligned_16; +# endif +# ifdef X86_SSE42_CMP_STR + if (x86_cpu_has_sse42) + functable.longest_match = &longest_match_unaligned_sse4; +# endif +# if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ) + if (x86_cpu_has_avx2) + functable.longest_match = &longest_match_unaligned_avx2; +# endif +#endif + + return functable.longest_match(s, cur_match); +} + +/* functable init */ +Z_INTERNAL Z_TLS struct functable_s functable = { + insert_string_stub, + quick_insert_string_stub, + adler32_stub, + crc32_stub, + slide_hash_stub, + compare258_stub, + longest_match_stub, + chunksize_stub, + chunkcopy_stub, + chunkcopy_safe_stub, + chunkunroll_stub, + chunkmemset_stub, + chunkmemset_safe_stub +}; diff --git a/libs/zlibng/functable.h b/libs/zlibng/functable.h index 280651c32..276c284a0 100644 --- a/libs/zlibng/functable.h +++ b/libs/zlibng/functable.h @@ -9,13 +9,21 @@ #include "deflate.h" struct functable_s { - void (* fill_window) (deflate_state *s); - Pos (* insert_string) (deflate_state *const s, const Pos str, unsigned int count); - uint32_t (* adler32) (uint32_t adler, const unsigned char *buf, size_t len); - uint32_t (* crc32) (uint32_t crc, const unsigned char *buf, uint64_t len); + void (* insert_string) (deflate_state *const s, const uint32_t str, uint32_t count); + Pos (* quick_insert_string)(deflate_state *const s, const uint32_t str); + uint32_t (* adler32) (uint32_t adler, const unsigned char *buf, size_t len); + uint32_t (* crc32) (uint32_t crc, const unsigned char *buf, uint64_t len); + void (* slide_hash) (deflate_state *s); + uint32_t (* compare258) (const unsigned char *src0, const unsigned char *src1); + uint32_t (* longest_match) (deflate_state *const s, Pos cur_match); + uint32_t (* chunksize) (void); + uint8_t* (* chunkcopy) (uint8_t *out, uint8_t const *from, unsigned len); + uint8_t* (* chunkcopy_safe) (uint8_t *out, uint8_t const *from, unsigned len, uint8_t *safe); + uint8_t* (* chunkunroll) (uint8_t *out, unsigned *dist, unsigned *len); + uint8_t* (* chunkmemset) (uint8_t *out, unsigned dist, unsigned len); + uint8_t* (* chunkmemset_safe) (uint8_t *out, unsigned dist, unsigned len, unsigned left); }; -ZLIB_INTERNAL extern __thread struct functable_s functable; - +Z_INTERNAL extern Z_TLS struct functable_s functable; #endif diff --git a/libs/zlibng/gzclose.c b/libs/zlibng/gzclose.c deleted file mode 100644 index bafb774c8..000000000 --- a/libs/zlibng/gzclose.c +++ /dev/null @@ -1,24 +0,0 @@ -/* gzclose.c -- zlib gzclose() function - * Copyright (C) 2004, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zbuild.h" -#include "gzguts.h" - -/* gzclose() is in a separate file so that it is linked in only if it is used. - That way the other gzclose functions can be used instead to avoid linking in - unneeded compression or decompression routines. */ -int ZEXPORT PREFIX(gzclose)(gzFile file) { -#ifndef NO_GZCOMPRESS - gz_state *state; - - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_state *)file; - - return state->mode == GZ_READ ? PREFIX(gzclose_r)(file) : PREFIX(gzclose_w)(file); -#else - return PREFIX(gzclose_r)(file); -#endif -} diff --git a/libs/zlibng/gzendian.h b/libs/zlibng/gzendian.h deleted file mode 100644 index 5ee4cd387..000000000 --- a/libs/zlibng/gzendian.h +++ /dev/null @@ -1,60 +0,0 @@ -/* gzendian.h -- define BYTE_ORDER for endian tests - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#ifndef ENDIAN_H_ -#define ENDIAN_H_ - -/* First check whether the compiler knows the target __BYTE_ORDER__. */ -#if defined(__BYTE_ORDER__) -# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# if !defined(LITTLE_ENDIAN) -# define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ -# endif -# if !defined(BYTE_ORDER) -# define BYTE_ORDER LITTLE_ENDIAN -# endif -# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -# if !defined(BIG_ENDIAN) -# define BIG_ENDIAN __ORDER_BIG_ENDIAN__ -# endif -# if !defined(BYTE_ORDER) -# define BYTE_ORDER BIG_ENDIAN -# endif -# endif -#elif defined(__MINGW32__) -# include -#elif defined(WIN32) || defined(_WIN32) -# define LITTLE_ENDIAN 1234 -# define BIG_ENDIAN 4321 -# if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) || defined (_M_ARM) -# define BYTE_ORDER LITTLE_ENDIAN -# else -# error Unknown endianness! -# endif -#elif defined(__linux__) -# include -#elif defined(__APPLE__) || defined(__arm__) || defined(__aarch64__) -# include -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) -# include -#elif defined(__sun) || defined(sun) -# include -# if !defined(LITTLE_ENDIAN) -# define LITTLE_ENDIAN 4321 -# endif -# if !defined(BIG_ENDIAN) -# define BIG_ENDIAN 1234 -# endif -# if !defined(BYTE_ORDER) -# if defined(_BIG_ENDIAN) -# define BYTE_ORDER BIG_ENDIAN -# else -# define BYTE_ORDER LITTLE_ENDIAN -# endif -# endif -#else -# include -#endif - -#endif diff --git a/libs/zlibng/gzguts.h b/libs/zlibng/gzguts.h index c2ff7bb96..16029607f 100644 --- a/libs/zlibng/gzguts.h +++ b/libs/zlibng/gzguts.h @@ -14,12 +14,12 @@ # endif #endif -#if defined(HAVE_INTERNAL) -# define ZLIB_INTERNAL __attribute__((visibility ("internal"))) -#elif defined(HAVE_HIDDEN) -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#if defined(HAVE_VISIBILITY_INTERNAL) +# define Z_INTERNAL __attribute__((visibility ("internal"))) +#elif defined(HAVE_VISIBILITY_HIDDEN) +# define Z_INTERNAL __attribute__((visibility ("hidden"))) #else -# define ZLIB_INTERNAL +# define Z_INTERNAL #endif #include @@ -29,12 +29,12 @@ #include #if defined(ZLIB_COMPAT) -# include "zlib.h" +# include "zlib.h" #else -# include "zlib-ng.h" +# include "zlib-ng.h" #endif -#ifdef WIN32 +#ifdef _WIN32 # include #endif @@ -42,11 +42,8 @@ # include /* for lseek(), read(), close(), write(), unlink() */ #endif -#if defined(_MSC_VER) || defined(WIN32) +#if defined(_WIN32) # include -#endif - -#if defined(_WIN32) || defined(__MINGW__) # define WIDECHAR #endif @@ -58,7 +55,7 @@ #endif /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -#if !defined(STDC99) && !defined(__CYGWIN__) && !defined(__MINGW__) && defined(WIN32) +#if !defined(STDC99) && !defined(__CYGWIN__) && !defined(__MINGW__) && defined(_WIN32) # if !defined(vsnprintf) # if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) # define vsnprintf _vsnprintf @@ -81,14 +78,6 @@ # define zstrerror() "stdio error (consult errno)" #endif -/* provide prototypes for these when building zlib without LFS */ -#if (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) && defined(WITH_GZFILEOP) - ZEXTERN gzFile ZEXPORT PREFIX(gzopen64)(const char *, const char *); - ZEXTERN z_off64_t ZEXPORT PREFIX(gzseek64)(gzFile, z_off64_t, int); - ZEXTERN z_off64_t ZEXPORT PREFIX(gztell64)(gzFile); - ZEXTERN z_off64_t ZEXPORT PREFIX(gzoffset64)(gzFile); -#endif - /* default memLevel */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 @@ -98,10 +87,8 @@ /* default i/o buffer size -- double this for output when reading (this and twice this must be able to fit in an unsigned type) */ -#if defined(S390_DFLTCC_DEFLATE) || defined(S390_DFLTCC_INFLATE) -#define GZBUFSIZE 262144 /* DFLTCC works faster with larger buffers */ -#else -#define GZBUFSIZE 8192 +#ifndef GZBUFSIZE +# define GZBUFSIZE 8192 #endif /* gzip modes, also provide a little integrity check on the passed structure */ @@ -139,6 +126,7 @@ typedef struct { /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ + int reset; /* true if a reset is pending after a Z_FINISH */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ @@ -151,7 +139,7 @@ typedef struct { typedef gz_state *gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error(gz_state *, int, const char *); +void Z_INTERNAL gz_error(gz_state *, int, const char *); /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed @@ -159,7 +147,7 @@ void ZLIB_INTERNAL gz_error(gz_state *, int, const char *); #ifdef INT_MAX # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #else -unsigned ZLIB_INTERNAL gz_intmax(void); +unsigned Z_INTERNAL gz_intmax(void); # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) #endif diff --git a/libs/zlibng/gzlib.c b/libs/zlibng/gzlib.c index dbf27aa43..490551667 100644 --- a/libs/zlibng/gzlib.c +++ b/libs/zlibng/gzlib.c @@ -4,9 +4,10 @@ */ #include "zbuild.h" +#include "zutil_p.h" #include "gzguts.h" -#if defined(WIN32) && !defined(__BORLANDC__) +#if defined(_WIN32) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 @@ -28,6 +29,8 @@ static void gz_reset(gz_state *state) { state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } + else /* for writing ... */ + state->reset = 0; /* no deflateReset pending */ state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ @@ -51,7 +54,7 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { return NULL; /* allocate gzFile structure to return */ - state = (gz_state *)malloc(sizeof(gz_state)); + state = (gz_state *)zng_alloc(sizeof(gz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ @@ -80,7 +83,7 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { break; #endif case '+': /* can't read and write at the same time */ - free(state); + zng_free(state); return NULL; case 'b': /* ignore -- will request binary anyway */ break; @@ -118,14 +121,14 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { /* must provide an "r", "w", or "a" */ if (state->mode == GZ_NONE) { - free(state); + zng_free(state); return NULL; } /* can't force transparent read */ if (state->mode == GZ_READ) { if (state->direct) { - free(state); + zng_free(state); return NULL; } state->direct = 1; /* for empty file */ @@ -134,7 +137,7 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { /* save the path name for error messages */ #ifdef WIDECHAR if (fd == -2) { - len = wcstombs(NULL, path, 0); + len = wcstombs(NULL, (const wchar_t *)path, 0); if (len == (size_t)-1) len = 0; } else @@ -142,13 +145,13 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { len = strlen((const char *)path); state->path = (char *)malloc(len + 1); if (state->path == NULL) { - free(state); + zng_free(state); return NULL; } #ifdef WIDECHAR if (fd == -2) if (len) { - wcstombs(state->path, path, len + 1); + wcstombs(state->path, (const wchar_t *)path, len + 1); } else { *(state->path) = 0; } @@ -179,15 +182,15 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { /* open the file with the appropriate flags (or just use fd) */ state->fd = fd > -1 ? fd : ( -#if defined(WIN32) || defined(__MINGW__) - fd == -2 ? _wopen(path, oflag, 0666) : +#if defined(_WIN32) + fd == -2 ? _wopen((const wchar_t *)path, oflag, 0666) : #elif __CYGWIN__ fd == -2 ? open(state->path, oflag, 0666) : #endif open((const char *)path, oflag, 0666)); if (state->fd == -1) { free(state->path); - free(state); + zng_free(state); return NULL; } if (state->mode == GZ_APPEND) { @@ -209,17 +212,18 @@ static gzFile gz_open(const void *path, int fd, const char *mode) { } /* -- see zlib.h -- */ -gzFile ZEXPORT PREFIX(gzopen)(const char *path, const char *mode) { +gzFile Z_EXPORT PREFIX(gzopen)(const char *path, const char *mode) { return gz_open(path, -1, mode); } -/* -- see zlib.h -- */ -gzFile ZEXPORT PREFIX(gzopen64)(const char *path, const char *mode) { +#ifdef ZLIB_COMPAT +gzFile Z_EXPORT PREFIX4(gzopen)(const char *path, const char *mode) { return gz_open(path, -1, mode); } +#endif /* -- see zlib.h -- */ -gzFile ZEXPORT PREFIX(gzdopen)(int fd, const char *mode) { +gzFile Z_EXPORT PREFIX(gzdopen)(int fd, const char *mode) { char *path; /* identifier for error messages */ gzFile gz; @@ -233,13 +237,27 @@ gzFile ZEXPORT PREFIX(gzdopen)(int fd, const char *mode) { /* -- see zlib.h -- */ #ifdef WIDECHAR -gzFile ZEXPORT PREFIX(gzopen_w)(const wchar_t *path, const char *mode) { +gzFile Z_EXPORT PREFIX(gzopen_w)(const wchar_t *path, const char *mode) { return gz_open(path, -2, mode); } #endif +int Z_EXPORT PREFIX(gzclose)(gzFile file) { +#ifndef NO_GZCOMPRESS + gz_state *state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_state *)file; + + return state->mode == GZ_READ ? PREFIX(gzclose_r)(file) : PREFIX(gzclose_w)(file); +#else + return PREFIX(gzclose_r)(file); +#endif +} + /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzbuffer)(gzFile file, unsigned size) { +int Z_EXPORT PREFIX(gzbuffer)(gzFile file, unsigned size) { gz_state *state; /* get internal structure and check integrity */ @@ -263,7 +281,7 @@ int ZEXPORT PREFIX(gzbuffer)(gzFile file, unsigned size) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzrewind)(gzFile file) { +int Z_EXPORT PREFIX(gzrewind)(gzFile file) { gz_state *state; /* get internal structure */ @@ -283,7 +301,7 @@ int ZEXPORT PREFIX(gzrewind)(gzFile file) { } /* -- see zlib.h -- */ -z_off64_t ZEXPORT PREFIX(gzseek64)(gzFile file, z_off64_t offset, int whence) { +z_off64_t Z_EXPORT PREFIX4(gzseek)(gzFile file, z_off64_t offset, int whence) { unsigned n; z_off64_t ret; gz_state *state; @@ -354,15 +372,17 @@ z_off64_t ZEXPORT PREFIX(gzseek64)(gzFile file, z_off64_t offset, int whence) { } /* -- see zlib.h -- */ -z_off_t ZEXPORT PREFIX(gzseek)(gzFile file, z_off_t offset, int whence) { +#ifdef ZLIB_COMPAT +z_off_t Z_EXPORT PREFIX(gzseek)(gzFile file, z_off_t offset, int whence) { z_off64_t ret; - ret = PREFIX(gzseek64)(file, (z_off64_t)offset, whence); + ret = PREFIX4(gzseek)(file, (z_off64_t)offset, whence); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } +#endif /* -- see zlib.h -- */ -z_off64_t ZEXPORT PREFIX(gztell64)(gzFile file) { +z_off64_t Z_EXPORT PREFIX4(gztell)(gzFile file) { gz_state *state; /* get internal structure and check integrity */ @@ -377,15 +397,18 @@ z_off64_t ZEXPORT PREFIX(gztell64)(gzFile file) { } /* -- see zlib.h -- */ -z_off_t ZEXPORT PREFIX(gztell)(gzFile file) { +#ifdef ZLIB_COMPAT +z_off_t Z_EXPORT PREFIX(gztell)(gzFile file) { + z_off64_t ret; - ret = PREFIX(gztell64)(file); + ret = PREFIX4(gztell)(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } +#endif /* -- see zlib.h -- */ -z_off64_t ZEXPORT PREFIX(gzoffset64)(gzFile file) { +z_off64_t Z_EXPORT PREFIX4(gzoffset)(gzFile file) { z_off64_t offset; gz_state *state; @@ -406,15 +429,17 @@ z_off64_t ZEXPORT PREFIX(gzoffset64)(gzFile file) { } /* -- see zlib.h -- */ -z_off_t ZEXPORT PREFIX(gzoffset)(gzFile file) { +#ifdef ZLIB_COMPAT +z_off_t Z_EXPORT PREFIX(gzoffset)(gzFile file) { z_off64_t ret; - ret = PREFIX(gzoffset64)(file); + ret = PREFIX4(gzoffset)(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } +#endif /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzeof)(gzFile file) { +int Z_EXPORT PREFIX(gzeof)(gzFile file) { gz_state *state; /* get internal structure and check integrity */ @@ -429,7 +454,7 @@ int ZEXPORT PREFIX(gzeof)(gzFile file) { } /* -- see zlib.h -- */ -const char * ZEXPORT PREFIX(gzerror)(gzFile file, int *errnum) { +const char * Z_EXPORT PREFIX(gzerror)(gzFile file, int *errnum) { gz_state *state; /* get internal structure and check integrity */ @@ -446,7 +471,7 @@ const char * ZEXPORT PREFIX(gzerror)(gzFile file, int *errnum) { } /* -- see zlib.h -- */ -void ZEXPORT PREFIX(gzclearerr)(gzFile file) { +void Z_EXPORT PREFIX(gzclearerr)(gzFile file) { gz_state *state; /* get internal structure and check integrity */ @@ -470,7 +495,7 @@ void ZEXPORT PREFIX(gzclearerr)(gzFile file) { memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ -void ZLIB_INTERNAL gz_error(gz_state *state, int err, const char *msg) { +void Z_INTERNAL gz_error(gz_state *state, int err, const char *msg) { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) @@ -504,7 +529,7 @@ void ZLIB_INTERNAL gz_error(gz_state *state, int err, const char *msg) { available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax() { +unsigned Z_INTERNAL gz_intmax() { unsigned p, q; p = 1; diff --git a/libs/zlibng/gzread.c b/libs/zlibng/gzread.c index e041a3817..c3b3a035f 100644 --- a/libs/zlibng/gzread.c +++ b/libs/zlibng/gzread.c @@ -4,6 +4,7 @@ */ #include "zbuild.h" +#include "zutil_p.h" #include "gzguts.h" /* Local functions */ @@ -83,11 +84,11 @@ static int gz_look(gz_state *state) { /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ - state->in = (unsigned char *)malloc(state->want); - state->out = (unsigned char *)malloc(state->want << 1); + state->in = (unsigned char *)zng_alloc(state->want); + state->out = (unsigned char *)zng_alloc(state->want << 1); if (state->in == NULL || state->out == NULL) { - free(state->out); - free(state->in); + zng_free(state->out); + zng_free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } @@ -100,8 +101,8 @@ static int gz_look(gz_state *state) { state->strm.avail_in = 0; state->strm.next_in = NULL; if (PREFIX(inflateInit2)(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ - free(state->out); - free(state->in); + zng_free(state->out); + zng_free(state->in); state->size = 0; gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; @@ -343,7 +344,7 @@ static size_t gz_read(gz_state *state, void *buf, size_t len) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzread)(gzFile file, void *buf, unsigned len) { +int Z_EXPORT PREFIX(gzread)(gzFile file, void *buf, unsigned len) { gz_state *state; /* get internal structure */ @@ -375,7 +376,7 @@ int ZEXPORT PREFIX(gzread)(gzFile file, void *buf, unsigned len) { } /* -- see zlib.h -- */ -size_t ZEXPORT PREFIX(gzfread)(void *buf, size_t size, size_t nitems, gzFile file) { +size_t Z_EXPORT PREFIX(gzfread)(void *buf, size_t size, size_t nitems, gzFile file) { size_t len; gz_state *state; @@ -394,11 +395,11 @@ size_t ZEXPORT PREFIX(gzfread)(void *buf, size_t size, size_t nitems, gzFile fil return 0; /* compute bytes to read -- error on overflow */ - len = nitems * size; - if (size && len / size != nitems) { + if (size && SIZE_MAX / size < nitems) { gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); return 0; } + len = nitems * size; /* read len or fewer bytes to buf, return the number of full items read */ return len ? gz_read(state, buf, len) / size : 0; @@ -407,7 +408,7 @@ size_t ZEXPORT PREFIX(gzfread)(void *buf, size_t size, size_t nitems, gzFile fil /* -- see zlib.h -- */ #undef gzgetc #undef zng_gzgetc -int ZEXPORT PREFIX(gzgetc)(gzFile file) { +int Z_EXPORT PREFIX(gzgetc)(gzFile file) { unsigned char buf[1]; gz_state *state; @@ -431,12 +432,12 @@ int ZEXPORT PREFIX(gzgetc)(gzFile file) { return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; } -int ZEXPORT PREFIX(gzgetc_)(gzFile file) { +int Z_EXPORT PREFIX(gzgetc_)(gzFile file) { return PREFIX(gzgetc)(file); } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzungetc)(int c, gzFile file) { +int Z_EXPORT PREFIX(gzungetc)(int c, gzFile file) { gz_state *state; /* get internal structure */ @@ -492,7 +493,7 @@ int ZEXPORT PREFIX(gzungetc)(int c, gzFile file) { } /* -- see zlib.h -- */ -char * ZEXPORT PREFIX(gzgets)(gzFile file, char *buf, int len) { +char * Z_EXPORT PREFIX(gzgets)(gzFile file, char *buf, int len) { unsigned left, n; char *str; unsigned char *eol; @@ -519,29 +520,31 @@ char * ZEXPORT PREFIX(gzgets)(gzFile file, char *buf, int len) { the contents, let the user worry about that) */ str = buf; left = (unsigned)len - 1; - if (left) do { - /* assure that something is in the output buffer */ - if (state->x.have == 0 && gz_fetch(state) == -1) - return NULL; /* error */ - if (state->x.have == 0) { /* end of file */ - state->past = 1; /* read past end */ - break; /* return what we have */ - } + if (left) { + do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } - /* look for end-of-line in current output buffer */ - n = state->x.have > left ? left : state->x.have; - eol = (unsigned char *)memchr(state->x.next, '\n', n); - if (eol != NULL) - n = (unsigned)(eol - state->x.next) + 1; + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; - /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->x.next, n); - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - left -= n; - buf += n; - } while (left && eol == NULL); + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + } /* return terminated string, or if nothing, end of file */ if (buf == str) @@ -551,7 +554,7 @@ char * ZEXPORT PREFIX(gzgets)(gzFile file, char *buf, int len) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzdirect)(gzFile file) { +int Z_EXPORT PREFIX(gzdirect)(gzFile file) { gz_state *state; /* get internal structure */ @@ -570,7 +573,7 @@ int ZEXPORT PREFIX(gzdirect)(gzFile file) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzclose_r)(gzFile file) { +int Z_EXPORT PREFIX(gzclose_r)(gzFile file) { int ret, err; gz_state *state; @@ -587,13 +590,13 @@ int ZEXPORT PREFIX(gzclose_r)(gzFile file) { /* free memory and close file */ if (state->size) { PREFIX(inflateEnd)(&(state->strm)); - free(state->out); - free(state->in); + zng_free(state->out); + zng_free(state->in); } err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); - free(state); + zng_free(state); return ret ? Z_ERRNO : err; } diff --git a/libs/zlibng/gzwrite.c b/libs/zlibng/gzwrite.c index 20e1d5c63..c4e178f9a 100644 --- a/libs/zlibng/gzwrite.c +++ b/libs/zlibng/gzwrite.c @@ -4,6 +4,7 @@ */ #include "zbuild.h" +#include "zutil_p.h" #include #include "gzguts.h" @@ -21,18 +22,19 @@ static int gz_init(gz_state *state) { PREFIX3(stream) *strm = &(state->strm); /* allocate input buffer (double size for gzprintf) */ - state->in = (unsigned char *)malloc(state->want << 1); + state->in = (unsigned char *)zng_alloc(state->want << 1); if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } + memset(state->in, 0, state->want << 1); /* only need output buffer and deflate state if compressing */ if (!state->direct) { /* allocate output buffer */ - state->out = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)zng_alloc(state->want); if (state->out == NULL) { - free(state->in); + zng_free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } @@ -43,8 +45,8 @@ static int gz_init(gz_state *state) { strm->opaque = NULL; ret = PREFIX(deflateInit2)(strm, state->level, Z_DEFLATED, MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); if (ret != Z_OK) { - free(state->out); - free(state->in); + zng_free(state->out); + zng_free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } @@ -90,6 +92,15 @@ static int gz_comp(gz_state *state, int flush) { return 0; } + /* check for a pending reset */ + if (state->reset) { + /* don't start a new gzip member unless there is data to write */ + if (strm->avail_in == 0) + return 0; + PREFIX(deflateReset)(strm); + state->reset = 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -121,8 +132,7 @@ static int gz_comp(gz_state *state, int flush) { /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) - PREFIX(deflateReset)(strm); - + state->reset = 1; /* all done, no errors */ return 0; } @@ -203,7 +213,7 @@ static size_t gz_write(gz_state *state, void const *buf, size_t len) { return 0; /* directly compress user buffer to file */ - state->strm.next_in = (const unsigned char *)buf; + state->strm.next_in = (z_const unsigned char *) buf; do { unsigned n = (unsigned)-1; if (n > len) @@ -221,7 +231,7 @@ static size_t gz_write(gz_state *state, void const *buf, size_t len) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzwrite)(gzFile file, void const *buf, unsigned len) { +int Z_EXPORT PREFIX(gzwrite)(gzFile file, void const *buf, unsigned len) { gz_state *state; /* get internal structure */ @@ -245,7 +255,7 @@ int ZEXPORT PREFIX(gzwrite)(gzFile file, void const *buf, unsigned len) { } /* -- see zlib.h -- */ -size_t ZEXPORT PREFIX(gzfwrite)(void const *buf, size_t size, size_t nitems, gzFile file) { +size_t Z_EXPORT PREFIX(gzfwrite)(void const *buf, size_t size, size_t nitems, gzFile file) { size_t len; gz_state *state; @@ -274,7 +284,7 @@ size_t ZEXPORT PREFIX(gzfwrite)(void const *buf, size_t size, size_t nitems, gzF } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzputc)(gzFile file, int c) { +int Z_EXPORT PREFIX(gzputc)(gzFile file, int c) { unsigned have; unsigned char buf[1]; gz_state *state; @@ -319,7 +329,7 @@ int ZEXPORT PREFIX(gzputc)(gzFile file, int c) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzputs)(gzFile file, const char *s) { +int Z_EXPORT PREFIX(gzputs)(gzFile file, const char *s) { size_t len, put; gz_state *state; @@ -343,7 +353,7 @@ int ZEXPORT PREFIX(gzputs)(gzFile file, const char *s) { } /* -- see zlib.h -- */ -int ZEXPORTVA PREFIX(gzvprintf)(gzFile file, const char *format, va_list va) { +int Z_EXPORTVA PREFIX(gzvprintf)(gzFile file, const char *format, va_list va) { int len; unsigned left; char *next; @@ -399,7 +409,7 @@ int ZEXPORTVA PREFIX(gzvprintf)(gzFile file, const char *format, va_list va) { return len; } -int ZEXPORTVA PREFIX(gzprintf)(gzFile file, const char *format, ...) { +int Z_EXPORTVA PREFIX(gzprintf)(gzFile file, const char *format, ...) { va_list va; int ret; @@ -410,7 +420,7 @@ int ZEXPORTVA PREFIX(gzprintf)(gzFile file, const char *format, ...) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzflush)(gzFile file, int flush) { +int Z_EXPORT PREFIX(gzflush)(gzFile file, int flush) { gz_state *state; /* get internal structure */ @@ -439,7 +449,7 @@ int ZEXPORT PREFIX(gzflush)(gzFile file, int flush) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzsetparams)(gzFile file, int level, int strategy) { +int Z_EXPORT PREFIX(gzsetparams)(gzFile file, int level, int strategy) { gz_state *state; PREFIX3(stream) *strm; @@ -477,7 +487,7 @@ int ZEXPORT PREFIX(gzsetparams)(gzFile file, int level, int strategy) { } /* -- see zlib.h -- */ -int ZEXPORT PREFIX(gzclose_w)(gzFile file) { +int Z_EXPORT PREFIX(gzclose_w)(gzFile file) { int ret = Z_OK; gz_state *state; @@ -503,14 +513,14 @@ int ZEXPORT PREFIX(gzclose_w)(gzFile file) { if (state->size) { if (!state->direct) { (void)PREFIX(deflateEnd)(&(state->strm)); - free(state->out); + zng_free(state->out); } - free(state->in); + zng_free(state->in); } gz_error(state, Z_OK, NULL); free(state->path); if (close(state->fd) == -1) ret = Z_ERRNO; - free(state); + zng_free(state); return ret; } diff --git a/libs/zlibng/infback.c b/libs/zlibng/infback.c index b4fb562b1..eecf03ada 100644 --- a/libs/zlibng/infback.c +++ b/libs/zlibng/infback.c @@ -15,9 +15,8 @@ #include "inftrees.h" #include "inflate.h" #include "inffast.h" - -/* function prototypes */ -static void fixedtables(struct inflate_state *state); +#include "inflate_p.h" +#include "functable.h" /* strm provides memory allocation functions in zalloc and zfree, or @@ -26,8 +25,8 @@ static void fixedtables(struct inflate_state *state); windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ -int ZEXPORT PREFIX(inflateBackInit_)(PREFIX3(stream) *strm, int windowBits, unsigned char *window, - const char *version, int stream_size) { +int32_t Z_EXPORT PREFIX(inflateBackInit_)(PREFIX3(stream) *strm, int32_t windowBits, uint8_t *window, + const char *version, int32_t stream_size) { struct inflate_state *state; if (version == NULL || version[0] != PREFIX2(VERSION)[0] || stream_size != (int)(sizeof(PREFIX3(stream)))) @@ -36,12 +35,12 @@ int ZEXPORT PREFIX(inflateBackInit_)(PREFIX3(stream) *strm, int windowBits, unsi return Z_STREAM_ERROR; strm->msg = NULL; /* in case we return an error */ if (strm->zalloc == NULL) { - strm->zalloc = zcalloc; + strm->zalloc = zng_calloc; strm->opaque = NULL; } if (strm->zfree == NULL) - strm->zfree = zcfree; - state = (struct inflate_state *)ZALLOC(strm, 1, sizeof(struct inflate_state)); + strm->zfree = zng_cfree; + state = (struct inflate_state *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); @@ -52,90 +51,14 @@ int ZEXPORT PREFIX(inflateBackInit_)(PREFIX3(stream) *strm, int windowBits, unsi state->window = window; state->wnext = 0; state->whave = 0; + state->chunksize = functable.chunksize(); return Z_OK; } /* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -static void fixedtables(struct inflate_state *state) { -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -/* Macros for inflateBack(): */ - -/* Load returned state from inflate_fast() */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Set state from registers for inflate_fast() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) + Private macros for inflateBack() + Look in inflate_p.h for macros shared with inflate() +*/ /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ @@ -157,37 +80,10 @@ static void fixedtables(struct inflate_state *state) { do { \ PULL(); \ have--; \ - hold += (*next++ << bits); \ + hold += ((unsigned)(*next++) << bits); \ bits += 8; \ } while (0) -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflateBack() with - an error. */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - (hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ @@ -225,25 +121,25 @@ static void fixedtables(struct inflate_state *state) { in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for NULL to see whether it - was in() or out() that caused in the error. Otherwise, inflateBack() + was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is NULL or the state was not initialized. */ -int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc, out_func out, void *out_desc) { +int32_t Z_EXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc, out_func out, void *out_desc) { struct inflate_state *state; - const unsigned char *next; /* next input */ - unsigned char *put; /* next output */ - unsigned have, left; /* available input and output */ - uint32_t hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ + z_const unsigned char *next; /* next input */ + unsigned char *put; /* next output */ + unsigned have, left; /* available input and output */ + uint32_t hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int32_t ret; /* return code */ static const uint16_t order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; @@ -316,10 +212,8 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc copy = state->length; PULL(); ROOM(); - if (copy > have) - copy = have; - if (copy > left) - copy = left; + if (copy > have) copy = have; + if (copy > left) copy = left; memcpy(put, next, copy); have -= copy; next += copy; @@ -348,9 +242,9 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc } #endif Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; /* get code length code lengths (not a typo) */ - state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (uint16_t)BITS(3); @@ -359,23 +253,22 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; - state->lencode = (code const *)(state->next); + state->lencode = (const code *)(state->next); state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); + ret = zng_inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; /* get length and distance code code lengths */ - state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; - if (here.bits <= bits) - break; + if (here.bits <= bits) break; PULLBYTE(); } if (here.val < 16) { @@ -390,7 +283,7 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc state->mode = BAD; break; } - len = (unsigned)(state->lens[state->have - 1]); + len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (here.val == 17) { @@ -411,8 +304,10 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc state->mode = BAD; break; } - while (copy--) + while (copy) { + --copy; state->lens[state->have++] = (uint16_t)len; + } } } @@ -431,17 +326,17 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; - state->lencode = (code const *)(state->next); + state->lencode = (const code *)(state->next); state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); + ret = zng_inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } - state->distcode = (code const *)(state->next); + state->distcode = (const code *)(state->next); state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + ret = zng_inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; @@ -458,7 +353,7 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; - inflate_fast(strm, state->wsize); + zng_inflate_fast(strm, state->wsize); LOAD(); break; } @@ -473,8 +368,7 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc if (here.op && (here.op & 0xf0) == 0) { last = here; for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)last.bits + (unsigned)here.bits <= bits) break; PULLBYTE(); @@ -485,7 +379,7 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc state->length = here.val; /* process literal */ - if (here.op == 0) { + if ((int)(here.op) == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); @@ -512,7 +406,7 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc /* length code -- get extra bits, if any */ state->extra = (here.op & 15); - if (state->extra != 0) { + if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); @@ -543,19 +437,21 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc break; } state->offset = here.val; + state->extra = (here.op & 15); /* get distance extra bits, if any */ - state->extra = (here.op & 15); - if (state->extra != 0) { + if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } +#ifdef INFLATE_STRICT if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } +#endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ @@ -604,7 +500,7 @@ int ZEXPORT PREFIX(inflateBack)(PREFIX3(stream) *strm, in_func in, void *in_desc return ret; } -int ZEXPORT PREFIX(inflateBackEnd)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(inflateBackEnd)(PREFIX3(stream) *strm) { if (strm == NULL || strm->state == NULL || strm->zfree == NULL) return Z_STREAM_ERROR; ZFREE(strm, strm->state); diff --git a/libs/zlibng/inffast.c b/libs/zlibng/inffast.c index bd9b2a1c4..18ce570e9 100644 --- a/libs/zlibng/inffast.c +++ b/libs/zlibng/inffast.c @@ -8,19 +8,21 @@ #include "inftrees.h" #include "inflate.h" #include "inffast.h" -#include "memcopy.h" +#include "inflate_p.h" +#include "functable.h" -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - (hold & ((UINT64_C(1) << (n)) - 1)) -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) +/* Load 64 bits from IN and place the bytes at offset BITS in the result. */ +static inline uint64_t load_64_bits(const unsigned char *in, unsigned bits) { + uint64_t chunk; + memcpy(&chunk, in, sizeof(chunk)); +#if BYTE_ORDER == LITTLE_ENDIAN + return chunk << bits; +#else + return ZSWAP64(chunk) << bits; +#endif +} /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is @@ -60,17 +62,15 @@ requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ -void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { +void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start) { /* start: inflate()'s starting value for strm->avail_out */ struct inflate_state *state; - const unsigned char *in; /* local strm->next_in */ + z_const unsigned char *in; /* local strm->next_in */ const unsigned char *last; /* have enough input while in < last */ unsigned char *out; /* local strm->next_out */ unsigned char *beg; /* inflate()'s initial strm->next_out */ unsigned char *end; /* while out < end, enough space available */ -#ifdef INFFAST_CHUNKSIZE unsigned char *safe; /* can use chunkcopy provided out < safe */ -#endif #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif @@ -136,10 +136,7 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { out = strm->next_out; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - (INFLATE_FAST_MIN_LEFT - 1)); - -#ifdef INFFAST_CHUNKSIZE safe = out + strm->avail_out; -#endif #ifdef INFLATE_STRICT dmax = state->dmax; #endif @@ -174,15 +171,13 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { } else if (op & 16) { /* length base */ len = here->val; op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold |= load_64_bits(in, bits); - in += 6; - bits += 48; - } - len += BITS(op); - DROPBITS(op); + if (bits < op) { + hold |= load_64_bits(in, bits); + in += 6; + bits += 48; } + len += BITS(op); + DROPBITS(op); Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold |= load_64_bits(in, bits); @@ -204,8 +199,7 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { dist += BITS(op); #ifdef INFLATE_STRICT if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; + SET_BAD("invalid distance too far back"); break; } #endif @@ -216,8 +210,7 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { op = dist - op; /* distance back in window */ if (op > whave) { if (state->sane) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; + SET_BAD("invalid distance too far back"); break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR @@ -240,7 +233,6 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { } #endif } -#ifdef INFFAST_CHUNKSIZE from = window; if (wnext == 0) { /* very common case */ from += wsize - op; @@ -251,7 +243,7 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { from += wsize - op; if (op < len) { /* some from end of window */ len -= op; - out = chunkcopysafe(out, from, op, safe); + out = functable.chunkcopy_safe(out, from, op, safe); from = window; /* more from start of window */ op = wnext; /* This (rare) case can create a situation where @@ -261,81 +253,28 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { } if (op < len) { /* still need some from output */ len -= op; - out = chunkcopysafe(out, from, op, safe); - out = chunkunroll(out, &dist, &len); - out = chunkcopysafe(out, out - dist, len, safe); + out = functable.chunkcopy_safe(out, from, op, safe); + out = functable.chunkunroll(out, &dist, &len); + out = functable.chunkcopy_safe(out, out - dist, len, safe); } else { - out = chunkcopysafe(out, from, len, safe); + out = functable.chunkcopy_safe(out, from, len, safe); } -#else - from = window; - if (wnext == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - *out++ = *from++; - } while (--op); - from = out - dist; /* rest from output */ - } - } else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - *out++ = *from++; - } while (--op); - from = window; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - *out++ = *from++; - } while (--op); - from = out - dist; /* rest from output */ - } - } - } else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - *out++ = *from++; - } while (--op); - from = out - dist; /* rest from output */ - } - } - - out = chunk_copy(out, from, (int) (out - from), len); -#endif } else { -#ifdef INFFAST_CHUNKSIZE - /* Whole reference is in range of current output. No - range checks are necessary because we start with room - for at least 258 bytes of output, so unroll and roundoff - operations can write beyond `out+len` so long as they - stay within 258 bytes of `out`. + /* Whole reference is in range of current output. No range checks are + necessary because we start with room for at least 258 bytes of output, + so unroll and roundoff operations can write beyond `out+len` so long + as they stay within 258 bytes of `out`. */ - if (dist >= len || dist >= INFFAST_CHUNKSIZE) - out = chunkcopy(out, out - dist, len); + if (dist >= len || dist >= state->chunksize) + out = functable.chunkcopy(out, out - dist, len); else - out = chunkmemset(out, dist, len); -#else - if (len < sizeof(uint64_t)) - out = set_bytes(out, out - dist, dist, len); - else if (dist == 1) - out = byte_memset(out, len); - else - out = chunk_memset(out, out - dist, dist, len); -#endif + out = functable.chunkmemset(out, dist, len); } } else if ((op & 64) == 0) { /* 2nd level distance code */ here = dcode + here->val + BITS(op); goto dodist; } else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; + SET_BAD("invalid distance code"); break; } } else if ((op & 64) == 0) { /* 2nd level length code */ @@ -346,8 +285,7 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { state->mode = TYPE; break; } else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; + SET_BAD("invalid literal/length code"); break; } } while (in < last && out < end); @@ -361,12 +299,10 @@ void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start) { /* update state and return */ strm->next_in = in; strm->next_out = out; - strm->avail_in = - (unsigned)(in < last ? (INFLATE_FAST_MIN_HAVE - 1) + (last - in) - : (INFLATE_FAST_MIN_HAVE - 1) - (in - last)); - strm->avail_out = - (unsigned)(out < end ? (INFLATE_FAST_MIN_LEFT - 1) + (end - out) - : (INFLATE_FAST_MIN_LEFT - 1) - (out - end)); + strm->avail_in = (unsigned)(in < last ? (INFLATE_FAST_MIN_HAVE - 1) + (last - in) + : (INFLATE_FAST_MIN_HAVE - 1) - (in - last)); + strm->avail_out = (unsigned)(out < end ? (INFLATE_FAST_MIN_LEFT - 1) + (end - out) + : (INFLATE_FAST_MIN_LEFT - 1) - (out - end)); Assert(bits <= 32, "Remaining bits greater than 32"); state->hold = (uint32_t)hold; diff --git a/libs/zlibng/inffast.h b/libs/zlibng/inffast.h index 9ad21abc8..179a65da6 100644 --- a/libs/zlibng/inffast.h +++ b/libs/zlibng/inffast.h @@ -10,7 +10,7 @@ subject to change. Applications should only use zlib.h. */ -void ZLIB_INTERNAL inflate_fast(PREFIX3(stream) *strm, unsigned long start); +void Z_INTERNAL zng_inflate_fast(PREFIX3(stream) *strm, unsigned long start); #define INFLATE_FAST_MIN_HAVE 8 #define INFLATE_FAST_MIN_LEFT 258 diff --git a/libs/zlibng/inffixed.h b/libs/zlibng/inffixed.h deleted file mode 100644 index d62832776..000000000 --- a/libs/zlibng/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. - It is part of the implementation of this library and is - subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/libs/zlibng/inffixed_tbl.h b/libs/zlibng/inffixed_tbl.h new file mode 100644 index 000000000..7292fa06e --- /dev/null +++ b/libs/zlibng/inffixed_tbl.h @@ -0,0 +1,94 @@ +/* inffixed_tbl.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + +/* WARNING: this file should *not* be used by applications. + * It is part of the implementation of this library and is + * subject to change. Applications should only use zlib.h. + */ + +static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} +}; + +static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} +}; diff --git a/libs/zlibng/inflate.c b/libs/zlibng/inflate.c index 8a8d328f9..5c30816dd 100644 --- a/libs/zlibng/inflate.c +++ b/libs/zlibng/inflate.c @@ -3,89 +3,13 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common wnext == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - #include "zbuild.h" #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" -#include "memcopy.h" +#include "inflate_p.h" +#include "inffixed_tbl.h" #include "functable.h" /* Architecture-specific hooks. */ @@ -111,21 +35,13 @@ # define INFLATE_NEED_UPDATEWINDOW(strm) 1 /* Invoked at the beginning of inflateMark(). Useful for updating arch-specific pointers and offsets. */ # define INFLATE_MARK_HOOK(strm) do {} while (0) -#endif - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif +/* Invoked at the beginning of inflateSyncPoint(). Useful for performing arch-specific state checks. */ +#define INFLATE_SYNC_POINT_HOOK(strm) do {} while (0) #endif /* function prototypes */ static int inflateStateCheck(PREFIX3(stream) *strm); -static void fixedtables(struct inflate_state *state); static int updatewindow(PREFIX3(stream) *strm, const unsigned char *end, uint32_t copy); -#ifdef BUILDFIXED - void makefixed(void); -#endif static uint32_t syncsearch(uint32_t *have, const unsigned char *buf, uint32_t len); static int inflateStateCheck(PREFIX3(stream) *strm) { @@ -138,7 +54,7 @@ static int inflateStateCheck(PREFIX3(stream) *strm) { return 0; } -int ZEXPORT PREFIX(inflateResetKeep)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(inflateResetKeep)(PREFIX3(stream) *strm) { struct inflate_state *state; if (inflateStateCheck(strm)) @@ -149,9 +65,10 @@ int ZEXPORT PREFIX(inflateResetKeep)(PREFIX3(stream) *strm) { if (state->wrap) /* to support ill-conceived Java test suite */ strm->adler = state->wrap & 1; state->mode = HEAD; - state->check = functable.adler32(0L, NULL, 0); + state->check = ADLER32_INITIAL_VALUE; state->last = 0; state->havedict = 0; + state->flags = -1; state->dmax = 32768U; state->head = NULL; state->hold = 0; @@ -164,7 +81,7 @@ int ZEXPORT PREFIX(inflateResetKeep)(PREFIX3(stream) *strm) { return Z_OK; } -int ZEXPORT PREFIX(inflateReset)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(inflateReset)(PREFIX3(stream) *strm) { struct inflate_state *state; if (inflateStateCheck(strm)) @@ -176,7 +93,7 @@ int ZEXPORT PREFIX(inflateReset)(PREFIX3(stream) *strm) { return PREFIX(inflateResetKeep)(strm); } -int ZEXPORT PREFIX(inflateReset2)(PREFIX3(stream) *strm, int windowBits) { +int32_t Z_EXPORT PREFIX(inflateReset2)(PREFIX3(stream) *strm, int32_t windowBits) { int wrap; struct inflate_state *state; @@ -211,13 +128,13 @@ int ZEXPORT PREFIX(inflateReset2)(PREFIX3(stream) *strm, int windowBits) { return PREFIX(inflateReset)(strm); } -int ZEXPORT PREFIX(inflateInit2_)(PREFIX3(stream) *strm, int windowBits, const char *version, int stream_size) { - int ret; +int32_t Z_EXPORT PREFIX(inflateInit2_)(PREFIX3(stream) *strm, int32_t windowBits, const char *version, int32_t stream_size) { + int32_t ret; struct inflate_state *state; -#ifdef X86_CPUID +#if defined(X86_FEATURES) x86_check_features(); -#elif defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) +#elif defined(ARM_FEATURES) arm_check_features(); #endif @@ -227,11 +144,11 @@ int ZEXPORT PREFIX(inflateInit2_)(PREFIX3(stream) *strm, int windowBits, const c return Z_STREAM_ERROR; strm->msg = NULL; /* in case we return an error */ if (strm->zalloc == NULL) { - strm->zalloc = zcalloc; + strm->zalloc = zng_calloc; strm->opaque = NULL; } if (strm->zfree == NULL) - strm->zfree = zcfree; + strm->zfree = zng_cfree; state = (struct inflate_state *) ZALLOC_STATE(strm, 1, sizeof(struct inflate_state)); if (state == NULL) return Z_MEM_ERROR; @@ -240,6 +157,7 @@ int ZEXPORT PREFIX(inflateInit2_)(PREFIX3(stream) *strm, int windowBits, const c state->strm = strm; state->window = NULL; state->mode = HEAD; /* to pass state test in inflateReset2() */ + state->chunksize = functable.chunksize(); ret = PREFIX(inflateReset2)(strm, windowBits); if (ret != Z_OK) { ZFREE_STATE(strm, state); @@ -248,11 +166,11 @@ int ZEXPORT PREFIX(inflateInit2_)(PREFIX3(stream) *strm, int windowBits, const c return ret; } -int ZEXPORT PREFIX(inflateInit_)(PREFIX3(stream) *strm, const char *version, int stream_size) { +int32_t Z_EXPORT PREFIX(inflateInit_)(PREFIX3(stream) *strm, const char *version, int32_t stream_size) { return PREFIX(inflateInit2_)(strm, DEF_WBITS, version, stream_size); } -int ZEXPORT PREFIX(inflatePrime)(PREFIX3(stream) *strm, int bits, int value) { +int32_t Z_EXPORT PREFIX(inflatePrime)(PREFIX3(stream) *strm, int32_t bits, int32_t value) { struct inflate_state *state; if (inflateStateCheck(strm)) @@ -274,133 +192,24 @@ int ZEXPORT PREFIX(inflatePrime)(PREFIX3(stream) *strm, int bits, int value) { /* Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. + fixed code decoding. This returns fixed tables from inffixed_tbl.h. */ -static void fixedtables(struct inflate_state *state) { -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ +void Z_INTERNAL fixedtables(struct inflate_state *state) { state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed(void) { - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) - printf("\n "); - printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, - state.lencode[low].bits, state.lencode[low].val); - if (++low == size) - break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) - printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); - if (++low == size) - break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -int ZLIB_INTERNAL inflate_ensure_window(struct inflate_state *state) -{ +int Z_INTERNAL inflate_ensure_window(struct inflate_state *state) { /* if it hasn't been done already, allocate space for the window */ if (state->window == NULL) { -#ifdef INFFAST_CHUNKSIZE unsigned wsize = 1U << state->wbits; - state->window = (unsigned char *) ZALLOC_WINDOW(state->strm, wsize + INFFAST_CHUNKSIZE, sizeof(unsigned char)); + state->window = (unsigned char *) ZALLOC_WINDOW(state->strm, wsize + state->chunksize, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; - memset(state->window + wsize, 0, INFFAST_CHUNKSIZE); -#else - state->window = (unsigned char *) ZALLOC_WINDOW(state->strm, 1U << state->wbits, sizeof(unsigned char)); - if (state->window == NULL) - return 1; -#endif + memset(state->window + wsize, 0, state->chunksize); } /* if window not in use yet, initialize */ @@ -427,7 +236,7 @@ int ZLIB_INTERNAL inflate_ensure_window(struct inflate_state *state) output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -static int updatewindow(PREFIX3(stream) *strm, const unsigned char *end, uint32_t copy) { +static int32_t updatewindow(PREFIX3(stream) *strm, const uint8_t *end, uint32_t copy) { struct inflate_state *state; uint32_t dist; @@ -461,66 +270,13 @@ static int updatewindow(PREFIX3(stream) *strm, const unsigned char *end, uint32_ return 0; } -/* Macros for inflate(): */ -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? PREFIX(crc32)(check, buf, len) : functable.adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) functable.adler32(check, buf, len) -#endif +/* + Private macros for inflate() + Look in inflate_p.h for macros shared with inflateBack() +*/ -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = PREFIX(crc32)(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = PREFIX(crc32)(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ +/* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ @@ -529,32 +285,6 @@ static int updatewindow(PREFIX3(stream) *strm, const unsigned char *end, uint32_ bits += 8; \ } while (0) -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - (hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is @@ -637,7 +367,7 @@ static int updatewindow(PREFIX3(stream) *strm, const unsigned char *end, uint32_ will return Z_BUF_ERROR if it has not reached the end of the stream. */ -int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { +int32_t Z_EXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int32_t flush) { struct inflate_state *state; const unsigned char *next; /* next input */ unsigned char *put; /* next output */ @@ -650,7 +380,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ + int32_t ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif @@ -686,7 +416,6 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->mode = FLAGS; break; } - state->flags = 0; /* expect zlib header */ if (state->head != NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ @@ -694,13 +423,11 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; + SET_BAD("incorrect header check"); break; } if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; + SET_BAD("unknown compression method"); break; } DROPBITS(4); @@ -708,28 +435,27 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { if (state->wbits == 0) state->wbits = len; if (len > 15 || len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; + SET_BAD("invalid window size"); break; } state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = functable.adler32(0L, NULL, 0); + strm->adler = state->check = ADLER32_INITIAL_VALUE; state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP + case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; + SET_BAD("unknown compression method"); break; } if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; + SET_BAD("unknown header flags set"); break; } if (state->head != NULL) @@ -738,6 +464,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { CRC2(state->check, hold); INITBITS(); state->mode = TIME; + case TIME: NEEDBITS(32); if (state->head != NULL) @@ -746,6 +473,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { CRC4(state->check, hold); INITBITS(); state->mode = OS; + case OS: NEEDBITS(16); if (state->head != NULL) { @@ -756,6 +484,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; + case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); @@ -769,14 +498,14 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->head->extra = NULL; } state->mode = EXTRA; + case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { - if (state->head != NULL && - state->head->extra != NULL) { + if (state->head != NULL && state->head->extra != NULL) { len = state->head->extra_len - state->length; memcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? @@ -793,6 +522,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { } state->length = 0; state->mode = NAME; + case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; @@ -813,6 +543,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { } state->length = 0; state->mode = COMMENT; + case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; @@ -833,12 +564,12 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->head->comment = NULL; } state->mode = HCRC; + case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if ((state->wrap & 4) && hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; + SET_BAD("header crc mismatch"); break; } INITBITS(); @@ -856,17 +587,21 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; + case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } - strm->adler = state->check = functable.adler32(0L, NULL, 0); + strm->adler = state->check = ADLER32_INITIAL_VALUE; state->mode = TYPE; + case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + /* determine and dispatch block type */ INFLATE_TYPEDO_HOOK(strm, flush); /* hook for IBM Z DFLTCC */ if (state->last) { BYTEBITS(); @@ -895,17 +630,17 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->mode = TABLE; break; case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; + SET_BAD("invalid block type"); } DROPBITS(2); break; + case STORED: + /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; + SET_BAD("invalid stored block lengths"); break; } state->length = (uint16_t)hold; @@ -914,9 +649,12 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; + case COPY_: state->mode = COPY; + case COPY: + /* copy stored block from input to output */ copy = state->length; if (copy) { if (copy > have) copy = have; @@ -933,7 +671,9 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; + case TABLE: + /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); @@ -943,15 +683,16 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; + SET_BAD("too many length or distance symbols"); break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; + case LENLENS: + /* get code length code lengths (not a typo) */ while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (uint16_t)BITS(3); @@ -962,16 +703,17 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->next = state->codes; state->lencode = (const code *)(state->next); state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); + ret = zng_inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; + SET_BAD("invalid code lengths set"); break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; + case CODELENS: + /* get length and distance code code lengths */ while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; @@ -986,8 +728,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; + SET_BAD("invalid bit length repeat"); break; } len = state->lens[state->have - 1]; @@ -1007,8 +748,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; + SET_BAD("invalid bit length repeat"); break; } while (copy) { @@ -1024,8 +764,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; + SET_BAD("invalid code -- missing end-of-block"); break; } @@ -1035,38 +774,40 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->next = state->codes; state->lencode = (const code *)(state->next); state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); + ret = zng_inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; + SET_BAD("invalid literal/lengths set"); break; } state->distcode = (const code *)(state->next); state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + ret = zng_inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; + SET_BAD("invalid distances set"); break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; + case LEN_: state->mode = LEN; + case LEN: - if (have >= INFLATE_FAST_MIN_HAVE && - left >= INFLATE_FAST_MIN_LEFT) { + /* use inflate_fast() if we have enough input and output */ + if (have >= INFLATE_FAST_MIN_HAVE && left >= INFLATE_FAST_MIN_LEFT) { RESTORE(); - inflate_fast(strm, out); + zng_inflate_fast(strm, out); LOAD(); if (state->mode == TYPE) state->back = -1; break; } state->back = 0; + + /* get a literal, length, or end-of-block code */ for (;;) { here = state->lencode[BITS(state->lenbits)]; if (here.bits <= bits) @@ -1087,6 +828,8 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { DROPBITS(here.bits); state->back += here.bits; state->length = here.val; + + /* process literal */ if ((int)(here.op) == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : @@ -1094,20 +837,27 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->mode = LIT; break; } + + /* process end of block */ if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->back = -1; state->mode = TYPE; break; } + + /* invalid code */ if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; + SET_BAD("invalid literal/length code"); break; } + + /* length code */ state->extra = (here.op & 15); state->mode = LENEXT; + case LENEXT: + /* get extra bits, if any */ if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); @@ -1117,7 +867,9 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; + case DIST: + /* get distance code */ for (;;) { here = state->distcode[BITS(state->distbits)]; if (here.bits <= bits) @@ -1138,14 +890,15 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { DROPBITS(here.bits); state->back += here.bits; if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; + SET_BAD("invalid distance code"); break; } state->offset = here.val; state->extra = (here.op & 15); state->mode = DISTEXT; + case DISTEXT: + /* get distance extra bits, if any */ if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); @@ -1154,22 +907,22 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; + SET_BAD("invalid distance too far back"); break; } #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; + case MATCH: + /* copy match from window to output */ if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->whave) { if (state->sane) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; + SET_BAD("invalid distance too far back"); break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR @@ -1199,32 +952,21 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { copy = state->length; if (copy > left) copy = left; -#if defined(INFFAST_CHUNKSIZE) - put = chunkcopysafe(put, from, copy, put + left); -#else - if (copy >= sizeof(uint64_t)) - put = chunk_memcpy(put, from, copy); - else - put = copy_bytes(put, from, copy); -#endif + + put = functable.chunkcopy_safe(put, from, copy, put + left); } else { /* copy from output */ copy = state->length; if (copy > left) copy = left; -#if defined(INFFAST_CHUNKSIZE) - put = chunkmemsetsafe(put, state->offset, copy, left); -#else - if (copy >= sizeof(uint64_t)) - put = chunk_memset(put, put - state->offset, state->offset, copy); - else - put = set_bytes(put, put - state->offset, state->offset, copy); -#endif + + put = functable.chunkmemset_safe(put, state->offset, copy, left); } left -= copy; state->length -= copy; if (state->length == 0) state->mode = LEN; break; + case LIT: if (left == 0) goto inf_leave; @@ -1232,6 +974,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { left--; state->mode = LEN; break; + case CHECK: if (state->wrap) { NEEDBITS(32); @@ -1246,8 +989,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { state->flags ? hold : #endif ZSWAP32(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; + SET_BAD("incorrect data check"); break; } INITBITS(); @@ -1255,12 +997,12 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { } #ifdef GUNZIP state->mode = LENGTH; + case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { + SET_BAD("incorrect length check"); break; } INITBITS(); @@ -1268,16 +1010,22 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { } #endif state->mode = DONE; + case DONE: + /* inflate stream terminated properly */ ret = Z_STREAM_END; goto inf_leave; + case BAD: ret = Z_DATA_ERROR; goto inf_leave; + case MEM: return Z_MEM_ERROR; + case SYNC: - default: + + default: /* can't happen, but makes compilers happy */ return Z_STREAM_ERROR; } @@ -1311,7 +1059,7 @@ int ZEXPORT PREFIX(inflate)(PREFIX3(stream) *strm, int flush) { return ret; } -int ZEXPORT PREFIX(inflateEnd)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(inflateEnd)(PREFIX3(stream) *strm) { struct inflate_state *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1324,7 +1072,7 @@ int ZEXPORT PREFIX(inflateEnd)(PREFIX3(stream) *strm) { return Z_OK; } -int ZEXPORT PREFIX(inflateGetDictionary)(PREFIX3(stream) *strm, unsigned char *dictionary, unsigned int *dictLength) { +int32_t Z_EXPORT PREFIX(inflateGetDictionary)(PREFIX3(stream) *strm, uint8_t *dictionary, uint32_t *dictLength) { struct inflate_state *state; /* check state */ @@ -1342,10 +1090,10 @@ int ZEXPORT PREFIX(inflateGetDictionary)(PREFIX3(stream) *strm, unsigned char *d return Z_OK; } -int ZEXPORT PREFIX(inflateSetDictionary)(PREFIX3(stream) *strm, const unsigned char *dictionary, unsigned int dictLength) { +int32_t Z_EXPORT PREFIX(inflateSetDictionary)(PREFIX3(stream) *strm, const uint8_t *dictionary, uint32_t dictLength) { struct inflate_state *state; unsigned long dictid; - int ret; + int32_t ret; /* check state */ if (inflateStateCheck(strm)) @@ -1356,8 +1104,7 @@ int ZEXPORT PREFIX(inflateSetDictionary)(PREFIX3(stream) *strm, const unsigned c /* check for correct dictionary identifier */ if (state->mode == DICT) { - dictid = functable.adler32(0L, NULL, 0); - dictid = functable.adler32(dictid, dictionary, dictLength); + dictid = functable.adler32(ADLER32_INITIAL_VALUE, dictionary, dictLength); if (dictid != state->check) return Z_DATA_ERROR; } @@ -1374,7 +1121,7 @@ int ZEXPORT PREFIX(inflateSetDictionary)(PREFIX3(stream) *strm, const unsigned c return Z_OK; } -int ZEXPORT PREFIX(inflateGetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) head) { +int32_t Z_EXPORT PREFIX(inflateGetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) head) { struct inflate_state *state; /* check state */ @@ -1401,9 +1148,8 @@ int ZEXPORT PREFIX(inflateGetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) h called again with more data and the *have state. *have is initialized to zero for the first call. */ -static uint32_t syncsearch(uint32_t *have, const unsigned char *buf, uint32_t len) { - uint32_t got; - uint32_t next; +static uint32_t syncsearch(uint32_t *have, const uint8_t *buf, uint32_t len) { + uint32_t got, next; got = *have; next = 0; @@ -1420,8 +1166,9 @@ static uint32_t syncsearch(uint32_t *have, const unsigned char *buf, uint32_t le return next; } -int ZEXPORT PREFIX(inflateSync)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(inflateSync)(PREFIX3(stream) *strm) { unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ size_t in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state *state; @@ -1457,13 +1204,17 @@ int ZEXPORT PREFIX(inflateSync)(PREFIX3(stream) *strm) { /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; - if (state->mode == HEAD) - state->wrap = 0; /* never processed header, so assume raw */ + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; in = strm->total_in; out = strm->total_out; PREFIX(inflateReset)(strm); strm->total_in = in; strm->total_out = out; + state->flags = flags; state->mode = TYPE; return Z_OK; } @@ -1476,16 +1227,17 @@ int ZEXPORT PREFIX(inflateSync)(PREFIX3(stream) *strm) { block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ -int ZEXPORT PREFIX(inflateSyncPoint)(PREFIX3(stream) *strm) { +int32_t Z_EXPORT PREFIX(inflateSyncPoint)(PREFIX3(stream) *strm) { struct inflate_state *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + INFLATE_SYNC_POINT_HOOK(strm); state = (struct inflate_state *)strm->state; return state->mode == STORED && state->bits == 0; } -int ZEXPORT PREFIX(inflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) { +int32_t Z_EXPORT PREFIX(inflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) { struct inflate_state *state; struct inflate_state *copy; unsigned char *window; @@ -1497,13 +1249,12 @@ int ZEXPORT PREFIX(inflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) state = (struct inflate_state *)source->state; /* allocate space */ - copy = (struct inflate_state *) - ZALLOC_STATE(source, 1, sizeof(struct inflate_state)); + copy = (struct inflate_state *)ZALLOC_STATE(source, 1, sizeof(struct inflate_state)); if (copy == NULL) return Z_MEM_ERROR; window = NULL; if (state->window != NULL) { - window = (unsigned char *) ZALLOC_WINDOW(source, 1U << state->wbits, sizeof(unsigned char)); + window = (unsigned char *)ZALLOC_WINDOW(source, 1U << state->wbits, sizeof(unsigned char)); if (window == NULL) { ZFREE_STATE(source, copy); return Z_MEM_ERROR; @@ -1528,7 +1279,7 @@ int ZEXPORT PREFIX(inflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) return Z_OK; } -int ZEXPORT PREFIX(inflateUndermine)(PREFIX3(stream) *strm, int subvert) { +int32_t Z_EXPORT PREFIX(inflateUndermine)(PREFIX3(stream) *strm, int32_t subvert) { struct inflate_state *state; if (inflateStateCheck(strm)) @@ -1544,7 +1295,7 @@ int ZEXPORT PREFIX(inflateUndermine)(PREFIX3(stream) *strm, int subvert) { #endif } -int ZEXPORT PREFIX(inflateValidate)(PREFIX3(stream) *strm, int check) { +int32_t Z_EXPORT PREFIX(inflateValidate)(PREFIX3(stream) *strm, int32_t check) { struct inflate_state *state; if (inflateStateCheck(strm)) @@ -1557,18 +1308,19 @@ int ZEXPORT PREFIX(inflateValidate)(PREFIX3(stream) *strm, int check) { return Z_OK; } -long ZEXPORT PREFIX(inflateMark)(PREFIX3(stream) *strm) { +long Z_EXPORT PREFIX(inflateMark)(PREFIX3(stream) *strm) { struct inflate_state *state; if (inflateStateCheck(strm)) return -65536; INFLATE_MARK_HOOK(strm); /* hook for IBM Z DFLTCC */ state = (struct inflate_state *)strm->state; - return ((long)(state->back) << 16) + (state->mode == COPY ? state->length : + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : (state->mode == MATCH ? state->was - state->length : 0)); } -unsigned long ZEXPORT PREFIX(inflateCodesUsed)(PREFIX3(stream) *strm) { +unsigned long Z_EXPORT PREFIX(inflateCodesUsed)(PREFIX3(stream) *strm) { struct inflate_state *state; if (strm == NULL || strm->state == NULL) return (unsigned long)-1; diff --git a/libs/zlibng/inflate.h b/libs/zlibng/inflate.h index 01fb1f9b0..a42749465 100644 --- a/libs/zlibng/inflate.h +++ b/libs/zlibng/inflate.h @@ -11,10 +11,9 @@ #ifndef INFLATE_H_ #define INFLATE_H_ -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ +/* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). + NO_GZIP would be used to avoid linking in the crc code when it is not needed. + For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif @@ -89,7 +88,8 @@ struct inflate_state { int wrap; /* bit 0 true for zlib, bit 1 true for gzip, bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ + int flags; /* gzip header method and flags, 0 if zlib, or + -1 if raw or no header yet */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ @@ -125,8 +125,10 @@ struct inflate_state { int sane; /* if false, allow invalid distance too far */ int back; /* bits back of last unprocessed length/lit */ unsigned was; /* initial length of match */ + uint32_t chunksize; /* size of memory copying chunk */ }; -int ZLIB_INTERNAL inflate_ensure_window(struct inflate_state *state); +int Z_INTERNAL inflate_ensure_window(struct inflate_state *state); +void Z_INTERNAL fixedtables(struct inflate_state *state); #endif /* INFLATE_H_ */ diff --git a/libs/zlibng/inflate_p.h b/libs/zlibng/inflate_p.h new file mode 100644 index 000000000..76fe2dccb --- /dev/null +++ b/libs/zlibng/inflate_p.h @@ -0,0 +1,101 @@ +/* inflate_p.h -- Private inline functions and macros shared with more than one deflate method + * + */ + +#ifndef INFLATE_P_H +#define INFLATE_P_H + +/* + * Macros shared by inflate() and inflateBack() + */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? PREFIX(crc32)(check, buf, len) : functable.adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) functable.adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = PREFIX(crc32)(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = PREFIX(crc32)(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = (z_const unsigned char *)next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Ensure that there is at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate()/inflateBack(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + (hold & ((1U << (unsigned)(n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +#endif + +/* Set mode=BAD and prepare error message */ +#define SET_BAD(errmsg) \ + do { \ + state->mode = BAD; \ + strm->msg = (char *)errmsg; \ + } while (0) diff --git a/libs/zlibng/inftrees.c b/libs/zlibng/inftrees.c index 51e85375c..faf1d249d 100644 --- a/libs/zlibng/inftrees.c +++ b/libs/zlibng/inftrees.c @@ -9,7 +9,7 @@ #define MAXBITS 15 -const char inflate_copyright[] = " inflate 1.2.11.f Copyright 1995-2016 Mark Adler "; +const char PREFIX(inflate_copyright)[] = " inflate 1.2.11.f Copyright 1995-2016 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,8 +29,8 @@ const char inflate_copyright[] = " inflate 1.2.11.f Copyright 1995-2016 Mark Adl table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int ZLIB_INTERNAL inflate_table(codetype type, uint16_t *lens, unsigned codes, - code * *table, unsigned *bits, uint16_t *work) { +int Z_INTERNAL zng_inflate_table(codetype type, uint16_t *lens, unsigned codes, + code * *table, unsigned *bits, uint16_t *work) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ diff --git a/libs/zlibng/inftrees.h b/libs/zlibng/inftrees.h index eaf3df1ca..7758737c2 100644 --- a/libs/zlibng/inftrees.h +++ b/libs/zlibng/inftrees.h @@ -60,7 +60,7 @@ typedef enum { DISTS } codetype; -int ZLIB_INTERNAL inflate_table (codetype type, uint16_t *lens, unsigned codes, +int Z_INTERNAL zng_inflate_table (codetype type, uint16_t *lens, unsigned codes, code * *table, unsigned *bits, uint16_t *work); #endif /* INFTREES_H_ */ diff --git a/libs/zlibng/insert_string.c b/libs/zlibng/insert_string.c new file mode 100644 index 000000000..4ddf9ae5d --- /dev/null +++ b/libs/zlibng/insert_string.c @@ -0,0 +1,25 @@ +/* insert_string_c -- insert_string variant for c + * + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + */ + +#include "zbuild.h" +#include "deflate.h" + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define HASH_SLIDE 16 // Number of bits to slide hash + +#define UPDATE_HASH(s, h, val) \ + h = ((val * 2654435761U) >> HASH_SLIDE); + +#define INSERT_STRING insert_string_c +#define QUICK_INSERT_STRING quick_insert_string_c + +#include "insert_string_tpl.h" diff --git a/libs/zlibng/insert_string_tpl.h b/libs/zlibng/insert_string_tpl.h new file mode 100644 index 000000000..9796e5196 --- /dev/null +++ b/libs/zlibng/insert_string_tpl.h @@ -0,0 +1,89 @@ +#ifndef INSERT_STRING_H_ +#define INSERT_STRING_H_ + +/* insert_string.h -- Private insert_string functions shared with more than + * one insert string implementation + * + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * + * Copyright (C) 2013 Intel Corporation. All rights reserved. + * Authors: + * Wajdi Feghali + * Jim Guilford + * Vinodh Gopal + * Erdinc Ozturk + * Jim Kukunas + * + * Portions are Copyright (C) 2016 12Sided Technology, LLC. + * Author: + * Phil Vachon + * + * For conditions of distribution and use, see copyright notice in zlib.h + * + */ + +/* =========================================================================== + * Quick insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + */ +Z_INTERNAL Pos QUICK_INSERT_STRING(deflate_state *const s, const uint32_t str) { + Pos head; + uint8_t *strstart = s->window + str; + uint32_t val, hm, h = 0; + +#ifdef UNALIGNED_OK + val = *(uint32_t *)(strstart); +#else + val = ((uint32_t)(strstart[0])); + val |= ((uint32_t)(strstart[1]) << 8); + val |= ((uint32_t)(strstart[2]) << 16); + val |= ((uint32_t)(strstart[3]) << 24); +#endif + + UPDATE_HASH(s, h, val); + hm = h & HASH_MASK; + + head = s->head[hm]; + if (LIKELY(head != str)) { + s->prev[str & s->w_mask] = head; + s->head[hm] = (Pos)str; + } + return head; +} + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +Z_INTERNAL void INSERT_STRING(deflate_state *const s, const uint32_t str, uint32_t count) { + uint8_t *strstart = s->window + str; + uint8_t *strend = strstart + count - 1; /* last position */ + + for (Pos idx = (Pos)str; strstart <= strend; idx++, strstart++) { + uint32_t val, hm, h = 0; + +#ifdef UNALIGNED_OK + val = *(uint32_t *)(strstart); +#else + val = ((uint32_t)(strstart[0])); + val |= ((uint32_t)(strstart[1]) << 8); + val |= ((uint32_t)(strstart[2]) << 16); + val |= ((uint32_t)(strstart[3]) << 24); +#endif + + UPDATE_HASH(s, h, val); + hm = h & HASH_MASK; + + Pos head = s->head[hm]; + if (LIKELY(head != idx)) { + s->prev[idx & s->w_mask] = head; + s->head[hm] = idx; + } + } +} +#endif diff --git a/libs/zlibng/match_p.h b/libs/zlibng/match_p.h deleted file mode 100644 index b956d8d52..000000000 --- a/libs/zlibng/match_p.h +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is garbage. - * - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >=1 - * OUT assertion: the match length is not greater than s->lookahead - */ - -#include "zbuild.h" -#include "deflate.h" - -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - - /* ARM 32-bit clang/gcc builds perform better, on average, with std2. Both gcc and clang and define __GNUC__. */ -# if defined(__GNUC__) && defined(__arm__) && !defined(__aarch64__) -# define std2_longest_match - /* Only use std3_longest_match for little_endian systems, also avoid using it with - non-gcc compilers since the __builtin_ctzl() function might not be optimized. */ -# elif(defined(__GNUC__) && defined(HAVE_BUILTIN_CTZL) && ((__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ - || defined(__LITTLE_ENDIAN__))) -# define std3_longest_match -# elif(defined(_MSC_VER) && defined(_WIN32)) -# define std3_longest_match -# else -# define std2_longest_match -# endif - -#else -# define std1_longest_match -#endif - - -#if defined(_MSC_VER) && !defined(__clang__) -# if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) -# include "arch/x86/ctzl.h" -# elif defined(_M_ARM) -# include "arch/arm/ctzl.h" -# endif -#endif - - - -#ifdef std1_longest_match - -/* - * Standard longest_match - * - */ -static inline unsigned longest_match(deflate_state *const s, IPos cur_match) { - const unsigned wmask = s->w_mask; - const Pos *prev = s->prev; - - unsigned chain_length; - IPos limit; - unsigned int len, best_len, nice_match; - unsigned char *scan, *match, *strend, scan_end, scan_end1; - - /* - * The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple - * of 16. It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* - * Do not waste too much time if we already have a good match - */ - best_len = s->prev_length; - chain_length = s->max_chain_length; - if (best_len >= s->good_match) - chain_length >>= 2; - - /* - * Do not looks for matches beyond the end of the input. This is - * necessary to make deflate deterministic - */ - nice_match = (unsigned int)s->nice_match > s->lookahead ? s->lookahead : (unsigned int)s->nice_match; - - /* - * Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0 - */ - limit = s->strstart > MAX_DIST(s) ? s->strstart - MAX_DIST(s) : 0; - - scan = s->window + s->strstart; - strend = s->window + s->strstart + MAX_MATCH; - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; - - Assert((unsigned long)s->strstart <= s->window_size - MIN_LOOKAHEAD, "need lookahead"); - do { - if (cur_match >= s->strstart) { - break; - } - match = s->window + cur_match; - - /* - * Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks - * below for insufficient lookahead only occur occasionally - * for performance reasons. Therefore uninitialized memory - * will be accessed and conditional jumps will be made that - * depend on those values. However the length of the match - * is limited to the lookahead, so the output of deflate is not - * affected by the uninitialized values. - */ - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) - continue; - - /* - * The check at best_len-1 can be removed because it will - * be made again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since - * they are always equal when the other bytes match, given - * that the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2; - match++; - Assert(*scan == *match, "match[2]?"); - - /* - * We check for insufficient lookahead only every 8th - * comparision; the 256th check will be made at strstart + 258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned int)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) - break; - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; - } else { - /* - * The probability of finding a match later if we here - * is pretty low, so for performance it's best to - * outright stop here for the lower compression levels - */ - if (s->level < TRIGGER_LEVEL) - break; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length); - - if ((unsigned int)best_len <= s->lookahead) - return best_len; - return s->lookahead; -} -#endif - -#ifdef std2_longest_match -/* - * UNALIGNED_OK longest_match - * - */ -static inline unsigned longest_match(deflate_state *const s, IPos cur_match) { - const unsigned wmask = s->w_mask; - const Pos *prev = s->prev; - - uint16_t scan_start, scan_end; - unsigned chain_length; - IPos limit; - unsigned int len, best_len, nice_match; - unsigned char *scan, *strend; - - /* - * The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple - * of 16. It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* - * Do not waste too much time if we already have a good match - */ - best_len = s->prev_length; - chain_length = s->max_chain_length; - if (best_len >= s->good_match) - chain_length >>= 2; - - /* - * Do not look for matches beyond the end of the input. This is - * necessary to make deflate deterministic - */ - nice_match = (unsigned int)s->nice_match > s->lookahead ? s->lookahead : s->nice_match; - - /* - * Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0 - */ - limit = s->strstart > MAX_DIST(s) ? s->strstart - MAX_DIST(s) : 0; - - scan = s->window + s->strstart; - strend = s->window + s->strstart + MAX_MATCH - 1; - memcpy(&scan_start, scan, sizeof(scan_start)); - memcpy(&scan_end, scan + best_len - 1, sizeof(scan_end)); - - Assert((unsigned long)s->strstart <= s->window_size - MIN_LOOKAHEAD, "need lookahead"); - do { - unsigned char *match; - if (cur_match >= s->strstart) { - break; - } - match = s->window + cur_match; - - /* - * Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks - * below for insufficient lookahead only occur occasionally - * for performance reasons. Therefore uninitialized memory - * will be accessed and conditional jumps will be made that - * depend on those values. However the length of the match - * is limited to the lookahead, so the output of deflate is not - * affected by the uninitialized values. - */ - uint16_t val; - memcpy(&val, match + best_len - 1, sizeof(val)); - if (likely(val != scan_end)) - continue; - - memcpy(&val, match, sizeof(val)); - if (val != scan_start) - continue; - - /* It is not necessary to compare scan[2] and match[2] since - * they are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. Compare 2 - * bytes at a time at strstart+3, +5, ... up to strstart+257. - * We check for insufficient lookahead only every 4th - * comparison; the 128th check will be made at strstart+257. - * If MAX_MATCH-2 is not a multiple of 8, it is necessary to - * put more guard bytes at the end of the window, or to check - * more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++; - match++; - - do { - uint16_t mval, sval; - - memcpy(&mval, match, sizeof(mval)); - memcpy(&sval, scan, sizeof(sval)); - if (mval != sval) - break; - match += sizeof(mval); - scan += sizeof(sval); - - memcpy(&mval, match, sizeof(mval)); - memcpy(&sval, scan, sizeof(sval)); - if (mval != sval) - break; - match += sizeof(mval); - scan += sizeof(sval); - - memcpy(&mval, match, sizeof(mval)); - memcpy(&sval, scan, sizeof(sval)); - if (mval != sval) - break; - match += sizeof(mval); - scan += sizeof(sval); - - memcpy(&mval, match, sizeof(mval)); - memcpy(&sval, scan, sizeof(sval)); - if (mval != sval) - break; - match += sizeof(mval); - scan += sizeof(sval); - } while (scan < strend); - - /* - * Here, scan <= window + strstart + 257 - */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) - scan++; - - len = (MAX_MATCH -1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) - break; - memcpy(&scan_end, scan + best_len - 1, sizeof(scan_end)); - } else { - /* - * The probability of finding a match later if we here - * is pretty low, so for performance it's best to - * outright stop here for the lower compression levels - */ - if (s->level < TRIGGER_LEVEL) - break; - } - } while (--chain_length && (cur_match = prev[cur_match & wmask]) > limit); - - if ((unsigned)best_len <= s->lookahead) - return best_len; - return s->lookahead; -} -#endif - -#ifdef std3_longest_match -/* longest_match() with minor change to improve performance (in terms of - * execution time). - * - * The pristine longest_match() function is sketched below (strip the - * then-clause of the "#ifdef UNALIGNED_OK"-directive) - * - * ------------------------------------------------------------ - * unsigned int longest_match(...) { - * ... - * do { - * match = s->window + cur_match; //s0 - * if (*(ushf*)(match+best_len-1) != scan_end || //s1 - * *(ushf*)match != scan_start) continue; //s2 - * ... - * - * do { - * } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - * *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - * *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - * *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - * scan < strend); //s3 - * - * ... - * } while(cond); //s4 - * - * ------------------------------------------------------------- - * - * The change include: - * - * 1) The hottest statements of the function is: s0, s1 and s4. Pull them - * together to form a new loop. The benefit is two-fold: - * - * o. Ease the compiler to yield good code layout: the conditional-branch - * corresponding to s1 and its biased target s4 become very close (likely, - * fit in the same cache-line), hence improving instruction-fetching - * efficiency. - * - * o. Ease the compiler to promote "s->window" into register. "s->window" - * is loop-invariant; it is supposed to be promoted into register and keep - * the value throughout the entire loop. However, there are many such - * loop-invariant, and x86-family has small register file; "s->window" is - * likely to be chosen as register-allocation victim such that its value - * is reloaded from memory in every single iteration. By forming a new loop, - * "s->window" is loop-invariant of that newly created tight loop. It is - * lot easier for compiler to promote this quantity to register and keep - * its value throughout the entire small loop. - * - * 2) Transfrom s3 such that it examines sizeof(long)-byte-match at a time. - * This is done by: - * ------------------------------------------------ - * v1 = load from "scan" by sizeof(long) bytes - * v2 = load from "match" by sizeof(lnog) bytes - * v3 = v1 xor v2 - * match-bit = little-endian-machine(yes-for-x86) ? - * count-trailing-zero(v3) : - * count-leading-zero(v3); - * - * match-byte = match-bit/8 - * - * "scan" and "match" advance if necessary - * ------------------------------------------------- - */ - -static inline unsigned longest_match(deflate_state *const s, IPos cur_match) { - unsigned int strstart = s->strstart; - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - unsigned char *window = s->window; - register unsigned char *scan = window + strstart; /* current string */ - register unsigned char *match; /* matched string */ - register unsigned int len; /* length of current match */ - unsigned int best_len = s->prev_length; /* best match length so far */ - unsigned int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = strstart > (IPos)MAX_DIST(s) ? - strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Pos *prev = s->prev; - unsigned int wmask = s->w_mask; - - register unsigned char *strend = window + strstart + MAX_MATCH; - - uint16_t scan_start, scan_end; - - memcpy(&scan_start, scan, sizeof(scan_start)); - memcpy(&scan_end, scan+best_len-1, sizeof(scan_end)); - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((unsigned int)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((unsigned long)strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - if (cur_match >= strstart) { - break; - } - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ - int cont = 1; - do { - match = window + cur_match; - if (likely(memcmp(match+best_len-1, &scan_end, sizeof(scan_end)) != 0)) { - if ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0) { - continue; - } else { - cont = 0; - } - } - break; - } while (1); - - if (!cont) - break; - - if (memcmp(match, &scan_start, sizeof(scan_start)) != 0) - continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - scan += 2, match+=2; - Assert(*scan == *match, "match[2]?"); - do { - unsigned long sv, mv, xor; - - memcpy(&sv, scan, sizeof(sv)); - memcpy(&mv, match, sizeof(mv)); - - xor = sv ^ mv; - - if (xor) { - int match_byte = __builtin_ctzl(xor) / 8; - scan += match_byte; - break; - } else { - scan += sizeof(unsigned long); - match += sizeof(unsigned long); - } - } while (scan < strend); - - if (scan > strend) - scan = strend; - - Assert(scan <= window + (unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) - break; - memcpy(&scan_end, scan+best_len-1, sizeof(scan_end)); - } else { - /* - * The probability of finding a match later if we here - * is pretty low, so for performance it's best to - * outright stop here for the lower compression levels - */ - if (s->level < TRIGGER_LEVEL) - break; - } - } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); - - if ((unsigned int)best_len <= s->lookahead) - return (unsigned int)best_len; - return s->lookahead; -} -#endif diff --git a/libs/zlibng/match_tpl.h b/libs/zlibng/match_tpl.h new file mode 100644 index 000000000..b15ca17b9 --- /dev/null +++ b/libs/zlibng/match_tpl.h @@ -0,0 +1,180 @@ + +#include "zbuild.h" +#include "deflate.h" +#include "functable.h" + +#ifndef MATCH_TPL_H +#define MATCH_TPL_H + +#ifdef UNALIGNED_OK +# ifdef UNALIGNED64_OK +typedef uint64_t bestcmp_t; +# else +typedef uint32_t bestcmp_t; +# endif +#else +typedef uint8_t bestcmp_t; +#endif + +#define EARLY_EXIT_TRIGGER_LEVEL 5 + +#endif + +/* Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is garbage. + * + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >=1 + * OUT assertion: the match length is not greater than s->lookahead + */ +Z_INTERNAL uint32_t LONGEST_MATCH(deflate_state *const s, Pos cur_match) { + unsigned int strstart = s->strstart; + const unsigned wmask = s->w_mask; + unsigned char *window = s->window; + unsigned char *scan = window + strstart; + Z_REGISTER unsigned char *mbase_start = window; + Z_REGISTER unsigned char *mbase_end; + const Pos *prev = s->prev; + Pos limit; + int32_t early_exit; + uint32_t chain_length, nice_match, best_len, offset; + uint32_t lookahead = s->lookahead; + bestcmp_t scan_end; +#ifndef UNALIGNED_OK + bestcmp_t scan_end0; +#else + bestcmp_t scan_start; +#endif + +#define GOTO_NEXT_CHAIN \ + if (--chain_length && (cur_match = prev[cur_match & wmask]) > limit) \ + continue; \ + return best_len; + + /* The code is optimized for MAX_MATCH-2 multiple of 16. */ + Assert(MAX_MATCH == 258, "Code too clever"); + + best_len = s->prev_length ? s->prev_length : 1; + + /* Calculate read offset which should only extend an extra byte + * to find the next best match length. + */ + offset = best_len-1; +#ifdef UNALIGNED_OK + if (best_len >= sizeof(uint32_t)) { + offset -= 2; +#ifdef UNALIGNED64_OK + if (best_len >= sizeof(uint64_t)) + offset -= 4; +#endif + } +#endif + + scan_end = *(bestcmp_t *)(scan+offset); +#ifndef UNALIGNED_OK + scan_end0 = *(bestcmp_t *)(scan+offset+1); +#else + scan_start = *(bestcmp_t *)(scan); +#endif + mbase_end = (mbase_start+offset); + + /* Do not waste too much time if we already have a good match */ + chain_length = s->max_chain_length; + early_exit = s->level < EARLY_EXIT_TRIGGER_LEVEL; + if (best_len >= s->good_match) + chain_length >>= 2; + nice_match = (uint32_t)s->nice_match; + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0 + */ + limit = strstart > MAX_DIST(s) ? (Pos)(strstart - MAX_DIST(s)) : 0; + + Assert((unsigned long)strstart <= s->window_size - MIN_LOOKAHEAD, "need lookahead"); + for (;;) { + if (cur_match >= strstart) + break; + + /* Skip to next match if the match length cannot increase or if the match length is + * less than 2. Note that the checks below for insufficient lookahead only occur + * occasionally for performance reasons. + * Therefore uninitialized memory will be accessed and conditional jumps will be made + * that depend on those values. However the length of the match is limited to the + * lookahead, so the output of deflate is not affected by the uninitialized values. + */ +#ifdef UNALIGNED_OK + if (best_len < sizeof(uint32_t)) { + for (;;) { + if (*(uint16_t *)(mbase_end+cur_match) == (uint16_t)scan_end && + *(uint16_t *)(mbase_start+cur_match) == (uint16_t)scan_start) + break; + GOTO_NEXT_CHAIN; + } +# ifdef UNALIGNED64_OK + } else if (best_len >= sizeof(uint64_t)) { + for (;;) { + if (*(uint64_t *)(mbase_end+cur_match) == (uint64_t)scan_end && + *(uint64_t *)(mbase_start+cur_match) == (uint64_t)scan_start) + break; + GOTO_NEXT_CHAIN; + } +# endif + } else { + for (;;) { + if (*(uint32_t *)(mbase_end+cur_match) == (uint32_t)scan_end && + *(uint32_t *)(mbase_start+cur_match) == (uint32_t)scan_start) + break; + GOTO_NEXT_CHAIN; + } + } +#else + for (;;) { + if (mbase_end[cur_match] == scan_end && mbase_end[cur_match+1] == scan_end0 && + mbase_start[cur_match] == scan[0] && mbase_start[cur_match+1] == scan[1]) + break; + GOTO_NEXT_CHAIN; + } +#endif + uint32_t len = COMPARE256(scan+2, mbase_start+cur_match+2) + 2; + Assert(scan+len <= window+(unsigned)(s->window_size-1), "wild scan"); + + if (len > best_len) { + s->match_start = cur_match; + /* Do not look for matches beyond the end of the input. */ + if (len > lookahead) + return lookahead; + best_len = len; + if (best_len >= nice_match) + return best_len; + + offset = best_len-1; +#ifdef UNALIGNED_OK + if (best_len >= sizeof(uint32_t)) { + offset -= 2; +#ifdef UNALIGNED64_OK + if (best_len >= sizeof(uint64_t)) + offset -= 4; +#endif + } +#endif + scan_end = *(bestcmp_t *)(scan+offset); +#ifndef UNALIGNED_OK + scan_end0 = *(bestcmp_t *)(scan+offset+1); +#endif + mbase_end = (mbase_start+offset); + } else if (UNLIKELY(early_exit)) { + /* The probability of finding a match later if we here is pretty low, so for + * performance it's best to outright stop here for the lower compression levels + */ + break; + } + GOTO_NEXT_CHAIN; + } + + return best_len; +} + +#undef LONGEST_MATCH +#undef COMPARE256 +#undef COMPARE258 diff --git a/libs/zlibng/memcopy.h b/libs/zlibng/memcopy.h deleted file mode 100644 index 301aa5f73..000000000 --- a/libs/zlibng/memcopy.h +++ /dev/null @@ -1,674 +0,0 @@ -/* memcopy.h -- inline functions to copy small data chunks. - * For conditions of distribution and use, see copyright notice in zlib.h - */ -#ifndef MEMCOPY_H_ - #define MEMCOPY_H_ - - #include "gzendian.h" - -/* Load 64 bits from IN and place the bytes at offset BITS in the result. */ -static inline uint64_t load_64_bits(const unsigned char *in, unsigned bits) { - uint64_t chunk; - memcpy(&chunk, in, sizeof(chunk)); - - #if BYTE_ORDER == LITTLE_ENDIAN - return chunk << bits; - #else - return ZSWAP64(chunk) << bits; - #endif -} - - #if (defined(__GNUC__) || defined(__clang__)) && defined(__ARM_NEON__) - #include -typedef uint8x16_t inffast_chunk_t; - #define INFFAST_CHUNKSIZE sizeof(inffast_chunk_t) - #endif - - #if defined(X86_SSE2) - #include -typedef __m128i inffast_chunk_t; - #define INFFAST_CHUNKSIZE sizeof(inffast_chunk_t) - #endif - - #ifdef INFFAST_CHUNKSIZE -/* - Ask the compiler to perform a wide, unaligned load with an machine - instruction appropriate for the inffast_chunk_t type. - */ -static inline inffast_chunk_t loadchunk(unsigned char const* s) { - inffast_chunk_t c; - memcpy(&c, s, sizeof(c)); - return c; -} - -/* - Ask the compiler to perform a wide, unaligned store with an machine - instruction appropriate for the inffast_chunk_t type. - */ -static inline void storechunk(unsigned char* d, inffast_chunk_t c) { - memcpy(d, &c, sizeof(c)); -} - -/* - Behave like memcpy, but assume that it's OK to overwrite at least - INFFAST_CHUNKSIZE bytes of output even if the length is shorter than this, - that the length is non-zero, and that `from` lags `out` by at least - INFFAST_CHUNKSIZE bytes (or that they don't overlap at all or simply that - the distance is less than the length of the copy). - - Aside from better memory bus utilisation, this means that short copies - (INFFAST_CHUNKSIZE bytes or fewer) will fall straight through the loop - without iteration, which will hopefully make the branch prediction more - reliable. - */ -static inline unsigned char* chunkcopy(unsigned char *out, unsigned char const *from, unsigned len) { - --len; - storechunk(out, loadchunk(from)); - out += (len % INFFAST_CHUNKSIZE) + 1; - from += (len % INFFAST_CHUNKSIZE) + 1; - len /= INFFAST_CHUNKSIZE; - while (len > 0) { - storechunk(out, loadchunk(from)); - out += INFFAST_CHUNKSIZE; - from += INFFAST_CHUNKSIZE; - --len; - } - return out; -} - -/* - Behave like chunkcopy, but avoid writing beyond of legal output. - */ -static inline unsigned char* chunkcopysafe(unsigned char *out, unsigned char const *from, unsigned len, - unsigned char *safe) { - if ((safe - out) < (ptrdiff_t)INFFAST_CHUNKSIZE) { - if (len & 8) { - memcpy(out, from, 8); - out += 8; - from += 8; - } - if (len & 4) { - memcpy(out, from, 4); - out += 4; - from += 4; - } - if (len & 2) { - memcpy(out, from, 2); - out += 2; - from += 2; - } - if (len & 1) { - *out++ = *from++; - } - return out; - } - return chunkcopy(out, from, len); -} - -/* - Perform short copies until distance can be rewritten as being at least - INFFAST_CHUNKSIZE. - - This assumes that it's OK to overwrite at least the first - 2*INFFAST_CHUNKSIZE bytes of output even if the copy is shorter than this. - This assumption holds because inflate_fast() starts every iteration with at - least 258 bytes of output space available (258 being the maximum length - output from a single token; see inflate_fast()'s assumptions below). - */ -static inline unsigned char* chunkunroll(unsigned char *out, unsigned *dist, unsigned *len) { - unsigned char const *from = out - *dist; - while (*dist < *len && *dist < INFFAST_CHUNKSIZE) { - storechunk(out, loadchunk(from)); - out += *dist; - *len -= *dist; - *dist += *dist; - } - return out; -} - -static inline inffast_chunk_t chunkmemset_1(unsigned char *from) { - #if defined(X86_SSE2) - int8_t c; - memcpy(&c, from, sizeof(c)); - return _mm_set1_epi8(c); - #elif defined(__ARM_NEON__) || defined(__ARM_NEON) - return vld1q_dup_u8(from); - #endif -} - -static inline inffast_chunk_t chunkmemset_2(unsigned char *from) { - int16_t c; - memcpy(&c, from, sizeof(c)); - #if defined(X86_SSE2) - return _mm_set1_epi16(c); - #elif defined(__ARM_NEON__) || defined(__ARM_NEON) - return vreinterpretq_u8_s16(vdupq_n_s16(c)); - #endif -} - -static inline inffast_chunk_t chunkmemset_4(unsigned char *from) { - int32_t c; - memcpy(&c, from, sizeof(c)); - #if defined(X86_SSE2) - return _mm_set1_epi32(c); - #elif defined(__ARM_NEON__) || defined(__ARM_NEON) - return vreinterpretq_u8_s32(vdupq_n_s32(c)); - #endif -} - -static inline inffast_chunk_t chunkmemset_8(unsigned char *from) { - #if defined(X86_SSE2) - int64_t c; - memcpy(&c, from, sizeof(c)); - return _mm_set1_epi64x(c); - #elif defined(__ARM_NEON__) || defined(__ARM_NEON) - return vcombine_u8(vld1_u8(from), vld1_u8(from)); - #endif -} - - #if defined(__ARM_NEON__) || defined(__ARM_NEON) -static inline unsigned char *chunkmemset_3(unsigned char *out, unsigned char *from, unsigned dist, unsigned len) { - uint8x8x3_t chunks; - unsigned sz = sizeof(chunks); - if (len < sz) { - out = chunkunroll(out, &dist, &len); - return chunkcopy(out, out - dist, len); - } - - /* Load 3 bytes 'a,b,c' from FROM and duplicate across all lanes: - chunks[0] = {a,a,a,a,a,a,a,a} - chunks[1] = {b,b,b,b,b,b,b,b} - chunks[2] = {c,c,c,c,c,c,c,c}. */ - chunks = vld3_dup_u8(from); - - unsigned rem = len % sz; - len -= rem; - while (len) { - /* Store "a,b,c, ..., a,b,c". */ - vst3_u8(out, chunks); - out += sz; - len -= sz; - } - - if (!rem) - return out; - - /* Last, deal with the case when LEN is not a multiple of SZ. */ - out = chunkunroll(out, &dist, &rem); - return chunkcopy(out, out - dist, rem); -} - #endif - - #if defined(__aarch64__) -static inline unsigned char *chunkmemset_6(unsigned char *out, unsigned char *from, unsigned dist, unsigned len) { - uint16x8x3_t chunks; - unsigned sz = sizeof(chunks); - if (len < sz) { - out = chunkunroll(out, &dist, &len); - return chunkcopy(out, out - dist, len); - } - - /* Load 6 bytes 'ab,cd,ef' from FROM and duplicate across all lanes: - chunks[0] = {ab,ab,ab,ab,ab,ab,ab,ab} - chunks[1] = {cd,cd,cd,cd,cd,cd,cd,cd} - chunks[2] = {ef,ef,ef,ef,ef,ef,ef,ef}. */ - chunks = vld3q_dup_u16((unsigned short *)from); - - unsigned rem = len % sz; - len -= rem; - while (len) { - /* Store "ab,cd,ef, ..., ab,cd,ef". */ - vst3q_u16((unsigned short *)out, chunks); - out += sz; - len -= sz; - } - - if (rem) - return out; - - /* Last, deal with the case when LEN is not a multiple of SZ. */ - out = chunkunroll(out, &dist, &rem); - return chunkcopy(out, out - dist, rem); -} - #endif - -/* Copy DIST bytes from OUT - DIST into OUT + DIST * k, for 0 <= k < LEN/DIST. Return OUT + LEN. */ -static inline unsigned char *chunkmemset(unsigned char *out, unsigned dist, unsigned len) { - Assert(len >= sizeof(uint64_t), "chunkmemset should be called on larger chunks"); - Assert(dist > 0, "cannot have a distance 0"); - - unsigned char *from = out - dist; - inffast_chunk_t chunk; - unsigned sz = sizeof(chunk); - if (len < sz) { - do { - *out++ = *from++; - --len; - } while (len != 0); - return out; - } - - switch (dist) { - case 1: { - chunk = chunkmemset_1(from); - break; - } - case 2: { - chunk = chunkmemset_2(from); - break; - } - #if defined(__ARM_NEON__) || defined(__ARM_NEON) - case 3: - return chunkmemset_3(out, from, dist, len); - #endif - case 4: { - chunk = chunkmemset_4(from); - break; - } - #if defined(__aarch64__) - case 6: - return chunkmemset_6(out, from, dist, len); - #endif - case 8: { - chunk = chunkmemset_8(from); - break; - } - case 16: - memcpy(&chunk, from, sz); - break; - - default: - out = chunkunroll(out, &dist, &len); - return chunkcopy(out, out - dist, len); - } - - unsigned rem = len % sz; - len -= rem; - while (len) { - memcpy(out, &chunk, sz); - out += sz; - len -= sz; - } - - /* Last, deal with the case when LEN is not a multiple of SZ. */ - if (rem) - memcpy(out, &chunk, rem); - out += rem; - return out; -} - -static inline unsigned char* chunkmemsetsafe(unsigned char *out, unsigned dist, unsigned len, unsigned left) { - if (left < (unsigned)(3 * INFFAST_CHUNKSIZE)) { - while (len > 0) { - *out = *(out - dist); - out++; - --len; - } - return out; - } - - return chunkmemset(out, dist, len); -} - - #else /* INFFAST_CHUNKSIZE */ - -static inline unsigned char *copy_1_bytes(unsigned char *out, unsigned char *from) { - *out++ = *from; - return out; -} - -static inline unsigned char *copy_2_bytes(unsigned char *out, unsigned char *from) { - uint16_t chunk; - unsigned sz = sizeof(chunk); - memcpy(&chunk, from, sz); - memcpy(out, &chunk, sz); - return out + sz; -} - -static inline unsigned char *copy_3_bytes(unsigned char *out, unsigned char *from) { - out = copy_1_bytes(out, from); - return copy_2_bytes(out, from + 1); -} - -static inline unsigned char *copy_4_bytes(unsigned char *out, unsigned char *from) { - uint32_t chunk; - unsigned sz = sizeof(chunk); - memcpy(&chunk, from, sz); - memcpy(out, &chunk, sz); - return out + sz; -} - -static inline unsigned char *copy_5_bytes(unsigned char *out, unsigned char *from) { - out = copy_1_bytes(out, from); - return copy_4_bytes(out, from + 1); -} - -static inline unsigned char *copy_6_bytes(unsigned char *out, unsigned char *from) { - out = copy_2_bytes(out, from); - return copy_4_bytes(out, from + 2); -} - -static inline unsigned char *copy_7_bytes(unsigned char *out, unsigned char *from) { - out = copy_3_bytes(out, from); - return copy_4_bytes(out, from + 3); -} - -static inline unsigned char *copy_8_bytes(unsigned char *out, unsigned char *from) { - uint64_t chunk; - unsigned sz = sizeof(chunk); - memcpy(&chunk, from, sz); - memcpy(out, &chunk, sz); - return out + sz; -} - -/* Copy LEN bytes (7 or fewer) from FROM into OUT. Return OUT + LEN. */ -static inline unsigned char *copy_bytes(unsigned char *out, unsigned char *from, unsigned len) { - Assert(len < 8, "copy_bytes should be called with less than 8 bytes"); - - #ifndef UNALIGNED_OK - while (len--) { - *out++ = *from++; - } - return out; - #else - switch (len) { - case 7: - return copy_7_bytes(out, from); - case 6: - return copy_6_bytes(out, from); - case 5: - return copy_5_bytes(out, from); - case 4: - return copy_4_bytes(out, from); - case 3: - return copy_3_bytes(out, from); - case 2: - return copy_2_bytes(out, from); - case 1: - return copy_1_bytes(out, from); - case 0: - return out; - default: - Assert(0, "should not happen"); - } - - return out; - #endif /* UNALIGNED_OK */ -} - -/* Copy LEN bytes (7 or fewer) from FROM into OUT. Return OUT + LEN. */ -static inline unsigned char *set_bytes(unsigned char *out, unsigned char *from, unsigned dist, unsigned len) { - Assert(len < 8, "set_bytes should be called with less than 8 bytes"); - - #ifndef UNALIGNED_OK - (void)dist; - while (len--) { - *out++ = *from++; - } - return out; - #else - if (dist >= len) - return copy_bytes(out, from, len); - - switch (dist) { - case 6: - Assert(len == 7, "len should be exactly 7"); - out = copy_6_bytes(out, from); - return copy_1_bytes(out, from); - - case 5: - Assert(len == 6 || len == 7, "len should be either 6 or 7"); - out = copy_5_bytes(out, from); - return copy_bytes(out, from, len - 5); - - case 4: - Assert(len == 5 || len == 6 || len == 7, "len should be either 5, 6, or 7"); - out = copy_4_bytes(out, from); - return copy_bytes(out, from, len - 4); - - case 3: - Assert(4 <= len && len <= 7, "len should be between 4 and 7"); - out = copy_3_bytes(out, from); - switch (len) { - case 7: - return copy_4_bytes(out, from); - case 6: - return copy_3_bytes(out, from); - case 5: - return copy_2_bytes(out, from); - case 4: - return copy_1_bytes(out, from); - default: - Assert(0, "should not happen"); - break; - } - - case 2: - Assert(3 <= len && len <= 7, "len should be between 3 and 7"); - out = copy_2_bytes(out, from); - switch (len) { - case 7: - out = copy_4_bytes(out, from); - out = copy_1_bytes(out, from); - return out; - case 6: - out = copy_4_bytes(out, from); - return out; - case 5: - out = copy_2_bytes(out, from); - out = copy_1_bytes(out, from); - return out; - case 4: - out = copy_2_bytes(out, from); - return out; - case 3: - out = copy_1_bytes(out, from); - return out; - default: - Assert(0, "should not happen"); - break; - } - - case 1: - Assert(2 <= len && len <= 7, "len should be between 2 and 7"); - unsigned char c = *from; - switch (len) { - case 7: - memset(out, c, 7); - return out + 7; - case 6: - memset(out, c, 6); - return out + 6; - case 5: - memset(out, c, 5); - return out + 5; - case 4: - memset(out, c, 4); - return out + 4; - case 3: - memset(out, c, 3); - return out + 3; - case 2: - memset(out, c, 2); - return out + 2; - default: - Assert(0, "should not happen"); - break; - } - } - return out; - #endif /* UNALIGNED_OK */ -} - -/* Byte by byte semantics: copy LEN bytes from OUT + DIST and write them to OUT. Return OUT + LEN. */ -static inline unsigned char *chunk_memcpy(unsigned char *out, unsigned char *from, unsigned len) { - unsigned sz = sizeof(uint64_t); - Assert(len >= sz, "chunk_memcpy should be called on larger chunks"); - - /* Copy a few bytes to make sure the loop below has a multiple of SZ bytes to be copied. */ - copy_8_bytes(out, from); - - unsigned rem = len % sz; - len /= sz; - out += rem; - from += rem; - - unsigned by8 = len % sz; - len -= by8; - switch (by8) { - case 7: - out = copy_8_bytes(out, from); - from += sz; - case 6: - out = copy_8_bytes(out, from); - from += sz; - case 5: - out = copy_8_bytes(out, from); - from += sz; - case 4: - out = copy_8_bytes(out, from); - from += sz; - case 3: - out = copy_8_bytes(out, from); - from += sz; - case 2: - out = copy_8_bytes(out, from); - from += sz; - case 1: - out = copy_8_bytes(out, from); - from += sz; - } - - while (len) { - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - out = copy_8_bytes(out, from); - from += sz; - - len -= 8; - } - - return out; -} - -/* Memset LEN bytes in OUT with the value at OUT - 1. Return OUT + LEN. */ -static inline unsigned char *byte_memset(unsigned char *out, unsigned len) { - unsigned sz = sizeof(uint64_t); - Assert(len >= sz, "byte_memset should be called on larger chunks"); - - unsigned char *from = out - 1; - unsigned char c = *from; - - /* First, deal with the case when LEN is not a multiple of SZ. */ - memset(out, c, sz); - unsigned rem = len % sz; - len /= sz; - out += rem; - - unsigned by8 = len % 8; - len -= by8; - switch (by8) { - case 7: - memset(out, c, sz); - out += sz; - case 6: - memset(out, c, sz); - out += sz; - case 5: - memset(out, c, sz); - out += sz; - case 4: - memset(out, c, sz); - out += sz; - case 3: - memset(out, c, sz); - out += sz; - case 2: - memset(out, c, sz); - out += sz; - case 1: - memset(out, c, sz); - out += sz; - } - - while (len) { - /* When sz is a constant, the compiler replaces __builtin_memset with an - inline version that does not incur a function call overhead. */ - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - memset(out, c, sz); - out += sz; - len -= 8; - } - - return out; -} - -/* Copy DIST bytes from OUT - DIST into OUT + DIST * k, for 0 <= k < LEN/DIST. Return OUT + LEN. */ -static inline unsigned char *chunk_memset(unsigned char *out, unsigned char *from, unsigned dist, unsigned len) { - if (dist >= len) - return chunk_memcpy(out, from, len); - - Assert(len >= sizeof(uint64_t), "chunk_memset should be called on larger chunks"); - - /* Double up the size of the memset pattern until reaching the largest pattern of size less than SZ. */ - unsigned sz = sizeof(uint64_t); - while (dist < len && dist < sz) { - copy_8_bytes(out, from); - - out += dist; - len -= dist; - dist += dist; - - /* Make sure the next memcpy has at least SZ bytes to be copied. */ - if (len < sz) - /* Finish up byte by byte when there are not enough bytes left. */ - return set_bytes(out, from, dist, len); - } - - return chunk_memcpy(out, from, len); -} - -/* Byte by byte semantics: copy LEN bytes from FROM and write them to OUT. Return OUT + LEN. */ -static inline unsigned char *chunk_copy(unsigned char *out, unsigned char *from, int dist, unsigned len) { - if (len < sizeof(uint64_t)) { - if (dist > 0) - return set_bytes(out, from, dist, len); - - return copy_bytes(out, from, len); - } - - if (dist == 1) - return byte_memset(out, len); - - if (dist > 0) - return chunk_memset(out, from, dist, len); - - return chunk_memcpy(out, from, len); -} - #endif /* INFFAST_CHUNKSIZE */ -#endif /* MEMCOPY_H_ */ diff --git a/libs/zlibng/test/.gitignore b/libs/zlibng/test/.gitignore index 2c3af0a08..96a3cad07 100644 --- a/libs/zlibng/test/.gitignore +++ b/libs/zlibng/test/.gitignore @@ -1,2 +1,5 @@ # ignore Makefiles; they're all automatically generated Makefile +/switchlevels +/switchlevels.dSYM/ +/switchlevels.exe diff --git a/libs/zlibng/test/CVE-2003-0107.c b/libs/zlibng/test/CVE-2003-0107.c index 306421e9f..51c79b2cd 100644 --- a/libs/zlibng/test/CVE-2003-0107.c +++ b/libs/zlibng/test/CVE-2003-0107.c @@ -5,16 +5,18 @@ #include int main(void) { -gzFile f; -int ret; + gzFile f; + int ret; -if(!(f = gzopen("/dev/null", "w"))) { -perror("/dev/null"); -exit(1); -} -ret = gzprintf(f, "%10240s", ""); -printf("gzprintf -> %d\n", ret); -ret = gzclose(f); -printf("gzclose -> %d [%d]\n", ret, errno); -exit(0); + if(!(f = gzopen("/dev/null", "w"))) { + perror("/dev/null"); + exit(1); + } + + ret = gzprintf(f, "%10240s", ""); + printf("gzprintf -> %d\n", ret); + ret = gzclose(f); + printf("gzclose -> %d [%d]\n", ret, errno); + + exit(0); } diff --git a/libs/zlibng/test/GH-361/test.txt b/libs/zlibng/test/GH-361/test.txt new file mode 100644 index 000000000..2b102819f --- /dev/null +++ b/libs/zlibng/test/GH-361/test.txt @@ -0,0 +1,4 @@ +.....-.u..|u....-...!..A.#?)9.._B..F..| +00000650 fa 13 88 89 2c 1f 81 0f e4 e9 ce 39 a0 87 2e 2e |....,......9....| +00000660 a5 0c 08 9c ec fc 88 6d 16 02 0a a0 3d fc 36 29 |.......m....=.6)| +00000670 8d f5 c3 ba 1d 07 f4 78 e1 a0 41 f9 89 15 a5 69 |.......x..A.... \ No newline at end of file diff --git a/libs/zlibng/test/GH-364/test.bin b/libs/zlibng/test/GH-364/test.bin new file mode 100644 index 000000000..1b1cb4d44 Binary files /dev/null and b/libs/zlibng/test/GH-364/test.bin differ diff --git a/libs/zlibng/test/GH-382/defneg3.dat b/libs/zlibng/test/GH-382/defneg3.dat new file mode 100644 index 000000000..5fa6a0804 --- /dev/null +++ b/libs/zlibng/test/GH-382/defneg3.dat @@ -0,0 +1 @@ +oÌ™Ì?ÌOÌÃÌḩÌÕÌ>ÌÌÌàÌ̹̘ÌÔÌEÌsÌ—ÌÌ4̢̙̑Ì6ÌÌØÌæÌ\ÌÌÌ5̪̲̕ÌmÌÌ–Ìç̺̜ÌÙ̧ÌÌíÌíÌ–ÌÌëÌmÌìÌÎ̵ÌGÌïÌOÌÛÌ ÌÃÌòÌÎÌôÌ„Ì;Ì”ÌýÌ’ÌÓÌÀÌ×Ì,ÌÑÌ¢ÌáÌAÌ9Ì»ÌæÌ‚ÌÂÌsÌý̼ÌÝÌÌ­ÌeÌòÌÝÌUÌuÌí̱ÌËÌwÌùÌ•ÌDÌß̋̽Ìt̞̣̹ÌöÌôÌOÌîÌíÌ…ÌpÌGÌḭ̀ÌÀÌ(ÌÌÌ̤Ì{Ì“ÌßÌïÌÕÌÌøÌÌMÌ#ÌÌí̵ÌdÌ·ÌIÌßÌhÌ_ÌpÌJÌÇÌ¢ÌÎÌÌoÌÌêÌÁÌ;Ì<̘ÌZÌÈÌÑÌoÌW̄̿Ì}ÌáÌÌÌ:Ìá̧̻̕ÌeÌFÌtÌ(ÌEÌoÌàÌpÌÌ¢Ì(Ì;ÌþÌëÌóÌ!̹̹ÌÉÌÌœÌîÌÖÌ4ÌÈÌ3ÌëÌ‹ÌBÌŽÌÆÌuÌPÌ6Ì“ÌþÌ&̦̳̕ÌÁÌðÌ»ÌÌÌTÌÀ̧ÌbÌÌÒÌÕÌëÌ{ÌÆÌ¡ÌÊÌNÌ9ÌÇÌÌBÌÑ \ No newline at end of file diff --git a/libs/zlibng/test/GH-751/test.txt b/libs/zlibng/test/GH-751/test.txt new file mode 100644 index 000000000..ef2143ece --- /dev/null +++ b/libs/zlibng/test/GH-751/test.txt @@ -0,0 +1 @@ +abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc diff --git a/libs/zlibng/test/INDEX b/libs/zlibng/test/INDEX deleted file mode 100644 index f167df87e..000000000 --- a/libs/zlibng/test/INDEX +++ /dev/null @@ -1,10 +0,0 @@ -Makefile.in: template for Unix Makefile - -CVE-2003-0107.c: -CVE-2002-0059 : -CVE-2004-0797 : -CVE-2005-1849 : -CVE-2005-2096 : test cases for the relevant CVEs - -testCVEinputs.sh: script to run tests for CVEs where input data is supplied - diff --git a/libs/zlibng/test/Makefile.in b/libs/zlibng/test/Makefile.in index 4b858f744..97b8be753 100644 --- a/libs/zlibng/test/Makefile.in +++ b/libs/zlibng/test/Makefile.in @@ -7,14 +7,15 @@ CFLAGS= EXE= SRCDIR= SRCTOP= -TEST_LDFLAGS=-L.. ../libz.a +LIBNAME= +TEST_LDFLAGS=-L.. ../$(LIBNAME).a WITH_FUZZERS= COMPATTESTS = QEMU_RUN= QEMU_VER:=$(shell command -v $(QEMU_RUN) --version 2> /dev/null) -all: oldtests cvetests $(COMPATTESTS) fuzzer +all: oldtests cvetests $(COMPATTESTS) fuzzer ghtests oldtests: #set by ../configure check_cross_dep: @@ -45,35 +46,28 @@ fuzzer: endif teststatic: check_cross_dep - @TMPST=tmpst_$$; \ - if echo hello world | ${QEMU_RUN} ../minigzip$(EXE) | ${QEMU_RUN} ../minigzip$(EXE) -d && ${QEMU_RUN} ../example$(EXE) $$TMPST ; then \ + @TMPST=tmpst_$$$$; \ + HELLOST=tmphellost_$$$$; \ + if echo hello world | ${QEMU_RUN} ../minigzip$(EXE) > $$HELLOST && ${QEMU_RUN} ../minigzip$(EXE) -d < $$HELLOST && ${QEMU_RUN} ../example$(EXE) $$TMPST && ${QEMU_RUN} ../adler32_test$(EXE); then \ echo ' *** zlib test OK ***'; \ else \ echo ' *** zlib test FAILED ***'; exit 1; \ - fi - @rm -f tmpst_$$ + fi; \ + rm -f $$TMPST $$HELLOST testshared: check_cross_dep @LD_LIBRARY_PATH=`pwd`/..:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ LD_LIBRARYN32_PATH=`pwd`/..:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ DYLD_LIBRARY_PATH=`pwd`/..:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ SHLIB_PATH=`pwd`/..:$(SHLIB_PATH) ; export SHLIB_PATH; \ - TMPSH=tmpsh_$$; \ - if echo hello world | ${QEMU_RUN} ../minigzipsh$(EXE) | ${QEMU_RUN} ../minigzipsh$(EXE) -d && ${QEMU_RUN} ../examplesh$(EXE) $$TMPSH; then \ + TMPSH=tmpsh_$$$$; \ + HELLOSH=tmphellosh_$$$$; \ + if echo hello world | ${QEMU_RUN} ../minigzipsh$(EXE) > $$HELLOSH && ${QEMU_RUN} ../minigzipsh$(EXE) -d < $$HELLOSH && ${QEMU_RUN} ../examplesh$(EXE) $$TMPSH && ${QEMU_RUN} ../adler32_testsh$(EXE); then \ echo ' *** zlib shared test OK ***'; \ else \ echo ' *** zlib shared test FAILED ***'; exit 1; \ - fi - @rm -f tmpsh_$$ - -test64: check_cross_dep - @TMP64=tmp64_$$; \ - if echo hello world | ${QEMU_RUN} ../minigzip64$(EXE) | ${QEMU_RUN} ../minigzip64$(EXE) -d && ${QEMU_RUN} ../example64$(EXE) $$TMP64; then \ - echo ' *** zlib 64-bit test OK ***'; \ - else \ - echo ' *** zlib 64-bit test FAILED ***'; exit 1; \ - fi - @rm -f tmp64_$$ + fi; \ + rm -f $$TMPSH $$HELLOSH cvetests: testCVEinputs @@ -96,10 +90,27 @@ CVE-2003-0107.o: $(SRCDIR)/CVE-2003-0107.c CVE-2003-0107$(EXE): CVE-2003-0107.o $(CC) $(CFLAGS) -o $@ CVE-2003-0107.o $(TEST_LDFLAGS) +.PHONY: ghtests +ghtests: testGH-361 testGH-364 testGH-751 + +.PHONY: testGH-361 +testGH-361: + $(QEMU_RUN) ../minigzip$(EXE) -4 <$(SRCDIR)/GH-361/test.txt >/dev/null + +switchlevels$(EXE): $(SRCDIR)/switchlevels.c + $(CC) $(CFLAGS) -I.. -I$(SRCTOP) -o $@ $< $(TEST_LDFLAGS) + +.PHONY: testGH-364 +testGH-364: switchlevels$(EXE) + $(QEMU_RUN) ./switchlevels$(EXE) 1 5 9 3 <$(SRCDIR)/GH-364/test.bin >/dev/null + +.PHONY: testGH-751 +testGH-751: + $(QEMU_RUN) ../minigzip$(EXE) <$(SRCDIR)/GH-751/test.txt | $(QEMU_RUN) ../minigzip$(EXE) -d >/dev/null clean: rm -f *.o *.gcda *.gcno *.gcov - rm -f CVE-2003-0107$(EXE) + rm -f CVE-2003-0107$(EXE) switchlevels$(EXE) distclean: rm -f Makefile diff --git a/libs/zlibng/test/README.md b/libs/zlibng/test/README.md new file mode 100644 index 000000000..247d5bac7 --- /dev/null +++ b/libs/zlibng/test/README.md @@ -0,0 +1,36 @@ +Contents +-------- + +|Name|Description| +|-|-| +|[CVE-2003-0107.c](https://nvd.nist.gov/vuln/detail/CVE-2003-0107)|Buffer overflow in the gzprintf function, requires ZLIB_COMPAT| +|[CVE-2002-0059](https://nvd.nist.gov/vuln/detail/CVE-2002-0059)|inflateEnd to release memory more than once| +|[CVE-2004-0797](https://nvd.nist.gov/vuln/detail/CVE-2004-0797)|Error handling in inflate and inflateBack causes crash| +|[CVE-2005-1849](https://nvd.nist.gov/vuln/detail/CVE-2005-1849)|inftrees.h bug causes crash| +|[CVE-2005-2096](https://nvd.nist.gov/vuln/detail/CVE-2005-2096)|Buffer overflow when incomplete code description +|[GH-361](https://github.com/zlib-ng/zlib-ng/issues/361)|Test case for overlapping matches| +|[GH-364](https://github.com/zlib-ng/zlib-ng/issues/364)|Test case for switching compression levels| +|[GH-382](https://github.com/zlib-ng/zlib-ng/issues/382)|Test case for deflateEnd returning -3 in deflate quick| + +Copying +------- + +Some of the files in _test_ are licensed differently: + + - test/data/fireworks.jpeg is Copyright 2013 Steinar H. Gunderson, and + is licensed under the Creative Commons Attribution 3.0 license + (CC-BY-3.0). See https://creativecommons.org/licenses/by/3.0/ + for more information. + + - test/data/paper-100k.pdf is an excerpt (bytes 92160 to 194560) from the paper + “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA + Replication Timing in _Drosophila_†by Federico Comoglio and Renato Paro, + which is licensed under the CC-BY license. See + http://www.ploscompbiol.org/static/license for more information. + + - test/data/lcet10.txt is from Project Gutenberg. It does not have expired + copyright, but is still in the public domain according to the license information. + (http://www.gutenberg.org/ebooks/53). + + - test/GH-382/defneg3.dat was the smallest file generated by Nathan Moinvaziri + that reproduced GH-382. It is licensed under the terms of the zlib license. diff --git a/libs/zlibng/test/abi/ignore b/libs/zlibng/test/abi/ignore new file mode 100644 index 000000000..dba3639cb --- /dev/null +++ b/libs/zlibng/test/abi/ignore @@ -0,0 +1,12 @@ +# See https://sourceware.org/libabigail/manual/libabigail-concepts.html#suppression-specifications + +[suppress_type] + name = internal_state + +[suppress_type] + name_regexp = z_stream.* + +# Size varies with version number +[suppress_variable] + name = zlibng_string + diff --git a/libs/zlibng/test/abi/zlib-v1.2.11-arm-linux-gnueabihf.abi b/libs/zlibng/test/abi/zlib-v1.2.11-arm-linux-gnueabihf.abi new file mode 100644 index 000000000..152a742cf --- /dev/null +++ b/libs/zlibng/test/abi/zlib-v1.2.11-arm-linux-gnueabihf.abi @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/zlibng/test/abi/zlib-v1.2.11-x86_64-linux-gnu.abi b/libs/zlibng/test/abi/zlib-v1.2.11-x86_64-linux-gnu.abi new file mode 100644 index 000000000..00a520c63 --- /dev/null +++ b/libs/zlibng/test/abi/zlib-v1.2.11-x86_64-linux-gnu.abi @@ -0,0 +1,1037 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/zlibng/test/abicheck.md b/libs/zlibng/test/abicheck.md new file mode 100644 index 000000000..6e9e58aad --- /dev/null +++ b/libs/zlibng/test/abicheck.md @@ -0,0 +1,59 @@ +ABI Compatibility test +---------------------- + +abicheck.sh uses libabigail to check ABI stability. +It will abort if the current source +tree has a change that breaks binary compatibility. + +This protects against the common scenario where: +- an app is compiled against the current zlib-ng +- the system package manager updates the zlib-ng shared library +- the app now crashes because some symbol is + missing or some public structure or parameter + has changed type or size + +If run with --zlib-compat, it verifies that the +current source tree generates a library that +is ABI-compatible with the reference release +of classic zlib. This ensures that building +zlib-ng with --zlib-compat does what it says on the tin. + +abicheck.sh is not perfect, but it can catch +many common compatibility issues. + +Cached files test/abi/*.abi +--------------------------- + +Comparing to the old version of zlib (or zlib-ng) +means someone has to check out and build +the previous source tree and extract its .abi +using abidw. This can be slow. + +If you don't mind the slowness, run abicheck.sh --refresh_if, +and it will download and build the reference version +and extract the .abi on the spot if needed. +(FIXME: should this be the default?) + +On the next run, the reference .abi file will already be +present, and that step will be skipped. +It's stored in the tests/abi directory, +in a file with the architecture and git hash in the name. + +If you're running continuous integration +which clear out the source tree on each run, +and you don't want your build machines +constantly downloading and building the old +version, you can check the .abi file into git. + +To make this easier, a helper script could be written to automatically build +all the configurations tested by .github/worflows/abicheck.yml +Then they could be checked into git en masse by a maintainer +when a new platform is added or a new major version (which +intentionally breaks backwards compatibility) is being prepared. + +Further reading +--------------- + +- https://sourceware.org/libabigail/manual/ +- https://developers.redhat.com/blog/2014/10/23/comparing-abis-for-compatibility-with-libabigail-part-1/ +- https://developers.redhat.com/blog/2020/04/02/how-to-write-an-abi-compliance-checker-using-libabigail/ diff --git a/libs/zlibng/test/abicheck.sh b/libs/zlibng/test/abicheck.sh new file mode 100644 index 000000000..89199a59a --- /dev/null +++ b/libs/zlibng/test/abicheck.sh @@ -0,0 +1,164 @@ +#!/bin/sh +set -ex +TESTDIR="$(cd $(dirname "$0"); pwd)" + +usage() { + cat <<_EOF_ +Usage: $0 [--zlib-compat][--refresh][--refresh-if] + +Build shared library with -ggdb, then compare its ABI to the stable +ABI, and abort if differences found. + +Options: +--zlib-compat - check the ABI of the zlib-compatible flavor of zlib-ng. +--refresh - build the reference library and extract its ABI rather than using a stored ABI file. +--refresh-if - refresh only if ABI file not present. + +Obeys CHOST, CONFIGURE_ARGS, CFLAGS, and LDFLAGS. + +Requires libabigail (on Ubuntu, install package abigail-tools). +_EOF_ +} + +# Print the multiarch tuple for the current (non-cross) machine, +# or the empty string if unavailable. +detect_chost() { + dpkg-architecture -qDEB_HOST_MULTIARCH || + $CC -print-multiarch || + $CC -print-search-dirs | sed 's/:/\n/g' | grep -E '^/lib/[^/]+$' | sed 's%.*/%%' || + true +} + +if ! test -f "configure" +then + echo "Please run from top of source tree" + exit 1 +fi + +suffix="-ng" +CONFIGURE_ARGS_NG="$CONFIGURE_ARGS" +refresh=false +refresh_if=false +for arg +do + case "$arg" in + --zlib-compat) + suffix="" + CONFIGURE_ARGS_NG="$CONFIGURE_ARGS_NG --zlib-compat" + ;; + --refresh) + refresh=true + ;; + --refresh_if) + refresh_if=true + ;; + --help) + usage + exit 0 + ;; + *) + echo "Unknown arg '$arg'" + usage + exit 1 + ;; + esac +done + +# Choose reference repo and commit +if test "$suffix" = "" +then + # Reference is zlib 1.2.11 + ABI_GIT_REPO=https://github.com/madler/zlib.git + ABI_GIT_COMMIT=v1.2.11 +else + # Reference should be the tag for zlib-ng 2.0 + # but until that bright, shining day, use some + # random recent SHA. Annoyingly, can't shorten it. + ABI_GIT_REPO=https://github.com/zlib-ng/zlib-ng.git + ABI_GIT_COMMIT=56ce27343bf295ae9457f8e3d38ec96d2f949a1c +fi +# FIXME: even when using a tag, check the hash. + +# Test compat build for ABI compatibility with zlib +if test "$CHOST" = "" +then + # Note: don't export CHOST here, as we don't want configure seeing it + # when it's just the name for the build machine. + # Leave it as a plain shell variable, not an environment variable. + CHOST=$(detect_chost) + # Support -m32 for non-cross builds. + case "$CFLAGS" in + *-m32*) M32="-m32";; + *) M32="";; + esac +fi + +# Canonicalize CHOST to work around bug in original zlib's configure +export CHOST=$(sh $TESTDIR/../tools/config.sub $CHOST) + +if test "$CHOST" = "" +then + echo "abicheck: SKIP, as we don't know CHOST" + exit 0 +fi + +ABIFILE="test/abi/zlib$suffix-$ABI_GIT_COMMIT-$CHOST$M32.abi" +if ! $refresh && $refresh_if && ! test -f "$ABIFILE" +then + refresh=true +fi +abidw --version + +if $refresh +then + # Check out reference source + rm -rf btmp1 + mkdir -p btmp1/src.d + cd btmp1/src.d + git init + git remote add origin $ABI_GIT_REPO + git fetch origin $ABI_GIT_COMMIT + git reset --hard FETCH_HEAD + cd .. + # Build unstripped, uninstalled, very debug shared library + CFLAGS="$CFLAGS -ggdb" sh src.d/configure $CONFIGURE_ARGS + make -j2 + cd .. + # Find shared library, extract its abi + dylib1=$(find btmp1 -type f -name '*.dylib*' -print -o -type f -name '*.so.*' -print) + abidw $dylib1 > "$ABIFILE" + # Maintainers may wish to check $ABIFILE into git when a new + # target is added, or when a major release happens that is + # intended to change the ABI. Alternately, this script could + # just always rebuild the reference source, and dispense with + # caching abi files in git (but that would slow builds down). +fi + +if test -f "$ABIFILE" +then + ABIFILE="$ABIFILE" +else + echo "abicheck: SKIP: $ABIFILE not found; rerun with --refresh or --refresh_if" + exit 0 +fi + +# Build unstripped, uninstalled, very debug shared library +rm -rf btmp2 +mkdir btmp2 +cd btmp2 +CFLAGS="$CFLAGS -ggdb" ../configure $CONFIGURE_ARGS_NG +make -j2 +cd .. +# Find shared library, extract its abi +dylib2=$(find btmp2 -type f -name '*.dylib*' -print -o -type f -name '*.so.*' -print) +abidw $dylib2 > btmp2/zlib${suffix}-built.abi + +# Compare it to the reference +# FIXME: use --no-added-syms for now, but we probably want to be more strict. +if abidiff --no-added-syms --suppressions test/abi/ignore "$ABIFILE" btmp2/zlib${suffix}-built.abi +then + echo "abicheck: PASS" +else + echo "abicheck: FAIL" + exit 1 +fi diff --git a/libs/zlibng/test/adler32_test.c b/libs/zlibng/test/adler32_test.c new file mode 100644 index 000000000..f681877d3 --- /dev/null +++ b/libs/zlibng/test/adler32_test.c @@ -0,0 +1,365 @@ +/* adler32_test.c -- unit test for adler32 in the zlib compression library + * Copyright (C) 2020 IBM Corporation + * Author: Rogerio Alves + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include +#include +#include + +#include "zbuild.h" +#ifdef ZLIB_COMPAT +# include "zlib.h" +#else +# include "zlib-ng.h" +#endif + +typedef struct { + uint32_t line; + uint32_t adler; + const uint8_t *buf; + uint32_t len; + uint32_t expect; +} adler32_test; + +void test_adler32(uint32_t adler, const uint8_t *buf, uint32_t len, uint32_t chk, uint32_t line) { + uint32_t res = PREFIX(adler32)(adler, buf, len); + if (res != chk) { + fprintf(stderr, "FAIL [%d]: adler32 returned 0x%08X expected 0x%08X\n", + line, res, chk); + exit(1); + } +} + +static const uint8_t long_string[5552] = { + 'q','j','d','w','q','4','8','m','B','u','k','J','V','U','z','V','V','f','M','j','i','q','S','W','L','5','G','n','F','S','P','Q', + 'Q','D','i','6','m','E','9','Z','a','A','P','h','9','d','r','b','5','t','X','U','U','L','w','q','e','k','E','H','6','W','7','k', + 'A','x','N','Q','R','k','d','V','5','y','n','U','N','W','Q','Y','i','W','5','9','R','p','D','C','x','p','u','h','C','a','m','r', + 'z','n','z','A','d','J','6','u','N','e','r','x','7','Q','3','v','V','h','H','S','H','S','f','K','f','e','E','T','9','J','f','K', + 'w','t','x','J','2','y','7','B','x','X','X','p','G','b','T','g','3','k','U','6','E','Z','M','t','J','q','v','n','S','T','6','x', + '5','x','4','P','z','p','M','F','V','b','d','m','f','G','n','J','m','w','z','K','8','a','q','E','D','e','b','3','h','B','V','g', + 'y','3','P','L','5','8','r','z','X','b','Q','g','H','7','L','c','Z','B','3','C','4','y','t','u','k','z','h','v','C','Y','p','p', + '8','H','v','5','X','w','4','L','R','V','V','4','U','C','8','4','T','E','a','N','Z','S','7','U','u','z','f','H','p','P','J','u', + 'Y','Z','h','T','6','e','v','z','V','F','h','u','y','H','b','k','J','M','f','3','6','g','y','L','E','W','t','B','B','d','d','9', + 'u','M','Z','k','F','G','f','h','q','k','5','k','f','r','M','7','c','M','7','y','n','u','8','b','d','7','Q','f','E','m','F','K', + 'x','W','f','B','2','F','8','5','q','z','y','3','R','i','U','m','X','k','h','N','J','y','B','C','h','u','x','4','f','k','J','5', + '6','X','T','W','h','8','J','4','m','K','p','N','3','g','C','g','A','E','e','Z','x','A','P','2','E','4','t','Q','5','X','Y','j', + '6','m','b','h','G','a','v','6','t','v','6','C','M','G','P','u','B','C','A','V','b','2','9','d','2','c','5','a','b','X','w','V', + 'G','6','a','7','c','8','G','6','K','U','Q','m','w','P','V','5','N','x','b','v','x','E','N','C','A','N','t','v','N','B','z','X', + 'B','R','q','U','n','i','A','Q','d','m','a','D','7','Y','f','3','J','8','Y','m','w','Z','b','w','r','H','q','E','j','c','u','E', + 'i','i','S','b','n','G','P','a','F','j','c','R','D','D','G','F','v','i','a','i','M','7','B','e','w','m','L','E','F','2','Y','4', + '4','7','Y','C','t','y','q','7','2','V','G','m','m','E','e','V','u','m','L','p','R','X','W','z','V','K','E','k','p','V','r','J', + 'd','N','3','t','i','u','S','V','w','2','w','U','Q','3','F','q','4','h','q','k','B','7','R','X','B','F','Q','Z','b','b','4','E', + 'K','v','T','B','w','k','V','C','x','d','K','g','N','S','u','k','p','9','z','w','c','y','U','M','V','E','2','Y','P','F','h','9', + 'T','y','h','w','b','9','P','w','G','c','W','W','k','j','J','Q','N','B','U','G','6','9','U','b','v','a','N','9','N','C','G','n', + 'x','R','6','9','Q','C','h','e','j','P','U','h','U','R','i','4','T','B','W','5','w','m','J','p','e','7','r','9','t','c','9','Z', + 'j','p','r','F','C','e','U','P','x','T','A','N','7','6','a','i','y','e','w','F','C','X','H','Y','G','C','q','q','m','A','t','7', + 'z','u','D','S','L','U','C','f','7','e','t','G','V','F','u','c','x','5','M','7','N','i','M','6','h','2','n','H','S','h','K','M', + 'd','T','z','X','d','x','x','4','q','z','d','D','a','2','X','r','p','r','R','m','U','U','y','S','H','c','a','F','e','Z','a','U', + 'P','9','V','J','e','q','j','Y','M','x','e','v','K','7','M','P','N','2','b','6','f','P','h','H','4','U','X','k','n','f','Q','M', + '9','9','a','J','N','e','w','y','f','F','P','p','a','F','Y','a','M','L','W','i','T','M','B','3','U','v','X','v','G','p','7','a', + 'f','u','4','S','y','X','9','g','g','b','B','G','c','i','M','U','n','m','a','7','q','f','9','n','Q','2','V','L','6','e','T','R', + '2','4','9','d','6','Q','B','Y','q','2','4','9','G','Q','E','b','Y','5','u','2','T','Q','G','L','5','n','4','Y','2','y','G','F', + 'j','c','8','M','G','L','e','3','a','N','v','A','A','W','t','R','S','2','i','D','R','8','j','d','Q','3','6','C','V','M','e','w', + 'j','U','Z','w','M','4','b','m','8','J','P','Q','L','P','R','c','r','b','V','C','3','N','8','K','4','d','W','D','N','U','A','A', + '2','J','p','b','D','d','p','j','N','C','k','A','j','B','a','c','u','v','L','X','U','B','4','U','X','W','e','C','b','C','u','d', + 'A','v','U','z','P','t','D','e','5','y','Y','c','x','K','4','7','j','e','e','D','M','5','K','B','Q','6','d','p','T','T','R','j', + 'M','E','E','M','r','N','6','8','7','q','x','F','S','x','E','U','4','d','B','6','5','W','C','e','m','J','e','5','j','w','V','J', + 'w','v','d','7','v','f','K','u','m','8','h','W','T','e','Q','j','M','8','R','Y','d','B','R','2','r','F','j','7','d','E','q','V', + 'k','e','j','P','9','3','X','R','p','R','b','A','v','7','4','A','M','2','k','r','E','7','X','3','7','k','5','c','B','7','W','5', + 'u','J','B','Q','R','2','V','7','h','Q','h','9','g','G','y','c','c','x','M','z','7','G','2','J','w','v','j','5','9','E','b','k', + 'z','W','T','C','b','4','K','R','X','T','k','V','S','G','2','j','d','6','y','E','4','P','H','K','w','a','m','F','Z','x','9','j', + 'i','2','d','X','u','a','4','a','M','z','8','p','p','z','g','t','H','5','Y','L','Q','c','R','F','m','E','n','G','X','d','f','7', + 'x','8','j','g','J','z','D','S','a','S','h','y','5','h','Y','N','p','w','Y','W','h','E','N','v','8','Q','D','W','Z','k','f','e', + 'r','Z','D','7','R','D','T','2','H','X','z','G','X','f','v','E','z','P','v','U','H','e','4','R','W','U','x','t','t','4','w','p', + 'r','z','K','9','f','g','h','P','r','f','v','k','h','c','e','5','8','a','L','F','J','M','G','R','a','N','q','S','g','W','e','7', + 'R','K','R','A','B','z','6','v','S','p','w','n','e','x','k','E','r','j','f','Y','x','8','9','z','e','T','6','E','G','v','9','f', + 'D','A','N','v','y','U','7','D','M','2','E','5','W','G','6','b','9','q','g','Y','F','f','k','q','Q','E','x','Y','C','R','G','6', + 'R','h','4','J','d','U','D','b','9','b','8','r','f','V','d','g','b','2','z','Z','d','m','X','v','j','Y','d','w','K','8','G','r', + 'v','j','N','y','c','h','u','5','z','g','J','H','a','Z','b','z','G','C','r','P','f','y','P','6','F','P','h','7','9','w','7','y', + 'R','3','n','E','h','G','D','4','m','Y','E','q','k','a','f','a','R','B','q','t','W','E','T','p','H','7','k','X','2','d','X','6', + 'W','n','H','m','w','M','i','Y','M','E','F','5','R','p','p','y','c','b','q','R','9','Y','t','T','7','w','u','K','M','Q','z','n', + 'P','7','g','x','6','R','4','x','N','v','w','M','6','j','K','v','7','a','Y','4','a','M','6','n','z','3','E','2','V','N','4','i', + 'E','f','u','W','J','W','e','8','3','Q','e','a','F','P','c','3','P','k','i','z','d','q','m','q','M','a','d','8','D','3','F','M', + 'e','d','E','j','z','V','e','d','z','H','D','J','8','X','g','E','i','u','c','7','A','w','S','J','2','A','e','8','r','q','C','m', + '9','9','a','g','2','y','y','P','M','e','8','3','T','r','m','8','j','v','r','p','M','Z','Y','g','a','9','2','d','H','B','m','9', + '4','6','a','Z','V','u','S','H','g','3','X','h','i','N','3','B','S','E','k','9','k','2','9','R','A','i','3','L','X','M','B','S', + '4','S','F','F','F','w','u','d','M','T','9','K','B','7','R','U','R','8','D','8','T','5','U','t','E','R','x','n','x','h','v','k', + 'B','N','k','E','U','T','t','p','r','u','Z','h','t','E','4','i','P','z','f','z','q','M','p','f','A','K','2','D','t','j','f','c', + 'Y','E','N','M','x','k','g','7','T','U','2','c','d','V','g','2','z','L','i','j','Y','q','b','T','A','y','v','a','t','N','5','t', + 'Z','5','n','D','a','y','G','n','P','x','V','k','M','8','t','J','Z','G','g','5','9','R','h','P','P','J','N','X','p','G','J','p', + '2','y','A','v','d','G','U','z','3','V','M','y','q','U','N','M','Y','p','B','Z','U','h','j','q','z','q','x','w','7','d','J','Q', + 'u','F','q','3','m','9','c','Q','W','d','6','7','b','V','M','7','P','j','r','k','9','h','R','z','m','b','i','B','u','E','L','9', + 'k','v','h','h','W','2','K','e','M','U','Q','p','A','Q','Y','J','G','E','T','U','L','f','q','G','4','z','K','K','y','a','U','W', + 'K','D','P','c','N','D','V','S','Y','6','T','p','R','y','y','J','a','T','J','W','Q','9','p','F','P','X','y','k','9','z','z','4', + 'G','d','a','z','X','n','h','4','J','P','W','V','D','r','U','m','a','8','a','b','X','F','J','X','L','4','S','X','5','W','p','W', + 'h','y','x','B','f','d','C','X','w','7','r','g','V','T','H','a','i','4','N','v','c','w','n','2','3','A','i','A','J','9','N','c', + 'z','7','n','n','3','n','h','n','i','R','i','b','E','h','k','U','c','c','U','6','f','x','q','N','y','H','M','e','J','B','U','B', + 'r','g','a','8','V','a','G','V','y','u','c','c','v','C','H','W','y','g','z','Q','2','4','k','S','m','f','e','G','H','v','Q','3', + 'P','e','f','S','V','P','c','U','e','3','P','x','d','c','7','c','f','g','D','w','2','t','q','y','g','2','Q','V','4','K','a','Q', + 'g','B','b','L','x','9','m','a','K','4','i','x','g','Q','M','9','W','N','2','w','p','v','2','k','B','y','9','k','A','c','f','Z', + 'D','R','A','S','d','v','w','f','f','q','t','K','3','j','x','D','G','P','n','u','r','v','U','k','A','2','d','R','N','T','G','4', + 'B','g','k','t','h','7','J','k','F','A','C','g','W','g','J','F','z','S','Q','c','v','M','b','D','e','H','Q','S','j','v','G','E', + 'R','k','f','i','P','E','F','N','6','y','p','b','t','M','c','Q','B','7','g','w','J','7','3','d','V','E','m','z','6','6','P','P', + 'd','i','r','J','H','D','H','J','r','b','n','v','z','W','e','u','g','B','u','Z','2','m','D','5','h','F','X','B','2','r','6','w', + 'u','Y','4','N','X','K','a','v','V','3','j','B','r','r','C','c','w','R','g','S','8','V','b','F','2','N','M','c','K','8','Y','E', + 'E','N','K','X','K','V','B','x','n','Q','p','a','q','f','k','t','z','Y','E','P','Z','y','n','a','c','B','V','a','x','b','d','X', + 'r','d','8','P','H','F','v','r','V','5','g','J','w','6','i','h','d','d','p','J','c','c','Y','S','q','W','m','U','5','G','b','H', + 'N','z','E','Z','K','E','y','M','c','G','i','d','w','Z','D','N','N','w','S','t','g','y','a','Y','b','H','e','M','N','f','Y','Y', + '7','a','9','b','M','U','k','a','V','k','C','n','a','k','U','H','A','M','i','v','k','t','a','d','i','3','F','d','5','2','A','p', + 'U','c','J','U','R','h','G','d','A','Y','v','q','X','c','w','r','x','4','j','3','4','b','F','d','a','L','N','J','3','Z','g','6', + 'W','Q','R','u','P','t','M','A','3','F','6','y','K','Y','G','2','t','v','u','p','w','b','G','S','K','5','p','4','d','E','w','6', + 'g','t','V','4','b','2','n','b','Z','3','3','f','m','d','2','c','a','m','j','X','U','E','D','6','6','F','w','H','9','7','Z','Y', + 'd','X','C','K','i','g','p','F','Y','n','2','b','F','4','R','u','V','k','f','d','J','i','a','b','X','H','7','v','K','a','Q','i', + 'W','M','j','M','i','a','i','n','F','h','r','q','4','w','x','m','4','q','y','F','8','w','i','4','D','B','A','L','B','U','u','K', + 'v','K','n','a','Q','i','e','k','v','Q','U','5','w','Q','c','r','A','6','M','w','y','g','n','e','v','K','7','W','u','2','y','f', + 'Q','u','e','r','y','a','w','V','p','f','Q','z','C','u','i','i','9','S','P','q','L','r','C','H','S','3','E','p','8','S','m','Q', + 'S','K','r','V','b','J','R','m','w','c','n','Q','N','Q','4','M','u','f','X','S','f','U','Z','x','U','4','j','K','4','G','z','X', + '7','Q','j','R','h','i','G','m','q','c','V','T','x','U','a','E','b','Q','q','E','i','F','K','7','K','i','R','J','5','Y','F','V', + 'B','7','R','8','M','i','f','j','Z','w','j','b','B','u','p','N','Y','r','S','r','f','h','E','J','T','B','P','R','D','V','K','A', + 'Z','A','R','j','z','f','B','i','Y','L','F','G','V','Y','w','R','C','P','G','m','9','7','C','5','e','y','w','N','K','N','a','Q', + 'j','a','W','3','2','f','G','w','n','M','6','F','u','K','8','g','8','M','G','r','e','9','Z','z','y','2','G','U','k','G','6','m', + 'A','D','4','n','b','8','a','q','S','m','S','6','5','R','5','D','5','S','B','g','X','T','8','Q','V','d','A','n','g','y','8','a', + 'h','7','K','9','H','D','J','F','w','G','4','w','T','J','F','f','i','8','X','e','B','J','K','H','7','V','y','X','7','E','8','S', + 'A','d','b','w','S','8','Y','a','J','d','j','E','V','J','T','E','U','R','5','7','V','M','E','v','D','3','z','5','r','k','z','v', + 'e','m','A','7','P','8','j','X','E','f','Q','q','8','D','g','y','8','j','A','e','B','c','c','M','z','k','2','c','q','v','v','y', + 'Q','y','h','g','p','v','M','m','m','C','G','D','k','8','u','T','n','Q','H','G','H','f','b','J','j','5','X','c','i','7','7','q', + 'b','R','8','b','b','z','f','f','h','Y','Q','7','u','B','X','e','i','j','M','q','C','T','M','v','t','J','J','w','b','F','v','J', + 'm','e','2','u','e','8','L','V','G','q','A','j','m','7','m','g','m','5','i','r','p','p','U','y','F','6','f','b','u','6','q','L', + 'M','E','t','V','W','C','t','e','p','w','a','n','w','y','X','h','8','e','G','C','H','q','r','X','G','9','c','h','7','k','8','M', + 'G','b','a','m','Y','Q','w','8','J','z','a','F','r','4','W','M','j','P','q','a','z','U','y','u','3','b','Z','f','Y','5','7','g', + 'N','M','h','M','a','3','C','K','6','6','f','a','p','i','f','q','k','T','i','z','w','f','Z','c','H','L','X','g','6','m','g','r', + 'w','Y','u','K','8','L','p','8','P','R','A','R','A','b','Z','V','a','x','V','c','G','A','H','t','Y','6','P','T','L','W','N','z', + 'g','z','k','d','E','v','C','t','Z','M','Z','K','4','w','9','5','D','W','f','U','8','5','u','6','b','5','B','8','g','y','C','E', + 'Q','z','e','9','p','N','S','P','D','D','f','x','k','Z','4','R','v','X','V','k','p','b','n','t','c','F','R','e','x','9','C','D', + 'J','2','6','f','Z','D','w','J','R','j','j','9','b','w','N','N','p','R','f','Z','z','j','F','r','Q','e','F','x','f','t','V','V', + 'A','y','J','G','W','Z','H','r','D','5','M','u','H','V','L','N','U','V','X','z','j','9','r','v','e','d','R','c','u','V','x','r', + 'c','6','k','L','h','q','w','U','W','Q','g','G','F','C','t','E','a','D','h','x','9','5','P','R','Z','E','M','5','f','4','2','t', + 'A','6','f','r','X','G','X','Y','B','8','G','E','n','B','v','x','f','M','R','f','B','z','Y','3','2','q','z','G','t','P','C','6', + '6','r','z','J','r','c','n','d','6','h','e','w','D','D','h','V','L','u','i','b','5','K','d','S','y','9','N','p','E','r','D','k', + 'B','z','u','v','d','Q','p','K','5','m','J','r','b','Y','Z','7','p','M','J','F','E','q','x','f','E','K','U','U','4','f','a','6', + 'g','5','a','q','D','U','8','F','y','R','a','P','5','5','x','z','6','V','T','P','D','m','y','7','U','5','C','A','7','Q','h','w', + 'r','6','x','g','Q','i','b','K','F','p','B','X','Q','h','i','E','r','C','z','v','x','W','Q','6','p','6','b','M','K','V','x','u', + 'k','d','R','S','k','Q','p','n','h','d','Q','Y','x','n','x','5','K','t','5','w','A','5','p','k','F','z','W','p','j','U','y','V', + 'x','G','m','y','L','A','X','H','G','A','a','J','5','E','P','q','E','U','7','p','6','A','9','n','d','G','D','g','i','h','t','W', + 'b','c','E','2','P','d','y','J','M','u','4','g','P','S','X','J','v','w','3','v','D','q','U','i','U','T','q','E','Y','5','2','t', + 'b','j','P','2','j','D','9','y','i','B','5','Y','3','X','L','w','m','V','X','z','X','r','Z','d','H','L','A','H','k','R','X','5', + 'i','L','m','q','3','p','a','G','P','j','g','h','R','P','Y','U','z','M','5','R','M','A','E','Q','V','c','w','r','4','M','S','k', + 'N','D','i','R','R','x','t','q','T','i','u','N','K','R','x','Z','K','a','g','G','y','9','c','j','J','S','9','3','H','T','f','F', + 'q','6','D','W','F','K','h','e','p','p','b','q','N','k','A','C','m','y','u','B','J','v','q','D','e','j','e','b','2','w','R','t', + 'J','N','j','F','T','A','8','L','m','X','i','T','g','j','c','V','4','V','h','2','h','R','p','2','9','k','c','c','G','D','h','z', + 't','i','h','t','W','R','n','Y','i','8','u','6','G','9','T','P','9','9','J','P','Y','R','h','X','K','z','h','L','W','r','C','U', + '2','L','T','k','2','m','6','W','L','P','T','Z','z','t','i','H','5','G','w','t','E','v','z','k','b','H','b','b','W','W','u','b', + 'i','h','C','Q','n','H','N','u','5','u','K','X','r','M','W','U','3','Y','k','P','2','k','x','f','x','C','w','z','z','b','G','8', + 'y','W','e','j','v','2','v','r','t','q','z','p','Y','d','w','6','Z','D','J','L','9','F','z','G','U','4','a','8','H','6','U','a', + 'q','7','y','Q','J','v','m','D','P','S','j','q','v','t','n','t','g','j','3','t','8','f','K','K','7','b','W','d','F','i','N','K', + 'a','R','V','V','V','v','m','A','Q','2','y','j','c','t','f','k','j','7','X','y','j','b','U','F','w','W','3','9','6','A','S','J', + 'p','q','2','Z','7','L','p','b','7','b','5','i','p','r','r','h','P','M','h','j','c','y','e','u','h','B','d','9','9','u','f','d', + 'g','u','p','w','u','9','S','c','L','U','g','A','y','V','F','V','6','D','D','X','i','V','m','u','Y','P','J','v','L','T','A','F', + 'M','Q','H','Z','6','v','8','p','A','L','P','z','C','V','a','C','h','X','j','W','8','G','z','j','d','M','4','u','x','w','H','g', + 'V','q','K','z','b','g','2','3','D','N','y','G','X','F','T','v','T','L','y','v','L','9','g','c','C','R','8','L','A','7','Y','N', + 't','n','R','6','b','n','m','9','i','h','t','T','F','a','V','N','J','J','3','J','q','p','W','7','b','T','G','r','M','k','a','7', + 'D','H','v','y','T','A','C','U','P','u','q','L','R','Y','4','q','h','y','f','F','J','x','K','7','N','B','v','3','a','Z','M','t', + 'U','x','8','9','V','E','t','j','K','r','u','Y','Y','A','u','w','Y','2','y','Q','z','S','n','J','B','2','t','X','x','K','z','g', + '6','d','n','i','7','Z','N','F','Q','6','w','N','r','b','k','d','W','X','S','t','c','U','m','6','4','2','e','w','6','x','Z','a', + 'Q','A','7','4','h','H','z','r','e','J','q','j','w','4','q','c','i','R','4','x','n','r','j','r','P','g','E','7','t','k','b','Z', + 'r','A','b','d','g','i','G','V','D','E','U','L','b','J','U','q','2','S','K','m','A','U','L','k','Q','4','N','p','k','G','C','6', + 'R','Z','B','y','B','B','j','y','x','L','d','h','L','G','6','x','H','z','T','5','d','Y','4','2','m','q','Q','y','H','6','c','N', + 'u','m','U','v','i','Y','Z','7','4','L','K','F','b','v','2','Y','h','x','8','a','R','w','q','x','E','a','T','y','m','C','2','Q', + 'U','T','D','Q','v','u','M','9','D','8','r','8','b','m','p','E','7','C','T','9','B','A','G','k','b','G','z','Z','G','L','N','k', + 'h','3','k','J','e','f','d','x','F','8','W','K','7','T','6','h','H','V','C','h','P','u','H','e','v','w','z','P','K','r','D','G', + 'X','Z','B','X','f','H','Q','4','e','D','y','W','Z','6','4','K','A','e','a','F','S','N','h','x','S','W','J','c','E','P','g','j', + 'a','w','T','m','Z','X','E','P','Y','R','M','2','R','2','X','N','F','X','Y','W','x','z','p','J','g','n','D','4','i','p','6','N', + 'r','9','G','k','E','h','T','h','U','h','x','B','Q','9','H','7','w','U','P','Q','d','G','6','q','p','j','j','v','C','a','X','J', + 'N','G','Y','w','f','H','C','x','F','k','z','3','9','r','h','8','7','5','V','i','V','C','R','q','x','N','2','2','i','W','F','U', + '7','T','H','f','z','E','a','n','u','Q','t','U','Y','G','t','3','A','m','r','6','d','f','e','n','e','z','F','u','U','N','8','m', + 'h','p','R','N','S','H','6','6','V','M','S','t','q','P','E','i','u','y','g','8','L','Q','Y','Y','G','e','W','W','C','G','y','b', + 'y','t','u','P','R','P','5','m','N','K','B','Z','w','f','t','k','x','3','L','b','q','d','w','S','G','E','h','R','F','4','q','e', + '5','6','F','2','n','q','T','R','y','f','n','Y','h','2','F','u','x','M','i','i','h','w','G','C','Z','v','i','C','a','X','U','C', + 'Y','8','d','h','R','x','V','n','v','G','i','D','a','U','p','U','a','e','b','F','w','P','d','X','n','K','h','9','H','r','b','g', + '2','f','m','X','k','m','q','6','n','5','b','G','H','d','R','9','D','U','c','r','Z','Y','W','S','Z','x','p','t','x','y','4','k', + 'j','F','U','t','C','i','e','i','b','p','e','4','C','z','h','3','3','5','Q','P','n','G','i','A','8','c','Q','z','B','a','V','4', + '2','B','2','z','u','u','3','i','L','w','y','g','K','H','k','y','2','B','b','e','5','e','4','e','U','4','z','n','P','z','a','c', + 'E','f','u','M','G','C','g','z','j','4','E','7','R','t','D','K','c','t','p','g','W','H','C','H','J','Q','J','c','F','5','4','W', + 'K','7','j','h','A','T','K','z','t','S','f','f','j','C','c','8','n','7','c','T','U','R','Q','E','7','A','W','Z','z','K','5','j', + '2','H','k','a','j','g','g','W','w','4','T','A','9','J','U','e','S','N','P','K','d','k','L','Q','G','Z','e','W','i','H','u','j', + 'C','z','4','E','2','v','5','L','u','9','Z','a','9','A','b','C','M','G','X','B','C','2','Y','Z','e','U','n','E','5','Y','n','y', + 'F','h','H','p','9','j','Y','F','V','w','Y','r','8','Q','f','C','J','4','T','t','z','Q','N','M','e','7','4','3','y','E','M','m', + 'b','S','c','h','w','a','X','E','d','E','z','t','h','9','k','p','A','k','K','H','x','q','K','Z','B','u','a','9','3','U','U','u', + '8','E','D','v','y','k','W','Y','X','k','r','R','D','X','n','Q','V','d','e','D','g','x','E','V','Y','w','k','m','K','r','H','D', + 't','2','6','N','U','g','3','t','B','9','t','u','M','D','z','Y','K','z','K','r','V','5','i','e','p','M','d','t','w','6','a','f', + 'f','W','k','L','i','g','M','V','M','Y','b','x','e','4','h','h','Y','g','w','Z','m','e','e','6','R','W','M','x','G','y','V','n', + '6','e','g','A','g','K','a','N','7','p','a','u','E','4','6','M','t','X','h','g','b','j','p','5','x','x','B','P','3','J','M','7', + 'j','Z','P','y','e','Q','Z','e','t','j','3','t','F','V','x','m','b','b','B','y','J','L','L','9','3','R','a','5','j','S','V','t', + 'e','2','6','m','H','w','r','w','r','6','Q','3','x','z','m','A','d','x','t','E','H','c','Z','x','c','P','j','r','u','U','W','k', + '6','g','X','g','n','f','n','7','H','M','B','t','v','6','v','x','g','M','f','e','2','w','m','y','d','H','S','q','c','K','U','H', + '2','X','h','d','p','Q','7','J','X','i','X','f','a','z','V','A','F','2','8','z','v','h','C','h','e','4','g','z','w','z','h','q', + 'p','6','B','n','m','8','h','W','U','7','z','h','T','6','J','f','4','Z','n','Q','W','z','2','N','4','t','g','7','u','4','X','2', + 'C','F','L','n','J','n','m','j','3','P','3','Y','e','J','R','A','H','e','R','D','z','7','u','X','Y','y','D','w','J','m','G','U', + 'P','H','5','S','d','a','F','F','Y','c','M','f','3','3','L','v','V','B','U','C','A','d','N','H','Q','h','7','8','4','r','p','G', + 'v','M','D','H','7','e','E','r','i','K','Q','i','B','D','M','Z','p','c','R','G','u','c','H','a','N','k','E','f','9','R','7','x', + '6','3','5','u','x','3','h','v','p','6','q','r','j','u','f','W','T','q','P','n','Y','L','B','6','U','w','P','2','T','W','R','g', + '2','3','3','e','N','V','a','j','b','e','4','T','u','J','u','u','F','B','D','G','H','x','x','k','5','G','e','3','4','B','m','L', + 'S','b','i','t','T','p','M','D','Z','A','A','i','r','J','p','4','H','U','A','G','y','d','Q','5','U','R','F','8','q','a','S','H', + 'n','5','z','9','g','3','u','R','H','m','G','m','b','p','c','L','Z','Y','u','m','i','K','A','Q','R','T','X','G','t','b','8','7', + '7','6','w','M','N','f','R','G','r','L','m','q','n','7','5','k','X','8','g','u','K','7','Y','w','K','q','U','e','W','A','r','i', + 'Z','a','p','q','L','5','P','u','n','t','y','G','x','C','N','X','q','P','r','U','v','A','r','r','q','e','f','c','z','M','7','N', + '6','a','z','Z','a','t','f','p','4','v','J','Y','j','h','M','D','t','k','A','B','p','Q','A','y','x','X','7','p','S','8','m','M', + 'y','K','B','A','5','2','7','b','y','R','K','q','A','u','3','J'}; + +static const adler32_test tests[] = { + {__LINE__, 0x1, (const uint8_t *)0x0, 0, 0x1}, + {__LINE__, 0x1, (const uint8_t *)"", 1, 0x10001}, + {__LINE__, 0x1, (const uint8_t *)"a", 1, 0x620062}, + {__LINE__, 0x1, (const uint8_t *)"abacus", 6, 0x8400270}, + {__LINE__, 0x1, (const uint8_t *)"backlog", 7, 0xb1f02d4}, + {__LINE__, 0x1, (const uint8_t *)"campfire", 8, 0xea10348}, + {__LINE__, 0x1, (const uint8_t *)"delta", 5, 0x61a020b}, + {__LINE__, 0x1, (const uint8_t *)"executable", 10, 0x16fa0423}, + {__LINE__, 0x1, (const uint8_t *)"file", 4, 0x41401a1}, + {__LINE__, 0x1, (const uint8_t *)"greatest", 8, 0xefa0360}, + {__LINE__, 0x1, (const uint8_t *)"inverter", 8, 0xf6f0370}, + {__LINE__, 0x1, (const uint8_t *)"jigsaw", 6, 0x8bd0286}, + {__LINE__, 0x1, (const uint8_t *)"karate", 6, 0x8a50279}, + {__LINE__, 0x1, (const uint8_t *)"landscape", 9, 0x126a03ac}, + {__LINE__, 0x1, (const uint8_t *)"machine", 7, 0xb5302d6}, + {__LINE__, 0x1, (const uint8_t *)"nanometer", 9, 0x12d803ca}, + {__LINE__, 0x1, (const uint8_t *)"oblivion", 8, 0xf220363}, + {__LINE__, 0x1, (const uint8_t *)"panama", 6, 0x8a1026f}, + {__LINE__, 0x1, (const uint8_t *)"quest", 5, 0x6970233}, + {__LINE__, 0x1, (const uint8_t *)"resource", 8, 0xf8d0369}, + {__LINE__, 0x1, (const uint8_t *)"secret", 6, 0x8d10287}, + {__LINE__, 0x1, (const uint8_t *)"ultimate", 8, 0xf8d0366}, + {__LINE__, 0x1, (const uint8_t *)"vector", 6, 0x8fb0294}, + {__LINE__, 0x1, (const uint8_t *)"walrus", 6, 0x918029f}, + {__LINE__, 0x1, (const uint8_t *)"xeno", 4, 0x45e01bb}, + {__LINE__, 0x1, (const uint8_t *)"yelling", 7, 0xbfe02f5}, + {__LINE__, 0x1, (const uint8_t *)"zero", 4, 0x46e01c1}, + {__LINE__, 0x1, (const uint8_t *)"4BJD7PocN1VqX0jXVpWB", 20, 0x3eef064d}, + {__LINE__, 0x1, (const uint8_t *)"F1rPWI7XvDs6nAIRx41l", 20, 0x425d065f}, + {__LINE__, 0x1, (const uint8_t *)"ldhKlsVkPFOveXgkGtC2", 20, 0x4f1a073e}, + {__LINE__, 0x1, (const uint8_t *)"5KKnGOOrs8BvJ35iKTOS", 20, 0x42290650}, + {__LINE__, 0x1, (const uint8_t *)"0l1tw7GOcem06Ddu7yn4", 20, 0x43fd0690}, + {__LINE__, 0x1, (const uint8_t *)"MCr47CjPIn9R1IvE1Tm5", 20, 0x3f770609}, + {__LINE__, 0x1, (const uint8_t *)"UcixbzPKTIv0SvILHVdO", 20, 0x4c7c0703}, + {__LINE__, 0x1, (const uint8_t *)"dGnAyAhRQDsWw0ESou24", 20, 0x48ac06b7}, + {__LINE__, 0x1, (const uint8_t *)"di0nvmY9UYMYDh0r45XT", 20, 0x489a0698}, + {__LINE__, 0x1, (const uint8_t *)"2XKDwHfAhFsV0RhbqtvH", 20, 0x44a906e6}, + {__LINE__, 0x1, (const uint8_t *)"ZhrANFIiIvRnqClIVyeD", 20, 0x4a29071c}, + {__LINE__, 0x1, (const uint8_t *)"v7Q9ehzioTOVeDIZioT1", 20, 0x4a7706f9}, + {__LINE__, 0x1, (const uint8_t *)"Yod5hEeKcYqyhfXbhxj2", 20, 0x4ce60769}, + {__LINE__, 0x1, (const uint8_t *)"GehSWY2ay4uUKhehXYb0", 20, 0x48ae06e5}, + {__LINE__, 0x1, (const uint8_t *)"kwytJmq6UqpflV8Y8GoE", 20, 0x51d60750}, + {__LINE__, 0x1, (const uint8_t *)"70684206568419061514", 20, 0x2b100414}, + {__LINE__, 0x1, (const uint8_t *)"42015093765128581010", 20, 0x2a550405}, + {__LINE__, 0x1, (const uint8_t *)"88214814356148806939", 20, 0x2b450423}, + {__LINE__, 0x1, (const uint8_t *)"43472694284527343838", 20, 0x2b460421}, + {__LINE__, 0x1, (const uint8_t *)"49769333513942933689", 20, 0x2bc1042b}, + {__LINE__, 0x1, (const uint8_t *)"54979784887993251199", 20, 0x2ccd043d}, + {__LINE__, 0x1, (const uint8_t *)"58360544869206793220", 20, 0x2b68041a}, + {__LINE__, 0x1, (const uint8_t *)"27347953487840714234", 20, 0x2b84041d}, + {__LINE__, 0x1, (const uint8_t *)"07650690295365319082", 20, 0x2afa0417}, + {__LINE__, 0x1, (const uint8_t *)"42655507906821911703", 20, 0x2aff0412}, + {__LINE__, 0x1, (const uint8_t *)"29977409200786225655", 20, 0x2b8d0420}, + {__LINE__, 0x1, (const uint8_t *)"85181542907229116674", 20, 0x2b140419}, + {__LINE__, 0x1, (const uint8_t *)"87963594337989416799", 20, 0x2c8e043f}, + {__LINE__, 0x1, (const uint8_t *)"21395988329504168551", 20, 0x2b68041f}, + {__LINE__, 0x1, (const uint8_t *)"51991013580943379423", 20, 0x2af10417}, + {__LINE__, 0x1, (const uint8_t *)"*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x7c9d0841}, + {__LINE__, 0x1, (const uint8_t *)"_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0x71060751}, + {__LINE__, 0x1, (const uint8_t *)"&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0x7095070a}, + {__LINE__, 0x1, (const uint8_t *)"]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x82530815}, + {__LINE__, 0x1, (const uint8_t *)"-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x61250661}, + {__LINE__, 0x1, (const uint8_t *)"+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x642006a3}, + {__LINE__, 0x1, (const uint8_t *)")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x674206cb}, + {__LINE__, 0x1, (const uint8_t *)":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x67670680}, + {__LINE__, 0x1, (const uint8_t *)"{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0x7547070f}, + {__LINE__, 0x1, (const uint8_t *)"_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x69ea06ee}, + {__LINE__, 0x1, (const uint8_t *)"e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0x1b01e92}, + {__LINE__, 0x1, (const uint8_t *)"r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0xfbdb1e96}, + {__LINE__, 0x1, (const uint8_t *)"h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0x47a61ec8}, + {__LINE__, 0x1, (const uint8_t *)long_string, 5552, 0x8b81718f}, + {__LINE__, 0x7a30360d, (const uint8_t *)0x0, 0, 0x1}, + {__LINE__, 0x6fd767ee, (const uint8_t *)"", 1, 0xd7c567ee}, + {__LINE__, 0xefeb7589, (const uint8_t *)"a", 1, 0x65e475ea}, + {__LINE__, 0x61cf7e6b, (const uint8_t *)"abacus", 6, 0x60b880da}, + {__LINE__, 0xdc712e2, (const uint8_t *)"backlog", 7, 0x9d0d15b5}, + {__LINE__, 0xad23c7fd, (const uint8_t *)"campfire", 8, 0xfbfecb44}, + {__LINE__, 0x85cb2317, (const uint8_t *)"delta", 5, 0x3b622521}, + {__LINE__, 0x9eed31b0, (const uint8_t *)"executable", 10, 0xa6db35d2}, + {__LINE__, 0xb94f34ca, (const uint8_t *)"file", 4, 0x9096366a}, + {__LINE__, 0xab058a2, (const uint8_t *)"greatest", 8, 0xded05c01}, + {__LINE__, 0x5bff2b7a, (const uint8_t *)"inverter", 8, 0xc7452ee9}, + {__LINE__, 0x605c9a5f, (const uint8_t *)"jigsaw", 6, 0x7899ce4}, + {__LINE__, 0x51bdeea5, (const uint8_t *)"karate", 6, 0xf285f11d}, + {__LINE__, 0x85c21c79, (const uint8_t *)"landscape", 9, 0x98732024}, + {__LINE__, 0x97216f56, (const uint8_t *)"machine", 7, 0xadf4722b}, + {__LINE__, 0x18444af2, (const uint8_t *)"nanometer", 9, 0xcdb34ebb}, + {__LINE__, 0xbe6ce359, (const uint8_t *)"oblivion", 8, 0xe8b7e6bb}, + {__LINE__, 0x843071f1, (const uint8_t *)"panama", 6, 0x389e745f}, + {__LINE__, 0xf2480c60, (const uint8_t *)"quest", 5, 0x36c90e92}, + {__LINE__, 0x2d2feb3d, (const uint8_t *)"resource", 8, 0x9705eea5}, + {__LINE__, 0x7490310a, (const uint8_t *)"secret", 6, 0xa3a63390}, + {__LINE__, 0x97d247d4, (const uint8_t *)"ultimate", 8, 0xe6154b39}, + {__LINE__, 0x93cf7599, (const uint8_t *)"vector", 6, 0x5e87782c}, + {__LINE__, 0x73c84278, (const uint8_t *)"walrus", 6, 0xbc84516}, + {__LINE__, 0x228a87d1, (const uint8_t *)"xeno", 4, 0x4646898b}, + {__LINE__, 0xa7a048d0, (const uint8_t *)"yelling", 7, 0xb1654bc4}, + {__LINE__, 0x1f0ded40, (const uint8_t *)"zero", 4, 0xd8a4ef00}, + {__LINE__, 0xa804a62f, (const uint8_t *)"4BJD7PocN1VqX0jXVpWB", 20, 0xe34eac7b}, + {__LINE__, 0x508fae6a, (const uint8_t *)"F1rPWI7XvDs6nAIRx41l", 20, 0x33f2b4c8}, + {__LINE__, 0xe5adaf4f, (const uint8_t *)"ldhKlsVkPFOveXgkGtC2", 20, 0xe7b1b68c}, + {__LINE__, 0x67136a40, (const uint8_t *)"5KKnGOOrs8BvJ35iKTOS", 20, 0xf6a0708f}, + {__LINE__, 0xb00c4a10, (const uint8_t *)"0l1tw7GOcem06Ddu7yn4", 20, 0xbd8f509f}, + {__LINE__, 0x2e0c84b5, (const uint8_t *)"MCr47CjPIn9R1IvE1Tm5", 20, 0xcc298abd}, + {__LINE__, 0x81238d44, (const uint8_t *)"UcixbzPKTIv0SvILHVdO", 20, 0xd7809446}, + {__LINE__, 0xf853aa92, (const uint8_t *)"dGnAyAhRQDsWw0ESou24", 20, 0x9525b148}, + {__LINE__, 0x5a692325, (const uint8_t *)"di0nvmY9UYMYDh0r45XT", 20, 0x620029bc}, + {__LINE__, 0x3275b9f, (const uint8_t *)"2XKDwHfAhFsV0RhbqtvH", 20, 0x70916284}, + {__LINE__, 0x38371feb, (const uint8_t *)"ZhrANFIiIvRnqClIVyeD", 20, 0xd52706}, + {__LINE__, 0xafc8bf62, (const uint8_t *)"v7Q9ehzioTOVeDIZioT1", 20, 0xeeb4c65a}, + {__LINE__, 0x9b07db73, (const uint8_t *)"Yod5hEeKcYqyhfXbhxj2", 20, 0xde3e2db}, + {__LINE__, 0xe75b214, (const uint8_t *)"GehSWY2ay4uUKhehXYb0", 20, 0x4171b8f8}, + {__LINE__, 0x72d0fe6f, (const uint8_t *)"kwytJmq6UqpflV8Y8GoE", 20, 0xa66a05cd}, + {__LINE__, 0xf857a4b1, (const uint8_t *)"70684206568419061514", 20, 0x1f9a8c4}, + {__LINE__, 0x54b8e14, (const uint8_t *)"42015093765128581010", 20, 0x49c19218}, + {__LINE__, 0xd6aa5616, (const uint8_t *)"88214814356148806939", 20, 0xbbfc5a38}, + {__LINE__, 0x11e63098, (const uint8_t *)"43472694284527343838", 20, 0x93434b8}, + {__LINE__, 0xbe92385, (const uint8_t *)"49769333513942933689", 20, 0xfe1827af}, + {__LINE__, 0x49511de0, (const uint8_t *)"54979784887993251199", 20, 0xcba8221c}, + {__LINE__, 0x3db13bc1, (const uint8_t *)"58360544869206793220", 20, 0x14643fda}, + {__LINE__, 0xbb899bea, (const uint8_t *)"27347953487840714234", 20, 0x1604a006}, + {__LINE__, 0xf6cd9436, (const uint8_t *)"07650690295365319082", 20, 0xb69f984c}, + {__LINE__, 0x9109e6c3, (const uint8_t *)"42655507906821911703", 20, 0xc43eead4}, + {__LINE__, 0x75770fc, (const uint8_t *)"29977409200786225655", 20, 0x707751b}, + {__LINE__, 0x69b1d19b, (const uint8_t *)"85181542907229116674", 20, 0xf5bdd5b3}, + {__LINE__, 0xc6132975, (const uint8_t *)"87963594337989416799", 20, 0x2fed2db3}, + {__LINE__, 0xd58cb00c, (const uint8_t *)"21395988329504168551", 20, 0xc2a2b42a}, + {__LINE__, 0xb63b8caa, (const uint8_t *)"51991013580943379423", 20, 0xdf0590c0}, + {__LINE__, 0x8a45a2b8, (const uint8_t *)"*]+@!);({_$;}[_},?{?;(_?,=-][@", 30, 0x1980aaf8}, + {__LINE__, 0xcbe95b78, (const uint8_t *)"_@:_).&(#.[:[{[:)$++-($_;@[)}+", 30, 0xf58662c8}, + {__LINE__, 0x4ef8a54b, (const uint8_t *)"&[!,[$_==}+.]@!;*(+},[;:)$;)-@", 30, 0x1f65ac54}, + {__LINE__, 0x76ad267a, (const uint8_t *)"]{.[.+?+[[=;[?}_#&;[=)__$$:+=_", 30, 0x7b792e8e}, + {__LINE__, 0x569e613c, (const uint8_t *)"-%.)=/[@].:.(:,()$;=%@-$?]{%+%", 30, 0x1d61679c}, + {__LINE__, 0x36aa61da, (const uint8_t *)"+]#$(@&.=:,*];/.!]%/{:){:@(;)$", 30, 0x12ec687c}, + {__LINE__, 0xf67222df, (const uint8_t *)")-._.:?[&:.=+}(*$/=!.${;(=$@!}", 30, 0x740329a9}, + {__LINE__, 0x74b34fd3, (const uint8_t *)":(_*&%/[[}+,?#$&*+#[([*-/#;%(]", 30, 0x374c5652}, + {__LINE__, 0x351fd770, (const uint8_t *)"{[#-;:$/{)(+[}#]/{&!%(@)%:@-$:", 30, 0xeadfde7e}, + {__LINE__, 0xc45aef77, (const uint8_t *)"_{$*,}(&,@.)):=!/%(&(,,-?$}}}!", 30, 0x3fcbf664}, + {__LINE__, 0xd034ea71, (const uint8_t *)"e$98KNzqaV)Y:2X?]77].{gKRD4G5{mHZk,Z)SpU%L3FSgv!Wb8MLAFdi{+fp)c,@8m6v)yXg@]HBDFk?.4&}g5_udE*JHCiH=aL", 100, 0x6b080911}, + {__LINE__, 0xdeadc0de, (const uint8_t *)"r*Fd}ef+5RJQ;+W=4jTR9)R*p!B;]Ed7tkrLi;88U7g@3v!5pk2X6D)vt,.@N8c]@yyEcKi[vwUu@.Ppm@C6%Mv*3Nw}Y,58_aH)", 100, 0x355fdf73}, + {__LINE__, 0xba5eba11, (const uint8_t *)"h{bcmdC+a;t+Cf{6Y_dFq-{X4Yu&7uNfVDh?q&_u.UWJU],-GiH7ADzb7-V.Q%4=+v!$L9W+T=bP]$_:]Vyg}A.ygD.r;h-D]m%&", 100, 0xb48bd8d8}, + {__LINE__, 0x7712aa45, (const uint8_t *)long_string, 5552, 0x7dc51be2}, +}; + +static const int test_size = sizeof(tests) / sizeof(tests[0]); + +int main(void) { + int i; + for (i = 0; i < test_size; i++) { + test_adler32(tests[i].adler, tests[i].buf, tests[i].len, tests[i].expect, tests[i].line); + } + + return 0; +} diff --git a/libs/zlibng/test/data/fireworks.jpg b/libs/zlibng/test/data/fireworks.jpg new file mode 100644 index 000000000..078cf1755 Binary files /dev/null and b/libs/zlibng/test/data/fireworks.jpg differ diff --git a/libs/zlibng/test/data/lcet10.txt b/libs/zlibng/test/data/lcet10.txt new file mode 100644 index 000000000..26b187d04 --- /dev/null +++ b/libs/zlibng/test/data/lcet10.txt @@ -0,0 +1,7519 @@ + + +The Project Gutenberg Etext of LOC WORKSHOP ON ELECTRONIC TEXTS + + + + + WORKSHOP ON ELECTRONIC TEXTS + + PROCEEDINGS + + + + Edited by James Daly + + + + + + + + 9-10 June 1992 + + + Library of Congress + Washington, D.C. + + + + Supported by a Grant from the David and Lucile Packard Foundation + + + *** *** *** ****** *** *** *** + + + TABLE OF CONTENTS + + +Acknowledgements + +Introduction + +Proceedings + Welcome + Prosser Gifford and Carl Fleischhauer + + Session I. Content in a New Form: Who Will Use It and What Will They Do? + James Daly (Moderator) + Avra Michelson, Overview + Susan H. Veccia, User Evaluation + Joanne Freeman, Beyond the Scholar + Discussion + + Session II. Show and Tell + Jacqueline Hess (Moderator) + Elli Mylonas, Perseus Project + Discussion + Eric M. Calaluca, Patrologia Latina Database + Carl Fleischhauer and Ricky Erway, American Memory + Discussion + Dorothy Twohig, The Papers of George Washington + Discussion + Maria L. Lebron, The Online Journal of Current Clinical Trials + Discussion + Lynne K. Personius, Cornell mathematics books + Discussion + + Session III. Distribution, Networks, and Networking: + Options for Dissemination + Robert G. Zich (Moderator) + Clifford A. Lynch + Discussion + Howard Besser + Discussion + Ronald L. Larsen + Edwin B. Brownrigg + Discussion + + Session IV. Image Capture, Text Capture, Overview of Text and + Image Storage Formats + William L. Hooton (Moderator) + A) Principal Methods for Image Capture of Text: + direct scanning, use of microform + Anne R. Kenney + Pamela Q.J. Andre + Judith A. Zidar + Donald J. Waters + Discussion + B) Special Problems: bound volumes, conservation, + reproducing printed halftones + George Thoma + Carl Fleischhauer + Discussion + C) Image Standards and Implications for Preservation + Jean Baronas + Patricia Battin + Discussion + D) Text Conversion: OCR vs. rekeying, standards of accuracy + and use of imperfect texts, service bureaus + Michael Lesk + Ricky Erway + Judith A. Zidar + Discussion + + Session V. Approaches to Preparing Electronic Texts + Susan Hockey (Moderator) + Stuart Weibel + Discussion + C.M. Sperberg-McQueen + Discussion + Eric M. Calaluca + Discussion + + Session VI. Copyright Issues + Marybeth Peters + + Session VII. Conclusion + Prosser Gifford (Moderator) + General discussion + +Appendix I: Program + +Appendix II: Abstracts + +Appendix III: Directory of Participants + + + *** *** *** ****** *** *** *** + + + Acknowledgements + +I would like to thank Carl Fleischhauer and Prosser Gifford for the +opportunity to learn about areas of human activity unknown to me a scant +ten months ago, and the David and Lucile Packard Foundation for +supporting that opportunity. The help given by others is acknowledged on +a separate page. + + 19 October 1992 + + + *** *** *** ****** *** *** *** + + + INTRODUCTION + +The Workshop on Electronic Texts (1) drew together representatives of +various projects and interest groups to compare ideas, beliefs, +experiences, and, in particular, methods of placing and presenting +historical textual materials in computerized form. Most attendees gained +much in insight and outlook from the event. But the assembly did not +form a new nation, or, to put it another way, the diversity of projects +and interests was too great to draw the representatives into a cohesive, +action-oriented body.(2) + +Everyone attending the Workshop shared an interest in preserving and +providing access to historical texts. But within this broad field the +attendees represented a variety of formal, informal, figurative, and +literal groups, with many individuals belonging to more than one. These +groups may be defined roughly according to the following topics or +activities: + +* Imaging +* Searchable coded texts +* National and international computer networks +* CD-ROM production and dissemination +* Methods and technology for converting older paper materials into +electronic form +* Study of the use of digital materials by scholars and others + +This summary is arranged thematically and does not follow the actual +sequence of presentations. + +NOTES: + (1) In this document, the phrase electronic text is used to mean + any computerized reproduction or version of a document, book, + article, or manuscript (including images), and not merely a machine- + readable or machine-searchable text. + + (2) The Workshop was held at the Library of Congress on 9-10 June + 1992, with funding from the David and Lucile Packard Foundation. + The document that follows represents a summary of the presentations + made at the Workshop and was compiled by James DALY. This + introduction was written by DALY and Carl FLEISCHHAUER. + + +PRESERVATION AND IMAGING + +Preservation, as that term is used by archivists,(3) was most explicitly +discussed in the context of imaging. Anne KENNEY and Lynne PERSONIUS +explained how the concept of a faithful copy and the user-friendliness of +the traditional book have guided their project at Cornell University.(4) +Although interested in computerized dissemination, participants in the +Cornell project are creating digital image sets of older books in the +public domain as a source for a fresh paper facsimile or, in a future +phase, microfilm. The books returned to the library shelves are +high-quality and useful replacements on acid-free paper that should last +a long time. To date, the Cornell project has placed little or no +emphasis on creating searchable texts; one would not be surprised to find +that the project participants view such texts as new editions, and thus +not as faithful reproductions. + +In her talk on preservation, Patricia BATTIN struck an ecumenical and +flexible note as she endorsed the creation and dissemination of a variety +of types of digital copies. Do not be too narrow in defining what counts +as a preservation element, BATTIN counseled; for the present, at least, +digital copies made with preservation in mind cannot be as narrowly +standardized as, say, microfilm copies with the same objective. Setting +standards precipitously can inhibit creativity, but delay can result in +chaos, she advised. + +In part, BATTIN's position reflected the unsettled nature of image-format +standards, and attendees could hear echoes of this unsettledness in the +comments of various speakers. For example, Jean BARONAS reviewed the +status of several formal standards moving through committees of experts; +and Clifford LYNCH encouraged the use of a new guideline for transmitting +document images on Internet. Testimony from participants in the National +Agricultural Library's (NAL) Text Digitization Program and LC's American +Memory project highlighted some of the challenges to the actual creation +or interchange of images, including difficulties in converting +preservation microfilm to digital form. Donald WATERS reported on the +progress of a master plan for a project at Yale University to convert +books on microfilm to digital image sets, Project Open Book (POB). + +The Workshop offered rather less of an imaging practicum than planned, +but "how-to" hints emerge at various points, for example, throughout +KENNEY's presentation and in the discussion of arcana such as +thresholding and dithering offered by George THOMA and FLEISCHHAUER. + +NOTES: + (3) Although there is a sense in which any reproductions of + historical materials preserve the human record, specialists in the + field have developed particular guidelines for the creation of + acceptable preservation copies. + + (4) Titles and affiliations of presenters are given at the + beginning of their respective talks and in the Directory of + Participants (Appendix III). + + +THE MACHINE-READABLE TEXT: MARKUP AND USE + +The sections of the Workshop that dealt with machine-readable text tended +to be more concerned with access and use than with preservation, at least +in the narrow technical sense. Michael SPERBERG-McQUEEN made a forceful +presentation on the Text Encoding Initiative's (TEI) implementation of +the Standard Generalized Markup Language (SGML). His ideas were echoed +by Susan HOCKEY, Elli MYLONAS, and Stuart WEIBEL. While the +presentations made by the TEI advocates contained no practicum, their +discussion focused on the value of the finished product, what the +European Community calls reusability, but what may also be termed +durability. They argued that marking up--that is, coding--a text in a +well-conceived way will permit it to be moved from one computer +environment to another, as well as to be used by various users. Two +kinds of markup were distinguished: 1) procedural markup, which +describes the features of a text (e.g., dots on a page), and 2) +descriptive markup, which describes the structure or elements of a +document (e.g., chapters, paragraphs, and front matter). + +The TEI proponents emphasized the importance of texts to scholarship. +They explained how heavily coded (and thus analyzed and annotated) texts +can underlie research, play a role in scholarly communication, and +facilitate classroom teaching. SPERBERG-McQUEEN reminded listeners that +a written or printed item (e.g., a particular edition of a book) is +merely a representation of the abstraction we call a text. To concern +ourselves with faithfully reproducing a printed instance of the text, +SPERBERG-McQUEEN argued, is to concern ourselves with the representation +of a representation ("images as simulacra for the text"). The TEI proponents' +interest in images tends to focus on corollary materials for use in teaching, +for example, photographs of the Acropolis to accompany a Greek text. + +By the end of the Workshop, SPERBERG-McQUEEN confessed to having been +converted to a limited extent to the view that electronic images +constitute a promising alternative to microfilming; indeed, an +alternative probably superior to microfilming. But he was not convinced +that electronic images constitute a serious attempt to represent text in +electronic form. HOCKEY and MYLONAS also conceded that their experience +at the Pierce Symposium the previous week at Georgetown University and +the present conference at the Library of Congress had compelled them to +reevaluate their perspective on the usefulness of text as images. +Attendees could see that the text and image advocates were in +constructive tension, so to say. + +Three nonTEI presentations described approaches to preparing +machine-readable text that are less rigorous and thus less expensive. In +the case of the Papers of George Washington, Dorothy TWOHIG explained +that the digital version will provide a not-quite-perfect rendering of +the transcribed text--some 135,000 documents, available for research +during the decades while the perfect or print version is completed. +Members of the American Memory team and the staff of NAL's Text +Digitization Program (see below) also outlined a middle ground concerning +searchable texts. In the case of American Memory, contractors produce +texts with about 99-percent accuracy that serve as "browse" or +"reference" versions of written or printed originals. End users who need +faithful copies or perfect renditions must refer to accompanying sets of +digital facsimile images or consult copies of the originals in a nearby +library or archive. American Memory staff argued that the high cost of +producing 100-percent accurate copies would prevent LC from offering +access to large parts of its collections. + + +THE MACHINE-READABLE TEXT: METHODS OF CONVERSION + +Although the Workshop did not include a systematic examination of the +methods for converting texts from paper (or from facsimile images) into +machine-readable form, nevertheless, various speakers touched upon this +matter. For example, WEIBEL reported that OCLC has experimented with a +merging of multiple optical character recognition systems that will +reduce errors from an unacceptable rate of 5 characters out of every +l,000 to an unacceptable rate of 2 characters out of every l,000. + +Pamela ANDRE presented an overview of NAL's Text Digitization Program and +Judith ZIDAR discussed the technical details. ZIDAR explained how NAL +purchased hardware and software capable of performing optical character +recognition (OCR) and text conversion and used its own staff to convert +texts. The process, ZIDAR said, required extensive editing and project +staff found themselves considering alternatives, including rekeying +and/or creating abstracts or summaries of texts. NAL reckoned costs at +$7 per page. By way of contrast, Ricky ERWAY explained that American +Memory had decided from the start to contract out conversion to external +service bureaus. The criteria used to select these contractors were cost +and quality of results, as opposed to methods of conversion. ERWAY noted +that historical documents or books often do not lend themselves to OCR. +Bound materials represent a special problem. In her experience, quality +control--inspecting incoming materials, counting errors in samples--posed +the most time-consuming aspect of contracting out conversion. ERWAY +reckoned American Memory's costs at $4 per page, but cautioned that fewer +cost-elements had been included than in NAL's figure. + + +OPTIONS FOR DISSEMINATION + +The topic of dissemination proper emerged at various points during the +Workshop. At the session devoted to national and international computer +networks, LYNCH, Howard BESSER, Ronald LARSEN, and Edwin BROWNRIGG +highlighted the virtues of Internet today and of the network that will +evolve from Internet. Listeners could discern in these narratives a +vision of an information democracy in which millions of citizens freely +find and use what they need. LYNCH noted that a lack of standards +inhibits disseminating multimedia on the network, a topic also discussed +by BESSER. LARSEN addressed the issues of network scalability and +modularity and commented upon the difficulty of anticipating the effects +of growth in orders of magnitude. BROWNRIGG talked about the ability of +packet radio to provide certain links in a network without the need for +wiring. However, the presenters also called attention to the +shortcomings and incongruities of present-day computer networks. For +example: 1) Network use is growing dramatically, but much network +traffic consists of personal communication (E-mail). 2) Large bodies of +information are available, but a user's ability to search across their +entirety is limited. 3) There are significant resources for science and +technology, but few network sources provide content in the humanities. +4) Machine-readable texts are commonplace, but the capability of the +system to deal with images (let alone other media formats) lags behind. +A glimpse of a multimedia future for networks, however, was provided by +Maria LEBRON in her overview of the Online Journal of Current Clinical +Trials (OJCCT), and the process of scholarly publishing on-line. + +The contrasting form of the CD-ROM disk was never systematically +analyzed, but attendees could glean an impression from several of the +show-and-tell presentations. The Perseus and American Memory examples +demonstrated recently published disks, while the descriptions of the +IBYCUS version of the Papers of George Washington and Chadwyck-Healey's +Patrologia Latina Database (PLD) told of disks to come. According to +Eric CALALUCA, PLD's principal focus has been on converting Jacques-Paul +Migne's definitive collection of Latin texts to machine-readable form. +Although everyone could share the network advocates' enthusiasm for an +on-line future, the possibility of rolling up one's sleeves for a session +with a CD-ROM containing both textual materials and a powerful retrieval +engine made the disk seem an appealing vessel indeed. The overall +discussion suggested that the transition from CD-ROM to on-line networked +access may prove far slower and more difficult than has been anticipated. + + +WHO ARE THE USERS AND WHAT DO THEY DO? + +Although concerned with the technicalities of production, the Workshop +never lost sight of the purposes and uses of electronic versions of +textual materials. As noted above, those interested in imaging discussed +the problematical matter of digital preservation, while the TEI proponents +described how machine-readable texts can be used in research. This latter +topic received thorough treatment in the paper read by Avra MICHELSON. +She placed the phenomenon of electronic texts within the context of +broader trends in information technology and scholarly communication. + +Among other things, MICHELSON described on-line conferences that +represent a vigorous and important intellectual forum for certain +disciplines. Internet now carries more than 700 conferences, with about +80 percent of these devoted to topics in the social sciences and the +humanities. Other scholars use on-line networks for "distance learning." +Meanwhile, there has been a tremendous growth in end-user computing; +professors today are less likely than their predecessors to ask the +campus computer center to process their data. Electronic texts are one +key to these sophisticated applications, MICHELSON reported, and more and +more scholars in the humanities now work in an on-line environment. +Toward the end of the Workshop, Michael LESK presented a corollary to +MICHELSON's talk, reporting the results of an experiment that compared +the work of one group of chemistry students using traditional printed +texts and two groups using electronic sources. The experiment +demonstrated that in the event one does not know what to read, one needs +the electronic systems; the electronic systems hold no advantage at the +moment if one knows what to read, but neither do they impose a penalty. + +DALY provided an anecdotal account of the revolutionizing impact of the +new technology on his previous methods of research in the field of classics. +His account, by extrapolation, served to illustrate in part the arguments +made by MICHELSON concerning the positive effects of the sudden and radical +transformation being wrought in the ways scholars work. + +Susan VECCIA and Joanne FREEMAN delineated the use of electronic +materials outside the university. The most interesting aspect of their +use, FREEMAN said, could be seen as a paradox: teachers in elementary +and secondary schools requested access to primary source materials but, +at the same time, found that "primariness" itself made these materials +difficult for their students to use. + + +OTHER TOPICS + +Marybeth PETERS reviewed copyright law in the United States and offered +advice during a lively discussion of this subject. But uncertainty +remains concerning the price of copyright in a digital medium, because a +solution remains to be worked out concerning management and synthesis of +copyrighted and out-of-copyright pieces of a database. + +As moderator of the final session of the Workshop, Prosser GIFFORD directed +discussion to future courses of action and the potential role of LC in +advancing them. Among the recommendations that emerged were the following: + + * Workshop participants should 1) begin to think about working + with image material, but structure and digitize it in such a + way that at a later stage it can be interpreted into text, and + 2) find a common way to build text and images together so that + they can be used jointly at some stage in the future, with + appropriate network support, because that is how users will want + to access these materials. The Library might encourage attempts + to bring together people who are working on texts and images. + + * A network version of American Memory should be developed or + consideration should be given to making the data in it + available to people interested in doing network multimedia. + Given the current dearth of digital data that is appealing and + unencumbered by extremely complex rights problems, developing a + network version of American Memory could do much to help make + network multimedia a reality. + + * Concerning the thorny issue of electronic deposit, LC should + initiate a catalytic process in terms of distributed + responsibility, that is, bring together the distributed + organizations and set up a study group to look at all the + issues related to electronic deposit and see where we as a + nation should move. For example, LC might attempt to persuade + one major library in each state to deal with its state + equivalent publisher, which might produce a cooperative project + that would be equitably distributed around the country, and one + in which LC would be dealing with a minimal number of publishers + and minimal copyright problems. LC must also deal with the + concept of on-line publishing, determining, among other things, + how serials such as OJCCT might be deposited for copyright. + + * Since a number of projects are planning to carry out + preservation by creating digital images that will end up in + on-line or near-line storage at some institution, LC might play + a helpful role, at least in the near term, by accelerating how + to catalog that information into the Research Library Information + Network (RLIN) and then into OCLC, so that it would be accessible. + This would reduce the possibility of multiple institutions digitizing + the same work. + + +CONCLUSION + +The Workshop was valuable because it brought together partisans from +various groups and provided an occasion to compare goals and methods. +The more committed partisans frequently communicate with others in their +groups, but less often across group boundaries. The Workshop was also +valuable to attendees--including those involved with American Memory--who +came less committed to particular approaches or concepts. These +attendees learned a great deal, and plan to select and employ elements of +imaging, text-coding, and networked distribution that suit their +respective projects and purposes. + +Still, reality rears its ugly head: no breakthrough has been achieved. +On the imaging side, one confronts a proliferation of competing +data-interchange standards and a lack of consensus on the role of digital +facsimiles in preservation. In the realm of machine-readable texts, one +encounters a reasonably mature standard but methodological difficulties +and high costs. These latter problems, of course, represent a special +impediment to the desire, as it is sometimes expressed in the popular +press, "to put the [contents of the] Library of Congress on line." In +the words of one participant, there was "no solution to the economic +problems--the projects that are out there are surviving, but it is going +to be a lot of work to transform the information industry, and so far the +investment to do that is not forthcoming" (LESK, per litteras). + + + *** *** *** ****** *** *** *** + + + PROCEEDINGS + + +WELCOME + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +GIFFORD * Origin of Workshop in current Librarian's desire to make LC's +collections more widely available * Desiderata arising from the prospect +of greater interconnectedness * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +After welcoming participants on behalf of the Library of Congress, +American Memory (AM), and the National Demonstration Lab, Prosser +GIFFORD, director for scholarly programs, Library of Congress, located +the origin of the Workshop on Electronic Texts in a conversation he had +had considerably more than a year ago with Carl FLEISCHHAUER concerning +some of the issues faced by AM. On the assumption that numerous other +people were asking the same questions, the decision was made to bring +together as many of these people as possible to ask the same questions +together. In a deeper sense, GIFFORD said, the origin of the Workshop +lay in the desire of the current Librarian of Congress, James H. +Billington, to make the collections of the Library, especially those +offering unique or unusual testimony on aspects of the American +experience, available to a much wider circle of users than those few +people who can come to Washington to use them. This meant that the +emphasis of AM, from the outset, has been on archival collections of the +basic material, and on making these collections themselves available, +rather than selected or heavily edited products. + +From AM's emphasis followed the questions with which the Workshop began: +who will use these materials, and in what form will they wish to use +them. But an even larger issue deserving mention, in GIFFORD's view, was +the phenomenal growth in Internet connectivity. He expressed the hope +that the prospect of greater interconnectedness than ever before would +lead to: 1) much more cooperative and mutually supportive endeavors; 2) +development of systems of shared and distributed responsibilities to +avoid duplication and to ensure accuracy and preservation of unique +materials; and 3) agreement on the necessary standards and development of +the appropriate directories and indices to make navigation +straightforward among the varied resources that are, and increasingly +will be, available. In this connection, GIFFORD requested that +participants reflect from the outset upon the sorts of outcomes they +thought the Workshop might have. Did those present constitute a group +with sufficient common interests to propose a next step or next steps, +and if so, what might those be? They would return to these questions the +following afternoon. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +FLEISCHHAUER * Core of Workshop concerns preparation and production of +materials * Special challenge in conversion of textual materials * +Quality versus quantity * Do the several groups represented share common +interests? * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Carl FLEISCHHAUER, coordinator, American Memory, Library of Congress, +emphasized that he would attempt to represent the people who perform some +of the work of converting or preparing materials and that the core of +the Workshop had to do with preparation and production. FLEISCHHAUER +then drew a distinction between the long term, when many things would be +available and connected in the ways that GIFFORD described, and the short +term, in which AM not only has wrestled with the issue of what is the +best course to pursue but also has faced a variety of technical +challenges. + +FLEISCHHAUER remarked AM's endeavors to deal with a wide range of library +formats, such as motion picture collections, sound-recording collections, +and pictorial collections of various sorts, especially collections of +photographs. In the course of these efforts, AM kept coming back to +textual materials--manuscripts or rare printed matter, bound materials, +etc. Text posed the greatest conversion challenge of all. Thus, the +genesis of the Workshop, which reflects the problems faced by AM. These +problems include physical problems. For example, those in the library +and archive business deal with collections made up of fragile and rare +manuscript items, bound materials, especially the notoriously brittle +bound materials of the late nineteenth century. These are precious +cultural artifacts, however, as well as interesting sources of +information, and LC desires to retain and conserve them. AM needs to +handle things without damaging them. Guillotining a book to run it +through a sheet feeder must be avoided at all costs. + +Beyond physical problems, issues pertaining to quality arose. For +example, the desire to provide users with a searchable text is affected +by the question of acceptable level of accuracy. One hundred percent +accuracy is tremendously expensive. On the other hand, the output of +optical character recognition (OCR) can be tremendously inaccurate. +Although AM has attempted to find a middle ground, uncertainty persists +as to whether or not it has discovered the right solution. + +Questions of quality arose concerning images as well. FLEISCHHAUER +contrasted the extremely high level of quality of the digital images in +the Cornell Xerox Project with AM's efforts to provide a browse-quality +or access-quality image, as opposed to an archival or preservation image. +FLEISCHHAUER therefore welcomed the opportunity to compare notes. + +FLEISCHHAUER observed in passing that conversations he had had about +networks have begun to signal that for various forms of media a +determination may be made that there is a browse-quality item, or a +distribution-and-access-quality item that may coexist in some systems +with a higher quality archival item that would be inconvenient to send +through the network because of its size. FLEISCHHAUER referred, of +course, to images more than to searchable text. + +As AM considered those questions, several conceptual issues arose: ought +AM occasionally to reproduce materials entirely through an image set, at +other times, entirely through a text set, and in some cases, a mix? +There probably would be times when the historical authenticity of an +artifact would require that its image be used. An image might be +desirable as a recourse for users if one could not provide 100-percent +accurate text. Again, AM wondered, as a practical matter, if a +distinction could be drawn between rare printed matter that might exist +in multiple collections--that is, in ten or fifteen libraries. In such +cases, the need for perfect reproduction would be less than for unique +items. Implicit in his remarks, FLEISCHHAUER conceded, was the admission +that AM has been tilting strongly towards quantity and drawing back a +little from perfect quality. That is, it seemed to AM that society would +be better served if more things were distributed by LC--even if they were +not quite perfect--than if fewer things, perfectly represented, were +distributed. This was stated as a proposition to be tested, with +responses to be gathered from users. + +In thinking about issues related to reproduction of materials and seeing +other people engaged in parallel activities, AM deemed it useful to +convene a conference. Hence, the Workshop. FLEISCHHAUER thereupon +surveyed the several groups represented: 1) the world of images (image +users and image makers); 2) the world of text and scholarship and, within +this group, those concerned with language--FLEISCHHAUER confessed to finding +delightful irony in the fact that some of the most advanced thinkers on +computerized texts are those dealing with ancient Greek and Roman materials; +3) the network world; and 4) the general world of library science, which +includes people interested in preservation and cataloging. + +FLEISCHHAUER concluded his remarks with special thanks to the David and +Lucile Packard Foundation for its support of the meeting, the American +Memory group, the Office for Scholarly Programs, the National +Demonstration Lab, and the Office of Special Events. He expressed the +hope that David Woodley Packard might be able to attend, noting that +Packard's work and the work of the foundation had sponsored a number of +projects in the text area. + + ****** + +SESSION I. CONTENT IN A NEW FORM: WHO WILL USE IT AND WHAT WILL THEY DO? + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DALY * Acknowledgements * A new Latin authors disk * Effects of the new +technology on previous methods of research * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Serving as moderator, James DALY acknowledged the generosity of all the +presenters for giving of their time, counsel, and patience in planning +the Workshop, as well as of members of the American Memory project and +other Library of Congress staff, and the David and Lucile Packard +Foundation and its executive director, Colburn S. Wilbur. + +DALY then recounted his visit in March to the Center for Electronic Texts +in the Humanities (CETH) and the Department of Classics at Rutgers +University, where an old friend, Lowell Edmunds, introduced him to the +department's IBYCUS scholarly personal computer, and, in particular, the +new Latin CD-ROM, containing, among other things, almost all classical +Latin literary texts through A.D. 200. Packard Humanities Institute +(PHI), Los Altos, California, released this disk late in 1991, with a +nominal triennial licensing fee. + +Playing with the disk for an hour or so at Rutgers brought home to DALY +at once the revolutionizing impact of the new technology on his previous +methods of research. Had this disk been available two or three years +earlier, DALY contended, when he was engaged in preparing a commentary on +Book 10 of Virgil's Aeneid for Cambridge University Press, he would not +have required a forty-eight-square-foot table on which to spread the +numerous, most frequently consulted items, including some ten or twelve +concordances to key Latin authors, an almost equal number of lexica to +authors who lacked concordances, and where either lexica or concordances +were lacking, numerous editions of authors antedating and postdating Virgil. + +Nor, when checking each of the average six to seven words contained in +the Virgilian hexameter for its usage elsewhere in Virgil's works or +other Latin authors, would DALY have had to maintain the laborious +mechanical process of flipping through these concordances, lexica, and +editions each time. Nor would he have had to frequent as often the +Milton S. Eisenhower Library at the Johns Hopkins University to consult +the Thesaurus Linguae Latinae. Instead of devoting countless hours, or +the bulk of his research time, to gathering data concerning Virgil's use +of words, DALY--now freed by PHI's Latin authors disk from the +tyrannical, yet in some ways paradoxically happy scholarly drudgery-- +would have been able to devote that same bulk of time to analyzing and +interpreting Virgilian verbal usage. + +Citing Theodore Brunner, Gregory Crane, Elli MYLONAS, and Avra MICHELSON, +DALY argued that this reversal in his style of work, made possible by the +new technology, would perhaps have resulted in better, more productive +research. Indeed, even in the course of his browsing the Latin authors +disk at Rutgers, its powerful search, retrieval, and highlighting +capabilities suggested to him several new avenues of research into +Virgil's use of sound effects. This anecdotal account, DALY maintained, +may serve to illustrate in part the sudden and radical transformation +being wrought in the ways scholars work. + + ****** + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +MICHELSON * Elements related to scholarship and technology * Electronic +texts within the context of broader trends within information technology +and scholarly communication * Evaluation of the prospects for the use of +electronic texts * Relationship of electronic texts to processes of +scholarly communication in humanities research * New exchange formats +created by scholars * Projects initiated to increase scholarly access to +converted text * Trend toward making electronic resources available +through research and education networks * Changes taking place in +scholarly communication among humanities scholars * Network-mediated +scholarship transforming traditional scholarly practices * Key +information technology trends affecting the conduct of scholarly +communication over the next decade * The trend toward end-user computing +* The trend toward greater connectivity * Effects of these trends * Key +transformations taking place * Summary of principal arguments * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Avra MICHELSON, Archival Research and Evaluation Staff, National Archives +and Records Administration (NARA), argued that establishing who will use +electronic texts and what they will use them for involves a consideration +of both information technology and scholarship trends. This +consideration includes several elements related to scholarship and +technology: 1) the key trends in information technology that are most +relevant to scholarship; 2) the key trends in the use of currently +available technology by scholars in the nonscientific community; and 3) +the relationship between these two very distinct but interrelated trends. +The investment in understanding this relationship being made by +information providers, technologists, and public policy developers, as +well as by scholars themselves, seems to be pervasive and growing, +MICHELSON contended. She drew on collaborative work with Jeff Rothenberg +on the scholarly use of technology. + +MICHELSON sought to place the phenomenon of electronic texts within the +context of broader trends within information technology and scholarly +communication. She argued that electronic texts are of most use to +researchers to the extent that the researchers' working context (i.e., +their relevant bibliographic sources, collegial feedback, analytic tools, +notes, drafts, etc.), along with their field's primary and secondary +sources, also is accessible in electronic form and can be integrated in +ways that are unique to the on-line environment. + +Evaluation of the prospects for the use of electronic texts includes two +elements: 1) an examination of the ways in which researchers currently +are using electronic texts along with other electronic resources, and 2) +an analysis of key information technology trends that are affecting the +long-term conduct of scholarly communication. MICHELSON limited her +discussion of the use of electronic texts to the practices of humanists +and noted that the scientific community was outside the panel's overview. + +MICHELSON examined the nature of the current relationship of electronic +texts in particular, and electronic resources in general, to what she +maintained were, essentially, five processes of scholarly communication +in humanities research. Researchers 1) identify sources, 2) communicate +with their colleagues, 3) interpret and analyze data, 4) disseminate +their research findings, and 5) prepare curricula to instruct the next +generation of scholars and students. This examination would produce a +clearer understanding of the synergy among these five processes that +fuels the tendency of the use of electronic resources for one process to +stimulate its use for other processes of scholarly communication. + +For the first process of scholarly communication, the identification of +sources, MICHELSON remarked the opportunity scholars now enjoy to +supplement traditional word-of-mouth searches for sources among their +colleagues with new forms of electronic searching. So, for example, +instead of having to visit the library, researchers are able to explore +descriptions of holdings in their offices. Furthermore, if their own +institutions' holdings prove insufficient, scholars can access more than +200 major American library catalogues over Internet, including the +universities of California, Michigan, Pennsylvania, and Wisconsin. +Direct access to the bibliographic databases offers intellectual +empowerment to scholars by presenting a comprehensive means of browsing +through libraries from their homes and offices at their convenience. + +The second process of communication involves communication among +scholars. Beyond the most common methods of communication, scholars are +using E-mail and a variety of new electronic communications formats +derived from it for further academic interchange. E-mail exchanges are +growing at an astonishing rate, reportedly 15 percent a month. They +currently constitute approximately half the traffic on research and +education networks. Moreover, the global spread of E-mail has been so +rapid that it is now possible for American scholars to use it to +communicate with colleagues in close to 140 other countries. + +Other new exchange formats created by scholars and operating on Internet +include more than 700 conferences, with about 80 percent of these devoted +to topics in the social sciences and humanities. The rate of growth of +these scholarly electronic conferences also is astonishing. From l990 to +l991, 200 new conferences were identified on Internet. From October 1991 +to June 1992, an additional 150 conferences in the social sciences and +humanities were added to this directory of listings. Scholars have +established conferences in virtually every field, within every different +discipline. For example, there are currently close to 600 active social +science and humanities conferences on topics such as art and +architecture, ethnomusicology, folklore, Japanese culture, medical +education, and gifted and talented education. The appeal to scholars of +communicating through these conferences is that, unlike any other medium, +electronic conferences today provide a forum for global communication +with peers at the front end of the research process. + +Interpretation and analysis of sources constitutes the third process of +scholarly communication that MICHELSON discussed in terms of texts and +textual resources. The methods used to analyze sources fall somewhere on +a continuum from quantitative analysis to qualitative analysis. +Typically, evidence is culled and evaluated using methods drawn from both +ends of this continuum. At one end, quantitative analysis involves the +use of mathematical processes such as a count of frequencies and +distributions of occurrences or, on a higher level, regression analysis. +At the other end of the continuum, qualitative analysis typically +involves nonmathematical processes oriented toward language +interpretation or the building of theory. Aspects of this work involve +the processing--either manual or computational--of large and sometimes +massive amounts of textual sources, although the use of nontextual +sources as evidence, such as photographs, sound recordings, film footage, +and artifacts, is significant as well. + +Scholars have discovered that many of the methods of interpretation and +analysis that are related to both quantitative and qualitative methods +are processes that can be performed by computers. For example, computers +can count. They can count brush strokes used in a Rembrandt painting or +perform regression analysis for understanding cause and effect. By means +of advanced technologies, computers can recognize patterns, analyze text, +and model concepts. Furthermore, computers can complete these processes +faster with more sources and with greater precision than scholars who +must rely on manual interpretation of data. But if scholars are to use +computers for these processes, source materials must be in a form +amenable to computer-assisted analysis. For this reason many scholars, +once they have identified the sources that are key to their research, are +converting them to machine-readable form. Thus, a representative example +of the numerous textual conversion projects organized by scholars around +the world in recent years to support computational text analysis is the +TLG, the Thesaurus Linguae Graecae. This project is devoted to +converting the extant ancient texts of classical Greece. (Editor's note: +according to the TLG Newsletter of May l992, TLG was in use in thirty-two +different countries. This figure updates MICHELSON's previous count by one.) + +The scholars performing these conversions have been asked to recognize +that the electronic sources they are converting for one use possess value +for other research purposes as well. As a result, during the past few +years, humanities scholars have initiated a number of projects to +increase scholarly access to converted text. So, for example, the Text +Encoding Initiative (TEI), about which more is said later in the program, +was established as an effort by scholars to determine standard elements +and methods for encoding machine-readable text for electronic exchange. +In a second effort to facilitate the sharing of converted text, scholars +have created a new institution, the Center for Electronic Texts in the +Humanities (CETH). The center estimates that there are 8,000 series of +source texts in the humanities that have been converted to +machine-readable form worldwide. CETH is undertaking an international +search for converted text in the humanities, compiling it into an +electronic library, and preparing bibliographic descriptions of the +sources for the Research Libraries Information Network's (RLIN) +machine-readable data file. The library profession has begun to initiate +large conversion projects as well, such as American Memory. + +While scholars have been making converted text available to one another, +typically on disk or on CD-ROM, the clear trend is toward making these +resources available through research and education networks. Thus, the +American and French Research on the Treasury of the French Language +(ARTFL) and the Dante Project are already available on Internet. +MICHELSON summarized this section on interpretation and analysis by +noting that: 1) increasing numbers of humanities scholars in the library +community are recognizing the importance to the advancement of +scholarship of retrospective conversion of source materials in the arts +and humanities; and 2) there is a growing realization that making the +sources available on research and education networks maximizes their +usefulness for the analysis performed by humanities scholars. + +The fourth process of scholarly communication is dissemination of +research findings, that is, publication. Scholars are using existing +research and education networks to engineer a new type of publication: +scholarly-controlled journals that are electronically produced and +disseminated. Although such journals are still emerging as a +communication format, their number has grown, from approximately twelve +to thirty-six during the past year (July 1991 to June 1992). Most of +these electronic scholarly journals are devoted to topics in the +humanities. As with network conferences, scholarly enthusiasm for these +electronic journals stems from the medium's unique ability to advance +scholarship in a way that no other medium can do by supporting global +feedback and interchange, practically in real time, early in the research +process. Beyond scholarly journals, MICHELSON remarked the delivery of +commercial full-text products, such as articles in professional journals, +newsletters, magazines, wire services, and reference sources. These are +being delivered via on-line local library catalogues, especially through +CD-ROMs. Furthermore, according to MICHELSON, there is general optimism +that the copyright and fees issues impeding the delivery of full text on +existing research and education networks soon will be resolved. + +The final process of scholarly communication is curriculum development +and instruction, and this involves the use of computer information +technologies in two areas. The first is the development of +computer-oriented instructional tools, which includes simulations, +multimedia applications, and computer tools that are used to assist in +the analysis of sources in the classroom, etc. The Perseus Project, a +database that provides a multimedia curriculum on classical Greek +civilization, is a good example of the way in which entire curricula are +being recast using information technologies. It is anticipated that the +current difficulty in exchanging electronically computer-based +instructional software, which in turn makes it difficult for one scholar +to build upon the work of others, will be resolved before too long. +Stand-alone curricular applications that involve electronic text will be +sharable through networks, reinforcing their significance as intellectual +products as well as instructional tools. + +The second aspect of electronic learning involves the use of research and +education networks for distance education programs. Such programs +interactively link teachers with students in geographically scattered +locations and rely on the availability of electronic instructional +resources. Distance education programs are gaining wide appeal among +state departments of education because of their demonstrated capacity to +bring advanced specialized course work and an array of experts to many +classrooms. A recent report found that at least 32 states operated at +least one statewide network for education in 1991, with networks under +development in many of the remaining states. + +MICHELSON summarized this section by noting two striking changes taking +place in scholarly communication among humanities scholars. First is the +extent to which electronic text in particular, and electronic resources +in general, are being infused into each of the five processes described +above. As mentioned earlier, there is a certain synergy at work here. +The use of electronic resources for one process tends to stimulate its +use for other processes, because the chief course of movement is toward a +comprehensive on-line working context for humanities scholars that +includes on-line availability of key bibliographies, scholarly feedback, +sources, analytical tools, and publications. MICHELSON noted further +that the movement toward a comprehensive on-line working context for +humanities scholars is not new. In fact, it has been underway for more +than forty years in the humanities, since Father Roberto Busa began +developing an electronic concordance of the works of Saint Thomas Aquinas +in 1949. What we are witnessing today, MICHELSON contended, is not the +beginning of this on-line transition but, for at least some humanities +scholars, the turning point in the transition from a print to an +electronic working context. Coinciding with the on-line transition, the +second striking change is the extent to which research and education +networks are becoming the new medium of scholarly communication. The +existing Internet and the pending National Education and Research Network +(NREN) represent the new meeting ground where scholars are going for +bibliographic information, scholarly dialogue and feedback, the most +current publications in their field, and high-level educational +offerings. Traditional scholarly practices are undergoing tremendous +transformations as a result of the emergence and growing prominence of +what is called network-mediated scholarship. + +MICHELSON next turned to the second element of the framework she proposed +at the outset of her talk for evaluating the prospects for electronic +text, namely the key information technology trends affecting the conduct +of scholarly communication over the next decade: 1) end-user computing +and 2) connectivity. + +End-user computing means that the person touching the keyboard, or +performing computations, is the same as the person who initiates or +consumes the computation. The emergence of personal computers, along +with a host of other forces, such as ubiquitous computing, advances in +interface design, and the on-line transition, is prompting the consumers +of computation to do their own computing, and is thus rendering obsolete +the traditional distinction between end users and ultimate users. + +The trend toward end-user computing is significant to consideration of +the prospects for electronic texts because it means that researchers are +becoming more adept at doing their own computations and, thus, more +competent in the use of electronic media. By avoiding programmer +intermediaries, computation is becoming central to the researcher's +thought process. This direct involvement in computing is changing the +researcher's perspective on the nature of research itself, that is, the +kinds of questions that can be posed, the analytical methodologies that +can be used, the types and amount of sources that are appropriate for +analyses, and the form in which findings are presented. The trend toward +end-user computing means that, increasingly, electronic media and +computation are being infused into all processes of humanities +scholarship, inspiring remarkable transformations in scholarly +communication. + +The trend toward greater connectivity suggests that researchers are using +computation increasingly in network environments. Connectivity is +important to scholarship because it erases the distance that separates +students from teachers and scholars from their colleagues, while allowing +users to access remote databases, share information in many different +media, connect to their working context wherever they are, and +collaborate in all phases of research. + +The combination of the trend toward end-user computing and the trend +toward connectivity suggests that the scholarly use of electronic +resources, already evident among some researchers, will soon become an +established feature of scholarship. The effects of these trends, along +with ongoing changes in scholarly practices, point to a future in which +humanities researchers will use computation and electronic communication +to help them formulate ideas, access sources, perform research, +collaborate with colleagues, seek peer review, publish and disseminate +results, and engage in many other professional and educational activities. + +In summary, MICHELSON emphasized four points: 1) A portion of humanities +scholars already consider electronic texts the preferred format for +analysis and dissemination. 2) Scholars are using these electronic +texts, in conjunction with other electronic resources, in all the +processes of scholarly communication. 3) The humanities scholars' +working context is in the process of changing from print technology to +electronic technology, in many ways mirroring transformations that have +occurred or are occurring within the scientific community. 4) These +changes are occurring in conjunction with the development of a new +communication medium: research and education networks that are +characterized by their capacity to advance scholarship in a wholly unique +way. + +MICHELSON also reiterated her three principal arguments: l) Electronic +texts are best understood in terms of the relationship to other +electronic resources and the growing prominence of network-mediated +scholarship. 2) The prospects for electronic texts lie in their capacity +to be integrated into the on-line network of electronic resources that +comprise the new working context for scholars. 3) Retrospective conversion +of portions of the scholarly record should be a key strategy as information +providers respond to changes in scholarly communication practices. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +VECCIA * AM's evaluation project and public users of electronic resources +* AM and its design * Site selection and evaluating the Macintosh +implementation of AM * Characteristics of the six public libraries +selected * Characteristics of AM's users in these libraries * Principal +ways AM is being used * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Susan VECCIA, team leader, and Joanne FREEMAN, associate coordinator, +American Memory, Library of Congress, gave a joint presentation. First, +by way of introduction, VECCIA explained her and FREEMAN's roles in +American Memory (AM). Serving principally as an observer, VECCIA has +assisted with the evaluation project of AM, placing AM collections in a +variety of different sites around the country and helping to organize and +implement that project. FREEMAN has been an associate coordinator of AM +and has been involved principally with the interpretative materials, +preparing some of the electronic exhibits and printed historical +information that accompanies AM and that is requested by users. VECCIA +and FREEMAN shared anecdotal observations concerning AM with public users +of electronic resources. Notwithstanding a fairly structured evaluation +in progress, both VECCIA and FREEMAN chose not to report on specifics in +terms of numbers, etc., because they felt it was too early in the +evaluation project to do so. + +AM is an electronic archive of primary source materials from the Library +of Congress, selected collections representing a variety of formats-- +photographs, graphic arts, recorded sound, motion pictures, broadsides, +and soon, pamphlets and books. In terms of the design of this system, +the interpretative exhibits have been kept separate from the primary +resources, with good reason. Accompanying this collection are printed +documentation and user guides, as well as guides that FREEMAN prepared for +teachers so that they may begin using the content of the system at once. + +VECCIA described the evaluation project before talking about the public +users of AM, limiting her remarks to public libraries, because FREEMAN +would talk more specifically about schools from kindergarten to twelfth +grade (K-12). Having started in spring 1991, the evaluation currently +involves testing of the Macintosh implementation of AM. Since the +primary goal of this evaluation is to determine the most appropriate +audience or audiences for AM, very different sites were selected. This +makes evaluation difficult because of the varying degrees of technology +literacy among the sites. AM is situated in forty-four locations, of +which six are public libraries and sixteen are schools. Represented +among the schools are elementary, junior high, and high schools. +District offices also are involved in the evaluation, which will +conclude in summer 1993. + +VECCIA focused the remainder of her talk on the six public libraries, one +of which doubles as a state library. They represent a range of +geographic areas and a range of demographic characteristics. For +example, three are located in urban settings, two in rural settings, and +one in a suburban setting. A range of technical expertise is to be found +among these facilities as well. For example, one is an "Apple library of +the future," while two others are rural one-room libraries--in one, AM +sits at the front desk next to a tractor manual. + +All public libraries have been extremely enthusiastic, supportive, and +appreciative of the work that AM has been doing. VECCIA characterized +various users: Most users in public libraries describe themselves as +general readers; of the students who use AM in the public libraries, +those in fourth grade and above seem most interested. Public libraries +in rural sites tend to attract retired people, who have been highly +receptive to AM. Users tend to fall into two additional categories: +people interested in the content and historical connotations of these +primary resources, and those fascinated by the technology. The format +receiving the most comments has been motion pictures. The adult users in +public libraries are more comfortable with IBM computers, whereas young +people seem comfortable with either IBM or Macintosh, although most of +them seem to come from a Macintosh background. This same tendency is +found in the schools. + +What kinds of things do users do with AM? In a public library there are +two main goals or ways that AM is being used: as an individual learning +tool, and as a leisure activity. Adult learning was one area that VECCIA +would highlight as a possible application for a tool such as AM. She +described a patron of a rural public library who comes in every day on +his lunch hour and literally reads AM, methodically going through the +collection image by image. At the end of his hour he makes an electronic +bookmark, puts it in his pocket, and returns to work. The next day he +comes in and resumes where he left off. Interestingly, this man had +never been in the library before he used AM. In another small, rural +library, the coordinator reports that AM is a popular activity for some +of the older, retired people in the community, who ordinarily would not +use "those things,"--computers. Another example of adult learning in +public libraries is book groups, one of which, in particular, is using AM +as part of its reading on industrialization, integration, and urbanization +in the early 1900s. + +One library reports that a family is using AM to help educate their +children. In another instance, individuals from a local museum came in +to use AM to prepare an exhibit on toys of the past. These two examples +emphasize the mission of the public library as a cultural institution, +reaching out to people who do not have the same resources available to +those who live in a metropolitan area or have access to a major library. +One rural library reports that junior high school students in large +numbers came in one afternoon to use AM for entertainment. A number of +public libraries reported great interest among postcard collectors in the +Detroit collection, which was essentially a collection of images used on +postcards around the turn of the century. Train buffs are similarly +interested because that was a time of great interest in railroading. +People, it was found, relate to things that they know of firsthand. For +example, in both rural public libraries where AM was made available, +observers reported that the older people with personal remembrances of +the turn of the century were gravitating to the Detroit collection. +These examples served to underscore MICHELSON's observation re the +integration of electronic tools and ideas--that people learn best when +the material relates to something they know. + +VECCIA made the final point that in many cases AM serves as a +public-relations tool for the public libraries that are testing it. In +one case, AM is being used as a vehicle to secure additional funding for +the library. In another case, AM has served as an inspiration to the +staff of a major local public library in the South to think about ways to +make its own collection of photographs more accessible to the public. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +FREEMAN * AM and archival electronic resources in a school environment * +Questions concerning context * Questions concerning the electronic format +itself * Computer anxiety * Access and availability of the system * +Hardware * Strengths gained through the use of archival resources in +schools * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Reiterating an observation made by VECCIA, that AM is an archival +resource made up of primary materials with very little interpretation, +FREEMAN stated that the project has attempted to bridge the gap between +these bare primary materials and a school environment, and in that cause +has created guided introductions to AM collections. Loud demand from the +educational community, chiefly from teachers working with the upper +grades of elementary school through high school, greeted the announcement +that AM would be tested around the country. + +FREEMAN reported not only on what was learned about AM in a school +environment, but also on several universal questions that were raised +concerning archival electronic resources in schools. She discussed +several strengths of this type of material in a school environment as +opposed to a highly structured resource that offers a limited number of +paths to follow. + +FREEMAN first raised several questions about using AM in a school +environment. There is often some difficulty in developing a sense of +what the system contains. Many students sit down at a computer resource +and assume that, because AM comes from the Library of Congress, all of +American history is now at their fingertips. As a result of that sort of +mistaken judgment, some students are known to conclude that AM contains +nothing of use to them when they look for one or two things and do not +find them. It is difficult to discover that middle ground where one has +a sense of what the system contains. Some students grope toward the idea +of an archive, a new idea to them, since they have not previously +experienced what it means to have access to a vast body of somewhat +random information. + +Other questions raised by FREEMAN concerned the electronic format itself. +For instance, in a school environment it is often difficult both for +teachers and students to gain a sense of what it is they are viewing. +They understand that it is a visual image, but they do not necessarily +know that it is a postcard from the turn of the century, a panoramic +photograph, or even machine-readable text of an eighteenth-century +broadside, a twentieth-century printed book, or a nineteenth-century +diary. That distinction is often difficult for people in a school +environment to grasp. Because of that, it occasionally becomes difficult +to draw conclusions from what one is viewing. + +FREEMAN also noted the obvious fear of the computer, which constitutes a +difficulty in using an electronic resource. Though students in general +did not suffer from this anxiety, several older students feared that they +were computer-illiterate, an assumption that became self-fulfilling when +they searched for something but failed to find it. FREEMAN said she +believed that some teachers also fear computer resources, because they +believe they lack complete control. FREEMAN related the example of +teachers shooing away students because it was not their time to use the +system. This was a case in which the situation had to be extremely +structured so that the teachers would not feel that they had lost their +grasp on what the system contained. + +A final question raised by FREEMAN concerned access and availability of +the system. She noted the occasional existence of a gap in communication +between school librarians and teachers. Often AM sits in a school +library and the librarian is the person responsible for monitoring the +system. Teachers do not always take into their world new library +resources about which the librarian is excited. Indeed, at the sites +where AM had been used most effectively within a library, the librarian +was required to go to specific teachers and instruct them in its use. As +a result, several AM sites will have in-service sessions over a summer, +in the hope that perhaps, with a more individualized link, teachers will +be more likely to use the resource. + +A related issue in the school context concerned the number of +workstations available at any one location. Centralization of equipment +at the district level, with teachers invited to download things and walk +away with them, proved unsuccessful because the hours these offices were +open were also school hours. + +Another issue was hardware. As VECCIA observed, a range of sites exists, +some technologically advanced and others essentially acquiring their +first computer for the primary purpose of using it in conjunction with +AM's testing. Users at technologically sophisticated sites want even +more sophisticated hardware, so that they can perform even more +sophisticated tasks with the materials in AM. But once they acquire a +newer piece of hardware, they must learn how to use that also; at an +unsophisticated site it takes an extremely long time simply to become +accustomed to the computer, not to mention the program offered with the +computer. All of these small issues raise one large question, namely, +are systems like AM truly rewarding in a school environment, or do they +simply act as innovative toys that do little more than spark interest? + +FREEMAN contended that the evaluation project has revealed several strengths +that were gained through the use of archival resources in schools, including: + + * Psychic rewards from using AM as a vast, rich database, with + teachers assigning various projects to students--oral presentations, + written reports, a documentary, a turn-of-the-century newspaper-- + projects that start with the materials in AM but are completed using + other resources; AM thus is used as a research tool in conjunction + with other electronic resources, as well as with books and items in + the library where the system is set up. + + * Students are acquiring computer literacy in a humanities context. + + * This sort of system is overcoming the isolation between disciplines + that often exists in schools. For example, many English teachers are + requiring their students to write papers on historical topics + represented in AM. Numerous teachers have reported that their + students are learning critical thinking skills using the system. + + * On a broader level, AM is introducing primary materials, not only + to students but also to teachers, in an environment where often + simply none exist--an exciting thing for the students because it + helps them learn to conduct research, to interpret, and to draw + their own conclusions. In learning to conduct research and what it + means, students are motivated to seek knowledge. That relates to + another positive outcome--a high level of personal involvement of + students with the materials in this system and greater motivation to + conduct their own research and draw their own conclusions. + + * Perhaps the most ironic strength of these kinds of archival + electronic resources is that many of the teachers AM interviewed + were desperate, it is no exaggeration to say, not only for primary + materials but for unstructured primary materials. These would, they + thought, foster personally motivated research, exploration, and + excitement in their students. Indeed, these materials have done + just that. Ironically, however, this lack of structure produces + some of the confusion to which the newness of these kinds of + resources may also contribute. The key to effective use of archival + products in a school environment is a clear, effective introduction + to the system and to what it contains. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Nothing known, quantitatively, about the number of +humanities scholars who must see the original versus those who would +settle for an edited transcript, or about the ways in which humanities +scholars are using information technology * Firm conclusions concerning +the manner and extent of the use of supporting materials in print +provided by AM to await completion of evaluative study * A listener's +reflections on additional applications of electronic texts * Role of +electronic resources in teaching elementary research skills to students * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the discussion that followed the presentations by MICHELSON, +VECCIA, and FREEMAN, additional points emerged. + +LESK asked if MICHELSON could give any quantitative estimate of the +number of humanities scholars who must see or want to see the original, +or the best possible version of the material, versus those who typically +would settle for an edited transcript. While unable to provide a figure, +she offered her impressions as an archivist who has done some reference +work and has discussed this issue with other archivists who perform +reference, that those who use archives and those who use primary sources +for what would be considered very high-level scholarly research, as +opposed to, say, undergraduate papers, were few in number, especially +given the public interest in using primary sources to conduct +genealogical or avocational research and the kind of professional +research done by people in private industry or the federal government. +More important in MICHELSON's view was that, quantitatively, nothing is +known about the ways in which, for example, humanities scholars are using +information technology. No studies exist to offer guidance in creating +strategies. The most recent study was conducted in 1985 by the American +Council of Learned Societies (ACLS), and what it showed was that 50 +percent of humanities scholars at that time were using computers. That +constitutes the extent of our knowledge. + +Concerning AM's strategy for orienting people toward the scope of +electronic resources, FREEMAN could offer no hard conclusions at this +point, because she and her colleagues were still waiting to see, +particularly in the schools, what has been made of their efforts. Within +the system, however, AM has provided what are called electronic exhibits- +-such as introductions to time periods and materials--and these are +intended to offer a student user a sense of what a broadside is and what +it might tell her or him. But FREEMAN conceded that the project staff +would have to talk with students next year, after teachers have had a +summer to use the materials, and attempt to discover what the students +were learning from the materials. In addition, FREEMAN described +supporting materials in print provided by AM at the request of local +teachers during a meeting held at LC. These included time lines, +bibliographies, and other materials that could be reproduced on a +photocopier in a classroom. Teachers could walk away with and use these, +and in this way gain a better understanding of the contents. But again, +reaching firm conclusions concerning the manner and extent of their use +would have to wait until next year. + +As to the changes she saw occurring at the National Archives and Records +Administration (NARA) as a result of the increasing emphasis on +technology in scholarly research, MICHELSON stated that NARA at this +point was absorbing the report by her and Jeff Rothenberg addressing +strategies for the archival profession in general, although not for the +National Archives specifically. NARA is just beginning to establish its +role and what it can do. In terms of changes and initiatives that NARA +can take, no clear response could be given at this time. + +GREENFIELD remarked two trends mentioned in the session. Reflecting on +DALY's opening comments on how he could have used a Latin collection of +text in an electronic form, he said that at first he thought most scholars +would be unwilling to do that. But as he thought of that in terms of the +original meaning of research--that is, having already mastered these texts, +researching them for critical and comparative purposes--for the first time, +the electronic format made a lot of sense. GREENFIELD could envision +growing numbers of scholars learning the new technologies for that very +aspect of their scholarship and for convenience's sake. + +Listening to VECCIA and FREEMAN, GREENFIELD thought of an additional +application of electronic texts. He realized that AM could be used as a +guide to lead someone to original sources. Students cannot be expected +to have mastered these sources, things they have never known about +before. Thus, AM is leading them, in theory, to a vast body of +information and giving them a superficial overview of it, enabling them +to select parts of it. GREENFIELD asked if any evidence exists that this +resource will indeed teach the new user, the K-12 students, how to do +research. Scholars already know how to do research and are applying +these new tools. But he wondered why students would go beyond picking +out things that were most exciting to them. + +FREEMAN conceded the correctness of GREENFIELD's observation as applied +to a school environment. The risk is that a student would sit down at a +system, play with it, find some things of interest, and then walk away. +But in the relatively controlled situation of a school library, much will +depend on the instructions a teacher or a librarian gives a student. She +viewed the situation not as one of fine-tuning research skills but of +involving students at a personal level in understanding and researching +things. Given the guidance one can receive at school, it then becomes +possible to teach elementary research skills to students, which in fact +one particular librarian said she was teaching her fifth graders. +FREEMAN concluded that introducing the idea of following one's own path +of inquiry, which is essentially what research entails, involves more +than teaching specific skills. To these comments VECCIA added the +observation that the individual teacher and the use of a creative +resource, rather than AM itself, seemed to make the key difference. +Some schools and some teachers are making excellent use of the nature +of critical thinking and teaching skills, she said. + +Concurring with these remarks, DALY closed the session with the thought that +the more that producers produced for teachers and for scholars to use with +their students, the more successful their electronic products would prove. + + ****** + +SESSION II. SHOW AND TELL + +Jacqueline HESS, director, National Demonstration Laboratory, served as +moderator of the "show-and-tell" session. She noted that a +question-and-answer period would follow each presentation. + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +MYLONAS * Overview and content of Perseus * Perseus' primary materials +exist in a system-independent, archival form * A concession * Textual +aspects of Perseus * Tools to use with the Greek text * Prepared indices +and full-text searches in Perseus * English-Greek word search leads to +close study of words and concepts * Navigating Perseus by tracing down +indices * Using the iconography to perform research * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Elli MYLONAS, managing editor, Perseus Project, Harvard University, first +gave an overview of Perseus, a large, collaborative effort based at +Harvard University but with contributors and collaborators located at +numerous universities and colleges in the United States (e.g., Bowdoin, +Maryland, Pomona, Chicago, Virginia). Funded primarily by the +Annenberg/CPB Project, with additional funding from Apple, Harvard, and +the Packard Humanities Institute, among others, Perseus is a multimedia, +hypertextual database for teaching and research on classical Greek +civilization, which was released in February 1992 in version 1.0 and +distributed by Yale University Press. + +Consisting entirely of primary materials, Perseus includes ancient Greek +texts and translations of those texts; catalog entries--that is, museum +catalog entries, not library catalog entries--on vases, sites, coins, +sculpture, and archaeological objects; maps; and a dictionary, among +other sources. The number of objects and the objects for which catalog +entries exist are accompanied by thousands of color images, which +constitute a major feature of the database. Perseus contains +approximately 30 megabytes of text, an amount that will double in +subsequent versions. In addition to these primary materials, the Perseus +Project has been building tools for using them, making access and +navigation easier, the goal being to build part of the electronic +environment discussed earlier in the morning in which students or +scholars can work with their sources. + +The demonstration of Perseus will show only a fraction of the real work +that has gone into it, because the project had to face the dilemma of +what to enter when putting something into machine-readable form: should +one aim for very high quality or make concessions in order to get the +material in? Since Perseus decided to opt for very high quality, all of +its primary materials exist in a system-independent--insofar as it is +possible to be system-independent--archival form. Deciding what that +archival form would be and attaining it required much work and thought. +For example, all the texts are marked up in SGML, which will be made +compatible with the guidelines of the Text Encoding Initiative (TEI) when +they are issued. + +Drawings are postscript files, not meeting international standards, but +at least designed to go across platforms. Images, or rather the real +archival forms, consist of the best available slides, which are being +digitized. Much of the catalog material exists in database form--a form +that the average user could use, manipulate, and display on a personal +computer, but only at great cost. Thus, this is where the concession +comes in: All of this rich, well-marked-up information is stripped of +much of its content; the images are converted into bit-maps and the text +into small formatted chunks. All this information can then be imported +into HyperCard and run on a mid-range Macintosh, which is what Perseus +users have. This fact has made it possible for Perseus to attain wide +use fairly rapidly. Without those archival forms the HyperCard version +being demonstrated could not be made easily, and the project could not +have the potential to move to other forms and machines and software as +they appear, none of which information is in Perseus on the CD. + +Of the numerous multimedia aspects of Perseus, MYLONAS focused on the +textual. Part of what makes Perseus such a pleasure to use, MYLONAS +said, is this effort at seamless integration and the ability to move +around both visual and textual material. Perseus also made the decision +not to attempt to interpret its material any more than one interprets by +selecting. But, MYLONAS emphasized, Perseus is not courseware: No +syllabus exists. There is no effort to define how one teaches a topic +using Perseus, although the project may eventually collect papers by +people who have used it to teach. Rather, Perseus aims to provide +primary material in a kind of electronic library, an electronic sandbox, +so to say, in which students and scholars who are working on this +material can explore by themselves. With that, MYLONAS demonstrated +Perseus, beginning with the Perseus gateway, the first thing one sees +upon opening Perseus--an effort in part to solve the contextualizing +problem--which tells the user what the system contains. + +MYLONAS demonstrated only a very small portion, beginning with primary +texts and running off the CD-ROM. Having selected Aeschylus' Prometheus +Bound, which was viewable in Greek and English pretty much in the same +segments together, MYLONAS demonstrated tools to use with the Greek text, +something not possible with a book: looking up the dictionary entry form +of an unfamiliar word in Greek after subjecting it to Perseus' +morphological analysis for all the texts. After finding out about a +word, a user may then decide to see if it is used anywhere else in Greek. +Because vast amounts of indexing support all of the primary material, one +can find out where else all forms of a particular Greek word appear-- +often not a trivial matter because Greek is highly inflected. Further, +since the story of Prometheus has to do with the origins of sacrifice, a +user may wish to study and explore sacrifice in Greek literature; by +typing sacrifice into a small window, a user goes to the English-Greek +word list--something one cannot do without the computer (Perseus has +indexed the definitions of its dictionary)--the string sacrifice appears +in the definitions of these sixty-five words. One may then find out +where any of those words is used in the work(s) of a particular author. +The English definitions are not lemmatized. + +All of the indices driving this kind of usage were originally devised for +speed, MYLONAS observed; in other words, all that kind of information-- +all forms of all words, where they exist, the dictionary form they belong +to--were collected into databases, which will expedite searching. Then +it was discovered that one can do things searching in these databases +that could not be done searching in the full texts. Thus, although there +are full-text searches in Perseus, much of the work is done behind the +scenes, using prepared indices. Re the indexing that is done behind the +scenes, MYLONAS pointed out that without the SGML forms of the text, it +could not be done effectively. Much of this indexing is based on the +structures that are made explicit by the SGML tagging. + +It was found that one of the things many of Perseus' non-Greek-reading +users do is start from the dictionary and then move into the close study +of words and concepts via this kind of English-Greek word search, by which +means they might select a concept. This exercise has been assigned to +students in core courses at Harvard--to study a concept by looking for the +English word in the dictionary, finding the Greek words, and then finding +the words in the Greek but, of course, reading across in the English. +That tells them a great deal about what a translation means as well. + +Should one also wish to see images that have to do with sacrifice, that +person would go to the object key word search, which allows one to +perform a similar kind of index retrieval on the database of +archaeological objects. Without words, pictures are useless; Perseus has +not reached the point where it can do much with images that are not +cataloged. Thus, although it is possible in Perseus with text and images +to navigate by knowing where one wants to end up--for example, a +red-figure vase from the Boston Museum of Fine Arts--one can perform this +kind of navigation very easily by tracing down indices. MYLONAS +illustrated several generic scenes of sacrifice on vases. The features +demonstrated derived from Perseus 1.0; version 2.0 will implement even +better means of retrieval. + +MYLONAS closed by looking at one of the pictures and noting again that +one can do a great deal of research using the iconography as well as the +texts. For instance, students in a core course at Harvard this year were +highly interested in Greek concepts of foreigners and representations of +non-Greeks. So they performed a great deal of research, both with texts +(e.g., Herodotus) and with iconography on vases and coins, on how the +Greeks portrayed non-Greeks. At the same time, art historians who study +iconography were also interested, and were able to use this material. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Indexing and searchability of all English words in Perseus * +Several features of Perseus 1.0 * Several levels of customization +possible * Perseus used for general education * Perseus' effects on +education * Contextual information in Perseus * Main challenge and +emphasis of Perseus * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Several points emerged in the discussion that followed MYLONAS's presentation. + +Although MYLONAS had not demonstrated Perseus' ability to cross-search +documents, she confirmed that all English words in Perseus are indexed +and can be searched. So, for example, sacrifice could have been searched +in all texts, the historical essay, and all the catalogue entries with +their descriptions--in short, in all of Perseus. + +Boolean logic is not in Perseus 1.0 but will be added to the next +version, although an effort is being made not to restrict Perseus to a +database in which one just performs searching, Boolean or otherwise. It +is possible to move laterally through the documents by selecting a word +one is interested in and selecting an area of information one is +interested in and trying to look that word up in that area. + +Since Perseus was developed in HyperCard, several levels of customization +are possible. Simple authoring tools exist that allow one to create +annotated paths through the information, which are useful for note-taking +and for guided tours for teaching purposes and for expository writing. +With a little more ingenuity it is possible to begin to add or substitute +material in Perseus. + +Perseus has not been used so much for classics education as for general +education, where it seemed to have an impact on the students in the core +course at Harvard (a general required course that students must take in +certain areas). Students were able to use primary material much more. + +The Perseus Project has an evaluation team at the University of Maryland +that has been documenting Perseus' effects on education. Perseus is very +popular, and anecdotal evidence indicates that it is having an effect at +places other than Harvard, for example, test sites at Ball State +University, Drury College, and numerous small places where opportunities +to use vast amounts of primary data may not exist. One documented effect +is that archaeological, anthropological, and philological research is +being done by the same person instead of by three different people. + +The contextual information in Perseus includes an overview essay, a +fairly linear historical essay on the fifth century B.C. that provides +links into the primary material (e.g., Herodotus, Thucydides, and +Plutarch), via small gray underscoring (on the screen) of linked +passages. These are handmade links into other material. + +To different extents, most of the production work was done at Harvard, +where the people and the equipment are located. Much of the +collaborative activity involved data collection and structuring, because +the main challenge and the emphasis of Perseus is the gathering of +primary material, that is, building a useful environment for studying +classical Greece, collecting data, and making it useful. +Systems-building is definitely not the main concern. Thus, much of the +work has involved writing essays, collecting information, rewriting it, +and tagging it. That can be done off site. The creative link for the +overview essay as well as for both systems and data was collaborative, +and was forged via E-mail and paper mail with professors at Pomona and +Bowdoin. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +CALALUCA * PLD's principal focus and contribution to scholarship * +Various questions preparatory to beginning the project * Basis for +project * Basic rule in converting PLD * Concerning the images in PLD * +Running PLD under a variety of retrieval softwares * Encoding the +database a hard-fought issue * Various features demonstrated * Importance +of user documentation * Limitations of the CD-ROM version * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Eric CALALUCA, vice president, Chadwyck-Healey, Inc., demonstrated a +software interpretation of the Patrologia Latina Database (PLD). PLD's +principal focus from the beginning of the project about three-and-a-half +years ago was on converting Migne's Latin series, and in the end, +CALALUCA suggested, conversion of the text will be the major contribution +to scholarship. CALALUCA stressed that, as possibly the only private +publishing organization at the Workshop, Chadwyck-Healey had sought no +federal funds or national foundation support before embarking upon the +project, but instead had relied upon a great deal of homework and +marketing to accomplish the task of conversion. + +Ever since the possibilities of computer-searching have emerged, scholars +in the field of late ancient and early medieval studies (philosophers, +theologians, classicists, and those studying the history of natural law +and the history of the legal development of Western civilization) have +been longing for a fully searchable version of Western literature, for +example, all the texts of Augustine and Bernard of Clairvaux and +Boethius, not to mention all the secondary and tertiary authors. + +Various questions arose, CALALUCA said. Should one convert Migne? +Should the database be encoded? Is it necessary to do that? How should +it be delivered? What about CD-ROM? Since this is a transitional +medium, why even bother to create software to run on a CD-ROM? Since +everybody knows people will be networking information, why go to the +trouble--which is far greater with CD-ROM than with the production of +magnetic data? Finally, how does one make the data available? Can many +of the hurdles to using electronic information that some publishers have +imposed upon databases be eliminated? + +The PLD project was based on the principle that computer-searching of +texts is most effective when it is done with a large database. Because +PLD represented a collection that serves so many disciplines across so +many periods, it was irresistible. + +The basic rule in converting PLD was to do no harm, to avoid the sins of +intrusion in such a database: no introduction of newer editions, no +on-the-spot changes, no eradicating of all possible falsehoods from an +edition. Thus, PLD is not the final act in electronic publishing for +this discipline, but simply the beginning. The conversion of PLD has +evoked numerous unanticipated questions: How will information be used? +What about networking? Can the rights of a database be protected? +Should one protect the rights of a database? How can it be made +available? + +Those converting PLD also tried to avoid the sins of omission, that is, +excluding portions of the collections or whole sections. What about the +images? PLD is full of images, some are extremely pious +nineteenth-century representations of the Fathers, while others contain +highly interesting elements. The goal was to cover all the text of Migne +(including notes, in Greek and in Hebrew, the latter of which, in +particular, causes problems in creating a search structure), all the +indices, and even the images, which are being scanned in separately +searchable files. + +Several North American institutions that have placed acquisition requests +for the PLD database have requested it in magnetic form without software, +which means they are already running it without software, without +anything demonstrated at the Workshop. + +What cannot practically be done is go back and reconvert and re-encode +data, a time-consuming and extremely costly enterprise. CALALUCA sees +PLD as a database that can, and should, be run under a variety of +retrieval softwares. This will permit the widest possible searches. +Consequently, the need to produce a CD-ROM of PLD, as well as to develop +software that could handle some 1.3 gigabyte of heavily encoded text, +developed out of conversations with collection development and reference +librarians who wanted software both compassionate enough for the +pedestrian but also capable of incorporating the most detailed +lexicographical studies that a user desires to conduct. In the end, the +encoding and conversion of the data will prove the most enduring +testament to the value of the project. + +The encoding of the database was also a hard-fought issue: Did the +database need to be encoded? Were there normative structures for encoding +humanist texts? Should it be SGML? What about the TEI--will it last, +will it prove useful? CALALUCA expressed some minor doubts as to whether +a data bank can be fully TEI-conformant. Every effort can be made, but +in the end to be TEI-conformant means to accept the need to make some +firm encoding decisions that can, indeed, be disputed. The TEI points +the publisher in a proper direction but does not presume to make all the +decisions for him or her. Essentially, the goal of encoding was to +eliminate, as much as possible, the hindrances to information-networking, +so that if an institution acquires a database, everybody associated with +the institution can have access to it. + +CALALUCA demonstrated a portion of Volume 160, because it had the most +anomalies in it. The software was created by Electronic Book +Technologies of Providence, RI, and is called Dynatext. The software +works only with SGML-coded data. + +Viewing a table of contents on the screen, the audience saw how Dynatext +treats each element as a book and attempts to simplify movement through a +volume. Familiarity with the Patrologia in print (i.e., the text, its +source, and the editions) will make the machine-readable versions highly +useful. (Software with a Windows application was sought for PLD, +CALALUCA said, because this was the main trend for scholarly use.) + +CALALUCA also demonstrated how a user can perform a variety of searches +and quickly move to any part of a volume; the look-up screen provides +some basic, simple word-searching. + +CALALUCA argued that one of the major difficulties is not the software. +Rather, in creating a product that will be used by scholars representing +a broad spectrum of computer sophistication, user documentation proves +to be the most important service one can provide. + +CALALUCA next illustrated a truncated search under mysterium within ten +words of virtus and how one would be able to find its contents throughout +the entire database. He said that the exciting thing about PLD is that +many of the applications in the retrieval software being written for it +will exceed the capabilities of the software employed now for the CD-ROM +version. The CD-ROM faces genuine limitations, in terms of speed and +comprehensiveness, in the creation of a retrieval software to run it. +CALALUCA said he hoped that individual scholars will download the data, +if they wish, to their personal computers, and have ready access to +important texts on a constant basis, which they will be able to use in +their research and from which they might even be able to publish. + +(CALALUCA explained that the blue numbers represented Migne's column numbers, +which are the standard scholarly references. Pulling up a note, he stated +that these texts were heavily edited and the image files would appear simply +as a note as well, so that one could quickly access an image.) + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +FLEISCHHAUER/ERWAY * Several problems with which AM is still wrestling * +Various search and retrieval capabilities * Illustration of automatic +stemming and a truncated search * AM's attempt to find ways to connect +cataloging to the texts * AM's gravitation towards SGML * Striking a +balance between quantity and quality * How AM furnishes users recourse to +images * Conducting a search in a full-text environment * Macintosh and +IBM prototypes of AM * Multimedia aspects of AM * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +A demonstration of American Memory by its coordinator, Carl FLEISCHHAUER, +and Ricky ERWAY, associate coordinator, Library of Congress, concluded +the morning session. Beginning with a collection of broadsides from the +Continental Congress and the Constitutional Convention, the only text +collection in a presentable form at the time of the Workshop, FLEISCHHAUER +highlighted several of the problems with which AM is still wrestling. +(In its final form, the disk will contain two collections, not only the +broadsides but also the full text with illustrations of a set of +approximately 300 African-American pamphlets from the period 1870 to 1910.) + +As FREEMAN had explained earlier, AM has attempted to use a small amount +of interpretation to introduce collections. In the present case, the +contractor, a company named Quick Source, in Silver Spring, MD., used +software called Toolbook and put together a modestly interactive +introduction to the collection. Like the two preceding speakers, +FLEISCHHAUER argued that the real asset was the underlying collection. + +FLEISCHHAUER proceeded to describe various search and retrieval +capabilities while ERWAY worked the computer. In this particular package +the "go to" pull-down allowed the user in effect to jump out of Toolbook, +where the interactive program was located, and enter the third-party +software used by AM for this text collection, which is called Personal +Librarian. This was the Windows version of Personal Librarian, a +software application put together by a company in Rockville, Md. + +Since the broadsides came from the Revolutionary War period, a search was +conducted using the words British or war, with the default operator reset +as or. FLEISCHHAUER demonstrated both automatic stemming (which finds +other forms of the same root) and a truncated search. One of Personal +Librarian's strongest features, the relevance ranking, was represented by +a chart that indicated how often words being sought appeared in +documents, with the one receiving the most "hits" obtaining the highest +score. The "hit list" that is supplied takes the relevance ranking into +account, making the first hit, in effect, the one the software has +selected as the most relevant example. + +While in the text of one of the broadside documents, FLEISCHHAUER +remarked AM's attempt to find ways to connect cataloging to the texts, +which it does in different ways in different manifestations. In the case +shown, the cataloging was pasted on: AM took MARC records that were +written as on-line records right into one of the Library's mainframe +retrieval programs, pulled them out, and handed them off to the contractor, +who massaged them somewhat to display them in the manner shown. One of +AM's questions is, Does the cataloguing normally performed in the mainframe +work in this context, or had AM ought to think through adjustments? + +FLEISCHHAUER made the additional point that, as far as the text goes, AM +has gravitated towards SGML (he pointed to the boldface in the upper part +of the screen). Although extremely limited in its ability to translate +or interpret SGML, Personal Librarian will furnish both bold and italics +on screen; a fairly easy thing to do, but it is one of the ways in which +SGML is useful. + +Striking a balance between quantity and quality has been a major concern +of AM, with accuracy being one of the places where project staff have +felt that less than 100-percent accuracy was not unacceptable. +FLEISCHHAUER cited the example of the standard of the rekeying industry, +namely 99.95 percent; as one service bureau informed him, to go from +99.95 to 100 percent would double the cost. + +FLEISCHHAUER next demonstrated how AM furnishes users recourse to images, +and at the same time recalled LESK's pointed question concerning the +number of people who would look at those images and the number who would +work only with the text. If the implication of LESK's question was +sound, FLEISCHHAUER said, it raised the stakes for text accuracy and +reduced the value of the strategy for images. + +Contending that preservation is always a bugaboo, FLEISCHHAUER +demonstrated several images derived from a scan of a preservation +microfilm that AM had made. He awarded a grade of C at best, perhaps a +C minus or a C plus, for how well it worked out. Indeed, the matter of +learning if other people had better ideas about scanning in general, and, +in particular, scanning from microfilm, was one of the factors that drove +AM to attempt to think through the agenda for the Workshop. Skew, for +example, was one of the issues that AM in its ignorance had not reckoned +would prove so difficult. + +Further, the handling of images of the sort shown, in a desktop computer +environment, involved a considerable amount of zooming and scrolling. +Ultimately, AM staff feel that perhaps the paper copy that is printed out +might be the most useful one, but they remain uncertain as to how much +on-screen reading users will do. + +Returning to the text, FLEISCHHAUER asked viewers to imagine a person who +might be conducting a search in a full-text environment. With this +scenario, he proceeded to illustrate other features of Personal Librarian +that he considered helpful; for example, it provides the ability to +notice words as one reads. Clicking the "include" button on the bottom +of the search window pops the words that have been highlighted into the +search. Thus, a user can refine the search as he or she reads, +re-executing the search and continuing to find things in the quest for +materials. This software not only contains relevance ranking, Boolean +operators, and truncation, it also permits one to perform word algebra, +so to say, where one puts two or three words in parentheses and links +them with one Boolean operator and then a couple of words in another set +of parentheses and asks for things within so many words of others. + +Until they became acquainted recently with some of the work being done in +classics, the AM staff had not realized that a large number of the +projects that involve electronic texts were being done by people with a +profound interest in language and linguistics. Their search strategies +and thinking are oriented to those fields, as is shown in particular by +the Perseus example. As amateur historians, the AM staff were thinking +more of searching for concepts and ideas than for particular words. +Obviously, FLEISCHHAUER conceded, searching for concepts and ideas and +searching for words may be two rather closely related things. + +While displaying several images, FLEISCHHAUER observed that the Macintosh +prototype built by AM contains a greater diversity of formats. Echoing a +previous speaker, he said that it was easier to stitch things together in +the Macintosh, though it tended to be a little more anemic in search and +retrieval. AM, therefore, increasingly has been investigating +sophisticated retrieval engines in the IBM format. + +FLEISCHHAUER demonstrated several additional examples of the prototype +interfaces: One was AM's metaphor for the network future, in which a +kind of reading-room graphic suggests how one would be able to go around +to different materials. AM contains a large number of photographs in +analog video form worked up from a videodisc, which enable users to make +copies to print or incorporate in digital documents. A frame-grabber is +built into the system, making it possible to bring an image into a window +and digitize or print it out. + +FLEISCHHAUER next demonstrated sound recording, which included texts. +Recycled from a previous project, the collection included sixty 78-rpm +phonograph records of political speeches that were made during and +immediately after World War I. These constituted approximately three +hours of audio, as AM has digitized it, which occupy 150 megabytes on a +CD. Thus, they are considerably compressed. From the catalogue card, +FLEISCHHAUER proceeded to a transcript of a speech with the audio +available and with highlighted text following it as it played. +A photograph has been added and a transcription made. + +Considerable value has been added beyond what the Library of Congress +normally would do in cataloguing a sound recording, which raises several +questions for AM concerning where to draw lines about how much value it can +afford to add and at what point, perhaps, this becomes more than AM could +reasonably do or reasonably wish to do. FLEISCHHAUER also demonstrated +a motion picture. As FREEMAN had reported earlier, the motion picture +materials have proved the most popular, not surprisingly. This says more +about the medium, he thought, than about AM's presentation of it. + +Because AM's goal was to bring together things that could be used by +historians or by people who were curious about history, +turn-of-the-century footage seemed to represent the most appropriate +collections from the Library of Congress in motion pictures. These were +the very first films made by Thomas Edison's company and some others at +that time. The particular example illustrated was a Biograph film, +brought in with a frame-grabber into a window. A single videodisc +contains about fifty titles and pieces of film from that period, all of +New York City. Taken together, AM believes, they provide an interesting +documentary resource. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Using the frame-grabber in AM * Volume of material processed +and to be processed * Purpose of AM within LC * Cataloguing and the +nature of AM's material * SGML coding and the question of quality versus +quantity * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the question-and-answer period that followed FLEISCHHAUER's +presentation, several clarifications were made. + +AM is bringing in motion pictures from a videodisc. The frame-grabber +devices create a window on a computer screen, which permits users to +digitize a single frame of the movie or one of the photographs. It +produces a crude, rough-and-ready image that high school students can +incorporate into papers, and that has worked very nicely in this way. + +Commenting on FLEISCHHAUER's assertion that AM was looking more at +searching ideas than words, MYLONAS argued that without words an idea +does not exist. FLEISCHHAUER conceded that he ought to have articulated +his point more clearly. MYLONAS stated that they were in fact both +talking about the same thing. By searching for words and by forcing +people to focus on the word, the Perseus Project felt that they would get +them to the idea. The way one reviews results is tailored more to one +kind of user than another. + +Concerning the total volume of material that has been processed in this +way, AM at this point has in retrievable form seven or eight collections, +all of them photographic. In the Macintosh environment, for example, +there probably are 35,000-40,000 photographs. The sound recordings +number sixty items. The broadsides number about 300 items. There are +500 political cartoons in the form of drawings. The motion pictures, as +individual items, number sixty to seventy. + +AM also has a manuscript collection, the life history portion of one of +the federal project series, which will contain 2,900 individual +documents, all first-person narratives. AM has in process about 350 +African-American pamphlets, or about 12,000 printed pages for the period +1870-1910. Also in the works are some 4,000 panoramic photographs. AM +has recycled a fair amount of the work done by LC's Prints and +Photographs Division during the Library's optical disk pilot project in +the 1980s. For example, a special division of LC has tooled up and +thought through all the ramifications of electronic presentation of +photographs. Indeed, they are wheeling them out in great barrel loads. +The purpose of AM within the Library, it is hoped, is to catalyze several +of the other special collection divisions which have no particular +experience with, in some cases, mixed feelings about, an activity such as +AM. Moreover, in many cases the divisions may be characterized as not +only lacking experience in "electronifying" things but also in automated +cataloguing. MARC cataloguing as practiced in the United States is +heavily weighted toward the description of monograph and serial +materials, but is much thinner when one enters the world of manuscripts +and things that are held in the Library's music collection and other +units. In response to a comment by LESK, that AM's material is very +heavily photographic, and is so primarily because individual records have +been made for each photograph, FLEISCHHAUER observed that an item-level +catalog record exists, for example, for each photograph in the Detroit +Publishing collection of 25,000 pictures. In the case of the Federal +Writers Project, for which nearly 3,000 documents exist, representing +information from twenty-six different states, AM with the assistance of +Karen STUART of the Manuscript Division will attempt to find some way not +only to have a collection-level record but perhaps a MARC record for each +state, which will then serve as an umbrella for the 100-200 documents +that come under it. But that drama remains to be enacted. The AM staff +is conservative and clings to cataloguing, though of course visitors tout +artificial intelligence and neural networks in a manner that suggests that +perhaps one need not have cataloguing or that much of it could be put aside. + +The matter of SGML coding, FLEISCHHAUER conceded, returned the discussion +to the earlier treated question of quality versus quantity in the Library +of Congress. Of course, text conversion can be done with 100-percent +accuracy, but it means that when one's holdings are as vast as LC's only +a tiny amount will be exposed, whereas permitting lower levels of +accuracy can lead to exposing or sharing larger amounts, but with the +quality correspondingly impaired. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +TWOHIG * A contrary experience concerning electronic options * Volume of +material in the Washington papers and a suggestion of David Packard * +Implications of Packard's suggestion * Transcribing the documents for the +CD-ROM * Accuracy of transcriptions * The CD-ROM edition of the Founding +Fathers documents * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Finding encouragement in a comment of MICHELSON's from the morning +session--that numerous people in the humanities were choosing electronic +options to do their work--Dorothy TWOHIG, editor, The Papers of George +Washington, opened her illustrated talk by noting that her experience +with literary scholars and numerous people in editing was contrary to +MICHELSON's. TWOHIG emphasized literary scholars' complete ignorance of +the technological options available to them or their reluctance or, in +some cases, their downright hostility toward these options. + +After providing an overview of the five Founding Fathers projects +(Jefferson at Princeton, Franklin at Yale, John Adams at the +Massachusetts Historical Society, and Madison down the hall from her at +the University of Virginia), TWOHIG observed that the Washington papers, +like all of the projects, include both sides of the Washington +correspondence and deal with some 135,000 documents to be published with +extensive annotation in eighty to eighty-five volumes, a project that +will not be completed until well into the next century. Thus, it was +with considerable enthusiasm several years ago that the Washington Papers +Project (WPP) greeted David Packard's suggestion that the papers of the +Founding Fathers could be published easily and inexpensively, and to the +great benefit of American scholarship, via CD-ROM. + +In pragmatic terms, funding from the Packard Foundation would expedite +the transcription of thousands of documents waiting to be put on disk in +the WPP offices. Further, since the costs of collecting, editing, and +converting the Founding Fathers documents into letterpress editions were +running into the millions of dollars, and the considerable staffs +involved in all of these projects were devoting their careers to +producing the work, the Packard Foundation's suggestion had a +revolutionary aspect: Transcriptions of the entire corpus of the +Founding Fathers papers would be available on CD-ROM to public and +college libraries, even high schools, at a fraction of the cost-- +$100-$150 for the annual license fee--to produce a limited university +press run of 1,000 of each volume of the published papers at $45-$150 per +printed volume. Given the current budget crunch in educational systems +and the corresponding constraints on librarians in smaller institutions +who wish to add these volumes to their collections, producing the +documents on CD-ROM would likely open a greatly expanded audience for the +papers. TWOHIG stressed, however, that development of the Founding +Fathers CD-ROM is still in its infancy. Serious software problems remain +to be resolved before the material can be put into readable form. + +Funding from the Packard Foundation resulted in a major push to +transcribe the 75,000 or so documents of the Washington papers remaining +to be transcribed onto computer disks. Slides illustrated several of the +problems encountered, for example, the present inability of CD-ROM to +indicate the cross-outs (deleted material) in eighteenth century +documents. TWOHIG next described documents from various periods in the +eighteenth century that have been transcribed in chronological order and +delivered to the Packard offices in California, where they are converted +to the CD-ROM, a process that is expected to consume five years to +complete (that is, reckoning from David Packard's suggestion made several +years ago, until about July 1994). TWOHIG found an encouraging +indication of the project's benefits in the ongoing use made by scholars +of the search functions of the CD-ROM, particularly in reducing the time +spent in manually turning the pages of the Washington papers. + +TWOHIG next furnished details concerning the accuracy of transcriptions. +For instance, the insertion of thousands of documents on the CD-ROM +currently does not permit each document to be verified against the +original manuscript several times as in the case of documents that appear +in the published edition. However, the transcriptions receive a cursory +check for obvious typos, the misspellings of proper names, and other +errors from the WPP CD-ROM editor. Eventually, all documents that appear +in the electronic version will be checked by project editors. Although +this process has met with opposition from some of the editors on the +grounds that imperfect work may leave their offices, the advantages in +making this material available as a research tool outweigh fears about the +misspelling of proper names and other relatively minor editorial matters. + +Completion of all five Founding Fathers projects (i.e., retrievability +and searchability of all of the documents by proper names, alternate +spellings, or varieties of subjects) will provide one of the richest +sources of this size for the history of the United States in the latter +part of the eighteenth century. Further, publication on CD-ROM will +allow editors to include even minutiae, such as laundry lists, not +included in the printed volumes. + +It seems possible that the extensive annotation provided in the printed +volumes eventually will be added to the CD-ROM edition, pending +negotiations with the publishers of the papers. At the moment, the +Founding Fathers CD-ROM is accessible only on the IBYCUS, a computer +developed out of the Thesaurus Linguae Graecae project and designed for +the use of classical scholars. There are perhaps 400 IBYCUS computers in +the country, most of which are in university classics departments. +Ultimately, it is anticipated that the CD-ROM edition of the Founding +Fathers documents will run on any IBM-compatible or Macintosh computer +with a CD-ROM drive. Numerous changes in the software will also occur +before the project is completed. (Editor's note: an IBYCUS was +unavailable to demonstrate the CD-ROM.) + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Several additional features of WPP clarified * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Discussion following TWOHIG's presentation served to clarify several +additional features, including (1) that the project's primary +intellectual product consists in the electronic transcription of the +material; (2) that the text transmitted to the CD-ROM people is not +marked up; (3) that cataloging and subject-indexing of the material +remain to be worked out (though at this point material can be retrieved +by name); and (4) that because all the searching is done in the hardware, +the IBYCUS is designed to read a CD-ROM which contains only sequential +text files. Technically, it then becomes very easy to read the material +off and put it on another device. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +LEBRON * Overview of the history of the joint project between AAAS and +OCLC * Several practices the on-line environment shares with traditional +publishing on hard copy * Several technical and behavioral barriers to +electronic publishing * How AAAS and OCLC arrived at the subject of +clinical trials * Advantages of the electronic format and other features +of OJCCT * An illustrated tour of the journal * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Maria LEBRON, managing editor, The Online Journal of Current Clinical +Trials (OJCCT), presented an illustrated overview of the history of the +joint project between the American Association for the Advancement of +Science (AAAS) and the Online Computer Library Center, Inc. (OCLC). The +joint venture between AAAS and OCLC owes its beginning to a +reorganization launched by the new chief executive officer at OCLC about +three years ago and combines the strengths of these two disparate +organizations. In short, OJCCT represents the process of scholarly +publishing on line. + +LEBRON next discussed several practices the on-line environment shares +with traditional publishing on hard copy--for example, peer review of +manuscripts--that are highly important in the academic world. LEBRON +noted in particular the implications of citation counts for tenure +committees and grants committees. In the traditional hard-copy +environment, citation counts are readily demonstrable, whereas the +on-line environment represents an ethereal medium to most academics. + +LEBRON remarked several technical and behavioral barriers to electronic +publishing, for instance, the problems in transmission created by special +characters or by complex graphics and halftones. In addition, she noted +economic limitations such as the storage costs of maintaining back issues +and market or audience education. + +Manuscripts cannot be uploaded to OJCCT, LEBRON explained, because it is +not a bulletin board or E-mail, forms of electronic transmission of +information that have created an ambience clouding people's understanding +of what the journal is attempting to do. OJCCT, which publishes +peer-reviewed medical articles dealing with the subject of clinical +trials, includes text, tabular material, and graphics, although at this +time it can transmit only line illustrations. + +Next, LEBRON described how AAAS and OCLC arrived at the subject of +clinical trials: It is 1) a highly statistical discipline that 2) does +not require halftones but can satisfy the needs of its audience with line +illustrations and graphic material, and 3) there is a need for the speedy +dissemination of high-quality research results. Clinical trials are +research activities that involve the administration of a test treatment +to some experimental unit in order to test its usefulness before it is +made available to the general population. LEBRON proceeded to give +additional information on OJCCT concerning its editor-in-chief, editorial +board, editorial content, and the types of articles it publishes +(including peer-reviewed research reports and reviews), as well as +features shared by other traditional hard-copy journals. + +Among the advantages of the electronic format are faster dissemination of +information, including raw data, and the absence of space constraints +because pages do not exist. (This latter fact creates an interesting +situation when it comes to citations.) Nor are there any issues. AAAS's +capacity to download materials directly from the journal to a +subscriber's printer, hard drive, or floppy disk helps ensure highly +accurate transcription. Other features of OJCCT include on-screen alerts +that allow linkage of subsequently published documents to the original +documents; on-line searching by subject, author, title, etc.; indexing of +every single word that appears in an article; viewing access to an +article by component (abstract, full text, or graphs); numbered +paragraphs to replace page counts; publication in Science every thirty +days of indexing of all articles published in the journal; +typeset-quality screens; and Hypertext links that enable subscribers to +bring up Medline abstracts directly without leaving the journal. + +After detailing the two primary ways to gain access to the journal, +through the OCLC network and Compuserv if one desires graphics or through +the Internet if just an ASCII file is desired, LEBRON illustrated the +speedy editorial process and the coding of the document using SGML tags +after it has been accepted for publication. She also gave an illustrated +tour of the journal, its search-and-retrieval capabilities in particular, +but also including problems associated with scanning in illustrations, +and the importance of on-screen alerts to the medical profession re +retractions or corrections, or more frequently, editorials, letters to +the editors, or follow-up reports. She closed by inviting the audience +to join AAAS on 1 July, when OJCCT was scheduled to go on-line. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Additional features of OJCCT * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +In the lengthy discussion that followed LEBRON's presentation, these +points emerged: + + * The SGML text can be tailored as users wish. + + * All these articles have a fairly simple document definition. + + * Document-type definitions (DTDs) were developed and given to OJCCT + for coding. + + * No articles will be removed from the journal. (Because there are + no back issues, there are no lost issues either. Once a subscriber + logs onto the journal he or she has access not only to the currently + published materials, but retrospectively to everything that has been + published in it. Thus the table of contents grows bigger. The date + of publication serves to distinguish between currently published + materials and older materials.) + + * The pricing system for the journal resembles that for most medical + journals: for 1992, $95 for a year, plus telecommunications charges + (there are no connect time charges); for 1993, $110 for the + entire year for single users, though the journal can be put on a + local area network (LAN). However, only one person can access the + journal at a time. Site licenses may come in the future. + + * AAAS is working closely with colleagues at OCLC to display + mathematical equations on screen. + + * Without compromising any steps in the editorial process, the + technology has reduced the time lag between when a manuscript is + originally submitted and the time it is accepted; the review process + does not differ greatly from the standard six-to-eight weeks + employed by many of the hard-copy journals. The process still + depends on people. + + * As far as a preservation copy is concerned, articles will be + maintained on the computer permanently and subscribers, as part of + their subscription, will receive a microfiche-quality archival copy + of everything published during that year; in addition, reprints can + be purchased in much the same way as in a hard-copy environment. + Hard copies are prepared but are not the primary medium for the + dissemination of the information. + + * Because OJCCT is not yet on line, it is difficult to know how many + people would simply browse through the journal on the screen as + opposed to downloading the whole thing and printing it out; a mix of + both types of users likely will result. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PERSONIUS * Developments in technology over the past decade * The CLASS +Project * Advantages for technology and for the CLASS Project * +Developing a network application an underlying assumption of the project +* Details of the scanning process * Print-on-demand copies of books * +Future plans include development of a browsing tool * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Lynne PERSONIUS, assistant director, Cornell Information Technologies for +Scholarly Information Services, Cornell University, first commented on +the tremendous impact that developments in technology over the past ten +years--networking, in particular--have had on the way information is +handled, and how, in her own case, these developments have counterbalanced +Cornell's relative geographical isolation. Other significant technologies +include scanners, which are much more sophisticated than they were ten years +ago; mass storage and the dramatic savings that result from it in terms of +both space and money relative to twenty or thirty years ago; new and +improved printing technologies, which have greatly affected the distribution +of information; and, of course, digital technologies, whose applicability to +library preservation remains at issue. + +Given that context, PERSONIUS described the College Library Access and +Storage System (CLASS) Project, a library preservation project, +primarily, and what has been accomplished. Directly funded by the +Commission on Preservation and Access and by the Xerox Corporation, which +has provided a significant amount of hardware, the CLASS Project has been +working with a development team at Xerox to develop a software +application tailored to library preservation requirements. Within +Cornell, participants in the project have been working jointly with both +library and information technologies. The focus of the project has been +on reformatting and saving books that are in brittle condition. +PERSONIUS showed Workshop participants a brittle book, and described how +such books were the result of developments in papermaking around the +beginning of the Industrial Revolution. The papermaking process was +changed so that a significant amount of acid was introduced into the +actual paper itself, which deteriorates as it sits on library shelves. + +One of the advantages for technology and for the CLASS Project is that +the information in brittle books is mostly out of copyright and thus +offers an opportunity to work with material that requires library +preservation, and to create and work on an infrastructure to save the +material. Acknowledging the familiarity of those working in preservation +with this information, PERSONIUS noted that several things are being +done: the primary preservation technology used today is photocopying of +brittle material. Saving the intellectual content of the material is the +main goal. With microfilm copy, the intellectual content is preserved on +the assumption that in the future the image can be reformatted in any +other way that then exists. + +An underlying assumption of the CLASS Project from the beginning was +that it would develop a network application. Project staff scan books +at a workstation located in the library, near the brittle material. +An image-server filing system is located at a distance from that +workstation, and a printer is located in another building. All of the +materials digitized and stored on the image-filing system are cataloged +in the on-line catalogue. In fact, a record for each of these electronic +books is stored in the RLIN database so that a record exists of what is +in the digital library throughout standard catalogue procedures. In the +future, researchers working from their own workstations in their offices, +or their networks, will have access--wherever they might be--through a +request server being built into the new digital library. A second +assumption is that the preferred means of finding the material will be by +looking through a catalogue. PERSONIUS described the scanning process, +which uses a prototype scanner being developed by Xerox and which scans a +very high resolution image at great speed. Another significant feature, +because this is a preservation application, is the placing of the pages +that fall apart one for one on the platen. Ordinarily, a scanner could +be used with some sort of a document feeder, but because of this +application that is not feasible. Further, because CLASS is a +preservation application, after the paper replacement is made there, a +very careful quality control check is performed. An original book is +compared to the printed copy and verification is made, before proceeding, +that all of the image, all of the information, has been captured. Then, +a new library book is produced: The printed images are rebound by a +commercial binder and a new book is returned to the shelf. +Significantly, the books returned to the library shelves are beautiful +and useful replacements on acid-free paper that should last a long time, +in effect, the equivalent of preservation photocopies. Thus, the project +has a library of digital books. In essence, CLASS is scanning and +storing books as 600 dot-per-inch bit-mapped images, compressed using +Group 4 CCITT (i.e., the French acronym for International Consultative +Committee for Telegraph and Telephone) compression. They are stored as +TIFF files on an optical filing system that is composed of a database +used for searching and locating the books and an optical jukebox that +stores 64 twelve-inch platters. A very-high-resolution printed copy of +these books at 600 dots per inch is created, using a Xerox DocuTech +printer to make the paper replacements on acid-free paper. + +PERSONIUS maintained that the CLASS Project presents an opportunity to +introduce people to books as digital images by using a paper medium. +Books are returned to the shelves while people are also given the ability +to print on demand--to make their own copies of books. (PERSONIUS +distributed copies of an engineering journal published by engineering +students at Cornell around 1900 as an example of what a print-on-demand +copy of material might be like. This very cheap copy would be available +to people to use for their own research purposes and would bridge the gap +between an electronic work and the paper that readers like to have.) +PERSONIUS then attempted to illustrate a very early prototype of +networked access to this digital library. Xerox Corporation has +developed a prototype of a view station that can send images across the +network to be viewed. + +The particular library brought down for demonstration contained two +mathematics books. CLASS is developing and will spend the next year +developing an application that allows people at workstations to browse +the books. Thus, CLASS is developing a browsing tool, on the assumption +that users do not want to read an entire book from a workstation, but +would prefer to be able to look through and decide if they would like to +have a printed copy of it. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Re retrieval software * "Digital file copyright" * Scanning +rate during production * Autosegmentation * Criteria employed in +selecting books for scanning * Compression and decompression of images * +OCR not precluded * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the question-and-answer period that followed her presentation, +PERSONIUS made these additional points: + + * Re retrieval software, Cornell is developing a Unix-based server + as well as clients for the server that support multiple platforms + (Macintosh, IBM and Sun workstations), in the hope that people from + any of those platforms will retrieve books; a further operating + assumption is that standard interfaces will be used as much as + possible, where standards can be put in place, because CLASS + considers this retrieval software a library application and would + like to be able to look at material not only at Cornell but at other + institutions. + + * The phrase "digital file copyright by Cornell University" was + added at the advice of Cornell's legal staff with the caveat that it + probably would not hold up in court. Cornell does not want people + to copy its books and sell them but would like to keep them + available for use in a library environment for library purposes. + + * In production the scanner can scan about 300 pages per hour, + capturing 600 dots per inch. + + * The Xerox software has filters to scan halftone material and avoid + the moire patterns that occur when halftone material is scanned. + Xerox has been working on hardware and software that would enable + the scanner itself to recognize this situation and deal with it + appropriately--a kind of autosegmentation that would enable the + scanner to handle halftone material as well as text on a single page. + + * The books subjected to the elaborate process described above were + selected because CLASS is a preservation project, with the first 500 + books selected coming from Cornell's mathematics collection, because + they were still being heavily used and because, although they were + in need of preservation, the mathematics library and the mathematics + faculty were uncomfortable having them microfilmed. (They wanted a + printed copy.) Thus, these books became a logical choice for this + project. Other books were chosen by the project's selection committees + for experiments with the technology, as well as to meet a demand or need. + + * Images will be decompressed before they are sent over the line; at + this time they are compressed and sent to the image filing system + and then sent to the printer as compressed images; they are returned + to the workstation as compressed 600-dpi images and the workstation + decompresses and scales them for display--an inefficient way to + access the material though it works quite well for printing and + other purposes. + + * CLASS is also decompressing on Macintosh and IBM, a slow process + right now. Eventually, compression and decompression will take + place on an image conversion server. Trade-offs will be made, based + on future performance testing, concerning where the file is + compressed and what resolution image is sent. + + * OCR has not been precluded; images are being stored that have been + scanned at a high resolution, which presumably would suit them well + to an OCR process. Because the material being scanned is about 100 + years old and was printed with less-than-ideal technologies, very + early and preliminary tests have not produced good results. But the + project is capturing an image that is of sufficient resolution to be + subjected to OCR in the future. Moreover, the system architecture + and the system plan have a logical place to store an OCR image if it + has been captured. But that is not being done now. + + ****** + +SESSION III. DISTRIBUTION, NETWORKS, AND NETWORKING: OPTIONS FOR +DISSEMINATION + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ZICH * Issues pertaining to CD-ROMs * Options for publishing in CD-ROM * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Robert ZICH, special assistant to the associate librarian for special +projects, Library of Congress, and moderator of this session, first noted +the blessed but somewhat awkward circumstance of having four very +distinguished people representing networks and networking or at least +leaning in that direction, while lacking anyone to speak from the +strongest possible background in CD-ROMs. ZICH expressed the hope that +members of the audience would join the discussion. He stressed the +subtitle of this particular session, "Options for Dissemination," and, +concerning CD-ROMs, the importance of determining when it would be wise +to consider dissemination in CD-ROM versus networks. A shopping list of +issues pertaining to CD-ROMs included: the grounds for selecting +commercial publishers, and in-house publication where possible versus +nonprofit or government publication. A similar list for networks +included: determining when one should consider dissemination through a +network, identifying the mechanisms or entities that exist to place items +on networks, identifying the pool of existing networks, determining how a +producer would choose between networks, and identifying the elements of +a business arrangement in a network. + +Options for publishing in CD-ROM: an outside publisher versus +self-publication. If an outside publisher is used, it can be nonprofit, +such as the Government Printing Office (GPO) or the National Technical +Information Service (NTIS), in the case of government. The pros and cons +associated with employing an outside publisher are obvious. Among the +pros, there is no trouble getting accepted. One pays the bill and, in +effect, goes one's way. Among the cons, when one pays an outside +publisher to perform the work, that publisher will perform the work it is +obliged to do, but perhaps without the production expertise and skill in +marketing and dissemination that some would seek. There is the body of +commercial publishers that do possess that kind of expertise in +distribution and marketing but that obviously are selective. In +self-publication, one exercises full control, but then one must handle +matters such as distribution and marketing. Such are some of the options +for publishing in the case of CD-ROM. + +In the case of technical and design issues, which are also important, +there are many matters which many at the Workshop already knew a good +deal about: retrieval system requirements and costs, what to do about +images, the various capabilities and platforms, the trade-offs between +cost and performance, concerns about local-area networkability, +interoperability, etc. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +LYNCH * Creating networked information is different from using networks +as an access or dissemination vehicle * Networked multimedia on a large +scale does not yet work * Typical CD-ROM publication model a two-edged +sword * Publishing information on a CD-ROM in the present world of +immature standards * Contrast between CD-ROM and network pricing * +Examples demonstrated earlier in the day as a set of insular information +gems * Paramount need to link databases * Layering to become increasingly +necessary * Project NEEDS and the issues of information reuse and active +versus passive use * X-Windows as a way of differentiating between +network access and networked information * Barriers to the distribution +of networked multimedia information * Need for good, real-time delivery +protocols * The question of presentation integrity in client-server +computing in the academic world * Recommendations for producing multimedia ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Clifford LYNCH, director, Library Automation, University of California, +opened his talk with the general observation that networked information +constituted a difficult and elusive topic because it is something just +starting to develop and not yet fully understood. LYNCH contended that +creating genuinely networked information was different from using +networks as an access or dissemination vehicle and was more sophisticated +and more subtle. He invited the members of the audience to extrapolate, +from what they heard about the preceding demonstration projects, to what +sort of a world of electronics information--scholarly, archival, +cultural, etc.--they wished to end up with ten or fifteen years from now. +LYNCH suggested that to extrapolate directly from these projects would +produce unpleasant results. + +Putting the issue of CD-ROM in perspective before getting into +generalities on networked information, LYNCH observed that those engaged +in multimedia today who wish to ship a product, so to say, probably do +not have much choice except to use CD-ROM: networked multimedia on a +large scale basically does not yet work because the technology does not +exist. For example, anybody who has tried moving images around over the +Internet knows that this is an exciting touch-and-go process, a +fascinating and fertile area for experimentation, research, and +development, but not something that one can become deeply enthusiastic +about committing to production systems at this time. + +This situation will change, LYNCH said. He differentiated CD-ROM from +the practices that have been followed up to now in distributing data on +CD-ROM. For LYNCH the problem with CD-ROM is not its portability or its +slowness but the two-edged sword of having the retrieval application and +the user interface inextricably bound up with the data, which is the +typical CD-ROM publication model. It is not a case of publishing data +but of distributing a typically stand-alone, typically closed system, +all--software, user interface, and data--on a little disk. Hence, all +the between-disk navigational issues as well as the impossibility in most +cases of integrating data on one disk with that on another. Most CD-ROM +retrieval software does not network very gracefully at present. However, +in the present world of immature standards and lack of understanding of +what network information is or what the ground rules are for creating or +using it, publishing information on a CD-ROM does add value in a very +real sense. + +LYNCH drew a contrast between CD-ROM and network pricing and in doing so +highlighted something bizarre in information pricing. A large +institution such as the University of California has vendors who will +offer to sell information on CD-ROM for a price per year in four digits, +but for the same data (e.g., an abstracting and indexing database) on +magnetic tape, regardless of how many people may use it concurrently, +will quote a price in six digits. + +What is packaged with the CD-ROM in one sense adds value--a complete +access system, not just raw, unrefined information--although it is not +generally perceived that way. This is because the access software, +although it adds value, is viewed by some people, particularly in the +university environment where there is a very heavy commitment to +networking, as being developed in the wrong direction. + +Given that context, LYNCH described the examples demonstrated as a set of +insular information gems--Perseus, for example, offers nicely linked +information, but would be very difficult to integrate with other +databases, that is, to link together seamlessly with other source files +from other sources. It resembles an island, and in this respect is +similar to numerous stand-alone projects that are based on videodiscs, +that is, on the single-workstation concept. + +As scholarship evolves in a network environment, the paramount need will +be to link databases. We must link personal databases to public +databases, to group databases, in fairly seamless ways--which is +extremely difficult in the environments under discussion with copies of +databases proliferating all over the place. + +The notion of layering also struck LYNCH as lurking in several of the +projects demonstrated. Several databases in a sense constitute +information archives without a significant amount of navigation built in. +Educators, critics, and others will want a layered structure--one that +defines or links paths through the layers to allow users to reach +specific points. In LYNCH's view, layering will become increasingly +necessary, and not just within a single resource but across resources +(e.g., tracing mythology and cultural themes across several classics +databases as well as a database of Renaissance culture). This ability to +organize resources, to build things out of multiple other things on the +network or select pieces of it, represented for LYNCH one of the key +aspects of network information. + +Contending that information reuse constituted another significant issue, +LYNCH commended to the audience's attention Project NEEDS (i.e., National +Engineering Education Delivery System). This project's objective is to +produce a database of engineering courseware as well as the components +that can be used to develop new courseware. In a number of the existing +applications, LYNCH said, the issue of reuse (how much one can take apart +and reuse in other applications) was not being well considered. He also +raised the issue of active versus passive use, one aspect of which is +how much information will be manipulated locally by users. Most people, +he argued, may do a little browsing and then will wish to print. LYNCH +was uncertain how these resources would be used by the vast majority of +users in the network environment. + +LYNCH next said a few words about X-Windows as a way of differentiating +between network access and networked information. A number of the +applications demonstrated at the Workshop could be rewritten to use X +across the network, so that one could run them from any X-capable device- +-a workstation, an X terminal--and transact with a database across the +network. Although this opens up access a little, assuming one has enough +network to handle it, it does not provide an interface to develop a +program that conveniently integrates information from multiple databases. +X is a viewing technology that has limits. In a real sense, it is just a +graphical version of remote log-in across the network. X-type applications +represent only one step in the progression towards real access. + +LYNCH next discussed barriers to the distribution of networked multimedia +information. The heart of the problem is a lack of standards to provide +the ability for computers to talk to each other, retrieve information, +and shuffle it around fairly casually. At the moment, little progress is +being made on standards for networked information; for example, present +standards do not cover images, digital voice, and digital video. A +useful tool kit of exchange formats for basic texts is only now being +assembled. The synchronization of content streams (i.e., synchronizing a +voice track to a video track, establishing temporal relations between +different components in a multimedia object) constitutes another issue +for networked multimedia that is just beginning to receive attention. + +Underlying network protocols also need some work; good, real-time +delivery protocols on the Internet do not yet exist. In LYNCH's view, +highly important in this context is the notion of networked digital +object IDs, the ability of one object on the network to point to another +object (or component thereof) on the network. Serious bandwidth issues +also exist. LYNCH was uncertain if billion-bit-per-second networks would +prove sufficient if numerous people ran video in parallel. + +LYNCH concluded by offering an issue for database creators to consider, +as well as several comments about what might constitute good trial +multimedia experiments. In a networked information world the database +builder or service builder (publisher) does not exercise the same +extensive control over the integrity of the presentation; strange +programs "munge" with one's data before the user sees it. Serious +thought must be given to what guarantees integrity of presentation. Part +of that is related to where one draws the boundaries around a networked +information service. This question of presentation integrity in +client-server computing has not been stressed enough in the academic +world, LYNCH argued, though commercial service providers deal with it +regularly. + +Concerning multimedia, LYNCH observed that good multimedia at the moment +is hideously expensive to produce. He recommended producing multimedia +with either very high sale value, or multimedia with a very long life +span, or multimedia that will have a very broad usage base and whose +costs therefore can be amortized among large numbers of users. In this +connection, historical and humanistically oriented material may be a good +place to start, because it tends to have a longer life span than much of +the scientific material, as well as a wider user base. LYNCH noted, for +example, that American Memory fits many of the criteria outlined. He +remarked the extensive discussion about bringing the Internet or the +National Research and Education Network (NREN) into the K-12 environment +as a way of helping the American educational system. + +LYNCH closed by noting that the kinds of applications demonstrated struck +him as excellent justifications of broad-scale networking for K-12, but +that at this time no "killer" application exists to mobilize the K-12 +community to obtain connectivity. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Dearth of genuinely interesting applications on the network +a slow-changing situation * The issue of the integrity of presentation in +a networked environment * Several reasons why CD-ROM software does not +network * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the discussion period that followed LYNCH's presentation, several +additional points were made. + +LYNCH reiterated even more strongly his contention that, historically, +once one goes outside high-end science and the group of those who need +access to supercomputers, there is a great dearth of genuinely +interesting applications on the network. He saw this situation changing +slowly, with some of the scientific databases and scholarly discussion +groups and electronic journals coming on as well as with the availability +of Wide Area Information Servers (WAIS) and some of the databases that +are being mounted there. However, many of those things do not seem to +have piqued great popular interest. For instance, most high school +students of LYNCH's acquaintance would not qualify as devotees of serious +molecular biology. + +Concerning the issue of the integrity of presentation, LYNCH believed +that a couple of information providers have laid down the law at least on +certain things. For example, his recollection was that the National +Library of Medicine feels strongly that one needs to employ the +identifier field if he or she is to mount a database commercially. The +problem with a real networked environment is that one does not know who +is reformatting and reprocessing one's data when one enters a client +server mode. It becomes anybody's guess, for example, if the network +uses a Z39.50 server, or what clients are doing with one's data. A data +provider can say that his contract will only permit clients to have +access to his data after he vets them and their presentation and makes +certain it suits him. But LYNCH held out little expectation that the +network marketplace would evolve in that way, because it required too +much prior negotiation. + +CD-ROM software does not network for a variety of reasons, LYNCH said. +He speculated that CD-ROM publishers are not eager to have their products +really hook into wide area networks, because they fear it will make their +data suppliers nervous. Moreover, until relatively recently, one had to +be rather adroit to run a full TCP/IP stack plus applications on a +PC-size machine, whereas nowadays it is becoming easier as PCs grow +bigger and faster. LYNCH also speculated that software providers had not +heard from their customers until the last year or so, or had not heard +from enough of their customers. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +BESSER * Implications of disseminating images on the network; planning +the distribution of multimedia documents poses two critical +implementation problems * Layered approach represents the way to deal +with users' capabilities * Problems in platform design; file size and its +implications for networking * Transmission of megabyte size images +impractical * Compression and decompression at the user's end * Promising +trends for compression * A disadvantage of using X-Windows * A project at +the Smithsonian that mounts images on several networks * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Howard BESSER, School of Library and Information Science, University of +Pittsburgh, spoke primarily about multimedia, focusing on images and the +broad implications of disseminating them on the network. He argued that +planning the distribution of multimedia documents posed two critical +implementation problems, which he framed in the form of two questions: +1) What platform will one use and what hardware and software will users +have for viewing of the material? and 2) How can one deliver a +sufficiently robust set of information in an accessible format in a +reasonable amount of time? Depending on whether network or CD-ROM is the +medium used, this question raises different issues of storage, +compression, and transmission. + +Concerning the design of platforms (e.g., sound, gray scale, simple +color, etc.) and the various capabilities users may have, BESSER +maintained that a layered approach was the way to deal with users' +capabilities. A result would be that users with less powerful +workstations would simply have less functionality. He urged members of +the audience to advocate standards and accompanying software that handle +layered functionality across a wide variety of platforms. + +BESSER also addressed problems in platform design, namely, deciding how +large a machine to design for situations when the largest number of users +have the lowest level of the machine, and one desires higher +functionality. BESSER then proceeded to the question of file size and +its implications for networking. He discussed still images in the main. +For example, a digital color image that fills the screen of a standard +mega-pel workstation (Sun or Next) will require one megabyte of storage +for an eight-bit image or three megabytes of storage for a true color or +twenty-four-bit image. Lossless compression algorithms (that is, +computational procedures in which no data is lost in the process of +compressing [and decompressing] an image--the exact bit-representation is +maintained) might bring storage down to a third of a megabyte per image, +but not much further than that. The question of size makes it difficult +to fit an appropriately sized set of these images on a single disk or to +transmit them quickly enough on a network. + +With these full screen mega-pel images that constitute a third of a +megabyte, one gets 1,000-3,000 full-screen images on a one-gigabyte disk; +a standard CD-ROM represents approximately 60 percent of that. Storing +images the size of a PC screen (just 8 bit color) increases storage +capacity to 4,000-12,000 images per gigabyte; 60 percent of that gives +one the size of a CD-ROM, which in turn creates a major problem. One +cannot have full-screen, full-color images with lossless compression; one +must compress them or use a lower resolution. For megabyte-size images, +anything slower than a T-1 speed is impractical. For example, on a +fifty-six-kilobaud line, it takes three minutes to transfer a +one-megabyte file, if it is not compressed; and this speed assumes ideal +circumstances (no other user contending for network bandwidth). Thus, +questions of disk access, remote display, and current telephone +connection speed make transmission of megabyte-size images impractical. + +BESSER then discussed ways to deal with these large images, for example, +compression and decompression at the user's end. In this connection, the +issues of how much one is willing to lose in the compression process and +what image quality one needs in the first place are unknown. But what is +known is that compression entails some loss of data. BESSER urged that +more studies be conducted on image quality in different situations, for +example, what kind of images are needed for what kind of disciplines, and +what kind of image quality is needed for a browsing tool, an intermediate +viewing tool, and archiving. + +BESSER remarked two promising trends for compression: from a technical +perspective, algorithms that use what is called subjective redundancy +employ principles from visual psycho-physics to identify and remove +information from the image that the human eye cannot perceive; from an +interchange and interoperability perspective, the JPEG (i.e., Joint +Photographic Experts Group, an ISO standard) compression algorithms also +offer promise. These issues of compression and decompression, BESSER +argued, resembled those raised earlier concerning the design of different +platforms. Gauging the capabilities of potential users constitutes a +primary goal. BESSER advocated layering or separating the images from +the applications that retrieve and display them, to avoid tying them to +particular software. + +BESSER detailed several lessons learned from his work at Berkeley with +Imagequery, especially the advantages and disadvantages of using +X-Windows. In the latter category, for example, retrieval is tied +directly to one's data, an intolerable situation in the long run on a +networked system. Finally, BESSER described a project of Jim Wallace at +the Smithsonian Institution, who is mounting images in a extremely +rudimentary way on the Compuserv and Genie networks and is preparing to +mount them on America On Line. Although the average user takes over +thirty minutes to download these images (assuming a fairly fast modem), +nevertheless, images have been downloaded 25,000 times. + +BESSER concluded his talk with several comments on the business +arrangement between the Smithsonian and Compuserv. He contended that not +enough is known concerning the value of images. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Creating digitized photographic collections nearly +impossible except with large organizations like museums * Need for study +to determine quality of images users will tolerate * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the brief exchange between LESK and BESSER that followed, several +clarifications emerged. + +LESK argued that the photographers were far ahead of BESSER: It is +almost impossible to create such digitized photographic collections +except with large organizations like museums, because all the +photographic agencies have been going crazy about this and will not sign +licensing agreements on any sort of reasonable terms. LESK had heard +that National Geographic, for example, had tried to buy the right to use +some image in some kind of educational production for $100 per image, but +the photographers will not touch it. They want accounting and payment +for each use, which cannot be accomplished within the system. BESSER +responded that a consortium of photographers, headed by a former National +Geographic photographer, had started assembling its own collection of +electronic reproductions of images, with the money going back to the +cooperative. + +LESK contended that BESSER was unnecessarily pessimistic about multimedia +images, because people are accustomed to low-quality images, particularly +from video. BESSER urged the launching of a study to determine what +users would tolerate, what they would feel comfortable with, and what +absolutely is the highest quality they would ever need. Conceding that +he had adopted a dire tone in order to arouse people about the issue, +BESSER closed on a sanguine note by saying that he would not be in this +business if he did not think that things could be accomplished. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +LARSEN * Issues of scalability and modularity * Geometric growth of the +Internet and the role played by layering * Basic functions sustaining +this growth * A library's roles and functions in a network environment * +Effects of implementation of the Z39.50 protocol for information +retrieval on the library system * The trade-off between volumes of data +and its potential usage * A snapshot of current trends * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Ronald LARSEN, associate director for information technology, University +of Maryland at College Park, first addressed the issues of scalability +and modularity. He noted the difficulty of anticipating the effects of +orders-of-magnitude growth, reflecting on the twenty years of experience +with the Arpanet and Internet. Recalling the day's demonstrations of +CD-ROM and optical disk material, he went on to ask if the field has yet +learned how to scale new systems to enable delivery and dissemination +across large-scale networks. + +LARSEN focused on the geometric growth of the Internet from its inception +circa 1969 to the present, and the adjustments required to respond to +that rapid growth. To illustrate the issue of scalability, LARSEN +considered computer networks as including three generic components: +computers, network communication nodes, and communication media. Each +component scales (e.g., computers range from PCs to supercomputers; +network nodes scale from interface cards in a PC through sophisticated +routers and gateways; and communication media range from 2,400-baud +dial-up facilities through 4.5-Mbps backbone links, and eventually to +multigigabit-per-second communication lines), and architecturally, the +components are organized to scale hierarchically from local area networks +to international-scale networks. Such growth is made possible by +building layers of communication protocols, as BESSER pointed out. +By layering both physically and logically, a sense of scalability is +maintained from local area networks in offices, across campuses, through +bridges, routers, campus backbones, fiber-optic links, etc., up into +regional networks and ultimately into national and international +networks. + +LARSEN then illustrated the geometric growth over a two-year period-- +through September 1991--of the number of networks that comprise the +Internet. This growth has been sustained largely by the availability of +three basic functions: electronic mail, file transfer (ftp), and remote +log-on (telnet). LARSEN also reviewed the growth in the kind of traffic +that occurs on the network. Network traffic reflects the joint contributions +of a larger population of users and increasing use per user. Today one sees +serious applications involving moving images across the network--a rarity +ten years ago. LARSEN recalled and concurred with BESSER's main point +that the interesting problems occur at the application level. + +LARSEN then illustrated a model of a library's roles and functions in a +network environment. He noted, in particular, the placement of on-line +catalogues onto the network and patrons obtaining access to the library +increasingly through local networks, campus networks, and the Internet. +LARSEN supported LYNCH's earlier suggestion that we need to address +fundamental questions of networked information in order to build +environments that scale in the information sense as well as in the +physical sense. + +LARSEN supported the role of the library system as the access point into +the nation's electronic collections. Implementation of the Z39.50 +protocol for information retrieval would make such access practical and +feasible. For example, this would enable patrons in Maryland to search +California libraries, or other libraries around the world that are +conformant with Z39.50 in a manner that is familiar to University of +Maryland patrons. This client-server model also supports moving beyond +secondary content into primary content. (The notion of how one links +from secondary content to primary content, LARSEN said, represents a +fundamental problem that requires rigorous thought.) After noting +numerous network experiments in accessing full-text materials, including +projects supporting the ordering of materials across the network, LARSEN +revisited the issue of transmitting high-density, high-resolution color +images across the network and the large amounts of bandwidth they +require. He went on to address the bandwidth and synchronization +problems inherent in sending full-motion video across the network. + +LARSEN illustrated the trade-off between volumes of data in bytes or +orders of magnitude and the potential usage of that data. He discussed +transmission rates (particularly, the time it takes to move various forms +of information), and what one could do with a network supporting +multigigabit-per-second transmission. At the moment, the network +environment includes a composite of data-transmission requirements, +volumes and forms, going from steady to bursty (high-volume) and from +very slow to very fast. This aggregate must be considered in the design, +construction, and operation of multigigabyte networks. + +LARSEN's objective is to use the networks and library systems now being +constructed to increase access to resources wherever they exist, and +thus, to evolve toward an on-line electronic virtual library. + +LARSEN concluded by offering a snapshot of current trends: continuing +geometric growth in network capacity and number of users; slower +development of applications; and glacial development and adoption of +standards. The challenge is to design and develop each new application +system with network access and scalability in mind. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +BROWNRIGG * Access to the Internet cannot be taken for granted * Packet +radio and the development of MELVYL in 1980-81 in the Division of Library +Automation at the University of California * Design criteria for packet +radio * A demonstration project in San Diego and future plans * Spread +spectrum * Frequencies at which the radios will run and plans to +reimplement the WAIS server software in the public domain * Need for an +infrastructure of radios that do not move around * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Edwin BROWNRIGG, executive director, Memex Research Institute, first +polled the audience in order to seek out regular users of the Internet as +well as those planning to use it some time in the future. With nearly +everybody in the room falling into one category or the other, BROWNRIGG +made a point re access, namely that numerous individuals, especially those +who use the Internet every day, take for granted their access to it, the +speeds with which they are connected, and how well it all works. +However, as BROWNRIGG discovered between 1987 and 1989 in Australia, +if one wants access to the Internet but cannot afford it or has some +physical boundary that prevents her or him from gaining access, it can +be extremely frustrating. He suggested that because of economics and +physical barriers we were beginning to create a world of haves and have-nots +in the process of scholarly communication, even in the United States. + +BROWNRIGG detailed the development of MELVYL in academic year 1980-81 in +the Division of Library Automation at the University of California, in +order to underscore the issue of access to the system, which at the +outset was extremely limited. In short, the project needed to build a +network, which at that time entailed use of satellite technology, that is, +putting earth stations on campus and also acquiring some terrestrial links +from the State of California's microwave system. The installation of +satellite links, however, did not solve the problem (which actually +formed part of a larger problem involving politics and financial resources). +For while the project team could get a signal onto a campus, it had no means +of distributing the signal throughout the campus. The solution involved +adopting a recent development in wireless communication called packet radio, +which combined the basic notion of packet-switching with radio. The project +used this technology to get the signal from a point on campus where it +came down, an earth station for example, into the libraries, because it +found that wiring the libraries, especially the older marble buildings, +would cost $2,000-$5,000 per terminal. + +BROWNRIGG noted that, ten years ago, the project had neither the public +policy nor the technology that would have allowed it to use packet radio +in any meaningful way. Since then much had changed. He proceeded to +detail research and development of the technology, how it is being +deployed in California, and what direction he thought it would take. +The design criteria are to produce a high-speed, one-time, low-cost, +high-quality, secure, license-free device (packet radio) that one can +plug in and play today, forget about it, and have access to the Internet. +By high speed, BROWNRIGG meant 1 megabyte and 1.5 megabytes. Those units +have been built, he continued, and are in the process of being +type-certified by an independent underwriting laboratory so that they can +be type-licensed by the Federal Communications Commission. As is the +case with citizens band, one will be able to purchase a unit and not have +to worry about applying for a license. + +The basic idea, BROWNRIGG elaborated, is to take high-speed radio data +transmission and create a backbone network that at certain strategic +points in the network will "gateway" into a medium-speed packet radio +(i.e., one that runs at 38.4 kilobytes), so that perhaps by 1994-1995 +people, like those in the audience for the price of a VCR could purchase +a medium-speed radio for the office or home, have full network connectivity +to the Internet, and partake of all its services, with no need for an FCC +license and no regular bill from the local common carrier. BROWNRIGG +presented several details of a demonstration project currently taking +place in San Diego and described plans, pending funding, to install a +full-bore network in the San Francisco area. This network will have 600 +nodes running at backbone speeds, and 100 of these nodes will be libraries, +which in turn will be the gateway ports to the 38.4 kilobyte radios that +will give coverage for the neighborhoods surrounding the libraries. + +BROWNRIGG next explained Part 15.247, a new rule within Title 47 of the +Code of Federal Regulations enacted by the FCC in 1985. This rule +challenged the industry, which has only now risen to the occasion, to +build a radio that would run at no more than one watt of output power and +use a fairly exotic method of modulating the radio wave called spread +spectrum. Spread spectrum in fact permits the building of networks so +that numerous data communications can occur simultaneously, without +interfering with each other, within the same wide radio channel. + +BROWNRIGG explained that the frequencies at which the radios would run +are very short wave signals. They are well above standard microwave and +radar. With a radio wave that small, one watt becomes a tremendous punch +per bit and thus makes transmission at reasonable speed possible. In +order to minimize the potential for congestion, the project is +undertaking to reimplement software which has been available in the +networking business and is taken for granted now, for example, TCP/IP, +routing algorithms, bridges, and gateways. In addition, the project +plans to take the WAIS server software in the public domain and +reimplement it so that one can have a WAIS server on a Mac instead of a +Unix machine. The Memex Research Institute believes that libraries, in +particular, will want to use the WAIS servers with packet radio. This +project, which has a team of about twelve people, will run through 1993 +and will include the 100 libraries already mentioned as well as other +professionals such as those in the medical profession, engineering, and +law. Thus, the need is to create an infrastructure of radios that do not +move around, which, BROWNRIGG hopes, will solve a problem not only for +libraries but for individuals who, by and large today, do not have access +to the Internet from their homes and offices. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Project operating frequencies * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During a brief discussion period, which also concluded the day's +proceedings, BROWNRIGG stated that the project was operating in four +frequencies. The slow speed is operating at 435 megahertz, and it would +later go up to 920 megahertz. With the high-speed frequency, the +one-megabyte radios will run at 2.4 gigabits, and 1.5 will run at 5.7. +At 5.7, rain can be a factor, but it would have to be tropical rain, +unlike what falls in most parts of the United States. + + ****** + +SESSION IV. IMAGE CAPTURE, TEXT CAPTURE, OVERVIEW OF TEXT AND + IMAGE STORAGE FORMATS + +William HOOTON, vice president of operations, I-NET, moderated this session. + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +KENNEY * Factors influencing development of CXP * Advantages of using +digital technology versus photocopy and microfilm * A primary goal of +CXP; publishing challenges * Characteristics of copies printed * Quality +of samples achieved in image capture * Several factors to be considered +in choosing scanning * Emphasis of CXP on timely and cost-effective +production of black-and-white printed facsimiles * Results of producing +microfilm from digital files * Advantages of creating microfilm * Details +concerning production * Costs * Role of digital technology in library +preservation * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Anne KENNEY, associate director, Department of Preservation and +Conservation, Cornell University, opened her talk by observing that the +Cornell Xerox Project (CXP) has been guided by the assumption that the +ability to produce printed facsimiles or to replace paper with paper +would be important, at least for the present generation of users and +equipment. She described three factors that influenced development of +the project: 1) Because the project has emphasized the preservation of +deteriorating brittle books, the quality of what was produced had to be +sufficiently high to return a paper replacement to the shelf. CXP was +only interested in using: 2) a system that was cost-effective, which +meant that it had to be cost-competitive with the processes currently +available, principally photocopy and microfilm, and 3) new or currently +available product hardware and software. + +KENNEY described the advantages that using digital technology offers over +both photocopy and microfilm: 1) The potential exists to create a higher +quality reproduction of a deteriorating original than conventional +light-lens technology. 2) Because a digital image is an encoded +representation, it can be reproduced again and again with no resulting +loss of quality, as opposed to the situation with light-lens processes, +in which there is discernible difference between a second and a +subsequent generation of an image. 3) A digital image can be manipulated +in a number of ways to improve image capture; for example, Xerox has +developed a windowing application that enables one to capture a page +containing both text and illustrations in a manner that optimizes the +reproduction of both. (With light-lens technology, one must choose which +to optimize, text or the illustration; in preservation microfilming, the +current practice is to shoot an illustrated page twice, once to highlight +the text and the second time to provide the best capture for the +illustration.) 4) A digital image can also be edited, density levels +adjusted to remove underlining and stains, and to increase legibility for +faint documents. 5) On-screen inspection can take place at the time of +initial setup and adjustments made prior to scanning, factors that +substantially reduce the number of retakes required in quality control. + +A primary goal of CXP has been to evaluate the paper output printed on +the Xerox DocuTech, a high-speed printer that produces 600-dpi pages from +scanned images at a rate of 135 pages a minute. KENNEY recounted several +publishing challenges to represent faithful and legible reproductions of +the originals that the 600-dpi copy for the most part successfully +captured. For example, many of the deteriorating volumes in the project +were heavily illustrated with fine line drawings or halftones or came in +languages such as Japanese, in which the buildup of characters comprised +of varying strokes is difficult to reproduce at lower resolutions; a +surprising number of them came with annotations and mathematical +formulas, which it was critical to be able to duplicate exactly. + +KENNEY noted that 1) the copies are being printed on paper that meets the +ANSI standards for performance, 2) the DocuTech printer meets the machine +and toner requirements for proper adhesion of print to page, as described +by the National Archives, and thus 3) paper product is considered to be +the archival equivalent of preservation photocopy. + +KENNEY then discussed several samples of the quality achieved in the +project that had been distributed in a handout, for example, a copy of a +print-on-demand version of the 1911 Reed lecture on the steam turbine, +which contains halftones, line drawings, and illustrations embedded in +text; the first four loose pages in the volume compared the capture +capabilities of scanning to photocopy for a standard test target, the +IEEE standard 167A 1987 test chart. In all instances scanning proved +superior to photocopy, though only slightly more so in one. + +Conceding the simplistic nature of her review of the quality of scanning +to photocopy, KENNEY described it as one representation of the kinds of +settings that could be used with scanning capabilities on the equipment +CXP uses. KENNEY also pointed out that CXP investigated the quality +achieved with binary scanning only, and noted the great promise in gray +scale and color scanning, whose advantages and disadvantages need to be +examined. She argued further that scanning resolutions and file formats +can represent a complex trade-off between the time it takes to capture +material, file size, fidelity to the original, and on-screen display; and +printing and equipment availability. All these factors must be taken +into consideration. + +CXP placed primary emphasis on the production in a timely and +cost-effective manner of printed facsimiles that consisted largely of +black-and-white text. With binary scanning, large files may be +compressed efficiently and in a lossless manner (i.e., no data is lost in +the process of compressing [and decompressing] an image--the exact +bit-representation is maintained) using Group 4 CCITT (i.e., the French +acronym for International Consultative Committee for Telegraph and +Telephone) compression. CXP was getting compression ratios of about +forty to one. Gray-scale compression, which primarily uses JPEG, is much +less economical and can represent a lossy compression (i.e., not +lossless), so that as one compresses and decompresses, the illustration +is subtly changed. While binary files produce a high-quality printed +version, it appears 1) that other combinations of spatial resolution with +gray and/or color hold great promise as well, and 2) that gray scale can +represent a tremendous advantage for on-screen viewing. The quality +associated with binary and gray scale also depends on the equipment used. +For instance, binary scanning produces a much better copy on a binary +printer. + +Among CXP's findings concerning the production of microfilm from digital +files, KENNEY reported that the digital files for the same Reed lecture +were used to produce sample film using an electron beam recorder. The +resulting film was faithful to the image capture of the digital files, +and while CXP felt that the text and image pages represented in the Reed +lecture were superior to that of the light-lens film, the resolution +readings for the 600 dpi were not as high as standard microfilming. +KENNEY argued that the standards defined for light-lens technology are +not totally transferable to a digital environment. Moreover, they are +based on definition of quality for a preservation copy. Although making +this case will prove to be a long, uphill struggle, CXP plans to continue +to investigate the issue over the course of the next year. + +KENNEY concluded this portion of her talk with a discussion of the +advantages of creating film: it can serve as a primary backup and as a +preservation master to the digital file; it could then become the print +or production master and service copies could be paper, film, optical +disks, magnetic media, or on-screen display. + +Finally, KENNEY presented details re production: + + * Development and testing of a moderately-high resolution production + scanning workstation represented a third goal of CXP; to date, 1,000 + volumes have been scanned, or about 300,000 images. + + * The resulting digital files are stored and used to produce + hard-copy replacements for the originals and additional prints on + demand; although the initial costs are high, scanning technology + offers an affordable means for reformatting brittle material. + + * A technician in production mode can scan 300 pages per hour when + performing single-sheet scanning, which is a necessity when working + with truly brittle paper; this figure is expected to increase + significantly with subsequent iterations of the software from Xerox; + a three-month time-and-cost study of scanning found that the average + 300-page book would take about an hour and forty minutes to scan + (this figure included the time for setup, which involves keying in + primary bibliographic data, going into quality control mode to + define page size, establishing front-to-back registration, and + scanning sample pages to identify a default range of settings for + the entire book--functions not dissimilar to those performed by + filmers or those preparing a book for photocopy). + + * The final step in the scanning process involved rescans, which + happily were few and far between, representing well under 1 percent + of the total pages scanned. + +In addition to technician time, CXP costed out equipment, amortized over +four years, the cost of storing and refreshing the digital files every +four years, and the cost of printing and binding, book-cloth binding, a +paper reproduction. The total amounted to a little under $65 per single +300-page volume, with 30 percent overhead included--a figure competitive +with the prices currently charged by photocopy vendors. + +Of course, with scanning, in addition to the paper facsimile, one is left +with a digital file from which subsequent copies of the book can be +produced for a fraction of the cost of photocopy, with readers afforded +choices in the form of these copies. + +KENNEY concluded that digital technology offers an electronic means for a +library preservation effort to pay for itself. If a brittle-book program +included the means of disseminating reprints of books that are in demand +by libraries and researchers alike, the initial investment in capture +could be recovered and used to preserve additional but less popular +books. She disclosed that an economic model for a self-sustaining +program could be developed for CXP's report to the Commission on +Preservation and Access (CPA). + +KENNEY stressed that the focus of CXP has been on obtaining high quality +in a production environment. The use of digital technology is viewed as +an affordable alternative to other reformatting options. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ANDRE * Overview and history of NATDP * Various agricultural CD-ROM +products created inhouse and by service bureaus * Pilot project on +Internet transmission * Additional products in progress * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Pamela ANDRE, associate director for automation, National Agricultural +Text Digitizing Program (NATDP), National Agricultural Library (NAL), +presented an overview of NATDP, which has been underway at NAL the last +four years, before Judith ZIDAR discussed the technical details. ANDRE +defined agricultural information as a broad range of material going from +basic and applied research in the hard sciences to the one-page pamphlets +that are distributed by the cooperative state extension services on such +things as how to grow blueberries. + +NATDP began in late 1986 with a meeting of representatives from the +land-grant library community to deal with the issue of electronic +information. NAL and forty-five of these libraries banded together to +establish this project--to evaluate the technology for converting what +were then source documents in paper form into electronic form, to provide +access to that digital information, and then to distribute it. +Distributing that material to the community--the university community as +well as the extension service community, potentially down to the county +level--constituted the group's chief concern. + +Since January 1988 (when the microcomputer-based scanning system was +installed at NAL), NATDP has done a variety of things, concerning which +ZIDAR would provide further details. For example, the first technology +considered in the project's discussion phase was digital videodisc, which +indicates how long ago it was conceived. + +Over the four years of this project, four separate CD-ROM products on +four different agricultural topics were created, two at a +scanning-and-OCR station installed at NAL, and two by service bureaus. +Thus, NATDP has gained comparative information in terms of those relative +costs. Each of these products contained the full ASCII text as well as +page images of the material, or between 4,000 and 6,000 pages of material +on these disks. Topics included aquaculture, food, agriculture and +science (i.e., international agriculture and research), acid rain, and +Agent Orange, which was the final product distributed (approximately +eighteen months before the Workshop). + +The third phase of NATDP focused on delivery mechanisms other than +CD-ROM. At the suggestion of Clifford LYNCH, who was a technical +consultant to the project at this point, NATDP became involved with the +Internet and initiated a project with the help of North Carolina State +University, in which fourteen of the land-grant university libraries are +transmitting digital images over the Internet in response to interlibrary +loan requests--a topic for another meeting. At this point, the pilot +project had been completed for about a year and the final report would be +available shortly after the Workshop. In the meantime, the project's +success had led to its extension. (ANDRE noted that one of the first +things done under the program title was to select a retrieval package to +use with subsequent products; Windows Personal Librarian was the package +of choice after a lengthy evaluation.) + +Three additional products had been planned and were in progress: + + 1) An arrangement with the American Society of Agronomy--a + professional society that has published the Agronomy Journal since + about 1908--to scan and create bit-mapped images of its journal. + ASA granted permission first to put and then to distribute this + material in electronic form, to hold it at NAL, and to use these + electronic images as a mechanism to deliver documents or print out + material for patrons, among other uses. Effectively, NAL has the + right to use this material in support of its program. + (Significantly, this arrangement offers a potential cooperative + model for working with other professional societies in agriculture + to try to do the same thing--put the journals of particular interest + to agriculture research into electronic form.) + + 2) An extension of the earlier product on aquaculture. + + 3) The George Washington Carver Papers--a joint project with + Tuskegee University to scan and convert from microfilm some 3,500 + images of Carver's papers, letters, and drawings. + +It was anticipated that all of these products would appear no more than +six months after the Workshop. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ZIDAR * (A separate arena for scanning) * Steps in creating a database * +Image capture, with and without performing OCR * Keying in tracking data +* Scanning, with electronic and manual tracking * Adjustments during +scanning process * Scanning resolutions * Compression * De-skewing and +filtering * Image capture from microform: the papers and letters of +George Washington Carver * Equipment used for a scanning system * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Judith ZIDAR, coordinator, National Agricultural Text Digitizing Program +(NATDP), National Agricultural Library (NAL), illustrated the technical +details of NATDP, including her primary responsibility, scanning and +creating databases on a topic and putting them on CD-ROM. + +(ZIDAR remarked a separate arena from the CD-ROM projects, although the +processing of the material is nearly identical, in which NATDP is also +scanning material and loading it on a Next microcomputer, which in turn +is linked to NAL's integrated library system. Thus, searches in NAL's +bibliographic database will enable people to pull up actual page images +and text for any documents that have been entered.) + +In accordance with the session's topic, ZIDAR focused her illustrated +talk on image capture, offering a primer on the three main steps in the +process: 1) assemble the printed publications; 2) design the database +(database design occurs in the process of preparing the material for +scanning; this step entails reviewing and organizing the material, +defining the contents--what will constitute a record, what kinds of +fields will be captured in terms of author, title, etc.); 3) perform a +certain amount of markup on the paper publications. NAL performs this +task record by record, preparing work sheets or some other sort of +tracking material and designing descriptors and other enhancements to be +added to the data that will not be captured from the printed publication. +Part of this process also involves determining NATDP's file and directory +structure: NATDP attempts to avoid putting more than approximately 100 +images in a directory, because placing more than that on a CD-ROM would +reduce the access speed. + +This up-front process takes approximately two weeks for a +6,000-7,000-page database. The next step is to capture the page images. +How long this process takes is determined by the decision whether or not +to perform OCR. Not performing OCR speeds the process, whereas text +capture requires greater care because of the quality of the image: it +has to be straighter and allowance must be made for text on a page, not +just for the capture of photographs. + +NATDP keys in tracking data, that is, a standard bibliographic record +including the title of the book and the title of the chapter, which will +later either become the access information or will be attached to the +front of a full-text record so that it is searchable. + +Images are scanned from a bound or unbound publication, chiefly from +bound publications in the case of NATDP, however, because often they are +the only copies and the publications are returned to the shelves. NATDP +usually scans one record at a time, because its database tracking system +tracks the document in that way and does not require further logical +separating of the images. After performing optical character +recognition, NATDP moves the images off the hard disk and maintains a +volume sheet. Though the system tracks electronically, all the +processing steps are also tracked manually with a log sheet. + +ZIDAR next illustrated the kinds of adjustments that one can make when +scanning from paper and microfilm, for example, redoing images that need +special handling, setting for dithering or gray scale, and adjusting for +brightness or for the whole book at one time. + +NATDP is scanning at 300 dots per inch, a standard scanning resolution. +Though adequate for capturing text that is all of a standard size, 300 +dpi is unsuitable for any kind of photographic material or for very small +text. Many scanners allow for different image formats, TIFF, of course, +being a de facto standard. But if one intends to exchange images with +other people, the ability to scan other image formats, even if they are +less common, becomes highly desirable. + +CCITT Group 4 is the standard compression for normal black-and-white +images, JPEG for gray scale or color. ZIDAR recommended 1) using the +standard compressions, particularly if one attempts to make material +available and to allow users to download images and reuse them from +CD-ROMs; and 2) maintaining the ability to output an uncompressed image, +because in image exchange uncompressed images are more likely to be able +to cross platforms. + +ZIDAR emphasized the importance of de-skewing and filtering as +requirements on NATDP's upgraded system. For instance, scanning bound +books, particularly books published by the federal government whose pages +are skewed, and trying to scan them straight if OCR is to be performed, +is extremely time-consuming. The same holds for filtering of +poor-quality or older materials. + +ZIDAR described image capture from microform, using as an example three +reels from a sixty-seven-reel set of the papers and letters of George +Washington Carver that had been produced by Tuskegee University. These +resulted in approximately 3,500 images, which NATDP had had scanned by +its service contractor, Science Applications International Corporation +(SAIC). NATDP also created bibliographic records for access. (NATDP did +not have such specialized equipment as a microfilm scanner. + +Unfortunately, the process of scanning from microfilm was not an +unqualified success, ZIDAR reported: because microfilm frame sizes vary, +occasionally some frames were missed, which without spending much time +and money could not be recaptured. + +OCR could not be performed from the scanned images of the frames. The +bleeding in the text simply output text, when OCR was run, that could not +even be edited. NATDP tested for negative versus positive images, +landscape versus portrait orientation, and single- versus dual-page +microfilm, none of which seemed to affect the quality of the image; but +also on none of them could OCR be performed. + +In selecting the microfilm they would use, therefore, NATDP had other +factors in mind. ZIDAR noted two factors that influenced the quality of +the images: 1) the inherent quality of the original and 2) the amount of +size reduction on the pages. + +The Carver papers were selected because they are informative and visually +interesting, treat a single subject, and are valuable in their own right. +The images were scanned and divided into logical records by SAIC, then +delivered, and loaded onto NATDP's system, where bibliographic +information taken directly from the images was added. Scanning was +completed in summer 1991 and by the end of summer 1992 the disk was +scheduled to be published. + +Problems encountered during processing included the following: Because +the microfilm scanning had to be done in a batch, adjustment for +individual page variations was not possible. The frame size varied on +account of the nature of the material, and therefore some of the frames +were missed while others were just partial frames. The only way to go +back and capture this material was to print out the page with the +microfilm reader from the missing frame and then scan it in from the +page, which was extremely time-consuming. The quality of the images +scanned from the printout of the microfilm compared unfavorably with that +of the original images captured directly from the microfilm. The +inability to perform OCR also was a major disappointment. At the time, +computer output microfilm was unavailable to test. + +The equipment used for a scanning system was the last topic addressed by +ZIDAR. The type of equipment that one would purchase for a scanning +system included: a microcomputer, at least a 386, but preferably a 486; +a large hard disk, 380 megabyte at minimum; a multi-tasking operating +system that allows one to run some things in batch in the background +while scanning or doing text editing, for example, Unix or OS/2 and, +theoretically, Windows; a high-speed scanner and scanning software that +allows one to make the various adjustments mentioned earlier; a +high-resolution monitor (150 dpi ); OCR software and hardware to perform +text recognition; an optical disk subsystem on which to archive all the +images as the processing is done; file management and tracking software. + +ZIDAR opined that the software one purchases was more important than the +hardware and might also cost more than the hardware, but it was likely to +prove critical to the success or failure of one's system. In addition to +a stand-alone scanning workstation for image capture, then, text capture +requires one or two editing stations networked to this scanning station +to perform editing. Editing the text takes two or three times as long as +capturing the images. + +Finally, ZIDAR stressed the importance of buying an open system that allows +for more than one vendor, complies with standards, and can be upgraded. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +WATERS *Yale University Library's master plan to convert microfilm to +digital imagery (POB) * The place of electronic tools in the library of +the future * The uses of images and an image library * Primary input from +preservation microfilm * Features distinguishing POB from CXP and key +hypotheses guiding POB * Use of vendor selection process to facilitate +organizational work * Criteria for selecting vendor * Finalists and +results of process for Yale * Key factor distinguishing vendors * +Components, design principles, and some estimated costs of POB * Role of +preservation materials in developing imaging market * Factors affecting +quality and cost * Factors affecting the usability of complex documents +in image form * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Donald WATERS, head of the Systems Office, Yale University Library, +reported on the progress of a master plan for a project at Yale to +convert microfilm to digital imagery, Project Open Book (POB). Stating +that POB was in an advanced stage of planning, WATERS detailed, in +particular, the process of selecting a vendor partner and several key +issues under discussion as Yale prepares to move into the project itself. +He commented first on the vision that serves as the context of POB and +then described its purpose and scope. + +WATERS sees the library of the future not necessarily as an electronic +library but as a place that generates, preserves, and improves for its +clients ready access to both intellectual and physical recorded +knowledge. Electronic tools must find a place in the library in the +context of this vision. Several roles for electronic tools include +serving as: indirect sources of electronic knowledge or as "finding" +aids (the on-line catalogues, the article-level indices, registers for +documents and archives); direct sources of recorded knowledge; full-text +images; and various kinds of compound sources of recorded knowledge (the +so-called compound documents of Hypertext, mixed text and image, +mixed-text image format, and multimedia). + +POB is looking particularly at images and an image library, the uses to +which images will be put (e.g., storage, printing, browsing, and then use +as input for other processes), OCR as a subsequent process to image +capture, or creating an image library, and also possibly generating +microfilm. + +While input will come from a variety of sources, POB is considering +especially input from preservation microfilm. A possible outcome is that +the film and paper which provide the input for the image library +eventually may go off into remote storage, and that the image library may +be the primary access tool. + +The purpose and scope of POB focus on imaging. Though related to CXP, +POB has two features which distinguish it: 1) scale--conversion of +10,000 volumes into digital image form; and 2) source--conversion from +microfilm. Given these features, several key working hypotheses guide +POB, including: 1) Since POB is using microfilm, it is not concerned with +the image library as a preservation medium. 2) Digital imagery can improve +access to recorded knowledge through printing and network distribution at +a modest incremental cost of microfilm. 3) Capturing and storing documents +in a digital image form is necessary to further improvements in access. +(POB distinguishes between the imaging, digitizing process and OCR, +which at this stage it does not plan to perform.) + +Currently in its first or organizational phase, POB found that it could +use a vendor selection process to facilitate a good deal of the +organizational work (e.g., creating a project team and advisory board, +confirming the validity of the plan, establishing the cost of the project +and a budget, selecting the materials to convert, and then raising the +necessary funds). + +POB developed numerous selection criteria, including: a firm committed +to image-document management, the ability to serve as systems integrator +in a large-scale project over several years, interest in developing the +requisite software as a standard rather than a custom product, and a +willingness to invest substantial resources in the project itself. + +Two vendors, DEC and Xerox, were selected as finalists in October 1991, +and with the support of the Commission on Preservation and Access, each +was commissioned to generate a detailed requirements analysis for the +project and then to submit a formal proposal for the completion of the +project, which included a budget and costs. The terms were that POB would +pay the loser. The results for Yale of involving a vendor included: +broad involvement of Yale staff across the board at a relatively low +cost, which may have long-term significance in carrying out the project +(twenty-five to thirty university people are engaged in POB); better +understanding of the factors that affect corporate response to markets +for imaging products; a competitive proposal; and a more sophisticated +view of the imaging markets. + +The most important factor that distinguished the vendors under +consideration was their identification with the customer. The size and +internal complexity of the company also was an important factor. POB was +looking at large companies that had substantial resources. In the end, +the process generated for Yale two competitive proposals, with Xerox's +the clear winner. WATERS then described the components of the proposal, +the design principles, and some of the costs estimated for the process. + +Components are essentially four: a conversion subsystem, a +network-accessible storage subsystem for 10,000 books (and POB expects +200 to 600 dpi storage), browsing stations distributed on the campus +network, and network access to the image printers. + +Among the design principles, POB wanted conversion at the highest +possible resolution. Assuming TIFF files, TIFF files with Group 4 +compression, TCP/IP, and ethernet network on campus, POB wanted a +client-server approach with image documents distributed to the +workstations and made accessible through native workstation interfaces +such as Windows. POB also insisted on a phased approach to +implementation: 1) a stand-alone, single-user, low-cost entry into the +business with a workstation focused on conversion and allowing POB to +explore user access; 2) movement into a higher-volume conversion with +network-accessible storage and multiple access stations; and 3) a +high-volume conversion, full-capacity storage, and multiple browsing +stations distributed throughout the campus. + +The costs proposed for start-up assumed the existence of the Yale network +and its two DocuTech image printers. Other start-up costs are estimated +at $1 million over the three phases. At the end of the project, the annual +operating costs estimated primarily for the software and hardware proposed +come to about $60,000, but these exclude costs for labor needed in the +conversion process, network and printer usage, and facilities management. + +Finally, the selection process produced for Yale a more sophisticated +view of the imaging markets: the management of complex documents in +image form is not a preservation problem, not a library problem, but a +general problem in a broad, general industry. Preservation materials are +useful for developing that market because of the qualities of the +material. For example, much of it is out of copyright. The resolution +of key issues such as the quality of scanning and image browsing also +will affect development of that market. + +The technology is readily available but changing rapidly. In this +context of rapid change, several factors affect quality and cost, to +which POB intends to pay particular attention, for example, the various +levels of resolution that can be achieved. POB believes it can bring +resolution up to 600 dpi, but an interpolation process from 400 to 600 is +more likely. The variation quality in microfilm will prove to be a +highly important factor. POB may reexamine the standards used to film in +the first place by looking at this process as a follow-on to microfilming. + +Other important factors include: the techniques available to the +operator for handling material, the ways of integrating quality control +into the digitizing work flow, and a work flow that includes indexing and +storage. POB's requirement was to be able to deal with quality control +at the point of scanning. Thus, thanks to Xerox, POB anticipates having +a mechanism which will allow it not only to scan in batch form, but to +review the material as it goes through the scanner and control quality +from the outset. + +The standards for measuring quality and costs depend greatly on the uses +of the material, including subsequent OCR, storage, printing, and +browsing. But especially at issue for POB is the facility for browsing. +This facility, WATERS said, is perhaps the weakest aspect of imaging +technology and the most in need of development. + +A variety of factors affect the usability of complex documents in image +form, among them: 1) the ability of the system to handle the full range +of document types, not just monographs but serials, multi-part +monographs, and manuscripts; 2) the location of the database of record +for bibliographic information about the image document, which POB wants +to enter once and in the most useful place, the on-line catalog; 3) a +document identifier for referencing the bibliographic information in one +place and the images in another; 4) the technique for making the basic +internal structure of the document accessible to the reader; and finally, +5) the physical presentation on the CRT of those documents. POB is ready +to complete this phase now. One last decision involves deciding which +material to scan. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * TIFF files constitute de facto standard * NARA's experience +with image conversion software and text conversion * RFC 1314 * +Considerable flux concerning available hardware and software solutions * +NAL through-put rate during scanning * Window management questions * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +In the question-and-answer period that followed WATERS's presentation, +the following points emerged: + + * ZIDAR's statement about using TIFF files as a standard meant de + facto standard. This is what most people use and typically exchange + with other groups, across platforms, or even occasionally across + display software. + + * HOLMES commented on the unsuccessful experience of NARA in + attempting to run image-conversion software or to exchange between + applications: What are supposedly TIFF files go into other software + that is supposed to be able to accept TIFF but cannot recognize the + format and cannot deal with it, and thus renders the exchange + useless. Re text conversion, he noted the different recognition + rates obtained by substituting the make and model of scanners in + NARA's recent test of an "intelligent" character-recognition product + for a new company. In the selection of hardware and software, + HOLMES argued, software no longer constitutes the overriding factor + it did until about a year ago; rather it is perhaps important to + look at both now. + + * Danny Cohen and Alan Katz of the University of Southern California + Information Sciences Institute began circulating as an Internet RFC + (RFC 1314) about a month ago a standard for a TIFF interchange + format for Internet distribution of monochrome bit-mapped images, + which LYNCH said he believed would be used as a de facto standard. + + * FLEISCHHAUER's impression from hearing these reports and thinking + about AM's experience was that there is considerable flux concerning + available hardware and software solutions. HOOTON agreed and + commented at the same time on ZIDAR's statement that the equipment + employed affects the results produced. One cannot draw a complete + conclusion by saying it is difficult or impossible to perform OCR + from scanning microfilm, for example, with that device, that set of + parameters, and system requirements, because numerous other people + are accomplishing just that, using other components, perhaps. + HOOTON opined that both the hardware and the software were highly + important. Most of the problems discussed today have been solved in + numerous different ways by other people. Though it is good to be + cognizant of various experiences, this is not to say that it will + always be thus. + + * At NAL, the through-put rate of the scanning process for paper, + page by page, performing OCR, ranges from 300 to 600 pages per day; + not performing OCR is considerably faster, although how much faster + is not known. This is for scanning from bound books, which is much + slower. + + * WATERS commented on window management questions: DEC proposed an + X-Windows solution which was problematical for two reasons. One was + POB's requirement to be able to manipulate images on the workstation + and bring them down to the workstation itself and the other was + network usage. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +THOMA * Illustration of deficiencies in scanning and storage process * +Image quality in this process * Different costs entailed by better image +quality * Techniques for overcoming various de-ficiencies: fixed +thresholding, dynamic thresholding, dithering, image merge * Page edge +effects * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +George THOMA, chief, Communications Engineering Branch, National Library +of Medicine (NLM), illustrated several of the deficiencies discussed by +the previous speakers. He introduced the topic of special problems by +noting the advantages of electronic imaging. For example, it is regenerable +because it is a coded file, and real-time quality control is possible with +electronic capture, whereas in photographic capture it is not. + +One of the difficulties discussed in the scanning and storage process was +image quality which, without belaboring the obvious, means different +things for maps, medical X-rays, or broadcast television. In the case of +documents, THOMA said, image quality boils down to legibility of the +textual parts, and fidelity in the case of gray or color photo print-type +material. Legibility boils down to scan density, the standard in most +cases being 300 dpi. Increasing the resolution with scanners that +perform 600 or 1200 dpi, however, comes at a cost. + +Better image quality entails at least four different kinds of costs: 1) +equipment costs, because the CCD (i.e., charge-couple device) with +greater number of elements costs more; 2) time costs that translate to +the actual capture costs, because manual labor is involved (the time is +also dependent on the fact that more data has to be moved around in the +machine in the scanning or network devices that perform the scanning as +well as the storage); 3) media costs, because at high resolutions larger +files have to be stored; and 4) transmission costs, because there is just +more data to be transmitted. + +But while resolution takes care of the issue of legibility in image +quality, other deficiencies have to do with contrast and elements on the +page scanned or the image that needed to be removed or clarified. Thus, +THOMA proceeded to illustrate various deficiencies, how they are +manifested, and several techniques to overcome them. + +Fixed thresholding was the first technique described, suitable for +black-and-white text, when the contrast does not vary over the page. One +can have many different threshold levels in scanning devices. Thus, +THOMA offered an example of extremely poor contrast, which resulted from +the fact that the stock was a heavy red. This is the sort of image that +when microfilmed fails to provide any legibility whatsoever. Fixed +thresholding is the way to change the black-to-red contrast to the +desired black-to-white contrast. + +Other examples included material that had been browned or yellowed by +age. This was also a case of contrast deficiency, and correction was +done by fixed thresholding. A final example boils down to the same +thing, slight variability, but it is not significant. Fixed thresholding +solves this problem as well. The microfilm equivalent is certainly legible, +but it comes with dark areas. Though THOMA did not have a slide of the +microfilm in this case, he did show the reproduced electronic image. + +When one has variable contrast over a page or the lighting over the page +area varies, especially in the case where a bound volume has light +shining on it, the image must be processed by a dynamic thresholding +scheme. One scheme, dynamic averaging, allows the threshold level not to +be fixed but to be recomputed for every pixel from the neighboring +characteristics. The neighbors of a pixel determine where the threshold +should be set for that pixel. + +THOMA showed an example of a page that had been made deficient by a +variety of techniques, including a burn mark, coffee stains, and a yellow +marker. Application of a fixed-thresholding scheme, THOMA argued, might +take care of several deficiencies on the page but not all of them. +Performing the calculation for a dynamic threshold setting, however, +removes most of the deficiencies so that at least the text is legible. + +Another problem is representing a gray level with black-and-white pixels +by a process known as dithering or electronic screening. But dithering +does not provide good image quality for pure black-and-white textual +material. THOMA illustrated this point with examples. Although its +suitability for photoprint is the reason for electronic screening or +dithering, it cannot be used for every compound image. In the document +that was distributed by CXP, THOMA noticed that the dithered image of the +IEEE test chart evinced some deterioration in the text. He presented an +extreme example of deterioration in the text in which compounded +documents had to be set right by other techniques. The technique +illustrated by the present example was an image merge in which the page +is scanned twice and the settings go from fixed threshold to the +dithering matrix; the resulting images are merged to give the best +results with each technique. + +THOMA illustrated how dithering is also used in nonphotographic or +nonprint materials with an example of a grayish page from a medical text, +which was reproduced to show all of the gray that appeared in the +original. Dithering provided a reproduction of all the gray in the +original of another example from the same text. + +THOMA finally illustrated the problem of bordering, or page-edge, +effects. Books and bound volumes that are placed on a photocopy machine +or a scanner produce page-edge effects that are undesirable for two +reasons: 1) the aesthetics of the image; after all, if the image is to +be preserved, one does not necessarily want to keep all of its +deficiencies; 2) compression (with the bordering problem THOMA +illustrated, the compression ratio deteriorated tremendously). One way +to eliminate this more serious problem is to have the operator at the +point of scanning window the part of the image that is desirable and +automatically turn all of the pixels out of that picture to white. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +FLEISCHHAUER * AM's experience with scanning bound materials * Dithering +* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Carl FLEISCHHAUER, coordinator, American Memory, Library of Congress, +reported AM's experience with scanning bound materials, which he likened +to the problems involved in using photocopying machines. Very few +devices in the industry offer book-edge scanning, let alone book cradles. +The problem may be unsolvable, FLEISCHHAUER said, because a large enough +market does not exist for a preservation-quality scanner. AM is using a +Kurzweil scanner, which is a book-edge scanner now sold by Xerox. + +Devoting the remainder of his brief presentation to dithering, +FLEISCHHAUER related AM's experience with a contractor who was using +unsophisticated equipment and software to reduce moire patterns from +printed halftones. AM took the same image and used the dithering +algorithm that forms part of the same Kurzweil Xerox scanner; it +disguised moire patterns much more effectively. + +FLEISCHHAUER also observed that dithering produces a binary file which is +useful for numerous purposes, for example, printing it on a laser printer +without having to "re-halftone" it. But it tends to defeat efficient +compression, because the very thing that dithers to reduce moire patterns +also tends to work against compression schemes. AM thought the +difference in image quality was worth it. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Relative use as a criterion for POB's selection of books to +be converted into digital form * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the discussion period, WATERS noted that one of the criteria for +selecting books among the 10,000 to be converted into digital image form +would be how much relative use they would receive--a subject still +requiring evaluation. The challenge will be to understand whether +coherent bodies of material will increase usage or whether POB should +seek material that is being used, scan that, and make it more accessible. +POB might decide to digitize materials that are already heavily used, in +order to make them more accessible and decrease wear on them. Another +approach would be to provide a large body of intellectually coherent +material that may be used more in digital form than it is currently used +in microfilm. POB would seek material that was out of copyright. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +BARONAS * Origin and scope of AIIM * Types of documents produced in +AIIM's standards program * Domain of AIIM's standardization work * AIIM's +structure * TC 171 and MS23 * Electronic image management standards * +Categories of EIM standardization where AIIM standards are being +developed * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Jean BARONAS, senior manager, Department of Standards and Technology, +Association for Information and Image Management (AIIM), described the +not-for-profit association and the national and international programs +for standardization in which AIIM is active. + +Accredited for twenty-five years as the nation's standards development +organization for document image management, AIIM began life in a library +community developing microfilm standards. Today the association +maintains both its library and business-image management standardization +activities--and has moved into electronic image-management +standardization (EIM). + +BARONAS defined the program's scope. AIIM deals with: 1) the +terminology of standards and of the technology it uses; 2) methods of +measurement for the systems, as well as quality; 3) methodologies for +users to evaluate and measure quality; 4) the features of apparatus used +to manage and edit images; and 5) the procedures used to manage images. + +BARONAS noted that three types of documents are produced in the AIIM +standards program: the first two, accredited by the American National +Standards Institute (ANSI), are standards and standard recommended +practices. Recommended practices differ from standards in that they +contain more tutorial information. A technical report is not an ANSI +standard. Because AIIM's policies and procedures for developing +standards are approved by ANSI, its standards are labeled ANSI/AIIM, +followed by the number and title of the standard. + +BARONAS then illustrated the domain of AIIM's standardization work. For +example, AIIM is the administrator of the U.S. Technical Advisory Group +(TAG) to the International Standards Organization's (ISO) technical +committee, TC l7l Micrographics and Optical Memories for Document and +Image Recording, Storage, and Use. AIIM officially works through ANSI in +the international standardization process. + +BARONAS described AIIM's structure, including its board of directors, its +standards board of twelve individuals active in the image-management +industry, its strategic planning and legal admissibility task forces, and +its National Standards Council, which is comprised of the members of a +number of organizations who vote on every AIIM standard before it is +published. BARONAS pointed out that AIIM's liaisons deal with numerous +other standards developers, including the optical disk community, office +and publishing systems, image-codes-and-character set committees, and the +National Information Standards Organization (NISO). + +BARONAS illustrated the procedures of TC l7l, which covers all aspects of +image management. When AIIM's national program has conceptualized a new +project, it is usually submitted to the international level, so that the +member countries of TC l7l can simultaneously work on the development of +the standard or the technical report. BARONAS also illustrated a classic +microfilm standard, MS23, which deals with numerous imaging concepts that +apply to electronic imaging. Originally developed in the l970s, revised +in the l980s, and revised again in l991, this standard is scheduled for +another revision. MS23 is an active standard whereby users may propose +new density ranges and new methods of evaluating film images in the +standard's revision. + +BARONAS detailed several electronic image-management standards, for +instance, ANSI/AIIM MS44, a quality-control guideline for scanning 8.5" +by 11" black-and-white office documents. This standard is used with the +IEEE fax image--a continuous tone photographic image with gray scales, +text, and several continuous tone pictures--and AIIM test target number +2, a representative document used in office document management. + +BARONAS next outlined the four categories of EIM standardization in which +AIIM standards are being developed: transfer and retrieval, evaluation, +optical disc and document scanning applications, and design and +conversion of documents. She detailed several of the main projects of +each: 1) in the category of image transfer and retrieval, a bi-level +image transfer format, ANSI/AIIM MS53, which is a proposed standard that +describes a file header for image transfer between unlike systems when +the images are compressed using G3 and G4 compression; 2) the category of +image evaluation, which includes the AIIM-proposed TR26 tutorial on image +resolution (this technical report will treat the differences and +similarities between classical or photographic and electronic imaging); +3) design and conversion, which includes a proposed technical report +called "Forms Design Optimization for EIM" (this report considers how +general-purpose business forms can be best designed so that scanning is +optimized; reprographic characteristics such as type, rules, background, +tint, and color will likewise be treated in the technical report); 4) +disk and document scanning applications includes a project a) on planning +platters and disk management, b) on generating an application profile for +EIM when images are stored and distributed on CD-ROM, and c) on +evaluating SCSI2, and how a common command set can be generated for SCSI2 +so that document scanners are more easily integrated. (ANSI/AIIM MS53 +will also apply to compressed images.) + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +BATTIN * The implications of standards for preservation * A major +obstacle to successful cooperation * A hindrance to access in the digital +environment * Standards a double-edged sword for those concerned with the +preservation of the human record * Near-term prognosis for reliable +archival standards * Preservation concerns for electronic media * Need +for reconceptualizing our preservation principles * Standards in the real +world and the politics of reproduction * Need to redefine the concept of +archival and to begin to think in terms of life cycles * Cooperation and +the La Guardia Eight * Concerns generated by discussions on the problems +of preserving text and image * General principles to be adopted in a +world without standards * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Patricia BATTIN, president, the Commission on Preservation and Access +(CPA), addressed the implications of standards for preservation. She +listed several areas where the library profession and the analog world of +the printed book had made enormous contributions over the past hundred +years--for example, in bibliographic formats, binding standards, and, most +important, in determining what constitutes longevity or archival quality. + +Although standards have lightened the preservation burden through the +development of national and international collaborative programs, +nevertheless, a pervasive mistrust of other people's standards remains a +major obstacle to successful cooperation, BATTIN said. + +The zeal to achieve perfection, regardless of the cost, has hindered +rather than facilitated access in some instances, and in the digital +environment, where no real standards exist, has brought an ironically +just reward. + +BATTIN argued that standards are a double-edged sword for those concerned +with the preservation of the human record, that is, the provision of +access to recorded knowledge in a multitude of media as far into the +future as possible. Standards are essential to facilitate +interconnectivity and access, but, BATTIN said, as LYNCH pointed out +yesterday, if set too soon they can hinder creativity, expansion of +capability, and the broadening of access. The characteristics of +standards for digital imagery differ radically from those for analog +imagery. And the nature of digital technology implies continuing +volatility and change. To reiterate, precipitous standard-setting can +inhibit creativity, but delayed standard-setting results in chaos. + +Since in BATTIN'S opinion the near-term prognosis for reliable archival +standards, as defined by librarians in the analog world, is poor, two +alternatives remain: standing pat with the old technology, or +reconceptualizing. + +Preservation concerns for electronic media fall into two general domains. +One is the continuing assurance of access to knowledge originally +generated, stored, disseminated, and used in electronic form. This +domain contains several subdivisions, including 1) the closed, +proprietary systems discussed the previous day, bundled information such +as electronic journals and government agency records, and electronically +produced or captured raw data; and 2) the application of digital +technologies to the reformatting of materials originally published on a +deteriorating analog medium such as acid paper or videotape. + +The preservation of electronic media requires a reconceptualizing of our +preservation principles during a volatile, standardless transition which +may last far longer than any of us envision today. BATTIN urged the +necessity of shifting focus from assessing, measuring, and setting +standards for the permanence of the medium to the concept of managing +continuing access to information stored on a variety of media and +requiring a variety of ever-changing hardware and software for access--a +fundamental shift for the library profession. + +BATTIN offered a primer on how to move forward with reasonable confidence +in a world without standards. Her comments fell roughly into two sections: +1) standards in the real world and 2) the politics of reproduction. + +In regard to real-world standards, BATTIN argued the need to redefine the +concept of archive and to begin to think in terms of life cycles. In +the past, the naive assumption that paper would last forever produced a +cavalier attitude toward life cycles. The transient nature of the +electronic media has compelled people to recognize and accept upfront the +concept of life cycles in place of permanency. + +Digital standards have to be developed and set in a cooperative context +to ensure efficient exchange of information. Moreover, during this +transition period, greater flexibility concerning how concepts such as +backup copies and archival copies in the CXP are defined is necessary, +or the opportunity to move forward will be lost. + +In terms of cooperation, particularly in the university setting, BATTIN +also argued the need to avoid going off in a hundred different +directions. The CPA has catalyzed a small group of universities called +the La Guardia Eight--because La Guardia Airport is where meetings take +place--Harvard, Yale, Cornell, Princeton, Penn State, Tennessee, +Stanford, and USC, to develop a digital preservation consortium to look +at all these issues and develop de facto standards as we move along, +instead of waiting for something that is officially blessed. Continuing +to apply analog values and definitions of standards to the digital +environment, BATTIN said, will effectively lead to forfeiture of the +benefits of digital technology to research and scholarship. + +Under the second rubric, the politics of reproduction, BATTIN reiterated +an oft-made argument concerning the electronic library, namely, that it +is more difficult to transform than to create, and nowhere is that belief +expressed more dramatically than in the conversion of brittle books to +new media. Preserving information published in electronic media involves +making sure the information remains accessible and that digital +information is not lost through reproduction. In the analog world of +photocopies and microfilm, the issue of fidelity to the original becomes +paramount, as do issues of "Whose fidelity?" and "Whose original?" + +BATTIN elaborated these arguments with a few examples from a recent study +conducted by the CPA on the problems of preserving text and image. +Discussions with scholars, librarians, and curators in a variety of +disciplines dependent on text and image generated a variety of concerns, +for example: 1) Copy what is, not what the technology is capable of. +This is very important for the history of ideas. Scholars wish to know +what the author saw and worked from. And make available at the +workstation the opportunity to erase all the defects and enhance the +presentation. 2) The fidelity of reproduction--what is good enough, what +can we afford, and the difference it makes--issues of subjective versus +objective resolution. 3) The differences between primary and secondary +users. Restricting the definition of primary user to the one in whose +discipline the material has been published runs one headlong into the +reality that these printed books have had a host of other users from a +host of other disciplines, who not only were looking for very different +things, but who also shared values very different from those of the +primary user. 4) The relationship of the standard of reproduction to new +capabilities of scholarship--the browsing standard versus an archival +standard. How good must the archival standard be? Can a distinction be +drawn between potential users in setting standards for reproduction? +Archival storage, use copies, browsing copies--ought an attempt to set +standards even be made? 5) Finally, costs. How much are we prepared to +pay to capture absolute fidelity? What are the trade-offs between vastly +enhanced access, degrees of fidelity, and costs? + +These standards, BATTIN concluded, serve to complicate further the +reproduction process, and add to the long list of technical standards +that are necessary to ensure widespread access. Ways to articulate and +analyze the costs that are attached to the different levels of standards +must be found. + +Given the chaos concerning standards, which promises to linger for the +foreseeable future, BATTIN urged adoption of the following general +principles: + + * Strive to understand the changing information requirements of + scholarly disciplines as more and more technology is integrated into + the process of research and scholarly communication in order to meet + future scholarly needs, not to build for the past. Capture + deteriorating information at the highest affordable resolution, even + though the dissemination and display technologies will lag. + + * Develop cooperative mechanisms to foster agreement on protocols + for document structure and other interchange mechanisms necessary + for widespread dissemination and use before official standards are + set. + + * Accept that, in a transition period, de facto standards will have + to be developed. + + * Capture information in a way that keeps all options open and + provides for total convertibility: OCR, scanning of microfilm, + producing microfilm from scanned documents, etc. + + * Work closely with the generators of information and the builders + of networks and databases to ensure that continuing accessibility is + a primary concern from the beginning. + + * Piggyback on standards under development for the broad market, and + avoid library-specific standards; work with the vendors, in order to + take advantage of that which is being standardized for the rest of + the world. + + * Concentrate efforts on managing permanence in the digital world, + rather than perfecting the longevity of a particular medium. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Additional comments on TIFF * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the brief discussion period that followed BATTIN's presentation, +BARONAS explained that TIFF was not developed in collaboration with or +under the auspices of AIIM. TIFF is a company product, not a standard, +is owned by two corporations, and is always changing. BARONAS also +observed that ANSI/AIIM MS53, a bi-level image file transfer format that +allows unlike systems to exchange images, is compatible with TIFF as well +as with DEC's architecture and IBM's MODCA/IOCA. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +HOOTON * Several questions to be considered in discussing text conversion +* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +HOOTON introduced the final topic, text conversion, by noting that it is +becoming an increasingly important part of the imaging business. Many +people now realize that it enhances their system to be able to have more +and more character data as part of their imaging system. Re the issue of +OCR versus rekeying, HOOTON posed several questions: How does one get +text into computer-readable form? Does one use automated processes? +Does one attempt to eliminate the use of operators where possible? +Standards for accuracy, he said, are extremely important: it makes a +major difference in cost and time whether one sets as a standard 98.5 +percent acceptance or 99.5 percent. He mentioned outsourcing as a +possibility for converting text. Finally, what one does with the image +to prepare it for the recognition process is also important, he said, +because such preparation changes how recognition is viewed, as well as +facilitates recognition itself. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +LESK * Roles of participants in CORE * Data flow * The scanning process * +The image interface * Results of experiments involving the use of +electronic resources and traditional paper copies * Testing the issue of +serendipity * Conclusions * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Michael LESK, executive director, Computer Science Research, Bell +Communications Research, Inc. (Bellcore), discussed the Chemical Online +Retrieval Experiment (CORE), a cooperative project involving Cornell +University, OCLC, Bellcore, and the American Chemical Society (ACS). + +LESK spoke on 1) how the scanning was performed, including the unusual +feature of page segmentation, and 2) the use made of the text and the +image in experiments. + +Working with the chemistry journals (because ACS has been saving its +typesetting tapes since the mid-1970s and thus has a significant back-run +of the most important chemistry journals in the United States), CORE is +attempting to create an automated chemical library. Approximately a +quarter of the pages by square inch are made up of images of +quasi-pictorial material; dealing with the graphic components of the +pages is extremely important. LESK described the roles of participants +in CORE: 1) ACS provides copyright permission, journals on paper, +journals on microfilm, and some of the definitions of the files; 2) at +Bellcore, LESK chiefly performs the data preparation, while Dennis Egan +performs experiments on the users of chemical abstracts, and supplies the +indexing and numerous magnetic tapes; 3) Cornell provides the site of the +experiment; 4) OCLC develops retrieval software and other user interfaces. +Various manufacturers and publishers have furnished other help. + +Concerning data flow, Bellcore receives microfilm and paper from ACS; the +microfilm is scanned by outside vendors, while the paper is scanned +inhouse on an Improvision scanner, twenty pages per minute at 300 dpi, +which provides sufficient quality for all practical uses. LESK would +prefer to have more gray level, because one of the ACS journals prints on +some colored pages, which creates a problem. + +Bellcore performs all this scanning, creates a page-image file, and also +selects from the pages the graphics, to mix with the text file (which is +discussed later in the Workshop). The user is always searching the ASCII +file, but she or he may see a display based on the ASCII or a display +based on the images. + +LESK illustrated how the program performs page analysis, and the image +interface. (The user types several words, is presented with a list-- +usually of the titles of articles contained in an issue--that derives +from the ASCII, clicks on an icon and receives an image that mirrors an +ACS page.) LESK also illustrated an alternative interface, based on text +on the ASCII, the so-called SuperBook interface from Bellcore. + +LESK next presented the results of an experiment conducted by Dennis Egan +and involving thirty-six students at Cornell, one third of them +undergraduate chemistry majors, one third senior undergraduate chemistry +majors, and one third graduate chemistry students. A third of them +received the paper journals, the traditional paper copies and chemical +abstracts on paper. A third received image displays of the pictures of +the pages, and a third received the text display with pop-up graphics. + +The students were given several questions made up by some chemistry +professors. The questions fell into five classes, ranging from very easy +to very difficult, and included questions designed to simulate browsing +as well as a traditional information retrieval-type task. + +LESK furnished the following results. In the straightforward question +search--the question being, what is the phosphorus oxygen bond distance +and hydroxy phosphate?--the students were told that they could take +fifteen minutes and, then, if they wished, give up. The students with +paper took more than fifteen minutes on average, and yet most of them +gave up. The students with either electronic format, text or image, +received good scores in reasonable time, hardly ever had to give up, and +usually found the right answer. + +In the browsing study, the students were given a list of eight topics, +told to imagine that an issue of the Journal of the American Chemical +Society had just appeared on their desks, and were also told to flip +through it and to find topics mentioned in the issue. The average scores +were about the same. (The students were told to answer yes or no about +whether or not particular topics appeared.) The errors, however, were +quite different. The students with paper rarely said that something +appeared when it had not. But they often failed to find something +actually mentioned in the issue. The computer people found numerous +things, but they also frequently said that a topic was mentioned when it +was not. (The reason, of course, was that they were performing word +searches. They were finding that words were mentioned and they were +concluding that they had accomplished their task.) + +This question also contained a trick to test the issue of serendipity. +The students were given another list of eight topics and instructed, +without taking a second look at the journal, to recall how many of this +new list of eight topics were in this particular issue. This was an +attempt to see if they performed better at remembering what they were not +looking for. They all performed about the same, paper or electronics, +about 62 percent accurate. In short, LESK said, people were not very +good when it came to serendipity, but they were no worse at it with +computers than they were with paper. + +(LESK gave a parenthetical illustration of the learning curve of students +who used SuperBook.) + +The students using the electronic systems started off worse than the ones +using print, but by the third of the three sessions in the series had +caught up to print. As one might expect, electronics provide a much +better means of finding what one wants to read; reading speeds, once the +object of the search has been found, are about the same. + +Almost none of the students could perform the hard task--the analogous +transformation. (It would require the expertise of organic chemists to +complete.) But an interesting result was that the students using the text +search performed terribly, while those using the image system did best. +That the text search system is driven by text offers the explanation. +Everything is focused on the text; to see the pictures, one must press +on an icon. Many students found the right article containing the answer +to the question, but they did not click on the icon to bring up the right +figure and see it. They did not know that they had found the right place, +and thus got it wrong. + +The short answer demonstrated by this experiment was that in the event +one does not know what to read, one needs the electronic systems; the +electronic systems hold no advantage at the moment if one knows what to +read, but neither do they impose a penalty. + +LESK concluded by commenting that, on one hand, the image system was easy +to use. On the other hand, the text display system, which represented +twenty man-years of work in programming and polishing, was not winning, +because the text was not being read, just searched. The much easier +system is highly competitive as well as remarkably effective for the +actual chemists. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ERWAY * Most challenging aspect of working on AM * Assumptions guiding +AM's approach * Testing different types of service bureaus * AM's +requirement for 99.95 percent accuracy * Requirements for text-coding * +Additional factors influencing AM's approach to coding * Results of AM's +experience with rekeying * Other problems in dealing with service bureaus +* Quality control the most time-consuming aspect of contracting out +conversion * Long-term outlook uncertain * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +To Ricky ERWAY, associate coordinator, American Memory, Library of +Congress, the constant variety of conversion projects taking place +simultaneously represented perhaps the most challenging aspect of working +on AM. Thus, the challenge was not to find a solution for text +conversion but a tool kit of solutions to apply to LC's varied +collections that need to be converted. ERWAY limited her remarks to the +process of converting text to machine-readable form, and the variety of +LC's text collections, for example, bound volumes, microfilm, and +handwritten manuscripts. + +Two assumptions have guided AM's approach, ERWAY said: 1) A desire not +to perform the conversion inhouse. Because of the variety of formats and +types of texts, to capitalize the equipment and have the talents and +skills to operate them at LC would be extremely expensive. Further, the +natural inclination to upgrade to newer and better equipment each year +made it reasonable for AM to focus on what it did best and seek external +conversion services. Using service bureaus also allowed AM to have +several types of operations take place at the same time. 2) AM was not a +technology project, but an effort to improve access to library +collections. Hence, whether text was converted using OCR or rekeying +mattered little to AM. What mattered were cost and accuracy of results. + +AM considered different types of service bureaus and selected three to +perform several small tests in order to acquire a sense of the field. +The sample collections with which they worked included handwritten +correspondence, typewritten manuscripts from the 1940s, and +eighteenth-century printed broadsides on microfilm. On none of these +samples was OCR performed; they were all rekeyed. AM had several special +requirements for the three service bureaus it had engaged. For instance, +any errors in the original text were to be retained. Working from bound +volumes or anything that could not be sheet-fed also constituted a factor +eliminating companies that would have performed OCR. + +AM requires 99.95 percent accuracy, which, though it sounds high, often +means one or two errors per page. The initial batch of test samples +contained several handwritten materials for which AM did not require +text-coding. The results, ERWAY reported, were in all cases fairly +comparable: for the most part, all three service bureaus achieved 99.95 +percent accuracy. AM was satisfied with the work but surprised at the cost. + +As AM began converting whole collections, it retained the requirement for +99.95 percent accuracy and added requirements for text-coding. AM needed +to begin performing work more than three years ago before LC requirements +for SGML applications had been established. Since AM's goal was simply +to retain any of the intellectual content represented by the formatting +of the document (which would be lost if one performed a straight ASCII +conversion), AM used "SGML-like" codes. These codes resembled SGML tags +but were used without the benefit of document-type definitions. AM found +that many service bureaus were not yet SGML-proficient. + +Additional factors influencing the approach AM took with respect to +coding included: 1) the inability of any known microcomputer-based +user-retrieval software to take advantage of SGML coding; and 2) the +multiple inconsistencies in format of the older documents, which +confirmed AM in its desire not to attempt to force the different formats +to conform to a single document-type definition (DTD) and thus create the +need for a separate DTD for each document. + +The five text collections that AM has converted or is in the process of +converting include a collection of eighteenth-century broadsides, a +collection of pamphlets, two typescript document collections, and a +collection of 150 books. + +ERWAY next reviewed the results of AM's experience with rekeying, noting +again that because the bulk of AM's materials are historical, the quality +of the text often does not lend itself to OCR. While non-English +speakers are less likely to guess or elaborate or correct typos in the +original text, they are also less able to infer what we would; they also +are nearly incapable of converting handwritten text. Another +disadvantage of working with overseas keyers is that they are much less +likely to telephone with questions, especially on the coding, with the +result that they develop their own rules as they encounter new +situations. + +Government contracting procedures and time frames posed a major challenge +to performing the conversion. Many service bureaus are not accustomed to +retaining the image, even if they perform OCR. Thus, questions of image +format and storage media were somewhat novel to many of them. ERWAY also +remarked other problems in dealing with service bureaus, for example, +their inability to perform text conversion from the kind of microfilm +that LC uses for preservation purposes. + +But quality control, in ERWAY's experience, was the most time-consuming +aspect of contracting out conversion. AM has been attempting to perform +a 10-percent quality review, looking at either every tenth document or +every tenth page to make certain that the service bureaus are maintaining +99.95 percent accuracy. But even if they are complying with the +requirement for accuracy, finding errors produces a desire to correct +them and, in turn, to clean up the whole collection, which defeats the +purpose to some extent. Even a double entry requires a +character-by-character comparison to the original to meet the accuracy +requirement. LC is not accustomed to publish imperfect texts, which +makes attempting to deal with the industry standard an emotionally +fraught issue for AM. As was mentioned in the previous day's discussion, +going from 99.95 to 99.99 percent accuracy usually doubles costs and +means a third keying or another complete run-through of the text. + +Although AM has learned much from its experiences with various collections +and various service bureaus, ERWAY concluded pessimistically that no +breakthrough has been achieved. Incremental improvements have occurred +in some of the OCR technology, some of the processes, and some of the +standards acceptances, which, though they may lead to somewhat lower costs, +do not offer much encouragement to many people who are anxiously awaiting +the day that the entire contents of LC are available on-line. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ZIDAR * Several answers to why one attempts to perform full-text +conversion * Per page cost of performing OCR * Typical problems +encountered during editing * Editing poor copy OCR vs. rekeying * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Judith ZIDAR, coordinator, National Agricultural Text Digitizing Program +(NATDP), National Agricultural Library (NAL), offered several answers to +the question of why one attempts to perform full-text conversion: 1) +Text in an image can be read by a human but not by a computer, so of +course it is not searchable and there is not much one can do with it. 2) +Some material simply requires word-level access. For instance, the legal +profession insists on full-text access to its material; with taxonomic or +geographic material, which entails numerous names, one virtually requires +word-level access. 3) Full text permits rapid browsing and searching, +something that cannot be achieved in an image with today's technology. +4) Text stored as ASCII and delivered in ASCII is standardized and highly +portable. 5) People just want full-text searching, even those who do not +know how to do it. NAL, for the most part, is performing OCR at an +actual cost per average-size page of approximately $7. NAL scans the +page to create the electronic image and passes it through the OCR device. + +ZIDAR next rehearsed several typical problems encountered during editing. +Praising the celerity of her student workers, ZIDAR observed that editing +requires approximately five to ten minutes per page, assuming that there +are no large tables to audit. Confusion among the three characters I, 1, +and l, constitutes perhaps the most common problem encountered. Zeroes +and O's also are frequently confused. Double M's create a particular +problem, even on clean pages. They are so wide in most fonts that they +touch, and the system simply cannot tell where one letter ends and the +other begins. Complex page formats occasionally fail to columnate +properly, which entails rescanning as though one were working with a +single column, entering the ASCII, and decolumnating for better +searching. With proportionally spaced text, OCR can have difficulty +discerning what is a space and what are merely spaces between letters, as +opposed to spaces between words, and therefore will merge text or break +up words where it should not. + +ZIDAR said that it can often take longer to edit a poor-copy OCR than to +key it from scratch. NAL has also experimented with partial editing of +text, whereby project workers go into and clean up the format, removing +stray characters but not running a spell-check. NAL corrects typos in +the title and authors' names, which provides a foothold for searching and +browsing. Even extremely poor-quality OCR (e.g., 60-percent accuracy) +can still be searched, because numerous words are correct, while the +important words are probably repeated often enough that they are likely +to be found correct somewhere. Librarians, however, cannot tolerate this +situation, though end users seem more willing to use this text for +searching, provided that NAL indicates that it is unedited. ZIDAR +concluded that rekeying of text may be the best route to take, in spite +of numerous problems with quality control and cost. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Modifying an image before performing OCR * NAL's costs per +page *AM's costs per page and experience with Federal Prison Industries * +Elements comprising NATDP's costs per page * OCR and structured markup * +Distinction between the structure of a document and its representation +when put on the screen or printed * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +HOOTON prefaced the lengthy discussion that followed with several +comments about modifying an image before one reaches the point of +performing OCR. For example, in regard to an application containing a +significant amount of redundant data, such as form-type data, numerous +companies today are working on various kinds of form renewal, prior to +going through a recognition process, by using dropout colors. Thus, +acquiring access to form design or using electronic means are worth +considering. HOOTON also noted that conversion usually makes or breaks +one's imaging system. It is extremely important, extremely costly in +terms of either capital investment or service, and determines the quality +of the remainder of one's system, because it determines the character of +the raw material used by the system. + +Concerning the four projects undertaken by NAL, two inside and two +performed by outside contractors, ZIDAR revealed that an in-house service +bureau executed the first at a cost between $8 and $10 per page for +everything, including building of the database. The project undertaken +by the Consultative Group on International Agricultural Research (CGIAR) +cost approximately $10 per page for the conversion, plus some expenses +for the software and building of the database. The Acid Rain Project--a +two-disk set produced by the University of Vermont, consisting of +Canadian publications on acid rain--cost $6.70 per page for everything, +including keying of the text, which was double keyed, scanning of the +images, and building of the database. The in-house project offered +considerable ease of convenience and greater control of the process. On +the other hand, the service bureaus know their job and perform it +expeditiously, because they have more people. + +As a useful comparison, ERWAY revealed AM's costs as follows: $0.75 +cents to $0.85 cents per thousand characters, with an average page +containing 2,700 characters. Requirements for coding and imaging +increase the costs. Thus, conversion of the text, including the coding, +costs approximately $3 per page. (This figure does not include the +imaging and database-building included in the NAL costs.) AM also +enjoyed a happy experience with Federal Prison Industries, which +precluded the necessity of going through the request-for-proposal process +to award a contract, because it is another government agency. The +prisoners performed AM's rekeying just as well as other service bureaus +and proved handy as well. AM shipped them the books, which they would +photocopy on a book-edge scanner. They would perform the markup on +photocopies, return the books as soon as they were done with them, +perform the keying, and return the material to AM on WORM disks. + +ZIDAR detailed the elements that constitute the previously noted cost of +approximately $7 per page. Most significant is the editing, correction +of errors, and spell-checkings, which though they may sound easy to +perform require, in fact, a great deal of time. Reformatting text also +takes a while, but a significant amount of NAL's expenses are for equipment, +which was extremely expensive when purchased because it was one of the few +systems on the market. The costs of equipment are being amortized over +five years but are still quite high, nearly $2,000 per month. + +HOCKEY raised a general question concerning OCR and the amount of editing +required (substantial in her experience) to generate the kind of +structured markup necessary for manipulating the text on the computer or +loading it into any retrieval system. She wondered if the speakers could +extend the previous question about the cost-benefit of adding or exerting +structured markup. ERWAY noted that several OCR systems retain italics, +bolding, and other spatial formatting. While the material may not be in +the format desired, these systems possess the ability to remove the +original materials quickly from the hands of the people performing the +conversion, as well as to retain that information so that users can work +with it. HOCKEY rejoined that the current thinking on markup is that one +should not say that something is italic or bold so much as why it is that +way. To be sure, one needs to know that something was italicized, but +how can one get from one to the other? One can map from the structure to +the typographic representation. + +FLEISCHHAUER suggested that, given the 100 million items the Library +holds, it may not be possible for LC to do more than report that a thing +was in italics as opposed to why it was italics, although that may be +desirable in some contexts. Promising to talk a bit during the afternoon +session about several experiments OCLC performed on automatic recognition +of document elements, and which they hoped to extend, WEIBEL said that in +fact one can recognize the major elements of a document with a fairly +high degree of reliability, at least as good as OCR. STEVENS drew a +useful distinction between standard, generalized markup (i.e., defining +for a document-type definition the structure of the document), and what +he termed a style sheet, which had to do with italics, bolding, and other +forms of emphasis. Thus, two different components are at work, one being +the structure of the document itself (its logic), and the other being its +representation when it is put on the screen or printed. + + ****** + +SESSION V. APPROACHES TO PREPARING ELECTRONIC TEXTS + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +HOCKEY * Text in ASCII and the representation of electronic text versus +an image * The need to look at ways of using markup to assist retrieval * +The need for an encoding format that will be reusable and multifunctional ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Susan HOCKEY, director, Center for Electronic Texts in the Humanities +(CETH), Rutgers and Princeton Universities, announced that one talk +(WEIBEL's) was moved into this session from the morning and that David +Packard was unable to attend. The session would attempt to focus more on +what one can do with a text in ASCII and the representation of electronic +text rather than just an image, what one can do with a computer that +cannot be done with a book or an image. It would be argued that one can +do much more than just read a text, and from that starting point one can +use markup and methods of preparing the text to take full advantage of +the capability of the computer. That would lead to a discussion of what +the European Community calls REUSABILITY, what may better be termed +DURABILITY, that is, how to prepare or make a text that will last a long +time and that can be used for as many applications as possible, which +would lead to issues of improving intellectual access. + +HOCKEY urged the need to look at ways of using markup to facilitate retrieval, +not just for referencing or to help locate an item that is retrieved, but also to put markup tags in +a text to help retrieve the thing sought either with linguistic tagging or +interpretation. HOCKEY also argued that little advancement had occurred in +the software tools currently available for retrieving and searching text. +She pressed the desideratum of going beyond Boolean searches and performing +more sophisticated searching, which the insertion of more markup in the text +would facilitate. Thinking about electronic texts as opposed to images means +considering material that will never appear in print form, or print will not +be its primary form, that is, material which only appears in electronic form. +HOCKEY alluded to the history and the need for markup and tagging and +electronic text, which was developed through the use of computers in the +humanities; as MICHELSON had observed, Father Busa had started in 1949 +to prepare the first-ever text on the computer. + +HOCKEY remarked several large projects, particularly in Europe, for the +compilation of dictionaries, language studies, and language analysis, in +which people have built up archives of text and have begun to recognize +the need for an encoding format that will be reusable and multifunctional, +that can be used not just to print the text, which may be assumed to be a +byproduct of what one wants to do, but to structure it inside the computer +so that it can be searched, built into a Hypertext system, etc. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +WEIBEL * OCLC's approach to preparing electronic text: retroconversion, +keying of texts, more automated ways of developing data * Project ADAPT +and the CORE Project * Intelligent character recognition does not exist * +Advantages of SGML * Data should be free of procedural markup; +descriptive markup strongly advocated * OCLC's interface illustrated * +Storage requirements and costs for putting a lot of information on line * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Stuart WEIBEL, senior research scientist, Online Computer Library Center, +Inc. (OCLC), described OCLC's approach to preparing electronic text. He +argued that the electronic world into which we are moving must +accommodate not only the future but the past as well, and to some degree +even the present. Thus, starting out at one end with retroconversion and +keying of texts, one would like to move toward much more automated ways +of developing data. + +For example, Project ADAPT had to do with automatically converting +document images into a structured document database with OCR text as +indexing and also a little bit of automatic formatting and tagging of +that text. The CORE project hosted by Cornell University, Bellcore, +OCLC, the American Chemical Society, and Chemical Abstracts, constitutes +WEIBEL's principal concern at the moment. This project is an example of +converting text for which one already has a machine-readable version into +a format more suitable for electronic delivery and database searching. +(Since Michael LESK had previously described CORE, WEIBEL would say +little concerning it.) Borrowing a chemical phrase, de novo synthesis, +WEIBEL cited the Online Journal of Current Clinical Trials as an example +of de novo electronic publishing, that is, a form in which the primary +form of the information is electronic. + +Project ADAPT, then, which OCLC completed a couple of years ago and in +fact is about to resume, is a model in which one takes page images either +in paper or microfilm and converts them automatically to a searchable +electronic database, either on-line or local. The operating assumption +is that accepting some blemishes in the data, especially for +retroconversion of materials, will make it possible to accomplish more. +Not enough money is available to support perfect conversion. + +WEIBEL related several steps taken to perform image preprocessing +(processing on the image before performing optical character +recognition), as well as image postprocessing. He denied the existence +of intelligent character recognition and asserted that what is wanted is +page recognition, which is a long way off. OCLC has experimented with +merging of multiple optical character recognition systems that will +reduce errors from an unacceptable rate of 5 characters out of every +l,000 to an unacceptable rate of 2 characters out of every l,000, but it +is not good enough. It will never be perfect. + +Concerning the CORE Project, WEIBEL observed that Bellcore is taking the +topography files, extracting the page images, and converting those +topography files to SGML markup. LESK hands that data off to OCLC, which +builds that data into a Newton database, the same system that underlies +the on-line system in virtually all of the reference products at OCLC. +The long-term goal is to make the systems interoperable so that not just +Bellcore's system and OCLC's system can access this data, but other +systems can as well, and the key to that is the Z39.50 common command +language and the full-text extension. Z39.50 is fine for MARC records, +but is not enough to do it for full text (that is, make full texts +interoperable). + +WEIBEL next outlined the critical role of SGML for a variety of purposes, +for example, as noted by HOCKEY, in the world of extremely large +databases, using highly structured data to perform field searches. +WEIBEL argued that by building the structure of the data in (i.e., the +structure of the data originally on a printed page), it becomes easy to +look at a journal article even if one cannot read the characters and know +where the title or author is, or what the sections of that document would be. +OCLC wants to make that structure explicit in the database, because it will +be important for retrieval purposes. + +The second big advantage of SGML is that it gives one the ability to +build structure into the database that can be used for display purposes +without contaminating the data with instructions about how to format +things. The distinction lies between procedural markup, which tells one +where to put dots on the page, and descriptive markup, which describes +the elements of a document. + +WEIBEL believes that there should be no procedural markup in the data at +all, that the data should be completely unsullied by information about +italics or boldness. That should be left up to the display device, +whether that display device is a page printer or a screen display device. +By keeping one's database free of that kind of contamination, one can +make decisions down the road, for example, reorganize the data in ways +that are not cramped by built-in notions of what should be italic and +what should be bold. WEIBEL strongly advocated descriptive markup. As +an example, he illustrated the index structure in the CORE data. With +subsequent illustrated examples of markup, WEIBEL acknowledged the common +complaint that SGML is hard to read in its native form, although markup +decreases considerably once one gets into the body. Without the markup, +however, one would not have the structure in the data. One can pass +markup through a LaTeX processor and convert it relatively easily to a +printed version of the document. + +WEIBEL next illustrated an extremely cluttered screen dump of OCLC's +system, in order to show as much as possible the inherent capability on +the screen. (He noted parenthetically that he had become a supporter of +X-Windows as a result of the progress of the CORE Project.) WEIBEL also +illustrated the two major parts of the interface: l) a control box that +allows one to generate lists of items, which resembles a small table of +contents based on key words one wishes to search, and 2) a document +viewer, which is a separate process in and of itself. He demonstrated +how to follow links through the electronic database simply by selecting +the appropriate button and bringing them up. He also noted problems that +remain to be accommodated in the interface (e.g., as pointed out by LESK, +what happens when users do not click on the icon for the figure). + +Given the constraints of time, WEIBEL omitted a large number of ancillary +items in order to say a few words concerning storage requirements and +what will be required to put a lot of things on line. Since it is +extremely expensive to reconvert all of this data, especially if it is +just in paper form (and even if it is in electronic form in typesetting +tapes), he advocated building journals electronically from the start. In +that case, if one only has text graphics and indexing (which is all that +one needs with de novo electronic publishing, because there is no need to +go back and look at bit-maps of pages), one can get 10,000 journals of +full text, or almost 6 million pages per year. These pages can be put in +approximately 135 gigabytes of storage, which is not all that much, +WEIBEL said. For twenty years, something less than three terabytes would +be required. WEIBEL calculated the costs of storing this information as +follows: If a gigabyte costs approximately $1,000, then a terabyte costs +approximately $1 million to buy in terms of hardware. One also needs a +building to put it in and a staff like OCLC to handle that information. +So, to support a terabyte, multiply by five, which gives $5 million per +year for a supported terabyte of data. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Tapes saved by ACS are the typography files originally +supporting publication of the journal * Cost of building tagged text into +the database * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the question-and-answer period that followed WEIBEL's +presentation, these clarifications emerged. The tapes saved by the +American Chemical Society are the typography files that originally +supported the publication of the journal. Although they are not tagged +in SGML, they are tagged in very fine detail. Every single sentence is +marked, all the registry numbers, all the publications issues, dates, and +volumes. No cost figures on tagging material on a per-megabyte basis +were available. Because ACS's typesetting system runs from tagged text, +there is no extra cost per article. It was unknown what it costs ACS to +keyboard the tagged text rather than just keyboard the text in the +cheapest process. In other words, since one intends to publish things +and will need to build tagged text into a typography system in any case, +if one does that in such a way that it can drive not only typography but +an electronic system (which is what ACS intends to do--move to SGML +publishing), the marginal cost is zero. The marginal cost represents the +cost of building tagged text into the database, which is small. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +SPERBERG-McQUEEN * Distinction between texts and computers * Implications +of recognizing that all representation is encoding * Dealing with +complicated representations of text entails the need for a grammar of +documents * Variety of forms of formal grammars * Text as a bit-mapped +image does not represent a serious attempt to represent text in +electronic form * SGML, the TEI, document-type declarations, and the +reusability and longevity of data * TEI conformance explicitly allows +extension or modification of the TEI tag set * Administrative background +of the TEI * Several design goals for the TEI tag set * An absolutely +fixed requirement of the TEI Guidelines * Challenges the TEI has +attempted to face * Good texts not beyond economic feasibility * The +issue of reproducibility or processability * The issue of mages as +simulacra for the text redux * One's model of text determines what one's +software can do with a text and has economic consequences * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Prior to speaking about SGML and markup, Michael SPERBERG-McQUEEN, editor, +Text Encoding Initiative (TEI), University of Illinois-Chicago, first drew +a distinction between texts and computers: Texts are abstract cultural +and linguistic objects while computers are complicated physical devices, +he said. Abstract objects cannot be placed inside physical devices; with +computers one can only represent text and act upon those representations. + +The recognition that all representation is encoding, SPERBERG-McQUEEN +argued, leads to the recognition of two things: 1) The topic description +for this session is slightly misleading, because there can be no discussion +of pros and cons of text-coding unless what one means is pros and cons of +working with text with computers. 2) No text can be represented in a +computer without some sort of encoding; images are one way of encoding text, +ASCII is another, SGML yet another. There is no encoding without some +information loss, that is, there is no perfect reproduction of a text that +allows one to do away with the original. Thus, the question becomes, +What is the most useful representation of text for a serious work? +This depends on what kind of serious work one is talking about. + +The projects demonstrated the previous day all involved highly complex +information and fairly complex manipulation of the textual material. +In order to use that complicated information, one has to calculate it +slowly or manually and store the result. It needs to be stored, therefore, +as part of one's representation of the text. Thus, one needs to store the +structure in the text. To deal with complicated representations of text, +one needs somehow to control the complexity of the representation of a text; +that means one needs a way of finding out whether a document and an +electronic representation of a document is legal or not; and that +means one needs a grammar of documents. + +SPERBERG-McQUEEN discussed the variety of forms of formal grammars, +implicit and explicit, as applied to text, and their capabilities. He +argued that these grammars correspond to different models of text that +different developers have. For example, one implicit model of the text +is that there is no internal structure, but just one thing after another, +a few characters and then perhaps a start-title command, and then a few +more characters and an end-title command. SPERBERG-McQUEEN also +distinguished several kinds of text that have a sort of hierarchical +structure that is not very well defined, which, typically, corresponds +to grammars that are not very well defined, as well as hierarchies that +are very well defined (e.g., the Thesaurus Linguae Graecae) and extremely +complicated things such as SGML, which handle strictly hierarchical data +very nicely. + +SPERBERG-McQUEEN conceded that one other model not illustrated on his two +displays was the model of text as a bit-mapped image, an image of a page, +and confessed to having been converted to a limited extent by the +Workshop to the view that electronic images constitute a promising, +probably superior alternative to microfilming. But he was not convinced +that electronic images represent a serious attempt to represent text in +electronic form. Many of their problems stem from the fact that they are +not direct attempts to represent the text but attempts to represent the +page, thus making them representations of representations. + +In this situation of increasingly complicated textual information and the +need to control that complexity in a useful way (which begs the question +of the need for good textual grammars), one has the introduction of SGML. +With SGML, one can develop specific document-type declarations +for specific text types or, as with the TEI, attempts to generate +general document-type declarations that can handle all sorts of text. +The TEI is an attempt to develop formats for text representation that +will ensure the kind of reusability and longevity of data discussed earlier. +It offers a way to stay alive in the state of permanent technological +revolution. + +It has been a continuing challenge in the TEI to create document grammars +that do some work in controlling the complexity of the textual object but +also allowing one to represent the real text that one will find. +Fundamental to the notion of the TEI is that TEI conformance allows one +the ability to extend or modify the TEI tag set so that it fits the text +that one is attempting to represent. + +SPERBERG-McQUEEN next outlined the administrative background of the TEI. +The TEI is an international project to develop and disseminate guidelines +for the encoding and interchange of machine-readable text. It is +sponsored by the Association for Computers in the Humanities, the +Association for Computational Linguistics, and the Association for +Literary and Linguistic Computing. Representatives of numerous other +professional societies sit on its advisory board. The TEI has a number +of affiliated projects that have provided assistance by testing drafts of +the guidelines. + +Among the design goals for the TEI tag set, the scheme first of all must +meet the needs of research, because the TEI came out of the research +community, which did not feel adequately served by existing tag sets. +The tag set must be extensive as well as compatible with existing and +emerging standards. In 1990, version 1.0 of the Guidelines was released +(SPERBERG-McQUEEN illustrated their contents). + +SPERBERG-McQUEEN noted that one problem besetting electronic text has +been the lack of adequate internal or external documentation for many +existing electronic texts. The TEI guidelines as currently formulated +contain few fixed requirements, but one of them is this: There must +always be a document header, an in-file SGML tag that provides +1) a bibliographic description of the electronic object one is talking +about (that is, who included it, when, what for, and under which title); +and 2) the copy text from which it was derived, if any. If there was +no copy text or if the copy text is unknown, then one states as much. +Version 2.0 of the Guidelines was scheduled to be completed in fall 1992 +and a revised third version is to be presented to the TEI advisory board +for its endorsement this coming winter. The TEI itself exists to provide +a markup language, not a marked-up text. + +Among the challenges the TEI has attempted to face is the need for a +markup language that will work for existing projects, that is, handle the +level of markup that people are using now to tag only chapter, section, +and paragraph divisions and not much else. At the same time, such a +language also will be able to scale up gracefully to handle the highly +detailed markup which many people foresee as the future destination of +much electronic text, and which is not the future destination but the +present home of numerous electronic texts in specialized areas. + +SPERBERG-McQUEEN dismissed the lowest-common-denominator approach as +unable to support the kind of applications that draw people who have +never been in the public library regularly before, and make them come +back. He advocated more interesting text and more intelligent text. +Asserting that it is not beyond economic feasibility to have good texts, +SPERBERG-McQUEEN noted that the TEI Guidelines listing 200-odd tags +contains tags that one is expected to enter every time the relevant +textual feature occurs. It contains all the tags that people need now, +and it is not expected that everyone will tag things in the same way. + +The question of how people will tag the text is in large part a function +of their reaction to what SPERBERG-McQUEEN termed the issue of +reproducibility. What one needs to be able to reproduce are the things +one wants to work with. Perhaps a more useful concept than that of +reproducibility or recoverability is that of processability, that is, +what can one get from an electronic text without reading it again +in the original. He illustrated this contention with a page from +Jan Comenius's bilingual Introduction to Latin. + +SPERBERG-McQUEEN returned at length to the issue of images as simulacra +for the text, in order to reiterate his belief that in the long run more +than images of pages of particular editions of the text are needed, +because just as second-generation photocopies and second-generation +microfilm degenerate, so second-generation representations tend to +degenerate, and one tends to overstress some relatively trivial aspects +of the text such as its layout on the page, which is not always +significant, despite what the text critics might say, and slight other +pieces of information such as the very important lexical ties between the +English and Latin versions of Comenius's bilingual text, for example. +Moreover, in many crucial respects it is easy to fool oneself concerning +what a scanned image of the text will accomplish. For example, in order +to study the transmission of texts, information concerning the text +carrier is necessary, which scanned images simply do not always handle. +Further, even the high-quality materials being produced at Cornell use +much of the information that one would need if studying those books as +physical objects. It is a choice that has been made. It is an arguably +justifiable choice, but one does not know what color those pen strokes in +the margin are or whether there was a stain on the page, because it has +been filtered out. One does not know whether there were rips in the page +because they do not show up, and on a couple of the marginal marks one +loses half of the mark because the pen is very light and the scanner +failed to pick it up, and so what is clearly a checkmark in the margin of +the original becomes a little scoop in the margin of the facsimile. +Standard problems for facsimile editions, not new to electronics, but +also true of light-lens photography, and are remarked here because it is +important that we not fool ourselves that even if we produce a very nice +image of this page with good contrast, we are not replacing the +manuscript any more than microfilm has replaced the manuscript. + +The TEI comes from the research community, where its first allegiance +lies, but it is not just an academic exercise. It has relevance far +beyond those who spend all of their time studying text, because one's +model of text determines what one's software can do with a text. Good +models lead to good software. Bad models lead to bad software. That has +economic consequences, and it is these economic consequences that have +led the European Community to help support the TEI, and that will lead, +SPERBERG-McQUEEN hoped, some software vendors to realize that if they +provide software with a better model of the text they can make a killing. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Implications of different DTDs and tag sets * ODA versus SGML * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +During the discussion that followed, several additional points were made. +Neither AAP (i.e., Association of American Publishers) nor CALS (i.e., +Computer-aided Acquisition and Logistics Support) has a document-type +definition for ancient Greek drama, although the TEI will be able to +handle that. Given this state of affairs and assuming that the +technical-journal producers and the commercial vendors decide to use the +other two types, then an institution like the Library of Congress, which +might receive all of their publications, would have to be able to handle +three different types of document definitions and tag sets and be able to +distinguish among them. + +Office Document Architecture (ODA) has some advantages that flow from its +tight focus on office documents and clear directions for implementation. +Much of the ODA standard is easier to read and clearer at first reading +than the SGML standard, which is extremely general. What that means is +that if one wants to use graphics in TIFF and ODA, one is stuck, because +ODA defines graphics formats while TIFF does not, whereas SGML says the +world is not waiting for this work group to create another graphics format. +What is needed is an ability to use whatever graphics format one wants. + +The TEI provides a socket that allows one to connect the SGML document to +the graphics. The notation that the graphics are in is clearly a choice +that one needs to make based on her or his environment, and that is one +advantage. SGML is less megalomaniacal in attempting to define formats +for all kinds of information, though more megalomaniacal in attempting to +cover all sorts of documents. The other advantage is that the model of +text represented by SGML is simply an order of magnitude richer and more +flexible than the model of text offered by ODA. Both offer hierarchical +structures, but SGML recognizes that the hierarchical model of the text +that one is looking at may not have been in the minds of the designers, +whereas ODA does not. + +ODA is not really aiming for the kind of document that the TEI wants to +encompass. The TEI can handle the kind of material ODA has, as well as a +significantly broader range of material. ODA seems to be very much +focused on office documents, which is what it started out being called-- +office document architecture. + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +CALALUCA * Text-encoding from a publisher's perspective * +Responsibilities of a publisher * Reproduction of Migne's Latin series +whole and complete with SGML tags based on perceived need and expected +use * Particular decisions arising from the general decision to produce +and publish PLD * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +The final speaker in this session, Eric CALALUCA, vice president, +Chadwyck-Healey, Inc., spoke from the perspective of a publisher re +text-encoding, rather than as one qualified to discuss methods of +encoding data, and observed that the presenters sitting in the room, +whether they had chosen to or not, were acting as publishers: making +choices, gathering data, gathering information, and making assessments. +CALALUCA offered the hard-won conviction that in publishing very large +text files (such as PLD), one cannot avoid making personal judgments of +appropriateness and structure. + +In CALALUCA's view, encoding decisions stem from prior judgments. Two +notions have become axioms for him in the consideration of future sources +for electronic publication: 1) electronic text publishing is as personal +as any other kind of publishing, and questions of if and how to encode +the data are simply a consequence of that prior decision; 2) all +personal decisions are open to criticism, which is unavoidable. + +CALALUCA rehearsed his role as a publisher or, better, as an intermediary +between what is viewed as a sound idea and the people who would make use +of it. Finding the specialist to advise in this process is the core of +that function. The publisher must monitor and hug the fine line between +giving users what they want and suggesting what they might need. One +responsibility of a publisher is to represent the desires of scholars and +research librarians as opposed to bullheadedly forcing them into areas +they would not choose to enter. + +CALALUCA likened the questions being raised today about data structure +and standards to the decisions faced by the Abbe Migne himself during +production of the Patrologia series in the mid-nineteenth century. +Chadwyck-Healey's decision to reproduce Migne's Latin series whole and +complete with SGML tags was also based upon a perceived need and an +expected use. In the same way that Migne's work came to be far more than +a simple handbook for clerics, PLD is already far more than a database +for theologians. It is a bedrock source for the study of Western +civilization, CALALUCA asserted. + +In regard to the decision to produce and publish PLD, the editorial board +offered direct judgments on the question of appropriateness of these +texts for conversion, their encoding and their distribution, and +concluded that the best possible project was one that avoided overt +intrusions or exclusions in so important a resource. Thus, the general +decision to transmit the original collection as clearly as possible with +the widest possible avenues for use led to other decisions: 1) To encode +the data or not, SGML or not, TEI or not. Again, the expected user +community asserted the need for normative tagging structures of important +humanities texts, and the TEI seemed the most appropriate structure for +that purpose. Research librarians, who are trained to view the larger +impact of electronic text sources on 80 or 90 or 100 doctoral +disciplines, loudly approved the decision to include tagging. They see +what is coming better than the specialist who is completely focused on +one edition of Ambrose's De Anima, and they also understand that the +potential uses exceed present expectations. 2) What will be tagged and +what will not. Once again, the board realized that one must tag the +obvious. But in no way should one attempt to identify through encoding +schemes every single discrete area of a text that might someday be +searched. That was another decision. Searching by a column number, an +author, a word, a volume, permitting combination searches, and tagging +notations seemed logical choices as core elements. 3) How does one make +the data available? Tieing it to a CD-ROM edition creates limitations, +but a magnetic tape file that is very large, is accompanied by the +encoding specifications, and that allows one to make local modifications +also allows one to incorporate any changes one may desire within the +bounds of private research, though exporting tag files from a CD-ROM +could serve just as well. Since no one on the board could possibly +anticipate each and every way in which a scholar might choose to mine +this data bank, it was decided to satisfy the basics and make some +provisions for what might come. 4) Not to encode the database would rob +it of the interchangeability and portability these important texts should +accommodate. For CALALUCA, the extensive options presented by full-text +searching require care in text selection and strongly support encoding of +data to facilitate the widest possible search strategies. Better +software can always be created, but summoning the resources, the people, +and the energy to reconvert the text is another matter. + +PLD is being encoded, captured, and distributed, because to +Chadwyck-Healey and the board it offers the widest possible array of +future research applications that can be seen today. CALALUCA concluded +by urging the encoding of all important text sources in whatever way +seems most appropriate and durable at the time, without blanching at the +thought that one's work may require emendation in the future. (Thus, +Chadwyck-Healey produced a very large humanities text database before the +final release of the TEI Guidelines.) + + ****** + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DISCUSSION * Creating texts with markup advocated * Trends in encoding * +The TEI and the issue of interchangeability of standards * A +misconception concerning the TEI * Implications for an institution like +LC in the event that a multiplicity of DTDs develops * Producing images +as a first step towards possible conversion to full text through +character recognition * The AAP tag sets as a common starting point and +the need for caution * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +HOCKEY prefaced the discussion that followed with several comments in +favor of creating texts with markup and on trends in encoding. In the +future, when many more texts are available for on-line searching, real +problems in finding what is wanted will develop, if one is faced with +millions of words of data. It therefore becomes important to consider +putting markup in texts to help searchers home in on the actual things +they wish to retrieve. Various approaches to refining retrieval methods +toward this end include building on a computer version of a dictionary +and letting the computer look up words in it to obtain more information +about the semantic structure or semantic field of a word, its grammatical +structure, and syntactic structure. + +HOCKEY commented on the present keen interest in the encoding world +in creating: 1) machine-readable versions of dictionaries that can be +initially tagged in SGML, which gives a structure to the dictionary entry; +these entries can then be converted into a more rigid or otherwise +different database structure inside the computer, which can be treated as +a dynamic tool for searching mechanisms; 2) large bodies of text to study +the language. In order to incorporate more sophisticated mechanisms, +more about how words behave needs to be known, which can be learned in +part from information in dictionaries. However, the last ten years have +seen much interest in studying the structure of printed dictionaries +converted into computer-readable form. The information one derives about +many words from those is only partial, one or two definitions of the +common or the usual meaning of a word, and then numerous definitions of +unusual usages. If the computer is using a dictionary to help retrieve +words in a text, it needs much more information about the common usages, +because those are the ones that occur over and over again. Hence the +current interest in developing large bodies of text in computer-readable +form in order to study the language. Several projects are engaged in +compiling, for example, 100 million words. HOCKEY described one with +which she was associated briefly at Oxford University involving +compilation of 100 million words of British English: about 10 percent of +that will contain detailed linguistic tagging encoded in SGML; it will +have word class taggings, with words identified as nouns, verbs, +adjectives, or other parts of speech. This tagging can then be used by +programs which will begin to learn a bit more about the structure of the +language, and then, can go to tag more text. + +HOCKEY said that the more that is tagged accurately, the more one can +refine the tagging process and thus the bigger body of text one can build +up with linguistic tagging incorporated into it. Hence, the more tagging +or annotation there is in the text, the more one may begin to learn about +language and the more it will help accomplish more intelligent OCR. She +recommended the development of software tools that will help one begin to +understand more about a text, which can then be applied to scanning +images of that text in that format and to using more intelligence to help +one interpret or understand the text. + +HOCKEY posited the need to think about common methods of text-encoding +for a long time to come, because building these large bodies of text is +extremely expensive and will only be done once. + +In the more general discussion on approaches to encoding that followed, +these points were made: + +BESSER identified the underlying problem with standards that all have to +struggle with in adopting a standard, namely, the tension between a very +highly defined standard that is very interchangeable but does not work +for everyone because something is lacking, and a standard that is less +defined, more open, more adaptable, but less interchangeable. Contending +that the way in which people use SGML is not sufficiently defined, BESSER +wondered 1) if people resist the TEI because they think it is too defined +in certain things they do not fit into, and 2) how progress with +interchangeability can be made without frightening people away. + +SPERBERG-McQUEEN replied that the published drafts of the TEI had met +with surprisingly little objection on the grounds that they do not allow +one to handle X or Y or Z. Particular concerns of the affiliated +projects have led, in practice, to discussions of how extensions are to +be made; the primary concern of any project has to be how it can be +represented locally, thus making interchange secondary. The TEI has +received much criticism based on the notion that everything in it is +required or even recommended, which, as it happens, is a misconception +from the beginning, because none of it is required and very little is +actually actively recommended for all cases, except that one document +one's source. + +SPERBERG-McQUEEN agreed with BESSER about this trade-off: all the +projects in a set of twenty TEI-conformant projects will not necessarily +tag the material in the same way. One result of the TEI will be that the +easiest problems will be solved--those dealing with the external form of +the information; but the problem that is hardest in interchange is that +one is not encoding what another wants, and vice versa. Thus, after +the adoption of a common notation, the differences in the underlying +conceptions of what is interesting about texts become more visible. +The success of a standard like the TEI will lie in the ability of +the recipient of interchanged texts to use some of what it contains +and to add the information that was not encoded that one wants, in a +layered way, so that texts can be gradually enriched and one does not +have to put in everything all at once. Hence, having a well-behaved +markup scheme is important. + +STEVENS followed up on the paradoxical analogy that BESSER alluded to in +the example of the MARC records, namely, the formats that are the same +except that they are different. STEVENS drew a parallel between +document-type definitions and MARC records for books and serials and maps, +where one has a tagging structure and there is a text-interchange. +STEVENS opined that the producers of the information will set the terms +for the standard (i.e., develop document-type definitions for the users +of their products), creating a situation that will be problematical for +an institution like the Library of Congress, which will have to deal with +the DTDs in the event that a multiplicity of them develops. Thus, +numerous people are seeking a standard but cannot find the tag set that +will be acceptable to them and their clients. SPERBERG-McQUEEN agreed +with this view, and said that the situation was in a way worse: attempting +to unify arbitrary DTDs resembled attempting to unify a MARC record with a +bibliographic record done according to the Prussian instructions. +According to STEVENS, this situation occurred very early in the process. + +WATERS recalled from early discussions on Project Open Book the concern +of many people that merely by producing images, POB was not really +enhancing intellectual access to the material. Nevertheless, not wishing +to overemphasize the opposition between imaging and full text, WATERS +stated that POB views getting the images as a first step toward possibly +converting to full text through character recognition, if the technology +is appropriate. WATERS also emphasized that encoding is involved even +with a set of images. + +SPERBERG-McQUEEN agreed with WATERS that one can create an SGML document +consisting wholly of images. At first sight, organizing graphic images +with an SGML document may not seem to offer great advantages, but the +advantages of the scheme WATERS described would be precisely that +ability to move into something that is more of a multimedia document: +a combination of transcribed text and page images. WEIBEL concurred in +this judgment, offering evidence from Project ADAPT, where a page is +divided into text elements and graphic elements, and in fact the text +elements are organized by columns and lines. These lines may be used as +the basis for distributing documents in a network environment. As one +develops software intelligent enough to recognize what those elements +are, it makes sense to apply SGML to an image initially, that may, in +fact, ultimately become more and more text, either through OCR or edited +OCR or even just through keying. For WATERS, the labor of composing the +document and saying this set of documents or this set of images belongs +to this document constitutes a significant investment. + +WEIBEL also made the point that the AAP tag sets, while not excessively +prescriptive, offer a common starting point; they do not define the +structure of the documents, though. They have some recommendations about +DTDs one could use as examples, but they do just suggest tag sets. For +example, the CORE project attempts to use the AAP markup as much as +possible, but there are clearly areas where structure must be added. +That in no way contradicts the use of AAP tag sets. + +SPERBERG-McQUEEN noted that the TEI prepared a long working paper early +on about the AAP tag set and what it lacked that the TEI thought it +needed, and a fairly long critique of the naming conventions, which has +led to a very different style of naming in the TEI. He stressed the +importance of the opposition between prescriptive markup, the kind that a +publisher or anybody can do when producing documents de novo, and +descriptive markup, in which one has to take what the text carrier +provides. In these particular tag sets it is easy to overemphasize this +opposition, because the AAP tag set is extremely flexible. Even if one +just used the DTDs, they allow almost anything to appear almost anywhere. + + ****** + +SESSION VI. COPYRIGHT ISSUES + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +PETERS * Several cautions concerning copyright in an electronic +environment * Review of copyright law in the United States * The notion +of the public good and the desirability of incentives to promote it * +What copyright protects * Works not protected by copyright * The rights +of copyright holders * Publishers' concerns in today's electronic +environment * Compulsory licenses * The price of copyright in a digital +medium and the need for cooperation * Additional clarifications * Rough +justice oftentimes the outcome in numerous copyright matters * Copyright +in an electronic society * Copyright law always only sets up the +boundaries; anything can be changed by contract * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +Marybeth PETERS, policy planning adviser to the Register of Copyrights, +Library of Congress, made several general comments and then opened the +floor to discussion of subjects of interest to the audience. + +Having attended several sessions in an effort to gain a sense of what +people did and where copyright would affect their lives, PETERS expressed +the following cautions: + + * If one takes and converts materials and puts them in new forms, + then, from a copyright point of view, one is creating something and + will receive some rights. + + * However, if what one is converting already exists, a question + immediately arises about the status of the materials in question. + + * Putting something in the public domain in the United States offers + some freedom from anxiety, but distributing it throughout the world + on a network is another matter, even if one has put it in the public + domain in the United States. Re foreign laws, very frequently a + work can be in the public domain in the United States but protected + in other countries. Thus, one must consider all of the places a + work may reach, lest one unwittingly become liable to being faced + with a suit for copyright infringement, or at least a letter + demanding discussion of what one is doing. + +PETERS reviewed copyright law in the United States. The U.S. +Constitution effectively states that Congress has the power to enact +copyright laws for two purposes: 1) to encourage the creation and +dissemination of intellectual works for the good of society as a whole; +and, significantly, 2) to give creators and those who package and +disseminate materials the economic rewards that are due them. + +Congress strives to strike a balance, which at times can become an +emotional issue. The United States has never accepted the notion of the +natural right of an author so much as it has accepted the notion of the +public good and the desirability of incentives to promote it. This state +of affairs, however, has created strains on the international level and +is the reason for several of the differences in the laws that we have. +Today the United States protects almost every kind of work that can be +called an expression of an author. The standard for gaining copyright +protection is simply originality. This is a low standard and means that +a work is not copied from something else, as well as shows a certain +minimal amount of authorship. One can also acquire copyright protection +for making a new version of preexisting material, provided it manifests +some spark of creativity. + +However, copyright does not protect ideas, methods, systems--only the way +that one expresses those things. Nor does copyright protect anything +that is mechanical, anything that does not involve choice, or criteria +concerning whether or not one should do a thing. For example, the +results of a process called declicking, in which one mechanically removes +impure sounds from old recordings, are not copyrightable. On the other +hand, the choice to record a song digitally and to increase the sound of +violins or to bring up the tympani constitutes the results of conversion +that are copyrightable. Moreover, if a work is protected by copyright in +the United States, one generally needs the permission of the copyright +owner to convert it. Normally, who will own the new--that is, converted- +-material is a matter of contract. In the absence of a contract, the +person who creates the new material is the author and owner. But people +do not generally think about the copyright implications until after the +fact. PETERS stressed the need when dealing with copyrighted works to +think about copyright in advance. One's bargaining power is much greater +up front than it is down the road. + +PETERS next discussed works not protected by copyright, for example, any +work done by a federal employee as part of his or her official duties is +in the public domain in the United States. The issue is not wholly free +of doubt concerning whether or not the work is in the public domain +outside the United States. Other materials in the public domain include: +any works published more than seventy-five years ago, and any work +published in the United States more than twenty-eight years ago, whose +copyright was not renewed. In talking about the new technology and +putting material in a digital form to send all over the world, PETERS +cautioned, one must keep in mind that while the rights may not be an +issue in the United States, they may be in different parts of the world, +where most countries previously employed a copyright term of the life of +the author plus fifty years. + +PETERS next reviewed the economics of copyright holding. Simply, +economic rights are the rights to control the reproduction of a work in +any form. They belong to the author, or in the case of a work made for +hire, the employer. The second right, which is critical to conversion, +is the right to change a work. The right to make new versions is perhaps +one of the most significant rights of authors, particularly in an +electronic world. The third right is the right to publish the work and +the right to disseminate it, something that everyone who deals in an +electronic medium needs to know. The basic rule is if a copy is sold, +all rights of distribution are extinguished with the sale of that copy. +The key is that it must be sold. A number of companies overcome this +obstacle by leasing or renting their product. These companies argue that +if the material is rented or leased and not sold, they control the uses +of a work. The fourth right, and one very important in a digital world, +is a right of public performance, which means the right to show the work +sequentially. For example, copyright owners control the showing of a +CD-ROM product in a public place such as a public library. The reverse +side of public performance is something called the right of public +display. Moral rights also exist, which at the federal level apply only +to very limited visual works of art, but in theory may apply under +contract and other principles. Moral rights may include the right of an +author to have his or her name on a work, the right of attribution, and +the right to object to distortion or mutilation--the right of integrity. + +The way copyright law is worded gives much latitude to activities such as +preservation; to use of material for scholarly and research purposes when +the user does not make multiple copies; and to the generation of +facsimile copies of unpublished works by libraries for themselves and +other libraries. But the law does not allow anyone to become the +distributor of the product for the entire world. In today's electronic +environment, publishers are extremely concerned that the entire world is +networked and can obtain the information desired from a single copy in a +single library. Hence, if there is to be only one sale, which publishers +may choose to live with, they will obtain their money in other ways, for +example, from access and use. Hence, the development of site licenses +and other kinds of agreements to cover what publishers believe they +should be compensated for. Any solution that the United States takes +today has to consider the international arena. + +Noting that the United States is a member of the Berne Convention and +subscribes to its provisions, PETERS described the permissions process. +She also defined compulsory licenses. A compulsory license, of which the +United States has had a few, builds into the law the right to use a work +subject to certain terms and conditions. In the international arena, +however, the ability to use compulsory licenses is extremely limited. +Thus, clearinghouses and other collectives comprise one option that has +succeeded in providing for use of a work. Often overlooked when one +begins to use copyrighted material and put products together is how +expensive the permissions process and managing it is. According to +PETERS, the price of copyright in a digital medium, whatever solution is +worked out, will include managing and assembling the database. She +strongly recommended that publishers and librarians or people with +various backgrounds cooperate to work out administratively feasible +systems, in order to produce better results. + +In the lengthy question-and-answer period that followed PETERS's +presentation, the following points emerged: + + * The Copyright Office maintains that anything mechanical and + totally exhaustive probably is not protected. In the event that + what an individual did in developing potentially copyrightable + material is not understood, the Copyright Office will ask about the + creative choices the applicant chose to make or not to make. As a + practical matter, if one believes she or he has made enough of those + choices, that person has a right to assert a copyright and someone + else must assert that the work is not copyrightable. The more + mechanical, the more automatic, a thing is, the less likely it is to + be copyrightable. + + * Nearly all photographs are deemed to be copyrightable, but no one + worries about them much, because everyone is free to take the same + image. Thus, a photographic copyright represents what is called a + "thin" copyright. The photograph itself must be duplicated, in + order for copyright to be violated. + + * The Copyright Office takes the position that X-rays are not + copyrightable because they are mechanical. It can be argued + whether or not image enhancement in scanning can be protected. One + must exercise care with material created with public funds and + generally in the public domain. An article written by a federal + employee, if written as part of official duties, is not + copyrightable. However, control over a scientific article written + by a National Institutes of Health grantee (i.e., someone who + receives money from the U.S. government), depends on NIH policy. If + the government agency has no policy (and that policy can be + contained in its regulations, the contract, or the grant), the + author retains copyright. If a provision of the contract, grant, or + regulation states that there will be no copyright, then it does not + exist. When a work is created, copyright automatically comes into + existence unless something exists that says it does not. + + * An enhanced electronic copy of a print copy of an older reference + work in the public domain that does not contain copyrightable new + material is a purely mechanical rendition of the original work, and + is not copyrightable. + + * Usually, when a work enters the public domain, nothing can remove + it. For example, Congress recently passed into law the concept of + automatic renewal, which means that copyright on any work published + between l964 and l978 does not have to be renewed in order to + receive a seventy-five-year term. But any work not renewed before + 1964 is in the public domain. + + * Concerning whether or not the United States keeps track of when + authors die, nothing was ever done, nor is anything being done at + the moment by the Copyright Office. + + * Software that drives a mechanical process is itself copyrightable. + If one changes platforms, the software itself has a copyright. The + World Intellectual Property Organization will hold a symposium 28 + March through 2 April l993, at Harvard University, on digital + technology, and will study this entire issue. If one purchases a + computer software package, such as MacPaint, and creates something + new, one receives protection only for that which has been added. + +PETERS added that often in copyright matters, rough justice is the +outcome, for example, in collective licensing, ASCAP (i.e., American +Society of Composers, Authors, and Publishers), and BMI (i.e., Broadcast +Music, Inc.), where it may seem that the big guys receive more than their +due. Of course, people ought not to copy a creative product without +paying for it; there should be some compensation. But the truth of the +world, and it is not a great truth, is that the big guy gets played on +the radio more frequently than the little guy, who has to do much more +until he becomes a big guy. That is true of every author, every +composer, everyone, and, unfortunately, is part of life. + +Copyright always originates with the author, except in cases of works +made for hire. (Most software falls into this category.) When an author +sends his article to a journal, he has not relinquished copyright, though +he retains the right to relinquish it. The author receives absolutely +everything. The less prominent the author, the more leverage the +publisher will have in contract negotiations. In order to transfer the +rights, the author must sign an agreement giving them away. + +In an electronic society, it is important to be able to license a writer +and work out deals. With regard to use of a work, it usually is much +easier when a publisher holds the rights. In an electronic era, a real +problem arises when one is digitizing and making information available. +PETERS referred again to electronic licensing clearinghouses. Copyright +ought to remain with the author, but as one moves forward globally in the +electronic arena, a middleman who can handle the various rights becomes +increasingly necessary. + +The notion of copyright law is that it resides with the individual, but +in an on-line environment, where a work can be adapted and tinkered with +by many individuals, there is concern. If changes are authorized and +there is no agreement to the contrary, the person who changes a work owns +the changes. To put it another way, the person who acquires permission +to change a work technically will become the author and the owner, unless +some agreement to the contrary has been made. It is typical for the +original publisher to try to control all of the versions and all of the +uses. Copyright law always only sets up the boundaries. Anything can be +changed by contract. + + ****** + +SESSION VII. CONCLUSION + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +GENERAL DISCUSSION * Two questions for discussion * Different emphases in +the Workshop * Bringing the text and image partisans together * +Desiderata in planning the long-term development of something * Questions +surrounding the issue of electronic deposit * Discussion of electronic +deposit as an allusion to the issue of standards * Need for a directory +of preservation projects in digital form and for access to their +digitized files * CETH's catalogue of machine-readable texts in the +humanities * What constitutes a publication in the electronic world? * +Need for LC to deal with the concept of on-line publishing * LC's Network +Development Office exploring the limits of MARC as a standard in terms +of handling electronic information * Magnitude of the problem and the +need for distributed responsibility in order to maintain and store +electronic information * Workshop participants to be viewed as a starting +point * Development of a network version of AM urged * A step toward AM's +construction of some sort of apparatus for network access * A delicate +and agonizing policy question for LC * Re the issue of electronic +deposit, LC urged to initiate a catalytic process in terms of distributed +responsibility * Suggestions for cooperative ventures * Commercial +publishers' fears * Strategic questions for getting the image and text +people to think through long-term cooperation * Clarification of the +driving force behind both the Perseus and the Cornell Xerox projects * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +In his role as moderator of the concluding session, GIFFORD raised two +questions he believed would benefit from discussion: 1) Are there enough +commonalities among those of us that have been here for two days so that +we can see courses of action that should be taken in the future? And, if +so, what are they and who might take them? 2) Partly derivative from +that, but obviously very dangerous to LC as host, do you see a role for +the Library of Congress in all this? Of course, the Library of Congress +holds a rather special status in a number of these matters, because it is +not perceived as a player with an economic stake in them, but are there +roles that LC can play that can help advance us toward where we are heading? + +Describing himself as an uninformed observer of the technicalities of the +last two days, GIFFORD detected three different emphases in the Workshop: +1) people who are very deeply committed to text; 2) people who are almost +passionate about images; and 3) a few people who are very committed to +what happens to the networks. In other words, the new networking +dimension, the accessibility of the processability, the portability of +all this across the networks. How do we pull those three together? + +Adding a question that reflected HOCKEY's comment that this was the +fourth workshop she had attended in the previous thirty days, FLEISCHHAUER +wondered to what extent this meeting had reinvented the wheel, or if it +had contributed anything in the way of bringing together a different group +of people from those who normally appear on the workshop circuit. + +HOCKEY confessed to being struck at this meeting and the one the +Electronic Pierce Consortium organized the previous week that this was a +coming together of people working on texts and not images. Attempting to +bring the two together is something we ought to be thinking about for the +future: How one can think about working with image material to begin +with, but structuring it and digitizing it in such a way that at a later +stage it can be interpreted into text, and find a common way of building +text and images together so that they can be used jointly in the future, +with the network support to begin there because that is how people will +want to access it. + +In planning the long-term development of something, which is what is +being done in electronic text, HOCKEY stressed the importance not only +of discussing the technical aspects of how one does it but particularly +of thinking about what the people who use the stuff will want to do. +But conversely, there are numerous things that people start to do with +electronic text or material that nobody ever thought of in the beginning. + +LESK, in response to the question concerning the role of the Library of +Congress, remarked the often suggested desideratum of having electronic +deposit: Since everything is now computer-typeset, an entire decade of +material that was machine-readable exists, but the publishers frequently +did not save it; has LC taken any action to have its copyright deposit +operation start collecting these machine-readable versions? In the +absence of PETERS, GIFFORD replied that the question was being +actively considered but that that was only one dimension of the problem. +Another dimension is the whole question of the integrity of the original +electronic document. It becomes highly important in science to prove +authorship. How will that be done? + +ERWAY explained that, under the old policy, to make a claim for a +copyright for works that were published in electronic form, including +software, one had to submit a paper copy of the first and last twenty +pages of code--something that represented the work but did not include +the entire work itself and had little value to anyone. As a temporary +measure, LC has claimed the right to demand electronic versions of +electronic publications. This measure entails a proactive role for the +Library to say that it wants a particular electronic version. Publishers +then have perhaps a year to submit it. But the real problem for LC is +what to do with all this material in all these different formats. Will +the Library mount it? How will it give people access to it? How does LC +keep track of the appropriate computers, software, and media? The situation +is so hard to control, ERWAY said, that it makes sense for each publishing +house to maintain its own archive. But LC cannot enforce that either. + +GIFFORD acknowledged LESK's suggestion that establishing a priority +offered the solution, albeit a fairly complicated one. But who maintains +that register?, he asked. GRABER noted that LC does attempt to collect a +Macintosh version and the IBM-compatible version of software. It does +not collect other versions. But while true for software, BYRUM observed, +this reply does not speak to materials, that is, all the materials that +were published that were on somebody's microcomputer or driver tapes +at a publishing office across the country. LC does well to acquire +specific machine-readable products selectively that were intended to be +machine-readable. Materials that were in machine-readable form at one time, +BYRUM said, would be beyond LC's capability at the moment, insofar as +attempting to acquire, organize, and preserve them are concerned--and +preservation would be the most important consideration. In this +connection, GIFFORD reiterated the need to work out some sense of +distributive responsibility for a number of these issues, which +inevitably will require significant cooperation and discussion. +Nobody can do it all. + +LESK suggested that some publishers may look with favor on LC beginning +to serve as a depository of tapes in an electronic manuscript standard. +Publishers may view this as a service that they did not have to perform +and they might send in tapes. However, SPERBERG-McQUEEN countered, +although publishers have had equivalent services available to them for a +long time, the electronic text archive has never turned away or been +flooded with tapes and is forever sending feedback to the depositor. +Some publishers do send in tapes. + +ANDRE viewed this discussion as an allusion to the issue of standards. +She recommended that the AAP standard and the TEI, which has already been +somewhat harmonized internationally and which also shares several +compatibilities with the AAP, be harmonized to ensure sufficient +compatibility in the software. She drew the line at saying LC ought to +be the locus or forum for such harmonization. + +Taking the group in a slightly different direction, but one where at +least in the near term LC might play a helpful role, LYNCH remarked the +plans of a number of projects to carry out preservation by creating +digital images that will end up in on-line or near-line storage at some +institution. Presumably, LC will link this material somehow to its +on-line catalog in most cases. Thus, it is in a digital form. LYNCH had +the impression that many of these institutions would be willing to make +those files accessible to other people outside the institution, provided +that there is no copyright problem. This desideratum will require +propagating the knowledge that those digitized files exist, so that they +can end up in other on-line catalogs. Although uncertain about the +mechanism for achieving this result, LYNCH said that it warranted +scrutiny because it seemed to be connected to some of the basic issues of +cataloging and distribution of records. It would be foolish, given the +amount of work that all of us have to do and our meager resources, to +discover multiple institutions digitizing the same work. Re microforms, +LYNCH said, we are in pretty good shape. + +BATTIN called this a big problem and noted that the Cornell people (who +had already departed) were working on it. At issue from the beginning +was to learn how to catalog that information into RLIN and then into +OCLC, so that it would be accessible. That issue remains to be resolved. +LYNCH rejoined that putting it into OCLC or RLIN was helpful insofar as +somebody who is thinking of performing preservation activity on that work +could learn about it. It is not necessarily helpful for institutions to +make that available. BATTIN opined that the idea was that it not only be +for preservation purposes but for the convenience of people looking for +this material. She endorsed LYNCH's dictum that duplication of this +effort was to be avoided by every means. + +HOCKEY informed the Workshop about one major current activity of CETH, +namely a catalogue of machine-readable texts in the humanities. Held on +RLIN at present, the catalogue has been concentrated on ASCII as opposed +to digitized images of text. She is exploring ways to improve the +catalogue and make it more widely available, and welcomed suggestions +about these concerns. CETH owns the records, which are not just +restricted to RLIN, and can distribute them however it wishes. + +Taking up LESK's earlier question, BATTIN inquired whether LC, since it +is accepting electronic files and designing a mechanism for dealing with +that rather than putting books on shelves, would become responsible for +the National Copyright Depository of Electronic Materials. Of course +that could not be accomplished overnight, but it would be something LC +could plan for. GIFFORD acknowledged that much thought was being devoted +to that set of problems and returned the discussion to the issue raised +by LYNCH--whether or not putting the kind of records that both BATTIN and +HOCKEY have been talking about in RLIN is not a satisfactory solution. +It seemed to him that RLIN answered LYNCH's original point concerning +some kind of directory for these kinds of materials. In a situation +where somebody is attempting to decide whether or not to scan this or +film that or to learn whether or not someone has already done so, LYNCH +suggested, RLIN is helpful, but it is not helpful in the case of a local, +on-line catalogue. Further, one would like to have her or his system be +aware that that exists in digital form, so that one can present it to a +patron, even though one did not digitize it, if it is out of copyright. +The only way to make those linkages would be to perform a tremendous +amount of real-time look-up, which would be awkward at best, or +periodically to yank the whole file from RLIN and match it against one's +own stuff, which is a nuisance. + +But where, ERWAY inquired, does one stop including things that are +available with Internet, for instance, in one's local catalogue? +It almost seems that that is LC's means to acquire access to them. +That represents LC's new form of library loan. Perhaps LC's new on-line +catalogue is an amalgamation of all these catalogues on line. LYNCH +conceded that perhaps that was true in the very long term, but was not +applicable to scanning in the short term. In his view, the totals cited +by Yale, 10,000 books over perhaps a four-year period, and 1,000-1,500 +books from Cornell, were not big numbers, while searching all over +creation for relatively rare occurrences will prove to be less efficient. +As GIFFORD wondered if this would not be a separable file on RLIN and +could be requested from them, BATTIN interjected that it was easily +accessible to an institution. SEVERTSON pointed out that that file, cum +enhancements, was available with reference information on CD-ROM, which +makes it a little more available. + +In HOCKEY's view, the real question facing the Workshop is what to put in +this catalogue, because that raises the question of what constitutes a +publication in the electronic world. (WEIBEL interjected that Eric Joule +in OCLC's Office of Research is also wrestling with this particular +problem, while GIFFORD thought it sounded fairly generic.) HOCKEY +contended that a majority of texts in the humanities are in the hands +of either a small number of large research institutions or individuals +and are not generally available for anyone else to access at all. +She wondered if these texts ought to be catalogued. + +After argument proceeded back and forth for several minutes over why +cataloguing might be a necessary service, LEBRON suggested that this +issue involved the responsibility of a publisher. The fact that someone +has created something electronically and keeps it under his or her +control does not constitute publication. Publication implies +dissemination. While it would be important for a scholar to let other +people know that this creation exists, in many respects this is no +different from an unpublished manuscript. That is what is being accessed +in there, except that now one is not looking at it in the hard-copy but +in the electronic environment. + +LEBRON expressed puzzlement at the variety of ways electronic publishing +has been viewed. Much of what has been discussed throughout these two +days has concerned CD-ROM publishing, whereas in the on-line environment +that she confronts, the constraints and challenges are very different. +Sooner or later LC will have to deal with the concept of on-line +publishing. Taking up the comment ERWAY made earlier about storing +copies, LEBRON gave her own journal as an example. How would she deposit +OJCCT for copyright?, she asked, because the journal will exist in the +mainframe at OCLC and people will be able to access it. Here the +situation is different, ownership versus access, and is something that +arises with publication in the on-line environment, faster than is +sometimes realized. Lacking clear answers to all of these questions +herself, LEBRON did not anticipate that LC would be able to take a role +in helping to define some of them for quite a while. + +GREENFIELD observed that LC's Network Development Office is attempting, +among other things, to explore the limits of MARC as a standard in terms +of handling electronic information. GREENFIELD also noted that Rebecca +GUENTHER from that office gave a paper to the American Society for +Information Science (ASIS) summarizing several of the discussion papers +that were coming out of the Network Development Office. GREENFIELD said +he understood that that office had a list-server soliciting just the kind +of feedback received today concerning the difficulties of identifying and +cataloguing electronic information. GREENFIELD hoped that everybody +would be aware of that and somehow contribute to that conversation. + +Noting two of LC's roles, first, to act as a repository of record for +material that is copyrighted in this country, and second, to make +materials it holds available in some limited form to a clientele that +goes beyond Congress, BESSER suggested that it was incumbent on LC to +extend those responsibilities to all the things being published in +electronic form. This would mean eventually accepting electronic +formats. LC could require that at some point they be in a certain +limited set of formats, and then develop mechanisms for allowing people +to access those in the same way that other things are accessed. This +does not imply that they are on the network and available to everyone. +LC does that with most of its bibliographic records, BESSER said, which +end up migrating to the utility (e.g., OCLC) or somewhere else. But just +as most of LC's books are available in some form through interlibrary +loan or some other mechanism, so in the same way electronic formats ought +to be available to others in some format, though with some copyright +considerations. BESSER was not suggesting that these mechanisms be +established tomorrow, only that they seemed to fall within LC's purview, +and that there should be long-range plans to establish them. + +Acknowledging that those from LC in the room agreed with BESSER +concerning the need to confront difficult questions, GIFFORD underscored +the magnitude of the problem of what to keep and what to select. GIFFORD +noted that LC currently receives some 31,000 items per day, not counting +electronic materials, and argued for much more distributed responsibility +in order to maintain and store electronic information. + +BESSER responded that the assembled group could be viewed as a starting +point, whose initial operating premise could be helping to move in this +direction and defining how LC could do so, for example, in areas of +standardization or distribution of responsibility. + +FLEISCHHAUER added that AM was fully engaged, wrestling with some of the +questions that pertain to the conversion of older historical materials, +which would be one thing that the Library of Congress might do. Several +points mentioned by BESSER and several others on this question have a +much greater impact on those who are concerned with cataloguing and the +networking of bibliographic information, as well as preservation itself. + +Speaking directly to AM, which he considered was a largely uncopyrighted +database, LYNCH urged development of a network version of AM, or +consideration of making the data in it available to people interested in +doing network multimedia. On account of the current great shortage of +digital data that is both appealing and unencumbered by complex rights +problems, this course of action could have a significant effect on making +network multimedia a reality. + +In this connection, FLEISCHHAUER reported on a fragmentary prototype in +LC's Office of Information Technology Services that attempts to associate +digital images of photographs with cataloguing information in ways that +work within a local area network--a step, so to say, toward AM's +construction of some sort of apparatus for access. Further, AM has +attempted to use standard data forms in order to help make that +distinction between the access tools and the underlying data, and thus +believes that the database is networkable. + +A delicate and agonizing policy question for LC, however, which comes +back to resources and unfortunately has an impact on this, is to find +some appropriate, honorable, and legal cost-recovery possibilities. A +certain skittishness concerning cost-recovery has made people unsure +exactly what to do. AM would be highly receptive to discussing further +LYNCH's offer to test or demonstrate its database in a network +environment, FLEISCHHAUER said. + +Returning the discussion to what she viewed as the vital issue of +electronic deposit, BATTIN recommended that LC initiate a catalytic +process in terms of distributed responsibility, that is, bring together +the distributed organizations and set up a study group to look at all +these issues and see where we as a nation should move. The broader +issues of how we deal with the management of electronic information will +not disappear, but only grow worse. + +LESK took up this theme and suggested that LC attempt to persuade one +major library in each state to deal with its state equivalent publisher, +which might produce a cooperative project that would be equitably +distributed around the country, and one in which LC would be dealing with +a minimal number of publishers and minimal copyright problems. + +GRABER remarked the recent development in the scientific community of a +willingness to use SGML and either deposit or interchange on a fairly +standardized format. He wondered if a similar movement was taking place +in the humanities. Although the National Library of Medicine found only +a few publishers to cooperate in a like venture two or three years ago, a +new effort might generate a much larger number willing to cooperate. + +KIMBALL recounted his unit's (Machine-Readable Collections Reading Room) +troubles with the commercial publishers of electronic media in acquiring +materials for LC's collections, in particular the publishers' fear that +they would not be able to cover their costs and would lose control of +their products, that LC would give them away or sell them and make +profits from them. He doubted that the publishing industry was prepared +to move into this area at the moment, given its resistance to allowing LC +to use its machine-readable materials as the Library would like. + +The copyright law now addresses compact disk as a medium, and LC can +request one copy of that, or two copies if it is the only version, and +can request copies of software, but that fails to address magazines or +books or anything like that which is in machine-readable form. + +GIFFORD acknowledged the thorny nature of this issue, which he illustrated +with the example of the cumbersome process involved in putting a copy of a +scientific database on a LAN in LC's science reading room. He also +acknowledged that LC needs help and could enlist the energies and talents +of Workshop participants in thinking through a number of these problems. + +GIFFORD returned the discussion to getting the image and text people to +think through together where they want to go in the long term. MYLONAS +conceded that her experience at the Pierce Symposium the previous week at +Georgetown University and this week at LC had forced her to reevaluate +her perspective on the usefulness of text as images. MYLONAS framed the +issues in a series of questions: How do we acquire machine-readable +text? Do we take pictures of it and perform OCR on it later? Is it +important to obtain very high-quality images and text, etc.? +FLEISCHHAUER agreed with MYLONAS's framing of strategic questions, adding +that a large institution such as LC probably has to do all of those +things at different times. Thus, the trick is to exercise judgment. The +Workshop had added to his and AM's considerations in making those +judgments. Concerning future meetings or discussions, MYLONAS suggested +that screening priorities would be helpful. + +WEIBEL opined that the diversity reflected in this group was a sign both +of the health and of the immaturity of the field, and more time would +have to pass before we convince one another concerning standards. + +An exchange between MYLONAS and BATTIN clarified the point that the +driving force behind both the Perseus and the Cornell Xerox projects was +the preservation of knowledge for the future, not simply for particular +research use. In the case of Perseus, MYLONAS said, the assumption was +that the texts would not be entered again into electronically readable +form. SPERBERG-McQUEEN added that a scanned image would not serve as an +archival copy for purposes of preservation in the case of, say, the Bill +of Rights, in the sense that the scanned images are effectively the +archival copies for the Cornell mathematics books. + + + *** *** *** ****** *** *** *** + + + Appendix I: PROGRAM + + + + WORKSHOP + ON + ELECTRONIC + TEXTS + + + + 9-10 June 1992 + + Library of Congress + Washington, D.C. + + + + Supported by a Grant from the David and Lucile Packard Foundation + + +Tuesday, 9 June 1992 + +NATIONAL DEMONSTRATION LAB, ATRIUM, LIBRARY MADISON + +8:30 AM Coffee and Danish, registration + +9:00 AM Welcome + + Prosser Gifford, Director for Scholarly Programs, and Carl + Fleischhauer, Coordinator, American Memory, Library of + Congress + +9:l5 AM Session I. Content in a New Form: Who Will Use It and What + Will They Do? + + Broad description of the range of electronic information. + Characterization of who uses it and how it is or may be used. + In addition to a look at scholarly uses, this session will + include a presentation on use by students (K-12 and college) + and the general public. + + Moderator: James Daly + Avra Michelson, Archival Research and Evaluation Staff, + National Archives and Records Administration (Overview) + Susan H. Veccia, Team Leader, American Memory, User Evaluation, + and + Joanne Freeman, Associate Coordinator, American Memory, Library + of Congress (Beyond the scholar) + +10:30- +11:00 AM Break + +11:00 AM Session II. Show and Tell. + + Each presentation to consist of a fifteen-minute + statement/show; group discussion will follow lunch. + + Moderator: Jacqueline Hess, Director, National Demonstration + Lab + + 1. A classics project, stressing texts and text retrieval + more than multimedia: Perseus Project, Harvard + University + Elli Mylonas, Managing Editor + + 2. Other humanities projects employing the emerging norms of + the Text Encoding Initiative (TEI): Chadwyck-Healey's + The English Poetry Full Text Database and/or Patrologia + Latina Database + Eric M. Calaluca, Vice President, Chadwyck-Healey, Inc. + + 3. American Memory + Carl Fleischhauer, Coordinator, and + Ricky Erway, Associate Coordinator, Library of Congress + + 4. Founding Fathers example from Packard Humanities + Institute: The Papers of George Washington, University + of Virginia + Dorothy Twohig, Managing Editor, and/or + David Woodley Packard + + 5. An electronic medical journal offering graphics and + full-text searchability: The Online Journal of Current + Clinical Trials, American Association for the Advancement + of Science + Maria L. Lebron, Managing Editor + + 6. A project that offers facsimile images of pages but omits + searchable text: Cornell math books + Lynne K. Personius, Assistant Director, Cornell + Information Technologies for Scholarly Information + Sources, Cornell University + +12:30 PM Lunch (Dining Room A, Library Madison 620. Exhibits + available.) + +1:30 PM Session II. Show and Tell (Cont'd.). + +3:00- +3:30 PM Break + +3:30- +5:30 PM Session III. Distribution, Networks, and Networking: Options + for Dissemination. + + Published disks: University presses and public-sector + publishers, private-sector publishers + Computer networks + + Moderator: Robert G. Zich, Special Assistant to the Associate + Librarian for Special Projects, Library of Congress + Clifford A. Lynch, Director, Library Automation, University of + California + Howard Besser, School of Library and Information Science, + University of Pittsburgh + Ronald L. Larsen, Associate Director of Libraries for + Information Technology, University of Maryland at College + Park + Edwin B. Brownrigg, Executive Director, Memex Research + Institute + +6:30 PM Reception (Montpelier Room, Library Madison 619.) + + ****** + +Wednesday, 10 June 1992 + +DINING ROOM A, LIBRARY MADISON 620 + +8:30 AM Coffee and Danish + +9:00 AM Session IV. Image Capture, Text Capture, Overview of Text and + Image Storage Formats. + + Moderator: William L. Hooton, Vice President of Operations, + I-NET + + A) Principal Methods for Image Capture of Text: + Direct scanning + Use of microform + + Anne R. Kenney, Assistant Director, Department of Preservation + and Conservation, Cornell University + Pamela Q.J. Andre, Associate Director, Automation, and + Judith A. Zidar, Coordinator, National Agricultural Text + Digitizing Program (NATDP), National Agricultural Library + (NAL) + Donald J. Waters, Head, Systems Office, Yale University Library + + B) Special Problems: + Bound volumes + Conservation + Reproducing printed halftones + + Carl Fleischhauer, Coordinator, American Memory, Library of + Congress + George Thoma, Chief, Communications Engineering Branch, + National Library of Medicine (NLM) + +10:30- +11:00 AM Break + +11:00 AM Session IV. Image Capture, Text Capture, Overview of Text and + Image Storage Formats (Cont'd.). + + C) Image Standards and Implications for Preservation + + Jean Baronas, Senior Manager, Department of Standards and + Technology, Association for Information and Image Management + (AIIM) + Patricia Battin, President, The Commission on Preservation and + Access (CPA) + + D) Text Conversion: + OCR vs. rekeying + Standards of accuracy and use of imperfect texts + Service bureaus + + Stuart Weibel, Senior Research Specialist, Online Computer + Library Center, Inc. (OCLC) + Michael Lesk, Executive Director, Computer Science Research, + Bellcore + Ricky Erway, Associate Coordinator, American Memory, Library of + Congress + Pamela Q.J. Andre, Associate Director, Automation, and + Judith A. Zidar, Coordinator, National Agricultural Text + Digitizing Program (NATDP), National Agricultural Library + (NAL) + +12:30- +1:30 PM Lunch + +1:30 PM Session V. Approaches to Preparing Electronic Texts. + + Discussion of approaches to structuring text for the computer; + pros and cons of text coding, description of methods in + practice, and comparison of text-coding methods. + + Moderator: Susan Hockey, Director, Center for Electronic Texts + in the Humanities (CETH), Rutgers and Princeton Universities + David Woodley Packard + C.M. Sperberg-McQueen, Editor, Text Encoding Initiative (TEI), + University of Illinois-Chicago + Eric M. Calaluca, Vice President, Chadwyck-Healey, Inc. + +3:30- +4:00 PM Break + +4:00 PM Session VI. Copyright Issues. + + Marybeth Peters, Policy Planning Adviser to the Register of + Copyrights, Library of Congress + +5:00 PM Session VII. Conclusion. + + General discussion. + What topics were omitted or given short shrift that anyone + would like to talk about now? + Is there a "group" here? What should the group do next, if + anything? What should the Library of Congress do next, if + anything? + Moderator: Prosser Gifford, Director for Scholarly Programs, + Library of Congress + +6:00 PM Adjourn + + + *** *** *** ****** *** *** *** + + + Appendix II: ABSTRACTS + + +SESSION I + +Avra MICHELSON Forecasting the Use of Electronic Texts by + Social Sciences and Humanities Scholars + +This presentation explores the ways in which electronic texts are likely +to be used by the non-scientific scholarly community. Many of the +remarks are drawn from a report the speaker coauthored with Jeff +Rothenberg, a computer scientist at The RAND Corporation. + +The speaker assesses 1) current scholarly use of information technology +and 2) the key trends in information technology most relevant to the +research process, in order to predict how social sciences and humanities +scholars are apt to use electronic texts. In introducing the topic, +current use of electronic texts is explored broadly within the context of +scholarly communication. From the perspective of scholarly +communication, the work of humanities and social sciences scholars +involves five processes: 1) identification of sources, 2) communication +with colleagues, 3) interpretation and analysis of data, 4) dissemination +of research findings, and 5) curriculum development and instruction. The +extent to which computation currently permeates aspects of scholarly +communication represents a viable indicator of the prospects for +electronic texts. + +The discussion of current practice is balanced by an analysis of key +trends in the scholarly use of information technology. These include the +trends toward end-user computing and connectivity, which provide a +framework for forecasting the use of electronic texts through this +millennium. The presentation concludes with a summary of the ways in +which the nonscientific scholarly community can be expected to use +electronic texts, and the implications of that use for information +providers. + +Susan VECCIA and Joanne FREEMAN Electronic Archives for the Public: + Use of American Memory in Public and + School Libraries + +This joint discussion focuses on nonscholarly applications of electronic +library materials, specifically addressing use of the Library of Congress +American Memory (AM) program in a small number of public and school +libraries throughout the United States. AM consists of selected Library +of Congress primary archival materials, stored on optical media +(CD-ROM/videodisc), and presented with little or no editing. Many +collections are accompanied by electronic introductions and user's guides +offering background information and historical context. Collections +represent a variety of formats including photographs, graphic arts, +motion pictures, recorded sound, music, broadsides and manuscripts, +books, and pamphlets. + +In 1991, the Library of Congress began a nationwide evaluation of AM in +different types of institutions. Test sites include public libraries, +elementary and secondary school libraries, college and university +libraries, state libraries, and special libraries. Susan VECCIA and +Joanne FREEMAN will discuss their observations on the use of AM by the +nonscholarly community, using evidence gleaned from this ongoing +evaluation effort. + +VECCIA will comment on the overall goals of the evaluation project, and +the types of public and school libraries included in this study. Her +comments on nonscholarly use of AM will focus on the public library as a +cultural and community institution, often bridging the gap between formal +and informal education. FREEMAN will discuss the use of AM in school +libraries. Use by students and teachers has revealed some broad +questions about the use of electronic resources, as well as definite +benefits gained by the "nonscholar." Topics will include the problem of +grasping content and context in an electronic environment, the stumbling +blocks created by "new" technologies, and the unique skills and interests +awakened through use of electronic resources. + +SESSION II + +Elli MYLONAS The Perseus Project: Interactive Sources and + Studies in Classical Greece + +The Perseus Project (5) has just released Perseus 1.0, the first publicly +available version of its hypertextual database of multimedia materials on +classical Greece. Perseus is designed to be used by a wide audience, +comprised of readers at the student and scholar levels. As such, it must +be able to locate information using different strategies, and it must +contain enough detail to serve the different needs of its users. In +addition, it must be delivered so that it is affordable to its target +audience. [These problems and the solutions we chose are described in +Mylonas, "An Interface to Classical Greek Civilization," JASIS 43:2, +March 1992.] + +In order to achieve its objective, the project staff decided to make a +conscious separation between selecting and converting textual, database, +and image data on the one hand, and putting it into a delivery system on +the other. That way, it is possible to create the electronic data +without thinking about the restrictions of the delivery system. We have +made a great effort to choose system-independent formats for our data, +and to put as much thought and work as possible into structuring it so +that the translation from paper to electronic form will enhance the value +of the data. [A discussion of these solutions as of two years ago is in +Elli Mylonas, Gregory Crane, Kenneth Morrell, and D. Neel Smith, "The +Perseus Project: Data in the Electronic Age," in Accessing Antiquity: +The Computerization of Classical Databases, J. Solomon and T. Worthen +(eds.), University of Arizona Press, in press.] + +Much of the work on Perseus is focused on collecting and converting the +data on which the project is based. At the same time, it is necessary to +provide means of access to the information, in order to make it usable, +and them to investigate how it is used. As we learn more about what +students and scholars from different backgrounds do with Perseus, we can +adjust our data collection, and also modify the system to accommodate +them. In creating a delivery system for general use, we have tried to +avoid favoring any one type of use by allowing multiple forms of access +to and navigation through the system. + +The way text is handled exemplifies some of these principles. All text +in Perseus is tagged using SGML, following the guidelines of the Text +Encoding Initiative (TEI). This markup is used to index the text, and +process it so that it can be imported into HyperCard. No SGML markup +remains in the text that reaches the user, because currently it would be +too expensive to create a system that acts on SGML in real time. +However, the regularity provided by SGML is essential for verifying the +content of the texts, and greatly speeds all the processing performed on +them. The fact that the texts exist in SGML ensures that they will be +relatively easy to port to different hardware and software, and so will +outlast the current delivery platform. Finally, the SGML markup +incorporates existing canonical reference systems (chapter, verse, line, +etc.); indexing and navigation are based on these features. This ensures +that the same canonical reference will always resolve to the same point +within a text, and that all versions of our texts, regardless of delivery +platform (even paper printouts) will function the same way. + +In order to provide tools for users, the text is processed by a +morphological analyzer, and the results are stored in a database. +Together with the index, the Greek-English Lexicon, and the index of all +the English words in the definitions of the lexicon, the morphological +analyses comprise a set of linguistic tools that allow users of all +levels to work with the textual information, and to accomplish different +tasks. For example, students who read no Greek may explore a concept as +it appears in Greek texts by using the English-Greek index, and then +looking up works in the texts and translations, or scholars may do +detailed morphological studies of word use by using the morphological +analyses of the texts. Because these tools were not designed for any one +use, the same tools and the same data can be used by both students and +scholars. + +NOTES: + (5) Perseus is based at Harvard University, with collaborators at + several other universities. The project has been funded primarily + by the Annenberg/CPB Project, as well as by Harvard University, + Apple Computer, and others. It is published by Yale University + Press. Perseus runs on Macintosh computers, under the HyperCard + program. + +Eric CALALUCA + +Chadwyck-Healey embarked last year on two distinct yet related full-text +humanities database projects. + +The English Poetry Full-Text Database and the Patrologia Latina Database +represent new approaches to linguistic research resources. The size and +complexity of the projects present problems for electronic publishers, +but surmountable ones if they remain abreast of the latest possibilities +in data capture and retrieval software techniques. + +The issues which required address prior to the commencement of the +projects were legion: + + 1. Editorial selection (or exclusion) of materials in each + database + + 2. Deciding whether or not to incorporate a normative encoding + structure into the databases? + A. If one is selected, should it be SGML? + B. If SGML, then the TEI? + + 3. Deliver as CD-ROM, magnetic tape, or both? + + 4. Can one produce retrieval software advanced enough for the + postdoctoral linguist, yet accessible enough for unattended + general use? Should one try? + + 5. Re fair and liberal networking policies, what are the risks to + an electronic publisher? + + 6. How does the emergence of national and international education + networks affect the use and viability of research projects + requiring high investment? Do the new European Community + directives concerning database protection necessitate two + distinct publishing projects, one for North America and one for + overseas? + +From new notions of "scholarly fair use" to the future of optical media, +virtually every issue related to electronic publishing was aired. The +result is two projects which have been constructed to provide the quality +research resources with the fewest encumbrances to use by teachers and +private scholars. + +Dorothy TWOHIG + +In spring 1988 the editors of the papers of George Washington, John +Adams, Thomas Jefferson, James Madison, and Benjamin Franklin were +approached by classics scholar David Packard on behalf of the Packard +Humanities Foundation with a proposal to produce a CD-ROM edition of the +complete papers of each of the Founding Fathers. This electronic edition +will supplement the published volumes, making the documents widely +available to students and researchers at reasonable cost. We estimate +that our CD-ROM edition of Washington's Papers will be substantially +completed within the next two years and ready for publication. Within +the next ten years or so, similar CD-ROM editions of the Franklin, Adams, +Jefferson, and Madison papers also will be available. At the Library of +Congress's session on technology, I would like to discuss not only the +experience of the Washington Papers in producing the CD-ROM edition, but +the impact technology has had on these major editorial projects. +Already, we are editing our volumes with an eye to the material that will +be readily available in the CD-ROM edition. The completed electronic +edition will provide immense possibilities for the searching of documents +for information in a way never possible before. The kind of technical +innovations that are currently available and on the drawing board will +soon revolutionize historical research and the production of historical +documents. Unfortunately, much of this new technology is not being used +in the planning stages of historical projects, simply because many +historians are aware only in the vaguest way of its existence. At least +two major new historical editing projects are considering microfilm +editions, simply because they are not aware of the possibilities of +electronic alternatives and the advantages of the new technology in terms +of flexibility and research potential compared to microfilm. In fact, +too many of us in history and literature are still at the stage of +struggling with our PCs. There are many historical editorial projects in +progress presently, and an equal number of literary projects. While the +two fields have somewhat different approaches to textual editing, there +are ways in which electronic technology can be of service to both. + +Since few of the editors involved in the Founding Fathers CD-ROM editions +are technical experts in any sense, I hope to point out in my discussion +of our experience how many of these electronic innovations can be used +successfully by scholars who are novices in the world of new technology. +One of the major concerns of the sponsors of the multitude of new +scholarly editions is the limited audience reached by the published +volumes. Most of these editions are being published in small quantities +and the publishers' price for them puts them out of the reach not only of +individual scholars but of most public libraries and all but the largest +educational institutions. However, little attention is being given to +ways in which technology can bypass conventional publication to make +historical and literary documents more widely available. + +What attracted us most to the CD-ROM edition of The Papers of George +Washington was the fact that David Packard's aim was to make a complete +edition of all of the 135,000 documents we have collected available in an +inexpensive format that would be placed in public libraries, small +colleges, and even high schools. This would provide an audience far +beyond our present 1,000-copy, $45 published edition. Since the CD-ROM +edition will carry none of the explanatory annotation that appears in the +published volumes, we also feel that the use of the CD-ROM will lead many +researchers to seek out the published volumes. + +In addition to ignorance of new technical advances, I have found that too +many editors--and historians and literary scholars--are resistant and +even hostile to suggestions that electronic technology may enhance their +work. I intend to discuss some of the arguments traditionalists are +advancing to resist technology, ranging from distrust of the speed with +which it changes (we are already wondering what is out there that is +better than CD-ROM) to suspicion of the technical language used to +describe electronic developments. + +Maria LEBRON + +The Online Journal of Current Clinical Trials, a joint venture of the +American Association for the Advancement of Science (AAAS) and the Online +Computer Library Center, Inc. (OCLC), is the first peer-reviewed journal +to provide full text, tabular material, and line illustrations on line. +This presentation will discuss the genesis and start-up period of the +journal. Topics of discussion will include historical overview, +day-to-day management of the editorial peer review, and manuscript +tagging and publication. A demonstration of the journal and its features +will accompany the presentation. + +Lynne PERSONIUS + +Cornell University Library, Cornell Information Technologies, and Xerox +Corporation, with the support of the Commission on Preservation and +Access, and Sun Microsystems, Inc., have been collaborating in a project +to test a prototype system for recording brittle books as digital images +and producing, on demand, high-quality archival paper replacements. The +project goes beyond that, however, to investigate some of the issues +surrounding scanning, storing, retrieving, and providing access to +digital images in a network environment. + +The Joint Study in Digital Preservation began in January 1990. Xerox +provided the College Library Access and Storage System (CLASS) software, +a prototype 600-dots-per-inch (dpi) scanner, and the hardware necessary +to support network printing on the DocuTech printer housed in Cornell's +Computing and Communications Center (CCC). + +The Cornell staff using the hardware and software became an integral part +of the development and testing process for enhancements to the CLASS +software system. The collaborative nature of this relationship is +resulting in a system that is specifically tailored to the preservation +application. + +A digital library of 1,000 volumes (or approximately 300,000 images) has +been created and is stored on an optical jukebox that resides in CCC. +The library includes a collection of select mathematics monographs that +provides mathematics faculty with an opportunity to use the electronic +library. The remaining volumes were chosen for the library to test the +various capabilities of the scanning system. + +One project objective is to provide users of the Cornell library and the +library staff with the ability to request facsimiles of digitized images +or to retrieve the actual electronic image for browsing. A prototype +viewing workstation has been created by Xerox, with input into the design +by a committee of Cornell librarians and computer professionals. This +will allow us to experiment with patron access to the images that make up +the digital library. The viewing station provides search, retrieval, and +(ultimately) printing functions with enhancements to facilitate +navigation through multiple documents. + +Cornell currently is working to extend access to the digital library to +readers using workstations from their offices. This year is devoted to +the development of a network resident image conversion and delivery +server, and client software that will support readers who use Apple +Macintosh computers, IBM windows platforms, and Sun workstations. +Equipment for this development was provided by Sun Microsystems with +support from the Commission on Preservation and Access. + +During the show-and-tell session of the Workshop on Electronic Texts, a +prototype view station will be demonstrated. In addition, a display of +original library books that have been digitized will be available for +review with associated printed copies for comparison. The fifteen-minute +overview of the project will include a slide presentation that +constitutes a "tour" of the preservation digitizing process. + +The final network-connected version of the viewing station will provide +library users with another mechanism for accessing the digital library, +and will also provide the capability of viewing images directly. This +will not require special software, although a powerful computer with good +graphics will be needed. + +The Joint Study in Digital Preservation has generated a great deal of +interest in the library community. Unfortunately, or perhaps +fortunately, this project serves to raise a vast number of other issues +surrounding the use of digital technology for the preservation and use of +deteriorating library materials, which subsequent projects will need to +examine. Much work remains. + +SESSION III + +Howard BESSER Networking Multimedia Databases + +What do we have to consider in building and distributing databases of +visual materials in a multi-user environment? This presentation examines +a variety of concerns that need to be addressed before a multimedia +database can be set up in a networked environment. + +In the past it has not been feasible to implement databases of visual +materials in shared-user environments because of technological barriers. +Each of the two basic models for multi-user multimedia databases has +posed its own problem. The analog multimedia storage model (represented +by Project Athena's parallel analog and digital networks) has required an +incredibly complex (and expensive) infrastructure. The economies of +scale that make multi-user setups cheaper per user served do not operate +in an environment that requires a computer workstation, videodisc player, +and two display devices for each user. + +The digital multimedia storage model has required vast amounts of storage +space (as much as one gigabyte per thirty still images). In the past the +cost of such a large amount of storage space made this model a +prohibitive choice as well. But plunging storage costs are finally +making this second alternative viable. + +If storage no longer poses such an impediment, what do we need to +consider in building digitally stored multi-user databases of visual +materials? This presentation will examine the networking and +telecommunication constraints that must be overcome before such databases +can become commonplace and useful to a large number of people. + +The key problem is the vast size of multimedia documents, and how this +affects not only storage but telecommunications transmission time. +Anything slower than T-1 speed is impractical for files of 1 megabyte or +larger (which is likely to be small for a multimedia document). For +instance, even on a 56 Kb line it would take three minutes to transfer a +1-megabyte file. And these figures assume ideal circumstances, and do +not take into consideration other users contending for network bandwidth, +disk access time, or the time needed for remote display. Current common +telephone transmission rates would be completely impractical; few users +would be willing to wait the hour necessary to transmit a single image at +2400 baud. + +This necessitates compression, which itself raises a number of other +issues. In order to decrease file sizes significantly, we must employ +lossy compression algorithms. But how much quality can we afford to +lose? To date there has been only one significant study done of +image-quality needs for a particular user group, and this study did not +look at loss resulting from compression. Only after identifying +image-quality needs can we begin to address storage and network bandwidth +needs. + +Experience with X-Windows-based applications (such as Imagequery, the +University of California at Berkeley image database) demonstrates the +utility of a client-server topology, but also points to the limitation of +current software for a distributed environment. For example, +applications like Imagequery can incorporate compression, but current X +implementations do not permit decompression at the end user's +workstation. Such decompression at the host computer alleviates storage +capacity problems while doing nothing to address problems of +telecommunications bandwidth. + +We need to examine the effects on network through-put of moving +multimedia documents around on a network. We need to examine various +topologies that will help us avoid bottlenecks around servers and +gateways. Experience with applications such as these raise still broader +questions. How closely is the multimedia document tied to the software +for viewing it? Can it be accessed and viewed from other applications? +Experience with the MARC format (and more recently with the Z39.50 +protocols) shows how useful it can be to store documents in a form in +which they can be accessed by a variety of application software. + +Finally, from an intellectual-access standpoint, we need to address the +issue of providing access to these multimedia documents in +interdisciplinary environments. We need to examine terminology and +indexing strategies that will allow us to provide access to this material +in a cross-disciplinary way. + +Ronald LARSEN Directions in High-Performance Networking for + Libraries + +The pace at which computing technology has advanced over the past forty +years shows no sign of abating. Roughly speaking, each five-year period +has yielded an order-of-magnitude improvement in price and performance of +computing equipment. No fundamental hurdles are likely to prevent this +pace from continuing for at least the next decade. It is only in the +past five years, though, that computing has become ubiquitous in +libraries, affecting all staff and patrons, directly or indirectly. + +During these same five years, communications rates on the Internet, the +principal academic computing network, have grown from 56 kbps to 1.5 +Mbps, and the NSFNet backbone is now running 45 Mbps. Over the next five +years, communication rates on the backbone are expected to exceed 1 Gbps. +Growth in both the population of network users and the volume of network +traffic has continued to grow geometrically, at rates approaching 15 +percent per month. This flood of capacity and use, likened by some to +"drinking from a firehose," creates immense opportunities and challenges +for libraries. Libraries must anticipate the future implications of this +technology, participate in its development, and deploy it to ensure +access to the world's information resources. + +The infrastructure for the information age is being put in place. +Libraries face strategic decisions about their role in the development, +deployment, and use of this infrastructure. The emerging infrastructure +is much more than computers and communication lines. It is more than the +ability to compute at a remote site, send electronic mail to a peer +across the country, or move a file from one library to another. The next +five years will witness substantial development of the information +infrastructure of the network. + +In order to provide appropriate leadership, library professionals must +have a fundamental understanding of and appreciation for computer +networking, from local area networks to the National Research and +Education Network (NREN). This presentation addresses these +fundamentals, and how they relate to libraries today and in the near +future. + +Edwin BROWNRIGG Electronic Library Visions and Realities + +The electronic library has been a vision desired by many--and rejected by +some--since Vannevar Bush coined the term memex to describe an automated, +intelligent, personal information system. Variations on this vision have +included Ted Nelson's Xanadau, Alan Kay's Dynabook, and Lancaster's +"paperless library," with the most recent incarnation being the +"Knowledge Navigator" described by John Scully of Apple. But the reality +of library service has been less visionary and the leap to the electronic +library has eluded universities, publishers, and information technology +files. + +The Memex Research Institute (MemRI), an independent, nonprofit research +and development organization, has created an Electronic Library Program +of shared research and development in order to make the collective vision +more concrete. The program is working toward the creation of large, +indexed publicly available electronic image collections of published +documents in academic, special, and public libraries. This strategic +plan is the result of the first stage of the program, which has been an +investigation of the information technologies available to support such +an effort, the economic parameters of electronic service compared to +traditional library operations, and the business and political factors +affecting the shift from print distribution to electronic networked +access. + +The strategic plan envisions a combination of publicly searchable access +databases, image (and text) document collections stored on network "file +servers," local and remote network access, and an intellectual property +management-control system. This combination of technology and +information content is defined in this plan as an E-library or E-library +collection. Some participating sponsors are already developing projects +based on MemRI's recommended directions. + +The E-library strategy projected in this plan is a visionary one that can +enable major changes and improvements in academic, public, and special +library service. This vision is, though, one that can be realized with +today's technology. At the same time, it will challenge the political +and social structure within which libraries operate: in academic +libraries, the traditional emphasis on local collections, extending to +accreditation issues; in public libraries, the potential of electronic +branch and central libraries fully available to the public; and for +special libraries, new opportunities for shared collections and networks. + +The environment in which this strategic plan has been developed is, at +the moment, dominated by a sense of library limits. The continued +expansion and rapid growth of local academic library collections is now +clearly at an end. Corporate libraries, and even law libraries, are +faced with operating within a difficult economic climate, as well as with +very active competition from commercial information sources. For +example, public libraries may be seen as a desirable but not critical +municipal service in a time when the budgets of safety and health +agencies are being cut back. + +Further, libraries in general have a very high labor-to-cost ratio in +their budgets, and labor costs are still increasing, notwithstanding +automation investments. It is difficult for libraries to obtain capital, +startup, or seed funding for innovative activities, and those +technology-intensive initiatives that offer the potential of decreased +labor costs can provoke the opposition of library staff. + +However, libraries have achieved some considerable successes in the past +two decades by improving both their service and their credibility within +their organizations--and these positive changes have been accomplished +mostly with judicious use of information technologies. The advances in +computing and information technology have been well-chronicled: the +continuing precipitous drop in computing costs, the growth of the +Internet and private networks, and the explosive increase in publicly +available information databases. + +For example, OCLC has become one of the largest computer network +organizations in the world by creating a cooperative cataloging network +of more than 6,000 libraries worldwide. On-line public access catalogs +now serve millions of users on more than 50,000 dedicated terminals in +the United States alone. The University of California MELVYL on-line +catalog system has now expanded into an index database reference service +and supports more than six million searches a year. And, libraries have +become the largest group of customers of CD-ROM publishing technology; +more than 30,000 optical media publications such as those offered by +InfoTrac and Silver Platter are subscribed to by U.S. libraries. + +This march of technology continues and in the next decade will result in +further innovations that are extremely difficult to predict. What is +clear is that libraries can now go beyond automation of their order files +and catalogs to automation of their collections themselves--and it is +possible to circumvent the fiscal limitations that appear to obtain +today. + +This Electronic Library Strategic Plan recommends a paradigm shift in +library service, and demonstrates the steps necessary to provide improved +library services with limited capacities and operating investments. + +SESSION IV-A + +Anne KENNEY + +The Cornell/Xerox Joint Study in Digital Preservation resulted in the +recording of 1,000 brittle books as 600-dpi digital images and the +production, on demand, of high-quality and archivally sound paper +replacements. The project, which was supported by the Commission on +Preservation and Access, also investigated some of the issues surrounding +scanning, storing, retrieving, and providing access to digital images in +a network environment. + +Anne Kenney will focus on some of the issues surrounding direct scanning +as identified in the Cornell Xerox Project. Among those to be discussed +are: image versus text capture; indexing and access; image-capture +capabilities; a comparison to photocopy and microfilm; production and +cost analysis; storage formats, protocols, and standards; and the use of +this scanning technology for preservation purposes. + +The 600-dpi digital images produced in the Cornell Xerox Project proved +highly acceptable for creating paper replacements of deteriorating +originals. The 1,000 scanned volumes provided an array of image-capture +challenges that are common to nineteenth-century printing techniques and +embrittled material, and that defy the use of text-conversion processes. +These challenges include diminished contrast between text and background, +fragile and deteriorated pages, uneven printing, elaborate type faces, +faint and bold text adjacency, handwritten text and annotations, nonRoman +languages, and a proliferation of illustrated material embedded in text. +The latter category included high-frequency and low-frequency halftones, +continuous tone photographs, intricate mathematical drawings, maps, +etchings, reverse-polarity drawings, and engravings. + +The Xerox prototype scanning system provided a number of important +features for capturing this diverse material. Technicians used multiple +threshold settings, filters, line art and halftone definitions, +autosegmentation, windowing, and software-editing programs to optimize +image capture. At the same time, this project focused on production. +The goal was to make scanning as affordable and acceptable as +photocopying and microfilming for preservation reformatting. A +time-and-cost study conducted during the last three months of this +project confirmed the economic viability of digital scanning, and these +findings will be discussed here. + +From the outset, the Cornell Xerox Project was predicated on the use of +nonproprietary standards and the use of common protocols when standards +did not exist. Digital files were created as TIFF images which were +compressed prior to storage using Group 4 CCITT compression. The Xerox +software is MS DOS based and utilizes off-the shelf programs such as +Microsoft Windows and Wang Image Wizard. The digital library is designed +to be hardware-independent and to provide interchangeability with other +institutions through network connections. Access to the digital files +themselves is two-tiered: Bibliographic records for the computer files +are created in RLIN and Cornell's local system and access into the actual +digital images comprising a book is provided through a document control +structure and a networked image file-server, both of which will be +described. + +The presentation will conclude with a discussion of some of the issues +surrounding the use of this technology as a preservation tool (storage, +refreshing, backup). + +Pamela ANDRE and Judith ZIDAR + +The National Agricultural Library (NAL) has had extensive experience with +raster scanning of printed materials. Since 1987, the Library has +participated in the National Agricultural Text Digitizing Project (NATDP) +a cooperative effort between NAL and forty-five land grant university +libraries. An overview of the project will be presented, giving its +history and NAL's strategy for the future. + +An in-depth discussion of NATDP will follow, including a description of +the scanning process, from the gathering of the printed materials to the +archiving of the electronic pages. The type of equipment required for a +stand-alone scanning workstation and the importance of file management +software will be discussed. Issues concerning the images themselves will +be addressed briefly, such as image format; black and white versus color; +gray scale versus dithering; and resolution. + +Also described will be a study currently in progress by NAL to evaluate +the usefulness of converting microfilm to electronic images in order to +improve access. With the cooperation of Tuskegee University, NAL has +selected three reels of microfilm from a collection of sixty-seven reels +containing the papers, letters, and drawings of George Washington Carver. +The three reels were converted into 3,500 electronic images using a +specialized microfilm scanner. The selection, filming, and indexing of +this material will be discussed. + +Donald WATERS + +Project Open Book, the Yale University Library's effort to convert 10, +000 books from microfilm to digital imagery, is currently in an advanced +state of planning and organization. The Yale Library has selected a +major vendor to serve as a partner in the project and as systems +integrator. In its proposal, the successful vendor helped isolate areas +of risk and uncertainty as well as key issues to be addressed during the +life of the project. The Yale Library is now poised to decide what +material it will convert to digital image form and to seek funding, +initially for the first phase and then for the entire project. + +The proposal that Yale accepted for the implementation of Project Open +Book will provide at the end of three phases a conversion subsystem, +browsing stations distributed on the campus network within the Yale +Library, a subsystem for storing 10,000 books at 200 and 600 dots per +inch, and network access to the image printers. Pricing for the system +implementation assumes the existence of Yale's campus ethernet network +and its high-speed image printers, and includes other requisite hardware +and software, as well as system integration services. Proposed operating +costs include hardware and software maintenance, but do not include +estimates for the facilities management of the storage devices and image +servers. + +Yale selected its vendor partner in a formal process, partly funded by +the Commission for Preservation and Access. Following a request for +proposal, the Yale Library selected two vendors as finalists to work with +Yale staff to generate a detailed analysis of requirements for Project +Open Book. Each vendor used the results of the requirements analysis to +generate and submit a formal proposal for the entire project. This +competitive process not only enabled the Yale Library to select its +primary vendor partner but also revealed much about the state of the +imaging industry, about the varying, corporate commitments to the markets +for imaging technology, and about the varying organizational dynamics +through which major companies are responding to and seeking to develop +these markets. + +Project Open Book is focused specifically on the conversion of images +from microfilm to digital form. The technology for scanning microfilm is +readily available but is changing rapidly. In its project requirements, +the Yale Library emphasized features of the technology that affect the +technical quality of digital image production and the costs of creating +and storing the image library: What levels of digital resolution can be +achieved by scanning microfilm? How does variation in the quality of +microfilm, particularly in film produced to preservation standards, +affect the quality of the digital images? What technologies can an +operator effectively and economically apply when scanning film to +separate two-up images and to control for and correct image +imperfections? How can quality control best be integrated into +digitizing work flow that includes document indexing and storage? + +The actual and expected uses of digital images--storage, browsing, +printing, and OCR--help determine the standards for measuring their +quality. Browsing is especially important, but the facilities available +for readers to browse image documents is perhaps the weakest aspect of +imaging technology and most in need of development. As it defined its +requirements, the Yale Library concentrated on some fundamental aspects +of usability for image documents: Does the system have sufficient +flexibility to handle the full range of document types, including +monographs, multi-part and multivolume sets, and serials, as well as +manuscript collections? What conventions are necessary to identify a +document uniquely for storage and retrieval? Where is the database of +record for storing bibliographic information about the image document? +How are basic internal structures of documents, such as pagination, made +accessible to the reader? How are the image documents physically +presented on the screen to the reader? + +The Yale Library designed Project Open Book on the assumption that +microfilm is more than adequate as a medium for preserving the content of +deteriorated library materials. As planning in the project has advanced, +it is increasingly clear that the challenge of digital image technology +and the key to the success of efforts like Project Open Book is to +provide a means of both preserving and improving access to those +deteriorated materials. + +SESSION IV-B + +George THOMA + +In the use of electronic imaging for document preservation, there are +several issues to consider, such as: ensuring adequate image quality, +maintaining substantial conversion rates (through-put), providing unique +identification for automated access and retrieval, and accommodating +bound volumes and fragile material. + +To maintain high image quality, image processing functions are required +to correct the deficiencies in the scanned image. Some commercially +available systems include these functions, while some do not. The +scanned raw image must be processed to correct contrast deficiencies-- +both poor overall contrast resulting from light print and/or dark +background, and variable contrast resulting from stains and +bleed-through. Furthermore, the scan density must be adequate to allow +legibility of print and sufficient fidelity in the pseudo-halftoned gray +material. Borders or page-edge effects must be removed for both +compactibility and aesthetics. Page skew must be corrected for aesthetic +reasons and to enable accurate character recognition if desired. +Compound images consisting of both two-toned text and gray-scale +illustrations must be processed appropriately to retain the quality of +each. + +SESSION IV-C + +Jean BARONAS + +Standards publications being developed by scientists, engineers, and +business managers in Association for Information and Image Management +(AIIM) standards committees can be applied to electronic image management +(EIM) processes including: document (image) transfer, retrieval and +evaluation; optical disk and document scanning; and document design and +conversion. When combined with EIM system planning and operations, +standards can assist in generating image databases that are +interchangeable among a variety of systems. The applications of +different approaches for image-tagging, indexing, compression, and +transfer often cause uncertainty concerning EIM system compatibility, +calibration, performance, and upward compatibility, until standard +implementation parameters are established. The AIIM standards that are +being developed for these applications can be used to decrease the +uncertainty, successfully integrate imaging processes, and promote "open +systems." AIIM is an accredited American National Standards Institute +(ANSI) standards developer with more than twenty committees comprised of +300 volunteers representing users, vendors, and manufacturers. The +standards publications that are developed in these committees have +national acceptance and provide the basis for international harmonization +in the development of new International Organization for Standardization +(ISO) standards. + +This presentation describes the development of AIIM's EIM standards and a +new effort at AIIM, a database on standards projects in a wide framework +of imaging industries including capture, recording, processing, +duplication, distribution, display, evaluation, and preservation. The +AIIM Imagery Database will cover imaging standards being developed by +many organizations in many different countries. It will contain +standards publications' dates, origins, related national and +international projects, status, key words, and abstracts. The ANSI Image +Technology Standards Board requested that such a database be established, +as did the ISO/International Electrotechnical Commission Joint Task Force +on Imagery. AIIM will take on the leadership role for the database and +coordinate its development with several standards developers. + +Patricia BATTIN + + Characteristics of standards for digital imagery: + + * Nature of digital technology implies continuing volatility. + + * Precipitous standard-setting not possible and probably not + desirable. + + * Standards are a complex issue involving the medium, the + hardware, the software, and the technical capacity for + reproductive fidelity and clarity. + + * The prognosis for reliable archival standards (as defined by + librarians) in the foreseeable future is poor. + + Significant potential and attractiveness of digital technology as a + preservation medium and access mechanism. + + Productive use of digital imagery for preservation requires a + reconceptualizing of preservation principles in a volatile, + standardless world. + + Concept of managing continuing access in the digital environment + rather than focusing on the permanence of the medium and long-term + archival standards developed for the analog world. + + Transition period: How long and what to do? + + * Redefine "archival." + + * Remove the burden of "archival copy" from paper artifacts. + + * Use digital technology for storage, develop management + strategies for refreshing medium, hardware and software. + + * Create acid-free paper copies for transition period backup + until we develop reliable procedures for ensuring continuing + access to digital files. + +SESSION IV-D + +Stuart WEIBEL The Role of SGML Markup in the CORE Project (6) + +The emergence of high-speed telecommunications networks as a basic +feature of the scholarly workplace is driving the demand for electronic +document delivery. Three distinct categories of electronic +publishing/republishing are necessary to support access demands in this +emerging environment: + + 1.) Conversion of paper or microfilm archives to electronic format + 2.) Conversion of electronic files to formats tailored to + electronic retrieval and display + 3.) Primary electronic publishing (materials for which the + electronic version is the primary format) + +OCLC has experimental or product development activities in each of these +areas. Among the challenges that lie ahead is the integration of these +three types of information stores in coherent distributed systems. + +The CORE (Chemistry Online Retrieval Experiment) Project is a model for +the conversion of large text and graphics collections for which +electronic typesetting files are available (category 2). The American +Chemical Society has made available computer typography files dating from +1980 for its twenty journals. This collection of some 250 journal-years +is being converted to an electronic format that will be accessible +through several end-user applications. + +The use of Standard Generalized Markup Language (SGML) offers the means +to capture the structural richness of the original articles in a way that +will support a variety of retrieval, navigation, and display options +necessary to navigate effectively in very large text databases. + +An SGML document consists of text that is marked up with descriptive tags +that specify the function of a given element within the document. As a +formal language construct, an SGML document can be parsed against a +document-type definition (DTD) that unambiguously defines what elements +are allowed and where in the document they can (or must) occur. This +formalized map of article structure allows the user interface design to +be uncoupled from the underlying database system, an important step +toward interoperability. Demonstration of this separability is a part of +the CORE project, wherein user interface designs born of very different +philosophies will access the same database. + +NOTES: + (6) The CORE project is a collaboration among Cornell University's + Mann Library, Bell Communications Research (Bellcore), the American + Chemical Society (ACS), the Chemical Abstracts Service (CAS), and + OCLC. + +Michael LESK The CORE Electronic Chemistry Library + +A major on-line file of chemical journal literature complete with +graphics is being developed to test the usability of fully electronic +access to documents, as a joint project of Cornell University, the +American Chemical Society, the Chemical Abstracts Service, OCLC, and +Bellcore (with additional support from Sun Microsystems, Springer-Verlag, +DigitaI Equipment Corporation, Sony Corporation of America, and Apple +Computers). Our file contains the American Chemical Society's on-line +journals, supplemented with the graphics from the paper publication. The +indexing of the articles from Chemical Abstracts Documents is available +in both image and text format, and several different interfaces can be +used. Our goals are (1) to assess the effectiveness and acceptability of +electronic access to primary journals as compared with paper, and (2) to +identify the most desirable functions of the user interface to an +electronic system of journals, including in particular a comparison of +page-image display with ASCII display interfaces. Early experiments with +chemistry students on a variety of tasks suggest that searching tasks are +completed much faster with any electronic system than with paper, but +that for reading all versions of the articles are roughly equivalent. + +Pamela ANDRE and Judith ZIDAR + +Text conversion is far more expensive and time-consuming than image +capture alone. NAL's experience with optical character recognition (OCR) +will be related and compared with the experience of having text rekeyed. +What factors affect OCR accuracy? How accurate does full text have to be +in order to be useful? How do different users react to imperfect text? +These are questions that will be explored. For many, a service bureau +may be a better solution than performing the work inhouse; this will also +be discussed. + +SESSION VI + +Marybeth PETERS + +Copyright law protects creative works. Protection granted by the law to +authors and disseminators of works includes the right to do or authorize +the following: reproduce the work, prepare derivative works, distribute +the work to the public, and publicly perform or display the work. In +addition, copyright owners of sound recordings and computer programs have +the right to control rental of their works. These rights are not +unlimited; there are a number of exceptions and limitations. + +An electronic environment places strains on the copyright system. +Copyright owners want to control uses of their work and be paid for any +use; the public wants quick and easy access at little or no cost. The +marketplace is working in this area. Contracts, guidelines on electronic +use, and collective licensing are in use and being refined. + +Issues concerning the ability to change works without detection are more +difficult to deal with. Questions concerning the integrity of the work +and the status of the changed version under the copyright law are to be +addressed. These are public policy issues which require informed +dialogue. + + + *** *** *** ****** *** *** *** + + + Appendix III: DIRECTORY OF PARTICIPANTS + + +PRESENTERS: + + Pamela Q.J. Andre + Associate Director, Automation + National Agricultural Library + 10301 Baltimore Boulevard + Beltsville, MD 20705-2351 + Phone: (301) 504-6813 + Fax: (301) 504-7473 + E-mail: INTERNET: PANDRE@ASRR.ARSUSDA.GOV + + Jean Baronas, Senior Manager + Department of Standards and Technology + Association for Information and Image Management (AIIM) + 1100 Wayne Avenue, Suite 1100 + Silver Spring, MD 20910 + Phone: (301) 587-8202 + Fax: (301) 587-2711 + + Patricia Battin, President + The Commission on Preservation and Access + 1400 16th Street, N.W. + Suite 740 + Washington, DC 20036-2217 + Phone: (202) 939-3400 + Fax: (202) 939-3407 + E-mail: CPA@GWUVM.BITNET + + Howard Besser + Centre Canadien d'Architecture + (Canadian Center for Architecture) + 1920, rue Baile + Montreal, Quebec H3H 2S6 + CANADA + Phone: (514) 939-7001 + Fax: (514) 939-7020 + E-mail: howard@lis.pitt.edu + + Edwin B. Brownrigg, Executive Director + Memex Research Institute + 422 Bonita Avenue + Roseville, CA 95678 + Phone: (916) 784-2298 + Fax: (916) 786-7559 + E-mail: BITNET: MEMEX@CALSTATE.2 + + Eric M. Calaluca, Vice President + Chadwyck-Healey, Inc. + 1101 King Street + Alexandria, VA 223l4 + Phone: (800) 752-05l5 + Fax: (703) 683-7589 + + James Daly + 4015 Deepwood Road + Baltimore, MD 21218-1404 + Phone: (410) 235-0763 + + Ricky Erway, Associate Coordinator + American Memory + Library of Congress + Phone: (202) 707-6233 + Fax: (202) 707-3764 + + Carl Fleischhauer, Coordinator + American Memory + Library of Congress + Phone: (202) 707-6233 + Fax: (202) 707-3764 + + Joanne Freeman + 2000 Jefferson Park Avenue, No. 7 + Charlottesville, VA 22903 + + Prosser Gifford + Director for Scholarly Programs + Library of Congress + Phone: (202) 707-1517 + Fax: (202) 707-9898 + E-mail: pgif@seq1.loc.gov + + Jacqueline Hess, Director + National Demonstration Laboratory + for Interactive Information Technologies + Library of Congress + Phone: (202) 707-4157 + Fax: (202) 707-2829 + + Susan Hockey, Director + Center for Electronic Texts in the Humanities (CETH) + Alexander Library + Rutgers University + 169 College Avenue + New Brunswick, NJ 08903 + Phone: (908) 932-1384 + Fax: (908) 932-1386 + E-mail: hockey@zodiac.rutgers.edu + + William L. Hooton, Vice President + Business & Technical Development + Imaging & Information Systems Group + I-NET + 6430 Rockledge Drive, Suite 400 + Bethesda, MD 208l7 + Phone: (301) 564-6750 + Fax: (513) 564-6867 + + Anne R. Kenney, Associate Director + Department of Preservation and Conservation + 701 Olin Library + Cornell University + Ithaca, NY 14853 + Phone: (607) 255-6875 + Fax: (607) 255-9346 + E-mail: LYDY@CORNELLA.BITNET + + Ronald L. Larsen + Associate Director for Information Technology + University of Maryland at College Park + Room B0224, McKeldin Library + College Park, MD 20742-7011 + Phone: (301) 405-9194 + Fax: (301) 314-9865 + E-mail: rlarsen@libr.umd.edu + + Maria L. Lebron, Managing Editor + The Online Journal of Current Clinical Trials + l333 H Street, N.W. + Washington, DC 20005 + Phone: (202) 326-6735 + Fax: (202) 842-2868 + E-mail: PUBSAAAS@GWUVM.BITNET + + Michael Lesk, Executive Director + Computer Science Research + Bell Communications Research, Inc. + Rm 2A-385 + 445 South Street + Morristown, NJ 07960-l9l0 + Phone: (201) 829-4070 + Fax: (201) 829-5981 + E-mail: lesk@bellcore.com (Internet) or bellcore!lesk (uucp) + + Clifford A. Lynch + Director, Library Automation + University of California, + Office of the President + 300 Lakeside Drive, 8th Floor + Oakland, CA 94612-3350 + Phone: (510) 987-0522 + Fax: (510) 839-3573 + E-mail: calur@uccmvsa + + Avra Michelson + National Archives and Records Administration + NSZ Rm. 14N + 7th & Pennsylvania, N.W. + Washington, D.C. 20408 + Phone: (202) 501-5544 + Fax: (202) 501-5533 + E-mail: tmi@cu.nih.gov + + Elli Mylonas, Managing Editor + Perseus Project + Department of the Classics + Harvard University + 319 Boylston Hall + Cambridge, MA 02138 + Phone: (617) 495-9025, (617) 495-0456 (direct) + Fax: (617) 496-8886 + E-mail: Elli@IKAROS.Harvard.EDU or elli@wjh12.harvard.edu + + David Woodley Packard + Packard Humanities Institute + 300 Second Street, Suite 201 + Los Altos, CA 94002 + Phone: (415) 948-0150 (PHI) + Fax: (415) 948-5793 + + Lynne K. Personius, Assistant Director + Cornell Information Technologies for + Scholarly Information Sources + 502 Olin Library + Cornell University + Ithaca, NY 14853 + Phone: (607) 255-3393 + Fax: (607) 255-9346 + E-mail: JRN@CORNELLC.BITNET + + Marybeth Peters + Policy Planning Adviser to the + Register of Copyrights + Library of Congress + Office LM 403 + Phone: (202) 707-8350 + Fax: (202) 707-8366 + + C. Michael Sperberg-McQueen + Editor, Text Encoding Initiative + Computer Center (M/C 135) + University of Illinois at Chicago + Box 6998 + Chicago, IL 60680 + Phone: (312) 413-0317 + Fax: (312) 996-6834 + E-mail: u35395@uicvm..cc.uic.edu or u35395@uicvm.bitnet + + George R. Thoma, Chief + Communications Engineering Branch + National Library of Medicine + 8600 Rockville Pike + Bethesda, MD 20894 + Phone: (301) 496-4496 + Fax: (301) 402-0341 + E-mail: thoma@lhc.nlm.nih.gov + + Dorothy Twohig, Editor + The Papers of George Washington + 504 Alderman Library + University of Virginia + Charlottesville, VA 22903-2498 + Phone: (804) 924-0523 + Fax: (804) 924-4337 + + Susan H. Veccia, Team leader + American Memory, User Evaluation + Library of Congress + American Memory Evaluation Project + Phone: (202) 707-9104 + Fax: (202) 707-3764 + E-mail: svec@seq1.loc.gov + + Donald J. Waters, Head + Systems Office + Yale University Library + New Haven, CT 06520 + Phone: (203) 432-4889 + Fax: (203) 432-7231 + E-mail: DWATERS@YALEVM.BITNET or DWATERS@YALEVM.YCC.YALE.EDU + + Stuart Weibel, Senior Research Scientist + OCLC + 6565 Frantz Road + Dublin, OH 43017 + Phone: (614) 764-608l + Fax: (614) 764-2344 + E-mail: INTERNET: Stu@rsch.oclc.org + + Robert G. Zich + Special Assistant to the Associate Librarian + for Special Projects + Library of Congress + Phone: (202) 707-6233 + Fax: (202) 707-3764 + E-mail: rzic@seq1.loc.gov + + Judith A. Zidar, Coordinator + National Agricultural Text Digitizing Program + Information Systems Division + National Agricultural Library + 10301 Baltimore Boulevard + Beltsville, MD 20705-2351 + Phone: (301) 504-6813 or 504-5853 + Fax: (301) 504-7473 + E-mail: INTERNET: JZIDAR@ASRR.ARSUSDA.GOV + + +OBSERVERS: + + Helen Aguera, Program Officer + Division of Research + Room 318 + National Endowment for the Humanities + 1100 Pennsylvania Avenue, N.W. + Washington, D.C. 20506 + Phone: (202) 786-0358 + Fax: (202) 786-0243 + + M. Ellyn Blanton, Deputy Director + National Demonstration Laboratory + for Interactive Information Technologies + Library of Congress + Phone: (202) 707-4157 + Fax: (202) 707-2829 + + Charles M. Dollar + National Archives and Records Administration + NSZ Rm. 14N + 7th & Pennsylvania, N.W. + Washington, DC 20408 + Phone: (202) 501-5532 + Fax: (202) 501-5512 + + Jeffrey Field, Deputy to the Director + Division of Preservation and Access + Room 802 + National Endowment for the Humanities + 1100 Pennsylvania Avenue, N.W. + Washington, DC 20506 + Phone: (202) 786-0570 + Fax: (202) 786-0243 + + Lorrin Garson + American Chemical Society + Research and Development Department + 1155 16th Street, N.W. + Washington, D.C. 20036 + Phone: (202) 872-4541 + Fax: E-mail: INTERNET: LRG96@ACS.ORG + + William M. Holmes, Jr. + National Archives and Records Administration + NSZ Rm. 14N + 7th & Pennsylvania, N.W. + Washington, DC 20408 + Phone: (202) 501-5540 + Fax: (202) 501-5512 + E-mail: WHOLMES@AMERICAN.EDU + + Sperling Martin + Information Resource Management + 20030 Doolittle Street + Gaithersburg, MD 20879 + Phone: (301) 924-1803 + + Michael Neuman, Director + The Center for Text and Technology + Academic Computing Center + 238 Reiss Science Building + Georgetown University + Washington, DC 20057 + Phone: (202) 687-6096 + Fax: (202) 687-6003 + E-mail: neuman@guvax.bitnet, neuman@guvax.georgetown.edu + + Barbara Paulson, Program Officer + Division of Preservation and Access + Room 802 + National Endowment for the Humanities + 1100 Pennsylvania Avenue, N.W. + Washington, DC 20506 + Phone: (202) 786-0577 + Fax: (202) 786-0243 + + Allen H. Renear + Senior Academic Planning Analyst + Brown University Computing and Information Services + 115 Waterman Street + Campus Box 1885 + Providence, R.I. 02912 + Phone: (401) 863-7312 + Fax: (401) 863-7329 + E-mail: BITNET: Allen@BROWNVM or + INTERNET: Allen@brownvm.brown.edu + + Susan M. Severtson, President + Chadwyck-Healey, Inc. + 1101 King Street + Alexandria, VA 223l4 + Phone: (800) 752-05l5 + Fax: (703) 683-7589 + + Frank Withrow + U.S. Department of Education + 555 New Jersey Avenue, N.W. + Washington, DC 20208-5644 + Phone: (202) 219-2200 + Fax: (202) 219-2106 + + +(LC STAFF) + + Linda L. Arret + Machine-Readable Collections Reading Room LJ 132 + (202) 707-1490 + + John D. Byrum, Jr. + Descriptive Cataloging Division LM 540 + (202) 707-5194 + + Mary Jane Cavallo + Science and Technology Division LA 5210 + (202) 707-1219 + + Susan Thea David + Congressional Research Service LM 226 + (202) 707-7169 + + Robert Dierker + Senior Adviser for Multimedia Activities LM 608 + (202) 707-6151 + + William W. Ellis + Associate Librarian for Science and Technology LM 611 + (202) 707-6928 + + Ronald Gephart + Manuscript Division LM 102 + (202) 707-5097 + + James Graber + Information Technology Services LM G51 + (202) 707-9628 + + Rich Greenfield + American Memory LM 603 + (202) 707-6233 + + Rebecca Guenther + Network Development LM 639 + (202) 707-5092 + + Kenneth E. Harris + Preservation LM G21 + (202) 707-5213 + + Staley Hitchcock + Manuscript Division LM 102 + (202) 707-5383 + + Bohdan Kantor + Office of Special Projects LM 612 + (202) 707-0180 + + John W. Kimball, Jr + Machine-Readable Collections Reading Room LJ 132 + (202) 707-6560 + + Basil Manns + Information Technology Services LM G51 + (202) 707-8345 + + Sally Hart McCallum + Network Development LM 639 + (202) 707-6237 + + Dana J. Pratt + Publishing Office LM 602 + (202) 707-6027 + + Jane Riefenhauser + American Memory LM 603 + (202) 707-6233 + + William Z. Schenck + Collections Development LM 650 + (202) 707-7706 + + Chandru J. Shahani + Preservation Research and Testing Office (R&T) LM G38 + (202) 707-5607 + + William J. Sittig + Collections Development LM 650 + (202) 707-7050 + + Paul Smith + Manuscript Division LM 102 + (202) 707-5097 + + James L. Stevens + Information Technology Services LM G51 + (202) 707-9688 + + Karen Stuart + Manuscript Division LM 130 + (202) 707-5389 + + Tamara Swora + Preservation Microfilming Office LM G05 + (202) 707-6293 + + Sarah Thomas + Collections Cataloging LM 642 + (202) 707-5333 + + + END + ************************************************************* + +Note: This file has been edited for use on computer networks. This +editing required the removal of diacritics, underlining, and fonts such +as italics and bold. + +kde 11/92 + +[A few of the italics (when used for emphasis) were replaced by CAPS mh] + +*End of The Project Gutenberg Etext of LOC WORKSHOP ON ELECTRONIC ETEXTS + diff --git a/libs/zlibng/test/data/paper-100k.pdf b/libs/zlibng/test/data/paper-100k.pdf new file mode 100644 index 000000000..b3325e4a2 --- /dev/null +++ b/libs/zlibng/test/data/paper-100k.pdf @@ -0,0 +1,598 @@ + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000002 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 94.999999 + 19.999999 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 39.999998 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 39.999998 + 44.999999 + 50.000000 + 5.000001 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000002 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000001 + 60.000002 + 64.999998 + 39.999998 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 39.999998 + 64.999998 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000001 + 50.000000 + 75.000000 + 10.000002 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000002 + 60.000002 + 80.000001 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 39.999998 + 64.999998 + 90.000004 + 35.000002 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 39.999998 + 69.999999 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 69.999999 + 80.000001 + 69.999999 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 Y=0 K=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999402 + + + C=0 M=0 Y=0 K=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998797 + + + C=0 M=0 Y=0 K=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999701 + + + C=0 M=0 Y=0 K=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999102 + + + C=0 M=0 Y=0 K=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 Y=0 K=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999402 + + + C=0 M=0 Y=0 K=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998803 + + + C=0 M=0 Y=0 K=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999701 + + + C=0 M=0 Y=0 K=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999102 + + + C=0 M=0 Y=0 K=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998803 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 10.000002 + 94.999999 + 0.000000 + + + C=85 M=10 Y=100 K=0 + CMYK + PROCESS + 84.999996 + 10.000002 + 100.000000 + 0.000000 + + + C=100 M=90 Y=0 K=0 + CMYK + PROCESS + 100.000000 + 90.000004 + 0.000000 + 0.000000 + + + C=60 M=90 Y=0 K=0 + CMYK + PROCESS + 60.000002 + 90.000004 + 0.003099 + 0.003099 + + + + + + + + + Adobe PDF library 9.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 145 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj<>stream +hÞ”[MsÜF’½ëWðnmU(s™e{¥ÝñØkjw²`7ÈÆ¨hhÒœÝ_±‡ù½›ïe€&›rl(BÑÄG¡ª2óåËúæ_o’‹ûáÍ·ß|óƒ»H.>Þ½)V¥sæ"–þ§ËWq’\X¯âØ¥÷obÞïïåÇÇ5þ{|ó)ú¥^×íxyºl•D]ÿE~gÅ*vMû¥Þè_YôþÇAÚ¨jqÕÙèÝ·?ób¾*¢]ýPïøW¹rÑØñ‰UÝ×mž©?ôõ04]‹»±\¹}ºüüñßÞ\¯Ê²¼¸NVIîd=ßɼöuÕÊp6wòñîN~¹re¢ßŽU;6c565î–2éc³®v¸„uì» gƒ¿ŠèSšü3Í>_áïD04í½¬îçQwñ#*Îåã¿Èׇ}µ“ÁL%´ÇýmÝË_9f€¹˜ÜÊ0Ü“²^YצYÓN¾9nëpsìe)ë¾9Œ²òŠÃ&ò„|÷€O›"–Ý~lÆíüýms¿•=2yT­×ǾZ?­ø'Ñ=ÊV÷Wø;“ù¨`L)·T0¦XåA4&ÅåÝq'×»êIGJd½×©Å·ÍC7bb©1QßíêðtÓrJ1EãÊ\ES·Ã±çR!â"º«dîwÇ +?‰ÖÝþ°«G³ÞqÏ p§Û¢õÝ_ßâ§‘«}}؉øü+.ÅDûöAèþ¹˜É¤$&þ¼ +*÷vÐoˆ¼:UçTæ¿išÍ‘ksØô÷?ây'ÒÛVƒ^4Ñm]Oß½ëŽA½©Ä$x‹I;#Šúй4Õ.|ö®ëý®oîýŽQˆwÇv­KÊ,ăñ2kd‡6ÕX‹³,–‰4#.CÍ›¿ ²]ó¥Þ=é‹F6­õw¡â–QD1ü{~Û´Õ(µ}ÒËE´œK_ßw•*hZ@CtûEAËgÛ/Ê)rjöòìJÿ´Ñ‡vS×è\a¼ #ŸxhêGý­F𿨓õ¶ïöøØü}l¶cYŒh)ùª¨â(»·ÇTþæNšÒÉþ¨ñÈSb”²áû[,Ê”¥W%üÊ£MswW÷/S2²¨ÌXËGåO¨¥ªáï5Œ´Ìåþr>ë®ýû,ž„Ø ¼Îb`'%ÉóÍÅE,Bþ>ö|$•G0§,1%ñž@ÜèÏT/¿2Ž;ë‡,žBQC)e¸‡™]…MÎR™Ø¶±~˜Rmê[Qž¾ +P c§ ƒ] î©QÉkO‡NFšáJ_¶Øù•ɇ·Íz{θ‡C½nîš5”ÚÉ<Âòe’ƒÚH²˜¥‚Q`Su/JCSI£cÛüvôf“F·M·ëî¡asÖ£ßpΪ?™äŸÆÂ²óy»·Ý€˜'°#‘ó¡°ø;¥nåi*s¨ð#–}ðêÞõO¸‚ß×ëmÕ6າˆY‚Â^õzÉ .R`cß­aôXg|_޽~¬á"ÒÜhjñ@÷þͼ ú,Îø=qr‚Ðf²Î®½Â¥Œš40ÆP“Ûu}€ž`‘Ë@4Ë ë;ÂzRìÏ—¶{í»¯u,"ÞM¡ØOµ&SÔ›&´©÷"a™*W`èÕ"IˆF$—,Ñb¥OÚè¦És=<¦Ò#jáâå¬ú{ˆ~ñ›rå-"ß"· .êYF}V$¹[ù'=ùžªJ’}ÛJéZÄgŽÂ6`v©õÆ&v—‹¬Àeøœ¬z|$Üã¥lUr«»«iÚƒþ]ªÀ³øŽ=Xê3M7ª˜‰-ÉuÕ®• ÛîQ/ç1y°Ü8âöî8ˆÑ@š®ôv…—’å´pËÎÓ:c²‘Ș‰…€ei$ˆŸeTW=]C +Çè]•¼E³Á;ÍÈ»p×~Í +åU{¯»Q*0÷5á.õxr"ÎCŽ¾ë»¡;l›]uùñï³$ÍJĘ‘C…8Þ÷22´?¡Õá×@Hr… ü4AïØÉð$[ˆ­Z«ë3‰£X+!M²·Í?86À[T°¢>yúÙœh×ÝÒ°q ¢Pç$áð +ŒY¸p%«öb¥#XŠ5¡|–b¥^Q*B;óN™ºËJ:”à§3RÕÿüã…ò»¬Èå*ðÄ›9"‰a½­÷x¼pNA +è +S²b' –Uäp‹~tÜ…å6ûC×äs$Œt€Wh¿eÞ¢»+hªq², GFÙIHÆø[W5‡SØa<DèŽìßXÝî¦ÝSq-¾Í˜Ô1æ¨+£"G[»†‘!&f,Ý­pág‘ âä|ùž‰ùç­v0EÂQÍ`ÒŽIYZå)Ž+S ÄÔåðˆwMïï¹@Å]ÁàÚçG\¡Ñµc¬v[ŸøCÝ?0˜!ÿ¨Öâÿ8äÖC1Rµ<*—ªåùŸ`yqY¦ˆ!K5¦_¨Ñq7ß|èM ¾õQS›:¦Y0âªްYuÈIaf>]"B”ç] <-W½{0psõïÛæ¶¹¼f^HãGØè¾Ñ¸ÍÆÁ†dV`)0¥ÉÐÒØYohjVÆBÕ訅ôù¤aRpvã)øP¬¾ßO¢ûÓí%‰Ãâ̹ Wˆ-%Œ~©×— >ì-œ@¨Üe‚\›:¹‘Ô¬¸ ‡+pÌXÈËðI”ûRt/€·¸'* ÓO€.©áXIMh=N`B—šû©epxcš_ ±¾~¿»dâ¦~–§žÐR„‡'%¤ÚWº( &­£o×·+,NyL'³$RxÜa9™KBˆYXW2¿ÆòÓ¨ò³/0Ã,sJý1yX>(f$ÆWò(»J +쇋®ŒÃD~äŸ1R­ÎáîûîQg#¨p©øpœ2 :}R·ŠHX0 ‹â= ³#Î1pëë:º­]³cö®ÕQ3&ŸsdÊëÙÖ̤j¸¾×íoF?¦ÛË8âV&Ñþ–Ó’™âñSnÞ#ÅÂ:tÂb0£2.£»±¡×žz••D-º‹;„¸+,ø=߃`®p©ð!jΰL “D]asÉ ›ÀäáF½cÊÌT óÊ\0ø¦>I/LPaªf¡¿ rF“´ HKìØ™e(ÕÎçO/ìe£ì;ex~ÎZôYï þPŽÉò3c³»d|¾¸Võ4ádOЇÒ)óñZ~Fë$¸Ö•K$tI¦‰@[µAuÆ0\¼d‚ ™FdõÕZ¸sËj†?K~ºoXŽå&=xÕï ìØ6U8¬~.PTZ;@°WaNCnuÿ›ðùè¡ùPä(Ψ-ñ&âfM’¿Ȳñ!<™ó±×4¬lÿ×ÈÄømC ãåÑ5cÂ^A®Ö—Y‹1xU_§–2Ðg¦t´i¦´Mc¡¾%='0Ä>ÿâ·¢ÖÚ“uWHh*ZC‘w3ÿ¨‚ÌH£¶ÛVwAûðкÛa Hœ¯‰Êð“*^¶I˜Ø½SÄ®¡lÖ«p*>Q„!:MÖ¥¥€Ml±µ’™¡Õ²"rÙ9ù1LAéëDà‹m]X؆¡IÓ)ÑW”'Szó»¾S4CBå…lĉ‡™&6¼q“j¦È‚Ÿ©:î ·ŠS³”H+z·ý ãG?_KtÉŒb~£Ùî> 4=t£Uÿ¦® *¡8g2a¨¼Šj£DÖÒ&§üý_ß©Büô¬å{õ +™ Åg­B$E»Ä³Mõt|G +þǨ>#!›8ÂJM:>ž„3ðw•Îy².ê#®­Á’˜3—Ÿ:0QãIó.޵8k±"t›NÈZ}õGÍøØ%@i"çÜ·µL¥ž€·5)³½w?/Æ>Ñ+ú$´.&Ž¡NØô3ꔈ{[ª“-R 韹¡n>Êuš e›ã‰P 4~ð€z¥£åZÝË](œiæîð~ð|¢Máë 6A8°*¡Ÿî‰®;Ù:±üMãõê‡ùh‚!÷¥GͰþÁÖ#;ÌB­Î¡±jPëDía•¦h±¶S~‚¯È—wjyÇ¡Q£|¨ÃãáE‰½êQ÷©ú'ࢳ»ªX +Î|J1c@«Ø"ëA¾'cÝeI3ÈŠ°Z²G£#s>]žME÷Ìnó,ÓÑR\ÉFuNT':òƒnÉöjœD“JÁXI…¹gc÷ëq«¸Ðm¼†7ó̰¬Ž‚5“zÚŽDyò®Öý¬ú¶F ÇAN;·etS?L°£óÙ…1g«B†üÔþBÐ@¨Ï3V̶žºžuÙD»|±“Ão‚nh®ÓAìJF*§ƒgyÆhL¤“V¨²â±VÎBb¬eh£¿¯‚Ì×”†|é0*n7AHRiDª£ÆH‹‚§Ä*ÎH,puÉ¢—)?Ëe —÷°;šÐÉÍ55§îåÎܬÓ_눉8Û3¯¼SíYéMÙˆ tþ¾mî4„BXIâÞŽA…õ•<.}ûú"!‡.ðüõÌd>?3Aq«ÝæÌ‹xîHÁã—Šžt} lh*Qô„®ðLPô3ÉC{ËA+Í¥Þ[Ù²Ìü½“Äþêz'ñw’—/ýéÙKiž„·ŠsoÉEúú›×óý$ö¤¡(ž +{giÉÿ´â0sä +úäIÌÑŸŽ›¬â8õ48²'eö—ŪLL"ã\FxË _¬BOù!¬óÑ'o¯=µ`$žjð† Ï̵õ4ËÝ©Â#,$Y¡·†×»ÛØãÛµì½ÈR²…Gíª,|{`²Œ§öWlÐŒš•/†¬Âpïí¿«aÕšÉ%ã/·÷Š—è[Ó$¦G’¢RŸ"/ŸAØiôŒ£;F«ÓË6ä”’+um`P­þ,ÎåÑkë‹€À••¿¥‘ŠŒ^T½tÄÇfTˆ‚'Íã)É{.\¯Ur!|©ÖOÚÄ +ÛùÙS¹ªÔËvíÿ* + ¡ó«…Å!Xwµrñ»»Fá,ÄûäýXÑ•vvºhë™0z +õ'wJ)s² üüî]hµízoá‰/1#œ—AËû-—ø+Æ/ÇÎ6ñ=ân–ò„f©Ý˜`7‰µötÄòåˆ/­-óÉî(þÀ†¨¿ežÍ>Ίe£h"ÙAOàä'Þê¡ñ¶yôám(‡K@ ®6®~J2U#œ +Òã<‹â†²ÖãrñJqÃä¢óé[ä $ÊÓê‚o0-ó¸xf>f¥A´Q'n¼C*Ë9»Ṳ́ÇOÚ–œè VJ|×vœœØ‚ðª?2*“×( XЦdø\îÓ0)IPÐù«sföèOˆœ§ñ.Í7Î'‡£N£ +„àÅâ8ÉltGÖšÈü®,Ìœ¡Œ¬Kñ‰dîÆG´ÆdOšH^e1g³µ›pÆ5ö%Æ‹$æ$¯Aé¤/9hoZK¿Ä`_Z%SæBõPVçß[þZ¦ì´P7‘ô/¬¥±ŽwV•S6p½O®´‡Quîl6à ×” ˜­F±akï׊¬–'d§yvÕèyi¸ù*m4,Å>éÑ ÜG]ž“Õ 9D7ÿ"˜¶*™éœ¨ºWíAØh8ªD\©›1¥qšuÄ51Ëc¯ƒ÷u«YÔéñyÜתkÒæÌŒÏݱ+ezuœˆÝ¡80T,•ŠÉÀôäÜJµ®™*y‚+š¢Â”L^5•³Fæ–µ¿îzãV1àÜ›gª¼ì¡eþu×­µL[yzÝü#ä·¦cƒñŒA¬m“´×GôüDÛþL-d>ô©šâ{[sGžíÉ•,£ê5yþ¥i5,çiKàèäÖç ôv7eÈä™W +ïĺ‰ái´”[v¡Ÿªx~ÊÖe@UpžéRDOÿï¢ÂUhâåV•F;€uCǾ4Ö&Èä!ˆÖ¼æ3Ð,§3xeÁ(ÏCHϵÍìŬ,Ì{Ë¢j ¯ðAsùJè6ǯBäõ OÆÌÏ€+œ}ø ɯp9)êÈeš;Á)¨g…ùäe»ÓrŸb­Z«Ã‘7N}Ç£4)[V~¥ñæš‹ãóVû@õ‡›¿©P?œe·ýÏ_~‡ +—%Šø_ßþ ëæ¼-wQ[ž ól‡¯²EÏ6bÙ¤çåjc{޷뫾ÖÀs”ÈÉøLÆ2=éÂÿZ%Ë‘H0èÛi4>v:ò26¿ +#œDiæyé +m—È8#ˆuïK˜€àhÑæK#ziT”\Ýûá =e̽òݲ±ž%œ>â¸'o?þ¬¹Þ¨'–{H4Ày±'›ªõ•LŸ=ÇÌëÞ‡x‹ŒŸ¯…ŸÇ‹»jí1|}óc£ª‘^i‹¾ïÝÉÕùtB×}¥[Ñ~¾„VÀ;-9¼l¯ÔNï§[pô#[rÂÙ–øùäë«s¨n!à†¹OŒEtôp·`ÓÜôÖí|v+bþE‚R»šyoXT€`Ûãz§Uw(#äE¸ ¥žRõm÷à3Oý•+´©-ÖÍBoU`úÇÆ{ÌmóŠäÎUÐî”jë›0ÎvU0ù{òÜÕØÓ4AÔ#x/kqC8øÉ&‹(Ž£/^Ôs²äÓY×g2›ê"@grÞ½É6Ò™™â6˜ÚðÕÑL9À9·.o³KùœMPºWtôu)="kúÔRfH©ûkßÊÓoØQ‹Î¤Ä¼B[ÎHi}?Üqí‹sSŠg“°©èxËOhï¢ý” ­S )·C¥Ìa)žÔºYð:ìk=ƱYóÅÑ—".òS²èar/{˜DÒ¦Lç¢t:µ h¢MlÈæÏÚ²KL¾ŒbxD®ºÑÌAÆ/­'–V˜å¥#”_lÇ×wŨŽ{ù-“å™P3´¯°ŒaæÄÚç„ô09úpŒ,Æœ,†ÿsÕ¾;Ð+šW!ÀEëÏ _Ehí¾çÔ­•D6•vÃ$Ñtxéd›ôŒ¢ß&ÜwÑc£my82Ñ+pÔÕFO)ŠW%_6‘AˆgYý<ÈUÈ*:p|+ó<öá¬ðºîµ„Æt}8…,!e„óÉü4@áË„R\s!{ô>ú%!–e +éÌþ¶·É0ÒZw?ŒO~cÇ=L"RÈ'mSQhkŸ£Y¯ð9 +¨ëŸtË žÿ>·ç}½¯T-ŒwÆS0k Í»ªG ®‚Ý÷µÿKâËV6Uøg½’l×ûšç"ñªcéOGžQ¢ëe÷âtd=ÎÙyyÜ<…*‘J-V›Þ©Òoq€ z[áå…X@4¯Va`ñ) ‚º? Ù-aoN`,‡ÝiîšÙÀ´*¦Í…æ¿ü™v6j›øi–dçØÅS…4DÎõš¸ :QßæÜð°ƒ>ü·Z‹¼l­êúQ]güÎõYêà"ÁïÍb}$ˆ âP#í™è‰òqŠc²¥ÍiGY^;ò;®äaEv0ÌÐqಙ±Þ•“¢º¢ -Œ…¡øª^ÌJ÷d49[ŸºaArë]½÷ îŒvFMTQÒ¨8ÃvǾ¹=2IžÇ>V´l“¹;öãVy Èg½;®›¦Ó]áâŒ(—f„¤¬7#6vûæ7Ãã[M Å?oª} 2´ +€£ŒCf© `Ü ôsthC“ÿ‰BV.ÿ]àXA™+YýýDZ’mGÓ'̇ ˜ó£Li7ŒõÓ‚F©¾¥ðÿœè[нÿ¨Ð¤§­ E¦¼¸.e‘ÂQuù?ÿå§›°ØwÝþp9–bË¿¥÷„I±)ÿp6»ôøø¸:ìºA(?cï𳫮Ǚ +ÇtZzy]:œþ­jZËM±—iœX§e§ÿ«Û÷µúï=arÝ?`KhŇaÀ &ˤk¢¯%óûuÇÆ&e/þO€¦±.µ +endstream endobj 4 0 obj<> endobj 5 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 6 0 obj<>stream +hÞÌ[Û’äÆq}çWì‹#0Ž™.uá‡%)YT¥][K>`z03»M=Ãa8üþ^ç9Y…KO/I…eKÁ.¦ª²2Ož¼Ô¯þí]öæaøäÓ÷Ÿüê7îMöæýý'å¦r®x“ÊáÒ–›ÔöÏ‹I3óæýþ“”ôrñ~‹ÿ=ò!ùíp¬®2¿©’ôê¦0~S$õUš øC^•?ø«Oöu•Yù廦Ço©üÖÝã*ß”I½Ý^eÕÆ&Í0´W™Ì"¹Ý5úœI¶òn±É“n_ã¦KÆö°‘»…‘ë·».½ÜoxÅÈ8õî*ËäßÝ5~±xåñ*Ëå£Õ'»v1ˤ›«ÌÉ﮾}ÿ;Y×M¶É¼Á|.ë;ö ^Ë“»Vfhäý±}šr©“»g,-O°2—æae¶²r5Èœø¬ÇVF.“9z½h¾™ìøµLæ"Z™ÿI…éÒLÆå¤Éã˱ƒÜ‹y]Cû#„“͛ŚÊÜèššZÌ·H,=¶ +¿Ì=‘-·.Ï!þnçmrÛj|T&ÞõíUžb·!|ÑáËSU26ýS2É®ÖMxÁ•Ìñ¶Ÿu¨¦ÁVeÆÅÝÕéøË¢ÂšÞÿ3V‚ù@Ínwøº“A®nŒLÇR ú‡›õëÔÇñ܃îÝɈ.¶œG‘´ÇQÅÒv Ãh‹‘Éy +•ßl{¡Júf‡Uù¤[Ì¢HºÃðI‰Jã‹Ï­l‡3òÆQÕj×^Q7ó¢¶âÂçó*•Ïížfá“Ã(~^zä ÞΖšWNž>4?Œxˆ{ÜLzÛan2Âp›Xé3^)ñ©BÀšñbå©jaØVUϹIïÌ,‡¡6œý¯~S(žT"¹#\„ˈ'N.r—åÀ“Ég¢X7NF…b¢ÙX`ßR¥Ä´ Ñ¼ÃØ··'™”LÎë†è-ÅŽT^ýÍ™ñu>€½1ïÚÃÃly–OFÝaûK*í à!KîpEÝÙq¸’›¡UÅÜcÈðaÁA[ƹ©>ŠªÎoÒ,{ãd~EšzÂOõ;$æÚŽØ!5z‚Д‡þí»;H[6y§Áyg¢n:(âBôµ¥frûË„š ¡S3]%³ÄS™èCƒ©8Ž;7ÍœsÔUÞlªªZÃÊeT ø~Àë¸VX\|þû·ºQåÒ¶Ðñ|9Yu$¯«ò/ðÚ÷úÚI Q&]->7k³ÂB–.k¤3Mn~Ôå7óºÚq£c•ÉûGhå €.€‚]Ó~Óäjuk»ø·ºƒ·–W·õ 3ž'ªÂ6- S +0F(=8G;ŒqKkÕola»“§º7ÈÛ—ø†x‰¤~“|Ù( ¨e˜ Ööövнév'Uƒ‘Ô ÊøN J¼ïá;%õþ­fÖC=ÂÓYò.Â_³•äÌm…Ë?1¤‡çY ?f“¯šñQ—ÛÝ JÝLrßõ—¬ç®ë€O»AÅöÍ•`hÚö¡°zïÚXE›o¯õȲpˆŠ"ªðN™²÷ÇF©ãžK Ë3oj’<öy8ªo¯ûAA£D­ d6–üvÉy船L{§`ÕaÈÒÉ$=`.Ä;JEA§‡NöšTøˆß^UñHß mÇÝ Öâ“ëK¶{_ouêí +S*›™¹¹Í¡C+·9 öuôÐ7£ZË +s1@µ4)Ljƒ{ØÑ?5*õâÑè<ð góœ²z BÄ›ªè‘¾ö“€Ø1eø è‹ÅjE<µZÀ“\&¡…¦Ål )49ªkÁv5Om §r;”ávíuáÇ]§÷BX6y$§ ½k‡­FÈtÙä¢Ö=ù‹pÿa« Ñ ¿ãþŽqi´ìiƒ„ÓİT9p}eW÷hTÊ×Þ‘S0^Åþ­ò8{¦˜XG¾D|áÉsÍ÷AOÇ0ƒ}Àd~žeQø /8‹ix‚§]ˆÐe›K°§?dZ n~8FF¨Ë¥‚áôñs#³´¥cØ·nß©„F,ûp#QÈ“Zh¶e= ÿXËöæiäéÖ ÛÓÇ+1© vóÙ§_jìYÂå…v<Û Áœ¨½)¿UKЈ+’ð< êú›öá ° Z3,?Ëè•v§AtÄX~‚ÈôEwš~ÐðØHT)æ&zñÎÝûlEë^ÂÑP¨ºÉ9×”Ý(¯ìëö ¡NVEßn¨²”QGP‹¬À7êË /.þû›«Ò˜êIÕ$AçÒɇl˜g‘M"ïá$”!¹)ŽÂÇ,Âáæ¾ÛöT%ÛÜñÂþ>‰ë½ ±¤‚=¯Œ lW.á_æõæþB†XÀy߃A9¥ÇDqGl9õÇn€[°þgÃ%Ô6yíæÝQj»Ú"ÍÂÞ@²@êƒòH ~N·ÜÞ)56OI€¿?1š'©„Ðltœ÷"Þk}BwChh½}œ÷QxÅá.z@Œ™{È\e,à+¹Òbe²úŽ Ó£Pâ†ð˜± ¸AËœa^2½vêú„(ÚÇ[|aš™Œ +[Q†ÇvGç!ß&¿æJƒáÛrËÌGsHy!üÉ­RmØ/· < +±Pª¯?ûL½uÆ$¥¦'<ܾ©ÁTf.`­¦rÛBH‡&Fâh»R–3Ú€ÀNpz¯Òùs³ \õ:’ºdØ`‘j·{ù18æ c1;¶×ÄYL™1Üڧ&f³ŽÝ3y“åbFmx Ù'—#Šû3áÏÑ½É ü Yìš'*#ySåq9¢¼¿t Gç(zhïäþݵtÜ‘¸¨qLû#FßÊÀ”¢Ód·Ê,”£p™&§5°ÈB¦QX·€rb‹^c‹,×›‰ +²pë¿Â­4ÜÂòõNîdᎩ*nýËÙK¹Ïâ[6]Å1HI|¨÷à€¢.\‘dŸª’EÕ!æ¿;%´Ú ó©û—A›ªtÅÚ”çÀÉÞo¯•y™äSuiÖ³"NîÄÌ2Ro­µî‰¾üØ>Óß#Ó-Ϭ±‚?ž¿'ÀðÍ•ä7^–dÏÀ}8=<ÀJÈñWû‡·¤Ô½°Žé A Üp)a|áa°5Ö! œÊ2>hÈhe“†*ƒk$W{3•–EMY2ƒ<{J¹•²´ Ž’fÉï»±¾Ý½@P• 9ayóHf*ÛEКMC ÁzH¤u&j~D¾mõ‘lòMòÇí â*“C7Æk\ȃô~x‰uªA¨nÃ:*~R³·>ÕLóEÙöÂ,èõJˆ¬e—hGl1³³$*•™œi”o’cW,Ý=¶ý„*E¥œvasBœc>GY|Å72²Aœ£¬»öNŸô* ¡¶]ß7"·F“¼•zaù°r +³`Œ©¡’† ZhÇB\é&À_@»W†,ð䫵GÛòyZFãú׫›Ì +¶e %ˆÔ™¹ûÍÈ• :ê_qÇ&ŸÁ¿Ò §«ª\«Õûú»†ô¯Ýý ½“S˜HÚµ6>¨ã,è%·]NR ÒÎY YKbÌØÇfÊw[:^Ìø—ã®I¡é[úùŠL[`~¤)CY2æ=+Ø$T¿çÌð¦K^>œ1윕fVàh÷á3× > +`ÿÐîe’ŽÂ'…ý§kežZ¥DÈ.)ìS-È+¬Pš*×Ú±,¿þâbsfÜ&­¼û[›…ÀŒŒ0Qäb˜GÇ…ê3fµ"ñ±»Tzþ?.-gð÷E¨,ÿÛq¢6à:ñ¹Ò¼¸Dø¢`=<¢6l™XœÜ¶-cýö+\6C,` ­6Ý},°ÐR/CÇõž–ä¡õ‹ð6„¦EÐг¸žCV>mðN1`-dnC LOêô?Û-“?]CÎøY.í"n"5,à ‘)…8‡)–e7[ %7ö +´°%™s5lQœòrYx³–èZ,–"¾p¹ › ?¦¯9~œ9ƒË!`€Ýç¨R9r@ø:ÇìüšŽMö½®æ4~@K`^!ÌAòl)±ôÊOmw¸³L¼8³h®œ@/ªokÆÄ“›öš÷*ÖÜBÝ6àÚúW ’¹é8ag*Ƙ°³Y̸9ëÖìA,gêŒaa÷Nóч—Kê´ y +cÐ1ŠˆÙ›Gù6¤¾ýôf )J²ý»€'Ú^çÑNï»a‡ÒÔ@©õ=-› +[w®ÌÞ‹I `3¢&"ÚBSݨ±SñšÈiHÅÜ—h#ScÞɦږŶšƒ> ¦Ðm›ah†Îq%‚«ÂqUHnÈoÆî†K5%‰»ø&èb'l1´}`‹)Í4ÙàÅʘÐá H´Ý®{½Þ-?ZÄ>†Ó(ï³¼i,‹¯Ù ®Æ±Å%fH1ë̾)d4lcˆœKgËÂËY€xaÁëOt›uê¥K{™W­ú­Æ„mˆû¢}êuB¹OIé”/j®ñŒg/ò$ÄYú«2ÔΗêSh‘úP1eæŠÞî‹Ãv'¨©ÀœFMâØŒ¾µÚœ ò¿˜z` r~™plT¯²=÷¢€çù1ëýG°43ö"–ê€etÉËÀPøAþ×V`–wK³ÞÿeÞV—} +€½æºW!Xá³)CÎKÛfœÓ0`•Ô#¨R‰Ž»¢ñ&4RB‡.lø¡ì±71ï jæ‹*xÞ„¶²“òxüíÕW{6Ý®|µ'\DŽâ¦{ÖUþ•1$Ÿ÷ÝÐÛ]½«|¤p“ÇÛh»®GLÄ3‘-kÓn…¦uPäíño©ìŠT)Öðk91ЦÐpî…)ˆ² ¯tóÂ,Vr[*6.Àck*ä?šÙQøÓ`ûúY\X­­^yµÔÐh\´èú£ºÃØØ´šì&–#þpÐÀ¥XVš†zßè=*¤ÊàÅ¡~ /ØœÖC"](¸þÉ¿ÉF¾Z,á°_ +9ŒZg÷¢VÃÒØ4}g\5(ÿ¿¤oP;€Äú6IùŒ›)¼zDôHYr³_ƒ›) +é;¨ÏQ¦ÓÉZ63ëôîÙE ®Ö†°)krA²…Clóýü"¹œ–S" +Ùl­,ðµòfÛ„2à„oi5qõkUtŽáS²Ù„[2FÒüðØÞ¶cìßuÏš|È3¾ÖŸ + #S7©cÁÚHG°[ »šþiáÇ.ãØMï2ùùÔ>uë8Lt¼È}T€cÓS¹:kyh¡Íå”y•áQÀàNÝî”îa¯֒À€lb©`æ«Ö¾z­dè \Õýä/vZÎ1²þÎC|ÊsÇlÑâ+©'!þu"Ù,Žïë—XeN÷2`8²P-’YwÒRêU/hÚá´¿Õ‚˜çË,ï›¾ÑæTÜÚ¶ýöÔŽ¡A¼ä>Fé‰S‹e(´áxÄ £ñéE6ªo×­s‡ö}_!ôNû½@Á5þFã@Ñ—Õb§ôwÝ)y'xsvä“ã~óD¾d³ÌÍaùB¯W¹"ÃV-f”IÿÕ›záUyÁ¸”áÒŸerYŠ<Á˜jŠÉC²á–0Ÿ8;íØG–Yk,1)ÝžºÝS¸u K…Tò`Sµ! iþzA¬ËW)™Y!!¢åßgÙ`I“&³.ªÚlv§…‡C +SM™tè|,ç1=€î¥jù+õÖ!¹$—°¡Ú-sYH‹P‹) +=€ò‘\™ª²Yfy6}†ÔmZUùl_™föRþ,ä‹çc\,Jp#´ÝYãÛÀ1™Ë’ˆƒ†Ç!Ü/X2;?Å1çÎxR‚äPŒfw]—×V)‡Wy3öZ.&ã1ôVßTÚŽˆTãä˜È‚—<¬BnûòsY¸Q(â´(åÞѱs‡F©dÍ\n&«zPgÙ¦i²ŠI-üʲËSó¢§²IF|ätn>¸`óL´Ûô\2ŽÆ¯s­j ìlºìÒuÌ¢„F*Ç8;p¼áٽࢠí^.›ü"ÀÖ('Æ™ŽÇÚèœÕ¾¥A]YÐ5‡i„T `‘“×^ +çÙ¤}Š•öu”µ,v\bß¡㑜 Êøœr_æ# +jÆa“÷YÄâ‚åK5y¯ž?2_ÒÃúâBŽíL>»0ÌÈ÷Ùв2”TÚ´,äöûS­]*ûZûžðÀúï7ÉWï”M2MJÿy9Åâyû‚.ñî¸ýž©$†ƒ»®Ü3°ÁǼ™²°4ëAÀ3í2‡ÆxÊKhŒùx6tª3|ûæöå#‰!XPq-c¥Å_ïÌ[ +Rì)?¶ÛGTà ØÄçØÍ;¥1Q[Õ=;mts9CºŠ<ÓxÇi_ˆ>ô9xqy$ìò¢ ä ¯4r¨wìfcƒé[ßqó=Pm•ï"c’Oì«G±íªôÅÌ܈—ç’×™ ãÛ+Jç–X´ÞÍdZºÐޤ© m¿G·¹F¼å¢•P£êØhN^O;jòé,ln—Ïf‚wÍìÌtðËcÇ#–Q…*çF<÷-¤쵊…ýkÎAro”äå‚0{ªlõ¹ØÀ2'FB'`,ú¯[ +Mb 7,¤ÿû!t™M½—Á®*L¸iWý^jôÚat¦ßQ8ZêÌÍDG-;FtÔæZø˜•’?•‹Þ•Zí† Ïâ×ÇÂÄÝT>.‰pV1Ì”É*—a«Ò¶2Ÿ:0½à¤:¨lh³*%ÔºA[ïæ¢r`Ùýа5I{©ž Tmdžø9 +mQFëæ¬ëLusWÄî íªšbë4²î%> cŒeS¶Dí 8iHc˜–C"‰]:ˆm˜ùL1‘ÕãeìøðÁhC3ˆvø, Î:Õ/ÞXd¤Iÿ¦-¹6µåÇ|±³15kÜG}1«c>ñ­¥—iwšG÷S&óZ{›mr× Çvlôn¡¾‰ç\Cq˜GyWYö, ¦* ÖV« +Ã?Š˜Šì'ÄÄ#>È£h>ۼ纽åÚgö†ë¹¢Ð9˜©èÉ£œýñùR{yˆjÖð,–Ä_ ë•gÉ#4¼¡'7¶ÿ³$v뱜ÿ©èG>×­š2¦rJkÙ!¤Y,Ë3Óü!ј—ÿˆÎÄU?¹tVQ×%»Œ½Tyåbê7gÎþ¬è¨Ï‚,m 'ÕÔ”’.¨ºàL> £Ã'Ãã¡8ŠTrïBS6*Ÿ±wÚóˆmèv6Þ/’2x¡dRfëµYì€V¡k-Œ–JÏ}ÙîC\´Ð°eg>;Àdìy‘Ü0U¨ >³a™!ÅfT 9+K—û M +VÏB…¼ ÑŸâN½7—y ÖÞxúU³csɆG$˜•ÏåJìÍ/3÷ÚÅ"ˆ˜> +DãvË…‚<4јΛ|Ø€`íܾÀyæl\[æ> kû¶¼kGàšSiø%MB!‰MB¬™kŸñ Ë_´·Å_È•²þrž ]Õdª>Í™0— ê^þ÷Æ‹*_M˜ÿñ„nãgÃëx” îè«é r‘ÇCH»µÉ4‡¨þ´Šp¹ÅïŠiLèÛÍŠêÍØ[é[(¨¯¿üû˜ý쬆Êüê§ì:{ÑÖ5“ü§Ð†NåùùysÜuÃöŠ4Y^EÚ¦ëÑ'ãxˆ¹¸º©\…³¤¿«'MƒQGó438Å€­ŸünwÚ³cAX–â÷ð€©°%_ Nṯ¯eóûM–¦…É´Mé×ï?ùW)Ý» +endstream endobj 7 0 obj<> endobj 8 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>> endobj 9 0 obj<>stream +hÞœZÉrãF½ë+t™pF„QPð­7íðÒ¶¾´ú’ 7Ð(ZމùŒùÞÉ—YÅÅ-M8&Ñ µdåòòeB_üóV]oÆ«×wW_|•_«ë»õ•OË<7×ýO3gܵ*ò´4>¿¾Û^e$M7ÕCµœš¾gs£UZ&‹z:Ôu‡Ÿ6uÉ×ßãr©Iî“ÙÇ»oé`eäd¥R–ö½{{• ³»_ñRËËÔ¹L…Wÿ¯²°.ÍH¾ð. ïTXfËÒ…W_^.£Ã\^VÞåŸïø!¹Ä:-’Ûýn×ÖÛº›ªá 7*R›|ÕlöC_&õÉ­}}?»á‹Í]¸4æz®Rå}!›-ûnÝ Û¦ÛÌæÚ*RIß-i¹6Ž–W›ªéð#Oódz¨&<z–Ñ"é÷, ­‡j[úá¿¡ÝP¯Ö>oTËåžÌÑÔ#Ës÷w:¾Q-é¿ë'1EžTÓt™ñ¡®Œ–4J¢Žõoûšå3ÊCÖ5ž +zšj1q‘tûí‚Wñ§)뺚H5c_Ý6Û¦­†öéæ$Ðz?ÐV´Úæ9­©Ÿênä+XW’F°u¢Ž³2Üö«ºÅ•,žð¾ û4ݲ݇¥¹ ÂÊÒŸx5¿­›/ª±^ÎÞÔ.A“5Lêe¹ÉuÒÖu _Í‹T‘®û-=“D:ùà²<‡6î‡ø´Ý·SóX M5…=óäëfµb×'¡óäûjøÔ?žNÿ—"Í-9‹N–tN5ÁØ6ÃÆ‰¶åWA'«§?â§§Ÿ"”ÍJz&¼ûáÍoßÉ€¡¹æãé¬U³bu‘ØìÐÜØlºfÝ,«nj¡DºF™4ÛÝÐ?ÖòóÒ¥0b¢S±Ö-ø,ŠÉ%èöêÅ(ÎíóQœ–eùÄp¡âªBÿ)†­³ªn…—síRE÷¸ ÉU5qdä3gA1>ô‡î~–F¼º«>±1 ¦T2õ›~{#Ábá#‡INÖ O"wãNMGJ¿ ×*6ÞùäÍë÷çáIrÎFô1R:m%dƾբųÉè|þ?GÌ®eÐpÚ“ m³y`ƒ:$EŽ!ËáMt.æ\ÀeÃ0‹ãÄ‚ú(‹8s@„HÄ ·?¼ÂPFÖê]‹«…Y†dœšnpz¾6p×q¿ÙÔã$°çèVÒ6Ay²çtèeœ\´žÎ”9óL#²à·¥ß„T“è „êvÕ05U %Ä÷ÛsàÎ3h¦éÖý° ²cž î6Øà[üÚ7'†.S&Ëj V7<Ô˜ÆXÇa{ÓÚâ,Š %ZB°Ðåss. ðЬ,)^rŸZc9Û~HîH)9ùÙÐï7ØNpÐØŒ]µOcŸ³Š-óXW `F°|»˜Í=é½éª˜  Ã+ÊZi%ñÐŒ´¢2º ãtZ3›Ã.ë`sÚD—0àC5,ú¡‘%Eó— +¨Ø³ÁKhæÓ>Ä +á-bìJjcSœÄÉ*XœjA—G®Ý#lÈS½ø Ý›Üòèƒt8Ò#8B„ጢó òaærzOæ#XS¢ó¯k +Žg²².,{˜e¬Ü’4È3 /oV4‘$‘i!Ua’O¾«Æ™¢Ä +Ÿ¦T¢¡Å™ÂÕa9˜£‘„,9ìÅñT€@@ŠlÞ=DTnÉË›™¢‡;z +! ¥€¸"%ß1ô€ŸÍ8ײår°¢-m®6SHÌØl‰8ÑîJpÒxP‚-=ŒF?:HO±Þ>ý1S`"@œÌÁQxªÂ=±3"êô–’ D@%V$ʲYhzØô,]-ã*`cÍÑh!ÚØ@Çã8Š’Øº©q”¡Õ4#¿Ô:‡’B–Æ Ž±„[$j/>EN7â›¶št¼XàRžÈnð¹Ä÷ÉWŒaª¶\bH'Ð&ëuÉT ´‡ <à/¦)x‹›¹•D1 *僆y9b›Û‘ëʾdCámðW-î–‘ºü¦Ç+lkÞ“LÃ<3î3!ÌáJëç\ÁåyW0Z`PËsH0É¢’XÍý–I½d÷.hæsÕcÅ$mV ¬bxΑ×ÌÚ²å1:oιÒZ$~Åñ$ÝĘüU»Ý ŽÑ“àPrD&S¼%ò«f^´8²Üú hm!;=U`óMÝsxÔ"É44ÐKšàa!2Ü„ô0±B)ª›Nð‚IŒ‡Ó7,—Jvý(‘‰{+á8ª8G;ã)÷í^¡ 6ô Ib=8=Ì »–¿Œ)´%$€9fåuÈ + Ç;Ü¢á <™Ÿõ4ÍX=R,‘ æä4B^2ˆòÁ:l©“P¯Ê(ï²ò3˜t"®'×TÌÎñŠE_Õ;#tZñ| u­$`Õ2`Pä žjv+böeDƒwwW¿]YhÇjNPTm§%UÜ\‚ÛkàÊÜõr{õÅ7[uý¶¿úIŠ÷À¯i¯"“¥á1ïsJo^R[,Z-Wu*Ånt»|¨A‰–RcX$W²ˆ$…À‘5ZuLç–£Ÿ Ó?ËP#5ª˜—+U«A)8‡Y2P’^r`ø”Y‘6q9Â1±ë\*rÉsà¼lR°ñ©ò¼`[.™Ïb)qŸ¼ºŸqUÇá^D<Ž.T‘Ø[*/§¡âĉèDI¤ +rѵü(ƒ6²âB¦ô\E†ŠúÎ2acôy¢1胰ûX)5¡¶™Ô[wýÏ7²ž2v»¯ãÁtRMbiË âŒUÔ#ù©eÚ¨$ÌÞ£dÂh3XòX×yÑ3i–±¬[_–ad›Â—ìváÑ0(“—Äg)®¼+àw‰Â²Ï}Ô’—[¸k. +bd˜|ΰ± +¤¤*ÇÓ…¶Ó‡$Mg(Ï£O!¢Ña27¨âfþX6fæü*Ÿ_€ +âåâlc^Œ60P•]Þäñd“ .OÂÔ(¿•ª4—ž·ªUÃà` +Ãl»ml ‰ÈåTu›¶alS0õPGþmOT +rsÉwì¡FÒb`¥ŒD^ÑOܸ)l(ï䈊ћöRÂlòi!8ýîÒ$·SäÕhù‰pÈ^Ìox^#™ýîöVv†WIA]cï8Ey},˜%T +ÃÂìö!ÏÛX {”»äÈCó{LL +x?WëgiÂæ{Ÿ,úiâîwDÖúsœh, +g=4èáI)ý=,AiSûAv—tò’V Hº8‘éøé' +Æ.”{Ÿ¼fgÉ@—Þ Þçè3î%×1tÍ•_É}vˆ•´ÀÐqØÏ2Ø>ÿþöl‹¯BM>Âd(§Öû.~Å)‹øE%Ó¢Ø8ê;­†æxËTaWbrRÇÚœlûÍ ÁŽ´”™¿Øeʪ¿îÈvEiòk¸qŒw°F!mæH´ŽôÚË|aË¢Œùâ~õì[ÉPœ%T¨ÖE¤6ÌÙñFùåDë(äÄ¿‚Öj!sªž48Ù…‘ÓM Ö±<ÙøX裸ËHW࢕ëÕ†Â5ŦœXÑÊãvä†ý ^âv %œ— +ã†OEЀ¸ßDÚ÷0yl³Ýoe¹“ø ú=¼) +ÆósVCuè„u˜³3WÕø ²¸p(wxJ4l_Eâ@£’‡[Xž›'4íÔTÄ\8&+‰Ô“ &! xd|0Œ0Â}G‰D}Ž@…:Fh¨Ï¾þd:Þ}Š\©è>áS¥FYlWDำp„|ò“Ö<Ê·æ1„¸b&ø¹`«DŸThcˆoŠ +iŒ×m*‡ùHTÔ%#„2¼|ÐÊ;!óñs{)º¹).Xl¤3™„ZËÅ%ò~F¨†pÇâ¼ú€ÊÏ@Ÿï×Ö¤›U*& ¤úÃ~ò^´$ +E™Nn2îGÑù ÀÌiü¯s°+Å•—¢½Ž½ Ùßq7šžtï|,ðÆXãóØEìÛ¾Ÿd¹âæ[Ëê崴‡èé)6ëF[€ÕB¼]ÛO©¼Sò)WޔϹ”Ðt<G\É|s$™Üëëeß­æÜ°V|ÍÙŸVHÓŒ¹ïø¸B.ßY,€ÿñëâçèo‰+MÚd”ûJFñD¿P¡ƒ‡¾Öš¤ô>|!¹GwÉæy$|¶ Þóè¬&ÃfäÞåtþ²™[÷ÌéL&Þβ„]Õq©Ö­BqM€V^Â=KÄõþgÌW#§‘64Íδ9ÉC€ä^ª÷©Žõø^¤ñ&“&Á?.‘Ê‘ò"Rëäž¹À;f þÇ QJÅÿ|ƒcÚ„˜.Tò¾®†‘gæJ€©1•k.<ëõºYrA!âÇP”É(Ck™h% Ä/M§ÏÔØö,þþ\®ÜH=§¤~fÈe/ˆð”£ñ‹·xóßós˜nF‚K&ðê‚à&‹†"bꇋö!ÚRÄ6ÞÓŸþÂàÄ+â_øÓõDLøý%:HÅ$]é,V}ó%)SQ53㯜_üÚjÓÝrѤ<è:MÉ ‘(¾”¥-m¯zžÎç­~âÍ„ ¯¤¿‰ÅVpD +™ÓßÒŸò½S£øó9†þÈw"·óxàM‡"žøþ»oå3Q‘¼é·»PÝs¢×@æ× aßÖÁ4ä_øF‡û‡”°n\Š#ÑÒÍLû„¤Œd`gó2/‘]¿­º}øÓ(@“&R‰ïy aÇ éÛý]GžF“¿*òËÌö›qä¦f‰†’’eê´¾V¢âØ0ÿ¯¹ à +endstream endobj 10 0 obj<> endobj 11 0 obj<>stream +hÞTP»nÃ0 ÜõStmt4¼äxèµ›]‘hW@M ´<øï+)N‚ <€GîH¹o-Ùò‹î0À`É0ÎnapÁÑ”«ÃÖeÔ“ò £¸[ç€SKƒƒºò;çÀ+ìNåÛkñò“ ²¥v}ùsŽD·xÿ‡R€š Bîß•ÿP‚̺Ù¯¡Ê}¹Y;ƒ³WYшPWØ\É<ÏnŠË ‹ëfQTÇFÄÝMªtÌ=^˜c¸|qŽÌ-áý)Þùä•Jü 0fdi` +endstream endobj 12 0 obj<>stream +hÞbd`ad`ddò ðò ðÑvL) 0q6q5µ‰ŠþæËùÝ÷«ægëyþ+‚Ýßy…@ÜHꀀ‘Ÿ™‘‘IH‹ïû¢ï³¾ÿmXñ»Ärj.+ˆr@tEñâ¼¼ââ¼¼ÅÅ+V,^¼BŽ ÀªÅ'c +endstream endobj 13 0 obj<> endobj 14 0 obj<>stream +hÞìÛO«+ÇÁ'àûÄlf˜Í+È:AÙ½Œ ÖÖÆzg6Yi“¥ !Ûƒ÷?€£p Z_o´t6ƒ áÞ…!Èp `4' ƒÁp¦¸‹vWÿÓ¿sԭ硸Ü#u—ZUÝ­î_U?>p6»ÝîEƒétª}ÆêîîîÅ æo-—Ëõz½ßïµ'À¥…K¯–˳ív«‰FéÄ<¿"Ü]Jõ.'ÏóÉdÒ~=¦•Fé¼y~n0×뵆¸„p¡Õy=–繆Ÿ³çù‘>À%ÌçóÎ+±,Ë4Àø\(϶ۭæ8£ý~ßç2l:j+€ñ¹\žïFà¼V«•™7«)ÏŸN§ó.7’ëõZ œK¸Bë™ç/—KÍ02My~x½ÏêÛív6›5ÝH. - p›Íæ ‡%ó<×hcrbž„[ŦH:ja€³X,µW\MWbY–i4€19=Ïl-¦…N—çyíµÖd2Ùï÷fVÜ‚³äù<àr²,«½ÖZ­Váݦ)úÛíVÓŒÆEóüÉd¢…N×”Øïv»ðîz½®}w¹\j:€Ñ8Kžn$k+Y,ZàDM×ZÓé´X Ïó¦‡%Ã[`Î’ç/—ËÚJÖëµ8QÓµV–e-À žç7Õ'ŒpŠÉdR{¹µßïã2ÛíÖ%À¸5¥ñËårÛj½^¯V«p‡Øôp÷f³Ñ¼' +]µ×Zóù¼²dÓ…Y¸rÓŒ#ДçŸh¹\j[€ÓÍçóÚË­õz]Y²ež†fKäù¡N pºý~ßtÅ•çù) 08çÍó'“I:U €ã:å¾i2–e`è.1?±Xì÷{m p¢étZ{¹µÙlj—_¯×µË‡z4&ÀÐ]"Ï7 àtÛí¶é‰È¦Uò<ïÖ®jÓ¤ƒv¹¿kn$Ã2³Ù¬=Òoz€yž7]_ív»–›fõ¡N 0\My~ÿ©õáÆ0,Üôd÷t:ÕȇZ¯×gv2Ô©a†ëô<¿°ÛíÜ9œKçSGujX€á:WžßRÕb±ÐÎýµÌ”8Q¨Yó Ôóüý~_[Õt:ÕÎý­V« åùËåRó Ôóü éÎQ;ô7™L.”燚ó<×ÂC$ϸ*ëõúÅ%…ú52À1Ïßívò|€-‹Ú ªét:?DX¾¶žÙl¦‘†èŒy~Ó½g¸ÔÎ}ì÷û¦ ›Íæ ªZæZ„·45Ààœ+Ïϲ¬é†qµZig€>š®©&“ɵ5MÑ_.—š`pNÌó·Ûíz½žÏç/š™ÐÓyø–Ñ<ϵ6À°4åùç2ŸÏ52@Ûíö¼$ò@OËå²ö‚j:]çb±¨­s6›ip€a¹hž*×Â}äy>™LÎ~MµÙlÌ»‡ËåùËåRóô´^¯›.«öûý)57 ¸Z–Käùáž1Ë2m Ðßl6«½² +¯ŸXójµjºfËó\Ë ÅyóüpWnOœBpkò<Ÿ7Øl6'V¾Ûíš*ßn·`(Öëõü«Õêî­,Ë­¢ö §‡‡Wîó,ûòåKí×ìÍë׿úégŸ|ª)àš½÷λ¿úé‡ïðæõk­WÎ5cuÿÕ«WÚ€ýâ‹_ýÇ´(ŸgÙÃÃ6«õáûx f¬Þ{çÝpÖ4¹¿¿y~(ï½ó®9¢pµ¾|ù²x &¹Zcd>ϲй¿ûècãª4ùÝG—#ý"PúÛ×_k¸6ÅAúÛ_ÿæ¯_|¡AÆ$Ž®†ÎýòåK @ª˜ñ›©>\¡?þþñ ýðýÞ¼~­MF#thù ì) €‘ùêÕ«ß}ôq,ŸgÙ¡å³O>­Íó¥úp!á ‹Çì¡3±Ã!_9Hÿò§? ~¯Ä›×¯Ë'äCWOGWîòðð aÆáó,kIãÏU>|ÿƒCSG Éï>ú8\á>tõßþú7•#4¼êü>»¿}ýu¹_]=ô`zúÕ¹£ñ4y~Œ•L…Ó˜çÿåOn:B¿ÏëÄ\ÔEóüPù—/_jägqézïwÃZùÓŸ4&‚Á‘ç•2-ÄG08òü±rB …øGž?VNÈ´ÁàÈóÇÊ €â#yþX9!ÐB|ƒ#Ï+'dZˆ`päùcå„ @ ñ Ž<¬œ®ÄÝÝÝ‹·¶Ûíõl•øèP¡ûŠ~ ª5xòü±rBnÙ~¿ß6Ëó¼iÅÍfs÷Öz½•t~Ðn·+–ϲ,ü¿vyþÑBOµôcKõé—Ê–,Viê&y>ÏNž?Vò|à–ŽVm`»Ùl¦ÓieÉÕjÕô»Ýn>ŸW–¯¤ƒòü£Å½Vm®Þ¿_ +áõårYY>ì é(€<Ÿg'Ï+y>pËÒD·=Ï_¯×åì7˜L&ÅŸËå2­·ÛÅf³YX>Ž„?+ѱ<ÿhíã2i®~P¿<¾ óÃë1ÃËÇ?C=•H_žÏ³“ç•<¸eEžß3wÝív1òÝï÷Å‹å¤w½^——o)ñd2)Gôqšwe@ž´¢éBoöYøÐ~ ‹EñVVŠFãàN¨­¼°<Ÿg'Ï+y>pËŠÜu³ÙôY8Næ¯ÌÇÎó¼˜ì]Éuc>Ÿ%yZ¬*Ž <Êóëõ:´I¹‰Ú»fµZõ©öÐ~‰ùüb±hªª<”#ÏçÙÉóÇJžܬ<Ïûççûý¾iòv°Z­Ò¨¿˜^ ù ›Í&”kóüíÏúja3еÂw<±•ž1>*Òõ>ß½xD¢g~~h¿ÄyûéÈBÜ…ÊQmž\„O,Öê3¨‘<¬äùÀÍŠ¹kŸ…³,k™ÌŸF¸»Ý®x¥iÒxñî|>¯”óü<ÏÊŴÿBøX MƒãGo…eÊk§¤úƒÈóûËÑ/E{Îf³–,ïE•!ì9ÅB¹Gjóùòþ­¬>¨ò`4‘ç•<¸Yëõºižvj±X”cóT%nÏÿërà˜ç‡UŠ ç©ðzebzܲÖd29: +¾þ:Ñgû¡ýÒ™ÿ§OU”óü8·¿Ot®„Ö‘K'yþXÉó€›U$±“ÉdþÖb±¯4åÞEÌnª­˜Mgqǘ·©Â˜ÙÆ|>®RTUž¿Ùlâ¬ûJ°Óã"Ìß"ÆÚá£c:Ý4½¼Óõçù±æ? M××Ú/±ò¬!-F…Êq•¢+=Ç\Ò)÷cø7~ñ°zèô8ÐgØ‚'Ï+y>Àà„ÛÀí/¥ÚpǺMq·ê wµáF8¦ñþ:܇6ÝY× +ŸnœÃ-pyªa¹´„-íMV «Ç<$V¶Íì•¡i2êYv¶güŽa»ûY9l9ñ@†¢itøihš;§ß§*óºÓé÷é¼îøJí4ìp:Š?aåSSLƒðÒŠ¿¤ÇMí¾þäùc%ÏœKäù-3Øû$ÛMÉl6+f/—ŸyoÏáËSéÊâDè¦í,ϻ묭¼m§¤ã6Ö Ô)y~LMÓ¸eît1\~bŠ?ãÏPíÔciÐ9ÏóÊ*-gÝ4Žî“÷©¹Épóüø8C¹×í—Ø¼MóÂë•YG÷Hgžß§fx”ç—<`p.‘ç7MW.¢Î2ôߤÅbQ¹GÞívéb•H$|Pšü‡ÛÕÊ„›åtƒÓq‡Ú‡BýY–•+ ÿ·áµ#1ݽMcÍóÓOO;:ìw%éw—çÃ-H“ÕÎyÝ•U:#ô´Â[Îó[¾ì)¿AG4re•ÎæM+”çóìäùc%Ïœ³çùiî] ·›f£Ei˜ßãËQj´f wiòþìü¬°LSD¿ßïÓ1‚–»é[p;yþ釡PF)ýQ‹lí¯Iü=ç„xÂiú9+~ËÊ?7}R÷b­øÀc¿Œ7|‘£Oz#ÈóË× GôKûNÚ¶õHyšAçHØæ³ÿ.3Jòü±’ç ÎÙóüøPy ½ã fg>ÿX—޶Ü`¦cåÁ‚bôùjñ~6*?þè|ûÚùü•§ Ú…ûñmIü¸PIøjóŸ…ÿWª-žQ,°Z­6›MŸO õ„Ãò±òPIh™þO´lÛAÝV ûIQIøOø³eú'êEË”¿`gåíûjî9±Ëb¢ê/wel“ðŸâ•ÙlVy<¤ÒéÀÐ¥á|ùÅp^JW©âÓì=ª|c%MQsí6ĪZ~²[¶¤Ó óü4œ?¢_j³÷BœcPþˆ£{¤i–BŸ-2yþXÉóçìy~e¢ûr¹\¯×•h¹gL³Ùö,zþKíy~Ëçîv»JUå(5­*|¯Î¦¨ m:ïºÒÅ}ýjµzQ'~ñðŸJÄÕ[¾þ~¿O·¶²z{ú*oª¡ÈˆúäùE/4mÃl6«]«Ož6¯©é +Óé´ç¨Gô¢KÜÚ¦é÷é~噫˜šVÆéЇ¹Ây»rŠo…˯Ç3mz>ŒQäç™J=éZå +ËçÕÚÅXíqÏ 7Ïc¸•ñ‘Cû%^¥ ?¢|ISî‘Ú¹q­J…í(ÆjýÜÐIž?Vò|€Á9ož¿ÙlÒ4>Ïó–Yôi6{ô=f–;Ô¶RŸ‰Óéýƒ¾Kšç·'Ò¡©Ó¡“J^é‡í¬h5¨ÕVf˜§Ãy~ûÆ·lCgžß¹y ÓDò| "œNk³ÖxLO2ñÔWy+®R9éÅçÅ*§ô¦zÊç™ðVåW ¾[9۔ϫáƒ*_*~V: ÑÓ•çùÅóqéëñ‹§ƒ#‡öËci(§|E‘+ÑÞ#ñÝ´GâZá­Ê—*ÿúŸòÀ7Bž?Vò|€Á9ož_‰mãóÝqrZçÓâu1i¸«Í²¬6$i‘ƼEdn®ÍÒíé¹bq·~\óV¶¿3rO?«iª|Yÿ0¿%Òo™Tß™uz†ùµÛЙç´y-ƒM;ª<n\ñ#8›ÍÂÉöî­ðŸxŽmT§ˆp/ÖŠ¯Ôžâ©#Ô\|PüñMãÜbáðÑÅqøˆ¸mq 3¬Õ”ÇeÂGT¶íE×t-®<Ï/~’B[ÅoÄÙJ\¿<þòÇ«ø òÞRÙ¸pñ)a±¸måK¬´Gâ®UÔ¾~±Vù‚-½6€”<¬äùƒsÆÀàœ1ÏOoùã i|=Êšojsì–l¿e“:ç?—ãÓ¦Ûít{úßü¦Ðÿ‘öôs+Ï5Ôå†Íó<Í«ËADÚei|”~J¦)¤QI¡ÓĻҕVJ§>¦ÛYžLØžçW>=‹I¿`Ӟг›:²tÿé\Šp)†\ço…ÿô|¾,œLÂùªX+œâ:,Ba±bù°bÓð_1nß –×jú -çù•Ï +ßèˆÇÜ*ž1> +_omiÞÐq±GÚ¯Žè—(´dø òÞRÛ¶¡Úbœ·ügŸ)ÿö•?+8âÉGn™<¬äùƒsÆ<¿2ñ¯2¼’ú†?[ªª Ø$|P¸«mº“­ “›L§ÓôÖûzòü4I¨ÌµKç–§-YÞ€J§„Õk›1ÒKGj*i!¥_ތʷ¨M?ÒÌ¿¥¡ZöðÚ¾«l^vÈ]ª<ŸJžvâ£'Ó4– ‡’ç•2Ààœ+ÏÏó¼=×MgA·Ï +Ûn·iÜÅ7Mœ ]ûŒyËtýr¬}=y~g÷•g­7U7 ÿC¡a›fà÷œÜž.7£Rye(J·6~ÐAy~¨?Ǫږ4_QžœÅß¾þúó,+Ê—/_>ïÆÈó{ +={-|©+ÜBy>ç"Ï+y>Ààœ+ÏOço6›òýÓã²ív»\.{û“ɤi–~±…‹Å¢g°_¾óPžŸnXKž:¨O_¨´[8ÿé³ÿ¤#M›úú®AÓÖÞPéŠñ ‘°ña¯hùÖOÖMò|àó,‹qÊï>úøy7FžßÓõ'œò|ngoç8ò|€Á9Wž?›Í:gYW–™N¸bÜívëõº3Û¯<Pk»ÝfYÖ™íÇ)èéHDX·çf‡%z*¡²ÍóÓ »ÿ~“¦×Sý7£§øeÛ*Ïó>ƒ8¡§*#POÙMò|@ž?Dò|n‡<¬äùƒs–O.¤­7#´aå­PgZCøÄÊqZ*}«v¸!ýOÜMò|@ž?DNn‡½}¬äùƒS´ö£ìJ&\NÔkµÏ…NÓѰ@S¤^oÉÌÓ:lj:Cûñm¤¼\.+ ¯V«ö +>.#Øï÷iø_ Òûx‚íÙÞPµV´mOÐMM‡aùQ`ÜäùC$áävØÛÇJž08'æùiÛ'¸®¬þ¬,pD¤ß”™é·Ì¥?"Ò?.Ì|ª<ÿ &jj™Îþ +Ö¹=#ýétZyt¢³¡ÚÒ‹'è¦,ËäùpãäùC$áävØÛÇJž08§äùéÔît†|­4¹ UU–Ùï÷ý·- H˦N§Ó>õL&“tKRi:}܆µ{²<ÿñí,ýö& +-Óþ]Z"ý"!ï¹íãaKGú4TgÍÅwì|ºäBÝÔ4N$χÛ!Ï" '·ÃÞ>Vò|€ÁY¯×wGÙï÷›Í¦òbmH› +‹UVlJÑw»Ýjµjš^ϲ¬2[»IøˆårÙ”Z/‹Ðý'Ò‡%ÃG78´aMÂê•Vêì¾´ýÓJZ¶*ÔÚ¡ÜÚ¡¹Âw ߥOË„eBýqõÉdj‹›tèf”{*lCØ ÂÎptC›jû@ew +Úûg隸‹†¯9/9ôa`¸äùC$áävØÛÇJžÀåìv»íÏš¢Ýž¶%'¦îçÝ0n“<ˆ$œÜ{ûXÉó€èþþþó,‹¥çbåòåË—Mkýíë¯›Ö +o5­Õ´J(a3ݼs•rVöÞ;ïž½þÐ ×SþúÅåøèª¶í òáûÄoñ—?ýy(›ýððàÔÄ¡äùc%Ï¢žAAe±ri™¬^žÓ^)-qSÓ*E°|èæ)ÊÍ–¦c³åxi:0[Žeå¢=Ø¿üö׿)9´®rÍ¥<.Y¤Ê—/_¾|®aåûûû¦Ušf\?:µåÍë×M«„·šÖjZ¥²m®ð€±’ç+Š<_ž¯(Š¢t^n÷º®å²üÀQ¥ô¼æt…ŒÕEóüÏ>ùTž¯(ò|EQEž/Ï8ÝEóü–Û1y¾¢ÈóEQyþAM«Èó€1¬<ÿáááÐÍSy~ÿãEž¯(Š¢Èó®Ö°òü#6OQäùýy¾¢(Š"ϸZò|E‘çËóEQy>Àõ{óúu¸iŠ¥çbåòÙ'Ÿ6­ÞjZëË—/+ o6›»»»ívÛ´Êq›7”"=PäùŠ¢(Š<ÿQžpõÖëõ‹Ÿm6 Â-{óúõß¾þúôê©­ÿáá¡i•ûûûÚUÂëgÙ$¥ùêիϳLQŠ2ô1kåŒå½wÞ•çwn›k €‹úß~øß&“¢ü×bqhÐÑBgÔ2딉dÀÉóàúÉóàúýßÿú?ÿó¿ÿ¢ü¯ÿüÏß}ôñAåÍë×Ú.m>Ÿ¿øÙÝÝ€+$Ï€ë'Ï€ë'ÏžÑ~ÿãrùÝ‹ÿ¯(áÿáÍ)y>ð\v»&“ob˜_”ðŠHRò|àYl6yæe6{£} Bž<½õú_µI~,«Õ½V€2y>ðIJìûö0¿(›M®­ ’çOi¹ü®O˜ÊdòMžÿ¤Å  ÏžLÿ0¿(óù· €´Ûí¶Ûí~¿/¿(Ïž@žÿ4›½9(Ì/ÊÝÝ?µ5k·Û¥oÕ&öåÓÐ^ž\ÚÑa~Q¶ÛkCèo¿ÿ15¡ìv?hJˬV÷óù·E ÿ¿»ûgKɲtàhEö¾ÝnÓ·jûöwåùÀEív?L§?:Ì%¬žç?iIh±ßÿ¸^ÿk¹ü®r¸ÍçßJõ Yöý‰'¢Í&׌Jž Ån÷ÃdòÍ)ZQ‹hLH¯,û>íGYx׈Øf“Ÿ~"ò¸G烰Ýþû,a~Q²ì{M +=3üJY.¿»ñv;ñ)¡ò,};!‘ç?¯Í&_,þ1ŸÊrùÝ~ÿ£6Ôzý¯žùØlöf·û!PK†Å4,7(üÐÜÝýóÐ ßásÄé¨O }aŸ ?yþ3Z.¿«Ü×O&߸µ‡ŠƒÂü<ÿ)¬þíÌ*ãÂp;V«û³¤Ðóù·7ۆ皜÷ˆ.'Üçn6›»_ +/îv; ”<ÿ¹dÙ÷Mw÷Óéß·Ûk"x¬öj ˱X8ˆ:W •kanǹÂü¢l6ù ¶áy'ç;\BžçY–Íf³­&“Éb±X¯×Z yþ³è„|sö¸qýÃüÚ@¬OzFíÌ-ØïæŽÎ#n6{£µ·íöß—H¡ÃÁuSÏ‘]hr~Q6›ÜŽ +pŠív[žrŸeYí¤µh·Û…ef³Y\Ë,}`äùO)Ïêœ-l$<öŽû<À²Ùäõ¬V÷Úœ»\ÝòtÌÈtNÎï[l_=ô‘à‹Å¢¸Ͳì Ãòq@3×o~šÊc‰òüv‹Å?N‰MÂÍþvûo͈ƒ¥˜Ü:ërù]çñåàb¬²ìûCg݇0¬µÛýðØc,àFŽövè“Æ¯V÷î.§¸ ],G¬»Z­ŠÕÛ§ôŒ<¿EŸD±OY,þ‘ç?iOF¬s"ëdòM‘4öÔçјP§#‹ñ {uØ·ûŒ‡©˜á—u>,3Ÿ;úf¼»ûg{#ô^ìì g!€£m·Ûâ&t³Ù±ú~¿w Ü&y~“õú_g óã-–}¯U«öèìÐ0¿Vé<²n!–äÖtÎ  ì÷?¶WöJÂo܈۰3‡ïêèX.¿³Ó!æùGO°w Ü&y~­ÎÉÇ•ùüÛ#RMžWžÿtw÷ÏÐwE1.Sk:ý{Ëžt£…;«Ð;ÚŸÑèÆ +ÇZŸz:™ õŒxbyg~åû×Ö~~ Å/;Àbž¿^¯XÝü|àfÉóSáÆ¼}^_œ!Ù9‹ò\•yÆa6{SéÄðʈs°#l6yûnJs-ÿè<¬SŒFç¼úp¸õ¬ªój¬cagœœ_è<ÅyPà8ÅMèl6;bÝpëzâô~€’çWäùO3ñBY.¿+–¯Í{oyV䘬×ÿj +…âÀcWä~b[õ9$ÃèF༹qg¬ÞÝï_3žwr~¡sœåˆ:X,Å}høOžçýW̲¬Xq2™hFàÖÈóËòü§>á|X¦²b–}ßgJÿègEŽIçÔVMTØï¼tÌjè<¦FKrk:‡®}%ü6õ›³OÎ/„–ï©·j·ÛÅ[ÑÉd²\.7›MK°–ϲl:ƵŸš¸5òü²åò»>a~íìúýþÇöYÊ'Æ2<™žÃ:fcڧž+ãêœp»ZÝßòî}CÍç߯$3ìÃáEûçh¥£³÷γÙÈNe—˜œ_è¼BȲïíÆ‡Z¯×/êÌ©œáGËåR—sÐóƒOIžu†¡L&ß´çð›MÞ9Á²i’?×`»ýwÏG-ŒÈÚwøõú_ç;Y}Û~lÞÚŽšeßÿöÍ/ÄŽì<ðzôCD*a‡! Å&Æ,¤À;ì—ÆYðîãZ{`½YÖS/Æ »‚Ç ˜fÈ,fm‡‚dÿqÏNU´ØRÆÊÄÓ‰Ù†3šY:Es©ò¢XL¼Ñg§ÜËáγKiÆ|XzÞîKqÏHÖašë´Dg¤Ï èÁ"åÃF ì@ЧÒä|Žt =Ö ‚ +oÓÃá^¨Wƒü²ÒëÂKý ‚ ˆá0‚.ý_‘•-`YSúðÕqœ¬-zÞùü ˜ª¸²|IwREÜ=ÙF¢h¾TÎs隺¥H%aéYª=»dÒ—&õ£ÛûZ4øëûQÁKHË;£¬:9ŸoJ¢Ç:ADKA^ö ‚ ¢‡¸®ÛG<÷Þð wguunÍ4M~›Q%ÿ°, þäû~͵*g/ôÜç+ŠÜÜþVš.‡çé_èfQ—ùЛ$E9¸=ƒV­¿³òÅÝ4$ gåÊ| +EiK=~XåaÔêpX=Éù iü¥”ÀAQ'ð"¬"7~ãÉßþÜK¯fôg/ÿ!‚ :Cžïa²{á©øžoÛ6ûÆ4M×u‡ïD€KC=Oî¹Ï—¾•3-EóÜ—ºøҥ¤âÖá8;Š.Ô4×KO8o5Ð õgƒC±ølêÏÒ”ï(¸ 5Ï£5;>wà°íQ{›±žä|†t£ô) l‚ ˆrñ}õ1ƒÁÞÍK/ñù8ýëO?ÿM8à›G¯Ì?øÙWß~'õ€?µQל>}úÌ™3O=õ™«¶C]I]IèÆ“O>Ùê®ìÀÿžç±{IýçATâŽãÄ„ý°ƒb@¡Ï>_jÚ™,j®Ä¼Ab)¤‚K4]dAÕ§O)' < ·(ŽÉ¬}ï ÛÛÛë999¡¡Øj¨+©+ êÊâ ‡Ã.ù|×uSî ø#ëé_?|+ã8*ç÷ÙçK5»a\)%; g¸j€Ã÷£^5¾Hs,ù±ººGÍöGH‹9ÎNu—vÝ[ŽŽ©,¥äGj¡K‹ ‡w¥Û7ÚØ’u&ç7ÕwA]%Š"ö®-bš&ÓõüE;‰a1ó_Äç_Ü=f®þüÖ~¼<ž">ÿÚGÆææÑýK{÷6'íØ‚½¹¹ÉtÓññ1 ÈVC]Ù666¨+©+›¢c>ŸIï,Ý ÿ„°;õ<¯ñªŠ[U¶"öÖ竸Ü»4á–ÞýkFjc(“! gx»•ÓóêU#3â‡i®«Ÿì8;´ì4H#9Þx$®;\¤!°Šb|5ï­ ‚è*âÛhL×Ã[¶išü7–eÁÉðU¿Ä ‰ŠŠ¾Ÿ>·†q¥‘버Ì6zÈv«`ž´L‘¯kséÇJG*x—Ê¥‡3U6¡´QáöaªÔà íLbyƒÉùŠÓ¶º¸ AD@:KÍÊÀç™l¥¼ƒã>Ÿ |æç/íÝC|þædvq÷XL×'‚ ˆ¶Ð1ŸÏ2LÓ\Í€ÿ³±šMÕ•Œ%ç+¦è÷Óçã&°R¯%5l®{‹ê‚©Jº²º5í!¸¿ª4Vf +®¾ÛÕªž7–ŽÌe‡eÍm{¤®ô¡g)ŒU:èti@¡O¢f“óÒgJëÖ"‚ ˆÚàÆ^c“õ<ùëâqŠ~‰ï°¸Ïçß»ú(cäæÑ}Äç_Ü=ÞœÌÄt}êk‚ ¢-tÌçóç{*­!ü?cFêuñÿpzèó¥£R‘¢â“)¯²i2ÇC9ìðý¨žúÀHƒ¾nWwKZm¡}jRʽHGfî8£J¤@ fÕ6þ{‹t£V=.ÌU·O­DOÎW¬F· AÔ7© öø_µù|Qàßž>€ß >ÿÜèdþÿxíÎ õ5AÑ:æóyz€¶>‰8††aÖ{èóñ ùÒù¤2Ç4×)K¶þ®¯awúWT@†q¥žëG«¬xMv +T}#Åv8¼«É}2-A!ÝÀ_ëi|­¶Ð:$ç3¤‘bx¦ÓÈ'‚HÂïûÈ_uðù€wuŸùùËãG#ç·&ˆÒ?™?? ÃÕÂTZ½¬ä|†ã8YŸí›Ï—ŒrzáÝÞîuÈÏ츈f‡mj¨ €ÔÈB+ü3®­j€¾éàE ¢’?_|] +ÙJs2»¸{̾?{ý€úš ‚h óùšcÛ¶tw@VbCß|¾&úBV¨'²Ðƒ}YþEÌ Œö6c#þéïФÙÚ%î‰í +Q9jsËÐp›<âßÀjìº·à—¾Á¼¨ÓÍV‡tå¯9‘[šâ®s³ã§þð(¾Ѷ;‚ ˆTLÓdï¡A,ûYþ +œã³I¤>ÿòxÊüü…Ñ!üxóè>âó/íÝÛœÌø“=‚ ˆv@>¿‘¦F°,+õã½òùRwQ§ý“æZÖ ïR‚©T™Â µPVV¶Zš‹Ô¼©M%xZ¬þ“oÒ*nA%¶“•zHߤ)뢅ú8Îô;ÜHë<¿tgVý= 'u)øþ!­RY9‚ ˆ.Á-:àºnVZŒ(ŠÇaŸ2M³ÜšdùüÅãœüµ£ÛÓðýÉü!âóÏoMÄ®Ý9¡¾&‚ Zùüz€fxVƒ”T]ß+Ÿ+ôš#£h.u;ôú_O;ÃáûQmUÒMè)¢g*¯´V:oyð¼q#a&•W¬¥Oè8X—ªrØöHÿ Mxì‰ÝEýµ’nºÑ³1ñ0DýÉù üYÓÈ&‚ ý±,Kå¥uñ蟇Ðu]ñíð}¿”j¨øüçnDˆÒO¸<Öú¿”ƒƒƒõõõíííùœžS톺’º’ÐýýýÖueß|~žç9޳òø`0DQTõuyfB*|"'¹±?>Þ£qwT¿<÷ýHê©ô—Tš#Í®¿ëñ*i›¢‡Ã¬6žÝݔٓ†3©Íö¼qEW‡õPejÄZ²¸„ƒ}ËÚ(EãWt¨¹»›Úk€W¬Îmkê©gKRŠ>ADà•9öÒšõNšÜ–oÜeU#‡Ï¿¸{Œøü›G÷oOœßš¬íÌêÜë9>>¦Ùj¨+©+ êÊâôÇçAKà†Q©!‡`øµÇñ}?öOÎâqƒçy<íÁ4ÍX”¡ŸEsÏÛöøFÏ 4ib#ÕÆU¤Îv7FΠ…g‡™:¨¶#WÐMåÄJÓtõL)×VúIãbz®HR^ÃÜ—Åä&¦ÜFÕ°>”•ß"ùÌ.õ š^mCum¬0>¯)EŸ " x…÷YöÒªâóá6™¨V„>s2C|þ¥½{miü›7o2Ý4›ÍÚRgE¢( l[†™çya"Ÿ‚¡5DÁÇ>”QQæg‡»2uA`99G§ÔÐÀöö6ôãÆÆ†JW€„̶m>ÎáG|ï’Ê(Uo‡Ó¤?,Õ•úL®>ø|˜#†aœBKª˜æ0;àÒ0UÅIŸ/ž2Ó4aš‹¿/îóƒ`S4ð£†Y妹®a¯t×€æ ÆÌá#mkÛ£¦’f¥©’pXÖFývEÚé +4i8LçÙ]]–{n JÒlózrŒa­Æ[¯ y†»€›]öE×½¥[w‡w¥’5¯¶éîY輡@Ú׎O‚ ˆ¶†!“T¸ŒÍGŸ2ˆøüó[“µíññqÇ pEŽã – e¥kÆR7¡üÔ¡ÈÇ\EÑE÷¼+³XÊ7f,öˆçyÒr`̈©¢—êJXMÓDFi–âS¥¶mgÝ£ÊÇYª‹z´…ÖÍÊ>ø|X½¹Ì‡o\×eòÀ`01…^ +©ÿÉ >?ëƒ}~–™¬MF)È»Úú +iv±VJ?¦l/ÆRy¶¦¹îº·êläd˜)u”6x’æEëÓN7Tx{ÂðÓª1a"Hg1XÆa…YÊ™Ãx€6g|~L=ªÎÆGL}² ¡&ÒpFSA϶LpÍc‹ …­7ºÅG‚ ú’wÍ^Þ?øÁJ}þÉÉÉ|þË3Î^?@”¾´>bQYÀ pµTQ,õQE6ƒd9*>Ÿ— +(šR¯õà²EáÖ+V”ŠÏ·,KZ”ëºY>¿þ¶Â#Vbä(iÔsŒÒX­Ô?žÌp¦Ñ®yQ}ðù|‡Ir +ÃíêJQñùYw‘Ïç#Y¦ZüýºñthÛé¬ôó9ü¬¦®!yruuO¥ª ¦qJSôµÚ”¡ú®´†Ãáݶ,GM­H¾5¥ß«8Ùz“µiØÝ1ô—äŠÓG‡<¤ùÚî¹#‚è61—Êúúúk¯½†²··çlll°d˵#ÄçÿôŸßQ/*øœ§ÁÉT”bQ¯¿þº(óÇ¥+üõÙgŸ=}ú4’bÍ ÉÓO?½š—õÆo<ùä“<+8™<ÏÊÓ>ô¡qKÎä†ä•W^ɺÜp8äAÏóÄ?qS +ßdÝ \‘ÛN¸õ`Ž¢ë•,*õd^_b]+ +†Sì|îókn«¯}ík*I¹/¼ð?-k”ž9s&«Vb~òÇ>ö±X­’Mº¿¿+j0$cÌã7˜,**J½¨ÍÍMiQìœsçÎuÛçû¾Ï&r”ábgÖÓZù|n÷ù¸è{≷©UìL©åËJ)¯¨Vp¡’u-knœÅ} +Ú•o¿¸„Š„3w>Òýÿü™ŸÖ_«Ôq¥(úšõùÒœØWÿþûü ˜J§UjØ®ÎUô³Ï¼Ù „‡öYYÙ‚Ã4׋—CWTúõ¯íÒ½ÐÚŸ ¢aò¤PÅ(æçç;ßA +a)Ž›››óù£÷—ÉlŽøüW¶"õ¢RáÙ’± p**«¨3gÎdYúXQpEžkSܬ­­!µúÊW¾’šü,ú|äa óÇΡ\ª(•ü|^žŸ=ȃeYHQ| q'5?¿ž¶‚Í +ßøÆ7ð¢ž}öYƒH¥Ï=÷R+Q0Æj•lÒÔämÅ¡i½ª¨¨ñx¬R”J~þ+¯¼ÒmŸÏÆrßJ*Y;¹J§~ŸÓ\_4íóß~† ´/=ûtðù ó“ªôK¯UÎkRâá8;ÏÿùbÆUÑ®À§>þñ«_ë‰'ÞŠ]¨)ç#MÑOæi×P«Ø¸‚ ‚Û×Fj•:Úq|æOÞhÜç[ÖÞãÜšÖY«d~ûÅ*îs)7º‹‹îq` +ü…w ágŸy7¿o]þÝß{kY¥Ïùš×vߤkQƒOœØ¸:ÿ7?TYŽšõùxl1ù4ojm_çìõƒ,Ÿï]ݧžªÑsª¸ž<ëtnHðBø D|>^žüœz!ø¥çy,hUMî5è9K­Y'óä®> ìB¸óç]œÚq0á÷<àèû>Rf ‹[‰µU¥xÓIÛŸ§7§ÖF5ŒmÖP0ÚkP¦„ +¥?auƒ|¾¢ï6ëó¿ðÅ˸êI:ä¦ìJÍ¥º/©ôË­•çkHËÇ,ÏüÉ0®Tì +ôÝgŸy76`ªÜ;T˜ å/;J¡Î©éýêíŸö‚ßóx–Üâ}ÕÑyŸÏVïä¨F&~¹Q9i³çðù_þò—áµ”w޲>ÂÏažËmÛ£“““ØGøñàAú8põÔóÕkÅßú­©ÞŸþiØH­ MRÏçw¥ +(¦ô˪Õ÷‡{ð×4ùIûúÌ3ëçßÊj«o}k7G +ñK/Ý®´—íùRô«®W0*Ô«W[­²z0Šæxmÿê¯nÕ_+4”T>ýëÿ\s­¤ãêoÿöê|ðtðýBs0¦Š &Ÿ~úzk»tjÃí7þĉ+XT¥›qê¯?ð'TêÓ¼Áµ}¡¢¸Ù›A‘ +¼b§šØÜäöù—ÇSÄç_»sBUŽãàJVEŸoÛ6;MÔ¤‹e|>³¢¿å‰âYP3£\Ÿ¿ÒïSKø³|~ª æ†+}<íŸWÏìùV<|”ÂTâñˆ|íÏ£lb؋Dz΢R:ïóy Jú°`ë<,57{ŸŸoÖø~”CHÖƒÎuË"¦ŠMÌÒ/ˆT=5x@k8ÎÜlÍßçwñ(’J2¹6+IÎýzÀ}ô‚ní‰WضGMU .N “Ñ|Ó-ë0ÍuÏ—µöªokb³‰/#•"Í͆Y¯áÓÀ—£:¥7©†í)]ÞµõA=dYŸíÎÉ¥½{'ó‡·§Ÿ¿¶sDm[ܦ4ÞRŸÏÒ°³ö(šR®nD1Ë ÅŠYÊð{>jážPºÏ}²Ñö§ŠwþKè) ž‚~ä#_^T|>7áC™*£Ôó<¶×¾&ÛD±ýùlââÚ„; ø`†Fãµ¢¸Un&³ùÍ£û é¼Ïç#“ ¬sxŒ‡ªÔˆÏ¼¸a’««{ÍõÑ–žr§N¥×R·aˆ›‚Æô¼ñpxwñXb@ÅŠ›j?¤-’ùŒ|)ú5 h ʽì5ð®†)­•¶v—³»øü…ÉË–ˆrG.á¬K5(}i¤ÁÇ"¬“zúgm+†#]Þ5\E ‚ úÉR>s2cºþÂè~ô®îgùü³×ô¿÷ù|>wwwÇažMg †Yj…ŸSPwsCbYÖJ1¾O^KÅ”ÞÔbæ3×G©J9kG@¬+³®ëºß7Œ¿œ™ïQ4Ç ‰¢ÃG*rœÅ©îXYÙÒY–j›¢‡Nšš×R4 /Jc[0´ŸâtÎÒæ0ÅRBÐàpˆûk®± ¹—Màf¥ж—µMƒ×vãŽty×y0AôŠ¥|þµ;'ÜØÃF‡HŠþdöè_ “ùÛG÷Ù÷º±½½½¾¾þÔSOinòERefYJ4$80lŸ/5¥ISÄÿšª‚ `%dù|Ö•ÀÉÉIò¯®û}ÍM¾x¬¬|ï¦|#'µ>ëÅ$ü÷7ÝûR÷S}~Ö~ të»T79PlVW*îþP_ñ¤Ø¶ƒÀã)Ü…&kË/-î@‰M@ žŒèÚجYY.wÙsçüÖ¤H9}ðù !´„G‘9[.Mù|ék#ïÚ¸Þ±¬ ÍG—¢Ò‡sr¸©áð.®=³Ì´*îð3fʾ4aµŠ*¬sÔ†£aŠ>Lê–îwÀËõÛ3if»¶©Å­C*Ò .›ŠGºnk¾(áku#ïYmc‹ JÑ'‚hKùüÉlÎuýædviïâó¯ÝyäpÎ݈à{ï꾆Jssóõ×_o‘ÌÏrõû|&íc¶GÝ”&MÏg†ord„BW2s˜š Ü"™ÏŽ0Äœd>?æí91ÏŸêóù†‹ÜVM,vcc#µ+ë÷ùl &CHêeÚó |hÏÚLiƒdueœ½~@ùùËÞi,ö„/ïUW¦Ÿ¿ÐOžKmd+Þ «PúùÒò¡‹ë¯0œ­®îåˆ#äÛ>ЊœgÞ2øíÔŸ¢¯aˆA}„ã³Æ÷#}*£sK¶XØÕ7Uñ®®¶=Ò¿ u“熖Zð§¥èAp|߇Rx?µ,+öZ ¿´mÛó¼Š^®—òù‹÷k“›G÷ŸÏ¼ +ÿñòxªS“?âðððµ×^#ŸÏá†D´µ"0a(rkšfêXB€îºnÒØÇ|óYÕHíÊíííÝÝÝÔ¿¶Îçö:¿Tw+ú|èYöhv±»c¿Lõùb¿ÃØpg0,µ^‰Å²®ÜÛÛË:§,ŸŸUN†Pq)ŽÅ8T¢0€“Iø0ìùÜasê·œ#€Õ +²º²tbæ"EuÌçóÑžu u˜°\ìØdó·æz6èó¥B²æŒDÜFjžÎ'RDéC§@³Ã­‡ëÞZYÙR—]¼døl¹7åû‘mª“ùp§Q¤ãnV<"V³õ•Zèúã %6fBUjwKŸ\„âšYÅH†KK—ÓV,MZm¸“þw¡DLºs¤EÑg‚ ˆŠ€÷PÑðH3¢KÑ^Öç¯í1mrîF´t}ò`'œßš°/Œõì$GQCR»‰»Ç‚A©ÏgDQÄM+•:˜Û/â_<3¦µ“n0&îÔX¾ïóñPÊŠ'¥|ÏH,;ˆï…šºà0· ÉÖKýýåñ”?w +^¢o>_ôù Y]ÍO‡k—C“:"nŠ  à°¬²Ä8”V*‰¢¹çña£U…+E«ýö&ç+N™zê/­,S­ <µeÍT_á̲zAºšµEÛâq(¸ÍÞV&7øÿ$m ôATAEÉl|àS%æs.ëó7'3nN&³9×õ©œÀM‹wUÓMâA¨‡TšÅ4ÍT£ÅÅc2%8 .Å}>ày^RuÏ † %§Î è£ÜÁ¬ ›æ‹­ù†ñ—xrþ¢2ŸŸ´÷IßåóÓÚ¡„TY-ŽÛÜ>Ÿoëƒ&P¥üб}(Å}/TŒÏÙІôpL…­N°$F‡ì)Ï£‚W!ŸßÍú|ß4q€Ò\¸Ö)_é•~Æ•ÚÔSÍággÙ½15ZóÒÑ$E¿íÉù \çÖ“¢/µ»5ç9÷ +ÆêJ?uÓ²HWi¨O[ZO«”x­6 T7pîFÄäÉÚÎÑÍ£ûˆÏ‡‚l¹´wº¾ +DÙ¥¢:y&¶˜·¼XÆçÃP¬ÔçÇٲ†}«©Èç/ÞŸŸL×_¨ù|‘ xDYè‹]jDQÄï]Ü„¢>JÅr·¿"lgJêvBÉü|ñ4¾ðo?)´Á|~#4îó=oÜø«÷px·KRE¤¥}TµçT$ g0œl{$Íiì’‘êÇF/®%ëÉl/ŽÔ¯šæzu#J–ƤŠ'„¥Ì©R4µô*­‹#k"Ò5 +”‚ôŸJÑ'¢‡0o–TRà|®ô“Tqrøü‹»ÇLžœ½~?">Ÿ°¶sÄ~<¿5¡®¯.7bŠ> žçÓ§ê>Ÿ›U×u“c)‡]a™Øbi±a¿ì(í0Õù|Ñá‹n?ÙÅ|„ð|û,]ÏC?ȨPôù¢ô}*ü^b÷¨>JáŽø®Üí«RlÇA û A dÿêyôOo/ΟZ\,´DÏo„Æ}~Íñ×Õò¨q¯ÒöœØJ•¾m4tãP%ß [cz¶ÁMÕ!MÑ7ÍõfX‹ÂaRÅZ ”îqhé.¡–²Ô² ψe—Aé^Œ–¦^㱞æÒõ°u<<ÑÆ;"‚(Ϧö?>„Rר¤xç]“ÞÉõ +YîÔÓþù5 Qúâ•©8J¡pöŠ­´E|>û ´ 2 àº4ȳ·dÓñýbO?dþfèû˺VšNœY¹©¹‹ñù ™C³¬J[@úú_ƒ‚¨š*”¾i®·ÂÓÁÔóÆÐ–R ]i'žUÞ®p˜t5¨(I®‹‹Ð–ÚÝVãûÞ)±õPe`À9®{KºXµÚØhpwÍ®W t¤)úé#¢WðW×ÜoÊ%¾Ãæðù'ó‡ÜÏßž>¸´wñù×îœLfsþãæ„¸UÁ»’õfR| ®(á›äþnH<ÏK;P‚hQbéôE|>ÿ¬ã81¥?r½\J «íTçóB"tê& Tñ.›Xiðq©Aö©û| â†ÆŠ…mÛ΢±‘–:Èaâðñ–§Èí{ùÊe&[ZOë'¼;`p&ÿÊ.þÄ»Ð'wðtÕ硆zêàóƒ`Ú`~/ž[unsm”«ô]÷ÙE}€¾hÊw)9_eA¨(ÂhÛ£NÚݶÏ&ènÅUfYVð7 gЃ*¿í›ÂOo|ƒ@PŠ>A§í>¸vçäüÖäâî1|óè>âó×vŽàœ³×Øì#DEˆ’w+CüeVnsì489&Þ‹øü˜§…Y} |ß•Þ7*õù<‡<µÁSÅ»èâLÓ„Xßá^]Zlbæ<¿(ä±`Dª_ÊpBÉ™RÄsŠS Ú‡54¯yj ­Ïˆ+Cê(bå/¼}àôÃÇ>ÿÝ"—#Ÿß[Ÿ¿½®V—~&¡•&6×>&÷ú“–ß7¤[Ñ$êRr>_¤Þµ\».Í¿íLT±ÀxF[²Lã«G*ÝRøÓÜuoUwi<¼Ïú–6©4ç¡ÒV%‚Њ0 UW¾ï—˜«œÏçÇ@|þÙëpÂÅÝcöãù­ €Já³IŸ% }¾iš©þ¤ˆÏ_¤yZ˲báƒÞR©Ï‡^àIæÛg‰wX‹#M8_Êç/;^1XR²ò±ká° Rê+â9¡@¾a!õ¢©¶>#­¬Æ‰þÁÞ`ÇÊÊõ"—ëªÏ_)@ õÔÄçK³|+J?ƒ·`üºËBwœee h«–&7ö©….]v/9Ÿ!ì†q¥ÄIÚqAkœ¥‚¡¶=‚©!ͩ•JõꞪ †ªv·wCADx6æ²öFÔA¥¤q–âó/Œ¥?™ÍoOœ½~à]Ýßœh´ëàà`}}}{{{>ïÚ–íÁ``Û¶˜® ýëº.>ÞàS«(žç!% ‡CvZî'0¼á㢨1 nDºêpW¦ÎYF‘“Ù/S–$¹Âð.Nþ ~ã8Ž(«aøÁoTƒX¬zWÂÉ0¤ÅÑWd£ ýðk!àu^ªý³&T[Œ^Á0¹:±*eVòÀ ²=ÇöW>ÿöKEêÜUŸ¯y=5ñù ™Ôª"O^jíªÛÐ ¾‰MmW˜®‡›…F†šŽV'ˆöèY|<—î|ðÄãVg•K#_¶=*åBž7®çBDñù…oæ*å¨Tw×ÞPÅ…ÃpÖHV@=àwG>Ÿ ˆ^!戦ʱTƒ7´eeÍ•âó/§ˆÏ¿vçDÏ^ØØØXÌññ1ÉVC]I]It¯+ù^¶ÔÝ"¿ä pÿ½÷žÏ?|ËûŸEêL>¿-TäóñHøRúà6²í¯ÿD‘¦û~TÖµ¤á°Vïæˆ¢¹TÞoL•«Ð*¤A0•n¦(xtc¾ñ ž¼õ_´Æ 2zÞ˜¦'A½BLdeɇ®ë²ÔP–2mÛ¶˜Ì ß—’œ¿(Éçßž>@|þÚΑž]póæM¦›f3úOµÝPWv†íímèÇ êJêJÑ®gn^¸¶jþfÈ|þïœú_ó%·¼!Wì@Ï_–(š×):ðð%¼m$¦ø¨.1g´:9Ÿ Ž´1 ¦RKwT±/‰(ô¸4j–ûèÌCGš*_Åþ¯F6Ôܪ©÷Ø=AKE‘mÛ§–Ç4Í ˜²)ÅçÞÕý,ŸÒ¶ŽIvêJêJ¢{]麮eY™Éù‹ÅÎËÎ{Éù‹ÿj¾T°ÂäóÛBE>!³[%&õe½‹Çpx—–¢uàIªe)ân'çs¤æZ;wá*ÁÒt-e9Ûu©»ñ¹Ïúr/‡GߪØß×°hÄþu«ŽA´ß÷Å×RÃ0à½53M1eùü £C$Eÿöôõ5AQ.ƒÏÿÊç¿â|³`iäóÛBu>_*¸Êrì•j:‚h(šã±*økÚw>9Ÿ!M3.’i,]…|?¢ñ¬-ƒÁ¾4(¬rÀdÇMñ)©aûà«P¹Á |6uéíæycÛÁßPÈ " CÏóÇWTÃ0bÙøðKx]õ}¿ŠK—åó/§ˆÏ‡¿R/AåbÿÇè=Ÿÿó_ ¾[°4òù2 àF kÄ_Vçóµ$õù~„ Ú½N´Ïã#¼à<êIr>cuu¿Ù|û†pÛ ¬„4’5'™,½¬Æïvf5Þ8%®Ò¸[÷Â%A„”åóoO >ÿÂèšš ‚(Ãøerþïœúá÷ý( +•Ö1Ÿ·³ú˜VßS÷±»¨ÔçK5WÁsiö2¥ÅÀ4׫ÛêbÛ#<Ö·Æô¼ñ²«´Ìn›ÞÎ]iYêf‡ã씵ÑLs\÷Vé°¢ÐAQeù|À»ºŸåóáOÔÔAD¢(bIÚžç…a(þéÔ©ŸŸ:µøð'ÞýwŸ¿÷ôóGýãéú/ÿïý§,AÇ|~7¨ßç/döluu¯Háø‹?½ûÝ@šBŸ{œKSa ÎÐ66¦a\Y*Î(Íù‡eŠÆp‹pœß·HqmkEm‚ B¤DŸatˆ¤èßž> Ö&‚ –b0†qJÀu]þ×uúò^ŽÄgÍêöÿð¿½Ey®E>_Cñù¸ì*’ýÓr½Ahü•Z› ‚PÇ÷ýSi0¥‹˜ÌçÇÿøVž2ù| iÄçGѼ + XÖFßR‹‰Þ"õƦ¹¾¬7îar>_”ð`E3 hÛ#¼ÏÓèm#A0uœ˜V0T˜Æ§¸ .Û™o‡v+r !ˆµ¬ezÞ ùŠ%mqÝ[åê÷~&ç3¤f‰ÀïáãÒ\eZ…ˆî! „Á˜Ï½nH7ÎІ;‚ ¢: +úüÉlî]ÝÿêÛï\Ü=†Ï^?Ȳ+pµ6A¡H©2ÿ /á™rîFô«GYOœÕäyâÏצ|~Lñ—ôe3úà¥^j†Ã»ÔãD—f•Ã_Õ}Wo“ó9R!ŸLöýHªi":Œ4’‡mr”,W„¥ö'‚ ª£ Ï¿<žŠº~mçIÑ¿=}À>5™Íù÷ 2ŸÏÇãñññ1 ƒ¶ÓÛ®Œ¢h8AЙ; +Ãpmmmk ûnÙuÝ•ÇÀ7ð‘Š* ; VßÃ÷ýê®E³2 tnRæhå?ðgÊ—Ö'NŽ+’Ïצ|þB¦Îgg©Òl{„¿ø/[ A´iV¹úÈ—zé'ç3¤ .äƒ`꺷¤1ÄR¬&AhŽÊΔe£Ò• 8‡Ÿ ‚¨Ž‚>ÿöô¨ë¯Ý9AìÊ¥½{ì#bJƒloo¯?æää¤íýÈåÆp8Ì}²hHÇQ¹®iš5H•^ueŽ~ ü7\HªÌ謓ù²@«Ô ÿH¾Å„ñ£ýJ8}úô/~ñ‹ÔàfùUØí†¡2ìÕ‰¢Z@Û"–e‰ ã” (Ú*«ÂâÌÎA* Åg%ôlòöÿèÏ^@ž2üøëËyÔ(ù|mW¹F|¾ôm]]ú~„eW:¯"‰ÞbYÅsÂ¥©þ=‰ˆ­®îáišëp,¥ñsì• ˆ«‡Ê¤€'µb*2&µÀä<—ÇÓÉlŽ–ó[8ÿÒÞ=1¥¿A677™nê@^wé>ß0 i9Aˆž­AŸß¥®TÇ÷ý¤o/Ýç*ùÿ¢z-âó766>ùÉOB!®ë&ÿE\Ȳ,ø†ý& CøQ1è Ül–ɱm›×Aä”2©!3ŸÏà +©ÐèÊ"³’ ï$_Z{[Åç¿~9ÌqQòùÕ1Ì õ¦|þâQÌz÷‡*^Å$PÑééÿ–µ!-Dê±ûã¢óéúÒó“ ¢EÁTÅÀÃiÒ¢Td>M(‚ ¢Šûü £CæOàøñìõıÀ 7î‹)ý Þûáááöööîînú±tŸø¾—㺮&>¿K]©3Û±äüE5>?U­‹ÄÔkŸ]ÉRôSãìB±‘É2öU‚R X`Âó<î¡Y˜ZäF=Y‚øÙ$±HA²aù„ÂSKˆ)}‡èÁÁÌʽ½½¥Úß¶mÇq`xÃ7I™ÿOþ¶ŠÌ‡ãÆFžÕ€|~uœ*FS>_ªáõÎÁ­¾ëÞ YYÙ¢BtÛåi…ál8¼ëûÌ2JÎçHã#9Ó\§-BD·Qñð–µOE™/-‡ ‚ ŠSÜçÇòí×vŽÇróèþâý)ýÔ¥P…ÏO͉ÉÉ}~ogn2/½ +Ÿ/Í~‡¡R–Ï L–Ã*–z*#‡‡HØ-gèy2æ¥68 CÑTÃËNd±±hNgÖ±Øä|ô?¯"óÿûÚF¾ +Ï¯Ž–ú|xWysG¬¾JN`òЉÞƒ\:‰ß÷#¥M8` Êú¸¢Ì‡ÕŒëAD ÷ù±|ûkwNÍriïÞBHé?¿5¡.(…r}>ó†a …A žL>¿NÂ0dmîy^ìOåú|Þ¹xö;Óàüäâ>Ÿ._Í®EQÁ‹ò¨„eYxilG@ªW´Á<ëAʼn\|ÝÖÞé¬ R¥îç^zUÅçÿõ•wòÕ|~u¬‰>WýèQ÷fLHÆ>nYø§VW÷ôê*‚¨jØ+=«¼‡ÉùŒ(šã–ÊÌ'™Obm‘ÎetÔ<ª Èíýa|àô¯«È|8®Žþ%_Èç·…:}¾J‚}LŽÁ[?û¬ç¥'So=¡DM;\þûŠŠ4ô…ãì´ÎäÍçsšM¥ó½ï}ïàà€¢¬+ŠÓd>AQ'¥øüó[fQÖvŽàdz×Ór2(:ÿÍ íG+r}~EìÇq² +aÂͲ,nÀ’R%îè8†aÀ™mqŒ‚÷N¹>Nzu1¸€\Ú󼤤…3³F,œ i¸T’í Àe~†©ù½1x| +ó"r!ß÷EÕÉ€–WÙéÐì¨f½‰$çøŸQôù{?#Ÿßqêôù/·•#åÕóÆRi0Þ¥Þ$úƒb‚ëRLÏÞ¶gŽ¥ Ûñ˜cë¸zõêÑÑM%¢*azÑÌÃ7*!’ùADÍ”âó/íÝcåìõG‘ýµ#Ä´0Ï? )×çÃ÷,íÙ0ŒÔ‚ àÉÉY>Ÿ ÏTLÓ¤\ý|ð†M5´¥û|îÕ³²Ö™†eZ;µ´(в -¢ãx +zR°û¾Ï. +’Ž"$Þ$ÂkˆìIQAÑóËÅZUq"óÐIìBÉðY,z¢ÿ¨fõL­ÿÓÏ“=5V°Q +*±E˜20_HæAÚRŠÏ¿ytŸ»øqs2CdËÅÝc8¾Š!¢ ¥û|®×Rõ&OfÃ0Õ—Âï™q…¯pòð=àž¤mYu\X¨…5~ò¯¥û|îÕSÓàaxˆÁ…ÔÒøhßÃil$À7¢|Nfl¨Ä‚J¬4(J1¤èó˲¸*åˆ ’o"óé)–ÀûÚÚø%\ާ¾ã{„8à›ä>Æç^zUÅçÿý›Û¹«A>¿-ÔìóäûÛÅAä`8¼KÉù%²ºº'Ý+亷ÂvCÄûpœ•†d>A¡-¥ø|àÜè«o¿s~kߟÌ"²… |ÑùOfM¿ÒÞòo:‹‹+Z?q·‡YwÀå†ã8«2¸.C|>ONfG/Þ­LȧúRn,“ZRÌÖ.˜ ­ÔîƸÎÔP¥=XÓemàÝ}$ ܨ#>ñžk…“—ã%@·.Ò|>H©+ ÷Ò©Á¹àIìlcHê˜Ìîz¹Ï­àHcjƒ‹ñ,Öh©sñùð'îç=Ïã¿gÝJ íÆ?’ükãðý>l£GÖþ‚â3ð¼øÒÚÁ^ŽGÌ7îX(Èç·ƒú}þãáq^íËòƒÁ>õ#ÑOT4%ç«cÛ£TÁíLŽ‘ JÙ.D2Ÿ ‚hв|> jy¦÷³v&ÿñæÑÿgßÜ£âªÎþŸ?»Þµº^úÇûG»Ö»Þù½ï]ËÚMâ-ÈÜu !$$“û ¹z‰bÔÞMÆK¶VÆKÒX'*jm©£F£fLˆ¤Da A,r ad~ÏœÍl7ç²çÀœ3ÃÀ÷³ž•3‡3ûìËs2Ÿýœ+©ì‚3%‘ÃcÒ&jý†!Ê ëH|~$fSõÞ˜Ë7æ }©æTx!q²ê*#Ôt y—ðÎ7[°¢´ŽÜçÓ@k¼:‡Ybš*ìWýÙâêt¾¹#ÉNÜZÓ+ô‰•F˜iêAùüÄӠŧ«Ðwf$ÞÆœ×ëåÝÅvÄ«–_‚d‹-åð]!êñ© =Þ….Ïd¿äæRrì˾6,àóÓ…”øüØ$±Á꣨ŒfB¡+%¯Ø³NII3“Ô±nwm   Oˆ‹¢„ÏEXnR…>_äxÓ%‰r9ÙÝÅ®hìdåúÝá¾”]’N2Ÿâ¨qý°>Ÿ×Nkªè¹ …B‘x>?ɦŌŒtòùrÈ{›+t³lôù4Ðý6Õëãû24UØ+Ÿïr¹Ø„±ßGà³H2ÏÍ4õðôùfM²¾õ;q»bxŸà`»ò«>–9gQäæò豄j5áóÓ…úüØTIÈê‡B=D0š))iZ,­;·»–þ‹8Á`v¤)ùü‹]½åRVÛ>®½µµµá£§ÓÌç6¶L\nø|¾Êxð_¹ÏçžÍãñˆ‡¹\.z‘NÂ~5ô¥|/€I­2¬F¶q(«ªªêêêÂá°þÝô’ùˬ™ÂâÃAÝw&pa.÷ù‘X= ½x·¯¼JÜðllÂðêë@  ˜WP‹C©×ì4‹Ì®e¸Õ盵“š!ÖØkZeÑç»Ýnýæˆ(ÃéZƒƒÝ@IæªÔw>ë ÉUS¿Èž·³SrsÙ±ÿr"m†ÏORîócf(V¿¤¤ #€DéÓ²¢ðz/Ð1ô_Zh°÷‡ðû[ ó¤#ù|ÂwºÅL¹Ð[ÃáÚ«‰OßaõùVJsÍÖø|Âív3 Ë_ ƒ|〽bæK Kmé#œpû4’U*úwÓ«>_èlÙ‚ëó­¬h³ƒõ>Ÿ›qìhbhž0<ý ;RÄårº}q(‡ Ù³upyNŸ¨—]A³a1,Ú`ÞŸÔ3bXÙ˜3;'GÜ)àçO•Û—¯J±ÙlzÐ|з_äÁ¯Ð»»¼Uâó7nUi3|~º0L|~lÚ Âê»\UŠÆ‰Þ|{|¾æ’’&ú—Öú|<žzÈ|i‡s>¿¬¶]b]:®¤üÚªªªš+6¥“Ï¿0¼‡|>/³ú?×ëõ²W¸”Ô?Ó[lGÀPìÛhõÙP==\~:ù|j­•›dŸÏ7Mö +M öŠ_h±ÙG+ŠBçä…úá,^K]]cuu5 å|þ˜AÂ/p°—®ˆo +6 æ‹k° Ù3+îñx$OFØŽ8”q;“²Ÿcf(óL¹ñÉm¥èˆò”ïX"m†ÏO†•ÏMž»\Uq Œ%0ÜÈ̬†Ì^8çóÏ|Ý-/Ãáò;;;£®ébeäLIµÓ‡|¾¢(ܲW˜’ÍÌÌäÇH|>?I  wEÃD®5ÃýCi](µnøGÜÑK•ÏÄü3¯`çÏ_ˆŠ8îGƒAŸÏG«qû|›@Êdú|>9E».og Ùçeâ>ŸA+Ëï÷S¯jܾ¸r&ËW¥¾WhˆÛíV^vO(è’ÜV¦¯oU^žH›áóÓ…aèóô_bõÝîZŒ0ÜP”pFƧùÒç|~[OX"^JÏ)è|qÈç¬À>###¢ÊXv€ÏçãÄõù"Š¢ˆõâÅV žO•Ïçͬ )Á,«ø‡ƒJ&tQáêKLJàó%×(ŸŸüê,~ðD3‡‡‰Ï …Btul¼¬oX$ÃÇ7DgëYôTáÙc_ TDNxi|~º0l}>ÃÐêgfV+Jc C‚Á.È|púº]¢’ îðz½Ù*ÌMZœóùDé9Eâ^ºÃ}˜ÏváœÏ÷ûý\rû*ÖÕúR¶Héo @îܬÙðÞÖˆtý¶û|>j4 xuºfˆõgãÛìY ^篟º|î%âë,ú|~uVßØÒ¬…È`|>ßÕûpÈ>Ÿš!¿3ÚÒ™ÎÁg”!*ÔU’Jɱï¬}‘Z¿-ë >˜S°8ÿÿþÇ5äøàĉ$4’¾õ»ÝµÙÙçé_`˜C7k‰Ì÷xêÑE†5*cHÎãDdZ÷§fµ¢±S¢_Î|ÝùlÎù|EQØ‹‡Ðfffj–›~I²#YU¿!ðùC#îVˆs>?SÐ4¸\ÂkŠêõgãY|¦ÃÊg‰o™ý­¬??Â/Šæ­dŸ—.™«xúÉ×ón¡Ïû0Ÿoq£gxú|±ÜZË'ÿ;î°ä†Rx ½rï5‘ÎP"Í€ÏOÒÂç ½ðxê!óÀ!¬ø|+ßÇáó5ýé„Y­ië‘è—òúÌg»pÎçn·›‰GC¹jè ¹54±ôbâžvÔÂÂl¯ÄQŸÏ޵A¯ŽõgãžÙåriäDuã’­6ñˆDž¢²î±ycX{ Ÿ.¡³‰Çè¯(î݇®…¯}«¹1ñ†v—-éâß?og©ä†2v~säõÌ[ŸŸ.ÀçÀ ôJßë½€n€ÄÏw¨?ª”–èßi<~nŽú|^KÌ…B⻆¾TttZ:{d†~àŸb¨CA\¸˜Õ „f8œðùïª7Þ†gëÞ½^/~Š~æ›D†ù<îSVT]z0äMbM½]¢B­åeù’þ1ƒAó¨K$±“¸N©ÏëgŸÏÇUÿð|"FÜà0“ùDÑ‘JÉ eåüÒÈ'Þ[ŸŸ.ÀçÀ!*+ÿ]RÒÄ"êA‡€-Àç;ÔŸyž²Úv‰¹ØÕ‹)m Žú|EQ$ÒÌ—jv4˜éPÞ±fäÎù|BtÚfÕéš³Ñaâ_éñx<ú¶ñ½Ãw­3(ŸÏ>—/‰‡7›½Öe¾×ëMp!ë‘‹qjö0ÜA£&‰{(¾óÝÿœºp)ýð½ü·äV²»¼u磕ý½!Á{ +|~ºPýÙgœ81ähooG@Ò€Ïw¨?íòùÝá¾ÃçÛ~qê_Ç›.ѯ'›»$†Çëõf«X‘äfó×%¢wÈt³·hqéÕhFF†Çã1¬-VàþÓívëßåÃa¨‹-Ì£0œNü-3møµ™R^ÛfffîJD„m‹@ HwIæ§úPþ„½(?Ov#ÙøûÞþ»äØt§XûÄѱóó%·t÷I¤1ðù€íÀç;ÔŸvùü†Ž+\­Ð¯»zs/ ]¨Œš|[àeØÃÓÐJ…B|2ÈÏJú].WjL36§.õ-ïça¾w¦ß}àL(XÏo…ž‘ÜJJŽ}É~(«M¨î>°ø|‡úÓ.ŸßÖ接¦­‡^9x¶UâaºÃ}tÌ™¯»égßé–†Ž+I»öp8ÜÒÒÒÙÙ‰e•îÐP677ž¡ …BlÙú|¾9”ï¾û.»ÀAÕƒ´[•¢?×ÃþÚ'ŽZ‘ù'›»i3|>`;ðùõ§]>?"üŠÆ¨É)¯ï¨æüŸoc¿ÒÁI»öººº*•îîn¬¬´f¥×ëåë å-·ÜboRÃdUúý~š´4²ìé þ¤‰žï|÷?ùmBîóÅhë 'Òføütáþ}÷,ÎrTöú’|¾Cýi£:ã¿ôœB¿Ö´õHô øì׃g[“ví555L7¡D?Ý…C©(JFFÆÈ«`¯®®~óÍ7‘œGÆPjV%Ÿ´ìÑþ˜‰!cçç[ôù¼>?ñÛGÊ}>uõ ÝŽyG™!ù/Ðh `qþÿýkÈñÁ‰X¡4àóêO}þ™¯»¹ié÷QHT 30 Wø+»z“sííííuuuXVéÎèÊ@ 0òJôi(,X@×åõz1±ÓšÖÖVZ•MMMü~»!‚Á ø«ž…ûaw„¢#•»ËOY)ÎgO„%Bj}>õ -ç1րχÏ€t>ß¡þ´Ñç‹¿¦­‡^)=§H$L[O˜Žá¿žlîÂ<À +,¤}V³‘‘¡( +Æw$!ç³Û¼½äØìŽp×s/[)Îç·›DH¡Ïû>?.ðùFÀç;ÔŸ6úüˆ ðËë;è×ãM—$B† ü²Úvöëáóm˜çXAQÊ`Á`pÄ\Q(¢+¢1¸# ±Ÿ†Øï÷KdõUÙ³ù ¢ìØ3}~âL¡Ï÷z½ìs].u–€ÑçÓÏù|ƒŠ .  iÀç;ÔŸöúüŠÆN&Xžm¥_/võJ„LYm;s²¹‹¿ÒîÃT€ƒ¦8Ÿß‚ Y¸ï‘þ;ȇ§J߯”Ü>v—‡ÄûH‚¤Ðç»\.&óñdŠDŸÿχ€á |¾Cýi¯Ï¯iëá¾¥­'L¯øN·Hœ @‡ñ_éÏ1Õ`d )΃c¤ì.?Åîw=sÚŠÌçÏy%H +}>ûP¿ß? +§G(òx<™™™Ôô¿‘¸'Àç@ŸïPÚëó»Ã}\³4t\¡WÊë;$Z† üƒg[Ù¯t0¦:ŒB¡¦8ßãñHd>Ão ÷Énwªã;Ålã8ARîóGáHü~?Ÿø|Iˆþ¹Äþ•°Äöl;|¾C>Ÿ(«m5Ë™¯»%Z¦¢±“Ž¡Ù¯϶bªÀÀív‹ÅùŠ¢èý­ˆßïg÷‚]‡ë ´Kno~úÕÅ®ÞãM—ìz¤+…>ŸÕQ57B¡ïpÇS©âõzãþa‚>ÿÅ^ ¿B ,>8ñCk}‹@ #/ðí04D]o ðùùüîp_CÇ^3I?H´ ø5m=üLõQ-F¶Ýæ÷ûEA‡€Ä¡‰T#nÑïÈ# ú|>ZSôoJ.Ÿ +ÛH¼›xFFFÿ_žð¸Ç$w’c-Á`»í)(U>Ÿ’ž7âaRÊÃIÐ狎@ ò=èÐGß"ÄÈ‹Ñö} +`ðùõg4Bé9E"g.võòcè_LõAáõz³U‚Áàæ¯>k†Äãñð?ñûýCn¿¢(™™™­7Êצ€fñÒ˜²á°âÇ̦¡äÃÊl\hÂð?¬šs‚P(DÍàÏa‰óŠ•Ç]f¸Ýn‰»Î ú[ævÜŠn.K9¾¤WÔpŸO=¯¨È‹óé–ÔŸžr]•Ý#¹eøÊöM¿ú|‚åÀá°|’Ÿ ƒÝÀ…ÏG àóŸH#àóêÏ$øüãM—$ræds;Œ‰}0(˜Ù³8ŸÍæ¯.Wü;u(2qC€‰GŸÏǬ5,33“ @ ®Ô9ÌW‹ãÈ…¤•mv°&ÍZ©ëÍyÊkŒ­Ü&hÊÎ.qÈ1ô®ÖïPôA No6|Ôó†çaõÞt™løè_·Û’[^ à[ôƒ¼[ú'Û…€½gá¾É-cìüË••—ímjj}>ßÖdÛ£•RFÀÃ&üBW=Ø¿…ÏG àóŸ£–dúü‹]½9sø|[’¯½µµµººº®®.§û8Úî󉸥þ>ŸÏ.ŸÏÄ£ø ++ëµXó?’†Ò:LjV®>?nQ7¯ÁN<™ÐPVUU%2”š¢tjLI ·Û-‡gffêM¸uŸ¯Ÿ´‘Aî86` ßpéÑ[ú]9öxBÒ¬f(5;€²þ<áq ì.o•Ü2¾ó]꼑ãóÙƒ!ò‡ìʷÄA%+ 6úüŽýÑfŒ¿zÆøçŒÿIÎøŸª‘™3þš™ã¯9~ìÌñã¢1nü¬h\§Æõ³ÆÝ0{ܳÇޤƄÙc'RÌ;iÎØÉs®¥Èšsmöœk§ÌÆÔ¹×PL›{ÍtŠyј¡FN42gª1k~4fÏÏœ£ÆÜhü”bÞÍ?‹›Õ¸E 7Å-?¡¸U±ÈÃ…Ñø1‹E±Èb1[£‘¯‹%ѸÚ, +îqËÀ¸™Ç æˆ%óÆÜ1g`̳ÆÌ‘30f1Ý ò£ñ“hLSÆ”‘=0²„˜¬‹Ic¢úc1‹›DÞM?e±hB,T#W (&RdÞªÆsO>æÐ2ÏɺvF,¦ŒiÙј‹)Ñ›‹,Š)ј‹I±˜¨ÆŠ©ã(nŠÅ±¸AëYLw],ÆGc¼ã(¦‹kcqM,2cñS5~‹ÇâêéÑBñ#5®šq ö+{ëêœh†añ!Õ°l™ÑœÃÒε±ä3VHAãfõg!<]KJ7Ì{c,nÏQ,MMRÓOVY±”•=·?k©‰ëÛÜÕŸ¾bLŸÇ4©Œe³Ù&9MŸÖÌ2Û­²ÌfœÓX*Ò—Qš²š…ÔD4Ø\do:Òd¤¸IÉÆ¼d˜$©IŸÌ”>G¦©Üþ4õm¦¢pÇâ–XÜL1©?æÇb^\37s(&÷ÇìXÌŠÅÌXäPdQ\+É]†é‹g0yÓç1ÃT¦Ïf† í:]BëÏi&iM’Ùâæ·«&fÂçÀp#™>Ÿðn‘ø™îp_2¯½ºººJ¥³³3ÝÇÑ ŸoX~,ÂJI÷KÌêÍëÖÏ9’†Ò"\jÑ Ÿ·zVStH2Ip(Å–¸ÝnÃfñêô“\¾”E¡‰*®ÍaüäfS7 Š HÐÊòÔ_©ÙÕ%íé ýPj¶ZL‹ó‰2¾ÿCÙþoÑ%óªÛÛœBŸ?¨$ø|}þ5[æM{sÏÌ¿ì™ó×Ýó+vßZ±sáßv.~kgAåŽÂ··{ޝ9V¼þïÆw¼[ßÝæ}·hû{E»ßÛzÛû[ï<±åî6ßóÁæû>Üüó7ýêäÆß|´ñÀGúxÃ#Ÿl8øÉúÇO­{âÔÚ'ƒkŸútí3Ÿ®=tz͑ӫŸ;½ú…3«ÊªV=»ê•³+_=»òõ³ž?æùKõŠŠs+Þ:·¢òÜòwÎ-?þ÷Â÷j +OÔ,ûðü²Î/ûøü²Sç—~úùÒÓŸ/­ú¢àìÕµKÎÕ.©©]r¾vÉuKjëòëBùõ¡ü†úÅê7Ö/þ²>¯©>ïŸõyÍ ÑøWC^Ë?Q|ýEÊŠ…mþ[Ž ¹r/5F£«1·[Ë_F£çËÜ+ÑXÐÛÔa5¾Q£/·j"b_Þi¼5ráÖ>Š,èkXÐW¯FhA_Ý‚¾Z5¾XÐ÷ù‚¾ó¹}5¹}Ïí;§Fuî7Ÿå~sVªÜoNÇâÓÜo‚¹ßœÊ ’þ87üQ,N.  Æ‰…½ï/ì}Owö_ØûŽÇõ¾½¨·R·õþmQo…]Ôû—E½o.ºòfÞ•?ç]y#ïÊëj¼–w¥<ïÊ«Ñèy9¯çh,y=/åõ”åõ¼˜×óBÞåçcñÜâËGÔøãâˇ_>¤Æ³‹/?³øòÓj<•ÙŸ¹4ÝOæwÿ!¿û 5~Ÿßý»üîÇ—Dã±%]Æâ·KºYÒõ𒮇–t=¸¤Ë·ä‹K.=Ðüû‚öýÊþ‚ÖK[,ý—oéW¾e;eÿô-kò-k|pÙ…—ýã¡Âú‡ +CÖ>\øÅÃË?xùù‡—·|ph™}ríK¥kËJ×¾PºîùÒuò¯;â_ÿGÿúCO­ö© Ï<½áé§7øŸÞPúô†?<½á‰g6üþ™?»ñ±g7<´é·‡6=rhÓÇ6?xx³ïðæ‡7?ðÇÍ¿ùãæ_ÙüË#[~qdËÏl¹ï¹­ûžÛzÏŸŠJþTt×óE{Ÿ/ºãù¢ÛŸ/ºí…m{^ضëÅm;_ܶýEoq™×[æ-*+ÞZV¼ù¥âM/o|©xC xÝÑâµG·¯>º}ÕÑí+îXñòŽå/ï(|eçÒWv¼²sÉ«;¿º3ïÕ‹^Ý™[¾kAù.÷k»nym÷ͯïžÿúï™óúžY¯ï™ùÆžœ7öLÿóžiÞ3åÍÛXPb™þæžœ¿DÓˬ¿F3̼Šh’¹¹b—»b¥š‹f›¼·¢‘_¹cI厥•;–Un_þööoo_ùvñªcÅ«¯}‡RPñ5 m>¾mËñmEïnÛönQñ{Ñt´ã½¢ïíyoëž÷·ÞþþÖ;NlÙ{bË]'6³ìt/%¨6ßÿá&ÊQ¿8MS¿þhãmØÿÑJV¾7W3[ˆe¶Ëlߦµ¯(­©9­õ‹(›µ«ÙŒ¥².5ƒQîb)«O’…bYÈZ"êã‰È,iÒÑÉÜð‡æé¨?#©éh°éµþŒMJ¯y‰'%5/]æyéO&y闞ΗšòYjú6;ýv`ve§ýÆ JÙ¿ôk£%¤©eõj¦ª‹fªå_¨iŠâï¬8§Æg¿]qö·+ª]qZࣞSz>yÔóÑAŠ•>¶òƒÇVžxlÕ{GãÝÇW½£ÆÛ¿[Uù»UoýnuÅï£ñ—'V¿ùÄš??±æu5^ûÃÚWÕxùɵ”¸OFWYéºþÜUÍ]ÑôõÔ€ôõ”š¾¢ì™o3X4‰Úô¨Ä:ÔŸÄöÿ±?ýú¥²þ<ö³#[îWSÙ½ÑT¶•RÙݱlv§šÐn{¾ˆ²Ùn]BÛf”ÓÖGÓÚv1­y^îÏl˄̖¯f6Š…±ävëkÑüvókÑä6/–ßf«ùbÒC«àó`¸‘dŸ_^ß!Q45m=ɼö††¦›zz’ú¹N`¯Ïg¢^_Ü+Â}2·úCöKŠ¢PK4…ÊLõX¬ÏIC9¨×›v{}>\C1Ρ©"œH2©««£q¬®®ÂPŠ2V>sè]3!oq)ñÃ4åîq}>ƒ?Û’‘‘‘àL`Ý®ïsj¿fÔh‰%³>_3”VŠóy*»§¯¿$¹YL(èº'wS¤5ho›S^Ÿo‹¹qx"yŒÅbö€Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï€QK’}~M[DÑ”×w$ùò;;;G†¶×çsÙ ÍNÂá?ØX/J ËPÑHþÑ0”ûÇÌZÛëóÅQ6; MÍÁ &“!%ŸÀq-‰µâ¿mq)y×Å]4½ã®2+ð½ yƒC¡3ÿVR„-„Ãaq(­ç³Rϸ³*‹Ž(’›Å÷Øüùÿ‹ô(ö¶9…>TŸŸŸŸŸŸŸŸŸŸ`È$Ùçw‡û$ŠÆwº#24ìõù¼’VâEy ?7`z©(Šßï§ÓruIÇ»ÝnI#飙÷£?IÐsŽ`¨Yé÷;ìõùt¯½7; MÍ´1ühMY^ÃÏ£²²eS©"Ÿ|[Áâ6?^óŠÅ¥·ëâú|³쪡ã 7&Ĩ1ìl©*ê¶RœÏ·HˆïýàkÉbwy«ë¿>ŒTØÏ…>?ú4D `ø½Îg©ÐÙø ¥…ÊÓ>|>|>|>|>|>|>|>|>|>|>`dC_ékc‰ +}?¥/’èN’}>qø|›DÔ\ìêÅ  {}~DÐõ†g…¿™Ï§uÇT°!n·[#]éWf†322,jÞÑ ÷·Ô‡úwm÷ù¢®7<‰(üÍ>šŸD ·™NäX¹"Þf3­mxùŒ!,%®"5{^ úüÁ®Ûß!ôïR;™É§nIá½ÏJq>ï1c~0vþç’ÛļÞYû"ç|¶·sú|6“iÖi&îC$îRZoá¿ðùðùðùðùðùðùðùðùðùðù€4…Õ1z½^ú2hXvÈ‹KõtÃê3’ïóO6wIDÍñ¦K”!`»ÏçºÒ°ZR|×ÐçÓÚäK/33³$† ìxW®1aòãÂ=›ÏÈbÙîóy»áÇiÞ5<Ÿ-4èl&Ð|†Ä}ÃÊñ©• r´²”èöÁ‹ç5·‹>Ÿoʈ~°«FßÃâ}ÎÆþÐív§ö~g¥8_<Æã).<ð‰ä6qUvO ø¦HkÐö¦ŽBŸÏ&‰f^‰3œ¦"Ÿ~loÃçÃçÃçÃçÃçÃçÃçÃçÃçÃçF ¼ìÐLžV—‰E¡ëÙ$ßç·õ„%¢¦ôœ’üNèS”ÞÊÊá}æ"…ûZ•ñ`µ÷rŸ/Vàë?N¬Þ7ôù\0ê%0­;¾rù¤:º$»Ã} W†P;ã^ /Æ6Î|8¨KãÎ>LŸX¯AS½ox66ÜúàˆP¶mø¬ÇJŽÒOª¡!_J@€.™–~Ù¢Ïç.öê`W~ÐE+ˆÆp§;ÉX)Ρy"¹G”kÉø†ÈQG¾J$ÍçÓ Òœ·/i¤Jƒ•­[+î‚ñáàS‘ïÜÙ8£àóáóáóáóáóáóáóáóáóáó£ +½ÐȱºL¢ôQ œ|ŸO<Û*Ñ5m=ádö@8T22ZÇŒþAí ›¸J±‚×:Ÿ(í5‹KTý†>_s* |¯ý 3Evé)=»z}§[$Snøµ“Z+¿^Âmø®($­#÷ùi¯o —Òú³Në—cvZ³c×°Ö—’¡Øä]G7)Ã=:@|jLô¨ƒZ5†—/®VºÁÉ÷’ƒ•â|ºSkÿwÜ„ïÿðjúµ¦­G²F +´çו}üNÜ•2’æóùÿO¸0l·kpõ÷6ú-<öÿ.Ã'Dìmø|ø|ø|ø|ø|ø|ø|ø|ø|ø|Àˆ‡1Šf^£VDáOßI¹3aEq¶#N_’ãó/võ>ßVVÛÎ\}Ec§Dלùº;™=.2ŸÅ¿M†É ŸÏš¦XóºÜçZzEQ˜Ûd~X¿¢í]¡¥ç”´ù,žm•_ŽÜ7:áóyi®¦n\ÿºÄç›e: › q/y¸ù|ºïè éy×YA£Fµjä—χ&îXÛˆ_Eó¢•â|êÆy;ïgóÿd}sy}‡Ôçeq¥ äû|þTª|>k‰8p|kF“½nãüχχχχχχχχχÏŒxå÷!z¹AÇð\.—¾Ÿ]E‰~r|þáómÌÀT4vÒ¯òò˲Úö¤]~8L#™ÏÂðB¸ ¢Q^,÷ùš:|ަnßÐç‹V“þC_·¯?›˜±éÏý~ÿRnJ|¾ÙRr»Ýâ=H³:¬û|½Ôª1k6û+³A7|¬ÀÆ[‰x]’mqG#:W}Á&ÿñ¦Kò§i¶>þñðù4 +4‹hEðµC¯” »hbÔ¶0iÈØô¦ ‡>>>>ß:ðùðùðùðùðùðùÀ ï¼üë¶™—qáJÓ!¹‘.$ÇçózËÒs +{E¢k|§[Ø1¬ŒÿàÙÖîpŸC û&J/™¯è C^Ùkñ`ÏèÔ}ÄHòú|EQØßŠÅÌt~:fP–ÒÒÎçK&|\6(Efv°ÞçëÕ}ÄHòžMLÚ\ì{<C·oh5%;¼…ܱ'¸Ekq)‰î]ì1£š™XºC62‘U3¨ `;¢·w»ÝúVIŠó©7®ÊžÍ'ÿÉæ.ÉÒ¸û•O~xJܶ—¤ùüá¿d6Ùø:Òï71ó¯y¨Ä–†Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡ÏŒlÄâI³c¸zÊ0‘Ÿ„Ïç‹{žÑ@r|¾XßÖ¦WÊjÛ%Ò†Žöds—­ +‡Ã---_]}ùüK‹õëÂ^ŸÏ— ׉úW }~D•“ôŠXÉ,ZJzËÆGcØPvvû=¶1”.!>%U>Ÿ [_Lé_‰˜ÒÓyÌÔ.½.ÎøجÊ}B›ïˆBÞúyøÓ †O¦èu¨†¼jRèó©I|\Ì ú}Ãâ|·Û]xà^r/_­÷=úWþsCÇÛ¯eú|q&‹;núQfÓÒÆø|ø|ø|ø|ø|ø|ø|ø|ø|ø|À(Á°$R/q 5$òEr$‘ŸßîãæÌ×Ýô +ý+‘6¬ðòðù6+†sÈÔÕÕUUU}öþûJA’‘1ÌM~›ËÕenòùúj|}ž™Ïçús½§¥SÙ¥ôÙPÝÝ݆oºtðlë07ù¾Ó-4óåO£¤ÊçGtÕø†ûò¦#}>¥eQÿjž“š4iÒÐ|>oϲÜã'ç¡õ¥Ä¯7AŸ?äU“BŸ/Ú`~Õ\ÿÊ‹óéÈüÂåâÖ­|î|ºV󗽤ÐçƒAútÉl… ËífÛFl¶Ó»6îÃÂçÃçÃçÃçÃçÃçÃçÃçÃçÃçF¼"TRx,\ìŒÂ2<=Éñùœoë K¤ÍÁ³­tÌÉæ.þŠMª©©aج®;pÈçG +|½ÞXðù"@ÀãñpÑ缇ñC)'…>_#ð5zŸaý£™Ûç{¯<¥¿ôÒK¥*o¼ñFe ®²+upÿÉíº¸Ù$WkŽ·¾” {Ï.Ÿ?ØU“*ŸÏ»]Ó|¶È‹ó#÷vÅ'¹ôQt¤~ÿ‰²ŸËë;]_ÉÿA+Ó†­'˜EE±wvÁçÃçÃçÃçÃçÃçÃçÃçÃçÃçFV¾ý‰ßǃÁ älðù‘$ú|.çy]eé9E¢nÚz»zù¯ WloR{{{]]]ccãGç|¾Ïçã«IüY¿âD¿Ä\«Ù´ý阑4”q‘[kç|>ßN¥i þ¬o›x¶P(Ä&ƒYY¯f6²¡ljj’ŸÖn¼yµ¿•U ñ¢Ö—_âƒ`‰øüDV ß±±|:.4¸¼Ïé¾·"Þ… ˼ù ôã`EÍYÉMaÿß.hžó²´ðùìÈðh!|>|>|>|>|>|>|>|>|>|>`4`åÛ×)q¿ÃçG’èóõr¾¢±S¢nN6wÑ1϶²_7]Âü—àœÏkòÅZ}ýªM³|’Jéä̺ 7¨†ï:çó#BM¾¦V_2¬\z›9v³ÏÂlá§¢.’oæòV‰byPK‰þŠõ†æÒñù‰¬šäßΨø&ø[âë†ðm ñA­3åù¥ïWJn +÷má?w‡ûœ¸¨4ªÏ‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï¤V¾ýq#ÿ†È-%|~ÒÌ*—ó‘†_eµítLy}Géæ9ó_‚s>?ÓGÜ^z½^ÃU)š(·Û-iÿÍ©À ÆZãÒ5}ë„Ï矋}Í õgã•üfíá—#),·xE¢aÎÈÈ0[ ➯Og­,%z‹F¿'âó‡¼jøí,™Ž—·Vó„ß+1Cœ6ü¹-Šæ²«%w„ÝåMOžúJ¼;8Á0÷ù4ÃùûÜèä4vÔ ùŽ¡½-™·~¿ŸÞÕÏy}þU3®»eÞø­ó®ß:÷†­so*š3±hΤms²¶ÍÎöΞâ=Ý;k†wVŽw֬♳‹gÎÝž3_[väܺ#gÁŽœ…;)fäíš±x׌%»¦ìž¾t÷ôe»§î™¶bÏ4Ïž©«ÔX½gêÚÛ¦¬»mÊúÛ¦l¸}ÊÆÛ§lº={óÙ[îÈÞzGÖ6Š;³¼wfß™µýά{³vîÍÚµ7k÷Þ¬=wM¦¸í®É·ß5ùŽ»&Ýy÷¤½wOºëîIwGc"EÉÝïQc_ÉÄ{K&ÞW2ñþ’ ?cqÏ„Ÿ«ñ‹{nú¥¿Ú_«ñ›hܸŽ߯þXˆ…/ˆ¼/Å{c±O{nŒF‰wRÜ¥Æ^5îŒÅjÜ®Æmjì»ÕØ‹7EcÇM>ŠíjÇÂ+ĶX©±U-Ñ8°yBlRc£b±^uj¬Æ~Š5j¬¦˜UB¬TËj,W£Pe±XÚP¨±$ùj,ž¼X,ŠÆoÔøuÞ¤_åMúeÞdŠ_äMþùâÉ?‹Åý‹³îËϺ7?kŸ÷äg•,ɺ[·^ô;´Ì7.ŸF±aù´õ+¢±nÅ´µ+¦¯Y1}µ'«ÔX©†gåô+g,_9£Pe«f,휂U9KVåä¯ÊY¬FÞªœE«r®îÜÕ9 (Öäܺ&ǽ&ç–53o¦X;s¾óÔ˜»vÖœu³f¯›5K™ëf嬧˜M1cýìéfOÛ0{ªS6ÌÎÞ0;kã“7Ι¤ÆÄs&lœ{ÓÆ¹7nœ{æþ¸>ó®Û4oüæyã6ϫƵ[æ]³%úïX5Æm¦—ëb&Eso,ЦŠ ”p¶EÎd5çDÃÛŸy¦ª1Í;‹¥ –…rŠgÎ,žÉrÑœh:Šf¤y±¤DqóŽhjrDzӂ9¹j‚¢XD±«?SåïšÎ’ËWjÊšN)‹byâš¶rÏÔ•BúZË`ýIì¶hS#[HeÙEwd© Í{gˆ9Í0­‰™MLn,³í˜ÙÄ´&æ4–Íx*ÛK\ÑLeœ…,'¢½‘<iÒËEšt´Ý(y¦#ž‘Ô¤t`ËÀŒ¤IJ&%!/í—&𿥕ó’&5jSSüì´x@vÒ$¨_Å”>Gݟߟ¦î¥)1SQÜ¥ÆÞ‚¬;Õ¸£ ëvŠ¥Ù·-ÍÞ‹ÝjìZš½séŠK§lW£xÙo,¶©QT8•bkáÔ-jl.œº‰bùT–¸ús×rž» ÒË`!ƒ±$¶l@›Á’˜>-ZmœÊx6»eí·ÙL“ÐxN›©Ëi<­M‹¥5}f›Ël<¹EóÛ&ãüF‘™?> ô}Sþ][<@þ½8èÝÂ($™>_/ç}§[$§;Üwæën§ 2GŽú| ÓT>ú|þbFF½ÎÍ3ý@¿r_dh¤Å5+VDë{Þ ŸÏå¼™ 7<›¸Ç*¶™~æoy<I;­_µÏ.–ÞéZ*cÐÏ|[ÊìCy“èo³Ï ï¢D|þW ¿ áC‡†8¨£ø^ ý ö¿!b¡{Kï[o˜»¦Ir;øÍ¡jÍÓ[NdŸwïC‚Ù/Cn‰~àÄhÖÑ@Ó1öÎ"¶¦ 7vÅ]3ýÚ·Ñç#ˆ‡|:”åз1òbø_ O¸K1ô–ô ×L³hðx¿¦­‡ ö +7ü†AÇ·õ„Å_1ÿÍpÔ狳hª‘#&>_\bÉñQ£®RÍ$˜s>?"d`C±lx6c7,Ø–çGãóÙÇq (ÁìÙ¾ +âbø@">È«†?7¡Ùksîíé_qìâ¶_Óíü¡­«²{ŠŽ(’ÛÁËÇÿÅ÷é¾àÐu%Ùçk6ȬcoŸ?,ÛÝØÚ7ÜFtö°»ûÀç#ðù€Ï¤5\~ŸåßCåUdâwöQ.“éó»Ã}LÈпì±ü^åõ¡€³¢±óß G}>Á©Þ‚šù|6» E®ËåJš‘0±¦ß[‰8ïó¹ú3ÌÀfÍ +q Í$¥t¹Ì Òç3|>Ÿ¦žãv»%Ë$®Ï§)Mg ‡a³ôùC[5lyÎç…BÔb'ˆ7V³®ÓtÚÅ®ÞÃÁOŸ=üè÷~ðä^PrìËP¨>Þt©¡ãŠs•dŸ¸Afe ‰æ§oðúÚbàë°hÚ'ó>Uàóø|@ÀçÒ±T˜Õnñ·ÄÊ@IÕ½X,jïÃãéH2}>ÑÖ>ÙÜÅ«+»Ã}‡sðl+SÑØÉ~=|¾ ó?íP¥²²²$†ÏçKZ ñ†º1Éõض@­õûý|2¸&ßÞOᅪԱjxwÒD«Y›ãªiãÝóŠì{rï™PÐ%¹Ü´19W‘|ŸÏaIÉDö'Íöœa°ÿ-¸Ýî$·Ð Ÿÿ¾{é ‚EÙ /8´~Ñ·1òbø™ [ÄgÃÙ÷Pú®§)hÔ—_*ŠDçâüHÒ}¾^~o»z:® >Êf,ãI6.Á(ÝÔô¥ï)i†ã[Lg(rxŒë¿B…Ú%7‚9+{’s£Ð糇;4~H|~òÿ«à„Ï|Øsßfè·ÖòÃF!)÷ùÇ›.I4ÎÉæ®ˆZÕ±«ƒ€få¦Üâ‚ÔÂwv|)Uš@`L<Œ18SR¹7û;ß•=¨Ur¬e̘Ëɹú|ö ‰¾ÁiØÅjÒ|>'0Tôf–^0d¾¦gRåó/võJLÎáóm# q¹\))èÖÀi&¤° ¡PHó|œÓYzÔå™ì;ÿ²ä.°p_‡ËÕœœkI¡ÏOm±âóYý›äÂçÀH" +ù|>úv™­âõzÍjÛDŸŸ™™©y´|4“rŸOøN·HdNw¸Ï¡Ïmmm­®®®«« ‡Ã˜ iÍèJæGX‰> eUUV¥xq~ò‹ºEè–*—ù.—‹MÑ`0èñxèNÝ?c[ƒÊÿ¡h—ÜÆÎ¿ì]ûa2×Ô¨òùÌÒûý~ñE}ðÉ–ü Dø|ЗtúJßXC¡zCd8øüòú‰Ì©iëqès««««T:;;1ÒšQ;”g„•ècUZ‡eïÔ>köÿÙ7ûà6ª{ïëOÊ 3âþhfîTÓçÎô™¹£ççÂ-5}á5¡KH€„„n)ÜR¨!ô¦´æ¥o’JHÀ"“@J‚ LE0o /Â/ØØoLŒ¯C­ŒËŠ…õü¼':9ìJÇ+k­]IßÏ|ÇcÉ«ÝÕžõ9»Ÿýp8ì›gŸ}–-L£ {Ge6\:é”iIÿO¡¢«O¯Ì×ñ‚ÏÇãÔ² R‚Á Sÿõt]$>saXohÚ½ +ø|@Ä >¿óHZ"sZŽÏÓv™9Ìd29PÍÔmSêºNÿÂj é¬jÇžžüWÎ +µ;µ¾‹³3Dû]ŒÅ‹³¦æglÃYúw2’þå†1ÿÉ}¹ÝÊ#Wþù#Yqð)^ `JŸOôí{n8× ´ Út±'ðù€ˆ|~:+«ÏlêNÌߦS©´am€¦DSÑu]UÕH$"YÀï÷Ës0eËsSMŸbÏ t}ÒçË-¹S6?ëôE“¡³ïͽ®Ì·vÑçÓ1¡ÃeÇäÓbt0¹{/Ÿx<Λ2p{O—Š¢ð?Ñ/ŽçG£Qö4cÝ|> âŸO4÷ê¥321…–€Ê ºåbJßN%9w³´kay,ö™Ï÷^ã¾QIçÒ)ÓÑÕgæFb•ùâ.ú|>+ŠÂ\=;¢·WUÕï÷MÓœÝ:µ”üimÔq™ÏˆXç›Ì·ÏÿäËáø‘5œKJâx:l¤ÓœO)]_O·ýÓ„ôé=žO(S’3é3ÒŸÏ'F>Mö:6“FŒhcý R¾ìûÌÈ¡/û†Œ|>Þ7<þ1åÆ?ÿøpj&_¤>þWªw4Õ{„r´7q´W?Ú›<Ú36ÑóåDÏøDOj¢çhú£‰ôGéôG“鎥»§&»³“Ý_MvOgºs™®šJöð|um5v ê$“ÅÒ=“´½LHst¶¤º§g͸4_Ζ1IJ£Ï–„4GldT–¯(ÿbù¨p¾°—ÃÒŒHó?ö2,Íç³eÈFÍ–ÏÇ‚{%ÀÜ {ÛFGqü¾¸ºðˆÏo>*Q:ûOàÌ€ +`*W ÉR>pHà+ù€°¡Éï5<.éùoÚ®ûOÌíôWì»»èó™½b«ÏÏíó7^G"ëc:¨¹­šÝ©CMçfDß®à’ÖG eú|ñã‚< Þ?O=Ž-‚ Hí·K€¹aG#”„ƒ“Ö«úxºëóG&¦$V§¥?‰3æ›x<ÎÝ;s¹V‘+ÛCQ¾¼X†m¶{v·Kzþ³–O„ξ7÷v¨b_ßEŸo ÁŽ›Uq³§-Õ·ƒ§AÌÀqÏ¡3DòÀhVàó>AÏTðùót<Ýõù„Ú1*;éì4N~˜?"‘Ȭ2ß$ü øECN£L_2ÓÒŸlJ±¿Ê»ýo~gê·Ûö?ÛÙ921U™#àºÏ/HØè‡MK²÷C!gs°‰Šâs„J~ß9gø|ÏGAàóU„Éç7”uw}ÏÊûü‘‰©æ^Â\MëÁq‰ØéKfpòÀ<‡Mös“ù&)Ø›ôAMÓ¸À?Ö÷ÅaIŸÓö‘…k>g¿ÓèP™ƒà¢ÏgV21µëãAIŸ¿~ÃÃMÿü€ýÎëùç}>kõëjší‰©xžµ‚SCv0dS**ùeùqö‚Ïÿ÷+ÎùÞƒ×Ô@δæ¯39ËFþCÈ÷çjÊÙùü€òЉ4äseãÕ?4ò£!–ùÉÆÐ¹WQÎÛ¸ê|–¦U4­º°iÕEMW-Ü4“E›®ºxÓJŠòðL.yxåâGV^úÈÊ¥F.Û¼âòÍ+–ÍäÊ囯\±ùÊ•[®¼jËòУ˯~tù5.ûÙcË~þز뚗]ß¼ìÍWÜÐ|ÅÍWü*ry8rù-_¶æñËnÛºô×Û–®Û¶ôömKŸXrÇKî~òÒ?<¹øÏ-‹ïyê’û¶_¢nWØ®<´CiÚñÓGž¹øÑg.Žì\´mç–gnßµpçs=½pOô‚Öèßs~ÛÞóc{Ïko=÷­ÖŸ¼S[êß6Oÿì5v ê+ÏÙ+dO>»ó‰Zò\>»fòö³Bv²œ{"Ïäót>;òÙ~î[¦åé{n¨üü,}>;VŠ¢ˆoÒU BûFW8¼±ÔÒ%vAØ,¢2—Oš¦ÑOŒXž’&K:èóÿÏ/6¼ôk/çœòò×nó#!?¶ä'/ϹFÎrþ+ÇsÁ+·]øÊZ–‹(mk¶­]4“[)·ÝúÓ¶[#—´­YüêšK,yuÍÒ¬¹ìk.ÿÇš+bk–ÅnY»åÊØ-+b7¯ŒÝ|Õk7¯zíæ«_[};Õÿ¹oõµ¯Ïäº×Ã׿¾¡ò«ßøÕ¯Þ¸iõ7ÝüæMkÞ¼éÖ7o¼í­×½õËÛßþåoß¹¡ñîz熻ÿyÃÿù‹{öÿ×½ïþ×}ï^¯¾{ýƒï]¿ñýëþàç›?¸ö±øµxíþ쩎ÿ|ºóšg»®ÙÝ}ÍóÝW¿ðQ襞U¯ö®Ú×{Õ¯|§Å{ý+>üäÊîO—|`ÙeƒÚ埼ì‹Áˇ–ŽZ2ùù¥_ /Î _RSß1_ÿó5v ê$Ÿ2rh&Ó,Ÿ-žÉ ‘ƒB´|Œò©‘OŒô³\:“>#éÒ“ÏG—~EéÒe¤ÓH‡Ä|0“,ËûFÞËç]!ûüsÉLÞ9‘©·¼eäM!oi7òº}Kgòš‘Ø×ó#¯iòŠ‘—¼4“c/]6“¿yÑÈ Bþ–O«‘ç…ì½,CÙcd·¨‘çŒìò¬‘3™¤<#äi#;.ŸÉv!Oi1ò¤'Œl3²UÌ“‰i>‘ôcF5²EÈf#y˜eÙñl2Ò´l‚²QÈCFþjäA!¹ßˆ:“£<ŒÜgä/È\òZø"ø|€SÐ-!ÝBì—‹>dbJ¬Õ¤wZú“½CËì?<Á~oîÕÑvP>4h²Q sªŠ¢Ì*ói=º®›>HC ÈlµÔoóùVƒ½’Þþw{?nkû½øÀ·2¸èó骆m—öA|“·Î¬‡zΰ§´Î +\8™¦XJÉχχχÏGàóáóáóáóáóÕ Ä~™¸èó µc”›¶¡½äº¾`è¯}É ™ÌdËÜz6›M¥R8 ª4e-5åáÇє•$‰PÿOÃe1EÌ«Äå2ßô,ÀÔ”ÔcóÞ»óHº¹S“ôöϼ¬5}p€ËÿŠ +}>këózǤô­‡º|èJ)°g:áp¸±8âã†9ŸŸŸŸÀçÃçÃçÃçÃçGÓ4º e7¤ûöq×ç·gƦ©;‘ûzž5-ýÉtvZ4Ben}`` Ë Nç@5ƒ¦DS‚y‚VŸ "‘ˆ¼)©Ç>1Ùê_ŸHºzÊkí‡øï}ÉLž¬»>¿º®«ªª( + Óô‹ƒ•ù­ÓW +tÍààqžó…|>|>|>|>ŸŸŸŸŸ¨%âñ8ľ}ÜõùÖzû¦î„Dò¤³ÓͽºSE›}}}L7¡¸ÚASÖ ===hJï`§2¿ Ì·6å®c¬ën~/þn׋’~þ/Ïõ· ¥ØïjÇh%¿¯7}þ¼ŸŸŸŸŸÀçÃçÃç#ðùï ûlF¹ã3Ö«w}>ÁÎþÃ9¡b¿`ú’™öá£bI9Œ á4¨vД5C"‘ ¦Æ¡p›2Ÿ³Ó”jÇ(ëºÛ_^ÛôÏ$ýü‡ï÷:øÜ¶$êÐçG"‘ÆR Cäàq†Ï‡Ï‡Ï‡ÏGàóáóáóáóáó  r±_çVßuŸ¢h³WÏ}½bßšÖƒãƒãÇøË‘‰)œÞà8eÊ|b¿}×;$|ã¾Ïµ¾Qñn%¿uú|W€Ï‡Ï‡Ï‡ÏGàóáóáóáóáóÀ&ž#ÅfÕ‹ë>¿óHš«›d&›ÎNKT«É7•ôp +]×mÊü`0hs|^Uã¾Ñ…kR’N~ÏîvêØùK*ùÝ=âói7f-›¯êKø|ø|ø|ø|>>>>>ìFM¦>ß]Ÿ/ +üÁñcôNKRb{F&¦xI?Óû¬P÷N{8¶ÿ]׃Á M™O Û\í»½¬Ó^rçxã¾QI¯uõóbþÖƒã>b®û|j2¿ßoçøÓ’Õ{fÂçÃçÃçÃç#ðùðùðùðùðù0+Lã¼M†Ïw×ççŸÌdé¥Xœi ýU,陘Âé "4ä‰3Ñlsöe> ¦š¦•°C;ý¿¹ûÁ³–ž¾hRÒ½?ÔúÁ´ñŒ`püuõ.ÎϹíómN‹€ÏÏÁçÃçÃçÃç#ðùðùðùðùðù€ÚE¢ñ@8ŽÇãu~ˆ¼àóÓÙéÁñcLæ#SáÓÒŸ¤eÔŽãžíÃGqž#‰Pgnïì¸w ÅGr™_ÚÐy ’kñN[çó^r縤{_ÿä»GÏEŸO '^ŸÐ¥K£§JèB¨¡h?<Îðùðùðùðù|>|>|>|>|>0 ñíãŸo¥©;!q>´@ÛPŠý>8~ ‘HÄ*äƒÁ ñKŸ-8bÚ”ù4àÒRt`}!¹î ŸoóI§LK:vÊ© ¾*]Í:‰‹>ŸÏŒP+{¬O*0/>>>>χχχχÏ4þð¦Ïo=(«áìKfh™Áñc#ShA@CݸÕäÓ;6K©iÜ´érƒÁ ®ë¦ÓØ*DFb¹_ð[«}¾O_4)éØoÚ®û|ô]&]<’.ú|¶Q:˜Þ®}ŸOgêóáóáóáóKn>>>>>Š_ÞôùGÒíÓ6”BÃ@îë +Z4ùVñnEÓ4^>7™Oã/_@Q”ÛØ§Änÿ_>ßzŸ¯ûÚ-IIÇ~Öò ŸvÉ+³Â›fµ3™ÂYè)&EUUv}åHe¾é8ÃçÃçÃçÃç#ðùðùðùðùðù€º‚nBÃá°µ(¿$¼éóÓÙi‰öiêN á ÷u í—OÓ >·/óiåk _ +¹ûåŒÏ·þÔG%½:å¤S¦ƒßz'—Ñ=r0+¼iö`%zð£¦g»§–nÎåÇ>>>>χχχχÏÔš¦Aã;ˆ7}>ÑÜ«KÌO2“-‰D¢§§g`` ›Ízê»4e=7eWWš²$TU¥ž¼¤ÒnÞóÛF«Ì§wÄØú5åÏ·Åù[ÏZ>!éÒWnóùr‘ëB¹‘˜‹GÒEŸOXtŽƒ ++vX4'fPØñù´!É)í Ïÿ÷+ÎùÞƒ×Ô@δæ¯39ËFþCÈ÷çjÊÙùü€òЉ4äseãÕ?4ò£!–ùÉÆÐ¹WQÎÛ¸ê|–¦U4­º°iÕEMW-Ü4“E›®ºxÓJŠòðL.yxåâGV^úÈÊ¥F.Û¼âòÍ+–ÍäÊ囯\±ùÊ•[®¼jËòУ˯~tù5.ûÙcË~þز뚗]ß¼ìÍWÜÐ|ÅÍWü*ry8rù-_¶æñËnÛºô×Û–®Û¶ôömKŸXrÇKî~òÒ?<¹øÏ-‹ïyê’û¶_¢nWØ®<´CiÚñÓGž¹øÑg.Žì\´mç–gnßµpçs=½pOô‚Öèßs~ÛÞóc{Ïko=÷­ÖŸ¼S[êß6O]G¨úÊóFö +Ù“Ïî|¢–<—Ï®™¼ý¬,çžÈ3ù<ÏŽ|¶Ÿû–)Oia9o&OyBȶãy“gk>çɧù|s3ò¨-ùl¶ä‘|6²IH“‘…ò‘¿žÈyÀ’û…¨F6äsŸ%¹àDÖ¹WÈ=Fþ|<í<ÊçBþ`ä÷–Ü=“×Yî2r§;X.<žF!¿3ò[!·ù%ëX.šÉùõEûXn³d­[¬rËL^s³‘Õù„‘Ò²yE|> |¬ß‘ãé5Ÿß>,+æì<’.===]©T +gBUƒ¦DS›Äb±‚Ä‹ +…¬+áÛ’eXSþô§O>ÿ͵­ I—~ú¢Iÿɺþx nëósùý‚Ó 8X¢/ñùš¦ÑgŽÐKëã$}>‚ ¨÷ÏS¿c‹ R{Áý`n˜|¾¢(åáH±Y O¯ùüÁñcù³ëÀ˜›dæ0“Éà?«ªASÖ ÔŽ===hÊX,fÕ˜å@k ‡Ã¾R å ®G”ùÅÆÖ” <äó­?uA»¤?oÜ7êóåBgGro‡\?æ.ú|:°t0y•‚üÒ¥¤éŽÀöÍ‘KºîbßÂ:­ƒþD_ŸÞ× Ø´ëFáó>AÏTÖúü2©üM±7§×|>¡vŒó?ô'G6‘J¥  k4emÍfë¹)u]F£¼>™~:¥ôK-˧M[]+ƒv/ ‹í!kÊo|Åç[ú¢$>Éã>_.ºZÉÄÜ=þîúü\)W8´d…÷?¸T0QŠ¢ÐvM¥ðùŸ ‚Àçªøüy:žôù»ŒIÐàø1ü;jMÓTUeõÏŽP´rfDí ãñxÁµE";2_$´tÓÊ Ý’Îü» ™ÀiZn·ûwîú|qÖƒ×|>o÷P¨Òs(ØUŠé>AàóAø|@A7• ŽRÌZÔ ^öùGÒÔ6”¿ zÑu=KÊæm +sÉú©‡g¥þöQE²QîuíÎÈèÓÖ5î+:ÙŠþäóåÂ竹^ÕõqÑ竪*¶;R*VŠ@gd›µ1Сp¼>¨^¼ì󓙬Äç7÷êh>@õR° ŸëÜ2Ÿ5ÏÁäª 5JËØÙ½‘‰©]Æz¥û» »%=ùÊ c'2ý‡è‡ô{ûðQw[ÄEŸÏŠó©É¢Ñ¨NÂbgfå…މu»ðùê¯ùüd&ÛÔP;Fû’zÙÜ«KDP:;T)&ß®(Šªª¦:ä9‰D$5ÿÅ q¶ä{×±|þç’nüêköÞ|ÛÓü¥»-â¢Ïg¥¹ÂÛµïóËœ-27Ø%Šõ|>€ºÅk>¿}ø¨X~ß6”’ˆ Î#iþÁd&KAƒª…H$Bo(rª${n&Ÿ=Jp\Õª£’Þ›'Ñôo-oìöȬ+×}¾³Tì0«Ïƒž¢%A¥ ­[ÿŸ nñšÏïKf¸çIf²âKkZŽ›>Ūú ~Ðuzò¹™|¿ß?ªvdbÊŽÌß²7–|æßøËý‡'Ü=’.ú|æÕ]ÑæÞ$ÓÉYlR|>‹ÅÂápƒ¢(š¦9¾¯ùütvÚT~/qAjÇ(ûTK’½³ëÀÎ@@ƒB(òûý¾9ACŒãeùŒý‡'ìøü—žòÝö?ñ—Ôÿ»{<]ôù‘HÄ;±ëÈe~>PÓPHãÑ< Ð`Î4Ðý{Á¿Òõ+Õ³Bï;kõ½æós9O?%:hdb*÷uw”Ìdq‚j›h4ª(Šo®X,æünˆäzÕ\F—÷ÛdbJ4<âKkZú“ìS¦ª~; t¤Óiœ“U šMYÛP‡¯ªªX³77Eqv†× 2zn§Ÿùü‘¿/´Sœÿôs¯· ¥ØïjǨ޳‹>¿Ø¤¼bØ1ðö·kgmlI:…\9¦=„ÏÔl––”èx„b +=‰ð‹7Õr‹‹Å¸ÕwêžÚƒ>ŸhêN0ÉÓ6”_L:;³TõÛ¡¯¯™CW;hÊš¡§§§š’n½©kUËÖŒñxÜô0wÎPo§¢;Ò’4¾”lxq~‹ïÝ®íøü×^ý˜—ñ·÷BÃÁçϺ¤G.àóµG±À© Y LŠ)tEQŠÉ|†®ëÜí8R­áMŸßzpœIž¦î„ø²`ú’Z&™ÉšÞ™•±±±¡¡!œÕš²fH$Ô”ÃÃÃÕûâñ8/¤Ÿ›Ò§;÷p8\~5>ƒ† ›*€6:G]lçGWÿoÿÉwN[wß«‡ìøü—^îá¿LLy¡í\ôù‘H¤±œÒ;6}>?2ðù0Oˆ£°È|M¬%Rì¾Øï÷Óû@@òÙh4ê`µ†7}~_2Ã=O2“_Zà ;MUýPaâñ8ëÆKõùº®G"‘P($~¼Lh(¡uÚÙº¦i¦Y4ДðµßçZ|ÓÖù|ë)û>ŸUæ¯ß½÷sñ¹­pÑçW:+ò𫎆âˆç†ê yŸ¨=h,¶^85#”O1…ÎއÒÏêº>—úÉ"xÓç§³Ó\ûtI‹/­á.¨m(å5;¨"‘ˆx'Nꬳ¨èæ]UUV#í ´B›&?g<#w›~·ÿÙRZ®Å¹î &ómúügZ»G&¦ÔŽQÖÉ{¤ëÄç‹_³$èÜpdb`ùÀçjêŸÅÙy¡PÈ#½.ÈÍæógõ5ïó‰]Ƙö™˜¢—-ýI‰Jf²9KU?N3@ňD"¢ù¤{ðY—ïÙ‚¶[ÒÔ­p8,~< ÆãñÒ¾y[ƒXœOùæw[¹¡{mkBÒi¿Öþ…±N|~.?°$EÑ4Í#ûŸ¨ah ¦ñ&ÀkSèlV;êóƒãǸ–o>*QCûO°Åø;ôYœf€Ê`’ùòΙnÒYWï ~¿? +•¤[­»1—:ÀCÑ\‹O]ù}.óóy±qßh±›þt$®y®=ãói7è2€ÏÚô»ªªº&‹ø9À£äG<ó|>€ +SL¡³RIºy—|–‹£h4ZþžxÙ狌LLI|~s¯ÎcÚŸ^¦³Ó8ÍÀTâN]t±%u]…BΚü`0H[,Õôjšfz Ùm»ú–oøO¾Ëäó¿}F\Òc¯Ü0VÊ‚ÊáºÏ§vä¿àSÕiwÍ6çHy@%Ï€*BÓ´˜£¸2™‘ß›‡ÃaºæõoôíèMúS±{vÚÛ@ À>^R)f1ªÅçjǨDñJ~¨¼ UæS¯ÎºwG €†9¢¸ƒs/Ànñ…ξÜRœ¿~ášÏ%Ýõé‹&ÝxK;,•ß:ïvÎP(äàFÙD€9>Íqø|¨"Lò¤|bn” J ¿·–ßÓ;Á`ÐYý^E>¿õà¸Dµ ¥ðߨ0¼šZRâN£ ïºË„¶ +…ʶt]W…Fœ2 ³ãÛ~a•ù>ßæ›¶ë’îúœ ¿òfkºëóÅs‰ÚE|ÈB;&Îì¨:ýî8ðùPEԆϧoA÷æüæ½ &ÍbZxîå”Eާ÷}~_2#DMÝ üw*L4õ듳 Ö‡¼®ÓаÃêóO]Ð*é«oÚ®—÷ aqÑçG"¶]EQŠM¤sŒ=ñ§ŸuþŸ¨a¨·wk +9À_„®Öhè^ž¾ÝÈso/ñùÖæU‘Ï'ÔŽQ‰&™˜Â?À#°ør†§`0‡zzë8±Øg…Šóן¾è=IG½pMÊíQWò\óù¬ü>ÈßÃùx¸C+o”Bg£G¦ÀçjêÛi à#õº°ú¨yølt¿ßO×?tgªiÿ+ýN×Hô>+oóøŒuºxw>—÷ùôÓÙÕåóÛ†RMD-im‰D¢§§g`` ›Íâß§ªAS¢)½F<ƒsÓøÔ«ªj<ˆ¦% úü•I:êoŸq̳ßÈEŸÏŽËöˆ.fÜ:] ðK#9Þ˜\Ÿ¨=èÊÁÚë:ÛÛx ºÚá&D^É@åæßËJß]ãÍG…Fuùü‘‰)‰&jêN”´¶žžž.ƒT*åýïДhÊj!Ú´£Zž&ú`uUâÅbŸ56¾Xp¯èó÷HER/×|¾ý ƒlÔvpÈæWDv@}>ÌÅzc”è VÑ4]ðƒA›×<ü’Éû5óJuù|¢©;!Qú#SöW588ÈÌa&“Á?QUƒ¦¬¨{zzª·)y§jßä;åHiøSU•:óJ–óÅZ_eþ7¿ó˜¤‹^¹aÌËòµ}>{lÓ@€ÖL;Àæ•ЉËÃfÐOï8%ø|@íÁæb[qvj6€wàþ$ÚüÝ–²„B!º*òùmC)‰,¢¿–´¶T*\ )kƒl6[½MIÃJ±›ñb„ÃaG©¦i4–‰“*vûÿƒÿ÷gÑ矵üo’.úôE“ñ¸w[ÐEŸÏÎ;b˜owê‘ Ûn àç!{Çtþ°K…J>'’Ÿ¨=ødsu^{€†+”9|Šnc]Üsºe…B´\ªÏZ¨É ¼#;Pu>dbJ"‹šºøwT]×™hµ u¹q'Ôv4-ø!^on*Χ¬Ü𾤋>ó’ÉÁñcžmD}>‹ý~¿ÜÛðrzûÕ rØ3 UPâ¬ßú<ˆ]¨Ä½ñ<>P{Pÿ/>—gPŸŒ#€Z¥Ÿ_ùÛvN±2Œ`0(¹e®sŸO4u'$¾¨/‰"m@E¡›?–º[Ÿõ¹­-ÒRp£Ô™W¾8ÿ¤S8}Q”"éœç<‘ªb¸èó5Mã§G±æSU•-#–Ó—‰u6»* Ÿ¦%Ù‹GJôáó5 õÆâÈ +…œêí<7ó%UŽñw÷¹˜ð)výV‡>?™É6u'ÔŽQæêÛ†RSÔzpÿ€òá–^®ßi1kA]1‚Á`ù÷æÑh´à¨A7þòêng‰<ôKKÒ›-î¢ÏÏ Ã1+ÈTU5–‡þ$§Šós…|>›`½$`»ç‘Kø|@ C×Ô-Ãä æáwÁ¡PÈæGøm{0¬ü³ûe.Òé%íÝ¡Óþ‹ïË¿¬³‡ÎË>¿}ø(³@ͽ:½™˜’˜"µc”0™ÉRð(S/]l±’d¾ýJŽ8R°jmêÉç÷Æ?¥ÍD@×'ýþ¹Ï_ÛªÙ÷ùÔ¥{³ÑÝõùÖ–-Hù“;DXi¸N:‘ +H°%áó8Ýu–t«+ë¤ò + ‹ím,ãû¦ºK­CŸßy$ÍEóóͽºD±2~ú)¾›˜´j±a"Ú—ùjX¶]Vï`©vQDr-¾™:±­;nmá2ÿÔ›ìË|ÊÈÄ”7ÛÝuŸÏW,Å7=¸q¼¹Ãá°õIS÷t‚±º}]×ù¥-ï…–‚Ï€€Ý~òHMÓ +.ÆnK¹¡_\™Ì(WètÃ.Ù½:ôùéì4AGÒôÎþÃYÔzpŸhéO2´ëÀ½Lf²³ú"kU?HˆÇãâ0á÷û‹•CÛ—ùÔµÚyj¬išjàÊ#æ¢dôÜ Áã2Ÿ2co7œõ°èóWnxß¾ÏgÏ[½‰w|~%¡Ë :ñL¢¾àîà“2Ï€Ú@×uEQ¼_0Éäi}>‰À´ŸõéóyA>¯ílîÕ%ʨ/™±Võ@1¨Cæ½.Šüyë¬XÈš MÐÚh[ö?RQÞçZ|ñ?.PÎ….¸M×'é½è“/‹2Ÿb_æ{¼7vÑç³R|:j ºå¤›b¹É…B.Ö@Úñù9¡:ÎdÚëÓçLL‰®>'~I (wþ¬ªßD6›M¥Rø¯©vДhÊ2‰F£¦é]ÅÆ>‘ùš¦ªEñJcˆäZ|ú–oN[Ǽ½ª¾§ë“÷Š2ÿ» O—äóÓÙiÏž~.úüªˆ½|> &¡kºx`RéR¤Ø$A€Z….‡"‘H8nhll¤ë"M>ß7vç>k%]ȱ%Å˹úôùDSw‚é ¶¡×—Ìd%ÊHíMg§Eço]áÀÀ@—A:êýêM‰¦,Q­óð4vÈ‹¨Å#­‡w¼V™ïÖÄ13‰x®ÅGQÎqu‰tݱîSqþÂ5ûìËüæ^Ý˧Ÿ‹>ŸÍ.ôûýè쟨=ÄÙÙv.'@… ìÎ]þp»Z’KžºõùmC)f„šºì^~_0GÒ¢ógUý"}}}Ì¢®»ÚASÖ ===®4%ï ‹Ý8S_ͰÎJ$)¶!êÕYÿoš2æ…gÍ'HÄs;ý¹_äº3¸·ohØ¡õ šd>em«fßç·õòéç¢Ï§!žm—NEwý 4x¹¥àóµG8.8¯GÀ#pw éöY²$¿´ãJ¿n}~_2Ã¥P2“¥wÄò{kZŽç„ª~öRdlll```hh'dµƒ¦¬‰5åððpå7M¬¦iÅþd-™›ƒÌ'Lë¡ÞCŸ‘Ñs»¹_ü ü'ߍ½ßÿ ¦%• #&™ê‚Möe>edbÊ˧Ÿ‹>Ÿ 3‡tV;ç 6gÄtršˆF£Þ)…ÏÔÅæÊojvãI7§Š¢4pÁB¿ðBww÷P¼qƒ¡P¨`9œ©(4dPŸ>ŸàRhÿá z)–ß[£vŒæ„ª~öJ¾̧Åh葯¯Šº\/ FèUs->}Ë7§­ãÞ>ý$Öúºµ8ÿÛgeáš}×né—ôÃk[ M¯ŠævÑç+Ë,FÁ€9@\æ³Çü ÜC”èÃçjq ‹¾pdPÛHª(M>Ÿ¹× +{ú î³dIú +¦oçÈ>T—Ï'Çq™Oì?P“ð>™Pœ€ÚF×uQwÓpÃï|M~F¼uÚ º~›õöœ¾c$¡¯ÀÊõÙtÕù|ÉLV⑚{uZ¦óHš~oêNÐÂøOÌ +u¶öý*uÈ´|Í|wU}‹ú`p«®OF6·Kd>åÇ×i’~ø–û&«å»»èóãñx¬œšcÈÎsÓåGÁ#À®¿T /N6lÒŠ}mŸ¨U¨{gw…ÑhG5õbá=¿7ïUéMnþ@·j÷ù9¡ü¾`àð%Çih°)ó©ç¬%™Ÿ›Þd–ÞïPÓ’Zß ÿ令>óµ[’’Nxõº¯ªå»»èóÝ‚]™Dze|¾¦iÖ§f6? ŸÕÝr™/Þ–ôù¹¯ósù_«Ð—eeawÓ+V¬X´h‘d%Ùlvtt4•JÉ·E Ðb´p%Wõü'£•Ôy$íÊ^aUXVå‘UE£Ñ‚unWE#‚8ÕKN(ª½Ã·Rè—\F§_äÅù>ß‹’xmkÂ4ÆzùXµµµÕ›Ï/øe ¾‡ôùtÙÆÿÑèZm0´¿ò2}þ³;wÒ§ayçíw橇Á±E©½ÔÉE2 2¨ªZÐÛóù9CÚ°?)ŠRÛÇZÿf¥«««££C²’.ƒt:]l™T*Å–¬äª^éøDb“žüè°+{…UaUX•VÅ$¤ÕO\Ÿ¯dZsÍö;Ö½0›Ì_ÿ|@Ò/¹s\Óæå ҟ쬊þjU[·n­7ŸÏ®ìÔçƒAñ´/>§’®Áø ûS]ÊôùâÇy@½žz[AÚK\$*ݲCÓ=©ÄççòÓÌï‘ìÔšvuu HVÒÓÓÃt‡¤Êqtt”-SùUýåƒ/$BÉ­½Âª°*¬ÊÅU½õÖ[gžy¦ØÑIV¥ë:Œv'v% ;{Õ××7ëôÔªb/uÎ*óC¡/½í¨¤û½ôÆ´g¿ uUÍÍÍõæóÙ/>Ó„a=üjÊ‘)ôïÆ+óí;|ø|ÏGAàóÕ/A7½/÷ùÅ>åeâñxC›¡»ï†â:ÍÍÍkÖ¬‘¬$‘H I–Éf³ƒƒƒ´˜D›ÌÓªv“¥}½]Ù+¬ +«ÂªÜZÕž={N9åîfý~¿ÉCŠ«ÒuÕÛVF­«¢-.X°@RÀìñÃNË‹ïëúd`Á½r™ nU”îk·$%Ýïêu_Ü«±±±9ìÕ|¯jïÞ½®û|:QEaC³„‚W5s@Ó4¶BU°â¦#@ÿŸ}³’¢¼÷ýþ­JÝηêƪS™:§NYÇœh+˜_`xµ£øÆ‹´ ¢Øˆb≎c£¶r_0Û®q±MÜ@<‡ã\B¼$\“,îÞŰÍ!ìÉ:=›v˜0÷7ýì>ôÎKOÏìÌÎtÏ÷S¿¢všž~yúy~Ïô§ÍާlýžÿmVö ’ðù|>@ àó~§q|>?£J6µ Ûš÷uÈþφ\„RÛá¼ßŠÅbÝÝÝ.žø\J\J'ªª:Íg(ÊzuË w•^E1ï¦h¡óM¨\é:­hq¾®ÚÔô‘Kî]Ó{î¹>ʊϰ%QRW¬”ÏO”賟š¦qÃωvÄûv¥vÊx”½Á +úü '|ù¢_ F|yÆå—L¿ü²é—_>íò¯M›ø©¯š2aÒ” áð„©á˦O¾lÆäË®™té¬I—^7éÒ믾töÕâ W‹7^%Þt•(]%~ó*ñæ«.¹ùÊKn‰9vÜÊãŠKn·ÇÅUˆÌöoµ€ Û7íã¼ÉŽ탟}uæDèt®µÏ‹Înæ¤Ké4§Ä´ðetîS™F˜l·ÆÕS&P³\9eÂS3MDñõ©©¹¾:m"µÅÄé—O°›±h\ê9Doq‰·¸Ø[|Å[üëôË7¼ùZ•ÒšÿÇTV\^øW/1Ý-¾Rz\ì9¼ôÉ¢}»èqh +ÇDgL;——™±Ÿ_ã1u8¾žßÈWŒŽ+1…"“²âêÑ1itLæÎDxtL9”è2éÎÓx8²bnÌpÄÌáÈäÒk1Ë×:â:v6æ1{8D6Ѱ¸‘ÇH&¿id’F¦!7çLI·äLOÎjôÄtq=Ÿ+³çPgÜz…c¶uœàœ-iœ‘¶â ˜™GæG{Š¯Ï™%3¥}­³fIê]|Šdó#u{63ÒøºøÊKàóUB–evoH÷¡Îåî>Ÿ×›ùèLáóó2”:ëâ”6ˆåýVGGG»{ý*¨p)q)9|:àÀ.ź®;=¼;…6•%ó Õç×û#é]R:fúíµÝEe¾ª~LñßvɽsÖ|ðA—Fe }>u-ï]±²>?wÔä…Ö©ÔîêÊç_zÿìðß +FÌØñè7ùÈ‚_¬^¦¯ZýŽòøÛ+ŸÞ|¿Úºâ•Ÿ,×Z–ýT[º­ùÞ÷__òÁ¦{>|uñîWýöå»?Þx÷7È^ZØùï ®¿ëÐú»¿¸àÈ‹ó½0ÿ¸:ÿ„:¿WÿWu^ßóó>{~žõÅÜøssûŸ›û·g‡c w&ì8Y¹ ÍÒ¾h¿t~aþ‘t¯_@GHÇIG»oƒüûòï^¾ûÿ¼²èׯ,оºhçk‹µéž_¾¾äç?^ònó’·›ïݬ-}ëeo´,ûñ›Ë^ýÉò oÝ·þ­û¨5žÝ¼â›ïjËkö5Ñco¯|tëƒÔ\Ê6åþwW-×W-yï¡Eï=´ðç«yÜÅâ«dâaŠù£cžsߎ;sâ;n‰ÛFÇ­#1§â‘[râf;¾IñËLH£bÍM#q#Åö57äÄ쑸>^7:®Ýþè[ÿ³J™mÊxuþ)Œ_‹©Ùñ(ibº{ìÈÄŒÑ1st\S(¶?:Ë×:âº|q}&ØE?ײ»ë6vðŽ4ªƒ±Ž7Ò oÎêœï?2‡ú­£;;6ëí¬ó;‡ÃÜ_d‚ç8ZðóÕ F†›sÊï­¾ÛŽEöØd±ø½‡î±cÉHÜ«¯¢Xª¯Z64œ—¿»ê>;VŒÄýÛV=°mÕÊ‘xp›BAÃÕH<ô޲:>lÇ#ï<¸fk&µã[[W~ëí•ß¶SÅ¿Ùñ·W>nÇo¯Œü,Of"“dÖmyà»#ñÔæ¾·ùþ§íøþæû)ýÐŽg6¯xæ§+~ôÓÏÚñ\ëŠç[W¨v¼ÐºâÅ·V¬ÏÄ}ÿþÖ}/½uß;6¾ußË?YþН¾¹üµ7—ozsÅë-Ëší œOٯŎ7[–ýäeo½A)qi«¶t³[´¥?k¾÷m;¶6ß»-™ä©ÿxÉ{?Î$Ò_¼¾ä};Ú^_²}Å=;6ÝCi–fÿØ´ø?_[LY÷¿^[L³ eàÿýê¢]v6¦øÍ+‹>²c=ËP¢Þ»ñîÿ›‰LÞþÃÙØ Ó¼³oÃÂý¶¿”I韼´°ãß3ÓÐÿ³g"Š?Ùó¥}óÅ4+õÐÄôÂü£/d¦š›øôôßê|š&(bö •™žì‰©²óQI‘pÄÀpd&Ê¿9‚²ßžL)¬áÈœÂgö¹PüõùyÿmŸ`¯}¦ì”ÿl·µCÝ&Ô8ÔDŸÚÍEM×a·$5é7,¤F¦§–ßc_>KÒµ£ëH×”.ñ;Í÷nÉÌ’K©Ÿ¼þæ2êH/ÙS$õCêŸÔ©WS·§A£†Æ—ôÜ]ðù€*¡iZÞ{CŸÏ+Ðüå±é°##TdƒÁðùDs§å¢•N žÉýJOO3‡ÉdƒÈ×àR†îînºŽå]Ê,-éž'ùÄá…B–>ë‰@gUHZéátkS&ÞËÿkÜøÍïŠÊüpxK:£ O-^û.‰÷†e+ûRÖ„ú|>Sw¢¿³ŠÆêÉ…Þ CRKwæ…;’þà?i¨ñ½o>>>>>>>>>>àwxaýk_îâóùí$Ý]6rÓÆçï>~ÒE+ííÌû­D" p)ƒA*•*ûR:ý<ÍîzÐKA2ßT¡i"ë‰@½Ëü˜‘qøLæSlsW1Œ^AXï.óiË:•YûD´õ7ï¹$^å™ÄßOù¨ûÕÐçó¿a*m–fù¢/P ЯI’Â6´¾®ë.o¸” +ÿé5Æ7àóáóáóáóáóáóáóáóáóáóÀYÛÆ5N^Ÿoš&¿£¤;h´[0|þ‰Á3.Z©¹Ó Øp»î.Ei +EÑ»Ì/´©,™_Ô”Ö˜C7ùÖ¦óoº4£÷GcY§Ä~²hq~4z„òmÏÀéôþˆKÖõcϯö#!UUiûÔó³–S÷¦³·×h˜Ð þ"ý¡¤â +ø|ø|ø|ø|ø|ø|ø|ø|ø|ø|@0pÖ}I’¤Úð{d^uæ40%½ßH|íó·êÿþþÚz0Î>n<sÑJC©³#Êù”Ó\䤮ëìe./ˆ¢X¨29«¼¿ÞßóÚ#s™¯-È´|$òѨu’–(¶•ùŠòaW<É]}QŸOá£þSCŸÏºeI5ê%Áæú܉žýpªÞ~]f,û…χχχχχχχχχÏ˲²t½{Õe:…èhª½G_û|âIúØvxÀÅ)íÿlˆ}k(u¶gàt<™Â q ìª(J“gdY.$ó ÃðÌOZéí"—ùʬ¹™‡·8W”çþ´¨ÌÅ–ôȃTú|°_/Õ{˃•7侓ŸŸŸŸŸŸŸŸŸŸŸ¨9š¦ñW¹ A7°†aÔÉÓ‘°7Ð]=°× \ŠNËÆ×>Ÿä· ¼j4o°uø·Ô}}¨Ø A 4+Š¢w™ï®U)óä\×/yÅŒôV™|kÓyáYæ”óšÖÎW|ò‘Ö¢2_ÖF/­LÉÓ»Ïßy,á£~RCŸÏvM¿^ +=EûજËáóáóáóáóáóáóáóáóáóáóáóu‚®ëtÓš%pè¾UQ”ú1ù¦iºhüB%£•µú¾öù;%˜2R÷õ¥íÂ{­ÄÖI;ªúyÅ> Àhš&‚÷4ë¥Þ>Rò¬Æ3ÖJ²Kb2ßxú‚Ðÿ|ÌiæuýSGû´•ùì+îMsƒ½<åjèó öþH–o¯ ü÷ ÚKĆÕ?ÐE¼Q‘XðùðùðùðùðùðùðùðùðùðùàG Ã(I19Ëõ+øHÂ×>ÿÄà™,k´íP¿‹Yê8Më4wZYû€ ÂiM²kíÙI·6iK' +ç¯ãZ^[X™=Ãøð/2ŸóSÚ,Éçûë5¨qðù–eE Ô»(Šš¦E])ãYRÙ¿:œT¤’>>>>>>>>>>|݉;o«%Ibeo¹*‰Ö¤åªªÒ:ÕN¾öùÄÆ1§œßÛ;èb–vKÐ:»ŸÌªØ˲JzJÅ@É|›ï|©å%I·¬Sü?pªþB!Ë;øW(mz—ùÍ–¿šk|¾sãïÕé…,Ëðùðùðùðùðùðùðùðùðùðùðù€šcFØFÓ4_¡5ÙWj"pø µ$IÞ«ì,ËâV¿RúÝï>籄SÎÇ“©¢rÉYÕÏ*öƒ{(òn))µR‚ X#(ʇN-‰|äü_Mk÷"ó%Iç_éŠ'K*ÎgP}Dà}>ƒ½#±aÄ~D¼A_{#ÀçÃçÃçÃçÃçÃçÃçÃçÃçÃç¿Aö~o8öÛɱÀŠóEQ,㻼â´"O"üîór¾+ž¤%Í–‹_Š'SiG‰éûŸö%>3N —T*ÕׇKðKÉ^VòòTÓ4ç PEQK÷¾ Þœ¼ ¬×õOG7Q{Q“O!Š-¬žß0zé¶Ã%ùüß™'ü5*ÇÁçóòƒ1â½z¡X' ÿ!ø|ø|ø|ø|ø|ø|ø|ø|ø|ø|(Ãçó +ùñ÷ùt;Ïv]Þý8ÿzE”ß}>±ñ@Œ¹£¶ÃiGÅ~ÞØÛ;Hëp+µÁøK{{ûÐБ¯éîîn·Á¥ ê¥Ôu)zú×} <§y! +Õä­ñ!S/¬ÅÃèÍZîEæÓw™Ì—åì#ê1þÐþ‰¿Få8øüzCQ” +>ð|>|>|>|>|>|>|>|>|>|> ᯊ3¸œ÷øÎ8ÝÀVä¥õ²žíºì÷Ö+xäðù\à«ûúècÏÀi¿ÔÜiÑ:û?:gø÷w ®Ûïtuu1 ŒKéw:::r/¥3c»ˆV˲$Iò.óiâ ¯4Z {—ùì)€ª~Ì–\þYI2Ÿ=-õרl@Ÿ_àóáóáóáóáóáóáóáóáóáó HI˜îèº>ÎÏAy»¶, >ßɉÁ3Ü õ œ¦%îE¤ñdj(u–üõ¡¿`@ùþþþîîîcÇŽ¡)üN,£KyüøqöÑ4MQ³$|Þ/RbÌZÓA\ +’)+R>ÿ©að(ó)týÓtæu°^AXÏ–\9÷—^4þ÷ÚºYþøÈ_—ÒÀçðùðùðùðùðùðùðùðùðùðù€¤R>¿&› yI’Êøº¦i|ŸOl;ÔÏkÃ.ºioï ­Óz0Î>Òw1 ¨C(Å ‚àE—$óiMÃ0 +픿í<£ûäcÛ=Ê|Mkg_žpËc×µ}ztÃÞøœµn öÍöoÕÐçSߦž©SÓ¦iR …B¾~µ>>>>>>>>>>ЀÐoØ79t“ö†$I.õ™Õ†°Zâ}¨a\pUäv>>?‹®xÒE71í¿·w}l=Ç€ ÞPÅ£„/IæS¢+”9³¶C™¶®(i¥wI™H˜E×µ¬S’¤—*óey_¨Ìº1ÝÚ”>U”ô’Mq—»cû_ýÛëjèóé7‰Ëë'NèwNM^-¬ uåó/šñÕK˜¸bö˯/¿næÒY×/™%Ý3sÎâ™w.š¹àîwËÓïY8mÙ]ÓV,˜ºrÁTeþ”Õó¦<2/üè¼ð·çNþ·¹“¿sòwN~òŽÉkîŽÉOÝ>ù{·O¢xúöIß¿-?¸mÒ3qõ3,n½úGŽx¶ÒAÛ¤}Ñ~鞺}ÛöAÒÑ>6wò·æ…×Ì Ó)Љ¬š?…ΈÎëþSï»kêò»¦-]8mÉÂé‹åé‹äéòÝÓïº{ÆüE3æ-šA­qû¢™·.δÌÍ÷̤&ºqÉ57,¹æú%×\{ï¬kî5séµ3–^;uÙµSf±œÅu“½Å¤œ¸:'®Ê×_™W8ã¾ë¿‘/¾î!¾–‰ÙYñÕûfoúek•{™Ërc…טPJL,%./öÅÊ_+™‹þuo‘·_}#«ûåtÎ|}xT'Ïn£†µÑbª#¦9bº#f,=3³ƒ†ö¬k–fÆ8Ŭ‘¸Ö×%O;®™=7äÄ#qÓ=,2É„Å7G‚2ÌÍ‹gÞ2sFe¡[eâ6;n‰;ì¸s$æÚ1/3xP6›÷ŒvÜeÇÂáȤ;Yž~·‹±ØŽ{2A&–dbÚ½vP¶\zWfv X~.2¹ô¾SWØA©õ;VÚñ …uyP~h^&VÛñ°ØYz=Ñð Ôým{ÞyÌÊçß±ƒæ 6 ±ˆØó›’جô];ì¹éÜôÄf¨ ÏPÃÓS5¦¤²'²¼Aè3#GûÃá>‹Ü6<ç²³ûž#èÜY#¬³Û„µOd¤Å¨õ¾c·ç·íùñÑ‘)òaûº(ŽYr…=KÒå¦>°xáð,I}‰O‘l~¤ŽM]ýºÌ´8‹Æ×·M†ÏT ~^ö½á8CwâN¿¤iZQ9o†³pTQ”ŠI }>¡îës1Nñdj(u¶õ`|ãXW<‰@ýëç)õÊ”™Þô‚KÚ4M3Kæ»Ôðמ„™Þ.f;Åž"Ø0zeöe~$ò_(~i•µé¼ôVöû¿þá¬Kjìê«ÐÔTjèóY7öRfÀ~ øå×N^êÊç#ˆÕª4ØÑ¶¼ðño}@ýá;ŸŸ¹%Ï*@ ‡Ã‘ÑÐj´×äó5+RœŸ®Ïo;<à"ööbÔPŸð¤Ä¼º‹át¾¯äNIÛqy .ˆµÎd>Åïݺ®*ëK•ùô_(œ¿Îxú‚ÌŽŽfJÂ/ +»½ý4g퀇óú¥†>Ÿí”Àãñõ”mšfÔ†þ(o ðù|>@ àó~‡n ™ýör/\?¨ªêQF9‘$©R2?\Ÿßw“NÍVN€ A‰Ñ‹W/Iæ»lGÓ´,™_Á[y²dþv1,x´Î{÷„õÑè‘‘†íuþ×°Ìß%¥3¡ÓsÖº=*½(œôP`^¿Àç×ôÓ®ÐÈ…ÏG àóŸhL4M£ûb­¦ö=‰…BM~ÅXÕçê¾>ïO¦0¨C,ËRm\¼ºw™ïîç)ÿ;W–뼸Ü!óµ¥™o×õOóµá)IÒ½Ë|Ãèåß ‡·œ«Ø_:1³»÷Bì© ¤×´Å\òêç>¶Ü‚뺠†>Ÿý ðòƒ„½ÜTŸ¶Ñuÿ.¢?r­þ}þSk×Ѫ“¯¼Šá¥_¹¸Ú»CT$èJñ«FW°qN|ÛÖwª4¢ÑÕ§cœ}íuE×§uœ_Aú"0¥Ö[ò'(À_Ð=#+ݬ‡ƒ¡ÛUö|A’¤°ºsgïT©d4À>¿í°[éÞÞA üˆ®ëe¾»Ÿ§¬ë\YQ”º>í|2Ÿ"ù(kEÓŒ‹bKy2?ÑÅ;Ø=yËÌÌîh§´ë̳ô/<ã’T—l¢ýú»kÕÐçÓÔïe"¦_¬óÓÜÈÑM- ØÐ0gW„}Ìú 4FŸ?ÐQ9}Q /Vð¨ÿ~Ð@N9ÿÛ={Š®Oë ÌØw`J€FÀ4MfÅ‹¢(J­nÛëŠûü®xÒE=5wZ/øŽ¬Šú²e~z´Ï¯í‹ZÅ) ósëó£Ñ#‚°¾l™OXÝ¿¥]諾Ìv—>4Ü2’”ž¾ô¤KR½rî`?)J }>ïØî]‘ÿtaº;x°B 竈ªªæ6 |>¨P¸ÁwÀç7˜R ðp5]¡PCOåöù„º¯ÏÅ>Å“)Œ|DeþpŠPUI’œò°I˜…d¾¦µ>=š| +Ql±¬Syv·K6ù*_LSÄÊÍ–KFýâ…gê¼!‹RCŸOЯ¶kµ€;â2?À¿[˜ÏϽ(Yï#Àçƒj… Ð||~#€)‚®ëMeQïe™U&Ø>¿íð€‹}ú¯?õvtttww§Rûþ&‹áRþR:_ªªˆÌ÷ '¢Ee¾e’åÞe>­\pw{äa™¿gT3¾ülÌ%®i‹ ‚ïGem}¾ógL(¢Ù9:u~nû\œŸ†Ï5 + 3øøüFS*ç­®(ŠtKÈ—ÐáAà«Ñ ²iš ÞnÁöù]ñ¤‹€Ú`ü¥Ý&‘H`ùšŽŽ\Ê:GÓ4–“Ýe{¡KIßò(ó³¼_HZéí¢‹Ì7͸(¶x—ùYUýyv·?â¬Ìgüñ÷.étÎÚIòý¨¬­ÏO{{…~º8QÀ烅 Ð||~#€) ¿Á0 ¾œÝŠ¢è\Y×ufõ³–7&Áöù„º¯ÏÅAíÝŸ1NÉd=Á×ôôô0sˆKYo˜¦IIÆù ÕÝ”vwwÓuìèèp^Jï2?¨ï[iZ{!!o½‚°Þ£É§5iýòŽÁýu§‹Âɬ¶Ï{)뜚û|v ì§K.¡P(À•ù ø|PC p:ƒï€Ïo0¥@€áR:ëŽ/·,˹Ü0ŒÀVr–ÛtAòùñdªgà4ûÛÝAí>ƒ‰D—²®ˆF£y=¼{ªI¥RÎKI©[Å—ù†Ñ[HæGÛ~-œ¿Î£ÌÅË:å}¿C©³”?)(£¦‹=ìÊüïÞÞÁB—Ò/¶æ>ä¢4;óW éïÀ›||>¨!P¸ÁwÀç7˜R ÀH’ÄnÀÅùi»Ÿ-§ûÁ¬¯pmšf#7]ð|~ÏÀiæ—vKÐÇ®xÒÅA5wZ>TMÓòJxZX’r§|žUØß€2?ñ™GòÊü¬¢}÷å¥îw÷ñ“,On;ÔbðŒK"åÑz0î󦮟߰À烅 Ð||~#€) 9=k9¿7Ï­Ã7M“ý—ÚØ?Ò‚çó¹ƒR÷õ±%îe¥¬ôt(u¶gà4ûP6ykòiaîCUw4MóhòA(uã¾#ù(Þ¢ëŸ:Ú§™¯ª—±Sž9Y•¾Ÿ¿íP¿¯Û>¿æ(Š’õkÄ0 Z’õÀΩÚÊ/ÎgŒ@>ø(\€Îà;àóL©` +ù|˲ØrºCÌýV( +’Ç.àù|giÏÀiZân¢ööÒ:ÄØ#€¡ÔY (ʆgcfÚ)ÔñTÞ‡…d~ÖkY Jþ’$ÑÁäý_¿ã]æ ÂúhôÈè–9¥ªG"Ñ.»ØÿÙ3‘º?åAßòuÃÂçûø|Pí~…‹Î€Îà àóL©`¸AÊG.²ºÐS€†"x>?="ç)vKÐÇ®xÒE@5wZ´ÿH+c@P6𦠂 ŠbV=­G,Ë¢ïŽQæÓBú¯àe¶‘ö*óE±Å4ãÎïÒGZÈþW–w¸ì¥õ`œ¥DJ§î)Ô~ +ŸïàóAµû.::ƒ/€Ïo0¥@€áR:× 15$Bî·àóÓõù¼ ã[â^\O¦š;-ö7} +€šF¹‡/ +åv˲r7Â(ðÕdYR©êÇe¾,ïȪÀ7Œ^AXï\¡Ð^(%:ß`rÅ)ëÙ¨ß{ |¾/€ÏÕîWP¸è è ¾>¿À” +Æ0ŒBåš’$±ÿÒuݹܲ,ܶ§êóÕ¤ñd*í0üycoïàÎc ö·º¯ +'”TUU-¯ÞÞ#”EiòŒ‹Ìw®&ËrÞÕꎄ™>-º–,ïð(óUõ㜖UÕ/þó“Y¶ß O˜”)…º?å±ûøI¿wuø|¿ÐñÉ'¿Ý³§ìèïï¯öB>ø(\€Îà;àóL©lB¡¿ ‡Ã\=q½C+8ÅŽ,ËÁóØeHŸO8]}z´áÏÖƒñƒgøGZ +48ÌáK’ä¬uW«sK«ëº3…ŽÊ‹ÌWÅm}HK·6eâ÷nì]ækZ»ûwåI·[›ÎKïÉÿæÂPê,øm‡ö6äEæSPõ{·‡Ï•òÁ@átߟß`J€`ã¼ wÚi˲¸¢?E‰D"¢(ò5«ZtZÿÕço;ÔÏ]=[â^b:”:»ñ@ŒýMßÅ€¥JJ†”!)é”.*¾Sþ +•G +C–Ì÷Mbé­Â°ÏßY0 —-ó-ë”(¶8Wxò–™î»s +üƒgx.uÊŸðù R@>ø(\€Îà;àóL©x4MãêÞi§UU-¤†DQlðF ªÏw*©¡ÔYZÒvxÀEFÑú»ŸÌú +ð ©Tª¯¯/‘H )ʆ¿²äRošf÷¨ëº³ø¿(´2}%廬 ó)i.'™/ë£Ñ#Î/Fo(ôÚ¹Î_§¯úò¹ÝÍߘÍKƒOüÊúÁ³g=çS‚ À¨„Ï•òÁ@átߟß`J€FÀ²,UU%IRŹœ>æÚ¡p8Lë7x‹ÕçÇ“)§«§%]ñ¤‹ŒÚv¨?÷+À/tww·Û á•InY¾ ´RD4­ì¾hƒ.ozöjFÞ­™¦éw™o¾ð…è+«-ëTîZÞe¾aôæ\Ó-|ñK«Œ§/6ù´ß˜Qè¸xœpÃ) +—´ù@ó¹Ò}J°•ðù R8åÃ¥_¹xîíw ê?èJñ«¶lÉ½èÆŒÓçO¾ò*ŒŽº1ú|4 /‚Æ |>42¦i*ж‘e¹Pg£TŸŸvT™î>~’>¥Ü +MÕ}}ίl;Ô¾á#ººº˜9D‰¾˲¢Ñ¨Ç§–”C¡Kªª’çc„òpÑò¾àrN뙟´ÒÛEf×§/Î_×Ôô£P赬µÆ"ó IÒÙ +ÒDÙÚtް̧ý&ݺKƒ+7[MMé%›â.i³eÛ ¶2ý›»ŽŽßJø|P)œ>áÇ€2jp²D1ÂQ†ÏG 9>%À>¿+žT÷õm<‹'SlɶCý.nŠÖßÛ;È?òoú§¿¿¿»»ûرchŠh4ªªª,Ë¢(òÊöz80˲ò¾'UÊQE7Nç +…ü(ó­Mç‰_ZÅÍüè““ÌOgžžÄŸ¼ãVuÁÕÃ&Ÿbì.óÓö£ÏžÓŸûüÙ/\ðw—„IñÉÎnZŸVλX,F£òøñãþ>ðù "ÀçC_ŸŸ@rê™ûü\ö6äâ¦Ú8køO žA÷õiš4Š?%úU‚öNG(B©&? +E£Ñ^³™O!M”¹™W”ù*c—ùöGΙ| +úè MK75¥¯œ;è’0<ß_ÓnUàóA¥€Ï‡2¾>>ä Ô3 åóãÉ”‹žÚx –¶ëÁøîã'Ñ7@ýcšfQ+.IR­¯l“O(ŠbϧG9ö'o™Éͼ(¶ðU*#ó‰]Òð¾¶ +飺÷c¤Ù ©)½r³å’0'Üpªv=«ZÀçƒJñÛ={^TÕ‰5«vÊ–`œÔ;[·¢72Ô‚=l'_y•S㤎=ZôÊÒ:HÈHÎ@h(ŸO4wº*ÔäáÔAh8+Š¢ëz­”¸iš²,—gò[–ÏØfŽ]_õe§™·¬Sìÿ+&󉘑ÙÝ.)ó‡g ##ó¿pÁß]RedW­¼I>€2ȪwEƒPÿ8_@xQUÑ  @ÝÂýs¥²8*¥=Äçïít‘T;%0Ä@m1 CUUMÓ<®/IR(¢ñKcY×uÓ4k{üÌä—é,‚Y–Ï9ª§· +ÆÓç¯ãrž›ùJÊür‘åŒÏŸýpÂ%UÎY;@ëOÀçPÐGøøü ‚„  nϯR{6ˆÏ?1xÆER5wZb`œ1MSÓ4EQh :S“ê·Û+:‹¬S( Q Ãh„+nY§B¡×¸œ×´v¶¼d¾e¥!ãó×´Å\RåEá$­¼ËŸ@@à;àóƒ +2€º>¿JíÙ >ŸØxÀÍSÅ“)Œ2Pm,Ë¢¡GƒN—Ju_œ‹išŠ¢¸œHQ軾{x1Âá-\Î+ʇ™EI«d>Aס©)ýÅ Ýž{FvõÑ:¡ Þ#ÂçPÐGøøü ‚„  n1M3ZY–¥ž‘HDÓ4þ¿¬––;Ë_i¹eYÜž èówK¸¨ª½½ƒe ÚH’䮸iÊuu~º®¥ Ÿ™|JA–„¹œ‡·d>'-ù¦ï—!ó5­×öW +šššÒ³vK’ô¿´Ž¢ðÒÀçPÐGøøü ‚„ ÀwhšÆ‘{É=ý/³ú´¦a Þn èó{N»¨ªÖƒqŒ&Pmr58%%EQ(ÕRÒu]–å±ä3h#ŸY¨ª$í/Š-MM?¢-ë”w™ +½æ”ù¼ž_U?®à±ÉrÆç¯is{‰é‹ž¡uêþqS9ÀçPÐGøøü ‚„ À_X–ÅäýëEÑú\é£>¿Ñ|>¡îës±UC©³SÀ;ÑhT×õˆûÃDŽa’$ɲÌÞòÅiVJã³lãñ±ÏÕÌÿ¨ÏÉÈütZžûS/2Xþ·É©px ÿ¯Hä£ +XÊ0ZÂßvIkÚbMMiQ ìX†Ï T ððùA €¿PU•Ý€kšæñ+¦i²¯D"‘FnºÆôùm‡\„Õþφ0¦üE,ëèèèîîN¥RUÝå ¦îeY¦!“+·iI–Η²«$IM‚Íýù…óR† +…øwé0ÖoßøáKeÈ|VÞÏBÖ;‹öÇΙhtóóoº¤ÇÙ'ššÒ^nýÇmTVø|ÊúߟTø ®›J*¶geŸbP ½Ñ˜>¿+žtVÛõcLù‹ŽŽŽv›D"Q½½8]Ÿ ~oLÊ¢¬ßéÒÇmÐKM>¿”mmmÎÇ%”¨ö.•ñî3c”ùâ—VO_îTÇr»Ÿ¤Œwbð ûO¦\r#Å/:×O$…d¾³Ì»Y[Ë mŠ% Qi¼Ð1ÐñÐKJ;õ9‚$I^Ú§ h³´ýR§¯¯oÉ’%Y‚Ö¹iâ—VUFæSü^)û@6ˆeù|u_ŸKb|èñ¿<þîpæl=wßx*•*4*ëyPÀçP*ÐGøøü ‚„ À_(ŠÂnÀ#‘ˆÇ¯˜¦É¾ +5ôLÇ}¾ eT,³Æ»â}SYUÓ¹¨žpjšÍãïþši¨çö˜ôñ»?Þ⢭Ú°íœ<Óz0N#…1 ÃãQÑšQW¼ËO^s>öM9*ï zqݯ ÇÎàQÂ{iy§ s1Ï>uò%Aç¨ë:°MÕ„¶O°Œ#¤ šõ‚€êë{ÌùNÌ'Ý^1™¿§ü‡¼8Ÿ‚½¸ä\’‘]}Ñ>ãw?¼1Ÿ@@à;àóƒ +2¡ë:÷r^ŸeYܰø³¸Ï/¯bÙ‹,­ì¦¼\_Z'÷‹n¸ƒ›¨/\ð.æJÝ×Ç6Õz0ΖÐ×]ŽÊ‹ Î{Tå‰e/ºÛ㦼•ÇÿÎàeSÎÁ +…ø“øüE€e>š¦it²üu¤êA]Žv4–Æt>h ­•÷P .HZéíbÆ·ïýÞSÌИ^’Ì·‡Ã‘ŠË|¢¹ÓbÉmãXÖ’¼ñÝ–£NáO¦‚7^àó(è#||~PABà;¸­*jè†ÝYÚu¹.¸øüq¶Á7UvIöç>ÿ?¸‰š¾t -yâW†‹¼:1x&íðù ž³~u}nª‚Á²¬¼þÙù‰÷÷>ñtø ʨ´Gºjcß|sŠpþº¢>_×?ÍݤñáÑïüS¥d~Úñ¤’ç·pɇo:|¸÷ïY‚|>e}€ï€Ï*HÈüˆa%Õ£Bæ§>ߣþõ5]ñ¤³üžÂÅ_1ÍO¦¯°€‰F£”ÁdY.úd§þ5~ HZé­Â°u§?#­Ô©†ÿeYQ™‰|”³|›•ùÎRüÝÇOÒ’¡ÔY÷âüWßèu>ܤõƒ:¬àó(è#||~PABàS,ËŠD"E+TC¡÷¢ñ`ÓP>ŸP÷õ9Ëï7ˆ¹(¬žÓ´Ns§Å>n;ÔjE >AIU’$MÓ ñ‹°K:'Þ;UË:e½é„];¡¨Ì—$½àf+'óÓŽâ|ʇÌÌï>~Ò%®i‹uV#dBø|ÊúߟTø˲4MË_ápXQ˜|'æóÛ8ËïwK¸X,Z™Öi„ªTP‡ÔVàó´@)Â0 \OÕω÷]’e„õQÿ ¥hq¾(¶Ðú·|HK \ No newline at end of file diff --git a/libs/zlibng/test/example.c b/libs/zlibng/test/example.c index 964a380d7..97ca0029b 100644 --- a/libs/zlibng/test/example.c +++ b/libs/zlibng/test/example.c @@ -3,20 +3,20 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - #include "zbuild.h" #ifdef ZLIB_COMPAT # include "zlib.h" #else # include "zlib-ng.h" #endif +#include "deflate.h" #include #include #include #include +#include #define TESTFILE "foo.gz" @@ -40,7 +40,7 @@ void test_compress (unsigned char *compr, z_size_t comprLen,unsigned char * void test_gzio (const char *fname, unsigned char *uncompr, z_size_t uncomprLen); void test_deflate (unsigned char *compr, size_t comprLen); void test_inflate (unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen); -void test_large_deflate (unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen); +void test_large_deflate (unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen, int zng_params); void test_large_inflate (unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen); void test_flush (unsigned char *compr, z_size_t *comprLen); void test_sync (unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen); @@ -55,8 +55,7 @@ static free_func zfree = NULL; /* =========================================================================== * Test compress() and uncompress() */ -void test_compress(unsigned char *compr, z_size_t comprLen, unsigned char *uncompr, z_size_t uncomprLen) -{ +void test_compress(unsigned char *compr, z_size_t comprLen, unsigned char *uncompr, z_size_t uncomprLen) { int err; size_t len = strlen(hello)+1; @@ -79,21 +78,24 @@ void test_compress(unsigned char *compr, z_size_t comprLen, unsigned char *uncom /* =========================================================================== * Test read/write of .gz files */ -void test_gzio(const char *fname, unsigned char *uncompr, z_size_t uncomprLen) -{ +void test_gzio(const char *fname, unsigned char *uncompr, z_size_t uncomprLen) { #ifdef NO_GZCOMPRESS fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); #else int err; - int len = (int)strlen(hello)+1; + size_t read; + size_t len = strlen(hello)+1; gzFile file; - z_off_t pos; + z_off64_t pos; + z_off64_t comprLen; + /* Write gz file with test data */ file = PREFIX(gzopen)(fname, "wb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } + /* Write hello, hello! using gzputs and gzprintf */ PREFIX(gzputc)(file, 'h'); if (PREFIX(gzputs)(file, "ello") != 4) { fprintf(stderr, "gzputs err: %s\n", PREFIX(gzerror)(file, &err)); @@ -103,17 +105,42 @@ void test_gzio(const char *fname, unsigned char *uncompr, z_size_t uncomprLen) fprintf(stderr, "gzprintf err: %s\n", PREFIX(gzerror)(file, &err)); exit(1); } - PREFIX(gzseek)(file, 1L, SEEK_CUR); /* add one zero byte */ + /* Write string null-teriminator using gzseek */ + if (PREFIX(gzseek)(file, 1L, SEEK_CUR) < 0) + { + fprintf(stderr, "gzseek error, gztell=%ld\n", (long)PREFIX(gztell)(file)); + exit(1); + } + /* Write hello, hello! using gzfwrite using best compression level */ + if (PREFIX(gzsetparams)(file, Z_BEST_COMPRESSION, Z_DEFAULT_STRATEGY) != Z_OK) { + fprintf(stderr, "gzsetparams err: %s\n", PREFIX(gzerror)(file, &err)); + exit(1); + } + if (PREFIX(gzfwrite)(hello, len, 1, file) == 0) { + fprintf(stderr, "gzfwrite err: %s\n", PREFIX(gzerror)(file, &err)); + exit(1); + } + /* Flush compressed bytes to file */ + if (PREFIX(gzflush)(file, Z_SYNC_FLUSH) != Z_OK) { + fprintf(stderr, "gzflush err: %s\n", PREFIX(gzerror)(file, &err)); + exit(1); + } + comprLen = PREFIX(gzoffset)(file); + if (comprLen <= 0) { + fprintf(stderr, "gzoffset err: %s\n", PREFIX(gzerror)(file, &err)); + exit(1); + } PREFIX(gzclose)(file); + /* Open gz file we previously wrote */ file = PREFIX(gzopen)(fname, "rb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } - strcpy((char*)uncompr, "garbage"); - - if (PREFIX(gzread)(file, uncompr, (unsigned)uncomprLen) != len) { + /* Read uncompressed data - hello, hello! string twice */ + strcpy((char*)uncompr, "garbages"); + if (PREFIX(gzread)(file, uncompr, (unsigned)uncomprLen) != (int)(len + len)) { fprintf(stderr, "gzread err: %s\n", PREFIX(gzerror)(file, &err)); exit(1); } @@ -123,24 +150,28 @@ void test_gzio(const char *fname, unsigned char *uncompr, z_size_t uncomprLen) } else { printf("gzread(): %s\n", (char*)uncompr); } - - pos = PREFIX(gzseek)(file, -8L, SEEK_CUR); + /* Check position at the end of the gz file */ + if (PREFIX(gzeof)(file) != 1) { + fprintf(stderr, "gzeof err: not reporting end of stream\n"); + exit(1); + } + /* Seek backwards mid-string and check char reading with gzgetc and gzungetc */ + pos = PREFIX(gzseek)(file, -22L, SEEK_CUR); if (pos != 6 || PREFIX(gztell)(file) != pos) { fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", (long)pos, (long)PREFIX(gztell)(file)); exit(1); } - if (PREFIX(gzgetc)(file) != ' ') { fprintf(stderr, "gzgetc error\n"); exit(1); } - if (PREFIX(gzungetc)(' ', file) != ' ') { fprintf(stderr, "gzungetc error\n"); exit(1); } - + /* Read first hello, hello! string with gzgets */ + strcpy((char*)uncompr, "garbages"); PREFIX(gzgets)(file, (char*)uncompr, (int)uncomprLen); if (strlen((char*)uncompr) != 7) { /* " hello!" */ fprintf(stderr, "gzgets err after gzseek: %s\n", PREFIX(gzerror)(file, &err)); @@ -152,19 +183,63 @@ void test_gzio(const char *fname, unsigned char *uncompr, z_size_t uncomprLen) } else { printf("gzgets() after gzseek: %s\n", (char*)uncompr); } + /* Seek to second hello, hello! string */ + pos = PREFIX(gzseek)(file, 14L, SEEK_SET); + if (pos != 14 || PREFIX(gztell)(file) != pos) { + fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", + (long)pos, (long)PREFIX(gztell)(file)); + exit(1); + } + /* Check position not at end of file */ + if (PREFIX(gzeof)(file) != 0) { + fprintf(stderr, "gzeof err: reporting end of stream\n"); + exit(1); + } + /* Read first hello, hello! string with gzfread */ + strcpy((char*)uncompr, "garbages"); + read = PREFIX(gzfread)(uncompr, uncomprLen, 1, file); + if (strcmp((const char *)uncompr, hello) != 0) { + fprintf(stderr, "bad gzgets\n"); + exit(1); + } else { + printf("gzgets(): %s\n", (char*)uncompr); + } + pos = PREFIX(gzoffset)(file); + if (pos < 0 || pos != (comprLen + 10)) { + fprintf(stderr, "gzoffset err: wrong offset at end\n"); + exit(1); + } + /* Trigger an error and clear it with gzclearerr */ + PREFIX(gzfread)(uncompr, (size_t)-1, (size_t)-1, file); + PREFIX(gzerror)(file, &err); + if (err == 0) { + fprintf(stderr, "gzerror err: no error returned\n"); + exit(1); + } + PREFIX(gzclearerr)(file); + PREFIX(gzerror)(file, &err); + if (err != 0) { + fprintf(stderr, "gzclearerr err: not zero %d\n", err); + exit(1); + } PREFIX(gzclose)(file); + + if (PREFIX(gzclose)(NULL) != Z_STREAM_ERROR) { + fprintf(stderr, "gzclose unexpected return when handle null\n"); + exit(1); + } + (void)read; #endif } /* =========================================================================== * Test deflate() with small buffers */ -void test_deflate(unsigned char *compr, size_t comprLen) -{ +void test_deflate(unsigned char *compr, size_t comprLen) { PREFIX3(stream) c_stream; /* compression stream */ int err; - unsigned long len = (unsigned long)strlen(hello)+1; + size_t len = strlen(hello)+1; c_stream.zalloc = zalloc; c_stream.zfree = zfree; @@ -175,7 +250,7 @@ void test_deflate(unsigned char *compr, size_t comprLen) err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (const unsigned char *)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.next_out = compr; while (c_stream.total_in != len && c_stream.total_out < comprLen) { @@ -198,8 +273,7 @@ void test_deflate(unsigned char *compr, size_t comprLen) /* =========================================================================== * Test inflate() with small buffers */ -void test_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) -{ +void test_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { int err; PREFIX3(stream) d_stream; /* decompression stream */ @@ -241,10 +315,22 @@ static unsigned int diff; /* =========================================================================== * Test deflate() with large buffers and dynamic change of compression level */ -void test_large_deflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) -{ +void test_large_deflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen, int zng_params) { PREFIX3(stream) c_stream; /* compression stream */ int err; +#ifndef ZLIB_COMPAT + int level = -1; + int strategy = -1; + zng_deflate_param_value params[2]; + + params[0].param = Z_DEFLATE_LEVEL; + params[0].buf = &level; + params[0].size = sizeof(level); + + params[1].param = Z_DEFLATE_STRATEGY; + params[1].buf = &strategy; + params[1].size = sizeof(strategy); +#endif c_stream.zalloc = zalloc; c_stream.zfree = zfree; @@ -269,7 +355,27 @@ void test_large_deflate(unsigned char *compr, size_t comprLen, unsigned char *un } /* Feed in already compressed data and switch to no compression: */ - PREFIX(deflateParams)(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + if (zng_params) { +#ifndef ZLIB_COMPAT + zng_deflateGetParams(&c_stream, params, sizeof(params) / sizeof(params[0])); + if (level != Z_BEST_SPEED) { + fprintf(stderr, "Expected compression level Z_BEST_SPEED, got %d\n", level); + exit(1); + } + if (strategy != Z_DEFAULT_STRATEGY) { + fprintf(stderr, "Expected compression strategy Z_DEFAULT_STRATEGY, got %d\n", strategy); + exit(1); + } + level = Z_NO_COMPRESSION; + strategy = Z_DEFAULT_STRATEGY; + zng_deflateSetParams(&c_stream, params, sizeof(params) / sizeof(params[0])); +#else + fprintf(stderr, "test_large_deflate() called with zng_params=1 in compat mode\n"); + exit(1); +#endif + } else { + PREFIX(deflateParams)(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + } c_stream.next_in = compr; diff = (unsigned int)(c_stream.next_out - compr); c_stream.avail_in = diff; @@ -277,7 +383,29 @@ void test_large_deflate(unsigned char *compr, size_t comprLen, unsigned char *un CHECK_ERR(err, "deflate"); /* Switch back to compressing mode: */ - PREFIX(deflateParams)(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + if (zng_params) { +#ifndef ZLIB_COMPAT + level = -1; + strategy = -1; + zng_deflateGetParams(&c_stream, params, sizeof(params) / sizeof(params[0])); + if (level != Z_NO_COMPRESSION) { + fprintf(stderr, "Expected compression level Z_NO_COMPRESSION, got %d\n", level); + exit(1); + } + if (strategy != Z_DEFAULT_STRATEGY) { + fprintf(stderr, "Expected compression strategy Z_DEFAULT_STRATEGY, got %d\n", strategy); + exit(1); + } + level = Z_BEST_COMPRESSION; + strategy = Z_FILTERED; + zng_deflateSetParams(&c_stream, params, sizeof(params) / sizeof(params[0])); +#else + fprintf(stderr, "test_large_deflate() called with zng_params=1 in compat mode\n"); + exit(1); +#endif + } else { + PREFIX(deflateParams)(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + } c_stream.next_in = uncompr; c_stream.avail_in = (unsigned int)uncomprLen; err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); @@ -295,8 +423,7 @@ void test_large_deflate(unsigned char *compr, size_t comprLen, unsigned char *un /* =========================================================================== * Test inflate() with large buffers */ -void test_large_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) -{ +void test_large_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { int err; PREFIX3(stream) d_stream; /* decompression stream */ @@ -326,7 +453,7 @@ void test_large_inflate(unsigned char *compr, size_t comprLen, unsigned char *un CHECK_ERR(err, "inflateEnd"); if (d_stream.total_out != 2*uncomprLen + diff) { - fprintf(stderr, "bad large inflate: %zu\n", d_stream.total_out); + fprintf(stderr, "bad large inflate: %" PRIu64 "\n", (uint64_t)d_stream.total_out); exit(1); } else { printf("large_inflate(): OK\n"); @@ -336,8 +463,7 @@ void test_large_inflate(unsigned char *compr, size_t comprLen, unsigned char *un /* =========================================================================== * Test deflate() with full flush */ -void test_flush(unsigned char *compr, z_size_t *comprLen) -{ +void test_flush(unsigned char *compr, z_size_t *comprLen) { PREFIX3(stream) c_stream; /* compression stream */ int err; unsigned int len = (unsigned int)strlen(hello)+1; @@ -349,7 +475,7 @@ void test_flush(unsigned char *compr, z_size_t *comprLen) err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (const unsigned char *)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.next_out = compr; c_stream.avail_in = 3; c_stream.avail_out = (unsigned int)*comprLen; @@ -372,8 +498,7 @@ void test_flush(unsigned char *compr, z_size_t *comprLen) /* =========================================================================== * Test inflateSync() */ -void test_sync(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) -{ +void test_sync(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { int err; PREFIX3(stream) d_stream; /* decompression stream */ @@ -400,9 +525,8 @@ void test_sync(unsigned char *compr, size_t comprLen, unsigned char *uncompr, si CHECK_ERR(err, "inflateSync"); err = PREFIX(inflate)(&d_stream, Z_FINISH); - if (err != Z_DATA_ERROR) { - fprintf(stderr, "inflate should report DATA_ERROR\n"); - /* Because of incorrect adler32 */ + if (err != Z_STREAM_END) { + fprintf(stderr, "inflate should report Z_STREAM_END\n"); exit(1); } err = PREFIX(inflateEnd)(&d_stream); @@ -414,8 +538,7 @@ void test_sync(unsigned char *compr, size_t comprLen, unsigned char *uncompr, si /* =========================================================================== * Test deflate() with preset dictionary */ -void test_dict_deflate(unsigned char *compr, size_t comprLen) -{ +void test_dict_deflate(unsigned char *compr, size_t comprLen) { PREFIX3(stream) c_stream; /* compression stream */ int err; @@ -435,7 +558,7 @@ void test_dict_deflate(unsigned char *compr, size_t comprLen) c_stream.next_out = compr; c_stream.avail_out = (unsigned int)comprLen; - c_stream.next_in = (const unsigned char *)hello; + c_stream.next_in = (z_const unsigned char *)hello; c_stream.avail_in = (unsigned int)strlen(hello)+1; err = PREFIX(deflate)(&c_stream, Z_FINISH); @@ -450,8 +573,7 @@ void test_dict_deflate(unsigned char *compr, size_t comprLen) /* =========================================================================== * Test inflate() with a preset dictionary */ -void test_dict_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) -{ +void test_dict_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { int err; PREFIX3(stream) d_stream; /* decompression stream */ @@ -495,12 +617,392 @@ void test_dict_inflate(unsigned char *compr, size_t comprLen, unsigned char *unc } } +/* =========================================================================== + * Test deflateBound() with small buffers + */ +void test_deflate_bound(void) { + PREFIX3(stream) c_stream; /* compression stream */ + int err; + unsigned int len = (unsigned int)strlen(hello)+1; + int estimateLen = 0; + unsigned char *outBuf = NULL; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + c_stream.avail_in = len; + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.avail_out = 0; + c_stream.next_out = outBuf; + + err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + /* calculate actual output length and update structure */ + estimateLen = PREFIX(deflateBound)(&c_stream, len); + outBuf = malloc(estimateLen); + + if (outBuf != NULL) { + /* update zlib configuration */ + c_stream.avail_out = estimateLen; + c_stream.next_out = outBuf; + + /* do the compression */ + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) { + printf("deflateBound(): OK\n"); + } else { + CHECK_ERR(err, "deflate"); + } + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + free(outBuf); +} + +/* =========================================================================== + * Test deflateCopy() with small buffers + */ +void test_deflate_copy(unsigned char *compr, size_t comprLen) { + PREFIX3(stream) c_stream, c_stream_copy; /* compression stream */ + int err; + size_t len = strlen(hello)+1; + + memset(&c_stream, 0, sizeof(c_stream)); + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = PREFIX(deflateCopy)(&c_stream_copy, &c_stream); + CHECK_ERR(err, "deflate_copy"); + + if (c_stream.state->status == c_stream_copy.state->status) { + printf("deflate_copy(): OK\n"); + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd original"); + + err = PREFIX(deflateEnd)(&c_stream_copy); + CHECK_ERR(err, "deflateEnd copy"); +} + +/* =========================================================================== + * Test deflateGetDictionary() with small buffers + */ +void test_deflate_get_dict(unsigned char *compr, size_t comprLen) { + PREFIX3(stream) c_stream; /* compression stream */ + int err; + unsigned char *dictNew = NULL; + unsigned int *dictLen; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = PREFIX(deflateInit)(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.avail_in = (unsigned int)strlen(hello)+1; + + err = PREFIX(deflate)(&c_stream, Z_FINISH); + + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + + dictNew = calloc(256, 1); + dictLen = (unsigned int *)calloc(4, 1); + err = PREFIX(deflateGetDictionary)(&c_stream, dictNew, dictLen); + + CHECK_ERR(err, "deflateGetDictionary"); + if (err == Z_OK) { + printf("deflateGetDictionary(): %s\n", dictNew); + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + free(dictNew); + free(dictLen); +} + +/* =========================================================================== + * Test deflatePending() with small buffers + */ +void test_deflate_pending(unsigned char *compr, size_t comprLen) { + PREFIX3(stream) c_stream; /* compression stream */ + int err; + int *bits = calloc(256, 1); + unsigned *ped = calloc(256, 1); + size_t len = strlen(hello)+1; + + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + + err = PREFIX(deflatePending)(&c_stream, ped, bits); + CHECK_ERR(err, "deflatePending"); + + if (*bits >= 0 && *bits <= 7) { + printf("deflatePending(): OK\n"); + } else { + printf("deflatePending(): error\n"); + } + + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + free(bits); + free(ped); +} + +/* =========================================================================== + * Test deflatePrime() wrapping gzip around deflate stream + */ +void test_deflate_prime(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { + PREFIX3(stream) c_stream; /* compression stream */ + PREFIX3(stream) d_stream; /* decompression stream */ + int err; + size_t len = strlen(hello)+1; + uint32_t crc = 0; + + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + /* Raw deflate windowBits is -15 */ + err = PREFIX(deflateInit2)(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); + CHECK_ERR(err, "deflateInit2"); + + /* Gzip magic number */ + err = PREFIX(deflatePrime)(&c_stream, 16, 0x8b1f); + CHECK_ERR(err, "deflatePrime"); + /* Gzip compression method (deflate) */ + err = PREFIX(deflatePrime)(&c_stream, 8, 0x08); + CHECK_ERR(err, "deflatePrime"); + /* Gzip flags (one byte, using two odd bit calls) */ + err = PREFIX(deflatePrime)(&c_stream, 3, 0x0); + CHECK_ERR(err, "deflatePrime"); + err = PREFIX(deflatePrime)(&c_stream, 5, 0x0); + CHECK_ERR(err, "deflatePrime"); + /* Gzip modified time */ + err = PREFIX(deflatePrime)(&c_stream, 32, 0x0); + CHECK_ERR(err, "deflatePrime"); + /* Gzip extra flags */ + err = PREFIX(deflatePrime)(&c_stream, 8, 0x0); + CHECK_ERR(err, "deflatePrime"); + /* Gzip operating system */ + err = PREFIX(deflatePrime)(&c_stream, 8, 255); + CHECK_ERR(err, "deflatePrime"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.avail_in = (uint32_t)len; + c_stream.next_out = compr; + c_stream.avail_out = (uint32_t)comprLen; + + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) + CHECK_ERR(err, "deflate"); + + /* Gzip uncompressed data crc32 */ + crc = PREFIX(crc32)(0, (const uint8_t *)hello, (uint32_t)len); + err = PREFIX(deflatePrime)(&c_stream, 32, crc); + CHECK_ERR(err, "deflatePrime"); + /* Gzip uncompressed data length */ + err = PREFIX(deflatePrime)(&c_stream, 32, (uint32_t)len); + CHECK_ERR(err, "deflatePrime"); + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (void *)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uint32_t)c_stream.total_out; + d_stream.next_out = uncompr; + d_stream.avail_out = (uint32_t)uncomprLen; + d_stream.total_in = 0; + d_stream.total_out = 0; + + /* Inflate with gzip header */ + err = PREFIX(inflateInit2)(&d_stream, MAX_WBITS + 32); + CHECK_ERR(err, "inflateInit"); + + err = PREFIX(inflate)(&d_stream, Z_FINISH); + if (err != Z_BUF_ERROR) { + CHECK_ERR(err, "inflate"); + } + + err = PREFIX(inflateEnd)(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((const char *)uncompr, hello) != 0) { + fprintf(stderr, "bad deflatePrime\n"); + exit(1); + } + + if (err == Z_OK) { + printf("deflatePrime(): OK\n"); + } +} + +/* =========================================================================== + * Test deflateSetHeader() with small buffers + */ +void test_deflate_set_header(unsigned char *compr, size_t comprLen) { + PREFIX(gz_header) *head = calloc(1, sizeof(PREFIX(gz_header))); + PREFIX3(stream) c_stream; /* compression stream */ + int err; + size_t len = strlen(hello)+1; + + + if (head == NULL) { + printf("out of memory\n"); + exit(1); + } + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + /* gzip */ + err = PREFIX(deflateInit2)(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY); + CHECK_ERR(err, "deflateInit2"); + + head->text = 1; + err = PREFIX(deflateSetHeader)(&c_stream, head); + CHECK_ERR(err, "deflateSetHeader"); + if (err == Z_OK) { + printf("deflateSetHeader(): OK\n"); + } + + c_stream.next_in = (unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + free(head); +} + +/* =========================================================================== + * Test deflateTune() with small buffers + */ +void test_deflate_tune(unsigned char *compr, size_t comprLen) { + PREFIX3(stream) c_stream; /* compression stream */ + int err; + int good_length = 3; + int max_lazy = 5; + int nice_length = 18; + int max_chain = 6; + size_t len = strlen(hello)+1; + + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = PREFIX(deflateInit)(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + err = PREFIX(deflateTune)(&c_stream,(uInt)good_length,(uInt)max_lazy,nice_length,(uInt)max_chain); + CHECK_ERR(err, "deflateTune"); + if (err == Z_OK) { + printf("deflateTune(): OK\n"); + } + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + /* =========================================================================== * Usage: example [output.gz [input.gz]] */ - -int main(int argc, char *argv[]) -{ +int main(int argc, char *argv[]) { unsigned char *compr, *uncompr; z_size_t comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ z_size_t uncomprLen = comprLen; @@ -535,9 +1037,14 @@ int main(int argc, char *argv[]) test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); - test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_deflate(compr, comprLen, uncompr, uncomprLen, 0); test_large_inflate(compr, comprLen, uncompr, uncomprLen); +#ifndef ZLIB_COMPAT + test_large_deflate(compr, comprLen, uncompr, uncomprLen, 1); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); +#endif + test_flush(compr, &comprLen); test_sync(compr, comprLen, uncompr, uncomprLen); comprLen = uncomprLen; @@ -545,6 +1052,14 @@ int main(int argc, char *argv[]) test_dict_deflate(compr, comprLen); test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + test_deflate_bound(); + test_deflate_copy(compr, comprLen); + test_deflate_get_dict(compr, comprLen); + test_deflate_set_header(compr, comprLen); + test_deflate_tune(compr, comprLen); + test_deflate_pending(compr, comprLen); + test_deflate_prime(compr, comprLen, uncompr, uncomprLen); + free(compr); free(uncompr); diff --git a/libs/zlibng/test/fuzz/checksum_fuzzer.c b/libs/zlibng/test/fuzz/checksum_fuzzer.c index 10fc138fb..ef9942111 100644 --- a/libs/zlibng/test/fuzz/checksum_fuzzer.c +++ b/libs/zlibng/test/fuzz/checksum_fuzzer.c @@ -14,60 +14,73 @@ #endif int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) { - uint32_t crc0 = PREFIX(crc32)(0L, NULL, 0); - uint32_t crc1 = crc0; - uint32_t crc2 = crc0; - uint32_t adler0 = PREFIX(adler32)(0L, NULL, 0); - uint32_t adler1 = adler0; - uint32_t adler2 = adler0; - /* Checksum with a buffer of size equal to the first byte in the input. */ - uint32_t buffSize = data[0]; - uint32_t offset = 0; - uint32_t op[32]; + uint32_t crc0 = PREFIX(crc32)(0L, NULL, 0); + uint32_t crc1 = crc0; + uint32_t crc2 = crc0; + uint32_t adler0 = PREFIX(adler32)(0L, NULL, 0); + uint32_t adler1 = adler0; + uint32_t adler2 = adler0; + uint32_t combine1, combine2; + /* Checksum with a buffer of size equal to the first byte in the input. */ + uint32_t buffSize = data[0]; + uint32_t offset = 0; + uint32_t op[32]; - /* Discard inputs larger than 1Mb. */ - static size_t kMaxSize = 1024 * 1024; - if (dataLen < 1 || dataLen > kMaxSize) + /* Discard inputs larger than 1Mb. */ + static size_t kMaxSize = 1024 * 1024; + if (dataLen < 1 || dataLen > kMaxSize) + return 0; + + /* Make sure the buffer has at least a byte. */ + if (buffSize == 0) + ++buffSize; + + /* CRC32 */ + PREFIX(crc32_combine_gen)(op, buffSize); + for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) { + uint32_t crc3 = PREFIX(crc32_z)(crc0, data + offset, buffSize); + uint32_t crc4 = PREFIX(crc32_combine_op)(crc1, crc3, op); + crc1 = PREFIX(crc32_z)(crc1, data + offset, buffSize); + assert(crc1 == crc4); + (void)crc1; + (void)crc4; + } + crc1 = PREFIX(crc32_z)(crc1, data + offset, dataLen % buffSize); + + crc2 = PREFIX(crc32_z)(crc2, data, dataLen); + + assert(crc1 == crc2); + (void)crc1; + (void)crc2; + combine1 = PREFIX(crc32_combine)(crc1, crc2, (z_off_t)dataLen); + combine2 = PREFIX(crc32_combine)(crc1, crc1, (z_off_t)dataLen); + assert(combine1 == combine2); + + /* Fast CRC32 combine. */ + PREFIX(crc32_combine_gen)(op, (z_off_t)dataLen); + combine1 = PREFIX(crc32_combine_op)(crc1, crc2, op); + combine2 = PREFIX(crc32_combine_op)(crc2, crc1, op); + assert(combine1 == combine2); + combine1 = PREFIX(crc32_combine)(crc1, crc2, (z_off_t)dataLen); + combine2 = PREFIX(crc32_combine_op)(crc2, crc1, op); + assert(combine1 == combine2); + + /* Adler32 */ + for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) + adler1 = PREFIX(adler32_z)(adler1, data + offset, buffSize); + adler1 = PREFIX(adler32_z)(adler1, data + offset, dataLen % buffSize); + + adler2 = PREFIX(adler32_z)(adler2, data, dataLen); + + assert(adler1 == adler2); + (void)adler1; + (void)adler2; + combine1 = PREFIX(adler32_combine)(adler1, adler2, (z_off_t)dataLen); + combine2 = PREFIX(adler32_combine)(adler1, adler1, (z_off_t)dataLen); + assert(combine1 == combine2); + (void)combine1; + (void)combine2; + + /* This function must return 0. */ return 0; - - /* Make sure the buffer has at least a byte. */ - if (buffSize == 0) - ++buffSize; - - /* CRC32 */ - PREFIX(crc32_combine_gen)(op, buffSize); - for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) { - uint32_t crc3 = PREFIX(crc32_z)(crc0, data + offset, buffSize); - uint32_t crc4 = PREFIX(crc32_combine_op)(crc1, crc3, op); - crc1 = PREFIX(crc32_z)(crc1, data + offset, buffSize); - assert(crc1 == crc4); - } - crc1 = PREFIX(crc32_z)(crc1, data + offset, dataLen % buffSize); - - crc2 = PREFIX(crc32_z)(crc2, data, dataLen); - - assert(crc1 == crc2); - assert(PREFIX(crc32_combine)(crc1, crc2, dataLen) == - PREFIX(crc32_combine)(crc1, crc1, dataLen)); - - /* Fast CRC32 combine. */ - PREFIX(crc32_combine_gen)(op, dataLen); - assert(PREFIX(crc32_combine_op)(crc1, crc2, op) == - PREFIX(crc32_combine_op)(crc2, crc1, op)); - assert(PREFIX(crc32_combine)(crc1, crc2, dataLen) == - PREFIX(crc32_combine_op)(crc2, crc1, op)); - - /* Adler32 */ - for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) - adler1 = PREFIX(adler32_z)(adler1, data + offset, buffSize); - adler1 = PREFIX(adler32_z)(adler1, data + offset, dataLen % buffSize); - - adler2 = PREFIX(adler32_z)(adler2, data, dataLen); - - assert(adler1 == adler2); - assert(PREFIX(adler32_combine)(adler1, adler2, dataLen) == - PREFIX(adler32_combine)(adler1, adler1, dataLen)); - - /* This function must return 0. */ - return 0; } diff --git a/libs/zlibng/test/fuzz/compress_fuzzer.c b/libs/zlibng/test/fuzz/compress_fuzzer.c index e2ccf7177..9712e882a 100644 --- a/libs/zlibng/test/fuzz/compress_fuzzer.c +++ b/libs/zlibng/test/fuzz/compress_fuzzer.c @@ -16,72 +16,72 @@ static const uint8_t *data; static size_t dataLen; -static void check_compress_level(uint8_t *compr, size_t comprLen, - uint8_t *uncompr, size_t uncomprLen, +static void check_compress_level(uint8_t *compr, z_size_t comprLen, + uint8_t *uncompr, z_size_t uncomprLen, int level) { - PREFIX(compress2)(compr, &comprLen, data, dataLen, level); - PREFIX(uncompress)(uncompr, &uncomprLen, compr, comprLen); + PREFIX(compress2)(compr, &comprLen, data, dataLen, level); + PREFIX(uncompress)(uncompr, &uncomprLen, compr, comprLen); - /* Make sure compress + uncompress gives back the input data. */ - assert(dataLen == uncomprLen); - assert(0 == memcmp(data, uncompr, dataLen)); + /* Make sure compress + uncompress gives back the input data. */ + assert(dataLen == uncomprLen); + assert(0 == memcmp(data, uncompr, dataLen)); } #define put_byte(s, i, c) {s[i] = (unsigned char)(c);} static void write_zlib_header(uint8_t *s) { - unsigned level_flags = 0; /* compression level (0..3) */ - unsigned w_bits = 8; /* window size log2(w_size) (8..16) */ - unsigned int header = (Z_DEFLATED + ((w_bits-8)<<4)) << 8; - header |= (level_flags << 6); + unsigned level_flags = 0; /* compression level (0..3) */ + unsigned w_bits = 8; /* window size log2(w_size) (8..16) */ + unsigned int header = (Z_DEFLATED + ((w_bits-8)<<4)) << 8; + header |= (level_flags << 6); - header += 31 - (header % 31); + header += 31 - (header % 31); - /* s is guaranteed to be longer than 2 bytes. */ - put_byte(s, 0, (unsigned char)(header >> 8)); - put_byte(s, 1, (unsigned char)(header & 0xff)); + /* s is guaranteed to be longer than 2 bytes. */ + put_byte(s, 0, (header >> 8)); + put_byte(s, 1, (header & 0xff)); } static void check_decompress(uint8_t *compr, size_t comprLen) { - /* We need to write a valid zlib header of size two bytes. Copy the input data - in a larger buffer. Do not modify the input data to avoid libFuzzer error: - fuzz target overwrites its const input. */ - size_t copyLen = dataLen + 2; - uint8_t *copy = (uint8_t *)malloc(copyLen); - memcpy(copy + 2, data, dataLen); - write_zlib_header(copy); + /* We need to write a valid zlib header of size two bytes. Copy the input data + in a larger buffer. Do not modify the input data to avoid libFuzzer error: + fuzz target overwrites its const input. */ + size_t copyLen = dataLen + 2; + uint8_t *copy = (uint8_t *)malloc(copyLen); + memcpy(copy + 2, data, dataLen); + write_zlib_header(copy); - PREFIX(uncompress)(compr, &comprLen, copy, copyLen); - free(copy); + PREFIX(uncompress)(compr, &comprLen, copy, copyLen); + free(copy); } int LLVMFuzzerTestOneInput(const uint8_t *d, size_t size) { - /* compressBound does not provide enough space for low compression levels. */ - size_t comprLen = 100 + 2 * PREFIX(compressBound)(size); - size_t uncomprLen = size; - uint8_t *compr, *uncompr; + /* compressBound does not provide enough space for low compression levels. */ + z_size_t comprLen = 100 + 2 * PREFIX(compressBound)(size); + z_size_t uncomprLen = (z_size_t)size; + uint8_t *compr, *uncompr; - /* Discard inputs larger than 1Mb. */ - static size_t kMaxSize = 1024 * 1024; + /* Discard inputs larger than 1Mb. */ + static size_t kMaxSize = 1024 * 1024; - if (size < 1 || size > kMaxSize) + if (size < 1 || size > kMaxSize) + return 0; + + data = d; + dataLen = size; + compr = (uint8_t *)calloc(1, comprLen); + uncompr = (uint8_t *)calloc(1, uncomprLen); + + check_compress_level(compr, comprLen, uncompr, uncomprLen, 1); + check_compress_level(compr, comprLen, uncompr, uncomprLen, 3); + check_compress_level(compr, comprLen, uncompr, uncomprLen, 6); + check_compress_level(compr, comprLen, uncompr, uncomprLen, 7); + + check_decompress(compr, comprLen); + + free(compr); + free(uncompr); + + /* This function must return 0. */ return 0; - - data = d; - dataLen = size; - compr = (uint8_t *)calloc(1, comprLen); - uncompr = (uint8_t *)calloc(1, uncomprLen); - - check_compress_level(compr, comprLen, uncompr, uncomprLen, 1); - check_compress_level(compr, comprLen, uncompr, uncomprLen, 3); - check_compress_level(compr, comprLen, uncompr, uncomprLen, 6); - check_compress_level(compr, comprLen, uncompr, uncomprLen, 7); - - check_decompress(compr, comprLen); - - free(compr); - free(uncompr); - - /* This function must return 0. */ - return 0; } diff --git a/libs/zlibng/test/fuzz/example_dict_fuzzer.c b/libs/zlibng/test/fuzz/example_dict_fuzzer.c index b19101173..027c9a806 100644 --- a/libs/zlibng/test/fuzz/example_dict_fuzzer.c +++ b/libs/zlibng/test/fuzz/example_dict_fuzzer.c @@ -24,14 +24,13 @@ static const uint8_t *data; static size_t dataLen; static alloc_func zalloc = NULL; static free_func zfree = NULL; -static size_t dictionaryLen = 0; +static unsigned int dictionaryLen = 0; static unsigned long dictId; /* Adler32 value of the dictionary */ /* =========================================================================== * Test deflate() with preset dictionary */ -void test_dict_deflate(unsigned char **compr, size_t *comprLen) -{ +void test_dict_deflate(unsigned char **compr, size_t *comprLen) { PREFIX3(stream) c_stream; /* compression stream */ int err; int level = data[0] % 11 - 1; /* [-1..9] @@ -58,7 +57,7 @@ void test_dict_deflate(unsigned char **compr, size_t *comprLen) /* deflate would fail for no-compression or for speed levels. */ if (level == 0 || level == 1) - level = -1; + level = -1; c_stream.zalloc = zalloc; c_stream.zfree = zfree; @@ -73,15 +72,15 @@ void test_dict_deflate(unsigned char **compr, size_t *comprLen) CHECK_ERR(err, "deflateSetDictionary"); /* deflateBound does not provide enough space for low compression levels. */ - *comprLen = 100 + 2 * PREFIX(deflateBound)(&c_stream, dataLen); + *comprLen = 100 + 2 * PREFIX(deflateBound)(&c_stream, (unsigned long)dataLen); *compr = (uint8_t *)calloc(1, *comprLen); dictId = c_stream.adler; c_stream.next_out = *compr; c_stream.avail_out = (unsigned int)(*comprLen); - c_stream.next_in = data; - c_stream.avail_in = dataLen; + c_stream.next_in = (z_const unsigned char *)data; + c_stream.avail_in = (uint32_t)dataLen; err = PREFIX(deflate)(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { @@ -96,75 +95,75 @@ void test_dict_deflate(unsigned char **compr, size_t *comprLen) * Test inflate() with a preset dictionary */ void test_dict_inflate(unsigned char *compr, size_t comprLen) { - int err; - PREFIX3(stream) d_stream; /* decompression stream */ - unsigned char *uncompr; + int err; + PREFIX3(stream) d_stream; /* decompression stream */ + unsigned char *uncompr; - d_stream.zalloc = zalloc; - d_stream.zfree = zfree; - d_stream.opaque = (void *)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (void *)0; - d_stream.next_in = compr; - d_stream.avail_in = (unsigned int)comprLen; + d_stream.next_in = compr; + d_stream.avail_in = (unsigned int)comprLen; - err = PREFIX(inflateInit)(&d_stream); - CHECK_ERR(err, "inflateInit"); + err = PREFIX(inflateInit)(&d_stream); + CHECK_ERR(err, "inflateInit"); - uncompr = (uint8_t *)calloc(1, dataLen); - d_stream.next_out = uncompr; - d_stream.avail_out = (unsigned int)dataLen; + uncompr = (uint8_t *)calloc(1, dataLen); + d_stream.next_out = uncompr; + d_stream.avail_out = (unsigned int)dataLen; - for (;;) { - err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) - break; - if (err == Z_NEED_DICT) { - if (d_stream.adler != dictId) { - fprintf(stderr, "unexpected dictionary"); - exit(1); - } - err = PREFIX(inflateSetDictionary)( - &d_stream, (const unsigned char *)data, dictionaryLen); + for (;;) { + err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) + break; + if (err == Z_NEED_DICT) { + if (d_stream.adler != dictId) { + fprintf(stderr, "unexpected dictionary"); + exit(1); + } + err = PREFIX(inflateSetDictionary)( + &d_stream, (const unsigned char *)data, dictionaryLen); + } + CHECK_ERR(err, "inflate with dict"); } - CHECK_ERR(err, "inflate with dict"); - } - err = PREFIX(inflateEnd)(&d_stream); - CHECK_ERR(err, "inflateEnd"); + err = PREFIX(inflateEnd)(&d_stream); + CHECK_ERR(err, "inflateEnd"); - if (memcmp(uncompr, data, dataLen)) { - fprintf(stderr, "bad inflate with dict\n"); - exit(1); - } + if (memcmp(uncompr, data, dataLen)) { + fprintf(stderr, "bad inflate with dict\n"); + exit(1); + } - free(uncompr); + free(uncompr); } int LLVMFuzzerTestOneInput(const uint8_t *d, size_t size) { - size_t comprLen = 0; - uint8_t *compr; + size_t comprLen = 0; + uint8_t *compr; - /* Discard inputs larger than 100Kb. */ - static size_t kMaxSize = 100 * 1024; + /* Discard inputs larger than 100Kb. */ + static size_t kMaxSize = 100 * 1024; - if (size < 1 || size > kMaxSize) + if (size < 1 || size > kMaxSize) + return 0; + + data = d; + dataLen = size; + + /* Set up the contents of the dictionary. The size of the dictionary is + intentionally selected to be of unusual size. To help cover more corner + cases, the size of the dictionary is read from the input data. */ + dictionaryLen = data[0]; + if (dictionaryLen > dataLen) + dictionaryLen = (unsigned int)dataLen; + + test_dict_deflate(&compr, &comprLen); + test_dict_inflate(compr, comprLen); + + free(compr); + + /* This function must return 0. */ return 0; - - data = d; - dataLen = size; - - /* Set up the contents of the dictionary. The size of the dictionary is - intentionally selected to be of unusual size. To help cover more corner - cases, the size of the dictionary is read from the input data. */ - dictionaryLen = data[0]; - if (dictionaryLen > dataLen) - dictionaryLen = dataLen; - - test_dict_deflate(&compr, &comprLen); - test_dict_inflate(compr, comprLen); - - free(compr); - - /* This function must return 0. */ - return 0; } diff --git a/libs/zlibng/test/fuzz/example_flush_fuzzer.c b/libs/zlibng/test/fuzz/example_flush_fuzzer.c index f9f2d3646..81ec7e36d 100644 --- a/libs/zlibng/test/fuzz/example_flush_fuzzer.c +++ b/libs/zlibng/test/fuzz/example_flush_fuzzer.c @@ -29,98 +29,96 @@ static free_func zfree = NULL; * Test deflate() with full flush */ void test_flush(unsigned char *compr, z_size_t *comprLen) { - PREFIX3(stream) c_stream; /* compression stream */ - int err; - unsigned int len = dataLen; + PREFIX3(stream) c_stream; /* compression stream */ + int err; + unsigned int len = (unsigned int)dataLen; - c_stream.zalloc = zalloc; - c_stream.zfree = zfree; - c_stream.opaque = (void *)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (void *)0; - err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); - CHECK_ERR(err, "deflateInit"); + err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (const unsigned char *)data; - c_stream.next_out = compr; - c_stream.avail_in = 3; - c_stream.avail_out = (unsigned int)*comprLen; - err = PREFIX(deflate)(&c_stream, Z_FULL_FLUSH); - CHECK_ERR(err, "deflate flush 1"); + c_stream.next_in = (z_const unsigned char *)data; + c_stream.next_out = compr; + c_stream.avail_in = 3; + c_stream.avail_out = (unsigned int)*comprLen; + err = PREFIX(deflate)(&c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, "deflate flush 1"); - compr[3]++; /* force an error in first compressed block */ - c_stream.avail_in = len - 3; + compr[3]++; /* force an error in first compressed block */ + c_stream.avail_in = len - 3; - err = PREFIX(deflate)(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - CHECK_ERR(err, "deflate flush 2"); - } - err = PREFIX(deflateEnd)(&c_stream); - CHECK_ERR(err, "deflateEnd"); + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + CHECK_ERR(err, "deflate flush 2"); + } + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); - *comprLen = (z_size_t)c_stream.total_out; + *comprLen = (z_size_t)c_stream.total_out; } /* =========================================================================== * Test inflateSync() */ -void test_sync(unsigned char *compr, size_t comprLen, unsigned char *uncompr, - size_t uncomprLen) { - int err; - PREFIX3(stream) d_stream; /* decompression stream */ +void test_sync(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { + int err; + PREFIX3(stream) d_stream; /* decompression stream */ - d_stream.zalloc = zalloc; - d_stream.zfree = zfree; - d_stream.opaque = (void *)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (void *)0; - d_stream.next_in = compr; - d_stream.avail_in = 2; /* just read the zlib header */ + d_stream.next_in = compr; + d_stream.avail_in = 2; /* just read the zlib header */ - err = PREFIX(inflateInit)(&d_stream); - CHECK_ERR(err, "inflateInit"); + err = PREFIX(inflateInit)(&d_stream); + CHECK_ERR(err, "inflateInit"); - d_stream.next_out = uncompr; - d_stream.avail_out = (unsigned int)uncomprLen; + d_stream.next_out = uncompr; + d_stream.avail_out = (unsigned int)uncomprLen; - err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); - CHECK_ERR(err, "inflate"); + err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); + CHECK_ERR(err, "inflate"); - d_stream.avail_in = (unsigned int)comprLen - 2; /* read all compressed data */ - err = PREFIX(inflateSync)(&d_stream); /* but skip the damaged part */ - CHECK_ERR(err, "inflateSync"); + d_stream.avail_in = (unsigned int)comprLen - 2; /* read all compressed data */ + err = PREFIX(inflateSync)(&d_stream); /* but skip the damaged part */ + CHECK_ERR(err, "inflateSync"); - err = PREFIX(inflate)(&d_stream, Z_FINISH); - if (err != Z_DATA_ERROR) { - fprintf(stderr, "inflate should report DATA_ERROR\n"); - /* Because of incorrect adler32 */ - exit(1); - } - err = PREFIX(inflateEnd)(&d_stream); - CHECK_ERR(err, "inflateEnd"); + err = PREFIX(inflate)(&d_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "inflate should report Z_STREAM_END\n"); + exit(1); + } + err = PREFIX(inflateEnd)(&d_stream); + CHECK_ERR(err, "inflateEnd"); } int LLVMFuzzerTestOneInput(const uint8_t *d, size_t size) { - size_t comprLen = 100 + 2 * PREFIX(compressBound)(size); - size_t uncomprLen = size; - uint8_t *compr, *uncompr; + z_size_t comprLen = 100 + 2 * PREFIX(compressBound)(size); + z_size_t uncomprLen = (z_size_t)size; + uint8_t *compr, *uncompr; - /* Discard inputs larger than 1Mb. */ - static size_t kMaxSize = 1024 * 1024; + /* Discard inputs larger than 1Mb. */ + static size_t kMaxSize = 1024 * 1024; - // This test requires at least 3 bytes of input data. - if (size <= 3 || size > kMaxSize) + // This test requires at least 3 bytes of input data. + if (size <= 3 || size > kMaxSize) + return 0; + + data = d; + dataLen = size; + compr = (uint8_t *)calloc(1, comprLen); + uncompr = (uint8_t *)calloc(1, uncomprLen); + + test_flush(compr, &comprLen); + test_sync(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + /* This function must return 0. */ return 0; - - data = d; - dataLen = size; - compr = (uint8_t *)calloc(1, comprLen); - uncompr = (uint8_t *)calloc(1, uncomprLen); - - test_flush(compr, &comprLen); - test_sync(compr, comprLen, uncompr, uncomprLen); - - free(compr); - free(uncompr); - - /* This function must return 0. */ - return 0; } diff --git a/libs/zlibng/test/fuzz/example_large_fuzzer.c b/libs/zlibng/test/fuzz/example_large_fuzzer.c index 1e8fedc22..bd27a84f1 100644 --- a/libs/zlibng/test/fuzz/example_large_fuzzer.c +++ b/libs/zlibng/test/fuzz/example_large_fuzzer.c @@ -29,115 +29,113 @@ static unsigned int diff; /* =========================================================================== * Test deflate() with large buffers and dynamic change of compression level */ -void test_large_deflate(unsigned char *compr, size_t comprLen, - unsigned char *uncompr, size_t uncomprLen) { - PREFIX3(stream) c_stream; /* compression stream */ - int err; +void test_large_deflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { + PREFIX3(stream) c_stream; /* compression stream */ + int err; - c_stream.zalloc = zalloc; - c_stream.zfree = zfree; - c_stream.opaque = (void *)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (void *)0; - err = PREFIX(deflateInit)(&c_stream, Z_BEST_COMPRESSION); - CHECK_ERR(err, "deflateInit"); + err = PREFIX(deflateInit)(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); - c_stream.next_out = compr; - c_stream.avail_out = (unsigned int)comprLen; + c_stream.next_out = compr; + c_stream.avail_out = (unsigned int)comprLen; - /* At this point, uncompr is still mostly zeroes, so it should compress - * very well: - */ - c_stream.next_in = uncompr; - c_stream.avail_in = (unsigned int)uncomprLen; - err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate large 1"); - if (c_stream.avail_in != 0) { - fprintf(stderr, "deflate not greedy\n"); - exit(1); - } + /* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + */ + c_stream.next_in = uncompr; + c_stream.avail_in = (unsigned int)uncomprLen; + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate large 1"); + if (c_stream.avail_in != 0) { + fprintf(stderr, "deflate not greedy\n"); + exit(1); + } - /* Feed in already compressed data and switch to no compression: */ - PREFIX(deflateParams)(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); - c_stream.next_in = compr; - diff = (unsigned int)(c_stream.next_out - compr); - c_stream.avail_in = diff; - err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate large 2"); + /* Feed in already compressed data and switch to no compression: */ + PREFIX(deflateParams)(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in = compr; + diff = (unsigned int)(c_stream.next_out - compr); + c_stream.avail_in = diff; + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate large 2"); - /* Switch back to compressing mode: */ - PREFIX(deflateParams)(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); - c_stream.next_in = uncompr; - c_stream.avail_in = (unsigned int)uncomprLen; - err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate large 3"); + /* Switch back to compressing mode: */ + PREFIX(deflateParams)(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in = uncompr; + c_stream.avail_in = (unsigned int)uncomprLen; + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate large 3"); - err = PREFIX(deflate)(&c_stream, Z_FINISH); - if (err != Z_STREAM_END) { - fprintf(stderr, "deflate large should report Z_STREAM_END\n"); - exit(1); - } - err = PREFIX(deflateEnd)(&c_stream); - CHECK_ERR(err, "deflateEnd"); + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate large should report Z_STREAM_END\n"); + exit(1); + } + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with large buffers */ -void test_large_inflate(unsigned char *compr, size_t comprLen, - unsigned char *uncompr, size_t uncomprLen) { - int err; - PREFIX3(stream) d_stream; /* decompression stream */ +void test_large_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { + int err; + PREFIX3(stream) d_stream; /* decompression stream */ - d_stream.zalloc = zalloc; - d_stream.zfree = zfree; - d_stream.opaque = (void *)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (void *)0; - d_stream.next_in = compr; - d_stream.avail_in = (unsigned int)comprLen; + d_stream.next_in = compr; + d_stream.avail_in = (unsigned int)comprLen; - err = PREFIX(inflateInit)(&d_stream); - CHECK_ERR(err, "inflateInit"); + err = PREFIX(inflateInit)(&d_stream); + CHECK_ERR(err, "inflateInit"); - for (;;) { - d_stream.next_out = uncompr; /* discard the output */ - d_stream.avail_out = (unsigned int)uncomprLen; - err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) - break; - CHECK_ERR(err, "large inflate"); - } + for (;;) { + d_stream.next_out = uncompr; /* discard the output */ + d_stream.avail_out = (unsigned int)uncomprLen; + err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) + break; + CHECK_ERR(err, "large inflate"); + } - err = PREFIX(inflateEnd)(&d_stream); - CHECK_ERR(err, "inflateEnd"); + err = PREFIX(inflateEnd)(&d_stream); + CHECK_ERR(err, "inflateEnd"); - if (d_stream.total_out != 2 * uncomprLen + diff) { - fprintf(stderr, "bad large inflate: %zu\n", d_stream.total_out); - exit(1); - } + if (d_stream.total_out != 2 * uncomprLen + diff) { + fprintf(stderr, "bad large inflate: %" PRIu64 "\n", (uint64_t)d_stream.total_out); + exit(1); + } } int LLVMFuzzerTestOneInput(const uint8_t *d, size_t size) { - size_t comprLen = 100 + 3 * size; - size_t uncomprLen = comprLen; - uint8_t *compr, *uncompr; + size_t comprLen = 100 + 3 * size; + size_t uncomprLen = comprLen; + uint8_t *compr, *uncompr; - /* Discard inputs larger than 512Kb. */ - static size_t kMaxSize = 512 * 1024; + /* Discard inputs larger than 512Kb. */ + static size_t kMaxSize = 512 * 1024; - if (size < 1 || size > kMaxSize) + if (size < 1 || size > kMaxSize) + return 0; + + data = d; + dataLen = size; + compr = (uint8_t *)calloc(1, comprLen); + uncompr = (uint8_t *)calloc(1, uncomprLen); + + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + /* This function must return 0. */ return 0; - - data = d; - dataLen = size; - compr = (uint8_t *)calloc(1, comprLen); - uncompr = (uint8_t *)calloc(1, uncomprLen); - - test_large_deflate(compr, comprLen, uncompr, uncomprLen); - test_large_inflate(compr, comprLen, uncompr, uncomprLen); - - free(compr); - free(uncompr); - - /* This function must return 0. */ - return 0; } diff --git a/libs/zlibng/test/fuzz/example_small_fuzzer.c b/libs/zlibng/test/fuzz/example_small_fuzzer.c index d965c2db8..d02a812de 100644 --- a/libs/zlibng/test/fuzz/example_small_fuzzer.c +++ b/libs/zlibng/test/fuzz/example_small_fuzzer.c @@ -29,96 +29,95 @@ static free_func zfree = NULL; * Test deflate() with small buffers */ void test_deflate(unsigned char *compr, size_t comprLen) { - PREFIX3(stream) c_stream; /* compression stream */ - int err; - unsigned long len = dataLen; + PREFIX3(stream) c_stream; /* compression stream */ + int err; + unsigned long len = (unsigned long)dataLen; - c_stream.zalloc = zalloc; - c_stream.zfree = zfree; - c_stream.opaque = (void *)0; + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (void *)0; - err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); - CHECK_ERR(err, "deflateInit"); + err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); - c_stream.next_in = (const unsigned char *)data; - c_stream.next_out = compr; + c_stream.next_in = (z_const unsigned char *)data; + c_stream.next_out = compr; - while (c_stream.total_in != len && c_stream.total_out < comprLen) { - c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ - err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); - CHECK_ERR(err, "deflate small 1"); - } - /* Finish the stream, still forcing small buffers: */ - for (;;) { - c_stream.avail_out = 1; - err = PREFIX(deflate)(&c_stream, Z_FINISH); - if (err == Z_STREAM_END) - break; - CHECK_ERR(err, "deflate small 2"); - } + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate small 1"); + } + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) + break; + CHECK_ERR(err, "deflate small 2"); + } - err = PREFIX(deflateEnd)(&c_stream); - CHECK_ERR(err, "deflateEnd"); + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with small buffers */ -void test_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, - size_t uncomprLen) { - int err; - PREFIX3(stream) d_stream; /* decompression stream */ +void test_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) { + int err; + PREFIX3(stream) d_stream; /* decompression stream */ - d_stream.zalloc = zalloc; - d_stream.zfree = zfree; - d_stream.opaque = (void *)0; + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (void *)0; - d_stream.next_in = compr; - d_stream.avail_in = 0; - d_stream.next_out = uncompr; + d_stream.next_in = compr; + d_stream.avail_in = 0; + d_stream.next_out = uncompr; - err = PREFIX(inflateInit)(&d_stream); - CHECK_ERR(err, "inflateInit"); + err = PREFIX(inflateInit)(&d_stream); + CHECK_ERR(err, "inflateInit"); - while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { - d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ - err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); - if (err == Z_STREAM_END) - break; - CHECK_ERR(err, "inflate"); - } + while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { + d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ + err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) + break; + CHECK_ERR(err, "inflate"); + } - err = PREFIX(inflateEnd)(&d_stream); - CHECK_ERR(err, "inflateEnd"); + err = PREFIX(inflateEnd)(&d_stream); + CHECK_ERR(err, "inflateEnd"); - if (memcmp(uncompr, data, dataLen)) { - fprintf(stderr, "bad inflate\n"); - exit(1); - } + if (memcmp(uncompr, data, dataLen)) { + fprintf(stderr, "bad inflate\n"); + exit(1); + } } int LLVMFuzzerTestOneInput(const uint8_t *d, size_t size) { - size_t comprLen = PREFIX(compressBound)(size); - size_t uncomprLen = size; - uint8_t *compr, *uncompr; + size_t comprLen = PREFIX(compressBound)(size); + size_t uncomprLen = size; + uint8_t *compr, *uncompr; - /* Discard inputs larger than 1Mb. */ - static size_t kMaxSize = 1024 * 1024; + /* Discard inputs larger than 1Mb. */ + static size_t kMaxSize = 1024 * 1024; - if (size < 1 || size > kMaxSize) + if (size < 1 || size > kMaxSize) + return 0; + + data = d; + dataLen = size; + compr = (uint8_t *)calloc(1, comprLen); + uncompr = (uint8_t *)calloc(1, uncomprLen); + + test_deflate(compr, comprLen); + test_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + /* This function must return 0. */ return 0; - - data = d; - dataLen = size; - compr = (uint8_t *)calloc(1, comprLen); - uncompr = (uint8_t *)calloc(1, uncomprLen); - - test_deflate(compr, comprLen); - test_inflate(compr, comprLen, uncompr, uncomprLen); - - free(compr); - free(uncompr); - - /* This function must return 0. */ - return 0; } diff --git a/libs/zlibng/test/fuzz/minigzip_fuzzer.c b/libs/zlibng/test/fuzz/minigzip_fuzzer.c index d0c35571f..1f19126f4 100644 --- a/libs/zlibng/test/fuzz/minigzip_fuzzer.c +++ b/libs/zlibng/test/fuzz/minigzip_fuzzer.c @@ -12,13 +12,14 @@ * real thing. */ -/* @(#) $Id$ */ +#define _POSIX_SOURCE 1 /* This file needs POSIX for fileno(). */ +#define _POSIX_C_SOURCE 200112 /* For snprintf(). */ #include "zbuild.h" #ifdef ZLIB_COMPAT -# include "zlib.h" +# include "zlib.h" #else -# include "zlib-ng.h" +# include "zlib-ng.h" #endif #include #include @@ -35,7 +36,7 @@ # include #endif -#if defined(WIN32) || defined(__CYGWIN__) +#if defined(_WIN32) || defined(__CYGWIN__) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) @@ -48,8 +49,8 @@ #endif #if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) -#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ - extern int unlink (const char *); +#ifndef _WIN32 /* unlink already in stdio.h for Win32 */ +extern int unlink (const char *); #endif #endif @@ -62,23 +63,22 @@ #define BUFLENW (BUFLEN * 3) /* write buffer size */ #define MAX_NAME_LEN 1024 -static char *prog; +static const char *prog = "minigzip_fuzzer"; void error (const char *msg); -void gz_compress (FILE *in, gzFile out); +void gz_compress (FILE *in, gzFile out); #ifdef USE_MMAP -int gz_compress_mmap (FILE *in, gzFile out); +int gz_compress_mmap (FILE *in, gzFile out); #endif -void gz_uncompress (gzFile in, FILE *out); -void file_compress (char *file, char *mode); -void file_uncompress (char *file); +void gz_uncompress (gzFile in, FILE *out); +void file_compress (char *file, char *mode); +void file_uncompress (char *file); int main (int argc, char *argv[]); /* =========================================================================== * Display error message and exit */ -void error(const char *msg) -{ +void error(const char *msg) { fprintf(stderr, "%s: %s\n", prog, msg); exit(1); } @@ -87,8 +87,7 @@ void error(const char *msg) * Compress input to output then close both files. */ -void gz_compress(FILE *in, gzFile out) -{ +void gz_compress(FILE *in, gzFile out) { char buf[BUFLEN]; int len; int err; @@ -121,12 +120,11 @@ void gz_compress(FILE *in, gzFile out) /* Try compressing the input file at once using mmap. Return Z_OK if * if success, Z_ERRNO otherwise. */ -int gz_compress_mmap(FILE *in, gzFile out) -{ +int gz_compress_mmap(FILE *in, gzFile out) { int len; int err; int ifd = fileno(in); - caddr_t buf; /* mmap'ed buffer for the entire input file */ + char *buf; /* mmap'ed buffer for the entire input file */ off_t buf_len; /* length of the input file */ struct stat sb; @@ -136,8 +134,8 @@ int gz_compress_mmap(FILE *in, gzFile out) if (buf_len <= 0) return Z_ERRNO; /* Now do the actual mmap: */ - buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); - if (buf == (caddr_t)(-1)) return Z_ERRNO; + buf = mmap((void *)0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (char *)(-1)) return Z_ERRNO; /* Compress the whole file at once: */ len = PREFIX(gzwrite)(out, (char *)buf, (unsigned)buf_len); @@ -154,8 +152,7 @@ int gz_compress_mmap(FILE *in, gzFile out) /* =========================================================================== * Uncompress input to output then close both files. */ -void gz_uncompress(gzFile in, FILE *out) -{ +void gz_uncompress(gzFile in, FILE *out) { char buf[BUFLENW]; int len; int err; @@ -179,10 +176,9 @@ void gz_uncompress(gzFile in, FILE *out) * Compress the given file: create a corresponding .gz file and remove the * original. */ -void file_compress(char *file, char *mode) -{ +void file_compress(char *file, char *mode) { char outfile[MAX_NAME_LEN]; - FILE *in; + FILE *in; gzFile out; if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { @@ -211,11 +207,10 @@ void file_compress(char *file, char *mode) /* =========================================================================== * Uncompress the given file and remove the original. */ -void file_uncompress(char *file) -{ +void file_uncompress(char *file) { char buf[MAX_NAME_LEN]; char *infile, *outfile; - FILE *out; + FILE *out; gzFile in; size_t len = strlen(file); @@ -252,75 +247,75 @@ void file_uncompress(char *file) } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) { - char *inFileName = "/tmp/minigzip_fuzzer.out"; - char *outFileName = "/tmp/minigzip_fuzzer.out.gz"; - char outmode[20]; - FILE *in; - char buf[BUFLEN]; - uint32_t offset = 0; + char *inFileName = "minigzip_fuzzer.out"; + char *outFileName = "minigzip_fuzzer.out.gz"; + char outmode[20]; + FILE *in; + char buf[BUFLEN]; + uint32_t offset = 0; - /* Discard inputs larger than 1Mb. */ - static size_t kMaxSize = 1024 * 1024; - if (dataLen < 1 || dataLen > kMaxSize) - return 0; + /* Discard inputs larger than 1Mb. */ + static size_t kMaxSize = 1024 * 1024; + if (dataLen < 1 || dataLen > kMaxSize) + return 0; - in = fopen(inFileName, "w"); - if (fwrite(data, 1, (unsigned)dataLen, in) != dataLen) - error("failed fwrite"); - if (fclose(in)) - error("failed fclose"); + in = fopen(inFileName, "wb"); + if (fwrite(data, 1, (unsigned)dataLen, in) != dataLen) + error("failed fwrite"); + if (fclose(in)) + error("failed fclose"); - memset(outmode, 0, sizeof(outmode)); - snprintf(outmode, sizeof(outmode), "%s", "wb"); + memset(outmode, 0, sizeof(outmode)); + snprintf(outmode, sizeof(outmode), "%s", "wb"); - /* Compression level: [0..9]. */ - outmode[2] = data[0] % 10; + /* Compression level: [0..9]. */ + outmode[2] = data[0] % 10; - switch (data[0] % 4) { - default: - case 0: - outmode[3] = 0; - break; - case 1: - /* compress with Z_FILTERED */ - outmode[3] = 'f'; - break; - case 2: - /* compress with Z_HUFFMAN_ONLY */ - outmode[3] = 'h'; - break; - case 3: - /* compress with Z_RLE */ - outmode[3] = 'R'; - break; - } - - file_compress(inFileName, outmode); - file_uncompress(outFileName); - - /* Check that the uncompressed file matches the input data. */ - in = fopen(inFileName, "rb"); - if (in == NULL) { - perror(inFileName); - exit(1); - } - - memset(buf, 0, sizeof(buf)); - for (;;) { - int len = (int)fread(buf, 1, sizeof(buf), in); - if (ferror(in)) { - perror("fread"); - exit(1); + switch (data[0] % 4) { + default: + case 0: + outmode[3] = 0; + break; + case 1: + /* compress with Z_FILTERED */ + outmode[3] = 'f'; + break; + case 2: + /* compress with Z_HUFFMAN_ONLY */ + outmode[3] = 'h'; + break; + case 3: + /* compress with Z_RLE */ + outmode[3] = 'R'; + break; } - if (len == 0) - break; - assert(0 == memcmp(data + offset, buf, len)); - offset += len; - } - if (fclose(in)) - error("failed fclose"); + file_compress(inFileName, outmode); + file_uncompress(outFileName); - /* This function must return 0. */ - return 0; + /* Check that the uncompressed file matches the input data. */ + in = fopen(inFileName, "rb"); + if (in == NULL) { + perror(inFileName); + exit(1); + } + + memset(buf, 0, sizeof(buf)); + for (;;) { + int len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) + break; + assert(0 == memcmp(data + offset, buf, len)); + offset += len; + } + + if (fclose(in)) + error("failed fclose"); + + /* This function must return 0. */ + return 0; } diff --git a/libs/zlibng/test/fuzz/standalone_fuzz_target_runner.c b/libs/zlibng/test/fuzz/standalone_fuzz_target_runner.c index 5a5c75096..a291b4882 100644 --- a/libs/zlibng/test/fuzz/standalone_fuzz_target_runner.c +++ b/libs/zlibng/test/fuzz/standalone_fuzz_target_runner.c @@ -5,31 +5,32 @@ extern int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size); int main(int argc, char **argv) { - int i; - fprintf(stderr, "StandaloneFuzzTargetMain: running %d inputs\n", argc - 1); + int i; + fprintf(stderr, "StandaloneFuzzTargetMain: running %d inputs\n", argc - 1); - for (i = 1; i < argc; i++) { - size_t len, n_read, err; - unsigned char *buf; - FILE *f = fopen(argv[i], "rb+"); - if (!f) { - /* Failed to open this file: it may be a directory. */ - fprintf(stderr, "Skipping: %s\n", argv[i]); - continue; + for (i = 1; i < argc; i++) { + size_t len, n_read, err; + unsigned char *buf; + FILE *f = fopen(argv[i], "rb+"); + if (!f) { + /* Failed to open this file: it may be a directory. */ + fprintf(stderr, "Skipping: %s\n", argv[i]); + continue; + } + fprintf(stderr, "Running: %s %s\n", argv[0], argv[i]); + fseek(f, 0, SEEK_END); + len = ftell(f); + fseek(f, 0, SEEK_SET); + buf = (unsigned char *)malloc(len); + n_read = fread(buf, 1, len, f); + assert(n_read == len); + LLVMFuzzerTestOneInput(buf, len); + free(buf); + err = fclose(f); + assert(err == 0); + (void)err; + fprintf(stderr, "Done: %s: (%d bytes)\n", argv[i], (int)n_read); } - fprintf(stderr, "Running: %s %s\n", argv[0], argv[i]); - fseek(f, 0, SEEK_END); - len = ftell(f); - fseek(f, 0, SEEK_SET); - buf = (unsigned char *)malloc(len); - n_read = fread(buf, 1, len, f); - assert(n_read == len); - LLVMFuzzerTestOneInput(buf, len); - free(buf); - err = fclose(f); - assert(err == 0); - fprintf(stderr, "Done: %s: (%d bytes)\n", argv[i], (int)n_read); - } - return 0; + return 0; } diff --git a/libs/zlibng/test/infcover.c b/libs/zlibng/test/infcover.c index 2b8ff974a..3466b202d 100644 --- a/libs/zlibng/test/infcover.c +++ b/libs/zlibng/test/infcover.c @@ -8,13 +8,20 @@ #include #include #include +#undef NDEBUG #include -#include "zlib.h" +#include +#include /* get definition of internal structure so we can mess with it (see pull()), and so we can call inflate_trees() (see cover5()) */ #define ZLIB_INTERNAL #include "zbuild.h" +#ifdef ZLIB_COMPAT +# include "zlib.h" +#else +# include "zlib-ng.h" +#endif #include "inftrees.h" #include "inflate.h" @@ -28,7 +35,7 @@ They are used as follows: - z_stream strm; + PREFIX3(stream) strm; mem_setup(&strm) initializes the memory tracking and sets the zalloc, zfree, and opaque members of strm to use memory tracking for all zlib operations on strm @@ -67,8 +74,7 @@ struct mem_zone { }; /* memory allocation routine to pass to zlib */ -static void *mem_alloc(void *mem, unsigned count, unsigned size) -{ +static void *mem_alloc(void *mem, unsigned count, unsigned size) { void *ptr; struct mem_item *item; struct mem_zone *zone = mem; @@ -108,8 +114,7 @@ static void *mem_alloc(void *mem, unsigned count, unsigned size) } /* memory free routine to pass to zlib */ -static void mem_free(void *mem, void *ptr) -{ +static void mem_free(void *mem, void *ptr) { struct mem_item *item, *next; struct mem_zone *zone = mem; @@ -154,8 +159,7 @@ static void mem_free(void *mem, void *ptr) /* set up a controlled memory allocation space for monitoring, set the stream parameters to the controlled routines, with opaque pointing to the space */ -static void mem_setup(z_stream *strm) -{ +static void mem_setup(PREFIX3(stream) *strm) { struct mem_zone *zone; zone = malloc(sizeof(struct mem_zone)); @@ -172,32 +176,28 @@ static void mem_setup(z_stream *strm) } /* set a limit on the total memory allocation, or 0 to remove the limit */ -static void mem_limit(z_stream *strm, size_t limit) -{ +static void mem_limit(PREFIX3(stream) *strm, size_t limit) { struct mem_zone *zone = strm->opaque; zone->limit = limit; } /* show the current total requested allocations in bytes */ -static void mem_used(z_stream *strm, char *prefix) -{ +static void mem_used(PREFIX3(stream) *strm, char *prefix) { struct mem_zone *zone = strm->opaque; - fprintf(stderr, "%s: %zu allocated\n", prefix, zone->total); + fprintf(stderr, "%s: %" PRIu64 " allocated\n", prefix, (uint64_t)zone->total); } /* show the high water allocation in bytes */ -static void mem_high(z_stream *strm, char *prefix) -{ +static void mem_high(PREFIX3(stream) *strm, char *prefix) { struct mem_zone *zone = strm->opaque; - fprintf(stderr, "%s: %zu high water mark\n", prefix, zone->highwater); + fprintf(stderr, "%s: %" PRIu64 " high water mark\n", prefix, (uint64_t)zone->highwater); } /* release the memory allocation zone -- if there are any surprises, notify */ -static void mem_done(z_stream *strm, char *prefix) -{ +static void mem_done(PREFIX3(stream) *strm, char *prefix) { int count = 0; struct mem_item *item, *next; struct mem_zone *zone = strm->opaque; @@ -217,8 +217,8 @@ static void mem_done(z_stream *strm, char *prefix) /* issue alerts about anything unexpected */ if (count || zone->total) - fprintf(stderr, "** %s: %zu bytes in %d blocks not freed\n", - prefix, zone->total, count); + fprintf(stderr, "** %s: %" PRIu64 " bytes in %d blocks not freed\n", + prefix, (uint64_t)zone->total, count); if (zone->notlifo) fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo); if (zone->rogue) @@ -241,12 +241,14 @@ static void mem_done(z_stream *strm, char *prefix) by a delimiter, where that single digit writes a byte. The returned data is allocated and must eventually be freed. NULL is returned if out of memory. If the length is not needed, then len can be NULL. */ -static unsigned char *h2b(const char *hex, unsigned *len) -{ +static unsigned char *h2b(const char *hex, unsigned *len) { unsigned char *in, *re; unsigned next, val; + size_t inlen; - in = malloc((strlen(hex) + 1) >> 1); + inlen = (strlen(hex) + 1) >> 1; + assert(inlen != 0); /* tell static analyzer we won't call malloc(0) */ + in = malloc(inlen); if (in == NULL) return NULL; next = 0; @@ -267,6 +269,7 @@ static unsigned char *h2b(const char *hex, unsigned *len) } while (*hex++); /* go through the loop with the terminating null */ if (len != NULL) *len = next; + assert(next != 0); /* tell static analyzer we won't call realloc(in, 0) */ re = realloc(in, next); return re == NULL ? in : re; } @@ -280,18 +283,17 @@ static unsigned char *h2b(const char *hex, unsigned *len) header information is collected with inflateGetHeader(). If a zlib stream is looking for a dictionary, then an empty dictionary is provided. inflate() is run until all of the input data is consumed. */ -static void inf(char *hex, char *what, unsigned step, int win, unsigned len, int err) -{ +static void inf(char *hex, char *what, unsigned step, int win, unsigned len, int err) { int ret; unsigned have; unsigned char *in, *out; - z_stream strm, copy; - gz_header head; + PREFIX3(stream) strm, copy; + PREFIX(gz_header) head; mem_setup(&strm); strm.avail_in = 0; strm.next_in = NULL; - ret = inflateInit2(&strm, win); + ret = PREFIX(inflateInit2)(&strm, win); if (ret != Z_OK) { mem_done(&strm, what); return; @@ -304,7 +306,8 @@ static void inf(char *hex, char *what, unsigned step, int win, unsigned len, int head.name_max = len; head.comment = out; head.comm_max = len; - ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + ret = PREFIX(inflateGetHeader)(&strm, &head); + assert(ret == Z_OK); } in = h2b(hex, &have); assert(in != NULL); if (step == 0 || step > have) @@ -315,23 +318,26 @@ static void inf(char *hex, char *what, unsigned step, int win, unsigned len, int do { strm.avail_out = len; strm.next_out = out; - ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err); + ret = PREFIX(inflate)(&strm, Z_NO_FLUSH); + assert(err == 9 || ret == err); if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) break; if (ret == Z_NEED_DICT) { - ret = inflateSetDictionary(&strm, in, 1); + ret = PREFIX(inflateSetDictionary)(&strm, in, 1); assert(ret == Z_DATA_ERROR); mem_limit(&strm, 1); - ret = inflateSetDictionary(&strm, out, 0); + ret = PREFIX(inflateSetDictionary)(&strm, out, 0); assert(ret == Z_MEM_ERROR); mem_limit(&strm, 0); ((struct inflate_state *)strm.state)->mode = DICT; - ret = inflateSetDictionary(&strm, out, 0); + ret = PREFIX(inflateSetDictionary)(&strm, out, 0); assert(ret == Z_OK); - ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR); + ret = PREFIX(inflate)(&strm, Z_NO_FLUSH); + assert(ret == Z_BUF_ERROR); } - ret = inflateCopy(©, &strm); assert(ret == Z_OK); - ret = inflateEnd(©); assert(ret == Z_OK); + ret = PREFIX(inflateCopy)(©, &strm); + assert(ret == Z_OK); + ret = PREFIX(inflateEnd)(©); assert(ret == Z_OK); err = 9; /* don't care next time around */ have += strm.avail_in; strm.avail_in = step > have ? have : step; @@ -339,27 +345,27 @@ static void inf(char *hex, char *what, unsigned step, int win, unsigned len, int } while (strm.avail_in); free(in); free(out); - ret = inflateReset2(&strm, -8); assert(ret == Z_OK); - ret = inflateEnd(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateReset2)(&strm, -8); assert(ret == Z_OK); + ret = PREFIX(inflateEnd)(&strm); assert(ret == Z_OK); mem_done(&strm, what); + (void)err; } /* cover all of the lines in inflate.c up to inflate() */ -static void cover_support(void) -{ +static void cover_support(void) { int ret; - z_stream strm; + PREFIX3(stream) strm; mem_setup(&strm); strm.avail_in = 0; strm.next_in = NULL; - ret = inflateInit(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateInit)(&strm); assert(ret == Z_OK); mem_used(&strm, "inflate init"); - ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK); - ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK); - ret = inflateSetDictionary(&strm, NULL, 0); + ret = PREFIX(inflatePrime)(&strm, 5, 31); assert(ret == Z_OK); + ret = PREFIX(inflatePrime)(&strm, -1, 0); assert(ret == Z_OK); + ret = PREFIX(inflateSetDictionary)(&strm, NULL, 0); assert(ret == Z_STREAM_ERROR); - ret = inflateEnd(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateEnd)(&strm); assert(ret == Z_OK); mem_done(&strm, "prime"); inf("63 0", "force window allocation", 0, -15, 1, Z_OK); @@ -371,27 +377,27 @@ static void cover_support(void) mem_setup(&strm); strm.avail_in = 0; strm.next_in = NULL; - ret = inflateInit_(&strm, ZLIB_VERSION + 1, (int)sizeof(z_stream)); + ret = PREFIX(inflateInit_)(&strm, &PREFIX2(VERSION)[1], (int)sizeof(PREFIX3(stream))); assert(ret == Z_VERSION_ERROR); mem_done(&strm, "wrong version"); strm.avail_in = 0; strm.next_in = NULL; - ret = inflateInit(&strm); assert(ret == Z_OK); - ret = inflateEnd(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateInit)(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateEnd)(&strm); assert(ret == Z_OK); fputs("inflate built-in memory routines\n", stderr); + (void)ret; } /* cover all inflate() header and trailer cases and code after inflate() */ -static void cover_wrap(void) -{ +static void cover_wrap(void) { int ret; - z_stream strm, copy; + PREFIX3(stream) strm, copy; unsigned char dict[257]; - ret = inflate(NULL, 0); assert(ret == Z_STREAM_ERROR); - ret = inflateEnd(NULL); assert(ret == Z_STREAM_ERROR); - ret = inflateCopy(NULL, NULL); assert(ret == Z_STREAM_ERROR); + ret = PREFIX(inflate)(NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = PREFIX(inflateEnd)(NULL); assert(ret == Z_STREAM_ERROR); + ret = PREFIX(inflateCopy)(NULL, NULL); assert(ret == Z_STREAM_ERROR); fputs("inflate bad parameters\n", stderr); inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); @@ -411,39 +417,43 @@ static void cover_wrap(void) mem_setup(&strm); strm.avail_in = 0; strm.next_in = NULL; - ret = inflateInit2(&strm, -8); + ret = PREFIX(inflateInit2)(&strm, -8); strm.avail_in = 2; strm.next_in = (void *)"\x63"; strm.avail_out = 1; strm.next_out = (void *)&ret; mem_limit(&strm, 1); - ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); - ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = PREFIX(inflate)(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = PREFIX(inflate)(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); mem_limit(&strm, 0); memset(dict, 0, 257); - ret = inflateSetDictionary(&strm, dict, 257); + ret = PREFIX(inflateSetDictionary)(&strm, dict, 257); assert(ret == Z_OK); mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); - ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + ret = PREFIX(inflatePrime)(&strm, 16, 0); assert(ret == Z_OK); strm.avail_in = 2; strm.next_in = (void *)"\x80"; - ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); - ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + ret = PREFIX(inflateSync)(&strm); assert(ret == Z_DATA_ERROR); + ret = PREFIX(inflate)(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); strm.avail_in = 4; strm.next_in = (void *)"\0\0\xff\xff"; - ret = inflateSync(&strm); assert(ret == Z_OK); - (void)inflateSyncPoint(&strm); - ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); + ret = PREFIX(inflateSync)(&strm); assert(ret == Z_OK); + (void)PREFIX(inflateSyncPoint)(&strm); + ret = PREFIX(inflateCopy)(©, &strm); assert(ret == Z_MEM_ERROR); mem_limit(&strm, 0); - ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR); - (void)inflateMark(&strm); - ret = inflateEnd(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateUndermine)(&strm, 1); +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + assert(ret == Z_OK); +#else + assert(ret == Z_DATA_ERROR); +#endif + (void)PREFIX(inflateMark)(&strm); + ret = PREFIX(inflateEnd)(&strm); assert(ret == Z_OK); mem_done(&strm, "miscellaneous, force memory errors"); } /* input and output functions for inflateBack() */ -static unsigned pull(void *desc, const unsigned char **buf) -{ +static unsigned pull(void *desc, z_const unsigned char **buf) { static unsigned int next = 0; static unsigned char dat[] = {0x63, 0, 2, 0}; struct inflate_state *state; @@ -452,63 +462,65 @@ static unsigned pull(void *desc, const unsigned char **buf) next = 0; return 0; /* no input (already provided at next_in) */ } - state = (void *)((z_stream *)desc)->state; + state = (void *)((PREFIX3(stream) *)desc)->state; if (state != NULL) state->mode = SYNC; /* force an otherwise impossible situation */ return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; } -static int push(void *desc, unsigned char *buf, unsigned len) -{ +static int push(void *desc, unsigned char *buf, unsigned len) { buf += len; + (void)buf; return desc != NULL; /* force error if desc not null */ } /* cover inflateBack() up to common deflate data cases and after those */ -static void cover_back(void) -{ +static void cover_back(void) { int ret; - z_stream strm; + PREFIX3(stream) strm; unsigned char win[32768]; - ret = inflateBackInit_(NULL, 0, win, 0, 0); + ret = PREFIX(inflateBackInit_)(NULL, 0, win, 0, 0); assert(ret == Z_VERSION_ERROR); - ret = inflateBackInit(NULL, 0, win); assert(ret == Z_STREAM_ERROR); - ret = inflateBack(NULL, NULL, NULL, NULL, NULL); + ret = PREFIX(inflateBackInit)(NULL, 0, win); assert(ret == Z_STREAM_ERROR); - ret = inflateBackEnd(NULL); assert(ret == Z_STREAM_ERROR); + ret = PREFIX(inflateBack)(NULL, NULL, NULL, NULL, NULL); + assert(ret == Z_STREAM_ERROR); + ret = PREFIX(inflateBackEnd)(NULL); assert(ret == Z_STREAM_ERROR); fputs("inflateBack bad parameters\n", stderr); mem_setup(&strm); - ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = PREFIX(inflateBackInit)(&strm, 15, win); + assert(ret == Z_OK); strm.avail_in = 2; strm.next_in = (void *)"\x03"; - ret = inflateBack(&strm, pull, NULL, push, NULL); + ret = PREFIX(inflateBack)(&strm, pull, NULL, push, NULL); assert(ret == Z_STREAM_END); /* force output error */ strm.avail_in = 3; strm.next_in = (void *)"\x63\x00"; - ret = inflateBack(&strm, pull, NULL, push, &strm); + ret = PREFIX(inflateBack)(&strm, pull, NULL, push, &strm); assert(ret == Z_BUF_ERROR); /* force mode error by mucking with state */ - ret = inflateBack(&strm, pull, &strm, push, NULL); + ret = PREFIX(inflateBack)(&strm, pull, &strm, push, NULL); assert(ret == Z_STREAM_ERROR); - ret = inflateBackEnd(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateBackEnd)(&strm); assert(ret == Z_OK); mem_done(&strm, "inflateBack bad state"); - ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); - ret = inflateBackEnd(&strm); assert(ret == Z_OK); + ret = PREFIX(inflateBackInit)(&strm, 15, win); + assert(ret == Z_OK); + ret = PREFIX(inflateBackEnd)(&strm); assert(ret == Z_OK); fputs("inflateBack built-in memory routines\n", stderr); + (void)ret; } /* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ -static int try(char *hex, char *id, int err) -{ +static int try(char *hex, char *id, int err) { int ret; unsigned len, size; unsigned char *in, *out, *win; char *prefix; - z_stream strm; + PREFIX3(stream) strm; /* convert to hex */ in = h2b(hex, &len); @@ -529,14 +541,14 @@ static int try(char *hex, char *id, int err) mem_setup(&strm); strm.avail_in = 0; strm.next_in = NULL; - ret = inflateInit2(&strm, err < 0 ? 47 : -15); + ret = PREFIX(inflateInit2)(&strm, err < 0 ? 47 : -15); assert(ret == Z_OK); strm.avail_in = len; strm.next_in = in; do { strm.avail_out = size; strm.next_out = out; - ret = inflate(&strm, Z_TREES); + ret = PREFIX(inflate)(&strm, Z_TREES); assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR); if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT) break; @@ -545,7 +557,7 @@ static int try(char *hex, char *id, int err) assert(ret == Z_DATA_ERROR); assert(strcmp(id, strm.msg) == 0); } - inflateEnd(&strm); + PREFIX(inflateEnd)(&strm); mem_done(&strm, prefix); /* then with inflateBack */ @@ -553,17 +565,17 @@ static int try(char *hex, char *id, int err) strcpy(prefix, id); strcat(prefix, "-back"); mem_setup(&strm); - ret = inflateBackInit(&strm, 15, win); + ret = PREFIX(inflateBackInit)(&strm, 15, win); assert(ret == Z_OK); strm.avail_in = len; strm.next_in = in; - ret = inflateBack(&strm, pull, NULL, push, NULL); + ret = PREFIX(inflateBack)(&strm, pull, NULL, push, NULL); assert(ret != Z_STREAM_ERROR); - if (err) { + if (err && ret != Z_BUF_ERROR) { assert(ret == Z_DATA_ERROR); assert(strcmp(id, strm.msg) == 0); } - inflateBackEnd(&strm); + PREFIX(inflateBackEnd)(&strm); mem_done(&strm, prefix); } @@ -576,8 +588,7 @@ static int try(char *hex, char *id, int err) } /* cover deflate data cases in both inflate() and inflateBack() */ -static void cover_inflate(void) -{ +static void cover_inflate(void) { try("0 0 0 0 0", "invalid stored block lengths", 1); try("3 0", "fixed", 0); try("6", "invalid block type", 1); @@ -592,7 +603,11 @@ static void cover_inflate(void) try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1); try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1); try("2 7e ff ff", "invalid distance code", 1); +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 0); +#else try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1); +#endif /* also trailer mismatch just in inflate() */ try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1); @@ -612,8 +627,7 @@ static void cover_inflate(void) } /* cover remaining lines in inftrees.c */ -static void cover_trees(void) -{ +static void cover_trees(void) { int ret; unsigned bits; uint16_t lens[16], work[16]; @@ -626,18 +640,18 @@ static void cover_trees(void) lens[15] = 15; next = table; bits = 15; - ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + ret = zng_inflate_table(DISTS, lens, 16, &next, &bits, work); assert(ret == 1); next = table; bits = 1; - ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + ret = zng_inflate_table(DISTS, lens, 16, &next, &bits, work); assert(ret == 1); fputs("inflate_table not enough errors\n", stderr); + (void)ret; } /* cover remaining inffast.c decoding and window copying */ -static void cover_fast(void) -{ +static void cover_fast(void) { inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49" @@ -656,9 +670,8 @@ static void cover_fast(void) Z_STREAM_END); } -int main(void) -{ - fprintf(stderr, "%s\n", zlibVersion()); +int main(void) { + fprintf(stderr, "%s\n", zVersion()); cover_support(); cover_wrap(); cover_back(); diff --git a/libs/zlibng/test/minideflate.c b/libs/zlibng/test/minideflate.c new file mode 100644 index 000000000..392516852 --- /dev/null +++ b/libs/zlibng/test/minideflate.c @@ -0,0 +1,307 @@ +/* minideflate.c -- test deflate/inflate under specific conditions + * Copyright (C) 2020 Nathan Moinvaziri + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "zbuild.h" +#ifdef ZLIB_COMPAT +# include "zlib.h" +#else +# include "zlib-ng.h" +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +#define CHECK_ERR(err, msg) { \ + if (err != Z_OK) { \ + fprintf(stderr, "%s error: %d\n", msg, err); \ + exit(1); \ + } \ +} + +/* =========================================================================== + * deflate() using specialized parameters + */ +void deflate_params(FILE *fin, FILE *fout, int32_t read_buf_size, int32_t write_buf_size, int32_t level, + int32_t window_bits, int32_t mem_level, int32_t strategy, int32_t flush) { + PREFIX3(stream) c_stream; /* compression stream */ + uint8_t *read_buf; + uint8_t *write_buf; + int32_t read; + int err; + + read_buf = (uint8_t *)malloc(read_buf_size); + if (read_buf == NULL) { + fprintf(stderr, "failed to create read buffer (%d)\n", read_buf_size); + return; + } + write_buf = (uint8_t *)malloc(write_buf_size); + if (write_buf == NULL) { + fprintf(stderr, "failed to create write buffer (%d)\n", write_buf_size); + free(read_buf); + return; + } + + c_stream.zalloc = NULL; + c_stream.zfree = NULL; + c_stream.opaque = (void *)0; + c_stream.total_in = 0; + c_stream.total_out = 0; + + err = PREFIX(deflateInit2)(&c_stream, level, Z_DEFLATED, window_bits, mem_level, strategy); + CHECK_ERR(err, "deflateInit2"); + + /* Process input using our read buffer and flush type, + * output to stdout only once write buffer is full */ + do { + read = (int32_t)fread(read_buf, 1, read_buf_size, fin); + if (read <= 0) + break; + + c_stream.next_in = (z_const uint8_t *)read_buf; + c_stream.next_out = write_buf; + c_stream.avail_in = read; + + do { + c_stream.avail_out = write_buf_size; + err = PREFIX(deflate)(&c_stream, flush); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + + if (c_stream.next_out == write_buf + write_buf_size) { + fwrite(write_buf, 1, write_buf_size, fout); + c_stream.next_out = write_buf; + } + } while (c_stream.next_in < read_buf + read); + } while (err == Z_OK); + + /* Finish the stream if necessary */ + if (flush != Z_FINISH) { + c_stream.avail_in = 0; + do { + if (c_stream.next_out == write_buf + write_buf_size) { + fwrite(write_buf, 1, write_buf_size, fout); + c_stream.next_out = write_buf; + } + + c_stream.avail_out = write_buf_size; + err = PREFIX(deflate)(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } while (err == Z_OK); + } + + /* Output remaining data in write buffer */ + if (c_stream.next_out != write_buf) { + fwrite(write_buf, 1, c_stream.next_out - write_buf, fout); + } + + err = PREFIX(deflateEnd)(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + free(read_buf); + free(write_buf); +} + +/* =========================================================================== + * inflate() using specialized parameters + */ +void inflate_params(FILE *fin, FILE *fout, int32_t read_buf_size, int32_t write_buf_size, int32_t window_bits, + int32_t flush) { + PREFIX3(stream) d_stream; /* decompression stream */ + uint8_t *read_buf; + uint8_t *write_buf; + int32_t read; + int err; + + + read_buf = (uint8_t *)malloc(read_buf_size); + if (read_buf == NULL) { + fprintf(stderr, "failed to create read buffer (%d)\n", read_buf_size); + return; + } + write_buf = (uint8_t *)malloc(write_buf_size); + if (write_buf == NULL) { + fprintf(stderr, "failed to create write buffer (%d)\n", write_buf_size); + free(read_buf); + return; + } + + d_stream.zalloc = NULL; + d_stream.zfree = NULL; + d_stream.opaque = (void *)0; + d_stream.total_in = 0; + d_stream.total_out = 0; + + err = PREFIX(inflateInit2)(&d_stream, window_bits); + CHECK_ERR(err, "inflateInit2"); + + /* Process input using our read buffer and flush type, + * output to stdout only once write buffer is full */ + do { + read = (int32_t)fread(read_buf, 1, read_buf_size, fin); + if (read <= 0) + break; + + d_stream.next_in = (z_const uint8_t *)read_buf; + d_stream.next_out = write_buf; + d_stream.avail_in = read; + + do { + d_stream.avail_out = write_buf_size; + err = PREFIX(inflate)(&d_stream, flush); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + + if (d_stream.next_out == write_buf + write_buf_size) { + fwrite(write_buf, 1, write_buf_size, fout); + d_stream.next_out = write_buf; + } + } while (d_stream.next_in < read_buf + read); + } while (err == Z_OK); + + /* Finish the stream if necessary */ + if (flush != Z_FINISH) { + d_stream.avail_in = 0; + do { + if (d_stream.next_out == write_buf + write_buf_size) { + fwrite(write_buf, 1, write_buf_size, fout); + d_stream.next_out = write_buf; + } + + d_stream.avail_out = write_buf_size; + err = PREFIX(inflate)(&d_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "inflate"); + } while (err == Z_OK); + } + + /* Output remaining data in write buffer */ + if (d_stream.next_out != write_buf) { + fwrite(write_buf, 1, d_stream.next_out - write_buf, fout); + } + + err = PREFIX(inflateEnd)(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + free(read_buf); + free(write_buf); +} + +void show_help(void) { + printf("Usage: minideflate [-c] [-f|-h|-R|-F] [-m level] [-r/-t size] [-s flush] [-w bits] [-0 to -9] [input file]\n\n" \ + " -c : write to standard output\n" \ + " -d : decompress\n" \ + " -f : compress with Z_FILTERED\n" \ + " -h : compress with Z_HUFFMAN_ONLY\n" \ + " -R : compress with Z_RLE\n" \ + " -F : compress with Z_FIXED\n" \ + " -m : memory level (1 to 8)\n" \ + " -w : window bits (8 to 15 for gzip, -8 to -15 for zlib)\n" \ + " -s : flush type (0 to 5)\n" \ + " -r : read buffer size\n" \ + " -t : write buffer size\n" \ + " -0 to -9 : compression level\n\n"); +} + +int main(int argc, char **argv) { + int32_t i; + int32_t mem_level = DEF_MEM_LEVEL; + int32_t window_bits = MAX_WBITS; + int32_t strategy = Z_DEFAULT_STRATEGY; + int32_t level = Z_DEFAULT_COMPRESSION; + int32_t read_buf_size = 4096; + int32_t write_buf_size = 4096; + int32_t flush = Z_NO_FLUSH; + uint8_t copyout = 0; + uint8_t uncompr = 0; + char out_file[320]; + FILE *fin = stdin; + FILE *fout = stdout; + + for (i = 1; i < argc; i++) { + if ((strcmp(argv[i], "-m") == 0) && (i + 1 < argc)) + mem_level = atoi(argv[++i]); + else if ((strcmp(argv[i], "-w") == 0) && (i + 1 < argc)) + window_bits = atoi(argv[++i]); + else if ((strcmp(argv[i], "-r") == 0) && (i + 1 < argc)) + read_buf_size = atoi(argv[++i]); + else if ((strcmp(argv[i], "-t") == 0) && (i + 1 < argc)) + write_buf_size = atoi(argv[++i]); + else if ((strcmp(argv[i], "-s") == 0) && (i + 1 < argc)) + flush = atoi(argv[++i]); + else if (strcmp(argv[i], "-c") == 0) + copyout = 1; + else if (strcmp(argv[i], "-d") == 0) + uncompr = 1; + else if (strcmp(argv[i], "-f") == 0) + strategy = Z_FILTERED; + else if (strcmp(argv[i], "-h") == 0) + strategy = Z_HUFFMAN_ONLY; + else if (strcmp(argv[i], "-R") == 0) + strategy = Z_RLE; + else if (argv[i][0] == '-' && argv[i][1] >= '0' && argv[i][1] <= '9' && argv[i][2] == 0) + level = argv[i][1] - '0'; + else if (strcmp(argv[i], "--help") == 0) { + show_help(); + return 0; + } else if (argv[i][0] == '-') { + show_help(); + return 64; /* EX_USAGE */ + } else + break; + } + + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + if (i != argc) { + fin = fopen(argv[i], "rb+"); + if (fin == NULL) { + fprintf(stderr, "Failed to open file: %s\n", argv[i]); + exit(1); + } + if (!copyout) { + snprintf(out_file, sizeof(out_file), "%s%s", argv[i], (window_bits < 0) ? ".zz" : ".gz"); + fout = fopen(out_file, "wb"); + if (fout == NULL) { + fprintf(stderr, "Failed to open file: %s\n", out_file); + exit(1); + } + } + } + + if (uncompr) { + inflate_params(fin, fout, read_buf_size, write_buf_size, window_bits, flush); + } else { + deflate_params(fin, fout, read_buf_size, write_buf_size, level, window_bits, mem_level, strategy, flush); + } + + if (fin != stdin) { + fclose(fin); + } + if (fout != stdout) { + fclose(fout); + } + + return 0; +} diff --git a/libs/zlibng/test/minigzip.c b/libs/zlibng/test/minigzip.c index ebbed9ae3..2e4ef8e2a 100644 --- a/libs/zlibng/test/minigzip.c +++ b/libs/zlibng/test/minigzip.c @@ -12,16 +12,14 @@ * real thing. */ -/* @(#) $Id$ */ - #define _POSIX_SOURCE 1 /* This file needs POSIX for fdopen(). */ #define _POSIX_C_SOURCE 200112 /* For snprintf(). */ #include "zbuild.h" #ifdef ZLIB_COMPAT -# include "zlib.h" +# include "zlib.h" #else -# include "zlib-ng.h" +# include "zlib-ng.h" #endif #include @@ -38,7 +36,7 @@ # include #endif -#if defined(WIN32) || defined(__CYGWIN__) +#if defined(_WIN32) || defined(__CYGWIN__) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) @@ -51,8 +49,8 @@ #endif #if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) -#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ - extern int unlink (const char *); +#ifndef _WIN32 /* unlink already in stdio.h for Win32 */ +extern int unlink (const char *); #endif #endif @@ -61,10 +59,8 @@ #endif #define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) -#if defined(S390_DFLTCC_DEFLATE) || defined(S390_DFLTCC_INFLATE) -#define BUFLEN 262144 /* DFLTCC works faster with larger buffers */ -#else -#define BUFLEN 16384 /* read buffer size */ +#ifndef BUFLEN +# define BUFLEN 16384 /* read buffer size */ #endif #define BUFLENW (BUFLEN * 3) /* write buffer size */ #define MAX_NAME_LEN 1024 @@ -72,20 +68,19 @@ static char *prog; void error (const char *msg); -void gz_compress (FILE *in, gzFile out); +void gz_compress (FILE *in, gzFile out); #ifdef USE_MMAP -int gz_compress_mmap (FILE *in, gzFile out); +int gz_compress_mmap (FILE *in, gzFile out); #endif -void gz_uncompress (gzFile in, FILE *out); -void file_compress (char *file, char *mode); -void file_uncompress (char *file); +void gz_uncompress (gzFile in, FILE *out); +void file_compress (char *file, char *mode, int keep); +void file_uncompress (char *file, int keep); int main (int argc, char *argv[]); /* =========================================================================== * Display error message and exit */ -void error(const char *msg) -{ +void error(const char *msg) { fprintf(stderr, "%s: %s\n", prog, msg); exit(1); } @@ -94,9 +89,8 @@ void error(const char *msg) * Compress input to output then close both files. */ -void gz_compress(FILE *in, gzFile out) -{ - char buf[BUFLEN]; +void gz_compress(FILE *in, gzFile out) { + char *buf; int len; int err; @@ -106,12 +100,16 @@ void gz_compress(FILE *in, gzFile out) */ if (gz_compress_mmap(in, out) == Z_OK) return; #endif - /* Clear out the contents of buf before reading from the file to avoid - MemorySanitizer: use-of-uninitialized-value warnings. */ - memset(buf, 0, sizeof(buf)); + buf = (char *)calloc(BUFLEN, 1); + if (buf == NULL) { + perror("out of memory"); + exit(1); + } + for (;;) { - len = (int)fread(buf, 1, sizeof(buf), in); + len = (int)fread(buf, 1, BUFLEN, in); if (ferror(in)) { + free(buf); perror("fread"); exit(1); } @@ -119,6 +117,7 @@ void gz_compress(FILE *in, gzFile out) if (PREFIX(gzwrite)(out, buf, (unsigned)len) != len) error(PREFIX(gzerror)(out, &err)); } + free(buf); fclose(in); if (PREFIX(gzclose)(out) != Z_OK) error("failed gzclose"); } @@ -128,12 +127,11 @@ void gz_compress(FILE *in, gzFile out) /* Try compressing the input file at once using mmap. Return Z_OK if * if success, Z_ERRNO otherwise. */ -int gz_compress_mmap(FILE *in, gzFile out) -{ +int gz_compress_mmap(FILE *in, gzFile out) { int len; int err; int ifd = fileno(in); - caddr_t buf; /* mmap'ed buffer for the entire input file */ + char *buf; /* mmap'ed buffer for the entire input file */ off_t buf_len; /* length of the input file */ struct stat sb; @@ -143,11 +141,11 @@ int gz_compress_mmap(FILE *in, gzFile out) if (buf_len <= 0) return Z_ERRNO; /* Now do the actual mmap: */ - buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); - if (buf == (caddr_t)(-1)) return Z_ERRNO; + buf = mmap((void *)0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (char *)(-1)) return Z_ERRNO; /* Compress the whole file at once: */ - len = PREFIX(gzwrite)(out, (char *)buf, (unsigned)buf_len); + len = PREFIX(gzwrite)(out, buf, (unsigned)buf_len); if (len != (int)buf_len) error(PREFIX(gzerror)(out, &err)); @@ -161,21 +159,27 @@ int gz_compress_mmap(FILE *in, gzFile out) /* =========================================================================== * Uncompress input to output then close both files. */ -void gz_uncompress(gzFile in, FILE *out) -{ - char buf[BUFLENW]; +void gz_uncompress(gzFile in, FILE *out) { + char *buf = (char *)malloc(BUFLENW); int len; int err; + if (buf == NULL) error("out of memory"); + for (;;) { - len = PREFIX(gzread)(in, buf, sizeof(buf)); - if (len < 0) error (PREFIX(gzerror)(in, &err)); + len = PREFIX(gzread)(in, buf, BUFLENW); + if (len < 0) { + free(buf); + error(PREFIX(gzerror)(in, &err)); + } if (len == 0) break; if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + free(buf); error("failed fwrite"); } } + free(buf); if (fclose(out)) error("failed fclose"); if (PREFIX(gzclose)(in) != Z_OK) error("failed gzclose"); @@ -186,10 +190,9 @@ void gz_uncompress(gzFile in, FILE *out) * Compress the given file: create a corresponding .gz file and remove the * original. */ -void file_compress(char *file, char *mode) -{ +void file_compress(char *file, char *mode, int keep) { char outfile[MAX_NAME_LEN]; - FILE *in; + FILE *in; gzFile out; if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { @@ -211,18 +214,18 @@ void file_compress(char *file, char *mode) } gz_compress(in, out); - unlink(file); + if (!keep) + unlink(file); } /* =========================================================================== * Uncompress the given file and remove the original. */ -void file_uncompress(char *file) -{ +void file_uncompress(char *file, int keep) { char buf[MAX_NAME_LEN]; char *infile, *outfile; - FILE *out; + FILE *out; gzFile in; size_t len = strlen(file); @@ -255,63 +258,75 @@ void file_uncompress(char *file) gz_uncompress(in, out); - unlink(infile); + if (!keep) + unlink(infile); } +void show_help(void) { + printf("Usage: minigzip [-c] [-d] [-k] [-f|-h|-R|-F|-T] [-A] [-0 to -9] [files...]\n\n" \ + " -c : write to standard output\n" \ + " -d : decompress\n" \ + " -k : keep input files\n" \ + " -f : compress with Z_FILTERED\n" \ + " -h : compress with Z_HUFFMAN_ONLY\n" \ + " -R : compress with Z_RLE\n" \ + " -F : compress with Z_FIXED\n" \ + " -T : stored raw\n" \ + " -A : auto detect type\n" \ + " -0 to -9 : compression level\n\n"); +} -/* =========================================================================== - * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] - * -c : write to standard output - * -d : decompress - * -f : compress with Z_FILTERED - * -h : compress with Z_HUFFMAN_ONLY - * -r : compress with Z_RLE - * -0 to -9 : compression level - */ - -int main(int argc, char *argv[]) -{ +int main(int argc, char *argv[]) { int copyout = 0; int uncompr = 0; + int keep = 0; + int i = 0; gzFile file; char *bname, outmode[20]; + char *strategy = ""; + char *level = "6"; + char *type = "b"; - snprintf(outmode, sizeof(outmode), "%s", "wb6 "); - - prog = argv[0]; - bname = strrchr(argv[0], '/'); + prog = argv[i]; + bname = strrchr(argv[i], '/'); if (bname) - bname++; + bname++; else - bname = argv[0]; - argc--, argv++; + bname = argv[i]; if (!strcmp(bname, "gunzip")) - uncompr = 1; - else if (!strcmp(bname, "zcat")) - copyout = uncompr = 1; - - while (argc > 0) { - if (strcmp(*argv, "-c") == 0) - copyout = 1; - else if (strcmp(*argv, "-d") == 0) uncompr = 1; - else if (strcmp(*argv, "-f") == 0) - outmode[3] = 'f'; - else if (strcmp(*argv, "-h") == 0) - outmode[3] = 'h'; - else if (strcmp(*argv, "-r") == 0) - outmode[3] = 'R'; - else if ((*argv)[0] == '-' && (*argv)[1] >= '0' && (*argv)[1] <= '9' && - (*argv)[2] == 0) - outmode[2] = (*argv)[1]; - else - break; - argc--, argv++; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-c") == 0) + copyout = 1; + else if (strcmp(argv[i], "-d") == 0) + uncompr = 1; + else if (strcmp(argv[i], "-k") == 0) + keep = 1; + else if (strcmp(argv[i], "-A") == 0) + type = ""; + else if (argv[i][0] == '-' && (argv[i][1] == 'f' || argv[i][1] == 'h' || + argv[i][1] == 'R' || argv[i][1] == 'F' || argv[i][1] == 'T') && argv[i][2] == 0) + strategy = argv[i] + 1; + else if (argv[i][0] == '-' && argv[i][1] >= '0' && argv[i][1] <= '9' && argv[i][2] == 0) + level = argv[i] + 1; + else if (strcmp(argv[i], "--help") == 0) { + show_help(); + return 0; + } else if (argv[i][0] == '-') { + show_help(); + return 64; /* EX_USAGE */ + } else { + break; + } } - if (outmode[3] == ' ') - outmode[3] = 0; - if (argc == 0) { + + snprintf(outmode, sizeof(outmode), "w%s%s%s", type, strategy, level); + + if (i == argc) { SET_BINARY_MODE(stdin); SET_BINARY_MODE(stdout); if (uncompr) { @@ -330,20 +345,20 @@ int main(int argc, char *argv[]) do { if (uncompr) { if (copyout) { - file = PREFIX(gzopen)(*argv, "rb"); + file = PREFIX(gzopen)(argv[i], "rb"); if (file == NULL) - fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + fprintf(stderr, "%s: can't gzopen %s\n", prog, argv[i]); else gz_uncompress(file, stdout); } else { - file_uncompress(*argv); + file_uncompress(argv[i], keep); } } else { if (copyout) { - FILE * in = fopen(*argv, "rb"); + FILE * in = fopen(argv[i], "rb"); if (in == NULL) { - perror(*argv); + perror(argv[i]); } else { file = PREFIX(gzdopen)(fileno(stdout), outmode); if (file == NULL) error("can't gzdopen stdout"); @@ -352,10 +367,10 @@ int main(int argc, char *argv[]) } } else { - file_compress(*argv, outmode); + file_compress(argv[i], outmode, keep); } } - } while (argv++, --argc); + } while (++i < argc); } return 0; } diff --git a/libs/zlibng/test/pkgcheck.sh b/libs/zlibng/test/pkgcheck.sh new file mode 100644 index 000000000..4c757dff1 --- /dev/null +++ b/libs/zlibng/test/pkgcheck.sh @@ -0,0 +1,176 @@ +#!/bin/sh + +usage() { + cat <<"_EOF_" +Usage: sh test/pkgcheck.sh [--zlib-compat] + +Verifies that the various build systems produce identical results on a Unixlike system. +If --zlib-compat, tests with zlib compatible builds. + +To build the 32 bit version for the current 64 bit arch: + +$ sudo apt install ninja-build diffoscope gcc-multilib +$ export CMAKE_ARGS="-DCMAKE_C_FLAGS=-m32" CFLAGS=-m32 LDFLAGS=-m32 +$ sh test/pkgcheck.sh + +To cross-build, install the appropriate qemu and gcc packages, +and set the environment variables used by configure or cmake. +On Ubuntu, for example (values taken from .github/workflows/pkgconf.yml): + +arm HF: +$ sudo apt install ninja-build diffoscope qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross +$ export CHOST=arm-linux-gnueabihf +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=${CHOST}" + +aarch64: +$ sudo apt install ninja-build diffoscope qemu gcc-aarch64-linux-gnu libc6-dev-arm64-cross +$ export CHOST=aarch64-linux-gnu +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DCMAKE_C_COMPILER_TARGET=${CHOST}" + +ppc (32 bit big endian): +$ sudo apt install ninja-build diffoscope qemu gcc-powerpc-linux-gnu libc6-dev-powerpc-cross +$ export CHOST=powerpc-linux-gnu +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake" + +ppc64le: +$ sudo apt install ninja-build diffoscope qemu gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross +$ export CHOST=powerpc64le-linux-gnu +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake" + +then: +$ export CC=${CHOST}-gcc +$ sh test/pkgcheck.sh [--zlib-compat] + +Note: on Mac, you may also need to do 'sudo xcode-select -r' to get cmake to match configure/make's behavior (i.e. omit -isysroot). +_EOF_ +} + +set -ex + +# Caller can also set CMAKE_ARGS or CONFIGURE_ARGS if desired +CMAKE_ARGS=${CMAKE_ARGS} +CONFIGURE_ARGS=${CONFIGURE_ARGS} + +case "$1" in +--zlib-compat) + suffix="" + CMAKE_ARGS="$CMAKE_ARGS -DZLIB_COMPAT=ON" + CONFIGURE_ARGS="$CONFIGURE_ARGS --zlib-compat" + ;; +"") + suffix="-ng" + ;; +*) + echo "Unknown arg '$1'" + usage + exit 1 + ;; +esac + +if ! test -f "configure" +then + echo "Please run from top of source tree" + exit 1 +fi + +# Tell GNU's ld etc. to use Jan 1 1970 when embedding timestamps +# Probably only needed on older systems (ubuntu 14.04, BSD?) +export SOURCE_DATE_EPOCH=0 +case $(uname) in +Darwin) + # Tell Apple's ar etc. to use zero timestamps + export ZERO_AR_DATE=1 + # What CPU are we running on, exactly? + sysctl -n machdep.cpu.brand_string + sysctl -n machdep.cpu.features + sysctl -n machdep.cpu.leaf7_features + sysctl -n machdep.cpu.extfeatures + ;; +esac + +# Use same compiler for make and cmake builds +if test "$CC"x = ""x +then + if clang --version + then + export CC=clang + elif gcc --version + then + export CC=gcc + fi +fi + +# New build system +# Happens to delete top-level zconf.h +# (which itself is a bug, https://github.com/madler/zlib/issues/162 ) +# which triggers another bug later in configure, +# https://github.com/madler/zlib/issues/499 +rm -rf btmp2 pkgtmp2 +mkdir btmp2 pkgtmp2 +export DESTDIR=$(pwd)/pkgtmp2 +cd btmp2 + cmake -G Ninja ${CMAKE_ARGS} .. + ninja -v + ninja install +cd .. + +# Original build system +rm -rf btmp1 pkgtmp1 +mkdir btmp1 pkgtmp1 +export DESTDIR=$(pwd)/pkgtmp1 +cd btmp1 + case $(uname) in + Darwin) + export LDFLAGS="-Wl,-headerpad_max_install_names" + ;; + esac + ../configure $CONFIGURE_ARGS + make + make install +cd .. + +repack_ar() { + if ! cmp --silent pkgtmp1/usr/local/lib/libz$suffix.a pkgtmp2/usr/local/lib/libz$suffix.a + then + echo "libz$suffix.a does not match. Probably filenames differ (.o vs .c.o). Unpacking and renaming..." + # Note: %% is posix shell syntax meaning "Remove Largest Suffix Pattern", see + # https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02 + cd pkgtmp1; ar x usr/local/lib/libz$suffix.a; rm usr/local/lib/libz$suffix.a; cd .. + cd pkgtmp2; ar x usr/local/lib/libz$suffix.a; rm usr/local/lib/libz$suffix.a; for a in *.c.o; do mv $a ${a%%.c.o}.o; done; cd .. + # Also, remove __.SYMDEF SORTED if present, as it has those funky .c.o names embedded in it. + rm -f pkgtmp[12]/__.SYMDEF\ SORTED + fi +} + +case $(uname) in +Darwin) + # Remove the build uuid. + dylib1=$(find pkgtmp1 -type f -name '*.dylib*') + dylib2=$(find pkgtmp2 -type f -name '*.dylib*') + strip -x -no_uuid "$dylib1" + strip -x -no_uuid "$dylib2" + ;; +esac + +# The ar on newer systems defaults to -D (i.e. deterministic), +# but FreeBSD 12.1, Debian 8, and Ubuntu 14.04 seem to not do that. +# I had trouble passing -D safely to the ar inside CMakeLists.txt, +# so punt and unpack the archive if needed before comparing. +# Also, cmake uses different .o suffix anyway... +repack_ar + +if diff -Nur pkgtmp1 pkgtmp2 +then + echo pkgcheck-cmake-bits-identical PASS +else + echo pkgcheck-cmake-bits-identical FAIL + dylib1=$(find pkgtmp1 -type f -name '*.dylib*' -print -o -type f -name '*.so.*' -print) + dylib2=$(find pkgtmp2 -type f -name '*.dylib*' -print -o -type f -name '*.so.*' -print) + diffoscope $dylib1 $dylib2 | cat + exit 1 +fi + +rm -rf btmp1 btmp2 pkgtmp1 pkgtmp2 + +# any failure would have caused an early exit already +echo "pkgcheck: PASS" diff --git a/libs/zlibng/test/switchlevels.c b/libs/zlibng/test/switchlevels.c new file mode 100644 index 000000000..0f850113e --- /dev/null +++ b/libs/zlibng/test/switchlevels.c @@ -0,0 +1,169 @@ +/* Compresses a user-specified number of chunks from stdin into stdout as a single gzip stream. + * Each chunk is compressed with a user-specified level. + */ + +#include "zbuild.h" +#ifdef ZLIB_COMPAT +# include "zlib.h" +#else +# include "zlib-ng.h" +#endif + +#include +#include +#include + +#if defined(_WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +static int read_all(unsigned char *buf, size_t size) { + size_t total_read = 0; + while (total_read < size) { + size_t n_read = fread(buf + total_read, 1, size - total_read, stdin); + if (ferror(stdin)) { + perror("fread\n"); + return 1; + } + if (n_read == 0) { + fprintf(stderr, "Premature EOF\n"); + return 1; + } + total_read += n_read; + } + return 0; +} + +static int write_all(unsigned char *buf, size_t size) { + size_t total_written = 0; + while (total_written < size) { + size_t n_written = fwrite(buf + total_written, 1, size - total_written, stdout); + if (ferror(stdout)) { + perror("fwrite\n"); + return 1; + } + total_written += n_written; + } + return 0; +} + +static int compress_chunk(PREFIX3(stream) *strm, int level, int size, int last) { + int ret = 1; + int err = 0; + unsigned long compsize; + unsigned char *buf; + + if (size <= 0) { + fprintf(stderr, "compress_chunk() invalid size %d\n", size); + goto done; + } + if (level < 0 || level > 9) { + fprintf(stderr, "compress_chunk() invalid level %d\n", level); + goto done; + } + + compsize = 100 + 2 * PREFIX(deflateBound)(strm, size); + buf = malloc(size + compsize); + if (buf == NULL) { + fprintf(stderr, "Out of memory\n"); + goto done; + } + if (read_all(buf, size) != 0) { + goto free_buf; + } + + /* Provide only output buffer to deflateParams(). It might need some space to flush the leftovers from the last + * deflate(), but we don't want it to compress anything new. */ + strm->next_in = NULL; + strm->avail_in = 0; + strm->next_out = buf + size; + strm->avail_out = compsize; + err = PREFIX(deflateParams)(strm, level, Z_DEFAULT_STRATEGY); + if (err != Z_OK) { + fprintf(stderr, "deflateParams() failed with code %d\n", err); + goto free_buf; + } + + /* Provide input buffer to deflate(). */ + strm->next_in = buf; + strm->avail_in = size; + err = PREFIX(deflate)(strm, last ? Z_FINISH : Z_SYNC_FLUSH); + if ((!last && err != Z_OK) || (last && err != Z_STREAM_END)) { + fprintf(stderr, "deflate() failed with code %d\n", err); + goto free_buf; + } + if (strm->avail_in != 0) { + fprintf(stderr, "deflate() did not consume %d bytes of input\n", strm->avail_in); + goto free_buf; + } + if (write_all(buf + size, compsize - strm->avail_out) != 0) { + goto free_buf; + } + ret = 0; + +free_buf: + free(buf); +done: + return ret; +} + +void show_help(void) +{ + printf("Usage: switchlevels [-w bits] level1 size1 [level2 size2 ...]\n\n" \ + " -w : window bits (8 to 15 for gzip, -8 to -15 for zlib)\n\n"); +} + +int main(int argc, char **argv) { + int ret = EXIT_FAILURE; + int err = 0; + int size = 0; + int level = Z_DEFAULT_COMPRESSION; + int level_arg = 1; + int window_bits = MAX_WBITS + 16; + PREFIX3(stream) strm; + + + if ((argc == 1) || (argc == 2 && strcmp(argv[1], "--help") == 0)) { + show_help(); + return 0; + } + + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + memset(&strm, 0, sizeof(strm)); + + for (int i = 1; i < argc - 1; i++) { + if (strcmp(argv[i], "-w") == 0 && i+1 < argc) { + window_bits = atoi(argv[++i]); + } else { + level_arg = i; + level = atoi(argv[i]); + break; + } + } + + err = PREFIX(deflateInit2)(&strm, level, Z_DEFLATED, window_bits, 8, Z_DEFAULT_STRATEGY); + if (err != Z_OK) { + fprintf(stderr, "deflateInit() failed with code %d\n", err); + goto done; + } + + for (int i = level_arg; i < argc - 1; i += 2) { + level = atoi(argv[i]); + size = atoi(argv[i + 1]); + if (compress_chunk(&strm, level, size, i + 2 >= argc - 1) != 0) { + goto deflate_end; + } + } + ret = EXIT_SUCCESS; + +deflate_end: + PREFIX(deflateEnd)(&strm); +done: + return ret; +} diff --git a/libs/zlibng/test/testCVEinputs.sh b/libs/zlibng/test/testCVEinputs.sh index 8f23438d7..84f6b31c5 100644 --- a/libs/zlibng/test/testCVEinputs.sh +++ b/libs/zlibng/test/testCVEinputs.sh @@ -15,17 +15,16 @@ CVEs="CVE-2002-0059 CVE-2004-0797 CVE-2005-1849 CVE-2005-2096" for CVE in $CVEs; do fail=0 for testcase in ${TESTDIR}/${CVE}/*.gz; do - ${QEMU_RUN} ../minigzip${EXE} -d < "$testcase" - # we expect that a 1 error code is OK - # for a vulnerable failure we'd expect 134 or similar - if [ $? -ne 1 ] && [ $? -ne 0 ]; then - fail=1 - fi + ${QEMU_RUN} ../minigzip${EXE} -d < "$testcase" + # we expect that a 1 error code is OK + # for a vulnerable failure we'd expect 134 or similar + if [ $? -ne 1 ] && [ $? -ne 0 ]; then + fail=1 + fi done if [ $fail -eq 0 ]; then - echo " --- zlib not vulnerable to $CVE ---"; + echo " --- zlib not vulnerable to $CVE ---"; else - echo " --- zlib VULNERABLE to $CVE ---"; exit 1; + echo " --- zlib VULNERABLE to $CVE ---"; exit 1; fi done - diff --git a/libs/zlibng/tools/codecov-upload.sh b/libs/zlibng/tools/codecov-upload.sh new file mode 100644 index 000000000..e3a48aab7 --- /dev/null +++ b/libs/zlibng/tools/codecov-upload.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -ux +cd "$CODECOV_DIR" +python -m codecov --required --flags "$CODECOV_FLAGS" --name "$CODECOV_NAME" --gcov-exec="$CODECOV_EXEC" +if [ $? -ne 0 ]; then + sleep 30 + python -m codecov --required --flags "$CODECOV_FLAGS" --name "$CODECOV_NAME" --gcov-exec="$CODECOV_EXEC" --tries=25 +fi +exit $? diff --git a/libs/zlibng/tools/config.sub b/libs/zlibng/tools/config.sub new file mode 100644 index 000000000..dba175ae3 --- /dev/null +++ b/libs/zlibng/tools/config.sub @@ -0,0 +1,17 @@ +#!/bin/sh +# Canonicalize CHOST. +# In particular, converts Debian multiarch tuples into GNU triplets. +# See also +# https://wiki.debian.org/Multiarch/Tuples +# https://wiki.gentoo.org/wiki/CHOST +# If you need an architecture not listed here, file a bug at github.com/zlib-ng/zlib-ng +# and work around the problem by dropping libtool's much more comprehensive config.sub +# on top of this file, see +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +case "$1" in +*-*-linux-gnu*) echo $1;; +i686-linux-gnu*|x86_64-linux-gnu*) echo $1 | sed 's/-linux-gnu/-pc-linux-gnu/';; +*-linux-gnu*) echo $1 | sed 's/-linux-gnu/-unknown-linux-gnu/';; +*) echo $1;; +esac diff --git a/libs/zlibng/tools/makecrct.c b/libs/zlibng/tools/makecrct.c new file mode 100644 index 000000000..323d0c03d --- /dev/null +++ b/libs/zlibng/tools/makecrct.c @@ -0,0 +1,177 @@ +/* crc32.c -- output crc32 tables + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016, 2018 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h +*/ + +#include +#include +#include "zbuild.h" +#include "deflate.h" +#include "crc32_p.h" + +static uint32_t crc_table[8][256]; +static uint32_t crc_comb[GF2_DIM][GF2_DIM]; + +static void gf2_matrix_square(uint32_t *square, const uint32_t *mat); +static void make_crc_table(void); +static void make_crc_combine_table(void); +static void print_crc_table(void); +static void print_crc_combine_table(void); +static void write_table(const uint32_t *, int); + + +/* ========================================================================= */ +static void gf2_matrix_square(uint32_t *square, const uint32_t *mat) { + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +static void make_crc_table(void) { + int n, k; + uint32_t c; + uint32_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static const unsigned char p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26}; + + /* make exclusive-or pattern from polynomial (0xedb88320) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (uint32_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (uint32_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +} + +static void make_crc_combine_table(void) { + int n, k; + /* generate zero operators table for crc32_combine() */ + + /* generate the operator to apply a single zero bit to a CRC -- the + first row adds the polynomial if the low bit is a 1, and the + remaining rows shift the CRC right one bit */ + k = GF2_DIM - 3; + crc_comb[k][0] = 0xedb88320UL; /* CRC-32 polynomial */ + uint32_t row = 1; + for (n = 1; n < GF2_DIM; n++) { + crc_comb[k][n] = row; + row <<= 1; + } + /* generate operators that apply 2, 4, and 8 zeros to a CRC, putting + the last one, the operator for one zero byte, at the 0 position */ + gf2_matrix_square(crc_comb[k + 1], crc_comb[k]); + gf2_matrix_square(crc_comb[k + 2], crc_comb[k + 1]); + gf2_matrix_square(crc_comb[0], crc_comb[k + 2]); + + /* generate operators for applying 2^n zero bytes to a CRC, filling out + the remainder of the table -- the operators repeat after GF2_DIM + values of n, so the table only needs GF2_DIM entries, regardless of + the size of the length being processed */ + for (n = 1; n < k; n++) + gf2_matrix_square(crc_comb[n], crc_comb[n - 1]); +} + +static void write_table(const uint32_t *table, int k) { + int n; + + for (n = 0; n < k; n++) + printf("%s0x%08" PRIx32 "%s", n % 5 ? "" : " ", + (uint32_t)(table[n]), + n == k - 1 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} + +static void print_crc_table(void) { + int k; + printf("#ifndef CRC32_TBL_H_\n"); + printf("#define CRC32_TBL_H_\n\n"); + printf("/* crc32_tbl.h -- tables for rapid CRC calculation\n"); + printf(" * Generated automatically by makecrct.c\n */\n\n"); + + /* print CRC table */ + printf("static const uint32_t "); + printf("crc_table[8][256] =\n{\n {\n"); + write_table(crc_table[0], 256); + for (k = 1; k < 8; k++) { + printf(" },\n {\n"); + write_table(crc_table[k], 256); + } + printf(" }\n};\n\n"); + + printf("#endif /* CRC32_TBL_H_ */\n"); +} + +static void print_crc_combine_table(void) { + int k; + printf("#ifndef CRC32_COMB_TBL_H_\n"); + printf("#define CRC32_COMB_TBL_H_\n\n"); + printf("/* crc32_comb_tbl.h -- zero operators table for CRC combine\n"); + printf(" * Generated automatically by makecrct.c\n */\n\n"); + + /* print zero operator table */ + printf("static const uint32_t "); + printf("crc_comb[%d][%d] =\n{\n {\n", GF2_DIM, GF2_DIM); + write_table(crc_comb[0], GF2_DIM); + for (k = 1; k < GF2_DIM; k++) { + printf(" },\n {\n"); + write_table(crc_comb[k], GF2_DIM); + } + printf(" }\n};\n\n"); + + printf("#endif /* CRC32_COMB_TBL_H_ */\n"); +} + +// The output of this application can be piped out to recreate crc32.h +int main(int argc, char *argv[]) { + if (argc > 1 && strcmp(argv[1], "-c") == 0) { + make_crc_combine_table(); + print_crc_combine_table(); + } else { + make_crc_table(); + print_crc_table(); + } + return 0; +} diff --git a/libs/zlibng/tools/makefixed.c b/libs/zlibng/tools/makefixed.c new file mode 100644 index 000000000..7fe71e75e --- /dev/null +++ b/libs/zlibng/tools/makefixed.c @@ -0,0 +1,89 @@ +#include +#include "zbuild.h" +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" + +// Build and return state with length and distance decoding tables and index sizes set to fixed code decoding. +void Z_INTERNAL buildfixedtables(struct inflate_state *state) { + static code *lenfix, *distfix; + static code fixed[544]; + + // build fixed huffman tables + unsigned sym, bits; + static code *next; + + // literal/length table + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + zng_inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + // distance table + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + zng_inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + + +// Create fixed tables on the fly and write out a inffixed_tbl.h file that is #include'd above. +// makefixed() writes those tables to stdout, which would be piped to inffixed_tbl.h. +void makefixed(void) { + unsigned low, size; + struct inflate_state state; + + memset(&state, 0, sizeof(state)); + buildfixedtables(&state); + puts("/* inffixed_tbl.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts("/* WARNING: this file should *not* be used by applications."); + puts(" * It is part of the implementation of this library and is"); + puts(" * subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf("static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) + printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) + break; + putchar(','); + } + puts("\n};"); + size = 1U << 5; + printf("\nstatic const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) + printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); + if (++low == size) + break; + putchar(','); + } + puts("\n};"); +} + +// The output of this application can be piped out to recreate inffixed_tbl.h +int main(void) { + makefixed(); + return 0; +} diff --git a/libs/zlibng/tools/maketrees.c b/libs/zlibng/tools/maketrees.c new file mode 100644 index 000000000..337f2fc07 --- /dev/null +++ b/libs/zlibng/tools/maketrees.c @@ -0,0 +1,147 @@ +/* maketrees.c -- output static huffman trees + * Copyright (C) 1995-2017 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include +#include "zbuild.h" +#include "deflate.h" +#include "trees.h" + +static ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see zng_tr_init). + */ + +static ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use 5 bits.) + */ + +static unsigned char dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances 3 .. 258, + * the last 256 values correspond to the top 8 bits of the 15 bit distances. + */ + +static unsigned char length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +static int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +static int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + + +static void tr_static_init(void) { + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + uint16_t bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + length_code[length++] = (unsigned char)code; + } + } + Assert(length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented in two different + * ways: code 284 + 5 bits or code 285, so we overwrite length_code[255] to use the best encoding: + */ + length_code[length-1] = (unsigned char)code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + dist_code[dist++] = (unsigned char)code; + } + } + Assert(dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code]-7)); n++) { + dist_code[256 + dist++] = (unsigned char)code; + } + } + Assert(dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) + bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the tree construction + * to get a canonical Huffman tree (longest code all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = (uint16_t)bi_reverse((unsigned)n, 5); + } +} + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +static void gen_trees_header() { + int i; + + printf("#ifndef TREES_TBL_H_\n"); + printf("#define TREES_TBL_H_\n\n"); + + printf("/* header created automatically with maketrees.c */\n\n"); + + printf("Z_INTERNAL const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + printf("{{%3u},{%u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + printf("Z_INTERNAL const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + printf("{{%2u},{%u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + printf("const unsigned char Z_INTERNAL zng_dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + printf("%2u%s", dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + printf("const unsigned char Z_INTERNAL zng_length_code[MAX_MATCH-MIN_MATCH+1] = {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + printf("%2u%s", length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + printf("Z_INTERNAL const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + printf("%d%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + printf("Z_INTERNAL const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + printf("%5d%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); + } + + printf("#endif /* TREES_TBL_H_ */\n"); +} + +// The output of this application can be piped out to recreate trees.h +int main(void) { + tr_static_init(); + gen_trees_header(); + return 0; +} diff --git a/libs/zlibng/treebuild.xml b/libs/zlibng/treebuild.xml deleted file mode 100644 index fd75525f9..000000000 --- a/libs/zlibng/treebuild.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - zip compression library - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/zlibng/trees.c b/libs/zlibng/trees.c index 53c73bde1..efd4d49fb 100644 --- a/libs/zlibng/trees.c +++ b/libs/zlibng/trees.c @@ -30,44 +30,12 @@ * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - #include "zbuild.h" #include "deflate.h" +#include "trees.h" +#include "trees_emit.h" +#include "trees_tbl.h" -#ifdef ZLIB_DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -static const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -static const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static const int extra_blbits[BL_CODES] /* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -static const unsigned char bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ @@ -76,42 +44,6 @@ static const unsigned char bl_order[BL_CODES] * Local data. These are initialized only once. */ -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) -/* non ANSI compilers may not accept trees.h */ - -ZLIB_INTERNAL ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -static ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -unsigned char _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -unsigned char _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -static int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -static int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const int *extra_bits; /* extra bits for each code or NULL */ @@ -133,11 +65,9 @@ static const static_tree_desc static_bl_desc = * Local (static) routines in this file. */ -static void tr_static_init (void); static void init_block (deflate_state *s); static void pqdownheap (deflate_state *s, ct_data *tree, int k); static void gen_bitlen (deflate_state *s, tree_desc *desc); -static void gen_codes (ct_data *tree, int max_code, uint16_t *bl_count); static void build_tree (deflate_state *s, tree_desc *desc); static void scan_tree (deflate_state *s, ct_data *tree, int max_code); static void send_tree (deflate_state *s, ct_data *tree, int max_code); @@ -147,159 +77,10 @@ static void compress_block (deflate_state *s, const ct_data *ltree, const ct_d static int detect_data_type (deflate_state *s); static void bi_flush (deflate_state *s); -#ifdef GEN_TREES_H -static void gen_trees_header (void); -#endif - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -static void tr_static_init(void) { -#if defined(GEN_TREES_H) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - uint16_t bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) - return; - - /* For some embedded targets, global variables are not initialized: */ -#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = (unsigned char)code; - } - } - Assert(length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length-1] = (unsigned char)code; - - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = (unsigned char)code; - } - } - Assert(dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (unsigned char)code; - } - } - Assert(dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) - bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef ZLIB_DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() { - FILE *header = fopen("trees.h", "w"); - int i; - - Assert(header != NULL, "Can't open trees.h"); - fprintf(header, "#ifndef TREES_H_\n"); - fprintf(header, "#define TREES_H_\n\n"); - - fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "ZLIB_INTERNAL const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "static const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const unsigned char ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, "const unsigned char ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "static const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%d%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "static const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5d%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); - } - - fprintf(header, "#endif /* TREES_H_ */\n"); - fclose(header); -} -#endif /* GEN_TREES_H */ - /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void ZLIB_INTERNAL _tr_init(deflate_state *s) { - tr_static_init(); - +void Z_INTERNAL zng_tr_init(deflate_state *s) { s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; @@ -425,11 +206,13 @@ static void gen_bitlen(deflate_state *s, tree_desc *desc) { */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + for (h = s->heap_max + 1; h < HEAP_SIZE; h++) { n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) - bits = max_length, overflow++; + bits = tree[tree[n].Dad].Len + 1u; + if (bits > max_length){ + bits = max_length; + overflow++; + } tree[n].Len = (uint16_t)bits; /* We overwrite tree[n].Dad which is no longer needed */ @@ -453,11 +236,11 @@ static void gen_bitlen(deflate_state *s, tree_desc *desc) { /* Find the first bit length which could increase: */ do { - bits = max_length-1; + bits = max_length - 1; while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2u; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] @@ -495,7 +278,7 @@ static void gen_bitlen(deflate_state *s, tree_desc *desc) { * OUT assertion: the field code is set for all tree elements of non * zero code length. */ -static void gen_codes(ct_data *tree, int max_code, uint16_t *bl_count) { +Z_INTERNAL void gen_codes(ct_data *tree, int max_code, uint16_t *bl_count) { /* tree: the tree to decorate */ /* max_code: largest code with non zero frequency */ /* bl_count: number of codes at each bit length */ @@ -550,7 +333,8 @@ static void build_tree(deflate_state *s, tree_desc *desc) { * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; + s->heap_len = 0; + s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { @@ -632,12 +416,12 @@ static void scan_tree(deflate_state *s, ct_data *tree, int max_code) { int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ + uint16_t count = 0; /* repeat count of the current code */ + uint16_t max_count = 7; /* max repeat count */ + uint16_t min_count = 4; /* min repeat count */ if (nextlen == 0) - max_count = 138, min_count = 3; + max_count = 138, min_count = 3; tree[max_code+1].Len = (uint16_t)0xffff; /* guard */ @@ -688,6 +472,10 @@ static void send_tree(deflate_state *s, ct_data *tree, int max_code) { if (nextlen == 0) max_count = 138, min_count = 3; + // Temp local variables + uint32_t bi_valid = s->bi_valid; + uint64_t bi_buf = s->bi_buf; + for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; @@ -695,25 +483,25 @@ static void send_tree(deflate_state *s, ct_data *tree, int max_code) { continue; } else if (count < min_count) { do { - send_code(s, curlen, s->bl_tree); + send_code(s, curlen, s->bl_tree, bi_buf, bi_valid); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); + send_code(s, curlen, s->bl_tree, bi_buf, bi_valid); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); - send_bits(s, count-3, 2); + send_code(s, REP_3_6, s->bl_tree, bi_buf, bi_valid); + send_bits(s, count-3, 2, bi_buf, bi_valid); } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); - send_bits(s, count-3, 3); + send_code(s, REPZ_3_10, s->bl_tree, bi_buf, bi_valid); + send_bits(s, count-3, 3, bi_buf, bi_valid); } else { - send_code(s, REPZ_11_138, s->bl_tree); - send_bits(s, count-11, 7); + send_code(s, REPZ_11_138, s->bl_tree, bi_buf, bi_valid); + send_bits(s, count-11, 7, bi_buf, bi_valid); } count = 0; prevlen = curlen; @@ -725,6 +513,10 @@ static void send_tree(deflate_state *s, ct_data *tree, int max_code) { max_count = 7, min_count = 4; } } + + // Store back temp variables + s->bi_buf = bi_buf; + s->bi_valid = bi_valid; } /* =========================================================================== @@ -769,16 +561,25 @@ static void send_all_trees(deflate_state *s, int lcodes, int dcodes, int blcodes Assert(lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert(lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); + + // Temp local variables + uint32_t bi_valid = s->bi_valid; + uint64_t bi_buf = s->bi_buf; + Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + send_bits(s, lcodes-257, 5, bi_buf, bi_valid); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5, bi_buf, bi_valid); + send_bits(s, blcodes-4, 4, bi_buf, bi_valid); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2u ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3, bi_buf, bi_valid); } Tracev((stderr, "\nbl tree: sent %lu", s->bits_sent)); + // Store back temp variables + s->bi_buf = bi_buf; + s->bi_valid = bi_valid; + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %lu", s->bits_sent)); @@ -789,29 +590,29 @@ static void send_all_trees(deflate_state *s, int lcodes, int dcodes, int blcodes /* =========================================================================== * Send a stored block */ -void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, char *buf, unsigned long stored_len, int last) { +void Z_INTERNAL zng_tr_stored_block(deflate_state *s, char *buf, uint32_t stored_len, int last) { /* buf: input block */ /* stored_len: length of input block */ /* last: one if this is the last block for a file */ - send_bits(s, (STORED_BLOCK << 1)+last, 3); /* send block type */ - bi_windup(s); /* align on byte boundary */ + zng_tr_emit_tree(s, STORED_BLOCK, last); /* send block type */ + zng_tr_emit_align(s); /* align on byte boundary */ + cmpr_bits_align(s); put_short(s, (uint16_t)stored_len); put_short(s, (uint16_t)~stored_len); - if (stored_len) + cmpr_bits_add(s, 32); + sent_bits_add(s, 32); + if (stored_len) { memcpy(s->pending_buf + s->pending, (unsigned char *)buf, stored_len); - s->pending += stored_len; -#ifdef ZLIB_DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (unsigned long)~7L; - s->compressed_len += (stored_len + 4) << 3; - s->bits_sent += 2*16; - s->bits_sent += stored_len<<3; -#endif + s->pending += stored_len; + cmpr_bits_add(s, stored_len << 3); + sent_bits_add(s, stored_len << 3); + } } /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ -void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { +void Z_INTERNAL zng_tr_flush_bits(deflate_state *s) { bi_flush(s); } @@ -819,12 +620,9 @@ void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ -void ZLIB_INTERNAL _tr_align(deflate_state *s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef ZLIB_DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif +void Z_INTERNAL zng_tr_align(deflate_state *s) { + zng_tr_emit_tree(s, STATIC_TREES, 0); + zng_tr_emit_end_block(s, static_ltree, 0); bi_flush(s); } @@ -832,7 +630,7 @@ void ZLIB_INTERNAL _tr_align(deflate_state *s) { * Determine the best encoding for the current block: dynamic trees, static * trees or store, and write out the encoded block. */ -void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, char *buf, unsigned long stored_len, int last) { +void Z_INTERNAL zng_tr_flush_block(deflate_state *s, char *buf, uint32_t stored_len, int last) { /* buf: input block, or NULL if too old */ /* stored_len: length of input block */ /* last: one if this is the last block for a file */ @@ -840,7 +638,11 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, char *buf, unsigned long st int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { + if (UNLIKELY(s->sym_next == 0)) { + /* Emit an empty static tree block with no codes */ + opt_lenb = static_lenb = 0; + s->static_len = 7; + } else if (s->level > 0) { /* Check if the file is binary or text */ if (s->strm->data_type == Z_UNKNOWN) s->strm->data_type = detect_data_type(s); @@ -864,7 +666,7 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, char *buf, unsigned long st opt_lenb = (s->opt_len+3+7) >> 3; static_lenb = (s->static_len+3+7) >> 3; - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %u lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->sym_next / 3)); @@ -876,37 +678,25 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, char *buf, unsigned long st opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } -#ifdef FORCE_STORED - if (buf != NULL) { /* force stored block */ -#else if (stored_len+4 <= opt_lenb && buf != NULL) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + /* 4: two words for the lengths + * The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ - _tr_stored_block(s, buf, stored_len, last); + zng_tr_stored_block(s, buf, stored_len, last); -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES << 1)+last, 3); + zng_tr_emit_tree(s, STATIC_TREES, last); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); -#ifdef ZLIB_DEBUG - s->compressed_len += 3 + s->static_len; -#endif + cmpr_bits_add(s, s->static_len); } else { - send_bits(s, (DYN_TREES << 1)+last, 3); + zng_tr_emit_tree(s, DYN_TREES, last); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); -#ifdef ZLIB_DEBUG - s->compressed_len += 3 + s->opt_len; -#endif + cmpr_bits_add(s, s->opt_len); } Assert(s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB @@ -915,41 +705,11 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, char *buf, unsigned long st init_block(s); if (last) { - bi_windup(s); -#ifdef ZLIB_DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif + zng_tr_emit_align(s); } Tracev((stderr, "\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*last)); } -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { - /* dist: distance of matched string */ - /* lc: match length-MIN_MATCH or unmatched char (if dist==0) */ - s->sym_buf[s->sym_next++] = dist; - s->sym_buf[s->sym_next++] = dist >> 8; - s->sym_buf[s->sym_next++] = lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((uint16_t)dist < (uint16_t)MAX_DIST(s) && - (uint16_t)lc <= (uint16_t)(MAX_MATCH-MIN_MATCH) && - (uint16_t)d_code(dist) < (uint16_t)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - return (s->sym_next == s->sym_end); -} - /* =========================================================================== * Send the block data compressed using the given Huffman trees */ @@ -959,8 +719,6 @@ static void compress_block(deflate_state *s, const ct_data *ltree, const ct_data unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned sx = 0; /* running index in sym_buf */ - int code; /* the code to send */ - int extra; /* number of extra bits to send */ if (s->sym_next != 0) { do { @@ -968,35 +726,17 @@ static void compress_block(deflate_state *s, const ct_data *ltree, const ct_data dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; lc = s->sym_buf[sx++]; if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr, " '%c' ", lc)); + zng_emit_lit(s, ltree, lc); } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert(code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= (unsigned int)base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } + zng_emit_dist(s, ltree, dtree, lc, dist); } /* literal or match pair ? */ /* Check that the overlay between pending_buf and sym_buf is ok: */ - Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); + Assert(s->pending < s->lit_bufsize + sx, "pending_buf overflow"); } while (sx < s->sym_next); } - send_code(s, END_BLOCK, ltree); + zng_emit_end_block(s, ltree, 0); } /* =========================================================================== @@ -1038,49 +778,45 @@ static int detect_data_type(deflate_state *s) { return Z_BINARY; } +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +static void bi_flush(deflate_state *s) { + if (s->bi_valid == 64) { + put_uint64(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else { + if (s->bi_valid >= 32) { + put_uint32(s, (uint32_t)s->bi_buf); + s->bi_buf >>= 32; + s->bi_valid -= 32; + } + if (s->bi_valid >= 16) { + put_short(s, (uint16_t)s->bi_buf); + s->bi_buf >>= 16; + s->bi_valid -= 16; + } + if (s->bi_valid >= 8) { + put_byte(s, s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } + } +} + /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ -ZLIB_INTERNAL unsigned bi_reverse(unsigned code, int len) { +Z_INTERNAL unsigned bi_reverse(unsigned code, int len) { /* code: the value to invert */ /* len: its bit length */ - register unsigned res = 0; + Z_REGISTER unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -static void bi_flush(deflate_state *s) { - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (unsigned char)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -ZLIB_INTERNAL void bi_windup(deflate_state *s) { - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (unsigned char)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} diff --git a/libs/zlibng/trees.h b/libs/zlibng/trees.h index 6fc1c8485..e57f92648 100644 --- a/libs/zlibng/trees.h +++ b/libs/zlibng/trees.h @@ -1,132 +1,40 @@ #ifndef TREES_H_ #define TREES_H_ -/* header created automatically with -DGEN_TREES_H */ +/* Constants */ -ZLIB_INTERNAL const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; +#define DIST_CODE_LEN 512 +/* see definition of array dist_code in trees.c */ -static const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ -const unsigned char ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ -const unsigned char ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ -static const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ -static const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; +static const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; -#endif /* TREES_H_ */ +static const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static const int extra_blbits[BL_CODES] /* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +static const unsigned char bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; + /* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + + +/* Function definitions */ +void gen_codes (ct_data *tree, int max_code, uint16_t *bl_count); + +#endif diff --git a/libs/zlibng/trees_emit.h b/libs/zlibng/trees_emit.h new file mode 100644 index 000000000..118dbb2d8 --- /dev/null +++ b/libs/zlibng/trees_emit.h @@ -0,0 +1,228 @@ +#ifndef TREES_EMIT_H_ +#define TREES_EMIT_H_ + +#include "zbuild.h" +#include "trees.h" + +#ifdef ZLIB_DEBUG +# include +# include +# include +#endif + + +/* trees.h */ +extern Z_INTERNAL const ct_data static_ltree[L_CODES+2]; +extern Z_INTERNAL const ct_data static_dtree[D_CODES]; + +extern const unsigned char Z_INTERNAL zng_dist_code[DIST_CODE_LEN]; +extern const unsigned char Z_INTERNAL zng_length_code[MAX_MATCH-MIN_MATCH+1]; + +extern Z_INTERNAL const int base_length[LENGTH_CODES]; +extern Z_INTERNAL const int base_dist[D_CODES]; + +/* Bit buffer and deflate code stderr tracing */ +#ifdef ZLIB_DEBUG +# define send_bits_trace(s, value, length) { \ + Tracevv((stderr, " l %2d v %4llx ", (int)(length), (long long)(value))); \ + Assert(length > 0 && length <= BIT_BUF_SIZE, "invalid length"); \ + } +# define send_code_trace(s, c) \ + if (z_verbose > 2) { \ + fprintf(stderr, "\ncd %3d ", (c)); \ + } +#else +# define send_bits_trace(s, value, length) +# define send_code_trace(s, c) +#endif + +/* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (64 - bi_valid) bits from value, leaving (width - (64-bi_valid)) + * unused bits in value. + */ +#define send_bits(s, t_val, t_len, bi_buf, bi_valid) {\ + uint64_t val = (uint64_t)t_val;\ + uint32_t len = (uint32_t)t_len;\ + uint32_t total_bits = bi_valid + len;\ + send_bits_trace(s, val, len);\ + sent_bits_add(s, len);\ + if (total_bits < BIT_BUF_SIZE) {\ + bi_buf |= val << bi_valid;\ + bi_valid = total_bits;\ + } else if (bi_valid == BIT_BUF_SIZE) {\ + put_uint64(s, bi_buf);\ + bi_buf = val;\ + bi_valid = len;\ + } else {\ + bi_buf |= val << bi_valid;\ + put_uint64(s, bi_buf);\ + bi_buf = val >> (BIT_BUF_SIZE - bi_valid);\ + bi_valid = total_bits - BIT_BUF_SIZE;\ + }\ +} + +/* Send a code of the given tree. c and tree must not have side effects */ +#ifdef ZLIB_DEBUG +# define send_code(s, c, tree, bi_buf, bi_valid) { \ + send_code_trace(s, c); \ + send_bits(s, tree[c].Code, tree[c].Len, bi_buf, bi_valid); \ +} +#else +# define send_code(s, c, tree, bi_buf, bi_valid) \ + send_bits(s, tree[c].Code, tree[c].Len, bi_buf, bi_valid) +#endif + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +static void bi_windup(deflate_state *s) { + if (s->bi_valid > 56) { + put_uint64(s, s->bi_buf); + } else { + if (s->bi_valid > 24) { + put_uint32(s, (uint32_t)s->bi_buf); + s->bi_buf >>= 32; + s->bi_valid -= 32; + } + if (s->bi_valid > 8) { + put_short(s, (uint16_t)s->bi_buf); + s->bi_buf >>= 16; + s->bi_valid -= 16; + } + if (s->bi_valid > 0) { + put_byte(s, s->bi_buf); + } + } + s->bi_buf = 0; + s->bi_valid = 0; +} + +/* =========================================================================== + * Emit literal code + */ +static inline uint32_t zng_emit_lit(deflate_state *s, const ct_data *ltree, unsigned c) { + uint32_t bi_valid = s->bi_valid; + uint64_t bi_buf = s->bi_buf; + + send_code(s, c, ltree, bi_buf, bi_valid); + + s->bi_valid = bi_valid; + s->bi_buf = bi_buf; + + Tracecv(isgraph(c), (stderr, " '%c' ", c)); + + return ltree[c].Len; +} + +/* =========================================================================== + * Emit match distance/length code + */ +static inline uint32_t zng_emit_dist(deflate_state *s, const ct_data *ltree, const ct_data *dtree, + uint32_t lc, uint32_t dist) { + uint32_t c, extra; + uint8_t code; + uint64_t match_bits; + uint32_t match_bits_len; + uint32_t bi_valid = s->bi_valid; + uint64_t bi_buf = s->bi_buf; + + /* Send the length code, len is the match length - MIN_MATCH */ + code = zng_length_code[lc]; + c = code+LITERALS+1; + Assert(c < L_CODES, "bad l_code"); + send_code_trace(s, c); + + match_bits = ltree[c].Code; + match_bits_len = ltree[c].Len; + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + match_bits |= ((uint64_t)lc << match_bits_len); + match_bits_len += extra; + } + + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert(code < D_CODES, "bad d_code"); + send_code_trace(s, code); + + /* Send the distance code */ + match_bits |= ((uint64_t)dtree[code].Code << match_bits_len); + match_bits_len += dtree[code].Len; + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + match_bits |= ((uint64_t)dist << match_bits_len); + match_bits_len += extra; + } + + send_bits(s, match_bits, match_bits_len, bi_buf, bi_valid); + + s->bi_valid = bi_valid; + s->bi_buf = bi_buf; + + return match_bits_len; +} + +/* =========================================================================== + * Emit end block + */ +static inline void zng_emit_end_block(deflate_state *s, const ct_data *ltree, const int last) { + uint32_t bi_valid = s->bi_valid; + uint64_t bi_buf = s->bi_buf; + send_code(s, END_BLOCK, ltree, bi_buf, bi_valid); + s->bi_valid = bi_valid; + s->bi_buf = bi_buf; + Tracev((stderr, "\n+++ Emit End Block: Last: %u Pending: %u Total Out: %" PRIu64 "\n", + last, s->pending, (uint64_t)s->strm->total_out)); + (void)last; +} + +/* =========================================================================== + * Emit literal and count bits + */ +static inline void zng_tr_emit_lit(deflate_state *s, const ct_data *ltree, unsigned c) { + cmpr_bits_add(s, zng_emit_lit(s, ltree, c)); +} + +/* =========================================================================== + * Emit match and count bits + */ +static inline void zng_tr_emit_dist(deflate_state *s, const ct_data *ltree, const ct_data *dtree, + uint32_t lc, uint32_t dist) { + cmpr_bits_add(s, zng_emit_dist(s, ltree, dtree, lc, dist)); +} + +/* =========================================================================== + * Emit start of block + */ +static inline void zng_tr_emit_tree(deflate_state *s, int type, const int last) { + uint32_t bi_valid = s->bi_valid; + uint64_t bi_buf = s->bi_buf; + uint32_t header_bits = (type << 1) + last; + send_bits(s, header_bits, 3, bi_buf, bi_valid); + cmpr_bits_add(s, 3); + s->bi_valid = bi_valid; + s->bi_buf = bi_buf; + Tracev((stderr, "\n--- Emit Tree: Last: %u\n", last)); +} + +/* =========================================================================== + * Align bit buffer on a byte boundary and count bits + */ +static inline void zng_tr_emit_align(deflate_state *s) { + bi_windup(s); /* align on byte boundary */ + sent_bits_align(s); +} + +/* =========================================================================== + * Emit an end block and align bit buffer if last block + */ +static inline void zng_tr_emit_end_block(deflate_state *s, const ct_data *ltree, const int last) { + zng_emit_end_block(s, ltree, last); + cmpr_bits_add(s, 7); + if (last) + zng_tr_emit_align(s); +} + +#endif diff --git a/libs/zlibng/trees_tbl.h b/libs/zlibng/trees_tbl.h new file mode 100644 index 000000000..a4c68a566 --- /dev/null +++ b/libs/zlibng/trees_tbl.h @@ -0,0 +1,132 @@ +#ifndef TREES_TBL_H_ +#define TREES_TBL_H_ + +/* header created automatically with maketrees.c */ + +Z_INTERNAL const ct_data static_ltree[L_CODES+2] = { +{{ 12},{8}}, {{140},{8}}, {{ 76},{8}}, {{204},{8}}, {{ 44},{8}}, +{{172},{8}}, {{108},{8}}, {{236},{8}}, {{ 28},{8}}, {{156},{8}}, +{{ 92},{8}}, {{220},{8}}, {{ 60},{8}}, {{188},{8}}, {{124},{8}}, +{{252},{8}}, {{ 2},{8}}, {{130},{8}}, {{ 66},{8}}, {{194},{8}}, +{{ 34},{8}}, {{162},{8}}, {{ 98},{8}}, {{226},{8}}, {{ 18},{8}}, +{{146},{8}}, {{ 82},{8}}, {{210},{8}}, {{ 50},{8}}, {{178},{8}}, +{{114},{8}}, {{242},{8}}, {{ 10},{8}}, {{138},{8}}, {{ 74},{8}}, +{{202},{8}}, {{ 42},{8}}, {{170},{8}}, {{106},{8}}, {{234},{8}}, +{{ 26},{8}}, {{154},{8}}, {{ 90},{8}}, {{218},{8}}, {{ 58},{8}}, +{{186},{8}}, {{122},{8}}, {{250},{8}}, {{ 6},{8}}, {{134},{8}}, +{{ 70},{8}}, {{198},{8}}, {{ 38},{8}}, {{166},{8}}, {{102},{8}}, +{{230},{8}}, {{ 22},{8}}, {{150},{8}}, {{ 86},{8}}, {{214},{8}}, +{{ 54},{8}}, {{182},{8}}, {{118},{8}}, {{246},{8}}, {{ 14},{8}}, +{{142},{8}}, {{ 78},{8}}, {{206},{8}}, {{ 46},{8}}, {{174},{8}}, +{{110},{8}}, {{238},{8}}, {{ 30},{8}}, {{158},{8}}, {{ 94},{8}}, +{{222},{8}}, {{ 62},{8}}, {{190},{8}}, {{126},{8}}, {{254},{8}}, +{{ 1},{8}}, {{129},{8}}, {{ 65},{8}}, {{193},{8}}, {{ 33},{8}}, +{{161},{8}}, {{ 97},{8}}, {{225},{8}}, {{ 17},{8}}, {{145},{8}}, +{{ 81},{8}}, {{209},{8}}, {{ 49},{8}}, {{177},{8}}, {{113},{8}}, +{{241},{8}}, {{ 9},{8}}, {{137},{8}}, {{ 73},{8}}, {{201},{8}}, +{{ 41},{8}}, {{169},{8}}, {{105},{8}}, {{233},{8}}, {{ 25},{8}}, +{{153},{8}}, {{ 89},{8}}, {{217},{8}}, {{ 57},{8}}, {{185},{8}}, +{{121},{8}}, {{249},{8}}, {{ 5},{8}}, {{133},{8}}, {{ 69},{8}}, +{{197},{8}}, {{ 37},{8}}, {{165},{8}}, {{101},{8}}, {{229},{8}}, +{{ 21},{8}}, {{149},{8}}, {{ 85},{8}}, {{213},{8}}, {{ 53},{8}}, +{{181},{8}}, {{117},{8}}, {{245},{8}}, {{ 13},{8}}, {{141},{8}}, +{{ 77},{8}}, {{205},{8}}, {{ 45},{8}}, {{173},{8}}, {{109},{8}}, +{{237},{8}}, {{ 29},{8}}, {{157},{8}}, {{ 93},{8}}, {{221},{8}}, +{{ 61},{8}}, {{189},{8}}, {{125},{8}}, {{253},{8}}, {{ 19},{9}}, +{{275},{9}}, {{147},{9}}, {{403},{9}}, {{ 83},{9}}, {{339},{9}}, +{{211},{9}}, {{467},{9}}, {{ 51},{9}}, {{307},{9}}, {{179},{9}}, +{{435},{9}}, {{115},{9}}, {{371},{9}}, {{243},{9}}, {{499},{9}}, +{{ 11},{9}}, {{267},{9}}, {{139},{9}}, {{395},{9}}, {{ 75},{9}}, +{{331},{9}}, {{203},{9}}, {{459},{9}}, {{ 43},{9}}, {{299},{9}}, +{{171},{9}}, {{427},{9}}, {{107},{9}}, {{363},{9}}, {{235},{9}}, +{{491},{9}}, {{ 27},{9}}, {{283},{9}}, {{155},{9}}, {{411},{9}}, +{{ 91},{9}}, {{347},{9}}, {{219},{9}}, {{475},{9}}, {{ 59},{9}}, +{{315},{9}}, {{187},{9}}, {{443},{9}}, {{123},{9}}, {{379},{9}}, +{{251},{9}}, {{507},{9}}, {{ 7},{9}}, {{263},{9}}, {{135},{9}}, +{{391},{9}}, {{ 71},{9}}, {{327},{9}}, {{199},{9}}, {{455},{9}}, +{{ 39},{9}}, {{295},{9}}, {{167},{9}}, {{423},{9}}, {{103},{9}}, +{{359},{9}}, {{231},{9}}, {{487},{9}}, {{ 23},{9}}, {{279},{9}}, +{{151},{9}}, {{407},{9}}, {{ 87},{9}}, {{343},{9}}, {{215},{9}}, +{{471},{9}}, {{ 55},{9}}, {{311},{9}}, {{183},{9}}, {{439},{9}}, +{{119},{9}}, {{375},{9}}, {{247},{9}}, {{503},{9}}, {{ 15},{9}}, +{{271},{9}}, {{143},{9}}, {{399},{9}}, {{ 79},{9}}, {{335},{9}}, +{{207},{9}}, {{463},{9}}, {{ 47},{9}}, {{303},{9}}, {{175},{9}}, +{{431},{9}}, {{111},{9}}, {{367},{9}}, {{239},{9}}, {{495},{9}}, +{{ 31},{9}}, {{287},{9}}, {{159},{9}}, {{415},{9}}, {{ 95},{9}}, +{{351},{9}}, {{223},{9}}, {{479},{9}}, {{ 63},{9}}, {{319},{9}}, +{{191},{9}}, {{447},{9}}, {{127},{9}}, {{383},{9}}, {{255},{9}}, +{{511},{9}}, {{ 0},{7}}, {{ 64},{7}}, {{ 32},{7}}, {{ 96},{7}}, +{{ 16},{7}}, {{ 80},{7}}, {{ 48},{7}}, {{112},{7}}, {{ 8},{7}}, +{{ 72},{7}}, {{ 40},{7}}, {{104},{7}}, {{ 24},{7}}, {{ 88},{7}}, +{{ 56},{7}}, {{120},{7}}, {{ 4},{7}}, {{ 68},{7}}, {{ 36},{7}}, +{{100},{7}}, {{ 20},{7}}, {{ 84},{7}}, {{ 52},{7}}, {{116},{7}}, +{{ 3},{8}}, {{131},{8}}, {{ 67},{8}}, {{195},{8}}, {{ 35},{8}}, +{{163},{8}}, {{ 99},{8}}, {{227},{8}} +}; + +Z_INTERNAL const ct_data static_dtree[D_CODES] = { +{{ 0},{5}}, {{16},{5}}, {{ 8},{5}}, {{24},{5}}, {{ 4},{5}}, +{{20},{5}}, {{12},{5}}, {{28},{5}}, {{ 2},{5}}, {{18},{5}}, +{{10},{5}}, {{26},{5}}, {{ 6},{5}}, {{22},{5}}, {{14},{5}}, +{{30},{5}}, {{ 1},{5}}, {{17},{5}}, {{ 9},{5}}, {{25},{5}}, +{{ 5},{5}}, {{21},{5}}, {{13},{5}}, {{29},{5}}, {{ 3},{5}}, +{{19},{5}}, {{11},{5}}, {{27},{5}}, {{ 7},{5}}, {{23},{5}} +}; + +const unsigned char Z_INTERNAL zng_dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const unsigned char Z_INTERNAL zng_length_code[MAX_MATCH-MIN_MATCH+1] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +Z_INTERNAL const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +Z_INTERNAL const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + +#endif /* TREES_TBL_H_ */ diff --git a/libs/zlibng/uncompr.c b/libs/zlibng/uncompr.c index 9f0ac2a0c..1435fab97 100644 --- a/libs/zlibng/uncompr.c +++ b/libs/zlibng/uncompr.c @@ -3,14 +3,12 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL +#define Z_INTERNAL #include "zbuild.h" #ifdef ZLIB_COMPAT -# include "zlib.h" +# include "zlib.h" #else -# include "zlib-ng.h" +# include "zlib-ng.h" #endif /* =========================================================================== @@ -29,7 +27,7 @@ Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ -int ZEXPORT PREFIX(uncompress2)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t *sourceLen) { +int Z_EXPORT PREFIX(uncompress2)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t *sourceLen) { PREFIX3(stream) stream; int err; const unsigned int max = (unsigned int)-1; @@ -40,13 +38,12 @@ int ZEXPORT PREFIX(uncompress2)(unsigned char *dest, z_size_t *destLen, const un if (*destLen) { left = *destLen; *destLen = 0; - } - else { + } else { left = 1; dest = buf; } - stream.next_in = (const unsigned char *)source; + stream.next_in = (z_const unsigned char *)source; stream.avail_in = 0; stream.zalloc = NULL; stream.zfree = NULL; @@ -83,7 +80,6 @@ int ZEXPORT PREFIX(uncompress2)(unsigned char *dest, z_size_t *destLen, const un err; } -int ZEXPORT PREFIX(uncompress)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t sourceLen) -{ +int Z_EXPORT PREFIX(uncompress)(unsigned char *dest, z_size_t *destLen, const unsigned char *source, z_size_t sourceLen) { return PREFIX(uncompress2)(dest, destLen, source, &sourceLen); } diff --git a/libs/zlibng/win32/DLL_FAQ.txt b/libs/zlibng/win32/DLL_FAQ.txt index 12c009018..c21298596 100644 --- a/libs/zlibng/win32/DLL_FAQ.txt +++ b/libs/zlibng/win32/DLL_FAQ.txt @@ -83,7 +83,7 @@ in the zlib distribution, or at the following location: an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier? - In principle, you can do it by assigning calling convention - keywords to the macros ZEXPORT and ZEXPORTVA. In practice, + keywords to the macros Z_EXPORT and Z_EXPORTVA. In practice, it depends on what you mean by "an old ZLIB.DLL", because the old DLL exists in several mutually-incompatible versions. You have to find out first what kind of calling convention is diff --git a/libs/zlibng/win32/Makefile.a64 b/libs/zlibng/win32/Makefile.a64 new file mode 100644 index 000000000..a2f2e6a60 --- /dev/null +++ b/libs/zlibng/win32/Makefile.a64 @@ -0,0 +1,208 @@ +# Makefile for zlib using Microsoft (Visual) C +# zlib is copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler +# +# Usage: +# nmake -f win32/Makefile.a64 (standard build) +# nmake -f win32/Makefile.a64 LOC=-DFOO (nonstandard build) + +# The toplevel directory of the source tree. +# +TOP = . + +# optional build flags +LOC = + +# variables +STATICLIB = zlib.lib +SHAREDLIB = zlib1.dll +IMPLIB = zdll.lib + +CC = cl +LD = link +AR = lib +RC = rc +CP = copy /y +CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) +WFLAGS = \ + -D_CRT_SECURE_NO_DEPRECATE \ + -D_CRT_NONSTDC_NO_DEPRECATE \ + -DUNALIGNED_OK \ + -DUNALIGNED64_OK \ + -D_ARM64_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 \ + -DARM_FEATURES \ + # +LDFLAGS = -nologo -debug -incremental:no -opt:ref -manifest +ARFLAGS = -nologo +RCFLAGS = /dARM64 /r +DEFFILE = zlib.def +RCFILE = zlib1.rc +RESFILE = zlib1.res +WITH_GZFILEOP = yes +ZLIB_COMPAT = +SUFFIX = + +OBJS = \ + adler32.obj \ + armfeature.obj \ + chunkset.obj \ + compare258.obj \ + compress.obj \ + crc32.obj \ + crc32_comb.obj \ + deflate.obj \ + deflate_fast.obj \ + deflate_slow.obj \ + deflate_quick.obj \ + deflate_medium.obj \ + functable.obj \ + infback.obj \ + inflate.obj \ + inftrees.obj \ + inffast.obj \ + insert_string.obj \ + trees.obj \ + uncompr.obj \ + zutil.obj \ + # +!if "$(ZLIB_COMPAT)" != "" +WITH_GZFILEOP = yes +WFLAGS = $(WFLAGS) -DZLIB_COMPAT +DEFFILE = zlibcompat.def +!else +STATICLIB = zlib-ng.lib +SHAREDLIB = zlib-ng1.dll +IMPLIB = zngdll.lib +DEFFILE = zlib-ng.def +RCFILE = zlib-ng1.rc +RESFILE = zlib-ng1.res +SUFFIX = -ng +!endif + +!if "$(WITH_GZFILEOP)" != "" +WFLAGS = $(WFLAGS) -DWITH_GZFILEOP +OBJS = $(OBJS) gzlib.obj gzread.obj gzwrite.obj +!endif + +WFLAGS = $(WFLAGS) \ + -DARM_ACLE_CRC_HASH \ + -D__ARM_NEON__=1 \ + -DARM_NEON_ADLER32 \ + -DARM_NEON_CHUNKSET \ + -DARM_NEON_SLIDEHASH \ + -DARM_NOCHECK_NEON \ + # +OBJS = $(OBJS) crc32_acle.obj insert_string_acle.obj adler32_neon.obj chunkset_neon.obj slide_neon.obj + +# targets +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \ + example.exe minigzip.exe example_d.exe minigzip_d.exe + +zconf: $(TOP)/zconf$(SUFFIX).h.in + $(CP) $(TOP)\zconf$(SUFFIX).h.in $(TOP)\zconf$(SUFFIX).h + +$(STATICLIB): zconf $(OBJS) + $(AR) $(ARFLAGS) -out:$@ $(OBJS) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): zconf $(TOP)/win32/$(DEFFILE) $(OBJS) $(RESFILE) + $(LD) $(LDFLAGS) -def:$(TOP)/win32/$(DEFFILE) -dll -implib:$(IMPLIB) \ + -out:$@ -base:0x55A4C0000 $(OBJS) $(RESFILE) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;2 + +example.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +example_d.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip_d.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +{$(TOP)}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +gzlib2.obj: gzlib.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzlib2.obj gzlib.c + +gzread2.obj: gzread.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzread2.obj gzread.c + +gzwrite2.obj: gzwrite.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzwrite2.obj gzwrite.c + +{$(TOP)/arch/arm}.c.obj: + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/test}.c.obj: + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP $< + +$(TOP)/zconf$(SUFFIX).h: zconf + +SRCDIR = $(TOP) +# Keep the dependences in sync with top-level Makefile.in +adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h +chunkset.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h +functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86.h +gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +gzwrite.obj: $(SRCDIR)/gzwrite.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +compress.obj: $(SRCDIR)/compress.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h +uncompr.obj: $(SRCDIR)/uncompr.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h +crc32.obj: $(SRCDIR)/crc32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zendian.h $(SRCDIR)/deflate.h $(SRCDIR)/functable.h $(SRCDIR)/crc32_tbl.h +crc32_comb.obj: $(SRCDIR)/crc32_comb.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/crc32_comb_tbl.h +deflate.obj: $(SRCDIR)/deflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_quick.obj: $(SRCDIR)/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/trees_emit.h +deflate_fast.obj: $(SRCDIR)/deflate_fast.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h +inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h +inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h +inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h +trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees_tbl.h +zutil.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/zutil_p.h + +example.obj: $(TOP)/test/example.c $(TOP)/zbuild.h $(TOP)/zlib$(SUFFIX).h + +minigzip.obj: $(TOP)/test/minigzip.c $(TOP)/zbuild.h $(TOP)/zlib$(SUFFIX).h + +$(RESFILE): $(TOP)/win32/$(RCFILE) + $(RC) $(RCFLAGS) /fo$@ $(TOP)/win32/$(RCFILE) + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +testdll: example_d.exe minigzip_d.exe + example_d + echo hello world | minigzip_d | minigzip_d -d + + +# cleanup +clean: + -del $(STATICLIB) + -del $(SHAREDLIB) + -del $(IMPLIB) + -del *.obj + -del *.res + -del *.exp + -del *.exe + -del *.pdb + -del *.manifest + +distclean: clean + -del zconf$(SUFFIX).h diff --git a/libs/zlibng/win32/Makefile.arm b/libs/zlibng/win32/Makefile.arm index 0b3f94064..5ed53f5f3 100644 --- a/libs/zlibng/win32/Makefile.arm +++ b/libs/zlibng/win32/Makefile.arm @@ -23,26 +23,53 @@ AR = lib RC = rc CP = copy /y CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) -WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DUNALIGNED_OK -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 +WFLAGS = \ + -D_CRT_SECURE_NO_DEPRECATE \ + -D_CRT_NONSTDC_NO_DEPRECATE \ + -DUNALIGNED_OK \ + -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1 \ + -DARM_FEATURES \ + # LDFLAGS = -nologo -debug -incremental:no -opt:ref -manifest ARFLAGS = -nologo RCFLAGS = /dARM /r DEFFILE = zlib.def RCFILE = zlib1.rc RESFILE = zlib1.res -WITH_GZFILEOP = +WITH_GZFILEOP = yes +ZLIB_COMPAT = WITH_ACLE = WITH_NEON = WITH_VFPV3 = NEON_ARCH = /arch:VFPv4 SUFFIX = -OBJS = adler32.obj armfeature.obj compress.obj crc32.obj deflate.obj deflate_fast.obj deflate_slow.obj \ - deflate_medium.obj \ - functable.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj fill_window_arm.obj -!if "$(WITH_GZFILEOP)" != "" -WFLAGS = $(WFLAGS) -DWITH_GZFILEOP -OBJS = $(OBJS) gzclose.obj gzlib.obj gzread.obj gzwrite.obj +OBJS = \ + adler32.obj \ + armfeature.obj \ + chunkset.obj \ + compare258.obj \ + compress.obj \ + crc32.obj \ + crc32_comb.obj \ + deflate.obj \ + deflate_fast.obj \ + deflate_slow.obj \ + deflate_quick.obj \ + deflate_medium.obj \ + functable.obj \ + infback.obj \ + inflate.obj \ + inftrees.obj \ + inffast.obj \ + insert_string.obj \ + trees.obj \ + uncompr.obj \ + zutil.obj \ + # +!if "$(ZLIB_COMPAT)" != "" +WITH_GZFILEOP = yes +WFLAGS = $(WFLAGS) -DZLIB_COMPAT DEFFILE = zlibcompat.def !else STATICLIB = zlib-ng.lib @@ -53,6 +80,12 @@ RCFILE = zlib-ng1.rc RESFILE = zlib-ng1.res SUFFIX = -ng !endif + +!if "$(WITH_GZFILEOP)" != "" +WFLAGS = $(WFLAGS) -DWITH_GZFILEOP +OBJS = $(OBJS) gzlib.obj gzread.obj gzwrite.obj +!endif + !if "$(WITH_ACLE)" != "" WFLAGS = $(WFLAGS) -DARM_ACLE_CRC_HASH OBJS = $(OBJS) crc32_acle.obj insert_string_acle.obj @@ -62,8 +95,14 @@ NEON_ARCH = /arch:VFPv3 !endif !if "$(WITH_NEON)" != "" CFLAGS = $(CFLAGS) $(NEON_ARCH) -WFLAGS = $(WFLAGS) -D__ARM_NEON__=1 -DARM_NEON_ADLER32 -DARM_NOCHECK_NEON -OBJS = $(OBJS) adler32_neon.obj +WFLAGS = $(WFLAGS) \ + -D__ARM_NEON__=1 \ + -DARM_NEON_ADLER32 \ + -DARM_NEON_CHUNKSET \ + -DARM_NEON_SLIDEHASH \ + -DARM_NOCHECK_NEON \ + # +OBJS = $(OBJS) adler32_neon.obj chunkset_neon.obj slide_neon.obj !endif # targets @@ -84,58 +123,69 @@ $(SHAREDLIB): zconf $(TOP)/win32/$(DEFFILE) $(OBJS) $(RESFILE) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;2 -example.exe: example.obj $(STATICLIB) - $(LD) $(LDFLAGS) example.obj $(STATICLIB) +example.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 -minigzip.exe: minigzip.obj $(STATICLIB) - $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) +minigzip.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 -example_d.exe: example.obj $(IMPLIB) - $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) +example_d.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 -minigzip_d.exe: minigzip.obj $(IMPLIB) - $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) +minigzip_d.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 {$(TOP)}.c.obj: $(CC) -c $(WFLAGS) $(CFLAGS) $< +gzlib2.obj: gzlib.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzlib2.obj gzlib.c + +gzread2.obj: gzread.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzread2.obj gzread.c + +gzwrite2.obj: gzwrite.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzwrite2.obj gzwrite.c + {$(TOP)/arch/arm}.c.obj: $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< {$(TOP)/test}.c.obj: - $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP $< $(TOP)/zconf$(SUFFIX).h: zconf SRCDIR = $(TOP) # Keep the dependences in sync with top-level Makefile.in adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h -functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/gzendian.h $(SRCDIR)/arch/x86/x86.h -gzclose.obj: $(SRCDIR)/gzclose.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h -gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h -gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h -gzwrite.obj: $(SRCDIR)/gzwrite.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h +functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86.h +gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +gzwrite.obj: $(SRCDIR)/gzwrite.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h compress.obj: $(SRCDIR)/compress.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h uncompr.obj: $(SRCDIR)/uncompr.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h -crc32.obj: $(SRCDIR)/crc32.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzendian.h $(SRCDIR)/deflate.h $(SRCDIR)/functable.h $(SRCDIR)/crc32.h +chunkset.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h +crc32.obj: $(SRCDIR)/crc32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zendian.h $(SRCDIR)/deflate.h $(SRCDIR)/functable.h $(SRCDIR)/crc32_tbl.h +crc32_comb.obj: $(SRCDIR)/crc32_comb.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/crc32_comb_tbl.h deflate.obj: $(SRCDIR)/deflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h -deflate_fast.obj: $(SRCDIR)/deflate_fast.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/match_p.h $(SRCDIR)/functable.h -deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/match_p.h $(SRCDIR)/functable.h -deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/match_p.h $(SRCDIR)/functable.h +deflate_fast.obj: $(SRCDIR)/deflate_fast.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_quick.obj: $(SRCDIR)/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/trees_emit.h +deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h -inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/memcopy.h -inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/memcopy.h $(SRCDIR)/functable.h +inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h +inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h -trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees.h -zutil.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/gzguts.h +trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees_tbl.h +zutil.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/zutil_p.h example.obj: $(TOP)/test/example.c $(TOP)/zbuild.h $(TOP)/zlib$(SUFFIX).h diff --git a/libs/zlibng/win32/Makefile.msc b/libs/zlibng/win32/Makefile.msc index 9f4b884c3..85d27b9d7 100644 --- a/libs/zlibng/win32/Makefile.msc +++ b/libs/zlibng/win32/Makefile.msc @@ -23,21 +23,61 @@ AR = lib RC = rc CP = copy /y CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) -WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DX86_PCLMULQDQ_CRC -DX86_SSE2 -DX86_CPUID -DX86_SSE4_2_CRC_HASH -DUNALIGNED_OK -DX86_QUICK_STRATEGY +WFLAGS = \ + -D_CRT_SECURE_NO_DEPRECATE \ + -D_CRT_NONSTDC_NO_DEPRECATE \ + -DX86_FEATURES \ + -DX86_PCLMULQDQ_CRC \ + -DX86_SSE2 \ + -DX86_SSE42_CRC_INTRIN \ + -DX86_SSE42_CRC_HASH \ + -DX86_AVX2 \ + -DX86_AVX_CHUNKSET \ + -DX86_SSE2_CHUNKSET \ + -DUNALIGNED_OK \ + -DUNALIGNED64_OK \ + # LDFLAGS = -nologo -debug -incremental:no -opt:ref -manifest ARFLAGS = -nologo RCFLAGS = /dWIN32 /r DEFFILE = zlib.def RCFILE = zlib1.rc RESFILE = zlib1.res -WITH_GZFILEOP = +WITH_GZFILEOP = yes ZLIB_COMPAT = SUFFIX = -OBJS = adler32.obj compress.obj crc32.obj deflate.obj deflate_fast.obj deflate_quick.obj deflate_slow.obj \ - deflate_medium.obj \ - functable.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj \ - x86.obj fill_window_sse.obj insert_string_sse.obj crc_folding.obj +OBJS = \ + adler32.obj \ + chunkset.obj \ + chunkset_avx.obj \ + chunkset_sse.obj \ + compare258.obj \ + compare258_avx.obj \ + compare258_sse.obj \ + compress.obj \ + crc32.obj \ + crc32_comb.obj \ + crc_folding.obj \ + deflate.obj \ + deflate_fast.obj \ + deflate_quick.obj \ + deflate_slow.obj \ + deflate_medium.obj \ + functable.obj \ + infback.obj \ + inflate.obj \ + inftrees.obj \ + inffast.obj \ + insert_string.obj \ + insert_string_sse.obj \ + slide_avx.obj \ + slide_sse.obj \ + trees.obj \ + uncompr.obj \ + zutil.obj \ + x86.obj \ + # !if "$(ZLIB_COMPAT)" != "" WITH_GZFILEOP = yes WFLAGS = $(WFLAGS) -DZLIB_COMPAT @@ -54,7 +94,7 @@ SUFFIX = -ng !if "$(WITH_GZFILEOP)" != "" WFLAGS = $(WFLAGS) -DWITH_GZFILEOP -OBJS = $(OBJS) gzclose.obj gzlib.obj gzread.obj gzwrite.obj +OBJS = $(OBJS) gzlib.obj gzread.obj gzwrite.obj !endif # targets @@ -75,59 +115,72 @@ $(SHAREDLIB): zconf $(TOP)/win32/$(DEFFILE) $(OBJS) $(RESFILE) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;2 -example.exe: example.obj $(STATICLIB) - $(LD) $(LDFLAGS) example.obj $(STATICLIB) +example.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 -minigzip.exe: minigzip.obj $(STATICLIB) - $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) +minigzip.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 -example_d.exe: example.obj $(IMPLIB) - $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) +example_d.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 -minigzip_d.exe: minigzip.obj $(IMPLIB) - $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) +minigzip_d.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB) if exist $@.manifest \ mt -nologo -manifest $@.manifest -outputresource:$@;1 {$(TOP)}.c.obj: $(CC) -c $(WFLAGS) $(CFLAGS) $< +gzlib2.obj: gzlib.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzlib2.obj gzlib.c + +gzread2.obj: gzread.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzread2.obj gzread.c + +gzwrite2.obj: gzwrite.c + $(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzwrite2.obj gzwrite.c + {$(TOP)/arch/x86}.c.obj: $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< {$(TOP)/test}.c.obj: - $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP $< $(TOP)/zconf$(SUFFIX).h: zconf SRCDIR = $(TOP) # Keep the dependences in sync with top-level Makefile.in adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h -functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/gzendian.h $(SRCDIR)/arch/x86/x86.h -gzclose.obj: $(SRCDIR)/gzclose.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h -gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h -gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h -gzwrite.obj: $(SRCDIR)/gzwrite.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h +functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86.h +gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h +gzwrite.obj: $(SRCDIR)/gzwrite.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h compress.obj: $(SRCDIR)/compress.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h uncompr.obj: $(SRCDIR)/uncompr.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h -crc32.obj: $(SRCDIR)/crc32.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzendian.h $(SRCDIR)/deflate.h $(SRCDIR)/functable.h $(SRCDIR)/crc32.h +chunkset.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h +chunkset_avx.obj: $(SRCDIR)/arch/x86/chunkset_avx.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h +chunkset_sse.obj: $(SRCDIR)/arch/x86/chunkset_sse.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h +crc32.obj: $(SRCDIR)/crc32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zendian.h $(SRCDIR)/deflate.h $(SRCDIR)/functable.h $(SRCDIR)/crc32_tbl.h +crc32_comb.obj: $(SRCDIR)/crc32_comb.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/crc32_comb_tbl.h deflate.obj: $(SRCDIR)/deflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h -deflate_fast.obj: $(SRCDIR)/deflate_fast.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/match_p.h $(SRCDIR)/functable.h -deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/match_p.h $(SRCDIR)/functable.h -deflate_quick.obj: $(SRCDIR)/arch/x86/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/memcopy.h -deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/match_p.h $(SRCDIR)/functable.h +deflate_fast.obj: $(SRCDIR)/deflate_fast.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h +deflate_quick.obj: $(SRCDIR)/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/trees_emit.h +deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h -inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/memcopy.h -inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/memcopy.h $(SRCDIR)/functable.h +inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h +inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h -trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees.h -zutil.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/gzguts.h +slide_sse.obj: $(SRCDIR)/arch/x86/slide_sse.c $(SRCDIR)/deflate.h +trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees_tbl.h +zutil.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/zutil_p.h example.obj: $(TOP)/test/example.c $(TOP)/zbuild.h $(TOP)/zlib$(SUFFIX).h diff --git a/libs/zlibng/win32/VisualC.txt b/libs/zlibng/win32/VisualC.txt deleted file mode 100644 index 579a5fc9e..000000000 --- a/libs/zlibng/win32/VisualC.txt +++ /dev/null @@ -1,3 +0,0 @@ - -To build zlib using the Microsoft Visual C++ environment, -use the appropriate project from the projects/ directory. diff --git a/libs/zlibng/win32/zlib-ng.def b/libs/zlibng/win32/zlib-ng.def index fd1047f44..467d79009 100644 --- a/libs/zlibng/win32/zlib-ng.def +++ b/libs/zlibng/win32/zlib-ng.def @@ -17,6 +17,8 @@ EXPORTS zng_deflatePending zng_deflatePrime zng_deflateSetHeader + zng_deflateSetParams + zng_deflateGetParams zng_inflateSetDictionary zng_inflateGetDictionary zng_inflateSync @@ -35,9 +37,6 @@ EXPORTS zng_compressBound zng_uncompress zng_uncompress2 -; large file functions - zng_adler32_combine64 - zng_crc32_combine64 ; checksum functions zng_adler32 zng_adler32_z diff --git a/libs/zlibng/zbuild.h b/libs/zlibng/zbuild.h index f375f2e68..3bd4f4898 100644 --- a/libs/zlibng/zbuild.h +++ b/libs/zlibng/zbuild.h @@ -3,21 +3,25 @@ /* This has to be first include that defines any types */ #if defined(_MSC_VER) -# include - typedef SSIZE_T ssize_t; -# define __thread __declspec(thread) +# if defined(_WIN64) + typedef __int64 ssize_t; +# else + typedef long ssize_t; +# endif #endif #if defined(ZLIB_COMPAT) # define PREFIX(x) x # define PREFIX2(x) ZLIB_ ## x # define PREFIX3(x) z_ ## x +# define PREFIX4(x) x ## 64 # define zVersion zlibVersion # define z_size_t unsigned long #else # define PREFIX(x) zng_ ## x # define PREFIX2(x) ZLIBNG_ ## x # define PREFIX3(x) zng_ ## x +# define PREFIX4(x) zng_ ## x # define zVersion zlibng_version # define z_size_t size_t #endif diff --git a/libs/zlibng/zconf-ng.h.in b/libs/zlibng/zconf-ng.h.in index 5d0928de5..7d54668d3 100644 --- a/libs/zlibng/zconf-ng.h.in +++ b/libs/zlibng/zconf-ng.h.in @@ -3,18 +3,11 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - #ifndef ZCONFNG_H #define ZCONFNG_H -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif +#if !defined(_WIN32) && defined(__WIN32__) +# define _WIN32 #endif #ifdef __STDC_VERSION__ @@ -25,6 +18,16 @@ # endif #endif +/* Clang macro for detecting declspec support + * https://clang.llvm.org/docs/LanguageExtensions.html#has-declspec-attribute + */ +#ifndef __has_declspec_attribute +# define __has_declspec_attribute(x) 0 +#endif + +/* Always define z_const as const */ +#define z_const const + /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # define MAX_MEM_LEVEL 9 @@ -52,43 +55,43 @@ for small objects. */ - /* Type declarations */ +/* Type declarations */ +#ifdef ZLIB_INTERNAL +# define Z_INTERNAL ZLIB_INTERNAL +#endif -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# define ZEXPORTVA WINAPIV +/* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +#if defined(ZLIB_DLL) && (defined(_WIN32) || (__has_declspec_attribute(dllexport) && __has_declspec_attribute(dllimport))) +# ifdef Z_INTERNAL +# define Z_EXTERN extern __declspec(dllexport) +# else +# define Z_EXTERN extern __declspec(dllimport) # endif #endif -#ifndef ZEXTERN -# define ZEXTERN extern +/* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +#if defined(ZLIB_WINAPI) && defined(_WIN32) +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define Z_EXPORT WINAPI +# define Z_EXPORTVA WINAPIV #endif -#ifndef ZEXPORT -# define ZEXPORT + +#ifndef Z_EXTERN +# define Z_EXTERN extern #endif -#ifndef ZEXPORTVA -# define ZEXPORTVA +#ifndef Z_EXPORT +# define Z_EXPORT +#endif +#ifndef Z_EXPORTVA +# define Z_EXPORTVA #endif /* Fallback for something that includes us. */ @@ -107,11 +110,11 @@ typedef void const *voidpc; typedef void *voidpf; typedef void *voidp; -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by configure/cmake/etc */ # define Z_HAVE_UNISTD_H #endif -#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by ./configure */ +#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by configure/cmake/etc */ typedef PTRDIFF_TYPE ptrdiff_t; #endif @@ -159,12 +162,12 @@ typedef PTRDIFF_TYPE ptrdiff_t; # define z_off_t long #endif -#if !defined(WIN32) && defined(Z_LARGE64) +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else # if defined(__MSYS__) # define z_off64_t _off64_t -# elif defined(WIN32) && !defined(__GNUC__) +# elif defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/libs/zlibng/zconf.h.in b/libs/zlibng/zconf.h.in index 79e4cc49c..fcbcbb6b1 100644 --- a/libs/zlibng/zconf.h.in +++ b/libs/zlibng/zconf.h.in @@ -3,18 +3,11 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - #ifndef ZCONF_H #define ZCONF_H -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif +#if !defined(_WIN32) && defined(__WIN32__) +# define _WIN32 #endif #ifdef __STDC_VERSION__ @@ -25,6 +18,19 @@ # endif #endif +/* Clang macro for detecting declspec support + * https://clang.llvm.org/docs/LanguageExtensions.html#has-declspec-attribute + */ +#ifndef __has_declspec_attribute +# define __has_declspec_attribute(x) 0 +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # define MAX_MEM_LEVEL 9 @@ -52,43 +58,48 @@ for small objects. */ - /* Type declarations */ +/* Type declarations */ -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# define ZEXPORTVA WINAPIV +#ifndef OF /* function prototypes */ +# define OF(args) args +#endif + +#ifdef ZLIB_INTERNAL +# define Z_INTERNAL ZLIB_INTERNAL +#endif + +/* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +#if defined(ZLIB_DLL) && (defined(_WIN32) || (__has_declspec_attribute(dllexport) && __has_declspec_attribute(dllimport))) +# ifdef Z_INTERNAL +# define Z_EXTERN extern __declspec(dllexport) +# else +# define Z_EXTERN extern __declspec(dllimport) # endif #endif -#ifndef ZEXTERN -# define ZEXTERN extern +/* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +#if defined(ZLIB_WINAPI) && defined(_WIN32) +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define Z_EXPORT WINAPI +# define Z_EXPORTVA WINAPIV #endif -#ifndef ZEXPORT -# define ZEXPORT + +#ifndef Z_EXTERN +# define Z_EXTERN extern #endif -#ifndef ZEXPORTVA -# define ZEXPORTVA +#ifndef Z_EXPORT +# define Z_EXPORT +#endif +#ifndef Z_EXPORTVA +# define Z_EXPORTVA #endif /* Fallback for something that includes us. */ @@ -107,11 +118,11 @@ typedef void const *voidpc; typedef void *voidpf; typedef void *voidp; -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by configure/cmake/etc */ # define Z_HAVE_UNISTD_H #endif -#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by ./configure */ +#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by configure/cmake/etc */ typedef PTRDIFF_TYPE ptrdiff_t; #endif @@ -159,12 +170,12 @@ typedef PTRDIFF_TYPE ptrdiff_t; # define z_off_t long #endif -#if !defined(WIN32) && defined(Z_LARGE64) +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else # if defined(__MSYS__) # define z_off64_t _off64_t -# elif defined(WIN32) && !defined(__GNUC__) +# elif defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/libs/zlibng/zendian.h b/libs/zlibng/zendian.h new file mode 100644 index 000000000..54718ed14 --- /dev/null +++ b/libs/zlibng/zendian.h @@ -0,0 +1,60 @@ +/* zendian.h -- define BYTE_ORDER for endian tests + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifndef ENDIAN_H_ +#define ENDIAN_H_ + +/* First check whether the compiler knows the target __BYTE_ORDER__. */ +#if defined(__BYTE_ORDER__) +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# if !defined(LITTLE_ENDIAN) +# define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ +# endif +# if !defined(BYTE_ORDER) +# define BYTE_ORDER LITTLE_ENDIAN +# endif +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# if !defined(BIG_ENDIAN) +# define BIG_ENDIAN __ORDER_BIG_ENDIAN__ +# endif +# if !defined(BYTE_ORDER) +# define BYTE_ORDER BIG_ENDIAN +# endif +# endif +#elif defined(__MINGW32__) +# include +#elif defined(_WIN32) +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 +# if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) || defined (_M_ARM) || defined (_M_ARM64) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# error Unknown endianness! +# endif +#elif defined(__linux__) +# include +#elif defined(__APPLE__) || defined(__arm__) || defined(__aarch64__) +# include +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) +# include +#elif defined(__sun) || defined(sun) +# include +# if !defined(LITTLE_ENDIAN) +# define LITTLE_ENDIAN 4321 +# endif +# if !defined(BIG_ENDIAN) +# define BIG_ENDIAN 1234 +# endif +# if !defined(BYTE_ORDER) +# if defined(_BIG_ENDIAN) +# define BYTE_ORDER BIG_ENDIAN +# else +# define BYTE_ORDER LITTLE_ENDIAN +# endif +# endif +#else +# include +#endif + +#endif diff --git a/libs/zlibng/zlib-ng.h b/libs/zlibng/zlib-ng.h index 3d972a0c5..275ded703 100644 --- a/libs/zlibng/zlib-ng.h +++ b/libs/zlibng/zlib-ng.h @@ -1,7 +1,6 @@ #ifndef ZNGLIB_H_ #define ZNGLIB_H_ -/* zlib-ng.h -- interface of the 'zlib-ng' compression library - Forked from and compatible with zlib 1.2.11 +/* zlib-ng.h -- interface of the 'zlib-ng' compression library, forked from zlib. Copyright (C) 1995-2016 Jean-loup Gailly and Mark Adler @@ -37,11 +36,11 @@ extern "C" { #endif -#define ZLIBNG_VERSION "1.9.9" -#define ZLIBNG_VERNUM 0x1990 -#define ZLIBNG_VER_MAJOR 1 -#define ZLIBNG_VER_MINOR 9 -#define ZLIBNG_VER_REVISION 9 +#define ZLIBNG_VERSION "2.0.0-RC2" +#define ZLIBNG_VERNUM 0x2000 +#define ZLIBNG_VER_MAJOR 2 +#define ZLIBNG_VER_MINOR 0 +#define ZLIBNG_VER_REVISION 0 #define ZLIBNG_VER_SUBREVISION 0 /* @@ -84,11 +83,11 @@ typedef void (*free_func) (void *opaque, void *address); struct internal_state; typedef struct zng_stream_s { - const unsigned char *next_in; /* next input byte */ + const uint8_t *next_in; /* next input byte */ uint32_t avail_in; /* number of bytes available at next_in */ size_t total_in; /* total number of input bytes read so far */ - unsigned char *next_out; /* next output byte will go here */ + uint8_t *next_out; /* next output byte will go here */ uint32_t avail_out; /* remaining free space at next_out */ size_t total_out; /* total number of bytes output so far */ @@ -112,19 +111,19 @@ typedef zng_stream *zng_streamp; /* Obsolete type, retained for compatibility o for more details on the meanings of these fields. */ typedef struct zng_gz_header_s { - int text; /* true if compressed data believed to be text */ + int32_t text; /* true if compressed data believed to be text */ unsigned long time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - unsigned char *extra; /* pointer to extra field or NULL if none */ - unsigned int extra_len; /* extra field length (valid if extra != NULL) */ - unsigned int extra_max; /* space at extra (only when reading header) */ - unsigned char *name; /* pointer to zero-terminated file name or NULL */ - unsigned int name_max; /* space at name (only when reading header) */ - unsigned char *comment; /* pointer to zero-terminated comment or NULL */ - unsigned int comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used when writing a gzip file) */ + int32_t xflags; /* extra flags (not used when writing a gzip file) */ + int32_t os; /* operating system */ + uint8_t *extra; /* pointer to extra field or NULL if none */ + uint32_t extra_len; /* extra field length (valid if extra != NULL) */ + uint32_t extra_max; /* space at extra (only when reading header) */ + uint8_t *name; /* pointer to zero-terminated file name or NULL */ + uint32_t name_max; /* space at name (only when reading header) */ + uint8_t *comment; /* pointer to zero-terminated comment or NULL */ + uint32_t comm_max; /* space at comment (only when reading header) */ + int32_t hcrc; /* true if there was or will be a header crc */ + int32_t done; /* true when done reading gzip header (not used when writing a gzip file) */ } zng_gz_header; typedef zng_gz_header *zng_gz_headerp; @@ -204,7 +203,8 @@ typedef zng_gz_header *zng_gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibng_version(void); +Z_EXTERN Z_EXPORT +const char *zlibng_version(void); /* The application can compare zlibng_version and ZLIBNG_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib-ng.h header file used by the application. This check @@ -212,7 +212,8 @@ ZEXTERN const char * ZEXPORT zlibng_version(void); */ /* -ZEXTERN int ZEXPORT zng_deflateInit (zng_stream *strm, int level); +Z_EXTERN Z_EXPORT +int zng_deflateInit(zng_stream *strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If @@ -234,7 +235,8 @@ ZEXTERN int ZEXPORT zng_deflateInit (zng_stream *strm, int level); */ -ZEXTERN int ZEXPORT zng_deflate(zng_stream *strm, int flush); +Z_EXTERN Z_EXPORT +int32_t zng_deflate(zng_stream *strm, int32_t flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -347,7 +349,8 @@ ZEXTERN int ZEXPORT zng_deflate(zng_stream *strm, int flush); */ -ZEXTERN int ZEXPORT zng_deflateEnd(zng_stream *strm); +Z_EXTERN Z_EXPORT +int32_t zng_deflateEnd(zng_stream *strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -362,7 +365,8 @@ ZEXTERN int ZEXPORT zng_deflateEnd(zng_stream *strm); /* -ZEXTERN int ZEXPORT zng_inflateInit (zng_stream *strm); +Z_EXTERN Z_EXPORT +int zng_inflateInit(zng_stream *strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -384,7 +388,8 @@ ZEXTERN int ZEXPORT zng_inflateInit (zng_stream *strm); */ -ZEXTERN int ZEXPORT zng_inflate(zng_stream *strm, int flush); +Z_EXTERN Z_EXPORT +int32_t zng_inflate(zng_stream *strm, int32_t flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -504,7 +509,8 @@ ZEXTERN int ZEXPORT zng_inflate(zng_stream *strm, int flush); */ -ZEXTERN int ZEXPORT zng_inflateEnd(zng_stream *strm); +Z_EXTERN Z_EXPORT +int32_t zng_inflateEnd(zng_stream *strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -522,12 +528,8 @@ ZEXTERN int ZEXPORT zng_inflateEnd(zng_stream *strm); */ /* -ZEXTERN int ZEXPORT zng_deflateInit2 (zng_stream *strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy); +Z_EXTERN Z_EXPORT +int zng_deflateInit2(zng_stream *strm, int level, int method, int windowBits, int memLevel, int strategy); This is another version of deflateInit with more compression options. The fields zalloc, zfree and opaque must be initialized before by the caller. @@ -594,9 +596,8 @@ ZEXTERN int ZEXPORT zng_deflateInit2 (zng_stream *strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT zng_deflateSetDictionary(zng_stream *strm, - const unsigned char *dictionary, - unsigned int dictLength); +Z_EXTERN Z_EXPORT +int32_t zng_deflateSetDictionary(zng_stream *strm, const uint8_t *dictionary, uint32_t dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -638,7 +639,8 @@ ZEXTERN int ZEXPORT zng_deflateSetDictionary(zng_stream *strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT zng_deflateGetDictionary (zng_stream *strm, unsigned char *dictionary, unsigned int *dictLength); +Z_EXTERN Z_EXPORT +int32_t zng_deflateGetDictionary(zng_stream *strm, uint8_t *dictionary, uint32_t *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -658,7 +660,8 @@ ZEXTERN int ZEXPORT zng_deflateGetDictionary (zng_stream *strm, unsigned char *d stream state is inconsistent. */ -ZEXTERN int ZEXPORT zng_deflateCopy(zng_stream *dest, zng_stream *source); +Z_EXTERN Z_EXPORT +int32_t zng_deflateCopy(zng_stream *dest, zng_stream *source); /* Sets the destination stream as a complete copy of the source stream. @@ -675,7 +678,8 @@ ZEXTERN int ZEXPORT zng_deflateCopy(zng_stream *dest, zng_stream *source); destination. */ -ZEXTERN int ZEXPORT zng_deflateReset(zng_stream *strm); +Z_EXTERN Z_EXPORT +int32_t zng_deflateReset(zng_stream *strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream @@ -686,7 +690,8 @@ ZEXTERN int ZEXPORT zng_deflateReset(zng_stream *strm); stream state was inconsistent (such as zalloc or state being NULL). */ -ZEXTERN int ZEXPORT zng_deflateParams(zng_stream *strm, int level, int strategy); +Z_EXTERN Z_EXPORT +int32_t zng_deflateParams(zng_stream *strm, int32_t level, int32_t strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be @@ -722,7 +727,8 @@ ZEXTERN int ZEXPORT zng_deflateParams(zng_stream *strm, int level, int strategy) retried with more output space. */ -ZEXTERN int ZEXPORT zng_deflateTune(zng_stream *strm, int good_length, int max_lazy, int nice_length, int max_chain); +Z_EXTERN Z_EXPORT +int32_t zng_deflateTune(zng_stream *strm, int32_t good_length, int32_t max_lazy, int32_t nice_length, int32_t max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -735,7 +741,8 @@ ZEXTERN int ZEXPORT zng_deflateTune(zng_stream *strm, int good_length, int max_l returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN unsigned long ZEXPORT zng_deflateBound(zng_stream *strm, unsigned long sourceLen); +Z_EXTERN Z_EXPORT +unsigned long zng_deflateBound(zng_stream *strm, unsigned long sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -749,7 +756,8 @@ ZEXTERN unsigned long ZEXPORT zng_deflateBound(zng_stream *strm, unsigned long s than Z_FINISH or Z_NO_FLUSH are used. */ -ZEXTERN int ZEXPORT zng_deflatePending(zng_stream *strm, uint32_t *pending, int *bits); +Z_EXTERN Z_EXPORT +int32_t zng_deflatePending(zng_stream *strm, uint32_t *pending, int32_t *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -762,7 +770,8 @@ ZEXTERN int ZEXPORT zng_deflatePending(zng_stream *strm, uint32_t *pending, int stream state was inconsistent. */ -ZEXTERN int ZEXPORT zng_deflatePrime(zng_stream *strm, int bits, int value); +Z_EXTERN Z_EXPORT +int32_t zng_deflatePrime(zng_stream *strm, int32_t bits, int32_t value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -777,7 +786,8 @@ ZEXTERN int ZEXPORT zng_deflatePrime(zng_stream *strm, int bits, int value); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT zng_deflateSetHeader(zng_stream *strm, zng_gz_headerp head); +Z_EXTERN Z_EXPORT +int32_t zng_deflateSetHeader(zng_stream *strm, zng_gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -801,7 +811,8 @@ ZEXTERN int ZEXPORT zng_deflateSetHeader(zng_stream *strm, zng_gz_headerp head); */ /* -ZEXTERN int ZEXPORT zng_inflateInit2(zng_stream *strm, int windowBits); +Z_EXTERN Z_EXPORT +int zng_inflateInit2(zng_stream *strm, int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -854,7 +865,8 @@ ZEXTERN int ZEXPORT zng_inflateInit2(zng_stream *strm, int windowBits); deferred until inflate() is called. */ -ZEXTERN int ZEXPORT zng_inflateSetDictionary(zng_stream *strm, const unsigned char *dictionary, unsigned int dictLength); +Z_EXTERN Z_EXPORT +int32_t zng_inflateSetDictionary(zng_stream *strm, const uint8_t *dictionary, uint32_t dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -875,7 +887,8 @@ ZEXTERN int ZEXPORT zng_inflateSetDictionary(zng_stream *strm, const unsigned ch inflate(). */ -ZEXTERN int ZEXPORT zng_inflateGetDictionary(zng_stream *strm, unsigned char *dictionary, unsigned int *dictLength); +Z_EXTERN Z_EXPORT +int32_t zng_inflateGetDictionary(zng_stream *strm, uint8_t *dictionary, uint32_t *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -888,7 +901,8 @@ ZEXTERN int ZEXPORT zng_inflateGetDictionary(zng_stream *strm, unsigned char *di stream state is inconsistent. */ -ZEXTERN int ZEXPORT zng_inflateSync(zng_stream *strm); +Z_EXTERN Z_EXPORT +int32_t zng_inflateSync(zng_stream *strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -907,7 +921,8 @@ ZEXTERN int ZEXPORT zng_inflateSync(zng_stream *strm); input each time, until success or end of the input data. */ -ZEXTERN int ZEXPORT zng_inflateCopy(zng_stream *dest, zng_stream *source); +Z_EXTERN Z_EXPORT +int32_t zng_inflateCopy(zng_stream *dest, zng_stream *source); /* Sets the destination stream as a complete copy of the source stream. @@ -922,7 +937,8 @@ ZEXTERN int ZEXPORT zng_inflateCopy(zng_stream *dest, zng_stream *source); destination. */ -ZEXTERN int ZEXPORT zng_inflateReset(zng_stream *strm); +Z_EXTERN Z_EXPORT +int32_t zng_inflateReset(zng_stream *strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The @@ -932,7 +948,8 @@ ZEXTERN int ZEXPORT zng_inflateReset(zng_stream *strm); stream state was inconsistent (such as zalloc or state being NULL). */ -ZEXTERN int ZEXPORT zng_inflateReset2(zng_stream *strm, int windowBits); +Z_EXTERN Z_EXPORT +int32_t zng_inflateReset2(zng_stream *strm, int32_t windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -945,7 +962,8 @@ ZEXTERN int ZEXPORT zng_inflateReset2(zng_stream *strm, int windowBits); the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT zng_inflatePrime(zng_stream *strm, int bits, int value); +Z_EXTERN Z_EXPORT +int32_t zng_inflatePrime(zng_stream *strm, int32_t bits, int32_t value); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the @@ -964,7 +982,8 @@ ZEXTERN int ZEXPORT zng_inflatePrime(zng_stream *strm, int bits, int value); stream state was inconsistent. */ -ZEXTERN long ZEXPORT zng_inflateMark(zng_stream *strm); +Z_EXTERN Z_EXPORT +long zng_inflateMark(zng_stream *strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -992,7 +1011,8 @@ ZEXTERN long ZEXPORT zng_inflateMark(zng_stream *strm); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT zng_inflateGetHeader(zng_stream *strm, zng_gz_headerp head); +Z_EXTERN Z_EXPORT +int32_t zng_inflateGetHeader(zng_stream *strm, zng_gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided zng_gz_header structure. inflateGetHeader() may be called after @@ -1032,7 +1052,8 @@ ZEXTERN int ZEXPORT zng_inflateGetHeader(zng_stream *strm, zng_gz_headerp head); */ /* -ZEXTERN int ZEXPORT zng_inflateBackInit (zng_stream *strm, int windowBits, unsigned char *window); +Z_EXTERN Z_EXPORT +int zng_inflateBackInit(zng_stream *strm, int windowBits, unsigned char *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1052,10 +1073,11 @@ ZEXTERN int ZEXPORT zng_inflateBackInit (zng_stream *strm, int windowBits, unsig the version of the header file. */ -typedef uint32_t (*in_func) (void *, const unsigned char * *); -typedef int (*out_func) (void *, unsigned char *, uint32_t); +typedef uint32_t (*in_func) (void *, const uint8_t * *); +typedef int32_t (*out_func) (void *, uint8_t *, uint32_t); -ZEXTERN int ZEXPORT zng_inflateBack(zng_stream *strm, in_func in, void *in_desc, out_func out, void *out_desc); +Z_EXTERN Z_EXPORT +int32_t zng_inflateBack(zng_stream *strm, in_func in, void *in_desc, out_func out, void *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1123,7 +1145,8 @@ ZEXTERN int ZEXPORT zng_inflateBack(zng_stream *strm, in_func in, void *in_desc, cannot return Z_OK. */ -ZEXTERN int ZEXPORT zng_inflateBackEnd(zng_stream *strm); +Z_EXTERN Z_EXPORT +int32_t zng_inflateBackEnd(zng_stream *strm); /* All memory allocated by inflateBackInit() is freed. @@ -1131,7 +1154,8 @@ ZEXTERN int ZEXPORT zng_inflateBackEnd(zng_stream *strm); state was inconsistent. */ -ZEXTERN unsigned long ZEXPORT zng_zlibCompileFlags(void); +Z_EXTERN Z_EXPORT +unsigned long zng_zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1147,7 +1171,7 @@ ZEXTERN unsigned long ZEXPORT zng_zlibCompileFlags(void); 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed + 12: BUILDFIXED -- build static block decoding tables when needed (not supported by zlib-ng) 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) @@ -1183,7 +1207,8 @@ ZEXTERN unsigned long ZEXPORT zng_zlibCompileFlags(void); you need special options. */ -ZEXTERN int ZEXPORT zng_compress(unsigned char *dest, size_t *destLen, const unsigned char *source, size_t sourceLen); +Z_EXTERN Z_EXPORT +int32_t zng_compress(uint8_t *dest, size_t *destLen, const uint8_t *source, size_t sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1197,8 +1222,8 @@ ZEXTERN int ZEXPORT zng_compress(unsigned char *dest, size_t *destLen, const uns buffer. */ -ZEXTERN int ZEXPORT zng_compress2(unsigned char *dest, size_t *destLen, const unsigned char *source, - size_t sourceLen, int level); +Z_EXTERN Z_EXPORT +int32_t zng_compress2(uint8_t *dest, size_t *destLen, const uint8_t *source, size_t sourceLen, int32_t level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1212,14 +1237,16 @@ ZEXTERN int ZEXPORT zng_compress2(unsigned char *dest, size_t *destLen, const un Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN size_t ZEXPORT zng_compressBound(size_t sourceLen); +Z_EXTERN Z_EXPORT +size_t zng_compressBound(size_t sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT zng_uncompress(unsigned char *dest, size_t *destLen, const unsigned char *source, size_t sourceLen); +Z_EXTERN Z_EXPORT +int32_t zng_uncompress(uint8_t *dest, size_t *destLen, const uint8_t *source, size_t sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1237,8 +1264,8 @@ ZEXTERN int ZEXPORT zng_uncompress(unsigned char *dest, size_t *destLen, const u */ -ZEXTERN int ZEXPORT zng_uncompress2 (unsigned char *dest, size_t *destLen, - const unsigned char *source, size_t *sourceLen); +Z_EXTERN Z_EXPORT +int32_t zng_uncompress2(uint8_t *dest, size_t *destLen, const uint8_t *source, size_t *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1258,9 +1285,9 @@ ZEXTERN int ZEXPORT zng_uncompress2 (unsigned char *dest, size_t *destLe typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ +Z_EXTERN Z_EXPORT +gzFile zng_gzopen(const char *path, const char *mode); /* -ZEXTERN gzFile ZEXPORT zng_gzopen(const char *path, const char *mode); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only @@ -1296,7 +1323,8 @@ ZEXTERN gzFile ZEXPORT zng_gzopen(const char *path, const char *mode); file could not be opened. */ -ZEXTERN gzFile ZEXPORT zng_gzdopen(int fd, const char *mode); +Z_EXTERN Z_EXPORT +gzFile zng_gzdopen(int fd, const char *mode); /* gzdopen associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file @@ -1319,7 +1347,8 @@ ZEXTERN gzFile ZEXPORT zng_gzdopen(int fd, const char *mode); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT zng_gzbuffer(gzFile file, unsigned size); +Z_EXTERN Z_EXPORT +int32_t zng_gzbuffer(gzFile file, uint32_t size); /* Set the internal buffer size used by this library's functions. The default buffer size is 8192 bytes. This function must be called after @@ -1335,7 +1364,8 @@ ZEXTERN int ZEXPORT zng_gzbuffer(gzFile file, unsigned size); too late. */ -ZEXTERN int ZEXPORT zng_gzsetparams(gzFile file, int level, int strategy); +Z_EXTERN Z_EXPORT +int32_t zng_gzsetparams(gzFile file, int32_t level, int32_t strategy); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. Previously provided @@ -1346,7 +1376,8 @@ ZEXTERN int ZEXPORT zng_gzsetparams(gzFile file, int level, int strategy); or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT zng_gzread(gzFile file, void *buf, unsigned len); +Z_EXTERN Z_EXPORT +int32_t zng_gzread(gzFile file, void *buf, uint32_t len); /* Reads the given number of uncompressed bytes from the compressed file. If the input file is not in gzip format, gzread copies the given number of @@ -1376,7 +1407,8 @@ ZEXTERN int ZEXPORT zng_gzread(gzFile file, void *buf, unsigned len); Z_STREAM_ERROR. */ -ZEXTERN size_t ZEXPORT zng_gzfread (void *buf, size_t size, size_t nitems, gzFile file); +Z_EXTERN Z_EXPORT +size_t zng_gzfread(void *buf, size_t size, size_t nitems, gzFile file); /* Read up to nitems items of size size from file to buf, otherwise operating as gzread() does. This duplicates the interface of stdio's fread(), with @@ -1399,14 +1431,16 @@ ZEXTERN size_t ZEXPORT zng_gzfread (void *buf, size_t size, size_t nitems, gzFil file, reseting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT zng_gzwrite(gzFile file, void const *buf, unsigned len); +Z_EXTERN Z_EXPORT +int32_t zng_gzwrite(gzFile file, void const *buf, uint32_t len); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ -ZEXTERN size_t ZEXPORT zng_gzfwrite(void const *buf, size_t size, size_t nitems, gzFile file); +Z_EXTERN Z_EXPORT +size_t zng_gzfwrite(void const *buf, size_t size, size_t nitems, gzFile file); /* gzfwrite() writes nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. @@ -1417,7 +1451,8 @@ ZEXTERN size_t ZEXPORT zng_gzfwrite(void const *buf, size_t size, size_t nitems, is returned, and the error state is set to Z_STREAM_ERROR. */ -ZEXTERN int ZEXPORTVA zng_gzprintf(gzFile file, const char *format, ...); +Z_EXTERN Z_EXPORTVA +int32_t zng_gzprintf(gzFile file, const char *format, ...); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of @@ -1432,7 +1467,8 @@ ZEXTERN int ZEXPORTVA zng_gzprintf(gzFile file, const char *format, ...); This can be determined using zlibCompileFlags(). */ -ZEXTERN int ZEXPORT zng_gzputs(gzFile file, const char *s); +Z_EXTERN Z_EXPORT +int32_t zng_gzputs(gzFile file, const char *s); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. @@ -1440,7 +1476,8 @@ ZEXTERN int ZEXPORT zng_gzputs(gzFile file, const char *s); gzputs returns the number of characters written, or -1 in case of error. */ -ZEXTERN char * ZEXPORT zng_gzgets(gzFile file, char *buf, int len); +Z_EXTERN Z_EXPORT +char * zng_gzgets(gzFile file, char *buf, int32_t len); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file @@ -1453,13 +1490,15 @@ ZEXTERN char * ZEXPORT zng_gzgets(gzFile file, char *buf, int len); buf are indeterminate. */ -ZEXTERN int ZEXPORT zng_gzputc(gzFile file, int c); +Z_EXTERN Z_EXPORT +int32_t zng_gzputc(gzFile file, int32_t c); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT zng_gzgetc(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzgetc(gzFile file); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. @@ -1468,7 +1507,8 @@ ZEXTERN int ZEXPORT zng_gzgetc(gzFile file); points to has been clobbered or not. */ -ZEXTERN int ZEXPORT zng_gzungetc(int c, gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzungetc(int32_t c, gzFile file); /* Push one character back onto the stream to be read as the first character on the next read. At least one character of push-back is allowed. @@ -1480,7 +1520,8 @@ ZEXTERN int ZEXPORT zng_gzungetc(int c, gzFile file); gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT zng_gzflush(gzFile file, int flush); +Z_EXTERN Z_EXPORT +int32_t zng_gzflush(gzFile file, int32_t flush); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number @@ -1495,9 +1536,9 @@ ZEXTERN int ZEXPORT zng_gzflush(gzFile file, int flush); degrade compression if called too often. */ +Z_EXTERN Z_EXPORT +z_off64_t zng_gzseek(gzFile file, z_off64_t offset, int whence); /* -ZEXTERN z_off_t ZEXPORT zng_gzseek (gzFile file, z_off_t offset, int whence); - Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); @@ -1514,16 +1555,17 @@ ZEXTERN z_off_t ZEXPORT zng_gzseek (gzFile file, z_off_t offset, int whence); would be before the current position. */ -ZEXTERN int ZEXPORT zng_gzrewind(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzrewind(gzFile file); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ +Z_EXTERN Z_EXPORT +z_off64_t zng_gztell(gzFile file); /* -ZEXTERN z_off_t ZEXPORT zng_gztell(gzFile file); - Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream, and is zero when starting, even if appending or @@ -1532,9 +1574,9 @@ ZEXTERN z_off_t ZEXPORT zng_gztell(gzFile file); gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ +Z_EXTERN Z_EXPORT +z_off64_t zng_gzoffset(gzFile file); /* -ZEXTERN z_off_t ZEXPORT zng_gzoffset(gzFile file); - Returns the current offset in the file being read or written. This offset includes the count of bytes that precede the gzip stream, for example when appending or when using gzdopen() for reading. When reading, the offset @@ -1542,7 +1584,8 @@ ZEXTERN z_off_t ZEXPORT zng_gzoffset(gzFile file); for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT zng_gzeof(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzeof(gzFile file); /* Returns true (1) if the end-of-file indicator has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set only if the @@ -1557,7 +1600,8 @@ ZEXTERN int ZEXPORT zng_gzeof(gzFile file); has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT zng_gzdirect(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzdirect(gzFile file); /* Returns true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. @@ -1578,7 +1622,8 @@ ZEXTERN int ZEXPORT zng_gzdirect(gzFile file); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT zng_gzclose(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzclose(gzFile file); /* Flushes all pending output if necessary, closes the compressed file and deallocates the (de)compression state. Note that once file is closed, you @@ -1591,8 +1636,10 @@ ZEXTERN int ZEXPORT zng_gzclose(gzFile file); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT zng_gzclose_r(gzFile file); -ZEXTERN int ZEXPORT zng_gzclose_w(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzclose_r(gzFile file); +Z_EXTERN Z_EXPORT +int32_t zng_gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1603,7 +1650,8 @@ ZEXTERN int ZEXPORT zng_gzclose_w(gzFile file); zlib library. */ -ZEXTERN const char * ZEXPORT zng_gzerror(gzFile file, int *errnum); +Z_EXTERN Z_EXPORT +const char * zng_gzerror(gzFile file, int32_t *errnum); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred @@ -1619,7 +1667,8 @@ ZEXTERN const char * ZEXPORT zng_gzerror(gzFile file, int *errnum); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT zng_gzclearerr(gzFile file); +Z_EXTERN Z_EXPORT +void zng_gzclearerr(gzFile file); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip @@ -1636,7 +1685,8 @@ ZEXTERN void ZEXPORT zng_gzclearerr(gzFile file); library. */ -ZEXTERN uint32_t ZEXPORT zng_adler32(uint32_t adler, const unsigned char *buf, uint32_t len); +Z_EXTERN Z_EXPORT +uint32_t zng_adler32(uint32_t adler, const uint8_t *buf, uint32_t len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the @@ -1655,14 +1705,15 @@ ZEXTERN uint32_t ZEXPORT zng_adler32(uint32_t adler, const unsigned char *buf, u if (adler != original_adler) error(); */ -ZEXTERN uint32_t ZEXPORT zng_adler32_z (uint32_t adler, const unsigned char *buf, size_t len); +Z_EXTERN Z_EXPORT +uint32_t zng_adler32_z(uint32_t adler, const uint8_t *buf, size_t len); /* Same as adler32(), but with a size_t length. */ +Z_EXTERN Z_EXPORT +uint32_t zng_adler32_combine(uint32_t adler1, uint32_t adler2, z_off64_t len2); /* -ZEXTERN uint32_t ZEXPORT zng_adler32_combine(uint32_t adler1, uint32_t adler2, z_off_t len2); - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of @@ -1671,7 +1722,8 @@ ZEXTERN uint32_t ZEXPORT zng_adler32_combine(uint32_t adler1, uint32_t adler2, z negative, the result has no meaning or utility. */ -ZEXTERN uint32_t ZEXPORT zng_crc32(uint32_t crc, const unsigned char *buf, uint32_t len); +Z_EXTERN Z_EXPORT +uint32_t zng_crc32(uint32_t crc, const uint8_t *buf, uint32_t len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is NULL, this function returns the required @@ -1688,14 +1740,16 @@ ZEXTERN uint32_t ZEXPORT zng_crc32(uint32_t crc, const unsigned char *buf, uint3 if (crc != original_crc) error(); */ -ZEXTERN uint32_t ZEXPORT zng_crc32_z (uint32_t crc, const unsigned char *buf, size_t len); +Z_EXTERN Z_EXPORT +uint32_t zng_crc32_z(uint32_t crc, const uint8_t *buf, size_t len); /* Same as crc32(), but with a size_t length. */ -/* -ZEXTERN uint32_t ZEXPORT zng_crc32_combine(uint32_t crc1, uint32_t crc2, z_off64_t len2); +Z_EXTERN Z_EXPORT +uint32_t zng_crc32_combine(uint32_t crc1, uint32_t crc2, z_off64_t len2); +/* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 @@ -1703,16 +1757,17 @@ ZEXTERN uint32_t ZEXPORT zng_crc32_combine(uint32_t crc1, uint32_t crc2, z_off64 len2. */ -/* -ZEXTERN void ZEXPORT zng_crc32_combine_gen(uint32_t op[32], z_off_t len2); +Z_EXTERN Z_EXPORT +void zng_crc32_combine_gen(uint32_t op[32], z_off64_t len2); +/* Generate the operator op corresponding to length len2, to be used with crc32_combine_op(). op must have room for 32 uint32_t values. (32 is the number of bits in the CRC.) */ -ZEXTERN uint32_t ZEXPORT zng_crc32_combine_op(uint32_t crc1, uint32_t crc2, - const uint32_t *op); +Z_EXTERN Z_EXPORT +uint32_t zng_crc32_combine_op(uint32_t crc1, uint32_t crc2, const uint32_t *op); /* Give the same result as crc32_combine(), using op in place of len2. op is is generated from len2 by crc32_combine_gen(). This will be faster than @@ -1724,21 +1779,22 @@ ZEXTERN uint32_t ZEXPORT zng_crc32_combine_op(uint32_t crc1, uint32_t crc2, /* zng_deflateInit and zng_inflateInit are macros to allow checking the zlib version * and the compiler's view of zng_stream: */ -ZEXTERN int ZEXPORT zng_deflateInit_(zng_stream *strm, int level, const char *version, int stream_size); -ZEXTERN int ZEXPORT zng_inflateInit_(zng_stream *strm, const char *version, int stream_size); -ZEXTERN int ZEXPORT zng_deflateInit2_(zng_stream *strm, int level, int method, int windowBits, int memLevel, - int strategy, const char *version, int stream_size); -ZEXTERN int ZEXPORT zng_inflateInit2_(zng_stream *strm, int windowBits, const char *version, int stream_size); -ZEXTERN int ZEXPORT zng_inflateBackInit_(zng_stream *strm, int windowBits, unsigned char *window, - const char *version, int stream_size); -#define zng_deflateInit(strm, level) zng_deflateInit_((strm), (level), ZLIBNG_VERSION, (int)sizeof(zng_stream)) -#define zng_inflateInit(strm) zng_inflateInit_((strm), ZLIBNG_VERSION, (int)sizeof(zng_stream)) +Z_EXTERN Z_EXPORT int32_t zng_deflateInit_(zng_stream *strm, int32_t level, const char *version, int32_t stream_size); +Z_EXTERN Z_EXPORT int32_t zng_inflateInit_(zng_stream *strm, const char *version, int32_t stream_size); +Z_EXTERN Z_EXPORT int32_t zng_deflateInit2_(zng_stream *strm, int32_t level, int32_t method, int32_t windowBits, int32_t memLevel, + int32_t strategy, const char *version, int32_t stream_size); +Z_EXTERN Z_EXPORT int32_t zng_inflateInit2_(zng_stream *strm, int32_t windowBits, const char *version, int32_t stream_size); +Z_EXTERN Z_EXPORT int32_t zng_inflateBackInit_(zng_stream *strm, int32_t windowBits, uint8_t *window, + const char *version, int32_t stream_size); + +#define zng_deflateInit(strm, level) zng_deflateInit_((strm), (level), ZLIBNG_VERSION, (int32_t)sizeof(zng_stream)) +#define zng_inflateInit(strm) zng_inflateInit_((strm), ZLIBNG_VERSION, (int32_t)sizeof(zng_stream)) #define zng_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ zng_deflateInit2_((strm), (level), (method), (windowBits), (memLevel), \ - (strategy), ZLIBNG_VERSION, (int)sizeof(zng_stream)) -#define zng_inflateInit2(strm, windowBits) zng_inflateInit2_((strm), (windowBits), ZLIBNG_VERSION, (int)sizeof(zng_stream)) + (strategy), ZLIBNG_VERSION, (int32_t)sizeof(zng_stream)) +#define zng_inflateInit2(strm, windowBits) zng_inflateInit2_((strm), (windowBits), ZLIBNG_VERSION, (int32_t)sizeof(zng_stream)) #define zng_inflateBackInit(strm, windowBits, window) \ - zng_inflateBackInit_((strm), (windowBits), (window), ZLIBNG_VERSION, (int)sizeof(zng_stream)) + zng_inflateBackInit_((strm), (windowBits), (window), ZLIBNG_VERSION, (int32_t)sizeof(zng_stream)) #ifdef WITH_GZFILEOP @@ -1754,85 +1810,75 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT zng_gzgetc_(gzFile file); /* backward compatibility */ +Z_EXTERN Z_EXPORT int32_t zng_gzgetc_(gzFile file); /* backward compatibility */ # define zng_gzgetc(g) ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (zng_gzgetc)(g)) -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT zng_gzopen64(const char *, const char *); - ZEXTERN z_off64_t ZEXPORT zng_gzseek64(gzFile, z_off64_t, int); - ZEXTERN z_off64_t ZEXPORT zng_gztell64(gzFile); - ZEXTERN z_off64_t ZEXPORT zng_gzoffset64(gzFile); -#endif - -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) -# define zng_gzopen zng_gzopen64 -# define zng_gzseek zng_gzseek64 -# define zng_gztell zng_gztell64 -# define zng_gzoffset zng_gzoffset64 -# ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT zng_gzopen64(const char *, const char *); - ZEXTERN z_off_t ZEXPORT zng_gzseek64(gzFile, z_off_t, int); - ZEXTERN z_off_t ZEXPORT zng_gztell64(gzFile); - ZEXTERN z_off_t ZEXPORT zng_gzoffset64(gzFile); -# endif -#else - ZEXTERN gzFile ZEXPORT zng_gzopen(const char *, const char *); - ZEXTERN z_off_t ZEXPORT zng_gzseek(gzFile, z_off_t, int); - ZEXTERN z_off_t ZEXPORT zng_gztell(gzFile); - ZEXTERN z_off_t ZEXPORT zng_gzoffset(gzFile); -#endif #endif /* WITH_GZFILEOP */ -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 - ZEXTERN uint32_t ZEXPORT zng_adler32_combine64(uint32_t, uint32_t, z_off64_t); - ZEXTERN uint32_t ZEXPORT zng_crc32_combine64(uint32_t, uint32_t, z_off64_t); - ZEXTERN void ZEXPORT zng_crc32_combine_gen64(uint32_t *op, z_off64_t); -#endif +typedef enum { + Z_DEFLATE_LEVEL = 0, /* compression level, represented as an int */ + Z_DEFLATE_STRATEGY = 1, /* compression strategy, represented as an int */ + Z_DEFLATE_REPRODUCIBLE = 2, + /* + Whether reproducible compression results are required. Represented as an int, where 0 means that it is allowed + to trade reproducibility for e.g. improved performance or compression ratio, and non-0 means that + reproducibility is strictly required. Reproducibility is guaranteed only when using an identical zlib-ng build. + Default is 0. + */ +} zng_deflate_param; -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) -# define zng_adler32_combine zng_adler32_combine64 -# define zng_crc32_combine zng_crc32_combine64 -# define zng_crc32_combine_gen zng_crc32_combine_gen64 -# ifndef Z_LARGE64 - ZEXTERN uint32_t ZEXPORT zng_adler32_combine64(uint32_t, uint32_t, z_off_t); - ZEXTERN uint32_t ZEXPORT zng_crc32_combine64(uint32_t, uint32_t, z_off_t); - ZEXTERN void ZEXPORT zng_crc32_combine_gen64(uint32_t *op, z_off64_t); -# endif -#else - ZEXTERN uint32_t ZEXPORT zng_adler32_combine(uint32_t, uint32_t, z_off_t); - ZEXTERN uint32_t ZEXPORT zng_crc32_combine(uint32_t, uint32_t, z_off_t); - ZEXTERN void ZEXPORT zng_crc32_combine_gen(uint32_t *op, z_off_t); -#endif +typedef struct { + zng_deflate_param param; /* parameter ID */ + void *buf; /* parameter value */ + size_t size; /* parameter value size */ + int32_t status; /* result of the last set/get call */ +} zng_deflate_param_value; +Z_EXTERN Z_EXPORT +int32_t zng_deflateSetParams(zng_stream *strm, zng_deflate_param_value *params, size_t count); +/* + Sets the values of the given zlib-ng deflate stream parameters. All the buffers are copied internally, so the + caller still owns them after this function returns. Returns Z_OK if success. + + If the size of at least one of the buffers is too small to hold the entire value of the corresponding parameter, + or if the same parameter is specified multiple times, Z_BUF_ERROR is returned. The caller may inspect status fields + in order to determine which of the parameters caused this error. No other changes are performed. + + If the stream state is inconsistent or if at least one of the values cannot be updated, Z_STREAM_ERROR is + returned. The caller may inspect status fields in order to determine which of the parameters caused this error. + Parameters, whose status field is equal to Z_OK, have been applied successfully. If all status fields are not equal + to Z_STREAM_ERROR, then the error was caused by a stream state inconsistency. + + If there are no other errors, but at least one parameter is not supported by the current zlib-ng version, + Z_VERSION_ERROR is returned. The caller may inspect status fields in order to determine which of the parameters + caused this error. +*/ + +Z_EXTERN Z_EXPORT +int32_t zng_deflateGetParams(zng_stream *strm, zng_deflate_param_value *params, size_t count); +/* + Copies the values of the given zlib-ng deflate stream parameters into the user-provided buffers. Returns Z_OK if + success, Z_VERSION_ERROR if at least one parameter is not supported by the current zlib-ng version, Z_STREAM_ERROR + if the stream state is inconsistent, and Z_BUF_ERROR if the size of at least one buffer is too small to hold the + entire value of the corresponding parameter. +*/ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zng_zError (int); -ZEXTERN int ZEXPORT zng_inflateSyncPoint (zng_stream *); -ZEXTERN const uint32_t * ZEXPORT zng_get_crc_table (void); -ZEXTERN int ZEXPORT zng_inflateUndermine (zng_stream *, int); -ZEXTERN int ZEXPORT zng_inflateValidate (zng_stream *, int); -ZEXTERN unsigned long ZEXPORT zng_inflateCodesUsed (zng_stream *); -ZEXTERN int ZEXPORT zng_inflateResetKeep (zng_stream *); -ZEXTERN int ZEXPORT zng_deflateResetKeep (zng_stream *); +Z_EXTERN Z_EXPORT const char * zng_zError (int32_t); +Z_EXTERN Z_EXPORT int32_t zng_inflateSyncPoint (zng_stream *); +Z_EXTERN Z_EXPORT const uint32_t * zng_get_crc_table (void); +Z_EXTERN Z_EXPORT int32_t zng_inflateUndermine (zng_stream *, int32_t); +Z_EXTERN Z_EXPORT int32_t zng_inflateValidate (zng_stream *, int32_t); +Z_EXTERN Z_EXPORT unsigned long zng_inflateCodesUsed (zng_stream *); +Z_EXTERN Z_EXPORT int32_t zng_inflateResetKeep (zng_stream *); +Z_EXTERN Z_EXPORT int32_t zng_deflateResetKeep (zng_stream *); #ifdef WITH_GZFILEOP -# if (defined(WIN32) || defined(__MINGW__)) - ZEXTERN gzFile ZEXPORT zng_gzopen_w(const wchar_t *path, const char *mode); -# endif -ZEXTERN int ZEXPORTVA zng_gzvprintf(gzFile file, const char *format, va_list va); +# if defined(_WIN32) + Z_EXTERN Z_EXPORT gzFile zng_gzopen_w(const wchar_t *path, const char *mode); +# endif +Z_EXTERN Z_EXPORTVA int32_t zng_gzvprintf(gzFile file, const char *format, va_list va); #endif #ifdef __cplusplus diff --git a/libs/zlibng/zlib-ng.map b/libs/zlibng/zlib-ng.map index 107d06958..b0046034c 100644 --- a/libs/zlibng/zlib-ng.map +++ b/libs/zlibng/zlib-ng.map @@ -1,16 +1,14 @@ -ZLIB_NG_1.9.9 { +ZLIB_NG_2.0.0 { global: zng_adler32; zng_adler32_c; zng_adler32_combine; - zng_adler32_combine64; zng_adler32_z; zng_compress; zng_compress2; zng_compressBound; zng_crc32; zng_crc32_combine; - zng_crc32_combine64; zng_crc32_combine_gen; zng_crc32_combine_op; zng_crc32_z; @@ -19,6 +17,7 @@ ZLIB_NG_1.9.9 { zng_deflateCopy; zng_deflateEnd; zng_deflateGetDictionary; + zng_deflateGetParams; zng_deflateInit_; zng_deflateInit2_; zng_deflateParams; @@ -28,6 +27,7 @@ ZLIB_NG_1.9.9 { zng_deflateResetKeep; zng_deflateSetDictionary; zng_deflateSetHeader; + zng_deflateSetParams; zng_deflateTune; zng_get_crc_table; zng_inflate; @@ -70,7 +70,7 @@ ZLIB_NG_1.9.9 { _*; }; -ZLIB_NG_GZ_1.9.9 { +ZLIB_NG_GZ_2.0.0 { global: zng_gzbuffer; zng_gzclearerr; diff --git a/libs/zlibng/zlib.3.pdf b/libs/zlibng/zlib.3.pdf deleted file mode 100644 index 6fa519c5b..000000000 Binary files a/libs/zlibng/zlib.3.pdf and /dev/null differ diff --git a/libs/zlibng/zlib.h b/libs/zlibng/zlib.h index 891350013..688fe440e 100644 --- a/libs/zlibng/zlib.h +++ b/libs/zlibng/zlib.h @@ -32,17 +32,17 @@ #include #include -#include "zconf.h" +#include "zconf-ng.h" #ifdef __cplusplus extern "C" { #endif -#define ZLIBNG_VERSION "1.9.9" -#define ZLIBNG_VERNUM 0x1990 -#define ZLIBNG_VER_MAJOR 1 -#define ZLIBNG_VER_MINOR 9 -#define ZLIBNG_VER_REVISION 9 +#define ZLIBNG_VERSION "2.0.0-RC2" +#define ZLIBNG_VERNUM 0x2000 +#define ZLIBNG_VER_MAJOR 2 +#define ZLIBNG_VER_MINOR 0 +#define ZLIBNG_VER_REVISION 0 #define ZLIBNG_VER_SUBREVISION 0 #define ZLIB_VERSION "1.2.11.zlib-ng" @@ -92,15 +92,15 @@ typedef void (*free_func) (void *opaque, void *address); struct internal_state; typedef struct z_stream_s { - const unsigned char *next_in; /* next input byte */ + z_const unsigned char *next_in; /* next input byte */ uint32_t avail_in; /* number of bytes available at next_in */ - size_t total_in; /* total number of input bytes read so far */ + unsigned long total_in; /* total number of input bytes read so far */ unsigned char *next_out; /* next output byte will go here */ uint32_t avail_out; /* remaining free space at next_out */ - size_t total_out; /* total number of bytes output so far */ + unsigned long total_out; /* total number of bytes output so far */ - const char *msg; /* last error message, NULL if no error */ + z_const char *msg; /* last error message, NULL if no error */ struct internal_state *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ @@ -215,7 +215,7 @@ typedef gz_header *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion(void); +Z_EXTERN const char * Z_EXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -223,7 +223,7 @@ ZEXTERN const char * ZEXPORT zlibVersion(void); */ /* -ZEXTERN int ZEXPORT deflateInit (z_stream *strm, int level); +Z_EXTERN int Z_EXPORT deflateInit (z_stream *strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If @@ -245,7 +245,7 @@ ZEXTERN int ZEXPORT deflateInit (z_stream *strm, int level); */ -ZEXTERN int ZEXPORT deflate(z_stream *strm, int flush); +Z_EXTERN int Z_EXPORT deflate(z_stream *strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -358,7 +358,7 @@ ZEXTERN int ZEXPORT deflate(z_stream *strm, int flush); */ -ZEXTERN int ZEXPORT deflateEnd(z_stream *strm); +Z_EXTERN int Z_EXPORT deflateEnd(z_stream *strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -373,7 +373,7 @@ ZEXTERN int ZEXPORT deflateEnd(z_stream *strm); /* -ZEXTERN int ZEXPORT inflateInit (z_stream *strm); +Z_EXTERN int Z_EXPORT inflateInit (z_stream *strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -395,7 +395,7 @@ ZEXTERN int ZEXPORT inflateInit (z_stream *strm); */ -ZEXTERN int ZEXPORT inflate(z_stream *strm, int flush); +Z_EXTERN int Z_EXPORT inflate(z_stream *strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -515,7 +515,7 @@ ZEXTERN int ZEXPORT inflate(z_stream *strm, int flush); */ -ZEXTERN int ZEXPORT inflateEnd(z_stream *strm); +Z_EXTERN int Z_EXPORT inflateEnd(z_stream *strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -533,7 +533,7 @@ ZEXTERN int ZEXPORT inflateEnd(z_stream *strm); */ /* -ZEXTERN int ZEXPORT deflateInit2 (z_stream *strm, +Z_EXTERN int Z_EXPORT deflateInit2 (z_stream *strm, int level, int method, int windowBits, @@ -605,7 +605,7 @@ ZEXTERN int ZEXPORT deflateInit2 (z_stream *strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary(z_stream *strm, +Z_EXTERN int Z_EXPORT deflateSetDictionary(z_stream *strm, const unsigned char *dictionary, unsigned int dictLength); /* @@ -649,7 +649,7 @@ ZEXTERN int ZEXPORT deflateSetDictionary(z_stream *strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary (z_stream *strm, unsigned char *dictionary, unsigned int *dictLength); +Z_EXTERN int Z_EXPORT deflateGetDictionary (z_stream *strm, unsigned char *dictionary, unsigned int *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -669,7 +669,7 @@ ZEXTERN int ZEXPORT deflateGetDictionary (z_stream *strm, unsigned char *diction stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy(z_stream *dest, z_stream *source); +Z_EXTERN int Z_EXPORT deflateCopy(z_stream *dest, z_stream *source); /* Sets the destination stream as a complete copy of the source stream. @@ -686,7 +686,7 @@ ZEXTERN int ZEXPORT deflateCopy(z_stream *dest, z_stream *source); destination. */ -ZEXTERN int ZEXPORT deflateReset(z_stream *strm); +Z_EXTERN int Z_EXPORT deflateReset(z_stream *strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream @@ -697,7 +697,7 @@ ZEXTERN int ZEXPORT deflateReset(z_stream *strm); stream state was inconsistent (such as zalloc or state being NULL). */ -ZEXTERN int ZEXPORT deflateParams(z_stream *strm, int level, int strategy); +Z_EXTERN int Z_EXPORT deflateParams(z_stream *strm, int level, int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be @@ -733,7 +733,7 @@ ZEXTERN int ZEXPORT deflateParams(z_stream *strm, int level, int strategy); retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune(z_stream *strm, int good_length, int max_lazy, int nice_length, int max_chain); +Z_EXTERN int Z_EXPORT deflateTune(z_stream *strm, int good_length, int max_lazy, int nice_length, int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -746,7 +746,7 @@ ZEXTERN int ZEXPORT deflateTune(z_stream *strm, int good_length, int max_lazy, i returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN unsigned long ZEXPORT deflateBound(z_stream *strm, unsigned long sourceLen); +Z_EXTERN unsigned long Z_EXPORT deflateBound(z_stream *strm, unsigned long sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -760,7 +760,7 @@ ZEXTERN unsigned long ZEXPORT deflateBound(z_stream *strm, unsigned long sourceL than Z_FINISH or Z_NO_FLUSH are used. */ -ZEXTERN int ZEXPORT deflatePending(z_stream *strm, uint32_t *pending, int *bits); +Z_EXTERN int Z_EXPORT deflatePending(z_stream *strm, uint32_t *pending, int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -773,7 +773,7 @@ ZEXTERN int ZEXPORT deflatePending(z_stream *strm, uint32_t *pending, int *bits) stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime(z_stream *strm, int bits, int value); +Z_EXTERN int Z_EXPORT deflatePrime(z_stream *strm, int bits, int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -788,7 +788,7 @@ ZEXTERN int ZEXPORT deflatePrime(z_stream *strm, int bits, int value); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader(z_stream *strm, gz_headerp head); +Z_EXTERN int Z_EXPORT deflateSetHeader(z_stream *strm, gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -812,7 +812,7 @@ ZEXTERN int ZEXPORT deflateSetHeader(z_stream *strm, gz_headerp head); */ /* -ZEXTERN int ZEXPORT inflateInit2(z_stream *strm, int windowBits); +Z_EXTERN int Z_EXPORT inflateInit2(z_stream *strm, int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -865,7 +865,7 @@ ZEXTERN int ZEXPORT inflateInit2(z_stream *strm, int windowBits); deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary(z_stream *strm, const unsigned char *dictionary, unsigned int dictLength); +Z_EXTERN int Z_EXPORT inflateSetDictionary(z_stream *strm, const unsigned char *dictionary, unsigned int dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -886,7 +886,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary(z_stream *strm, const unsigned char *di inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary(z_stream *strm, unsigned char *dictionary, unsigned int *dictLength); +Z_EXTERN int Z_EXPORT inflateGetDictionary(z_stream *strm, unsigned char *dictionary, unsigned int *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -899,7 +899,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary(z_stream *strm, unsigned char *dictiona stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync(z_stream *strm); +Z_EXTERN int Z_EXPORT inflateSync(z_stream *strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -918,7 +918,7 @@ ZEXTERN int ZEXPORT inflateSync(z_stream *strm); input each time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy(z_stream *dest, z_stream *source); +Z_EXTERN int Z_EXPORT inflateCopy(z_stream *dest, z_stream *source); /* Sets the destination stream as a complete copy of the source stream. @@ -933,7 +933,7 @@ ZEXTERN int ZEXPORT inflateCopy(z_stream *dest, z_stream *source); destination. */ -ZEXTERN int ZEXPORT inflateReset(z_stream *strm); +Z_EXTERN int Z_EXPORT inflateReset(z_stream *strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The @@ -943,7 +943,7 @@ ZEXTERN int ZEXPORT inflateReset(z_stream *strm); stream state was inconsistent (such as zalloc or state being NULL). */ -ZEXTERN int ZEXPORT inflateReset2(z_stream *strm, int windowBits); +Z_EXTERN int Z_EXPORT inflateReset2(z_stream *strm, int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -956,7 +956,7 @@ ZEXTERN int ZEXPORT inflateReset2(z_stream *strm, int windowBits); the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime(z_stream *strm, int bits, int value); +Z_EXTERN int Z_EXPORT inflatePrime(z_stream *strm, int bits, int value); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the @@ -975,7 +975,7 @@ ZEXTERN int ZEXPORT inflatePrime(z_stream *strm, int bits, int value); stream state was inconsistent. */ -ZEXTERN long ZEXPORT inflateMark(z_stream *strm); +Z_EXTERN long Z_EXPORT inflateMark(z_stream *strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1003,7 +1003,7 @@ ZEXTERN long ZEXPORT inflateMark(z_stream *strm); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader(z_stream *strm, gz_headerp head); +Z_EXTERN int Z_EXPORT inflateGetHeader(z_stream *strm, gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1043,7 +1043,7 @@ ZEXTERN int ZEXPORT inflateGetHeader(z_stream *strm, gz_headerp head); */ /* -ZEXTERN int ZEXPORT inflateBackInit (z_stream *strm, int windowBits, unsigned char *window); +Z_EXTERN int Z_EXPORT inflateBackInit (z_stream *strm, int windowBits, unsigned char *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1063,10 +1063,10 @@ ZEXTERN int ZEXPORT inflateBackInit (z_stream *strm, int windowBits, unsigned ch the version of the header file. */ -typedef uint32_t (*in_func) (void *, const unsigned char * *); +typedef uint32_t (*in_func) (void *, z_const unsigned char * *); typedef int (*out_func) (void *, unsigned char *, uint32_t); -ZEXTERN int ZEXPORT inflateBack(z_stream *strm, in_func in, void *in_desc, out_func out, void *out_desc); +Z_EXTERN int Z_EXPORT inflateBack(z_stream *strm, in_func in, void *in_desc, out_func out, void *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1134,7 +1134,7 @@ ZEXTERN int ZEXPORT inflateBack(z_stream *strm, in_func in, void *in_desc, out_f cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd(z_stream *strm); +Z_EXTERN int Z_EXPORT inflateBackEnd(z_stream *strm); /* All memory allocated by inflateBackInit() is freed. @@ -1142,7 +1142,7 @@ ZEXTERN int ZEXPORT inflateBackEnd(z_stream *strm); state was inconsistent. */ -ZEXTERN unsigned long ZEXPORT zlibCompileFlags(void); +Z_EXTERN unsigned long Z_EXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1158,7 +1158,7 @@ ZEXTERN unsigned long ZEXPORT zlibCompileFlags(void); 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed + 12: BUILDFIXED -- build static block decoding tables when needed (not supported by zlib-ng) 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) @@ -1194,7 +1194,7 @@ ZEXTERN unsigned long ZEXPORT zlibCompileFlags(void); you need special options. */ -ZEXTERN int ZEXPORT compress(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen); +Z_EXTERN int Z_EXPORT compress(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1208,7 +1208,7 @@ ZEXTERN int ZEXPORT compress(unsigned char *dest, unsigned long *destLen, const buffer. */ -ZEXTERN int ZEXPORT compress2(unsigned char *dest, unsigned long *destLen, const unsigned char *source, +Z_EXTERN int Z_EXPORT compress2(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen, int level); /* Compresses the source buffer into the destination buffer. The level @@ -1223,14 +1223,14 @@ ZEXTERN int ZEXPORT compress2(unsigned char *dest, unsigned long *destLen, const Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN unsigned long ZEXPORT compressBound(unsigned long sourceLen); +Z_EXTERN unsigned long Z_EXPORT compressBound(unsigned long sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen); +Z_EXTERN int Z_EXPORT uncompress(unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1248,7 +1248,7 @@ ZEXTERN int ZEXPORT uncompress(unsigned char *dest, unsigned long *destLen, cons */ -ZEXTERN int ZEXPORT uncompress2 (unsigned char *dest, unsigned long *destLen, +Z_EXTERN int Z_EXPORT uncompress2 (unsigned char *dest, unsigned long *destLen, const unsigned char *source, unsigned long *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the @@ -1269,7 +1269,7 @@ ZEXTERN int ZEXPORT uncompress2 (unsigned char *dest, unsigned long *des typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); +Z_EXTERN gzFile Z_EXPORT gzopen(const char *path, const char *mode); Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or @@ -1306,7 +1306,7 @@ ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); file could not be opened. */ -ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); +Z_EXTERN gzFile Z_EXPORT gzdopen(int fd, const char *mode); /* gzdopen associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file @@ -1329,7 +1329,7 @@ ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); +Z_EXTERN int Z_EXPORT gzbuffer(gzFile file, unsigned size); /* Set the internal buffer size used by this library's functions. The default buffer size is 8192 bytes. This function must be called after @@ -1345,7 +1345,7 @@ ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); too late. */ -ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); +Z_EXTERN int Z_EXPORT gzsetparams(gzFile file, int level, int strategy); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. Previously provided @@ -1356,7 +1356,7 @@ ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread(gzFile file, void *buf, unsigned len); +Z_EXTERN int Z_EXPORT gzread(gzFile file, void *buf, unsigned len); /* Reads the given number of uncompressed bytes from the compressed file. If the input file is not in gzip format, gzread copies the given number of @@ -1386,7 +1386,7 @@ ZEXTERN int ZEXPORT gzread(gzFile file, void *buf, unsigned len); Z_STREAM_ERROR. */ -ZEXTERN size_t ZEXPORT gzfread (void *buf, size_t size, size_t nitems, gzFile file); +Z_EXTERN size_t Z_EXPORT gzfread (void *buf, size_t size, size_t nitems, gzFile file); /* Read up to nitems items of size size from file to buf, otherwise operating as gzread() does. This duplicates the interface of stdio's fread(), with @@ -1409,14 +1409,14 @@ ZEXTERN size_t ZEXPORT gzfread (void *buf, size_t size, size_t nitems, gzFile fi file, reseting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite(gzFile file, void const *buf, unsigned len); +Z_EXTERN int Z_EXPORT gzwrite(gzFile file, void const *buf, unsigned len); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ -ZEXTERN size_t ZEXPORT gzfwrite(void const *buf, size_t size, size_t nitems, gzFile file); +Z_EXTERN size_t Z_EXPORT gzfwrite(void const *buf, size_t size, size_t nitems, gzFile file); /* gzfwrite() writes nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. @@ -1427,7 +1427,7 @@ ZEXTERN size_t ZEXPORT gzfwrite(void const *buf, size_t size, size_t nitems, gzF is returned, and the error state is set to Z_STREAM_ERROR. */ -ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); +Z_EXTERN int Z_EXPORTVA gzprintf(gzFile file, const char *format, ...); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of @@ -1442,7 +1442,7 @@ ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); This can be determined using zlibCompileFlags(). */ -ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); +Z_EXTERN int Z_EXPORT gzputs(gzFile file, const char *s); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. @@ -1450,7 +1450,7 @@ ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); gzputs returns the number of characters written, or -1 in case of error. */ -ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); +Z_EXTERN char * Z_EXPORT gzgets(gzFile file, char *buf, int len); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file @@ -1463,13 +1463,13 @@ ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc(gzFile file, int c); +Z_EXTERN int Z_EXPORT gzputc(gzFile file, int c); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc(gzFile file); +Z_EXTERN int Z_EXPORT gzgetc(gzFile file); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. @@ -1478,7 +1478,7 @@ ZEXTERN int ZEXPORT gzgetc(gzFile file); points to has been clobbered or not. */ -ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); +Z_EXTERN int Z_EXPORT gzungetc(int c, gzFile file); /* Push one character back onto the stream to be read as the first character on the next read. At least one character of push-back is allowed. @@ -1490,7 +1490,7 @@ ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); +Z_EXTERN int Z_EXPORT gzflush(gzFile file, int flush); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number @@ -1506,7 +1506,7 @@ ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); */ /* -ZEXTERN z_off_t ZEXPORT gzseek (gzFile file, z_off_t offset, int whence); +Z_EXTERN z_off_t Z_EXPORT gzseek (gzFile file, z_off_t offset, int whence); Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the @@ -1524,7 +1524,7 @@ ZEXTERN z_off_t ZEXPORT gzseek (gzFile file, z_off_t offset, int whence); would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind(gzFile file); +Z_EXTERN int Z_EXPORT gzrewind(gzFile file); /* Rewinds the given file. This function is supported only for reading. @@ -1532,7 +1532,7 @@ ZEXTERN int ZEXPORT gzrewind(gzFile file); */ /* -ZEXTERN z_off_t ZEXPORT gztell(gzFile file); +Z_EXTERN z_off_t Z_EXPORT gztell(gzFile file); Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the @@ -1543,7 +1543,7 @@ ZEXTERN z_off_t ZEXPORT gztell(gzFile file); */ /* -ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); +Z_EXTERN z_off_t Z_EXPORT gzoffset(gzFile file); Returns the current offset in the file being read or written. This offset includes the count of bytes that precede the gzip stream, for example when @@ -1552,7 +1552,7 @@ ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof(gzFile file); +Z_EXTERN int Z_EXPORT gzeof(gzFile file); /* Returns true (1) if the end-of-file indicator has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set only if the @@ -1567,7 +1567,7 @@ ZEXTERN int ZEXPORT gzeof(gzFile file); has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect(gzFile file); +Z_EXTERN int Z_EXPORT gzdirect(gzFile file); /* Returns true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. @@ -1588,7 +1588,7 @@ ZEXTERN int ZEXPORT gzdirect(gzFile file); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose(gzFile file); +Z_EXTERN int Z_EXPORT gzclose(gzFile file); /* Flushes all pending output if necessary, closes the compressed file and deallocates the (de)compression state. Note that once file is closed, you @@ -1601,8 +1601,8 @@ ZEXTERN int ZEXPORT gzclose(gzFile file); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r(gzFile file); -ZEXTERN int ZEXPORT gzclose_w(gzFile file); +Z_EXTERN int Z_EXPORT gzclose_r(gzFile file); +Z_EXTERN int Z_EXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1613,7 +1613,7 @@ ZEXTERN int ZEXPORT gzclose_w(gzFile file); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); +Z_EXTERN const char * Z_EXPORT gzerror(gzFile file, int *errnum); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred @@ -1629,7 +1629,7 @@ ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr(gzFile file); +Z_EXTERN void Z_EXPORT gzclearerr(gzFile file); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip @@ -1645,7 +1645,7 @@ ZEXTERN void ZEXPORT gzclearerr(gzFile file); library. */ -ZEXTERN uint32_t ZEXPORT adler32(uint32_t adler, const unsigned char *buf, uint32_t len); +Z_EXTERN unsigned long Z_EXPORT adler32(unsigned long adler, const unsigned char *buf, unsigned int len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the @@ -1664,13 +1664,13 @@ ZEXTERN uint32_t ZEXPORT adler32(uint32_t adler, const unsigned char *buf, uint3 if (adler != original_adler) error(); */ -ZEXTERN uint32_t ZEXPORT adler32_z (uint32_t adler, const unsigned char *buf, size_t len); +Z_EXTERN unsigned long Z_EXPORT adler32_z(unsigned long adler, const unsigned char *buf, size_t len); /* Same as adler32(), but with a size_t length. */ /* -ZEXTERN uint32_t ZEXPORT adler32_combine(uint32_t adler1, uint32_t adler2, z_off_t len2); +Z_EXTERN unsigned long Z_EXPORT adler32_combine(unsigned long adler1, unsigned long adler2, z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1680,7 +1680,7 @@ ZEXTERN uint32_t ZEXPORT adler32_combine(uint32_t adler1, uint32_t adler2, z_off negative, the result has no meaning or utility. */ -ZEXTERN uint32_t ZEXPORT crc32(uint32_t crc, const unsigned char *buf, uint32_t len); +Z_EXTERN unsigned long Z_EXPORT crc32(unsigned long crc, const unsigned char *buf, unsigned int len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is NULL, this function returns the required @@ -1697,13 +1697,13 @@ ZEXTERN uint32_t ZEXPORT crc32(uint32_t crc, const unsigned char *buf, uint32_t if (crc != original_crc) error(); */ -ZEXTERN uint32_t ZEXPORT crc32_z (uint32_t crc, const unsigned char *buf, size_t len); +Z_EXTERN unsigned long Z_EXPORT crc32_z(unsigned long crc, const unsigned char *buf, size_t len); /* Same as crc32(), but with a size_t length. */ /* -ZEXTERN uint32_t ZEXPORT crc32_combine(uint32_t crc1, uint32_t crc2, z_off64_t len2); +Z_EXTERN unsigned long Z_EXPORT crc32_combine(unsigned long crc1, unsigned long crc2, z_off64_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were @@ -1713,14 +1713,14 @@ ZEXTERN uint32_t ZEXPORT crc32_combine(uint32_t crc1, uint32_t crc2, z_off64_t l */ /* -ZEXTERN void ZEXPORT crc32_combine_gen(uint32_t op[32], z_off_t len2); +Z_EXTERN void Z_EXPORT crc32_combine_gen(uint32_t op[32], z_off_t len2); Generate the operator op corresponding to length len2, to be used with crc32_combine_op(). op must have room for 32 z_crc_t values. (32 is the number of bits in the CRC.) */ -ZEXTERN uint32_t ZEXPORT crc32_combine_op(uint32_t crc1, uint32_t crc2, +Z_EXTERN uint32_t Z_EXPORT crc32_combine_op(uint32_t crc1, uint32_t crc2, const uint32_t *op); /* Give the same result as crc32_combine(), using op in place of len2. op is @@ -1734,12 +1734,12 @@ ZEXTERN uint32_t ZEXPORT crc32_combine_op(uint32_t crc1, uint32_t crc2, /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_(z_stream *strm, int level, const char *version, int stream_size); -ZEXTERN int ZEXPORT inflateInit_(z_stream *strm, const char *version, int stream_size); -ZEXTERN int ZEXPORT deflateInit2_(z_stream *strm, int level, int method, int windowBits, int memLevel, +Z_EXTERN int Z_EXPORT deflateInit_(z_stream *strm, int level, const char *version, int stream_size); +Z_EXTERN int Z_EXPORT inflateInit_(z_stream *strm, const char *version, int stream_size); +Z_EXTERN int Z_EXPORT deflateInit2_(z_stream *strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size); -ZEXTERN int ZEXPORT inflateInit2_(z_stream *strm, int windowBits, const char *version, int stream_size); -ZEXTERN int ZEXPORT inflateBackInit_(z_stream *strm, int windowBits, unsigned char *window, +Z_EXTERN int Z_EXPORT inflateInit2_(z_stream *strm, int windowBits, const char *version, int stream_size); +Z_EXTERN int Z_EXPORT inflateBackInit_(z_stream *strm, int windowBits, unsigned char *window, const char *version, int stream_size); #define deflateInit(strm, level) deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) #define inflateInit(strm) inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1763,7 +1763,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ +Z_EXTERN int Z_EXPORT gzgetc_(gzFile file); /* backward compatibility */ # define gzgetc(g) ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or @@ -1773,10 +1773,13 @@ ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); - ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); - ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); - ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + Z_EXTERN gzFile Z_EXPORT gzopen64(const char *, const char *); + Z_EXTERN z_off64_t Z_EXPORT gzseek64(gzFile, z_off64_t, int); + Z_EXTERN z_off64_t Z_EXPORT gztell64(gzFile); + Z_EXTERN z_off64_t Z_EXPORT gzoffset64(gzFile); + Z_EXTERN unsigned long Z_EXPORT adler32_combine64(unsigned long, unsigned long, z_off64_t); + Z_EXTERN unsigned long Z_EXPORT crc32_combine64(unsigned long, unsigned long, z_off64_t); + Z_EXTERN void Z_EXPORT crc32_combine_gen64(uint32_t *op, z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1784,62 +1787,42 @@ ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ # define gzseek gzseek64 # define gztell gztell64 # define gzoffset gzoffset64 -# ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); - ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); - ZEXTERN z_off_t ZEXPORT gztell64(gzFile); - ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); -# endif -#else - ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); - ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); - ZEXTERN z_off_t ZEXPORT gztell(gzFile); - ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); -#endif - - -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 - ZEXTERN uint32_t ZEXPORT adler32_combine64(uint32_t, uint32_t, z_off64_t); - ZEXTERN uint32_t ZEXPORT crc32_combine64(uint32_t, uint32_t, z_off64_t); - ZEXTERN void ZEXPORT crc32_combine_gen64(uint32_t *op, z_off64_t); -#endif - -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 # define crc32_combine_gen crc32_combine_gen64 # ifndef Z_LARGE64 - ZEXTERN uint32_t ZEXPORT adler32_combine64(uint32_t, uint32_t, z_off_t); - ZEXTERN uint32_t ZEXPORT crc32_combine64(uint32_t, uint32_t, z_off_t); - ZEXTERN void ZEXPORT crc32_combine_gen64(uint32_t *op, z_off64_t); + Z_EXTERN gzFile Z_EXPORT gzopen64(const char *, const char *); + Z_EXTERN z_off_t Z_EXPORT gzseek64(gzFile, z_off_t, int); + Z_EXTERN z_off_t Z_EXPORT gztell64(gzFile); + Z_EXTERN z_off_t Z_EXPORT gzoffset64(gzFile); + Z_EXTERN unsigned long Z_EXPORT adler32_combine64(unsigned long, unsigned long, z_off_t); + Z_EXTERN unsigned long Z_EXPORT crc32_combine64(unsigned long, unsigned long, z_off_t); + Z_EXTERN void Z_EXPORT crc32_combine_gen64(uint32_t *op, z_off64_t); # endif #else - ZEXTERN uint32_t ZEXPORT adler32_combine(uint32_t, uint32_t, z_off_t); - ZEXTERN uint32_t ZEXPORT crc32_combine(uint32_t, uint32_t, z_off_t); - ZEXTERN void ZEXPORT crc32_combine_gen(uint32_t *op, z_off_t); + Z_EXTERN gzFile Z_EXPORT gzopen(const char *, const char *); + Z_EXTERN z_off_t Z_EXPORT gzseek(gzFile, z_off_t, int); + Z_EXTERN z_off_t Z_EXPORT gztell(gzFile); + Z_EXTERN z_off_t Z_EXPORT gzoffset(gzFile); + Z_EXTERN unsigned long Z_EXPORT adler32_combine(unsigned long, unsigned long, z_off_t); + Z_EXTERN unsigned long Z_EXPORT crc32_combine(unsigned long, unsigned long, z_off_t); + Z_EXTERN void Z_EXPORT crc32_combine_gen(uint32_t *op, z_off_t); #endif - /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError (int); -ZEXTERN int ZEXPORT inflateSyncPoint (z_stream *); -ZEXTERN const uint32_t * ZEXPORT get_crc_table (void); -ZEXTERN int ZEXPORT inflateUndermine (z_stream *, int); -ZEXTERN int ZEXPORT inflateValidate (z_stream *, int); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed (z_stream *); -ZEXTERN int ZEXPORT inflateResetKeep (z_stream *); -ZEXTERN int ZEXPORT deflateResetKeep (z_stream *); +Z_EXTERN const char * Z_EXPORT zError (int); +Z_EXTERN int Z_EXPORT inflateSyncPoint (z_stream *); +Z_EXTERN const uint32_t * Z_EXPORT get_crc_table (void); +Z_EXTERN int Z_EXPORT inflateUndermine (z_stream *, int); +Z_EXTERN int Z_EXPORT inflateValidate (z_stream *, int); +Z_EXTERN unsigned long Z_EXPORT inflateCodesUsed (z_stream *); +Z_EXTERN int Z_EXPORT inflateResetKeep (z_stream *); +Z_EXTERN int Z_EXPORT deflateResetKeep (z_stream *); -#if (defined(WIN32) || defined(__MINGW__)) - ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode); +#if defined(_WIN32) + Z_EXTERN gzFile Z_EXPORT gzopen_w(const wchar_t *path, const char *mode); #endif -ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va); +Z_EXTERN int Z_EXPORTVA gzvprintf(gzFile file, const char *format, va_list va); #ifdef __cplusplus } diff --git a/libs/zlibng/zlib.map b/libs/zlibng/zlib.map index 28436d47e..f608f2bd5 100644 --- a/libs/zlibng/zlib.map +++ b/libs/zlibng/zlib.map @@ -91,6 +91,10 @@ ZLIB_1.2.9 { deflateGetDictionary; adler32_z; crc32_z; - crc32_combine_gen; - crc32_combine_op; } ZLIB_1.2.7.1; + +ZLIB_1.2.12 { + crc32_combine_gen; + crc32_combine_gen64; + crc32_combine_op; +} ZLIB_1.2.9; diff --git a/libs/zlibng/zlib.pc.cmakein b/libs/zlibng/zlib.pc.cmakein index 0635b6e35..9b64252dc 100644 --- a/libs/zlibng/zlib.pc.cmakein +++ b/libs/zlibng/zlib.pc.cmakein @@ -1,12 +1,12 @@ prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@ -libdir=@INSTALL_LIB_DIR@ -sharedlibdir=@INSTALL_LIB_DIR@ -includedir=@INSTALL_INC_DIR@ +exec_prefix=${prefix} +libdir=@PC_LIB_INSTALL_DIR@ +sharedlibdir=${libdir} +includedir=@PC_INC_INSTALL_DIR@ Name: zlib@SUFFIX@ Description: zlib-ng compression library -Version: @zlib_VERSION@ +Version: @ZLIB_FULL_VERSION@ Requires: Libs: -L${libdir} -L${sharedlibdir} -lz@SUFFIX@ diff --git a/libs/zlibng/zutil.c b/libs/zlibng/zutil.c index 4373586bd..ba36e93f9 100644 --- a/libs/zlibng/zutil.c +++ b/libs/zlibng/zutil.c @@ -3,47 +3,37 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id$ */ - #include "zbuild.h" #include "zutil.h" -#ifdef WITH_GZFILEOP -# include "gzguts.h" -#endif -#ifndef UNALIGNED_OK -# include "malloc.h" -#endif +#include "zutil_p.h" -const char * const z_errmsg[10] = { - (const char *)"need dictionary", /* Z_NEED_DICT 2 */ - (const char *)"stream end", /* Z_STREAM_END 1 */ - (const char *)"", /* Z_OK 0 */ - (const char *)"file error", /* Z_ERRNO (-1) */ - (const char *)"stream error", /* Z_STREAM_ERROR (-2) */ - (const char *)"data error", /* Z_DATA_ERROR (-3) */ - (const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ - (const char *)"buffer error", /* Z_BUF_ERROR (-5) */ - (const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ - (const char *)"" +z_const char * const PREFIX(z_errmsg)[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" }; const char zlibng_string[] = - " zlib-ng 1.9.9 forked from zlib 1.2.11 "; + " zlib-ng 2.0.0-RC2 forked from zlib"; #ifdef ZLIB_COMPAT -const char * ZEXPORT zlibVersion(void) -{ +const char * Z_EXPORT zlibVersion(void) { return ZLIB_VERSION; } #endif -const char * ZEXPORT zlibng_version(void) -{ +const char * Z_EXPORT zlibng_version(void) { return ZLIBNG_VERSION; } -unsigned long ZEXPORT PREFIX(zlibCompileFlags)(void) -{ +unsigned long Z_EXPORT PREFIX(zlibCompileFlags)(void) { unsigned long flags; flags = 0; @@ -77,12 +67,7 @@ unsigned long ZEXPORT PREFIX(zlibCompileFlags)(void) #ifdef ZLIB_WINAPI flags += 1 << 10; #endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif + /* Bit 13 reserved for DYNAMIC_CRC_TABLE */ #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif @@ -96,15 +81,13 @@ unsigned long ZEXPORT PREFIX(zlibCompileFlags)(void) } #ifdef ZLIB_DEBUG -#include +# include # ifndef verbose # define verbose 0 # endif -int ZLIB_INTERNAL z_verbose = verbose; +int Z_INTERNAL z_verbose = verbose; -void ZLIB_INTERNAL z_error (m) - char *m; -{ +void Z_INTERNAL z_error(char *m) { fprintf(stderr, "%s\n", m); exit(1); } @@ -113,28 +96,16 @@ void ZLIB_INTERNAL z_error (m) /* exported to allow conversion of error code to string for compress() and * uncompress() */ -const char * ZEXPORT PREFIX(zError)(int err) -{ +const char * Z_EXPORT PREFIX(zError)(int err) { return ERR_MSG(err); } -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -void ZLIB_INTERNAL *zcalloc (void *opaque, unsigned items, unsigned size) -{ +void Z_INTERNAL *zng_calloc(void *opaque, unsigned items, unsigned size) { (void)opaque; -#ifndef UNALIGNED_OK - return memalign(16, items * size); -#else - return sizeof(unsigned int) > 2 ? (void *)malloc(items * size) : - (void *)calloc(items, size); -#endif + return zng_alloc((size_t)items * (size_t)size); } -void ZLIB_INTERNAL zcfree (void *opaque, void *ptr) -{ +void Z_INTERNAL zng_cfree(void *opaque, void *ptr) { (void)opaque; - free(ptr); + zng_free(ptr); } - -#endif /* MY_ZCALLOC */ diff --git a/libs/zlibng/zutil.h b/libs/zlibng/zutil.h index 8d8ae92ee..497cb22b4 100644 --- a/libs/zlibng/zutil.h +++ b/libs/zlibng/zutil.h @@ -10,14 +10,22 @@ subject to change. Applications should only use zlib.h. */ -/* @(#) $Id$ */ - -#if defined(HAVE_INTERNAL) -# define ZLIB_INTERNAL __attribute__((visibility ("internal"))) -#elif defined(HAVE_HIDDEN) -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#if defined(HAVE_VISIBILITY_INTERNAL) +# define Z_INTERNAL __attribute__((visibility ("internal"))) +#elif defined(HAVE_VISIBILITY_HIDDEN) +# define Z_INTERNAL __attribute__((visibility ("hidden"))) #else -# define ZLIB_INTERNAL +# define Z_INTERNAL +#endif + +#ifndef __cplusplus +# define Z_REGISTER register +#else +# define Z_REGISTER +#endif + +#ifndef Z_TLS +# define Z_TLS #endif #include @@ -25,19 +33,20 @@ #include #include #ifdef ZLIB_COMPAT -# include "zlib.h" +# include "zlib.h" #else -# include "zlib-ng.h" +# include "zlib-ng.h" #endif +#include "zbuild.h" typedef unsigned char uch; /* Included for compatibility with external code only */ typedef uint16_t ush; /* Included for compatibility with external code only */ -typedef unsigned long ulg; +typedef unsigned long ulg; -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +extern z_const char * const PREFIX(z_errmsg)[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +#define ERR_MSG(err) PREFIX(z_errmsg)[Z_NEED_DICT-(err)] #define ERR_RETURN(strm, err) return (strm->msg = ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ @@ -67,6 +76,8 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ +#define ADLER32_INITIAL_VALUE 1 /* initial adler-32 hash value */ + /* target dependencies */ #ifdef AMIGA @@ -89,9 +100,6 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #ifdef OS2 # define OS_CODE 6 -# if defined(M_I86) && !defined(Z_SOLO) -# include -# endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) @@ -102,7 +110,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define OS_CODE 13 #endif -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) # define OS_CODE 10 #endif @@ -114,16 +122,9 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define fdopen(fd, type) _fdopen(fd, type) #endif -/* provide prototypes for these when building zlib without LFS */ -#if !defined(WIN32) && !defined(__MSYS__) && (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) -# include "zbuild.h" /* For PREFIX() */ - ZEXTERN uint32_t ZEXPORT PREFIX(adler32_combine64)(uint32_t, uint32_t, z_off_t); - ZEXTERN uint32_t ZEXPORT PREFIX(crc32_combine64)(uint32_t, uint32_t, z_off_t); -#endif - /* MS Visual Studio does not allow inline in C, only C++. But it provides __inline instead, so use that. */ -#if defined(_MSC_VER) && !defined(inline) +#if defined(_MSC_VER) && !defined(inline) && !defined(__cplusplus) # define inline __inline #endif @@ -131,51 +132,47 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #ifndef OS_CODE # define OS_CODE 3 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ /* Diagnostic functions */ #ifdef ZLIB_DEBUG -# include - extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error(char *m); -# define Assert(cond, msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose >= 0) fprintf x;} -# define Tracev(x) {if (z_verbose > 0) fprintf x;} -# define Tracevv(x) {if (z_verbose > 1) fprintf x;} -# define Tracec(c, x) {if (z_verbose > 0 && (c)) fprintf x;} -# define Tracecv(c, x) {if (z_verbose > 1 && (c)) fprintf x;} +# include + extern int Z_INTERNAL z_verbose; + extern void Z_INTERNAL z_error(char *m); +# define Assert(cond, msg) {if (!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose >= 0) fprintf x;} +# define Tracev(x) {if (z_verbose > 0) fprintf x;} +# define Tracevv(x) {if (z_verbose > 1) fprintf x;} +# define Tracec(c, x) {if (z_verbose > 0 && (c)) fprintf x;} +# define Tracecv(c, x) {if (z_verbose > 1 && (c)) fprintf x;} #else -# define Assert(cond, msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c, x) -# define Tracecv(c, x) +# define Assert(cond, msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c, x) +# define Tracecv(c, x) #endif -void ZLIB_INTERNAL *zcalloc(void *opaque, unsigned items, unsigned size); -void ZLIB_INTERNAL zcfree(void *opaque, void *ptr); +void Z_INTERNAL *zng_calloc(void *opaque, unsigned items, unsigned size); +void Z_INTERNAL zng_cfree(void *opaque, void *ptr); #define ZALLOC(strm, items, size) (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (void *)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} /* Reverse the bytes in a value. Use compiler intrinsics when possible to take advantage of hardware implementations. */ -#if defined(WIN32) && (_MSC_VER >= 1300) +#if defined(_MSC_VER) && (_MSC_VER >= 1300) # pragma intrinsic(_byteswap_ulong) # define ZSWAP16(q) _byteswap_ushort(q) # define ZSWAP32(q) _byteswap_ulong(q) # define ZSWAP64(q) _byteswap_uint64(q) #elif defined(__Clang__) || (defined(__GNUC__) && \ - (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))) + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) # define ZSWAP16(q) __builtin_bswap16(q) # define ZSWAP32(q) __builtin_bswap32(q) # define ZSWAP64(q) __builtin_bswap64(q) @@ -201,7 +198,7 @@ void ZLIB_INTERNAL zcfree(void *opaque, void *ptr); #else # define ZSWAP16(q) ((((q) & 0xff) << 8) | (((q) & 0xff00) >> 8)) # define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) # define ZSWAP64(q) \ ((q & 0xFF00000000000000u) >> 56u) | \ ((q & 0x00FF000000000000u) >> 40u) | \ @@ -215,33 +212,43 @@ void ZLIB_INTERNAL zcfree(void *opaque, void *ptr); /* Only enable likely/unlikely if the compiler is known to support it */ #if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__INTEL_COMPILER) || defined(__Clang__) -# ifndef likely -# define likely(x) __builtin_expect(!!(x), 1) -# endif -# ifndef unlikely -# define unlikely(x) __builtin_expect(!!(x), 0) -# endif +# define LIKELY_NULL(x) __builtin_expect((x) != 0, 0) +# define LIKELY(x) __builtin_expect(!!(x), 1) +# define UNLIKELY(x) __builtin_expect(!!(x), 0) +# define PREFETCH_L1(addr) __builtin_prefetch(addr, 0, 3) +# define PREFETCH_L2(addr) __builtin_prefetch(addr, 0, 2) +# define PREFETCH_RW(addr) __builtin_prefetch(addr, 1, 2) +#elif defined(__WIN__) +# include +# define LIKELY_NULL(x) x +# define LIKELY(x) x +# define UNLIKELY(x) x +# define PREFETCH_L1(addr) _mm_prefetch((char *) addr, _MM_HINT_T0) +# define PREFETCH_L2(addr) _mm_prefetch((char *) addr, _MM_HINT_T1) +# define PREFETCH_RW(addr) _mm_prefetch((char *) addr, _MM_HINT_T1) #else -# ifndef likely -# define likely(x) x -# endif -# ifndef unlikely -# define unlikely(x) x -# endif +# define LIKELY_NULL(x) x +# define LIKELY(x) x +# define UNLIKELY(x) x +# define PREFETCH_L1(addr) addr +# define PREFETCH_L2(addr) addr +# define PREFETCH_RW(addr) addr #endif /* (un)likely */ #if defined(_MSC_VER) -#define ALIGNED_(x) __declspec(align(x)) +# define ALIGNED_(x) __declspec(align(x)) #else -#if defined(__GNUC__) -#define ALIGNED_(x) __attribute__ ((aligned(x))) -#endif +# if defined(__GNUC__) +# define ALIGNED_(x) __attribute__ ((aligned(x))) +# endif #endif -#if defined(X86_CPUID) -# include "arch/x86/x86.h" -#elif defined(__aarch64__) || defined(__arm__) || defined(_M_ARM) -# include "arch/arm/arm.h" +#if defined(X86_FEATURES) +# include "arch/x86/x86.h" +#elif defined(ARM_FEATURES) +# include "arch/arm/arm.h" +#elif defined(POWER_FEATURES) +# include "arch/power/power.h" #endif #endif /* ZUTIL_H_ */ diff --git a/libs/zlibng/zutil_p.h b/libs/zlibng/zutil_p.h new file mode 100644 index 000000000..a5f2e525d --- /dev/null +++ b/libs/zlibng/zutil_p.h @@ -0,0 +1,34 @@ +/* zutil_p.h -- Private inline functions used internally in zlib-ng + * + */ + +#ifndef ZUTIL_P_H +#define ZUTIL_P_H + +#ifdef __APPLE__ +# include +#else +# include +#endif + +/* Function to allocate 16 or 64-byte aligned memory */ +static inline void *zng_alloc(size_t size) { +#if defined(_WIN32) + return (void *)_aligned_malloc(size, 64); +#elif defined(__APPLE__) + return (void *)malloc(size); /* MacOS always aligns to 16 bytes */ +#else + return (void *)memalign(64, size); +#endif +} + +/* Function that can free aligned memory */ +static inline void zng_free(void *ptr) { +#if defined(_WIN32) + _aligned_free(ptr); +#else + free(ptr); +#endif +} + +#endif diff --git a/loginserver/client.h b/loginserver/client.h index b8f092db3..9d76e7e78 100644 --- a/loginserver/client.h +++ b/loginserver/client.h @@ -195,7 +195,7 @@ public: void CreateEQEmuAccount(const std::string &in_account_name, const std::string &in_account_password, unsigned int loginserver_account_id); private: - EQEmu::Random random; + EQ::Random random; std::shared_ptr connection; LSClientVersion version; LSClientStatus status; diff --git a/loginserver/server_manager.cpp b/loginserver/server_manager.cpp index 5cd01a8f9..1761e1b15 100644 --- a/loginserver/server_manager.cpp +++ b/loginserver/server_manager.cpp @@ -33,7 +33,7 @@ ServerManager::ServerManager() { int listen_port = server.config.GetVariableInt("general", "listen_port", 5998); - server_connection.reset(new EQ::Net::ServertalkServer()); + server_connection = std::make_unique(); EQ::Net::ServertalkServerOptions opts; opts.port = listen_port; opts.ipv6 = false; @@ -68,7 +68,7 @@ ServerManager::ServerManager() ++iter; } - world_servers.push_back(std::unique_ptr(new WorldServer(world_connection))); + world_servers.push_back(std::make_unique(world_connection)); } ); diff --git a/loginserver/world_server.cpp b/loginserver/world_server.cpp index 765c108da..43846af32 100644 --- a/loginserver/world_server.cpp +++ b/loginserver/world_server.cpp @@ -72,7 +72,7 @@ WorldServer::WorldServer(std::shared_ptr wo std::bind(&WorldServer::ProcessLSAccountUpdate, this, std::placeholders::_1, std::placeholders::_2) ); - m_keepalive.reset(new EQ::Timer(5000, true, std::bind(&WorldServer::OnKeepAlive, this, std::placeholders::_1))); + m_keepalive = std::make_unique(5000, true, std::bind(&WorldServer::OnKeepAlive, this, std::placeholders::_1)); } WorldServer::~WorldServer() = default; @@ -1317,4 +1317,4 @@ void WorldServer::OnKeepAlive(EQ::Timer *t) { ServerPacket pack(ServerOP_KeepAlive, 0); connection->SendPacket(&pack); -} \ No newline at end of file +} diff --git a/queryserv/worldserver.cpp b/queryserv/worldserver.cpp index ec34ce7bb..1c65b92fd 100644 --- a/queryserv/worldserver.cpp +++ b/queryserv/worldserver.cpp @@ -52,7 +52,7 @@ WorldServer::~WorldServer() void WorldServer::Connect() { - m_connection.reset(new EQ::Net::ServertalkClient(Config->WorldIP, Config->WorldTCPPort, false, "QueryServ", Config->SharedKey)); + m_connection = std::make_unique(Config->WorldIP, Config->WorldTCPPort, false, "QueryServ", Config->SharedKey); m_connection->OnMessage(std::bind(&WorldServer::HandleMessage, this, std::placeholders::_1, std::placeholders::_2)); } @@ -185,4 +185,4 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } } -} \ No newline at end of file +} diff --git a/shared_memory/base_data.cpp b/shared_memory/base_data.cpp index 557d13ce5..f65780886 100644 --- a/shared_memory/base_data.cpp +++ b/shared_memory/base_data.cpp @@ -24,7 +24,7 @@ #include "../common/eqemu_exception.h" void LoadBaseData(SharedDatabase *database, const std::string &prefix) { - EQEmu::IPCMutex mutex("base_data"); + EQ::IPCMutex mutex("base_data"); mutex.Lock(); int records = (database->GetMaxBaseDataLevel() + 1); if(records == 0) { @@ -35,7 +35,7 @@ void LoadBaseData(SharedDatabase *database, const std::string &prefix) { auto Config = EQEmuConfig::get(); std::string file_name = Config->SharedMemDir + prefix + std::string("base_data"); - EQEmu::MemoryMappedFile mmf(file_name, size); + EQ::MemoryMappedFile mmf(file_name, size); mmf.ZeroFile(); void *ptr = mmf.Get(); diff --git a/shared_memory/items.cpp b/shared_memory/items.cpp index 6923fea3d..b1052730c 100644 --- a/shared_memory/items.cpp +++ b/shared_memory/items.cpp @@ -25,7 +25,7 @@ #include "../common/item_data.h" void LoadItems(SharedDatabase *database, const std::string &prefix) { - EQEmu::IPCMutex mutex("items"); + EQ::IPCMutex mutex("items"); mutex.Lock(); int32 items = -1; @@ -35,11 +35,11 @@ void LoadItems(SharedDatabase *database, const std::string &prefix) { EQ_EXCEPT("Shared Memory", "Unable to get any items from the database."); } - uint32 size = static_cast(EQEmu::FixedMemoryHashSet::estimated_size(items, max_item)); + uint32 size = static_cast(EQ::FixedMemoryHashSet::estimated_size(items, max_item)); auto Config = EQEmuConfig::get(); std::string file_name = Config->SharedMemDir + prefix + std::string("items"); - EQEmu::MemoryMappedFile mmf(file_name, size); + EQ::MemoryMappedFile mmf(file_name, size); mmf.ZeroFile(); void *ptr = mmf.Get(); diff --git a/shared_memory/loot.cpp b/shared_memory/loot.cpp index 742f373bf..a8ab94326 100644 --- a/shared_memory/loot.cpp +++ b/shared_memory/loot.cpp @@ -26,7 +26,7 @@ #include "../common/loottable.h" void LoadLoot(SharedDatabase *database, const std::string &prefix) { - EQEmu::IPCMutex mutex("loot"); + EQ::IPCMutex mutex("loot"); mutex.Lock(); uint32 loot_table_count, loot_table_max, loot_table_entries_count; @@ -48,15 +48,15 @@ void LoadLoot(SharedDatabase *database, const std::string &prefix) { std::string file_name_lt = Config->SharedMemDir + prefix + std::string("loot_table"); std::string file_name_ld = Config->SharedMemDir + prefix + std::string("loot_drop"); - EQEmu::MemoryMappedFile mmf_loot_table(file_name_lt, loot_table_size); - EQEmu::MemoryMappedFile mmf_loot_drop(file_name_ld, loot_drop_size); + EQ::MemoryMappedFile mmf_loot_table(file_name_lt, loot_table_size); + EQ::MemoryMappedFile mmf_loot_drop(file_name_ld, loot_drop_size); mmf_loot_table.ZeroFile(); mmf_loot_drop.ZeroFile(); - EQEmu::FixedMemoryVariableHashSet loot_table_hash(reinterpret_cast(mmf_loot_table.Get()), + EQ::FixedMemoryVariableHashSet loot_table_hash(reinterpret_cast(mmf_loot_table.Get()), loot_table_size, loot_table_max); - EQEmu::FixedMemoryVariableHashSet loot_drop_hash(reinterpret_cast(mmf_loot_drop.Get()), + EQ::FixedMemoryVariableHashSet loot_drop_hash(reinterpret_cast(mmf_loot_drop.Get()), loot_drop_size, loot_drop_max); database->LoadLootTables(mmf_loot_table.Get(), loot_table_max); diff --git a/shared_memory/main.cpp b/shared_memory/main.cpp index a515903e1..7cf54f946 100644 --- a/shared_memory/main.cpp +++ b/shared_memory/main.cpp @@ -33,8 +33,10 @@ #include "skill_caps.h" #include "spells.h" #include "base_data.h" +#include "../common/content/world_content_service.h" EQEmuLogSys LogSys; +WorldContentService content_service; #ifdef _WINDOWS #include @@ -139,6 +141,39 @@ int main(int argc, char **argv) } } + /** + * Rules: TODO: Remove later + */ + { + std::string tmp; + if (database.GetVariable("RuleSet", tmp)) { + LogInfo("Loading rule set [{}]", tmp.c_str()); + if (!RuleManager::Instance()->LoadRules(&database, tmp.c_str(), false)) { + LogError("Failed to load ruleset [{}], falling back to defaults", tmp.c_str()); + } + } + else { + if (!RuleManager::Instance()->LoadRules(&database, "default", false)) { + LogInfo("No rule set configured, using default rules"); + } + else { + LogInfo("Loaded default rule set 'default'"); + } + } + + EQ::InitializeDynamicLookups(); + LogInfo("Initialized dynamic dictionary entries"); + } + + + content_service.SetCurrentExpansion(RuleI(Expansion, CurrentExpansion)); + + LogInfo( + "Current expansion is [{}] ({})", + content_service.GetCurrentExpansion(), + content_service.GetCurrentExpansionName() + ); + std::string hotfix_name = ""; bool load_all = true; diff --git a/shared_memory/npc_faction.cpp b/shared_memory/npc_faction.cpp index 2c6ab0098..fb2d20ac4 100644 --- a/shared_memory/npc_faction.cpp +++ b/shared_memory/npc_faction.cpp @@ -25,18 +25,18 @@ #include "../common/faction.h" void LoadFactions(SharedDatabase *database, const std::string &prefix) { - EQEmu::IPCMutex mutex("faction"); + EQ::IPCMutex mutex("faction"); mutex.Lock(); uint32 lists = 0; uint32 max_list = 0; database->GetFactionListInfo(lists, max_list); - uint32 size = static_cast(EQEmu::FixedMemoryHashSet::estimated_size(lists, max_list)); + uint32 size = static_cast(EQ::FixedMemoryHashSet::estimated_size(lists, max_list)); auto Config = EQEmuConfig::get(); std::string file_name = Config->SharedMemDir + prefix + std::string("faction"); - EQEmu::MemoryMappedFile mmf(file_name, size); + EQ::MemoryMappedFile mmf(file_name, size); mmf.ZeroFile(); void *ptr = mmf.Get(); diff --git a/shared_memory/skill_caps.cpp b/shared_memory/skill_caps.cpp index 758ce6955..8f11e31dd 100644 --- a/shared_memory/skill_caps.cpp +++ b/shared_memory/skill_caps.cpp @@ -26,17 +26,17 @@ #include "../common/features.h" void LoadSkillCaps(SharedDatabase *database, const std::string &prefix) { - EQEmu::IPCMutex mutex("skill_caps"); + EQ::IPCMutex mutex("skill_caps"); mutex.Lock(); uint32 class_count = PLAYER_CLASS_COUNT; - uint32 skill_count = EQEmu::skills::HIGHEST_SKILL + 1; + uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; uint32 level_count = HARD_LEVEL_CAP + 1; uint32 size = (class_count * skill_count * level_count * sizeof(uint16)); auto Config = EQEmuConfig::get(); std::string file_name = Config->SharedMemDir + prefix + std::string("skill_caps"); - EQEmu::MemoryMappedFile mmf(file_name, size); + EQ::MemoryMappedFile mmf(file_name, size); mmf.ZeroFile(); void *ptr = mmf.Get(); diff --git a/shared_memory/spells.cpp b/shared_memory/spells.cpp index c653e26f5..0faf5d764 100644 --- a/shared_memory/spells.cpp +++ b/shared_memory/spells.cpp @@ -25,7 +25,7 @@ #include "../common/spdat.h" void LoadSpells(SharedDatabase *database, const std::string &prefix) { - EQEmu::IPCMutex mutex("spells"); + EQ::IPCMutex mutex("spells"); mutex.Lock(); int records = database->GetMaxSpellID() + 1; if(records == 0) { @@ -36,7 +36,7 @@ void LoadSpells(SharedDatabase *database, const std::string &prefix) { auto Config = EQEmuConfig::get(); std::string file_name = Config->SharedMemDir + prefix + std::string("spells"); - EQEmu::MemoryMappedFile mmf(file_name, size); + EQ::MemoryMappedFile mmf(file_name, size); mmf.ZeroFile(); void *ptr = mmf.Get(); diff --git a/tests/data_verification_test.h b/tests/data_verification_test.h index b9eb210fa..5053b922a 100644 --- a/tests/data_verification_test.h +++ b/tests/data_verification_test.h @@ -40,13 +40,13 @@ public: float value_f = 500.0f; int value_i = 500; - float vf1 = EQEmu::Clamp(value_f, 0.0f, 1000.0f); - float vf2 = EQEmu::Clamp(value_f, 0.0f, 250.0f); - float vf3 = EQEmu::Clamp(value_f, 750.0f, 1000.0f); + float vf1 = EQ::Clamp(value_f, 0.0f, 1000.0f); + float vf2 = EQ::Clamp(value_f, 0.0f, 250.0f); + float vf3 = EQ::Clamp(value_f, 750.0f, 1000.0f); - int vi1 = EQEmu::Clamp(value_i, 0, 1000); - int vi2 = EQEmu::Clamp(value_i, 0, 250); - int vi3 = EQEmu::Clamp(value_i, 750, 1000); + int vi1 = EQ::Clamp(value_i, 0, 1000); + int vi2 = EQ::Clamp(value_i, 0, 250); + int vi3 = EQ::Clamp(value_i, 750, 1000); TEST_ASSERT_EQUALS(vf1, 500.0f); TEST_ASSERT_EQUALS(vf2, 250.0f); @@ -61,11 +61,11 @@ public: float value_f = 500.0f; int value_i = 500; - float vf1 = EQEmu::ClampUpper(value_f, 1000.0f); - float vf2 = EQEmu::ClampUpper(value_f, 250.0f); + float vf1 = EQ::ClampUpper(value_f, 1000.0f); + float vf2 = EQ::ClampUpper(value_f, 250.0f); - int vi1 = EQEmu::ClampUpper(value_i, 1000); - int vi2 = EQEmu::ClampUpper(value_i, 250); + int vi1 = EQ::ClampUpper(value_i, 1000); + int vi2 = EQ::ClampUpper(value_i, 250); TEST_ASSERT_EQUALS(vf1, 500.0f); TEST_ASSERT_EQUALS(vf2, 250.0f); @@ -78,11 +78,11 @@ public: float value_f = 500.0f; int value_i = 500; - float vf1 = EQEmu::ClampLower(value_f, 0.0f); - float vf2 = EQEmu::ClampLower(value_f, 750.0f); + float vf1 = EQ::ClampLower(value_f, 0.0f); + float vf2 = EQ::ClampLower(value_f, 750.0f); - int vi1 = EQEmu::ClampLower(value_i, 0); - int vi2 = EQEmu::ClampLower(value_i, 750); + int vi1 = EQ::ClampLower(value_i, 0); + int vi2 = EQ::ClampLower(value_i, 750); TEST_ASSERT_EQUALS(vf1, 500.0f); TEST_ASSERT_EQUALS(vf2, 750.0f); @@ -95,13 +95,13 @@ public: float value_f = 500.0f; int value_i = 500; - TEST_ASSERT(EQEmu::ValueWithin(value_f, 0.0f, 1000.0f)); - TEST_ASSERT(!EQEmu::ValueWithin(value_f, 0.0f, 400.0f)); - TEST_ASSERT(!EQEmu::ValueWithin(value_f, 600.0f, 900.0f)); + TEST_ASSERT(EQ::ValueWithin(value_f, 0.0f, 1000.0f)); + TEST_ASSERT(!EQ::ValueWithin(value_f, 0.0f, 400.0f)); + TEST_ASSERT(!EQ::ValueWithin(value_f, 600.0f, 900.0f)); - TEST_ASSERT(EQEmu::ValueWithin(value_i, 0, 1000)); - TEST_ASSERT(!EQEmu::ValueWithin(value_i, 0, 400)); - TEST_ASSERT(!EQEmu::ValueWithin(value_i, 600, 900)); + TEST_ASSERT(EQ::ValueWithin(value_i, 0, 1000)); + TEST_ASSERT(!EQ::ValueWithin(value_i, 0, 400)); + TEST_ASSERT(!EQ::ValueWithin(value_i, 600, 900)); } }; diff --git a/tests/fixed_memory_test.h b/tests/fixed_memory_test.h index 055a85d79..faddc963f 100644 --- a/tests/fixed_memory_test.h +++ b/tests/fixed_memory_test.h @@ -27,7 +27,7 @@ class FixedMemoryHashTest : public Test::Suite { typedef void(FixedMemoryHashTest::*TestFunction)(void); public: FixedMemoryHashTest() { - size_ = EQEmu::FixedMemoryHashSet::estimated_size(72000, 190000); + size_ = EQ::FixedMemoryHashSet::estimated_size(72000, 190000); data_ = new uint8[size_]; memset(data_, 0, size_); TEST_ADD(FixedMemoryHashTest::InitTest); @@ -49,7 +49,7 @@ public: private: void InitTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_, 72000, 190000); + EQ::FixedMemoryHashSet hash(data_, size_, 72000, 190000); TEST_ASSERT(!hash.exists(1001)); TEST_ASSERT(hash.size() == 0); TEST_ASSERT(hash.max_size() == 72000); @@ -57,7 +57,7 @@ public: } void LoadTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); + EQ::FixedMemoryHashSet hash(data_, size_); TEST_ASSERT(!hash.exists(1001)); TEST_ASSERT(hash.size() == 0); TEST_ASSERT(hash.max_size() == 72000); @@ -65,8 +65,8 @@ public: } void InsertTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); - EQEmu::ItemData item; + EQ::FixedMemoryHashSet hash(data_, size_); + EQ::ItemData item; memset(&item, 0, sizeof(item)); strcpy(item.Name, "Iron Sword"); item.ID = 1001; @@ -79,20 +79,20 @@ public: } void RetrieveTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); + EQ::FixedMemoryHashSet hash(data_, size_); TEST_ASSERT(hash.exists(1001)); TEST_ASSERT(hash.size() == 1); TEST_ASSERT(hash.max_size() == 72000); TEST_ASSERT(!hash.empty()); - EQEmu::ItemData item = hash[1001]; + EQ::ItemData item = hash[1001]; TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0); TEST_ASSERT(item.ID == 1001); } void OverwriteTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); - EQEmu::ItemData item; + EQ::FixedMemoryHashSet hash(data_, size_); + EQ::ItemData item; memset(&item, 0, sizeof(item)); strcpy(item.Name, "Steel Sword"); item.ID = 1001; @@ -105,20 +105,20 @@ public: } void OverwriteRetrieveTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); + EQ::FixedMemoryHashSet hash(data_, size_); TEST_ASSERT(hash.exists(1001)); TEST_ASSERT(hash.size() == 1); TEST_ASSERT((hash.max_size() == 72000)); TEST_ASSERT(!hash.empty()); - EQEmu::ItemData item = hash[1001]; + EQ::ItemData item = hash[1001]; TEST_ASSERT(strcmp(item.Name, "Steel Sword") == 0); TEST_ASSERT(item.ID == 1001); } void InsertAgainTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); - EQEmu::ItemData item; + EQ::FixedMemoryHashSet hash(data_, size_); + EQ::ItemData item; memset(&item, 0, sizeof(item)); strcpy(item.Name, "Iron Sword"); item.ID = 1000; @@ -132,14 +132,14 @@ public: } void RetrieveAgainTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); + EQ::FixedMemoryHashSet hash(data_, size_); TEST_ASSERT(hash.exists(1000)); TEST_ASSERT(hash.exists(1001)); TEST_ASSERT(hash.size() == 2); TEST_ASSERT(hash.max_size() == 72000); TEST_ASSERT(!hash.empty()); - EQEmu::ItemData item = hash[1000]; + EQ::ItemData item = hash[1000]; TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0); TEST_ASSERT(item.ID == 1000); @@ -149,8 +149,8 @@ public: } void InsertBeginTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); - EQEmu::ItemData item; + EQ::FixedMemoryHashSet hash(data_, size_); + EQ::ItemData item; memset(&item, 0, sizeof(item)); strcpy(item.Name, "Bronze Sword"); item.ID = 0; @@ -165,7 +165,7 @@ public: } void RetrieveBeginTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); + EQ::FixedMemoryHashSet hash(data_, size_); TEST_ASSERT(hash.exists(1000)); TEST_ASSERT(hash.exists(1001)); TEST_ASSERT(hash.exists(0)); @@ -173,7 +173,7 @@ public: TEST_ASSERT(hash.max_size() == 72000); TEST_ASSERT(!hash.empty()); - EQEmu::ItemData item = hash[1000]; + EQ::ItemData item = hash[1000]; TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0); TEST_ASSERT(item.ID == 1000); @@ -187,8 +187,8 @@ public: } void InsertEndTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); - EQEmu::ItemData item; + EQ::FixedMemoryHashSet hash(data_, size_); + EQ::ItemData item; memset(&item, 0, sizeof(item)); strcpy(item.Name, "Jade Sword"); item.ID = 190000; @@ -204,7 +204,7 @@ public: } void RetrieveEndTest() { - EQEmu::FixedMemoryHashSet hash(data_, size_); + EQ::FixedMemoryHashSet hash(data_, size_); TEST_ASSERT(hash.exists(1000)); TEST_ASSERT(hash.exists(1001)); TEST_ASSERT(hash.exists(0)); @@ -213,7 +213,7 @@ public: TEST_ASSERT(hash.max_size() == 72000); TEST_ASSERT(!hash.empty()); - EQEmu::ItemData item = hash[1000]; + EQ::ItemData item = hash[1000]; TEST_ASSERT(strcmp(item.Name, "Iron Sword") == 0); TEST_ASSERT(item.ID == 1000); diff --git a/tests/fixed_memory_variable_test.h b/tests/fixed_memory_variable_test.h index a728093ef..4bb89e1b6 100644 --- a/tests/fixed_memory_variable_test.h +++ b/tests/fixed_memory_variable_test.h @@ -48,19 +48,19 @@ public: private: void InitTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_, 501); + EQ::FixedMemoryVariableHashSet hash(data_, size_, 501); TEST_ASSERT(!hash.exists(0)); TEST_ASSERT(!hash.exists(501)); } void LoadTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); TEST_ASSERT(!hash.exists(0)); TEST_ASSERT(!hash.exists(501)); } void InsertTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); test_struct test; memset(&test, 0, sizeof(test)); strcpy(test.name, "Bill D."); @@ -71,7 +71,7 @@ public: } void RetrieveTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); TEST_ASSERT(hash.exists(0)); TEST_ASSERT(!hash.exists(501)); @@ -80,7 +80,7 @@ public: } void InsertAgainTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); test_struct test; memset(&test, 0, sizeof(test)); strcpy(test.name, "Jimmy P."); @@ -91,7 +91,7 @@ public: } void RetrieveAgainTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); TEST_ASSERT(hash.exists(0)); TEST_ASSERT(hash.exists(501)); @@ -100,7 +100,7 @@ public: } void InsertAgainFailTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); test_struct test; memset(&test, 0, sizeof(test)); strcpy(test.name, "Tommy M."); @@ -115,7 +115,7 @@ public: } void RetrieveAgainFailTest() { - EQEmu::FixedMemoryVariableHashSet hash(data_, size_); + EQ::FixedMemoryVariableHashSet hash(data_, size_); TEST_ASSERT(hash.exists(0)); TEST_ASSERT(hash.exists(501)); TEST_ASSERT(!hash.exists(500)); diff --git a/tests/ipc_mutex_test.h b/tests/ipc_mutex_test.h index d465f869c..c4323d425 100644 --- a/tests/ipc_mutex_test.h +++ b/tests/ipc_mutex_test.h @@ -40,24 +40,24 @@ public: private: void LockMutexTest() { - EQEmu::IPCMutex mutex("TestMutex1"); + EQ::IPCMutex mutex("TestMutex1"); TEST_ASSERT(mutex.Lock()); TEST_ASSERT(mutex.Unlock()); } void UnlockMutexTest() { - EQEmu::IPCMutex mutex("TestMutex2"); + EQ::IPCMutex mutex("TestMutex2"); TEST_ASSERT(!mutex.Unlock()); } void DoubleLockMutexTest() { - EQEmu::IPCMutex mutex("TestMutex3"); + EQ::IPCMutex mutex("TestMutex3"); TEST_ASSERT(mutex.Lock()); TEST_ASSERT(!mutex.Lock()); } void DoubleUnlockMutexTest() { - EQEmu::IPCMutex mutex("TestMutex4"); + EQ::IPCMutex mutex("TestMutex4"); TEST_ASSERT(mutex.Lock()); TEST_ASSERT(mutex.Unlock()); TEST_ASSERT(!mutex.Unlock()); diff --git a/tests/memory_mapped_file_test.h b/tests/memory_mapped_file_test.h index 3ce61d44e..b23f6568d 100644 --- a/tests/memory_mapped_file_test.h +++ b/tests/memory_mapped_file_test.h @@ -35,7 +35,7 @@ public: private: void LoadAndZeroMMF() { - EQEmu::MemoryMappedFile mmf("testfile.txt", 512); + EQ::MemoryMappedFile mmf("testfile.txt", 512); mmf.ZeroFile(); TEST_ASSERT(mmf.Size() == 512); @@ -46,7 +46,7 @@ public: } void LoadExistingMMF() { - EQEmu::MemoryMappedFile mmf("testfile.txt"); + EQ::MemoryMappedFile mmf("testfile.txt"); TEST_ASSERT(mmf.Size() == 512); unsigned char *data = reinterpret_cast(mmf.Get()); diff --git a/tests/skills_util_test.h b/tests/skills_util_test.h index 478de4206..77616ea14 100644 --- a/tests/skills_util_test.h +++ b/tests/skills_util_test.h @@ -35,13 +35,13 @@ public: private: void IsTradeskill() { - TEST_ASSERT(EQEmu::skills::IsTradeskill(EQEmu::skills::SkillPottery)); - TEST_ASSERT(!EQEmu::skills::IsTradeskill(EQEmu::skills::SkillParry)); + TEST_ASSERT(EQ::skills::IsTradeskill(EQ::skills::SkillPottery)); + TEST_ASSERT(!EQ::skills::IsTradeskill(EQ::skills::SkillParry)); } void IsSpecializedSkill() { - TEST_ASSERT(EQEmu::skills::IsSpecializedSkill(EQEmu::skills::SkillSpecializeConjuration)); - TEST_ASSERT(!EQEmu::skills::IsSpecializedSkill(EQEmu::skills::SkillConjuration)) + TEST_ASSERT(EQ::skills::IsSpecializedSkill(EQ::skills::SkillSpecializeConjuration)); + TEST_ASSERT(!EQ::skills::IsSpecializedSkill(EQ::skills::SkillConjuration)) } }; diff --git a/tests/string_util_test.h b/tests/string_util_test.h index facb0cc72..1fdd325f9 100644 --- a/tests/string_util_test.h +++ b/tests/string_util_test.h @@ -29,6 +29,8 @@ public: TEST_ADD(StringUtilTest::StringFormatTest); TEST_ADD(StringUtilTest::EscapeStringTest); TEST_ADD(StringUtilTest::EscapeStringMemoryTest); + TEST_ADD(StringUtilTest::SearchDeliminatedStringTest); + TEST_ADD(StringUtilTest::SplitStringTest); } ~StringUtilTest() { @@ -80,6 +82,42 @@ public: auto s = EscapeString(t, 10); TEST_ASSERT(s.compare("abc\\x00\\n\\r\\\\\\'\\\"\\x1a") == 0); } + + void SearchDeliminatedStringTest() { + std::string h = + "befallen,charasis,dalnir,frontiermtns,gukbottom,iceclad,lakeofillomen,northkarana,qey2hh1,soldunga,southro,wakening,podisease,velketor,akheva,riwwi,bothunder,poair"; + TEST_ASSERT(search_deliminated_string(h, "befallen") == 0); + TEST_ASSERT(search_deliminated_string(h, "charasis") == 9); + TEST_ASSERT(search_deliminated_string(h, "dalnir") == 18); + TEST_ASSERT(search_deliminated_string(h, "frontiermtns") == 25); + TEST_ASSERT(search_deliminated_string(h, "gukbottom") == 38); + TEST_ASSERT(search_deliminated_string(h, "iceclad") == 48); + TEST_ASSERT(search_deliminated_string(h, "lakeofillomen") == 56); + TEST_ASSERT(search_deliminated_string(h, "northkarana") == 70); + TEST_ASSERT(search_deliminated_string(h, "qey2hh1") == 82); + TEST_ASSERT(search_deliminated_string(h, "soldunga") == 90); + TEST_ASSERT(search_deliminated_string(h, "southro") == 99); + TEST_ASSERT(search_deliminated_string(h, "wakening") == 107); + TEST_ASSERT(search_deliminated_string(h, "podisease") == 116); + TEST_ASSERT(search_deliminated_string(h, "velketor") == 126); + TEST_ASSERT(search_deliminated_string(h, "akheva") == 135); + TEST_ASSERT(search_deliminated_string(h, "riwwi") == 142); + TEST_ASSERT(search_deliminated_string(h, "bothunder") == 148); + TEST_ASSERT(search_deliminated_string(h, "poair") == 158); + TEST_ASSERT(search_deliminated_string(h, "pod") == std::string::npos); + TEST_ASSERT(search_deliminated_string(h, "air") == std::string::npos); + TEST_ASSERT(search_deliminated_string(h, "bef") == std::string::npos); + TEST_ASSERT(search_deliminated_string(h, "wwi") == std::string::npos); + } + + void SplitStringTest() { + std::string s = "123,456,789,"; + auto v = SplitString(s, ','); + TEST_ASSERT(v.size() == 3); + TEST_ASSERT(v[0] == "123"); + TEST_ASSERT(v[1] == "456"); + TEST_ASSERT(v[2] == "789"); + } }; #endif diff --git a/ucs/chatchannel.cpp b/ucs/chatchannel.cpp index 001f7b1e7..da3390f55 100644 --- a/ucs/chatchannel.cpp +++ b/ucs/chatchannel.cpp @@ -47,8 +47,13 @@ ChatChannel::ChatChannel(std::string inName, std::string inOwner, std::string in Moderated = false; - LogInfo("New ChatChannel created: Name: [[{}]], Owner: [[{}]], Password: [[{}]], MinStatus: [{}]", - Name.c_str(), Owner.c_str(), Password.c_str(), MinimumStatus); + LogDebug( + "New ChatChannel created: Name: [[{}]], Owner: [[{}]], Password: [[{}]], MinStatus: [{}]", + Name.c_str(), + Owner.c_str(), + Password.c_str(), + MinimumStatus + ); } @@ -154,7 +159,7 @@ void ChatChannelList::SendAllChannels(Client *c) { void ChatChannelList::RemoveChannel(ChatChannel *Channel) { - LogInfo("RemoveChannel([{}])", Channel->GetName().c_str()); + LogDebug("RemoveChannel ([{}])", Channel->GetName().c_str()); LinkedListIterator iterator(ChatChannels); @@ -175,7 +180,7 @@ void ChatChannelList::RemoveChannel(ChatChannel *Channel) { void ChatChannelList::RemoveAllChannels() { - LogInfo("RemoveAllChannels"); + LogDebug("RemoveAllChannels"); LinkedListIterator iterator(ChatChannels); @@ -242,7 +247,7 @@ void ChatChannel::AddClient(Client *c) { int AccountStatus = c->GetAccountStatus(); - LogInfo("Adding [{}] to channel [{}]", c->GetName().c_str(), Name.c_str()); + LogDebug("Adding [{}] to channel [{}]", c->GetName().c_str(), Name.c_str()); LinkedListIterator iterator(ClientsInChannel); @@ -267,7 +272,7 @@ bool ChatChannel::RemoveClient(Client *c) { if(!c) return false; - LogInfo("RemoveClient [{}] from channel [{}]", c->GetName().c_str(), GetName().c_str()); + LogDebug("RemoveClient [{}] from channel [{}]", c->GetName().c_str(), GetName().c_str()); bool HideMe = c->GetHideMe(); @@ -304,7 +309,7 @@ bool ChatChannel::RemoveClient(Client *c) { if((Password.length() == 0) || (RuleI(Channels, DeleteTimer) == 0)) return false; - LogInfo("Starting delete timer for empty password protected channel [{}]", Name.c_str()); + LogDebug("Starting delete timer for empty password protected channel [{}]", Name.c_str()); DeleteTimer.Start(RuleI(Channels, DeleteTimer) * 60000); } @@ -388,7 +393,7 @@ void ChatChannel::SendMessageToChannel(std::string Message, Client* Sender) { if(!Sender) return; - std::string cv_messages[EQEmu::versions::ClientVersionCount]; + std::string cv_messages[EQ::versions::ClientVersionCount]; ChatMessagesSent++; @@ -402,23 +407,23 @@ void ChatChannel::SendMessageToChannel(std::string Message, Client* Sender) { if(ChannelClient) { - LogInfo("Sending message to [{}] from [{}]", + LogDebug("Sending message to [{}] from [{}]", ChannelClient->GetName().c_str(), Sender->GetName().c_str()); if (cv_messages[static_cast(ChannelClient->GetClientVersion())].length() == 0) { switch (ChannelClient->GetClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: + case EQ::versions::ClientVersion::Titanium: ServerToClient45SayLink(cv_messages[static_cast(ChannelClient->GetClientVersion())], Message); break; - case EQEmu::versions::ClientVersion::SoF: - case EQEmu::versions::ClientVersion::SoD: - case EQEmu::versions::ClientVersion::UF: + case EQ::versions::ClientVersion::SoF: + case EQ::versions::ClientVersion::SoD: + case EQ::versions::ClientVersion::UF: ServerToClient50SayLink(cv_messages[static_cast(ChannelClient->GetClientVersion())], Message); break; - case EQEmu::versions::ClientVersion::RoF: + case EQ::versions::ClientVersion::RoF: ServerToClient55SayLink(cv_messages[static_cast(ChannelClient->GetClientVersion())], Message); break; - case EQEmu::versions::ClientVersion::RoF2: + case EQ::versions::ClientVersion::RoF2: default: cv_messages[static_cast(ChannelClient->GetClientVersion())] = Message; break; @@ -505,7 +510,7 @@ ChatChannel *ChatChannelList::AddClientToChannel(std::string ChannelName, Client return nullptr; } - LogInfo("AddClient to channel [[{}]] with password [[{}]]", NormalisedName.c_str(), Password.c_str()); + LogDebug("AddClient to channel [[{}]] with password [[{}]]", NormalisedName.c_str(), Password.c_str()); ChatChannel *RequiredChannel = FindChannel(NormalisedName); @@ -581,7 +586,7 @@ void ChatChannelList::Process() { if(CurrentChannel && CurrentChannel->ReadyToDelete()) { - LogInfo("Empty temporary password protected channel [{}] being destroyed", + LogDebug("Empty temporary password protected channel [{}] being destroyed", CurrentChannel->GetName().c_str()); RemoveChannel(CurrentChannel); @@ -597,7 +602,7 @@ void ChatChannel::AddInvitee(const std::string &Invitee) if (!IsInvitee(Invitee)) { Invitees.push_back(Invitee); - LogInfo("Added [{}] as invitee to channel [{}]", Invitee.c_str(), Name.c_str()); + LogDebug("Added [{}] as invitee to channel [{}]", Invitee.c_str(), Name.c_str()); } } @@ -608,7 +613,7 @@ void ChatChannel::RemoveInvitee(std::string Invitee) if(it != std::end(Invitees)) { Invitees.erase(it); - LogInfo("Removed [{}] as invitee to channel [{}]", Invitee.c_str(), Name.c_str()); + LogDebug("Removed [{}] as invitee to channel [{}]", Invitee.c_str(), Name.c_str()); } } diff --git a/ucs/clientlist.cpp b/ucs/clientlist.cpp index 429f28fbf..18f18a276 100644 --- a/ucs/clientlist.cpp +++ b/ucs/clientlist.cpp @@ -65,14 +65,10 @@ void Client::SendUptime() { ms -= m * 60000; uint32 s = ms / 1000; - char *Buffer = nullptr; - - MakeAnyLenString(&Buffer, "UCS has been up for %02id %02ih %02im %02is", d, h, m, s); - GeneralChannelMessage(Buffer); - safe_delete_array(Buffer); - MakeAnyLenString(&Buffer, "Chat Messages Sent: %i, Mail Messages Sent: %i", ChatMessagesSent, MailMessagesSent); - GeneralChannelMessage(Buffer); - safe_delete_array(Buffer); + auto message = fmt::format("UCS has been up for {:02}d {:02}h {:02}m {:02}s", d, h, m, s); + GeneralChannelMessage(message); + message = fmt::format("Chat Messages Sent: {}, Mail Messages Sent: {}", ChatMessagesSent, MailMessagesSent); + GeneralChannelMessage(message); } std::vector ParseRecipients(std::string RecipientString) { @@ -235,7 +231,7 @@ std::vector ParseRecipients(std::string RecipientString) { static void ProcessMailTo(Client *c, std::string MailMessage) { - LogInfo("MAILTO: From [{}], [{}]", c->MailBoxName().c_str(), MailMessage.c_str()); + LogDebug("MAILTO: From [{}], [{}]", c->MailBoxName().c_str(), MailMessage.c_str()); std::vector Recipients; @@ -304,7 +300,7 @@ static void ProcessMailTo(Client *c, std::string MailMessage) { if (!database.SendMail(Recipient, c->MailBoxName(), Subject, Body, RecipientsString)) { - LogInfo("Failed in SendMail([{}], [{}], [{}], [{}])", Recipient.c_str(), + LogError("Failed in SendMail([{}], [{}], [{}], [{}])", Recipient.c_str(), c->MailBoxName().c_str(), Subject.c_str(), RecipientsString.c_str()); int PacketLength = 10 + Recipient.length() + Subject.length(); @@ -523,7 +519,7 @@ Client::Client(std::shared_ptr eqs) { GlobalChatLimiterTimer = new Timer(RuleI(Chat, IntervalDurationMS)); TypeOfConnection = ConnectionTypeUnknown; - ClientVersion_ = EQEmu::versions::ClientVersion::Unknown; + ClientVersion_ = EQ::versions::ClientVersion::Unknown; UnderfootOrLater = false; } @@ -556,6 +552,17 @@ void Client::CloseConnection() { ClientStream->ReleaseFromUse(); } +void Clientlist::CheckForStaleConnectionsAll() +{ + LogDebug("Checking for stale connections"); + + auto it = ClientChatConnections.begin(); + while (it != ClientChatConnections.end()) { + (*it)->SendKeepAlive(); + ++it; + } +} + void Clientlist::CheckForStaleConnections(Client *c) { if (!c) return; @@ -634,10 +641,12 @@ void Clientlist::Process() // std::string::size_type LastPeriod = MailBoxString.find_last_of("."); - if (LastPeriod == std::string::npos) + if (LastPeriod == std::string::npos) { CharacterName = MailBoxString; - else + } + else { CharacterName = MailBoxString.substr(LastPeriod + 1); + } LogInfo("Received login for user [{}] with key [{}]", MailBox, Key); @@ -652,8 +661,9 @@ void Clientlist::Process() database.GetAccountStatus((*it)); - if ((*it)->GetConnectionType() == ConnectionTypeCombined) + if ((*it)->GetConnectionType() == ConnectionTypeCombined) { (*it)->SendFriends(); + } (*it)->SendMailBoxes(); @@ -865,7 +875,9 @@ void Clientlist::CloseAllConnections() { void Client::AddCharacter(int CharID, const char *CharacterName, int Level) { if (!CharacterName) return; - LogInfo("Adding character [{}] with ID [{}] for [{}]", CharacterName, CharID, GetName().c_str()); + + LogDebug("Adding character [{}] with ID [{}] for [{}]", CharacterName, CharID, GetName().c_str()); + CharacterEntry NewCharacter; NewCharacter.CharID = CharID; NewCharacter.Name = CharacterName; @@ -874,6 +886,10 @@ void Client::AddCharacter(int CharID, const char *CharacterName, int Level) { Characters.push_back(NewCharacter); } +void Client::SendKeepAlive() { + QueuePacket(new EQApplicationPacket(OP_SessionReady, 0)); +} + void Client::SendMailBoxes() { int Count = Characters.size(); @@ -930,7 +946,7 @@ void Client::AddToChannelList(ChatChannel *JoinedChannel) { for (int i = 0; i < MAX_JOINED_CHANNELS; i++) if (JoinedChannels[i] == nullptr) { JoinedChannels[i] = JoinedChannel; - LogInfo("Added Channel [{}] to slot [{}] for [{}]", JoinedChannel->GetName().c_str(), i + 1, GetName().c_str()); + LogDebug("Added Channel [{}] to slot [{}] for [{}]", JoinedChannel->GetName().c_str(), i + 1, GetName().c_str()); return; } } @@ -2143,54 +2159,54 @@ void Client::SetConnectionType(char c) { switch (c) { - case EQEmu::versions::ucsTitaniumChat: + case EQ::versions::ucsTitaniumChat: { TypeOfConnection = ConnectionTypeChat; - ClientVersion_ = EQEmu::versions::ClientVersion::Titanium; + ClientVersion_ = EQ::versions::ClientVersion::Titanium; LogInfo("Connection type is Chat (Titanium)"); break; } - case EQEmu::versions::ucsTitaniumMail: + case EQ::versions::ucsTitaniumMail: { TypeOfConnection = ConnectionTypeMail; - ClientVersion_ = EQEmu::versions::ClientVersion::Titanium; + ClientVersion_ = EQ::versions::ClientVersion::Titanium; LogInfo("Connection type is Mail (Titanium)"); break; } - case EQEmu::versions::ucsSoFCombined: + case EQ::versions::ucsSoFCombined: { TypeOfConnection = ConnectionTypeCombined; - ClientVersion_ = EQEmu::versions::ClientVersion::SoF; + ClientVersion_ = EQ::versions::ClientVersion::SoF; LogInfo("Connection type is Combined (SoF)"); break; } - case EQEmu::versions::ucsSoDCombined: + case EQ::versions::ucsSoDCombined: { TypeOfConnection = ConnectionTypeCombined; - ClientVersion_ = EQEmu::versions::ClientVersion::SoD; + ClientVersion_ = EQ::versions::ClientVersion::SoD; LogInfo("Connection type is Combined (SoD)"); break; } - case EQEmu::versions::ucsUFCombined: + case EQ::versions::ucsUFCombined: { TypeOfConnection = ConnectionTypeCombined; - ClientVersion_ = EQEmu::versions::ClientVersion::UF; + ClientVersion_ = EQ::versions::ClientVersion::UF; UnderfootOrLater = true; LogInfo("Connection type is Combined (Underfoot)"); break; } - case EQEmu::versions::ucsRoFCombined: + case EQ::versions::ucsRoFCombined: { TypeOfConnection = ConnectionTypeCombined; - ClientVersion_ = EQEmu::versions::ClientVersion::RoF; + ClientVersion_ = EQ::versions::ClientVersion::RoF; UnderfootOrLater = true; LogInfo("Connection type is Combined (RoF)"); break; } - case EQEmu::versions::ucsRoF2Combined: + case EQ::versions::ucsRoF2Combined: { TypeOfConnection = ConnectionTypeCombined; - ClientVersion_ = EQEmu::versions::ClientVersion::RoF2; + ClientVersion_ = EQ::versions::ClientVersion::RoF2; UnderfootOrLater = true; LogInfo("Connection type is Combined (RoF2)"); break; @@ -2198,7 +2214,7 @@ void Client::SetConnectionType(char c) { default: { TypeOfConnection = ConnectionTypeUnknown; - ClientVersion_ = EQEmu::versions::ClientVersion::Unknown; + ClientVersion_ = EQ::versions::ClientVersion::Unknown; LogInfo("Connection type is unknown"); } } @@ -2346,18 +2362,17 @@ void Client::SendFriends() { } } -std::string Client::MailBoxName() { +std::string Client::MailBoxName() +{ + if ((Characters.empty()) || (CurrentMailBox > (Characters.size() - 1))) { + LogDebug("MailBoxName() called with CurrentMailBox set to [{}] and Characters.size() is [{}]", + CurrentMailBox, Characters.size()); - if ((Characters.empty()) || (CurrentMailBox > (Characters.size() - 1))) - { - LogInfo("MailBoxName() called with CurrentMailBox set to [{}] and Characters.size() is [{}]", - CurrentMailBox, Characters.size()); - - return ""; + return std::string(); } - LogInfo("MailBoxName() called with CurrentMailBox set to [{}] and Characters.size() is [{}]", - CurrentMailBox, Characters.size()); + LogDebug("MailBoxName() called with CurrentMailBox set to [{}] and Characters.size() is [{}]", + CurrentMailBox, Characters.size()); return Characters[CurrentMailBox].Name; diff --git a/ucs/clientlist.h b/ucs/clientlist.h index 6021c5c0e..13d31784c 100644 --- a/ucs/clientlist.h +++ b/ucs/clientlist.h @@ -142,8 +142,8 @@ public: void SetConnectionType(char c); ConnectionType GetConnectionType() { return TypeOfConnection; } - EQEmu::versions::ClientVersion GetClientVersion() { return ClientVersion_; } - + EQ::versions::ClientVersion GetClientVersion() { return ClientVersion_; } + inline bool IsMailConnection() { return (TypeOfConnection == ConnectionTypeMail) || (TypeOfConnection == ConnectionTypeCombined); } void SendNotification(int MailBoxNumber, std::string From, std::string Subject, int MessageID); void ChangeMailBox(int NewMailBox); @@ -151,6 +151,7 @@ public: void SendFriends(); int GetCharID(); void SendUptime(); + void SendKeepAlive(); private: unsigned int CurrentMailBox; @@ -172,7 +173,7 @@ private: bool ForceDisconnect; ConnectionType TypeOfConnection; - EQEmu::versions::ClientVersion ClientVersion_; + EQ::versions::ClientVersion ClientVersion_; bool UnderfootOrLater; }; @@ -183,6 +184,7 @@ public: void Process(); void CloseAllConnections(); Client *FindCharacter(std::string CharacterName); + void CheckForStaleConnectionsAll(); void CheckForStaleConnections(Client *c); Client *IsCharacterOnline(std::string CharacterName); void ProcessOPMailCommand(Client *c, std::string CommandString); diff --git a/ucs/database.cpp b/ucs/database.cpp index d756f1ff4..108b17871 100644 --- a/ucs/database.cpp +++ b/ucs/database.cpp @@ -108,7 +108,7 @@ void Database::GetAccountStatus(Client *client) { std::string query = StringFormat( - "SELECT `status`, `hideme`, `karma`, `revoked` FROM `account` WHERE `id` = '%i' LIMIT 1", + "SELECT `status`, `hideme`, `karma`, `revoked` FROM `account` WHERE `id` = %i LIMIT 1", client->GetAccountID() ); @@ -173,7 +173,7 @@ int Database::FindAccount(const char *characterName, Client *client) query = StringFormat( "SELECT `id`, `name`, `level` FROM `character_data` " - "WHERE `account_id` = %i AND `name` != '%s'", + "WHERE `account_id` = %i AND `name` != '%s' AND deleted_at is NULL", accountID, characterName ); @@ -320,7 +320,7 @@ void Database::SendHeaders(Client *client) int unknownField3 = 1; int characterID = FindCharacter(client->MailBoxName().c_str()); - LogInfo("Sendheaders for [{}], CharID is [{}]", client->MailBoxName().c_str(), characterID); + LogDebug("Sendheaders for [{}], CharID is [{}]", client->MailBoxName().c_str(), characterID); if (characterID <= 0) { return; diff --git a/ucs/ucs.cpp b/ucs/ucs.cpp index 0f396252b..11f6ed103 100644 --- a/ucs/ucs.cpp +++ b/ucs/ucs.cpp @@ -70,17 +70,18 @@ int main() { // Check every minute for unused channels we can delete // Timer ChannelListProcessTimer(60000); + Timer ClientConnectionPruneTimer(60000); Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect LogInfo("Starting EQEmu Universal Chat Server"); - if (!ucsconfig::LoadConfig()) { - LogInfo("Loading server configuration failed"); + if (!ucsconfig::LoadConfig()) { + LogInfo("Loading server configuration failed"); return 1; } - Config = ucsconfig::get(); + Config = ucsconfig::get(); WorldShortName = Config->ShortName; @@ -116,7 +117,7 @@ int main() { } } - EQEmu::InitializeDynamicLookups(); + EQ::InitializeDynamicLookups(); LogInfo("Initialized dynamic dictionary entries"); database.ExpireMail(); @@ -144,19 +145,26 @@ int main() { worldserver = new WorldServer; - while(RunLoops) { + auto loop_fn = [&](EQ::Timer* t) { Timer::SetCurrentTime(); g_Clientlist->Process(); - if(ChannelListProcessTimer.Check()) + if (ChannelListProcessTimer.Check()) { ChannelList->Process(); + } - EQ::EventLoop::Get().Process(); + if (ClientConnectionPruneTimer.Check()) { + g_Clientlist->CheckForStaleConnectionsAll(); + } - Sleep(5); - } + }; + + EQ::Timer process_timer(loop_fn); + process_timer.Start(32, true); + + EQ::EventLoop::Get().Run(); ChannelList->RemoveAllChannels(); diff --git a/ucs/worldserver.cpp b/ucs/worldserver.cpp index 72865e416..64bdfc2a7 100644 --- a/ucs/worldserver.cpp +++ b/ucs/worldserver.cpp @@ -48,7 +48,7 @@ void Client55ToServerSayLink(std::string& serverSayLink, const std::string& clie WorldServer::WorldServer() { - m_connection.reset(new EQ::Net::ServertalkClient(Config->WorldIP, Config->WorldTCPPort, false, "UCS", Config->SharedKey)); + m_connection = std::make_unique(Config->WorldIP, Config->WorldTCPPort, false, "UCS", Config->SharedKey); m_connection->OnMessage(std::bind(&WorldServer::ProcessMessage, this, std::placeholders::_1, std::placeholders::_2)); } @@ -61,7 +61,7 @@ void WorldServer::ProcessMessage(uint16 opcode, EQ::Net::Packet &p) ServerPacket tpack(opcode, p); ServerPacket *pack = &tpack; - LogInfo("Received Opcode: {:#04x}", opcode); + LogNetcode("Received Opcode: {:#04x}", opcode); switch (opcode) { @@ -101,18 +101,18 @@ void WorldServer::ProcessMessage(uint16 opcode, EQ::Net::Packet &p) { std::string new_message; switch (c->GetClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: + case EQ::versions::ClientVersion::Titanium: Client45ToServerSayLink(new_message, Message.substr(1, std::string::npos)); break; - case EQEmu::versions::ClientVersion::SoF: - case EQEmu::versions::ClientVersion::SoD: - case EQEmu::versions::ClientVersion::UF: + case EQ::versions::ClientVersion::SoF: + case EQ::versions::ClientVersion::SoD: + case EQ::versions::ClientVersion::UF: Client50ToServerSayLink(new_message, Message.substr(1, std::string::npos)); break; - case EQEmu::versions::ClientVersion::RoF: + case EQ::versions::ClientVersion::RoF: Client55ToServerSayLink(new_message, Message.substr(1, std::string::npos)); break; - case EQEmu::versions::ClientVersion::RoF2: + case EQ::versions::ClientVersion::RoF2: default: new_message = Message.substr(1, std::string::npos); break; diff --git a/utils/deprecated/player_profile_set/player_profile_set/eq_player_structs.h b/utils/deprecated/player_profile_set/player_profile_set/eq_player_structs.h index e732757a4..3cfd276d6 100644 --- a/utils/deprecated/player_profile_set/player_profile_set/eq_player_structs.h +++ b/utils/deprecated/player_profile_set/player_profile_set/eq_player_structs.h @@ -720,7 +720,7 @@ struct RaidLeadershipAA_Struct { * Size: 20 Octets */ struct BindStruct { - /*000*/ uint32 zoneId; + /*000*/ uint32 zone_id; /*004*/ float x; /*008*/ float y; /*012*/ float z; @@ -1486,7 +1486,7 @@ struct GMZoneRequest_Struct { /*0068*/ float x; /*0072*/ float y; /*0076*/ float z; -/*0080*/ char unknown0080[4]; +/*0080*/ float heading; /*0084*/ int32 success; // 0 if command failed, 1 if succeeded? /*0088*/ // /*072*/ sint8 success; // =0 client->server, =1 server->client, -X=specific error diff --git a/utils/patches/patch_RoF.conf b/utils/patches/patch_RoF.conf index 31b091ff8..76178bf62 100644 --- a/utils/patches/patch_RoF.conf +++ b/utils/patches/patch_RoF.conf @@ -366,6 +366,7 @@ OP_CancelSneakHide=0x265f OP_AggroMeterLockTarget=0x70b7 OP_AggroMeterTargetInfo=0x18fe OP_AggroMeterUpdate=0x75aa +OP_UnderWorld=0x44f9 # clients sends up when they detect an underworld issue, might be useful for cheat detection OP_DzQuit=0x5fc8 OP_DzListTimers=0x67b9 @@ -374,16 +375,18 @@ OP_DzRemovePlayer=0x0dc1 OP_DzSwapPlayer=0x4995 OP_DzMakeLeader=0x17b2 OP_DzPlayerList=0x1aff -OP_DzJoinExpeditionConfirm=0x30df -OP_DzJoinExpeditionReply=0x15d4 +OP_DzExpeditionInvite=0x30df +OP_DzExpeditionInviteResponse=0x15d4 OP_DzExpeditionInfo=0x3861 -OP_DzExpeditionList=0x0b3b -OP_DzMemberStatus=0x26c2 -OP_DzLeaderStatus=0x4021 -OP_DzExpeditionEndsWarning=0x32eb +OP_DzExpeditionLockoutTimers=0x0b3b OP_DzMemberList=0x348f +OP_DzMemberListName=0x26c2 +OP_DzMemberListStatus=0x0000 +OP_DzSetLeaderName=0x4021 +OP_DzExpeditionEndsWarning=0x32eb OP_DzCompass=0x0e01 # Was 0x4f09 OP_DzChooseZone=0x6e5e # Maybe 0x29d6 +OP_DzChooseZoneReply=0x0000 # New Opcodes OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ? diff --git a/utils/patches/patch_RoF2.conf b/utils/patches/patch_RoF2.conf index a39fde999..96f3258a8 100644 --- a/utils/patches/patch_RoF2.conf +++ b/utils/patches/patch_RoF2.conf @@ -367,25 +367,29 @@ OP_CancelSneakHide=0x0927 OP_AggroMeterLockTarget=0x1643 OP_AggroMeterTargetInfo=0x16bc OP_AggroMeterUpdate=0x1781 +OP_UnderWorld=0x2eb3 # clients sends up when they detect an underworld issue, might be useful for cheat detection +OP_KickPlayers=0x6770 # Expeditions +OP_DzQuit=0xb2e3 +OP_DzListTimers=0x7b68 OP_DzAddPlayer=0x4701 OP_DzRemovePlayer=0x1abc OP_DzSwapPlayer=0x405b OP_DzMakeLeader=0x543d OP_DzPlayerList=0x14c6 -OP_DzJoinExpeditionConfirm=0x7f4b -OP_DzJoinExpeditionReply=0x1950 -OP_DzListTimers=0x7b68 +OP_DzExpeditionInvite=0x7f4b +OP_DzExpeditionInviteResponse=0x1950 OP_DzExpeditionInfo=0x9119 -OP_DzExpeditionList=0x205f -OP_DzQuit=0xb2e3 -OP_DzMemberStatus=0x32f0 -OP_DzLeaderStatus=0x3de9 +OP_DzExpeditionLockoutTimers=0x205f OP_DzMemberList=0x5ae4 -OP_DzExpeditionEndsWarning=0x383c +OP_DzMemberListName=0x32f0 +OP_DzMemberListStatus=0x12F5 +OP_DzSetLeaderName=0x3de9 +OP_DzExpeditionEndsWarning=0x5189 OP_DzCompass=0x3e0e OP_DzChooseZone=0x0b7d +OP_DzChooseZoneReply=0x4de1 # New Opcodes OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ? diff --git a/utils/patches/patch_SoD.conf b/utils/patches/patch_SoD.conf index 619f986c1..1ef8a138a 100644 --- a/utils/patches/patch_SoD.conf +++ b/utils/patches/patch_SoD.conf @@ -357,6 +357,7 @@ OP_OpenContainer=0x3278 OP_Marquee=0x7dc9 OP_Fling=0x2b88 OP_CancelSneakHide=0x7705 +OP_UnderWorld=0x51ae # clients sends up when they detect an underworld issue, might be useful for cheat detection # Expedition OP_DzQuit=0x054e @@ -366,17 +367,18 @@ OP_DzRemovePlayer=0xa682 OP_DzSwapPlayer=0x0d8d OP_DzMakeLeader=0x1caa OP_DzPlayerList=0x74ca -OP_DzJoinExpeditionConfirm=0x1772 -OP_DzJoinExpeditionReply=0x3c13 +OP_DzExpeditionInvite=0x1772 +OP_DzExpeditionInviteResponse=0x3c13 OP_DzExpeditionInfo=0x128e -OP_DzMemberStatus=0x4661 -OP_DzLeaderStatus=0x226f -OP_DzExpeditionEndsWarning=0x1879 -OP_DzExpeditionList=0x3657 +OP_DzExpeditionLockoutTimers=0x3657 OP_DzMemberList=0x74e4 +OP_DzMemberListName=0x4661 +OP_DzMemberListStatus=0x1d99 +OP_DzSetLeaderName=0x226f +OP_DzExpeditionEndsWarning=0x1879 OP_DzCompass=0x35d3 OP_DzChooseZone=0x0d8a -#0x1d99 was grouped with these too but I don't really know it's purpose. +OP_DzChooseZoneReply=0x5a67 # New Opcodes OP_SpawnPositionUpdate=0x4656 # diff --git a/utils/patches/patch_SoF.conf b/utils/patches/patch_SoF.conf index 6a5d41fb4..1c5fd3eda 100644 --- a/utils/patches/patch_SoF.conf +++ b/utils/patches/patch_SoF.conf @@ -338,6 +338,7 @@ OP_OpenContainer=0x10e3 OP_Marquee=0x2f75 OP_Untargetable=0x3e36 OP_CancelSneakHide=0x5335 +OP_UnderWorld=0x7580 # clients sends up when they detect an underworld issue, might be useful for cheat detection #expedition OP_DzQuit=0x20d6 @@ -347,16 +348,18 @@ OP_DzRemovePlayer=0x2ce8 OP_DzSwapPlayer=0x2c3e OP_DzMakeLeader=0x1a75 OP_DzPlayerList=0x5116 -OP_DzJoinExpeditionConfirm=0x1793 -OP_DzJoinExpeditionReply=0x7a6f +OP_DzExpeditionInvite=0x1793 +OP_DzExpeditionInviteResponse=0x7a6f OP_DzExpeditionInfo=0x60a6 -OP_DzMemberStatus=0x0516 -OP_DzLeaderStatus=0x79d3 -OP_DzExpeditionEndsWarning=0x5153 -OP_DzExpeditionList=0x02ac +OP_DzExpeditionLockoutTimers=0x02ac OP_DzMemberList=0x5e14 +OP_DzMemberListName=0x0516 +OP_DzMemberListStatus=0x0000 +OP_DzSetLeaderName=0x79d3 +OP_DzExpeditionEndsWarning=0x5153 OP_DzCompass=0x531d OP_DzChooseZone=0x3c5b +OP_DzChooseZoneReply=0x0000 #Looting OP_LootRequest=0x36E3 #Trevius 02/16/09 diff --git a/utils/patches/patch_Titanium.conf b/utils/patches/patch_Titanium.conf index 9a7e1e800..32d434e93 100644 --- a/utils/patches/patch_Titanium.conf +++ b/utils/patches/patch_Titanium.conf @@ -297,17 +297,18 @@ OP_DzRemovePlayer=0x540b OP_DzSwapPlayer=0x794a OP_DzMakeLeader=0x0ce9 OP_DzPlayerList=0xada0 -OP_DzJoinExpeditionConfirm=0x3817 -OP_DzJoinExpeditionReply=0x5da9 +OP_DzExpeditionInvite=0x3817 +OP_DzExpeditionInviteResponse=0x5da9 OP_DzExpeditionInfo=0x98e -OP_DzMemberStatus=0x1826 -OP_DzLeaderStatus=0x7abc -OP_DzExpeditionEndsWarning=0x1c3f -OP_DzExpeditionList=0x7c12 +OP_DzExpeditionLockoutTimers=0x7c12 OP_DzMemberList=0x9b6 +OP_DzMemberListName=0x1826 +OP_DzMemberListStatus=0x330d +OP_DzSetLeaderName=0x7abc +OP_DzExpeditionEndsWarning=0x1c3f OP_DzCompass=0x28aa OP_DzChooseZone=0x1022 -#0x330d is something but I'm not sure what yet. +OP_DzChooseZoneReply=0x20e7 #bazaar trader stuff stuff: #become and buy from @@ -481,6 +482,8 @@ OP_TaskRequestTimer=0x6a1d OP_RequestClientZoneChange=0x7834 # ShowEQ 10/27/05 OP_SendAATable=0x367d # ShowEQ 10/27/05 +OP_ClearAA=0x5918 +OP_ClearLeadershipAbilities=0x7416 OP_UpdateAA=0x5966 OP_RespondAA=0x3af4 OP_SendAAStats=0x5996 # ShowEQ 10/27/05 @@ -543,6 +546,7 @@ OP_PlayerStateRemove=0x381d OP_VoiceMacroIn=0x2866 # Client to Server OP_VoiceMacroOut=0x2ec6 # Server to Client OP_CameraEffect=0x0937 # Correct +OP_UnderWorld=0x7186 # clients sends up when they detect an underworld issue, might be useful for cheat detection #named unknowns, to make looking for real unknown easier OP_AnnoyingZoneUnknown=0x729c diff --git a/utils/patches/patch_UF.conf b/utils/patches/patch_UF.conf index 69d6bb1e5..8efce91f6 100644 --- a/utils/patches/patch_UF.conf +++ b/utils/patches/patch_UF.conf @@ -368,6 +368,7 @@ OP_OpenContainer=0x041a OP_Marquee=0x3675 OP_Fling=0x51b1 OP_CancelSneakHide=0x7686 +OP_UnderWorld=0x2d9d # clients sends up when they detect an underworld issue, might be useful for cheat detection OP_DzQuit=0x1539 OP_DzListTimers=0x21e9 @@ -376,16 +377,18 @@ OP_DzRemovePlayer=0x054e OP_DzSwapPlayer=0x4661 OP_DzMakeLeader=0x226f OP_DzPlayerList=0x74e4 -OP_DzJoinExpeditionConfirm=0x3c5e -OP_DzJoinExpeditionReply=0x1154 +OP_DzExpeditionInvite=0x3c5e +OP_DzExpeditionInviteResponse=0x1154 OP_DzExpeditionInfo=0x1150 -OP_DzMemberStatus=0x2d17 -OP_DzLeaderStatus=0x2caf -OP_DzExpeditionEndsWarning=0x6ac2 -OP_DzExpeditionList=0x70d8 +OP_DzExpeditionLockoutTimers=0x70d8 OP_DzMemberList=0x15c4 +OP_DzMemberListName=0x2d17 +OP_DzMemberListStatus=0x0d98 +OP_DzSetLeaderName=0x2caf +OP_DzExpeditionEndsWarning=0x6ac2 OP_DzCompass=0x01cb OP_DzChooseZone=0x65e1 +OP_DzChooseZoneReply=0xa682 #shroud OP_ShroudSelectionWindow=0x72ad diff --git a/utils/scripts/eqemu_server.pl b/utils/scripts/eqemu_server.pl index a5ae9e7b8..da79fc448 100755 --- a/utils/scripts/eqemu_server.pl +++ b/utils/scripts/eqemu_server.pl @@ -6,7 +6,7 @@ #::: Automatic database versioning (bots and normal DB) #::: Updating server assets (binary, opcodes, maps, configuration files) #::: Original Author: Akkadius -#::: Contributors: Uleat +#::: Contributors: Uleat, Ali #::: Purpose: To upgrade databases with ease and maintain versioning ########################################################### @@ -17,13 +17,22 @@ use File::Path; use File::Find; use Time::HiRes qw(usleep); -#::: Variables -$install_repository_request_url = "https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/"; -$eqemu_repository_request_url = "https://raw.githubusercontent.com/EQEmu/Server/master/"; +############################################# +# variables +############################################# +my $install_repository_request_url = "https://raw.githubusercontent.com/Akkadius/eqemu-install-v2/master/"; +my $eqemu_repository_request_url = "https://raw.githubusercontent.com/EQEmu/Server/master/"; +my $opcodes_path = ""; +my $patches_path = ""; +my $time_stamp = strftime('%m-%d-%Y', gmtime()); +my $db_run_stage = 0; #::: Sets database run stage check +my $bin_dir = ""; -#::: Globals -$time_stamp = strftime('%m-%d-%Y', gmtime()); -$db_run_stage = 0; #::: Sets database run stage check +############################################# +# os +############################################# +my $OS = ""; +my $os_flavor = ""; if ($Config{osname} =~ /freebsd|linux/i) { $OS = "Linux"; $os_flavor = ""; @@ -41,21 +50,45 @@ if ($Config{osname} =~ /Win|MS/i) { $OS = "Windows"; } -$has_internet_connection = check_internet_connection(); +############################################# +# internet check +############################################# +my $has_internet_connection = check_internet_connection(); if (-e "skip_internet_connection_check.txt") { $has_internet_connection = 1; } -($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); - -if (-e "eqemu_server_skip_update.txt") { +############################################# +# skip self update +############################################# +my $skip_self_update_check = 0; +if (-e "eqemu_server_skip_update.txt" || defined($ENV{'EQEMU_SERVER_SKIP_UPDATE'})) { + print "[Info] Skipping self check\n"; $skip_self_update_check = 1; } -#::: Check for script self update +############################################# +# skip maps update +############################################# +my $skip_self_maps_update_check = 0; +if (-e "eqemu_server_skip_maps_update.txt" || defined($ENV{'EQEMU_SERVER_SKIP_MAPS_UPDATE'})) { + print "[Info] Skipping maps update\n"; + $skip_self_maps_update_check = 1; +} + +############################################# +# bin dir +############################################# +if (-d "bin") { + $bin_dir = "bin/"; +} + +############################################# +# run routines +############################################# +get_windows_wget(); check_xml_to_json_conversion() if $ARGV[0] eq "convert_xml"; do_self_update_check_routine() if !$skip_self_update_check; -get_windows_wget(); get_perl_version(); if (-e "eqemu_config.json") { read_eqemu_config_json(); @@ -74,30 +107,41 @@ if (-e "eqemu_update.pl") { print "[Info] For EQEmu Server management utilities - run eqemu_server.pl\n" if $ARGV[0] eq "ran_from_world"; -check_db_version_table(); +my $skip_checks = 0; +if ($ARGV[0] && ($ARGV[0] eq "new_server" || $ARGV[0] eq "new_server_with_bots")) { + $skip_checks = 1; +} -#::: Check if db_version table exists... -if (trim(get_mysql_result("SHOW COLUMNS FROM db_version LIKE 'Revision'")) ne "" && $db) { - print get_mysql_result("DROP TABLE db_version"); - print "[Database] Old db_version table present, dropping...\n\n"; +if ($skip_checks == 0) { + check_db_version_table(); + + #::: Check if db_version table exists... + if (trim(get_mysql_result("SHOW COLUMNS FROM db_version LIKE 'Revision'")) ne "" && $db) { + print get_mysql_result("DROP TABLE db_version"); + print "[Database] Old db_version table present, dropping...\n\n"; + } } check_for_world_bootup_database_update(); -sub urlencode { + +sub urlencode +{ my ($rv) = @_; - $rv =~ s/([^A-Za-z0-9])/sprintf("%%%2.2X", ord($1))/ge; + $rv =~ s/([^A-Za-z0-9])/sprintf("%%%2.2X", ord($1)) /ge; return $rv; } -sub urldecode { +sub urldecode +{ my ($rv) = @_; $rv =~ s/\+/ /g; - $rv =~ s/%(..)/pack("c", hex($1))/ge; + $rv =~ s/%(..)/pack("c", hex($1)) /ge; return $rv; } -sub analytics_insertion { +sub analytics_insertion +{ $event_name = urlencode($_[0]); $event_data = urlencode($_[1]); @@ -166,7 +210,8 @@ sub analytics_insertion { } } -sub show_install_summary_info { +sub show_install_summary_info +{ print "[Install] Installation complete...\n"; print "[Install] Server Info (Save somewhere if needed):\n"; @@ -195,18 +240,21 @@ sub show_install_summary_info { } if ($OS eq "Linux") { print "[Install] Linux Utility Scripts:\n"; - print " - server_start.sh Starts EQEmu server (Quiet) with 30 dynamic zones, UCS & Queryserv, dynamic zones\n"; - print " - server_start_dev.sh Starts EQEmu server with 10 dynamic zones, UCS & Queryserv, dynamic zones all verbose\n"; - print " - server_stop.sh Stops EQEmu Server (No warning)\n"; - print " - server_status.sh Prints the status of the EQEmu Server processes\n"; + print " - server_start.sh Starts EQEmu server (Quiet) with 30 dynamic zones, UCS & Queryserv, dynamic zones\n"; + print " - server_start_with_login.sh Starts EQEmu server (Quiet) with 30 dynamic zones, UCS & Queryserv, dynamic zones\n"; + print " - server_start_dev.sh Starts EQEmu server with 10 dynamic zones, UCS & Queryserv, dynamic zones all verbose\n"; + print " - server_stop.sh Stops EQEmu Server (No warning)\n"; + print " - server_status.sh Prints the status of the EQEmu Server processes\n"; } - print "[Configure] eqemu_config.xml Edit to change server settings and name\n"; + print "[Configure] eqemu_config.json Edit to change server settings and name\n"; analytics_insertion("install_complete", "null"); } -sub new_server { +sub new_server +{ + $build_options = $_[0]; $file_count = 0; opendir(DIR, ".") or die $!; while (my $file = readdir(DIR)) { @@ -221,9 +269,7 @@ sub new_server { exit; } - if (-e "install_variables.txt" || -e "../install_variables.txt") { - get_installation_variables(); - } + get_installation_variables(); while (1) { @@ -247,14 +293,15 @@ sub new_server { check_for_input("MySQL Password: "); $database_password = trim($input); - $check_connection = `mysql -u $database_user -p$database_password -N -B -e "SHOW PROCESSLIST" > mysqlcheck.txt`; - $mysql_pass = 0; + $check_connection = + `mysql -u $database_user -p$database_password -N -B -e "SHOW PROCESSLIST" > mysqlcheck.txt`; + $mysql_pass = 0; open(MYSQL_CHECK, "mysqlcheck.txt"); while () { chomp; - $o = $_; - if ($o =~ /Error/i) { $mysql_pass = 0; } - if ($o =~ /SHOW PROCESSLIST/i) { $mysql_pass = 1; } + $o = $_; + if ($o =~ /Error/i) {$mysql_pass = 0;} + if ($o =~ /SHOW PROCESSLIST/i) {$mysql_pass = 1;} } close(MYSQL_CHECK); unlink("mysqlcheck.txt"); @@ -262,7 +309,7 @@ sub new_server { if ($mysql_pass == 1) { - if ((!-e "install_variables.txt" && !-e "../install_variables.txt")) { + if ($database_name eq "" && !-e "install_variables.txt" && !-e "../install_variables.txt") { print "[New Server] Success! We have a database connection\n"; check_for_input("Specify a NEW database name that PEQ will be installed to: "); @@ -278,17 +325,19 @@ sub new_server { } analytics_insertion("new_server::install", $database_name); - if ($OS eq "Linux") { - build_linux_source("login"); - } + # This shouldn't be necessary, as we call do_linux_login_server_setup as the last step in do_installer_routines() + # if ($OS eq "Linux") { + # build_linux_source("login"); + # } - do_installer_routines(); + do_installer_routines($build_options); if ($OS eq "Linux") { print `chmod 755 *.sh`; } - analytics_insertion("new_server::install_complete", $database_name . " :: Binary DB Version / Local DB Version :: " . $binary_database_version . " / " . $local_database_version); + analytics_insertion("new_server::install_complete", + $database_name . " :: Binary DB Version / Local DB Version :: " . $binary_database_version . " / " . $local_database_version); print "[New Server] New server folder install complete\n"; print "[New Server] Below is your installation info:\n"; @@ -309,16 +358,19 @@ sub new_server { } } -sub check_xml_to_json_conversion { +sub check_xml_to_json_conversion +{ if (-e "eqemu_config.xml" && !-e "eqemu_config.json") { if ($OS eq "Windows") { - get_remote_file("https://raw.githubusercontent.com/EQEmu/Server/master/utils/xmltojson/xmltojson-windows-x86.exe", "xmltojson.exe"); + get_remote_file("https://raw.githubusercontent.com/EQEmu/Server/master/utils/xmltojson/xmltojson-windows-x86.exe", + "xmltojson.exe"); print "Converting eqemu_config.xml to eqemu_config.json\n"; print `xmltojson eqemu_config.xml`; } if ($OS eq "Linux") { - get_remote_file("https://raw.githubusercontent.com/EQEmu/Server/master/utils/xmltojson/xmltojson-linux-x86", "xmltojson"); + get_remote_file("https://raw.githubusercontent.com/EQEmu/Server/master/utils/xmltojson/xmltojson-linux-x86", + "xmltojson"); print "Converting eqemu_config.xml to eqemu_config.json\n"; print `chmod 755 xmltojson`; print `./xmltojson eqemu_config.xml`; @@ -338,10 +390,10 @@ sub check_xml_to_json_conversion { $result = $json->decode($content); $json->canonical(1); - print $json->pretty->indent_length(5)->utf8->encode($result), "\n"; + print $json->pretty->utf8->encode($result), "\n"; open(my $fh, '>', 'eqemu_config.json'); - print $fh $json->pretty->indent_length(5)->utf8->encode($result); + print $fh $json->pretty->utf8->encode($result); close $fh; mkdir('backups'); @@ -364,8 +416,8 @@ sub check_xml_to_json_conversion { } -sub build_linux_source { - +sub build_linux_source +{ $build_options = $_[0]; $cmake_options = ""; @@ -384,7 +436,9 @@ sub build_linux_source { } } my $eqemu_server_directory = "/home/eqemu"; - my $source_dir = $eqemu_server_directory . '/' . $last_directory . '_source' . $source_folder_post_fix; + # source between bots and not is the same, just different build results, so use the same source folder, different build folders + my $source_dir = $eqemu_server_directory . '/' . $last_directory . '_source'; + my $build_dir = $eqemu_server_directory . '/' . $last_directory . '_build' . $source_folder_post_fix; $current_directory = trim($current_directory); @@ -396,22 +450,22 @@ sub build_linux_source { chdir($source_dir); - print `git clone https://github.com/EQEmu/Server.git`; - - mkdir($source_dir . "/Server/build") if (!-e $source_dir . "/Server/build"); - chdir($source_dir . "/Server"); - - print `git submodule init`; - print `git submodule update`; - - chdir($source_dir . "/Server/build"); - - print "Generating CMake build files...\n"; - if ($os_flavor eq "fedora_core") { - print `cmake $cmake_options -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -DLUA_INCLUDE_DIR=/usr/include/lua-5.1/ -G "Unix Makefiles" ..`; + if (!-d "$source_dir/.git") { + print `git clone --recurse-submodules https://github.com/EQEmu/Server.git $source_dir`; } else { - print `cmake $cmake_options -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -G "Unix Makefiles" ..`; + print `git pull --recurse-submodules`; + } + + mkdir($build_dir) if (!-e $build_dir); + chdir($build_dir); + + print "Generating CMake build files...\n"; + if ($os_flavor eq "fedora_core") { + print `cmake $cmake_options -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -DLUA_INCLUDE_DIR=/usr/include/lua-5.1/ -G "Unix Makefiles" $source_dir`; + } + else { + print `cmake $cmake_options -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -G "Unix Makefiles" $source_dir`; } print "Building EQEmu Server code. This will take a while."; @@ -420,26 +474,31 @@ sub build_linux_source { chdir($current_directory); - print `ln -s -f $source_dir/Server/build/bin/eqlaunch .`; - print `ln -s -f $source_dir/Server/build/bin/export_client_files .`; - print `ln -s -f $source_dir/Server/build/bin/import_client_files .`; - print `ln -s -f $source_dir/Server/build/bin/libcommon.a .`; - print `ln -s -f $source_dir/Server/build/bin/libluabind.a .`; - print `ln -s -f $source_dir/Server/build/bin/queryserv .`; - print `ln -s -f $source_dir/Server/build/bin/shared_memory .`; - print `ln -s -f $source_dir/Server/build/bin/ucs .`; - print `ln -s -f $source_dir/Server/build/bin/world .`; - print `ln -s -f $source_dir/Server/build/bin/zone .`; - print `ln -s -f $source_dir/Server/build/bin/loginserver .`; + print `ln -s -f $build_dir/bin/eqlaunch .`; + print `ln -s -f $build_dir/bin/export_client_files .`; + print `ln -s -f $build_dir/bin/import_client_files .`; + print `ln -s -f $build_dir/bin/libcommon.a .`; + print `ln -s -f $build_dir/bin/libluabind.a .`; + print `ln -s -f $build_dir/bin/queryserv .`; + print `ln -s -f $build_dir/bin/shared_memory .`; + print `ln -s -f $build_dir/bin/ucs .`; + print `ln -s -f $build_dir/bin/world .`; + print `ln -s -f $build_dir/bin/zone .`; + print `ln -s -f $build_dir/bin/loginserver .`; } -sub do_installer_routines { +sub do_installer_routines +{ + $build_options = $_[0]; print "[Install] EQEmu Server Installer... LOADING... PLEASE WAIT...\n"; #::: Make some local server directories... mkdir('logs'); mkdir('updates_staged'); mkdir('shared'); + mkdir('bin'); + + $bin_dir = "bin/"; do_install_config_json(); read_eqemu_config_json(); @@ -452,15 +511,10 @@ sub do_installer_routines { #::: Download assets if ($OS eq "Windows") { - # fetch_latest_windows_binaries(); fetch_latest_windows_appveyor(); - get_remote_file($install_repository_request_url . "lua51.dll", "lua51.dll", 1); - get_remote_file($install_repository_request_url . "zlib1.dll", "zlib1.dll", 1); - get_remote_file($install_repository_request_url . "zlib1.pdb", "zlib1.pdb", 1); - get_remote_file($install_repository_request_url . "libmysql.dll", "libmysql.dll", 1); } - map_files_fetch_bulk(); + map_files_fetch_bulk() if !$skip_self_maps_update_check; opcodes_fetch(); plugins_fetch(); quest_files_fetch(); @@ -468,24 +522,43 @@ sub do_installer_routines { fetch_utility_scripts(); #::: Database Routines + $root_user = $user; + $root_password = $pass; print "[Database] Creating Database '" . $db_name . "'\n"; - print `"$path" --host $host --user $user --password="$pass" -N -B -e "DROP DATABASE IF EXISTS $db_name;"`; - print `"$path" --host $host --user $user --password="$pass" -N -B -e "CREATE DATABASE $db_name"`; + if (defined($ENV{'MYSQL_ROOT_PASSWORD'})) + { + # In the case that the user doesn't have privileges to create databases, support passing in the root password during setup + print "[Database] Using 'root' for database management.\n"; + $root_user = "root"; + $root_password = $ENV{'MYSQL_ROOT_PASSWORD'}; + } + print `"$path" --host $host --user $root_user --password="$root_password" -N -B -e "DROP DATABASE IF EXISTS $db_name;"`; + print `"$path" --host $host --user $root_user --password="$root_password" -N -B -e "CREATE DATABASE $db_name"`; + if (defined($ENV{'MYSQL_ROOT_PASSWORD'})) + { + # If we used root, make sure $user has permissions on db + print "[Database] Assigning ALL PRIVILEGES to $user on $db_name.\n"; + print `"$path" --host $host --user $root_user --password="$root_password" -N -B -e "GRANT ALL PRIVILEGES ON $db_name.* TO '$user.%'"`; + print `"$path" --host $host --user $root_user --password="$root_password" -N -B -e "FLUSH PRIVILEGES"`; + } my $world_path = "world"; if (-e "bin/world") { $world_path = "bin/world"; } + elsif (-e "bin/world.exe") { + $world_path = "bin/world.exe"; + } #::: Get Binary DB version if ($OS eq "Windows") { - @db_version = split(': ', `$world_path db_version`); + @db_version = split(': ', `"$world_path" db_version`); } if ($OS eq "Linux") { @db_version = split(': ', `./$world_path db_version`); } - $binary_database_version = trim($db_version[1]); + $binary_database_version = trim($db_version[1]); #::: Local DB Version check_db_version_table(); @@ -496,6 +569,11 @@ sub do_installer_routines { print "[Database] Fetching and Applying Latest Database Updates...\n"; main_db_management(); + # if bots + if ($build_options =~ /bots/i) { + bots_db_management(); + } + remove_duplicate_rule_values(); if ($OS eq "Windows") { @@ -503,37 +581,50 @@ sub do_installer_routines { do_windows_login_server_setup(); } if ($OS eq "Linux") { - do_linux_login_server_setup(); + do_linux_login_server_setup($build_options); } } -sub check_for_input { +sub check_for_input +{ print "[Input] " . $_[0]; $input = ; chomp $input; } -sub check_for_world_bootup_database_update { +sub check_for_world_bootup_database_update +{ my $world_path = "world"; if (-e "bin/world") { $world_path = "bin/world"; } + elsif (-e "bin/world.exe") { + $world_path = "bin/world.exe"; + } - #::: Get Binary DB version - if ($OS eq "Windows") { - @db_version = split(': ', `$world_path db_version`); + $binary_database_version = 0; + $local_database_version = 0; + + # Usually hit during installer when world hasn't been installed yet... + if (-e $world_path) { + if ($OS eq "Windows") { + @db_version = split(': ', `"$world_path" db_version`); + } + if ($OS eq "Linux") { + @db_version = split(': ', `./$world_path db_version`); + } + + $binary_database_version = trim($db_version[1]); + $local_database_version = get_main_db_version(); } - if ($OS eq "Linux") { - @db_version = split(': ', `./$world_path db_version`); - } - - $binary_database_version = trim($db_version[1]); - $local_database_version = get_main_db_version(); if ($binary_database_version == $local_database_version && $ARGV[0] eq "ran_from_world") { print "[Update] Database up to date...\n"; - exit; + if (trim($db_version[2]) == 0) { + print "[Update] Continuing bootup\n"; + exit; + } } else { #::: We ran world - Database needs to update, lets backup and run updates and continue world bootup @@ -545,17 +636,18 @@ sub check_for_world_bootup_database_update { print "[Update] Updating database...\n"; sleep(1); main_db_management(); - - analytics_insertion("auto database upgrade world", $db . " :: Binary DB Version / Local DB Version :: " . $binary_database_version . " / " . $local_database_version); + + analytics_insertion("auto database upgrade world", + $db . " :: Binary DB Version / Local DB Version :: " . $binary_database_version . " / " . $local_database_version); } #::: Make sure that we didn't pass any arugments to the script else { if ($local_database_version > $binary_database_version) { print "[Update] Database version is ahead of current binaries...\n"; - } - - if (!$db) { print "[eqemu_server.pl] No database connection found... Running without\n"; } + } + + if (!$db) {print "[eqemu_server.pl] No database connection found... Running without\n";} show_menu_prompt(); } } @@ -564,7 +656,7 @@ sub check_for_world_bootup_database_update { $binary_database_version = trim($db_version[2]); if ($binary_database_version > 0) { $local_database_version = get_bots_db_version(); - + #::: We ran world - Database needs to update, lets backup and run updates and continue world bootup if ($binary_database_version == $local_database_version && $ARGV[0] eq "ran_from_world") { print "[Update] Bots database up to date...\n"; @@ -579,26 +671,28 @@ sub check_for_world_bootup_database_update { print "[Update] Updating bots database...\n"; sleep(1); bots_db_management(); - - analytics_insertion("auto database bots upgrade world", $db . " :: Binary DB Version / Local DB Version :: " . $binary_database_version . " / " . $local_database_version); + + analytics_insertion("auto database bots upgrade world", + $db . " :: Binary DB Version / Local DB Version :: " . $binary_database_version . " / " . $local_database_version); } - + #::: Make sure that we didn't pass any arugments to the script else { if ($local_database_version > $binary_database_version) { print "[Update] Bots database version is ahead of current binaries...\n"; } - - if (!$db) { print "[eqemu_server.pl] No database connection found... Running without\n"; } + + if (!$db) {print "[eqemu_server.pl] No database connection found... Running without\n";} show_menu_prompt(); } } } - + print "[Update] Continuing bootup\n"; } -sub check_internet_connection { +sub check_internet_connection +{ if ($OS eq "Linux") { $count = "c"; } @@ -620,7 +714,8 @@ sub check_internet_connection { } } -sub get_perl_version { +sub get_perl_version +{ #::: Check Perl version $perl_version = $^V; $perl_version =~ s/v//g; @@ -632,13 +727,17 @@ sub get_perl_version { } sub get_windows_wget { - if (!-e "wget.exe" && $OS eq "Windows") { + if (!-e "bin/wget.exe" && $OS eq "Windows") { + if (!-d "bin") { + mkdir("bin"); + } eval "use LWP::Simple qw(getstore);"; - getstore("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/wget.exe", "wget.exe"); + getstore("https://raw.githubusercontent.com/Akkadius/eqemu-install-v2/master/windows/wget.exe", "bin\\wget.exe"); } } -sub do_self_update_check_routine { +sub do_self_update_check_routine +{ #::: Check for internet connection before updating if (!$has_internet_connection) { @@ -647,7 +746,12 @@ sub do_self_update_check_routine { } #::: Check for script changes :: eqemu_server.pl - get_remote_file($eqemu_repository_request_url . "utils/scripts/eqemu_server.pl", "updates_staged/eqemu_server.pl", 0, 1, 1); + get_remote_file($eqemu_repository_request_url . "utils/scripts/eqemu_server.pl", + "updates_staged/eqemu_server.pl", + 0, + 1, + 1 + ); if (-e "updates_staged/eqemu_server.pl") { @@ -660,14 +764,14 @@ sub do_self_update_check_routine { my @files; my $start_dir = "updates_staged/"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { if ($file =~ /eqemu_server/i) { $destination_file = $file; $destination_file =~ s/updates_staged\///g; - print "[Install] Installing :: " . $destination_file . "\n"; + print "[Install] Installing [" . $destination_file . "]\n"; unlink($destination_file); copy_file($file, $destination_file); if ($OS eq "Linux") { @@ -695,7 +799,14 @@ sub do_self_update_check_routine { } } -sub get_installation_variables { +sub get_installation_variables +{ + # Read installation variables from the ENV if set, but override them with install_variables.txt + if ($ENV{"MYSQL_HOST"}) { $installation_variables{"mysql_host"} = $ENV{"MYSQL_HOST"}; } + if ($ENV{"MYSQL_DATABASE"}) { $installation_variables{"mysql_eqemu_db_name"} = $ENV{"MYSQL_DATABASE"}; } + if ($ENV{"MYSQL_USER"}) { $installation_variables{"mysql_eqemu_user"} = $ENV{"MYSQL_USER"} } + if ($ENV{"MYSQL_PASSWORD"}) { $installation_variables{"mysql_eqemu_password"} = $ENV{"MYSQL_PASSWORD"} } + #::: Fetch installation variables before building the config if ($OS eq "Linux") { if (-e "../install_variables.txt") { @@ -717,7 +828,8 @@ sub get_installation_variables { close(INSTALL_VARS); } -sub do_install_config_json { +sub do_install_config_json +{ get_installation_variables(); #::: Fetch json template @@ -746,25 +858,33 @@ sub do_install_config_json { $db_name = "peq"; } - $config->{"server"}{"database"}{"username"} = $installation_variables{"mysql_eqemu_user"}; - $config->{"server"}{"database"}{"password"} = $installation_variables{"mysql_eqemu_password"}; - $config->{"server"}{"database"}{"db"} = $db_name; + if ($installation_variables{"mysql_host"}) { + $host = $installation_variables{"mysql_host"}; + } + else { + $host = "127.0.0.1"; + } + $config->{"server"}{"database"}{"host"} = $host; + $config->{"server"}{"database"}{"username"} = $installation_variables{"mysql_eqemu_user"}; + $config->{"server"}{"database"}{"password"} = $installation_variables{"mysql_eqemu_password"}; + $config->{"server"}{"database"}{"db"} = $db_name; + $config->{"server"}{"qsdatabase"}{"host"} = $host; $config->{"server"}{"qsdatabase"}{"username"} = $installation_variables{"mysql_eqemu_user"}; $config->{"server"}{"qsdatabase"}{"password"} = $installation_variables{"mysql_eqemu_password"}; $config->{"server"}{"qsdatabase"}{"db"} = $db_name; $json->canonical(1); - $json->indent_length(5); open(my $fh, '>', 'eqemu_config.json'); - print $fh $json->pretty->indent_length(5)->utf8->encode($config); + print $fh $json->pretty->utf8->encode($config); close $fh; unlink("eqemu_config_template.json"); } -sub do_install_config_login_json { +sub do_install_config_login_json +{ get_installation_variables(); #::: Fetch json template @@ -789,31 +909,68 @@ sub do_install_config_login_json { $db_name = "peq"; } - $config->{"database"}{"host"} = "127.0.0.1"; - $config->{"database"}{"user"} = $installation_variables{"mysql_eqemu_user"}; - $config->{"database"}{"password"} = $installation_variables{"mysql_eqemu_password"}; - $config->{"database"}{"db"} = $db_name; + if ($installation_variables{"mysql_host"}) { + $host = $installation_variables{"mysql_host"}; + } + else { + $host = "127.0.0.1"; + } + + $config->{"database"}{"host"} = $host; + $config->{"database"}{"user"} = $installation_variables{"mysql_eqemu_user"}; + $config->{"database"}{"password"} = $installation_variables{"mysql_eqemu_password"}; + $config->{"database"}{"db"} = $db_name; + $config->{"client_configuration"}{"titanium_opcodes"} = $opcodes_path . "login_opcodes.conf"; + $config->{"client_configuration"}{"sod_opcodes"} = $opcodes_path . "login_opcodes_sod.conf"; $json->canonical(1); - $json->indent_length(5); open(my $fh, '>', 'login.json'); - print $fh $json->pretty->indent_length(5)->utf8->encode($config); + print $fh $json->pretty->utf8->encode($config); close $fh; unlink("login_template.json"); } -sub fetch_utility_scripts { +sub fetch_utility_scripts +{ if ($OS eq "Windows") { - get_remote_file($install_repository_request_url . "t_database_backup.bat", "t_database_backup.bat"); - get_remote_file($install_repository_request_url . "t_start_server.bat", "t_start_server.bat"); - get_remote_file($install_repository_request_url . "t_server_update_binaries_no_bots.bat", "t_server_update_binaries_no_bots.bat"); - get_remote_file($install_repository_request_url . "t_start_server_with_login_server.bat", "t_start_server_with_login_server.bat"); - get_remote_file($install_repository_request_url . "t_stop_server.bat", "t_stop_server.bat"); - get_remote_file($install_repository_request_url . "t_server_crash_report.pl", "t_server_crash_report.pl"); - get_remote_file($install_repository_request_url . "win_server_launcher.pl", "win_server_launcher.pl"); - get_remote_file($install_repository_request_url . "t_start_server_with_login_server.bat", "t_start_server_with_login_server.bat"); + + opendir(DIR, "bin/"); + my @files = grep(/\.exe$/, readdir(DIR)); + closedir(DIR); + + foreach my $file (@files) { + my $full_file = "bin/" . $file; + + if ($file=~/test|launch/i) { + next; + } + + print "Creating Symbolic Link for [$file] from [$full_file]\n"; + system("del start_$file >nul 2>&1"); + system("powershell.exe \"New-Item -ItemType SymbolicLink -Name 'start_$file' -Value '$full_file'\" >nul 2>&1"); + } + + get_remote_file($install_repository_request_url . "windows/t_database_backup.bat", "t_database_backup.bat"); + get_remote_file($install_repository_request_url . "windows/t_start_server.bat", "t_start_server.bat"); + get_remote_file($install_repository_request_url . "windows/t_server_update_binaries_no_bots.bat", + "t_server_update_binaries_no_bots.bat"); + get_remote_file($install_repository_request_url . "windows/t_start_server_with_login_server.bat", + "t_start_server_with_login_server.bat"); + get_remote_file($install_repository_request_url . "windows/t_stop_server.bat", "t_stop_server.bat"); + get_remote_file($install_repository_request_url . "windows/t_server_crash_report.pl", "t_server_crash_report.pl"); + get_remote_file($install_repository_request_url . "windows/win_server_launcher.pl", "win_server_launcher.pl"); + get_remote_file($install_repository_request_url . "windows/t_start_server_with_login_server.bat", + "t_start_server_with_login_server.bat"); + get_remote_file( + $install_repository_request_url . "windows/t_set_gm_account.bat", + "t_set_gm_account.bat" + ); + get_remote_file( + $install_repository_request_url . "windows/windows_server_readme.html", + "windows_server_readme.html" + ); } else { get_remote_file($install_repository_request_url . "linux/server_launcher.pl", "server_launcher.pl"); @@ -824,7 +981,8 @@ sub fetch_utility_scripts { } } -sub setup_bots { +sub setup_bots +{ if ($OS eq "Windows") { fetch_latest_windows_appveyor_bots(); } @@ -836,7 +994,8 @@ sub setup_bots { print "Bots should be setup, run your server and the bot command should be available in-game (type '^help')\n"; } -sub show_menu_prompt { +sub show_menu_prompt +{ $dc = 0; while (1) { @@ -948,10 +1107,6 @@ sub show_menu_prompt { fetch_latest_windows_appveyor(); $dc = 1; } - elsif ($input eq "windows_server_download_bots") { - fetch_latest_windows_binaries_bots(); - $dc = 1; - } elsif ($input eq "windows_server_latest_bots") { fetch_latest_windows_appveyor_bots(); $dc = 1; @@ -980,6 +1135,10 @@ sub show_menu_prompt { new_server(); $dc = 1; } + elsif ($input eq "new_server_with_bots") { + new_server("bots"); + $dc = 1; + } elsif ($input eq "setup_bots") { setup_bots(); $dc = 1; @@ -1042,22 +1201,25 @@ sub show_menu_prompt { } } -sub print_main_menu { +sub print_main_menu +{ print "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"; print ">>> EQEmu Server Main Menu >>>>>>>>>>>>\n"; print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"; - print " [database] Enter database management menu \n"; - print " [assets] Manage server assets \n"; - print " [new_server] New folder EQEmu/PEQ install - Assumes MySQL/Perl installed \n"; - print " [setup_bots] Enables bots on server - builds code and database requirements \n"; - print " [conversions] Routines used for conversion of scripts/data \n"; + print " [database] Enter database management menu \n"; + print " [assets] Manage server assets \n"; + print " [new_server] New folder EQEmu/PEQ install - Assumes MySQL/Perl installed \n"; + print " [new_server_with_bots] New folder EQEmu/PEQ install with bots enabled - Assumes MySQL/Perl installed \n"; + print " [setup_bots] Enables bots on server - builds code and database requirements \n"; + print " [conversions] Routines used for conversion of scripts/data \n"; print "\n"; print " exit \n"; print "\n"; print "Enter a command #> "; } -sub get_mysql_path { +sub get_mysql_path +{ if ($OS eq "Windows") { $has_mysql_path = `echo %PATH%`; if ($has_mysql_path =~ /MySQL|MariaDB/i) { @@ -1086,7 +1248,8 @@ sub get_mysql_path { } } -sub check_for_database_dump_script { +sub check_for_database_dump_script +{ #::: Check for internet connection before updating if (!$has_internet_connection) { print "[Update] Cannot check update without internet connection...\n"; @@ -1094,7 +1257,11 @@ sub check_for_database_dump_script { } #::: Check for script changes :: database_dumper.pl - get_remote_file($eqemu_repository_request_url . "utils/scripts/database_dumper.pl", "updates_staged/database_dumper.pl", 0, 1, 1); + get_remote_file($eqemu_repository_request_url . "utils/scripts/database_dumper.pl", + "updates_staged/database_dumper.pl", + 0, + 1, + 1); if (-e "updates_staged/database_dumper.pl") { @@ -1107,14 +1274,14 @@ sub check_for_database_dump_script { my @files; my $start_dir = "updates_staged/"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { if ($file =~ /database_dumper/i) { $destination_file = $file; $destination_file =~ s/updates_staged\///g; - print "[Install] Installing :: " . $destination_file . "\n"; + print "[Install] Installing [" . $destination_file . "]\n"; unlink($destination_file); copy_file($file, $destination_file); if ($OS eq "Linux") { @@ -1135,16 +1302,19 @@ sub check_for_database_dump_script { } -sub database_dump { +sub database_dump +{ check_for_database_dump_script(); print "[Database] Performing database backup....\n"; print `perl database_dumper.pl database="$db" loc="backups"`; } -sub database_dump_player_tables { +sub database_dump_player_tables +{ check_for_database_dump_script(); print "[Database] Performing database backup of player tables....\n"; - get_remote_file($eqemu_repository_request_url . "utils/sql/character_table_list.txt", "backups/character_table_list.txt"); + get_remote_file($eqemu_repository_request_url . "utils/sql/character_table_list.txt", + "backups/character_table_list.txt"); $tables = ""; open(FILE, "backups/character_table_list.txt"); @@ -1164,41 +1334,46 @@ sub database_dump_player_tables { } -sub database_dump_compress { +sub database_dump_compress +{ check_for_database_dump_script(); print "[Database] Performing database backup....\n"; print `perl database_dumper.pl database="$db" loc="backups" compress`; } -sub script_exit { +sub script_exit +{ #::: Cleanup staged folder... rmtree("updates_staged/"); exit; } -sub check_db_version_table { +sub check_db_version_table +{ if (get_mysql_result("SHOW TABLES LIKE 'db_version'") eq "" && $db) { + print "[Database] Table 'db_version' does not exist.... Creating...\n\n"; print get_mysql_result(" CREATE TABLE db_version ( version int(11) DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO db_version (version) VALUES ('1000');"); - print "[Database] Table 'db_version' does not exist.... Creating...\n\n"; } } #::: Returns Tab Delimited MySQL Result from Command Line -sub get_mysql_result { +sub get_mysql_result +{ my $run_query = $_[0]; - if (!$db) { return; } - if ($OS eq "Windows") { return `"$path" --host $host --user $user --password="$pass" $db -N -B -e "$run_query"`; } + if (!$db) {return;} + if ($OS eq "Windows") {return `"$path" --host $host --user $user --password="$pass" $db -N -B -e "$run_query"`;} if ($OS eq "Linux") { $run_query =~ s/`//g; return `$path --user="$user" --host $host --password="$pass" $db -N -B -e "$run_query"`; } } -sub get_mysql_result_from_file { +sub get_mysql_result_from_file +{ my $update_file = $_[0]; if (!$db) { return; @@ -1215,7 +1390,8 @@ sub get_mysql_result_from_file { #::: Gets Remote File based on request_url (1st Arg), and saves to destination file (2nd Arg) #::: Example: get_remote_file($eqemu_repository_request_url . "utils/sql/db_update_manifest.txt", "db_update/db_update_manifest.txt"); -sub get_remote_file { +sub get_remote_file +{ my $request_url = $_[0]; my $destination_file = $_[1]; my $content_type = $_[2]; @@ -1238,7 +1414,7 @@ sub get_remote_file { # print "checking '" . $build_path . "'\n"; #::: If path does not exist, create the directory... if (!-d $build_path) { - print "[Copy] folder doesn't exist, creating '" . $build_path . "'\n"; + print "[Copy] folder doesn't exist, creating [" . $build_path . "]\n"; mkdir($build_path); } if (!$directory_indexr_path[$directory_index + 2] && $directory_indexr_path[$directory_index + 1]) { @@ -1251,8 +1427,13 @@ sub get_remote_file { } #::: wget -O db_update/db_update_manifest.txt https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt - $wget = `wget -N --no-cache --cache=no --no-check-certificate --quiet -O $destination_file $request_url`; - print "[Download] Saved: (" . $destination_file . ") from " . $request_url . "\n" if !$silent_download; + if ($OS eq "Linux") { + $wget = `wget -N --no-cache --cache=no --no-check-certificate --quiet -O $destination_file $request_url`; + } + elsif ($OS eq "Windows") { + $wget = `bin\\wget.exe -N --no-cache --cache=no --no-check-certificate --quiet -O $destination_file $request_url`; + } + print "[Download] Saved [" . $destination_file . "] from [" . $request_url . "]\n" if !$silent_download; if ($wget =~ /unable to resolve/i) { print "Error, no connection or failed request...\n\n"; #die; @@ -1261,14 +1442,16 @@ sub get_remote_file { } #::: Trim Whitespaces -sub trim { +sub trim +{ my $string = $_[0]; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; } -sub read_eqemu_config_xml { +sub read_eqemu_config_xml +{ open(CONFIG, "eqemu_config.xml"); while () { chomp; @@ -1315,7 +1498,8 @@ sub read_eqemu_config_xml { close(CONFIG); } -sub read_eqemu_config_json { +sub read_eqemu_config_json +{ use JSON; my $json = new JSON(); @@ -1328,31 +1512,35 @@ sub read_eqemu_config_json { $config = $json->decode($content); - $db = $config->{"server"}{"database"}{"db"}; - $host = $config->{"server"}{"database"}{"host"}; - $user = $config->{"server"}{"database"}{"username"}; - $pass = $config->{"server"}{"database"}{"password"}; - + $db = $config->{"server"}{"database"}{"db"}; + $host = $config->{"server"}{"database"}{"host"}; + $user = $config->{"server"}{"database"}{"username"}; + $pass = $config->{"server"}{"database"}{"password"}; + $opcodes_path = $config->{"server"}{"directories"}{"opcodes"}; + $patches_path = $config->{"server"}{"directories"}{"patches"}; } #::: Fetch Latest PEQ AA's -sub aa_fetch { +sub aa_fetch +{ if (!$db) { - print "No database present, check your eqemu_config.xml for proper MySQL/MariaDB configuration...\n"; + print "No database present, check your eqemu_config.json for proper MySQL/MariaDB configuration...\n"; return; } print "[Install] Pulling down PEQ AA Tables...\n"; - get_remote_file($eqemu_repository_request_url . "utils/sql/peq_aa_tables_post_rework.sql", "db_update/peq_aa_tables_post_rework.sql"); + get_remote_file($eqemu_repository_request_url . "utils/sql/peq_aa_tables_post_rework.sql", + "db_update/peq_aa_tables_post_rework.sql"); print "[Install] Installing AA Tables...\n"; print get_mysql_result_from_file("db_update/peq_aa_tables_post_rework.sql"); print "[Install] Done...\n\n"; } #::: Fetch Latest Opcodes -sub opcodes_fetch { +sub opcodes_fetch +{ print "[Update] Pulling down latest opcodes...\n"; - %opcodes = ( + my %opcodes = ( 1 => [ "opcodes", $eqemu_repository_request_url . "utils/patches/opcodes.conf" ], 2 => [ "mail_opcodes", $eqemu_repository_request_url . "utils/patches/mail_opcodes.conf" ], 3 => [ "Titanium", $eqemu_repository_request_url . "utils/patches/patch_Titanium.conf" ], @@ -1362,23 +1550,29 @@ sub opcodes_fetch { 7 => [ "Rain of Fear", $eqemu_repository_request_url . "utils/patches/patch_RoF.conf" ], 8 => [ "Rain of Fear 2", $eqemu_repository_request_url . "utils/patches/patch_RoF2.conf" ], ); - $loop = 1; + my $loop = 1; while ($opcodes{$loop}[0]) { #::: Split the request_url by the patches folder to get the file name from request_url - @real_file = split("patches/", $opcodes{$loop}[1]); - $find = 0; + my @real_file = split("patches/", $opcodes{$loop}[1]); + my $find = 0; while ($real_file[$find]) { $file_name = $real_file[$find]; $find++; } - get_remote_file($opcodes{$loop}[1], $file_name); + my $file_path = $opcodes_path; + if ($file_name =~ /patch_/i) { + $file_path = $patches_path; + } + + get_remote_file($opcodes{$loop}[1], $file_path . $file_name); $loop++; } print "[Update] Done...\n"; } -sub remove_duplicate_rule_values { +sub remove_duplicate_rule_values +{ $ruleset_id = trim(get_mysql_result("SELECT `ruleset_id` FROM `rule_sets` WHERE `name` = 'default'")); print "[Database] Default Ruleset ID: " . $ruleset_id . "\n"; @@ -1407,10 +1601,11 @@ sub remove_duplicate_rule_values { print "[Database] Total duplicate rules removed... " . $total_removed . "\n"; } -sub copy_file { +sub copy_file +{ $l_source_file = $_[0]; $l_destination_file = $_[1]; - + if ($l_destination_file =~ /\//i) { my @directory_path = split('/', $l_destination_file); $build_path = ""; @@ -1429,126 +1624,110 @@ sub copy_file { $directory_index++; } } - + copy $l_source_file, $l_destination_file; } -sub fetch_latest_windows_appveyor { +sub fetch_latest_windows_appveyor +{ print "[Update] Fetching Latest Windows Binaries (unstable) from Appveyor... \n"; - get_remote_file("https://ci.appveyor.com/api/projects/KimLS/server/artifacts/eqemu-x86-no-bots.zip", "updates_staged/eqemu-x86-no-bots.zip", 1); + get_remote_file("https://ci.appveyor.com/api/projects/KimLS/server-pglwk/artifacts/build_x64.zip", + "updates_staged/build_x64.zip", + 1 + ); print "[Update] Fetched Latest Windows Binaries (unstable) from Appveyor... \n"; print "[Update] Extracting... --- \n"; - unzip('updates_staged/eqemu-x86-no-bots.zip', 'updates_staged/binaries/'); + unzip('updates_staged/build_x64.zip', 'updates_staged/binaries/'); my @files; my $start_dir = "updates_staged/binaries"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { - $destination_file = $file; + my $destination_file = $file; $destination_file =~ s/updates_staged\/binaries\///g; - print "[Update] Installing :: " . $destination_file . "\n"; - copy_file($file, $destination_file); + print "[Update] Installing [" . $bin_dir . $destination_file . "]\n"; + copy_file($file, $bin_dir . $destination_file); } print "[Update] Done\n"; rmtree('updates_staged'); } -sub fetch_latest_windows_binaries { +sub fetch_latest_windows_binaries +{ print "[Update] Fetching Latest Windows Binaries... \n"; - get_remote_file($install_repository_request_url . "master_windows_build.zip", "updates_staged/master_windows_build.zip", 1); + get_remote_file($install_repository_request_url . "master_windows_build.zip", + "updates_staged/master_windows_build.zip", + 1 + ); print "[Update] Fetched Latest Windows Binaries... \n"; print "[Update] Extracting... --- \n"; unzip('updates_staged/master_windows_build.zip', 'updates_staged/binaries/'); my @files; my $start_dir = "updates_staged/binaries"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { - $destination_file = $file; + my $destination_file = $file; $destination_file =~ s/updates_staged\/binaries\///g; - print "[Update] Installing :: " . $destination_file . "\n"; - copy_file($file, $destination_file); + print "[Update] Installing [" . $bin_dir . $destination_file . "]\n"; + copy_file($file, $bin_dir . $destination_file); } print "[Update] Done\n"; rmtree('updates_staged'); } -sub fetch_latest_windows_appveyor_bots { +sub fetch_latest_windows_appveyor_bots +{ print "[Update] Fetching Latest Windows Binaries with Bots (unstable) from Appveyor... \n"; - get_remote_file("https://ci.appveyor.com/api/projects/KimLS/server/artifacts/eqemu-x86-bots.zip", "updates_staged/eqemu-x86-bots.zip", 1); + get_remote_file("https://ci.appveyor.com/api/projects/KimLS/server-87crp/artifacts/build_x64.zip", + "updates_staged/eqemu-x64-bots.zip", + 1); print "[Update] Fetched Latest Windows Binaries (unstable) from Appveyor... \n"; print "[Update] Extracting... --- \n"; - unzip('updates_staged/eqemu-x86-bots.zip', 'updates_staged/binaries/'); + unzip('updates_staged/eqemu-x64-bots.zip', 'updates_staged/binaries/'); my @files; my $start_dir = "updates_staged/binaries"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { $destination_file = $file; $destination_file =~ s/updates_staged\/binaries\///g; - print "[Update] Installing :: " . $destination_file . "\n"; - copy_file($file, $destination_file); + print "[Update] Installing [" . $bin_dir . $destination_file . "]\n"; + copy_file($file, $bin_dir . $destination_file); } print "[Update] Done\n"; rmtree('updates_staged'); } -sub fetch_latest_windows_binaries_bots { - print "[Update] Fetching Latest Windows Binaries with Bots...\n"; - get_remote_file($install_repository_request_url . "master_windows_build_bots.zip", "updates_staged/master_windows_build_bots.zip", 1); - - print "[Update] Fetched Latest Windows Binaries with Bots...\n"; - print "[Update] Extracting...\n"; - unzip('updates_staged/master_windows_build_bots.zip', 'updates_staged/binaries/'); - my @files; - my $start_dir = "updates_staged/binaries"; - find( - sub { push @files, $File::Find::name unless -d; }, - $start_dir - ); - for my $file (@files) { - $destination_file = $file; - $destination_file =~ s/updates_staged\/binaries\///g; - print "[Install] Installing :: " . $destination_file . "\n"; - copy_file($file, $destination_file); - } - print "[Update] Done...\n"; - - rmtree('updates_staged'); -} - -sub do_windows_login_server_setup { - print "[Install] Fetching Loginserver... \n"; - get_remote_file($install_repository_request_url . "login_server.zip", "updates_staged/login_server.zip", 1); - print "[Install] Extracting... \n"; - unzip('updates_staged/login_server.zip', 'updates_staged/login_server/'); - my @files; - my $start_dir = "updates_staged/login_server"; - find( - sub { push @files, $File::Find::name unless -d; }, - $start_dir - ); - for my $file (@files) { - $destination_file = $file; - $destination_file =~ s/updates_staged\/login_server\///g; - print "[Install] Installing :: " . $destination_file . "\n"; - copy_file($file, $destination_file); - } - print "[Install] Done... \n"; - +sub do_windows_login_server_setup +{ print "[Install] Pulling down Loginserver database tables...\n"; - get_remote_file($eqemu_repository_request_url . "loginserver/login_util/login_schema.sql", "db_update/login_schema.sql"); + get_remote_file( + $eqemu_repository_request_url . "loginserver/login_util/login_schema.sql", + "db_update/login_schema.sql" + ); + + get_remote_file( + $eqemu_repository_request_url . "loginserver/login_util/login_opcodes_sod.conf", + $opcodes_path . "login_opcodes_sod.conf" + ); + + get_remote_file( + $eqemu_repository_request_url . "loginserver/login_util/login_opcodes.conf", + $opcodes_path . "login_opcodes.conf" + ); + print "[Install] Installing Loginserver tables...\n"; print get_mysql_result_from_file("db_update/login_schema.sql"); print "[Install] Done...\n"; @@ -1568,20 +1747,21 @@ sub do_windows_login_server_setup { } -sub do_linux_login_server_setup { - - build_linux_source(); +sub do_linux_login_server_setup +{ + build_linux_source($_[0]); for my $file (@files) { $destination_file = $file; $destination_file =~ s/updates_staged\/login_server\///g; - print "[Install] Installing :: " . $destination_file . "\n"; + print "[Install] Installing [" . $destination_file . "]\n"; copy_file($file, $destination_file); } print "\n Done... \n"; print "[Install] Pulling down Loginserver database tables...\n"; - get_remote_file($eqemu_repository_request_url . "loginserver/login_util/login_schema.sql", "db_update/login_schema.sql"); + get_remote_file($eqemu_repository_request_url . "loginserver/login_util/login_schema.sql", + "db_update/login_schema.sql"); print "[Install] Installing Loginserver tables...\n"; print get_mysql_result_from_file("db_update/login_schema.sql"); print "[Install] Done...\n\n"; @@ -1593,8 +1773,9 @@ sub do_linux_login_server_setup { rmtree('updates_staged'); rmtree('db_update'); - get_remote_file($install_repository_request_url . "linux/login_opcodes.conf", "login_opcodes.conf"); - get_remote_file($install_repository_request_url . "linux/login_opcodes_sod.conf", "login_opcodes_sod.conf"); + get_remote_file($install_repository_request_url . "linux/login_opcodes.conf", $opcodes_path . "login_opcodes.conf"); + get_remote_file($install_repository_request_url . "linux/login_opcodes_sod.conf", + $opcodes_path . "login_opcodes_sod.conf"); get_remote_file($install_repository_request_url . "linux/server_start_with_login.sh", "server_start_with_login.sh"); system("chmod 755 *.sh"); @@ -1604,7 +1785,8 @@ sub do_linux_login_server_setup { } -sub add_login_server_firewall_rules { +sub add_login_server_firewall_rules +{ #::: Check Loginserver Firewall install for Windows if ($OS eq "Windows") { $output = `netsh advfirewall firewall show rule name=all`; @@ -1616,11 +1798,11 @@ sub add_login_server_firewall_rules { $val =~ s/Rule Name://g; if ($val =~ /EQEmu Loginserver/i && $val =~ /Titanium/i) { $has_loginserver_rules_titanium = 1; - print "[Install] Found existing rule :: " . trim($val) . "\n"; + print "[Install] Found existing rule [" . trim($val) . "]\n"; } if ($val =~ /EQEmu Loginserver/i && $val =~ /SOD/i) { $has_loginserver_rules_sod = 1; - print "[Install] Found existing rule :: " . trim($val) . "\n"; + print "[Install] Found existing rule [" . trim($val) . "]\n"; } } } @@ -1662,7 +1844,8 @@ sub add_login_server_firewall_rules { } } -sub check_windows_firewall_rules { +sub check_windows_firewall_rules +{ $output = `netsh advfirewall firewall show rule name=all`; @output_buffer = split("\n", $output); $has_world_rules = 0; @@ -1672,11 +1855,11 @@ sub check_windows_firewall_rules { $val =~ s/Rule Name://g; if ($val =~ /EQEmu World/i) { $has_world_rules = 1; - print "[Install] Found existing rule :: " . trim($val) . "\n"; + print "[Install] Found existing rule [" . trim($val) . "]\n"; } if ($val =~ /EQEmu Zone/i) { $has_zone_rules = 1; - print "[Install] Found existing rule :: " . trim($val) . "\n"; + print "[Install] Found existing rule [" . trim($val) . "]\n"; } } } @@ -1695,52 +1878,51 @@ sub check_windows_firewall_rules { } } -sub fetch_server_dlls { - print "[Download] Fetching lua51.dll, zlib1.dll, zlib1.pdb, libmysql.dll...\n"; - get_remote_file($install_repository_request_url . "lua51.dll", "lua51.dll", 1); - get_remote_file($install_repository_request_url . "zlib1.dll", "zlib1.dll", 1); - get_remote_file($install_repository_request_url . "zlib1.pdb", "zlib1.pdb", 1); - get_remote_file($install_repository_request_url . "libmysql.dll", "libmysql.dll", 1); +sub fetch_server_dlls +{ + # print "[Download] Fetching lua51.dll, zlib1.dll, zlib1.pdb, libmysql.dll...\n"; + # get_remote_file($install_repository_request_url . "lua51.dll", "lua51.dll", 1); + # get_remote_file($install_repository_request_url . "zlib1.dll", "zlib1.dll", 1); + # get_remote_file($install_repository_request_url . "zlib1.pdb", "zlib1.pdb", 1); + # get_remote_file($install_repository_request_url . "libmysql.dll", "libmysql.dll", 1); } -sub fetch_peq_db_full { +sub fetch_peq_db_full +{ print "[Install] Downloading latest PEQ Database... Please wait...\n"; - get_remote_file("http://edit.projecteq.net/weekly/peq_beta.zip", "updates_staged/peq_beta.zip", 1); + get_remote_file("http://db.projecteq.net/api/v1/dump/latest", "updates_staged/peq-latest.zip", 1); print "[Install] Downloaded latest PEQ Database... Extracting...\n"; - unzip('updates_staged/peq_beta.zip', 'updates_staged/peq_db/'); - my $start_dir = "updates_staged/peq_db"; + unzip('updates_staged/peq-latest.zip', 'updates_staged/peq_db/'); + my $start_dir = "updates_staged/peq_db/peq-dump"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { $destination_file = $file; - $destination_file =~ s/updates_staged\/peq_db\///g; - if ($file =~ /peqbeta|player_tables/i) { - print "[Install] DB :: Installing :: " . $destination_file . "\n"; + $destination_file =~ s/updates_staged\/peq_db\/peq-dump\///g; + if ($file =~ /create_tables_content|create_tables_login|create_tables_player|create_tables_queryserv|create_tables_state|create_tables_system/i) { + print "[Install] Database sourcing [" . $destination_file . "]\n"; get_mysql_result_from_file($file); } } - - #::: PEQ DB baseline version - print get_mysql_result("DELETE FROM db_version"); - print get_mysql_result("INSERT INTO `db_version` (`version`) VALUES (9130);"); } -sub map_files_fetch_bulk { +sub map_files_fetch_bulk +{ print "[Install] Fetching Latest Maps... (This could take a few minutes...)\n"; get_remote_file("http://github.com/Akkadius/EQEmuMaps/archive/master.zip", "maps/maps.zip", 1); unzip('maps/maps.zip', 'maps/'); my @files; my $start_dir = "maps/EQEmuMaps-master/"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { $destination_file = $file; $destination_file =~ s/maps\/EQEmuMaps-master\///g; - print "[Install] Installing :: " . $destination_file . "\n"; + print "[Install] Installing [" . $destination_file . "]\n"; copy_file($file, "maps/" . $destination_file); } print "[Install] Fetched Latest Maps\n"; @@ -1749,10 +1931,12 @@ sub map_files_fetch_bulk { unlink('maps/maps.zip'); } -sub map_files_fetch { +sub map_files_fetch +{ print "[Install] Fetching Latest Maps --- \n"; - get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/!eqemu_maps_manifest.txt", "updates_staged/eqemu_maps_manifest.txt"); + get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/!eqemu_maps_manifest.txt", + "updates_staged/eqemu_maps_manifest.txt"); #::: Get Data from manifest open(FILE, "updates_staged/eqemu_maps_manifest.txt"); @@ -1774,7 +1958,9 @@ sub map_files_fetch { my $file_existing_size = (stat $file_existing)[7]; if ($file_existing_size != $maps_manifest[$m][1]) { print "[Install] Updating: '" . $maps_manifest[$m][0] . "'\n"; - get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/" . $maps_manifest[$m][0], $maps_manifest[$m][0], 1); + get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuMaps/master/" . $maps_manifest[$m][0], + $maps_manifest[$m][0], + 1); $fc++; } } @@ -1784,10 +1970,13 @@ sub map_files_fetch { } } -sub quest_files_fetch { +sub quest_files_fetch +{ if (!-e "updates_staged/projecteqquests-master/") { print "[Update] Fetching Latest Quests --- \n"; - get_remote_file("https://codeload.github.com/ProjectEQ/projecteqquests/zip/master", "updates_staged/projecteqquests-master.zip", 1); + get_remote_file("https://codeload.github.com/ProjectEQ/projecteqquests/zip/master", + "updates_staged/projecteqquests-master.zip", + 1); print "[Install] Fetched latest quests...\n"; mkdir('updates_staged'); unzip('updates_staged/projecteqquests-master.zip', 'updates_staged/'); @@ -1800,7 +1989,7 @@ sub quest_files_fetch { my @files; my $start_dir = "updates_staged/projecteqquests-master/"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { @@ -1811,7 +2000,7 @@ sub quest_files_fetch { if (!-e $destination_file) { copy_file($staged_file, $destination_file); - print "[Install] Installing :: '" . $destination_file . "'\n"; + print "[Install] Installing [" . $destination_file . "]\n"; $fc++; } else { @@ -1820,7 +2009,7 @@ sub quest_files_fetch { $backup_dest = "updates_backups/" . $time_stamp . "/" . $destination_file; print $directory_indexff . "\n"; - print "[Update] File Different :: '" . $destination_file . "'\n"; + print "[Update] File Different [" . $destination_file . "]\n"; print "[Update] Do you wish to update this Quest? '" . $destination_file . "' [Yes (Enter) - No (N)] \nA backup will be found in '" . $backup_dest . "'\n"; my $input = ; if ($input =~ /N/i) {} @@ -1829,7 +2018,7 @@ sub quest_files_fetch { copy_file($destination_file, $backup_dest); #::: Copy staged to running copy($staged_file, $destination_file); - print "[Install] Installing :: '" . $destination_file . "'\n\n"; + print "[Install] Installing [" . $destination_file . "]\n\n"; } $fc++; } @@ -1840,14 +2029,17 @@ sub quest_files_fetch { if ($fc == 0) { print "[Update] No Quest Updates found... \n\n"; } - + rmtree("updates_staged/"); } -sub lua_modules_fetch { +sub lua_modules_fetch +{ if (!-e "updates_staged/projecteqquests-master/") { print "[Update] Fetching Latest lua modules --- \n"; - get_remote_file("https://codeload.github.com/ProjectEQ/projecteqquests/zip/master", "updates_staged/projecteqquests-master.zip", 1); + get_remote_file("https://codeload.github.com/ProjectEQ/projecteqquests/zip/master", + "updates_staged/projecteqquests-master.zip", + 1); print "[Install] Fetched latest lua modules...\n"; mkdir('updates_staged'); unzip('updates_staged/projecteqquests-master.zip', 'updates_staged/'); @@ -1862,7 +2054,7 @@ sub lua_modules_fetch { my @files; my $start_dir = "updates_staged/projecteqquests-master/lua_modules/"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { @@ -1873,7 +2065,7 @@ sub lua_modules_fetch { if (!-e $destination_file) { copy_file($staged_file, $destination_file); - print "[Install] Installing :: '" . $destination_file . "'\n"; + print "[Install] Installing [" . $destination_file . "]\n"; $fc++; } else { @@ -1881,7 +2073,7 @@ sub lua_modules_fetch { if ($directory_indexff ne "") { $backup_dest = "updates_backups/" . $time_stamp . "/" . $destination_file; print $directory_indexff . "\n"; - print "[Update] File Different :: '" . $destination_file . "'\n"; + print "[Update] File Different [" . $destination_file . "]\n"; print "[Update] Do you wish to update this LUA Module? '" . $destination_file . "' [Yes (Enter) - No (N)] \nA backup will be found in '" . $backup_dest . "'\n"; my $input = ; if ($input =~ /N/i) {} @@ -1890,7 +2082,7 @@ sub lua_modules_fetch { copy_file($destination_file, $backup_dest); #::: Copy staged to running copy($staged_file, $destination_file); - print "[Install] Installing :: '" . $destination_file . "'\n\n"; + print "[Install] Installing [" . $destination_file . "]\n\n"; } $fc++; } @@ -1903,10 +2095,13 @@ sub lua_modules_fetch { } } -sub plugins_fetch { +sub plugins_fetch +{ if (!-e "updates_staged/projecteqquests-master/") { print "[Update] Fetching Latest plugins --- \n"; - get_remote_file("https://codeload.github.com/ProjectEQ/projecteqquests/zip/master", "updates_staged/projecteqquests-master.zip", 1); + get_remote_file("https://codeload.github.com/ProjectEQ/projecteqquests/zip/master", + "updates_staged/projecteqquests-master.zip", + 1); print "[Install] Fetched latest plugins...\n"; mkdir('updates_staged'); unzip('updates_staged/projecteqquests-master.zip', 'updates_staged/'); @@ -1921,7 +2116,7 @@ sub plugins_fetch { my @files; my $start_dir = "updates_staged/projecteqquests-master/plugins/"; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { @@ -1932,7 +2127,7 @@ sub plugins_fetch { if (!-e $destination_file) { copy_file($staged_file, $destination_file); - print "[Install] Installing :: '" . $destination_file . "'\n"; + print "[Install] Installing [" . $destination_file . "]\n"; $fc++; } else { @@ -1940,7 +2135,7 @@ sub plugins_fetch { if ($directory_indexff ne "") { $backup_dest = "updates_backups/" . $time_stamp . "/" . $destination_file; print $directory_indexff . "\n"; - print "[Update] File Different :: '" . $destination_file . "'\n"; + print "[Update] File Different [" . $destination_file . "]\n"; print "[Update] Do you wish to update this Plugin? '" . $destination_file . "' [Yes (Enter) - No (N)] \nA backup will be found in '" . $backup_dest . "'\n"; my $input = ; if ($input =~ /N/i) {} @@ -1949,7 +2144,7 @@ sub plugins_fetch { copy_file($destination_file, $backup_dest); #::: Copy staged to running copy($staged_file, $destination_file); - print "[Install] Installing :: '" . $destination_file . "'\n\n"; + print "[Install] Installing [" . $destination_file . "]\n\n"; } $fc++; } @@ -1962,7 +2157,8 @@ sub plugins_fetch { } } -sub do_file_diff { +sub do_file_diff +{ $file_1 = $_[0]; $file_2 = $_[1]; if ($OS eq "Windows") { @@ -1976,7 +2172,8 @@ sub do_file_diff { } } -sub unzip { +sub unzip +{ $archive_to_unzip = $_[0]; $dest_folder = $_[1]; @@ -1994,7 +2191,8 @@ sub unzip { } } -sub are_file_sizes_different { +sub are_file_sizes_different +{ $file_1 = $_[0]; $file_2 = $_[1]; my $file_1 = (stat $file_1)[7]; @@ -2006,7 +2204,8 @@ sub are_file_sizes_different { return; } -sub do_bots_db_schema_drop { +sub do_bots_db_schema_drop +{ #"drop_bots.sql" is run before reverting database back to 'normal' print "[Database] Fetching drop_bots.sql...\n"; get_remote_file($eqemu_repository_request_url . "utils/sql/git/bots/drop_bots.sql", "db_update/drop_bots.sql"); @@ -2032,7 +2231,8 @@ sub do_bots_db_schema_drop { print "[Database] Done...\n"; } -sub modify_db_for_bots { +sub modify_db_for_bots +{ #Called after the db bots schema (2015_09_30_bots.sql) has been loaded print "[Database] Modifying database for bots...\n"; print get_mysql_result("UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298);"); @@ -2049,7 +2249,8 @@ sub modify_db_for_bots { convert_existing_bot_data(); } -sub convert_existing_bot_data { +sub convert_existing_bot_data +{ if (get_mysql_result("SHOW TABLES LIKE 'bots'") ne "" && $db) { print "[Database] Converting existing bot data...\n"; print get_mysql_result("INSERT INTO `bot_data` (`bot_id`, `owner_id`, `spells_id`, `name`, `last_name`, `zone_id`, `gender`, `race`, `class`, `level`, `creation_day`, `last_spawn`, `time_spawned`, `size`, `face`, `hair_color`, `hair_style`, `beard`, `beard_color`, `eye_color_1`, `eye_color_2`, `drakkin_heritage`, `drakkin_tattoo`, `drakkin_details`, `ac`, `atk`, `hp`, `mana`, `str`, `sta`, `cha`, `dex`, `int`, `agi`, `wis`, `fire`, `cold`, `magic`, `poison`, `disease`, `corruption`) SELECT `BotID`, `BotOwnerCharacterID`, `BotSpellsID`, `Name`, `LastName`, `LastZoneId`, `Gender`, `Race`, `Class`, `BotLevel`, UNIX_TIMESTAMP(`BotCreateDate`), UNIX_TIMESTAMP(`LastSpawnDate`), `TotalPlayTime`, `Size`, `Face`, `LuclinHairColor`, `LuclinHairStyle`, `LuclinBeard`, `LuclinBeardColor`, `LuclinEyeColor`, `LuclinEyeColor2`, `DrakkinHeritage`, `DrakkinTattoo`, `DrakkinDetails`, `AC`, `ATK`, `HP`, `Mana`, `STR`, `STA`, `CHA`, `DEX`, `_INT`, `AGI`, `WIS`, `FR`, `CR`, `MR`, `PR`, `DR`, `Corrup` FROM `bots`;"); @@ -2144,50 +2345,54 @@ sub convert_existing_bot_data { } } -sub get_main_db_version { +sub get_main_db_version +{ $main_local_db_version = trim(get_mysql_result("SELECT version FROM db_version LIMIT 1")); return $main_local_db_version; } -sub get_bots_db_version { +sub get_bots_db_version +{ #::: Check if bots_version column exists... if (get_mysql_result("SHOW COLUMNS FROM db_version LIKE 'bots_version'") eq "" && $db) { print get_mysql_result("ALTER TABLE db_version ADD bots_version int(11) DEFAULT '0' AFTER version;"); print "[Database] Column 'bots_version' does not exists.... Adding to 'db_version' table...\n\n"; } - + $bots_local_db_version = trim(get_mysql_result("SELECT bots_version FROM db_version LIMIT 1")); return $bots_local_db_version; } #::: Safe for call from world startup or menu option -sub bots_db_management { +sub bots_db_management +{ #::: If we have stale data from main db run if ($db_run_stage > 0 && $bots_db_management == 0) { clear_database_runs(); } - + #::: Main Binary Database version $binary_database_version = trim($db_version[2]); if ($binary_database_version == 0) { print "[Database] Your server binaries (world/zone) are not compiled for bots...\n\n"; return; } - $local_database_version = get_bots_db_version(); - + $local_database_version = get_bots_db_version(); + #::: Set on flag for running bot updates... $bots_db_management = 1; - + if ($local_database_version > $binary_database_version) { print "[Update] Bots database version is ahead of current binaries...\n"; return; } - + run_database_check(); } #::: Safe for call from world startup or menu option -sub main_db_management { +sub main_db_management +{ #::: If we have stale data from bots db run if ($db_run_stage > 0 && $bots_db_management == 1) { clear_database_runs(); @@ -2195,19 +2400,20 @@ sub main_db_management { #::: Main Binary Database version $binary_database_version = trim($db_version[1]); - $local_database_version = get_main_db_version(); + $local_database_version = get_main_db_version(); $bots_db_management = 0; - + if ($local_database_version > $binary_database_version) { print "[Update] Database version is ahead of current binaries...\n"; return; } - + run_database_check(); } -sub clear_database_runs { +sub clear_database_runs +{ # print "DEBUG :: clear_database_runs\n\n"; #::: Clear manifest data... %m_d = (); @@ -2216,27 +2422,30 @@ sub clear_database_runs { } #::: Responsible for Database Upgrade Routines -sub run_database_check { - +sub run_database_check +{ + if (!$db) { - print "No database present, check your eqemu_config.xml for proper MySQL/MariaDB configuration...\n"; + print "No database present, check your eqemu_config.json for proper MySQL/MariaDB configuration...\n"; return; } - + #::: Pull down bots database manifest if ($bots_db_management == 1) { print "[Database] Retrieving latest bots database manifest...\n"; - get_remote_file($eqemu_repository_request_url . "utils/sql/git/bots/bots_db_update_manifest.txt", "db_update/db_update_manifest.txt"); + get_remote_file($eqemu_repository_request_url . "utils/sql/git/bots/bots_db_update_manifest.txt", + "db_update/db_update_manifest.txt"); } #::: Pull down mainstream database manifest else { print "[Database] Retrieving latest database manifest...\n"; - get_remote_file($eqemu_repository_request_url . "utils/sql/db_update_manifest.txt", "db_update/db_update_manifest.txt"); + get_remote_file($eqemu_repository_request_url . "utils/sql/db_update_manifest.txt", + "db_update/db_update_manifest.txt"); } - + #::: Parse manifest print "[Database] Reading manifest...\n"; - + use Data::Dumper; open(FILE, "db_update/db_update_manifest.txt"); while () { @@ -2245,11 +2454,11 @@ sub run_database_check { if ($o =~ /#/i) { next; } - + @manifest = split('\|', $o); $m_d{$manifest[0]} = [ @manifest ]; } - + #::: This is where we set checkpoints for where a database might be so we don't check so far back in the manifest... if ($local_database_version >= 9000) { $revision_check = $local_database_version + 1; @@ -2261,21 +2470,21 @@ sub run_database_check { $revision_check = 8999; } } - + @total_updates = (); - + #::: Fetch and register sqls for this database update cycle for ($i = $revision_check; $i <= $binary_database_version; $i++) { if (!defined($m_d{$i}[0])) { next; } - + $file_name = trim($m_d{$i}[1]); print "[Database] fetching update: " . $i . " '" . $file_name . "' \n"; fetch_missing_db_update($i, $file_name); push(@total_updates, $i); } - + if (scalar(@total_updates) == 0) { print "[Database] No updates need to be run...\n"; if ($bots_db_management == 1) { @@ -2286,11 +2495,11 @@ sub run_database_check { print "[Database] Setting Database to Binary Version (" . $binary_database_version . ") if not already...\n\n"; get_mysql_result("UPDATE db_version SET version = $binary_database_version "); } - + clear_database_runs(); return; } - + #::: Execute pending updates @total_updates = sort @total_updates; foreach my $val (@total_updates) { @@ -2298,7 +2507,7 @@ sub run_database_check { $query_check = trim($m_d{$val}[2]); $match_type = trim($m_d{$val}[3]); $match_text = trim($m_d{$val}[4]); - + #::: Match type update if ($match_type eq "contains") { if (trim(get_mysql_result($query_check)) =~ /$match_text/i) { @@ -2344,23 +2553,23 @@ sub run_database_check { print_match_debug(); print_break(); } - + if ($bots_db_management == 1) { print get_mysql_result("UPDATE db_version SET bots_version = $val WHERE bots_version < $val"); - + if ($val == 9000) { modify_db_for_bots(); } } else { print get_mysql_result("UPDATE db_version SET version = $val WHERE version < $val"); - + if ($val == 9138) { fix_quest_factions(); } } } - + if ($bots_db_management == 1) { print "[Database] Bots database update cycle complete at version [" . get_bots_db_version() . "]\n"; } @@ -2369,40 +2578,46 @@ sub run_database_check { } } - -sub fetch_missing_db_update { +sub fetch_missing_db_update +{ $db_update = $_[0]; $update_file = $_[1]; - + if ($bots_db_management == 1) { if ($db_update >= 9000) { - get_remote_file($eqemu_repository_request_url . "utils/sql/git/bots/required/" . $update_file, "db_update/" . $update_file . ""); + get_remote_file($eqemu_repository_request_url . "utils/sql/git/bots/required/" . $update_file, + "db_update/" . $update_file . ""); } } else { if ($db_update >= 9000) { - get_remote_file($eqemu_repository_request_url . "utils/sql/git/required/" . $update_file, "db_update/" . $update_file . ""); + get_remote_file($eqemu_repository_request_url . "utils/sql/git/required/" . $update_file, + "db_update/" . $update_file . ""); } elsif ($db_update >= 5000 && $db_update <= 9000) { - get_remote_file($eqemu_repository_request_url . "utils/sql/svn/" . $update_file, "db_update/" . $update_file . ""); + get_remote_file($eqemu_repository_request_url . "utils/sql/svn/" . $update_file, + "db_update/" . $update_file . ""); } } } -sub print_match_debug { - if (!$debug) { return; } +sub print_match_debug +{ + if (!$debug) {return;} print " Match Type: '" . $match_type . "'\n"; print " Match Text: '" . $match_text . "'\n"; print " Query Check: '" . $query_check . "'\n"; print " Result: '" . trim(get_mysql_result($query_check)) . "'\n"; } -sub print_break { - if (!$debug) { return; } +sub print_break +{ + if (!$debug) {return;} print "\n==============================================\n"; } -sub generate_random_password { +sub generate_random_password +{ my $passwordsize = shift; my @alphanumeric = ('a' .. 'z', 'A' .. 'Z', 0 .. 9); my $randpassword = join '', @@ -2411,7 +2626,8 @@ sub generate_random_password { return $randpassword; } -sub quest_heading_convert { +sub quest_heading_convert +{ if (trim(get_mysql_result("SELECT value FROM variables WHERE varname = 'new_heading_conversion'")) eq "true") { print "Conversion script has already ran... doing this again would skew proper heading values in function calls...\n"; @@ -2436,13 +2652,13 @@ sub quest_heading_convert { my @files; my $start_dir = "quests/."; find( - sub { push @files, $File::Find::name unless -d; }, + sub {push @files, $File::Find::name unless -d;}, $start_dir ); for my $file (@files) { #::: Skip non script files - if ($file !~ /lua|pl/i) { next; } + if ($file !~ /lua|pl/i) {next;} if ($file =~ /lua|pl/i) { $print_buffer = ""; @@ -2543,126 +2759,129 @@ sub quest_heading_convert { print "Total matches: " . $total_matches . "\n"; } +sub quest_faction_convert +{ -sub quest_faction_convert { + if (trim(get_mysql_result("SELECT value FROM variables WHERE varname = 'new_faction_conversion'")) eq "true") { + print "Conversion script has already ran... doing this again would skew proper faction values in function calls...\n"; + exit; + } - if(trim(get_mysql_result("SELECT value FROM variables WHERE varname = 'new_faction_conversion'")) eq "true") { - print "Conversion script has already ran... doing this again would skew proper faction values in function calls...\n"; - exit; - } + %matches = ( + 0 => [ "GetCharacterFactionLevel", 0 ], + 1 => [ "GetModCharacterFactionLevel", 0 ], + 2 => [ "SetFactionLevel2", 1 ], + 3 => [ "GetFactionLevel", 5 ], + 4 => [ "CheckNPCFactionAlly", 0 ], + 5 => [ ":Faction", 0 ], + ); - %matches = ( - 0 => [ "GetCharacterFactionLevel", 0], - 1 => [ "GetModCharacterFactionLevel", 0], - 2 => [ "SetFactionLevel2", 1], - 3 => [ "GetFactionLevel", 5 ], - 4 => [ "CheckNPCFactionAlly", 0 ], - 5 => [ ":Faction", 0 ], - ); + $total_matches = 0; - $total_matches = 0; + use Scalar::Util qw(looks_like_number); - use Scalar::Util qw(looks_like_number); + my @files; + my $start_dir = "quests/."; + find( + sub {push @files, $File::Find::name unless -d;}, + $start_dir + ); + for my $file (@files) { - my @files; - my $start_dir = "quests/."; - find( - sub {push @files, $File::Find::name unless -d;}, - $start_dir - ); - for my $file (@files) { + #::: Skip non script files + if ($file !~ /lua|pl/i) { + next; + } - #::: Skip non script files - if ($file !~ /lua|pl/i) { - next; - } + if ($file =~ /lua|pl/i) { + $print_buffer = ""; + $changes_made = 0; - if ($file =~ /lua|pl/i) { - $print_buffer = ""; - $changes_made = 0; + #::: Open and read line by line + open(FILE, $file); + while () { + chomp; + $line = $_; - #::: Open and read line by line - open(FILE, $file); - while () { - chomp; - $line = $_; + #::: Loop through matches + foreach my $key (sort (keys %matches)) { + $argument_position = $matches{$key}[1]; + $match = $matches{$key}[0]; - #::: Loop through matches - foreach my $key (sort (keys %matches)) { - $argument_position = $matches{$key}[1]; - $match = $matches{$key}[0]; + if ($line =~ /$match\(/i || $line =~ /$match \(/i) { + $line_temp = $line; + $line_temp =~ s/^.*$match\(//gi; + $line_temp =~ s/^.*$match \(//gi; + $line_temp =~ s/"//g; + $line_temp =~ s/\);.*//; - if ($line =~ /$match\(/i || $line =~ /$match \(/i) { - $line_temp = $line; - $line_temp =~ s/^.*$match\(//gi; - $line_temp =~ s/^.*$match \(//gi; - $line_temp =~ s/"//g; - $line_temp =~ s/\);.*//; + @line_data = split(",", $line_temp); - @line_data = split(",", $line_temp); + $faction_value = $line_data[$argument_position]; + $faction_value_clean = trim($faction_value); - $faction_value = $line_data[$argument_position]; - $faction_value_clean = trim($faction_value); + if (looks_like_number($faction_value_clean)) { + $new_faction = + get_mysql_result("select clientid from client_server_faction_map where serverid = $faction_value_clean"); + chomp $new_faction; + if ($new_faction == 0) { + $new_faction = + get_mysql_result("select new_faction from custom_faction_mappings where old_faction = $faction_value_clean"); + chomp $new_faction; + } + if ($new_faction > 0) { + print "BEFORE: " . $line . "\n"; + $line =~ s/$faction_value_clean/$new_faction/g; + print "AFTER: " . $line . "\n"; + $changes_made = 1; + } + else { + print "Unknown Faction: '$match' FACTION VALUE: '" . $faction_value_clean . "'\n"; + } + } - if (looks_like_number($faction_value_clean)) { - $new_faction = get_mysql_result("select clientid from client_server_faction_map where serverid = $faction_value_clean"); - chomp $new_faction; - if ($new_faction == 0) { - $new_faction = get_mysql_result("select new_faction from custom_faction_mappings where old_faction = $faction_value_clean"); - chomp $new_faction; - } - if ($new_faction > 0) { - print "BEFORE: " . $line . "\n"; - $line =~ s/$faction_value_clean/$new_faction/g; - print "AFTER: " . $line . "\n"; - $changes_made = 1; - } - else { - print "Unknown Faction: '$match' FACTION VALUE: '" . $faction_value_clean . "'\n"; - } - } + $total_matches++; + } + } - $total_matches++; - } - } + $print_buffer .= $line . "\n"; + } + close(FILE); - $print_buffer .= $line . "\n"; - } - close(FILE); + #::: Write changes + if ($changes_made == 1) { + open(NEW_FILE, '>', $file); + print NEW_FILE $print_buffer; + close NEW_FILE; + } + } + } - #::: Write changes - if ($changes_made == 1) { - open(NEW_FILE, '>', $file); - print NEW_FILE $print_buffer; - close NEW_FILE; - } - } - } + #::: Mark conversion as ran + print get_mysql_result("INSERT INTO `variables` (varname, value, information, ts) VALUES ('new_faction_conversion', 'true', 'Script ran against quests folder to convert new faction values', NOW())"); - #::: Mark conversion as ran - print get_mysql_result("INSERT INTO `variables` (varname, value, information, ts) VALUES ('new_faction_conversion', 'true', 'Script ran against quests folder to convert new faction values', NOW())"); - - print "Total matches: " . $total_matches . "\n"; + print "Total matches: " . $total_matches . "\n"; } -sub fix_quest_factions { - # Backup the quests - mkdir('backups'); - my @files; - my $start_dir = "quests/"; - find( - sub { push @files, $File::Find::name unless -d; }, - $start_dir - ); - for my $file (@files) { - $destination_file = $file; - my $date = strftime "%m-%d-%Y", localtime; - $destination_file =~ s/quests/quests-$date/; - print "Backing up :: " . $destination_file . "\n"; -# unlink($destination_file); - copy_file($file, 'backups/' . $destination_file); - } +sub fix_quest_factions +{ + # Backup the quests + mkdir('backups'); + my @files; + my $start_dir = "quests/"; + find( + sub {push @files, $File::Find::name unless -d;}, + $start_dir + ); + for my $file (@files) { + $destination_file = $file; + my $date = strftime "%m-%d-%Y", localtime; + $destination_file =~ s/quests/quests-$date/; + print "Backing up :: " . $destination_file . "\n"; + # unlink($destination_file); + copy_file($file, 'backups/' . $destination_file); + } - # Fix the factions - quest_faction_convert(); + # Fix the factions + quest_faction_convert(); } diff --git a/utils/scripts/lua-doc-parser.pl b/utils/scripts/generators/lua-doc-parser.pl similarity index 100% rename from utils/scripts/lua-doc-parser.pl rename to utils/scripts/generators/lua-doc-parser.pl diff --git a/utils/scripts/perl-doc-parser.pl b/utils/scripts/generators/perl-doc-parser.pl similarity index 100% rename from utils/scripts/perl-doc-parser.pl rename to utils/scripts/generators/perl-doc-parser.pl diff --git a/utils/scripts/generators/repository-generator.pl b/utils/scripts/generators/repository-generator.pl new file mode 100644 index 000000000..99f8eb856 --- /dev/null +++ b/utils/scripts/generators/repository-generator.pl @@ -0,0 +1,482 @@ +#!/usr/bin/perl +# Author: Akkadius +# @file: repository-generator.pl +# @description: Script used to generate database repositories +# @example perl ~/code/utils/scripts/generators/repository-generator.pl ~/server/ [table|all] [base|extended|all] + +############################################# +# modules +############################################# +use warnings FATAL => 'all'; +no warnings 'experimental::smartmatch'; +use experimental 'smartmatch'; +use File::Find; +use Data::Dumper; +use DBI; +use DBD::mysql; +use JSON; +my $json = new JSON(); + +if (!$ARGV[0]) { + print "\@example perl ~/code/utils/scripts/generators/repository-generator.pl ~/server/ [table|all] [base|extended|all]\n"; + exit; +} + +############################################# +# args +############################################# +my $server_path = $ARGV[0]; +my $config_path = $server_path . "/eqemu_config.json"; +my $requested_table_to_generate = $ARGV[1] ? $ARGV[1] : "all"; +my $repository_generation_option = $ARGV[2] ? $ARGV[2] : "all"; + +############################################# +# world path +############################################# +my $world_binary = ($^O eq "MSWin32") ? "world.exe" : "world"; +my $world_path = $server_path . "/" . $world_binary; +my $world_path_bin = $server_path . "/bin/" . $world_binary; +my $found_world_path = ""; + +if (-e $world_path) { + $found_world_path = $world_path; +} +elsif (-e $world_path_bin) { + $found_world_path = $world_path_bin; +} + +if ($found_world_path eq "") { + print "Error! Cannot find world binary!\n"; + exit; +} + +############################################# +# validate config +############################################# +if (!-e $config_path) { + print "Error! Config file [$config_path] not found\n"; + exit; +} + +############################################# +# fetch schema from world +############################################# +my $output = `cd $server_path && $found_world_path database:schema`; +my $database_schema = $json->decode($output); + +############################################# +# database +############################################# +my $content; +open(my $fh, '<', $config_path) or die "cannot open file $config_path"; { + local $/; + $content = <$fh>; +} +close($fh); + +############################################# +# database +############################################# +my $config = $json->decode($content); +my $database_name = $config->{"server"}{"database"}{"db"}; +my $host = $config->{"server"}{"database"}{"host"}; +my $user = $config->{"server"}{"database"}{"username"}; +my $pass = $config->{"server"}{"database"}{"password"}; +my $port = $config->{"server"}{"database"}{"port"}; +my $dsn = "dbi:mysql:$database_name:$host:$port"; +my $connect = DBI->connect($dsn, $user, $pass); + +my @tables = (); +if ($requested_table_to_generate eq "all" || !$requested_table_to_generate) { + my $table_names_exec = $connect->prepare( + " + SELECT + TABLE_NAME + FROM + INFORMATION_SCHEMA.COLUMNS + WHERE + TABLE_SCHEMA = ? + GROUP BY + TABLE_NAME + "); + + $table_names_exec->execute($database_name); + + while (my @row = $table_names_exec->fetchrow_array()) { + push(@tables, $row[0]); + } +} + +if ($requested_table_to_generate ne "all") { + @tables = ($requested_table_to_generate); +} + +my $generated_base_repository_files = ""; +my $generated_repository_files = ""; + +foreach my $table_to_generate (@tables) { + + my $table_found_in_schema = 0; + + my @categories = ( + "content_tables", + "version_tables", + "state_tables", + "server_tables", + "player_tables", + "login_tables", + ); + + # These tables don't have a typical schema + my @table_ignore_list = ( + "character_enabledtasks", + "grid", # Manually created + "grid_entries", # Manually created + # "tradeskill_recipe", # Manually created + # "character_recipe_list", # Manually created + "guild_bank", + "inventory_versions", + "raid_leaders", + "sharedbank", + "trader_audit", + "eqtime", + "db_version", + "keyring", + "profanity_list", + "zone_flags", + ); + + foreach my $category (@categories) { + if ($table_to_generate ~~ $database_schema->{$category}) { + $table_found_in_schema = 1; + } + } + + if ($table_to_generate ~~ @table_ignore_list) { + print "Table [$table_to_generate] is on ignore list... skipping...\n"; + $table_found_in_schema = 0; + } + + if ($table_found_in_schema == 0) { + print "Table [$table_to_generate] not found in schema, skipping\n"; + next; + } + + my $ex = $connect->prepare( + " + SELECT + COLUMN_NAME, + TABLE_NAME, + DATA_TYPE, + COLUMN_TYPE, + ORDINAL_POSITION, + COLUMN_KEY, + COLUMN_DEFAULT, + EXTRA + FROM + INFORMATION_SCHEMA.COLUMNS + WHERE + TABLE_SCHEMA = ? + AND TABLE_NAME = ? + ORDER BY TABLE_NAME, ORDINAL_POSITION + " + ); + + $ex->execute($database_name, $table_to_generate); + + my $longest_column_length = 0; + my $longest_data_type_length = 0; + while (my @row = $ex->fetchrow_array()) { + my $column_name = $row[0]; + my $data_type = $row[2]; + + if ($longest_column_length < length($column_name)) { + $longest_column_length = length($column_name); + } + + my $struct_data_type = translate_mysql_data_type_to_c($data_type); + + if ($longest_data_type_length < length($struct_data_type)) { + $longest_data_type_length = length($struct_data_type); + } + } + + # 2nd pass + my $default_entries = ""; + my $insert_one_entries = ""; + my $insert_many_entries = ""; + my $find_one_entries = ""; + my $column_names_quoted = ""; + my $table_struct_columns = ""; + my $update_one_entries = ""; + my $all_entries = ""; + my $index = 0; + my %table_data = (); + my %table_primary_key = (); + $ex->execute($database_name, $table_to_generate); + + while (my @row = $ex->fetchrow_array()) { + my $column_name = $row[0]; + my $table_name = $row[1]; + my $data_type = $row[2]; + my $column_type = $row[3]; + my $ordinal_position = $row[4]; + my $column_key = $row[5]; + my $column_default = ($row[6] ? $row[6] : ""); + my $extra = ($row[7] ? $row[7] : ""); + + if (!$table_primary_key{$table_name}) { + if (($column_key eq "PRI" && $data_type =~/int/) || ($ordinal_position == 0 && $column_name =~ /id/i)) { + $table_primary_key{$table_name} = $column_name; + } + } + + my $default_value = 0; + if ($column_default ne "NULL" && $column_default ne "") { + $column_default =~ s/'/"/g; + $default_value = $column_default; + } + elsif ($column_default eq "''") { + $default_value = '""'; + } + elsif ((trim($column_default) eq "" || $column_default eq "NULL") && $column_type =~ /text|varchar|datetime/i) { + $default_value = '""'; + } + + my $struct_data_type = translate_mysql_data_type_to_c($data_type); + + # struct + $table_struct_columns .= sprintf("\t\t\%-${longest_data_type_length}s %s;\n", $struct_data_type, $column_name); + + # new entity + $default_entries .= sprintf("\t\tentry.%-${longest_column_length}s = %s;\n", $column_name, $default_value); + + # column names (string) + $column_names_quoted .= sprintf("\t\t\t\"%s\",\n", $column_name); + + # update one + if ($extra ne "auto_increment") { + my $query_value = sprintf('\'" + EscapeString(%s_entry.%s) + "\'");', $table_name, $column_name); + if ($data_type =~ /int|float|double|decimal/) { + $query_value = sprintf('" + std::to_string(%s_entry.%s));', $table_name, $column_name); + } + + $update_one_entries .= sprintf( + "\t\t" . 'update_values.push_back(columns[%s] + " = %s' . "\n", + $index, + $query_value + ); + } + + # insert + my $value = sprintf("\"'\" + EscapeString(%s_entry.%s) + \"'\"", $table_name, $column_name); + if ($data_type =~ /int|float|double|decimal/) { + $value = sprintf('std::to_string(%s_entry.%s)', $table_name, $column_name); + } + + $insert_one_entries .= sprintf("\t\tinsert_values.push_back(%s);\n", $value); + $insert_many_entries .= sprintf("\t\t\tinsert_values.push_back(%s);\n", $value); + + # find one / all (select) + if ($data_type =~ /int/) { + $all_entries .= sprintf("\t\t\tentry.%-${longest_column_length}s = atoi(row[%s]);\n", $column_name, $index); + $find_one_entries .= sprintf("\t\t\tentry.%-${longest_column_length}s = atoi(row[%s]);\n", $column_name, $index); + } + elsif ($data_type =~ /float|double|decimal/) { + $all_entries .= sprintf("\t\t\tentry.%-${longest_column_length}s = static_cast(atof(row[%s]));\n", $column_name, $index); + $find_one_entries .= sprintf("\t\t\tentry.%-${longest_column_length}s = static_cast(atof(row[%s]));\n", $column_name, $index); + } + else { + $all_entries .= sprintf("\t\t\tentry.%-${longest_column_length}s = row[%s] ? row[%s] : \"\";\n", $column_name, $index, $index); + $find_one_entries .= sprintf("\t\t\tentry.%-${longest_column_length}s = row[%s] ? row[%s] : \"\";\n", $column_name, $index, $index); + } + + # print $column_name . "\n"; + + # print "table_name [$table_name] column_name [$column_name] data_type [$data_type] column_type [$column_type]\n"; + + $index++; + + } + + if (!$table_primary_key{$table_to_generate}) { + print "Table primary key [$table_to_generate] has no primary key! Skipping... \n"; + next; + } + + ############################################# + # base repository template + ############################################# + my $base_repository_template_file = './common/repositories/template/base_repository.template'; + my $base_repository_template = ""; + if (-e $base_repository_template_file) { + open(my $fh, '<:encoding(UTF-8)', $base_repository_template_file) or die "Could not open file '$base_repository_template_file' $!"; + + while (my $line = <$fh>) { + $base_repository_template .= $line; + } + + close $fh; + } + + if (trim($base_repository_template) eq "") { + print "Base repository template not found! [$base_repository_template_file]\n"; + exit; + } + + ############################################# + # repository template + ############################################# + my $repository_template_file = './common/repositories/template/repository.template'; + my $repository_template = ""; + if (-e $repository_template_file) { + open(my $fh, '<:encoding(UTF-8)', $repository_template_file) or die "Could not open file '$repository_template_file' $!"; + + while (my $line = <$fh>) { + $repository_template .= $line; + } + + close $fh; + } + + if (trim($repository_template_file) eq "") { + print "Repository template not found! [$repository_template_file]\n"; + exit; + } + + my $table_name_camel_case = $table_to_generate; + my $table_name_upper_case = uc($table_to_generate); + $table_name_camel_case =~ s#(_|^)(.)#\u$2#g; + my $primary_key = ($table_primary_key{$table_to_generate} ? $table_primary_key{$table_to_generate} : ""); + my $database_connection = "database"; + + if ($table_to_generate ~~ $database_schema->{"content_tables"}) { + $database_connection = "content_db"; + } + + chomp($column_names_quoted); + chomp($table_struct_columns); + chomp($default_entries); + chomp($update_one_entries); + chomp($insert_one_entries); + chomp($insert_many_entries); + chomp($all_entries); + + use POSIX qw(strftime); + my $generated_date = strftime "%b%e, %Y", localtime; + + print "Table name CamelCase [$table_name_camel_case]\n"; + print "Table name UPPER_CASE [$table_name_upper_case]\n"; + print "Table PRIMARY KEY [$primary_key]\n"; + print "Database connection [$database_connection]\n"; + + # Base repository + my $new_base_repository = $base_repository_template; + $new_base_repository =~ s/\{\{TABLE_NAME_CLASS}}/$table_name_camel_case/g; + $new_base_repository =~ s/\{\{TABLE_NAME_UPPER}}/$table_name_upper_case/g; + $new_base_repository =~ s/\{\{PRIMARY_KEY_STRING}}/$primary_key/g; + $new_base_repository =~ s/\{\{TABLE_NAME_STRUCT}}/$table_name_camel_case/g; + $new_base_repository =~ s/\{\{TABLE_NAME_VAR}}/$table_to_generate/g; + $new_base_repository =~ s/\{\{DATABASE_CONNECTION}}/$database_connection/g; + $new_base_repository =~ s/\{\{DEFAULT_ENTRIES}}/$default_entries/g; + $new_base_repository =~ s/\{\{COLUMNS_LIST_QUOTED}}/$column_names_quoted/g; + $new_base_repository =~ s/\{\{TABLE_STRUCT_COLUMNS}}/$table_struct_columns/g; + $new_base_repository =~ s/\{\{FIND_ONE_ENTRIES}}/$find_one_entries/g; + $new_base_repository =~ s/\{\{UPDATE_ONE_ENTRIES}}/$update_one_entries/g; + $new_base_repository =~ s/\{\{INSERT_ONE_ENTRIES}}/$insert_one_entries/g; + $new_base_repository =~ s/\{\{INSERT_MANY_ENTRIES}}/$insert_many_entries/g; + $new_base_repository =~ s/\{\{ALL_ENTRIES}}/$all_entries/g; + $new_base_repository =~ s/\{\{GENERATED_DATE}}/$generated_date/g; + + # Extended repository + my $new_repository = $repository_template; + $new_repository =~ s/\{\{TABLE_NAME_CLASS}}/$table_name_camel_case/g; + $new_repository =~ s/\{\{TABLE_NAME_UPPER}}/$table_name_upper_case/g; + $new_repository =~ s/\{\{PRIMARY_KEY_STRING}}/$primary_key/g; + $new_repository =~ s/\{\{TABLE_NAME_STRUCT}}/$table_name_camel_case/g; + $new_repository =~ s/\{\{TABLE_NAME_VAR}}/$table_to_generate/g; + $new_repository =~ s/\{\{DATABASE_CONNECTION}}/$database_connection/g; + $new_repository =~ s/\{\{DEFAULT_ENTRIES}}/$default_entries/g; + $new_repository =~ s/\{\{COLUMNS_LIST_QUOTED}}/$column_names_quoted/g; + $new_repository =~ s/\{\{TABLE_STRUCT_COLUMNS}}/$table_struct_columns/g; + $new_repository =~ s/\{\{FIND_ONE_ENTRIES}}/$find_one_entries/g; + $new_repository =~ s/\{\{UPDATE_ONE_ENTRIES}}/$update_one_entries/g; + $new_repository =~ s/\{\{INSERT_ONE_ENTRIES}}/$insert_one_entries/g; + $new_repository =~ s/\{\{INSERT_MANY_ENTRIES}}/$insert_many_entries/g; + $new_repository =~ s/\{\{ALL_ENTRIES}}/$all_entries/g; + $new_repository =~ s/\{\{GENERATED_DATE}}/$generated_date/g; + + if ($repository_generation_option eq "all" || $repository_generation_option eq "base") { + print $new_base_repository; + } + + if ($repository_generation_option eq "all" || $repository_generation_option eq "extended") { + print $new_repository; + } + + ############################################# + # write base repository + ############################################# + if ($repository_generation_option eq "all" || $repository_generation_option eq "base") { + my $generated_base_repository = './common/repositories/base/base_' . $table_to_generate . '_repository.h'; + my $cmake_generated_base_reference = $generated_base_repository; + $cmake_generated_base_reference =~ s/.\/common\///g; + $generated_base_repository_files .= $cmake_generated_base_reference . "\n"; + open(FH, '>', $generated_base_repository) or die $!; + print FH $new_base_repository; + close(FH); + } + + ############################################# + # write extended repository + ############################################# + if ($repository_generation_option eq "all" || $repository_generation_option eq "extended") { + my $generated_repository = './common/repositories/' . $table_to_generate . '_repository.h'; + my $cmake_generated_reference = $generated_repository; + $cmake_generated_reference =~ s/.\/common\///g; + $generated_repository_files .= $cmake_generated_reference . "\n"; + open(FH, '>', $generated_repository) or die $!; + print FH $new_repository; + close(FH); + } + +} + +print "\n# Make sure to add generated repositories to common/CMakeLists.txt under the repositories section\n\n"; + +print "\n#Base Repositories\n"; +print $generated_base_repository_files . "\n"; + +print "\n#Extended Repositories\n"; +print $generated_repository_files . "\n"; + +sub trim { + my $string = $_[0]; + $string =~ s/^\s+//; + $string =~ s/\s+$//; + return $string; +} + +sub translate_mysql_data_type_to_c { + my $mysql_data_type = $_[0]; + + my $struct_data_type = "std::string"; + if ($mysql_data_type =~ /tinyint/) { + $struct_data_type = 'int'; + } + elsif ($mysql_data_type =~ /smallint/) { + $struct_data_type = 'int'; + } + elsif ($mysql_data_type =~ /bigint/) { + $struct_data_type = 'int'; + # Use regular int for now until we have 64 support + } + elsif ($mysql_data_type =~ /int/) { + $struct_data_type = 'int'; + } + elsif ($mysql_data_type =~ /float|double|decimal/) { + $struct_data_type = 'float'; + } + + return $struct_data_type; +} diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index 28b22028e..55c8facd7 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -406,6 +406,19 @@ 9150|2020_02_06_aa_reset_on_death.sql|SHOW COLUMNS FROM `aa_ability` LIKE 'reset_on_death'|empty| 9151|2020_03_05_npc_always_aggro.sql|SHOW COLUMNS FROM `npc_types` LIKE 'always_aggro'|empty| 9152|2020_03_09_convert_myisam_to_innodb.sql|SELECT * FROM db_version WHERE version >= 9152|empty| +9153|2020_05_09_items_subtype.sql|SHOW COLUMNS from `items` LIKE 'UNK219'|not_empty| +9154|2020_04_11_expansions_content_filters.sql|SHOW COLUMNS from `zone` LIKE 'min_expansion'|empty| +9155|2020_08_15_lootdrop_level_filtering.sql|SHOW COLUMNS from `lootdrop_entries` LIKE 'trivial_min_level'|empty| +9156|2020_08_16_virtual_zonepoints.sql|SHOW COLUMNS from `zone_points` LIKE 'is_virtual'|empty| +9157|2020_09_02_pet_taunting.sql|SHOW COLUMNS from `character_pet_info` LIKE 'taunting'|empty| +9158|2020_12_09_underworld.sql|SHOW COLUMNS from `zone` LIKE 'underworld_teleport_index'|empty| +9159|2020_12_22_expedition_system.sql|SELECT * FROM db_version WHERE version >= 9159|empty| +9160|2021_02_14_npc_exp_mod.sql|SHOW COLUMNS from `npc_types` LIKE 'exp_mod'|empty| +9161|2021_02_15_npc_spell_entries_unsigned.sql|SELECT * FROM db_version WHERE version >= 9161|empty| +9162|2021_02_17_server_scheduled_events.sql|SELECT * FROM db_version WHERE version >= 9162|empty| +9163|2021_04_17_zone_safe_heading_changes.sql|SHOW COLUMNS FROM `zone` LIKE 'safe_heading'|empty| +9164|2021_04_23_character_exp_modifiers.sql|SHOW TABLES LIKE 'character_exp_modifiers'|empty| +9165|2021_04_28_idle_pathing.sql|SHOW COLUMNS FROM `spawn2` LIKE 'path_when_zone_idle'|empty| # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not diff --git a/utils/sql/git/bots/bots_db_update_manifest.txt b/utils/sql/git/bots/bots_db_update_manifest.txt index 1e18516b7..86e7c49dd 100644 --- a/utils/sql/git/bots/bots_db_update_manifest.txt +++ b/utils/sql/git/bots/bots_db_update_manifest.txt @@ -25,6 +25,7 @@ 9024|2019_06_27_bots_pet_get_lost.sql|SELECT `bot_command` FROM `bot_command_settings` WHERE `bot_command` LIKE 'petgetlost'|empty| 9025|2019_08_26_bots_owner_option_spawn_message.sql|SELECT * FROM db_version WHERE bots_version >= 9025|empty| 9026|2019_09_09_bots_owner_options_rework.sql|SHOW COLUMNS FROM `bot_owner_options` LIKE 'option_type'|empty| +9027|2020_03_30_bots_view_update.sql|SELECT * FROM db_version WHERE bots_version >= 9027|empty| # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not diff --git a/utils/sql/git/bots/required/2020_03_30_bots_view_update.sql b/utils/sql/git/bots/required/2020_03_30_bots_view_update.sql new file mode 100644 index 000000000..d4948efed --- /dev/null +++ b/utils/sql/git/bots/required/2020_03_30_bots_view_update.sql @@ -0,0 +1,24 @@ +DROP VIEW IF EXISTS `vw_bot_character_mobs`; + +-- Views +CREATE VIEW `vw_bot_character_mobs` AS +SELECT +_utf8'C' AS mob_type, +c.`id`, +c.`name`, +c.`class`, +c.`level`, +c.`last_login`, +c.`zone_id`, +c.`deleted_at` +FROM `character_data` AS c +UNION ALL +SELECT _utf8'B' AS mob_type, +b.`bot_id` AS id, +b.`name`, +b.`class`, +b.`level`, +b.`last_spawn` AS last_login, +b.`zone_id`, +NULL AS `deleted_at` +FROM `bot_data` AS b; diff --git a/utils/sql/git/optional/2020_05_11_unbreakable_fishing.sql b/utils/sql/git/optional/2020_05_11_unbreakable_fishing.sql new file mode 100644 index 000000000..60d8c26b4 --- /dev/null +++ b/utils/sql/git/optional/2020_05_11_unbreakable_fishing.sql @@ -0,0 +1,3 @@ +/* In July 2018 - magical poles were no longer breakable */ + +UPDATE items SET subtype = magic WHERE itemtype = 36; diff --git a/utils/sql/git/optional/2020_07_20_tool_gearup_armor_sets.sql b/utils/sql/git/optional/2020_07_20_tool_gearup_armor_sets.sql new file mode 100644 index 000000000..24c2a129d --- /dev/null +++ b/utils/sql/git/optional/2020_07_20_tool_gearup_armor_sets.sql @@ -0,0 +1,148916 @@ +CREATE TABLE `tool_gearup_armor_sets` ( + `class` tinyint(4) DEFAULT NULL, + `level` smallint(6) DEFAULT NULL, + `slot` tinyint(4) DEFAULT NULL, + `item_id` int(11) DEFAULT NULL, + `score` mediumint(9) DEFAULT NULL, + `expansion` tinyint(4) DEFAULT NULL, + KEY `class` (`class`,`level`,`slot`,`item_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '1', '22', '8567', '0', '0'), +('1', '1', '22', '10323', '0', '0'), +('1', '1', '22', '66166', '0', '0'), +('1', '1', '22', '10664', '0', '0'), +('1', '1', '1', '14701', '4104', '0'), +('1', '1', '1', '14702', '2500', '0'), +('1', '1', '1', '10165', '1940', '0'), +('1', '1', '1', '14658', '1146', '0'), +('1', '1', '2', '4301', '7726', '0'), +('1', '1', '2', '4831', '6040', '0'), +('1', '1', '2', '4911', '6040', '0'), +('1', '1', '2', '10142', '4824', '0'), +('1', '1', '3', '21026', '2114', '0'), +('1', '1', '3', '21002', '2114', '0'), +('1', '1', '3', '10144', '1628', '0'), +('1', '1', '3', '21303', '1510', '0'), +('1', '1', '5', '14569', '6171', '0'), +('1', '1', '5', '14703', '5500', '0'), +('1', '1', '5', '10055', '4010', '0'), +('1', '1', '5', '14700', '3906', '0'), +('1', '1', '8', '11621', '26579', '0'), +('1', '1', '8', '1546', '9983', '0'), +('1', '1', '8', '11551', '8753', '0'), +('1', '1', '8', '1409', '7747', '0'), +('1', '1', '6', '1557', '8270', '0'), +('1', '1', '6', '27701', '4137', '0'), +('1', '1', '6', '4175', '3775', '0'), +('1', '1', '6', '25062', '3672', '0'), +('1', '1', '17', '4912', '11404', '0'), +('1', '1', '17', '4832', '11404', '0'), +('1', '1', '17', '4174', '9165', '0'), +('1', '1', '17', '4309', '8225', '0'), +('1', '1', '7', '4913', '6478', '0'), +('1', '1', '7', '4833', '6478', '0'), +('1', '1', '7', '2986', '3926', '0'), +('1', '1', '7', '4176', '3789', '0'), +('1', '1', '9', '4834', '4408', '0'), +('1', '1', '9', '4914', '4408', '0'), +('1', '1', '9', '12189', '3471', '0'), +('1', '1', '9', '4177', '3032', '0'), +('1', '1', '15', '10366', '8054', '0'), +('1', '1', '15', '10151', '7200', '0'), +('1', '1', '15', '14679', '7010', '0'), +('1', '1', '15', '14678', '5708', '0'), +('1', '1', '20', '11673', '22827', '0'), +('1', '1', '20', '11601', '17566', '0'), +('1', '1', '20', '2921', '13918', '0'), +('1', '1', '20', '1365', '10500', '0'), +('1', '1', '12', '4835', '9883', '0'), +('1', '1', '12', '4915', '9883', '0'), +('1', '1', '12', '20655', '7255', '0'), +('1', '1', '12', '2923', '4008', '0'), +('1', '1', '18', '4916', '6318', '0'), +('1', '1', '18', '4836', '6318', '0'), +('1', '1', '18', '4346', '4645', '0'), +('1', '1', '18', '4179', '4393', '0'), +('1', '1', '19', '4917', '6970', '0'), +('1', '1', '19', '4837', '6970', '0'), +('1', '1', '19', '68239', '4760', '0'), +('1', '1', '19', '4180', '3654', '0'), +('1', '1', '13', '11674', '28400', '0'), +('1', '1', '13', '11667', '17080', '0'), +('1', '1', '13', '11550', '17075', '0'), +('1', '1', '13', '5401', '13799', '0'), +('1', '1', '14', '11674', '28400', '0'), +('1', '1', '14', '11632', '27713', '0'), +('1', '1', '14', '11551', '23853', '0'), +('1', '1', '14', '9428', '20353', '0'), +('1', '1', '11', '8408', '6861', '0'), +('1', '1', '11', '8325', '6668', '0'), +('1', '1', '11', '8811', '5213', '0'), +('1', '1', '11', '8810', '4798', '0'), +('1', '2', '22', '8567', '0', '0'), +('1', '2', '22', '10323', '0', '0'), +('1', '2', '22', '66166', '0', '0'), +('1', '2', '22', '10664', '0', '0'), +('1', '2', '1', '14701', '4104', '0'), +('1', '2', '1', '14702', '2500', '0'), +('1', '2', '1', '10165', '1940', '0'), +('1', '2', '1', '14658', '1146', '0'), +('1', '2', '2', '4301', '7726', '0'), +('1', '2', '2', '4831', '6040', '0'), +('1', '2', '2', '4911', '6040', '0'), +('1', '2', '2', '10142', '4824', '0'), +('1', '2', '3', '21026', '2114', '0'), +('1', '2', '3', '21002', '2114', '0'), +('1', '2', '3', '10144', '1628', '0'), +('1', '2', '3', '4226', '1510', '0'), +('1', '2', '5', '14569', '6171', '0'), +('1', '2', '5', '14703', '5500', '0'), +('1', '2', '5', '10055', '4010', '0'), +('1', '2', '5', '14700', '3906', '0'), +('1', '2', '8', '11621', '26579', '0'), +('1', '2', '8', '1546', '9983', '0'), +('1', '2', '8', '11551', '8753', '0'), +('1', '2', '8', '1409', '7747', '0'), +('1', '2', '6', '1557', '8270', '0'), +('1', '2', '6', '27701', '4171', '0'), +('1', '2', '6', '4175', '3775', '0'), +('1', '2', '6', '25062', '3672', '0'), +('1', '2', '17', '4912', '11476', '0'), +('1', '2', '17', '4832', '11476', '0'), +('1', '2', '17', '4174', '9189', '0'), +('1', '2', '17', '4309', '8225', '0'), +('1', '2', '7', '4913', '6478', '0'), +('1', '2', '7', '4833', '6478', '0'), +('1', '2', '7', '2986', '3926', '0'), +('1', '2', '7', '4176', '3789', '0'), +('1', '2', '9', '4834', '4408', '0'), +('1', '2', '9', '4914', '4408', '0'), +('1', '2', '9', '12189', '3471', '0'), +('1', '2', '9', '4177', '3032', '0'), +('1', '2', '15', '10366', '8054', '0'), +('1', '2', '15', '10151', '7200', '0'), +('1', '2', '15', '14679', '7010', '0'), +('1', '2', '15', '14678', '5708', '0'), +('1', '2', '20', '11673', '22885', '0'), +('1', '2', '20', '11601', '17614', '0'), +('1', '2', '20', '2921', '13942', '0'), +('1', '2', '20', '1365', '10500', '0'), +('1', '2', '12', '4835', '9908', '0'), +('1', '2', '12', '4915', '9908', '0'), +('1', '2', '12', '20655', '7265', '0'), +('1', '2', '12', '2923', '4008', '0'), +('1', '2', '18', '4916', '6342', '0'), +('1', '2', '18', '4836', '6342', '0'), +('1', '2', '18', '4346', '4645', '0'), +('1', '2', '18', '4179', '4393', '0'), +('1', '2', '19', '4917', '6970', '0'), +('1', '2', '19', '4837', '6970', '0'), +('1', '2', '19', '68239', '4760', '0'), +('1', '2', '19', '4180', '3654', '0'), +('1', '2', '13', '11674', '28400', '0'), +('1', '2', '13', '11667', '17101', '0'), +('1', '2', '13', '11550', '17075', '0'), +('1', '2', '13', '5401', '13799', '0'), +('1', '2', '14', '11674', '28400', '0'), +('1', '2', '14', '11632', '27786', '0'), +('1', '2', '14', '11551', '23853', '0'), +('1', '2', '14', '9428', '20353', '0'), +('1', '2', '11', '8408', '6861', '0'), +('1', '2', '11', '8325', '6668', '0'), +('1', '2', '11', '8811', '5213', '0'), +('1', '2', '11', '8810', '4798', '0'), +('1', '3', '22', '8567', '0', '0'), +('1', '3', '22', '10323', '0', '0'), +('1', '3', '22', '66166', '0', '0'), +('1', '3', '22', '10664', '0', '0'), +('1', '3', '1', '14701', '4104', '0'), +('1', '3', '1', '14702', '2500', '0'), +('1', '3', '1', '10165', '1940', '0'), +('1', '3', '1', '14658', '1146', '0'), +('1', '3', '2', '4301', '7726', '0'), +('1', '3', '2', '4831', '6040', '0'), +('1', '3', '2', '4911', '6040', '0'), +('1', '3', '2', '10142', '4824', '0'), +('1', '3', '3', '21026', '2114', '0'), +('1', '3', '3', '21002', '2114', '0'), +('1', '3', '3', '10144', '1628', '0'), +('1', '3', '3', '4382', '1510', '0'), +('1', '3', '5', '14569', '6171', '0'), +('1', '3', '5', '14703', '5500', '0'), +('1', '3', '5', '10055', '4010', '0'), +('1', '3', '5', '14700', '3906', '0'), +('1', '3', '8', '11621', '26579', '0'), +('1', '3', '8', '1546', '9983', '0'), +('1', '3', '8', '11551', '8753', '0'), +('1', '3', '8', '1409', '7747', '0'), +('1', '3', '6', '1557', '8270', '0'), +('1', '3', '6', '27701', '4200', '0'), +('1', '3', '6', '4175', '3775', '0'), +('1', '3', '6', '25062', '3672', '0'), +('1', '3', '17', '4912', '11539', '0'), +('1', '3', '17', '4832', '11539', '0'), +('1', '3', '17', '4174', '9210', '0'), +('1', '3', '17', '4309', '8225', '0'), +('1', '3', '7', '4913', '6478', '0'), +('1', '3', '7', '4833', '6478', '0'), +('1', '3', '7', '2986', '3926', '0'), +('1', '3', '7', '4343', '3793', '0'), +('1', '3', '9', '4834', '4408', '0'), +('1', '3', '9', '4914', '4408', '0'), +('1', '3', '9', '12189', '3471', '0'), +('1', '3', '9', '4177', '3032', '0'), +('1', '3', '15', '10366', '8054', '0'), +('1', '3', '15', '10151', '7200', '0'), +('1', '3', '15', '14679', '7010', '0'), +('1', '3', '15', '14678', '5708', '0'), +('1', '3', '20', '11673', '22936', '0'), +('1', '3', '20', '11601', '17656', '0'), +('1', '3', '20', '2921', '13963', '0'), +('1', '3', '20', '1365', '10500', '0'), +('1', '3', '12', '4835', '9929', '0'), +('1', '3', '12', '4915', '9929', '0'), +('1', '3', '12', '20655', '7273', '0'), +('1', '3', '12', '2923', '4008', '0'), +('1', '3', '18', '4916', '6363', '0'), +('1', '3', '18', '4836', '6363', '0'), +('1', '3', '18', '4346', '4645', '0'), +('1', '3', '18', '4179', '4393', '0'), +('1', '3', '19', '4917', '6970', '0'), +('1', '3', '19', '4837', '6970', '0'), +('1', '3', '19', '68239', '4760', '0'), +('1', '3', '19', '4180', '3654', '0'), +('1', '3', '13', '11674', '28400', '0'), +('1', '3', '13', '11667', '17120', '0'), +('1', '3', '13', '11550', '17075', '0'), +('1', '3', '13', '5401', '13799', '0'), +('1', '3', '14', '11674', '28400', '0'), +('1', '3', '14', '11632', '27849', '0'), +('1', '3', '14', '11551', '23853', '0'), +('1', '3', '14', '9428', '20353', '0'), +('1', '3', '11', '8408', '6861', '0'), +('1', '3', '11', '8325', '6668', '0'), +('1', '3', '11', '8811', '5213', '0'), +('1', '3', '11', '8810', '4798', '0'), +('1', '4', '22', '8567', '0', '0'), +('1', '4', '22', '10323', '0', '0'), +('1', '4', '22', '66166', '0', '0'), +('1', '4', '22', '10664', '0', '0'), +('1', '4', '1', '14701', '4104', '0'), +('1', '4', '1', '14702', '2500', '0'), +('1', '4', '1', '10165', '1940', '0'), +('1', '4', '1', '14658', '1146', '0'), +('1', '4', '2', '4301', '7726', '0'), +('1', '4', '2', '4831', '6040', '0'), +('1', '4', '2', '4911', '6040', '0'), +('1', '4', '2', '10142', '4824', '0'), +('1', '4', '3', '21026', '2114', '0'), +('1', '4', '3', '21002', '2114', '0'), +('1', '4', '3', '10144', '1628', '0'), +('1', '4', '3', '4202', '1510', '0'), +('1', '4', '5', '14569', '6171', '0'), +('1', '4', '5', '14703', '5500', '0'), +('1', '4', '5', '10055', '4010', '0'), +('1', '4', '5', '14700', '3906', '0'), +('1', '4', '8', '11621', '26579', '0'), +('1', '4', '8', '1546', '9983', '0'), +('1', '4', '8', '11551', '8753', '0'), +('1', '4', '8', '1409', '7747', '0'), +('1', '4', '6', '1557', '8270', '0'), +('1', '4', '6', '27701', '4234', '0'), +('1', '4', '6', '4175', '3775', '0'), +('1', '4', '6', '25062', '3672', '0'), +('1', '4', '17', '4912', '11612', '0'), +('1', '4', '17', '4832', '11612', '0'), +('1', '4', '17', '4174', '9235', '0'), +('1', '4', '17', '4309', '8225', '0'), +('1', '4', '7', '4913', '6478', '0'), +('1', '4', '7', '4833', '6478', '0'), +('1', '4', '7', '2986', '3926', '0'), +('1', '4', '7', '4343', '3841', '0'), +('1', '4', '9', '4834', '4408', '0'), +('1', '4', '9', '4914', '4408', '0'), +('1', '4', '9', '12189', '3471', '0'), +('1', '4', '9', '4177', '3032', '0'), +('1', '4', '15', '10366', '8054', '0'), +('1', '4', '15', '10151', '7200', '0'), +('1', '4', '15', '14679', '7010', '0'), +('1', '4', '15', '14678', '5708', '0'), +('1', '4', '20', '11673', '22994', '0'), +('1', '4', '20', '11601', '17705', '0'), +('1', '4', '20', '2921', '13987', '0'), +('1', '4', '20', '1365', '10500', '0'), +('1', '4', '12', '4835', '9953', '0'), +('1', '4', '12', '4915', '9953', '0'), +('1', '4', '12', '20655', '7283', '0'), +('1', '4', '12', '2923', '4008', '0'), +('1', '4', '18', '4916', '6387', '0'), +('1', '4', '18', '4836', '6387', '0'), +('1', '4', '18', '4346', '4645', '0'), +('1', '4', '18', '4179', '4393', '0'), +('1', '4', '19', '4917', '6970', '0'), +('1', '4', '19', '4837', '6970', '0'), +('1', '4', '19', '68239', '4760', '0'), +('1', '4', '19', '4180', '3654', '0'), +('1', '4', '13', '11674', '28400', '0'), +('1', '4', '13', '11667', '17142', '0'), +('1', '4', '13', '11550', '17075', '0'), +('1', '4', '13', '5401', '13799', '0'), +('1', '4', '14', '11674', '28400', '0'), +('1', '4', '14', '11632', '27922', '0'), +('1', '4', '14', '11551', '23853', '0'), +('1', '4', '14', '9428', '20353', '0'), +('1', '4', '11', '8408', '6861', '0'), +('1', '4', '11', '8325', '6668', '0'), +('1', '4', '11', '8811', '5213', '0'), +('1', '4', '11', '8810', '4798', '0'), +('1', '5', '22', '8567', '0', '0'), +('1', '5', '22', '10323', '0', '0'), +('1', '5', '22', '66166', '0', '0'), +('1', '5', '22', '10664', '0', '0'), +('1', '5', '1', '14701', '4104', '0'), +('1', '5', '1', '14702', '2500', '0'), +('1', '5', '1', '10165', '1940', '0'), +('1', '5', '1', '14658', '1146', '0'), +('1', '5', '2', '4301', '7726', '0'), +('1', '5', '2', '4831', '6040', '0'), +('1', '5', '2', '4911', '6040', '0'), +('1', '5', '2', '10142', '4824', '0'), +('1', '5', '3', '21026', '2114', '0'), +('1', '5', '3', '21002', '2114', '0'), +('1', '5', '3', '71529', '1720', '0'), +('1', '5', '3', '10144', '1628', '0'), +('1', '5', '5', '14569', '6171', '0'), +('1', '5', '5', '14703', '5500', '0'), +('1', '5', '5', '10055', '4010', '0'), +('1', '5', '5', '14700', '3906', '0'), +('1', '5', '8', '11621', '26579', '0'), +('1', '5', '8', '1546', '9983', '0'), +('1', '5', '8', '11551', '8753', '0'), +('1', '5', '8', '1409', '7747', '0'), +('1', '5', '6', '1557', '8270', '0'), +('1', '5', '6', '27701', '4268', '0'), +('1', '5', '6', '4175', '3775', '0'), +('1', '5', '6', '25062', '3672', '0'), +('1', '5', '17', '4912', '11684', '0'), +('1', '5', '17', '4832', '11684', '0'), +('1', '5', '17', '4174', '9259', '0'), +('1', '5', '17', '4309', '8225', '0'), +('1', '5', '7', '4913', '6478', '0'), +('1', '5', '7', '4833', '6478', '0'), +('1', '5', '7', '2986', '3926', '0'), +('1', '5', '7', '4343', '3890', '0'), +('1', '5', '9', '4834', '4408', '0'), +('1', '5', '9', '4914', '4408', '0'), +('1', '5', '9', '12189', '3471', '0'), +('1', '5', '9', '4177', '3032', '0'), +('1', '5', '15', '10366', '8054', '0'), +('1', '5', '15', '10151', '7200', '0'), +('1', '5', '15', '14679', '7010', '0'), +('1', '5', '15', '14678', '5708', '0'), +('1', '5', '20', '11673', '23052', '0'), +('1', '5', '20', '11601', '17753', '0'), +('1', '5', '20', '2921', '14011', '0'), +('1', '5', '20', '1365', '10500', '0'), +('1', '5', '12', '4835', '9977', '0'), +('1', '5', '12', '4915', '9977', '0'), +('1', '5', '12', '20655', '7293', '0'), +('1', '5', '12', '2923', '4008', '0'), +('1', '5', '18', '4916', '6411', '0'), +('1', '5', '18', '4836', '6411', '0'), +('1', '5', '18', '4346', '4645', '0'), +('1', '5', '18', '4179', '4393', '0'), +('1', '5', '19', '4917', '6970', '0'), +('1', '5', '19', '4837', '6970', '0'), +('1', '5', '19', '68239', '4760', '0'), +('1', '5', '19', '4180', '3654', '0'), +('1', '5', '13', '11674', '28400', '0'), +('1', '5', '13', '11667', '17164', '0'), +('1', '5', '13', '11550', '17075', '0'), +('1', '5', '13', '5401', '13799', '0'), +('1', '5', '14', '11674', '28400', '0'), +('1', '5', '14', '11632', '27994', '0'), +('1', '5', '14', '11551', '23853', '0'), +('1', '5', '14', '9428', '20353', '0'), +('1', '5', '11', '8408', '6861', '0'), +('1', '5', '11', '8325', '6668', '0'), +('1', '5', '11', '8811', '5213', '0'), +('1', '5', '11', '8810', '4798', '0'), +('1', '6', '22', '8567', '0', '0'), +('1', '6', '22', '10323', '0', '0'), +('1', '6', '22', '66166', '0', '0'), +('1', '6', '22', '10664', '0', '0'), +('1', '6', '1', '14701', '4104', '0'), +('1', '6', '1', '14702', '2500', '0'), +('1', '6', '1', '10165', '1940', '0'), +('1', '6', '1', '14658', '1146', '0'), +('1', '6', '2', '4301', '7726', '0'), +('1', '6', '2', '4831', '6040', '0'), +('1', '6', '2', '4911', '6040', '0'), +('1', '6', '2', '10142', '4824', '0'), +('1', '6', '3', '21026', '2114', '0'), +('1', '6', '3', '21002', '2114', '0'), +('1', '6', '3', '71529', '2074', '0'), +('1', '6', '3', '10144', '1628', '0'), +('1', '6', '5', '14569', '6171', '0'), +('1', '6', '5', '14703', '5500', '0'), +('1', '6', '5', '10055', '4010', '0'), +('1', '6', '5', '14700', '3906', '0'), +('1', '6', '8', '11621', '26579', '0'), +('1', '6', '8', '1546', '9983', '0'), +('1', '6', '8', '11551', '8753', '0'), +('1', '6', '8', '1409', '7747', '0'), +('1', '6', '6', '1557', '8270', '0'), +('1', '6', '6', '27701', '4297', '0'), +('1', '6', '6', '4175', '3775', '0'), +('1', '6', '6', '25062', '3672', '0'), +('1', '6', '17', '4912', '11748', '0'), +('1', '6', '17', '4832', '11748', '0'), +('1', '6', '17', '4174', '9280', '0'), +('1', '6', '17', '4309', '8225', '0'), +('1', '6', '7', '4913', '6478', '0'), +('1', '6', '7', '4833', '6478', '0'), +('1', '6', '7', '4343', '3932', '0'), +('1', '6', '7', '2986', '3926', '0'), +('1', '6', '9', '4834', '4408', '0'), +('1', '6', '9', '4914', '4408', '0'), +('1', '6', '9', '12189', '3471', '0'), +('1', '6', '9', '4177', '3032', '0'), +('1', '6', '15', '10366', '8054', '0'), +('1', '6', '15', '10151', '7200', '0'), +('1', '6', '15', '14679', '7010', '0'), +('1', '6', '15', '14678', '5708', '0'), +('1', '6', '20', '11673', '23102', '0'), +('1', '6', '20', '11601', '17795', '0'), +('1', '6', '20', '2921', '14032', '0'), +('1', '6', '20', '1365', '10500', '0'), +('1', '6', '12', '4835', '9998', '0'), +('1', '6', '12', '4915', '9998', '0'), +('1', '6', '12', '20655', '7301', '0'), +('1', '6', '12', '2923', '4008', '0'), +('1', '6', '18', '4916', '6433', '0'), +('1', '6', '18', '4836', '6433', '0'), +('1', '6', '18', '4346', '4645', '0'), +('1', '6', '18', '4179', '4393', '0'), +('1', '6', '19', '4917', '6970', '0'), +('1', '6', '19', '4837', '6970', '0'), +('1', '6', '19', '68239', '4760', '0'), +('1', '6', '19', '4180', '3654', '0'), +('1', '6', '13', '11674', '28400', '0'), +('1', '6', '13', '11667', '17183', '0'), +('1', '6', '13', '11550', '17075', '0'), +('1', '6', '13', '5401', '13799', '0'), +('1', '6', '14', '11674', '28400', '0'), +('1', '6', '14', '11632', '28058', '0'), +('1', '6', '14', '11551', '23853', '0'), +('1', '6', '14', '9428', '20353', '0'), +('1', '6', '11', '8408', '6861', '0'), +('1', '6', '11', '8325', '6668', '0'), +('1', '6', '11', '8811', '5213', '0'), +('1', '6', '11', '8810', '4798', '0'), +('1', '7', '22', '8567', '0', '0'), +('1', '7', '22', '10323', '0', '0'), +('1', '7', '22', '66166', '0', '0'), +('1', '7', '22', '10664', '0', '0'), +('1', '7', '1', '14701', '4104', '0'), +('1', '7', '1', '14702', '2500', '0'), +('1', '7', '1', '10165', '1940', '0'), +('1', '7', '1', '14658', '1146', '0'), +('1', '7', '2', '4301', '7726', '0'), +('1', '7', '2', '4831', '6040', '0'), +('1', '7', '2', '4911', '6040', '0'), +('1', '7', '2', '10142', '4824', '0'), +('1', '7', '3', '71529', '2433', '0'), +('1', '7', '3', '21026', '2114', '0'), +('1', '7', '3', '21002', '2114', '0'), +('1', '7', '3', '10144', '1628', '0'), +('1', '7', '5', '14569', '6171', '0'), +('1', '7', '5', '14703', '5500', '0'), +('1', '7', '5', '10055', '4010', '0'), +('1', '7', '5', '14700', '3906', '0'), +('1', '7', '8', '11621', '26579', '0'), +('1', '7', '8', '1546', '9983', '0'), +('1', '7', '8', '11551', '8753', '0'), +('1', '7', '8', '1409', '7747', '0'), +('1', '7', '6', '1557', '8270', '0'), +('1', '7', '6', '27701', '4331', '0'), +('1', '7', '6', '4175', '3775', '0'), +('1', '7', '6', '25062', '3672', '0'), +('1', '7', '17', '4912', '11820', '0'), +('1', '7', '17', '4832', '11820', '0'), +('1', '7', '17', '4174', '9304', '0'), +('1', '7', '17', '4309', '8225', '0'), +('1', '7', '7', '4913', '6478', '0'), +('1', '7', '7', '4833', '6478', '0'), +('1', '7', '7', '4343', '3980', '0'), +('1', '7', '7', '2986', '3926', '0'), +('1', '7', '9', '4834', '4408', '0'), +('1', '7', '9', '4914', '4408', '0'), +('1', '7', '9', '12189', '3471', '0'), +('1', '7', '9', '4177', '3032', '0'), +('1', '7', '15', '10366', '8054', '0'), +('1', '7', '15', '10151', '7200', '0'), +('1', '7', '15', '14679', '7010', '0'), +('1', '7', '15', '14678', '5708', '0'), +('1', '7', '20', '11673', '23160', '0'), +('1', '7', '20', '11601', '17844', '0'), +('1', '7', '20', '2921', '14057', '0'), +('1', '7', '20', '1365', '10500', '0'), +('1', '7', '12', '4835', '10022', '0'), +('1', '7', '12', '4915', '10022', '0'), +('1', '7', '12', '20655', '7311', '0'), +('1', '7', '12', '11624', '4023', '0'), +('1', '7', '18', '4916', '6457', '0'), +('1', '7', '18', '4836', '6457', '0'), +('1', '7', '18', '4346', '4645', '0'), +('1', '7', '18', '4179', '4393', '0'), +('1', '7', '19', '4917', '6970', '0'), +('1', '7', '19', '4837', '6970', '0'), +('1', '7', '19', '68239', '4760', '0'), +('1', '7', '19', '4180', '3654', '0'), +('1', '7', '13', '11674', '28400', '0'), +('1', '7', '13', '11667', '17205', '0'), +('1', '7', '13', '11550', '17075', '0'), +('1', '7', '13', '5401', '13799', '0'), +('1', '7', '14', '11674', '28400', '0'), +('1', '7', '14', '11632', '28130', '0'), +('1', '7', '14', '11551', '23853', '0'), +('1', '7', '14', '9428', '20353', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '7', '11', '8408', '6861', '0'), +('1', '7', '11', '8325', '6668', '0'), +('1', '7', '11', '8811', '5213', '0'), +('1', '7', '11', '8810', '4798', '0'), +('1', '8', '22', '8567', '0', '0'), +('1', '8', '22', '10323', '0', '0'), +('1', '8', '22', '66166', '0', '0'), +('1', '8', '22', '10664', '0', '0'), +('1', '8', '1', '14701', '4104', '0'), +('1', '8', '1', '14702', '2500', '0'), +('1', '8', '1', '10165', '1940', '0'), +('1', '8', '1', '14658', '1146', '0'), +('1', '8', '2', '4301', '7726', '0'), +('1', '8', '2', '4831', '6040', '0'), +('1', '8', '2', '4911', '6040', '0'), +('1', '8', '2', '10142', '4824', '0'), +('1', '8', '3', '71529', '2796', '0'), +('1', '8', '3', '21026', '2114', '0'), +('1', '8', '3', '21002', '2114', '0'), +('1', '8', '3', '10144', '1628', '0'), +('1', '8', '5', '14569', '6171', '0'), +('1', '8', '5', '14703', '5500', '0'), +('1', '8', '5', '10055', '4010', '0'), +('1', '8', '5', '14700', '3906', '0'), +('1', '8', '8', '11621', '26579', '0'), +('1', '8', '8', '1546', '9983', '0'), +('1', '8', '8', '11551', '8753', '0'), +('1', '8', '8', '1409', '7747', '0'), +('1', '8', '6', '1557', '8270', '0'), +('1', '8', '6', '27701', '4365', '0'), +('1', '8', '6', '4175', '3775', '0'), +('1', '8', '6', '25062', '3672', '0'), +('1', '8', '17', '4912', '11893', '0'), +('1', '8', '17', '4832', '11893', '0'), +('1', '8', '17', '4174', '9328', '0'), +('1', '8', '17', '4309', '8225', '0'), +('1', '8', '7', '4913', '6478', '0'), +('1', '8', '7', '4833', '6478', '0'), +('1', '8', '7', '4343', '4029', '0'), +('1', '8', '7', '2986', '3926', '0'), +('1', '8', '9', '4834', '4408', '0'), +('1', '8', '9', '4914', '4408', '0'), +('1', '8', '9', '12189', '3471', '0'), +('1', '8', '9', '4177', '3032', '0'), +('1', '8', '15', '10366', '8054', '0'), +('1', '8', '15', '10151', '7200', '0'), +('1', '8', '15', '14679', '7010', '0'), +('1', '8', '15', '14678', '5708', '0'), +('1', '8', '20', '11673', '23218', '0'), +('1', '8', '20', '11601', '17892', '0'), +('1', '8', '20', '2921', '14081', '0'), +('1', '8', '20', '1365', '10500', '0'), +('1', '8', '12', '4835', '10046', '0'), +('1', '8', '12', '4915', '10046', '0'), +('1', '8', '12', '20655', '7320', '0'), +('1', '8', '12', '11624', '4057', '0'), +('1', '8', '18', '4916', '6481', '0'), +('1', '8', '18', '4836', '6481', '0'), +('1', '8', '18', '4346', '4645', '0'), +('1', '8', '18', '4179', '4393', '0'), +('1', '8', '19', '4917', '6970', '0'), +('1', '8', '19', '4837', '6970', '0'), +('1', '8', '19', '68239', '4760', '0'), +('1', '8', '19', '4180', '3654', '0'), +('1', '8', '13', '11674', '28400', '0'), +('1', '8', '13', '11667', '17226', '0'), +('1', '8', '13', '11550', '17075', '0'), +('1', '8', '13', '5401', '13799', '0'), +('1', '8', '14', '11674', '28400', '0'), +('1', '8', '14', '11632', '28203', '0'), +('1', '8', '14', '11551', '23853', '0'), +('1', '8', '14', '9428', '20353', '0'), +('1', '8', '11', '8408', '6861', '0'), +('1', '8', '11', '8325', '6668', '0'), +('1', '8', '11', '8811', '5213', '0'), +('1', '8', '11', '8810', '4798', '0'), +('1', '9', '22', '8567', '0', '0'), +('1', '9', '22', '10323', '0', '0'), +('1', '9', '22', '66166', '0', '0'), +('1', '9', '22', '10664', '0', '0'), +('1', '9', '1', '14701', '4104', '0'), +('1', '9', '1', '14702', '2500', '0'), +('1', '9', '1', '10165', '1940', '0'), +('1', '9', '1', '14658', '1146', '0'), +('1', '9', '2', '4301', '7726', '0'), +('1', '9', '2', '4831', '6040', '0'), +('1', '9', '2', '4911', '6040', '0'), +('1', '9', '2', '10142', '4824', '0'), +('1', '9', '3', '71529', '3163', '0'), +('1', '9', '3', '21026', '2114', '0'), +('1', '9', '3', '21002', '2114', '0'), +('1', '9', '3', '10144', '1628', '0'), +('1', '9', '5', '14569', '6171', '0'), +('1', '9', '5', '14703', '5500', '0'), +('1', '9', '5', '10055', '4010', '0'), +('1', '9', '5', '14700', '3906', '0'), +('1', '9', '8', '11621', '26579', '0'), +('1', '9', '8', '1546', '9983', '0'), +('1', '9', '8', '11551', '8753', '0'), +('1', '9', '8', '1409', '7747', '0'), +('1', '9', '6', '1557', '8270', '0'), +('1', '9', '6', '27701', '4399', '0'), +('1', '9', '6', '4175', '3775', '0'), +('1', '9', '6', '25062', '3672', '0'), +('1', '9', '17', '4912', '11965', '0'), +('1', '9', '17', '4832', '11965', '0'), +('1', '9', '17', '4174', '9352', '0'), +('1', '9', '17', '4309', '8225', '0'), +('1', '9', '7', '4913', '6478', '0'), +('1', '9', '7', '4833', '6478', '0'), +('1', '9', '7', '4343', '4077', '0'), +('1', '9', '7', '2986', '3926', '0'), +('1', '9', '9', '4834', '4408', '0'), +('1', '9', '9', '4914', '4408', '0'), +('1', '9', '9', '12189', '3471', '0'), +('1', '9', '9', '4177', '3032', '0'), +('1', '9', '15', '10366', '8054', '0'), +('1', '9', '15', '10151', '7200', '0'), +('1', '9', '15', '14679', '7010', '0'), +('1', '9', '15', '14678', '5708', '0'), +('1', '9', '20', '11673', '23276', '0'), +('1', '9', '20', '11601', '17940', '0'), +('1', '9', '20', '2921', '14105', '0'), +('1', '9', '20', '1365', '10500', '0'), +('1', '9', '12', '4835', '10071', '0'), +('1', '9', '12', '4915', '10071', '0'), +('1', '9', '12', '20655', '7330', '0'), +('1', '9', '12', '11624', '4091', '0'), +('1', '9', '18', '4916', '6505', '0'), +('1', '9', '18', '4836', '6505', '0'), +('1', '9', '18', '4346', '4645', '0'), +('1', '9', '18', '4179', '4393', '0'), +('1', '9', '19', '4917', '6970', '0'), +('1', '9', '19', '4837', '6970', '0'), +('1', '9', '19', '68239', '4760', '0'), +('1', '9', '19', '4180', '3654', '0'), +('1', '9', '13', '11674', '28400', '0'), +('1', '9', '13', '11667', '17248', '0'), +('1', '9', '13', '11550', '17075', '0'), +('1', '9', '13', '5401', '13799', '0'), +('1', '9', '14', '11674', '28400', '0'), +('1', '9', '14', '11632', '28275', '0'), +('1', '9', '14', '11551', '23853', '0'), +('1', '9', '14', '9428', '20353', '0'), +('1', '9', '11', '8408', '6861', '0'), +('1', '9', '11', '8325', '6668', '0'), +('1', '9', '11', '8811', '5213', '0'), +('1', '9', '11', '8810', '4798', '0'), +('1', '10', '22', '8567', '0', '0'), +('1', '10', '22', '10323', '0', '0'), +('1', '10', '22', '66166', '0', '0'), +('1', '10', '22', '10664', '0', '0'), +('1', '10', '1', '14701', '4104', '0'), +('1', '10', '1', '14702', '2500', '0'), +('1', '10', '1', '10165', '1940', '0'), +('1', '10', '1', '14658', '1146', '0'), +('1', '10', '2', '4301', '7726', '0'), +('1', '10', '2', '4831', '6040', '0'), +('1', '10', '2', '4911', '6040', '0'), +('1', '10', '2', '10142', '4824', '0'), +('1', '10', '3', '71529', '3534', '0'), +('1', '10', '3', '21026', '2114', '0'), +('1', '10', '3', '21002', '2114', '0'), +('1', '10', '3', '10144', '1628', '0'), +('1', '10', '5', '14569', '6171', '0'), +('1', '10', '5', '14703', '5500', '0'), +('1', '10', '5', '10055', '4010', '0'), +('1', '10', '5', '14700', '3906', '0'), +('1', '10', '8', '11621', '26579', '0'), +('1', '10', '8', '1546', '9983', '0'), +('1', '10', '8', '11551', '8753', '0'), +('1', '10', '8', '1409', '7747', '0'), +('1', '10', '6', '1557', '8270', '0'), +('1', '10', '6', '27701', '4433', '0'), +('1', '10', '6', '4175', '3775', '0'), +('1', '10', '6', '25062', '3672', '0'), +('1', '10', '17', '4912', '12038', '0'), +('1', '10', '17', '4832', '12038', '0'), +('1', '10', '17', '4174', '9377', '0'), +('1', '10', '17', '4309', '8225', '0'), +('1', '10', '7', '4913', '6478', '0'), +('1', '10', '7', '4833', '6478', '0'), +('1', '10', '7', '4343', '4125', '0'), +('1', '10', '7', '2986', '3926', '0'), +('1', '10', '9', '4834', '4408', '0'), +('1', '10', '9', '4914', '4408', '0'), +('1', '10', '9', '12189', '3471', '0'), +('1', '10', '9', '4177', '3032', '0'), +('1', '10', '15', '10366', '8054', '0'), +('1', '10', '15', '10151', '7200', '0'), +('1', '10', '15', '14679', '7010', '0'), +('1', '10', '15', '14678', '5708', '0'), +('1', '10', '20', '11673', '23334', '0'), +('1', '10', '20', '11601', '17988', '0'), +('1', '10', '20', '2921', '14129', '0'), +('1', '10', '20', '1365', '10500', '0'), +('1', '10', '12', '4835', '10095', '0'), +('1', '10', '12', '4915', '10095', '0'), +('1', '10', '12', '20655', '7340', '0'), +('1', '10', '12', '11624', '4125', '0'), +('1', '10', '18', '4916', '6529', '0'), +('1', '10', '18', '4836', '6529', '0'), +('1', '10', '18', '4346', '4645', '0'), +('1', '10', '18', '4179', '4393', '0'), +('1', '10', '19', '4917', '6970', '0'), +('1', '10', '19', '4837', '6970', '0'), +('1', '10', '19', '68239', '4760', '0'), +('1', '10', '19', '4180', '3654', '0'), +('1', '10', '13', '11674', '28400', '0'), +('1', '10', '13', '11667', '17270', '0'), +('1', '10', '13', '11550', '17075', '0'), +('1', '10', '13', '5401', '13799', '0'), +('1', '10', '14', '11674', '28400', '0'), +('1', '10', '14', '11632', '28348', '0'), +('1', '10', '14', '11551', '23853', '0'), +('1', '10', '14', '9428', '20353', '0'), +('1', '10', '11', '8408', '6861', '0'), +('1', '10', '11', '8325', '6668', '0'), +('1', '10', '11', '8811', '5213', '0'), +('1', '10', '11', '8810', '4798', '0'), +('1', '11', '22', '8567', '0', '0'), +('1', '11', '22', '10323', '0', '0'), +('1', '11', '22', '66166', '0', '0'), +('1', '11', '22', '10664', '0', '0'), +('1', '11', '1', '14701', '4104', '0'), +('1', '11', '1', '14702', '2500', '0'), +('1', '11', '1', '10165', '1940', '0'), +('1', '11', '1', '14658', '1146', '0'), +('1', '11', '2', '4301', '7726', '0'), +('1', '11', '2', '4831', '6040', '0'), +('1', '11', '2', '4911', '6040', '0'), +('1', '11', '2', '10142', '4824', '0'), +('1', '11', '3', '71529', '3556', '0'), +('1', '11', '3', '21026', '2114', '0'), +('1', '11', '3', '21002', '2114', '0'), +('1', '11', '3', '10144', '1628', '0'), +('1', '11', '5', '14569', '6171', '0'), +('1', '11', '5', '14703', '5500', '0'), +('1', '11', '5', '10055', '4010', '0'), +('1', '11', '5', '14700', '3906', '0'), +('1', '11', '8', '11621', '26579', '0'), +('1', '11', '8', '1546', '9983', '0'), +('1', '11', '8', '11551', '8753', '0'), +('1', '11', '8', '1409', '7747', '0'), +('1', '11', '6', '1557', '8270', '0'), +('1', '11', '6', '27701', '4471', '0'), +('1', '11', '6', '4175', '3775', '0'), +('1', '11', '6', '25062', '3672', '0'), +('1', '11', '17', '4912', '12119', '0'), +('1', '11', '17', '4832', '12119', '0'), +('1', '11', '17', '4174', '9404', '0'), +('1', '11', '17', '4309', '8225', '0'), +('1', '11', '7', '4913', '6478', '0'), +('1', '11', '7', '4833', '6478', '0'), +('1', '11', '7', '4343', '4180', '0'), +('1', '11', '7', '2986', '3926', '0'), +('1', '11', '9', '4834', '4408', '0'), +('1', '11', '9', '4914', '4408', '0'), +('1', '11', '9', '12189', '3471', '0'), +('1', '11', '9', '4177', '3032', '0'), +('1', '11', '15', '10366', '8054', '0'), +('1', '11', '15', '10151', '7200', '0'), +('1', '11', '15', '14679', '7010', '0'), +('1', '11', '15', '14678', '5708', '0'), +('1', '11', '20', '11673', '23399', '0'), +('1', '11', '20', '11601', '18043', '0'), +('1', '11', '20', '2921', '14156', '0'), +('1', '11', '20', '1365', '10500', '0'), +('1', '11', '12', '4835', '10122', '0'), +('1', '11', '12', '4915', '10122', '0'), +('1', '11', '12', '20655', '7351', '0'), +('1', '11', '12', '11624', '4163', '0'), +('1', '11', '18', '4916', '6556', '0'), +('1', '11', '18', '4836', '6556', '0'), +('1', '11', '18', '4346', '4645', '0'), +('1', '11', '18', '4179', '4393', '0'), +('1', '11', '19', '4917', '6970', '0'), +('1', '11', '19', '4837', '6970', '0'), +('1', '11', '19', '68239', '4760', '0'), +('1', '11', '19', '4180', '3654', '0'), +('1', '11', '13', '11674', '28400', '0'), +('1', '11', '13', '11667', '17294', '0'), +('1', '11', '13', '11550', '17075', '0'), +('1', '11', '13', '5401', '13799', '0'), +('1', '11', '14', '11632', '28429', '0'), +('1', '11', '14', '11674', '28400', '0'), +('1', '11', '14', '11551', '23853', '0'), +('1', '11', '14', '9428', '20353', '0'), +('1', '11', '11', '8408', '6861', '0'), +('1', '11', '11', '8325', '6668', '0'), +('1', '11', '11', '8811', '5213', '0'), +('1', '11', '11', '8810', '4798', '0'), +('1', '12', '22', '8567', '0', '0'), +('1', '12', '22', '10323', '0', '0'), +('1', '12', '22', '66166', '0', '0'), +('1', '12', '22', '10664', '0', '0'), +('1', '12', '1', '14701', '4104', '0'), +('1', '12', '1', '14702', '2500', '0'), +('1', '12', '1', '10165', '1940', '0'), +('1', '12', '1', '14658', '1146', '0'), +('1', '12', '2', '4301', '7726', '0'), +('1', '12', '2', '4831', '6040', '0'), +('1', '12', '2', '4911', '6040', '0'), +('1', '12', '2', '10142', '4824', '0'), +('1', '12', '3', '71529', '3575', '0'), +('1', '12', '3', '21026', '2114', '0'), +('1', '12', '3', '21002', '2114', '0'), +('1', '12', '3', '10144', '1628', '0'), +('1', '12', '5', '14569', '6171', '0'), +('1', '12', '5', '14703', '5500', '0'), +('1', '12', '5', '10055', '4010', '0'), +('1', '12', '5', '14700', '3906', '0'), +('1', '12', '8', '11621', '26579', '0'), +('1', '12', '8', '1546', '9983', '0'), +('1', '12', '8', '11551', '8753', '0'), +('1', '12', '8', '1409', '7747', '0'), +('1', '12', '6', '1557', '8270', '0'), +('1', '12', '6', '27701', '4505', '0'), +('1', '12', '6', '4175', '3775', '0'), +('1', '12', '6', '25062', '3672', '0'), +('1', '12', '17', '4912', '12192', '0'), +('1', '12', '17', '4832', '12192', '0'), +('1', '12', '17', '4174', '9428', '0'), +('1', '12', '17', '4309', '8225', '0'), +('1', '12', '7', '4913', '6478', '0'), +('1', '12', '7', '4833', '6478', '0'), +('1', '12', '7', '4343', '4228', '0'), +('1', '12', '7', '2986', '3926', '0'), +('1', '12', '9', '4834', '4408', '0'), +('1', '12', '9', '4914', '4408', '0'), +('1', '12', '9', '12189', '3471', '0'), +('1', '12', '9', '4177', '3032', '0'), +('1', '12', '15', '10366', '8054', '0'), +('1', '12', '15', '10151', '7200', '0'), +('1', '12', '15', '14679', '7010', '0'), +('1', '12', '15', '14678', '5708', '0'), +('1', '12', '20', '11673', '23457', '0'), +('1', '12', '20', '11601', '18091', '0'), +('1', '12', '20', '2921', '14180', '0'), +('1', '12', '20', '1365', '10500', '0'), +('1', '12', '12', '4835', '10146', '0'), +('1', '12', '12', '4915', '10146', '0'), +('1', '12', '12', '20655', '7360', '0'), +('1', '12', '12', '11624', '4197', '0'), +('1', '12', '18', '4916', '6581', '0'), +('1', '12', '18', '4836', '6581', '0'), +('1', '12', '18', '4346', '4645', '0'), +('1', '12', '18', '4179', '4393', '0'), +('1', '12', '19', '4917', '6970', '0'), +('1', '12', '19', '4837', '6970', '0'), +('1', '12', '19', '68239', '4760', '0'), +('1', '12', '19', '4180', '3654', '0'), +('1', '12', '13', '11674', '28400', '0'), +('1', '12', '13', '11667', '17316', '0'), +('1', '12', '13', '11550', '17075', '0'), +('1', '12', '13', '5401', '13799', '0'), +('1', '12', '14', '11632', '28502', '0'), +('1', '12', '14', '11674', '28400', '0'), +('1', '12', '14', '11551', '23853', '0'), +('1', '12', '14', '9428', '20353', '0'), +('1', '12', '11', '8408', '6861', '0'), +('1', '12', '11', '8325', '6668', '0'), +('1', '12', '11', '8811', '5213', '0'), +('1', '12', '11', '8810', '4798', '0'), +('1', '13', '22', '8567', '0', '0'), +('1', '13', '22', '10323', '0', '0'), +('1', '13', '22', '66166', '0', '0'), +('1', '13', '22', '10664', '0', '0'), +('1', '13', '1', '14701', '4104', '0'), +('1', '13', '1', '14702', '2500', '0'), +('1', '13', '1', '10165', '1940', '0'), +('1', '13', '1', '14658', '1146', '0'), +('1', '13', '2', '4301', '7726', '0'), +('1', '13', '2', '4831', '6040', '0'), +('1', '13', '2', '4911', '6040', '0'), +('1', '13', '2', '10142', '4824', '0'), +('1', '13', '3', '71529', '3595', '0'), +('1', '13', '3', '21026', '2114', '0'), +('1', '13', '3', '21002', '2114', '0'), +('1', '13', '3', '10144', '1628', '0'), +('1', '13', '5', '14569', '6171', '0'), +('1', '13', '5', '14703', '5500', '0'), +('1', '13', '5', '10055', '4010', '0'), +('1', '13', '5', '14700', '3906', '0'), +('1', '13', '8', '11621', '26579', '0'), +('1', '13', '8', '1546', '9983', '0'), +('1', '13', '8', '11551', '8753', '0'), +('1', '13', '8', '1409', '7747', '0'), +('1', '13', '6', '1557', '8270', '0'), +('1', '13', '6', '27701', '4538', '0'), +('1', '13', '6', '4175', '3775', '0'), +('1', '13', '6', '4302', '3692', '0'), +('1', '13', '17', '4912', '12264', '0'), +('1', '13', '17', '4832', '12264', '0'), +('1', '13', '17', '4174', '9452', '0'), +('1', '13', '17', '4309', '8225', '0'), +('1', '13', '7', '4913', '6478', '0'), +('1', '13', '7', '4833', '6478', '0'), +('1', '13', '7', '4343', '4276', '0'), +('1', '13', '7', '2986', '3926', '0'), +('1', '13', '9', '4834', '4408', '0'), +('1', '13', '9', '4914', '4408', '0'), +('1', '13', '9', '12189', '3471', '0'), +('1', '13', '9', '4177', '3032', '0'), +('1', '13', '15', '10366', '8054', '0'), +('1', '13', '15', '10151', '7200', '0'), +('1', '13', '15', '14679', '7010', '0'), +('1', '13', '15', '14678', '5708', '0'), +('1', '13', '20', '11673', '23515', '0'), +('1', '13', '20', '11601', '18139', '0'), +('1', '13', '20', '2921', '14205', '0'), +('1', '13', '20', '1365', '10500', '0'), +('1', '13', '12', '4835', '10170', '0'), +('1', '13', '12', '4915', '10170', '0'), +('1', '13', '12', '20655', '7370', '0'), +('1', '13', '12', '11624', '4231', '0'), +('1', '13', '18', '4916', '6605', '0'), +('1', '13', '18', '4836', '6605', '0'), +('1', '13', '18', '4346', '4645', '0'), +('1', '13', '18', '4179', '4393', '0'), +('1', '13', '19', '4917', '6970', '0'), +('1', '13', '19', '4837', '6970', '0'), +('1', '13', '19', '68239', '4760', '0'), +('1', '13', '19', '4180', '3654', '0'), +('1', '13', '13', '11674', '28400', '0'), +('1', '13', '13', '11667', '17338', '0'), +('1', '13', '13', '11550', '17075', '0'), +('1', '13', '13', '5401', '13799', '0'), +('1', '13', '14', '11632', '28574', '0'), +('1', '13', '14', '11674', '28400', '0'), +('1', '13', '14', '11551', '23853', '0'), +('1', '13', '14', '9428', '20353', '0'), +('1', '13', '11', '8408', '6861', '0'), +('1', '13', '11', '8325', '6668', '0'), +('1', '13', '11', '8811', '5213', '0'), +('1', '13', '11', '8810', '4798', '0'), +('1', '14', '22', '8567', '0', '0'), +('1', '14', '22', '10323', '0', '0'), +('1', '14', '22', '66166', '0', '0'), +('1', '14', '22', '10664', '0', '0'), +('1', '14', '1', '14701', '4104', '0'), +('1', '14', '1', '14702', '2500', '0'), +('1', '14', '1', '10165', '1940', '0'), +('1', '14', '1', '14658', '1146', '0'), +('1', '14', '2', '4301', '7726', '0'), +('1', '14', '2', '4831', '6040', '0'), +('1', '14', '2', '4911', '6040', '0'), +('1', '14', '2', '10142', '4824', '0'), +('1', '14', '3', '71529', '3616', '0'), +('1', '14', '3', '21026', '2114', '0'), +('1', '14', '3', '21002', '2114', '0'), +('1', '14', '3', '10144', '1628', '0'), +('1', '14', '5', '14569', '6171', '0'), +('1', '14', '5', '14703', '5500', '0'), +('1', '14', '5', '10055', '4010', '0'), +('1', '14', '5', '14700', '3906', '0'), +('1', '14', '8', '11621', '26579', '0'), +('1', '14', '8', '1546', '9983', '0'), +('1', '14', '8', '11551', '8753', '0'), +('1', '14', '8', '1409', '7747', '0'), +('1', '14', '6', '1557', '8270', '0'), +('1', '14', '6', '27701', '4577', '0'), +('1', '14', '6', '4175', '3775', '0'), +('1', '14', '6', '4302', '3724', '0'), +('1', '14', '17', '4912', '12346', '0'), +('1', '14', '17', '4832', '12346', '0'), +('1', '14', '17', '4174', '9479', '0'), +('1', '14', '17', '4309', '8225', '0'), +('1', '14', '7', '4913', '6478', '0'), +('1', '14', '7', '4833', '6478', '0'), +('1', '14', '7', '4343', '4331', '0'), +('1', '14', '7', '2986', '3926', '0'), +('1', '14', '9', '4834', '4408', '0'), +('1', '14', '9', '4914', '4408', '0'), +('1', '14', '9', '12189', '3471', '0'), +('1', '14', '9', '4177', '3032', '0'), +('1', '14', '15', '10366', '8054', '0'), +('1', '14', '15', '10151', '7200', '0'), +('1', '14', '15', '14679', '7010', '0'), +('1', '14', '15', '14678', '5708', '0'), +('1', '14', '20', '11673', '23581', '0'), +('1', '14', '20', '11601', '18194', '0'), +('1', '14', '20', '2921', '14232', '0'), +('1', '14', '20', '1365', '10500', '0'), +('1', '14', '12', '4835', '10197', '0'), +('1', '14', '12', '4915', '10197', '0'), +('1', '14', '12', '20655', '7381', '0'), +('1', '14', '12', '11624', '4269', '0'), +('1', '14', '18', '4916', '6632', '0'), +('1', '14', '18', '4836', '6632', '0'), +('1', '14', '18', '4346', '4645', '0'), +('1', '14', '18', '4179', '4393', '0'), +('1', '14', '19', '4917', '6970', '0'), +('1', '14', '19', '4837', '6970', '0'), +('1', '14', '19', '68239', '4760', '0'), +('1', '14', '19', '4180', '3654', '0'), +('1', '14', '13', '11674', '28400', '0'), +('1', '14', '13', '11667', '17362', '0'), +('1', '14', '13', '11550', '17075', '0'), +('1', '14', '13', '5401', '13799', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '14', '14', '11632', '28656', '0'), +('1', '14', '14', '11674', '28400', '0'), +('1', '14', '14', '11551', '23853', '0'), +('1', '14', '14', '9428', '20353', '0'), +('1', '14', '11', '8408', '6861', '0'), +('1', '14', '11', '8325', '6668', '0'), +('1', '14', '11', '8811', '5213', '0'), +('1', '14', '11', '8810', '4798', '0'), +('1', '15', '22', '8567', '0', '0'), +('1', '15', '22', '10323', '0', '0'), +('1', '15', '22', '66166', '0', '0'), +('1', '15', '22', '10664', '0', '0'), +('1', '15', '1', '14701', '4104', '0'), +('1', '15', '1', '14702', '2500', '0'), +('1', '15', '1', '10165', '1940', '0'), +('1', '15', '1', '14658', '1146', '0'), +('1', '15', '2', '4301', '7726', '0'), +('1', '15', '2', '4831', '6040', '0'), +('1', '15', '2', '4911', '6040', '0'), +('1', '15', '2', '10142', '4824', '0'), +('1', '15', '3', '71529', '3636', '0'), +('1', '15', '3', '21026', '2114', '0'), +('1', '15', '3', '21002', '2114', '0'), +('1', '15', '3', '10144', '1628', '0'), +('1', '15', '5', '14569', '6171', '0'), +('1', '15', '5', '14703', '5500', '0'), +('1', '15', '5', '10055', '4010', '0'), +('1', '15', '5', '14700', '3906', '0'), +('1', '15', '8', '11621', '26579', '0'), +('1', '15', '8', '1546', '9983', '0'), +('1', '15', '8', '11551', '8753', '0'), +('1', '15', '8', '1409', '7747', '0'), +('1', '15', '6', '1557', '8270', '0'), +('1', '15', '6', '27701', '4610', '0'), +('1', '15', '6', '4175', '3775', '0'), +('1', '15', '6', '4302', '3753', '0'), +('1', '15', '17', '4912', '12418', '0'), +('1', '15', '17', '4832', '12418', '0'), +('1', '15', '17', '4174', '9503', '0'), +('1', '15', '17', '4309', '8225', '0'), +('1', '15', '7', '4913', '6478', '0'), +('1', '15', '7', '4833', '6478', '0'), +('1', '15', '7', '4343', '4379', '0'), +('1', '15', '7', '2986', '3926', '0'), +('1', '15', '9', '4834', '4408', '0'), +('1', '15', '9', '4914', '4408', '0'), +('1', '15', '9', '12189', '3471', '0'), +('1', '15', '9', '4177', '3032', '0'), +('1', '15', '15', '10366', '8054', '0'), +('1', '15', '15', '10151', '7200', '0'), +('1', '15', '15', '14679', '7010', '0'), +('1', '15', '15', '14678', '5708', '0'), +('1', '15', '20', '11673', '23639', '0'), +('1', '15', '20', '11601', '18242', '0'), +('1', '15', '20', '2921', '14256', '0'), +('1', '15', '20', '1365', '10500', '0'), +('1', '15', '12', '4835', '10222', '0'), +('1', '15', '12', '4915', '10222', '0'), +('1', '15', '12', '20655', '7391', '0'), +('1', '15', '12', '11624', '4303', '0'), +('1', '15', '18', '4916', '6656', '0'), +('1', '15', '18', '4836', '6656', '0'), +('1', '15', '18', '4346', '4645', '0'), +('1', '15', '18', '4179', '4393', '0'), +('1', '15', '19', '4917', '6970', '0'), +('1', '15', '19', '4837', '6970', '0'), +('1', '15', '19', '68239', '4760', '0'), +('1', '15', '19', '4180', '3654', '0'), +('1', '15', '13', '11674', '28400', '0'), +('1', '15', '13', '11667', '17384', '0'), +('1', '15', '13', '11550', '17075', '0'), +('1', '15', '13', '5401', '13799', '0'), +('1', '15', '14', '11632', '28728', '0'), +('1', '15', '14', '11674', '28400', '0'), +('1', '15', '14', '11551', '23853', '0'), +('1', '15', '14', '9428', '20353', '0'), +('1', '15', '11', '8408', '6861', '0'), +('1', '15', '11', '8325', '6668', '0'), +('1', '15', '11', '8811', '5213', '0'), +('1', '15', '11', '8810', '4798', '0'), +('1', '16', '22', '8567', '0', '0'), +('1', '16', '22', '10323', '0', '0'), +('1', '16', '22', '66166', '0', '0'), +('1', '16', '22', '10664', '0', '0'), +('1', '16', '1', '14701', '4104', '0'), +('1', '16', '1', '14702', '2500', '0'), +('1', '16', '1', '10165', '1940', '0'), +('1', '16', '1', '14658', '1146', '0'), +('1', '16', '2', '4301', '7726', '0'), +('1', '16', '2', '4831', '6040', '0'), +('1', '16', '2', '4911', '6040', '0'), +('1', '16', '2', '10142', '4824', '0'), +('1', '16', '3', '71529', '3657', '0'), +('1', '16', '3', '21026', '2114', '0'), +('1', '16', '3', '21002', '2114', '0'), +('1', '16', '3', '10144', '1628', '0'), +('1', '16', '5', '14569', '6171', '0'), +('1', '16', '5', '14703', '5500', '0'), +('1', '16', '5', '10055', '4010', '0'), +('1', '16', '5', '14700', '3906', '0'), +('1', '16', '8', '11621', '26579', '0'), +('1', '16', '8', '1546', '9983', '0'), +('1', '16', '8', '11551', '8753', '0'), +('1', '16', '8', '1409', '7747', '0'), +('1', '16', '6', '1557', '8270', '0'), +('1', '16', '6', '27701', '4648', '0'), +('1', '16', '6', '4302', '3786', '0'), +('1', '16', '6', '4175', '3775', '0'), +('1', '16', '17', '4912', '12500', '0'), +('1', '16', '17', '4832', '12500', '0'), +('1', '16', '17', '4174', '9531', '0'), +('1', '16', '17', '4309', '8225', '0'), +('1', '16', '7', '4913', '6478', '0'), +('1', '16', '7', '4833', '6478', '0'), +('1', '16', '7', '4343', '4433', '0'), +('1', '16', '7', '2986', '3926', '0'), +('1', '16', '9', '4834', '4408', '0'), +('1', '16', '9', '4914', '4408', '0'), +('1', '16', '9', '12189', '3471', '0'), +('1', '16', '9', '4177', '3032', '0'), +('1', '16', '15', '10366', '8054', '0'), +('1', '16', '15', '10151', '7200', '0'), +('1', '16', '15', '14679', '7010', '0'), +('1', '16', '15', '14678', '5708', '0'), +('1', '16', '20', '11673', '23704', '0'), +('1', '16', '20', '11601', '18297', '0'), +('1', '16', '20', '2921', '14283', '0'), +('1', '16', '20', '1365', '10500', '0'), +('1', '16', '12', '4835', '10249', '0'), +('1', '16', '12', '4915', '10249', '0'), +('1', '16', '12', '20655', '7401', '0'), +('1', '16', '12', '11624', '4341', '0'), +('1', '16', '18', '4916', '6683', '0'), +('1', '16', '18', '4836', '6683', '0'), +('1', '16', '18', '4346', '4645', '0'), +('1', '16', '18', '4179', '4393', '0'), +('1', '16', '19', '4917', '6970', '0'), +('1', '16', '19', '4837', '6970', '0'), +('1', '16', '19', '68239', '4760', '0'), +('1', '16', '19', '4180', '3654', '0'), +('1', '16', '13', '11674', '28400', '0'), +('1', '16', '13', '11667', '17409', '0'), +('1', '16', '13', '11550', '17075', '0'), +('1', '16', '13', '5401', '13799', '0'), +('1', '16', '14', '11632', '28810', '0'), +('1', '16', '14', '11674', '28400', '0'), +('1', '16', '14', '11551', '23853', '0'), +('1', '16', '14', '9428', '20353', '0'), +('1', '16', '11', '8408', '6861', '0'), +('1', '16', '11', '8325', '6668', '0'), +('1', '16', '11', '8811', '5213', '0'), +('1', '16', '11', '8810', '4798', '0'), +('1', '17', '22', '8567', '0', '0'), +('1', '17', '22', '10323', '0', '0'), +('1', '17', '22', '66166', '0', '0'), +('1', '17', '22', '10664', '0', '0'), +('1', '17', '1', '14701', '4104', '0'), +('1', '17', '1', '14702', '2500', '0'), +('1', '17', '1', '10165', '1940', '0'), +('1', '17', '1', '14658', '1146', '0'), +('1', '17', '2', '4301', '7726', '0'), +('1', '17', '2', '4831', '6040', '0'), +('1', '17', '2', '4911', '6040', '0'), +('1', '17', '2', '10142', '4824', '0'), +('1', '17', '3', '71529', '3677', '0'), +('1', '17', '3', '21026', '2114', '0'), +('1', '17', '3', '21002', '2114', '0'), +('1', '17', '3', '10144', '1628', '0'), +('1', '17', '5', '14569', '6171', '0'), +('1', '17', '5', '14703', '5500', '0'), +('1', '17', '5', '10055', '4010', '0'), +('1', '17', '5', '14700', '3906', '0'), +('1', '17', '8', '11621', '26579', '0'), +('1', '17', '8', '1546', '9983', '0'), +('1', '17', '8', '11551', '8753', '0'), +('1', '17', '8', '1409', '7747', '0'), +('1', '17', '6', '1557', '8270', '0'), +('1', '17', '6', '27701', '4682', '0'), +('1', '17', '6', '4302', '3815', '0'), +('1', '17', '6', '4175', '3775', '0'), +('1', '17', '17', '4912', '12572', '0'), +('1', '17', '17', '4832', '12572', '0'), +('1', '17', '17', '4174', '9555', '0'), +('1', '17', '17', '4309', '8225', '0'), +('1', '17', '7', '4913', '6478', '0'), +('1', '17', '7', '4833', '6478', '0'), +('1', '17', '7', '4343', '4482', '0'), +('1', '17', '7', '2986', '3926', '0'), +('1', '17', '9', '4834', '4408', '0'), +('1', '17', '9', '4914', '4408', '0'), +('1', '17', '9', '12189', '3471', '0'), +('1', '17', '9', '4177', '3032', '0'), +('1', '17', '15', '10366', '8054', '0'), +('1', '17', '15', '10151', '7200', '0'), +('1', '17', '15', '14679', '7010', '0'), +('1', '17', '15', '14678', '5708', '0'), +('1', '17', '20', '11673', '23762', '0'), +('1', '17', '20', '11601', '18345', '0'), +('1', '17', '20', '2921', '14307', '0'), +('1', '17', '20', '1365', '10500', '0'), +('1', '17', '12', '4835', '10273', '0'), +('1', '17', '12', '4915', '10273', '0'), +('1', '17', '12', '20655', '7411', '0'), +('1', '17', '12', '11624', '4374', '0'), +('1', '17', '18', '4916', '6707', '0'), +('1', '17', '18', '4836', '6707', '0'), +('1', '17', '18', '4346', '4645', '0'), +('1', '17', '18', '4179', '4393', '0'), +('1', '17', '19', '4917', '6970', '0'), +('1', '17', '19', '4837', '6970', '0'), +('1', '17', '19', '68239', '4760', '0'), +('1', '17', '19', '4180', '3654', '0'), +('1', '17', '13', '11674', '28400', '0'), +('1', '17', '13', '11667', '17430', '0'), +('1', '17', '13', '11550', '17075', '0'), +('1', '17', '13', '5401', '13799', '0'), +('1', '17', '14', '11632', '28882', '0'), +('1', '17', '14', '11674', '28400', '0'), +('1', '17', '14', '11551', '23853', '0'), +('1', '17', '14', '9428', '20353', '0'), +('1', '17', '11', '8408', '6861', '0'), +('1', '17', '11', '8325', '6668', '0'), +('1', '17', '11', '8811', '5213', '0'), +('1', '17', '11', '45137', '4993', '0'), +('1', '18', '22', '8567', '0', '0'), +('1', '18', '22', '10323', '0', '0'), +('1', '18', '22', '66166', '0', '0'), +('1', '18', '22', '10664', '0', '0'), +('1', '18', '1', '14701', '4104', '0'), +('1', '18', '1', '14702', '2500', '0'), +('1', '18', '1', '10165', '1940', '0'), +('1', '18', '1', '14658', '1146', '0'), +('1', '18', '2', '4301', '7726', '0'), +('1', '18', '2', '4911', '6040', '0'), +('1', '18', '2', '4831', '6040', '0'), +('1', '18', '2', '4620', '4856', '0'), +('1', '18', '3', '71529', '3698', '0'), +('1', '18', '3', '21026', '2114', '0'), +('1', '18', '3', '21002', '2114', '0'), +('1', '18', '3', '10144', '1628', '0'), +('1', '18', '5', '14569', '6171', '0'), +('1', '18', '5', '14703', '5500', '0'), +('1', '18', '5', '10055', '4010', '0'), +('1', '18', '5', '14700', '3906', '0'), +('1', '18', '8', '11621', '26579', '0'), +('1', '18', '8', '1546', '9983', '0'), +('1', '18', '8', '11551', '8753', '0'), +('1', '18', '8', '1409', '7747', '0'), +('1', '18', '6', '1557', '8270', '0'), +('1', '18', '6', '27701', '4720', '0'), +('1', '18', '6', '4302', '3847', '0'), +('1', '18', '6', '4175', '3775', '0'), +('1', '18', '17', '4912', '12654', '0'), +('1', '18', '17', '4832', '12654', '0'), +('1', '18', '17', '4174', '9582', '0'), +('1', '18', '17', '4309', '8225', '0'), +('1', '18', '7', '4913', '6478', '0'), +('1', '18', '7', '4833', '6478', '0'), +('1', '18', '7', '4343', '4536', '0'), +('1', '18', '7', '2986', '3926', '0'), +('1', '18', '9', '4834', '4408', '0'), +('1', '18', '9', '4914', '4408', '0'), +('1', '18', '9', '12189', '3471', '0'), +('1', '18', '9', '4177', '3032', '0'), +('1', '18', '15', '10366', '8054', '0'), +('1', '18', '15', '10151', '7200', '0'), +('1', '18', '15', '14679', '7010', '0'), +('1', '18', '15', '14678', '5708', '0'), +('1', '18', '20', '11673', '23827', '0'), +('1', '18', '20', '11601', '18399', '0'), +('1', '18', '20', '2921', '14334', '0'), +('1', '18', '20', '1365', '10500', '0'), +('1', '18', '12', '4835', '10300', '0'), +('1', '18', '12', '4915', '10300', '0'), +('1', '18', '12', '20655', '7422', '0'), +('1', '18', '12', '11624', '4412', '0'), +('1', '18', '18', '4916', '6735', '0'), +('1', '18', '18', '4836', '6735', '0'), +('1', '18', '18', '4346', '4645', '0'), +('1', '18', '18', '4179', '4393', '0'), +('1', '18', '19', '4917', '6970', '0'), +('1', '18', '19', '4837', '6970', '0'), +('1', '18', '19', '68239', '4760', '0'), +('1', '18', '19', '4180', '3654', '0'), +('1', '18', '13', '11674', '28400', '0'), +('1', '18', '13', '11667', '17455', '0'), +('1', '18', '13', '11550', '17075', '0'), +('1', '18', '13', '5401', '13799', '0'), +('1', '18', '14', '11632', '28964', '0'), +('1', '18', '14', '11674', '28400', '0'), +('1', '18', '14', '11551', '23853', '0'), +('1', '18', '14', '9428', '20353', '0'), +('1', '18', '11', '8408', '6861', '0'), +('1', '18', '11', '8325', '6668', '0'), +('1', '18', '11', '45137', '5372', '0'), +('1', '18', '11', '8811', '5213', '0'), +('1', '19', '22', '8567', '0', '0'), +('1', '19', '22', '10323', '0', '0'), +('1', '19', '22', '66166', '0', '0'), +('1', '19', '22', '10664', '0', '0'), +('1', '19', '1', '14701', '4104', '0'), +('1', '19', '1', '14702', '2500', '0'), +('1', '19', '1', '10165', '1940', '0'), +('1', '19', '1', '14658', '1146', '0'), +('1', '19', '2', '4301', '7726', '0'), +('1', '19', '2', '4911', '6040', '0'), +('1', '19', '2', '4831', '6040', '0'), +('1', '19', '2', '4620', '4894', '0'), +('1', '19', '3', '71529', '3720', '0'), +('1', '19', '3', '21026', '2114', '0'), +('1', '19', '3', '21002', '2114', '0'), +('1', '19', '3', '10144', '1628', '0'), +('1', '19', '5', '14569', '6171', '0'), +('1', '19', '5', '14703', '5500', '0'), +('1', '19', '5', '10055', '4010', '0'), +('1', '19', '5', '14700', '3906', '0'), +('1', '19', '8', '11621', '26579', '0'), +('1', '19', '8', '1546', '9983', '0'), +('1', '19', '8', '11551', '8753', '0'), +('1', '19', '8', '1409', '7747', '0'), +('1', '19', '6', '1557', '8270', '0'), +('1', '19', '6', '27701', '4758', '0'), +('1', '19', '6', '4302', '3880', '0'), +('1', '19', '6', '4175', '3775', '0'), +('1', '19', '17', '4912', '12735', '0'), +('1', '19', '17', '4832', '12735', '0'), +('1', '19', '17', '4174', '9609', '0'), +('1', '19', '17', '4309', '8225', '0'), +('1', '19', '7', '4913', '6478', '0'), +('1', '19', '7', '4833', '6478', '0'), +('1', '19', '7', '4343', '4590', '0'), +('1', '19', '7', '2986', '3926', '0'), +('1', '19', '9', '4834', '4408', '0'), +('1', '19', '9', '4914', '4408', '0'), +('1', '19', '9', '12189', '3471', '0'), +('1', '19', '9', '4177', '3032', '0'), +('1', '19', '15', '10366', '8054', '0'), +('1', '19', '15', '10151', '7200', '0'), +('1', '19', '15', '14679', '7010', '0'), +('1', '19', '15', '14678', '5708', '0'), +('1', '19', '20', '11673', '23892', '0'), +('1', '19', '20', '11601', '18454', '0'), +('1', '19', '20', '2921', '14362', '0'), +('1', '19', '20', '1365', '10500', '0'), +('1', '19', '12', '4835', '10327', '0'), +('1', '19', '12', '4915', '10327', '0'), +('1', '19', '12', '20655', '7433', '0'), +('1', '19', '12', '11624', '4450', '0'), +('1', '19', '18', '4916', '6762', '0'), +('1', '19', '18', '4836', '6762', '0'), +('1', '19', '18', '4346', '4645', '0'), +('1', '19', '18', '4179', '4393', '0'), +('1', '19', '19', '4917', '6970', '0'), +('1', '19', '19', '4837', '6970', '0'), +('1', '19', '19', '68239', '4760', '0'), +('1', '19', '19', '4180', '3654', '0'), +('1', '19', '13', '11674', '28400', '0'), +('1', '19', '13', '11667', '17479', '0'), +('1', '19', '13', '11550', '17075', '0'), +('1', '19', '13', '5401', '13799', '0'), +('1', '19', '14', '11632', '29045', '0'), +('1', '19', '14', '11674', '28400', '0'), +('1', '19', '14', '11551', '23853', '0'), +('1', '19', '14', '9428', '20353', '0'), +('1', '19', '11', '8408', '6861', '0'), +('1', '19', '11', '8325', '6668', '0'), +('1', '19', '11', '45137', '5659', '0'), +('1', '19', '11', '8811', '5213', '0'), +('1', '20', '22', '8567', '0', '0'), +('1', '20', '22', '10323', '0', '0'), +('1', '20', '22', '66166', '0', '0'), +('1', '20', '22', '10664', '0', '0'), +('1', '20', '1', '14701', '4104', '0'), +('1', '20', '1', '14702', '2500', '0'), +('1', '20', '1', '10165', '1940', '0'), +('1', '20', '1', '14658', '1146', '0'), +('1', '20', '2', '4301', '7726', '0'), +('1', '20', '2', '4911', '6040', '0'), +('1', '20', '2', '4831', '6040', '0'), +('1', '20', '2', '4620', '4932', '0'), +('1', '20', '3', '71529', '3742', '0'), +('1', '20', '3', '21026', '2114', '0'), +('1', '20', '3', '21002', '2114', '0'), +('1', '20', '3', '10144', '1628', '0'), +('1', '20', '5', '14569', '6171', '0'), +('1', '20', '5', '14703', '5500', '0'), +('1', '20', '5', '10055', '4010', '0'), +('1', '20', '5', '14700', '3906', '0'), +('1', '20', '8', '11621', '26579', '0'), +('1', '20', '8', '1546', '9983', '0'), +('1', '20', '8', '11551', '8753', '0'), +('1', '20', '8', '1409', '7747', '0'), +('1', '20', '6', '1557', '8270', '0'), +('1', '20', '6', '27701', '4796', '0'), +('1', '20', '6', '4302', '3913', '0'), +('1', '20', '6', '4175', '3775', '0'), +('1', '20', '17', '4912', '12817', '0'), +('1', '20', '17', '4832', '12817', '0'), +('1', '20', '17', '4174', '9636', '0'), +('1', '20', '17', '4309', '8225', '0'), +('1', '20', '7', '4913', '6478', '0'), +('1', '20', '7', '4833', '6478', '0'), +('1', '20', '7', '4343', '4645', '0'), +('1', '20', '7', '2986', '3926', '0'), +('1', '20', '9', '4834', '4408', '0'), +('1', '20', '9', '4914', '4408', '0'), +('1', '20', '9', '12189', '3471', '0'), +('1', '20', '9', '4177', '3032', '0'), +('1', '20', '15', '10366', '8054', '0'), +('1', '20', '15', '10151', '7200', '0'), +('1', '20', '15', '14679', '7010', '0'), +('1', '20', '15', '14678', '5708', '0'), +('1', '20', '20', '11673', '23958', '0'), +('1', '20', '20', '11601', '18508', '0'), +('1', '20', '20', '2921', '14389', '0'), +('1', '20', '20', '1365', '10500', '0'), +('1', '20', '12', '4835', '10354', '0'), +('1', '20', '12', '4915', '10354', '0'), +('1', '20', '12', '20655', '7444', '0'), +('1', '20', '12', '11624', '4489', '0'), +('1', '20', '18', '4916', '6789', '0'), +('1', '20', '18', '4836', '6789', '0'), +('1', '20', '18', '4346', '4645', '0'), +('1', '20', '18', '4179', '4393', '0'), +('1', '20', '19', '4917', '6970', '0'), +('1', '20', '19', '4837', '6970', '0'), +('1', '20', '19', '68239', '4760', '0'), +('1', '20', '19', '4180', '3654', '0'), +('1', '20', '13', '11674', '28910', '0'), +('1', '20', '13', '11667', '17815', '0'), +('1', '20', '13', '11550', '17401', '0'), +('1', '20', '13', '5401', '14040', '0'), +('1', '20', '14', '11632', '29127', '0'), +('1', '20', '14', '11674', '28910', '0'), +('1', '20', '14', '11551', '23853', '0'), +('1', '20', '14', '9428', '20353', '0'), +('1', '20', '11', '8408', '7116', '0'), +('1', '20', '11', '8325', '6932', '0'), +('1', '20', '11', '45137', '6108', '0'), +('1', '20', '11', '8811', '5421', '0'), +('1', '21', '22', '8567', '0', '0'), +('1', '21', '22', '10323', '0', '0'), +('1', '21', '22', '66166', '0', '0'), +('1', '21', '22', '10664', '0', '0'), +('1', '21', '1', '14701', '4104', '0'), +('1', '21', '1', '14702', '2500', '0'), +('1', '21', '1', '10165', '1940', '0'), +('1', '21', '1', '14658', '1146', '0'), +('1', '21', '2', '4301', '7726', '0'), +('1', '21', '2', '4911', '6040', '0'), +('1', '21', '2', '4831', '6040', '0'), +('1', '21', '2', '4620', '4970', '0'), +('1', '21', '3', '71529', '3764', '0'), +('1', '21', '3', '21026', '2114', '0'), +('1', '21', '3', '21002', '2114', '0'), +('1', '21', '3', '10144', '1628', '0'), +('1', '21', '5', '14569', '6171', '0'), +('1', '21', '5', '14703', '5500', '0'), +('1', '21', '5', '10055', '4010', '0'), +('1', '21', '5', '14700', '3906', '0'), +('1', '21', '8', '11621', '26579', '0'), +('1', '21', '8', '1546', '9983', '0'), +('1', '21', '8', '11551', '8753', '0'), +('1', '21', '8', '1409', '7747', '0'), +('1', '21', '6', '1557', '8270', '0'), +('1', '21', '6', '27701', '4834', '0'), +('1', '21', '6', '4302', '3945', '0'), +('1', '21', '6', '4175', '3775', '0'), +('1', '21', '17', '4912', '12898', '0'), +('1', '21', '17', '4832', '12898', '0'), +('1', '21', '17', '4174', '9663', '0'), +('1', '21', '17', '4309', '8225', '0'), +('1', '21', '7', '4913', '6478', '0'), +('1', '21', '7', '4833', '6478', '0'), +('1', '21', '7', '4343', '4699', '0'), +('1', '21', '7', '2986', '3926', '0'), +('1', '21', '9', '4834', '4408', '0'), +('1', '21', '9', '4914', '4408', '0'), +('1', '21', '9', '12189', '3471', '0'), +('1', '21', '9', '4177', '3032', '0'), +('1', '21', '15', '10366', '8054', '0'), +('1', '21', '15', '10151', '7200', '0'), +('1', '21', '15', '14679', '7010', '0'), +('1', '21', '15', '14678', '5708', '0'), +('1', '21', '20', '11673', '24023', '0'), +('1', '21', '20', '11601', '18562', '0'), +('1', '21', '20', '2921', '14416', '0'), +('1', '21', '20', '1365', '10500', '0'), +('1', '21', '12', '4835', '10382', '0'), +('1', '21', '12', '4915', '10382', '0'), +('1', '21', '12', '20655', '7455', '0'), +('1', '21', '12', '11624', '4527', '0'), +('1', '21', '18', '4916', '6816', '0'), +('1', '21', '18', '4836', '6816', '0'), +('1', '21', '18', '4346', '4645', '0'), +('1', '21', '18', '4179', '4393', '0'), +('1', '21', '19', '4917', '6970', '0'), +('1', '21', '19', '4837', '6970', '0'), +('1', '21', '19', '68239', '4760', '0'), +('1', '21', '19', '4180', '3654', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '21', '13', '11674', '29051', '0'), +('1', '21', '13', '11667', '17939', '0'), +('1', '21', '13', '11550', '17500', '0'), +('1', '21', '13', '5401', '14111', '0'), +('1', '21', '14', '11632', '29208', '0'), +('1', '21', '14', '11674', '29051', '0'), +('1', '21', '14', '11551', '23853', '0'), +('1', '21', '14', '9428', '20353', '0'), +('1', '21', '11', '8408', '7192', '0'), +('1', '21', '11', '8325', '7008', '0'), +('1', '21', '11', '45137', '6445', '0'), +('1', '21', '11', '8811', '5478', '0'), +('1', '22', '22', '8567', '0', '0'), +('1', '22', '22', '10323', '0', '0'), +('1', '22', '22', '66166', '0', '0'), +('1', '22', '22', '10664', '0', '0'), +('1', '22', '1', '14701', '4104', '0'), +('1', '22', '1', '14702', '2500', '0'), +('1', '22', '1', '10165', '1940', '0'), +('1', '22', '1', '14658', '1146', '0'), +('1', '22', '2', '4301', '7726', '0'), +('1', '22', '2', '4911', '6040', '0'), +('1', '22', '2', '4831', '6040', '0'), +('1', '22', '2', '4620', '5008', '0'), +('1', '22', '3', '71529', '3785', '0'), +('1', '22', '3', '21026', '2114', '0'), +('1', '22', '3', '21002', '2114', '0'), +('1', '22', '3', '10144', '1628', '0'), +('1', '22', '5', '14569', '6171', '0'), +('1', '22', '5', '14703', '5500', '0'), +('1', '22', '5', '10055', '4010', '0'), +('1', '22', '5', '14700', '3906', '0'), +('1', '22', '8', '11621', '26579', '0'), +('1', '22', '8', '1546', '9983', '0'), +('1', '22', '8', '11551', '8753', '0'), +('1', '22', '8', '1409', '7747', '0'), +('1', '22', '6', '1557', '8270', '0'), +('1', '22', '6', '27701', '4872', '0'), +('1', '22', '6', '4302', '3978', '0'), +('1', '22', '6', '4175', '3775', '0'), +('1', '22', '17', '4912', '12980', '0'), +('1', '22', '17', '4832', '12980', '0'), +('1', '22', '17', '4174', '9691', '0'), +('1', '22', '17', '4309', '8225', '0'), +('1', '22', '7', '4913', '6478', '0'), +('1', '22', '7', '4833', '6478', '0'), +('1', '22', '7', '4343', '4753', '0'), +('1', '22', '7', '2986', '3926', '0'), +('1', '22', '9', '4834', '4408', '0'), +('1', '22', '9', '4914', '4408', '0'), +('1', '22', '9', '12189', '3471', '0'), +('1', '22', '9', '4177', '3032', '0'), +('1', '22', '15', '10366', '8054', '0'), +('1', '22', '15', '10151', '7200', '0'), +('1', '22', '15', '14679', '7010', '0'), +('1', '22', '15', '14678', '5708', '0'), +('1', '22', '20', '11673', '24088', '0'), +('1', '22', '20', '11601', '18617', '0'), +('1', '22', '20', '2921', '14443', '0'), +('1', '22', '20', '1365', '10500', '0'), +('1', '22', '12', '4835', '10409', '0'), +('1', '22', '12', '4915', '10409', '0'), +('1', '22', '12', '20655', '7465', '0'), +('1', '22', '12', '11624', '4565', '0'), +('1', '22', '18', '4916', '6843', '0'), +('1', '22', '18', '4836', '6843', '0'), +('1', '22', '18', '4346', '4645', '0'), +('1', '22', '18', '4179', '4393', '0'), +('1', '22', '19', '4917', '6970', '0'), +('1', '22', '19', '4837', '6970', '0'), +('1', '22', '19', '68239', '4760', '0'), +('1', '22', '19', '4180', '3654', '0'), +('1', '22', '13', '11674', '29193', '0'), +('1', '22', '13', '11667', '18048', '0'), +('1', '22', '13', '11550', '17585', '0'), +('1', '22', '13', '5401', '14182', '0'), +('1', '22', '14', '11632', '29290', '0'), +('1', '22', '14', '11674', '29193', '0'), +('1', '22', '14', '11551', '23853', '0'), +('1', '22', '14', '9428', '20353', '0'), +('1', '22', '11', '8408', '7268', '0'), +('1', '22', '11', '8325', '7093', '0'), +('1', '22', '11', '45137', '6887', '0'), +('1', '22', '11', '8811', '5544', '0'), +('1', '23', '22', '8567', '0', '0'), +('1', '23', '22', '10323', '0', '0'), +('1', '23', '22', '66166', '0', '0'), +('1', '23', '22', '10664', '0', '0'), +('1', '23', '1', '14701', '4104', '0'), +('1', '23', '1', '14702', '2500', '0'), +('1', '23', '1', '10165', '1940', '0'), +('1', '23', '1', '14658', '1146', '0'), +('1', '23', '2', '4301', '7726', '0'), +('1', '23', '2', '4911', '6040', '0'), +('1', '23', '2', '4831', '6040', '0'), +('1', '23', '2', '4620', '5046', '0'), +('1', '23', '3', '71529', '3807', '0'), +('1', '23', '3', '21026', '2114', '0'), +('1', '23', '3', '21002', '2114', '0'), +('1', '23', '3', '10144', '1628', '0'), +('1', '23', '5', '14569', '6171', '0'), +('1', '23', '5', '14703', '5500', '0'), +('1', '23', '5', '10055', '4010', '0'), +('1', '23', '5', '14700', '3906', '0'), +('1', '23', '8', '11621', '26579', '0'), +('1', '23', '8', '1546', '9983', '0'), +('1', '23', '8', '11551', '8753', '0'), +('1', '23', '8', '1409', '7747', '0'), +('1', '23', '6', '1557', '8270', '0'), +('1', '23', '6', '27701', '4911', '0'), +('1', '23', '6', '4302', '4011', '0'), +('1', '23', '6', '4175', '3775', '0'), +('1', '23', '17', '4912', '13062', '0'), +('1', '23', '17', '4832', '13062', '0'), +('1', '23', '17', '4174', '9718', '0'), +('1', '23', '17', '4309', '8225', '0'), +('1', '23', '7', '4913', '6478', '0'), +('1', '23', '7', '4833', '6478', '0'), +('1', '23', '7', '4343', '4808', '0'), +('1', '23', '7', '2986', '3926', '0'), +('1', '23', '9', '4834', '4408', '0'), +('1', '23', '9', '4914', '4408', '0'), +('1', '23', '9', '12189', '3471', '0'), +('1', '23', '9', '4177', '3032', '0'), +('1', '23', '15', '10366', '8054', '0'), +('1', '23', '15', '10151', '7200', '0'), +('1', '23', '15', '14679', '7010', '0'), +('1', '23', '15', '14678', '5708', '0'), +('1', '23', '20', '11673', '24153', '0'), +('1', '23', '20', '11601', '18671', '0'), +('1', '23', '20', '2921', '14470', '0'), +('1', '23', '20', '1365', '10500', '0'), +('1', '23', '12', '4835', '10436', '0'), +('1', '23', '12', '4915', '10436', '0'), +('1', '23', '12', '20655', '7476', '0'), +('1', '23', '12', '11624', '4603', '0'), +('1', '23', '18', '4916', '6871', '0'), +('1', '23', '18', '4836', '6871', '0'), +('1', '23', '18', '4346', '4645', '0'), +('1', '23', '18', '4179', '4393', '0'), +('1', '23', '19', '4917', '6970', '0'), +('1', '23', '19', '4837', '6970', '0'), +('1', '23', '19', '68239', '4760', '0'), +('1', '23', '19', '4180', '3654', '0'), +('1', '23', '13', '11674', '29335', '0'), +('1', '23', '13', '11667', '18172', '0'), +('1', '23', '13', '11550', '17684', '0'), +('1', '23', '13', '5401', '14253', '0'), +('1', '23', '14', '11632', '29371', '0'), +('1', '23', '14', '11674', '29335', '0'), +('1', '23', '14', '11551', '23853', '0'), +('1', '23', '14', '9428', '20353', '0'), +('1', '23', '11', '8408', '7343', '0'), +('1', '23', '11', '45137', '7228', '0'), +('1', '23', '11', '8325', '7168', '0'), +('1', '23', '11', '8811', '5601', '0'), +('1', '24', '22', '8567', '0', '0'), +('1', '24', '22', '10323', '0', '0'), +('1', '24', '22', '66166', '0', '0'), +('1', '24', '22', '10664', '0', '0'), +('1', '24', '1', '14701', '4104', '0'), +('1', '24', '1', '14702', '2500', '0'), +('1', '24', '1', '10165', '1940', '0'), +('1', '24', '1', '14658', '1146', '0'), +('1', '24', '2', '4301', '7726', '0'), +('1', '24', '2', '4911', '6040', '0'), +('1', '24', '2', '4831', '6040', '0'), +('1', '24', '2', '4620', '5084', '0'), +('1', '24', '3', '71529', '3829', '0'), +('1', '24', '3', '21026', '2114', '0'), +('1', '24', '3', '21002', '2114', '0'), +('1', '24', '3', '10144', '1628', '0'), +('1', '24', '5', '14569', '6171', '0'), +('1', '24', '5', '14703', '5500', '0'), +('1', '24', '5', '10055', '4010', '0'), +('1', '24', '5', '14700', '3906', '0'), +('1', '24', '8', '11621', '26579', '0'), +('1', '24', '8', '1546', '9983', '0'), +('1', '24', '8', '11551', '8753', '0'), +('1', '24', '8', '1409', '7747', '0'), +('1', '24', '6', '1557', '8270', '0'), +('1', '24', '6', '27701', '4949', '0'), +('1', '24', '6', '4302', '4043', '0'), +('1', '24', '6', '4175', '3775', '0'), +('1', '24', '17', '4912', '13143', '0'), +('1', '24', '17', '4832', '13143', '0'), +('1', '24', '17', '4174', '9745', '0'), +('1', '24', '17', '4309', '8225', '0'), +('1', '24', '7', '4913', '6478', '0'), +('1', '24', '7', '4833', '6478', '0'), +('1', '24', '7', '4343', '4862', '0'), +('1', '24', '7', '2986', '3926', '0'), +('1', '24', '9', '4834', '4408', '0'), +('1', '24', '9', '4914', '4408', '0'), +('1', '24', '9', '12189', '3471', '0'), +('1', '24', '9', '4177', '3032', '0'), +('1', '24', '15', '10366', '8054', '0'), +('1', '24', '15', '10151', '7200', '0'), +('1', '24', '15', '14679', '7010', '0'), +('1', '24', '15', '14678', '5708', '0'), +('1', '24', '20', '11673', '24218', '0'), +('1', '24', '20', '11601', '18725', '0'), +('1', '24', '20', '2921', '14497', '0'), +('1', '24', '20', '1365', '10500', '0'), +('1', '24', '12', '4835', '10463', '0'), +('1', '24', '12', '4915', '10463', '0'), +('1', '24', '12', '20655', '7487', '0'), +('1', '24', '12', '11624', '4641', '0'), +('1', '24', '18', '4916', '6898', '0'), +('1', '24', '18', '4836', '6898', '0'), +('1', '24', '18', '4346', '4645', '0'), +('1', '24', '18', '4179', '4393', '0'), +('1', '24', '19', '4917', '6970', '0'), +('1', '24', '19', '4837', '6970', '0'), +('1', '24', '19', '68239', '4760', '0'), +('1', '24', '19', '4180', '3654', '0'), +('1', '24', '13', '11674', '29505', '0'), +('1', '24', '13', '11667', '18296', '0'), +('1', '24', '13', '11550', '17783', '0'), +('1', '24', '13', '5401', '14323', '0'), +('1', '24', '14', '11674', '29505', '0'), +('1', '24', '14', '11632', '29453', '0'), +('1', '24', '14', '11551', '23853', '0'), +('1', '24', '14', '9428', '20353', '0'), +('1', '24', '11', '45137', '7617', '0'), +('1', '24', '11', '8408', '7419', '0'), +('1', '24', '11', '8325', '7253', '0'), +('1', '24', '11', '8811', '5667', '0'), +('1', '25', '22', '8567', '0', '0'), +('1', '25', '22', '10323', '0', '0'), +('1', '25', '22', '66166', '0', '0'), +('1', '25', '22', '10664', '0', '0'), +('1', '25', '1', '14701', '4104', '0'), +('1', '25', '1', '14702', '2500', '0'), +('1', '25', '1', '10165', '1940', '0'), +('1', '25', '1', '14658', '1146', '0'), +('1', '25', '2', '4301', '7726', '0'), +('1', '25', '2', '4911', '6040', '0'), +('1', '25', '2', '4831', '6040', '0'), +('1', '25', '2', '4620', '5123', '0'), +('1', '25', '3', '71529', '3851', '0'), +('1', '25', '3', '21026', '2114', '0'), +('1', '25', '3', '21002', '2114', '0'), +('1', '25', '3', '10144', '1628', '0'), +('1', '25', '5', '14569', '6171', '0'), +('1', '25', '5', '14703', '5500', '0'), +('1', '25', '5', '10055', '4010', '0'), +('1', '25', '5', '14700', '3906', '0'), +('1', '25', '8', '11621', '26579', '0'), +('1', '25', '8', '1546', '9983', '0'), +('1', '25', '8', '11551', '8753', '0'), +('1', '25', '8', '1409', '7747', '0'), +('1', '25', '6', '1557', '8270', '0'), +('1', '25', '6', '27701', '4987', '0'), +('1', '25', '6', '4302', '4076', '0'), +('1', '25', '6', '4175', '3775', '0'), +('1', '25', '17', '4912', '13225', '0'), +('1', '25', '17', '4832', '13225', '0'), +('1', '25', '17', '4174', '9772', '0'), +('1', '25', '17', '4309', '8225', '0'), +('1', '25', '7', '4913', '6478', '0'), +('1', '25', '7', '4833', '6478', '0'), +('1', '25', '7', '4343', '4917', '0'), +('1', '25', '7', '2986', '3926', '0'), +('1', '25', '9', '4834', '4408', '0'), +('1', '25', '9', '4914', '4408', '0'), +('1', '25', '9', '12189', '3471', '0'), +('1', '25', '9', '4177', '3032', '0'), +('1', '25', '15', '10366', '8054', '0'), +('1', '25', '15', '10151', '7200', '0'), +('1', '25', '15', '14679', '7010', '0'), +('1', '25', '15', '14678', '5708', '0'), +('1', '25', '20', '11673', '24284', '0'), +('1', '25', '20', '11601', '18780', '0'), +('1', '25', '20', '2921', '14525', '0'), +('1', '25', '20', '1365', '10500', '0'), +('1', '25', '12', '4835', '10490', '0'), +('1', '25', '12', '4915', '10490', '0'), +('1', '25', '12', '20655', '7498', '0'), +('1', '25', '12', '11624', '4679', '0'), +('1', '25', '18', '4916', '6925', '0'), +('1', '25', '18', '4836', '6925', '0'), +('1', '25', '18', '4346', '4645', '0'), +('1', '25', '18', '4179', '4393', '0'), +('1', '25', '19', '4917', '6970', '0'), +('1', '25', '19', '4837', '6970', '0'), +('1', '25', '19', '68239', '4760', '0'), +('1', '25', '19', '4180', '3654', '0'), +('1', '25', '13', '11674', '29646', '0'), +('1', '25', '13', '11667', '18405', '0'), +('1', '25', '13', '11550', '17883', '0'), +('1', '25', '13', '5401', '14394', '0'), +('1', '25', '14', '11674', '29646', '0'), +('1', '25', '14', '11632', '29534', '0'), +('1', '25', '14', '11551', '23853', '0'), +('1', '25', '14', '9428', '20353', '0'), +('1', '25', '11', '45137', '8046', '0'), +('1', '25', '11', '8408', '7494', '0'), +('1', '25', '11', '8325', '7329', '0'), +('1', '25', '11', '8811', '5733', '0'), +('1', '26', '22', '8567', '0', '0'), +('1', '26', '22', '10323', '0', '0'), +('1', '26', '22', '66166', '0', '0'), +('1', '26', '22', '10664', '0', '0'), +('1', '26', '1', '14701', '4104', '0'), +('1', '26', '1', '14702', '2500', '0'), +('1', '26', '1', '10165', '1940', '0'), +('1', '26', '1', '14658', '1146', '0'), +('1', '26', '2', '4301', '7726', '0'), +('1', '26', '2', '4911', '6040', '0'), +('1', '26', '2', '4831', '6040', '0'), +('1', '26', '2', '4620', '5165', '0'), +('1', '26', '3', '71529', '3875', '0'), +('1', '26', '3', '21026', '2114', '0'), +('1', '26', '3', '21002', '2114', '0'), +('1', '26', '3', '10144', '1628', '0'), +('1', '26', '5', '14569', '6171', '0'), +('1', '26', '5', '14703', '5500', '0'), +('1', '26', '5', '10055', '4010', '0'), +('1', '26', '5', '14700', '3906', '0'), +('1', '26', '8', '11621', '26579', '0'), +('1', '26', '8', '1546', '9983', '0'), +('1', '26', '8', '11551', '8753', '0'), +('1', '26', '8', '1409', '7747', '0'), +('1', '26', '6', '1557', '8270', '0'), +('1', '26', '6', '27701', '5029', '0'), +('1', '26', '6', '4302', '4112', '0'), +('1', '26', '6', '4175', '3775', '0'), +('1', '26', '17', '4912', '13315', '0'), +('1', '26', '17', '4832', '13315', '0'), +('1', '26', '17', '4174', '9802', '0'), +('1', '26', '17', '4309', '8225', '0'), +('1', '26', '7', '4913', '6478', '0'), +('1', '26', '7', '4833', '6478', '0'), +('1', '26', '7', '4343', '4977', '0'), +('1', '26', '7', '2986', '3926', '0'), +('1', '26', '9', '4834', '4408', '0'), +('1', '26', '9', '4914', '4408', '0'), +('1', '26', '9', '12189', '3471', '0'), +('1', '26', '9', '4177', '3032', '0'), +('1', '26', '15', '10366', '8054', '0'), +('1', '26', '15', '10151', '7200', '0'), +('1', '26', '15', '14679', '7010', '0'), +('1', '26', '15', '14678', '5708', '0'), +('1', '26', '20', '11673', '24356', '0'), +('1', '26', '20', '11601', '18840', '0'), +('1', '26', '20', '2921', '14555', '0'), +('1', '26', '20', '1365', '10500', '0'), +('1', '26', '12', '4835', '10521', '0'), +('1', '26', '12', '4915', '10521', '0'), +('1', '26', '12', '20655', '7510', '0'), +('1', '26', '12', '11624', '4721', '0'), +('1', '26', '18', '4916', '6955', '0'), +('1', '26', '18', '4836', '6955', '0'), +('1', '26', '18', '4346', '4645', '0'), +('1', '26', '18', '4179', '4393', '0'), +('1', '26', '19', '4917', '6970', '0'), +('1', '26', '19', '4837', '6970', '0'), +('1', '26', '19', '68239', '4760', '0'), +('1', '26', '19', '4180', '3654', '0'), +('1', '26', '13', '11674', '29788', '0'), +('1', '26', '13', '11667', '18532', '0'), +('1', '26', '13', '11550', '17982', '0'), +('1', '26', '13', '5401', '14465', '0'), +('1', '26', '14', '11674', '29788', '0'), +('1', '26', '14', '11632', '29625', '0'), +('1', '26', '14', '11551', '23853', '0'), +('1', '26', '14', '9428', '20353', '0'), +('1', '26', '11', '45137', '8517', '0'), +('1', '26', '11', '8408', '7570', '0'), +('1', '26', '11', '8325', '7414', '0'), +('1', '26', '11', '8811', '5789', '0'), +('1', '27', '22', '8567', '0', '0'), +('1', '27', '22', '10323', '0', '0'), +('1', '27', '22', '66166', '0', '0'), +('1', '27', '22', '10664', '0', '0'), +('1', '27', '1', '14701', '4104', '0'), +('1', '27', '1', '14702', '2500', '0'), +('1', '27', '1', '10165', '1940', '0'), +('1', '27', '1', '14658', '1146', '0'), +('1', '27', '2', '4301', '7726', '0'), +('1', '27', '2', '4911', '6040', '0'), +('1', '27', '2', '4831', '6040', '0'), +('1', '27', '2', '4620', '5203', '0'), +('1', '27', '3', '71529', '3897', '0'), +('1', '27', '3', '21026', '2114', '0'), +('1', '27', '3', '21002', '2114', '0'), +('1', '27', '3', '10144', '1628', '0'), +('1', '27', '5', '14569', '6171', '0'), +('1', '27', '5', '14703', '5500', '0'), +('1', '27', '5', '10055', '4010', '0'), +('1', '27', '5', '14700', '3906', '0'), +('1', '27', '8', '11621', '26579', '0'), +('1', '27', '8', '1546', '9983', '0'), +('1', '27', '8', '11551', '8753', '0'), +('1', '27', '8', '1409', '7747', '0'), +('1', '27', '6', '1557', '8270', '0'), +('1', '27', '6', '27701', '5067', '0'), +('1', '27', '6', '4302', '4145', '0'), +('1', '27', '6', '4175', '3775', '0'), +('1', '27', '17', '4912', '13397', '0'), +('1', '27', '17', '4832', '13397', '0'), +('1', '27', '17', '4174', '9830', '0'), +('1', '27', '17', '4309', '8225', '0'), +('1', '27', '7', '4913', '6478', '0'), +('1', '27', '7', '4833', '6478', '0'), +('1', '27', '7', '4343', '5031', '0'), +('1', '27', '7', '2986', '3926', '0'), +('1', '27', '9', '4834', '4408', '0'), +('1', '27', '9', '4914', '4408', '0'), +('1', '27', '9', '12189', '3471', '0'), +('1', '27', '9', '4177', '3032', '0'), +('1', '27', '15', '10366', '8054', '0'), +('1', '27', '15', '10151', '7200', '0'), +('1', '27', '15', '14679', '7010', '0'), +('1', '27', '15', '14678', '5708', '0'), +('1', '27', '20', '11673', '24421', '0'), +('1', '27', '20', '11601', '18894', '0'), +('1', '27', '20', '2921', '14582', '0'), +('1', '27', '20', '1365', '10500', '0'), +('1', '27', '12', '4835', '10548', '0'), +('1', '27', '12', '4915', '10548', '0'), +('1', '27', '12', '20655', '7521', '0'), +('1', '27', '12', '11624', '4759', '0'), +('1', '27', '18', '4916', '6982', '0'), +('1', '27', '18', '4836', '6982', '0'), +('1', '27', '18', '4346', '4645', '0'), +('1', '27', '18', '4179', '4393', '0'), +('1', '27', '19', '4917', '6970', '0'), +('1', '27', '19', '4837', '6970', '0'), +('1', '27', '19', '68239', '4760', '0'), +('1', '27', '19', '4180', '3654', '0'), +('1', '27', '13', '11674', '29930', '0'), +('1', '27', '13', '11667', '18655', '0'), +('1', '27', '13', '11550', '18081', '0'), +('1', '27', '13', '5401', '14536', '0'), +('1', '27', '14', '11674', '29930', '0'), +('1', '27', '14', '11632', '29707', '0'), +('1', '27', '14', '11551', '23853', '0'), +('1', '27', '14', '9428', '20353', '0'), +('1', '27', '11', '45137', '8883', '0'), +('1', '27', '11', '8408', '7645', '0'), +('1', '27', '11', '8325', '7489', '0'), +('1', '27', '11', '8811', '5856', '0'), +('1', '28', '22', '8567', '0', '0'), +('1', '28', '22', '10323', '0', '0'), +('1', '28', '22', '66166', '0', '0'), +('1', '28', '22', '10664', '0', '0'), +('1', '28', '1', '14701', '4104', '0'), +('1', '28', '1', '14702', '2500', '0'), +('1', '28', '1', '10165', '1940', '0'), +('1', '28', '1', '14658', '1146', '0'), +('1', '28', '2', '4301', '7726', '0'), +('1', '28', '2', '4911', '6040', '0'), +('1', '28', '2', '4831', '6040', '0'), +('1', '28', '2', '4620', '5245', '0'), +('1', '28', '3', '71529', '3921', '0'), +('1', '28', '3', '21026', '2114', '0'), +('1', '28', '3', '21002', '2114', '0'), +('1', '28', '3', '10144', '1628', '0'), +('1', '28', '5', '14569', '6171', '0'), +('1', '28', '5', '14703', '5500', '0'), +('1', '28', '5', '10055', '4010', '0'), +('1', '28', '5', '14700', '3906', '0'), +('1', '28', '8', '11621', '26579', '0'), +('1', '28', '8', '1546', '9983', '0'), +('1', '28', '8', '11551', '8753', '0'), +('1', '28', '8', '1409', '7747', '0'), +('1', '28', '6', '1557', '8270', '0'), +('1', '28', '6', '27701', '5109', '0'), +('1', '28', '6', '4302', '4181', '0'), +('1', '28', '6', '4175', '3775', '0'), +('1', '28', '17', '4912', '13487', '0'), +('1', '28', '17', '4832', '13487', '0'), +('1', '28', '17', '4174', '9860', '0'), +('1', '28', '17', '4309', '8225', '0'), +('1', '28', '7', '4913', '6478', '0'), +('1', '28', '7', '4833', '6478', '0'), +('1', '28', '7', '4343', '5092', '0'), +('1', '28', '7', '2986', '3926', '0'), +('1', '28', '9', '4834', '4408', '0'), +('1', '28', '9', '4914', '4408', '0'), +('1', '28', '9', '12189', '3471', '0'), +('1', '28', '9', '4177', '3032', '0'), +('1', '28', '15', '10366', '8054', '0'), +('1', '28', '15', '10151', '7200', '0'), +('1', '28', '15', '14679', '7010', '0'), +('1', '28', '15', '14678', '5708', '0'), +('1', '28', '20', '11673', '24494', '0'), +('1', '28', '20', '11601', '18955', '0'), +('1', '28', '20', '2921', '14612', '0'), +('1', '28', '20', '1365', '10500', '0'), +('1', '28', '12', '4835', '10578', '0'), +('1', '28', '12', '4915', '10578', '0'), +('1', '28', '12', '20655', '7533', '0'), +('1', '28', '12', '11624', '4801', '0'), +('1', '28', '18', '4916', '7012', '0'), +('1', '28', '18', '4836', '7012', '0'), +('1', '28', '18', '4346', '4645', '0'), +('1', '28', '18', '4179', '4393', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '28', '19', '4917', '6970', '0'), +('1', '28', '19', '4837', '6970', '0'), +('1', '28', '19', '68239', '4760', '0'), +('1', '28', '19', '4180', '3654', '0'), +('1', '28', '13', '11674', '30071', '0'), +('1', '28', '13', '11667', '18767', '0'), +('1', '28', '13', '11550', '18180', '0'), +('1', '28', '13', '5401', '14621', '0'), +('1', '28', '14', '11674', '30071', '0'), +('1', '28', '14', '11632', '29797', '0'), +('1', '28', '14', '11551', '23853', '0'), +('1', '28', '14', '9428', '20353', '0'), +('1', '28', '11', '45137', '9253', '0'), +('1', '28', '11', '8408', '7721', '0'), +('1', '28', '11', '8325', '7574', '0'), +('1', '28', '11', '8811', '5922', '0'), +('1', '29', '22', '8567', '0', '0'), +('1', '29', '22', '10323', '0', '0'), +('1', '29', '22', '66166', '0', '0'), +('1', '29', '22', '10664', '0', '0'), +('1', '29', '1', '14701', '4104', '0'), +('1', '29', '1', '14702', '2500', '0'), +('1', '29', '1', '10165', '1940', '0'), +('1', '29', '1', '14658', '1146', '0'), +('1', '29', '2', '4301', '7726', '0'), +('1', '29', '2', '4911', '6040', '0'), +('1', '29', '2', '4831', '6040', '0'), +('1', '29', '2', '4620', '5283', '0'), +('1', '29', '3', '71529', '3942', '0'), +('1', '29', '3', '21026', '2114', '0'), +('1', '29', '3', '21002', '2114', '0'), +('1', '29', '3', '10144', '1628', '0'), +('1', '29', '5', '14569', '6171', '0'), +('1', '29', '5', '14703', '5500', '0'), +('1', '29', '5', '10055', '4010', '0'), +('1', '29', '5', '14700', '3906', '0'), +('1', '29', '8', '11621', '26579', '0'), +('1', '29', '8', '1546', '9983', '0'), +('1', '29', '8', '11551', '8753', '0'), +('1', '29', '8', '1409', '7747', '0'), +('1', '29', '6', '1557', '8270', '0'), +('1', '29', '6', '27701', '5147', '0'), +('1', '29', '6', '4302', '4214', '0'), +('1', '29', '6', '4175', '3775', '0'), +('1', '29', '17', '4912', '13569', '0'), +('1', '29', '17', '4832', '13569', '0'), +('1', '29', '17', '4174', '9887', '0'), +('1', '29', '17', '4309', '8225', '0'), +('1', '29', '7', '4913', '6478', '0'), +('1', '29', '7', '4833', '6478', '0'), +('1', '29', '7', '4343', '5146', '0'), +('1', '29', '7', '2986', '3926', '0'), +('1', '29', '9', '4914', '4408', '0'), +('1', '29', '9', '4834', '4408', '0'), +('1', '29', '9', '12189', '3471', '0'), +('1', '29', '9', '4177', '3032', '0'), +('1', '29', '15', '10366', '8054', '0'), +('1', '29', '15', '10151', '7200', '0'), +('1', '29', '15', '14679', '7010', '0'), +('1', '29', '15', '14678', '5708', '0'), +('1', '29', '20', '11673', '24559', '0'), +('1', '29', '20', '11601', '19009', '0'), +('1', '29', '20', '2921', '14639', '0'), +('1', '29', '20', '1365', '10500', '0'), +('1', '29', '12', '4835', '10605', '0'), +('1', '29', '12', '4915', '10605', '0'), +('1', '29', '12', '20655', '7544', '0'), +('1', '29', '12', '11624', '4839', '0'), +('1', '29', '18', '4916', '7040', '0'), +('1', '29', '18', '4836', '7040', '0'), +('1', '29', '18', '4346', '4645', '0'), +('1', '29', '18', '4179', '4393', '0'), +('1', '29', '19', '4917', '6970', '0'), +('1', '29', '19', '4837', '6970', '0'), +('1', '29', '19', '68239', '4760', '0'), +('1', '29', '19', '4180', '3654', '0'), +('1', '29', '13', '11674', '30213', '0'), +('1', '29', '13', '11667', '18891', '0'), +('1', '29', '13', '11550', '18265', '0'), +('1', '29', '13', '5401', '14692', '0'), +('1', '29', '14', '11674', '30213', '0'), +('1', '29', '14', '11632', '29879', '0'), +('1', '29', '14', '11551', '23853', '0'), +('1', '29', '14', '9428', '20353', '0'), +('1', '29', '11', '45137', '9670', '0'), +('1', '29', '11', '8408', '7796', '0'), +('1', '29', '11', '8325', '7650', '0'), +('1', '29', '11', '8811', '5978', '0'), +('1', '30', '22', '8567', '0', '0'), +('1', '30', '22', '10323', '0', '0'), +('1', '30', '22', '66166', '0', '0'), +('1', '30', '22', '10664', '0', '0'), +('1', '30', '1', '14701', '4104', '0'), +('1', '30', '1', '14702', '2500', '0'), +('1', '30', '1', '10165', '1940', '0'), +('1', '30', '1', '14658', '1146', '0'), +('1', '30', '2', '4301', '7726', '0'), +('1', '30', '2', '4911', '6040', '0'), +('1', '30', '2', '4831', '6040', '0'), +('1', '30', '2', '4620', '5325', '0'), +('1', '30', '3', '71529', '3967', '0'), +('1', '30', '3', '21026', '2114', '0'), +('1', '30', '3', '21002', '2114', '0'), +('1', '30', '3', '10144', '1628', '0'), +('1', '30', '5', '14569', '6171', '0'), +('1', '30', '5', '14703', '5500', '0'), +('1', '30', '5', '10055', '4010', '0'), +('1', '30', '5', '14700', '3906', '0'), +('1', '30', '8', '11621', '26579', '0'), +('1', '30', '8', '1546', '9983', '0'), +('1', '30', '8', '11551', '8753', '0'), +('1', '30', '8', '1409', '7747', '0'), +('1', '30', '6', '1557', '8270', '0'), +('1', '30', '6', '27701', '5190', '0'), +('1', '30', '6', '4302', '4250', '0'), +('1', '30', '6', '4175', '3775', '0'), +('1', '30', '17', '4912', '13659', '0'), +('1', '30', '17', '4832', '13659', '0'), +('1', '30', '17', '4174', '9917', '0'), +('1', '30', '17', '4309', '8225', '0'), +('1', '30', '7', '4913', '6478', '0'), +('1', '30', '7', '4833', '6478', '0'), +('1', '30', '7', '4343', '5206', '0'), +('1', '30', '7', '2986', '3926', '0'), +('1', '30', '9', '4914', '4408', '0'), +('1', '30', '9', '4834', '4408', '0'), +('1', '30', '9', '12189', '3471', '0'), +('1', '30', '9', '4177', '3032', '0'), +('1', '30', '15', '10366', '8054', '0'), +('1', '30', '15', '10151', '7200', '0'), +('1', '30', '15', '14679', '7010', '0'), +('1', '30', '15', '14678', '5708', '0'), +('1', '30', '20', '11673', '24632', '0'), +('1', '30', '20', '11601', '19070', '0'), +('1', '30', '20', '2921', '14670', '0'), +('1', '30', '20', '1365', '10500', '0'), +('1', '30', '12', '4835', '10635', '0'), +('1', '30', '12', '4915', '10635', '0'), +('1', '30', '12', '20655', '7556', '0'), +('1', '30', '12', '11624', '4882', '0'), +('1', '30', '18', '4916', '7070', '0'), +('1', '30', '18', '4836', '7070', '0'), +('1', '30', '18', '4346', '4645', '0'), +('1', '30', '18', '4179', '4393', '0'), +('1', '30', '19', '4917', '6970', '0'), +('1', '30', '19', '4837', '6970', '0'), +('1', '30', '19', '68239', '4760', '0'), +('1', '30', '19', '4180', '3654', '0'), +('1', '30', '13', '11674', '30383', '0'), +('1', '30', '13', '11667', '19017', '0'), +('1', '30', '13', '11550', '18364', '0'), +('1', '30', '13', '5401', '14763', '0'), +('1', '30', '14', '11674', '30383', '0'), +('1', '30', '14', '11632', '29969', '0'), +('1', '30', '14', '11551', '23853', '0'), +('1', '30', '14', '9428', '20353', '0'), +('1', '30', '11', '45137', '10053', '0'), +('1', '30', '11', '8408', '7872', '0'), +('1', '30', '11', '8325', '7735', '0'), +('1', '30', '11', '8811', '6044', '0'), +('1', '31', '22', '8567', '0', '0'), +('1', '31', '22', '10323', '0', '0'), +('1', '31', '22', '66166', '0', '0'), +('1', '31', '22', '10664', '0', '0'), +('1', '31', '1', '14701', '4104', '0'), +('1', '31', '1', '14702', '2500', '0'), +('1', '31', '1', '10165', '1940', '0'), +('1', '31', '1', '14658', '1146', '0'), +('1', '31', '2', '4301', '7726', '0'), +('1', '31', '2', '4911', '6040', '0'), +('1', '31', '2', '4831', '6040', '0'), +('1', '31', '2', '4620', '5368', '0'), +('1', '31', '3', '71529', '3991', '0'), +('1', '31', '3', '21026', '2114', '0'), +('1', '31', '3', '21002', '2114', '0'), +('1', '31', '3', '10144', '1628', '0'), +('1', '31', '5', '14569', '6171', '0'), +('1', '31', '5', '14703', '5500', '0'), +('1', '31', '5', '10055', '4010', '0'), +('1', '31', '5', '14700', '3906', '0'), +('1', '31', '8', '11621', '26579', '0'), +('1', '31', '8', '1546', '9983', '0'), +('1', '31', '8', '11551', '8753', '0'), +('1', '31', '8', '1409', '7747', '0'), +('1', '31', '6', '1557', '8270', '0'), +('1', '31', '6', '27701', '5232', '0'), +('1', '31', '6', '4302', '4286', '0'), +('1', '31', '6', '4175', '3775', '0'), +('1', '31', '17', '4912', '13750', '0'), +('1', '31', '17', '4832', '13750', '0'), +('1', '31', '17', '4174', '9947', '0'), +('1', '31', '17', '4309', '8225', '0'), +('1', '31', '7', '4913', '6478', '0'), +('1', '31', '7', '4833', '6478', '0'), +('1', '31', '7', '4343', '5267', '0'), +('1', '31', '7', '2986', '3926', '0'), +('1', '31', '9', '4914', '4408', '0'), +('1', '31', '9', '4834', '4408', '0'), +('1', '31', '9', '12189', '3471', '0'), +('1', '31', '9', '4177', '3032', '0'), +('1', '31', '15', '10366', '8054', '0'), +('1', '31', '15', '10151', '7200', '0'), +('1', '31', '15', '14679', '7010', '0'), +('1', '31', '15', '14678', '5708', '0'), +('1', '31', '20', '11673', '24704', '0'), +('1', '31', '20', '11601', '19130', '0'), +('1', '31', '20', '2921', '14700', '0'), +('1', '31', '20', '1365', '10500', '0'), +('1', '31', '12', '4835', '10666', '0'), +('1', '31', '12', '4915', '10666', '0'), +('1', '31', '12', '20655', '7568', '0'), +('1', '31', '12', '11624', '4924', '0'), +('1', '31', '18', '4916', '7100', '0'), +('1', '31', '18', '4836', '7100', '0'), +('1', '31', '18', '4346', '4645', '0'), +('1', '31', '18', '4179', '4393', '0'), +('1', '31', '19', '4917', '6970', '0'), +('1', '31', '19', '4837', '6970', '0'), +('1', '31', '19', '68239', '4760', '0'), +('1', '31', '19', '4180', '3654', '0'), +('1', '31', '13', '11674', '30525', '0'), +('1', '31', '13', '11667', '19129', '0'), +('1', '31', '13', '11550', '18463', '0'), +('1', '31', '13', '5401', '14833', '0'), +('1', '31', '14', '11674', '30525', '0'), +('1', '31', '14', '11632', '30060', '0'), +('1', '31', '14', '11551', '23853', '0'), +('1', '31', '14', '9428', '20353', '0'), +('1', '31', '11', '45137', '10562', '0'), +('1', '31', '11', '8408', '7948', '0'), +('1', '31', '11', '8325', '7811', '0'), +('1', '31', '11', '8811', '6101', '0'), +('1', '32', '22', '8567', '0', '0'), +('1', '32', '22', '10323', '0', '0'), +('1', '32', '22', '66166', '0', '0'), +('1', '32', '22', '10664', '0', '0'), +('1', '32', '1', '14701', '4104', '0'), +('1', '32', '1', '14702', '2500', '0'), +('1', '32', '1', '10165', '1940', '0'), +('1', '32', '1', '14658', '1146', '0'), +('1', '32', '2', '4301', '7726', '0'), +('1', '32', '2', '4911', '6040', '0'), +('1', '32', '2', '4831', '6040', '0'), +('1', '32', '2', '4620', '5410', '0'), +('1', '32', '3', '71529', '4015', '0'), +('1', '32', '3', '21026', '2114', '0'), +('1', '32', '3', '21002', '2114', '0'), +('1', '32', '3', '10144', '1628', '0'), +('1', '32', '5', '14569', '6171', '0'), +('1', '32', '5', '14703', '5500', '0'), +('1', '32', '5', '10055', '4010', '0'), +('1', '32', '5', '14700', '3906', '0'), +('1', '32', '8', '11621', '26579', '0'), +('1', '32', '8', '1546', '9983', '0'), +('1', '32', '8', '11551', '8753', '0'), +('1', '32', '8', '1409', '7747', '0'), +('1', '32', '6', '1557', '8270', '0'), +('1', '32', '6', '27701', '5274', '0'), +('1', '32', '6', '4302', '4322', '0'), +('1', '32', '6', '4175', '3775', '0'), +('1', '32', '17', '4912', '13841', '0'), +('1', '32', '17', '4832', '13841', '0'), +('1', '32', '17', '4174', '9978', '0'), +('1', '32', '17', '4309', '8225', '0'), +('1', '32', '7', '4913', '6478', '0'), +('1', '32', '7', '4833', '6478', '0'), +('1', '32', '7', '4343', '5327', '0'), +('1', '32', '7', '2986', '3926', '0'), +('1', '32', '9', '4914', '4408', '0'), +('1', '32', '9', '4834', '4408', '0'), +('1', '32', '9', '12189', '3471', '0'), +('1', '32', '9', '4177', '3032', '0'), +('1', '32', '15', '10366', '8054', '0'), +('1', '32', '15', '10151', '7200', '0'), +('1', '32', '15', '14679', '7010', '0'), +('1', '32', '15', '14678', '5708', '0'), +('1', '32', '20', '11673', '24777', '0'), +('1', '32', '20', '11601', '19190', '0'), +('1', '32', '20', '2921', '14730', '0'), +('1', '32', '20', '1365', '10500', '0'), +('1', '32', '12', '4835', '10696', '0'), +('1', '32', '12', '4915', '10696', '0'), +('1', '32', '12', '20655', '7580', '0'), +('1', '32', '12', '11624', '4966', '0'), +('1', '32', '18', '4916', '7130', '0'), +('1', '32', '18', '4836', '7130', '0'), +('1', '32', '18', '4346', '4645', '0'), +('1', '32', '18', '4179', '4393', '0'), +('1', '32', '19', '4917', '6970', '0'), +('1', '32', '19', '4837', '6970', '0'), +('1', '32', '19', '68239', '4760', '0'), +('1', '32', '19', '4180', '3654', '0'), +('1', '32', '13', '11674', '30666', '0'), +('1', '32', '13', '11667', '19256', '0'), +('1', '32', '13', '11550', '18563', '0'), +('1', '32', '13', '5401', '14904', '0'), +('1', '32', '14', '11674', '30666', '0'), +('1', '32', '14', '11632', '30151', '0'), +('1', '32', '14', '11551', '23853', '0'), +('1', '32', '14', '9428', '20353', '0'), +('1', '32', '11', '45137', '10949', '0'), +('1', '32', '11', '8408', '8023', '0'), +('1', '32', '11', '8325', '7886', '0'), +('1', '32', '11', '8811', '6167', '0'), +('1', '33', '22', '8567', '0', '0'), +('1', '33', '22', '10323', '0', '0'), +('1', '33', '22', '66166', '0', '0'), +('1', '33', '22', '10664', '0', '0'), +('1', '33', '1', '14701', '4104', '0'), +('1', '33', '1', '14702', '2500', '0'), +('1', '33', '1', '10165', '1940', '0'), +('1', '33', '1', '14658', '1146', '0'), +('1', '33', '2', '4301', '7726', '0'), +('1', '33', '2', '4911', '6040', '0'), +('1', '33', '2', '4831', '6040', '0'), +('1', '33', '2', '4620', '5452', '0'), +('1', '33', '3', '71529', '4039', '0'), +('1', '33', '3', '21026', '2114', '0'), +('1', '33', '3', '21002', '2114', '0'), +('1', '33', '3', '10144', '1628', '0'), +('1', '33', '5', '14569', '6171', '0'), +('1', '33', '5', '14703', '5500', '0'), +('1', '33', '5', '10055', '4010', '0'), +('1', '33', '5', '14700', '3906', '0'), +('1', '33', '8', '11621', '26579', '0'), +('1', '33', '8', '1546', '9983', '0'), +('1', '33', '8', '11551', '8753', '0'), +('1', '33', '8', '1409', '7747', '0'), +('1', '33', '6', '1557', '8270', '0'), +('1', '33', '6', '27701', '5316', '0'), +('1', '33', '6', '4302', '4358', '0'), +('1', '33', '6', '4175', '3775', '0'), +('1', '33', '17', '4912', '13931', '0'), +('1', '33', '17', '4832', '13931', '0'), +('1', '33', '17', '4174', '10008', '0'), +('1', '33', '17', '4309', '8225', '0'), +('1', '33', '7', '4913', '6478', '0'), +('1', '33', '7', '4833', '6478', '0'), +('1', '33', '7', '4343', '5388', '0'), +('1', '33', '7', '2986', '3926', '0'), +('1', '33', '9', '4914', '4408', '0'), +('1', '33', '9', '4834', '4408', '0'), +('1', '33', '9', '12189', '3471', '0'), +('1', '33', '9', '4177', '3032', '0'), +('1', '33', '15', '10366', '8054', '0'), +('1', '33', '15', '10151', '7200', '0'), +('1', '33', '15', '14679', '7010', '0'), +('1', '33', '15', '14678', '5708', '0'), +('1', '33', '20', '11673', '24849', '0'), +('1', '33', '20', '11601', '19251', '0'), +('1', '33', '20', '2921', '14760', '0'), +('1', '33', '20', '1365', '10500', '0'), +('1', '33', '12', '4835', '10726', '0'), +('1', '33', '12', '4915', '10726', '0'), +('1', '33', '12', '20655', '7592', '0'), +('1', '33', '12', '11624', '5009', '0'), +('1', '33', '18', '4916', '7160', '0'), +('1', '33', '18', '4836', '7160', '0'), +('1', '33', '18', '4346', '4645', '0'), +('1', '33', '18', '4179', '4393', '0'), +('1', '33', '19', '4917', '6970', '0'), +('1', '33', '19', '4837', '6970', '0'), +('1', '33', '19', '68239', '4760', '0'), +('1', '33', '19', '4180', '3654', '0'), +('1', '33', '13', '11674', '30808', '0'), +('1', '33', '13', '11667', '19368', '0'), +('1', '33', '13', '11550', '18662', '0'), +('1', '33', '13', '5401', '14975', '0'), +('1', '33', '14', '11674', '30808', '0'), +('1', '33', '14', '11632', '30241', '0'), +('1', '33', '14', '11551', '23853', '0'), +('1', '33', '14', '9428', '20353', '0'), +('1', '33', '11', '45137', '11394', '0'), +('1', '33', '11', '8408', '8108', '0'), +('1', '33', '11', '8325', '7971', '0'), +('1', '33', '11', '8811', '6233', '0'), +('1', '34', '22', '8567', '0', '0'), +('1', '34', '22', '10323', '0', '0'), +('1', '34', '22', '66166', '0', '0'), +('1', '34', '22', '10664', '0', '0'), +('1', '34', '1', '14701', '4104', '0'), +('1', '34', '1', '14702', '2500', '0'), +('1', '34', '1', '10165', '1940', '0'), +('1', '34', '1', '14658', '1146', '0'), +('1', '34', '2', '4301', '7726', '0'), +('1', '34', '2', '4911', '6040', '0'), +('1', '34', '2', '4831', '6040', '0'), +('1', '34', '2', '4620', '5495', '0'), +('1', '34', '3', '71529', '4063', '0'), +('1', '34', '3', '21026', '2114', '0'), +('1', '34', '3', '21002', '2114', '0'), +('1', '34', '3', '10144', '1628', '0'), +('1', '34', '5', '14569', '6171', '0'), +('1', '34', '5', '14703', '5500', '0'), +('1', '34', '5', '10055', '4010', '0'), +('1', '34', '5', '14700', '3906', '0'), +('1', '34', '8', '11621', '26579', '0'), +('1', '34', '8', '1546', '9983', '0'), +('1', '34', '8', '11551', '8753', '0'), +('1', '34', '8', '1409', '7747', '0'), +('1', '34', '6', '1557', '8270', '0'), +('1', '34', '6', '27701', '5359', '0'), +('1', '34', '6', '4302', '4395', '0'), +('1', '34', '6', '4175', '3775', '0'), +('1', '34', '17', '4912', '14022', '0'), +('1', '34', '17', '4832', '14022', '0'), +('1', '34', '17', '4174', '10038', '0'), +('1', '34', '17', '4309', '8225', '0'), +('1', '34', '7', '4913', '6478', '0'), +('1', '34', '7', '4833', '6478', '0'), +('1', '34', '7', '4343', '5448', '0'), +('1', '34', '7', '2986', '3926', '0'), +('1', '34', '9', '4914', '4408', '0'), +('1', '34', '9', '4834', '4408', '0'), +('1', '34', '9', '12189', '3471', '0'), +('1', '34', '9', '4177', '3032', '0'), +('1', '34', '15', '10366', '8054', '0'), +('1', '34', '15', '10151', '7200', '0'), +('1', '34', '15', '14679', '7010', '0'), +('1', '34', '15', '14678', '5708', '0'), +('1', '34', '20', '11673', '24921', '0'), +('1', '34', '20', '11601', '19311', '0'), +('1', '34', '20', '2921', '14790', '0'), +('1', '34', '20', '1365', '10500', '0'), +('1', '34', '12', '4835', '10756', '0'), +('1', '34', '12', '4915', '10756', '0'), +('1', '34', '12', '20655', '7604', '0'), +('1', '34', '12', '11624', '5051', '0'), +('1', '34', '18', '4916', '7191', '0'), +('1', '34', '18', '4836', '7191', '0'), +('1', '34', '18', '4346', '4645', '0'), +('1', '34', '18', '4179', '4393', '0'), +('1', '34', '19', '4917', '6970', '0'), +('1', '34', '19', '4837', '6970', '0'), +('1', '34', '19', '68239', '4760', '0'), +('1', '34', '19', '4180', '3654', '0'), +('1', '34', '13', '11674', '30950', '0'), +('1', '34', '13', '11667', '19494', '0'), +('1', '34', '13', '11550', '18761', '0'), +('1', '34', '13', '5401', '15046', '0'), +('1', '34', '14', '11674', '30950', '0'), +('1', '34', '14', '11632', '30332', '0'), +('1', '34', '14', '11551', '23853', '0'), +('1', '34', '14', '9428', '20353', '0'), +('1', '34', '11', '45137', '11795', '0'), +('1', '34', '11', '8408', '8184', '0'), +('1', '34', '11', '8325', '8047', '0'), +('1', '34', '11', '8811', '6290', '0'), +('1', '35', '22', '8567', '0', '0'), +('1', '35', '22', '10323', '0', '0'), +('1', '35', '22', '66166', '0', '0'), +('1', '35', '22', '10664', '0', '0'), +('1', '35', '1', '14701', '4104', '0'), +('1', '35', '1', '14702', '2500', '0'), +('1', '35', '1', '10165', '1940', '0'), +('1', '35', '1', '14658', '1146', '0'), +('1', '35', '2', '4301', '7726', '0'), +('1', '35', '2', '4911', '6040', '0'), +('1', '35', '2', '4831', '6040', '0'), +('1', '35', '2', '4620', '5537', '0'), +('1', '35', '3', '71529', '4087', '0'), +('1', '35', '3', '21026', '2114', '0'), +('1', '35', '3', '21002', '2114', '0'), +('1', '35', '3', '10144', '1628', '0'), +('1', '35', '5', '14569', '6171', '0'), +('1', '35', '5', '14703', '5500', '0'), +('1', '35', '5', '10055', '4010', '0'), +('1', '35', '5', '14700', '3906', '0'), +('1', '35', '8', '11621', '26579', '0'), +('1', '35', '8', '1546', '9983', '0'), +('1', '35', '8', '11551', '8753', '0'), +('1', '35', '8', '1409', '7747', '0'), +('1', '35', '6', '1557', '8270', '0'), +('1', '35', '6', '27701', '5401', '0'), +('1', '35', '6', '4302', '4431', '0'), +('1', '35', '6', '4175', '3775', '0'), +('1', '35', '17', '4912', '14112', '0'), +('1', '35', '17', '4832', '14112', '0'), +('1', '35', '17', '4174', '10068', '0'), +('1', '35', '17', '4309', '8225', '0'), +('1', '35', '7', '4913', '6478', '0'), +('1', '35', '7', '4833', '6478', '0'), +('1', '35', '7', '4343', '5508', '0'), +('1', '35', '7', '2986', '3926', '0'), +('1', '35', '9', '4914', '4408', '0'), +('1', '35', '9', '4834', '4408', '0'), +('1', '35', '9', '12189', '3471', '0'), +('1', '35', '9', '4177', '3032', '0'), +('1', '35', '15', '10366', '8054', '0'), +('1', '35', '15', '10151', '7200', '0'), +('1', '35', '15', '14679', '7010', '0'), +('1', '35', '15', '14678', '5708', '0'), +('1', '35', '20', '11673', '24994', '0'), +('1', '35', '20', '11601', '19372', '0'), +('1', '35', '20', '2921', '14821', '0'), +('1', '35', '20', '1365', '10500', '0'), +('1', '35', '12', '4835', '10786', '0'), +('1', '35', '12', '4915', '10786', '0'), +('1', '35', '12', '20655', '7616', '0'), +('1', '35', '12', '11624', '5093', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '35', '18', '4916', '7221', '0'), +('1', '35', '18', '4836', '7221', '0'), +('1', '35', '18', '4346', '4645', '0'), +('1', '35', '18', '4179', '4393', '0'), +('1', '35', '19', '4917', '6970', '0'), +('1', '35', '19', '4837', '6970', '0'), +('1', '35', '19', '68239', '4760', '0'), +('1', '35', '19', '4180', '3654', '0'), +('1', '35', '13', '11674', '31120', '0'), +('1', '35', '13', '11667', '19621', '0'), +('1', '35', '13', '11550', '18846', '0'), +('1', '35', '13', '5401', '15117', '0'), +('1', '35', '14', '11674', '31120', '0'), +('1', '35', '14', '11632', '30422', '0'), +('1', '35', '14', '11551', '23853', '0'), +('1', '35', '14', '9428', '20353', '0'), +('1', '35', '11', '45137', '12329', '0'), +('1', '35', '11', '8408', '8259', '0'), +('1', '35', '11', '8325', '8132', '0'), +('1', '35', '11', '8811', '6356', '0'), +('1', '36', '22', '8567', '0', '0'), +('1', '36', '22', '10323', '0', '0'), +('1', '36', '22', '66166', '0', '0'), +('1', '36', '22', '10664', '0', '0'), +('1', '36', '1', '14701', '4104', '0'), +('1', '36', '1', '14702', '2500', '0'), +('1', '36', '1', '10165', '1940', '0'), +('1', '36', '1', '14658', '1146', '0'), +('1', '36', '2', '4301', '7726', '0'), +('1', '36', '2', '4911', '6040', '0'), +('1', '36', '2', '4831', '6040', '0'), +('1', '36', '2', '4620', '5579', '0'), +('1', '36', '3', '71529', '4112', '0'), +('1', '36', '3', '21026', '2114', '0'), +('1', '36', '3', '21002', '2114', '0'), +('1', '36', '3', '10144', '1628', '0'), +('1', '36', '5', '14569', '6171', '0'), +('1', '36', '5', '14703', '5500', '0'), +('1', '36', '5', '10055', '4010', '0'), +('1', '36', '5', '14700', '3906', '0'), +('1', '36', '8', '11621', '26579', '0'), +('1', '36', '8', '1546', '9983', '0'), +('1', '36', '8', '11551', '8753', '0'), +('1', '36', '8', '1409', '7747', '0'), +('1', '36', '6', '1557', '8270', '0'), +('1', '36', '6', '27701', '5443', '0'), +('1', '36', '6', '4302', '4467', '0'), +('1', '36', '6', '4175', '3775', '0'), +('1', '36', '17', '4912', '14203', '0'), +('1', '36', '17', '4832', '14203', '0'), +('1', '36', '17', '4174', '10098', '0'), +('1', '36', '17', '4309', '8225', '0'), +('1', '36', '7', '4913', '6478', '0'), +('1', '36', '7', '4833', '6478', '0'), +('1', '36', '7', '4343', '5569', '0'), +('1', '36', '7', '2986', '3926', '0'), +('1', '36', '9', '4914', '4408', '0'), +('1', '36', '9', '4834', '4408', '0'), +('1', '36', '9', '12189', '3471', '0'), +('1', '36', '9', '4177', '3032', '0'), +('1', '36', '15', '10366', '8054', '0'), +('1', '36', '15', '10151', '7200', '0'), +('1', '36', '15', '14679', '7010', '0'), +('1', '36', '15', '14678', '5708', '0'), +('1', '36', '20', '11673', '25066', '0'), +('1', '36', '20', '11601', '19432', '0'), +('1', '36', '20', '2921', '14851', '0'), +('1', '36', '20', '1365', '10500', '0'), +('1', '36', '12', '4835', '10817', '0'), +('1', '36', '12', '4915', '10817', '0'), +('1', '36', '12', '20655', '7628', '0'), +('1', '36', '12', '11624', '5135', '0'), +('1', '36', '18', '4916', '7251', '0'), +('1', '36', '18', '4836', '7251', '0'), +('1', '36', '18', '4346', '4645', '0'), +('1', '36', '18', '4179', '4393', '0'), +('1', '36', '19', '4917', '6970', '0'), +('1', '36', '19', '4837', '6970', '0'), +('1', '36', '19', '68239', '4760', '0'), +('1', '36', '19', '4180', '3654', '0'), +('1', '36', '13', '11674', '31261', '0'), +('1', '36', '13', '11667', '19733', '0'), +('1', '36', '13', '11550', '18945', '0'), +('1', '36', '13', '5401', '15202', '0'), +('1', '36', '14', '11674', '31261', '0'), +('1', '36', '14', '11632', '30513', '0'), +('1', '36', '14', '11551', '23853', '0'), +('1', '36', '14', '9428', '20353', '0'), +('1', '36', '11', '45137', '12752', '0'), +('1', '36', '11', '8408', '8335', '0'), +('1', '36', '11', '8325', '8207', '0'), +('1', '36', '11', '8811', '6422', '0'), +('1', '37', '22', '8567', '0', '0'), +('1', '37', '22', '10323', '0', '0'), +('1', '37', '22', '66166', '0', '0'), +('1', '37', '22', '10664', '0', '0'), +('1', '37', '1', '14701', '4104', '0'), +('1', '37', '1', '14702', '2500', '0'), +('1', '37', '1', '10165', '1940', '0'), +('1', '37', '1', '14623', '1181', '0'), +('1', '37', '2', '4301', '7726', '0'), +('1', '37', '2', '4911', '6040', '0'), +('1', '37', '2', '4831', '6040', '0'), +('1', '37', '2', '4620', '5621', '0'), +('1', '37', '3', '71529', '4136', '0'), +('1', '37', '3', '21026', '2114', '0'), +('1', '37', '3', '21002', '2114', '0'), +('1', '37', '3', '10144', '1628', '0'), +('1', '37', '5', '14569', '6171', '0'), +('1', '37', '5', '14703', '5500', '0'), +('1', '37', '5', '10055', '4010', '0'), +('1', '37', '5', '14700', '3906', '0'), +('1', '37', '8', '11621', '26579', '0'), +('1', '37', '8', '1546', '9983', '0'), +('1', '37', '8', '11551', '8753', '0'), +('1', '37', '8', '1409', '7747', '0'), +('1', '37', '6', '1557', '8270', '0'), +('1', '37', '6', '27701', '5486', '0'), +('1', '37', '6', '4302', '4503', '0'), +('1', '37', '6', '4175', '3775', '0'), +('1', '37', '17', '4912', '14294', '0'), +('1', '37', '17', '4832', '14294', '0'), +('1', '37', '17', '4174', '10129', '0'), +('1', '37', '17', '4309', '8225', '0'), +('1', '37', '7', '4913', '6478', '0'), +('1', '37', '7', '4833', '6478', '0'), +('1', '37', '7', '4343', '5629', '0'), +('1', '37', '7', '2986', '3926', '0'), +('1', '37', '9', '4914', '4408', '0'), +('1', '37', '9', '4834', '4408', '0'), +('1', '37', '9', '12189', '3471', '0'), +('1', '37', '9', '4311', '3070', '0'), +('1', '37', '15', '10366', '8054', '0'), +('1', '37', '15', '10151', '7200', '0'), +('1', '37', '15', '14679', '7010', '0'), +('1', '37', '15', '14678', '5708', '0'), +('1', '37', '20', '11673', '25139', '0'), +('1', '37', '20', '11601', '19492', '0'), +('1', '37', '20', '2921', '14881', '0'), +('1', '37', '20', '1365', '10500', '0'), +('1', '37', '12', '4835', '10847', '0'), +('1', '37', '12', '4915', '10847', '0'), +('1', '37', '12', '20655', '7641', '0'), +('1', '37', '12', '11624', '5178', '0'), +('1', '37', '18', '4916', '7281', '0'), +('1', '37', '18', '4836', '7281', '0'), +('1', '37', '18', '4346', '4645', '0'), +('1', '37', '18', '4179', '4393', '0'), +('1', '37', '19', '4917', '6970', '0'), +('1', '37', '19', '4837', '6970', '0'), +('1', '37', '19', '68239', '4760', '0'), +('1', '37', '19', '4180', '3654', '0'), +('1', '37', '13', '11674', '31403', '0'), +('1', '37', '13', '11667', '19859', '0'), +('1', '37', '13', '11550', '19044', '0'), +('1', '37', '13', '5401', '15273', '0'), +('1', '37', '14', '11674', '31403', '0'), +('1', '37', '14', '11632', '30604', '0'), +('1', '37', '14', '11551', '23853', '0'), +('1', '37', '14', '9428', '20353', '0'), +('1', '37', '11', '45137', '13215', '0'), +('1', '37', '11', '8408', '8410', '0'), +('1', '37', '11', '8325', '8292', '0'), +('1', '37', '11', '8811', '6479', '0'), +('1', '38', '22', '8567', '0', '0'), +('1', '38', '22', '10323', '0', '0'), +('1', '38', '22', '66166', '0', '0'), +('1', '38', '22', '10664', '0', '0'), +('1', '38', '1', '14701', '4104', '0'), +('1', '38', '1', '14702', '2500', '0'), +('1', '38', '1', '10165', '1940', '0'), +('1', '38', '1', '14623', '1218', '0'), +('1', '38', '2', '4301', '7726', '0'), +('1', '38', '2', '4911', '6040', '0'), +('1', '38', '2', '4831', '6040', '0'), +('1', '38', '2', '4620', '5664', '0'), +('1', '38', '3', '71529', '4160', '0'), +('1', '38', '3', '21026', '2114', '0'), +('1', '38', '3', '21002', '2114', '0'), +('1', '38', '3', '10144', '1628', '0'), +('1', '38', '5', '14569', '6171', '0'), +('1', '38', '5', '14703', '5500', '0'), +('1', '38', '5', '10055', '4010', '0'), +('1', '38', '5', '14700', '3906', '0'), +('1', '38', '8', '11621', '26579', '0'), +('1', '38', '8', '1546', '9983', '0'), +('1', '38', '8', '11551', '8753', '0'), +('1', '38', '8', '1409', '7747', '0'), +('1', '38', '6', '1557', '8270', '0'), +('1', '38', '6', '27701', '5528', '0'), +('1', '38', '6', '4302', '4540', '0'), +('1', '38', '6', '4175', '3775', '0'), +('1', '38', '17', '4912', '14384', '0'), +('1', '38', '17', '4832', '14384', '0'), +('1', '38', '17', '4174', '10159', '0'), +('1', '38', '17', '4309', '8225', '0'), +('1', '38', '7', '4913', '6478', '0'), +('1', '38', '7', '4833', '6478', '0'), +('1', '38', '7', '4343', '5690', '0'), +('1', '38', '7', '2986', '3926', '0'), +('1', '38', '9', '4914', '4408', '0'), +('1', '38', '9', '4834', '4408', '0'), +('1', '38', '9', '12189', '3471', '0'), +('1', '38', '9', '4311', '3112', '0'), +('1', '38', '15', '10366', '8054', '0'), +('1', '38', '15', '10151', '7200', '0'), +('1', '38', '15', '14679', '7010', '0'), +('1', '38', '15', '14678', '5708', '0'), +('1', '38', '20', '11673', '25211', '0'), +('1', '38', '20', '11601', '19553', '0'), +('1', '38', '20', '2921', '14911', '0'), +('1', '38', '20', '1365', '10500', '0'), +('1', '38', '12', '4835', '10877', '0'), +('1', '38', '12', '4915', '10877', '0'), +('1', '38', '12', '20655', '7653', '0'), +('1', '38', '12', '11624', '5220', '0'), +('1', '38', '18', '4916', '7311', '0'), +('1', '38', '18', '4836', '7311', '0'), +('1', '38', '18', '4346', '4645', '0'), +('1', '38', '18', '4179', '4393', '0'), +('1', '38', '19', '4917', '6970', '0'), +('1', '38', '19', '4837', '6970', '0'), +('1', '38', '19', '68239', '4760', '0'), +('1', '38', '19', '4180', '3654', '0'), +('1', '38', '13', '11674', '31545', '0'), +('1', '38', '13', '3554', '22675', '0'), +('1', '38', '13', '11667', '19986', '0'), +('1', '38', '13', '11550', '19143', '0'), +('1', '38', '14', '11674', '31545', '0'), +('1', '38', '14', '11632', '30694', '0'), +('1', '38', '14', '11551', '23853', '0'), +('1', '38', '14', '3554', '22675', '0'), +('1', '38', '11', '45137', '13641', '0'), +('1', '38', '11', '8408', '8486', '0'), +('1', '38', '11', '8325', '8368', '0'), +('1', '38', '11', '8811', '6545', '0'), +('1', '39', '22', '8567', '0', '0'), +('1', '39', '22', '10323', '0', '0'), +('1', '39', '22', '66166', '0', '0'), +('1', '39', '22', '10664', '0', '0'), +('1', '39', '1', '14701', '4104', '0'), +('1', '39', '1', '14702', '2500', '0'), +('1', '39', '1', '10165', '1940', '0'), +('1', '39', '1', '14623', '1258', '0'), +('1', '39', '2', '4301', '7726', '0'), +('1', '39', '2', '4911', '6040', '0'), +('1', '39', '2', '4831', '6040', '0'), +('1', '39', '2', '4620', '5710', '0'), +('1', '39', '3', '71529', '4187', '0'), +('1', '39', '3', '21026', '2114', '0'), +('1', '39', '3', '21002', '2114', '0'), +('1', '39', '3', '10144', '1628', '0'), +('1', '39', '5', '14569', '6171', '0'), +('1', '39', '5', '14703', '5500', '0'), +('1', '39', '5', '10055', '4010', '0'), +('1', '39', '5', '14700', '3906', '0'), +('1', '39', '8', '11621', '26579', '0'), +('1', '39', '8', '1546', '9983', '0'), +('1', '39', '8', '11551', '8753', '0'), +('1', '39', '8', '1409', '7747', '0'), +('1', '39', '6', '1557', '8270', '0'), +('1', '39', '6', '27701', '5574', '0'), +('1', '39', '6', '4302', '4580', '0'), +('1', '39', '6', '4175', '3775', '0'), +('1', '39', '17', '4912', '14484', '0'), +('1', '39', '17', '4832', '14484', '0'), +('1', '39', '17', '4174', '10192', '0'), +('1', '39', '17', '4309', '8225', '0'), +('1', '39', '7', '4913', '6478', '0'), +('1', '39', '7', '4833', '6478', '0'), +('1', '39', '7', '4343', '5756', '0'), +('1', '39', '7', '2986', '3926', '0'), +('1', '39', '9', '4914', '4408', '0'), +('1', '39', '9', '4834', '4408', '0'), +('1', '39', '9', '12189', '3471', '0'), +('1', '39', '9', '4311', '3158', '0'), +('1', '39', '15', '10366', '8054', '0'), +('1', '39', '15', '10151', '7200', '0'), +('1', '39', '15', '14679', '7010', '0'), +('1', '39', '15', '14678', '5708', '0'), +('1', '39', '20', '11673', '25291', '0'), +('1', '39', '20', '11601', '19619', '0'), +('1', '39', '20', '2921', '14944', '0'), +('1', '39', '20', '1365', '10500', '0'), +('1', '39', '12', '4835', '10910', '0'), +('1', '39', '12', '4915', '10910', '0'), +('1', '39', '12', '20655', '7666', '0'), +('1', '39', '12', '11624', '5266', '0'), +('1', '39', '18', '4916', '7345', '0'), +('1', '39', '18', '4836', '7345', '0'), +('1', '39', '18', '4346', '4645', '0'), +('1', '39', '18', '4179', '4393', '0'), +('1', '39', '19', '4917', '6970', '0'), +('1', '39', '19', '4837', '6970', '0'), +('1', '39', '19', '68239', '4760', '0'), +('1', '39', '19', '4180', '3654', '0'), +('1', '39', '13', '11674', '31686', '0'), +('1', '39', '13', '3554', '22808', '0'), +('1', '39', '13', '11667', '20100', '0'), +('1', '39', '13', '11550', '19243', '0'), +('1', '39', '14', '11674', '31686', '0'), +('1', '39', '14', '11632', '30794', '0'), +('1', '39', '14', '11551', '23853', '0'), +('1', '39', '14', '3554', '22808', '0'), +('1', '39', '11', '45137', '14206', '0'), +('1', '39', '11', '8408', '8561', '0'), +('1', '39', '11', '8325', '8453', '0'), +('1', '39', '11', '8811', '6602', '0'), +('1', '40', '22', '8567', '0', '0'), +('1', '40', '22', '10323', '0', '0'), +('1', '40', '22', '66166', '0', '0'), +('1', '40', '22', '10664', '0', '0'), +('1', '40', '1', '14701', '4104', '0'), +('1', '40', '1', '14702', '2500', '0'), +('1', '40', '1', '10165', '1940', '0'), +('1', '40', '1', '14623', '1294', '0'), +('1', '40', '2', '4301', '7726', '0'), +('1', '40', '2', '4911', '6040', '0'), +('1', '40', '2', '4831', '6040', '0'), +('1', '40', '2', '4620', '5752', '0'), +('1', '40', '3', '71529', '4211', '0'), +('1', '40', '3', '21026', '2114', '0'), +('1', '40', '3', '21002', '2114', '0'), +('1', '40', '3', '10144', '1628', '0'), +('1', '40', '5', '14569', '6171', '0'), +('1', '40', '5', '14703', '5500', '0'), +('1', '40', '5', '10055', '4010', '0'), +('1', '40', '5', '14700', '3906', '0'), +('1', '40', '8', '11621', '26579', '0'), +('1', '40', '8', '1546', '9983', '0'), +('1', '40', '8', '11551', '8753', '0'), +('1', '40', '8', '1409', '7747', '0'), +('1', '40', '6', '1557', '8270', '0'), +('1', '40', '6', '27701', '5617', '0'), +('1', '40', '6', '4302', '4616', '0'), +('1', '40', '6', '4175', '3775', '0'), +('1', '40', '17', '4912', '14575', '0'), +('1', '40', '17', '4832', '14575', '0'), +('1', '40', '17', '4174', '10222', '0'), +('1', '40', '17', '4309', '8225', '0'), +('1', '40', '7', '4913', '6478', '0'), +('1', '40', '7', '4833', '6478', '0'), +('1', '40', '7', '4343', '5817', '0'), +('1', '40', '7', '2986', '3926', '0'), +('1', '40', '9', '4914', '4408', '0'), +('1', '40', '9', '4834', '4408', '0'), +('1', '40', '9', '12189', '3471', '0'), +('1', '40', '9', '4311', '3201', '0'), +('1', '40', '15', '10366', '8054', '0'), +('1', '40', '15', '10151', '7200', '0'), +('1', '40', '15', '14679', '7010', '0'), +('1', '40', '15', '14678', '5708', '0'), +('1', '40', '20', '11673', '25364', '0'), +('1', '40', '20', '11601', '19680', '0'), +('1', '40', '20', '2921', '14975', '0'), +('1', '40', '20', '1365', '10500', '0'), +('1', '40', '12', '4835', '10940', '0'), +('1', '40', '12', '4915', '10940', '0'), +('1', '40', '12', '20655', '7678', '0'), +('1', '40', '12', '11624', '5309', '0'), +('1', '40', '18', '4916', '7375', '0'), +('1', '40', '18', '4836', '7375', '0'), +('1', '40', '18', '4346', '4645', '0'), +('1', '40', '18', '4179', '4393', '0'), +('1', '40', '19', '4917', '6970', '0'), +('1', '40', '19', '4837', '6970', '0'), +('1', '40', '19', '68239', '4760', '0'), +('1', '40', '19', '4180', '3654', '0'), +('1', '40', '13', '11674', '31828', '0'), +('1', '40', '13', '3554', '22968', '0'), +('1', '40', '13', '11667', '20227', '0'), +('1', '40', '13', '11550', '19342', '0'), +('1', '40', '14', '11674', '31828', '0'), +('1', '40', '14', '11632', '30884', '0'), +('1', '40', '14', '11551', '23853', '0'), +('1', '40', '14', '3554', '22968', '0'), +('1', '40', '11', '45137', '14646', '0'), +('1', '40', '11', '8408', '8637', '0'), +('1', '40', '11', '8325', '8528', '0'), +('1', '40', '11', '8811', '6668', '0'), +('1', '41', '22', '8567', '0', '0'), +('1', '41', '22', '10323', '0', '0'), +('1', '41', '22', '66166', '0', '0'), +('1', '41', '22', '10664', '0', '0'), +('1', '41', '1', '14701', '4104', '0'), +('1', '41', '1', '14702', '2500', '0'), +('1', '41', '1', '10165', '1940', '0'), +('1', '41', '1', '14623', '1334', '0'), +('1', '41', '2', '4301', '7726', '0'), +('1', '41', '2', '4911', '6040', '0'), +('1', '41', '2', '4831', '6040', '0'), +('1', '41', '2', '4620', '5799', '0'), +('1', '41', '3', '71529', '4237', '0'), +('1', '41', '3', '21026', '2114', '0'), +('1', '41', '3', '21002', '2114', '0'), +('1', '41', '3', '10144', '1628', '0'), +('1', '41', '5', '14569', '6171', '0'), +('1', '41', '5', '14703', '5500', '0'), +('1', '41', '5', '10055', '4010', '0'), +('1', '41', '5', '14700', '3906', '0'), +('1', '41', '8', '11621', '26579', '0'), +('1', '41', '8', '1546', '9983', '0'), +('1', '41', '8', '11551', '8753', '0'), +('1', '41', '8', '1409', '7747', '0'), +('1', '41', '6', '1557', '8270', '0'), +('1', '41', '6', '27701', '5663', '0'), +('1', '41', '6', '4302', '4656', '0'), +('1', '41', '6', '4175', '3775', '0'), +('1', '41', '17', '4912', '14674', '0'), +('1', '41', '17', '4832', '14674', '0'), +('1', '41', '17', '4174', '10255', '0'), +('1', '41', '17', '4309', '8225', '0'), +('1', '41', '7', '4913', '6478', '0'), +('1', '41', '7', '4833', '6478', '0'), +('1', '41', '7', '4343', '5883', '0'), +('1', '41', '7', '2986', '3926', '0'), +('1', '41', '9', '4914', '4408', '0'), +('1', '41', '9', '4834', '4408', '0'), +('1', '41', '9', '12189', '3471', '0'), +('1', '41', '9', '4311', '3247', '0'), +('1', '41', '15', '10366', '8054', '0'), +('1', '41', '15', '10151', '7200', '0'), +('1', '41', '15', '14679', '7010', '0'), +('1', '41', '15', '14678', '5708', '0'), +('1', '41', '20', '11673', '25443', '0'), +('1', '41', '20', '11601', '19746', '0'), +('1', '41', '20', '2921', '15008', '0'), +('1', '41', '20', '1365', '10500', '0'), +('1', '41', '12', '4835', '10974', '0'), +('1', '41', '12', '4915', '10974', '0'), +('1', '41', '12', '20655', '7691', '0'), +('1', '41', '12', '11624', '5355', '0'), +('1', '41', '18', '4836', '7408', '0'), +('1', '41', '18', '4916', '7408', '0'), +('1', '41', '18', '4346', '4645', '0'), +('1', '41', '18', '4179', '4393', '0'), +('1', '41', '19', '4917', '6970', '0'), +('1', '41', '19', '4837', '6970', '0'), +('1', '41', '19', '68239', '4760', '0'), +('1', '41', '19', '4180', '3654', '0'), +('1', '41', '13', '11674', '31998', '0'), +('1', '41', '13', '3554', '23101', '0'), +('1', '41', '13', '11667', '20356', '0'), +('1', '41', '13', '11550', '19441', '0'), +('1', '41', '14', '11674', '31998', '0'), +('1', '41', '14', '11632', '30984', '0'), +('1', '41', '14', '11551', '23853', '0'), +('1', '41', '14', '3554', '23101', '0'), +('1', '41', '11', '45137', '15186', '0'), +('1', '41', '11', '8408', '8713', '0'), +('1', '41', '11', '8325', '8613', '0'), +('1', '41', '11', '8811', '6734', '0'), +('1', '42', '22', '8567', '0', '0'), +('1', '42', '22', '10323', '0', '0'), +('1', '42', '22', '66166', '0', '0'), +('1', '42', '22', '10664', '0', '0'), +('1', '42', '1', '14701', '4104', '0'), +('1', '42', '1', '14702', '2500', '0'), +('1', '42', '1', '10165', '1940', '0'), +('1', '42', '1', '14623', '1373', '0'), +('1', '42', '2', '4301', '7726', '0'), +('1', '42', '2', '4911', '6040', '0'), +('1', '42', '2', '4831', '6040', '0'), +('1', '42', '2', '4620', '5846', '0'), +('1', '42', '3', '71529', '4264', '0'), +('1', '42', '3', '21026', '2114', '0'), +('1', '42', '3', '21002', '2114', '0'), +('1', '42', '3', '10144', '1628', '0'), +('1', '42', '5', '14569', '6171', '0'), +('1', '42', '5', '14703', '5500', '0'), +('1', '42', '5', '10055', '4010', '0'), +('1', '42', '5', '14700', '3906', '0'), +('1', '42', '8', '11621', '26579', '0'), +('1', '42', '8', '1546', '9983', '0'), +('1', '42', '8', '11551', '8753', '0'), +('1', '42', '8', '1409', '7747', '0'), +('1', '42', '6', '1557', '8270', '0'), +('1', '42', '6', '27701', '5710', '0'), +('1', '42', '6', '4302', '4695', '0'), +('1', '42', '6', '4175', '3775', '0'), +('1', '42', '17', '4912', '14774', '0'), +('1', '42', '17', '4832', '14774', '0'), +('1', '42', '17', '4174', '10289', '0'), +('1', '42', '17', '4309', '8225', '0'), +('1', '42', '7', '4913', '6478', '0'), +('1', '42', '7', '4833', '6478', '0'), +('1', '42', '7', '4343', '5949', '0'), +('1', '42', '7', '2986', '3926', '0'), +('1', '42', '9', '4914', '4408', '0'), +('1', '42', '9', '4834', '4408', '0'), +('1', '42', '9', '12189', '3471', '0'), +('1', '42', '9', '4311', '3294', '0'), +('1', '42', '15', '10366', '8054', '0'), +('1', '42', '15', '10151', '7200', '0'), +('1', '42', '15', '14679', '7010', '0'), +('1', '42', '15', '14678', '5708', '0'), +('1', '42', '20', '11673', '25523', '0'), +('1', '42', '20', '11601', '19813', '0'), +('1', '42', '20', '2921', '15041', '0'), +('1', '42', '20', '1365', '10500', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '42', '12', '4835', '11007', '0'), +('1', '42', '12', '4915', '11007', '0'), +('1', '42', '12', '20655', '7705', '0'), +('1', '42', '12', '11624', '5402', '0'), +('1', '42', '18', '4836', '7441', '0'), +('1', '42', '18', '4916', '7441', '0'), +('1', '42', '18', '4346', '4645', '0'), +('1', '42', '18', '4179', '4393', '0'), +('1', '42', '19', '4917', '6970', '0'), +('1', '42', '19', '4837', '6970', '0'), +('1', '42', '19', '68239', '4760', '0'), +('1', '42', '19', '4180', '3654', '0'), +('1', '42', '13', '11674', '32140', '0'), +('1', '42', '13', '3554', '23263', '0'), +('1', '42', '13', '11667', '20471', '0'), +('1', '42', '13', '11550', '19526', '0'), +('1', '42', '14', '11674', '32140', '0'), +('1', '42', '14', '11632', '31084', '0'), +('1', '42', '14', '11551', '23853', '0'), +('1', '42', '14', '3554', '23263', '0'), +('1', '42', '11', '45137', '15681', '0'), +('1', '42', '11', '8408', '8788', '0'), +('1', '42', '11', '8325', '8689', '0'), +('1', '42', '11', '8811', '6791', '0'), +('1', '43', '22', '8567', '0', '0'), +('1', '43', '22', '10323', '0', '0'), +('1', '43', '22', '66166', '0', '0'), +('1', '43', '22', '10664', '0', '0'), +('1', '43', '1', '14701', '4104', '0'), +('1', '43', '1', '14702', '2500', '0'), +('1', '43', '1', '10165', '1940', '0'), +('1', '43', '1', '14623', '1410', '0'), +('1', '43', '2', '4301', '7726', '0'), +('1', '43', '2', '4911', '6040', '0'), +('1', '43', '2', '4831', '6040', '0'), +('1', '43', '2', '4620', '5888', '0'), +('1', '43', '3', '71529', '4288', '0'), +('1', '43', '3', '21026', '2114', '0'), +('1', '43', '3', '21002', '2114', '0'), +('1', '43', '3', '10144', '1628', '0'), +('1', '43', '5', '14569', '6171', '0'), +('1', '43', '5', '14703', '5500', '0'), +('1', '43', '5', '10055', '4010', '0'), +('1', '43', '5', '14700', '3906', '0'), +('1', '43', '8', '11621', '26579', '0'), +('1', '43', '8', '1546', '9983', '0'), +('1', '43', '8', '11551', '8753', '0'), +('1', '43', '8', '1409', '7747', '0'), +('1', '43', '6', '1557', '8270', '0'), +('1', '43', '6', '27701', '5752', '0'), +('1', '43', '6', '4302', '4732', '0'), +('1', '43', '6', '4175', '3775', '0'), +('1', '43', '17', '4912', '14864', '0'), +('1', '43', '17', '4832', '14864', '0'), +('1', '43', '17', '4174', '10319', '0'), +('1', '43', '17', '4309', '8225', '0'), +('1', '43', '7', '4913', '6478', '0'), +('1', '43', '7', '4833', '6478', '0'), +('1', '43', '7', '4343', '6010', '0'), +('1', '43', '7', '2986', '3926', '0'), +('1', '43', '9', '4914', '4408', '0'), +('1', '43', '9', '4834', '4408', '0'), +('1', '43', '9', '12189', '3471', '0'), +('1', '43', '9', '4311', '3336', '0'), +('1', '43', '15', '10366', '8054', '0'), +('1', '43', '15', '10151', '7200', '0'), +('1', '43', '15', '14679', '7010', '0'), +('1', '43', '15', '14678', '5708', '0'), +('1', '43', '20', '11673', '25596', '0'), +('1', '43', '20', '11601', '19873', '0'), +('1', '43', '20', '2921', '15071', '0'), +('1', '43', '20', '1365', '10500', '0'), +('1', '43', '12', '4835', '11037', '0'), +('1', '43', '12', '4915', '11037', '0'), +('1', '43', '12', '20655', '7717', '0'), +('1', '43', '12', '11624', '5444', '0'), +('1', '43', '18', '4836', '7471', '0'), +('1', '43', '18', '4916', '7471', '0'), +('1', '43', '18', '4346', '4645', '0'), +('1', '43', '18', '4179', '4393', '0'), +('1', '43', '19', '4917', '6970', '0'), +('1', '43', '19', '4837', '6970', '0'), +('1', '43', '19', '68239', '4760', '0'), +('1', '43', '19', '4180', '3654', '0'), +('1', '43', '13', '11674', '32281', '0'), +('1', '43', '13', '3554', '23394', '0'), +('1', '43', '13', '11667', '20597', '0'), +('1', '43', '13', '11550', '19625', '0'), +('1', '43', '14', '11674', '32281', '0'), +('1', '43', '14', '11632', '31174', '0'), +('1', '43', '14', '11551', '23853', '0'), +('1', '43', '14', '3554', '23394', '0'), +('1', '43', '11', '45137', '16136', '0'), +('1', '43', '11', '8408', '8864', '0'), +('1', '43', '11', '8325', '8774', '0'), +('1', '43', '11', '8811', '6857', '0'), +('1', '44', '22', '8567', '0', '0'), +('1', '44', '22', '10323', '0', '0'), +('1', '44', '22', '66166', '0', '0'), +('1', '44', '22', '10664', '0', '0'), +('1', '44', '1', '14701', '4104', '0'), +('1', '44', '1', '14702', '2500', '0'), +('1', '44', '1', '10165', '1940', '0'), +('1', '44', '1', '14623', '1450', '0'), +('1', '44', '2', '4301', '7726', '0'), +('1', '44', '2', '4911', '6040', '0'), +('1', '44', '2', '4831', '6040', '0'), +('1', '44', '2', '4620', '5934', '0'), +('1', '44', '3', '71529', '4315', '0'), +('1', '44', '3', '21026', '2114', '0'), +('1', '44', '3', '21002', '2114', '0'), +('1', '44', '3', '10144', '1628', '0'), +('1', '44', '5', '14569', '6171', '0'), +('1', '44', '5', '14703', '5500', '0'), +('1', '44', '5', '10055', '4010', '0'), +('1', '44', '5', '14700', '3906', '0'), +('1', '44', '8', '11621', '26579', '0'), +('1', '44', '8', '1546', '9983', '0'), +('1', '44', '8', '11551', '8753', '0'), +('1', '44', '8', '1409', '7747', '0'), +('1', '44', '6', '1557', '8270', '0'), +('1', '44', '6', '27701', '5798', '0'), +('1', '44', '6', '4302', '4772', '0'), +('1', '44', '6', '4175', '3775', '0'), +('1', '44', '17', '4912', '14964', '0'), +('1', '44', '17', '4832', '14964', '0'), +('1', '44', '17', '4174', '10352', '0'), +('1', '44', '17', '4309', '8225', '0'), +('1', '44', '7', '4913', '6478', '0'), +('1', '44', '7', '4833', '6478', '0'), +('1', '44', '7', '4343', '6076', '0'), +('1', '44', '7', '2986', '3926', '0'), +('1', '44', '9', '4914', '4408', '0'), +('1', '44', '9', '4834', '4408', '0'), +('1', '44', '9', '12189', '3471', '0'), +('1', '44', '9', '4311', '3382', '0'), +('1', '44', '15', '10366', '8054', '0'), +('1', '44', '15', '10151', '7200', '0'), +('1', '44', '15', '14679', '7010', '0'), +('1', '44', '15', '14678', '5708', '0'), +('1', '44', '20', '11673', '25675', '0'), +('1', '44', '20', '11601', '19939', '0'), +('1', '44', '20', '2921', '15105', '0'), +('1', '44', '20', '1365', '10500', '0'), +('1', '44', '12', '4835', '11070', '0'), +('1', '44', '12', '4915', '11070', '0'), +('1', '44', '12', '20655', '7730', '0'), +('1', '44', '12', '11624', '5491', '0'), +('1', '44', '18', '4836', '7505', '0'), +('1', '44', '18', '4916', '7505', '0'), +('1', '44', '18', '4346', '4645', '0'), +('1', '44', '18', '4179', '4393', '0'), +('1', '44', '19', '4917', '6970', '0'), +('1', '44', '19', '4837', '6970', '0'), +('1', '44', '19', '68239', '4760', '0'), +('1', '44', '19', '4180', '3654', '0'), +('1', '44', '13', '11674', '32423', '0'), +('1', '44', '13', '3554', '23556', '0'), +('1', '44', '13', '11667', '20726', '0'), +('1', '44', '13', '11550', '19724', '0'), +('1', '44', '14', '11674', '32423', '0'), +('1', '44', '14', '11632', '31274', '0'), +('1', '44', '14', '11551', '23853', '0'), +('1', '44', '14', '3554', '23556', '0'), +('1', '44', '11', '45137', '16739', '0'), +('1', '44', '11', '8408', '8939', '0'), +('1', '44', '11', '8325', '8849', '0'), +('1', '44', '11', '8811', '6923', '0'), +('1', '45', '22', '8567', '0', '0'), +('1', '45', '22', '10323', '0', '0'), +('1', '45', '22', '66166', '0', '0'), +('1', '45', '22', '10664', '0', '0'), +('1', '45', '1', '14701', '4104', '0'), +('1', '45', '1', '14702', '2500', '0'), +('1', '45', '1', '10165', '1940', '0'), +('1', '45', '1', '14623', '1489', '0'), +('1', '45', '2', '4301', '7726', '0'), +('1', '45', '2', '4911', '6040', '0'), +('1', '45', '2', '4831', '6040', '0'), +('1', '45', '2', '4620', '5981', '0'), +('1', '45', '3', '71529', '4341', '0'), +('1', '45', '3', '21026', '2114', '0'), +('1', '45', '3', '21002', '2114', '0'), +('1', '45', '3', '10144', '1628', '0'), +('1', '45', '5', '14569', '6171', '0'), +('1', '45', '5', '14703', '5500', '0'), +('1', '45', '5', '10055', '4010', '0'), +('1', '45', '5', '14700', '3906', '0'), +('1', '45', '8', '11621', '26579', '0'), +('1', '45', '8', '1546', '9983', '0'), +('1', '45', '8', '11551', '8753', '0'), +('1', '45', '8', '1409', '7747', '0'), +('1', '45', '6', '1557', '8270', '0'), +('1', '45', '6', '27701', '5845', '0'), +('1', '45', '6', '4302', '4811', '0'), +('1', '45', '6', '4175', '3775', '0'), +('1', '45', '17', '4912', '15064', '0'), +('1', '45', '17', '4832', '15064', '0'), +('1', '45', '17', '4174', '10385', '0'), +('1', '45', '17', '4309', '8225', '0'), +('1', '45', '7', '4913', '6478', '0'), +('1', '45', '7', '4833', '6478', '0'), +('1', '45', '7', '4343', '6143', '0'), +('1', '45', '7', '2986', '3926', '0'), +('1', '45', '9', '4914', '4408', '0'), +('1', '45', '9', '4834', '4408', '0'), +('1', '45', '9', '12189', '3471', '0'), +('1', '45', '9', '4311', '3429', '0'), +('1', '45', '15', '10366', '8054', '0'), +('1', '45', '15', '10151', '7200', '0'), +('1', '45', '15', '14679', '7010', '0'), +('1', '45', '15', '14678', '5708', '0'), +('1', '45', '20', '11673', '25755', '0'), +('1', '45', '20', '11601', '20006', '0'), +('1', '45', '20', '2921', '15138', '0'), +('1', '45', '20', '1365', '10500', '0'), +('1', '45', '12', '4835', '11103', '0'), +('1', '45', '12', '4915', '11103', '0'), +('1', '45', '12', '20655', '7743', '0'), +('1', '45', '12', '11624', '5537', '0'), +('1', '45', '18', '4836', '7538', '0'), +('1', '45', '18', '4916', '7538', '0'), +('1', '45', '18', '4346', '4645', '0'), +('1', '45', '18', '4179', '4393', '0'), +('1', '45', '19', '4917', '6970', '0'), +('1', '45', '19', '4837', '6970', '0'), +('1', '45', '19', '68239', '4760', '0'), +('1', '45', '19', '4180', '3654', '0'), +('1', '45', '13', '11674', '32565', '0'), +('1', '45', '13', '3554', '23689', '0'), +('1', '45', '13', '11667', '20841', '0'), +('1', '45', '13', '11550', '19823', '0'), +('1', '45', '14', '11674', '32565', '0'), +('1', '45', '14', '11632', '31374', '0'), +('1', '45', '14', '11551', '23853', '0'), +('1', '45', '14', '3554', '23689', '0'), +('1', '45', '11', '45137', '17211', '0'), +('1', '45', '11', '8408', '9015', '0'), +('1', '45', '11', '8325', '8934', '0'), +('1', '45', '11', '8811', '6979', '0'), +('1', '46', '22', '8567', '0', '0'), +('1', '46', '22', '10323', '0', '0'), +('1', '46', '22', '66166', '0', '0'), +('1', '46', '22', '10664', '0', '0'), +('1', '46', '1', '14701', '4104', '0'), +('1', '46', '1', '14702', '2500', '0'), +('1', '46', '1', '10165', '1940', '0'), +('1', '46', '1', '14623', '1529', '0'), +('1', '46', '2', '4301', '7726', '0'), +('1', '46', '2', '4911', '6040', '0'), +('1', '46', '2', '4831', '6040', '0'), +('1', '46', '2', '4620', '6027', '0'), +('1', '46', '3', '71529', '4368', '0'), +('1', '46', '3', '21026', '2114', '0'), +('1', '46', '3', '21002', '2114', '0'), +('1', '46', '3', '10144', '1628', '0'), +('1', '46', '5', '14569', '6171', '0'), +('1', '46', '5', '14703', '5500', '0'), +('1', '46', '5', '10055', '4010', '0'), +('1', '46', '5', '14700', '3906', '0'), +('1', '46', '8', '11621', '26579', '0'), +('1', '46', '8', '1546', '9983', '0'), +('1', '46', '8', '11551', '8753', '0'), +('1', '46', '8', '1409', '7747', '0'), +('1', '46', '6', '1557', '8270', '0'), +('1', '46', '6', '27701', '5891', '0'), +('1', '46', '6', '4302', '4851', '0'), +('1', '46', '6', '4175', '3775', '0'), +('1', '46', '17', '4912', '15163', '0'), +('1', '46', '17', '4832', '15163', '0'), +('1', '46', '17', '4174', '10418', '0'), +('1', '46', '17', '4309', '8225', '0'), +('1', '46', '7', '4913', '6478', '0'), +('1', '46', '7', '4833', '6478', '0'), +('1', '46', '7', '4343', '6209', '0'), +('1', '46', '7', '2986', '3926', '0'), +('1', '46', '9', '4834', '4408', '0'), +('1', '46', '9', '4914', '4408', '0'), +('1', '46', '9', '4311', '3475', '0'), +('1', '46', '9', '12189', '3471', '0'), +('1', '46', '15', '10366', '8054', '0'), +('1', '46', '15', '10151', '7200', '0'), +('1', '46', '15', '14679', '7010', '0'), +('1', '46', '15', '14678', '5708', '0'), +('1', '46', '20', '11673', '25835', '0'), +('1', '46', '20', '11601', '20072', '0'), +('1', '46', '20', '2921', '15171', '0'), +('1', '46', '20', '1365', '10500', '0'), +('1', '46', '12', '4835', '11137', '0'), +('1', '46', '12', '4915', '11137', '0'), +('1', '46', '12', '20655', '7757', '0'), +('1', '46', '12', '11624', '5584', '0'), +('1', '46', '18', '4836', '7571', '0'), +('1', '46', '18', '4916', '7571', '0'), +('1', '46', '18', '4346', '4645', '0'), +('1', '46', '18', '4179', '4393', '0'), +('1', '46', '19', '4917', '6970', '0'), +('1', '46', '19', '4837', '6970', '0'), +('1', '46', '19', '68239', '4760', '0'), +('1', '46', '19', '4180', '3654', '0'), +('1', '46', '13', '11674', '33840', '0'), +('1', '46', '13', '3554', '24814', '0'), +('1', '46', '13', '11667', '21693', '0'), +('1', '46', '13', '11550', '20659', '0'), +('1', '46', '14', '11674', '33840', '0'), +('1', '46', '14', '11632', '31473', '0'), +('1', '46', '14', '3554', '24814', '0'), +('1', '46', '14', '11551', '23853', '0'), +('1', '46', '11', '45137', '18451', '0'), +('1', '46', '11', '8408', '9676', '0'), +('1', '46', '11', '8325', '9624', '0'), +('1', '46', '11', '8811', '7527', '0'), +('1', '47', '22', '8567', '0', '0'), +('1', '47', '22', '10323', '0', '0'), +('1', '47', '22', '66166', '0', '0'), +('1', '47', '22', '10664', '0', '0'), +('1', '47', '1', '14701', '4104', '0'), +('1', '47', '1', '14702', '2500', '0'), +('1', '47', '1', '10165', '1940', '0'), +('1', '47', '1', '14623', '1569', '0'), +('1', '47', '2', '4301', '7726', '0'), +('1', '47', '2', '4620', '6074', '0'), +('1', '47', '2', '4911', '6040', '0'), +('1', '47', '2', '4831', '6040', '0'), +('1', '47', '3', '71529', '4394', '0'), +('1', '47', '3', '21026', '2114', '0'), +('1', '47', '3', '21002', '2114', '0'), +('1', '47', '3', '10144', '1628', '0'), +('1', '47', '5', '14569', '6171', '0'), +('1', '47', '5', '14703', '5500', '0'), +('1', '47', '5', '10055', '4010', '0'), +('1', '47', '5', '14700', '3906', '0'), +('1', '47', '8', '11621', '26579', '0'), +('1', '47', '8', '1546', '9983', '0'), +('1', '47', '8', '11551', '8753', '0'), +('1', '47', '8', '1409', '7747', '0'), +('1', '47', '6', '1557', '8270', '0'), +('1', '47', '6', '27701', '5938', '0'), +('1', '47', '6', '4302', '4891', '0'), +('1', '47', '6', '4175', '3775', '0'), +('1', '47', '17', '4912', '15263', '0'), +('1', '47', '17', '4832', '15263', '0'), +('1', '47', '17', '4174', '10452', '0'), +('1', '47', '17', '4309', '8225', '0'), +('1', '47', '7', '4913', '6478', '0'), +('1', '47', '7', '4833', '6478', '0'), +('1', '47', '7', '4343', '6276', '0'), +('1', '47', '7', '2986', '3926', '0'), +('1', '47', '9', '4834', '4408', '0'), +('1', '47', '9', '4914', '4408', '0'), +('1', '47', '9', '4311', '3522', '0'), +('1', '47', '9', '12189', '3471', '0'), +('1', '47', '15', '10366', '8054', '0'), +('1', '47', '15', '10151', '7200', '0'), +('1', '47', '15', '14679', '7010', '0'), +('1', '47', '15', '14678', '5708', '0'), +('1', '47', '20', '11673', '25914', '0'), +('1', '47', '20', '11601', '20139', '0'), +('1', '47', '20', '2921', '15204', '0'), +('1', '47', '20', '1365', '10500', '0'), +('1', '47', '12', '4835', '11170', '0'), +('1', '47', '12', '4915', '11170', '0'), +('1', '47', '12', '20655', '7770', '0'), +('1', '47', '12', '11624', '5630', '0'), +('1', '47', '18', '4836', '7604', '0'), +('1', '47', '18', '4916', '7604', '0'), +('1', '47', '18', '4346', '4645', '0'), +('1', '47', '18', '4179', '4393', '0'), +('1', '47', '19', '4917', '6970', '0'), +('1', '47', '19', '4837', '6970', '0'), +('1', '47', '19', '68239', '4760', '0'), +('1', '47', '19', '4180', '3654', '0'), +('1', '47', '13', '11674', '34378', '0'), +('1', '47', '13', '3554', '25287', '0'), +('1', '47', '13', '11667', '22048', '0'), +('1', '47', '13', '11550', '21013', '0'), +('1', '47', '14', '11674', '34378', '0'), +('1', '47', '14', '11632', '31573', '0'), +('1', '47', '14', '3554', '25287', '0'), +('1', '47', '14', '11551', '23853', '0'), +('1', '47', '11', '45137', '19192', '0'), +('1', '47', '11', '8408', '9950', '0'), +('1', '47', '11', '8325', '9907', '0'), +('1', '47', '11', '8811', '7744', '0'), +('1', '48', '22', '8567', '0', '0'), +('1', '48', '22', '10323', '0', '0'), +('1', '48', '22', '66166', '0', '0'), +('1', '48', '22', '10664', '0', '0'), +('1', '48', '1', '14701', '4104', '0'), +('1', '48', '1', '14702', '2500', '0'), +('1', '48', '1', '10165', '1940', '0'), +('1', '48', '1', '14623', '1609', '0'), +('1', '48', '2', '4301', '7726', '0'), +('1', '48', '2', '4620', '6120', '0'), +('1', '48', '2', '4911', '6040', '0'), +('1', '48', '2', '4831', '6040', '0'), +('1', '48', '3', '71529', '4421', '0'), +('1', '48', '3', '21026', '2114', '0'), +('1', '48', '3', '21002', '2114', '0'), +('1', '48', '3', '10144', '1628', '0'), +('1', '48', '5', '14569', '6171', '0'), +('1', '48', '5', '14703', '5500', '0'), +('1', '48', '5', '10055', '4010', '0'), +('1', '48', '5', '14700', '3906', '0'), +('1', '48', '8', '11621', '26579', '0'), +('1', '48', '8', '1546', '9983', '0'), +('1', '48', '8', '11551', '8753', '0'), +('1', '48', '8', '1409', '7747', '0'), +('1', '48', '6', '1557', '8270', '0'), +('1', '48', '6', '27701', '5984', '0'), +('1', '48', '6', '4302', '4931', '0'), +('1', '48', '6', '4175', '3775', '0'), +('1', '48', '17', '4912', '15363', '0'), +('1', '48', '17', '4832', '15363', '0'), +('1', '48', '17', '4174', '10485', '0'), +('1', '48', '17', '4309', '8225', '0'), +('1', '48', '7', '4913', '6478', '0'), +('1', '48', '7', '4833', '6478', '0'), +('1', '48', '7', '4343', '6342', '0'), +('1', '48', '7', '2986', '3926', '0'), +('1', '48', '9', '4834', '4408', '0'), +('1', '48', '9', '4914', '4408', '0'), +('1', '48', '9', '4311', '3568', '0'), +('1', '48', '9', '12189', '3471', '0'), +('1', '48', '15', '10366', '8054', '0'), +('1', '48', '15', '10151', '7200', '0'), +('1', '48', '15', '14679', '7010', '0'), +('1', '48', '15', '14678', '5708', '0'), +('1', '48', '20', '11673', '25994', '0'), +('1', '48', '20', '11601', '20205', '0'), +('1', '48', '20', '2921', '15237', '0'), +('1', '48', '20', '1365', '10500', '0'), +('1', '48', '12', '4835', '11203', '0'), +('1', '48', '12', '4915', '11203', '0'), +('1', '48', '12', '20655', '7783', '0'), +('1', '48', '12', '11624', '5677', '0'), +('1', '48', '18', '4836', '7638', '0'), +('1', '48', '18', '4916', '7638', '0'), +('1', '48', '18', '4346', '4645', '0'), +('1', '48', '18', '4179', '4393', '0'), +('1', '48', '19', '4917', '6970', '0'), +('1', '48', '19', '4837', '6970', '0'), +('1', '48', '19', '68239', '4760', '0'), +('1', '48', '19', '4180', '3654', '0'), +('1', '48', '13', '11674', '34888', '0'), +('1', '48', '13', '3554', '25732', '0'), +('1', '48', '13', '11667', '22418', '0'), +('1', '48', '13', '11550', '21353', '0'), +('1', '48', '14', '11674', '34888', '0'), +('1', '48', '14', '11632', '31673', '0'), +('1', '48', '14', '3554', '25732', '0'), +('1', '48', '14', '11551', '23853', '0'), +('1', '48', '11', '45137', '20105', '0'), +('1', '48', '11', '8408', '10224', '0'), +('1', '48', '11', '8325', '10191', '0'), +('1', '48', '11', '8811', '7971', '0'), +('1', '49', '22', '8567', '0', '0'), +('1', '49', '22', '10323', '0', '0'), +('1', '49', '22', '66166', '0', '0'), +('1', '49', '22', '10664', '0', '0'), +('1', '49', '1', '14701', '4104', '0'), +('1', '49', '1', '14702', '2500', '0'), +('1', '49', '1', '10165', '1940', '0'), +('1', '49', '1', '14623', '1649', '0'), +('1', '49', '2', '4301', '7726', '0'), +('1', '49', '2', '4620', '6167', '0'), +('1', '49', '2', '4911', '6040', '0'), +('1', '49', '2', '4831', '6040', '0'), +('1', '49', '3', '71529', '4447', '0'), +('1', '49', '3', '21026', '2114', '0'), +('1', '49', '3', '21002', '2114', '0'), +('1', '49', '3', '10144', '1628', '0'), +('1', '49', '5', '14569', '6171', '0'), +('1', '49', '5', '14703', '5500', '0'), +('1', '49', '5', '10055', '4010', '0'), +('1', '49', '5', '14700', '3906', '0'), +('1', '49', '8', '11621', '26579', '0'), +('1', '49', '8', '1546', '9983', '0'), +('1', '49', '8', '11551', '8753', '0'), +('1', '49', '8', '1409', '7747', '0'), +('1', '49', '6', '1557', '8270', '0'), +('1', '49', '6', '27701', '6031', '0'), +('1', '49', '6', '4302', '4971', '0'), +('1', '49', '6', '4175', '3775', '0'), +('1', '49', '17', '4912', '15462', '0'), +('1', '49', '17', '4832', '15462', '0'), +('1', '49', '17', '4174', '10518', '0'), +('1', '49', '17', '4309', '8225', '0'), +('1', '49', '7', '4913', '6478', '0'), +('1', '49', '7', '4833', '6478', '0'), +('1', '49', '7', '4343', '6408', '0'), +('1', '49', '7', '2986', '3926', '0'), +('1', '49', '9', '4834', '4408', '0'), +('1', '49', '9', '4914', '4408', '0'), +('1', '49', '9', '4311', '3615', '0'), +('1', '49', '9', '12189', '3471', '0'), +('1', '49', '15', '10366', '8054', '0'), +('1', '49', '15', '10151', '7200', '0'), +('1', '49', '15', '14679', '7010', '0'), +('1', '49', '15', '14678', '5708', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '49', '20', '11673', '26074', '0'), +('1', '49', '20', '11601', '20272', '0'), +('1', '49', '20', '2921', '15271', '0'), +('1', '49', '20', '1365', '10500', '0'), +('1', '49', '12', '4835', '11236', '0'), +('1', '49', '12', '4915', '11236', '0'), +('1', '49', '12', '20655', '7796', '0'), +('1', '49', '12', '11624', '5723', '0'), +('1', '49', '18', '4836', '7671', '0'), +('1', '49', '18', '4916', '7671', '0'), +('1', '49', '18', '4346', '4645', '0'), +('1', '49', '18', '4179', '4393', '0'), +('1', '49', '19', '4917', '6970', '0'), +('1', '49', '19', '4837', '6970', '0'), +('1', '49', '19', '68239', '4760', '0'), +('1', '49', '19', '4180', '3654', '0'), +('1', '49', '13', '11674', '35398', '0'), +('1', '49', '13', '3554', '26205', '0'), +('1', '49', '13', '11667', '22774', '0'), +('1', '49', '13', '11550', '21693', '0'), +('1', '49', '14', '11674', '35398', '0'), +('1', '49', '14', '11632', '31772', '0'), +('1', '49', '14', '3554', '26205', '0'), +('1', '49', '14', '11551', '23853', '0'), +('1', '49', '11', '45137', '20869', '0'), +('1', '49', '11', '8408', '10488', '0'), +('1', '49', '11', '8325', '10474', '0'), +('1', '49', '11', '8811', '8188', '0'), +('1', '50', '22', '8567', '0', '0'), +('1', '50', '22', '10323', '0', '0'), +('1', '50', '22', '66166', '0', '0'), +('1', '50', '22', '10664', '0', '0'), +('1', '50', '1', '14701', '4104', '0'), +('1', '50', '1', '14702', '2500', '0'), +('1', '50', '1', '10165', '1940', '0'), +('1', '50', '1', '14623', '1692', '0'), +('1', '50', '2', '4301', '7726', '0'), +('1', '50', '2', '4620', '6218', '0'), +('1', '50', '2', '4911', '6040', '0'), +('1', '50', '2', '4831', '6040', '0'), +('1', '50', '3', '71529', '4476', '0'), +('1', '50', '3', '21026', '2114', '0'), +('1', '50', '3', '21002', '2114', '0'), +('1', '50', '3', '10144', '1628', '0'), +('1', '50', '5', '14569', '6171', '0'), +('1', '50', '5', '14703', '5500', '0'), +('1', '50', '5', '10055', '4010', '0'), +('1', '50', '5', '14700', '3906', '0'), +('1', '50', '8', '11621', '26579', '0'), +('1', '50', '8', '1546', '9983', '0'), +('1', '50', '8', '11551', '8753', '0'), +('1', '50', '8', '1409', '7747', '0'), +('1', '50', '6', '1557', '8270', '0'), +('1', '50', '6', '27701', '6082', '0'), +('1', '50', '6', '4302', '5014', '0'), +('1', '50', '6', '4175', '3775', '0'), +('1', '50', '17', '4912', '15571', '0'), +('1', '50', '17', '4832', '15571', '0'), +('1', '50', '17', '4174', '10554', '0'), +('1', '50', '17', '4309', '8225', '0'), +('1', '50', '7', '4343', '6481', '0'), +('1', '50', '7', '4913', '6478', '0'), +('1', '50', '7', '4833', '6478', '0'), +('1', '50', '7', '2986', '3926', '0'), +('1', '50', '9', '4834', '4408', '0'), +('1', '50', '9', '4914', '4408', '0'), +('1', '50', '9', '4311', '3666', '0'), +('1', '50', '9', '12189', '3471', '0'), +('1', '50', '15', '10366', '8054', '0'), +('1', '50', '15', '10151', '7200', '0'), +('1', '50', '15', '14679', '7010', '0'), +('1', '50', '15', '14678', '5708', '0'), +('1', '50', '20', '11673', '26161', '0'), +('1', '50', '20', '11601', '20344', '0'), +('1', '50', '20', '2921', '15307', '0'), +('1', '50', '20', '1365', '10500', '0'), +('1', '50', '12', '4835', '11273', '0'), +('1', '50', '12', '4915', '11273', '0'), +('1', '50', '12', '20655', '7811', '0'), +('1', '50', '12', '11624', '5774', '0'), +('1', '50', '18', '4836', '7707', '0'), +('1', '50', '18', '4916', '7707', '0'), +('1', '50', '18', '4346', '4645', '0'), +('1', '50', '18', '4179', '4393', '0'), +('1', '50', '19', '4917', '6970', '0'), +('1', '50', '19', '4837', '6970', '0'), +('1', '50', '19', '68239', '4760', '0'), +('1', '50', '19', '4180', '3654', '0'), +('1', '50', '13', '11674', '35936', '0'), +('1', '50', '13', '3554', '26680', '0'), +('1', '50', '13', '11667', '23147', '0'), +('1', '50', '13', '11550', '22033', '0'), +('1', '50', '14', '11674', '35936', '0'), +('1', '50', '14', '11632', '31881', '0'), +('1', '50', '14', '3554', '26680', '0'), +('1', '50', '14', '11551', '23853', '0'), +('1', '50', '11', '45137', '21715', '0'), +('1', '50', '11', '8408', '10762', '0'), +('1', '50', '11', '8325', '10757', '0'), +('1', '50', '11', '8811', '8415', '0'), +('1', '51', '22', '8567', '0', '0'), +('1', '51', '22', '10323', '0', '0'), +('1', '51', '22', '66166', '0', '0'), +('1', '51', '22', '10664', '0', '0'), +('1', '51', '1', '27822', '5699', '0'), +('1', '51', '1', '14701', '4104', '0'), +('1', '51', '1', '14702', '2500', '0'), +('1', '51', '1', '10165', '1940', '0'), +('1', '51', '2', '4301', '7726', '0'), +('1', '51', '2', '4620', '6264', '0'), +('1', '51', '2', '4911', '6040', '0'), +('1', '51', '2', '4831', '6040', '0'), +('1', '51', '3', '71529', '4503', '0'), +('1', '51', '3', '21026', '2114', '0'), +('1', '51', '3', '21002', '2114', '0'), +('1', '51', '3', '10144', '1628', '0'), +('1', '51', '5', '14569', '6171', '0'), +('1', '51', '5', '14703', '5500', '0'), +('1', '51', '5', '10055', '4010', '0'), +('1', '51', '5', '14700', '3906', '0'), +('1', '51', '8', '11621', '26579', '0'), +('1', '51', '8', '1546', '9983', '0'), +('1', '51', '8', '11551', '8753', '0'), +('1', '51', '8', '1409', '7747', '0'), +('1', '51', '6', '1557', '8270', '0'), +('1', '51', '6', '27701', '6128', '0'), +('1', '51', '6', '4302', '5054', '0'), +('1', '51', '6', '4175', '3775', '0'), +('1', '51', '17', '4912', '15671', '0'), +('1', '51', '17', '4832', '15671', '0'), +('1', '51', '17', '4174', '10588', '0'), +('1', '51', '17', '4309', '8225', '0'), +('1', '51', '7', '4343', '6547', '0'), +('1', '51', '7', '4913', '6478', '0'), +('1', '51', '7', '4833', '6478', '0'), +('1', '51', '7', '2986', '3926', '0'), +('1', '51', '9', '4834', '4408', '0'), +('1', '51', '9', '4914', '4408', '0'), +('1', '51', '9', '4311', '3712', '0'), +('1', '51', '9', '12189', '3471', '0'), +('1', '51', '15', '10366', '8054', '0'), +('1', '51', '15', '10151', '7200', '0'), +('1', '51', '15', '14679', '7010', '0'), +('1', '51', '15', '14678', '5708', '0'), +('1', '51', '20', '11673', '26241', '0'), +('1', '51', '20', '11601', '20411', '0'), +('1', '51', '20', '2921', '15340', '0'), +('1', '51', '20', '1365', '10500', '0'), +('1', '51', '12', '4835', '11306', '0'), +('1', '51', '12', '4915', '11306', '0'), +('1', '51', '12', '20655', '7824', '0'), +('1', '51', '12', '11624', '5820', '0'), +('1', '51', '18', '4836', '7740', '0'), +('1', '51', '18', '4916', '7740', '0'), +('1', '51', '18', '4346', '4645', '0'), +('1', '51', '18', '4179', '4393', '0'), +('1', '51', '19', '4917', '6970', '0'), +('1', '51', '19', '4837', '6970', '0'), +('1', '51', '19', '68239', '4760', '0'), +('1', '51', '19', '4180', '3654', '0'), +('1', '51', '13', '11674', '36446', '0'), +('1', '51', '13', '3554', '27154', '0'), +('1', '51', '13', '27961', '24500', '0'), +('1', '51', '13', '11667', '23517', '0'), +('1', '51', '14', '11674', '36446', '0'), +('1', '51', '14', '11632', '31981', '0'), +('1', '51', '14', '3554', '27154', '0'), +('1', '51', '14', '11551', '23853', '0'), +('1', '51', '11', '45137', '22512', '0'), +('1', '51', '11', '8325', '11041', '0'), +('1', '51', '11', '8408', '11036', '0'), +('1', '51', '11', '8811', '8632', '0'), +('1', '52', '22', '8567', '0', '0'), +('1', '52', '22', '10323', '0', '0'), +('1', '52', '22', '66166', '0', '0'), +('1', '52', '22', '10664', '0', '0'), +('1', '52', '1', '27822', '5699', '0'), +('1', '52', '1', '14701', '4104', '0'), +('1', '52', '1', '14702', '2500', '0'), +('1', '52', '1', '10165', '1940', '0'), +('1', '52', '2', '4301', '7726', '0'), +('1', '52', '2', '4620', '6311', '0'), +('1', '52', '2', '4911', '6040', '0'), +('1', '52', '2', '4831', '6040', '0'), +('1', '52', '3', '71529', '4530', '0'), +('1', '52', '3', '21026', '2114', '0'), +('1', '52', '3', '21002', '2114', '0'), +('1', '52', '3', '10144', '1628', '0'), +('1', '52', '5', '14569', '6171', '0'), +('1', '52', '5', '14703', '5500', '0'), +('1', '52', '5', '10055', '4010', '0'), +('1', '52', '5', '14700', '3906', '0'), +('1', '52', '8', '11621', '26579', '0'), +('1', '52', '8', '1546', '9983', '0'), +('1', '52', '8', '11551', '8753', '0'), +('1', '52', '8', '1409', '7747', '0'), +('1', '52', '6', '1557', '8270', '0'), +('1', '52', '6', '27701', '6175', '0'), +('1', '52', '6', '4302', '5094', '0'), +('1', '52', '6', '4175', '3775', '0'), +('1', '52', '17', '4912', '15770', '0'), +('1', '52', '17', '4832', '15770', '0'), +('1', '52', '17', '4174', '10621', '0'), +('1', '52', '17', '4309', '8225', '0'), +('1', '52', '7', '4343', '6614', '0'), +('1', '52', '7', '4913', '6478', '0'), +('1', '52', '7', '4833', '6478', '0'), +('1', '52', '7', '2986', '3926', '0'), +('1', '52', '9', '4834', '4408', '0'), +('1', '52', '9', '4914', '4408', '0'), +('1', '52', '9', '4311', '3759', '0'), +('1', '52', '9', '12189', '3471', '0'), +('1', '52', '15', '10366', '8054', '0'), +('1', '52', '15', '10151', '7200', '0'), +('1', '52', '15', '14679', '7010', '0'), +('1', '52', '15', '14678', '5708', '0'), +('1', '52', '20', '11673', '26320', '0'), +('1', '52', '20', '11601', '20477', '0'), +('1', '52', '20', '2921', '15373', '0'), +('1', '52', '20', '1365', '10500', '0'), +('1', '52', '12', '4835', '11339', '0'), +('1', '52', '12', '4915', '11339', '0'), +('1', '52', '12', '20655', '7837', '0'), +('1', '52', '12', '11624', '5867', '0'), +('1', '52', '18', '4836', '7773', '0'), +('1', '52', '18', '4916', '7773', '0'), +('1', '52', '18', '4346', '4645', '0'), +('1', '52', '18', '4179', '4393', '0'), +('1', '52', '19', '4917', '6970', '0'), +('1', '52', '19', '4837', '6970', '0'), +('1', '52', '19', '68239', '4760', '0'), +('1', '52', '19', '4180', '3654', '0'), +('1', '52', '13', '11674', '36985', '0'), +('1', '52', '13', '3554', '27627', '0'), +('1', '52', '13', '27961', '25100', '0'), +('1', '52', '13', '11667', '23872', '0'), +('1', '52', '14', '11674', '36985', '0'), +('1', '52', '14', '11632', '32080', '0'), +('1', '52', '14', '3554', '27627', '0'), +('1', '52', '14', '11551', '23853', '0'), +('1', '52', '11', '45137', '23500', '0'), +('1', '52', '11', '8325', '11324', '0'), +('1', '52', '11', '8408', '11300', '0'), +('1', '52', '11', '8811', '8859', '0'), +('1', '53', '22', '8567', '0', '0'), +('1', '53', '22', '10323', '0', '0'), +('1', '53', '22', '66166', '0', '0'), +('1', '53', '22', '10664', '0', '0'), +('1', '53', '1', '27822', '5699', '0'), +('1', '53', '1', '14701', '4104', '0'), +('1', '53', '1', '14702', '2500', '0'), +('1', '53', '1', '10165', '1940', '0'), +('1', '53', '2', '4301', '7726', '0'), +('1', '53', '2', '4620', '6361', '0'), +('1', '53', '2', '4911', '6040', '0'), +('1', '53', '2', '4831', '6040', '0'), +('1', '53', '3', '71529', '4559', '0'), +('1', '53', '3', '21026', '2114', '0'), +('1', '53', '3', '21002', '2114', '0'), +('1', '53', '3', '10144', '1628', '0'), +('1', '53', '5', '14569', '6171', '0'), +('1', '53', '5', '14703', '5500', '0'), +('1', '53', '5', '10055', '4010', '0'), +('1', '53', '5', '14700', '3906', '0'), +('1', '53', '8', '11621', '26579', '0'), +('1', '53', '8', '1546', '9983', '0'), +('1', '53', '8', '11551', '8753', '0'), +('1', '53', '8', '1409', '7747', '0'), +('1', '53', '6', '1557', '8270', '0'), +('1', '53', '6', '27701', '6225', '0'), +('1', '53', '6', '4302', '5138', '0'), +('1', '53', '6', '4175', '3775', '0'), +('1', '53', '17', '4832', '15879', '0'), +('1', '53', '17', '4912', '15879', '0'), +('1', '53', '17', '4174', '10657', '0'), +('1', '53', '17', '4309', '8225', '0'), +('1', '53', '7', '4343', '6686', '0'), +('1', '53', '7', '4913', '6478', '0'), +('1', '53', '7', '4833', '6478', '0'), +('1', '53', '7', '2986', '3926', '0'), +('1', '53', '9', '4834', '4408', '0'), +('1', '53', '9', '4914', '4408', '0'), +('1', '53', '9', '4311', '3809', '0'), +('1', '53', '9', '12189', '3471', '0'), +('1', '53', '15', '10366', '8054', '0'), +('1', '53', '15', '10151', '7200', '0'), +('1', '53', '15', '14679', '7010', '0'), +('1', '53', '15', '14678', '5708', '0'), +('1', '53', '20', '11673', '26407', '0'), +('1', '53', '20', '11601', '20549', '0'), +('1', '53', '20', '2921', '15410', '0'), +('1', '53', '20', '1365', '10500', '0'), +('1', '53', '12', '4835', '11375', '0'), +('1', '53', '12', '4915', '11375', '0'), +('1', '53', '12', '20655', '7852', '0'), +('1', '53', '12', '11624', '5918', '0'), +('1', '53', '18', '4836', '7810', '0'), +('1', '53', '18', '4916', '7810', '0'), +('1', '53', '18', '4346', '4645', '0'), +('1', '53', '18', '4179', '4393', '0'), +('1', '53', '19', '4917', '6970', '0'), +('1', '53', '19', '4837', '6970', '0'), +('1', '53', '19', '68239', '4760', '0'), +('1', '53', '19', '4180', '3654', '0'), +('1', '53', '13', '11674', '37495', '0'), +('1', '53', '13', '3554', '28074', '0'), +('1', '53', '13', '27961', '25703', '0'), +('1', '53', '13', '11667', '24245', '0'), +('1', '53', '14', '11674', '37495', '0'), +('1', '53', '14', '11632', '32189', '0'), +('1', '53', '14', '3554', '28074', '0'), +('1', '53', '14', '11551', '23853', '0'), +('1', '53', '11', '45137', '24343', '0'), +('1', '53', '11', '8325', '11607', '0'), +('1', '53', '11', '8408', '11574', '0'), +('1', '53', '11', '8811', '9076', '0'), +('1', '54', '22', '8567', '0', '0'), +('1', '54', '22', '10323', '0', '0'), +('1', '54', '22', '66166', '0', '0'), +('1', '54', '22', '10664', '0', '0'), +('1', '54', '1', '27822', '5699', '0'), +('1', '54', '1', '14701', '4104', '0'), +('1', '54', '1', '14702', '2500', '0'), +('1', '54', '1', '10165', '1940', '0'), +('1', '54', '2', '4301', '7726', '0'), +('1', '54', '2', '4620', '6412', '0'), +('1', '54', '2', '4911', '6040', '0'), +('1', '54', '2', '4831', '6040', '0'), +('1', '54', '3', '71529', '4588', '0'), +('1', '54', '3', '21026', '2114', '0'), +('1', '54', '3', '21002', '2114', '0'), +('1', '54', '3', '10144', '1628', '0'), +('1', '54', '5', '14569', '6171', '0'), +('1', '54', '5', '14703', '5500', '0'), +('1', '54', '5', '10055', '4010', '0'), +('1', '54', '5', '14700', '3906', '0'), +('1', '54', '8', '11621', '26579', '0'), +('1', '54', '8', '1546', '9983', '0'), +('1', '54', '8', '11551', '8753', '0'), +('1', '54', '8', '1409', '7747', '0'), +('1', '54', '6', '1557', '8270', '0'), +('1', '54', '6', '27701', '6276', '0'), +('1', '54', '6', '4302', '5181', '0'), +('1', '54', '6', '4175', '3775', '0'), +('1', '54', '17', '4832', '15988', '0'), +('1', '54', '17', '4912', '15988', '0'), +('1', '54', '17', '4174', '10693', '0'), +('1', '54', '17', '4309', '8225', '0'), +('1', '54', '7', '4343', '6759', '0'), +('1', '54', '7', '4913', '6478', '0'), +('1', '54', '7', '4833', '6478', '0'), +('1', '54', '7', '2986', '3926', '0'), +('1', '54', '9', '4834', '4408', '0'), +('1', '54', '9', '4914', '4408', '0'), +('1', '54', '9', '4311', '3860', '0'), +('1', '54', '9', '12189', '3471', '0'), +('1', '54', '15', '10366', '8054', '0'), +('1', '54', '15', '10151', '7200', '0'), +('1', '54', '15', '14679', '7010', '0'), +('1', '54', '15', '14678', '5708', '0'), +('1', '54', '20', '11673', '26494', '0'), +('1', '54', '20', '11601', '20622', '0'), +('1', '54', '20', '2921', '15446', '0'), +('1', '54', '20', '1365', '10500', '0'), +('1', '54', '12', '4835', '11411', '0'), +('1', '54', '12', '4915', '11411', '0'), +('1', '54', '12', '20655', '7866', '0'), +('1', '54', '12', '11624', '5968', '0'), +('1', '54', '18', '4836', '7846', '0'), +('1', '54', '18', '4916', '7846', '0'), +('1', '54', '18', '4346', '4645', '0'), +('1', '54', '18', '4179', '4393', '0'), +('1', '54', '19', '4917', '6970', '0'), +('1', '54', '19', '4837', '6970', '0'), +('1', '54', '19', '68239', '4760', '0'), +('1', '54', '19', '4180', '3654', '0'), +('1', '54', '13', '11674', '38005', '0'), +('1', '54', '13', '3554', '28549', '0'), +('1', '54', '13', '27961', '26306', '0'), +('1', '54', '13', '11667', '24603', '0'), +('1', '54', '14', '11674', '38005', '0'), +('1', '54', '14', '11632', '32298', '0'), +('1', '54', '14', '3554', '28549', '0'), +('1', '54', '14', '11551', '23853', '0'), +('1', '54', '11', '45137', '25189', '0'), +('1', '54', '11', '8325', '11900', '0'), +('1', '54', '11', '8408', '11848', '0'), +('1', '54', '11', '8811', '9303', '0'), +('1', '55', '22', '8567', '0', '0'), +('1', '55', '22', '10323', '0', '0'), +('1', '55', '22', '66166', '0', '0'), +('1', '55', '22', '10664', '0', '0'), +('1', '55', '1', '27822', '5699', '0'), +('1', '55', '1', '14701', '4104', '0'), +('1', '55', '1', '14702', '2500', '0'), +('1', '55', '1', '10165', '1940', '0'), +('1', '55', '2', '4301', '7726', '0'), +('1', '55', '2', '4620', '6459', '0'), +('1', '55', '2', '4911', '6040', '0'), +('1', '55', '2', '4831', '6040', '0'), +('1', '55', '3', '71529', '4614', '0'), +('1', '55', '3', '21026', '2114', '0'), +('1', '55', '3', '21002', '2114', '0'), +('1', '55', '3', '10144', '1628', '0'), +('1', '55', '5', '14569', '6171', '0'), +('1', '55', '5', '14703', '5500', '0'), +('1', '55', '5', '10055', '4010', '0'), +('1', '55', '5', '14700', '3906', '0'), +('1', '55', '8', '11621', '26579', '0'), +('1', '55', '8', '1546', '9983', '0'), +('1', '55', '8', '11551', '8753', '0'), +('1', '55', '8', '1409', '7747', '0'), +('1', '55', '6', '1557', '8270', '0'), +('1', '55', '6', '27701', '6323', '0'), +('1', '55', '6', '4302', '5221', '0'), +('1', '55', '6', '4175', '3775', '0'), +('1', '55', '17', '4832', '16088', '0'), +('1', '55', '17', '4912', '16088', '0'), +('1', '55', '17', '4174', '10726', '0'), +('1', '55', '17', '4309', '8225', '0'), +('1', '55', '7', '4343', '6825', '0'), +('1', '55', '7', '4913', '6478', '0'), +('1', '55', '7', '4833', '6478', '0'), +('1', '55', '7', '2986', '3926', '0'), +('1', '55', '9', '4834', '4408', '0'), +('1', '55', '9', '4914', '4408', '0'), +('1', '55', '9', '4311', '3907', '0'), +('1', '55', '9', '12189', '3471', '0'), +('1', '55', '15', '10366', '8054', '0'), +('1', '55', '15', '10151', '7200', '0'), +('1', '55', '15', '14679', '7010', '0'), +('1', '55', '15', '14678', '5708', '0'), +('1', '55', '20', '11673', '26574', '0'), +('1', '55', '20', '11601', '20688', '0'), +('1', '55', '20', '2921', '15479', '0'), +('1', '55', '20', '1365', '10500', '0'), +('1', '55', '12', '4835', '11445', '0'), +('1', '55', '12', '4915', '11445', '0'), +('1', '55', '12', '20655', '7880', '0'), +('1', '55', '12', '11624', '6015', '0'), +('1', '55', '18', '4836', '7879', '0'), +('1', '55', '18', '4916', '7879', '0'), +('1', '55', '18', '4346', '4645', '0'), +('1', '55', '18', '4179', '4393', '0'), +('1', '55', '19', '4917', '6970', '0'), +('1', '55', '19', '4837', '6970', '0'), +('1', '55', '19', '68239', '4760', '0'), +('1', '55', '19', '4180', '3654', '0'), +('1', '55', '13', '11674', '38543', '0'), +('1', '55', '13', '3554', '29022', '0'), +('1', '55', '13', '27961', '26906', '0'), +('1', '55', '13', '11667', '24973', '0'), +('1', '55', '14', '11674', '38543', '0'), +('1', '55', '14', '11632', '32397', '0'), +('1', '55', '14', '3554', '29022', '0'), +('1', '55', '14', '11551', '23853', '0'), +('1', '55', '11', '45137', '26107', '0'), +('1', '55', '11', '8325', '12183', '0'), +('1', '55', '11', '8408', '12113', '0'), +('1', '55', '11', '8811', '9520', '0'), +('1', '56', '22', '8567', '0', '0'), +('1', '56', '22', '10323', '0', '0'), +('1', '56', '22', '66166', '0', '0'), +('1', '56', '22', '10664', '0', '0'), +('1', '56', '1', '27822', '5699', '0'), +('1', '56', '1', '14701', '4104', '0'), +('1', '56', '1', '14702', '2500', '0'), +('1', '56', '1', '14623', '1942', '0'), +('1', '56', '2', '4301', '7726', '0'), +('1', '56', '2', '4620', '6509', '0'), +('1', '56', '2', '4911', '6040', '0'), +('1', '56', '2', '4831', '6040', '0'), +('1', '56', '3', '71529', '4643', '0'), +('1', '56', '3', '21026', '2114', '0'), +('1', '56', '3', '21002', '2114', '0'), +('1', '56', '3', '10144', '1628', '0'), +('1', '56', '5', '14569', '6171', '0'), +('1', '56', '5', '14703', '5500', '0'), +('1', '56', '5', '10055', '4010', '0'), +('1', '56', '5', '14700', '3906', '0'), +('1', '56', '8', '11621', '26579', '0'), +('1', '56', '8', '1546', '9983', '0'), +('1', '56', '8', '11551', '8753', '0'), +('1', '56', '8', '1409', '7747', '0'), +('1', '56', '6', '1557', '8270', '0'), +('1', '56', '6', '27701', '6373', '0'), +('1', '56', '6', '4302', '5264', '0'), +('1', '56', '6', '4175', '3775', '0'), +('1', '56', '17', '4832', '16196', '0'), +('1', '56', '17', '4912', '16196', '0'), +('1', '56', '17', '4174', '10763', '0'), +('1', '56', '17', '4309', '8225', '0'), +('1', '56', '7', '4343', '6898', '0'), +('1', '56', '7', '4913', '6478', '0'), +('1', '56', '7', '4833', '6478', '0'), +('1', '56', '7', '2986', '3926', '0'), +('1', '56', '9', '4834', '4408', '0'), +('1', '56', '9', '4914', '4408', '0'), +('1', '56', '9', '4311', '3957', '0'), +('1', '56', '9', '12189', '3471', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '56', '15', '10366', '8054', '0'), +('1', '56', '15', '10151', '7200', '0'), +('1', '56', '15', '14679', '7010', '0'), +('1', '56', '15', '14678', '5708', '0'), +('1', '56', '20', '11673', '26661', '0'), +('1', '56', '20', '11601', '20761', '0'), +('1', '56', '20', '2921', '15515', '0'), +('1', '56', '20', '1365', '10500', '0'), +('1', '56', '12', '4835', '11481', '0'), +('1', '56', '12', '4915', '11481', '0'), +('1', '56', '12', '20655', '7894', '0'), +('1', '56', '12', '11624', '6066', '0'), +('1', '56', '18', '4836', '7915', '0'), +('1', '56', '18', '4916', '7915', '0'), +('1', '56', '18', '4346', '4645', '0'), +('1', '56', '18', '4179', '4393', '0'), +('1', '56', '19', '4917', '6970', '0'), +('1', '56', '19', '4837', '6970', '0'), +('1', '56', '19', '68239', '4760', '0'), +('1', '56', '19', '4180', '3654', '0'), +('1', '56', '13', '11674', '39053', '0'), +('1', '56', '13', '3554', '29497', '0'), +('1', '56', '13', '27961', '27509', '0'), +('1', '56', '13', '11667', '25332', '0'), +('1', '56', '14', '11674', '39053', '0'), +('1', '56', '14', '11632', '32506', '0'), +('1', '56', '14', '3554', '29497', '0'), +('1', '56', '14', '11551', '23853', '0'), +('1', '56', '11', '45137', '26985', '0'), +('1', '56', '11', '8325', '12467', '0'), +('1', '56', '11', '8408', '12386', '0'), +('1', '56', '11', '8811', '9747', '0'), +('1', '57', '22', '8567', '0', '0'), +('1', '57', '22', '10323', '0', '0'), +('1', '57', '22', '66166', '0', '0'), +('1', '57', '22', '10664', '0', '0'), +('1', '57', '1', '27822', '5699', '0'), +('1', '57', '1', '14701', '4104', '0'), +('1', '57', '1', '14702', '2500', '0'), +('1', '57', '1', '14623', '1986', '0'), +('1', '57', '2', '4301', '7726', '0'), +('1', '57', '2', '4620', '6560', '0'), +('1', '57', '2', '4911', '6040', '0'), +('1', '57', '2', '4831', '6040', '0'), +('1', '57', '3', '71529', '4672', '0'), +('1', '57', '3', '21026', '2114', '0'), +('1', '57', '3', '21002', '2114', '0'), +('1', '57', '3', '10144', '1628', '0'), +('1', '57', '5', '14569', '6171', '0'), +('1', '57', '5', '14703', '5500', '0'), +('1', '57', '5', '10055', '4010', '0'), +('1', '57', '5', '14700', '3906', '0'), +('1', '57', '8', '11621', '26579', '0'), +('1', '57', '8', '1546', '9983', '0'), +('1', '57', '8', '11551', '8753', '0'), +('1', '57', '8', '1409', '7747', '0'), +('1', '57', '6', '1557', '8270', '0'), +('1', '57', '6', '27701', '6424', '0'), +('1', '57', '6', '4302', '5308', '0'), +('1', '57', '6', '4175', '3775', '0'), +('1', '57', '17', '4832', '16305', '0'), +('1', '57', '17', '4912', '16305', '0'), +('1', '57', '17', '4174', '10799', '0'), +('1', '57', '17', '4309', '8225', '0'), +('1', '57', '7', '4343', '6970', '0'), +('1', '57', '7', '4913', '6478', '0'), +('1', '57', '7', '4833', '6478', '0'), +('1', '57', '7', '2986', '3926', '0'), +('1', '57', '9', '4834', '4408', '0'), +('1', '57', '9', '4914', '4408', '0'), +('1', '57', '9', '4311', '4008', '0'), +('1', '57', '9', '12189', '3471', '0'), +('1', '57', '15', '10366', '8054', '0'), +('1', '57', '15', '10151', '7200', '0'), +('1', '57', '15', '14679', '7010', '0'), +('1', '57', '15', '14678', '5708', '0'), +('1', '57', '20', '11673', '26748', '0'), +('1', '57', '20', '11601', '20833', '0'), +('1', '57', '20', '2921', '15551', '0'), +('1', '57', '20', '1365', '10500', '0'), +('1', '57', '12', '4835', '11517', '0'), +('1', '57', '12', '4915', '11517', '0'), +('1', '57', '12', '20655', '7909', '0'), +('1', '57', '12', '11624', '6116', '0'), +('1', '57', '18', '4836', '7952', '0'), +('1', '57', '18', '4916', '7952', '0'), +('1', '57', '18', '4346', '4645', '0'), +('1', '57', '18', '4179', '4393', '0'), +('1', '57', '19', '4917', '6970', '0'), +('1', '57', '19', '4837', '6970', '0'), +('1', '57', '19', '68239', '4760', '0'), +('1', '57', '19', '4180', '3654', '0'), +('1', '57', '13', '11674', '39591', '0'), +('1', '57', '13', '3554', '29972', '0'), +('1', '57', '13', '27961', '28112', '0'), +('1', '57', '13', '11667', '25704', '0'), +('1', '57', '14', '11674', '39591', '0'), +('1', '57', '14', '11632', '32615', '0'), +('1', '57', '14', '3554', '29972', '0'), +('1', '57', '14', '11551', '23853', '0'), +('1', '57', '11', '45137', '28206', '0'), +('1', '57', '11', '8325', '12750', '0'), +('1', '57', '11', '8408', '12660', '0'), +('1', '57', '11', '8811', '9964', '0'), +('1', '58', '22', '8567', '0', '0'), +('1', '58', '22', '10323', '0', '0'), +('1', '58', '22', '66166', '0', '0'), +('1', '58', '22', '10664', '0', '0'), +('1', '58', '1', '27822', '5699', '0'), +('1', '58', '1', '14701', '4104', '0'), +('1', '58', '1', '14702', '2500', '0'), +('1', '58', '1', '14623', '2029', '0'), +('1', '58', '2', '4301', '7726', '0'), +('1', '58', '2', '4620', '6611', '0'), +('1', '58', '2', '4911', '6040', '0'), +('1', '58', '2', '4831', '6040', '0'), +('1', '58', '3', '71529', '4701', '0'), +('1', '58', '3', '21026', '2114', '0'), +('1', '58', '3', '21002', '2114', '0'), +('1', '58', '3', '10144', '1628', '0'), +('1', '58', '5', '14569', '6171', '0'), +('1', '58', '5', '14703', '5500', '0'), +('1', '58', '5', '10055', '4010', '0'), +('1', '58', '5', '14700', '3906', '0'), +('1', '58', '8', '11621', '26579', '0'), +('1', '58', '8', '1546', '9983', '0'), +('1', '58', '8', '11551', '8753', '0'), +('1', '58', '8', '1409', '7747', '0'), +('1', '58', '6', '1557', '8270', '0'), +('1', '58', '6', '27701', '6475', '0'), +('1', '58', '6', '4302', '5351', '0'), +('1', '58', '6', '4175', '3775', '0'), +('1', '58', '17', '4832', '16414', '0'), +('1', '58', '17', '4912', '16414', '0'), +('1', '58', '17', '4174', '10835', '0'), +('1', '58', '17', '4309', '8225', '0'), +('1', '58', '7', '4343', '7043', '0'), +('1', '58', '7', '4913', '6478', '0'), +('1', '58', '7', '4833', '6478', '0'), +('1', '58', '7', '2986', '3926', '0'), +('1', '58', '9', '4834', '4408', '0'), +('1', '58', '9', '4914', '4408', '0'), +('1', '58', '9', '4311', '4059', '0'), +('1', '58', '9', '12189', '3471', '0'), +('1', '58', '15', '10366', '8054', '0'), +('1', '58', '15', '10151', '7200', '0'), +('1', '58', '15', '14679', '7010', '0'), +('1', '58', '15', '14678', '5708', '0'), +('1', '58', '20', '11673', '26835', '0'), +('1', '58', '20', '11601', '20906', '0'), +('1', '58', '20', '2921', '15588', '0'), +('1', '58', '20', '1365', '10500', '0'), +('1', '58', '12', '4835', '11553', '0'), +('1', '58', '12', '4915', '11553', '0'), +('1', '58', '12', '20655', '7923', '0'), +('1', '58', '12', '11624', '6167', '0'), +('1', '58', '18', '4836', '7988', '0'), +('1', '58', '18', '4916', '7988', '0'), +('1', '58', '18', '4346', '4645', '0'), +('1', '58', '18', '4179', '4393', '0'), +('1', '58', '19', '4917', '6970', '0'), +('1', '58', '19', '4837', '6970', '0'), +('1', '58', '19', '68239', '4760', '0'), +('1', '58', '19', '4180', '3654', '0'), +('1', '58', '13', '11674', '40101', '0'), +('1', '58', '13', '3554', '30419', '0'), +('1', '58', '13', '27961', '28715', '0'), +('1', '58', '13', '11667', '26077', '0'), +('1', '58', '14', '11674', '40101', '0'), +('1', '58', '14', '11632', '32724', '0'), +('1', '58', '14', '3554', '30419', '0'), +('1', '58', '14', '11551', '23853', '0'), +('1', '58', '11', '45137', '29117', '0'), +('1', '58', '11', '8325', '13033', '0'), +('1', '58', '11', '8408', '12925', '0'), +('1', '58', '11', '8811', '10191', '0'), +('1', '59', '22', '8567', '0', '0'), +('1', '59', '22', '10323', '0', '0'), +('1', '59', '22', '66166', '0', '0'), +('1', '59', '22', '10664', '0', '0'), +('1', '59', '1', '27822', '5699', '0'), +('1', '59', '1', '14701', '4104', '0'), +('1', '59', '1', '14702', '2500', '0'), +('1', '59', '1', '14623', '2073', '0'), +('1', '59', '2', '4301', '7726', '0'), +('1', '59', '2', '4620', '6662', '0'), +('1', '59', '2', '4911', '6040', '0'), +('1', '59', '2', '4831', '6040', '0'), +('1', '59', '3', '71529', '4730', '0'), +('1', '59', '3', '21026', '2114', '0'), +('1', '59', '3', '21002', '2114', '0'), +('1', '59', '3', '10144', '1628', '0'), +('1', '59', '5', '14569', '6171', '0'), +('1', '59', '5', '14703', '5500', '0'), +('1', '59', '5', '10055', '4010', '0'), +('1', '59', '5', '14700', '3906', '0'), +('1', '59', '8', '11621', '26579', '0'), +('1', '59', '8', '1546', '9983', '0'), +('1', '59', '8', '11551', '8753', '0'), +('1', '59', '8', '1409', '7747', '0'), +('1', '59', '6', '1557', '8270', '0'), +('1', '59', '6', '27701', '6526', '0'), +('1', '59', '6', '4302', '5395', '0'), +('1', '59', '6', '4175', '3775', '0'), +('1', '59', '17', '4832', '16522', '0'), +('1', '59', '17', '4912', '16522', '0'), +('1', '59', '17', '4174', '10871', '0'), +('1', '59', '17', '4309', '8225', '0'), +('1', '59', '7', '4343', '7115', '0'), +('1', '59', '7', '4913', '6478', '0'), +('1', '59', '7', '4833', '6478', '0'), +('1', '59', '7', '2986', '3926', '0'), +('1', '59', '9', '4834', '4408', '0'), +('1', '59', '9', '4914', '4408', '0'), +('1', '59', '9', '4311', '4110', '0'), +('1', '59', '9', '12189', '3471', '0'), +('1', '59', '15', '10366', '8054', '0'), +('1', '59', '15', '10151', '7200', '0'), +('1', '59', '15', '14679', '7010', '0'), +('1', '59', '15', '14678', '5708', '0'), +('1', '59', '20', '11673', '26922', '0'), +('1', '59', '20', '11601', '20978', '0'), +('1', '59', '20', '2921', '15624', '0'), +('1', '59', '20', '1365', '10500', '0'), +('1', '59', '12', '4835', '11590', '0'), +('1', '59', '12', '4915', '11590', '0'), +('1', '59', '12', '20655', '7938', '0'), +('1', '59', '12', '11624', '6218', '0'), +('1', '59', '18', '4836', '8024', '0'), +('1', '59', '18', '4916', '8024', '0'), +('1', '59', '18', '4346', '4645', '0'), +('1', '59', '18', '4179', '4393', '0'), +('1', '59', '19', '4917', '6970', '0'), +('1', '59', '19', '4837', '6970', '0'), +('1', '59', '19', '68239', '4760', '0'), +('1', '59', '19', '4180', '3654', '0'), +('1', '59', '13', '11674', '40611', '0'), +('1', '59', '13', '3554', '30894', '0'), +('1', '59', '13', '27961', '29318', '0'), +('1', '59', '13', '11667', '26435', '0'), +('1', '59', '14', '11674', '40611', '0'), +('1', '59', '14', '11632', '32832', '0'), +('1', '59', '14', '3554', '30894', '0'), +('1', '59', '14', '11551', '23853', '0'), +('1', '59', '11', '45137', '30115', '0'), +('1', '59', '11', '8325', '13317', '0'), +('1', '59', '11', '8408', '13199', '0'), +('1', '59', '11', '8811', '10408', '0'), +('1', '60', '22', '21807', '0', '3'), +('1', '60', '22', '21805', '0', '3'), +('1', '60', '22', '12425', '0', '3'), +('1', '60', '22', '7867', '0', '3'), +('1', '60', '1', '7945', '23485', '3'), +('1', '60', '1', '26775', '15724', '3'), +('1', '60', '1', '28945', '12105', '3'), +('1', '60', '1', '29861', '11790', '3'), +('1', '60', '2', '26025', '23584', '3'), +('1', '60', '2', '2612', '23584', '3'), +('1', '60', '2', '26759', '14475', '3'), +('1', '60', '2', '28986', '13704', '3'), +('1', '60', '3', '26773', '15309', '3'), +('1', '60', '3', '28942', '13438', '3'), +('1', '60', '3', '26751', '12440', '3'), +('1', '60', '3', '28963', '11934', '3'), +('1', '60', '5', '28885', '29879', '3'), +('1', '60', '5', '27266', '25638', '3'), +('1', '60', '5', '8364', '17327', '3'), +('1', '60', '5', '7868', '13178', '3'), +('1', '60', '8', '26765', '32509', '3'), +('1', '60', '8', '26766', '32177', '3'), +('1', '60', '8', '31471', '31272', '3'), +('1', '60', '8', '11621', '23502', '3'), +('1', '60', '6', '28902', '32664', '3'), +('1', '60', '6', '28919', '13467', '3'), +('1', '60', '6', '31472', '13263', '3'), +('1', '60', '6', '30551', '13206', '3'), +('1', '60', '17', '28937', '34361', '3'), +('1', '60', '17', '29457', '31574', '3'), +('1', '60', '17', '27261', '20017', '3'), +('1', '60', '17', '26770', '17370', '3'), +('1', '60', '7', '28926', '14886', '3'), +('1', '60', '7', '7194', '13554', '3'), +('1', '60', '7', '7868', '13178', '3'), +('1', '60', '7', '26584', '12439', '3'), +('1', '60', '9', '31461', '31506', '3'), +('1', '60', '9', '7868', '13178', '3'), +('1', '60', '9', '26584', '12439', '3'), +('1', '60', '9', '31460', '11470', '3'), +('1', '60', '15', '27950', '21619', '3'), +('1', '60', '15', '26749', '14938', '3'), +('1', '60', '15', '26757', '11670', '3'), +('1', '60', '15', '63170', '11667', '3'), +('1', '60', '20', '31235', '30791', '3'), +('1', '60', '20', '28890', '29931', '3'), +('1', '60', '20', '31334', '28583', '3'), +('1', '60', '20', '26551', '26231', '3'), +('1', '60', '12', '25857', '29507', '3'), +('1', '60', '12', '28967', '14875', '3'), +('1', '60', '12', '29177', '12759', '3'), +('1', '60', '12', '26774', '12525', '3'), +('1', '60', '18', '28965', '14512', '3'), +('1', '60', '18', '26755', '11646', '3'), +('1', '60', '18', '28932', '11418', '3'), +('1', '60', '18', '8289', '11327', '3'), +('1', '60', '19', '30569', '32343', '3'), +('1', '60', '19', '28888', '27948', '3'), +('1', '60', '19', '24616', '23667', '3'), +('1', '60', '19', '7871', '11515', '3'), +('1', '60', '13', '69416', '60035', '3'), +('1', '60', '13', '31469', '56425', '3'), +('1', '60', '13', '28855', '50774', '3'), +('1', '60', '13', '26585', '50691', '3'), +('1', '60', '14', '28809', '62364', '3'), +('1', '60', '14', '69416', '60035', '3'), +('1', '60', '14', '31379', '57301', '3'), +('1', '60', '14', '31469', '56425', '3'), +('1', '60', '11', '30539', '42740', '3'), +('1', '60', '11', '28935', '41227', '3'), +('1', '60', '11', '7904', '37826', '3'), +('1', '60', '11', '25208', '32386', '3'), +('1', '60', '22', '66166', '0', '2'), +('1', '60', '22', '10323', '0', '2'), +('1', '60', '22', '9248', '0', '2'), +('1', '60', '22', '12425', '0', '2'), +('1', '60', '1', '2748', '8187', '2'), +('1', '60', '1', '31236', '7999', '2'), +('1', '60', '1', '5716', '7342', '2'), +('1', '60', '1', '62234', '5860', '2'), +('1', '60', '2', '2612', '24908', '2'), +('1', '60', '2', '26025', '24908', '2'), +('1', '60', '2', '25209', '14541', '2'), +('1', '60', '2', '29648', '14161', '2'), +('1', '60', '3', '31233', '13575', '2'), +('1', '60', '3', '31464', '11888', '2'), +('1', '60', '3', '31378', '10704', '2'), +('1', '60', '3', '31244', '10689', '2'), +('1', '60', '5', '27266', '26504', '2'), +('1', '60', '5', '31234', '14313', '2'), +('1', '60', '5', '31460', '14144', '2'), +('1', '60', '5', '1550', '12024', '2'), +('1', '60', '8', '31471', '33468', '2'), +('1', '60', '8', '11621', '24015', '2'), +('1', '60', '8', '27261', '21172', '2'), +('1', '60', '8', '1619', '19157', '2'), +('1', '60', '6', '31472', '15862', '2'), +('1', '60', '6', '31240', '12130', '2'), +('1', '60', '6', '5723', '12022', '2'), +('1', '60', '6', '24070', '11840', '2'), +('1', '60', '17', '29457', '34284', '2'), +('1', '60', '17', '27261', '21172', '2'), +('1', '60', '17', '25044', '16257', '2'), +('1', '60', '17', '25206', '15585', '2'), +('1', '60', '7', '5723', '12022', '2'), +('1', '60', '7', '29485', '7658', '2'), +('1', '60', '7', '31325', '7289', '2'), +('1', '60', '7', '31381', '7267', '2'), +('1', '60', '9', '31461', '34039', '2'), +('1', '60', '9', '31460', '14144', '2'), +('1', '60', '9', '5723', '12022', '2'), +('1', '60', '9', '31246', '9053', '2'), +('1', '60', '15', '31231', '13135', '2'), +('1', '60', '15', '25211', '12442', '2'), +('1', '60', '15', '30385', '11563', '2'), +('1', '60', '15', '30388', '10226', '2'), +('1', '60', '20', '31235', '33667', '2'), +('1', '60', '20', '31334', '29894', '2'), +('1', '60', '20', '31353', '23039', '2'), +('1', '60', '20', '11673', '21798', '2'), +('1', '60', '12', '25857', '31059', '2'), +('1', '60', '12', '31227', '14831', '2'), +('1', '60', '12', '29177', '13834', '2'), +('1', '60', '12', '31306', '12358', '2'), +('1', '60', '18', '31332', '8594', '2'), +('1', '60', '18', '31310', '7898', '2'), +('1', '60', '18', '31386', '7835', '2'), +('1', '60', '18', '31187', '6393', '2'), +('1', '60', '19', '24616', '24328', '2'), +('1', '60', '19', '25197', '10546', '2'), +('1', '60', '19', '29455', '8773', '2'), +('1', '60', '19', '1099', '8081', '2'), +('1', '60', '13', '69416', '61818', '2'), +('1', '60', '13', '31469', '58508', '2'), +('1', '60', '13', '1154', '50730', '2'), +('1', '60', '13', '31243', '47101', '2'), +('1', '60', '14', '69416', '61818', '2'), +('1', '60', '14', '31469', '58508', '2'), +('1', '60', '14', '31379', '57376', '2'), +('1', '60', '14', '1154', '50730', '2'), +('1', '60', '11', '25208', '31208', '2'), +('1', '60', '11', '29433', '28963', '2'), +('1', '60', '11', '27326', '28963', '2'), +('1', '60', '11', '45137', '27212', '2'), +('1', '60', '22', '8567', '0', '1'), +('1', '60', '22', '10323', '0', '1'), +('1', '60', '22', '66166', '0', '1'), +('1', '60', '22', '10664', '0', '1'), +('1', '60', '1', '62234', '7131', '1'), +('1', '60', '1', '5716', '6642', '1'), +('1', '60', '1', '5704', '6238', '1'), +('1', '60', '1', '5715', '6238', '1'), +('1', '60', '2', '10913', '12387', '1'), +('1', '60', '2', '1630', '9391', '1'), +('1', '60', '2', '50036', '7546', '1'), +('1', '60', '2', '4301', '6117', '1'), +('1', '60', '3', '46184', '6981', '1'), +('1', '60', '3', '1625', '4548', '1'), +('1', '60', '3', '5712', '3370', '1'), +('1', '60', '3', '71529', '3305', '1'), +('1', '60', '5', '14703', '5500', '1'), +('1', '60', '5', '14569', '5282', '1'), +('1', '60', '5', '5794', '4076', '1'), +('1', '60', '5', '14709', '3852', '1'), +('1', '60', '8', '11621', '25297', '1'), +('1', '60', '8', '1619', '21783', '1'), +('1', '60', '8', '1627', '20060', '1'), +('1', '60', '8', '1622', '10251', '1'), +('1', '60', '6', '5723', '14230', '1'), +('1', '60', '6', '5706', '9247', '1'), +('1', '60', '6', '1557', '7033', '1'), +('1', '60', '6', '11975', '4439', '1'), +('1', '60', '17', '4516', '15883', '1'), +('1', '60', '17', '10845', '13959', '1'), +('1', '60', '17', '4832', '9816', '1'), +('1', '60', '17', '4912', '9816', '1'), +('1', '60', '7', '5723', '14230', '1'), +('1', '60', '7', '62046', '5346', '1'), +('1', '60', '7', '4295', '4590', '1'), +('1', '60', '7', '4517', '4456', '1'), +('1', '60', '9', '5723', '14230', '1'), +('1', '60', '9', '5794', '4076', '1'), +('1', '60', '9', '4294', '3594', '1'), +('1', '60', '9', '4518', '3565', '1'), +('1', '60', '15', '5727', '10432', '1'), +('1', '60', '15', '10366', '8032', '1'), +('1', '60', '15', '10151', '7200', '1'), +('1', '60', '15', '5728', '6857', '1'), +('1', '60', '20', '11673', '24403', '1'), +('1', '60', '20', '1620', '19156', '1'), +('1', '60', '20', '11601', '18776', '1'), +('1', '60', '20', '2921', '13607', '1'), +('1', '60', '12', '4835', '8911', '1'), +('1', '60', '12', '4915', '8911', '1'), +('1', '60', '12', '20655', '5636', '1'), +('1', '60', '12', '4519', '4456', '1'), +('1', '60', '18', '4520', '8147', '1'), +('1', '60', '18', '11612', '5427', '1'), +('1', '60', '18', '4916', '4757', '1'), +('1', '60', '18', '4836', '4757', '1'), +('1', '60', '19', '24616', '25981', '1'), +('1', '60', '19', '4837', '4483', '1'), +('1', '60', '19', '4917', '4483', '1'), +('1', '60', '19', '4521', '4456', '1'), +('1', '60', '13', '6287', '42513', '1'), +('1', '60', '13', '11674', '38614', '1'), +('1', '60', '13', '10910', '35490', '1'), +('1', '60', '13', '24613', '34800', '1'), +('1', '60', '14', '6287', '42513', '1'), +('1', '60', '14', '11674', '38614', '1'), +('1', '60', '14', '10910', '35490', '1'), +('1', '60', '14', '24613', '34800', '1'), +('1', '60', '11', '45137', '29135', '1'), +('1', '60', '11', '5758', '21526', '1'), +('1', '60', '11', '8325', '13600', '1'), +('1', '60', '11', '8408', '13388', '1'), +('1', '61', '22', '21807', '0', '3'), +('1', '61', '22', '21805', '0', '3'), +('1', '61', '22', '12425', '0', '3'), +('1', '61', '22', '7867', '0', '3'), +('1', '61', '1', '7945', '23486', '3'), +('1', '61', '1', '26775', '15725', '3'), +('1', '61', '1', '28945', '12106', '3'), +('1', '61', '1', '29861', '11793', '3'), +('1', '61', '2', '26025', '23585', '3'), +('1', '61', '2', '2612', '23585', '3'), +('1', '61', '2', '26759', '14475', '3'), +('1', '61', '2', '28986', '13709', '3'), +('1', '61', '3', '26773', '15312', '3'), +('1', '61', '3', '28942', '13439', '3'), +('1', '61', '3', '26751', '12440', '3'), +('1', '61', '3', '28963', '11935', '3'), +('1', '61', '5', '28885', '29880', '3'), +('1', '61', '5', '27266', '25638', '3'), +('1', '61', '5', '8364', '17329', '3'), +('1', '61', '5', '7868', '13179', '3'), +('1', '61', '8', '26765', '32510', '3'), +('1', '61', '8', '26766', '32179', '3'), +('1', '61', '8', '31471', '31274', '3'), +('1', '61', '8', '11621', '23502', '3'), +('1', '61', '6', '28902', '32665', '3'), +('1', '61', '6', '28919', '13469', '3'), +('1', '61', '6', '31472', '13264', '3'), +('1', '61', '6', '30551', '13208', '3'), +('1', '61', '17', '28937', '34363', '3'), +('1', '61', '17', '29457', '31574', '3'), +('1', '61', '17', '27261', '20018', '3'), +('1', '61', '17', '26770', '17373', '3'), +('1', '61', '7', '28926', '14886', '3'), +('1', '61', '7', '7194', '13554', '3'), +('1', '61', '7', '7868', '13179', '3'), +('1', '61', '7', '26584', '12440', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '61', '9', '31461', '31507', '3'), +('1', '61', '9', '7868', '13179', '3'), +('1', '61', '9', '26584', '12440', '3'), +('1', '61', '9', '31460', '11472', '3'), +('1', '61', '15', '27950', '21620', '3'), +('1', '61', '15', '26749', '14939', '3'), +('1', '61', '15', '26757', '11671', '3'), +('1', '61', '15', '63170', '11668', '3'), +('1', '61', '20', '31235', '30793', '3'), +('1', '61', '20', '28890', '29931', '3'), +('1', '61', '20', '31334', '28583', '3'), +('1', '61', '20', '26551', '26233', '3'), +('1', '61', '12', '25857', '29507', '3'), +('1', '61', '12', '28967', '14875', '3'), +('1', '61', '12', '29177', '12759', '3'), +('1', '61', '12', '26774', '12527', '3'), +('1', '61', '18', '28965', '14514', '3'), +('1', '61', '18', '26755', '11646', '3'), +('1', '61', '18', '28932', '11420', '3'), +('1', '61', '18', '8289', '11327', '3'), +('1', '61', '19', '30569', '32344', '3'), +('1', '61', '19', '28888', '27948', '3'), +('1', '61', '19', '24616', '23667', '3'), +('1', '61', '19', '7871', '11519', '3'), +('1', '61', '13', '69416', '60122', '3'), +('1', '61', '13', '31469', '56483', '3'), +('1', '61', '13', '28855', '50860', '3'), +('1', '61', '13', '26585', '50779', '3'), +('1', '61', '14', '28809', '62423', '3'), +('1', '61', '14', '69416', '60122', '3'), +('1', '61', '14', '31379', '57358', '3'), +('1', '61', '14', '31469', '56483', '3'), +('1', '61', '11', '30539', '42863', '3'), +('1', '61', '11', '28935', '41355', '3'), +('1', '61', '11', '7904', '37874', '3'), +('1', '61', '11', '25208', '32433', '3'), +('1', '62', '22', '21807', '0', '3'), +('1', '62', '22', '21805', '0', '3'), +('1', '62', '22', '12425', '0', '3'), +('1', '62', '22', '7867', '0', '3'), +('1', '62', '1', '7945', '23486', '3'), +('1', '62', '1', '26775', '15727', '3'), +('1', '62', '1', '28945', '12106', '3'), +('1', '62', '1', '29861', '11796', '3'), +('1', '62', '2', '26025', '23586', '3'), +('1', '62', '2', '2612', '23586', '3'), +('1', '62', '2', '26759', '14475', '3'), +('1', '62', '2', '28986', '13713', '3'), +('1', '62', '3', '26773', '15315', '3'), +('1', '62', '3', '28942', '13441', '3'), +('1', '62', '3', '26751', '12440', '3'), +('1', '62', '3', '28963', '11937', '3'), +('1', '62', '5', '28885', '29881', '3'), +('1', '62', '5', '27266', '25639', '3'), +('1', '62', '5', '8364', '17330', '3'), +('1', '62', '5', '7868', '13180', '3'), +('1', '62', '8', '26765', '32510', '3'), +('1', '62', '8', '26766', '32180', '3'), +('1', '62', '8', '31471', '31275', '3'), +('1', '62', '8', '11621', '23502', '3'), +('1', '62', '6', '28902', '32667', '3'), +('1', '62', '6', '28919', '13472', '3'), +('1', '62', '6', '31472', '13266', '3'), +('1', '62', '6', '30551', '13209', '3'), +('1', '62', '17', '28937', '34364', '3'), +('1', '62', '17', '29457', '31574', '3'), +('1', '62', '17', '27261', '20019', '3'), +('1', '62', '17', '26770', '17376', '3'), +('1', '62', '7', '28926', '14886', '3'), +('1', '62', '7', '7194', '13554', '3'), +('1', '62', '7', '7868', '13180', '3'), +('1', '62', '7', '26584', '12442', '3'), +('1', '62', '9', '31461', '31508', '3'), +('1', '62', '9', '7868', '13180', '3'), +('1', '62', '9', '26584', '12442', '3'), +('1', '62', '9', '31460', '11474', '3'), +('1', '62', '15', '27950', '21621', '3'), +('1', '62', '15', '26749', '14941', '3'), +('1', '62', '15', '26757', '11671', '3'), +('1', '62', '15', '63170', '11670', '3'), +('1', '62', '20', '31235', '30795', '3'), +('1', '62', '20', '28890', '29931', '3'), +('1', '62', '20', '31334', '28583', '3'), +('1', '62', '20', '26551', '26236', '3'), +('1', '62', '12', '25857', '29507', '3'), +('1', '62', '12', '28967', '14875', '3'), +('1', '62', '12', '29177', '12760', '3'), +('1', '62', '12', '26774', '12529', '3'), +('1', '62', '18', '28965', '14516', '3'), +('1', '62', '18', '26755', '11646', '3'), +('1', '62', '18', '28932', '11423', '3'), +('1', '62', '18', '8289', '11327', '3'), +('1', '62', '19', '30569', '32345', '3'), +('1', '62', '19', '28888', '27949', '3'), +('1', '62', '19', '24616', '23667', '3'), +('1', '62', '19', '7871', '11522', '3'), +('1', '62', '13', '69416', '60210', '3'), +('1', '62', '13', '31469', '56569', '3'), +('1', '62', '13', '28855', '50919', '3'), +('1', '62', '13', '26585', '50866', '3'), +('1', '62', '14', '28809', '62509', '3'), +('1', '62', '14', '69416', '60210', '3'), +('1', '62', '14', '31379', '57443', '3'), +('1', '62', '14', '31469', '56569', '3'), +('1', '62', '11', '30539', '42995', '3'), +('1', '62', '11', '28935', '41483', '3'), +('1', '62', '11', '7904', '37921', '3'), +('1', '62', '11', '25208', '32471', '3'), +('1', '63', '22', '21807', '0', '3'), +('1', '63', '22', '21805', '0', '3'), +('1', '63', '22', '12425', '0', '3'), +('1', '63', '22', '7867', '0', '3'), +('1', '63', '1', '7945', '23486', '3'), +('1', '63', '1', '26775', '15729', '3'), +('1', '63', '1', '28945', '12107', '3'), +('1', '63', '1', '29861', '11799', '3'), +('1', '63', '2', '26025', '23587', '3'), +('1', '63', '2', '2612', '23587', '3'), +('1', '63', '2', '26759', '14475', '3'), +('1', '63', '2', '28986', '13717', '3'), +('1', '63', '3', '26773', '15318', '3'), +('1', '63', '3', '28942', '13443', '3'), +('1', '63', '3', '26751', '12440', '3'), +('1', '63', '3', '28963', '11938', '3'), +('1', '63', '5', '28885', '29882', '3'), +('1', '63', '5', '27266', '25640', '3'), +('1', '63', '5', '8364', '17332', '3'), +('1', '63', '5', '7868', '13181', '3'), +('1', '63', '8', '26765', '32511', '3'), +('1', '63', '8', '26766', '32182', '3'), +('1', '63', '8', '31471', '31277', '3'), +('1', '63', '8', '11621', '23502', '3'), +('1', '63', '6', '28902', '32669', '3'), +('1', '63', '6', '28919', '13474', '3'), +('1', '63', '6', '31472', '13268', '3'), +('1', '63', '6', '30551', '13211', '3'), +('1', '63', '17', '28937', '34365', '3'), +('1', '63', '17', '29457', '31574', '3'), +('1', '63', '17', '27261', '20020', '3'), +('1', '63', '17', '26770', '17379', '3'), +('1', '63', '7', '28926', '14886', '3'), +('1', '63', '7', '7194', '13554', '3'), +('1', '63', '7', '7868', '13181', '3'), +('1', '63', '7', '26584', '12444', '3'), +('1', '63', '9', '31461', '31510', '3'), +('1', '63', '9', '7868', '13181', '3'), +('1', '63', '9', '26584', '12444', '3'), +('1', '63', '9', '31460', '11476', '3'), +('1', '63', '15', '27950', '21623', '3'), +('1', '63', '15', '26749', '14943', '3'), +('1', '63', '15', '63170', '11671', '3'), +('1', '63', '15', '26757', '11671', '3'), +('1', '63', '20', '31235', '30798', '3'), +('1', '63', '20', '28890', '29931', '3'), +('1', '63', '20', '31334', '28583', '3'), +('1', '63', '20', '26551', '26238', '3'), +('1', '63', '12', '25857', '29507', '3'), +('1', '63', '12', '28967', '14875', '3'), +('1', '63', '12', '29177', '12760', '3'), +('1', '63', '12', '26774', '12531', '3'), +('1', '63', '18', '28965', '14518', '3'), +('1', '63', '18', '26755', '11646', '3'), +('1', '63', '18', '28932', '11425', '3'), +('1', '63', '18', '8289', '11327', '3'), +('1', '63', '19', '30569', '32347', '3'), +('1', '63', '19', '28888', '27950', '3'), +('1', '63', '19', '24616', '23667', '3'), +('1', '63', '19', '7871', '11526', '3'), +('1', '63', '13', '69416', '60297', '3'), +('1', '63', '13', '31469', '56627', '3'), +('1', '63', '13', '28855', '51006', '3'), +('1', '63', '13', '26585', '50954', '3'), +('1', '63', '14', '28809', '62567', '3'), +('1', '63', '14', '69416', '60297', '3'), +('1', '63', '14', '31379', '57499', '3'), +('1', '63', '14', '31469', '56627', '3'), +('1', '63', '11', '30539', '43118', '3'), +('1', '63', '11', '28935', '41611', '3'), +('1', '63', '11', '7904', '37968', '3'), +('1', '63', '11', '25208', '32518', '3'), +('1', '64', '22', '21807', '0', '3'), +('1', '64', '22', '21805', '0', '3'), +('1', '64', '22', '12425', '0', '3'), +('1', '64', '22', '7867', '0', '3'), +('1', '64', '1', '7945', '23487', '3'), +('1', '64', '1', '26775', '15731', '3'), +('1', '64', '1', '28945', '12108', '3'), +('1', '64', '1', '29861', '11802', '3'), +('1', '64', '2', '26025', '23588', '3'), +('1', '64', '2', '2612', '23588', '3'), +('1', '64', '2', '26759', '14475', '3'), +('1', '64', '2', '28986', '13722', '3'), +('1', '64', '3', '26773', '15321', '3'), +('1', '64', '3', '28942', '13445', '3'), +('1', '64', '3', '26751', '12440', '3'), +('1', '64', '3', '28963', '11939', '3'), +('1', '64', '5', '28885', '29883', '3'), +('1', '64', '5', '27266', '25641', '3'), +('1', '64', '5', '8364', '17334', '3'), +('1', '64', '5', '7868', '13182', '3'), +('1', '64', '8', '26765', '32511', '3'), +('1', '64', '8', '26766', '32184', '3'), +('1', '64', '8', '31471', '31279', '3'), +('1', '64', '8', '11621', '23502', '3'), +('1', '64', '6', '28902', '32671', '3'), +('1', '64', '6', '28919', '13477', '3'), +('1', '64', '6', '31472', '13270', '3'), +('1', '64', '6', '30551', '13212', '3'), +('1', '64', '17', '28937', '34366', '3'), +('1', '64', '17', '29457', '31574', '3'), +('1', '64', '17', '27261', '20021', '3'), +('1', '64', '17', '26770', '17382', '3'), +('1', '64', '7', '28926', '14886', '3'), +('1', '64', '7', '7194', '13554', '3'), +('1', '64', '7', '7868', '13182', '3'), +('1', '64', '7', '26584', '12446', '3'), +('1', '64', '9', '31461', '31511', '3'), +('1', '64', '9', '7868', '13182', '3'), +('1', '64', '9', '26584', '12446', '3'), +('1', '64', '9', '31460', '11477', '3'), +('1', '64', '15', '27950', '21624', '3'), +('1', '64', '15', '26749', '14945', '3'), +('1', '64', '15', '63170', '11673', '3'), +('1', '64', '15', '26757', '11672', '3'), +('1', '64', '20', '31235', '30800', '3'), +('1', '64', '20', '28890', '29931', '3'), +('1', '64', '20', '31334', '28583', '3'), +('1', '64', '20', '26551', '26241', '3'), +('1', '64', '12', '25857', '29507', '3'), +('1', '64', '12', '28967', '14875', '3'), +('1', '64', '12', '29177', '12761', '3'), +('1', '64', '12', '26774', '12533', '3'), +('1', '64', '18', '28965', '14519', '3'), +('1', '64', '18', '26755', '11646', '3'), +('1', '64', '18', '28932', '11428', '3'), +('1', '64', '18', '8289', '11327', '3'), +('1', '64', '19', '30569', '32348', '3'), +('1', '64', '19', '28888', '27951', '3'), +('1', '64', '19', '24616', '23667', '3'), +('1', '64', '19', '7871', '11530', '3'), +('1', '64', '13', '69416', '60385', '3'), +('1', '64', '13', '31469', '56714', '3'), +('1', '64', '13', '1154', '51078', '3'), +('1', '64', '13', '28855', '51064', '3'), +('1', '64', '14', '28809', '62654', '3'), +('1', '64', '14', '69416', '60385', '3'), +('1', '64', '14', '31379', '57584', '3'), +('1', '64', '14', '31469', '56714', '3'), +('1', '64', '11', '30539', '43250', '3'), +('1', '64', '11', '28935', '41739', '3'), +('1', '64', '11', '7904', '38015', '3'), +('1', '64', '11', '25208', '32565', '3'), +('1', '65', '22', '21805', '0', '7'), +('1', '65', '22', '61948', '0', '7'), +('1', '65', '22', '66397', '0', '7'), +('1', '65', '22', '21807', '0', '7'), +('1', '65', '1', '68949', '48550', '7'), +('1', '65', '1', '7125', '40992', '7'), +('1', '65', '1', '32106', '38244', '7'), +('1', '65', '1', '69166', '33221', '7'), +('1', '65', '2', '28647', '41731', '7'), +('1', '65', '2', '28605', '40593', '7'), +('1', '65', '2', '28648', '40439', '7'), +('1', '65', '2', '69087', '28512', '7'), +('1', '65', '3', '69157', '30953', '7'), +('1', '65', '3', '69069', '28704', '7'), +('1', '65', '3', '69074', '27516', '7'), +('1', '65', '3', '69068', '27153', '7'), +('1', '65', '5', '67625', '33498', '7'), +('1', '65', '5', '69135', '31812', '7'), +('1', '65', '5', '28885', '29884', '7'), +('1', '65', '5', '68808', '29113', '7'), +('1', '65', '8', '69165', '55769', '7'), +('1', '65', '8', '69064', '52511', '7'), +('1', '65', '8', '69072', '50897', '7'), +('1', '65', '8', '26765', '32512', '7'), +('1', '65', '6', '68757', '47833', '7'), +('1', '65', '6', '13674', '43996', '7'), +('1', '65', '6', '19144', '35458', '7'), +('1', '65', '6', '28902', '32673', '7'), +('1', '65', '17', '69150', '36625', '7'), +('1', '65', '17', '28937', '34368', '7'), +('1', '65', '17', '68960', '33634', '7'), +('1', '65', '17', '29457', '31574', '7'), +('1', '65', '7', '16097', '36584', '7'), +('1', '65', '7', '69168', '30321', '7'), +('1', '65', '7', '69079', '28242', '7'), +('1', '65', '7', '68851', '27279', '7'), +('1', '65', '9', '68766', '40609', '7'), +('1', '65', '9', '16097', '36584', '7'), +('1', '65', '9', '11103', '36056', '7'), +('1', '65', '9', '69126', '32964', '7'), +('1', '65', '15', '68111', '35465', '7'), +('1', '65', '15', '9959', '35348', '7'), +('1', '65', '15', '69160', '31528', '7'), +('1', '65', '15', '69131', '30865', '7'), +('1', '65', '20', '16156', '48972', '7'), +('1', '65', '20', '16097', '36584', '7'), +('1', '65', '20', '69134', '34884', '7'), +('1', '65', '20', '15873', '34382', '7'), +('1', '65', '12', '69252', '32108', '7'), +('1', '65', '12', '25857', '29507', '7'), +('1', '65', '12', '69083', '27890', '7'), +('1', '65', '12', '68852', '25111', '7'), +('1', '65', '18', '69146', '34304', '7'), +('1', '65', '18', '68961', '29098', '7'), +('1', '65', '18', '68779', '26779', '7'), +('1', '65', '18', '28650', '25049', '7'), +('1', '65', '19', '19094', '35411', '7'), +('1', '65', '19', '30569', '32349', '7'), +('1', '65', '19', '69177', '31498', '7'), +('1', '65', '19', '69075', '28913', '7'), +('1', '65', '13', '69052', '113783', '7'), +('1', '65', '13', '69110', '99512', '7'), +('1', '65', '13', '69040', '92776', '7'), +('1', '65', '13', '69156', '92037', '7'), +('1', '65', '14', '69052', '113783', '7'), +('1', '65', '14', '69040', '92776', '7'), +('1', '65', '14', '69156', '92037', '7'), +('1', '65', '14', '22998', '89023', '7'), +('1', '65', '11', '69054', '62750', '7'), +('1', '65', '11', '27818', '50032', '7'), +('1', '65', '11', '68662', '48812', '7'), +('1', '65', '11', '27986', '44510', '7'), +('1', '65', '22', '21805', '0', '6'), +('1', '65', '22', '61948', '0', '6'), +('1', '65', '22', '66397', '0', '6'), +('1', '65', '22', '21807', '0', '6'), +('1', '65', '1', '7125', '40992', '6'), +('1', '65', '1', '32106', '38244', '6'), +('1', '65', '1', '7123', '25480', '6'), +('1', '65', '1', '7945', '23487', '6'), +('1', '65', '2', '28647', '41731', '6'), +('1', '65', '2', '28605', '40593', '6'), +('1', '65', '2', '28648', '40439', '6'), +('1', '65', '2', '2612', '23589', '6'), +('1', '65', '3', '26982', '23902', '6'), +('1', '65', '3', '9435', '20929', '6'), +('1', '65', '3', '26983', '20372', '6'), +('1', '65', '3', '29174', '20143', '6'), +('1', '65', '5', '28885', '29884', '6'), +('1', '65', '5', '7769', '27604', '6'), +('1', '65', '5', '8785', '26486', '6'), +('1', '65', '5', '27266', '25642', '6'), +('1', '65', '8', '26765', '32512', '6'), +('1', '65', '8', '26766', '32186', '6'), +('1', '65', '8', '31471', '31281', '6'), +('1', '65', '8', '15803', '30310', '6'), +('1', '65', '6', '13674', '43996', '6'), +('1', '65', '6', '19144', '35458', '6'), +('1', '65', '6', '28902', '32673', '6'), +('1', '65', '6', '28659', '22789', '6'), +('1', '65', '17', '28937', '34368', '6'), +('1', '65', '17', '29457', '31574', '6'), +('1', '65', '17', '47642', '28871', '6'), +('1', '65', '17', '27261', '20022', '6'), +('1', '65', '7', '16097', '36584', '6'), +('1', '65', '7', '21995', '20472', '6'), +('1', '65', '7', '11429', '19888', '6'), +('1', '65', '7', '28926', '14886', '6'), +('1', '65', '9', '16097', '36584', '6'), +('1', '65', '9', '11103', '36056', '6'), +('1', '65', '9', '31461', '31512', '6'), +('1', '65', '9', '32100', '23965', '6'), +('1', '65', '15', '68111', '35465', '6'), +('1', '65', '15', '9959', '35348', '6'), +('1', '65', '15', '26989', '24014', '6'), +('1', '65', '15', '10948', '21788', '6'), +('1', '65', '20', '16156', '48972', '6'), +('1', '65', '20', '16097', '36584', '6'), +('1', '65', '20', '15873', '34382', '6'), +('1', '65', '20', '31235', '30803', '6'), +('1', '65', '12', '25857', '29507', '6'), +('1', '65', '12', '28246', '23878', '6'), +('1', '65', '12', '27000', '22458', '6'), +('1', '65', '12', '12595', '19031', '6'), +('1', '65', '18', '28650', '25049', '6'), +('1', '65', '18', '16693', '21419', '6'), +('1', '65', '18', '28965', '14521', '6'), +('1', '65', '18', '68143', '12742', '6'), +('1', '65', '19', '19094', '35411', '6'), +('1', '65', '19', '30569', '32349', '6'), +('1', '65', '19', '28888', '27952', '6'), +('1', '65', '19', '24616', '23667', '6'), +('1', '65', '13', '22998', '89023', '6'), +('1', '65', '13', '22999', '84465', '6'), +('1', '65', '13', '22986', '74168', '6'), +('1', '65', '13', '22894', '74027', '6'), +('1', '65', '14', '22998', '89023', '6'), +('1', '65', '14', '22986', '74168', '6'), +('1', '65', '14', '22894', '74027', '6'), +('1', '65', '14', '26220', '68446', '6'), +('1', '65', '11', '27818', '50032', '6'), +('1', '65', '11', '27986', '44510', '6'), +('1', '65', '11', '29596', '44177', '6'), +('1', '65', '11', '30539', '43745', '6'), +('1', '65', '22', '61948', '0', '5'), +('1', '65', '22', '66397', '0', '5'), +('1', '65', '22', '62787', '0', '5'), +('1', '65', '22', '21805', '0', '5'), +('1', '65', '1', '7125', '40992', '5'), +('1', '65', '1', '32106', '38244', '5'), +('1', '65', '1', '7123', '25480', '5'), +('1', '65', '1', '7945', '23487', '5'), +('1', '65', '2', '28647', '41731', '5'), +('1', '65', '2', '28605', '40593', '5'), +('1', '65', '2', '28648', '40439', '5'), +('1', '65', '2', '2612', '23589', '5'), +('1', '65', '3', '26982', '23902', '5'), +('1', '65', '3', '9435', '20929', '5'), +('1', '65', '3', '26983', '20372', '5'), +('1', '65', '3', '29174', '20143', '5'), +('1', '65', '5', '28885', '29884', '5'), +('1', '65', '5', '7769', '27604', '5'), +('1', '65', '5', '8785', '26486', '5'), +('1', '65', '5', '27266', '25642', '5'), +('1', '65', '8', '26765', '32512', '5'), +('1', '65', '8', '26766', '32186', '5'), +('1', '65', '8', '31471', '31281', '5'), +('1', '65', '8', '15803', '30310', '5'), +('1', '65', '6', '13674', '43996', '5'), +('1', '65', '6', '19144', '35458', '5'), +('1', '65', '6', '28902', '32673', '5'), +('1', '65', '6', '28659', '22789', '5'), +('1', '65', '17', '28937', '34368', '5'), +('1', '65', '17', '29457', '31574', '5'), +('1', '65', '17', '47642', '28871', '5'), +('1', '65', '17', '27261', '20022', '5'), +('1', '65', '7', '16097', '36584', '5'), +('1', '65', '7', '21995', '20472', '5'), +('1', '65', '7', '11429', '19888', '5'), +('1', '65', '7', '28926', '14886', '5'), +('1', '65', '9', '16097', '36584', '5'), +('1', '65', '9', '11103', '36056', '5'), +('1', '65', '9', '31461', '31512', '5'), +('1', '65', '9', '32100', '23965', '5'), +('1', '65', '15', '9959', '35348', '5'), +('1', '65', '15', '26989', '24014', '5'), +('1', '65', '15', '10948', '21788', '5'), +('1', '65', '15', '27950', '21625', '5'), +('1', '65', '20', '16156', '48972', '5'), +('1', '65', '20', '16097', '36584', '5'), +('1', '65', '20', '15873', '34382', '5'), +('1', '65', '20', '31235', '30803', '5'), +('1', '65', '12', '25857', '29507', '5'), +('1', '65', '12', '28246', '23878', '5'), +('1', '65', '12', '27000', '22458', '5'), +('1', '65', '12', '12595', '19031', '5'), +('1', '65', '18', '28650', '25049', '5'), +('1', '65', '18', '16693', '21419', '5'), +('1', '65', '18', '28965', '14521', '5'), +('1', '65', '18', '26755', '11646', '5'), +('1', '65', '19', '19094', '35411', '5'), +('1', '65', '19', '30569', '32349', '5'), +('1', '65', '19', '28888', '27952', '5'), +('1', '65', '19', '24616', '23667', '5'), +('1', '65', '13', '22998', '89023', '5'), +('1', '65', '13', '22999', '84465', '5'), +('1', '65', '13', '22986', '74168', '5'), +('1', '65', '13', '22894', '74027', '5'), +('1', '65', '14', '22998', '89023', '5'), +('1', '65', '14', '22986', '74168', '5'), +('1', '65', '14', '22894', '74027', '5'), +('1', '65', '14', '26220', '68446', '5'), +('1', '65', '11', '27818', '50032', '5'), +('1', '65', '11', '27986', '44510', '5'), +('1', '65', '11', '29596', '44177', '5'), +('1', '65', '11', '30539', '43745', '5'), +('1', '65', '22', '61948', '0', '4'), +('1', '65', '22', '66397', '0', '4'), +('1', '65', '22', '62787', '0', '4'), +('1', '65', '22', '21805', '0', '4'), +('1', '65', '1', '7125', '40992', '4'), +('1', '65', '1', '32106', '38244', '4'), +('1', '65', '1', '7123', '25480', '4'), +('1', '65', '1', '7945', '23487', '4'), +('1', '65', '2', '28647', '41731', '4'), +('1', '65', '2', '28605', '40593', '4'), +('1', '65', '2', '28648', '40439', '4'), +('1', '65', '2', '26025', '23589', '4'), +('1', '65', '3', '26982', '23902', '4'), +('1', '65', '3', '9435', '20929', '4'), +('1', '65', '3', '26983', '20372', '4'), +('1', '65', '3', '29174', '20143', '4'), +('1', '65', '5', '28885', '29884', '4'), +('1', '65', '5', '7769', '27604', '4'), +('1', '65', '5', '8785', '26486', '4'), +('1', '65', '5', '27266', '25642', '4'), +('1', '65', '8', '26765', '32512', '4'), +('1', '65', '8', '26766', '32186', '4'), +('1', '65', '8', '31471', '31281', '4'), +('1', '65', '8', '15803', '30310', '4'), +('1', '65', '6', '13674', '43996', '4'), +('1', '65', '6', '19144', '35458', '4'), +('1', '65', '6', '28902', '32673', '4'), +('1', '65', '6', '28659', '22789', '4'), +('1', '65', '17', '28937', '34368', '4'), +('1', '65', '17', '29457', '31574', '4'), +('1', '65', '17', '47642', '28871', '4'), +('1', '65', '17', '27261', '20022', '4'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '65', '7', '16097', '36584', '4'), +('1', '65', '7', '21995', '20472', '4'), +('1', '65', '7', '11429', '19888', '4'), +('1', '65', '7', '28926', '14886', '4'), +('1', '65', '9', '16097', '36584', '4'), +('1', '65', '9', '11103', '36056', '4'), +('1', '65', '9', '31461', '31512', '4'), +('1', '65', '9', '32100', '23965', '4'), +('1', '65', '15', '9959', '35348', '4'), +('1', '65', '15', '26989', '24014', '4'), +('1', '65', '15', '10948', '21788', '4'), +('1', '65', '15', '27950', '21625', '4'), +('1', '65', '20', '16156', '48972', '4'), +('1', '65', '20', '16097', '36584', '4'), +('1', '65', '20', '15873', '34382', '4'), +('1', '65', '20', '31235', '30803', '4'), +('1', '65', '12', '25857', '29507', '4'), +('1', '65', '12', '28246', '23878', '4'), +('1', '65', '12', '27000', '22458', '4'), +('1', '65', '12', '12595', '19031', '4'), +('1', '65', '18', '28650', '25049', '4'), +('1', '65', '18', '16693', '21419', '4'), +('1', '65', '18', '28965', '14521', '4'), +('1', '65', '18', '26755', '11646', '4'), +('1', '65', '19', '19094', '35411', '4'), +('1', '65', '19', '30569', '32349', '4'), +('1', '65', '19', '28888', '27952', '4'), +('1', '65', '19', '24616', '23667', '4'), +('1', '65', '13', '22998', '89023', '4'), +('1', '65', '13', '22999', '84465', '4'), +('1', '65', '13', '22986', '74168', '4'), +('1', '65', '13', '22894', '74027', '4'), +('1', '65', '14', '22998', '89023', '4'), +('1', '65', '14', '22986', '74168', '4'), +('1', '65', '14', '22894', '74027', '4'), +('1', '65', '14', '26220', '68446', '4'), +('1', '65', '11', '27818', '50032', '4'), +('1', '65', '11', '27986', '44510', '4'), +('1', '65', '11', '29596', '44177', '4'), +('1', '65', '11', '30539', '43745', '4'), +('1', '66', '22', '21805', '0', '7'), +('1', '66', '22', '61948', '0', '7'), +('1', '66', '22', '66397', '0', '7'), +('1', '66', '22', '21807', '0', '7'), +('1', '66', '1', '68949', '48553', '7'), +('1', '66', '1', '7125', '40993', '7'), +('1', '66', '1', '32106', '38247', '7'), +('1', '66', '1', '69166', '33224', '7'), +('1', '66', '2', '28647', '41733', '7'), +('1', '66', '2', '28605', '40594', '7'), +('1', '66', '2', '28648', '40439', '7'), +('1', '66', '2', '69087', '28515', '7'), +('1', '66', '3', '69157', '30956', '7'), +('1', '66', '3', '69069', '28708', '7'), +('1', '66', '3', '69074', '27519', '7'), +('1', '66', '3', '69068', '27156', '7'), +('1', '66', '5', '67625', '33500', '7'), +('1', '66', '5', '69135', '31815', '7'), +('1', '66', '5', '28885', '29885', '7'), +('1', '66', '5', '68808', '29115', '7'), +('1', '66', '8', '69165', '55772', '7'), +('1', '66', '8', '69064', '52513', '7'), +('1', '66', '8', '69072', '50900', '7'), +('1', '66', '8', '26765', '32513', '7'), +('1', '66', '6', '68757', '47835', '7'), +('1', '66', '6', '13674', '43998', '7'), +('1', '66', '6', '19144', '35460', '7'), +('1', '66', '6', '28902', '32675', '7'), +('1', '66', '17', '69150', '36627', '7'), +('1', '66', '17', '28937', '34369', '7'), +('1', '66', '17', '68960', '33637', '7'), +('1', '66', '17', '29457', '31574', '7'), +('1', '66', '7', '16097', '36587', '7'), +('1', '66', '7', '69168', '30324', '7'), +('1', '66', '7', '69079', '28244', '7'), +('1', '66', '7', '68851', '27282', '7'), +('1', '66', '9', '68766', '40612', '7'), +('1', '66', '9', '16097', '36587', '7'), +('1', '66', '9', '11103', '36057', '7'), +('1', '66', '9', '69126', '32967', '7'), +('1', '66', '15', '68111', '35465', '7'), +('1', '66', '15', '9959', '35350', '7'), +('1', '66', '15', '69160', '31531', '7'), +('1', '66', '15', '69131', '30865', '7'), +('1', '66', '20', '16156', '48974', '7'), +('1', '66', '20', '16097', '36587', '7'), +('1', '66', '20', '69134', '34887', '7'), +('1', '66', '20', '15873', '34384', '7'), +('1', '66', '12', '69252', '32111', '7'), +('1', '66', '12', '25857', '29507', '7'), +('1', '66', '12', '69083', '27890', '7'), +('1', '66', '12', '68852', '25114', '7'), +('1', '66', '18', '69146', '34304', '7'), +('1', '66', '18', '68961', '29099', '7'), +('1', '66', '18', '68779', '26782', '7'), +('1', '66', '18', '28650', '25051', '7'), +('1', '66', '19', '19094', '35413', '7'), +('1', '66', '19', '30569', '32350', '7'), +('1', '66', '19', '69177', '31500', '7'), +('1', '66', '19', '69075', '28916', '7'), +('1', '66', '13', '69052', '114402', '7'), +('1', '66', '13', '69110', '99696', '7'), +('1', '66', '13', '69040', '93034', '7'), +('1', '66', '13', '69156', '92152', '7'), +('1', '66', '14', '69052', '114402', '7'), +('1', '66', '14', '69040', '93034', '7'), +('1', '66', '14', '69156', '92152', '7'), +('1', '66', '14', '22998', '89562', '7'), +('1', '66', '11', '69054', '62950', '7'), +('1', '66', '11', '27818', '50092', '7'), +('1', '66', '11', '68662', '48871', '7'), +('1', '66', '11', '27986', '44569', '7'), +('1', '67', '22', '21805', '0', '7'), +('1', '67', '22', '61948', '0', '7'), +('1', '67', '22', '66397', '0', '7'), +('1', '67', '22', '21807', '0', '7'), +('1', '67', '1', '68949', '48556', '7'), +('1', '67', '1', '7125', '40995', '7'), +('1', '67', '1', '32106', '38249', '7'), +('1', '67', '1', '69166', '33226', '7'), +('1', '67', '2', '28647', '41736', '7'), +('1', '67', '2', '28605', '40595', '7'), +('1', '67', '2', '28648', '40439', '7'), +('1', '67', '2', '69087', '28519', '7'), +('1', '67', '3', '69157', '30958', '7'), +('1', '67', '3', '69069', '28712', '7'), +('1', '67', '3', '69074', '27521', '7'), +('1', '67', '3', '69068', '27158', '7'), +('1', '67', '5', '67625', '33502', '7'), +('1', '67', '5', '69135', '31819', '7'), +('1', '67', '5', '28885', '29886', '7'), +('1', '67', '5', '68808', '29117', '7'), +('1', '67', '8', '69165', '55775', '7'), +('1', '67', '8', '69064', '52515', '7'), +('1', '67', '8', '69072', '50902', '7'), +('1', '67', '8', '26765', '32513', '7'), +('1', '67', '6', '68757', '47838', '7'), +('1', '67', '6', '13674', '44001', '7'), +('1', '67', '6', '19144', '35463', '7'), +('1', '67', '6', '28902', '32677', '7'), +('1', '67', '17', '69150', '36630', '7'), +('1', '67', '17', '28937', '34370', '7'), +('1', '67', '17', '68960', '33640', '7'), +('1', '67', '17', '29457', '31574', '7'), +('1', '67', '7', '16097', '36590', '7'), +('1', '67', '7', '69168', '30326', '7'), +('1', '67', '7', '69079', '28246', '7'), +('1', '67', '7', '68851', '27286', '7'), +('1', '67', '9', '68766', '40614', '7'), +('1', '67', '9', '16097', '36590', '7'), +('1', '67', '9', '11103', '36058', '7'), +('1', '67', '9', '69126', '32970', '7'), +('1', '67', '15', '68111', '35465', '7'), +('1', '67', '15', '9959', '35352', '7'), +('1', '67', '15', '69160', '31533', '7'), +('1', '67', '15', '69131', '30865', '7'), +('1', '67', '20', '16156', '48977', '7'), +('1', '67', '20', '16097', '36590', '7'), +('1', '67', '20', '69134', '34889', '7'), +('1', '67', '20', '15873', '34386', '7'), +('1', '67', '12', '69252', '32113', '7'), +('1', '67', '12', '25857', '29507', '7'), +('1', '67', '12', '69083', '27890', '7'), +('1', '67', '12', '68852', '25116', '7'), +('1', '67', '18', '69146', '34304', '7'), +('1', '67', '18', '68961', '29101', '7'), +('1', '67', '18', '68779', '26785', '7'), +('1', '67', '18', '28650', '25054', '7'), +('1', '67', '19', '19094', '35414', '7'), +('1', '67', '19', '30569', '32352', '7'), +('1', '67', '19', '69177', '31503', '7'), +('1', '67', '19', '69075', '28920', '7'), +('1', '67', '13', '69052', '115049', '7'), +('1', '67', '13', '69110', '99880', '7'), +('1', '67', '13', '69040', '93292', '7'), +('1', '67', '13', '69156', '92268', '7'), +('1', '67', '14', '69052', '115049', '7'), +('1', '67', '14', '69040', '93292', '7'), +('1', '67', '14', '69156', '92268', '7'), +('1', '67', '14', '22998', '90073', '7'), +('1', '67', '11', '69054', '63141', '7'), +('1', '67', '11', '27818', '50152', '7'), +('1', '67', '11', '68662', '48929', '7'), +('1', '67', '11', '27986', '44627', '7'), +('1', '68', '22', '21805', '0', '7'), +('1', '68', '22', '61948', '0', '7'), +('1', '68', '22', '66397', '0', '7'), +('1', '68', '22', '21807', '0', '7'), +('1', '68', '1', '68949', '48559', '7'), +('1', '68', '1', '7125', '40996', '7'), +('1', '68', '1', '32106', '38252', '7'), +('1', '68', '1', '69166', '33229', '7'), +('1', '68', '2', '28647', '41739', '7'), +('1', '68', '2', '28605', '40596', '7'), +('1', '68', '2', '28648', '40439', '7'), +('1', '68', '2', '69087', '28523', '7'), +('1', '68', '3', '69157', '30961', '7'), +('1', '68', '3', '69069', '28716', '7'), +('1', '68', '3', '69074', '27524', '7'), +('1', '68', '3', '69068', '27161', '7'), +('1', '68', '5', '67625', '33504', '7'), +('1', '68', '5', '69135', '31823', '7'), +('1', '68', '5', '28885', '29887', '7'), +('1', '68', '5', '68808', '29119', '7'), +('1', '68', '8', '69165', '55779', '7'), +('1', '68', '8', '69064', '52517', '7'), +('1', '68', '8', '69072', '50905', '7'), +('1', '68', '8', '26765', '32514', '7'), +('1', '68', '6', '68757', '47840', '7'), +('1', '68', '6', '13674', '44004', '7'), +('1', '68', '6', '19144', '35465', '7'), +('1', '68', '6', '28902', '32679', '7'), +('1', '68', '17', '69150', '36633', '7'), +('1', '68', '17', '28937', '34371', '7'), +('1', '68', '17', '68960', '33643', '7'), +('1', '68', '17', '29457', '31574', '7'), +('1', '68', '7', '16097', '36593', '7'), +('1', '68', '7', '69168', '30329', '7'), +('1', '68', '7', '69079', '28248', '7'), +('1', '68', '7', '68851', '27289', '7'), +('1', '68', '9', '68766', '40617', '7'), +('1', '68', '9', '16097', '36593', '7'), +('1', '68', '9', '11103', '36059', '7'), +('1', '68', '9', '69126', '32974', '7'), +('1', '68', '15', '68111', '35465', '7'), +('1', '68', '15', '9959', '35354', '7'), +('1', '68', '15', '69160', '31536', '7'), +('1', '68', '15', '69131', '30865', '7'), +('1', '68', '20', '16156', '48979', '7'), +('1', '68', '20', '16097', '36593', '7'), +('1', '68', '20', '69134', '34892', '7'), +('1', '68', '20', '15873', '34388', '7'), +('1', '68', '12', '69252', '32116', '7'), +('1', '68', '12', '25857', '29507', '7'), +('1', '68', '12', '69083', '27890', '7'), +('1', '68', '12', '68852', '25119', '7'), +('1', '68', '18', '69146', '34304', '7'), +('1', '68', '18', '68961', '29103', '7'), +('1', '68', '18', '68779', '26789', '7'), +('1', '68', '18', '28650', '25056', '7'), +('1', '68', '19', '19094', '35416', '7'), +('1', '68', '19', '30569', '32353', '7'), +('1', '68', '19', '69177', '31505', '7'), +('1', '68', '19', '69075', '28924', '7'), +('1', '68', '13', '69052', '115668', '7'), +('1', '68', '13', '69110', '100092', '7'), +('1', '68', '13', '69040', '93551', '7'), +('1', '68', '13', '69156', '92384', '7'), +('1', '68', '14', '69052', '115668', '7'), +('1', '68', '14', '69040', '93551', '7'), +('1', '68', '14', '69156', '92384', '7'), +('1', '68', '14', '22998', '90584', '7'), +('1', '68', '11', '69054', '63341', '7'), +('1', '68', '11', '27818', '50202', '7'), +('1', '68', '11', '68662', '48979', '7'), +('1', '68', '11', '27986', '44686', '7'), +('1', '69', '22', '21805', '0', '7'), +('1', '69', '22', '61948', '0', '7'), +('1', '69', '22', '66397', '0', '7'), +('1', '69', '22', '21807', '0', '7'), +('1', '69', '1', '68949', '48562', '7'), +('1', '69', '1', '7125', '40997', '7'), +('1', '69', '1', '32106', '38254', '7'), +('1', '69', '1', '69166', '33231', '7'), +('1', '69', '2', '28647', '41741', '7'), +('1', '69', '2', '28605', '40598', '7'), +('1', '69', '2', '28648', '40439', '7'), +('1', '69', '2', '69087', '28527', '7'), +('1', '69', '3', '69157', '30963', '7'), +('1', '69', '3', '69069', '28719', '7'), +('1', '69', '3', '69074', '27526', '7'), +('1', '69', '3', '69068', '27163', '7'), +('1', '69', '5', '67625', '33506', '7'), +('1', '69', '5', '69135', '31827', '7'), +('1', '69', '5', '28885', '29888', '7'), +('1', '69', '5', '68808', '29121', '7'), +('1', '69', '8', '69165', '55782', '7'), +('1', '69', '8', '69064', '52519', '7'), +('1', '69', '8', '69072', '50907', '7'), +('1', '69', '8', '26765', '32515', '7'), +('1', '69', '6', '68757', '47843', '7'), +('1', '69', '6', '13674', '44006', '7'), +('1', '69', '6', '19144', '35468', '7'), +('1', '69', '6', '28902', '32680', '7'), +('1', '69', '17', '69150', '36635', '7'), +('1', '69', '17', '28937', '34373', '7'), +('1', '69', '17', '68960', '33646', '7'), +('1', '69', '17', '29457', '31574', '7'), +('1', '69', '7', '16097', '36596', '7'), +('1', '69', '7', '69168', '30331', '7'), +('1', '69', '7', '69079', '28249', '7'), +('1', '69', '7', '68851', '27293', '7'), +('1', '69', '9', '68766', '40619', '7'), +('1', '69', '9', '16097', '36596', '7'), +('1', '69', '9', '11103', '36061', '7'), +('1', '69', '9', '69126', '32977', '7'), +('1', '69', '15', '68111', '35465', '7'), +('1', '69', '15', '9959', '35355', '7'), +('1', '69', '15', '69160', '31538', '7'), +('1', '69', '15', '69131', '30865', '7'), +('1', '69', '20', '16156', '48982', '7'), +('1', '69', '20', '16097', '36596', '7'), +('1', '69', '20', '69134', '34894', '7'), +('1', '69', '20', '15873', '34390', '7'), +('1', '69', '12', '69252', '32118', '7'), +('1', '69', '12', '25857', '29507', '7'), +('1', '69', '12', '69083', '27890', '7'), +('1', '69', '12', '68852', '25122', '7'), +('1', '69', '18', '69146', '34304', '7'), +('1', '69', '18', '68961', '29105', '7'), +('1', '69', '18', '68779', '26792', '7'), +('1', '69', '18', '28650', '25059', '7'), +('1', '69', '19', '19094', '35417', '7'), +('1', '69', '19', '30569', '32354', '7'), +('1', '69', '19', '69177', '31508', '7'), +('1', '69', '19', '69075', '28928', '7'), +('1', '69', '13', '69052', '116286', '7'), +('1', '69', '13', '69110', '100277', '7'), +('1', '69', '13', '69040', '93780', '7'), +('1', '69', '13', '69156', '92500', '7'), +('1', '69', '14', '69052', '116286', '7'), +('1', '69', '14', '69040', '93780', '7'), +('1', '69', '14', '69156', '92500', '7'), +('1', '69', '14', '22998', '91123', '7'), +('1', '69', '11', '69054', '63542', '7'), +('1', '69', '11', '27818', '50262', '7'), +('1', '69', '11', '68662', '49037', '7'), +('1', '69', '11', '96532', '44804', '7'), +('1', '70', '22', '21807', '0', '11'), +('1', '70', '22', '21805', '0', '11'), +('1', '70', '22', '61948', '0', '11'), +('1', '70', '22', '12425', '0', '11'), +('1', '70', '1', '39276', '62345', '11'), +('1', '70', '1', '83594', '60705', '11'), +('1', '70', '1', '71624', '52791', '11'), +('1', '70', '1', '68949', '48565', '11'), +('1', '70', '2', '70853', '59683', '11'), +('1', '70', '2', '28647', '41744', '11'), +('1', '70', '2', '28605', '40599', '11'), +('1', '70', '2', '28648', '40439', '11'), +('1', '70', '3', '39218', '57186', '11'), +('1', '70', '3', '47245', '53725', '11'), +('1', '70', '3', '39347', '45029', '11'), +('1', '70', '3', '39361', '43588', '11'), +('1', '70', '5', '39349', '65043', '11'), +('1', '70', '5', '39359', '44401', '11'), +('1', '70', '5', '39262', '40229', '11'), +('1', '70', '5', '39313', '39873', '11'), +('1', '70', '8', '39330', '60957', '11'), +('1', '70', '8', '69165', '55785', '11'), +('1', '70', '8', '69064', '52521', '11'), +('1', '70', '8', '69072', '50910', '11'), +('1', '70', '6', '39337', '65556', '11'), +('1', '70', '6', '70717', '54726', '11'), +('1', '70', '6', '39367', '47918', '11'), +('1', '70', '6', '68757', '47845', '11'), +('1', '70', '17', '83603', '67934', '11'), +('1', '70', '17', '70858', '52265', '11'), +('1', '70', '17', '69150', '36638', '11'), +('1', '70', '17', '70701', '34477', '11'), +('1', '70', '7', '83564', '39616', '11'), +('1', '70', '7', '39267', '39430', '11'), +('1', '70', '7', '70854', '36700', '11'), +('1', '70', '7', '16097', '36599', '11'), +('1', '70', '9', '39335', '44801', '11'), +('1', '70', '9', '51706', '41811', '11'), +('1', '70', '9', '83652', '41666', '11'), +('1', '70', '9', '68766', '40622', '11'), +('1', '70', '15', '39373', '48284', '11'), +('1', '70', '15', '83458', '48267', '11'), +('1', '70', '15', '71117', '48190', '11'), +('1', '70', '15', '70621', '47538', '11'), +('1', '70', '20', '47283', '56931', '11'), +('1', '70', '20', '83533', '52044', '11'), +('1', '70', '20', '16156', '48984', '11'), +('1', '70', '20', '39365', '48525', '11'), +('1', '70', '12', '47212', '51555', '11'), +('1', '70', '12', '71075', '46698', '11'), +('1', '70', '12', '83568', '37269', '11'), +('1', '70', '12', '70856', '35716', '11'), +('1', '70', '18', '83607', '44053', '11'), +('1', '70', '18', '70859', '40996', '11'), +('1', '70', '18', '47200', '34357', '11'), +('1', '70', '18', '69146', '34304', '11'), +('1', '70', '19', '39355', '43669', '11'), +('1', '70', '19', '83572', '39790', '11'), +('1', '70', '19', '69439', '37575', '11'), +('1', '70', '19', '70857', '36409', '11'), +('1', '70', '13', '83639', '150702', '11'), +('1', '70', '13', '47314', '126374', '11'), +('1', '70', '13', '39323', '126291', '11'), +('1', '70', '13', '83576', '124013', '11'), +('1', '70', '14', '83639', '150702', '11'), +('1', '70', '14', '47314', '126374', '11'), +('1', '70', '14', '39323', '126291', '11'), +('1', '70', '14', '83576', '124013', '11'), +('1', '70', '11', '83582', '75632', '11'), +('1', '70', '11', '39331', '72784', '11'), +('1', '70', '11', '47325', '68394', '11'), +('1', '70', '11', '83539', '67470', '11'), +('1', '70', '22', '21805', '0', '10'), +('1', '70', '22', '61948', '0', '10'), +('1', '70', '22', '66397', '0', '10'), +('1', '70', '22', '21807', '0', '10'), +('1', '70', '1', '83594', '60705', '10'), +('1', '70', '1', '71624', '52791', '10'), +('1', '70', '1', '68949', '48565', '10'), +('1', '70', '1', '7125', '40998', '10'), +('1', '70', '2', '70853', '59683', '10'), +('1', '70', '2', '28647', '41744', '10'), +('1', '70', '2', '28605', '40599', '10'), +('1', '70', '2', '28648', '40439', '10'), +('1', '70', '3', '47245', '53725', '10'), +('1', '70', '3', '83658', '42537', '10'), +('1', '70', '3', '83636', '39716', '10'), +('1', '70', '3', '89512', '37990', '10'), +('1', '70', '5', '83599', '38865', '10'), +('1', '70', '5', '83651', '38773', '10'), +('1', '70', '5', '47275', '36651', '10'), +('1', '70', '5', '89308', '36616', '10'), +('1', '70', '8', '69165', '55785', '10'), +('1', '70', '8', '69064', '52521', '10'), +('1', '70', '8', '69072', '50910', '10'), +('1', '70', '8', '70662', '46634', '10'), +('1', '70', '6', '70717', '54726', '10'), +('1', '70', '6', '68757', '47845', '10'), +('1', '70', '6', '13674', '44009', '10'), +('1', '70', '6', '83660', '41484', '10'), +('1', '70', '17', '83603', '67934', '10'), +('1', '70', '17', '70858', '52265', '10'), +('1', '70', '17', '69150', '36638', '10'), +('1', '70', '17', '70701', '34477', '10'), +('1', '70', '7', '83564', '39616', '10'), +('1', '70', '7', '70854', '36700', '10'), +('1', '70', '7', '16097', '36599', '10'), +('1', '70', '7', '47204', '32883', '10'), +('1', '70', '9', '83652', '41666', '10'), +('1', '70', '9', '68766', '40622', '10'), +('1', '70', '9', '16097', '36599', '10'), +('1', '70', '9', '70855', '36075', '10'), +('1', '70', '15', '83458', '48267', '10'), +('1', '70', '15', '71117', '48190', '10'), +('1', '70', '15', '70621', '47538', '10'), +('1', '70', '15', '83661', '41608', '10'), +('1', '70', '20', '47283', '56931', '10'), +('1', '70', '20', '83533', '52044', '10'), +('1', '70', '20', '16156', '48984', '10'), +('1', '70', '20', '70604', '45655', '10'), +('1', '70', '12', '47212', '51555', '10'), +('1', '70', '12', '71075', '46698', '10'), +('1', '70', '12', '83568', '37269', '10'), +('1', '70', '12', '70856', '35716', '10'), +('1', '70', '18', '83607', '44053', '10'), +('1', '70', '18', '70859', '40996', '10'), +('1', '70', '18', '47200', '34357', '10'), +('1', '70', '18', '69146', '34304', '10'), +('1', '70', '19', '83572', '39790', '10'), +('1', '70', '19', '69439', '37575', '10'), +('1', '70', '19', '70857', '36409', '10'), +('1', '70', '19', '19094', '35419', '10'), +('1', '70', '13', '83639', '150702', '10'), +('1', '70', '13', '47314', '126374', '10'), +('1', '70', '13', '83576', '124013', '10'), +('1', '70', '13', '69052', '120624', '10'), +('1', '70', '14', '83639', '150702', '10'), +('1', '70', '14', '47314', '126374', '10'), +('1', '70', '14', '83576', '124013', '10'), +('1', '70', '14', '69052', '120624', '10'), +('1', '70', '11', '83582', '75632', '10'), +('1', '70', '11', '47325', '68394', '10'), +('1', '70', '11', '83539', '67470', '10'), +('1', '70', '11', '69054', '64734', '10'), +('1', '70', '22', '21805', '0', '9'), +('1', '70', '22', '61948', '0', '9'), +('1', '70', '22', '66397', '0', '9'), +('1', '70', '22', '21807', '0', '9'), +('1', '70', '1', '71624', '52791', '9'), +('1', '70', '1', '68949', '48565', '9'), +('1', '70', '1', '7125', '40998', '9'), +('1', '70', '1', '32106', '38257', '9'), +('1', '70', '2', '70853', '59683', '9'), +('1', '70', '2', '28647', '41744', '9'), +('1', '70', '2', '28605', '40599', '9'), +('1', '70', '2', '28648', '40439', '9'), +('1', '70', '3', '47245', '53725', '9'), +('1', '70', '3', '71667', '37089', '9'), +('1', '70', '3', '47299', '35224', '9'), +('1', '70', '3', '47300', '34736', '9'), +('1', '70', '5', '47275', '36651', '9'), +('1', '70', '5', '47273', '35816', '9'), +('1', '70', '5', '47274', '34369', '9'), +('1', '70', '5', '67625', '33508', '9'), +('1', '70', '8', '69165', '55785', '9'), +('1', '70', '8', '69064', '52521', '9'), +('1', '70', '8', '69072', '50910', '9'), +('1', '70', '8', '70662', '46634', '9'), +('1', '70', '6', '70717', '54726', '9'), +('1', '70', '6', '68757', '47845', '9'), +('1', '70', '6', '13674', '44009', '9'), +('1', '70', '6', '70971', '38269', '9'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '70', '17', '70858', '52265', '9'), +('1', '70', '17', '69150', '36638', '9'), +('1', '70', '17', '70701', '34477', '9'), +('1', '70', '17', '28937', '34374', '9'), +('1', '70', '7', '70854', '36700', '9'), +('1', '70', '7', '16097', '36599', '9'), +('1', '70', '7', '47204', '32883', '9'), +('1', '70', '7', '69168', '30334', '9'), +('1', '70', '9', '68766', '40622', '9'), +('1', '70', '9', '16097', '36599', '9'), +('1', '70', '9', '70855', '36075', '9'), +('1', '70', '9', '11103', '36062', '9'), +('1', '70', '15', '71117', '48190', '9'), +('1', '70', '15', '70621', '47538', '9'), +('1', '70', '15', '71608', '37305', '9'), +('1', '70', '15', '68111', '35465', '9'), +('1', '70', '20', '47283', '56931', '9'), +('1', '70', '20', '16156', '48984', '9'), +('1', '70', '20', '70604', '45655', '9'), +('1', '70', '20', '16097', '36599', '9'), +('1', '70', '12', '47212', '51555', '9'), +('1', '70', '12', '71075', '46698', '9'), +('1', '70', '12', '70856', '35716', '9'), +('1', '70', '12', '69252', '32121', '9'), +('1', '70', '18', '70859', '40996', '9'), +('1', '70', '18', '47200', '34357', '9'), +('1', '70', '18', '69146', '34304', '9'), +('1', '70', '18', '71646', '31750', '9'), +('1', '70', '19', '69439', '37575', '9'), +('1', '70', '19', '70857', '36409', '9'), +('1', '70', '19', '19094', '35419', '9'), +('1', '70', '19', '30569', '32355', '9'), +('1', '70', '13', '47314', '126374', '9'), +('1', '70', '13', '69052', '120624', '9'), +('1', '70', '13', '60332', '118743', '9'), +('1', '70', '13', '47312', '116832', '9'), +('1', '70', '14', '47314', '126374', '9'), +('1', '70', '14', '69052', '120624', '9'), +('1', '70', '14', '60332', '118743', '9'), +('1', '70', '14', '47312', '116832', '9'), +('1', '70', '11', '47325', '68394', '9'), +('1', '70', '11', '69054', '64734', '9'), +('1', '70', '11', '47265', '61270', '9'), +('1', '70', '11', '70628', '56466', '9'), +('1', '70', '22', '21805', '0', '8'), +('1', '70', '22', '61948', '0', '8'), +('1', '70', '22', '66397', '0', '8'), +('1', '70', '22', '21807', '0', '8'), +('1', '70', '1', '68949', '48565', '8'), +('1', '70', '1', '7125', '40998', '8'), +('1', '70', '1', '32106', '38257', '8'), +('1', '70', '1', '47287', '36607', '8'), +('1', '70', '2', '70853', '59683', '8'), +('1', '70', '2', '28647', '41744', '8'), +('1', '70', '2', '28605', '40599', '8'), +('1', '70', '2', '28648', '40439', '8'), +('1', '70', '3', '47245', '53725', '8'), +('1', '70', '3', '47299', '35224', '8'), +('1', '70', '3', '47300', '34736', '8'), +('1', '70', '3', '47301', '33342', '8'), +('1', '70', '5', '47275', '36651', '8'), +('1', '70', '5', '47273', '35816', '8'), +('1', '70', '5', '47274', '34369', '8'), +('1', '70', '5', '67625', '33508', '8'), +('1', '70', '8', '69165', '55785', '8'), +('1', '70', '8', '69064', '52521', '8'), +('1', '70', '8', '69072', '50910', '8'), +('1', '70', '8', '70662', '46634', '8'), +('1', '70', '6', '70717', '54726', '8'), +('1', '70', '6', '68757', '47845', '8'), +('1', '70', '6', '13674', '44009', '8'), +('1', '70', '6', '47278', '36195', '8'), +('1', '70', '17', '70858', '52265', '8'), +('1', '70', '17', '69150', '36638', '8'), +('1', '70', '17', '70701', '34477', '8'), +('1', '70', '17', '28937', '34374', '8'), +('1', '70', '7', '70854', '36700', '8'), +('1', '70', '7', '16097', '36599', '8'), +('1', '70', '7', '47204', '32883', '8'), +('1', '70', '7', '69168', '30334', '8'), +('1', '70', '9', '68766', '40622', '8'), +('1', '70', '9', '16097', '36599', '8'), +('1', '70', '9', '70855', '36075', '8'), +('1', '70', '9', '11103', '36062', '8'), +('1', '70', '15', '71117', '48190', '8'), +('1', '70', '15', '70621', '47538', '8'), +('1', '70', '15', '68111', '35465', '8'), +('1', '70', '15', '9959', '35357', '8'), +('1', '70', '20', '47283', '56931', '8'), +('1', '70', '20', '16156', '48984', '8'), +('1', '70', '20', '70604', '45655', '8'), +('1', '70', '20', '16097', '36599', '8'), +('1', '70', '12', '47212', '51555', '8'), +('1', '70', '12', '71075', '46698', '8'), +('1', '70', '12', '70856', '35716', '8'), +('1', '70', '12', '69252', '32121', '8'), +('1', '70', '18', '70859', '40996', '8'), +('1', '70', '18', '47200', '34357', '8'), +('1', '70', '18', '69146', '34304', '8'), +('1', '70', '18', '68961', '29107', '8'), +('1', '70', '19', '69439', '37575', '8'), +('1', '70', '19', '70857', '36409', '8'), +('1', '70', '19', '19094', '35419', '8'), +('1', '70', '19', '30569', '32355', '8'), +('1', '70', '13', '47314', '126055', '8'), +('1', '70', '13', '69052', '119561', '8'), +('1', '70', '13', '60332', '118743', '8'), +('1', '70', '13', '47312', '116584', '8'), +('1', '70', '14', '47314', '126055', '8'), +('1', '70', '14', '69052', '119561', '8'), +('1', '70', '14', '60332', '118743', '8'), +('1', '70', '14', '47312', '116584', '8'), +('1', '70', '11', '47325', '68394', '8'), +('1', '70', '11', '69054', '64450', '8'), +('1', '70', '11', '47265', '61270', '8'), +('1', '70', '11', '70628', '56466', '8'), +('1', '71', '22', '21807', '0', '11'), +('1', '71', '22', '21805', '0', '11'), +('1', '71', '22', '61948', '0', '11'), +('1', '71', '22', '12425', '0', '11'), +('1', '71', '1', '39276', '62348', '11'), +('1', '71', '1', '83594', '60709', '11'), +('1', '71', '1', '71624', '52793', '11'), +('1', '71', '1', '68949', '48569', '11'), +('1', '71', '2', '70853', '59687', '11'), +('1', '71', '2', '28647', '41746', '11'), +('1', '71', '2', '28605', '40600', '11'), +('1', '71', '2', '28648', '40439', '11'), +('1', '71', '3', '39218', '57188', '11'), +('1', '71', '3', '47245', '53727', '11'), +('1', '71', '3', '39347', '45033', '11'), +('1', '71', '3', '39361', '43590', '11'), +('1', '71', '5', '39349', '65046', '11'), +('1', '71', '5', '39359', '44404', '11'), +('1', '71', '5', '39262', '40231', '11'), +('1', '71', '5', '39313', '39877', '11'), +('1', '71', '8', '39330', '60957', '11'), +('1', '71', '8', '69165', '55788', '11'), +('1', '71', '8', '69064', '52523', '11'), +('1', '71', '8', '69072', '50912', '11'), +('1', '71', '6', '39337', '65559', '11'), +('1', '71', '6', '70717', '54729', '11'), +('1', '71', '6', '39367', '47922', '11'), +('1', '71', '6', '68757', '47848', '11'), +('1', '71', '17', '83603', '67939', '11'), +('1', '71', '17', '70858', '51269', '11'), +('1', '71', '17', '69150', '36640', '11'), +('1', '71', '17', '70701', '34481', '11'), +('1', '71', '7', '83564', '39621', '11'), +('1', '71', '7', '39267', '39432', '11'), +('1', '71', '7', '70854', '36705', '11'), +('1', '71', '7', '16097', '36603', '11'), +('1', '71', '9', '39335', '44805', '11'), +('1', '71', '9', '51706', '41815', '11'), +('1', '71', '9', '83652', '41669', '11'), +('1', '71', '9', '68766', '40625', '11'), +('1', '71', '15', '39373', '48288', '11'), +('1', '71', '15', '83458', '48271', '11'), +('1', '71', '15', '71117', '48194', '11'), +('1', '71', '15', '70621', '47541', '11'), +('1', '71', '20', '47283', '56933', '11'), +('1', '71', '20', '83533', '52048', '11'), +('1', '71', '20', '16156', '48987', '11'), +('1', '71', '20', '39365', '48530', '11'), +('1', '71', '12', '47212', '51558', '11'), +('1', '71', '12', '71075', '46701', '11'), +('1', '71', '12', '83568', '37274', '11'), +('1', '71', '12', '70856', '35720', '11'), +('1', '71', '18', '83607', '44057', '11'), +('1', '71', '18', '70859', '41000', '11'), +('1', '71', '18', '47200', '34360', '11'), +('1', '71', '18', '69146', '34304', '11'), +('1', '71', '19', '39355', '43673', '11'), +('1', '71', '19', '83572', '39796', '11'), +('1', '71', '19', '69439', '37577', '11'), +('1', '71', '19', '70857', '36409', '11'), +('1', '71', '13', '83639', '151444', '11'), +('1', '71', '13', '47314', '126677', '11'), +('1', '71', '13', '39323', '126595', '11'), +('1', '71', '13', '83576', '124300', '11'), +('1', '71', '14', '83639', '151444', '11'), +('1', '71', '14', '47314', '126677', '11'), +('1', '71', '14', '39323', '126595', '11'), +('1', '71', '14', '83576', '124300', '11'), +('1', '71', '11', '83582', '75710', '11'), +('1', '71', '11', '39331', '72841', '11'), +('1', '71', '11', '47325', '68462', '11'), +('1', '71', '11', '83539', '67600', '11'), +('1', '72', '22', '21807', '0', '11'), +('1', '72', '22', '21805', '0', '11'), +('1', '72', '22', '61948', '0', '11'), +('1', '72', '22', '12425', '0', '11'), +('1', '72', '1', '39276', '62351', '11'), +('1', '72', '1', '83594', '60712', '11'), +('1', '72', '1', '71624', '52796', '11'), +('1', '72', '1', '68949', '48572', '11'), +('1', '72', '2', '70853', '59691', '11'), +('1', '72', '2', '28647', '41749', '11'), +('1', '72', '2', '28605', '40602', '11'), +('1', '72', '2', '28648', '40439', '11'), +('1', '72', '3', '39218', '57190', '11'), +('1', '72', '3', '47245', '53730', '11'), +('1', '72', '3', '39347', '45038', '11'), +('1', '72', '3', '39361', '43593', '11'), +('1', '72', '5', '39349', '65049', '11'), +('1', '72', '5', '39359', '44407', '11'), +('1', '72', '5', '39262', '40233', '11'), +('1', '72', '5', '39313', '39881', '11'), +('1', '72', '8', '39330', '60957', '11'), +('1', '72', '8', '69165', '55791', '11'), +('1', '72', '8', '69064', '52525', '11'), +('1', '72', '8', '69072', '50915', '11'), +('1', '72', '6', '39337', '65562', '11'), +('1', '72', '6', '70717', '54733', '11'), +('1', '72', '6', '39367', '47926', '11'), +('1', '72', '6', '68757', '47851', '11'), +('1', '72', '17', '83603', '67944', '11'), +('1', '72', '17', '70858', '50273', '11'), +('1', '72', '17', '69150', '36643', '11'), +('1', '72', '17', '70701', '34486', '11'), +('1', '72', '7', '83564', '39627', '11'), +('1', '72', '7', '39267', '39435', '11'), +('1', '72', '7', '70854', '36710', '11'), +('1', '72', '7', '16097', '36606', '11'), +('1', '72', '9', '39335', '44810', '11'), +('1', '72', '9', '51706', '41819', '11'), +('1', '72', '9', '83652', '41672', '11'), +('1', '72', '9', '68766', '40627', '11'), +('1', '72', '15', '39373', '48293', '11'), +('1', '72', '15', '83458', '48274', '11'), +('1', '72', '15', '71117', '48199', '11'), +('1', '72', '15', '70621', '47543', '11'), +('1', '72', '20', '47283', '56935', '11'), +('1', '72', '20', '83533', '52051', '11'), +('1', '72', '20', '16156', '48990', '11'), +('1', '72', '20', '39365', '48534', '11'), +('1', '72', '12', '47212', '51560', '11'), +('1', '72', '12', '71075', '46703', '11'), +('1', '72', '12', '83568', '37279', '11'), +('1', '72', '12', '70856', '35724', '11'), +('1', '72', '18', '83607', '44062', '11'), +('1', '72', '18', '70859', '41004', '11'), +('1', '72', '18', '47200', '34362', '11'), +('1', '72', '18', '69146', '34304', '11'), +('1', '72', '19', '39355', '43678', '11'), +('1', '72', '19', '83572', '39801', '11'), +('1', '72', '19', '69439', '37579', '11'), +('1', '72', '19', '70857', '36409', '11'), +('1', '72', '13', '83639', '152186', '11'), +('1', '72', '13', '47314', '126980', '11'), +('1', '72', '13', '39323', '126899', '11'), +('1', '72', '13', '83576', '124586', '11'), +('1', '72', '14', '83639', '152186', '11'), +('1', '72', '14', '47314', '126980', '11'), +('1', '72', '14', '39323', '126899', '11'), +('1', '72', '14', '83576', '124586', '11'), +('1', '72', '11', '83582', '75789', '11'), +('1', '72', '11', '39331', '72907', '11'), +('1', '72', '11', '47325', '68530', '11'), +('1', '72', '11', '83539', '67739', '11'), +('1', '73', '22', '21807', '0', '11'), +('1', '73', '22', '21805', '0', '11'), +('1', '73', '22', '61948', '0', '11'), +('1', '73', '22', '12425', '0', '11'), +('1', '73', '1', '39276', '62354', '11'), +('1', '73', '1', '83594', '60715', '11'), +('1', '73', '1', '71624', '52799', '11'), +('1', '73', '1', '68949', '48575', '11'), +('1', '73', '2', '70853', '59695', '11'), +('1', '73', '2', '28647', '41751', '11'), +('1', '73', '2', '28605', '40603', '11'), +('1', '73', '2', '28648', '40439', '11'), +('1', '73', '3', '39218', '57192', '11'), +('1', '73', '3', '47245', '53732', '11'), +('1', '73', '3', '39347', '45043', '11'), +('1', '73', '3', '39361', '43596', '11'), +('1', '73', '5', '39349', '65053', '11'), +('1', '73', '5', '39359', '44410', '11'), +('1', '73', '5', '39262', '40236', '11'), +('1', '73', '5', '39313', '39884', '11'), +('1', '73', '8', '39330', '60957', '11'), +('1', '73', '8', '69165', '55795', '11'), +('1', '73', '8', '69064', '52526', '11'), +('1', '73', '8', '69072', '50918', '11'), +('1', '73', '6', '39337', '65565', '11'), +('1', '73', '6', '70717', '54736', '11'), +('1', '73', '6', '39367', '47930', '11'), +('1', '73', '6', '68757', '47853', '11'), +('1', '73', '17', '83603', '67948', '11'), +('1', '73', '17', '70858', '49277', '11'), +('1', '73', '17', '69150', '36645', '11'), +('1', '73', '17', '70701', '34491', '11'), +('1', '73', '7', '83564', '39632', '11'), +('1', '73', '7', '39267', '39437', '11'), +('1', '73', '7', '70854', '36715', '11'), +('1', '73', '7', '16097', '36609', '11'), +('1', '73', '9', '39335', '44815', '11'), +('1', '73', '9', '51706', '41823', '11'), +('1', '73', '9', '83652', '41675', '11'), +('1', '73', '9', '68766', '40630', '11'), +('1', '73', '15', '39373', '48297', '11'), +('1', '73', '15', '83458', '48277', '11'), +('1', '73', '15', '71117', '48203', '11'), +('1', '73', '15', '70621', '47546', '11'), +('1', '73', '20', '47283', '56937', '11'), +('1', '73', '20', '83533', '52054', '11'), +('1', '73', '20', '16156', '48992', '11'), +('1', '73', '20', '39365', '48539', '11'), +('1', '73', '12', '47212', '51563', '11'), +('1', '73', '12', '71075', '46706', '11'), +('1', '73', '12', '83568', '37284', '11'), +('1', '73', '12', '70856', '35728', '11'), +('1', '73', '18', '83607', '44067', '11'), +('1', '73', '18', '70859', '41008', '11'), +('1', '73', '18', '47200', '34365', '11'), +('1', '73', '18', '69146', '34304', '11'), +('1', '73', '19', '39355', '43683', '11'), +('1', '73', '19', '83572', '39806', '11'), +('1', '73', '19', '69439', '37580', '11'), +('1', '73', '19', '70857', '36409', '11'), +('1', '73', '13', '83639', '152928', '11'), +('1', '73', '13', '47314', '127284', '11'), +('1', '73', '13', '39323', '127204', '11'), +('1', '73', '13', '83576', '124873', '11'), +('1', '73', '14', '83639', '152928', '11'), +('1', '73', '14', '47314', '127284', '11'), +('1', '73', '14', '39323', '127204', '11'), +('1', '73', '14', '83576', '124873', '11'), +('1', '73', '11', '83582', '75868', '11'), +('1', '73', '11', '39331', '72973', '11'), +('1', '73', '11', '47325', '68598', '11'), +('1', '73', '11', '83539', '67868', '11'), +('1', '74', '22', '21807', '0', '11'), +('1', '74', '22', '21805', '0', '11'), +('1', '74', '22', '61948', '0', '11'), +('1', '74', '22', '12425', '0', '11'), +('1', '74', '1', '39276', '62357', '11'), +('1', '74', '1', '83594', '60719', '11'), +('1', '74', '1', '71624', '52802', '11'), +('1', '74', '1', '68949', '48579', '11'), +('1', '74', '2', '70853', '59699', '11'), +('1', '74', '2', '28647', '41754', '11'), +('1', '74', '2', '28605', '40604', '11'), +('1', '74', '2', '28648', '40439', '11'), +('1', '74', '3', '39218', '57194', '11'), +('1', '74', '3', '47245', '53735', '11'), +('1', '74', '3', '39347', '45047', '11'), +('1', '74', '3', '39361', '43598', '11'), +('1', '74', '5', '39349', '65056', '11'), +('1', '74', '5', '39359', '44414', '11'), +('1', '74', '5', '39262', '40238', '11'), +('1', '74', '5', '39313', '39889', '11'), +('1', '74', '8', '39330', '60957', '11'), +('1', '74', '8', '69165', '55798', '11'), +('1', '74', '8', '69064', '52529', '11'), +('1', '74', '8', '69072', '50920', '11'), +('1', '74', '6', '39337', '65569', '11'), +('1', '74', '6', '70717', '54739', '11'), +('1', '74', '6', '39367', '47934', '11'), +('1', '74', '6', '68757', '47856', '11'), +('1', '74', '17', '83603', '67953', '11'), +('1', '74', '17', '70858', '48281', '11'), +('1', '74', '17', '69150', '36648', '11'), +('1', '74', '17', '70701', '34495', '11'), +('1', '74', '7', '83564', '39637', '11'), +('1', '74', '7', '39267', '39440', '11'), +('1', '74', '7', '70854', '36721', '11'), +('1', '74', '7', '16097', '36613', '11'), +('1', '74', '9', '39335', '44819', '11'), +('1', '74', '9', '51706', '41827', '11'), +('1', '74', '9', '83652', '41679', '11'), +('1', '74', '9', '68766', '40633', '11'), +('1', '74', '15', '39373', '48302', '11'), +('1', '74', '15', '83458', '48281', '11'), +('1', '74', '15', '71117', '48208', '11'), +('1', '74', '15', '70621', '47549', '11'), +('1', '74', '20', '47283', '56939', '11'), +('1', '74', '20', '83533', '52058', '11'), +('1', '74', '20', '16156', '48995', '11'), +('1', '74', '20', '39365', '48544', '11'), +('1', '74', '12', '47212', '51566', '11'), +('1', '74', '12', '71075', '46709', '11'), +('1', '74', '12', '83568', '37290', '11'), +('1', '74', '12', '70856', '35732', '11'), +('1', '74', '18', '83607', '44071', '11'), +('1', '74', '18', '70859', '41012', '11'), +('1', '74', '18', '47200', '34368', '11'), +('1', '74', '18', '69146', '34304', '11'), +('1', '74', '19', '39355', '43687', '11'), +('1', '74', '19', '83572', '39812', '11'), +('1', '74', '19', '69439', '37583', '11'), +('1', '74', '19', '70857', '36409', '11'), +('1', '74', '13', '83639', '153670', '11'), +('1', '74', '13', '47314', '127587', '11'), +('1', '74', '13', '39323', '127508', '11'), +('1', '74', '13', '83576', '125160', '11'), +('1', '74', '14', '83639', '153670', '11'), +('1', '74', '14', '47314', '127587', '11'), +('1', '74', '14', '39323', '127508', '11'), +('1', '74', '14', '83576', '125160', '11'), +('1', '74', '11', '83582', '75947', '11'), +('1', '74', '11', '39331', '73030', '11'), +('1', '74', '11', '47325', '68666', '11'), +('1', '74', '11', '83539', '67998', '11'), +('1', '75', '22', '12425', '0', '13'), +('1', '75', '22', '21807', '0', '13'), +('1', '75', '22', '21805', '0', '13'), +('1', '75', '22', '39342', '0', '13'), +('1', '75', '1', '80659', '64662', '13'), +('1', '75', '1', '80676', '63769', '13'), +('1', '75', '1', '39276', '62360', '13'), +('1', '75', '1', '83594', '60722', '13'), +('1', '75', '2', '70853', '59703', '13'), +('1', '75', '2', '53361', '52376', '13'), +('1', '75', '2', '28647', '41757', '13'), +('1', '75', '2', '28605', '40606', '13'), +('1', '75', '3', '80636', '60835', '13'), +('1', '75', '3', '39218', '57196', '13'), +('1', '75', '3', '47245', '53737', '13'), +('1', '75', '3', '46924', '51870', '13'), +('1', '75', '5', '46867', '76199', '13'), +('1', '75', '5', '46918', '75620', '13'), +('1', '75', '5', '80669', '65723', '13'), +('1', '75', '5', '39349', '65059', '13'), +('1', '75', '8', '46885', '80890', '13'), +('1', '75', '8', '80687', '67060', '13'), +('1', '75', '8', '46814', '64069', '13'), +('1', '75', '8', '39330', '60957', '13'), +('1', '75', '6', '80638', '83508', '13'), +('1', '75', '6', '39337', '65572', '13'), +('1', '75', '6', '46884', '56727', '13'), +('1', '75', '6', '46933', '56621', '13'), +('1', '75', '17', '83603', '67958', '13'), +('1', '75', '17', '70858', '47285', '13'), +('1', '75', '17', '46809', '45663', '13'), +('1', '75', '17', '69150', '36651', '13'), +('1', '75', '7', '83564', '39643', '13'), +('1', '75', '7', '39267', '39442', '13'), +('1', '75', '7', '70854', '36726', '13'), +('1', '75', '7', '16097', '36616', '13'), +('1', '75', '9', '46887', '57135', '13'), +('1', '75', '9', '53363', '51815', '13'), +('1', '75', '9', '39335', '44824', '13'), +('1', '75', '9', '51706', '41831', '13'), +('1', '75', '15', '79909', '67961', '13'), +('1', '75', '15', '80671', '65326', '13'), +('1', '75', '15', '80686', '64440', '13'), +('1', '75', '15', '80657', '62657', '13'), +('1', '75', '20', '80688', '88770', '13'), +('1', '75', '20', '46935', '58826', '13'), +('1', '75', '20', '47283', '56941', '13'), +('1', '75', '20', '80620', '56086', '13'), +('1', '75', '12', '53364', '74436', '13'), +('1', '75', '12', '47212', '51568', '13'), +('1', '75', '12', '71075', '46711', '13'), +('1', '75', '12', '83568', '37295', '13'), +('1', '75', '18', '83607', '44076', '13'), +('1', '75', '18', '46826', '43198', '13'), +('1', '75', '18', '70859', '41016', '13'), +('1', '75', '18', '47200', '34370', '13'), +('1', '75', '19', '53365', '53411', '13'), +('1', '75', '19', '39355', '43692', '13'), +('1', '75', '19', '83572', '39817', '13'), +('1', '75', '19', '69439', '37585', '13'), +('1', '75', '13', '46856', '178642', '13'), +('1', '75', '13', '46854', '176545', '13'), +('1', '75', '13', '80674', '176203', '13'), +('1', '75', '13', '80652', '171424', '13'), +('1', '75', '14', '46856', '178642', '13'), +('1', '75', '14', '46854', '176545', '13'), +('1', '75', '14', '80674', '176203', '13'), +('1', '75', '14', '80652', '171424', '13'), +('1', '75', '11', '80655', '106141', '13'), +('1', '75', '11', '46930', '99795', '13'), +('1', '75', '11', '83582', '76026', '13'), +('1', '75', '11', '39331', '73096', '13'), +('1', '75', '22', '12425', '0', '12'), +('1', '75', '22', '21807', '0', '12'), +('1', '75', '22', '21805', '0', '12'), +('1', '75', '22', '39342', '0', '12'), +('1', '75', '1', '39276', '62360', '12'), +('1', '75', '1', '83594', '60722', '12'), +('1', '75', '1', '46931', '56770', '12'), +('1', '75', '1', '71624', '52805', '12'), +('1', '75', '2', '70853', '59703', '12'), +('1', '75', '2', '53361', '52376', '12'), +('1', '75', '2', '28647', '41757', '12'), +('1', '75', '2', '28605', '40606', '12'), +('1', '75', '3', '39218', '57196', '12'), +('1', '75', '3', '47245', '53737', '12'), +('1', '75', '3', '46924', '51870', '12'), +('1', '75', '3', '46873', '51612', '12'), +('1', '75', '5', '46867', '76199', '12'), +('1', '75', '5', '46918', '75620', '12'), +('1', '75', '5', '39349', '65059', '12'), +('1', '75', '5', '46934', '55666', '12'), +('1', '75', '8', '46885', '80890', '12'), +('1', '75', '8', '46814', '64069', '12'), +('1', '75', '8', '39330', '60957', '12'), +('1', '75', '8', '69165', '55801', '12'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '75', '6', '39337', '65572', '12'), +('1', '75', '6', '46884', '56727', '12'), +('1', '75', '6', '46933', '56621', '12'), +('1', '75', '6', '46883', '55717', '12'), +('1', '75', '17', '83603', '67958', '12'), +('1', '75', '17', '70858', '47285', '12'), +('1', '75', '17', '46809', '45663', '12'), +('1', '75', '17', '69150', '36651', '12'), +('1', '75', '7', '83564', '39643', '12'), +('1', '75', '7', '39267', '39442', '12'), +('1', '75', '7', '70854', '36726', '12'), +('1', '75', '7', '16097', '36616', '12'), +('1', '75', '9', '46887', '57135', '12'), +('1', '75', '9', '53363', '51815', '12'), +('1', '75', '9', '39335', '44824', '12'), +('1', '75', '9', '51706', '41831', '12'), +('1', '75', '15', '46881', '58057', '12'), +('1', '75', '15', '46863', '54525', '12'), +('1', '75', '15', '46916', '51678', '12'), +('1', '75', '15', '46893', '50487', '12'), +('1', '75', '20', '46935', '58826', '12'), +('1', '75', '20', '47283', '56941', '12'), +('1', '75', '20', '46919', '52302', '12'), +('1', '75', '20', '83533', '52061', '12'), +('1', '75', '12', '53364', '74436', '12'), +('1', '75', '12', '47212', '51568', '12'), +('1', '75', '12', '71075', '46711', '12'), +('1', '75', '12', '83568', '37295', '12'), +('1', '75', '18', '83607', '44076', '12'), +('1', '75', '18', '46826', '43198', '12'), +('1', '75', '18', '70859', '41016', '12'), +('1', '75', '18', '47200', '34370', '12'), +('1', '75', '19', '53365', '53411', '12'), +('1', '75', '19', '39355', '43692', '12'), +('1', '75', '19', '83572', '39817', '12'), +('1', '75', '19', '69439', '37585', '12'), +('1', '75', '13', '46856', '178642', '12'), +('1', '75', '13', '46854', '176545', '12'), +('1', '75', '13', '83639', '157536', '12'), +('1', '75', '13', '46928', '156757', '12'), +('1', '75', '14', '46856', '178642', '12'), +('1', '75', '14', '46854', '176545', '12'), +('1', '75', '14', '83639', '157536', '12'), +('1', '75', '14', '46928', '156757', '12'), +('1', '75', '11', '46930', '99795', '12'), +('1', '75', '11', '83582', '76026', '12'), +('1', '75', '11', '39331', '73096', '12'), +('1', '75', '11', '46849', '72223', '12'), +('1', '76', '22', '12425', '0', '13'), +('1', '76', '22', '21807', '0', '13'), +('1', '76', '22', '21805', '0', '13'), +('1', '76', '22', '39342', '0', '13'), +('1', '76', '1', '80659', '64667', '13'), +('1', '76', '1', '80676', '63769', '13'), +('1', '76', '1', '39276', '62363', '13'), +('1', '76', '1', '83594', '60725', '13'), +('1', '76', '2', '70853', '59707', '13'), +('1', '76', '2', '53361', '52379', '13'), +('1', '76', '2', '28647', '41759', '13'), +('1', '76', '2', '28605', '40607', '13'), +('1', '76', '3', '80636', '60835', '13'), +('1', '76', '3', '39218', '57198', '13'), +('1', '76', '3', '47245', '53739', '13'), +('1', '76', '3', '46924', '51874', '13'), +('1', '76', '5', '46867', '76203', '13'), +('1', '76', '5', '46918', '75624', '13'), +('1', '76', '5', '80669', '65728', '13'), +('1', '76', '5', '39349', '65063', '13'), +('1', '76', '8', '46885', '80895', '13'), +('1', '76', '8', '80687', '67064', '13'), +('1', '76', '8', '46814', '64071', '13'), +('1', '76', '8', '39330', '60957', '13'), +('1', '76', '6', '80638', '83513', '13'), +('1', '76', '6', '39337', '65575', '13'), +('1', '76', '6', '46884', '56732', '13'), +('1', '76', '6', '46933', '56625', '13'), +('1', '76', '17', '83603', '67962', '13'), +('1', '76', '17', '70858', '46289', '13'), +('1', '76', '17', '46809', '45665', '13'), +('1', '76', '17', '69150', '36653', '13'), +('1', '76', '7', '83564', '39648', '13'), +('1', '76', '7', '39267', '39445', '13'), +('1', '76', '7', '70854', '36731', '13'), +('1', '76', '7', '16097', '36619', '13'), +('1', '76', '9', '46887', '57139', '13'), +('1', '76', '9', '53363', '51819', '13'), +('1', '76', '9', '39335', '44829', '13'), +('1', '76', '9', '51706', '41835', '13'), +('1', '76', '15', '79909', '67965', '13'), +('1', '76', '15', '80671', '65331', '13'), +('1', '76', '15', '80686', '64444', '13'), +('1', '76', '15', '80657', '62657', '13'), +('1', '76', '20', '80688', '88774', '13'), +('1', '76', '20', '46935', '58831', '13'), +('1', '76', '20', '47283', '56943', '13'), +('1', '76', '20', '80620', '56090', '13'), +('1', '76', '12', '53364', '74439', '13'), +('1', '76', '12', '47212', '51571', '13'), +('1', '76', '12', '71075', '46714', '13'), +('1', '76', '12', '83568', '37300', '13'), +('1', '76', '18', '83607', '44081', '13'), +('1', '76', '18', '46826', '43200', '13'), +('1', '76', '18', '70859', '41020', '13'), +('1', '76', '18', '47200', '34373', '13'), +('1', '76', '19', '53365', '53416', '13'), +('1', '76', '19', '39355', '43697', '13'), +('1', '76', '19', '83572', '39822', '13'), +('1', '76', '19', '69439', '37586', '13'), +('1', '76', '13', '46856', '179412', '13'), +('1', '76', '13', '46854', '177287', '13'), +('1', '76', '13', '80674', '176432', '13'), +('1', '76', '13', '80652', '171654', '13'), +('1', '76', '14', '46856', '179412', '13'), +('1', '76', '14', '46854', '177287', '13'), +('1', '76', '14', '80674', '176432', '13'), +('1', '76', '14', '80652', '171654', '13'), +('1', '76', '11', '80655', '106239', '13'), +('1', '76', '11', '46930', '99893', '13'), +('1', '76', '11', '83582', '76105', '13'), +('1', '76', '11', '39331', '73162', '13'), +('1', '77', '22', '12425', '0', '13'), +('1', '77', '22', '21807', '0', '13'), +('1', '77', '22', '21805', '0', '13'), +('1', '77', '22', '39342', '0', '13'), +('1', '77', '1', '80659', '64672', '13'), +('1', '77', '1', '80676', '63769', '13'), +('1', '77', '1', '39276', '62366', '13'), +('1', '77', '1', '83594', '60729', '13'), +('1', '77', '2', '70853', '59711', '13'), +('1', '77', '2', '53361', '52383', '13'), +('1', '77', '2', '28647', '41762', '13'), +('1', '77', '2', '28605', '40608', '13'), +('1', '77', '3', '80636', '60835', '13'), +('1', '77', '3', '39218', '57200', '13'), +('1', '77', '3', '47245', '53742', '13'), +('1', '77', '3', '46924', '51879', '13'), +('1', '77', '5', '46867', '76207', '13'), +('1', '77', '5', '46918', '75629', '13'), +('1', '77', '5', '80669', '65733', '13'), +('1', '77', '5', '39349', '65066', '13'), +('1', '77', '8', '46885', '80900', '13'), +('1', '77', '8', '80687', '67069', '13'), +('1', '77', '8', '46814', '64073', '13'), +('1', '77', '8', '39330', '60957', '13'), +('1', '77', '6', '80638', '83517', '13'), +('1', '77', '6', '39337', '65579', '13'), +('1', '77', '6', '46884', '56737', '13'), +('1', '77', '6', '46933', '56628', '13'), +('1', '77', '17', '83603', '67967', '13'), +('1', '77', '17', '46809', '45668', '13'), +('1', '77', '17', '70858', '45293', '13'), +('1', '77', '17', '69150', '36656', '13'), +('1', '77', '7', '83564', '39653', '13'), +('1', '77', '7', '39267', '39447', '13'), +('1', '77', '7', '70854', '36737', '13'), +('1', '77', '7', '16097', '36623', '13'), +('1', '77', '9', '46887', '57143', '13'), +('1', '77', '9', '53363', '51822', '13'), +('1', '77', '9', '39335', '44833', '13'), +('1', '77', '9', '51706', '41839', '13'), +('1', '77', '15', '79909', '67969', '13'), +('1', '77', '15', '80671', '65336', '13'), +('1', '77', '15', '80686', '64449', '13'), +('1', '77', '15', '80657', '62657', '13'), +('1', '77', '20', '80688', '88779', '13'), +('1', '77', '20', '46935', '58836', '13'), +('1', '77', '20', '47283', '56946', '13'), +('1', '77', '20', '80620', '56094', '13'), +('1', '77', '12', '53364', '74444', '13'), +('1', '77', '12', '47212', '51574', '13'), +('1', '77', '12', '71075', '46717', '13'), +('1', '77', '12', '83568', '37306', '13'), +('1', '77', '18', '83607', '44085', '13'), +('1', '77', '18', '46826', '43202', '13'), +('1', '77', '18', '70859', '41024', '13'), +('1', '77', '18', '47200', '34376', '13'), +('1', '77', '19', '53365', '53420', '13'), +('1', '77', '19', '39355', '43701', '13'), +('1', '77', '19', '83572', '39828', '13'), +('1', '77', '19', '69439', '37589', '13'), +('1', '77', '13', '46856', '180182', '13'), +('1', '77', '13', '46854', '178057', '13'), +('1', '77', '13', '80674', '176634', '13'), +('1', '77', '13', '80652', '171856', '13'), +('1', '77', '14', '46856', '180182', '13'), +('1', '77', '14', '46854', '178057', '13'), +('1', '77', '14', '80674', '176634', '13'), +('1', '77', '14', '80652', '171856', '13'), +('1', '77', '11', '80655', '106336', '13'), +('1', '77', '11', '46930', '99991', '13'), +('1', '77', '11', '83582', '76184', '13'), +('1', '77', '11', '39331', '73219', '13'), +('1', '78', '22', '12425', '0', '13'), +('1', '78', '22', '21807', '0', '13'), +('1', '78', '22', '21805', '0', '13'), +('1', '78', '22', '39342', '0', '13'), +('1', '78', '1', '80659', '64676', '13'), +('1', '78', '1', '80676', '63769', '13'), +('1', '78', '1', '39276', '62369', '13'), +('1', '78', '1', '83594', '60732', '13'), +('1', '78', '2', '70853', '59715', '13'), +('1', '78', '2', '53361', '52386', '13'), +('1', '78', '2', '28647', '41765', '13'), +('1', '78', '2', '28605', '40610', '13'), +('1', '78', '3', '80636', '60835', '13'), +('1', '78', '3', '39218', '57202', '13'), +('1', '78', '3', '47245', '53744', '13'), +('1', '78', '3', '46924', '51884', '13'), +('1', '78', '5', '46867', '76210', '13'), +('1', '78', '5', '46918', '75634', '13'), +('1', '78', '5', '80669', '65738', '13'), +('1', '78', '5', '39349', '65069', '13'), +('1', '78', '8', '46885', '80905', '13'), +('1', '78', '8', '80687', '67074', '13'), +('1', '78', '8', '46814', '64075', '13'), +('1', '78', '8', '39330', '60957', '13'), +('1', '78', '6', '80638', '83521', '13'), +('1', '78', '6', '39337', '65582', '13'), +('1', '78', '6', '46884', '56743', '13'), +('1', '78', '6', '46933', '56631', '13'), +('1', '78', '17', '83603', '67972', '13'), +('1', '78', '17', '46809', '45671', '13'), +('1', '78', '17', '70858', '44297', '13'), +('1', '78', '17', '69150', '36659', '13'), +('1', '78', '7', '83564', '39659', '13'), +('1', '78', '7', '39267', '39450', '13'), +('1', '78', '7', '70854', '36742', '13'), +('1', '78', '7', '16097', '36626', '13'), +('1', '78', '9', '46887', '57146', '13'), +('1', '78', '9', '53363', '51825', '13'), +('1', '78', '9', '39335', '44838', '13'), +('1', '78', '9', '51706', '41843', '13'), +('1', '78', '15', '79909', '67973', '13'), +('1', '78', '15', '80671', '65341', '13'), +('1', '78', '15', '80686', '64454', '13'), +('1', '78', '15', '80657', '62657', '13'), +('1', '78', '20', '80688', '88784', '13'), +('1', '78', '20', '46935', '58842', '13'), +('1', '78', '20', '47283', '56948', '13'), +('1', '78', '20', '80620', '56098', '13'), +('1', '78', '12', '53364', '74448', '13'), +('1', '78', '12', '47212', '51576', '13'), +('1', '78', '12', '71075', '46719', '13'), +('1', '78', '12', '83568', '37311', '13'), +('1', '78', '18', '83607', '44090', '13'), +('1', '78', '18', '46826', '43204', '13'), +('1', '78', '18', '70859', '41028', '13'), +('1', '78', '18', '47200', '34378', '13'), +('1', '78', '19', '53365', '53425', '13'), +('1', '78', '19', '39355', '43706', '13'), +('1', '78', '19', '83572', '39833', '13'), +('1', '78', '19', '69439', '37591', '13'), +('1', '78', '13', '46856', '180952', '13'), +('1', '78', '13', '46854', '178827', '13'), +('1', '78', '13', '80674', '176864', '13'), +('1', '78', '13', '80652', '172086', '13'), +('1', '78', '14', '46856', '180952', '13'), +('1', '78', '14', '46854', '178827', '13'), +('1', '78', '14', '80674', '176864', '13'), +('1', '78', '14', '80652', '172086', '13'), +('1', '78', '11', '80655', '106434', '13'), +('1', '78', '11', '46930', '100080', '13'), +('1', '78', '11', '83582', '76263', '13'), +('1', '78', '11', '39331', '73285', '13'), +('1', '79', '22', '12425', '0', '13'), +('1', '79', '22', '21807', '0', '13'), +('1', '79', '22', '21805', '0', '13'), +('1', '79', '22', '39342', '0', '13'), +('1', '79', '1', '80659', '64681', '13'), +('1', '79', '1', '80676', '63769', '13'), +('1', '79', '1', '39276', '62372', '13'), +('1', '79', '1', '83594', '60735', '13'), +('1', '79', '2', '70853', '59719', '13'), +('1', '79', '2', '53361', '52390', '13'), +('1', '79', '2', '28647', '41768', '13'), +('1', '79', '2', '28605', '40611', '13'), +('1', '79', '3', '80636', '60835', '13'), +('1', '79', '3', '39218', '57204', '13'), +('1', '79', '3', '47245', '53747', '13'), +('1', '79', '3', '46924', '51889', '13'), +('1', '79', '5', '46867', '76214', '13'), +('1', '79', '5', '46918', '75638', '13'), +('1', '79', '5', '80669', '65743', '13'), +('1', '79', '5', '39349', '65073', '13'), +('1', '79', '8', '46885', '80910', '13'), +('1', '79', '8', '80687', '67079', '13'), +('1', '79', '8', '46814', '64077', '13'), +('1', '79', '8', '39330', '60957', '13'), +('1', '79', '6', '80638', '83526', '13'), +('1', '79', '6', '39337', '65586', '13'), +('1', '79', '6', '46884', '56748', '13'), +('1', '79', '6', '46933', '56635', '13'), +('1', '79', '17', '83603', '67976', '13'), +('1', '79', '17', '46809', '45674', '13'), +('1', '79', '17', '70858', '44301', '13'), +('1', '79', '17', '69150', '36662', '13'), +('1', '79', '7', '83564', '39664', '13'), +('1', '79', '7', '39267', '39452', '13'), +('1', '79', '7', '70854', '36748', '13'), +('1', '79', '7', '16097', '36629', '13'), +('1', '79', '9', '46887', '57150', '13'), +('1', '79', '9', '53363', '51829', '13'), +('1', '79', '9', '39335', '44843', '13'), +('1', '79', '9', '51706', '41847', '13'), +('1', '79', '15', '79909', '67977', '13'), +('1', '79', '15', '80671', '65346', '13'), +('1', '79', '15', '80686', '64459', '13'), +('1', '79', '15', '80657', '62657', '13'), +('1', '79', '20', '80688', '88789', '13'), +('1', '79', '20', '46935', '58847', '13'), +('1', '79', '20', '47283', '56950', '13'), +('1', '79', '20', '80620', '56102', '13'), +('1', '79', '12', '53364', '74452', '13'), +('1', '79', '12', '47212', '51579', '13'), +('1', '79', '12', '71075', '46722', '13'), +('1', '79', '12', '83568', '37317', '13'), +('1', '79', '18', '83607', '44095', '13'), +('1', '79', '18', '46826', '43206', '13'), +('1', '79', '18', '70859', '41032', '13'), +('1', '79', '18', '47200', '34381', '13'), +('1', '79', '19', '53365', '53430', '13'), +('1', '79', '19', '39355', '43711', '13'), +('1', '79', '19', '83572', '39838', '13'), +('1', '79', '19', '69439', '37593', '13'), +('1', '79', '13', '46856', '181694', '13'), +('1', '79', '13', '46854', '179569', '13'), +('1', '79', '13', '80674', '177094', '13'), +('1', '79', '13', '80652', '172288', '13'), +('1', '79', '14', '46856', '181694', '13'), +('1', '79', '14', '46854', '179569', '13'), +('1', '79', '14', '80674', '177094', '13'), +('1', '79', '14', '80652', '172288', '13'), +('1', '79', '11', '80655', '106532', '13'), +('1', '79', '11', '46930', '100178', '13'), +('1', '79', '11', '83582', '76342', '13'), +('1', '79', '11', '39331', '73351', '13'), +('1', '80', '22', '12425', '0', '14'), +('1', '80', '22', '21807', '0', '14'), +('1', '80', '22', '21805', '0', '14'), +('1', '80', '22', '39342', '0', '14'), +('1', '80', '1', '102618', '86821', '14'), +('1', '80', '1', '102590', '86445', '14'), +('1', '80', '1', '102641', '85531', '14'), +('1', '80', '1', '102639', '85062', '14'), +('1', '80', '2', '70853', '59723', '14'), +('1', '80', '2', '102003', '59105', '14'), +('1', '80', '2', '102255', '53288', '14'), +('1', '80', '2', '53361', '52393', '14'), +('1', '80', '3', '102726', '94912', '14'), +('1', '80', '3', '102619', '92314', '14'), +('1', '80', '3', '102591', '91618', '14'), +('1', '80', '3', '102725', '82484', '14'), +('1', '80', '5', '102620', '90528', '14'), +('1', '80', '5', '102592', '89728', '14'), +('1', '80', '5', '102745', '82273', '14'), +('1', '80', '5', '102551', '78842', '14'), +('1', '80', '8', '102552', '102380', '14'), +('1', '80', '8', '102622', '92401', '14'), +('1', '80', '8', '102594', '91349', '14'), +('1', '80', '8', '102527', '81775', '14'), +('1', '80', '6', '102621', '92222', '14'), +('1', '80', '6', '102593', '91893', '14'), +('1', '80', '6', '80638', '83530', '14'), +('1', '80', '6', '102555', '79872', '14'), +('1', '80', '17', '83603', '67981', '14'), +('1', '80', '17', '100794', '64521', '14'), +('1', '80', '17', '102006', '63254', '14'), +('1', '80', '17', '102258', '57497', '14'), +('1', '80', '7', '102004', '59831', '14'), +('1', '80', '7', '102256', '54342', '14'), +('1', '80', '7', '83564', '39670', '14'), +('1', '80', '7', '39267', '39455', '14'), +('1', '80', '9', '67098', '150015', '14'), +('1', '80', '9', '46887', '57154', '14'), +('1', '80', '9', '53363', '51832', '14'), +('1', '80', '9', '102287', '49454', '14'), +('1', '80', '15', '102595', '88219', '14'), +('1', '80', '15', '102623', '88057', '14'), +('1', '80', '15', '102636', '86838', '14'), +('1', '80', '15', '102637', '86657', '14'), +('1', '80', '20', '102624', '115278', '14'), +('1', '80', '20', '102596', '113988', '14'), +('1', '80', '20', '102553', '102037', '14'), +('1', '80', '20', '80688', '88794', '14'), +('1', '80', '12', '53364', '74456', '14'), +('1', '80', '12', '47212', '51582', '14'), +('1', '80', '12', '102253', '51035', '14'), +('1', '80', '12', '71075', '46725', '14'), +('1', '80', '18', '102005', '61325', '14'), +('1', '80', '18', '102257', '55455', '14'), +('1', '80', '18', '83607', '44100', '14'), +('1', '80', '18', '46826', '43208', '14'), +('1', '80', '19', '76131', '70585', '14'), +('1', '80', '19', '53365', '53435', '14'), +('1', '80', '19', '102254', '51510', '14'), +('1', '80', '19', '39355', '43716', '14'), +('1', '80', '13', '102720', '235785', '14'), +('1', '80', '13', '102649', '234278', '14'), +('1', '80', '13', '102660', '232206', '14'), +('1', '80', '13', '102655', '231499', '14'), +('1', '80', '14', '102720', '235785', '14'), +('1', '80', '14', '102649', '234278', '14'), +('1', '80', '14', '102661', '232531', '14'), +('1', '80', '14', '102660', '232206', '14'), +('1', '80', '11', '102667', '151720', '14'), +('1', '80', '11', '102589', '132938', '14'), +('1', '80', '11', '80655', '106630', '14'), +('1', '80', '11', '46930', '100276', '14'), +('1', '81', '22', '12425', '0', '14'), +('1', '81', '22', '21807', '0', '14'), +('1', '81', '22', '21805', '0', '14'), +('1', '81', '22', '39342', '0', '14'), +('1', '81', '1', '102618', '86825', '14'), +('1', '81', '1', '102590', '86450', '14'), +('1', '81', '1', '102641', '85534', '14'), +('1', '81', '1', '102639', '85067', '14'), +('1', '81', '2', '70853', '59727', '14'), +('1', '81', '2', '102003', '59107', '14'), +('1', '81', '2', '102255', '53291', '14'), +('1', '81', '2', '53361', '52396', '14'), +('1', '81', '3', '102726', '94917', '14'), +('1', '81', '3', '102619', '92320', '14'), +('1', '81', '3', '102591', '91622', '14'), +('1', '81', '3', '102725', '82488', '14'), +('1', '81', '5', '102620', '90530', '14'), +('1', '81', '5', '102592', '89732', '14'), +('1', '81', '5', '102745', '82277', '14'), +('1', '81', '5', '102551', '78844', '14'), +('1', '81', '8', '102552', '102384', '14'), +('1', '81', '8', '102622', '92405', '14'), +('1', '81', '8', '102594', '91350', '14'), +('1', '81', '8', '102527', '81781', '14'), +('1', '81', '6', '102621', '92224', '14'), +('1', '81', '6', '102593', '91899', '14'), +('1', '81', '6', '80638', '83534', '14'), +('1', '81', '6', '102555', '79876', '14'), +('1', '81', '17', '83603', '67986', '14'), +('1', '81', '17', '100794', '64524', '14'), +('1', '81', '17', '102006', '63257', '14'), +('1', '81', '17', '102258', '57501', '14'), +('1', '81', '7', '102004', '59835', '14'), +('1', '81', '7', '102256', '54347', '14'), +('1', '81', '7', '83564', '39675', '14'), +('1', '81', '7', '39267', '39458', '14'), +('1', '81', '9', '67098', '151894', '14'), +('1', '81', '9', '46887', '57157', '14'), +('1', '81', '9', '53363', '51836', '14'), +('1', '81', '9', '102287', '49457', '14'), +('1', '81', '15', '102595', '88223', '14'), +('1', '81', '15', '102623', '88059', '14'), +('1', '81', '15', '102636', '86842', '14'), +('1', '81', '15', '102637', '86662', '14'), +('1', '81', '20', '102624', '115284', '14'), +('1', '81', '20', '102596', '113991', '14'), +('1', '81', '20', '102553', '102042', '14'), +('1', '81', '20', '80688', '88799', '14'), +('1', '81', '12', '53364', '74460', '14'), +('1', '81', '12', '47212', '51584', '14'), +('1', '81', '12', '102253', '51037', '14'), +('1', '81', '12', '71075', '46727', '14'), +('1', '81', '18', '102005', '61330', '14'), +('1', '81', '18', '102257', '55459', '14'), +('1', '81', '18', '83607', '44104', '14'), +('1', '81', '18', '46826', '43210', '14'), +('1', '81', '19', '76131', '70585', '14'), +('1', '81', '19', '53365', '53439', '14'), +('1', '81', '19', '102254', '51512', '14'), +('1', '81', '19', '39355', '43720', '14'), +('1', '81', '13', '102720', '236151', '14'), +('1', '81', '13', '102649', '234663', '14'), +('1', '81', '13', '102660', '232589', '14'), +('1', '81', '13', '102655', '231882', '14'), +('1', '81', '14', '102720', '236151', '14'), +('1', '81', '14', '102649', '234663', '14'), +('1', '81', '14', '102661', '232913', '14'), +('1', '81', '14', '102660', '232589', '14'), +('1', '81', '11', '102667', '151836', '14'), +('1', '81', '11', '102589', '133043', '14'), +('1', '81', '11', '80655', '106728', '14'), +('1', '81', '11', '46930', '100375', '14'), +('1', '82', '22', '12425', '0', '14'), +('1', '82', '22', '21807', '0', '14'), +('1', '82', '22', '21805', '0', '14'), +('1', '82', '22', '39342', '0', '14'), +('1', '82', '1', '102618', '86830', '14'), +('1', '82', '1', '102590', '86456', '14'), +('1', '82', '1', '102641', '85537', '14'), +('1', '82', '1', '102639', '85073', '14'), +('1', '82', '2', '70853', '59732', '14'), +('1', '82', '2', '102003', '59109', '14'), +('1', '82', '2', '102255', '53294', '14'), +('1', '82', '2', '53361', '52400', '14'), +('1', '82', '3', '102726', '94923', '14'), +('1', '82', '3', '102619', '92326', '14'), +('1', '82', '3', '102591', '91626', '14'), +('1', '82', '3', '102725', '82493', '14'), +('1', '82', '5', '102620', '90533', '14'), +('1', '82', '5', '102592', '89736', '14'), +('1', '82', '5', '102745', '82282', '14'), +('1', '82', '5', '102551', '78845', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '82', '8', '102552', '102388', '14'), +('1', '82', '8', '102622', '92409', '14'), +('1', '82', '8', '102594', '91352', '14'), +('1', '82', '8', '102527', '81787', '14'), +('1', '82', '6', '102621', '92227', '14'), +('1', '82', '6', '102593', '91906', '14'), +('1', '82', '6', '80638', '83539', '14'), +('1', '82', '6', '102555', '79880', '14'), +('1', '82', '17', '83603', '67991', '14'), +('1', '82', '17', '100794', '64527', '14'), +('1', '82', '17', '102006', '63261', '14'), +('1', '82', '17', '102258', '57506', '14'), +('1', '82', '7', '102004', '59839', '14'), +('1', '82', '7', '102256', '54353', '14'), +('1', '82', '7', '83564', '39681', '14'), +('1', '82', '7', '39267', '39460', '14'), +('1', '82', '9', '67098', '153773', '14'), +('1', '82', '9', '46887', '57161', '14'), +('1', '82', '9', '53363', '51839', '14'), +('1', '82', '9', '102287', '49460', '14'), +('1', '82', '15', '102595', '88228', '14'), +('1', '82', '15', '102623', '88062', '14'), +('1', '82', '15', '102636', '86846', '14'), +('1', '82', '15', '102637', '86668', '14'), +('1', '82', '20', '102624', '115291', '14'), +('1', '82', '20', '102596', '113994', '14'), +('1', '82', '20', '102553', '102049', '14'), +('1', '82', '20', '80688', '88804', '14'), +('1', '82', '12', '53364', '74464', '14'), +('1', '82', '12', '47212', '51587', '14'), +('1', '82', '12', '102253', '51039', '14'), +('1', '82', '12', '71075', '46730', '14'), +('1', '82', '18', '102005', '61335', '14'), +('1', '82', '18', '102257', '55463', '14'), +('1', '82', '18', '83607', '44109', '14'), +('1', '82', '18', '46826', '43212', '14'), +('1', '82', '19', '76131', '70585', '14'), +('1', '82', '19', '53365', '53444', '14'), +('1', '82', '19', '102254', '51514', '14'), +('1', '82', '19', '39355', '43725', '14'), +('1', '82', '13', '102720', '236517', '14'), +('1', '82', '13', '102649', '235048', '14'), +('1', '82', '13', '102660', '232971', '14'), +('1', '82', '13', '102655', '232264', '14'), +('1', '82', '14', '102720', '236517', '14'), +('1', '82', '14', '102649', '235048', '14'), +('1', '82', '14', '102661', '233324', '14'), +('1', '82', '14', '102660', '232971', '14'), +('1', '82', '11', '102667', '151960', '14'), +('1', '82', '11', '102589', '133149', '14'), +('1', '82', '11', '80655', '106826', '14'), +('1', '82', '11', '46930', '100473', '14'), +('1', '83', '22', '12425', '0', '14'), +('1', '83', '22', '21807', '0', '14'), +('1', '83', '22', '21805', '0', '14'), +('1', '83', '22', '39342', '0', '14'), +('1', '83', '1', '102618', '86834', '14'), +('1', '83', '1', '102590', '86462', '14'), +('1', '83', '1', '102641', '85541', '14'), +('1', '83', '1', '102639', '85079', '14'), +('1', '83', '2', '70853', '59736', '14'), +('1', '83', '2', '102003', '59111', '14'), +('1', '83', '2', '102255', '53297', '14'), +('1', '83', '2', '53361', '52403', '14'), +('1', '83', '3', '102726', '94929', '14'), +('1', '83', '3', '102619', '92332', '14'), +('1', '83', '3', '102591', '91630', '14'), +('1', '83', '3', '102725', '82497', '14'), +('1', '83', '5', '102620', '90535', '14'), +('1', '83', '5', '102592', '89739', '14'), +('1', '83', '5', '102745', '82287', '14'), +('1', '83', '5', '102551', '78847', '14'), +('1', '83', '8', '102552', '102392', '14'), +('1', '83', '8', '102622', '92413', '14'), +('1', '83', '8', '102594', '91353', '14'), +('1', '83', '8', '102527', '81794', '14'), +('1', '83', '6', '102621', '92230', '14'), +('1', '83', '6', '102593', '91913', '14'), +('1', '83', '6', '80638', '83543', '14'), +('1', '83', '6', '102555', '79884', '14'), +('1', '83', '17', '83603', '67996', '14'), +('1', '83', '17', '100794', '64530', '14'), +('1', '83', '17', '102006', '63265', '14'), +('1', '83', '17', '102258', '57511', '14'), +('1', '83', '7', '102004', '59843', '14'), +('1', '83', '7', '102256', '54358', '14'), +('1', '83', '7', '83564', '39686', '14'), +('1', '83', '7', '39267', '39463', '14'), +('1', '83', '9', '67098', '155652', '14'), +('1', '83', '9', '46887', '57165', '14'), +('1', '83', '9', '53363', '51843', '14'), +('1', '83', '9', '102287', '49463', '14'), +('1', '83', '15', '102595', '88232', '14'), +('1', '83', '15', '102623', '88064', '14'), +('1', '83', '15', '102636', '86850', '14'), +('1', '83', '15', '102637', '86673', '14'), +('1', '83', '20', '102624', '115298', '14'), +('1', '83', '20', '102596', '113997', '14'), +('1', '83', '20', '102553', '102055', '14'), +('1', '83', '20', '80688', '88809', '14'), +('1', '83', '12', '53364', '74468', '14'), +('1', '83', '12', '47212', '51590', '14'), +('1', '83', '12', '102253', '51041', '14'), +('1', '83', '12', '71075', '46733', '14'), +('1', '83', '18', '102005', '61341', '14'), +('1', '83', '18', '102257', '55467', '14'), +('1', '83', '18', '83607', '44114', '14'), +('1', '83', '18', '46826', '43214', '14'), +('1', '83', '19', '76131', '70585', '14'), +('1', '83', '19', '53365', '53449', '14'), +('1', '83', '19', '102254', '51516', '14'), +('1', '83', '19', '39355', '43730', '14'), +('1', '83', '13', '102720', '236883', '14'), +('1', '83', '13', '102649', '235462', '14'), +('1', '83', '13', '102660', '233354', '14'), +('1', '83', '13', '102655', '232647', '14'), +('1', '83', '14', '102720', '236883', '14'), +('1', '83', '14', '102649', '235462', '14'), +('1', '83', '14', '102661', '233706', '14'), +('1', '83', '14', '102660', '233354', '14'), +('1', '83', '11', '102667', '152085', '14'), +('1', '83', '11', '102589', '133255', '14'), +('1', '83', '11', '80655', '106924', '14'), +('1', '83', '11', '46930', '100571', '14'), +('1', '84', '22', '12425', '0', '14'), +('1', '84', '22', '21807', '0', '14'), +('1', '84', '22', '21805', '0', '14'), +('1', '84', '22', '39342', '0', '14'), +('1', '84', '1', '102618', '86839', '14'), +('1', '84', '1', '102590', '86468', '14'), +('1', '84', '1', '102641', '85544', '14'), +('1', '84', '1', '102639', '85085', '14'), +('1', '84', '2', '70853', '59740', '14'), +('1', '84', '2', '102003', '59113', '14'), +('1', '84', '2', '102255', '53300', '14'), +('1', '84', '2', '53361', '52407', '14'), +('1', '84', '3', '102726', '94934', '14'), +('1', '84', '3', '102619', '92338', '14'), +('1', '84', '3', '102591', '91633', '14'), +('1', '84', '3', '102725', '82501', '14'), +('1', '84', '5', '102620', '90538', '14'), +('1', '84', '5', '102592', '89743', '14'), +('1', '84', '5', '102745', '82292', '14'), +('1', '84', '5', '102551', '78849', '14'), +('1', '84', '8', '102552', '102396', '14'), +('1', '84', '8', '102622', '92417', '14'), +('1', '84', '8', '102594', '91355', '14'), +('1', '84', '8', '102527', '81800', '14'), +('1', '84', '6', '102621', '92233', '14'), +('1', '84', '6', '102593', '91920', '14'), +('1', '84', '6', '80638', '83548', '14'), +('1', '84', '6', '102555', '79889', '14'), +('1', '84', '17', '83603', '68001', '14'), +('1', '84', '17', '100794', '64533', '14'), +('1', '84', '17', '102006', '63269', '14'), +('1', '84', '17', '102258', '57516', '14'), +('1', '84', '7', '102004', '59848', '14'), +('1', '84', '7', '102256', '54364', '14'), +('1', '84', '7', '83564', '39692', '14'), +('1', '84', '7', '39267', '39466', '14'), +('1', '84', '9', '67098', '157531', '14'), +('1', '84', '9', '46887', '57169', '14'), +('1', '84', '9', '53363', '51846', '14'), +('1', '84', '9', '102287', '49466', '14'), +('1', '84', '15', '102595', '88237', '14'), +('1', '84', '15', '102623', '88067', '14'), +('1', '84', '15', '102636', '86854', '14'), +('1', '84', '15', '102637', '86679', '14'), +('1', '84', '20', '102624', '115305', '14'), +('1', '84', '20', '102596', '114000', '14'), +('1', '84', '20', '102553', '102061', '14'), +('1', '84', '20', '80688', '88814', '14'), +('1', '84', '12', '53364', '74472', '14'), +('1', '84', '12', '47212', '51593', '14'), +('1', '84', '12', '102253', '51044', '14'), +('1', '84', '12', '71075', '46736', '14'), +('1', '84', '18', '102005', '61346', '14'), +('1', '84', '18', '102257', '55471', '14'), +('1', '84', '18', '83607', '44119', '14'), +('1', '84', '18', '46826', '43216', '14'), +('1', '84', '19', '76131', '70585', '14'), +('1', '84', '19', '53365', '53454', '14'), +('1', '84', '19', '102254', '51518', '14'), +('1', '84', '19', '39355', '43735', '14'), +('1', '84', '13', '102720', '237249', '14'), +('1', '84', '13', '102649', '235848', '14'), +('1', '84', '13', '102660', '233736', '14'), +('1', '84', '13', '102655', '233029', '14'), +('1', '84', '14', '102720', '237249', '14'), +('1', '84', '14', '102649', '235848', '14'), +('1', '84', '14', '102661', '234088', '14'), +('1', '84', '14', '102660', '233736', '14'), +('1', '84', '11', '102667', '152200', '14'), +('1', '84', '11', '102589', '133360', '14'), +('1', '84', '11', '80655', '107022', '14'), +('1', '84', '11', '46930', '100670', '14'), +('1', '85', '22', '39342', '0', '16'), +('1', '85', '22', '12425', '0', '16'), +('1', '85', '22', '7867', '0', '16'), +('1', '85', '22', '23597', '0', '16'), +('1', '85', '1', '111309', '166240', '16'), +('1', '85', '1', '111303', '165571', '16'), +('1', '85', '1', '111308', '165164', '16'), +('1', '85', '1', '111305', '163689', '16'), +('1', '85', '2', '94056', '104866', '16'), +('1', '85', '2', '62985', '104037', '16'), +('1', '85', '2', '89368', '99540', '16'), +('1', '85', '2', '104403', '87969', '16'), +('1', '85', '3', '111312', '165442', '16'), +('1', '85', '3', '111313', '164248', '16'), +('1', '85', '3', '111315', '164118', '16'), +('1', '85', '3', '111316', '161603', '16'), +('1', '85', '5', '111320', '163923', '16'), +('1', '85', '5', '111318', '163729', '16'), +('1', '85', '5', '111319', '161109', '16'), +('1', '85', '5', '111019', '144073', '16'), +('1', '85', '8', '111331', '166295', '16'), +('1', '85', '8', '111328', '165522', '16'), +('1', '85', '8', '111332', '161100', '16'), +('1', '85', '8', '111030', '146415', '16'), +('1', '85', '6', '111322', '164352', '16'), +('1', '85', '6', '111324', '164054', '16'), +('1', '85', '6', '111326', '161117', '16'), +('1', '85', '6', '111021', '144472', '16'), +('1', '85', '17', '56046', '110029', '16'), +('1', '85', '17', '81765', '109607', '16'), +('1', '85', '17', '56083', '108933', '16'), +('1', '85', '17', '104406', '94348', '16'), +('1', '85', '7', '94053', '105637', '16'), +('1', '85', '7', '56079', '105260', '16'), +('1', '85', '7', '89369', '100535', '16'), +('1', '85', '7', '104404', '88082', '16'), +('1', '85', '9', '67098', '159410', '16'), +('1', '85', '9', '56031', '101927', '16'), +('1', '85', '9', '62992', '101807', '16'), +('1', '85', '9', '56033', '101725', '16'), +('1', '85', '15', '111343', '165568', '16'), +('1', '85', '15', '111347', '165294', '16'), +('1', '85', '15', '111341', '165082', '16'), +('1', '85', '15', '111345', '163468', '16'), +('1', '85', '20', '111354', '190720', '16'), +('1', '85', '20', '111355', '187926', '16'), +('1', '85', '20', '111353', '187351', '16'), +('1', '85', '20', '111351', '186659', '16'), +('1', '85', '12', '81795', '103091', '16'), +('1', '85', '12', '56073', '102588', '16'), +('1', '85', '12', '89366', '97266', '16'), +('1', '85', '12', '104401', '87230', '16'), +('1', '85', '18', '62986', '107120', '16'), +('1', '85', '18', '56041', '106361', '16'), +('1', '85', '18', '62987', '106154', '16'), +('1', '85', '18', '94054', '105366', '16'), +('1', '85', '19', '62990', '105668', '16'), +('1', '85', '19', '56037', '105291', '16'), +('1', '85', '19', '56075', '104617', '16'), +('1', '85', '19', '81763', '103897', '16'), +('1', '85', '13', '111871', '384262', '16'), +('1', '85', '13', '111815', '381597', '16'), +('1', '85', '13', '111515', '363958', '16'), +('1', '85', '13', '111512', '363943', '16'), +('1', '85', '14', '111871', '384262', '16'), +('1', '85', '14', '111815', '381597', '16'), +('1', '85', '14', '111515', '363958', '16'), +('1', '85', '14', '111512', '363943', '16'), +('1', '85', '11', '111529', '237151', '16'), +('1', '85', '11', '111229', '221441', '16'), +('1', '85', '11', '106769', '168800', '16'), +('1', '85', '11', '62939', '168797', '16'), +('1', '85', '22', '12425', '0', '15'), +('1', '85', '22', '21807', '0', '15'), +('1', '85', '22', '39342', '0', '15'), +('1', '85', '22', '7867', '0', '15'), +('1', '85', '1', '107054', '121774', '15'), +('1', '85', '1', '107010', '120533', '15'), +('1', '85', '1', '107001', '120428', '15'), +('1', '85', '1', '107053', '119553', '15'), +('1', '85', '2', '94056', '104866', '15'), +('1', '85', '2', '62985', '104037', '15'), +('1', '85', '2', '89368', '99540', '15'), +('1', '85', '2', '104403', '87969', '15'), +('1', '85', '3', '107002', '123232', '15'), +('1', '85', '3', '107055', '123120', '15'), +('1', '85', '3', '107011', '122973', '15'), +('1', '85', '3', '106849', '117104', '15'), +('1', '85', '5', '107056', '121011', '15'), +('1', '85', '5', '107003', '120927', '15'), +('1', '85', '5', '107012', '120556', '15'), +('1', '85', '5', '106802', '115014', '15'), +('1', '85', '8', '106804', '139474', '15'), +('1', '85', '8', '94070', '128644', '15'), +('1', '85', '8', '106705', '126517', '15'), +('1', '85', '8', '107058', '124792', '15'), +('1', '85', '6', '106803', '137044', '15'), +('1', '85', '6', '106843', '135781', '15'), +('1', '85', '6', '107004', '123611', '15'), +('1', '85', '6', '107057', '122268', '15'), +('1', '85', '17', '56046', '110029', '15'), +('1', '85', '17', '81765', '109607', '15'), +('1', '85', '17', '56083', '108933', '15'), +('1', '85', '17', '104406', '94348', '15'), +('1', '85', '7', '94053', '105637', '15'), +('1', '85', '7', '56079', '105260', '15'), +('1', '85', '7', '89369', '100535', '15'), +('1', '85', '7', '104404', '88082', '15'), +('1', '85', '9', '67098', '159410', '15'), +('1', '85', '9', '56031', '101927', '15'), +('1', '85', '9', '62992', '101807', '15'), +('1', '85', '9', '56033', '101725', '15'), +('1', '85', '15', '107007', '122191', '15'), +('1', '85', '15', '107062', '122169', '15'), +('1', '85', '15', '107051', '120229', '15'), +('1', '85', '15', '107016', '119802', '15'), +('1', '85', '20', '107059', '146890', '15'), +('1', '85', '20', '107008', '146286', '15'), +('1', '85', '20', '107017', '145350', '15'), +('1', '85', '20', '106845', '137810', '15'), +('1', '85', '12', '81795', '103091', '15'), +('1', '85', '12', '56073', '102588', '15'), +('1', '85', '12', '89366', '97266', '15'), +('1', '85', '12', '104401', '87230', '15'), +('1', '85', '18', '62986', '107120', '15'), +('1', '85', '18', '56041', '106361', '15'), +('1', '85', '18', '62987', '106154', '15'), +('1', '85', '18', '94054', '105366', '15'), +('1', '85', '19', '62990', '105668', '15'), +('1', '85', '19', '56037', '105291', '15'), +('1', '85', '19', '56075', '104617', '15'), +('1', '85', '19', '81763', '103897', '15'), +('1', '85', '13', '106854', '289916', '15'), +('1', '85', '13', '106858', '286563', '15'), +('1', '85', '13', '106853', '285731', '15'), +('1', '85', '13', '106856', '279995', '15'), +('1', '85', '14', '106854', '289916', '15'), +('1', '85', '14', '106858', '286563', '15'), +('1', '85', '14', '106853', '285731', '15'), +('1', '85', '14', '106856', '279995', '15'), +('1', '85', '11', '106769', '168800', '15'), +('1', '85', '11', '62939', '168797', '15'), +('1', '85', '11', '102667', '152325', '15'), +('1', '85', '11', '106616', '149356', '15'), +('1', '86', '22', '39342', '0', '16'), +('1', '86', '22', '12425', '0', '16'), +('1', '86', '22', '7867', '0', '16'), +('1', '86', '22', '23597', '0', '16'), +('1', '86', '1', '111309', '166244', '16'), +('1', '86', '1', '111303', '165577', '16'), +('1', '86', '1', '111308', '165168', '16'), +('1', '86', '1', '111305', '163694', '16'), +('1', '86', '2', '94056', '104870', '16'), +('1', '86', '2', '62985', '104040', '16'), +('1', '86', '2', '89368', '99545', '16'), +('1', '86', '2', '104403', '87972', '16'), +('1', '86', '3', '111312', '165446', '16'), +('1', '86', '3', '111313', '164251', '16'), +('1', '86', '3', '111315', '164125', '16'), +('1', '86', '3', '111316', '161608', '16'), +('1', '86', '5', '111320', '163928', '16'), +('1', '86', '5', '111318', '163732', '16'), +('1', '86', '5', '111319', '161115', '16'), +('1', '86', '5', '111019', '144078', '16'), +('1', '86', '8', '111331', '166301', '16'), +('1', '86', '8', '111328', '165528', '16'), +('1', '86', '8', '111332', '161104', '16'), +('1', '86', '8', '111030', '146421', '16'), +('1', '86', '6', '111322', '164356', '16'), +('1', '86', '6', '111324', '164059', '16'), +('1', '86', '6', '111326', '161122', '16'), +('1', '86', '6', '111021', '144476', '16'), +('1', '86', '17', '56046', '110036', '16'), +('1', '86', '17', '81765', '109611', '16'), +('1', '86', '17', '56083', '108936', '16'), +('1', '86', '17', '104406', '94355', '16'), +('1', '86', '7', '94053', '105641', '16'), +('1', '86', '7', '56079', '105265', '16'), +('1', '86', '7', '89369', '100540', '16'), +('1', '86', '7', '104404', '88086', '16'), +('1', '86', '9', '67098', '161290', '16'), +('1', '86', '9', '56031', '101929', '16'), +('1', '86', '9', '62992', '101812', '16'), +('1', '86', '9', '56033', '101727', '16'), +('1', '86', '15', '111343', '165572', '16'), +('1', '86', '15', '111347', '165299', '16'), +('1', '86', '15', '111341', '165088', '16'), +('1', '86', '15', '111345', '163471', '16'), +('1', '86', '20', '111354', '190724', '16'), +('1', '86', '20', '111355', '187929', '16'), +('1', '86', '20', '111353', '187357', '16'), +('1', '86', '20', '111351', '186662', '16'), +('1', '86', '12', '81795', '103096', '16'), +('1', '86', '12', '56073', '102594', '16'), +('1', '86', '12', '89366', '97270', '16'), +('1', '86', '12', '104401', '87235', '16'), +('1', '86', '18', '62986', '107127', '16'), +('1', '86', '18', '56041', '106363', '16'), +('1', '86', '18', '62987', '106156', '16'), +('1', '86', '18', '94054', '105371', '16'), +('1', '86', '19', '62990', '105672', '16'), +('1', '86', '19', '56037', '105295', '16'), +('1', '86', '19', '56075', '104621', '16'), +('1', '86', '19', '81763', '103901', '16'), +('1', '86', '13', '111871', '384834', '16'), +('1', '86', '13', '111815', '382197', '16'), +('1', '86', '13', '111515', '364529', '16'), +('1', '86', '13', '111512', '364514', '16'), +('1', '86', '14', '111871', '384834', '16'), +('1', '86', '14', '111815', '382197', '16'), +('1', '86', '14', '111515', '364529', '16'), +('1', '86', '14', '111512', '364514', '16'), +('1', '86', '11', '111529', '237306', '16'), +('1', '86', '11', '111229', '221587', '16'), +('1', '86', '11', '106769', '168927', '16'), +('1', '86', '11', '62939', '168925', '16'), +('1', '87', '22', '39342', '0', '16'), +('1', '87', '22', '12425', '0', '16'), +('1', '87', '22', '7867', '0', '16'), +('1', '87', '22', '23597', '0', '16'), +('1', '87', '1', '111309', '166247', '16'), +('1', '87', '1', '111303', '165583', '16'), +('1', '87', '1', '111308', '165173', '16'), +('1', '87', '1', '111305', '163698', '16'), +('1', '87', '2', '94056', '104873', '16'), +('1', '87', '2', '62985', '104042', '16'), +('1', '87', '2', '89368', '99549', '16'), +('1', '87', '2', '104403', '87976', '16'), +('1', '87', '3', '111312', '165451', '16'), +('1', '87', '3', '111313', '164254', '16'), +('1', '87', '3', '111315', '164131', '16'), +('1', '87', '3', '111316', '161612', '16'), +('1', '87', '5', '111320', '163932', '16'), +('1', '87', '5', '111318', '163736', '16'), +('1', '87', '5', '111319', '161121', '16'), +('1', '87', '5', '111019', '144082', '16'), +('1', '87', '8', '111331', '166306', '16'), +('1', '87', '8', '111328', '165533', '16'), +('1', '87', '8', '111332', '161107', '16'), +('1', '87', '8', '111030', '146426', '16'), +('1', '87', '6', '111322', '164360', '16'), +('1', '87', '6', '111324', '164064', '16'), +('1', '87', '6', '111326', '161126', '16'), +('1', '87', '6', '111021', '144480', '16'), +('1', '87', '17', '56046', '110042', '16'), +('1', '87', '17', '81765', '109615', '16'), +('1', '87', '17', '56083', '108938', '16'), +('1', '87', '17', '104406', '94361', '16'), +('1', '87', '7', '94053', '105646', '16'), +('1', '87', '7', '56079', '105270', '16'), +('1', '87', '7', '89369', '100545', '16'), +('1', '87', '7', '104404', '88090', '16'), +('1', '87', '9', '67098', '163169', '16'), +('1', '87', '9', '56031', '101932', '16'), +('1', '87', '9', '62992', '101816', '16'), +('1', '87', '9', '56033', '101730', '16'), +('1', '87', '15', '111343', '165575', '16'), +('1', '87', '15', '111347', '165304', '16'), +('1', '87', '15', '111341', '165094', '16'), +('1', '87', '15', '111345', '163474', '16'), +('1', '87', '20', '111354', '190728', '16'), +('1', '87', '20', '111355', '187932', '16'), +('1', '87', '20', '111353', '187361', '16'), +('1', '87', '20', '111351', '186665', '16'), +('1', '87', '12', '81795', '103102', '16'), +('1', '87', '12', '56073', '102600', '16'), +('1', '87', '12', '89366', '97273', '16'), +('1', '87', '12', '104401', '87240', '16'), +('1', '87', '18', '62986', '107133', '16'), +('1', '87', '18', '56041', '106365', '16'), +('1', '87', '18', '62987', '106159', '16'), +('1', '87', '18', '94054', '105376', '16'), +('1', '87', '19', '62990', '105676', '16'), +('1', '87', '19', '56037', '105300', '16'), +('1', '87', '19', '56075', '104625', '16'), +('1', '87', '19', '81763', '103904', '16'), +('1', '87', '13', '111871', '385433', '16'), +('1', '87', '13', '111815', '382768', '16'), +('1', '87', '13', '111515', '365099', '16'), +('1', '87', '13', '111512', '365056', '16'), +('1', '87', '14', '111871', '385433', '16'), +('1', '87', '14', '111815', '382768', '16'), +('1', '87', '14', '111515', '365099', '16'), +('1', '87', '14', '111512', '365056', '16'), +('1', '87', '11', '111529', '237452', '16'), +('1', '87', '11', '111229', '221733', '16'), +('1', '87', '11', '62939', '169053', '16'), +('1', '87', '11', '106769', '169053', '16'), +('1', '88', '22', '39342', '0', '16'), +('1', '88', '22', '12425', '0', '16'), +('1', '88', '22', '7867', '0', '16'), +('1', '88', '22', '23597', '0', '16'), +('1', '88', '1', '111309', '166250', '16'), +('1', '88', '1', '111303', '165589', '16'), +('1', '88', '1', '111308', '165177', '16'), +('1', '88', '1', '111305', '163702', '16'), +('1', '88', '2', '94056', '104877', '16'), +('1', '88', '2', '62985', '104045', '16'), +('1', '88', '2', '89368', '99553', '16'), +('1', '88', '2', '104403', '87979', '16'), +('1', '88', '3', '111312', '165455', '16'), +('1', '88', '3', '111313', '164257', '16'), +('1', '88', '3', '111315', '164137', '16'), +('1', '88', '3', '111316', '161616', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '88', '5', '111320', '163937', '16'), +('1', '88', '5', '111318', '163739', '16'), +('1', '88', '5', '111319', '161126', '16'), +('1', '88', '5', '111019', '144087', '16'), +('1', '88', '8', '111331', '166310', '16'), +('1', '88', '8', '111328', '165538', '16'), +('1', '88', '8', '111332', '161110', '16'), +('1', '88', '8', '111030', '146430', '16'), +('1', '88', '6', '111322', '164364', '16'), +('1', '88', '6', '111324', '164068', '16'), +('1', '88', '6', '111326', '161130', '16'), +('1', '88', '6', '111021', '144484', '16'), +('1', '88', '17', '56046', '110048', '16'), +('1', '88', '17', '81765', '109619', '16'), +('1', '88', '17', '56083', '108941', '16'), +('1', '88', '17', '104406', '94368', '16'), +('1', '88', '7', '94053', '105650', '16'), +('1', '88', '7', '56079', '105275', '16'), +('1', '88', '7', '89369', '100549', '16'), +('1', '88', '7', '104404', '88094', '16'), +('1', '88', '9', '67098', '165049', '16'), +('1', '88', '9', '56031', '101935', '16'), +('1', '88', '9', '62992', '101820', '16'), +('1', '88', '9', '56033', '101732', '16'), +('1', '88', '15', '111343', '165578', '16'), +('1', '88', '15', '111347', '165309', '16'), +('1', '88', '15', '111341', '165100', '16'), +('1', '88', '15', '111345', '163478', '16'), +('1', '88', '20', '111354', '190732', '16'), +('1', '88', '20', '111355', '187935', '16'), +('1', '88', '20', '111353', '187366', '16'), +('1', '88', '20', '111351', '186667', '16'), +('1', '88', '12', '81795', '103107', '16'), +('1', '88', '12', '56073', '102606', '16'), +('1', '88', '12', '89366', '97277', '16'), +('1', '88', '12', '104401', '87244', '16'), +('1', '88', '18', '62986', '107139', '16'), +('1', '88', '18', '56041', '106367', '16'), +('1', '88', '18', '62987', '106161', '16'), +('1', '88', '18', '94054', '105381', '16'), +('1', '88', '19', '62990', '105680', '16'), +('1', '88', '19', '56037', '105304', '16'), +('1', '88', '19', '56075', '104630', '16'), +('1', '88', '19', '81763', '103908', '16'), +('1', '88', '13', '111871', '386005', '16'), +('1', '88', '13', '111815', '383340', '16'), +('1', '88', '13', '111515', '365642', '16'), +('1', '88', '13', '111512', '365627', '16'), +('1', '88', '14', '111871', '386005', '16'), +('1', '88', '14', '111815', '383340', '16'), +('1', '88', '14', '111515', '365642', '16'), +('1', '88', '14', '111512', '365627', '16'), +('1', '88', '11', '111529', '237607', '16'), +('1', '88', '11', '111229', '221879', '16'), +('1', '88', '11', '106769', '169180', '16'), +('1', '88', '11', '62939', '169170', '16'), +('1', '89', '22', '39342', '0', '16'), +('1', '89', '22', '12425', '0', '16'), +('1', '89', '22', '7867', '0', '16'), +('1', '89', '22', '23597', '0', '16'), +('1', '89', '1', '111309', '166254', '16'), +('1', '89', '1', '111303', '165595', '16'), +('1', '89', '1', '111308', '165182', '16'), +('1', '89', '1', '111305', '163707', '16'), +('1', '89', '2', '94056', '104881', '16'), +('1', '89', '2', '62985', '104047', '16'), +('1', '89', '2', '89368', '99558', '16'), +('1', '89', '2', '104403', '87983', '16'), +('1', '89', '3', '111312', '165460', '16'), +('1', '89', '3', '111313', '164261', '16'), +('1', '89', '3', '111315', '164144', '16'), +('1', '89', '3', '111316', '161621', '16'), +('1', '89', '5', '111320', '163942', '16'), +('1', '89', '5', '111318', '163742', '16'), +('1', '89', '5', '111319', '161132', '16'), +('1', '89', '5', '111019', '144092', '16'), +('1', '89', '8', '111331', '166316', '16'), +('1', '89', '8', '111328', '165543', '16'), +('1', '89', '8', '111332', '161113', '16'), +('1', '89', '8', '111030', '146436', '16'), +('1', '89', '6', '111322', '164368', '16'), +('1', '89', '6', '111324', '164074', '16'), +('1', '89', '6', '111326', '161134', '16'), +('1', '89', '6', '111021', '144488', '16'), +('1', '89', '17', '56046', '110054', '16'), +('1', '89', '17', '81765', '109623', '16'), +('1', '89', '17', '56083', '108944', '16'), +('1', '89', '17', '104406', '94374', '16'), +('1', '89', '7', '94053', '105655', '16'), +('1', '89', '7', '56079', '105280', '16'), +('1', '89', '7', '89369', '100554', '16'), +('1', '89', '7', '104404', '88098', '16'), +('1', '89', '9', '67098', '166928', '16'), +('1', '89', '9', '56031', '101938', '16'), +('1', '89', '9', '62992', '101825', '16'), +('1', '89', '9', '56033', '101735', '16'), +('1', '89', '15', '111343', '165581', '16'), +('1', '89', '15', '111347', '165315', '16'), +('1', '89', '15', '111341', '165107', '16'), +('1', '89', '15', '111345', '163481', '16'), +('1', '89', '20', '111354', '190736', '16'), +('1', '89', '20', '111355', '187938', '16'), +('1', '89', '20', '111353', '187371', '16'), +('1', '89', '20', '111351', '186670', '16'), +('1', '89', '12', '81795', '103112', '16'), +('1', '89', '12', '56073', '102613', '16'), +('1', '89', '12', '89366', '97281', '16'), +('1', '89', '12', '104401', '87249', '16'), +('1', '89', '18', '62986', '107146', '16'), +('1', '89', '18', '56041', '106369', '16'), +('1', '89', '18', '62987', '106164', '16'), +('1', '89', '18', '94054', '105386', '16'), +('1', '89', '19', '62990', '105685', '16'), +('1', '89', '19', '56037', '105308', '16'), +('1', '89', '19', '56075', '104634', '16'), +('1', '89', '19', '81763', '103911', '16'), +('1', '89', '13', '111871', '386577', '16'), +('1', '89', '13', '111815', '383939', '16'), +('1', '89', '13', '111515', '366213', '16'), +('1', '89', '13', '111512', '366198', '16'), +('1', '89', '14', '111871', '386577', '16'), +('1', '89', '14', '111815', '383939', '16'), +('1', '89', '14', '111515', '366213', '16'), +('1', '89', '14', '111512', '366198', '16'), +('1', '89', '11', '111529', '237753', '16'), +('1', '89', '11', '111229', '222015', '16'), +('1', '89', '11', '106769', '169307', '16'), +('1', '89', '11', '62939', '169298', '16'), +('1', '90', '22', '39342', '0', '17'), +('1', '90', '22', '12425', '0', '17'), +('1', '90', '22', '7867', '0', '17'), +('1', '90', '22', '23597', '0', '17'), +('1', '90', '1', '111309', '166257', '17'), +('1', '90', '1', '111303', '165600', '17'), +('1', '90', '1', '111308', '165186', '17'), +('1', '90', '1', '111305', '163711', '17'), +('1', '90', '2', '94056', '104885', '17'), +('1', '90', '2', '62985', '104050', '17'), +('1', '90', '2', '89368', '99562', '17'), +('1', '90', '2', '104403', '87986', '17'), +('1', '90', '3', '111312', '165464', '17'), +('1', '90', '3', '111313', '164264', '17'), +('1', '90', '3', '111315', '164150', '17'), +('1', '90', '3', '111316', '161625', '17'), +('1', '90', '5', '111320', '163946', '17'), +('1', '90', '5', '111318', '163746', '17'), +('1', '90', '5', '111319', '161137', '17'), +('1', '90', '5', '111019', '144096', '17'), +('1', '90', '8', '111331', '166321', '17'), +('1', '90', '8', '111328', '165548', '17'), +('1', '90', '8', '111332', '161116', '17'), +('1', '90', '8', '111030', '146441', '17'), +('1', '90', '6', '111322', '164371', '17'), +('1', '90', '6', '111324', '164078', '17'), +('1', '90', '6', '111326', '161138', '17'), +('1', '90', '6', '111021', '144491', '17'), +('1', '90', '17', '56046', '110060', '17'), +('1', '90', '17', '81765', '109626', '17'), +('1', '90', '17', '56083', '108946', '17'), +('1', '90', '17', '104406', '94381', '17'), +('1', '90', '7', '94053', '105660', '17'), +('1', '90', '7', '56079', '105285', '17'), +('1', '90', '7', '89369', '100558', '17'), +('1', '90', '7', '104404', '88101', '17'), +('1', '90', '9', '67098', '168808', '17'), +('1', '90', '9', '56031', '101940', '17'), +('1', '90', '9', '62992', '101829', '17'), +('1', '90', '9', '56033', '101737', '17'), +('1', '90', '15', '111343', '165584', '17'), +('1', '90', '15', '111347', '165320', '17'), +('1', '90', '15', '111341', '165113', '17'), +('1', '90', '15', '111345', '163484', '17'), +('1', '90', '20', '111354', '190740', '17'), +('1', '90', '20', '111355', '187941', '17'), +('1', '90', '20', '111353', '187376', '17'), +('1', '90', '20', '111351', '186673', '17'), +('1', '90', '12', '81795', '103118', '17'), +('1', '90', '12', '56073', '102619', '17'), +('1', '90', '12', '89366', '97285', '17'), +('1', '90', '12', '104401', '87254', '17'), +('1', '90', '18', '62986', '107152', '17'), +('1', '90', '18', '56041', '106371', '17'), +('1', '90', '18', '62987', '106166', '17'), +('1', '90', '18', '94054', '105390', '17'), +('1', '90', '19', '62990', '105689', '17'), +('1', '90', '19', '56037', '105312', '17'), +('1', '90', '19', '56075', '104638', '17'), +('1', '90', '19', '81763', '103915', '17'), +('1', '90', '13', '111871', '387148', '17'), +('1', '90', '13', '111815', '384510', '17'), +('1', '90', '13', '111515', '366783', '17'), +('1', '90', '13', '111512', '366769', '17'), +('1', '90', '14', '111871', '387148', '17'), +('1', '90', '14', '111815', '384510', '17'), +('1', '90', '14', '111515', '366783', '17'), +('1', '90', '14', '111512', '366769', '17'), +('1', '90', '11', '111529', '237898', '17'), +('1', '90', '11', '111229', '222161', '17'), +('1', '90', '11', '106769', '169434', '17'), +('1', '90', '11', '62939', '169426', '17'), +('1', '91', '22', '39342', '0', '17'), +('1', '91', '22', '12425', '0', '17'), +('1', '91', '22', '7867', '0', '17'), +('1', '91', '22', '23597', '0', '17'), +('1', '91', '1', '111309', '166260', '17'), +('1', '91', '1', '111303', '165606', '17'), +('1', '91', '1', '111308', '165191', '17'), +('1', '91', '1', '111305', '163716', '17'), +('1', '91', '2', '94056', '104889', '17'), +('1', '91', '2', '62985', '104053', '17'), +('1', '91', '2', '89368', '99567', '17'), +('1', '91', '2', '104403', '87990', '17'), +('1', '91', '3', '111312', '165468', '17'), +('1', '91', '3', '111313', '164268', '17'), +('1', '91', '3', '111315', '164157', '17'), +('1', '91', '3', '111316', '161629', '17'), +('1', '91', '5', '111320', '163951', '17'), +('1', '91', '5', '111318', '163749', '17'), +('1', '91', '5', '111319', '161143', '17'), +('1', '91', '5', '111019', '144101', '17'), +('1', '91', '8', '111331', '166326', '17'), +('1', '91', '8', '111328', '165553', '17'), +('1', '91', '8', '111332', '161119', '17'), +('1', '91', '8', '111030', '146446', '17'), +('1', '91', '6', '111322', '164375', '17'), +('1', '91', '6', '111324', '164083', '17'), +('1', '91', '6', '111326', '161143', '17'), +('1', '91', '6', '111021', '144495', '17'), +('1', '91', '17', '56046', '110067', '17'), +('1', '91', '17', '81765', '109630', '17'), +('1', '91', '17', '56083', '108949', '17'), +('1', '91', '17', '104406', '94387', '17'), +('1', '91', '7', '94053', '105664', '17'), +('1', '91', '7', '56079', '105290', '17'), +('1', '91', '7', '89369', '100563', '17'), +('1', '91', '7', '104404', '88105', '17'), +('1', '91', '9', '67098', '168812', '17'), +('1', '91', '9', '56031', '101943', '17'), +('1', '91', '9', '62992', '101834', '17'), +('1', '91', '9', '56033', '101740', '17'), +('1', '91', '15', '111343', '165587', '17'), +('1', '91', '15', '111347', '165325', '17'), +('1', '91', '15', '111341', '165120', '17'), +('1', '91', '15', '111345', '163488', '17'), +('1', '91', '20', '111354', '190744', '17'), +('1', '91', '20', '111355', '187944', '17'), +('1', '91', '20', '111353', '187381', '17'), +('1', '91', '20', '111351', '186676', '17'), +('1', '91', '12', '81795', '103123', '17'), +('1', '91', '12', '56073', '102625', '17'), +('1', '91', '12', '89366', '97289', '17'), +('1', '91', '12', '104401', '87259', '17'), +('1', '91', '18', '62986', '107159', '17'), +('1', '91', '18', '56041', '106373', '17'), +('1', '91', '18', '62987', '106169', '17'), +('1', '91', '18', '94054', '105395', '17'), +('1', '91', '19', '62990', '105694', '17'), +('1', '91', '19', '56037', '105317', '17'), +('1', '91', '19', '56075', '104643', '17'), +('1', '91', '19', '81763', '103918', '17'), +('1', '91', '13', '111871', '387748', '17'), +('1', '91', '13', '111815', '385082', '17'), +('1', '91', '13', '111515', '367354', '17'), +('1', '91', '13', '111512', '367340', '17'), +('1', '91', '14', '111871', '387748', '17'), +('1', '91', '14', '111815', '385082', '17'), +('1', '91', '14', '111515', '367354', '17'), +('1', '91', '14', '111512', '367340', '17'), +('1', '91', '11', '111529', '238054', '17'), +('1', '91', '11', '111229', '222307', '17'), +('1', '91', '11', '106769', '169561', '17'), +('1', '91', '11', '62939', '169553', '17'), +('1', '92', '22', '39342', '0', '17'), +('1', '92', '22', '12425', '0', '17'), +('1', '92', '22', '7867', '0', '17'), +('1', '92', '22', '23597', '0', '17'), +('1', '92', '1', '111309', '166263', '17'), +('1', '92', '1', '111303', '165612', '17'), +('1', '92', '1', '111308', '165195', '17'), +('1', '92', '1', '111305', '163720', '17'), +('1', '92', '2', '94056', '104893', '17'), +('1', '92', '2', '62985', '104055', '17'), +('1', '92', '2', '89368', '99571', '17'), +('1', '92', '2', '104403', '87993', '17'), +('1', '92', '3', '111312', '165473', '17'), +('1', '92', '3', '111313', '164271', '17'), +('1', '92', '3', '111315', '164163', '17'), +('1', '92', '3', '111316', '161633', '17'), +('1', '92', '5', '111320', '163955', '17'), +('1', '92', '5', '111318', '163752', '17'), +('1', '92', '5', '111319', '161149', '17'), +('1', '92', '5', '111019', '144105', '17'), +('1', '92', '8', '111331', '166331', '17'), +('1', '92', '8', '111328', '165558', '17'), +('1', '92', '8', '111332', '161122', '17'), +('1', '92', '8', '111030', '146451', '17'), +('1', '92', '6', '111322', '164379', '17'), +('1', '92', '6', '111324', '164088', '17'), +('1', '92', '6', '111326', '161147', '17'), +('1', '92', '6', '111021', '144499', '17'), +('1', '92', '17', '56046', '110073', '17'), +('1', '92', '17', '81765', '109634', '17'), +('1', '92', '17', '56083', '108951', '17'), +('1', '92', '17', '104406', '94394', '17'), +('1', '92', '7', '94053', '105669', '17'), +('1', '92', '7', '56079', '105295', '17'), +('1', '92', '7', '89369', '100568', '17'), +('1', '92', '7', '104404', '88109', '17'), +('1', '92', '9', '67098', '168816', '17'), +('1', '92', '9', '56031', '101946', '17'), +('1', '92', '9', '62992', '101838', '17'), +('1', '92', '9', '56033', '101742', '17'), +('1', '92', '15', '111343', '165591', '17'), +('1', '92', '15', '111347', '165330', '17'), +('1', '92', '15', '111341', '165126', '17'), +('1', '92', '15', '111345', '163491', '17'), +('1', '92', '20', '111354', '190748', '17'), +('1', '92', '20', '111355', '187947', '17'), +('1', '92', '20', '111353', '187386', '17'), +('1', '92', '20', '111351', '186678', '17'), +('1', '92', '12', '81795', '103128', '17'), +('1', '92', '12', '56073', '102631', '17'), +('1', '92', '12', '89366', '97293', '17'), +('1', '92', '12', '104401', '87264', '17'), +('1', '92', '18', '62986', '107165', '17'), +('1', '92', '18', '56041', '106374', '17'), +('1', '92', '18', '62987', '106171', '17'), +('1', '92', '18', '94054', '105400', '17'), +('1', '92', '19', '62990', '105698', '17'), +('1', '92', '19', '56037', '105321', '17'), +('1', '92', '19', '56075', '104647', '17'), +('1', '92', '19', '81763', '103921', '17'), +('1', '92', '13', '111871', '388320', '17'), +('1', '92', '13', '111815', '385681', '17'), +('1', '92', '13', '111515', '367925', '17'), +('1', '92', '13', '111512', '367882', '17'), +('1', '92', '14', '111871', '388320', '17'), +('1', '92', '14', '111815', '385681', '17'), +('1', '92', '14', '111515', '367925', '17'), +('1', '92', '14', '111512', '367882', '17'), +('1', '92', '11', '111529', '238199', '17'), +('1', '92', '11', '111229', '222453', '17'), +('1', '92', '11', '106769', '169697', '17'), +('1', '92', '11', '62939', '169671', '17'), +('1', '93', '22', '39342', '0', '17'), +('1', '93', '22', '12425', '0', '17'), +('1', '93', '22', '7867', '0', '17'), +('1', '93', '22', '23597', '0', '17'), +('1', '93', '1', '111309', '166267', '17'), +('1', '93', '1', '111303', '165618', '17'), +('1', '93', '1', '111308', '165200', '17'), +('1', '93', '1', '111305', '163724', '17'), +('1', '93', '2', '94056', '104897', '17'), +('1', '93', '2', '62985', '104058', '17'), +('1', '93', '2', '89368', '99576', '17'), +('1', '93', '2', '104403', '87997', '17'), +('1', '93', '3', '111312', '165477', '17'), +('1', '93', '3', '111313', '164274', '17'), +('1', '93', '3', '111315', '164170', '17'), +('1', '93', '3', '111316', '161638', '17'), +('1', '93', '5', '111320', '163960', '17'), +('1', '93', '5', '111318', '163756', '17'), +('1', '93', '5', '111319', '161155', '17'), +('1', '93', '5', '111019', '144110', '17'), +('1', '93', '8', '111331', '166336', '17'), +('1', '93', '8', '111328', '165563', '17'), +('1', '93', '8', '111332', '161126', '17'), +('1', '93', '8', '111030', '146456', '17'), +('1', '93', '6', '111322', '164383', '17'), +('1', '93', '6', '111324', '164093', '17'), +('1', '93', '6', '111326', '161151', '17'), +('1', '93', '6', '111021', '144503', '17'), +('1', '93', '17', '56046', '110079', '17'), +('1', '93', '17', '81765', '109638', '17'), +('1', '93', '17', '56083', '108954', '17'), +('1', '93', '17', '104406', '94400', '17'), +('1', '93', '7', '94053', '105674', '17'), +('1', '93', '7', '56079', '105301', '17'), +('1', '93', '7', '89369', '100573', '17'), +('1', '93', '7', '104404', '88113', '17'), +('1', '93', '9', '67098', '168821', '17'), +('1', '93', '9', '56031', '101949', '17'), +('1', '93', '9', '62992', '101842', '17'), +('1', '93', '9', '56033', '101745', '17'), +('1', '93', '15', '111343', '165594', '17'), +('1', '93', '15', '111347', '165336', '17'), +('1', '93', '15', '111341', '165133', '17'), +('1', '93', '15', '111345', '163494', '17'), +('1', '93', '20', '111354', '190752', '17'), +('1', '93', '20', '111355', '187951', '17'), +('1', '93', '20', '111353', '187391', '17'), +('1', '93', '20', '111351', '186681', '17'), +('1', '93', '12', '81795', '103134', '17'), +('1', '93', '12', '56073', '102638', '17'), +('1', '93', '12', '89366', '97297', '17'), +('1', '93', '12', '104401', '87269', '17'), +('1', '93', '18', '62986', '107171', '17'), +('1', '93', '18', '56041', '106376', '17'), +('1', '93', '18', '62987', '106174', '17'), +('1', '93', '18', '94054', '105405', '17'), +('1', '93', '19', '62990', '105702', '17'), +('1', '93', '19', '56037', '105326', '17'), +('1', '93', '19', '56075', '104652', '17'), +('1', '93', '19', '81763', '103925', '17'), +('1', '93', '13', '111871', '388891', '17'), +('1', '93', '13', '111815', '386253', '17'), +('1', '93', '13', '111515', '368467', '17'), +('1', '93', '13', '111512', '368453', '17'), +('1', '93', '14', '111871', '388891', '17'), +('1', '93', '14', '111815', '386253', '17'), +('1', '93', '14', '111515', '368467', '17'), +('1', '93', '14', '111512', '368453', '17'), +('1', '93', '11', '111529', '238354', '17'), +('1', '93', '11', '111229', '222599', '17'), +('1', '93', '11', '106769', '169824', '17'), +('1', '93', '11', '62939', '169799', '17'), +('1', '94', '22', '39342', '0', '17'), +('1', '94', '22', '12425', '0', '17'), +('1', '94', '22', '7867', '0', '17'), +('1', '94', '22', '23597', '0', '17'), +('1', '94', '1', '111309', '166270', '17'), +('1', '94', '1', '111303', '165624', '17'), +('1', '94', '1', '111308', '165204', '17'), +('1', '94', '1', '111305', '163729', '17'), +('1', '94', '2', '94056', '104901', '17'), +('1', '94', '2', '62985', '104060', '17'), +('1', '94', '2', '89368', '99581', '17'), +('1', '94', '2', '104403', '88000', '17'), +('1', '94', '3', '111312', '165482', '17'), +('1', '94', '3', '111313', '164278', '17'), +('1', '94', '3', '111315', '164177', '17'), +('1', '94', '3', '111316', '161642', '17'), +('1', '94', '5', '111320', '163965', '17'), +('1', '94', '5', '111318', '163759', '17'), +('1', '94', '5', '111319', '161160', '17'), +('1', '94', '5', '111019', '144115', '17'), +('1', '94', '8', '111331', '166341', '17'), +('1', '94', '8', '111328', '165568', '17'), +('1', '94', '8', '111332', '161129', '17'), +('1', '94', '8', '111030', '146461', '17'), +('1', '94', '6', '111322', '164387', '17'), +('1', '94', '6', '111324', '164098', '17'), +('1', '94', '6', '111326', '161155', '17'), +('1', '94', '6', '111021', '144507', '17'), +('1', '94', '17', '56046', '110086', '17'), +('1', '94', '17', '81765', '109642', '17'), +('1', '94', '17', '56083', '108957', '17'), +('1', '94', '17', '104406', '94407', '17'), +('1', '94', '7', '94053', '105679', '17'), +('1', '94', '7', '56079', '105306', '17'), +('1', '94', '7', '89369', '100577', '17'), +('1', '94', '7', '104404', '88117', '17'), +('1', '94', '9', '67098', '168825', '17'), +('1', '94', '9', '56031', '101952', '17'), +('1', '94', '9', '62992', '101847', '17'), +('1', '94', '9', '56033', '101747', '17'), +('1', '94', '15', '111343', '165597', '17'), +('1', '94', '15', '111347', '165341', '17'), +('1', '94', '15', '111341', '165139', '17'), +('1', '94', '15', '111345', '163498', '17'), +('1', '94', '20', '111354', '190757', '17'), +('1', '94', '20', '111355', '187954', '17'), +('1', '94', '20', '111353', '187396', '17'), +('1', '94', '20', '111351', '186684', '17'), +('1', '94', '12', '81795', '103139', '17'), +('1', '94', '12', '56073', '102644', '17'), +('1', '94', '12', '89366', '97301', '17'), +('1', '94', '12', '104401', '87273', '17'), +('1', '94', '18', '62986', '107178', '17'), +('1', '94', '18', '56041', '106378', '17'), +('1', '94', '18', '62987', '106176', '17'), +('1', '94', '18', '94054', '105410', '17'), +('1', '94', '19', '62990', '105707', '17'), +('1', '94', '19', '56037', '105330', '17'), +('1', '94', '19', '56075', '104656', '17'), +('1', '94', '19', '81763', '103929', '17'), +('1', '94', '13', '111871', '389491', '17'), +('1', '94', '13', '111815', '386824', '17'), +('1', '94', '13', '111515', '369038', '17'), +('1', '94', '13', '111512', '369024', '17'), +('1', '94', '14', '111871', '389491', '17'), +('1', '94', '14', '111815', '386824', '17'), +('1', '94', '14', '111515', '369038', '17'), +('1', '94', '14', '111512', '369024', '17'), +('1', '94', '11', '111529', '238500', '17'), +('1', '94', '11', '111229', '222736', '17'), +('1', '94', '11', '106769', '169951', '17'), +('1', '94', '11', '62939', '169927', '17'), +('1', '95', '22', '39342', '0', '18'), +('1', '95', '22', '12425', '0', '18'), +('1', '95', '22', '7867', '0', '18'), +('1', '95', '22', '23597', '0', '18'), +('1', '95', '1', '111309', '166274', '18'), +('1', '95', '1', '111303', '165630', '18'), +('1', '95', '1', '111308', '165209', '18'), +('1', '95', '1', '111305', '163733', '18'), +('1', '95', '2', '94056', '104905', '18'), +('1', '95', '2', '62985', '104063', '18'), +('1', '95', '2', '89368', '99585', '18'), +('1', '95', '2', '104403', '88004', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '95', '3', '111312', '165487', '18'), +('1', '95', '3', '111313', '164281', '18'), +('1', '95', '3', '111315', '164184', '18'), +('1', '95', '3', '111316', '161647', '18'), +('1', '95', '5', '111320', '163970', '18'), +('1', '95', '5', '111318', '163763', '18'), +('1', '95', '5', '111319', '161166', '18'), +('1', '95', '5', '111019', '144120', '18'), +('1', '95', '8', '111331', '166346', '18'), +('1', '95', '8', '111328', '165574', '18'), +('1', '95', '8', '111332', '161132', '18'), +('1', '95', '8', '111030', '146466', '18'), +('1', '95', '6', '111322', '164390', '18'), +('1', '95', '6', '111324', '164103', '18'), +('1', '95', '6', '111326', '161160', '18'), +('1', '95', '6', '111021', '144510', '18'), +('1', '95', '17', '56046', '110092', '18'), +('1', '95', '17', '81765', '109645', '18'), +('1', '95', '17', '56083', '108959', '18'), +('1', '95', '17', '104406', '94414', '18'), +('1', '95', '7', '94053', '105683', '18'), +('1', '95', '7', '56079', '105311', '18'), +('1', '95', '7', '89369', '100582', '18'), +('1', '95', '7', '104404', '88121', '18'), +('1', '95', '9', '67098', '168830', '18'), +('1', '95', '9', '56031', '101954', '18'), +('1', '95', '9', '62992', '101851', '18'), +('1', '95', '9', '56033', '101750', '18'), +('1', '95', '15', '111343', '165600', '18'), +('1', '95', '15', '111347', '165346', '18'), +('1', '95', '15', '111341', '165146', '18'), +('1', '95', '15', '111345', '163501', '18'), +('1', '95', '20', '111354', '190761', '18'), +('1', '95', '20', '111355', '187957', '18'), +('1', '95', '20', '111353', '187401', '18'), +('1', '95', '20', '111351', '186687', '18'), +('1', '95', '12', '81795', '103145', '18'), +('1', '95', '12', '56073', '102651', '18'), +('1', '95', '12', '89366', '97305', '18'), +('1', '95', '12', '104401', '87278', '18'), +('1', '95', '18', '62986', '107184', '18'), +('1', '95', '18', '56041', '106380', '18'), +('1', '95', '18', '62987', '106179', '18'), +('1', '95', '18', '94054', '105415', '18'), +('1', '95', '19', '62990', '105711', '18'), +('1', '95', '19', '56037', '105335', '18'), +('1', '95', '19', '56075', '104661', '18'), +('1', '95', '19', '81763', '103932', '18'), +('1', '95', '13', '111871', '390063', '18'), +('1', '95', '13', '111815', '387396', '18'), +('1', '95', '13', '111515', '369609', '18'), +('1', '95', '13', '111512', '369595', '18'), +('1', '95', '14', '111871', '390063', '18'), +('1', '95', '14', '111815', '387396', '18'), +('1', '95', '14', '111515', '369609', '18'), +('1', '95', '14', '111512', '369595', '18'), +('1', '95', '11', '111529', '238646', '18'), +('1', '95', '11', '111229', '222882', '18'), +('1', '95', '11', '106769', '170078', '18'), +('1', '95', '11', '62939', '170054', '18'), +('1', '96', '22', '39342', '0', '18'), +('1', '96', '22', '12425', '0', '18'), +('1', '96', '22', '7867', '0', '18'), +('1', '96', '22', '23597', '0', '18'), +('1', '96', '1', '111309', '166277', '18'), +('1', '96', '1', '111303', '165636', '18'), +('1', '96', '1', '111308', '165214', '18'), +('1', '96', '1', '111305', '163738', '18'), +('1', '96', '2', '94056', '104909', '18'), +('1', '96', '2', '62985', '104066', '18'), +('1', '96', '2', '89368', '99590', '18'), +('1', '96', '2', '104403', '88008', '18'), +('1', '96', '3', '111312', '165491', '18'), +('1', '96', '3', '111313', '164285', '18'), +('1', '96', '3', '111315', '164190', '18'), +('1', '96', '3', '111316', '161651', '18'), +('1', '96', '5', '111320', '163975', '18'), +('1', '96', '5', '111318', '163766', '18'), +('1', '96', '5', '111319', '161172', '18'), +('1', '96', '5', '111019', '144125', '18'), +('1', '96', '8', '111331', '166352', '18'), +('1', '96', '8', '111328', '165579', '18'), +('1', '96', '8', '111332', '161136', '18'), +('1', '96', '8', '111030', '146472', '18'), +('1', '96', '6', '111322', '164394', '18'), +('1', '96', '6', '111324', '164109', '18'), +('1', '96', '6', '111326', '161164', '18'), +('1', '96', '6', '111021', '144514', '18'), +('1', '96', '17', '56046', '110098', '18'), +('1', '96', '17', '81765', '109649', '18'), +('1', '96', '17', '56083', '108962', '18'), +('1', '96', '17', '104406', '94421', '18'), +('1', '96', '7', '94053', '105688', '18'), +('1', '96', '7', '56079', '105316', '18'), +('1', '96', '7', '89369', '100587', '18'), +('1', '96', '7', '104404', '88125', '18'), +('1', '96', '9', '67098', '168834', '18'), +('1', '96', '9', '56031', '101957', '18'), +('1', '96', '9', '62992', '101856', '18'), +('1', '96', '9', '56033', '101752', '18'), +('1', '96', '15', '111343', '165604', '18'), +('1', '96', '15', '111347', '165352', '18'), +('1', '96', '15', '111341', '165152', '18'), +('1', '96', '15', '111345', '163505', '18'), +('1', '96', '20', '111354', '190765', '18'), +('1', '96', '20', '111355', '187960', '18'), +('1', '96', '20', '111353', '187406', '18'), +('1', '96', '20', '111351', '186690', '18'), +('1', '96', '12', '81795', '103150', '18'), +('1', '96', '12', '56073', '102657', '18'), +('1', '96', '12', '89366', '97309', '18'), +('1', '96', '12', '104401', '87283', '18'), +('1', '96', '18', '62986', '107191', '18'), +('1', '96', '18', '56041', '106382', '18'), +('1', '96', '18', '62987', '106181', '18'), +('1', '96', '18', '94054', '105420', '18'), +('1', '96', '19', '62990', '105716', '18'), +('1', '96', '19', '56037', '105339', '18'), +('1', '96', '19', '56075', '104665', '18'), +('1', '96', '19', '81763', '103936', '18'), +('1', '96', '13', '111871', '390635', '18'), +('1', '96', '13', '111815', '387996', '18'), +('1', '96', '13', '111515', '370180', '18'), +('1', '96', '13', '111512', '370166', '18'), +('1', '96', '14', '111871', '390635', '18'), +('1', '96', '14', '111815', '387996', '18'), +('1', '96', '14', '111515', '370180', '18'), +('1', '96', '14', '111512', '370166', '18'), +('1', '96', '11', '111529', '238802', '18'), +('1', '96', '11', '111229', '223028', '18'), +('1', '96', '11', '106769', '170205', '18'), +('1', '96', '11', '62939', '170173', '18'), +('1', '97', '22', '39342', '0', '18'), +('1', '97', '22', '12425', '0', '18'), +('1', '97', '22', '7867', '0', '18'), +('1', '97', '22', '23597', '0', '18'), +('1', '97', '1', '111309', '166281', '18'), +('1', '97', '1', '111303', '165642', '18'), +('1', '97', '1', '111308', '165218', '18'), +('1', '97', '1', '111305', '163742', '18'), +('1', '97', '2', '94056', '104913', '18'), +('1', '97', '2', '62985', '104069', '18'), +('1', '97', '2', '89368', '99595', '18'), +('1', '97', '2', '104403', '88011', '18'), +('1', '97', '3', '111312', '165496', '18'), +('1', '97', '3', '111313', '164288', '18'), +('1', '97', '3', '111315', '164197', '18'), +('1', '97', '3', '111316', '161656', '18'), +('1', '97', '5', '111320', '163979', '18'), +('1', '97', '5', '111318', '163769', '18'), +('1', '97', '5', '111319', '161178', '18'), +('1', '97', '5', '111019', '144129', '18'), +('1', '97', '8', '111331', '166357', '18'), +('1', '97', '8', '111328', '165584', '18'), +('1', '97', '8', '111332', '161139', '18'), +('1', '97', '8', '111030', '146477', '18'), +('1', '97', '6', '111322', '164398', '18'), +('1', '97', '6', '111324', '164114', '18'), +('1', '97', '6', '111326', '161169', '18'), +('1', '97', '6', '111021', '144518', '18'), +('1', '97', '17', '56046', '110105', '18'), +('1', '97', '17', '81765', '109653', '18'), +('1', '97', '17', '56083', '108965', '18'), +('1', '97', '17', '104406', '94427', '18'), +('1', '97', '7', '94053', '105693', '18'), +('1', '97', '7', '56079', '105322', '18'), +('1', '97', '7', '89369', '100592', '18'), +('1', '97', '7', '104404', '88130', '18'), +('1', '97', '9', '67098', '168838', '18'), +('1', '97', '9', '56031', '101960', '18'), +('1', '97', '9', '62992', '101860', '18'), +('1', '97', '9', '56033', '101755', '18'), +('1', '97', '15', '111343', '165607', '18'), +('1', '97', '15', '111347', '165357', '18'), +('1', '97', '15', '111341', '165159', '18'), +('1', '97', '15', '111345', '163508', '18'), +('1', '97', '20', '111354', '190769', '18'), +('1', '97', '20', '111355', '187963', '18'), +('1', '97', '20', '111353', '187411', '18'), +('1', '97', '20', '111351', '186693', '18'), +('1', '97', '12', '81795', '103156', '18'), +('1', '97', '12', '56073', '102663', '18'), +('1', '97', '12', '89366', '97313', '18'), +('1', '97', '12', '104401', '87288', '18'), +('1', '97', '18', '62986', '107198', '18'), +('1', '97', '18', '56041', '106384', '18'), +('1', '97', '18', '62987', '106184', '18'), +('1', '97', '18', '94054', '105425', '18'), +('1', '97', '19', '62990', '105720', '18'), +('1', '97', '19', '56037', '105344', '18'), +('1', '97', '19', '56075', '104670', '18'), +('1', '97', '19', '81763', '103939', '18'), +('1', '97', '13', '111871', '391235', '18'), +('1', '97', '13', '111815', '388567', '18'), +('1', '97', '13', '111515', '370751', '18'), +('1', '97', '13', '111512', '370709', '18'), +('1', '97', '14', '111871', '391235', '18'), +('1', '97', '14', '111815', '388567', '18'), +('1', '97', '14', '111515', '370751', '18'), +('1', '97', '14', '111512', '370709', '18'), +('1', '97', '11', '111529', '238947', '18'), +('1', '97', '11', '111229', '223175', '18'), +('1', '97', '11', '106769', '170332', '18'), +('1', '97', '11', '62939', '170300', '18'), +('1', '98', '22', '39342', '0', '18'), +('1', '98', '22', '12425', '0', '18'), +('1', '98', '22', '7867', '0', '18'), +('1', '98', '22', '23597', '0', '18'), +('1', '98', '1', '111309', '166284', '18'), +('1', '98', '1', '111303', '165648', '18'), +('1', '98', '1', '111308', '165223', '18'), +('1', '98', '1', '111305', '163747', '18'), +('1', '98', '2', '94056', '104917', '18'), +('1', '98', '2', '62985', '104071', '18'), +('1', '98', '2', '89368', '99599', '18'), +('1', '98', '2', '104403', '88015', '18'), +('1', '98', '3', '111312', '165501', '18'), +('1', '98', '3', '111313', '164291', '18'), +('1', '98', '3', '111315', '164204', '18'), +('1', '98', '3', '111316', '161660', '18'), +('1', '98', '5', '111320', '163984', '18'), +('1', '98', '5', '111318', '163773', '18'), +('1', '98', '5', '111319', '161184', '18'), +('1', '98', '5', '111019', '144134', '18'), +('1', '98', '8', '111331', '166362', '18'), +('1', '98', '8', '111328', '165589', '18'), +('1', '98', '8', '111332', '161142', '18'), +('1', '98', '8', '111030', '146482', '18'), +('1', '98', '6', '111322', '164402', '18'), +('1', '98', '6', '111324', '164119', '18'), +('1', '98', '6', '111326', '161173', '18'), +('1', '98', '6', '111021', '144522', '18'), +('1', '98', '17', '56046', '110111', '18'), +('1', '98', '17', '81765', '109657', '18'), +('1', '98', '17', '56083', '108968', '18'), +('1', '98', '17', '104406', '94434', '18'), +('1', '98', '7', '94053', '105698', '18'), +('1', '98', '7', '56079', '105327', '18'), +('1', '98', '7', '89369', '100597', '18'), +('1', '98', '7', '104404', '88134', '18'), +('1', '98', '9', '67098', '168843', '18'), +('1', '98', '9', '56031', '101963', '18'), +('1', '98', '9', '62992', '101865', '18'), +('1', '98', '9', '56033', '101757', '18'), +('1', '98', '15', '111343', '165610', '18'), +('1', '98', '15', '111347', '165363', '18'), +('1', '98', '15', '111341', '165166', '18'), +('1', '98', '15', '111345', '163512', '18'), +('1', '98', '20', '111354', '190773', '18'), +('1', '98', '20', '111355', '187966', '18'), +('1', '98', '20', '111353', '187416', '18'), +('1', '98', '20', '111351', '186695', '18'), +('1', '98', '12', '81795', '103162', '18'), +('1', '98', '12', '56073', '102670', '18'), +('1', '98', '12', '89366', '97317', '18'), +('1', '98', '12', '104401', '87293', '18'), +('1', '98', '18', '62986', '107204', '18'), +('1', '98', '18', '56041', '106386', '18'), +('1', '98', '18', '62987', '106186', '18'), +('1', '98', '18', '94054', '105429', '18'), +('1', '98', '19', '62990', '105725', '18'), +('1', '98', '19', '56037', '105348', '18'), +('1', '98', '19', '56075', '104674', '18'), +('1', '98', '19', '81763', '103943', '18'), +('1', '98', '13', '111871', '391807', '18'), +('1', '98', '13', '111815', '389139', '18'), +('1', '98', '13', '111515', '371322', '18'), +('1', '98', '13', '111512', '371280', '18'), +('1', '98', '14', '111871', '391807', '18'), +('1', '98', '14', '111815', '389139', '18'), +('1', '98', '14', '111515', '371322', '18'), +('1', '98', '14', '111512', '371280', '18'), +('1', '98', '11', '111529', '239103', '18'), +('1', '98', '11', '111229', '223321', '18'), +('1', '98', '11', '106769', '170459', '18'), +('1', '98', '11', '62939', '170428', '18'), +('1', '99', '22', '39342', '0', '18'), +('1', '99', '22', '12425', '0', '18'), +('1', '99', '22', '7867', '0', '18'), +('1', '99', '22', '23597', '0', '18'), +('1', '99', '1', '111309', '166288', '18'), +('1', '99', '1', '111303', '165654', '18'), +('1', '99', '1', '111308', '165228', '18'), +('1', '99', '1', '111305', '163751', '18'), +('1', '99', '2', '94056', '104921', '18'), +('1', '99', '2', '62985', '104074', '18'), +('1', '99', '2', '89368', '99604', '18'), +('1', '99', '2', '104403', '88018', '18'), +('1', '99', '3', '111312', '165505', '18'), +('1', '99', '3', '111313', '164295', '18'), +('1', '99', '3', '111315', '164211', '18'), +('1', '99', '3', '111316', '161665', '18'), +('1', '99', '5', '111320', '163989', '18'), +('1', '99', '5', '111318', '163776', '18'), +('1', '99', '5', '111319', '161190', '18'), +('1', '99', '5', '111019', '144139', '18'), +('1', '99', '8', '111331', '166367', '18'), +('1', '99', '8', '111328', '165595', '18'), +('1', '99', '8', '111332', '161146', '18'), +('1', '99', '8', '111030', '146487', '18'), +('1', '99', '6', '111322', '164406', '18'), +('1', '99', '6', '111324', '164124', '18'), +('1', '99', '6', '111326', '161177', '18'), +('1', '99', '6', '111021', '144526', '18'), +('1', '99', '17', '56046', '110118', '18'), +('1', '99', '17', '81765', '109661', '18'), +('1', '99', '17', '56083', '108970', '18'), +('1', '99', '17', '104406', '94441', '18'), +('1', '99', '7', '94053', '105703', '18'), +('1', '99', '7', '56079', '105332', '18'), +('1', '99', '7', '89369', '100601', '18'), +('1', '99', '7', '104404', '88138', '18'), +('1', '99', '9', '67098', '168847', '18'), +('1', '99', '9', '56031', '101966', '18'), +('1', '99', '9', '62992', '101869', '18'), +('1', '99', '9', '56033', '101760', '18'), +('1', '99', '15', '111343', '165614', '18'), +('1', '99', '15', '111347', '165368', '18'), +('1', '99', '15', '111341', '165172', '18'), +('1', '99', '15', '111345', '163515', '18'), +('1', '99', '20', '111354', '190778', '18'), +('1', '99', '20', '111355', '187969', '18'), +('1', '99', '20', '111353', '187421', '18'), +('1', '99', '20', '111351', '186698', '18'), +('1', '99', '12', '81795', '103167', '18'), +('1', '99', '12', '56073', '102676', '18'), +('1', '99', '12', '89366', '97321', '18'), +('1', '99', '12', '104401', '87298', '18'), +('1', '99', '18', '62986', '107211', '18'), +('1', '99', '18', '56041', '106388', '18'), +('1', '99', '18', '62987', '106189', '18'), +('1', '99', '18', '94054', '105434', '18'), +('1', '99', '19', '62990', '105729', '18'), +('1', '99', '19', '56037', '105353', '18'), +('1', '99', '19', '56075', '104679', '18'), +('1', '99', '19', '81763', '103947', '18'), +('1', '99', '13', '111871', '392379', '18'), +('1', '99', '13', '111815', '389738', '18'), +('1', '99', '13', '111515', '371864', '18'), +('1', '99', '13', '111512', '371851', '18'), +('1', '99', '14', '111871', '392379', '18'), +('1', '99', '14', '111815', '389738', '18'), +('1', '99', '14', '111515', '371864', '18'), +('1', '99', '14', '111512', '371851', '18'), +('1', '99', '11', '111529', '239249', '18'), +('1', '99', '11', '111229', '223458', '18'), +('1', '99', '11', '106769', '170586', '18'), +('1', '99', '11', '62939', '170556', '18'), +('1', '100', '22', '39342', '0', '20'), +('1', '100', '22', '12425', '0', '20'), +('1', '100', '22', '7867', '0', '20'), +('1', '100', '22', '23597', '0', '20'), +('1', '100', '1', '98769', '276381', '20'), +('1', '100', '1', '111309', '166291', '20'), +('1', '100', '1', '111303', '165660', '20'), +('1', '100', '1', '111308', '165232', '20'), +('1', '100', '2', '94056', '104925', '20'), +('1', '100', '2', '62985', '104077', '20'), +('1', '100', '2', '89368', '99609', '20'), +('1', '100', '2', '104403', '88022', '20'), +('1', '100', '3', '111312', '165510', '20'), +('1', '100', '3', '111313', '164298', '20'), +('1', '100', '3', '111315', '164217', '20'), +('1', '100', '3', '111316', '161669', '20'), +('1', '100', '5', '111320', '163994', '20'), +('1', '100', '5', '111318', '163780', '20'), +('1', '100', '5', '111319', '161195', '20'), +('1', '100', '5', '111019', '144144', '20'), +('1', '100', '8', '111331', '166373', '20'), +('1', '100', '8', '111328', '165600', '20'), +('1', '100', '8', '111332', '161149', '20'), +('1', '100', '8', '111030', '146493', '20'), +('1', '100', '6', '111322', '164410', '20'), +('1', '100', '6', '111324', '164129', '20'), +('1', '100', '6', '111326', '161182', '20'), +('1', '100', '6', '111021', '144530', '20'), +('1', '100', '17', '117466', '369940', '20'), +('1', '100', '17', '56046', '110124', '20'), +('1', '100', '17', '81765', '109665', '20'), +('1', '100', '17', '56083', '108973', '20'), +('1', '100', '7', '94053', '105707', '20'), +('1', '100', '7', '56079', '105337', '20'), +('1', '100', '7', '89369', '100606', '20'), +('1', '100', '7', '104404', '88142', '20'), +('1', '100', '9', '67098', '168851', '20'), +('1', '100', '9', '56031', '101969', '20'), +('1', '100', '9', '62992', '101874', '20'), +('1', '100', '9', '56033', '101762', '20'), +('1', '100', '15', '111343', '165617', '20'), +('1', '100', '15', '111347', '165373', '20'), +('1', '100', '15', '111341', '165179', '20'), +('1', '100', '15', '111345', '163519', '20'), +('1', '100', '20', '111354', '190782', '20'), +('1', '100', '20', '111355', '187973', '20'), +('1', '100', '20', '111353', '187427', '20'), +('1', '100', '20', '111351', '186701', '20'), +('1', '100', '12', '81795', '103173', '20'), +('1', '100', '12', '56073', '102683', '20'), +('1', '100', '12', '89366', '97325', '20'), +('1', '100', '12', '104401', '87303', '20'), +('1', '100', '18', '62986', '107217', '20'), +('1', '100', '18', '56041', '106390', '20'), +('1', '100', '18', '62987', '106191', '20'), +('1', '100', '18', '94054', '105439', '20'), +('1', '100', '19', '62990', '105734', '20'), +('1', '100', '19', '56037', '105357', '20'), +('1', '100', '19', '56075', '104683', '20'), +('1', '100', '19', '81763', '103950', '20'), +('1', '100', '13', '111871', '394084', '20'), +('1', '100', '13', '111815', '391443', '20'), +('1', '100', '13', '111515', '373568', '20'), +('1', '100', '13', '111512', '373555', '20'), +('1', '100', '14', '111871', '394084', '20'), +('1', '100', '14', '111815', '391443', '20'), +('1', '100', '14', '111515', '373568', '20'), +('1', '100', '14', '111512', '373555', '20'), +('1', '100', '11', '111529', '239404', '20'), +('1', '100', '11', '111229', '223604', '20'), +('1', '100', '11', '133816', '210724', '20'), +('1', '100', '11', '106769', '170722', '20'), +('1', '100', '22', '39342', '0', '19'), +('1', '100', '22', '12425', '0', '19'), +('1', '100', '22', '7867', '0', '19'), +('1', '100', '22', '23597', '0', '19'), +('1', '100', '1', '98769', '276381', '19'), +('1', '100', '1', '111309', '166291', '19'), +('1', '100', '1', '111303', '165660', '19'), +('1', '100', '1', '111308', '165232', '19'), +('1', '100', '2', '94056', '104925', '19'), +('1', '100', '2', '62985', '104077', '19'), +('1', '100', '2', '89368', '99609', '19'), +('1', '100', '2', '104403', '88022', '19'), +('1', '100', '3', '111312', '165510', '19'), +('1', '100', '3', '111313', '164298', '19'), +('1', '100', '3', '111315', '164217', '19'), +('1', '100', '3', '111316', '161669', '19'), +('1', '100', '5', '111320', '163994', '19'), +('1', '100', '5', '111318', '163780', '19'), +('1', '100', '5', '111319', '161195', '19'), +('1', '100', '5', '111019', '144144', '19'), +('1', '100', '8', '111331', '166373', '19'), +('1', '100', '8', '111328', '165600', '19'), +('1', '100', '8', '111332', '161149', '19'), +('1', '100', '8', '111030', '146493', '19'), +('1', '100', '6', '111322', '164410', '19'), +('1', '100', '6', '111324', '164129', '19'), +('1', '100', '6', '111326', '161182', '19'), +('1', '100', '6', '111021', '144530', '19'), +('1', '100', '17', '117466', '369940', '19'), +('1', '100', '17', '56046', '110124', '19'), +('1', '100', '17', '81765', '109665', '19'), +('1', '100', '17', '56083', '108973', '19'), +('1', '100', '7', '94053', '105707', '19'), +('1', '100', '7', '56079', '105337', '19'), +('1', '100', '7', '89369', '100606', '19'), +('1', '100', '7', '104404', '88142', '19'), +('1', '100', '9', '67098', '168851', '19'), +('1', '100', '9', '56031', '101969', '19'), +('1', '100', '9', '62992', '101874', '19'), +('1', '100', '9', '56033', '101762', '19'), +('1', '100', '15', '111343', '165617', '19'), +('1', '100', '15', '111347', '165373', '19'), +('1', '100', '15', '111341', '165179', '19'), +('1', '100', '15', '111345', '163519', '19'), +('1', '100', '20', '111354', '190782', '19'), +('1', '100', '20', '111355', '187973', '19'), +('1', '100', '20', '111353', '187427', '19'), +('1', '100', '20', '111351', '186701', '19'), +('1', '100', '12', '81795', '103173', '19'), +('1', '100', '12', '56073', '102683', '19'), +('1', '100', '12', '89366', '97325', '19'), +('1', '100', '12', '104401', '87303', '19'), +('1', '100', '18', '62986', '107217', '19'), +('1', '100', '18', '56041', '106390', '19'), +('1', '100', '18', '62987', '106191', '19'), +('1', '100', '18', '94054', '105439', '19'), +('1', '100', '19', '62990', '105734', '19'), +('1', '100', '19', '56037', '105357', '19'), +('1', '100', '19', '56075', '104683', '19'), +('1', '100', '19', '81763', '103950', '19'), +('1', '100', '13', '111871', '392950', '19'), +('1', '100', '13', '111815', '390310', '19'), +('1', '100', '13', '111515', '372435', '19'), +('1', '100', '13', '111512', '372422', '19'), +('1', '100', '14', '111871', '392950', '19'), +('1', '100', '14', '111815', '390310', '19'), +('1', '100', '14', '111515', '372435', '19'), +('1', '100', '14', '111512', '372422', '19'), +('1', '100', '11', '111529', '239404', '19'), +('1', '100', '11', '111229', '223604', '19'), +('1', '100', '11', '133816', '210724', '19'), +('1', '100', '11', '106769', '170722', '19'), +('1', '101', '22', '39342', '0', '20'), +('1', '101', '22', '12425', '0', '20'), +('1', '101', '22', '7867', '0', '20'), +('1', '101', '22', '23597', '0', '20'), +('1', '101', '1', '98769', '276384', '20'), +('1', '101', '1', '111309', '166295', '20'), +('1', '101', '1', '111303', '165666', '20'), +('1', '101', '1', '111308', '165237', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '101', '2', '94056', '104930', '20'), +('1', '101', '2', '62985', '104080', '20'), +('1', '101', '2', '89368', '99614', '20'), +('1', '101', '2', '104403', '88026', '20'), +('1', '101', '3', '111312', '165515', '20'), +('1', '101', '3', '111313', '164302', '20'), +('1', '101', '3', '111315', '164225', '20'), +('1', '101', '3', '111316', '161674', '20'), +('1', '101', '5', '111320', '163999', '20'), +('1', '101', '5', '111318', '163783', '20'), +('1', '101', '5', '111319', '161202', '20'), +('1', '101', '5', '111019', '144149', '20'), +('1', '101', '8', '111331', '166378', '20'), +('1', '101', '8', '111328', '165605', '20'), +('1', '101', '8', '111332', '161152', '20'), +('1', '101', '8', '111030', '146498', '20'), +('1', '101', '6', '111322', '164414', '20'), +('1', '101', '6', '111324', '164134', '20'), +('1', '101', '6', '111326', '161186', '20'), +('1', '101', '6', '111021', '144534', '20'), +('1', '101', '17', '117466', '369945', '20'), +('1', '101', '17', '56046', '110131', '20'), +('1', '101', '17', '81765', '109669', '20'), +('1', '101', '17', '56083', '108976', '20'), +('1', '101', '7', '94053', '105712', '20'), +('1', '101', '7', '56079', '105343', '20'), +('1', '101', '7', '89369', '100611', '20'), +('1', '101', '7', '104404', '88146', '20'), +('1', '101', '9', '67098', '168856', '20'), +('1', '101', '9', '56031', '101972', '20'), +('1', '101', '9', '62992', '101879', '20'), +('1', '101', '9', '56033', '101765', '20'), +('1', '101', '15', '111343', '165620', '20'), +('1', '101', '15', '111347', '165379', '20'), +('1', '101', '15', '111341', '165186', '20'), +('1', '101', '15', '111345', '163522', '20'), +('1', '101', '20', '111354', '190786', '20'), +('1', '101', '20', '111355', '187976', '20'), +('1', '101', '20', '111353', '187432', '20'), +('1', '101', '20', '111351', '186704', '20'), +('1', '101', '12', '81795', '103179', '20'), +('1', '101', '12', '56073', '102690', '20'), +('1', '101', '12', '89366', '97330', '20'), +('1', '101', '12', '104401', '87308', '20'), +('1', '101', '18', '62986', '107225', '20'), +('1', '101', '18', '56041', '106392', '20'), +('1', '101', '18', '62987', '106194', '20'), +('1', '101', '18', '94054', '105445', '20'), +('1', '101', '19', '62990', '105739', '20'), +('1', '101', '19', '56037', '105362', '20'), +('1', '101', '19', '56075', '104688', '20'), +('1', '101', '19', '81763', '103954', '20'), +('1', '101', '13', '111871', '394684', '20'), +('1', '101', '13', '111815', '392015', '20'), +('1', '101', '13', '111515', '374139', '20'), +('1', '101', '13', '111512', '374126', '20'), +('1', '101', '14', '111871', '394684', '20'), +('1', '101', '14', '111815', '392015', '20'), +('1', '101', '14', '111515', '374139', '20'), +('1', '101', '14', '111512', '374126', '20'), +('1', '101', '11', '111529', '239550', '20'), +('1', '101', '11', '111229', '223750', '20'), +('1', '101', '11', '133816', '210728', '20'), +('1', '101', '11', '106769', '170849', '20'), +('1', '102', '22', '39342', '0', '20'), +('1', '102', '22', '12425', '0', '20'), +('1', '102', '22', '7867', '0', '20'), +('1', '102', '22', '23597', '0', '20'), +('1', '102', '1', '98769', '276388', '20'), +('1', '102', '1', '111309', '166298', '20'), +('1', '102', '1', '111303', '165672', '20'), +('1', '102', '1', '111308', '165242', '20'), +('1', '102', '2', '94056', '104934', '20'), +('1', '102', '2', '62985', '104082', '20'), +('1', '102', '2', '89368', '99618', '20'), +('1', '102', '2', '104403', '88029', '20'), +('1', '102', '3', '111312', '165520', '20'), +('1', '102', '3', '111313', '164306', '20'), +('1', '102', '3', '111315', '164231', '20'), +('1', '102', '3', '111316', '161679', '20'), +('1', '102', '5', '111320', '164004', '20'), +('1', '102', '5', '111318', '163787', '20'), +('1', '102', '5', '111319', '161208', '20'), +('1', '102', '5', '111019', '144154', '20'), +('1', '102', '8', '111331', '166384', '20'), +('1', '102', '8', '111328', '165611', '20'), +('1', '102', '8', '111332', '161156', '20'), +('1', '102', '8', '111030', '146504', '20'), +('1', '102', '6', '111322', '164418', '20'), +('1', '102', '6', '111324', '164139', '20'), +('1', '102', '6', '111326', '161191', '20'), +('1', '102', '6', '111021', '144538', '20'), +('1', '102', '17', '117466', '369951', '20'), +('1', '102', '17', '56046', '110138', '20'), +('1', '102', '17', '81765', '109673', '20'), +('1', '102', '17', '56083', '108979', '20'), +('1', '102', '7', '94053', '105717', '20'), +('1', '102', '7', '56079', '105348', '20'), +('1', '102', '7', '89369', '100616', '20'), +('1', '102', '7', '104404', '88150', '20'), +('1', '102', '9', '67098', '168860', '20'), +('1', '102', '9', '56031', '101975', '20'), +('1', '102', '9', '62992', '101883', '20'), +('1', '102', '9', '56033', '101768', '20'), +('1', '102', '15', '111343', '165624', '20'), +('1', '102', '15', '111347', '165384', '20'), +('1', '102', '15', '111341', '165192', '20'), +('1', '102', '15', '111345', '163526', '20'), +('1', '102', '20', '111354', '190790', '20'), +('1', '102', '20', '111355', '187979', '20'), +('1', '102', '20', '111353', '187437', '20'), +('1', '102', '20', '111351', '186707', '20'), +('1', '102', '12', '81795', '103184', '20'), +('1', '102', '12', '56073', '102696', '20'), +('1', '102', '12', '89366', '97334', '20'), +('1', '102', '12', '104401', '87313', '20'), +('1', '102', '18', '62986', '107231', '20'), +('1', '102', '18', '56041', '106394', '20'), +('1', '102', '18', '62987', '106197', '20'), +('1', '102', '18', '94054', '105450', '20'), +('1', '102', '19', '62990', '105743', '20'), +('1', '102', '19', '56037', '105366', '20'), +('1', '102', '19', '56075', '104692', '20'), +('1', '102', '19', '81763', '103958', '20'), +('1', '102', '13', '111871', '395256', '20'), +('1', '102', '13', '111815', '392615', '20'), +('1', '102', '13', '111515', '374710', '20'), +('1', '102', '13', '111512', '374697', '20'), +('1', '102', '14', '111871', '395256', '20'), +('1', '102', '14', '111815', '392615', '20'), +('1', '102', '14', '111515', '374710', '20'), +('1', '102', '14', '111512', '374697', '20'), +('1', '102', '11', '111529', '239696', '20'), +('1', '102', '11', '111229', '223896', '20'), +('1', '102', '11', '133816', '210732', '20'), +('1', '102', '11', '106769', '170976', '20'), +('1', '103', '22', '39342', '0', '20'), +('1', '103', '22', '12425', '0', '20'), +('1', '103', '22', '7867', '0', '20'), +('1', '103', '22', '23597', '0', '20'), +('1', '103', '1', '98769', '276392', '20'), +('1', '103', '1', '111309', '166302', '20'), +('1', '103', '1', '111303', '165679', '20'), +('1', '103', '1', '111308', '165247', '20'), +('1', '103', '2', '94056', '104938', '20'), +('1', '103', '2', '62985', '104085', '20'), +('1', '103', '2', '89368', '99623', '20'), +('1', '103', '2', '104403', '88033', '20'), +('1', '103', '3', '111312', '165525', '20'), +('1', '103', '3', '111313', '164309', '20'), +('1', '103', '3', '111315', '164239', '20'), +('1', '103', '3', '111316', '161684', '20'), +('1', '103', '5', '111320', '164009', '20'), +('1', '103', '5', '111318', '163791', '20'), +('1', '103', '5', '111319', '161214', '20'), +('1', '103', '5', '111019', '144159', '20'), +('1', '103', '8', '111331', '166389', '20'), +('1', '103', '8', '111328', '165616', '20'), +('1', '103', '8', '111332', '161159', '20'), +('1', '103', '8', '111030', '146509', '20'), +('1', '103', '6', '111322', '164422', '20'), +('1', '103', '6', '111324', '164145', '20'), +('1', '103', '6', '111326', '161195', '20'), +('1', '103', '6', '111021', '144542', '20'), +('1', '103', '17', '117466', '369957', '20'), +('1', '103', '17', '56046', '110145', '20'), +('1', '103', '17', '81765', '109677', '20'), +('1', '103', '17', '56083', '108981', '20'), +('1', '103', '7', '94053', '105722', '20'), +('1', '103', '7', '56079', '105354', '20'), +('1', '103', '7', '89369', '100621', '20'), +('1', '103', '7', '104404', '88154', '20'), +('1', '103', '9', '67098', '168865', '20'), +('1', '103', '9', '56031', '101978', '20'), +('1', '103', '9', '62992', '101888', '20'), +('1', '103', '9', '56033', '101770', '20'), +('1', '103', '15', '111343', '165627', '20'), +('1', '103', '15', '111347', '165390', '20'), +('1', '103', '15', '111341', '165199', '20'), +('1', '103', '15', '111345', '163529', '20'), +('1', '103', '20', '111354', '190795', '20'), +('1', '103', '20', '111355', '187983', '20'), +('1', '103', '20', '111353', '187443', '20'), +('1', '103', '20', '111351', '186710', '20'), +('1', '103', '12', '81795', '103190', '20'), +('1', '103', '12', '56073', '102703', '20'), +('1', '103', '12', '89366', '97338', '20'), +('1', '103', '12', '104401', '87319', '20'), +('1', '103', '18', '62986', '107238', '20'), +('1', '103', '18', '56041', '106396', '20'), +('1', '103', '18', '62987', '106199', '20'), +('1', '103', '18', '94054', '105455', '20'), +('1', '103', '19', '62990', '105748', '20'), +('1', '103', '19', '56037', '105371', '20'), +('1', '103', '19', '56075', '104697', '20'), +('1', '103', '19', '81763', '103962', '20'), +('1', '103', '13', '111871', '395828', '20'), +('1', '103', '13', '111815', '393187', '20'), +('1', '103', '13', '111515', '375281', '20'), +('1', '103', '13', '111512', '375240', '20'), +('1', '103', '14', '111871', '395828', '20'), +('1', '103', '14', '111815', '393187', '20'), +('1', '103', '14', '111515', '375281', '20'), +('1', '103', '14', '111512', '375240', '20'), +('1', '103', '11', '111529', '239851', '20'), +('1', '103', '11', '111229', '224043', '20'), +('1', '103', '11', '133816', '210736', '20'), +('1', '103', '11', '106769', '171104', '20'), +('1', '104', '22', '39342', '0', '20'), +('1', '104', '22', '12425', '0', '20'), +('1', '104', '22', '7867', '0', '20'), +('1', '104', '22', '23597', '0', '20'), +('1', '104', '1', '98769', '276395', '20'), +('1', '104', '1', '111309', '166305', '20'), +('1', '104', '1', '111303', '165685', '20'), +('1', '104', '1', '111308', '165252', '20'), +('1', '104', '2', '94056', '104942', '20'), +('1', '104', '2', '62985', '104088', '20'), +('1', '104', '2', '89368', '99628', '20'), +('1', '104', '2', '104403', '88037', '20'), +('1', '104', '3', '111312', '165529', '20'), +('1', '104', '3', '111313', '164313', '20'), +('1', '104', '3', '111315', '164245', '20'), +('1', '104', '3', '111316', '161688', '20'), +('1', '104', '5', '111320', '164014', '20'), +('1', '104', '5', '111318', '163794', '20'), +('1', '104', '5', '111319', '161220', '20'), +('1', '104', '5', '111019', '144164', '20'), +('1', '104', '8', '111331', '166394', '20'), +('1', '104', '8', '111328', '165622', '20'), +('1', '104', '8', '111332', '161163', '20'), +('1', '104', '8', '111030', '146514', '20'), +('1', '104', '6', '111322', '164426', '20'), +('1', '104', '6', '111324', '164150', '20'), +('1', '104', '6', '111326', '161200', '20'), +('1', '104', '6', '111021', '144546', '20'), +('1', '104', '17', '117466', '369962', '20'), +('1', '104', '17', '56046', '110151', '20'), +('1', '104', '17', '81765', '109681', '20'), +('1', '104', '17', '56083', '108984', '20'), +('1', '104', '7', '94053', '105727', '20'), +('1', '104', '7', '56079', '105359', '20'), +('1', '104', '7', '89369', '100626', '20'), +('1', '104', '7', '104404', '88158', '20'), +('1', '104', '9', '67098', '168869', '20'), +('1', '104', '9', '56031', '101980', '20'), +('1', '104', '9', '62992', '101892', '20'), +('1', '104', '9', '56033', '101773', '20'), +('1', '104', '15', '111343', '165631', '20'), +('1', '104', '15', '111347', '165396', '20'), +('1', '104', '15', '111341', '165206', '20'), +('1', '104', '15', '111345', '163533', '20'), +('1', '104', '20', '111354', '190799', '20'), +('1', '104', '20', '111355', '187986', '20'), +('1', '104', '20', '111353', '187448', '20'), +('1', '104', '20', '111351', '186713', '20'), +('1', '104', '12', '81795', '103196', '20'), +('1', '104', '12', '56073', '102710', '20'), +('1', '104', '12', '89366', '97342', '20'), +('1', '104', '12', '104401', '87324', '20'), +('1', '104', '18', '62986', '107245', '20'), +('1', '104', '18', '56041', '106398', '20'), +('1', '104', '18', '62987', '106202', '20'), +('1', '104', '18', '94054', '105460', '20'), +('1', '104', '19', '62990', '105752', '20'), +('1', '104', '19', '56037', '105376', '20'), +('1', '104', '19', '56075', '104702', '20'), +('1', '104', '19', '81763', '103965', '20'), +('1', '104', '13', '111871', '396428', '20'), +('1', '104', '13', '111815', '393758', '20'), +('1', '104', '13', '111515', '375852', '20'), +('1', '104', '13', '111512', '375811', '20'), +('1', '104', '14', '111871', '396428', '20'), +('1', '104', '14', '111815', '393758', '20'), +('1', '104', '14', '111515', '375852', '20'), +('1', '104', '14', '111512', '375811', '20'), +('1', '104', '11', '111529', '239997', '20'), +('1', '104', '11', '111229', '224189', '20'), +('1', '104', '11', '133816', '210740', '20'), +('1', '104', '11', '106769', '171231', '20'), +('1', '105', '22', '39342', '0', '23'), +('1', '105', '22', '12425', '0', '23'), +('1', '105', '22', '7867', '0', '23'), +('1', '105', '22', '23597', '0', '23'), +('1', '105', '1', '98769', '276399', '23'), +('1', '105', '1', '111309', '166309', '23'), +('1', '105', '1', '111303', '165691', '23'), +('1', '105', '1', '111308', '165257', '23'), +('1', '105', '2', '94056', '104946', '23'), +('1', '105', '2', '62985', '104091', '23'), +('1', '105', '2', '89368', '99633', '23'), +('1', '105', '2', '104403', '88041', '23'), +('1', '105', '3', '111312', '165534', '23'), +('1', '105', '3', '111313', '164316', '23'), +('1', '105', '3', '111315', '164252', '23'), +('1', '105', '3', '111316', '161693', '23'), +('1', '105', '5', '111320', '164019', '23'), +('1', '105', '5', '111318', '163798', '23'), +('1', '105', '5', '111319', '161226', '23'), +('1', '105', '5', '111019', '144169', '23'), +('1', '105', '8', '111331', '166400', '23'), +('1', '105', '8', '111328', '165627', '23'), +('1', '105', '8', '111332', '161166', '23'), +('1', '105', '8', '111030', '146520', '23'), +('1', '105', '6', '111322', '164430', '23'), +('1', '105', '6', '111324', '164155', '23'), +('1', '105', '6', '111326', '161204', '23'), +('1', '105', '6', '111021', '144550', '23'), +('1', '105', '17', '117466', '369968', '23'), +('1', '105', '17', '56046', '110158', '23'), +('1', '105', '17', '81765', '109685', '23'), +('1', '105', '17', '56083', '108987', '23'), +('1', '105', '7', '94053', '105732', '23'), +('1', '105', '7', '56079', '105365', '23'), +('1', '105', '7', '89369', '100631', '23'), +('1', '105', '7', '104404', '88163', '23'), +('1', '105', '9', '67098', '168874', '23'), +('1', '105', '9', '56031', '101983', '23'), +('1', '105', '9', '62992', '101897', '23'), +('1', '105', '9', '56033', '101776', '23'), +('1', '105', '15', '111343', '165634', '23'), +('1', '105', '15', '111347', '165401', '23'), +('1', '105', '15', '111341', '165213', '23'), +('1', '105', '15', '111345', '163537', '23'), +('1', '105', '20', '111354', '190804', '23'), +('1', '105', '20', '111355', '187989', '23'), +('1', '105', '20', '111353', '187453', '23'), +('1', '105', '20', '111351', '186716', '23'), +('1', '105', '12', '81795', '103202', '23'), +('1', '105', '12', '56073', '102716', '23'), +('1', '105', '12', '89366', '97346', '23'), +('1', '105', '12', '104401', '87329', '23'), +('1', '105', '18', '62986', '107252', '23'), +('1', '105', '18', '56041', '106400', '23'), +('1', '105', '18', '62987', '106205', '23'), +('1', '105', '18', '94054', '105465', '23'), +('1', '105', '19', '62990', '105757', '23'), +('1', '105', '19', '56037', '105381', '23'), +('1', '105', '19', '56075', '104706', '23'), +('1', '105', '19', '81763', '103969', '23'), +('1', '105', '13', '111871', '397000', '23'), +('1', '105', '13', '111815', '394358', '23'), +('1', '105', '13', '111515', '376395', '23'), +('1', '105', '13', '111512', '376383', '23'), +('1', '105', '14', '111871', '397000', '23'), +('1', '105', '14', '111815', '394358', '23'), +('1', '105', '14', '111515', '376395', '23'), +('1', '105', '14', '111512', '376383', '23'), +('1', '105', '11', '111529', '240153', '23'), +('1', '105', '11', '111229', '224326', '23'), +('1', '105', '11', '133816', '210744', '23'), +('1', '105', '11', '106769', '171358', '23'), +('1', '105', '22', '39342', '0', '22'), +('1', '105', '22', '12425', '0', '22'), +('1', '105', '22', '7867', '0', '22'), +('1', '105', '22', '23597', '0', '22'), +('1', '105', '1', '98769', '276399', '22'), +('1', '105', '1', '111309', '166309', '22'), +('1', '105', '1', '111303', '165691', '22'), +('1', '105', '1', '111308', '165257', '22'), +('1', '105', '2', '94056', '104946', '22'), +('1', '105', '2', '62985', '104091', '22'), +('1', '105', '2', '89368', '99633', '22'), +('1', '105', '2', '104403', '88041', '22'), +('1', '105', '3', '111312', '165534', '22'), +('1', '105', '3', '111313', '164316', '22'), +('1', '105', '3', '111315', '164252', '22'), +('1', '105', '3', '111316', '161693', '22'), +('1', '105', '5', '111320', '164019', '22'), +('1', '105', '5', '111318', '163798', '22'), +('1', '105', '5', '111319', '161226', '22'), +('1', '105', '5', '111019', '144169', '22'), +('1', '105', '8', '111331', '166400', '22'), +('1', '105', '8', '111328', '165627', '22'), +('1', '105', '8', '111332', '161166', '22'), +('1', '105', '8', '111030', '146520', '22'), +('1', '105', '6', '111322', '164430', '22'), +('1', '105', '6', '111324', '164155', '22'), +('1', '105', '6', '111326', '161204', '22'), +('1', '105', '6', '111021', '144550', '22'), +('1', '105', '17', '117466', '369968', '22'), +('1', '105', '17', '56046', '110158', '22'), +('1', '105', '17', '81765', '109685', '22'), +('1', '105', '17', '56083', '108987', '22'), +('1', '105', '7', '94053', '105732', '22'), +('1', '105', '7', '56079', '105365', '22'), +('1', '105', '7', '89369', '100631', '22'), +('1', '105', '7', '104404', '88163', '22'), +('1', '105', '9', '67098', '168874', '22'), +('1', '105', '9', '56031', '101983', '22'), +('1', '105', '9', '62992', '101897', '22'), +('1', '105', '9', '56033', '101776', '22'), +('1', '105', '15', '111343', '165634', '22'), +('1', '105', '15', '111347', '165401', '22'), +('1', '105', '15', '111341', '165213', '22'), +('1', '105', '15', '111345', '163537', '22'), +('1', '105', '20', '111354', '190804', '22'), +('1', '105', '20', '111355', '187989', '22'), +('1', '105', '20', '111353', '187453', '22'), +('1', '105', '20', '111351', '186716', '22'), +('1', '105', '12', '81795', '103202', '22'), +('1', '105', '12', '56073', '102716', '22'), +('1', '105', '12', '89366', '97346', '22'), +('1', '105', '12', '104401', '87329', '22'), +('1', '105', '18', '62986', '107252', '22'), +('1', '105', '18', '56041', '106400', '22'), +('1', '105', '18', '62987', '106205', '22'), +('1', '105', '18', '94054', '105465', '22'), +('1', '105', '19', '62990', '105757', '22'), +('1', '105', '19', '56037', '105381', '22'), +('1', '105', '19', '56075', '104706', '22'), +('1', '105', '19', '81763', '103969', '22'), +('1', '105', '13', '111871', '397000', '22'), +('1', '105', '13', '111815', '394358', '22'), +('1', '105', '13', '111515', '376395', '22'), +('1', '105', '13', '111512', '376383', '22'), +('1', '105', '14', '111871', '397000', '22'), +('1', '105', '14', '111815', '394358', '22'), +('1', '105', '14', '111515', '376395', '22'), +('1', '105', '14', '111512', '376383', '22'), +('1', '105', '11', '111529', '240153', '22'), +('1', '105', '11', '111229', '224326', '22'), +('1', '105', '11', '133816', '210744', '22'), +('1', '105', '11', '106769', '171358', '22'), +('1', '105', '22', '39342', '0', '21'), +('1', '105', '22', '12425', '0', '21'), +('1', '105', '22', '7867', '0', '21'), +('1', '105', '22', '23597', '0', '21'), +('1', '105', '1', '98769', '276399', '21'), +('1', '105', '1', '111309', '166309', '21'), +('1', '105', '1', '111303', '165691', '21'), +('1', '105', '1', '111308', '165257', '21'), +('1', '105', '2', '94056', '104946', '21'), +('1', '105', '2', '62985', '104091', '21'), +('1', '105', '2', '89368', '99633', '21'), +('1', '105', '2', '104403', '88041', '21'), +('1', '105', '3', '111312', '165534', '21'), +('1', '105', '3', '111313', '164316', '21'), +('1', '105', '3', '111315', '164252', '21'), +('1', '105', '3', '111316', '161693', '21'), +('1', '105', '5', '111320', '164019', '21'), +('1', '105', '5', '111318', '163798', '21'), +('1', '105', '5', '111319', '161226', '21'), +('1', '105', '5', '111019', '144169', '21'), +('1', '105', '8', '111331', '166400', '21'), +('1', '105', '8', '111328', '165627', '21'), +('1', '105', '8', '111332', '161166', '21'), +('1', '105', '8', '111030', '146520', '21'), +('1', '105', '6', '111322', '164430', '21'), +('1', '105', '6', '111324', '164155', '21'), +('1', '105', '6', '111326', '161204', '21'), +('1', '105', '6', '111021', '144550', '21'), +('1', '105', '17', '117466', '369968', '21'), +('1', '105', '17', '56046', '110158', '21'), +('1', '105', '17', '81765', '109685', '21'), +('1', '105', '17', '56083', '108987', '21'), +('1', '105', '7', '94053', '105732', '21'), +('1', '105', '7', '56079', '105365', '21'), +('1', '105', '7', '89369', '100631', '21'), +('1', '105', '7', '104404', '88163', '21'), +('1', '105', '9', '67098', '168874', '21'), +('1', '105', '9', '56031', '101983', '21'), +('1', '105', '9', '62992', '101897', '21'), +('1', '105', '9', '56033', '101776', '21'), +('1', '105', '15', '111343', '165634', '21'), +('1', '105', '15', '111347', '165401', '21'), +('1', '105', '15', '111341', '165213', '21'), +('1', '105', '15', '111345', '163537', '21'), +('1', '105', '20', '111354', '190804', '21'), +('1', '105', '20', '111355', '187989', '21'), +('1', '105', '20', '111353', '187453', '21'), +('1', '105', '20', '111351', '186716', '21'), +('1', '105', '12', '81795', '103202', '21'), +('1', '105', '12', '56073', '102716', '21'), +('1', '105', '12', '89366', '97346', '21'), +('1', '105', '12', '104401', '87329', '21'), +('1', '105', '18', '62986', '107252', '21'), +('1', '105', '18', '56041', '106400', '21'), +('1', '105', '18', '62987', '106205', '21'), +('1', '105', '18', '94054', '105465', '21'), +('1', '105', '19', '62990', '105757', '21'), +('1', '105', '19', '56037', '105381', '21'), +('1', '105', '19', '56075', '104706', '21'), +('1', '105', '19', '81763', '103969', '21'), +('1', '105', '13', '111871', '397000', '21'), +('1', '105', '13', '111815', '394358', '21'), +('1', '105', '13', '111515', '376395', '21'), +('1', '105', '13', '111512', '376383', '21'), +('1', '105', '14', '111871', '397000', '21'), +('1', '105', '14', '111815', '394358', '21'), +('1', '105', '14', '111515', '376395', '21'), +('1', '105', '14', '111512', '376383', '21'), +('1', '105', '11', '111529', '240153', '21'), +('1', '105', '11', '111229', '224326', '21'), +('1', '105', '11', '133816', '210744', '21'), +('1', '105', '11', '106769', '171358', '21'), +('1', '106', '22', '39342', '0', '23'), +('1', '106', '22', '12425', '0', '23'), +('1', '106', '22', '7867', '0', '23'), +('1', '106', '22', '23597', '0', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '106', '1', '98769', '276402', '23'), +('1', '106', '1', '111309', '166313', '23'), +('1', '106', '1', '111303', '165697', '23'), +('1', '106', '1', '111308', '165261', '23'), +('1', '106', '2', '94056', '104951', '23'), +('1', '106', '2', '62985', '104094', '23'), +('1', '106', '2', '89368', '99638', '23'), +('1', '106', '2', '104403', '88044', '23'), +('1', '106', '3', '111312', '165539', '23'), +('1', '106', '3', '111313', '164320', '23'), +('1', '106', '3', '111315', '164260', '23'), +('1', '106', '3', '111316', '161698', '23'), +('1', '106', '5', '111320', '164024', '23'), +('1', '106', '5', '111318', '163801', '23'), +('1', '106', '5', '111319', '161232', '23'), +('1', '106', '5', '111019', '144174', '23'), +('1', '106', '8', '111331', '166406', '23'), +('1', '106', '8', '111328', '165633', '23'), +('1', '106', '8', '111332', '161170', '23'), +('1', '106', '8', '111030', '146526', '23'), +('1', '106', '6', '111322', '164434', '23'), +('1', '106', '6', '111324', '164161', '23'), +('1', '106', '6', '111326', '161209', '23'), +('1', '106', '6', '111021', '144554', '23'), +('1', '106', '17', '117466', '369974', '23'), +('1', '106', '17', '56046', '110165', '23'), +('1', '106', '17', '81765', '109689', '23'), +('1', '106', '17', '56083', '108990', '23'), +('1', '106', '7', '94053', '105737', '23'), +('1', '106', '7', '56079', '105370', '23'), +('1', '106', '7', '89369', '100636', '23'), +('1', '106', '7', '104404', '88167', '23'), +('1', '106', '9', '67098', '168879', '23'), +('1', '106', '9', '56031', '101986', '23'), +('1', '106', '9', '62992', '101902', '23'), +('1', '106', '9', '56033', '101778', '23'), +('1', '106', '15', '111343', '165638', '23'), +('1', '106', '15', '111347', '165407', '23'), +('1', '106', '15', '111341', '165220', '23'), +('1', '106', '15', '111345', '163540', '23'), +('1', '106', '20', '111354', '190808', '23'), +('1', '106', '20', '111355', '187992', '23'), +('1', '106', '20', '111353', '187459', '23'), +('1', '106', '20', '111351', '186719', '23'), +('1', '106', '12', '81795', '103207', '23'), +('1', '106', '12', '56073', '102723', '23'), +('1', '106', '12', '89366', '97351', '23'), +('1', '106', '12', '104401', '87334', '23'), +('1', '106', '18', '62986', '107259', '23'), +('1', '106', '18', '56041', '106402', '23'), +('1', '106', '18', '62987', '106207', '23'), +('1', '106', '18', '94054', '105470', '23'), +('1', '106', '19', '62990', '105762', '23'), +('1', '106', '19', '56037', '105385', '23'), +('1', '106', '19', '56075', '104711', '23'), +('1', '106', '19', '81763', '103973', '23'), +('1', '106', '13', '111871', '397572', '23'), +('1', '106', '13', '111815', '394930', '23'), +('1', '106', '13', '111515', '376966', '23'), +('1', '106', '13', '111512', '376954', '23'), +('1', '106', '14', '111871', '397572', '23'), +('1', '106', '14', '111815', '394930', '23'), +('1', '106', '14', '111515', '376966', '23'), +('1', '106', '14', '111512', '376954', '23'), +('1', '106', '11', '111529', '240299', '23'), +('1', '106', '11', '111229', '224472', '23'), +('1', '106', '11', '133816', '210748', '23'), +('1', '106', '11', '106769', '171485', '23'), +('1', '107', '22', '39342', '0', '23'), +('1', '107', '22', '12425', '0', '23'), +('1', '107', '22', '7867', '0', '23'), +('1', '107', '22', '23597', '0', '23'), +('1', '107', '1', '98769', '276406', '23'), +('1', '107', '1', '111309', '166316', '23'), +('1', '107', '1', '111303', '165704', '23'), +('1', '107', '1', '111308', '165266', '23'), +('1', '107', '2', '94056', '104955', '23'), +('1', '107', '2', '62985', '104096', '23'), +('1', '107', '2', '89368', '99643', '23'), +('1', '107', '2', '104403', '88048', '23'), +('1', '107', '3', '111312', '165544', '23'), +('1', '107', '3', '111313', '164324', '23'), +('1', '107', '3', '111315', '164267', '23'), +('1', '107', '3', '111316', '161702', '23'), +('1', '107', '5', '111320', '164029', '23'), +('1', '107', '5', '111318', '163805', '23'), +('1', '107', '5', '111319', '161238', '23'), +('1', '107', '5', '111019', '144179', '23'), +('1', '107', '8', '111331', '166411', '23'), +('1', '107', '8', '111328', '165638', '23'), +('1', '107', '8', '111332', '161173', '23'), +('1', '107', '8', '111030', '146531', '23'), +('1', '107', '6', '111322', '164439', '23'), +('1', '107', '6', '111324', '164166', '23'), +('1', '107', '6', '111326', '161213', '23'), +('1', '107', '6', '111021', '144559', '23'), +('1', '107', '17', '117466', '369979', '23'), +('1', '107', '17', '56046', '110172', '23'), +('1', '107', '17', '81765', '109694', '23'), +('1', '107', '17', '56083', '108993', '23'), +('1', '107', '7', '94053', '105743', '23'), +('1', '107', '7', '56079', '105376', '23'), +('1', '107', '7', '89369', '100641', '23'), +('1', '107', '7', '104404', '88171', '23'), +('1', '107', '9', '67098', '168883', '23'), +('1', '107', '9', '56031', '101990', '23'), +('1', '107', '9', '62992', '101907', '23'), +('1', '107', '9', '56033', '101781', '23'), +('1', '107', '15', '111343', '165641', '23'), +('1', '107', '15', '111347', '165413', '23'), +('1', '107', '15', '111341', '165227', '23'), +('1', '107', '15', '111345', '163544', '23'), +('1', '107', '20', '111354', '190813', '23'), +('1', '107', '20', '111355', '187996', '23'), +('1', '107', '20', '111353', '187464', '23'), +('1', '107', '20', '111351', '186722', '23'), +('1', '107', '12', '81795', '103213', '23'), +('1', '107', '12', '56073', '102730', '23'), +('1', '107', '12', '89366', '97355', '23'), +('1', '107', '12', '104401', '87339', '23'), +('1', '107', '18', '62986', '107266', '23'), +('1', '107', '18', '56041', '106404', '23'), +('1', '107', '18', '62987', '106210', '23'), +('1', '107', '18', '94054', '105476', '23'), +('1', '107', '19', '62990', '105767', '23'), +('1', '107', '19', '56037', '105390', '23'), +('1', '107', '19', '56075', '104716', '23'), +('1', '107', '19', '81763', '103977', '23'), +('1', '107', '13', '111871', '398173', '23'), +('1', '107', '13', '111815', '395502', '23'), +('1', '107', '13', '111515', '377537', '23'), +('1', '107', '13', '111512', '377525', '23'), +('1', '107', '14', '111871', '398173', '23'), +('1', '107', '14', '111815', '395502', '23'), +('1', '107', '14', '111515', '377537', '23'), +('1', '107', '14', '111512', '377525', '23'), +('1', '107', '11', '111529', '240445', '23'), +('1', '107', '11', '111229', '224619', '23'), +('1', '107', '11', '133816', '210753', '23'), +('1', '107', '11', '106769', '171612', '23'), +('1', '108', '22', '39342', '0', '23'), +('1', '108', '22', '12425', '0', '23'), +('1', '108', '22', '7867', '0', '23'), +('1', '108', '22', '23597', '0', '23'), +('1', '108', '1', '98769', '276410', '23'), +('1', '108', '1', '111309', '166320', '23'), +('1', '108', '1', '111303', '165710', '23'), +('1', '108', '1', '111308', '165271', '23'), +('1', '108', '2', '94056', '104959', '23'), +('1', '108', '2', '62985', '104099', '23'), +('1', '108', '2', '89368', '99648', '23'), +('1', '108', '2', '104403', '88052', '23'), +('1', '108', '3', '111312', '165549', '23'), +('1', '108', '3', '111313', '164327', '23'), +('1', '108', '3', '111315', '164274', '23'), +('1', '108', '3', '111316', '161707', '23'), +('1', '108', '5', '111320', '164034', '23'), +('1', '108', '5', '111318', '163809', '23'), +('1', '108', '5', '111319', '161245', '23'), +('1', '108', '5', '111019', '144184', '23'), +('1', '108', '8', '111331', '166417', '23'), +('1', '108', '8', '111328', '165644', '23'), +('1', '108', '8', '111332', '161177', '23'), +('1', '108', '8', '111030', '146537', '23'), +('1', '108', '6', '111322', '164443', '23'), +('1', '108', '6', '111324', '164172', '23'), +('1', '108', '6', '111326', '161218', '23'), +('1', '108', '6', '111021', '144563', '23'), +('1', '108', '17', '117466', '369985', '23'), +('1', '108', '17', '56046', '110178', '23'), +('1', '108', '17', '81765', '109698', '23'), +('1', '108', '17', '56083', '108996', '23'), +('1', '108', '7', '94053', '105748', '23'), +('1', '108', '7', '56079', '105381', '23'), +('1', '108', '7', '89369', '100646', '23'), +('1', '108', '7', '104404', '88176', '23'), +('1', '108', '9', '67098', '168888', '23'), +('1', '108', '9', '56031', '101993', '23'), +('1', '108', '9', '62992', '101912', '23'), +('1', '108', '9', '56033', '101784', '23'), +('1', '108', '15', '111343', '165645', '23'), +('1', '108', '15', '111347', '165419', '23'), +('1', '108', '15', '111341', '165234', '23'), +('1', '108', '15', '111345', '163548', '23'), +('1', '108', '20', '111354', '190817', '23'), +('1', '108', '20', '111355', '187999', '23'), +('1', '108', '20', '111353', '187469', '23'), +('1', '108', '20', '111351', '186725', '23'), +('1', '108', '12', '81795', '103219', '23'), +('1', '108', '12', '56073', '102737', '23'), +('1', '108', '12', '89366', '97359', '23'), +('1', '108', '12', '104401', '87345', '23'), +('1', '108', '18', '62986', '107273', '23'), +('1', '108', '18', '56041', '106406', '23'), +('1', '108', '18', '62987', '106213', '23'), +('1', '108', '18', '94054', '105481', '23'), +('1', '108', '19', '62990', '105772', '23'), +('1', '108', '19', '56037', '105395', '23'), +('1', '108', '19', '56075', '104721', '23'), +('1', '108', '19', '81763', '103981', '23'), +('1', '108', '13', '111871', '398745', '23'), +('1', '108', '13', '111815', '396073', '23'), +('1', '108', '13', '111515', '378109', '23'), +('1', '108', '13', '111512', '378068', '23'), +('1', '108', '14', '111871', '398745', '23'), +('1', '108', '14', '111815', '396073', '23'), +('1', '108', '14', '111515', '378109', '23'), +('1', '108', '14', '111512', '378068', '23'), +('1', '108', '11', '111529', '240601', '23'), +('1', '108', '11', '111229', '224765', '23'), +('1', '108', '11', '133816', '210757', '23'), +('1', '108', '11', '106769', '171740', '23'), +('1', '109', '22', '39342', '0', '23'), +('1', '109', '22', '12425', '0', '23'), +('1', '109', '22', '7867', '0', '23'), +('1', '109', '22', '23597', '0', '23'), +('1', '109', '1', '98769', '276413', '23'), +('1', '109', '1', '111309', '166324', '23'), +('1', '109', '1', '111303', '165717', '23'), +('1', '109', '1', '111308', '165276', '23'), +('1', '109', '2', '94056', '104964', '23'), +('1', '109', '2', '62985', '104102', '23'), +('1', '109', '2', '89368', '99653', '23'), +('1', '109', '2', '104403', '88056', '23'), +('1', '109', '3', '111312', '165554', '23'), +('1', '109', '3', '111313', '164331', '23'), +('1', '109', '3', '111315', '164281', '23'), +('1', '109', '3', '111316', '161712', '23'), +('1', '109', '5', '111320', '164039', '23'), +('1', '109', '5', '111318', '163812', '23'), +('1', '109', '5', '111319', '161251', '23'), +('1', '109', '5', '111019', '144189', '23'), +('1', '109', '8', '111331', '166422', '23'), +('1', '109', '8', '111328', '165650', '23'), +('1', '109', '8', '111332', '161180', '23'), +('1', '109', '8', '111030', '146542', '23'), +('1', '109', '6', '111322', '164447', '23'), +('1', '109', '6', '111324', '164177', '23'), +('1', '109', '6', '111326', '161223', '23'), +('1', '109', '6', '111021', '144567', '23'), +('1', '109', '17', '117466', '369991', '23'), +('1', '109', '17', '56046', '110185', '23'), +('1', '109', '17', '81765', '109702', '23'), +('1', '109', '17', '56083', '108999', '23'), +('1', '109', '7', '94053', '105753', '23'), +('1', '109', '7', '56079', '105387', '23'), +('1', '109', '7', '89369', '100652', '23'), +('1', '109', '7', '104404', '88180', '23'), +('1', '109', '9', '67098', '168892', '23'), +('1', '109', '9', '56031', '101996', '23'), +('1', '109', '9', '62992', '101916', '23'), +('1', '109', '9', '56033', '101787', '23'), +('1', '109', '15', '111343', '165648', '23'), +('1', '109', '15', '111347', '165424', '23'), +('1', '109', '15', '111341', '165241', '23'), +('1', '109', '15', '111345', '163551', '23'), +('1', '109', '20', '111354', '190822', '23'), +('1', '109', '20', '111355', '188002', '23'), +('1', '109', '20', '111353', '187475', '23'), +('1', '109', '20', '111351', '186728', '23'), +('1', '109', '12', '81795', '103225', '23'), +('1', '109', '12', '56073', '102744', '23'), +('1', '109', '12', '89366', '97364', '23'), +('1', '109', '12', '104401', '87350', '23'), +('1', '109', '18', '62986', '107280', '23'), +('1', '109', '18', '56041', '106408', '23'), +('1', '109', '18', '62987', '106216', '23'), +('1', '109', '18', '94054', '105486', '23'), +('1', '109', '19', '62990', '105776', '23'), +('1', '109', '19', '56037', '105400', '23'), +('1', '109', '19', '56075', '104726', '23'), +('1', '109', '19', '81763', '103984', '23'), +('1', '109', '13', '111871', '399317', '23'), +('1', '109', '13', '111815', '396674', '23'), +('1', '109', '13', '111515', '378680', '23'), +('1', '109', '13', '111512', '378640', '23'), +('1', '109', '14', '111871', '399317', '23'), +('1', '109', '14', '111815', '396674', '23'), +('1', '109', '14', '111515', '378680', '23'), +('1', '109', '14', '111512', '378640', '23'), +('1', '109', '11', '111529', '240747', '23'), +('1', '109', '11', '111229', '224912', '23'), +('1', '109', '11', '133816', '210761', '23'), +('1', '109', '11', '106769', '171876', '23'), +('1', '110', '22', '7867', '0', '25'), +('1', '110', '22', '39342', '0', '25'), +('1', '110', '22', '12425', '0', '25'), +('1', '110', '22', '23597', '0', '25'), +('1', '110', '1', '98769', '276417', '25'), +('1', '110', '1', '111309', '166327', '25'), +('1', '110', '1', '111303', '165723', '25'), +('1', '110', '1', '111308', '165281', '25'), +('1', '110', '2', '94056', '104968', '25'), +('1', '110', '2', '62985', '104105', '25'), +('1', '110', '2', '89368', '99658', '25'), +('1', '110', '2', '104403', '88060', '25'), +('1', '110', '3', '111312', '165559', '25'), +('1', '110', '3', '111313', '164335', '25'), +('1', '110', '3', '111315', '164288', '25'), +('1', '110', '3', '111316', '161717', '25'), +('1', '110', '5', '111320', '164044', '25'), +('1', '110', '5', '111318', '163816', '25'), +('1', '110', '5', '111319', '161257', '25'), +('1', '110', '5', '111019', '144194', '25'), +('1', '110', '8', '111331', '166428', '25'), +('1', '110', '8', '111328', '165655', '25'), +('1', '110', '8', '111332', '161184', '25'), +('1', '110', '8', '111030', '146548', '25'), +('1', '110', '6', '111322', '164451', '25'), +('1', '110', '6', '111324', '164183', '25'), +('1', '110', '6', '111326', '161227', '25'), +('1', '110', '6', '111021', '144571', '25'), +('1', '110', '17', '117466', '369997', '25'), +('1', '110', '17', '56046', '110192', '25'), +('1', '110', '17', '81765', '109706', '25'), +('1', '110', '17', '56083', '109001', '25'), +('1', '110', '7', '94053', '105758', '25'), +('1', '110', '7', '56079', '105393', '25'), +('1', '110', '7', '89369', '100657', '25'), +('1', '110', '7', '104404', '88184', '25'), +('1', '110', '9', '67098', '168897', '25'), +('1', '110', '9', '56031', '101999', '25'), +('1', '110', '9', '62992', '101921', '25'), +('1', '110', '9', '62984', '101790', '25'), +('1', '110', '15', '111343', '165652', '25'), +('1', '110', '15', '111347', '165430', '25'), +('1', '110', '15', '111341', '165248', '25'), +('1', '110', '15', '111345', '163555', '25'), +('1', '110', '20', '111354', '190826', '25'), +('1', '110', '20', '111355', '188006', '25'), +('1', '110', '20', '111353', '187480', '25'), +('1', '110', '20', '111351', '186731', '25'), +('1', '110', '12', '81795', '103231', '25'), +('1', '110', '12', '56073', '102751', '25'), +('1', '110', '12', '89366', '97368', '25'), +('1', '110', '12', '104401', '87355', '25'), +('1', '110', '18', '62986', '107287', '25'), +('1', '110', '18', '56041', '106411', '25'), +('1', '110', '18', '62987', '106218', '25'), +('1', '110', '18', '94054', '105492', '25'), +('1', '110', '19', '62990', '105781', '25'), +('1', '110', '19', '56037', '105405', '25'), +('1', '110', '19', '56075', '104730', '25'), +('1', '110', '19', '81763', '103988', '25'), +('1', '110', '13', '111871', '401022', '25'), +('1', '110', '13', '111815', '398379', '25'), +('1', '110', '13', '111515', '380356', '25'), +('1', '110', '13', '111512', '380344', '25'), +('1', '110', '14', '111871', '401022', '25'), +('1', '110', '14', '111815', '398379', '25'), +('1', '110', '14', '111515', '380356', '25'), +('1', '110', '14', '111512', '380344', '25'), +('1', '110', '11', '85213', '245859', '25'), +('1', '110', '11', '111529', '240903', '25'), +('1', '110', '11', '111229', '225049', '25'), +('1', '110', '11', '133816', '210765', '25'), +('1', '110', '22', '7867', '0', '24'), +('1', '110', '22', '39342', '0', '24'), +('1', '110', '22', '12425', '0', '24'), +('1', '110', '22', '23597', '0', '24'), +('1', '110', '1', '98769', '276417', '24'), +('1', '110', '1', '111309', '166327', '24'), +('1', '110', '1', '111303', '165723', '24'), +('1', '110', '1', '111308', '165281', '24'), +('1', '110', '2', '94056', '104968', '24'), +('1', '110', '2', '62985', '104105', '24'), +('1', '110', '2', '89368', '99658', '24'), +('1', '110', '2', '104403', '88060', '24'), +('1', '110', '3', '111312', '165559', '24'), +('1', '110', '3', '111313', '164335', '24'), +('1', '110', '3', '111315', '164288', '24'), +('1', '110', '3', '111316', '161717', '24'), +('1', '110', '5', '111320', '164044', '24'), +('1', '110', '5', '111318', '163816', '24'), +('1', '110', '5', '111319', '161257', '24'), +('1', '110', '5', '111019', '144194', '24'), +('1', '110', '8', '111331', '166428', '24'), +('1', '110', '8', '111328', '165655', '24'), +('1', '110', '8', '111332', '161184', '24'), +('1', '110', '8', '111030', '146548', '24'), +('1', '110', '6', '111322', '164451', '24'), +('1', '110', '6', '111324', '164183', '24'), +('1', '110', '6', '111326', '161227', '24'), +('1', '110', '6', '111021', '144571', '24'), +('1', '110', '17', '117466', '369997', '24'), +('1', '110', '17', '56046', '110192', '24'), +('1', '110', '17', '81765', '109706', '24'), +('1', '110', '17', '56083', '109001', '24'), +('1', '110', '7', '94053', '105758', '24'), +('1', '110', '7', '56079', '105393', '24'), +('1', '110', '7', '89369', '100657', '24'), +('1', '110', '7', '104404', '88184', '24'), +('1', '110', '9', '67098', '168897', '24'), +('1', '110', '9', '56031', '101999', '24'), +('1', '110', '9', '62992', '101921', '24'), +('1', '110', '9', '62984', '101790', '24'), +('1', '110', '15', '111343', '165652', '24'), +('1', '110', '15', '111347', '165430', '24'), +('1', '110', '15', '111341', '165248', '24'), +('1', '110', '15', '111345', '163555', '24'), +('1', '110', '20', '111354', '190826', '24'), +('1', '110', '20', '111355', '188006', '24'), +('1', '110', '20', '111353', '187480', '24'), +('1', '110', '20', '111351', '186731', '24'), +('1', '110', '12', '81795', '103231', '24'), +('1', '110', '12', '56073', '102751', '24'), +('1', '110', '12', '89366', '97368', '24'), +('1', '110', '12', '104401', '87355', '24'), +('1', '110', '18', '62986', '107287', '24'), +('1', '110', '18', '56041', '106411', '24'), +('1', '110', '18', '62987', '106218', '24'), +('1', '110', '18', '94054', '105492', '24'), +('1', '110', '19', '62990', '105781', '24'), +('1', '110', '19', '56037', '105405', '24'), +('1', '110', '19', '56075', '104730', '24'), +('1', '110', '19', '81763', '103988', '24'), +('1', '110', '13', '111871', '401022', '24'), +('1', '110', '13', '111815', '398379', '24'), +('1', '110', '13', '111515', '380356', '24'), +('1', '110', '13', '111512', '380344', '24'), +('1', '110', '14', '111871', '401022', '24'), +('1', '110', '14', '111815', '398379', '24'), +('1', '110', '14', '111515', '380356', '24'), +('1', '110', '14', '111512', '380344', '24'), +('1', '110', '11', '85213', '245859', '24'), +('1', '110', '11', '111529', '240903', '24'), +('1', '110', '11', '111229', '225049', '24'), +('1', '110', '11', '133816', '210765', '24'), +('1', '111', '22', '7867', '0', '25'), +('1', '111', '22', '39342', '0', '25'), +('1', '111', '22', '12425', '0', '25'), +('1', '111', '22', '23597', '0', '25'), +('1', '111', '1', '98769', '276421', '25'), +('1', '111', '1', '111309', '166331', '25'), +('1', '111', '1', '111303', '165729', '25'), +('1', '111', '1', '111308', '165286', '25'), +('1', '111', '2', '94056', '104972', '25'), +('1', '111', '2', '62985', '104108', '25'), +('1', '111', '2', '89368', '99663', '25'), +('1', '111', '2', '104403', '88064', '25'), +('1', '111', '3', '111312', '165564', '25'), +('1', '111', '3', '111313', '164338', '25'), +('1', '111', '3', '111315', '164296', '25'), +('1', '111', '3', '111316', '161722', '25'), +('1', '111', '5', '111320', '164049', '25'), +('1', '111', '5', '111318', '163820', '25'), +('1', '111', '5', '111319', '161263', '25'), +('1', '111', '5', '111019', '144199', '25'), +('1', '111', '8', '111331', '166434', '25'), +('1', '111', '8', '111328', '165661', '25'), +('1', '111', '8', '111332', '161187', '25'), +('1', '111', '8', '111030', '146554', '25'), +('1', '111', '6', '111322', '164455', '25'), +('1', '111', '6', '111324', '164188', '25'), +('1', '111', '6', '111326', '161232', '25'), +('1', '111', '6', '111021', '144575', '25'), +('1', '111', '17', '117466', '370002', '25'), +('1', '111', '17', '56046', '110199', '25'), +('1', '111', '17', '81765', '109710', '25'), +('1', '111', '17', '56083', '109004', '25'), +('1', '111', '7', '94053', '105763', '25'), +('1', '111', '7', '56079', '105398', '25'), +('1', '111', '7', '89369', '100662', '25'), +('1', '111', '7', '104404', '88189', '25'), +('1', '111', '9', '67098', '168902', '25'), +('1', '111', '9', '56031', '102002', '25'), +('1', '111', '9', '62992', '101926', '25'), +('1', '111', '9', '62984', '101798', '25'), +('1', '111', '15', '111343', '165655', '25'), +('1', '111', '15', '111347', '165436', '25'), +('1', '111', '15', '111341', '165255', '25'), +('1', '111', '15', '111345', '163559', '25'), +('1', '111', '20', '111354', '190830', '25'), +('1', '111', '20', '111355', '188009', '25'), +('1', '111', '20', '111353', '187486', '25'), +('1', '111', '20', '111351', '186734', '25'), +('1', '111', '12', '81795', '103237', '25'), +('1', '111', '12', '56073', '102758', '25'), +('1', '111', '12', '89366', '97372', '25'), +('1', '111', '12', '104401', '87361', '25'), +('1', '111', '18', '62986', '107294', '25'), +('1', '111', '18', '56041', '106413', '25'), +('1', '111', '18', '62987', '106221', '25'), +('1', '111', '18', '94054', '105497', '25'), +('1', '111', '19', '62990', '105786', '25'), +('1', '111', '19', '56037', '105409', '25'), +('1', '111', '19', '56075', '104735', '25'), +('1', '111', '19', '81763', '103992', '25'), +('1', '111', '13', '111871', '401623', '25'), +('1', '111', '13', '111815', '398951', '25'), +('1', '111', '13', '111515', '380927', '25'), +('1', '111', '13', '111512', '380916', '25'), +('1', '111', '14', '111871', '401623', '25'), +('1', '111', '14', '111815', '398951', '25'), +('1', '111', '14', '111515', '380927', '25'), +('1', '111', '14', '111512', '380916', '25'), +('1', '111', '11', '85213', '245863', '25'), +('1', '111', '11', '111529', '241049', '25'), +('1', '111', '11', '111229', '225195', '25'), +('1', '111', '11', '133816', '210769', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('1', '112', '22', '7867', '0', '25'), +('1', '112', '22', '39342', '0', '25'), +('1', '112', '22', '12425', '0', '25'), +('1', '112', '22', '23597', '0', '25'), +('1', '112', '1', '98769', '276424', '25'), +('1', '112', '1', '111309', '166335', '25'), +('1', '112', '1', '111303', '165736', '25'), +('1', '112', '1', '111308', '165291', '25'), +('1', '112', '2', '94056', '104977', '25'), +('1', '112', '2', '62985', '104111', '25'), +('1', '112', '2', '89368', '99668', '25'), +('1', '112', '2', '104403', '88068', '25'), +('1', '112', '3', '111312', '165569', '25'), +('1', '112', '3', '111313', '164342', '25'), +('1', '112', '3', '111315', '164303', '25'), +('1', '112', '3', '111316', '161726', '25'), +('1', '112', '5', '111320', '164055', '25'), +('1', '112', '5', '111318', '163823', '25'), +('1', '112', '5', '111319', '161270', '25'), +('1', '112', '5', '111019', '144205', '25'), +('1', '112', '8', '111331', '166439', '25'), +('1', '112', '8', '111328', '165666', '25'), +('1', '112', '8', '111332', '161191', '25'), +('1', '112', '8', '111030', '146559', '25'), +('1', '112', '6', '111322', '164459', '25'), +('1', '112', '6', '111324', '164194', '25'), +('1', '112', '6', '111326', '161237', '25'), +('1', '112', '6', '111021', '144579', '25'), +('1', '112', '17', '117466', '370008', '25'), +('1', '112', '17', '56046', '110206', '25'), +('1', '112', '17', '81765', '109714', '25'), +('1', '112', '17', '56083', '109007', '25'), +('1', '112', '7', '94053', '105768', '25'), +('1', '112', '7', '56079', '105404', '25'), +('1', '112', '7', '89369', '100667', '25'), +('1', '112', '7', '104404', '88193', '25'), +('1', '112', '9', '67098', '168906', '25'), +('1', '112', '9', '56031', '102005', '25'), +('1', '112', '9', '62992', '101931', '25'), +('1', '112', '9', '62984', '101805', '25'), +('1', '112', '15', '111343', '165659', '25'), +('1', '112', '15', '111347', '165442', '25'), +('1', '112', '15', '111341', '165262', '25'), +('1', '112', '15', '111345', '163562', '25'), +('1', '112', '20', '111354', '190835', '25'), +('1', '112', '20', '111355', '188013', '25'), +('1', '112', '20', '111353', '187491', '25'), +('1', '112', '20', '111351', '186737', '25'), +('1', '112', '12', '81795', '103243', '25'), +('1', '112', '12', '56073', '102765', '25'), +('1', '112', '12', '89366', '97377', '25'), +('1', '112', '12', '104401', '87366', '25'), +('1', '112', '18', '62986', '107301', '25'), +('1', '112', '18', '56041', '106415', '25'), +('1', '112', '18', '62987', '106224', '25'), +('1', '112', '18', '94054', '105502', '25'), +('1', '112', '19', '62990', '105791', '25'), +('1', '112', '19', '56037', '105414', '25'), +('1', '112', '19', '56075', '104740', '25'), +('1', '112', '19', '81763', '103996', '25'), +('1', '112', '13', '111871', '402195', '25'), +('1', '112', '13', '111815', '399551', '25'), +('1', '112', '13', '111515', '381498', '25'), +('1', '112', '13', '111512', '381487', '25'), +('1', '112', '14', '111871', '402195', '25'), +('1', '112', '14', '111815', '399551', '25'), +('1', '112', '14', '111515', '381498', '25'), +('1', '112', '14', '111512', '381487', '25'), +('1', '112', '11', '85213', '245866', '25'), +('1', '112', '11', '111529', '241204', '25'), +('1', '112', '11', '111229', '225342', '25'), +('1', '112', '11', '133816', '210773', '25'), +('1', '113', '22', '7867', '0', '25'), +('1', '113', '22', '39342', '0', '25'), +('1', '113', '22', '12425', '0', '25'), +('1', '113', '22', '23597', '0', '25'), +('1', '113', '1', '98769', '276428', '25'), +('1', '113', '1', '111309', '166338', '25'), +('1', '113', '1', '111303', '165742', '25'), +('1', '113', '1', '111308', '165296', '25'), +('1', '113', '2', '94056', '104981', '25'), +('1', '113', '2', '62985', '104114', '25'), +('1', '113', '2', '89368', '99672', '25'), +('1', '113', '2', '104403', '88071', '25'), +('1', '113', '3', '111312', '165574', '25'), +('1', '113', '3', '111313', '164346', '25'), +('1', '113', '3', '111315', '164310', '25'), +('1', '113', '3', '111316', '161731', '25'), +('1', '113', '5', '111320', '164060', '25'), +('1', '113', '5', '111318', '163827', '25'), +('1', '113', '5', '111319', '161276', '25'), +('1', '113', '5', '111019', '144210', '25'), +('1', '113', '8', '111331', '166445', '25'), +('1', '113', '8', '111328', '165672', '25'), +('1', '113', '8', '111332', '161194', '25'), +('1', '113', '8', '111030', '146565', '25'), +('1', '113', '6', '111322', '164463', '25'), +('1', '113', '6', '111324', '164199', '25'), +('1', '113', '6', '111326', '161241', '25'), +('1', '113', '6', '111021', '144583', '25'), +('1', '113', '17', '117466', '370014', '25'), +('1', '113', '17', '56046', '110213', '25'), +('1', '113', '17', '81765', '109718', '25'), +('1', '113', '17', '56083', '109010', '25'), +('1', '113', '7', '94053', '105773', '25'), +('1', '113', '7', '56079', '105409', '25'), +('1', '113', '7', '89369', '100672', '25'), +('1', '113', '7', '104404', '88197', '25'), +('1', '113', '9', '67098', '168911', '25'), +('1', '113', '9', '56031', '102008', '25'), +('1', '113', '9', '62992', '101936', '25'), +('1', '113', '9', '62984', '101812', '25'), +('1', '113', '15', '111343', '165662', '25'), +('1', '113', '15', '111347', '165447', '25'), +('1', '113', '15', '111341', '165269', '25'), +('1', '113', '15', '111345', '163566', '25'), +('1', '113', '20', '111354', '190839', '25'), +('1', '113', '20', '111355', '188016', '25'), +('1', '113', '20', '111353', '187497', '25'), +('1', '113', '20', '111351', '186740', '25'), +('1', '113', '12', '81795', '103249', '25'), +('1', '113', '12', '56073', '102771', '25'), +('1', '113', '12', '89366', '97381', '25'), +('1', '113', '12', '104401', '87371', '25'), +('1', '113', '18', '62986', '107308', '25'), +('1', '113', '18', '56041', '106417', '25'), +('1', '113', '18', '62987', '106226', '25'), +('1', '113', '18', '94054', '105507', '25'), +('1', '113', '19', '62990', '105796', '25'), +('1', '113', '19', '56037', '105419', '25'), +('1', '113', '19', '56075', '104745', '25'), +('1', '113', '19', '81763', '104000', '25'), +('1', '113', '13', '111871', '402767', '25'), +('1', '113', '13', '111815', '400122', '25'), +('1', '113', '13', '111515', '382069', '25'), +('1', '113', '13', '111512', '382030', '25'), +('1', '113', '14', '111871', '402767', '25'), +('1', '113', '14', '111815', '400122', '25'), +('1', '113', '14', '111515', '382069', '25'), +('1', '113', '14', '111512', '382030', '25'), +('1', '113', '11', '85213', '245870', '25'), +('1', '113', '11', '111529', '241350', '25'), +('1', '113', '11', '111229', '225488', '25'), +('1', '113', '11', '133816', '210778', '25'), +('1', '114', '22', '7867', '0', '25'), +('1', '114', '22', '39342', '0', '25'), +('1', '114', '22', '12425', '0', '25'), +('1', '114', '22', '23597', '0', '25'), +('1', '114', '1', '98769', '276432', '25'), +('1', '114', '1', '111309', '166342', '25'), +('1', '114', '1', '111303', '165749', '25'), +('1', '114', '1', '111308', '165301', '25'), +('1', '114', '2', '94056', '104985', '25'), +('1', '114', '2', '62985', '104117', '25'), +('1', '114', '2', '89368', '99678', '25'), +('1', '114', '2', '104403', '88075', '25'), +('1', '114', '3', '111312', '165579', '25'), +('1', '114', '3', '111313', '164350', '25'), +('1', '114', '3', '111315', '164318', '25'), +('1', '114', '3', '111316', '161736', '25'), +('1', '114', '5', '111320', '164065', '25'), +('1', '114', '5', '111318', '163831', '25'), +('1', '114', '5', '111319', '161282', '25'), +('1', '114', '5', '111019', '144215', '25'), +('1', '114', '8', '111331', '166451', '25'), +('1', '114', '8', '111328', '165678', '25'), +('1', '114', '8', '111332', '161198', '25'), +('1', '114', '8', '111030', '146571', '25'), +('1', '114', '6', '111322', '164468', '25'), +('1', '114', '6', '111324', '164205', '25'), +('1', '114', '6', '111326', '161246', '25'), +('1', '114', '6', '111021', '144588', '25'), +('1', '114', '17', '117466', '370020', '25'), +('1', '114', '17', '56046', '110220', '25'), +('1', '114', '17', '81765', '109723', '25'), +('1', '114', '17', '56083', '109013', '25'), +('1', '114', '7', '94053', '105779', '25'), +('1', '114', '7', '56079', '105415', '25'), +('1', '114', '7', '89369', '100677', '25'), +('1', '114', '7', '104404', '88202', '25'), +('1', '114', '9', '67098', '168916', '25'), +('1', '114', '9', '56031', '102011', '25'), +('1', '114', '9', '62992', '101941', '25'), +('1', '114', '9', '62984', '101820', '25'), +('1', '114', '15', '111343', '165666', '25'), +('1', '114', '15', '111347', '165454', '25'), +('1', '114', '15', '111341', '165277', '25'), +('1', '114', '15', '111345', '163570', '25'), +('1', '114', '20', '111354', '190844', '25'), +('1', '114', '20', '111355', '188019', '25'), +('1', '114', '20', '111353', '187502', '25'), +('1', '114', '20', '111351', '186744', '25'), +('1', '114', '12', '81795', '103255', '25'), +('1', '114', '12', '56073', '102779', '25'), +('1', '114', '12', '89366', '97385', '25'), +('1', '114', '12', '104401', '87377', '25'), +('1', '114', '18', '62986', '107316', '25'), +('1', '114', '18', '56041', '106419', '25'), +('1', '114', '18', '62987', '106229', '25'), +('1', '114', '18', '94054', '105513', '25'), +('1', '114', '19', '62990', '105801', '25'), +('1', '114', '19', '56037', '105424', '25'), +('1', '114', '19', '56075', '104750', '25'), +('1', '114', '19', '81763', '104004', '25'), +('1', '114', '13', '111871', '403368', '25'), +('1', '114', '13', '111815', '400695', '25'), +('1', '114', '13', '111515', '382641', '25'), +('1', '114', '13', '111512', '382602', '25'), +('1', '114', '14', '111871', '403368', '25'), +('1', '114', '14', '111815', '400695', '25'), +('1', '114', '14', '111515', '382641', '25'), +('1', '114', '14', '111512', '382602', '25'), +('1', '114', '11', '85213', '245874', '25'), +('1', '114', '11', '111529', '241497', '25'), +('1', '114', '11', '111229', '225635', '25'), +('1', '114', '11', '133816', '210782', '25'), +('1', '115', '22', '7867', '0', '26'), +('1', '115', '22', '39342', '0', '26'), +('1', '115', '22', '12425', '0', '26'), +('1', '115', '22', '23597', '0', '26'), +('1', '115', '1', '98769', '276436', '26'), +('1', '115', '1', '111309', '166346', '26'), +('1', '115', '1', '111303', '165755', '26'), +('1', '115', '1', '111308', '165306', '26'), +('1', '115', '2', '94056', '104990', '26'), +('1', '115', '2', '62985', '104120', '26'), +('1', '115', '2', '89368', '99683', '26'), +('1', '115', '2', '104403', '88079', '26'), +('1', '115', '3', '111312', '165584', '26'), +('1', '115', '3', '111313', '164353', '26'), +('1', '115', '3', '111315', '164325', '26'), +('1', '115', '3', '111316', '161741', '26'), +('1', '115', '5', '111320', '164070', '26'), +('1', '115', '5', '111318', '163835', '26'), +('1', '115', '5', '111319', '161289', '26'), +('1', '115', '5', '111019', '144220', '26'), +('1', '115', '8', '111331', '166456', '26'), +('1', '115', '8', '111328', '165683', '26'), +('1', '115', '8', '111332', '161201', '26'), +('1', '115', '8', '111030', '146576', '26'), +('1', '115', '6', '111322', '164472', '26'), +('1', '115', '6', '111324', '164210', '26'), +('1', '115', '6', '111326', '161251', '26'), +('1', '115', '6', '111021', '144592', '26'), +('1', '115', '17', '117466', '370026', '26'), +('1', '115', '17', '56046', '110227', '26'), +('1', '115', '17', '81765', '109727', '26'), +('1', '115', '17', '56083', '109016', '26'), +('1', '115', '7', '94053', '105784', '26'), +('1', '115', '7', '56079', '105421', '26'), +('1', '115', '7', '89369', '100683', '26'), +('1', '115', '7', '104404', '88206', '26'), +('1', '115', '9', '67098', '168921', '26'), +('1', '115', '9', '56031', '102014', '26'), +('1', '115', '9', '62992', '101945', '26'), +('1', '115', '9', '62984', '101828', '26'), +('1', '115', '15', '111343', '165669', '26'), +('1', '115', '15', '111347', '165459', '26'), +('1', '115', '15', '111341', '165284', '26'), +('1', '115', '15', '111345', '163574', '26'), +('1', '115', '20', '111354', '190849', '26'), +('1', '115', '20', '111355', '188023', '26'), +('1', '115', '20', '111353', '187508', '26'), +('1', '115', '20', '111351', '186747', '26'), +('1', '115', '12', '81795', '103261', '26'), +('1', '115', '12', '56073', '102786', '26'), +('1', '115', '12', '89366', '97390', '26'), +('1', '115', '12', '104401', '87382', '26'), +('1', '115', '18', '62986', '107323', '26'), +('1', '115', '18', '56041', '106421', '26'), +('1', '115', '18', '62987', '106232', '26'), +('1', '115', '18', '94054', '105518', '26'), +('1', '115', '19', '62990', '105806', '26'), +('1', '115', '19', '56037', '105429', '26'), +('1', '115', '19', '56075', '104755', '26'), +('1', '115', '19', '81763', '104008', '26'), +('1', '115', '13', '111871', '403940', '26'), +('1', '115', '13', '111815', '401295', '26'), +('1', '115', '13', '111515', '383212', '26'), +('1', '115', '13', '111512', '383173', '26'), +('1', '115', '14', '111871', '403940', '26'), +('1', '115', '14', '111815', '401295', '26'), +('1', '115', '14', '111515', '383212', '26'), +('1', '115', '14', '111512', '383173', '26'), +('1', '115', '11', '85213', '245878', '26'), +('1', '115', '11', '111529', '241652', '26'), +('1', '115', '11', '111229', '225781', '26'), +('1', '115', '11', '133816', '210786', '26'), +('2', '1', '22', '9246', '0', '0'), +('2', '1', '22', '10323', '0', '0'), +('2', '1', '22', '44492', '0', '0'), +('2', '1', '22', '13101', '0', '0'), +('2', '1', '1', '14702', '3750', '0'), +('2', '1', '1', '14701', '2862', '0'), +('2', '1', '1', '30361', '2640', '0'), +('2', '1', '1', '10321', '1000', '0'), +('2', '1', '2', '10143', '5368', '0'), +('2', '1', '2', '30363', '3700', '0'), +('2', '1', '2', '3000', '2534', '0'), +('2', '1', '2', '2294', '2064', '0'), +('2', '1', '3', '2295', '1042', '0'), +('2', '1', '3', '14706', '990', '0'), +('2', '1', '3', '14705', '990', '0'), +('2', '1', '3', '2282', '318', '0'), +('2', '1', '5', '14703', '6050', '0'), +('2', '1', '5', '14700', '3318', '0'), +('2', '1', '5', '30362', '3140', '0'), +('2', '1', '5', '10055', '2780', '0'), +('2', '1', '8', '11603', '8419', '0'), +('2', '1', '8', '2349', '3554', '0'), +('2', '1', '8', '1363', '2510', '0'), +('2', '1', '8', '2287', '1539', '0'), +('2', '1', '6', '2924', '5886', '0'), +('2', '1', '6', '1557', '5310', '0'), +('2', '1', '6', '27717', '3714', '0'), +('2', '1', '6', '1401', '2174', '0'), +('2', '1', '17', '2285', '9415', '0'), +('2', '1', '17', '4882', '3105', '0'), +('2', '1', '17', '1891', '666', '0'), +('2', '1', '17', '4309', '412', '0'), +('2', '1', '7', '1362', '2624', '0'), +('2', '1', '7', '1321', '1746', '0'), +('2', '1', '7', '2289', '1379', '0'), +('2', '1', '7', '4883', '311', '0'), +('2', '1', '9', '4884', '2060', '0'), +('2', '1', '9', '4344', '2051', '0'), +('2', '1', '9', '10408', '2002', '0'), +('2', '1', '9', '14650', '1662', '0'), +('2', '1', '15', '10150', '3004', '0'), +('2', '1', '15', '10163', '2300', '0'), +('2', '1', '15', '14651', '2224', '0'), +('2', '1', '15', '30360', '1600', '0'), +('2', '1', '20', '11666', '8289', '0'), +('2', '1', '20', '2742', '5069', '0'), +('2', '1', '20', '2288', '4478', '0'), +('2', '1', '20', '2345', '1112', '0'), +('2', '1', '12', '2291', '3830', '0'), +('2', '1', '12', '2923', '3074', '0'), +('2', '1', '12', '20655', '2626', '0'), +('2', '1', '12', '2336', '1012', '0'), +('2', '1', '18', '4410', '1142', '0'), +('2', '1', '18', '2292', '889', '0'), +('2', '1', '18', '4886', '418', '0'), +('2', '1', '18', '2461', '241', '0'), +('2', '1', '19', '1368', '2016', '0'), +('2', '1', '19', '68239', '1960', '0'), +('2', '1', '19', '2293', '1271', '0'), +('2', '1', '19', '4837', '1084', '0'), +('2', '1', '13', '11691', '7844', '0'), +('2', '1', '13', '27718', '5623', '0'), +('2', '1', '13', '10333', '5300', '0'), +('2', '1', '13', '27719', '3927', '0'), +('2', '1', '14', '27716', '6862', '0'), +('2', '1', '14', '10333', '5300', '0'), +('2', '1', '14', '10334', '3503', '0'), +('2', '1', '14', '9427', '3028', '0'), +('2', '1', '11', '14762', '2204', '0'), +('2', '1', '11', '20677', '450', '0'), +('2', '1', '11', '13390', '150', '0'), +('2', '1', '11', '9246', '133', '0'), +('2', '2', '22', '9246', '0', '0'), +('2', '2', '22', '10323', '0', '0'), +('2', '2', '22', '44492', '0', '0'), +('2', '2', '22', '13101', '0', '0'), +('2', '2', '1', '14702', '3750', '0'), +('2', '2', '1', '14701', '2862', '0'), +('2', '2', '1', '30361', '2640', '0'), +('2', '2', '1', '10321', '1000', '0'), +('2', '2', '2', '10143', '5368', '0'), +('2', '2', '2', '30363', '3700', '0'), +('2', '2', '2', '3000', '2534', '0'), +('2', '2', '2', '2294', '2088', '0'), +('2', '2', '3', '2295', '1066', '0'), +('2', '2', '3', '14705', '990', '0'), +('2', '2', '3', '14706', '990', '0'), +('2', '2', '3', '11052', '362', '0'), +('2', '2', '5', '14703', '6050', '0'), +('2', '2', '5', '14700', '3318', '0'), +('2', '2', '5', '30362', '3140', '0'), +('2', '2', '5', '10055', '2780', '0'), +('2', '2', '8', '11603', '8528', '0'), +('2', '2', '8', '2349', '3554', '0'), +('2', '2', '8', '1363', '2510', '0'), +('2', '2', '8', '2287', '1541', '0'), +('2', '2', '6', '2924', '5946', '0'), +('2', '2', '6', '1557', '5310', '0'), +('2', '2', '6', '27717', '3861', '0'), +('2', '2', '6', '1401', '2174', '0'), +('2', '2', '17', '2285', '9463', '0'), +('2', '2', '17', '4882', '3291', '0'), +('2', '2', '17', '1891', '666', '0'), +('2', '2', '17', '4309', '412', '0'), +('2', '2', '7', '1362', '2624', '0'), +('2', '2', '7', '1321', '1746', '0'), +('2', '2', '7', '2289', '1427', '0'), +('2', '2', '7', '4883', '311', '0'), +('2', '2', '9', '4884', '2060', '0'), +('2', '2', '9', '4344', '2051', '0'), +('2', '2', '9', '10408', '2002', '0'), +('2', '2', '9', '14650', '1662', '0'), +('2', '2', '15', '10150', '3004', '0'), +('2', '2', '15', '10163', '2300', '0'), +('2', '2', '15', '14651', '2224', '0'), +('2', '2', '15', '30360', '1600', '0'), +('2', '2', '20', '11666', '8291', '0'), +('2', '2', '20', '2742', '5072', '0'), +('2', '2', '20', '2288', '4478', '0'), +('2', '2', '20', '2345', '1112', '0'), +('2', '2', '12', '2291', '3830', '0'), +('2', '2', '12', '2923', '3074', '0'), +('2', '2', '12', '20655', '2651', '0'), +('2', '2', '12', '2336', '1012', '0'), +('2', '2', '18', '4410', '1142', '0'), +('2', '2', '18', '2292', '938', '0'), +('2', '2', '18', '4886', '527', '0'), +('2', '2', '18', '2461', '289', '0'), +('2', '2', '19', '1368', '2016', '0'), +('2', '2', '19', '68239', '1996', '0'), +('2', '2', '19', '2293', '1308', '0'), +('2', '2', '19', '4837', '1145', '0'), +('2', '2', '13', '11691', '8025', '0'), +('2', '2', '13', '27718', '5744', '0'), +('2', '2', '13', '10333', '5300', '0'), +('2', '2', '13', '27719', '4019', '0'), +('2', '2', '14', '27716', '6970', '0'), +('2', '2', '14', '10333', '5300', '0'), +('2', '2', '14', '10334', '3503', '0'), +('2', '2', '14', '9427', '3028', '0'), +('2', '2', '11', '14762', '2204', '0'), +('2', '2', '11', '20677', '450', '0'), +('2', '2', '11', '9246', '254', '0'), +('2', '2', '11', '13390', '150', '0'), +('2', '3', '22', '9246', '0', '0'), +('2', '3', '22', '10323', '0', '0'), +('2', '3', '22', '44492', '0', '0'), +('2', '3', '22', '13101', '0', '0'), +('2', '3', '1', '14702', '3750', '0'), +('2', '3', '1', '14701', '2862', '0'), +('2', '3', '1', '30361', '2640', '0'), +('2', '3', '1', '10321', '1000', '0'), +('2', '3', '2', '10143', '5368', '0'), +('2', '3', '2', '30363', '3700', '0'), +('2', '3', '2', '3000', '2534', '0'), +('2', '3', '2', '2294', '2112', '0'), +('2', '3', '3', '2295', '1091', '0'), +('2', '3', '3', '14705', '990', '0'), +('2', '3', '3', '14706', '990', '0'), +('2', '3', '3', '11052', '544', '0'), +('2', '3', '5', '14703', '6050', '0'), +('2', '3', '5', '14700', '3318', '0'), +('2', '3', '5', '30362', '3140', '0'), +('2', '3', '5', '10055', '2780', '0'), +('2', '3', '8', '11603', '8637', '0'), +('2', '3', '8', '2349', '3554', '0'), +('2', '3', '8', '1363', '2510', '0'), +('2', '3', '8', '2287', '1543', '0'), +('2', '3', '6', '2924', '6007', '0'), +('2', '3', '6', '1557', '5310', '0'), +('2', '3', '6', '27717', '4009', '0'), +('2', '3', '6', '1401', '2174', '0'), +('2', '3', '17', '2285', '9511', '0'), +('2', '3', '17', '4882', '3476', '0'), +('2', '3', '17', '1891', '666', '0'), +('2', '3', '17', '4342', '489', '0'), +('2', '3', '7', '1362', '2624', '0'), +('2', '3', '7', '1321', '1746', '0'), +('2', '3', '7', '2289', '1475', '0'), +('2', '3', '7', '4883', '311', '0'), +('2', '3', '9', '4884', '2060', '0'), +('2', '3', '9', '4344', '2051', '0'), +('2', '3', '9', '10408', '2002', '0'), +('2', '3', '9', '14650', '1662', '0'), +('2', '3', '15', '10150', '3004', '0'), +('2', '3', '15', '10163', '2300', '0'), +('2', '3', '15', '14651', '2224', '0'), +('2', '3', '15', '30360', '1600', '0'), +('2', '3', '20', '11666', '8293', '0'), +('2', '3', '20', '2742', '5076', '0'), +('2', '3', '20', '2288', '4478', '0'), +('2', '3', '20', '2345', '1112', '0'), +('2', '3', '12', '2291', '3830', '0'), +('2', '3', '12', '2923', '3074', '0'), +('2', '3', '12', '20655', '2676', '0'), +('2', '3', '12', '2336', '1012', '0'), +('2', '3', '18', '4410', '1142', '0'), +('2', '3', '18', '2292', '986', '0'), +('2', '3', '18', '4886', '636', '0'), +('2', '3', '18', '2461', '337', '0'), +('2', '3', '19', '68239', '2032', '0'), +('2', '3', '19', '1368', '2016', '0'), +('2', '3', '19', '2293', '1344', '0'), +('2', '3', '19', '4837', '1205', '0'), +('2', '3', '13', '11691', '8207', '0'), +('2', '3', '13', '27718', '5865', '0'), +('2', '3', '13', '10333', '5300', '0'), +('2', '3', '13', '27719', '4111', '0'), +('2', '3', '14', '27716', '7079', '0'), +('2', '3', '14', '10333', '5300', '0'), +('2', '3', '14', '10334', '3503', '0'), +('2', '3', '14', '9427', '3028', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '3', '11', '14762', '2204', '0'), +('2', '3', '11', '20677', '450', '0'), +('2', '3', '11', '9246', '374', '0'), +('2', '3', '11', '13390', '150', '0'), +('2', '4', '22', '9246', '0', '0'), +('2', '4', '22', '10323', '0', '0'), +('2', '4', '22', '44492', '0', '0'), +('2', '4', '22', '13101', '0', '0'), +('2', '4', '1', '14702', '3750', '0'), +('2', '4', '1', '14701', '2862', '0'), +('2', '4', '1', '30361', '2640', '0'), +('2', '4', '1', '10321', '1000', '0'), +('2', '4', '2', '10143', '5368', '0'), +('2', '4', '2', '30363', '3700', '0'), +('2', '4', '2', '3000', '2534', '0'), +('2', '4', '2', '2294', '2137', '0'), +('2', '4', '3', '2295', '1115', '0'), +('2', '4', '3', '14706', '990', '0'), +('2', '4', '3', '14705', '990', '0'), +('2', '4', '3', '11052', '725', '0'), +('2', '4', '5', '14703', '6050', '0'), +('2', '4', '5', '14700', '3318', '0'), +('2', '4', '5', '30362', '3140', '0'), +('2', '4', '5', '10055', '2780', '0'), +('2', '4', '8', '11603', '8745', '0'), +('2', '4', '8', '2349', '3554', '0'), +('2', '4', '8', '1363', '2510', '0'), +('2', '4', '8', '2287', '1546', '0'), +('2', '4', '6', '2924', '6067', '0'), +('2', '4', '6', '1557', '5310', '0'), +('2', '4', '6', '27717', '4156', '0'), +('2', '4', '6', '1401', '2174', '0'), +('2', '4', '17', '2285', '9560', '0'), +('2', '4', '17', '4882', '3662', '0'), +('2', '4', '17', '1891', '666', '0'), +('2', '4', '17', '4342', '610', '0'), +('2', '4', '7', '1362', '2624', '0'), +('2', '4', '7', '1321', '1746', '0'), +('2', '4', '7', '2289', '1523', '0'), +('2', '4', '7', '4883', '311', '0'), +('2', '4', '9', '4884', '2060', '0'), +('2', '4', '9', '4344', '2051', '0'), +('2', '4', '9', '10408', '2002', '0'), +('2', '4', '9', '14650', '1662', '0'), +('2', '4', '15', '10150', '3004', '0'), +('2', '4', '15', '10163', '2300', '0'), +('2', '4', '15', '14651', '2224', '0'), +('2', '4', '15', '30360', '1600', '0'), +('2', '4', '20', '11666', '8295', '0'), +('2', '4', '20', '2742', '5079', '0'), +('2', '4', '20', '2288', '4478', '0'), +('2', '4', '20', '2345', '1112', '0'), +('2', '4', '12', '2291', '3830', '0'), +('2', '4', '12', '2923', '3074', '0'), +('2', '4', '12', '20655', '2701', '0'), +('2', '4', '12', '2336', '1012', '0'), +('2', '4', '18', '4410', '1142', '0'), +('2', '4', '18', '2292', '1034', '0'), +('2', '4', '18', '4886', '745', '0'), +('2', '4', '18', '2461', '386', '0'), +('2', '4', '19', '68239', '2068', '0'), +('2', '4', '19', '1368', '2016', '0'), +('2', '4', '19', '2293', '1380', '0'), +('2', '4', '19', '4837', '1265', '0'), +('2', '4', '13', '11691', '8388', '0'), +('2', '4', '13', '27718', '5986', '0'), +('2', '4', '13', '10333', '5300', '0'), +('2', '4', '13', '27719', '4203', '0'), +('2', '4', '14', '27716', '7188', '0'), +('2', '4', '14', '10333', '5300', '0'), +('2', '4', '14', '10334', '3503', '0'), +('2', '4', '14', '9427', '3028', '0'), +('2', '4', '11', '14762', '2204', '0'), +('2', '4', '11', '9246', '495', '0'), +('2', '4', '11', '20677', '450', '0'), +('2', '4', '11', '13390', '150', '0'), +('2', '5', '22', '9246', '0', '0'), +('2', '5', '22', '10323', '0', '0'), +('2', '5', '22', '44492', '0', '0'), +('2', '5', '22', '13101', '0', '0'), +('2', '5', '1', '14702', '3750', '0'), +('2', '5', '1', '14701', '2862', '0'), +('2', '5', '1', '30361', '2640', '0'), +('2', '5', '1', '10321', '1000', '0'), +('2', '5', '2', '10143', '5368', '0'), +('2', '5', '2', '30363', '3700', '0'), +('2', '5', '2', '3000', '2534', '0'), +('2', '5', '2', '2294', '2161', '0'), +('2', '5', '3', '2295', '1139', '0'), +('2', '5', '3', '14706', '990', '0'), +('2', '5', '3', '14705', '990', '0'), +('2', '5', '3', '11052', '906', '0'), +('2', '5', '5', '14703', '6050', '0'), +('2', '5', '5', '14700', '3318', '0'), +('2', '5', '5', '30362', '3140', '0'), +('2', '5', '5', '10055', '2780', '0'), +('2', '5', '8', '11603', '8854', '0'), +('2', '5', '8', '2349', '3554', '0'), +('2', '5', '8', '1363', '2510', '0'), +('2', '5', '8', '2287', '1548', '0'), +('2', '5', '6', '2924', '6128', '0'), +('2', '5', '6', '1557', '5310', '0'), +('2', '5', '6', '27717', '4303', '0'), +('2', '5', '6', '1401', '2174', '0'), +('2', '5', '17', '2285', '9608', '0'), +('2', '5', '17', '4882', '3848', '0'), +('2', '5', '17', '4342', '731', '0'), +('2', '5', '17', '1891', '666', '0'), +('2', '5', '7', '1362', '2624', '0'), +('2', '5', '7', '1321', '1746', '0'), +('2', '5', '7', '2289', '1572', '0'), +('2', '5', '7', '4883', '311', '0'), +('2', '5', '9', '4884', '2060', '0'), +('2', '5', '9', '4344', '2051', '0'), +('2', '5', '9', '10408', '2002', '0'), +('2', '5', '9', '14650', '1662', '0'), +('2', '5', '15', '10150', '3004', '0'), +('2', '5', '15', '10163', '2300', '0'), +('2', '5', '15', '14651', '2224', '0'), +('2', '5', '15', '30360', '1600', '0'), +('2', '5', '20', '11666', '8297', '0'), +('2', '5', '20', '2742', '5082', '0'), +('2', '5', '20', '2288', '4478', '0'), +('2', '5', '20', '2345', '1112', '0'), +('2', '5', '12', '2291', '3830', '0'), +('2', '5', '12', '2923', '3074', '0'), +('2', '5', '12', '20655', '2725', '0'), +('2', '5', '12', '2336', '1012', '0'), +('2', '5', '18', '4410', '1142', '0'), +('2', '5', '18', '2292', '1083', '0'), +('2', '5', '18', '4886', '853', '0'), +('2', '5', '18', '2461', '434', '0'), +('2', '5', '19', '68239', '2105', '0'), +('2', '5', '19', '1368', '2016', '0'), +('2', '5', '19', '2293', '1416', '0'), +('2', '5', '19', '4837', '1326', '0'), +('2', '5', '13', '11691', '8569', '0'), +('2', '5', '13', '27718', '6106', '0'), +('2', '5', '13', '10333', '5300', '0'), +('2', '5', '13', '27719', '4295', '0'), +('2', '5', '14', '27716', '7297', '0'), +('2', '5', '14', '10333', '5300', '0'), +('2', '5', '14', '10334', '3503', '0'), +('2', '5', '14', '9427', '3028', '0'), +('2', '5', '11', '14762', '2204', '0'), +('2', '5', '11', '9246', '616', '0'), +('2', '5', '11', '20677', '450', '0'), +('2', '5', '11', '13390', '150', '0'), +('2', '6', '22', '9246', '0', '0'), +('2', '6', '22', '10323', '0', '0'), +('2', '6', '22', '44492', '0', '0'), +('2', '6', '22', '13101', '0', '0'), +('2', '6', '1', '14702', '3750', '0'), +('2', '6', '1', '14701', '2862', '0'), +('2', '6', '1', '30361', '2640', '0'), +('2', '6', '1', '10321', '1000', '0'), +('2', '6', '2', '10143', '5368', '0'), +('2', '6', '2', '30363', '3700', '0'), +('2', '6', '2', '3000', '2534', '0'), +('2', '6', '2', '2294', '2185', '0'), +('2', '6', '3', '2295', '1163', '0'), +('2', '6', '3', '11052', '1087', '0'), +('2', '6', '3', '14705', '990', '0'), +('2', '6', '3', '14706', '990', '0'), +('2', '6', '5', '14703', '6050', '0'), +('2', '6', '5', '14700', '3318', '0'), +('2', '6', '5', '30362', '3140', '0'), +('2', '6', '5', '10055', '2780', '0'), +('2', '6', '8', '11603', '8963', '0'), +('2', '6', '8', '2349', '3554', '0'), +('2', '6', '8', '1363', '2510', '0'), +('2', '6', '8', '2287', '1551', '0'), +('2', '6', '6', '2924', '6188', '0'), +('2', '6', '6', '1557', '5310', '0'), +('2', '6', '6', '27717', '4451', '0'), +('2', '6', '6', '1401', '2174', '0'), +('2', '6', '17', '2285', '9656', '0'), +('2', '6', '17', '4882', '4034', '0'), +('2', '6', '17', '4342', '852', '0'), +('2', '6', '17', '1891', '666', '0'), +('2', '6', '7', '1362', '2624', '0'), +('2', '6', '7', '1321', '1746', '0'), +('2', '6', '7', '2289', '1620', '0'), +('2', '6', '7', '4883', '311', '0'), +('2', '6', '9', '4884', '2060', '0'), +('2', '6', '9', '4344', '2051', '0'), +('2', '6', '9', '10408', '2002', '0'), +('2', '6', '9', '14650', '1662', '0'), +('2', '6', '15', '10150', '3004', '0'), +('2', '6', '15', '10163', '2300', '0'), +('2', '6', '15', '14651', '2224', '0'), +('2', '6', '15', '30360', '1600', '0'), +('2', '6', '20', '11666', '8300', '0'), +('2', '6', '20', '2742', '5085', '0'), +('2', '6', '20', '2288', '4478', '0'), +('2', '6', '20', '2345', '1112', '0'), +('2', '6', '12', '2291', '3830', '0'), +('2', '6', '12', '2923', '3074', '0'), +('2', '6', '12', '20655', '2750', '0'), +('2', '6', '12', '2336', '1012', '0'), +('2', '6', '18', '4410', '1142', '0'), +('2', '6', '18', '2292', '1131', '0'), +('2', '6', '18', '4886', '962', '0'), +('2', '6', '18', '2461', '482', '0'), +('2', '6', '19', '68239', '2141', '0'), +('2', '6', '19', '1368', '2016', '0'), +('2', '6', '19', '2293', '1452', '0'), +('2', '6', '19', '4837', '1386', '0'), +('2', '6', '13', '11691', '8750', '0'), +('2', '6', '13', '27718', '6227', '0'), +('2', '6', '13', '10333', '5300', '0'), +('2', '6', '13', '27719', '4388', '0'), +('2', '6', '14', '27716', '7405', '0'), +('2', '6', '14', '10333', '5300', '0'), +('2', '6', '14', '10334', '3503', '0'), +('2', '6', '14', '9427', '3028', '0'), +('2', '6', '11', '14762', '2204', '0'), +('2', '6', '11', '9246', '737', '0'), +('2', '6', '11', '20677', '450', '0'), +('2', '6', '11', '13390', '150', '0'), +('2', '7', '22', '9246', '0', '0'), +('2', '7', '22', '10323', '0', '0'), +('2', '7', '22', '44492', '0', '0'), +('2', '7', '22', '13101', '0', '0'), +('2', '7', '1', '14702', '3750', '0'), +('2', '7', '1', '14701', '2862', '0'), +('2', '7', '1', '30361', '2640', '0'), +('2', '7', '1', '14563', '1064', '0'), +('2', '7', '2', '10143', '5368', '0'), +('2', '7', '2', '30363', '3700', '0'), +('2', '7', '2', '3000', '2534', '0'), +('2', '7', '2', '2294', '2209', '0'), +('2', '7', '3', '11052', '1268', '0'), +('2', '7', '3', '2295', '1187', '0'), +('2', '7', '3', '14706', '990', '0'), +('2', '7', '3', '14705', '990', '0'), +('2', '7', '5', '14703', '6050', '0'), +('2', '7', '5', '14700', '3318', '0'), +('2', '7', '5', '30362', '3140', '0'), +('2', '7', '5', '10055', '2780', '0'), +('2', '7', '8', '11603', '9071', '0'), +('2', '7', '8', '2349', '3554', '0'), +('2', '7', '8', '1363', '2510', '0'), +('2', '7', '8', '12238', '1668', '0'), +('2', '7', '6', '2924', '6248', '0'), +('2', '7', '6', '1557', '5310', '0'), +('2', '7', '6', '27717', '4598', '0'), +('2', '7', '6', '1401', '2174', '0'), +('2', '7', '17', '2285', '9705', '0'), +('2', '7', '17', '4882', '4219', '0'), +('2', '7', '17', '4342', '972', '0'), +('2', '7', '17', '1891', '666', '0'), +('2', '7', '7', '1362', '2624', '0'), +('2', '7', '7', '1321', '1746', '0'), +('2', '7', '7', '2289', '1668', '0'), +('2', '7', '7', '4883', '311', '0'), +('2', '7', '9', '4884', '2060', '0'), +('2', '7', '9', '4344', '2051', '0'), +('2', '7', '9', '10408', '2002', '0'), +('2', '7', '9', '14650', '1662', '0'), +('2', '7', '15', '10150', '3004', '0'), +('2', '7', '15', '10163', '2300', '0'), +('2', '7', '15', '14651', '2224', '0'), +('2', '7', '15', '30360', '1600', '0'), +('2', '7', '20', '11666', '8302', '0'), +('2', '7', '20', '2742', '5088', '0'), +('2', '7', '20', '2288', '4478', '0'), +('2', '7', '20', '2345', '1112', '0'), +('2', '7', '12', '2291', '3830', '0'), +('2', '7', '12', '2923', '3074', '0'), +('2', '7', '12', '20655', '2775', '0'), +('2', '7', '12', '2336', '1012', '0'), +('2', '7', '18', '2292', '1179', '0'), +('2', '7', '18', '4410', '1142', '0'), +('2', '7', '18', '4886', '1071', '0'), +('2', '7', '18', '2461', '531', '0'), +('2', '7', '19', '68239', '2177', '0'), +('2', '7', '19', '1368', '2016', '0'), +('2', '7', '19', '2293', '1489', '0'), +('2', '7', '19', '4837', '1447', '0'), +('2', '7', '13', '11691', '8931', '0'), +('2', '7', '13', '27718', '6348', '0'), +('2', '7', '13', '10333', '5300', '0'), +('2', '7', '13', '27719', '4480', '0'), +('2', '7', '14', '27716', '7514', '0'), +('2', '7', '14', '10333', '5300', '0'), +('2', '7', '14', '10334', '3503', '0'), +('2', '7', '14', '14107', '3037', '0'), +('2', '7', '11', '14762', '2204', '0'), +('2', '7', '11', '9246', '858', '0'), +('2', '7', '11', '20677', '450', '0'), +('2', '7', '11', '16941', '169', '0'), +('2', '8', '22', '9246', '0', '0'), +('2', '8', '22', '10323', '0', '0'), +('2', '8', '22', '44492', '0', '0'), +('2', '8', '22', '13101', '0', '0'), +('2', '8', '1', '14702', '3750', '0'), +('2', '8', '1', '14701', '2862', '0'), +('2', '8', '1', '30361', '2640', '0'), +('2', '8', '1', '14563', '1173', '0'), +('2', '8', '2', '10143', '5368', '0'), +('2', '8', '2', '30363', '3700', '0'), +('2', '8', '2', '3000', '2534', '0'), +('2', '8', '2', '2294', '2233', '0'), +('2', '8', '3', '11052', '1450', '0'), +('2', '8', '3', '2295', '1211', '0'), +('2', '8', '3', '14706', '990', '0'), +('2', '8', '3', '14705', '990', '0'), +('2', '8', '5', '14703', '6050', '0'), +('2', '8', '5', '14700', '3318', '0'), +('2', '8', '5', '30362', '3140', '0'), +('2', '8', '5', '10055', '2780', '0'), +('2', '8', '8', '11603', '9180', '0'), +('2', '8', '8', '2349', '3554', '0'), +('2', '8', '8', '1363', '2510', '0'), +('2', '8', '8', '12238', '1789', '0'), +('2', '8', '6', '2924', '6309', '0'), +('2', '8', '6', '1557', '5310', '0'), +('2', '8', '6', '27717', '4745', '0'), +('2', '8', '6', '1401', '2174', '0'), +('2', '8', '17', '2285', '9753', '0'), +('2', '8', '17', '4882', '4405', '0'), +('2', '8', '17', '4342', '1093', '0'), +('2', '8', '17', '1891', '666', '0'), +('2', '8', '7', '1362', '2624', '0'), +('2', '8', '7', '1321', '1746', '0'), +('2', '8', '7', '2289', '1717', '0'), +('2', '8', '7', '4883', '311', '0'), +('2', '8', '9', '4884', '2060', '0'), +('2', '8', '9', '4344', '2051', '0'), +('2', '8', '9', '10408', '2002', '0'), +('2', '8', '9', '14650', '1662', '0'), +('2', '8', '15', '10150', '3004', '0'), +('2', '8', '15', '10163', '2300', '0'), +('2', '8', '15', '14651', '2224', '0'), +('2', '8', '15', '30360', '1600', '0'), +('2', '8', '20', '11666', '8304', '0'), +('2', '8', '20', '2742', '5091', '0'), +('2', '8', '20', '2288', '4478', '0'), +('2', '8', '20', '2345', '1112', '0'), +('2', '8', '12', '2291', '3830', '0'), +('2', '8', '12', '2923', '3074', '0'), +('2', '8', '12', '20655', '2800', '0'), +('2', '8', '12', '2336', '1012', '0'), +('2', '8', '18', '2292', '1228', '0'), +('2', '8', '18', '4886', '1179', '0'), +('2', '8', '18', '4410', '1142', '0'), +('2', '8', '18', '2461', '579', '0'), +('2', '8', '19', '68239', '2213', '0'), +('2', '8', '19', '1368', '2016', '0'), +('2', '8', '19', '2293', '1525', '0'), +('2', '8', '19', '4837', '1507', '0'), +('2', '8', '13', '11691', '9113', '0'), +('2', '8', '13', '27718', '6469', '0'), +('2', '8', '13', '10333', '5300', '0'), +('2', '8', '13', '27719', '4572', '0'), +('2', '8', '14', '27716', '7623', '0'), +('2', '8', '14', '10333', '5300', '0'), +('2', '8', '14', '10334', '3503', '0'), +('2', '8', '14', '14107', '3097', '0'), +('2', '8', '11', '14762', '2204', '0'), +('2', '8', '11', '9246', '978', '0'), +('2', '8', '11', '20677', '450', '0'), +('2', '8', '11', '16941', '193', '0'), +('2', '9', '22', '9246', '0', '0'), +('2', '9', '22', '10323', '0', '0'), +('2', '9', '22', '44492', '0', '0'), +('2', '9', '22', '13101', '0', '0'), +('2', '9', '1', '14702', '3750', '0'), +('2', '9', '1', '14701', '2862', '0'), +('2', '9', '1', '30361', '2640', '0'), +('2', '9', '1', '14563', '1282', '0'), +('2', '9', '2', '10143', '5368', '0'), +('2', '9', '2', '30363', '3700', '0'), +('2', '9', '2', '3000', '2534', '0'), +('2', '9', '2', '2294', '2257', '0'), +('2', '9', '3', '11052', '1631', '0'), +('2', '9', '3', '2295', '1236', '0'), +('2', '9', '3', '14705', '990', '0'), +('2', '9', '3', '14706', '990', '0'), +('2', '9', '5', '14703', '6050', '0'), +('2', '9', '5', '14700', '3318', '0'), +('2', '9', '5', '30362', '3140', '0'), +('2', '9', '5', '10055', '2780', '0'), +('2', '9', '8', '11603', '9289', '0'), +('2', '9', '8', '2349', '3554', '0'), +('2', '9', '8', '1363', '2510', '0'), +('2', '9', '8', '12238', '1910', '0'), +('2', '9', '6', '2924', '6369', '0'), +('2', '9', '6', '1557', '5310', '0'), +('2', '9', '6', '27717', '4893', '0'), +('2', '9', '6', '1401', '2174', '0'), +('2', '9', '17', '2285', '9801', '0'), +('2', '9', '17', '4882', '4591', '0'), +('2', '9', '17', '4342', '1214', '0'), +('2', '9', '17', '1891', '666', '0'), +('2', '9', '7', '1362', '2624', '0'), +('2', '9', '7', '2289', '1765', '0'), +('2', '9', '7', '1321', '1746', '0'), +('2', '9', '7', '10336', '330', '0'), +('2', '9', '9', '4884', '2060', '0'), +('2', '9', '9', '4344', '2051', '0'), +('2', '9', '9', '10408', '2002', '0'), +('2', '9', '9', '14650', '1662', '0'), +('2', '9', '15', '10150', '3004', '0'), +('2', '9', '15', '10163', '2300', '0'), +('2', '9', '15', '14651', '2224', '0'), +('2', '9', '15', '30360', '1600', '0'), +('2', '9', '20', '11666', '8306', '0'), +('2', '9', '20', '2742', '5094', '0'), +('2', '9', '20', '2288', '4478', '0'), +('2', '9', '20', '2345', '1112', '0'), +('2', '9', '12', '2291', '3830', '0'), +('2', '9', '12', '2923', '3074', '0'), +('2', '9', '12', '20655', '2824', '0'), +('2', '9', '12', '2336', '1012', '0'), +('2', '9', '18', '4886', '1288', '0'), +('2', '9', '18', '2292', '1276', '0'), +('2', '9', '18', '4410', '1142', '0'), +('2', '9', '18', '2461', '627', '0'), +('2', '9', '19', '68239', '2250', '0'), +('2', '9', '19', '1368', '2016', '0'), +('2', '9', '19', '4837', '1567', '0'), +('2', '9', '19', '2293', '1561', '0'), +('2', '9', '13', '11691', '9294', '0'), +('2', '9', '13', '27718', '6590', '0'), +('2', '9', '13', '10333', '5300', '0'), +('2', '9', '13', '27719', '4664', '0'), +('2', '9', '14', '27716', '7731', '0'), +('2', '9', '14', '10333', '5300', '0'), +('2', '9', '14', '10334', '3503', '0'), +('2', '9', '14', '14107', '3158', '0'), +('2', '9', '11', '14762', '2204', '0'), +('2', '9', '11', '9246', '1099', '0'), +('2', '9', '11', '20677', '450', '0'), +('2', '9', '11', '16941', '217', '0'), +('2', '10', '22', '9246', '0', '0'), +('2', '10', '22', '10323', '0', '0'), +('2', '10', '22', '44492', '0', '0'), +('2', '10', '22', '13101', '0', '0'), +('2', '10', '1', '14702', '3750', '0'), +('2', '10', '1', '14701', '2862', '0'), +('2', '10', '1', '30361', '2640', '0'), +('2', '10', '1', '14563', '1390', '0'), +('2', '10', '2', '10143', '5368', '0'), +('2', '10', '2', '30363', '3700', '0'), +('2', '10', '2', '3000', '2534', '0'), +('2', '10', '2', '2294', '2281', '0'), +('2', '10', '3', '11052', '1812', '0'), +('2', '10', '3', '2295', '1260', '0'), +('2', '10', '3', '14108', '1020', '0'), +('2', '10', '3', '14705', '990', '0'), +('2', '10', '5', '14703', '6050', '0'), +('2', '10', '5', '14700', '3318', '0'), +('2', '10', '5', '30362', '3140', '0'), +('2', '10', '5', '10055', '2780', '0'), +('2', '10', '8', '11603', '9398', '0'), +('2', '10', '8', '2349', '3554', '0'), +('2', '10', '8', '1363', '2510', '0'), +('2', '10', '8', '12238', '2030', '0'), +('2', '10', '6', '2924', '6430', '0'), +('2', '10', '6', '1557', '5310', '0'), +('2', '10', '6', '27717', '5040', '0'), +('2', '10', '6', '1401', '2174', '0'), +('2', '10', '17', '2285', '9850', '0'), +('2', '10', '17', '4882', '4776', '0'), +('2', '10', '17', '4342', '1335', '0'), +('2', '10', '17', '2405', '673', '0'), +('2', '10', '7', '1362', '2624', '0'), +('2', '10', '7', '2289', '1813', '0'), +('2', '10', '7', '1321', '1746', '0'), +('2', '10', '7', '10336', '366', '0'), +('2', '10', '9', '4884', '2060', '0'), +('2', '10', '9', '4344', '2051', '0'), +('2', '10', '9', '10408', '2002', '0'), +('2', '10', '9', '14650', '1662', '0'), +('2', '10', '15', '10150', '3004', '0'), +('2', '10', '15', '10163', '2300', '0'), +('2', '10', '15', '14651', '2224', '0'), +('2', '10', '15', '30360', '1600', '0'), +('2', '10', '20', '11666', '8308', '0'), +('2', '10', '20', '2742', '5097', '0'), +('2', '10', '20', '2288', '4478', '0'), +('2', '10', '20', '2345', '1112', '0'), +('2', '10', '12', '2291', '3830', '0'), +('2', '10', '12', '2923', '3074', '0'), +('2', '10', '12', '20655', '2849', '0'), +('2', '10', '12', '2336', '1012', '0'), +('2', '10', '18', '4886', '1397', '0'), +('2', '10', '18', '2292', '1324', '0'), +('2', '10', '18', '4410', '1142', '0'), +('2', '10', '18', '2461', '675', '0'), +('2', '10', '19', '68239', '2286', '0'), +('2', '10', '19', '1368', '2016', '0'), +('2', '10', '19', '4837', '1628', '0'), +('2', '10', '19', '2293', '1597', '0'), +('2', '10', '13', '11691', '9475', '0'), +('2', '10', '13', '27718', '6710', '0'), +('2', '10', '13', '10333', '5300', '0'), +('2', '10', '13', '27719', '4756', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '10', '14', '27716', '7840', '0'), +('2', '10', '14', '10333', '5300', '0'), +('2', '10', '14', '10334', '3503', '0'), +('2', '10', '14', '9690', '3500', '0'), +('2', '10', '11', '14762', '2204', '0'), +('2', '10', '11', '9246', '1220', '0'), +('2', '10', '11', '20677', '450', '0'), +('2', '10', '11', '16941', '242', '0'), +('2', '11', '22', '9246', '0', '0'), +('2', '11', '22', '10323', '0', '0'), +('2', '11', '22', '44492', '0', '0'), +('2', '11', '22', '13101', '0', '0'), +('2', '11', '1', '14702', '3750', '0'), +('2', '11', '1', '14701', '2862', '0'), +('2', '11', '1', '30361', '2640', '0'), +('2', '11', '1', '14563', '1499', '0'), +('2', '11', '2', '10143', '5368', '0'), +('2', '11', '2', '30363', '3700', '0'), +('2', '11', '2', '3000', '2534', '0'), +('2', '11', '2', '2294', '2306', '0'), +('2', '11', '3', '11052', '1993', '0'), +('2', '11', '3', '2295', '1284', '0'), +('2', '11', '3', '14108', '1104', '0'), +('2', '11', '3', '14705', '990', '0'), +('2', '11', '5', '14703', '6050', '0'), +('2', '11', '5', '14700', '3318', '0'), +('2', '11', '5', '30362', '3140', '0'), +('2', '11', '5', '10055', '2780', '0'), +('2', '11', '8', '11603', '9506', '0'), +('2', '11', '8', '2349', '3554', '0'), +('2', '11', '8', '1363', '2510', '0'), +('2', '11', '8', '12238', '2151', '0'), +('2', '11', '6', '2924', '6490', '0'), +('2', '11', '6', '1557', '5310', '0'), +('2', '11', '6', '27717', '5188', '0'), +('2', '11', '6', '1401', '2174', '0'), +('2', '11', '17', '2285', '9898', '0'), +('2', '11', '17', '4882', '4962', '0'), +('2', '11', '17', '4342', '1456', '0'), +('2', '11', '17', '2405', '735', '0'), +('2', '11', '7', '1362', '2624', '0'), +('2', '11', '7', '2289', '1862', '0'), +('2', '11', '7', '1321', '1746', '0'), +('2', '11', '7', '10336', '402', '0'), +('2', '11', '9', '4884', '2060', '0'), +('2', '11', '9', '4344', '2051', '0'), +('2', '11', '9', '10408', '2002', '0'), +('2', '11', '9', '14650', '1662', '0'), +('2', '11', '15', '10150', '3004', '0'), +('2', '11', '15', '10163', '2300', '0'), +('2', '11', '15', '14651', '2224', '0'), +('2', '11', '15', '30360', '1600', '0'), +('2', '11', '20', '11666', '8310', '0'), +('2', '11', '20', '2742', '5100', '0'), +('2', '11', '20', '2288', '4478', '0'), +('2', '11', '20', '2345', '1112', '0'), +('2', '11', '12', '2291', '3830', '0'), +('2', '11', '12', '2923', '3074', '0'), +('2', '11', '12', '20655', '2874', '0'), +('2', '11', '12', '4345', '1037', '0'), +('2', '11', '18', '4886', '1506', '0'), +('2', '11', '18', '2292', '1373', '0'), +('2', '11', '18', '4410', '1142', '0'), +('2', '11', '18', '2461', '724', '0'), +('2', '11', '19', '68239', '2322', '0'), +('2', '11', '19', '1368', '2016', '0'), +('2', '11', '19', '4837', '1688', '0'), +('2', '11', '19', '2293', '1634', '0'), +('2', '11', '13', '11691', '9656', '0'), +('2', '11', '13', '27718', '6831', '0'), +('2', '11', '13', '10333', '5300', '0'), +('2', '11', '13', '27719', '4848', '0'), +('2', '11', '14', '27716', '7949', '0'), +('2', '11', '14', '10333', '5300', '0'), +('2', '11', '14', '10334', '3503', '0'), +('2', '11', '14', '9690', '3500', '0'), +('2', '11', '11', '14762', '2204', '0'), +('2', '11', '11', '9246', '1341', '0'), +('2', '11', '11', '20677', '450', '0'), +('2', '11', '11', '16941', '266', '0'), +('2', '12', '22', '9246', '0', '0'), +('2', '12', '22', '10323', '0', '0'), +('2', '12', '22', '44492', '0', '0'), +('2', '12', '22', '13101', '0', '0'), +('2', '12', '1', '14702', '3750', '0'), +('2', '12', '1', '14701', '2862', '0'), +('2', '12', '1', '30361', '2640', '0'), +('2', '12', '1', '14563', '1608', '0'), +('2', '12', '2', '10143', '5368', '0'), +('2', '12', '2', '30363', '3700', '0'), +('2', '12', '2', '3000', '2534', '0'), +('2', '12', '2', '2294', '2330', '0'), +('2', '12', '3', '11052', '2174', '0'), +('2', '12', '3', '2295', '1308', '0'), +('2', '12', '3', '14108', '1189', '0'), +('2', '12', '3', '4505', '1045', '0'), +('2', '12', '5', '14703', '6050', '0'), +('2', '12', '5', '14700', '3318', '0'), +('2', '12', '5', '30362', '3140', '0'), +('2', '12', '5', '14562', '2845', '0'), +('2', '12', '8', '11603', '9615', '0'), +('2', '12', '8', '2349', '3554', '0'), +('2', '12', '8', '1363', '2510', '0'), +('2', '12', '8', '12238', '2272', '0'), +('2', '12', '6', '2924', '6550', '0'), +('2', '12', '6', '27717', '5335', '0'), +('2', '12', '6', '1557', '5310', '0'), +('2', '12', '6', '1401', '2174', '0'), +('2', '12', '17', '2285', '9946', '0'), +('2', '12', '17', '4882', '5148', '0'), +('2', '12', '17', '4342', '1576', '0'), +('2', '12', '17', '2405', '796', '0'), +('2', '12', '7', '1362', '2624', '0'), +('2', '12', '7', '2289', '1910', '0'), +('2', '12', '7', '1321', '1746', '0'), +('2', '12', '7', '10336', '439', '0'), +('2', '12', '9', '4884', '2060', '0'), +('2', '12', '9', '4344', '2051', '0'), +('2', '12', '9', '10408', '2002', '0'), +('2', '12', '9', '14650', '1662', '0'), +('2', '12', '15', '10150', '3004', '0'), +('2', '12', '15', '10163', '2300', '0'), +('2', '12', '15', '14651', '2224', '0'), +('2', '12', '15', '30360', '1600', '0'), +('2', '12', '20', '11666', '8312', '0'), +('2', '12', '20', '2742', '5103', '0'), +('2', '12', '20', '2288', '4478', '0'), +('2', '12', '20', '2345', '1112', '0'), +('2', '12', '12', '2291', '3830', '0'), +('2', '12', '12', '2923', '3074', '0'), +('2', '12', '12', '20655', '2899', '0'), +('2', '12', '12', '4345', '1097', '0'), +('2', '12', '18', '4886', '1614', '0'), +('2', '12', '18', '2292', '1421', '0'), +('2', '12', '18', '4410', '1142', '0'), +('2', '12', '18', '2461', '772', '0'), +('2', '12', '19', '68239', '2358', '0'), +('2', '12', '19', '1368', '2016', '0'), +('2', '12', '19', '4837', '1749', '0'), +('2', '12', '19', '2293', '1670', '0'), +('2', '12', '13', '11691', '9837', '0'), +('2', '12', '13', '27718', '6952', '0'), +('2', '12', '13', '10333', '5300', '0'), +('2', '12', '13', '27719', '4940', '0'), +('2', '12', '14', '27716', '8058', '0'), +('2', '12', '14', '10333', '5300', '0'), +('2', '12', '14', '10334', '3503', '0'), +('2', '12', '14', '9690', '3500', '0'), +('2', '12', '11', '14762', '2204', '0'), +('2', '12', '11', '9246', '1462', '0'), +('2', '12', '11', '20677', '450', '0'), +('2', '12', '11', '16941', '290', '0'), +('2', '13', '22', '9246', '0', '0'), +('2', '13', '22', '10323', '0', '0'), +('2', '13', '22', '44492', '0', '0'), +('2', '13', '22', '13101', '0', '0'), +('2', '13', '1', '14702', '3750', '0'), +('2', '13', '1', '14701', '2862', '0'), +('2', '13', '1', '30361', '2640', '0'), +('2', '13', '1', '14563', '1716', '0'), +('2', '13', '2', '10143', '5368', '0'), +('2', '13', '2', '30363', '3700', '0'), +('2', '13', '2', '3000', '2534', '0'), +('2', '13', '2', '2294', '2354', '0'), +('2', '13', '3', '11052', '2356', '0'), +('2', '13', '3', '2295', '1332', '0'), +('2', '13', '3', '14108', '1273', '0'), +('2', '13', '3', '4505', '1129', '0'), +('2', '13', '5', '14703', '6050', '0'), +('2', '13', '5', '14700', '3318', '0'), +('2', '13', '5', '30362', '3140', '0'), +('2', '13', '5', '14562', '2929', '0'), +('2', '13', '8', '11603', '9724', '0'), +('2', '13', '8', '2349', '3554', '0'), +('2', '13', '8', '1363', '2510', '0'), +('2', '13', '8', '12238', '2393', '0'), +('2', '13', '6', '2924', '6611', '0'), +('2', '13', '6', '27717', '5482', '0'), +('2', '13', '6', '1557', '5310', '0'), +('2', '13', '6', '1401', '2174', '0'), +('2', '13', '17', '2285', '9995', '0'), +('2', '13', '17', '4882', '5334', '0'), +('2', '13', '17', '4342', '1697', '0'), +('2', '13', '17', '2405', '857', '0'), +('2', '13', '7', '1362', '2624', '0'), +('2', '13', '7', '2289', '1958', '0'), +('2', '13', '7', '1321', '1746', '0'), +('2', '13', '7', '10336', '475', '0'), +('2', '13', '9', '4884', '2060', '0'), +('2', '13', '9', '4344', '2051', '0'), +('2', '13', '9', '10408', '2002', '0'), +('2', '13', '9', '14650', '1662', '0'), +('2', '13', '15', '10150', '3004', '0'), +('2', '13', '15', '10163', '2300', '0'), +('2', '13', '15', '14651', '2224', '0'), +('2', '13', '15', '30360', '1600', '0'), +('2', '13', '20', '11666', '8314', '0'), +('2', '13', '20', '2742', '5106', '0'), +('2', '13', '20', '2288', '4478', '0'), +('2', '13', '20', '2345', '1112', '0'), +('2', '13', '12', '2291', '3830', '0'), +('2', '13', '12', '2923', '3074', '0'), +('2', '13', '12', '20655', '2923', '0'), +('2', '13', '12', '4345', '1158', '0'), +('2', '13', '18', '4886', '1723', '0'), +('2', '13', '18', '2292', '1469', '0'), +('2', '13', '18', '4410', '1142', '0'), +('2', '13', '18', '2461', '820', '0'), +('2', '13', '19', '68239', '2395', '0'), +('2', '13', '19', '1368', '2016', '0'), +('2', '13', '19', '4837', '1809', '0'), +('2', '13', '19', '2293', '1706', '0'), +('2', '13', '13', '11691', '10019', '0'), +('2', '13', '13', '27718', '7073', '0'), +('2', '13', '13', '10333', '5300', '0'), +('2', '13', '13', '27719', '5032', '0'), +('2', '13', '14', '27716', '8166', '0'), +('2', '13', '14', '10333', '5300', '0'), +('2', '13', '14', '10334', '3503', '0'), +('2', '13', '14', '9690', '3500', '0'), +('2', '13', '11', '14762', '2204', '0'), +('2', '13', '11', '9246', '1582', '0'), +('2', '13', '11', '20677', '450', '0'), +('2', '13', '11', '16941', '314', '0'), +('2', '14', '22', '9246', '0', '0'), +('2', '14', '22', '10323', '0', '0'), +('2', '14', '22', '44492', '0', '0'), +('2', '14', '22', '13101', '0', '0'), +('2', '14', '1', '14702', '3750', '0'), +('2', '14', '1', '14701', '2862', '0'), +('2', '14', '1', '30361', '2640', '0'), +('2', '14', '1', '14563', '1825', '0'), +('2', '14', '2', '10143', '5368', '0'), +('2', '14', '2', '30363', '3700', '0'), +('2', '14', '2', '3000', '2534', '0'), +('2', '14', '2', '2294', '2378', '0'), +('2', '14', '3', '11052', '2537', '0'), +('2', '14', '3', '14108', '1358', '0'), +('2', '14', '3', '2295', '1356', '0'), +('2', '14', '3', '4505', '1214', '0'), +('2', '14', '5', '14703', '6050', '0'), +('2', '14', '5', '14700', '3318', '0'), +('2', '14', '5', '30362', '3140', '0'), +('2', '14', '5', '14562', '3014', '0'), +('2', '14', '8', '11603', '9832', '0'), +('2', '14', '8', '2349', '3554', '0'), +('2', '14', '8', '12238', '2514', '0'), +('2', '14', '8', '1363', '2510', '0'), +('2', '14', '6', '2924', '6671', '0'), +('2', '14', '6', '27717', '5630', '0'), +('2', '14', '6', '1557', '5310', '0'), +('2', '14', '6', '1401', '2174', '0'), +('2', '14', '17', '2285', '10043', '0'), +('2', '14', '17', '4882', '5519', '0'), +('2', '14', '17', '4342', '1818', '0'), +('2', '14', '17', '2405', '919', '0'), +('2', '14', '7', '1362', '2624', '0'), +('2', '14', '7', '2289', '2007', '0'), +('2', '14', '7', '1321', '1746', '0'), +('2', '14', '7', '10336', '511', '0'), +('2', '14', '9', '4884', '2060', '0'), +('2', '14', '9', '4344', '2051', '0'), +('2', '14', '9', '10408', '2002', '0'), +('2', '14', '9', '14650', '1662', '0'), +('2', '14', '15', '10150', '3004', '0'), +('2', '14', '15', '10163', '2300', '0'), +('2', '14', '15', '14651', '2224', '0'), +('2', '14', '15', '30360', '1600', '0'), +('2', '14', '20', '11666', '8316', '0'), +('2', '14', '20', '2742', '5109', '0'), +('2', '14', '20', '2288', '4478', '0'), +('2', '14', '20', '2345', '1112', '0'), +('2', '14', '12', '2291', '3830', '0'), +('2', '14', '12', '2923', '3074', '0'), +('2', '14', '12', '20655', '2948', '0'), +('2', '14', '12', '4345', '1218', '0'), +('2', '14', '18', '4886', '1832', '0'), +('2', '14', '18', '2292', '1518', '0'), +('2', '14', '18', '4410', '1142', '0'), +('2', '14', '18', '2461', '869', '0'), +('2', '14', '19', '68239', '2431', '0'), +('2', '14', '19', '1368', '2016', '0'), +('2', '14', '19', '4837', '1869', '0'), +('2', '14', '19', '2293', '1742', '0'), +('2', '14', '13', '11691', '10200', '0'), +('2', '14', '13', '27718', '7194', '0'), +('2', '14', '13', '10333', '5300', '0'), +('2', '14', '13', '27719', '5124', '0'), +('2', '14', '14', '27716', '8275', '0'), +('2', '14', '14', '10333', '5300', '0'), +('2', '14', '14', '10334', '3503', '0'), +('2', '14', '14', '9690', '3500', '0'), +('2', '14', '11', '14762', '2204', '0'), +('2', '14', '11', '9246', '1703', '0'), +('2', '14', '11', '20677', '450', '0'), +('2', '14', '11', '16941', '338', '0'), +('2', '15', '22', '9246', '0', '0'), +('2', '15', '22', '10323', '0', '0'), +('2', '15', '22', '44492', '0', '0'), +('2', '15', '22', '13101', '0', '0'), +('2', '15', '1', '14702', '3750', '0'), +('2', '15', '1', '14701', '2862', '0'), +('2', '15', '1', '30361', '2640', '0'), +('2', '15', '1', '14563', '1934', '0'), +('2', '15', '2', '10143', '5368', '0'), +('2', '15', '2', '30363', '3700', '0'), +('2', '15', '2', '3000', '2534', '0'), +('2', '15', '2', '2294', '2402', '0'), +('2', '15', '3', '11052', '2718', '0'), +('2', '15', '3', '14108', '1443', '0'), +('2', '15', '3', '2295', '1381', '0'), +('2', '15', '3', '4505', '1299', '0'), +('2', '15', '5', '14703', '6050', '0'), +('2', '15', '5', '14700', '3318', '0'), +('2', '15', '5', '30362', '3140', '0'), +('2', '15', '5', '14562', '3099', '0'), +('2', '15', '8', '11603', '9941', '0'), +('2', '15', '8', '2349', '3554', '0'), +('2', '15', '8', '12238', '2634', '0'), +('2', '15', '8', '1363', '2510', '0'), +('2', '15', '6', '2924', '6732', '0'), +('2', '15', '6', '27717', '5777', '0'), +('2', '15', '6', '1557', '5310', '0'), +('2', '15', '6', '1401', '2174', '0'), +('2', '15', '17', '2285', '10091', '0'), +('2', '15', '17', '4882', '5705', '0'), +('2', '15', '17', '4342', '1939', '0'), +('2', '15', '17', '2405', '980', '0'), +('2', '15', '7', '1362', '2624', '0'), +('2', '15', '7', '2289', '2055', '0'), +('2', '15', '7', '1321', '1746', '0'), +('2', '15', '7', '10336', '547', '0'), +('2', '15', '9', '4884', '2060', '0'), +('2', '15', '9', '4344', '2051', '0'), +('2', '15', '9', '10408', '2002', '0'), +('2', '15', '9', '14650', '1662', '0'), +('2', '15', '15', '10150', '3004', '0'), +('2', '15', '15', '10163', '2300', '0'), +('2', '15', '15', '14651', '2224', '0'), +('2', '15', '15', '30360', '1600', '0'), +('2', '15', '20', '11666', '8319', '0'), +('2', '15', '20', '2742', '5112', '0'), +('2', '15', '20', '2288', '4478', '0'), +('2', '15', '20', '2345', '1112', '0'), +('2', '15', '12', '2291', '3830', '0'), +('2', '15', '12', '2923', '3074', '0'), +('2', '15', '12', '20655', '2973', '0'), +('2', '15', '12', '4345', '1278', '0'), +('2', '15', '18', '4886', '1940', '0'), +('2', '15', '18', '2292', '1566', '0'), +('2', '15', '18', '4410', '1142', '0'), +('2', '15', '18', '2461', '917', '0'), +('2', '15', '19', '68239', '2467', '0'), +('2', '15', '19', '1368', '2016', '0'), +('2', '15', '19', '4837', '1930', '0'), +('2', '15', '19', '2293', '1779', '0'), +('2', '15', '13', '11691', '10381', '0'), +('2', '15', '13', '27718', '7314', '0'), +('2', '15', '13', '10333', '5300', '0'), +('2', '15', '13', '27719', '5217', '0'), +('2', '15', '14', '27716', '8384', '0'), +('2', '15', '14', '10333', '5300', '0'), +('2', '15', '14', '14107', '3520', '0'), +('2', '15', '14', '10334', '3503', '0'), +('2', '15', '11', '14762', '2204', '0'), +('2', '15', '11', '9246', '1824', '0'), +('2', '15', '11', '20677', '450', '0'), +('2', '15', '11', '16941', '362', '0'), +('2', '16', '22', '9246', '0', '0'), +('2', '16', '22', '10323', '0', '0'), +('2', '16', '22', '44492', '0', '0'), +('2', '16', '22', '13101', '0', '0'), +('2', '16', '1', '14702', '3750', '0'), +('2', '16', '1', '14701', '2862', '0'), +('2', '16', '1', '30361', '2640', '0'), +('2', '16', '1', '14563', '2043', '0'), +('2', '16', '2', '10143', '5368', '0'), +('2', '16', '2', '30363', '3700', '0'), +('2', '16', '2', '3000', '2534', '0'), +('2', '16', '2', '2294', '2426', '0'), +('2', '16', '3', '11052', '2899', '0'), +('2', '16', '3', '14108', '1527', '0'), +('2', '16', '3', '2295', '1405', '0'), +('2', '16', '3', '4505', '1383', '0'), +('2', '16', '5', '14703', '6050', '0'), +('2', '16', '5', '14700', '3318', '0'), +('2', '16', '5', '14562', '3183', '0'), +('2', '16', '5', '30362', '3140', '0'), +('2', '16', '8', '11603', '10050', '0'), +('2', '16', '8', '2349', '3554', '0'), +('2', '16', '8', '12238', '2755', '0'), +('2', '16', '8', '1363', '2510', '0'), +('2', '16', '6', '2924', '6792', '0'), +('2', '16', '6', '27717', '5924', '0'), +('2', '16', '6', '1557', '5310', '0'), +('2', '16', '6', '1401', '2174', '0'), +('2', '16', '17', '2285', '10140', '0'), +('2', '16', '17', '4882', '5891', '0'), +('2', '16', '17', '4342', '2060', '0'), +('2', '16', '17', '2405', '1041', '0'), +('2', '16', '7', '1362', '2624', '0'), +('2', '16', '7', '2289', '2103', '0'), +('2', '16', '7', '1321', '1746', '0'), +('2', '16', '7', '10336', '583', '0'), +('2', '16', '9', '4884', '2060', '0'), +('2', '16', '9', '4344', '2051', '0'), +('2', '16', '9', '10408', '2002', '0'), +('2', '16', '9', '14650', '1662', '0'), +('2', '16', '15', '10150', '3004', '0'), +('2', '16', '15', '10163', '2300', '0'), +('2', '16', '15', '14651', '2224', '0'), +('2', '16', '15', '30360', '1600', '0'), +('2', '16', '20', '11666', '8321', '0'), +('2', '16', '20', '2742', '5115', '0'), +('2', '16', '20', '2288', '4478', '0'), +('2', '16', '20', '2345', '1112', '0'), +('2', '16', '12', '2291', '3830', '0'), +('2', '16', '12', '2923', '3074', '0'), +('2', '16', '12', '20655', '2998', '0'), +('2', '16', '12', '4345', '1339', '0'), +('2', '16', '18', '4886', '2049', '0'), +('2', '16', '18', '2292', '1614', '0'), +('2', '16', '18', '4410', '1142', '0'), +('2', '16', '18', '2461', '965', '0'), +('2', '16', '19', '68239', '2503', '0'), +('2', '16', '19', '1368', '2016', '0'), +('2', '16', '19', '4837', '1990', '0'), +('2', '16', '19', '2293', '1815', '0'), +('2', '16', '13', '11691', '10562', '0'), +('2', '16', '13', '27718', '7435', '0'), +('2', '16', '13', '27719', '5309', '0'), +('2', '16', '13', '10333', '5300', '0'), +('2', '16', '14', '27716', '8493', '0'), +('2', '16', '14', '10333', '5300', '0'), +('2', '16', '14', '14107', '3580', '0'), +('2', '16', '14', '10334', '3503', '0'), +('2', '16', '11', '14762', '2204', '0'), +('2', '16', '11', '9246', '1945', '0'), +('2', '16', '11', '20677', '450', '0'), +('2', '16', '11', '16941', '387', '0'), +('2', '17', '22', '9246', '0', '0'), +('2', '17', '22', '10323', '0', '0'), +('2', '17', '22', '44492', '0', '0'), +('2', '17', '22', '13101', '0', '0'), +('2', '17', '1', '14702', '3750', '0'), +('2', '17', '1', '14701', '2862', '0'), +('2', '17', '1', '30361', '2640', '0'), +('2', '17', '1', '14563', '2151', '0'), +('2', '17', '2', '10143', '5368', '0'), +('2', '17', '2', '30363', '3700', '0'), +('2', '17', '2', '3000', '2534', '0'), +('2', '17', '2', '2294', '2451', '0'), +('2', '17', '3', '11052', '3080', '0'), +('2', '17', '3', '14108', '1612', '0'), +('2', '17', '3', '4505', '1468', '0'), +('2', '17', '3', '14695', '1446', '0'), +('2', '17', '5', '14703', '6050', '0'), +('2', '17', '5', '14700', '3318', '0'), +('2', '17', '5', '14562', '3268', '0'), +('2', '17', '5', '30362', '3140', '0'), +('2', '17', '8', '11603', '10159', '0'), +('2', '17', '8', '2349', '3554', '0'), +('2', '17', '8', '12238', '2876', '0'), +('2', '17', '8', '1363', '2510', '0'), +('2', '17', '6', '2924', '6852', '0'), +('2', '17', '6', '27717', '6072', '0'), +('2', '17', '6', '1557', '5310', '0'), +('2', '17', '6', '1401', '2174', '0'), +('2', '17', '17', '2285', '10188', '0'), +('2', '17', '17', '4882', '6077', '0'), +('2', '17', '17', '4342', '2180', '0'), +('2', '17', '17', '2405', '1103', '0'), +('2', '17', '7', '1362', '2624', '0'), +('2', '17', '7', '2289', '2152', '0'), +('2', '17', '7', '1321', '1746', '0'), +('2', '17', '7', '10336', '620', '0'), +('2', '17', '9', '4884', '2060', '0'), +('2', '17', '9', '4344', '2051', '0'), +('2', '17', '9', '10408', '2002', '0'), +('2', '17', '9', '14650', '1662', '0'), +('2', '17', '15', '10150', '3004', '0'), +('2', '17', '15', '10163', '2300', '0'), +('2', '17', '15', '14651', '2224', '0'), +('2', '17', '15', '30360', '1600', '0'), +('2', '17', '20', '11666', '8323', '0'), +('2', '17', '20', '2742', '5118', '0'), +('2', '17', '20', '2288', '4478', '0'), +('2', '17', '20', '2407', '1163', '0'), +('2', '17', '12', '2291', '3830', '0'), +('2', '17', '12', '2923', '3074', '0'), +('2', '17', '12', '20655', '3022', '0'), +('2', '17', '12', '4345', '1399', '0'), +('2', '17', '18', '4886', '2158', '0'), +('2', '17', '18', '2292', '1663', '0'), +('2', '17', '18', '4410', '1142', '0'), +('2', '17', '18', '2461', '1014', '0'), +('2', '17', '19', '68239', '2540', '0'), +('2', '17', '19', '4837', '2051', '0'), +('2', '17', '19', '1368', '2016', '0'), +('2', '17', '19', '4407', '1908', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '17', '13', '11691', '10743', '0'), +('2', '17', '13', '27718', '7556', '0'), +('2', '17', '13', '27719', '5401', '0'), +('2', '17', '13', '10333', '5300', '0'), +('2', '17', '14', '27716', '8601', '0'), +('2', '17', '14', '10333', '5300', '0'), +('2', '17', '14', '10335', '3686', '0'), +('2', '17', '14', '14107', '3641', '0'), +('2', '17', '11', '14762', '2204', '0'), +('2', '17', '11', '9246', '2066', '0'), +('2', '17', '11', '20677', '450', '0'), +('2', '17', '11', '16941', '411', '0'), +('2', '18', '22', '9246', '0', '0'), +('2', '18', '22', '10323', '0', '0'), +('2', '18', '22', '44492', '0', '0'), +('2', '18', '22', '13101', '0', '0'), +('2', '18', '1', '14702', '3750', '0'), +('2', '18', '1', '14701', '2862', '0'), +('2', '18', '1', '30361', '2640', '0'), +('2', '18', '1', '14563', '2260', '0'), +('2', '18', '2', '10143', '5368', '0'), +('2', '18', '2', '30363', '3700', '0'), +('2', '18', '2', '3000', '2534', '0'), +('2', '18', '2', '2294', '2475', '0'), +('2', '18', '3', '11052', '3262', '0'), +('2', '18', '3', '14108', '1696', '0'), +('2', '18', '3', '4505', '1552', '0'), +('2', '18', '3', '14695', '1531', '0'), +('2', '18', '5', '14703', '6050', '0'), +('2', '18', '5', '14562', '3352', '0'), +('2', '18', '5', '14700', '3318', '0'), +('2', '18', '5', '30362', '3140', '0'), +('2', '18', '8', '11603', '10267', '0'), +('2', '18', '8', '2349', '3554', '0'), +('2', '18', '8', '12238', '2997', '0'), +('2', '18', '8', '1363', '2510', '0'), +('2', '18', '6', '2924', '6913', '0'), +('2', '18', '6', '27717', '6219', '0'), +('2', '18', '6', '1557', '5310', '0'), +('2', '18', '6', '1401', '2174', '0'), +('2', '18', '17', '2285', '10236', '0'), +('2', '18', '17', '4882', '6262', '0'), +('2', '18', '17', '4342', '2301', '0'), +('2', '18', '17', '2405', '1164', '0'), +('2', '18', '7', '1362', '2624', '0'), +('2', '18', '7', '2289', '2200', '0'), +('2', '18', '7', '1321', '1746', '0'), +('2', '18', '7', '10336', '656', '0'), +('2', '18', '9', '4884', '2060', '0'), +('2', '18', '9', '4344', '2051', '0'), +('2', '18', '9', '10408', '2002', '0'), +('2', '18', '9', '14650', '1662', '0'), +('2', '18', '15', '10150', '3004', '0'), +('2', '18', '15', '10163', '2300', '0'), +('2', '18', '15', '14651', '2224', '0'), +('2', '18', '15', '30360', '1600', '0'), +('2', '18', '20', '11666', '8325', '0'), +('2', '18', '20', '2742', '5121', '0'), +('2', '18', '20', '2288', '4478', '0'), +('2', '18', '20', '2407', '1223', '0'), +('2', '18', '12', '2291', '3830', '0'), +('2', '18', '12', '2923', '3074', '0'), +('2', '18', '12', '20655', '3047', '0'), +('2', '18', '12', '4345', '1460', '0'), +('2', '18', '18', '4886', '2267', '0'), +('2', '18', '18', '2292', '1711', '0'), +('2', '18', '18', '4410', '1142', '0'), +('2', '18', '18', '2461', '1062', '0'), +('2', '18', '19', '68239', '2576', '0'), +('2', '18', '19', '4837', '2111', '0'), +('2', '18', '19', '4407', '2017', '0'), +('2', '18', '19', '1368', '2016', '0'), +('2', '18', '13', '11691', '10925', '0'), +('2', '18', '13', '27718', '7677', '0'), +('2', '18', '13', '27719', '5493', '0'), +('2', '18', '13', '10333', '5300', '0'), +('2', '18', '14', '27716', '8710', '0'), +('2', '18', '14', '10333', '5300', '0'), +('2', '18', '14', '10335', '3903', '0'), +('2', '18', '14', '14107', '3701', '0'), +('2', '18', '11', '14762', '2204', '0'), +('2', '18', '11', '9246', '2186', '0'), +('2', '18', '11', '20677', '450', '0'), +('2', '18', '11', '16941', '435', '0'), +('2', '19', '22', '9246', '0', '0'), +('2', '19', '22', '10323', '0', '0'), +('2', '19', '22', '44492', '0', '0'), +('2', '19', '22', '13101', '0', '0'), +('2', '19', '1', '14702', '3750', '0'), +('2', '19', '1', '14701', '2862', '0'), +('2', '19', '1', '30361', '2640', '0'), +('2', '19', '1', '14563', '2369', '0'), +('2', '19', '2', '10143', '5368', '0'), +('2', '19', '2', '30363', '3700', '0'), +('2', '19', '2', '3000', '2534', '0'), +('2', '19', '2', '2294', '2499', '0'), +('2', '19', '3', '11052', '3443', '0'), +('2', '19', '3', '14108', '1781', '0'), +('2', '19', '3', '4505', '1637', '0'), +('2', '19', '3', '14695', '1615', '0'), +('2', '19', '5', '14703', '6050', '0'), +('2', '19', '5', '14562', '3437', '0'), +('2', '19', '5', '14700', '3318', '0'), +('2', '19', '5', '30362', '3140', '0'), +('2', '19', '8', '11603', '10376', '0'), +('2', '19', '8', '2349', '3554', '0'), +('2', '19', '8', '12238', '3118', '0'), +('2', '19', '8', '1363', '2510', '0'), +('2', '19', '6', '2924', '6973', '0'), +('2', '19', '6', '27717', '6367', '0'), +('2', '19', '6', '1557', '5310', '0'), +('2', '19', '6', '1401', '2174', '0'), +('2', '19', '17', '2285', '10285', '0'), +('2', '19', '17', '4882', '6448', '0'), +('2', '19', '17', '4342', '2422', '0'), +('2', '19', '17', '2405', '1225', '0'), +('2', '19', '7', '1362', '2624', '0'), +('2', '19', '7', '2289', '2248', '0'), +('2', '19', '7', '1321', '1746', '0'), +('2', '19', '7', '10336', '692', '0'), +('2', '19', '9', '4884', '2060', '0'), +('2', '19', '9', '4344', '2051', '0'), +('2', '19', '9', '10408', '2002', '0'), +('2', '19', '9', '2290', '1681', '0'), +('2', '19', '15', '10150', '3004', '0'), +('2', '19', '15', '10163', '2300', '0'), +('2', '19', '15', '14651', '2224', '0'), +('2', '19', '15', '30360', '1600', '0'), +('2', '19', '20', '11666', '8327', '0'), +('2', '19', '20', '2742', '5124', '0'), +('2', '19', '20', '2288', '4478', '0'), +('2', '19', '20', '2407', '1284', '0'), +('2', '19', '12', '2291', '3830', '0'), +('2', '19', '12', '2923', '3074', '0'), +('2', '19', '12', '20655', '3072', '0'), +('2', '19', '12', '4345', '1520', '0'), +('2', '19', '18', '4886', '2375', '0'), +('2', '19', '18', '2292', '1759', '0'), +('2', '19', '18', '4410', '1142', '0'), +('2', '19', '18', '2461', '1110', '0'), +('2', '19', '19', '68239', '2612', '0'), +('2', '19', '19', '4837', '2171', '0'), +('2', '19', '19', '4407', '2126', '0'), +('2', '19', '19', '1368', '2016', '0'), +('2', '19', '13', '11691', '11106', '0'), +('2', '19', '13', '27718', '7798', '0'), +('2', '19', '13', '27719', '5585', '0'), +('2', '19', '13', '10333', '5300', '0'), +('2', '19', '14', '27716', '8819', '0'), +('2', '19', '14', '10333', '5300', '0'), +('2', '19', '14', '10335', '4120', '0'), +('2', '19', '14', '14107', '3762', '0'), +('2', '19', '11', '9246', '2307', '0'), +('2', '19', '11', '14762', '2204', '0'), +('2', '19', '11', '16941', '459', '0'), +('2', '19', '11', '20677', '450', '0'), +('2', '20', '22', '9246', '0', '0'), +('2', '20', '22', '10323', '0', '0'), +('2', '20', '22', '44492', '0', '0'), +('2', '20', '22', '13101', '0', '0'), +('2', '20', '1', '14702', '3750', '0'), +('2', '20', '1', '14701', '2862', '0'), +('2', '20', '1', '30361', '2640', '0'), +('2', '20', '1', '14563', '2477', '0'), +('2', '20', '2', '10143', '5368', '0'), +('2', '20', '2', '30363', '3700', '0'), +('2', '20', '2', '3000', '2534', '0'), +('2', '20', '2', '2294', '2523', '0'), +('2', '20', '3', '11052', '3624', '0'), +('2', '20', '3', '14108', '1865', '0'), +('2', '20', '3', '4505', '1721', '0'), +('2', '20', '3', '14695', '1700', '0'), +('2', '20', '5', '14703', '6050', '0'), +('2', '20', '5', '14562', '3521', '0'), +('2', '20', '5', '14700', '3318', '0'), +('2', '20', '5', '30362', '3140', '0'), +('2', '20', '8', '11603', '10485', '0'), +('2', '20', '8', '2349', '3554', '0'), +('2', '20', '8', '12238', '3238', '0'), +('2', '20', '8', '1363', '2510', '0'), +('2', '20', '6', '2924', '7034', '0'), +('2', '20', '6', '27717', '6514', '0'), +('2', '20', '6', '1557', '5310', '0'), +('2', '20', '6', '1401', '2174', '0'), +('2', '20', '17', '2285', '10333', '0'), +('2', '20', '17', '4882', '6634', '0'), +('2', '20', '17', '4342', '2543', '0'), +('2', '20', '17', '2405', '1287', '0'), +('2', '20', '7', '1362', '2624', '0'), +('2', '20', '7', '2289', '2297', '0'), +('2', '20', '7', '1321', '1746', '0'), +('2', '20', '7', '10336', '728', '0'), +('2', '20', '9', '4884', '2060', '0'), +('2', '20', '9', '4344', '2051', '0'), +('2', '20', '9', '10408', '2002', '0'), +('2', '20', '9', '2290', '1742', '0'), +('2', '20', '15', '10150', '3004', '0'), +('2', '20', '15', '10163', '2300', '0'), +('2', '20', '15', '14651', '2224', '0'), +('2', '20', '15', '30360', '1600', '0'), +('2', '20', '20', '11666', '8329', '0'), +('2', '20', '20', '2742', '5127', '0'), +('2', '20', '20', '2288', '4478', '0'), +('2', '20', '20', '2407', '1344', '0'), +('2', '20', '12', '2291', '3830', '0'), +('2', '20', '12', '20655', '3097', '0'), +('2', '20', '12', '2923', '3074', '0'), +('2', '20', '12', '4345', '1580', '0'), +('2', '20', '18', '4886', '2484', '0'), +('2', '20', '18', '2292', '1807', '0'), +('2', '20', '18', '2461', '1159', '0'), +('2', '20', '18', '4410', '1142', '0'), +('2', '20', '19', '68239', '2648', '0'), +('2', '20', '19', '4407', '2235', '0'), +('2', '20', '19', '4837', '2232', '0'), +('2', '20', '19', '1368', '2016', '0'), +('2', '20', '13', '11691', '11287', '0'), +('2', '20', '13', '27718', '7918', '0'), +('2', '20', '13', '27719', '5677', '0'), +('2', '20', '13', '10333', '5300', '0'), +('2', '20', '14', '27716', '8927', '0'), +('2', '20', '14', '10333', '5300', '0'), +('2', '20', '14', '10335', '4338', '0'), +('2', '20', '14', '14107', '3822', '0'), +('2', '20', '11', '9246', '2428', '0'), +('2', '20', '11', '14762', '2204', '0'), +('2', '20', '11', '16941', '483', '0'), +('2', '20', '11', '20677', '450', '0'), +('2', '21', '22', '9246', '0', '0'), +('2', '21', '22', '10323', '0', '0'), +('2', '21', '22', '44492', '0', '0'), +('2', '21', '22', '13101', '0', '0'), +('2', '21', '1', '14702', '3750', '0'), +('2', '21', '1', '14701', '2862', '0'), +('2', '21', '1', '30361', '2640', '0'), +('2', '21', '1', '14563', '2586', '0'), +('2', '21', '2', '10143', '5368', '0'), +('2', '21', '2', '30363', '3700', '0'), +('2', '21', '2', '2294', '2547', '0'), +('2', '21', '2', '3000', '2534', '0'), +('2', '21', '3', '11052', '3805', '0'), +('2', '21', '3', '14108', '1950', '0'), +('2', '21', '3', '4505', '1806', '0'), +('2', '21', '3', '14695', '1784', '0'), +('2', '21', '5', '14703', '6050', '0'), +('2', '21', '5', '14562', '3606', '0'), +('2', '21', '5', '14700', '3318', '0'), +('2', '21', '5', '30362', '3140', '0'), +('2', '21', '8', '11603', '10594', '0'), +('2', '21', '8', '2349', '3554', '0'), +('2', '21', '8', '12238', '3359', '0'), +('2', '21', '8', '1363', '2510', '0'), +('2', '21', '6', '2924', '7094', '0'), +('2', '21', '6', '27717', '6661', '0'), +('2', '21', '6', '1557', '5310', '0'), +('2', '21', '6', '1401', '2174', '0'), +('2', '21', '17', '2285', '10381', '0'), +('2', '21', '17', '4882', '6819', '0'), +('2', '21', '17', '4342', '2664', '0'), +('2', '21', '17', '2405', '1348', '0'), +('2', '21', '7', '1362', '2624', '0'), +('2', '21', '7', '2289', '2345', '0'), +('2', '21', '7', '1321', '1746', '0'), +('2', '21', '7', '10336', '765', '0'), +('2', '21', '9', '4884', '2060', '0'), +('2', '21', '9', '4344', '2051', '0'), +('2', '21', '9', '10408', '2002', '0'), +('2', '21', '9', '2290', '1803', '0'), +('2', '21', '15', '10150', '3004', '0'), +('2', '21', '15', '10163', '2300', '0'), +('2', '21', '15', '14651', '2224', '0'), +('2', '21', '15', '30360', '1600', '0'), +('2', '21', '20', '11666', '8331', '0'), +('2', '21', '20', '2742', '5130', '0'), +('2', '21', '20', '2288', '4478', '0'), +('2', '21', '20', '2407', '1405', '0'), +('2', '21', '12', '2291', '3830', '0'), +('2', '21', '12', '20655', '3122', '0'), +('2', '21', '12', '2923', '3074', '0'), +('2', '21', '12', '4345', '1641', '0'), +('2', '21', '18', '4886', '2593', '0'), +('2', '21', '18', '2292', '1856', '0'), +('2', '21', '18', '2461', '1207', '0'), +('2', '21', '18', '4410', '1142', '0'), +('2', '21', '19', '68239', '2684', '0'), +('2', '21', '19', '4407', '2343', '0'), +('2', '21', '19', '4837', '2292', '0'), +('2', '21', '19', '1368', '2016', '0'), +('2', '21', '13', '11691', '11468', '0'), +('2', '21', '13', '27718', '8039', '0'), +('2', '21', '13', '27719', '5769', '0'), +('2', '21', '13', '10333', '5300', '0'), +('2', '21', '14', '27716', '9036', '0'), +('2', '21', '14', '10333', '5300', '0'), +('2', '21', '14', '10335', '4555', '0'), +('2', '21', '14', '14107', '3882', '0'), +('2', '21', '11', '9246', '2549', '0'), +('2', '21', '11', '14762', '2204', '0'), +('2', '21', '11', '16941', '507', '0'), +('2', '21', '11', '20677', '450', '0'), +('2', '22', '22', '9246', '0', '0'), +('2', '22', '22', '10323', '0', '0'), +('2', '22', '22', '44492', '0', '0'), +('2', '22', '22', '13101', '0', '0'), +('2', '22', '1', '14702', '3750', '0'), +('2', '22', '1', '14701', '2862', '0'), +('2', '22', '1', '14563', '2695', '0'), +('2', '22', '1', '30361', '2640', '0'), +('2', '22', '2', '10143', '5368', '0'), +('2', '22', '2', '30363', '3700', '0'), +('2', '22', '2', '2294', '2571', '0'), +('2', '22', '2', '3000', '2534', '0'), +('2', '22', '3', '11052', '3986', '0'), +('2', '22', '3', '14108', '2034', '0'), +('2', '22', '3', '4505', '1891', '0'), +('2', '22', '3', '14695', '1869', '0'), +('2', '22', '5', '14703', '6050', '0'), +('2', '22', '5', '14562', '3691', '0'), +('2', '22', '5', '14700', '3318', '0'), +('2', '22', '5', '1536', '3183', '0'), +('2', '22', '8', '11603', '10702', '0'), +('2', '22', '8', '2349', '3554', '0'), +('2', '22', '8', '12238', '3480', '0'), +('2', '22', '8', '1363', '2510', '0'), +('2', '22', '6', '2924', '7154', '0'), +('2', '22', '6', '27717', '6809', '0'), +('2', '22', '6', '1557', '5310', '0'), +('2', '22', '6', '1401', '2174', '0'), +('2', '22', '17', '2285', '10429', '0'), +('2', '22', '17', '4882', '7005', '0'), +('2', '22', '17', '4342', '2784', '0'), +('2', '22', '17', '2405', '1409', '0'), +('2', '22', '7', '1362', '2624', '0'), +('2', '22', '7', '2289', '2393', '0'), +('2', '22', '7', '1321', '1746', '0'), +('2', '22', '7', '10336', '801', '0'), +('2', '22', '9', '4884', '2060', '0'), +('2', '22', '9', '4344', '2051', '0'), +('2', '22', '9', '10408', '2002', '0'), +('2', '22', '9', '2290', '1864', '0'), +('2', '22', '15', '10150', '3004', '0'), +('2', '22', '15', '10163', '2300', '0'), +('2', '22', '15', '14651', '2224', '0'), +('2', '22', '15', '30360', '1600', '0'), +('2', '22', '20', '11666', '8333', '0'), +('2', '22', '20', '2742', '5133', '0'), +('2', '22', '20', '2288', '4478', '0'), +('2', '22', '20', '2407', '1465', '0'), +('2', '22', '12', '2291', '3830', '0'), +('2', '22', '12', '20655', '3146', '0'), +('2', '22', '12', '2923', '3074', '0'), +('2', '22', '12', '4345', '1701', '0'), +('2', '22', '18', '4886', '2702', '0'), +('2', '22', '18', '2292', '1904', '0'), +('2', '22', '18', '2461', '1255', '0'), +('2', '22', '18', '4410', '1142', '0'), +('2', '22', '19', '68239', '2721', '0'), +('2', '22', '19', '4407', '2452', '0'), +('2', '22', '19', '4837', '2353', '0'), +('2', '22', '19', '2293', '2032', '0'), +('2', '22', '13', '11691', '11649', '0'), +('2', '22', '13', '27718', '8160', '0'), +('2', '22', '13', '27719', '5861', '0'), +('2', '22', '13', '10333', '5300', '0'), +('2', '22', '14', '27716', '9145', '0'), +('2', '22', '14', '10333', '5300', '0'), +('2', '22', '14', '10335', '4773', '0'), +('2', '22', '14', '14107', '3943', '0'), +('2', '22', '11', '9246', '2670', '0'), +('2', '22', '11', '14762', '2204', '0'), +('2', '22', '11', '16941', '532', '0'), +('2', '22', '11', '20677', '450', '0'), +('2', '23', '22', '9246', '0', '0'), +('2', '23', '22', '10323', '0', '0'), +('2', '23', '22', '44492', '0', '0'), +('2', '23', '22', '13101', '0', '0'), +('2', '23', '1', '14702', '3750', '0'), +('2', '23', '1', '14701', '2862', '0'), +('2', '23', '1', '14563', '2804', '0'), +('2', '23', '1', '30361', '2640', '0'), +('2', '23', '2', '10143', '5368', '0'), +('2', '23', '2', '30363', '3700', '0'), +('2', '23', '2', '2294', '2596', '0'), +('2', '23', '2', '3000', '2534', '0'), +('2', '23', '3', '11052', '4168', '0'), +('2', '23', '3', '14108', '2119', '0'), +('2', '23', '3', '4505', '1975', '0'), +('2', '23', '3', '14695', '1953', '0'), +('2', '23', '5', '14703', '6050', '0'), +('2', '23', '5', '14562', '3775', '0'), +('2', '23', '5', '14700', '3318', '0'), +('2', '23', '5', '1536', '3292', '0'), +('2', '23', '8', '11603', '10811', '0'), +('2', '23', '8', '12238', '3601', '0'), +('2', '23', '8', '2349', '3554', '0'), +('2', '23', '8', '1363', '2510', '0'), +('2', '23', '6', '2924', '7215', '0'), +('2', '23', '6', '27717', '6956', '0'), +('2', '23', '6', '1557', '5310', '0'), +('2', '23', '6', '1904', '2253', '0'), +('2', '23', '17', '2285', '10478', '0'), +('2', '23', '17', '4882', '7191', '0'), +('2', '23', '17', '4342', '2905', '0'), +('2', '23', '17', '2405', '1470', '0'), +('2', '23', '7', '1362', '2624', '0'), +('2', '23', '7', '2289', '2442', '0'), +('2', '23', '7', '1321', '1746', '0'), +('2', '23', '7', '10336', '837', '0'), +('2', '23', '9', '4884', '2060', '0'), +('2', '23', '9', '4344', '2051', '0'), +('2', '23', '9', '10408', '2002', '0'), +('2', '23', '9', '2290', '1925', '0'), +('2', '23', '15', '10150', '3004', '0'), +('2', '23', '15', '10163', '2300', '0'), +('2', '23', '15', '14651', '2224', '0'), +('2', '23', '15', '14631', '1667', '0'), +('2', '23', '20', '11666', '8335', '0'), +('2', '23', '20', '2742', '5136', '0'), +('2', '23', '20', '2288', '4478', '0'), +('2', '23', '20', '2407', '1525', '0'), +('2', '23', '12', '2291', '3830', '0'), +('2', '23', '12', '20655', '3171', '0'), +('2', '23', '12', '2923', '3074', '0'), +('2', '23', '12', '4345', '1762', '0'), +('2', '23', '18', '4886', '2810', '0'), +('2', '23', '18', '2292', '1952', '0'), +('2', '23', '18', '2461', '1304', '0'), +('2', '23', '18', '4410', '1142', '0'), +('2', '23', '19', '68239', '2757', '0'), +('2', '23', '19', '4407', '2561', '0'), +('2', '23', '19', '4837', '2413', '0'), +('2', '23', '19', '2293', '2069', '0'), +('2', '23', '13', '11691', '11831', '0'), +('2', '23', '13', '27718', '8281', '0'), +('2', '23', '13', '27719', '5953', '0'), +('2', '23', '13', '10333', '5300', '0'), +('2', '23', '14', '27716', '9254', '0'), +('2', '23', '14', '10333', '5300', '0'), +('2', '23', '14', '10335', '4990', '0'), +('2', '23', '14', '14107', '4003', '0'), +('2', '23', '11', '9246', '2790', '0'), +('2', '23', '11', '14762', '2204', '0'), +('2', '23', '11', '16941', '556', '0'), +('2', '23', '11', '20677', '450', '0'), +('2', '24', '22', '9246', '0', '0'), +('2', '24', '22', '10323', '0', '0'), +('2', '24', '22', '44492', '0', '0'), +('2', '24', '22', '13101', '0', '0'), +('2', '24', '1', '14702', '3750', '0'), +('2', '24', '1', '14563', '2912', '0'), +('2', '24', '1', '14701', '2862', '0'), +('2', '24', '1', '30361', '2640', '0'), +('2', '24', '2', '10143', '5368', '0'), +('2', '24', '2', '30363', '3700', '0'), +('2', '24', '2', '2294', '2620', '0'), +('2', '24', '2', '3000', '2534', '0'), +('2', '24', '3', '11052', '4349', '0'), +('2', '24', '3', '14108', '2204', '0'), +('2', '24', '3', '4505', '2060', '0'), +('2', '24', '3', '14695', '2038', '0'), +('2', '24', '5', '14703', '6050', '0'), +('2', '24', '5', '14562', '3860', '0'), +('2', '24', '5', '1536', '3400', '0'), +('2', '24', '5', '14700', '3318', '0'), +('2', '24', '8', '11603', '10920', '0'), +('2', '24', '8', '12238', '3722', '0'), +('2', '24', '8', '2349', '3554', '0'), +('2', '24', '8', '1363', '2510', '0'), +('2', '24', '6', '2924', '7275', '0'), +('2', '24', '6', '27717', '7103', '0'), +('2', '24', '6', '1557', '5310', '0'), +('2', '24', '6', '1904', '2350', '0'), +('2', '24', '17', '2285', '10526', '0'), +('2', '24', '17', '4882', '7377', '0'), +('2', '24', '17', '4342', '3026', '0'), +('2', '24', '17', '2405', '1532', '0'), +('2', '24', '7', '1362', '2624', '0'), +('2', '24', '7', '2289', '2490', '0'), +('2', '24', '7', '1321', '1746', '0'), +('2', '24', '7', '10336', '873', '0'), +('2', '24', '9', '4884', '2060', '0'), +('2', '24', '9', '4344', '2051', '0'), +('2', '24', '9', '10408', '2002', '0'), +('2', '24', '9', '2290', '1986', '0'), +('2', '24', '15', '10150', '3004', '0'), +('2', '24', '15', '10163', '2300', '0'), +('2', '24', '15', '14651', '2224', '0'), +('2', '24', '15', '14631', '1740', '0'), +('2', '24', '20', '11666', '8338', '0'), +('2', '24', '20', '2742', '5139', '0'), +('2', '24', '20', '2288', '4478', '0'), +('2', '24', '20', '2407', '1586', '0'), +('2', '24', '12', '2291', '3830', '0'), +('2', '24', '12', '20655', '3196', '0'), +('2', '24', '12', '2923', '3074', '0'), +('2', '24', '12', '4345', '1822', '0'), +('2', '24', '18', '4886', '2919', '0'), +('2', '24', '18', '2292', '2001', '0'), +('2', '24', '18', '2461', '1352', '0'), +('2', '24', '18', '4410', '1142', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '24', '19', '68239', '2793', '0'), +('2', '24', '19', '4407', '2669', '0'), +('2', '24', '19', '4837', '2473', '0'), +('2', '24', '19', '2293', '2105', '0'), +('2', '24', '13', '11691', '12012', '0'), +('2', '24', '13', '27718', '8402', '0'), +('2', '24', '13', '27719', '6046', '0'), +('2', '24', '13', '10333', '5300', '0'), +('2', '24', '14', '27716', '9362', '0'), +('2', '24', '14', '10333', '5300', '0'), +('2', '24', '14', '10335', '5208', '0'), +('2', '24', '14', '14107', '4064', '0'), +('2', '24', '11', '9246', '2911', '0'), +('2', '24', '11', '14762', '2204', '0'), +('2', '24', '11', '16941', '580', '0'), +('2', '24', '11', '20677', '450', '0'), +('2', '25', '22', '9246', '0', '0'), +('2', '25', '22', '10323', '0', '0'), +('2', '25', '22', '44492', '0', '0'), +('2', '25', '22', '13101', '0', '0'), +('2', '25', '1', '14702', '3750', '0'), +('2', '25', '1', '14563', '3021', '0'), +('2', '25', '1', '14701', '2862', '0'), +('2', '25', '1', '30361', '2640', '0'), +('2', '25', '2', '10143', '5368', '0'), +('2', '25', '2', '30363', '3700', '0'), +('2', '25', '2', '2294', '2644', '0'), +('2', '25', '2', '3000', '2534', '0'), +('2', '25', '3', '11052', '4530', '0'), +('2', '25', '3', '14108', '2288', '0'), +('2', '25', '3', '4505', '2144', '0'), +('2', '25', '3', '14695', '2122', '0'), +('2', '25', '5', '14703', '6050', '0'), +('2', '25', '5', '14562', '3944', '0'), +('2', '25', '5', '1536', '3509', '0'), +('2', '25', '5', '14700', '3318', '0'), +('2', '25', '8', '11603', '11028', '0'), +('2', '25', '8', '12238', '3842', '0'), +('2', '25', '8', '2349', '3554', '0'), +('2', '25', '8', '1363', '2510', '0'), +('2', '25', '6', '2924', '7336', '0'), +('2', '25', '6', '27717', '7251', '0'), +('2', '25', '6', '1557', '5310', '0'), +('2', '25', '6', '1904', '2446', '0'), +('2', '25', '17', '2285', '10574', '0'), +('2', '25', '17', '4882', '7562', '0'), +('2', '25', '17', '4342', '3147', '0'), +('2', '25', '17', '2405', '1593', '0'), +('2', '25', '7', '1362', '2624', '0'), +('2', '25', '7', '2289', '2538', '0'), +('2', '25', '7', '1321', '1746', '0'), +('2', '25', '7', '10336', '910', '0'), +('2', '25', '9', '4884', '2060', '0'), +('2', '25', '9', '4344', '2051', '0'), +('2', '25', '9', '2290', '2047', '0'), +('2', '25', '9', '10408', '2002', '0'), +('2', '25', '15', '10150', '3004', '0'), +('2', '25', '15', '10163', '2300', '0'), +('2', '25', '15', '14651', '2224', '0'), +('2', '25', '15', '14631', '1812', '0'), +('2', '25', '20', '11666', '8340', '0'), +('2', '25', '20', '2742', '5142', '0'), +('2', '25', '20', '2288', '4478', '0'), +('2', '25', '20', '2407', '1646', '0'), +('2', '25', '12', '2291', '3830', '0'), +('2', '25', '12', '20655', '3221', '0'), +('2', '25', '12', '2923', '3074', '0'), +('2', '25', '12', '4345', '1882', '0'), +('2', '25', '18', '4886', '3028', '0'), +('2', '25', '18', '2292', '2049', '0'), +('2', '25', '18', '2461', '1400', '0'), +('2', '25', '18', '4410', '1142', '0'), +('2', '25', '19', '68239', '2829', '0'), +('2', '25', '19', '4407', '2778', '0'), +('2', '25', '19', '4837', '2534', '0'), +('2', '25', '19', '2293', '2141', '0'), +('2', '25', '13', '11691', '12193', '0'), +('2', '25', '13', '27718', '8522', '0'), +('2', '25', '13', '27719', '6138', '0'), +('2', '25', '13', '10333', '5300', '0'), +('2', '25', '14', '27716', '9471', '0'), +('2', '25', '14', '10335', '5425', '0'), +('2', '25', '14', '10333', '5300', '0'), +('2', '25', '14', '14107', '4124', '0'), +('2', '25', '11', '9246', '3032', '0'), +('2', '25', '11', '14762', '2204', '0'), +('2', '25', '11', '16941', '604', '0'), +('2', '25', '11', '20677', '450', '0'), +('2', '26', '22', '9246', '0', '0'), +('2', '26', '22', '10323', '0', '0'), +('2', '26', '22', '44492', '0', '0'), +('2', '26', '22', '13101', '0', '0'), +('2', '26', '1', '14702', '3750', '0'), +('2', '26', '1', '14563', '3130', '0'), +('2', '26', '1', '14701', '2862', '0'), +('2', '26', '1', '30361', '2640', '0'), +('2', '26', '2', '10143', '5368', '0'), +('2', '26', '2', '30363', '3700', '0'), +('2', '26', '2', '2294', '2668', '0'), +('2', '26', '2', '3000', '2534', '0'), +('2', '26', '3', '11052', '4711', '0'), +('2', '26', '3', '14108', '2373', '0'), +('2', '26', '3', '4505', '2229', '0'), +('2', '26', '3', '14695', '2207', '0'), +('2', '26', '5', '14703', '6050', '0'), +('2', '26', '5', '14562', '4029', '0'), +('2', '26', '5', '1536', '3618', '0'), +('2', '26', '5', '14700', '3318', '0'), +('2', '26', '8', '11603', '11137', '0'), +('2', '26', '8', '12238', '3963', '0'), +('2', '26', '8', '2349', '3554', '0'), +('2', '26', '8', '1363', '2510', '0'), +('2', '26', '6', '27717', '7398', '0'), +('2', '26', '6', '2924', '7396', '0'), +('2', '26', '6', '1557', '5310', '0'), +('2', '26', '6', '1904', '2543', '0'), +('2', '26', '17', '2285', '10623', '0'), +('2', '26', '17', '4882', '7748', '0'), +('2', '26', '17', '4342', '3268', '0'), +('2', '26', '17', '2405', '1654', '0'), +('2', '26', '7', '1362', '2624', '0'), +('2', '26', '7', '2289', '2587', '0'), +('2', '26', '7', '1321', '1746', '0'), +('2', '26', '7', '10336', '946', '0'), +('2', '26', '9', '2290', '2108', '0'), +('2', '26', '9', '4884', '2060', '0'), +('2', '26', '9', '4344', '2051', '0'), +('2', '26', '9', '10408', '2002', '0'), +('2', '26', '15', '10150', '3004', '0'), +('2', '26', '15', '10163', '2300', '0'), +('2', '26', '15', '14651', '2224', '0'), +('2', '26', '15', '14631', '1884', '0'), +('2', '26', '20', '11666', '8342', '0'), +('2', '26', '20', '2742', '5145', '0'), +('2', '26', '20', '2288', '4478', '0'), +('2', '26', '20', '2407', '1707', '0'), +('2', '26', '12', '2291', '3830', '0'), +('2', '26', '12', '20655', '3245', '0'), +('2', '26', '12', '2923', '3074', '0'), +('2', '26', '12', '4345', '1943', '0'), +('2', '26', '18', '4886', '3136', '0'), +('2', '26', '18', '2292', '2097', '0'), +('2', '26', '18', '2461', '1449', '0'), +('2', '26', '18', '4410', '1142', '0'), +('2', '26', '19', '4407', '2887', '0'), +('2', '26', '19', '68239', '2866', '0'), +('2', '26', '19', '4837', '2594', '0'), +('2', '26', '19', '2293', '2177', '0'), +('2', '26', '13', '11691', '12374', '0'), +('2', '26', '13', '27718', '8643', '0'), +('2', '26', '13', '27719', '6230', '0'), +('2', '26', '13', '10333', '5300', '0'), +('2', '26', '14', '27716', '9580', '0'), +('2', '26', '14', '10335', '5643', '0'), +('2', '26', '14', '10333', '5300', '0'), +('2', '26', '14', '14107', '4184', '0'), +('2', '26', '11', '9246', '3153', '0'), +('2', '26', '11', '14762', '2204', '0'), +('2', '26', '11', '16941', '628', '0'), +('2', '26', '11', '20677', '450', '0'), +('2', '27', '22', '9246', '0', '0'), +('2', '27', '22', '10323', '0', '0'), +('2', '27', '22', '44492', '0', '0'), +('2', '27', '22', '13101', '0', '0'), +('2', '27', '1', '14702', '3750', '0'), +('2', '27', '1', '14563', '3238', '0'), +('2', '27', '1', '14701', '2862', '0'), +('2', '27', '1', '30361', '2640', '0'), +('2', '27', '2', '10143', '5368', '0'), +('2', '27', '2', '30363', '3700', '0'), +('2', '27', '2', '2294', '2692', '0'), +('2', '27', '2', '3000', '2534', '0'), +('2', '27', '3', '11052', '4892', '0'), +('2', '27', '3', '14108', '2457', '0'), +('2', '27', '3', '4505', '2313', '0'), +('2', '27', '3', '14695', '2292', '0'), +('2', '27', '5', '14703', '6050', '0'), +('2', '27', '5', '14562', '4113', '0'), +('2', '27', '5', '1536', '3727', '0'), +('2', '27', '5', '14700', '3318', '0'), +('2', '27', '8', '11603', '11246', '0'), +('2', '27', '8', '12238', '4084', '0'), +('2', '27', '8', '2349', '3554', '0'), +('2', '27', '8', '1363', '2510', '0'), +('2', '27', '6', '27717', '7546', '0'), +('2', '27', '6', '2924', '7456', '0'), +('2', '27', '6', '1557', '5310', '0'), +('2', '27', '6', '1904', '2639', '0'), +('2', '27', '17', '2285', '10671', '0'), +('2', '27', '17', '4882', '7934', '0'), +('2', '27', '17', '4342', '3388', '0'), +('2', '27', '17', '2405', '1716', '0'), +('2', '27', '7', '2289', '2635', '0'), +('2', '27', '7', '1362', '2624', '0'), +('2', '27', '7', '1321', '1746', '0'), +('2', '27', '7', '10336', '982', '0'), +('2', '27', '9', '2290', '2169', '0'), +('2', '27', '9', '4884', '2060', '0'), +('2', '27', '9', '4344', '2051', '0'), +('2', '27', '9', '10408', '2002', '0'), +('2', '27', '15', '10150', '3004', '0'), +('2', '27', '15', '10163', '2300', '0'), +('2', '27', '15', '14651', '2224', '0'), +('2', '27', '15', '14631', '1957', '0'), +('2', '27', '20', '11666', '8344', '0'), +('2', '27', '20', '2742', '5148', '0'), +('2', '27', '20', '2288', '4478', '0'), +('2', '27', '20', '2407', '1767', '0'), +('2', '27', '12', '2291', '3830', '0'), +('2', '27', '12', '20655', '3270', '0'), +('2', '27', '12', '2923', '3074', '0'), +('2', '27', '12', '4345', '2003', '0'), +('2', '27', '18', '4886', '3245', '0'), +('2', '27', '18', '2292', '2146', '0'), +('2', '27', '18', '2461', '1497', '0'), +('2', '27', '18', '4410', '1142', '0'), +('2', '27', '19', '4407', '2996', '0'), +('2', '27', '19', '68239', '2902', '0'), +('2', '27', '19', '4837', '2655', '0'), +('2', '27', '19', '2293', '2214', '0'), +('2', '27', '13', '11691', '12555', '0'), +('2', '27', '13', '27718', '8764', '0'), +('2', '27', '13', '27719', '6322', '0'), +('2', '27', '13', '10333', '5300', '0'), +('2', '27', '14', '27716', '9688', '0'), +('2', '27', '14', '10335', '5860', '0'), +('2', '27', '14', '10333', '5300', '0'), +('2', '27', '14', '13991', '4262', '0'), +('2', '27', '11', '9246', '3274', '0'), +('2', '27', '11', '14762', '2204', '0'), +('2', '27', '11', '16941', '652', '0'), +('2', '27', '11', '20677', '450', '0'), +('2', '28', '22', '9246', '0', '0'), +('2', '28', '22', '10323', '0', '0'), +('2', '28', '22', '44492', '0', '0'), +('2', '28', '22', '13101', '0', '0'), +('2', '28', '1', '14702', '3750', '0'), +('2', '28', '1', '14563', '3347', '0'), +('2', '28', '1', '14701', '2862', '0'), +('2', '28', '1', '30361', '2640', '0'), +('2', '28', '2', '10143', '5368', '0'), +('2', '28', '2', '30363', '3700', '0'), +('2', '28', '2', '2294', '2716', '0'), +('2', '28', '2', '3000', '2534', '0'), +('2', '28', '3', '11052', '5074', '0'), +('2', '28', '3', '14108', '2542', '0'), +('2', '28', '3', '4505', '2398', '0'), +('2', '28', '3', '14695', '2376', '0'), +('2', '28', '5', '14703', '6050', '0'), +('2', '28', '5', '14562', '4198', '0'), +('2', '28', '5', '1536', '3835', '0'), +('2', '28', '5', '14700', '3318', '0'), +('2', '28', '8', '11603', '11355', '0'), +('2', '28', '8', '12238', '4205', '0'), +('2', '28', '8', '2349', '3554', '0'), +('2', '28', '8', '1363', '2510', '0'), +('2', '28', '6', '27717', '7693', '0'), +('2', '28', '6', '2924', '7517', '0'), +('2', '28', '6', '1557', '5310', '0'), +('2', '28', '6', '1904', '2736', '0'), +('2', '28', '17', '2285', '10719', '0'), +('2', '28', '17', '4882', '8120', '0'), +('2', '28', '17', '4342', '3509', '0'), +('2', '28', '17', '2405', '1777', '0'), +('2', '28', '7', '2289', '2683', '0'), +('2', '28', '7', '1362', '2624', '0'), +('2', '28', '7', '1321', '1746', '0'), +('2', '28', '7', '10336', '1018', '0'), +('2', '28', '9', '2290', '2230', '0'), +('2', '28', '9', '4884', '2060', '0'), +('2', '28', '9', '4344', '2051', '0'), +('2', '28', '9', '10408', '2002', '0'), +('2', '28', '15', '10150', '3004', '0'), +('2', '28', '15', '10163', '2300', '0'), +('2', '28', '15', '14651', '2224', '0'), +('2', '28', '15', '14631', '2029', '0'), +('2', '28', '20', '11666', '8346', '0'), +('2', '28', '20', '2742', '5151', '0'), +('2', '28', '20', '2288', '4478', '0'), +('2', '28', '20', '2407', '1827', '0'), +('2', '28', '12', '2291', '3830', '0'), +('2', '28', '12', '20655', '3295', '0'), +('2', '28', '12', '2923', '3074', '0'), +('2', '28', '12', '4345', '2064', '0'), +('2', '28', '18', '4886', '3354', '0'), +('2', '28', '18', '2292', '2194', '0'), +('2', '28', '18', '2461', '1545', '0'), +('2', '28', '18', '4410', '1142', '0'), +('2', '28', '19', '4407', '3104', '0'), +('2', '28', '19', '68239', '2938', '0'), +('2', '28', '19', '4837', '2715', '0'), +('2', '28', '19', '2293', '2250', '0'), +('2', '28', '13', '11691', '12737', '0'), +('2', '28', '13', '27718', '8885', '0'), +('2', '28', '13', '27719', '6414', '0'), +('2', '28', '13', '10333', '5300', '0'), +('2', '28', '14', '27716', '9797', '0'), +('2', '28', '14', '10335', '6077', '0'), +('2', '28', '14', '10333', '5300', '0'), +('2', '28', '14', '13991', '4382', '0'), +('2', '28', '11', '9246', '3394', '0'), +('2', '28', '11', '14762', '2204', '0'), +('2', '28', '11', '16941', '676', '0'), +('2', '28', '11', '20677', '450', '0'), +('2', '29', '22', '9246', '0', '0'), +('2', '29', '22', '10323', '0', '0'), +('2', '29', '22', '44492', '0', '0'), +('2', '29', '22', '13101', '0', '0'), +('2', '29', '1', '14702', '3750', '0'), +('2', '29', '1', '14563', '3456', '0'), +('2', '29', '1', '14701', '2862', '0'), +('2', '29', '1', '30361', '2640', '0'), +('2', '29', '2', '10143', '5368', '0'), +('2', '29', '2', '30363', '3700', '0'), +('2', '29', '2', '2294', '2741', '0'), +('2', '29', '2', '3000', '2534', '0'), +('2', '29', '3', '11052', '5255', '0'), +('2', '29', '3', '14108', '2626', '0'), +('2', '29', '3', '4505', '2482', '0'), +('2', '29', '3', '14695', '2461', '0'), +('2', '29', '5', '14703', '6050', '0'), +('2', '29', '5', '14562', '4282', '0'), +('2', '29', '5', '1536', '3944', '0'), +('2', '29', '5', '14700', '3318', '0'), +('2', '29', '8', '11603', '11463', '0'), +('2', '29', '8', '12238', '4326', '0'), +('2', '29', '8', '2349', '3554', '0'), +('2', '29', '8', '1363', '2510', '0'), +('2', '29', '6', '27717', '7840', '0'), +('2', '29', '6', '2924', '7577', '0'), +('2', '29', '6', '1557', '5310', '0'), +('2', '29', '6', '1904', '2833', '0'), +('2', '29', '17', '2285', '10768', '0'), +('2', '29', '17', '4882', '8305', '0'), +('2', '29', '17', '4342', '3630', '0'), +('2', '29', '17', '2405', '1838', '0'), +('2', '29', '7', '2289', '2731', '0'), +('2', '29', '7', '1362', '2624', '0'), +('2', '29', '7', '1321', '1746', '0'), +('2', '29', '7', '10336', '1055', '0'), +('2', '29', '9', '2290', '2291', '0'), +('2', '29', '9', '4884', '2060', '0'), +('2', '29', '9', '4344', '2051', '0'), +('2', '29', '9', '10408', '2002', '0'), +('2', '29', '15', '10150', '3004', '0'), +('2', '29', '15', '10163', '2300', '0'), +('2', '29', '15', '14651', '2224', '0'), +('2', '29', '15', '14631', '2102', '0'), +('2', '29', '20', '11666', '8348', '0'), +('2', '29', '20', '2742', '5154', '0'), +('2', '29', '20', '2288', '4478', '0'), +('2', '29', '20', '2407', '1888', '0'), +('2', '29', '12', '2291', '3830', '0'), +('2', '29', '12', '20655', '3320', '0'), +('2', '29', '12', '2923', '3074', '0'), +('2', '29', '12', '4345', '2124', '0'), +('2', '29', '18', '4886', '3463', '0'), +('2', '29', '18', '2292', '2242', '0'), +('2', '29', '18', '2461', '1594', '0'), +('2', '29', '18', '4410', '1142', '0'), +('2', '29', '19', '4407', '3213', '0'), +('2', '29', '19', '68239', '2974', '0'), +('2', '29', '19', '4837', '2775', '0'), +('2', '29', '19', '2293', '2286', '0'), +('2', '29', '13', '11691', '12918', '0'), +('2', '29', '13', '27718', '9006', '0'), +('2', '29', '13', '27719', '6506', '0'), +('2', '29', '13', '10333', '5300', '0'), +('2', '29', '14', '27716', '9906', '0'), +('2', '29', '14', '10335', '6295', '0'), +('2', '29', '14', '10333', '5300', '0'), +('2', '29', '14', '13991', '4503', '0'), +('2', '29', '11', '9246', '3515', '0'), +('2', '29', '11', '14762', '2204', '0'), +('2', '29', '11', '16941', '701', '0'), +('2', '29', '11', '20677', '450', '0'), +('2', '30', '22', '9246', '0', '0'), +('2', '30', '22', '10323', '0', '0'), +('2', '30', '22', '44492', '0', '0'), +('2', '30', '22', '13101', '0', '0'), +('2', '30', '1', '14702', '3750', '0'), +('2', '30', '1', '14563', '3565', '0'), +('2', '30', '1', '14701', '2862', '0'), +('2', '30', '1', '30361', '2640', '0'), +('2', '30', '2', '10143', '5368', '0'), +('2', '30', '2', '30363', '3700', '0'), +('2', '30', '2', '2294', '2765', '0'), +('2', '30', '2', '3000', '2534', '0'), +('2', '30', '3', '11052', '5436', '0'), +('2', '30', '3', '14108', '2711', '0'), +('2', '30', '3', '4505', '2567', '0'), +('2', '30', '3', '14695', '2545', '0'), +('2', '30', '5', '14703', '6050', '0'), +('2', '30', '5', '14562', '4367', '0'), +('2', '30', '5', '1536', '4053', '0'), +('2', '30', '5', '14700', '3318', '0'), +('2', '30', '8', '11603', '11572', '0'), +('2', '30', '8', '12238', '4446', '0'), +('2', '30', '8', '2349', '3554', '0'), +('2', '30', '8', '1363', '2510', '0'), +('2', '30', '6', '27717', '7988', '0'), +('2', '30', '6', '2924', '7638', '0'), +('2', '30', '6', '1557', '5310', '0'), +('2', '30', '6', '1904', '2929', '0'), +('2', '30', '17', '2285', '10816', '0'), +('2', '30', '17', '4882', '8491', '0'), +('2', '30', '17', '4342', '3751', '0'), +('2', '30', '17', '2405', '1900', '0'), +('2', '30', '7', '2289', '2780', '0'), +('2', '30', '7', '1362', '2624', '0'), +('2', '30', '7', '1321', '1746', '0'), +('2', '30', '7', '10336', '1091', '0'), +('2', '30', '9', '2290', '2352', '0'), +('2', '30', '9', '4884', '2060', '0'), +('2', '30', '9', '4344', '2051', '0'), +('2', '30', '9', '10408', '2002', '0'), +('2', '30', '15', '10150', '3004', '0'), +('2', '30', '15', '10163', '2300', '0'), +('2', '30', '15', '14651', '2224', '0'), +('2', '30', '15', '14631', '2174', '0'), +('2', '30', '20', '11666', '8350', '0'), +('2', '30', '20', '2742', '5157', '0'), +('2', '30', '20', '2288', '4478', '0'), +('2', '30', '20', '2407', '1948', '0'), +('2', '30', '12', '2291', '3830', '0'), +('2', '30', '12', '20655', '3344', '0'), +('2', '30', '12', '2923', '3074', '0'), +('2', '30', '12', '4345', '2184', '0'), +('2', '30', '18', '4886', '3571', '0'), +('2', '30', '18', '2292', '2291', '0'), +('2', '30', '18', '2461', '1642', '0'), +('2', '30', '18', '4410', '1142', '0'), +('2', '30', '19', '4407', '3322', '0'), +('2', '30', '19', '68239', '3011', '0'), +('2', '30', '19', '4837', '2836', '0'), +('2', '30', '19', '2293', '2322', '0'), +('2', '30', '13', '11691', '13099', '0'), +('2', '30', '13', '27718', '9126', '0'), +('2', '30', '13', '27719', '6598', '0'), +('2', '30', '13', '10333', '5300', '0'), +('2', '30', '14', '27716', '10015', '0'), +('2', '30', '14', '10335', '6512', '0'), +('2', '30', '14', '10333', '5300', '0'), +('2', '30', '14', '13991', '4624', '0'), +('2', '30', '11', '9246', '3636', '0'), +('2', '30', '11', '14762', '2204', '0'), +('2', '30', '11', '16941', '725', '0'), +('2', '30', '11', '20677', '450', '0'), +('2', '31', '22', '9246', '0', '0'), +('2', '31', '22', '10323', '0', '0'), +('2', '31', '22', '44492', '0', '0'), +('2', '31', '22', '13101', '0', '0'), +('2', '31', '1', '14702', '3750', '0'), +('2', '31', '1', '14563', '3673', '0'), +('2', '31', '1', '14701', '2862', '0'), +('2', '31', '1', '30361', '2640', '0'), +('2', '31', '2', '10143', '5368', '0'), +('2', '31', '2', '30363', '3700', '0'), +('2', '31', '2', '2294', '2789', '0'), +('2', '31', '2', '3000', '2534', '0'), +('2', '31', '3', '11052', '5617', '0'), +('2', '31', '3', '14108', '2796', '0'), +('2', '31', '3', '4505', '2652', '0'), +('2', '31', '3', '14695', '2630', '0'), +('2', '31', '5', '14703', '6050', '0'), +('2', '31', '5', '14562', '4452', '0'), +('2', '31', '5', '1536', '4161', '0'), +('2', '31', '5', '4413', '3419', '0'), +('2', '31', '8', '11603', '11681', '0'), +('2', '31', '8', '12238', '4567', '0'), +('2', '31', '8', '2349', '3554', '0'), +('2', '31', '8', '1363', '2510', '0'), +('2', '31', '6', '27717', '8135', '0'), +('2', '31', '6', '2924', '7698', '0'), +('2', '31', '6', '1557', '5310', '0'), +('2', '31', '6', '1904', '3026', '0'), +('2', '31', '17', '2285', '10864', '0'), +('2', '31', '17', '4882', '8677', '0'), +('2', '31', '17', '4342', '3872', '0'), +('2', '31', '17', '2405', '1961', '0'), +('2', '31', '7', '2289', '2828', '0'), +('2', '31', '7', '1362', '2624', '0'), +('2', '31', '7', '1321', '1746', '0'), +('2', '31', '7', '10336', '1127', '0'), +('2', '31', '9', '2290', '2413', '0'), +('2', '31', '9', '4884', '2060', '0'), +('2', '31', '9', '4344', '2051', '0'), +('2', '31', '9', '10408', '2002', '0'), +('2', '31', '15', '10150', '3004', '0'), +('2', '31', '15', '10163', '2300', '0'), +('2', '31', '15', '14631', '2247', '0'), +('2', '31', '15', '14651', '2224', '0'), +('2', '31', '20', '11666', '8352', '0'), +('2', '31', '20', '2742', '5160', '0'), +('2', '31', '20', '2288', '4478', '0'), +('2', '31', '20', '2407', '2009', '0'), +('2', '31', '12', '2291', '3830', '0'), +('2', '31', '12', '20655', '3369', '0'), +('2', '31', '12', '2923', '3074', '0'), +('2', '31', '12', '4345', '2245', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '31', '18', '4886', '3680', '0'), +('2', '31', '18', '2292', '2339', '0'), +('2', '31', '18', '2461', '1690', '0'), +('2', '31', '18', '4410', '1142', '0'), +('2', '31', '19', '4407', '3431', '0'), +('2', '31', '19', '68239', '3047', '0'), +('2', '31', '19', '4837', '2896', '0'), +('2', '31', '19', '2293', '2358', '0'), +('2', '31', '13', '11691', '13280', '0'), +('2', '31', '13', '27718', '9247', '0'), +('2', '31', '13', '27719', '6690', '0'), +('2', '31', '13', '10333', '5300', '0'), +('2', '31', '14', '27716', '10123', '0'), +('2', '31', '14', '10335', '6730', '0'), +('2', '31', '14', '10333', '5300', '0'), +('2', '31', '14', '13991', '4745', '0'), +('2', '31', '11', '9246', '3757', '0'), +('2', '31', '11', '14762', '2204', '0'), +('2', '31', '11', '16941', '749', '0'), +('2', '31', '11', '20677', '450', '0'), +('2', '32', '22', '9246', '0', '0'), +('2', '32', '22', '10323', '0', '0'), +('2', '32', '22', '44492', '0', '0'), +('2', '32', '22', '13101', '0', '0'), +('2', '32', '1', '14563', '3782', '0'), +('2', '32', '1', '14702', '3750', '0'), +('2', '32', '1', '14701', '2862', '0'), +('2', '32', '1', '30361', '2640', '0'), +('2', '32', '2', '10143', '5368', '0'), +('2', '32', '2', '30363', '3700', '0'), +('2', '32', '2', '2294', '2813', '0'), +('2', '32', '2', '3000', '2534', '0'), +('2', '32', '3', '11052', '5798', '0'), +('2', '32', '3', '14108', '2880', '0'), +('2', '32', '3', '4505', '2736', '0'), +('2', '32', '3', '14695', '2714', '0'), +('2', '32', '5', '14703', '6050', '0'), +('2', '32', '5', '14562', '4536', '0'), +('2', '32', '5', '1536', '4270', '0'), +('2', '32', '5', '4413', '3527', '0'), +('2', '32', '8', '11603', '11789', '0'), +('2', '32', '8', '12238', '4688', '0'), +('2', '32', '8', '2349', '3554', '0'), +('2', '32', '8', '1363', '2510', '0'), +('2', '32', '6', '27717', '8282', '0'), +('2', '32', '6', '2924', '7758', '0'), +('2', '32', '6', '1557', '5310', '0'), +('2', '32', '6', '1904', '3123', '0'), +('2', '32', '17', '2285', '10913', '0'), +('2', '32', '17', '4882', '8862', '0'), +('2', '32', '17', '4342', '3992', '0'), +('2', '32', '17', '2405', '2022', '0'), +('2', '32', '7', '2289', '2876', '0'), +('2', '32', '7', '1362', '2624', '0'), +('2', '32', '7', '1321', '1746', '0'), +('2', '32', '7', '10336', '1163', '0'), +('2', '32', '9', '2290', '2474', '0'), +('2', '32', '9', '4884', '2060', '0'), +('2', '32', '9', '4344', '2051', '0'), +('2', '32', '9', '10408', '2002', '0'), +('2', '32', '15', '10150', '3004', '0'), +('2', '32', '15', '14631', '2319', '0'), +('2', '32', '15', '10163', '2300', '0'), +('2', '32', '15', '14651', '2224', '0'), +('2', '32', '20', '11666', '8354', '0'), +('2', '32', '20', '2742', '5163', '0'), +('2', '32', '20', '2288', '4478', '0'), +('2', '32', '20', '2407', '2069', '0'), +('2', '32', '12', '2291', '3830', '0'), +('2', '32', '12', '20655', '3394', '0'), +('2', '32', '12', '2923', '3074', '0'), +('2', '32', '12', '4345', '2305', '0'), +('2', '32', '18', '4886', '3789', '0'), +('2', '32', '18', '2292', '2387', '0'), +('2', '32', '18', '2461', '1739', '0'), +('2', '32', '18', '4410', '1142', '0'), +('2', '32', '19', '4407', '3539', '0'), +('2', '32', '19', '68239', '3083', '0'), +('2', '32', '19', '4837', '2957', '0'), +('2', '32', '19', '2293', '2395', '0'), +('2', '32', '13', '11691', '13461', '0'), +('2', '32', '13', '27718', '9368', '0'), +('2', '32', '13', '27719', '6782', '0'), +('2', '32', '13', '10333', '5300', '0'), +('2', '32', '14', '27716', '10232', '0'), +('2', '32', '14', '10335', '6947', '0'), +('2', '32', '14', '10333', '5300', '0'), +('2', '32', '14', '13991', '4866', '0'), +('2', '32', '11', '9246', '3878', '0'), +('2', '32', '11', '14762', '2204', '0'), +('2', '32', '11', '16941', '773', '0'), +('2', '32', '11', '20677', '450', '0'), +('2', '33', '22', '9246', '0', '0'), +('2', '33', '22', '10323', '0', '0'), +('2', '33', '22', '44492', '0', '0'), +('2', '33', '22', '13101', '0', '0'), +('2', '33', '1', '14563', '3891', '0'), +('2', '33', '1', '14702', '3750', '0'), +('2', '33', '1', '14701', '2862', '0'), +('2', '33', '1', '30361', '2640', '0'), +('2', '33', '2', '10143', '5368', '0'), +('2', '33', '2', '30363', '3700', '0'), +('2', '33', '2', '2294', '2837', '0'), +('2', '33', '2', '3000', '2534', '0'), +('2', '33', '3', '11052', '5980', '0'), +('2', '33', '3', '14108', '2965', '0'), +('2', '33', '3', '4505', '2821', '0'), +('2', '33', '3', '14695', '2799', '0'), +('2', '33', '5', '14703', '6050', '0'), +('2', '33', '5', '14562', '4621', '0'), +('2', '33', '5', '1536', '4379', '0'), +('2', '33', '5', '4413', '3636', '0'), +('2', '33', '8', '11603', '11898', '0'), +('2', '33', '8', '12238', '4809', '0'), +('2', '33', '8', '2349', '3554', '0'), +('2', '33', '8', '1363', '2510', '0'), +('2', '33', '6', '27717', '8430', '0'), +('2', '33', '6', '2924', '7819', '0'), +('2', '33', '6', '1557', '5310', '0'), +('2', '33', '6', '1904', '3219', '0'), +('2', '33', '17', '2285', '10961', '0'), +('2', '33', '17', '4882', '9048', '0'), +('2', '33', '17', '4342', '4113', '0'), +('2', '33', '17', '2405', '2083', '0'), +('2', '33', '7', '2289', '2925', '0'), +('2', '33', '7', '1362', '2624', '0'), +('2', '33', '7', '1321', '1746', '0'), +('2', '33', '7', '10336', '1200', '0'), +('2', '33', '9', '2290', '2535', '0'), +('2', '33', '9', '4884', '2060', '0'), +('2', '33', '9', '4344', '2051', '0'), +('2', '33', '9', '4925', '2048', '0'), +('2', '33', '15', '10150', '3004', '0'), +('2', '33', '15', '14631', '2392', '0'), +('2', '33', '15', '10163', '2300', '0'), +('2', '33', '15', '14651', '2224', '0'), +('2', '33', '20', '11666', '8357', '0'), +('2', '33', '20', '2742', '5166', '0'), +('2', '33', '20', '2288', '4478', '0'), +('2', '33', '20', '2407', '2129', '0'), +('2', '33', '12', '2291', '3830', '0'), +('2', '33', '12', '20655', '3419', '0'), +('2', '33', '12', '2923', '3074', '0'), +('2', '33', '12', '4345', '2366', '0'), +('2', '33', '18', '4886', '3897', '0'), +('2', '33', '18', '2292', '2436', '0'), +('2', '33', '18', '2461', '1787', '0'), +('2', '33', '18', '4410', '1142', '0'), +('2', '33', '19', '4407', '3648', '0'), +('2', '33', '19', '68239', '3119', '0'), +('2', '33', '19', '4837', '3017', '0'), +('2', '33', '19', '2293', '2431', '0'), +('2', '33', '13', '11691', '13643', '0'), +('2', '33', '13', '27718', '9489', '0'), +('2', '33', '13', '27719', '6875', '0'), +('2', '33', '13', '10333', '5300', '0'), +('2', '33', '14', '27716', '10341', '0'), +('2', '33', '14', '10335', '7165', '0'), +('2', '33', '14', '10333', '5300', '0'), +('2', '33', '14', '13991', '4986', '0'), +('2', '33', '11', '9246', '3998', '0'), +('2', '33', '11', '14762', '2204', '0'), +('2', '33', '11', '16941', '797', '0'), +('2', '33', '11', '20677', '450', '0'), +('2', '34', '22', '9246', '0', '0'), +('2', '34', '22', '10323', '0', '0'), +('2', '34', '22', '44492', '0', '0'), +('2', '34', '22', '13101', '0', '0'), +('2', '34', '1', '14563', '4000', '0'), +('2', '34', '1', '14702', '3750', '0'), +('2', '34', '1', '14701', '2862', '0'), +('2', '34', '1', '30361', '2640', '0'), +('2', '34', '2', '10143', '5368', '0'), +('2', '34', '2', '30363', '3700', '0'), +('2', '34', '2', '2294', '2861', '0'), +('2', '34', '2', '4881', '2546', '0'), +('2', '34', '3', '11052', '6161', '0'), +('2', '34', '3', '14108', '3049', '0'), +('2', '34', '3', '4505', '2905', '0'), +('2', '34', '3', '14695', '2883', '0'), +('2', '34', '5', '14703', '6050', '0'), +('2', '34', '5', '14562', '4705', '0'), +('2', '34', '5', '1536', '4488', '0'), +('2', '34', '5', '4413', '3745', '0'), +('2', '34', '8', '11603', '12007', '0'), +('2', '34', '8', '12238', '4930', '0'), +('2', '34', '8', '2349', '3554', '0'), +('2', '34', '8', '1363', '2510', '0'), +('2', '34', '6', '27717', '8577', '0'), +('2', '34', '6', '2924', '7879', '0'), +('2', '34', '6', '1557', '5310', '0'), +('2', '34', '6', '1904', '3316', '0'), +('2', '34', '17', '2285', '11009', '0'), +('2', '34', '17', '4882', '9234', '0'), +('2', '34', '17', '4342', '4234', '0'), +('2', '34', '17', '2405', '2145', '0'), +('2', '34', '7', '2289', '2973', '0'), +('2', '34', '7', '1362', '2624', '0'), +('2', '34', '7', '1321', '1746', '0'), +('2', '34', '7', '10336', '1236', '0'), +('2', '34', '9', '2290', '2596', '0'), +('2', '34', '9', '4925', '2108', '0'), +('2', '34', '9', '4406', '2081', '0'), +('2', '34', '9', '10105', '2078', '0'), +('2', '34', '15', '10150', '3004', '0'), +('2', '34', '15', '14631', '2464', '0'), +('2', '34', '15', '10163', '2300', '0'), +('2', '34', '15', '14651', '2224', '0'), +('2', '34', '20', '11666', '8359', '0'), +('2', '34', '20', '2742', '5169', '0'), +('2', '34', '20', '2288', '4478', '0'), +('2', '34', '20', '2407', '2190', '0'), +('2', '34', '12', '2291', '3830', '0'), +('2', '34', '12', '20655', '3443', '0'), +('2', '34', '12', '2923', '3074', '0'), +('2', '34', '12', '4345', '2426', '0'), +('2', '34', '18', '4886', '4006', '0'), +('2', '34', '18', '2292', '2484', '0'), +('2', '34', '18', '2461', '1835', '0'), +('2', '34', '18', '4410', '1142', '0'), +('2', '34', '19', '4407', '3757', '0'), +('2', '34', '19', '68239', '3156', '0'), +('2', '34', '19', '4837', '3077', '0'), +('2', '34', '19', '2293', '2467', '0'), +('2', '34', '13', '11691', '13824', '0'), +('2', '34', '13', '27718', '9610', '0'), +('2', '34', '13', '27719', '6967', '0'), +('2', '34', '13', '10333', '5300', '0'), +('2', '34', '14', '27716', '10449', '0'), +('2', '34', '14', '10335', '7382', '0'), +('2', '34', '14', '10333', '5300', '0'), +('2', '34', '14', '13991', '5107', '0'), +('2', '34', '11', '9246', '4119', '0'), +('2', '34', '11', '14762', '2204', '0'), +('2', '34', '11', '16941', '821', '0'), +('2', '34', '11', '20677', '450', '0'), +('2', '35', '22', '9246', '0', '0'), +('2', '35', '22', '10323', '0', '0'), +('2', '35', '22', '44492', '0', '0'), +('2', '35', '22', '13101', '0', '0'), +('2', '35', '1', '14563', '4108', '0'), +('2', '35', '1', '14702', '3750', '0'), +('2', '35', '1', '14701', '2862', '0'), +('2', '35', '1', '30361', '2640', '0'), +('2', '35', '2', '10143', '5368', '0'), +('2', '35', '2', '30363', '3700', '0'), +('2', '35', '2', '2294', '2885', '0'), +('2', '35', '2', '2191', '2608', '0'), +('2', '35', '3', '11052', '6342', '0'), +('2', '35', '3', '14108', '3134', '0'), +('2', '35', '3', '4505', '2990', '0'), +('2', '35', '3', '14695', '2968', '0'), +('2', '35', '5', '14703', '6050', '0'), +('2', '35', '5', '14562', '4790', '0'), +('2', '35', '5', '1536', '4596', '0'), +('2', '35', '5', '4413', '3854', '0'), +('2', '35', '8', '11603', '12116', '0'), +('2', '35', '8', '12238', '5050', '0'), +('2', '35', '8', '2349', '3554', '0'), +('2', '35', '8', '1363', '2510', '0'), +('2', '35', '6', '27717', '8725', '0'), +('2', '35', '6', '2924', '7940', '0'), +('2', '35', '6', '1557', '5310', '0'), +('2', '35', '6', '1904', '3413', '0'), +('2', '35', '17', '2285', '11058', '0'), +('2', '35', '17', '4882', '9420', '0'), +('2', '35', '17', '4342', '4355', '0'), +('2', '35', '17', '2405', '2206', '0'), +('2', '35', '7', '2289', '3021', '0'), +('2', '35', '7', '1362', '2624', '0'), +('2', '35', '7', '1321', '1746', '0'), +('2', '35', '7', '10336', '1272', '0'), +('2', '35', '9', '2290', '2657', '0'), +('2', '35', '9', '4925', '2168', '0'), +('2', '35', '9', '4406', '2142', '0'), +('2', '35', '9', '10105', '2138', '0'), +('2', '35', '15', '10150', '3004', '0'), +('2', '35', '15', '14631', '2537', '0'), +('2', '35', '15', '10163', '2300', '0'), +('2', '35', '15', '14651', '2224', '0'), +('2', '35', '20', '11666', '8361', '0'), +('2', '35', '20', '2742', '5172', '0'), +('2', '35', '20', '2288', '4478', '0'), +('2', '35', '20', '2407', '2250', '0'), +('2', '35', '12', '2291', '3830', '0'), +('2', '35', '12', '20655', '3468', '0'), +('2', '35', '12', '2923', '3074', '0'), +('2', '35', '12', '4345', '2486', '0'), +('2', '35', '18', '4886', '4115', '0'), +('2', '35', '18', '2292', '2532', '0'), +('2', '35', '18', '2461', '1883', '0'), +('2', '35', '18', '4410', '1142', '0'), +('2', '35', '19', '4407', '3865', '0'), +('2', '35', '19', '68239', '3192', '0'), +('2', '35', '19', '4837', '3138', '0'), +('2', '35', '19', '2293', '2503', '0'), +('2', '35', '13', '11691', '14005', '0'), +('2', '35', '13', '27718', '9730', '0'), +('2', '35', '13', '27719', '7059', '0'), +('2', '35', '13', '10333', '5300', '0'), +('2', '35', '14', '27716', '10558', '0'), +('2', '35', '14', '10335', '7600', '0'), +('2', '35', '14', '10333', '5300', '0'), +('2', '35', '14', '13991', '5228', '0'), +('2', '35', '11', '9246', '4240', '0'), +('2', '35', '11', '14762', '2204', '0'), +('2', '35', '11', '16941', '846', '0'), +('2', '35', '11', '60396', '453', '0'), +('2', '36', '22', '9246', '0', '0'), +('2', '36', '22', '10323', '0', '0'), +('2', '36', '22', '44492', '0', '0'), +('2', '36', '22', '13101', '0', '0'), +('2', '36', '1', '14563', '4217', '0'), +('2', '36', '1', '14702', '3750', '0'), +('2', '36', '1', '14701', '2862', '0'), +('2', '36', '1', '10082', '2706', '0'), +('2', '36', '2', '10143', '5368', '0'), +('2', '36', '2', '30363', '3700', '0'), +('2', '36', '2', '2294', '2910', '0'), +('2', '36', '2', '2191', '2681', '0'), +('2', '36', '3', '11052', '6523', '0'), +('2', '36', '3', '14108', '3218', '0'), +('2', '36', '3', '4505', '3074', '0'), +('2', '36', '3', '14695', '3053', '0'), +('2', '36', '5', '14703', '6050', '0'), +('2', '36', '5', '14562', '4874', '0'), +('2', '36', '5', '1536', '4705', '0'), +('2', '36', '5', '4413', '3962', '0'), +('2', '36', '8', '11603', '12224', '0'), +('2', '36', '8', '12238', '5171', '0'), +('2', '36', '8', '2349', '3554', '0'), +('2', '36', '8', '1363', '2510', '0'), +('2', '36', '6', '27717', '8872', '0'), +('2', '36', '6', '2924', '8000', '0'), +('2', '36', '6', '1557', '5310', '0'), +('2', '36', '6', '1904', '3509', '0'), +('2', '36', '17', '2285', '11106', '0'), +('2', '36', '17', '4882', '9605', '0'), +('2', '36', '17', '4342', '4476', '0'), +('2', '36', '17', '2405', '2267', '0'), +('2', '36', '7', '2289', '3070', '0'), +('2', '36', '7', '1362', '2624', '0'), +('2', '36', '7', '1321', '1746', '0'), +('2', '36', '7', '10336', '1308', '0'), +('2', '36', '9', '2290', '2718', '0'), +('2', '36', '9', '4925', '2229', '0'), +('2', '36', '9', '4406', '2202', '0'), +('2', '36', '9', '10105', '2199', '0'), +('2', '36', '15', '10150', '3004', '0'), +('2', '36', '15', '14631', '2609', '0'), +('2', '36', '15', '10163', '2300', '0'), +('2', '36', '15', '14651', '2224', '0'), +('2', '36', '20', '11666', '8363', '0'), +('2', '36', '20', '2742', '5175', '0'), +('2', '36', '20', '2288', '4478', '0'), +('2', '36', '20', '2407', '2311', '0'), +('2', '36', '12', '2291', '3830', '0'), +('2', '36', '12', '20655', '3493', '0'), +('2', '36', '12', '2923', '3074', '0'), +('2', '36', '12', '4345', '2547', '0'), +('2', '36', '18', '4886', '4224', '0'), +('2', '36', '18', '2292', '2581', '0'), +('2', '36', '18', '2461', '1932', '0'), +('2', '36', '18', '4410', '1142', '0'), +('2', '36', '19', '4407', '3974', '0'), +('2', '36', '19', '68239', '3228', '0'), +('2', '36', '19', '4837', '3198', '0'), +('2', '36', '19', '2293', '2540', '0'), +('2', '36', '13', '11691', '14186', '0'), +('2', '36', '13', '27718', '9851', '0'), +('2', '36', '13', '27719', '7151', '0'), +('2', '36', '13', '10333', '5300', '0'), +('2', '36', '14', '27716', '10667', '0'), +('2', '36', '14', '10335', '7817', '0'), +('2', '36', '14', '13991', '5349', '0'), +('2', '36', '14', '12238', '5316', '0'), +('2', '36', '11', '9246', '4361', '0'), +('2', '36', '11', '14762', '2204', '0'), +('2', '36', '11', '16941', '870', '0'), +('2', '36', '11', '60396', '465', '0'), +('2', '37', '22', '9246', '0', '0'), +('2', '37', '22', '10323', '0', '0'), +('2', '37', '22', '44492', '0', '0'), +('2', '37', '22', '13101', '0', '0'), +('2', '37', '1', '14563', '4326', '0'), +('2', '37', '1', '14702', '3750', '0'), +('2', '37', '1', '14701', '2862', '0'), +('2', '37', '1', '10082', '2778', '0'), +('2', '37', '2', '10143', '5368', '0'), +('2', '37', '2', '30363', '3700', '0'), +('2', '37', '2', '2294', '2934', '0'), +('2', '37', '2', '2191', '2753', '0'), +('2', '37', '3', '11052', '6704', '0'), +('2', '37', '3', '14108', '3303', '0'), +('2', '37', '3', '4505', '3159', '0'), +('2', '37', '3', '14695', '3137', '0'), +('2', '37', '5', '14703', '6050', '0'), +('2', '37', '5', '14562', '4959', '0'), +('2', '37', '5', '1536', '4814', '0'), +('2', '37', '5', '4413', '4071', '0'), +('2', '37', '8', '11603', '12333', '0'), +('2', '37', '8', '12238', '5292', '0'), +('2', '37', '8', '2349', '3554', '0'), +('2', '37', '8', '1363', '2510', '0'), +('2', '37', '6', '27717', '9019', '0'), +('2', '37', '6', '2924', '8060', '0'), +('2', '37', '6', '1557', '5310', '0'), +('2', '37', '6', '1904', '3606', '0'), +('2', '37', '17', '2285', '11154', '0'), +('2', '37', '17', '4882', '9791', '0'), +('2', '37', '17', '4342', '4596', '0'), +('2', '37', '17', '2405', '2329', '0'), +('2', '37', '7', '2289', '3118', '0'), +('2', '37', '7', '1362', '2624', '0'), +('2', '37', '7', '1321', '1746', '0'), +('2', '37', '7', '10336', '1345', '0'), +('2', '37', '9', '2290', '2779', '0'), +('2', '37', '9', '4925', '2289', '0'), +('2', '37', '9', '4406', '2263', '0'), +('2', '37', '9', '10105', '2259', '0'), +('2', '37', '15', '10150', '3004', '0'), +('2', '37', '15', '14631', '2682', '0'), +('2', '37', '15', '10163', '2300', '0'), +('2', '37', '15', '14651', '2224', '0'), +('2', '37', '20', '11666', '8365', '0'), +('2', '37', '20', '2742', '5178', '0'), +('2', '37', '20', '2288', '4478', '0'), +('2', '37', '20', '2407', '2371', '0'), +('2', '37', '12', '2291', '3830', '0'), +('2', '37', '12', '20655', '3518', '0'), +('2', '37', '12', '2923', '3074', '0'), +('2', '37', '12', '4345', '2607', '0'), +('2', '37', '18', '4886', '4332', '0'), +('2', '37', '18', '2292', '2629', '0'), +('2', '37', '18', '2461', '1980', '0'), +('2', '37', '18', '4410', '1142', '0'), +('2', '37', '19', '4407', '4083', '0'), +('2', '37', '19', '68239', '3264', '0'), +('2', '37', '19', '4837', '3259', '0'), +('2', '37', '19', '2293', '2576', '0'), +('2', '37', '13', '11691', '14367', '0'), +('2', '37', '13', '27718', '9972', '0'), +('2', '37', '13', '27719', '7243', '0'), +('2', '37', '13', '10333', '5300', '0'), +('2', '37', '14', '27716', '10776', '0'), +('2', '37', '14', '10335', '8034', '0'), +('2', '37', '14', '13991', '5470', '0'), +('2', '37', '14', '12238', '5437', '0'), +('2', '37', '11', '9246', '4482', '0'), +('2', '37', '11', '14762', '2204', '0'), +('2', '37', '11', '16941', '894', '0'), +('2', '37', '11', '60396', '477', '0'), +('2', '38', '22', '9246', '0', '0'), +('2', '38', '22', '10323', '0', '0'), +('2', '38', '22', '44492', '0', '0'), +('2', '38', '22', '13101', '0', '0'), +('2', '38', '1', '14563', '4434', '0'), +('2', '38', '1', '14702', '3750', '0'), +('2', '38', '1', '14701', '2862', '0'), +('2', '38', '1', '10082', '2850', '0'), +('2', '38', '2', '10143', '5368', '0'), +('2', '38', '2', '30363', '3700', '0'), +('2', '38', '2', '2294', '2958', '0'), +('2', '38', '2', '2191', '2826', '0'), +('2', '38', '3', '11052', '6886', '0'), +('2', '38', '3', '14108', '3387', '0'), +('2', '38', '3', '4505', '3243', '0'), +('2', '38', '3', '14695', '3222', '0'), +('2', '38', '5', '14703', '6050', '0'), +('2', '38', '5', '14562', '5043', '0'), +('2', '38', '5', '1536', '4922', '0'), +('2', '38', '5', '4413', '4180', '0'), +('2', '38', '8', '11603', '12442', '0'), +('2', '38', '8', '12238', '5413', '0'), +('2', '38', '8', '2349', '3554', '0'), +('2', '38', '8', '1363', '2510', '0'), +('2', '38', '6', '27717', '9167', '0'), +('2', '38', '6', '2924', '8121', '0'), +('2', '38', '6', '1557', '5310', '0'), +('2', '38', '6', '1904', '3703', '0'), +('2', '38', '17', '2285', '11203', '0'), +('2', '38', '17', '4882', '9977', '0'), +('2', '38', '17', '4342', '4717', '0'), +('2', '38', '17', '2405', '2390', '0'), +('2', '38', '7', '2289', '3166', '0'), +('2', '38', '7', '1362', '2624', '0'), +('2', '38', '7', '1321', '1746', '0'), +('2', '38', '7', '10336', '1381', '0'), +('2', '38', '9', '2290', '2840', '0'), +('2', '38', '9', '4925', '2350', '0'), +('2', '38', '9', '4406', '2323', '0'), +('2', '38', '9', '10105', '2319', '0'), +('2', '38', '15', '10150', '3004', '0'), +('2', '38', '15', '14631', '2754', '0'), +('2', '38', '15', '10163', '2300', '0'), +('2', '38', '15', '14651', '2224', '0'), +('2', '38', '20', '11666', '8367', '0'), +('2', '38', '20', '2742', '5181', '0'), +('2', '38', '20', '2288', '4478', '0'), +('2', '38', '20', '2407', '2431', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '38', '12', '2291', '3830', '0'), +('2', '38', '12', '20655', '3543', '0'), +('2', '38', '12', '2923', '3074', '0'), +('2', '38', '12', '4345', '2668', '0'), +('2', '38', '18', '4886', '4441', '0'), +('2', '38', '18', '2292', '2677', '0'), +('2', '38', '18', '2461', '2028', '0'), +('2', '38', '18', '4410', '1142', '0'), +('2', '38', '19', '4407', '4192', '0'), +('2', '38', '19', '4837', '3319', '0'), +('2', '38', '19', '68239', '3301', '0'), +('2', '38', '19', '2293', '2612', '0'), +('2', '38', '13', '11691', '14549', '0'), +('2', '38', '13', '27718', '10093', '0'), +('2', '38', '13', '27719', '7335', '0'), +('2', '38', '13', '10333', '5300', '0'), +('2', '38', '14', '27716', '10884', '0'), +('2', '38', '14', '10335', '8252', '0'), +('2', '38', '14', '13991', '5590', '0'), +('2', '38', '14', '12238', '5558', '0'), +('2', '38', '11', '9246', '4602', '0'), +('2', '38', '11', '14762', '2204', '0'), +('2', '38', '11', '16941', '918', '0'), +('2', '38', '11', '60396', '489', '0'), +('2', '39', '22', '9246', '0', '0'), +('2', '39', '22', '10323', '0', '0'), +('2', '39', '22', '44492', '0', '0'), +('2', '39', '22', '13101', '0', '0'), +('2', '39', '1', '14563', '4543', '0'), +('2', '39', '1', '14702', '3750', '0'), +('2', '39', '1', '10082', '2923', '0'), +('2', '39', '1', '14701', '2862', '0'), +('2', '39', '2', '10143', '5368', '0'), +('2', '39', '2', '30363', '3700', '0'), +('2', '39', '2', '2294', '2982', '0'), +('2', '39', '2', '2191', '2898', '0'), +('2', '39', '3', '11052', '7067', '0'), +('2', '39', '3', '14108', '3472', '0'), +('2', '39', '3', '4505', '3328', '0'), +('2', '39', '3', '14695', '3306', '0'), +('2', '39', '5', '14703', '6050', '0'), +('2', '39', '5', '14562', '5128', '0'), +('2', '39', '5', '1536', '5031', '0'), +('2', '39', '5', '4413', '4288', '0'), +('2', '39', '8', '11603', '12550', '0'), +('2', '39', '8', '12238', '5534', '0'), +('2', '39', '8', '2349', '3554', '0'), +('2', '39', '8', '1363', '2510', '0'), +('2', '39', '6', '27717', '9314', '0'), +('2', '39', '6', '2924', '8181', '0'), +('2', '39', '6', '1557', '5310', '0'), +('2', '39', '6', '1904', '3799', '0'), +('2', '39', '17', '2285', '11251', '0'), +('2', '39', '17', '4882', '10163', '0'), +('2', '39', '17', '4342', '4838', '0'), +('2', '39', '17', '2405', '2451', '0'), +('2', '39', '7', '2289', '3215', '0'), +('2', '39', '7', '1362', '2624', '0'), +('2', '39', '7', '1321', '1746', '0'), +('2', '39', '7', '10336', '1417', '0'), +('2', '39', '9', '2290', '2901', '0'), +('2', '39', '9', '4925', '2410', '0'), +('2', '39', '9', '4406', '2383', '0'), +('2', '39', '9', '10105', '2380', '0'), +('2', '39', '15', '10150', '3004', '0'), +('2', '39', '15', '14631', '2827', '0'), +('2', '39', '15', '10163', '2300', '0'), +('2', '39', '15', '14651', '2224', '0'), +('2', '39', '20', '11666', '8369', '0'), +('2', '39', '20', '2742', '5184', '0'), +('2', '39', '20', '2288', '4478', '0'), +('2', '39', '20', '2407', '2492', '0'), +('2', '39', '12', '2291', '3830', '0'), +('2', '39', '12', '20655', '3567', '0'), +('2', '39', '12', '2923', '3074', '0'), +('2', '39', '12', '4345', '2728', '0'), +('2', '39', '18', '4886', '4550', '0'), +('2', '39', '18', '2292', '2726', '0'), +('2', '39', '18', '2461', '2077', '0'), +('2', '39', '18', '4410', '1142', '0'), +('2', '39', '19', '4407', '4300', '0'), +('2', '39', '19', '4837', '3379', '0'), +('2', '39', '19', '68239', '3337', '0'), +('2', '39', '19', '2293', '2648', '0'), +('2', '39', '13', '11691', '14730', '0'), +('2', '39', '13', '27718', '10214', '0'), +('2', '39', '13', '27719', '7427', '0'), +('2', '39', '13', '10333', '5300', '0'), +('2', '39', '14', '27716', '10993', '0'), +('2', '39', '14', '10335', '8469', '0'), +('2', '39', '14', '13991', '5711', '0'), +('2', '39', '14', '12238', '5679', '0'), +('2', '39', '11', '9246', '4723', '0'), +('2', '39', '11', '14762', '2204', '0'), +('2', '39', '11', '16941', '942', '0'), +('2', '39', '11', '60396', '501', '0'), +('2', '40', '22', '9246', '0', '0'), +('2', '40', '22', '10323', '0', '0'), +('2', '40', '22', '44492', '0', '0'), +('2', '40', '22', '13101', '0', '0'), +('2', '40', '1', '14563', '4652', '0'), +('2', '40', '1', '14702', '3750', '0'), +('2', '40', '1', '10082', '2995', '0'), +('2', '40', '1', '14701', '2862', '0'), +('2', '40', '2', '10143', '5368', '0'), +('2', '40', '2', '30363', '3700', '0'), +('2', '40', '2', '2294', '3006', '0'), +('2', '40', '2', '2191', '2970', '0'), +('2', '40', '3', '11052', '7248', '0'), +('2', '40', '3', '14108', '3557', '0'), +('2', '40', '3', '4505', '3413', '0'), +('2', '40', '3', '14695', '3391', '0'), +('2', '40', '5', '14703', '6050', '0'), +('2', '40', '5', '14562', '5213', '0'), +('2', '40', '5', '1536', '5140', '0'), +('2', '40', '5', '4413', '4397', '0'), +('2', '40', '8', '11603', '12659', '0'), +('2', '40', '8', '12238', '5654', '0'), +('2', '40', '8', '2349', '3554', '0'), +('2', '40', '8', '1363', '2510', '0'), +('2', '40', '6', '27717', '9461', '0'), +('2', '40', '6', '2924', '8242', '0'), +('2', '40', '6', '1557', '5310', '0'), +('2', '40', '6', '1904', '3896', '0'), +('2', '40', '17', '2285', '11299', '0'), +('2', '40', '17', '4882', '10348', '0'), +('2', '40', '17', '4342', '4959', '0'), +('2', '40', '17', '2405', '2513', '0'), +('2', '40', '7', '2289', '3263', '0'), +('2', '40', '7', '1362', '2624', '0'), +('2', '40', '7', '1321', '1746', '0'), +('2', '40', '7', '10336', '1453', '0'), +('2', '40', '9', '2290', '2962', '0'), +('2', '40', '9', '4925', '2470', '0'), +('2', '40', '9', '4406', '2444', '0'), +('2', '40', '9', '10105', '2440', '0'), +('2', '40', '15', '10150', '3004', '0'), +('2', '40', '15', '14631', '2899', '0'), +('2', '40', '15', '10163', '2300', '0'), +('2', '40', '15', '14651', '2224', '0'), +('2', '40', '20', '11666', '8371', '0'), +('2', '40', '20', '2742', '5187', '0'), +('2', '40', '20', '2288', '4478', '0'), +('2', '40', '20', '2407', '2552', '0'), +('2', '40', '12', '2291', '3830', '0'), +('2', '40', '12', '20655', '3592', '0'), +('2', '40', '12', '2923', '3074', '0'), +('2', '40', '12', '4345', '2788', '0'), +('2', '40', '18', '4886', '4658', '0'), +('2', '40', '18', '2292', '2774', '0'), +('2', '40', '18', '2461', '2125', '0'), +('2', '40', '18', '4410', '1142', '0'), +('2', '40', '19', '4407', '4409', '0'), +('2', '40', '19', '4837', '3440', '0'), +('2', '40', '19', '68239', '3373', '0'), +('2', '40', '19', '2293', '2685', '0'), +('2', '40', '13', '11691', '14911', '0'), +('2', '40', '13', '27718', '10334', '0'), +('2', '40', '13', '27719', '7519', '0'), +('2', '40', '13', '10333', '5300', '0'), +('2', '40', '14', '27716', '11102', '0'), +('2', '40', '14', '10335', '8687', '0'), +('2', '40', '14', '13991', '5832', '0'), +('2', '40', '14', '12238', '5799', '0'), +('2', '40', '11', '9246', '4844', '0'), +('2', '40', '11', '14762', '2204', '0'), +('2', '40', '11', '16941', '966', '0'), +('2', '40', '11', '60396', '513', '0'), +('2', '41', '22', '9246', '0', '0'), +('2', '41', '22', '10323', '0', '0'), +('2', '41', '22', '44492', '0', '0'), +('2', '41', '22', '13101', '0', '0'), +('2', '41', '1', '14563', '4761', '0'), +('2', '41', '1', '14702', '3750', '0'), +('2', '41', '1', '10082', '3068', '0'), +('2', '41', '1', '14701', '2862', '0'), +('2', '41', '2', '10143', '5368', '0'), +('2', '41', '2', '30363', '3700', '0'), +('2', '41', '2', '2191', '3043', '0'), +('2', '41', '2', '2294', '3030', '0'), +('2', '41', '3', '11052', '7429', '0'), +('2', '41', '3', '14108', '3641', '0'), +('2', '41', '3', '4505', '3497', '0'), +('2', '41', '3', '14695', '3475', '0'), +('2', '41', '5', '14703', '6050', '0'), +('2', '41', '5', '14562', '5297', '0'), +('2', '41', '5', '1536', '5249', '0'), +('2', '41', '5', '4413', '4506', '0'), +('2', '41', '8', '11603', '12768', '0'), +('2', '41', '8', '12238', '5775', '0'), +('2', '41', '8', '2349', '3554', '0'), +('2', '41', '8', '1363', '2510', '0'), +('2', '41', '6', '27717', '9609', '0'), +('2', '41', '6', '2924', '8302', '0'), +('2', '41', '6', '1557', '5310', '0'), +('2', '41', '6', '1904', '3992', '0'), +('2', '41', '17', '2285', '11348', '0'), +('2', '41', '17', '4882', '10534', '0'), +('2', '41', '17', '4342', '5080', '0'), +('2', '41', '17', '2405', '2574', '0'), +('2', '41', '7', '2289', '3311', '0'), +('2', '41', '7', '1362', '2624', '0'), +('2', '41', '7', '1321', '1746', '0'), +('2', '41', '7', '10336', '1489', '0'), +('2', '41', '9', '2290', '3023', '0'), +('2', '41', '9', '4925', '2531', '0'), +('2', '41', '9', '4406', '2504', '0'), +('2', '41', '9', '10105', '2501', '0'), +('2', '41', '15', '10150', '3004', '0'), +('2', '41', '15', '14631', '2972', '0'), +('2', '41', '15', '10163', '2300', '0'), +('2', '41', '15', '14651', '2224', '0'), +('2', '41', '20', '11666', '8374', '0'), +('2', '41', '20', '2742', '5190', '0'), +('2', '41', '20', '2288', '4478', '0'), +('2', '41', '20', '2407', '2613', '0'), +('2', '41', '12', '2291', '3830', '0'), +('2', '41', '12', '20655', '3617', '0'), +('2', '41', '12', '2923', '3074', '0'), +('2', '41', '12', '4345', '2849', '0'), +('2', '41', '18', '4886', '4767', '0'), +('2', '41', '18', '2292', '2822', '0'), +('2', '41', '18', '2461', '2173', '0'), +('2', '41', '18', '4410', '1142', '0'), +('2', '41', '19', '4407', '4518', '0'), +('2', '41', '19', '4837', '3500', '0'), +('2', '41', '19', '68239', '3409', '0'), +('2', '41', '19', '2293', '2721', '0'), +('2', '41', '13', '11691', '15092', '0'), +('2', '41', '13', '27718', '10455', '0'), +('2', '41', '13', '27719', '7611', '0'), +('2', '41', '13', '10333', '5300', '0'), +('2', '41', '14', '27716', '11211', '0'), +('2', '41', '14', '10335', '8904', '0'), +('2', '41', '14', '13991', '5953', '0'), +('2', '41', '14', '12238', '5920', '0'), +('2', '41', '11', '9246', '4965', '0'), +('2', '41', '11', '14762', '2204', '0'), +('2', '41', '11', '16941', '991', '0'), +('2', '41', '11', '60396', '525', '0'), +('2', '42', '22', '9246', '0', '0'), +('2', '42', '22', '10323', '0', '0'), +('2', '42', '22', '44492', '0', '0'), +('2', '42', '22', '13101', '0', '0'), +('2', '42', '1', '14563', '4869', '0'), +('2', '42', '1', '14702', '3750', '0'), +('2', '42', '1', '10082', '3140', '0'), +('2', '42', '1', '14701', '2862', '0'), +('2', '42', '2', '10143', '5368', '0'), +('2', '42', '2', '30363', '3700', '0'), +('2', '42', '2', '2191', '3115', '0'), +('2', '42', '2', '2294', '3055', '0'), +('2', '42', '3', '11052', '7610', '0'), +('2', '42', '3', '14108', '3726', '0'), +('2', '42', '3', '4505', '3582', '0'), +('2', '42', '3', '14695', '3560', '0'), +('2', '42', '5', '14703', '6050', '0'), +('2', '42', '5', '14562', '5382', '0'), +('2', '42', '5', '1536', '5357', '0'), +('2', '42', '5', '4413', '4615', '0'), +('2', '42', '8', '11603', '12877', '0'), +('2', '42', '8', '12238', '5896', '0'), +('2', '42', '8', '2349', '3554', '0'), +('2', '42', '8', '1363', '2510', '0'), +('2', '42', '6', '27717', '9756', '0'), +('2', '42', '6', '2924', '8362', '0'), +('2', '42', '6', '1557', '5310', '0'), +('2', '42', '6', '1904', '4089', '0'), +('2', '42', '17', '2285', '11396', '0'), +('2', '42', '17', '4882', '10720', '0'), +('2', '42', '17', '4342', '5200', '0'), +('2', '42', '17', '2405', '2635', '0'), +('2', '42', '7', '2289', '3360', '0'), +('2', '42', '7', '1362', '2624', '0'), +('2', '42', '7', '1321', '1746', '0'), +('2', '42', '7', '10336', '1526', '0'), +('2', '42', '9', '2290', '3084', '0'), +('2', '42', '9', '4925', '2591', '0'), +('2', '42', '9', '4406', '2565', '0'), +('2', '42', '9', '10105', '2561', '0'), +('2', '42', '15', '14631', '3044', '0'), +('2', '42', '15', '10150', '3004', '0'), +('2', '42', '15', '10163', '2300', '0'), +('2', '42', '15', '14651', '2224', '0'), +('2', '42', '20', '11666', '8376', '0'), +('2', '42', '20', '2742', '5193', '0'), +('2', '42', '20', '2288', '4478', '0'), +('2', '42', '20', '2407', '2673', '0'), +('2', '42', '12', '2291', '3830', '0'), +('2', '42', '12', '20655', '3642', '0'), +('2', '42', '12', '2923', '3074', '0'), +('2', '42', '12', '4345', '2909', '0'), +('2', '42', '18', '4886', '4876', '0'), +('2', '42', '18', '2292', '2871', '0'), +('2', '42', '18', '2461', '2222', '0'), +('2', '42', '18', '4410', '1142', '0'), +('2', '42', '19', '4407', '4626', '0'), +('2', '42', '19', '4837', '3561', '0'), +('2', '42', '19', '68239', '3446', '0'), +('2', '42', '19', '2293', '2757', '0'), +('2', '42', '13', '11691', '15273', '0'), +('2', '42', '13', '27718', '10576', '0'), +('2', '42', '13', '27719', '7704', '0'), +('2', '42', '13', '10333', '5300', '0'), +('2', '42', '14', '27716', '11319', '0'), +('2', '42', '14', '10335', '9122', '0'), +('2', '42', '14', '13991', '6074', '0'), +('2', '42', '14', '12238', '6041', '0'), +('2', '42', '11', '9246', '5086', '0'), +('2', '42', '11', '14762', '2204', '0'), +('2', '42', '11', '16941', '1015', '0'), +('2', '42', '11', '60396', '537', '0'), +('2', '43', '22', '9246', '0', '0'), +('2', '43', '22', '10323', '0', '0'), +('2', '43', '22', '44492', '0', '0'), +('2', '43', '22', '13101', '0', '0'), +('2', '43', '1', '14563', '4978', '0'), +('2', '43', '1', '14702', '3750', '0'), +('2', '43', '1', '10082', '3213', '0'), +('2', '43', '1', '14701', '2862', '0'), +('2', '43', '2', '10143', '5368', '0'), +('2', '43', '2', '30363', '3700', '0'), +('2', '43', '2', '2191', '3188', '0'), +('2', '43', '2', '4881', '3090', '0'), +('2', '43', '3', '11052', '7792', '0'), +('2', '43', '3', '14108', '3810', '0'), +('2', '43', '3', '4505', '3666', '0'), +('2', '43', '3', '14695', '3645', '0'), +('2', '43', '5', '14703', '6050', '0'), +('2', '43', '5', '1536', '5466', '0'), +('2', '43', '5', '14562', '5466', '0'), +('2', '43', '5', '4413', '4723', '0'), +('2', '43', '8', '11603', '12985', '0'), +('2', '43', '8', '12238', '6017', '0'), +('2', '43', '8', '2349', '3554', '0'), +('2', '43', '8', '1363', '2510', '0'), +('2', '43', '6', '27717', '9904', '0'), +('2', '43', '6', '2924', '8423', '0'), +('2', '43', '6', '1557', '5310', '0'), +('2', '43', '6', '1904', '4186', '0'), +('2', '43', '17', '2285', '11444', '0'), +('2', '43', '17', '4882', '10906', '0'), +('2', '43', '17', '4342', '5321', '0'), +('2', '43', '17', '2405', '2697', '0'), +('2', '43', '7', '2289', '3408', '0'), +('2', '43', '7', '1362', '2624', '0'), +('2', '43', '7', '1321', '1746', '0'), +('2', '43', '7', '10336', '1562', '0'), +('2', '43', '9', '2290', '3145', '0'), +('2', '43', '9', '4925', '2652', '0'), +('2', '43', '9', '4406', '2625', '0'), +('2', '43', '9', '10105', '2621', '0'), +('2', '43', '15', '14631', '3117', '0'), +('2', '43', '15', '10150', '3004', '0'), +('2', '43', '15', '10163', '2300', '0'), +('2', '43', '15', '14651', '2224', '0'), +('2', '43', '20', '11666', '8378', '0'), +('2', '43', '20', '2742', '5196', '0'), +('2', '43', '20', '2288', '4478', '0'), +('2', '43', '20', '2407', '2733', '0'), +('2', '43', '12', '2291', '3830', '0'), +('2', '43', '12', '20655', '3666', '0'), +('2', '43', '12', '2923', '3074', '0'), +('2', '43', '12', '4345', '2970', '0'), +('2', '43', '18', '4886', '4985', '0'), +('2', '43', '18', '2292', '2919', '0'), +('2', '43', '18', '2461', '2270', '0'), +('2', '43', '18', '4410', '1142', '0'), +('2', '43', '19', '4407', '4735', '0'), +('2', '43', '19', '4837', '3621', '0'), +('2', '43', '19', '68239', '3482', '0'), +('2', '43', '19', '2293', '2793', '0'), +('2', '43', '13', '11691', '15455', '0'), +('2', '43', '13', '27718', '10697', '0'), +('2', '43', '13', '27719', '7796', '0'), +('2', '43', '13', '10333', '5300', '0'), +('2', '43', '14', '27716', '11428', '0'), +('2', '43', '14', '10335', '9339', '0'), +('2', '43', '14', '13991', '6194', '0'), +('2', '43', '14', '12238', '6162', '0'), +('2', '43', '11', '9246', '5206', '0'), +('2', '43', '11', '14762', '2204', '0'), +('2', '43', '11', '16941', '1039', '0'), +('2', '43', '11', '60396', '549', '0'), +('2', '44', '22', '9246', '0', '0'), +('2', '44', '22', '10323', '0', '0'), +('2', '44', '22', '44492', '0', '0'), +('2', '44', '22', '13101', '0', '0'), +('2', '44', '1', '14563', '5087', '0'), +('2', '44', '1', '14702', '3750', '0'), +('2', '44', '1', '10082', '3285', '0'), +('2', '44', '1', '14701', '2862', '0'), +('2', '44', '2', '10143', '5368', '0'), +('2', '44', '2', '30363', '3700', '0'), +('2', '44', '2', '2191', '3260', '0'), +('2', '44', '2', '4881', '3150', '0'), +('2', '44', '3', '11052', '7973', '0'), +('2', '44', '3', '14108', '3895', '0'), +('2', '44', '3', '4505', '3751', '0'), +('2', '44', '3', '14695', '3729', '0'), +('2', '44', '5', '14703', '6050', '0'), +('2', '44', '5', '1536', '5575', '0'), +('2', '44', '5', '14562', '5551', '0'), +('2', '44', '5', '4413', '4832', '0'), +('2', '44', '8', '11603', '13094', '0'), +('2', '44', '8', '12238', '6138', '0'), +('2', '44', '8', '2349', '3554', '0'), +('2', '44', '8', '1363', '2510', '0'), +('2', '44', '6', '27717', '10051', '0'), +('2', '44', '6', '2924', '8483', '0'), +('2', '44', '6', '1557', '5310', '0'), +('2', '44', '6', '1904', '4282', '0'), +('2', '44', '17', '2285', '11493', '0'), +('2', '44', '17', '4882', '11091', '0'), +('2', '44', '17', '4342', '5442', '0'), +('2', '44', '17', '2405', '2758', '0'), +('2', '44', '7', '2289', '3456', '0'), +('2', '44', '7', '1362', '2624', '0'), +('2', '44', '7', '1321', '1746', '0'), +('2', '44', '7', '10336', '1598', '0'), +('2', '44', '9', '2290', '3206', '0'), +('2', '44', '9', '4925', '2712', '0'), +('2', '44', '9', '4406', '2685', '0'), +('2', '44', '9', '10105', '2682', '0'), +('2', '44', '15', '14631', '3189', '0'), +('2', '44', '15', '10150', '3004', '0'), +('2', '44', '15', '10163', '2300', '0'), +('2', '44', '15', '14651', '2224', '0'), +('2', '44', '20', '11666', '8380', '0'), +('2', '44', '20', '2742', '5199', '0'), +('2', '44', '20', '2288', '4478', '0'), +('2', '44', '20', '2407', '2794', '0'), +('2', '44', '12', '2291', '3830', '0'), +('2', '44', '12', '20655', '3691', '0'), +('2', '44', '12', '2923', '3074', '0'), +('2', '44', '12', '4345', '3030', '0'), +('2', '44', '18', '4886', '5093', '0'), +('2', '44', '18', '2292', '2967', '0'), +('2', '44', '18', '2461', '2318', '0'), +('2', '44', '18', '4410', '1142', '0'), +('2', '44', '19', '4407', '4844', '0'), +('2', '44', '19', '4837', '3681', '0'), +('2', '44', '19', '68239', '3518', '0'), +('2', '44', '19', '2293', '2830', '0'), +('2', '44', '13', '11691', '15636', '0'), +('2', '44', '13', '27718', '10818', '0'), +('2', '44', '13', '27719', '7888', '0'), +('2', '44', '13', '9246', '5327', '0'), +('2', '44', '14', '27716', '11537', '0'), +('2', '44', '14', '10335', '9556', '0'), +('2', '44', '14', '13991', '6315', '0'), +('2', '44', '14', '12238', '6283', '0'), +('2', '44', '11', '9246', '5327', '0'), +('2', '44', '11', '14762', '2204', '0'), +('2', '44', '11', '16941', '1063', '0'), +('2', '44', '11', '60396', '562', '0'), +('2', '45', '22', '9246', '0', '0'), +('2', '45', '22', '10323', '0', '0'), +('2', '45', '22', '44492', '0', '0'), +('2', '45', '22', '13101', '0', '0'), +('2', '45', '1', '14563', '5195', '0'), +('2', '45', '1', '14702', '3750', '0'), +('2', '45', '1', '10082', '3358', '0'), +('2', '45', '1', '14701', '2862', '0'), +('2', '45', '2', '10143', '5368', '0'), +('2', '45', '2', '30363', '3700', '0'), +('2', '45', '2', '2191', '3333', '0'), +('2', '45', '2', '4881', '3211', '0'), +('2', '45', '3', '11052', '8154', '0'), +('2', '45', '3', '14108', '3979', '0'), +('2', '45', '3', '4505', '3835', '0'), +('2', '45', '3', '14695', '3814', '0'), +('2', '45', '5', '14703', '6050', '0'), +('2', '45', '5', '1536', '5683', '0'), +('2', '45', '5', '14562', '5635', '0'), +('2', '45', '5', '4413', '4941', '0'), +('2', '45', '8', '11603', '13203', '0'), +('2', '45', '8', '12238', '6258', '0'), +('2', '45', '8', '2349', '3554', '0'), +('2', '45', '8', '1363', '2510', '0'), +('2', '45', '6', '27717', '10198', '0'), +('2', '45', '6', '2924', '8544', '0'), +('2', '45', '6', '1557', '5310', '0'), +('2', '45', '6', '1904', '4379', '0'), +('2', '45', '17', '2285', '11541', '0'), +('2', '45', '17', '4882', '11277', '0'), +('2', '45', '17', '4342', '5563', '0'), +('2', '45', '17', '2405', '2819', '0'), +('2', '45', '7', '2289', '3505', '0'), +('2', '45', '7', '1362', '2624', '0'), +('2', '45', '7', '1321', '1746', '0'), +('2', '45', '7', '10336', '1634', '0'), +('2', '45', '9', '2290', '3267', '0'), +('2', '45', '9', '4925', '2772', '0'), +('2', '45', '9', '4406', '2746', '0'), +('2', '45', '9', '10105', '2742', '0'), +('2', '45', '15', '14631', '3262', '0'), +('2', '45', '15', '10150', '3004', '0'), +('2', '45', '15', '10163', '2300', '0'), +('2', '45', '15', '14651', '2224', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '45', '20', '11666', '8382', '0'), +('2', '45', '20', '2742', '5202', '0'), +('2', '45', '20', '2288', '4478', '0'), +('2', '45', '20', '2407', '2854', '0'), +('2', '45', '12', '2291', '3830', '0'), +('2', '45', '12', '20655', '3716', '0'), +('2', '45', '12', '4345', '3090', '0'), +('2', '45', '12', '2923', '3074', '0'), +('2', '45', '18', '4886', '5202', '0'), +('2', '45', '18', '2292', '3015', '0'), +('2', '45', '18', '2461', '2367', '0'), +('2', '45', '18', '4410', '1142', '0'), +('2', '45', '19', '4407', '4953', '0'), +('2', '45', '19', '4837', '3742', '0'), +('2', '45', '19', '68239', '3554', '0'), +('2', '45', '19', '2293', '2866', '0'), +('2', '45', '13', '11691', '15817', '0'), +('2', '45', '13', '27718', '10938', '0'), +('2', '45', '13', '27719', '7980', '0'), +('2', '45', '13', '9246', '5448', '0'), +('2', '45', '14', '27716', '11645', '0'), +('2', '45', '14', '10335', '9774', '0'), +('2', '45', '14', '13991', '6436', '0'), +('2', '45', '14', '12238', '6403', '0'), +('2', '45', '11', '9246', '5448', '0'), +('2', '45', '11', '14762', '2204', '0'), +('2', '45', '11', '16941', '1087', '0'), +('2', '45', '11', '60396', '574', '0'), +('2', '46', '22', '9246', '0', '0'), +('2', '46', '22', '10323', '0', '0'), +('2', '46', '22', '44492', '0', '0'), +('2', '46', '22', '13101', '0', '0'), +('2', '46', '1', '14563', '5304', '0'), +('2', '46', '1', '14702', '3750', '0'), +('2', '46', '1', '10082', '3430', '0'), +('2', '46', '1', '14701', '2862', '0'), +('2', '46', '2', '10143', '5368', '0'), +('2', '46', '2', '30363', '3700', '0'), +('2', '46', '2', '2191', '3405', '0'), +('2', '46', '2', '4881', '3271', '0'), +('2', '46', '3', '11052', '8335', '0'), +('2', '46', '3', '14108', '4064', '0'), +('2', '46', '3', '4505', '3920', '0'), +('2', '46', '3', '14695', '3898', '0'), +('2', '46', '5', '14703', '6050', '0'), +('2', '46', '5', '1536', '5792', '0'), +('2', '46', '5', '14562', '5720', '0'), +('2', '46', '5', '4413', '5049', '0'), +('2', '46', '8', '11603', '13312', '0'), +('2', '46', '8', '12238', '6379', '0'), +('2', '46', '8', '2349', '3554', '0'), +('2', '46', '8', '1363', '2510', '0'), +('2', '46', '6', '27717', '10346', '0'), +('2', '46', '6', '2924', '8604', '0'), +('2', '46', '6', '1557', '5310', '0'), +('2', '46', '6', '1904', '4476', '0'), +('2', '46', '17', '2285', '11589', '0'), +('2', '46', '17', '4882', '11463', '0'), +('2', '46', '17', '4342', '5684', '0'), +('2', '46', '17', '2405', '2880', '0'), +('2', '46', '7', '2289', '3553', '0'), +('2', '46', '7', '1362', '2624', '0'), +('2', '46', '7', '1321', '1746', '0'), +('2', '46', '7', '10336', '1671', '0'), +('2', '46', '9', '2290', '3328', '0'), +('2', '46', '9', '4925', '2833', '0'), +('2', '46', '9', '4406', '2806', '0'), +('2', '46', '9', '10105', '2803', '0'), +('2', '46', '15', '14631', '3334', '0'), +('2', '46', '15', '10150', '3004', '0'), +('2', '46', '15', '10163', '2300', '0'), +('2', '46', '15', '14694', '2225', '0'), +('2', '46', '20', '11666', '8384', '0'), +('2', '46', '20', '2742', '5205', '0'), +('2', '46', '20', '2288', '4478', '0'), +('2', '46', '20', '2407', '2915', '0'), +('2', '46', '12', '2291', '3830', '0'), +('2', '46', '12', '20655', '3741', '0'), +('2', '46', '12', '4345', '3151', '0'), +('2', '46', '12', '2923', '3074', '0'), +('2', '46', '18', '4886', '5311', '0'), +('2', '46', '18', '2292', '3064', '0'), +('2', '46', '18', '2461', '2415', '0'), +('2', '46', '18', '4410', '1142', '0'), +('2', '46', '19', '4407', '5061', '0'), +('2', '46', '19', '4837', '3802', '0'), +('2', '46', '19', '68239', '3590', '0'), +('2', '46', '19', '2293', '2902', '0'), +('2', '46', '13', '11691', '15998', '0'), +('2', '46', '13', '27718', '11059', '0'), +('2', '46', '13', '27719', '8072', '0'), +('2', '46', '13', '9246', '5569', '0'), +('2', '46', '14', '27716', '11754', '0'), +('2', '46', '14', '10335', '9991', '0'), +('2', '46', '14', '13991', '6557', '0'), +('2', '46', '14', '12238', '6524', '0'), +('2', '46', '11', '9246', '5569', '0'), +('2', '46', '11', '14762', '2204', '0'), +('2', '46', '11', '16941', '1111', '0'), +('2', '46', '11', '60396', '586', '0'), +('2', '47', '22', '9246', '0', '0'), +('2', '47', '22', '10323', '0', '0'), +('2', '47', '22', '44492', '0', '0'), +('2', '47', '22', '13101', '0', '0'), +('2', '47', '1', '14563', '5413', '0'), +('2', '47', '1', '14702', '3750', '0'), +('2', '47', '1', '10082', '3503', '0'), +('2', '47', '1', '14701', '2862', '0'), +('2', '47', '2', '10143', '5368', '0'), +('2', '47', '2', '30363', '3700', '0'), +('2', '47', '2', '2191', '3478', '0'), +('2', '47', '2', '4881', '3331', '0'), +('2', '47', '3', '11052', '8516', '0'), +('2', '47', '3', '14108', '4148', '0'), +('2', '47', '3', '4505', '4005', '0'), +('2', '47', '3', '14695', '3983', '0'), +('2', '47', '5', '14703', '6050', '0'), +('2', '47', '5', '1536', '5901', '0'), +('2', '47', '5', '14562', '5805', '0'), +('2', '47', '5', '4413', '5158', '0'), +('2', '47', '8', '11603', '13420', '0'), +('2', '47', '8', '12238', '6500', '0'), +('2', '47', '8', '2349', '3554', '0'), +('2', '47', '8', '1363', '2510', '0'), +('2', '47', '6', '27717', '10493', '0'), +('2', '47', '6', '2924', '8664', '0'), +('2', '47', '6', '1557', '5310', '0'), +('2', '47', '6', '1904', '4572', '0'), +('2', '47', '17', '4882', '11648', '0'), +('2', '47', '17', '2285', '11637', '0'), +('2', '47', '17', '4342', '5804', '0'), +('2', '47', '17', '2405', '2942', '0'), +('2', '47', '7', '2289', '3601', '0'), +('2', '47', '7', '1362', '2624', '0'), +('2', '47', '7', '1321', '1746', '0'), +('2', '47', '7', '10336', '1707', '0'), +('2', '47', '9', '2290', '3389', '0'), +('2', '47', '9', '4925', '2893', '0'), +('2', '47', '9', '4406', '2867', '0'), +('2', '47', '9', '10105', '2863', '0'), +('2', '47', '15', '14631', '3407', '0'), +('2', '47', '15', '10150', '3004', '0'), +('2', '47', '15', '10163', '2300', '0'), +('2', '47', '15', '14694', '2273', '0'), +('2', '47', '20', '11666', '8386', '0'), +('2', '47', '20', '2742', '5208', '0'), +('2', '47', '20', '2288', '4478', '0'), +('2', '47', '20', '2407', '2975', '0'), +('2', '47', '12', '2291', '3830', '0'), +('2', '47', '12', '20655', '3765', '0'), +('2', '47', '12', '4345', '3211', '0'), +('2', '47', '12', '2923', '3074', '0'), +('2', '47', '18', '4886', '5420', '0'), +('2', '47', '18', '2292', '3112', '0'), +('2', '47', '18', '2461', '2463', '0'), +('2', '47', '18', '4410', '1142', '0'), +('2', '47', '19', '4407', '5170', '0'), +('2', '47', '19', '4837', '3863', '0'), +('2', '47', '19', '68239', '3627', '0'), +('2', '47', '19', '2293', '2938', '0'), +('2', '47', '13', '11691', '16179', '0'), +('2', '47', '13', '27718', '11180', '0'), +('2', '47', '13', '27719', '8164', '0'), +('2', '47', '13', '9246', '5690', '0'), +('2', '47', '14', '27716', '11863', '0'), +('2', '47', '14', '10335', '10209', '0'), +('2', '47', '14', '13991', '6678', '0'), +('2', '47', '14', '12238', '6645', '0'), +('2', '47', '11', '9246', '5690', '0'), +('2', '47', '11', '14762', '2204', '0'), +('2', '47', '11', '16941', '1136', '0'), +('2', '47', '11', '60396', '598', '0'), +('2', '48', '22', '9246', '0', '0'), +('2', '48', '22', '10323', '0', '0'), +('2', '48', '22', '44492', '0', '0'), +('2', '48', '22', '13101', '0', '0'), +('2', '48', '1', '14563', '5522', '0'), +('2', '48', '1', '14702', '3750', '0'), +('2', '48', '1', '10082', '3575', '0'), +('2', '48', '1', '14701', '2862', '0'), +('2', '48', '2', '10143', '5368', '0'), +('2', '48', '2', '30363', '3700', '0'), +('2', '48', '2', '2191', '3550', '0'), +('2', '48', '2', '4881', '3392', '0'), +('2', '48', '3', '11052', '8698', '0'), +('2', '48', '3', '14108', '4233', '0'), +('2', '48', '3', '4505', '4089', '0'), +('2', '48', '3', '14695', '4067', '0'), +('2', '48', '5', '14703', '6050', '0'), +('2', '48', '5', '1536', '6010', '0'), +('2', '48', '5', '14562', '5889', '0'), +('2', '48', '5', '4413', '5267', '0'), +('2', '48', '8', '11603', '13529', '0'), +('2', '48', '8', '12238', '6621', '0'), +('2', '48', '8', '2349', '3554', '0'), +('2', '48', '8', '2913', '2512', '0'), +('2', '48', '6', '27717', '10640', '0'), +('2', '48', '6', '2924', '8725', '0'), +('2', '48', '6', '1557', '5310', '0'), +('2', '48', '6', '1904', '4669', '0'), +('2', '48', '17', '4882', '11834', '0'), +('2', '48', '17', '2285', '11686', '0'), +('2', '48', '17', '4342', '5925', '0'), +('2', '48', '17', '2405', '3003', '0'), +('2', '48', '7', '2289', '3650', '0'), +('2', '48', '7', '1362', '2624', '0'), +('2', '48', '7', '1321', '1746', '0'), +('2', '48', '7', '10336', '1743', '0'), +('2', '48', '9', '2290', '3450', '0'), +('2', '48', '9', '4925', '2954', '0'), +('2', '48', '9', '4406', '2927', '0'), +('2', '48', '9', '10105', '2923', '0'), +('2', '48', '15', '14631', '3479', '0'), +('2', '48', '15', '10150', '3004', '0'), +('2', '48', '15', '14694', '2322', '0'), +('2', '48', '15', '10163', '2300', '0'), +('2', '48', '20', '11666', '8388', '0'), +('2', '48', '20', '2742', '5211', '0'), +('2', '48', '20', '2288', '4478', '0'), +('2', '48', '20', '2407', '3035', '0'), +('2', '48', '12', '2291', '3830', '0'), +('2', '48', '12', '20655', '3790', '0'), +('2', '48', '12', '4345', '3272', '0'), +('2', '48', '12', '2923', '3074', '0'), +('2', '48', '18', '4886', '5528', '0'), +('2', '48', '18', '2292', '3160', '0'), +('2', '48', '18', '2461', '2512', '0'), +('2', '48', '18', '4410', '1142', '0'), +('2', '48', '19', '4407', '5279', '0'), +('2', '48', '19', '4837', '3923', '0'), +('2', '48', '19', '68239', '3663', '0'), +('2', '48', '19', '2293', '2975', '0'), +('2', '48', '13', '11691', '16361', '0'), +('2', '48', '13', '27718', '11301', '0'), +('2', '48', '13', '27719', '8256', '0'), +('2', '48', '13', '9246', '5810', '0'), +('2', '48', '14', '27716', '11972', '0'), +('2', '48', '14', '10335', '10426', '0'), +('2', '48', '14', '13991', '6798', '0'), +('2', '48', '14', '12238', '6766', '0'), +('2', '48', '11', '9246', '5810', '0'), +('2', '48', '11', '14762', '2204', '0'), +('2', '48', '11', '16941', '1160', '0'), +('2', '48', '11', '60396', '610', '0'), +('2', '49', '22', '9246', '0', '0'), +('2', '49', '22', '10323', '0', '0'), +('2', '49', '22', '44492', '0', '0'), +('2', '49', '22', '13101', '0', '0'), +('2', '49', '1', '14563', '5630', '0'), +('2', '49', '1', '14702', '3750', '0'), +('2', '49', '1', '10082', '3648', '0'), +('2', '49', '1', '14701', '2862', '0'), +('2', '49', '2', '10143', '5368', '0'), +('2', '49', '2', '30363', '3700', '0'), +('2', '49', '2', '2191', '3623', '0'), +('2', '49', '2', '4881', '3452', '0'), +('2', '49', '3', '11052', '8879', '0'), +('2', '49', '3', '14108', '4318', '0'), +('2', '49', '3', '4505', '4174', '0'), +('2', '49', '3', '14695', '4152', '0'), +('2', '49', '5', '1536', '6118', '0'), +('2', '49', '5', '14703', '6050', '0'), +('2', '49', '5', '14562', '5974', '0'), +('2', '49', '5', '4413', '5376', '0'), +('2', '49', '8', '11603', '13638', '0'), +('2', '49', '8', '12238', '6742', '0'), +('2', '49', '8', '2349', '3554', '0'), +('2', '49', '8', '2913', '2560', '0'), +('2', '49', '6', '27717', '10788', '0'), +('2', '49', '6', '2924', '8785', '0'), +('2', '49', '6', '1557', '5310', '0'), +('2', '49', '6', '1904', '4766', '0'), +('2', '49', '17', '4882', '12020', '0'), +('2', '49', '17', '2285', '11734', '0'), +('2', '49', '17', '4342', '6046', '0'), +('2', '49', '17', '2405', '3064', '0'), +('2', '49', '7', '2289', '3698', '0'), +('2', '49', '7', '1362', '2624', '0'), +('2', '49', '7', '10336', '1779', '0'), +('2', '49', '7', '1321', '1746', '0'), +('2', '49', '9', '2290', '3511', '0'), +('2', '49', '9', '4925', '3014', '0'), +('2', '49', '9', '4406', '2987', '0'), +('2', '49', '9', '10105', '2984', '0'), +('2', '49', '15', '14631', '3552', '0'), +('2', '49', '15', '10150', '3004', '0'), +('2', '49', '15', '14694', '2370', '0'), +('2', '49', '15', '10163', '2300', '0'), +('2', '49', '20', '11666', '8390', '0'), +('2', '49', '20', '2742', '5214', '0'), +('2', '49', '20', '2288', '4478', '0'), +('2', '49', '20', '2407', '3096', '0'), +('2', '49', '12', '2291', '3830', '0'), +('2', '49', '12', '20655', '3815', '0'), +('2', '49', '12', '4345', '3332', '0'), +('2', '49', '12', '2923', '3074', '0'), +('2', '49', '18', '4886', '5637', '0'), +('2', '49', '18', '2292', '3209', '0'), +('2', '49', '18', '2461', '2560', '0'), +('2', '49', '18', '4410', '1142', '0'), +('2', '49', '19', '4407', '5387', '0'), +('2', '49', '19', '4837', '3983', '0'), +('2', '49', '19', '68239', '3699', '0'), +('2', '49', '19', '2293', '3011', '0'), +('2', '49', '13', '11691', '16542', '0'), +('2', '49', '13', '27718', '11422', '0'), +('2', '49', '13', '27719', '8348', '0'), +('2', '49', '13', '9246', '5931', '0'), +('2', '49', '14', '27716', '12080', '0'), +('2', '49', '14', '10335', '10644', '0'), +('2', '49', '14', '13991', '6919', '0'), +('2', '49', '14', '12238', '6887', '0'), +('2', '49', '11', '9246', '5931', '0'), +('2', '49', '11', '14762', '2204', '0'), +('2', '49', '11', '16941', '1184', '0'), +('2', '49', '11', '60396', '622', '0'), +('2', '50', '22', '9246', '0', '0'), +('2', '50', '22', '10323', '0', '0'), +('2', '50', '22', '44492', '0', '0'), +('2', '50', '22', '13101', '0', '0'), +('2', '50', '1', '14563', '5739', '0'), +('2', '50', '1', '14702', '3750', '0'), +('2', '50', '1', '10082', '3720', '0'), +('2', '50', '1', '14701', '2862', '0'), +('2', '50', '2', '10143', '5368', '0'), +('2', '50', '2', '30363', '3700', '0'), +('2', '50', '2', '2191', '3695', '0'), +('2', '50', '2', '4881', '3513', '0'), +('2', '50', '3', '11052', '9060', '0'), +('2', '50', '3', '14108', '4402', '0'), +('2', '50', '3', '4505', '4258', '0'), +('2', '50', '3', '14695', '4236', '0'), +('2', '50', '5', '1536', '6227', '0'), +('2', '50', '5', '14562', '6058', '0'), +('2', '50', '5', '14703', '6050', '0'), +('2', '50', '5', '4413', '5484', '0'), +('2', '50', '8', '11603', '13746', '0'), +('2', '50', '8', '12238', '6862', '0'), +('2', '50', '8', '2349', '3554', '0'), +('2', '50', '8', '2913', '2608', '0'), +('2', '50', '6', '27717', '10935', '0'), +('2', '50', '6', '2924', '8846', '0'), +('2', '50', '6', '1557', '5310', '0'), +('2', '50', '6', '1904', '4862', '0'), +('2', '50', '17', '4882', '12206', '0'), +('2', '50', '17', '2285', '11782', '0'), +('2', '50', '17', '4342', '6167', '0'), +('2', '50', '17', '2405', '3126', '0'), +('2', '50', '7', '2289', '3746', '0'), +('2', '50', '7', '1362', '2624', '0'), +('2', '50', '7', '10336', '1816', '0'), +('2', '50', '7', '1321', '1746', '0'), +('2', '50', '9', '2290', '3572', '0'), +('2', '50', '9', '4925', '3074', '0'), +('2', '50', '9', '4406', '3048', '0'), +('2', '50', '9', '10105', '3044', '0'), +('2', '50', '15', '14631', '3624', '0'), +('2', '50', '15', '10150', '3004', '0'), +('2', '50', '15', '14694', '2418', '0'), +('2', '50', '15', '10163', '2300', '0'), +('2', '50', '20', '11666', '8393', '0'), +('2', '50', '20', '2742', '5217', '0'), +('2', '50', '20', '2288', '4478', '0'), +('2', '50', '20', '2500', '3156', '0'), +('2', '50', '12', '20655', '3840', '0'), +('2', '50', '12', '2291', '3830', '0'), +('2', '50', '12', '4345', '3392', '0'), +('2', '50', '12', '2923', '3074', '0'), +('2', '50', '18', '4886', '5746', '0'), +('2', '50', '18', '2292', '3257', '0'), +('2', '50', '18', '2461', '2608', '0'), +('2', '50', '18', '4410', '1142', '0'), +('2', '50', '19', '4407', '5496', '0'), +('2', '50', '19', '4837', '4044', '0'), +('2', '50', '19', '68239', '3735', '0'), +('2', '50', '19', '2293', '3047', '0'), +('2', '50', '13', '11691', '16723', '0'), +('2', '50', '13', '27718', '11542', '0'), +('2', '50', '13', '27719', '8440', '0'), +('2', '50', '13', '9246', '6052', '0'), +('2', '50', '14', '27716', '12189', '0'), +('2', '50', '14', '10335', '10861', '0'), +('2', '50', '14', '13991', '7040', '0'), +('2', '50', '14', '12238', '7007', '0'), +('2', '50', '11', '9246', '6052', '0'), +('2', '50', '11', '14762', '2204', '0'), +('2', '50', '11', '16941', '1208', '0'), +('2', '50', '11', '60396', '634', '0'), +('2', '51', '22', '9246', '0', '0'), +('2', '51', '22', '10323', '0', '0'), +('2', '51', '22', '44492', '0', '0'), +('2', '51', '22', '13101', '0', '0'), +('2', '51', '1', '14563', '5848', '0'), +('2', '51', '1', '10082', '3793', '0'), +('2', '51', '1', '14702', '3750', '0'), +('2', '51', '1', '14701', '2862', '0'), +('2', '51', '2', '10143', '5368', '0'), +('2', '51', '2', '2191', '3768', '0'), +('2', '51', '2', '30363', '3700', '0'), +('2', '51', '2', '4881', '3573', '0'), +('2', '51', '3', '11052', '9241', '0'), +('2', '51', '3', '14108', '4487', '0'), +('2', '51', '3', '4505', '4343', '0'), +('2', '51', '3', '14695', '4321', '0'), +('2', '51', '5', '1536', '6336', '0'), +('2', '51', '5', '14562', '6143', '0'), +('2', '51', '5', '14703', '6050', '0'), +('2', '51', '5', '4413', '5593', '0'), +('2', '51', '8', '11603', '13855', '0'), +('2', '51', '8', '12238', '6983', '0'), +('2', '51', '8', '2349', '3554', '0'), +('2', '51', '8', '2913', '2657', '0'), +('2', '51', '6', '27717', '11083', '0'), +('2', '51', '6', '2924', '8906', '0'), +('2', '51', '6', '1557', '5310', '0'), +('2', '51', '6', '1904', '4959', '0'), +('2', '51', '17', '4882', '12391', '0'), +('2', '51', '17', '2285', '11831', '0'), +('2', '51', '17', '4342', '6288', '0'), +('2', '51', '17', '2405', '3187', '0'), +('2', '51', '7', '2289', '3795', '0'), +('2', '51', '7', '1362', '2624', '0'), +('2', '51', '7', '10336', '1852', '0'), +('2', '51', '7', '1321', '1746', '0'), +('2', '51', '9', '2290', '3633', '0'), +('2', '51', '9', '4925', '3135', '0'), +('2', '51', '9', '4406', '3108', '0'), +('2', '51', '9', '10105', '3105', '0'), +('2', '51', '15', '14631', '3696', '0'), +('2', '51', '15', '10150', '3004', '0'), +('2', '51', '15', '14694', '2467', '0'), +('2', '51', '15', '10163', '2300', '0'), +('2', '51', '20', '11666', '8395', '0'), +('2', '51', '20', '2742', '5220', '0'), +('2', '51', '20', '2288', '4478', '0'), +('2', '51', '20', '2500', '3218', '0'), +('2', '51', '12', '20655', '3864', '0'), +('2', '51', '12', '2291', '3830', '0'), +('2', '51', '12', '4345', '3453', '0'), +('2', '51', '12', '2923', '3074', '0'), +('2', '51', '18', '4886', '5854', '0'), +('2', '51', '18', '2292', '3305', '0'), +('2', '51', '18', '2461', '2657', '0'), +('2', '51', '18', '4410', '1142', '0'), +('2', '51', '19', '4407', '5605', '0'), +('2', '51', '19', '4837', '4104', '0'), +('2', '51', '19', '68239', '3772', '0'), +('2', '51', '19', '2293', '3083', '0'), +('2', '51', '13', '11691', '16904', '0'), +('2', '51', '13', '27718', '11663', '0'), +('2', '51', '13', '27719', '8533', '0'), +('2', '51', '13', '9246', '6173', '0'), +('2', '51', '14', '27716', '12298', '0'), +('2', '51', '14', '10335', '11079', '0'), +('2', '51', '14', '13991', '7161', '0'), +('2', '51', '14', '12238', '7128', '0'), +('2', '51', '11', '9246', '6173', '0'), +('2', '51', '11', '14762', '2204', '0'), +('2', '51', '11', '16941', '1232', '0'), +('2', '51', '11', '60396', '646', '0'), +('2', '52', '22', '9246', '0', '0'), +('2', '52', '22', '10323', '0', '0'), +('2', '52', '22', '44492', '0', '0'), +('2', '52', '22', '13101', '0', '0'), +('2', '52', '1', '14563', '5956', '0'), +('2', '52', '1', '10082', '3865', '0'), +('2', '52', '1', '14702', '3750', '0'), +('2', '52', '1', '14701', '2862', '0'), +('2', '52', '2', '10143', '5368', '0'), +('2', '52', '2', '2191', '3840', '0'), +('2', '52', '2', '30363', '3700', '0'), +('2', '52', '2', '4881', '3633', '0'), +('2', '52', '3', '11052', '9422', '0'), +('2', '52', '3', '14108', '4571', '0'), +('2', '52', '3', '4505', '4427', '0'), +('2', '52', '3', '14695', '4406', '0'), +('2', '52', '5', '1536', '6445', '0'), +('2', '52', '5', '14562', '6227', '0'), +('2', '52', '5', '14703', '6050', '0'), +('2', '52', '5', '4413', '5702', '0'), +('2', '52', '8', '11603', '13964', '0'), +('2', '52', '8', '12238', '7104', '0'), +('2', '52', '8', '2349', '3554', '0'), +('2', '52', '8', '2913', '2705', '0'), +('2', '52', '6', '27717', '11230', '0'), +('2', '52', '6', '2924', '8966', '0'), +('2', '52', '6', '1557', '5310', '0'), +('2', '52', '6', '1904', '5055', '0'), +('2', '52', '17', '4882', '12577', '0'), +('2', '52', '17', '2285', '11879', '0'), +('2', '52', '17', '4342', '6408', '0'), +('2', '52', '17', '2405', '3248', '0'), +('2', '52', '7', '2289', '3843', '0'), +('2', '52', '7', '1362', '2624', '0'), +('2', '52', '7', '10336', '1888', '0'), +('2', '52', '7', '1321', '1746', '0'), +('2', '52', '9', '2290', '3694', '0'), +('2', '52', '9', '4925', '3195', '0'), +('2', '52', '9', '4406', '3169', '0'), +('2', '52', '9', '10105', '3165', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '52', '15', '14631', '3769', '0'), +('2', '52', '15', '10150', '3004', '0'), +('2', '52', '15', '14694', '2515', '0'), +('2', '52', '15', '10163', '2300', '0'), +('2', '52', '20', '11666', '8397', '0'), +('2', '52', '20', '2742', '5223', '0'), +('2', '52', '20', '2288', '4478', '0'), +('2', '52', '20', '2500', '3280', '0'), +('2', '52', '12', '20655', '3889', '0'), +('2', '52', '12', '2291', '3830', '0'), +('2', '52', '12', '4345', '3513', '0'), +('2', '52', '12', '2923', '3074', '0'), +('2', '52', '18', '4886', '5963', '0'), +('2', '52', '18', '2292', '3354', '0'), +('2', '52', '18', '2461', '2705', '0'), +('2', '52', '18', '4410', '1142', '0'), +('2', '52', '19', '4407', '5714', '0'), +('2', '52', '19', '4837', '4165', '0'), +('2', '52', '19', '68239', '3808', '0'), +('2', '52', '19', '2293', '3120', '0'), +('2', '52', '13', '11691', '17085', '0'), +('2', '52', '13', '27718', '11784', '0'), +('2', '52', '13', '27719', '8625', '0'), +('2', '52', '13', '9246', '6294', '0'), +('2', '52', '14', '27716', '12406', '0'), +('2', '52', '14', '10335', '11296', '0'), +('2', '52', '14', '13991', '7282', '0'), +('2', '52', '14', '12238', '7249', '0'), +('2', '52', '11', '9246', '6294', '0'), +('2', '52', '11', '14762', '2204', '0'), +('2', '52', '11', '16941', '1256', '0'), +('2', '52', '11', '60396', '658', '0'), +('2', '53', '22', '9246', '0', '0'), +('2', '53', '22', '10323', '0', '0'), +('2', '53', '22', '44492', '0', '0'), +('2', '53', '22', '13101', '0', '0'), +('2', '53', '1', '14563', '6065', '0'), +('2', '53', '1', '10082', '3938', '0'), +('2', '53', '1', '14702', '3750', '0'), +('2', '53', '1', '14701', '2862', '0'), +('2', '53', '2', '10143', '5368', '0'), +('2', '53', '2', '2191', '3913', '0'), +('2', '53', '2', '30363', '3700', '0'), +('2', '53', '2', '4881', '3694', '0'), +('2', '53', '3', '11052', '9604', '0'), +('2', '53', '3', '14108', '4656', '0'), +('2', '53', '3', '4505', '4512', '0'), +('2', '53', '3', '14695', '4490', '0'), +('2', '53', '5', '1536', '6553', '0'), +('2', '53', '5', '14562', '6312', '0'), +('2', '53', '5', '14703', '6050', '0'), +('2', '53', '5', '4413', '5810', '0'), +('2', '53', '8', '11603', '14073', '0'), +('2', '53', '8', '12238', '7225', '0'), +('2', '53', '8', '2349', '3554', '0'), +('2', '53', '8', '2913', '2753', '0'), +('2', '53', '6', '27717', '11377', '0'), +('2', '53', '6', '2924', '9027', '0'), +('2', '53', '6', '1557', '5310', '0'), +('2', '53', '6', '1904', '5152', '0'), +('2', '53', '17', '4882', '12763', '0'), +('2', '53', '17', '2285', '11927', '0'), +('2', '53', '17', '4342', '6529', '0'), +('2', '53', '17', '2405', '3310', '0'), +('2', '53', '7', '2289', '3891', '0'), +('2', '53', '7', '1362', '2624', '0'), +('2', '53', '7', '10336', '1924', '0'), +('2', '53', '7', '1321', '1746', '0'), +('2', '53', '9', '2290', '3755', '0'), +('2', '53', '9', '4925', '3256', '0'), +('2', '53', '9', '4406', '3229', '0'), +('2', '53', '9', '10105', '3225', '0'), +('2', '53', '15', '14631', '3841', '0'), +('2', '53', '15', '10150', '3004', '0'), +('2', '53', '15', '14694', '2563', '0'), +('2', '53', '15', '10163', '2300', '0'), +('2', '53', '20', '11666', '8399', '0'), +('2', '53', '20', '2742', '5227', '0'), +('2', '53', '20', '2288', '4478', '0'), +('2', '53', '20', '2500', '3342', '0'), +('2', '53', '12', '20655', '3914', '0'), +('2', '53', '12', '2291', '3830', '0'), +('2', '53', '12', '4345', '3574', '0'), +('2', '53', '12', '2923', '3074', '0'), +('2', '53', '18', '4886', '6072', '0'), +('2', '53', '18', '2292', '3402', '0'), +('2', '53', '18', '2461', '2753', '0'), +('2', '53', '18', '4410', '1142', '0'), +('2', '53', '19', '4407', '5822', '0'), +('2', '53', '19', '4837', '4225', '0'), +('2', '53', '19', '68239', '3844', '0'), +('2', '53', '19', '2293', '3156', '0'), +('2', '53', '13', '11691', '17267', '0'), +('2', '53', '13', '27718', '11905', '0'), +('2', '53', '13', '27719', '8717', '0'), +('2', '53', '13', '9246', '6414', '0'), +('2', '53', '14', '27716', '12515', '0'), +('2', '53', '14', '10335', '11513', '0'), +('2', '53', '14', '13991', '7402', '0'), +('2', '53', '14', '12238', '7370', '0'), +('2', '53', '11', '9246', '6414', '0'), +('2', '53', '11', '14762', '2204', '0'), +('2', '53', '11', '16941', '1280', '0'), +('2', '53', '11', '60396', '670', '0'), +('2', '54', '22', '9246', '0', '0'), +('2', '54', '22', '10323', '0', '0'), +('2', '54', '22', '44492', '0', '0'), +('2', '54', '22', '13101', '0', '0'), +('2', '54', '1', '14563', '6174', '0'), +('2', '54', '1', '10082', '4010', '0'), +('2', '54', '1', '14702', '3750', '0'), +('2', '54', '1', '14701', '2862', '0'), +('2', '54', '2', '10143', '5368', '0'), +('2', '54', '2', '2191', '3985', '0'), +('2', '54', '2', '4881', '3754', '0'), +('2', '54', '2', '30363', '3700', '0'), +('2', '54', '3', '11052', '9785', '0'), +('2', '54', '3', '14108', '4740', '0'), +('2', '54', '3', '4505', '4596', '0'), +('2', '54', '3', '14695', '4575', '0'), +('2', '54', '5', '1536', '6662', '0'), +('2', '54', '5', '14562', '6396', '0'), +('2', '54', '5', '14703', '6050', '0'), +('2', '54', '5', '4413', '5919', '0'), +('2', '54', '8', '11603', '14181', '0'), +('2', '54', '8', '12238', '7346', '0'), +('2', '54', '8', '2349', '3554', '0'), +('2', '54', '8', '2913', '2802', '0'), +('2', '54', '6', '27717', '11525', '0'), +('2', '54', '6', '2924', '9087', '0'), +('2', '54', '6', '1557', '5310', '0'), +('2', '54', '6', '1904', '5249', '0'), +('2', '54', '17', '4882', '12949', '0'), +('2', '54', '17', '2285', '11976', '0'), +('2', '54', '17', '4342', '6650', '0'), +('2', '54', '17', '2405', '3371', '0'), +('2', '54', '7', '2289', '3939', '0'), +('2', '54', '7', '1362', '2624', '0'), +('2', '54', '7', '10336', '1961', '0'), +('2', '54', '7', '1321', '1746', '0'), +('2', '54', '9', '2290', '3816', '0'), +('2', '54', '9', '4925', '3316', '0'), +('2', '54', '9', '4406', '3289', '0'), +('2', '54', '9', '10105', '3286', '0'), +('2', '54', '15', '14631', '3914', '0'), +('2', '54', '15', '10150', '3004', '0'), +('2', '54', '15', '14694', '2612', '0'), +('2', '54', '15', '10163', '2300', '0'), +('2', '54', '20', '11666', '8401', '0'), +('2', '54', '20', '2742', '5230', '0'), +('2', '54', '20', '2288', '4478', '0'), +('2', '54', '20', '2500', '3404', '0'), +('2', '54', '12', '20655', '3939', '0'), +('2', '54', '12', '2291', '3830', '0'), +('2', '54', '12', '4345', '3634', '0'), +('2', '54', '12', '2923', '3074', '0'), +('2', '54', '18', '4886', '6181', '0'), +('2', '54', '18', '2292', '3450', '0'), +('2', '54', '18', '2461', '2802', '0'), +('2', '54', '18', '4410', '1142', '0'), +('2', '54', '19', '4407', '5931', '0'), +('2', '54', '19', '4837', '4285', '0'), +('2', '54', '19', '68239', '3880', '0'), +('2', '54', '19', '2293', '3192', '0'), +('2', '54', '13', '11691', '17448', '0'), +('2', '54', '13', '27718', '12026', '0'), +('2', '54', '13', '27719', '8809', '0'), +('2', '54', '13', '9246', '6535', '0'), +('2', '54', '14', '27716', '12624', '0'), +('2', '54', '14', '10335', '11731', '0'), +('2', '54', '14', '13991', '7523', '0'), +('2', '54', '14', '12238', '7491', '0'), +('2', '54', '11', '9246', '6535', '0'), +('2', '54', '11', '14762', '2204', '0'), +('2', '54', '11', '16941', '1305', '0'), +('2', '54', '11', '60396', '682', '0'), +('2', '55', '22', '9246', '0', '0'), +('2', '55', '22', '10323', '0', '0'), +('2', '55', '22', '44492', '0', '0'), +('2', '55', '22', '13101', '0', '0'), +('2', '55', '1', '14563', '6283', '0'), +('2', '55', '1', '10082', '4083', '0'), +('2', '55', '1', '14702', '3750', '0'), +('2', '55', '1', '14701', '2862', '0'), +('2', '55', '2', '10143', '5368', '0'), +('2', '55', '2', '2191', '4058', '0'), +('2', '55', '2', '4881', '3815', '0'), +('2', '55', '2', '30363', '3700', '0'), +('2', '55', '3', '11052', '9966', '0'), +('2', '55', '3', '14108', '4825', '0'), +('2', '55', '3', '4505', '4681', '0'), +('2', '55', '3', '14695', '4659', '0'), +('2', '55', '5', '1536', '6771', '0'), +('2', '55', '5', '14562', '6481', '0'), +('2', '55', '5', '14703', '6050', '0'), +('2', '55', '5', '4413', '6028', '0'), +('2', '55', '8', '11603', '14290', '0'), +('2', '55', '8', '12238', '7466', '0'), +('2', '55', '8', '2349', '3554', '0'), +('2', '55', '8', '2913', '2850', '0'), +('2', '55', '6', '27717', '11672', '0'), +('2', '55', '6', '2924', '9148', '0'), +('2', '55', '6', '1904', '5345', '0'), +('2', '55', '6', '1557', '5310', '0'), +('2', '55', '17', '4882', '13134', '0'), +('2', '55', '17', '2285', '12024', '0'), +('2', '55', '17', '4342', '6771', '0'), +('2', '55', '17', '2405', '3432', '0'), +('2', '55', '7', '2289', '3988', '0'), +('2', '55', '7', '1362', '2624', '0'), +('2', '55', '7', '10336', '1997', '0'), +('2', '55', '7', '1321', '1746', '0'), +('2', '55', '9', '2290', '3877', '0'), +('2', '55', '9', '4925', '3376', '0'), +('2', '55', '9', '4406', '3350', '0'), +('2', '55', '9', '10105', '3346', '0'), +('2', '55', '15', '14631', '3986', '0'), +('2', '55', '15', '10150', '3004', '0'), +('2', '55', '15', '14694', '2660', '0'), +('2', '55', '15', '10163', '2300', '0'), +('2', '55', '20', '11666', '8403', '0'), +('2', '55', '20', '2742', '5233', '0'), +('2', '55', '20', '2288', '4478', '0'), +('2', '55', '20', '2500', '3465', '0'), +('2', '55', '12', '20655', '3963', '0'), +('2', '55', '12', '2291', '3830', '0'), +('2', '55', '12', '4345', '3694', '0'), +('2', '55', '12', '2923', '3074', '0'), +('2', '55', '18', '4886', '6289', '0'), +('2', '55', '18', '2292', '3499', '0'), +('2', '55', '18', '2461', '2850', '0'), +('2', '55', '18', '4410', '1142', '0'), +('2', '55', '19', '4407', '6040', '0'), +('2', '55', '19', '4837', '4346', '0'), +('2', '55', '19', '68239', '3917', '0'), +('2', '55', '19', '2293', '3228', '0'), +('2', '55', '13', '11691', '17629', '0'), +('2', '55', '13', '27718', '12146', '0'), +('2', '55', '13', '27719', '8901', '0'), +('2', '55', '13', '9246', '6656', '0'), +('2', '55', '14', '27716', '12733', '0'), +('2', '55', '14', '10335', '11948', '0'), +('2', '55', '14', '13991', '7644', '0'), +('2', '55', '14', '12238', '7611', '0'), +('2', '55', '11', '9246', '6656', '0'), +('2', '55', '11', '14762', '2204', '0'), +('2', '55', '11', '16941', '1329', '0'), +('2', '55', '11', '60396', '694', '0'), +('2', '56', '22', '9246', '0', '0'), +('2', '56', '22', '10323', '0', '0'), +('2', '56', '22', '44492', '0', '0'), +('2', '56', '22', '13101', '0', '0'), +('2', '56', '1', '14563', '6391', '0'), +('2', '56', '1', '10082', '4155', '0'), +('2', '56', '1', '14702', '3750', '0'), +('2', '56', '1', '14701', '2862', '0'), +('2', '56', '2', '10143', '5368', '0'), +('2', '56', '2', '2191', '4130', '0'), +('2', '56', '2', '4881', '3875', '0'), +('2', '56', '2', '30363', '3700', '0'), +('2', '56', '3', '11052', '10147', '0'), +('2', '56', '3', '14108', '4910', '0'), +('2', '56', '3', '4505', '4766', '0'), +('2', '56', '3', '14695', '4744', '0'), +('2', '56', '5', '1536', '6879', '0'), +('2', '56', '5', '14562', '6566', '0'), +('2', '56', '5', '4413', '6137', '0'), +('2', '56', '5', '14703', '6050', '0'), +('2', '56', '8', '11603', '14399', '0'), +('2', '56', '8', '12238', '7587', '0'), +('2', '56', '8', '2349', '3554', '0'), +('2', '56', '8', '2913', '2898', '0'), +('2', '56', '6', '27717', '11819', '0'), +('2', '56', '6', '2924', '9208', '0'), +('2', '56', '6', '1904', '5442', '0'), +('2', '56', '6', '1557', '5310', '0'), +('2', '56', '17', '4882', '13320', '0'), +('2', '56', '17', '2285', '12072', '0'), +('2', '56', '17', '4342', '6892', '0'), +('2', '56', '17', '2405', '3494', '0'), +('2', '56', '7', '2289', '4036', '0'), +('2', '56', '7', '1362', '2624', '0'), +('2', '56', '7', '10336', '2033', '0'), +('2', '56', '7', '1321', '1746', '0'), +('2', '56', '9', '2290', '3938', '0'), +('2', '56', '9', '4925', '3437', '0'), +('2', '56', '9', '4406', '3410', '0'), +('2', '56', '9', '10105', '3407', '0'), +('2', '56', '15', '14631', '4059', '0'), +('2', '56', '15', '10150', '3004', '0'), +('2', '56', '15', '14694', '2708', '0'), +('2', '56', '15', '10163', '2300', '0'), +('2', '56', '20', '11666', '8405', '0'), +('2', '56', '20', '2742', '5236', '0'), +('2', '56', '20', '2288', '4478', '0'), +('2', '56', '20', '2500', '3527', '0'), +('2', '56', '12', '20655', '3988', '0'), +('2', '56', '12', '2291', '3830', '0'), +('2', '56', '12', '4345', '3755', '0'), +('2', '56', '12', '2923', '3074', '0'), +('2', '56', '18', '4886', '6398', '0'), +('2', '56', '18', '2292', '3547', '0'), +('2', '56', '18', '2461', '2898', '0'), +('2', '56', '18', '4410', '1142', '0'), +('2', '56', '19', '4407', '6149', '0'), +('2', '56', '19', '4837', '4406', '0'), +('2', '56', '19', '68239', '3953', '0'), +('2', '56', '19', '2293', '3264', '0'), +('2', '56', '13', '11691', '17810', '0'), +('2', '56', '13', '27718', '12267', '0'), +('2', '56', '13', '27719', '8993', '0'), +('2', '56', '13', '9246', '6777', '0'), +('2', '56', '14', '27716', '12841', '0'), +('2', '56', '14', '10335', '12166', '0'), +('2', '56', '14', '13991', '7765', '0'), +('2', '56', '14', '12238', '7732', '0'), +('2', '56', '11', '9246', '6777', '0'), +('2', '56', '11', '14762', '2204', '0'), +('2', '56', '11', '16941', '1353', '0'), +('2', '56', '11', '60396', '706', '0'), +('2', '57', '22', '9246', '0', '0'), +('2', '57', '22', '10323', '0', '0'), +('2', '57', '22', '44492', '0', '0'), +('2', '57', '22', '13101', '0', '0'), +('2', '57', '1', '14563', '6500', '0'), +('2', '57', '1', '10082', '4228', '0'), +('2', '57', '1', '14702', '3750', '0'), +('2', '57', '1', '14701', '2862', '0'), +('2', '57', '2', '10143', '5368', '0'), +('2', '57', '2', '2191', '4203', '0'), +('2', '57', '2', '4881', '3935', '0'), +('2', '57', '2', '30363', '3700', '0'), +('2', '57', '3', '11052', '10328', '0'), +('2', '57', '3', '14108', '4994', '0'), +('2', '57', '3', '4505', '4850', '0'), +('2', '57', '3', '14695', '4828', '0'), +('2', '57', '5', '1536', '6988', '0'), +('2', '57', '5', '14562', '6650', '0'), +('2', '57', '5', '4413', '6245', '0'), +('2', '57', '5', '14703', '6050', '0'), +('2', '57', '8', '11603', '14507', '0'), +('2', '57', '8', '12238', '7708', '0'), +('2', '57', '8', '2349', '3554', '0'), +('2', '57', '8', '2913', '2947', '0'), +('2', '57', '6', '27717', '11967', '0'), +('2', '57', '6', '2924', '9268', '0'), +('2', '57', '6', '1904', '5539', '0'), +('2', '57', '6', '1557', '5310', '0'), +('2', '57', '17', '4882', '13506', '0'), +('2', '57', '17', '2285', '12121', '0'), +('2', '57', '17', '4342', '7012', '0'), +('2', '57', '17', '2405', '3555', '0'), +('2', '57', '7', '2289', '4084', '0'), +('2', '57', '7', '1362', '2624', '0'), +('2', '57', '7', '10336', '2069', '0'), +('2', '57', '7', '1321', '1746', '0'), +('2', '57', '9', '2290', '3999', '0'), +('2', '57', '9', '4925', '3497', '0'), +('2', '57', '9', '4406', '3471', '0'), +('2', '57', '9', '10105', '3467', '0'), +('2', '57', '15', '14631', '4131', '0'), +('2', '57', '15', '10150', '3004', '0'), +('2', '57', '15', '14694', '2757', '0'), +('2', '57', '15', '10163', '2300', '0'), +('2', '57', '20', '11666', '8407', '0'), +('2', '57', '20', '2742', '5239', '0'), +('2', '57', '20', '2288', '4478', '0'), +('2', '57', '20', '2500', '3589', '0'), +('2', '57', '12', '20655', '4013', '0'), +('2', '57', '12', '2291', '3830', '0'), +('2', '57', '12', '4345', '3815', '0'), +('2', '57', '12', '2923', '3074', '0'), +('2', '57', '18', '4886', '6507', '0'), +('2', '57', '18', '2292', '3595', '0'), +('2', '57', '18', '2461', '2947', '0'), +('2', '57', '18', '4410', '1142', '0'), +('2', '57', '19', '4407', '6257', '0'), +('2', '57', '19', '4837', '4467', '0'), +('2', '57', '19', '68239', '3989', '0'), +('2', '57', '19', '2293', '3301', '0'), +('2', '57', '13', '11691', '17991', '0'), +('2', '57', '13', '27718', '12388', '0'), +('2', '57', '13', '27719', '9085', '0'), +('2', '57', '13', '9246', '6898', '0'), +('2', '57', '14', '27716', '12950', '0'), +('2', '57', '14', '10335', '12383', '0'), +('2', '57', '14', '13991', '7886', '0'), +('2', '57', '14', '12238', '7853', '0'), +('2', '57', '11', '9246', '6898', '0'), +('2', '57', '11', '14762', '2204', '0'), +('2', '57', '11', '16941', '1377', '0'), +('2', '57', '11', '60396', '719', '0'), +('2', '58', '22', '9246', '0', '0'), +('2', '58', '22', '10323', '0', '0'), +('2', '58', '22', '44492', '0', '0'), +('2', '58', '22', '13101', '0', '0'), +('2', '58', '1', '14563', '6609', '0'), +('2', '58', '1', '10082', '4300', '0'), +('2', '58', '1', '14702', '3750', '0'), +('2', '58', '1', '14701', '2862', '0'), +('2', '58', '2', '10143', '5368', '0'), +('2', '58', '2', '2191', '4275', '0'), +('2', '58', '2', '4881', '3996', '0'), +('2', '58', '2', '30363', '3700', '0'), +('2', '58', '3', '11052', '10510', '0'), +('2', '58', '3', '14108', '5079', '0'), +('2', '58', '3', '4505', '4935', '0'), +('2', '58', '3', '14695', '4913', '0'), +('2', '58', '5', '1536', '7097', '0'), +('2', '58', '5', '14562', '6735', '0'), +('2', '58', '5', '4413', '6354', '0'), +('2', '58', '5', '14703', '6050', '0'), +('2', '58', '8', '11603', '14616', '0'), +('2', '58', '8', '12238', '7829', '0'), +('2', '58', '8', '2349', '3554', '0'), +('2', '58', '8', '2913', '2995', '0'), +('2', '58', '6', '27717', '12114', '0'), +('2', '58', '6', '2924', '9329', '0'), +('2', '58', '6', '1904', '5635', '0'), +('2', '58', '6', '1557', '5310', '0'), +('2', '58', '17', '4882', '13691', '0'), +('2', '58', '17', '2285', '12169', '0'), +('2', '58', '17', '4342', '7133', '0'), +('2', '58', '17', '2405', '3616', '0'), +('2', '58', '7', '2289', '4133', '0'), +('2', '58', '7', '1362', '2624', '0'), +('2', '58', '7', '10336', '2106', '0'), +('2', '58', '7', '1321', '1746', '0'), +('2', '58', '9', '2290', '4060', '0'), +('2', '58', '9', '4925', '3558', '0'), +('2', '58', '9', '4406', '3531', '0'), +('2', '58', '9', '10105', '3527', '0'), +('2', '58', '15', '14631', '4204', '0'), +('2', '58', '15', '10150', '3004', '0'), +('2', '58', '15', '14694', '2805', '0'), +('2', '58', '15', '10163', '2300', '0'), +('2', '58', '20', '11666', '8409', '0'), +('2', '58', '20', '2742', '5242', '0'), +('2', '58', '20', '2288', '4478', '0'), +('2', '58', '20', '2500', '3651', '0'), +('2', '58', '12', '20655', '4038', '0'), +('2', '58', '12', '4345', '3876', '0'), +('2', '58', '12', '2291', '3830', '0'), +('2', '58', '12', '2923', '3074', '0'), +('2', '58', '18', '4886', '6615', '0'), +('2', '58', '18', '2292', '3644', '0'), +('2', '58', '18', '2461', '2995', '0'), +('2', '58', '18', '4410', '1142', '0'), +('2', '58', '19', '4407', '6366', '0'), +('2', '58', '19', '4837', '4527', '0'), +('2', '58', '19', '68239', '4025', '0'), +('2', '58', '19', '2293', '3337', '0'), +('2', '58', '13', '11691', '18173', '0'), +('2', '58', '13', '27718', '12509', '0'), +('2', '58', '13', '27719', '9177', '0'), +('2', '58', '13', '9246', '7018', '0'), +('2', '58', '14', '27716', '13059', '0'), +('2', '58', '14', '10335', '12601', '0'), +('2', '58', '14', '13991', '8006', '0'), +('2', '58', '14', '12238', '7974', '0'), +('2', '58', '11', '9246', '7018', '0'), +('2', '58', '11', '14762', '2204', '0'), +('2', '58', '11', '16941', '1401', '0'), +('2', '58', '11', '60396', '731', '0'), +('2', '59', '22', '9246', '0', '0'), +('2', '59', '22', '10323', '0', '0'), +('2', '59', '22', '44492', '0', '0'), +('2', '59', '22', '13101', '0', '0'), +('2', '59', '1', '14563', '6718', '0'), +('2', '59', '1', '10082', '4373', '0'), +('2', '59', '1', '14702', '3750', '0'), +('2', '59', '1', '14701', '2862', '0'), +('2', '59', '2', '10143', '5368', '0'), +('2', '59', '2', '2191', '4348', '0'), +('2', '59', '2', '4881', '4056', '0'), +('2', '59', '2', '30363', '3700', '0'), +('2', '59', '3', '11052', '10691', '0'), +('2', '59', '3', '14108', '5163', '0'), +('2', '59', '3', '4505', '5019', '0'), +('2', '59', '3', '14695', '4997', '0'), +('2', '59', '5', '1536', '7206', '0'), +('2', '59', '5', '14562', '6819', '0'), +('2', '59', '5', '4413', '6463', '0'), +('2', '59', '5', '14703', '6050', '0'), +('2', '59', '8', '11603', '14725', '0'), +('2', '59', '8', '12238', '7950', '0'), +('2', '59', '8', '2349', '3554', '0'), +('2', '59', '8', '2913', '3043', '0'), +('2', '59', '6', '27717', '12262', '0'), +('2', '59', '6', '2924', '9389', '0'), +('2', '59', '6', '1904', '5732', '0'), +('2', '59', '6', '1557', '5310', '0'), +('2', '59', '17', '4882', '13877', '0'), +('2', '59', '17', '2285', '12217', '0'), +('2', '59', '17', '4342', '7254', '0'), +('2', '59', '17', '2405', '3677', '0'), +('2', '59', '7', '2289', '4181', '0'), +('2', '59', '7', '1362', '2624', '0'), +('2', '59', '7', '10336', '2142', '0'), +('2', '59', '7', '1321', '1746', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '59', '9', '2290', '4121', '0'), +('2', '59', '9', '4925', '3618', '0'), +('2', '59', '9', '4406', '3591', '0'), +('2', '59', '9', '10105', '3588', '0'), +('2', '59', '15', '14631', '4276', '0'), +('2', '59', '15', '10150', '3004', '0'), +('2', '59', '15', '14694', '2853', '0'), +('2', '59', '15', '10163', '2300', '0'), +('2', '59', '20', '11666', '8412', '0'), +('2', '59', '20', '2742', '5245', '0'), +('2', '59', '20', '2288', '4478', '0'), +('2', '59', '20', '2500', '3713', '0'), +('2', '59', '12', '20655', '4063', '0'), +('2', '59', '12', '4345', '3936', '0'), +('2', '59', '12', '2291', '3830', '0'), +('2', '59', '12', '2923', '3074', '0'), +('2', '59', '18', '4886', '6724', '0'), +('2', '59', '18', '2292', '3692', '0'), +('2', '59', '18', '2461', '3043', '0'), +('2', '59', '18', '4410', '1142', '0'), +('2', '59', '19', '4407', '6475', '0'), +('2', '59', '19', '4837', '4587', '0'), +('2', '59', '19', '68239', '4062', '0'), +('2', '59', '19', '2293', '3373', '0'), +('2', '59', '13', '11691', '18354', '0'), +('2', '59', '13', '27718', '12630', '0'), +('2', '59', '13', '27719', '9269', '0'), +('2', '59', '13', '9246', '7139', '0'), +('2', '59', '14', '27716', '13167', '0'), +('2', '59', '14', '10335', '12818', '0'), +('2', '59', '14', '13991', '8127', '0'), +('2', '59', '14', '12238', '8095', '0'), +('2', '59', '11', '9246', '7139', '0'), +('2', '59', '11', '14762', '2204', '0'), +('2', '59', '11', '16941', '1425', '0'), +('2', '59', '11', '60396', '743', '0'), +('2', '60', '22', '66397', '0', '3'), +('2', '60', '22', '61948', '0', '3'), +('2', '60', '22', '21805', '0', '3'), +('2', '60', '22', '21807', '0', '3'), +('2', '60', '1', '63170', '22602', '3'), +('2', '60', '1', '30552', '19371', '3'), +('2', '60', '1', '28944', '13921', '3'), +('2', '60', '1', '29861', '12811', '3'), +('2', '60', '2', '26763', '32337', '3'), +('2', '60', '2', '26762', '13234', '3'), +('2', '60', '2', '28909', '12324', '3'), +('2', '60', '2', '1549', '12236', '3'), +('2', '60', '3', '26785', '36509', '3'), +('2', '60', '3', '26756', '34407', '3'), +('2', '60', '3', '28963', '29175', '3'), +('2', '60', '3', '31323', '26102', '3'), +('2', '60', '5', '28900', '39743', '3'), +('2', '60', '5', '51229', '24651', '3'), +('2', '60', '5', '28911', '23597', '3'), +('2', '60', '5', '31234', '18254', '3'), +('2', '60', '8', '51240', '36835', '3'), +('2', '60', '8', '1628', '31698', '3'), +('2', '60', '8', '30505', '20998', '3'), +('2', '60', '8', '28992', '16236', '3'), +('2', '60', '6', '1200', '31949', '3'), +('2', '60', '6', '28920', '14492', '3'), +('2', '60', '6', '30566', '14152', '3'), +('2', '60', '6', '28991', '13153', '3'), +('2', '60', '17', '26782', '17414', '3'), +('2', '60', '17', '7869', '17154', '3'), +('2', '60', '17', '31239', '13714', '3'), +('2', '60', '17', '10845', '13342', '3'), +('2', '60', '7', '28925', '15288', '3'), +('2', '60', '7', '7868', '14101', '3'), +('2', '60', '7', '28146', '13488', '3'), +('2', '60', '7', '26584', '13377', '3'), +('2', '60', '9', '26787', '26127', '3'), +('2', '60', '9', '30552', '19371', '3'), +('2', '60', '9', '28891', '18002', '3'), +('2', '60', '9', '7868', '14101', '3'), +('2', '60', '15', '51242', '28174', '3'), +('2', '60', '15', '63170', '22602', '3'), +('2', '60', '15', '23511', '17201', '3'), +('2', '60', '15', '28994', '15375', '3'), +('2', '60', '20', '28916', '16298', '3'), +('2', '60', '20', '26761', '15315', '3'), +('2', '60', '20', '30534', '13699', '3'), +('2', '60', '20', '26549', '13050', '3'), +('2', '60', '12', '30534', '13699', '3'), +('2', '60', '12', '28991', '13153', '3'), +('2', '60', '12', '31227', '12689', '3'), +('2', '60', '12', '28967', '12003', '3'), +('2', '60', '18', '26783', '42031', '3'), +('2', '60', '18', '26755', '16003', '3'), +('2', '60', '18', '28932', '12328', '3'), +('2', '60', '18', '8289', '12323', '3'), +('2', '60', '19', '30570', '15600', '3'), +('2', '60', '19', '29645', '13506', '3'), +('2', '60', '19', '31245', '12674', '3'), +('2', '60', '19', '7871', '12212', '3'), +('2', '60', '13', '14762', '22200', '3'), +('2', '60', '13', '26784', '16673', '3'), +('2', '60', '13', '28981', '15450', '3'), +('2', '60', '13', '26588', '14010', '3'), +('2', '60', '14', '28915', '33445', '3'), +('2', '60', '14', '14762', '22200', '3'), +('2', '60', '14', '61223', '19626', '3'), +('2', '60', '14', '26784', '16673', '3'), +('2', '60', '11', '2698', '25502', '3'), +('2', '60', '11', '14762', '22200', '3'), +('2', '60', '11', '31321', '18556', '3'), +('2', '60', '11', '26784', '16673', '3'), +('2', '60', '22', '10323', '0', '2'), +('2', '60', '22', '9248', '0', '2'), +('2', '60', '22', '12425', '0', '2'), +('2', '60', '22', '9254', '0', '2'), +('2', '60', '1', '2581', '14038', '2'), +('2', '60', '1', '2065', '9440', '2'), +('2', '60', '1', '10912', '7764', '2'), +('2', '60', '1', '62234', '6604', '2'), +('2', '60', '2', '1549', '14074', '2'), +('2', '60', '2', '10913', '12388', '2'), +('2', '60', '2', '31226', '10265', '2'), +('2', '60', '2', '31322', '9785', '2'), +('2', '60', '3', '31233', '13578', '2'), +('2', '60', '3', '1547', '11987', '2'), +('2', '60', '3', '31244', '11452', '2'), +('2', '60', '3', '31463', '10636', '2'), +('2', '60', '5', '31460', '12289', '2'), +('2', '60', '5', '30390', '10626', '2'), +('2', '60', '5', '31318', '10438', '2'), +('2', '60', '5', '29459', '9688', '2'), +('2', '60', '8', '1628', '13166', '2'), +('2', '60', '8', '31376', '12991', '2'), +('2', '60', '8', '11603', '9438', '2'), +('2', '60', '8', '5779', '9161', '2'), +('2', '60', '6', '27151', '7166', '2'), +('2', '60', '6', '2924', '6418', '2'), +('2', '60', '6', '29472', '6370', '2'), +('2', '60', '6', '27140', '6065', '2'), +('2', '60', '17', '31239', '16825', '2'), +('2', '60', '17', '10845', '15736', '2'), +('2', '60', '17', '6881', '12806', '2'), +('2', '60', '17', '25392', '12078', '2'), +('2', '60', '7', '31229', '11762', '2'), +('2', '60', '7', '29485', '7513', '2'), +('2', '60', '7', '31381', '5879', '2'), +('2', '60', '7', '62361', '5506', '2'), +('2', '60', '9', '31460', '12289', '2'), +('2', '60', '9', '31246', '8319', '2'), +('2', '60', '9', '31314', '4477', '2'), +('2', '60', '9', '30298', '4410', '2'), +('2', '60', '15', '25211', '12700', '2'), +('2', '60', '15', '31231', '12533', '2'), +('2', '60', '15', '62373', '7600', '2'), +('2', '60', '15', '62356', '6527', '2'), +('2', '60', '20', '25199', '13823', '2'), +('2', '60', '20', '25858', '13737', '2'), +('2', '60', '20', '2510', '12424', '2'), +('2', '60', '20', '1556', '12317', '2'), +('2', '60', '12', '31227', '14562', '2'), +('2', '60', '12', '25857', '10812', '2'), +('2', '60', '12', '31306', '8988', '2'), +('2', '60', '12', '11668', '8426', '2'), +('2', '60', '18', '31145', '9428', '2'), +('2', '60', '18', '31374', '8659', '2'), +('2', '60', '18', '25396', '7547', '2'), +('2', '60', '18', '62164', '7159', '2'), +('2', '60', '19', '29645', '15540', '2'), +('2', '60', '19', '31245', '14399', '2'), +('2', '60', '19', '31355', '9550', '2'), +('2', '60', '19', '31327', '8716', '2'), +('2', '60', '13', '31348', '15954', '2'), +('2', '60', '13', '5532', '14805', '2'), +('2', '60', '13', '31373', '13238', '2'), +('2', '60', '13', '29449', '10978', '2'), +('2', '60', '14', '31230', '15510', '2'), +('2', '60', '14', '31462', '11535', '2'), +('2', '60', '14', '31215', '11393', '2'), +('2', '60', '14', '29449', '10978', '2'), +('2', '60', '11', '31465', '14332', '2'), +('2', '60', '11', '1554', '13904', '2'), +('2', '60', '11', '2698', '10516', '2'), +('2', '60', '11', '31302', '10130', '2'), +('2', '60', '22', '10323', '0', '1'), +('2', '60', '22', '9246', '0', '1'), +('2', '60', '22', '12425', '0', '1'), +('2', '60', '22', '44492', '0', '1'), +('2', '60', '1', '10912', '12224', '1'), +('2', '60', '1', '62234', '8430', '1'), +('2', '60', '1', '5815', '4285', '1'), +('2', '60', '1', '5814', '4285', '1'), +('2', '60', '2', '10913', '18377', '1'), +('2', '60', '2', '50036', '5575', '1'), +('2', '60', '2', '10143', '5361', '1'), +('2', '60', '2', '62138', '3821', '1'), +('2', '60', '3', '5780', '7309', '1'), +('2', '60', '3', '11052', '6417', '1'), +('2', '60', '3', '46184', '5262', '1'), +('2', '60', '3', '1625', '4481', '1'), +('2', '60', '5', '14703', '6050', '1'), +('2', '60', '5', '14562', '4812', '1'), +('2', '60', '5', '1536', '4624', '1'), +('2', '60', '5', '8285', '4483', '1'), +('2', '60', '8', '1628', '16834', '1'), +('2', '60', '8', '11603', '12136', '1'), +('2', '60', '8', '1622', '10045', '1'), +('2', '60', '8', '5779', '9186', '1'), +('2', '60', '6', '27717', '8758', '1'), +('2', '60', '6', '2924', '7934', '1'), +('2', '60', '6', '1557', '5286', '1'), +('2', '60', '6', '4315', '4025', '1'), +('2', '60', '17', '10845', '21720', '1'), +('2', '60', '17', '4565', '13285', '1'), +('2', '60', '17', '2285', '11050', '1'), +('2', '60', '17', '4882', '9427', '1'), +('2', '60', '7', '62046', '4107', '1'), +('2', '60', '7', '2289', '3029', '1'), +('2', '60', '7', '1362', '2614', '1'), +('2', '60', '7', '5718', '1863', '1'), +('2', '60', '9', '1618', '4950', '1'), +('2', '60', '9', '2290', '2673', '1'), +('2', '60', '9', '4925', '2171', '1'), +('2', '60', '9', '4406', '2155', '1'), +('2', '60', '15', '5727', '6777', '1'), +('2', '60', '15', '5728', '5585', '1'), +('2', '60', '15', '5807', '5271', '1'), +('2', '60', '15', '10346', '4489', '1'), +('2', '60', '20', '1556', '15307', '1'), +('2', '60', '20', '11666', '8347', '1'), +('2', '60', '20', '5765', '8016', '1'), +('2', '60', '20', '5753', '6529', '1'), +('2', '60', '12', '11668', '14502', '1'), +('2', '60', '12', '2291', '3818', '1'), +('2', '60', '12', '20655', '3437', '1'), +('2', '60', '12', '2923', '3064', '1'), +('2', '60', '18', '62164', '9017', '1'), +('2', '60', '18', '4569', '6906', '1'), +('2', '60', '18', '4886', '4119', '1'), +('2', '60', '18', '2292', '2535', '1'), +('2', '60', '19', '5749', '4659', '1'), +('2', '60', '19', '4407', '3898', '1'), +('2', '60', '19', '68239', '3181', '1'), +('2', '60', '19', '4837', '3112', '1'), +('2', '60', '13', '5532', '22305', '1'), +('2', '60', '13', '11691', '14013', '1'), +('2', '60', '13', '24629', '13134', '1'), +('2', '60', '13', '24609', '11679', '1'), +('2', '60', '14', '24629', '13134', '1'), +('2', '60', '14', '24609', '11679', '1'), +('2', '60', '14', '27716', '10418', '1'), +('2', '60', '14', '14745', '8222', '1'), +('2', '60', '11', '46178', '7361', '1'), +('2', '60', '11', '5805', '5300', '1'), +('2', '60', '11', '5763', '5118', '1'), +('2', '60', '11', '79631', '4427', '1'), +('2', '61', '22', '66397', '0', '3'), +('2', '61', '22', '61948', '0', '3'), +('2', '61', '22', '21805', '0', '3'), +('2', '61', '22', '21807', '0', '3'), +('2', '61', '1', '63170', '22103', '3'), +('2', '61', '1', '30552', '19073', '3'), +('2', '61', '1', '28944', '13923', '3'), +('2', '61', '1', '29861', '12816', '3'), +('2', '61', '2', '26763', '31590', '3'), +('2', '61', '2', '26762', '13236', '3'), +('2', '61', '2', '28909', '12326', '3'), +('2', '61', '2', '1549', '12239', '3'), +('2', '61', '3', '26785', '35614', '3'), +('2', '61', '3', '26756', '33507', '3'), +('2', '61', '3', '28963', '28427', '3'), +('2', '61', '3', '31323', '25102', '3'), +('2', '61', '5', '28900', '38747', '3'), +('2', '61', '5', '51229', '24153', '3'), +('2', '61', '5', '28911', '23099', '3'), +('2', '61', '5', '31234', '17504', '3'), +('2', '61', '8', '51240', '35835', '3'), +('2', '61', '8', '1628', '30701', '3'), +('2', '61', '8', '30505', '20249', '3'), +('2', '61', '8', '28992', '16239', '3'), +('2', '61', '6', '1200', '30951', '3'), +('2', '61', '6', '28920', '14496', '3'), +('2', '61', '6', '30566', '14153', '3'), +('2', '61', '6', '28991', '13158', '3'), +('2', '61', '17', '26782', '17419', '3'), +('2', '61', '17', '7869', '17158', '3'), +('2', '61', '17', '31239', '13719', '3'), +('2', '61', '17', '10845', '13346', '3'), +('2', '61', '7', '28925', '15291', '3'), +('2', '61', '7', '7868', '14103', '3'), +('2', '61', '7', '28146', '13491', '3'), +('2', '61', '7', '26584', '13379', '3'), +('2', '61', '9', '26787', '25729', '3'), +('2', '61', '9', '30552', '19073', '3'), +('2', '61', '9', '28891', '17702', '3'), +('2', '61', '9', '7868', '14103', '3'), +('2', '61', '15', '51242', '27426', '3'), +('2', '61', '15', '63170', '22103', '3'), +('2', '61', '15', '23511', '16451', '3'), +('2', '61', '15', '28994', '15377', '3'), +('2', '61', '20', '28916', '16300', '3'), +('2', '61', '20', '26761', '15316', '3'), +('2', '61', '20', '30534', '13701', '3'), +('2', '61', '20', '26549', '13054', '3'), +('2', '61', '12', '30534', '13701', '3'), +('2', '61', '12', '28991', '13158', '3'), +('2', '61', '12', '31227', '12692', '3'), +('2', '61', '12', '28967', '12003', '3'), +('2', '61', '18', '26783', '40883', '3'), +('2', '61', '18', '26755', '15703', '3'), +('2', '61', '18', '28932', '12330', '3'), +('2', '61', '18', '8289', '12325', '3'), +('2', '61', '19', '30570', '15602', '3'), +('2', '61', '19', '29645', '13509', '3'), +('2', '61', '19', '31245', '12677', '3'), +('2', '61', '19', '7871', '12212', '3'), +('2', '61', '13', '14762', '21200', '3'), +('2', '61', '13', '26784', '16679', '3'), +('2', '61', '13', '28981', '15452', '3'), +('2', '61', '13', '26588', '14010', '3'), +('2', '61', '14', '28915', '32698', '3'), +('2', '61', '14', '14762', '21200', '3'), +('2', '61', '14', '61223', '18878', '3'), +('2', '61', '14', '26784', '16679', '3'), +('2', '61', '11', '2698', '24752', '3'), +('2', '61', '11', '14762', '21200', '3'), +('2', '61', '11', '31321', '17806', '3'), +('2', '61', '11', '26784', '16679', '3'), +('2', '62', '22', '66397', '0', '3'), +('2', '62', '22', '61948', '0', '3'), +('2', '62', '22', '21805', '0', '3'), +('2', '62', '22', '21807', '0', '3'), +('2', '62', '1', '63170', '21605', '3'), +('2', '62', '1', '30552', '18775', '3'), +('2', '62', '1', '28944', '13925', '3'), +('2', '62', '1', '29861', '12821', '3'), +('2', '62', '2', '26763', '30843', '3'), +('2', '62', '2', '26762', '13238', '3'), +('2', '62', '2', '28909', '12328', '3'), +('2', '62', '2', '1549', '12242', '3'), +('2', '62', '3', '26785', '34719', '3'), +('2', '62', '3', '26756', '32607', '3'), +('2', '62', '3', '28963', '27679', '3'), +('2', '62', '3', '31323', '24102', '3'), +('2', '62', '5', '28900', '37751', '3'), +('2', '62', '5', '51229', '23654', '3'), +('2', '62', '5', '28911', '22601', '3'), +('2', '62', '5', '8364', '17345', '3'), +('2', '62', '8', '51240', '34835', '3'), +('2', '62', '8', '1628', '29703', '3'), +('2', '62', '8', '30505', '19501', '3'), +('2', '62', '8', '28992', '16242', '3'), +('2', '62', '6', '1200', '29952', '3'), +('2', '62', '6', '28920', '14500', '3'), +('2', '62', '6', '30566', '14155', '3'), +('2', '62', '6', '28991', '13163', '3'), +('2', '62', '17', '26782', '17425', '3'), +('2', '62', '17', '7869', '17162', '3'), +('2', '62', '17', '31239', '13724', '3'), +('2', '62', '17', '10845', '13350', '3'), +('2', '62', '7', '28925', '15294', '3'), +('2', '62', '7', '7868', '14104', '3'), +('2', '62', '7', '28146', '13494', '3'), +('2', '62', '7', '26584', '13381', '3'), +('2', '62', '9', '26787', '25331', '3'), +('2', '62', '9', '30552', '18775', '3'), +('2', '62', '9', '28891', '17402', '3'), +('2', '62', '9', '7868', '14104', '3'), +('2', '62', '15', '51242', '26677', '3'), +('2', '62', '15', '63170', '21605', '3'), +('2', '62', '15', '23511', '15701', '3'), +('2', '62', '15', '28994', '15379', '3'), +('2', '62', '20', '28916', '16301', '3'), +('2', '62', '20', '26761', '15317', '3'), +('2', '62', '20', '30534', '13703', '3'), +('2', '62', '20', '26549', '13058', '3'), +('2', '62', '12', '30534', '13703', '3'), +('2', '62', '12', '28991', '13163', '3'), +('2', '62', '12', '31227', '12695', '3'), +('2', '62', '12', '28967', '12003', '3'), +('2', '62', '18', '26783', '39735', '3'), +('2', '62', '18', '26755', '15403', '3'), +('2', '62', '18', '28932', '12332', '3'), +('2', '62', '18', '8289', '12327', '3'), +('2', '62', '19', '30570', '15603', '3'), +('2', '62', '19', '29645', '13512', '3'), +('2', '62', '19', '31245', '12680', '3'), +('2', '62', '19', '7871', '12212', '3'), +('2', '62', '13', '14762', '20200', '3'), +('2', '62', '13', '26784', '16685', '3'), +('2', '62', '13', '28981', '15455', '3'), +('2', '62', '13', '26588', '14010', '3'), +('2', '62', '14', '28915', '31951', '3'), +('2', '62', '14', '14762', '20200', '3'), +('2', '62', '14', '61223', '18130', '3'), +('2', '62', '14', '26784', '16685', '3'), +('2', '62', '11', '2698', '24002', '3'), +('2', '62', '11', '14762', '20200', '3'), +('2', '62', '11', '31321', '17056', '3'), +('2', '62', '11', '26784', '16685', '3'), +('2', '63', '22', '66397', '0', '3'), +('2', '63', '22', '61948', '0', '3'), +('2', '63', '22', '21805', '0', '3'), +('2', '63', '22', '21807', '0', '3'), +('2', '63', '1', '63170', '21107', '3'), +('2', '63', '1', '30552', '18477', '3'), +('2', '63', '1', '28944', '13927', '3'), +('2', '63', '1', '29861', '12826', '3'), +('2', '63', '2', '26763', '30096', '3'), +('2', '63', '2', '26762', '13240', '3'), +('2', '63', '2', '28909', '12330', '3'), +('2', '63', '2', '1549', '12245', '3'), +('2', '63', '3', '26785', '33824', '3'), +('2', '63', '3', '26756', '31707', '3'), +('2', '63', '3', '28963', '26931', '3'), +('2', '63', '3', '31323', '23102', '3'), +('2', '63', '5', '28900', '36755', '3'), +('2', '63', '5', '51229', '23156', '3'), +('2', '63', '5', '28911', '22103', '3'), +('2', '63', '5', '8364', '17348', '3'), +('2', '63', '8', '51240', '33835', '3'), +('2', '63', '8', '1628', '28706', '3'), +('2', '63', '8', '30505', '18752', '3'), +('2', '63', '8', '28992', '16245', '3'), +('2', '63', '6', '1200', '28954', '3'), +('2', '63', '6', '28920', '14504', '3'), +('2', '63', '6', '30566', '14157', '3'), +('2', '63', '6', '28991', '13168', '3'), +('2', '63', '17', '26782', '17430', '3'), +('2', '63', '17', '7869', '17166', '3'), +('2', '63', '17', '31239', '13730', '3'), +('2', '63', '17', '10845', '13354', '3'), +('2', '63', '7', '28925', '15297', '3'), +('2', '63', '7', '7868', '14106', '3'), +('2', '63', '7', '28146', '13498', '3'), +('2', '63', '7', '26584', '13383', '3'), +('2', '63', '9', '26787', '24933', '3'), +('2', '63', '9', '30552', '18477', '3'), +('2', '63', '9', '28891', '17102', '3'), +('2', '63', '9', '7868', '14106', '3'), +('2', '63', '15', '51242', '25928', '3'), +('2', '63', '15', '63170', '21107', '3'), +('2', '63', '15', '28994', '15381', '3'), +('2', '63', '15', '23511', '14951', '3'), +('2', '63', '20', '28916', '16303', '3'), +('2', '63', '20', '26761', '15318', '3'), +('2', '63', '20', '30534', '13706', '3'), +('2', '63', '20', '26549', '13062', '3'), +('2', '63', '12', '30534', '13706', '3'), +('2', '63', '12', '28991', '13168', '3'), +('2', '63', '12', '31227', '12698', '3'), +('2', '63', '12', '28967', '12003', '3'), +('2', '63', '18', '26783', '38587', '3'), +('2', '63', '18', '26755', '15103', '3'), +('2', '63', '18', '28932', '12334', '3'), +('2', '63', '18', '8289', '12329', '3'), +('2', '63', '19', '30570', '15605', '3'), +('2', '63', '19', '29645', '13516', '3'), +('2', '63', '19', '31245', '12683', '3'), +('2', '63', '19', '7871', '12212', '3'), +('2', '63', '13', '14762', '19200', '3'), +('2', '63', '13', '26784', '16691', '3'), +('2', '63', '13', '28981', '15457', '3'), +('2', '63', '13', '26588', '14010', '3'), +('2', '63', '14', '28915', '31204', '3'), +('2', '63', '14', '14762', '19200', '3'), +('2', '63', '14', '61223', '17382', '3'), +('2', '63', '14', '26784', '16691', '3'), +('2', '63', '11', '2698', '23252', '3'), +('2', '63', '11', '14762', '19200', '3'), +('2', '63', '11', '26784', '16691', '3'), +('2', '63', '11', '31321', '16306', '3'), +('2', '64', '22', '66397', '0', '3'), +('2', '64', '22', '61948', '0', '3'), +('2', '64', '22', '21805', '0', '3'), +('2', '64', '22', '21807', '0', '3'), +('2', '64', '1', '63170', '20608', '3'), +('2', '64', '1', '30552', '18179', '3'), +('2', '64', '1', '28944', '13929', '3'), +('2', '64', '1', '29861', '12831', '3'), +('2', '64', '2', '26763', '29349', '3'), +('2', '64', '2', '26762', '13242', '3'), +('2', '64', '2', '28909', '12332', '3'), +('2', '64', '2', '1549', '12248', '3'), +('2', '64', '3', '26785', '32929', '3'), +('2', '64', '3', '26756', '30807', '3'), +('2', '64', '3', '28963', '26183', '3'), +('2', '64', '3', '31323', '22102', '3'), +('2', '64', '5', '28900', '35759', '3'), +('2', '64', '5', '51229', '22658', '3'), +('2', '64', '5', '28911', '21605', '3'), +('2', '64', '5', '8364', '17351', '3'), +('2', '64', '8', '51240', '32836', '3'), +('2', '64', '8', '1628', '27708', '3'), +('2', '64', '8', '30505', '18004', '3'), +('2', '64', '8', '28992', '16248', '3'), +('2', '64', '6', '1200', '27956', '3'), +('2', '64', '6', '28920', '14508', '3'), +('2', '64', '6', '30566', '14158', '3'), +('2', '64', '6', '28991', '13173', '3'), +('2', '64', '17', '26782', '17435', '3'), +('2', '64', '17', '7869', '17170', '3'), +('2', '64', '17', '31239', '13735', '3'), +('2', '64', '17', '10845', '13358', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '64', '7', '28925', '15300', '3'), +('2', '64', '7', '7868', '14108', '3'), +('2', '64', '7', '28146', '13501', '3'), +('2', '64', '7', '26584', '13385', '3'), +('2', '64', '9', '26787', '24535', '3'), +('2', '64', '9', '30552', '18179', '3'), +('2', '64', '9', '28891', '16802', '3'), +('2', '64', '9', '7868', '14108', '3'), +('2', '64', '15', '51242', '25179', '3'), +('2', '64', '15', '63170', '20608', '3'), +('2', '64', '15', '28994', '15383', '3'), +('2', '64', '15', '23511', '14201', '3'), +('2', '64', '20', '28916', '16304', '3'), +('2', '64', '20', '26761', '15319', '3'), +('2', '64', '20', '30534', '13708', '3'), +('2', '64', '20', '26549', '13066', '3'), +('2', '64', '12', '30534', '13708', '3'), +('2', '64', '12', '28991', '13173', '3'), +('2', '64', '12', '31227', '12702', '3'), +('2', '64', '12', '28967', '12003', '3'), +('2', '64', '18', '26783', '37439', '3'), +('2', '64', '18', '26755', '14803', '3'), +('2', '64', '18', '28932', '12337', '3'), +('2', '64', '18', '8289', '12331', '3'), +('2', '64', '19', '30570', '15607', '3'), +('2', '64', '19', '29645', '13519', '3'), +('2', '64', '19', '31245', '12686', '3'), +('2', '64', '19', '7871', '12213', '3'), +('2', '64', '13', '14762', '18200', '3'), +('2', '64', '13', '26784', '16697', '3'), +('2', '64', '13', '28981', '15460', '3'), +('2', '64', '13', '26588', '14010', '3'), +('2', '64', '14', '28915', '30457', '3'), +('2', '64', '14', '14762', '18200', '3'), +('2', '64', '14', '26784', '16697', '3'), +('2', '64', '14', '61223', '16634', '3'), +('2', '64', '11', '2698', '22502', '3'), +('2', '64', '11', '14762', '18200', '3'), +('2', '64', '11', '26784', '16697', '3'), +('2', '64', '11', '31321', '15556', '3'), +('2', '65', '22', '66397', '0', '7'), +('2', '65', '22', '61948', '0', '7'), +('2', '65', '22', '21805', '0', '7'), +('2', '65', '22', '21807', '0', '7'), +('2', '65', '1', '68949', '51136', '7'), +('2', '65', '1', '69166', '40345', '7'), +('2', '65', '1', '10242', '40267', '7'), +('2', '65', '1', '7130', '37984', '7'), +('2', '65', '2', '16158', '37368', '7'), +('2', '65', '2', '26763', '28603', '7'), +('2', '65', '2', '15929', '28461', '7'), +('2', '65', '2', '9496', '27858', '7'), +('2', '65', '3', '69068', '81635', '7'), +('2', '65', '3', '69132', '66029', '7'), +('2', '65', '3', '68651', '48779', '7'), +('2', '65', '3', '26984', '45535', '7'), +('2', '65', '5', '69097', '82184', '7'), +('2', '65', '5', '68950', '81868', '7'), +('2', '65', '5', '7769', '47163', '7'), +('2', '65', '5', '50414', '45506', '7'), +('2', '65', '8', '69064', '81033', '7'), +('2', '65', '8', '15823', '43090', '7'), +('2', '65', '8', '69164', '34535', '7'), +('2', '65', '8', '51240', '31836', '7'), +('2', '65', '6', '69066', '62405', '7'), +('2', '65', '6', '13647', '56834', '7'), +('2', '65', '6', '69073', '50429', '7'), +('2', '65', '6', '68841', '49968', '7'), +('2', '65', '17', '68962', '61942', '7'), +('2', '65', '17', '47646', '58257', '7'), +('2', '65', '17', '69150', '55243', '7'), +('2', '65', '17', '68748', '47577', '7'), +('2', '65', '7', '68856', '45775', '7'), +('2', '65', '7', '32012', '45370', '7'), +('2', '65', '7', '69079', '33458', '7'), +('2', '65', '7', '69168', '30774', '7'), +('2', '65', '9', '69126', '80964', '7'), +('2', '65', '9', '69100', '57133', '7'), +('2', '65', '9', '32100', '49890', '7'), +('2', '65', '9', '68603', '42774', '7'), +('2', '65', '15', '69160', '82711', '7'), +('2', '65', '15', '69070', '62018', '7'), +('2', '65', '15', '26993', '49789', '7'), +('2', '65', '15', '10234', '46753', '7'), +('2', '65', '20', '68951', '49036', '7'), +('2', '65', '20', '68821', '39247', '7'), +('2', '65', '20', '69386', '38954', '7'), +('2', '65', '20', '15871', '38738', '7'), +('2', '65', '12', '13563', '41643', '7'), +('2', '65', '12', '69083', '35432', '7'), +('2', '65', '12', '69252', '32447', '7'), +('2', '65', '12', '68189', '27500', '7'), +('2', '65', '18', '69146', '39800', '7'), +('2', '65', '18', '26783', '36292', '7'), +('2', '65', '18', '68963', '32076', '7'), +('2', '65', '18', '68189', '27500', '7'), +('2', '65', '19', '20074', '33020', '7'), +('2', '65', '19', '69177', '31989', '7'), +('2', '65', '19', '69075', '28327', '7'), +('2', '65', '19', '68189', '27500', '7'), +('2', '65', '13', '69098', '62850', '7'), +('2', '65', '13', '71241', '39703', '7'), +('2', '65', '13', '69159', '33353', '7'), +('2', '65', '13', '68444', '32249', '7'), +('2', '65', '14', '69155', '82831', '7'), +('2', '65', '14', '69098', '62850', '7'), +('2', '65', '14', '27280', '57050', '7'), +('2', '65', '14', '71241', '39703', '7'), +('2', '65', '11', '67606', '32121', '7'), +('2', '65', '11', '68116', '31533', '7'), +('2', '65', '11', '68952', '29970', '7'), +('2', '65', '11', '68848', '28703', '7'), +('2', '65', '22', '66397', '0', '6'), +('2', '65', '22', '61948', '0', '6'), +('2', '65', '22', '21805', '0', '6'), +('2', '65', '22', '21807', '0', '6'), +('2', '65', '1', '10242', '40267', '6'), +('2', '65', '1', '7130', '37984', '6'), +('2', '65', '1', '16257', '35537', '6'), +('2', '65', '1', '4139', '30782', '6'), +('2', '65', '2', '16158', '37368', '6'), +('2', '65', '2', '26763', '28603', '6'), +('2', '65', '2', '15929', '28461', '6'), +('2', '65', '2', '9496', '27858', '6'), +('2', '65', '3', '26984', '45535', '6'), +('2', '65', '3', '26985', '40233', '6'), +('2', '65', '3', '26982', '32946', '6'), +('2', '65', '3', '26785', '32034', '6'), +('2', '65', '5', '7769', '47163', '6'), +('2', '65', '5', '9289', '44395', '6'), +('2', '65', '5', '16158', '37368', '6'), +('2', '65', '5', '28900', '34763', '6'), +('2', '65', '8', '15823', '43090', '6'), +('2', '65', '8', '51240', '31836', '6'), +('2', '65', '8', '15804', '30652', '6'), +('2', '65', '8', '68189', '27500', '6'), +('2', '65', '6', '13647', '56834', '6'), +('2', '65', '6', '28660', '40967', '6'), +('2', '65', '6', '13644', '30011', '6'), +('2', '65', '6', '68189', '27500', '6'), +('2', '65', '17', '47646', '58257', '6'), +('2', '65', '17', '15002', '35141', '6'), +('2', '65', '17', '68189', '27500', '6'), +('2', '65', '17', '69403', '27406', '6'), +('2', '65', '7', '32012', '45370', '6'), +('2', '65', '7', '68189', '27500', '6'), +('2', '65', '7', '68052', '26400', '6'), +('2', '65', '7', '11499', '25433', '6'), +('2', '65', '9', '32100', '49890', '6'), +('2', '65', '9', '68189', '27500', '6'), +('2', '65', '9', '68052', '26400', '6'), +('2', '65', '9', '28668', '26001', '6'), +('2', '65', '15', '26993', '49789', '6'), +('2', '65', '15', '10234', '46753', '6'), +('2', '65', '15', '69382', '43903', '6'), +('2', '65', '15', '32109', '28384', '6'), +('2', '65', '20', '15871', '38738', '6'), +('2', '65', '20', '16158', '37368', '6'), +('2', '65', '20', '15929', '28461', '6'), +('2', '65', '20', '68189', '27500', '6'), +('2', '65', '12', '13563', '41643', '6'), +('2', '65', '12', '68189', '27500', '6'), +('2', '65', '12', '68052', '26400', '6'), +('2', '65', '12', '13557', '21995', '6'), +('2', '65', '18', '26783', '36292', '6'), +('2', '65', '18', '68189', '27500', '6'), +('2', '65', '18', '68052', '26400', '6'), +('2', '65', '18', '28650', '22150', '6'), +('2', '65', '19', '20074', '33020', '6'), +('2', '65', '19', '68189', '27500', '6'), +('2', '65', '19', '68052', '26400', '6'), +('2', '65', '19', '25995', '22416', '6'), +('2', '65', '13', '71241', '39703', '6'), +('2', '65', '13', '29033', '27755', '6'), +('2', '65', '13', '68052', '26400', '6'), +('2', '65', '13', '46192', '23517', '6'), +('2', '65', '14', '27280', '57050', '6'), +('2', '65', '14', '71241', '39703', '6'), +('2', '65', '14', '28915', '29710', '6'), +('2', '65', '14', '29033', '27755', '6'), +('2', '65', '11', '68116', '31533', '6'), +('2', '65', '11', '54039', '28069', '6'), +('2', '65', '11', '29033', '27755', '6'), +('2', '65', '11', '68189', '27500', '6'), +('2', '65', '22', '66397', '0', '5'), +('2', '65', '22', '61948', '0', '5'), +('2', '65', '22', '21805', '0', '5'), +('2', '65', '22', '21807', '0', '5'), +('2', '65', '1', '10242', '40267', '5'), +('2', '65', '1', '7130', '37984', '5'), +('2', '65', '1', '16257', '35537', '5'), +('2', '65', '1', '4139', '30782', '5'), +('2', '65', '2', '16158', '37368', '5'), +('2', '65', '2', '26763', '28603', '5'), +('2', '65', '2', '15929', '28461', '5'), +('2', '65', '2', '9496', '27858', '5'), +('2', '65', '3', '26984', '45535', '5'), +('2', '65', '3', '26985', '40233', '5'), +('2', '65', '3', '26982', '32946', '5'), +('2', '65', '3', '26785', '32034', '5'), +('2', '65', '5', '7769', '47163', '5'), +('2', '65', '5', '9289', '44395', '5'), +('2', '65', '5', '16158', '37368', '5'), +('2', '65', '5', '28900', '34763', '5'), +('2', '65', '8', '15823', '43090', '5'), +('2', '65', '8', '51240', '31836', '5'), +('2', '65', '8', '15804', '30652', '5'), +('2', '65', '8', '1628', '26710', '5'), +('2', '65', '6', '13647', '56834', '5'), +('2', '65', '6', '28660', '40967', '5'), +('2', '65', '6', '13644', '30011', '5'), +('2', '65', '6', '1200', '26957', '5'), +('2', '65', '17', '47646', '58257', '5'), +('2', '65', '17', '15002', '35141', '5'), +('2', '65', '17', '26782', '17440', '5'), +('2', '65', '17', '7869', '17174', '5'), +('2', '65', '7', '32012', '45370', '5'), +('2', '65', '7', '11499', '25433', '5'), +('2', '65', '7', '21995', '21070', '5'), +('2', '65', '7', '8781', '17417', '5'), +('2', '65', '9', '32100', '49890', '5'), +('2', '65', '9', '28668', '26001', '5'), +('2', '65', '9', '11103', '24587', '5'), +('2', '65', '9', '26787', '24137', '5'), +('2', '65', '15', '26993', '49789', '5'), +('2', '65', '15', '10234', '46753', '5'), +('2', '65', '15', '32109', '28384', '5'), +('2', '65', '15', '26989', '26571', '5'), +('2', '65', '20', '15871', '38738', '5'), +('2', '65', '20', '16158', '37368', '5'), +('2', '65', '20', '15929', '28461', '5'), +('2', '65', '20', '12510', '25385', '5'), +('2', '65', '12', '13563', '41643', '5'), +('2', '65', '12', '13557', '21995', '5'), +('2', '65', '12', '28246', '21968', '5'), +('2', '65', '12', '27000', '21813', '5'), +('2', '65', '18', '26783', '36292', '5'), +('2', '65', '18', '28650', '22150', '5'), +('2', '65', '18', '16797', '19010', '5'), +('2', '65', '18', '26755', '14503', '5'), +('2', '65', '19', '20074', '33020', '5'), +('2', '65', '19', '25995', '22416', '5'), +('2', '65', '19', '19094', '16213', '5'), +('2', '65', '19', '30570', '15608', '5'), +('2', '65', '13', '29033', '27755', '5'), +('2', '65', '13', '29037', '22665', '5'), +('2', '65', '13', '20627', '22522', '5'), +('2', '65', '13', '21886', '21548', '5'), +('2', '65', '14', '27280', '57050', '5'), +('2', '65', '14', '28915', '29710', '5'), +('2', '65', '14', '29033', '27755', '5'), +('2', '65', '14', '52059', '24545', '5'), +('2', '65', '11', '54039', '28069', '5'), +('2', '65', '11', '29033', '27755', '5'), +('2', '65', '11', '20496', '25871', '5'), +('2', '65', '11', '20604', '24905', '5'), +('2', '65', '22', '66397', '0', '4'), +('2', '65', '22', '61948', '0', '4'), +('2', '65', '22', '21805', '0', '4'), +('2', '65', '22', '21807', '0', '4'), +('2', '65', '1', '10242', '40267', '4'), +('2', '65', '1', '7130', '37984', '4'), +('2', '65', '1', '16257', '35537', '4'), +('2', '65', '1', '4139', '30782', '4'), +('2', '65', '2', '16158', '37368', '4'), +('2', '65', '2', '26763', '28603', '4'), +('2', '65', '2', '15929', '28461', '4'), +('2', '65', '2', '9496', '27858', '4'), +('2', '65', '3', '26984', '45535', '4'), +('2', '65', '3', '26985', '40233', '4'), +('2', '65', '3', '26982', '32946', '4'), +('2', '65', '3', '26785', '32034', '4'), +('2', '65', '5', '7769', '47163', '4'), +('2', '65', '5', '9289', '44395', '4'), +('2', '65', '5', '16158', '37368', '4'), +('2', '65', '5', '28900', '34763', '4'), +('2', '65', '8', '15823', '43090', '4'), +('2', '65', '8', '51240', '31836', '4'), +('2', '65', '8', '15804', '30652', '4'), +('2', '65', '8', '1628', '26710', '4'), +('2', '65', '6', '13647', '56834', '4'), +('2', '65', '6', '28660', '40967', '4'), +('2', '65', '6', '13644', '30011', '4'), +('2', '65', '6', '1200', '26957', '4'), +('2', '65', '17', '47646', '58257', '4'), +('2', '65', '17', '15002', '35141', '4'), +('2', '65', '17', '26782', '17440', '4'), +('2', '65', '17', '7869', '17174', '4'), +('2', '65', '7', '32012', '45370', '4'), +('2', '65', '7', '11499', '25433', '4'), +('2', '65', '7', '21995', '21070', '4'), +('2', '65', '7', '8781', '17417', '4'), +('2', '65', '9', '32100', '49890', '4'), +('2', '65', '9', '28668', '26001', '4'), +('2', '65', '9', '11103', '24587', '4'), +('2', '65', '9', '26787', '24137', '4'), +('2', '65', '15', '26993', '49789', '4'), +('2', '65', '15', '10234', '46753', '4'), +('2', '65', '15', '32109', '28384', '4'), +('2', '65', '15', '26989', '26571', '4'), +('2', '65', '20', '15871', '38738', '4'), +('2', '65', '20', '16158', '37368', '4'), +('2', '65', '20', '15929', '28461', '4'), +('2', '65', '20', '12510', '25385', '4'), +('2', '65', '12', '13563', '41643', '4'), +('2', '65', '12', '13557', '21995', '4'), +('2', '65', '12', '28246', '21968', '4'), +('2', '65', '12', '27000', '21813', '4'), +('2', '65', '18', '26783', '36292', '4'), +('2', '65', '18', '28650', '22150', '4'), +('2', '65', '18', '16797', '19010', '4'), +('2', '65', '18', '26755', '14503', '4'), +('2', '65', '19', '20074', '33020', '4'), +('2', '65', '19', '25995', '22416', '4'), +('2', '65', '19', '19094', '16213', '4'), +('2', '65', '19', '30570', '15608', '4'), +('2', '65', '13', '29033', '27755', '4'), +('2', '65', '13', '29037', '22665', '4'), +('2', '65', '13', '20627', '22522', '4'), +('2', '65', '13', '21886', '21548', '4'), +('2', '65', '14', '27280', '57050', '4'), +('2', '65', '14', '28915', '29710', '4'), +('2', '65', '14', '29033', '27755', '4'), +('2', '65', '14', '29037', '22665', '4'), +('2', '65', '11', '29033', '27755', '4'), +('2', '65', '11', '20496', '25871', '4'), +('2', '65', '11', '20604', '24905', '4'), +('2', '65', '11', '26987', '23649', '4'), +('2', '66', '22', '66397', '0', '7'), +('2', '66', '22', '61948', '0', '7'), +('2', '66', '22', '21805', '0', '7'), +('2', '66', '22', '21807', '0', '7'), +('2', '66', '1', '68949', '50141', '7'), +('2', '66', '1', '69166', '40048', '7'), +('2', '66', '1', '10242', '39271', '7'), +('2', '66', '1', '7130', '37489', '7'), +('2', '66', '2', '16158', '36472', '7'), +('2', '66', '2', '26763', '27856', '7'), +('2', '66', '2', '15929', '27713', '7'), +('2', '66', '2', '69087', '27481', '7'), +('2', '66', '3', '69068', '79390', '7'), +('2', '66', '3', '69132', '64784', '7'), +('2', '66', '3', '68651', '47532', '7'), +('2', '66', '3', '26984', '44540', '7'), +('2', '66', '5', '69097', '79940', '7'), +('2', '66', '5', '68950', '79622', '7'), +('2', '66', '5', '7769', '46167', '7'), +('2', '66', '5', '50414', '44259', '7'), +('2', '66', '8', '69064', '79039', '7'), +('2', '66', '8', '15823', '41844', '7'), +('2', '66', '8', '69164', '34540', '7'), +('2', '66', '8', '51240', '30836', '7'), +('2', '66', '6', '69066', '61158', '7'), +('2', '66', '6', '13647', '55339', '7'), +('2', '66', '6', '69073', '49534', '7'), +('2', '66', '6', '68841', '48973', '7'), +('2', '66', '17', '68962', '60447', '7'), +('2', '66', '17', '47646', '56764', '7'), +('2', '66', '17', '69150', '54348', '7'), +('2', '66', '17', '68748', '46581', '7'), +('2', '66', '7', '68856', '44880', '7'), +('2', '66', '7', '32012', '44124', '7'), +('2', '66', '7', '69079', '33161', '7'), +('2', '66', '7', '69168', '30778', '7'), +('2', '66', '9', '69126', '78964', '7'), +('2', '66', '9', '69100', '55988', '7'), +('2', '66', '9', '32100', '48743', '7'), +('2', '66', '9', '68603', '41526', '7'), +('2', '66', '15', '69160', '80711', '7'), +('2', '66', '15', '69070', '60772', '7'), +('2', '66', '15', '26993', '48544', '7'), +('2', '66', '15', '10234', '45506', '7'), +('2', '66', '20', '68951', '48141', '7'), +('2', '66', '20', '68821', '38250', '7'), +('2', '66', '20', '69386', '37957', '7'), +('2', '66', '20', '15871', '37743', '7'), +('2', '66', '12', '13563', '40396', '7'), +('2', '66', '12', '69083', '35137', '7'), +('2', '66', '12', '69252', '32451', '7'), +('2', '66', '12', '68857', '26398', '7'), +('2', '66', '18', '69146', '39556', '7'), +('2', '66', '18', '26783', '35144', '7'), +('2', '66', '18', '68963', '31780', '7'), +('2', '66', '18', '68189', '26250', '7'), +('2', '66', '19', '20074', '32274', '7'), +('2', '66', '19', '69177', '31994', '7'), +('2', '66', '19', '69075', '28331', '7'), +('2', '66', '19', '68189', '26250', '7'), +('2', '66', '13', '69098', '61356', '7'), +('2', '66', '13', '71241', '38455', '7'), +('2', '66', '13', '69159', '33359', '7'), +('2', '66', '13', '68444', '31252', '7'), +('2', '66', '14', '69155', '80831', '7'), +('2', '66', '14', '69098', '61356', '7'), +('2', '66', '14', '27280', '55555', '7'), +('2', '66', '14', '71241', '38455', '7'), +('2', '66', '11', '67606', '32125', '7'), +('2', '66', '11', '68116', '30786', '7'), +('2', '66', '11', '68952', '29974', '7'), +('2', '66', '11', '68848', '28707', '7'), +('2', '67', '22', '66397', '0', '7'), +('2', '67', '22', '61948', '0', '7'), +('2', '67', '22', '21805', '0', '7'), +('2', '67', '22', '21807', '0', '7'), +('2', '67', '1', '68949', '49146', '7'), +('2', '67', '1', '69166', '39752', '7'), +('2', '67', '1', '10242', '38275', '7'), +('2', '67', '1', '7130', '36994', '7'), +('2', '67', '2', '16158', '35576', '7'), +('2', '67', '2', '69087', '27485', '7'), +('2', '67', '2', '26763', '27109', '7'), +('2', '67', '2', '15929', '26966', '7'), +('2', '67', '3', '69068', '77146', '7'), +('2', '67', '3', '69132', '63539', '7'), +('2', '67', '3', '68651', '46286', '7'), +('2', '67', '3', '26984', '43545', '7'), +('2', '67', '5', '69097', '77695', '7'), +('2', '67', '5', '68950', '77376', '7'), +('2', '67', '5', '7769', '45171', '7'), +('2', '67', '5', '50414', '43012', '7'), +('2', '67', '8', '69064', '77044', '7'), +('2', '67', '8', '15823', '40597', '7'), +('2', '67', '8', '69164', '34546', '7'), +('2', '67', '8', '69072', '30228', '7'), +('2', '67', '6', '69066', '59911', '7'), +('2', '67', '6', '13647', '53844', '7'), +('2', '67', '6', '69073', '48639', '7'), +('2', '67', '6', '68841', '47977', '7'), +('2', '67', '17', '68962', '58952', '7'), +('2', '67', '17', '47646', '55270', '7'), +('2', '67', '17', '69150', '53453', '7'), +('2', '67', '17', '68748', '45585', '7'), +('2', '67', '7', '68856', '43984', '7'), +('2', '67', '7', '32012', '42878', '7'), +('2', '67', '7', '69079', '32864', '7'), +('2', '67', '7', '69168', '30782', '7'), +('2', '67', '9', '69126', '76964', '7'), +('2', '67', '9', '69100', '54843', '7'), +('2', '67', '9', '32100', '47597', '7'), +('2', '67', '9', '68603', '40277', '7'), +('2', '67', '15', '69160', '78711', '7'), +('2', '67', '15', '69070', '59526', '7'), +('2', '67', '15', '26993', '47298', '7'), +('2', '67', '15', '10234', '44259', '7'), +('2', '67', '20', '68951', '47246', '7'), +('2', '67', '20', '68821', '37253', '7'), +('2', '67', '20', '69386', '36960', '7'), +('2', '67', '20', '15871', '36747', '7'), +('2', '67', '12', '13563', '39150', '7'), +('2', '67', '12', '69083', '34842', '7'), +('2', '67', '12', '69252', '32455', '7'), +('2', '67', '12', '68857', '26351', '7'), +('2', '67', '18', '69146', '39312', '7'), +('2', '67', '18', '26783', '33996', '7'), +('2', '67', '18', '68963', '31484', '7'), +('2', '67', '18', '68189', '25000', '7'), +('2', '67', '19', '69177', '31999', '7'), +('2', '67', '19', '20074', '31528', '7'), +('2', '67', '19', '69075', '28336', '7'), +('2', '67', '19', '68858', '25431', '7'), +('2', '67', '13', '69098', '59862', '7'), +('2', '67', '13', '71241', '37207', '7'), +('2', '67', '13', '69159', '33365', '7'), +('2', '67', '13', '69111', '31150', '7'), +('2', '67', '14', '69155', '78832', '7'), +('2', '67', '14', '69098', '59862', '7'), +('2', '67', '14', '27280', '54060', '7'), +('2', '67', '14', '71241', '37207', '7'), +('2', '67', '11', '67606', '32129', '7'), +('2', '67', '11', '68116', '30039', '7'), +('2', '67', '11', '68952', '29978', '7'), +('2', '67', '11', '68848', '28710', '7'), +('2', '68', '22', '66397', '0', '7'), +('2', '68', '22', '61948', '0', '7'), +('2', '68', '22', '21805', '0', '7'), +('2', '68', '22', '21807', '0', '7'), +('2', '68', '1', '68949', '48152', '7'), +('2', '68', '1', '69166', '39456', '7'), +('2', '68', '1', '10242', '37280', '7'), +('2', '68', '1', '7130', '36499', '7'), +('2', '68', '2', '16158', '34680', '7'), +('2', '68', '2', '69087', '27489', '7'), +('2', '68', '2', '26763', '26362', '7'), +('2', '68', '2', '15929', '26218', '7'), +('2', '68', '3', '69068', '74901', '7'), +('2', '68', '3', '69132', '62294', '7'), +('2', '68', '3', '68651', '45039', '7'), +('2', '68', '3', '26984', '42550', '7'), +('2', '68', '5', '69097', '75450', '7'), +('2', '68', '5', '68950', '75130', '7'), +('2', '68', '5', '7769', '44175', '7'), +('2', '68', '5', '50414', '41766', '7'), +('2', '68', '8', '69064', '75049', '7'), +('2', '68', '8', '15823', '39351', '7'), +('2', '68', '8', '69164', '34551', '7'), +('2', '68', '8', '69072', '30232', '7'), +('2', '68', '6', '69066', '58664', '7'), +('2', '68', '6', '13647', '52350', '7'), +('2', '68', '6', '69073', '47744', '7'), +('2', '68', '6', '68841', '46981', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '68', '17', '68962', '57457', '7'), +('2', '68', '17', '47646', '53776', '7'), +('2', '68', '17', '69150', '52558', '7'), +('2', '68', '17', '68748', '44590', '7'), +('2', '68', '7', '68856', '43088', '7'), +('2', '68', '7', '32012', '41632', '7'), +('2', '68', '7', '69079', '32567', '7'), +('2', '68', '7', '69168', '30786', '7'), +('2', '68', '9', '69126', '74964', '7'), +('2', '68', '9', '69100', '53698', '7'), +('2', '68', '9', '32100', '46451', '7'), +('2', '68', '9', '68603', '39028', '7'), +('2', '68', '15', '69160', '76711', '7'), +('2', '68', '15', '69070', '58280', '7'), +('2', '68', '15', '26993', '46052', '7'), +('2', '68', '15', '10234', '43012', '7'), +('2', '68', '20', '68951', '46351', '7'), +('2', '68', '20', '68821', '36256', '7'), +('2', '68', '20', '69386', '35963', '7'), +('2', '68', '20', '15871', '35751', '7'), +('2', '68', '12', '13563', '37903', '7'), +('2', '68', '12', '69083', '34547', '7'), +('2', '68', '12', '69252', '32459', '7'), +('2', '68', '12', '68857', '26305', '7'), +('2', '68', '18', '69146', '39068', '7'), +('2', '68', '18', '26783', '32848', '7'), +('2', '68', '18', '68963', '31188', '7'), +('2', '68', '18', '68189', '23750', '7'), +('2', '68', '19', '69177', '32005', '7'), +('2', '68', '19', '20074', '30783', '7'), +('2', '68', '19', '69075', '28340', '7'), +('2', '68', '19', '68858', '25435', '7'), +('2', '68', '13', '69098', '58368', '7'), +('2', '68', '13', '71241', '35959', '7'), +('2', '68', '13', '69159', '33371', '7'), +('2', '68', '13', '69111', '31155', '7'), +('2', '68', '14', '69155', '76832', '7'), +('2', '68', '14', '69098', '58368', '7'), +('2', '68', '14', '27280', '52565', '7'), +('2', '68', '14', '71241', '35959', '7'), +('2', '68', '11', '67606', '32133', '7'), +('2', '68', '11', '68952', '29982', '7'), +('2', '68', '11', '68116', '29293', '7'), +('2', '68', '11', '68848', '28713', '7'), +('2', '69', '22', '66397', '0', '7'), +('2', '69', '22', '61948', '0', '7'), +('2', '69', '22', '21805', '0', '7'), +('2', '69', '22', '21807', '0', '7'), +('2', '69', '1', '68949', '47157', '7'), +('2', '69', '1', '69166', '39160', '7'), +('2', '69', '1', '10242', '36284', '7'), +('2', '69', '1', '7130', '36005', '7'), +('2', '69', '2', '16158', '33784', '7'), +('2', '69', '2', '69087', '27494', '7'), +('2', '69', '2', '26763', '25615', '7'), +('2', '69', '2', '15929', '25470', '7'), +('2', '69', '3', '69068', '72656', '7'), +('2', '69', '3', '69132', '61049', '7'), +('2', '69', '3', '68651', '43793', '7'), +('2', '69', '3', '26984', '41555', '7'), +('2', '69', '5', '69097', '73205', '7'), +('2', '69', '5', '68950', '72884', '7'), +('2', '69', '5', '7769', '43179', '7'), +('2', '69', '5', '50414', '40519', '7'), +('2', '69', '8', '69064', '73054', '7'), +('2', '69', '8', '15823', '38104', '7'), +('2', '69', '8', '69164', '34556', '7'), +('2', '69', '8', '69072', '30237', '7'), +('2', '69', '6', '69066', '57417', '7'), +('2', '69', '6', '13647', '50855', '7'), +('2', '69', '6', '69073', '46849', '7'), +('2', '69', '6', '68841', '45985', '7'), +('2', '69', '17', '68962', '55962', '7'), +('2', '69', '17', '47646', '52282', '7'), +('2', '69', '17', '69150', '51663', '7'), +('2', '69', '17', '68748', '43594', '7'), +('2', '69', '7', '68856', '42192', '7'), +('2', '69', '7', '32012', '40386', '7'), +('2', '69', '7', '69079', '32270', '7'), +('2', '69', '7', '69168', '30791', '7'), +('2', '69', '9', '69126', '72964', '7'), +('2', '69', '9', '69100', '52553', '7'), +('2', '69', '9', '32100', '45304', '7'), +('2', '69', '9', '68603', '37779', '7'), +('2', '69', '15', '69160', '74711', '7'), +('2', '69', '15', '69070', '57034', '7'), +('2', '69', '15', '26993', '44807', '7'), +('2', '69', '15', '10234', '41765', '7'), +('2', '69', '20', '68951', '45456', '7'), +('2', '69', '20', '68821', '35259', '7'), +('2', '69', '20', '67625', '35255', '7'), +('2', '69', '20', '69386', '34966', '7'), +('2', '69', '12', '13563', '36657', '7'), +('2', '69', '12', '69083', '34252', '7'), +('2', '69', '12', '69252', '32462', '7'), +('2', '69', '12', '68857', '26259', '7'), +('2', '69', '18', '69146', '38824', '7'), +('2', '69', '18', '26783', '31700', '7'), +('2', '69', '18', '68963', '30893', '7'), +('2', '69', '18', '68779', '23473', '7'), +('2', '69', '19', '69177', '32010', '7'), +('2', '69', '19', '20074', '30037', '7'), +('2', '69', '19', '69075', '28344', '7'), +('2', '69', '19', '68858', '25439', '7'), +('2', '69', '13', '69098', '56874', '7'), +('2', '69', '13', '71241', '34711', '7'), +('2', '69', '13', '69159', '33377', '7'), +('2', '69', '13', '69111', '31160', '7'), +('2', '69', '14', '69155', '74832', '7'), +('2', '69', '14', '69098', '56874', '7'), +('2', '69', '14', '27280', '51070', '7'), +('2', '69', '14', '71241', '34711', '7'), +('2', '69', '11', '67606', '32137', '7'), +('2', '69', '11', '68952', '29986', '7'), +('2', '69', '11', '68848', '28716', '7'), +('2', '69', '11', '68116', '28546', '7'), +('2', '70', '22', '21805', '0', '11'), +('2', '70', '22', '61948', '0', '11'), +('2', '70', '22', '21807', '0', '11'), +('2', '70', '22', '12425', '0', '11'), +('2', '70', '1', '39329', '108055', '11'), +('2', '70', '1', '71668', '59390', '11'), +('2', '70', '1', '83662', '52524', '11'), +('2', '70', '1', '83630', '48944', '11'), +('2', '70', '2', '83560', '39392', '11'), +('2', '70', '2', '70860', '38289', '11'), +('2', '70', '2', '39222', '37047', '11'), +('2', '70', '2', '83494', '33697', '11'), +('2', '70', '3', '69068', '70411', '11'), +('2', '70', '3', '70620', '62793', '11'), +('2', '70', '3', '69132', '59804', '11'), +('2', '70', '3', '39368', '50802', '11'), +('2', '70', '5', '69097', '70960', '11'), +('2', '70', '5', '68950', '70638', '11'), +('2', '70', '5', '70705', '62814', '11'), +('2', '70', '5', '39366', '50354', '11'), +('2', '70', '8', '39293', '108213', '11'), +('2', '70', '8', '83532', '73659', '11'), +('2', '70', '8', '69064', '71059', '11'), +('2', '70', '8', '83659', '66515', '11'), +('2', '70', '6', '71666', '90091', '11'), +('2', '70', '6', '83660', '82266', '11'), +('2', '70', '6', '39269', '80412', '11'), +('2', '70', '6', '47280', '68327', '11'), +('2', '70', '17', '70701', '73524', '11'), +('2', '70', '17', '83603', '67727', '11'), +('2', '70', '17', '68962', '54467', '11'), +('2', '70', '17', '47646', '50788', '11'), +('2', '70', '7', '39267', '41415', '11'), +('2', '70', '7', '68856', '41296', '11'), +('2', '70', '7', '83564', '40942', '11'), +('2', '70', '7', '32012', '39140', '11'), +('2', '70', '9', '51706', '110276', '11'), +('2', '70', '9', '39216', '74595', '11'), +('2', '70', '9', '69126', '70965', '11'), +('2', '70', '9', '69100', '51409', '11'), +('2', '70', '15', '83629', '107381', '11'), +('2', '70', '15', '69160', '72711', '11'), +('2', '70', '15', '47238', '69305', '11'), +('2', '70', '15', '39277', '61678', '11'), +('2', '70', '20', '47282', '57488', '11'), +('2', '70', '20', '83600', '48882', '11'), +('2', '70', '20', '39350', '46313', '11'), +('2', '70', '20', '39360', '45254', '11'), +('2', '70', '12', '83568', '41843', '11'), +('2', '70', '12', '70863', '37638', '11'), +('2', '70', '12', '13563', '35411', '11'), +('2', '70', '12', '83540', '34797', '11'), +('2', '70', '18', '83607', '111023', '11'), +('2', '70', '18', '70866', '85621', '11'), +('2', '70', '18', '39894', '58903', '11'), +('2', '70', '18', '69146', '38580', '11'), +('2', '70', '19', '83572', '78743', '11'), +('2', '70', '19', '70864', '67617', '11'), +('2', '70', '19', '71076', '56006', '11'), +('2', '70', '19', '47216', '51248', '11'), +('2', '70', '13', '83631', '79691', '11'), +('2', '70', '13', '83460', '64457', '11'), +('2', '70', '13', '39211', '59760', '11'), +('2', '70', '13', '69098', '55380', '11'), +('2', '70', '14', '69155', '72832', '11'), +('2', '70', '14', '83460', '64457', '11'), +('2', '70', '14', '39211', '59760', '11'), +('2', '70', '14', '69098', '55380', '11'), +('2', '70', '11', '39287', '108333', '11'), +('2', '70', '11', '39371', '50096', '11'), +('2', '70', '11', '39281', '49678', '11'), +('2', '70', '11', '83665', '45468', '11'), +('2', '70', '22', '61948', '0', '10'), +('2', '70', '22', '66397', '0', '10'), +('2', '70', '22', '21805', '0', '10'), +('2', '70', '22', '21807', '0', '10'), +('2', '70', '1', '71668', '59390', '10'), +('2', '70', '1', '83662', '52524', '10'), +('2', '70', '1', '83630', '48944', '10'), +('2', '70', '1', '68949', '46162', '10'), +('2', '70', '2', '83560', '39392', '10'), +('2', '70', '2', '70860', '38289', '10'), +('2', '70', '2', '83494', '33697', '10'), +('2', '70', '2', '16158', '32889', '10'), +('2', '70', '3', '69068', '70411', '10'), +('2', '70', '3', '70620', '62793', '10'), +('2', '70', '3', '69132', '59804', '10'), +('2', '70', '3', '83636', '49415', '10'), +('2', '70', '5', '69097', '70960', '10'), +('2', '70', '5', '68950', '70638', '10'), +('2', '70', '5', '70705', '62814', '10'), +('2', '70', '5', '83612', '42281', '10'), +('2', '70', '8', '83532', '73659', '10'), +('2', '70', '8', '69064', '71059', '10'), +('2', '70', '8', '83659', '66515', '10'), +('2', '70', '8', '71656', '56297', '10'), +('2', '70', '6', '71666', '90091', '10'), +('2', '70', '6', '83660', '82266', '10'), +('2', '70', '6', '47280', '68327', '10'), +('2', '70', '6', '47229', '58517', '10'), +('2', '70', '17', '70701', '73524', '10'), +('2', '70', '17', '83603', '67727', '10'), +('2', '70', '17', '68962', '54467', '10'), +('2', '70', '17', '47646', '50788', '10'), +('2', '70', '7', '68856', '41296', '10'), +('2', '70', '7', '83564', '40942', '10'), +('2', '70', '7', '32012', '39140', '10'), +('2', '70', '7', '70861', '37652', '10'), +('2', '70', '9', '69126', '70965', '10'), +('2', '70', '9', '69100', '51409', '10'), +('2', '70', '9', '32100', '44158', '10'), +('2', '70', '9', '83652', '43846', '10'), +('2', '70', '15', '83629', '107381', '10'), +('2', '70', '15', '69160', '72711', '10'), +('2', '70', '15', '47238', '69305', '10'), +('2', '70', '15', '47291', '56384', '10'), +('2', '70', '20', '47282', '57488', '10'), +('2', '70', '20', '83600', '48882', '10'), +('2', '70', '20', '68951', '44561', '10'), +('2', '70', '20', '83650', '42163', '10'), +('2', '70', '12', '83568', '41843', '10'), +('2', '70', '12', '70863', '37638', '10'), +('2', '70', '12', '13563', '35411', '10'), +('2', '70', '12', '83540', '34797', '10'), +('2', '70', '18', '83607', '111023', '10'), +('2', '70', '18', '70866', '85621', '10'), +('2', '70', '18', '69146', '38580', '10'), +('2', '70', '18', '47200', '32817', '10'), +('2', '70', '19', '83572', '78743', '10'), +('2', '70', '19', '70864', '67617', '10'), +('2', '70', '19', '71076', '56006', '10'), +('2', '70', '19', '47216', '51248', '10'), +('2', '70', '13', '83631', '79691', '10'), +('2', '70', '13', '83460', '64457', '10'), +('2', '70', '13', '69098', '55380', '10'), +('2', '70', '13', '83508', '54490', '10'), +('2', '70', '14', '69155', '72832', '10'), +('2', '70', '14', '83460', '64457', '10'), +('2', '70', '14', '69098', '55380', '10'), +('2', '70', '14', '83508', '54490', '10'), +('2', '70', '11', '83665', '45468', '10'), +('2', '70', '11', '83657', '42918', '10'), +('2', '70', '11', '83642', '42145', '10'), +('2', '70', '11', '47298', '37058', '10'), +('2', '70', '22', '66397', '0', '9'), +('2', '70', '22', '61948', '0', '9'), +('2', '70', '22', '21805', '0', '9'), +('2', '70', '22', '21807', '0', '9'), +('2', '70', '1', '71668', '59390', '9'), +('2', '70', '1', '68949', '46162', '9'), +('2', '70', '1', '47289', '41973', '9'), +('2', '70', '1', '47235', '39707', '9'), +('2', '70', '2', '70860', '38289', '9'), +('2', '70', '2', '16158', '32889', '9'), +('2', '70', '2', '47208', '32348', '9'), +('2', '70', '2', '69087', '27498', '9'), +('2', '70', '3', '69068', '70411', '9'), +('2', '70', '3', '70620', '62793', '9'), +('2', '70', '3', '69132', '59804', '9'), +('2', '70', '3', '71626', '46364', '9'), +('2', '70', '5', '69097', '70960', '9'), +('2', '70', '5', '68950', '70638', '9'), +('2', '70', '5', '70705', '62814', '9'), +('2', '70', '5', '7769', '42183', '9'), +('2', '70', '8', '69064', '71059', '9'), +('2', '70', '8', '71656', '56297', '9'), +('2', '70', '8', '71665', '40591', '9'), +('2', '70', '8', '47306', '38997', '9'), +('2', '70', '6', '71666', '90091', '9'), +('2', '70', '6', '47280', '68327', '9'), +('2', '70', '6', '47229', '58517', '9'), +('2', '70', '6', '69066', '56171', '9'), +('2', '70', '17', '70701', '73524', '9'), +('2', '70', '17', '68962', '54467', '9'), +('2', '70', '17', '47646', '50788', '9'), +('2', '70', '17', '69150', '50768', '9'), +('2', '70', '7', '68856', '41296', '9'), +('2', '70', '7', '32012', '39140', '9'), +('2', '70', '7', '70861', '37652', '9'), +('2', '70', '7', '47204', '32223', '9'), +('2', '70', '9', '69126', '70965', '9'), +('2', '70', '9', '69100', '51409', '9'), +('2', '70', '9', '32100', '44158', '9'), +('2', '70', '9', '70862', '36740', '9'), +('2', '70', '15', '69160', '72711', '9'), +('2', '70', '15', '47238', '69305', '9'), +('2', '70', '15', '47291', '56384', '9'), +('2', '70', '15', '69070', '55788', '9'), +('2', '70', '20', '47282', '57488', '9'), +('2', '70', '20', '68951', '44561', '9'), +('2', '70', '20', '47284', '37519', '9'), +('2', '70', '20', '47281', '37010', '9'), +('2', '70', '12', '70863', '37638', '9'), +('2', '70', '12', '13563', '35411', '9'), +('2', '70', '12', '69083', '33957', '9'), +('2', '70', '12', '47212', '33215', '9'), +('2', '70', '18', '70866', '85621', '9'), +('2', '70', '18', '69146', '38580', '9'), +('2', '70', '18', '47200', '32817', '9'), +('2', '70', '18', '71646', '31654', '9'), +('2', '70', '19', '70864', '67617', '9'), +('2', '70', '19', '71076', '56006', '9'), +('2', '70', '19', '47216', '51248', '9'), +('2', '70', '19', '69177', '32015', '9'), +('2', '70', '13', '69098', '55380', '9'), +('2', '70', '13', '71610', '43370', '9'), +('2', '70', '13', '71671', '40490', '9'), +('2', '70', '13', '47308', '38231', '9'), +('2', '70', '14', '69155', '72832', '9'), +('2', '70', '14', '69098', '55380', '9'), +('2', '70', '14', '39315', '50763', '9'), +('2', '70', '14', '27280', '49575', '9'), +('2', '70', '11', '47298', '37058', '9'), +('2', '70', '11', '71659', '35655', '9'), +('2', '70', '11', '47296', '35300', '9'), +('2', '70', '11', '47241', '34902', '9'), +('2', '70', '22', '66397', '0', '8'), +('2', '70', '22', '61948', '0', '8'), +('2', '70', '22', '21805', '0', '8'), +('2', '70', '22', '21807', '0', '8'), +('2', '70', '1', '68949', '46162', '8'), +('2', '70', '1', '47289', '41973', '8'), +('2', '70', '1', '47235', '39707', '8'), +('2', '70', '1', '47288', '39670', '8'), +('2', '70', '2', '70860', '38289', '8'), +('2', '70', '2', '16158', '32889', '8'), +('2', '70', '2', '47208', '32348', '8'), +('2', '70', '2', '69087', '27498', '8'), +('2', '70', '3', '69068', '70411', '8'), +('2', '70', '3', '70620', '62793', '8'), +('2', '70', '3', '69132', '59804', '8'), +('2', '70', '3', '68651', '42546', '8'), +('2', '70', '5', '69097', '70960', '8'), +('2', '70', '5', '68950', '70638', '8'), +('2', '70', '5', '70705', '62814', '8'), +('2', '70', '5', '7769', '42183', '8'), +('2', '70', '8', '69064', '71059', '8'), +('2', '70', '8', '47306', '38997', '8'), +('2', '70', '8', '15823', '36858', '8'), +('2', '70', '8', '47304', '34954', '8'), +('2', '70', '6', '47280', '68327', '8'), +('2', '70', '6', '47229', '58517', '8'), +('2', '70', '6', '69066', '56171', '8'), +('2', '70', '6', '13647', '49360', '8'), +('2', '70', '17', '70701', '73524', '8'), +('2', '70', '17', '68962', '54467', '8'), +('2', '70', '17', '47646', '50788', '8'), +('2', '70', '17', '69150', '50768', '8'), +('2', '70', '7', '68856', '41296', '8'), +('2', '70', '7', '32012', '39140', '8'), +('2', '70', '7', '70861', '37652', '8'), +('2', '70', '7', '47204', '32223', '8'), +('2', '70', '9', '69126', '70965', '8'), +('2', '70', '9', '69100', '51409', '8'), +('2', '70', '9', '32100', '44158', '8'), +('2', '70', '9', '70862', '36740', '8'), +('2', '70', '15', '69160', '72711', '8'), +('2', '70', '15', '47238', '69305', '8'), +('2', '70', '15', '47291', '56384', '8'), +('2', '70', '15', '69070', '55788', '8'), +('2', '70', '20', '47282', '57488', '8'), +('2', '70', '20', '68951', '44561', '8'), +('2', '70', '20', '47284', '37519', '8'), +('2', '70', '20', '47281', '37010', '8'), +('2', '70', '12', '70863', '37638', '8'), +('2', '70', '12', '13563', '35411', '8'), +('2', '70', '12', '69083', '33957', '8'), +('2', '70', '12', '47212', '33215', '8'), +('2', '70', '18', '70866', '85621', '8'), +('2', '70', '18', '69146', '38580', '8'), +('2', '70', '18', '47200', '32817', '8'), +('2', '70', '18', '68963', '30597', '8'), +('2', '70', '19', '70864', '67617', '8'), +('2', '70', '19', '71076', '56006', '8'), +('2', '70', '19', '47216', '51248', '8'), +('2', '70', '19', '69177', '32015', '8'), +('2', '70', '13', '69098', '55380', '8'), +('2', '70', '13', '47308', '38231', '8'), +('2', '70', '13', '47307', '36862', '8'), +('2', '70', '13', '47250', '34952', '8'), +('2', '70', '14', '69155', '72832', '8'), +('2', '70', '14', '69098', '55380', '8'), +('2', '70', '14', '39315', '50763', '8'), +('2', '70', '14', '27280', '49575', '8'), +('2', '70', '11', '47298', '37058', '8'), +('2', '70', '11', '47296', '35300', '8'), +('2', '70', '11', '47241', '34902', '8'), +('2', '70', '11', '70706', '33841', '8'), +('2', '71', '22', '21805', '0', '11'), +('2', '71', '22', '61948', '0', '11'), +('2', '71', '22', '21807', '0', '11'), +('2', '71', '22', '12425', '0', '11'), +('2', '71', '1', '39329', '105060', '11'), +('2', '71', '1', '71668', '58396', '11'), +('2', '71', '1', '83662', '52180', '11'), +('2', '71', '1', '83630', '48598', '11'), +('2', '71', '2', '83560', '39399', '11'), +('2', '71', '2', '70860', '38295', '11'), +('2', '71', '2', '39222', '37051', '11'), +('2', '71', '2', '83494', '33701', '11'), +('2', '71', '3', '69068', '68166', '11'), +('2', '71', '3', '70620', '61047', '11'), +('2', '71', '3', '69132', '58559', '11'), +('2', '71', '3', '39368', '50809', '11'), +('2', '71', '5', '69097', '68715', '11'), +('2', '71', '5', '68950', '68392', '11'), +('2', '71', '5', '70705', '61319', '11'), +('2', '71', '5', '39366', '50361', '11'), +('2', '71', '8', '39293', '105217', '11'), +('2', '71', '8', '83532', '71664', '11'), +('2', '71', '8', '69064', '69064', '11'), +('2', '71', '8', '83659', '65515', '11'), +('2', '71', '6', '71666', '87597', '11'), +('2', '71', '6', '83660', '80516', '11'), +('2', '71', '6', '39269', '78667', '11'), +('2', '71', '6', '47280', '66832', '11'), +('2', '71', '17', '70701', '71529', '11'), +('2', '71', '17', '83603', '66732', '11'), +('2', '71', '17', '68962', '52972', '11'), +('2', '71', '17', '69150', '49873', '11'), +('2', '71', '7', '39267', '41420', '11'), +('2', '71', '7', '83564', '40949', '11'), +('2', '71', '7', '68856', '40400', '11'), +('2', '71', '7', '84113', '37895', '11'), +('2', '71', '9', '51706', '107281', '11'), +('2', '71', '9', '39216', '72849', '11'), +('2', '71', '9', '69126', '68965', '11'), +('2', '71', '9', '69100', '50264', '11'), +('2', '71', '15', '83629', '104387', '11'), +('2', '71', '15', '69160', '70712', '11'), +('2', '71', '15', '47238', '67560', '11'), +('2', '71', '15', '39277', '60682', '11'), +('2', '71', '20', '47282', '56492', '11'), +('2', '71', '20', '83600', '48538', '11'), +('2', '71', '20', '39350', '46318', '11'), +('2', '71', '20', '39360', '45261', '11'), +('2', '71', '12', '83568', '41849', '11'), +('2', '71', '12', '70863', '37645', '11'), +('2', '71', '12', '83540', '34801', '11'), +('2', '71', '12', '84110', '34164', '11'), +('2', '71', '18', '83607', '108029', '11'), +('2', '71', '18', '70866', '83376', '11'), +('2', '71', '18', '39894', '57405', '11'), +('2', '71', '18', '69146', '38336', '11'), +('2', '71', '19', '83572', '76999', '11'), +('2', '71', '19', '70864', '66125', '11'), +('2', '71', '19', '71076', '54506', '11'), +('2', '71', '19', '47216', '50352', '11'), +('2', '71', '13', '83631', '77947', '11'), +('2', '71', '13', '83460', '62712', '11'), +('2', '71', '13', '39211', '58765', '11'), +('2', '71', '13', '69098', '53887', '11'), +('2', '71', '14', '69155', '70832', '11'), +('2', '71', '14', '83460', '62712', '11'), +('2', '71', '14', '39211', '58765', '11'), +('2', '71', '14', '69098', '53887', '11'), +('2', '71', '11', '39287', '105338', '11'), +('2', '71', '11', '39371', '50100', '11'), +('2', '71', '11', '39281', '49332', '11'), +('2', '71', '11', '83665', '45476', '11'), +('2', '72', '22', '21805', '0', '11'), +('2', '72', '22', '61948', '0', '11'), +('2', '72', '22', '21807', '0', '11'), +('2', '72', '22', '12425', '0', '11'), +('2', '72', '1', '39329', '102065', '11'), +('2', '72', '1', '71668', '57401', '11'), +('2', '72', '1', '83662', '51837', '11'), +('2', '72', '1', '83630', '48252', '11'), +('2', '72', '2', '83560', '39405', '11'), +('2', '72', '2', '70860', '38301', '11'), +('2', '72', '2', '39222', '37055', '11'), +('2', '72', '2', '83494', '33705', '11'), +('2', '72', '3', '69068', '65921', '11'), +('2', '72', '3', '70620', '59301', '11'), +('2', '72', '3', '69132', '57314', '11'), +('2', '72', '3', '39368', '50816', '11'), +('2', '72', '5', '69097', '66470', '11'), +('2', '72', '5', '68950', '66146', '11'), +('2', '72', '5', '70705', '59824', '11'), +('2', '72', '5', '39366', '50369', '11'), +('2', '72', '8', '39293', '102222', '11'), +('2', '72', '8', '83532', '69669', '11'), +('2', '72', '8', '69064', '67069', '11'), +('2', '72', '8', '83659', '64515', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '72', '6', '71666', '85102', '11'), +('2', '72', '6', '83660', '78766', '11'), +('2', '72', '6', '39269', '76922', '11'), +('2', '72', '6', '47280', '65336', '11'), +('2', '72', '17', '70701', '69535', '11'), +('2', '72', '17', '83603', '65738', '11'), +('2', '72', '17', '68962', '51477', '11'), +('2', '72', '17', '69150', '48978', '11'), +('2', '72', '7', '39267', '41426', '11'), +('2', '72', '7', '83564', '40955', '11'), +('2', '72', '7', '68856', '39504', '11'), +('2', '72', '7', '70861', '37661', '11'), +('2', '72', '9', '51706', '104285', '11'), +('2', '72', '9', '39216', '71103', '11'), +('2', '72', '9', '69126', '66965', '11'), +('2', '72', '9', '69100', '49119', '11'), +('2', '72', '15', '83629', '101394', '11'), +('2', '72', '15', '69160', '68712', '11'), +('2', '72', '15', '47238', '65814', '11'), +('2', '72', '15', '39277', '59686', '11'), +('2', '72', '20', '47282', '55495', '11'), +('2', '72', '20', '83600', '48194', '11'), +('2', '72', '20', '39350', '46323', '11'), +('2', '72', '20', '39360', '45268', '11'), +('2', '72', '12', '83568', '41855', '11'), +('2', '72', '12', '70863', '37651', '11'), +('2', '72', '12', '83540', '34805', '11'), +('2', '72', '12', '69083', '33367', '11'), +('2', '72', '18', '83607', '105034', '11'), +('2', '72', '18', '70866', '81132', '11'), +('2', '72', '18', '39894', '55907', '11'), +('2', '72', '18', '69146', '38092', '11'), +('2', '72', '19', '83572', '75255', '11'), +('2', '72', '19', '70864', '64633', '11'), +('2', '72', '19', '71076', '53006', '11'), +('2', '72', '19', '47216', '49457', '11'), +('2', '72', '13', '83631', '76203', '11'), +('2', '72', '13', '83460', '60967', '11'), +('2', '72', '13', '39211', '57770', '11'), +('2', '72', '13', '83508', '52498', '11'), +('2', '72', '14', '69155', '68832', '11'), +('2', '72', '14', '83460', '60967', '11'), +('2', '72', '14', '39211', '57770', '11'), +('2', '72', '14', '83508', '52498', '11'), +('2', '72', '11', '39287', '102343', '11'), +('2', '72', '11', '39371', '50104', '11'), +('2', '72', '11', '39281', '48986', '11'), +('2', '72', '11', '83665', '45483', '11'), +('2', '73', '22', '21805', '0', '11'), +('2', '73', '22', '61948', '0', '11'), +('2', '73', '22', '21807', '0', '11'), +('2', '73', '22', '12425', '0', '11'), +('2', '73', '1', '39329', '99070', '11'), +('2', '73', '1', '71668', '56407', '11'), +('2', '73', '1', '83662', '51494', '11'), +('2', '73', '1', '83630', '47907', '11'), +('2', '73', '2', '83560', '39411', '11'), +('2', '73', '2', '70860', '38307', '11'), +('2', '73', '2', '39222', '37059', '11'), +('2', '73', '2', '83494', '33710', '11'), +('2', '73', '3', '69068', '63676', '11'), +('2', '73', '3', '70620', '57556', '11'), +('2', '73', '3', '69132', '56069', '11'), +('2', '73', '3', '39368', '50823', '11'), +('2', '73', '5', '69097', '64225', '11'), +('2', '73', '5', '68950', '63900', '11'), +('2', '73', '5', '70705', '58329', '11'), +('2', '73', '5', '39366', '50376', '11'), +('2', '73', '8', '39293', '99226', '11'), +('2', '73', '8', '83532', '67674', '11'), +('2', '73', '8', '69064', '65074', '11'), +('2', '73', '8', '83659', '63515', '11'), +('2', '73', '6', '71666', '82608', '11'), +('2', '73', '6', '83660', '77016', '11'), +('2', '73', '6', '39269', '75177', '11'), +('2', '73', '6', '47280', '63841', '11'), +('2', '73', '17', '70701', '67540', '11'), +('2', '73', '17', '83603', '64743', '11'), +('2', '73', '17', '68962', '49983', '11'), +('2', '73', '17', '69150', '48084', '11'), +('2', '73', '7', '39267', '41431', '11'), +('2', '73', '7', '83564', '40961', '11'), +('2', '73', '7', '68856', '38609', '11'), +('2', '73', '7', '70861', '37665', '11'), +('2', '73', '9', '51706', '101290', '11'), +('2', '73', '9', '39216', '69357', '11'), +('2', '73', '9', '69126', '64965', '11'), +('2', '73', '9', '69100', '47974', '11'), +('2', '73', '15', '83629', '98400', '11'), +('2', '73', '15', '69160', '66712', '11'), +('2', '73', '15', '47238', '64068', '11'), +('2', '73', '15', '39277', '58690', '11'), +('2', '73', '20', '47282', '54498', '11'), +('2', '73', '20', '83600', '47850', '11'), +('2', '73', '20', '39350', '46328', '11'), +('2', '73', '20', '39360', '45275', '11'), +('2', '73', '12', '83568', '41861', '11'), +('2', '73', '12', '70863', '37657', '11'), +('2', '73', '12', '83540', '34809', '11'), +('2', '73', '12', '47212', '33230', '11'), +('2', '73', '18', '83607', '102039', '11'), +('2', '73', '18', '70866', '78887', '11'), +('2', '73', '18', '39894', '54409', '11'), +('2', '73', '18', '69146', '37848', '11'), +('2', '73', '19', '83572', '73511', '11'), +('2', '73', '19', '70864', '63141', '11'), +('2', '73', '19', '71076', '51506', '11'), +('2', '73', '19', '47216', '48561', '11'), +('2', '73', '13', '83631', '74459', '11'), +('2', '73', '13', '83460', '59222', '11'), +('2', '73', '13', '39211', '56775', '11'), +('2', '73', '13', '83508', '51502', '11'), +('2', '73', '14', '69155', '66832', '11'), +('2', '73', '14', '83460', '59222', '11'), +('2', '73', '14', '39211', '56775', '11'), +('2', '73', '14', '83508', '51502', '11'), +('2', '73', '11', '39287', '99349', '11'), +('2', '73', '11', '39371', '50108', '11'), +('2', '73', '11', '39281', '48640', '11'), +('2', '73', '11', '83665', '45490', '11'), +('2', '74', '22', '21805', '0', '11'), +('2', '74', '22', '61948', '0', '11'), +('2', '74', '22', '21807', '0', '11'), +('2', '74', '22', '12425', '0', '11'), +('2', '74', '1', '39329', '96075', '11'), +('2', '74', '1', '71668', '55412', '11'), +('2', '74', '1', '83662', '51151', '11'), +('2', '74', '1', '83630', '47561', '11'), +('2', '74', '2', '83560', '39417', '11'), +('2', '74', '2', '70860', '38313', '11'), +('2', '74', '2', '39222', '37063', '11'), +('2', '74', '2', '83494', '33714', '11'), +('2', '74', '3', '69068', '61431', '11'), +('2', '74', '3', '70620', '55810', '11'), +('2', '74', '3', '69132', '54824', '11'), +('2', '74', '3', '39368', '50831', '11'), +('2', '74', '5', '69097', '61980', '11'), +('2', '74', '5', '68950', '61654', '11'), +('2', '74', '5', '70705', '56834', '11'), +('2', '74', '5', '39366', '50383', '11'), +('2', '74', '8', '39293', '96231', '11'), +('2', '74', '8', '83532', '65679', '11'), +('2', '74', '8', '69064', '63079', '11'), +('2', '74', '8', '83659', '62515', '11'), +('2', '74', '6', '71666', '80113', '11'), +('2', '74', '6', '83660', '75266', '11'), +('2', '74', '6', '39269', '73432', '11'), +('2', '74', '6', '47280', '62345', '11'), +('2', '74', '17', '70701', '65545', '11'), +('2', '74', '17', '83603', '63748', '11'), +('2', '74', '17', '68962', '48488', '11'), +('2', '74', '17', '69150', '47189', '11'), +('2', '74', '7', '39267', '41436', '11'), +('2', '74', '7', '83564', '40967', '11'), +('2', '74', '7', '68856', '37713', '11'), +('2', '74', '7', '70861', '37669', '11'), +('2', '74', '9', '51706', '98294', '11'), +('2', '74', '9', '39216', '67611', '11'), +('2', '74', '9', '69126', '62965', '11'), +('2', '74', '9', '69100', '46829', '11'), +('2', '74', '15', '83629', '95406', '11'), +('2', '74', '15', '69160', '64712', '11'), +('2', '74', '15', '47238', '62323', '11'), +('2', '74', '15', '39277', '57694', '11'), +('2', '74', '20', '47282', '53502', '11'), +('2', '74', '20', '83600', '47506', '11'), +('2', '74', '20', '39350', '46333', '11'), +('2', '74', '20', '39360', '45283', '11'), +('2', '74', '12', '83568', '41867', '11'), +('2', '74', '12', '70863', '37663', '11'), +('2', '74', '12', '83540', '34813', '11'), +('2', '74', '12', '47212', '33235', '11'), +('2', '74', '18', '83607', '99044', '11'), +('2', '74', '18', '70866', '76642', '11'), +('2', '74', '18', '39894', '52911', '11'), +('2', '74', '18', '69146', '37604', '11'), +('2', '74', '19', '83572', '71767', '11'), +('2', '74', '19', '70864', '61649', '11'), +('2', '74', '19', '71076', '50006', '11'), +('2', '74', '19', '47216', '47665', '11'), +('2', '74', '13', '83631', '72715', '11'), +('2', '74', '13', '83460', '57478', '11'), +('2', '74', '13', '39211', '55780', '11'), +('2', '74', '13', '83508', '50506', '11'), +('2', '74', '14', '69155', '64832', '11'), +('2', '74', '14', '83460', '57478', '11'), +('2', '74', '14', '39211', '55780', '11'), +('2', '74', '14', '83508', '50506', '11'), +('2', '74', '11', '39287', '96354', '11'), +('2', '74', '11', '39371', '50113', '11'), +('2', '74', '11', '39281', '48294', '11'), +('2', '74', '11', '83665', '45498', '11'), +('2', '75', '22', '21807', '0', '13'), +('2', '75', '22', '21805', '0', '13'), +('2', '75', '22', '12425', '0', '13'), +('2', '75', '22', '39342', '0', '13'), +('2', '75', '1', '39329', '93080', '13'), +('2', '75', '1', '80676', '69837', '13'), +('2', '75', '1', '80660', '66709', '13'), +('2', '75', '1', '80639', '63588', '13'), +('2', '75', '2', '53368', '54796', '13'), +('2', '75', '2', '83560', '39423', '13'), +('2', '75', '2', '70860', '38319', '13'), +('2', '75', '2', '39222', '37068', '13'), +('2', '75', '3', '80647', '63889', '13'), +('2', '75', '3', '69068', '59186', '13'), +('2', '75', '3', '46923', '56018', '13'), +('2', '75', '3', '70620', '54064', '13'), +('2', '75', '5', '80661', '67709', '13'), +('2', '75', '5', '46934', '60596', '13'), +('2', '75', '5', '80626', '60468', '13'), +('2', '75', '5', '69097', '59735', '13'), +('2', '75', '8', '39293', '93235', '13'), +('2', '75', '8', '80689', '70001', '13'), +('2', '75', '8', '83532', '63684', '13'), +('2', '75', '8', '80649', '63639', '13'), +('2', '75', '6', '71666', '77619', '13'), +('2', '75', '6', '83660', '73516', '13'), +('2', '75', '6', '39269', '71687', '13'), +('2', '75', '6', '80645', '63938', '13'), +('2', '75', '17', '70701', '63550', '13'), +('2', '75', '17', '83603', '62753', '13'), +('2', '75', '17', '53373', '56992', '13'), +('2', '75', '17', '68962', '46993', '13'), +('2', '75', '7', '53369', '54619', '13'), +('2', '75', '7', '39267', '41441', '13'), +('2', '75', '7', '83564', '40973', '13'), +('2', '75', '7', '70861', '37673', '13'), +('2', '75', '9', '51706', '95299', '13'), +('2', '75', '9', '39216', '65865', '13'), +('2', '75', '9', '69126', '60965', '13'), +('2', '75', '9', '46887', '60243', '13'), +('2', '75', '15', '83629', '92412', '13'), +('2', '75', '15', '79909', '73465', '13'), +('2', '75', '15', '80686', '69750', '13'), +('2', '75', '15', '79908', '67034', '13'), +('2', '75', '20', '80690', '70001', '13'), +('2', '75', '20', '46886', '61168', '13'), +('2', '75', '20', '80620', '59968', '13'), +('2', '75', '20', '46869', '56345', '13'), +('2', '75', '12', '53371', '54419', '13'), +('2', '75', '12', '83568', '41874', '13'), +('2', '75', '12', '70863', '37669', '13'), +('2', '75', '12', '83540', '34817', '13'), +('2', '75', '18', '83607', '96049', '13'), +('2', '75', '18', '70866', '74397', '13'), +('2', '75', '18', '53374', '56198', '13'), +('2', '75', '18', '39894', '51413', '13'), +('2', '75', '19', '83572', '70024', '13'), +('2', '75', '19', '70864', '60157', '13'), +('2', '75', '19', '53372', '54723', '13'), +('2', '75', '19', '71076', '48506', '13'), +('2', '75', '13', '83631', '70972', '13'), +('2', '75', '13', '80663', '63748', '13'), +('2', '75', '13', '83460', '55733', '13'), +('2', '75', '13', '39211', '54785', '13'), +('2', '75', '14', '80682', '65085', '13'), +('2', '75', '14', '80665', '64833', '13'), +('2', '75', '14', '69155', '62832', '13'), +('2', '75', '14', '80625', '59530', '13'), +('2', '75', '11', '39287', '93360', '13'), +('2', '75', '11', '80668', '69850', '13'), +('2', '75', '11', '46939', '61492', '13'), +('2', '75', '11', '80619', '60868', '13'), +('2', '75', '22', '21807', '0', '12'), +('2', '75', '22', '21805', '0', '12'), +('2', '75', '22', '12425', '0', '12'), +('2', '75', '22', '39342', '0', '12'), +('2', '75', '1', '39329', '93080', '12'), +('2', '75', '1', '46882', '61236', '12'), +('2', '75', '1', '46865', '56917', '12'), +('2', '75', '1', '71668', '54418', '12'), +('2', '75', '2', '53368', '54796', '12'), +('2', '75', '2', '83560', '39423', '12'), +('2', '75', '2', '70860', '38319', '12'), +('2', '75', '2', '39222', '37068', '12'), +('2', '75', '3', '69068', '59186', '12'), +('2', '75', '3', '46923', '56018', '12'), +('2', '75', '3', '70620', '54064', '12'), +('2', '75', '3', '69132', '53579', '12'), +('2', '75', '5', '46934', '60596', '12'), +('2', '75', '5', '69097', '59735', '12'), +('2', '75', '5', '68950', '59408', '12'), +('2', '75', '5', '46917', '56749', '12'), +('2', '75', '8', '39293', '93235', '12'), +('2', '75', '8', '83532', '63684', '12'), +('2', '75', '8', '83659', '61515', '12'), +('2', '75', '8', '69064', '61084', '12'), +('2', '75', '6', '71666', '77619', '12'), +('2', '75', '6', '83660', '73516', '12'), +('2', '75', '6', '39269', '71687', '12'), +('2', '75', '6', '47280', '60850', '12'), +('2', '75', '17', '70701', '63550', '12'), +('2', '75', '17', '83603', '62753', '12'), +('2', '75', '17', '53373', '56992', '12'), +('2', '75', '17', '68962', '46993', '12'), +('2', '75', '7', '53369', '54619', '12'), +('2', '75', '7', '39267', '41441', '12'), +('2', '75', '7', '83564', '40973', '12'), +('2', '75', '7', '70861', '37673', '12'), +('2', '75', '9', '51706', '95299', '12'), +('2', '75', '9', '39216', '65865', '12'), +('2', '75', '9', '69126', '60965', '12'), +('2', '75', '9', '46887', '60243', '12'), +('2', '75', '15', '83629', '92412', '12'), +('2', '75', '15', '69160', '62712', '12'), +('2', '75', '15', '46932', '61317', '12'), +('2', '75', '15', '47238', '60577', '12'), +('2', '75', '20', '46886', '61168', '12'), +('2', '75', '20', '46869', '56345', '12'), +('2', '75', '20', '47282', '52505', '12'), +('2', '75', '20', '83600', '47162', '12'), +('2', '75', '12', '53371', '54419', '12'), +('2', '75', '12', '83568', '41874', '12'), +('2', '75', '12', '70863', '37669', '12'), +('2', '75', '12', '83540', '34817', '12'), +('2', '75', '18', '83607', '96049', '12'), +('2', '75', '18', '70866', '74397', '12'), +('2', '75', '18', '53374', '56198', '12'), +('2', '75', '18', '39894', '51413', '12'), +('2', '75', '19', '83572', '70024', '12'), +('2', '75', '19', '70864', '60157', '12'), +('2', '75', '19', '53372', '54723', '12'), +('2', '75', '19', '71076', '48506', '12'), +('2', '75', '13', '83631', '70972', '12'), +('2', '75', '13', '83460', '55733', '12'), +('2', '75', '13', '39211', '54785', '12'), +('2', '75', '13', '46991', '49883', '12'), +('2', '75', '14', '69155', '62832', '12'), +('2', '75', '14', '46925', '56307', '12'), +('2', '75', '14', '83460', '55733', '12'), +('2', '75', '14', '46875', '55086', '12'), +('2', '75', '11', '39287', '93360', '12'), +('2', '75', '11', '46939', '61492', '12'), +('2', '75', '11', '46889', '59394', '12'), +('2', '75', '11', '46899', '51336', '12'), +('2', '76', '22', '21807', '0', '13'), +('2', '76', '22', '21805', '0', '13'), +('2', '76', '22', '12425', '0', '13'), +('2', '76', '22', '39342', '0', '13'), +('2', '76', '1', '39329', '90085', '13'), +('2', '76', '1', '80676', '69844', '13'), +('2', '76', '1', '80660', '66716', '13'), +('2', '76', '1', '80639', '63594', '13'), +('2', '76', '2', '53368', '54803', '13'), +('2', '76', '2', '83560', '39430', '13'), +('2', '76', '2', '70860', '38325', '13'), +('2', '76', '2', '39222', '37072', '13'), +('2', '76', '3', '80647', '63895', '13'), +('2', '76', '3', '69068', '56941', '13'), +('2', '76', '3', '46923', '56024', '13'), +('2', '76', '3', '69132', '52334', '13'), +('2', '76', '5', '80661', '67716', '13'), +('2', '76', '5', '46934', '60603', '13'), +('2', '76', '5', '80626', '60474', '13'), +('2', '76', '5', '69097', '57491', '13'), +('2', '76', '8', '39293', '90239', '13'), +('2', '76', '8', '80689', '70008', '13'), +('2', '76', '8', '80649', '63645', '13'), +('2', '76', '8', '83532', '61689', '13'), +('2', '76', '6', '71666', '75124', '13'), +('2', '76', '6', '83660', '71767', '13'), +('2', '76', '6', '39269', '69942', '13'), +('2', '76', '6', '80645', '63945', '13'), +('2', '76', '17', '83603', '61758', '13'), +('2', '76', '17', '70701', '61555', '13'), +('2', '76', '17', '53373', '56999', '13'), +('2', '76', '17', '68962', '45498', '13'), +('2', '76', '7', '53369', '54626', '13'), +('2', '76', '7', '39267', '41446', '13'), +('2', '76', '7', '83564', '40980', '13'), +('2', '76', '7', '70861', '37677', '13'), +('2', '76', '9', '51706', '92303', '13'), +('2', '76', '9', '39216', '64119', '13'), +('2', '76', '9', '46887', '60250', '13'), +('2', '76', '9', '69126', '58965', '13'), +('2', '76', '15', '83629', '89418', '13'), +('2', '76', '15', '79909', '73471', '13'), +('2', '76', '15', '80686', '69758', '13'), +('2', '76', '15', '79908', '67040', '13'), +('2', '76', '20', '80690', '70008', '13'), +('2', '76', '20', '46886', '61176', '13'), +('2', '76', '20', '80620', '59969', '13'), +('2', '76', '20', '46869', '56352', '13'), +('2', '76', '12', '53371', '54423', '13'), +('2', '76', '12', '83568', '41880', '13'), +('2', '76', '12', '70863', '37675', '13'), +('2', '76', '12', '83540', '34821', '13'), +('2', '76', '18', '83607', '93055', '13'), +('2', '76', '18', '70866', '72152', '13'), +('2', '76', '18', '53374', '56205', '13'), +('2', '76', '18', '39894', '49915', '13'), +('2', '76', '19', '83572', '68280', '13'), +('2', '76', '19', '70864', '58665', '13'), +('2', '76', '19', '53372', '54723', '13'), +('2', '76', '19', '71076', '47006', '13'), +('2', '76', '13', '83631', '69228', '13'), +('2', '76', '13', '80663', '63753', '13'), +('2', '76', '13', '83460', '53988', '13'), +('2', '76', '13', '39211', '53790', '13'), +('2', '76', '14', '80682', '65090', '13'), +('2', '76', '14', '80665', '64839', '13'), +('2', '76', '14', '69155', '60832', '13'), +('2', '76', '14', '80625', '59536', '13'), +('2', '76', '11', '39287', '90365', '13'), +('2', '76', '11', '80668', '69857', '13'), +('2', '76', '11', '46939', '61499', '13'), +('2', '76', '11', '80619', '60874', '13'), +('2', '77', '22', '21807', '0', '13'), +('2', '77', '22', '21805', '0', '13'), +('2', '77', '22', '12425', '0', '13'), +('2', '77', '22', '39342', '0', '13'), +('2', '77', '1', '39329', '87090', '13'), +('2', '77', '1', '80676', '69851', '13'), +('2', '77', '1', '80660', '66723', '13'), +('2', '77', '1', '80639', '63601', '13'), +('2', '77', '2', '53368', '54810', '13'), +('2', '77', '2', '83560', '39436', '13'), +('2', '77', '2', '70860', '38332', '13'), +('2', '77', '2', '39222', '37076', '13'), +('2', '77', '3', '80647', '63902', '13'), +('2', '77', '3', '46923', '56030', '13'), +('2', '77', '3', '69068', '54697', '13'), +('2', '77', '3', '46852', '51255', '13'), +('2', '77', '5', '80661', '67722', '13'), +('2', '77', '5', '46934', '60610', '13'), +('2', '77', '5', '80626', '60480', '13'), +('2', '77', '5', '46917', '56762', '13'), +('2', '77', '8', '39293', '87244', '13'), +('2', '77', '8', '80689', '70015', '13'), +('2', '77', '8', '80649', '63652', '13'), +('2', '77', '8', '46936', '60851', '13'), +('2', '77', '6', '71666', '72630', '13'), +('2', '77', '6', '83660', '70017', '13'), +('2', '77', '6', '39269', '68197', '13'), +('2', '77', '6', '80645', '63951', '13'), +('2', '77', '17', '83603', '60764', '13'), +('2', '77', '17', '70701', '59560', '13'), +('2', '77', '17', '53373', '57006', '13'), +('2', '77', '17', '69150', '44504', '13'), +('2', '77', '7', '53369', '54632', '13'), +('2', '77', '7', '39267', '41451', '13'), +('2', '77', '7', '83564', '40986', '13'), +('2', '77', '7', '70861', '37682', '13'), +('2', '77', '9', '51706', '89308', '13'), +('2', '77', '9', '39216', '62374', '13'), +('2', '77', '9', '46887', '60258', '13'), +('2', '77', '9', '69126', '56965', '13'), +('2', '77', '15', '83629', '86424', '13'), +('2', '77', '15', '79909', '73477', '13'), +('2', '77', '15', '80686', '69765', '13'), +('2', '77', '15', '79908', '67046', '13'), +('2', '77', '20', '80690', '70015', '13'), +('2', '77', '20', '46886', '61184', '13'), +('2', '77', '20', '80620', '59969', '13'), +('2', '77', '20', '46869', '56359', '13'), +('2', '77', '12', '53371', '54427', '13'), +('2', '77', '12', '83568', '41886', '13'), +('2', '77', '12', '70863', '37681', '13'), +('2', '77', '12', '83540', '34825', '13'), +('2', '77', '18', '83607', '90060', '13'), +('2', '77', '18', '70866', '69907', '13'), +('2', '77', '18', '53374', '56212', '13'), +('2', '77', '18', '39894', '48417', '13'), +('2', '77', '19', '83572', '66536', '13'), +('2', '77', '19', '70864', '57173', '13'), +('2', '77', '19', '53372', '54723', '13'), +('2', '77', '19', '71076', '45506', '13'), +('2', '77', '13', '83631', '67484', '13'), +('2', '77', '13', '80663', '63758', '13'), +('2', '77', '13', '39211', '52795', '13'), +('2', '77', '13', '83460', '52243', '13'), +('2', '77', '14', '80682', '65095', '13'), +('2', '77', '14', '80665', '64844', '13'), +('2', '77', '14', '80625', '59541', '13'), +('2', '77', '14', '69155', '58833', '13'), +('2', '77', '11', '39287', '87370', '13'), +('2', '77', '11', '80668', '69865', '13'), +('2', '77', '11', '46939', '61506', '13'), +('2', '77', '11', '80619', '60880', '13'), +('2', '78', '22', '21807', '0', '13'), +('2', '78', '22', '21805', '0', '13'), +('2', '78', '22', '12425', '0', '13'), +('2', '78', '22', '39342', '0', '13'), +('2', '78', '1', '39329', '84095', '13'), +('2', '78', '1', '80676', '69858', '13'), +('2', '78', '1', '80660', '66730', '13'), +('2', '78', '1', '80639', '63607', '13'), +('2', '78', '2', '53368', '54818', '13'), +('2', '78', '2', '83560', '39442', '13'), +('2', '78', '2', '70860', '38338', '13'), +('2', '78', '2', '39222', '37080', '13'), +('2', '78', '3', '80647', '63908', '13'), +('2', '78', '3', '46923', '56037', '13'), +('2', '78', '3', '69068', '52452', '13'), +('2', '78', '3', '46852', '51262', '13'), +('2', '78', '5', '80661', '67729', '13'), +('2', '78', '5', '46934', '60617', '13'), +('2', '78', '5', '80626', '60486', '13'), +('2', '78', '5', '46917', '56769', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '78', '8', '39293', '84248', '13'), +('2', '78', '8', '80689', '70023', '13'), +('2', '78', '8', '80649', '63658', '13'), +('2', '78', '8', '46936', '60859', '13'), +('2', '78', '6', '71666', '70135', '13'), +('2', '78', '6', '83660', '68267', '13'), +('2', '78', '6', '39269', '66452', '13'), +('2', '78', '6', '80645', '63958', '13'), +('2', '78', '17', '83603', '59769', '13'), +('2', '78', '17', '70701', '57566', '13'), +('2', '78', '17', '53373', '57013', '13'), +('2', '78', '17', '69150', '43609', '13'), +('2', '78', '7', '53369', '54638', '13'), +('2', '78', '7', '39267', '41456', '13'), +('2', '78', '7', '83564', '40992', '13'), +('2', '78', '7', '70861', '37686', '13'), +('2', '78', '9', '51706', '86312', '13'), +('2', '78', '9', '39216', '60628', '13'), +('2', '78', '9', '46887', '60265', '13'), +('2', '78', '9', '69126', '54966', '13'), +('2', '78', '15', '83629', '83430', '13'), +('2', '78', '15', '79909', '73483', '13'), +('2', '78', '15', '80686', '69773', '13'), +('2', '78', '15', '79908', '67051', '13'), +('2', '78', '20', '80690', '70023', '13'), +('2', '78', '20', '46886', '61192', '13'), +('2', '78', '20', '80620', '59969', '13'), +('2', '78', '20', '46869', '56366', '13'), +('2', '78', '12', '53371', '54432', '13'), +('2', '78', '12', '83568', '41892', '13'), +('2', '78', '12', '70863', '37688', '13'), +('2', '78', '12', '83540', '34830', '13'), +('2', '78', '18', '83607', '87065', '13'), +('2', '78', '18', '70866', '67662', '13'), +('2', '78', '18', '53374', '56220', '13'), +('2', '78', '18', '39894', '46919', '13'), +('2', '78', '19', '83572', '64792', '13'), +('2', '78', '19', '70864', '55681', '13'), +('2', '78', '19', '53372', '54723', '13'), +('2', '78', '19', '39355', '44934', '13'), +('2', '78', '13', '83631', '65740', '13'), +('2', '78', '13', '80663', '63763', '13'), +('2', '78', '13', '39211', '51800', '13'), +('2', '78', '13', '83460', '50498', '13'), +('2', '78', '14', '80682', '65100', '13'), +('2', '78', '14', '80665', '64849', '13'), +('2', '78', '14', '80625', '59546', '13'), +('2', '78', '14', '69155', '56833', '13'), +('2', '78', '11', '39287', '84376', '13'), +('2', '78', '11', '80668', '69872', '13'), +('2', '78', '11', '46939', '61514', '13'), +('2', '78', '11', '80619', '60886', '13'), +('2', '79', '22', '21807', '0', '13'), +('2', '79', '22', '21805', '0', '13'), +('2', '79', '22', '12425', '0', '13'), +('2', '79', '22', '39342', '0', '13'), +('2', '79', '1', '39329', '81100', '13'), +('2', '79', '1', '80676', '69866', '13'), +('2', '79', '1', '80660', '66737', '13'), +('2', '79', '1', '80639', '63614', '13'), +('2', '79', '2', '53368', '54825', '13'), +('2', '79', '2', '83560', '39448', '13'), +('2', '79', '2', '70860', '38344', '13'), +('2', '79', '2', '39222', '37084', '13'), +('2', '79', '3', '80647', '63915', '13'), +('2', '79', '3', '46923', '56043', '13'), +('2', '79', '3', '46852', '51270', '13'), +('2', '79', '3', '39368', '50866', '13'), +('2', '79', '5', '80661', '67736', '13'), +('2', '79', '5', '46934', '60624', '13'), +('2', '79', '5', '80626', '60492', '13'), +('2', '79', '5', '46917', '56775', '13'), +('2', '79', '8', '39293', '81253', '13'), +('2', '79', '8', '80689', '70030', '13'), +('2', '79', '8', '80649', '63665', '13'), +('2', '79', '8', '46936', '60867', '13'), +('2', '79', '6', '71666', '67641', '13'), +('2', '79', '6', '83660', '66517', '13'), +('2', '79', '6', '39269', '64708', '13'), +('2', '79', '6', '80645', '63965', '13'), +('2', '79', '17', '83603', '58774', '13'), +('2', '79', '17', '53373', '57020', '13'), +('2', '79', '17', '70701', '55571', '13'), +('2', '79', '17', '70865', '43475', '13'), +('2', '79', '7', '53369', '54644', '13'), +('2', '79', '7', '39267', '41461', '13'), +('2', '79', '7', '83564', '40998', '13'), +('2', '79', '7', '70861', '37690', '13'), +('2', '79', '9', '51706', '83317', '13'), +('2', '79', '9', '46887', '60272', '13'), +('2', '79', '9', '39216', '58882', '13'), +('2', '79', '9', '53370', '54143', '13'), +('2', '79', '15', '83629', '80436', '13'), +('2', '79', '15', '79909', '73490', '13'), +('2', '79', '15', '80686', '69780', '13'), +('2', '79', '15', '79908', '67057', '13'), +('2', '79', '20', '80690', '70030', '13'), +('2', '79', '20', '46886', '61201', '13'), +('2', '79', '20', '80620', '59969', '13'), +('2', '79', '20', '46869', '56373', '13'), +('2', '79', '12', '53371', '54436', '13'), +('2', '79', '12', '83568', '41898', '13'), +('2', '79', '12', '70863', '37694', '13'), +('2', '79', '12', '83540', '34834', '13'), +('2', '79', '18', '83607', '84070', '13'), +('2', '79', '18', '70866', '65418', '13'), +('2', '79', '18', '53374', '56227', '13'), +('2', '79', '18', '39894', '45422', '13'), +('2', '79', '19', '83572', '63048', '13'), +('2', '79', '19', '53372', '54723', '13'), +('2', '79', '19', '70864', '54189', '13'), +('2', '79', '19', '39355', '44939', '13'), +('2', '79', '13', '83631', '63997', '13'), +('2', '79', '13', '80663', '63768', '13'), +('2', '79', '13', '39211', '50805', '13'), +('2', '79', '13', '46991', '49910', '13'), +('2', '79', '14', '80682', '65105', '13'), +('2', '79', '14', '80665', '64854', '13'), +('2', '79', '14', '80625', '59551', '13'), +('2', '79', '14', '46925', '56332', '13'), +('2', '79', '11', '39287', '81381', '13'), +('2', '79', '11', '80668', '69879', '13'), +('2', '79', '11', '46939', '61521', '13'), +('2', '79', '11', '80619', '60893', '13'), +('2', '80', '22', '21807', '0', '14'), +('2', '80', '22', '21805', '0', '14'), +('2', '80', '22', '12425', '0', '14'), +('2', '80', '22', '39342', '0', '14'), +('2', '80', '1', '102611', '91338', '14'), +('2', '80', '1', '102640', '90651', '14'), +('2', '80', '1', '102639', '90576', '14'), +('2', '80', '1', '102641', '90496', '14'), +('2', '80', '2', '102003', '60766', '14'), +('2', '80', '2', '53368', '54832', '14'), +('2', '80', '2', '102255', '54703', '14'), +('2', '80', '2', '83560', '39454', '14'), +('2', '80', '3', '102612', '97077', '14'), +('2', '80', '3', '102626', '95174', '14'), +('2', '80', '3', '102742', '87957', '14'), +('2', '80', '3', '102560', '84724', '14'), +('2', '80', '5', '102731', '101451', '14'), +('2', '80', '5', '102613', '95206', '14'), +('2', '80', '5', '102627', '93481', '14'), +('2', '80', '5', '102730', '87888', '14'), +('2', '80', '8', '102728', '99782', '14'), +('2', '80', '8', '102615', '97032', '14'), +('2', '80', '8', '102629', '95570', '14'), +('2', '80', '8', '102569', '84816', '14'), +('2', '80', '6', '102614', '97795', '14'), +('2', '80', '6', '102628', '95731', '14'), +('2', '80', '6', '102561', '84912', '14'), +('2', '80', '6', '71666', '65147', '14'), +('2', '80', '17', '102006', '64440', '14'), +('2', '80', '17', '102258', '58559', '14'), +('2', '80', '17', '83603', '57779', '14'), +('2', '80', '17', '53373', '57027', '14'), +('2', '80', '7', '102004', '61492', '14'), +('2', '80', '7', '102256', '55108', '14'), +('2', '80', '7', '53369', '54650', '14'), +('2', '80', '7', '39267', '41466', '14'), +('2', '80', '9', '67098', '159947', '14'), +('2', '80', '9', '51706', '80321', '14'), +('2', '80', '9', '46887', '60279', '14'), +('2', '80', '9', '39216', '57136', '14'), +('2', '80', '15', '102723', '100581', '14'), +('2', '80', '15', '102616', '92907', '14'), +('2', '80', '15', '102636', '91860', '14'), +('2', '80', '15', '102635', '91664', '14'), +('2', '80', '20', '102617', '97391', '14'), +('2', '80', '20', '102631', '95913', '14'), +('2', '80', '20', '102563', '84526', '14'), +('2', '80', '20', '80690', '70038', '14'), +('2', '80', '12', '53371', '54440', '14'), +('2', '80', '12', '102253', '52318', '14'), +('2', '80', '12', '83568', '41905', '14'), +('2', '80', '12', '70863', '37700', '14'), +('2', '80', '18', '83607', '81075', '14'), +('2', '80', '18', '70866', '63173', '14'), +('2', '80', '18', '102005', '62321', '14'), +('2', '80', '18', '102257', '56242', '14'), +('2', '80', '19', '83572', '61305', '14'), +('2', '80', '19', '53372', '54723', '14'), +('2', '80', '19', '102254', '53327', '14'), +('2', '80', '19', '70864', '52697', '14'), +('2', '80', '13', '93856', '97138', '14'), +('2', '80', '13', '102735', '87782', '14'), +('2', '80', '13', '102734', '80948', '14'), +('2', '80', '13', '102582', '77531', '14'), +('2', '80', '14', '102633', '96197', '14'), +('2', '80', '14', '102632', '96180', '14'), +('2', '80', '14', '102570', '83406', '14'), +('2', '80', '14', '80682', '65111', '14'), +('2', '80', '11', '102643', '92601', '14'), +('2', '80', '11', '39287', '78387', '14'), +('2', '80', '11', '80668', '69887', '14'), +('2', '80', '11', '46939', '61528', '14'), +('2', '81', '22', '21807', '0', '14'), +('2', '81', '22', '21805', '0', '14'), +('2', '81', '22', '12425', '0', '14'), +('2', '81', '22', '39342', '0', '14'), +('2', '81', '1', '102611', '91345', '14'), +('2', '81', '1', '102640', '90657', '14'), +('2', '81', '1', '102639', '90581', '14'), +('2', '81', '1', '102641', '90502', '14'), +('2', '81', '2', '102003', '60772', '14'), +('2', '81', '2', '53368', '54839', '14'), +('2', '81', '2', '102255', '54707', '14'), +('2', '81', '2', '83560', '39461', '14'), +('2', '81', '3', '102612', '97083', '14'), +('2', '81', '3', '102626', '95179', '14'), +('2', '81', '3', '102742', '87966', '14'), +('2', '81', '3', '102560', '84730', '14'), +('2', '81', '5', '102731', '101460', '14'), +('2', '81', '5', '102613', '95211', '14'), +('2', '81', '5', '102627', '93486', '14'), +('2', '81', '5', '102730', '87895', '14'), +('2', '81', '8', '102728', '99789', '14'), +('2', '81', '8', '102615', '97040', '14'), +('2', '81', '8', '102629', '95575', '14'), +('2', '81', '8', '102569', '84825', '14'), +('2', '81', '6', '102614', '97803', '14'), +('2', '81', '6', '102628', '95738', '14'), +('2', '81', '6', '102561', '84921', '14'), +('2', '81', '6', '80645', '63978', '14'), +('2', '81', '17', '102006', '64442', '14'), +('2', '81', '17', '102258', '58566', '14'), +('2', '81', '17', '53373', '57034', '14'), +('2', '81', '17', '83603', '56784', '14'), +('2', '81', '7', '102004', '61497', '14'), +('2', '81', '7', '102256', '55114', '14'), +('2', '81', '7', '53369', '54656', '14'), +('2', '81', '7', '39267', '41471', '14'), +('2', '81', '9', '67098', '161951', '14'), +('2', '81', '9', '51706', '77326', '14'), +('2', '81', '9', '46887', '60286', '14'), +('2', '81', '9', '39216', '55390', '14'), +('2', '81', '15', '102723', '100588', '14'), +('2', '81', '15', '102616', '92916', '14'), +('2', '81', '15', '102636', '91868', '14'), +('2', '81', '15', '102635', '91669', '14'), +('2', '81', '20', '102617', '97393', '14'), +('2', '81', '20', '102631', '95922', '14'), +('2', '81', '20', '102563', '84532', '14'), +('2', '81', '20', '80690', '70045', '14'), +('2', '81', '12', '53371', '54444', '14'), +('2', '81', '12', '102253', '52322', '14'), +('2', '81', '12', '83568', '41911', '14'), +('2', '81', '12', '70863', '37706', '14'), +('2', '81', '18', '83607', '78080', '14'), +('2', '81', '18', '102005', '62328', '14'), +('2', '81', '18', '70866', '60928', '14'), +('2', '81', '18', '102257', '56247', '14'), +('2', '81', '19', '83572', '59561', '14'), +('2', '81', '19', '53372', '54724', '14'), +('2', '81', '19', '102254', '53333', '14'), +('2', '81', '19', '76131', '51298', '14'), +('2', '81', '13', '93856', '98358', '14'), +('2', '81', '13', '102735', '87789', '14'), +('2', '81', '13', '102734', '80955', '14'), +('2', '81', '13', '102582', '77539', '14'), +('2', '81', '14', '102633', '96203', '14'), +('2', '81', '14', '102632', '96188', '14'), +('2', '81', '14', '102570', '83408', '14'), +('2', '81', '14', '80682', '65116', '14'), +('2', '81', '11', '102643', '92605', '14'), +('2', '81', '11', '39287', '75392', '14'), +('2', '81', '11', '80668', '69894', '14'), +('2', '81', '11', '46939', '61535', '14'), +('2', '82', '22', '21807', '0', '14'), +('2', '82', '22', '21805', '0', '14'), +('2', '82', '22', '12425', '0', '14'), +('2', '82', '22', '39342', '0', '14'), +('2', '82', '1', '102611', '91352', '14'), +('2', '82', '1', '102640', '90662', '14'), +('2', '82', '1', '102639', '90585', '14'), +('2', '82', '1', '102641', '90508', '14'), +('2', '82', '2', '102003', '60778', '14'), +('2', '82', '2', '53368', '54846', '14'), +('2', '82', '2', '102255', '54712', '14'), +('2', '82', '2', '83560', '39467', '14'), +('2', '82', '3', '102612', '97089', '14'), +('2', '82', '3', '102626', '95185', '14'), +('2', '82', '3', '102742', '87974', '14'), +('2', '82', '3', '102560', '84737', '14'), +('2', '82', '5', '102731', '101469', '14'), +('2', '82', '5', '102613', '95215', '14'), +('2', '82', '5', '102627', '93491', '14'), +('2', '82', '5', '102730', '87902', '14'), +('2', '82', '8', '102728', '99796', '14'), +('2', '82', '8', '102615', '97047', '14'), +('2', '82', '8', '102629', '95579', '14'), +('2', '82', '8', '102569', '84835', '14'), +('2', '82', '6', '102614', '97810', '14'), +('2', '82', '6', '102628', '95745', '14'), +('2', '82', '6', '102561', '84930', '14'), +('2', '82', '6', '80645', '63984', '14'), +('2', '82', '17', '102006', '64444', '14'), +('2', '82', '17', '102258', '58573', '14'), +('2', '82', '17', '53373', '57041', '14'), +('2', '82', '17', '83603', '55789', '14'), +('2', '82', '7', '102004', '61501', '14'), +('2', '82', '7', '102256', '55119', '14'), +('2', '82', '7', '53369', '54662', '14'), +('2', '82', '7', '39267', '41476', '14'), +('2', '82', '9', '67098', '163955', '14'), +('2', '82', '9', '51706', '74331', '14'), +('2', '82', '9', '46887', '60293', '14'), +('2', '82', '9', '53370', '54162', '14'), +('2', '82', '15', '102723', '100595', '14'), +('2', '82', '15', '102616', '92924', '14'), +('2', '82', '15', '102636', '91876', '14'), +('2', '82', '15', '102635', '91675', '14'), +('2', '82', '20', '102617', '97396', '14'), +('2', '82', '20', '102631', '95931', '14'), +('2', '82', '20', '102563', '84538', '14'), +('2', '82', '20', '80690', '70052', '14'), +('2', '82', '12', '53371', '54448', '14'), +('2', '82', '12', '102253', '52327', '14'), +('2', '82', '12', '83568', '41917', '14'), +('2', '82', '12', '70863', '37712', '14'), +('2', '82', '18', '83607', '75086', '14'), +('2', '82', '18', '102005', '62336', '14'), +('2', '82', '18', '70866', '58683', '14'), +('2', '82', '18', '102257', '56252', '14'), +('2', '82', '19', '83572', '57817', '14'), +('2', '82', '19', '53372', '54724', '14'), +('2', '82', '19', '102254', '53340', '14'), +('2', '82', '19', '76131', '51301', '14'), +('2', '82', '13', '93856', '99578', '14'), +('2', '82', '13', '102735', '87796', '14'), +('2', '82', '13', '102734', '80961', '14'), +('2', '82', '13', '102582', '77548', '14'), +('2', '82', '14', '102633', '96209', '14'), +('2', '82', '14', '102632', '96196', '14'), +('2', '82', '14', '102570', '83410', '14'), +('2', '82', '14', '80682', '65121', '14'), +('2', '82', '11', '102643', '92609', '14'), +('2', '82', '11', '39287', '72397', '14'), +('2', '82', '11', '80668', '69901', '14'), +('2', '82', '11', '46939', '61542', '14'), +('2', '83', '22', '21807', '0', '14'), +('2', '83', '22', '21805', '0', '14'), +('2', '83', '22', '12425', '0', '14'), +('2', '83', '22', '39342', '0', '14'), +('2', '83', '1', '102611', '91358', '14'), +('2', '83', '1', '102640', '90668', '14'), +('2', '83', '1', '102639', '90590', '14'), +('2', '83', '1', '102641', '90515', '14'), +('2', '83', '2', '102003', '60784', '14'), +('2', '83', '2', '53368', '54853', '14'), +('2', '83', '2', '102255', '54717', '14'), +('2', '83', '2', '83560', '39473', '14'), +('2', '83', '3', '102612', '97095', '14'), +('2', '83', '3', '102626', '95190', '14'), +('2', '83', '3', '102742', '87982', '14'), +('2', '83', '3', '102560', '84743', '14'), +('2', '83', '5', '102731', '101478', '14'), +('2', '83', '5', '102613', '95219', '14'), +('2', '83', '5', '102627', '93495', '14'), +('2', '83', '5', '102730', '87909', '14'), +('2', '83', '8', '102728', '99803', '14'), +('2', '83', '8', '102615', '97055', '14'), +('2', '83', '8', '102629', '95584', '14'), +('2', '83', '8', '102569', '84844', '14'), +('2', '83', '6', '102614', '97818', '14'), +('2', '83', '6', '102628', '95751', '14'), +('2', '83', '6', '102561', '84940', '14'), +('2', '83', '6', '80645', '63991', '14'), +('2', '83', '17', '102006', '64446', '14'), +('2', '83', '17', '102258', '58579', '14'), +('2', '83', '17', '53373', '57048', '14'), +('2', '83', '17', '83603', '54795', '14'), +('2', '83', '7', '102004', '61506', '14'), +('2', '83', '7', '102256', '55125', '14'), +('2', '83', '7', '53369', '54668', '14'), +('2', '83', '7', '39267', '41482', '14'), +('2', '83', '9', '67098', '165960', '14'), +('2', '83', '9', '51706', '71335', '14'), +('2', '83', '9', '46887', '60300', '14'), +('2', '83', '9', '53370', '54168', '14'), +('2', '83', '15', '102723', '100602', '14'), +('2', '83', '15', '102616', '92933', '14'), +('2', '83', '15', '102636', '91883', '14'), +('2', '83', '15', '102635', '91680', '14'), +('2', '83', '20', '102617', '97398', '14'), +('2', '83', '20', '102631', '95940', '14'), +('2', '83', '20', '102563', '84544', '14'), +('2', '83', '20', '80690', '70060', '14'), +('2', '83', '12', '53371', '54452', '14'), +('2', '83', '12', '102253', '52331', '14'), +('2', '83', '12', '83568', '41923', '14'), +('2', '83', '12', '70863', '37718', '14'), +('2', '83', '18', '83607', '72091', '14'), +('2', '83', '18', '102005', '62343', '14'), +('2', '83', '18', '70866', '56438', '14'), +('2', '83', '18', '102257', '56257', '14'), +('2', '83', '19', '83572', '56073', '14'), +('2', '83', '19', '53372', '54724', '14'), +('2', '83', '19', '102254', '53346', '14'), +('2', '83', '19', '76131', '51304', '14'), +('2', '83', '13', '93856', '100799', '14'), +('2', '83', '13', '102735', '87803', '14'), +('2', '83', '13', '102734', '80967', '14'), +('2', '83', '13', '102582', '77556', '14'), +('2', '83', '14', '102633', '96215', '14'), +('2', '83', '14', '102632', '96203', '14'), +('2', '83', '14', '102570', '83412', '14'), +('2', '83', '14', '80682', '65126', '14'), +('2', '83', '11', '102643', '92612', '14'), +('2', '83', '11', '80668', '69909', '14'), +('2', '83', '11', '39287', '69403', '14'), +('2', '83', '11', '46939', '61549', '14'), +('2', '84', '22', '21807', '0', '14'), +('2', '84', '22', '21805', '0', '14'), +('2', '84', '22', '12425', '0', '14'), +('2', '84', '22', '39342', '0', '14'), +('2', '84', '1', '102611', '91365', '14'), +('2', '84', '1', '102640', '90673', '14'), +('2', '84', '1', '102639', '90595', '14'), +('2', '84', '1', '102641', '90521', '14'), +('2', '84', '2', '102003', '60789', '14'), +('2', '84', '2', '53368', '54860', '14'), +('2', '84', '2', '102255', '54722', '14'), +('2', '84', '2', '83560', '39479', '14'), +('2', '84', '3', '102612', '97100', '14'), +('2', '84', '3', '102626', '95195', '14'), +('2', '84', '3', '102742', '87990', '14'), +('2', '84', '3', '102560', '84750', '14'), +('2', '84', '5', '102731', '101487', '14'), +('2', '84', '5', '102613', '95224', '14'), +('2', '84', '5', '102627', '93500', '14'), +('2', '84', '5', '102730', '87916', '14'), +('2', '84', '8', '102728', '99810', '14'), +('2', '84', '8', '102615', '97063', '14'), +('2', '84', '8', '102629', '95588', '14'), +('2', '84', '8', '102569', '84854', '14'), +('2', '84', '6', '102614', '97825', '14'), +('2', '84', '6', '102628', '95758', '14'), +('2', '84', '6', '102561', '84949', '14'), +('2', '84', '6', '80645', '63997', '14'), +('2', '84', '17', '102006', '64448', '14'), +('2', '84', '17', '102258', '58586', '14'), +('2', '84', '17', '53373', '57055', '14'), +('2', '84', '17', '83603', '53800', '14'), +('2', '84', '7', '102004', '61511', '14'), +('2', '84', '7', '102256', '55131', '14'), +('2', '84', '7', '53369', '54675', '14'), +('2', '84', '7', '39267', '41487', '14'), +('2', '84', '9', '67098', '167964', '14'), +('2', '84', '9', '51706', '68340', '14'), +('2', '84', '9', '46887', '60308', '14'), +('2', '84', '9', '53370', '54174', '14'), +('2', '84', '15', '102723', '100609', '14'), +('2', '84', '15', '102616', '92942', '14'), +('2', '84', '15', '102636', '91891', '14'), +('2', '84', '15', '102635', '91685', '14'), +('2', '84', '20', '102617', '97400', '14'), +('2', '84', '20', '102631', '95949', '14'), +('2', '84', '20', '102563', '84550', '14'), +('2', '84', '20', '80690', '70067', '14'), +('2', '84', '12', '53371', '54456', '14'), +('2', '84', '12', '102253', '52336', '14'), +('2', '84', '12', '83568', '41929', '14'), +('2', '84', '12', '70863', '37725', '14'), +('2', '84', '18', '83607', '69096', '14'), +('2', '84', '18', '102005', '62351', '14'), +('2', '84', '18', '53374', '56262', '14'), +('2', '84', '18', '102257', '56261', '14'), +('2', '84', '19', '53372', '54724', '14'), +('2', '84', '19', '83572', '54329', '14'), +('2', '84', '19', '102254', '53353', '14'), +('2', '84', '19', '76131', '51308', '14'), +('2', '84', '13', '93856', '102019', '14'), +('2', '84', '13', '102735', '87810', '14'), +('2', '84', '13', '102734', '80973', '14'), +('2', '84', '13', '102582', '77564', '14'), +('2', '84', '14', '102633', '96221', '14'), +('2', '84', '14', '102632', '96211', '14'), +('2', '84', '14', '102570', '83414', '14'), +('2', '84', '14', '80682', '65131', '14'), +('2', '84', '11', '102643', '92616', '14'), +('2', '84', '11', '80668', '69916', '14'), +('2', '84', '11', '39287', '66408', '14'), +('2', '84', '11', '46939', '61556', '14'), +('2', '85', '22', '12425', '0', '16'), +('2', '85', '22', '39342', '0', '16'), +('2', '85', '22', '7867', '0', '16'), +('2', '85', '22', '23597', '0', '16'), +('2', '85', '1', '111304', '176358', '16'), +('2', '85', '1', '111307', '176217', '16'), +('2', '85', '1', '111310', '174919', '16'), +('2', '85', '1', '111301', '174906', '16'), +('2', '85', '2', '62988', '110463', '16'), +('2', '85', '2', '62985', '110199', '16'), +('2', '85', '2', '94056', '109897', '16'), +('2', '85', '2', '89368', '102725', '16'), +('2', '85', '3', '111314', '177076', '16'), +('2', '85', '3', '111316', '175364', '16'), +('2', '85', '3', '111315', '174481', '16'), +('2', '85', '3', '111013', '155225', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '85', '5', '111319', '176439', '16'), +('2', '85', '5', '111318', '173715', '16'), +('2', '85', '5', '111317', '173430', '16'), +('2', '85', '5', '111320', '173059', '16'), +('2', '85', '8', '111332', '177256', '16'), +('2', '85', '8', '111330', '175102', '16'), +('2', '85', '8', '111331', '172795', '16'), +('2', '85', '8', '111328', '172617', '16'), +('2', '85', '6', '111323', '177160', '16'), +('2', '85', '6', '111326', '175721', '16'), +('2', '85', '6', '111324', '174164', '16'), +('2', '85', '6', '111022', '155309', '16'), +('2', '85', '17', '56046', '114200', '16'), +('2', '85', '17', '56083', '114169', '16'), +('2', '85', '17', '81765', '114137', '16'), +('2', '85', '17', '104406', '96451', '16'), +('2', '85', '7', '56080', '109963', '16'), +('2', '85', '7', '94053', '109030', '16'), +('2', '85', '7', '89369', '103833', '16'), +('2', '85', '7', '104404', '92337', '16'), +('2', '85', '9', '67098', '169969', '16'), +('2', '85', '9', '81764', '106488', '16'), +('2', '85', '9', '56070', '106376', '16'), +('2', '85', '9', '62984', '106172', '16'), +('2', '85', '15', '111350', '178547', '16'), +('2', '85', '15', '111344', '177651', '16'), +('2', '85', '15', '111340', '177028', '16'), +('2', '85', '15', '111342', '174803', '16'), +('2', '85', '20', '111356', '177093', '16'), +('2', '85', '20', '111352', '176409', '16'), +('2', '85', '20', '111351', '173687', '16'), +('2', '85', '20', '111054', '155242', '16'), +('2', '85', '12', '105332', '128954', '16'), +('2', '85', '12', '56035', '108248', '16'), +('2', '85', '12', '56073', '107142', '16'), +('2', '85', '12', '89366', '100764', '16'), +('2', '85', '18', '56041', '113901', '16'), +('2', '85', '18', '94054', '112704', '16'), +('2', '85', '18', '62986', '112405', '16'), +('2', '85', '18', '62987', '110803', '16'), +('2', '85', '19', '81763', '110615', '16'), +('2', '85', '19', '62990', '110360', '16'), +('2', '85', '19', '56037', '110300', '16'), +('2', '85', '19', '56075', '110169', '16'), +('2', '85', '13', '111518', '170524', '16'), +('2', '85', '13', '111517', '168797', '16'), +('2', '85', '13', '111217', '154140', '16'), +('2', '85', '13', '111218', '154085', '16'), +('2', '85', '14', '111537', '177367', '16'), +('2', '85', '14', '111539', '175570', '16'), +('2', '85', '14', '111535', '175199', '16'), +('2', '85', '14', '111237', '155515', '16'), +('2', '85', '11', '111334', '176643', '16'), +('2', '85', '11', '111337', '176437', '16'), +('2', '85', '11', '111338', '172544', '16'), +('2', '85', '11', '111033', '154892', '16'), +('2', '85', '22', '12425', '0', '15'), +('2', '85', '22', '21807', '0', '15'), +('2', '85', '22', '39342', '0', '15'), +('2', '85', '22', '7867', '0', '15'), +('2', '85', '1', '107053', '129234', '15'), +('2', '85', '1', '107028', '128672', '15'), +('2', '85', '1', '107029', '128352', '15'), +('2', '85', '1', '107052', '128045', '15'), +('2', '85', '2', '62988', '110463', '15'), +('2', '85', '2', '62985', '110199', '15'), +('2', '85', '2', '94056', '109897', '15'), +('2', '85', '2', '89368', '102725', '15'), +('2', '85', '3', '107030', '130637', '15'), +('2', '85', '3', '107055', '128774', '15'), +('2', '85', '3', '106819', '122572', '15'), +('2', '85', '3', '106841', '121153', '15'), +('2', '85', '5', '107056', '128309', '15'), +('2', '85', '5', '107031', '128155', '15'), +('2', '85', '5', '106820', '123178', '15'), +('2', '85', '5', '106747', '109372', '15'), +('2', '85', '8', '107033', '130785', '15'), +('2', '85', '8', '107058', '130630', '15'), +('2', '85', '8', '106822', '125195', '15'), +('2', '85', '8', '106844', '121692', '15'), +('2', '85', '6', '107032', '130838', '15'), +('2', '85', '6', '107057', '129718', '15'), +('2', '85', '6', '106821', '123481', '15'), +('2', '85', '6', '106843', '122006', '15'), +('2', '85', '17', '56046', '114200', '15'), +('2', '85', '17', '56083', '114169', '15'), +('2', '85', '17', '81765', '114137', '15'), +('2', '85', '17', '104406', '96451', '15'), +('2', '85', '7', '56080', '109963', '15'), +('2', '85', '7', '94053', '109030', '15'), +('2', '85', '7', '89369', '103833', '15'), +('2', '85', '7', '104404', '92337', '15'), +('2', '85', '9', '67098', '169969', '15'), +('2', '85', '9', '81764', '106488', '15'), +('2', '85', '9', '56070', '106376', '15'), +('2', '85', '9', '62984', '106172', '15'), +('2', '85', '15', '107035', '130255', '15'), +('2', '85', '15', '107036', '129172', '15'), +('2', '85', '15', '107061', '127928', '15'), +('2', '85', '15', '107051', '127613', '15'), +('2', '85', '20', '107037', '132838', '15'), +('2', '85', '20', '107059', '131341', '15'), +('2', '85', '20', '106825', '125285', '15'), +('2', '85', '20', '106845', '122817', '15'), +('2', '85', '12', '105332', '128954', '15'), +('2', '85', '12', '56035', '108248', '15'), +('2', '85', '12', '56073', '107142', '15'), +('2', '85', '12', '89366', '100764', '15'), +('2', '85', '18', '56041', '113901', '15'), +('2', '85', '18', '94054', '112704', '15'), +('2', '85', '18', '62986', '112405', '15'), +('2', '85', '18', '62987', '110803', '15'), +('2', '85', '19', '81763', '110615', '15'), +('2', '85', '19', '62990', '110360', '15'), +('2', '85', '19', '56037', '110300', '15'), +('2', '85', '19', '56075', '110169', '15'), +('2', '85', '13', '62966', '109230', '15'), +('2', '85', '13', '106761', '108555', '15'), +('2', '85', '13', '93856', '103240', '15'), +('2', '85', '13', '62998', '90749', '15'), +('2', '85', '14', '107063', '132014', '15'), +('2', '85', '14', '107065', '129964', '15'), +('2', '85', '14', '106850', '124807', '15'), +('2', '85', '14', '106852', '122448', '15'), +('2', '85', '11', '107034', '130985', '15'), +('2', '85', '11', '106823', '123332', '15'), +('2', '85', '11', '56099', '108639', '15'), +('2', '85', '11', '62965', '108563', '15'), +('2', '86', '22', '12425', '0', '16'), +('2', '86', '22', '39342', '0', '16'), +('2', '86', '22', '7867', '0', '16'), +('2', '86', '22', '23597', '0', '16'), +('2', '86', '1', '111304', '176366', '16'), +('2', '86', '1', '111307', '176220', '16'), +('2', '86', '1', '111310', '174925', '16'), +('2', '86', '1', '111301', '174912', '16'), +('2', '86', '2', '62988', '110467', '16'), +('2', '86', '2', '62985', '110208', '16'), +('2', '86', '2', '94056', '109902', '16'), +('2', '86', '2', '89368', '102731', '16'), +('2', '86', '3', '111314', '177082', '16'), +('2', '86', '3', '111316', '175371', '16'), +('2', '86', '3', '111315', '174487', '16'), +('2', '86', '3', '111013', '155231', '16'), +('2', '86', '5', '111319', '176444', '16'), +('2', '86', '5', '111318', '173720', '16'), +('2', '86', '5', '111317', '173436', '16'), +('2', '86', '5', '111320', '173065', '16'), +('2', '86', '8', '111332', '177263', '16'), +('2', '86', '8', '111330', '175108', '16'), +('2', '86', '8', '111331', '172803', '16'), +('2', '86', '8', '111328', '172621', '16'), +('2', '86', '6', '111323', '177167', '16'), +('2', '86', '6', '111326', '175730', '16'), +('2', '86', '6', '111324', '174169', '16'), +('2', '86', '6', '111022', '155316', '16'), +('2', '86', '17', '56046', '114206', '16'), +('2', '86', '17', '56083', '114173', '16'), +('2', '86', '17', '81765', '114142', '16'), +('2', '86', '17', '104406', '96457', '16'), +('2', '86', '7', '56080', '109970', '16'), +('2', '86', '7', '94053', '109034', '16'), +('2', '86', '7', '89369', '103838', '16'), +('2', '86', '7', '104404', '92344', '16'), +('2', '86', '9', '67098', '171974', '16'), +('2', '86', '9', '81764', '106498', '16'), +('2', '86', '9', '56070', '106382', '16'), +('2', '86', '9', '62984', '106178', '16'), +('2', '86', '15', '111350', '178555', '16'), +('2', '86', '15', '111344', '177659', '16'), +('2', '86', '15', '111340', '177034', '16'), +('2', '86', '15', '111342', '174809', '16'), +('2', '86', '20', '111356', '177098', '16'), +('2', '86', '20', '111352', '176416', '16'), +('2', '86', '20', '111351', '173694', '16'), +('2', '86', '20', '111054', '155247', '16'), +('2', '86', '12', '105332', '128956', '16'), +('2', '86', '12', '56035', '108258', '16'), +('2', '86', '12', '56073', '107149', '16'), +('2', '86', '12', '89366', '100769', '16'), +('2', '86', '18', '56041', '113907', '16'), +('2', '86', '18', '94054', '112709', '16'), +('2', '86', '18', '62986', '112413', '16'), +('2', '86', '18', '62987', '110808', '16'), +('2', '86', '19', '81763', '110625', '16'), +('2', '86', '19', '62990', '110364', '16'), +('2', '86', '19', '56037', '110307', '16'), +('2', '86', '19', '56075', '110177', '16'), +('2', '86', '13', '111518', '170531', '16'), +('2', '86', '13', '111517', '168803', '16'), +('2', '86', '13', '111217', '154146', '16'), +('2', '86', '13', '111218', '154091', '16'), +('2', '86', '14', '111537', '177374', '16'), +('2', '86', '14', '111539', '175577', '16'), +('2', '86', '14', '111535', '175205', '16'), +('2', '86', '14', '111237', '155522', '16'), +('2', '86', '11', '111334', '176649', '16'), +('2', '86', '11', '111337', '176446', '16'), +('2', '86', '11', '111338', '172549', '16'), +('2', '86', '11', '111033', '154899', '16'), +('2', '87', '22', '12425', '0', '16'), +('2', '87', '22', '39342', '0', '16'), +('2', '87', '22', '7867', '0', '16'), +('2', '87', '22', '23597', '0', '16'), +('2', '87', '1', '111304', '176373', '16'), +('2', '87', '1', '111307', '176224', '16'), +('2', '87', '1', '111310', '174931', '16'), +('2', '87', '1', '111301', '174919', '16'), +('2', '87', '2', '62988', '110471', '16'), +('2', '87', '2', '62985', '110216', '16'), +('2', '87', '2', '94056', '109908', '16'), +('2', '87', '2', '89368', '102737', '16'), +('2', '87', '3', '111314', '177088', '16'), +('2', '87', '3', '111316', '175377', '16'), +('2', '87', '3', '111315', '174493', '16'), +('2', '87', '3', '111013', '155238', '16'), +('2', '87', '5', '111319', '176450', '16'), +('2', '87', '5', '111318', '173726', '16'), +('2', '87', '5', '111317', '173442', '16'), +('2', '87', '5', '111320', '173070', '16'), +('2', '87', '8', '111332', '177270', '16'), +('2', '87', '8', '111330', '175114', '16'), +('2', '87', '8', '111331', '172811', '16'), +('2', '87', '8', '111328', '172625', '16'), +('2', '87', '6', '111323', '177173', '16'), +('2', '87', '6', '111326', '175739', '16'), +('2', '87', '6', '111324', '174174', '16'), +('2', '87', '6', '111022', '155323', '16'), +('2', '87', '17', '56046', '114212', '16'), +('2', '87', '17', '56083', '114176', '16'), +('2', '87', '17', '81765', '114147', '16'), +('2', '87', '17', '104406', '96464', '16'), +('2', '87', '7', '56080', '109978', '16'), +('2', '87', '7', '94053', '109039', '16'), +('2', '87', '7', '89369', '103844', '16'), +('2', '87', '7', '104404', '92352', '16'), +('2', '87', '9', '67098', '173978', '16'), +('2', '87', '9', '81764', '106508', '16'), +('2', '87', '9', '56070', '106388', '16'), +('2', '87', '9', '62984', '106184', '16'), +('2', '87', '15', '111350', '178563', '16'), +('2', '87', '15', '111344', '177667', '16'), +('2', '87', '15', '111340', '177041', '16'), +('2', '87', '15', '111342', '174816', '16'), +('2', '87', '20', '111356', '177103', '16'), +('2', '87', '20', '111352', '176422', '16'), +('2', '87', '20', '111351', '173701', '16'), +('2', '87', '20', '111054', '155252', '16'), +('2', '87', '12', '105332', '128958', '16'), +('2', '87', '12', '56035', '108267', '16'), +('2', '87', '12', '56073', '107155', '16'), +('2', '87', '12', '89366', '100774', '16'), +('2', '87', '18', '56041', '113913', '16'), +('2', '87', '18', '94054', '112714', '16'), +('2', '87', '18', '62986', '112420', '16'), +('2', '87', '18', '62987', '110813', '16'), +('2', '87', '19', '81763', '110635', '16'), +('2', '87', '19', '62990', '110369', '16'), +('2', '87', '19', '56037', '110315', '16'), +('2', '87', '19', '56075', '110185', '16'), +('2', '87', '13', '111518', '170537', '16'), +('2', '87', '13', '111517', '168809', '16'), +('2', '87', '13', '111217', '154152', '16'), +('2', '87', '13', '111218', '154098', '16'), +('2', '87', '14', '111537', '177380', '16'), +('2', '87', '14', '111539', '175585', '16'), +('2', '87', '14', '111535', '175211', '16'), +('2', '87', '14', '111237', '155529', '16'), +('2', '87', '11', '111334', '176655', '16'), +('2', '87', '11', '111337', '176455', '16'), +('2', '87', '11', '111338', '172554', '16'), +('2', '87', '11', '111033', '154905', '16'), +('2', '88', '22', '12425', '0', '16'), +('2', '88', '22', '39342', '0', '16'), +('2', '88', '22', '7867', '0', '16'), +('2', '88', '22', '23597', '0', '16'), +('2', '88', '1', '111304', '176381', '16'), +('2', '88', '1', '111307', '176228', '16'), +('2', '88', '1', '111310', '174937', '16'), +('2', '88', '1', '111301', '174925', '16'), +('2', '88', '2', '62988', '110475', '16'), +('2', '88', '2', '62985', '110224', '16'), +('2', '88', '2', '94056', '109913', '16'), +('2', '88', '2', '89368', '102742', '16'), +('2', '88', '3', '111314', '177094', '16'), +('2', '88', '3', '111316', '175383', '16'), +('2', '88', '3', '111315', '174500', '16'), +('2', '88', '3', '111013', '155244', '16'), +('2', '88', '5', '111319', '176455', '16'), +('2', '88', '5', '111318', '173731', '16'), +('2', '88', '5', '111317', '173448', '16'), +('2', '88', '5', '111320', '173075', '16'), +('2', '88', '8', '111332', '177277', '16'), +('2', '88', '8', '111330', '175120', '16'), +('2', '88', '8', '111331', '172818', '16'), +('2', '88', '8', '111328', '172629', '16'), +('2', '88', '6', '111323', '177180', '16'), +('2', '88', '6', '111326', '175748', '16'), +('2', '88', '6', '111324', '174179', '16'), +('2', '88', '6', '111022', '155329', '16'), +('2', '88', '17', '56046', '114218', '16'), +('2', '88', '17', '56083', '114180', '16'), +('2', '88', '17', '81765', '114153', '16'), +('2', '88', '17', '104406', '96470', '16'), +('2', '88', '7', '56080', '109985', '16'), +('2', '88', '7', '94053', '109044', '16'), +('2', '88', '7', '89369', '103850', '16'), +('2', '88', '7', '104404', '92359', '16'), +('2', '88', '9', '67098', '175983', '16'), +('2', '88', '9', '81764', '106519', '16'), +('2', '88', '9', '56070', '106395', '16'), +('2', '88', '9', '62984', '106190', '16'), +('2', '88', '15', '111350', '178571', '16'), +('2', '88', '15', '111344', '177675', '16'), +('2', '88', '15', '111340', '177047', '16'), +('2', '88', '15', '111342', '174823', '16'), +('2', '88', '20', '111356', '177107', '16'), +('2', '88', '20', '111352', '176429', '16'), +('2', '88', '20', '111351', '173708', '16'), +('2', '88', '20', '111054', '155257', '16'), +('2', '88', '12', '105332', '128960', '16'), +('2', '88', '12', '56035', '108277', '16'), +('2', '88', '12', '56073', '107161', '16'), +('2', '88', '12', '89366', '100779', '16'), +('2', '88', '18', '56041', '113919', '16'), +('2', '88', '18', '94054', '112718', '16'), +('2', '88', '18', '62986', '112427', '16'), +('2', '88', '18', '62987', '110818', '16'), +('2', '88', '19', '81763', '110645', '16'), +('2', '88', '19', '62990', '110373', '16'), +('2', '88', '19', '56037', '110322', '16'), +('2', '88', '19', '56075', '110193', '16'), +('2', '88', '13', '111518', '170544', '16'), +('2', '88', '13', '111517', '168815', '16'), +('2', '88', '13', '111217', '154158', '16'), +('2', '88', '13', '111218', '154104', '16'), +('2', '88', '14', '111537', '177387', '16'), +('2', '88', '14', '111539', '175592', '16'), +('2', '88', '14', '111535', '175217', '16'), +('2', '88', '14', '111237', '155535', '16'), +('2', '88', '11', '111334', '176661', '16'), +('2', '88', '11', '111337', '176464', '16'), +('2', '88', '11', '111338', '172559', '16'), +('2', '88', '11', '111033', '154911', '16'), +('2', '89', '22', '12425', '0', '16'), +('2', '89', '22', '39342', '0', '16'), +('2', '89', '22', '7867', '0', '16'), +('2', '89', '22', '23597', '0', '16'), +('2', '89', '1', '111304', '176388', '16'), +('2', '89', '1', '111307', '176231', '16'), +('2', '89', '1', '111310', '174943', '16'), +('2', '89', '1', '111301', '174932', '16'), +('2', '89', '2', '62988', '110479', '16'), +('2', '89', '2', '62985', '110233', '16'), +('2', '89', '2', '94056', '109918', '16'), +('2', '89', '2', '89368', '102748', '16'), +('2', '89', '3', '111314', '177101', '16'), +('2', '89', '3', '111316', '175389', '16'), +('2', '89', '3', '111315', '174506', '16'), +('2', '89', '3', '111013', '155250', '16'), +('2', '89', '5', '111319', '176460', '16'), +('2', '89', '5', '111318', '173736', '16'), +('2', '89', '5', '111317', '173454', '16'), +('2', '89', '5', '111320', '173080', '16'), +('2', '89', '8', '111332', '177284', '16'), +('2', '89', '8', '111330', '175127', '16'), +('2', '89', '8', '111331', '172826', '16'), +('2', '89', '8', '111328', '172633', '16'), +('2', '89', '6', '111323', '177186', '16'), +('2', '89', '6', '111326', '175757', '16'), +('2', '89', '6', '111324', '174184', '16'), +('2', '89', '6', '111022', '155336', '16'), +('2', '89', '17', '56046', '114224', '16'), +('2', '89', '17', '56083', '114183', '16'), +('2', '89', '17', '81765', '114158', '16'), +('2', '89', '17', '104406', '96476', '16'), +('2', '89', '7', '56080', '109993', '16'), +('2', '89', '7', '94053', '109049', '16'), +('2', '89', '7', '89369', '103856', '16'), +('2', '89', '7', '104404', '92366', '16'), +('2', '89', '9', '67098', '177988', '16'), +('2', '89', '9', '81764', '106529', '16'), +('2', '89', '9', '56070', '106401', '16'), +('2', '89', '9', '62984', '106196', '16'), +('2', '89', '15', '111350', '178579', '16'), +('2', '89', '15', '111344', '177683', '16'), +('2', '89', '15', '111340', '177053', '16'), +('2', '89', '15', '111342', '174830', '16'), +('2', '89', '20', '111356', '177112', '16'), +('2', '89', '20', '111352', '176436', '16'), +('2', '89', '20', '111351', '173715', '16'), +('2', '89', '20', '111054', '155262', '16'), +('2', '89', '12', '105332', '128962', '16'), +('2', '89', '12', '56035', '108286', '16'), +('2', '89', '12', '56073', '107167', '16'), +('2', '89', '12', '89366', '100783', '16'), +('2', '89', '18', '56041', '113925', '16'), +('2', '89', '18', '94054', '112723', '16'), +('2', '89', '18', '62986', '112435', '16'), +('2', '89', '18', '62987', '110822', '16'), +('2', '89', '19', '81763', '110655', '16'), +('2', '89', '19', '62990', '110377', '16'), +('2', '89', '19', '56037', '110329', '16'), +('2', '89', '19', '56075', '110201', '16'), +('2', '89', '13', '111518', '170550', '16'), +('2', '89', '13', '111517', '168821', '16'), +('2', '89', '13', '111217', '154164', '16'), +('2', '89', '13', '111218', '154110', '16'), +('2', '89', '14', '111537', '177393', '16'), +('2', '89', '14', '111539', '175600', '16'), +('2', '89', '14', '111535', '175223', '16'), +('2', '89', '14', '111237', '155542', '16'), +('2', '89', '11', '111334', '176668', '16'), +('2', '89', '11', '111337', '176473', '16'), +('2', '89', '11', '111338', '172564', '16'), +('2', '89', '11', '111033', '154917', '16'), +('2', '90', '22', '12425', '0', '17'), +('2', '90', '22', '39342', '0', '17'), +('2', '90', '22', '7867', '0', '17'), +('2', '90', '22', '23597', '0', '17'), +('2', '90', '1', '111304', '176396', '17'), +('2', '90', '1', '111307', '176235', '17'), +('2', '90', '1', '111310', '174950', '17'), +('2', '90', '1', '111301', '174938', '17'), +('2', '90', '2', '62988', '110484', '17'), +('2', '90', '2', '62985', '110241', '17'), +('2', '90', '2', '94056', '109924', '17'), +('2', '90', '2', '89368', '102753', '17'), +('2', '90', '3', '111314', '177107', '17'), +('2', '90', '3', '111316', '175395', '17'), +('2', '90', '3', '111315', '174512', '17'), +('2', '90', '3', '111013', '155256', '17'), +('2', '90', '5', '111319', '176466', '17'), +('2', '90', '5', '111318', '173741', '17'), +('2', '90', '5', '111317', '173460', '17'), +('2', '90', '5', '111320', '173085', '17'), +('2', '90', '8', '111332', '177292', '17'), +('2', '90', '8', '111330', '175133', '17'), +('2', '90', '8', '111331', '172833', '17'), +('2', '90', '8', '111328', '172637', '17'), +('2', '90', '6', '111323', '177193', '17'), +('2', '90', '6', '111326', '175766', '17'), +('2', '90', '6', '111324', '174189', '17'), +('2', '90', '6', '111022', '155342', '17'), +('2', '90', '17', '56046', '114231', '17'), +('2', '90', '17', '56083', '114187', '17'), +('2', '90', '17', '81765', '114163', '17'), +('2', '90', '17', '104406', '96482', '17'), +('2', '90', '7', '56080', '110001', '17'), +('2', '90', '7', '94053', '109053', '17'), +('2', '90', '7', '89369', '103861', '17'), +('2', '90', '7', '104404', '92374', '17'), +('2', '90', '9', '67098', '179994', '17'), +('2', '90', '9', '81764', '106539', '17'), +('2', '90', '9', '56070', '106407', '17'), +('2', '90', '9', '62984', '106203', '17'), +('2', '90', '15', '111350', '178587', '17'), +('2', '90', '15', '111344', '177692', '17'), +('2', '90', '15', '111340', '177060', '17'), +('2', '90', '15', '111342', '174837', '17'), +('2', '90', '20', '111356', '177117', '17'), +('2', '90', '20', '111352', '176442', '17'), +('2', '90', '20', '111351', '173722', '17'), +('2', '90', '20', '111054', '155267', '17'), +('2', '90', '12', '105332', '128964', '17'), +('2', '90', '12', '56035', '108296', '17'), +('2', '90', '12', '56073', '107173', '17'), +('2', '90', '12', '89366', '100788', '17'), +('2', '90', '18', '56041', '113931', '17'), +('2', '90', '18', '94054', '112727', '17'), +('2', '90', '18', '62986', '112442', '17'), +('2', '90', '18', '62987', '110827', '17'), +('2', '90', '19', '81763', '110665', '17'), +('2', '90', '19', '62990', '110382', '17'), +('2', '90', '19', '56037', '110336', '17'), +('2', '90', '19', '56075', '110209', '17'), +('2', '90', '13', '111518', '170557', '17'), +('2', '90', '13', '111517', '168827', '17'), +('2', '90', '13', '111217', '154170', '17'), +('2', '90', '13', '111218', '154116', '17'), +('2', '90', '14', '111537', '177400', '17'), +('2', '90', '14', '111539', '175607', '17'), +('2', '90', '14', '111535', '175229', '17'), +('2', '90', '14', '111237', '155548', '17'), +('2', '90', '11', '111334', '176674', '17'), +('2', '90', '11', '111337', '176483', '17'), +('2', '90', '11', '111338', '172569', '17'), +('2', '90', '11', '111033', '154923', '17'), +('2', '91', '22', '12425', '0', '17'), +('2', '91', '22', '39342', '0', '17'), +('2', '91', '22', '7867', '0', '17'), +('2', '91', '22', '23597', '0', '17'), +('2', '91', '1', '111304', '176403', '17'), +('2', '91', '1', '111307', '176238', '17'), +('2', '91', '1', '111310', '174956', '17'), +('2', '91', '1', '111301', '174945', '17'), +('2', '91', '2', '62988', '110488', '17'), +('2', '91', '2', '62985', '110249', '17'), +('2', '91', '2', '94056', '109929', '17'), +('2', '91', '2', '89368', '102759', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '91', '3', '111314', '177113', '17'), +('2', '91', '3', '111316', '175401', '17'), +('2', '91', '3', '111315', '174518', '17'), +('2', '91', '3', '111013', '155262', '17'), +('2', '91', '5', '111319', '176471', '17'), +('2', '91', '5', '111318', '173746', '17'), +('2', '91', '5', '111317', '173466', '17'), +('2', '91', '5', '111320', '173090', '17'), +('2', '91', '8', '111332', '177299', '17'), +('2', '91', '8', '111330', '175139', '17'), +('2', '91', '8', '111331', '172841', '17'), +('2', '91', '8', '111328', '172642', '17'), +('2', '91', '6', '111323', '177199', '17'), +('2', '91', '6', '111326', '175775', '17'), +('2', '91', '6', '111324', '174194', '17'), +('2', '91', '6', '111022', '155349', '17'), +('2', '91', '17', '56046', '114237', '17'), +('2', '91', '17', '56083', '114190', '17'), +('2', '91', '17', '81765', '114168', '17'), +('2', '91', '17', '104406', '96488', '17'), +('2', '91', '7', '56080', '110008', '17'), +('2', '91', '7', '94053', '109058', '17'), +('2', '91', '7', '89369', '103867', '17'), +('2', '91', '7', '104404', '92381', '17'), +('2', '91', '9', '67098', '179999', '17'), +('2', '91', '9', '81764', '106549', '17'), +('2', '91', '9', '56070', '106413', '17'), +('2', '91', '9', '62984', '106209', '17'), +('2', '91', '15', '111350', '178595', '17'), +('2', '91', '15', '111344', '177700', '17'), +('2', '91', '15', '111340', '177066', '17'), +('2', '91', '15', '111342', '174844', '17'), +('2', '91', '20', '111356', '177122', '17'), +('2', '91', '20', '111352', '176449', '17'), +('2', '91', '20', '111351', '173729', '17'), +('2', '91', '20', '111054', '155271', '17'), +('2', '91', '12', '105332', '128966', '17'), +('2', '91', '12', '56035', '108305', '17'), +('2', '91', '12', '56073', '107180', '17'), +('2', '91', '12', '89366', '100793', '17'), +('2', '91', '18', '56041', '113937', '17'), +('2', '91', '18', '94054', '112732', '17'), +('2', '91', '18', '62986', '112450', '17'), +('2', '91', '18', '62987', '110832', '17'), +('2', '91', '19', '81763', '110675', '17'), +('2', '91', '19', '62990', '110386', '17'), +('2', '91', '19', '56037', '110343', '17'), +('2', '91', '19', '56075', '110217', '17'), +('2', '91', '13', '111518', '170563', '17'), +('2', '91', '13', '111517', '168833', '17'), +('2', '91', '13', '111217', '154176', '17'), +('2', '91', '13', '111218', '154123', '17'), +('2', '91', '14', '111537', '177406', '17'), +('2', '91', '14', '111539', '175615', '17'), +('2', '91', '14', '111535', '175235', '17'), +('2', '91', '14', '111237', '155555', '17'), +('2', '91', '11', '111334', '176680', '17'), +('2', '91', '11', '111337', '176492', '17'), +('2', '91', '11', '111338', '172573', '17'), +('2', '91', '11', '111033', '154929', '17'), +('2', '92', '22', '12425', '0', '17'), +('2', '92', '22', '39342', '0', '17'), +('2', '92', '22', '7867', '0', '17'), +('2', '92', '22', '23597', '0', '17'), +('2', '92', '1', '111304', '176411', '17'), +('2', '92', '1', '111307', '176242', '17'), +('2', '92', '1', '111310', '174962', '17'), +('2', '92', '1', '111301', '174951', '17'), +('2', '92', '2', '62988', '110492', '17'), +('2', '92', '2', '62985', '110257', '17'), +('2', '92', '2', '94056', '109934', '17'), +('2', '92', '2', '89368', '102764', '17'), +('2', '92', '3', '111314', '177119', '17'), +('2', '92', '3', '111316', '175408', '17'), +('2', '92', '3', '111315', '174524', '17'), +('2', '92', '3', '111013', '155268', '17'), +('2', '92', '5', '111319', '176476', '17'), +('2', '92', '5', '111318', '173751', '17'), +('2', '92', '5', '111317', '173472', '17'), +('2', '92', '5', '111320', '173096', '17'), +('2', '92', '8', '111332', '177306', '17'), +('2', '92', '8', '111330', '175145', '17'), +('2', '92', '8', '111331', '172848', '17'), +('2', '92', '8', '111328', '172646', '17'), +('2', '92', '6', '111323', '177206', '17'), +('2', '92', '6', '111326', '175784', '17'), +('2', '92', '6', '111324', '174199', '17'), +('2', '92', '6', '111022', '155356', '17'), +('2', '92', '17', '56046', '114243', '17'), +('2', '92', '17', '56083', '114194', '17'), +('2', '92', '17', '81765', '114173', '17'), +('2', '92', '17', '104406', '96495', '17'), +('2', '92', '7', '56080', '110016', '17'), +('2', '92', '7', '94053', '109063', '17'), +('2', '92', '7', '89369', '103873', '17'), +('2', '92', '7', '104404', '92388', '17'), +('2', '92', '9', '67098', '180004', '17'), +('2', '92', '9', '81764', '106560', '17'), +('2', '92', '9', '56070', '106419', '17'), +('2', '92', '9', '62984', '106215', '17'), +('2', '92', '15', '111350', '178603', '17'), +('2', '92', '15', '111344', '177708', '17'), +('2', '92', '15', '111340', '177072', '17'), +('2', '92', '15', '111342', '174851', '17'), +('2', '92', '20', '111356', '177127', '17'), +('2', '92', '20', '111352', '176455', '17'), +('2', '92', '20', '111351', '173736', '17'), +('2', '92', '20', '111054', '155276', '17'), +('2', '92', '12', '105332', '128968', '17'), +('2', '92', '12', '56035', '108315', '17'), +('2', '92', '12', '56073', '107186', '17'), +('2', '92', '12', '89366', '100798', '17'), +('2', '92', '18', '56041', '113943', '17'), +('2', '92', '18', '94054', '112736', '17'), +('2', '92', '18', '62986', '112457', '17'), +('2', '92', '18', '62987', '110837', '17'), +('2', '92', '19', '81763', '110685', '17'), +('2', '92', '19', '62990', '110390', '17'), +('2', '92', '19', '56037', '110350', '17'), +('2', '92', '19', '56075', '110225', '17'), +('2', '92', '13', '111518', '170570', '17'), +('2', '92', '13', '111517', '168840', '17'), +('2', '92', '13', '111217', '154182', '17'), +('2', '92', '13', '111218', '154129', '17'), +('2', '92', '14', '111537', '177413', '17'), +('2', '92', '14', '111539', '175623', '17'), +('2', '92', '14', '111535', '175241', '17'), +('2', '92', '14', '111237', '155561', '17'), +('2', '92', '11', '111334', '176686', '17'), +('2', '92', '11', '111337', '176501', '17'), +('2', '92', '11', '111338', '172578', '17'), +('2', '92', '11', '111033', '154936', '17'), +('2', '93', '22', '12425', '0', '17'), +('2', '93', '22', '39342', '0', '17'), +('2', '93', '22', '7867', '0', '17'), +('2', '93', '22', '23597', '0', '17'), +('2', '93', '1', '111304', '176418', '17'), +('2', '93', '1', '111307', '176246', '17'), +('2', '93', '1', '111310', '174968', '17'), +('2', '93', '1', '111301', '174958', '17'), +('2', '93', '2', '62988', '110496', '17'), +('2', '93', '2', '62985', '110266', '17'), +('2', '93', '2', '94056', '109940', '17'), +('2', '93', '2', '89368', '102770', '17'), +('2', '93', '3', '111314', '177125', '17'), +('2', '93', '3', '111316', '175414', '17'), +('2', '93', '3', '111315', '174531', '17'), +('2', '93', '3', '111013', '155275', '17'), +('2', '93', '5', '111319', '176482', '17'), +('2', '93', '5', '111318', '173756', '17'), +('2', '93', '5', '111317', '173478', '17'), +('2', '93', '5', '111320', '173101', '17'), +('2', '93', '8', '111332', '177313', '17'), +('2', '93', '8', '111330', '175151', '17'), +('2', '93', '8', '111331', '172856', '17'), +('2', '93', '8', '111328', '172650', '17'), +('2', '93', '6', '111323', '177213', '17'), +('2', '93', '6', '111326', '175793', '17'), +('2', '93', '6', '111324', '174204', '17'), +('2', '93', '6', '111022', '155362', '17'), +('2', '93', '17', '56046', '114249', '17'), +('2', '93', '17', '56083', '114197', '17'), +('2', '93', '17', '81765', '114178', '17'), +('2', '93', '17', '104406', '96501', '17'), +('2', '93', '7', '56080', '110023', '17'), +('2', '93', '7', '94053', '109068', '17'), +('2', '93', '7', '89369', '103879', '17'), +('2', '93', '7', '104404', '92396', '17'), +('2', '93', '9', '67098', '180010', '17'), +('2', '93', '9', '81764', '106570', '17'), +('2', '93', '9', '56070', '106425', '17'), +('2', '93', '9', '62984', '106221', '17'), +('2', '93', '15', '111350', '178611', '17'), +('2', '93', '15', '111344', '177716', '17'), +('2', '93', '15', '111340', '177079', '17'), +('2', '93', '15', '111342', '174858', '17'), +('2', '93', '20', '111356', '177132', '17'), +('2', '93', '20', '111352', '176462', '17'), +('2', '93', '20', '111351', '173743', '17'), +('2', '93', '20', '111054', '155281', '17'), +('2', '93', '12', '105332', '128971', '17'), +('2', '93', '12', '56035', '108324', '17'), +('2', '93', '12', '56073', '107192', '17'), +('2', '93', '12', '89366', '100802', '17'), +('2', '93', '18', '56041', '113949', '17'), +('2', '93', '18', '94054', '112741', '17'), +('2', '93', '18', '62986', '112465', '17'), +('2', '93', '18', '62987', '110842', '17'), +('2', '93', '19', '81763', '110695', '17'), +('2', '93', '19', '62990', '110395', '17'), +('2', '93', '19', '56037', '110358', '17'), +('2', '93', '19', '56075', '110233', '17'), +('2', '93', '13', '111518', '170576', '17'), +('2', '93', '13', '111517', '168846', '17'), +('2', '93', '13', '111217', '154188', '17'), +('2', '93', '13', '111218', '154135', '17'), +('2', '93', '14', '111537', '177420', '17'), +('2', '93', '14', '111539', '175630', '17'), +('2', '93', '14', '111535', '175247', '17'), +('2', '93', '14', '111237', '155568', '17'), +('2', '93', '11', '111334', '176692', '17'), +('2', '93', '11', '111337', '176510', '17'), +('2', '93', '11', '111338', '172583', '17'), +('2', '93', '11', '111033', '154942', '17'), +('2', '94', '22', '12425', '0', '17'), +('2', '94', '22', '39342', '0', '17'), +('2', '94', '22', '7867', '0', '17'), +('2', '94', '22', '23597', '0', '17'), +('2', '94', '1', '111304', '176426', '17'), +('2', '94', '1', '111307', '176249', '17'), +('2', '94', '1', '111310', '174975', '17'), +('2', '94', '1', '111301', '174964', '17'), +('2', '94', '2', '62988', '110500', '17'), +('2', '94', '2', '62985', '110274', '17'), +('2', '94', '2', '94056', '109945', '17'), +('2', '94', '2', '89368', '102775', '17'), +('2', '94', '3', '111314', '177131', '17'), +('2', '94', '3', '111316', '175420', '17'), +('2', '94', '3', '111315', '174537', '17'), +('2', '94', '3', '111013', '155281', '17'), +('2', '94', '5', '111319', '176487', '17'), +('2', '94', '5', '111318', '173761', '17'), +('2', '94', '5', '111317', '173484', '17'), +('2', '94', '5', '111320', '173106', '17'), +('2', '94', '8', '111332', '177320', '17'), +('2', '94', '8', '111330', '175157', '17'), +('2', '94', '8', '111331', '172864', '17'), +('2', '94', '8', '111328', '172654', '17'), +('2', '94', '6', '111323', '177219', '17'), +('2', '94', '6', '111326', '175802', '17'), +('2', '94', '6', '111324', '174209', '17'), +('2', '94', '6', '111022', '155369', '17'), +('2', '94', '17', '56046', '114256', '17'), +('2', '94', '17', '56083', '114201', '17'), +('2', '94', '17', '81765', '114183', '17'), +('2', '94', '17', '104406', '96507', '17'), +('2', '94', '7', '56080', '110031', '17'), +('2', '94', '7', '94053', '109072', '17'), +('2', '94', '7', '89369', '103885', '17'), +('2', '94', '7', '104404', '92403', '17'), +('2', '94', '9', '67098', '180015', '17'), +('2', '94', '9', '81764', '106580', '17'), +('2', '94', '9', '56070', '106431', '17'), +('2', '94', '9', '62984', '106228', '17'), +('2', '94', '15', '111350', '178619', '17'), +('2', '94', '15', '111344', '177724', '17'), +('2', '94', '15', '111340', '177085', '17'), +('2', '94', '15', '111342', '174865', '17'), +('2', '94', '20', '111356', '177136', '17'), +('2', '94', '20', '111352', '176468', '17'), +('2', '94', '20', '111351', '173749', '17'), +('2', '94', '20', '111054', '155286', '17'), +('2', '94', '12', '105332', '128973', '17'), +('2', '94', '12', '56035', '108334', '17'), +('2', '94', '12', '56073', '107198', '17'), +('2', '94', '12', '89366', '100807', '17'), +('2', '94', '18', '56041', '113955', '17'), +('2', '94', '18', '94054', '112746', '17'), +('2', '94', '18', '62986', '112472', '17'), +('2', '94', '18', '62987', '110847', '17'), +('2', '94', '19', '81763', '110704', '17'), +('2', '94', '19', '62990', '110399', '17'), +('2', '94', '19', '56037', '110365', '17'), +('2', '94', '19', '56075', '110241', '17'), +('2', '94', '13', '111518', '170583', '17'), +('2', '94', '13', '111517', '168852', '17'), +('2', '94', '13', '111217', '154194', '17'), +('2', '94', '13', '111218', '154141', '17'), +('2', '94', '14', '111537', '177426', '17'), +('2', '94', '14', '111539', '175638', '17'), +('2', '94', '14', '111535', '175253', '17'), +('2', '94', '14', '111237', '155575', '17'), +('2', '94', '11', '111334', '176698', '17'), +('2', '94', '11', '111337', '176519', '17'), +('2', '94', '11', '111338', '172588', '17'), +('2', '94', '11', '111033', '154948', '17'), +('2', '95', '22', '12425', '0', '18'), +('2', '95', '22', '39342', '0', '18'), +('2', '95', '22', '7867', '0', '18'), +('2', '95', '22', '23597', '0', '18'), +('2', '95', '1', '111304', '176433', '18'), +('2', '95', '1', '111307', '176253', '18'), +('2', '95', '1', '111310', '174981', '18'), +('2', '95', '1', '111301', '174971', '18'), +('2', '95', '2', '62988', '110504', '18'), +('2', '95', '2', '62985', '110282', '18'), +('2', '95', '2', '94056', '109950', '18'), +('2', '95', '2', '89368', '102781', '18'), +('2', '95', '3', '111314', '177138', '18'), +('2', '95', '3', '111316', '175426', '18'), +('2', '95', '3', '111315', '174543', '18'), +('2', '95', '3', '111013', '155287', '18'), +('2', '95', '5', '111319', '176493', '18'), +('2', '95', '5', '111318', '173766', '18'), +('2', '95', '5', '111317', '173490', '18'), +('2', '95', '5', '111320', '173111', '18'), +('2', '95', '8', '111332', '177327', '18'), +('2', '95', '8', '111330', '175163', '18'), +('2', '95', '8', '111331', '172871', '18'), +('2', '95', '8', '111328', '172658', '18'), +('2', '95', '6', '111323', '177226', '18'), +('2', '95', '6', '111326', '175811', '18'), +('2', '95', '6', '111324', '174214', '18'), +('2', '95', '6', '111022', '155375', '18'), +('2', '95', '17', '56046', '114262', '18'), +('2', '95', '17', '56083', '114204', '18'), +('2', '95', '17', '81765', '114188', '18'), +('2', '95', '17', '104406', '96513', '18'), +('2', '95', '7', '56080', '110038', '18'), +('2', '95', '7', '94053', '109077', '18'), +('2', '95', '7', '89369', '103890', '18'), +('2', '95', '7', '104404', '92410', '18'), +('2', '95', '9', '67098', '180020', '18'), +('2', '95', '9', '81764', '106591', '18'), +('2', '95', '9', '56070', '106437', '18'), +('2', '95', '9', '62984', '106234', '18'), +('2', '95', '15', '111350', '178627', '18'), +('2', '95', '15', '111344', '177732', '18'), +('2', '95', '15', '111340', '177091', '18'), +('2', '95', '15', '111342', '174872', '18'), +('2', '95', '20', '111356', '177141', '18'), +('2', '95', '20', '111352', '176475', '18'), +('2', '95', '20', '111351', '173756', '18'), +('2', '95', '20', '111054', '155291', '18'), +('2', '95', '12', '105332', '128975', '18'), +('2', '95', '12', '56035', '108343', '18'), +('2', '95', '12', '56073', '107204', '18'), +('2', '95', '12', '89366', '100812', '18'), +('2', '95', '18', '56041', '113961', '18'), +('2', '95', '18', '94054', '112750', '18'), +('2', '95', '18', '62986', '112479', '18'), +('2', '95', '18', '62987', '110852', '18'), +('2', '95', '19', '81763', '110714', '18'), +('2', '95', '19', '62990', '110403', '18'), +('2', '95', '19', '56037', '110372', '18'), +('2', '95', '19', '56075', '110249', '18'), +('2', '95', '13', '111518', '170589', '18'), +('2', '95', '13', '111517', '168858', '18'), +('2', '95', '13', '111217', '154200', '18'), +('2', '95', '13', '111218', '154148', '18'), +('2', '95', '14', '111537', '177433', '18'), +('2', '95', '14', '111539', '175645', '18'), +('2', '95', '14', '111535', '175259', '18'), +('2', '95', '14', '111237', '155581', '18'), +('2', '95', '11', '111334', '176704', '18'), +('2', '95', '11', '111337', '176528', '18'), +('2', '95', '11', '111338', '172593', '18'), +('2', '95', '11', '111033', '154954', '18'), +('2', '96', '22', '12425', '0', '18'), +('2', '96', '22', '39342', '0', '18'), +('2', '96', '22', '7867', '0', '18'), +('2', '96', '22', '23597', '0', '18'), +('2', '96', '1', '111304', '176441', '18'), +('2', '96', '1', '111307', '176256', '18'), +('2', '96', '1', '111310', '174987', '18'), +('2', '96', '1', '111301', '174978', '18'), +('2', '96', '2', '62988', '110508', '18'), +('2', '96', '2', '62985', '110291', '18'), +('2', '96', '2', '94056', '109956', '18'), +('2', '96', '2', '89368', '102787', '18'), +('2', '96', '3', '111314', '177144', '18'), +('2', '96', '3', '111316', '175432', '18'), +('2', '96', '3', '111315', '174549', '18'), +('2', '96', '3', '111013', '155293', '18'), +('2', '96', '5', '111319', '176498', '18'), +('2', '96', '5', '111318', '173772', '18'), +('2', '96', '5', '111317', '173496', '18'), +('2', '96', '5', '111320', '173116', '18'), +('2', '96', '8', '111332', '177334', '18'), +('2', '96', '8', '111330', '175169', '18'), +('2', '96', '8', '111331', '172879', '18'), +('2', '96', '8', '111328', '172662', '18'), +('2', '96', '6', '111323', '177232', '18'), +('2', '96', '6', '111326', '175820', '18'), +('2', '96', '6', '111324', '174219', '18'), +('2', '96', '6', '111022', '155382', '18'), +('2', '96', '17', '56046', '114268', '18'), +('2', '96', '17', '56083', '114208', '18'), +('2', '96', '17', '81765', '114194', '18'), +('2', '96', '17', '104406', '96520', '18'), +('2', '96', '7', '56080', '110046', '18'), +('2', '96', '7', '94053', '109082', '18'), +('2', '96', '7', '89369', '103896', '18'), +('2', '96', '7', '104404', '92418', '18'), +('2', '96', '9', '67098', '180026', '18'), +('2', '96', '9', '81764', '106601', '18'), +('2', '96', '9', '56070', '106443', '18'), +('2', '96', '9', '62984', '106240', '18'), +('2', '96', '15', '111350', '178635', '18'), +('2', '96', '15', '111344', '177740', '18'), +('2', '96', '15', '111340', '177098', '18'), +('2', '96', '15', '111342', '174879', '18'), +('2', '96', '20', '111356', '177146', '18'), +('2', '96', '20', '111352', '176481', '18'), +('2', '96', '20', '111351', '173763', '18'), +('2', '96', '20', '111054', '155296', '18'), +('2', '96', '12', '105332', '128977', '18'), +('2', '96', '12', '56035', '108353', '18'), +('2', '96', '12', '56073', '107211', '18'), +('2', '96', '12', '89366', '100817', '18'), +('2', '96', '18', '56041', '113967', '18'), +('2', '96', '18', '94054', '112755', '18'), +('2', '96', '18', '62986', '112487', '18'), +('2', '96', '18', '62987', '110857', '18'), +('2', '96', '19', '81763', '110724', '18'), +('2', '96', '19', '62990', '110408', '18'), +('2', '96', '19', '56037', '110379', '18'), +('2', '96', '19', '56075', '110257', '18'), +('2', '96', '13', '111518', '170596', '18'), +('2', '96', '13', '111517', '168864', '18'), +('2', '96', '13', '111217', '154206', '18'), +('2', '96', '13', '111218', '154154', '18'), +('2', '96', '14', '111537', '177439', '18'), +('2', '96', '14', '111539', '175653', '18'), +('2', '96', '14', '111535', '175265', '18'), +('2', '96', '14', '111237', '155588', '18'), +('2', '96', '11', '111334', '176711', '18'), +('2', '96', '11', '111337', '176537', '18'), +('2', '96', '11', '111338', '172598', '18'), +('2', '96', '11', '111033', '154960', '18'), +('2', '97', '22', '12425', '0', '18'), +('2', '97', '22', '39342', '0', '18'), +('2', '97', '22', '7867', '0', '18'), +('2', '97', '22', '23597', '0', '18'), +('2', '97', '1', '111304', '176449', '18'), +('2', '97', '1', '111307', '176260', '18'), +('2', '97', '1', '111310', '174993', '18'), +('2', '97', '1', '111301', '174984', '18'), +('2', '97', '2', '62988', '110512', '18'), +('2', '97', '2', '62985', '110299', '18'), +('2', '97', '2', '94056', '109961', '18'), +('2', '97', '2', '89368', '102792', '18'), +('2', '97', '3', '111314', '177150', '18'), +('2', '97', '3', '111316', '175438', '18'), +('2', '97', '3', '111315', '174556', '18'), +('2', '97', '3', '111013', '155299', '18'), +('2', '97', '5', '111319', '176503', '18'), +('2', '97', '5', '111318', '173777', '18'), +('2', '97', '5', '111317', '173502', '18'), +('2', '97', '5', '111320', '173121', '18'), +('2', '97', '8', '111332', '177341', '18'), +('2', '97', '8', '111330', '175176', '18'), +('2', '97', '8', '111331', '172886', '18'), +('2', '97', '8', '111328', '172667', '18'), +('2', '97', '6', '111323', '177239', '18'), +('2', '97', '6', '111326', '175829', '18'), +('2', '97', '6', '111324', '174224', '18'), +('2', '97', '6', '111022', '155388', '18'), +('2', '97', '17', '56046', '114274', '18'), +('2', '97', '17', '56083', '114211', '18'), +('2', '97', '17', '81765', '114199', '18'), +('2', '97', '17', '104406', '96526', '18'), +('2', '97', '7', '56080', '110053', '18'), +('2', '97', '7', '94053', '109087', '18'), +('2', '97', '7', '89369', '103902', '18'), +('2', '97', '7', '104404', '92425', '18'), +('2', '97', '9', '67098', '180031', '18'), +('2', '97', '9', '81764', '106611', '18'), +('2', '97', '9', '56070', '106449', '18'), +('2', '97', '9', '62984', '106246', '18'), +('2', '97', '15', '111350', '178643', '18'), +('2', '97', '15', '111344', '177748', '18'), +('2', '97', '15', '111340', '177104', '18'), +('2', '97', '15', '111342', '174886', '18'), +('2', '97', '20', '111356', '177151', '18'), +('2', '97', '20', '111352', '176488', '18'), +('2', '97', '20', '111351', '173770', '18'), +('2', '97', '20', '111054', '155300', '18'), +('2', '97', '12', '105332', '128979', '18'), +('2', '97', '12', '56035', '108362', '18'), +('2', '97', '12', '56073', '107217', '18'), +('2', '97', '12', '89366', '100821', '18'), +('2', '97', '18', '56041', '113973', '18'), +('2', '97', '18', '94054', '112759', '18'), +('2', '97', '18', '62986', '112494', '18'), +('2', '97', '18', '62987', '110862', '18'), +('2', '97', '19', '81763', '110734', '18'), +('2', '97', '19', '62990', '110412', '18'), +('2', '97', '19', '56037', '110386', '18'), +('2', '97', '19', '56075', '110265', '18'), +('2', '97', '13', '111518', '170602', '18'), +('2', '97', '13', '111517', '168870', '18'), +('2', '97', '13', '111217', '154212', '18'), +('2', '97', '13', '111218', '154160', '18'), +('2', '97', '14', '111537', '177446', '18'), +('2', '97', '14', '111539', '175660', '18'), +('2', '97', '14', '111535', '175270', '18'), +('2', '97', '14', '111237', '155594', '18'), +('2', '97', '11', '111334', '176717', '18'), +('2', '97', '11', '111337', '176547', '18'), +('2', '97', '11', '111338', '172603', '18'), +('2', '97', '11', '111033', '154966', '18'), +('2', '98', '22', '12425', '0', '18'), +('2', '98', '22', '39342', '0', '18'), +('2', '98', '22', '7867', '0', '18'), +('2', '98', '22', '23597', '0', '18'), +('2', '98', '1', '111304', '176456', '18'), +('2', '98', '1', '111307', '176264', '18'), +('2', '98', '1', '111310', '174999', '18'), +('2', '98', '1', '111301', '174991', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '98', '2', '62988', '110516', '18'), +('2', '98', '2', '62985', '110307', '18'), +('2', '98', '2', '94056', '109966', '18'), +('2', '98', '2', '89368', '102798', '18'), +('2', '98', '3', '111314', '177156', '18'), +('2', '98', '3', '111316', '175444', '18'), +('2', '98', '3', '111315', '174562', '18'), +('2', '98', '3', '111013', '155305', '18'), +('2', '98', '5', '111319', '176509', '18'), +('2', '98', '5', '111318', '173782', '18'), +('2', '98', '5', '111317', '173508', '18'), +('2', '98', '5', '111320', '173126', '18'), +('2', '98', '8', '111332', '177348', '18'), +('2', '98', '8', '111330', '175182', '18'), +('2', '98', '8', '111331', '172894', '18'), +('2', '98', '8', '111328', '172671', '18'), +('2', '98', '6', '111323', '177246', '18'), +('2', '98', '6', '111326', '175838', '18'), +('2', '98', '6', '111324', '174229', '18'), +('2', '98', '6', '111022', '155395', '18'), +('2', '98', '17', '56046', '114280', '18'), +('2', '98', '17', '56083', '114215', '18'), +('2', '98', '17', '81765', '114204', '18'), +('2', '98', '17', '104406', '96532', '18'), +('2', '98', '7', '56080', '110061', '18'), +('2', '98', '7', '94053', '109091', '18'), +('2', '98', '7', '89369', '103908', '18'), +('2', '98', '7', '104404', '92432', '18'), +('2', '98', '9', '67098', '180036', '18'), +('2', '98', '9', '81764', '106622', '18'), +('2', '98', '9', '56070', '106455', '18'), +('2', '98', '9', '62984', '106253', '18'), +('2', '98', '15', '111350', '178651', '18'), +('2', '98', '15', '111344', '177757', '18'), +('2', '98', '15', '111340', '177110', '18'), +('2', '98', '15', '111342', '174893', '18'), +('2', '98', '20', '111356', '177156', '18'), +('2', '98', '20', '111352', '176495', '18'), +('2', '98', '20', '111351', '173777', '18'), +('2', '98', '20', '111054', '155305', '18'), +('2', '98', '12', '105332', '128981', '18'), +('2', '98', '12', '56035', '108372', '18'), +('2', '98', '12', '56073', '107223', '18'), +('2', '98', '12', '89366', '100826', '18'), +('2', '98', '18', '56041', '113979', '18'), +('2', '98', '18', '94054', '112764', '18'), +('2', '98', '18', '62986', '112502', '18'), +('2', '98', '18', '62987', '110866', '18'), +('2', '98', '19', '81763', '110744', '18'), +('2', '98', '19', '62990', '110416', '18'), +('2', '98', '19', '56037', '110393', '18'), +('2', '98', '19', '56075', '110272', '18'), +('2', '98', '13', '111518', '170609', '18'), +('2', '98', '13', '111517', '168876', '18'), +('2', '98', '13', '111217', '154218', '18'), +('2', '98', '13', '111218', '154166', '18'), +('2', '98', '14', '111537', '177452', '18'), +('2', '98', '14', '111539', '175668', '18'), +('2', '98', '14', '111535', '175276', '18'), +('2', '98', '14', '111237', '155601', '18'), +('2', '98', '11', '111334', '176723', '18'), +('2', '98', '11', '111337', '176556', '18'), +('2', '98', '11', '111338', '172608', '18'), +('2', '98', '11', '111033', '154972', '18'), +('2', '99', '22', '12425', '0', '18'), +('2', '99', '22', '39342', '0', '18'), +('2', '99', '22', '7867', '0', '18'), +('2', '99', '22', '23597', '0', '18'), +('2', '99', '1', '111304', '176464', '18'), +('2', '99', '1', '111307', '176267', '18'), +('2', '99', '1', '111310', '175006', '18'), +('2', '99', '1', '111301', '174997', '18'), +('2', '99', '2', '62988', '110520', '18'), +('2', '99', '2', '62985', '110315', '18'), +('2', '99', '2', '94056', '109972', '18'), +('2', '99', '2', '89368', '102803', '18'), +('2', '99', '3', '111314', '177162', '18'), +('2', '99', '3', '111316', '175451', '18'), +('2', '99', '3', '111315', '174568', '18'), +('2', '99', '3', '111013', '155312', '18'), +('2', '99', '5', '111319', '176514', '18'), +('2', '99', '5', '111318', '173787', '18'), +('2', '99', '5', '111317', '173514', '18'), +('2', '99', '5', '111320', '173132', '18'), +('2', '99', '8', '111332', '177356', '18'), +('2', '99', '8', '111330', '175188', '18'), +('2', '99', '8', '111331', '172902', '18'), +('2', '99', '8', '111328', '172675', '18'), +('2', '99', '6', '111323', '177252', '18'), +('2', '99', '6', '111326', '175847', '18'), +('2', '99', '6', '111324', '174234', '18'), +('2', '99', '6', '111022', '155402', '18'), +('2', '99', '17', '56046', '114287', '18'), +('2', '99', '17', '56083', '114218', '18'), +('2', '99', '17', '81765', '114209', '18'), +('2', '99', '17', '104406', '96538', '18'), +('2', '99', '7', '56080', '110069', '18'), +('2', '99', '7', '94053', '109096', '18'), +('2', '99', '7', '89369', '103913', '18'), +('2', '99', '7', '104404', '92440', '18'), +('2', '99', '9', '67098', '180042', '18'), +('2', '99', '9', '81764', '106632', '18'), +('2', '99', '9', '56070', '106461', '18'), +('2', '99', '9', '62984', '106259', '18'), +('2', '99', '15', '111350', '178659', '18'), +('2', '99', '15', '111344', '177765', '18'), +('2', '99', '15', '111340', '177117', '18'), +('2', '99', '15', '111342', '174900', '18'), +('2', '99', '20', '111356', '177161', '18'), +('2', '99', '20', '111352', '176501', '18'), +('2', '99', '20', '111351', '173784', '18'), +('2', '99', '20', '111054', '155310', '18'), +('2', '99', '12', '105332', '128983', '18'), +('2', '99', '12', '56035', '108381', '18'), +('2', '99', '12', '56073', '107229', '18'), +('2', '99', '12', '89366', '100831', '18'), +('2', '99', '18', '56041', '113985', '18'), +('2', '99', '18', '94054', '112768', '18'), +('2', '99', '18', '62986', '112509', '18'), +('2', '99', '18', '62987', '110871', '18'), +('2', '99', '19', '81763', '110754', '18'), +('2', '99', '19', '62990', '110421', '18'), +('2', '99', '19', '56037', '110400', '18'), +('2', '99', '19', '56075', '110280', '18'), +('2', '99', '13', '111518', '170615', '18'), +('2', '99', '13', '111517', '168882', '18'), +('2', '99', '13', '111217', '154224', '18'), +('2', '99', '13', '111218', '154173', '18'), +('2', '99', '14', '111537', '177459', '18'), +('2', '99', '14', '111539', '175675', '18'), +('2', '99', '14', '111535', '175282', '18'), +('2', '99', '14', '111237', '155607', '18'), +('2', '99', '11', '111334', '176729', '18'), +('2', '99', '11', '111337', '176565', '18'), +('2', '99', '11', '111338', '172613', '18'), +('2', '99', '11', '111033', '154979', '18'), +('2', '100', '22', '12425', '0', '20'), +('2', '100', '22', '39342', '0', '20'), +('2', '100', '22', '7867', '0', '20'), +('2', '100', '22', '23597', '0', '20'), +('2', '100', '1', '98769', '284214', '20'), +('2', '100', '1', '111304', '176471', '20'), +('2', '100', '1', '111307', '176271', '20'), +('2', '100', '1', '111310', '175012', '20'), +('2', '100', '2', '62988', '110524', '20'), +('2', '100', '2', '62985', '110324', '20'), +('2', '100', '2', '94056', '109977', '20'), +('2', '100', '2', '89368', '102809', '20'), +('2', '100', '3', '111314', '177168', '20'), +('2', '100', '3', '111316', '175457', '20'), +('2', '100', '3', '111315', '174574', '20'), +('2', '100', '3', '111013', '155318', '20'), +('2', '100', '5', '111319', '176520', '20'), +('2', '100', '5', '111318', '173792', '20'), +('2', '100', '5', '111317', '173520', '20'), +('2', '100', '5', '111320', '173137', '20'), +('2', '100', '8', '111332', '177363', '20'), +('2', '100', '8', '111330', '175194', '20'), +('2', '100', '8', '111331', '172909', '20'), +('2', '100', '8', '111328', '172679', '20'), +('2', '100', '6', '111323', '177259', '20'), +('2', '100', '6', '111326', '175856', '20'), +('2', '100', '6', '111324', '174238', '20'), +('2', '100', '6', '111022', '155408', '20'), +('2', '100', '17', '56046', '114293', '20'), +('2', '100', '17', '56083', '114222', '20'), +('2', '100', '17', '81765', '114214', '20'), +('2', '100', '17', '104406', '96544', '20'), +('2', '100', '7', '56080', '110076', '20'), +('2', '100', '7', '94053', '109101', '20'), +('2', '100', '7', '89369', '103919', '20'), +('2', '100', '7', '104404', '92447', '20'), +('2', '100', '9', '67098', '180047', '20'), +('2', '100', '9', '81764', '106642', '20'), +('2', '100', '9', '56070', '106467', '20'), +('2', '100', '9', '62984', '106265', '20'), +('2', '100', '15', '111350', '178667', '20'), +('2', '100', '15', '111344', '177773', '20'), +('2', '100', '15', '111340', '177123', '20'), +('2', '100', '15', '111342', '174907', '20'), +('2', '100', '20', '111356', '177166', '20'), +('2', '100', '20', '111352', '176508', '20'), +('2', '100', '20', '111351', '173791', '20'), +('2', '100', '20', '111054', '155315', '20'), +('2', '100', '12', '105332', '128985', '20'), +('2', '100', '12', '56035', '108391', '20'), +('2', '100', '12', '56073', '107236', '20'), +('2', '100', '12', '89366', '100835', '20'), +('2', '100', '18', '56041', '113992', '20'), +('2', '100', '18', '94054', '112773', '20'), +('2', '100', '18', '62986', '112516', '20'), +('2', '100', '18', '62987', '110876', '20'), +('2', '100', '19', '81763', '110764', '20'), +('2', '100', '19', '62990', '110425', '20'), +('2', '100', '19', '56037', '110408', '20'), +('2', '100', '19', '56075', '110288', '20'), +('2', '100', '13', '111518', '170622', '20'), +('2', '100', '13', '111517', '168889', '20'), +('2', '100', '13', '111217', '154231', '20'), +('2', '100', '13', '111218', '154179', '20'), +('2', '100', '14', '111537', '177466', '20'), +('2', '100', '14', '111539', '175683', '20'), +('2', '100', '14', '111535', '175288', '20'), +('2', '100', '14', '111237', '155614', '20'), +('2', '100', '11', '133816', '229833', '20'), +('2', '100', '11', '111334', '176735', '20'), +('2', '100', '11', '111337', '176574', '20'), +('2', '100', '11', '111338', '172618', '20'), +('2', '100', '22', '12425', '0', '19'), +('2', '100', '22', '39342', '0', '19'), +('2', '100', '22', '7867', '0', '19'), +('2', '100', '22', '23597', '0', '19'), +('2', '100', '1', '98769', '284214', '19'), +('2', '100', '1', '111304', '176471', '19'), +('2', '100', '1', '111307', '176271', '19'), +('2', '100', '1', '111310', '175012', '19'), +('2', '100', '2', '62988', '110524', '19'), +('2', '100', '2', '62985', '110324', '19'), +('2', '100', '2', '94056', '109977', '19'), +('2', '100', '2', '89368', '102809', '19'), +('2', '100', '3', '111314', '177168', '19'), +('2', '100', '3', '111316', '175457', '19'), +('2', '100', '3', '111315', '174574', '19'), +('2', '100', '3', '111013', '155318', '19'), +('2', '100', '5', '111319', '176520', '19'), +('2', '100', '5', '111318', '173792', '19'), +('2', '100', '5', '111317', '173520', '19'), +('2', '100', '5', '111320', '173137', '19'), +('2', '100', '8', '111332', '177363', '19'), +('2', '100', '8', '111330', '175194', '19'), +('2', '100', '8', '111331', '172909', '19'), +('2', '100', '8', '111328', '172679', '19'), +('2', '100', '6', '111323', '177259', '19'), +('2', '100', '6', '111326', '175856', '19'), +('2', '100', '6', '111324', '174238', '19'), +('2', '100', '6', '111022', '155408', '19'), +('2', '100', '17', '56046', '114293', '19'), +('2', '100', '17', '56083', '114222', '19'), +('2', '100', '17', '81765', '114214', '19'), +('2', '100', '17', '104406', '96544', '19'), +('2', '100', '7', '56080', '110076', '19'), +('2', '100', '7', '94053', '109101', '19'), +('2', '100', '7', '89369', '103919', '19'), +('2', '100', '7', '104404', '92447', '19'), +('2', '100', '9', '67098', '180047', '19'), +('2', '100', '9', '81764', '106642', '19'), +('2', '100', '9', '56070', '106467', '19'), +('2', '100', '9', '62984', '106265', '19'), +('2', '100', '15', '111350', '178667', '19'), +('2', '100', '15', '111344', '177773', '19'), +('2', '100', '15', '111340', '177123', '19'), +('2', '100', '15', '111342', '174907', '19'), +('2', '100', '20', '111356', '177166', '19'), +('2', '100', '20', '111352', '176508', '19'), +('2', '100', '20', '111351', '173791', '19'), +('2', '100', '20', '111054', '155315', '19'), +('2', '100', '12', '105332', '128985', '19'), +('2', '100', '12', '56035', '108391', '19'), +('2', '100', '12', '56073', '107236', '19'), +('2', '100', '12', '89366', '100835', '19'), +('2', '100', '18', '56041', '113992', '19'), +('2', '100', '18', '94054', '112773', '19'), +('2', '100', '18', '62986', '112516', '19'), +('2', '100', '18', '62987', '110876', '19'), +('2', '100', '19', '81763', '110764', '19'), +('2', '100', '19', '62990', '110425', '19'), +('2', '100', '19', '56037', '110408', '19'), +('2', '100', '19', '56075', '110288', '19'), +('2', '100', '13', '111518', '170621', '19'), +('2', '100', '13', '111517', '168888', '19'), +('2', '100', '13', '111217', '154230', '19'), +('2', '100', '13', '111218', '154179', '19'), +('2', '100', '14', '111537', '177466', '19'), +('2', '100', '14', '111539', '175683', '19'), +('2', '100', '14', '111535', '175288', '19'), +('2', '100', '14', '111237', '155614', '19'), +('2', '100', '11', '133816', '229833', '19'), +('2', '100', '11', '111334', '176735', '19'), +('2', '100', '11', '111337', '176574', '19'), +('2', '100', '11', '111338', '172618', '19'), +('2', '101', '22', '12425', '0', '20'), +('2', '101', '22', '39342', '0', '20'), +('2', '101', '22', '7867', '0', '20'), +('2', '101', '22', '23597', '0', '20'), +('2', '101', '1', '98769', '284218', '20'), +('2', '101', '1', '111304', '176479', '20'), +('2', '101', '1', '111307', '176275', '20'), +('2', '101', '1', '111310', '175018', '20'), +('2', '101', '2', '62988', '110528', '20'), +('2', '101', '2', '62985', '110332', '20'), +('2', '101', '2', '94056', '109982', '20'), +('2', '101', '2', '89368', '102814', '20'), +('2', '101', '3', '111314', '177175', '20'), +('2', '101', '3', '111316', '175463', '20'), +('2', '101', '3', '111315', '174580', '20'), +('2', '101', '3', '111013', '155324', '20'), +('2', '101', '5', '111319', '176525', '20'), +('2', '101', '5', '111318', '173797', '20'), +('2', '101', '5', '111317', '173526', '20'), +('2', '101', '5', '111320', '173142', '20'), +('2', '101', '8', '111332', '177370', '20'), +('2', '101', '8', '111330', '175200', '20'), +('2', '101', '8', '111331', '172917', '20'), +('2', '101', '8', '111328', '172683', '20'), +('2', '101', '6', '111323', '177265', '20'), +('2', '101', '6', '111326', '175865', '20'), +('2', '101', '6', '111324', '174243', '20'), +('2', '101', '6', '111022', '155415', '20'), +('2', '101', '17', '56046', '114299', '20'), +('2', '101', '17', '56083', '114225', '20'), +('2', '101', '17', '81765', '114219', '20'), +('2', '101', '17', '104406', '96551', '20'), +('2', '101', '7', '56080', '110084', '20'), +('2', '101', '7', '94053', '109106', '20'), +('2', '101', '7', '89369', '103925', '20'), +('2', '101', '7', '104404', '92454', '20'), +('2', '101', '9', '67098', '180053', '20'), +('2', '101', '9', '81764', '106653', '20'), +('2', '101', '9', '56070', '106473', '20'), +('2', '101', '9', '62984', '106271', '20'), +('2', '101', '15', '111350', '178675', '20'), +('2', '101', '15', '111344', '177781', '20'), +('2', '101', '15', '111340', '177129', '20'), +('2', '101', '15', '111342', '174914', '20'), +('2', '101', '20', '111356', '177170', '20'), +('2', '101', '20', '111352', '176514', '20'), +('2', '101', '20', '111351', '173798', '20'), +('2', '101', '20', '111054', '155320', '20'), +('2', '101', '12', '105332', '128987', '20'), +('2', '101', '12', '56035', '108400', '20'), +('2', '101', '12', '56073', '107242', '20'), +('2', '101', '12', '89366', '100840', '20'), +('2', '101', '18', '56041', '113998', '20'), +('2', '101', '18', '94054', '112778', '20'), +('2', '101', '18', '62986', '112524', '20'), +('2', '101', '18', '62987', '110881', '20'), +('2', '101', '19', '81763', '110774', '20'), +('2', '101', '19', '62990', '110429', '20'), +('2', '101', '19', '56037', '110415', '20'), +('2', '101', '19', '56075', '110296', '20'), +('2', '101', '13', '111518', '170628', '20'), +('2', '101', '13', '111517', '168895', '20'), +('2', '101', '13', '111217', '154237', '20'), +('2', '101', '13', '111218', '154186', '20'), +('2', '101', '14', '111537', '177472', '20'), +('2', '101', '14', '111539', '175690', '20'), +('2', '101', '14', '111535', '175294', '20'), +('2', '101', '14', '111237', '155621', '20'), +('2', '101', '11', '133816', '229838', '20'), +('2', '101', '11', '111334', '176741', '20'), +('2', '101', '11', '111337', '176583', '20'), +('2', '101', '11', '111338', '172623', '20'), +('2', '102', '22', '12425', '0', '20'), +('2', '102', '22', '39342', '0', '20'), +('2', '102', '22', '7867', '0', '20'), +('2', '102', '22', '23597', '0', '20'), +('2', '102', '1', '98769', '284222', '20'), +('2', '102', '1', '111304', '176486', '20'), +('2', '102', '1', '111307', '176278', '20'), +('2', '102', '1', '111310', '175024', '20'), +('2', '102', '2', '62988', '110532', '20'), +('2', '102', '2', '62985', '110340', '20'), +('2', '102', '2', '94056', '109988', '20'), +('2', '102', '2', '89368', '102820', '20'), +('2', '102', '3', '111314', '177181', '20'), +('2', '102', '3', '111316', '175469', '20'), +('2', '102', '3', '111315', '174587', '20'), +('2', '102', '3', '111013', '155330', '20'), +('2', '102', '5', '111319', '176530', '20'), +('2', '102', '5', '111318', '173802', '20'), +('2', '102', '5', '111317', '173532', '20'), +('2', '102', '5', '111320', '173147', '20'), +('2', '102', '8', '111332', '177377', '20'), +('2', '102', '8', '111330', '175206', '20'), +('2', '102', '8', '111331', '172924', '20'), +('2', '102', '8', '111328', '172688', '20'), +('2', '102', '6', '111323', '177272', '20'), +('2', '102', '6', '111326', '175874', '20'), +('2', '102', '6', '111324', '174248', '20'), +('2', '102', '6', '111022', '155421', '20'), +('2', '102', '17', '56046', '114305', '20'), +('2', '102', '17', '56083', '114229', '20'), +('2', '102', '17', '81765', '114224', '20'), +('2', '102', '17', '104406', '96557', '20'), +('2', '102', '7', '56080', '110091', '20'), +('2', '102', '7', '94053', '109110', '20'), +('2', '102', '7', '89369', '103931', '20'), +('2', '102', '7', '104404', '92462', '20'), +('2', '102', '9', '67098', '180058', '20'), +('2', '102', '9', '81764', '106663', '20'), +('2', '102', '9', '56070', '106480', '20'), +('2', '102', '9', '62984', '106277', '20'), +('2', '102', '15', '111350', '178683', '20'), +('2', '102', '15', '111344', '177789', '20'), +('2', '102', '15', '111340', '177136', '20'), +('2', '102', '15', '111342', '174921', '20'), +('2', '102', '20', '111356', '177175', '20'), +('2', '102', '20', '111352', '176521', '20'), +('2', '102', '20', '111351', '173805', '20'), +('2', '102', '20', '111054', '155325', '20'), +('2', '102', '12', '105332', '128989', '20'), +('2', '102', '12', '56035', '108410', '20'), +('2', '102', '12', '56073', '107248', '20'), +('2', '102', '12', '89366', '100845', '20'), +('2', '102', '18', '56041', '114004', '20'), +('2', '102', '18', '94054', '112782', '20'), +('2', '102', '18', '62986', '112531', '20'), +('2', '102', '18', '62987', '110886', '20'), +('2', '102', '19', '81763', '110784', '20'), +('2', '102', '19', '62990', '110434', '20'), +('2', '102', '19', '56037', '110422', '20'), +('2', '102', '19', '56075', '110304', '20'), +('2', '102', '13', '111518', '170635', '20'), +('2', '102', '13', '111517', '168901', '20'), +('2', '102', '13', '111217', '154243', '20'), +('2', '102', '13', '111218', '154192', '20'), +('2', '102', '14', '111537', '177479', '20'), +('2', '102', '14', '111539', '175698', '20'), +('2', '102', '14', '111535', '175300', '20'), +('2', '102', '14', '111237', '155627', '20'), +('2', '102', '11', '133816', '229843', '20'), +('2', '102', '11', '111334', '176748', '20'), +('2', '102', '11', '111337', '176592', '20'), +('2', '102', '11', '111338', '172628', '20'), +('2', '103', '22', '12425', '0', '20'), +('2', '103', '22', '39342', '0', '20'), +('2', '103', '22', '7867', '0', '20'), +('2', '103', '22', '23597', '0', '20'), +('2', '103', '1', '98769', '284226', '20'), +('2', '103', '1', '111304', '176494', '20'), +('2', '103', '1', '111307', '176282', '20'), +('2', '103', '1', '111310', '175031', '20'), +('2', '103', '2', '62988', '110536', '20'), +('2', '103', '2', '62985', '110349', '20'), +('2', '103', '2', '94056', '109993', '20'), +('2', '103', '2', '89368', '102825', '20'), +('2', '103', '3', '111314', '177187', '20'), +('2', '103', '3', '111316', '175475', '20'), +('2', '103', '3', '111315', '174593', '20'), +('2', '103', '3', '111013', '155336', '20'), +('2', '103', '5', '111319', '176536', '20'), +('2', '103', '5', '111318', '173807', '20'), +('2', '103', '5', '111317', '173538', '20'), +('2', '103', '5', '111320', '173152', '20'), +('2', '103', '8', '111332', '177384', '20'), +('2', '103', '8', '111330', '175212', '20'), +('2', '103', '8', '111331', '172932', '20'), +('2', '103', '8', '111328', '172692', '20'), +('2', '103', '6', '111323', '177278', '20'), +('2', '103', '6', '111326', '175882', '20'), +('2', '103', '6', '111324', '174253', '20'), +('2', '103', '6', '111022', '155428', '20'), +('2', '103', '17', '56046', '114311', '20'), +('2', '103', '17', '56083', '114232', '20'), +('2', '103', '17', '81765', '114229', '20'), +('2', '103', '17', '104406', '96563', '20'), +('2', '103', '7', '56080', '110099', '20'), +('2', '103', '7', '94053', '109115', '20'), +('2', '103', '7', '89369', '103936', '20'), +('2', '103', '7', '104404', '92469', '20'), +('2', '103', '9', '67098', '180063', '20'), +('2', '103', '9', '81764', '106673', '20'), +('2', '103', '9', '56070', '106486', '20'), +('2', '103', '9', '62984', '106284', '20'), +('2', '103', '15', '111350', '178691', '20'), +('2', '103', '15', '111344', '177797', '20'), +('2', '103', '15', '111340', '177142', '20'), +('2', '103', '15', '111342', '174928', '20'), +('2', '103', '20', '111356', '177180', '20'), +('2', '103', '20', '111352', '176527', '20'), +('2', '103', '20', '111351', '173812', '20'), +('2', '103', '20', '111054', '155329', '20'), +('2', '103', '12', '105332', '128992', '20'), +('2', '103', '12', '56035', '108419', '20'), +('2', '103', '12', '56073', '107254', '20'), +('2', '103', '12', '89366', '100850', '20'), +('2', '103', '18', '56041', '114010', '20'), +('2', '103', '18', '94054', '112787', '20'), +('2', '103', '18', '62986', '112539', '20'), +('2', '103', '18', '62987', '110891', '20'), +('2', '103', '19', '81763', '110794', '20'), +('2', '103', '19', '62990', '110438', '20'), +('2', '103', '19', '56037', '110429', '20'), +('2', '103', '19', '56075', '110312', '20'), +('2', '103', '13', '111518', '170641', '20'), +('2', '103', '13', '111517', '168907', '20'), +('2', '103', '13', '111217', '154249', '20'), +('2', '103', '13', '111218', '154198', '20'), +('2', '103', '14', '111537', '177485', '20'), +('2', '103', '14', '111539', '175705', '20'), +('2', '103', '14', '111535', '175306', '20'), +('2', '103', '14', '111237', '155634', '20'), +('2', '103', '11', '133816', '229848', '20'), +('2', '103', '11', '111334', '176754', '20'), +('2', '103', '11', '111337', '176601', '20'), +('2', '103', '11', '111338', '172633', '20'), +('2', '104', '22', '12425', '0', '20'), +('2', '104', '22', '39342', '0', '20'), +('2', '104', '22', '7867', '0', '20'), +('2', '104', '22', '23597', '0', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '104', '1', '98769', '284230', '20'), +('2', '104', '1', '111304', '176501', '20'), +('2', '104', '1', '111307', '176285', '20'), +('2', '104', '1', '111310', '175037', '20'), +('2', '104', '2', '62988', '110540', '20'), +('2', '104', '2', '62985', '110357', '20'), +('2', '104', '2', '94056', '109998', '20'), +('2', '104', '2', '89368', '102831', '20'), +('2', '104', '3', '111314', '177193', '20'), +('2', '104', '3', '111316', '175481', '20'), +('2', '104', '3', '111315', '174599', '20'), +('2', '104', '3', '111013', '155342', '20'), +('2', '104', '5', '111319', '176541', '20'), +('2', '104', '5', '111318', '173812', '20'), +('2', '104', '5', '111317', '173544', '20'), +('2', '104', '5', '111320', '173157', '20'), +('2', '104', '8', '111332', '177391', '20'), +('2', '104', '8', '111330', '175218', '20'), +('2', '104', '8', '111331', '172939', '20'), +('2', '104', '8', '111328', '172696', '20'), +('2', '104', '6', '111323', '177285', '20'), +('2', '104', '6', '111326', '175891', '20'), +('2', '104', '6', '111324', '174258', '20'), +('2', '104', '6', '111022', '155434', '20'), +('2', '104', '17', '56046', '114318', '20'), +('2', '104', '17', '56083', '114236', '20'), +('2', '104', '17', '81765', '114235', '20'), +('2', '104', '17', '104406', '96569', '20'), +('2', '104', '7', '56080', '110106', '20'), +('2', '104', '7', '94053', '109120', '20'), +('2', '104', '7', '89369', '103942', '20'), +('2', '104', '7', '104404', '92476', '20'), +('2', '104', '9', '67098', '180069', '20'), +('2', '104', '9', '81764', '106683', '20'), +('2', '104', '9', '56070', '106492', '20'), +('2', '104', '9', '62984', '106290', '20'), +('2', '104', '15', '111350', '178699', '20'), +('2', '104', '15', '111344', '177805', '20'), +('2', '104', '15', '111340', '177148', '20'), +('2', '104', '15', '111342', '174935', '20'), +('2', '104', '20', '111356', '177185', '20'), +('2', '104', '20', '111352', '176534', '20'), +('2', '104', '20', '111351', '173818', '20'), +('2', '104', '20', '111054', '155334', '20'), +('2', '104', '12', '105332', '128994', '20'), +('2', '104', '12', '56035', '108429', '20'), +('2', '104', '12', '56073', '107260', '20'), +('2', '104', '12', '89366', '100854', '20'), +('2', '104', '18', '56041', '114016', '20'), +('2', '104', '18', '94054', '112791', '20'), +('2', '104', '18', '62986', '112546', '20'), +('2', '104', '18', '62987', '110896', '20'), +('2', '104', '19', '81763', '110804', '20'), +('2', '104', '19', '62990', '110443', '20'), +('2', '104', '19', '56037', '110436', '20'), +('2', '104', '19', '56075', '110320', '20'), +('2', '104', '13', '111518', '170648', '20'), +('2', '104', '13', '111517', '168914', '20'), +('2', '104', '13', '111217', '154255', '20'), +('2', '104', '13', '111218', '154204', '20'), +('2', '104', '14', '111537', '177492', '20'), +('2', '104', '14', '111539', '175713', '20'), +('2', '104', '14', '111535', '175312', '20'), +('2', '104', '14', '111237', '155640', '20'), +('2', '104', '11', '133816', '229853', '20'), +('2', '104', '11', '111334', '176760', '20'), +('2', '104', '11', '111337', '176611', '20'), +('2', '104', '11', '111338', '172638', '20'), +('2', '105', '22', '12425', '0', '23'), +('2', '105', '22', '39342', '0', '23'), +('2', '105', '22', '7867', '0', '23'), +('2', '105', '22', '23597', '0', '23'), +('2', '105', '1', '98769', '284235', '23'), +('2', '105', '1', '111304', '176509', '23'), +('2', '105', '1', '111307', '176289', '23'), +('2', '105', '1', '111310', '175043', '23'), +('2', '105', '2', '62988', '110544', '23'), +('2', '105', '2', '62985', '110365', '23'), +('2', '105', '2', '94056', '110004', '23'), +('2', '105', '2', '89368', '102837', '23'), +('2', '105', '3', '111314', '177199', '23'), +('2', '105', '3', '111316', '175487', '23'), +('2', '105', '3', '111315', '174605', '23'), +('2', '105', '3', '111013', '155349', '23'), +('2', '105', '5', '111319', '176547', '23'), +('2', '105', '5', '111318', '173818', '23'), +('2', '105', '5', '111317', '173550', '23'), +('2', '105', '5', '111320', '173163', '23'), +('2', '105', '8', '111332', '177398', '23'), +('2', '105', '8', '111330', '175225', '23'), +('2', '105', '8', '111331', '172947', '23'), +('2', '105', '8', '111328', '172700', '23'), +('2', '105', '6', '111323', '177292', '23'), +('2', '105', '6', '111326', '175900', '23'), +('2', '105', '6', '111324', '174263', '23'), +('2', '105', '6', '111022', '155441', '23'), +('2', '105', '17', '56046', '114324', '23'), +('2', '105', '17', '81765', '114240', '23'), +('2', '105', '17', '56083', '114239', '23'), +('2', '105', '17', '104406', '96576', '23'), +('2', '105', '7', '56080', '110114', '23'), +('2', '105', '7', '94053', '109125', '23'), +('2', '105', '7', '89369', '103948', '23'), +('2', '105', '7', '104404', '92484', '23'), +('2', '105', '9', '67098', '180074', '23'), +('2', '105', '9', '81764', '106694', '23'), +('2', '105', '9', '56070', '106498', '23'), +('2', '105', '9', '62984', '106296', '23'), +('2', '105', '15', '111350', '178707', '23'), +('2', '105', '15', '111344', '177814', '23'), +('2', '105', '15', '111340', '177155', '23'), +('2', '105', '15', '111342', '174942', '23'), +('2', '105', '20', '111356', '177190', '23'), +('2', '105', '20', '111352', '176540', '23'), +('2', '105', '20', '111351', '173825', '23'), +('2', '105', '20', '111054', '155339', '23'), +('2', '105', '12', '105332', '128996', '23'), +('2', '105', '12', '56035', '108438', '23'), +('2', '105', '12', '56073', '107267', '23'), +('2', '105', '12', '89366', '100859', '23'), +('2', '105', '18', '56041', '114022', '23'), +('2', '105', '18', '94054', '112796', '23'), +('2', '105', '18', '62986', '112554', '23'), +('2', '105', '18', '62987', '110901', '23'), +('2', '105', '19', '81763', '110814', '23'), +('2', '105', '19', '62990', '110447', '23'), +('2', '105', '19', '56037', '110443', '23'), +('2', '105', '19', '56075', '110328', '23'), +('2', '105', '13', '111518', '170654', '23'), +('2', '105', '13', '111517', '168920', '23'), +('2', '105', '13', '111217', '154261', '23'), +('2', '105', '13', '111218', '154211', '23'), +('2', '105', '14', '111537', '177498', '23'), +('2', '105', '14', '111539', '175720', '23'), +('2', '105', '14', '111535', '175318', '23'), +('2', '105', '14', '111237', '155647', '23'), +('2', '105', '11', '133816', '229858', '23'), +('2', '105', '11', '111334', '176766', '23'), +('2', '105', '11', '111337', '176620', '23'), +('2', '105', '11', '111338', '172643', '23'), +('2', '105', '22', '12425', '0', '22'), +('2', '105', '22', '39342', '0', '22'), +('2', '105', '22', '7867', '0', '22'), +('2', '105', '22', '23597', '0', '22'), +('2', '105', '1', '98769', '284235', '22'), +('2', '105', '1', '111304', '176509', '22'), +('2', '105', '1', '111307', '176289', '22'), +('2', '105', '1', '111310', '175043', '22'), +('2', '105', '2', '62988', '110544', '22'), +('2', '105', '2', '62985', '110365', '22'), +('2', '105', '2', '94056', '110004', '22'), +('2', '105', '2', '89368', '102837', '22'), +('2', '105', '3', '111314', '177199', '22'), +('2', '105', '3', '111316', '175487', '22'), +('2', '105', '3', '111315', '174605', '22'), +('2', '105', '3', '111013', '155349', '22'), +('2', '105', '5', '111319', '176547', '22'), +('2', '105', '5', '111318', '173818', '22'), +('2', '105', '5', '111317', '173550', '22'), +('2', '105', '5', '111320', '173163', '22'), +('2', '105', '8', '111332', '177398', '22'), +('2', '105', '8', '111330', '175225', '22'), +('2', '105', '8', '111331', '172947', '22'), +('2', '105', '8', '111328', '172700', '22'), +('2', '105', '6', '111323', '177292', '22'), +('2', '105', '6', '111326', '175900', '22'), +('2', '105', '6', '111324', '174263', '22'), +('2', '105', '6', '111022', '155441', '22'), +('2', '105', '17', '56046', '114324', '22'), +('2', '105', '17', '81765', '114240', '22'), +('2', '105', '17', '56083', '114239', '22'), +('2', '105', '17', '104406', '96576', '22'), +('2', '105', '7', '56080', '110114', '22'), +('2', '105', '7', '94053', '109125', '22'), +('2', '105', '7', '89369', '103948', '22'), +('2', '105', '7', '104404', '92484', '22'), +('2', '105', '9', '67098', '180074', '22'), +('2', '105', '9', '81764', '106694', '22'), +('2', '105', '9', '56070', '106498', '22'), +('2', '105', '9', '62984', '106296', '22'), +('2', '105', '15', '111350', '178707', '22'), +('2', '105', '15', '111344', '177814', '22'), +('2', '105', '15', '111340', '177155', '22'), +('2', '105', '15', '111342', '174942', '22'), +('2', '105', '20', '111356', '177190', '22'), +('2', '105', '20', '111352', '176540', '22'), +('2', '105', '20', '111351', '173825', '22'), +('2', '105', '20', '111054', '155339', '22'), +('2', '105', '12', '105332', '128996', '22'), +('2', '105', '12', '56035', '108438', '22'), +('2', '105', '12', '56073', '107267', '22'), +('2', '105', '12', '89366', '100859', '22'), +('2', '105', '18', '56041', '114022', '22'), +('2', '105', '18', '94054', '112796', '22'), +('2', '105', '18', '62986', '112554', '22'), +('2', '105', '18', '62987', '110901', '22'), +('2', '105', '19', '81763', '110814', '22'), +('2', '105', '19', '62990', '110447', '22'), +('2', '105', '19', '56037', '110443', '22'), +('2', '105', '19', '56075', '110328', '22'), +('2', '105', '13', '111518', '170654', '22'), +('2', '105', '13', '111517', '168920', '22'), +('2', '105', '13', '111217', '154261', '22'), +('2', '105', '13', '111218', '154211', '22'), +('2', '105', '14', '111537', '177498', '22'), +('2', '105', '14', '111539', '175720', '22'), +('2', '105', '14', '111535', '175318', '22'), +('2', '105', '14', '111237', '155647', '22'), +('2', '105', '11', '133816', '229858', '22'), +('2', '105', '11', '111334', '176766', '22'), +('2', '105', '11', '111337', '176620', '22'), +('2', '105', '11', '111338', '172643', '22'), +('2', '105', '22', '12425', '0', '21'), +('2', '105', '22', '39342', '0', '21'), +('2', '105', '22', '7867', '0', '21'), +('2', '105', '22', '23597', '0', '21'), +('2', '105', '1', '98769', '284235', '21'), +('2', '105', '1', '111304', '176509', '21'), +('2', '105', '1', '111307', '176289', '21'), +('2', '105', '1', '111310', '175043', '21'), +('2', '105', '2', '62988', '110544', '21'), +('2', '105', '2', '62985', '110365', '21'), +('2', '105', '2', '94056', '110004', '21'), +('2', '105', '2', '89368', '102837', '21'), +('2', '105', '3', '111314', '177199', '21'), +('2', '105', '3', '111316', '175487', '21'), +('2', '105', '3', '111315', '174605', '21'), +('2', '105', '3', '111013', '155349', '21'), +('2', '105', '5', '111319', '176547', '21'), +('2', '105', '5', '111318', '173818', '21'), +('2', '105', '5', '111317', '173550', '21'), +('2', '105', '5', '111320', '173163', '21'), +('2', '105', '8', '111332', '177398', '21'), +('2', '105', '8', '111330', '175225', '21'), +('2', '105', '8', '111331', '172947', '21'), +('2', '105', '8', '111328', '172700', '21'), +('2', '105', '6', '111323', '177292', '21'), +('2', '105', '6', '111326', '175900', '21'), +('2', '105', '6', '111324', '174263', '21'), +('2', '105', '6', '111022', '155441', '21'), +('2', '105', '17', '56046', '114324', '21'), +('2', '105', '17', '81765', '114240', '21'), +('2', '105', '17', '56083', '114239', '21'), +('2', '105', '17', '104406', '96576', '21'), +('2', '105', '7', '56080', '110114', '21'), +('2', '105', '7', '94053', '109125', '21'), +('2', '105', '7', '89369', '103948', '21'), +('2', '105', '7', '104404', '92484', '21'), +('2', '105', '9', '67098', '180074', '21'), +('2', '105', '9', '81764', '106694', '21'), +('2', '105', '9', '56070', '106498', '21'), +('2', '105', '9', '62984', '106296', '21'), +('2', '105', '15', '111350', '178707', '21'), +('2', '105', '15', '111344', '177814', '21'), +('2', '105', '15', '111340', '177155', '21'), +('2', '105', '15', '111342', '174942', '21'), +('2', '105', '20', '111356', '177190', '21'), +('2', '105', '20', '111352', '176540', '21'), +('2', '105', '20', '111351', '173825', '21'), +('2', '105', '20', '111054', '155339', '21'), +('2', '105', '12', '105332', '128996', '21'), +('2', '105', '12', '56035', '108438', '21'), +('2', '105', '12', '56073', '107267', '21'), +('2', '105', '12', '89366', '100859', '21'), +('2', '105', '18', '56041', '114022', '21'), +('2', '105', '18', '94054', '112796', '21'), +('2', '105', '18', '62986', '112554', '21'), +('2', '105', '18', '62987', '110901', '21'), +('2', '105', '19', '81763', '110814', '21'), +('2', '105', '19', '62990', '110447', '21'), +('2', '105', '19', '56037', '110443', '21'), +('2', '105', '19', '56075', '110328', '21'), +('2', '105', '13', '111518', '170654', '21'), +('2', '105', '13', '111517', '168920', '21'), +('2', '105', '13', '111217', '154261', '21'), +('2', '105', '13', '111218', '154211', '21'), +('2', '105', '14', '111537', '177498', '21'), +('2', '105', '14', '111539', '175720', '21'), +('2', '105', '14', '111535', '175318', '21'), +('2', '105', '14', '111237', '155647', '21'), +('2', '105', '11', '133816', '229858', '21'), +('2', '105', '11', '111334', '176766', '21'), +('2', '105', '11', '111337', '176620', '21'), +('2', '105', '11', '111338', '172643', '21'), +('2', '106', '22', '12425', '0', '23'), +('2', '106', '22', '39342', '0', '23'), +('2', '106', '22', '7867', '0', '23'), +('2', '106', '22', '23597', '0', '23'), +('2', '106', '1', '98769', '284239', '23'), +('2', '106', '1', '111304', '176516', '23'), +('2', '106', '1', '111307', '176293', '23'), +('2', '106', '1', '111310', '175049', '23'), +('2', '106', '2', '62988', '110548', '23'), +('2', '106', '2', '62985', '110373', '23'), +('2', '106', '2', '94056', '110009', '23'), +('2', '106', '2', '89368', '102842', '23'), +('2', '106', '3', '111314', '177205', '23'), +('2', '106', '3', '111316', '175494', '23'), +('2', '106', '3', '111315', '174612', '23'), +('2', '106', '3', '111013', '155355', '23'), +('2', '106', '5', '111319', '176552', '23'), +('2', '106', '5', '111318', '173823', '23'), +('2', '106', '5', '111317', '173556', '23'), +('2', '106', '5', '111320', '173168', '23'), +('2', '106', '8', '111332', '177405', '23'), +('2', '106', '8', '111330', '175231', '23'), +('2', '106', '8', '111331', '172955', '23'), +('2', '106', '8', '111328', '172704', '23'), +('2', '106', '6', '111323', '177298', '23'), +('2', '106', '6', '111326', '175909', '23'), +('2', '106', '6', '111324', '174268', '23'), +('2', '106', '6', '111022', '155448', '23'), +('2', '106', '17', '56046', '114330', '23'), +('2', '106', '17', '81765', '114245', '23'), +('2', '106', '17', '56083', '114243', '23'), +('2', '106', '17', '104406', '96582', '23'), +('2', '106', '7', '56080', '110121', '23'), +('2', '106', '7', '94053', '109130', '23'), +('2', '106', '7', '89369', '103954', '23'), +('2', '106', '7', '104404', '92491', '23'), +('2', '106', '9', '67098', '180079', '23'), +('2', '106', '9', '81764', '106704', '23'), +('2', '106', '9', '56070', '106504', '23'), +('2', '106', '9', '62984', '106302', '23'), +('2', '106', '15', '111350', '178715', '23'), +('2', '106', '15', '111344', '177822', '23'), +('2', '106', '15', '111340', '177161', '23'), +('2', '106', '15', '111342', '174949', '23'), +('2', '106', '20', '111356', '177195', '23'), +('2', '106', '20', '111352', '176547', '23'), +('2', '106', '20', '111351', '173832', '23'), +('2', '106', '20', '111054', '155344', '23'), +('2', '106', '12', '105332', '128998', '23'), +('2', '106', '12', '56035', '108448', '23'), +('2', '106', '12', '56073', '107273', '23'), +('2', '106', '12', '89366', '100864', '23'), +('2', '106', '18', '56041', '114028', '23'), +('2', '106', '18', '94054', '112800', '23'), +('2', '106', '18', '62986', '112561', '23'), +('2', '106', '18', '62987', '110905', '23'), +('2', '106', '19', '81763', '110823', '23'), +('2', '106', '19', '62990', '110451', '23'), +('2', '106', '19', '56037', '110450', '23'), +('2', '106', '19', '56075', '110336', '23'), +('2', '106', '13', '111518', '170661', '23'), +('2', '106', '13', '111517', '168926', '23'), +('2', '106', '13', '111217', '154267', '23'), +('2', '106', '13', '111218', '154217', '23'), +('2', '106', '14', '111537', '177505', '23'), +('2', '106', '14', '111539', '175728', '23'), +('2', '106', '14', '111535', '175324', '23'), +('2', '106', '14', '111237', '155653', '23'), +('2', '106', '11', '133816', '229863', '23'), +('2', '106', '11', '111334', '176772', '23'), +('2', '106', '11', '111337', '176629', '23'), +('2', '106', '11', '111338', '172648', '23'), +('2', '107', '22', '12425', '0', '23'), +('2', '107', '22', '39342', '0', '23'), +('2', '107', '22', '7867', '0', '23'), +('2', '107', '22', '23597', '0', '23'), +('2', '107', '1', '98769', '284243', '23'), +('2', '107', '1', '111304', '176524', '23'), +('2', '107', '1', '111307', '176296', '23'), +('2', '107', '1', '111310', '175055', '23'), +('2', '107', '2', '62988', '110552', '23'), +('2', '107', '2', '62985', '110382', '23'), +('2', '107', '2', '94056', '110014', '23'), +('2', '107', '2', '89368', '102848', '23'), +('2', '107', '3', '111314', '177212', '23'), +('2', '107', '3', '111316', '175500', '23'), +('2', '107', '3', '111315', '174618', '23'), +('2', '107', '3', '111013', '155361', '23'), +('2', '107', '5', '111319', '176557', '23'), +('2', '107', '5', '111318', '173828', '23'), +('2', '107', '5', '111317', '173562', '23'), +('2', '107', '5', '111320', '173173', '23'), +('2', '107', '8', '111332', '177412', '23'), +('2', '107', '8', '111330', '175237', '23'), +('2', '107', '8', '111331', '172962', '23'), +('2', '107', '8', '111328', '172708', '23'), +('2', '107', '6', '111323', '177305', '23'), +('2', '107', '6', '111326', '175918', '23'), +('2', '107', '6', '111324', '174273', '23'), +('2', '107', '6', '111022', '155454', '23'), +('2', '107', '17', '56046', '114336', '23'), +('2', '107', '17', '81765', '114250', '23'), +('2', '107', '17', '56083', '114246', '23'), +('2', '107', '17', '104406', '96588', '23'), +('2', '107', '7', '56080', '110129', '23'), +('2', '107', '7', '94053', '109134', '23'), +('2', '107', '7', '89369', '103959', '23'), +('2', '107', '7', '104404', '92498', '23'), +('2', '107', '9', '67098', '180085', '23'), +('2', '107', '9', '81764', '106714', '23'), +('2', '107', '9', '56070', '106510', '23'), +('2', '107', '9', '62984', '106309', '23'), +('2', '107', '15', '111350', '178723', '23'), +('2', '107', '15', '111344', '177830', '23'), +('2', '107', '15', '111340', '177167', '23'), +('2', '107', '15', '111342', '174956', '23'), +('2', '107', '20', '111356', '177199', '23'), +('2', '107', '20', '111352', '176554', '23'), +('2', '107', '20', '111351', '173839', '23'), +('2', '107', '20', '111054', '155349', '23'), +('2', '107', '12', '105332', '129000', '23'), +('2', '107', '12', '56035', '108457', '23'), +('2', '107', '12', '56073', '107279', '23'), +('2', '107', '12', '89366', '100869', '23'), +('2', '107', '18', '56041', '114034', '23'), +('2', '107', '18', '94054', '112805', '23'), +('2', '107', '18', '62986', '112568', '23'), +('2', '107', '18', '62987', '110910', '23'), +('2', '107', '19', '81763', '110833', '23'), +('2', '107', '19', '56037', '110458', '23'), +('2', '107', '19', '62990', '110456', '23'), +('2', '107', '19', '56075', '110344', '23'), +('2', '107', '13', '111518', '170667', '23'), +('2', '107', '13', '111517', '168932', '23'), +('2', '107', '13', '111217', '154273', '23'), +('2', '107', '13', '111218', '154223', '23'), +('2', '107', '14', '111537', '177512', '23'), +('2', '107', '14', '111539', '175736', '23'), +('2', '107', '14', '111535', '175330', '23'), +('2', '107', '14', '111237', '155660', '23'), +('2', '107', '11', '133816', '229868', '23'), +('2', '107', '11', '111334', '176778', '23'), +('2', '107', '11', '111337', '176638', '23'), +('2', '107', '11', '111338', '172653', '23'), +('2', '108', '22', '12425', '0', '23'), +('2', '108', '22', '39342', '0', '23'), +('2', '108', '22', '7867', '0', '23'), +('2', '108', '22', '23597', '0', '23'), +('2', '108', '1', '98769', '284247', '23'), +('2', '108', '1', '111304', '176531', '23'), +('2', '108', '1', '111307', '176300', '23'), +('2', '108', '1', '111310', '175062', '23'), +('2', '108', '2', '62988', '110556', '23'), +('2', '108', '2', '62985', '110390', '23'), +('2', '108', '2', '94056', '110020', '23'), +('2', '108', '2', '89368', '102853', '23'), +('2', '108', '3', '111314', '177218', '23'), +('2', '108', '3', '111316', '175506', '23'), +('2', '108', '3', '111315', '174624', '23'), +('2', '108', '3', '111013', '155367', '23'), +('2', '108', '5', '111319', '176563', '23'), +('2', '108', '5', '111318', '173833', '23'), +('2', '108', '5', '111317', '173568', '23'), +('2', '108', '5', '111320', '173178', '23'), +('2', '108', '8', '111332', '177420', '23'), +('2', '108', '8', '111330', '175243', '23'), +('2', '108', '8', '111331', '172970', '23'), +('2', '108', '8', '111328', '172713', '23'), +('2', '108', '6', '111323', '177311', '23'), +('2', '108', '6', '111326', '175927', '23'), +('2', '108', '6', '111324', '174278', '23'), +('2', '108', '6', '111022', '155461', '23'), +('2', '108', '17', '56046', '114343', '23'), +('2', '108', '17', '81765', '114255', '23'), +('2', '108', '17', '56083', '114250', '23'), +('2', '108', '17', '104406', '96594', '23'), +('2', '108', '7', '56080', '110137', '23'), +('2', '108', '7', '94053', '109139', '23'), +('2', '108', '7', '89369', '103965', '23'), +('2', '108', '7', '104404', '92506', '23'), +('2', '108', '9', '67098', '180090', '23'), +('2', '108', '9', '81764', '106725', '23'), +('2', '108', '9', '56070', '106516', '23'), +('2', '108', '9', '62984', '106315', '23'), +('2', '108', '15', '111350', '178731', '23'), +('2', '108', '15', '111344', '177838', '23'), +('2', '108', '15', '111340', '177174', '23'), +('2', '108', '15', '111342', '174963', '23'), +('2', '108', '20', '111356', '177204', '23'), +('2', '108', '20', '111352', '176560', '23'), +('2', '108', '20', '111351', '173846', '23'), +('2', '108', '20', '111054', '155354', '23'), +('2', '108', '12', '105332', '129002', '23'), +('2', '108', '12', '56035', '108467', '23'), +('2', '108', '12', '56073', '107285', '23'), +('2', '108', '12', '89366', '100873', '23'), +('2', '108', '18', '56041', '114040', '23'), +('2', '108', '18', '94054', '112809', '23'), +('2', '108', '18', '62986', '112576', '23'), +('2', '108', '18', '62987', '110915', '23'), +('2', '108', '19', '81763', '110843', '23'), +('2', '108', '19', '56037', '110465', '23'), +('2', '108', '19', '62990', '110460', '23'), +('2', '108', '19', '56075', '110352', '23'), +('2', '108', '13', '111518', '170674', '23'), +('2', '108', '13', '111517', '168938', '23'), +('2', '108', '13', '111217', '154279', '23'), +('2', '108', '13', '111218', '154229', '23'), +('2', '108', '14', '111537', '177518', '23'), +('2', '108', '14', '111539', '175743', '23'), +('2', '108', '14', '111535', '175336', '23'), +('2', '108', '14', '111237', '155667', '23'), +('2', '108', '11', '133816', '229873', '23'), +('2', '108', '11', '111334', '176784', '23'), +('2', '108', '11', '111337', '176647', '23'), +('2', '108', '11', '111338', '172658', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '109', '22', '12425', '0', '23'), +('2', '109', '22', '39342', '0', '23'), +('2', '109', '22', '7867', '0', '23'), +('2', '109', '22', '23597', '0', '23'), +('2', '109', '1', '98769', '284251', '23'), +('2', '109', '1', '111304', '176539', '23'), +('2', '109', '1', '111307', '176303', '23'), +('2', '109', '1', '111310', '175068', '23'), +('2', '109', '2', '62988', '110560', '23'), +('2', '109', '2', '62985', '110398', '23'), +('2', '109', '2', '94056', '110025', '23'), +('2', '109', '2', '89368', '102859', '23'), +('2', '109', '3', '111314', '177224', '23'), +('2', '109', '3', '111316', '175512', '23'), +('2', '109', '3', '111315', '174630', '23'), +('2', '109', '3', '111013', '155373', '23'), +('2', '109', '5', '111319', '176568', '23'), +('2', '109', '5', '111318', '173838', '23'), +('2', '109', '5', '111317', '173574', '23'), +('2', '109', '5', '111320', '173183', '23'), +('2', '109', '8', '111332', '177427', '23'), +('2', '109', '8', '111330', '175249', '23'), +('2', '109', '8', '111331', '172977', '23'), +('2', '109', '8', '111328', '172717', '23'), +('2', '109', '6', '111323', '177318', '23'), +('2', '109', '6', '111326', '175936', '23'), +('2', '109', '6', '111324', '174283', '23'), +('2', '109', '6', '111022', '155467', '23'), +('2', '109', '17', '56046', '114349', '23'), +('2', '109', '17', '81765', '114260', '23'), +('2', '109', '17', '56083', '114253', '23'), +('2', '109', '17', '104406', '96601', '23'), +('2', '109', '7', '56080', '110144', '23'), +('2', '109', '7', '94053', '109144', '23'), +('2', '109', '7', '89369', '103971', '23'), +('2', '109', '7', '104404', '92513', '23'), +('2', '109', '9', '67098', '180095', '23'), +('2', '109', '9', '81764', '106735', '23'), +('2', '109', '9', '56070', '106522', '23'), +('2', '109', '9', '62984', '106321', '23'), +('2', '109', '15', '111350', '178739', '23'), +('2', '109', '15', '111344', '177846', '23'), +('2', '109', '15', '111340', '177180', '23'), +('2', '109', '15', '111342', '174970', '23'), +('2', '109', '20', '111356', '177209', '23'), +('2', '109', '20', '111352', '176567', '23'), +('2', '109', '20', '111351', '173853', '23'), +('2', '109', '20', '111054', '155359', '23'), +('2', '109', '12', '105332', '129004', '23'), +('2', '109', '12', '56035', '108476', '23'), +('2', '109', '12', '56073', '107291', '23'), +('2', '109', '12', '89366', '100878', '23'), +('2', '109', '18', '56041', '114046', '23'), +('2', '109', '18', '94054', '112814', '23'), +('2', '109', '18', '62986', '112583', '23'), +('2', '109', '18', '62987', '110920', '23'), +('2', '109', '19', '81763', '110853', '23'), +('2', '109', '19', '56037', '110472', '23'), +('2', '109', '19', '62990', '110464', '23'), +('2', '109', '19', '56075', '110360', '23'), +('2', '109', '13', '111518', '170680', '23'), +('2', '109', '13', '111517', '168944', '23'), +('2', '109', '13', '111217', '154285', '23'), +('2', '109', '13', '111218', '154236', '23'), +('2', '109', '14', '111537', '177525', '23'), +('2', '109', '14', '111539', '175751', '23'), +('2', '109', '14', '111535', '175342', '23'), +('2', '109', '14', '111237', '155673', '23'), +('2', '109', '11', '133816', '229877', '23'), +('2', '109', '11', '111334', '176791', '23'), +('2', '109', '11', '111337', '176656', '23'), +('2', '109', '11', '111338', '172663', '23'), +('2', '110', '22', '39342', '0', '25'), +('2', '110', '22', '7867', '0', '25'), +('2', '110', '22', '23597', '0', '25'), +('2', '110', '22', '53550', '0', '25'), +('2', '110', '1', '98769', '284255', '25'), +('2', '110', '1', '111304', '176546', '25'), +('2', '110', '1', '111307', '176307', '25'), +('2', '110', '1', '111310', '175074', '25'), +('2', '110', '2', '62988', '110564', '25'), +('2', '110', '2', '62985', '110407', '25'), +('2', '110', '2', '94056', '110030', '25'), +('2', '110', '2', '89368', '102864', '25'), +('2', '110', '3', '111314', '177230', '25'), +('2', '110', '3', '111316', '175518', '25'), +('2', '110', '3', '111315', '174637', '25'), +('2', '110', '3', '111013', '155379', '25'), +('2', '110', '5', '111319', '176574', '25'), +('2', '110', '5', '111318', '173843', '25'), +('2', '110', '5', '111317', '173580', '25'), +('2', '110', '5', '111320', '173188', '25'), +('2', '110', '8', '111332', '177434', '25'), +('2', '110', '8', '111330', '175255', '25'), +('2', '110', '8', '111331', '172985', '25'), +('2', '110', '8', '111328', '172721', '25'), +('2', '110', '6', '111323', '177324', '25'), +('2', '110', '6', '111326', '175945', '25'), +('2', '110', '6', '111324', '174288', '25'), +('2', '110', '6', '111022', '155474', '25'), +('2', '110', '17', '56046', '114355', '25'), +('2', '110', '17', '81765', '114265', '25'), +('2', '110', '17', '56083', '114256', '25'), +('2', '110', '17', '104406', '96607', '25'), +('2', '110', '7', '56080', '110152', '25'), +('2', '110', '7', '94053', '109149', '25'), +('2', '110', '7', '89369', '103977', '25'), +('2', '110', '7', '104404', '92520', '25'), +('2', '110', '9', '67098', '180101', '25'), +('2', '110', '9', '81764', '106745', '25'), +('2', '110', '9', '56070', '106528', '25'), +('2', '110', '9', '62984', '106327', '25'), +('2', '110', '15', '111350', '178747', '25'), +('2', '110', '15', '111344', '177854', '25'), +('2', '110', '15', '111340', '177186', '25'), +('2', '110', '15', '111342', '174977', '25'), +('2', '110', '20', '111356', '177214', '25'), +('2', '110', '20', '111352', '176573', '25'), +('2', '110', '20', '111351', '173860', '25'), +('2', '110', '20', '111054', '155363', '25'), +('2', '110', '12', '105332', '129006', '25'), +('2', '110', '12', '56035', '108486', '25'), +('2', '110', '12', '56073', '107298', '25'), +('2', '110', '12', '89366', '100883', '25'), +('2', '110', '18', '56041', '114052', '25'), +('2', '110', '18', '94054', '112819', '25'), +('2', '110', '18', '62986', '112591', '25'), +('2', '110', '18', '62987', '110925', '25'), +('2', '110', '19', '81763', '110863', '25'), +('2', '110', '19', '56037', '110479', '25'), +('2', '110', '19', '62990', '110469', '25'), +('2', '110', '19', '56075', '110368', '25'), +('2', '110', '13', '111518', '170687', '25'), +('2', '110', '13', '111517', '168951', '25'), +('2', '110', '13', '111217', '154292', '25'), +('2', '110', '13', '111218', '154242', '25'), +('2', '110', '14', '111537', '177531', '25'), +('2', '110', '14', '111539', '175758', '25'), +('2', '110', '14', '111535', '175348', '25'), +('2', '110', '14', '111237', '155680', '25'), +('2', '110', '11', '85213', '257050', '25'), +('2', '110', '11', '133816', '229882', '25'), +('2', '110', '11', '111334', '176797', '25'), +('2', '110', '11', '111337', '176665', '25'), +('2', '110', '22', '39342', '0', '24'), +('2', '110', '22', '7867', '0', '24'), +('2', '110', '22', '23597', '0', '24'), +('2', '110', '22', '53550', '0', '24'), +('2', '110', '1', '98769', '284255', '24'), +('2', '110', '1', '111304', '176546', '24'), +('2', '110', '1', '111307', '176307', '24'), +('2', '110', '1', '111310', '175074', '24'), +('2', '110', '2', '62988', '110564', '24'), +('2', '110', '2', '62985', '110407', '24'), +('2', '110', '2', '94056', '110030', '24'), +('2', '110', '2', '89368', '102864', '24'), +('2', '110', '3', '111314', '177230', '24'), +('2', '110', '3', '111316', '175518', '24'), +('2', '110', '3', '111315', '174637', '24'), +('2', '110', '3', '111013', '155379', '24'), +('2', '110', '5', '111319', '176574', '24'), +('2', '110', '5', '111318', '173843', '24'), +('2', '110', '5', '111317', '173580', '24'), +('2', '110', '5', '111320', '173188', '24'), +('2', '110', '8', '111332', '177434', '24'), +('2', '110', '8', '111330', '175255', '24'), +('2', '110', '8', '111331', '172985', '24'), +('2', '110', '8', '111328', '172721', '24'), +('2', '110', '6', '111323', '177324', '24'), +('2', '110', '6', '111326', '175945', '24'), +('2', '110', '6', '111324', '174288', '24'), +('2', '110', '6', '111022', '155474', '24'), +('2', '110', '17', '56046', '114355', '24'), +('2', '110', '17', '81765', '114265', '24'), +('2', '110', '17', '56083', '114256', '24'), +('2', '110', '17', '104406', '96607', '24'), +('2', '110', '7', '56080', '110152', '24'), +('2', '110', '7', '94053', '109149', '24'), +('2', '110', '7', '89369', '103977', '24'), +('2', '110', '7', '104404', '92520', '24'), +('2', '110', '9', '67098', '180101', '24'), +('2', '110', '9', '81764', '106745', '24'), +('2', '110', '9', '56070', '106528', '24'), +('2', '110', '9', '62984', '106327', '24'), +('2', '110', '15', '111350', '178747', '24'), +('2', '110', '15', '111344', '177854', '24'), +('2', '110', '15', '111340', '177186', '24'), +('2', '110', '15', '111342', '174977', '24'), +('2', '110', '20', '111356', '177214', '24'), +('2', '110', '20', '111352', '176573', '24'), +('2', '110', '20', '111351', '173860', '24'), +('2', '110', '20', '111054', '155363', '24'), +('2', '110', '12', '105332', '129006', '24'), +('2', '110', '12', '56035', '108486', '24'), +('2', '110', '12', '56073', '107298', '24'), +('2', '110', '12', '89366', '100883', '24'), +('2', '110', '18', '56041', '114052', '24'), +('2', '110', '18', '94054', '112819', '24'), +('2', '110', '18', '62986', '112591', '24'), +('2', '110', '18', '62987', '110925', '24'), +('2', '110', '19', '81763', '110863', '24'), +('2', '110', '19', '56037', '110479', '24'), +('2', '110', '19', '62990', '110469', '24'), +('2', '110', '19', '56075', '110368', '24'), +('2', '110', '13', '111518', '170687', '24'), +('2', '110', '13', '111517', '168951', '24'), +('2', '110', '13', '111217', '154292', '24'), +('2', '110', '13', '111218', '154242', '24'), +('2', '110', '14', '111537', '177531', '24'), +('2', '110', '14', '111539', '175758', '24'), +('2', '110', '14', '111535', '175348', '24'), +('2', '110', '14', '111237', '155680', '24'), +('2', '110', '11', '85213', '257050', '24'), +('2', '110', '11', '133816', '229882', '24'), +('2', '110', '11', '111334', '176797', '24'), +('2', '110', '11', '111337', '176665', '24'), +('2', '111', '22', '39342', '0', '25'), +('2', '111', '22', '7867', '0', '25'), +('2', '111', '22', '23597', '0', '25'), +('2', '111', '22', '53550', '0', '25'), +('2', '111', '1', '98769', '284259', '25'), +('2', '111', '1', '111304', '176554', '25'), +('2', '111', '1', '111307', '176311', '25'), +('2', '111', '1', '111310', '175080', '25'), +('2', '111', '2', '62988', '110568', '25'), +('2', '111', '2', '62985', '110415', '25'), +('2', '111', '2', '94056', '110036', '25'), +('2', '111', '2', '89368', '102870', '25'), +('2', '111', '3', '111314', '177236', '25'), +('2', '111', '3', '111316', '175524', '25'), +('2', '111', '3', '111315', '174643', '25'), +('2', '111', '3', '111013', '155386', '25'), +('2', '111', '5', '111319', '176579', '25'), +('2', '111', '5', '111318', '173848', '25'), +('2', '111', '5', '111317', '173586', '25'), +('2', '111', '5', '111320', '173194', '25'), +('2', '111', '8', '111332', '177441', '25'), +('2', '111', '8', '111330', '175261', '25'), +('2', '111', '8', '111331', '172992', '25'), +('2', '111', '8', '111328', '172725', '25'), +('2', '111', '6', '111323', '177331', '25'), +('2', '111', '6', '111326', '175954', '25'), +('2', '111', '6', '111324', '174293', '25'), +('2', '111', '6', '111022', '155481', '25'), +('2', '111', '17', '56046', '114361', '25'), +('2', '111', '17', '81765', '114271', '25'), +('2', '111', '17', '56083', '114260', '25'), +('2', '111', '17', '104406', '96613', '25'), +('2', '111', '7', '56080', '110159', '25'), +('2', '111', '7', '94053', '109153', '25'), +('2', '111', '7', '89369', '103982', '25'), +('2', '111', '7', '104404', '92528', '25'), +('2', '111', '9', '67098', '180106', '25'), +('2', '111', '9', '81764', '106756', '25'), +('2', '111', '9', '56070', '106534', '25'), +('2', '111', '9', '62984', '106334', '25'), +('2', '111', '15', '111350', '178755', '25'), +('2', '111', '15', '111344', '177862', '25'), +('2', '111', '15', '111340', '177193', '25'), +('2', '111', '15', '111342', '174984', '25'), +('2', '111', '20', '111356', '177219', '25'), +('2', '111', '20', '111352', '176580', '25'), +('2', '111', '20', '111351', '173867', '25'), +('2', '111', '20', '111054', '155368', '25'), +('2', '111', '12', '105332', '129008', '25'), +('2', '111', '12', '56035', '108495', '25'), +('2', '111', '12', '56073', '107304', '25'), +('2', '111', '12', '89366', '100888', '25'), +('2', '111', '18', '56041', '114058', '25'), +('2', '111', '18', '94054', '112823', '25'), +('2', '111', '18', '62986', '112598', '25'), +('2', '111', '18', '62987', '110930', '25'), +('2', '111', '19', '81763', '110873', '25'), +('2', '111', '19', '56037', '110486', '25'), +('2', '111', '19', '62990', '110473', '25'), +('2', '111', '19', '56075', '110376', '25'), +('2', '111', '13', '111518', '170694', '25'), +('2', '111', '13', '111517', '168957', '25'), +('2', '111', '13', '111217', '154298', '25'), +('2', '111', '13', '111218', '154249', '25'), +('2', '111', '14', '111537', '177538', '25'), +('2', '111', '14', '111539', '175766', '25'), +('2', '111', '14', '111535', '175354', '25'), +('2', '111', '14', '111237', '155686', '25'), +('2', '111', '11', '85213', '257054', '25'), +('2', '111', '11', '133816', '229887', '25'), +('2', '111', '11', '111334', '176803', '25'), +('2', '111', '11', '111337', '176675', '25'), +('2', '112', '22', '39342', '0', '25'), +('2', '112', '22', '7867', '0', '25'), +('2', '112', '22', '23597', '0', '25'), +('2', '112', '22', '53550', '0', '25'), +('2', '112', '1', '98769', '284263', '25'), +('2', '112', '1', '111304', '176561', '25'), +('2', '112', '1', '111307', '176314', '25'), +('2', '112', '1', '111310', '175087', '25'), +('2', '112', '2', '62988', '110572', '25'), +('2', '112', '2', '62985', '110423', '25'), +('2', '112', '2', '94056', '110041', '25'), +('2', '112', '2', '89368', '102875', '25'), +('2', '112', '3', '111314', '177242', '25'), +('2', '112', '3', '111316', '175531', '25'), +('2', '112', '3', '111315', '174649', '25'), +('2', '112', '3', '111013', '155392', '25'), +('2', '112', '5', '111319', '176584', '25'), +('2', '112', '5', '111318', '173853', '25'), +('2', '112', '5', '111317', '173592', '25'), +('2', '112', '5', '111320', '173199', '25'), +('2', '112', '8', '111332', '177448', '25'), +('2', '112', '8', '111330', '175267', '25'), +('2', '112', '8', '111331', '173000', '25'), +('2', '112', '8', '111328', '172729', '25'), +('2', '112', '6', '111323', '177338', '25'), +('2', '112', '6', '111326', '175963', '25'), +('2', '112', '6', '111324', '174298', '25'), +('2', '112', '6', '111022', '155487', '25'), +('2', '112', '17', '56046', '114367', '25'), +('2', '112', '17', '81765', '114276', '25'), +('2', '112', '17', '56083', '114263', '25'), +('2', '112', '17', '104406', '96619', '25'), +('2', '112', '7', '56080', '110167', '25'), +('2', '112', '7', '94053', '109158', '25'), +('2', '112', '7', '89369', '103988', '25'), +('2', '112', '7', '104404', '92535', '25'), +('2', '112', '9', '67098', '180111', '25'), +('2', '112', '9', '81764', '106766', '25'), +('2', '112', '9', '56070', '106540', '25'), +('2', '112', '9', '62984', '106340', '25'), +('2', '112', '15', '111350', '178763', '25'), +('2', '112', '15', '111344', '177870', '25'), +('2', '112', '15', '111340', '177199', '25'), +('2', '112', '15', '111342', '174991', '25'), +('2', '112', '20', '111356', '177224', '25'), +('2', '112', '20', '111352', '176586', '25'), +('2', '112', '20', '111351', '173874', '25'), +('2', '112', '20', '111054', '155373', '25'), +('2', '112', '12', '105332', '129010', '25'), +('2', '112', '12', '56035', '108505', '25'), +('2', '112', '12', '56073', '107310', '25'), +('2', '112', '12', '89366', '100892', '25'), +('2', '112', '18', '56041', '114064', '25'), +('2', '112', '18', '94054', '112828', '25'), +('2', '112', '18', '62986', '112606', '25'), +('2', '112', '18', '62987', '110935', '25'), +('2', '112', '19', '81763', '110883', '25'), +('2', '112', '19', '56037', '110493', '25'), +('2', '112', '19', '62990', '110477', '25'), +('2', '112', '19', '56075', '110384', '25'), +('2', '112', '13', '111518', '170700', '25'), +('2', '112', '13', '111517', '168963', '25'), +('2', '112', '13', '111217', '154304', '25'), +('2', '112', '13', '111218', '154255', '25'), +('2', '112', '14', '111537', '177544', '25'), +('2', '112', '14', '111539', '175773', '25'), +('2', '112', '14', '111535', '175360', '25'), +('2', '112', '14', '111237', '155693', '25'), +('2', '112', '11', '85213', '257058', '25'), +('2', '112', '11', '133816', '229892', '25'), +('2', '112', '11', '111334', '176809', '25'), +('2', '112', '11', '111337', '176684', '25'), +('2', '113', '22', '39342', '0', '25'), +('2', '113', '22', '7867', '0', '25'), +('2', '113', '22', '23597', '0', '25'), +('2', '113', '22', '53550', '0', '25'), +('2', '113', '1', '98769', '284267', '25'), +('2', '113', '1', '111304', '176569', '25'), +('2', '113', '1', '111307', '176318', '25'), +('2', '113', '1', '111310', '175093', '25'), +('2', '113', '2', '62988', '110576', '25'), +('2', '113', '2', '62985', '110431', '25'), +('2', '113', '2', '94056', '110046', '25'), +('2', '113', '2', '89368', '102881', '25'), +('2', '113', '3', '111314', '177249', '25'), +('2', '113', '3', '111316', '175537', '25'), +('2', '113', '3', '111315', '174655', '25'), +('2', '113', '3', '111013', '155398', '25'), +('2', '113', '5', '111319', '176590', '25'), +('2', '113', '5', '111318', '173859', '25'), +('2', '113', '5', '111317', '173597', '25'), +('2', '113', '5', '111320', '173204', '25'), +('2', '113', '8', '111332', '177455', '25'), +('2', '113', '8', '111330', '175274', '25'), +('2', '113', '8', '111331', '173008', '25'), +('2', '113', '8', '111328', '172733', '25'), +('2', '113', '6', '111323', '177344', '25'), +('2', '113', '6', '111326', '175972', '25'), +('2', '113', '6', '111324', '174303', '25'), +('2', '113', '6', '111022', '155494', '25'), +('2', '113', '17', '56046', '114374', '25'), +('2', '113', '17', '81765', '114281', '25'), +('2', '113', '17', '56083', '114267', '25'), +('2', '113', '17', '104406', '96625', '25'), +('2', '113', '7', '56080', '110174', '25'), +('2', '113', '7', '94053', '109163', '25'), +('2', '113', '7', '89369', '103994', '25'), +('2', '113', '7', '104404', '92542', '25'), +('2', '113', '9', '67098', '180117', '25'), +('2', '113', '9', '81764', '106776', '25'), +('2', '113', '9', '56070', '106546', '25'), +('2', '113', '9', '62984', '106346', '25'), +('2', '113', '15', '111350', '178771', '25'), +('2', '113', '15', '111344', '177879', '25'), +('2', '113', '15', '111340', '177205', '25'), +('2', '113', '15', '111342', '174998', '25'), +('2', '113', '20', '111356', '177229', '25'), +('2', '113', '20', '111352', '176593', '25'), +('2', '113', '20', '111351', '173880', '25'), +('2', '113', '20', '111054', '155378', '25'), +('2', '113', '12', '105332', '129013', '25'), +('2', '113', '12', '56035', '108514', '25'), +('2', '113', '12', '56073', '107316', '25'), +('2', '113', '12', '89366', '100897', '25'), +('2', '113', '18', '56041', '114070', '25'), +('2', '113', '18', '94054', '112832', '25'), +('2', '113', '18', '62986', '112613', '25'), +('2', '113', '18', '62987', '110940', '25'), +('2', '113', '19', '81763', '110893', '25'), +('2', '113', '19', '56037', '110501', '25'), +('2', '113', '19', '62990', '110482', '25'), +('2', '113', '19', '56075', '110392', '25'), +('2', '113', '13', '111518', '170707', '25'), +('2', '113', '13', '111517', '168969', '25'), +('2', '113', '13', '111217', '154310', '25'), +('2', '113', '13', '111218', '154261', '25'), +('2', '113', '14', '111537', '177551', '25'), +('2', '113', '14', '111539', '175781', '25'), +('2', '113', '14', '111535', '175366', '25'), +('2', '113', '14', '111237', '155699', '25'), +('2', '113', '11', '85213', '257062', '25'), +('2', '113', '11', '133816', '229897', '25'), +('2', '113', '11', '111334', '176815', '25'), +('2', '113', '11', '111337', '176693', '25'), +('2', '114', '22', '39342', '0', '25'), +('2', '114', '22', '7867', '0', '25'), +('2', '114', '22', '23597', '0', '25'), +('2', '114', '22', '53550', '0', '25'), +('2', '114', '1', '98769', '284272', '25'), +('2', '114', '1', '111304', '176576', '25'), +('2', '114', '1', '111307', '176322', '25'), +('2', '114', '1', '111310', '175099', '25'), +('2', '114', '2', '62988', '110580', '25'), +('2', '114', '2', '62985', '110440', '25'), +('2', '114', '2', '94056', '110052', '25'), +('2', '114', '2', '89368', '102887', '25'), +('2', '114', '3', '111314', '177255', '25'), +('2', '114', '3', '111316', '175543', '25'), +('2', '114', '3', '111315', '174661', '25'), +('2', '114', '3', '111013', '155404', '25'), +('2', '114', '5', '111319', '176595', '25'), +('2', '114', '5', '111318', '173864', '25'), +('2', '114', '5', '111317', '173603', '25'), +('2', '114', '5', '111320', '173209', '25'), +('2', '114', '8', '111332', '177462', '25'), +('2', '114', '8', '111330', '175280', '25'), +('2', '114', '8', '111331', '173015', '25'), +('2', '114', '8', '111328', '172738', '25'), +('2', '114', '6', '111323', '177351', '25'), +('2', '114', '6', '111326', '175981', '25'), +('2', '114', '6', '111324', '174308', '25'), +('2', '114', '6', '111022', '155500', '25'), +('2', '114', '17', '56046', '114380', '25'), +('2', '114', '17', '81765', '114286', '25'), +('2', '114', '17', '56083', '114270', '25'), +('2', '114', '17', '104406', '96632', '25'), +('2', '114', '7', '56080', '110182', '25'), +('2', '114', '7', '94053', '109168', '25'), +('2', '114', '7', '89369', '104000', '25'), +('2', '114', '7', '104404', '92550', '25'), +('2', '114', '9', '67098', '180122', '25'), +('2', '114', '9', '81764', '106786', '25'), +('2', '114', '9', '56070', '106552', '25'), +('2', '114', '9', '62984', '106352', '25'), +('2', '114', '15', '111350', '178779', '25'), +('2', '114', '15', '111344', '177887', '25'), +('2', '114', '15', '111340', '177212', '25'), +('2', '114', '15', '111342', '175005', '25'), +('2', '114', '20', '111356', '177233', '25'), +('2', '114', '20', '111352', '176600', '25'), +('2', '114', '20', '111351', '173887', '25'), +('2', '114', '20', '111054', '155383', '25'), +('2', '114', '12', '105332', '129015', '25'), +('2', '114', '12', '56035', '108524', '25'), +('2', '114', '12', '56073', '107323', '25'), +('2', '114', '12', '89366', '100902', '25'), +('2', '114', '18', '56041', '114076', '25'), +('2', '114', '18', '94054', '112837', '25'), +('2', '114', '18', '62986', '112620', '25'), +('2', '114', '18', '62987', '110945', '25'), +('2', '114', '19', '81763', '110903', '25'), +('2', '114', '19', '56037', '110508', '25'), +('2', '114', '19', '62990', '110486', '25'), +('2', '114', '19', '56075', '110400', '25'), +('2', '114', '13', '111518', '170713', '25'), +('2', '114', '13', '111517', '168975', '25'), +('2', '114', '13', '111217', '154316', '25'), +('2', '114', '13', '111218', '154267', '25'), +('2', '114', '14', '111537', '177558', '25'), +('2', '114', '14', '111539', '175788', '25'), +('2', '114', '14', '111535', '175372', '25'), +('2', '114', '14', '111237', '155706', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('2', '114', '11', '85213', '257066', '25'), +('2', '114', '11', '133816', '229902', '25'), +('2', '114', '11', '111334', '176821', '25'), +('2', '114', '11', '111337', '176702', '25'), +('2', '115', '22', '39342', '0', '26'), +('2', '115', '22', '7867', '0', '26'), +('2', '115', '22', '23597', '0', '26'), +('2', '115', '22', '53550', '0', '26'), +('2', '115', '1', '98769', '284276', '26'), +('2', '115', '1', '111304', '176584', '26'), +('2', '115', '1', '111307', '176325', '26'), +('2', '115', '1', '111310', '175105', '26'), +('2', '115', '2', '62988', '110584', '26'), +('2', '115', '2', '62985', '110448', '26'), +('2', '115', '2', '94056', '110057', '26'), +('2', '115', '2', '89368', '102892', '26'), +('2', '115', '3', '111314', '177261', '26'), +('2', '115', '3', '111316', '175549', '26'), +('2', '115', '3', '111315', '174668', '26'), +('2', '115', '3', '111013', '155410', '26'), +('2', '115', '5', '111319', '176601', '26'), +('2', '115', '5', '111318', '173869', '26'), +('2', '115', '5', '111317', '173609', '26'), +('2', '115', '5', '111320', '173214', '26'), +('2', '115', '8', '111332', '177469', '26'), +('2', '115', '8', '111330', '175286', '26'), +('2', '115', '8', '111331', '173023', '26'), +('2', '115', '8', '111328', '172742', '26'), +('2', '115', '6', '111323', '177357', '26'), +('2', '115', '6', '111326', '175990', '26'), +('2', '115', '6', '111324', '174313', '26'), +('2', '115', '6', '111022', '155507', '26'), +('2', '115', '17', '56046', '114386', '26'), +('2', '115', '17', '81765', '114291', '26'), +('2', '115', '17', '56083', '114274', '26'), +('2', '115', '17', '104406', '96638', '26'), +('2', '115', '7', '56080', '110189', '26'), +('2', '115', '7', '94053', '109172', '26'), +('2', '115', '7', '89369', '104005', '26'), +('2', '115', '7', '104404', '92557', '26'), +('2', '115', '9', '67098', '180127', '26'), +('2', '115', '9', '81764', '106797', '26'), +('2', '115', '9', '56070', '106558', '26'), +('2', '115', '9', '62984', '106358', '26'), +('2', '115', '15', '111350', '178787', '26'), +('2', '115', '15', '111344', '177895', '26'), +('2', '115', '15', '111340', '177218', '26'), +('2', '115', '15', '111342', '175012', '26'), +('2', '115', '20', '111356', '177238', '26'), +('2', '115', '20', '111352', '176606', '26'), +('2', '115', '20', '111351', '173894', '26'), +('2', '115', '20', '111054', '155388', '26'), +('2', '115', '12', '105332', '129017', '26'), +('2', '115', '12', '56035', '108533', '26'), +('2', '115', '12', '56073', '107329', '26'), +('2', '115', '12', '89366', '100906', '26'), +('2', '115', '18', '56041', '114082', '26'), +('2', '115', '18', '94054', '112841', '26'), +('2', '115', '18', '62986', '112628', '26'), +('2', '115', '18', '62987', '110949', '26'), +('2', '115', '19', '81763', '110913', '26'), +('2', '115', '19', '56037', '110515', '26'), +('2', '115', '19', '62990', '110490', '26'), +('2', '115', '19', '56075', '110408', '26'), +('2', '115', '13', '111518', '170719', '26'), +('2', '115', '13', '111517', '168982', '26'), +('2', '115', '13', '111217', '154322', '26'), +('2', '115', '13', '111218', '154274', '26'), +('2', '115', '14', '111537', '177564', '26'), +('2', '115', '14', '111539', '175796', '26'), +('2', '115', '14', '111535', '175378', '26'), +('2', '115', '14', '111237', '155713', '26'), +('2', '115', '11', '85213', '257071', '26'), +('2', '115', '11', '133816', '229907', '26'), +('2', '115', '11', '111334', '176827', '26'), +('2', '115', '11', '111337', '176711', '26'), +('3', '1', '22', '10323', '0', '0'), +('3', '1', '22', '66166', '0', '0'), +('3', '1', '22', '8567', '0', '0'), +('3', '1', '22', '9246', '0', '0'), +('3', '1', '1', '14701', '4854', '0'), +('3', '1', '1', '14702', '3550', '0'), +('3', '1', '1', '10082', '2434', '0'), +('3', '1', '1', '10165', '1940', '0'), +('3', '1', '2', '4301', '7726', '0'), +('3', '1', '2', '4831', '6040', '0'), +('3', '1', '2', '4851', '5999', '0'), +('3', '1', '2', '10142', '4824', '0'), +('3', '1', '3', '21002', '2114', '0'), +('3', '1', '3', '10144', '1628', '0'), +('3', '1', '3', '4505', '1535', '0'), +('3', '1', '3', '21303', '1510', '0'), +('3', '1', '5', '14703', '7150', '0'), +('3', '1', '5', '14700', '4806', '0'), +('3', '1', '5', '12800', '4775', '0'), +('3', '1', '5', '10055', '4760', '0'), +('3', '1', '8', '11621', '26579', '0'), +('3', '1', '8', '11551', '8753', '0'), +('3', '1', '8', '1409', '7747', '0'), +('3', '1', '8', '11603', '6053', '0'), +('3', '1', '6', '1557', '8270', '0'), +('3', '1', '6', '25062', '3672', '0'), +('3', '1', '6', '4302', '3347', '0'), +('3', '1', '6', '4165', '3247', '0'), +('3', '1', '17', '4832', '11404', '0'), +('3', '1', '17', '4852', '9720', '0'), +('3', '1', '17', '4309', '8225', '0'), +('3', '1', '17', '11623', '7848', '0'), +('3', '1', '7', '4833', '6478', '0'), +('3', '1', '7', '4853', '5413', '0'), +('3', '1', '7', '2986', '3926', '0'), +('3', '1', '7', '4343', '3703', '0'), +('3', '1', '9', '4834', '4408', '0'), +('3', '1', '9', '4854', '3727', '0'), +('3', '1', '9', '12189', '3471', '0'), +('3', '1', '9', '4344', '3046', '0'), +('3', '1', '15', '10366', '8054', '0'), +('3', '1', '15', '10151', '7200', '0'), +('3', '1', '15', '14679', '7010', '0'), +('3', '1', '15', '14678', '5708', '0'), +('3', '1', '20', '2716', '23850', '0'), +('3', '1', '20', '11601', '17566', '0'), +('3', '1', '20', '2919', '10811', '0'), +('3', '1', '20', '1365', '10500', '0'), +('3', '1', '12', '4835', '9883', '0'), +('3', '1', '12', '20655', '7862', '0'), +('3', '1', '12', '2923', '4758', '0'), +('3', '1', '12', '3310', '4550', '0'), +('3', '1', '18', '4836', '6318', '0'), +('3', '1', '18', '4856', '5488', '0'), +('3', '1', '18', '4346', '4645', '0'), +('3', '1', '18', '3155', '4251', '0'), +('3', '1', '19', '4837', '6988', '0'), +('3', '1', '19', '3156', '6822', '0'), +('3', '1', '19', '68239', '5221', '0'), +('3', '1', '19', '4857', '5155', '0'), +('3', '1', '13', '5401', '19848', '0'), +('3', '1', '13', '11050', '19565', '0'), +('3', '1', '13', '11682', '18417', '0'), +('3', '1', '13', '27708', '18119', '0'), +('3', '1', '14', '11632', '27713', '0'), +('3', '1', '14', '11551', '23853', '0'), +('3', '1', '14', '9428', '20353', '0'), +('3', '1', '14', '11644', '19308', '0'), +('3', '1', '11', '8408', '6861', '0'), +('3', '1', '11', '8325', '6668', '0'), +('3', '1', '11', '8811', '5213', '0'), +('3', '1', '11', '8810', '4798', '0'), +('3', '2', '22', '10323', '0', '0'), +('3', '2', '22', '66166', '0', '0'), +('3', '2', '22', '8567', '0', '0'), +('3', '2', '22', '9246', '0', '0'), +('3', '2', '1', '14701', '4854', '0'), +('3', '2', '1', '14702', '3550', '0'), +('3', '2', '1', '10082', '2455', '0'), +('3', '2', '1', '10165', '1940', '0'), +('3', '2', '2', '4301', '7726', '0'), +('3', '2', '2', '4831', '6040', '0'), +('3', '2', '2', '4851', '6025', '0'), +('3', '2', '2', '10142', '4824', '0'), +('3', '2', '3', '21002', '2114', '0'), +('3', '2', '3', '10144', '1628', '0'), +('3', '2', '3', '4505', '1561', '0'), +('3', '2', '3', '21303', '1510', '0'), +('3', '2', '5', '14703', '7150', '0'), +('3', '2', '5', '14700', '4806', '0'), +('3', '2', '5', '12800', '4793', '0'), +('3', '2', '5', '10055', '4760', '0'), +('3', '2', '8', '11621', '26579', '0'), +('3', '2', '8', '11551', '8753', '0'), +('3', '2', '8', '1409', '7747', '0'), +('3', '2', '8', '11603', '6085', '0'), +('3', '2', '6', '1557', '8270', '0'), +('3', '2', '6', '25062', '3672', '0'), +('3', '2', '6', '4302', '3373', '0'), +('3', '2', '6', '4165', '3247', '0'), +('3', '2', '17', '4832', '11467', '0'), +('3', '2', '17', '4852', '9790', '0'), +('3', '2', '17', '4309', '8225', '0'), +('3', '2', '17', '11623', '7848', '0'), +('3', '2', '7', '4833', '6478', '0'), +('3', '2', '7', '4853', '5413', '0'), +('3', '2', '7', '2986', '3926', '0'), +('3', '2', '7', '4343', '3745', '0'), +('3', '2', '9', '4834', '4408', '0'), +('3', '2', '9', '4854', '3727', '0'), +('3', '2', '9', '12189', '3471', '0'), +('3', '2', '9', '4344', '3046', '0'), +('3', '2', '15', '10366', '8054', '0'), +('3', '2', '15', '10151', '7200', '0'), +('3', '2', '15', '14679', '7010', '0'), +('3', '2', '15', '14678', '5708', '0'), +('3', '2', '20', '2716', '23872', '0'), +('3', '2', '20', '11601', '17608', '0'), +('3', '2', '20', '2919', '10829', '0'), +('3', '2', '20', '1365', '10500', '0'), +('3', '2', '12', '4835', '9904', '0'), +('3', '2', '12', '20655', '7878', '0'), +('3', '2', '12', '2923', '4758', '0'), +('3', '2', '12', '3310', '4550', '0'), +('3', '2', '18', '4836', '6339', '0'), +('3', '2', '18', '4856', '5488', '0'), +('3', '2', '18', '4346', '4645', '0'), +('3', '2', '18', '3155', '4277', '0'), +('3', '2', '19', '4837', '7006', '0'), +('3', '2', '19', '3156', '6822', '0'), +('3', '2', '19', '68239', '5232', '0'), +('3', '2', '19', '4857', '5176', '0'), +('3', '2', '13', '5401', '19848', '0'), +('3', '2', '13', '11050', '19592', '0'), +('3', '2', '13', '11682', '18417', '0'), +('3', '2', '13', '27708', '18191', '0'), +('3', '2', '14', '11632', '27777', '0'), +('3', '2', '14', '11551', '23853', '0'), +('3', '2', '14', '9428', '20353', '0'), +('3', '2', '14', '11644', '19308', '0'), +('3', '2', '11', '8408', '6861', '0'), +('3', '2', '11', '8325', '6668', '0'), +('3', '2', '11', '8811', '5213', '0'), +('3', '2', '11', '8810', '4798', '0'), +('3', '3', '22', '10323', '0', '0'), +('3', '3', '22', '66166', '0', '0'), +('3', '3', '22', '8567', '0', '0'), +('3', '3', '22', '9246', '0', '0'), +('3', '3', '1', '14701', '4854', '0'), +('3', '3', '1', '14702', '3550', '0'), +('3', '3', '1', '10082', '2477', '0'), +('3', '3', '1', '10165', '1940', '0'), +('3', '3', '2', '4301', '7726', '0'), +('3', '3', '2', '4851', '6050', '0'), +('3', '3', '2', '4831', '6040', '0'), +('3', '3', '2', '10142', '4824', '0'), +('3', '3', '3', '21002', '2114', '0'), +('3', '3', '3', '10144', '1628', '0'), +('3', '3', '3', '4505', '1586', '0'), +('3', '3', '3', '21303', '1510', '0'), +('3', '3', '5', '14703', '7150', '0'), +('3', '3', '5', '12800', '4811', '0'), +('3', '3', '5', '14700', '4806', '0'), +('3', '3', '5', '10055', '4760', '0'), +('3', '3', '8', '11621', '26579', '0'), +('3', '3', '8', '11551', '8753', '0'), +('3', '3', '8', '1409', '7747', '0'), +('3', '3', '8', '11603', '6118', '0'), +('3', '3', '6', '1557', '8270', '0'), +('3', '3', '6', '25062', '3672', '0'), +('3', '3', '6', '4302', '3398', '0'), +('3', '3', '6', '4165', '3247', '0'), +('3', '3', '17', '4832', '11530', '0'), +('3', '3', '17', '4852', '9861', '0'), +('3', '3', '17', '4309', '8225', '0'), +('3', '3', '17', '11623', '7848', '0'), +('3', '3', '7', '4833', '6478', '0'), +('3', '3', '7', '4853', '5413', '0'), +('3', '3', '7', '2986', '3926', '0'), +('3', '3', '7', '4343', '3787', '0'), +('3', '3', '9', '4834', '4408', '0'), +('3', '3', '9', '4854', '3727', '0'), +('3', '3', '9', '12189', '3471', '0'), +('3', '3', '9', '4344', '3046', '0'), +('3', '3', '15', '10366', '8054', '0'), +('3', '3', '15', '10151', '7200', '0'), +('3', '3', '15', '14679', '7010', '0'), +('3', '3', '15', '14678', '5708', '0'), +('3', '3', '20', '2716', '23893', '0'), +('3', '3', '20', '11601', '17650', '0'), +('3', '3', '20', '2919', '10847', '0'), +('3', '3', '20', '1365', '10500', '0'), +('3', '3', '12', '4835', '9926', '0'), +('3', '3', '12', '20655', '7894', '0'), +('3', '3', '12', '2923', '4758', '0'), +('3', '3', '12', '4855', '4570', '0'), +('3', '3', '18', '4836', '6360', '0'), +('3', '3', '18', '4856', '5488', '0'), +('3', '3', '18', '4346', '4645', '0'), +('3', '3', '18', '3155', '4302', '0'), +('3', '3', '19', '4837', '7025', '0'), +('3', '3', '19', '3156', '6822', '0'), +('3', '3', '19', '68239', '5243', '0'), +('3', '3', '19', '4857', '5197', '0'), +('3', '3', '13', '5401', '19848', '0'), +('3', '3', '13', '11050', '19620', '0'), +('3', '3', '13', '11682', '18417', '0'), +('3', '3', '13', '27708', '18262', '0'), +('3', '3', '14', '11632', '27840', '0'), +('3', '3', '14', '11551', '23853', '0'), +('3', '3', '14', '9428', '20353', '0'), +('3', '3', '14', '11644', '19308', '0'), +('3', '3', '11', '8408', '6861', '0'), +('3', '3', '11', '8325', '6668', '0'), +('3', '3', '11', '8811', '5213', '0'), +('3', '3', '11', '8810', '4798', '0'), +('3', '4', '22', '10323', '0', '0'), +('3', '4', '22', '66166', '0', '0'), +('3', '4', '22', '8567', '0', '0'), +('3', '4', '22', '9246', '0', '0'), +('3', '4', '1', '14701', '4854', '0'), +('3', '4', '1', '14702', '3550', '0'), +('3', '4', '1', '10082', '2499', '0'), +('3', '4', '1', '10165', '1940', '0'), +('3', '4', '2', '4301', '7726', '0'), +('3', '4', '2', '4851', '6075', '0'), +('3', '4', '2', '4831', '6040', '0'), +('3', '4', '2', '10142', '4824', '0'), +('3', '4', '3', '21002', '2114', '0'), +('3', '4', '3', '10144', '1628', '0'), +('3', '4', '3', '4505', '1611', '0'), +('3', '4', '3', '21303', '1510', '0'), +('3', '4', '5', '14703', '7150', '0'), +('3', '4', '5', '12800', '4829', '0'), +('3', '4', '5', '14700', '4806', '0'), +('3', '4', '5', '10055', '4760', '0'), +('3', '4', '8', '11621', '26579', '0'), +('3', '4', '8', '11551', '8753', '0'), +('3', '4', '8', '1409', '7747', '0'), +('3', '4', '8', '11603', '6150', '0'), +('3', '4', '6', '1557', '8270', '0'), +('3', '4', '6', '25062', '3672', '0'), +('3', '4', '6', '4302', '3423', '0'), +('3', '4', '6', '4165', '3247', '0'), +('3', '4', '17', '4832', '11594', '0'), +('3', '4', '17', '4852', '9932', '0'), +('3', '4', '17', '4309', '8225', '0'), +('3', '4', '17', '11623', '7848', '0'), +('3', '4', '7', '4833', '6478', '0'), +('3', '4', '7', '4853', '5413', '0'), +('3', '4', '7', '2986', '3926', '0'), +('3', '4', '7', '4343', '3829', '0'), +('3', '4', '9', '4834', '4408', '0'), +('3', '4', '9', '4854', '3727', '0'), +('3', '4', '9', '12189', '3471', '0'), +('3', '4', '9', '10149', '3053', '0'), +('3', '4', '15', '10366', '8054', '0'), +('3', '4', '15', '10151', '7200', '0'), +('3', '4', '15', '14679', '7010', '0'), +('3', '4', '15', '14678', '5708', '0'), +('3', '4', '20', '2716', '23915', '0'), +('3', '4', '20', '11601', '17693', '0'), +('3', '4', '20', '2919', '10865', '0'), +('3', '4', '20', '1365', '10500', '0'), +('3', '4', '12', '4835', '9947', '0'), +('3', '4', '12', '20655', '7910', '0'), +('3', '4', '12', '2923', '4758', '0'), +('3', '4', '12', '4855', '4610', '0'), +('3', '4', '18', '4836', '6381', '0'), +('3', '4', '18', '4856', '5488', '0'), +('3', '4', '18', '4346', '4645', '0'), +('3', '4', '18', '3155', '4327', '0'), +('3', '4', '19', '4837', '7043', '0'), +('3', '4', '19', '3156', '6822', '0'), +('3', '4', '19', '68239', '5254', '0'), +('3', '4', '19', '4857', '5219', '0'), +('3', '4', '13', '5401', '19848', '0'), +('3', '4', '13', '11050', '19647', '0'), +('3', '4', '13', '11682', '18417', '0'), +('3', '4', '13', '27708', '18333', '0'), +('3', '4', '14', '11632', '27904', '0'), +('3', '4', '14', '11551', '23853', '0'), +('3', '4', '14', '9428', '20353', '0'), +('3', '4', '14', '11644', '19308', '0'), +('3', '4', '11', '8408', '6861', '0'), +('3', '4', '11', '8325', '6668', '0'), +('3', '4', '11', '8811', '5213', '0'), +('3', '4', '11', '8810', '4798', '0'), +('3', '5', '22', '10323', '0', '0'), +('3', '5', '22', '66166', '0', '0'), +('3', '5', '22', '8567', '0', '0'), +('3', '5', '22', '9246', '0', '0'), +('3', '5', '1', '14701', '4854', '0'), +('3', '5', '1', '14702', '3550', '0'), +('3', '5', '1', '10082', '2521', '0'), +('3', '5', '1', '10165', '1940', '0'), +('3', '5', '2', '4301', '7726', '0'), +('3', '5', '2', '4851', '6101', '0'), +('3', '5', '2', '4831', '6040', '0'), +('3', '5', '2', '10142', '4824', '0'), +('3', '5', '3', '21002', '2114', '0'), +('3', '5', '3', '71529', '1793', '0'), +('3', '5', '3', '4505', '1637', '0'), +('3', '5', '3', '10144', '1628', '0'), +('3', '5', '5', '14703', '7150', '0'), +('3', '5', '5', '12800', '4847', '0'), +('3', '5', '5', '14700', '4806', '0'), +('3', '5', '5', '10055', '4760', '0'), +('3', '5', '8', '11621', '26579', '0'), +('3', '5', '8', '11551', '8753', '0'), +('3', '5', '8', '1409', '7747', '0'), +('3', '5', '8', '11603', '6183', '0'), +('3', '5', '6', '1557', '8270', '0'), +('3', '5', '6', '25062', '3672', '0'), +('3', '5', '6', '4302', '3452', '0'), +('3', '5', '6', '4165', '3247', '0'), +('3', '5', '17', '4832', '11666', '0'), +('3', '5', '17', '4852', '10008', '0'), +('3', '5', '17', '4309', '8225', '0'), +('3', '5', '17', '11623', '7848', '0'), +('3', '5', '7', '4833', '6478', '0'), +('3', '5', '7', '4853', '5413', '0'), +('3', '5', '7', '2986', '3926', '0'), +('3', '5', '7', '4343', '3878', '0'), +('3', '5', '9', '4834', '4408', '0'), +('3', '5', '9', '4854', '3727', '0'), +('3', '5', '9', '12189', '3471', '0'), +('3', '5', '9', '10149', '3064', '0'), +('3', '5', '15', '10366', '8054', '0'), +('3', '5', '15', '10151', '7200', '0'), +('3', '5', '15', '14679', '7010', '0'), +('3', '5', '15', '14678', '5708', '0'), +('3', '5', '20', '2716', '23937', '0'), +('3', '5', '20', '11601', '17741', '0'), +('3', '5', '20', '2919', '10883', '0'), +('3', '5', '20', '1365', '10500', '0'), +('3', '5', '12', '4835', '9971', '0'), +('3', '5', '12', '20655', '7926', '0'), +('3', '5', '12', '2923', '4758', '0'), +('3', '5', '12', '4855', '4652', '0'), +('3', '5', '18', '4836', '6405', '0'), +('3', '5', '18', '4856', '5488', '0'), +('3', '5', '18', '4346', '4645', '0'), +('3', '5', '18', '3155', '4356', '0'), +('3', '5', '19', '4837', '7061', '0'), +('3', '5', '19', '3156', '6822', '0'), +('3', '5', '19', '68239', '5265', '0'), +('3', '5', '19', '4857', '5243', '0'), +('3', '5', '13', '5401', '19848', '0'), +('3', '5', '13', '11050', '19674', '0'), +('3', '5', '13', '11682', '18417', '0'), +('3', '5', '13', '27708', '18410', '0'), +('3', '5', '14', '11632', '27976', '0'), +('3', '5', '14', '11551', '23853', '0'), +('3', '5', '14', '9428', '20353', '0'), +('3', '5', '14', '11644', '19308', '0'), +('3', '5', '11', '8408', '6861', '0'), +('3', '5', '11', '8325', '6668', '0'), +('3', '5', '11', '8811', '5213', '0'), +('3', '5', '11', '8810', '4798', '0'), +('3', '6', '22', '10323', '0', '0'), +('3', '6', '22', '66166', '0', '0'), +('3', '6', '22', '8567', '0', '0'), +('3', '6', '22', '9246', '0', '0'), +('3', '6', '1', '14701', '4854', '0'), +('3', '6', '1', '14702', '3550', '0'), +('3', '6', '1', '10082', '2542', '0'), +('3', '6', '1', '10165', '1940', '0'), +('3', '6', '2', '4301', '7726', '0'), +('3', '6', '2', '4851', '6126', '0'), +('3', '6', '2', '4831', '6040', '0'), +('3', '6', '2', '10142', '4824', '0'), +('3', '6', '3', '71529', '2161', '0'), +('3', '6', '3', '21002', '2114', '0'), +('3', '6', '3', '4505', '1662', '0'), +('3', '6', '3', '10144', '1628', '0'), +('3', '6', '5', '14703', '7150', '0'), +('3', '6', '5', '12800', '4865', '0'), +('3', '6', '5', '14700', '4806', '0'), +('3', '6', '5', '10055', '4760', '0'), +('3', '6', '8', '11621', '26579', '0'), +('3', '6', '8', '11551', '8753', '0'), +('3', '6', '8', '1409', '7747', '0'), +('3', '6', '8', '11603', '6216', '0'), +('3', '6', '6', '1557', '8270', '0'), +('3', '6', '6', '25062', '3672', '0'), +('3', '6', '6', '4302', '3478', '0'), +('3', '6', '6', '4165', '3247', '0'), +('3', '6', '17', '4832', '11730', '0'), +('3', '6', '17', '4852', '10078', '0'), +('3', '6', '17', '4309', '8225', '0'), +('3', '6', '17', '11623', '7848', '0'), +('3', '6', '7', '4833', '6478', '0'), +('3', '6', '7', '4853', '5413', '0'), +('3', '6', '7', '2986', '3926', '0'), +('3', '6', '7', '4343', '3920', '0'), +('3', '6', '9', '4834', '4408', '0'), +('3', '6', '9', '4854', '3727', '0'), +('3', '6', '9', '12189', '3471', '0'), +('3', '6', '9', '10149', '3075', '0'), +('3', '6', '15', '10366', '8054', '0'), +('3', '6', '15', '10151', '7200', '0'), +('3', '6', '15', '14679', '7010', '0'), +('3', '6', '15', '14678', '5708', '0'), +('3', '6', '20', '2716', '23959', '0'), +('3', '6', '20', '11601', '17783', '0'), +('3', '6', '20', '2919', '10901', '0'), +('3', '6', '20', '1365', '10500', '0'), +('3', '6', '12', '4835', '9992', '0'), +('3', '6', '12', '20655', '7942', '0'), +('3', '6', '12', '2923', '4758', '0'), +('3', '6', '12', '4855', '4691', '0'), +('3', '6', '18', '4836', '6427', '0'), +('3', '6', '18', '4856', '5488', '0'), +('3', '6', '18', '4346', '4645', '0'), +('3', '6', '18', '3155', '4382', '0'), +('3', '6', '19', '4837', '7079', '0'), +('3', '6', '19', '3156', '6822', '0'), +('3', '6', '19', '68239', '5275', '0'), +('3', '6', '19', '4857', '5264', '0'), +('3', '6', '13', '5401', '19848', '0'), +('3', '6', '13', '11050', '19701', '0'), +('3', '6', '13', '27708', '18482', '0'), +('3', '6', '13', '11682', '18417', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '6', '14', '11632', '28040', '0'), +('3', '6', '14', '11551', '23853', '0'), +('3', '6', '14', '9428', '20353', '0'), +('3', '6', '14', '11644', '19308', '0'), +('3', '6', '11', '8408', '6861', '0'), +('3', '6', '11', '8325', '6668', '0'), +('3', '6', '11', '8811', '5213', '0'), +('3', '6', '11', '8810', '4798', '0'), +('3', '7', '22', '10323', '0', '0'), +('3', '7', '22', '66166', '0', '0'), +('3', '7', '22', '8567', '0', '0'), +('3', '7', '22', '9246', '0', '0'), +('3', '7', '1', '14701', '4854', '0'), +('3', '7', '1', '14702', '3550', '0'), +('3', '7', '1', '10082', '2564', '0'), +('3', '7', '1', '10165', '1940', '0'), +('3', '7', '2', '4301', '7726', '0'), +('3', '7', '2', '4851', '6152', '0'), +('3', '7', '2', '4831', '6040', '0'), +('3', '7', '2', '10142', '4824', '0'), +('3', '7', '3', '71529', '2533', '0'), +('3', '7', '3', '21002', '2114', '0'), +('3', '7', '3', '4505', '1688', '0'), +('3', '7', '3', '10144', '1628', '0'), +('3', '7', '5', '14703', '7150', '0'), +('3', '7', '5', '12800', '4883', '0'), +('3', '7', '5', '14700', '4806', '0'), +('3', '7', '5', '10055', '4760', '0'), +('3', '7', '8', '11621', '26579', '0'), +('3', '7', '8', '11551', '8753', '0'), +('3', '7', '8', '1409', '7747', '0'), +('3', '7', '8', '11603', '6248', '0'), +('3', '7', '6', '1557', '8270', '0'), +('3', '7', '6', '25062', '3672', '0'), +('3', '7', '6', '4302', '3503', '0'), +('3', '7', '6', '4165', '3247', '0'), +('3', '7', '17', '4832', '11793', '0'), +('3', '7', '17', '4852', '10149', '0'), +('3', '7', '17', '4309', '8225', '0'), +('3', '7', '17', '11623', '7848', '0'), +('3', '7', '7', '4833', '6478', '0'), +('3', '7', '7', '4853', '5413', '0'), +('3', '7', '7', '4343', '3962', '0'), +('3', '7', '7', '2986', '3926', '0'), +('3', '7', '9', '4834', '4408', '0'), +('3', '7', '9', '4854', '3727', '0'), +('3', '7', '9', '12189', '3471', '0'), +('3', '7', '9', '10149', '3086', '0'), +('3', '7', '15', '10366', '8054', '0'), +('3', '7', '15', '10151', '7200', '0'), +('3', '7', '15', '14679', '7010', '0'), +('3', '7', '15', '14678', '5708', '0'), +('3', '7', '20', '2716', '23980', '0'), +('3', '7', '20', '11601', '17825', '0'), +('3', '7', '20', '2919', '10919', '0'), +('3', '7', '20', '1365', '10500', '0'), +('3', '7', '12', '4835', '10013', '0'), +('3', '7', '12', '20655', '7958', '0'), +('3', '7', '12', '2923', '4758', '0'), +('3', '7', '12', '4855', '4730', '0'), +('3', '7', '18', '4836', '6448', '0'), +('3', '7', '18', '4856', '5488', '0'), +('3', '7', '18', '4346', '4645', '0'), +('3', '7', '18', '3155', '4407', '0'), +('3', '7', '19', '4837', '7097', '0'), +('3', '7', '19', '3156', '6822', '0'), +('3', '7', '19', '68239', '5286', '0'), +('3', '7', '19', '4857', '5285', '0'), +('3', '7', '13', '5401', '19848', '0'), +('3', '7', '13', '11050', '19728', '0'), +('3', '7', '13', '27708', '18553', '0'), +('3', '7', '13', '11682', '18417', '0'), +('3', '7', '14', '11632', '28103', '0'), +('3', '7', '14', '11551', '23853', '0'), +('3', '7', '14', '9428', '20353', '0'), +('3', '7', '14', '11644', '19308', '0'), +('3', '7', '11', '8408', '6861', '0'), +('3', '7', '11', '8325', '6668', '0'), +('3', '7', '11', '8811', '5213', '0'), +('3', '7', '11', '8810', '4798', '0'), +('3', '8', '22', '10323', '0', '0'), +('3', '8', '22', '66166', '0', '0'), +('3', '8', '22', '8567', '0', '0'), +('3', '8', '22', '9246', '0', '0'), +('3', '8', '1', '14701', '4854', '0'), +('3', '8', '1', '14702', '3550', '0'), +('3', '8', '1', '10082', '2586', '0'), +('3', '8', '1', '10165', '1940', '0'), +('3', '8', '2', '4301', '7726', '0'), +('3', '8', '2', '4851', '6177', '0'), +('3', '8', '2', '4831', '6040', '0'), +('3', '8', '2', '10142', '4824', '0'), +('3', '8', '3', '71529', '2911', '0'), +('3', '8', '3', '21002', '2114', '0'), +('3', '8', '3', '4505', '1713', '0'), +('3', '8', '3', '10144', '1628', '0'), +('3', '8', '5', '14703', '7150', '0'), +('3', '8', '5', '12800', '4901', '0'), +('3', '8', '5', '14700', '4806', '0'), +('3', '8', '5', '10055', '4760', '0'), +('3', '8', '8', '11621', '26579', '0'), +('3', '8', '8', '11551', '8753', '0'), +('3', '8', '8', '1409', '7747', '0'), +('3', '8', '8', '11603', '6281', '0'), +('3', '8', '6', '1557', '8270', '0'), +('3', '8', '6', '25062', '3672', '0'), +('3', '8', '6', '4302', '3532', '0'), +('3', '8', '6', '4165', '3247', '0'), +('3', '8', '17', '4832', '11866', '0'), +('3', '8', '17', '4852', '10225', '0'), +('3', '8', '17', '4309', '8225', '0'), +('3', '8', '17', '11623', '7848', '0'), +('3', '8', '7', '4833', '6478', '0'), +('3', '8', '7', '4853', '5413', '0'), +('3', '8', '7', '4343', '4011', '0'), +('3', '8', '7', '2986', '3926', '0'), +('3', '8', '9', '4834', '4408', '0'), +('3', '8', '9', '4854', '3727', '0'), +('3', '8', '9', '12189', '3471', '0'), +('3', '8', '9', '10149', '3097', '0'), +('3', '8', '15', '10366', '8054', '0'), +('3', '8', '15', '10151', '7200', '0'), +('3', '8', '15', '14679', '7010', '0'), +('3', '8', '15', '14678', '5708', '0'), +('3', '8', '20', '2716', '24002', '0'), +('3', '8', '20', '11601', '17874', '0'), +('3', '8', '20', '2919', '10937', '0'), +('3', '8', '20', '1365', '10500', '0'), +('3', '8', '12', '4835', '10037', '0'), +('3', '8', '12', '20655', '7975', '0'), +('3', '8', '12', '4855', '4773', '0'), +('3', '8', '12', '2923', '4758', '0'), +('3', '8', '18', '4836', '6472', '0'), +('3', '8', '18', '4856', '5488', '0'), +('3', '8', '18', '4346', '4645', '0'), +('3', '8', '18', '3155', '4436', '0'), +('3', '8', '19', '4837', '7115', '0'), +('3', '8', '19', '3156', '6822', '0'), +('3', '8', '19', '4857', '5309', '0'), +('3', '8', '19', '68239', '5297', '0'), +('3', '8', '13', '5401', '19848', '0'), +('3', '8', '13', '11050', '19756', '0'), +('3', '8', '13', '27708', '18630', '0'), +('3', '8', '13', '11682', '18417', '0'), +('3', '8', '14', '11632', '28175', '0'), +('3', '8', '14', '11551', '23853', '0'), +('3', '8', '14', '9428', '20353', '0'), +('3', '8', '14', '11644', '19308', '0'), +('3', '8', '11', '8408', '6861', '0'), +('3', '8', '11', '8325', '6668', '0'), +('3', '8', '11', '8811', '5213', '0'), +('3', '8', '11', '8810', '4798', '0'), +('3', '9', '22', '10323', '0', '0'), +('3', '9', '22', '66166', '0', '0'), +('3', '9', '22', '8567', '0', '0'), +('3', '9', '22', '9246', '0', '0'), +('3', '9', '1', '14701', '4854', '0'), +('3', '9', '1', '14702', '3550', '0'), +('3', '9', '1', '10082', '2608', '0'), +('3', '9', '1', '10165', '1940', '0'), +('3', '9', '2', '4301', '7726', '0'), +('3', '9', '2', '4851', '6202', '0'), +('3', '9', '2', '4831', '6040', '0'), +('3', '9', '2', '10142', '4824', '0'), +('3', '9', '3', '71529', '3290', '0'), +('3', '9', '3', '21002', '2114', '0'), +('3', '9', '3', '4505', '1738', '0'), +('3', '9', '3', '10144', '1628', '0'), +('3', '9', '5', '14703', '7150', '0'), +('3', '9', '5', '12800', '4920', '0'), +('3', '9', '5', '14700', '4806', '0'), +('3', '9', '5', '10055', '4760', '0'), +('3', '9', '8', '11621', '26579', '0'), +('3', '9', '8', '11551', '8753', '0'), +('3', '9', '8', '1409', '7747', '0'), +('3', '9', '8', '11603', '6314', '0'), +('3', '9', '6', '1557', '8270', '0'), +('3', '9', '6', '25062', '3672', '0'), +('3', '9', '6', '4302', '3558', '0'), +('3', '9', '6', '4165', '3247', '0'), +('3', '9', '17', '4832', '11929', '0'), +('3', '9', '17', '4852', '10296', '0'), +('3', '9', '17', '4309', '8225', '0'), +('3', '9', '17', '11623', '7848', '0'), +('3', '9', '7', '4833', '6478', '0'), +('3', '9', '7', '4853', '5413', '0'), +('3', '9', '7', '4343', '4053', '0'), +('3', '9', '7', '2986', '3926', '0'), +('3', '9', '9', '4834', '4408', '0'), +('3', '9', '9', '4854', '3727', '0'), +('3', '9', '9', '12189', '3471', '0'), +('3', '9', '9', '10149', '3108', '0'), +('3', '9', '15', '10366', '8054', '0'), +('3', '9', '15', '10151', '7200', '0'), +('3', '9', '15', '14679', '7010', '0'), +('3', '9', '15', '14678', '5708', '0'), +('3', '9', '20', '2716', '24024', '0'), +('3', '9', '20', '11601', '17916', '0'), +('3', '9', '20', '2919', '10956', '0'), +('3', '9', '20', '1365', '10500', '0'), +('3', '9', '12', '4835', '10059', '0'), +('3', '9', '12', '20655', '7991', '0'), +('3', '9', '12', '4855', '4812', '0'), +('3', '9', '12', '2923', '4758', '0'), +('3', '9', '18', '4836', '6493', '0'), +('3', '9', '18', '4856', '5488', '0'), +('3', '9', '18', '4346', '4645', '0'), +('3', '9', '18', '3155', '4462', '0'), +('3', '9', '19', '4837', '7133', '0'), +('3', '9', '19', '3156', '6822', '0'), +('3', '9', '19', '4857', '5330', '0'), +('3', '9', '19', '68239', '5308', '0'), +('3', '9', '13', '5401', '19848', '0'), +('3', '9', '13', '11050', '19783', '0'), +('3', '9', '13', '27708', '18702', '0'), +('3', '9', '13', '11682', '18417', '0'), +('3', '9', '14', '11632', '28239', '0'), +('3', '9', '14', '11551', '23853', '0'), +('3', '9', '14', '9428', '20353', '0'), +('3', '9', '14', '11644', '19308', '0'), +('3', '9', '11', '8408', '6861', '0'), +('3', '9', '11', '8325', '6668', '0'), +('3', '9', '11', '8811', '5213', '0'), +('3', '9', '11', '8810', '4798', '0'), +('3', '10', '22', '10323', '0', '0'), +('3', '10', '22', '66166', '0', '0'), +('3', '10', '22', '8567', '0', '0'), +('3', '10', '22', '9246', '0', '0'), +('3', '10', '1', '14701', '4854', '0'), +('3', '10', '1', '14702', '3550', '0'), +('3', '10', '1', '10082', '2629', '0'), +('3', '10', '1', '10165', '1940', '0'), +('3', '10', '2', '4301', '7726', '0'), +('3', '10', '2', '4851', '6228', '0'), +('3', '10', '2', '4831', '6040', '0'), +('3', '10', '2', '10142', '4824', '0'), +('3', '10', '3', '71529', '3675', '0'), +('3', '10', '3', '21002', '2114', '0'), +('3', '10', '3', '4505', '1764', '0'), +('3', '10', '3', '10144', '1628', '0'), +('3', '10', '5', '14703', '7150', '0'), +('3', '10', '5', '12800', '4938', '0'), +('3', '10', '5', '14700', '4806', '0'), +('3', '10', '5', '10055', '4760', '0'), +('3', '10', '8', '11621', '26579', '0'), +('3', '10', '8', '11551', '8753', '0'), +('3', '10', '8', '1409', '7747', '0'), +('3', '10', '8', '11603', '6346', '0'), +('3', '10', '6', '1557', '8270', '0'), +('3', '10', '6', '25062', '3672', '0'), +('3', '10', '6', '4302', '3587', '0'), +('3', '10', '6', '4165', '3247', '0'), +('3', '10', '17', '4832', '12001', '0'), +('3', '10', '17', '4852', '10372', '0'), +('3', '10', '17', '4309', '8225', '0'), +('3', '10', '17', '11623', '7848', '0'), +('3', '10', '7', '4833', '6478', '0'), +('3', '10', '7', '4853', '5413', '0'), +('3', '10', '7', '4343', '4101', '0'), +('3', '10', '7', '2986', '3926', '0'), +('3', '10', '9', '4834', '4408', '0'), +('3', '10', '9', '4854', '3727', '0'), +('3', '10', '9', '12189', '3471', '0'), +('3', '10', '9', '10149', '3119', '0'), +('3', '10', '15', '10366', '8054', '0'), +('3', '10', '15', '10151', '7200', '0'), +('3', '10', '15', '14679', '7010', '0'), +('3', '10', '15', '14678', '5708', '0'), +('3', '10', '20', '2716', '24045', '0'), +('3', '10', '20', '11601', '17964', '0'), +('3', '10', '20', '2919', '10974', '0'), +('3', '10', '20', '1365', '10500', '0'), +('3', '10', '12', '4835', '10083', '0'), +('3', '10', '12', '20655', '8007', '0'), +('3', '10', '12', '4855', '4854', '0'), +('3', '10', '12', '2923', '4758', '0'), +('3', '10', '18', '4836', '6517', '0'), +('3', '10', '18', '4856', '5488', '0'), +('3', '10', '18', '4346', '4645', '0'), +('3', '10', '18', '3155', '4491', '0'), +('3', '10', '19', '4837', '7151', '0'), +('3', '10', '19', '3156', '6822', '0'), +('3', '10', '19', '4857', '5354', '0'), +('3', '10', '19', '68239', '5319', '0'), +('3', '10', '13', '5401', '19848', '0'), +('3', '10', '13', '11050', '19810', '0'), +('3', '10', '13', '27708', '18779', '0'), +('3', '10', '13', '11682', '18417', '0'), +('3', '10', '14', '11632', '28311', '0'), +('3', '10', '14', '11551', '23853', '0'), +('3', '10', '14', '9428', '20353', '0'), +('3', '10', '14', '11644', '19308', '0'), +('3', '10', '11', '8408', '6861', '0'), +('3', '10', '11', '8325', '6668', '0'), +('3', '10', '11', '8811', '5213', '0'), +('3', '10', '11', '8810', '4798', '0'), +('3', '11', '22', '10323', '0', '0'), +('3', '11', '22', '66166', '0', '0'), +('3', '11', '22', '8567', '0', '0'), +('3', '11', '22', '9246', '0', '0'), +('3', '11', '1', '14701', '4854', '0'), +('3', '11', '1', '14702', '3550', '0'), +('3', '11', '1', '10082', '2651', '0'), +('3', '11', '1', '10165', '1940', '0'), +('3', '11', '2', '4301', '7726', '0'), +('3', '11', '2', '4851', '6253', '0'), +('3', '11', '2', '4831', '6040', '0'), +('3', '11', '2', '10142', '4824', '0'), +('3', '11', '3', '71529', '3691', '0'), +('3', '11', '3', '21002', '2114', '0'), +('3', '11', '3', '4505', '1789', '0'), +('3', '11', '3', '10144', '1628', '0'), +('3', '11', '5', '14703', '7150', '0'), +('3', '11', '5', '12800', '4956', '0'), +('3', '11', '5', '14700', '4806', '0'), +('3', '11', '5', '10055', '4760', '0'), +('3', '11', '8', '11621', '26579', '0'), +('3', '11', '8', '11551', '8753', '0'), +('3', '11', '8', '1409', '7747', '0'), +('3', '11', '8', '11603', '6379', '0'), +('3', '11', '6', '1557', '8270', '0'), +('3', '11', '6', '25062', '3672', '0'), +('3', '11', '6', '4302', '3612', '0'), +('3', '11', '6', '4165', '3247', '0'), +('3', '11', '17', '4832', '12065', '0'), +('3', '11', '17', '4852', '10443', '0'), +('3', '11', '17', '4309', '8225', '0'), +('3', '11', '17', '11623', '7848', '0'), +('3', '11', '7', '4833', '6478', '0'), +('3', '11', '7', '4853', '5413', '0'), +('3', '11', '7', '4343', '4143', '0'), +('3', '11', '7', '2986', '3926', '0'), +('3', '11', '9', '4834', '4408', '0'), +('3', '11', '9', '4854', '3727', '0'), +('3', '11', '9', '12189', '3471', '0'), +('3', '11', '9', '10149', '3130', '0'), +('3', '11', '15', '10366', '8054', '0'), +('3', '11', '15', '10151', '7200', '0'), +('3', '11', '15', '14679', '7010', '0'), +('3', '11', '15', '14678', '5708', '0'), +('3', '11', '20', '2716', '24067', '0'), +('3', '11', '20', '11601', '18007', '0'), +('3', '11', '20', '2919', '10992', '0'), +('3', '11', '20', '1365', '10500', '0'), +('3', '11', '12', '4835', '10104', '0'), +('3', '11', '12', '20655', '8023', '0'), +('3', '11', '12', '4855', '4893', '0'), +('3', '11', '12', '2923', '4758', '0'), +('3', '11', '18', '4836', '6538', '0'), +('3', '11', '18', '4856', '5488', '0'), +('3', '11', '18', '4346', '4645', '0'), +('3', '11', '18', '3155', '4516', '0'), +('3', '11', '19', '4837', '7170', '0'), +('3', '11', '19', '3156', '6822', '0'), +('3', '11', '19', '4857', '5376', '0'), +('3', '11', '19', '68239', '5330', '0'), +('3', '11', '13', '5401', '19848', '0'), +('3', '11', '13', '11050', '19837', '0'), +('3', '11', '13', '27708', '18850', '0'), +('3', '11', '13', '11682', '18417', '0'), +('3', '11', '14', '11632', '28375', '0'), +('3', '11', '14', '11551', '23853', '0'), +('3', '11', '14', '9428', '20353', '0'), +('3', '11', '14', '11644', '19308', '0'), +('3', '11', '11', '8408', '6861', '0'), +('3', '11', '11', '8325', '6668', '0'), +('3', '11', '11', '8811', '5213', '0'), +('3', '11', '11', '8810', '4798', '0'), +('3', '12', '22', '10323', '0', '0'), +('3', '12', '22', '66166', '0', '0'), +('3', '12', '22', '8567', '0', '0'), +('3', '12', '22', '9246', '0', '0'), +('3', '12', '1', '14701', '4854', '0'), +('3', '12', '1', '14702', '3550', '0'), +('3', '12', '1', '10082', '2673', '0'), +('3', '12', '1', '10165', '1940', '0'), +('3', '12', '2', '4301', '7726', '0'), +('3', '12', '2', '4851', '6278', '0'), +('3', '12', '2', '4831', '6040', '0'), +('3', '12', '2', '10142', '4824', '0'), +('3', '12', '3', '71529', '3711', '0'), +('3', '12', '3', '21002', '2114', '0'), +('3', '12', '3', '4505', '1814', '0'), +('3', '12', '3', '10144', '1628', '0'), +('3', '12', '5', '14703', '7150', '0'), +('3', '12', '5', '12800', '4974', '0'), +('3', '12', '5', '14700', '4806', '0'), +('3', '12', '5', '10055', '4760', '0'), +('3', '12', '8', '11621', '26579', '0'), +('3', '12', '8', '11551', '8753', '0'), +('3', '12', '8', '1409', '7747', '0'), +('3', '12', '8', '11603', '6411', '0'), +('3', '12', '6', '1557', '8270', '0'), +('3', '12', '6', '25062', '3672', '0'), +('3', '12', '6', '4302', '3641', '0'), +('3', '12', '6', '4165', '3247', '0'), +('3', '12', '17', '4832', '12137', '0'), +('3', '12', '17', '4852', '10519', '0'), +('3', '12', '17', '4309', '8225', '0'), +('3', '12', '17', '11623', '7848', '0'), +('3', '12', '7', '4833', '6478', '0'), +('3', '12', '7', '4853', '5413', '0'), +('3', '12', '7', '4343', '4192', '0'), +('3', '12', '7', '2986', '3926', '0'), +('3', '12', '9', '4834', '4408', '0'), +('3', '12', '9', '4854', '3727', '0'), +('3', '12', '9', '12189', '3471', '0'), +('3', '12', '9', '10149', '3140', '0'), +('3', '12', '15', '10366', '8054', '0'), +('3', '12', '15', '10151', '7200', '0'), +('3', '12', '15', '14679', '7010', '0'), +('3', '12', '15', '14678', '5708', '0'), +('3', '12', '20', '2716', '24089', '0'), +('3', '12', '20', '11601', '18055', '0'), +('3', '12', '20', '2919', '11010', '0'), +('3', '12', '20', '1365', '10500', '0'), +('3', '12', '12', '4835', '10128', '0'), +('3', '12', '12', '20655', '8040', '0'), +('3', '12', '12', '4855', '4936', '0'), +('3', '12', '12', '2923', '4758', '0'), +('3', '12', '18', '4836', '6562', '0'), +('3', '12', '18', '4856', '5488', '0'), +('3', '12', '18', '4346', '4645', '0'), +('3', '12', '18', '3155', '4545', '0'), +('3', '12', '19', '4837', '7188', '0'), +('3', '12', '19', '3156', '6822', '0'), +('3', '12', '19', '4857', '5400', '0'), +('3', '12', '19', '68239', '5341', '0'), +('3', '12', '13', '11050', '19864', '0'), +('3', '12', '13', '5401', '19848', '0'), +('3', '12', '13', '27708', '18927', '0'), +('3', '12', '13', '11682', '18417', '0'), +('3', '12', '14', '11632', '28447', '0'), +('3', '12', '14', '11551', '23853', '0'), +('3', '12', '14', '9428', '20353', '0'), +('3', '12', '14', '11644', '19308', '0'), +('3', '12', '11', '8408', '6861', '0'), +('3', '12', '11', '8325', '6668', '0'), +('3', '12', '11', '8811', '5213', '0'), +('3', '12', '11', '8810', '4798', '0'), +('3', '13', '22', '10323', '0', '0'), +('3', '13', '22', '66166', '0', '0'), +('3', '13', '22', '8567', '0', '0'), +('3', '13', '22', '9246', '0', '0'), +('3', '13', '1', '14701', '4854', '0'), +('3', '13', '1', '14702', '3550', '0'), +('3', '13', '1', '10082', '2695', '0'), +('3', '13', '1', '10165', '1940', '0'), +('3', '13', '2', '4301', '7726', '0'), +('3', '13', '2', '4851', '6304', '0'), +('3', '13', '2', '4831', '6040', '0'), +('3', '13', '2', '10142', '4824', '0'), +('3', '13', '3', '71529', '3730', '0'), +('3', '13', '3', '21002', '2114', '0'), +('3', '13', '3', '4505', '1840', '0'), +('3', '13', '3', '10144', '1628', '0'), +('3', '13', '5', '14703', '7150', '0'), +('3', '13', '5', '12800', '4992', '0'), +('3', '13', '5', '14700', '4806', '0'), +('3', '13', '5', '10055', '4760', '0'), +('3', '13', '8', '11621', '26579', '0'), +('3', '13', '8', '11551', '8753', '0'), +('3', '13', '8', '1409', '7747', '0'), +('3', '13', '8', '11603', '6444', '0'), +('3', '13', '6', '1557', '8270', '0'), +('3', '13', '6', '25062', '3672', '0'), +('3', '13', '6', '4302', '3670', '0'), +('3', '13', '6', '4165', '3247', '0'), +('3', '13', '17', '4832', '12210', '0'), +('3', '13', '17', '4852', '10595', '0'), +('3', '13', '17', '4309', '8225', '0'), +('3', '13', '17', '11623', '7848', '0'), +('3', '13', '7', '4833', '6478', '0'), +('3', '13', '7', '4853', '5413', '0'), +('3', '13', '7', '4343', '4240', '0'), +('3', '13', '7', '2986', '3926', '0'), +('3', '13', '9', '4834', '4408', '0'), +('3', '13', '9', '4854', '3727', '0'), +('3', '13', '9', '12189', '3471', '0'), +('3', '13', '9', '10149', '3151', '0'), +('3', '13', '15', '10366', '8054', '0'), +('3', '13', '15', '10151', '7200', '0'), +('3', '13', '15', '14679', '7010', '0'), +('3', '13', '15', '14678', '5708', '0'), +('3', '13', '20', '2716', '24111', '0'), +('3', '13', '20', '11601', '18103', '0'), +('3', '13', '20', '2919', '11028', '0'), +('3', '13', '20', '1365', '10500', '0'), +('3', '13', '12', '4835', '10152', '0'), +('3', '13', '12', '20655', '8057', '0'), +('3', '13', '12', '4855', '4978', '0'), +('3', '13', '12', '2923', '4758', '0'), +('3', '13', '18', '4836', '6587', '0'), +('3', '13', '18', '4856', '5488', '0'), +('3', '13', '18', '4346', '4645', '0'), +('3', '13', '18', '3155', '4574', '0'), +('3', '13', '19', '4837', '7206', '0'), +('3', '13', '19', '3156', '6822', '0'), +('3', '13', '19', '4857', '5424', '0'), +('3', '13', '19', '68239', '5352', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '13', '13', '11050', '19891', '0'), +('3', '13', '13', '5401', '19848', '0'), +('3', '13', '13', '27708', '19005', '0'), +('3', '13', '13', '11682', '18417', '0'), +('3', '13', '14', '11632', '28520', '0'), +('3', '13', '14', '11551', '23853', '0'), +('3', '13', '14', '9428', '20353', '0'), +('3', '13', '14', '11644', '19308', '0'), +('3', '13', '11', '8408', '6861', '0'), +('3', '13', '11', '8325', '6668', '0'), +('3', '13', '11', '8811', '5213', '0'), +('3', '13', '11', '8810', '4798', '0'), +('3', '14', '22', '10323', '0', '0'), +('3', '14', '22', '66166', '0', '0'), +('3', '14', '22', '8567', '0', '0'), +('3', '14', '22', '9246', '0', '0'), +('3', '14', '1', '14701', '4854', '0'), +('3', '14', '1', '14702', '3550', '0'), +('3', '14', '1', '10082', '2716', '0'), +('3', '14', '1', '10165', '1940', '0'), +('3', '14', '2', '4301', '7726', '0'), +('3', '14', '2', '4851', '6329', '0'), +('3', '14', '2', '4831', '6040', '0'), +('3', '14', '2', '10142', '4824', '0'), +('3', '14', '3', '71529', '3747', '0'), +('3', '14', '3', '21002', '2114', '0'), +('3', '14', '3', '4505', '1865', '0'), +('3', '14', '3', '10144', '1628', '0'), +('3', '14', '5', '14703', '7150', '0'), +('3', '14', '5', '12800', '5010', '0'), +('3', '14', '5', '14700', '4806', '0'), +('3', '14', '5', '10055', '4760', '0'), +('3', '14', '8', '11621', '26579', '0'), +('3', '14', '8', '11551', '8753', '0'), +('3', '14', '8', '1409', '7747', '0'), +('3', '14', '8', '11603', '6477', '0'), +('3', '14', '6', '1557', '8270', '0'), +('3', '14', '6', '4302', '3695', '0'), +('3', '14', '6', '25062', '3672', '0'), +('3', '14', '6', '4165', '3247', '0'), +('3', '14', '17', '4832', '12273', '0'), +('3', '14', '17', '4852', '10665', '0'), +('3', '14', '17', '4309', '8225', '0'), +('3', '14', '17', '11623', '7848', '0'), +('3', '14', '7', '4833', '6478', '0'), +('3', '14', '7', '4853', '5413', '0'), +('3', '14', '7', '4343', '4282', '0'), +('3', '14', '7', '2986', '3926', '0'), +('3', '14', '9', '4834', '4408', '0'), +('3', '14', '9', '4854', '3727', '0'), +('3', '14', '9', '12189', '3471', '0'), +('3', '14', '9', '10149', '3162', '0'), +('3', '14', '15', '10366', '8054', '0'), +('3', '14', '15', '10151', '7200', '0'), +('3', '14', '15', '14679', '7010', '0'), +('3', '14', '15', '14678', '5708', '0'), +('3', '14', '20', '2716', '24132', '0'), +('3', '14', '20', '11601', '18146', '0'), +('3', '14', '20', '2919', '11046', '0'), +('3', '14', '20', '1365', '10500', '0'), +('3', '14', '12', '4835', '10173', '0'), +('3', '14', '12', '20655', '8073', '0'), +('3', '14', '12', '4855', '5017', '0'), +('3', '14', '12', '2923', '4758', '0'), +('3', '14', '18', '4836', '6608', '0'), +('3', '14', '18', '4856', '5488', '0'), +('3', '14', '18', '4346', '4645', '0'), +('3', '14', '18', '3155', '4599', '0'), +('3', '14', '19', '4837', '7224', '0'), +('3', '14', '19', '3156', '6822', '0'), +('3', '14', '19', '4857', '5445', '0'), +('3', '14', '19', '68239', '5362', '0'), +('3', '14', '13', '11050', '19919', '0'), +('3', '14', '13', '5401', '19848', '0'), +('3', '14', '13', '27708', '19076', '0'), +('3', '14', '13', '11682', '18417', '0'), +('3', '14', '14', '11632', '28583', '0'), +('3', '14', '14', '11551', '23853', '0'), +('3', '14', '14', '9428', '20353', '0'), +('3', '14', '14', '11644', '19308', '0'), +('3', '14', '11', '8408', '6861', '0'), +('3', '14', '11', '8325', '6668', '0'), +('3', '14', '11', '8811', '5213', '0'), +('3', '14', '11', '8810', '4798', '0'), +('3', '15', '22', '10323', '0', '0'), +('3', '15', '22', '66166', '0', '0'), +('3', '15', '22', '8567', '0', '0'), +('3', '15', '22', '9246', '0', '0'), +('3', '15', '1', '14701', '4854', '0'), +('3', '15', '1', '14702', '3550', '0'), +('3', '15', '1', '10082', '2738', '0'), +('3', '15', '1', '10165', '1940', '0'), +('3', '15', '2', '4301', '7726', '0'), +('3', '15', '2', '4851', '6355', '0'), +('3', '15', '2', '4831', '6040', '0'), +('3', '15', '2', '10142', '4824', '0'), +('3', '15', '3', '71529', '3766', '0'), +('3', '15', '3', '21002', '2114', '0'), +('3', '15', '3', '4505', '1891', '0'), +('3', '15', '3', '10144', '1628', '0'), +('3', '15', '5', '14703', '7150', '0'), +('3', '15', '5', '12800', '5028', '0'), +('3', '15', '5', '14700', '4806', '0'), +('3', '15', '5', '10055', '4760', '0'), +('3', '15', '8', '11621', '26579', '0'), +('3', '15', '8', '11551', '8753', '0'), +('3', '15', '8', '1409', '7747', '0'), +('3', '15', '8', '11603', '6509', '0'), +('3', '15', '6', '1557', '8270', '0'), +('3', '15', '6', '4302', '3724', '0'), +('3', '15', '6', '25062', '3672', '0'), +('3', '15', '6', '4165', '3247', '0'), +('3', '15', '17', '4832', '12346', '0'), +('3', '15', '17', '4852', '10742', '0'), +('3', '15', '17', '4309', '8225', '0'), +('3', '15', '17', '11623', '7848', '0'), +('3', '15', '7', '4833', '6478', '0'), +('3', '15', '7', '4853', '5413', '0'), +('3', '15', '7', '4343', '4331', '0'), +('3', '15', '7', '3152', '3948', '0'), +('3', '15', '9', '4834', '4408', '0'), +('3', '15', '9', '4854', '3727', '0'), +('3', '15', '9', '12189', '3471', '0'), +('3', '15', '9', '10149', '3173', '0'), +('3', '15', '15', '10366', '8054', '0'), +('3', '15', '15', '10151', '7200', '0'), +('3', '15', '15', '14679', '7010', '0'), +('3', '15', '15', '14678', '5708', '0'), +('3', '15', '20', '2716', '24154', '0'), +('3', '15', '20', '11601', '18194', '0'), +('3', '15', '20', '2919', '11064', '0'), +('3', '15', '20', '1365', '10500', '0'), +('3', '15', '12', '4835', '10197', '0'), +('3', '15', '12', '20655', '8090', '0'), +('3', '15', '12', '4855', '5060', '0'), +('3', '15', '12', '2923', '4758', '0'), +('3', '15', '18', '4836', '6632', '0'), +('3', '15', '18', '4856', '5488', '0'), +('3', '15', '18', '4346', '4645', '0'), +('3', '15', '18', '3155', '4628', '0'), +('3', '15', '19', '4837', '7242', '0'), +('3', '15', '19', '3156', '6822', '0'), +('3', '15', '19', '4857', '5469', '0'), +('3', '15', '19', '68239', '5373', '0'), +('3', '15', '13', '11050', '19946', '0'), +('3', '15', '13', '5401', '19848', '0'), +('3', '15', '13', '27708', '19153', '0'), +('3', '15', '13', '11682', '18417', '0'), +('3', '15', '14', '11632', '28656', '0'), +('3', '15', '14', '11551', '23853', '0'), +('3', '15', '14', '9428', '20353', '0'), +('3', '15', '14', '11644', '19308', '0'), +('3', '15', '11', '8408', '6861', '0'), +('3', '15', '11', '8325', '6668', '0'), +('3', '15', '11', '8811', '5213', '0'), +('3', '15', '11', '8810', '4798', '0'), +('3', '16', '22', '10323', '0', '0'), +('3', '16', '22', '66166', '0', '0'), +('3', '16', '22', '8567', '0', '0'), +('3', '16', '22', '9246', '0', '0'), +('3', '16', '1', '14701', '4854', '0'), +('3', '16', '1', '14702', '3550', '0'), +('3', '16', '1', '10082', '2760', '0'), +('3', '16', '1', '10165', '1940', '0'), +('3', '16', '2', '4301', '7726', '0'), +('3', '16', '2', '4851', '6380', '0'), +('3', '16', '2', '4831', '6040', '0'), +('3', '16', '2', '10142', '4824', '0'), +('3', '16', '3', '71529', '3786', '0'), +('3', '16', '3', '21002', '2114', '0'), +('3', '16', '3', '4505', '1916', '0'), +('3', '16', '3', '10144', '1628', '0'), +('3', '16', '5', '14703', '7150', '0'), +('3', '16', '5', '12800', '5046', '0'), +('3', '16', '5', '14700', '4806', '0'), +('3', '16', '5', '10055', '4760', '0'), +('3', '16', '8', '11621', '26579', '0'), +('3', '16', '8', '11551', '8753', '0'), +('3', '16', '8', '1409', '7747', '0'), +('3', '16', '8', '11603', '6542', '0'), +('3', '16', '6', '1557', '8270', '0'), +('3', '16', '6', '4302', '3753', '0'), +('3', '16', '6', '25062', '3672', '0'), +('3', '16', '6', '4165', '3247', '0'), +('3', '16', '17', '4832', '12418', '0'), +('3', '16', '17', '4852', '10818', '0'), +('3', '16', '17', '4309', '8225', '0'), +('3', '16', '17', '11623', '7848', '0'), +('3', '16', '7', '4833', '6478', '0'), +('3', '16', '7', '4853', '5413', '0'), +('3', '16', '7', '4343', '4379', '0'), +('3', '16', '7', '3152', '3970', '0'), +('3', '16', '9', '4834', '4408', '0'), +('3', '16', '9', '4854', '3727', '0'), +('3', '16', '9', '12189', '3471', '0'), +('3', '16', '9', '10149', '3184', '0'), +('3', '16', '15', '10366', '8054', '0'), +('3', '16', '15', '10151', '7200', '0'), +('3', '16', '15', '14679', '7010', '0'), +('3', '16', '15', '14678', '5708', '0'), +('3', '16', '20', '2716', '24176', '0'), +('3', '16', '20', '11601', '18242', '0'), +('3', '16', '20', '2919', '11082', '0'), +('3', '16', '20', '1365', '10500', '0'), +('3', '16', '12', '4835', '10222', '0'), +('3', '16', '12', '20655', '8106', '0'), +('3', '16', '12', '4855', '5102', '0'), +('3', '16', '12', '2923', '4758', '0'), +('3', '16', '18', '4836', '6656', '0'), +('3', '16', '18', '4856', '5488', '0'), +('3', '16', '18', '3155', '4657', '0'), +('3', '16', '18', '4346', '4645', '0'), +('3', '16', '19', '4837', '7260', '0'), +('3', '16', '19', '3156', '6822', '0'), +('3', '16', '19', '4857', '5493', '0'), +('3', '16', '19', '68239', '5384', '0'), +('3', '16', '13', '11050', '19973', '0'), +('3', '16', '13', '5401', '19848', '0'), +('3', '16', '13', '27708', '19231', '0'), +('3', '16', '13', '27709', '18465', '0'), +('3', '16', '14', '11632', '28728', '0'), +('3', '16', '14', '11551', '23853', '0'), +('3', '16', '14', '9428', '20353', '0'), +('3', '16', '14', '11644', '19308', '0'), +('3', '16', '11', '8408', '6861', '0'), +('3', '16', '11', '8325', '6668', '0'), +('3', '16', '11', '8811', '5213', '0'), +('3', '16', '11', '45137', '5003', '0'), +('3', '17', '22', '10323', '0', '0'), +('3', '17', '22', '66166', '0', '0'), +('3', '17', '22', '8567', '0', '0'), +('3', '17', '22', '9246', '0', '0'), +('3', '17', '1', '14701', '4854', '0'), +('3', '17', '1', '14702', '3550', '0'), +('3', '17', '1', '10082', '2782', '0'), +('3', '17', '1', '10165', '1940', '0'), +('3', '17', '2', '4301', '7726', '0'), +('3', '17', '2', '4851', '6405', '0'), +('3', '17', '2', '4831', '6040', '0'), +('3', '17', '2', '10142', '4824', '0'), +('3', '17', '3', '71529', '3805', '0'), +('3', '17', '3', '21002', '2114', '0'), +('3', '17', '3', '4505', '1941', '0'), +('3', '17', '3', '10144', '1628', '0'), +('3', '17', '5', '14703', '7150', '0'), +('3', '17', '5', '12800', '5065', '0'), +('3', '17', '5', '14700', '4806', '0'), +('3', '17', '5', '10055', '4760', '0'), +('3', '17', '8', '11621', '26579', '0'), +('3', '17', '8', '11551', '8753', '0'), +('3', '17', '8', '1409', '7747', '0'), +('3', '17', '8', '11603', '6574', '0'), +('3', '17', '6', '1557', '8270', '0'), +('3', '17', '6', '4302', '3782', '0'), +('3', '17', '6', '25062', '3672', '0'), +('3', '17', '6', '4165', '3247', '0'), +('3', '17', '17', '4832', '12491', '0'), +('3', '17', '17', '4852', '10894', '0'), +('3', '17', '17', '4309', '8225', '0'), +('3', '17', '17', '11623', '7848', '0'), +('3', '17', '7', '4833', '6478', '0'), +('3', '17', '7', '4853', '5413', '0'), +('3', '17', '7', '4343', '4427', '0'), +('3', '17', '7', '3152', '3992', '0'), +('3', '17', '9', '4834', '4408', '0'), +('3', '17', '9', '4854', '3727', '0'), +('3', '17', '9', '12189', '3471', '0'), +('3', '17', '9', '10149', '3195', '0'), +('3', '17', '15', '10366', '8054', '0'), +('3', '17', '15', '10151', '7200', '0'), +('3', '17', '15', '14679', '7010', '0'), +('3', '17', '15', '14678', '5708', '0'), +('3', '17', '20', '2716', '24198', '0'), +('3', '17', '20', '11601', '18290', '0'), +('3', '17', '20', '2919', '11101', '0'), +('3', '17', '20', '1365', '10500', '0'), +('3', '17', '12', '4835', '10246', '0'), +('3', '17', '12', '20655', '8123', '0'), +('3', '17', '12', '4855', '5144', '0'), +('3', '17', '12', '2923', '4758', '0'), +('3', '17', '18', '4836', '6680', '0'), +('3', '17', '18', '4856', '5488', '0'), +('3', '17', '18', '3155', '4686', '0'), +('3', '17', '18', '4346', '4645', '0'), +('3', '17', '19', '4837', '7278', '0'), +('3', '17', '19', '3156', '6822', '0'), +('3', '17', '19', '4857', '5518', '0'), +('3', '17', '19', '68239', '5395', '0'), +('3', '17', '13', '11050', '20000', '0'), +('3', '17', '13', '5401', '19848', '0'), +('3', '17', '13', '27708', '19308', '0'), +('3', '17', '13', '27709', '18519', '0'), +('3', '17', '14', '11632', '28801', '0'), +('3', '17', '14', '11551', '23853', '0'), +('3', '17', '14', '9428', '20353', '0'), +('3', '17', '14', '11644', '19308', '0'), +('3', '17', '11', '8408', '6861', '0'), +('3', '17', '11', '8325', '6668', '0'), +('3', '17', '11', '45137', '5293', '0'), +('3', '17', '11', '8811', '5213', '0'), +('3', '18', '22', '10323', '0', '0'), +('3', '18', '22', '66166', '0', '0'), +('3', '18', '22', '8567', '0', '0'), +('3', '18', '22', '9246', '0', '0'), +('3', '18', '1', '14701', '4854', '0'), +('3', '18', '1', '14702', '3550', '0'), +('3', '18', '1', '10082', '2803', '0'), +('3', '18', '1', '10165', '1940', '0'), +('3', '18', '2', '4301', '7726', '0'), +('3', '18', '2', '4851', '6431', '0'), +('3', '18', '2', '4831', '6040', '0'), +('3', '18', '2', '10142', '4824', '0'), +('3', '18', '3', '71529', '3824', '0'), +('3', '18', '3', '21002', '2114', '0'), +('3', '18', '3', '4505', '1967', '0'), +('3', '18', '3', '10144', '1628', '0'), +('3', '18', '5', '14703', '7150', '0'), +('3', '18', '5', '12800', '5083', '0'), +('3', '18', '5', '14700', '4806', '0'), +('3', '18', '5', '10055', '4760', '0'), +('3', '18', '8', '11621', '26579', '0'), +('3', '18', '8', '11551', '8753', '0'), +('3', '18', '8', '1409', '7747', '0'), +('3', '18', '8', '11603', '6607', '0'), +('3', '18', '6', '1557', '8270', '0'), +('3', '18', '6', '4302', '3811', '0'), +('3', '18', '6', '25062', '3672', '0'), +('3', '18', '6', '4165', '3247', '0'), +('3', '18', '17', '4832', '12563', '0'), +('3', '18', '17', '4852', '10970', '0'), +('3', '18', '17', '4309', '8225', '0'), +('3', '18', '17', '11623', '7848', '0'), +('3', '18', '7', '4833', '6478', '0'), +('3', '18', '7', '4853', '5413', '0'), +('3', '18', '7', '4343', '4476', '0'), +('3', '18', '7', '3152', '4013', '0'), +('3', '18', '9', '4834', '4408', '0'), +('3', '18', '9', '4854', '3727', '0'), +('3', '18', '9', '12189', '3471', '0'), +('3', '18', '9', '10149', '3206', '0'), +('3', '18', '15', '10366', '8054', '0'), +('3', '18', '15', '10151', '7200', '0'), +('3', '18', '15', '14679', '7010', '0'), +('3', '18', '15', '14678', '5708', '0'), +('3', '18', '20', '2716', '24219', '0'), +('3', '18', '20', '11601', '18339', '0'), +('3', '18', '20', '2919', '11119', '0'), +('3', '18', '20', '1365', '10500', '0'), +('3', '18', '12', '4835', '10270', '0'), +('3', '18', '12', '20655', '8140', '0'), +('3', '18', '12', '4855', '5186', '0'), +('3', '18', '12', '2923', '4758', '0'), +('3', '18', '18', '4836', '6704', '0'), +('3', '18', '18', '4856', '5488', '0'), +('3', '18', '18', '3155', '4715', '0'), +('3', '18', '18', '4346', '4645', '0'), +('3', '18', '19', '4837', '7296', '0'), +('3', '18', '19', '3156', '6822', '0'), +('3', '18', '19', '4857', '5542', '0'), +('3', '18', '19', '68239', '5406', '0'), +('3', '18', '13', '11050', '20027', '0'), +('3', '18', '13', '5401', '19848', '0'), +('3', '18', '13', '27708', '19385', '0'), +('3', '18', '13', '27709', '18573', '0'), +('3', '18', '14', '11632', '28873', '0'), +('3', '18', '14', '11551', '23853', '0'), +('3', '18', '14', '9428', '20353', '0'), +('3', '18', '14', '11644', '19308', '0'), +('3', '18', '11', '8408', '6861', '0'), +('3', '18', '11', '8325', '6668', '0'), +('3', '18', '11', '45137', '5688', '0'), +('3', '18', '11', '8811', '5213', '0'), +('3', '19', '22', '10323', '0', '0'), +('3', '19', '22', '66166', '0', '0'), +('3', '19', '22', '8567', '0', '0'), +('3', '19', '22', '9246', '0', '0'), +('3', '19', '1', '14701', '4854', '0'), +('3', '19', '1', '14702', '3550', '0'), +('3', '19', '1', '10082', '2825', '0'), +('3', '19', '1', '10165', '1940', '0'), +('3', '19', '2', '4301', '7726', '0'), +('3', '19', '2', '4851', '6456', '0'), +('3', '19', '2', '4831', '6040', '0'), +('3', '19', '2', '4620', '4848', '0'), +('3', '19', '3', '71529', '3844', '0'), +('3', '19', '3', '21002', '2114', '0'), +('3', '19', '3', '4505', '1992', '0'), +('3', '19', '3', '10144', '1628', '0'), +('3', '19', '5', '14703', '7150', '0'), +('3', '19', '5', '12800', '5101', '0'), +('3', '19', '5', '14700', '4806', '0'), +('3', '19', '5', '10055', '4760', '0'), +('3', '19', '8', '11621', '26579', '0'), +('3', '19', '8', '11551', '8753', '0'), +('3', '19', '8', '1409', '7747', '0'), +('3', '19', '8', '11603', '6640', '0'), +('3', '19', '6', '1557', '8270', '0'), +('3', '19', '6', '4302', '3840', '0'), +('3', '19', '6', '25062', '3672', '0'), +('3', '19', '6', '4165', '3247', '0'), +('3', '19', '17', '4832', '12636', '0'), +('3', '19', '17', '4852', '11046', '0'), +('3', '19', '17', '4309', '8225', '0'), +('3', '19', '17', '11623', '7848', '0'), +('3', '19', '7', '4833', '6478', '0'), +('3', '19', '7', '4853', '5413', '0'), +('3', '19', '7', '4343', '4524', '0'), +('3', '19', '7', '3152', '4035', '0'), +('3', '19', '9', '4834', '4408', '0'), +('3', '19', '9', '4854', '3727', '0'), +('3', '19', '9', '12189', '3471', '0'), +('3', '19', '9', '10149', '3217', '0'), +('3', '19', '15', '10366', '8054', '0'), +('3', '19', '15', '10151', '7200', '0'), +('3', '19', '15', '14679', '7010', '0'), +('3', '19', '15', '14678', '5708', '0'), +('3', '19', '20', '2716', '24241', '0'), +('3', '19', '20', '11601', '18387', '0'), +('3', '19', '20', '2919', '11137', '0'), +('3', '19', '20', '1365', '10500', '0'), +('3', '19', '12', '4835', '10294', '0'), +('3', '19', '12', '20655', '8157', '0'), +('3', '19', '12', '4855', '5229', '0'), +('3', '19', '12', '2923', '4758', '0'), +('3', '19', '18', '4836', '6729', '0'), +('3', '19', '18', '4856', '5488', '0'), +('3', '19', '18', '3155', '4744', '0'), +('3', '19', '18', '4346', '4645', '0'), +('3', '19', '19', '4837', '7314', '0'), +('3', '19', '19', '3156', '6822', '0'), +('3', '19', '19', '4857', '5566', '0'), +('3', '19', '19', '68239', '5417', '0'), +('3', '19', '13', '11050', '20055', '0'), +('3', '19', '13', '5401', '19848', '0'), +('3', '19', '13', '27708', '19463', '0'), +('3', '19', '13', '27709', '18628', '0'), +('3', '19', '14', '11632', '28946', '0'), +('3', '19', '14', '11551', '23853', '0'), +('3', '19', '14', '9428', '20353', '0'), +('3', '19', '14', '11644', '19308', '0'), +('3', '19', '11', '8408', '6861', '0'), +('3', '19', '11', '8325', '6668', '0'), +('3', '19', '11', '45137', '5990', '0'), +('3', '19', '11', '8811', '5213', '0'), +('3', '20', '22', '10323', '0', '0'), +('3', '20', '22', '66166', '0', '0'), +('3', '20', '22', '8567', '0', '0'), +('3', '20', '22', '9246', '0', '0'), +('3', '20', '1', '14701', '4854', '0'), +('3', '20', '1', '14702', '3550', '0'), +('3', '20', '1', '10082', '2847', '0'), +('3', '20', '1', '10165', '1940', '0'), +('3', '20', '2', '4301', '7726', '0'), +('3', '20', '2', '4851', '6481', '0'), +('3', '20', '2', '4831', '6040', '0'), +('3', '20', '2', '4620', '4882', '0'), +('3', '20', '3', '71529', '3863', '0'), +('3', '20', '3', '21002', '2114', '0'), +('3', '20', '3', '4505', '2017', '0'), +('3', '20', '3', '10144', '1628', '0'), +('3', '20', '5', '14703', '7150', '0'), +('3', '20', '5', '12800', '5119', '0'), +('3', '20', '5', '14700', '4806', '0'), +('3', '20', '5', '10055', '4760', '0'), +('3', '20', '8', '11621', '26579', '0'), +('3', '20', '8', '11551', '8753', '0'), +('3', '20', '8', '1409', '7747', '0'), +('3', '20', '8', '11603', '6672', '0'), +('3', '20', '6', '1557', '8270', '0'), +('3', '20', '6', '4302', '3869', '0'), +('3', '20', '6', '25062', '3672', '0'), +('3', '20', '6', '4165', '3247', '0'), +('3', '20', '17', '4832', '12708', '0'), +('3', '20', '17', '4852', '11122', '0'), +('3', '20', '17', '4309', '8225', '0'), +('3', '20', '17', '11623', '7848', '0'), +('3', '20', '7', '4833', '6478', '0'), +('3', '20', '7', '4853', '5413', '0'), +('3', '20', '7', '4343', '4572', '0'), +('3', '20', '7', '3152', '4057', '0'), +('3', '20', '9', '4834', '4408', '0'), +('3', '20', '9', '4854', '3727', '0'), +('3', '20', '9', '12189', '3471', '0'), +('3', '20', '9', '10149', '3227', '0'), +('3', '20', '15', '10366', '8054', '0'), +('3', '20', '15', '10151', '7200', '0'), +('3', '20', '15', '14679', '7010', '0'), +('3', '20', '15', '14678', '5708', '0'), +('3', '20', '20', '2716', '24263', '0'), +('3', '20', '20', '11601', '18435', '0'), +('3', '20', '20', '2919', '11155', '0'), +('3', '20', '20', '1365', '10500', '0'), +('3', '20', '12', '4835', '10318', '0'), +('3', '20', '12', '20655', '8174', '0'), +('3', '20', '12', '4855', '5271', '0'), +('3', '20', '12', '2923', '4758', '0'), +('3', '20', '18', '4836', '6753', '0'), +('3', '20', '18', '4856', '5488', '0'), +('3', '20', '18', '3155', '4773', '0'), +('3', '20', '18', '4346', '4645', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '20', '19', '4837', '7333', '0'), +('3', '20', '19', '3156', '6822', '0'), +('3', '20', '19', '4857', '5590', '0'), +('3', '20', '19', '68239', '5428', '0'), +('3', '20', '13', '11050', '20762', '0'), +('3', '20', '13', '5401', '20330', '0'), +('3', '20', '13', '27708', '20248', '0'), +('3', '20', '13', '27709', '19391', '0'), +('3', '20', '14', '11632', '29018', '0'), +('3', '20', '14', '11551', '23853', '0'), +('3', '20', '14', '9428', '20353', '0'), +('3', '20', '14', '11644', '19308', '0'), +('3', '20', '11', '8408', '7116', '0'), +('3', '20', '11', '8325', '6932', '0'), +('3', '20', '11', '45137', '6455', '0'), +('3', '20', '11', '8811', '5421', '0'), +('3', '21', '22', '10323', '0', '0'), +('3', '21', '22', '66166', '0', '0'), +('3', '21', '22', '8567', '0', '0'), +('3', '21', '22', '9246', '0', '0'), +('3', '21', '1', '14701', '4854', '0'), +('3', '21', '1', '14702', '3550', '0'), +('3', '21', '1', '10082', '2869', '0'), +('3', '21', '1', '10165', '1940', '0'), +('3', '21', '2', '4301', '7726', '0'), +('3', '21', '2', '4851', '6507', '0'), +('3', '21', '2', '4831', '6040', '0'), +('3', '21', '2', '4620', '4915', '0'), +('3', '21', '3', '71529', '3882', '0'), +('3', '21', '3', '21002', '2114', '0'), +('3', '21', '3', '4505', '2043', '0'), +('3', '21', '3', '10144', '1628', '0'), +('3', '21', '5', '14703', '7150', '0'), +('3', '21', '5', '12800', '5137', '0'), +('3', '21', '5', '14700', '4806', '0'), +('3', '21', '5', '10055', '4760', '0'), +('3', '21', '8', '11621', '26579', '0'), +('3', '21', '8', '11551', '8753', '0'), +('3', '21', '8', '1409', '7747', '0'), +('3', '21', '8', '11603', '6705', '0'), +('3', '21', '6', '1557', '8270', '0'), +('3', '21', '6', '4302', '3898', '0'), +('3', '21', '6', '25062', '3672', '0'), +('3', '21', '6', '4402', '3251', '0'), +('3', '21', '17', '4832', '12781', '0'), +('3', '21', '17', '4852', '11198', '0'), +('3', '21', '17', '4309', '8225', '0'), +('3', '21', '17', '11623', '7848', '0'), +('3', '21', '7', '4833', '6478', '0'), +('3', '21', '7', '4853', '5413', '0'), +('3', '21', '7', '4343', '4621', '0'), +('3', '21', '7', '3152', '4079', '0'), +('3', '21', '9', '4834', '4408', '0'), +('3', '21', '9', '4854', '3727', '0'), +('3', '21', '9', '12189', '3471', '0'), +('3', '21', '9', '10149', '3238', '0'), +('3', '21', '15', '10366', '8054', '0'), +('3', '21', '15', '10151', '7200', '0'), +('3', '21', '15', '14679', '7010', '0'), +('3', '21', '15', '14678', '5708', '0'), +('3', '21', '20', '2716', '24285', '0'), +('3', '21', '20', '11601', '18484', '0'), +('3', '21', '20', '2919', '11173', '0'), +('3', '21', '20', '1365', '10500', '0'), +('3', '21', '12', '4835', '10342', '0'), +('3', '21', '12', '20655', '8191', '0'), +('3', '21', '12', '4855', '5313', '0'), +('3', '21', '12', '2923', '4758', '0'), +('3', '21', '18', '4836', '6777', '0'), +('3', '21', '18', '4856', '5488', '0'), +('3', '21', '18', '3155', '4802', '0'), +('3', '21', '18', '4346', '4645', '0'), +('3', '21', '19', '4837', '7351', '0'), +('3', '21', '19', '3156', '6822', '0'), +('3', '21', '19', '4857', '5614', '0'), +('3', '21', '19', '68239', '5439', '0'), +('3', '21', '13', '11050', '21016', '0'), +('3', '21', '13', '27708', '20524', '0'), +('3', '21', '13', '5401', '20472', '0'), +('3', '21', '13', '27709', '19643', '0'), +('3', '21', '14', '11632', '29091', '0'), +('3', '21', '14', '11551', '23853', '0'), +('3', '21', '14', '9428', '20353', '0'), +('3', '21', '14', '11644', '19308', '0'), +('3', '21', '11', '8408', '7192', '0'), +('3', '21', '11', '8325', '7008', '0'), +('3', '21', '11', '45137', '6807', '0'), +('3', '21', '11', '8811', '5478', '0'), +('3', '22', '22', '10323', '0', '0'), +('3', '22', '22', '66166', '0', '0'), +('3', '22', '22', '8567', '0', '0'), +('3', '22', '22', '9246', '0', '0'), +('3', '22', '1', '14701', '4854', '0'), +('3', '22', '1', '14702', '3550', '0'), +('3', '22', '1', '10082', '2890', '0'), +('3', '22', '1', '10165', '1940', '0'), +('3', '22', '2', '4301', '7726', '0'), +('3', '22', '2', '4851', '6532', '0'), +('3', '22', '2', '4831', '6040', '0'), +('3', '22', '2', '4620', '4949', '0'), +('3', '22', '3', '71529', '3902', '0'), +('3', '22', '3', '21002', '2114', '0'), +('3', '22', '3', '4505', '2068', '0'), +('3', '22', '3', '10144', '1628', '0'), +('3', '22', '5', '14703', '7150', '0'), +('3', '22', '5', '12800', '5155', '0'), +('3', '22', '5', '14700', '4806', '0'), +('3', '22', '5', '10055', '4760', '0'), +('3', '22', '8', '11621', '26579', '0'), +('3', '22', '8', '11551', '8753', '0'), +('3', '22', '8', '1409', '7747', '0'), +('3', '22', '8', '11603', '6738', '0'), +('3', '22', '6', '1557', '8270', '0'), +('3', '22', '6', '4302', '3927', '0'), +('3', '22', '6', '25062', '3672', '0'), +('3', '22', '6', '4402', '3276', '0'), +('3', '22', '17', '4832', '12853', '0'), +('3', '22', '17', '4852', '11274', '0'), +('3', '22', '17', '4309', '8225', '0'), +('3', '22', '17', '11623', '7848', '0'), +('3', '22', '7', '4833', '6478', '0'), +('3', '22', '7', '4853', '5413', '0'), +('3', '22', '7', '4343', '4669', '0'), +('3', '22', '7', '3152', '4100', '0'), +('3', '22', '9', '4834', '4408', '0'), +('3', '22', '9', '4854', '3727', '0'), +('3', '22', '9', '12189', '3471', '0'), +('3', '22', '9', '10149', '3249', '0'), +('3', '22', '15', '10366', '8054', '0'), +('3', '22', '15', '10151', '7200', '0'), +('3', '22', '15', '14679', '7010', '0'), +('3', '22', '15', '14678', '5708', '0'), +('3', '22', '20', '2716', '24306', '0'), +('3', '22', '20', '11601', '18532', '0'), +('3', '22', '20', '2919', '11191', '0'), +('3', '22', '20', '1365', '10500', '0'), +('3', '22', '12', '4835', '10367', '0'), +('3', '22', '12', '20655', '8208', '0'), +('3', '22', '12', '4855', '5355', '0'), +('3', '22', '12', '2923', '4758', '0'), +('3', '22', '18', '4836', '6801', '0'), +('3', '22', '18', '4856', '5488', '0'), +('3', '22', '18', '3155', '4831', '0'), +('3', '22', '18', '4346', '4645', '0'), +('3', '22', '19', '4837', '7369', '0'), +('3', '22', '19', '3156', '6822', '0'), +('3', '22', '19', '4857', '5638', '0'), +('3', '22', '19', '68239', '5449', '0'), +('3', '22', '13', '11050', '21241', '0'), +('3', '22', '13', '27708', '20828', '0'), +('3', '22', '13', '5401', '20613', '0'), +('3', '22', '13', '27709', '19924', '0'), +('3', '22', '14', '11632', '29163', '0'), +('3', '22', '14', '11551', '23853', '0'), +('3', '22', '14', '9428', '20353', '0'), +('3', '22', '14', '11644', '19308', '0'), +('3', '22', '11', '8408', '7268', '0'), +('3', '22', '11', '45137', '7265', '0'), +('3', '22', '11', '8325', '7093', '0'), +('3', '22', '11', '8811', '5544', '0'), +('3', '23', '22', '10323', '0', '0'), +('3', '23', '22', '66166', '0', '0'), +('3', '23', '22', '8567', '0', '0'), +('3', '23', '22', '9246', '0', '0'), +('3', '23', '1', '14701', '4854', '0'), +('3', '23', '1', '14702', '3550', '0'), +('3', '23', '1', '10082', '2912', '0'), +('3', '23', '1', '10165', '1940', '0'), +('3', '23', '2', '4301', '7726', '0'), +('3', '23', '2', '4851', '6557', '0'), +('3', '23', '2', '4831', '6040', '0'), +('3', '23', '2', '4620', '4983', '0'), +('3', '23', '3', '71529', '3921', '0'), +('3', '23', '3', '21002', '2114', '0'), +('3', '23', '3', '4505', '2093', '0'), +('3', '23', '3', '10144', '1628', '0'), +('3', '23', '5', '14703', '7150', '0'), +('3', '23', '5', '12800', '5173', '0'), +('3', '23', '5', '14700', '4806', '0'), +('3', '23', '5', '10055', '4760', '0'), +('3', '23', '8', '11621', '26579', '0'), +('3', '23', '8', '11551', '8753', '0'), +('3', '23', '8', '1409', '7747', '0'), +('3', '23', '8', '11603', '6770', '0'), +('3', '23', '6', '1557', '8270', '0'), +('3', '23', '6', '4302', '3956', '0'), +('3', '23', '6', '25062', '3672', '0'), +('3', '23', '6', '4402', '3301', '0'), +('3', '23', '17', '4832', '12926', '0'), +('3', '23', '17', '4852', '11350', '0'), +('3', '23', '17', '4309', '8225', '0'), +('3', '23', '17', '11623', '7848', '0'), +('3', '23', '7', '4833', '6478', '0'), +('3', '23', '7', '4853', '5413', '0'), +('3', '23', '7', '4343', '4717', '0'), +('3', '23', '7', '3152', '4122', '0'), +('3', '23', '9', '4834', '4408', '0'), +('3', '23', '9', '4854', '3727', '0'), +('3', '23', '9', '12189', '3471', '0'), +('3', '23', '9', '10149', '3260', '0'), +('3', '23', '15', '10366', '8054', '0'), +('3', '23', '15', '10151', '7200', '0'), +('3', '23', '15', '14679', '7010', '0'), +('3', '23', '15', '14678', '5708', '0'), +('3', '23', '20', '2716', '24328', '0'), +('3', '23', '20', '11601', '18580', '0'), +('3', '23', '20', '2919', '11209', '0'), +('3', '23', '20', '1365', '10500', '0'), +('3', '23', '12', '4835', '10391', '0'), +('3', '23', '12', '20655', '8225', '0'), +('3', '23', '12', '4855', '5398', '0'), +('3', '23', '12', '2923', '4758', '0'), +('3', '23', '18', '4836', '6825', '0'), +('3', '23', '18', '4856', '5488', '0'), +('3', '23', '18', '3155', '4860', '0'), +('3', '23', '18', '4346', '4645', '0'), +('3', '23', '19', '4837', '7387', '0'), +('3', '23', '19', '3156', '6822', '0'), +('3', '23', '19', '4857', '5663', '0'), +('3', '23', '19', '68239', '5460', '0'), +('3', '23', '13', '11050', '21467', '0'), +('3', '23', '13', '27708', '21103', '0'), +('3', '23', '13', '5401', '20755', '0'), +('3', '23', '13', '27709', '20177', '0'), +('3', '23', '14', '11632', '29236', '0'), +('3', '23', '14', '11551', '23853', '0'), +('3', '23', '14', '9428', '20353', '0'), +('3', '23', '14', '11644', '19308', '0'), +('3', '23', '11', '45137', '7620', '0'), +('3', '23', '11', '8408', '7343', '0'), +('3', '23', '11', '8325', '7168', '0'), +('3', '23', '11', '8811', '5601', '0'), +('3', '24', '22', '10323', '0', '0'), +('3', '24', '22', '66166', '0', '0'), +('3', '24', '22', '8567', '0', '0'), +('3', '24', '22', '9246', '0', '0'), +('3', '24', '1', '14701', '4854', '0'), +('3', '24', '1', '14702', '3550', '0'), +('3', '24', '1', '10082', '2934', '0'), +('3', '24', '1', '10165', '1940', '0'), +('3', '24', '2', '4301', '7726', '0'), +('3', '24', '2', '4851', '6583', '0'), +('3', '24', '2', '4831', '6040', '0'), +('3', '24', '2', '4620', '5017', '0'), +('3', '24', '3', '71529', '3940', '0'), +('3', '24', '3', '4505', '2119', '0'), +('3', '24', '3', '21002', '2114', '0'), +('3', '24', '3', '10144', '1628', '0'), +('3', '24', '5', '14703', '7150', '0'), +('3', '24', '5', '12800', '5191', '0'), +('3', '24', '5', '14700', '4806', '0'), +('3', '24', '5', '10055', '4760', '0'), +('3', '24', '8', '11621', '26579', '0'), +('3', '24', '8', '11551', '8753', '0'), +('3', '24', '8', '1409', '7747', '0'), +('3', '24', '8', '11603', '6803', '0'), +('3', '24', '6', '1557', '8270', '0'), +('3', '24', '6', '4302', '3985', '0'), +('3', '24', '6', '25062', '3672', '0'), +('3', '24', '6', '4402', '3327', '0'), +('3', '24', '17', '4832', '12998', '0'), +('3', '24', '17', '4852', '11426', '0'), +('3', '24', '17', '4309', '8225', '0'), +('3', '24', '17', '11623', '7848', '0'), +('3', '24', '7', '4833', '6478', '0'), +('3', '24', '7', '4853', '5413', '0'), +('3', '24', '7', '4343', '4766', '0'), +('3', '24', '7', '3152', '4144', '0'), +('3', '24', '9', '4834', '4408', '0'), +('3', '24', '9', '4854', '3727', '0'), +('3', '24', '9', '12189', '3471', '0'), +('3', '24', '9', '10149', '3271', '0'), +('3', '24', '15', '10366', '8054', '0'), +('3', '24', '15', '10151', '7200', '0'), +('3', '24', '15', '14679', '7010', '0'), +('3', '24', '15', '14678', '5708', '0'), +('3', '24', '20', '2716', '24350', '0'), +('3', '24', '20', '11601', '18629', '0'), +('3', '24', '20', '2919', '11227', '0'), +('3', '24', '20', '1365', '10500', '0'), +('3', '24', '12', '4835', '10415', '0'), +('3', '24', '12', '20655', '8242', '0'), +('3', '24', '12', '4855', '5440', '0'), +('3', '24', '12', '2923', '4758', '0'), +('3', '24', '18', '4836', '6849', '0'), +('3', '24', '18', '4856', '5488', '0'), +('3', '24', '18', '3155', '4889', '0'), +('3', '24', '18', '4346', '4645', '0'), +('3', '24', '19', '4837', '7405', '0'), +('3', '24', '19', '3156', '6822', '0'), +('3', '24', '19', '4857', '5687', '0'), +('3', '24', '19', '68239', '5471', '0'), +('3', '24', '13', '11050', '21692', '0'), +('3', '24', '13', '27708', '21407', '0'), +('3', '24', '13', '5401', '20897', '0'), +('3', '24', '13', '27709', '20458', '0'), +('3', '24', '14', '11632', '29308', '0'), +('3', '24', '14', '11551', '23853', '0'), +('3', '24', '14', '9428', '20353', '0'), +('3', '24', '14', '11644', '19308', '0'), +('3', '24', '11', '45137', '8025', '0'), +('3', '24', '11', '8408', '7419', '0'), +('3', '24', '11', '8325', '7253', '0'), +('3', '24', '11', '8811', '5667', '0'), +('3', '25', '22', '10323', '0', '0'), +('3', '25', '22', '66166', '0', '0'), +('3', '25', '22', '8567', '0', '0'), +('3', '25', '22', '9246', '0', '0'), +('3', '25', '1', '14701', '4854', '0'), +('3', '25', '1', '14702', '3550', '0'), +('3', '25', '1', '10082', '2956', '0'), +('3', '25', '1', '10165', '1940', '0'), +('3', '25', '2', '4301', '7726', '0'), +('3', '25', '2', '4851', '6608', '0'), +('3', '25', '2', '4831', '6040', '0'), +('3', '25', '2', '4620', '5055', '0'), +('3', '25', '3', '71529', '3962', '0'), +('3', '25', '3', '4505', '2144', '0'), +('3', '25', '3', '21002', '2114', '0'), +('3', '25', '3', '10144', '1628', '0'), +('3', '25', '5', '14703', '7150', '0'), +('3', '25', '5', '12800', '5210', '0'), +('3', '25', '5', '14700', '4806', '0'), +('3', '25', '5', '10055', '4760', '0'), +('3', '25', '8', '11621', '26579', '0'), +('3', '25', '8', '11551', '8753', '0'), +('3', '25', '8', '1409', '7747', '0'), +('3', '25', '8', '11603', '6835', '0'), +('3', '25', '6', '1557', '8270', '0'), +('3', '25', '6', '4302', '4018', '0'), +('3', '25', '6', '25062', '3672', '0'), +('3', '25', '6', '4402', '3352', '0'), +('3', '25', '17', '4832', '13080', '0'), +('3', '25', '17', '4852', '11508', '0'), +('3', '25', '17', '4309', '8225', '0'), +('3', '25', '17', '11623', '7848', '0'), +('3', '25', '7', '4833', '6478', '0'), +('3', '25', '7', '4853', '5413', '0'), +('3', '25', '7', '4343', '4820', '0'), +('3', '25', '7', '3152', '4166', '0'), +('3', '25', '9', '4834', '4408', '0'), +('3', '25', '9', '4854', '3727', '0'), +('3', '25', '9', '12189', '3471', '0'), +('3', '25', '9', '10149', '3282', '0'), +('3', '25', '15', '10366', '8054', '0'), +('3', '25', '15', '10151', '7200', '0'), +('3', '25', '15', '14679', '7010', '0'), +('3', '25', '15', '14678', '5708', '0'), +('3', '25', '20', '2716', '24372', '0'), +('3', '25', '20', '11601', '18683', '0'), +('3', '25', '20', '2919', '11246', '0'), +('3', '25', '20', '1365', '10500', '0'), +('3', '25', '12', '4835', '10442', '0'), +('3', '25', '12', '20655', '8260', '0'), +('3', '25', '12', '4855', '5485', '0'), +('3', '25', '12', '2923', '4758', '0'), +('3', '25', '18', '4836', '6877', '0'), +('3', '25', '18', '4856', '5488', '0'), +('3', '25', '18', '3155', '4922', '0'), +('3', '25', '18', '4346', '4645', '0'), +('3', '25', '19', '4837', '7423', '0'), +('3', '25', '19', '3156', '6822', '0'), +('3', '25', '19', '4857', '5714', '0'), +('3', '25', '19', '68239', '5482', '0'), +('3', '25', '13', '11050', '21946', '0'), +('3', '25', '13', '27708', '21689', '0'), +('3', '25', '13', '5401', '21038', '0'), +('3', '25', '13', '27709', '20711', '0'), +('3', '25', '14', '11632', '29390', '0'), +('3', '25', '14', '11551', '23853', '0'), +('3', '25', '14', '9428', '20353', '0'), +('3', '25', '14', '11644', '19308', '0'), +('3', '25', '11', '45137', '8470', '0'), +('3', '25', '11', '8408', '7494', '0'), +('3', '25', '11', '8325', '7329', '0'), +('3', '25', '11', '8811', '5733', '0'), +('3', '26', '22', '10323', '0', '0'), +('3', '26', '22', '66166', '0', '0'), +('3', '26', '22', '8567', '0', '0'), +('3', '26', '22', '9246', '0', '0'), +('3', '26', '1', '14701', '4854', '0'), +('3', '26', '1', '14702', '3550', '0'), +('3', '26', '1', '10082', '2977', '0'), +('3', '26', '1', '10165', '1940', '0'), +('3', '26', '2', '4301', '7726', '0'), +('3', '26', '2', '4851', '6634', '0'), +('3', '26', '2', '4831', '6040', '0'), +('3', '26', '2', '4620', '5089', '0'), +('3', '26', '3', '71529', '3981', '0'), +('3', '26', '3', '4505', '2170', '0'), +('3', '26', '3', '21002', '2114', '0'), +('3', '26', '3', '10144', '1628', '0'), +('3', '26', '5', '14703', '7150', '0'), +('3', '26', '5', '12800', '5228', '0'), +('3', '26', '5', '14700', '4806', '0'), +('3', '26', '5', '10055', '4760', '0'), +('3', '26', '8', '11621', '26579', '0'), +('3', '26', '8', '11551', '8753', '0'), +('3', '26', '8', '1409', '7747', '0'), +('3', '26', '8', '11603', '6868', '0'), +('3', '26', '6', '1557', '8270', '0'), +('3', '26', '6', '4302', '4047', '0'), +('3', '26', '6', '25062', '3672', '0'), +('3', '26', '6', '4402', '3378', '0'), +('3', '26', '17', '4832', '13152', '0'), +('3', '26', '17', '4852', '11584', '0'), +('3', '26', '17', '4309', '8225', '0'), +('3', '26', '17', '11623', '7848', '0'), +('3', '26', '7', '4833', '6478', '0'), +('3', '26', '7', '4853', '5413', '0'), +('3', '26', '7', '4343', '4868', '0'), +('3', '26', '7', '3152', '4187', '0'), +('3', '26', '9', '4834', '4408', '0'), +('3', '26', '9', '4854', '3727', '0'), +('3', '26', '9', '12189', '3471', '0'), +('3', '26', '9', '10149', '3293', '0'), +('3', '26', '15', '10366', '8054', '0'), +('3', '26', '15', '10151', '7200', '0'), +('3', '26', '15', '14679', '7010', '0'), +('3', '26', '15', '14678', '5708', '0'), +('3', '26', '20', '2716', '24393', '0'), +('3', '26', '20', '11601', '18731', '0'), +('3', '26', '20', '2919', '11264', '0'), +('3', '26', '20', '1365', '10500', '0'), +('3', '26', '12', '4835', '10466', '0'), +('3', '26', '12', '20655', '8277', '0'), +('3', '26', '12', '4855', '5528', '0'), +('3', '26', '12', '2923', '4758', '0'), +('3', '26', '18', '4836', '6901', '0'), +('3', '26', '18', '4856', '5488', '0'), +('3', '26', '18', '3155', '4951', '0'), +('3', '26', '18', '4346', '4645', '0'), +('3', '26', '19', '4837', '7441', '0'), +('3', '26', '19', '3156', '6822', '0'), +('3', '26', '19', '4857', '5738', '0'), +('3', '26', '19', '68239', '5493', '0'), +('3', '26', '13', '11050', '22171', '0'), +('3', '26', '13', '27708', '21993', '0'), +('3', '26', '13', '5401', '21180', '0'), +('3', '26', '13', '27709', '20992', '0'), +('3', '26', '14', '11632', '29462', '0'), +('3', '26', '14', '11551', '23853', '0'), +('3', '26', '14', '9428', '20353', '0'), +('3', '26', '14', '11644', '19308', '0'), +('3', '26', '11', '45137', '8953', '0'), +('3', '26', '11', '8408', '7570', '0'), +('3', '26', '11', '8325', '7414', '0'), +('3', '26', '11', '8811', '5789', '0'), +('3', '27', '22', '10323', '0', '0'), +('3', '27', '22', '66166', '0', '0'), +('3', '27', '22', '8567', '0', '0'), +('3', '27', '22', '9246', '0', '0'), +('3', '27', '1', '14701', '4854', '0'), +('3', '27', '1', '14702', '3550', '0'), +('3', '27', '1', '10082', '2999', '0'), +('3', '27', '1', '10165', '1940', '0'), +('3', '27', '2', '4301', '7726', '0'), +('3', '27', '2', '4851', '6659', '0'), +('3', '27', '2', '4831', '6040', '0'), +('3', '27', '2', '4620', '5123', '0'), +('3', '27', '3', '71529', '4001', '0'), +('3', '27', '3', '4505', '2195', '0'), +('3', '27', '3', '21002', '2114', '0'), +('3', '27', '3', '10144', '1628', '0'), +('3', '27', '5', '14703', '7150', '0'), +('3', '27', '5', '12800', '5246', '0'), +('3', '27', '5', '14700', '4806', '0'), +('3', '27', '5', '10055', '4760', '0'), +('3', '27', '8', '11621', '26579', '0'), +('3', '27', '8', '11551', '8753', '0'), +('3', '27', '8', '1409', '7747', '0'), +('3', '27', '8', '11603', '6901', '0'), +('3', '27', '6', '1557', '8270', '0'), +('3', '27', '6', '4302', '4076', '0'), +('3', '27', '6', '25062', '3672', '0'), +('3', '27', '6', '4402', '3403', '0'), +('3', '27', '17', '4832', '13225', '0'), +('3', '27', '17', '4852', '11660', '0'), +('3', '27', '17', '4309', '8225', '0'), +('3', '27', '17', '11623', '7848', '0'), +('3', '27', '7', '4833', '6478', '0'), +('3', '27', '7', '4853', '5413', '0'), +('3', '27', '7', '4343', '4917', '0'), +('3', '27', '7', '3152', '4209', '0'), +('3', '27', '9', '4834', '4408', '0'), +('3', '27', '9', '4854', '3727', '0'), +('3', '27', '9', '12189', '3471', '0'), +('3', '27', '9', '10149', '3304', '0'), +('3', '27', '15', '10366', '8054', '0'), +('3', '27', '15', '10151', '7200', '0'), +('3', '27', '15', '14679', '7010', '0'), +('3', '27', '15', '14678', '5708', '0'), +('3', '27', '20', '2716', '24415', '0'), +('3', '27', '20', '11601', '18780', '0'), +('3', '27', '20', '2919', '11282', '0'), +('3', '27', '20', '1365', '10500', '0'), +('3', '27', '12', '4835', '10490', '0'), +('3', '27', '12', '20655', '8294', '0'), +('3', '27', '12', '4855', '5570', '0'), +('3', '27', '12', '2923', '4758', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '27', '18', '4836', '6925', '0'), +('3', '27', '18', '4856', '5488', '0'), +('3', '27', '18', '3155', '4980', '0'), +('3', '27', '18', '4346', '4645', '0'), +('3', '27', '19', '4837', '7459', '0'), +('3', '27', '19', '3156', '6822', '0'), +('3', '27', '19', '4857', '5762', '0'), +('3', '27', '19', '68239', '5504', '0'), +('3', '27', '13', '11050', '22397', '0'), +('3', '27', '13', '27708', '22269', '0'), +('3', '27', '13', '5401', '21322', '0'), +('3', '27', '13', '27709', '21244', '0'), +('3', '27', '14', '11632', '29534', '0'), +('3', '27', '14', '11551', '23853', '0'), +('3', '27', '14', '9428', '20353', '0'), +('3', '27', '14', '11644', '19308', '0'), +('3', '27', '11', '45137', '9334', '0'), +('3', '27', '11', '8408', '7645', '0'), +('3', '27', '11', '8325', '7489', '0'), +('3', '27', '11', '8811', '5856', '0'), +('3', '28', '22', '10323', '0', '0'), +('3', '28', '22', '66166', '0', '0'), +('3', '28', '22', '8567', '0', '0'), +('3', '28', '22', '9246', '0', '0'), +('3', '28', '1', '14701', '4854', '0'), +('3', '28', '1', '14702', '3550', '0'), +('3', '28', '1', '10082', '3021', '0'), +('3', '28', '1', '10165', '1940', '0'), +('3', '28', '2', '4301', '7726', '0'), +('3', '28', '2', '4851', '6684', '0'), +('3', '28', '2', '4831', '6040', '0'), +('3', '28', '2', '4620', '5161', '0'), +('3', '28', '3', '71529', '4022', '0'), +('3', '28', '3', '4505', '2220', '0'), +('3', '28', '3', '21002', '2114', '0'), +('3', '28', '3', '10144', '1628', '0'), +('3', '28', '5', '14703', '7150', '0'), +('3', '28', '5', '12800', '5264', '0'), +('3', '28', '5', '14700', '4806', '0'), +('3', '28', '5', '10055', '4760', '0'), +('3', '28', '8', '11621', '26579', '0'), +('3', '28', '8', '11551', '8753', '0'), +('3', '28', '8', '1409', '7747', '0'), +('3', '28', '8', '11603', '6933', '0'), +('3', '28', '6', '1557', '8270', '0'), +('3', '28', '6', '4302', '4108', '0'), +('3', '28', '6', '25062', '3672', '0'), +('3', '28', '6', '4402', '3428', '0'), +('3', '28', '17', '4832', '13306', '0'), +('3', '28', '17', '4852', '11742', '0'), +('3', '28', '17', '4309', '8225', '0'), +('3', '28', '17', '11623', '7848', '0'), +('3', '28', '7', '4833', '6478', '0'), +('3', '28', '7', '4853', '5413', '0'), +('3', '28', '7', '4343', '4971', '0'), +('3', '28', '7', '3152', '4231', '0'), +('3', '28', '9', '4834', '4408', '0'), +('3', '28', '9', '4854', '3727', '0'), +('3', '28', '9', '12189', '3471', '0'), +('3', '28', '9', '10149', '3314', '0'), +('3', '28', '15', '10366', '8054', '0'), +('3', '28', '15', '10151', '7200', '0'), +('3', '28', '15', '14679', '7010', '0'), +('3', '28', '15', '14678', '5708', '0'), +('3', '28', '20', '2716', '24437', '0'), +('3', '28', '20', '11601', '18834', '0'), +('3', '28', '20', '2919', '11300', '0'), +('3', '28', '20', '1365', '10500', '0'), +('3', '28', '12', '4835', '10518', '0'), +('3', '28', '12', '20655', '8312', '0'), +('3', '28', '12', '4855', '5615', '0'), +('3', '28', '12', '2923', '4758', '0'), +('3', '28', '18', '4836', '6952', '0'), +('3', '28', '18', '4856', '5488', '0'), +('3', '28', '18', '3155', '5012', '0'), +('3', '28', '18', '4346', '4645', '0'), +('3', '28', '19', '4837', '7478', '0'), +('3', '28', '19', '3156', '6822', '0'), +('3', '28', '19', '4857', '5789', '0'), +('3', '28', '19', '68239', '5515', '0'), +('3', '28', '13', '11050', '22651', '0'), +('3', '28', '13', '27708', '22550', '0'), +('3', '28', '13', '27709', '21497', '0'), +('3', '28', '13', '5401', '21492', '0'), +('3', '28', '14', '11632', '29616', '0'), +('3', '28', '14', '11551', '23853', '0'), +('3', '28', '14', '9428', '20353', '0'), +('3', '28', '14', '11644', '19308', '0'), +('3', '28', '11', '45137', '9718', '0'), +('3', '28', '11', '8408', '7721', '0'), +('3', '28', '11', '8325', '7574', '0'), +('3', '28', '11', '8811', '5922', '0'), +('3', '29', '22', '10323', '0', '0'), +('3', '29', '22', '66166', '0', '0'), +('3', '29', '22', '8567', '0', '0'), +('3', '29', '22', '9246', '0', '0'), +('3', '29', '1', '14701', '4854', '0'), +('3', '29', '1', '14702', '3550', '0'), +('3', '29', '1', '10082', '3043', '0'), +('3', '29', '1', '10165', '1940', '0'), +('3', '29', '2', '4301', '7726', '0'), +('3', '29', '2', '4851', '6710', '0'), +('3', '29', '2', '4831', '6040', '0'), +('3', '29', '2', '4620', '5194', '0'), +('3', '29', '3', '71529', '4042', '0'), +('3', '29', '3', '4505', '2246', '0'), +('3', '29', '3', '21002', '2114', '0'), +('3', '29', '3', '10144', '1628', '0'), +('3', '29', '5', '14703', '7150', '0'), +('3', '29', '5', '12800', '5282', '0'), +('3', '29', '5', '14700', '4806', '0'), +('3', '29', '5', '10055', '4760', '0'), +('3', '29', '8', '11621', '26579', '0'), +('3', '29', '8', '11551', '8753', '0'), +('3', '29', '8', '1409', '7747', '0'), +('3', '29', '8', '11603', '6966', '0'), +('3', '29', '6', '1557', '8270', '0'), +('3', '29', '6', '4302', '4137', '0'), +('3', '29', '6', '25062', '3672', '0'), +('3', '29', '6', '4402', '3454', '0'), +('3', '29', '17', '4832', '13379', '0'), +('3', '29', '17', '4852', '11818', '0'), +('3', '29', '17', '4309', '8225', '0'), +('3', '29', '17', '11623', '7848', '0'), +('3', '29', '7', '4833', '6478', '0'), +('3', '29', '7', '4853', '5413', '0'), +('3', '29', '7', '4343', '5019', '0'), +('3', '29', '7', '3152', '4253', '0'), +('3', '29', '9', '4834', '4408', '0'), +('3', '29', '9', '4854', '3727', '0'), +('3', '29', '9', '12189', '3471', '0'), +('3', '29', '9', '10149', '3325', '0'), +('3', '29', '15', '10366', '8054', '0'), +('3', '29', '15', '10151', '7200', '0'), +('3', '29', '15', '14679', '7010', '0'), +('3', '29', '15', '14678', '5708', '0'), +('3', '29', '20', '2716', '24459', '0'), +('3', '29', '20', '11601', '18882', '0'), +('3', '29', '20', '2919', '11318', '0'), +('3', '29', '20', '1365', '10500', '0'), +('3', '29', '12', '4835', '10542', '0'), +('3', '29', '12', '20655', '8329', '0'), +('3', '29', '12', '4855', '5657', '0'), +('3', '29', '12', '2923', '4758', '0'), +('3', '29', '18', '4836', '6976', '0'), +('3', '29', '18', '4856', '5488', '0'), +('3', '29', '18', '3155', '5041', '0'), +('3', '29', '18', '4346', '4645', '0'), +('3', '29', '19', '4837', '7496', '0'), +('3', '29', '19', '3156', '6822', '0'), +('3', '29', '19', '4857', '5814', '0'), +('3', '29', '19', '68239', '5525', '0'), +('3', '29', '13', '11050', '22876', '0'), +('3', '29', '13', '27708', '22854', '0'), +('3', '29', '13', '27709', '21778', '0'), +('3', '29', '13', '5401', '21633', '0'), +('3', '29', '14', '11632', '29689', '0'), +('3', '29', '14', '11551', '23853', '0'), +('3', '29', '14', '9428', '20353', '0'), +('3', '29', '14', '11644', '19308', '0'), +('3', '29', '11', '45137', '10149', '0'), +('3', '29', '11', '8408', '7796', '0'), +('3', '29', '11', '8325', '7650', '0'), +('3', '29', '11', '8811', '5978', '0'), +('3', '30', '22', '10323', '0', '0'), +('3', '30', '22', '66166', '0', '0'), +('3', '30', '22', '8567', '0', '0'), +('3', '30', '22', '9246', '0', '0'), +('3', '30', '1', '14701', '4854', '0'), +('3', '30', '1', '14702', '3550', '0'), +('3', '30', '1', '10082', '3064', '0'), +('3', '30', '1', '10165', '1940', '0'), +('3', '30', '2', '4301', '7726', '0'), +('3', '30', '2', '4851', '6735', '0'), +('3', '30', '2', '4831', '6040', '0'), +('3', '30', '2', '4620', '5232', '0'), +('3', '30', '3', '71529', '4064', '0'), +('3', '30', '3', '4505', '2271', '0'), +('3', '30', '3', '21002', '2114', '0'), +('3', '30', '3', '11052', '1631', '0'), +('3', '30', '5', '14703', '7150', '0'), +('3', '30', '5', '12800', '5300', '0'), +('3', '30', '5', '14700', '4806', '0'), +('3', '30', '5', '10055', '4760', '0'), +('3', '30', '8', '11621', '26579', '0'), +('3', '30', '8', '11551', '8753', '0'), +('3', '30', '8', '1409', '7747', '0'), +('3', '30', '8', '11603', '6998', '0'), +('3', '30', '6', '1557', '8270', '0'), +('3', '30', '6', '4302', '4170', '0'), +('3', '30', '6', '25062', '3672', '0'), +('3', '30', '6', '4402', '3479', '0'), +('3', '30', '17', '4832', '13460', '0'), +('3', '30', '17', '4852', '11899', '0'), +('3', '30', '17', '4309', '8225', '0'), +('3', '30', '17', '11623', '7848', '0'), +('3', '30', '7', '4833', '6478', '0'), +('3', '30', '7', '4853', '5413', '0'), +('3', '30', '7', '4343', '5074', '0'), +('3', '30', '7', '3152', '4274', '0'), +('3', '30', '9', '4834', '4408', '0'), +('3', '30', '9', '4854', '3727', '0'), +('3', '30', '9', '12189', '3471', '0'), +('3', '30', '9', '10149', '3336', '0'), +('3', '30', '15', '10366', '8054', '0'), +('3', '30', '15', '10151', '7200', '0'), +('3', '30', '15', '14679', '7010', '0'), +('3', '30', '15', '14678', '5708', '0'), +('3', '30', '20', '2716', '24480', '0'), +('3', '30', '20', '11601', '18937', '0'), +('3', '30', '20', '2919', '11336', '0'), +('3', '30', '20', '1365', '10500', '0'), +('3', '30', '12', '4835', '10569', '0'), +('3', '30', '12', '20655', '8347', '0'), +('3', '30', '12', '4855', '5703', '0'), +('3', '30', '12', '11624', '4789', '0'), +('3', '30', '18', '4836', '7003', '0'), +('3', '30', '18', '4856', '5488', '0'), +('3', '30', '18', '3155', '5074', '0'), +('3', '30', '18', '4346', '4645', '0'), +('3', '30', '19', '4837', '7514', '0'), +('3', '30', '19', '3156', '6822', '0'), +('3', '30', '19', '4857', '5841', '0'), +('3', '30', '19', '68239', '5536', '0'), +('3', '30', '13', '27708', '23136', '0'), +('3', '30', '13', '11050', '23102', '0'), +('3', '30', '13', '27709', '22031', '0'), +('3', '30', '13', '5401', '21775', '0'), +('3', '30', '14', '11632', '29770', '0'), +('3', '30', '14', '11551', '23853', '0'), +('3', '30', '14', '9428', '20353', '0'), +('3', '30', '14', '11644', '19308', '0'), +('3', '30', '11', '45137', '10546', '0'), +('3', '30', '11', '8408', '7872', '0'), +('3', '30', '11', '8325', '7735', '0'), +('3', '30', '11', '8811', '6044', '0'), +('3', '31', '22', '10323', '0', '0'), +('3', '31', '22', '66166', '0', '0'), +('3', '31', '22', '8567', '0', '0'), +('3', '31', '22', '9246', '0', '0'), +('3', '31', '1', '14701', '4854', '0'), +('3', '31', '1', '14702', '3550', '0'), +('3', '31', '1', '10082', '3086', '0'), +('3', '31', '1', '10165', '1940', '0'), +('3', '31', '2', '4301', '7726', '0'), +('3', '31', '2', '4851', '6760', '0'), +('3', '31', '2', '4831', '6040', '0'), +('3', '31', '2', '4620', '5271', '0'), +('3', '31', '3', '71529', '4085', '0'), +('3', '31', '3', '4505', '2296', '0'), +('3', '31', '3', '21002', '2114', '0'), +('3', '31', '3', '11052', '1685', '0'), +('3', '31', '5', '14703', '7150', '0'), +('3', '31', '5', '12800', '5318', '0'), +('3', '31', '5', '14700', '4806', '0'), +('3', '31', '5', '10055', '4760', '0'), +('3', '31', '8', '11621', '26579', '0'), +('3', '31', '8', '11551', '8753', '0'), +('3', '31', '8', '1409', '7747', '0'), +('3', '31', '8', '11603', '7031', '0'), +('3', '31', '6', '1557', '8270', '0'), +('3', '31', '6', '4302', '4203', '0'), +('3', '31', '6', '25062', '3672', '0'), +('3', '31', '6', '4402', '3504', '0'), +('3', '31', '17', '4832', '13542', '0'), +('3', '31', '17', '4852', '11981', '0'), +('3', '31', '17', '4309', '8225', '0'), +('3', '31', '17', '11623', '7848', '0'), +('3', '31', '7', '4833', '6478', '0'), +('3', '31', '7', '4853', '5413', '0'), +('3', '31', '7', '4343', '5128', '0'), +('3', '31', '7', '3152', '4296', '0'), +('3', '31', '9', '4834', '4408', '0'), +('3', '31', '9', '4854', '3727', '0'), +('3', '31', '9', '12189', '3471', '0'), +('3', '31', '9', '10149', '3347', '0'), +('3', '31', '15', '10366', '8054', '0'), +('3', '31', '15', '10151', '7200', '0'), +('3', '31', '15', '14679', '7010', '0'), +('3', '31', '15', '14678', '5708', '0'), +('3', '31', '20', '2716', '24502', '0'), +('3', '31', '20', '11601', '18991', '0'), +('3', '31', '20', '2919', '11354', '0'), +('3', '31', '20', '1365', '10500', '0'), +('3', '31', '12', '4835', '10596', '0'), +('3', '31', '12', '20655', '8365', '0'), +('3', '31', '12', '4855', '5748', '0'), +('3', '31', '12', '11624', '4827', '0'), +('3', '31', '18', '4836', '7031', '0'), +('3', '31', '18', '4856', '5488', '0'), +('3', '31', '18', '3155', '5107', '0'), +('3', '31', '18', '4346', '4645', '0'), +('3', '31', '19', '4837', '7532', '0'), +('3', '31', '19', '3156', '6822', '0'), +('3', '31', '19', '4857', '5868', '0'), +('3', '31', '19', '68239', '5547', '0'), +('3', '31', '13', '27708', '23446', '0'), +('3', '31', '13', '11050', '23327', '0'), +('3', '31', '13', '27709', '22312', '0'), +('3', '31', '13', '5401', '21917', '0'), +('3', '31', '14', '11632', '29852', '0'), +('3', '31', '14', '11551', '23853', '0'), +('3', '31', '14', '9428', '20353', '0'), +('3', '31', '14', '11644', '19308', '0'), +('3', '31', '11', '45137', '11068', '0'), +('3', '31', '11', '8408', '7948', '0'), +('3', '31', '11', '8325', '7811', '0'), +('3', '31', '11', '8811', '6101', '0'), +('3', '32', '22', '10323', '0', '0'), +('3', '32', '22', '66166', '0', '0'), +('3', '32', '22', '8567', '0', '0'), +('3', '32', '22', '9246', '0', '0'), +('3', '32', '1', '14701', '4854', '0'), +('3', '32', '1', '14702', '3550', '0'), +('3', '32', '1', '10082', '3108', '0'), +('3', '32', '1', '10165', '1940', '0'), +('3', '32', '2', '4301', '7726', '0'), +('3', '32', '2', '4851', '6786', '0'), +('3', '32', '2', '4831', '6040', '0'), +('3', '32', '2', '4620', '5304', '0'), +('3', '32', '3', '71529', '4105', '0'), +('3', '32', '3', '4505', '2322', '0'), +('3', '32', '3', '21002', '2114', '0'), +('3', '32', '3', '11052', '1740', '0'), +('3', '32', '5', '14703', '7150', '0'), +('3', '32', '5', '12800', '5336', '0'), +('3', '32', '5', '14700', '4806', '0'), +('3', '32', '5', '10055', '4760', '0'), +('3', '32', '8', '11621', '26579', '0'), +('3', '32', '8', '11551', '8753', '0'), +('3', '32', '8', '1409', '7747', '0'), +('3', '32', '8', '11603', '7064', '0'), +('3', '32', '6', '1557', '8270', '0'), +('3', '32', '6', '4302', '4232', '0'), +('3', '32', '6', '25062', '3672', '0'), +('3', '32', '6', '4402', '3530', '0'), +('3', '32', '17', '4832', '13614', '0'), +('3', '32', '17', '4852', '12057', '0'), +('3', '32', '17', '4309', '8225', '0'), +('3', '32', '17', '11623', '7848', '0'), +('3', '32', '7', '4833', '6478', '0'), +('3', '32', '7', '4853', '5413', '0'), +('3', '32', '7', '4343', '5176', '0'), +('3', '32', '7', '3152', '4318', '0'), +('3', '32', '9', '4834', '4408', '0'), +('3', '32', '9', '4854', '3727', '0'), +('3', '32', '9', '12189', '3471', '0'), +('3', '32', '9', '10149', '3358', '0'), +('3', '32', '15', '10366', '8054', '0'), +('3', '32', '15', '10151', '7200', '0'), +('3', '32', '15', '14679', '7010', '0'), +('3', '32', '15', '14678', '5708', '0'), +('3', '32', '20', '2716', '24524', '0'), +('3', '32', '20', '11601', '19039', '0'), +('3', '32', '20', '2919', '11372', '0'), +('3', '32', '20', '1365', '10500', '0'), +('3', '32', '12', '4835', '10620', '0'), +('3', '32', '12', '20655', '8382', '0'), +('3', '32', '12', '4855', '5790', '0'), +('3', '32', '12', '11624', '4861', '0'), +('3', '32', '18', '4836', '7055', '0'), +('3', '32', '18', '4856', '5488', '0'), +('3', '32', '18', '3155', '5136', '0'), +('3', '32', '18', '4346', '4645', '0'), +('3', '32', '19', '4837', '7550', '0'), +('3', '32', '19', '3156', '6822', '0'), +('3', '32', '19', '4857', '5892', '0'), +('3', '32', '19', '68239', '5558', '0'), +('3', '32', '13', '27708', '23722', '0'), +('3', '32', '13', '11050', '23581', '0'), +('3', '32', '13', '27709', '22565', '0'), +('3', '32', '13', '5401', '22058', '0'), +('3', '32', '14', '11632', '29924', '0'), +('3', '32', '14', '11551', '23853', '0'), +('3', '32', '14', '9428', '20353', '0'), +('3', '32', '14', '11644', '19308', '0'), +('3', '32', '11', '45137', '11465', '0'), +('3', '32', '11', '8408', '8023', '0'), +('3', '32', '11', '8325', '7886', '0'), +('3', '32', '11', '8811', '6167', '0'), +('3', '33', '22', '10323', '0', '0'), +('3', '33', '22', '66166', '0', '0'), +('3', '33', '22', '8567', '0', '0'), +('3', '33', '22', '9246', '0', '0'), +('3', '33', '1', '14701', '4854', '0'), +('3', '33', '1', '14702', '3550', '0'), +('3', '33', '1', '10082', '3130', '0'), +('3', '33', '1', '10165', '1940', '0'), +('3', '33', '2', '4301', '7726', '0'), +('3', '33', '2', '4851', '6811', '0'), +('3', '33', '2', '4831', '6040', '0'), +('3', '33', '2', '4620', '5342', '0'), +('3', '33', '3', '71529', '4126', '0'), +('3', '33', '3', '4505', '2347', '0'), +('3', '33', '3', '21002', '2114', '0'), +('3', '33', '3', '11052', '1794', '0'), +('3', '33', '5', '14703', '7150', '0'), +('3', '33', '5', '12800', '5354', '0'), +('3', '33', '5', '14700', '4806', '0'), +('3', '33', '5', '10055', '4760', '0'), +('3', '33', '8', '11621', '26579', '0'), +('3', '33', '8', '11551', '8753', '0'), +('3', '33', '8', '1409', '7747', '0'), +('3', '33', '8', '11603', '7096', '0'), +('3', '33', '6', '1557', '8270', '0'), +('3', '33', '6', '4302', '4264', '0'), +('3', '33', '6', '25062', '3672', '0'), +('3', '33', '6', '4402', '3555', '0'), +('3', '33', '17', '4832', '13696', '0'), +('3', '33', '17', '4852', '12139', '0'), +('3', '33', '17', '4309', '8225', '0'), +('3', '33', '17', '11623', '7848', '0'), +('3', '33', '7', '4833', '6478', '0'), +('3', '33', '7', '4853', '5413', '0'), +('3', '33', '7', '4343', '5231', '0'), +('3', '33', '7', '3152', '4340', '0'), +('3', '33', '9', '4834', '4408', '0'), +('3', '33', '9', '4854', '3727', '0'), +('3', '33', '9', '12189', '3471', '0'), +('3', '33', '9', '10149', '3369', '0'), +('3', '33', '15', '10366', '8054', '0'), +('3', '33', '15', '10151', '7200', '0'), +('3', '33', '15', '14679', '7010', '0'), +('3', '33', '15', '14678', '5708', '0'), +('3', '33', '20', '2716', '24546', '0'), +('3', '33', '20', '11601', '19094', '0'), +('3', '33', '20', '2919', '11390', '0'), +('3', '33', '20', '1365', '10500', '0'), +('3', '33', '12', '4835', '10647', '0'), +('3', '33', '12', '20655', '8400', '0'), +('3', '33', '12', '4855', '5836', '0'), +('3', '33', '12', '11624', '4899', '0'), +('3', '33', '18', '4836', '7082', '0'), +('3', '33', '18', '4856', '5488', '0'), +('3', '33', '18', '3155', '5168', '0'), +('3', '33', '18', '4346', '4645', '0'), +('3', '33', '19', '4837', '7568', '0'), +('3', '33', '19', '3156', '6822', '0'), +('3', '33', '19', '4857', '5919', '0'), +('3', '33', '19', '68239', '5569', '0'), +('3', '33', '13', '27708', '24032', '0'), +('3', '33', '13', '11050', '23807', '0'), +('3', '33', '13', '27709', '22846', '0'), +('3', '33', '13', '5401', '22200', '0'), +('3', '33', '14', '11632', '30006', '0'), +('3', '33', '14', '11551', '23853', '0'), +('3', '33', '14', '9428', '20353', '0'), +('3', '33', '14', '11644', '19308', '0'), +('3', '33', '11', '45137', '11924', '0'), +('3', '33', '11', '8408', '8108', '0'), +('3', '33', '11', '8325', '7971', '0'), +('3', '33', '11', '8811', '6233', '0'), +('3', '34', '22', '10323', '0', '0'), +('3', '34', '22', '66166', '0', '0'), +('3', '34', '22', '8567', '0', '0'), +('3', '34', '22', '9246', '0', '0'), +('3', '34', '1', '14701', '4854', '0'), +('3', '34', '1', '14702', '3550', '0'), +('3', '34', '1', '10082', '3151', '0'), +('3', '34', '1', '10165', '1940', '0'), +('3', '34', '2', '4301', '7726', '0'), +('3', '34', '2', '4851', '6837', '0'), +('3', '34', '2', '4831', '6040', '0'), +('3', '34', '2', '4620', '5380', '0'), +('3', '34', '3', '71529', '4148', '0'), +('3', '34', '3', '4505', '2373', '0'), +('3', '34', '3', '21002', '2114', '0'), +('3', '34', '3', '11052', '1848', '0'), +('3', '34', '5', '14703', '7150', '0'), +('3', '34', '5', '12800', '5373', '0'), +('3', '34', '5', '14700', '4806', '0'), +('3', '34', '5', '10055', '4760', '0'), +('3', '34', '8', '11621', '26579', '0'), +('3', '34', '8', '11551', '8753', '0'), +('3', '34', '8', '1409', '7747', '0'), +('3', '34', '8', '11603', '7129', '0'), +('3', '34', '6', '1557', '8270', '0'), +('3', '34', '6', '4302', '4297', '0'), +('3', '34', '6', '25062', '3672', '0'), +('3', '34', '6', '4402', '3581', '0'), +('3', '34', '17', '4832', '13777', '0'), +('3', '34', '17', '4852', '12220', '0'), +('3', '34', '17', '4309', '8225', '0'), +('3', '34', '17', '11623', '7848', '0'), +('3', '34', '7', '4833', '6478', '0'), +('3', '34', '7', '4853', '5413', '0'), +('3', '34', '7', '4343', '5285', '0'), +('3', '34', '7', '3152', '4361', '0'), +('3', '34', '9', '4834', '4408', '0'), +('3', '34', '9', '4854', '3727', '0'), +('3', '34', '9', '12189', '3471', '0'), +('3', '34', '9', '10149', '3380', '0'), +('3', '34', '15', '10366', '8054', '0'), +('3', '34', '15', '10151', '7200', '0'), +('3', '34', '15', '14679', '7010', '0'), +('3', '34', '15', '14678', '5708', '0'), +('3', '34', '20', '2716', '24567', '0'), +('3', '34', '20', '11601', '19148', '0'), +('3', '34', '20', '2919', '11409', '0'), +('3', '34', '20', '1365', '10500', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '34', '12', '4835', '10675', '0'), +('3', '34', '12', '20655', '8418', '0'), +('3', '34', '12', '4855', '5881', '0'), +('3', '34', '12', '11624', '4937', '0'), +('3', '34', '18', '4836', '7109', '0'), +('3', '34', '18', '4856', '5488', '0'), +('3', '34', '18', '3155', '5201', '0'), +('3', '34', '18', '4346', '4645', '0'), +('3', '34', '19', '4837', '7586', '0'), +('3', '34', '19', '3156', '6822', '0'), +('3', '34', '19', '4857', '5946', '0'), +('3', '34', '19', '68239', '5580', '0'), +('3', '34', '13', '27708', '24313', '0'), +('3', '34', '13', '11050', '24032', '0'), +('3', '34', '13', '27709', '23098', '0'), +('3', '34', '13', '5401', '22342', '0'), +('3', '34', '14', '11632', '30087', '0'), +('3', '34', '14', '11551', '23853', '0'), +('3', '34', '14', '9428', '20353', '0'), +('3', '34', '14', '11644', '19308', '0'), +('3', '34', '11', '45137', '12337', '0'), +('3', '34', '11', '8408', '8184', '0'), +('3', '34', '11', '8325', '8047', '0'), +('3', '34', '11', '8811', '6290', '0'), +('3', '35', '22', '10323', '0', '0'), +('3', '35', '22', '66166', '0', '0'), +('3', '35', '22', '8567', '0', '0'), +('3', '35', '22', '9246', '0', '0'), +('3', '35', '1', '14701', '4854', '0'), +('3', '35', '1', '14702', '3550', '0'), +('3', '35', '1', '10082', '3173', '0'), +('3', '35', '1', '10165', '1940', '0'), +('3', '35', '2', '4301', '7726', '0'), +('3', '35', '2', '4851', '6862', '0'), +('3', '35', '2', '4831', '6040', '0'), +('3', '35', '2', '4620', '5418', '0'), +('3', '35', '3', '71529', '4170', '0'), +('3', '35', '3', '4505', '2398', '0'), +('3', '35', '3', '21002', '2114', '0'), +('3', '35', '3', '11052', '1903', '0'), +('3', '35', '5', '14703', '7150', '0'), +('3', '35', '5', '12800', '5391', '0'), +('3', '35', '5', '14700', '4806', '0'), +('3', '35', '5', '10055', '4760', '0'), +('3', '35', '8', '11621', '26579', '0'), +('3', '35', '8', '11551', '8753', '0'), +('3', '35', '8', '1409', '7747', '0'), +('3', '35', '8', '11603', '7162', '0'), +('3', '35', '6', '1557', '8270', '0'), +('3', '35', '6', '4302', '4329', '0'), +('3', '35', '6', '25062', '3672', '0'), +('3', '35', '6', '4402', '3606', '0'), +('3', '35', '17', '4832', '13859', '0'), +('3', '35', '17', '4852', '12302', '0'), +('3', '35', '17', '4309', '8225', '0'), +('3', '35', '17', '11623', '7848', '0'), +('3', '35', '7', '4833', '6478', '0'), +('3', '35', '7', '4853', '5413', '0'), +('3', '35', '7', '4343', '5339', '0'), +('3', '35', '7', '3152', '4383', '0'), +('3', '35', '9', '4834', '4408', '0'), +('3', '35', '9', '4854', '3727', '0'), +('3', '35', '9', '12189', '3471', '0'), +('3', '35', '9', '10149', '3391', '0'), +('3', '35', '15', '10366', '8054', '0'), +('3', '35', '15', '10151', '7200', '0'), +('3', '35', '15', '14679', '7010', '0'), +('3', '35', '15', '14678', '5708', '0'), +('3', '35', '20', '2716', '24589', '0'), +('3', '35', '20', '11601', '19203', '0'), +('3', '35', '20', '2919', '11427', '0'), +('3', '35', '20', '1365', '10500', '0'), +('3', '35', '12', '4835', '10702', '0'), +('3', '35', '12', '20655', '8436', '0'), +('3', '35', '12', '4855', '5926', '0'), +('3', '35', '12', '11624', '4975', '0'), +('3', '35', '18', '4836', '7136', '0'), +('3', '35', '18', '4856', '5488', '0'), +('3', '35', '18', '3155', '5233', '0'), +('3', '35', '18', '4346', '4645', '0'), +('3', '35', '19', '4837', '7604', '0'), +('3', '35', '19', '3156', '6822', '0'), +('3', '35', '19', '4857', '5974', '0'), +('3', '35', '19', '68239', '5591', '0'), +('3', '35', '13', '27708', '24624', '0'), +('3', '35', '13', '11050', '24286', '0'), +('3', '35', '13', '27709', '23379', '0'), +('3', '35', '13', '5401', '22483', '0'), +('3', '35', '14', '11632', '30169', '0'), +('3', '35', '14', '11551', '23853', '0'), +('3', '35', '14', '9428', '20353', '0'), +('3', '35', '14', '11644', '19308', '0'), +('3', '35', '11', '45137', '12884', '0'), +('3', '35', '11', '8408', '8259', '0'), +('3', '35', '11', '8325', '8132', '0'), +('3', '35', '11', '8811', '6356', '0'), +('3', '36', '22', '10323', '0', '0'), +('3', '36', '22', '66166', '0', '0'), +('3', '36', '22', '8567', '0', '0'), +('3', '36', '22', '9246', '0', '0'), +('3', '36', '1', '14701', '4854', '0'), +('3', '36', '1', '14702', '3550', '0'), +('3', '36', '1', '10082', '3195', '0'), +('3', '36', '1', '10165', '1940', '0'), +('3', '36', '2', '4301', '7726', '0'), +('3', '36', '2', '4851', '6887', '0'), +('3', '36', '2', '4831', '6040', '0'), +('3', '36', '2', '4620', '5457', '0'), +('3', '36', '3', '71529', '4192', '0'), +('3', '36', '3', '4505', '2423', '0'), +('3', '36', '3', '21002', '2114', '0'), +('3', '36', '3', '11052', '1957', '0'), +('3', '36', '5', '14703', '7150', '0'), +('3', '36', '5', '12800', '5409', '0'), +('3', '36', '5', '14700', '4806', '0'), +('3', '36', '5', '10055', '4760', '0'), +('3', '36', '8', '11621', '26579', '0'), +('3', '36', '8', '11551', '8753', '0'), +('3', '36', '8', '1409', '7747', '0'), +('3', '36', '8', '11603', '7194', '0'), +('3', '36', '6', '1557', '8270', '0'), +('3', '36', '6', '4302', '4362', '0'), +('3', '36', '6', '25062', '3672', '0'), +('3', '36', '6', '4402', '3631', '0'), +('3', '36', '17', '4832', '13940', '0'), +('3', '36', '17', '4852', '12383', '0'), +('3', '36', '17', '4309', '8225', '0'), +('3', '36', '17', '11623', '7848', '0'), +('3', '36', '7', '4833', '6478', '0'), +('3', '36', '7', '4853', '5413', '0'), +('3', '36', '7', '4343', '5394', '0'), +('3', '36', '7', '3152', '4405', '0'), +('3', '36', '9', '4834', '4408', '0'), +('3', '36', '9', '4854', '3727', '0'), +('3', '36', '9', '12189', '3471', '0'), +('3', '36', '9', '10149', '3401', '0'), +('3', '36', '15', '10366', '8054', '0'), +('3', '36', '15', '10151', '7200', '0'), +('3', '36', '15', '14679', '7010', '0'), +('3', '36', '15', '14678', '5708', '0'), +('3', '36', '20', '2716', '24611', '0'), +('3', '36', '20', '11601', '19257', '0'), +('3', '36', '20', '2919', '11445', '0'), +('3', '36', '20', '1365', '10500', '0'), +('3', '36', '12', '4835', '10729', '0'), +('3', '36', '12', '20655', '8454', '0'), +('3', '36', '12', '4855', '5972', '0'), +('3', '36', '12', '11624', '5013', '0'), +('3', '36', '18', '4836', '7163', '0'), +('3', '36', '18', '4856', '5488', '0'), +('3', '36', '18', '3155', '5266', '0'), +('3', '36', '18', '4346', '4645', '0'), +('3', '36', '19', '4837', '7623', '0'), +('3', '36', '19', '3156', '6822', '0'), +('3', '36', '19', '4857', '6001', '0'), +('3', '36', '19', '68239', '5602', '0'), +('3', '36', '13', '27708', '24905', '0'), +('3', '36', '13', '11050', '24512', '0'), +('3', '36', '13', '27709', '23632', '0'), +('3', '36', '13', '11682', '22695', '0'), +('3', '36', '14', '11632', '30250', '0'), +('3', '36', '14', '11551', '23853', '0'), +('3', '36', '14', '9428', '20353', '0'), +('3', '36', '14', '11644', '19308', '0'), +('3', '36', '11', '45137', '13320', '0'), +('3', '36', '11', '8408', '8335', '0'), +('3', '36', '11', '8325', '8207', '0'), +('3', '36', '11', '8811', '6422', '0'), +('3', '37', '22', '10323', '0', '0'), +('3', '37', '22', '66166', '0', '0'), +('3', '37', '22', '8567', '0', '0'), +('3', '37', '22', '9246', '0', '0'), +('3', '37', '1', '14701', '4854', '0'), +('3', '37', '1', '14702', '3550', '0'), +('3', '37', '1', '10082', '3217', '0'), +('3', '37', '1', '10165', '1940', '0'), +('3', '37', '2', '4301', '7726', '0'), +('3', '37', '2', '4851', '6913', '0'), +('3', '37', '2', '4831', '6040', '0'), +('3', '37', '2', '4620', '5495', '0'), +('3', '37', '3', '71529', '4213', '0'), +('3', '37', '3', '4505', '2449', '0'), +('3', '37', '3', '21002', '2114', '0'), +('3', '37', '3', '11052', '2011', '0'), +('3', '37', '5', '14703', '7150', '0'), +('3', '37', '5', '12800', '5427', '0'), +('3', '37', '5', '14700', '4806', '0'), +('3', '37', '5', '10055', '4760', '0'), +('3', '37', '8', '11621', '26579', '0'), +('3', '37', '8', '11551', '8753', '0'), +('3', '37', '8', '1409', '7747', '0'), +('3', '37', '8', '11603', '7227', '0'), +('3', '37', '6', '1557', '8270', '0'), +('3', '37', '6', '4302', '4395', '0'), +('3', '37', '6', '25062', '3672', '0'), +('3', '37', '6', '4402', '3657', '0'), +('3', '37', '17', '4832', '14022', '0'), +('3', '37', '17', '4852', '12465', '0'), +('3', '37', '17', '4309', '8225', '0'), +('3', '37', '17', '11623', '7848', '0'), +('3', '37', '7', '4833', '6478', '0'), +('3', '37', '7', '4343', '5448', '0'), +('3', '37', '7', '4853', '5413', '0'), +('3', '37', '7', '3152', '4427', '0'), +('3', '37', '9', '4834', '4408', '0'), +('3', '37', '9', '4854', '3727', '0'), +('3', '37', '9', '12189', '3471', '0'), +('3', '37', '9', '10149', '3412', '0'), +('3', '37', '15', '10366', '8054', '0'), +('3', '37', '15', '10151', '7200', '0'), +('3', '37', '15', '14679', '7010', '0'), +('3', '37', '15', '14678', '5708', '0'), +('3', '37', '20', '2716', '24633', '0'), +('3', '37', '20', '11601', '19311', '0'), +('3', '37', '20', '2919', '11463', '0'), +('3', '37', '20', '1365', '10500', '0'), +('3', '37', '12', '4835', '10756', '0'), +('3', '37', '12', '20655', '8473', '0'), +('3', '37', '12', '4855', '6017', '0'), +('3', '37', '12', '11624', '5051', '0'), +('3', '37', '18', '4836', '7191', '0'), +('3', '37', '18', '4856', '5488', '0'), +('3', '37', '18', '3155', '5299', '0'), +('3', '37', '18', '4346', '4645', '0'), +('3', '37', '19', '4837', '7641', '0'), +('3', '37', '19', '3156', '6822', '0'), +('3', '37', '19', '4857', '6028', '0'), +('3', '37', '19', '68239', '5612', '0'), +('3', '37', '13', '27708', '25215', '0'), +('3', '37', '13', '11050', '24737', '0'), +('3', '37', '13', '27709', '23913', '0'), +('3', '37', '13', '11682', '22922', '0'), +('3', '37', '14', '11632', '30332', '0'), +('3', '37', '14', '11551', '23853', '0'), +('3', '37', '14', '9428', '20353', '0'), +('3', '37', '14', '11644', '19308', '0'), +('3', '37', '11', '45137', '13795', '0'), +('3', '37', '11', '8408', '8410', '0'), +('3', '37', '11', '8325', '8292', '0'), +('3', '37', '11', '8811', '6479', '0'), +('3', '38', '22', '10323', '0', '0'), +('3', '38', '22', '66166', '0', '0'), +('3', '38', '22', '8567', '0', '0'), +('3', '38', '22', '9246', '0', '0'), +('3', '38', '1', '14701', '4854', '0'), +('3', '38', '1', '14702', '3550', '0'), +('3', '38', '1', '10082', '3238', '0'), +('3', '38', '1', '10165', '1940', '0'), +('3', '38', '2', '4301', '7726', '0'), +('3', '38', '2', '4851', '6938', '0'), +('3', '38', '2', '4831', '6040', '0'), +('3', '38', '2', '4620', '5533', '0'), +('3', '38', '3', '71529', '4235', '0'), +('3', '38', '3', '4505', '2474', '0'), +('3', '38', '3', '21002', '2114', '0'), +('3', '38', '3', '11052', '2066', '0'), +('3', '38', '5', '14703', '7150', '0'), +('3', '38', '5', '12800', '5445', '0'), +('3', '38', '5', '14700', '4806', '0'), +('3', '38', '5', '10055', '4760', '0'), +('3', '38', '8', '11621', '26579', '0'), +('3', '38', '8', '11551', '8753', '0'), +('3', '38', '8', '1409', '7747', '0'), +('3', '38', '8', '11603', '7259', '0'), +('3', '38', '6', '1557', '8270', '0'), +('3', '38', '6', '4302', '4427', '0'), +('3', '38', '6', '4402', '3682', '0'), +('3', '38', '6', '25062', '3672', '0'), +('3', '38', '17', '4832', '14103', '0'), +('3', '38', '17', '4852', '12546', '0'), +('3', '38', '17', '4309', '8225', '0'), +('3', '38', '17', '11623', '7848', '0'), +('3', '38', '7', '4833', '6478', '0'), +('3', '38', '7', '4343', '5502', '0'), +('3', '38', '7', '4853', '5413', '0'), +('3', '38', '7', '3152', '4448', '0'), +('3', '38', '9', '4834', '4408', '0'), +('3', '38', '9', '4854', '3727', '0'), +('3', '38', '9', '12189', '3471', '0'), +('3', '38', '9', '10149', '3423', '0'), +('3', '38', '15', '10366', '8054', '0'), +('3', '38', '15', '10151', '7200', '0'), +('3', '38', '15', '14679', '7010', '0'), +('3', '38', '15', '14678', '5708', '0'), +('3', '38', '20', '2716', '24654', '0'), +('3', '38', '20', '11601', '19366', '0'), +('3', '38', '20', '2919', '11481', '0'), +('3', '38', '20', '1365', '10500', '0'), +('3', '38', '12', '4835', '10783', '0'), +('3', '38', '12', '20655', '8491', '0'), +('3', '38', '12', '4855', '6062', '0'), +('3', '38', '12', '11624', '5089', '0'), +('3', '38', '18', '4836', '7218', '0'), +('3', '38', '18', '4856', '5488', '0'), +('3', '38', '18', '3155', '5331', '0'), +('3', '38', '18', '4346', '4645', '0'), +('3', '38', '19', '4837', '7659', '0'), +('3', '38', '19', '3156', '6822', '0'), +('3', '38', '19', '4857', '6055', '0'), +('3', '38', '19', '68239', '5623', '0'), +('3', '38', '13', '27708', '25497', '0'), +('3', '38', '13', '11050', '24991', '0'), +('3', '38', '13', '27709', '24166', '0'), +('3', '38', '13', '11682', '23148', '0'), +('3', '38', '14', '11632', '30413', '0'), +('3', '38', '14', '11551', '23853', '0'), +('3', '38', '14', '9428', '20353', '0'), +('3', '38', '14', '11644', '19308', '0'), +('3', '38', '11', '45137', '14234', '0'), +('3', '38', '11', '8408', '8486', '0'), +('3', '38', '11', '8325', '8368', '0'), +('3', '38', '11', '8811', '6545', '0'), +('3', '39', '22', '10323', '0', '0'), +('3', '39', '22', '66166', '0', '0'), +('3', '39', '22', '8567', '0', '0'), +('3', '39', '22', '9246', '0', '0'), +('3', '39', '1', '14701', '4854', '0'), +('3', '39', '1', '14702', '3550', '0'), +('3', '39', '1', '10082', '3260', '0'), +('3', '39', '1', '10165', '1940', '0'), +('3', '39', '2', '4301', '7726', '0'), +('3', '39', '2', '4851', '6963', '0'), +('3', '39', '2', '4831', '6040', '0'), +('3', '39', '2', '4620', '5571', '0'), +('3', '39', '3', '71529', '4257', '0'), +('3', '39', '3', '4505', '2499', '0'), +('3', '39', '3', '11052', '2120', '0'), +('3', '39', '3', '21002', '2114', '0'), +('3', '39', '5', '14703', '7150', '0'), +('3', '39', '5', '12800', '5463', '0'), +('3', '39', '5', '14700', '4806', '0'), +('3', '39', '5', '10055', '4760', '0'), +('3', '39', '8', '11621', '26579', '0'), +('3', '39', '8', '11551', '8753', '0'), +('3', '39', '8', '1409', '7747', '0'), +('3', '39', '8', '11603', '7292', '0'), +('3', '39', '6', '1557', '8270', '0'), +('3', '39', '6', '4302', '4460', '0'), +('3', '39', '6', '4402', '3707', '0'), +('3', '39', '6', '25062', '3672', '0'), +('3', '39', '17', '4832', '14185', '0'), +('3', '39', '17', '4852', '12628', '0'), +('3', '39', '17', '4309', '8225', '0'), +('3', '39', '17', '11623', '7848', '0'), +('3', '39', '7', '4833', '6478', '0'), +('3', '39', '7', '4343', '5557', '0'), +('3', '39', '7', '4853', '5413', '0'), +('3', '39', '7', '3152', '4470', '0'), +('3', '39', '9', '4834', '4408', '0'), +('3', '39', '9', '4854', '3727', '0'), +('3', '39', '9', '12189', '3471', '0'), +('3', '39', '9', '10149', '3434', '0'), +('3', '39', '15', '10366', '8054', '0'), +('3', '39', '15', '10151', '7200', '0'), +('3', '39', '15', '14679', '7010', '0'), +('3', '39', '15', '14678', '5708', '0'), +('3', '39', '20', '2716', '24676', '0'), +('3', '39', '20', '11601', '19420', '0'), +('3', '39', '20', '2919', '11499', '0'), +('3', '39', '20', '1365', '10500', '0'), +('3', '39', '12', '4835', '10810', '0'), +('3', '39', '12', '20655', '8509', '0'), +('3', '39', '12', '4855', '6107', '0'), +('3', '39', '12', '11624', '5127', '0'), +('3', '39', '18', '4836', '7245', '0'), +('3', '39', '18', '4856', '5488', '0'), +('3', '39', '18', '3155', '5364', '0'), +('3', '39', '18', '4346', '4645', '0'), +('3', '39', '19', '4837', '7677', '0'), +('3', '39', '19', '3156', '6822', '0'), +('3', '39', '19', '4857', '6082', '0'), +('3', '39', '19', '68239', '5634', '0'), +('3', '39', '13', '27708', '25807', '0'), +('3', '39', '13', '11050', '25216', '0'), +('3', '39', '13', '27709', '24447', '0'), +('3', '39', '13', '11682', '23347', '0'), +('3', '39', '14', '11632', '30495', '0'), +('3', '39', '14', '11551', '23853', '0'), +('3', '39', '14', '9428', '20353', '0'), +('3', '39', '14', '11644', '19308', '0'), +('3', '39', '11', '45137', '14806', '0'), +('3', '39', '11', '8408', '8561', '0'), +('3', '39', '11', '8325', '8453', '0'), +('3', '39', '11', '8811', '6602', '0'), +('3', '40', '22', '10323', '0', '0'), +('3', '40', '22', '66166', '0', '0'), +('3', '40', '22', '8567', '0', '0'), +('3', '40', '22', '9246', '0', '0'), +('3', '40', '1', '14701', '4854', '0'), +('3', '40', '1', '14702', '3550', '0'), +('3', '40', '1', '10082', '3282', '0'), +('3', '40', '1', '10165', '1940', '0'), +('3', '40', '2', '4301', '7726', '0'), +('3', '40', '2', '4851', '6989', '0'), +('3', '40', '2', '4831', '6040', '0'), +('3', '40', '2', '4620', '5609', '0'), +('3', '40', '3', '71529', '4279', '0'), +('3', '40', '3', '4505', '2525', '0'), +('3', '40', '3', '11052', '2174', '0'), +('3', '40', '3', '21002', '2114', '0'), +('3', '40', '5', '14703', '7150', '0'), +('3', '40', '5', '12800', '5481', '0'), +('3', '40', '5', '14700', '4806', '0'), +('3', '40', '5', '10055', '4760', '0'), +('3', '40', '8', '11621', '26579', '0'), +('3', '40', '8', '11551', '8753', '0'), +('3', '40', '8', '1409', '7747', '0'), +('3', '40', '8', '11603', '7325', '0'), +('3', '40', '6', '1557', '8270', '0'), +('3', '40', '6', '4302', '4493', '0'), +('3', '40', '6', '4402', '3733', '0'), +('3', '40', '6', '25062', '3672', '0'), +('3', '40', '17', '4832', '14266', '0'), +('3', '40', '17', '4852', '12709', '0'), +('3', '40', '17', '4309', '8225', '0'), +('3', '40', '17', '11623', '7848', '0'), +('3', '40', '7', '4833', '6478', '0'), +('3', '40', '7', '4343', '5611', '0'), +('3', '40', '7', '4853', '5413', '0'), +('3', '40', '7', '3152', '4492', '0'), +('3', '40', '9', '4834', '4408', '0'), +('3', '40', '9', '4854', '3727', '0'), +('3', '40', '9', '12189', '3471', '0'), +('3', '40', '9', '10149', '3445', '0'), +('3', '40', '15', '10366', '8054', '0'), +('3', '40', '15', '10151', '7200', '0'), +('3', '40', '15', '14679', '7010', '0'), +('3', '40', '15', '14678', '5708', '0'), +('3', '40', '20', '2716', '24698', '0'), +('3', '40', '20', '11601', '19474', '0'), +('3', '40', '20', '2919', '11517', '0'), +('3', '40', '20', '1365', '10500', '0'), +('3', '40', '12', '4835', '10838', '0'), +('3', '40', '12', '20655', '8527', '0'), +('3', '40', '12', '4855', '6153', '0'), +('3', '40', '12', '11624', '5165', '0'), +('3', '40', '18', '4836', '7272', '0'), +('3', '40', '18', '4856', '5488', '0'), +('3', '40', '18', '3155', '5397', '0'), +('3', '40', '18', '4346', '4645', '0'), +('3', '40', '19', '4837', '7695', '0'), +('3', '40', '19', '3156', '6822', '0'), +('3', '40', '19', '4857', '6109', '0'), +('3', '40', '19', '68239', '5645', '0'), +('3', '40', '13', '27708', '26089', '0'), +('3', '40', '13', '11050', '25442', '0'), +('3', '40', '13', '27709', '24699', '0'), +('3', '40', '13', '11682', '23573', '0'), +('3', '40', '14', '11632', '30576', '0'), +('3', '40', '14', '11551', '23853', '0'), +('3', '40', '14', '9428', '20353', '0'), +('3', '40', '14', '11644', '19308', '0'), +('3', '40', '11', '45137', '15258', '0'), +('3', '40', '11', '8408', '8637', '0'), +('3', '40', '11', '8325', '8528', '0'), +('3', '40', '11', '8811', '6668', '0'), +('3', '41', '22', '10323', '0', '0'), +('3', '41', '22', '66166', '0', '0'), +('3', '41', '22', '8567', '0', '0'), +('3', '41', '22', '9246', '0', '0'), +('3', '41', '1', '14701', '4854', '0'), +('3', '41', '1', '14702', '3550', '0'), +('3', '41', '1', '10082', '3304', '0'), +('3', '41', '1', '10165', '1940', '0'), +('3', '41', '2', '4301', '7726', '0'), +('3', '41', '2', '4851', '7014', '0'), +('3', '41', '2', '4831', '6040', '0'), +('3', '41', '2', '4620', '5647', '0'), +('3', '41', '3', '71529', '4300', '0'), +('3', '41', '3', '4505', '2550', '0'), +('3', '41', '3', '11052', '2229', '0'), +('3', '41', '3', '21002', '2114', '0'), +('3', '41', '5', '14703', '7150', '0'), +('3', '41', '5', '12800', '5499', '0'), +('3', '41', '5', '14700', '4806', '0'), +('3', '41', '5', '10055', '4760', '0'), +('3', '41', '8', '11621', '26579', '0'), +('3', '41', '8', '11551', '8753', '0'), +('3', '41', '8', '1409', '7747', '0'), +('3', '41', '8', '11603', '7357', '0'), +('3', '41', '6', '1557', '8270', '0'), +('3', '41', '6', '4302', '4525', '0'), +('3', '41', '6', '4402', '3758', '0'), +('3', '41', '6', '25062', '3672', '0'), +('3', '41', '17', '4832', '14348', '0'), +('3', '41', '17', '4852', '12791', '0'), +('3', '41', '17', '4309', '8225', '0'), +('3', '41', '17', '11623', '7848', '0'), +('3', '41', '7', '4833', '6478', '0'), +('3', '41', '7', '4343', '5666', '0'), +('3', '41', '7', '4853', '5413', '0'), +('3', '41', '7', '3152', '4514', '0'), +('3', '41', '9', '4834', '4408', '0'), +('3', '41', '9', '4854', '3727', '0'), +('3', '41', '9', '12189', '3471', '0'), +('3', '41', '9', '10149', '3456', '0'), +('3', '41', '15', '10366', '8054', '0'), +('3', '41', '15', '10151', '7200', '0'), +('3', '41', '15', '14679', '7010', '0'), +('3', '41', '15', '14678', '5708', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '41', '20', '2716', '24720', '0'), +('3', '41', '20', '11601', '19529', '0'), +('3', '41', '20', '2919', '11535', '0'), +('3', '41', '20', '1365', '10500', '0'), +('3', '41', '12', '4835', '10865', '0'), +('3', '41', '12', '20655', '8545', '0'), +('3', '41', '12', '4855', '6198', '0'), +('3', '41', '12', '11624', '5203', '0'), +('3', '41', '18', '4836', '7299', '0'), +('3', '41', '18', '4856', '5488', '0'), +('3', '41', '18', '3155', '5429', '0'), +('3', '41', '18', '4346', '4645', '0'), +('3', '41', '19', '4837', '7713', '0'), +('3', '41', '19', '3156', '6822', '0'), +('3', '41', '19', '4857', '6137', '0'), +('3', '41', '19', '68239', '5656', '0'), +('3', '41', '13', '27708', '26370', '0'), +('3', '41', '13', '11050', '25667', '0'), +('3', '41', '13', '27709', '24952', '0'), +('3', '41', '13', '11682', '23800', '0'), +('3', '41', '14', '11632', '30658', '0'), +('3', '41', '14', '11551', '23853', '0'), +('3', '41', '14', '9428', '20353', '0'), +('3', '41', '14', '11644', '19308', '0'), +('3', '41', '11', '45137', '15806', '0'), +('3', '41', '11', '8408', '8713', '0'), +('3', '41', '11', '8325', '8613', '0'), +('3', '41', '11', '8811', '6734', '0'), +('3', '42', '22', '10323', '0', '0'), +('3', '42', '22', '66166', '0', '0'), +('3', '42', '22', '8567', '0', '0'), +('3', '42', '22', '9246', '0', '0'), +('3', '42', '1', '14701', '4854', '0'), +('3', '42', '1', '14702', '3550', '0'), +('3', '42', '1', '10082', '3325', '0'), +('3', '42', '1', '10165', '1940', '0'), +('3', '42', '2', '4301', '7726', '0'), +('3', '42', '2', '4851', '7039', '0'), +('3', '42', '2', '4831', '6040', '0'), +('3', '42', '2', '4620', '5685', '0'), +('3', '42', '3', '71529', '4322', '0'), +('3', '42', '3', '4505', '2575', '0'), +('3', '42', '3', '11052', '2283', '0'), +('3', '42', '3', '21002', '2114', '0'), +('3', '42', '5', '14703', '7150', '0'), +('3', '42', '5', '12800', '5518', '0'), +('3', '42', '5', '14700', '4806', '0'), +('3', '42', '5', '10055', '4760', '0'), +('3', '42', '8', '11621', '26579', '0'), +('3', '42', '8', '11551', '8753', '0'), +('3', '42', '8', '1409', '7747', '0'), +('3', '42', '8', '11603', '7390', '0'), +('3', '42', '6', '1557', '8270', '0'), +('3', '42', '6', '4302', '4558', '0'), +('3', '42', '6', '4402', '3783', '0'), +('3', '42', '6', '25062', '3672', '0'), +('3', '42', '17', '4832', '14430', '0'), +('3', '42', '17', '4852', '12872', '0'), +('3', '42', '17', '4309', '8225', '0'), +('3', '42', '17', '11623', '7848', '0'), +('3', '42', '7', '4833', '6478', '0'), +('3', '42', '7', '4343', '5720', '0'), +('3', '42', '7', '4853', '5413', '0'), +('3', '42', '7', '3152', '4535', '0'), +('3', '42', '9', '4834', '4408', '0'), +('3', '42', '9', '4854', '3727', '0'), +('3', '42', '9', '12189', '3471', '0'), +('3', '42', '9', '10149', '3467', '0'), +('3', '42', '15', '10366', '8054', '0'), +('3', '42', '15', '10151', '7200', '0'), +('3', '42', '15', '14679', '7010', '0'), +('3', '42', '15', '14678', '5708', '0'), +('3', '42', '20', '2716', '24741', '0'), +('3', '42', '20', '11601', '19583', '0'), +('3', '42', '20', '2919', '11554', '0'), +('3', '42', '20', '1365', '10500', '0'), +('3', '42', '12', '4835', '10892', '0'), +('3', '42', '12', '20655', '8563', '0'), +('3', '42', '12', '4855', '6243', '0'), +('3', '42', '12', '11624', '5241', '0'), +('3', '42', '18', '4836', '7327', '0'), +('3', '42', '18', '4856', '5488', '0'), +('3', '42', '18', '3155', '5462', '0'), +('3', '42', '18', '4346', '4645', '0'), +('3', '42', '19', '4837', '7731', '0'), +('3', '42', '19', '3156', '6822', '0'), +('3', '42', '19', '4857', '6164', '0'), +('3', '42', '19', '68239', '5667', '0'), +('3', '42', '13', '27708', '26680', '0'), +('3', '42', '13', '11050', '25921', '0'), +('3', '42', '13', '27709', '25233', '0'), +('3', '42', '13', '11682', '24027', '0'), +('3', '42', '14', '11632', '30739', '0'), +('3', '42', '14', '11551', '23853', '0'), +('3', '42', '14', '9428', '20353', '0'), +('3', '42', '14', '11644', '19308', '0'), +('3', '42', '11', '45137', '16308', '0'), +('3', '42', '11', '8408', '8788', '0'), +('3', '42', '11', '8325', '8689', '0'), +('3', '42', '11', '8811', '6791', '0'), +('3', '43', '22', '10323', '0', '0'), +('3', '43', '22', '66166', '0', '0'), +('3', '43', '22', '8567', '0', '0'), +('3', '43', '22', '9246', '0', '0'), +('3', '43', '1', '14701', '4854', '0'), +('3', '43', '1', '14702', '3550', '0'), +('3', '43', '1', '10082', '3347', '0'), +('3', '43', '1', '10165', '1940', '0'), +('3', '43', '2', '4301', '7726', '0'), +('3', '43', '2', '4851', '7065', '0'), +('3', '43', '2', '4831', '6040', '0'), +('3', '43', '2', '4620', '5723', '0'), +('3', '43', '3', '71529', '4344', '0'), +('3', '43', '3', '4505', '2601', '0'), +('3', '43', '3', '11052', '2337', '0'), +('3', '43', '3', '21002', '2114', '0'), +('3', '43', '5', '14703', '7150', '0'), +('3', '43', '5', '12800', '5536', '0'), +('3', '43', '5', '14700', '4806', '0'), +('3', '43', '5', '10055', '4760', '0'), +('3', '43', '8', '11621', '26579', '0'), +('3', '43', '8', '11551', '8753', '0'), +('3', '43', '8', '1409', '7747', '0'), +('3', '43', '8', '11603', '7422', '0'), +('3', '43', '6', '1557', '8270', '0'), +('3', '43', '6', '4302', '4590', '0'), +('3', '43', '6', '4402', '3809', '0'), +('3', '43', '6', '25062', '3672', '0'), +('3', '43', '17', '4832', '14511', '0'), +('3', '43', '17', '4852', '12954', '0'), +('3', '43', '17', '4309', '8225', '0'), +('3', '43', '17', '11623', '7848', '0'), +('3', '43', '7', '4833', '6478', '0'), +('3', '43', '7', '4343', '5774', '0'), +('3', '43', '7', '4853', '5413', '0'), +('3', '43', '7', '3152', '4557', '0'), +('3', '43', '9', '4834', '4408', '0'), +('3', '43', '9', '4854', '3727', '0'), +('3', '43', '9', '10149', '3477', '0'), +('3', '43', '9', '12189', '3471', '0'), +('3', '43', '15', '10366', '8054', '0'), +('3', '43', '15', '10151', '7200', '0'), +('3', '43', '15', '14679', '7010', '0'), +('3', '43', '15', '14678', '5708', '0'), +('3', '43', '20', '2716', '24763', '0'), +('3', '43', '20', '11601', '19637', '0'), +('3', '43', '20', '2919', '11572', '0'), +('3', '43', '20', '1365', '10500', '0'), +('3', '43', '12', '4835', '10919', '0'), +('3', '43', '12', '20655', '8581', '0'), +('3', '43', '12', '4855', '6289', '0'), +('3', '43', '12', '11624', '5279', '0'), +('3', '43', '18', '4836', '7354', '0'), +('3', '43', '18', '3155', '5494', '0'), +('3', '43', '18', '4856', '5488', '0'), +('3', '43', '18', '4346', '4645', '0'), +('3', '43', '19', '4837', '7749', '0'), +('3', '43', '19', '3156', '6822', '0'), +('3', '43', '19', '4857', '6191', '0'), +('3', '43', '19', '68239', '5678', '0'), +('3', '43', '13', '27708', '26962', '0'), +('3', '43', '13', '11050', '26147', '0'), +('3', '43', '13', '27709', '25486', '0'), +('3', '43', '13', '45120', '24555', '0'), +('3', '43', '14', '11632', '30821', '0'), +('3', '43', '14', '11551', '23853', '0'), +('3', '43', '14', '9428', '20353', '0'), +('3', '43', '14', '11644', '19308', '0'), +('3', '43', '11', '45137', '16774', '0'), +('3', '43', '11', '8408', '8864', '0'), +('3', '43', '11', '8325', '8774', '0'), +('3', '43', '11', '8811', '6857', '0'), +('3', '44', '22', '10323', '0', '0'), +('3', '44', '22', '66166', '0', '0'), +('3', '44', '22', '8567', '0', '0'), +('3', '44', '22', '9246', '0', '0'), +('3', '44', '1', '14701', '4854', '0'), +('3', '44', '1', '14702', '3550', '0'), +('3', '44', '1', '10082', '3369', '0'), +('3', '44', '1', '10165', '1940', '0'), +('3', '44', '2', '4301', '7726', '0'), +('3', '44', '2', '4851', '7090', '0'), +('3', '44', '2', '4831', '6040', '0'), +('3', '44', '2', '4620', '5765', '0'), +('3', '44', '3', '71529', '4368', '0'), +('3', '44', '3', '4505', '2626', '0'), +('3', '44', '3', '11052', '2392', '0'), +('3', '44', '3', '21002', '2114', '0'), +('3', '44', '5', '14703', '7150', '0'), +('3', '44', '5', '12800', '5554', '0'), +('3', '44', '5', '14700', '4806', '0'), +('3', '44', '5', '10055', '4760', '0'), +('3', '44', '8', '11621', '26579', '0'), +('3', '44', '8', '11551', '8753', '0'), +('3', '44', '8', '1409', '7747', '0'), +('3', '44', '8', '11603', '7455', '0'), +('3', '44', '6', '1557', '8270', '0'), +('3', '44', '6', '4302', '4627', '0'), +('3', '44', '6', '4402', '3834', '0'), +('3', '44', '6', '25062', '3672', '0'), +('3', '44', '17', '4832', '14602', '0'), +('3', '44', '17', '4852', '13041', '0'), +('3', '44', '17', '4309', '8225', '0'), +('3', '44', '17', '4342', '7861', '0'), +('3', '44', '7', '4833', '6478', '0'), +('3', '44', '7', '4343', '5835', '0'), +('3', '44', '7', '4853', '5413', '0'), +('3', '44', '7', '3152', '4579', '0'), +('3', '44', '9', '4834', '4408', '0'), +('3', '44', '9', '4854', '3727', '0'), +('3', '44', '9', '10149', '3488', '0'), +('3', '44', '9', '12189', '3471', '0'), +('3', '44', '15', '10366', '8054', '0'), +('3', '44', '15', '10151', '7200', '0'), +('3', '44', '15', '14679', '7010', '0'), +('3', '44', '15', '14678', '5708', '0'), +('3', '44', '20', '2716', '24785', '0'), +('3', '44', '20', '11601', '19698', '0'), +('3', '44', '20', '2919', '11590', '0'), +('3', '44', '20', '1365', '10500', '0'), +('3', '44', '12', '4835', '10949', '0'), +('3', '44', '12', '20655', '8601', '0'), +('3', '44', '12', '4855', '6337', '0'), +('3', '44', '12', '11624', '5321', '0'), +('3', '44', '18', '4836', '7384', '0'), +('3', '44', '18', '3155', '5531', '0'), +('3', '44', '18', '4856', '5488', '0'), +('3', '44', '18', '4346', '4645', '0'), +('3', '44', '19', '4837', '7767', '0'), +('3', '44', '19', '3156', '6822', '0'), +('3', '44', '19', '4857', '6221', '0'), +('3', '44', '19', '68239', '5689', '0'), +('3', '44', '13', '27708', '27278', '0'), +('3', '44', '13', '11050', '26372', '0'), +('3', '44', '13', '27709', '25767', '0'), +('3', '44', '13', '45120', '25410', '0'), +('3', '44', '14', '11632', '30912', '0'), +('3', '44', '14', '11551', '23853', '0'), +('3', '44', '14', '9428', '20353', '0'), +('3', '44', '14', '11644', '19308', '0'), +('3', '44', '11', '45137', '17387', '0'), +('3', '44', '11', '8408', '8939', '0'), +('3', '44', '11', '8325', '8849', '0'), +('3', '44', '11', '8811', '6923', '0'), +('3', '45', '22', '10323', '0', '0'), +('3', '45', '22', '66166', '0', '0'), +('3', '45', '22', '8567', '0', '0'), +('3', '45', '22', '9246', '0', '0'), +('3', '45', '1', '14701', '4854', '0'), +('3', '45', '1', '14702', '3550', '0'), +('3', '45', '1', '10082', '3390', '0'), +('3', '45', '1', '10165', '1940', '0'), +('3', '45', '2', '4301', '7726', '0'), +('3', '45', '2', '4851', '7116', '0'), +('3', '45', '2', '4831', '6040', '0'), +('3', '45', '2', '4620', '5803', '0'), +('3', '45', '3', '71529', '4390', '0'), +('3', '45', '3', '4505', '2652', '0'), +('3', '45', '3', '11052', '2446', '0'), +('3', '45', '3', '21002', '2114', '0'), +('3', '45', '5', '14703', '7150', '0'), +('3', '45', '5', '12800', '5572', '0'), +('3', '45', '5', '14700', '4806', '0'), +('3', '45', '5', '10055', '4760', '0'), +('3', '45', '8', '11621', '26579', '0'), +('3', '45', '8', '11551', '8753', '0'), +('3', '45', '8', '1409', '7747', '0'), +('3', '45', '8', '11603', '7488', '0'), +('3', '45', '6', '1557', '8270', '0'), +('3', '45', '6', '4302', '4659', '0'), +('3', '45', '6', '4402', '3860', '0'), +('3', '45', '6', '25062', '3672', '0'), +('3', '45', '17', '4832', '14683', '0'), +('3', '45', '17', '4852', '13123', '0'), +('3', '45', '17', '4309', '8225', '0'), +('3', '45', '17', '4342', '7897', '0'), +('3', '45', '7', '4833', '6478', '0'), +('3', '45', '7', '4343', '5889', '0'), +('3', '45', '7', '4853', '5413', '0'), +('3', '45', '7', '3152', '4600', '0'), +('3', '45', '9', '4834', '4408', '0'), +('3', '45', '9', '4854', '3727', '0'), +('3', '45', '9', '10149', '3499', '0'), +('3', '45', '9', '12189', '3471', '0'), +('3', '45', '15', '10366', '8054', '0'), +('3', '45', '15', '10151', '7200', '0'), +('3', '45', '15', '14679', '7010', '0'), +('3', '45', '15', '14678', '5708', '0'), +('3', '45', '20', '2716', '24807', '0'), +('3', '45', '20', '11601', '19752', '0'), +('3', '45', '20', '2919', '11608', '0'), +('3', '45', '20', '1365', '10500', '0'), +('3', '45', '12', '4835', '10977', '0'), +('3', '45', '12', '20655', '8619', '0'), +('3', '45', '12', '4855', '6382', '0'), +('3', '45', '12', '11624', '5360', '0'), +('3', '45', '18', '4836', '7411', '0'), +('3', '45', '18', '3155', '5563', '0'), +('3', '45', '18', '4856', '5488', '0'), +('3', '45', '18', '4346', '4645', '0'), +('3', '45', '19', '4837', '7786', '0'), +('3', '45', '19', '3156', '6822', '0'), +('3', '45', '19', '4857', '6248', '0'), +('3', '45', '19', '68239', '5699', '0'), +('3', '45', '13', '11050', '32080', '0'), +('3', '45', '13', '27708', '27560', '0'), +('3', '45', '13', '45120', '26123', '0'), +('3', '45', '13', '27709', '26020', '0'), +('3', '45', '14', '11632', '30993', '0'), +('3', '45', '14', '11551', '23853', '0'), +('3', '45', '14', '9428', '20353', '0'), +('3', '45', '14', '11644', '19308', '0'), +('3', '45', '11', '45137', '17866', '0'), +('3', '45', '11', '8408', '9015', '0'), +('3', '45', '11', '8325', '8934', '0'), +('3', '45', '11', '8811', '6979', '0'), +('3', '46', '22', '10323', '0', '0'), +('3', '46', '22', '66166', '0', '0'), +('3', '46', '22', '8567', '0', '0'), +('3', '46', '22', '9246', '0', '0'), +('3', '46', '1', '14701', '4854', '0'), +('3', '46', '1', '14702', '3550', '0'), +('3', '46', '1', '10082', '3412', '0'), +('3', '46', '1', '10165', '1940', '0'), +('3', '46', '2', '4301', '7726', '0'), +('3', '46', '2', '4851', '7141', '0'), +('3', '46', '2', '4831', '6040', '0'), +('3', '46', '2', '4620', '5841', '0'), +('3', '46', '3', '71529', '4411', '0'), +('3', '46', '3', '4505', '2677', '0'), +('3', '46', '3', '11052', '2501', '0'), +('3', '46', '3', '21002', '2114', '0'), +('3', '46', '5', '14703', '7150', '0'), +('3', '46', '5', '12800', '5590', '0'), +('3', '46', '5', '14700', '4806', '0'), +('3', '46', '5', '10055', '4760', '0'), +('3', '46', '8', '11621', '26579', '0'), +('3', '46', '8', '11551', '8753', '0'), +('3', '46', '8', '1409', '7747', '0'), +('3', '46', '8', '11603', '7520', '0'), +('3', '46', '6', '1557', '8270', '0'), +('3', '46', '6', '4302', '4692', '0'), +('3', '46', '6', '4402', '3885', '0'), +('3', '46', '6', '25062', '3672', '0'), +('3', '46', '17', '4832', '14765', '0'), +('3', '46', '17', '4852', '13204', '0'), +('3', '46', '17', '4309', '8225', '0'), +('3', '46', '17', '4342', '7934', '0'), +('3', '46', '7', '4833', '6478', '0'), +('3', '46', '7', '4343', '5943', '0'), +('3', '46', '7', '4853', '5413', '0'), +('3', '46', '7', '3152', '4622', '0'), +('3', '46', '9', '4834', '4408', '0'), +('3', '46', '9', '4854', '3727', '0'), +('3', '46', '9', '10149', '3510', '0'), +('3', '46', '9', '12189', '3471', '0'), +('3', '46', '15', '10366', '8054', '0'), +('3', '46', '15', '10151', '7200', '0'), +('3', '46', '15', '14679', '7010', '0'), +('3', '46', '15', '14678', '5708', '0'), +('3', '46', '20', '2716', '24828', '0'), +('3', '46', '20', '11601', '19807', '0'), +('3', '46', '20', '2919', '11626', '0'), +('3', '46', '20', '1365', '10500', '0'), +('3', '46', '12', '4835', '11004', '0'), +('3', '46', '12', '20655', '8637', '0'), +('3', '46', '12', '4855', '6428', '0'), +('3', '46', '12', '11624', '5398', '0'), +('3', '46', '18', '4836', '7438', '0'), +('3', '46', '18', '3155', '5596', '0'), +('3', '46', '18', '4856', '5488', '0'), +('3', '46', '18', '4346', '4645', '0'), +('3', '46', '19', '4837', '7804', '0'), +('3', '46', '19', '3156', '6822', '0'), +('3', '46', '19', '4857', '6276', '0'), +('3', '46', '19', '68239', '5710', '0'), +('3', '46', '13', '11050', '32306', '0'), +('3', '46', '13', '27708', '27870', '0'), +('3', '46', '13', '45120', '27176', '0'), +('3', '46', '13', '27709', '26301', '0'), +('3', '46', '14', '11632', '31075', '0'), +('3', '46', '14', '11551', '23853', '0'), +('3', '46', '14', '9428', '20353', '0'), +('3', '46', '14', '11644', '19308', '0'), +('3', '46', '11', '45137', '18394', '0'), +('3', '46', '11', '8408', '9100', '0'), +('3', '46', '11', '8325', '9010', '0'), +('3', '46', '11', '8811', '7046', '0'), +('3', '47', '22', '10323', '0', '0'), +('3', '47', '22', '66166', '0', '0'), +('3', '47', '22', '8567', '0', '0'), +('3', '47', '22', '9246', '0', '0'), +('3', '47', '1', '14701', '4854', '0'), +('3', '47', '1', '14702', '3550', '0'), +('3', '47', '1', '10082', '3434', '0'), +('3', '47', '1', '10165', '1940', '0'), +('3', '47', '2', '4301', '7726', '0'), +('3', '47', '2', '4851', '7166', '0'), +('3', '47', '2', '4831', '6040', '0'), +('3', '47', '2', '4620', '5884', '0'), +('3', '47', '3', '71529', '4436', '0'), +('3', '47', '3', '4505', '2702', '0'), +('3', '47', '3', '11052', '2555', '0'), +('3', '47', '3', '21002', '2114', '0'), +('3', '47', '5', '14703', '7150', '0'), +('3', '47', '5', '12800', '5608', '0'), +('3', '47', '5', '14700', '4806', '0'), +('3', '47', '5', '10055', '4760', '0'), +('3', '47', '8', '11621', '26579', '0'), +('3', '47', '8', '11551', '8753', '0'), +('3', '47', '8', '1409', '7747', '0'), +('3', '47', '8', '11603', '7553', '0'), +('3', '47', '6', '1557', '8270', '0'), +('3', '47', '6', '4302', '4728', '0'), +('3', '47', '6', '4402', '3910', '0'), +('3', '47', '6', '25062', '3672', '0'), +('3', '47', '17', '4832', '14855', '0'), +('3', '47', '17', '4852', '13291', '0'), +('3', '47', '17', '4309', '8225', '0'), +('3', '47', '17', '4342', '7970', '0'), +('3', '47', '7', '4833', '6478', '0'), +('3', '47', '7', '4343', '6004', '0'), +('3', '47', '7', '4853', '5413', '0'), +('3', '47', '7', '3152', '4644', '0'), +('3', '47', '9', '4834', '4408', '0'), +('3', '47', '9', '4854', '3727', '0'), +('3', '47', '9', '10149', '3521', '0'), +('3', '47', '9', '12189', '3471', '0'), +('3', '47', '15', '10366', '8054', '0'), +('3', '47', '15', '10151', '7200', '0'), +('3', '47', '15', '14679', '7010', '0'), +('3', '47', '15', '14678', '5708', '0'), +('3', '47', '20', '2716', '24850', '0'), +('3', '47', '20', '11601', '19867', '0'), +('3', '47', '20', '2919', '11644', '0'), +('3', '47', '20', '1365', '10500', '0'), +('3', '47', '12', '4835', '11034', '0'), +('3', '47', '12', '20655', '8656', '0'), +('3', '47', '12', '4855', '6476', '0'), +('3', '47', '12', '11624', '5440', '0'), +('3', '47', '18', '4836', '7468', '0'), +('3', '47', '18', '3155', '5632', '0'), +('3', '47', '18', '4856', '5488', '0'), +('3', '47', '18', '4346', '4645', '0'), +('3', '47', '19', '4837', '7822', '0'), +('3', '47', '19', '3156', '6822', '0'), +('3', '47', '19', '4857', '6306', '0'), +('3', '47', '19', '68239', '5721', '0'), +('3', '47', '13', '11050', '32531', '0'), +('3', '47', '13', '27708', '28157', '0'), +('3', '47', '13', '45120', '27893', '0'), +('3', '47', '13', '27709', '26553', '0'), +('3', '47', '14', '11632', '31165', '0'), +('3', '47', '14', '11551', '23853', '0'), +('3', '47', '14', '9428', '20353', '0'), +('3', '47', '14', '11644', '19308', '0'), +('3', '47', '11', '45137', '18881', '0'), +('3', '47', '11', '8408', '9175', '0'), +('3', '47', '11', '8325', '9095', '0'), +('3', '47', '11', '8811', '7102', '0'), +('3', '48', '22', '10323', '0', '0'), +('3', '48', '22', '66166', '0', '0'), +('3', '48', '22', '8567', '0', '0'), +('3', '48', '22', '9246', '0', '0'), +('3', '48', '1', '14701', '4854', '0'), +('3', '48', '1', '14702', '3550', '0'), +('3', '48', '1', '10082', '3456', '0'), +('3', '48', '1', '10165', '1940', '0'), +('3', '48', '2', '4301', '7726', '0'), +('3', '48', '2', '4851', '7192', '0'), +('3', '48', '2', '4831', '6040', '0'), +('3', '48', '2', '4620', '5922', '0'), +('3', '48', '3', '71529', '4457', '0'), +('3', '48', '3', '4505', '2728', '0'), +('3', '48', '3', '11052', '2609', '0'), +('3', '48', '3', '21002', '2114', '0'), +('3', '48', '5', '14703', '7150', '0'), +('3', '48', '5', '12800', '5626', '0'), +('3', '48', '5', '14700', '4806', '0'), +('3', '48', '5', '10055', '4760', '0'), +('3', '48', '8', '11621', '26579', '0'), +('3', '48', '8', '11551', '8753', '0'), +('3', '48', '8', '1409', '7747', '0'), +('3', '48', '8', '11603', '7586', '0'), +('3', '48', '6', '1557', '8270', '0'), +('3', '48', '6', '4302', '4761', '0'), +('3', '48', '6', '4402', '3936', '0'), +('3', '48', '6', '25062', '3672', '0'), +('3', '48', '17', '4832', '14937', '0'), +('3', '48', '17', '4852', '13373', '0'), +('3', '48', '17', '4309', '8225', '0'), +('3', '48', '17', '4342', '8006', '0'), +('3', '48', '7', '4833', '6478', '0'), +('3', '48', '7', '4343', '6058', '0'), +('3', '48', '7', '4853', '5413', '0'), +('3', '48', '7', '3152', '4666', '0'), +('3', '48', '9', '4834', '4408', '0'), +('3', '48', '9', '4854', '3727', '0'), +('3', '48', '9', '10149', '3532', '0'), +('3', '48', '9', '12189', '3471', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '48', '15', '10366', '8054', '0'), +('3', '48', '15', '10151', '7200', '0'), +('3', '48', '15', '14679', '7010', '0'), +('3', '48', '15', '14678', '5708', '0'), +('3', '48', '20', '2716', '24872', '0'), +('3', '48', '20', '11601', '19921', '0'), +('3', '48', '20', '2919', '11662', '0'), +('3', '48', '20', '1365', '10500', '0'), +('3', '48', '12', '4835', '11061', '0'), +('3', '48', '12', '20655', '8674', '0'), +('3', '48', '12', '4855', '6521', '0'), +('3', '48', '12', '11624', '5478', '0'), +('3', '48', '18', '4836', '7496', '0'), +('3', '48', '18', '3155', '5665', '0'), +('3', '48', '18', '4856', '5488', '0'), +('3', '48', '18', '4346', '4645', '0'), +('3', '48', '19', '4837', '7840', '0'), +('3', '48', '19', '3156', '6822', '0'), +('3', '48', '19', '4857', '6333', '0'), +('3', '48', '19', '68239', '5732', '0'), +('3', '48', '13', '11050', '32757', '0'), +('3', '48', '13', '45120', '28807', '0'), +('3', '48', '13', '27708', '28467', '0'), +('3', '48', '13', '27709', '26834', '0'), +('3', '48', '14', '11632', '31247', '0'), +('3', '48', '14', '11551', '23853', '0'), +('3', '48', '14', '9428', '20353', '0'), +('3', '48', '14', '11644', '19308', '0'), +('3', '48', '11', '45137', '19516', '0'), +('3', '48', '11', '8408', '9251', '0'), +('3', '48', '11', '8325', '9171', '0'), +('3', '48', '11', '8811', '7168', '0'), +('3', '49', '22', '10323', '0', '0'), +('3', '49', '22', '66166', '0', '0'), +('3', '49', '22', '8567', '0', '0'), +('3', '49', '22', '9246', '0', '0'), +('3', '49', '1', '14701', '4854', '0'), +('3', '49', '1', '14702', '3550', '0'), +('3', '49', '1', '10082', '3477', '0'), +('3', '49', '1', '10165', '1940', '0'), +('3', '49', '2', '4301', '7726', '0'), +('3', '49', '2', '4851', '7217', '0'), +('3', '49', '2', '4831', '6040', '0'), +('3', '49', '2', '4620', '5964', '0'), +('3', '49', '3', '71529', '4481', '0'), +('3', '49', '3', '4505', '2753', '0'), +('3', '49', '3', '11052', '2664', '0'), +('3', '49', '3', '21002', '2114', '0'), +('3', '49', '5', '14703', '7150', '0'), +('3', '49', '5', '12800', '5644', '0'), +('3', '49', '5', '14700', '4806', '0'), +('3', '49', '5', '10055', '4760', '0'), +('3', '49', '8', '11621', '26579', '0'), +('3', '49', '8', '11551', '8753', '0'), +('3', '49', '8', '1409', '7747', '0'), +('3', '49', '8', '11603', '7618', '0'), +('3', '49', '6', '1557', '8270', '0'), +('3', '49', '6', '4302', '4797', '0'), +('3', '49', '6', '4402', '3961', '0'), +('3', '49', '6', '25062', '3672', '0'), +('3', '49', '17', '4832', '15028', '0'), +('3', '49', '17', '4852', '13460', '0'), +('3', '49', '17', '4309', '8225', '0'), +('3', '49', '17', '4342', '8042', '0'), +('3', '49', '7', '4833', '6478', '0'), +('3', '49', '7', '4343', '6119', '0'), +('3', '49', '7', '4853', '5413', '0'), +('3', '49', '7', '3152', '4687', '0'), +('3', '49', '9', '4834', '4408', '0'), +('3', '49', '9', '4854', '3727', '0'), +('3', '49', '9', '10149', '3543', '0'), +('3', '49', '9', '12189', '3471', '0'), +('3', '49', '15', '10366', '8054', '0'), +('3', '49', '15', '10151', '7200', '0'), +('3', '49', '15', '14679', '7010', '0'), +('3', '49', '15', '14678', '5708', '0'), +('3', '49', '20', '2716', '24893', '0'), +('3', '49', '20', '11601', '19982', '0'), +('3', '49', '20', '2919', '11680', '0'), +('3', '49', '20', '1365', '10500', '0'), +('3', '49', '12', '4835', '11091', '0'), +('3', '49', '12', '20655', '8694', '0'), +('3', '49', '12', '4855', '6570', '0'), +('3', '49', '12', '11624', '5520', '0'), +('3', '49', '18', '4836', '7526', '0'), +('3', '49', '18', '3155', '5701', '0'), +('3', '49', '18', '4856', '5488', '0'), +('3', '49', '18', '4346', '4645', '0'), +('3', '49', '19', '4837', '7858', '0'), +('3', '49', '19', '3156', '6822', '0'), +('3', '49', '19', '4857', '6363', '0'), +('3', '49', '19', '68239', '5743', '0'), +('3', '49', '13', '11050', '33011', '0'), +('3', '49', '13', '45120', '29554', '0'), +('3', '49', '13', '27708', '28755', '0'), +('3', '49', '13', '27709', '27087', '0'), +('3', '49', '14', '11632', '31337', '0'), +('3', '49', '14', '11551', '23853', '0'), +('3', '49', '14', '9428', '20353', '0'), +('3', '49', '14', '11644', '19308', '0'), +('3', '49', '11', '45137', '20025', '0'), +('3', '49', '11', '8408', '9326', '0'), +('3', '49', '11', '8325', '9256', '0'), +('3', '49', '11', '8811', '7234', '0'), +('3', '50', '22', '10323', '0', '0'), +('3', '50', '22', '66166', '0', '0'), +('3', '50', '22', '8567', '0', '0'), +('3', '50', '22', '9246', '0', '0'), +('3', '50', '1', '14701', '4854', '0'), +('3', '50', '1', '14702', '3550', '0'), +('3', '50', '1', '10082', '3499', '0'), +('3', '50', '1', '10165', '1940', '0'), +('3', '50', '2', '4301', '7726', '0'), +('3', '50', '2', '4851', '7242', '0'), +('3', '50', '2', '4831', '6040', '0'), +('3', '50', '2', '4620', '6006', '0'), +('3', '50', '3', '71529', '4506', '0'), +('3', '50', '3', '4505', '2778', '0'), +('3', '50', '3', '11052', '2718', '0'), +('3', '50', '3', '21002', '2114', '0'), +('3', '50', '5', '14703', '7150', '0'), +('3', '50', '5', '12800', '5663', '0'), +('3', '50', '5', '14700', '4806', '0'), +('3', '50', '5', '10055', '4760', '0'), +('3', '50', '8', '11621', '26579', '0'), +('3', '50', '8', '11551', '8753', '0'), +('3', '50', '8', '1409', '7747', '0'), +('3', '50', '8', '11603', '7651', '0'), +('3', '50', '6', '1557', '8270', '0'), +('3', '50', '6', '4302', '4833', '0'), +('3', '50', '6', '4402', '3986', '0'), +('3', '50', '6', '25062', '3672', '0'), +('3', '50', '17', '4832', '15118', '0'), +('3', '50', '17', '4852', '13547', '0'), +('3', '50', '17', '4309', '8225', '0'), +('3', '50', '17', '4342', '8079', '0'), +('3', '50', '7', '4833', '6478', '0'), +('3', '50', '7', '4343', '6179', '0'), +('3', '50', '7', '4853', '5413', '0'), +('3', '50', '7', '3152', '4709', '0'), +('3', '50', '9', '4834', '4408', '0'), +('3', '50', '9', '4854', '3727', '0'), +('3', '50', '9', '10149', '3554', '0'), +('3', '50', '9', '12189', '3471', '0'), +('3', '50', '15', '10366', '8054', '0'), +('3', '50', '15', '10151', '7200', '0'), +('3', '50', '15', '14679', '7010', '0'), +('3', '50', '15', '14678', '5708', '0'), +('3', '50', '20', '2716', '24915', '0'), +('3', '50', '20', '11601', '20042', '0'), +('3', '50', '20', '2919', '11699', '0'), +('3', '50', '20', '1365', '10500', '0'), +('3', '50', '12', '4835', '11122', '0'), +('3', '50', '12', '20655', '8713', '0'), +('3', '50', '12', '4855', '6618', '0'), +('3', '50', '12', '11624', '5562', '0'), +('3', '50', '18', '4836', '7556', '0'), +('3', '50', '18', '3155', '5737', '0'), +('3', '50', '18', '4856', '5488', '0'), +('3', '50', '18', '4346', '4645', '0'), +('3', '50', '19', '4837', '7876', '0'), +('3', '50', '19', '3156', '6822', '0'), +('3', '50', '19', '4857', '6393', '0'), +('3', '50', '19', '68239', '5754', '0'), +('3', '50', '13', '11050', '33236', '0'), +('3', '50', '13', '45120', '30501', '0'), +('3', '50', '13', '27708', '29071', '0'), +('3', '50', '13', '27709', '27368', '0'), +('3', '50', '14', '11632', '31428', '0'), +('3', '50', '14', '11551', '23853', '0'), +('3', '50', '14', '9428', '20353', '0'), +('3', '50', '14', '11644', '19308', '0'), +('3', '50', '11', '45137', '20583', '0'), +('3', '50', '11', '8408', '9402', '0'), +('3', '50', '11', '8325', '9331', '0'), +('3', '50', '11', '8811', '7291', '0'), +('3', '51', '22', '10323', '0', '0'), +('3', '51', '22', '66166', '0', '0'), +('3', '51', '22', '8567', '0', '0'), +('3', '51', '22', '9246', '0', '0'), +('3', '51', '1', '14701', '4854', '0'), +('3', '51', '1', '14702', '3550', '0'), +('3', '51', '1', '10082', '3521', '0'), +('3', '51', '1', '10165', '1940', '0'), +('3', '51', '2', '4301', '7726', '0'), +('3', '51', '2', '4851', '7268', '0'), +('3', '51', '2', '4620', '6044', '0'), +('3', '51', '2', '4831', '6040', '0'), +('3', '51', '3', '71529', '4527', '0'), +('3', '51', '3', '4505', '2804', '0'), +('3', '51', '3', '11052', '2772', '0'), +('3', '51', '3', '21002', '2114', '0'), +('3', '51', '5', '14703', '7150', '0'), +('3', '51', '5', '12800', '5681', '0'), +('3', '51', '5', '14700', '4806', '0'), +('3', '51', '5', '10055', '4760', '0'), +('3', '51', '8', '11621', '26579', '0'), +('3', '51', '8', '11551', '8753', '0'), +('3', '51', '8', '1409', '7747', '0'), +('3', '51', '8', '11603', '7683', '0'), +('3', '51', '6', '1557', '8270', '0'), +('3', '51', '6', '4302', '4866', '0'), +('3', '51', '6', '4402', '4012', '0'), +('3', '51', '6', '25062', '3672', '0'), +('3', '51', '17', '4832', '15200', '0'), +('3', '51', '17', '4852', '13628', '0'), +('3', '51', '17', '4309', '8225', '0'), +('3', '51', '17', '4342', '8115', '0'), +('3', '51', '7', '4833', '6478', '0'), +('3', '51', '7', '4343', '6233', '0'), +('3', '51', '7', '4853', '5413', '0'), +('3', '51', '7', '3152', '4731', '0'), +('3', '51', '9', '4834', '4408', '0'), +('3', '51', '9', '4854', '3727', '0'), +('3', '51', '9', '10149', '3564', '0'), +('3', '51', '9', '4311', '3492', '0'), +('3', '51', '15', '10366', '8054', '0'), +('3', '51', '15', '10151', '7200', '0'), +('3', '51', '15', '14679', '7010', '0'), +('3', '51', '15', '14678', '5708', '0'), +('3', '51', '20', '2716', '24937', '0'), +('3', '51', '20', '11601', '20096', '0'), +('3', '51', '20', '2919', '11717', '0'), +('3', '51', '20', '1365', '10500', '0'), +('3', '51', '12', '4835', '11149', '0'), +('3', '51', '12', '20655', '8731', '0'), +('3', '51', '12', '4855', '6663', '0'), +('3', '51', '12', '11624', '5601', '0'), +('3', '51', '18', '4836', '7583', '0'), +('3', '51', '18', '3155', '5770', '0'), +('3', '51', '18', '4856', '5488', '0'), +('3', '51', '18', '4346', '4645', '0'), +('3', '51', '19', '4837', '7894', '0'), +('3', '51', '19', '3156', '6822', '0'), +('3', '51', '19', '4857', '6421', '0'), +('3', '51', '19', '68239', '5765', '0'), +('3', '51', '13', '27961', '39870', '0'), +('3', '51', '13', '11050', '33462', '0'), +('3', '51', '13', '45120', '31248', '0'), +('3', '51', '13', '27895', '30222', '0'), +('3', '51', '14', '11632', '31510', '0'), +('3', '51', '14', '11551', '23853', '0'), +('3', '51', '14', '9428', '20353', '0'), +('3', '51', '14', '11644', '19308', '0'), +('3', '51', '11', '45137', '21092', '0'), +('3', '51', '11', '8408', '9478', '0'), +('3', '51', '11', '8325', '9407', '0'), +('3', '51', '11', '8811', '7357', '0'), +('3', '52', '22', '10323', '0', '0'), +('3', '52', '22', '66166', '0', '0'), +('3', '52', '22', '8567', '0', '0'), +('3', '52', '22', '9246', '0', '0'), +('3', '52', '1', '14701', '4854', '0'), +('3', '52', '1', '14702', '3550', '0'), +('3', '52', '1', '10082', '3543', '0'), +('3', '52', '1', '10165', '1940', '0'), +('3', '52', '2', '4301', '7726', '0'), +('3', '52', '2', '4851', '7293', '0'), +('3', '52', '2', '4620', '6087', '0'), +('3', '52', '2', '4831', '6040', '0'), +('3', '52', '3', '71529', '4552', '0'), +('3', '52', '3', '4505', '2829', '0'), +('3', '52', '3', '11052', '2827', '0'), +('3', '52', '3', '21002', '2114', '0'), +('3', '52', '5', '14703', '7150', '0'), +('3', '52', '5', '12800', '5699', '0'), +('3', '52', '5', '14700', '4806', '0'), +('3', '52', '5', '10055', '4760', '0'), +('3', '52', '8', '11621', '26579', '0'), +('3', '52', '8', '11551', '8753', '0'), +('3', '52', '8', '1409', '7747', '0'), +('3', '52', '8', '11603', '7716', '0'), +('3', '52', '6', '1557', '8270', '0'), +('3', '52', '6', '4302', '4902', '0'), +('3', '52', '6', '4402', '4037', '0'), +('3', '52', '6', '25062', '3672', '0'), +('3', '52', '17', '4832', '15290', '0'), +('3', '52', '17', '4852', '13715', '0'), +('3', '52', '17', '4309', '8225', '0'), +('3', '52', '17', '4342', '8151', '0'), +('3', '52', '7', '4833', '6478', '0'), +('3', '52', '7', '4343', '6294', '0'), +('3', '52', '7', '4853', '5413', '0'), +('3', '52', '7', '3152', '4753', '0'), +('3', '52', '9', '4834', '4408', '0'), +('3', '52', '9', '4854', '3727', '0'), +('3', '52', '9', '10149', '3575', '0'), +('3', '52', '9', '4311', '3535', '0'), +('3', '52', '15', '10366', '8054', '0'), +('3', '52', '15', '10151', '7200', '0'), +('3', '52', '15', '14679', '7010', '0'), +('3', '52', '15', '14678', '5708', '0'), +('3', '52', '20', '2716', '24959', '0'), +('3', '52', '20', '11601', '20157', '0'), +('3', '52', '20', '2919', '11735', '0'), +('3', '52', '20', '1365', '10500', '0'), +('3', '52', '12', '4835', '11179', '0'), +('3', '52', '12', '20655', '8750', '0'), +('3', '52', '12', '4855', '6711', '0'), +('3', '52', '12', '11624', '5643', '0'), +('3', '52', '18', '4836', '7613', '0'), +('3', '52', '18', '3155', '5806', '0'), +('3', '52', '18', '4856', '5488', '0'), +('3', '52', '18', '4346', '4645', '0'), +('3', '52', '19', '4837', '7912', '0'), +('3', '52', '19', '3156', '6822', '0'), +('3', '52', '19', '4857', '6451', '0'), +('3', '52', '19', '68239', '5776', '0'), +('3', '52', '13', '27961', '40212', '0'), +('3', '52', '13', '11050', '33716', '0'), +('3', '52', '13', '45120', '32197', '0'), +('3', '52', '13', '27895', '30467', '0'), +('3', '52', '14', '11632', '31600', '0'), +('3', '52', '14', '11551', '23853', '0'), +('3', '52', '14', '9428', '20353', '0'), +('3', '52', '14', '9403', '19319', '0'), +('3', '52', '11', '45137', '21757', '0'), +('3', '52', '11', '8408', '9553', '0'), +('3', '52', '11', '8325', '9492', '0'), +('3', '52', '11', '8811', '7423', '0'), +('3', '53', '22', '10323', '0', '0'), +('3', '53', '22', '66166', '0', '0'), +('3', '53', '22', '8567', '0', '0'), +('3', '53', '22', '9246', '0', '0'), +('3', '53', '1', '14701', '4854', '0'), +('3', '53', '1', '10082', '3564', '0'), +('3', '53', '1', '14702', '3550', '0'), +('3', '53', '1', '10165', '1940', '0'), +('3', '53', '2', '4301', '7726', '0'), +('3', '53', '2', '4851', '7319', '0'), +('3', '53', '2', '4620', '6129', '0'), +('3', '53', '2', '4831', '6040', '0'), +('3', '53', '3', '71529', '4576', '0'), +('3', '53', '3', '11052', '2881', '0'), +('3', '53', '3', '4505', '2855', '0'), +('3', '53', '3', '21002', '2114', '0'), +('3', '53', '5', '14703', '7150', '0'), +('3', '53', '5', '12800', '5717', '0'), +('3', '53', '5', '14700', '4806', '0'), +('3', '53', '5', '10055', '4760', '0'), +('3', '53', '8', '11621', '26579', '0'), +('3', '53', '8', '11551', '8753', '0'), +('3', '53', '8', '11603', '7749', '0'), +('3', '53', '8', '1409', '7747', '0'), +('3', '53', '6', '1557', '8270', '0'), +('3', '53', '6', '4302', '4938', '0'), +('3', '53', '6', '4402', '4063', '0'), +('3', '53', '6', '25062', '3672', '0'), +('3', '53', '17', '4832', '15381', '0'), +('3', '53', '17', '4852', '13802', '0'), +('3', '53', '17', '4309', '8225', '0'), +('3', '53', '17', '4342', '8187', '0'), +('3', '53', '7', '4833', '6478', '0'), +('3', '53', '7', '4343', '6354', '0'), +('3', '53', '7', '4853', '5413', '0'), +('3', '53', '7', '3152', '4774', '0'), +('3', '53', '9', '4834', '4408', '0'), +('3', '53', '9', '4854', '3727', '0'), +('3', '53', '9', '10149', '3586', '0'), +('3', '53', '9', '4311', '3577', '0'), +('3', '53', '15', '10366', '8054', '0'), +('3', '53', '15', '10151', '7200', '0'), +('3', '53', '15', '14679', '7010', '0'), +('3', '53', '15', '14678', '5708', '0'), +('3', '53', '20', '2716', '24980', '0'), +('3', '53', '20', '11601', '20217', '0'), +('3', '53', '20', '2919', '11753', '0'), +('3', '53', '20', '1365', '10500', '0'), +('3', '53', '12', '4835', '11209', '0'), +('3', '53', '12', '20655', '8770', '0'), +('3', '53', '12', '4855', '6760', '0'), +('3', '53', '12', '11624', '5685', '0'), +('3', '53', '18', '4836', '7644', '0'), +('3', '53', '18', '3155', '5842', '0'), +('3', '53', '18', '4856', '5488', '0'), +('3', '53', '18', '4346', '4645', '0'), +('3', '53', '19', '4837', '7931', '0'), +('3', '53', '19', '3156', '6822', '0'), +('3', '53', '19', '4857', '6481', '0'), +('3', '53', '19', '68239', '5786', '0'), +('3', '53', '13', '27961', '40554', '0'), +('3', '53', '13', '11050', '33941', '0'), +('3', '53', '13', '45120', '32977', '0'), +('3', '53', '13', '27895', '30684', '0'), +('3', '53', '14', '11632', '31691', '0'), +('3', '53', '14', '11551', '23853', '0'), +('3', '53', '14', '9428', '20353', '0'), +('3', '53', '14', '9403', '19337', '0'), +('3', '53', '11', '45137', '22283', '0'), +('3', '53', '11', '8408', '9629', '0'), +('3', '53', '11', '8325', '9567', '0'), +('3', '53', '11', '8811', '7480', '0'), +('3', '54', '22', '10323', '0', '0'), +('3', '54', '22', '66166', '0', '0'), +('3', '54', '22', '8567', '0', '0'), +('3', '54', '22', '9246', '0', '0'), +('3', '54', '1', '14701', '4854', '0'), +('3', '54', '1', '10082', '3586', '0'), +('3', '54', '1', '14702', '3550', '0'), +('3', '54', '1', '10165', '1940', '0'), +('3', '54', '2', '4301', '7726', '0'), +('3', '54', '2', '4851', '7344', '0'), +('3', '54', '2', '4620', '6171', '0'), +('3', '54', '2', '4831', '6040', '0'), +('3', '54', '3', '71529', '4600', '0'), +('3', '54', '3', '11052', '2935', '0'), +('3', '54', '3', '4505', '2880', '0'), +('3', '54', '3', '21002', '2114', '0'), +('3', '54', '5', '14703', '7150', '0'), +('3', '54', '5', '12800', '5735', '0'), +('3', '54', '5', '14700', '4806', '0'), +('3', '54', '5', '10055', '4760', '0'), +('3', '54', '8', '11621', '26579', '0'), +('3', '54', '8', '11551', '8753', '0'), +('3', '54', '8', '11603', '7781', '0'), +('3', '54', '8', '1409', '7747', '0'), +('3', '54', '6', '1557', '8270', '0'), +('3', '54', '6', '4302', '4975', '0'), +('3', '54', '6', '4402', '4088', '0'), +('3', '54', '6', '25062', '3672', '0'), +('3', '54', '17', '4832', '15471', '0'), +('3', '54', '17', '4852', '13889', '0'), +('3', '54', '17', '4309', '8225', '0'), +('3', '54', '17', '4342', '8223', '0'), +('3', '54', '7', '4833', '6478', '0'), +('3', '54', '7', '4343', '6414', '0'), +('3', '54', '7', '4853', '5413', '0'), +('3', '54', '7', '3152', '4796', '0'), +('3', '54', '9', '4834', '4408', '0'), +('3', '54', '9', '4854', '3727', '0'), +('3', '54', '9', '4311', '3619', '0'), +('3', '54', '9', '10149', '3597', '0'), +('3', '54', '15', '10366', '8054', '0'), +('3', '54', '15', '10151', '7200', '0'), +('3', '54', '15', '14679', '7010', '0'), +('3', '54', '15', '14678', '5708', '0'), +('3', '54', '20', '2716', '25002', '0'), +('3', '54', '20', '11601', '20278', '0'), +('3', '54', '20', '2919', '11771', '0'), +('3', '54', '20', '1365', '10500', '0'), +('3', '54', '12', '4835', '11239', '0'), +('3', '54', '12', '20655', '8789', '0'), +('3', '54', '12', '4855', '6808', '0'), +('3', '54', '12', '11624', '5727', '0'), +('3', '54', '18', '4836', '7674', '0'), +('3', '54', '18', '3155', '5879', '0'), +('3', '54', '18', '4856', '5488', '0'), +('3', '54', '18', '4346', '4645', '0'), +('3', '54', '19', '4837', '7949', '0'), +('3', '54', '19', '3156', '6822', '0'), +('3', '54', '19', '4857', '6511', '0'), +('3', '54', '19', '68239', '5797', '0'), +('3', '54', '13', '27961', '40896', '0'), +('3', '54', '13', '11050', '34167', '0'), +('3', '54', '13', '45120', '33957', '0'), +('3', '54', '13', '27895', '30928', '0'), +('3', '54', '14', '11632', '31781', '0'), +('3', '54', '14', '11551', '23853', '0'), +('3', '54', '14', '9428', '20353', '0'), +('3', '54', '14', '9403', '19355', '0'), +('3', '54', '11', '45137', '22811', '0'), +('3', '54', '11', '8408', '9704', '0'), +('3', '54', '11', '8325', '9652', '0'), +('3', '54', '11', '8811', '7546', '0'), +('3', '55', '22', '10323', '0', '0'), +('3', '55', '22', '66166', '0', '0'), +('3', '55', '22', '8567', '0', '0'), +('3', '55', '22', '9246', '0', '0'), +('3', '55', '1', '14701', '4854', '0'), +('3', '55', '1', '10082', '3608', '0'), +('3', '55', '1', '14702', '3550', '0'), +('3', '55', '1', '10165', '1940', '0'), +('3', '55', '2', '4301', '7726', '0'), +('3', '55', '2', '4851', '7369', '0'), +('3', '55', '2', '4620', '6213', '0'), +('3', '55', '2', '4831', '6040', '0'), +('3', '55', '3', '71529', '4624', '0'), +('3', '55', '3', '11052', '2990', '0'), +('3', '55', '3', '4505', '2905', '0'), +('3', '55', '3', '21002', '2114', '0'), +('3', '55', '5', '14703', '7150', '0'), +('3', '55', '5', '12800', '5753', '0'), +('3', '55', '5', '14700', '4806', '0'), +('3', '55', '5', '10055', '4760', '0'), +('3', '55', '8', '11621', '26579', '0'), +('3', '55', '8', '11551', '8753', '0'), +('3', '55', '8', '11603', '7814', '0'), +('3', '55', '8', '1409', '7747', '0'), +('3', '55', '6', '1557', '8270', '0'), +('3', '55', '6', '4302', '5011', '0'), +('3', '55', '6', '4402', '4113', '0'), +('3', '55', '6', '25062', '3672', '0'), +('3', '55', '17', '4832', '15562', '0'), +('3', '55', '17', '4852', '13976', '0'), +('3', '55', '17', '4342', '8260', '0'), +('3', '55', '17', '4309', '8225', '0'), +('3', '55', '7', '4833', '6478', '0'), +('3', '55', '7', '4343', '6475', '0'), +('3', '55', '7', '4853', '5413', '0'), +('3', '55', '7', '3152', '4818', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '55', '9', '4834', '4408', '0'), +('3', '55', '9', '4854', '3727', '0'), +('3', '55', '9', '4311', '3661', '0'), +('3', '55', '9', '10149', '3608', '0'), +('3', '55', '15', '10366', '8054', '0'), +('3', '55', '15', '10151', '7200', '0'), +('3', '55', '15', '14679', '7010', '0'), +('3', '55', '15', '14678', '5708', '0'), +('3', '55', '20', '2716', '25024', '0'), +('3', '55', '20', '11601', '20338', '0'), +('3', '55', '20', '2919', '11789', '0'), +('3', '55', '20', '1365', '10500', '0'), +('3', '55', '12', '4835', '11270', '0'), +('3', '55', '12', '20655', '8808', '0'), +('3', '55', '12', '4855', '6856', '0'), +('3', '55', '12', '11624', '5770', '0'), +('3', '55', '18', '4836', '7704', '0'), +('3', '55', '18', '3155', '5915', '0'), +('3', '55', '18', '4856', '5488', '0'), +('3', '55', '18', '4346', '4645', '0'), +('3', '55', '19', '4837', '7967', '0'), +('3', '55', '19', '3156', '6822', '0'), +('3', '55', '19', '4857', '6541', '0'), +('3', '55', '19', '68239', '5808', '0'), +('3', '55', '13', '27961', '41266', '0'), +('3', '55', '13', '45120', '35023', '0'), +('3', '55', '13', '11050', '34392', '0'), +('3', '55', '13', '27895', '31145', '0'), +('3', '55', '14', '11632', '31872', '0'), +('3', '55', '14', '11551', '23853', '0'), +('3', '55', '14', '9428', '20353', '0'), +('3', '55', '14', '9403', '19373', '0'), +('3', '55', '11', '45137', '23397', '0'), +('3', '55', '11', '8408', '9780', '0'), +('3', '55', '11', '8325', '9728', '0'), +('3', '55', '11', '8811', '7603', '0'), +('3', '56', '22', '10323', '0', '0'), +('3', '56', '22', '66166', '0', '0'), +('3', '56', '22', '8567', '0', '0'), +('3', '56', '22', '9246', '0', '0'), +('3', '56', '1', '14701', '4854', '0'), +('3', '56', '1', '10082', '3630', '0'), +('3', '56', '1', '14702', '3550', '0'), +('3', '56', '1', '10165', '1940', '0'), +('3', '56', '2', '4301', '7726', '0'), +('3', '56', '2', '4851', '7395', '0'), +('3', '56', '2', '4620', '6256', '0'), +('3', '56', '2', '4831', '6040', '0'), +('3', '56', '3', '71529', '4648', '0'), +('3', '56', '3', '11052', '3044', '0'), +('3', '56', '3', '4505', '2931', '0'), +('3', '56', '3', '21002', '2114', '0'), +('3', '56', '5', '14703', '7150', '0'), +('3', '56', '5', '12800', '5771', '0'), +('3', '56', '5', '14700', '4806', '0'), +('3', '56', '5', '10055', '4760', '0'), +('3', '56', '8', '11621', '26579', '0'), +('3', '56', '8', '11551', '8753', '0'), +('3', '56', '8', '11603', '7846', '0'), +('3', '56', '8', '1409', '7747', '0'), +('3', '56', '6', '1557', '8270', '0'), +('3', '56', '6', '4302', '5047', '0'), +('3', '56', '6', '4402', '4139', '0'), +('3', '56', '6', '25062', '3672', '0'), +('3', '56', '17', '4832', '15653', '0'), +('3', '56', '17', '4852', '14063', '0'), +('3', '56', '17', '4342', '8296', '0'), +('3', '56', '17', '4309', '8225', '0'), +('3', '56', '7', '4343', '6535', '0'), +('3', '56', '7', '4833', '6478', '0'), +('3', '56', '7', '4853', '5413', '0'), +('3', '56', '7', '3152', '4840', '0'), +('3', '56', '9', '4834', '4408', '0'), +('3', '56', '9', '4854', '3727', '0'), +('3', '56', '9', '4311', '3704', '0'), +('3', '56', '9', '10149', '3619', '0'), +('3', '56', '15', '10366', '8054', '0'), +('3', '56', '15', '10151', '7200', '0'), +('3', '56', '15', '14679', '7010', '0'), +('3', '56', '15', '14678', '5708', '0'), +('3', '56', '20', '2716', '25046', '0'), +('3', '56', '20', '11601', '20398', '0'), +('3', '56', '20', '2919', '11807', '0'), +('3', '56', '20', '1365', '10500', '0'), +('3', '56', '12', '4835', '11300', '0'), +('3', '56', '12', '20655', '8828', '0'), +('3', '56', '12', '4855', '6905', '0'), +('3', '56', '12', '11624', '5812', '0'), +('3', '56', '18', '4836', '7734', '0'), +('3', '56', '18', '3155', '5951', '0'), +('3', '56', '18', '4856', '5488', '0'), +('3', '56', '18', '4346', '4645', '0'), +('3', '56', '19', '4837', '7985', '0'), +('3', '56', '19', '3156', '6822', '0'), +('3', '56', '19', '4857', '6572', '0'), +('3', '56', '19', '68239', '5819', '0'), +('3', '56', '13', '27961', '41608', '0'), +('3', '56', '13', '45120', '35308', '0'), +('3', '56', '13', '11050', '34646', '0'), +('3', '56', '13', '27895', '31390', '0'), +('3', '56', '14', '11632', '31963', '0'), +('3', '56', '14', '11551', '23853', '0'), +('3', '56', '14', '9428', '20353', '0'), +('3', '56', '14', '9403', '19391', '0'), +('3', '56', '11', '45137', '23938', '0'), +('3', '56', '11', '8408', '9855', '0'), +('3', '56', '11', '8325', '9813', '0'), +('3', '56', '11', '8811', '7669', '0'), +('3', '57', '22', '10323', '0', '0'), +('3', '57', '22', '66166', '0', '0'), +('3', '57', '22', '8567', '0', '0'), +('3', '57', '22', '9246', '0', '0'), +('3', '57', '1', '14701', '4854', '0'), +('3', '57', '1', '10082', '3651', '0'), +('3', '57', '1', '14702', '3550', '0'), +('3', '57', '1', '10165', '1940', '0'), +('3', '57', '2', '4301', '7726', '0'), +('3', '57', '2', '4851', '7420', '0'), +('3', '57', '2', '4620', '6298', '0'), +('3', '57', '2', '4831', '6040', '0'), +('3', '57', '3', '71529', '4672', '0'), +('3', '57', '3', '11052', '3099', '0'), +('3', '57', '3', '4505', '2956', '0'), +('3', '57', '3', '21002', '2114', '0'), +('3', '57', '5', '14703', '7150', '0'), +('3', '57', '5', '12800', '5789', '0'), +('3', '57', '5', '14700', '4806', '0'), +('3', '57', '5', '4501', '4799', '0'), +('3', '57', '8', '11621', '26579', '0'), +('3', '57', '8', '11551', '8753', '0'), +('3', '57', '8', '11603', '7879', '0'), +('3', '57', '8', '1409', '7747', '0'), +('3', '57', '6', '1557', '8270', '0'), +('3', '57', '6', '4302', '5083', '0'), +('3', '57', '6', '4402', '4164', '0'), +('3', '57', '6', '25062', '3672', '0'), +('3', '57', '17', '4832', '15743', '0'), +('3', '57', '17', '4852', '14150', '0'), +('3', '57', '17', '4342', '8332', '0'), +('3', '57', '17', '4309', '8225', '0'), +('3', '57', '7', '4343', '6596', '0'), +('3', '57', '7', '4833', '6478', '0'), +('3', '57', '7', '4853', '5413', '0'), +('3', '57', '7', '3152', '4861', '0'), +('3', '57', '9', '4834', '4408', '0'), +('3', '57', '9', '4311', '3746', '0'), +('3', '57', '9', '4854', '3727', '0'), +('3', '57', '9', '10149', '3630', '0'), +('3', '57', '15', '10366', '8054', '0'), +('3', '57', '15', '10151', '7200', '0'), +('3', '57', '15', '14679', '7010', '0'), +('3', '57', '15', '14678', '5708', '0'), +('3', '57', '20', '2716', '25067', '0'), +('3', '57', '20', '11601', '20459', '0'), +('3', '57', '20', '2919', '11825', '0'), +('3', '57', '20', '1365', '10500', '0'), +('3', '57', '12', '4835', '11330', '0'), +('3', '57', '12', '20655', '8847', '0'), +('3', '57', '12', '4855', '6953', '0'), +('3', '57', '12', '11624', '5854', '0'), +('3', '57', '18', '4836', '7764', '0'), +('3', '57', '18', '3155', '5987', '0'), +('3', '57', '18', '4856', '5488', '0'), +('3', '57', '18', '4346', '4645', '0'), +('3', '57', '19', '4837', '8003', '0'), +('3', '57', '19', '3156', '6822', '0'), +('3', '57', '19', '4857', '6602', '0'), +('3', '57', '19', '68239', '5830', '0'), +('3', '57', '13', '27961', '41950', '0'), +('3', '57', '13', '45120', '35593', '0'), +('3', '57', '13', '11050', '34872', '0'), +('3', '57', '13', '27895', '31606', '0'), +('3', '57', '14', '11632', '32053', '0'), +('3', '57', '14', '11551', '23853', '0'), +('3', '57', '14', '9428', '20353', '0'), +('3', '57', '14', '9403', '19410', '0'), +('3', '57', '11', '45137', '24736', '0'), +('3', '57', '11', '8408', '9931', '0'), +('3', '57', '11', '8325', '9888', '0'), +('3', '57', '11', '8811', '7735', '0'), +('3', '58', '22', '10323', '0', '0'), +('3', '58', '22', '66166', '0', '0'), +('3', '58', '22', '8567', '0', '0'), +('3', '58', '22', '9246', '0', '0'), +('3', '58', '1', '14701', '4854', '0'), +('3', '58', '1', '10082', '3673', '0'), +('3', '58', '1', '14702', '3550', '0'), +('3', '58', '1', '10165', '1940', '0'), +('3', '58', '2', '4301', '7726', '0'), +('3', '58', '2', '4851', '7445', '0'), +('3', '58', '2', '4620', '6340', '0'), +('3', '58', '2', '4831', '6040', '0'), +('3', '58', '3', '71529', '4696', '0'), +('3', '58', '3', '11052', '3153', '0'), +('3', '58', '3', '4505', '2981', '0'), +('3', '58', '3', '21002', '2114', '0'), +('3', '58', '5', '14703', '7150', '0'), +('3', '58', '5', '12800', '5807', '0'), +('3', '58', '5', '4501', '4846', '0'), +('3', '58', '5', '14700', '4806', '0'), +('3', '58', '8', '11621', '26579', '0'), +('3', '58', '8', '11551', '8753', '0'), +('3', '58', '8', '11603', '7912', '0'), +('3', '58', '8', '1409', '7747', '0'), +('3', '58', '6', '1557', '8270', '0'), +('3', '58', '6', '4302', '5120', '0'), +('3', '58', '6', '4402', '4189', '0'), +('3', '58', '6', '25062', '3672', '0'), +('3', '58', '17', '4832', '15834', '0'), +('3', '58', '17', '4852', '14237', '0'), +('3', '58', '17', '4342', '8368', '0'), +('3', '58', '17', '4309', '8225', '0'), +('3', '58', '7', '4343', '6656', '0'), +('3', '58', '7', '4833', '6478', '0'), +('3', '58', '7', '4853', '5413', '0'), +('3', '58', '7', '3152', '4883', '0'), +('3', '58', '9', '4834', '4408', '0'), +('3', '58', '9', '4311', '3788', '0'), +('3', '58', '9', '4854', '3727', '0'), +('3', '58', '9', '10149', '3641', '0'), +('3', '58', '15', '10366', '8054', '0'), +('3', '58', '15', '10151', '7200', '0'), +('3', '58', '15', '14679', '7010', '0'), +('3', '58', '15', '14678', '5708', '0'), +('3', '58', '20', '2716', '25089', '0'), +('3', '58', '20', '11601', '20519', '0'), +('3', '58', '20', '2919', '11843', '0'), +('3', '58', '20', '1365', '10500', '0'), +('3', '58', '12', '4835', '11360', '0'), +('3', '58', '12', '20655', '8866', '0'), +('3', '58', '12', '4855', '7001', '0'), +('3', '58', '12', '11624', '5896', '0'), +('3', '58', '18', '4836', '7795', '0'), +('3', '58', '18', '3155', '6024', '0'), +('3', '58', '18', '4856', '5488', '0'), +('3', '58', '18', '4346', '4645', '0'), +('3', '58', '19', '4837', '8021', '0'), +('3', '58', '19', '3156', '6822', '0'), +('3', '58', '19', '4857', '6632', '0'), +('3', '58', '19', '68239', '5841', '0'), +('3', '58', '13', '27961', '42291', '0'), +('3', '58', '13', '45120', '35878', '0'), +('3', '58', '13', '11050', '35097', '0'), +('3', '58', '13', '27895', '31851', '0'), +('3', '58', '14', '11632', '32144', '0'), +('3', '58', '14', '11551', '23853', '0'), +('3', '58', '14', '9428', '20353', '0'), +('3', '58', '14', '9403', '19428', '0'), +('3', '58', '11', '45137', '25290', '0'), +('3', '58', '11', '8408', '10006', '0'), +('3', '58', '11', '8325', '9973', '0'), +('3', '58', '11', '8811', '7792', '0'), +('3', '59', '22', '10323', '0', '0'), +('3', '59', '22', '66166', '0', '0'), +('3', '59', '22', '8567', '0', '0'), +('3', '59', '22', '9246', '0', '0'), +('3', '59', '1', '14701', '4854', '0'), +('3', '59', '1', '10082', '3695', '0'), +('3', '59', '1', '14702', '3550', '0'), +('3', '59', '1', '10165', '1940', '0'), +('3', '59', '2', '4301', '7726', '0'), +('3', '59', '2', '4851', '7471', '0'), +('3', '59', '2', '4620', '6382', '0'), +('3', '59', '2', '4831', '6040', '0'), +('3', '59', '3', '71529', '4721', '0'), +('3', '59', '3', '11052', '3207', '0'), +('3', '59', '3', '4505', '3007', '0'), +('3', '59', '3', '21002', '2114', '0'), +('3', '59', '5', '14703', '7150', '0'), +('3', '59', '5', '12800', '5826', '0'), +('3', '59', '5', '4501', '4894', '0'), +('3', '59', '5', '14700', '4806', '0'), +('3', '59', '8', '11621', '26579', '0'), +('3', '59', '8', '11551', '8753', '0'), +('3', '59', '8', '11603', '7944', '0'), +('3', '59', '8', '1409', '7747', '0'), +('3', '59', '6', '1557', '8270', '0'), +('3', '59', '6', '4302', '5156', '0'), +('3', '59', '6', '4402', '4215', '0'), +('3', '59', '6', '25062', '3672', '0'), +('3', '59', '17', '4832', '15924', '0'), +('3', '59', '17', '4852', '14324', '0'), +('3', '59', '17', '4342', '8405', '0'), +('3', '59', '17', '4309', '8225', '0'), +('3', '59', '7', '4343', '6716', '0'), +('3', '59', '7', '4833', '6478', '0'), +('3', '59', '7', '4853', '5413', '0'), +('3', '59', '7', '3152', '4905', '0'), +('3', '59', '9', '4834', '4408', '0'), +('3', '59', '9', '4311', '3831', '0'), +('3', '59', '9', '4854', '3727', '0'), +('3', '59', '9', '10149', '3651', '0'), +('3', '59', '15', '10366', '8054', '0'), +('3', '59', '15', '10151', '7200', '0'), +('3', '59', '15', '14679', '7010', '0'), +('3', '59', '15', '14678', '5708', '0'), +('3', '59', '20', '2716', '25111', '0'), +('3', '59', '20', '11601', '20580', '0'), +('3', '59', '20', '2919', '11862', '0'), +('3', '59', '20', '1365', '10500', '0'), +('3', '59', '12', '4835', '11390', '0'), +('3', '59', '12', '20655', '8886', '0'), +('3', '59', '12', '4855', '7050', '0'), +('3', '59', '12', '11624', '5939', '0'), +('3', '59', '18', '4836', '7825', '0'), +('3', '59', '18', '3155', '6060', '0'), +('3', '59', '18', '4856', '5488', '0'), +('3', '59', '18', '4346', '4645', '0'), +('3', '59', '19', '4837', '8039', '0'), +('3', '59', '19', '3156', '6822', '0'), +('3', '59', '19', '4857', '6662', '0'), +('3', '59', '19', '68239', '5852', '0'), +('3', '59', '13', '27961', '42662', '0'), +('3', '59', '13', '45120', '36163', '0'), +('3', '59', '13', '11050', '35351', '0'), +('3', '59', '13', '27895', '32096', '0'), +('3', '59', '14', '11632', '32234', '0'), +('3', '59', '14', '11551', '23853', '0'), +('3', '59', '14', '9428', '20353', '0'), +('3', '59', '14', '9403', '19446', '0'), +('3', '59', '11', '45137', '25903', '0'), +('3', '59', '11', '8408', '10091', '0'), +('3', '59', '11', '8325', '10049', '0'), +('3', '59', '11', '8811', '7858', '0'), +('3', '60', '22', '12425', '0', '3'), +('3', '60', '22', '21807', '0', '3'), +('3', '60', '22', '7867', '0', '3'), +('3', '60', '22', '9248', '0', '3'), +('3', '60', '1', '7945', '24244', '3'), +('3', '60', '1', '26775', '17213', '3'), +('3', '60', '1', '63170', '15188', '3'), +('3', '60', '1', '29861', '14863', '3'), +('3', '60', '2', '26025', '23578', '3'), +('3', '60', '2', '2612', '23578', '3'), +('3', '60', '2', '26759', '16725', '3'), +('3', '60', '2', '28986', '15931', '3'), +('3', '60', '3', '26773', '18328', '3'), +('3', '60', '3', '26751', '15694', '3'), +('3', '60', '3', '28942', '15677', '3'), +('3', '60', '3', '31233', '14447', '3'), +('3', '60', '5', '28885', '32303', '3'), +('3', '60', '5', '27266', '26858', '3'), +('3', '60', '5', '8364', '21521', '3'), +('3', '60', '5', '7868', '16201', '3'), +('3', '60', '8', '26765', '35824', '3'), +('3', '60', '8', '26766', '35221', '3'), +('3', '60', '8', '31471', '31262', '3'), +('3', '60', '8', '11621', '23502', '3'), +('3', '60', '6', '28902', '35353', '3'), +('3', '60', '6', '30551', '16198', '3'), +('3', '60', '6', '28919', '16003', '3'), +('3', '60', '6', '26753', '14103', '3'), +('3', '60', '17', '28937', '36633', '3'), +('3', '60', '17', '29457', '31574', '3'), +('3', '60', '17', '27261', '21544', '3'), +('3', '60', '17', '26770', '21157', '3'), +('3', '60', '7', '28926', '17157', '3'), +('3', '60', '7', '7868', '16201', '3'), +('3', '60', '7', '26584', '15464', '3'), +('3', '60', '7', '8288', '14679', '3'), +('3', '60', '9', '31461', '31535', '3'), +('3', '60', '9', '7868', '16201', '3'), +('3', '60', '9', '26584', '15464', '3'), +('3', '60', '9', '31460', '14460', '3'), +('3', '60', '15', '27950', '23112', '3'), +('3', '60', '15', '26749', '18731', '3'), +('3', '60', '15', '63170', '15188', '3'), +('3', '60', '15', '7870', '14838', '3'), +('3', '60', '20', '28890', '32481', '3'), +('3', '60', '20', '31235', '30777', '3'), +('3', '60', '20', '31334', '28637', '3'), +('3', '60', '20', '26551', '28467', '3'), +('3', '60', '12', '25857', '31789', '3'), +('3', '60', '12', '28967', '17425', '3'), +('3', '60', '12', '26774', '15515', '3'), +('3', '60', '12', '31227', '14849', '3'), +('3', '60', '18', '28965', '16777', '3'), +('3', '60', '18', '28932', '14440', '3'), +('3', '60', '18', '8289', '14363', '3'), +('3', '60', '18', '26755', '13446', '3'), +('3', '60', '19', '30569', '35336', '3'), +('3', '60', '19', '28888', '29918', '3'), +('3', '60', '19', '24616', '23667', '3'), +('3', '60', '19', '7871', '14495', '3'), +('3', '60', '13', '28824', '59097', '3'), +('3', '60', '13', '31317', '55295', '3'), +('3', '60', '13', '30530', '55185', '3'), +('3', '60', '13', '27949', '54773', '3'), +('3', '60', '14', '28915', '17804', '3'), +('3', '60', '14', '28970', '17072', '3'), +('3', '60', '14', '26754', '16539', '3'), +('3', '60', '14', '26564', '15019', '3'), +('3', '60', '11', '30539', '39113', '3'), +('3', '60', '11', '28935', '38821', '3'), +('3', '60', '11', '7904', '33938', '3'), +('3', '60', '11', '26563', '28789', '3'), +('3', '60', '22', '10323', '0', '2'), +('3', '60', '22', '66166', '0', '2'), +('3', '60', '22', '9248', '0', '2'), +('3', '60', '22', '12425', '0', '2'), +('3', '60', '1', '2748', '8505', '2'), +('3', '60', '1', '31236', '7910', '2'), +('3', '60', '1', '62234', '7566', '2'), +('3', '60', '1', '5716', '7282', '2'), +('3', '60', '2', '2612', '24841', '2'), +('3', '60', '2', '26025', '24841', '2'), +('3', '60', '2', '29648', '15872', '2'), +('3', '60', '2', '25194', '14332', '2'), +('3', '60', '3', '31233', '16893', '2'), +('3', '60', '3', '31244', '13528', '2'), +('3', '60', '3', '31464', '11799', '2'), +('3', '60', '3', '31378', '10704', '2'), +('3', '60', '5', '27266', '27927', '2'), +('3', '60', '5', '31460', '17033', '2'), +('3', '60', '5', '31234', '14313', '2'), +('3', '60', '5', '31318', '12586', '2'), +('3', '60', '8', '31471', '33357', '2'), +('3', '60', '8', '11621', '24015', '2'), +('3', '60', '8', '27261', '22966', '2'), +('3', '60', '8', '22819', '20515', '2'), +('3', '60', '6', '31472', '15751', '2'), +('3', '60', '6', '31240', '12056', '2'), +('3', '60', '6', '5723', '11985', '2'), +('3', '60', '6', '24070', '11840', '2'), +('3', '60', '17', '29457', '34284', '2'), +('3', '60', '17', '27261', '22966', '2'), +('3', '60', '17', '25044', '16146', '2'), +('3', '60', '17', '10845', '15516', '2'), +('3', '60', '7', '5723', '11985', '2'), +('3', '60', '7', '29485', '9381', '2'), +('3', '60', '7', '31381', '8594', '2'), +('3', '60', '7', '62361', '7369', '2'), +('3', '60', '9', '31461', '34358', '2'), +('3', '60', '9', '31460', '17033', '2'), +('3', '60', '9', '5723', '11985', '2'), +('3', '60', '9', '31246', '10994', '2'), +('3', '60', '15', '31231', '16135', '2'), +('3', '60', '15', '25211', '15717', '2'), +('3', '60', '15', '30388', '12552', '2'), +('3', '60', '15', '30385', '11489', '2'), +('3', '60', '20', '31235', '33519', '2'), +('3', '60', '20', '31334', '30483', '2'), +('3', '60', '20', '31353', '23039', '2'), +('3', '60', '20', '24753', '21368', '2'), +('3', '60', '12', '25857', '33662', '2'), +('3', '60', '12', '31227', '18308', '2'), +('3', '60', '12', '31306', '14608', '2'), +('3', '60', '12', '29177', '14000', '2'), +('3', '60', '18', '25375', '9767', '2'), +('3', '60', '18', '31124', '8914', '2'), +('3', '60', '18', '31332', '8519', '2'), +('3', '60', '18', '31310', '7898', '2'), +('3', '60', '19', '24616', '24328', '2'), +('3', '60', '19', '25197', '10472', '2'), +('3', '60', '19', '62371', '9344', '2'), +('3', '60', '19', '29455', '8714', '2'), +('3', '60', '13', '31317', '56800', '2'), +('3', '60', '13', '31304', '55907', '2'), +('3', '60', '13', '2580', '54951', '2'), +('3', '60', '13', '31232', '52692', '2'), +('3', '60', '14', '31462', '19461', '2'), +('3', '60', '14', '31316', '16393', '2'), +('3', '60', '14', '25098', '15669', '2'), +('3', '60', '14', '31212', '15460', '2'), +('3', '60', '11', '29433', '24937', '2'), +('3', '60', '11', '27326', '24937', '2'), +('3', '60', '11', '31469', '24519', '2'), +('3', '60', '11', '45137', '22934', '2'), +('3', '60', '22', '8567', '0', '1'), +('3', '60', '22', '10323', '0', '1'), +('3', '60', '22', '66166', '0', '1'), +('3', '60', '22', '8502', '0', '1'), +('3', '60', '1', '62234', '9304', '1'), +('3', '60', '1', '10912', '7732', '1'), +('3', '60', '1', '5716', '6448', '1'), +('3', '60', '1', '5704', '5996', '1'), +('3', '60', '2', '10913', '17204', '1'), +('3', '60', '2', '1630', '9391', '1'), +('3', '60', '2', '50036', '8701', '1'), +('3', '60', '2', '4301', '6117', '1'), +('3', '60', '3', '46184', '8234', '1'), +('3', '60', '3', '1625', '5704', '1'), +('3', '60', '3', '5712', '3970', '1'), +('3', '60', '3', '3201', '3359', '1'), +('3', '60', '5', '14703', '7150', '1'), +('3', '60', '5', '8285', '4776', '1'), +('3', '60', '5', '14709', '4672', '1'), +('3', '60', '5', '14700', '4435', '1'), +('3', '60', '8', '11621', '25297', '1'), +('3', '60', '8', '1627', '21600', '1'), +('3', '60', '8', '1619', '21565', '1'), +('3', '60', '8', '1628', '14756', '1'), +('3', '60', '6', '5723', '14109', '1'), +('3', '60', '6', '5706', '8883', '1'), +('3', '60', '6', '1557', '7033', '1'), +('3', '60', '6', '11975', '4439', '1'), +('3', '60', '17', '10845', '19525', '1'), +('3', '60', '17', '4544', '10216', '1'), +('3', '60', '17', '4832', '9453', '1'), +('3', '60', '17', '4852', '8506', '1'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '60', '7', '5723', '14109', '1'), +('3', '60', '7', '62046', '6309', '1'), +('3', '60', '7', '4295', '4590', '1'), +('3', '60', '7', '4343', '4000', '1'), +('3', '60', '9', '5723', '14109', '1'), +('3', '60', '9', '5794', '3858', '1'), +('3', '60', '9', '4294', '3594', '1'), +('3', '60', '9', '4834', '2860', '1'), +('3', '60', '15', '5727', '12068', '1'), +('3', '60', '15', '5728', '8335', '1'), +('3', '60', '15', '10366', '8032', '1'), +('3', '60', '15', '10151', '7200', '1'), +('3', '60', '20', '2716', '23234', '1'), +('3', '60', '20', '1620', '19712', '1'), +('3', '60', '20', '11601', '18534', '1'), +('3', '60', '20', '1623', '12357', '1'), +('3', '60', '12', '4835', '8790', '1'), +('3', '60', '12', '20655', '6444', '1'), +('3', '60', '12', '3255', '4383', '1'), +('3', '60', '12', '4855', '4312', '1'), +('3', '60', '18', '4548', '9902', '1'), +('3', '60', '18', '11612', '5184', '1'), +('3', '60', '18', '4836', '4636', '1'), +('3', '60', '18', '3155', '3721', '1'), +('3', '60', '19', '24616', '25981', '1'), +('3', '60', '19', '3156', '5461', '1'), +('3', '60', '19', '4837', '5125', '1'), +('3', '60', '19', '4318', '4434', '1'), +('3', '60', '13', '10099', '46642', '1'), +('3', '60', '13', '27961', '41938', '1'), +('3', '60', '13', '5603', '38904', '1'), +('3', '60', '13', '45120', '35179', '1'), +('3', '60', '14', '10851', '26399', '1'), +('3', '60', '14', '11632', '21128', '1'), +('3', '60', '14', '9205', '19322', '1'), +('3', '60', '14', '9030', '18369', '1'), +('3', '60', '11', '45137', '24702', '1'), +('3', '60', '11', '5758', '17640', '1'), +('3', '60', '11', '8325', '10134', '1'), +('3', '60', '11', '8408', '10083', '1'), +('3', '61', '22', '12425', '0', '3'), +('3', '61', '22', '21807', '0', '3'), +('3', '61', '22', '7867', '0', '3'), +('3', '61', '22', '9248', '0', '3'), +('3', '61', '1', '7945', '24245', '3'), +('3', '61', '1', '26775', '17215', '3'), +('3', '61', '1', '63170', '15139', '3'), +('3', '61', '1', '29861', '14867', '3'), +('3', '61', '2', '26025', '23579', '3'), +('3', '61', '2', '2612', '23579', '3'), +('3', '61', '2', '26759', '16725', '3'), +('3', '61', '2', '28986', '15934', '3'), +('3', '61', '3', '26773', '18331', '3'), +('3', '61', '3', '26751', '15695', '3'), +('3', '61', '3', '28942', '15679', '3'), +('3', '61', '3', '31233', '14449', '3'), +('3', '61', '5', '28885', '32304', '3'), +('3', '61', '5', '27266', '26859', '3'), +('3', '61', '5', '8364', '21523', '3'), +('3', '61', '5', '7868', '16202', '3'), +('3', '61', '8', '26765', '35824', '3'), +('3', '61', '8', '26766', '35223', '3'), +('3', '61', '8', '31471', '31263', '3'), +('3', '61', '8', '11621', '23502', '3'), +('3', '61', '6', '28902', '35355', '3'), +('3', '61', '6', '30551', '16200', '3'), +('3', '61', '6', '28919', '16005', '3'), +('3', '61', '6', '26753', '14103', '3'), +('3', '61', '17', '28937', '36635', '3'), +('3', '61', '17', '29457', '31574', '3'), +('3', '61', '17', '27261', '21545', '3'), +('3', '61', '17', '26770', '21160', '3'), +('3', '61', '7', '28926', '17157', '3'), +('3', '61', '7', '7868', '16202', '3'), +('3', '61', '7', '26584', '15467', '3'), +('3', '61', '7', '8288', '14679', '3'), +('3', '61', '9', '31461', '31537', '3'), +('3', '61', '9', '7868', '16202', '3'), +('3', '61', '9', '26584', '15467', '3'), +('3', '61', '9', '31460', '14461', '3'), +('3', '61', '15', '27950', '23113', '3'), +('3', '61', '15', '26749', '18734', '3'), +('3', '61', '15', '63170', '15139', '3'), +('3', '61', '15', '7870', '14839', '3'), +('3', '61', '20', '28890', '32481', '3'), +('3', '61', '20', '31235', '30779', '3'), +('3', '61', '20', '31334', '28637', '3'), +('3', '61', '20', '26551', '28469', '3'), +('3', '61', '12', '25857', '31790', '3'), +('3', '61', '12', '28967', '17425', '3'), +('3', '61', '12', '26774', '15517', '3'), +('3', '61', '12', '31227', '14852', '3'), +('3', '61', '18', '28965', '16779', '3'), +('3', '61', '18', '28932', '14443', '3'), +('3', '61', '18', '8289', '14364', '3'), +('3', '61', '18', '26755', '13446', '3'), +('3', '61', '19', '30569', '35337', '3'), +('3', '61', '19', '28888', '29919', '3'), +('3', '61', '19', '24616', '23667', '3'), +('3', '61', '19', '7871', '14498', '3'), +('3', '61', '13', '28824', '59296', '3'), +('3', '61', '13', '31317', '55325', '3'), +('3', '61', '13', '30530', '55243', '3'), +('3', '61', '13', '27949', '54830', '3'), +('3', '61', '14', '28915', '17805', '3'), +('3', '61', '14', '28970', '17073', '3'), +('3', '61', '14', '26754', '16541', '3'), +('3', '61', '14', '26564', '15023', '3'), +('3', '61', '11', '30539', '39217', '3'), +('3', '61', '11', '28935', '38929', '3'), +('3', '61', '11', '7904', '33966', '3'), +('3', '61', '11', '26563', '28790', '3'), +('3', '62', '22', '12425', '0', '3'), +('3', '62', '22', '21807', '0', '3'), +('3', '62', '22', '7867', '0', '3'), +('3', '62', '22', '9248', '0', '3'), +('3', '62', '1', '7945', '24245', '3'), +('3', '62', '1', '26775', '17217', '3'), +('3', '62', '1', '63170', '15091', '3'), +('3', '62', '1', '29861', '14871', '3'), +('3', '62', '2', '26025', '23580', '3'), +('3', '62', '2', '2612', '23580', '3'), +('3', '62', '2', '26759', '16725', '3'), +('3', '62', '2', '28986', '15938', '3'), +('3', '62', '3', '26773', '18334', '3'), +('3', '62', '3', '26751', '15696', '3'), +('3', '62', '3', '28942', '15681', '3'), +('3', '62', '3', '31233', '14450', '3'), +('3', '62', '5', '28885', '32305', '3'), +('3', '62', '5', '27266', '26860', '3'), +('3', '62', '5', '8364', '21526', '3'), +('3', '62', '5', '7868', '16204', '3'), +('3', '62', '8', '26765', '35825', '3'), +('3', '62', '8', '26766', '35226', '3'), +('3', '62', '8', '31471', '31265', '3'), +('3', '62', '8', '11621', '23502', '3'), +('3', '62', '6', '28902', '35357', '3'), +('3', '62', '6', '30551', '16201', '3'), +('3', '62', '6', '28919', '16007', '3'), +('3', '62', '6', '26753', '14103', '3'), +('3', '62', '17', '28937', '36636', '3'), +('3', '62', '17', '29457', '31574', '3'), +('3', '62', '17', '27261', '21546', '3'), +('3', '62', '17', '26770', '21164', '3'), +('3', '62', '7', '28926', '17158', '3'), +('3', '62', '7', '7868', '16204', '3'), +('3', '62', '7', '26584', '15469', '3'), +('3', '62', '7', '8288', '14679', '3'), +('3', '62', '9', '31461', '31538', '3'), +('3', '62', '9', '7868', '16204', '3'), +('3', '62', '9', '26584', '15469', '3'), +('3', '62', '9', '31460', '14463', '3'), +('3', '62', '15', '27950', '23114', '3'), +('3', '62', '15', '26749', '18736', '3'), +('3', '62', '15', '63170', '15091', '3'), +('3', '62', '15', '7870', '14839', '3'), +('3', '62', '20', '28890', '32481', '3'), +('3', '62', '20', '31235', '30781', '3'), +('3', '62', '20', '31334', '28638', '3'), +('3', '62', '20', '26551', '28471', '3'), +('3', '62', '12', '25857', '31790', '3'), +('3', '62', '12', '28967', '17425', '3'), +('3', '62', '12', '26774', '15518', '3'), +('3', '62', '12', '31227', '14854', '3'), +('3', '62', '18', '28965', '16781', '3'), +('3', '62', '18', '28932', '14446', '3'), +('3', '62', '18', '8289', '14364', '3'), +('3', '62', '18', '26755', '13446', '3'), +('3', '62', '19', '30569', '35338', '3'), +('3', '62', '19', '28888', '29920', '3'), +('3', '62', '19', '24616', '23667', '3'), +('3', '62', '19', '7871', '14501', '3'), +('3', '62', '13', '28824', '59495', '3'), +('3', '62', '13', '31317', '55383', '3'), +('3', '62', '13', '30530', '55301', '3'), +('3', '62', '13', '31304', '54920', '3'), +('3', '62', '14', '28915', '17806', '3'), +('3', '62', '14', '28970', '17075', '3'), +('3', '62', '14', '26754', '16544', '3'), +('3', '62', '14', '26564', '15027', '3'), +('3', '62', '11', '30539', '39320', '3'), +('3', '62', '11', '28935', '39029', '3'), +('3', '62', '11', '7904', '33985', '3'), +('3', '62', '11', '26563', '28791', '3'), +('3', '63', '22', '12425', '0', '3'), +('3', '63', '22', '21807', '0', '3'), +('3', '63', '22', '7867', '0', '3'), +('3', '63', '22', '9248', '0', '3'), +('3', '63', '1', '7945', '24246', '3'), +('3', '63', '1', '26775', '17218', '3'), +('3', '63', '1', '63170', '15043', '3'), +('3', '63', '1', '29861', '14875', '3'), +('3', '63', '2', '26025', '23580', '3'), +('3', '63', '2', '2612', '23580', '3'), +('3', '63', '2', '26759', '16725', '3'), +('3', '63', '2', '28986', '15941', '3'), +('3', '63', '3', '26773', '18337', '3'), +('3', '63', '3', '26751', '15697', '3'), +('3', '63', '3', '28942', '15682', '3'), +('3', '63', '3', '31233', '14452', '3'), +('3', '63', '5', '28885', '32307', '3'), +('3', '63', '5', '27266', '26861', '3'), +('3', '63', '5', '8364', '21528', '3'), +('3', '63', '5', '7868', '16205', '3'), +('3', '63', '8', '26765', '35826', '3'), +('3', '63', '8', '26766', '35228', '3'), +('3', '63', '8', '31471', '31266', '3'), +('3', '63', '8', '11621', '23502', '3'), +('3', '63', '6', '28902', '35358', '3'), +('3', '63', '6', '30551', '16202', '3'), +('3', '63', '6', '28919', '16009', '3'), +('3', '63', '6', '26753', '14103', '3'), +('3', '63', '17', '28937', '36638', '3'), +('3', '63', '17', '29457', '31574', '3'), +('3', '63', '17', '27261', '21548', '3'), +('3', '63', '17', '26770', '21167', '3'), +('3', '63', '7', '28926', '17158', '3'), +('3', '63', '7', '7868', '16205', '3'), +('3', '63', '7', '26584', '15471', '3'), +('3', '63', '7', '8288', '14679', '3'), +('3', '63', '9', '31461', '31540', '3'), +('3', '63', '9', '7868', '16205', '3'), +('3', '63', '9', '26584', '15471', '3'), +('3', '63', '9', '31460', '14465', '3'), +('3', '63', '15', '27950', '23115', '3'), +('3', '63', '15', '26749', '18739', '3'), +('3', '63', '15', '63170', '15043', '3'), +('3', '63', '15', '7870', '14840', '3'), +('3', '63', '20', '28890', '32481', '3'), +('3', '63', '20', '31235', '30783', '3'), +('3', '63', '20', '31334', '28639', '3'), +('3', '63', '20', '26551', '28473', '3'), +('3', '63', '12', '25857', '31791', '3'), +('3', '63', '12', '28967', '17425', '3'), +('3', '63', '12', '26774', '15520', '3'), +('3', '63', '12', '31227', '14857', '3'), +('3', '63', '18', '28965', '16783', '3'), +('3', '63', '18', '28932', '14448', '3'), +('3', '63', '18', '8289', '14365', '3'), +('3', '63', '18', '26755', '13446', '3'), +('3', '63', '19', '30569', '35339', '3'), +('3', '63', '19', '28888', '29921', '3'), +('3', '63', '19', '24616', '23667', '3'), +('3', '63', '19', '7871', '14504', '3'), +('3', '63', '13', '28824', '59693', '3'), +('3', '63', '13', '31317', '55441', '3'), +('3', '63', '13', '30530', '55359', '3'), +('3', '63', '13', '31304', '55205', '3'), +('3', '63', '14', '28915', '17807', '3'), +('3', '63', '14', '28970', '17076', '3'), +('3', '63', '14', '26754', '16547', '3'), +('3', '63', '14', '26564', '15031', '3'), +('3', '63', '11', '30539', '39415', '3'), +('3', '63', '11', '28935', '39138', '3'), +('3', '63', '11', '7904', '34013', '3'), +('3', '63', '11', '26563', '28792', '3'), +('3', '64', '22', '12425', '0', '3'), +('3', '64', '22', '21807', '0', '3'), +('3', '64', '22', '7867', '0', '3'), +('3', '64', '22', '9248', '0', '3'), +('3', '64', '1', '7945', '24246', '3'), +('3', '64', '1', '26775', '17220', '3'), +('3', '64', '1', '63170', '14994', '3'), +('3', '64', '1', '29861', '14879', '3'), +('3', '64', '2', '26025', '23581', '3'), +('3', '64', '2', '2612', '23581', '3'), +('3', '64', '2', '26759', '16725', '3'), +('3', '64', '2', '28986', '15945', '3'), +('3', '64', '3', '26773', '18340', '3'), +('3', '64', '3', '26751', '15698', '3'), +('3', '64', '3', '28942', '15684', '3'), +('3', '64', '3', '31233', '14454', '3'), +('3', '64', '5', '28885', '32308', '3'), +('3', '64', '5', '27266', '26863', '3'), +('3', '64', '5', '8364', '21530', '3'), +('3', '64', '5', '7868', '16206', '3'), +('3', '64', '8', '26765', '35827', '3'), +('3', '64', '8', '26766', '35230', '3'), +('3', '64', '8', '31471', '31268', '3'), +('3', '64', '8', '11621', '23502', '3'), +('3', '64', '6', '28902', '35360', '3'), +('3', '64', '6', '30551', '16203', '3'), +('3', '64', '6', '28919', '16011', '3'), +('3', '64', '6', '26753', '14103', '3'), +('3', '64', '17', '28937', '36639', '3'), +('3', '64', '17', '29457', '31574', '3'), +('3', '64', '17', '27261', '21549', '3'), +('3', '64', '17', '26770', '21171', '3'), +('3', '64', '7', '28926', '17159', '3'), +('3', '64', '7', '7868', '16206', '3'), +('3', '64', '7', '26584', '15473', '3'), +('3', '64', '7', '8288', '14679', '3'), +('3', '64', '9', '31461', '31542', '3'), +('3', '64', '9', '7868', '16206', '3'), +('3', '64', '9', '26584', '15473', '3'), +('3', '64', '9', '31460', '14466', '3'), +('3', '64', '15', '27950', '23116', '3'), +('3', '64', '15', '26749', '18741', '3'), +('3', '64', '15', '63170', '14994', '3'), +('3', '64', '15', '7870', '14840', '3'), +('3', '64', '20', '28890', '32481', '3'), +('3', '64', '20', '31235', '30785', '3'), +('3', '64', '20', '31334', '28640', '3'), +('3', '64', '20', '26551', '28475', '3'), +('3', '64', '12', '25857', '31791', '3'), +('3', '64', '12', '28967', '17425', '3'), +('3', '64', '12', '26774', '15521', '3'), +('3', '64', '12', '31227', '14859', '3'), +('3', '64', '18', '28965', '16785', '3'), +('3', '64', '18', '28932', '14451', '3'), +('3', '64', '18', '8289', '14365', '3'), +('3', '64', '18', '26755', '13446', '3'), +('3', '64', '19', '30569', '35340', '3'), +('3', '64', '19', '28888', '29923', '3'), +('3', '64', '19', '24616', '23667', '3'), +('3', '64', '19', '7871', '14507', '3'), +('3', '64', '13', '28824', '59892', '3'), +('3', '64', '13', '31317', '55499', '3'), +('3', '64', '13', '31304', '55462', '3'), +('3', '64', '13', '30530', '55446', '3'), +('3', '64', '14', '28915', '17808', '3'), +('3', '64', '14', '28970', '17077', '3'), +('3', '64', '14', '26754', '16549', '3'), +('3', '64', '14', '26564', '15035', '3'), +('3', '64', '11', '30539', '39518', '3'), +('3', '64', '11', '28935', '39237', '3'), +('3', '64', '11', '7904', '34032', '3'), +('3', '64', '11', '26563', '28793', '3'), +('3', '65', '22', '21807', '0', '7'), +('3', '65', '22', '21805', '0', '7'), +('3', '65', '22', '12425', '0', '7'), +('3', '65', '22', '7867', '0', '7'), +('3', '65', '1', '68949', '57893', '7'), +('3', '65', '1', '7125', '45981', '7'), +('3', '65', '1', '32106', '42957', '7'), +('3', '65', '1', '69166', '41676', '7'), +('3', '65', '2', '28647', '46586', '7'), +('3', '65', '2', '28605', '45755', '7'), +('3', '65', '2', '28648', '45617', '7'), +('3', '65', '2', '69087', '35166', '7'), +('3', '65', '3', '69068', '44795', '7'), +('3', '65', '3', '69157', '39116', '7'), +('3', '65', '3', '69069', '35731', '7'), +('3', '65', '3', '69074', '34774', '7'), +('3', '65', '5', '69097', '46301', '7'), +('3', '65', '5', '68950', '46127', '7'), +('3', '65', '5', '67625', '42249', '7'), +('3', '65', '5', '69135', '39816', '7'), +('3', '65', '8', '69064', '70107', '7'), +('3', '65', '8', '69165', '63766', '7'), +('3', '65', '8', '69072', '58310', '7'), +('3', '65', '8', '69065', '36441', '7'), +('3', '65', '6', '68757', '53726', '7'), +('3', '65', '6', '13674', '49419', '7'), +('3', '65', '6', '69073', '40486', '7'), +('3', '65', '6', '69130', '39942', '7'), +('3', '65', '17', '69150', '44527', '7'), +('3', '65', '17', '47644', '36678', '7'), +('3', '65', '17', '28937', '36641', '7'), +('3', '65', '17', '68748', '35909', '7'), +('3', '65', '7', '16097', '40973', '7'), +('3', '65', '7', '68861', '38481', '7'), +('3', '65', '7', '69168', '38034', '7'), +('3', '65', '7', '69079', '34889', '7'), +('3', '65', '9', '69126', '50595', '7'), +('3', '65', '9', '68766', '44833', '7'), +('3', '65', '9', '16097', '40973', '7'), +('3', '65', '9', '11103', '39837', '7'), +('3', '65', '15', '69160', '49628', '7'), +('3', '65', '15', '9959', '39686', '7'), +('3', '65', '15', '68111', '39404', '7'), +('3', '65', '15', '69131', '38913', '7'), +('3', '65', '20', '16156', '54726', '7'), +('3', '65', '20', '69134', '42916', '7'), +('3', '65', '20', '67625', '42249', '7'), +('3', '65', '20', '16097', '40973', '7'), +('3', '65', '12', '69252', '40113', '7'), +('3', '65', '12', '69083', '34758', '7'), +('3', '65', '12', '25857', '31792', '7'), +('3', '65', '12', '68862', '30246', '7'), +('3', '65', '18', '69146', '42536', '7'), +('3', '65', '18', '68965', '33262', '7'), +('3', '65', '18', '68779', '32368', '7'), +('3', '65', '18', '28650', '30369', '7'), +('3', '65', '19', '19094', '39499', '7'), +('3', '65', '19', '69177', '39380', '7'), +('3', '65', '19', '69075', '35737', '7'), +('3', '65', '19', '30569', '35341', '7'), +('3', '65', '13', '69053', '102744', '7'), +('3', '65', '13', '68835', '97227', '7'), +('3', '65', '13', '69112', '97108', '7'), +('3', '65', '13', '69043', '95725', '7'), +('3', '65', '14', '69155', '49228', '7'), +('3', '65', '14', '69161', '45996', '7'), +('3', '65', '14', '69049', '39748', '7'), +('3', '65', '14', '69048', '36750', '7'), +('3', '65', '11', '69054', '61441', '7'), +('3', '65', '11', '27818', '47872', '7'), +('3', '65', '11', '68662', '46451', '7'), +('3', '65', '11', '27986', '41373', '7'), +('3', '65', '22', '21807', '0', '6'), +('3', '65', '22', '21805', '0', '6'), +('3', '65', '22', '12425', '0', '6'), +('3', '65', '22', '7867', '0', '6'), +('3', '65', '1', '7125', '45981', '6'), +('3', '65', '1', '32106', '42957', '6'), +('3', '65', '1', '7123', '31250', '6'), +('3', '65', '1', '4119', '26493', '6'), +('3', '65', '2', '28647', '46586', '6'), +('3', '65', '2', '28605', '45755', '6'), +('3', '65', '2', '28648', '45617', '6'), +('3', '65', '2', '2612', '23582', '6'), +('3', '65', '3', '26982', '29207', '6'), +('3', '65', '3', '9435', '26549', '6'), +('3', '65', '3', '26983', '24781', '6'), +('3', '65', '3', '29174', '24688', '6'), +('3', '65', '5', '7769', '35882', '6'), +('3', '65', '5', '28885', '32309', '6'), +('3', '65', '5', '8977', '28686', '6'), +('3', '65', '5', '8785', '27980', '6'), +('3', '65', '8', '26765', '35828', '6'), +('3', '65', '8', '26766', '35233', '6'), +('3', '65', '8', '15803', '32856', '6'), +('3', '65', '8', '31471', '31269', '6'), +('3', '65', '6', '13674', '49419', '6'), +('3', '65', '6', '19144', '39239', '6'), +('3', '65', '6', '28902', '35361', '6'), +('3', '65', '6', '71006', '33397', '6'), +('3', '65', '17', '47644', '36678', '6'), +('3', '65', '17', '28937', '36641', '6'), +('3', '65', '17', '29457', '31574', '6'), +('3', '65', '17', '15002', '25357', '6'), +('3', '65', '7', '16097', '40973', '6'), +('3', '65', '7', '11438', '25881', '6'), +('3', '65', '7', '21995', '25513', '6'), +('3', '65', '7', '68089', '22550', '6'), +('3', '65', '9', '16097', '40973', '6'), +('3', '65', '9', '11103', '39837', '6'), +('3', '65', '9', '31461', '31543', '6'), +('3', '65', '9', '32100', '30035', '6'), +('3', '65', '15', '9959', '39686', '6'), +('3', '65', '15', '68111', '39404', '6'), +('3', '65', '15', '26989', '30398', '6'), +('3', '65', '15', '10948', '27089', '6'), +('3', '65', '20', '16156', '54726', '6'), +('3', '65', '20', '16097', '40973', '6'), +('3', '65', '20', '15873', '38167', '6'), +('3', '65', '20', '28890', '32481', '6'), +('3', '65', '12', '25857', '31792', '6'), +('3', '65', '12', '28246', '29198', '6'), +('3', '65', '12', '27000', '27936', '6'), +('3', '65', '12', '27990', '22952', '6'), +('3', '65', '18', '28650', '30369', '6'), +('3', '65', '18', '16757', '24629', '6'), +('3', '65', '18', '28965', '16787', '6'), +('3', '65', '18', '68143', '15770', '6'), +('3', '65', '19', '19094', '39499', '6'), +('3', '65', '19', '30569', '35341', '6'), +('3', '65', '19', '28888', '29924', '6'), +('3', '65', '19', '25995', '28474', '6'), +('3', '65', '13', '26092', '88496', '6'), +('3', '65', '13', '23498', '83540', '6'), +('3', '65', '13', '24879', '76830', '6'), +('3', '65', '13', '29172', '73400', '6'), +('3', '65', '14', '27298', '34264', '6'), +('3', '65', '14', '28656', '25831', '6'), +('3', '65', '14', '28657', '24520', '6'), +('3', '65', '14', '68119', '23311', '6'), +('3', '65', '11', '27818', '47872', '6'), +('3', '65', '11', '27986', '41373', '6'), +('3', '65', '11', '29596', '40320', '6'), +('3', '65', '11', '30539', '39994', '6'), +('3', '65', '22', '21805', '0', '5'), +('3', '65', '22', '61948', '0', '5'), +('3', '65', '22', '21807', '0', '5'), +('3', '65', '22', '12425', '0', '5'), +('3', '65', '1', '7125', '45981', '5'), +('3', '65', '1', '32106', '42957', '5'), +('3', '65', '1', '7123', '31250', '5'), +('3', '65', '1', '4119', '26493', '5'), +('3', '65', '2', '28647', '46586', '5'), +('3', '65', '2', '28605', '45755', '5'), +('3', '65', '2', '28648', '45617', '5'), +('3', '65', '2', '2612', '23582', '5'), +('3', '65', '3', '26982', '29207', '5'), +('3', '65', '3', '9435', '26549', '5'), +('3', '65', '3', '26983', '24781', '5'), +('3', '65', '3', '29174', '24688', '5'), +('3', '65', '5', '7769', '35882', '5'), +('3', '65', '5', '28885', '32309', '5'), +('3', '65', '5', '8977', '28686', '5'), +('3', '65', '5', '8785', '27980', '5'), +('3', '65', '8', '26765', '35828', '5'), +('3', '65', '8', '26766', '35233', '5'), +('3', '65', '8', '15803', '32856', '5'), +('3', '65', '8', '31471', '31269', '5'), +('3', '65', '6', '13674', '49419', '5'), +('3', '65', '6', '19144', '39239', '5'), +('3', '65', '6', '28902', '35361', '5'), +('3', '65', '6', '71006', '33397', '5'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '65', '17', '47644', '36678', '5'), +('3', '65', '17', '28937', '36641', '5'), +('3', '65', '17', '29457', '31574', '5'), +('3', '65', '17', '15002', '25357', '5'), +('3', '65', '7', '16097', '40973', '5'), +('3', '65', '7', '11438', '25881', '5'), +('3', '65', '7', '21995', '25513', '5'), +('3', '65', '7', '27648', '18248', '5'), +('3', '65', '9', '16097', '40973', '5'), +('3', '65', '9', '11103', '39837', '5'), +('3', '65', '9', '31461', '31543', '5'), +('3', '65', '9', '32100', '30035', '5'), +('3', '65', '15', '9959', '39686', '5'), +('3', '65', '15', '26989', '30398', '5'), +('3', '65', '15', '10948', '27089', '5'), +('3', '65', '15', '26993', '26727', '5'), +('3', '65', '20', '16156', '54726', '5'), +('3', '65', '20', '16097', '40973', '5'), +('3', '65', '20', '15873', '38167', '5'), +('3', '65', '20', '28890', '32481', '5'), +('3', '65', '12', '25857', '31792', '5'), +('3', '65', '12', '28246', '29198', '5'), +('3', '65', '12', '27000', '27936', '5'), +('3', '65', '12', '27990', '22952', '5'), +('3', '65', '18', '28650', '30369', '5'), +('3', '65', '18', '16757', '24629', '5'), +('3', '65', '18', '28965', '16787', '5'), +('3', '65', '18', '28932', '14454', '5'), +('3', '65', '19', '19094', '39499', '5'), +('3', '65', '19', '30569', '35341', '5'), +('3', '65', '19', '28888', '29924', '5'), +('3', '65', '19', '25995', '28474', '5'), +('3', '65', '13', '26092', '88496', '5'), +('3', '65', '13', '23498', '83540', '5'), +('3', '65', '13', '24879', '76830', '5'), +('3', '65', '13', '29172', '73400', '5'), +('3', '65', '14', '27298', '34264', '5'), +('3', '65', '14', '28656', '25831', '5'), +('3', '65', '14', '28657', '24520', '5'), +('3', '65', '14', '26788', '22261', '5'), +('3', '65', '11', '27818', '47872', '5'), +('3', '65', '11', '27986', '41373', '5'), +('3', '65', '11', '29596', '40320', '5'), +('3', '65', '11', '30539', '39994', '5'), +('3', '65', '22', '21805', '0', '4'), +('3', '65', '22', '61948', '0', '4'), +('3', '65', '22', '21807', '0', '4'), +('3', '65', '22', '12425', '0', '4'), +('3', '65', '1', '7125', '45981', '4'), +('3', '65', '1', '32106', '42957', '4'), +('3', '65', '1', '7123', '31250', '4'), +('3', '65', '1', '4119', '26493', '4'), +('3', '65', '2', '28647', '46586', '4'), +('3', '65', '2', '28605', '45755', '4'), +('3', '65', '2', '28648', '45617', '4'), +('3', '65', '2', '26025', '23582', '4'), +('3', '65', '3', '26982', '29207', '4'), +('3', '65', '3', '9435', '26549', '4'), +('3', '65', '3', '26983', '24781', '4'), +('3', '65', '3', '29174', '24688', '4'), +('3', '65', '5', '7769', '35882', '4'), +('3', '65', '5', '28885', '32309', '4'), +('3', '65', '5', '8977', '28686', '4'), +('3', '65', '5', '8785', '27980', '4'), +('3', '65', '8', '26765', '35828', '4'), +('3', '65', '8', '26766', '35233', '4'), +('3', '65', '8', '15803', '32856', '4'), +('3', '65', '8', '31471', '31269', '4'), +('3', '65', '6', '13674', '49419', '4'), +('3', '65', '6', '19144', '39239', '4'), +('3', '65', '6', '28902', '35361', '4'), +('3', '65', '6', '71006', '33397', '4'), +('3', '65', '17', '47644', '36678', '4'), +('3', '65', '17', '28937', '36641', '4'), +('3', '65', '17', '29457', '31574', '4'), +('3', '65', '17', '15002', '25357', '4'), +('3', '65', '7', '16097', '40973', '4'), +('3', '65', '7', '11438', '25881', '4'), +('3', '65', '7', '21995', '25513', '4'), +('3', '65', '7', '27648', '18248', '4'), +('3', '65', '9', '16097', '40973', '4'), +('3', '65', '9', '11103', '39837', '4'), +('3', '65', '9', '31461', '31543', '4'), +('3', '65', '9', '32100', '30035', '4'), +('3', '65', '15', '9959', '39686', '4'), +('3', '65', '15', '26989', '30398', '4'), +('3', '65', '15', '10948', '27089', '4'), +('3', '65', '15', '26993', '26727', '4'), +('3', '65', '20', '16156', '54726', '4'), +('3', '65', '20', '16097', '40973', '4'), +('3', '65', '20', '15873', '38167', '4'), +('3', '65', '20', '28890', '32481', '4'), +('3', '65', '12', '25857', '31792', '4'), +('3', '65', '12', '28246', '29198', '4'), +('3', '65', '12', '27000', '27936', '4'), +('3', '65', '12', '27990', '22952', '4'), +('3', '65', '18', '28650', '30369', '4'), +('3', '65', '18', '16757', '24629', '4'), +('3', '65', '18', '28965', '16787', '4'), +('3', '65', '18', '28932', '14454', '4'), +('3', '65', '19', '19094', '39499', '4'), +('3', '65', '19', '30569', '35341', '4'), +('3', '65', '19', '28888', '29924', '4'), +('3', '65', '19', '25995', '28474', '4'), +('3', '65', '13', '26092', '88496', '4'), +('3', '65', '13', '23498', '83540', '4'), +('3', '65', '13', '24879', '76830', '4'), +('3', '65', '13', '29172', '73400', '4'), +('3', '65', '14', '27298', '34264', '4'), +('3', '65', '14', '28656', '25831', '4'), +('3', '65', '14', '28657', '24520', '4'), +('3', '65', '14', '26788', '22261', '4'), +('3', '65', '11', '27818', '47872', '4'), +('3', '65', '11', '27986', '41373', '4'), +('3', '65', '11', '29596', '40320', '4'), +('3', '65', '11', '30539', '39994', '4'), +('3', '66', '22', '21807', '0', '7'), +('3', '66', '22', '21805', '0', '7'), +('3', '66', '22', '12425', '0', '7'), +('3', '66', '22', '7867', '0', '7'), +('3', '66', '1', '68949', '57797', '7'), +('3', '66', '1', '7125', '45983', '7'), +('3', '66', '1', '32106', '42960', '7'), +('3', '66', '1', '69166', '41679', '7'), +('3', '66', '2', '28647', '46589', '7'), +('3', '66', '2', '28605', '45757', '7'), +('3', '66', '2', '28648', '45618', '7'), +('3', '66', '2', '69087', '35171', '7'), +('3', '66', '3', '69068', '44349', '7'), +('3', '66', '3', '69157', '39119', '7'), +('3', '66', '3', '69069', '35734', '7'), +('3', '66', '3', '69074', '34777', '7'), +('3', '66', '5', '69097', '45855', '7'), +('3', '66', '5', '68950', '45679', '7'), +('3', '66', '5', '67625', '42252', '7'), +('3', '66', '5', '69135', '39821', '7'), +('3', '66', '8', '69064', '69710', '7'), +('3', '66', '8', '69165', '63769', '7'), +('3', '66', '8', '69072', '58313', '7'), +('3', '66', '8', '69065', '36444', '7'), +('3', '66', '6', '68757', '53729', '7'), +('3', '66', '6', '13674', '49422', '7'), +('3', '66', '6', '69073', '40308', '7'), +('3', '66', '6', '69130', '39944', '7'), +('3', '66', '17', '69150', '44530', '7'), +('3', '66', '17', '28937', '36642', '7'), +('3', '66', '17', '47644', '36382', '7'), +('3', '66', '17', '68748', '35813', '7'), +('3', '66', '7', '16097', '40976', '7'), +('3', '66', '7', '68861', '38205', '7'), +('3', '66', '7', '69168', '38037', '7'), +('3', '66', '7', '69079', '34891', '7'), +('3', '66', '9', '69126', '50197', '7'), +('3', '66', '9', '68766', '44835', '7'), +('3', '66', '9', '16097', '40976', '7'), +('3', '66', '9', '11103', '39838', '7'), +('3', '66', '15', '69160', '49230', '7'), +('3', '66', '15', '9959', '39688', '7'), +('3', '66', '15', '68111', '39404', '7'), +('3', '66', '15', '69131', '38914', '7'), +('3', '66', '20', '16156', '54729', '7'), +('3', '66', '20', '69134', '42920', '7'), +('3', '66', '20', '67625', '42252', '7'), +('3', '66', '20', '16097', '40976', '7'), +('3', '66', '12', '69252', '40116', '7'), +('3', '66', '12', '69083', '34759', '7'), +('3', '66', '12', '25857', '31792', '7'), +('3', '66', '12', '68862', '30249', '7'), +('3', '66', '18', '69146', '42538', '7'), +('3', '66', '18', '68965', '33265', '7'), +('3', '66', '18', '68779', '32371', '7'), +('3', '66', '18', '28650', '30372', '7'), +('3', '66', '19', '19094', '39500', '7'), +('3', '66', '19', '69177', '39383', '7'), +('3', '66', '19', '69075', '35741', '7'), +('3', '66', '19', '30569', '35342', '7'), +('3', '66', '13', '69053', '102832', '7'), +('3', '66', '13', '68835', '97429', '7'), +('3', '66', '13', '69112', '97196', '7'), +('3', '66', '13', '69043', '95918', '7'), +('3', '66', '14', '69155', '48830', '7'), +('3', '66', '14', '69161', '46000', '7'), +('3', '66', '14', '69049', '39751', '7'), +('3', '66', '14', '69048', '36753', '7'), +('3', '66', '11', '69054', '61613', '7'), +('3', '66', '11', '27818', '47903', '7'), +('3', '66', '11', '68662', '46481', '7'), +('3', '66', '11', '27986', '41403', '7'), +('3', '67', '22', '21807', '0', '7'), +('3', '67', '22', '21805', '0', '7'), +('3', '67', '22', '12425', '0', '7'), +('3', '67', '22', '7867', '0', '7'), +('3', '67', '1', '68949', '57701', '7'), +('3', '67', '1', '7125', '45985', '7'), +('3', '67', '1', '32106', '42963', '7'), +('3', '67', '1', '69166', '41682', '7'), +('3', '67', '2', '28647', '46592', '7'), +('3', '67', '2', '28605', '45759', '7'), +('3', '67', '2', '28648', '45619', '7'), +('3', '67', '2', '69087', '35175', '7'), +('3', '67', '3', '69068', '43903', '7'), +('3', '67', '3', '69157', '39122', '7'), +('3', '67', '3', '69069', '35737', '7'), +('3', '67', '3', '69074', '34780', '7'), +('3', '67', '5', '69097', '45408', '7'), +('3', '67', '5', '68950', '45232', '7'), +('3', '67', '5', '67625', '42255', '7'), +('3', '67', '5', '69135', '39825', '7'), +('3', '67', '8', '69064', '69313', '7'), +('3', '67', '8', '69165', '63773', '7'), +('3', '67', '8', '69072', '58316', '7'), +('3', '67', '8', '69065', '36447', '7'), +('3', '67', '6', '68757', '53732', '7'), +('3', '67', '6', '13674', '49425', '7'), +('3', '67', '6', '69073', '40129', '7'), +('3', '67', '6', '69130', '39946', '7'), +('3', '67', '17', '69150', '44534', '7'), +('3', '67', '17', '28937', '36644', '7'), +('3', '67', '17', '47644', '36087', '7'), +('3', '67', '17', '68748', '35717', '7'), +('3', '67', '7', '16097', '40980', '7'), +('3', '67', '7', '69168', '38040', '7'), +('3', '67', '7', '68861', '37929', '7'), +('3', '67', '7', '69079', '34894', '7'), +('3', '67', '9', '69126', '49800', '7'), +('3', '67', '9', '68766', '44838', '7'), +('3', '67', '9', '16097', '40980', '7'), +('3', '67', '9', '11103', '39840', '7'), +('3', '67', '15', '69160', '48832', '7'), +('3', '67', '15', '9959', '39689', '7'), +('3', '67', '15', '68111', '39405', '7'), +('3', '67', '15', '69131', '38916', '7'), +('3', '67', '20', '16156', '54733', '7'), +('3', '67', '20', '69134', '42924', '7'), +('3', '67', '20', '67625', '42255', '7'), +('3', '67', '20', '16097', '40980', '7'), +('3', '67', '12', '69252', '40119', '7'), +('3', '67', '12', '69083', '34761', '7'), +('3', '67', '12', '25857', '31793', '7'), +('3', '67', '12', '68862', '30251', '7'), +('3', '67', '18', '69146', '42540', '7'), +('3', '67', '18', '68965', '33269', '7'), +('3', '67', '18', '68779', '32375', '7'), +('3', '67', '18', '28650', '30376', '7'), +('3', '67', '19', '19094', '39503', '7'), +('3', '67', '19', '69177', '39387', '7'), +('3', '67', '19', '69075', '35746', '7'), +('3', '67', '19', '30569', '35343', '7'), +('3', '67', '13', '69053', '102921', '7'), +('3', '67', '13', '68835', '97602', '7'), +('3', '67', '13', '69112', '97283', '7'), +('3', '67', '13', '69043', '96112', '7'), +('3', '67', '14', '69155', '48432', '7'), +('3', '67', '14', '69161', '46004', '7'), +('3', '67', '14', '69049', '39754', '7'), +('3', '67', '14', '69048', '36756', '7'), +('3', '67', '11', '69054', '61776', '7'), +('3', '67', '11', '27818', '47926', '7'), +('3', '67', '11', '68662', '46511', '7'), +('3', '67', '11', '27986', '41434', '7'), +('3', '68', '22', '21807', '0', '7'), +('3', '68', '22', '21805', '0', '7'), +('3', '68', '22', '12425', '0', '7'), +('3', '68', '22', '7867', '0', '7'), +('3', '68', '1', '68949', '57605', '7'), +('3', '68', '1', '7125', '45986', '7'), +('3', '68', '1', '32106', '42966', '7'), +('3', '68', '1', '69166', '41685', '7'), +('3', '68', '2', '28647', '46595', '7'), +('3', '68', '2', '28605', '45761', '7'), +('3', '68', '2', '28648', '45620', '7'), +('3', '68', '2', '69087', '35179', '7'), +('3', '68', '3', '69068', '43456', '7'), +('3', '68', '3', '69157', '39125', '7'), +('3', '68', '3', '69069', '35740', '7'), +('3', '68', '3', '69074', '34783', '7'), +('3', '68', '5', '69097', '44962', '7'), +('3', '68', '5', '68950', '44784', '7'), +('3', '68', '5', '67625', '42258', '7'), +('3', '68', '5', '69135', '39829', '7'), +('3', '68', '8', '69064', '68916', '7'), +('3', '68', '8', '69165', '63777', '7'), +('3', '68', '8', '69072', '58319', '7'), +('3', '68', '8', '69065', '36450', '7'), +('3', '68', '6', '68757', '53735', '7'), +('3', '68', '6', '13674', '49427', '7'), +('3', '68', '6', '69073', '39951', '7'), +('3', '68', '6', '69130', '39948', '7'), +('3', '68', '17', '69150', '44538', '7'), +('3', '68', '17', '28937', '36646', '7'), +('3', '68', '17', '47644', '35792', '7'), +('3', '68', '17', '68748', '35620', '7'), +('3', '68', '7', '16097', '40983', '7'), +('3', '68', '7', '69168', '38043', '7'), +('3', '68', '7', '68861', '37653', '7'), +('3', '68', '7', '69079', '34896', '7'), +('3', '68', '9', '69126', '49402', '7'), +('3', '68', '9', '68766', '44841', '7'), +('3', '68', '9', '16097', '40983', '7'), +('3', '68', '9', '11103', '39842', '7'), +('3', '68', '15', '69160', '48434', '7'), +('3', '68', '15', '9959', '39691', '7'), +('3', '68', '15', '68111', '39405', '7'), +('3', '68', '15', '69131', '38917', '7'), +('3', '68', '20', '16156', '54736', '7'), +('3', '68', '20', '69134', '42927', '7'), +('3', '68', '20', '67625', '42258', '7'), +('3', '68', '20', '16097', '40983', '7'), +('3', '68', '12', '69252', '40122', '7'), +('3', '68', '12', '69083', '34762', '7'), +('3', '68', '12', '25857', '31793', '7'), +('3', '68', '12', '68862', '30253', '7'), +('3', '68', '18', '69146', '42541', '7'), +('3', '68', '18', '68965', '33272', '7'), +('3', '68', '18', '68779', '32378', '7'), +('3', '68', '18', '28650', '30379', '7'), +('3', '68', '19', '19094', '39504', '7'), +('3', '68', '19', '69177', '39390', '7'), +('3', '68', '19', '69075', '35750', '7'), +('3', '68', '19', '30569', '35344', '7'), +('3', '68', '13', '69053', '103009', '7'), +('3', '68', '13', '68835', '97804', '7'), +('3', '68', '13', '69112', '97399', '7'), +('3', '68', '13', '69043', '96306', '7'), +('3', '68', '14', '69155', '48034', '7'), +('3', '68', '14', '69161', '46008', '7'), +('3', '68', '14', '69049', '39756', '7'), +('3', '68', '14', '69048', '36759', '7'), +('3', '68', '11', '69054', '61949', '7'), +('3', '68', '11', '27818', '47958', '7'), +('3', '68', '11', '68662', '46541', '7'), +('3', '68', '11', '96532', '42439', '7'), +('3', '69', '22', '21807', '0', '7'), +('3', '69', '22', '21805', '0', '7'), +('3', '69', '22', '12425', '0', '7'), +('3', '69', '22', '7867', '0', '7'), +('3', '69', '1', '68949', '57509', '7'), +('3', '69', '1', '7125', '45988', '7'), +('3', '69', '1', '32106', '42970', '7'), +('3', '69', '1', '69166', '41689', '7'), +('3', '69', '2', '28647', '46598', '7'), +('3', '69', '2', '28605', '45764', '7'), +('3', '69', '2', '28648', '45621', '7'), +('3', '69', '2', '69087', '35184', '7'), +('3', '69', '3', '69068', '43010', '7'), +('3', '69', '3', '69157', '39129', '7'), +('3', '69', '3', '69069', '35744', '7'), +('3', '69', '3', '69074', '34786', '7'), +('3', '69', '5', '69097', '44516', '7'), +('3', '69', '5', '68950', '44337', '7'), +('3', '69', '5', '67625', '42261', '7'), +('3', '69', '5', '69135', '39834', '7'), +('3', '69', '8', '69064', '68519', '7'), +('3', '69', '8', '69165', '63780', '7'), +('3', '69', '8', '69072', '58323', '7'), +('3', '69', '8', '69065', '36453', '7'), +('3', '69', '6', '68757', '53738', '7'), +('3', '69', '6', '13674', '49430', '7'), +('3', '69', '6', '69130', '39951', '7'), +('3', '69', '6', '69073', '39772', '7'), +('3', '69', '17', '69150', '44541', '7'), +('3', '69', '17', '28937', '36647', '7'), +('3', '69', '17', '68748', '35524', '7'), +('3', '69', '17', '47644', '35497', '7'), +('3', '69', '7', '16097', '40987', '7'), +('3', '69', '7', '69168', '38047', '7'), +('3', '69', '7', '68861', '37377', '7'), +('3', '69', '7', '69079', '34899', '7'), +('3', '69', '9', '69126', '49005', '7'), +('3', '69', '9', '68766', '44844', '7'), +('3', '69', '9', '16097', '40987', '7'), +('3', '69', '9', '11103', '39843', '7'), +('3', '69', '15', '69160', '48036', '7'), +('3', '69', '15', '9959', '39693', '7'), +('3', '69', '15', '68111', '39406', '7'), +('3', '69', '15', '69131', '38919', '7'), +('3', '69', '20', '16156', '54739', '7'), +('3', '69', '20', '69134', '42931', '7'), +('3', '69', '20', '67625', '42261', '7'), +('3', '69', '20', '16097', '40987', '7'), +('3', '69', '12', '69252', '40126', '7'), +('3', '69', '12', '69083', '34764', '7'), +('3', '69', '12', '25857', '31794', '7'), +('3', '69', '12', '68862', '30256', '7'), +('3', '69', '18', '69146', '42543', '7'), +('3', '69', '18', '68965', '33276', '7'), +('3', '69', '18', '68779', '32382', '7'), +('3', '69', '18', '28650', '30383', '7'), +('3', '69', '19', '19094', '39506', '7'), +('3', '69', '19', '69177', '39394', '7'), +('3', '69', '19', '69075', '35755', '7'), +('3', '69', '19', '30569', '35346', '7'), +('3', '69', '13', '69053', '103098', '7'), +('3', '69', '13', '68835', '98006', '7'), +('3', '69', '13', '69112', '97487', '7'), +('3', '69', '13', '69043', '96499', '7'), +('3', '69', '14', '69155', '47636', '7'), +('3', '69', '14', '69161', '46012', '7'), +('3', '69', '14', '69049', '39759', '7'), +('3', '69', '14', '69048', '36762', '7'), +('3', '69', '11', '69054', '62121', '7'), +('3', '69', '11', '27818', '47990', '7'), +('3', '69', '11', '68662', '46571', '7'), +('3', '69', '11', '96532', '43121', '7'), +('3', '70', '22', '12425', '0', '11'), +('3', '70', '22', '21807', '0', '11'), +('3', '70', '22', '39342', '0', '11'), +('3', '70', '22', '7867', '0', '11'), +('3', '70', '1', '39276', '72706', '11'), +('3', '70', '1', '83594', '70858', '11'), +('3', '70', '1', '39329', '64289', '11'), +('3', '70', '1', '71624', '60494', '11'), +('3', '70', '2', '70867', '67982', '11'), +('3', '70', '2', '83560', '49882', '11'), +('3', '70', '2', '28647', '46602', '11'), +('3', '70', '2', '28605', '45766', '11'), +('3', '70', '3', '39218', '66427', '11'), +('3', '70', '3', '47245', '61809', '11'), +('3', '70', '3', '39368', '57952', '11'), +('3', '70', '3', '39347', '56032', '11'), +('3', '70', '5', '39366', '58357', '11'), +('3', '70', '5', '39359', '55433', '11'), +('3', '70', '5', '39313', '50551', '11'), +('3', '70', '5', '39262', '50506', '11'), +('3', '70', '8', '39330', '72153', '11'), +('3', '70', '8', '69064', '68122', '11'), +('3', '70', '8', '69165', '63784', '11'), +('3', '70', '8', '39293', '61187', '11'), +('3', '70', '6', '39337', '76418', '11'), +('3', '70', '6', '70717', '62738', '11'), +('3', '70', '6', '71666', '56365', '11'), +('3', '70', '6', '68757', '53741', '11'), +('3', '70', '17', '70872', '107616', '11'), +('3', '70', '17', '83603', '79459', '11'), +('3', '70', '17', '70701', '50651', '11'), +('3', '70', '17', '69150', '44545', '11'), +('3', '70', '7', '39267', '49968', '11'), +('3', '70', '7', '83564', '49957', '11'), +('3', '70', '7', '70868', '44796', '11'), +('3', '70', '7', '16097', '40990', '11'), +('3', '70', '9', '51706', '66147', '11'), +('3', '70', '9', '39335', '55804', '11'), +('3', '70', '9', '83652', '52778', '11'), +('3', '70', '9', '39291', '50713', '11'), +('3', '70', '15', '83629', '61775', '11'), +('3', '70', '15', '39374', '60412', '11'), +('3', '70', '15', '83458', '55358', '11'), +('3', '70', '15', '70621', '54685', '11'), +('3', '70', '20', '47283', '65767', '11'), +('3', '70', '20', '39365', '60748', '11'), +('3', '70', '20', '83533', '60122', '11'), +('3', '70', '20', '16156', '54742', '11'), +('3', '70', '12', '47212', '59767', '11'), +('3', '70', '12', '71075', '53143', '11'), +('3', '70', '12', '83568', '47719', '11'), +('3', '70', '12', '70870', '43838', '11'), +('3', '70', '18', '83607', '68497', '11'), +('3', '70', '18', '70873', '58220', '11'), +('3', '70', '18', '69146', '42545', '11'), +('3', '70', '18', '47200', '42414', '11'), +('3', '70', '19', '39355', '54942', '11'), +('3', '70', '19', '83572', '49651', '11'), +('3', '70', '19', '70871', '44584', '11'), +('3', '70', '19', '83550', '42255', '11'), +('3', '70', '13', '83639', '144704', '11'), +('3', '70', '13', '39254', '138881', '11'), +('3', '70', '13', '39294', '138707', '11'), +('3', '70', '13', '83581', '135240', '11'), +('3', '70', '14', '39341', '61661', '11'), +('3', '70', '14', '39372', '60895', '11'), +('3', '70', '14', '83640', '57345', '11'), +('3', '70', '14', '83656', '56003', '11'), +('3', '70', '11', '39331', '74906', '11'), +('3', '70', '11', '83582', '74737', '11'), +('3', '70', '11', '39311', '73491', '11'), +('3', '70', '11', '47325', '68573', '11'), +('3', '70', '22', '21807', '0', '10'), +('3', '70', '22', '21805', '0', '10'), +('3', '70', '22', '12425', '0', '10'), +('3', '70', '22', '9248', '0', '10'), +('3', '70', '1', '83594', '70858', '10'), +('3', '70', '1', '71624', '60494', '10'), +('3', '70', '1', '68949', '57413', '10'), +('3', '70', '1', '83630', '50188', '10'), +('3', '70', '2', '70867', '67982', '10'), +('3', '70', '2', '83560', '49882', '10'), +('3', '70', '2', '28647', '46602', '10'), +('3', '70', '2', '28605', '45766', '10'), +('3', '70', '3', '47245', '61809', '10'), +('3', '70', '3', '83658', '53350', '10'), +('3', '70', '3', '83636', '50164', '10'), +('3', '70', '3', '89512', '48097', '10'), +('3', '70', '5', '83651', '49500', '10'), +('3', '70', '5', '83599', '48523', '10'), +('3', '70', '5', '47275', '46487', '10'), +('3', '70', '5', '89308', '46314', '10'), +('3', '70', '8', '69064', '68122', '10'), +('3', '70', '8', '69165', '63784', '10'), +('3', '70', '8', '69072', '58326', '10'), +('3', '70', '8', '83659', '52816', '10'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '70', '6', '70717', '62738', '10'), +('3', '70', '6', '71666', '56365', '10'), +('3', '70', '6', '68757', '53741', '10'), +('3', '70', '6', '83660', '52515', '10'), +('3', '70', '17', '70872', '107616', '10'), +('3', '70', '17', '83603', '79459', '10'), +('3', '70', '17', '70701', '50651', '10'), +('3', '70', '17', '69150', '44545', '10'), +('3', '70', '7', '83564', '49957', '10'), +('3', '70', '7', '70868', '44796', '10'), +('3', '70', '7', '16097', '40990', '10'), +('3', '70', '7', '47204', '40982', '10'), +('3', '70', '9', '83652', '52778', '10'), +('3', '70', '9', '69126', '48608', '10'), +('3', '70', '9', '68766', '44846', '10'), +('3', '70', '9', '70869', '43763', '10'), +('3', '70', '15', '83629', '61775', '10'), +('3', '70', '15', '83458', '55358', '10'), +('3', '70', '15', '70621', '54685', '10'), +('3', '70', '15', '71117', '54550', '10'), +('3', '70', '20', '47283', '65767', '10'), +('3', '70', '20', '83533', '60122', '10'), +('3', '70', '20', '16156', '54742', '10'), +('3', '70', '20', '70604', '51396', '10'), +('3', '70', '12', '47212', '59767', '10'), +('3', '70', '12', '71075', '53143', '10'), +('3', '70', '12', '83568', '47719', '10'), +('3', '70', '12', '70870', '43838', '10'), +('3', '70', '18', '83607', '68497', '10'), +('3', '70', '18', '70873', '58220', '10'), +('3', '70', '18', '69146', '42545', '10'), +('3', '70', '18', '47200', '42414', '10'), +('3', '70', '19', '83572', '49651', '10'), +('3', '70', '19', '70871', '44584', '10'), +('3', '70', '19', '83550', '42255', '10'), +('3', '70', '19', '69439', '41524', '10'), +('3', '70', '13', '83639', '144704', '10'), +('3', '70', '13', '83581', '135240', '10'), +('3', '70', '13', '83579', '131906', '10'), +('3', '70', '13', '47320', '128042', '10'), +('3', '70', '14', '83640', '57345', '10'), +('3', '70', '14', '83656', '56003', '10'), +('3', '70', '14', '39315', '52331', '10'), +('3', '70', '14', '47310', '51521', '10'), +('3', '70', '11', '83582', '74737', '10'), +('3', '70', '11', '47325', '68573', '10'), +('3', '70', '11', '83539', '67510', '10'), +('3', '70', '11', '69054', '63286', '10'), +('3', '70', '22', '21805', '0', '9'), +('3', '70', '22', '61948', '0', '9'), +('3', '70', '22', '21807', '0', '9'), +('3', '70', '22', '12425', '0', '9'), +('3', '70', '1', '71624', '60494', '9'), +('3', '70', '1', '68949', '57413', '9'), +('3', '70', '1', '71668', '46527', '9'), +('3', '70', '1', '47287', '45992', '9'), +('3', '70', '2', '70867', '67982', '9'), +('3', '70', '2', '28647', '46602', '9'), +('3', '70', '2', '28605', '45766', '9'), +('3', '70', '2', '28648', '45623', '9'), +('3', '70', '3', '47245', '61809', '9'), +('3', '70', '3', '71667', '46815', '9'), +('3', '70', '3', '47299', '44736', '9'), +('3', '70', '3', '47300', '43352', '9'), +('3', '70', '5', '47275', '46487', '9'), +('3', '70', '5', '47273', '44900', '9'), +('3', '70', '5', '69097', '44069', '9'), +('3', '70', '5', '68950', '43889', '9'), +('3', '70', '8', '69064', '68122', '9'), +('3', '70', '8', '69165', '63784', '9'), +('3', '70', '8', '69072', '58326', '9'), +('3', '70', '8', '70662', '52679', '9'), +('3', '70', '6', '70717', '62738', '9'), +('3', '70', '6', '71666', '56365', '9'), +('3', '70', '6', '68757', '53741', '9'), +('3', '70', '6', '13674', '49433', '9'), +('3', '70', '17', '70872', '107616', '9'), +('3', '70', '17', '70701', '50651', '9'), +('3', '70', '17', '69150', '44545', '9'), +('3', '70', '17', '71638', '40028', '9'), +('3', '70', '7', '70868', '44796', '9'), +('3', '70', '7', '16097', '40990', '9'), +('3', '70', '7', '47204', '40982', '9'), +('3', '70', '7', '69168', '38050', '9'), +('3', '70', '9', '69126', '48608', '9'), +('3', '70', '9', '68766', '44846', '9'), +('3', '70', '9', '70869', '43763', '9'), +('3', '70', '9', '16097', '40990', '9'), +('3', '70', '15', '70621', '54685', '9'), +('3', '70', '15', '71117', '54550', '9'), +('3', '70', '15', '69160', '47638', '9'), +('3', '70', '15', '47291', '44315', '9'), +('3', '70', '20', '47283', '65767', '9'), +('3', '70', '20', '16156', '54742', '9'), +('3', '70', '20', '70604', '51396', '9'), +('3', '70', '20', '47282', '45774', '9'), +('3', '70', '12', '47212', '59767', '9'), +('3', '70', '12', '71075', '53143', '9'), +('3', '70', '12', '70870', '43838', '9'), +('3', '70', '12', '69252', '40129', '9'), +('3', '70', '18', '70873', '58220', '9'), +('3', '70', '18', '69146', '42545', '9'), +('3', '70', '18', '47200', '42414', '9'), +('3', '70', '18', '71646', '39771', '9'), +('3', '70', '19', '70871', '44584', '9'), +('3', '70', '19', '69439', '41524', '9'), +('3', '70', '19', '19094', '39509', '9'), +('3', '70', '19', '69177', '39398', '9'), +('3', '70', '13', '47320', '128042', '9'), +('3', '70', '13', '47324', '127203', '9'), +('3', '70', '13', '71663', '126157', '9'), +('3', '70', '13', '71673', '122500', '9'), +('3', '70', '14', '39315', '52331', '9'), +('3', '70', '14', '47310', '51521', '9'), +('3', '70', '14', '71669', '48317', '9'), +('3', '70', '14', '69155', '47238', '9'), +('3', '70', '11', '47325', '68573', '9'), +('3', '70', '11', '69054', '63286', '9'), +('3', '70', '11', '47265', '61480', '9'), +('3', '70', '11', '70628', '55560', '9'), +('3', '70', '22', '21805', '0', '8'), +('3', '70', '22', '61948', '0', '8'), +('3', '70', '22', '21807', '0', '8'), +('3', '70', '22', '12425', '0', '8'), +('3', '70', '1', '68949', '57413', '8'), +('3', '70', '1', '47287', '45992', '8'), +('3', '70', '1', '7125', '45990', '8'), +('3', '70', '1', '47289', '43858', '8'), +('3', '70', '2', '70867', '67982', '8'), +('3', '70', '2', '28647', '46602', '8'), +('3', '70', '2', '28605', '45766', '8'), +('3', '70', '2', '28648', '45623', '8'), +('3', '70', '3', '47245', '61809', '8'), +('3', '70', '3', '47299', '44736', '8'), +('3', '70', '3', '47300', '43352', '8'), +('3', '70', '3', '69068', '42563', '8'), +('3', '70', '5', '47275', '46487', '8'), +('3', '70', '5', '47273', '44900', '8'), +('3', '70', '5', '69097', '44069', '8'), +('3', '70', '5', '68950', '43889', '8'), +('3', '70', '8', '69064', '68122', '8'), +('3', '70', '8', '69165', '63784', '8'), +('3', '70', '8', '69072', '58326', '8'), +('3', '70', '8', '70662', '52679', '8'), +('3', '70', '6', '70717', '62738', '8'), +('3', '70', '6', '68757', '53741', '8'), +('3', '70', '6', '13674', '49433', '8'), +('3', '70', '6', '47278', '45553', '8'), +('3', '70', '17', '70872', '107616', '8'), +('3', '70', '17', '70701', '50651', '8'), +('3', '70', '17', '69150', '44545', '8'), +('3', '70', '17', '28937', '36649', '8'), +('3', '70', '7', '70868', '44796', '8'), +('3', '70', '7', '16097', '40990', '8'), +('3', '70', '7', '47204', '40982', '8'), +('3', '70', '7', '69168', '38050', '8'), +('3', '70', '9', '69126', '48608', '8'), +('3', '70', '9', '68766', '44846', '8'), +('3', '70', '9', '70869', '43763', '8'), +('3', '70', '9', '16097', '40990', '8'), +('3', '70', '15', '70621', '54685', '8'), +('3', '70', '15', '71117', '54550', '8'), +('3', '70', '15', '69160', '47638', '8'), +('3', '70', '15', '47291', '44315', '8'), +('3', '70', '20', '47283', '65767', '8'), +('3', '70', '20', '16156', '54742', '8'), +('3', '70', '20', '70604', '51396', '8'), +('3', '70', '20', '47282', '45774', '8'), +('3', '70', '12', '47212', '59767', '8'), +('3', '70', '12', '71075', '53143', '8'), +('3', '70', '12', '70870', '43838', '8'), +('3', '70', '12', '69252', '40129', '8'), +('3', '70', '18', '70873', '58220', '8'), +('3', '70', '18', '69146', '42545', '8'), +('3', '70', '18', '47200', '42414', '8'), +('3', '70', '18', '71094', '35788', '8'), +('3', '70', '19', '70871', '44584', '8'), +('3', '70', '19', '69439', '41524', '8'), +('3', '70', '19', '19094', '39509', '8'), +('3', '70', '19', '69177', '39398', '8'), +('3', '70', '13', '47320', '127617', '8'), +('3', '70', '13', '47324', '126778', '8'), +('3', '70', '13', '47315', '122480', '8'), +('3', '70', '13', '48147', '121322', '8'), +('3', '70', '14', '39315', '52331', '8'), +('3', '70', '14', '47310', '51521', '8'), +('3', '70', '14', '69155', '47238', '8'), +('3', '70', '14', '47252', '46877', '8'), +('3', '70', '11', '47325', '68573', '8'), +('3', '70', '11', '69054', '63002', '8'), +('3', '70', '11', '47265', '61480', '8'), +('3', '70', '11', '70628', '55560', '8'), +('3', '71', '22', '12425', '0', '11'), +('3', '71', '22', '21807', '0', '11'), +('3', '71', '22', '39342', '0', '11'), +('3', '71', '22', '7867', '0', '11'), +('3', '71', '1', '39276', '72709', '11'), +('3', '71', '1', '83594', '70862', '11'), +('3', '71', '1', '39329', '63690', '11'), +('3', '71', '1', '71624', '60497', '11'), +('3', '71', '2', '70867', '67985', '11'), +('3', '71', '2', '83560', '49888', '11'), +('3', '71', '2', '28647', '46605', '11'), +('3', '71', '2', '28605', '45768', '11'), +('3', '71', '3', '39218', '66430', '11'), +('3', '71', '3', '47245', '61811', '11'), +('3', '71', '3', '39368', '57956', '11'), +('3', '71', '3', '39347', '56037', '11'), +('3', '71', '5', '39366', '58362', '11'), +('3', '71', '5', '39359', '55436', '11'), +('3', '71', '5', '39313', '50556', '11'), +('3', '71', '5', '39262', '50509', '11'), +('3', '71', '8', '39330', '72155', '11'), +('3', '71', '8', '69064', '67725', '11'), +('3', '71', '8', '69165', '63788', '11'), +('3', '71', '8', '39293', '60588', '11'), +('3', '71', '6', '39337', '76421', '11'), +('3', '71', '6', '70717', '62742', '11'), +('3', '71', '6', '71666', '55869', '11'), +('3', '71', '6', '68757', '53744', '11'), +('3', '71', '17', '70872', '104871', '11'), +('3', '71', '17', '83603', '79464', '11'), +('3', '71', '17', '70701', '50256', '11'), +('3', '71', '17', '69150', '44548', '11'), +('3', '71', '7', '39267', '49971', '11'), +('3', '71', '7', '83564', '49963', '11'), +('3', '71', '7', '70868', '44802', '11'), +('3', '71', '7', '16097', '40994', '11'), +('3', '71', '9', '51706', '65551', '11'), +('3', '71', '9', '39335', '55809', '11'), +('3', '71', '9', '83652', '52781', '11'), +('3', '71', '9', '39291', '50716', '11'), +('3', '71', '15', '83629', '61179', '11'), +('3', '71', '15', '39374', '60417', '11'), +('3', '71', '15', '83458', '55362', '11'), +('3', '71', '15', '70621', '54689', '11'), +('3', '71', '20', '47283', '65768', '11'), +('3', '71', '20', '39365', '60753', '11'), +('3', '71', '20', '83533', '60125', '11'), +('3', '71', '20', '16156', '54745', '11'), +('3', '71', '12', '47212', '59771', '11'), +('3', '71', '12', '71075', '53146', '11'), +('3', '71', '12', '83568', '47725', '11'), +('3', '71', '12', '70870', '43843', '11'), +('3', '71', '18', '83607', '67902', '11'), +('3', '71', '18', '70873', '57775', '11'), +('3', '71', '18', '69146', '42547', '11'), +('3', '71', '18', '47200', '42418', '11'), +('3', '71', '19', '39355', '54947', '11'), +('3', '71', '19', '83572', '49657', '11'), +('3', '71', '19', '70871', '44584', '11'), +('3', '71', '19', '83550', '42259', '11'), +('3', '71', '13', '83639', '145388', '11'), +('3', '71', '13', '39254', '139209', '11'), +('3', '71', '13', '39294', '139035', '11'), +('3', '71', '13', '83581', '135357', '11'), +('3', '71', '14', '39341', '61663', '11'), +('3', '71', '14', '39372', '60901', '11'), +('3', '71', '14', '83640', '57350', '11'), +('3', '71', '14', '83656', '56008', '11'), +('3', '71', '11', '39331', '74934', '11'), +('3', '71', '11', '83582', '74777', '11'), +('3', '71', '11', '39311', '73496', '11'), +('3', '71', '11', '47325', '68604', '11'), +('3', '72', '22', '12425', '0', '11'), +('3', '72', '22', '21807', '0', '11'), +('3', '72', '22', '39342', '0', '11'), +('3', '72', '22', '7867', '0', '11'), +('3', '72', '1', '39276', '72713', '11'), +('3', '72', '1', '83594', '70867', '11'), +('3', '72', '1', '39329', '63092', '11'), +('3', '72', '1', '71624', '60500', '11'), +('3', '72', '2', '70867', '67988', '11'), +('3', '72', '2', '83560', '49894', '11'), +('3', '72', '2', '28647', '46608', '11'), +('3', '72', '2', '28605', '45770', '11'), +('3', '72', '3', '39218', '66434', '11'), +('3', '72', '3', '47245', '61813', '11'), +('3', '72', '3', '39368', '57960', '11'), +('3', '72', '3', '39347', '56042', '11'), +('3', '72', '5', '39366', '58367', '11'), +('3', '72', '5', '39359', '55440', '11'), +('3', '72', '5', '39313', '50561', '11'), +('3', '72', '5', '39262', '50513', '11'), +('3', '72', '8', '39330', '72157', '11'), +('3', '72', '8', '69064', '67329', '11'), +('3', '72', '8', '69165', '63791', '11'), +('3', '72', '8', '39293', '59989', '11'), +('3', '72', '6', '39337', '76425', '11'), +('3', '72', '6', '70717', '62746', '11'), +('3', '72', '6', '71666', '55373', '11'), +('3', '72', '6', '68757', '53747', '11'), +('3', '72', '17', '70872', '102126', '11'), +('3', '72', '17', '83603', '79469', '11'), +('3', '72', '17', '70701', '49861', '11'), +('3', '72', '17', '69150', '44552', '11'), +('3', '72', '7', '39267', '49975', '11'), +('3', '72', '7', '83564', '49969', '11'), +('3', '72', '7', '70868', '44807', '11'), +('3', '72', '7', '16097', '40997', '11'), +('3', '72', '9', '51706', '64956', '11'), +('3', '72', '9', '39335', '55814', '11'), +('3', '72', '9', '83652', '52785', '11'), +('3', '72', '9', '39291', '50720', '11'), +('3', '72', '15', '83629', '60583', '11'), +('3', '72', '15', '39374', '60423', '11'), +('3', '72', '15', '83458', '55365', '11'), +('3', '72', '15', '70621', '54693', '11'), +('3', '72', '20', '47283', '65770', '11'), +('3', '72', '20', '39365', '60758', '11'), +('3', '72', '20', '83533', '60128', '11'), +('3', '72', '20', '16156', '54749', '11'), +('3', '72', '12', '47212', '59775', '11'), +('3', '72', '12', '71075', '53149', '11'), +('3', '72', '12', '83568', '47731', '11'), +('3', '72', '12', '70870', '43848', '11'), +('3', '72', '18', '83607', '67307', '11'), +('3', '72', '18', '70873', '57329', '11'), +('3', '72', '18', '69146', '42549', '11'), +('3', '72', '18', '47200', '42422', '11'), +('3', '72', '19', '39355', '54952', '11'), +('3', '72', '19', '83572', '49663', '11'), +('3', '72', '19', '70871', '44584', '11'), +('3', '72', '19', '83550', '42263', '11'), +('3', '72', '13', '83639', '146073', '11'), +('3', '72', '13', '39254', '139536', '11'), +('3', '72', '13', '39294', '139363', '11'), +('3', '72', '13', '83581', '135474', '11'), +('3', '72', '14', '39341', '61666', '11'), +('3', '72', '14', '39372', '60907', '11'), +('3', '72', '14', '83640', '57354', '11'), +('3', '72', '14', '83656', '56014', '11'), +('3', '72', '11', '39331', '74972', '11'), +('3', '72', '11', '83582', '74818', '11'), +('3', '72', '11', '39311', '73501', '11'), +('3', '72', '11', '47325', '68645', '11'), +('3', '73', '22', '12425', '0', '11'), +('3', '73', '22', '21807', '0', '11'), +('3', '73', '22', '39342', '0', '11'), +('3', '73', '22', '7867', '0', '11'), +('3', '73', '1', '39276', '72716', '11'), +('3', '73', '1', '83594', '70871', '11'), +('3', '73', '1', '39329', '62493', '11'), +('3', '73', '1', '71624', '60503', '11'), +('3', '73', '2', '70867', '67991', '11'), +('3', '73', '2', '83560', '49901', '11'), +('3', '73', '2', '28647', '46611', '11'), +('3', '73', '2', '28605', '45772', '11'), +('3', '73', '3', '39218', '66437', '11'), +('3', '73', '3', '47245', '61815', '11'), +('3', '73', '3', '39368', '57964', '11'), +('3', '73', '3', '39347', '56047', '11'), +('3', '73', '5', '39366', '58372', '11'), +('3', '73', '5', '39359', '55444', '11'), +('3', '73', '5', '39313', '50565', '11'), +('3', '73', '5', '39262', '50516', '11'), +('3', '73', '8', '39330', '72158', '11'), +('3', '73', '8', '69064', '66932', '11'), +('3', '73', '8', '69165', '63795', '11'), +('3', '73', '8', '39293', '59391', '11'), +('3', '73', '6', '39337', '76429', '11'), +('3', '73', '6', '70717', '62750', '11'), +('3', '73', '6', '71666', '54878', '11'), +('3', '73', '6', '68757', '53750', '11'), +('3', '73', '17', '70872', '99380', '11'), +('3', '73', '17', '83603', '79474', '11'), +('3', '73', '17', '70701', '49467', '11'), +('3', '73', '17', '69150', '44556', '11'), +('3', '73', '7', '39267', '49979', '11'), +('3', '73', '7', '83564', '49975', '11'), +('3', '73', '7', '70868', '44813', '11'), +('3', '73', '7', '16097', '41001', '11'), +('3', '73', '9', '51706', '64361', '11'), +('3', '73', '9', '39335', '55819', '11'), +('3', '73', '9', '83652', '52789', '11'), +('3', '73', '9', '39291', '50724', '11'), +('3', '73', '15', '39374', '60428', '11'), +('3', '73', '15', '83629', '59987', '11'), +('3', '73', '15', '83458', '55369', '11'), +('3', '73', '15', '70621', '54696', '11'), +('3', '73', '20', '47283', '65772', '11'), +('3', '73', '20', '39365', '60763', '11'), +('3', '73', '20', '83533', '60130', '11'), +('3', '73', '20', '16156', '54752', '11'), +('3', '73', '12', '47212', '59778', '11'), +('3', '73', '12', '71075', '53153', '11'), +('3', '73', '12', '83568', '47738', '11'), +('3', '73', '12', '70870', '43853', '11'), +('3', '73', '18', '83607', '66713', '11'), +('3', '73', '18', '70873', '56884', '11'), +('3', '73', '18', '69146', '42550', '11'), +('3', '73', '18', '47200', '42425', '11'), +('3', '73', '19', '39355', '54957', '11'), +('3', '73', '19', '83572', '49669', '11'), +('3', '73', '19', '70871', '44584', '11'), +('3', '73', '19', '83550', '42267', '11'), +('3', '73', '13', '83639', '146758', '11'), +('3', '73', '13', '39254', '139864', '11'), +('3', '73', '13', '39294', '139691', '11'), +('3', '73', '13', '83581', '135591', '11'), +('3', '73', '14', '39341', '61669', '11'), +('3', '73', '14', '39372', '60913', '11'), +('3', '73', '14', '83640', '57359', '11'), +('3', '73', '14', '83656', '56019', '11'), +('3', '73', '11', '39331', '75000', '11'), +('3', '73', '11', '83582', '74858', '11'), +('3', '73', '11', '39311', '73505', '11'), +('3', '73', '11', '47325', '68676', '11'), +('3', '74', '22', '12425', '0', '11'), +('3', '74', '22', '21807', '0', '11'), +('3', '74', '22', '39342', '0', '11'), +('3', '74', '22', '7867', '0', '11'), +('3', '74', '1', '39276', '72720', '11'), +('3', '74', '1', '83594', '70875', '11'), +('3', '74', '1', '39329', '61895', '11'), +('3', '74', '1', '71624', '60507', '11'), +('3', '74', '2', '70867', '67995', '11'), +('3', '74', '2', '83560', '49907', '11'), +('3', '74', '2', '28647', '46615', '11'), +('3', '74', '2', '28605', '45774', '11'), +('3', '74', '3', '39218', '66440', '11'), +('3', '74', '3', '47245', '61817', '11'), +('3', '74', '3', '39368', '57969', '11'), +('3', '74', '3', '39347', '56052', '11'), +('3', '74', '5', '39366', '58376', '11'), +('3', '74', '5', '39359', '55448', '11'), +('3', '74', '5', '39313', '50570', '11'), +('3', '74', '5', '39262', '50519', '11'), +('3', '74', '8', '39330', '72160', '11'), +('3', '74', '8', '69064', '66535', '11'), +('3', '74', '8', '69165', '63799', '11'), +('3', '74', '8', '39293', '58792', '11'), +('3', '74', '6', '39337', '76433', '11'), +('3', '74', '6', '70717', '62754', '11'), +('3', '74', '6', '71666', '54382', '11'), +('3', '74', '6', '68757', '53753', '11'), +('3', '74', '17', '70872', '96635', '11'), +('3', '74', '17', '83603', '79480', '11'), +('3', '74', '17', '70701', '49072', '11'), +('3', '74', '17', '69150', '44560', '11'), +('3', '74', '7', '39267', '49982', '11'), +('3', '74', '7', '83564', '49981', '11'), +('3', '74', '7', '70868', '44818', '11'), +('3', '74', '7', '16097', '41005', '11'), +('3', '74', '9', '51706', '63765', '11'), +('3', '74', '9', '39335', '55824', '11'), +('3', '74', '9', '83652', '52793', '11'), +('3', '74', '9', '39291', '50727', '11'), +('3', '74', '15', '39374', '60433', '11'), +('3', '74', '15', '83629', '59391', '11'), +('3', '74', '15', '83458', '55373', '11'), +('3', '74', '15', '70621', '54700', '11'), +('3', '74', '20', '47283', '65774', '11'), +('3', '74', '20', '39365', '60768', '11'), +('3', '74', '20', '83533', '60133', '11'), +('3', '74', '20', '16156', '54755', '11'), +('3', '74', '12', '47212', '59782', '11'), +('3', '74', '12', '71075', '53156', '11'), +('3', '74', '12', '83568', '47744', '11'), +('3', '74', '12', '70870', '43858', '11'), +('3', '74', '18', '83607', '66118', '11'), +('3', '74', '18', '70873', '56439', '11'), +('3', '74', '18', '69146', '42552', '11'), +('3', '74', '18', '47200', '42429', '11'), +('3', '74', '19', '39355', '54962', '11'), +('3', '74', '19', '83572', '49676', '11'), +('3', '74', '19', '70871', '44584', '11'), +('3', '74', '19', '83550', '42271', '11'), +('3', '74', '13', '83639', '147442', '11'), +('3', '74', '13', '39254', '140220', '11'), +('3', '74', '13', '39294', '140019', '11'), +('3', '74', '13', '83581', '135709', '11'), +('3', '74', '14', '39341', '61671', '11'), +('3', '74', '14', '39372', '60919', '11'), +('3', '74', '14', '83640', '57363', '11'), +('3', '74', '14', '83656', '56025', '11'), +('3', '74', '11', '39331', '75029', '11'), +('3', '74', '11', '83582', '74899', '11'), +('3', '74', '11', '39311', '73510', '11'), +('3', '74', '11', '47325', '68717', '11'), +('3', '75', '22', '39342', '0', '13'), +('3', '75', '22', '12425', '0', '13'), +('3', '75', '22', '7867', '0', '13'), +('3', '75', '22', '23597', '0', '13'), +('3', '75', '1', '80676', '81201', '13'), +('3', '75', '1', '80659', '80696', '13'), +('3', '75', '1', '80660', '77865', '13'), +('3', '75', '1', '80648', '76266', '13'), +('3', '75', '2', '70867', '67998', '13'), +('3', '75', '2', '83560', '49913', '13'), +('3', '75', '2', '28647', '46618', '13'), +('3', '75', '2', '28605', '45777', '13'), +('3', '75', '3', '80637', '76396', '13'), +('3', '75', '3', '39218', '66443', '13'), +('3', '75', '3', '46873', '65378', '13'), +('3', '75', '3', '46923', '65154', '13'), +('3', '75', '5', '46867', '89793', '13'), +('3', '75', '5', '80670', '82056', '13'), +('3', '75', '5', '80616', '73119', '13'), +('3', '75', '5', '46934', '70805', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '75', '8', '46885', '95879', '13'), +('3', '75', '8', '80677', '83632', '13'), +('3', '75', '8', '80649', '74397', '13'), +('3', '75', '8', '39330', '72162', '13'), +('3', '75', '6', '80638', '99085', '13'), +('3', '75', '6', '39337', '76437', '13'), +('3', '75', '6', '46884', '71772', '13'), +('3', '75', '6', '46933', '71724', '13'), +('3', '75', '17', '70872', '93890', '13'), +('3', '75', '17', '83603', '79485', '13'), +('3', '75', '17', '46809', '56380', '13'), +('3', '75', '17', '70701', '48678', '13'), +('3', '75', '7', '53376', '66045', '13'), +('3', '75', '7', '83564', '49988', '13'), +('3', '75', '7', '39267', '49986', '13'), +('3', '75', '7', '70868', '44824', '13'), +('3', '75', '9', '46887', '72236', '13'), +('3', '75', '9', '51706', '63170', '13'), +('3', '75', '9', '39335', '55829', '13'), +('3', '75', '9', '83652', '52797', '13'), +('3', '75', '15', '79909', '85786', '13'), +('3', '75', '15', '80667', '83386', '13'), +('3', '75', '15', '80671', '82122', '13'), +('3', '75', '15', '80686', '81926', '13'), +('3', '75', '20', '80678', '106261', '13'), +('3', '75', '20', '46935', '73871', '13'), +('3', '75', '20', '80620', '71206', '13'), +('3', '75', '20', '46919', '65893', '13'), +('3', '75', '12', '47212', '59786', '13'), +('3', '75', '12', '71075', '53159', '13'), +('3', '75', '12', '83568', '47750', '13'), +('3', '75', '12', '70870', '43863', '13'), +('3', '75', '18', '83607', '65524', '13'), +('3', '75', '18', '70873', '55994', '13'), +('3', '75', '18', '46826', '54196', '13'), +('3', '75', '18', '69146', '42554', '13'), +('3', '75', '19', '80516', '77000', '13'), +('3', '75', '19', '39355', '54967', '13'), +('3', '75', '19', '83572', '49682', '13'), +('3', '75', '19', '70871', '44584', '13'), +('3', '75', '13', '46929', '185196', '13'), +('3', '75', '13', '80683', '180735', '13'), +('3', '75', '13', '80642', '178793', '13'), +('3', '75', '13', '80685', '177905', '13'), +('3', '75', '14', '80665', '78555', '13'), +('3', '75', '14', '80682', '78500', '13'), +('3', '75', '14', '80625', '71815', '13'), +('3', '75', '14', '46875', '67536', '13'), +('3', '75', '11', '80655', '108261', '13'), +('3', '75', '11', '46930', '100850', '13'), +('3', '75', '11', '46849', '84617', '13'), +('3', '75', '11', '80668', '81576', '13'), +('3', '75', '22', '39342', '0', '12'), +('3', '75', '22', '12425', '0', '12'), +('3', '75', '22', '7867', '0', '12'), +('3', '75', '22', '23597', '0', '12'), +('3', '75', '1', '39276', '72723', '12'), +('3', '75', '1', '46931', '71589', '12'), +('3', '75', '1', '83594', '70879', '12'), +('3', '75', '1', '46892', '67155', '12'), +('3', '75', '2', '70867', '67998', '12'), +('3', '75', '2', '83560', '49913', '12'), +('3', '75', '2', '28647', '46618', '12'), +('3', '75', '2', '28605', '45777', '12'), +('3', '75', '3', '39218', '66443', '12'), +('3', '75', '3', '46873', '65378', '12'), +('3', '75', '3', '46923', '65154', '12'), +('3', '75', '3', '47245', '61819', '12'), +('3', '75', '5', '46867', '89793', '12'), +('3', '75', '5', '46934', '70805', '12'), +('3', '75', '5', '46917', '64380', '12'), +('3', '75', '5', '39366', '58381', '12'), +('3', '75', '8', '46885', '95879', '12'), +('3', '75', '8', '39330', '72162', '12'), +('3', '75', '8', '69064', '66138', '12'), +('3', '75', '8', '69165', '63803', '12'), +('3', '75', '6', '39337', '76437', '12'), +('3', '75', '6', '46884', '71772', '12'), +('3', '75', '6', '46933', '71724', '12'), +('3', '75', '6', '46883', '70857', '12'), +('3', '75', '17', '70872', '93890', '12'), +('3', '75', '17', '83603', '79485', '12'), +('3', '75', '17', '46809', '56380', '12'), +('3', '75', '17', '70701', '48678', '12'), +('3', '75', '7', '53376', '66045', '12'), +('3', '75', '7', '83564', '49988', '12'), +('3', '75', '7', '39267', '49986', '12'), +('3', '75', '7', '70868', '44824', '12'), +('3', '75', '9', '46887', '72236', '12'), +('3', '75', '9', '51706', '63170', '12'), +('3', '75', '9', '39335', '55829', '12'), +('3', '75', '9', '83652', '52797', '12'), +('3', '75', '15', '46881', '72852', '12'), +('3', '75', '15', '46863', '67952', '12'), +('3', '75', '15', '46915', '64722', '12'), +('3', '75', '15', '46893', '62784', '12'), +('3', '75', '20', '46935', '73871', '12'), +('3', '75', '20', '46919', '65893', '12'), +('3', '75', '20', '47283', '65775', '12'), +('3', '75', '20', '46869', '64635', '12'), +('3', '75', '12', '47212', '59786', '12'), +('3', '75', '12', '71075', '53159', '12'), +('3', '75', '12', '83568', '47750', '12'), +('3', '75', '12', '70870', '43863', '12'), +('3', '75', '18', '83607', '65524', '12'), +('3', '75', '18', '70873', '55994', '12'), +('3', '75', '18', '46826', '54196', '12'), +('3', '75', '18', '69146', '42554', '12'), +('3', '75', '19', '39355', '54967', '12'), +('3', '75', '19', '83572', '49682', '12'), +('3', '75', '19', '70871', '44584', '12'), +('3', '75', '19', '83550', '42275', '12'), +('3', '75', '13', '46929', '185196', '12'), +('3', '75', '13', '46879', '165288', '12'), +('3', '75', '13', '46855', '154260', '12'), +('3', '75', '13', '46890', '153098', '12'), +('3', '75', '14', '46875', '67536', '12'), +('3', '75', '14', '46925', '66721', '12'), +('3', '75', '14', '39341', '61674', '12'), +('3', '75', '14', '46853', '61613', '12'), +('3', '75', '11', '46930', '100850', '12'), +('3', '75', '11', '46849', '84617', '12'), +('3', '75', '11', '39331', '75067', '12'), +('3', '75', '11', '83582', '74939', '12'), +('3', '76', '22', '39342', '0', '13'), +('3', '76', '22', '12425', '0', '13'), +('3', '76', '22', '7867', '0', '13'), +('3', '76', '22', '23597', '0', '13'), +('3', '76', '1', '80676', '81203', '13'), +('3', '76', '1', '80659', '80702', '13'), +('3', '76', '1', '80660', '77871', '13'), +('3', '76', '1', '80648', '76272', '13'), +('3', '76', '2', '70867', '68001', '13'), +('3', '76', '2', '83560', '49919', '13'), +('3', '76', '2', '28647', '46621', '13'), +('3', '76', '2', '28605', '45779', '13'), +('3', '76', '3', '80637', '76402', '13'), +('3', '76', '3', '39218', '66446', '13'), +('3', '76', '3', '46873', '65383', '13'), +('3', '76', '3', '46923', '65159', '13'), +('3', '76', '5', '46867', '89797', '13'), +('3', '76', '5', '80670', '82062', '13'), +('3', '76', '5', '80616', '73120', '13'), +('3', '76', '5', '46934', '70812', '13'), +('3', '76', '8', '46885', '95885', '13'), +('3', '76', '8', '80677', '83638', '13'), +('3', '76', '8', '80649', '74403', '13'), +('3', '76', '8', '39330', '72164', '13'), +('3', '76', '6', '80638', '99091', '13'), +('3', '76', '6', '39337', '76441', '13'), +('3', '76', '6', '46884', '71778', '13'), +('3', '76', '6', '46933', '71729', '13'), +('3', '76', '17', '70872', '91145', '13'), +('3', '76', '17', '83603', '79490', '13'), +('3', '76', '17', '46809', '56383', '13'), +('3', '76', '17', '70701', '48283', '13'), +('3', '76', '7', '53376', '66050', '13'), +('3', '76', '7', '83564', '49994', '13'), +('3', '76', '7', '39267', '49989', '13'), +('3', '76', '7', '70868', '44830', '13'), +('3', '76', '9', '46887', '72241', '13'), +('3', '76', '9', '51706', '62574', '13'), +('3', '76', '9', '39335', '55834', '13'), +('3', '76', '9', '83652', '52801', '13'), +('3', '76', '15', '79909', '85791', '13'), +('3', '76', '15', '80667', '83392', '13'), +('3', '76', '15', '80671', '82128', '13'), +('3', '76', '15', '80686', '81932', '13'), +('3', '76', '20', '80678', '106267', '13'), +('3', '76', '20', '46935', '73877', '13'), +('3', '76', '20', '80620', '71209', '13'), +('3', '76', '20', '46919', '65898', '13'), +('3', '76', '12', '47212', '59789', '13'), +('3', '76', '12', '71075', '53162', '13'), +('3', '76', '12', '83568', '47756', '13'), +('3', '76', '12', '70870', '43868', '13'), +('3', '76', '18', '83607', '64929', '13'), +('3', '76', '18', '70873', '55549', '13'), +('3', '76', '18', '46826', '54199', '13'), +('3', '76', '18', '69146', '42556', '13'), +('3', '76', '19', '80516', '77006', '13'), +('3', '76', '19', '39355', '54972', '13'), +('3', '76', '19', '83572', '49688', '13'), +('3', '76', '19', '70871', '44584', '13'), +('3', '76', '13', '46929', '185831', '13'), +('3', '76', '13', '80683', '180908', '13'), +('3', '76', '13', '80642', '178939', '13'), +('3', '76', '13', '80685', '178078', '13'), +('3', '76', '14', '80665', '78559', '13'), +('3', '76', '14', '80682', '78504', '13'), +('3', '76', '14', '80625', '71819', '13'), +('3', '76', '14', '46875', '67541', '13'), +('3', '76', '11', '80655', '108313', '13'), +('3', '76', '11', '46930', '100901', '13'), +('3', '76', '11', '46849', '84621', '13'), +('3', '76', '11', '80668', '81582', '13'), +('3', '77', '22', '39342', '0', '13'), +('3', '77', '22', '12425', '0', '13'), +('3', '77', '22', '7867', '0', '13'), +('3', '77', '22', '23597', '0', '13'), +('3', '77', '1', '80676', '81206', '13'), +('3', '77', '1', '80659', '80708', '13'), +('3', '77', '1', '80660', '77876', '13'), +('3', '77', '1', '80648', '76277', '13'), +('3', '77', '2', '70867', '68005', '13'), +('3', '77', '2', '83560', '49925', '13'), +('3', '77', '2', '28647', '46624', '13'), +('3', '77', '2', '28605', '45781', '13'), +('3', '77', '3', '80637', '76407', '13'), +('3', '77', '3', '39218', '66449', '13'), +('3', '77', '3', '46873', '65388', '13'), +('3', '77', '3', '46923', '65164', '13'), +('3', '77', '5', '46867', '89802', '13'), +('3', '77', '5', '80670', '82068', '13'), +('3', '77', '5', '80616', '73122', '13'), +('3', '77', '5', '46934', '70818', '13'), +('3', '77', '8', '46885', '95892', '13'), +('3', '77', '8', '80677', '83644', '13'), +('3', '77', '8', '80649', '74408', '13'), +('3', '77', '8', '39330', '72166', '13'), +('3', '77', '6', '80638', '99096', '13'), +('3', '77', '6', '39337', '76445', '13'), +('3', '77', '6', '46884', '71784', '13'), +('3', '77', '6', '46933', '71734', '13'), +('3', '77', '17', '70872', '88400', '13'), +('3', '77', '17', '83603', '79496', '13'), +('3', '77', '17', '46809', '56386', '13'), +('3', '77', '17', '70701', '47888', '13'), +('3', '77', '7', '53376', '66054', '13'), +('3', '77', '7', '83564', '50000', '13'), +('3', '77', '7', '39267', '49993', '13'), +('3', '77', '7', '70868', '44835', '13'), +('3', '77', '9', '46887', '72246', '13'), +('3', '77', '9', '51706', '61979', '13'), +('3', '77', '9', '39335', '55839', '13'), +('3', '77', '9', '83652', '52805', '13'), +('3', '77', '15', '79909', '85796', '13'), +('3', '77', '15', '80667', '83398', '13'), +('3', '77', '15', '80671', '82134', '13'), +('3', '77', '15', '80686', '81938', '13'), +('3', '77', '20', '80678', '106273', '13'), +('3', '77', '20', '46935', '73883', '13'), +('3', '77', '20', '80620', '71213', '13'), +('3', '77', '20', '46919', '65904', '13'), +('3', '77', '12', '47212', '59793', '13'), +('3', '77', '12', '71075', '53165', '13'), +('3', '77', '12', '83568', '47762', '13'), +('3', '77', '12', '70870', '43873', '13'), +('3', '77', '18', '83607', '64334', '13'), +('3', '77', '18', '70873', '55103', '13'), +('3', '77', '18', '46826', '54202', '13'), +('3', '77', '18', '69146', '42558', '13'), +('3', '77', '19', '80516', '77011', '13'), +('3', '77', '19', '39355', '54977', '13'), +('3', '77', '19', '83572', '49694', '13'), +('3', '77', '19', '70871', '44584', '13'), +('3', '77', '13', '46929', '186438', '13'), +('3', '77', '13', '80683', '181081', '13'), +('3', '77', '13', '80642', '179085', '13'), +('3', '77', '13', '80685', '178223', '13'), +('3', '77', '14', '80665', '78564', '13'), +('3', '77', '14', '80682', '78509', '13'), +('3', '77', '14', '80625', '71824', '13'), +('3', '77', '14', '46875', '67546', '13'), +('3', '77', '11', '80655', '108364', '13'), +('3', '77', '11', '46930', '100953', '13'), +('3', '77', '11', '46849', '84626', '13'), +('3', '77', '11', '80668', '81588', '13'), +('3', '78', '22', '39342', '0', '13'), +('3', '78', '22', '12425', '0', '13'), +('3', '78', '22', '7867', '0', '13'), +('3', '78', '22', '23597', '0', '13'), +('3', '78', '1', '80676', '81208', '13'), +('3', '78', '1', '80659', '80714', '13'), +('3', '78', '1', '80660', '77882', '13'), +('3', '78', '1', '80648', '76283', '13'), +('3', '78', '2', '70867', '68008', '13'), +('3', '78', '2', '83560', '49932', '13'), +('3', '78', '2', '28647', '46628', '13'), +('3', '78', '2', '28605', '45783', '13'), +('3', '78', '3', '80637', '76413', '13'), +('3', '78', '3', '39218', '66453', '13'), +('3', '78', '3', '46873', '65393', '13'), +('3', '78', '3', '46923', '65169', '13'), +('3', '78', '5', '46867', '89807', '13'), +('3', '78', '5', '80670', '82074', '13'), +('3', '78', '5', '80616', '73124', '13'), +('3', '78', '5', '46934', '70824', '13'), +('3', '78', '8', '46885', '95898', '13'), +('3', '78', '8', '80677', '83651', '13'), +('3', '78', '8', '80649', '74414', '13'), +('3', '78', '8', '39330', '72167', '13'), +('3', '78', '6', '80638', '99102', '13'), +('3', '78', '6', '39337', '76449', '13'), +('3', '78', '6', '46884', '71790', '13'), +('3', '78', '6', '46933', '71738', '13'), +('3', '78', '17', '70872', '85654', '13'), +('3', '78', '17', '83603', '79501', '13'), +('3', '78', '17', '46809', '56390', '13'), +('3', '78', '17', '70701', '47494', '13'), +('3', '78', '7', '53376', '66059', '13'), +('3', '78', '7', '83564', '50006', '13'), +('3', '78', '7', '39267', '49996', '13'), +('3', '78', '7', '70868', '44841', '13'), +('3', '78', '9', '46887', '72251', '13'), +('3', '78', '9', '51706', '61384', '13'), +('3', '78', '9', '39335', '55844', '13'), +('3', '78', '9', '83652', '52809', '13'), +('3', '78', '15', '79909', '85801', '13'), +('3', '78', '15', '80667', '83404', '13'), +('3', '78', '15', '80671', '82141', '13'), +('3', '78', '15', '80686', '81944', '13'), +('3', '78', '20', '80678', '106279', '13'), +('3', '78', '20', '46935', '73889', '13'), +('3', '78', '20', '80620', '71216', '13'), +('3', '78', '20', '46919', '65909', '13'), +('3', '78', '12', '47212', '59797', '13'), +('3', '78', '12', '71075', '53168', '13'), +('3', '78', '12', '83568', '47769', '13'), +('3', '78', '12', '70870', '43878', '13'), +('3', '78', '18', '83607', '63740', '13'), +('3', '78', '18', '70873', '54658', '13'), +('3', '78', '18', '46826', '54205', '13'), +('3', '78', '18', '69146', '42559', '13'), +('3', '78', '19', '80516', '77017', '13'), +('3', '78', '19', '39355', '54982', '13'), +('3', '78', '19', '83572', '49700', '13'), +('3', '78', '19', '70871', '44584', '13'), +('3', '78', '13', '46929', '187045', '13'), +('3', '78', '13', '80683', '181254', '13'), +('3', '78', '13', '80642', '179231', '13'), +('3', '78', '13', '80685', '178396', '13'), +('3', '78', '14', '80665', '78568', '13'), +('3', '78', '14', '80682', '78513', '13'), +('3', '78', '14', '80625', '71828', '13'), +('3', '78', '14', '46875', '67551', '13'), +('3', '78', '11', '80655', '108416', '13'), +('3', '78', '11', '46930', '101004', '13'), +('3', '78', '11', '46849', '84631', '13'), +('3', '78', '11', '80668', '81594', '13'), +('3', '79', '22', '39342', '0', '13'), +('3', '79', '22', '12425', '0', '13'), +('3', '79', '22', '7867', '0', '13'), +('3', '79', '22', '23597', '0', '13'), +('3', '79', '1', '80676', '81210', '13'), +('3', '79', '1', '80659', '80720', '13'), +('3', '79', '1', '80660', '77888', '13'), +('3', '79', '1', '80648', '76288', '13'), +('3', '79', '2', '70867', '68011', '13'), +('3', '79', '2', '83560', '49938', '13'), +('3', '79', '2', '28647', '46631', '13'), +('3', '79', '2', '28605', '45785', '13'), +('3', '79', '3', '80637', '76418', '13'), +('3', '79', '3', '39218', '66456', '13'), +('3', '79', '3', '46873', '65398', '13'), +('3', '79', '3', '46923', '65174', '13'), +('3', '79', '5', '46867', '89812', '13'), +('3', '79', '5', '80670', '82080', '13'), +('3', '79', '5', '80616', '73126', '13'), +('3', '79', '5', '46934', '70831', '13'), +('3', '79', '8', '46885', '95904', '13'), +('3', '79', '8', '80677', '83657', '13'), +('3', '79', '8', '80649', '74419', '13'), +('3', '79', '8', '39330', '72169', '13'), +('3', '79', '6', '80638', '99107', '13'), +('3', '79', '6', '39337', '76453', '13'), +('3', '79', '6', '46884', '71796', '13'), +('3', '79', '6', '46933', '71743', '13'), +('3', '79', '17', '70872', '82909', '13'), +('3', '79', '17', '83603', '79506', '13'), +('3', '79', '17', '46809', '56393', '13'), +('3', '79', '17', '70701', '47099', '13'), +('3', '79', '7', '53376', '66063', '13'), +('3', '79', '7', '83564', '50012', '13'), +('3', '79', '7', '39267', '50000', '13'), +('3', '79', '7', '70868', '44846', '13'), +('3', '79', '9', '46887', '72256', '13'), +('3', '79', '9', '51706', '60788', '13'), +('3', '79', '9', '39335', '55849', '13'), +('3', '79', '9', '83652', '52813', '13'), +('3', '79', '15', '79909', '85806', '13'), +('3', '79', '15', '80667', '83410', '13'), +('3', '79', '15', '80671', '82147', '13'), +('3', '79', '15', '80686', '81950', '13'), +('3', '79', '20', '80678', '106285', '13'), +('3', '79', '20', '46935', '73895', '13'), +('3', '79', '20', '80620', '71219', '13'), +('3', '79', '20', '46919', '65915', '13'), +('3', '79', '12', '47212', '59801', '13'), +('3', '79', '12', '71075', '53171', '13'), +('3', '79', '12', '83568', '47775', '13'), +('3', '79', '12', '70870', '43883', '13'), +('3', '79', '18', '83607', '63145', '13'), +('3', '79', '18', '70873', '54213', '13'), +('3', '79', '18', '46826', '54208', '13'), +('3', '79', '18', '69146', '42561', '13'), +('3', '79', '19', '80516', '77022', '13'), +('3', '79', '19', '39355', '54987', '13'), +('3', '79', '19', '83572', '49707', '13'), +('3', '79', '19', '70871', '44584', '13'), +('3', '79', '13', '46929', '187652', '13'), +('3', '79', '13', '80683', '181427', '13'), +('3', '79', '13', '80642', '179377', '13'), +('3', '79', '13', '80685', '178569', '13'), +('3', '79', '14', '80665', '78572', '13'), +('3', '79', '14', '80682', '78517', '13'), +('3', '79', '14', '80625', '71832', '13'), +('3', '79', '14', '46875', '67556', '13'), +('3', '79', '11', '80655', '108467', '13'), +('3', '79', '11', '46930', '101056', '13'), +('3', '79', '11', '46849', '84636', '13'), +('3', '79', '11', '80668', '81600', '13'), +('3', '80', '22', '39342', '0', '14'), +('3', '80', '22', '12425', '0', '14'), +('3', '80', '22', '7867', '0', '14'), +('3', '80', '22', '23597', '0', '14'), +('3', '80', '1', '102618', '109013', '14'), +('3', '80', '1', '102597', '108869', '14'), +('3', '80', '1', '102625', '108557', '14'), +('3', '80', '1', '102641', '108368', '14'), +('3', '80', '2', '102003', '74241', '14'), +('3', '80', '2', '70867', '68015', '14'), +('3', '80', '2', '102255', '66905', '14'), +('3', '80', '2', '83560', '49944', '14'), +('3', '80', '3', '102726', '119137', '14'), +('3', '80', '3', '102619', '116321', '14'), +('3', '80', '3', '102598', '116107', '14'), +('3', '80', '3', '102626', '115409', '14'), +('3', '80', '5', '102599', '114320', '14'), +('3', '80', '5', '102620', '113852', '14'), +('3', '80', '5', '102627', '112355', '14'), +('3', '80', '5', '102745', '104253', '14'), +('3', '80', '8', '102601', '138801', '14'), +('3', '80', '8', '102552', '123490', '14'), +('3', '80', '8', '102622', '116275', '14'), +('3', '80', '8', '102629', '114925', '14'), +('3', '80', '6', '102621', '115951', '14'), +('3', '80', '6', '102600', '115659', '14'), +('3', '80', '6', '102628', '114929', '14'), +('3', '80', '6', '102558', '101721', '14'), +('3', '80', '17', '70872', '80164', '14'), +('3', '80', '17', '83603', '79512', '14'), +('3', '80', '17', '102006', '79440', '14'), +('3', '80', '17', '102258', '72376', '14'), +('3', '80', '7', '102004', '75326', '14'), +('3', '80', '7', '102256', '68282', '14'), +('3', '80', '7', '53376', '66068', '14'), +('3', '80', '7', '83564', '50019', '14'), +('3', '80', '9', '67098', '192102', '14'), +('3', '80', '9', '46887', '72261', '14'), +('3', '80', '9', '102287', '62346', '14'), +('3', '80', '9', '51706', '60193', '14'), +('3', '80', '15', '102623', '110711', '14'), +('3', '80', '15', '102630', '110513', '14'), +('3', '80', '15', '102602', '110431', '14'), +('3', '80', '15', '102636', '109965', '14'), +('3', '80', '20', '102624', '138995', '14'), +('3', '80', '20', '102603', '138385', '14'), +('3', '80', '20', '102631', '138079', '14'), +('3', '80', '20', '102553', '123134', '14'), +('3', '80', '12', '102253', '64184', '14'), +('3', '80', '12', '47212', '59804', '14'), +('3', '80', '12', '71075', '53174', '14'), +('3', '80', '12', '83568', '47781', '14'), +('3', '80', '18', '102005', '77062', '14'), +('3', '80', '18', '102257', '69503', '14'), +('3', '80', '18', '83607', '62551', '14'), +('3', '80', '18', '46826', '54211', '14'), +('3', '80', '19', '76131', '83821', '14'), +('3', '80', '19', '80516', '77028', '14'), +('3', '80', '19', '102254', '64874', '14'), +('3', '80', '19', '39355', '54993', '14'), +('3', '80', '13', '102663', '247630', '14'), +('3', '80', '13', '102653', '233620', '14'), +('3', '80', '13', '102664', '233414', '14'), +('3', '80', '13', '102658', '231690', '14'), +('3', '80', '14', '102632', '117780', '14'), +('3', '80', '14', '102633', '116614', '14'), +('3', '80', '14', '102570', '102517', '14'), +('3', '80', '14', '80665', '78577', '14'), +('3', '80', '11', '102667', '158542', '14'), +('3', '80', '11', '102589', '138631', '14'), +('3', '80', '11', '102643', '110927', '14'), +('3', '80', '11', '80655', '108519', '14'), +('3', '81', '22', '39342', '0', '14'), +('3', '81', '22', '12425', '0', '14'), +('3', '81', '22', '7867', '0', '14'), +('3', '81', '22', '23597', '0', '14'), +('3', '81', '1', '102618', '109018', '14'), +('3', '81', '1', '102597', '108874', '14'), +('3', '81', '1', '102625', '108563', '14'), +('3', '81', '1', '102641', '108372', '14'), +('3', '81', '2', '102003', '74245', '14'), +('3', '81', '2', '70867', '68018', '14'), +('3', '81', '2', '102255', '66909', '14'), +('3', '81', '2', '83560', '49951', '14'), +('3', '81', '3', '102726', '119143', '14'), +('3', '81', '3', '102619', '116329', '14'), +('3', '81', '3', '102598', '116113', '14'), +('3', '81', '3', '102626', '115415', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '81', '5', '102599', '114326', '14'), +('3', '81', '5', '102620', '113855', '14'), +('3', '81', '5', '102627', '112358', '14'), +('3', '81', '5', '102745', '104259', '14'), +('3', '81', '8', '102601', '138806', '14'), +('3', '81', '8', '102552', '123495', '14'), +('3', '81', '8', '102622', '116280', '14'), +('3', '81', '8', '102629', '114929', '14'), +('3', '81', '6', '102621', '115955', '14'), +('3', '81', '6', '102600', '115664', '14'), +('3', '81', '6', '102628', '114934', '14'), +('3', '81', '6', '102558', '101728', '14'), +('3', '81', '17', '83603', '79517', '14'), +('3', '81', '17', '102006', '79444', '14'), +('3', '81', '17', '70872', '77419', '14'), +('3', '81', '17', '102258', '72382', '14'), +('3', '81', '7', '102004', '75331', '14'), +('3', '81', '7', '102256', '68288', '14'), +('3', '81', '7', '53376', '66073', '14'), +('3', '81', '7', '83564', '50025', '14'), +('3', '81', '9', '67098', '194507', '14'), +('3', '81', '9', '46887', '72266', '14'), +('3', '81', '9', '102287', '62350', '14'), +('3', '81', '9', '51706', '59598', '14'), +('3', '81', '15', '102623', '110714', '14'), +('3', '81', '15', '102630', '110517', '14'), +('3', '81', '15', '102602', '110436', '14'), +('3', '81', '15', '102636', '109970', '14'), +('3', '81', '20', '102624', '139002', '14'), +('3', '81', '20', '102603', '138390', '14'), +('3', '81', '20', '102631', '138087', '14'), +('3', '81', '20', '102553', '123140', '14'), +('3', '81', '12', '102253', '64187', '14'), +('3', '81', '12', '47212', '59808', '14'), +('3', '81', '12', '71075', '53178', '14'), +('3', '81', '12', '83568', '47788', '14'), +('3', '81', '18', '102005', '77068', '14'), +('3', '81', '18', '102257', '69508', '14'), +('3', '81', '18', '83607', '61956', '14'), +('3', '81', '18', '46826', '54215', '14'), +('3', '81', '19', '76131', '83822', '14'), +('3', '81', '19', '80516', '77033', '14'), +('3', '81', '19', '102254', '64878', '14'), +('3', '81', '19', '39355', '54998', '14'), +('3', '81', '13', '102663', '247945', '14'), +('3', '81', '13', '102653', '233822', '14'), +('3', '81', '13', '102664', '233615', '14'), +('3', '81', '13', '102658', '231864', '14'), +('3', '81', '14', '102632', '117787', '14'), +('3', '81', '14', '102633', '116618', '14'), +('3', '81', '14', '102570', '102520', '14'), +('3', '81', '14', '80665', '78581', '14'), +('3', '81', '11', '102667', '158603', '14'), +('3', '81', '11', '102589', '138681', '14'), +('3', '81', '11', '102643', '110929', '14'), +('3', '81', '11', '80655', '108570', '14'), +('3', '82', '22', '39342', '0', '14'), +('3', '82', '22', '12425', '0', '14'), +('3', '82', '22', '7867', '0', '14'), +('3', '82', '22', '23597', '0', '14'), +('3', '82', '1', '102618', '109024', '14'), +('3', '82', '1', '102597', '108879', '14'), +('3', '82', '1', '102625', '108568', '14'), +('3', '82', '1', '102641', '108377', '14'), +('3', '82', '2', '102003', '74248', '14'), +('3', '82', '2', '70867', '68021', '14'), +('3', '82', '2', '102255', '66912', '14'), +('3', '82', '2', '83560', '49957', '14'), +('3', '82', '3', '102726', '119149', '14'), +('3', '82', '3', '102619', '116336', '14'), +('3', '82', '3', '102598', '116118', '14'), +('3', '82', '3', '102626', '115421', '14'), +('3', '82', '5', '102599', '114331', '14'), +('3', '82', '5', '102620', '113857', '14'), +('3', '82', '5', '102627', '112361', '14'), +('3', '82', '5', '102745', '104264', '14'), +('3', '82', '8', '102601', '138811', '14'), +('3', '82', '8', '102552', '123500', '14'), +('3', '82', '8', '102622', '116286', '14'), +('3', '82', '8', '102629', '114933', '14'), +('3', '82', '6', '102621', '115960', '14'), +('3', '82', '6', '102600', '115669', '14'), +('3', '82', '6', '102628', '114939', '14'), +('3', '82', '6', '102558', '101734', '14'), +('3', '82', '17', '83603', '79523', '14'), +('3', '82', '17', '102006', '79448', '14'), +('3', '82', '17', '70872', '74674', '14'), +('3', '82', '17', '102258', '72388', '14'), +('3', '82', '7', '102004', '75336', '14'), +('3', '82', '7', '102256', '68294', '14'), +('3', '82', '7', '53376', '66077', '14'), +('3', '82', '7', '83564', '50031', '14'), +('3', '82', '9', '67098', '196913', '14'), +('3', '82', '9', '46887', '72272', '14'), +('3', '82', '9', '102287', '62353', '14'), +('3', '82', '9', '51706', '59002', '14'), +('3', '82', '15', '102623', '110718', '14'), +('3', '82', '15', '102630', '110522', '14'), +('3', '82', '15', '102602', '110441', '14'), +('3', '82', '15', '102636', '109975', '14'), +('3', '82', '20', '102624', '139008', '14'), +('3', '82', '20', '102603', '138395', '14'), +('3', '82', '20', '102631', '138094', '14'), +('3', '82', '20', '102553', '123146', '14'), +('3', '82', '12', '102253', '64190', '14'), +('3', '82', '12', '47212', '59812', '14'), +('3', '82', '12', '71075', '53181', '14'), +('3', '82', '12', '83568', '47794', '14'), +('3', '82', '18', '102005', '77074', '14'), +('3', '82', '18', '102257', '69512', '14'), +('3', '82', '18', '83607', '61361', '14'), +('3', '82', '18', '46826', '54218', '14'), +('3', '82', '19', '76131', '83823', '14'), +('3', '82', '19', '80516', '77039', '14'), +('3', '82', '19', '102254', '64881', '14'), +('3', '82', '19', '39355', '55003', '14'), +('3', '82', '13', '102663', '248289', '14'), +('3', '82', '13', '102653', '234023', '14'), +('3', '82', '13', '102664', '233788', '14'), +('3', '82', '13', '102658', '232067', '14'), +('3', '82', '14', '102632', '117793', '14'), +('3', '82', '14', '102633', '116622', '14'), +('3', '82', '14', '102570', '102523', '14'), +('3', '82', '14', '80665', '78585', '14'), +('3', '82', '11', '102667', '158664', '14'), +('3', '82', '11', '102589', '138740', '14'), +('3', '82', '11', '102643', '110932', '14'), +('3', '82', '11', '80655', '108622', '14'), +('3', '83', '22', '39342', '0', '14'), +('3', '83', '22', '12425', '0', '14'), +('3', '83', '22', '7867', '0', '14'), +('3', '83', '22', '23597', '0', '14'), +('3', '83', '1', '102618', '109029', '14'), +('3', '83', '1', '102597', '108884', '14'), +('3', '83', '1', '102625', '108574', '14'), +('3', '83', '1', '102641', '108381', '14'), +('3', '83', '2', '102003', '74252', '14'), +('3', '83', '2', '70867', '68025', '14'), +('3', '83', '2', '102255', '66916', '14'), +('3', '83', '2', '83560', '49963', '14'), +('3', '83', '3', '102726', '119156', '14'), +('3', '83', '3', '102619', '116345', '14'), +('3', '83', '3', '102598', '116123', '14'), +('3', '83', '3', '102626', '115428', '14'), +('3', '83', '5', '102599', '114337', '14'), +('3', '83', '5', '102620', '113860', '14'), +('3', '83', '5', '102627', '112364', '14'), +('3', '83', '5', '102745', '104270', '14'), +('3', '83', '8', '102601', '138816', '14'), +('3', '83', '8', '102552', '123506', '14'), +('3', '83', '8', '102622', '116292', '14'), +('3', '83', '8', '102629', '114937', '14'), +('3', '83', '6', '102621', '115965', '14'), +('3', '83', '6', '102600', '115675', '14'), +('3', '83', '6', '102628', '114945', '14'), +('3', '83', '6', '102558', '101741', '14'), +('3', '83', '17', '83603', '79529', '14'), +('3', '83', '17', '102006', '79452', '14'), +('3', '83', '17', '102258', '72394', '14'), +('3', '83', '17', '70872', '71929', '14'), +('3', '83', '7', '102004', '75341', '14'), +('3', '83', '7', '102256', '68300', '14'), +('3', '83', '7', '53376', '66082', '14'), +('3', '83', '7', '83564', '50038', '14'), +('3', '83', '9', '67098', '199319', '14'), +('3', '83', '9', '46887', '72277', '14'), +('3', '83', '9', '102287', '62356', '14'), +('3', '83', '9', '51706', '58407', '14'), +('3', '83', '15', '102623', '110722', '14'), +('3', '83', '15', '102630', '110527', '14'), +('3', '83', '15', '102602', '110446', '14'), +('3', '83', '15', '102636', '109981', '14'), +('3', '83', '20', '102624', '139014', '14'), +('3', '83', '20', '102603', '138401', '14'), +('3', '83', '20', '102631', '138102', '14'), +('3', '83', '20', '102553', '123152', '14'), +('3', '83', '12', '102253', '64193', '14'), +('3', '83', '12', '47212', '59816', '14'), +('3', '83', '12', '71075', '53184', '14'), +('3', '83', '12', '83568', '47800', '14'), +('3', '83', '18', '102005', '77081', '14'), +('3', '83', '18', '102257', '69517', '14'), +('3', '83', '18', '83607', '60767', '14'), +('3', '83', '18', '46826', '54221', '14'), +('3', '83', '19', '76131', '83824', '14'), +('3', '83', '19', '80516', '77045', '14'), +('3', '83', '19', '102254', '64885', '14'), +('3', '83', '19', '39355', '55008', '14'), +('3', '83', '13', '102663', '248633', '14'), +('3', '83', '13', '102653', '234196', '14'), +('3', '83', '13', '102664', '233990', '14'), +('3', '83', '13', '102658', '232241', '14'), +('3', '83', '14', '102632', '117800', '14'), +('3', '83', '14', '102633', '116626', '14'), +('3', '83', '14', '102570', '102526', '14'), +('3', '83', '14', '80665', '78590', '14'), +('3', '83', '11', '102667', '158734', '14'), +('3', '83', '11', '102589', '138790', '14'), +('3', '83', '11', '102643', '110934', '14'), +('3', '83', '11', '80655', '108673', '14'), +('3', '84', '22', '39342', '0', '14'), +('3', '84', '22', '12425', '0', '14'), +('3', '84', '22', '7867', '0', '14'), +('3', '84', '22', '23597', '0', '14'), +('3', '84', '1', '102618', '109035', '14'), +('3', '84', '1', '102597', '108889', '14'), +('3', '84', '1', '102625', '108579', '14'), +('3', '84', '1', '102641', '108386', '14'), +('3', '84', '2', '102003', '74255', '14'), +('3', '84', '2', '70867', '68028', '14'), +('3', '84', '2', '102255', '66920', '14'), +('3', '84', '2', '83560', '49970', '14'), +('3', '84', '3', '102726', '119161', '14'), +('3', '84', '3', '102619', '116352', '14'), +('3', '84', '3', '102598', '116129', '14'), +('3', '84', '3', '102626', '115434', '14'), +('3', '84', '5', '102599', '114342', '14'), +('3', '84', '5', '102620', '113862', '14'), +('3', '84', '5', '102627', '112368', '14'), +('3', '84', '5', '102745', '104275', '14'), +('3', '84', '8', '102601', '138821', '14'), +('3', '84', '8', '102552', '123511', '14'), +('3', '84', '8', '102622', '116297', '14'), +('3', '84', '8', '102629', '114941', '14'), +('3', '84', '6', '102621', '115970', '14'), +('3', '84', '6', '102600', '115680', '14'), +('3', '84', '6', '102628', '114950', '14'), +('3', '84', '6', '102558', '101747', '14'), +('3', '84', '17', '83603', '79534', '14'), +('3', '84', '17', '102006', '79455', '14'), +('3', '84', '17', '102258', '72400', '14'), +('3', '84', '17', '70872', '69184', '14'), +('3', '84', '7', '102004', '75346', '14'), +('3', '84', '7', '102256', '68306', '14'), +('3', '84', '7', '53376', '66086', '14'), +('3', '84', '7', '83564', '50044', '14'), +('3', '84', '9', '67098', '201725', '14'), +('3', '84', '9', '46887', '72282', '14'), +('3', '84', '9', '102287', '62360', '14'), +('3', '84', '9', '51706', '57812', '14'), +('3', '84', '15', '102623', '110726', '14'), +('3', '84', '15', '102630', '110531', '14'), +('3', '84', '15', '102602', '110451', '14'), +('3', '84', '15', '102636', '109986', '14'), +('3', '84', '20', '102624', '139020', '14'), +('3', '84', '20', '102603', '138406', '14'), +('3', '84', '20', '102631', '138109', '14'), +('3', '84', '20', '102553', '123158', '14'), +('3', '84', '12', '102253', '64196', '14'), +('3', '84', '12', '47212', '59819', '14'), +('3', '84', '12', '71075', '53187', '14'), +('3', '84', '12', '83568', '47807', '14'), +('3', '84', '18', '102005', '77087', '14'), +('3', '84', '18', '102257', '69522', '14'), +('3', '84', '18', '83607', '60172', '14'), +('3', '84', '18', '46826', '54224', '14'), +('3', '84', '19', '76131', '83825', '14'), +('3', '84', '19', '80516', '77050', '14'), +('3', '84', '19', '102254', '64888', '14'), +('3', '84', '19', '39355', '55013', '14'), +('3', '84', '13', '102663', '248949', '14'), +('3', '84', '13', '102653', '234398', '14'), +('3', '84', '13', '102664', '234192', '14'), +('3', '84', '13', '102658', '232443', '14'), +('3', '84', '14', '102632', '117807', '14'), +('3', '84', '14', '102633', '116631', '14'), +('3', '84', '14', '102570', '102529', '14'), +('3', '84', '14', '80665', '78594', '14'), +('3', '84', '11', '102667', '158794', '14'), +('3', '84', '11', '102589', '138850', '14'), +('3', '84', '11', '102643', '110937', '14'), +('3', '84', '11', '80655', '108725', '14'), +('3', '85', '22', '7867', '0', '16'), +('3', '85', '22', '39342', '0', '16'), +('3', '85', '22', '23597', '0', '16'), +('3', '85', '22', '66166', '0', '16'), +('3', '85', '1', '111309', '210754', '16'), +('3', '85', '1', '111303', '209969', '16'), +('3', '85', '1', '111305', '208702', '16'), +('3', '85', '1', '111300', '208626', '16'), +('3', '85', '2', '94056', '132805', '16'), +('3', '85', '2', '62985', '132114', '16'), +('3', '85', '2', '89368', '126209', '16'), +('3', '85', '2', '104403', '111511', '16'), +('3', '85', '3', '111312', '210056', '16'), +('3', '85', '3', '111315', '209180', '16'), +('3', '85', '3', '111313', '209147', '16'), +('3', '85', '3', '111316', '207089', '16'), +('3', '85', '5', '111317', '209656', '16'), +('3', '85', '5', '111318', '208733', '16'), +('3', '85', '5', '111320', '208676', '16'), +('3', '85', '5', '111319', '206724', '16'), +('3', '85', '8', '111331', '210956', '16'), +('3', '85', '8', '111328', '210031', '16'), +('3', '85', '8', '111332', '207091', '16'), +('3', '85', '8', '111030', '185176', '16'), +('3', '85', '6', '111322', '209212', '16'), +('3', '85', '6', '111324', '209114', '16'), +('3', '85', '6', '111326', '206806', '16'), +('3', '85', '6', '111021', '183482', '16'), +('3', '85', '17', '56046', '139129', '16'), +('3', '85', '17', '81765', '138578', '16'), +('3', '85', '17', '56083', '138103', '16'), +('3', '85', '17', '104406', '118760', '16'), +('3', '85', '7', '94053', '133334', '16'), +('3', '85', '7', '56079', '132704', '16'), +('3', '85', '7', '89369', '127484', '16'), +('3', '85', '7', '104404', '111402', '16'), +('3', '85', '9', '67098', '204131', '16'), +('3', '85', '9', '56031', '128741', '16'), +('3', '85', '9', '56033', '128657', '16'), +('3', '85', '9', '62992', '128563', '16'), +('3', '85', '15', '111348', '210388', '16'), +('3', '85', '15', '111343', '210144', '16'), +('3', '85', '15', '111341', '209699', '16'), +('3', '85', '15', '111342', '208950', '16'), +('3', '85', '20', '111354', '234779', '16'), +('3', '85', '20', '111355', '232647', '16'), +('3', '85', '20', '111353', '231707', '16'), +('3', '85', '20', '111351', '231404', '16'), +('3', '85', '12', '81795', '129962', '16'), +('3', '85', '12', '56073', '129767', '16'), +('3', '85', '12', '89366', '123409', '16'), +('3', '85', '12', '104401', '109993', '16'), +('3', '85', '18', '62986', '135689', '16'), +('3', '85', '18', '56041', '135518', '16'), +('3', '85', '18', '62987', '134405', '16'), +('3', '85', '18', '94054', '134158', '16'), +('3', '85', '19', '62990', '133742', '16'), +('3', '85', '19', '56037', '133327', '16'), +('3', '85', '19', '56075', '132568', '16'), +('3', '85', '19', '81763', '132062', '16'), +('3', '85', '13', '111526', '419513', '16'), +('3', '85', '13', '111514', '403118', '16'), +('3', '85', '13', '111520', '399152', '16'), +('3', '85', '13', '111525', '397627', '16'), +('3', '85', '14', '111536', '215971', '16'), +('3', '85', '14', '111539', '215032', '16'), +('3', '85', '14', '111535', '214642', '16'), +('3', '85', '14', '111538', '214163', '16'), +('3', '85', '11', '111529', '259700', '16'), +('3', '85', '11', '111229', '240504', '16'), +('3', '85', '11', '111338', '210210', '16'), +('3', '85', '11', '111336', '209926', '16'), +('3', '85', '22', '39342', '0', '15'), +('3', '85', '22', '12425', '0', '15'), +('3', '85', '22', '7867', '0', '15'), +('3', '85', '22', '23597', '0', '15'), +('3', '85', '1', '107054', '154053', '15'), +('3', '85', '1', '107019', '153286', '15'), +('3', '85', '1', '107053', '152574', '15'), +('3', '85', '1', '107001', '151964', '15'), +('3', '85', '2', '94056', '132805', '15'), +('3', '85', '2', '62985', '132114', '15'), +('3', '85', '2', '89368', '126209', '15'), +('3', '85', '2', '104403', '111511', '15'), +('3', '85', '3', '107020', '157556', '15'), +('3', '85', '3', '107055', '155895', '15'), +('3', '85', '3', '107002', '155441', '15'), +('3', '85', '3', '106849', '147260', '15'), +('3', '85', '5', '107021', '155101', '15'), +('3', '85', '5', '107056', '153765', '15'), +('3', '85', '5', '107003', '153296', '15'), +('3', '85', '5', '106811', '144642', '15'), +('3', '85', '8', '107023', '160242', '15'), +('3', '85', '8', '107058', '157946', '15'), +('3', '85', '8', '107005', '156710', '15'), +('3', '85', '8', '94070', '155880', '15'), +('3', '85', '6', '106812', '169121', '15'), +('3', '85', '6', '106843', '167011', '15'), +('3', '85', '6', '107022', '157528', '15'), +('3', '85', '6', '107004', '156123', '15'), +('3', '85', '17', '56046', '139129', '15'), +('3', '85', '17', '81765', '138578', '15'), +('3', '85', '17', '56083', '138103', '15'), +('3', '85', '17', '104406', '118760', '15'), +('3', '85', '7', '94053', '133334', '15'), +('3', '85', '7', '56079', '132704', '15'), +('3', '85', '7', '89369', '127484', '15'), +('3', '85', '7', '104404', '111402', '15'), +('3', '85', '9', '67098', '204131', '15'), +('3', '85', '9', '56031', '128741', '15'), +('3', '85', '9', '56033', '128657', '15'), +('3', '85', '9', '62992', '128563', '15'), +('3', '85', '15', '107025', '157086', '15'), +('3', '85', '15', '107062', '154338', '15'), +('3', '85', '15', '107007', '154126', '15'), +('3', '85', '15', '107051', '152799', '15'), +('3', '85', '20', '107026', '181321', '15'), +('3', '85', '20', '107059', '180478', '15'), +('3', '85', '20', '107008', '178863', '15'), +('3', '85', '20', '106816', '170583', '15'), +('3', '85', '12', '81795', '129962', '15'), +('3', '85', '12', '56073', '129767', '15'), +('3', '85', '12', '89366', '123409', '15'), +('3', '85', '12', '104401', '109993', '15'), +('3', '85', '18', '62986', '135689', '15'), +('3', '85', '18', '56041', '135518', '15'), +('3', '85', '18', '62987', '134405', '15'), +('3', '85', '18', '94054', '134158', '15'), +('3', '85', '19', '62990', '133742', '15'), +('3', '85', '19', '56037', '133327', '15'), +('3', '85', '19', '56075', '132568', '15'), +('3', '85', '19', '81763', '132062', '15'), +('3', '85', '13', '106857', '299862', '15'), +('3', '85', '13', '106866', '299366', '15'), +('3', '85', '13', '106862', '298735', '15'), +('3', '85', '13', '106865', '295319', '15'), +('3', '85', '14', '107064', '159452', '15'), +('3', '85', '14', '107065', '159087', '15'), +('3', '85', '14', '106851', '150436', '15'), +('3', '85', '14', '106852', '148773', '15'), +('3', '85', '11', '62939', '179162', '15'), +('3', '85', '11', '106769', '178654', '15'), +('3', '85', '11', '107024', '158971', '15'), +('3', '85', '11', '102667', '158855', '15'), +('3', '86', '22', '7867', '0', '16'), +('3', '86', '22', '39342', '0', '16'), +('3', '86', '22', '23597', '0', '16'), +('3', '86', '22', '66166', '0', '16'), +('3', '86', '1', '111309', '210758', '16'), +('3', '86', '1', '111303', '209975', '16'), +('3', '86', '1', '111305', '208708', '16'), +('3', '86', '1', '111300', '208631', '16'), +('3', '86', '2', '94056', '132809', '16'), +('3', '86', '2', '62985', '132118', '16'), +('3', '86', '2', '89368', '126214', '16'), +('3', '86', '2', '104403', '111515', '16'), +('3', '86', '3', '111312', '210062', '16'), +('3', '86', '3', '111315', '209187', '16'), +('3', '86', '3', '111313', '209152', '16'), +('3', '86', '3', '111316', '207094', '16'), +('3', '86', '5', '111317', '209662', '16'), +('3', '86', '5', '111318', '208737', '16'), +('3', '86', '5', '111320', '208681', '16'), +('3', '86', '5', '111319', '206729', '16'), +('3', '86', '8', '111331', '210962', '16'), +('3', '86', '8', '111328', '210036', '16'), +('3', '86', '8', '111332', '207096', '16'), +('3', '86', '8', '111030', '185182', '16'), +('3', '86', '6', '111322', '209216', '16'), +('3', '86', '6', '111324', '209119', '16'), +('3', '86', '6', '111326', '206812', '16'), +('3', '86', '6', '111021', '183486', '16'), +('3', '86', '17', '56046', '139135', '16'), +('3', '86', '17', '81765', '138582', '16'), +('3', '86', '17', '56083', '138106', '16'), +('3', '86', '17', '104406', '118767', '16'), +('3', '86', '7', '94053', '133339', '16'), +('3', '86', '7', '56079', '132710', '16'), +('3', '86', '7', '89369', '127489', '16'), +('3', '86', '7', '104404', '111407', '16'), +('3', '86', '9', '67098', '206537', '16'), +('3', '86', '9', '56031', '128744', '16'), +('3', '86', '9', '56033', '128660', '16'), +('3', '86', '9', '62992', '128568', '16'), +('3', '86', '15', '111348', '210394', '16'), +('3', '86', '15', '111343', '210149', '16'), +('3', '86', '15', '111341', '209706', '16'), +('3', '86', '15', '111342', '208956', '16'), +('3', '86', '20', '111354', '234784', '16'), +('3', '86', '20', '111355', '232651', '16'), +('3', '86', '20', '111353', '231712', '16'), +('3', '86', '20', '111351', '231408', '16'), +('3', '86', '12', '81795', '129967', '16'), +('3', '86', '12', '56073', '129774', '16'), +('3', '86', '12', '89366', '123414', '16'), +('3', '86', '12', '104401', '109999', '16'), +('3', '86', '18', '62986', '135696', '16'), +('3', '86', '18', '56041', '135521', '16'), +('3', '86', '18', '62987', '134408', '16'), +('3', '86', '18', '94054', '134163', '16'), +('3', '86', '19', '62990', '133747', '16'), +('3', '86', '19', '56037', '133333', '16'), +('3', '86', '19', '56075', '132574', '16'), +('3', '86', '19', '81763', '132068', '16'), +('3', '86', '13', '111526', '420055', '16'), +('3', '86', '13', '111514', '403633', '16'), +('3', '86', '13', '111520', '399666', '16'), +('3', '86', '13', '111525', '398141', '16'), +('3', '86', '14', '111536', '215975', '16'), +('3', '86', '14', '111539', '215037', '16'), +('3', '86', '14', '111535', '214648', '16'), +('3', '86', '14', '111538', '214167', '16'), +('3', '86', '11', '111529', '259780', '16'), +('3', '86', '11', '111229', '240576', '16'), +('3', '86', '11', '111338', '210215', '16'), +('3', '86', '11', '111336', '209932', '16'), +('3', '87', '22', '7867', '0', '16'), +('3', '87', '22', '39342', '0', '16'), +('3', '87', '22', '23597', '0', '16'), +('3', '87', '22', '66166', '0', '16'), +('3', '87', '1', '111309', '210762', '16'), +('3', '87', '1', '111303', '209981', '16'), +('3', '87', '1', '111305', '208714', '16'), +('3', '87', '1', '111300', '208635', '16'), +('3', '87', '2', '94056', '132814', '16'), +('3', '87', '2', '62985', '132123', '16'), +('3', '87', '2', '89368', '126220', '16'), +('3', '87', '2', '104403', '111519', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '87', '3', '111312', '210067', '16'), +('3', '87', '3', '111315', '209194', '16'), +('3', '87', '3', '111313', '209157', '16'), +('3', '87', '3', '111316', '207099', '16'), +('3', '87', '5', '111317', '209668', '16'), +('3', '87', '5', '111318', '208741', '16'), +('3', '87', '5', '111320', '208686', '16'), +('3', '87', '5', '111319', '206736', '16'), +('3', '87', '8', '111331', '210968', '16'), +('3', '87', '8', '111328', '210042', '16'), +('3', '87', '8', '111332', '207101', '16'), +('3', '87', '8', '111030', '185188', '16'), +('3', '87', '6', '111322', '209220', '16'), +('3', '87', '6', '111324', '209125', '16'), +('3', '87', '6', '111326', '206818', '16'), +('3', '87', '6', '111021', '183490', '16'), +('3', '87', '17', '56046', '139142', '16'), +('3', '87', '17', '81765', '138587', '16'), +('3', '87', '17', '56083', '138109', '16'), +('3', '87', '17', '104406', '118774', '16'), +('3', '87', '7', '94053', '133344', '16'), +('3', '87', '7', '56079', '132716', '16'), +('3', '87', '7', '89369', '127494', '16'), +('3', '87', '7', '104404', '111413', '16'), +('3', '87', '9', '67098', '208944', '16'), +('3', '87', '9', '56031', '128748', '16'), +('3', '87', '9', '56033', '128664', '16'), +('3', '87', '9', '62992', '128574', '16'), +('3', '87', '15', '111348', '210401', '16'), +('3', '87', '15', '111343', '210153', '16'), +('3', '87', '15', '111341', '209712', '16'), +('3', '87', '15', '111342', '208963', '16'), +('3', '87', '20', '111354', '234790', '16'), +('3', '87', '20', '111355', '232655', '16'), +('3', '87', '20', '111353', '231718', '16'), +('3', '87', '20', '111351', '231412', '16'), +('3', '87', '12', '81795', '129973', '16'), +('3', '87', '12', '56073', '129781', '16'), +('3', '87', '12', '89366', '123418', '16'), +('3', '87', '12', '104401', '110005', '16'), +('3', '87', '18', '62986', '135704', '16'), +('3', '87', '18', '56041', '135525', '16'), +('3', '87', '18', '62987', '134412', '16'), +('3', '87', '18', '94054', '134168', '16'), +('3', '87', '19', '62990', '133752', '16'), +('3', '87', '19', '56037', '133338', '16'), +('3', '87', '19', '56075', '132580', '16'), +('3', '87', '19', '81763', '132074', '16'), +('3', '87', '13', '111526', '420598', '16'), +('3', '87', '13', '111514', '404147', '16'), +('3', '87', '13', '111520', '400180', '16'), +('3', '87', '13', '111525', '398655', '16'), +('3', '87', '14', '111536', '215980', '16'), +('3', '87', '14', '111539', '215042', '16'), +('3', '87', '14', '111535', '214654', '16'), +('3', '87', '14', '111538', '214171', '16'), +('3', '87', '11', '111529', '259861', '16'), +('3', '87', '11', '111229', '240656', '16'), +('3', '87', '11', '111338', '210221', '16'), +('3', '87', '11', '111336', '209938', '16'), +('3', '88', '22', '7867', '0', '16'), +('3', '88', '22', '39342', '0', '16'), +('3', '88', '22', '23597', '0', '16'), +('3', '88', '22', '66166', '0', '16'), +('3', '88', '1', '111309', '210767', '16'), +('3', '88', '1', '111303', '209987', '16'), +('3', '88', '1', '111305', '208721', '16'), +('3', '88', '1', '111300', '208639', '16'), +('3', '88', '2', '94056', '132819', '16'), +('3', '88', '2', '62985', '132127', '16'), +('3', '88', '2', '89368', '126225', '16'), +('3', '88', '2', '104403', '111523', '16'), +('3', '88', '3', '111312', '210073', '16'), +('3', '88', '3', '111315', '209201', '16'), +('3', '88', '3', '111313', '209162', '16'), +('3', '88', '3', '111316', '207105', '16'), +('3', '88', '5', '111317', '209675', '16'), +('3', '88', '5', '111318', '208745', '16'), +('3', '88', '5', '111320', '208692', '16'), +('3', '88', '5', '111319', '206742', '16'), +('3', '88', '8', '111331', '210975', '16'), +('3', '88', '8', '111328', '210047', '16'), +('3', '88', '8', '111332', '207105', '16'), +('3', '88', '8', '111030', '185195', '16'), +('3', '88', '6', '111322', '209224', '16'), +('3', '88', '6', '111324', '209130', '16'), +('3', '88', '6', '111326', '206824', '16'), +('3', '88', '6', '111021', '183494', '16'), +('3', '88', '17', '56046', '139149', '16'), +('3', '88', '17', '81765', '138591', '16'), +('3', '88', '17', '56083', '138112', '16'), +('3', '88', '17', '104406', '118782', '16'), +('3', '88', '7', '94053', '133350', '16'), +('3', '88', '7', '56079', '132721', '16'), +('3', '88', '7', '89369', '127500', '16'), +('3', '88', '7', '104404', '111418', '16'), +('3', '88', '9', '67098', '211350', '16'), +('3', '88', '9', '56031', '128752', '16'), +('3', '88', '9', '56033', '128668', '16'), +('3', '88', '9', '62992', '128579', '16'), +('3', '88', '15', '111348', '210407', '16'), +('3', '88', '15', '111343', '210158', '16'), +('3', '88', '15', '111341', '209719', '16'), +('3', '88', '15', '111342', '208969', '16'), +('3', '88', '20', '111354', '234795', '16'), +('3', '88', '20', '111355', '232659', '16'), +('3', '88', '20', '111353', '231723', '16'), +('3', '88', '20', '111351', '231417', '16'), +('3', '88', '12', '81795', '129979', '16'), +('3', '88', '12', '56073', '129788', '16'), +('3', '88', '12', '89366', '123423', '16'), +('3', '88', '12', '104401', '110011', '16'), +('3', '88', '18', '62986', '135711', '16'), +('3', '88', '18', '56041', '135528', '16'), +('3', '88', '18', '62987', '134415', '16'), +('3', '88', '18', '94054', '134173', '16'), +('3', '88', '19', '62990', '133757', '16'), +('3', '88', '19', '56037', '133344', '16'), +('3', '88', '19', '56075', '132586', '16'), +('3', '88', '19', '81763', '132080', '16'), +('3', '88', '13', '111526', '421140', '16'), +('3', '88', '13', '111514', '404662', '16'), +('3', '88', '13', '111520', '400694', '16'), +('3', '88', '13', '111525', '399141', '16'), +('3', '88', '14', '111536', '215985', '16'), +('3', '88', '14', '111539', '215048', '16'), +('3', '88', '14', '111535', '214660', '16'), +('3', '88', '14', '111538', '214176', '16'), +('3', '88', '11', '111529', '259941', '16'), +('3', '88', '11', '111229', '240728', '16'), +('3', '88', '11', '111338', '210227', '16'), +('3', '88', '11', '111336', '209944', '16'), +('3', '89', '22', '7867', '0', '16'), +('3', '89', '22', '39342', '0', '16'), +('3', '89', '22', '23597', '0', '16'), +('3', '89', '22', '66166', '0', '16'), +('3', '89', '1', '111309', '210770', '16'), +('3', '89', '1', '111303', '209992', '16'), +('3', '89', '1', '111305', '208727', '16'), +('3', '89', '1', '111300', '208644', '16'), +('3', '89', '2', '94056', '132823', '16'), +('3', '89', '2', '62985', '132132', '16'), +('3', '89', '2', '89368', '126230', '16'), +('3', '89', '2', '104403', '111527', '16'), +('3', '89', '3', '111312', '210079', '16'), +('3', '89', '3', '111315', '209208', '16'), +('3', '89', '3', '111313', '209166', '16'), +('3', '89', '3', '111316', '207110', '16'), +('3', '89', '5', '111317', '209680', '16'), +('3', '89', '5', '111318', '208750', '16'), +('3', '89', '5', '111320', '208697', '16'), +('3', '89', '5', '111319', '206748', '16'), +('3', '89', '8', '111331', '210981', '16'), +('3', '89', '8', '111328', '210052', '16'), +('3', '89', '8', '111332', '207110', '16'), +('3', '89', '8', '111030', '185201', '16'), +('3', '89', '6', '111322', '209228', '16'), +('3', '89', '6', '111324', '209135', '16'), +('3', '89', '6', '111326', '206830', '16'), +('3', '89', '6', '111021', '183498', '16'), +('3', '89', '17', '56046', '139156', '16'), +('3', '89', '17', '81765', '138596', '16'), +('3', '89', '17', '56083', '138115', '16'), +('3', '89', '17', '104406', '118788', '16'), +('3', '89', '7', '94053', '133354', '16'), +('3', '89', '7', '56079', '132727', '16'), +('3', '89', '7', '89369', '127505', '16'), +('3', '89', '7', '104404', '111423', '16'), +('3', '89', '9', '67098', '213757', '16'), +('3', '89', '9', '56031', '128756', '16'), +('3', '89', '9', '56033', '128671', '16'), +('3', '89', '9', '62992', '128584', '16'), +('3', '89', '15', '111348', '210414', '16'), +('3', '89', '15', '111343', '210162', '16'), +('3', '89', '15', '111341', '209725', '16'), +('3', '89', '15', '111342', '208975', '16'), +('3', '89', '20', '111354', '234801', '16'), +('3', '89', '20', '111355', '232662', '16'), +('3', '89', '20', '111353', '231728', '16'), +('3', '89', '20', '111351', '231421', '16'), +('3', '89', '12', '81795', '129984', '16'), +('3', '89', '12', '56073', '129794', '16'), +('3', '89', '12', '89366', '123427', '16'), +('3', '89', '12', '104401', '110017', '16'), +('3', '89', '18', '62986', '135718', '16'), +('3', '89', '18', '56041', '135531', '16'), +('3', '89', '18', '62987', '134419', '16'), +('3', '89', '18', '94054', '134178', '16'), +('3', '89', '19', '62990', '133761', '16'), +('3', '89', '19', '56037', '133349', '16'), +('3', '89', '19', '56075', '132592', '16'), +('3', '89', '19', '81763', '132085', '16'), +('3', '89', '13', '111526', '421683', '16'), +('3', '89', '13', '111514', '405176', '16'), +('3', '89', '13', '111520', '401208', '16'), +('3', '89', '13', '111525', '399656', '16'), +('3', '89', '14', '111536', '215989', '16'), +('3', '89', '14', '111539', '215053', '16'), +('3', '89', '14', '111535', '214666', '16'), +('3', '89', '14', '111538', '214180', '16'), +('3', '89', '11', '111529', '260012', '16'), +('3', '89', '11', '111229', '240799', '16'), +('3', '89', '11', '111338', '210232', '16'), +('3', '89', '11', '111336', '209950', '16'), +('3', '90', '22', '7867', '0', '17'), +('3', '90', '22', '39342', '0', '17'), +('3', '90', '22', '23597', '0', '17'), +('3', '90', '22', '66166', '0', '17'), +('3', '90', '1', '111309', '210775', '17'), +('3', '90', '1', '111303', '209998', '17'), +('3', '90', '1', '111305', '208733', '17'), +('3', '90', '1', '111300', '208648', '17'), +('3', '90', '2', '94056', '132828', '17'), +('3', '90', '2', '62985', '132136', '17'), +('3', '90', '2', '89368', '126235', '17'), +('3', '90', '2', '104403', '111531', '17'), +('3', '90', '3', '111312', '210084', '17'), +('3', '90', '3', '111315', '209215', '17'), +('3', '90', '3', '111313', '209171', '17'), +('3', '90', '3', '111316', '207115', '17'), +('3', '90', '5', '111317', '209687', '17'), +('3', '90', '5', '111318', '208754', '17'), +('3', '90', '5', '111320', '208702', '17'), +('3', '90', '5', '111319', '206754', '17'), +('3', '90', '8', '111331', '210987', '17'), +('3', '90', '8', '111328', '210057', '17'), +('3', '90', '8', '111332', '207115', '17'), +('3', '90', '8', '111030', '185207', '17'), +('3', '90', '6', '111322', '209232', '17'), +('3', '90', '6', '111324', '209141', '17'), +('3', '90', '6', '111326', '206836', '17'), +('3', '90', '6', '111021', '183502', '17'), +('3', '90', '17', '56046', '139163', '17'), +('3', '90', '17', '81765', '138600', '17'), +('3', '90', '17', '56083', '138118', '17'), +('3', '90', '17', '104406', '118795', '17'), +('3', '90', '7', '94053', '133360', '17'), +('3', '90', '7', '56079', '132733', '17'), +('3', '90', '7', '89369', '127510', '17'), +('3', '90', '7', '104404', '111429', '17'), +('3', '90', '9', '67098', '216163', '17'), +('3', '90', '9', '56031', '128760', '17'), +('3', '90', '9', '56033', '128675', '17'), +('3', '90', '9', '62992', '128590', '17'), +('3', '90', '15', '111348', '210420', '17'), +('3', '90', '15', '111343', '210167', '17'), +('3', '90', '15', '111341', '209732', '17'), +('3', '90', '15', '111342', '208981', '17'), +('3', '90', '20', '111354', '234806', '17'), +('3', '90', '20', '111355', '232666', '17'), +('3', '90', '20', '111353', '231734', '17'), +('3', '90', '20', '111351', '231425', '17'), +('3', '90', '12', '81795', '129990', '17'), +('3', '90', '12', '56073', '129801', '17'), +('3', '90', '12', '89366', '123432', '17'), +('3', '90', '12', '104401', '110023', '17'), +('3', '90', '18', '62986', '135726', '17'), +('3', '90', '18', '56041', '135535', '17'), +('3', '90', '18', '62987', '134422', '17'), +('3', '90', '18', '94054', '134183', '17'), +('3', '90', '19', '62990', '133766', '17'), +('3', '90', '19', '56037', '133355', '17'), +('3', '90', '19', '56075', '132598', '17'), +('3', '90', '19', '81763', '132091', '17'), +('3', '90', '13', '111526', '422225', '17'), +('3', '90', '13', '111514', '405720', '17'), +('3', '90', '13', '111520', '401722', '17'), +('3', '90', '13', '111525', '400170', '17'), +('3', '90', '14', '111536', '215994', '17'), +('3', '90', '14', '111539', '215058', '17'), +('3', '90', '14', '111535', '214672', '17'), +('3', '90', '14', '111538', '214185', '17'), +('3', '90', '11', '111529', '260093', '17'), +('3', '90', '11', '111229', '240880', '17'), +('3', '90', '11', '111338', '210238', '17'), +('3', '90', '11', '111336', '209956', '17'), +('3', '91', '22', '7867', '0', '17'), +('3', '91', '22', '39342', '0', '17'), +('3', '91', '22', '23597', '0', '17'), +('3', '91', '22', '66166', '0', '17'), +('3', '91', '1', '111309', '210779', '17'), +('3', '91', '1', '111303', '210004', '17'), +('3', '91', '1', '111305', '208739', '17'), +('3', '91', '1', '111300', '208652', '17'), +('3', '91', '2', '94056', '132833', '17'), +('3', '91', '2', '62985', '132141', '17'), +('3', '91', '2', '89368', '126241', '17'), +('3', '91', '2', '104403', '111536', '17'), +('3', '91', '3', '111312', '210090', '17'), +('3', '91', '3', '111315', '209222', '17'), +('3', '91', '3', '111313', '209176', '17'), +('3', '91', '3', '111316', '207121', '17'), +('3', '91', '5', '111317', '209693', '17'), +('3', '91', '5', '111318', '208758', '17'), +('3', '91', '5', '111320', '208707', '17'), +('3', '91', '5', '111319', '206760', '17'), +('3', '91', '8', '111331', '210993', '17'), +('3', '91', '8', '111328', '210063', '17'), +('3', '91', '8', '111332', '207119', '17'), +('3', '91', '8', '111030', '185213', '17'), +('3', '91', '6', '111322', '209236', '17'), +('3', '91', '6', '111324', '209146', '17'), +('3', '91', '6', '111326', '206842', '17'), +('3', '91', '6', '111021', '183506', '17'), +('3', '91', '17', '56046', '139170', '17'), +('3', '91', '17', '81765', '138605', '17'), +('3', '91', '17', '56083', '138121', '17'), +('3', '91', '17', '104406', '118803', '17'), +('3', '91', '7', '94053', '133365', '17'), +('3', '91', '7', '56079', '132738', '17'), +('3', '91', '7', '89369', '127516', '17'), +('3', '91', '7', '104404', '111434', '17'), +('3', '91', '9', '67098', '216168', '17'), +('3', '91', '9', '56031', '128764', '17'), +('3', '91', '9', '56033', '128678', '17'), +('3', '91', '9', '62992', '128595', '17'), +('3', '91', '15', '111348', '210427', '17'), +('3', '91', '15', '111343', '210171', '17'), +('3', '91', '15', '111341', '209739', '17'), +('3', '91', '15', '111342', '208987', '17'), +('3', '91', '20', '111354', '234812', '17'), +('3', '91', '20', '111355', '232670', '17'), +('3', '91', '20', '111353', '231740', '17'), +('3', '91', '20', '111351', '231430', '17'), +('3', '91', '12', '81795', '129996', '17'), +('3', '91', '12', '56073', '129808', '17'), +('3', '91', '12', '89366', '123437', '17'), +('3', '91', '12', '104401', '110029', '17'), +('3', '91', '18', '62986', '135733', '17'), +('3', '91', '18', '56041', '135538', '17'), +('3', '91', '18', '62987', '134426', '17'), +('3', '91', '18', '94054', '134189', '17'), +('3', '91', '19', '62990', '133771', '17'), +('3', '91', '19', '56037', '133361', '17'), +('3', '91', '19', '56075', '132603', '17'), +('3', '91', '19', '81763', '132097', '17'), +('3', '91', '13', '111526', '422768', '17'), +('3', '91', '13', '111514', '406234', '17'), +('3', '91', '13', '111520', '402237', '17'), +('3', '91', '13', '111525', '400685', '17'), +('3', '91', '14', '111536', '215999', '17'), +('3', '91', '14', '111539', '215064', '17'), +('3', '91', '14', '111535', '214678', '17'), +('3', '91', '14', '111538', '214189', '17'), +('3', '91', '11', '111529', '260174', '17'), +('3', '91', '11', '111229', '240952', '17'), +('3', '91', '11', '111338', '210243', '17'), +('3', '91', '11', '111336', '209962', '17'), +('3', '92', '22', '7867', '0', '17'), +('3', '92', '22', '39342', '0', '17'), +('3', '92', '22', '23597', '0', '17'), +('3', '92', '22', '66166', '0', '17'), +('3', '92', '1', '111309', '210783', '17'), +('3', '92', '1', '111303', '210010', '17'), +('3', '92', '1', '111305', '208746', '17'), +('3', '92', '1', '111300', '208657', '17'), +('3', '92', '2', '94056', '132838', '17'), +('3', '92', '2', '62985', '132146', '17'), +('3', '92', '2', '89368', '126246', '17'), +('3', '92', '2', '104403', '111540', '17'), +('3', '92', '3', '111312', '210096', '17'), +('3', '92', '3', '111315', '209230', '17'), +('3', '92', '3', '111313', '209181', '17'), +('3', '92', '3', '111316', '207126', '17'), +('3', '92', '5', '111317', '209699', '17'), +('3', '92', '5', '111318', '208762', '17'), +('3', '92', '5', '111320', '208713', '17'), +('3', '92', '5', '111319', '206766', '17'), +('3', '92', '8', '111331', '211000', '17'), +('3', '92', '8', '111328', '210068', '17'), +('3', '92', '8', '111332', '207124', '17'), +('3', '92', '8', '111030', '185220', '17'), +('3', '92', '6', '111322', '209240', '17'), +('3', '92', '6', '111324', '209152', '17'), +('3', '92', '6', '111326', '206848', '17'), +('3', '92', '6', '111021', '183510', '17'), +('3', '92', '17', '56046', '139177', '17'), +('3', '92', '17', '81765', '138610', '17'), +('3', '92', '17', '56083', '138124', '17'), +('3', '92', '17', '104406', '118810', '17'), +('3', '92', '7', '94053', '133370', '17'), +('3', '92', '7', '56079', '132744', '17'), +('3', '92', '7', '89369', '127522', '17'), +('3', '92', '7', '104404', '111439', '17'), +('3', '92', '9', '67098', '216174', '17'), +('3', '92', '9', '56031', '128768', '17'), +('3', '92', '9', '56033', '128682', '17'), +('3', '92', '9', '62992', '128600', '17'), +('3', '92', '15', '111348', '210433', '17'), +('3', '92', '15', '111343', '210176', '17'), +('3', '92', '15', '111341', '209746', '17'), +('3', '92', '15', '111342', '208993', '17'), +('3', '92', '20', '111354', '234817', '17'), +('3', '92', '20', '111355', '232674', '17'), +('3', '92', '20', '111353', '231745', '17'), +('3', '92', '20', '111351', '231434', '17'), +('3', '92', '12', '81795', '130001', '17'), +('3', '92', '12', '56073', '129815', '17'), +('3', '92', '12', '89366', '123441', '17'), +('3', '92', '12', '104401', '110035', '17'), +('3', '92', '18', '62986', '135740', '17'), +('3', '92', '18', '56041', '135541', '17'), +('3', '92', '18', '62987', '134429', '17'), +('3', '92', '18', '94054', '134194', '17'), +('3', '92', '19', '62990', '133776', '17'), +('3', '92', '19', '56037', '133366', '17'), +('3', '92', '19', '56075', '132609', '17'), +('3', '92', '19', '81763', '132103', '17'), +('3', '92', '13', '111526', '423310', '17'), +('3', '92', '13', '111514', '406749', '17'), +('3', '92', '13', '111520', '402751', '17'), +('3', '92', '13', '111525', '401199', '17'), +('3', '92', '14', '111536', '216004', '17'), +('3', '92', '14', '111539', '215069', '17'), +('3', '92', '14', '111535', '214684', '17'), +('3', '92', '14', '111538', '214193', '17'), +('3', '92', '11', '111529', '260245', '17'), +('3', '92', '11', '111229', '241033', '17'), +('3', '92', '11', '111338', '210249', '17'), +('3', '92', '11', '111336', '209968', '17'), +('3', '93', '22', '7867', '0', '17'), +('3', '93', '22', '39342', '0', '17'), +('3', '93', '22', '23597', '0', '17'), +('3', '93', '22', '66166', '0', '17'), +('3', '93', '1', '111309', '210787', '17'), +('3', '93', '1', '111303', '210017', '17'), +('3', '93', '1', '111305', '208752', '17'), +('3', '93', '1', '111300', '208661', '17'), +('3', '93', '2', '94056', '132843', '17'), +('3', '93', '2', '62985', '132150', '17'), +('3', '93', '2', '89368', '126251', '17'), +('3', '93', '2', '104403', '111544', '17'), +('3', '93', '3', '111312', '210101', '17'), +('3', '93', '3', '111315', '209237', '17'), +('3', '93', '3', '111313', '209185', '17'), +('3', '93', '3', '111316', '207132', '17'), +('3', '93', '5', '111317', '209706', '17'), +('3', '93', '5', '111318', '208767', '17'), +('3', '93', '5', '111320', '208718', '17'), +('3', '93', '5', '111319', '206773', '17'), +('3', '93', '8', '111331', '211006', '17'), +('3', '93', '8', '111328', '210074', '17'), +('3', '93', '8', '111332', '207129', '17'), +('3', '93', '8', '111030', '185226', '17'), +('3', '93', '6', '111322', '209245', '17'), +('3', '93', '6', '111324', '209158', '17'), +('3', '93', '6', '111326', '206854', '17'), +('3', '93', '6', '111021', '183515', '17'), +('3', '93', '17', '56046', '139184', '17'), +('3', '93', '17', '81765', '138614', '17'), +('3', '93', '17', '56083', '138128', '17'), +('3', '93', '17', '104406', '118817', '17'), +('3', '93', '7', '94053', '133375', '17'), +('3', '93', '7', '56079', '132750', '17'), +('3', '93', '7', '89369', '127527', '17'), +('3', '93', '7', '104404', '111445', '17'), +('3', '93', '9', '67098', '216179', '17'), +('3', '93', '9', '56031', '128772', '17'), +('3', '93', '9', '56033', '128686', '17'), +('3', '93', '9', '62992', '128606', '17'), +('3', '93', '15', '111348', '210440', '17'), +('3', '93', '15', '111343', '210180', '17'), +('3', '93', '15', '111341', '209752', '17'), +('3', '93', '15', '111342', '209000', '17'), +('3', '93', '20', '111354', '234823', '17'), +('3', '93', '20', '111355', '232678', '17'), +('3', '93', '20', '111353', '231751', '17'), +('3', '93', '20', '111351', '231438', '17'), +('3', '93', '12', '81795', '130007', '17'), +('3', '93', '12', '56073', '129822', '17'), +('3', '93', '12', '89366', '123446', '17'), +('3', '93', '12', '104401', '110041', '17'), +('3', '93', '18', '62986', '135748', '17'), +('3', '93', '18', '56041', '135545', '17'), +('3', '93', '18', '62987', '134433', '17'), +('3', '93', '18', '94054', '134199', '17'), +('3', '93', '19', '62990', '133781', '17'), +('3', '93', '19', '56037', '133372', '17'), +('3', '93', '19', '56075', '132615', '17'), +('3', '93', '19', '81763', '132108', '17'), +('3', '93', '13', '111526', '423853', '17'), +('3', '93', '13', '111514', '407264', '17'), +('3', '93', '13', '111520', '403265', '17'), +('3', '93', '13', '111525', '401714', '17'), +('3', '93', '14', '111536', '216009', '17'), +('3', '93', '14', '111539', '215075', '17'), +('3', '93', '14', '111535', '214690', '17'), +('3', '93', '14', '111538', '214198', '17'), +('3', '93', '11', '111529', '260325', '17'), +('3', '93', '11', '111229', '241104', '17'), +('3', '93', '11', '111338', '210255', '17'), +('3', '93', '11', '111336', '209974', '17'), +('3', '94', '22', '7867', '0', '17'), +('3', '94', '22', '39342', '0', '17'), +('3', '94', '22', '23597', '0', '17'), +('3', '94', '22', '66166', '0', '17'), +('3', '94', '1', '111309', '210791', '17'), +('3', '94', '1', '111303', '210023', '17'), +('3', '94', '1', '111305', '208758', '17'), +('3', '94', '1', '111300', '208665', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '94', '2', '94056', '132847', '17'), +('3', '94', '2', '62985', '132155', '17'), +('3', '94', '2', '89368', '126257', '17'), +('3', '94', '2', '104403', '111548', '17'), +('3', '94', '3', '111312', '210107', '17'), +('3', '94', '3', '111315', '209244', '17'), +('3', '94', '3', '111313', '209190', '17'), +('3', '94', '3', '111316', '207137', '17'), +('3', '94', '5', '111317', '209712', '17'), +('3', '94', '5', '111318', '208771', '17'), +('3', '94', '5', '111320', '208723', '17'), +('3', '94', '5', '111319', '206779', '17'), +('3', '94', '8', '111331', '211013', '17'), +('3', '94', '8', '111328', '210079', '17'), +('3', '94', '8', '111332', '207134', '17'), +('3', '94', '8', '111030', '185233', '17'), +('3', '94', '6', '111322', '209249', '17'), +('3', '94', '6', '111324', '209163', '17'), +('3', '94', '6', '111326', '206860', '17'), +('3', '94', '6', '111021', '183519', '17'), +('3', '94', '17', '56046', '139191', '17'), +('3', '94', '17', '81765', '138619', '17'), +('3', '94', '17', '56083', '138131', '17'), +('3', '94', '17', '104406', '118824', '17'), +('3', '94', '7', '94053', '133381', '17'), +('3', '94', '7', '56079', '132756', '17'), +('3', '94', '7', '89369', '127533', '17'), +('3', '94', '7', '104404', '111450', '17'), +('3', '94', '9', '67098', '216184', '17'), +('3', '94', '9', '56031', '128775', '17'), +('3', '94', '9', '56033', '128690', '17'), +('3', '94', '9', '62992', '128611', '17'), +('3', '94', '15', '111348', '210447', '17'), +('3', '94', '15', '111343', '210185', '17'), +('3', '94', '15', '111341', '209759', '17'), +('3', '94', '15', '111342', '209006', '17'), +('3', '94', '20', '111354', '234829', '17'), +('3', '94', '20', '111355', '232682', '17'), +('3', '94', '20', '111353', '231756', '17'), +('3', '94', '20', '111351', '231443', '17'), +('3', '94', '12', '81795', '130013', '17'), +('3', '94', '12', '56073', '129829', '17'), +('3', '94', '12', '89366', '123450', '17'), +('3', '94', '12', '104401', '110047', '17'), +('3', '94', '18', '62986', '135755', '17'), +('3', '94', '18', '56041', '135548', '17'), +('3', '94', '18', '62987', '134436', '17'), +('3', '94', '18', '94054', '134205', '17'), +('3', '94', '19', '62990', '133786', '17'), +('3', '94', '19', '56037', '133378', '17'), +('3', '94', '19', '56075', '132621', '17'), +('3', '94', '19', '81763', '132114', '17'), +('3', '94', '13', '111526', '424367', '17'), +('3', '94', '13', '111514', '407778', '17'), +('3', '94', '13', '111520', '403779', '17'), +('3', '94', '13', '111525', '402228', '17'), +('3', '94', '14', '111536', '216013', '17'), +('3', '94', '14', '111539', '215080', '17'), +('3', '94', '14', '111535', '214697', '17'), +('3', '94', '14', '111538', '214202', '17'), +('3', '94', '11', '111529', '260406', '17'), +('3', '94', '11', '111229', '241176', '17'), +('3', '94', '11', '111338', '210261', '17'), +('3', '94', '11', '111336', '209980', '17'), +('3', '95', '22', '23597', '0', '18'), +('3', '95', '22', '7867', '0', '18'), +('3', '95', '22', '39342', '0', '18'), +('3', '95', '22', '66166', '0', '18'), +('3', '95', '1', '111309', '210796', '18'), +('3', '95', '1', '111303', '210029', '18'), +('3', '95', '1', '111305', '208765', '18'), +('3', '95', '1', '111300', '208670', '18'), +('3', '95', '2', '94056', '132852', '18'), +('3', '95', '2', '62985', '132159', '18'), +('3', '95', '2', '89368', '126262', '18'), +('3', '95', '2', '104403', '111552', '18'), +('3', '95', '3', '111312', '210113', '18'), +('3', '95', '3', '111315', '209251', '18'), +('3', '95', '3', '111313', '209195', '18'), +('3', '95', '3', '111316', '207142', '18'), +('3', '95', '5', '111317', '209718', '18'), +('3', '95', '5', '111318', '208775', '18'), +('3', '95', '5', '111320', '208729', '18'), +('3', '95', '5', '111319', '206785', '18'), +('3', '95', '8', '111331', '211019', '18'), +('3', '95', '8', '111328', '210084', '18'), +('3', '95', '8', '111332', '207138', '18'), +('3', '95', '8', '111030', '185239', '18'), +('3', '95', '6', '111322', '209253', '18'), +('3', '95', '6', '111324', '209169', '18'), +('3', '95', '6', '111326', '206867', '18'), +('3', '95', '6', '111021', '183523', '18'), +('3', '95', '17', '56046', '139198', '18'), +('3', '95', '17', '81765', '138623', '18'), +('3', '95', '17', '56083', '138134', '18'), +('3', '95', '17', '104406', '118831', '18'), +('3', '95', '7', '94053', '133386', '18'), +('3', '95', '7', '56079', '132762', '18'), +('3', '95', '7', '89369', '127538', '18'), +('3', '95', '7', '104404', '111456', '18'), +('3', '95', '9', '67098', '216189', '18'), +('3', '95', '9', '56031', '128779', '18'), +('3', '95', '9', '56033', '128693', '18'), +('3', '95', '9', '62992', '128617', '18'), +('3', '95', '15', '111348', '210453', '18'), +('3', '95', '15', '111343', '210189', '18'), +('3', '95', '15', '111341', '209766', '18'), +('3', '95', '15', '111342', '209012', '18'), +('3', '95', '20', '111354', '234834', '18'), +('3', '95', '20', '111355', '232685', '18'), +('3', '95', '20', '111353', '231762', '18'), +('3', '95', '20', '111351', '231447', '18'), +('3', '95', '12', '81795', '130018', '18'), +('3', '95', '12', '56073', '129836', '18'), +('3', '95', '12', '89366', '123455', '18'), +('3', '95', '12', '104401', '110053', '18'), +('3', '95', '18', '62986', '135763', '18'), +('3', '95', '18', '56041', '135551', '18'), +('3', '95', '18', '62987', '134440', '18'), +('3', '95', '18', '94054', '134210', '18'), +('3', '95', '19', '62990', '133790', '18'), +('3', '95', '19', '56037', '133384', '18'), +('3', '95', '19', '56075', '132627', '18'), +('3', '95', '19', '81763', '132120', '18'), +('3', '95', '13', '111526', '424909', '18'), +('3', '95', '13', '111514', '408293', '18'), +('3', '95', '13', '111520', '404293', '18'), +('3', '95', '13', '111525', '402743', '18'), +('3', '95', '14', '111536', '216018', '18'), +('3', '95', '14', '111539', '215086', '18'), +('3', '95', '14', '111535', '214703', '18'), +('3', '95', '14', '111538', '214207', '18'), +('3', '95', '11', '111529', '260487', '18'), +('3', '95', '11', '111229', '241257', '18'), +('3', '95', '11', '111338', '210266', '18'), +('3', '95', '11', '111336', '209986', '18'), +('3', '96', '22', '23597', '0', '18'), +('3', '96', '22', '7867', '0', '18'), +('3', '96', '22', '39342', '0', '18'), +('3', '96', '22', '66166', '0', '18'), +('3', '96', '1', '111309', '210800', '18'), +('3', '96', '1', '111303', '210035', '18'), +('3', '96', '1', '111305', '208771', '18'), +('3', '96', '1', '111300', '208674', '18'), +('3', '96', '2', '94056', '132857', '18'), +('3', '96', '2', '62985', '132164', '18'), +('3', '96', '2', '89368', '126268', '18'), +('3', '96', '2', '104403', '111556', '18'), +('3', '96', '3', '111312', '210118', '18'), +('3', '96', '3', '111315', '209258', '18'), +('3', '96', '3', '111313', '209200', '18'), +('3', '96', '3', '111316', '207148', '18'), +('3', '96', '5', '111317', '209725', '18'), +('3', '96', '5', '111318', '208779', '18'), +('3', '96', '5', '111320', '208734', '18'), +('3', '96', '5', '111319', '206791', '18'), +('3', '96', '8', '111331', '211026', '18'), +('3', '96', '8', '111328', '210090', '18'), +('3', '96', '8', '111332', '207143', '18'), +('3', '96', '8', '111030', '185246', '18'), +('3', '96', '6', '111322', '209257', '18'), +('3', '96', '6', '111324', '209174', '18'), +('3', '96', '6', '111326', '206873', '18'), +('3', '96', '6', '111021', '183527', '18'), +('3', '96', '17', '56046', '139205', '18'), +('3', '96', '17', '81765', '138628', '18'), +('3', '96', '17', '56083', '138137', '18'), +('3', '96', '17', '104406', '118839', '18'), +('3', '96', '7', '94053', '133391', '18'), +('3', '96', '7', '56079', '132768', '18'), +('3', '96', '7', '89369', '127544', '18'), +('3', '96', '7', '104404', '111461', '18'), +('3', '96', '9', '67098', '216194', '18'), +('3', '96', '9', '56031', '128783', '18'), +('3', '96', '9', '56033', '128697', '18'), +('3', '96', '9', '62992', '128622', '18'), +('3', '96', '15', '111348', '210460', '18'), +('3', '96', '15', '111343', '210194', '18'), +('3', '96', '15', '111341', '209772', '18'), +('3', '96', '15', '111342', '209018', '18'), +('3', '96', '20', '111354', '234840', '18'), +('3', '96', '20', '111355', '232689', '18'), +('3', '96', '20', '111353', '231767', '18'), +('3', '96', '20', '111351', '231451', '18'), +('3', '96', '12', '81795', '130024', '18'), +('3', '96', '12', '56073', '129843', '18'), +('3', '96', '12', '89366', '123460', '18'), +('3', '96', '12', '104401', '110060', '18'), +('3', '96', '18', '62986', '135770', '18'), +('3', '96', '18', '56041', '135555', '18'), +('3', '96', '18', '62987', '134443', '18'), +('3', '96', '18', '94054', '134215', '18'), +('3', '96', '19', '62990', '133795', '18'), +('3', '96', '19', '56037', '133389', '18'), +('3', '96', '19', '56075', '132633', '18'), +('3', '96', '19', '81763', '132126', '18'), +('3', '96', '13', '111526', '425452', '18'), +('3', '96', '13', '111514', '408836', '18'), +('3', '96', '13', '111520', '404807', '18'), +('3', '96', '13', '111525', '403257', '18'), +('3', '96', '14', '111536', '216023', '18'), +('3', '96', '14', '111539', '215091', '18'), +('3', '96', '14', '111535', '214709', '18'), +('3', '96', '14', '111538', '214211', '18'), +('3', '96', '11', '111529', '260558', '18'), +('3', '96', '11', '111229', '241328', '18'), +('3', '96', '11', '111338', '210272', '18'), +('3', '96', '11', '111336', '209993', '18'), +('3', '97', '22', '23597', '0', '18'), +('3', '97', '22', '7867', '0', '18'), +('3', '97', '22', '39342', '0', '18'), +('3', '97', '22', '66166', '0', '18'), +('3', '97', '1', '111309', '210804', '18'), +('3', '97', '1', '111303', '210041', '18'), +('3', '97', '1', '111305', '208778', '18'), +('3', '97', '1', '111300', '208679', '18'), +('3', '97', '2', '94056', '132862', '18'), +('3', '97', '2', '62985', '132169', '18'), +('3', '97', '2', '89368', '126273', '18'), +('3', '97', '2', '104403', '111560', '18'), +('3', '97', '3', '111312', '210124', '18'), +('3', '97', '3', '111315', '209266', '18'), +('3', '97', '3', '111313', '209205', '18'), +('3', '97', '3', '111316', '207153', '18'), +('3', '97', '5', '111317', '209731', '18'), +('3', '97', '5', '111318', '208784', '18'), +('3', '97', '5', '111320', '208739', '18'), +('3', '97', '5', '111319', '206798', '18'), +('3', '97', '8', '111331', '211032', '18'), +('3', '97', '8', '111328', '210095', '18'), +('3', '97', '8', '111332', '207148', '18'), +('3', '97', '8', '111030', '185252', '18'), +('3', '97', '6', '111322', '209261', '18'), +('3', '97', '6', '111324', '209180', '18'), +('3', '97', '6', '111326', '206879', '18'), +('3', '97', '6', '111021', '183531', '18'), +('3', '97', '17', '56046', '139212', '18'), +('3', '97', '17', '81765', '138633', '18'), +('3', '97', '17', '56083', '138140', '18'), +('3', '97', '17', '104406', '118846', '18'), +('3', '97', '7', '94053', '133396', '18'), +('3', '97', '7', '56079', '132773', '18'), +('3', '97', '7', '89369', '127549', '18'), +('3', '97', '7', '104404', '111466', '18'), +('3', '97', '9', '67098', '216199', '18'), +('3', '97', '9', '56031', '128787', '18'), +('3', '97', '9', '56033', '128701', '18'), +('3', '97', '9', '62992', '128627', '18'), +('3', '97', '15', '111348', '210466', '18'), +('3', '97', '15', '111343', '210198', '18'), +('3', '97', '15', '111341', '209779', '18'), +('3', '97', '15', '111342', '209025', '18'), +('3', '97', '20', '111354', '234845', '18'), +('3', '97', '20', '111355', '232693', '18'), +('3', '97', '20', '111353', '231773', '18'), +('3', '97', '20', '111351', '231455', '18'), +('3', '97', '12', '81795', '130030', '18'), +('3', '97', '12', '56073', '129850', '18'), +('3', '97', '12', '89366', '123464', '18'), +('3', '97', '12', '104401', '110066', '18'), +('3', '97', '18', '62986', '135778', '18'), +('3', '97', '18', '56041', '135558', '18'), +('3', '97', '18', '62987', '134447', '18'), +('3', '97', '18', '94054', '134220', '18'), +('3', '97', '19', '62990', '133800', '18'), +('3', '97', '19', '56037', '133395', '18'), +('3', '97', '19', '56075', '132639', '18'), +('3', '97', '19', '81763', '132132', '18'), +('3', '97', '13', '111526', '425995', '18'), +('3', '97', '13', '111514', '409351', '18'), +('3', '97', '13', '111520', '405321', '18'), +('3', '97', '13', '111525', '403771', '18'), +('3', '97', '14', '111536', '216028', '18'), +('3', '97', '14', '111539', '215097', '18'), +('3', '97', '14', '111535', '214715', '18'), +('3', '97', '14', '111538', '214216', '18'), +('3', '97', '11', '111529', '260639', '18'), +('3', '97', '11', '111229', '241409', '18'), +('3', '97', '11', '111338', '210278', '18'), +('3', '97', '11', '111336', '209999', '18'), +('3', '98', '22', '23597', '0', '18'), +('3', '98', '22', '7867', '0', '18'), +('3', '98', '22', '39342', '0', '18'), +('3', '98', '22', '66166', '0', '18'), +('3', '98', '1', '111309', '210808', '18'), +('3', '98', '1', '111303', '210047', '18'), +('3', '98', '1', '111305', '208784', '18'), +('3', '98', '1', '111300', '208683', '18'), +('3', '98', '2', '94056', '132867', '18'), +('3', '98', '2', '62985', '132173', '18'), +('3', '98', '2', '89368', '126278', '18'), +('3', '98', '2', '104403', '111565', '18'), +('3', '98', '3', '111312', '210130', '18'), +('3', '98', '3', '111315', '209273', '18'), +('3', '98', '3', '111313', '209209', '18'), +('3', '98', '3', '111316', '207159', '18'), +('3', '98', '5', '111317', '209737', '18'), +('3', '98', '5', '111318', '208788', '18'), +('3', '98', '5', '111320', '208745', '18'), +('3', '98', '5', '111319', '206804', '18'), +('3', '98', '8', '111331', '211038', '18'), +('3', '98', '8', '111328', '210101', '18'), +('3', '98', '8', '111332', '207153', '18'), +('3', '98', '8', '111030', '185258', '18'), +('3', '98', '6', '111322', '209265', '18'), +('3', '98', '6', '111324', '209185', '18'), +('3', '98', '6', '111326', '206885', '18'), +('3', '98', '6', '111021', '183535', '18'), +('3', '98', '17', '56046', '139219', '18'), +('3', '98', '17', '81765', '138637', '18'), +('3', '98', '17', '56083', '138144', '18'), +('3', '98', '17', '104406', '118853', '18'), +('3', '98', '7', '94053', '133401', '18'), +('3', '98', '7', '56079', '132779', '18'), +('3', '98', '7', '89369', '127555', '18'), +('3', '98', '7', '104404', '111472', '18'), +('3', '98', '9', '67098', '216204', '18'), +('3', '98', '9', '56031', '128791', '18'), +('3', '98', '9', '56033', '128705', '18'), +('3', '98', '9', '62992', '128633', '18'), +('3', '98', '15', '111348', '210473', '18'), +('3', '98', '15', '111343', '210203', '18'), +('3', '98', '15', '111341', '209786', '18'), +('3', '98', '15', '111342', '209031', '18'), +('3', '98', '20', '111354', '234851', '18'), +('3', '98', '20', '111355', '232697', '18'), +('3', '98', '20', '111353', '231779', '18'), +('3', '98', '20', '111351', '231460', '18'), +('3', '98', '12', '81795', '130035', '18'), +('3', '98', '12', '56073', '129857', '18'), +('3', '98', '12', '89366', '123469', '18'), +('3', '98', '12', '104401', '110072', '18'), +('3', '98', '18', '62986', '135785', '18'), +('3', '98', '18', '56041', '135562', '18'), +('3', '98', '18', '62987', '134450', '18'), +('3', '98', '18', '94054', '134226', '18'), +('3', '98', '19', '62990', '133805', '18'), +('3', '98', '19', '56037', '133401', '18'), +('3', '98', '19', '56075', '132645', '18'), +('3', '98', '19', '81763', '132138', '18'), +('3', '98', '13', '111526', '426537', '18'), +('3', '98', '13', '111514', '409865', '18'), +('3', '98', '13', '111520', '405836', '18'), +('3', '98', '13', '111525', '404286', '18'), +('3', '98', '14', '111536', '216033', '18'), +('3', '98', '14', '111539', '215102', '18'), +('3', '98', '14', '111535', '214721', '18'), +('3', '98', '14', '111538', '214220', '18'), +('3', '98', '11', '111529', '260719', '18'), +('3', '98', '11', '111229', '241481', '18'), +('3', '98', '11', '111338', '210284', '18'), +('3', '98', '11', '111336', '210005', '18'), +('3', '99', '22', '23597', '0', '18'), +('3', '99', '22', '7867', '0', '18'), +('3', '99', '22', '39342', '0', '18'), +('3', '99', '22', '66166', '0', '18'), +('3', '99', '1', '111309', '210812', '18'), +('3', '99', '1', '111303', '210053', '18'), +('3', '99', '1', '111305', '208790', '18'), +('3', '99', '1', '111300', '208687', '18'), +('3', '99', '2', '94056', '132871', '18'), +('3', '99', '2', '62985', '132178', '18'), +('3', '99', '2', '89368', '126284', '18'), +('3', '99', '2', '104403', '111569', '18'), +('3', '99', '3', '111312', '210136', '18'), +('3', '99', '3', '111315', '209280', '18'), +('3', '99', '3', '111313', '209214', '18'), +('3', '99', '3', '111316', '207164', '18'), +('3', '99', '5', '111317', '209743', '18'), +('3', '99', '5', '111318', '208792', '18'), +('3', '99', '5', '111320', '208750', '18'), +('3', '99', '5', '111319', '206810', '18'), +('3', '99', '8', '111331', '211045', '18'), +('3', '99', '8', '111328', '210106', '18'), +('3', '99', '8', '111332', '207157', '18'), +('3', '99', '8', '111030', '185265', '18'), +('3', '99', '6', '111322', '209269', '18'), +('3', '99', '6', '111324', '209191', '18'), +('3', '99', '6', '111326', '206891', '18'), +('3', '99', '6', '111021', '183539', '18'), +('3', '99', '17', '56046', '139226', '18'), +('3', '99', '17', '81765', '138642', '18'), +('3', '99', '17', '56083', '138147', '18'), +('3', '99', '17', '104406', '118860', '18'), +('3', '99', '7', '94053', '133407', '18'), +('3', '99', '7', '56079', '132785', '18'), +('3', '99', '7', '89369', '127560', '18'), +('3', '99', '7', '104404', '111477', '18'), +('3', '99', '9', '67098', '216209', '18'), +('3', '99', '9', '56031', '128795', '18'), +('3', '99', '9', '56033', '128708', '18'), +('3', '99', '9', '62992', '128638', '18'), +('3', '99', '15', '111348', '210480', '18'), +('3', '99', '15', '111343', '210208', '18'), +('3', '99', '15', '111341', '209793', '18'), +('3', '99', '15', '111342', '209037', '18'), +('3', '99', '20', '111354', '234856', '18'), +('3', '99', '20', '111355', '232701', '18'), +('3', '99', '20', '111353', '231784', '18'), +('3', '99', '20', '111351', '231464', '18'), +('3', '99', '12', '81795', '130041', '18'), +('3', '99', '12', '56073', '129864', '18'), +('3', '99', '12', '89366', '123474', '18'), +('3', '99', '12', '104401', '110078', '18'), +('3', '99', '18', '62986', '135793', '18'), +('3', '99', '18', '56041', '135565', '18'), +('3', '99', '18', '62987', '134454', '18'), +('3', '99', '18', '94054', '134231', '18'), +('3', '99', '19', '62990', '133810', '18'), +('3', '99', '19', '56037', '133406', '18'), +('3', '99', '19', '56075', '132651', '18'), +('3', '99', '19', '81763', '132143', '18'), +('3', '99', '13', '111526', '427080', '18'), +('3', '99', '13', '111514', '410380', '18'), +('3', '99', '13', '111520', '406350', '18'), +('3', '99', '13', '111525', '404800', '18'), +('3', '99', '14', '111536', '216037', '18'), +('3', '99', '14', '111539', '215108', '18'), +('3', '99', '14', '111535', '214727', '18'), +('3', '99', '14', '111538', '214224', '18'), +('3', '99', '11', '111529', '260790', '18'), +('3', '99', '11', '111229', '241552', '18'), +('3', '99', '11', '111338', '210290', '18'), +('3', '99', '11', '111336', '210011', '18'), +('3', '100', '22', '23597', '0', '20'), +('3', '100', '22', '7867', '0', '20'), +('3', '100', '22', '39342', '0', '20'), +('3', '100', '22', '66166', '0', '20'), +('3', '100', '1', '98769', '351508', '20'), +('3', '100', '1', '111309', '210817', '20'), +('3', '100', '1', '111303', '210059', '20'), +('3', '100', '1', '111305', '208797', '20'), +('3', '100', '2', '94056', '132876', '20'), +('3', '100', '2', '62985', '132183', '20'), +('3', '100', '2', '89368', '126289', '20'), +('3', '100', '2', '104403', '111573', '20'), +('3', '100', '3', '111312', '210142', '20'), +('3', '100', '3', '111315', '209288', '20'), +('3', '100', '3', '111313', '209219', '20'), +('3', '100', '3', '111316', '207170', '20'), +('3', '100', '5', '111317', '209750', '20'), +('3', '100', '5', '111318', '208797', '20'), +('3', '100', '5', '111320', '208756', '20'), +('3', '100', '5', '111319', '206817', '20'), +('3', '100', '8', '111331', '211052', '20'), +('3', '100', '8', '111328', '210112', '20'), +('3', '100', '8', '111332', '207162', '20'), +('3', '100', '8', '111030', '185272', '20'), +('3', '100', '6', '111322', '209274', '20'), +('3', '100', '6', '111324', '209196', '20'), +('3', '100', '6', '111326', '206897', '20'), +('3', '100', '6', '111021', '183544', '20'), +('3', '100', '17', '56046', '139233', '20'), +('3', '100', '17', '81765', '138647', '20'), +('3', '100', '17', '56083', '138150', '20'), +('3', '100', '17', '104406', '118868', '20'), +('3', '100', '7', '94053', '133412', '20'), +('3', '100', '7', '56079', '132791', '20'), +('3', '100', '7', '89369', '127566', '20'), +('3', '100', '7', '104404', '111483', '20'), +('3', '100', '9', '67098', '216214', '20'), +('3', '100', '9', '56031', '128799', '20'), +('3', '100', '9', '56033', '128712', '20'), +('3', '100', '9', '62992', '128644', '20'), +('3', '100', '15', '111348', '210487', '20'), +('3', '100', '15', '111343', '210212', '20'), +('3', '100', '15', '111341', '209800', '20'), +('3', '100', '15', '111342', '209044', '20'), +('3', '100', '20', '111354', '234862', '20'), +('3', '100', '20', '111355', '232705', '20'), +('3', '100', '20', '111353', '231790', '20'), +('3', '100', '20', '111351', '231469', '20'), +('3', '100', '12', '81795', '130047', '20'), +('3', '100', '12', '56073', '129871', '20'), +('3', '100', '12', '89366', '123478', '20'), +('3', '100', '12', '104401', '110084', '20'), +('3', '100', '18', '62986', '135800', '20'), +('3', '100', '18', '56041', '135568', '20'), +('3', '100', '18', '62987', '134457', '20'), +('3', '100', '18', '94054', '134237', '20'), +('3', '100', '19', '62990', '133815', '20'), +('3', '100', '19', '56037', '133412', '20'), +('3', '100', '19', '56075', '132657', '20'), +('3', '100', '19', '81763', '132149', '20'), +('3', '100', '13', '111526', '428897', '20'), +('3', '100', '13', '111514', '412170', '20'), +('3', '100', '13', '111520', '408139', '20'), +('3', '100', '13', '111525', '406562', '20'), +('3', '100', '14', '111536', '216043', '20'), +('3', '100', '14', '111539', '215113', '20'), +('3', '100', '14', '111535', '214734', '20'), +('3', '100', '14', '111538', '214229', '20'), +('3', '100', '11', '133816', '271495', '20'), +('3', '100', '11', '111529', '260871', '20'), +('3', '100', '11', '111229', '241633', '20'), +('3', '100', '11', '111338', '210296', '20'), +('3', '100', '22', '23597', '0', '19'), +('3', '100', '22', '7867', '0', '19'), +('3', '100', '22', '39342', '0', '19'), +('3', '100', '22', '66166', '0', '19'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '100', '1', '98769', '351508', '19'), +('3', '100', '1', '111309', '210817', '19'), +('3', '100', '1', '111303', '210059', '19'), +('3', '100', '1', '111305', '208797', '19'), +('3', '100', '2', '94056', '132876', '19'), +('3', '100', '2', '62985', '132183', '19'), +('3', '100', '2', '89368', '126289', '19'), +('3', '100', '2', '104403', '111573', '19'), +('3', '100', '3', '111312', '210142', '19'), +('3', '100', '3', '111315', '209288', '19'), +('3', '100', '3', '111313', '209219', '19'), +('3', '100', '3', '111316', '207170', '19'), +('3', '100', '5', '111317', '209750', '19'), +('3', '100', '5', '111318', '208797', '19'), +('3', '100', '5', '111320', '208756', '19'), +('3', '100', '5', '111319', '206817', '19'), +('3', '100', '8', '111331', '211052', '19'), +('3', '100', '8', '111328', '210112', '19'), +('3', '100', '8', '111332', '207162', '19'), +('3', '100', '8', '111030', '185272', '19'), +('3', '100', '6', '111322', '209274', '19'), +('3', '100', '6', '111324', '209196', '19'), +('3', '100', '6', '111326', '206897', '19'), +('3', '100', '6', '111021', '183544', '19'), +('3', '100', '17', '56046', '139233', '19'), +('3', '100', '17', '81765', '138647', '19'), +('3', '100', '17', '56083', '138150', '19'), +('3', '100', '17', '104406', '118868', '19'), +('3', '100', '7', '94053', '133412', '19'), +('3', '100', '7', '56079', '132791', '19'), +('3', '100', '7', '89369', '127566', '19'), +('3', '100', '7', '104404', '111483', '19'), +('3', '100', '9', '67098', '216214', '19'), +('3', '100', '9', '56031', '128799', '19'), +('3', '100', '9', '56033', '128712', '19'), +('3', '100', '9', '62992', '128644', '19'), +('3', '100', '15', '111348', '210487', '19'), +('3', '100', '15', '111343', '210212', '19'), +('3', '100', '15', '111341', '209800', '19'), +('3', '100', '15', '111342', '209044', '19'), +('3', '100', '20', '111354', '234862', '19'), +('3', '100', '20', '111355', '232705', '19'), +('3', '100', '20', '111353', '231790', '19'), +('3', '100', '20', '111351', '231469', '19'), +('3', '100', '12', '81795', '130047', '19'), +('3', '100', '12', '56073', '129871', '19'), +('3', '100', '12', '89366', '123478', '19'), +('3', '100', '12', '104401', '110084', '19'), +('3', '100', '18', '62986', '135800', '19'), +('3', '100', '18', '56041', '135568', '19'), +('3', '100', '18', '62987', '134457', '19'), +('3', '100', '18', '94054', '134237', '19'), +('3', '100', '19', '62990', '133815', '19'), +('3', '100', '19', '56037', '133412', '19'), +('3', '100', '19', '56075', '132657', '19'), +('3', '100', '19', '81763', '132149', '19'), +('3', '100', '13', '111526', '427622', '19'), +('3', '100', '13', '111514', '410895', '19'), +('3', '100', '13', '111520', '406864', '19'), +('3', '100', '13', '111525', '405287', '19'), +('3', '100', '14', '111536', '216043', '19'), +('3', '100', '14', '111539', '215113', '19'), +('3', '100', '14', '111535', '214734', '19'), +('3', '100', '14', '111538', '214229', '19'), +('3', '100', '11', '133816', '271495', '19'), +('3', '100', '11', '111529', '260871', '19'), +('3', '100', '11', '111229', '241633', '19'), +('3', '100', '11', '111338', '210296', '19'), +('3', '101', '22', '23597', '0', '20'), +('3', '101', '22', '7867', '0', '20'), +('3', '101', '22', '39342', '0', '20'), +('3', '101', '22', '66166', '0', '20'), +('3', '101', '1', '98769', '351512', '20'), +('3', '101', '1', '111309', '210821', '20'), +('3', '101', '1', '111303', '210065', '20'), +('3', '101', '1', '111305', '208803', '20'), +('3', '101', '2', '94056', '132881', '20'), +('3', '101', '2', '62985', '132187', '20'), +('3', '101', '2', '89368', '126295', '20'), +('3', '101', '2', '104403', '111577', '20'), +('3', '101', '3', '111312', '210147', '20'), +('3', '101', '3', '111315', '209295', '20'), +('3', '101', '3', '111313', '209224', '20'), +('3', '101', '3', '111316', '207175', '20'), +('3', '101', '5', '111317', '209756', '20'), +('3', '101', '5', '111318', '208801', '20'), +('3', '101', '5', '111320', '208761', '20'), +('3', '101', '5', '111319', '206823', '20'), +('3', '101', '8', '111331', '211058', '20'), +('3', '101', '8', '111328', '210117', '20'), +('3', '101', '8', '111332', '207167', '20'), +('3', '101', '8', '111030', '185278', '20'), +('3', '101', '6', '111322', '209278', '20'), +('3', '101', '6', '111324', '209202', '20'), +('3', '101', '6', '111326', '206904', '20'), +('3', '101', '6', '111021', '183548', '20'), +('3', '101', '17', '56046', '139240', '20'), +('3', '101', '17', '81765', '138651', '20'), +('3', '101', '17', '56083', '138153', '20'), +('3', '101', '17', '104406', '118875', '20'), +('3', '101', '7', '94053', '133417', '20'), +('3', '101', '7', '56079', '132797', '20'), +('3', '101', '7', '89369', '127572', '20'), +('3', '101', '7', '104404', '111488', '20'), +('3', '101', '9', '67098', '216219', '20'), +('3', '101', '9', '56031', '128803', '20'), +('3', '101', '9', '56033', '128716', '20'), +('3', '101', '9', '62992', '128649', '20'), +('3', '101', '15', '111348', '210493', '20'), +('3', '101', '15', '111343', '210217', '20'), +('3', '101', '15', '111341', '209806', '20'), +('3', '101', '15', '111342', '209050', '20'), +('3', '101', '20', '111354', '234868', '20'), +('3', '101', '20', '111355', '232709', '20'), +('3', '101', '20', '111353', '231796', '20'), +('3', '101', '20', '111351', '231473', '20'), +('3', '101', '12', '81795', '130053', '20'), +('3', '101', '12', '56073', '129878', '20'), +('3', '101', '12', '89366', '123483', '20'), +('3', '101', '12', '104401', '110091', '20'), +('3', '101', '18', '62986', '135808', '20'), +('3', '101', '18', '56041', '135572', '20'), +('3', '101', '18', '62987', '134461', '20'), +('3', '101', '18', '94054', '134242', '20'), +('3', '101', '19', '62990', '133820', '20'), +('3', '101', '19', '56037', '133418', '20'), +('3', '101', '19', '56075', '132663', '20'), +('3', '101', '19', '81763', '132155', '20'), +('3', '101', '13', '111526', '429440', '20'), +('3', '101', '13', '111514', '412685', '20'), +('3', '101', '13', '111520', '408653', '20'), +('3', '101', '13', '111525', '407076', '20'), +('3', '101', '14', '111536', '216047', '20'), +('3', '101', '14', '111539', '215119', '20'), +('3', '101', '14', '111535', '214740', '20'), +('3', '101', '14', '111538', '214234', '20'), +('3', '101', '11', '133816', '271499', '20'), +('3', '101', '11', '111529', '260952', '20'), +('3', '101', '11', '111229', '241705', '20'), +('3', '101', '11', '111338', '210301', '20'), +('3', '102', '22', '23597', '0', '20'), +('3', '102', '22', '7867', '0', '20'), +('3', '102', '22', '39342', '0', '20'), +('3', '102', '22', '66166', '0', '20'), +('3', '102', '1', '98769', '351516', '20'), +('3', '102', '1', '111309', '210825', '20'), +('3', '102', '1', '111303', '210071', '20'), +('3', '102', '1', '111305', '208810', '20'), +('3', '102', '2', '94056', '132886', '20'), +('3', '102', '2', '62985', '132192', '20'), +('3', '102', '2', '89368', '126300', '20'), +('3', '102', '2', '104403', '111581', '20'), +('3', '102', '3', '111312', '210153', '20'), +('3', '102', '3', '111315', '209302', '20'), +('3', '102', '3', '111313', '209229', '20'), +('3', '102', '3', '111316', '207180', '20'), +('3', '102', '5', '111317', '209763', '20'), +('3', '102', '5', '111318', '208805', '20'), +('3', '102', '5', '111320', '208766', '20'), +('3', '102', '5', '111319', '206829', '20'), +('3', '102', '8', '111331', '211064', '20'), +('3', '102', '8', '111328', '210123', '20'), +('3', '102', '8', '111332', '207172', '20'), +('3', '102', '8', '111030', '185284', '20'), +('3', '102', '6', '111322', '209282', '20'), +('3', '102', '6', '111324', '209208', '20'), +('3', '102', '6', '111326', '206910', '20'), +('3', '102', '6', '111021', '183552', '20'), +('3', '102', '17', '56046', '139247', '20'), +('3', '102', '17', '81765', '138656', '20'), +('3', '102', '17', '56083', '138156', '20'), +('3', '102', '17', '104406', '118882', '20'), +('3', '102', '7', '94053', '133423', '20'), +('3', '102', '7', '56079', '132803', '20'), +('3', '102', '7', '89369', '127577', '20'), +('3', '102', '7', '104404', '111494', '20'), +('3', '102', '9', '67098', '216224', '20'), +('3', '102', '9', '56031', '128807', '20'), +('3', '102', '9', '56033', '128720', '20'), +('3', '102', '9', '62992', '128655', '20'), +('3', '102', '15', '111348', '210500', '20'), +('3', '102', '15', '111343', '210222', '20'), +('3', '102', '15', '111341', '209813', '20'), +('3', '102', '15', '111342', '209056', '20'), +('3', '102', '20', '111354', '234873', '20'), +('3', '102', '20', '111355', '232712', '20'), +('3', '102', '20', '111353', '231801', '20'), +('3', '102', '20', '111351', '231477', '20'), +('3', '102', '12', '81795', '130059', '20'), +('3', '102', '12', '56073', '129885', '20'), +('3', '102', '12', '89366', '123488', '20'), +('3', '102', '12', '104401', '110097', '20'), +('3', '102', '18', '62986', '135815', '20'), +('3', '102', '18', '56041', '135575', '20'), +('3', '102', '18', '62987', '134464', '20'), +('3', '102', '18', '94054', '134247', '20'), +('3', '102', '19', '62990', '133825', '20'), +('3', '102', '19', '56037', '133424', '20'), +('3', '102', '19', '56075', '132669', '20'), +('3', '102', '19', '81763', '132161', '20'), +('3', '102', '13', '111526', '429982', '20'), +('3', '102', '13', '111514', '413228', '20'), +('3', '102', '13', '111520', '409167', '20'), +('3', '102', '13', '111525', '407591', '20'), +('3', '102', '14', '111536', '216052', '20'), +('3', '102', '14', '111539', '215124', '20'), +('3', '102', '14', '111535', '214746', '20'), +('3', '102', '14', '111538', '214238', '20'), +('3', '102', '11', '133816', '271504', '20'), +('3', '102', '11', '111529', '261033', '20'), +('3', '102', '11', '111229', '241786', '20'), +('3', '102', '11', '111338', '210307', '20'), +('3', '103', '22', '23597', '0', '20'), +('3', '103', '22', '7867', '0', '20'), +('3', '103', '22', '39342', '0', '20'), +('3', '103', '22', '66166', '0', '20'), +('3', '103', '1', '98769', '351520', '20'), +('3', '103', '1', '111309', '210830', '20'), +('3', '103', '1', '111303', '210078', '20'), +('3', '103', '1', '111305', '208816', '20'), +('3', '103', '2', '94056', '132891', '20'), +('3', '103', '2', '62985', '132197', '20'), +('3', '103', '2', '89368', '126306', '20'), +('3', '103', '2', '104403', '111586', '20'), +('3', '103', '3', '111312', '210159', '20'), +('3', '103', '3', '111315', '209310', '20'), +('3', '103', '3', '111313', '209234', '20'), +('3', '103', '3', '111316', '207186', '20'), +('3', '103', '5', '111317', '209769', '20'), +('3', '103', '5', '111318', '208810', '20'), +('3', '103', '5', '111320', '208772', '20'), +('3', '103', '5', '111319', '206836', '20'), +('3', '103', '8', '111331', '211071', '20'), +('3', '103', '8', '111328', '210128', '20'), +('3', '103', '8', '111332', '207177', '20'), +('3', '103', '8', '111030', '185291', '20'), +('3', '103', '6', '111322', '209286', '20'), +('3', '103', '6', '111324', '209213', '20'), +('3', '103', '6', '111326', '206916', '20'), +('3', '103', '6', '111021', '183556', '20'), +('3', '103', '17', '56046', '139254', '20'), +('3', '103', '17', '81765', '138661', '20'), +('3', '103', '17', '56083', '138160', '20'), +('3', '103', '17', '104406', '118890', '20'), +('3', '103', '7', '94053', '133428', '20'), +('3', '103', '7', '56079', '132809', '20'), +('3', '103', '7', '89369', '127583', '20'), +('3', '103', '7', '104404', '111499', '20'), +('3', '103', '9', '67098', '216230', '20'), +('3', '103', '9', '56031', '128811', '20'), +('3', '103', '9', '56033', '128723', '20'), +('3', '103', '9', '62992', '128660', '20'), +('3', '103', '15', '111348', '210507', '20'), +('3', '103', '15', '111343', '210226', '20'), +('3', '103', '15', '111341', '209820', '20'), +('3', '103', '15', '111342', '209063', '20'), +('3', '103', '20', '111354', '234879', '20'), +('3', '103', '20', '111355', '232717', '20'), +('3', '103', '20', '111353', '231807', '20'), +('3', '103', '20', '111351', '231482', '20'), +('3', '103', '12', '81795', '130065', '20'), +('3', '103', '12', '56073', '129893', '20'), +('3', '103', '12', '89366', '123493', '20'), +('3', '103', '12', '104401', '110103', '20'), +('3', '103', '18', '62986', '135823', '20'), +('3', '103', '18', '56041', '135579', '20'), +('3', '103', '18', '62987', '134468', '20'), +('3', '103', '18', '94054', '134253', '20'), +('3', '103', '19', '62990', '133830', '20'), +('3', '103', '19', '56037', '133430', '20'), +('3', '103', '19', '56075', '132675', '20'), +('3', '103', '19', '81763', '132167', '20'), +('3', '103', '13', '111526', '430525', '20'), +('3', '103', '13', '111514', '413743', '20'), +('3', '103', '13', '111520', '409682', '20'), +('3', '103', '13', '111525', '408105', '20'), +('3', '103', '14', '111536', '216057', '20'), +('3', '103', '14', '111539', '215130', '20'), +('3', '103', '14', '111535', '214753', '20'), +('3', '103', '14', '111538', '214243', '20'), +('3', '103', '11', '133816', '271509', '20'), +('3', '103', '11', '111529', '261104', '20'), +('3', '103', '11', '111229', '241858', '20'), +('3', '103', '11', '111338', '210313', '20'), +('3', '104', '22', '23597', '0', '20'), +('3', '104', '22', '7867', '0', '20'), +('3', '104', '22', '39342', '0', '20'), +('3', '104', '22', '66166', '0', '20'), +('3', '104', '1', '98769', '351524', '20'), +('3', '104', '1', '111309', '210834', '20'), +('3', '104', '1', '111303', '210084', '20'), +('3', '104', '1', '111305', '208823', '20'), +('3', '104', '2', '94056', '132896', '20'), +('3', '104', '2', '62985', '132201', '20'), +('3', '104', '2', '89368', '126311', '20'), +('3', '104', '2', '104403', '111590', '20'), +('3', '104', '3', '111312', '210165', '20'), +('3', '104', '3', '111315', '209317', '20'), +('3', '104', '3', '111313', '209239', '20'), +('3', '104', '3', '111316', '207192', '20'), +('3', '104', '5', '111317', '209776', '20'), +('3', '104', '5', '111318', '208814', '20'), +('3', '104', '5', '111320', '208777', '20'), +('3', '104', '5', '111319', '206842', '20'), +('3', '104', '8', '111331', '211078', '20'), +('3', '104', '8', '111328', '210134', '20'), +('3', '104', '8', '111332', '207182', '20'), +('3', '104', '8', '111030', '185298', '20'), +('3', '104', '6', '111322', '209291', '20'), +('3', '104', '6', '111324', '209219', '20'), +('3', '104', '6', '111326', '206922', '20'), +('3', '104', '6', '111021', '183561', '20'), +('3', '104', '17', '56046', '139261', '20'), +('3', '104', '17', '81765', '138666', '20'), +('3', '104', '17', '56083', '138163', '20'), +('3', '104', '17', '104406', '118897', '20'), +('3', '104', '7', '94053', '133433', '20'), +('3', '104', '7', '56079', '132815', '20'), +('3', '104', '7', '89369', '127588', '20'), +('3', '104', '7', '104404', '111505', '20'), +('3', '104', '9', '67098', '216235', '20'), +('3', '104', '9', '56031', '128815', '20'), +('3', '104', '9', '56033', '128727', '20'), +('3', '104', '9', '62992', '128666', '20'), +('3', '104', '15', '111348', '210513', '20'), +('3', '104', '15', '111343', '210231', '20'), +('3', '104', '15', '111341', '209827', '20'), +('3', '104', '15', '111342', '209069', '20'), +('3', '104', '20', '111354', '234885', '20'), +('3', '104', '20', '111355', '232720', '20'), +('3', '104', '20', '111353', '231813', '20'), +('3', '104', '20', '111351', '231486', '20'), +('3', '104', '12', '81795', '130070', '20'), +('3', '104', '12', '56073', '129900', '20'), +('3', '104', '12', '89366', '123497', '20'), +('3', '104', '12', '104401', '110109', '20'), +('3', '104', '18', '62986', '135831', '20'), +('3', '104', '18', '56041', '135582', '20'), +('3', '104', '18', '62987', '134471', '20'), +('3', '104', '18', '94054', '134258', '20'), +('3', '104', '19', '62990', '133835', '20'), +('3', '104', '19', '56037', '133435', '20'), +('3', '104', '19', '56075', '132681', '20'), +('3', '104', '19', '81763', '132173', '20'), +('3', '104', '13', '111526', '431068', '20'), +('3', '104', '13', '111514', '414257', '20'), +('3', '104', '13', '111520', '410196', '20'), +('3', '104', '13', '111525', '408620', '20'), +('3', '104', '14', '111536', '216062', '20'), +('3', '104', '14', '111539', '215135', '20'), +('3', '104', '14', '111535', '214759', '20'), +('3', '104', '14', '111538', '214247', '20'), +('3', '104', '11', '133816', '271513', '20'), +('3', '104', '11', '111529', '261185', '20'), +('3', '104', '11', '111229', '241939', '20'), +('3', '104', '11', '111338', '210319', '20'), +('3', '105', '22', '23597', '0', '23'), +('3', '105', '22', '7867', '0', '23'), +('3', '105', '22', '39342', '0', '23'), +('3', '105', '22', '66166', '0', '23'), +('3', '105', '1', '98769', '351528', '23'), +('3', '105', '1', '111309', '210838', '23'), +('3', '105', '1', '111303', '210090', '23'), +('3', '105', '1', '111305', '208829', '23'), +('3', '105', '2', '94056', '132901', '23'), +('3', '105', '2', '62985', '132206', '23'), +('3', '105', '2', '89368', '126316', '23'), +('3', '105', '2', '104403', '111594', '23'), +('3', '105', '3', '111312', '210171', '23'), +('3', '105', '3', '111315', '209325', '23'), +('3', '105', '3', '111313', '209244', '23'), +('3', '105', '3', '111316', '207197', '23'), +('3', '105', '5', '111317', '209782', '23'), +('3', '105', '5', '111318', '208818', '23'), +('3', '105', '5', '111320', '208783', '23'), +('3', '105', '5', '111319', '206849', '23'), +('3', '105', '8', '111331', '211084', '23'), +('3', '105', '8', '111328', '210139', '23'), +('3', '105', '8', '111332', '207186', '23'), +('3', '105', '8', '111030', '185304', '23'), +('3', '105', '6', '111322', '209295', '23'), +('3', '105', '6', '111324', '209225', '23'), +('3', '105', '6', '111326', '206929', '23'), +('3', '105', '6', '111021', '183565', '23'), +('3', '105', '17', '56046', '139269', '23'), +('3', '105', '17', '81765', '138670', '23'), +('3', '105', '17', '56083', '138166', '23'), +('3', '105', '17', '104406', '118905', '23'), +('3', '105', '7', '94053', '133439', '23'), +('3', '105', '7', '56079', '132821', '23'), +('3', '105', '7', '89369', '127594', '23'), +('3', '105', '7', '104404', '111510', '23'), +('3', '105', '9', '67098', '216240', '23'), +('3', '105', '9', '56031', '128819', '23'), +('3', '105', '9', '56033', '128731', '23'), +('3', '105', '9', '62992', '128672', '23'), +('3', '105', '15', '111348', '210520', '23'), +('3', '105', '15', '111343', '210236', '23'), +('3', '105', '15', '111341', '209834', '23'), +('3', '105', '15', '111342', '209076', '23'), +('3', '105', '20', '111354', '234891', '23'), +('3', '105', '20', '111355', '232724', '23'), +('3', '105', '20', '111353', '231819', '23'), +('3', '105', '20', '111351', '231491', '23'), +('3', '105', '12', '81795', '130076', '23'), +('3', '105', '12', '56073', '129907', '23'), +('3', '105', '12', '89366', '123502', '23'), +('3', '105', '12', '104401', '110116', '23'), +('3', '105', '18', '62986', '135839', '23'), +('3', '105', '18', '56041', '135585', '23'), +('3', '105', '18', '62987', '134475', '23'), +('3', '105', '18', '94054', '134264', '23'), +('3', '105', '19', '62990', '133840', '23'), +('3', '105', '19', '56037', '133441', '23'), +('3', '105', '19', '56075', '132688', '23'), +('3', '105', '19', '81763', '132179', '23'), +('3', '105', '13', '111526', '431611', '23'), +('3', '105', '13', '111514', '414772', '23'), +('3', '105', '13', '111520', '410710', '23'), +('3', '105', '13', '111525', '409135', '23'), +('3', '105', '14', '111536', '216067', '23'), +('3', '105', '14', '111539', '215141', '23'), +('3', '105', '14', '111535', '214766', '23'), +('3', '105', '14', '111538', '214252', '23'), +('3', '105', '11', '133816', '271518', '23'), +('3', '105', '11', '111529', '261266', '23'), +('3', '105', '11', '111229', '242010', '23'), +('3', '105', '11', '111338', '210325', '23'), +('3', '105', '22', '23597', '0', '22'), +('3', '105', '22', '7867', '0', '22'), +('3', '105', '22', '39342', '0', '22'), +('3', '105', '22', '66166', '0', '22'), +('3', '105', '1', '98769', '351528', '22'), +('3', '105', '1', '111309', '210838', '22'), +('3', '105', '1', '111303', '210090', '22'), +('3', '105', '1', '111305', '208829', '22'), +('3', '105', '2', '94056', '132901', '22'), +('3', '105', '2', '62985', '132206', '22'), +('3', '105', '2', '89368', '126316', '22'), +('3', '105', '2', '104403', '111594', '22'), +('3', '105', '3', '111312', '210171', '22'), +('3', '105', '3', '111315', '209325', '22'), +('3', '105', '3', '111313', '209244', '22'), +('3', '105', '3', '111316', '207197', '22'), +('3', '105', '5', '111317', '209782', '22'), +('3', '105', '5', '111318', '208818', '22'), +('3', '105', '5', '111320', '208783', '22'), +('3', '105', '5', '111319', '206849', '22'), +('3', '105', '8', '111331', '211084', '22'), +('3', '105', '8', '111328', '210139', '22'), +('3', '105', '8', '111332', '207186', '22'), +('3', '105', '8', '111030', '185304', '22'), +('3', '105', '6', '111322', '209295', '22'), +('3', '105', '6', '111324', '209225', '22'), +('3', '105', '6', '111326', '206929', '22'), +('3', '105', '6', '111021', '183565', '22'), +('3', '105', '17', '56046', '139269', '22'), +('3', '105', '17', '81765', '138670', '22'), +('3', '105', '17', '56083', '138166', '22'), +('3', '105', '17', '104406', '118905', '22'), +('3', '105', '7', '94053', '133439', '22'), +('3', '105', '7', '56079', '132821', '22'), +('3', '105', '7', '89369', '127594', '22'), +('3', '105', '7', '104404', '111510', '22'), +('3', '105', '9', '67098', '216240', '22'), +('3', '105', '9', '56031', '128819', '22'), +('3', '105', '9', '56033', '128731', '22'), +('3', '105', '9', '62992', '128672', '22'), +('3', '105', '15', '111348', '210520', '22'), +('3', '105', '15', '111343', '210236', '22'), +('3', '105', '15', '111341', '209834', '22'), +('3', '105', '15', '111342', '209076', '22'), +('3', '105', '20', '111354', '234891', '22'), +('3', '105', '20', '111355', '232724', '22'), +('3', '105', '20', '111353', '231819', '22'), +('3', '105', '20', '111351', '231491', '22'), +('3', '105', '12', '81795', '130076', '22'), +('3', '105', '12', '56073', '129907', '22'), +('3', '105', '12', '89366', '123502', '22'), +('3', '105', '12', '104401', '110116', '22'), +('3', '105', '18', '62986', '135839', '22'), +('3', '105', '18', '56041', '135585', '22'), +('3', '105', '18', '62987', '134475', '22'), +('3', '105', '18', '94054', '134264', '22'), +('3', '105', '19', '62990', '133840', '22'), +('3', '105', '19', '56037', '133441', '22'), +('3', '105', '19', '56075', '132688', '22'), +('3', '105', '19', '81763', '132179', '22'), +('3', '105', '13', '111526', '431611', '22'), +('3', '105', '13', '111514', '414772', '22'), +('3', '105', '13', '111520', '410710', '22'), +('3', '105', '13', '111525', '409135', '22'), +('3', '105', '14', '111536', '216067', '22'), +('3', '105', '14', '111539', '215141', '22'), +('3', '105', '14', '111535', '214766', '22'), +('3', '105', '14', '111538', '214252', '22'), +('3', '105', '11', '133816', '271518', '22'), +('3', '105', '11', '111529', '261266', '22'), +('3', '105', '11', '111229', '242010', '22'), +('3', '105', '11', '111338', '210325', '22'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '105', '22', '23597', '0', '21'), +('3', '105', '22', '7867', '0', '21'), +('3', '105', '22', '39342', '0', '21'), +('3', '105', '22', '66166', '0', '21'), +('3', '105', '1', '98769', '351528', '21'), +('3', '105', '1', '111309', '210838', '21'), +('3', '105', '1', '111303', '210090', '21'), +('3', '105', '1', '111305', '208829', '21'), +('3', '105', '2', '94056', '132901', '21'), +('3', '105', '2', '62985', '132206', '21'), +('3', '105', '2', '89368', '126316', '21'), +('3', '105', '2', '104403', '111594', '21'), +('3', '105', '3', '111312', '210171', '21'), +('3', '105', '3', '111315', '209325', '21'), +('3', '105', '3', '111313', '209244', '21'), +('3', '105', '3', '111316', '207197', '21'), +('3', '105', '5', '111317', '209782', '21'), +('3', '105', '5', '111318', '208818', '21'), +('3', '105', '5', '111320', '208783', '21'), +('3', '105', '5', '111319', '206849', '21'), +('3', '105', '8', '111331', '211084', '21'), +('3', '105', '8', '111328', '210139', '21'), +('3', '105', '8', '111332', '207186', '21'), +('3', '105', '8', '111030', '185304', '21'), +('3', '105', '6', '111322', '209295', '21'), +('3', '105', '6', '111324', '209225', '21'), +('3', '105', '6', '111326', '206929', '21'), +('3', '105', '6', '111021', '183565', '21'), +('3', '105', '17', '56046', '139269', '21'), +('3', '105', '17', '81765', '138670', '21'), +('3', '105', '17', '56083', '138166', '21'), +('3', '105', '17', '104406', '118905', '21'), +('3', '105', '7', '94053', '133439', '21'), +('3', '105', '7', '56079', '132821', '21'), +('3', '105', '7', '89369', '127594', '21'), +('3', '105', '7', '104404', '111510', '21'), +('3', '105', '9', '67098', '216240', '21'), +('3', '105', '9', '56031', '128819', '21'), +('3', '105', '9', '56033', '128731', '21'), +('3', '105', '9', '62992', '128672', '21'), +('3', '105', '15', '111348', '210520', '21'), +('3', '105', '15', '111343', '210236', '21'), +('3', '105', '15', '111341', '209834', '21'), +('3', '105', '15', '111342', '209076', '21'), +('3', '105', '20', '111354', '234891', '21'), +('3', '105', '20', '111355', '232724', '21'), +('3', '105', '20', '111353', '231819', '21'), +('3', '105', '20', '111351', '231491', '21'), +('3', '105', '12', '81795', '130076', '21'), +('3', '105', '12', '56073', '129907', '21'), +('3', '105', '12', '89366', '123502', '21'), +('3', '105', '12', '104401', '110116', '21'), +('3', '105', '18', '62986', '135839', '21'), +('3', '105', '18', '56041', '135585', '21'), +('3', '105', '18', '62987', '134475', '21'), +('3', '105', '18', '94054', '134264', '21'), +('3', '105', '19', '62990', '133840', '21'), +('3', '105', '19', '56037', '133441', '21'), +('3', '105', '19', '56075', '132688', '21'), +('3', '105', '19', '81763', '132179', '21'), +('3', '105', '13', '111526', '431611', '21'), +('3', '105', '13', '111514', '414772', '21'), +('3', '105', '13', '111520', '410710', '21'), +('3', '105', '13', '111525', '409135', '21'), +('3', '105', '14', '111536', '216067', '21'), +('3', '105', '14', '111539', '215141', '21'), +('3', '105', '14', '111535', '214766', '21'), +('3', '105', '14', '111538', '214252', '21'), +('3', '105', '11', '133816', '271518', '21'), +('3', '105', '11', '111529', '261266', '21'), +('3', '105', '11', '111229', '242010', '21'), +('3', '105', '11', '111338', '210325', '21'), +('3', '106', '22', '23597', '0', '23'), +('3', '106', '22', '7867', '0', '23'), +('3', '106', '22', '39342', '0', '23'), +('3', '106', '22', '66166', '0', '23'), +('3', '106', '1', '98769', '351532', '23'), +('3', '106', '1', '111309', '210843', '23'), +('3', '106', '1', '111303', '210097', '23'), +('3', '106', '1', '111305', '208836', '23'), +('3', '106', '2', '94056', '132906', '23'), +('3', '106', '2', '62985', '132211', '23'), +('3', '106', '2', '89368', '126322', '23'), +('3', '106', '2', '104403', '111599', '23'), +('3', '106', '3', '111312', '210177', '23'), +('3', '106', '3', '111315', '209332', '23'), +('3', '106', '3', '111313', '209249', '23'), +('3', '106', '3', '111316', '207203', '23'), +('3', '106', '5', '111317', '209789', '23'), +('3', '106', '5', '111318', '208823', '23'), +('3', '106', '5', '111320', '208789', '23'), +('3', '106', '5', '111319', '206855', '23'), +('3', '106', '8', '111331', '211091', '23'), +('3', '106', '8', '111328', '210145', '23'), +('3', '106', '8', '111332', '207191', '23'), +('3', '106', '8', '111030', '185311', '23'), +('3', '106', '6', '111322', '209299', '23'), +('3', '106', '6', '111324', '209231', '23'), +('3', '106', '6', '111326', '206935', '23'), +('3', '106', '6', '111021', '183569', '23'), +('3', '106', '17', '56046', '139276', '23'), +('3', '106', '17', '81765', '138675', '23'), +('3', '106', '17', '56083', '138170', '23'), +('3', '106', '17', '104406', '118912', '23'), +('3', '106', '7', '94053', '133444', '23'), +('3', '106', '7', '56079', '132827', '23'), +('3', '106', '7', '89369', '127600', '23'), +('3', '106', '7', '104404', '111516', '23'), +('3', '106', '9', '67098', '216245', '23'), +('3', '106', '9', '56031', '128823', '23'), +('3', '106', '9', '56033', '128735', '23'), +('3', '106', '9', '62992', '128677', '23'), +('3', '106', '15', '111348', '210527', '23'), +('3', '106', '15', '111343', '210240', '23'), +('3', '106', '15', '111341', '209841', '23'), +('3', '106', '15', '111342', '209082', '23'), +('3', '106', '20', '111354', '234897', '23'), +('3', '106', '20', '111355', '232728', '23'), +('3', '106', '20', '111353', '231825', '23'), +('3', '106', '20', '111351', '231495', '23'), +('3', '106', '12', '81795', '130083', '23'), +('3', '106', '12', '56073', '129915', '23'), +('3', '106', '12', '89366', '123507', '23'), +('3', '106', '12', '104401', '110122', '23'), +('3', '106', '18', '62986', '135846', '23'), +('3', '106', '18', '56041', '135589', '23'), +('3', '106', '18', '62987', '134479', '23'), +('3', '106', '18', '94054', '134269', '23'), +('3', '106', '19', '62990', '133845', '23'), +('3', '106', '19', '56037', '133447', '23'), +('3', '106', '19', '56075', '132694', '23'), +('3', '106', '19', '81763', '132185', '23'), +('3', '106', '13', '111526', '432153', '23'), +('3', '106', '13', '111514', '415287', '23'), +('3', '106', '13', '111520', '411225', '23'), +('3', '106', '13', '111525', '409649', '23'), +('3', '106', '14', '111536', '216072', '23'), +('3', '106', '14', '111539', '215147', '23'), +('3', '106', '14', '111535', '214772', '23'), +('3', '106', '14', '111538', '214256', '23'), +('3', '106', '11', '133816', '271523', '23'), +('3', '106', '11', '111529', '261337', '23'), +('3', '106', '11', '111229', '242082', '23'), +('3', '106', '11', '111338', '210331', '23'), +('3', '107', '22', '23597', '0', '23'), +('3', '107', '22', '7867', '0', '23'), +('3', '107', '22', '39342', '0', '23'), +('3', '107', '22', '66166', '0', '23'), +('3', '107', '1', '98769', '351536', '23'), +('3', '107', '1', '111309', '210847', '23'), +('3', '107', '1', '111303', '210103', '23'), +('3', '107', '1', '111305', '208842', '23'), +('3', '107', '2', '94056', '132911', '23'), +('3', '107', '2', '62985', '132216', '23'), +('3', '107', '2', '89368', '126327', '23'), +('3', '107', '2', '104403', '111603', '23'), +('3', '107', '3', '111312', '210182', '23'), +('3', '107', '3', '111315', '209339', '23'), +('3', '107', '3', '111313', '209254', '23'), +('3', '107', '3', '111316', '207208', '23'), +('3', '107', '5', '111317', '209795', '23'), +('3', '107', '5', '111318', '208827', '23'), +('3', '107', '5', '111320', '208794', '23'), +('3', '107', '5', '111319', '206862', '23'), +('3', '107', '8', '111331', '211098', '23'), +('3', '107', '8', '111328', '210151', '23'), +('3', '107', '8', '111332', '207196', '23'), +('3', '107', '8', '111030', '185318', '23'), +('3', '107', '6', '111322', '209304', '23'), +('3', '107', '6', '111324', '209236', '23'), +('3', '107', '6', '111326', '206941', '23'), +('3', '107', '6', '111021', '183574', '23'), +('3', '107', '17', '56046', '139283', '23'), +('3', '107', '17', '81765', '138680', '23'), +('3', '107', '17', '56083', '138173', '23'), +('3', '107', '17', '104406', '118920', '23'), +('3', '107', '7', '94053', '133450', '23'), +('3', '107', '7', '56079', '132833', '23'), +('3', '107', '7', '89369', '127606', '23'), +('3', '107', '7', '104404', '111521', '23'), +('3', '107', '9', '67098', '216250', '23'), +('3', '107', '9', '56031', '128827', '23'), +('3', '107', '9', '56033', '128739', '23'), +('3', '107', '9', '62984', '128684', '23'), +('3', '107', '15', '111348', '210534', '23'), +('3', '107', '15', '111343', '210245', '23'), +('3', '107', '15', '111341', '209848', '23'), +('3', '107', '15', '111342', '209088', '23'), +('3', '107', '20', '111354', '234902', '23'), +('3', '107', '20', '111355', '232732', '23'), +('3', '107', '20', '111353', '231830', '23'), +('3', '107', '20', '111351', '231499', '23'), +('3', '107', '12', '81795', '130088', '23'), +('3', '107', '12', '56073', '129921', '23'), +('3', '107', '12', '89366', '123512', '23'), +('3', '107', '12', '104401', '110128', '23'), +('3', '107', '18', '62986', '135854', '23'), +('3', '107', '18', '56041', '135592', '23'), +('3', '107', '18', '62987', '134482', '23'), +('3', '107', '18', '94054', '134275', '23'), +('3', '107', '19', '62990', '133850', '23'), +('3', '107', '19', '56037', '133453', '23'), +('3', '107', '19', '56075', '132700', '23'), +('3', '107', '19', '81763', '132191', '23'), +('3', '107', '13', '111526', '432696', '23'), +('3', '107', '13', '111514', '415802', '23'), +('3', '107', '13', '111520', '411739', '23'), +('3', '107', '13', '111525', '410164', '23'), +('3', '107', '14', '111536', '216077', '23'), +('3', '107', '14', '111539', '215152', '23'), +('3', '107', '14', '111535', '214778', '23'), +('3', '107', '14', '111538', '214261', '23'), +('3', '107', '11', '133816', '271528', '23'), +('3', '107', '11', '111529', '261418', '23'), +('3', '107', '11', '111229', '242163', '23'), +('3', '107', '11', '111338', '210337', '23'), +('3', '108', '22', '23597', '0', '23'), +('3', '108', '22', '7867', '0', '23'), +('3', '108', '22', '39342', '0', '23'), +('3', '108', '22', '66166', '0', '23'), +('3', '108', '1', '98769', '351540', '23'), +('3', '108', '1', '111309', '210851', '23'), +('3', '108', '1', '111303', '210109', '23'), +('3', '108', '1', '111305', '208849', '23'), +('3', '108', '2', '94056', '132916', '23'), +('3', '108', '2', '62985', '132220', '23'), +('3', '108', '2', '89368', '126333', '23'), +('3', '108', '2', '104403', '111607', '23'), +('3', '108', '3', '111312', '210188', '23'), +('3', '108', '3', '111315', '209347', '23'), +('3', '108', '3', '111313', '209259', '23'), +('3', '108', '3', '111316', '207214', '23'), +('3', '108', '5', '111317', '209802', '23'), +('3', '108', '5', '111318', '208832', '23'), +('3', '108', '5', '111320', '208800', '23'), +('3', '108', '5', '111319', '206868', '23'), +('3', '108', '8', '111331', '211104', '23'), +('3', '108', '8', '111328', '210156', '23'), +('3', '108', '8', '111332', '207201', '23'), +('3', '108', '8', '111030', '185324', '23'), +('3', '108', '6', '111322', '209308', '23'), +('3', '108', '6', '111324', '209242', '23'), +('3', '108', '6', '111326', '206948', '23'), +('3', '108', '6', '111021', '183578', '23'), +('3', '108', '17', '56046', '139290', '23'), +('3', '108', '17', '81765', '138685', '23'), +('3', '108', '17', '56083', '138176', '23'), +('3', '108', '17', '104406', '118927', '23'), +('3', '108', '7', '94053', '133455', '23'), +('3', '108', '7', '56079', '132839', '23'), +('3', '108', '7', '89369', '127611', '23'), +('3', '108', '7', '104404', '111527', '23'), +('3', '108', '9', '67098', '216256', '23'), +('3', '108', '9', '56031', '128831', '23'), +('3', '108', '9', '56033', '128743', '23'), +('3', '108', '9', '62984', '128692', '23'), +('3', '108', '15', '111348', '210541', '23'), +('3', '108', '15', '111343', '210250', '23'), +('3', '108', '15', '111341', '209855', '23'), +('3', '108', '15', '111342', '209095', '23'), +('3', '108', '20', '111354', '234908', '23'), +('3', '108', '20', '111355', '232736', '23'), +('3', '108', '20', '111353', '231836', '23'), +('3', '108', '20', '111351', '231504', '23'), +('3', '108', '12', '81795', '130094', '23'), +('3', '108', '12', '56073', '129929', '23'), +('3', '108', '12', '89366', '123516', '23'), +('3', '108', '12', '104401', '110135', '23'), +('3', '108', '18', '62986', '135862', '23'), +('3', '108', '18', '56041', '135596', '23'), +('3', '108', '18', '62987', '134486', '23'), +('3', '108', '18', '94054', '134280', '23'), +('3', '108', '19', '62990', '133855', '23'), +('3', '108', '19', '56037', '133459', '23'), +('3', '108', '19', '56075', '132706', '23'), +('3', '108', '19', '81763', '132197', '23'), +('3', '108', '13', '111526', '433239', '23'), +('3', '108', '13', '111514', '416317', '23'), +('3', '108', '13', '111520', '412253', '23'), +('3', '108', '13', '111525', '410679', '23'), +('3', '108', '14', '111536', '216082', '23'), +('3', '108', '14', '111539', '215158', '23'), +('3', '108', '14', '111535', '214785', '23'), +('3', '108', '14', '111538', '214266', '23'), +('3', '108', '11', '133816', '271532', '23'), +('3', '108', '11', '111529', '261499', '23'), +('3', '108', '11', '111229', '242235', '23'), +('3', '108', '11', '111338', '210343', '23'), +('3', '109', '22', '23597', '0', '23'), +('3', '109', '22', '7867', '0', '23'), +('3', '109', '22', '39342', '0', '23'), +('3', '109', '22', '66166', '0', '23'), +('3', '109', '1', '98769', '351544', '23'), +('3', '109', '1', '111309', '210856', '23'), +('3', '109', '1', '111303', '210116', '23'), +('3', '109', '1', '111305', '208856', '23'), +('3', '109', '2', '94056', '132921', '23'), +('3', '109', '2', '62985', '132225', '23'), +('3', '109', '2', '89368', '126339', '23'), +('3', '109', '2', '104403', '111612', '23'), +('3', '109', '3', '111312', '210194', '23'), +('3', '109', '3', '111315', '209355', '23'), +('3', '109', '3', '111313', '209264', '23'), +('3', '109', '3', '111316', '207220', '23'), +('3', '109', '5', '111317', '209809', '23'), +('3', '109', '5', '111318', '208836', '23'), +('3', '109', '5', '111320', '208805', '23'), +('3', '109', '5', '111319', '206875', '23'), +('3', '109', '8', '111331', '211111', '23'), +('3', '109', '8', '111328', '210162', '23'), +('3', '109', '8', '111332', '207206', '23'), +('3', '109', '8', '111030', '185331', '23'), +('3', '109', '6', '111322', '209312', '23'), +('3', '109', '6', '111324', '209248', '23'), +('3', '109', '6', '111326', '206954', '23'), +('3', '109', '6', '111021', '183582', '23'), +('3', '109', '17', '56046', '139298', '23'), +('3', '109', '17', '81765', '138690', '23'), +('3', '109', '17', '56083', '138180', '23'), +('3', '109', '17', '104406', '118935', '23'), +('3', '109', '7', '94053', '133461', '23'), +('3', '109', '7', '56079', '132845', '23'), +('3', '109', '7', '89369', '127617', '23'), +('3', '109', '7', '104404', '111533', '23'), +('3', '109', '9', '67098', '216261', '23'), +('3', '109', '9', '56031', '128835', '23'), +('3', '109', '9', '56033', '128746', '23'), +('3', '109', '9', '62984', '128700', '23'), +('3', '109', '15', '111348', '210548', '23'), +('3', '109', '15', '111343', '210255', '23'), +('3', '109', '15', '111341', '209862', '23'), +('3', '109', '15', '111342', '209102', '23'), +('3', '109', '20', '111354', '234914', '23'), +('3', '109', '20', '111355', '232740', '23'), +('3', '109', '20', '111353', '231842', '23'), +('3', '109', '20', '111351', '231508', '23'), +('3', '109', '12', '81795', '130100', '23'), +('3', '109', '12', '56073', '129936', '23'), +('3', '109', '12', '89366', '123521', '23'), +('3', '109', '12', '104401', '110141', '23'), +('3', '109', '18', '62986', '135870', '23'), +('3', '109', '18', '56041', '135599', '23'), +('3', '109', '18', '62987', '134489', '23'), +('3', '109', '18', '94054', '134286', '23'), +('3', '109', '19', '62990', '133860', '23'), +('3', '109', '19', '56037', '133465', '23'), +('3', '109', '19', '56075', '132712', '23'), +('3', '109', '19', '81763', '132203', '23'), +('3', '109', '13', '111526', '433781', '23'), +('3', '109', '13', '111514', '416860', '23'), +('3', '109', '13', '111520', '412767', '23'), +('3', '109', '13', '111525', '411193', '23'), +('3', '109', '14', '111536', '216087', '23'), +('3', '109', '14', '111539', '215164', '23'), +('3', '109', '14', '111535', '214792', '23'), +('3', '109', '14', '111538', '214270', '23'), +('3', '109', '11', '133816', '271537', '23'), +('3', '109', '11', '111529', '261570', '23'), +('3', '109', '11', '111229', '242316', '23'), +('3', '109', '11', '111338', '210349', '23'), +('3', '110', '22', '23597', '0', '25'), +('3', '110', '22', '7867', '0', '25'), +('3', '110', '22', '39342', '0', '25'), +('3', '110', '22', '66166', '0', '25'), +('3', '110', '1', '98769', '351549', '25'), +('3', '110', '1', '111309', '210860', '25'), +('3', '110', '1', '111303', '210122', '25'), +('3', '110', '1', '111305', '208862', '25'), +('3', '110', '2', '94056', '132926', '25'), +('3', '110', '2', '62985', '132230', '25'), +('3', '110', '2', '89368', '126344', '25'), +('3', '110', '2', '104403', '111616', '25'), +('3', '110', '3', '111312', '210200', '25'), +('3', '110', '3', '111315', '209362', '25'), +('3', '110', '3', '111313', '209269', '25'), +('3', '110', '3', '111316', '207225', '25'), +('3', '110', '5', '111317', '209815', '25'), +('3', '110', '5', '111318', '208841', '25'), +('3', '110', '5', '111320', '208811', '25'), +('3', '110', '5', '111319', '206881', '25'), +('3', '110', '8', '111331', '211118', '25'), +('3', '110', '8', '111328', '210168', '25'), +('3', '110', '8', '111332', '207211', '25'), +('3', '110', '8', '111030', '185338', '25'), +('3', '110', '6', '111322', '209317', '25'), +('3', '110', '6', '111324', '209254', '25'), +('3', '110', '6', '111326', '206960', '25'), +('3', '110', '6', '111021', '183587', '25'), +('3', '110', '17', '56046', '139305', '25'), +('3', '110', '17', '81765', '138695', '25'), +('3', '110', '17', '56083', '138183', '25'), +('3', '110', '17', '104406', '118943', '25'), +('3', '110', '7', '94053', '133466', '25'), +('3', '110', '7', '56079', '132852', '25'), +('3', '110', '7', '89369', '127623', '25'), +('3', '110', '7', '104404', '111538', '25'), +('3', '110', '9', '67098', '216266', '25'), +('3', '110', '9', '56031', '128839', '25'), +('3', '110', '9', '56033', '128750', '25'), +('3', '110', '9', '62984', '128707', '25'), +('3', '110', '15', '111348', '210555', '25'), +('3', '110', '15', '111343', '210259', '25'), +('3', '110', '15', '111341', '209870', '25'), +('3', '110', '15', '111342', '209108', '25'), +('3', '110', '20', '111354', '234920', '25'), +('3', '110', '20', '111355', '232744', '25'), +('3', '110', '20', '111353', '231848', '25'), +('3', '110', '20', '111351', '231513', '25'), +('3', '110', '12', '81795', '130106', '25'), +('3', '110', '12', '56073', '129944', '25'), +('3', '110', '12', '89366', '123526', '25'), +('3', '110', '12', '104401', '110148', '25'), +('3', '110', '18', '62986', '135877', '25'), +('3', '110', '18', '56041', '135603', '25'), +('3', '110', '18', '62987', '134493', '25'), +('3', '110', '18', '94054', '134291', '25'), +('3', '110', '19', '62990', '133865', '25'), +('3', '110', '19', '56037', '133471', '25'), +('3', '110', '19', '56075', '132718', '25'), +('3', '110', '19', '81763', '132209', '25'), +('3', '110', '13', '111526', '435599', '25'), +('3', '110', '13', '111514', '418650', '25'), +('3', '110', '13', '111520', '414557', '25'), +('3', '110', '13', '111525', '412983', '25'), +('3', '110', '14', '111536', '216092', '25'), +('3', '110', '14', '111539', '215169', '25'), +('3', '110', '14', '111535', '214798', '25'), +('3', '110', '14', '111538', '214275', '25'), +('3', '110', '11', '85213', '313730', '25'), +('3', '110', '11', '133816', '271542', '25'), +('3', '110', '11', '111529', '261651', '25'), +('3', '110', '11', '111229', '242388', '25'), +('3', '110', '22', '23597', '0', '24'), +('3', '110', '22', '7867', '0', '24'), +('3', '110', '22', '39342', '0', '24'), +('3', '110', '22', '66166', '0', '24'), +('3', '110', '1', '98769', '351549', '24'), +('3', '110', '1', '111309', '210860', '24'), +('3', '110', '1', '111303', '210122', '24'), +('3', '110', '1', '111305', '208862', '24'), +('3', '110', '2', '94056', '132926', '24'), +('3', '110', '2', '62985', '132230', '24'), +('3', '110', '2', '89368', '126344', '24'), +('3', '110', '2', '104403', '111616', '24'), +('3', '110', '3', '111312', '210200', '24'), +('3', '110', '3', '111315', '209362', '24'), +('3', '110', '3', '111313', '209269', '24'), +('3', '110', '3', '111316', '207225', '24'), +('3', '110', '5', '111317', '209815', '24'), +('3', '110', '5', '111318', '208841', '24'), +('3', '110', '5', '111320', '208811', '24'), +('3', '110', '5', '111319', '206881', '24'), +('3', '110', '8', '111331', '211118', '24'), +('3', '110', '8', '111328', '210168', '24'), +('3', '110', '8', '111332', '207211', '24'), +('3', '110', '8', '111030', '185338', '24'), +('3', '110', '6', '111322', '209317', '24'), +('3', '110', '6', '111324', '209254', '24'), +('3', '110', '6', '111326', '206960', '24'), +('3', '110', '6', '111021', '183587', '24'), +('3', '110', '17', '56046', '139305', '24'), +('3', '110', '17', '81765', '138695', '24'), +('3', '110', '17', '56083', '138183', '24'), +('3', '110', '17', '104406', '118943', '24'), +('3', '110', '7', '94053', '133466', '24'), +('3', '110', '7', '56079', '132852', '24'), +('3', '110', '7', '89369', '127623', '24'), +('3', '110', '7', '104404', '111538', '24'), +('3', '110', '9', '67098', '216266', '24'), +('3', '110', '9', '56031', '128839', '24'), +('3', '110', '9', '56033', '128750', '24'), +('3', '110', '9', '62984', '128707', '24'), +('3', '110', '15', '111348', '210555', '24'), +('3', '110', '15', '111343', '210259', '24'), +('3', '110', '15', '111341', '209870', '24'), +('3', '110', '15', '111342', '209108', '24'), +('3', '110', '20', '111354', '234920', '24'), +('3', '110', '20', '111355', '232744', '24'), +('3', '110', '20', '111353', '231848', '24'), +('3', '110', '20', '111351', '231513', '24'), +('3', '110', '12', '81795', '130106', '24'), +('3', '110', '12', '56073', '129944', '24'), +('3', '110', '12', '89366', '123526', '24'), +('3', '110', '12', '104401', '110148', '24'), +('3', '110', '18', '62986', '135877', '24'), +('3', '110', '18', '56041', '135603', '24'), +('3', '110', '18', '62987', '134493', '24'), +('3', '110', '18', '94054', '134291', '24'), +('3', '110', '19', '62990', '133865', '24'), +('3', '110', '19', '56037', '133471', '24'), +('3', '110', '19', '56075', '132718', '24'), +('3', '110', '19', '81763', '132209', '24'), +('3', '110', '13', '111526', '435599', '24'), +('3', '110', '13', '111514', '418650', '24'), +('3', '110', '13', '111520', '414557', '24'), +('3', '110', '13', '111525', '412983', '24'), +('3', '110', '14', '111536', '216092', '24'), +('3', '110', '14', '111539', '215169', '24'), +('3', '110', '14', '111535', '214798', '24'), +('3', '110', '14', '111538', '214275', '24'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('3', '110', '11', '85213', '313730', '24'), +('3', '110', '11', '133816', '271542', '24'), +('3', '110', '11', '111529', '261651', '24'), +('3', '110', '11', '111229', '242388', '24'), +('3', '111', '22', '23597', '0', '25'), +('3', '111', '22', '7867', '0', '25'), +('3', '111', '22', '39342', '0', '25'), +('3', '111', '22', '66166', '0', '25'), +('3', '111', '1', '98769', '351553', '25'), +('3', '111', '1', '111309', '210865', '25'), +('3', '111', '1', '111303', '210129', '25'), +('3', '111', '1', '111305', '208869', '25'), +('3', '111', '2', '94056', '132931', '25'), +('3', '111', '2', '62985', '132235', '25'), +('3', '111', '2', '89368', '126350', '25'), +('3', '111', '2', '104403', '111620', '25'), +('3', '111', '3', '111312', '210206', '25'), +('3', '111', '3', '111315', '209370', '25'), +('3', '111', '3', '111313', '209274', '25'), +('3', '111', '3', '111316', '207231', '25'), +('3', '111', '5', '111317', '209822', '25'), +('3', '111', '5', '111318', '208845', '25'), +('3', '111', '5', '111320', '208817', '25'), +('3', '111', '5', '111319', '206888', '25'), +('3', '111', '8', '111331', '211125', '25'), +('3', '111', '8', '111328', '210174', '25'), +('3', '111', '8', '111332', '207216', '25'), +('3', '111', '8', '111030', '185345', '25'), +('3', '111', '6', '111322', '209321', '25'), +('3', '111', '6', '111324', '209260', '25'), +('3', '111', '6', '111326', '206967', '25'), +('3', '111', '6', '111021', '183591', '25'), +('3', '111', '17', '56046', '139312', '25'), +('3', '111', '17', '81765', '138699', '25'), +('3', '111', '17', '56083', '138186', '25'), +('3', '111', '17', '104406', '118950', '25'), +('3', '111', '7', '94053', '133472', '25'), +('3', '111', '7', '56079', '132858', '25'), +('3', '111', '7', '89369', '127629', '25'), +('3', '111', '7', '104404', '111544', '25'), +('3', '111', '9', '67098', '216272', '25'), +('3', '111', '9', '56031', '128843', '25'), +('3', '111', '9', '56033', '128754', '25'), +('3', '111', '9', '62984', '128715', '25'), +('3', '111', '15', '111348', '210562', '25'), +('3', '111', '15', '111343', '210264', '25'), +('3', '111', '15', '111341', '209877', '25'), +('3', '111', '15', '111342', '209115', '25'), +('3', '111', '20', '111354', '234926', '25'), +('3', '111', '20', '111355', '232748', '25'), +('3', '111', '20', '111353', '231854', '25'), +('3', '111', '20', '111351', '231517', '25'), +('3', '111', '12', '81795', '130113', '25'), +('3', '111', '12', '56073', '129951', '25'), +('3', '111', '12', '89366', '123531', '25'), +('3', '111', '12', '104401', '110154', '25'), +('3', '111', '18', '62986', '135885', '25'), +('3', '111', '18', '56041', '135606', '25'), +('3', '111', '18', '62987', '134497', '25'), +('3', '111', '18', '94054', '134297', '25'), +('3', '111', '19', '62990', '133871', '25'), +('3', '111', '19', '56037', '133477', '25'), +('3', '111', '19', '56075', '132725', '25'), +('3', '111', '19', '81763', '132215', '25'), +('3', '111', '13', '111526', '436142', '25'), +('3', '111', '13', '111514', '419165', '25'), +('3', '111', '13', '111520', '415071', '25'), +('3', '111', '13', '111525', '413469', '25'), +('3', '111', '14', '111536', '216097', '25'), +('3', '111', '14', '111539', '215175', '25'), +('3', '111', '14', '111535', '214805', '25'), +('3', '111', '14', '111538', '214280', '25'), +('3', '111', '11', '85213', '313735', '25'), +('3', '111', '11', '133816', '271547', '25'), +('3', '111', '11', '111529', '261732', '25'), +('3', '111', '11', '111229', '242460', '25'), +('3', '112', '22', '23597', '0', '25'), +('3', '112', '22', '7867', '0', '25'), +('3', '112', '22', '39342', '0', '25'), +('3', '112', '22', '66166', '0', '25'), +('3', '112', '1', '98769', '351557', '25'), +('3', '112', '1', '111309', '210869', '25'), +('3', '112', '1', '111303', '210135', '25'), +('3', '112', '1', '111305', '208876', '25'), +('3', '112', '2', '94056', '132936', '25'), +('3', '112', '2', '62985', '132240', '25'), +('3', '112', '2', '89368', '126356', '25'), +('3', '112', '2', '104403', '111625', '25'), +('3', '112', '3', '111312', '210212', '25'), +('3', '112', '3', '111315', '209378', '25'), +('3', '112', '3', '111313', '209279', '25'), +('3', '112', '3', '111316', '207237', '25'), +('3', '112', '5', '111317', '209829', '25'), +('3', '112', '5', '111318', '208850', '25'), +('3', '112', '5', '111320', '208822', '25'), +('3', '112', '5', '111319', '206895', '25'), +('3', '112', '8', '111331', '211131', '25'), +('3', '112', '8', '111328', '210179', '25'), +('3', '112', '8', '111332', '207221', '25'), +('3', '112', '8', '111030', '185351', '25'), +('3', '112', '6', '111322', '209326', '25'), +('3', '112', '6', '111324', '209265', '25'), +('3', '112', '6', '111326', '206973', '25'), +('3', '112', '6', '111021', '183596', '25'), +('3', '112', '17', '56046', '139320', '25'), +('3', '112', '17', '81765', '138704', '25'), +('3', '112', '17', '56083', '138190', '25'), +('3', '112', '17', '104406', '118958', '25'), +('3', '112', '7', '94053', '133477', '25'), +('3', '112', '7', '56079', '132864', '25'), +('3', '112', '7', '89369', '127635', '25'), +('3', '112', '7', '104404', '111550', '25'), +('3', '112', '9', '67098', '216277', '25'), +('3', '112', '9', '56031', '128847', '25'), +('3', '112', '9', '56033', '128758', '25'), +('3', '112', '9', '62984', '128723', '25'), +('3', '112', '15', '111348', '210569', '25'), +('3', '112', '15', '111343', '210269', '25'), +('3', '112', '15', '111341', '209884', '25'), +('3', '112', '15', '111342', '209121', '25'), +('3', '112', '20', '111354', '234931', '25'), +('3', '112', '20', '111355', '232753', '25'), +('3', '112', '20', '111353', '231860', '25'), +('3', '112', '20', '111351', '231522', '25'), +('3', '112', '12', '81795', '130119', '25'), +('3', '112', '12', '56073', '129958', '25'), +('3', '112', '12', '89366', '123536', '25'), +('3', '112', '12', '104401', '110160', '25'), +('3', '112', '18', '62986', '135893', '25'), +('3', '112', '18', '56041', '135610', '25'), +('3', '112', '18', '62987', '134500', '25'), +('3', '112', '18', '94054', '134303', '25'), +('3', '112', '19', '62990', '133876', '25'), +('3', '112', '19', '56037', '133483', '25'), +('3', '112', '19', '56075', '132731', '25'), +('3', '112', '19', '81763', '132221', '25'), +('3', '112', '13', '111526', '436685', '25'), +('3', '112', '13', '111514', '419680', '25'), +('3', '112', '13', '111520', '415585', '25'), +('3', '112', '13', '111525', '413984', '25'), +('3', '112', '14', '111536', '216102', '25'), +('3', '112', '14', '111539', '215181', '25'), +('3', '112', '14', '111535', '214811', '25'), +('3', '112', '14', '111538', '214284', '25'), +('3', '112', '11', '85213', '313739', '25'), +('3', '112', '11', '133816', '271552', '25'), +('3', '112', '11', '111529', '261813', '25'), +('3', '112', '11', '111229', '242541', '25'), +('3', '113', '22', '23597', '0', '25'), +('3', '113', '22', '7867', '0', '25'), +('3', '113', '22', '39342', '0', '25'), +('3', '113', '22', '66166', '0', '25'), +('3', '113', '1', '98769', '351561', '25'), +('3', '113', '1', '111309', '210874', '25'), +('3', '113', '1', '111303', '210142', '25'), +('3', '113', '1', '111305', '208882', '25'), +('3', '113', '2', '94056', '132941', '25'), +('3', '113', '2', '62985', '132244', '25'), +('3', '113', '2', '89368', '126361', '25'), +('3', '113', '2', '104403', '111629', '25'), +('3', '113', '3', '111312', '210218', '25'), +('3', '113', '3', '111315', '209385', '25'), +('3', '113', '3', '111313', '209284', '25'), +('3', '113', '3', '111316', '207243', '25'), +('3', '113', '5', '111317', '209835', '25'), +('3', '113', '5', '111318', '208854', '25'), +('3', '113', '5', '111320', '208828', '25'), +('3', '113', '5', '111319', '206901', '25'), +('3', '113', '8', '111331', '211138', '25'), +('3', '113', '8', '111328', '210185', '25'), +('3', '113', '8', '111332', '207226', '25'), +('3', '113', '8', '111030', '185358', '25'), +('3', '113', '6', '111322', '209330', '25'), +('3', '113', '6', '111324', '209271', '25'), +('3', '113', '6', '111326', '206980', '25'), +('3', '113', '6', '111021', '183600', '25'), +('3', '113', '17', '56046', '139327', '25'), +('3', '113', '17', '81765', '138709', '25'), +('3', '113', '17', '56083', '138193', '25'), +('3', '113', '17', '104406', '118966', '25'), +('3', '113', '7', '94053', '133483', '25'), +('3', '113', '7', '56079', '132870', '25'), +('3', '113', '7', '89369', '127641', '25'), +('3', '113', '7', '104404', '111555', '25'), +('3', '113', '9', '67098', '216282', '25'), +('3', '113', '9', '56031', '128851', '25'), +('3', '113', '9', '56033', '128762', '25'), +('3', '113', '9', '62984', '128731', '25'), +('3', '113', '15', '111348', '210576', '25'), +('3', '113', '15', '111343', '210274', '25'), +('3', '113', '15', '111341', '209891', '25'), +('3', '113', '15', '111342', '209128', '25'), +('3', '113', '20', '111354', '234937', '25'), +('3', '113', '20', '111355', '232757', '25'), +('3', '113', '20', '111353', '231866', '25'), +('3', '113', '20', '111351', '231527', '25'), +('3', '113', '12', '81795', '130125', '25'), +('3', '113', '12', '56073', '129966', '25'), +('3', '113', '12', '89366', '123541', '25'), +('3', '113', '12', '104401', '110167', '25'), +('3', '113', '18', '62986', '135901', '25'), +('3', '113', '18', '56041', '135613', '25'), +('3', '113', '18', '62987', '134504', '25'), +('3', '113', '18', '94054', '134308', '25'), +('3', '113', '19', '62990', '133881', '25'), +('3', '113', '19', '56037', '133489', '25'), +('3', '113', '19', '56075', '132737', '25'), +('3', '113', '19', '81763', '132227', '25'), +('3', '113', '13', '111526', '437199', '25'), +('3', '113', '13', '111514', '420195', '25'), +('3', '113', '13', '111520', '416100', '25'), +('3', '113', '13', '111525', '414499', '25'), +('3', '113', '14', '111536', '216107', '25'), +('3', '113', '14', '111539', '215187', '25'), +('3', '113', '14', '111535', '214818', '25'), +('3', '113', '14', '111538', '214289', '25'), +('3', '113', '11', '85213', '313743', '25'), +('3', '113', '11', '133816', '271556', '25'), +('3', '113', '11', '111529', '261885', '25'), +('3', '113', '11', '111229', '242613', '25'), +('3', '114', '22', '23597', '0', '25'), +('3', '114', '22', '7867', '0', '25'), +('3', '114', '22', '39342', '0', '25'), +('3', '114', '22', '66166', '0', '25'), +('3', '114', '1', '98769', '351565', '25'), +('3', '114', '1', '111309', '210878', '25'), +('3', '114', '1', '111303', '210148', '25'), +('3', '114', '1', '111305', '208889', '25'), +('3', '114', '2', '94056', '132946', '25'), +('3', '114', '2', '62985', '132249', '25'), +('3', '114', '2', '89368', '126367', '25'), +('3', '114', '2', '104403', '111633', '25'), +('3', '114', '3', '111312', '210224', '25'), +('3', '114', '3', '111315', '209393', '25'), +('3', '114', '3', '111313', '209289', '25'), +('3', '114', '3', '111316', '207248', '25'), +('3', '114', '5', '111317', '209842', '25'), +('3', '114', '5', '111318', '208859', '25'), +('3', '114', '5', '111320', '208834', '25'), +('3', '114', '5', '111319', '206908', '25'), +('3', '114', '8', '111331', '211145', '25'), +('3', '114', '8', '111328', '210191', '25'), +('3', '114', '8', '111332', '207231', '25'), +('3', '114', '8', '111030', '185365', '25'), +('3', '114', '6', '111322', '209334', '25'), +('3', '114', '6', '111324', '209277', '25'), +('3', '114', '6', '111326', '206986', '25'), +('3', '114', '6', '111021', '183604', '25'), +('3', '114', '17', '56046', '139335', '25'), +('3', '114', '17', '81765', '138714', '25'), +('3', '114', '17', '56083', '138196', '25'), +('3', '114', '17', '104406', '118973', '25'), +('3', '114', '7', '94053', '133488', '25'), +('3', '114', '7', '56079', '132876', '25'), +('3', '114', '7', '89369', '127646', '25'), +('3', '114', '7', '104404', '111561', '25'), +('3', '114', '9', '67098', '216288', '25'), +('3', '114', '9', '56031', '128856', '25'), +('3', '114', '9', '56033', '128766', '25'), +('3', '114', '9', '62984', '128738', '25'), +('3', '114', '15', '111348', '210583', '25'), +('3', '114', '15', '111343', '210278', '25'), +('3', '114', '15', '111341', '209898', '25'), +('3', '114', '15', '111342', '209135', '25'), +('3', '114', '20', '111354', '234943', '25'), +('3', '114', '20', '111355', '232761', '25'), +('3', '114', '20', '111353', '231872', '25'), +('3', '114', '20', '111351', '231531', '25'), +('3', '114', '12', '81795', '130131', '25'), +('3', '114', '12', '56073', '129973', '25'), +('3', '114', '12', '89366', '123546', '25'), +('3', '114', '12', '104401', '110173', '25'), +('3', '114', '18', '62986', '135909', '25'), +('3', '114', '18', '56041', '135617', '25'), +('3', '114', '18', '62987', '134508', '25'), +('3', '114', '18', '94054', '134314', '25'), +('3', '114', '19', '62990', '133886', '25'), +('3', '114', '19', '56037', '133495', '25'), +('3', '114', '19', '56075', '132743', '25'), +('3', '114', '19', '81763', '132233', '25'), +('3', '114', '13', '111526', '437742', '25'), +('3', '114', '13', '111514', '420710', '25'), +('3', '114', '13', '111520', '416614', '25'), +('3', '114', '13', '111525', '415014', '25'), +('3', '114', '14', '111536', '216113', '25'), +('3', '114', '14', '111539', '215192', '25'), +('3', '114', '14', '111535', '214824', '25'), +('3', '114', '14', '111538', '214294', '25'), +('3', '114', '11', '85213', '313747', '25'), +('3', '114', '11', '133816', '271561', '25'), +('3', '114', '11', '111529', '261966', '25'), +('3', '114', '11', '111229', '242694', '25'), +('3', '115', '22', '23597', '0', '26'), +('3', '115', '22', '7867', '0', '26'), +('3', '115', '22', '39342', '0', '26'), +('3', '115', '22', '66166', '0', '26'), +('3', '115', '1', '98769', '351570', '26'), +('3', '115', '1', '111309', '210882', '26'), +('3', '115', '1', '111303', '210155', '26'), +('3', '115', '1', '111305', '208896', '26'), +('3', '115', '2', '94056', '132951', '26'), +('3', '115', '2', '62985', '132254', '26'), +('3', '115', '2', '89368', '126373', '26'), +('3', '115', '2', '104403', '111638', '26'), +('3', '115', '3', '111312', '210230', '26'), +('3', '115', '3', '111315', '209401', '26'), +('3', '115', '3', '111313', '209294', '26'), +('3', '115', '3', '111316', '207254', '26'), +('3', '115', '5', '111317', '209849', '26'), +('3', '115', '5', '111318', '208863', '26'), +('3', '115', '5', '111320', '208839', '26'), +('3', '115', '5', '111319', '206915', '26'), +('3', '115', '8', '111331', '211152', '26'), +('3', '115', '8', '111328', '210197', '26'), +('3', '115', '8', '111332', '207236', '26'), +('3', '115', '8', '111030', '185372', '26'), +('3', '115', '6', '111322', '209339', '26'), +('3', '115', '6', '111324', '209283', '26'), +('3', '115', '6', '111326', '206992', '26'), +('3', '115', '6', '111021', '183609', '26'), +('3', '115', '17', '56046', '139342', '26'), +('3', '115', '17', '81765', '138719', '26'), +('3', '115', '17', '56083', '138200', '26'), +('3', '115', '17', '104406', '118981', '26'), +('3', '115', '7', '94053', '133494', '26'), +('3', '115', '7', '56079', '132882', '26'), +('3', '115', '7', '89369', '127652', '26'), +('3', '115', '7', '104404', '111567', '26'), +('3', '115', '9', '67098', '216293', '26'), +('3', '115', '9', '56031', '128860', '26'), +('3', '115', '9', '56033', '128770', '26'), +('3', '115', '9', '62984', '128746', '26'), +('3', '115', '15', '111348', '210590', '26'), +('3', '115', '15', '111343', '210283', '26'), +('3', '115', '15', '111341', '209905', '26'), +('3', '115', '15', '111342', '209141', '26'), +('3', '115', '20', '111354', '234949', '26'), +('3', '115', '20', '111355', '232765', '26'), +('3', '115', '20', '111353', '231878', '26'), +('3', '115', '20', '111351', '231536', '26'), +('3', '115', '12', '81795', '130137', '26'), +('3', '115', '12', '56073', '129981', '26'), +('3', '115', '12', '89366', '123551', '26'), +('3', '115', '12', '104401', '110180', '26'), +('3', '115', '18', '62986', '135917', '26'), +('3', '115', '18', '56041', '135620', '26'), +('3', '115', '18', '62987', '134511', '26'), +('3', '115', '18', '94054', '134319', '26'), +('3', '115', '19', '62990', '133891', '26'), +('3', '115', '19', '56037', '133501', '26'), +('3', '115', '19', '56075', '132750', '26'), +('3', '115', '19', '81763', '132239', '26'), +('3', '115', '13', '111526', '438285', '26'), +('3', '115', '13', '111514', '421253', '26'), +('3', '115', '13', '111520', '417128', '26'), +('3', '115', '13', '111525', '415528', '26'), +('3', '115', '14', '111536', '216118', '26'), +('3', '115', '14', '111539', '215198', '26'), +('3', '115', '14', '111535', '214831', '26'), +('3', '115', '14', '111538', '214298', '26'), +('3', '115', '11', '85213', '313751', '26'), +('3', '115', '11', '133816', '271566', '26'), +('3', '115', '11', '111529', '262047', '26'), +('3', '115', '11', '111229', '242766', '26'), +('4', '1', '22', '8567', '0', '0'), +('4', '1', '22', '10323', '0', '0'), +('4', '1', '22', '66166', '0', '0'), +('4', '1', '22', '10664', '0', '0'), +('4', '1', '1', '30361', '1290', '0'), +('4', '1', '1', '14701', '624', '0'), +('4', '1', '1', '14702', '600', '0'), +('4', '1', '1', '14568', '477', '0'), +('4', '1', '2', '30363', '1450', '0'), +('4', '1', '2', '10142', '1345', '0'), +('4', '1', '2', '4341', '1323', '0'), +('4', '1', '2', '3040', '1112', '0'), +('4', '1', '3', '14705', '990', '0'), +('4', '1', '3', '14706', '990', '0'), +('4', '1', '3', '14695', '431', '0'), +('4', '1', '3', '2282', '336', '0'), +('4', '1', '5', '30362', '1340', '0'), +('4', '1', '5', '14703', '1100', '0'), +('4', '1', '5', '14700', '636', '0'), +('4', '1', '5', '10147', '630', '0'), +('4', '1', '8', '11621', '8407', '0'), +('4', '1', '8', '11551', '1656', '0'), +('4', '1', '8', '11603', '1632', '0'), +('4', '1', '8', '3403', '1219', '0'), +('4', '1', '6', '1557', '5371', '0'), +('4', '1', '6', '2714', '1298', '0'), +('4', '1', '6', '3309', '554', '0'), +('4', '1', '6', '4165', '423', '0'), +('4', '1', '17', '11623', '2062', '0'), +('4', '1', '17', '4832', '1516', '0'), +('4', '1', '17', '4892', '1373', '0'), +('4', '1', '17', '3301', '865', '0'), +('4', '1', '7', '4833', '846', '0'), +('4', '1', '7', '4411', '694', '0'), +('4', '1', '7', '4893', '476', '0'), +('4', '1', '7', '71303', '377', '0'), +('4', '1', '9', '1541', '1637', '0'), +('4', '1', '9', '12189', '1013', '0'), +('4', '1', '9', '4834', '992', '0'), +('4', '1', '9', '13280', '505', '0'), +('4', '1', '15', '14707', '1050', '0'), +('4', '1', '15', '10366', '827', '0'), +('4', '1', '15', '30360', '700', '0'), +('4', '1', '15', '14679', '610', '0'), +('4', '1', '20', '11601', '6989', '0'), +('4', '1', '20', '1365', '4200', '0'), +('4', '1', '20', '2916', '3731', '0'), +('4', '1', '20', '2471', '3248', '0'), +('4', '1', '12', '11624', '1051', '0'), +('4', '1', '12', '20655', '1048', '0'), +('4', '1', '12', '4895', '995', '0'), +('4', '1', '12', '2923', '848', '0'), +('4', '1', '18', '4412', '694', '0'), +('4', '1', '18', '4896', '562', '0'), +('4', '1', '18', '4836', '561', '0'), +('4', '1', '18', '3191', '460', '0'), +('4', '1', '19', '4837', '1163', '0'), +('4', '1', '19', '4897', '710', '0'), +('4', '1', '19', '68239', '695', '0'), +('4', '1', '19', '3312', '338', '0'), +('4', '1', '13', '27732', '29193', '0'), +('4', '1', '13', '11663', '23580', '0'), +('4', '1', '13', '7257', '23041', '0'), +('4', '1', '13', '6692', '21631', '0'), +('4', '1', '14', '27732', '29193', '0'), +('4', '1', '14', '7257', '23041', '0'), +('4', '1', '14', '6692', '21631', '0'), +('4', '1', '14', '20679', '19800', '0'), +('4', '1', '11', '11696', '51098', '0'), +('4', '1', '11', '8325', '42360', '0'), +('4', '1', '11', '8408', '40970', '0'), +('4', '1', '11', '8402', '40395', '0'), +('4', '2', '22', '8567', '0', '0'), +('4', '2', '22', '10323', '0', '0'), +('4', '2', '22', '66166', '0', '0'), +('4', '2', '22', '10664', '0', '0'), +('4', '2', '1', '30361', '1290', '0'), +('4', '2', '1', '14701', '624', '0'), +('4', '2', '1', '14702', '600', '0'), +('4', '2', '1', '14568', '487', '0'), +('4', '2', '2', '30363', '1450', '0'), +('4', '2', '2', '10142', '1345', '0'), +('4', '2', '2', '4341', '1323', '0'), +('4', '2', '2', '3040', '1112', '0'), +('4', '2', '3', '14705', '990', '0'), +('4', '2', '3', '14706', '990', '0'), +('4', '2', '3', '14695', '440', '0'), +('4', '2', '3', '2282', '336', '0'), +('4', '2', '5', '30362', '1340', '0'), +('4', '2', '5', '14703', '1100', '0'), +('4', '2', '5', '14700', '636', '0'), +('4', '2', '5', '10147', '630', '0'), +('4', '2', '8', '11621', '8407', '0'), +('4', '2', '8', '11551', '1656', '0'), +('4', '2', '8', '11603', '1643', '0'), +('4', '2', '8', '3403', '1219', '0'), +('4', '2', '6', '1557', '5371', '0'), +('4', '2', '6', '2714', '1308', '0'), +('4', '2', '6', '3309', '554', '0'), +('4', '2', '6', '4165', '423', '0'), +('4', '2', '17', '11623', '2062', '0'), +('4', '2', '17', '4832', '1522', '0'), +('4', '2', '17', '4892', '1389', '0'), +('4', '2', '17', '3301', '865', '0'), +('4', '2', '7', '4833', '846', '0'), +('4', '2', '7', '4411', '694', '0'), +('4', '2', '7', '4893', '476', '0'), +('4', '2', '7', '71303', '381', '0'), +('4', '2', '9', '1541', '1649', '0'), +('4', '2', '9', '12189', '1013', '0'), +('4', '2', '9', '4834', '992', '0'), +('4', '2', '9', '13280', '505', '0'), +('4', '2', '15', '14707', '1050', '0'), +('4', '2', '15', '10366', '827', '0'), +('4', '2', '15', '30360', '700', '0'), +('4', '2', '15', '14679', '610', '0'), +('4', '2', '20', '11601', '6993', '0'), +('4', '2', '20', '1365', '4200', '0'), +('4', '2', '20', '2916', '3737', '0'), +('4', '2', '20', '2471', '3248', '0'), +('4', '2', '12', '11624', '1054', '0'), +('4', '2', '12', '20655', '1051', '0'), +('4', '2', '12', '4895', '995', '0'), +('4', '2', '12', '2923', '848', '0'), +('4', '2', '18', '4412', '694', '0'), +('4', '2', '18', '4896', '568', '0'), +('4', '2', '18', '4836', '563', '0'), +('4', '2', '18', '3191', '460', '0'), +('4', '2', '19', '4837', '1169', '0'), +('4', '2', '19', '4897', '712', '0'), +('4', '2', '19', '68239', '698', '0'), +('4', '2', '19', '3312', '338', '0'), +('4', '2', '13', '27732', '29203', '0'), +('4', '2', '13', '11663', '23580', '0'), +('4', '2', '13', '7257', '23041', '0'), +('4', '2', '13', '6692', '21631', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '2', '14', '27732', '29203', '0'), +('4', '2', '14', '7257', '23041', '0'), +('4', '2', '14', '6692', '21631', '0'), +('4', '2', '14', '20679', '19800', '0'), +('4', '2', '11', '11696', '51098', '0'), +('4', '2', '11', '8325', '42360', '0'), +('4', '2', '11', '8408', '40970', '0'), +('4', '2', '11', '8402', '40395', '0'), +('4', '3', '22', '8567', '0', '0'), +('4', '3', '22', '10323', '0', '0'), +('4', '3', '22', '66166', '0', '0'), +('4', '3', '22', '10664', '0', '0'), +('4', '3', '1', '30361', '1290', '0'), +('4', '3', '1', '14701', '624', '0'), +('4', '3', '1', '14702', '600', '0'), +('4', '3', '1', '14568', '496', '0'), +('4', '3', '2', '30363', '1450', '0'), +('4', '3', '2', '10142', '1345', '0'), +('4', '3', '2', '4341', '1323', '0'), +('4', '3', '2', '3040', '1112', '0'), +('4', '3', '3', '14706', '990', '0'), +('4', '3', '3', '14705', '990', '0'), +('4', '3', '3', '14695', '448', '0'), +('4', '3', '3', '2282', '336', '0'), +('4', '3', '5', '30362', '1340', '0'), +('4', '3', '5', '14703', '1100', '0'), +('4', '3', '5', '14700', '636', '0'), +('4', '3', '5', '10147', '630', '0'), +('4', '3', '8', '11621', '8407', '0'), +('4', '3', '8', '11551', '1656', '0'), +('4', '3', '8', '11603', '1653', '0'), +('4', '3', '8', '3403', '1219', '0'), +('4', '3', '6', '1557', '5371', '0'), +('4', '3', '6', '2714', '1318', '0'), +('4', '3', '6', '3309', '554', '0'), +('4', '3', '6', '4165', '423', '0'), +('4', '3', '17', '11623', '2062', '0'), +('4', '3', '17', '4832', '1528', '0'), +('4', '3', '17', '4892', '1405', '0'), +('4', '3', '17', '3301', '865', '0'), +('4', '3', '7', '4833', '846', '0'), +('4', '3', '7', '4411', '694', '0'), +('4', '3', '7', '4893', '476', '0'), +('4', '3', '7', '71303', '385', '0'), +('4', '3', '9', '1541', '1661', '0'), +('4', '3', '9', '12189', '1013', '0'), +('4', '3', '9', '4834', '992', '0'), +('4', '3', '9', '13280', '505', '0'), +('4', '3', '15', '14707', '1050', '0'), +('4', '3', '15', '10366', '827', '0'), +('4', '3', '15', '30360', '700', '0'), +('4', '3', '15', '14679', '610', '0'), +('4', '3', '20', '11601', '6997', '0'), +('4', '3', '20', '1365', '4200', '0'), +('4', '3', '20', '2916', '3743', '0'), +('4', '3', '20', '2471', '3248', '0'), +('4', '3', '12', '11624', '1057', '0'), +('4', '3', '12', '20655', '1054', '0'), +('4', '3', '12', '4895', '995', '0'), +('4', '3', '12', '2923', '848', '0'), +('4', '3', '18', '4412', '694', '0'), +('4', '3', '18', '4896', '574', '0'), +('4', '3', '18', '4836', '565', '0'), +('4', '3', '18', '3191', '460', '0'), +('4', '3', '19', '4837', '1175', '0'), +('4', '3', '19', '4897', '714', '0'), +('4', '3', '19', '68239', '702', '0'), +('4', '3', '19', '3312', '338', '0'), +('4', '3', '13', '27732', '29212', '0'), +('4', '3', '13', '11663', '23580', '0'), +('4', '3', '13', '7257', '23041', '0'), +('4', '3', '13', '6692', '21631', '0'), +('4', '3', '14', '27732', '29212', '0'), +('4', '3', '14', '7257', '23041', '0'), +('4', '3', '14', '6692', '21631', '0'), +('4', '3', '14', '20679', '19800', '0'), +('4', '3', '11', '11696', '51098', '0'), +('4', '3', '11', '8325', '42360', '0'), +('4', '3', '11', '8408', '40970', '0'), +('4', '3', '11', '8402', '40395', '0'), +('4', '4', '22', '8567', '0', '0'), +('4', '4', '22', '10323', '0', '0'), +('4', '4', '22', '66166', '0', '0'), +('4', '4', '22', '10664', '0', '0'), +('4', '4', '1', '30361', '1290', '0'), +('4', '4', '1', '14701', '624', '0'), +('4', '4', '1', '14702', '600', '0'), +('4', '4', '1', '14568', '506', '0'), +('4', '4', '2', '30363', '1450', '0'), +('4', '4', '2', '10142', '1345', '0'), +('4', '4', '2', '4341', '1323', '0'), +('4', '4', '2', '3040', '1112', '0'), +('4', '4', '3', '14706', '990', '0'), +('4', '4', '3', '14705', '990', '0'), +('4', '4', '3', '14695', '457', '0'), +('4', '4', '3', '2282', '336', '0'), +('4', '4', '5', '30362', '1340', '0'), +('4', '4', '5', '14703', '1100', '0'), +('4', '4', '5', '14700', '636', '0'), +('4', '4', '5', '10147', '630', '0'), +('4', '4', '8', '11621', '8407', '0'), +('4', '4', '8', '11603', '1664', '0'), +('4', '4', '8', '11551', '1656', '0'), +('4', '4', '8', '3403', '1219', '0'), +('4', '4', '6', '1557', '5371', '0'), +('4', '4', '6', '2714', '1327', '0'), +('4', '4', '6', '3309', '554', '0'), +('4', '4', '6', '4165', '423', '0'), +('4', '4', '17', '11623', '2062', '0'), +('4', '4', '17', '4832', '1534', '0'), +('4', '4', '17', '4892', '1420', '0'), +('4', '4', '17', '3301', '865', '0'), +('4', '4', '7', '4833', '846', '0'), +('4', '4', '7', '4411', '694', '0'), +('4', '4', '7', '4893', '476', '0'), +('4', '4', '7', '71303', '388', '0'), +('4', '4', '9', '1541', '1673', '0'), +('4', '4', '9', '12189', '1013', '0'), +('4', '4', '9', '4834', '992', '0'), +('4', '4', '9', '13280', '505', '0'), +('4', '4', '15', '14707', '1050', '0'), +('4', '4', '15', '10366', '827', '0'), +('4', '4', '15', '30360', '700', '0'), +('4', '4', '15', '14679', '610', '0'), +('4', '4', '20', '11601', '7002', '0'), +('4', '4', '20', '1365', '4200', '0'), +('4', '4', '20', '2916', '3749', '0'), +('4', '4', '20', '2471', '3248', '0'), +('4', '4', '12', '11624', '1060', '0'), +('4', '4', '12', '20655', '1057', '0'), +('4', '4', '12', '4895', '995', '0'), +('4', '4', '12', '2923', '848', '0'), +('4', '4', '18', '4412', '694', '0'), +('4', '4', '18', '4896', '580', '0'), +('4', '4', '18', '4836', '567', '0'), +('4', '4', '18', '3191', '460', '0'), +('4', '4', '19', '4837', '1181', '0'), +('4', '4', '19', '4897', '716', '0'), +('4', '4', '19', '68239', '706', '0'), +('4', '4', '19', '3312', '338', '0'), +('4', '4', '13', '27732', '29222', '0'), +('4', '4', '13', '11663', '23580', '0'), +('4', '4', '13', '7257', '23041', '0'), +('4', '4', '13', '6692', '21631', '0'), +('4', '4', '14', '27732', '29222', '0'), +('4', '4', '14', '7257', '23041', '0'), +('4', '4', '14', '6692', '21631', '0'), +('4', '4', '14', '20679', '19800', '0'), +('4', '4', '11', '11696', '51098', '0'), +('4', '4', '11', '8325', '42360', '0'), +('4', '4', '11', '8408', '40970', '0'), +('4', '4', '11', '8402', '40395', '0'), +('4', '5', '22', '8567', '0', '0'), +('4', '5', '22', '10323', '0', '0'), +('4', '5', '22', '66166', '0', '0'), +('4', '5', '22', '10664', '0', '0'), +('4', '5', '1', '30361', '1290', '0'), +('4', '5', '1', '14701', '624', '0'), +('4', '5', '1', '14702', '600', '0'), +('4', '5', '1', '14568', '516', '0'), +('4', '5', '2', '30363', '1450', '0'), +('4', '5', '2', '10142', '1345', '0'), +('4', '5', '2', '4341', '1323', '0'), +('4', '5', '2', '3040', '1112', '0'), +('4', '5', '3', '14706', '990', '0'), +('4', '5', '3', '14705', '990', '0'), +('4', '5', '3', '14695', '465', '0'), +('4', '5', '3', '2282', '336', '0'), +('4', '5', '5', '30362', '1340', '0'), +('4', '5', '5', '14703', '1100', '0'), +('4', '5', '5', '14700', '636', '0'), +('4', '5', '5', '10147', '630', '0'), +('4', '5', '8', '11621', '8407', '0'), +('4', '5', '8', '11603', '1675', '0'), +('4', '5', '8', '11551', '1656', '0'), +('4', '5', '8', '3403', '1219', '0'), +('4', '5', '6', '1557', '5371', '0'), +('4', '5', '6', '2714', '1337', '0'), +('4', '5', '6', '3309', '554', '0'), +('4', '5', '6', '4165', '423', '0'), +('4', '5', '17', '11623', '2062', '0'), +('4', '5', '17', '4832', '1540', '0'), +('4', '5', '17', '4892', '1436', '0'), +('4', '5', '17', '3301', '865', '0'), +('4', '5', '7', '4833', '846', '0'), +('4', '5', '7', '4411', '694', '0'), +('4', '5', '7', '4893', '476', '0'), +('4', '5', '7', '71303', '392', '0'), +('4', '5', '9', '1541', '1685', '0'), +('4', '5', '9', '12189', '1013', '0'), +('4', '5', '9', '4834', '992', '0'), +('4', '5', '9', '13280', '505', '0'), +('4', '5', '15', '14707', '1050', '0'), +('4', '5', '15', '10366', '827', '0'), +('4', '5', '15', '30360', '700', '0'), +('4', '5', '15', '14679', '610', '0'), +('4', '5', '20', '11601', '7005', '0'), +('4', '5', '20', '1365', '4200', '0'), +('4', '5', '20', '2916', '3755', '0'), +('4', '5', '20', '2471', '3248', '0'), +('4', '5', '12', '11624', '1062', '0'), +('4', '5', '12', '20655', '1060', '0'), +('4', '5', '12', '4895', '995', '0'), +('4', '5', '12', '2923', '848', '0'), +('4', '5', '18', '4412', '694', '0'), +('4', '5', '18', '4896', '587', '0'), +('4', '5', '18', '4836', '569', '0'), +('4', '5', '18', '3191', '460', '0'), +('4', '5', '19', '4837', '1187', '0'), +('4', '5', '19', '4897', '718', '0'), +('4', '5', '19', '68239', '709', '0'), +('4', '5', '19', '3312', '338', '0'), +('4', '5', '13', '27732', '29232', '0'), +('4', '5', '13', '11663', '23580', '0'), +('4', '5', '13', '7257', '23041', '0'), +('4', '5', '13', '6692', '21631', '0'), +('4', '5', '14', '27732', '29232', '0'), +('4', '5', '14', '7257', '23041', '0'), +('4', '5', '14', '6692', '21631', '0'), +('4', '5', '14', '20679', '19800', '0'), +('4', '5', '11', '11696', '51098', '0'), +('4', '5', '11', '8325', '42360', '0'), +('4', '5', '11', '8408', '40970', '0'), +('4', '5', '11', '8402', '40395', '0'), +('4', '6', '22', '8567', '0', '0'), +('4', '6', '22', '10323', '0', '0'), +('4', '6', '22', '66166', '0', '0'), +('4', '6', '22', '10664', '0', '0'), +('4', '6', '1', '30361', '1290', '0'), +('4', '6', '1', '14701', '624', '0'), +('4', '6', '1', '14702', '600', '0'), +('4', '6', '1', '14568', '525', '0'), +('4', '6', '2', '30363', '1450', '0'), +('4', '6', '2', '10142', '1345', '0'), +('4', '6', '2', '4341', '1323', '0'), +('4', '6', '2', '3040', '1112', '0'), +('4', '6', '3', '14706', '990', '0'), +('4', '6', '3', '14705', '990', '0'), +('4', '6', '3', '14695', '474', '0'), +('4', '6', '3', '2282', '336', '0'), +('4', '6', '5', '30362', '1340', '0'), +('4', '6', '5', '14703', '1100', '0'), +('4', '6', '5', '14567', '636', '0'), +('4', '6', '5', '14700', '636', '0'), +('4', '6', '8', '11621', '8407', '0'), +('4', '6', '8', '11603', '1686', '0'), +('4', '6', '8', '11551', '1656', '0'), +('4', '6', '8', '3403', '1219', '0'), +('4', '6', '6', '1557', '5371', '0'), +('4', '6', '6', '2714', '1347', '0'), +('4', '6', '6', '3309', '554', '0'), +('4', '6', '6', '4165', '423', '0'), +('4', '6', '17', '11623', '2062', '0'), +('4', '6', '17', '4832', '1546', '0'), +('4', '6', '17', '4892', '1452', '0'), +('4', '6', '17', '3301', '865', '0'), +('4', '6', '7', '4833', '846', '0'), +('4', '6', '7', '4411', '694', '0'), +('4', '6', '7', '4893', '476', '0'), +('4', '6', '7', '71303', '395', '0'), +('4', '6', '9', '1541', '1697', '0'), +('4', '6', '9', '12189', '1013', '0'), +('4', '6', '9', '4834', '992', '0'), +('4', '6', '9', '13280', '505', '0'), +('4', '6', '15', '14707', '1050', '0'), +('4', '6', '15', '10366', '827', '0'), +('4', '6', '15', '30360', '700', '0'), +('4', '6', '15', '14679', '610', '0'), +('4', '6', '20', '11601', '7009', '0'), +('4', '6', '20', '1365', '4200', '0'), +('4', '6', '20', '2916', '3761', '0'), +('4', '6', '20', '2471', '3248', '0'), +('4', '6', '12', '11624', '1065', '0'), +('4', '6', '12', '20655', '1064', '0'), +('4', '6', '12', '4895', '995', '0'), +('4', '6', '12', '2923', '848', '0'), +('4', '6', '18', '4412', '694', '0'), +('4', '6', '18', '4896', '593', '0'), +('4', '6', '18', '4836', '571', '0'), +('4', '6', '18', '3191', '460', '0'), +('4', '6', '19', '4837', '1193', '0'), +('4', '6', '19', '4897', '720', '0'), +('4', '6', '19', '68239', '713', '0'), +('4', '6', '19', '3312', '338', '0'), +('4', '6', '13', '27732', '29241', '0'), +('4', '6', '13', '11663', '23580', '0'), +('4', '6', '13', '7257', '23041', '0'), +('4', '6', '13', '6692', '21631', '0'), +('4', '6', '14', '27732', '29241', '0'), +('4', '6', '14', '7257', '23041', '0'), +('4', '6', '14', '6692', '21631', '0'), +('4', '6', '14', '20679', '19800', '0'), +('4', '6', '11', '11696', '51098', '0'), +('4', '6', '11', '8325', '42360', '0'), +('4', '6', '11', '8408', '40970', '0'), +('4', '6', '11', '8402', '40395', '0'), +('4', '7', '22', '8567', '0', '0'), +('4', '7', '22', '10323', '0', '0'), +('4', '7', '22', '66166', '0', '0'), +('4', '7', '22', '10664', '0', '0'), +('4', '7', '1', '30361', '1290', '0'), +('4', '7', '1', '14701', '624', '0'), +('4', '7', '1', '14702', '600', '0'), +('4', '7', '1', '14568', '535', '0'), +('4', '7', '2', '30363', '1450', '0'), +('4', '7', '2', '10142', '1345', '0'), +('4', '7', '2', '4341', '1323', '0'), +('4', '7', '2', '3040', '1112', '0'), +('4', '7', '3', '14706', '990', '0'), +('4', '7', '3', '14705', '990', '0'), +('4', '7', '3', '14695', '482', '0'), +('4', '7', '3', '2282', '336', '0'), +('4', '7', '5', '30362', '1340', '0'), +('4', '7', '5', '14703', '1100', '0'), +('4', '7', '5', '14567', '644', '0'), +('4', '7', '5', '14700', '636', '0'), +('4', '7', '8', '11621', '8407', '0'), +('4', '7', '8', '11603', '1697', '0'), +('4', '7', '8', '11551', '1656', '0'), +('4', '7', '8', '3403', '1219', '0'), +('4', '7', '6', '1557', '5371', '0'), +('4', '7', '6', '2714', '1356', '0'), +('4', '7', '6', '3309', '554', '0'), +('4', '7', '6', '4165', '423', '0'), +('4', '7', '17', '11623', '2062', '0'), +('4', '7', '17', '4832', '1553', '0'), +('4', '7', '17', '4892', '1468', '0'), +('4', '7', '17', '3301', '865', '0'), +('4', '7', '7', '4833', '846', '0'), +('4', '7', '7', '4411', '694', '0'), +('4', '7', '7', '4893', '476', '0'), +('4', '7', '7', '71303', '399', '0'), +('4', '7', '9', '1541', '1709', '0'), +('4', '7', '9', '12189', '1013', '0'), +('4', '7', '9', '4834', '992', '0'), +('4', '7', '9', '13280', '505', '0'), +('4', '7', '15', '14707', '1050', '0'), +('4', '7', '15', '10366', '827', '0'), +('4', '7', '15', '30360', '700', '0'), +('4', '7', '15', '14679', '610', '0'), +('4', '7', '20', '11601', '7014', '0'), +('4', '7', '20', '1365', '4200', '0'), +('4', '7', '20', '2916', '3767', '0'), +('4', '7', '20', '2471', '3248', '0'), +('4', '7', '12', '11624', '1068', '0'), +('4', '7', '12', '20655', '1067', '0'), +('4', '7', '12', '4895', '995', '0'), +('4', '7', '12', '2923', '848', '0'), +('4', '7', '18', '4412', '694', '0'), +('4', '7', '18', '4896', '599', '0'), +('4', '7', '18', '4836', '573', '0'), +('4', '7', '18', '3191', '460', '0'), +('4', '7', '19', '4837', '1199', '0'), +('4', '7', '19', '4897', '722', '0'), +('4', '7', '19', '68239', '717', '0'), +('4', '7', '19', '3312', '338', '0'), +('4', '7', '13', '27732', '29251', '0'), +('4', '7', '13', '11663', '23580', '0'), +('4', '7', '13', '7257', '23041', '0'), +('4', '7', '13', '6692', '21631', '0'), +('4', '7', '14', '27732', '29251', '0'), +('4', '7', '14', '7257', '23041', '0'), +('4', '7', '14', '6692', '21631', '0'), +('4', '7', '14', '20679', '19800', '0'), +('4', '7', '11', '11696', '51098', '0'), +('4', '7', '11', '8325', '42360', '0'), +('4', '7', '11', '8408', '40970', '0'), +('4', '7', '11', '8402', '40395', '0'), +('4', '8', '22', '8567', '0', '0'), +('4', '8', '22', '10323', '0', '0'), +('4', '8', '22', '66166', '0', '0'), +('4', '8', '22', '10664', '0', '0'), +('4', '8', '1', '30361', '1290', '0'), +('4', '8', '1', '14701', '624', '0'), +('4', '8', '1', '14702', '600', '0'), +('4', '8', '1', '14568', '545', '0'), +('4', '8', '2', '30363', '1450', '0'), +('4', '8', '2', '10142', '1345', '0'), +('4', '8', '2', '4341', '1323', '0'), +('4', '8', '2', '3040', '1112', '0'), +('4', '8', '3', '14706', '990', '0'), +('4', '8', '3', '14705', '990', '0'), +('4', '8', '3', '14695', '490', '0'), +('4', '8', '3', '2282', '336', '0'), +('4', '8', '5', '30362', '1340', '0'), +('4', '8', '5', '14703', '1100', '0'), +('4', '8', '5', '14567', '651', '0'), +('4', '8', '5', '14700', '636', '0'), +('4', '8', '8', '11621', '8407', '0'), +('4', '8', '8', '11603', '1708', '0'), +('4', '8', '8', '11551', '1656', '0'), +('4', '8', '8', '3403', '1219', '0'), +('4', '8', '6', '1557', '5371', '0'), +('4', '8', '6', '2714', '1366', '0'), +('4', '8', '6', '3309', '554', '0'), +('4', '8', '6', '4165', '423', '0'), +('4', '8', '17', '11623', '2062', '0'), +('4', '8', '17', '4832', '1559', '0'), +('4', '8', '17', '4892', '1483', '0'), +('4', '8', '17', '3301', '865', '0'), +('4', '8', '7', '4833', '846', '0'), +('4', '8', '7', '4411', '694', '0'), +('4', '8', '7', '4893', '476', '0'), +('4', '8', '7', '71303', '403', '0'), +('4', '8', '9', '1541', '1721', '0'), +('4', '8', '9', '12189', '1013', '0'), +('4', '8', '9', '4834', '992', '0'), +('4', '8', '9', '13280', '505', '0'), +('4', '8', '15', '14707', '1050', '0'), +('4', '8', '15', '10366', '827', '0'), +('4', '8', '15', '30360', '700', '0'), +('4', '8', '15', '14679', '610', '0'), +('4', '8', '20', '11601', '7018', '0'), +('4', '8', '20', '1365', '4200', '0'), +('4', '8', '20', '2916', '3773', '0'), +('4', '8', '20', '2471', '3248', '0'), +('4', '8', '12', '11624', '1071', '0'), +('4', '8', '12', '20655', '1070', '0'), +('4', '8', '12', '4895', '995', '0'), +('4', '8', '12', '2923', '848', '0'), +('4', '8', '18', '4412', '694', '0'), +('4', '8', '18', '4896', '605', '0'), +('4', '8', '18', '4836', '575', '0'), +('4', '8', '18', '3191', '460', '0'), +('4', '8', '19', '4837', '1205', '0'), +('4', '8', '19', '4897', '725', '0'), +('4', '8', '19', '68239', '720', '0'), +('4', '8', '19', '3312', '338', '0'), +('4', '8', '13', '27732', '29261', '0'), +('4', '8', '13', '11663', '23580', '0'), +('4', '8', '13', '7257', '23041', '0'), +('4', '8', '13', '6692', '21631', '0'), +('4', '8', '14', '27732', '29261', '0'), +('4', '8', '14', '7257', '23041', '0'), +('4', '8', '14', '6692', '21631', '0'), +('4', '8', '14', '20679', '19800', '0'), +('4', '8', '11', '11696', '51098', '0'), +('4', '8', '11', '8325', '42360', '0'), +('4', '8', '11', '8408', '40970', '0'), +('4', '8', '11', '8402', '40395', '0'), +('4', '9', '22', '8567', '0', '0'), +('4', '9', '22', '10323', '0', '0'), +('4', '9', '22', '66166', '0', '0'), +('4', '9', '22', '10664', '0', '0'), +('4', '9', '1', '30361', '1290', '0'), +('4', '9', '1', '14701', '624', '0'), +('4', '9', '1', '14702', '600', '0'), +('4', '9', '1', '14568', '554', '0'), +('4', '9', '2', '30363', '1450', '0'), +('4', '9', '2', '10142', '1345', '0'), +('4', '9', '2', '4341', '1323', '0'), +('4', '9', '2', '3040', '1112', '0'), +('4', '9', '3', '14706', '990', '0'), +('4', '9', '3', '14705', '990', '0'), +('4', '9', '3', '14695', '499', '0'), +('4', '9', '3', '2282', '336', '0'), +('4', '9', '5', '30362', '1340', '0'), +('4', '9', '5', '14703', '1100', '0'), +('4', '9', '5', '14567', '659', '0'), +('4', '9', '5', '14700', '636', '0'), +('4', '9', '8', '11621', '8407', '0'), +('4', '9', '8', '11603', '1719', '0'), +('4', '9', '8', '11551', '1656', '0'), +('4', '9', '8', '27731', '1227', '0'), +('4', '9', '6', '1557', '5371', '0'), +('4', '9', '6', '2714', '1376', '0'), +('4', '9', '6', '3309', '554', '0'), +('4', '9', '6', '4165', '423', '0'), +('4', '9', '17', '11623', '2062', '0'), +('4', '9', '17', '4832', '1564', '0'), +('4', '9', '17', '4892', '1499', '0'), +('4', '9', '17', '3301', '865', '0'), +('4', '9', '7', '4833', '846', '0'), +('4', '9', '7', '4411', '694', '0'), +('4', '9', '7', '4893', '476', '0'), +('4', '9', '7', '71303', '406', '0'), +('4', '9', '9', '1541', '1734', '0'), +('4', '9', '9', '12189', '1013', '0'), +('4', '9', '9', '4834', '992', '0'), +('4', '9', '9', '13280', '505', '0'), +('4', '9', '15', '14707', '1050', '0'), +('4', '9', '15', '10366', '827', '0'), +('4', '9', '15', '30360', '700', '0'), +('4', '9', '15', '14679', '610', '0'), +('4', '9', '20', '11601', '7021', '0'), +('4', '9', '20', '1365', '4200', '0'), +('4', '9', '20', '2916', '3779', '0'), +('4', '9', '20', '2471', '3248', '0'), +('4', '9', '12', '11624', '1074', '0'), +('4', '9', '12', '20655', '1073', '0'), +('4', '9', '12', '4895', '995', '0'), +('4', '9', '12', '2923', '848', '0'), +('4', '9', '18', '4412', '694', '0'), +('4', '9', '18', '4896', '611', '0'), +('4', '9', '18', '4836', '577', '0'), +('4', '9', '18', '3191', '460', '0'), +('4', '9', '19', '4837', '1211', '0'), +('4', '9', '19', '4897', '726', '0'), +('4', '9', '19', '68239', '724', '0'), +('4', '9', '19', '3312', '338', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '9', '13', '27732', '29270', '0'), +('4', '9', '13', '11663', '23580', '0'), +('4', '9', '13', '7257', '23041', '0'), +('4', '9', '13', '6692', '21631', '0'), +('4', '9', '14', '27732', '29270', '0'), +('4', '9', '14', '7257', '23041', '0'), +('4', '9', '14', '6692', '21631', '0'), +('4', '9', '14', '20679', '19800', '0'), +('4', '9', '11', '11696', '51098', '0'), +('4', '9', '11', '8325', '42360', '0'), +('4', '9', '11', '8408', '40970', '0'), +('4', '9', '11', '8402', '40395', '0'), +('4', '10', '22', '8567', '0', '0'), +('4', '10', '22', '10323', '0', '0'), +('4', '10', '22', '66166', '0', '0'), +('4', '10', '22', '10664', '0', '0'), +('4', '10', '1', '30361', '1290', '0'), +('4', '10', '1', '14701', '624', '0'), +('4', '10', '1', '14702', '600', '0'), +('4', '10', '1', '14568', '564', '0'), +('4', '10', '2', '30363', '1450', '0'), +('4', '10', '2', '10142', '1345', '0'), +('4', '10', '2', '4341', '1323', '0'), +('4', '10', '2', '3040', '1112', '0'), +('4', '10', '3', '14706', '990', '0'), +('4', '10', '3', '14705', '990', '0'), +('4', '10', '3', '14695', '507', '0'), +('4', '10', '3', '2282', '336', '0'), +('4', '10', '5', '30362', '1340', '0'), +('4', '10', '5', '14703', '1100', '0'), +('4', '10', '5', '14567', '667', '0'), +('4', '10', '5', '14700', '636', '0'), +('4', '10', '8', '11621', '8407', '0'), +('4', '10', '8', '11603', '1730', '0'), +('4', '10', '8', '11551', '1656', '0'), +('4', '10', '8', '27731', '1236', '0'), +('4', '10', '6', '1557', '5371', '0'), +('4', '10', '6', '2714', '1385', '0'), +('4', '10', '6', '3309', '554', '0'), +('4', '10', '6', '4165', '423', '0'), +('4', '10', '17', '11623', '2062', '0'), +('4', '10', '17', '4832', '1571', '0'), +('4', '10', '17', '4892', '1515', '0'), +('4', '10', '17', '3301', '865', '0'), +('4', '10', '7', '4833', '846', '0'), +('4', '10', '7', '4411', '694', '0'), +('4', '10', '7', '4893', '476', '0'), +('4', '10', '7', '71303', '410', '0'), +('4', '10', '9', '1541', '1746', '0'), +('4', '10', '9', '12189', '1013', '0'), +('4', '10', '9', '4834', '992', '0'), +('4', '10', '9', '13280', '505', '0'), +('4', '10', '15', '14707', '1050', '0'), +('4', '10', '15', '10366', '827', '0'), +('4', '10', '15', '30360', '700', '0'), +('4', '10', '15', '14679', '610', '0'), +('4', '10', '20', '11601', '7026', '0'), +('4', '10', '20', '1365', '4200', '0'), +('4', '10', '20', '2916', '3785', '0'), +('4', '10', '20', '2471', '3248', '0'), +('4', '10', '12', '20655', '1077', '0'), +('4', '10', '12', '11624', '1076', '0'), +('4', '10', '12', '4895', '995', '0'), +('4', '10', '12', '2923', '848', '0'), +('4', '10', '18', '4412', '694', '0'), +('4', '10', '18', '4896', '617', '0'), +('4', '10', '18', '4836', '579', '0'), +('4', '10', '18', '3191', '460', '0'), +('4', '10', '19', '4837', '1217', '0'), +('4', '10', '19', '4897', '729', '0'), +('4', '10', '19', '68239', '727', '0'), +('4', '10', '19', '3312', '338', '0'), +('4', '10', '13', '27732', '29280', '0'), +('4', '10', '13', '11663', '23580', '0'), +('4', '10', '13', '7257', '23041', '0'), +('4', '10', '13', '6692', '21631', '0'), +('4', '10', '14', '27732', '29280', '0'), +('4', '10', '14', '7257', '23041', '0'), +('4', '10', '14', '6692', '21631', '0'), +('4', '10', '14', '20679', '19800', '0'), +('4', '10', '11', '11696', '51098', '0'), +('4', '10', '11', '8325', '42360', '0'), +('4', '10', '11', '8408', '40970', '0'), +('4', '10', '11', '8402', '40395', '0'), +('4', '11', '22', '8567', '0', '0'), +('4', '11', '22', '10323', '0', '0'), +('4', '11', '22', '66166', '0', '0'), +('4', '11', '22', '10664', '0', '0'), +('4', '11', '1', '30361', '1290', '0'), +('4', '11', '1', '14701', '624', '0'), +('4', '11', '1', '14702', '600', '0'), +('4', '11', '1', '14568', '574', '0'), +('4', '11', '2', '30363', '1450', '0'), +('4', '11', '2', '10142', '1345', '0'), +('4', '11', '2', '4341', '1323', '0'), +('4', '11', '2', '3040', '1112', '0'), +('4', '11', '3', '14706', '990', '0'), +('4', '11', '3', '14705', '990', '0'), +('4', '11', '3', '14695', '516', '0'), +('4', '11', '3', '2282', '336', '0'), +('4', '11', '5', '30362', '1340', '0'), +('4', '11', '5', '14703', '1100', '0'), +('4', '11', '5', '14567', '674', '0'), +('4', '11', '5', '14700', '636', '0'), +('4', '11', '8', '11621', '8407', '0'), +('4', '11', '8', '11603', '1740', '0'), +('4', '11', '8', '11551', '1656', '0'), +('4', '11', '8', '27731', '1244', '0'), +('4', '11', '6', '1557', '5371', '0'), +('4', '11', '6', '2714', '1395', '0'), +('4', '11', '6', '3309', '554', '0'), +('4', '11', '6', '4165', '423', '0'), +('4', '11', '17', '11623', '2062', '0'), +('4', '11', '17', '4832', '1577', '0'), +('4', '11', '17', '4892', '1530', '0'), +('4', '11', '17', '3301', '865', '0'), +('4', '11', '7', '4833', '846', '0'), +('4', '11', '7', '4411', '694', '0'), +('4', '11', '7', '4893', '476', '0'), +('4', '11', '7', '71303', '414', '0'), +('4', '11', '9', '1541', '1758', '0'), +('4', '11', '9', '12189', '1013', '0'), +('4', '11', '9', '4834', '992', '0'), +('4', '11', '9', '13280', '505', '0'), +('4', '11', '15', '14707', '1050', '0'), +('4', '11', '15', '10366', '827', '0'), +('4', '11', '15', '30360', '700', '0'), +('4', '11', '15', '14679', '610', '0'), +('4', '11', '20', '11601', '7030', '0'), +('4', '11', '20', '1365', '4200', '0'), +('4', '11', '20', '2916', '3791', '0'), +('4', '11', '20', '2471', '3248', '0'), +('4', '11', '12', '20655', '1080', '0'), +('4', '11', '12', '11624', '1079', '0'), +('4', '11', '12', '4895', '995', '0'), +('4', '11', '12', '2923', '848', '0'), +('4', '11', '18', '4412', '694', '0'), +('4', '11', '18', '4896', '623', '0'), +('4', '11', '18', '4836', '581', '0'), +('4', '11', '18', '3191', '460', '0'), +('4', '11', '19', '4837', '1223', '0'), +('4', '11', '19', '4897', '731', '0'), +('4', '11', '19', '68239', '731', '0'), +('4', '11', '19', '3312', '338', '0'), +('4', '11', '13', '27732', '29290', '0'), +('4', '11', '13', '11663', '23580', '0'), +('4', '11', '13', '7257', '23041', '0'), +('4', '11', '13', '6692', '21631', '0'), +('4', '11', '14', '27732', '29290', '0'), +('4', '11', '14', '7257', '23041', '0'), +('4', '11', '14', '6692', '21631', '0'), +('4', '11', '14', '20679', '19800', '0'), +('4', '11', '11', '11696', '51098', '0'), +('4', '11', '11', '8325', '42360', '0'), +('4', '11', '11', '8408', '40970', '0'), +('4', '11', '11', '8402', '40395', '0'), +('4', '12', '22', '8567', '0', '0'), +('4', '12', '22', '10323', '0', '0'), +('4', '12', '22', '66166', '0', '0'), +('4', '12', '22', '10664', '0', '0'), +('4', '12', '1', '30361', '1290', '0'), +('4', '12', '1', '14701', '624', '0'), +('4', '12', '1', '14702', '600', '0'), +('4', '12', '1', '14568', '583', '0'), +('4', '12', '2', '30363', '1450', '0'), +('4', '12', '2', '10142', '1345', '0'), +('4', '12', '2', '4341', '1323', '0'), +('4', '12', '2', '3040', '1112', '0'), +('4', '12', '3', '14706', '990', '0'), +('4', '12', '3', '14705', '990', '0'), +('4', '12', '3', '14695', '524', '0'), +('4', '12', '3', '2282', '336', '0'), +('4', '12', '5', '30362', '1340', '0'), +('4', '12', '5', '14703', '1100', '0'), +('4', '12', '5', '14567', '682', '0'), +('4', '12', '5', '14700', '636', '0'), +('4', '12', '8', '11621', '8407', '0'), +('4', '12', '8', '11603', '1751', '0'), +('4', '12', '8', '11551', '1656', '0'), +('4', '12', '8', '27731', '1252', '0'), +('4', '12', '6', '1557', '5371', '0'), +('4', '12', '6', '2714', '1405', '0'), +('4', '12', '6', '3309', '554', '0'), +('4', '12', '6', '4165', '423', '0'), +('4', '12', '17', '11623', '2062', '0'), +('4', '12', '17', '4832', '1582', '0'), +('4', '12', '17', '4892', '1546', '0'), +('4', '12', '17', '3301', '865', '0'), +('4', '12', '7', '4833', '846', '0'), +('4', '12', '7', '4411', '694', '0'), +('4', '12', '7', '4893', '476', '0'), +('4', '12', '7', '71303', '417', '0'), +('4', '12', '9', '1541', '1770', '0'), +('4', '12', '9', '12189', '1013', '0'), +('4', '12', '9', '4834', '992', '0'), +('4', '12', '9', '13280', '505', '0'), +('4', '12', '15', '14707', '1050', '0'), +('4', '12', '15', '10366', '827', '0'), +('4', '12', '15', '30360', '700', '0'), +('4', '12', '15', '14679', '610', '0'), +('4', '12', '20', '11601', '7034', '0'), +('4', '12', '20', '1365', '4200', '0'), +('4', '12', '20', '2916', '3797', '0'), +('4', '12', '20', '2471', '3248', '0'), +('4', '12', '12', '20655', '1083', '0'), +('4', '12', '12', '11624', '1082', '0'), +('4', '12', '12', '4895', '995', '0'), +('4', '12', '12', '2923', '848', '0'), +('4', '12', '18', '4412', '694', '0'), +('4', '12', '18', '4896', '629', '0'), +('4', '12', '18', '4836', '583', '0'), +('4', '12', '18', '3191', '460', '0'), +('4', '12', '19', '4837', '1229', '0'), +('4', '12', '19', '68239', '735', '0'), +('4', '12', '19', '4897', '732', '0'), +('4', '12', '19', '3312', '338', '0'), +('4', '12', '13', '27732', '29299', '0'), +('4', '12', '13', '11663', '23580', '0'), +('4', '12', '13', '7257', '23041', '0'), +('4', '12', '13', '6692', '21631', '0'), +('4', '12', '14', '27732', '29299', '0'), +('4', '12', '14', '7257', '23041', '0'), +('4', '12', '14', '6692', '21631', '0'), +('4', '12', '14', '20679', '19800', '0'), +('4', '12', '11', '11696', '51098', '0'), +('4', '12', '11', '8325', '42360', '0'), +('4', '12', '11', '8408', '40970', '0'), +('4', '12', '11', '8402', '40395', '0'), +('4', '13', '22', '8567', '0', '0'), +('4', '13', '22', '10323', '0', '0'), +('4', '13', '22', '66166', '0', '0'), +('4', '13', '22', '10664', '0', '0'), +('4', '13', '1', '30361', '1290', '0'), +('4', '13', '1', '14701', '624', '0'), +('4', '13', '1', '14702', '600', '0'), +('4', '13', '1', '14568', '593', '0'), +('4', '13', '2', '30363', '1450', '0'), +('4', '13', '2', '10142', '1345', '0'), +('4', '13', '2', '4341', '1323', '0'), +('4', '13', '2', '3040', '1112', '0'), +('4', '13', '3', '14706', '990', '0'), +('4', '13', '3', '14705', '990', '0'), +('4', '13', '3', '14695', '533', '0'), +('4', '13', '3', '2282', '336', '0'), +('4', '13', '5', '30362', '1340', '0'), +('4', '13', '5', '14703', '1100', '0'), +('4', '13', '5', '14567', '689', '0'), +('4', '13', '5', '14700', '636', '0'), +('4', '13', '8', '11621', '8407', '0'), +('4', '13', '8', '11603', '1762', '0'), +('4', '13', '8', '11551', '1656', '0'), +('4', '13', '8', '27731', '1261', '0'), +('4', '13', '6', '1557', '5371', '0'), +('4', '13', '6', '2714', '1414', '0'), +('4', '13', '6', '3309', '554', '0'), +('4', '13', '6', '4165', '423', '0'), +('4', '13', '17', '11623', '2062', '0'), +('4', '13', '17', '4832', '1589', '0'), +('4', '13', '17', '4892', '1562', '0'), +('4', '13', '17', '3301', '865', '0'), +('4', '13', '7', '4833', '846', '0'), +('4', '13', '7', '4411', '694', '0'), +('4', '13', '7', '4893', '476', '0'), +('4', '13', '7', '71303', '421', '0'), +('4', '13', '9', '1541', '1782', '0'), +('4', '13', '9', '12189', '1013', '0'), +('4', '13', '9', '4834', '992', '0'), +('4', '13', '9', '13280', '505', '0'), +('4', '13', '15', '14707', '1050', '0'), +('4', '13', '15', '10366', '827', '0'), +('4', '13', '15', '30360', '700', '0'), +('4', '13', '15', '14679', '610', '0'), +('4', '13', '20', '11601', '7038', '0'), +('4', '13', '20', '1365', '4200', '0'), +('4', '13', '20', '2916', '3803', '0'), +('4', '13', '20', '2471', '3248', '0'), +('4', '13', '12', '20655', '1086', '0'), +('4', '13', '12', '11624', '1085', '0'), +('4', '13', '12', '4895', '995', '0'), +('4', '13', '12', '2923', '848', '0'), +('4', '13', '18', '4412', '694', '0'), +('4', '13', '18', '4896', '635', '0'), +('4', '13', '18', '4836', '585', '0'), +('4', '13', '18', '3191', '460', '0'), +('4', '13', '19', '4837', '1235', '0'), +('4', '13', '19', '68239', '738', '0'), +('4', '13', '19', '4897', '735', '0'), +('4', '13', '19', '3312', '338', '0'), +('4', '13', '13', '27732', '29309', '0'), +('4', '13', '13', '11663', '23580', '0'), +('4', '13', '13', '7257', '23041', '0'), +('4', '13', '13', '6692', '21631', '0'), +('4', '13', '14', '27732', '29309', '0'), +('4', '13', '14', '7257', '23041', '0'), +('4', '13', '14', '6692', '21631', '0'), +('4', '13', '14', '20679', '19800', '0'), +('4', '13', '11', '11696', '51098', '0'), +('4', '13', '11', '8325', '42360', '0'), +('4', '13', '11', '8408', '40970', '0'), +('4', '13', '11', '8402', '40395', '0'), +('4', '14', '22', '8567', '0', '0'), +('4', '14', '22', '10323', '0', '0'), +('4', '14', '22', '66166', '0', '0'), +('4', '14', '22', '10664', '0', '0'), +('4', '14', '1', '30361', '1290', '0'), +('4', '14', '1', '14701', '624', '0'), +('4', '14', '1', '14568', '603', '0'), +('4', '14', '1', '14702', '600', '0'), +('4', '14', '2', '30363', '1450', '0'), +('4', '14', '2', '10142', '1345', '0'), +('4', '14', '2', '4341', '1323', '0'), +('4', '14', '2', '3040', '1112', '0'), +('4', '14', '3', '14706', '990', '0'), +('4', '14', '3', '14705', '990', '0'), +('4', '14', '3', '14695', '541', '0'), +('4', '14', '3', '2282', '336', '0'), +('4', '14', '5', '30362', '1340', '0'), +('4', '14', '5', '14703', '1100', '0'), +('4', '14', '5', '14567', '697', '0'), +('4', '14', '5', '14700', '636', '0'), +('4', '14', '8', '11621', '8407', '0'), +('4', '14', '8', '11603', '1773', '0'), +('4', '14', '8', '11551', '1656', '0'), +('4', '14', '8', '27731', '1269', '0'), +('4', '14', '6', '1557', '5371', '0'), +('4', '14', '6', '2714', '1424', '0'), +('4', '14', '6', '3309', '554', '0'), +('4', '14', '6', '4165', '423', '0'), +('4', '14', '17', '11623', '2062', '0'), +('4', '14', '17', '4832', '1595', '0'), +('4', '14', '17', '4892', '1578', '0'), +('4', '14', '17', '3301', '865', '0'), +('4', '14', '7', '4833', '846', '0'), +('4', '14', '7', '4411', '694', '0'), +('4', '14', '7', '4893', '476', '0'), +('4', '14', '7', '71303', '424', '0'), +('4', '14', '9', '1541', '1794', '0'), +('4', '14', '9', '12189', '1013', '0'), +('4', '14', '9', '4834', '992', '0'), +('4', '14', '9', '13280', '505', '0'), +('4', '14', '15', '14707', '1050', '0'), +('4', '14', '15', '10366', '827', '0'), +('4', '14', '15', '30360', '700', '0'), +('4', '14', '15', '14679', '610', '0'), +('4', '14', '20', '11601', '7042', '0'), +('4', '14', '20', '1365', '4200', '0'), +('4', '14', '20', '2916', '3809', '0'), +('4', '14', '20', '2471', '3248', '0'), +('4', '14', '12', '20655', '1089', '0'), +('4', '14', '12', '11624', '1088', '0'), +('4', '14', '12', '4895', '995', '0'), +('4', '14', '12', '2923', '848', '0'), +('4', '14', '18', '4412', '694', '0'), +('4', '14', '18', '4896', '641', '0'), +('4', '14', '18', '4836', '587', '0'), +('4', '14', '18', '3191', '460', '0'), +('4', '14', '19', '4837', '1241', '0'), +('4', '14', '19', '68239', '742', '0'), +('4', '14', '19', '4897', '737', '0'), +('4', '14', '19', '3312', '338', '0'), +('4', '14', '13', '27732', '29318', '0'), +('4', '14', '13', '11663', '23580', '0'), +('4', '14', '13', '7257', '23041', '0'), +('4', '14', '13', '6692', '21631', '0'), +('4', '14', '14', '27732', '29318', '0'), +('4', '14', '14', '7257', '23041', '0'), +('4', '14', '14', '6692', '21631', '0'), +('4', '14', '14', '20679', '19800', '0'), +('4', '14', '11', '11696', '51098', '0'), +('4', '14', '11', '8325', '42360', '0'), +('4', '14', '11', '8408', '40970', '0'), +('4', '14', '11', '8402', '40395', '0'), +('4', '15', '22', '8567', '0', '0'), +('4', '15', '22', '10323', '0', '0'), +('4', '15', '22', '66166', '0', '0'), +('4', '15', '22', '10664', '0', '0'), +('4', '15', '1', '30361', '1290', '0'), +('4', '15', '1', '14701', '624', '0'), +('4', '15', '1', '14568', '612', '0'), +('4', '15', '1', '14702', '600', '0'), +('4', '15', '2', '30363', '1450', '0'), +('4', '15', '2', '10142', '1345', '0'), +('4', '15', '2', '4341', '1323', '0'), +('4', '15', '2', '3040', '1112', '0'), +('4', '15', '3', '14706', '990', '0'), +('4', '15', '3', '14705', '990', '0'), +('4', '15', '3', '14695', '550', '0'), +('4', '15', '3', '2282', '336', '0'), +('4', '15', '5', '30362', '1340', '0'), +('4', '15', '5', '14703', '1100', '0'), +('4', '15', '5', '14567', '705', '0'), +('4', '15', '5', '14700', '636', '0'), +('4', '15', '8', '11621', '8407', '0'), +('4', '15', '8', '11603', '1784', '0'), +('4', '15', '8', '11551', '1656', '0'), +('4', '15', '8', '27731', '1278', '0'), +('4', '15', '6', '1557', '5371', '0'), +('4', '15', '6', '2714', '1434', '0'), +('4', '15', '6', '3309', '554', '0'), +('4', '15', '6', '4165', '423', '0'), +('4', '15', '17', '11623', '2062', '0'), +('4', '15', '17', '4832', '1602', '0'), +('4', '15', '17', '4892', '1593', '0'), +('4', '15', '17', '3301', '865', '0'), +('4', '15', '7', '4833', '846', '0'), +('4', '15', '7', '4411', '694', '0'), +('4', '15', '7', '4893', '476', '0'), +('4', '15', '7', '71303', '428', '0'), +('4', '15', '9', '1541', '1806', '0'), +('4', '15', '9', '12189', '1013', '0'), +('4', '15', '9', '4834', '992', '0'), +('4', '15', '9', '13280', '505', '0'), +('4', '15', '15', '14707', '1050', '0'), +('4', '15', '15', '10366', '827', '0'), +('4', '15', '15', '30360', '700', '0'), +('4', '15', '15', '14679', '610', '0'), +('4', '15', '20', '11601', '7046', '0'), +('4', '15', '20', '1365', '4200', '0'), +('4', '15', '20', '2916', '3815', '0'), +('4', '15', '20', '2471', '3248', '0'), +('4', '15', '12', '20655', '1093', '0'), +('4', '15', '12', '11624', '1091', '0'), +('4', '15', '12', '4895', '995', '0'), +('4', '15', '12', '2923', '848', '0'), +('4', '15', '18', '4412', '694', '0'), +('4', '15', '18', '4896', '647', '0'), +('4', '15', '18', '4836', '589', '0'), +('4', '15', '18', '3191', '460', '0'), +('4', '15', '19', '4837', '1247', '0'), +('4', '15', '19', '68239', '746', '0'), +('4', '15', '19', '4897', '739', '0'), +('4', '15', '19', '3312', '338', '0'), +('4', '15', '13', '27732', '29328', '0'), +('4', '15', '13', '11663', '23580', '0'), +('4', '15', '13', '7257', '23041', '0'), +('4', '15', '13', '6692', '21631', '0'), +('4', '15', '14', '27732', '29328', '0'), +('4', '15', '14', '7257', '23041', '0'), +('4', '15', '14', '6692', '21631', '0'), +('4', '15', '14', '20679', '19800', '0'), +('4', '15', '11', '11696', '51098', '0'), +('4', '15', '11', '8325', '42360', '0'), +('4', '15', '11', '8408', '40970', '0'), +('4', '15', '11', '8402', '40395', '0'), +('4', '16', '22', '8567', '0', '0'), +('4', '16', '22', '10323', '0', '0'), +('4', '16', '22', '66166', '0', '0'), +('4', '16', '22', '10664', '0', '0'), +('4', '16', '1', '30361', '1290', '0'), +('4', '16', '1', '14701', '624', '0'), +('4', '16', '1', '14568', '622', '0'), +('4', '16', '1', '14702', '600', '0'), +('4', '16', '2', '30363', '1450', '0'), +('4', '16', '2', '10142', '1345', '0'), +('4', '16', '2', '4341', '1323', '0'), +('4', '16', '2', '3040', '1112', '0'), +('4', '16', '3', '14706', '990', '0'), +('4', '16', '3', '14705', '990', '0'), +('4', '16', '3', '14695', '558', '0'), +('4', '16', '3', '2282', '336', '0'), +('4', '16', '5', '30362', '1340', '0'), +('4', '16', '5', '14703', '1100', '0'), +('4', '16', '5', '14567', '713', '0'), +('4', '16', '5', '14700', '636', '0'), +('4', '16', '8', '11621', '8407', '0'), +('4', '16', '8', '11603', '1795', '0'), +('4', '16', '8', '11551', '1656', '0'), +('4', '16', '8', '27731', '1286', '0'), +('4', '16', '6', '1557', '5371', '0'), +('4', '16', '6', '2714', '1443', '0'), +('4', '16', '6', '3309', '554', '0'), +('4', '16', '6', '4165', '423', '0'), +('4', '16', '17', '11623', '2062', '0'), +('4', '16', '17', '4892', '1609', '0'), +('4', '16', '17', '4832', '1608', '0'), +('4', '16', '17', '3301', '865', '0'), +('4', '16', '7', '4833', '846', '0'), +('4', '16', '7', '4411', '694', '0'), +('4', '16', '7', '4893', '476', '0'), +('4', '16', '7', '71303', '432', '0'), +('4', '16', '9', '1541', '1818', '0'), +('4', '16', '9', '12189', '1013', '0'), +('4', '16', '9', '4834', '992', '0'), +('4', '16', '9', '13280', '505', '0'), +('4', '16', '15', '14707', '1050', '0'), +('4', '16', '15', '10366', '827', '0'), +('4', '16', '15', '30360', '700', '0'), +('4', '16', '15', '14679', '610', '0'), +('4', '16', '20', '11601', '7050', '0'), +('4', '16', '20', '1365', '4200', '0'), +('4', '16', '20', '2916', '3821', '0'), +('4', '16', '20', '2471', '3248', '0'), +('4', '16', '12', '20655', '1096', '0'), +('4', '16', '12', '11624', '1094', '0'), +('4', '16', '12', '4895', '995', '0'), +('4', '16', '12', '2923', '848', '0'), +('4', '16', '18', '4412', '694', '0'), +('4', '16', '18', '4896', '653', '0'), +('4', '16', '18', '4836', '591', '0'), +('4', '16', '18', '3191', '460', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '16', '19', '4837', '1253', '0'), +('4', '16', '19', '68239', '749', '0'), +('4', '16', '19', '4897', '741', '0'), +('4', '16', '19', '3312', '338', '0'), +('4', '16', '13', '27732', '29338', '0'), +('4', '16', '13', '11663', '23580', '0'), +('4', '16', '13', '7257', '23041', '0'), +('4', '16', '13', '6692', '21631', '0'), +('4', '16', '14', '27732', '29338', '0'), +('4', '16', '14', '7257', '23041', '0'), +('4', '16', '14', '6692', '21631', '0'), +('4', '16', '14', '20679', '19800', '0'), +('4', '16', '11', '11696', '51098', '0'), +('4', '16', '11', '8325', '42360', '0'), +('4', '16', '11', '8408', '40970', '0'), +('4', '16', '11', '8402', '40395', '0'), +('4', '17', '22', '8567', '0', '0'), +('4', '17', '22', '10323', '0', '0'), +('4', '17', '22', '66166', '0', '0'), +('4', '17', '22', '10664', '0', '0'), +('4', '17', '1', '30361', '1290', '0'), +('4', '17', '1', '14568', '632', '0'), +('4', '17', '1', '14701', '624', '0'), +('4', '17', '1', '14702', '600', '0'), +('4', '17', '2', '30363', '1450', '0'), +('4', '17', '2', '10142', '1345', '0'), +('4', '17', '2', '4341', '1323', '0'), +('4', '17', '2', '3040', '1112', '0'), +('4', '17', '3', '14706', '990', '0'), +('4', '17', '3', '14705', '990', '0'), +('4', '17', '3', '14695', '567', '0'), +('4', '17', '3', '2282', '336', '0'), +('4', '17', '5', '30362', '1340', '0'), +('4', '17', '5', '14703', '1100', '0'), +('4', '17', '5', '14567', '720', '0'), +('4', '17', '5', '14700', '636', '0'), +('4', '17', '8', '11621', '8407', '0'), +('4', '17', '8', '11603', '1806', '0'), +('4', '17', '8', '11551', '1656', '0'), +('4', '17', '8', '27731', '1295', '0'), +('4', '17', '6', '1557', '5371', '0'), +('4', '17', '6', '2714', '1453', '0'), +('4', '17', '6', '3309', '554', '0'), +('4', '17', '6', '4165', '423', '0'), +('4', '17', '17', '11623', '2062', '0'), +('4', '17', '17', '4892', '1625', '0'), +('4', '17', '17', '4832', '1613', '0'), +('4', '17', '17', '3301', '865', '0'), +('4', '17', '7', '4833', '846', '0'), +('4', '17', '7', '4411', '694', '0'), +('4', '17', '7', '4893', '476', '0'), +('4', '17', '7', '71303', '435', '0'), +('4', '17', '9', '1541', '1830', '0'), +('4', '17', '9', '12189', '1013', '0'), +('4', '17', '9', '4834', '992', '0'), +('4', '17', '9', '13280', '505', '0'), +('4', '17', '15', '14707', '1050', '0'), +('4', '17', '15', '10366', '827', '0'), +('4', '17', '15', '30360', '700', '0'), +('4', '17', '15', '14679', '610', '0'), +('4', '17', '20', '11601', '7054', '0'), +('4', '17', '20', '1365', '4200', '0'), +('4', '17', '20', '2916', '3827', '0'), +('4', '17', '20', '2471', '3248', '0'), +('4', '17', '12', '20655', '1099', '0'), +('4', '17', '12', '11624', '1096', '0'), +('4', '17', '12', '4895', '995', '0'), +('4', '17', '12', '2923', '848', '0'), +('4', '17', '18', '4412', '694', '0'), +('4', '17', '18', '4896', '659', '0'), +('4', '17', '18', '4836', '593', '0'), +('4', '17', '18', '3191', '460', '0'), +('4', '17', '19', '4837', '1259', '0'), +('4', '17', '19', '68239', '753', '0'), +('4', '17', '19', '4897', '743', '0'), +('4', '17', '19', '3312', '338', '0'), +('4', '17', '13', '27732', '29347', '0'), +('4', '17', '13', '11663', '23580', '0'), +('4', '17', '13', '7257', '23041', '0'), +('4', '17', '13', '6692', '21631', '0'), +('4', '17', '14', '27732', '29347', '0'), +('4', '17', '14', '7257', '23041', '0'), +('4', '17', '14', '6692', '21631', '0'), +('4', '17', '14', '20679', '19800', '0'), +('4', '17', '11', '11696', '51098', '0'), +('4', '17', '11', '8325', '42360', '0'), +('4', '17', '11', '8408', '40970', '0'), +('4', '17', '11', '8402', '40395', '0'), +('4', '18', '22', '8567', '0', '0'), +('4', '18', '22', '10323', '0', '0'), +('4', '18', '22', '66166', '0', '0'), +('4', '18', '22', '10664', '0', '0'), +('4', '18', '1', '30361', '1290', '0'), +('4', '18', '1', '14568', '641', '0'), +('4', '18', '1', '14701', '624', '0'), +('4', '18', '1', '14702', '600', '0'), +('4', '18', '2', '30363', '1450', '0'), +('4', '18', '2', '10142', '1345', '0'), +('4', '18', '2', '4341', '1323', '0'), +('4', '18', '2', '3040', '1112', '0'), +('4', '18', '3', '14706', '990', '0'), +('4', '18', '3', '14705', '990', '0'), +('4', '18', '3', '14695', '575', '0'), +('4', '18', '3', '2282', '336', '0'), +('4', '18', '5', '30362', '1340', '0'), +('4', '18', '5', '14703', '1100', '0'), +('4', '18', '5', '14567', '728', '0'), +('4', '18', '5', '14700', '636', '0'), +('4', '18', '8', '11621', '8407', '0'), +('4', '18', '8', '11603', '1816', '0'), +('4', '18', '8', '11551', '1656', '0'), +('4', '18', '8', '27731', '1303', '0'), +('4', '18', '6', '1557', '5371', '0'), +('4', '18', '6', '2714', '1463', '0'), +('4', '18', '6', '3309', '554', '0'), +('4', '18', '6', '4165', '423', '0'), +('4', '18', '17', '11623', '2062', '0'), +('4', '18', '17', '4892', '1640', '0'), +('4', '18', '17', '4832', '1620', '0'), +('4', '18', '17', '3301', '865', '0'), +('4', '18', '7', '4833', '846', '0'), +('4', '18', '7', '4411', '694', '0'), +('4', '18', '7', '4893', '476', '0'), +('4', '18', '7', '71303', '439', '0'), +('4', '18', '9', '1541', '1842', '0'), +('4', '18', '9', '12189', '1013', '0'), +('4', '18', '9', '4834', '992', '0'), +('4', '18', '9', '13280', '505', '0'), +('4', '18', '15', '14707', '1050', '0'), +('4', '18', '15', '10366', '827', '0'), +('4', '18', '15', '30360', '700', '0'), +('4', '18', '15', '14679', '610', '0'), +('4', '18', '20', '11601', '7058', '0'), +('4', '18', '20', '1365', '4200', '0'), +('4', '18', '20', '2916', '3833', '0'), +('4', '18', '20', '2471', '3248', '0'), +('4', '18', '12', '20655', '1102', '0'), +('4', '18', '12', '11624', '1099', '0'), +('4', '18', '12', '4895', '995', '0'), +('4', '18', '12', '2923', '848', '0'), +('4', '18', '18', '4412', '694', '0'), +('4', '18', '18', '4896', '665', '0'), +('4', '18', '18', '4836', '595', '0'), +('4', '18', '18', '3191', '460', '0'), +('4', '18', '19', '4837', '1265', '0'), +('4', '18', '19', '68239', '756', '0'), +('4', '18', '19', '4897', '745', '0'), +('4', '18', '19', '3312', '338', '0'), +('4', '18', '13', '27732', '29357', '0'), +('4', '18', '13', '11663', '23580', '0'), +('4', '18', '13', '7257', '23041', '0'), +('4', '18', '13', '6692', '21631', '0'), +('4', '18', '14', '27732', '29357', '0'), +('4', '18', '14', '7257', '23041', '0'), +('4', '18', '14', '6692', '21631', '0'), +('4', '18', '14', '20679', '19800', '0'), +('4', '18', '11', '11696', '51098', '0'), +('4', '18', '11', '8325', '42360', '0'), +('4', '18', '11', '8408', '40970', '0'), +('4', '18', '11', '8402', '40395', '0'), +('4', '19', '22', '8567', '0', '0'), +('4', '19', '22', '10323', '0', '0'), +('4', '19', '22', '66166', '0', '0'), +('4', '19', '22', '10664', '0', '0'), +('4', '19', '1', '30361', '1290', '0'), +('4', '19', '1', '14568', '651', '0'), +('4', '19', '1', '14701', '624', '0'), +('4', '19', '1', '14702', '600', '0'), +('4', '19', '2', '30363', '1450', '0'), +('4', '19', '2', '10142', '1345', '0'), +('4', '19', '2', '4341', '1323', '0'), +('4', '19', '2', '3040', '1112', '0'), +('4', '19', '3', '14706', '990', '0'), +('4', '19', '3', '14705', '990', '0'), +('4', '19', '3', '14695', '583', '0'), +('4', '19', '3', '11052', '344', '0'), +('4', '19', '5', '30362', '1340', '0'), +('4', '19', '5', '14703', '1100', '0'), +('4', '19', '5', '14567', '736', '0'), +('4', '19', '5', '14700', '636', '0'), +('4', '19', '8', '11621', '8407', '0'), +('4', '19', '8', '11603', '1827', '0'), +('4', '19', '8', '11551', '1656', '0'), +('4', '19', '8', '27731', '1312', '0'), +('4', '19', '6', '1557', '5371', '0'), +('4', '19', '6', '2714', '1472', '0'), +('4', '19', '6', '3309', '554', '0'), +('4', '19', '6', '4165', '423', '0'), +('4', '19', '17', '11623', '2062', '0'), +('4', '19', '17', '4892', '1656', '0'), +('4', '19', '17', '4832', '1626', '0'), +('4', '19', '17', '3301', '865', '0'), +('4', '19', '7', '4833', '846', '0'), +('4', '19', '7', '4411', '694', '0'), +('4', '19', '7', '4893', '476', '0'), +('4', '19', '7', '71303', '443', '0'), +('4', '19', '9', '1541', '1854', '0'), +('4', '19', '9', '12189', '1013', '0'), +('4', '19', '9', '4834', '992', '0'), +('4', '19', '9', '13280', '505', '0'), +('4', '19', '15', '14707', '1050', '0'), +('4', '19', '15', '10366', '827', '0'), +('4', '19', '15', '30360', '700', '0'), +('4', '19', '15', '14679', '610', '0'), +('4', '19', '20', '11601', '7063', '0'), +('4', '19', '20', '1365', '4200', '0'), +('4', '19', '20', '2916', '3839', '0'), +('4', '19', '20', '2471', '3248', '0'), +('4', '19', '12', '20655', '1106', '0'), +('4', '19', '12', '11624', '1102', '0'), +('4', '19', '12', '4895', '995', '0'), +('4', '19', '12', '2923', '848', '0'), +('4', '19', '18', '4412', '694', '0'), +('4', '19', '18', '4896', '671', '0'), +('4', '19', '18', '4836', '597', '0'), +('4', '19', '18', '3191', '460', '0'), +('4', '19', '19', '4837', '1271', '0'), +('4', '19', '19', '68239', '760', '0'), +('4', '19', '19', '4897', '747', '0'), +('4', '19', '19', '3312', '338', '0'), +('4', '19', '13', '27732', '29367', '0'), +('4', '19', '13', '11663', '23580', '0'), +('4', '19', '13', '7257', '23041', '0'), +('4', '19', '13', '6692', '21631', '0'), +('4', '19', '14', '27732', '29367', '0'), +('4', '19', '14', '7257', '23041', '0'), +('4', '19', '14', '6692', '21631', '0'), +('4', '19', '14', '20679', '19800', '0'), +('4', '19', '11', '11696', '51098', '0'), +('4', '19', '11', '8325', '42360', '0'), +('4', '19', '11', '8408', '40970', '0'), +('4', '19', '11', '8402', '40395', '0'), +('4', '20', '22', '8567', '0', '0'), +('4', '20', '22', '10323', '0', '0'), +('4', '20', '22', '66166', '0', '0'), +('4', '20', '22', '10664', '0', '0'), +('4', '20', '1', '30361', '1290', '0'), +('4', '20', '1', '14568', '661', '0'), +('4', '20', '1', '14701', '624', '0'), +('4', '20', '1', '14702', '600', '0'), +('4', '20', '2', '30363', '1450', '0'), +('4', '20', '2', '10142', '1345', '0'), +('4', '20', '2', '4341', '1323', '0'), +('4', '20', '2', '3040', '1112', '0'), +('4', '20', '3', '14706', '990', '0'), +('4', '20', '3', '14705', '990', '0'), +('4', '20', '3', '14695', '592', '0'), +('4', '20', '3', '11052', '362', '0'), +('4', '20', '5', '30362', '1340', '0'), +('4', '20', '5', '14703', '1100', '0'), +('4', '20', '5', '14567', '743', '0'), +('4', '20', '5', '14700', '636', '0'), +('4', '20', '8', '11621', '8407', '0'), +('4', '20', '8', '11603', '1838', '0'), +('4', '20', '8', '11551', '1656', '0'), +('4', '20', '8', '27731', '1320', '0'), +('4', '20', '6', '1557', '5371', '0'), +('4', '20', '6', '2714', '1482', '0'), +('4', '20', '6', '3309', '554', '0'), +('4', '20', '6', '4165', '423', '0'), +('4', '20', '17', '11623', '2062', '0'), +('4', '20', '17', '4892', '1672', '0'), +('4', '20', '17', '4832', '1632', '0'), +('4', '20', '17', '3301', '865', '0'), +('4', '20', '7', '4833', '846', '0'), +('4', '20', '7', '4411', '694', '0'), +('4', '20', '7', '4893', '476', '0'), +('4', '20', '7', '71303', '446', '0'), +('4', '20', '9', '1541', '1866', '0'), +('4', '20', '9', '12189', '1013', '0'), +('4', '20', '9', '4834', '992', '0'), +('4', '20', '9', '13280', '505', '0'), +('4', '20', '15', '14707', '1050', '0'), +('4', '20', '15', '10366', '827', '0'), +('4', '20', '15', '30360', '700', '0'), +('4', '20', '15', '14679', '610', '0'), +('4', '20', '20', '11601', '7067', '0'), +('4', '20', '20', '1365', '4200', '0'), +('4', '20', '20', '2916', '3845', '0'), +('4', '20', '20', '2471', '3248', '0'), +('4', '20', '12', '20655', '1109', '0'), +('4', '20', '12', '11624', '1105', '0'), +('4', '20', '12', '4895', '995', '0'), +('4', '20', '12', '2923', '848', '0'), +('4', '20', '18', '4412', '694', '0'), +('4', '20', '18', '4896', '677', '0'), +('4', '20', '18', '4836', '599', '0'), +('4', '20', '18', '3191', '460', '0'), +('4', '20', '19', '4837', '1278', '0'), +('4', '20', '19', '68239', '764', '0'), +('4', '20', '19', '4897', '749', '0'), +('4', '20', '19', '3312', '338', '0'), +('4', '20', '13', '27732', '30516', '0'), +('4', '20', '13', '6952', '26325', '0'), +('4', '20', '13', '11663', '24540', '0'), +('4', '20', '13', '7257', '23941', '0'), +('4', '20', '14', '27732', '30516', '0'), +('4', '20', '14', '6952', '26325', '0'), +('4', '20', '14', '7257', '23941', '0'), +('4', '20', '14', '6692', '22411', '0'), +('4', '20', '11', '11696', '53078', '0'), +('4', '20', '11', '8325', '44040', '0'), +('4', '20', '11', '8408', '42590', '0'), +('4', '20', '11', '8402', '41955', '0'), +('4', '21', '22', '8567', '0', '0'), +('4', '21', '22', '10323', '0', '0'), +('4', '21', '22', '66166', '0', '0'), +('4', '21', '22', '10664', '0', '0'), +('4', '21', '1', '30361', '1290', '0'), +('4', '21', '1', '14568', '670', '0'), +('4', '21', '1', '14701', '624', '0'), +('4', '21', '1', '14702', '600', '0'), +('4', '21', '2', '30363', '1450', '0'), +('4', '21', '2', '10142', '1345', '0'), +('4', '21', '2', '4341', '1323', '0'), +('4', '21', '2', '3040', '1112', '0'), +('4', '21', '3', '14706', '990', '0'), +('4', '21', '3', '14705', '990', '0'), +('4', '21', '3', '14695', '600', '0'), +('4', '21', '3', '11052', '381', '0'), +('4', '21', '5', '30362', '1340', '0'), +('4', '21', '5', '14703', '1100', '0'), +('4', '21', '5', '14567', '751', '0'), +('4', '21', '5', '14700', '636', '0'), +('4', '21', '8', '11621', '8407', '0'), +('4', '21', '8', '11603', '1849', '0'), +('4', '21', '8', '11551', '1656', '0'), +('4', '21', '8', '27731', '1329', '0'), +('4', '21', '6', '1557', '5371', '0'), +('4', '21', '6', '2714', '1492', '0'), +('4', '21', '6', '3309', '554', '0'), +('4', '21', '6', '4165', '423', '0'), +('4', '21', '17', '11623', '2062', '0'), +('4', '21', '17', '4892', '1687', '0'), +('4', '21', '17', '4832', '1638', '0'), +('4', '21', '17', '3301', '865', '0'), +('4', '21', '7', '4833', '846', '0'), +('4', '21', '7', '4411', '694', '0'), +('4', '21', '7', '4893', '476', '0'), +('4', '21', '7', '71303', '450', '0'), +('4', '21', '9', '1541', '1878', '0'), +('4', '21', '9', '12189', '1013', '0'), +('4', '21', '9', '4834', '992', '0'), +('4', '21', '9', '13280', '505', '0'), +('4', '21', '15', '14707', '1050', '0'), +('4', '21', '15', '10366', '827', '0'), +('4', '21', '15', '30360', '700', '0'), +('4', '21', '15', '14679', '610', '0'), +('4', '21', '20', '11601', '7070', '0'), +('4', '21', '20', '1365', '4200', '0'), +('4', '21', '20', '2916', '3851', '0'), +('4', '21', '20', '2471', '3248', '0'), +('4', '21', '12', '20655', '1112', '0'), +('4', '21', '12', '11624', '1108', '0'), +('4', '21', '12', '4895', '995', '0'), +('4', '21', '12', '2923', '848', '0'), +('4', '21', '18', '4412', '694', '0'), +('4', '21', '18', '4896', '683', '0'), +('4', '21', '18', '4836', '601', '0'), +('4', '21', '18', '3191', '460', '0'), +('4', '21', '19', '4837', '1284', '0'), +('4', '21', '19', '68239', '767', '0'), +('4', '21', '19', '4897', '751', '0'), +('4', '21', '19', '3312', '338', '0'), +('4', '21', '13', '27732', '30826', '0'), +('4', '21', '13', '6952', '26445', '0'), +('4', '21', '13', '11663', '24840', '0'), +('4', '21', '13', '7257', '24241', '0'), +('4', '21', '14', '27732', '30826', '0'), +('4', '21', '14', '6952', '26445', '0'), +('4', '21', '14', '7257', '24241', '0'), +('4', '21', '14', '6692', '22651', '0'), +('4', '21', '11', '11696', '53678', '0'), +('4', '21', '11', '8325', '44520', '0'), +('4', '21', '11', '8408', '43070', '0'), +('4', '21', '11', '8402', '42435', '0'), +('4', '22', '22', '8567', '0', '0'), +('4', '22', '22', '10323', '0', '0'), +('4', '22', '22', '66166', '0', '0'), +('4', '22', '22', '10664', '0', '0'), +('4', '22', '1', '30361', '1290', '0'), +('4', '22', '1', '14568', '680', '0'), +('4', '22', '1', '14701', '624', '0'), +('4', '22', '1', '14702', '600', '0'), +('4', '22', '2', '30363', '1450', '0'), +('4', '22', '2', '10142', '1345', '0'), +('4', '22', '2', '4341', '1323', '0'), +('4', '22', '2', '3040', '1112', '0'), +('4', '22', '3', '14706', '990', '0'), +('4', '22', '3', '14705', '990', '0'), +('4', '22', '3', '14695', '609', '0'), +('4', '22', '3', '11052', '399', '0'), +('4', '22', '5', '30362', '1340', '0'), +('4', '22', '5', '14703', '1100', '0'), +('4', '22', '5', '14567', '759', '0'), +('4', '22', '5', '14700', '636', '0'), +('4', '22', '8', '11621', '8407', '0'), +('4', '22', '8', '11603', '1860', '0'), +('4', '22', '8', '11551', '1656', '0'), +('4', '22', '8', '27731', '1337', '0'), +('4', '22', '6', '1557', '5371', '0'), +('4', '22', '6', '2714', '1501', '0'), +('4', '22', '6', '3309', '554', '0'), +('4', '22', '6', '4165', '423', '0'), +('4', '22', '17', '11623', '2062', '0'), +('4', '22', '17', '4892', '1703', '0'), +('4', '22', '17', '4832', '1644', '0'), +('4', '22', '17', '3301', '865', '0'), +('4', '22', '7', '4833', '846', '0'), +('4', '22', '7', '4411', '694', '0'), +('4', '22', '7', '4893', '476', '0'), +('4', '22', '7', '71303', '453', '0'), +('4', '22', '9', '1541', '1891', '0'), +('4', '22', '9', '12189', '1013', '0'), +('4', '22', '9', '4834', '992', '0'), +('4', '22', '9', '13280', '505', '0'), +('4', '22', '15', '14707', '1050', '0'), +('4', '22', '15', '10366', '827', '0'), +('4', '22', '15', '30360', '700', '0'), +('4', '22', '15', '14679', '610', '0'), +('4', '22', '20', '11601', '7075', '0'), +('4', '22', '20', '1365', '4200', '0'), +('4', '22', '20', '2916', '3857', '0'), +('4', '22', '20', '2471', '3248', '0'), +('4', '22', '12', '20655', '1115', '0'), +('4', '22', '12', '11624', '1111', '0'), +('4', '22', '12', '4895', '995', '0'), +('4', '22', '12', '2923', '848', '0'), +('4', '22', '18', '4412', '694', '0'), +('4', '22', '18', '4896', '689', '0'), +('4', '22', '18', '4836', '603', '0'), +('4', '22', '18', '3191', '460', '0'), +('4', '22', '19', '4837', '1290', '0'), +('4', '22', '19', '68239', '771', '0'), +('4', '22', '19', '4897', '753', '0'), +('4', '22', '19', '3312', '338', '0'), +('4', '22', '13', '27732', '31196', '0'), +('4', '22', '13', '6952', '26625', '0'), +('4', '22', '13', '11663', '25080', '0'), +('4', '22', '13', '7257', '24541', '0'), +('4', '22', '14', '27732', '31196', '0'), +('4', '22', '14', '6952', '26625', '0'), +('4', '22', '14', '7257', '24541', '0'), +('4', '22', '14', '6692', '22891', '0'), +('4', '22', '11', '11696', '54278', '0'), +('4', '22', '11', '8325', '45060', '0'), +('4', '22', '11', '8408', '43550', '0'), +('4', '22', '11', '8402', '42915', '0'), +('4', '23', '22', '8567', '0', '0'), +('4', '23', '22', '10323', '0', '0'), +('4', '23', '22', '66166', '0', '0'), +('4', '23', '22', '10664', '0', '0'), +('4', '23', '1', '30361', '1290', '0'), +('4', '23', '1', '14568', '690', '0'), +('4', '23', '1', '14701', '624', '0'), +('4', '23', '1', '14702', '600', '0'), +('4', '23', '2', '30363', '1450', '0'), +('4', '23', '2', '10142', '1345', '0'), +('4', '23', '2', '4341', '1323', '0'), +('4', '23', '2', '3040', '1112', '0'), +('4', '23', '3', '14706', '990', '0'), +('4', '23', '3', '14705', '990', '0'), +('4', '23', '3', '14695', '617', '0'), +('4', '23', '3', '11052', '417', '0'), +('4', '23', '5', '30362', '1340', '0'), +('4', '23', '5', '14703', '1100', '0'), +('4', '23', '5', '14567', '766', '0'), +('4', '23', '5', '68291', '641', '0'), +('4', '23', '8', '11621', '8407', '0'), +('4', '23', '8', '11603', '1871', '0'), +('4', '23', '8', '11551', '1656', '0'), +('4', '23', '8', '27731', '1345', '0'), +('4', '23', '6', '1557', '5371', '0'), +('4', '23', '6', '2714', '1511', '0'), +('4', '23', '6', '3309', '554', '0'), +('4', '23', '6', '4165', '423', '0'), +('4', '23', '17', '11623', '2062', '0'), +('4', '23', '17', '4892', '1719', '0'), +('4', '23', '17', '4832', '1650', '0'), +('4', '23', '17', '3301', '865', '0'), +('4', '23', '7', '4833', '846', '0'), +('4', '23', '7', '4411', '694', '0'), +('4', '23', '7', '4893', '476', '0'), +('4', '23', '7', '71303', '457', '0'), +('4', '23', '9', '1541', '1903', '0'), +('4', '23', '9', '12189', '1013', '0'), +('4', '23', '9', '4834', '992', '0'), +('4', '23', '9', '13280', '505', '0'), +('4', '23', '15', '14707', '1050', '0'), +('4', '23', '15', '10366', '827', '0'), +('4', '23', '15', '30360', '700', '0'), +('4', '23', '15', '14679', '610', '0'), +('4', '23', '20', '11601', '7079', '0'), +('4', '23', '20', '1365', '4200', '0'), +('4', '23', '20', '2916', '3863', '0'), +('4', '23', '20', '2471', '3248', '0'), +('4', '23', '12', '20655', '1119', '0'), +('4', '23', '12', '11624', '1114', '0'), +('4', '23', '12', '4895', '995', '0'), +('4', '23', '12', '2923', '848', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '23', '18', '4896', '695', '0'), +('4', '23', '18', '4412', '694', '0'), +('4', '23', '18', '4836', '606', '0'), +('4', '23', '18', '3191', '460', '0'), +('4', '23', '19', '4837', '1296', '0'), +('4', '23', '19', '68239', '775', '0'), +('4', '23', '19', '4897', '755', '0'), +('4', '23', '19', '4407', '340', '0'), +('4', '23', '13', '27732', '31565', '0'), +('4', '23', '13', '6952', '26805', '0'), +('4', '23', '13', '11663', '25380', '0'), +('4', '23', '13', '7257', '24781', '0'), +('4', '23', '14', '27732', '31565', '0'), +('4', '23', '14', '6952', '26805', '0'), +('4', '23', '14', '7257', '24781', '0'), +('4', '23', '14', '6692', '23131', '0'), +('4', '23', '11', '11696', '54878', '0'), +('4', '23', '11', '8325', '45540', '0'), +('4', '23', '11', '8408', '44030', '0'), +('4', '23', '11', '8402', '43395', '0'), +('4', '24', '22', '8567', '0', '0'), +('4', '24', '22', '10323', '0', '0'), +('4', '24', '22', '66166', '0', '0'), +('4', '24', '22', '10664', '0', '0'), +('4', '24', '1', '30361', '1290', '0'), +('4', '24', '1', '14568', '699', '0'), +('4', '24', '1', '14701', '624', '0'), +('4', '24', '1', '14702', '600', '0'), +('4', '24', '2', '30363', '1450', '0'), +('4', '24', '2', '10142', '1345', '0'), +('4', '24', '2', '4341', '1323', '0'), +('4', '24', '2', '3040', '1112', '0'), +('4', '24', '3', '14706', '990', '0'), +('4', '24', '3', '14705', '990', '0'), +('4', '24', '3', '14695', '626', '0'), +('4', '24', '3', '11052', '435', '0'), +('4', '24', '5', '30362', '1340', '0'), +('4', '24', '5', '14703', '1100', '0'), +('4', '24', '5', '14567', '774', '0'), +('4', '24', '5', '68291', '674', '0'), +('4', '24', '8', '11621', '8407', '0'), +('4', '24', '8', '11603', '1882', '0'), +('4', '24', '8', '11551', '1656', '0'), +('4', '24', '8', '27731', '1354', '0'), +('4', '24', '6', '1557', '5371', '0'), +('4', '24', '6', '2714', '1520', '0'), +('4', '24', '6', '3309', '554', '0'), +('4', '24', '6', '4165', '423', '0'), +('4', '24', '17', '11623', '2062', '0'), +('4', '24', '17', '4892', '1735', '0'), +('4', '24', '17', '4832', '1657', '0'), +('4', '24', '17', '3301', '865', '0'), +('4', '24', '7', '4833', '846', '0'), +('4', '24', '7', '4411', '694', '0'), +('4', '24', '7', '4893', '476', '0'), +('4', '24', '7', '71303', '461', '0'), +('4', '24', '9', '1541', '1915', '0'), +('4', '24', '9', '12189', '1013', '0'), +('4', '24', '9', '4834', '992', '0'), +('4', '24', '9', '13280', '505', '0'), +('4', '24', '15', '14707', '1050', '0'), +('4', '24', '15', '10366', '827', '0'), +('4', '24', '15', '30360', '700', '0'), +('4', '24', '15', '14679', '610', '0'), +('4', '24', '20', '11601', '7083', '0'), +('4', '24', '20', '1365', '4200', '0'), +('4', '24', '20', '2916', '3869', '0'), +('4', '24', '20', '2471', '3248', '0'), +('4', '24', '12', '20655', '1122', '0'), +('4', '24', '12', '11624', '1117', '0'), +('4', '24', '12', '4895', '995', '0'), +('4', '24', '12', '2923', '848', '0'), +('4', '24', '18', '4896', '701', '0'), +('4', '24', '18', '4412', '694', '0'), +('4', '24', '18', '4836', '608', '0'), +('4', '24', '18', '3191', '460', '0'), +('4', '24', '19', '4837', '1302', '0'), +('4', '24', '19', '68239', '778', '0'), +('4', '24', '19', '4897', '757', '0'), +('4', '24', '19', '4407', '351', '0'), +('4', '24', '13', '27732', '31875', '0'), +('4', '24', '13', '6952', '26925', '0'), +('4', '24', '13', '11663', '25680', '0'), +('4', '24', '13', '7257', '25081', '0'), +('4', '24', '14', '27732', '31875', '0'), +('4', '24', '14', '6952', '26925', '0'), +('4', '24', '14', '7257', '25081', '0'), +('4', '24', '14', '6692', '23371', '0'), +('4', '24', '11', '11696', '55478', '0'), +('4', '24', '11', '8325', '46080', '0'), +('4', '24', '11', '8408', '44510', '0'), +('4', '24', '11', '8402', '43875', '0'), +('4', '25', '22', '8567', '0', '0'), +('4', '25', '22', '10323', '0', '0'), +('4', '25', '22', '66166', '0', '0'), +('4', '25', '22', '10664', '0', '0'), +('4', '25', '1', '30361', '1290', '0'), +('4', '25', '1', '14568', '709', '0'), +('4', '25', '1', '14701', '624', '0'), +('4', '25', '1', '14702', '600', '0'), +('4', '25', '2', '30363', '1450', '0'), +('4', '25', '2', '10142', '1345', '0'), +('4', '25', '2', '4341', '1323', '0'), +('4', '25', '2', '3040', '1112', '0'), +('4', '25', '3', '14706', '990', '0'), +('4', '25', '3', '14705', '990', '0'), +('4', '25', '3', '14695', '634', '0'), +('4', '25', '3', '11052', '453', '0'), +('4', '25', '5', '30362', '1340', '0'), +('4', '25', '5', '14703', '1100', '0'), +('4', '25', '5', '14567', '782', '0'), +('4', '25', '5', '68291', '707', '0'), +('4', '25', '8', '11621', '8407', '0'), +('4', '25', '8', '11603', '1893', '0'), +('4', '25', '8', '11551', '1656', '0'), +('4', '25', '8', '27731', '1362', '0'), +('4', '25', '6', '1557', '5371', '0'), +('4', '25', '6', '2714', '1530', '0'), +('4', '25', '6', '3309', '554', '0'), +('4', '25', '6', '4165', '423', '0'), +('4', '25', '17', '11623', '2062', '0'), +('4', '25', '17', '4892', '1750', '0'), +('4', '25', '17', '4832', '1663', '0'), +('4', '25', '17', '3301', '865', '0'), +('4', '25', '7', '4833', '846', '0'), +('4', '25', '7', '4411', '694', '0'), +('4', '25', '7', '4893', '476', '0'), +('4', '25', '7', '71303', '464', '0'), +('4', '25', '9', '1541', '1927', '0'), +('4', '25', '9', '12189', '1013', '0'), +('4', '25', '9', '4834', '992', '0'), +('4', '25', '9', '13280', '505', '0'), +('4', '25', '15', '14707', '1050', '0'), +('4', '25', '15', '10366', '827', '0'), +('4', '25', '15', '30360', '700', '0'), +('4', '25', '15', '14679', '610', '0'), +('4', '25', '20', '11601', '7087', '0'), +('4', '25', '20', '1365', '4200', '0'), +('4', '25', '20', '2916', '3875', '0'), +('4', '25', '20', '2471', '3248', '0'), +('4', '25', '12', '20655', '1125', '0'), +('4', '25', '12', '11624', '1120', '0'), +('4', '25', '12', '4895', '995', '0'), +('4', '25', '12', '2923', '848', '0'), +('4', '25', '18', '4896', '707', '0'), +('4', '25', '18', '4412', '694', '0'), +('4', '25', '18', '4836', '610', '0'), +('4', '25', '18', '3191', '460', '0'), +('4', '25', '19', '4837', '1308', '0'), +('4', '25', '19', '68239', '782', '0'), +('4', '25', '19', '4897', '759', '0'), +('4', '25', '19', '4407', '362', '0'), +('4', '25', '13', '27732', '32245', '0'), +('4', '25', '13', '6952', '27105', '0'), +('4', '25', '13', '11663', '25920', '0'), +('4', '25', '13', '7257', '25321', '0'), +('4', '25', '14', '27732', '32245', '0'), +('4', '25', '14', '6952', '27105', '0'), +('4', '25', '14', '7257', '25321', '0'), +('4', '25', '14', '6692', '23611', '0'), +('4', '25', '11', '11696', '56078', '0'), +('4', '25', '11', '8325', '46560', '0'), +('4', '25', '11', '8408', '44990', '0'), +('4', '25', '11', '8402', '44355', '0'), +('4', '26', '22', '8567', '0', '0'), +('4', '26', '22', '10323', '0', '0'), +('4', '26', '22', '66166', '0', '0'), +('4', '26', '22', '10664', '0', '0'), +('4', '26', '1', '30361', '1290', '0'), +('4', '26', '1', '14568', '719', '0'), +('4', '26', '1', '14701', '624', '0'), +('4', '26', '1', '14702', '600', '0'), +('4', '26', '2', '30363', '1450', '0'), +('4', '26', '2', '10142', '1345', '0'), +('4', '26', '2', '4341', '1323', '0'), +('4', '26', '2', '3040', '1112', '0'), +('4', '26', '3', '14706', '990', '0'), +('4', '26', '3', '14705', '990', '0'), +('4', '26', '3', '14695', '643', '0'), +('4', '26', '3', '11052', '471', '0'), +('4', '26', '5', '30362', '1340', '0'), +('4', '26', '5', '14703', '1100', '0'), +('4', '26', '5', '14567', '789', '0'), +('4', '26', '5', '68291', '712', '0'), +('4', '26', '8', '11621', '8407', '0'), +('4', '26', '8', '11603', '1903', '0'), +('4', '26', '8', '11551', '1656', '0'), +('4', '26', '8', '27731', '1371', '0'), +('4', '26', '6', '1557', '5371', '0'), +('4', '26', '6', '2714', '1540', '0'), +('4', '26', '6', '3309', '554', '0'), +('4', '26', '6', '4165', '423', '0'), +('4', '26', '17', '11623', '2062', '0'), +('4', '26', '17', '4892', '1766', '0'), +('4', '26', '17', '4832', '1669', '0'), +('4', '26', '17', '3301', '865', '0'), +('4', '26', '7', '4833', '846', '0'), +('4', '26', '7', '4411', '694', '0'), +('4', '26', '7', '4893', '476', '0'), +('4', '26', '7', '71303', '468', '0'), +('4', '26', '9', '1541', '1939', '0'), +('4', '26', '9', '12189', '1013', '0'), +('4', '26', '9', '4834', '992', '0'), +('4', '26', '9', '13280', '505', '0'), +('4', '26', '15', '14707', '1050', '0'), +('4', '26', '15', '10366', '827', '0'), +('4', '26', '15', '30360', '700', '0'), +('4', '26', '15', '14679', '610', '0'), +('4', '26', '20', '11601', '7092', '0'), +('4', '26', '20', '1365', '4200', '0'), +('4', '26', '20', '2916', '3882', '0'), +('4', '26', '20', '2471', '3248', '0'), +('4', '26', '12', '20655', '1128', '0'), +('4', '26', '12', '11624', '1123', '0'), +('4', '26', '12', '4895', '995', '0'), +('4', '26', '12', '2923', '848', '0'), +('4', '26', '18', '4896', '713', '0'), +('4', '26', '18', '4412', '694', '0'), +('4', '26', '18', '4836', '612', '0'), +('4', '26', '18', '3191', '460', '0'), +('4', '26', '19', '4837', '1314', '0'), +('4', '26', '19', '68239', '785', '0'), +('4', '26', '19', '4897', '761', '0'), +('4', '26', '19', '4407', '373', '0'), +('4', '26', '13', '27732', '32614', '0'), +('4', '26', '13', '6952', '27285', '0'), +('4', '26', '13', '11663', '26220', '0'), +('4', '26', '13', '7257', '25621', '0'), +('4', '26', '14', '27732', '32614', '0'), +('4', '26', '14', '6952', '27285', '0'), +('4', '26', '14', '7257', '25621', '0'), +('4', '26', '14', '6692', '23851', '0'), +('4', '26', '11', '11696', '56678', '0'), +('4', '26', '11', '8325', '47100', '0'), +('4', '26', '11', '8408', '45470', '0'), +('4', '26', '11', '8402', '44835', '0'), +('4', '27', '22', '8567', '0', '0'), +('4', '27', '22', '10323', '0', '0'), +('4', '27', '22', '66166', '0', '0'), +('4', '27', '22', '10664', '0', '0'), +('4', '27', '1', '30361', '1290', '0'), +('4', '27', '1', '14568', '728', '0'), +('4', '27', '1', '14701', '624', '0'), +('4', '27', '1', '14702', '600', '0'), +('4', '27', '2', '30363', '1450', '0'), +('4', '27', '2', '10142', '1345', '0'), +('4', '27', '2', '4341', '1323', '0'), +('4', '27', '2', '3040', '1112', '0'), +('4', '27', '3', '14706', '990', '0'), +('4', '27', '3', '14705', '990', '0'), +('4', '27', '3', '14695', '651', '0'), +('4', '27', '3', '11052', '489', '0'), +('4', '27', '5', '30362', '1340', '0'), +('4', '27', '5', '14703', '1100', '0'), +('4', '27', '5', '14567', '797', '0'), +('4', '27', '5', '68291', '716', '0'), +('4', '27', '8', '11621', '8407', '0'), +('4', '27', '8', '11603', '1914', '0'), +('4', '27', '8', '11551', '1656', '0'), +('4', '27', '8', '27731', '1379', '0'), +('4', '27', '6', '1557', '5371', '0'), +('4', '27', '6', '2714', '1549', '0'), +('4', '27', '6', '3309', '554', '0'), +('4', '27', '6', '4165', '423', '0'), +('4', '27', '17', '11623', '2062', '0'), +('4', '27', '17', '4892', '1782', '0'), +('4', '27', '17', '4832', '1675', '0'), +('4', '27', '17', '4342', '870', '0'), +('4', '27', '7', '4833', '846', '0'), +('4', '27', '7', '4411', '694', '0'), +('4', '27', '7', '4893', '476', '0'), +('4', '27', '7', '71303', '472', '0'), +('4', '27', '9', '1541', '1951', '0'), +('4', '27', '9', '12189', '1013', '0'), +('4', '27', '9', '4834', '992', '0'), +('4', '27', '9', '13280', '505', '0'), +('4', '27', '15', '14707', '1050', '0'), +('4', '27', '15', '10366', '827', '0'), +('4', '27', '15', '30360', '700', '0'), +('4', '27', '15', '14679', '610', '0'), +('4', '27', '20', '11601', '7095', '0'), +('4', '27', '20', '1365', '4200', '0'), +('4', '27', '20', '2916', '3888', '0'), +('4', '27', '20', '2471', '3248', '0'), +('4', '27', '12', '20655', '1131', '0'), +('4', '27', '12', '11624', '1125', '0'), +('4', '27', '12', '4895', '995', '0'), +('4', '27', '12', '2923', '848', '0'), +('4', '27', '18', '4896', '719', '0'), +('4', '27', '18', '4412', '694', '0'), +('4', '27', '18', '4836', '614', '0'), +('4', '27', '18', '3191', '460', '0'), +('4', '27', '19', '4837', '1320', '0'), +('4', '27', '19', '68239', '789', '0'), +('4', '27', '19', '4897', '763', '0'), +('4', '27', '19', '4407', '384', '0'), +('4', '27', '13', '27732', '32924', '0'), +('4', '27', '13', '6952', '27405', '0'), +('4', '27', '13', '11663', '26520', '0'), +('4', '27', '13', '7257', '25861', '0'), +('4', '27', '14', '27732', '32924', '0'), +('4', '27', '14', '6952', '27405', '0'), +('4', '27', '14', '7257', '25861', '0'), +('4', '27', '14', '6692', '24091', '0'), +('4', '27', '11', '11696', '57338', '0'), +('4', '27', '11', '8325', '47580', '0'), +('4', '27', '11', '8408', '45950', '0'), +('4', '27', '11', '8402', '45315', '0'), +('4', '28', '22', '8567', '0', '0'), +('4', '28', '22', '10323', '0', '0'), +('4', '28', '22', '66166', '0', '0'), +('4', '28', '22', '10664', '0', '0'), +('4', '28', '1', '30361', '1290', '0'), +('4', '28', '1', '14568', '738', '0'), +('4', '28', '1', '14701', '624', '0'), +('4', '28', '1', '14702', '600', '0'), +('4', '28', '2', '30363', '1450', '0'), +('4', '28', '2', '10142', '1345', '0'), +('4', '28', '2', '4341', '1323', '0'), +('4', '28', '2', '3040', '1112', '0'), +('4', '28', '3', '14706', '990', '0'), +('4', '28', '3', '14705', '990', '0'), +('4', '28', '3', '14695', '660', '0'), +('4', '28', '3', '11052', '507', '0'), +('4', '28', '5', '30362', '1340', '0'), +('4', '28', '5', '14703', '1100', '0'), +('4', '28', '5', '14567', '805', '0'), +('4', '28', '5', '68291', '721', '0'), +('4', '28', '8', '11621', '8407', '0'), +('4', '28', '8', '11603', '1925', '0'), +('4', '28', '8', '11551', '1656', '0'), +('4', '28', '8', '27731', '1388', '0'), +('4', '28', '6', '1557', '5371', '0'), +('4', '28', '6', '2714', '1559', '0'), +('4', '28', '6', '3309', '554', '0'), +('4', '28', '6', '4165', '423', '0'), +('4', '28', '17', '11623', '2062', '0'), +('4', '28', '17', '4892', '1797', '0'), +('4', '28', '17', '4832', '1681', '0'), +('4', '28', '17', '4342', '882', '0'), +('4', '28', '7', '4833', '846', '0'), +('4', '28', '7', '4411', '694', '0'), +('4', '28', '7', '4893', '476', '0'), +('4', '28', '7', '71303', '475', '0'), +('4', '28', '9', '1541', '1963', '0'), +('4', '28', '9', '12189', '1013', '0'), +('4', '28', '9', '4834', '992', '0'), +('4', '28', '9', '13280', '505', '0'), +('4', '28', '15', '14707', '1050', '0'), +('4', '28', '15', '10366', '827', '0'), +('4', '28', '15', '30360', '700', '0'), +('4', '28', '15', '14679', '610', '0'), +('4', '28', '20', '11601', '7099', '0'), +('4', '28', '20', '1365', '4200', '0'), +('4', '28', '20', '2916', '3894', '0'), +('4', '28', '20', '2471', '3248', '0'), +('4', '28', '12', '20655', '1135', '0'), +('4', '28', '12', '11624', '1128', '0'), +('4', '28', '12', '4895', '995', '0'), +('4', '28', '12', '2923', '848', '0'), +('4', '28', '18', '4896', '725', '0'), +('4', '28', '18', '4412', '694', '0'), +('4', '28', '18', '4836', '616', '0'), +('4', '28', '18', '3191', '460', '0'), +('4', '28', '19', '4837', '1326', '0'), +('4', '28', '19', '68239', '793', '0'), +('4', '28', '19', '4897', '765', '0'), +('4', '28', '19', '4407', '395', '0'), +('4', '28', '13', '27732', '33294', '0'), +('4', '28', '13', '6952', '27585', '0'), +('4', '28', '13', '11663', '26820', '0'), +('4', '28', '13', '7257', '26161', '0'), +('4', '28', '14', '27732', '33294', '0'), +('4', '28', '14', '6952', '27585', '0'), +('4', '28', '14', '7257', '26161', '0'), +('4', '28', '14', '6692', '24331', '0'), +('4', '28', '11', '11696', '57938', '0'), +('4', '28', '11', '8325', '48120', '0'), +('4', '28', '11', '8408', '46430', '0'), +('4', '28', '11', '8402', '45795', '0'), +('4', '29', '22', '8567', '0', '0'), +('4', '29', '22', '10323', '0', '0'), +('4', '29', '22', '66166', '0', '0'), +('4', '29', '22', '10664', '0', '0'), +('4', '29', '1', '30361', '1290', '0'), +('4', '29', '1', '14568', '748', '0'), +('4', '29', '1', '14701', '624', '0'), +('4', '29', '1', '14702', '600', '0'), +('4', '29', '2', '30363', '1450', '0'), +('4', '29', '2', '10142', '1345', '0'), +('4', '29', '2', '4341', '1323', '0'), +('4', '29', '2', '3040', '1112', '0'), +('4', '29', '3', '14706', '990', '0'), +('4', '29', '3', '14705', '990', '0'), +('4', '29', '3', '14695', '668', '0'), +('4', '29', '3', '11052', '525', '0'), +('4', '29', '5', '30362', '1340', '0'), +('4', '29', '5', '14703', '1100', '0'), +('4', '29', '5', '14567', '812', '0'), +('4', '29', '5', '68291', '726', '0'), +('4', '29', '8', '11621', '8407', '0'), +('4', '29', '8', '11603', '1936', '0'), +('4', '29', '8', '11551', '1656', '0'), +('4', '29', '8', '27731', '1396', '0'), +('4', '29', '6', '1557', '5371', '0'), +('4', '29', '6', '2714', '1569', '0'), +('4', '29', '6', '3309', '554', '0'), +('4', '29', '6', '4165', '423', '0'), +('4', '29', '17', '11623', '2062', '0'), +('4', '29', '17', '4892', '1813', '0'), +('4', '29', '17', '4832', '1688', '0'), +('4', '29', '17', '4342', '894', '0'), +('4', '29', '7', '4833', '846', '0'), +('4', '29', '7', '4411', '694', '0'), +('4', '29', '7', '71303', '479', '0'), +('4', '29', '7', '4893', '476', '0'), +('4', '29', '9', '1541', '1975', '0'), +('4', '29', '9', '12189', '1013', '0'), +('4', '29', '9', '4834', '992', '0'), +('4', '29', '9', '13280', '505', '0'), +('4', '29', '15', '14707', '1050', '0'), +('4', '29', '15', '10366', '827', '0'), +('4', '29', '15', '30360', '700', '0'), +('4', '29', '15', '14679', '610', '0'), +('4', '29', '20', '11601', '7104', '0'), +('4', '29', '20', '1365', '4200', '0'), +('4', '29', '20', '2916', '3900', '0'), +('4', '29', '20', '2471', '3248', '0'), +('4', '29', '12', '20655', '1138', '0'), +('4', '29', '12', '11624', '1131', '0'), +('4', '29', '12', '4895', '995', '0'), +('4', '29', '12', '2923', '848', '0'), +('4', '29', '18', '4896', '731', '0'), +('4', '29', '18', '4412', '694', '0'), +('4', '29', '18', '4836', '618', '0'), +('4', '29', '18', '3191', '460', '0'), +('4', '29', '19', '4837', '1332', '0'), +('4', '29', '19', '68239', '796', '0'), +('4', '29', '19', '4897', '767', '0'), +('4', '29', '19', '4407', '406', '0'), +('4', '29', '13', '27732', '33663', '0'), +('4', '29', '13', '6952', '27765', '0'), +('4', '29', '13', '11663', '27060', '0'), +('4', '29', '13', '7257', '26461', '0'), +('4', '29', '14', '27732', '33663', '0'), +('4', '29', '14', '6952', '27765', '0'), +('4', '29', '14', '7257', '26461', '0'), +('4', '29', '14', '6692', '24571', '0'), +('4', '29', '11', '11696', '58538', '0'), +('4', '29', '11', '8325', '48600', '0'), +('4', '29', '11', '8408', '46910', '0'), +('4', '29', '11', '8402', '46275', '0'), +('4', '30', '22', '8567', '0', '0'), +('4', '30', '22', '10323', '0', '0'), +('4', '30', '22', '66166', '0', '0'), +('4', '30', '22', '10664', '0', '0'), +('4', '30', '1', '30361', '1290', '0'), +('4', '30', '1', '14568', '757', '0'), +('4', '30', '1', '14701', '624', '0'), +('4', '30', '1', '14702', '600', '0'), +('4', '30', '2', '30363', '1450', '0'), +('4', '30', '2', '10142', '1345', '0'), +('4', '30', '2', '4341', '1323', '0'), +('4', '30', '2', '3040', '1112', '0'), +('4', '30', '3', '14706', '990', '0'), +('4', '30', '3', '14705', '990', '0'), +('4', '30', '3', '14695', '676', '0'), +('4', '30', '3', '11052', '544', '0'), +('4', '30', '5', '30362', '1340', '0'), +('4', '30', '5', '14703', '1100', '0'), +('4', '30', '5', '14567', '820', '0'), +('4', '30', '5', '68291', '731', '0'), +('4', '30', '8', '11621', '8407', '0'), +('4', '30', '8', '11603', '1947', '0'), +('4', '30', '8', '11551', '1656', '0'), +('4', '30', '8', '27731', '1405', '0'), +('4', '30', '6', '1557', '5371', '0'), +('4', '30', '6', '2714', '1578', '0'), +('4', '30', '6', '3309', '554', '0'), +('4', '30', '6', '4165', '423', '0'), +('4', '30', '17', '11623', '2062', '0'), +('4', '30', '17', '4892', '1829', '0'), +('4', '30', '17', '4832', '1694', '0'), +('4', '30', '17', '4342', '906', '0'), +('4', '30', '7', '4833', '846', '0'), +('4', '30', '7', '4411', '694', '0'), +('4', '30', '7', '71303', '482', '0'), +('4', '30', '7', '4893', '476', '0'), +('4', '30', '9', '1541', '1987', '0'), +('4', '30', '9', '12189', '1013', '0'), +('4', '30', '9', '4834', '992', '0'), +('4', '30', '9', '13280', '505', '0'), +('4', '30', '15', '14707', '1050', '0'), +('4', '30', '15', '10366', '827', '0'), +('4', '30', '15', '30360', '700', '0'), +('4', '30', '15', '14679', '610', '0'), +('4', '30', '20', '11601', '7108', '0'), +('4', '30', '20', '1365', '4200', '0'), +('4', '30', '20', '2916', '3906', '0'), +('4', '30', '20', '2471', '3248', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '30', '12', '20655', '1141', '0'), +('4', '30', '12', '11624', '1134', '0'), +('4', '30', '12', '4895', '995', '0'), +('4', '30', '12', '2923', '848', '0'), +('4', '30', '18', '4896', '738', '0'), +('4', '30', '18', '4412', '694', '0'), +('4', '30', '18', '4836', '620', '0'), +('4', '30', '18', '3191', '460', '0'), +('4', '30', '19', '4837', '1338', '0'), +('4', '30', '19', '68239', '800', '0'), +('4', '30', '19', '4897', '770', '0'), +('4', '30', '19', '4407', '417', '0'), +('4', '30', '13', '27732', '33973', '0'), +('4', '30', '13', '6952', '27945', '0'), +('4', '30', '13', '11663', '27360', '0'), +('4', '30', '13', '7257', '26701', '0'), +('4', '30', '14', '27732', '33973', '0'), +('4', '30', '14', '6952', '27945', '0'), +('4', '30', '14', '7257', '26701', '0'), +('4', '30', '14', '6692', '24811', '0'), +('4', '30', '11', '11696', '59138', '0'), +('4', '30', '11', '8325', '49140', '0'), +('4', '30', '11', '8408', '47390', '0'), +('4', '30', '11', '8402', '46755', '0'), +('4', '31', '22', '8567', '0', '0'), +('4', '31', '22', '10323', '0', '0'), +('4', '31', '22', '66166', '0', '0'), +('4', '31', '22', '10664', '0', '0'), +('4', '31', '1', '30361', '1290', '0'), +('4', '31', '1', '14568', '767', '0'), +('4', '31', '1', '14701', '624', '0'), +('4', '31', '1', '14702', '600', '0'), +('4', '31', '2', '30363', '1450', '0'), +('4', '31', '2', '10142', '1345', '0'), +('4', '31', '2', '4341', '1323', '0'), +('4', '31', '2', '3040', '1112', '0'), +('4', '31', '3', '14706', '990', '0'), +('4', '31', '3', '14705', '990', '0'), +('4', '31', '3', '14695', '685', '0'), +('4', '31', '3', '11052', '562', '0'), +('4', '31', '5', '30362', '1340', '0'), +('4', '31', '5', '14703', '1100', '0'), +('4', '31', '5', '14567', '828', '0'), +('4', '31', '5', '68291', '736', '0'), +('4', '31', '8', '11621', '8407', '0'), +('4', '31', '8', '11603', '1958', '0'), +('4', '31', '8', '11551', '1656', '0'), +('4', '31', '8', '27731', '1413', '0'), +('4', '31', '6', '1557', '5371', '0'), +('4', '31', '6', '2714', '1588', '0'), +('4', '31', '6', '3309', '554', '0'), +('4', '31', '6', '4165', '423', '0'), +('4', '31', '17', '11623', '2062', '0'), +('4', '31', '17', '4892', '1845', '0'), +('4', '31', '17', '4832', '1700', '0'), +('4', '31', '17', '4342', '918', '0'), +('4', '31', '7', '4833', '846', '0'), +('4', '31', '7', '4411', '694', '0'), +('4', '31', '7', '71303', '486', '0'), +('4', '31', '7', '4893', '476', '0'), +('4', '31', '9', '1541', '1999', '0'), +('4', '31', '9', '12189', '1013', '0'), +('4', '31', '9', '4834', '992', '0'), +('4', '31', '9', '13280', '505', '0'), +('4', '31', '15', '14707', '1050', '0'), +('4', '31', '15', '10366', '827', '0'), +('4', '31', '15', '30360', '700', '0'), +('4', '31', '15', '14679', '610', '0'), +('4', '31', '20', '11601', '7112', '0'), +('4', '31', '20', '1365', '4200', '0'), +('4', '31', '20', '2916', '3912', '0'), +('4', '31', '20', '2471', '3248', '0'), +('4', '31', '12', '20655', '1145', '0'), +('4', '31', '12', '11624', '1137', '0'), +('4', '31', '12', '4895', '995', '0'), +('4', '31', '12', '2923', '848', '0'), +('4', '31', '18', '4896', '744', '0'), +('4', '31', '18', '4412', '694', '0'), +('4', '31', '18', '4836', '622', '0'), +('4', '31', '18', '3191', '460', '0'), +('4', '31', '19', '4837', '1344', '0'), +('4', '31', '19', '68239', '804', '0'), +('4', '31', '19', '4897', '772', '0'), +('4', '31', '19', '4407', '427', '0'), +('4', '31', '13', '27732', '34343', '0'), +('4', '31', '13', '6952', '28065', '0'), +('4', '31', '13', '11663', '27660', '0'), +('4', '31', '13', '7257', '27001', '0'), +('4', '31', '14', '27732', '34343', '0'), +('4', '31', '14', '6952', '28065', '0'), +('4', '31', '14', '7257', '27001', '0'), +('4', '31', '14', '6692', '25051', '0'), +('4', '31', '11', '11696', '59738', '0'), +('4', '31', '11', '8325', '49620', '0'), +('4', '31', '11', '8408', '47870', '0'), +('4', '31', '11', '8402', '47235', '0'), +('4', '32', '22', '8567', '0', '0'), +('4', '32', '22', '10323', '0', '0'), +('4', '32', '22', '66166', '0', '0'), +('4', '32', '22', '10664', '0', '0'), +('4', '32', '1', '30361', '1290', '0'), +('4', '32', '1', '14568', '777', '0'), +('4', '32', '1', '14701', '624', '0'), +('4', '32', '1', '14702', '600', '0'), +('4', '32', '2', '30363', '1450', '0'), +('4', '32', '2', '10142', '1345', '0'), +('4', '32', '2', '4341', '1323', '0'), +('4', '32', '2', '3040', '1112', '0'), +('4', '32', '3', '14706', '990', '0'), +('4', '32', '3', '14705', '990', '0'), +('4', '32', '3', '14695', '693', '0'), +('4', '32', '3', '11052', '580', '0'), +('4', '32', '5', '30362', '1340', '0'), +('4', '32', '5', '14703', '1100', '0'), +('4', '32', '5', '14567', '836', '0'), +('4', '32', '5', '68291', '741', '0'), +('4', '32', '8', '11621', '8407', '0'), +('4', '32', '8', '11603', '1969', '0'), +('4', '32', '8', '11551', '1656', '0'), +('4', '32', '8', '27731', '1422', '0'), +('4', '32', '6', '1557', '5371', '0'), +('4', '32', '6', '2714', '1598', '0'), +('4', '32', '6', '3309', '554', '0'), +('4', '32', '6', '4165', '423', '0'), +('4', '32', '17', '11623', '2062', '0'), +('4', '32', '17', '4892', '1860', '0'), +('4', '32', '17', '4832', '1707', '0'), +('4', '32', '17', '4342', '930', '0'), +('4', '32', '7', '4833', '846', '0'), +('4', '32', '7', '4411', '694', '0'), +('4', '32', '7', '71303', '490', '0'), +('4', '32', '7', '4893', '476', '0'), +('4', '32', '9', '1541', '2011', '0'), +('4', '32', '9', '12189', '1013', '0'), +('4', '32', '9', '4834', '992', '0'), +('4', '32', '9', '13280', '505', '0'), +('4', '32', '15', '14707', '1050', '0'), +('4', '32', '15', '10366', '827', '0'), +('4', '32', '15', '30360', '700', '0'), +('4', '32', '15', '14679', '610', '0'), +('4', '32', '20', '11601', '7116', '0'), +('4', '32', '20', '1365', '4200', '0'), +('4', '32', '20', '2916', '3918', '0'), +('4', '32', '20', '2471', '3248', '0'), +('4', '32', '12', '20655', '1148', '0'), +('4', '32', '12', '11624', '1140', '0'), +('4', '32', '12', '4895', '995', '0'), +('4', '32', '12', '2923', '848', '0'), +('4', '32', '18', '4896', '750', '0'), +('4', '32', '18', '4412', '694', '0'), +('4', '32', '18', '4836', '624', '0'), +('4', '32', '18', '3191', '460', '0'), +('4', '32', '19', '4837', '1350', '0'), +('4', '32', '19', '68239', '807', '0'), +('4', '32', '19', '4897', '774', '0'), +('4', '32', '19', '4407', '438', '0'), +('4', '32', '13', '27732', '34652', '0'), +('4', '32', '13', '6952', '28245', '0'), +('4', '32', '13', '11663', '27960', '0'), +('4', '32', '13', '7257', '27241', '0'), +('4', '32', '14', '27732', '34652', '0'), +('4', '32', '14', '6952', '28245', '0'), +('4', '32', '14', '7257', '27241', '0'), +('4', '32', '14', '6692', '25291', '0'), +('4', '32', '11', '11696', '60338', '0'), +('4', '32', '11', '8325', '50100', '0'), +('4', '32', '11', '8408', '48350', '0'), +('4', '32', '11', '8402', '47715', '0'), +('4', '33', '22', '8567', '0', '0'), +('4', '33', '22', '10323', '0', '0'), +('4', '33', '22', '66166', '0', '0'), +('4', '33', '22', '10664', '0', '0'), +('4', '33', '1', '30361', '1290', '0'), +('4', '33', '1', '14568', '786', '0'), +('4', '33', '1', '14701', '624', '0'), +('4', '33', '1', '14702', '600', '0'), +('4', '33', '2', '30363', '1450', '0'), +('4', '33', '2', '10142', '1345', '0'), +('4', '33', '2', '4341', '1323', '0'), +('4', '33', '2', '3040', '1112', '0'), +('4', '33', '3', '14705', '990', '0'), +('4', '33', '3', '14706', '990', '0'), +('4', '33', '3', '14695', '702', '0'), +('4', '33', '3', '11052', '598', '0'), +('4', '33', '5', '30362', '1340', '0'), +('4', '33', '5', '14703', '1100', '0'), +('4', '33', '5', '14567', '843', '0'), +('4', '33', '5', '68291', '745', '0'), +('4', '33', '8', '11621', '8407', '0'), +('4', '33', '8', '11603', '1980', '0'), +('4', '33', '8', '11551', '1656', '0'), +('4', '33', '8', '27731', '1430', '0'), +('4', '33', '6', '1557', '5371', '0'), +('4', '33', '6', '2714', '1607', '0'), +('4', '33', '6', '3309', '554', '0'), +('4', '33', '6', '4165', '423', '0'), +('4', '33', '17', '11623', '2062', '0'), +('4', '33', '17', '4892', '1876', '0'), +('4', '33', '17', '4832', '1713', '0'), +('4', '33', '17', '4342', '942', '0'), +('4', '33', '7', '4833', '846', '0'), +('4', '33', '7', '4411', '694', '0'), +('4', '33', '7', '71303', '493', '0'), +('4', '33', '7', '4893', '476', '0'), +('4', '33', '9', '1541', '2023', '0'), +('4', '33', '9', '12189', '1013', '0'), +('4', '33', '9', '4834', '992', '0'), +('4', '33', '9', '13280', '505', '0'), +('4', '33', '15', '14707', '1050', '0'), +('4', '33', '15', '10366', '827', '0'), +('4', '33', '15', '30360', '700', '0'), +('4', '33', '15', '14679', '610', '0'), +('4', '33', '20', '11601', '7120', '0'), +('4', '33', '20', '1365', '4200', '0'), +('4', '33', '20', '2916', '3924', '0'), +('4', '33', '20', '2471', '3248', '0'), +('4', '33', '12', '20655', '1151', '0'), +('4', '33', '12', '11624', '1143', '0'), +('4', '33', '12', '4895', '995', '0'), +('4', '33', '12', '2923', '848', '0'), +('4', '33', '18', '4896', '756', '0'), +('4', '33', '18', '4412', '694', '0'), +('4', '33', '18', '4836', '626', '0'), +('4', '33', '18', '3191', '460', '0'), +('4', '33', '19', '4837', '1356', '0'), +('4', '33', '19', '68239', '811', '0'), +('4', '33', '19', '4897', '776', '0'), +('4', '33', '19', '4407', '449', '0'), +('4', '33', '13', '27732', '35022', '0'), +('4', '33', '13', '6952', '28425', '0'), +('4', '33', '13', '11663', '28200', '0'), +('4', '33', '13', '7257', '27541', '0'), +('4', '33', '14', '27732', '35022', '0'), +('4', '33', '14', '6952', '28425', '0'), +('4', '33', '14', '7257', '27541', '0'), +('4', '33', '14', '6692', '25531', '0'), +('4', '33', '11', '11696', '60938', '0'), +('4', '33', '11', '8325', '50640', '0'), +('4', '33', '11', '8408', '48890', '0'), +('4', '33', '11', '8402', '48195', '0'), +('4', '34', '22', '8567', '0', '0'), +('4', '34', '22', '10323', '0', '0'), +('4', '34', '22', '66166', '0', '0'), +('4', '34', '22', '10664', '0', '0'), +('4', '34', '1', '30361', '1290', '0'), +('4', '34', '1', '14568', '796', '0'), +('4', '34', '1', '14701', '624', '0'), +('4', '34', '1', '14702', '600', '0'), +('4', '34', '2', '30363', '1450', '0'), +('4', '34', '2', '10142', '1345', '0'), +('4', '34', '2', '4341', '1323', '0'), +('4', '34', '2', '3040', '1112', '0'), +('4', '34', '3', '14705', '990', '0'), +('4', '34', '3', '14706', '990', '0'), +('4', '34', '3', '14695', '710', '0'), +('4', '34', '3', '11052', '616', '0'), +('4', '34', '5', '30362', '1340', '0'), +('4', '34', '5', '14703', '1100', '0'), +('4', '34', '5', '14567', '851', '0'), +('4', '34', '5', '68291', '750', '0'), +('4', '34', '8', '11621', '8407', '0'), +('4', '34', '8', '11603', '1990', '0'), +('4', '34', '8', '11551', '1656', '0'), +('4', '34', '8', '27731', '1438', '0'), +('4', '34', '6', '1557', '5371', '0'), +('4', '34', '6', '2714', '1617', '0'), +('4', '34', '6', '3309', '554', '0'), +('4', '34', '6', '4165', '423', '0'), +('4', '34', '17', '11623', '2062', '0'), +('4', '34', '17', '4892', '1892', '0'), +('4', '34', '17', '4832', '1719', '0'), +('4', '34', '17', '4342', '954', '0'), +('4', '34', '7', '4833', '846', '0'), +('4', '34', '7', '4411', '694', '0'), +('4', '34', '7', '71303', '497', '0'), +('4', '34', '7', '4893', '476', '0'), +('4', '34', '9', '1541', '2036', '0'), +('4', '34', '9', '12189', '1013', '0'), +('4', '34', '9', '4834', '992', '0'), +('4', '34', '9', '13280', '505', '0'), +('4', '34', '15', '14707', '1050', '0'), +('4', '34', '15', '10366', '827', '0'), +('4', '34', '15', '30360', '700', '0'), +('4', '34', '15', '14679', '610', '0'), +('4', '34', '20', '11601', '7125', '0'), +('4', '34', '20', '1365', '4200', '0'), +('4', '34', '20', '2916', '3930', '0'), +('4', '34', '20', '2471', '3248', '0'), +('4', '34', '12', '20655', '1154', '0'), +('4', '34', '12', '11624', '1146', '0'), +('4', '34', '12', '4895', '995', '0'), +('4', '34', '12', '2923', '848', '0'), +('4', '34', '18', '4896', '762', '0'), +('4', '34', '18', '4412', '694', '0'), +('4', '34', '18', '4836', '628', '0'), +('4', '34', '18', '3191', '460', '0'), +('4', '34', '19', '4837', '1362', '0'), +('4', '34', '19', '68239', '814', '0'), +('4', '34', '19', '4897', '778', '0'), +('4', '34', '19', '4407', '460', '0'), +('4', '34', '13', '27732', '35392', '0'), +('4', '34', '13', '6952', '28545', '0'), +('4', '34', '13', '11663', '28500', '0'), +('4', '34', '13', '7257', '27781', '0'), +('4', '34', '14', '27732', '35392', '0'), +('4', '34', '14', '6952', '28545', '0'), +('4', '34', '14', '7257', '27781', '0'), +('4', '34', '14', '6692', '25771', '0'), +('4', '34', '11', '11696', '61538', '0'), +('4', '34', '11', '8325', '51120', '0'), +('4', '34', '11', '8408', '49370', '0'), +('4', '34', '11', '8402', '48675', '0'), +('4', '35', '22', '8567', '0', '0'), +('4', '35', '22', '10323', '0', '0'), +('4', '35', '22', '66166', '0', '0'), +('4', '35', '22', '10664', '0', '0'), +('4', '35', '1', '30361', '1290', '0'), +('4', '35', '1', '14568', '806', '0'), +('4', '35', '1', '14701', '624', '0'), +('4', '35', '1', '14702', '600', '0'), +('4', '35', '2', '30363', '1450', '0'), +('4', '35', '2', '10142', '1345', '0'), +('4', '35', '2', '4341', '1323', '0'), +('4', '35', '2', '3040', '1112', '0'), +('4', '35', '3', '14705', '990', '0'), +('4', '35', '3', '14706', '990', '0'), +('4', '35', '3', '14695', '719', '0'), +('4', '35', '3', '11052', '634', '0'), +('4', '35', '5', '30362', '1340', '0'), +('4', '35', '5', '14703', '1100', '0'), +('4', '35', '5', '14567', '859', '0'), +('4', '35', '5', '68291', '755', '0'), +('4', '35', '8', '11621', '8407', '0'), +('4', '35', '8', '11603', '2001', '0'), +('4', '35', '8', '11551', '1656', '0'), +('4', '35', '8', '27731', '1447', '0'), +('4', '35', '6', '1557', '5371', '0'), +('4', '35', '6', '2714', '1627', '0'), +('4', '35', '6', '3309', '554', '0'), +('4', '35', '6', '4165', '423', '0'), +('4', '35', '17', '11623', '2062', '0'), +('4', '35', '17', '4892', '1907', '0'), +('4', '35', '17', '4832', '1725', '0'), +('4', '35', '17', '4342', '966', '0'), +('4', '35', '7', '4833', '846', '0'), +('4', '35', '7', '4411', '694', '0'), +('4', '35', '7', '71303', '501', '0'), +('4', '35', '7', '4893', '476', '0'), +('4', '35', '9', '1541', '2048', '0'), +('4', '35', '9', '12189', '1013', '0'), +('4', '35', '9', '4834', '992', '0'), +('4', '35', '9', '4894', '507', '0'), +('4', '35', '15', '14707', '1050', '0'), +('4', '35', '15', '10366', '827', '0'), +('4', '35', '15', '30360', '700', '0'), +('4', '35', '15', '14679', '610', '0'), +('4', '35', '20', '11601', '7128', '0'), +('4', '35', '20', '1365', '4200', '0'), +('4', '35', '20', '2916', '3936', '0'), +('4', '35', '20', '2471', '3248', '0'), +('4', '35', '12', '20655', '1157', '0'), +('4', '35', '12', '11624', '1148', '0'), +('4', '35', '12', '4895', '995', '0'), +('4', '35', '12', '2923', '848', '0'), +('4', '35', '18', '4896', '768', '0'), +('4', '35', '18', '4412', '694', '0'), +('4', '35', '18', '4836', '630', '0'), +('4', '35', '18', '3191', '460', '0'), +('4', '35', '19', '4837', '1368', '0'), +('4', '35', '19', '68239', '818', '0'), +('4', '35', '19', '4897', '780', '0'), +('4', '35', '19', '4407', '471', '0'), +('4', '35', '13', '27732', '35701', '0'), +('4', '35', '13', '11663', '28800', '0'), +('4', '35', '13', '6952', '28725', '0'), +('4', '35', '13', '7257', '28081', '0'), +('4', '35', '14', '27732', '35701', '0'), +('4', '35', '14', '6952', '28725', '0'), +('4', '35', '14', '7257', '28081', '0'), +('4', '35', '14', '6692', '26011', '0'), +('4', '35', '11', '11696', '62138', '0'), +('4', '35', '11', '8325', '51660', '0'), +('4', '35', '11', '8408', '49850', '0'), +('4', '35', '11', '8402', '49155', '0'), +('4', '36', '22', '8567', '0', '0'), +('4', '36', '22', '10323', '0', '0'), +('4', '36', '22', '66166', '0', '0'), +('4', '36', '22', '10664', '0', '0'), +('4', '36', '1', '30361', '1290', '0'), +('4', '36', '1', '14568', '815', '0'), +('4', '36', '1', '14701', '624', '0'), +('4', '36', '1', '14702', '600', '0'), +('4', '36', '2', '30363', '1450', '0'), +('4', '36', '2', '10142', '1345', '0'), +('4', '36', '2', '4341', '1323', '0'), +('4', '36', '2', '3040', '1112', '0'), +('4', '36', '3', '14705', '990', '0'), +('4', '36', '3', '14706', '990', '0'), +('4', '36', '3', '14695', '727', '0'), +('4', '36', '3', '11052', '652', '0'), +('4', '36', '5', '30362', '1340', '0'), +('4', '36', '5', '14703', '1100', '0'), +('4', '36', '5', '14567', '866', '0'), +('4', '36', '5', '68291', '760', '0'), +('4', '36', '8', '11621', '8407', '0'), +('4', '36', '8', '11603', '2012', '0'), +('4', '36', '8', '11551', '1656', '0'), +('4', '36', '8', '27731', '1455', '0'), +('4', '36', '6', '1557', '5371', '0'), +('4', '36', '6', '2714', '1636', '0'), +('4', '36', '6', '3309', '554', '0'), +('4', '36', '6', '4165', '423', '0'), +('4', '36', '17', '11623', '2062', '0'), +('4', '36', '17', '4892', '1923', '0'), +('4', '36', '17', '4832', '1731', '0'), +('4', '36', '17', '4342', '978', '0'), +('4', '36', '7', '4833', '846', '0'), +('4', '36', '7', '4411', '694', '0'), +('4', '36', '7', '71303', '504', '0'), +('4', '36', '7', '4893', '476', '0'), +('4', '36', '9', '1541', '2060', '0'), +('4', '36', '9', '12189', '1013', '0'), +('4', '36', '9', '4834', '992', '0'), +('4', '36', '9', '4894', '515', '0'), +('4', '36', '15', '14707', '1050', '0'), +('4', '36', '15', '10366', '827', '0'), +('4', '36', '15', '30360', '700', '0'), +('4', '36', '15', '14679', '610', '0'), +('4', '36', '20', '11601', '7133', '0'), +('4', '36', '20', '1365', '4200', '0'), +('4', '36', '20', '2916', '3942', '0'), +('4', '36', '20', '2471', '3248', '0'), +('4', '36', '12', '20655', '1161', '0'), +('4', '36', '12', '11624', '1151', '0'), +('4', '36', '12', '4895', '995', '0'), +('4', '36', '12', '2923', '848', '0'), +('4', '36', '18', '4896', '774', '0'), +('4', '36', '18', '4412', '694', '0'), +('4', '36', '18', '4836', '632', '0'), +('4', '36', '18', '3191', '460', '0'), +('4', '36', '19', '4837', '1374', '0'), +('4', '36', '19', '68239', '822', '0'), +('4', '36', '19', '4897', '782', '0'), +('4', '36', '19', '4407', '482', '0'), +('4', '36', '13', '27732', '36071', '0'), +('4', '36', '13', '11663', '29040', '0'), +('4', '36', '13', '6952', '28905', '0'), +('4', '36', '13', '7257', '28381', '0'), +('4', '36', '14', '27732', '36071', '0'), +('4', '36', '14', '6952', '28905', '0'), +('4', '36', '14', '7257', '28381', '0'), +('4', '36', '14', '6692', '26251', '0'), +('4', '36', '11', '11696', '62738', '0'), +('4', '36', '11', '8325', '52140', '0'), +('4', '36', '11', '8408', '50330', '0'), +('4', '36', '11', '8402', '49635', '0'), +('4', '37', '22', '8567', '0', '0'), +('4', '37', '22', '10323', '0', '0'), +('4', '37', '22', '66166', '0', '0'), +('4', '37', '22', '10664', '0', '0'), +('4', '37', '1', '30361', '1290', '0'), +('4', '37', '1', '14568', '825', '0'), +('4', '37', '1', '14701', '624', '0'), +('4', '37', '1', '14702', '600', '0'), +('4', '37', '2', '30363', '1450', '0'), +('4', '37', '2', '10142', '1345', '0'), +('4', '37', '2', '4341', '1323', '0'), +('4', '37', '2', '3040', '1112', '0'), +('4', '37', '3', '14705', '990', '0'), +('4', '37', '3', '14706', '990', '0'), +('4', '37', '3', '14695', '736', '0'), +('4', '37', '3', '11052', '670', '0'), +('4', '37', '5', '30362', '1340', '0'), +('4', '37', '5', '14703', '1100', '0'), +('4', '37', '5', '14567', '874', '0'), +('4', '37', '5', '68291', '765', '0'), +('4', '37', '8', '11621', '8407', '0'), +('4', '37', '8', '11603', '2023', '0'), +('4', '37', '8', '11551', '1656', '0'), +('4', '37', '8', '27731', '1464', '0'), +('4', '37', '6', '1557', '5371', '0'), +('4', '37', '6', '2714', '1646', '0'), +('4', '37', '6', '3309', '554', '0'), +('4', '37', '6', '4165', '423', '0'), +('4', '37', '17', '11623', '2062', '0'), +('4', '37', '17', '4892', '1939', '0'), +('4', '37', '17', '4832', '1737', '0'), +('4', '37', '17', '4342', '991', '0'), +('4', '37', '7', '4833', '846', '0'), +('4', '37', '7', '4411', '694', '0'), +('4', '37', '7', '71303', '508', '0'), +('4', '37', '7', '4893', '476', '0'), +('4', '37', '9', '1541', '2072', '0'), +('4', '37', '9', '12189', '1013', '0'), +('4', '37', '9', '4834', '992', '0'), +('4', '37', '9', '4894', '523', '0'), +('4', '37', '15', '14707', '1050', '0'), +('4', '37', '15', '10366', '827', '0'), +('4', '37', '15', '30360', '700', '0'), +('4', '37', '15', '14679', '610', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '37', '20', '11601', '7137', '0'), +('4', '37', '20', '1365', '4200', '0'), +('4', '37', '20', '2916', '3948', '0'), +('4', '37', '20', '2471', '3248', '0'), +('4', '37', '12', '20655', '1164', '0'), +('4', '37', '12', '11624', '1154', '0'), +('4', '37', '12', '4895', '995', '0'), +('4', '37', '12', '2923', '848', '0'), +('4', '37', '18', '4896', '780', '0'), +('4', '37', '18', '4412', '694', '0'), +('4', '37', '18', '4836', '635', '0'), +('4', '37', '18', '3191', '460', '0'), +('4', '37', '19', '4837', '1380', '0'), +('4', '37', '19', '68239', '825', '0'), +('4', '37', '19', '4897', '784', '0'), +('4', '37', '19', '4407', '493', '0'), +('4', '37', '13', '27732', '36441', '0'), +('4', '37', '13', '11663', '29340', '0'), +('4', '37', '13', '6952', '29025', '0'), +('4', '37', '13', '7257', '28621', '0'), +('4', '37', '14', '27732', '36441', '0'), +('4', '37', '14', '6952', '29025', '0'), +('4', '37', '14', '7257', '28621', '0'), +('4', '37', '14', '5500', '27555', '0'), +('4', '37', '11', '11696', '63338', '0'), +('4', '37', '11', '8325', '52680', '0'), +('4', '37', '11', '8408', '50810', '0'), +('4', '37', '11', '45137', '50611', '0'), +('4', '38', '22', '8567', '0', '0'), +('4', '38', '22', '10323', '0', '0'), +('4', '38', '22', '66166', '0', '0'), +('4', '38', '22', '10664', '0', '0'), +('4', '38', '1', '30361', '1290', '0'), +('4', '38', '1', '14568', '835', '0'), +('4', '38', '1', '14701', '624', '0'), +('4', '38', '1', '14702', '600', '0'), +('4', '38', '2', '30363', '1450', '0'), +('4', '38', '2', '10142', '1345', '0'), +('4', '38', '2', '4341', '1323', '0'), +('4', '38', '2', '3040', '1112', '0'), +('4', '38', '3', '14705', '990', '0'), +('4', '38', '3', '14706', '990', '0'), +('4', '38', '3', '14695', '744', '0'), +('4', '38', '3', '11052', '689', '0'), +('4', '38', '5', '30362', '1340', '0'), +('4', '38', '5', '14703', '1100', '0'), +('4', '38', '5', '14567', '882', '0'), +('4', '38', '5', '68291', '770', '0'), +('4', '38', '8', '11621', '8407', '0'), +('4', '38', '8', '11603', '2034', '0'), +('4', '38', '8', '11551', '1656', '0'), +('4', '38', '8', '27731', '1472', '0'), +('4', '38', '6', '1557', '5371', '0'), +('4', '38', '6', '2714', '1656', '0'), +('4', '38', '6', '3309', '554', '0'), +('4', '38', '6', '4165', '423', '0'), +('4', '38', '17', '11623', '2062', '0'), +('4', '38', '17', '4892', '1954', '0'), +('4', '38', '17', '4832', '1744', '0'), +('4', '38', '17', '4342', '1003', '0'), +('4', '38', '7', '4833', '846', '0'), +('4', '38', '7', '4411', '694', '0'), +('4', '38', '7', '71303', '511', '0'), +('4', '38', '7', '4893', '476', '0'), +('4', '38', '9', '1541', '2084', '0'), +('4', '38', '9', '12189', '1013', '0'), +('4', '38', '9', '4834', '992', '0'), +('4', '38', '9', '4894', '531', '0'), +('4', '38', '15', '14707', '1050', '0'), +('4', '38', '15', '10366', '827', '0'), +('4', '38', '15', '30360', '700', '0'), +('4', '38', '15', '14679', '610', '0'), +('4', '38', '20', '11601', '7141', '0'), +('4', '38', '20', '1365', '4200', '0'), +('4', '38', '20', '2916', '3954', '0'), +('4', '38', '20', '2471', '3248', '0'), +('4', '38', '12', '20655', '1167', '0'), +('4', '38', '12', '11624', '1157', '0'), +('4', '38', '12', '4895', '995', '0'), +('4', '38', '12', '2923', '848', '0'), +('4', '38', '18', '4896', '786', '0'), +('4', '38', '18', '4412', '694', '0'), +('4', '38', '18', '4836', '637', '0'), +('4', '38', '18', '3191', '460', '0'), +('4', '38', '19', '4837', '1386', '0'), +('4', '38', '19', '68239', '829', '0'), +('4', '38', '19', '4897', '786', '0'), +('4', '38', '19', '4407', '504', '0'), +('4', '38', '13', '27732', '36750', '0'), +('4', '38', '13', '11663', '29640', '0'), +('4', '38', '13', '6952', '29205', '0'), +('4', '38', '13', '7257', '28921', '0'), +('4', '38', '14', '27732', '36750', '0'), +('4', '38', '14', '6952', '29205', '0'), +('4', '38', '14', '7257', '28921', '0'), +('4', '38', '14', '5500', '27735', '0'), +('4', '38', '11', '11696', '63938', '0'), +('4', '38', '11', '8325', '53160', '0'), +('4', '38', '11', '45137', '52199', '0'), +('4', '38', '11', '8408', '51290', '0'), +('4', '39', '22', '8567', '0', '0'), +('4', '39', '22', '10323', '0', '0'), +('4', '39', '22', '66166', '0', '0'), +('4', '39', '22', '10664', '0', '0'), +('4', '39', '1', '30361', '1290', '0'), +('4', '39', '1', '14568', '844', '0'), +('4', '39', '1', '14701', '624', '0'), +('4', '39', '1', '14702', '600', '0'), +('4', '39', '2', '30363', '1450', '0'), +('4', '39', '2', '10142', '1345', '0'), +('4', '39', '2', '4341', '1323', '0'), +('4', '39', '2', '3040', '1112', '0'), +('4', '39', '3', '14705', '990', '0'), +('4', '39', '3', '14706', '990', '0'), +('4', '39', '3', '14695', '753', '0'), +('4', '39', '3', '11052', '707', '0'), +('4', '39', '5', '30362', '1340', '0'), +('4', '39', '5', '14703', '1100', '0'), +('4', '39', '5', '14567', '890', '0'), +('4', '39', '5', '68291', '774', '0'), +('4', '39', '8', '11621', '8407', '0'), +('4', '39', '8', '11603', '2045', '0'), +('4', '39', '8', '11551', '1656', '0'), +('4', '39', '8', '27731', '1481', '0'), +('4', '39', '6', '1557', '5371', '0'), +('4', '39', '6', '2714', '1665', '0'), +('4', '39', '6', '3309', '554', '0'), +('4', '39', '6', '4165', '423', '0'), +('4', '39', '17', '11623', '2062', '0'), +('4', '39', '17', '4892', '1970', '0'), +('4', '39', '17', '4832', '1750', '0'), +('4', '39', '17', '4342', '1015', '0'), +('4', '39', '7', '4833', '846', '0'), +('4', '39', '7', '4411', '694', '0'), +('4', '39', '7', '71303', '515', '0'), +('4', '39', '7', '4893', '476', '0'), +('4', '39', '9', '1541', '2096', '0'), +('4', '39', '9', '12189', '1013', '0'), +('4', '39', '9', '4834', '992', '0'), +('4', '39', '9', '4894', '539', '0'), +('4', '39', '15', '14707', '1050', '0'), +('4', '39', '15', '10366', '827', '0'), +('4', '39', '15', '30360', '700', '0'), +('4', '39', '15', '14679', '610', '0'), +('4', '39', '20', '11601', '7145', '0'), +('4', '39', '20', '1365', '4200', '0'), +('4', '39', '20', '2916', '3960', '0'), +('4', '39', '20', '2471', '3248', '0'), +('4', '39', '12', '20655', '1171', '0'), +('4', '39', '12', '11624', '1160', '0'), +('4', '39', '12', '4895', '995', '0'), +('4', '39', '12', '2923', '848', '0'), +('4', '39', '18', '4896', '792', '0'), +('4', '39', '18', '4412', '694', '0'), +('4', '39', '18', '4836', '639', '0'), +('4', '39', '18', '3191', '460', '0'), +('4', '39', '19', '4837', '1392', '0'), +('4', '39', '19', '68239', '833', '0'), +('4', '39', '19', '4897', '788', '0'), +('4', '39', '19', '4407', '514', '0'), +('4', '39', '13', '27732', '37120', '0'), +('4', '39', '13', '11663', '29940', '0'), +('4', '39', '13', '6952', '29385', '0'), +('4', '39', '13', '7257', '29161', '0'), +('4', '39', '14', '27732', '37120', '0'), +('4', '39', '14', '6952', '29385', '0'), +('4', '39', '14', '7257', '29161', '0'), +('4', '39', '14', '5500', '27915', '0'), +('4', '39', '11', '11696', '64538', '0'), +('4', '39', '11', '45137', '54627', '0'), +('4', '39', '11', '8325', '53700', '0'), +('4', '39', '11', '8408', '51770', '0'), +('4', '40', '22', '8567', '0', '0'), +('4', '40', '22', '10323', '0', '0'), +('4', '40', '22', '66166', '0', '0'), +('4', '40', '22', '10664', '0', '0'), +('4', '40', '1', '30361', '1290', '0'), +('4', '40', '1', '14568', '854', '0'), +('4', '40', '1', '14701', '624', '0'), +('4', '40', '1', '14702', '600', '0'), +('4', '40', '2', '30363', '1450', '0'), +('4', '40', '2', '10142', '1345', '0'), +('4', '40', '2', '4341', '1323', '0'), +('4', '40', '2', '3040', '1112', '0'), +('4', '40', '3', '14705', '990', '0'), +('4', '40', '3', '14706', '990', '0'), +('4', '40', '3', '14695', '761', '0'), +('4', '40', '3', '11052', '725', '0'), +('4', '40', '5', '30362', '1340', '0'), +('4', '40', '5', '14703', '1100', '0'), +('4', '40', '5', '14567', '897', '0'), +('4', '40', '5', '68291', '779', '0'), +('4', '40', '8', '11621', '8407', '0'), +('4', '40', '8', '11603', '2056', '0'), +('4', '40', '8', '11551', '1656', '0'), +('4', '40', '8', '27731', '1489', '0'), +('4', '40', '6', '1557', '5371', '0'), +('4', '40', '6', '2714', '1675', '0'), +('4', '40', '6', '3309', '554', '0'), +('4', '40', '6', '4165', '423', '0'), +('4', '40', '17', '11623', '2062', '0'), +('4', '40', '17', '4892', '1986', '0'), +('4', '40', '17', '4832', '1756', '0'), +('4', '40', '17', '4342', '1027', '0'), +('4', '40', '7', '4833', '846', '0'), +('4', '40', '7', '4411', '694', '0'), +('4', '40', '7', '71303', '519', '0'), +('4', '40', '7', '4893', '476', '0'), +('4', '40', '9', '1541', '2108', '0'), +('4', '40', '9', '12189', '1013', '0'), +('4', '40', '9', '4834', '992', '0'), +('4', '40', '9', '4894', '548', '0'), +('4', '40', '15', '14707', '1050', '0'), +('4', '40', '15', '10366', '827', '0'), +('4', '40', '15', '30360', '700', '0'), +('4', '40', '15', '14679', '610', '0'), +('4', '40', '20', '11601', '7149', '0'), +('4', '40', '20', '1365', '4200', '0'), +('4', '40', '20', '2916', '3966', '0'), +('4', '40', '20', '2471', '3248', '0'), +('4', '40', '12', '20655', '1174', '0'), +('4', '40', '12', '11624', '1163', '0'), +('4', '40', '12', '4895', '995', '0'), +('4', '40', '12', '2923', '848', '0'), +('4', '40', '18', '4896', '798', '0'), +('4', '40', '18', '4412', '694', '0'), +('4', '40', '18', '4836', '641', '0'), +('4', '40', '18', '3191', '460', '0'), +('4', '40', '19', '4837', '1398', '0'), +('4', '40', '19', '68239', '836', '0'), +('4', '40', '19', '4897', '790', '0'), +('4', '40', '19', '4407', '525', '0'), +('4', '40', '13', '27732', '37490', '0'), +('4', '40', '13', '11663', '30180', '0'), +('4', '40', '13', '6952', '29565', '0'), +('4', '40', '13', '7257', '29461', '0'), +('4', '40', '14', '27732', '37490', '0'), +('4', '40', '14', '6952', '29565', '0'), +('4', '40', '14', '7257', '29461', '0'), +('4', '40', '14', '5500', '28095', '0'), +('4', '40', '11', '11696', '65138', '0'), +('4', '40', '11', '45137', '56275', '0'), +('4', '40', '11', '8325', '54180', '0'), +('4', '40', '11', '8408', '52250', '0'), +('4', '41', '22', '8567', '0', '0'), +('4', '41', '22', '10323', '0', '0'), +('4', '41', '22', '66166', '0', '0'), +('4', '41', '22', '10664', '0', '0'), +('4', '41', '1', '30361', '1290', '0'), +('4', '41', '1', '14568', '864', '0'), +('4', '41', '1', '14701', '624', '0'), +('4', '41', '1', '14702', '600', '0'), +('4', '41', '2', '30363', '1450', '0'), +('4', '41', '2', '10142', '1345', '0'), +('4', '41', '2', '4341', '1323', '0'), +('4', '41', '2', '3040', '1112', '0'), +('4', '41', '3', '14705', '990', '0'), +('4', '41', '3', '14706', '990', '0'), +('4', '41', '3', '14695', '769', '0'), +('4', '41', '3', '11052', '743', '0'), +('4', '41', '5', '30362', '1340', '0'), +('4', '41', '5', '14703', '1100', '0'), +('4', '41', '5', '14567', '905', '0'), +('4', '41', '5', '68291', '784', '0'), +('4', '41', '8', '11621', '8407', '0'), +('4', '41', '8', '11603', '2067', '0'), +('4', '41', '8', '11551', '1656', '0'), +('4', '41', '8', '27731', '1498', '0'), +('4', '41', '6', '1557', '5371', '0'), +('4', '41', '6', '2714', '1685', '0'), +('4', '41', '6', '3309', '554', '0'), +('4', '41', '6', '4165', '423', '0'), +('4', '41', '17', '11623', '2062', '0'), +('4', '41', '17', '4892', '2002', '0'), +('4', '41', '17', '4832', '1763', '0'), +('4', '41', '17', '4342', '1039', '0'), +('4', '41', '7', '4833', '846', '0'), +('4', '41', '7', '4411', '694', '0'), +('4', '41', '7', '71303', '522', '0'), +('4', '41', '7', '4893', '476', '0'), +('4', '41', '9', '1541', '2120', '0'), +('4', '41', '9', '12189', '1013', '0'), +('4', '41', '9', '4834', '992', '0'), +('4', '41', '9', '4894', '556', '0'), +('4', '41', '15', '14707', '1050', '0'), +('4', '41', '15', '10366', '827', '0'), +('4', '41', '15', '30360', '700', '0'), +('4', '41', '15', '14679', '610', '0'), +('4', '41', '20', '11601', '7154', '0'), +('4', '41', '20', '1365', '4200', '0'), +('4', '41', '20', '2916', '3972', '0'), +('4', '41', '20', '2471', '3248', '0'), +('4', '41', '12', '20655', '1177', '0'), +('4', '41', '12', '11624', '1166', '0'), +('4', '41', '12', '4895', '995', '0'), +('4', '41', '12', '2923', '848', '0'), +('4', '41', '18', '4896', '804', '0'), +('4', '41', '18', '4412', '694', '0'), +('4', '41', '18', '4836', '643', '0'), +('4', '41', '18', '3191', '460', '0'), +('4', '41', '19', '4837', '1404', '0'), +('4', '41', '19', '68239', '840', '0'), +('4', '41', '19', '4897', '793', '0'), +('4', '41', '19', '4407', '536', '0'), +('4', '41', '13', '27732', '37799', '0'), +('4', '41', '13', '11663', '30480', '0'), +('4', '41', '13', '7257', '29761', '0'), +('4', '41', '13', '6952', '29685', '0'), +('4', '41', '14', '27732', '37799', '0'), +('4', '41', '14', '7257', '29761', '0'), +('4', '41', '14', '6952', '29685', '0'), +('4', '41', '14', '5500', '28335', '0'), +('4', '41', '11', '11696', '65738', '0'), +('4', '41', '11', '45137', '58523', '0'), +('4', '41', '11', '8325', '54720', '0'), +('4', '41', '11', '8408', '52730', '0'), +('4', '42', '22', '8567', '0', '0'), +('4', '42', '22', '10323', '0', '0'), +('4', '42', '22', '66166', '0', '0'), +('4', '42', '22', '10664', '0', '0'), +('4', '42', '1', '30361', '1290', '0'), +('4', '42', '1', '14568', '873', '0'), +('4', '42', '1', '14701', '624', '0'), +('4', '42', '1', '14702', '600', '0'), +('4', '42', '2', '30363', '1450', '0'), +('4', '42', '2', '10142', '1345', '0'), +('4', '42', '2', '4341', '1323', '0'), +('4', '42', '2', '3040', '1112', '0'), +('4', '42', '3', '14705', '990', '0'), +('4', '42', '3', '14706', '990', '0'), +('4', '42', '3', '14695', '778', '0'), +('4', '42', '3', '11052', '761', '0'), +('4', '42', '5', '30362', '1340', '0'), +('4', '42', '5', '14703', '1100', '0'), +('4', '42', '5', '14567', '913', '0'), +('4', '42', '5', '68291', '789', '0'), +('4', '42', '8', '11621', '8407', '0'), +('4', '42', '8', '11603', '2077', '0'), +('4', '42', '8', '11551', '1656', '0'), +('4', '42', '8', '27731', '1506', '0'), +('4', '42', '6', '1557', '5371', '0'), +('4', '42', '6', '2714', '1694', '0'), +('4', '42', '6', '3309', '554', '0'), +('4', '42', '6', '4165', '423', '0'), +('4', '42', '17', '11623', '2062', '0'), +('4', '42', '17', '4892', '2017', '0'), +('4', '42', '17', '4832', '1769', '0'), +('4', '42', '17', '4342', '1051', '0'), +('4', '42', '7', '4833', '846', '0'), +('4', '42', '7', '4411', '694', '0'), +('4', '42', '7', '71303', '526', '0'), +('4', '42', '7', '4893', '476', '0'), +('4', '42', '9', '1541', '2132', '0'), +('4', '42', '9', '12189', '1013', '0'), +('4', '42', '9', '4834', '992', '0'), +('4', '42', '9', '4894', '564', '0'), +('4', '42', '15', '14707', '1050', '0'), +('4', '42', '15', '10366', '827', '0'), +('4', '42', '15', '30360', '700', '0'), +('4', '42', '15', '14679', '610', '0'), +('4', '42', '20', '11601', '7158', '0'), +('4', '42', '20', '1365', '4200', '0'), +('4', '42', '20', '2916', '3978', '0'), +('4', '42', '20', '2471', '3248', '0'), +('4', '42', '12', '20655', '1180', '0'), +('4', '42', '12', '11624', '1169', '0'), +('4', '42', '12', '4895', '995', '0'), +('4', '42', '12', '2923', '848', '0'), +('4', '42', '18', '4896', '810', '0'), +('4', '42', '18', '4412', '694', '0'), +('4', '42', '18', '4836', '645', '0'), +('4', '42', '18', '3191', '460', '0'), +('4', '42', '19', '4837', '1410', '0'), +('4', '42', '19', '68239', '843', '0'), +('4', '42', '19', '4897', '795', '0'), +('4', '42', '19', '4407', '547', '0'), +('4', '42', '13', '27732', '38169', '0'), +('4', '42', '13', '11663', '30780', '0'), +('4', '42', '13', '7257', '30001', '0'), +('4', '42', '13', '6952', '29865', '0'), +('4', '42', '14', '27732', '38169', '0'), +('4', '42', '14', '7257', '30001', '0'), +('4', '42', '14', '6952', '29865', '0'), +('4', '42', '14', '5500', '28515', '0'), +('4', '42', '11', '11696', '66338', '0'), +('4', '42', '11', '45137', '60471', '0'), +('4', '42', '11', '8325', '55200', '0'), +('4', '42', '11', '8408', '53210', '0'), +('4', '43', '22', '8567', '0', '0'), +('4', '43', '22', '10323', '0', '0'), +('4', '43', '22', '66166', '0', '0'), +('4', '43', '22', '10664', '0', '0'), +('4', '43', '1', '30361', '1290', '0'), +('4', '43', '1', '14568', '883', '0'), +('4', '43', '1', '14701', '624', '0'), +('4', '43', '1', '14702', '600', '0'), +('4', '43', '2', '30363', '1450', '0'), +('4', '43', '2', '10142', '1345', '0'), +('4', '43', '2', '4341', '1323', '0'), +('4', '43', '2', '3040', '1112', '0'), +('4', '43', '3', '14705', '990', '0'), +('4', '43', '3', '14706', '990', '0'), +('4', '43', '3', '14695', '786', '0'), +('4', '43', '3', '11052', '779', '0'), +('4', '43', '5', '30362', '1340', '0'), +('4', '43', '5', '14703', '1100', '0'), +('4', '43', '5', '14567', '920', '0'), +('4', '43', '5', '68291', '794', '0'), +('4', '43', '8', '11621', '8407', '0'), +('4', '43', '8', '11603', '2088', '0'), +('4', '43', '8', '11551', '1656', '0'), +('4', '43', '8', '27731', '1515', '0'), +('4', '43', '6', '1557', '5371', '0'), +('4', '43', '6', '2714', '1704', '0'), +('4', '43', '6', '3309', '554', '0'), +('4', '43', '6', '4165', '423', '0'), +('4', '43', '17', '11623', '2062', '0'), +('4', '43', '17', '4892', '2033', '0'), +('4', '43', '17', '4832', '1775', '0'), +('4', '43', '17', '4342', '1063', '0'), +('4', '43', '7', '4833', '846', '0'), +('4', '43', '7', '4411', '694', '0'), +('4', '43', '7', '71303', '530', '0'), +('4', '43', '7', '4893', '476', '0'), +('4', '43', '9', '1541', '2144', '0'), +('4', '43', '9', '12189', '1013', '0'), +('4', '43', '9', '4834', '992', '0'), +('4', '43', '9', '4894', '572', '0'), +('4', '43', '15', '14707', '1050', '0'), +('4', '43', '15', '10366', '827', '0'), +('4', '43', '15', '30360', '700', '0'), +('4', '43', '15', '14679', '610', '0'), +('4', '43', '20', '11601', '7162', '0'), +('4', '43', '20', '1365', '4200', '0'), +('4', '43', '20', '2916', '3984', '0'), +('4', '43', '20', '2471', '3248', '0'), +('4', '43', '12', '20655', '1184', '0'), +('4', '43', '12', '11624', '1172', '0'), +('4', '43', '12', '4895', '995', '0'), +('4', '43', '12', '2923', '848', '0'), +('4', '43', '18', '4896', '816', '0'), +('4', '43', '18', '4412', '694', '0'), +('4', '43', '18', '4836', '647', '0'), +('4', '43', '18', '3191', '460', '0'), +('4', '43', '19', '4837', '1416', '0'), +('4', '43', '19', '68239', '847', '0'), +('4', '43', '19', '4897', '797', '0'), +('4', '43', '19', '4407', '558', '0'), +('4', '43', '13', '27732', '38539', '0'), +('4', '43', '13', '11663', '31020', '0'), +('4', '43', '13', '7257', '30301', '0'), +('4', '43', '13', '6952', '30045', '0'), +('4', '43', '14', '27732', '38539', '0'), +('4', '43', '14', '7257', '30301', '0'), +('4', '43', '14', '6952', '30045', '0'), +('4', '43', '14', '5500', '28695', '0'), +('4', '43', '11', '11696', '66938', '0'), +('4', '43', '11', '45137', '62179', '0'), +('4', '43', '11', '8325', '55740', '0'), +('4', '43', '11', '8408', '53690', '0'), +('4', '44', '22', '8567', '0', '0'), +('4', '44', '22', '10323', '0', '0'), +('4', '44', '22', '66166', '0', '0'), +('4', '44', '22', '10664', '0', '0'), +('4', '44', '1', '30361', '1290', '0'), +('4', '44', '1', '14568', '893', '0'), +('4', '44', '1', '14701', '624', '0'), +('4', '44', '1', '14702', '600', '0'), +('4', '44', '2', '30363', '1450', '0'), +('4', '44', '2', '10142', '1345', '0'), +('4', '44', '2', '4341', '1323', '0'), +('4', '44', '2', '3040', '1112', '0'), +('4', '44', '3', '14705', '990', '0'), +('4', '44', '3', '14706', '990', '0'), +('4', '44', '3', '11052', '797', '0'), +('4', '44', '3', '14695', '795', '0'), +('4', '44', '5', '30362', '1340', '0'), +('4', '44', '5', '14703', '1100', '0'), +('4', '44', '5', '14567', '928', '0'), +('4', '44', '5', '68291', '799', '0'), +('4', '44', '8', '11621', '8407', '0'), +('4', '44', '8', '11603', '2099', '0'), +('4', '44', '8', '11551', '1656', '0'), +('4', '44', '8', '27731', '1523', '0'), +('4', '44', '6', '1557', '5371', '0'), +('4', '44', '6', '2714', '1714', '0'), +('4', '44', '6', '3309', '554', '0'), +('4', '44', '6', '4165', '423', '0'), +('4', '44', '17', '11623', '2062', '0'), +('4', '44', '17', '4892', '2049', '0'), +('4', '44', '17', '4832', '1782', '0'), +('4', '44', '17', '4342', '1075', '0'), +('4', '44', '7', '4833', '846', '0'), +('4', '44', '7', '4411', '694', '0'), +('4', '44', '7', '71303', '533', '0'), +('4', '44', '7', '4893', '476', '0'), +('4', '44', '9', '1541', '2156', '0'), +('4', '44', '9', '12189', '1013', '0'), +('4', '44', '9', '4834', '992', '0'), +('4', '44', '9', '4894', '580', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '44', '15', '14707', '1050', '0'), +('4', '44', '15', '10366', '827', '0'), +('4', '44', '15', '30360', '700', '0'), +('4', '44', '15', '14679', '610', '0'), +('4', '44', '20', '11601', '7166', '0'), +('4', '44', '20', '1365', '4200', '0'), +('4', '44', '20', '2916', '3990', '0'), +('4', '44', '20', '2471', '3248', '0'), +('4', '44', '12', '20655', '1187', '0'), +('4', '44', '12', '11624', '1175', '0'), +('4', '44', '12', '4895', '995', '0'), +('4', '44', '12', '2923', '848', '0'), +('4', '44', '18', '4896', '822', '0'), +('4', '44', '18', '4412', '694', '0'), +('4', '44', '18', '4836', '649', '0'), +('4', '44', '18', '3191', '460', '0'), +('4', '44', '19', '4837', '1422', '0'), +('4', '44', '19', '68239', '851', '0'), +('4', '44', '19', '4897', '799', '0'), +('4', '44', '19', '4407', '569', '0'), +('4', '44', '13', '27732', '38848', '0'), +('4', '44', '13', '11663', '31320', '0'), +('4', '44', '13', '7257', '30541', '0'), +('4', '44', '13', '6952', '30165', '0'), +('4', '44', '14', '27732', '38848', '0'), +('4', '44', '14', '7257', '30541', '0'), +('4', '44', '14', '6952', '30165', '0'), +('4', '44', '14', '5500', '28875', '0'), +('4', '44', '11', '11696', '67538', '0'), +('4', '44', '11', '45137', '64788', '0'), +('4', '44', '11', '8325', '56220', '0'), +('4', '44', '11', '8408', '54170', '0'), +('4', '45', '22', '8567', '0', '0'), +('4', '45', '22', '10323', '0', '0'), +('4', '45', '22', '66166', '0', '0'), +('4', '45', '22', '10664', '0', '0'), +('4', '45', '1', '30361', '1290', '0'), +('4', '45', '1', '14568', '902', '0'), +('4', '45', '1', '14701', '624', '0'), +('4', '45', '1', '14702', '600', '0'), +('4', '45', '2', '30363', '1450', '0'), +('4', '45', '2', '10142', '1345', '0'), +('4', '45', '2', '4341', '1323', '0'), +('4', '45', '2', '3040', '1112', '0'), +('4', '45', '3', '14705', '990', '0'), +('4', '45', '3', '14706', '990', '0'), +('4', '45', '3', '11052', '815', '0'), +('4', '45', '3', '14695', '803', '0'), +('4', '45', '5', '30362', '1340', '0'), +('4', '45', '5', '14703', '1100', '0'), +('4', '45', '5', '14567', '936', '0'), +('4', '45', '5', '68291', '803', '0'), +('4', '45', '8', '11621', '8407', '0'), +('4', '45', '8', '11603', '2110', '0'), +('4', '45', '8', '11551', '1656', '0'), +('4', '45', '8', '27731', '1532', '0'), +('4', '45', '6', '1557', '5371', '0'), +('4', '45', '6', '2714', '1723', '0'), +('4', '45', '6', '3309', '554', '0'), +('4', '45', '6', '4165', '423', '0'), +('4', '45', '17', '4892', '2064', '0'), +('4', '45', '17', '11623', '2062', '0'), +('4', '45', '17', '4832', '1788', '0'), +('4', '45', '17', '4342', '1087', '0'), +('4', '45', '7', '4833', '846', '0'), +('4', '45', '7', '4411', '694', '0'), +('4', '45', '7', '71303', '537', '0'), +('4', '45', '7', '4893', '476', '0'), +('4', '45', '9', '1541', '2168', '0'), +('4', '45', '9', '12189', '1013', '0'), +('4', '45', '9', '4834', '992', '0'), +('4', '45', '9', '4894', '588', '0'), +('4', '45', '15', '14707', '1050', '0'), +('4', '45', '15', '10366', '827', '0'), +('4', '45', '15', '30360', '700', '0'), +('4', '45', '15', '14679', '610', '0'), +('4', '45', '20', '11601', '7171', '0'), +('4', '45', '20', '1365', '4200', '0'), +('4', '45', '20', '2916', '3996', '0'), +('4', '45', '20', '2471', '3248', '0'), +('4', '45', '12', '20655', '1190', '0'), +('4', '45', '12', '11624', '1178', '0'), +('4', '45', '12', '4895', '995', '0'), +('4', '45', '12', '2923', '848', '0'), +('4', '45', '18', '4896', '828', '0'), +('4', '45', '18', '4412', '694', '0'), +('4', '45', '18', '4836', '651', '0'), +('4', '45', '18', '3191', '460', '0'), +('4', '45', '19', '4837', '1429', '0'), +('4', '45', '19', '68239', '854', '0'), +('4', '45', '19', '4897', '801', '0'), +('4', '45', '19', '4407', '580', '0'), +('4', '45', '13', '27732', '39218', '0'), +('4', '45', '13', '11663', '31620', '0'), +('4', '45', '13', '7257', '30841', '0'), +('4', '45', '13', '6952', '30345', '0'), +('4', '45', '14', '27732', '39218', '0'), +('4', '45', '14', '7257', '30841', '0'), +('4', '45', '14', '6952', '30345', '0'), +('4', '45', '14', '5500', '29055', '0'), +('4', '45', '11', '11696', '68138', '0'), +('4', '45', '11', '45137', '66556', '0'), +('4', '45', '11', '8325', '56760', '0'), +('4', '45', '11', '8408', '54650', '0'), +('4', '46', '22', '8567', '0', '0'), +('4', '46', '22', '10323', '0', '0'), +('4', '46', '22', '66166', '0', '0'), +('4', '46', '22', '10664', '0', '0'), +('4', '46', '1', '30361', '1290', '0'), +('4', '46', '1', '14568', '912', '0'), +('4', '46', '1', '14701', '624', '0'), +('4', '46', '1', '14702', '600', '0'), +('4', '46', '2', '30363', '1450', '0'), +('4', '46', '2', '10142', '1345', '0'), +('4', '46', '2', '4341', '1323', '0'), +('4', '46', '2', '3040', '1112', '0'), +('4', '46', '3', '14705', '990', '0'), +('4', '46', '3', '14706', '990', '0'), +('4', '46', '3', '11052', '834', '0'), +('4', '46', '3', '14695', '812', '0'), +('4', '46', '5', '30362', '1340', '0'), +('4', '46', '5', '14703', '1100', '0'), +('4', '46', '5', '14567', '944', '0'), +('4', '46', '5', '68291', '808', '0'), +('4', '46', '8', '11621', '8407', '0'), +('4', '46', '8', '11603', '2121', '0'), +('4', '46', '8', '11551', '1656', '0'), +('4', '46', '8', '27731', '1540', '0'), +('4', '46', '6', '1557', '5371', '0'), +('4', '46', '6', '2714', '1733', '0'), +('4', '46', '6', '3309', '554', '0'), +('4', '46', '6', '4165', '423', '0'), +('4', '46', '17', '4892', '2080', '0'), +('4', '46', '17', '11623', '2062', '0'), +('4', '46', '17', '4832', '1794', '0'), +('4', '46', '17', '4342', '1099', '0'), +('4', '46', '7', '4833', '846', '0'), +('4', '46', '7', '4411', '694', '0'), +('4', '46', '7', '71303', '540', '0'), +('4', '46', '7', '4893', '476', '0'), +('4', '46', '9', '1541', '2180', '0'), +('4', '46', '9', '12189', '1013', '0'), +('4', '46', '9', '4834', '992', '0'), +('4', '46', '9', '4894', '596', '0'), +('4', '46', '15', '14707', '1050', '0'), +('4', '46', '15', '10366', '827', '0'), +('4', '46', '15', '30360', '700', '0'), +('4', '46', '15', '14679', '610', '0'), +('4', '46', '20', '11601', '7175', '0'), +('4', '46', '20', '1365', '4200', '0'), +('4', '46', '20', '2916', '4002', '0'), +('4', '46', '20', '2471', '3248', '0'), +('4', '46', '12', '20655', '1193', '0'), +('4', '46', '12', '11624', '1181', '0'), +('4', '46', '12', '4895', '995', '0'), +('4', '46', '12', '4835', '849', '0'), +('4', '46', '18', '4896', '834', '0'), +('4', '46', '18', '4412', '694', '0'), +('4', '46', '18', '4836', '654', '0'), +('4', '46', '18', '3191', '460', '0'), +('4', '46', '19', '4837', '1435', '0'), +('4', '46', '19', '68239', '858', '0'), +('4', '46', '19', '4897', '803', '0'), +('4', '46', '19', '4407', '591', '0'), +('4', '46', '13', '27732', '42168', '0'), +('4', '46', '13', '5523', '38688', '0'), +('4', '46', '13', '11663', '34080', '0'), +('4', '46', '13', '7257', '33241', '0'), +('4', '46', '14', '27732', '42168', '0'), +('4', '46', '14', '5523', '38688', '0'), +('4', '46', '14', '7257', '33241', '0'), +('4', '46', '14', '6952', '31725', '0'), +('4', '46', '11', '11696', '73358', '0'), +('4', '46', '11', '45137', '73185', '0'), +('4', '46', '11', '8325', '61140', '0'), +('4', '46', '11', '8408', '58850', '0'), +('4', '47', '22', '8567', '0', '0'), +('4', '47', '22', '10323', '0', '0'), +('4', '47', '22', '66166', '0', '0'), +('4', '47', '22', '10664', '0', '0'), +('4', '47', '1', '30361', '1290', '0'), +('4', '47', '1', '14568', '922', '0'), +('4', '47', '1', '14701', '624', '0'), +('4', '47', '1', '14702', '600', '0'), +('4', '47', '2', '30363', '1450', '0'), +('4', '47', '2', '10142', '1345', '0'), +('4', '47', '2', '4341', '1323', '0'), +('4', '47', '2', '3040', '1112', '0'), +('4', '47', '3', '14705', '990', '0'), +('4', '47', '3', '14706', '990', '0'), +('4', '47', '3', '11052', '852', '0'), +('4', '47', '3', '14695', '820', '0'), +('4', '47', '5', '30362', '1340', '0'), +('4', '47', '5', '14703', '1100', '0'), +('4', '47', '5', '14567', '951', '0'), +('4', '47', '5', '4501', '823', '0'), +('4', '47', '8', '11621', '8407', '0'), +('4', '47', '8', '11603', '2132', '0'), +('4', '47', '8', '11551', '1656', '0'), +('4', '47', '8', '27731', '1548', '0'), +('4', '47', '6', '1557', '5371', '0'), +('4', '47', '6', '2714', '1743', '0'), +('4', '47', '6', '3309', '554', '0'), +('4', '47', '6', '4165', '423', '0'), +('4', '47', '17', '4892', '2096', '0'), +('4', '47', '17', '11623', '2062', '0'), +('4', '47', '17', '4832', '1801', '0'), +('4', '47', '17', '4342', '1111', '0'), +('4', '47', '7', '4833', '846', '0'), +('4', '47', '7', '4411', '694', '0'), +('4', '47', '7', '71303', '544', '0'), +('4', '47', '7', '4893', '476', '0'), +('4', '47', '9', '1541', '2193', '0'), +('4', '47', '9', '12189', '1013', '0'), +('4', '47', '9', '4834', '992', '0'), +('4', '47', '9', '4894', '605', '0'), +('4', '47', '15', '14707', '1050', '0'), +('4', '47', '15', '10366', '827', '0'), +('4', '47', '15', '30360', '700', '0'), +('4', '47', '15', '14679', '610', '0'), +('4', '47', '20', '11601', '7179', '0'), +('4', '47', '20', '1365', '4200', '0'), +('4', '47', '20', '2916', '4008', '0'), +('4', '47', '20', '2471', '3248', '0'), +('4', '47', '12', '20655', '1197', '0'), +('4', '47', '12', '11624', '1184', '0'), +('4', '47', '12', '4895', '995', '0'), +('4', '47', '12', '4835', '851', '0'), +('4', '47', '18', '4896', '840', '0'), +('4', '47', '18', '4412', '694', '0'), +('4', '47', '18', '4836', '656', '0'), +('4', '47', '18', '2461', '462', '0'), +('4', '47', '19', '4837', '1441', '0'), +('4', '47', '19', '68239', '862', '0'), +('4', '47', '19', '4897', '805', '0'), +('4', '47', '19', '4407', '601', '0'), +('4', '47', '13', '27732', '43377', '0'), +('4', '47', '13', '5523', '39350', '0'), +('4', '47', '13', '11663', '35100', '0'), +('4', '47', '13', '7257', '34201', '0'), +('4', '47', '14', '27732', '43377', '0'), +('4', '47', '14', '5523', '39350', '0'), +('4', '47', '14', '7257', '34201', '0'), +('4', '47', '14', '6952', '32325', '0'), +('4', '47', '11', '45137', '76634', '0'), +('4', '47', '11', '11696', '75518', '0'), +('4', '47', '11', '8325', '62940', '0'), +('4', '47', '11', '8408', '60590', '0'), +('4', '48', '22', '8567', '0', '0'), +('4', '48', '22', '10323', '0', '0'), +('4', '48', '22', '66166', '0', '0'), +('4', '48', '22', '10664', '0', '0'), +('4', '48', '1', '30361', '1290', '0'), +('4', '48', '1', '14568', '931', '0'), +('4', '48', '1', '14701', '624', '0'), +('4', '48', '1', '14702', '600', '0'), +('4', '48', '2', '30363', '1450', '0'), +('4', '48', '2', '10142', '1345', '0'), +('4', '48', '2', '4341', '1323', '0'), +('4', '48', '2', '3040', '1112', '0'), +('4', '48', '3', '14705', '990', '0'), +('4', '48', '3', '14706', '990', '0'), +('4', '48', '3', '11052', '870', '0'), +('4', '48', '3', '14695', '829', '0'), +('4', '48', '5', '30362', '1340', '0'), +('4', '48', '5', '14703', '1100', '0'), +('4', '48', '5', '14567', '959', '0'), +('4', '48', '5', '4501', '838', '0'), +('4', '48', '8', '11621', '8407', '0'), +('4', '48', '8', '11603', '2143', '0'), +('4', '48', '8', '11551', '1656', '0'), +('4', '48', '8', '27731', '1557', '0'), +('4', '48', '6', '1557', '5371', '0'), +('4', '48', '6', '2714', '1752', '0'), +('4', '48', '6', '3309', '554', '0'), +('4', '48', '6', '4165', '423', '0'), +('4', '48', '17', '4892', '2111', '0'), +('4', '48', '17', '11623', '2062', '0'), +('4', '48', '17', '4832', '1807', '0'), +('4', '48', '17', '4342', '1123', '0'), +('4', '48', '7', '4833', '846', '0'), +('4', '48', '7', '4411', '694', '0'), +('4', '48', '7', '71303', '548', '0'), +('4', '48', '7', '4893', '476', '0'), +('4', '48', '9', '1541', '2205', '0'), +('4', '48', '9', '12189', '1013', '0'), +('4', '48', '9', '4834', '992', '0'), +('4', '48', '9', '4894', '613', '0'), +('4', '48', '15', '14707', '1050', '0'), +('4', '48', '15', '10366', '827', '0'), +('4', '48', '15', '30360', '700', '0'), +('4', '48', '15', '14679', '610', '0'), +('4', '48', '20', '11601', '7183', '0'), +('4', '48', '20', '1365', '4200', '0'), +('4', '48', '20', '2916', '4014', '0'), +('4', '48', '20', '2471', '3248', '0'), +('4', '48', '12', '20655', '1200', '0'), +('4', '48', '12', '11624', '1187', '0'), +('4', '48', '12', '4895', '995', '0'), +('4', '48', '12', '4835', '853', '0'), +('4', '48', '18', '4896', '846', '0'), +('4', '48', '18', '4412', '694', '0'), +('4', '48', '18', '4836', '658', '0'), +('4', '48', '18', '2461', '466', '0'), +('4', '48', '19', '4837', '1447', '0'), +('4', '48', '19', '68239', '865', '0'), +('4', '48', '19', '4897', '807', '0'), +('4', '48', '19', '4407', '612', '0'), +('4', '48', '13', '27732', '44587', '0'), +('4', '48', '13', '5523', '40071', '0'), +('4', '48', '13', '11663', '36060', '0'), +('4', '48', '13', '7257', '35161', '0'), +('4', '48', '14', '27732', '44587', '0'), +('4', '48', '14', '5523', '40071', '0'), +('4', '48', '14', '7257', '35161', '0'), +('4', '48', '14', '6952', '32925', '0'), +('4', '48', '11', '45137', '81163', '0'), +('4', '48', '11', '11696', '77678', '0'), +('4', '48', '11', '8325', '64740', '0'), +('4', '48', '11', '8408', '62330', '0'), +('4', '49', '22', '8567', '0', '0'), +('4', '49', '22', '10323', '0', '0'), +('4', '49', '22', '66166', '0', '0'), +('4', '49', '22', '10664', '0', '0'), +('4', '49', '1', '30361', '1290', '0'), +('4', '49', '1', '14568', '941', '0'), +('4', '49', '1', '14701', '624', '0'), +('4', '49', '1', '14702', '600', '0'), +('4', '49', '2', '30363', '1450', '0'), +('4', '49', '2', '10142', '1345', '0'), +('4', '49', '2', '4341', '1323', '0'), +('4', '49', '2', '3040', '1112', '0'), +('4', '49', '3', '14705', '990', '0'), +('4', '49', '3', '14706', '990', '0'), +('4', '49', '3', '11052', '888', '0'), +('4', '49', '3', '14695', '837', '0'), +('4', '49', '5', '30362', '1340', '0'), +('4', '49', '5', '14703', '1100', '0'), +('4', '49', '5', '14567', '967', '0'), +('4', '49', '5', '4501', '854', '0'), +('4', '49', '8', '11621', '8407', '0'), +('4', '49', '8', '11603', '2154', '0'), +('4', '49', '8', '11551', '1656', '0'), +('4', '49', '8', '27731', '1565', '0'), +('4', '49', '6', '1557', '5371', '0'), +('4', '49', '6', '2714', '1762', '0'), +('4', '49', '6', '3309', '554', '0'), +('4', '49', '6', '4165', '423', '0'), +('4', '49', '17', '4892', '2127', '0'), +('4', '49', '17', '11623', '2062', '0'), +('4', '49', '17', '4832', '1814', '0'), +('4', '49', '17', '4342', '1136', '0'), +('4', '49', '7', '4833', '846', '0'), +('4', '49', '7', '4411', '694', '0'), +('4', '49', '7', '71303', '551', '0'), +('4', '49', '7', '4893', '476', '0'), +('4', '49', '9', '1541', '2217', '0'), +('4', '49', '9', '12189', '1013', '0'), +('4', '49', '9', '4834', '992', '0'), +('4', '49', '9', '4894', '621', '0'), +('4', '49', '15', '14707', '1050', '0'), +('4', '49', '15', '10366', '827', '0'), +('4', '49', '15', '30360', '700', '0'), +('4', '49', '15', '14679', '610', '0'), +('4', '49', '20', '11601', '7188', '0'), +('4', '49', '20', '1365', '4200', '0'), +('4', '49', '20', '2916', '4020', '0'), +('4', '49', '20', '2471', '3248', '0'), +('4', '49', '12', '20655', '1203', '0'), +('4', '49', '12', '11624', '1190', '0'), +('4', '49', '12', '4895', '995', '0'), +('4', '49', '12', '4835', '855', '0'), +('4', '49', '18', '4896', '852', '0'), +('4', '49', '18', '4412', '694', '0'), +('4', '49', '18', '4836', '660', '0'), +('4', '49', '18', '2461', '471', '0'), +('4', '49', '19', '4837', '1453', '0'), +('4', '49', '19', '68239', '869', '0'), +('4', '49', '19', '4897', '809', '0'), +('4', '49', '19', '4407', '623', '0'), +('4', '49', '13', '27732', '45797', '0'), +('4', '49', '13', '5523', '40733', '0'), +('4', '49', '13', '11663', '37080', '0'), +('4', '49', '13', '7257', '36121', '0'), +('4', '49', '14', '27732', '45797', '0'), +('4', '49', '14', '5523', '40733', '0'), +('4', '49', '14', '7257', '36121', '0'), +('4', '49', '14', '6952', '33465', '0'), +('4', '49', '11', '45137', '84732', '0'), +('4', '49', '11', '11696', '79778', '0'), +('4', '49', '11', '8325', '66540', '0'), +('4', '49', '11', '8408', '64010', '0'), +('4', '50', '22', '8567', '0', '0'), +('4', '50', '22', '10323', '0', '0'), +('4', '50', '22', '66166', '0', '0'), +('4', '50', '22', '10664', '0', '0'), +('4', '50', '1', '30361', '1290', '0'), +('4', '50', '1', '14568', '951', '0'), +('4', '50', '1', '14701', '624', '0'), +('4', '50', '1', '14702', '600', '0'), +('4', '50', '2', '30363', '1450', '0'), +('4', '50', '2', '10142', '1345', '0'), +('4', '50', '2', '4341', '1323', '0'), +('4', '50', '2', '3040', '1112', '0'), +('4', '50', '3', '14705', '990', '0'), +('4', '50', '3', '14706', '990', '0'), +('4', '50', '3', '11052', '906', '0'), +('4', '50', '3', '14695', '846', '0'), +('4', '50', '5', '30362', '1340', '0'), +('4', '50', '5', '14703', '1100', '0'), +('4', '50', '5', '14567', '975', '0'), +('4', '50', '5', '4501', '870', '0'), +('4', '50', '8', '11621', '8407', '0'), +('4', '50', '8', '11603', '2164', '0'), +('4', '50', '8', '11551', '1656', '0'), +('4', '50', '8', '27731', '1574', '0'), +('4', '50', '6', '1557', '5371', '0'), +('4', '50', '6', '2714', '1772', '0'), +('4', '50', '6', '3309', '554', '0'), +('4', '50', '6', '4165', '423', '0'), +('4', '50', '17', '4892', '2143', '0'), +('4', '50', '17', '11623', '2062', '0'), +('4', '50', '17', '4832', '1820', '0'), +('4', '50', '17', '4342', '1148', '0'), +('4', '50', '7', '4833', '846', '0'), +('4', '50', '7', '4411', '694', '0'), +('4', '50', '7', '71303', '555', '0'), +('4', '50', '7', '4893', '476', '0'), +('4', '50', '9', '1541', '2229', '0'), +('4', '50', '9', '12189', '1013', '0'), +('4', '50', '9', '4834', '992', '0'), +('4', '50', '9', '4894', '629', '0'), +('4', '50', '15', '14707', '1050', '0'), +('4', '50', '15', '10366', '827', '0'), +('4', '50', '15', '30360', '700', '0'), +('4', '50', '15', '14679', '610', '0'), +('4', '50', '20', '11601', '7192', '0'), +('4', '50', '20', '1365', '4200', '0'), +('4', '50', '20', '2916', '4026', '0'), +('4', '50', '20', '2471', '3248', '0'), +('4', '50', '12', '20655', '1206', '0'), +('4', '50', '12', '11624', '1193', '0'), +('4', '50', '12', '4895', '995', '0'), +('4', '50', '12', '4835', '857', '0'), +('4', '50', '18', '4896', '858', '0'), +('4', '50', '18', '4412', '694', '0'), +('4', '50', '18', '4836', '662', '0'), +('4', '50', '18', '2461', '476', '0'), +('4', '50', '19', '4837', '1459', '0'), +('4', '50', '19', '68239', '872', '0'), +('4', '50', '19', '4897', '812', '0'), +('4', '50', '19', '4407', '634', '0'), +('4', '50', '13', '27732', '47006', '0'), +('4', '50', '13', '5523', '41395', '0'), +('4', '50', '13', '11663', '38100', '0'), +('4', '50', '13', '7257', '37141', '0'), +('4', '50', '14', '27732', '47006', '0'), +('4', '50', '14', '5523', '41395', '0'), +('4', '50', '14', '7257', '37141', '0'), +('4', '50', '14', '6952', '34065', '0'), +('4', '50', '11', '45137', '88781', '0'), +('4', '50', '11', '11696', '81938', '0'), +('4', '50', '11', '8325', '68340', '0'), +('4', '50', '11', '8408', '65750', '0'), +('4', '51', '22', '8567', '0', '0'), +('4', '51', '22', '10323', '0', '0'), +('4', '51', '22', '66166', '0', '0'), +('4', '51', '22', '10664', '0', '0'), +('4', '51', '1', '30361', '1290', '0'), +('4', '51', '1', '14568', '960', '0'), +('4', '51', '1', '14701', '624', '0'), +('4', '51', '1', '14702', '600', '0'), +('4', '51', '2', '30363', '1450', '0'), +('4', '51', '2', '10142', '1345', '0'), +('4', '51', '2', '4341', '1323', '0'), +('4', '51', '2', '3040', '1112', '0'), +('4', '51', '3', '14705', '990', '0'), +('4', '51', '3', '14706', '990', '0'), +('4', '51', '3', '11052', '924', '0'), +('4', '51', '3', '14695', '854', '0'), +('4', '51', '5', '30362', '1340', '0'), +('4', '51', '5', '14703', '1100', '0'), +('4', '51', '5', '14567', '982', '0'), +('4', '51', '5', '4501', '885', '0'), +('4', '51', '8', '11621', '8407', '0'), +('4', '51', '8', '11603', '2175', '0'), +('4', '51', '8', '11551', '1656', '0'), +('4', '51', '8', '27731', '1582', '0'), +('4', '51', '6', '1557', '5371', '0'), +('4', '51', '6', '2714', '1781', '0'), +('4', '51', '6', '3309', '554', '0'), +('4', '51', '6', '4165', '423', '0'), +('4', '51', '17', '4892', '2159', '0'), +('4', '51', '17', '11623', '2062', '0'), +('4', '51', '17', '4832', '1826', '0'), +('4', '51', '17', '4342', '1160', '0'), +('4', '51', '7', '4833', '846', '0'), +('4', '51', '7', '4411', '694', '0'), +('4', '51', '7', '71303', '559', '0'), +('4', '51', '7', '4893', '476', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '51', '9', '1541', '2241', '0'), +('4', '51', '9', '12189', '1013', '0'), +('4', '51', '9', '4834', '992', '0'), +('4', '51', '9', '4894', '637', '0'), +('4', '51', '15', '14707', '1050', '0'), +('4', '51', '15', '10366', '827', '0'), +('4', '51', '15', '30360', '700', '0'), +('4', '51', '15', '14679', '610', '0'), +('4', '51', '20', '11601', '7196', '0'), +('4', '51', '20', '1365', '4200', '0'), +('4', '51', '20', '2916', '4033', '0'), +('4', '51', '20', '2471', '3248', '0'), +('4', '51', '12', '20655', '1210', '0'), +('4', '51', '12', '11624', '1196', '0'), +('4', '51', '12', '4895', '995', '0'), +('4', '51', '12', '4835', '859', '0'), +('4', '51', '18', '4896', '864', '0'), +('4', '51', '18', '4412', '694', '0'), +('4', '51', '18', '4836', '664', '0'), +('4', '51', '18', '2461', '481', '0'), +('4', '51', '19', '4837', '1465', '0'), +('4', '51', '19', '68239', '876', '0'), +('4', '51', '19', '4897', '814', '0'), +('4', '51', '19', '4407', '645', '0'), +('4', '51', '13', '27732', '48216', '0'), +('4', '51', '13', '27961', '47088', '0'), +('4', '51', '13', '5523', '42056', '0'), +('4', '51', '13', '11663', '39120', '0'), +('4', '51', '14', '27732', '48216', '0'), +('4', '51', '14', '5523', '42056', '0'), +('4', '51', '14', '7257', '38101', '0'), +('4', '51', '14', '6692', '34711', '0'), +('4', '51', '11', '45137', '92530', '0'), +('4', '51', '11', '11696', '84098', '0'), +('4', '51', '11', '8325', '70140', '0'), +('4', '51', '11', '8408', '67490', '0'), +('4', '52', '22', '8567', '0', '0'), +('4', '52', '22', '10323', '0', '0'), +('4', '52', '22', '66166', '0', '0'), +('4', '52', '22', '10664', '0', '0'), +('4', '52', '1', '30361', '1290', '0'), +('4', '52', '1', '14568', '970', '0'), +('4', '52', '1', '14701', '624', '0'), +('4', '52', '1', '14702', '600', '0'), +('4', '52', '2', '30363', '1450', '0'), +('4', '52', '2', '10142', '1345', '0'), +('4', '52', '2', '4341', '1323', '0'), +('4', '52', '2', '3040', '1112', '0'), +('4', '52', '3', '14705', '990', '0'), +('4', '52', '3', '14706', '990', '0'), +('4', '52', '3', '11052', '942', '0'), +('4', '52', '3', '14695', '863', '0'), +('4', '52', '5', '30362', '1340', '0'), +('4', '52', '5', '14703', '1100', '0'), +('4', '52', '5', '14567', '990', '0'), +('4', '52', '5', '4501', '901', '0'), +('4', '52', '8', '11621', '8407', '0'), +('4', '52', '8', '11603', '2186', '0'), +('4', '52', '8', '11551', '1656', '0'), +('4', '52', '8', '27731', '1591', '0'), +('4', '52', '6', '1557', '5371', '0'), +('4', '52', '6', '2714', '1791', '0'), +('4', '52', '6', '3309', '554', '0'), +('4', '52', '6', '4165', '423', '0'), +('4', '52', '17', '4892', '2174', '0'), +('4', '52', '17', '11623', '2062', '0'), +('4', '52', '17', '4832', '1833', '0'), +('4', '52', '17', '4342', '1172', '0'), +('4', '52', '7', '4833', '846', '0'), +('4', '52', '7', '4411', '694', '0'), +('4', '52', '7', '71303', '562', '0'), +('4', '52', '7', '4893', '476', '0'), +('4', '52', '9', '1541', '2253', '0'), +('4', '52', '9', '12189', '1013', '0'), +('4', '52', '9', '4834', '992', '0'), +('4', '52', '9', '4894', '645', '0'), +('4', '52', '15', '14707', '1050', '0'), +('4', '52', '15', '10366', '827', '0'), +('4', '52', '15', '30360', '700', '0'), +('4', '52', '15', '14679', '610', '0'), +('4', '52', '20', '11601', '7200', '0'), +('4', '52', '20', '1365', '4200', '0'), +('4', '52', '20', '2916', '4039', '0'), +('4', '52', '20', '2471', '3248', '0'), +('4', '52', '12', '20655', '1213', '0'), +('4', '52', '12', '11624', '1199', '0'), +('4', '52', '12', '4895', '995', '0'), +('4', '52', '12', '4835', '861', '0'), +('4', '52', '18', '4896', '870', '0'), +('4', '52', '18', '4412', '694', '0'), +('4', '52', '18', '4836', '666', '0'), +('4', '52', '18', '2461', '486', '0'), +('4', '52', '19', '4837', '1471', '0'), +('4', '52', '19', '68239', '880', '0'), +('4', '52', '19', '4897', '816', '0'), +('4', '52', '19', '4407', '656', '0'), +('4', '52', '13', '27732', '49426', '0'), +('4', '52', '13', '27961', '48290', '0'), +('4', '52', '13', '5523', '42718', '0'), +('4', '52', '13', '11663', '40080', '0'), +('4', '52', '14', '27732', '49426', '0'), +('4', '52', '14', '5523', '42718', '0'), +('4', '52', '14', '7257', '39061', '0'), +('4', '52', '14', '6692', '35551', '0'), +('4', '52', '11', '45137', '97480', '0'), +('4', '52', '11', '11696', '86198', '0'), +('4', '52', '11', '8325', '71940', '0'), +('4', '52', '11', '8408', '69170', '0'), +('4', '53', '22', '8567', '0', '0'), +('4', '53', '22', '10323', '0', '0'), +('4', '53', '22', '66166', '0', '0'), +('4', '53', '22', '10664', '0', '0'), +('4', '53', '1', '30361', '1290', '0'), +('4', '53', '1', '14568', '980', '0'), +('4', '53', '1', '14701', '624', '0'), +('4', '53', '1', '14702', '600', '0'), +('4', '53', '2', '30363', '1450', '0'), +('4', '53', '2', '10142', '1345', '0'), +('4', '53', '2', '4341', '1323', '0'), +('4', '53', '2', '3040', '1112', '0'), +('4', '53', '3', '14705', '990', '0'), +('4', '53', '3', '14706', '990', '0'), +('4', '53', '3', '11052', '960', '0'), +('4', '53', '3', '14695', '871', '0'), +('4', '53', '5', '30362', '1340', '0'), +('4', '53', '5', '14703', '1100', '0'), +('4', '53', '5', '14567', '998', '0'), +('4', '53', '5', '4501', '917', '0'), +('4', '53', '8', '11621', '8407', '0'), +('4', '53', '8', '11603', '2197', '0'), +('4', '53', '8', '11551', '1656', '0'), +('4', '53', '8', '27731', '1599', '0'), +('4', '53', '6', '1557', '5371', '0'), +('4', '53', '6', '2714', '1801', '0'), +('4', '53', '6', '3309', '554', '0'), +('4', '53', '6', '4165', '423', '0'), +('4', '53', '17', '4892', '2190', '0'), +('4', '53', '17', '11623', '2062', '0'), +('4', '53', '17', '4832', '1839', '0'), +('4', '53', '17', '4342', '1184', '0'), +('4', '53', '7', '4833', '846', '0'), +('4', '53', '7', '4411', '694', '0'), +('4', '53', '7', '71303', '566', '0'), +('4', '53', '7', '4893', '476', '0'), +('4', '53', '9', '1541', '2265', '0'), +('4', '53', '9', '12189', '1013', '0'), +('4', '53', '9', '4834', '992', '0'), +('4', '53', '9', '4894', '654', '0'), +('4', '53', '15', '14707', '1050', '0'), +('4', '53', '15', '10366', '827', '0'), +('4', '53', '15', '30360', '700', '0'), +('4', '53', '15', '14679', '610', '0'), +('4', '53', '20', '11601', '7204', '0'), +('4', '53', '20', '1365', '4200', '0'), +('4', '53', '20', '2916', '4045', '0'), +('4', '53', '20', '2471', '3248', '0'), +('4', '53', '12', '20655', '1216', '0'), +('4', '53', '12', '11624', '1202', '0'), +('4', '53', '12', '4895', '995', '0'), +('4', '53', '12', '4835', '863', '0'), +('4', '53', '18', '4896', '876', '0'), +('4', '53', '18', '4412', '694', '0'), +('4', '53', '18', '4836', '668', '0'), +('4', '53', '18', '2461', '491', '0'), +('4', '53', '19', '4837', '1477', '0'), +('4', '53', '19', '68239', '883', '0'), +('4', '53', '19', '4897', '818', '0'), +('4', '53', '19', '4407', '667', '0'), +('4', '53', '13', '27732', '50635', '0'), +('4', '53', '13', '27961', '49492', '0'), +('4', '53', '13', '5523', '43380', '0'), +('4', '53', '13', '11663', '41100', '0'), +('4', '53', '14', '27732', '50635', '0'), +('4', '53', '14', '5523', '43380', '0'), +('4', '53', '14', '7257', '40021', '0'), +('4', '53', '14', '6692', '36451', '0'), +('4', '53', '11', '45137', '101469', '0'), +('4', '53', '11', '11696', '88358', '0'), +('4', '53', '11', '8325', '73740', '0'), +('4', '53', '11', '8408', '70910', '0'), +('4', '54', '22', '8567', '0', '0'), +('4', '54', '22', '10323', '0', '0'), +('4', '54', '22', '66166', '0', '0'), +('4', '54', '22', '10664', '0', '0'), +('4', '54', '1', '30361', '1290', '0'), +('4', '54', '1', '14568', '989', '0'), +('4', '54', '1', '14701', '624', '0'), +('4', '54', '1', '14702', '600', '0'), +('4', '54', '2', '30363', '1450', '0'), +('4', '54', '2', '10142', '1345', '0'), +('4', '54', '2', '4341', '1323', '0'), +('4', '54', '2', '3040', '1112', '0'), +('4', '54', '3', '14705', '990', '0'), +('4', '54', '3', '14706', '990', '0'), +('4', '54', '3', '11052', '978', '0'), +('4', '54', '3', '14695', '879', '0'), +('4', '54', '5', '30362', '1340', '0'), +('4', '54', '5', '14703', '1100', '0'), +('4', '54', '5', '14567', '1005', '0'), +('4', '54', '5', '4501', '933', '0'), +('4', '54', '8', '11621', '8407', '0'), +('4', '54', '8', '11603', '2208', '0'), +('4', '54', '8', '11551', '1656', '0'), +('4', '54', '8', '27731', '1608', '0'), +('4', '54', '6', '1557', '5371', '0'), +('4', '54', '6', '2714', '1810', '0'), +('4', '54', '6', '3309', '554', '0'), +('4', '54', '6', '4165', '423', '0'), +('4', '54', '17', '4892', '2206', '0'), +('4', '54', '17', '11623', '2062', '0'), +('4', '54', '17', '4832', '1845', '0'), +('4', '54', '17', '4342', '1196', '0'), +('4', '54', '7', '4833', '846', '0'), +('4', '54', '7', '4411', '694', '0'), +('4', '54', '7', '71303', '569', '0'), +('4', '54', '7', '4893', '476', '0'), +('4', '54', '9', '1541', '2277', '0'), +('4', '54', '9', '12189', '1013', '0'), +('4', '54', '9', '4834', '992', '0'), +('4', '54', '9', '4894', '662', '0'), +('4', '54', '15', '14707', '1050', '0'), +('4', '54', '15', '10366', '827', '0'), +('4', '54', '15', '30360', '700', '0'), +('4', '54', '15', '14679', '610', '0'), +('4', '54', '20', '11601', '7209', '0'), +('4', '54', '20', '1365', '4200', '0'), +('4', '54', '20', '2916', '4051', '0'), +('4', '54', '20', '2471', '3248', '0'), +('4', '54', '12', '20655', '1219', '0'), +('4', '54', '12', '11624', '1205', '0'), +('4', '54', '12', '4895', '995', '0'), +('4', '54', '12', '4835', '865', '0'), +('4', '54', '18', '4896', '882', '0'), +('4', '54', '18', '4412', '694', '0'), +('4', '54', '18', '4836', '670', '0'), +('4', '54', '18', '2461', '495', '0'), +('4', '54', '19', '4837', '1483', '0'), +('4', '54', '19', '68239', '887', '0'), +('4', '54', '19', '4897', '820', '0'), +('4', '54', '19', '4407', '677', '0'), +('4', '54', '13', '27732', '51845', '0'), +('4', '54', '13', '27961', '50694', '0'), +('4', '54', '13', '5523', '44041', '0'), +('4', '54', '13', '11663', '42120', '0'), +('4', '54', '14', '27732', '51845', '0'), +('4', '54', '14', '5523', '44041', '0'), +('4', '54', '14', '7257', '40981', '0'), +('4', '54', '14', '6692', '37291', '0'), +('4', '54', '11', '45137', '105459', '0'), +('4', '54', '11', '11696', '90518', '0'), +('4', '54', '11', '8325', '75600', '0'), +('4', '54', '11', '8408', '72650', '0'), +('4', '55', '22', '8567', '0', '0'), +('4', '55', '22', '10323', '0', '0'), +('4', '55', '22', '66166', '0', '0'), +('4', '55', '22', '10664', '0', '0'), +('4', '55', '1', '30361', '1290', '0'), +('4', '55', '1', '14568', '999', '0'), +('4', '55', '1', '14701', '624', '0'), +('4', '55', '1', '14702', '600', '0'), +('4', '55', '2', '30363', '1450', '0'), +('4', '55', '2', '10142', '1345', '0'), +('4', '55', '2', '4341', '1323', '0'), +('4', '55', '2', '3040', '1112', '0'), +('4', '55', '3', '11052', '997', '0'), +('4', '55', '3', '14705', '990', '0'), +('4', '55', '3', '14706', '990', '0'), +('4', '55', '3', '14695', '888', '0'), +('4', '55', '5', '30362', '1340', '0'), +('4', '55', '5', '14703', '1100', '0'), +('4', '55', '5', '14567', '1013', '0'), +('4', '55', '5', '4501', '948', '0'), +('4', '55', '8', '11621', '8407', '0'), +('4', '55', '8', '11603', '2219', '0'), +('4', '55', '8', '11551', '1656', '0'), +('4', '55', '8', '27731', '1616', '0'), +('4', '55', '6', '1557', '5371', '0'), +('4', '55', '6', '2714', '1820', '0'), +('4', '55', '6', '3309', '554', '0'), +('4', '55', '6', '4165', '423', '0'), +('4', '55', '17', '4892', '2221', '0'), +('4', '55', '17', '11623', '2062', '0'), +('4', '55', '17', '4832', '1852', '0'), +('4', '55', '17', '4342', '1208', '0'), +('4', '55', '7', '4833', '846', '0'), +('4', '55', '7', '4411', '694', '0'), +('4', '55', '7', '71303', '573', '0'), +('4', '55', '7', '4893', '476', '0'), +('4', '55', '9', '1541', '2289', '0'), +('4', '55', '9', '12189', '1013', '0'), +('4', '55', '9', '4834', '992', '0'), +('4', '55', '9', '4894', '670', '0'), +('4', '55', '15', '14707', '1050', '0'), +('4', '55', '15', '10366', '827', '0'), +('4', '55', '15', '30360', '700', '0'), +('4', '55', '15', '14679', '610', '0'), +('4', '55', '20', '11601', '7213', '0'), +('4', '55', '20', '1365', '4200', '0'), +('4', '55', '20', '2916', '4057', '0'), +('4', '55', '20', '2471', '3248', '0'), +('4', '55', '12', '20655', '1223', '0'), +('4', '55', '12', '11624', '1208', '0'), +('4', '55', '12', '4895', '995', '0'), +('4', '55', '12', '4835', '868', '0'), +('4', '55', '18', '4896', '889', '0'), +('4', '55', '18', '4412', '694', '0'), +('4', '55', '18', '4836', '673', '0'), +('4', '55', '18', '2461', '500', '0'), +('4', '55', '19', '4837', '1489', '0'), +('4', '55', '19', '68239', '891', '0'), +('4', '55', '19', '4897', '822', '0'), +('4', '55', '19', '4407', '688', '0'), +('4', '55', '13', '27732', '53055', '0'), +('4', '55', '13', '27961', '51896', '0'), +('4', '55', '13', '5523', '44703', '0'), +('4', '55', '13', '11663', '43140', '0'), +('4', '55', '14', '27732', '53055', '0'), +('4', '55', '14', '5523', '44703', '0'), +('4', '55', '14', '7257', '42001', '0'), +('4', '55', '14', '6692', '38131', '0'), +('4', '55', '11', '45137', '109929', '0'), +('4', '55', '11', '11696', '92618', '0'), +('4', '55', '11', '8325', '77400', '0'), +('4', '55', '11', '8408', '74330', '0'), +('4', '56', '22', '8567', '0', '0'), +('4', '56', '22', '10323', '0', '0'), +('4', '56', '22', '66166', '0', '0'), +('4', '56', '22', '10664', '0', '0'), +('4', '56', '1', '30361', '1290', '0'), +('4', '56', '1', '14568', '1009', '0'), +('4', '56', '1', '14701', '624', '0'), +('4', '56', '1', '14702', '600', '0'), +('4', '56', '2', '30363', '1450', '0'), +('4', '56', '2', '10142', '1345', '0'), +('4', '56', '2', '4341', '1323', '0'), +('4', '56', '2', '3040', '1112', '0'), +('4', '56', '3', '11052', '1015', '0'), +('4', '56', '3', '14705', '990', '0'), +('4', '56', '3', '14706', '990', '0'), +('4', '56', '3', '14695', '896', '0'), +('4', '56', '5', '30362', '1340', '0'), +('4', '56', '5', '14703', '1100', '0'), +('4', '56', '5', '14567', '1021', '0'), +('4', '56', '5', '4501', '964', '0'), +('4', '56', '8', '11621', '8407', '0'), +('4', '56', '8', '11603', '2230', '0'), +('4', '56', '8', '11551', '1656', '0'), +('4', '56', '8', '27731', '1625', '0'), +('4', '56', '6', '1557', '5371', '0'), +('4', '56', '6', '2714', '1830', '0'), +('4', '56', '6', '3309', '554', '0'), +('4', '56', '6', '4165', '423', '0'), +('4', '56', '17', '4892', '2237', '0'), +('4', '56', '17', '11623', '2062', '0'), +('4', '56', '17', '4832', '1858', '0'), +('4', '56', '17', '4342', '1220', '0'), +('4', '56', '7', '4833', '846', '0'), +('4', '56', '7', '4411', '694', '0'), +('4', '56', '7', '71303', '577', '0'), +('4', '56', '7', '4893', '476', '0'), +('4', '56', '9', '1541', '2301', '0'), +('4', '56', '9', '12189', '1013', '0'), +('4', '56', '9', '4834', '992', '0'), +('4', '56', '9', '4894', '678', '0'), +('4', '56', '15', '14707', '1050', '0'), +('4', '56', '15', '10366', '827', '0'), +('4', '56', '15', '30360', '700', '0'), +('4', '56', '15', '14679', '610', '0'), +('4', '56', '20', '11601', '7217', '0'), +('4', '56', '20', '1365', '4200', '0'), +('4', '56', '20', '2916', '4063', '0'), +('4', '56', '20', '2471', '3248', '0'), +('4', '56', '12', '20655', '1226', '0'), +('4', '56', '12', '11624', '1211', '0'), +('4', '56', '12', '4895', '995', '0'), +('4', '56', '12', '4835', '870', '0'), +('4', '56', '18', '4896', '895', '0'), +('4', '56', '18', '4412', '694', '0'), +('4', '56', '18', '4836', '675', '0'), +('4', '56', '18', '2461', '505', '0'), +('4', '56', '19', '4837', '1495', '0'), +('4', '56', '19', '68239', '894', '0'), +('4', '56', '19', '4897', '824', '0'), +('4', '56', '19', '4407', '699', '0'), +('4', '56', '13', '27732', '54264', '0'), +('4', '56', '13', '27961', '53098', '0'), +('4', '56', '13', '5523', '45365', '0'), +('4', '56', '13', '11663', '44100', '0'), +('4', '56', '14', '27732', '54264', '0'), +('4', '56', '14', '5523', '45365', '0'), +('4', '56', '14', '7257', '42961', '0'), +('4', '56', '14', '6692', '38971', '0'), +('4', '56', '11', '45137', '114099', '0'), +('4', '56', '11', '11696', '94778', '0'), +('4', '56', '11', '8325', '79200', '0'), +('4', '56', '11', '8408', '76070', '0'), +('4', '57', '22', '8567', '0', '0'), +('4', '57', '22', '10323', '0', '0'), +('4', '57', '22', '66166', '0', '0'), +('4', '57', '22', '10664', '0', '0'), +('4', '57', '1', '30361', '1290', '0'), +('4', '57', '1', '14568', '1018', '0'), +('4', '57', '1', '14701', '624', '0'), +('4', '57', '1', '14702', '600', '0'), +('4', '57', '2', '30363', '1450', '0'), +('4', '57', '2', '10142', '1345', '0'), +('4', '57', '2', '4341', '1323', '0'), +('4', '57', '2', '3040', '1112', '0'), +('4', '57', '3', '11052', '1033', '0'), +('4', '57', '3', '14705', '990', '0'), +('4', '57', '3', '14706', '990', '0'), +('4', '57', '3', '14695', '905', '0'), +('4', '57', '5', '30362', '1340', '0'), +('4', '57', '5', '14703', '1100', '0'), +('4', '57', '5', '14567', '1029', '0'), +('4', '57', '5', '4501', '980', '0'), +('4', '57', '8', '11621', '8407', '0'), +('4', '57', '8', '11603', '2241', '0'), +('4', '57', '8', '11551', '1656', '0'), +('4', '57', '8', '27731', '1633', '0'), +('4', '57', '6', '1557', '5371', '0'), +('4', '57', '6', '2714', '1839', '0'), +('4', '57', '6', '3309', '554', '0'), +('4', '57', '6', '4165', '423', '0'), +('4', '57', '17', '4892', '2253', '0'), +('4', '57', '17', '11623', '2062', '0'), +('4', '57', '17', '4832', '1864', '0'), +('4', '57', '17', '4342', '1232', '0'), +('4', '57', '7', '4833', '846', '0'), +('4', '57', '7', '4411', '694', '0'), +('4', '57', '7', '71303', '580', '0'), +('4', '57', '7', '4893', '476', '0'), +('4', '57', '9', '1541', '2313', '0'), +('4', '57', '9', '12189', '1013', '0'), +('4', '57', '9', '4834', '992', '0'), +('4', '57', '9', '4894', '686', '0'), +('4', '57', '15', '14707', '1050', '0'), +('4', '57', '15', '10366', '827', '0'), +('4', '57', '15', '30360', '700', '0'), +('4', '57', '15', '14679', '610', '0'), +('4', '57', '20', '11601', '7221', '0'), +('4', '57', '20', '1365', '4200', '0'), +('4', '57', '20', '2916', '4069', '0'), +('4', '57', '20', '2471', '3248', '0'), +('4', '57', '12', '20655', '1229', '0'), +('4', '57', '12', '11624', '1213', '0'), +('4', '57', '12', '4895', '995', '0'), +('4', '57', '12', '4835', '872', '0'), +('4', '57', '18', '4896', '901', '0'), +('4', '57', '18', '4412', '694', '0'), +('4', '57', '18', '4836', '677', '0'), +('4', '57', '18', '2461', '510', '0'), +('4', '57', '19', '4837', '1501', '0'), +('4', '57', '19', '68239', '898', '0'), +('4', '57', '19', '4897', '826', '0'), +('4', '57', '19', '4407', '710', '0'), +('4', '57', '13', '27732', '55474', '0'), +('4', '57', '13', '27961', '54300', '0'), +('4', '57', '13', '5523', '46086', '0'), +('4', '57', '13', '11663', '45120', '0'), +('4', '57', '14', '27732', '55474', '0'), +('4', '57', '14', '5523', '46086', '0'), +('4', '57', '14', '7257', '43921', '0'), +('4', '57', '14', '6692', '39811', '0'), +('4', '57', '11', '45137', '120429', '0'), +('4', '57', '11', '11696', '96878', '0'), +('4', '57', '11', '8325', '81000', '0'), +('4', '57', '11', '8408', '77810', '0'), +('4', '58', '22', '8567', '0', '0'), +('4', '58', '22', '10323', '0', '0'), +('4', '58', '22', '66166', '0', '0'), +('4', '58', '22', '10664', '0', '0'), +('4', '58', '1', '30361', '1290', '0'), +('4', '58', '1', '14568', '1028', '0'), +('4', '58', '1', '14701', '624', '0'), +('4', '58', '1', '14702', '600', '0'), +('4', '58', '2', '30363', '1450', '0'), +('4', '58', '2', '10142', '1345', '0'), +('4', '58', '2', '4341', '1323', '0'), +('4', '58', '2', '3040', '1112', '0'), +('4', '58', '3', '11052', '1051', '0'), +('4', '58', '3', '14705', '990', '0'), +('4', '58', '3', '14706', '990', '0'), +('4', '58', '3', '14695', '913', '0'), +('4', '58', '5', '30362', '1340', '0'), +('4', '58', '5', '14703', '1100', '0'), +('4', '58', '5', '14567', '1036', '0'), +('4', '58', '5', '4501', '995', '0'), +('4', '58', '8', '11621', '8407', '0'), +('4', '58', '8', '11603', '2251', '0'), +('4', '58', '8', '11551', '1656', '0'), +('4', '58', '8', '27731', '1641', '0'), +('4', '58', '6', '1557', '5371', '0'), +('4', '58', '6', '2714', '1849', '0'), +('4', '58', '6', '3309', '554', '0'), +('4', '58', '6', '4165', '423', '0'), +('4', '58', '17', '4892', '2269', '0'), +('4', '58', '17', '11623', '2062', '0'), +('4', '58', '17', '4832', '1871', '0'), +('4', '58', '17', '4342', '1244', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '58', '7', '4833', '846', '0'), +('4', '58', '7', '4411', '694', '0'), +('4', '58', '7', '71303', '584', '0'), +('4', '58', '7', '4893', '476', '0'), +('4', '58', '9', '1541', '2325', '0'), +('4', '58', '9', '12189', '1013', '0'), +('4', '58', '9', '4834', '992', '0'), +('4', '58', '9', '4894', '694', '0'), +('4', '58', '15', '14707', '1050', '0'), +('4', '58', '15', '10366', '827', '0'), +('4', '58', '15', '30360', '700', '0'), +('4', '58', '15', '14679', '610', '0'), +('4', '58', '20', '11601', '7226', '0'), +('4', '58', '20', '1365', '4200', '0'), +('4', '58', '20', '2916', '4075', '0'), +('4', '58', '20', '2471', '3248', '0'), +('4', '58', '12', '20655', '1232', '0'), +('4', '58', '12', '11624', '1216', '0'), +('4', '58', '12', '4895', '995', '0'), +('4', '58', '12', '4835', '874', '0'), +('4', '58', '18', '4896', '907', '0'), +('4', '58', '18', '4412', '694', '0'), +('4', '58', '18', '4836', '679', '0'), +('4', '58', '18', '2461', '515', '0'), +('4', '58', '19', '4837', '1507', '0'), +('4', '58', '19', '68239', '901', '0'), +('4', '58', '19', '4897', '828', '0'), +('4', '58', '19', '4407', '721', '0'), +('4', '58', '13', '27732', '56684', '0'), +('4', '58', '13', '27961', '55503', '0'), +('4', '58', '13', '5523', '46748', '0'), +('4', '58', '13', '11663', '46140', '0'), +('4', '58', '14', '27732', '56684', '0'), +('4', '58', '14', '5523', '46748', '0'), +('4', '58', '14', '7257', '44881', '0'), +('4', '58', '14', '6692', '40651', '0'), +('4', '58', '11', '45137', '124779', '0'), +('4', '58', '11', '11696', '99038', '0'), +('4', '58', '11', '8325', '82800', '0'), +('4', '58', '11', '8408', '79490', '0'), +('4', '59', '22', '8567', '0', '0'), +('4', '59', '22', '10323', '0', '0'), +('4', '59', '22', '66166', '0', '0'), +('4', '59', '22', '10664', '0', '0'), +('4', '59', '1', '30361', '1290', '0'), +('4', '59', '1', '14568', '1038', '0'), +('4', '59', '1', '14701', '624', '0'), +('4', '59', '1', '14702', '600', '0'), +('4', '59', '2', '30363', '1450', '0'), +('4', '59', '2', '10142', '1345', '0'), +('4', '59', '2', '4341', '1323', '0'), +('4', '59', '2', '3040', '1112', '0'), +('4', '59', '3', '11052', '1069', '0'), +('4', '59', '3', '14705', '990', '0'), +('4', '59', '3', '14706', '990', '0'), +('4', '59', '3', '14695', '922', '0'), +('4', '59', '5', '30362', '1340', '0'), +('4', '59', '5', '14703', '1100', '0'), +('4', '59', '5', '14567', '1044', '0'), +('4', '59', '5', '4501', '1011', '0'), +('4', '59', '8', '11621', '8407', '0'), +('4', '59', '8', '11603', '2262', '0'), +('4', '59', '8', '11551', '1656', '0'), +('4', '59', '8', '27731', '1650', '0'), +('4', '59', '6', '1557', '5371', '0'), +('4', '59', '6', '2714', '1859', '0'), +('4', '59', '6', '3309', '554', '0'), +('4', '59', '6', '4165', '423', '0'), +('4', '59', '17', '4892', '2284', '0'), +('4', '59', '17', '11623', '2062', '0'), +('4', '59', '17', '4832', '1877', '0'), +('4', '59', '17', '4342', '1256', '0'), +('4', '59', '7', '4833', '846', '0'), +('4', '59', '7', '4411', '694', '0'), +('4', '59', '7', '71303', '587', '0'), +('4', '59', '7', '4893', '476', '0'), +('4', '59', '9', '1541', '2338', '0'), +('4', '59', '9', '12189', '1013', '0'), +('4', '59', '9', '4834', '992', '0'), +('4', '59', '9', '4894', '702', '0'), +('4', '59', '15', '14707', '1050', '0'), +('4', '59', '15', '10366', '827', '0'), +('4', '59', '15', '30360', '700', '0'), +('4', '59', '15', '14679', '610', '0'), +('4', '59', '20', '11601', '7230', '0'), +('4', '59', '20', '1365', '4200', '0'), +('4', '59', '20', '2916', '4081', '0'), +('4', '59', '20', '2471', '3248', '0'), +('4', '59', '12', '20655', '1236', '0'), +('4', '59', '12', '11624', '1219', '0'), +('4', '59', '12', '4895', '995', '0'), +('4', '59', '12', '4835', '876', '0'), +('4', '59', '18', '4896', '913', '0'), +('4', '59', '18', '4412', '694', '0'), +('4', '59', '18', '4836', '681', '0'), +('4', '59', '18', '2461', '520', '0'), +('4', '59', '19', '4837', '1513', '0'), +('4', '59', '19', '68239', '905', '0'), +('4', '59', '19', '4897', '831', '0'), +('4', '59', '19', '4407', '732', '0'), +('4', '59', '13', '27732', '57893', '0'), +('4', '59', '13', '27961', '56705', '0'), +('4', '59', '13', '5523', '47410', '0'), +('4', '59', '13', '11663', '47160', '0'), +('4', '59', '14', '27732', '57893', '0'), +('4', '59', '14', '5523', '47410', '0'), +('4', '59', '14', '7257', '45901', '0'), +('4', '59', '14', '6692', '41551', '0'), +('4', '59', '11', '45137', '129670', '0'), +('4', '59', '11', '11696', '101198', '0'), +('4', '59', '11', '8325', '84600', '0'), +('4', '59', '11', '8408', '81230', '0'), +('4', '60', '22', '21807', '0', '3'), +('4', '60', '22', '21805', '0', '3'), +('4', '60', '22', '12425', '0', '3'), +('4', '60', '22', '7867', '0', '3'), +('4', '60', '1', '7945', '9159', '3'), +('4', '60', '1', '26775', '5527', '3'), +('4', '60', '1', '28962', '4283', '3'), +('4', '60', '1', '28945', '4262', '3'), +('4', '60', '2', '2612', '8158', '3'), +('4', '60', '2', '26025', '8158', '3'), +('4', '60', '2', '28995', '4775', '3'), +('4', '60', '2', '26759', '3807', '3'), +('4', '60', '3', '26773', '6200', '3'), +('4', '60', '3', '28963', '3571', '3'), +('4', '60', '3', '31233', '3235', '3'), +('4', '60', '3', '26560', '3017', '3'), +('4', '60', '5', '28885', '11028', '3'), +('4', '60', '5', '27266', '10072', '3'), +('4', '60', '5', '8364', '7900', '3'), +('4', '60', '5', '7868', '5026', '3'), +('4', '60', '8', '26766', '11746', '3'), +('4', '60', '8', '26765', '11173', '3'), +('4', '60', '8', '31471', '10080', '3'), +('4', '60', '8', '27261', '8417', '3'), +('4', '60', '6', '28902', '13010', '3'), +('4', '60', '6', '1557', '5252', '3'), +('4', '60', '6', '30551', '5025', '3'), +('4', '60', '6', '26753', '4810', '3'), +('4', '60', '17', '27261', '8417', '3'), +('4', '60', '17', '10845', '4128', '3'), +('4', '60', '17', '28951', '3505', '3'), +('4', '60', '17', '7926', '3046', '3'), +('4', '60', '7', '26771', '8536', '3'), +('4', '60', '7', '7868', '5026', '3'), +('4', '60', '7', '5854', '4531', '3'), +('4', '60', '7', '7194', '4507', '3'), +('4', '60', '9', '31461', '9984', '3'), +('4', '60', '9', '7868', '5026', '3'), +('4', '60', '9', '26584', '4273', '3'), +('4', '60', '9', '28943', '3775', '3'), +('4', '60', '15', '27950', '7608', '3'), +('4', '60', '15', '26757', '5211', '3'), +('4', '60', '15', '26749', '4778', '3'), +('4', '60', '15', '7870', '3642', '3'), +('4', '60', '20', '28890', '10662', '3'), +('4', '60', '20', '31334', '9433', '3'), +('4', '60', '20', '27963', '9259', '3'), +('4', '60', '20', '31235', '9245', '3'), +('4', '60', '12', '25857', '11076', '3'), +('4', '60', '12', '29177', '5168', '3'), +('4', '60', '12', '2746', '4856', '3'), +('4', '60', '12', '28967', '4355', '3'), +('4', '60', '18', '26750', '3777', '3'), +('4', '60', '18', '28965', '3774', '3'), +('4', '60', '18', '28932', '3226', '3'), +('4', '60', '18', '8289', '3220', '3'), +('4', '60', '19', '30569', '11872', '3'), +('4', '60', '19', '51226', '10536', '3'), +('4', '60', '19', '28888', '10276', '3'), +('4', '60', '19', '24616', '9061', '3'), +('4', '60', '13', '1158', '100699', '3'), +('4', '60', '13', '69416', '99569', '3'), +('4', '60', '13', '1154', '96311', '3'), +('4', '60', '13', '27899', '85700', '3'), +('4', '60', '14', '1158', '100699', '3'), +('4', '60', '14', '69416', '99569', '3'), +('4', '60', '14', '1154', '96311', '3'), +('4', '60', '14', '28811', '90642', '3'), +('4', '60', '11', '30539', '179487', '3'), +('4', '60', '11', '28935', '168257', '3'), +('4', '60', '11', '31335', '167996', '3'), +('4', '60', '11', '7904', '156146', '3'), +('4', '60', '22', '66166', '0', '2'), +('4', '60', '22', '10323', '0', '2'), +('4', '60', '22', '9248', '0', '2'), +('4', '60', '22', '12425', '0', '2'), +('4', '60', '1', '2748', '1876', '2'), +('4', '60', '1', '31236', '1522', '2'), +('4', '60', '1', '10912', '1501', '2'), +('4', '60', '1', '62234', '1451', '2'), +('4', '60', '2', '2612', '8232', '2'), +('4', '60', '2', '26025', '8232', '2'), +('4', '60', '2', '29648', '3944', '2'), +('4', '60', '2', '10913', '3514', '2'), +('4', '60', '3', '31233', '3577', '2'), +('4', '60', '3', '31464', '3115', '2'), +('4', '60', '3', '31244', '3082', '2'), +('4', '60', '3', '1547', '2396', '2'), +('4', '60', '5', '27266', '10286', '2'), +('4', '60', '5', '31234', '3531', '2'), +('4', '60', '5', '31460', '3453', '2'), +('4', '60', '5', '31318', '3175', '2'), +('4', '60', '8', '31471', '10374', '2'), +('4', '60', '8', '27261', '8584', '2'), +('4', '60', '8', '11621', '8196', '2'), +('4', '60', '8', '22819', '8196', '2'), +('4', '60', '6', '1557', '5272', '2'), +('4', '60', '6', '31472', '4144', '2'), +('4', '60', '6', '31240', '2841', '2'), +('4', '60', '6', '5723', '2499', '2'), +('4', '60', '17', '27261', '8584', '2'), +('4', '60', '17', '10845', '4401', '2'), +('4', '60', '17', '27159', '3145', '2'), +('4', '60', '17', '27148', '2761', '2'), +('4', '60', '7', '5723', '2499', '2'), +('4', '60', '7', '29485', '2312', '2'), +('4', '60', '7', '31381', '1908', '2'), +('4', '60', '7', '31371', '1712', '2'), +('4', '60', '9', '31461', '10318', '2'), +('4', '60', '9', '31460', '3453', '2'), +('4', '60', '9', '5723', '2499', '2'), +('4', '60', '9', '31246', '2276', '2'), +('4', '60', '15', '31231', '3565', '2'), +('4', '60', '15', '25211', '2983', '2'), +('4', '60', '15', '62373', '1901', '2'), +('4', '60', '15', '31222', '1684', '2'), +('4', '60', '20', '31334', '9760', '2'), +('4', '60', '20', '31235', '9696', '2'), +('4', '60', '20', '31353', '9235', '2'), +('4', '60', '20', '24753', '7597', '2'), +('4', '60', '12', '25857', '11331', '2'), +('4', '60', '12', '29177', '5345', '2'), +('4', '60', '12', '2746', '4913', '2'), +('4', '60', '12', '31227', '4110', '2'), +('4', '60', '18', '31371', '1712', '2'), +('4', '60', '18', '31117', '1378', '2'), +('4', '60', '18', '31374', '1338', '2'), +('4', '60', '18', '31386', '1140', '2'), +('4', '60', '19', '24616', '9168', '2'), +('4', '60', '19', '31238', '1873', '2'), +('4', '60', '19', '29455', '1434', '2'), +('4', '60', '19', '31327', '1177', '2'), +('4', '60', '13', '1158', '100839', '2'), +('4', '60', '13', '69416', '99859', '2'), +('4', '60', '13', '1154', '96471', '2'), +('4', '60', '13', '5838', '83626', '2'), +('4', '60', '14', '1158', '100839', '2'), +('4', '60', '14', '69416', '99859', '2'), +('4', '60', '14', '1154', '96471', '2'), +('4', '60', '14', '31379', '85889', '2'), +('4', '60', '11', '31335', '146338', '2'), +('4', '60', '11', '29433', '143588', '2'), +('4', '60', '11', '27326', '143588', '2'), +('4', '60', '11', '27306', '143077', '2'), +('4', '60', '22', '8567', '0', '1'), +('4', '60', '22', '10323', '0', '1'), +('4', '60', '22', '66166', '0', '1'), +('4', '60', '22', '10664', '0', '1'), +('4', '60', '1', '10912', '1956', '1'), +('4', '60', '1', '62234', '1794', '1'), +('4', '60', '1', '30361', '1290', '1'), +('4', '60', '1', '5716', '911', '1'), +('4', '60', '2', '10913', '4683', '1'), +('4', '60', '2', '1630', '3436', '1'), +('4', '60', '2', '30363', '1450', '1'), +('4', '60', '2', '11276', '1286', '1'), +('4', '60', '3', '46184', '1463', '1'), +('4', '60', '3', '1625', '1035', '1'), +('4', '60', '3', '14705', '990', '1'), +('4', '60', '3', '14706', '990', '1'), +('4', '60', '5', '14709', '1496', '1'), +('4', '60', '5', '30362', '1340', '1'), +('4', '60', '5', '30996', '1180', '1'), +('4', '60', '5', '14703', '1100', '1'), +('4', '60', '8', '1627', '8427', '1'), +('4', '60', '8', '11621', '8302', '1'), +('4', '60', '8', '1619', '6297', '1'), +('4', '60', '8', '1628', '2744', '1'), +('4', '60', '6', '1557', '5321', '1'), +('4', '60', '6', '5723', '2609', '1'), +('4', '60', '6', '5739', '1886', '1'), +('4', '60', '6', '2714', '1349', '1'), +('4', '60', '17', '10845', '5084', '1'), +('4', '60', '17', '4892', '1562', '1'), +('4', '60', '17', '11623', '1463', '1'), +('4', '60', '17', '4537', '1123', '1'), +('4', '60', '7', '5723', '2609', '1'), +('4', '60', '7', '62046', '1399', '1'), +('4', '60', '7', '5703', '756', '1'), +('4', '60', '7', '28407', '593', '1'), +('4', '60', '9', '5723', '2609', '1'), +('4', '60', '9', '1541', '1756', '1'), +('4', '60', '9', '11584', '1044', '1'), +('4', '60', '9', '4834', '844', '1'), +('4', '60', '15', '5727', '1545', '1'), +('4', '60', '15', '5728', '1157', '1'), +('4', '60', '15', '14707', '1050', '1'), +('4', '60', '15', '62237', '962', '1'), +('4', '60', '20', '11601', '6810', '1'), +('4', '60', '20', '1620', '6410', '1'), +('4', '60', '20', '1623', '4814', '1'), +('4', '60', '20', '1365', '4200', '1'), +('4', '60', '12', '20655', '1018', '1'), +('4', '60', '12', '11624', '894', '1'), +('4', '60', '12', '2923', '829', '1'), +('4', '60', '12', '4835', '723', '1'), +('4', '60', '18', '4541', '870', '1'), +('4', '60', '18', '4317', '756', '1'), +('4', '60', '18', '4896', '690', '1'), +('4', '60', '18', '3210', '548', '1'), +('4', '60', '19', '24616', '9435', '1'), +('4', '60', '19', '4837', '1265', '1'), +('4', '60', '19', '4920', '1101', '1'), +('4', '60', '19', '68239', '745', '1'), +('4', '60', '13', '6287', '81961', '1'), +('4', '60', '13', '7207', '79725', '1'), +('4', '60', '13', '24613', '73695', '1'), +('4', '60', '13', '10821', '70635', '1'), +('4', '60', '14', '6287', '81961', '1'), +('4', '60', '14', '7207', '79725', '1'), +('4', '60', '14', '20487', '75187', '1'), +('4', '60', '14', '24613', '73695', '1'), +('4', '60', '11', '45137', '134074', '1'), +('4', '60', '11', '8407', '131598', '1'), +('4', '60', '11', '5758', '113490', '1'), +('4', '60', '11', '11696', '103143', '1'), +('4', '61', '22', '21807', '0', '3'), +('4', '61', '22', '21805', '0', '3'), +('4', '61', '22', '12425', '0', '3'), +('4', '61', '22', '7867', '0', '3'), +('4', '61', '1', '7945', '9159', '3'), +('4', '61', '1', '26775', '5527', '3'), +('4', '61', '1', '28962', '4283', '3'), +('4', '61', '1', '28945', '4262', '3'), +('4', '61', '2', '2612', '8158', '3'), +('4', '61', '2', '26025', '8158', '3'), +('4', '61', '2', '28995', '4775', '3'), +('4', '61', '2', '26759', '3807', '3'), +('4', '61', '3', '26773', '6201', '3'), +('4', '61', '3', '28963', '3571', '3'), +('4', '61', '3', '31233', '3235', '3'), +('4', '61', '3', '26560', '3017', '3'), +('4', '61', '5', '28885', '11028', '3'), +('4', '61', '5', '27266', '10072', '3'), +('4', '61', '5', '8364', '7900', '3'), +('4', '61', '5', '7868', '5026', '3'), +('4', '61', '8', '26766', '11746', '3'), +('4', '61', '8', '26765', '11173', '3'), +('4', '61', '8', '31471', '10080', '3'), +('4', '61', '8', '27261', '8417', '3'), +('4', '61', '6', '28902', '13010', '3'), +('4', '61', '6', '1557', '5252', '3'), +('4', '61', '6', '30551', '5025', '3'), +('4', '61', '6', '26753', '4810', '3'), +('4', '61', '17', '27261', '8417', '3'), +('4', '61', '17', '10845', '4128', '3'), +('4', '61', '17', '28951', '3505', '3'), +('4', '61', '17', '7926', '3047', '3'), +('4', '61', '7', '26771', '8536', '3'), +('4', '61', '7', '7868', '5026', '3'), +('4', '61', '7', '5854', '4532', '3'), +('4', '61', '7', '7194', '4507', '3'), +('4', '61', '9', '31461', '9984', '3'), +('4', '61', '9', '7868', '5026', '3'), +('4', '61', '9', '26584', '4273', '3'), +('4', '61', '9', '28943', '3775', '3'), +('4', '61', '15', '27950', '7608', '3'), +('4', '61', '15', '26757', '5211', '3'), +('4', '61', '15', '26749', '4779', '3'), +('4', '61', '15', '7870', '3642', '3'), +('4', '61', '20', '28890', '10662', '3'), +('4', '61', '20', '31334', '9433', '3'), +('4', '61', '20', '27963', '9259', '3'), +('4', '61', '20', '31235', '9246', '3'), +('4', '61', '12', '25857', '11076', '3'), +('4', '61', '12', '29177', '5168', '3'), +('4', '61', '12', '2746', '4856', '3'), +('4', '61', '12', '28967', '4355', '3'), +('4', '61', '18', '26750', '3778', '3'), +('4', '61', '18', '28965', '3774', '3'), +('4', '61', '18', '28932', '3227', '3'), +('4', '61', '18', '8289', '3220', '3'), +('4', '61', '19', '30569', '11872', '3'), +('4', '61', '19', '51226', '10536', '3'), +('4', '61', '19', '28888', '10276', '3'), +('4', '61', '19', '24616', '9061', '3'), +('4', '61', '13', '1158', '101214', '3'), +('4', '61', '13', '69416', '99749', '3'), +('4', '61', '13', '1154', '96844', '3'), +('4', '61', '13', '27899', '86000', '3'), +('4', '61', '14', '1158', '101214', '3'), +('4', '61', '14', '69416', '99749', '3'), +('4', '61', '14', '1154', '96844', '3'), +('4', '61', '14', '28811', '90942', '3'), +('4', '61', '11', '30539', '179945', '3'), +('4', '61', '11', '28935', '168722', '3'), +('4', '61', '11', '31335', '168296', '3'), +('4', '61', '11', '7904', '156446', '3'), +('4', '62', '22', '21807', '0', '3'), +('4', '62', '22', '21805', '0', '3'), +('4', '62', '22', '12425', '0', '3'), +('4', '62', '22', '7867', '0', '3'), +('4', '62', '1', '7945', '9159', '3'), +('4', '62', '1', '26775', '5527', '3'), +('4', '62', '1', '28962', '4283', '3'), +('4', '62', '1', '28945', '4263', '3'), +('4', '62', '2', '2612', '8158', '3'), +('4', '62', '2', '26025', '8158', '3'), +('4', '62', '2', '28995', '4776', '3'), +('4', '62', '2', '26759', '3807', '3'), +('4', '62', '3', '26773', '6201', '3'), +('4', '62', '3', '28963', '3571', '3'), +('4', '62', '3', '31233', '3235', '3'), +('4', '62', '3', '26560', '3017', '3'), +('4', '62', '5', '28885', '11028', '3'), +('4', '62', '5', '27266', '10072', '3'), +('4', '62', '5', '8364', '7901', '3'), +('4', '62', '5', '7868', '5026', '3'), +('4', '62', '8', '26766', '11747', '3'), +('4', '62', '8', '26765', '11174', '3'), +('4', '62', '8', '31471', '10080', '3'), +('4', '62', '8', '27261', '8417', '3'), +('4', '62', '6', '28902', '13010', '3'), +('4', '62', '6', '1557', '5252', '3'), +('4', '62', '6', '30551', '5025', '3'), +('4', '62', '6', '26753', '4810', '3'), +('4', '62', '17', '27261', '8417', '3'), +('4', '62', '17', '10845', '4128', '3'), +('4', '62', '17', '28951', '3505', '3'), +('4', '62', '17', '7926', '3047', '3'), +('4', '62', '7', '26771', '8536', '3'), +('4', '62', '7', '7868', '5026', '3'), +('4', '62', '7', '5854', '4532', '3'), +('4', '62', '7', '7194', '4507', '3'), +('4', '62', '9', '31461', '9984', '3'), +('4', '62', '9', '7868', '5026', '3'), +('4', '62', '9', '26584', '4273', '3'), +('4', '62', '9', '28943', '3775', '3'), +('4', '62', '15', '27950', '7608', '3'), +('4', '62', '15', '26757', '5211', '3'), +('4', '62', '15', '26749', '4779', '3'), +('4', '62', '15', '7870', '3642', '3'), +('4', '62', '20', '28890', '10662', '3'), +('4', '62', '20', '31334', '9434', '3'), +('4', '62', '20', '27963', '9259', '3'), +('4', '62', '20', '31235', '9246', '3'), +('4', '62', '12', '25857', '11076', '3'), +('4', '62', '12', '29177', '5168', '3'), +('4', '62', '12', '2746', '4856', '3'), +('4', '62', '12', '28967', '4355', '3'), +('4', '62', '18', '26750', '3778', '3'), +('4', '62', '18', '28965', '3775', '3'), +('4', '62', '18', '28932', '3227', '3'), +('4', '62', '18', '8289', '3220', '3'), +('4', '62', '19', '30569', '11872', '3'), +('4', '62', '19', '51226', '10536', '3'), +('4', '62', '19', '28888', '10276', '3'), +('4', '62', '19', '24616', '9061', '3'), +('4', '62', '13', '1158', '101788', '3'), +('4', '62', '13', '69416', '99930', '3'), +('4', '62', '13', '1154', '97376', '3'), +('4', '62', '13', '27899', '86360', '3'), +('4', '62', '14', '1158', '101788', '3'), +('4', '62', '14', '69416', '99930', '3'), +('4', '62', '14', '1154', '97376', '3'), +('4', '62', '14', '28811', '91302', '3'), +('4', '62', '11', '30539', '180462', '3'), +('4', '62', '11', '28935', '169188', '3'), +('4', '62', '11', '31335', '168656', '3'), +('4', '62', '11', '7904', '156746', '3'), +('4', '63', '22', '21807', '0', '3'), +('4', '63', '22', '21805', '0', '3'), +('4', '63', '22', '12425', '0', '3'), +('4', '63', '22', '7867', '0', '3'), +('4', '63', '1', '7945', '9159', '3'), +('4', '63', '1', '26775', '5527', '3'), +('4', '63', '1', '28962', '4283', '3'), +('4', '63', '1', '28945', '4263', '3'), +('4', '63', '2', '2612', '8158', '3'), +('4', '63', '2', '26025', '8158', '3'), +('4', '63', '2', '28995', '4776', '3'), +('4', '63', '2', '26759', '3807', '3'), +('4', '63', '3', '26773', '6201', '3'), +('4', '63', '3', '28963', '3572', '3'), +('4', '63', '3', '31233', '3235', '3'), +('4', '63', '3', '26560', '3018', '3'), +('4', '63', '5', '28885', '11029', '3'), +('4', '63', '5', '27266', '10072', '3'), +('4', '63', '5', '8364', '7901', '3'), +('4', '63', '5', '7868', '5027', '3'), +('4', '63', '8', '26766', '11747', '3'), +('4', '63', '8', '26765', '11174', '3'), +('4', '63', '8', '31471', '10080', '3'), +('4', '63', '8', '27261', '8418', '3'), +('4', '63', '6', '28902', '13010', '3'), +('4', '63', '6', '1557', '5252', '3'), +('4', '63', '6', '30551', '5025', '3'), +('4', '63', '6', '26753', '4810', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '63', '17', '27261', '8418', '3'), +('4', '63', '17', '10845', '4129', '3'), +('4', '63', '17', '28951', '3505', '3'), +('4', '63', '17', '7926', '3048', '3'), +('4', '63', '7', '26771', '8537', '3'), +('4', '63', '7', '7868', '5027', '3'), +('4', '63', '7', '5854', '4532', '3'), +('4', '63', '7', '7194', '4507', '3'), +('4', '63', '9', '31461', '9985', '3'), +('4', '63', '9', '7868', '5027', '3'), +('4', '63', '9', '26584', '4274', '3'), +('4', '63', '9', '28943', '3775', '3'), +('4', '63', '15', '27950', '7608', '3'), +('4', '63', '15', '26757', '5211', '3'), +('4', '63', '15', '26749', '4779', '3'), +('4', '63', '15', '7870', '3642', '3'), +('4', '63', '20', '28890', '10662', '3'), +('4', '63', '20', '31334', '9434', '3'), +('4', '63', '20', '27963', '9259', '3'), +('4', '63', '20', '31235', '9246', '3'), +('4', '63', '12', '25857', '11076', '3'), +('4', '63', '12', '29177', '5168', '3'), +('4', '63', '12', '2746', '4856', '3'), +('4', '63', '12', '28967', '4355', '3'), +('4', '63', '18', '26750', '3778', '3'), +('4', '63', '18', '28965', '3775', '3'), +('4', '63', '18', '28932', '3227', '3'), +('4', '63', '18', '8289', '3220', '3'), +('4', '63', '19', '30569', '11872', '3'), +('4', '63', '19', '51226', '10536', '3'), +('4', '63', '19', '28888', '10277', '3'), +('4', '63', '19', '24616', '9061', '3'), +('4', '63', '13', '1158', '102303', '3'), +('4', '63', '13', '69416', '100110', '3'), +('4', '63', '13', '1154', '97909', '3'), +('4', '63', '13', '27899', '86660', '3'), +('4', '63', '14', '1158', '102303', '3'), +('4', '63', '14', '69416', '100110', '3'), +('4', '63', '14', '1154', '97909', '3'), +('4', '63', '14', '28811', '91602', '3'), +('4', '63', '11', '30539', '180920', '3'), +('4', '63', '11', '28935', '169653', '3'), +('4', '63', '11', '31335', '168956', '3'), +('4', '63', '11', '7904', '157046', '3'), +('4', '64', '22', '21807', '0', '3'), +('4', '64', '22', '21805', '0', '3'), +('4', '64', '22', '12425', '0', '3'), +('4', '64', '22', '7867', '0', '3'), +('4', '64', '1', '7945', '9160', '3'), +('4', '64', '1', '26775', '5527', '3'), +('4', '64', '1', '28962', '4284', '3'), +('4', '64', '1', '28945', '4263', '3'), +('4', '64', '2', '2612', '8158', '3'), +('4', '64', '2', '26025', '8158', '3'), +('4', '64', '2', '28995', '4776', '3'), +('4', '64', '2', '26759', '3807', '3'), +('4', '64', '3', '26773', '6202', '3'), +('4', '64', '3', '28963', '3572', '3'), +('4', '64', '3', '31233', '3236', '3'), +('4', '64', '3', '26560', '3018', '3'), +('4', '64', '5', '28885', '11029', '3'), +('4', '64', '5', '27266', '10072', '3'), +('4', '64', '5', '8364', '7902', '3'), +('4', '64', '5', '7868', '5027', '3'), +('4', '64', '8', '26766', '11748', '3'), +('4', '64', '8', '26765', '11174', '3'), +('4', '64', '8', '31471', '10080', '3'), +('4', '64', '8', '27261', '8418', '3'), +('4', '64', '6', '28902', '13010', '3'), +('4', '64', '6', '1557', '5252', '3'), +('4', '64', '6', '30551', '5025', '3'), +('4', '64', '6', '26753', '4810', '3'), +('4', '64', '17', '27261', '8418', '3'), +('4', '64', '17', '10845', '4129', '3'), +('4', '64', '17', '28951', '3505', '3'), +('4', '64', '17', '7926', '3048', '3'), +('4', '64', '7', '26771', '8537', '3'), +('4', '64', '7', '7868', '5027', '3'), +('4', '64', '7', '5854', '4532', '3'), +('4', '64', '7', '7194', '4507', '3'), +('4', '64', '9', '31461', '9985', '3'), +('4', '64', '9', '7868', '5027', '3'), +('4', '64', '9', '26584', '4274', '3'), +('4', '64', '9', '28943', '3776', '3'), +('4', '64', '15', '27950', '7608', '3'), +('4', '64', '15', '26757', '5211', '3'), +('4', '64', '15', '26749', '4780', '3'), +('4', '64', '15', '7870', '3642', '3'), +('4', '64', '20', '28890', '10662', '3'), +('4', '64', '20', '31334', '9434', '3'), +('4', '64', '20', '27963', '9260', '3'), +('4', '64', '20', '31235', '9246', '3'), +('4', '64', '12', '25857', '11077', '3'), +('4', '64', '12', '29177', '5168', '3'), +('4', '64', '12', '2746', '4856', '3'), +('4', '64', '12', '28967', '4355', '3'), +('4', '64', '18', '26750', '3778', '3'), +('4', '64', '18', '28965', '3775', '3'), +('4', '64', '18', '28932', '3228', '3'), +('4', '64', '18', '8289', '3220', '3'), +('4', '64', '19', '30569', '11872', '3'), +('4', '64', '19', '51226', '10537', '3'), +('4', '64', '19', '28888', '10277', '3'), +('4', '64', '19', '24616', '9061', '3'), +('4', '64', '13', '1158', '102877', '3'), +('4', '64', '13', '69416', '100290', '3'), +('4', '64', '13', '1154', '98441', '3'), +('4', '64', '13', '27899', '87021', '3'), +('4', '64', '14', '1158', '102877', '3'), +('4', '64', '14', '69416', '100290', '3'), +('4', '64', '14', '1154', '98441', '3'), +('4', '64', '14', '28811', '91963', '3'), +('4', '64', '11', '30539', '181437', '3'), +('4', '64', '11', '28935', '170118', '3'), +('4', '64', '11', '31335', '169316', '3'), +('4', '64', '11', '45137', '158104', '3'), +('4', '65', '22', '21807', '0', '7'), +('4', '65', '22', '21805', '0', '7'), +('4', '65', '22', '61948', '0', '7'), +('4', '65', '22', '12425', '0', '7'), +('4', '65', '1', '68949', '17618', '7'), +('4', '65', '1', '7125', '15280', '7'), +('4', '65', '1', '32106', '12909', '7'), +('4', '65', '1', '69166', '12362', '7'), +('4', '65', '2', '28605', '15305', '7'), +('4', '65', '2', '28648', '15286', '7'), +('4', '65', '2', '2612', '8158', '7'), +('4', '65', '2', '26025', '8158', '7'), +('4', '65', '3', '69157', '10773', '7'), +('4', '65', '3', '68753', '10057', '7'), +('4', '65', '3', '69069', '10007', '7'), +('4', '65', '3', '68752', '9551', '7'), +('4', '65', '5', '68808', '12116', '7'), +('4', '65', '5', '7769', '11937', '7'), +('4', '65', '5', '67625', '11334', '7'), +('4', '65', '5', '28885', '11029', '7'), +('4', '65', '8', '69064', '20574', '7'), +('4', '65', '8', '69165', '20464', '7'), +('4', '65', '8', '69072', '17195', '7'), +('4', '65', '8', '26766', '11748', '7'), +('4', '65', '6', '68757', '18889', '7'), +('4', '65', '6', '13674', '14629', '7'), +('4', '65', '6', '28902', '13010', '7'), +('4', '65', '6', '19144', '12034', '7'), +('4', '65', '17', '69151', '13848', '7'), +('4', '65', '17', '68780', '10251', '7'), +('4', '65', '17', '27261', '8418', '7'), +('4', '65', '17', '14961', '8383', '7'), +('4', '65', '7', '68706', '15339', '7'), +('4', '65', '7', '16097', '12459', '7'), +('4', '65', '7', '69080', '9441', '7'), +('4', '65', '7', '68881', '9041', '7'), +('4', '65', '9', '68766', '13583', '7'), +('4', '65', '9', '11096', '12625', '7'), +('4', '65', '9', '16097', '12459', '7'), +('4', '65', '9', '69127', '11012', '7'), +('4', '65', '15', '9959', '12216', '7'), +('4', '65', '15', '68111', '11849', '7'), +('4', '65', '15', '69160', '11156', '7'), +('4', '65', '15', '69070', '10861', '7'), +('4', '65', '20', '16156', '19085', '7'), +('4', '65', '20', '69134', '13519', '7'), +('4', '65', '20', '16097', '12459', '7'), +('4', '65', '20', '15873', '11940', '7'), +('4', '65', '12', '25857', '11077', '7'), +('4', '65', '12', '28246', '9180', '7'), +('4', '65', '12', '69253', '8700', '7'), +('4', '65', '12', '27000', '8072', '7'), +('4', '65', '18', '69147', '12837', '7'), +('4', '65', '18', '68749', '9392', '7'), +('4', '65', '18', '16777', '9261', '7'), +('4', '65', '18', '68973', '8758', '7'), +('4', '65', '19', '19094', '12150', '7'), +('4', '65', '19', '30569', '11872', '7'), +('4', '65', '19', '51226', '10537', '7'), +('4', '65', '19', '28888', '10277', '7'), +('4', '65', '13', '69052', '190863', '7'), +('4', '65', '13', '69116', '159509', '7'), +('4', '65', '13', '22998', '154564', '7'), +('4', '65', '13', '69040', '145320', '7'), +('4', '65', '14', '69052', '190863', '7'), +('4', '65', '14', '69116', '159509', '7'), +('4', '65', '14', '22998', '154564', '7'), +('4', '65', '14', '69040', '145320', '7'), +('4', '65', '11', '69054', '208174', '7'), +('4', '65', '11', '27989', '193735', '7'), +('4', '65', '11', '29598', '190037', '7'), +('4', '65', '11', '29596', '186791', '7'), +('4', '65', '22', '21807', '0', '6'), +('4', '65', '22', '21805', '0', '6'), +('4', '65', '22', '61948', '0', '6'), +('4', '65', '22', '12425', '0', '6'), +('4', '65', '1', '7125', '15280', '6'), +('4', '65', '1', '32106', '12909', '6'), +('4', '65', '1', '7945', '9160', '6'), +('4', '65', '1', '16255', '8080', '6'), +('4', '65', '2', '28605', '15305', '6'), +('4', '65', '2', '28648', '15286', '6'), +('4', '65', '2', '2612', '8158', '6'), +('4', '65', '2', '26025', '8158', '6'), +('4', '65', '3', '26982', '9508', '6'), +('4', '65', '3', '29174', '7805', '6'), +('4', '65', '3', '12592', '7607', '6'), +('4', '65', '3', '9480', '6942', '6'), +('4', '65', '5', '7769', '11937', '6'), +('4', '65', '5', '28885', '11029', '6'), +('4', '65', '5', '8785', '10106', '6'), +('4', '65', '5', '27266', '10073', '6'), +('4', '65', '8', '26766', '11748', '6'), +('4', '65', '8', '26765', '11174', '6'), +('4', '65', '8', '15803', '11109', '6'), +('4', '65', '8', '31471', '10080', '6'), +('4', '65', '6', '13674', '14629', '6'), +('4', '65', '6', '28902', '13010', '6'), +('4', '65', '6', '19144', '12034', '6'), +('4', '65', '6', '71006', '10638', '6'), +('4', '65', '17', '27261', '8418', '6'), +('4', '65', '17', '14961', '8383', '6'), +('4', '65', '17', '47647', '7215', '6'), +('4', '65', '17', '69403', '6906', '6'), +('4', '65', '7', '16097', '12459', '6'), +('4', '65', '7', '26771', '8537', '6'), +('4', '65', '7', '68197', '8105', '6'), +('4', '65', '7', '11447', '7110', '6'), +('4', '65', '9', '11096', '12625', '6'), +('4', '65', '9', '16097', '12459', '6'), +('4', '65', '9', '31461', '9985', '6'), +('4', '65', '9', '28666', '8160', '6'), +('4', '65', '15', '9959', '12216', '6'), +('4', '65', '15', '68111', '11849', '6'), +('4', '65', '15', '69389', '7819', '6'), +('4', '65', '15', '27950', '7608', '6'), +('4', '65', '20', '16156', '19085', '6'), +('4', '65', '20', '16097', '12459', '6'), +('4', '65', '20', '15873', '11940', '6'), +('4', '65', '20', '28890', '10662', '6'), +('4', '65', '12', '25857', '11077', '6'), +('4', '65', '12', '28246', '9180', '6'), +('4', '65', '12', '27000', '8072', '6'), +('4', '65', '12', '12816', '7286', '6'), +('4', '65', '18', '16777', '9261', '6'), +('4', '65', '18', '28651', '8299', '6'), +('4', '65', '18', '26750', '3778', '6'), +('4', '65', '18', '28965', '3775', '6'), +('4', '65', '19', '19094', '12150', '6'), +('4', '65', '19', '30569', '11872', '6'), +('4', '65', '19', '51226', '10537', '6'), +('4', '65', '19', '28888', '10277', '6'), +('4', '65', '13', '22998', '154564', '6'), +('4', '65', '13', '22986', '120373', '6'), +('4', '65', '13', '26220', '113752', '6'), +('4', '65', '13', '22894', '111842', '6'), +('4', '65', '14', '22998', '154564', '6'), +('4', '65', '14', '22986', '120373', '6'), +('4', '65', '14', '26220', '113752', '6'), +('4', '65', '14', '22894', '111842', '6'), +('4', '65', '11', '27989', '193735', '6'), +('4', '65', '11', '29598', '190037', '6'), +('4', '65', '11', '29596', '186791', '6'), +('4', '65', '11', '27818', '185353', '6'), +('4', '65', '22', '21805', '0', '5'), +('4', '65', '22', '61948', '0', '5'), +('4', '65', '22', '66397', '0', '5'), +('4', '65', '22', '21807', '0', '5'), +('4', '65', '1', '7125', '15280', '5'), +('4', '65', '1', '32106', '12909', '5'), +('4', '65', '1', '7945', '9160', '5'), +('4', '65', '1', '16255', '8080', '5'), +('4', '65', '2', '28605', '15305', '5'), +('4', '65', '2', '28648', '15286', '5'), +('4', '65', '2', '2612', '8158', '5'), +('4', '65', '2', '26025', '8158', '5'), +('4', '65', '3', '26982', '9508', '5'), +('4', '65', '3', '29174', '7805', '5'), +('4', '65', '3', '12592', '7607', '5'), +('4', '65', '3', '9480', '6942', '5'), +('4', '65', '5', '7769', '11937', '5'), +('4', '65', '5', '28885', '11029', '5'), +('4', '65', '5', '8785', '10106', '5'), +('4', '65', '5', '27266', '10073', '5'), +('4', '65', '8', '26766', '11748', '5'), +('4', '65', '8', '26765', '11174', '5'), +('4', '65', '8', '15803', '11109', '5'), +('4', '65', '8', '31471', '10080', '5'), +('4', '65', '6', '13674', '14629', '5'), +('4', '65', '6', '28902', '13010', '5'), +('4', '65', '6', '19144', '12034', '5'), +('4', '65', '6', '71006', '10638', '5'), +('4', '65', '17', '27261', '8418', '5'), +('4', '65', '17', '14961', '8383', '5'), +('4', '65', '17', '47647', '7215', '5'), +('4', '65', '17', '14962', '4290', '5'), +('4', '65', '7', '16097', '12459', '5'), +('4', '65', '7', '26771', '8537', '5'), +('4', '65', '7', '68197', '8105', '5'), +('4', '65', '7', '11447', '7110', '5'), +('4', '65', '9', '11096', '12625', '5'), +('4', '65', '9', '16097', '12459', '5'), +('4', '65', '9', '31461', '9985', '5'), +('4', '65', '9', '28666', '8160', '5'), +('4', '65', '15', '9959', '12216', '5'), +('4', '65', '15', '69389', '7819', '5'), +('4', '65', '15', '27950', '7608', '5'), +('4', '65', '15', '26989', '6973', '5'), +('4', '65', '20', '16156', '19085', '5'), +('4', '65', '20', '16097', '12459', '5'), +('4', '65', '20', '15873', '11940', '5'), +('4', '65', '20', '28890', '10662', '5'), +('4', '65', '12', '25857', '11077', '5'), +('4', '65', '12', '28246', '9180', '5'), +('4', '65', '12', '27000', '8072', '5'), +('4', '65', '12', '12816', '7286', '5'), +('4', '65', '18', '16777', '9261', '5'), +('4', '65', '18', '28651', '8299', '5'), +('4', '65', '18', '26750', '3778', '5'), +('4', '65', '18', '28965', '3775', '5'), +('4', '65', '19', '19094', '12150', '5'), +('4', '65', '19', '30569', '11872', '5'), +('4', '65', '19', '51226', '10537', '5'), +('4', '65', '19', '28888', '10277', '5'), +('4', '65', '13', '22998', '154564', '5'), +('4', '65', '13', '22986', '120373', '5'), +('4', '65', '13', '26220', '113752', '5'), +('4', '65', '13', '22894', '111842', '5'), +('4', '65', '14', '22998', '154564', '5'), +('4', '65', '14', '22986', '120373', '5'), +('4', '65', '14', '26220', '113752', '5'), +('4', '65', '14', '22894', '111842', '5'), +('4', '65', '11', '27989', '193735', '5'), +('4', '65', '11', '29598', '190037', '5'), +('4', '65', '11', '29596', '186791', '5'), +('4', '65', '11', '27818', '185353', '5'), +('4', '65', '22', '21805', '0', '4'), +('4', '65', '22', '61948', '0', '4'), +('4', '65', '22', '66397', '0', '4'), +('4', '65', '22', '21807', '0', '4'), +('4', '65', '1', '7125', '15280', '4'), +('4', '65', '1', '32106', '12909', '4'), +('4', '65', '1', '7945', '9160', '4'), +('4', '65', '1', '16255', '8080', '4'), +('4', '65', '2', '28605', '15305', '4'), +('4', '65', '2', '28648', '15286', '4'), +('4', '65', '2', '26025', '8158', '4'), +('4', '65', '2', '2612', '8158', '4'), +('4', '65', '3', '26982', '9508', '4'), +('4', '65', '3', '29174', '7805', '4'), +('4', '65', '3', '12592', '7607', '4'), +('4', '65', '3', '9480', '6942', '4'), +('4', '65', '5', '7769', '11937', '4'), +('4', '65', '5', '28885', '11029', '4'), +('4', '65', '5', '8785', '10106', '4'), +('4', '65', '5', '27266', '10073', '4'), +('4', '65', '8', '26766', '11748', '4'), +('4', '65', '8', '26765', '11174', '4'), +('4', '65', '8', '15803', '11109', '4'), +('4', '65', '8', '31471', '10080', '4'), +('4', '65', '6', '13674', '14629', '4'), +('4', '65', '6', '28902', '13010', '4'), +('4', '65', '6', '19144', '12034', '4'), +('4', '65', '6', '71006', '10638', '4'), +('4', '65', '17', '27261', '8418', '4'), +('4', '65', '17', '14961', '8383', '4'), +('4', '65', '17', '47647', '7215', '4'), +('4', '65', '17', '14962', '4290', '4'), +('4', '65', '7', '16097', '12459', '4'), +('4', '65', '7', '26771', '8537', '4'), +('4', '65', '7', '68197', '8105', '4'), +('4', '65', '7', '11447', '7110', '4'), +('4', '65', '9', '11096', '12625', '4'), +('4', '65', '9', '16097', '12459', '4'), +('4', '65', '9', '31461', '9985', '4'), +('4', '65', '9', '28666', '8160', '4'), +('4', '65', '15', '9959', '12216', '4'), +('4', '65', '15', '69389', '7819', '4'), +('4', '65', '15', '27950', '7608', '4'), +('4', '65', '15', '26989', '6973', '4'), +('4', '65', '20', '16156', '19085', '4'), +('4', '65', '20', '16097', '12459', '4'), +('4', '65', '20', '15873', '11940', '4'), +('4', '65', '20', '28890', '10662', '4'), +('4', '65', '12', '25857', '11077', '4'), +('4', '65', '12', '28246', '9180', '4'), +('4', '65', '12', '27000', '8072', '4'), +('4', '65', '12', '12816', '7286', '4'), +('4', '65', '18', '16777', '9261', '4'), +('4', '65', '18', '28651', '8299', '4'), +('4', '65', '18', '26750', '3778', '4'), +('4', '65', '18', '28965', '3775', '4'), +('4', '65', '19', '19094', '12150', '4'), +('4', '65', '19', '30569', '11872', '4'), +('4', '65', '19', '51226', '10537', '4'), +('4', '65', '19', '28888', '10277', '4'), +('4', '65', '13', '22998', '154564', '4'), +('4', '65', '13', '22986', '120373', '4'), +('4', '65', '13', '26220', '113752', '4'), +('4', '65', '13', '22894', '111842', '4'), +('4', '65', '14', '22998', '154564', '4'), +('4', '65', '14', '22986', '120373', '4'), +('4', '65', '14', '26220', '113752', '4'), +('4', '65', '14', '22894', '111842', '4'), +('4', '65', '11', '27989', '193735', '4'), +('4', '65', '11', '29598', '190037', '4'), +('4', '65', '11', '29596', '186791', '4'), +('4', '65', '11', '27818', '185353', '4'), +('4', '66', '22', '21807', '0', '7'), +('4', '66', '22', '21805', '0', '7'), +('4', '66', '22', '61948', '0', '7'), +('4', '66', '22', '12425', '0', '7'), +('4', '66', '1', '68949', '17619', '7'), +('4', '66', '1', '7125', '15280', '7'), +('4', '66', '1', '32106', '12910', '7'), +('4', '66', '1', '69166', '12363', '7'), +('4', '66', '2', '28605', '15306', '7'), +('4', '66', '2', '28648', '15287', '7'), +('4', '66', '2', '2612', '8158', '7'), +('4', '66', '2', '26025', '8158', '7'), +('4', '66', '3', '69157', '10773', '7'), +('4', '66', '3', '68753', '10058', '7'), +('4', '66', '3', '69069', '10007', '7'), +('4', '66', '3', '68752', '9552', '7'), +('4', '66', '5', '68808', '12117', '7'), +('4', '66', '5', '7769', '11937', '7'), +('4', '66', '5', '67625', '11334', '7'), +('4', '66', '5', '28885', '11029', '7'), +('4', '66', '8', '69064', '20575', '7'), +('4', '66', '8', '69165', '20464', '7'), +('4', '66', '8', '69072', '17196', '7'), +('4', '66', '8', '26766', '11748', '7'), +('4', '66', '6', '68757', '18890', '7'), +('4', '66', '6', '13674', '14630', '7'), +('4', '66', '6', '28902', '13010', '7'), +('4', '66', '6', '19144', '12034', '7'), +('4', '66', '17', '69151', '13848', '7'), +('4', '66', '17', '68780', '10251', '7'), +('4', '66', '17', '27261', '8418', '7'), +('4', '66', '17', '14961', '8384', '7'), +('4', '66', '7', '68706', '15339', '7'), +('4', '66', '7', '16097', '12459', '7'), +('4', '66', '7', '69080', '9442', '7'), +('4', '66', '7', '68881', '9042', '7'), +('4', '66', '9', '68766', '13583', '7'), +('4', '66', '9', '11096', '12626', '7'), +('4', '66', '9', '16097', '12459', '7'), +('4', '66', '9', '69127', '11013', '7'), +('4', '66', '15', '9959', '12216', '7'), +('4', '66', '15', '68111', '11849', '7'), +('4', '66', '15', '69160', '11156', '7'), +('4', '66', '15', '69070', '10861', '7'), +('4', '66', '20', '16156', '19085', '7'), +('4', '66', '20', '69134', '13520', '7'), +('4', '66', '20', '16097', '12459', '7'), +('4', '66', '20', '15873', '11940', '7'), +('4', '66', '12', '25857', '11077', '7'), +('4', '66', '12', '28246', '9181', '7'), +('4', '66', '12', '69253', '8700', '7'), +('4', '66', '12', '27000', '8072', '7'), +('4', '66', '18', '69147', '12838', '7'), +('4', '66', '18', '68749', '9393', '7'), +('4', '66', '18', '16777', '9262', '7'), +('4', '66', '18', '68973', '8759', '7'), +('4', '66', '19', '19094', '12150', '7'), +('4', '66', '19', '30569', '11872', '7'), +('4', '66', '19', '51226', '10537', '7'), +('4', '66', '19', '28888', '10277', '7'), +('4', '66', '13', '69052', '192168', '7'), +('4', '66', '13', '69116', '159937', '7'), +('4', '66', '13', '22998', '155701', '7'), +('4', '66', '13', '69040', '145861', '7'), +('4', '66', '14', '69052', '192168', '7'), +('4', '66', '14', '69116', '159937', '7'), +('4', '66', '14', '22998', '155701', '7'), +('4', '66', '14', '69040', '145861', '7'), +('4', '66', '11', '69054', '208834', '7'), +('4', '66', '11', '27989', '194283', '7'), +('4', '66', '11', '29598', '190510', '7'), +('4', '66', '11', '29596', '187316', '7'), +('4', '67', '22', '21807', '0', '7'), +('4', '67', '22', '21805', '0', '7'), +('4', '67', '22', '61948', '0', '7'), +('4', '67', '22', '12425', '0', '7'), +('4', '67', '1', '68949', '17619', '7'), +('4', '67', '1', '7125', '15281', '7'), +('4', '67', '1', '32106', '12910', '7'), +('4', '67', '1', '69166', '12363', '7'), +('4', '67', '2', '28605', '15306', '7'), +('4', '67', '2', '28648', '15287', '7'), +('4', '67', '2', '2612', '8158', '7'), +('4', '67', '2', '26025', '8158', '7'), +('4', '67', '3', '69157', '10774', '7'), +('4', '67', '3', '68753', '10058', '7'), +('4', '67', '3', '69069', '10007', '7'), +('4', '67', '3', '68752', '9552', '7'), +('4', '67', '5', '68808', '12117', '7'), +('4', '67', '5', '7769', '11937', '7'), +('4', '67', '5', '67625', '11335', '7'), +('4', '67', '5', '28885', '11029', '7'), +('4', '67', '8', '69064', '20575', '7'), +('4', '67', '8', '69165', '20465', '7'), +('4', '67', '8', '69072', '17196', '7'), +('4', '67', '8', '26766', '11749', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '67', '6', '68757', '18890', '7'), +('4', '67', '6', '13674', '14630', '7'), +('4', '67', '6', '28902', '13010', '7'), +('4', '67', '6', '19144', '12035', '7'), +('4', '67', '17', '69151', '13849', '7'), +('4', '67', '17', '68780', '10252', '7'), +('4', '67', '17', '27261', '8419', '7'), +('4', '67', '17', '14961', '8385', '7'), +('4', '67', '7', '68706', '15340', '7'), +('4', '67', '7', '16097', '12460', '7'), +('4', '67', '7', '69080', '9442', '7'), +('4', '67', '7', '68881', '9043', '7'), +('4', '67', '9', '68766', '13583', '7'), +('4', '67', '9', '11096', '12626', '7'), +('4', '67', '9', '16097', '12460', '7'), +('4', '67', '9', '69127', '11013', '7'), +('4', '67', '15', '9959', '12216', '7'), +('4', '67', '15', '68111', '11849', '7'), +('4', '67', '15', '69160', '11156', '7'), +('4', '67', '15', '69070', '10862', '7'), +('4', '67', '20', '16156', '19086', '7'), +('4', '67', '20', '69134', '13520', '7'), +('4', '67', '20', '16097', '12460', '7'), +('4', '67', '20', '15873', '11940', '7'), +('4', '67', '12', '25857', '11077', '7'), +('4', '67', '12', '28246', '9181', '7'), +('4', '67', '12', '69253', '8701', '7'), +('4', '67', '12', '27000', '8073', '7'), +('4', '67', '18', '69147', '12838', '7'), +('4', '67', '18', '68749', '9393', '7'), +('4', '67', '18', '16777', '9262', '7'), +('4', '67', '18', '68973', '8759', '7'), +('4', '67', '19', '19094', '12151', '7'), +('4', '67', '19', '30569', '11872', '7'), +('4', '67', '19', '51226', '10537', '7'), +('4', '67', '19', '28888', '10277', '7'), +('4', '67', '13', '69052', '193533', '7'), +('4', '67', '13', '69116', '160425', '7'), +('4', '67', '13', '22998', '156777', '7'), +('4', '67', '13', '69040', '146401', '7'), +('4', '67', '14', '69052', '193533', '7'), +('4', '67', '14', '69116', '160425', '7'), +('4', '67', '14', '22998', '156777', '7'), +('4', '67', '14', '69040', '146401', '7'), +('4', '67', '11', '69054', '209434', '7'), +('4', '67', '11', '27989', '194831', '7'), +('4', '67', '11', '29598', '190922', '7'), +('4', '67', '11', '29596', '187781', '7'), +('4', '68', '22', '21807', '0', '7'), +('4', '68', '22', '21805', '0', '7'), +('4', '68', '22', '61948', '0', '7'), +('4', '68', '22', '12425', '0', '7'), +('4', '68', '1', '68949', '17620', '7'), +('4', '68', '1', '7125', '15281', '7'), +('4', '68', '1', '32106', '12911', '7'), +('4', '68', '1', '69166', '12364', '7'), +('4', '68', '2', '28605', '15306', '7'), +('4', '68', '2', '28648', '15287', '7'), +('4', '68', '2', '2612', '8158', '7'), +('4', '68', '2', '26025', '8158', '7'), +('4', '68', '3', '69157', '10774', '7'), +('4', '68', '3', '68753', '10059', '7'), +('4', '68', '3', '69069', '10007', '7'), +('4', '68', '3', '68752', '9553', '7'), +('4', '68', '5', '68808', '12118', '7'), +('4', '68', '5', '7769', '11938', '7'), +('4', '68', '5', '67625', '11336', '7'), +('4', '68', '5', '28885', '11030', '7'), +('4', '68', '8', '69064', '20576', '7'), +('4', '68', '8', '69165', '20465', '7'), +('4', '68', '8', '69072', '17197', '7'), +('4', '68', '8', '26766', '11749', '7'), +('4', '68', '6', '68757', '18891', '7'), +('4', '68', '6', '13674', '14630', '7'), +('4', '68', '6', '28902', '13011', '7'), +('4', '68', '6', '19144', '12035', '7'), +('4', '68', '17', '69151', '13849', '7'), +('4', '68', '17', '68780', '10252', '7'), +('4', '68', '17', '27261', '8419', '7'), +('4', '68', '17', '14961', '8385', '7'), +('4', '68', '7', '68706', '15340', '7'), +('4', '68', '7', '16097', '12460', '7'), +('4', '68', '7', '69080', '9443', '7'), +('4', '68', '7', '68881', '9043', '7'), +('4', '68', '9', '68766', '13584', '7'), +('4', '68', '9', '11096', '12626', '7'), +('4', '68', '9', '16097', '12460', '7'), +('4', '68', '9', '69127', '11014', '7'), +('4', '68', '15', '9959', '12216', '7'), +('4', '68', '15', '68111', '11849', '7'), +('4', '68', '15', '69160', '11157', '7'), +('4', '68', '15', '69070', '10862', '7'), +('4', '68', '20', '16156', '19086', '7'), +('4', '68', '20', '69134', '13521', '7'), +('4', '68', '20', '16097', '12460', '7'), +('4', '68', '20', '15873', '11941', '7'), +('4', '68', '12', '25857', '11077', '7'), +('4', '68', '12', '28246', '9182', '7'), +('4', '68', '12', '69253', '8701', '7'), +('4', '68', '12', '27000', '8073', '7'), +('4', '68', '18', '69147', '12839', '7'), +('4', '68', '18', '68749', '9394', '7'), +('4', '68', '18', '16777', '9263', '7'), +('4', '68', '18', '68973', '8760', '7'), +('4', '68', '19', '19094', '12151', '7'), +('4', '68', '19', '30569', '11872', '7'), +('4', '68', '19', '51226', '10538', '7'), +('4', '68', '19', '28888', '10278', '7'), +('4', '68', '13', '69052', '194839', '7'), +('4', '68', '13', '69116', '160853', '7'), +('4', '68', '13', '22998', '157853', '7'), +('4', '68', '13', '69040', '146942', '7'), +('4', '68', '14', '69052', '194839', '7'), +('4', '68', '14', '69116', '160853', '7'), +('4', '68', '14', '22998', '157853', '7'), +('4', '68', '14', '69040', '146942', '7'), +('4', '68', '11', '69054', '210095', '7'), +('4', '68', '11', '27989', '195318', '7'), +('4', '68', '11', '29598', '191395', '7'), +('4', '68', '11', '29596', '188306', '7'), +('4', '69', '22', '21807', '0', '7'), +('4', '69', '22', '21805', '0', '7'), +('4', '69', '22', '61948', '0', '7'), +('4', '69', '22', '12425', '0', '7'), +('4', '69', '1', '68949', '17621', '7'), +('4', '69', '1', '7125', '15281', '7'), +('4', '69', '1', '32106', '12911', '7'), +('4', '69', '1', '69166', '12364', '7'), +('4', '69', '2', '28605', '15307', '7'), +('4', '69', '2', '28648', '15288', '7'), +('4', '69', '2', '2612', '8158', '7'), +('4', '69', '2', '26025', '8158', '7'), +('4', '69', '3', '69157', '10775', '7'), +('4', '69', '3', '68753', '10059', '7'), +('4', '69', '3', '69069', '10008', '7'), +('4', '69', '3', '68752', '9553', '7'), +('4', '69', '5', '68808', '12118', '7'), +('4', '69', '5', '7769', '11938', '7'), +('4', '69', '5', '67625', '11336', '7'), +('4', '69', '5', '28885', '11030', '7'), +('4', '69', '8', '69064', '20576', '7'), +('4', '69', '8', '69165', '20466', '7'), +('4', '69', '8', '69072', '17197', '7'), +('4', '69', '8', '26766', '11750', '7'), +('4', '69', '6', '68757', '18891', '7'), +('4', '69', '6', '13674', '14631', '7'), +('4', '69', '6', '28902', '13011', '7'), +('4', '69', '6', '19144', '12036', '7'), +('4', '69', '17', '69151', '13850', '7'), +('4', '69', '17', '68780', '10253', '7'), +('4', '69', '17', '27261', '8419', '7'), +('4', '69', '17', '14961', '8386', '7'), +('4', '69', '7', '68706', '15340', '7'), +('4', '69', '7', '16097', '12461', '7'), +('4', '69', '7', '69080', '9443', '7'), +('4', '69', '7', '68881', '9044', '7'), +('4', '69', '9', '68766', '13584', '7'), +('4', '69', '9', '11096', '12627', '7'), +('4', '69', '9', '16097', '12461', '7'), +('4', '69', '9', '69127', '11014', '7'), +('4', '69', '15', '9959', '12216', '7'), +('4', '69', '15', '68111', '11849', '7'), +('4', '69', '15', '69160', '11157', '7'), +('4', '69', '15', '69070', '10863', '7'), +('4', '69', '20', '16156', '19087', '7'), +('4', '69', '20', '69134', '13522', '7'), +('4', '69', '20', '16097', '12461', '7'), +('4', '69', '20', '15873', '11941', '7'), +('4', '69', '12', '25857', '11077', '7'), +('4', '69', '12', '28246', '9182', '7'), +('4', '69', '12', '69253', '8702', '7'), +('4', '69', '12', '27000', '8073', '7'), +('4', '69', '18', '69147', '12839', '7'), +('4', '69', '18', '68749', '9394', '7'), +('4', '69', '18', '16777', '9263', '7'), +('4', '69', '18', '68973', '8760', '7'), +('4', '69', '19', '19094', '12151', '7'), +('4', '69', '19', '30569', '11872', '7'), +('4', '69', '19', '51226', '10538', '7'), +('4', '69', '19', '28888', '10278', '7'), +('4', '69', '13', '69052', '196144', '7'), +('4', '69', '13', '69116', '161281', '7'), +('4', '69', '13', '22998', '158990', '7'), +('4', '69', '13', '69040', '147422', '7'), +('4', '69', '14', '69052', '196144', '7'), +('4', '69', '14', '69116', '161281', '7'), +('4', '69', '14', '22998', '158990', '7'), +('4', '69', '14', '69040', '147422', '7'), +('4', '69', '11', '69054', '210755', '7'), +('4', '69', '11', '27989', '195866', '7'), +('4', '69', '11', '29598', '191868', '7'), +('4', '69', '11', '29596', '188772', '7'), +('4', '70', '22', '12425', '0', '11'), +('4', '70', '22', '21807', '0', '11'), +('4', '70', '22', '21805', '0', '11'), +('4', '70', '22', '39342', '0', '11'), +('4', '70', '1', '83594', '21630', '11'), +('4', '70', '1', '39276', '21400', '11'), +('4', '70', '1', '71624', '18193', '11'), +('4', '70', '1', '68949', '17621', '11'), +('4', '70', '2', '70874', '20934', '11'), +('4', '70', '2', '28605', '15307', '11'), +('4', '70', '2', '28648', '15288', '11'), +('4', '70', '2', '83561', '12785', '11'), +('4', '70', '3', '39218', '20030', '11'), +('4', '70', '3', '47245', '17397', '11'), +('4', '70', '3', '39361', '14787', '11'), +('4', '70', '3', '83636', '13283', '11'), +('4', '70', '5', '39349', '20558', '11'), +('4', '70', '5', '47273', '13906', '11'), +('4', '70', '5', '39262', '13580', '11'), +('4', '70', '5', '89308', '12481', '11'), +('4', '70', '8', '69064', '20577', '11'), +('4', '70', '8', '69165', '20466', '11'), +('4', '70', '8', '39330', '19401', '11'), +('4', '70', '8', '69072', '17198', '11'), +('4', '70', '6', '70717', '19780', '11'), +('4', '70', '6', '68757', '18891', '11'), +('4', '70', '6', '83530', '18044', '11'), +('4', '70', '6', '39367', '15184', '11'), +('4', '70', '17', '83604', '24807', '11'), +('4', '70', '17', '70879', '14755', '11'), +('4', '70', '17', '69151', '13850', '11'), +('4', '70', '17', '70713', '12140', '11'), +('4', '70', '7', '68706', '15341', '11'), +('4', '70', '7', '83565', '13896', '11'), +('4', '70', '7', '16097', '12461', '11'), +('4', '70', '7', '70875', '12447', '11'), +('4', '70', '9', '39345', '13960', '11'), +('4', '70', '9', '51707', '13607', '11'), +('4', '70', '9', '68766', '13584', '11'), +('4', '70', '9', '39291', '13546', '11'), +('4', '70', '15', '83458', '17008', '11'), +('4', '70', '15', '39374', '16386', '11'), +('4', '70', '15', '70621', '15925', '11'), +('4', '70', '15', '71117', '15742', '11'), +('4', '70', '20', '16156', '19087', '11'), +('4', '70', '20', '47283', '18315', '11'), +('4', '70', '20', '39339', '15302', '11'), +('4', '70', '20', '70604', '14855', '11'), +('4', '70', '12', '71080', '16741', '11'), +('4', '70', '12', '47213', '16495', '11'), +('4', '70', '12', '39356', '13349', '11'), +('4', '70', '12', '25857', '11078', '11'), +('4', '70', '18', '83608', '16004', '11'), +('4', '70', '18', '70880', '15641', '11'), +('4', '70', '18', '69147', '12840', '11'), +('4', '70', '18', '71096', '12078', '11'), +('4', '70', '19', '69439', '14350', '11'), +('4', '70', '19', '83573', '12246', '11'), +('4', '70', '19', '19094', '12152', '11'), +('4', '70', '19', '70878', '12059', '11'), +('4', '70', '13', '83639', '255588', '11'), +('4', '70', '13', '69052', '205324', '11'), +('4', '70', '13', '47314', '199776', '11'), +('4', '70', '13', '83576', '199349', '11'), +('4', '70', '14', '83639', '255588', '11'), +('4', '70', '14', '69052', '205324', '11'), +('4', '70', '14', '47314', '199776', '11'), +('4', '70', '14', '83576', '199349', '11'), +('4', '70', '11', '83582', '263565', '11'), +('4', '70', '11', '47325', '228128', '11'), +('4', '70', '11', '39331', '221389', '11'), +('4', '70', '11', '83539', '219189', '11'), +('4', '70', '22', '21807', '0', '10'), +('4', '70', '22', '21805', '0', '10'), +('4', '70', '22', '61948', '0', '10'), +('4', '70', '22', '12425', '0', '10'), +('4', '70', '1', '83594', '21630', '10'), +('4', '70', '1', '71624', '18193', '10'), +('4', '70', '1', '68949', '17621', '10'), +('4', '70', '1', '7125', '15282', '10'), +('4', '70', '2', '70874', '20934', '10'), +('4', '70', '2', '28605', '15307', '10'), +('4', '70', '2', '28648', '15288', '10'), +('4', '70', '2', '83561', '12785', '10'), +('4', '70', '3', '47245', '17397', '10'), +('4', '70', '3', '83636', '13283', '10'), +('4', '70', '3', '83658', '12488', '10'), +('4', '70', '3', '89512', '12330', '10'), +('4', '70', '5', '47273', '13906', '10'), +('4', '70', '5', '89308', '12481', '10'), +('4', '70', '5', '47275', '12179', '10'), +('4', '70', '5', '68808', '12119', '10'), +('4', '70', '8', '69064', '20577', '10'), +('4', '70', '8', '69165', '20466', '10'), +('4', '70', '8', '69072', '17198', '10'), +('4', '70', '8', '70662', '15560', '10'), +('4', '70', '6', '70717', '19780', '10'), +('4', '70', '6', '68757', '18891', '10'), +('4', '70', '6', '83530', '18044', '10'), +('4', '70', '6', '13674', '14631', '10'), +('4', '70', '17', '83604', '24807', '10'), +('4', '70', '17', '70879', '14755', '10'), +('4', '70', '17', '69151', '13850', '10'), +('4', '70', '17', '70713', '12140', '10'), +('4', '70', '7', '68706', '15341', '10'), +('4', '70', '7', '83565', '13896', '10'), +('4', '70', '7', '16097', '12461', '10'), +('4', '70', '7', '70875', '12447', '10'), +('4', '70', '9', '68766', '13584', '10'), +('4', '70', '9', '83653', '13131', '10'), +('4', '70', '9', '11096', '12627', '10'), +('4', '70', '9', '16097', '12461', '10'), +('4', '70', '15', '83458', '17008', '10'), +('4', '70', '15', '70621', '15925', '10'), +('4', '70', '15', '71117', '15742', '10'), +('4', '70', '15', '71588', '15288', '10'), +('4', '70', '20', '16156', '19087', '10'), +('4', '70', '20', '47283', '18315', '10'), +('4', '70', '20', '70604', '14855', '10'), +('4', '70', '20', '69134', '13522', '10'), +('4', '70', '12', '71080', '16741', '10'), +('4', '70', '12', '47213', '16495', '10'), +('4', '70', '12', '25857', '11078', '10'), +('4', '70', '12', '83569', '10708', '10'), +('4', '70', '18', '83608', '16004', '10'), +('4', '70', '18', '70880', '15641', '10'), +('4', '70', '18', '69147', '12840', '10'), +('4', '70', '18', '71096', '12078', '10'), +('4', '70', '19', '69439', '14350', '10'), +('4', '70', '19', '83573', '12246', '10'), +('4', '70', '19', '19094', '12152', '10'), +('4', '70', '19', '70878', '12059', '10'), +('4', '70', '13', '83639', '255588', '10'), +('4', '70', '13', '69052', '205324', '10'), +('4', '70', '13', '47314', '199776', '10'), +('4', '70', '13', '83576', '199349', '10'), +('4', '70', '14', '83639', '255588', '10'), +('4', '70', '14', '69052', '205324', '10'), +('4', '70', '14', '47314', '199776', '10'), +('4', '70', '14', '83576', '199349', '10'), +('4', '70', '11', '83582', '263565', '10'), +('4', '70', '11', '47325', '228128', '10'), +('4', '70', '11', '83539', '219189', '10'), +('4', '70', '11', '69054', '213516', '10'), +('4', '70', '22', '21805', '0', '9'), +('4', '70', '22', '61948', '0', '9'), +('4', '70', '22', '66397', '0', '9'), +('4', '70', '22', '21807', '0', '9'), +('4', '70', '1', '71624', '18193', '9'), +('4', '70', '1', '68949', '17621', '9'), +('4', '70', '1', '7125', '15282', '9'), +('4', '70', '1', '47287', '13280', '9'), +('4', '70', '2', '70874', '20934', '9'), +('4', '70', '2', '28605', '15307', '9'), +('4', '70', '2', '28648', '15288', '9'), +('4', '70', '2', '47209', '8569', '9'), +('4', '70', '3', '47245', '17397', '9'), +('4', '70', '3', '47299', '11087', '9'), +('4', '70', '3', '69157', '10775', '9'), +('4', '70', '3', '70718', '10596', '9'), +('4', '70', '5', '47273', '13906', '9'), +('4', '70', '5', '47275', '12179', '9'), +('4', '70', '5', '68808', '12119', '9'), +('4', '70', '5', '7769', '11939', '9'), +('4', '70', '8', '69064', '20577', '9'), +('4', '70', '8', '69165', '20466', '9'), +('4', '70', '8', '69072', '17198', '9'), +('4', '70', '8', '70662', '15560', '9'), +('4', '70', '6', '70717', '19780', '9'), +('4', '70', '6', '68757', '18891', '9'), +('4', '70', '6', '13674', '14631', '9'), +('4', '70', '6', '28902', '13011', '9'), +('4', '70', '17', '70879', '14755', '9'), +('4', '70', '17', '69151', '13850', '9'), +('4', '70', '17', '70713', '12140', '9'), +('4', '70', '17', '68780', '10253', '9'), +('4', '70', '7', '68706', '15341', '9'), +('4', '70', '7', '16097', '12461', '9'), +('4', '70', '7', '70875', '12447', '9'), +('4', '70', '7', '70711', '10763', '9'), +('4', '70', '9', '68766', '13584', '9'), +('4', '70', '9', '11096', '12627', '9'), +('4', '70', '9', '16097', '12461', '9'), +('4', '70', '9', '70876', '11296', '9'), +('4', '70', '15', '70621', '15925', '9'), +('4', '70', '15', '71117', '15742', '9'), +('4', '70', '15', '71588', '15288', '9'), +('4', '70', '15', '71608', '13583', '9'), +('4', '70', '20', '16156', '19087', '9'), +('4', '70', '20', '47283', '18315', '9'), +('4', '70', '20', '70604', '14855', '9'), +('4', '70', '20', '69134', '13522', '9'), +('4', '70', '12', '71080', '16741', '9'), +('4', '70', '12', '47213', '16495', '9'), +('4', '70', '12', '25857', '11078', '9'), +('4', '70', '12', '70877', '9599', '9'), +('4', '70', '18', '70880', '15641', '9'), +('4', '70', '18', '69147', '12840', '9'), +('4', '70', '18', '71096', '12078', '9'), +('4', '70', '18', '82717', '11760', '9'), +('4', '70', '19', '69439', '14350', '9'), +('4', '70', '19', '19094', '12152', '9'), +('4', '70', '19', '70878', '12059', '9'), +('4', '70', '19', '30569', '11872', '9'), +('4', '70', '13', '69052', '205324', '9'), +('4', '70', '13', '47314', '199776', '9'), +('4', '70', '13', '47312', '184705', '9'), +('4', '70', '13', '62649', '184183', '9'), +('4', '70', '14', '69052', '205324', '9'), +('4', '70', '14', '47314', '199776', '9'), +('4', '70', '14', '47312', '184705', '9'), +('4', '70', '14', '62649', '184183', '9'), +('4', '70', '11', '47325', '228128', '9'), +('4', '70', '11', '69054', '213516', '9'), +('4', '70', '11', '47265', '204233', '9'), +('4', '70', '11', '70628', '197855', '9'), +('4', '70', '22', '21805', '0', '8'), +('4', '70', '22', '61948', '0', '8'), +('4', '70', '22', '66397', '0', '8'), +('4', '70', '22', '21807', '0', '8'), +('4', '70', '1', '68949', '17621', '8'), +('4', '70', '1', '7125', '15282', '8'), +('4', '70', '1', '47287', '13280', '8'), +('4', '70', '1', '32106', '12912', '8'), +('4', '70', '2', '70874', '20934', '8'), +('4', '70', '2', '28605', '15307', '8'), +('4', '70', '2', '28648', '15288', '8'), +('4', '70', '2', '47209', '8569', '8'), +('4', '70', '3', '47245', '17397', '8'), +('4', '70', '3', '47299', '11087', '8'), +('4', '70', '3', '69157', '10775', '8'), +('4', '70', '3', '70718', '10596', '8'), +('4', '70', '5', '47273', '13906', '8'), +('4', '70', '5', '47275', '12179', '8'), +('4', '70', '5', '68808', '12119', '8'), +('4', '70', '5', '7769', '11939', '8'), +('4', '70', '8', '69064', '20577', '8'), +('4', '70', '8', '69165', '20466', '8'), +('4', '70', '8', '69072', '17198', '8'), +('4', '70', '8', '70662', '15560', '8'), +('4', '70', '6', '70717', '19780', '8'), +('4', '70', '6', '68757', '18891', '8'), +('4', '70', '6', '13674', '14631', '8'), +('4', '70', '6', '28902', '13011', '8'), +('4', '70', '17', '70879', '14755', '8'), +('4', '70', '17', '69151', '13850', '8'), +('4', '70', '17', '70713', '12140', '8'), +('4', '70', '17', '68780', '10253', '8'), +('4', '70', '7', '68706', '15341', '8'), +('4', '70', '7', '16097', '12461', '8'), +('4', '70', '7', '70875', '12447', '8'), +('4', '70', '7', '70711', '10763', '8'), +('4', '70', '9', '68766', '13584', '8'), +('4', '70', '9', '11096', '12627', '8'), +('4', '70', '9', '16097', '12461', '8'), +('4', '70', '9', '70876', '11296', '8'), +('4', '70', '15', '70621', '15925', '8'), +('4', '70', '15', '71117', '15742', '8'), +('4', '70', '15', '9959', '12217', '8'), +('4', '70', '15', '68111', '11850', '8'), +('4', '70', '20', '16156', '19087', '8'), +('4', '70', '20', '47283', '18315', '8'), +('4', '70', '20', '70604', '14855', '8'), +('4', '70', '20', '69134', '13522', '8'), +('4', '70', '12', '71080', '16741', '8'), +('4', '70', '12', '47213', '16495', '8'), +('4', '70', '12', '25857', '11078', '8'), +('4', '70', '12', '70877', '9599', '8'), +('4', '70', '18', '70880', '15641', '8'), +('4', '70', '18', '69147', '12840', '8'), +('4', '70', '18', '71096', '12078', '8'), +('4', '70', '18', '47201', '11410', '8'), +('4', '70', '19', '69439', '14350', '8'), +('4', '70', '19', '19094', '12152', '8'), +('4', '70', '19', '70878', '12059', '8'), +('4', '70', '19', '30569', '11872', '8'), +('4', '70', '13', '69052', '203074', '8'), +('4', '70', '13', '47314', '199101', '8'), +('4', '70', '13', '62649', '184183', '8'), +('4', '70', '13', '47312', '184180', '8'), +('4', '70', '14', '69052', '203074', '8'), +('4', '70', '14', '47314', '199101', '8'), +('4', '70', '14', '62649', '184183', '8'), +('4', '70', '14', '47312', '184180', '8'), +('4', '70', '11', '47325', '228128', '8'), +('4', '70', '11', '69054', '212916', '8'), +('4', '70', '11', '47265', '204233', '8'), +('4', '70', '11', '70628', '197855', '8'), +('4', '71', '22', '12425', '0', '11'), +('4', '71', '22', '21807', '0', '11'), +('4', '71', '22', '21805', '0', '11'), +('4', '71', '22', '39342', '0', '11'), +('4', '71', '1', '83594', '21631', '11'), +('4', '71', '1', '39276', '21401', '11'), +('4', '71', '1', '71624', '18194', '11'), +('4', '71', '1', '68949', '17622', '11'), +('4', '71', '2', '70874', '20934', '11'), +('4', '71', '2', '28605', '15308', '11'), +('4', '71', '2', '28648', '15289', '11'), +('4', '71', '2', '83561', '12786', '11'), +('4', '71', '3', '39218', '20031', '11'), +('4', '71', '3', '47245', '17397', '11'), +('4', '71', '3', '39361', '14787', '11'), +('4', '71', '3', '83636', '13284', '11'), +('4', '71', '5', '39349', '20559', '11'), +('4', '71', '5', '47273', '13907', '11'), +('4', '71', '5', '39262', '13580', '11'), +('4', '71', '5', '89308', '12482', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '71', '8', '69064', '20578', '11'), +('4', '71', '8', '69165', '20467', '11'), +('4', '71', '8', '39330', '19402', '11'), +('4', '71', '8', '69072', '17199', '11'), +('4', '71', '6', '70717', '19781', '11'), +('4', '71', '6', '68757', '18892', '11'), +('4', '71', '6', '83530', '18044', '11'), +('4', '71', '6', '39367', '15185', '11'), +('4', '71', '17', '83604', '24807', '11'), +('4', '71', '17', '70879', '14756', '11'), +('4', '71', '17', '69151', '13851', '11'), +('4', '71', '17', '70713', '12140', '11'), +('4', '71', '7', '68706', '15341', '11'), +('4', '71', '7', '83565', '13897', '11'), +('4', '71', '7', '16097', '12462', '11'), +('4', '71', '7', '70875', '12448', '11'), +('4', '71', '9', '39345', '13961', '11'), +('4', '71', '9', '51707', '13608', '11'), +('4', '71', '9', '68766', '13585', '11'), +('4', '71', '9', '39291', '13547', '11'), +('4', '71', '15', '83458', '17009', '11'), +('4', '71', '15', '39374', '16387', '11'), +('4', '71', '15', '70621', '15926', '11'), +('4', '71', '15', '71117', '15742', '11'), +('4', '71', '20', '16156', '19088', '11'), +('4', '71', '20', '47283', '18315', '11'), +('4', '71', '20', '39339', '15302', '11'), +('4', '71', '20', '70604', '14856', '11'), +('4', '71', '12', '71080', '16741', '11'), +('4', '71', '12', '47213', '16496', '11'), +('4', '71', '12', '39356', '13350', '11'), +('4', '71', '12', '25857', '11078', '11'), +('4', '71', '18', '83608', '16005', '11'), +('4', '71', '18', '70880', '15642', '11'), +('4', '71', '18', '69147', '12840', '11'), +('4', '71', '18', '71096', '12079', '11'), +('4', '71', '19', '69439', '14350', '11'), +('4', '71', '19', '83573', '12247', '11'), +('4', '71', '19', '19094', '12152', '11'), +('4', '71', '19', '70878', '12059', '11'), +('4', '71', '13', '83639', '257151', '11'), +('4', '71', '13', '69052', '206629', '11'), +('4', '71', '13', '47314', '200414', '11'), +('4', '71', '13', '83576', '199950', '11'), +('4', '71', '14', '83639', '257151', '11'), +('4', '71', '14', '69052', '206629', '11'), +('4', '71', '14', '47314', '200414', '11'), +('4', '71', '14', '83576', '199950', '11'), +('4', '71', '11', '83582', '264045', '11'), +('4', '71', '11', '47325', '228549', '11'), +('4', '71', '11', '39331', '221749', '11'), +('4', '71', '11', '83539', '219699', '11'), +('4', '72', '22', '12425', '0', '11'), +('4', '72', '22', '21807', '0', '11'), +('4', '72', '22', '21805', '0', '11'), +('4', '72', '22', '39342', '0', '11'), +('4', '72', '1', '83594', '21631', '11'), +('4', '72', '1', '39276', '21402', '11'), +('4', '72', '1', '71624', '18194', '11'), +('4', '72', '1', '68949', '17623', '11'), +('4', '72', '2', '70874', '20934', '11'), +('4', '72', '2', '28605', '15308', '11'), +('4', '72', '2', '28648', '15289', '11'), +('4', '72', '2', '83561', '12787', '11'), +('4', '72', '3', '39218', '20032', '11'), +('4', '72', '3', '47245', '17397', '11'), +('4', '72', '3', '39361', '14788', '11'), +('4', '72', '3', '83636', '13285', '11'), +('4', '72', '5', '39349', '20560', '11'), +('4', '72', '5', '47273', '13907', '11'), +('4', '72', '5', '39262', '13581', '11'), +('4', '72', '5', '89308', '12483', '11'), +('4', '72', '8', '69064', '20578', '11'), +('4', '72', '8', '69165', '20468', '11'), +('4', '72', '8', '39330', '19402', '11'), +('4', '72', '8', '69072', '17199', '11'), +('4', '72', '6', '70717', '19781', '11'), +('4', '72', '6', '68757', '18892', '11'), +('4', '72', '6', '83530', '18044', '11'), +('4', '72', '6', '39367', '15185', '11'), +('4', '72', '17', '83604', '24808', '11'), +('4', '72', '17', '70879', '14756', '11'), +('4', '72', '17', '69151', '13851', '11'), +('4', '72', '17', '70713', '12141', '11'), +('4', '72', '7', '68706', '15342', '11'), +('4', '72', '7', '83565', '13898', '11'), +('4', '72', '7', '16097', '12462', '11'), +('4', '72', '7', '70875', '12449', '11'), +('4', '72', '9', '39345', '13961', '11'), +('4', '72', '9', '51707', '13609', '11'), +('4', '72', '9', '68766', '13585', '11'), +('4', '72', '9', '39291', '13548', '11'), +('4', '72', '15', '83458', '17009', '11'), +('4', '72', '15', '39374', '16387', '11'), +('4', '72', '15', '70621', '15926', '11'), +('4', '72', '15', '71117', '15743', '11'), +('4', '72', '20', '16156', '19088', '11'), +('4', '72', '20', '47283', '18315', '11'), +('4', '72', '20', '39339', '15303', '11'), +('4', '72', '20', '70604', '14856', '11'), +('4', '72', '12', '71080', '16742', '11'), +('4', '72', '12', '47213', '16496', '11'), +('4', '72', '12', '39356', '13350', '11'), +('4', '72', '12', '25857', '11078', '11'), +('4', '72', '18', '83608', '16005', '11'), +('4', '72', '18', '70880', '15643', '11'), +('4', '72', '18', '69147', '12841', '11'), +('4', '72', '18', '71096', '12079', '11'), +('4', '72', '19', '69439', '14351', '11'), +('4', '72', '19', '83573', '12248', '11'), +('4', '72', '19', '19094', '12152', '11'), +('4', '72', '19', '70878', '12059', '11'), +('4', '72', '13', '83639', '258715', '11'), +('4', '72', '13', '69052', '207934', '11'), +('4', '72', '13', '47314', '201052', '11'), +('4', '72', '13', '83576', '200550', '11'), +('4', '72', '14', '83639', '258715', '11'), +('4', '72', '14', '69052', '207934', '11'), +('4', '72', '14', '47314', '201052', '11'), +('4', '72', '14', '83576', '200550', '11'), +('4', '72', '11', '83582', '264526', '11'), +('4', '72', '11', '47325', '228969', '11'), +('4', '72', '11', '39331', '222169', '11'), +('4', '72', '11', '83539', '220269', '11'), +('4', '73', '22', '12425', '0', '11'), +('4', '73', '22', '21807', '0', '11'), +('4', '73', '22', '21805', '0', '11'), +('4', '73', '22', '39342', '0', '11'), +('4', '73', '1', '83594', '21632', '11'), +('4', '73', '1', '39276', '21402', '11'), +('4', '73', '1', '71624', '18195', '11'), +('4', '73', '1', '68949', '17623', '11'), +('4', '73', '2', '70874', '20934', '11'), +('4', '73', '2', '28605', '15309', '11'), +('4', '73', '2', '28648', '15289', '11'), +('4', '73', '2', '83561', '12788', '11'), +('4', '73', '3', '39218', '20032', '11'), +('4', '73', '3', '47245', '17398', '11'), +('4', '73', '3', '39361', '14789', '11'), +('4', '73', '3', '83636', '13286', '11'), +('4', '73', '5', '39349', '20560', '11'), +('4', '73', '5', '47273', '13908', '11'), +('4', '73', '5', '39262', '13581', '11'), +('4', '73', '5', '89308', '12484', '11'), +('4', '73', '8', '69064', '20579', '11'), +('4', '73', '8', '69165', '20468', '11'), +('4', '73', '8', '39330', '19403', '11'), +('4', '73', '8', '69072', '17200', '11'), +('4', '73', '6', '70717', '19782', '11'), +('4', '73', '6', '68757', '18893', '11'), +('4', '73', '6', '83530', '18045', '11'), +('4', '73', '6', '39367', '15185', '11'), +('4', '73', '17', '83604', '24809', '11'), +('4', '73', '17', '70879', '14757', '11'), +('4', '73', '17', '69151', '13852', '11'), +('4', '73', '17', '70713', '12141', '11'), +('4', '73', '7', '68706', '15342', '11'), +('4', '73', '7', '83565', '13899', '11'), +('4', '73', '7', '16097', '12463', '11'), +('4', '73', '7', '70875', '12449', '11'), +('4', '73', '9', '39345', '13962', '11'), +('4', '73', '9', '51707', '13609', '11'), +('4', '73', '9', '68766', '13585', '11'), +('4', '73', '9', '39291', '13548', '11'), +('4', '73', '15', '83458', '17010', '11'), +('4', '73', '15', '39374', '16388', '11'), +('4', '73', '15', '70621', '15927', '11'), +('4', '73', '15', '71117', '15743', '11'), +('4', '73', '20', '16156', '19089', '11'), +('4', '73', '20', '47283', '18315', '11'), +('4', '73', '20', '39339', '15304', '11'), +('4', '73', '20', '70604', '14857', '11'), +('4', '73', '12', '71080', '16742', '11'), +('4', '73', '12', '47213', '16497', '11'), +('4', '73', '12', '39356', '13351', '11'), +('4', '73', '12', '25857', '11078', '11'), +('4', '73', '18', '83608', '16006', '11'), +('4', '73', '18', '70880', '15643', '11'), +('4', '73', '18', '69147', '12841', '11'), +('4', '73', '18', '71096', '12080', '11'), +('4', '73', '19', '69439', '14351', '11'), +('4', '73', '19', '83573', '12249', '11'), +('4', '73', '19', '19094', '12153', '11'), +('4', '73', '19', '70878', '12059', '11'), +('4', '73', '13', '83639', '260278', '11'), +('4', '73', '13', '69052', '209239', '11'), +('4', '73', '13', '47314', '201690', '11'), +('4', '73', '13', '83576', '201151', '11'), +('4', '73', '14', '83639', '260278', '11'), +('4', '73', '14', '69052', '209239', '11'), +('4', '73', '14', '47314', '201690', '11'), +('4', '73', '14', '83576', '201151', '11'), +('4', '73', '11', '83582', '265006', '11'), +('4', '73', '11', '47325', '229390', '11'), +('4', '73', '11', '39331', '222589', '11'), +('4', '73', '11', '83539', '220780', '11'), +('4', '74', '22', '12425', '0', '11'), +('4', '74', '22', '21807', '0', '11'), +('4', '74', '22', '21805', '0', '11'), +('4', '74', '22', '39342', '0', '11'), +('4', '74', '1', '83594', '21633', '11'), +('4', '74', '1', '39276', '21403', '11'), +('4', '74', '1', '71624', '18195', '11'), +('4', '74', '1', '68949', '17624', '11'), +('4', '74', '2', '70874', '20934', '11'), +('4', '74', '2', '28605', '15309', '11'), +('4', '74', '2', '28648', '15290', '11'), +('4', '74', '2', '83561', '12789', '11'), +('4', '74', '3', '39218', '20033', '11'), +('4', '74', '3', '47245', '17398', '11'), +('4', '74', '3', '39361', '14789', '11'), +('4', '74', '3', '83636', '13286', '11'), +('4', '74', '5', '39349', '20561', '11'), +('4', '74', '5', '47273', '13908', '11'), +('4', '74', '5', '39262', '13582', '11'), +('4', '74', '5', '89308', '12484', '11'), +('4', '74', '8', '69064', '20579', '11'), +('4', '74', '8', '69165', '20469', '11'), +('4', '74', '8', '39330', '19404', '11'), +('4', '74', '8', '69072', '17200', '11'), +('4', '74', '6', '70717', '19783', '11'), +('4', '74', '6', '68757', '18893', '11'), +('4', '74', '6', '83530', '18045', '11'), +('4', '74', '6', '39367', '15185', '11'), +('4', '74', '17', '83604', '24810', '11'), +('4', '74', '17', '70879', '14758', '11'), +('4', '74', '17', '69151', '13852', '11'), +('4', '74', '17', '70713', '12142', '11'), +('4', '74', '7', '68706', '15342', '11'), +('4', '74', '7', '83565', '13900', '11'), +('4', '74', '7', '16097', '12463', '11'), +('4', '74', '7', '70875', '12450', '11'), +('4', '74', '9', '39345', '13963', '11'), +('4', '74', '9', '51707', '13610', '11'), +('4', '74', '9', '68766', '13586', '11'), +('4', '74', '9', '39291', '13549', '11'), +('4', '74', '15', '83458', '17010', '11'), +('4', '74', '15', '39374', '16389', '11'), +('4', '74', '15', '70621', '15928', '11'), +('4', '74', '15', '71117', '15744', '11'), +('4', '74', '20', '16156', '19089', '11'), +('4', '74', '20', '47283', '18315', '11'), +('4', '74', '20', '39339', '15304', '11'), +('4', '74', '20', '70604', '14857', '11'), +('4', '74', '12', '71080', '16743', '11'), +('4', '74', '12', '47213', '16497', '11'), +('4', '74', '12', '39356', '13352', '11'), +('4', '74', '12', '25857', '11078', '11'), +('4', '74', '18', '83608', '16007', '11'), +('4', '74', '18', '70880', '15644', '11'), +('4', '74', '18', '69147', '12841', '11'), +('4', '74', '18', '71096', '12081', '11'), +('4', '74', '19', '69439', '14352', '11'), +('4', '74', '19', '83573', '12250', '11'), +('4', '74', '19', '19094', '12153', '11'), +('4', '74', '19', '70878', '12059', '11'), +('4', '74', '13', '83639', '261841', '11'), +('4', '74', '13', '69052', '210544', '11'), +('4', '74', '13', '47314', '202327', '11'), +('4', '74', '13', '83576', '201751', '11'), +('4', '74', '14', '83639', '261841', '11'), +('4', '74', '14', '69052', '210544', '11'), +('4', '74', '14', '47314', '202327', '11'), +('4', '74', '14', '83576', '201751', '11'), +('4', '74', '11', '83582', '265486', '11'), +('4', '74', '11', '47325', '229810', '11'), +('4', '74', '11', '39331', '222949', '11'), +('4', '74', '11', '83539', '221290', '11'), +('4', '75', '22', '12425', '0', '13'), +('4', '75', '22', '21807', '0', '13'), +('4', '75', '22', '39342', '0', '13'), +('4', '75', '22', '7867', '0', '13'), +('4', '75', '1', '83594', '21633', '13'), +('4', '75', '1', '39276', '21403', '13'), +('4', '75', '1', '80648', '19623', '13'), +('4', '75', '1', '71624', '18196', '13'), +('4', '75', '2', '80524', '29302', '13'), +('4', '75', '2', '70874', '20935', '13'), +('4', '75', '2', '53382', '16350', '13'), +('4', '75', '2', '28605', '15309', '13'), +('4', '75', '3', '39218', '20033', '13'), +('4', '75', '3', '80637', '19651', '13'), +('4', '75', '3', '47245', '17398', '13'), +('4', '75', '3', '39361', '14790', '13'), +('4', '75', '5', '46918', '24649', '13'), +('4', '75', '5', '39349', '20561', '13'), +('4', '75', '5', '80616', '18209', '13'), +('4', '75', '5', '80670', '17973', '13'), +('4', '75', '8', '46885', '27359', '13'), +('4', '75', '8', '80677', '21329', '13'), +('4', '75', '8', '69064', '20580', '13'), +('4', '75', '8', '69165', '20469', '13'), +('4', '75', '6', '80638', '28071', '13'), +('4', '75', '6', '70717', '19783', '13'), +('4', '75', '6', '68757', '18894', '13'), +('4', '75', '6', '83530', '18045', '13'), +('4', '75', '17', '83604', '24810', '13'), +('4', '75', '17', '53387', '18725', '13'), +('4', '75', '17', '70879', '14758', '13'), +('4', '75', '17', '46825', '14412', '13'), +('4', '75', '7', '80525', '21463', '13'), +('4', '75', '7', '53383', '16646', '13'), +('4', '75', '7', '68706', '15343', '13'), +('4', '75', '7', '83565', '13901', '13'), +('4', '75', '9', '80521', '17826', '13'), +('4', '75', '9', '46937', '17031', '13'), +('4', '75', '9', '53384', '16891', '13'), +('4', '75', '9', '39345', '13963', '13'), +('4', '75', '15', '80667', '20831', '13'), +('4', '75', '15', '79909', '20629', '13'), +('4', '75', '15', '80627', '18719', '13'), +('4', '75', '15', '79908', '18246', '13'), +('4', '75', '20', '80678', '30359', '13'), +('4', '75', '20', '46935', '19535', '13'), +('4', '75', '20', '16156', '19090', '13'), +('4', '75', '20', '47283', '18315', '13'), +('4', '75', '12', '53385', '24831', '13'), +('4', '75', '12', '71080', '16743', '13'), +('4', '75', '12', '47213', '16498', '13'), +('4', '75', '12', '39356', '13352', '13'), +('4', '75', '18', '80526', '22192', '13'), +('4', '75', '18', '53388', '17626', '13'), +('4', '75', '18', '83608', '16008', '13'), +('4', '75', '18', '70880', '15645', '13'), +('4', '75', '19', '80523', '19960', '13'), +('4', '75', '19', '53386', '16908', '13'), +('4', '75', '19', '69439', '14352', '13'), +('4', '75', '19', '83573', '12250', '13'), +('4', '75', '13', '46856', '295387', '13'), +('4', '75', '13', '46854', '290947', '13'), +('4', '75', '13', '83639', '270019', '13'), +('4', '75', '13', '80674', '261177', '13'), +('4', '75', '14', '46856', '295387', '13'), +('4', '75', '14', '46854', '290947', '13'), +('4', '75', '14', '83639', '270019', '13'), +('4', '75', '14', '80674', '261177', '13'), +('4', '75', '11', '80655', '332653', '13'), +('4', '75', '11', '46930', '324251', '13'), +('4', '75', '11', '83582', '265966', '13'), +('4', '75', '11', '47325', '230231', '13'), +('4', '75', '22', '12425', '0', '12'), +('4', '75', '22', '21807', '0', '12'), +('4', '75', '22', '39342', '0', '12'), +('4', '75', '22', '7867', '0', '12'), +('4', '75', '1', '83594', '21633', '12'), +('4', '75', '1', '39276', '21403', '12'), +('4', '75', '1', '71624', '18196', '12'), +('4', '75', '1', '68949', '17625', '12'), +('4', '75', '2', '70874', '20935', '12'), +('4', '75', '2', '53382', '16350', '12'), +('4', '75', '2', '28605', '15309', '12'), +('4', '75', '2', '28648', '15290', '12'), +('4', '75', '3', '39218', '20033', '12'), +('4', '75', '3', '47245', '17398', '12'), +('4', '75', '3', '39361', '14790', '12'), +('4', '75', '3', '46924', '14056', '12'), +('4', '75', '5', '46918', '24649', '12'), +('4', '75', '5', '39349', '20561', '12'), +('4', '75', '5', '46934', '14905', '12'), +('4', '75', '5', '47273', '13908', '12'), +('4', '75', '8', '46885', '27359', '12'), +('4', '75', '8', '69064', '20580', '12'), +('4', '75', '8', '69165', '20469', '12'), +('4', '75', '8', '39330', '19404', '12'), +('4', '75', '6', '70717', '19783', '12'), +('4', '75', '6', '68757', '18894', '12'), +('4', '75', '6', '83530', '18045', '12'), +('4', '75', '6', '46933', '16832', '12'), +('4', '75', '17', '83604', '24810', '12'), +('4', '75', '17', '53387', '18725', '12'), +('4', '75', '17', '70879', '14758', '12'), +('4', '75', '17', '46825', '14412', '12'), +('4', '75', '7', '53383', '16646', '12'), +('4', '75', '7', '68706', '15343', '12'), +('4', '75', '7', '83565', '13901', '12'), +('4', '75', '7', '16097', '12463', '12'), +('4', '75', '9', '46937', '17031', '12'), +('4', '75', '9', '53384', '16891', '12'), +('4', '75', '9', '39345', '13963', '12'), +('4', '75', '9', '51707', '13611', '12'), +('4', '75', '15', '46881', '17834', '12'), +('4', '75', '15', '83458', '17010', '12'), +('4', '75', '15', '46893', '16948', '12'), +('4', '75', '15', '39374', '16390', '12'), +('4', '75', '20', '46935', '19535', '12'), +('4', '75', '20', '16156', '19090', '12'), +('4', '75', '20', '47283', '18315', '12'), +('4', '75', '20', '39339', '15305', '12'), +('4', '75', '12', '53385', '24831', '12'), +('4', '75', '12', '71080', '16743', '12'), +('4', '75', '12', '47213', '16498', '12'), +('4', '75', '12', '39356', '13352', '12'), +('4', '75', '18', '53388', '17626', '12'), +('4', '75', '18', '83608', '16008', '12'), +('4', '75', '18', '70880', '15645', '12'), +('4', '75', '18', '69147', '12842', '12'), +('4', '75', '19', '53386', '16908', '12'), +('4', '75', '19', '69439', '14352', '12'), +('4', '75', '19', '83573', '12250', '12'), +('4', '75', '19', '19094', '12153', '12'), +('4', '75', '13', '46856', '295387', '12'), +('4', '75', '13', '46854', '290947', '12'), +('4', '75', '13', '83639', '270019', '12'), +('4', '75', '13', '46904', '245798', '12'), +('4', '75', '14', '46856', '295387', '12'), +('4', '75', '14', '46854', '290947', '12'), +('4', '75', '14', '83639', '270019', '12'), +('4', '75', '14', '46904', '245798', '12'), +('4', '75', '11', '46930', '324251', '12'), +('4', '75', '11', '83582', '265966', '12'), +('4', '75', '11', '47325', '230231', '12'), +('4', '75', '11', '39331', '223369', '12'), +('4', '76', '22', '12425', '0', '13'), +('4', '76', '22', '21807', '0', '13'), +('4', '76', '22', '39342', '0', '13'), +('4', '76', '22', '7867', '0', '13'), +('4', '76', '1', '83594', '21634', '13'), +('4', '76', '1', '39276', '21404', '13'), +('4', '76', '1', '80648', '19624', '13'), +('4', '76', '1', '71624', '18196', '13'), +('4', '76', '2', '80524', '29302', '13'), +('4', '76', '2', '70874', '20935', '13'), +('4', '76', '2', '53382', '16350', '13'), +('4', '76', '2', '28605', '15310', '13'), +('4', '76', '3', '39218', '20034', '13'), +('4', '76', '3', '80637', '19652', '13'), +('4', '76', '3', '47245', '17398', '13'), +('4', '76', '3', '39361', '14790', '13'), +('4', '76', '5', '46918', '24650', '13'), +('4', '76', '5', '39349', '20562', '13'), +('4', '76', '5', '80616', '18210', '13'), +('4', '76', '5', '80670', '17974', '13'), +('4', '76', '8', '46885', '27360', '13'), +('4', '76', '8', '80677', '21330', '13'), +('4', '76', '8', '69064', '20581', '13'), +('4', '76', '8', '69165', '20470', '13'), +('4', '76', '6', '80638', '28072', '13'), +('4', '76', '6', '70717', '19784', '13'), +('4', '76', '6', '68757', '18894', '13'), +('4', '76', '6', '83530', '18045', '13'), +('4', '76', '17', '83604', '24811', '13'), +('4', '76', '17', '53387', '18725', '13'), +('4', '76', '17', '70879', '14759', '13'), +('4', '76', '17', '46825', '14412', '13'), +('4', '76', '7', '80525', '21464', '13'), +('4', '76', '7', '53383', '16647', '13'), +('4', '76', '7', '68706', '15343', '13'), +('4', '76', '7', '83565', '13901', '13'), +('4', '76', '9', '80521', '17826', '13'), +('4', '76', '9', '46937', '17032', '13'), +('4', '76', '9', '53384', '16892', '13'), +('4', '76', '9', '39345', '13964', '13'), +('4', '76', '15', '80667', '20832', '13'), +('4', '76', '15', '79909', '20630', '13'), +('4', '76', '15', '80627', '18720', '13'), +('4', '76', '15', '79908', '18246', '13'), +('4', '76', '20', '80678', '30360', '13'), +('4', '76', '20', '46935', '19536', '13'), +('4', '76', '20', '16156', '19090', '13'), +('4', '76', '20', '47283', '18315', '13'), +('4', '76', '12', '53385', '24831', '13'), +('4', '76', '12', '71080', '16744', '13'), +('4', '76', '12', '47213', '16498', '13'), +('4', '76', '12', '39356', '13353', '13'), +('4', '76', '18', '80526', '22192', '13'), +('4', '76', '18', '53388', '17626', '13'), +('4', '76', '18', '83608', '16008', '13'), +('4', '76', '18', '70880', '15645', '13'), +('4', '76', '19', '80523', '19961', '13'), +('4', '76', '19', '53386', '16909', '13'), +('4', '76', '19', '69439', '14352', '13'), +('4', '76', '19', '83573', '12251', '13'), +('4', '76', '13', '46856', '297011', '13'), +('4', '76', '13', '46854', '292511', '13'), +('4', '76', '13', '83639', '271582', '13'), +('4', '76', '13', '80674', '261658', '13'), +('4', '76', '14', '46856', '297011', '13'), +('4', '76', '14', '46854', '292511', '13'), +('4', '76', '14', '83639', '271582', '13'), +('4', '76', '14', '80674', '261658', '13'), +('4', '76', '11', '80655', '333253', '13'), +('4', '76', '11', '46930', '324852', '13'), +('4', '76', '11', '83582', '266446', '13'), +('4', '76', '11', '47325', '230651', '13'), +('4', '77', '22', '12425', '0', '13'), +('4', '77', '22', '21807', '0', '13'), +('4', '77', '22', '39342', '0', '13'), +('4', '77', '22', '7867', '0', '13'), +('4', '77', '1', '83594', '21635', '13'), +('4', '77', '1', '39276', '21404', '13'), +('4', '77', '1', '80648', '19625', '13'), +('4', '77', '1', '71624', '18197', '13'), +('4', '77', '2', '80524', '29303', '13'), +('4', '77', '2', '70874', '20935', '13'), +('4', '77', '2', '53382', '16351', '13'), +('4', '77', '2', '28605', '15310', '13'), +('4', '77', '3', '39218', '20035', '13'), +('4', '77', '3', '80637', '19653', '13'), +('4', '77', '3', '47245', '17398', '13'), +('4', '77', '3', '39361', '14791', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '77', '5', '46918', '24651', '13'), +('4', '77', '5', '39349', '20563', '13'), +('4', '77', '5', '80616', '18210', '13'), +('4', '77', '5', '80670', '17975', '13'), +('4', '77', '8', '46885', '27361', '13'), +('4', '77', '8', '80677', '21331', '13'), +('4', '77', '8', '69064', '20581', '13'), +('4', '77', '8', '69165', '20470', '13'), +('4', '77', '6', '80638', '28073', '13'), +('4', '77', '6', '70717', '19784', '13'), +('4', '77', '6', '68757', '18895', '13'), +('4', '77', '6', '83530', '18045', '13'), +('4', '77', '17', '83604', '24812', '13'), +('4', '77', '17', '53387', '18725', '13'), +('4', '77', '17', '70879', '14760', '13'), +('4', '77', '17', '46825', '14413', '13'), +('4', '77', '7', '80525', '21465', '13'), +('4', '77', '7', '53383', '16647', '13'), +('4', '77', '7', '68706', '15344', '13'), +('4', '77', '7', '83565', '13902', '13'), +('4', '77', '9', '80521', '17827', '13'), +('4', '77', '9', '46937', '17033', '13'), +('4', '77', '9', '53384', '16892', '13'), +('4', '77', '9', '39345', '13965', '13'), +('4', '77', '15', '80667', '20833', '13'), +('4', '77', '15', '79909', '20631', '13'), +('4', '77', '15', '80627', '18721', '13'), +('4', '77', '15', '79908', '18247', '13'), +('4', '77', '20', '80678', '30361', '13'), +('4', '77', '20', '46935', '19536', '13'), +('4', '77', '20', '16156', '19091', '13'), +('4', '77', '20', '47283', '18316', '13'), +('4', '77', '12', '53385', '24832', '13'), +('4', '77', '12', '71080', '16744', '13'), +('4', '77', '12', '47213', '16499', '13'), +('4', '77', '12', '39356', '13353', '13'), +('4', '77', '18', '80526', '22193', '13'), +('4', '77', '18', '53388', '17627', '13'), +('4', '77', '18', '83608', '16009', '13'), +('4', '77', '18', '70880', '15646', '13'), +('4', '77', '19', '80523', '19962', '13'), +('4', '77', '19', '53386', '16910', '13'), +('4', '77', '19', '69439', '14353', '13'), +('4', '77', '19', '83573', '12252', '13'), +('4', '77', '13', '46856', '298634', '13'), +('4', '77', '13', '46854', '294134', '13'), +('4', '77', '13', '83639', '273146', '13'), +('4', '77', '13', '80674', '262079', '13'), +('4', '77', '14', '46856', '298634', '13'), +('4', '77', '14', '46854', '294134', '13'), +('4', '77', '14', '83639', '273146', '13'), +('4', '77', '14', '80674', '262079', '13'), +('4', '77', '11', '80655', '333854', '13'), +('4', '77', '11', '46930', '325452', '13'), +('4', '77', '11', '83582', '266927', '13'), +('4', '77', '11', '47325', '231012', '13'), +('4', '78', '22', '12425', '0', '13'), +('4', '78', '22', '21807', '0', '13'), +('4', '78', '22', '39342', '0', '13'), +('4', '78', '22', '7867', '0', '13'), +('4', '78', '1', '83594', '21636', '13'), +('4', '78', '1', '39276', '21405', '13'), +('4', '78', '1', '80648', '19626', '13'), +('4', '78', '1', '71624', '18197', '13'), +('4', '78', '2', '80524', '29304', '13'), +('4', '78', '2', '70874', '20935', '13'), +('4', '78', '2', '53382', '16351', '13'), +('4', '78', '2', '28605', '15311', '13'), +('4', '78', '3', '39218', '20035', '13'), +('4', '78', '3', '80637', '19654', '13'), +('4', '78', '3', '47245', '17398', '13'), +('4', '78', '3', '39361', '14791', '13'), +('4', '78', '5', '46918', '24651', '13'), +('4', '78', '5', '39349', '20563', '13'), +('4', '78', '5', '80616', '18211', '13'), +('4', '78', '5', '80670', '17976', '13'), +('4', '78', '8', '46885', '27362', '13'), +('4', '78', '8', '80677', '21332', '13'), +('4', '78', '8', '69064', '20582', '13'), +('4', '78', '8', '69165', '20471', '13'), +('4', '78', '6', '80638', '28074', '13'), +('4', '78', '6', '70717', '19785', '13'), +('4', '78', '6', '68757', '18895', '13'), +('4', '78', '6', '83530', '18045', '13'), +('4', '78', '17', '83604', '24813', '13'), +('4', '78', '17', '53387', '18726', '13'), +('4', '78', '17', '70879', '14761', '13'), +('4', '78', '17', '46825', '14413', '13'), +('4', '78', '7', '80525', '21466', '13'), +('4', '78', '7', '53383', '16648', '13'), +('4', '78', '7', '68706', '15344', '13'), +('4', '78', '7', '83565', '13903', '13'), +('4', '78', '9', '80521', '17828', '13'), +('4', '78', '9', '46937', '17034', '13'), +('4', '78', '9', '53384', '16893', '13'), +('4', '78', '9', '39345', '13965', '13'), +('4', '78', '15', '80667', '20834', '13'), +('4', '78', '15', '79909', '20632', '13'), +('4', '78', '15', '80627', '18722', '13'), +('4', '78', '15', '79908', '18248', '13'), +('4', '78', '20', '80678', '30362', '13'), +('4', '78', '20', '46935', '19537', '13'), +('4', '78', '20', '16156', '19091', '13'), +('4', '78', '20', '47283', '18316', '13'), +('4', '78', '12', '53385', '24832', '13'), +('4', '78', '12', '71080', '16745', '13'), +('4', '78', '12', '47213', '16499', '13'), +('4', '78', '12', '39356', '13354', '13'), +('4', '78', '18', '80526', '22194', '13'), +('4', '78', '18', '53388', '17628', '13'), +('4', '78', '18', '83608', '16010', '13'), +('4', '78', '18', '70880', '15647', '13'), +('4', '78', '19', '80523', '19962', '13'), +('4', '78', '19', '53386', '16910', '13'), +('4', '78', '19', '69439', '14353', '13'), +('4', '78', '19', '83573', '12253', '13'), +('4', '78', '13', '46856', '300258', '13'), +('4', '78', '13', '46854', '295758', '13'), +('4', '78', '13', '83639', '274709', '13'), +('4', '78', '13', '80674', '262559', '13'), +('4', '78', '14', '46856', '300258', '13'), +('4', '78', '14', '46854', '295758', '13'), +('4', '78', '14', '83639', '274709', '13'), +('4', '78', '14', '80674', '262559', '13'), +('4', '78', '11', '80655', '334455', '13'), +('4', '78', '11', '46930', '325993', '13'), +('4', '78', '11', '83582', '267407', '13'), +('4', '78', '11', '47325', '231432', '13'), +('4', '79', '22', '12425', '0', '13'), +('4', '79', '22', '21807', '0', '13'), +('4', '79', '22', '39342', '0', '13'), +('4', '79', '22', '7867', '0', '13'), +('4', '79', '1', '83594', '21636', '13'), +('4', '79', '1', '39276', '21405', '13'), +('4', '79', '1', '80648', '19626', '13'), +('4', '79', '1', '71624', '18198', '13'), +('4', '79', '2', '80524', '29305', '13'), +('4', '79', '2', '70874', '20936', '13'), +('4', '79', '2', '53382', '16352', '13'), +('4', '79', '2', '28605', '15311', '13'), +('4', '79', '3', '39218', '20036', '13'), +('4', '79', '3', '80637', '19655', '13'), +('4', '79', '3', '47245', '17398', '13'), +('4', '79', '3', '39361', '14792', '13'), +('4', '79', '5', '46918', '24652', '13'), +('4', '79', '5', '39349', '20564', '13'), +('4', '79', '5', '80616', '18212', '13'), +('4', '79', '5', '80670', '17977', '13'), +('4', '79', '8', '46885', '27363', '13'), +('4', '79', '8', '80677', '21333', '13'), +('4', '79', '8', '69064', '20582', '13'), +('4', '79', '8', '69165', '20471', '13'), +('4', '79', '6', '80638', '28075', '13'), +('4', '79', '6', '70717', '19786', '13'), +('4', '79', '6', '68757', '18895', '13'), +('4', '79', '6', '83530', '18045', '13'), +('4', '79', '17', '83604', '24813', '13'), +('4', '79', '17', '53387', '18726', '13'), +('4', '79', '17', '70879', '14761', '13'), +('4', '79', '17', '46825', '14414', '13'), +('4', '79', '7', '80525', '21467', '13'), +('4', '79', '7', '53383', '16649', '13'), +('4', '79', '7', '68706', '15344', '13'), +('4', '79', '7', '83565', '13904', '13'), +('4', '79', '9', '80521', '17829', '13'), +('4', '79', '9', '46937', '17035', '13'), +('4', '79', '9', '53384', '16894', '13'), +('4', '79', '9', '39345', '13966', '13'), +('4', '79', '15', '80667', '20835', '13'), +('4', '79', '15', '79909', '20632', '13'), +('4', '79', '15', '80627', '18723', '13'), +('4', '79', '15', '79908', '18249', '13'), +('4', '79', '20', '80678', '30363', '13'), +('4', '79', '20', '46935', '19538', '13'), +('4', '79', '20', '16156', '19092', '13'), +('4', '79', '20', '47283', '18316', '13'), +('4', '79', '12', '53385', '24833', '13'), +('4', '79', '12', '71080', '16745', '13'), +('4', '79', '12', '47213', '16500', '13'), +('4', '79', '12', '39356', '13354', '13'), +('4', '79', '18', '80526', '22195', '13'), +('4', '79', '18', '53388', '17628', '13'), +('4', '79', '18', '83608', '16011', '13'), +('4', '79', '18', '70880', '15648', '13'), +('4', '79', '19', '80523', '19963', '13'), +('4', '79', '19', '53386', '16911', '13'), +('4', '79', '19', '69439', '14354', '13'), +('4', '79', '19', '83573', '12254', '13'), +('4', '79', '13', '46856', '301822', '13'), +('4', '79', '13', '46854', '297322', '13'), +('4', '79', '13', '83639', '276272', '13'), +('4', '79', '13', '80674', '263040', '13'), +('4', '79', '14', '46856', '301822', '13'), +('4', '79', '14', '46854', '297322', '13'), +('4', '79', '14', '83639', '276272', '13'), +('4', '79', '14', '80674', '263040', '13'), +('4', '79', '11', '80655', '335055', '13'), +('4', '79', '11', '46930', '326594', '13'), +('4', '79', '11', '83582', '267887', '13'), +('4', '79', '11', '47325', '231853', '13'), +('4', '80', '22', '12425', '0', '14'), +('4', '80', '22', '21807', '0', '14'), +('4', '80', '22', '39342', '0', '14'), +('4', '80', '22', '7867', '0', '14'), +('4', '80', '1', '102641', '27259', '14'), +('4', '80', '1', '102597', '26146', '14'), +('4', '80', '1', '102625', '25945', '14'), +('4', '80', '1', '102639', '25763', '14'), +('4', '80', '2', '80524', '29306', '14'), +('4', '80', '2', '70874', '20936', '14'), +('4', '80', '2', '102010', '19210', '14'), +('4', '80', '2', '102262', '17168', '14'), +('4', '80', '3', '102726', '27650', '14'), +('4', '80', '3', '102598', '27636', '14'), +('4', '80', '3', '102626', '27313', '14'), +('4', '80', '3', '102557', '23750', '14'), +('4', '80', '5', '102599', '28088', '14'), +('4', '80', '5', '102627', '26176', '14'), +('4', '80', '5', '102745', '25822', '14'), +('4', '80', '5', '46918', '24653', '14'), +('4', '80', '8', '102601', '36898', '14'), +('4', '80', '8', '102552', '33391', '14'), +('4', '80', '8', '102527', '28711', '14'), +('4', '80', '8', '46885', '27364', '14'), +('4', '80', '6', '80638', '28076', '14'), +('4', '80', '6', '102600', '27166', '14'), +('4', '80', '6', '102628', '26526', '14'), +('4', '80', '6', '102558', '24029', '14'), +('4', '80', '17', '83604', '24814', '14'), +('4', '80', '17', '102013', '19992', '14'), +('4', '80', '17', '102265', '18903', '14'), +('4', '80', '17', '53387', '18726', '14'), +('4', '80', '7', '80525', '21468', '14'), +('4', '80', '7', '102011', '19843', '14'), +('4', '80', '7', '102263', '18323', '14'), +('4', '80', '7', '53383', '16650', '14'), +('4', '80', '9', '67098', '36440', '14'), +('4', '80', '9', '80521', '17830', '14'), +('4', '80', '9', '46937', '17036', '14'), +('4', '80', '9', '53384', '16894', '14'), +('4', '80', '15', '102636', '27674', '14'), +('4', '80', '15', '102630', '27521', '14'), +('4', '80', '15', '102637', '26947', '14'), +('4', '80', '15', '102602', '26603', '14'), +('4', '80', '20', '102631', '36880', '14'), +('4', '80', '20', '102603', '36461', '14'), +('4', '80', '20', '102553', '32350', '14'), +('4', '80', '20', '80678', '30364', '14'), +('4', '80', '12', '53385', '24834', '14'), +('4', '80', '12', '102260', '16904', '14'), +('4', '80', '12', '71080', '16745', '14'), +('4', '80', '12', '47213', '16500', '14'), +('4', '80', '18', '80526', '22196', '14'), +('4', '80', '18', '102012', '20120', '14'), +('4', '80', '18', '102264', '18206', '14'), +('4', '80', '18', '53388', '17629', '14'), +('4', '80', '19', '76131', '22545', '14'), +('4', '80', '19', '80523', '19964', '14'), +('4', '80', '19', '53386', '16911', '14'), +('4', '80', '19', '102261', '16491', '14'), +('4', '80', '13', '102649', '346495', '14'), +('4', '80', '13', '102660', '342346', '14'), +('4', '80', '13', '102655', '340809', '14'), +('4', '80', '13', '102720', '332818', '14'), +('4', '80', '14', '102649', '346495', '14'), +('4', '80', '14', '102661', '343265', '14'), +('4', '80', '14', '102660', '342346', '14'), +('4', '80', '14', '102655', '340809', '14'), +('4', '80', '11', '102667', '428143', '14'), +('4', '80', '11', '102589', '376307', '14'), +('4', '80', '11', '80655', '335656', '14'), +('4', '80', '11', '102524', '328792', '14'), +('4', '81', '22', '12425', '0', '14'), +('4', '81', '22', '21807', '0', '14'), +('4', '81', '22', '39342', '0', '14'), +('4', '81', '22', '7867', '0', '14'), +('4', '81', '1', '102641', '27259', '14'), +('4', '81', '1', '102597', '26147', '14'), +('4', '81', '1', '102625', '25946', '14'), +('4', '81', '1', '102639', '25764', '14'), +('4', '81', '2', '80524', '29307', '14'), +('4', '81', '2', '70874', '20936', '14'), +('4', '81', '2', '102010', '19211', '14'), +('4', '81', '2', '102262', '17168', '14'), +('4', '81', '3', '102726', '27651', '14'), +('4', '81', '3', '102598', '27637', '14'), +('4', '81', '3', '102626', '27313', '14'), +('4', '81', '3', '102557', '23751', '14'), +('4', '81', '5', '102599', '28089', '14'), +('4', '81', '5', '102627', '26176', '14'), +('4', '81', '5', '102745', '25823', '14'), +('4', '81', '5', '46918', '24654', '14'), +('4', '81', '8', '102601', '36899', '14'), +('4', '81', '8', '102552', '33392', '14'), +('4', '81', '8', '102527', '28712', '14'), +('4', '81', '8', '46885', '27365', '14'), +('4', '81', '6', '80638', '28076', '14'), +('4', '81', '6', '102600', '27167', '14'), +('4', '81', '6', '102628', '26527', '14'), +('4', '81', '6', '102558', '24030', '14'), +('4', '81', '17', '83604', '24815', '14'), +('4', '81', '17', '102013', '19993', '14'), +('4', '81', '17', '102265', '18904', '14'), +('4', '81', '17', '53387', '18726', '14'), +('4', '81', '7', '80525', '21468', '14'), +('4', '81', '7', '102011', '19844', '14'), +('4', '81', '7', '102263', '18324', '14'), +('4', '81', '7', '53383', '16651', '14'), +('4', '81', '9', '67098', '36896', '14'), +('4', '81', '9', '80521', '17831', '14'), +('4', '81', '9', '46937', '17037', '14'), +('4', '81', '9', '53384', '16895', '14'), +('4', '81', '15', '102636', '27675', '14'), +('4', '81', '15', '102630', '27521', '14'), +('4', '81', '15', '102637', '26948', '14'), +('4', '81', '15', '102602', '26603', '14'), +('4', '81', '20', '102631', '36882', '14'), +('4', '81', '20', '102603', '36462', '14'), +('4', '81', '20', '102553', '32351', '14'), +('4', '81', '20', '80678', '30365', '14'), +('4', '81', '12', '53385', '24834', '14'), +('4', '81', '12', '102260', '16905', '14'), +('4', '81', '12', '71080', '16746', '14'), +('4', '81', '12', '47213', '16501', '14'), +('4', '81', '18', '80526', '22197', '14'), +('4', '81', '18', '102012', '20121', '14'), +('4', '81', '18', '102264', '18207', '14'), +('4', '81', '18', '53388', '17630', '14'), +('4', '81', '19', '76131', '22545', '14'), +('4', '81', '19', '80523', '19965', '14'), +('4', '81', '19', '53386', '16912', '14'), +('4', '81', '19', '102261', '16491', '14'), +('4', '81', '13', '102649', '347298', '14'), +('4', '81', '13', '102660', '343149', '14'), +('4', '81', '13', '102655', '341613', '14'), +('4', '81', '13', '102720', '333583', '14'), +('4', '81', '14', '102649', '347298', '14'), +('4', '81', '14', '102661', '344068', '14'), +('4', '81', '14', '102660', '343149', '14'), +('4', '81', '14', '102655', '341613', '14'), +('4', '81', '11', '102667', '428863', '14'), +('4', '81', '11', '102589', '376968', '14'), +('4', '81', '11', '80655', '336257', '14'), +('4', '81', '11', '102524', '329392', '14'), +('4', '82', '22', '12425', '0', '14'), +('4', '82', '22', '21807', '0', '14'), +('4', '82', '22', '39342', '0', '14'), +('4', '82', '22', '7867', '0', '14'), +('4', '82', '1', '102641', '27260', '14'), +('4', '82', '1', '102597', '26148', '14'), +('4', '82', '1', '102625', '25947', '14'), +('4', '82', '1', '102639', '25765', '14'), +('4', '82', '2', '80524', '29308', '14'), +('4', '82', '2', '70874', '20936', '14'), +('4', '82', '2', '102010', '19211', '14'), +('4', '82', '2', '102262', '17169', '14'), +('4', '82', '3', '102726', '27652', '14'), +('4', '82', '3', '102598', '27637', '14'), +('4', '82', '3', '102626', '27314', '14'), +('4', '82', '3', '102557', '23752', '14'), +('4', '82', '5', '102599', '28090', '14'), +('4', '82', '5', '102627', '26177', '14'), +('4', '82', '5', '102745', '25824', '14'), +('4', '82', '5', '46918', '24654', '14'), +('4', '82', '8', '102601', '36901', '14'), +('4', '82', '8', '102552', '33393', '14'), +('4', '82', '8', '102527', '28712', '14'), +('4', '82', '8', '46885', '27366', '14'), +('4', '82', '6', '80638', '28077', '14'), +('4', '82', '6', '102600', '27167', '14'), +('4', '82', '6', '102628', '26527', '14'), +('4', '82', '6', '102558', '24031', '14'), +('4', '82', '17', '83604', '24816', '14'), +('4', '82', '17', '102013', '19994', '14'), +('4', '82', '17', '102265', '18905', '14'), +('4', '82', '17', '53387', '18726', '14'), +('4', '82', '7', '80525', '21469', '14'), +('4', '82', '7', '102011', '19845', '14'), +('4', '82', '7', '102263', '18324', '14'), +('4', '82', '7', '53383', '16651', '14'), +('4', '82', '9', '67098', '37353', '14'), +('4', '82', '9', '80521', '17831', '14'), +('4', '82', '9', '46937', '17038', '14'), +('4', '82', '9', '53384', '16896', '14'), +('4', '82', '15', '102636', '27676', '14'), +('4', '82', '15', '102630', '27522', '14'), +('4', '82', '15', '102637', '26948', '14'), +('4', '82', '15', '102602', '26604', '14'), +('4', '82', '20', '102631', '36883', '14'), +('4', '82', '20', '102603', '36463', '14'), +('4', '82', '20', '102553', '32351', '14'), +('4', '82', '20', '80678', '30366', '14'), +('4', '82', '12', '53385', '24835', '14'), +('4', '82', '12', '102260', '16906', '14'), +('4', '82', '12', '71080', '16746', '14'), +('4', '82', '12', '47213', '16501', '14'), +('4', '82', '18', '80526', '22198', '14'), +('4', '82', '18', '102012', '20122', '14'), +('4', '82', '18', '102264', '18208', '14'), +('4', '82', '18', '53388', '17630', '14'), +('4', '82', '19', '76131', '22545', '14'), +('4', '82', '19', '80523', '19966', '14'), +('4', '82', '19', '53386', '16913', '14'), +('4', '82', '19', '102261', '16492', '14'), +('4', '82', '13', '102649', '348101', '14'), +('4', '82', '13', '102660', '343952', '14'), +('4', '82', '13', '102655', '342416', '14'), +('4', '82', '13', '102720', '334349', '14'), +('4', '82', '14', '102649', '348101', '14'), +('4', '82', '14', '102661', '344931', '14'), +('4', '82', '14', '102660', '343952', '14'), +('4', '82', '14', '102655', '342416', '14'), +('4', '82', '11', '102667', '429644', '14'), +('4', '82', '11', '102589', '377628', '14'), +('4', '82', '11', '80655', '336857', '14'), +('4', '82', '11', '102524', '329992', '14'), +('4', '83', '22', '12425', '0', '14'), +('4', '83', '22', '21807', '0', '14'), +('4', '83', '22', '39342', '0', '14'), +('4', '83', '22', '7867', '0', '14'), +('4', '83', '1', '102641', '27261', '14'), +('4', '83', '1', '102597', '26149', '14'), +('4', '83', '1', '102625', '25948', '14'), +('4', '83', '1', '102639', '25766', '14'), +('4', '83', '2', '80524', '29309', '14'), +('4', '83', '2', '70874', '20936', '14'), +('4', '83', '2', '102010', '19212', '14'), +('4', '83', '2', '102262', '17169', '14'), +('4', '83', '3', '102726', '27652', '14'), +('4', '83', '3', '102598', '27638', '14'), +('4', '83', '3', '102626', '27315', '14'), +('4', '83', '3', '102557', '23752', '14'), +('4', '83', '5', '102599', '28091', '14'), +('4', '83', '5', '102627', '26177', '14'), +('4', '83', '5', '102745', '25824', '14'), +('4', '83', '5', '46918', '24655', '14'), +('4', '83', '8', '102601', '36902', '14'), +('4', '83', '8', '102552', '33393', '14'), +('4', '83', '8', '102527', '28713', '14'), +('4', '83', '8', '46885', '27367', '14'), +('4', '83', '6', '80638', '28078', '14'), +('4', '83', '6', '102600', '27168', '14'), +('4', '83', '6', '102628', '26528', '14'), +('4', '83', '6', '102558', '24032', '14'), +('4', '83', '17', '83604', '24816', '14'), +('4', '83', '17', '102013', '19995', '14'), +('4', '83', '17', '102265', '18906', '14'), +('4', '83', '17', '53387', '18727', '14'), +('4', '83', '7', '80525', '21470', '14'), +('4', '83', '7', '102011', '19846', '14'), +('4', '83', '7', '102263', '18324', '14'), +('4', '83', '7', '53383', '16652', '14'), +('4', '83', '9', '67098', '37809', '14'), +('4', '83', '9', '80521', '17832', '14'), +('4', '83', '9', '46937', '17039', '14'), +('4', '83', '9', '53384', '16897', '14'), +('4', '83', '15', '102636', '27677', '14'), +('4', '83', '15', '102630', '27523', '14'), +('4', '83', '15', '102637', '26949', '14'), +('4', '83', '15', '102602', '26605', '14'), +('4', '83', '20', '102631', '36884', '14'), +('4', '83', '20', '102603', '36464', '14'), +('4', '83', '20', '102553', '32352', '14'), +('4', '83', '20', '80678', '30366', '14'), +('4', '83', '12', '53385', '24835', '14'), +('4', '83', '12', '102260', '16907', '14'), +('4', '83', '12', '71080', '16747', '14'), +('4', '83', '12', '47213', '16502', '14'), +('4', '83', '18', '80526', '22199', '14'), +('4', '83', '18', '102012', '20123', '14'), +('4', '83', '18', '102264', '18209', '14'), +('4', '83', '18', '53388', '17631', '14'), +('4', '83', '19', '76131', '22546', '14'), +('4', '83', '19', '80523', '19967', '14'), +('4', '83', '19', '53386', '16913', '14'), +('4', '83', '19', '102261', '16492', '14'), +('4', '83', '13', '102649', '348965', '14'), +('4', '83', '13', '102660', '344755', '14'), +('4', '83', '13', '102655', '343220', '14'), +('4', '83', '13', '102720', '335114', '14'), +('4', '83', '14', '102649', '348965', '14'), +('4', '83', '14', '102661', '345735', '14'), +('4', '83', '14', '102660', '344755', '14'), +('4', '83', '14', '102655', '343220', '14'), +('4', '83', '11', '102667', '430425', '14'), +('4', '83', '11', '102589', '378289', '14'), +('4', '83', '11', '80655', '337458', '14'), +('4', '83', '11', '102524', '330593', '14'), +('4', '84', '22', '12425', '0', '14'), +('4', '84', '22', '21807', '0', '14'), +('4', '84', '22', '39342', '0', '14'), +('4', '84', '22', '7867', '0', '14'), +('4', '84', '1', '102641', '27262', '14'), +('4', '84', '1', '102597', '26150', '14'), +('4', '84', '1', '102625', '25949', '14'), +('4', '84', '1', '102639', '25766', '14'), +('4', '84', '2', '80524', '29309', '14'), +('4', '84', '2', '70874', '20937', '14'), +('4', '84', '2', '102010', '19213', '14'), +('4', '84', '2', '102262', '17169', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '84', '3', '102726', '27653', '14'), +('4', '84', '3', '102598', '27639', '14'), +('4', '84', '3', '102626', '27316', '14'), +('4', '84', '3', '102557', '23753', '14'), +('4', '84', '5', '102599', '28091', '14'), +('4', '84', '5', '102627', '26178', '14'), +('4', '84', '5', '102745', '25825', '14'), +('4', '84', '5', '46918', '24656', '14'), +('4', '84', '8', '102601', '36903', '14'), +('4', '84', '8', '102552', '33394', '14'), +('4', '84', '8', '102527', '28714', '14'), +('4', '84', '8', '46885', '27368', '14'), +('4', '84', '6', '80638', '28079', '14'), +('4', '84', '6', '102600', '27169', '14'), +('4', '84', '6', '102628', '26529', '14'), +('4', '84', '6', '102558', '24033', '14'), +('4', '84', '17', '83604', '24817', '14'), +('4', '84', '17', '102013', '19996', '14'), +('4', '84', '17', '102265', '18907', '14'), +('4', '84', '17', '53387', '18727', '14'), +('4', '84', '7', '80525', '21471', '14'), +('4', '84', '7', '102011', '19847', '14'), +('4', '84', '7', '102263', '18325', '14'), +('4', '84', '7', '53383', '16653', '14'), +('4', '84', '9', '67098', '38265', '14'), +('4', '84', '9', '80521', '17833', '14'), +('4', '84', '9', '46937', '17040', '14'), +('4', '84', '9', '53384', '16897', '14'), +('4', '84', '15', '102636', '27678', '14'), +('4', '84', '15', '102630', '27523', '14'), +('4', '84', '15', '102637', '26949', '14'), +('4', '84', '15', '102602', '26606', '14'), +('4', '84', '20', '102631', '36885', '14'), +('4', '84', '20', '102603', '36464', '14'), +('4', '84', '20', '102553', '32352', '14'), +('4', '84', '20', '80678', '30368', '14'), +('4', '84', '12', '53385', '24836', '14'), +('4', '84', '12', '102260', '16908', '14'), +('4', '84', '12', '71080', '16747', '14'), +('4', '84', '12', '47213', '16502', '14'), +('4', '84', '18', '80526', '22200', '14'), +('4', '84', '18', '102012', '20124', '14'), +('4', '84', '18', '102264', '18210', '14'), +('4', '84', '18', '53388', '17632', '14'), +('4', '84', '19', '76131', '22546', '14'), +('4', '84', '19', '80523', '19968', '14'), +('4', '84', '19', '53386', '16914', '14'), +('4', '84', '19', '102261', '16493', '14'), +('4', '84', '13', '102649', '349768', '14'), +('4', '84', '13', '102660', '345558', '14'), +('4', '84', '13', '102655', '344023', '14'), +('4', '84', '13', '102720', '335880', '14'), +('4', '84', '14', '102649', '349768', '14'), +('4', '84', '14', '102661', '346538', '14'), +('4', '84', '14', '102660', '345558', '14'), +('4', '84', '14', '102655', '344023', '14'), +('4', '84', '11', '102667', '431146', '14'), +('4', '84', '11', '102589', '378950', '14'), +('4', '84', '11', '80655', '338059', '14'), +('4', '84', '11', '102524', '331193', '14'), +('4', '85', '22', '39342', '0', '16'), +('4', '85', '22', '12425', '0', '16'), +('4', '85', '22', '7867', '0', '16'), +('4', '85', '22', '23597', '0', '16'), +('4', '85', '1', '111300', '44839', '16'), +('4', '85', '1', '111302', '44661', '16'), +('4', '85', '1', '111305', '44256', '16'), +('4', '85', '1', '111307', '43911', '16'), +('4', '85', '2', '94056', '31587', '16'), +('4', '85', '2', '62985', '30141', '16'), +('4', '85', '2', '80524', '29310', '16'), +('4', '85', '2', '104410', '24702', '16'), +('4', '85', '3', '111315', '44821', '16'), +('4', '85', '3', '111313', '44324', '16'), +('4', '85', '3', '111316', '43227', '16'), +('4', '85', '3', '111014', '40515', '16'), +('4', '85', '5', '111317', '44698', '16'), +('4', '85', '5', '111318', '44015', '16'), +('4', '85', '5', '111320', '42616', '16'), +('4', '85', '5', '111319', '42327', '16'), +('4', '85', '8', '111331', '45155', '16'), +('4', '85', '8', '111332', '44373', '16'), +('4', '85', '8', '111328', '43793', '16'), +('4', '85', '8', '111030', '40879', '16'), +('4', '85', '6', '111324', '44303', '16'), +('4', '85', '6', '111322', '44126', '16'), +('4', '85', '6', '106812', '44090', '16'), +('4', '85', '6', '111326', '42769', '16'), +('4', '85', '17', '56046', '32615', '16'), +('4', '85', '17', '56083', '30893', '16'), +('4', '85', '17', '81765', '29783', '16'), +('4', '85', '17', '104413', '26912', '16'), +('4', '85', '7', '94053', '32674', '16'), +('4', '85', '7', '56079', '30069', '16'), +('4', '85', '7', '104411', '29002', '16'), +('4', '85', '7', '80525', '21472', '16'), +('4', '85', '9', '67098', '38721', '16'), +('4', '85', '9', '56033', '30730', '16'), +('4', '85', '9', '56031', '30622', '16'), +('4', '85', '9', '56070', '30486', '16'), +('4', '85', '15', '111342', '45676', '16'), +('4', '85', '15', '111348', '45523', '16'), +('4', '85', '15', '111343', '45152', '16'), +('4', '85', '15', '111345', '43598', '16'), +('4', '85', '20', '111354', '54329', '16'), +('4', '85', '20', '111352', '53817', '16'), +('4', '85', '20', '111355', '53413', '16'), +('4', '85', '20', '111351', '51713', '16'), +('4', '85', '12', '56073', '29815', '16'), +('4', '85', '12', '81795', '28908', '16'), +('4', '85', '12', '104408', '26451', '16'), +('4', '85', '12', '53385', '24837', '16'), +('4', '85', '18', '62986', '30649', '16'), +('4', '85', '18', '56041', '30187', '16'), +('4', '85', '18', '94054', '29005', '16'), +('4', '85', '18', '104412', '28808', '16'), +('4', '85', '19', '62990', '31970', '16'), +('4', '85', '19', '56037', '30667', '16'), +('4', '85', '19', '56075', '28730', '16'), +('4', '85', '19', '104409', '28229', '16'), +('4', '85', '13', '111815', '494909', '16'), +('4', '85', '13', '111871', '494878', '16'), +('4', '85', '13', '111515', '477140', '16'), +('4', '85', '13', '111512', '476115', '16'), +('4', '85', '14', '111815', '494909', '16'), +('4', '85', '14', '111871', '494878', '16'), +('4', '85', '14', '111515', '477140', '16'), +('4', '85', '14', '111512', '476115', '16'), +('4', '85', '11', '111529', '537079', '16'), +('4', '85', '11', '111229', '514964', '16'), +('4', '85', '11', '106769', '450919', '16'), +('4', '85', '11', '62939', '438770', '16'), +('4', '85', '22', '12425', '0', '15'), +('4', '85', '22', '21807', '0', '15'), +('4', '85', '22', '39342', '0', '15'), +('4', '85', '22', '7867', '0', '15'), +('4', '85', '1', '107054', '37736', '15'), +('4', '85', '1', '106840', '35466', '15'), +('4', '85', '1', '107053', '35010', '15'), +('4', '85', '1', '106839', '32988', '15'), +('4', '85', '2', '94056', '31587', '15'), +('4', '85', '2', '62985', '30141', '15'), +('4', '85', '2', '80524', '29310', '15'), +('4', '85', '2', '104410', '24702', '15'), +('4', '85', '3', '107055', '35231', '15'), +('4', '85', '3', '107020', '34195', '15'), +('4', '85', '3', '106841', '33246', '15'), +('4', '85', '3', '106724', '32908', '15'), +('4', '85', '5', '107056', '34842', '15'), +('4', '85', '5', '107021', '34346', '15'), +('4', '85', '5', '106725', '32316', '15'), +('4', '85', '5', '106811', '31989', '15'), +('4', '85', '8', '94070', '40015', '15'), +('4', '85', '8', '106716', '39193', '15'), +('4', '85', '8', '102601', '36904', '15'), +('4', '85', '8', '107023', '36062', '15'), +('4', '85', '6', '106812', '44090', '15'), +('4', '85', '6', '106843', '42492', '15'), +('4', '85', '6', '107022', '36374', '15'), +('4', '85', '6', '106600', '35881', '15'), +('4', '85', '17', '56046', '32615', '15'), +('4', '85', '17', '56083', '30893', '15'), +('4', '85', '17', '81765', '29783', '15'), +('4', '85', '17', '104413', '26912', '15'), +('4', '85', '7', '94053', '32674', '15'), +('4', '85', '7', '56079', '30069', '15'), +('4', '85', '7', '104411', '29002', '15'), +('4', '85', '7', '80525', '21472', '15'), +('4', '85', '9', '67098', '38721', '15'), +('4', '85', '9', '56033', '30730', '15'), +('4', '85', '9', '56031', '30622', '15'), +('4', '85', '9', '56070', '30486', '15'), +('4', '85', '15', '107025', '37745', '15'), +('4', '85', '15', '106815', '35705', '15'), +('4', '85', '15', '107051', '34369', '15'), +('4', '85', '15', '107062', '33914', '15'), +('4', '85', '20', '107026', '43870', '15'), +('4', '85', '20', '107059', '43851', '15'), +('4', '85', '20', '106845', '41453', '15'), +('4', '85', '20', '106816', '41353', '15'), +('4', '85', '12', '56073', '29815', '15'), +('4', '85', '12', '81795', '28908', '15'), +('4', '85', '12', '104408', '26451', '15'), +('4', '85', '12', '53385', '24837', '15'), +('4', '85', '18', '62986', '30649', '15'), +('4', '85', '18', '56041', '30187', '15'), +('4', '85', '18', '94054', '29005', '15'), +('4', '85', '18', '104412', '28808', '15'), +('4', '85', '19', '62990', '31970', '15'), +('4', '85', '19', '56037', '30667', '15'), +('4', '85', '19', '56075', '28730', '15'), +('4', '85', '19', '104409', '28229', '15'), +('4', '85', '13', '106761', '405061', '15'), +('4', '85', '13', '106854', '400495', '15'), +('4', '85', '13', '106858', '393292', '15'), +('4', '85', '13', '106853', '390926', '15'), +('4', '85', '14', '106761', '405061', '15'), +('4', '85', '14', '106854', '400495', '15'), +('4', '85', '14', '106858', '393292', '15'), +('4', '85', '14', '106853', '390926', '15'), +('4', '85', '11', '106769', '450919', '15'), +('4', '85', '11', '62939', '438770', '15'), +('4', '85', '11', '102667', '431927', '15'), +('4', '85', '11', '106616', '413755', '15'), +('4', '86', '22', '39342', '0', '16'), +('4', '86', '22', '12425', '0', '16'), +('4', '86', '22', '7867', '0', '16'), +('4', '86', '22', '23597', '0', '16'), +('4', '86', '1', '111300', '44840', '16'), +('4', '86', '1', '111302', '44662', '16'), +('4', '86', '1', '111305', '44257', '16'), +('4', '86', '1', '111307', '43912', '16'), +('4', '86', '2', '94056', '31588', '16'), +('4', '86', '2', '62985', '30142', '16'), +('4', '86', '2', '80524', '29311', '16'), +('4', '86', '2', '104410', '24703', '16'), +('4', '86', '3', '111315', '44822', '16'), +('4', '86', '3', '111313', '44325', '16'), +('4', '86', '3', '111316', '43228', '16'), +('4', '86', '3', '111014', '40516', '16'), +('4', '86', '5', '111317', '44699', '16'), +('4', '86', '5', '111318', '44016', '16'), +('4', '86', '5', '111320', '42617', '16'), +('4', '86', '5', '111319', '42328', '16'), +('4', '86', '8', '111331', '45156', '16'), +('4', '86', '8', '111332', '44374', '16'), +('4', '86', '8', '111328', '43793', '16'), +('4', '86', '8', '111030', '40880', '16'), +('4', '86', '6', '111324', '44303', '16'), +('4', '86', '6', '111322', '44126', '16'), +('4', '86', '6', '106812', '44091', '16'), +('4', '86', '6', '111326', '42771', '16'), +('4', '86', '17', '56046', '32616', '16'), +('4', '86', '17', '56083', '30894', '16'), +('4', '86', '17', '81765', '29784', '16'), +('4', '86', '17', '104413', '26913', '16'), +('4', '86', '7', '94053', '32674', '16'), +('4', '86', '7', '56079', '30069', '16'), +('4', '86', '7', '104411', '29003', '16'), +('4', '86', '7', '80525', '21473', '16'), +('4', '86', '9', '67098', '39178', '16'), +('4', '86', '9', '56033', '30731', '16'), +('4', '86', '9', '56031', '30623', '16'), +('4', '86', '9', '56070', '30486', '16'), +('4', '86', '15', '111342', '45677', '16'), +('4', '86', '15', '111348', '45523', '16'), +('4', '86', '15', '111343', '45152', '16'), +('4', '86', '15', '111345', '43599', '16'), +('4', '86', '20', '111354', '54330', '16'), +('4', '86', '20', '111352', '53818', '16'), +('4', '86', '20', '111355', '53413', '16'), +('4', '86', '20', '111351', '51713', '16'), +('4', '86', '12', '56073', '29816', '16'), +('4', '86', '12', '81795', '28909', '16'), +('4', '86', '12', '104408', '26452', '16'), +('4', '86', '12', '53385', '24837', '16'), +('4', '86', '18', '62986', '30650', '16'), +('4', '86', '18', '56041', '30187', '16'), +('4', '86', '18', '94054', '29005', '16'), +('4', '86', '18', '104412', '28809', '16'), +('4', '86', '19', '62990', '31970', '16'), +('4', '86', '19', '56037', '30668', '16'), +('4', '86', '19', '56075', '28731', '16'), +('4', '86', '19', '104409', '28229', '16'), +('4', '86', '13', '111815', '496170', '16'), +('4', '86', '13', '111871', '496078', '16'), +('4', '86', '13', '111515', '478341', '16'), +('4', '86', '13', '111512', '477316', '16'), +('4', '86', '14', '111815', '496170', '16'), +('4', '86', '14', '111871', '496078', '16'), +('4', '86', '14', '111515', '478341', '16'), +('4', '86', '14', '111512', '477316', '16'), +('4', '86', '11', '111529', '538040', '16'), +('4', '86', '11', '111229', '515865', '16'), +('4', '86', '11', '106769', '451700', '16'), +('4', '86', '11', '62939', '439551', '16'), +('4', '87', '22', '39342', '0', '16'), +('4', '87', '22', '12425', '0', '16'), +('4', '87', '22', '7867', '0', '16'), +('4', '87', '22', '23597', '0', '16'), +('4', '87', '1', '111300', '44841', '16'), +('4', '87', '1', '111302', '44663', '16'), +('4', '87', '1', '111305', '44258', '16'), +('4', '87', '1', '111307', '43912', '16'), +('4', '87', '2', '94056', '31589', '16'), +('4', '87', '2', '62985', '30143', '16'), +('4', '87', '2', '80524', '29312', '16'), +('4', '87', '2', '104410', '24703', '16'), +('4', '87', '3', '111315', '44823', '16'), +('4', '87', '3', '111313', '44325', '16'), +('4', '87', '3', '111316', '43229', '16'), +('4', '87', '3', '111014', '40517', '16'), +('4', '87', '5', '111317', '44700', '16'), +('4', '87', '5', '111318', '44016', '16'), +('4', '87', '5', '111320', '42617', '16'), +('4', '87', '5', '111319', '42328', '16'), +('4', '87', '8', '111331', '45157', '16'), +('4', '87', '8', '111332', '44375', '16'), +('4', '87', '8', '111328', '43794', '16'), +('4', '87', '8', '111030', '40881', '16'), +('4', '87', '6', '111324', '44304', '16'), +('4', '87', '6', '111322', '44127', '16'), +('4', '87', '6', '106812', '44091', '16'), +('4', '87', '6', '111326', '42772', '16'), +('4', '87', '17', '56046', '32617', '16'), +('4', '87', '17', '56083', '30894', '16'), +('4', '87', '17', '81765', '29785', '16'), +('4', '87', '17', '104413', '26914', '16'), +('4', '87', '7', '94053', '32675', '16'), +('4', '87', '7', '56079', '30070', '16'), +('4', '87', '7', '104411', '29005', '16'), +('4', '87', '7', '80525', '21474', '16'), +('4', '87', '9', '67098', '39634', '16'), +('4', '87', '9', '56033', '30732', '16'), +('4', '87', '9', '56031', '30623', '16'), +('4', '87', '9', '56070', '30487', '16'), +('4', '87', '15', '111342', '45677', '16'), +('4', '87', '15', '111348', '45524', '16'), +('4', '87', '15', '111343', '45153', '16'), +('4', '87', '15', '111345', '43599', '16'), +('4', '87', '20', '111354', '54331', '16'), +('4', '87', '20', '111352', '53819', '16'), +('4', '87', '20', '111355', '53414', '16'), +('4', '87', '20', '111351', '51714', '16'), +('4', '87', '12', '56073', '29817', '16'), +('4', '87', '12', '81795', '28910', '16'), +('4', '87', '12', '104408', '26452', '16'), +('4', '87', '12', '53385', '24838', '16'), +('4', '87', '18', '62986', '30651', '16'), +('4', '87', '18', '56041', '30188', '16'), +('4', '87', '18', '94054', '29006', '16'), +('4', '87', '18', '104412', '28809', '16'), +('4', '87', '19', '62990', '31971', '16'), +('4', '87', '19', '56037', '30669', '16'), +('4', '87', '19', '56075', '28732', '16'), +('4', '87', '19', '104409', '28230', '16'), +('4', '87', '13', '111815', '497371', '16'), +('4', '87', '13', '111871', '497339', '16'), +('4', '87', '13', '111515', '479541', '16'), +('4', '87', '13', '111512', '478457', '16'), +('4', '87', '14', '111815', '497371', '16'), +('4', '87', '14', '111871', '497339', '16'), +('4', '87', '14', '111515', '479541', '16'), +('4', '87', '14', '111512', '478457', '16'), +('4', '87', '11', '111529', '538941', '16'), +('4', '87', '11', '111229', '516766', '16'), +('4', '87', '11', '106769', '452481', '16'), +('4', '87', '11', '62939', '440331', '16'), +('4', '88', '22', '39342', '0', '16'), +('4', '88', '22', '12425', '0', '16'), +('4', '88', '22', '7867', '0', '16'), +('4', '88', '22', '23597', '0', '16'), +('4', '88', '1', '111300', '44841', '16'), +('4', '88', '1', '111302', '44664', '16'), +('4', '88', '1', '111305', '44259', '16'), +('4', '88', '1', '111307', '43913', '16'), +('4', '88', '2', '94056', '31590', '16'), +('4', '88', '2', '62985', '30144', '16'), +('4', '88', '2', '80524', '29313', '16'), +('4', '88', '2', '104410', '24704', '16'), +('4', '88', '3', '111315', '44824', '16'), +('4', '88', '3', '111313', '44326', '16'), +('4', '88', '3', '111316', '43230', '16'), +('4', '88', '3', '111014', '40518', '16'), +('4', '88', '5', '111317', '44701', '16'), +('4', '88', '5', '111318', '44017', '16'), +('4', '88', '5', '111320', '42618', '16'), +('4', '88', '5', '111319', '42329', '16'), +('4', '88', '8', '111331', '45158', '16'), +('4', '88', '8', '111332', '44376', '16'), +('4', '88', '8', '111328', '43795', '16'), +('4', '88', '8', '111030', '40882', '16'), +('4', '88', '6', '111324', '44305', '16'), +('4', '88', '6', '111322', '44127', '16'), +('4', '88', '6', '106812', '44092', '16'), +('4', '88', '6', '111326', '42773', '16'), +('4', '88', '17', '56046', '32618', '16'), +('4', '88', '17', '56083', '30895', '16'), +('4', '88', '17', '81765', '29785', '16'), +('4', '88', '17', '104413', '26915', '16'), +('4', '88', '7', '94053', '32676', '16'), +('4', '88', '7', '56079', '30071', '16'), +('4', '88', '7', '104411', '29006', '16'), +('4', '88', '7', '80525', '21475', '16'), +('4', '88', '9', '67098', '40090', '16'), +('4', '88', '9', '56033', '30732', '16'), +('4', '88', '9', '56031', '30624', '16'), +('4', '88', '9', '56070', '30488', '16'), +('4', '88', '15', '111342', '45678', '16'), +('4', '88', '15', '111348', '45525', '16'), +('4', '88', '15', '111343', '45154', '16'), +('4', '88', '15', '111345', '43600', '16'), +('4', '88', '20', '111354', '54332', '16'), +('4', '88', '20', '111352', '53819', '16'), +('4', '88', '20', '111355', '53415', '16'), +('4', '88', '20', '111351', '51715', '16'), +('4', '88', '12', '56073', '29817', '16'), +('4', '88', '12', '81795', '28910', '16'), +('4', '88', '12', '104408', '26453', '16'), +('4', '88', '12', '53385', '24839', '16'), +('4', '88', '18', '62986', '30652', '16'), +('4', '88', '18', '56041', '30189', '16'), +('4', '88', '18', '94054', '29007', '16'), +('4', '88', '18', '104412', '28810', '16'), +('4', '88', '19', '62990', '31972', '16'), +('4', '88', '19', '56037', '30669', '16'), +('4', '88', '19', '56075', '28733', '16'), +('4', '88', '19', '104409', '28230', '16'), +('4', '88', '13', '111815', '498571', '16'), +('4', '88', '13', '111871', '498540', '16'), +('4', '88', '13', '111515', '480682', '16'), +('4', '88', '13', '111512', '479657', '16'), +('4', '88', '14', '111815', '498571', '16'), +('4', '88', '14', '111871', '498540', '16'), +('4', '88', '14', '111515', '480682', '16'), +('4', '88', '14', '111512', '479657', '16'), +('4', '88', '11', '111529', '539902', '16'), +('4', '88', '11', '111229', '517666', '16'), +('4', '88', '11', '106769', '453262', '16'), +('4', '88', '11', '62939', '441052', '16'), +('4', '89', '22', '39342', '0', '16'), +('4', '89', '22', '12425', '0', '16'), +('4', '89', '22', '7867', '0', '16'), +('4', '89', '22', '23597', '0', '16'), +('4', '89', '1', '111300', '44842', '16'), +('4', '89', '1', '111302', '44665', '16'), +('4', '89', '1', '111305', '44261', '16'), +('4', '89', '1', '111307', '43914', '16'), +('4', '89', '2', '94056', '31590', '16'), +('4', '89', '2', '62985', '30145', '16'), +('4', '89', '2', '80524', '29314', '16'), +('4', '89', '2', '104410', '24705', '16'), +('4', '89', '3', '111315', '44825', '16'), +('4', '89', '3', '111313', '44327', '16'), +('4', '89', '3', '111316', '43231', '16'), +('4', '89', '3', '111014', '40519', '16'), +('4', '89', '5', '111317', '44702', '16'), +('4', '89', '5', '111318', '44018', '16'), +('4', '89', '5', '111320', '42619', '16'), +('4', '89', '5', '111319', '42330', '16'), +('4', '89', '8', '111331', '45159', '16'), +('4', '89', '8', '111332', '44377', '16'), +('4', '89', '8', '111328', '43795', '16'), +('4', '89', '8', '111030', '40883', '16'), +('4', '89', '6', '111324', '44306', '16'), +('4', '89', '6', '111322', '44128', '16'), +('4', '89', '6', '106812', '44092', '16'), +('4', '89', '6', '111326', '42774', '16'), +('4', '89', '17', '56046', '32619', '16'), +('4', '89', '17', '56083', '30895', '16'), +('4', '89', '17', '81765', '29786', '16'), +('4', '89', '17', '104413', '26917', '16'), +('4', '89', '7', '94053', '32676', '16'), +('4', '89', '7', '56079', '30072', '16'), +('4', '89', '7', '104411', '29007', '16'), +('4', '89', '7', '80525', '21476', '16'), +('4', '89', '9', '67098', '40546', '16'), +('4', '89', '9', '56033', '30733', '16'), +('4', '89', '9', '56031', '30625', '16'), +('4', '89', '9', '56070', '30488', '16'), +('4', '89', '15', '111342', '45679', '16'), +('4', '89', '15', '111348', '45526', '16'), +('4', '89', '15', '111343', '45155', '16'), +('4', '89', '15', '111345', '43601', '16'), +('4', '89', '20', '111354', '54333', '16'), +('4', '89', '20', '111352', '53820', '16'), +('4', '89', '20', '111355', '53415', '16'), +('4', '89', '20', '111351', '51716', '16'), +('4', '89', '12', '56073', '29818', '16'), +('4', '89', '12', '81795', '28911', '16'), +('4', '89', '12', '104408', '26454', '16'), +('4', '89', '12', '53385', '24839', '16'), +('4', '89', '18', '62986', '30653', '16'), +('4', '89', '18', '56041', '30190', '16'), +('4', '89', '18', '94054', '29007', '16'), +('4', '89', '18', '104412', '28810', '16'), +('4', '89', '19', '62990', '31972', '16'), +('4', '89', '19', '56037', '30670', '16'), +('4', '89', '19', '56075', '28734', '16'), +('4', '89', '19', '104409', '28231', '16'), +('4', '89', '13', '111815', '499832', '16'), +('4', '89', '13', '111871', '499741', '16'), +('4', '89', '13', '111515', '481883', '16'), +('4', '89', '13', '111512', '480858', '16'), +('4', '89', '14', '111815', '499832', '16'), +('4', '89', '14', '111871', '499741', '16'), +('4', '89', '14', '111515', '481883', '16'), +('4', '89', '14', '111512', '480858', '16'), +('4', '89', '11', '111529', '540803', '16'), +('4', '89', '11', '111229', '518507', '16'), +('4', '89', '11', '106769', '454044', '16'), +('4', '89', '11', '62939', '441833', '16'), +('4', '90', '22', '39342', '0', '17'), +('4', '90', '22', '12425', '0', '17'), +('4', '90', '22', '7867', '0', '17'), +('4', '90', '22', '23597', '0', '17'), +('4', '90', '1', '111300', '44843', '17'), +('4', '90', '1', '111302', '44666', '17'), +('4', '90', '1', '111305', '44262', '17'), +('4', '90', '1', '111307', '43914', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '90', '2', '94056', '31591', '17'), +('4', '90', '2', '62985', '30146', '17'), +('4', '90', '2', '80524', '29315', '17'), +('4', '90', '2', '104410', '24706', '17'), +('4', '90', '3', '111315', '44826', '17'), +('4', '90', '3', '111313', '44328', '17'), +('4', '90', '3', '111316', '43232', '17'), +('4', '90', '3', '111014', '40520', '17'), +('4', '90', '5', '111317', '44703', '17'), +('4', '90', '5', '111318', '44018', '17'), +('4', '90', '5', '111320', '42620', '17'), +('4', '90', '5', '111319', '42331', '17'), +('4', '90', '8', '111331', '45160', '17'), +('4', '90', '8', '111332', '44377', '17'), +('4', '90', '8', '111328', '43796', '17'), +('4', '90', '8', '111030', '40884', '17'), +('4', '90', '6', '111324', '44306', '17'), +('4', '90', '6', '111322', '44128', '17'), +('4', '90', '6', '106812', '44093', '17'), +('4', '90', '6', '111326', '42775', '17'), +('4', '90', '17', '56046', '32620', '17'), +('4', '90', '17', '56083', '30896', '17'), +('4', '90', '17', '81765', '29787', '17'), +('4', '90', '17', '104413', '26918', '17'), +('4', '90', '7', '94053', '32677', '17'), +('4', '90', '7', '56079', '30073', '17'), +('4', '90', '7', '104411', '29008', '17'), +('4', '90', '7', '80525', '21477', '17'), +('4', '90', '9', '67098', '41003', '17'), +('4', '90', '9', '56033', '30734', '17'), +('4', '90', '9', '56031', '30625', '17'), +('4', '90', '9', '56070', '30489', '17'), +('4', '90', '15', '111342', '45680', '17'), +('4', '90', '15', '111348', '45527', '17'), +('4', '90', '15', '111343', '45156', '17'), +('4', '90', '15', '111345', '43601', '17'), +('4', '90', '20', '111354', '54334', '17'), +('4', '90', '20', '111352', '53821', '17'), +('4', '90', '20', '111355', '53416', '17'), +('4', '90', '20', '111351', '51717', '17'), +('4', '90', '12', '56073', '29819', '17'), +('4', '90', '12', '81795', '28912', '17'), +('4', '90', '12', '104408', '26455', '17'), +('4', '90', '12', '53385', '24840', '17'), +('4', '90', '18', '62986', '30654', '17'), +('4', '90', '18', '56041', '30190', '17'), +('4', '90', '18', '94054', '29008', '17'), +('4', '90', '18', '104412', '28811', '17'), +('4', '90', '19', '62990', '31973', '17'), +('4', '90', '19', '56037', '30671', '17'), +('4', '90', '19', '56075', '28735', '17'), +('4', '90', '19', '104409', '28231', '17'), +('4', '90', '13', '111815', '501033', '17'), +('4', '90', '13', '111871', '500942', '17'), +('4', '90', '13', '111515', '483084', '17'), +('4', '90', '13', '111512', '482059', '17'), +('4', '90', '14', '111815', '501033', '17'), +('4', '90', '14', '111871', '500942', '17'), +('4', '90', '14', '111515', '483084', '17'), +('4', '90', '14', '111512', '482059', '17'), +('4', '90', '11', '111529', '541703', '17'), +('4', '90', '11', '111229', '519408', '17'), +('4', '90', '11', '106769', '454825', '17'), +('4', '90', '11', '62939', '442613', '17'), +('4', '91', '22', '39342', '0', '17'), +('4', '91', '22', '12425', '0', '17'), +('4', '91', '22', '7867', '0', '17'), +('4', '91', '22', '23597', '0', '17'), +('4', '91', '1', '111300', '44843', '17'), +('4', '91', '1', '111302', '44666', '17'), +('4', '91', '1', '111305', '44263', '17'), +('4', '91', '1', '111307', '43915', '17'), +('4', '91', '2', '94056', '31592', '17'), +('4', '91', '2', '62985', '30147', '17'), +('4', '91', '2', '80524', '29316', '17'), +('4', '91', '2', '104410', '24706', '17'), +('4', '91', '3', '111315', '44827', '17'), +('4', '91', '3', '111313', '44329', '17'), +('4', '91', '3', '111316', '43232', '17'), +('4', '91', '3', '111014', '40520', '17'), +('4', '91', '5', '111317', '44704', '17'), +('4', '91', '5', '111318', '44019', '17'), +('4', '91', '5', '111320', '42620', '17'), +('4', '91', '5', '111319', '42332', '17'), +('4', '91', '8', '111331', '45161', '17'), +('4', '91', '8', '111332', '44378', '17'), +('4', '91', '8', '111328', '43797', '17'), +('4', '91', '8', '111030', '40885', '17'), +('4', '91', '6', '111324', '44307', '17'), +('4', '91', '6', '111322', '44129', '17'), +('4', '91', '6', '106812', '44093', '17'), +('4', '91', '6', '111326', '42776', '17'), +('4', '91', '17', '56046', '32620', '17'), +('4', '91', '17', '56083', '30896', '17'), +('4', '91', '17', '81765', '29787', '17'), +('4', '91', '17', '104413', '26919', '17'), +('4', '91', '7', '94053', '32678', '17'), +('4', '91', '7', '56079', '30073', '17'), +('4', '91', '7', '104411', '29009', '17'), +('4', '91', '7', '80525', '21478', '17'), +('4', '91', '9', '67098', '41003', '17'), +('4', '91', '9', '56033', '30734', '17'), +('4', '91', '9', '56031', '30626', '17'), +('4', '91', '9', '56070', '30490', '17'), +('4', '91', '15', '111342', '45681', '17'), +('4', '91', '15', '111348', '45528', '17'), +('4', '91', '15', '111343', '45156', '17'), +('4', '91', '15', '111345', '43602', '17'), +('4', '91', '20', '111354', '54334', '17'), +('4', '91', '20', '111352', '53822', '17'), +('4', '91', '20', '111355', '53416', '17'), +('4', '91', '20', '111351', '51717', '17'), +('4', '91', '12', '56073', '29820', '17'), +('4', '91', '12', '81795', '28912', '17'), +('4', '91', '12', '104408', '26455', '17'), +('4', '91', '12', '53385', '24840', '17'), +('4', '91', '18', '62986', '30655', '17'), +('4', '91', '18', '56041', '30191', '17'), +('4', '91', '18', '94054', '29009', '17'), +('4', '91', '18', '104412', '28811', '17'), +('4', '91', '19', '62990', '31974', '17'), +('4', '91', '19', '56037', '30672', '17'), +('4', '91', '19', '56075', '28736', '17'), +('4', '91', '19', '104409', '28232', '17'), +('4', '91', '13', '111815', '502234', '17'), +('4', '91', '13', '111871', '502202', '17'), +('4', '91', '13', '111515', '484285', '17'), +('4', '91', '13', '111512', '483259', '17'), +('4', '91', '14', '111815', '502234', '17'), +('4', '91', '14', '111871', '502202', '17'), +('4', '91', '14', '111515', '484285', '17'), +('4', '91', '14', '111512', '483259', '17'), +('4', '91', '11', '111529', '542664', '17'), +('4', '91', '11', '111229', '520309', '17'), +('4', '91', '11', '106769', '455606', '17'), +('4', '91', '11', '62939', '443394', '17'), +('4', '92', '22', '39342', '0', '17'), +('4', '92', '22', '12425', '0', '17'), +('4', '92', '22', '7867', '0', '17'), +('4', '92', '22', '23597', '0', '17'), +('4', '92', '1', '111300', '44844', '17'), +('4', '92', '1', '111302', '44667', '17'), +('4', '92', '1', '111305', '44264', '17'), +('4', '92', '1', '111307', '43916', '17'), +('4', '92', '2', '94056', '31592', '17'), +('4', '92', '2', '62985', '30147', '17'), +('4', '92', '2', '80524', '29316', '17'), +('4', '92', '2', '104410', '24707', '17'), +('4', '92', '3', '111315', '44828', '17'), +('4', '92', '3', '111313', '44330', '17'), +('4', '92', '3', '111316', '43233', '17'), +('4', '92', '3', '111014', '40521', '17'), +('4', '92', '5', '111317', '44704', '17'), +('4', '92', '5', '111318', '44020', '17'), +('4', '92', '5', '111320', '42621', '17'), +('4', '92', '5', '111319', '42332', '17'), +('4', '92', '8', '111331', '45162', '17'), +('4', '92', '8', '111332', '44379', '17'), +('4', '92', '8', '111328', '43797', '17'), +('4', '92', '8', '111030', '40886', '17'), +('4', '92', '6', '111324', '44308', '17'), +('4', '92', '6', '111322', '44130', '17'), +('4', '92', '6', '106812', '44094', '17'), +('4', '92', '6', '111326', '42777', '17'), +('4', '92', '17', '56046', '32621', '17'), +('4', '92', '17', '56083', '30897', '17'), +('4', '92', '17', '81765', '29788', '17'), +('4', '92', '17', '104413', '26920', '17'), +('4', '92', '7', '94053', '32678', '17'), +('4', '92', '7', '56079', '30074', '17'), +('4', '92', '7', '104411', '29010', '17'), +('4', '92', '7', '80525', '21479', '17'), +('4', '92', '9', '67098', '41004', '17'), +('4', '92', '9', '56033', '30735', '17'), +('4', '92', '9', '56031', '30627', '17'), +('4', '92', '9', '56070', '30490', '17'), +('4', '92', '15', '111342', '45682', '17'), +('4', '92', '15', '111348', '45529', '17'), +('4', '92', '15', '111343', '45157', '17'), +('4', '92', '15', '111345', '43602', '17'), +('4', '92', '20', '111354', '54335', '17'), +('4', '92', '20', '111352', '53823', '17'), +('4', '92', '20', '111355', '53417', '17'), +('4', '92', '20', '111351', '51718', '17'), +('4', '92', '12', '56073', '29821', '17'), +('4', '92', '12', '81795', '28913', '17'), +('4', '92', '12', '104408', '26456', '17'), +('4', '92', '12', '53385', '24841', '17'), +('4', '92', '18', '62986', '30656', '17'), +('4', '92', '18', '56041', '30192', '17'), +('4', '92', '18', '94054', '29009', '17'), +('4', '92', '18', '104412', '28811', '17'), +('4', '92', '19', '62990', '31974', '17'), +('4', '92', '19', '56037', '30673', '17'), +('4', '92', '19', '56075', '28737', '17'), +('4', '92', '19', '104409', '28233', '17'), +('4', '92', '13', '111815', '503495', '17'), +('4', '92', '13', '111871', '503403', '17'), +('4', '92', '13', '111515', '485485', '17'), +('4', '92', '13', '111512', '484400', '17'), +('4', '92', '14', '111815', '503495', '17'), +('4', '92', '14', '111871', '503403', '17'), +('4', '92', '14', '111515', '485485', '17'), +('4', '92', '14', '111512', '484400', '17'), +('4', '92', '11', '111529', '543565', '17'), +('4', '92', '11', '111229', '521210', '17'), +('4', '92', '11', '106769', '456447', '17'), +('4', '92', '11', '62939', '444115', '17'), +('4', '93', '22', '39342', '0', '17'), +('4', '93', '22', '12425', '0', '17'), +('4', '93', '22', '7867', '0', '17'), +('4', '93', '22', '23597', '0', '17'), +('4', '93', '1', '111300', '44845', '17'), +('4', '93', '1', '111302', '44668', '17'), +('4', '93', '1', '111305', '44265', '17'), +('4', '93', '1', '111307', '43916', '17'), +('4', '93', '2', '94056', '31593', '17'), +('4', '93', '2', '62985', '30148', '17'), +('4', '93', '2', '80524', '29317', '17'), +('4', '93', '2', '104410', '24708', '17'), +('4', '93', '3', '111315', '44829', '17'), +('4', '93', '3', '111313', '44331', '17'), +('4', '93', '3', '111316', '43234', '17'), +('4', '93', '3', '111014', '40522', '17'), +('4', '93', '5', '111317', '44705', '17'), +('4', '93', '5', '111318', '44020', '17'), +('4', '93', '5', '111320', '42622', '17'), +('4', '93', '5', '111319', '42333', '17'), +('4', '93', '8', '111331', '45163', '17'), +('4', '93', '8', '111332', '44380', '17'), +('4', '93', '8', '111328', '43798', '17'), +('4', '93', '8', '111030', '40887', '17'), +('4', '93', '6', '111324', '44308', '17'), +('4', '93', '6', '111322', '44130', '17'), +('4', '93', '6', '106812', '44094', '17'), +('4', '93', '6', '111326', '42778', '17'), +('4', '93', '17', '56046', '32622', '17'), +('4', '93', '17', '56083', '30897', '17'), +('4', '93', '17', '81765', '29789', '17'), +('4', '93', '17', '104413', '26921', '17'), +('4', '93', '7', '94053', '32679', '17'), +('4', '93', '7', '56079', '30075', '17'), +('4', '93', '7', '104411', '29011', '17'), +('4', '93', '7', '80525', '21480', '17'), +('4', '93', '9', '67098', '41005', '17'), +('4', '93', '9', '56033', '30736', '17'), +('4', '93', '9', '56031', '30627', '17'), +('4', '93', '9', '56070', '30491', '17'), +('4', '93', '15', '111342', '45683', '17'), +('4', '93', '15', '111348', '45530', '17'), +('4', '93', '15', '111343', '45158', '17'), +('4', '93', '15', '111345', '43603', '17'), +('4', '93', '20', '111354', '54336', '17'), +('4', '93', '20', '111352', '53824', '17'), +('4', '93', '20', '111355', '53418', '17'), +('4', '93', '20', '111351', '51719', '17'), +('4', '93', '12', '56073', '29822', '17'), +('4', '93', '12', '81795', '28914', '17'), +('4', '93', '12', '104408', '26457', '17'), +('4', '93', '12', '53385', '24842', '17'), +('4', '93', '18', '62986', '30657', '17'), +('4', '93', '18', '56041', '30192', '17'), +('4', '93', '18', '94054', '29010', '17'), +('4', '93', '18', '104412', '28812', '17'), +('4', '93', '19', '62990', '31975', '17'), +('4', '93', '19', '56037', '30674', '17'), +('4', '93', '19', '56075', '28738', '17'), +('4', '93', '19', '104409', '28233', '17'), +('4', '93', '13', '111815', '504695', '17'), +('4', '93', '13', '111871', '504604', '17'), +('4', '93', '13', '111515', '486626', '17'), +('4', '93', '13', '111512', '485601', '17'), +('4', '93', '14', '111815', '504695', '17'), +('4', '93', '14', '111871', '504604', '17'), +('4', '93', '14', '111515', '486626', '17'), +('4', '93', '14', '111512', '485601', '17'), +('4', '93', '11', '111529', '544526', '17'), +('4', '93', '11', '111229', '522111', '17'), +('4', '93', '11', '106769', '457228', '17'), +('4', '93', '11', '62939', '444895', '17'), +('4', '94', '22', '39342', '0', '17'), +('4', '94', '22', '12425', '0', '17'), +('4', '94', '22', '7867', '0', '17'), +('4', '94', '22', '23597', '0', '17'), +('4', '94', '1', '111300', '44845', '17'), +('4', '94', '1', '111302', '44669', '17'), +('4', '94', '1', '111305', '44266', '17'), +('4', '94', '1', '111307', '43917', '17'), +('4', '94', '2', '94056', '31594', '17'), +('4', '94', '2', '62985', '30149', '17'), +('4', '94', '2', '80524', '29318', '17'), +('4', '94', '2', '104410', '24709', '17'), +('4', '94', '3', '111315', '44829', '17'), +('4', '94', '3', '111313', '44331', '17'), +('4', '94', '3', '111316', '43235', '17'), +('4', '94', '3', '111014', '40523', '17'), +('4', '94', '5', '111317', '44706', '17'), +('4', '94', '5', '111318', '44021', '17'), +('4', '94', '5', '111320', '42622', '17'), +('4', '94', '5', '111319', '42334', '17'), +('4', '94', '8', '111331', '45164', '17'), +('4', '94', '8', '111332', '44381', '17'), +('4', '94', '8', '111328', '43799', '17'), +('4', '94', '8', '111030', '40888', '17'), +('4', '94', '6', '111324', '44309', '17'), +('4', '94', '6', '111322', '44131', '17'), +('4', '94', '6', '106812', '44095', '17'), +('4', '94', '6', '111326', '42779', '17'), +('4', '94', '17', '56046', '32623', '17'), +('4', '94', '17', '56083', '30897', '17'), +('4', '94', '17', '81765', '29789', '17'), +('4', '94', '17', '104413', '26922', '17'), +('4', '94', '7', '94053', '32680', '17'), +('4', '94', '7', '56079', '30076', '17'), +('4', '94', '7', '104411', '29012', '17'), +('4', '94', '7', '80525', '21481', '17'), +('4', '94', '9', '67098', '41006', '17'), +('4', '94', '9', '56033', '30737', '17'), +('4', '94', '9', '56031', '30628', '17'), +('4', '94', '9', '56070', '30492', '17'), +('4', '94', '15', '111342', '45684', '17'), +('4', '94', '15', '111348', '45531', '17'), +('4', '94', '15', '111343', '45159', '17'), +('4', '94', '15', '111345', '43604', '17'), +('4', '94', '20', '111354', '54337', '17'), +('4', '94', '20', '111352', '53825', '17'), +('4', '94', '20', '111355', '53418', '17'), +('4', '94', '20', '111351', '51720', '17'), +('4', '94', '12', '56073', '29823', '17'), +('4', '94', '12', '81795', '28914', '17'), +('4', '94', '12', '104408', '26458', '17'), +('4', '94', '12', '53385', '24842', '17'), +('4', '94', '18', '62986', '30658', '17'), +('4', '94', '18', '56041', '30193', '17'), +('4', '94', '18', '94054', '29011', '17'), +('4', '94', '18', '104412', '28812', '17'), +('4', '94', '19', '62990', '31976', '17'), +('4', '94', '19', '56037', '30675', '17'), +('4', '94', '19', '56075', '28739', '17'), +('4', '94', '19', '104409', '28234', '17'), +('4', '94', '13', '111815', '505896', '17'), +('4', '94', '13', '111871', '505865', '17'), +('4', '94', '13', '111515', '487827', '17'), +('4', '94', '13', '111512', '486802', '17'), +('4', '94', '14', '111815', '505896', '17'), +('4', '94', '14', '111871', '505865', '17'), +('4', '94', '14', '111515', '487827', '17'), +('4', '94', '14', '111512', '486802', '17'), +('4', '94', '11', '111529', '545426', '17'), +('4', '94', '11', '111229', '522951', '17'), +('4', '94', '11', '106769', '458009', '17'), +('4', '94', '11', '62939', '445676', '17'), +('4', '95', '22', '7867', '0', '18'), +('4', '95', '22', '39342', '0', '18'), +('4', '95', '22', '23597', '0', '18'), +('4', '95', '22', '66166', '0', '18'), +('4', '95', '1', '111300', '44846', '18'), +('4', '95', '1', '111302', '44670', '18'), +('4', '95', '1', '111305', '44267', '18'), +('4', '95', '1', '111307', '43917', '18'), +('4', '95', '2', '94056', '31595', '18'), +('4', '95', '2', '62985', '30150', '18'), +('4', '95', '2', '80524', '29319', '18'), +('4', '95', '2', '104410', '24709', '18'), +('4', '95', '3', '111315', '44830', '18'), +('4', '95', '3', '111313', '44332', '18'), +('4', '95', '3', '111316', '43236', '18'), +('4', '95', '3', '111014', '40524', '18'), +('4', '95', '5', '111317', '44707', '18'), +('4', '95', '5', '111318', '44021', '18'), +('4', '95', '5', '111320', '42623', '18'), +('4', '95', '5', '111319', '42335', '18'), +('4', '95', '8', '111331', '45165', '18'), +('4', '95', '8', '111332', '44382', '18'), +('4', '95', '8', '111328', '43799', '18'), +('4', '95', '8', '111030', '40889', '18'), +('4', '95', '6', '111324', '44310', '18'), +('4', '95', '6', '111322', '44131', '18'), +('4', '95', '6', '106812', '44095', '18'), +('4', '95', '6', '111326', '42780', '18'), +('4', '95', '17', '56046', '32624', '18'), +('4', '95', '17', '56083', '30898', '18'), +('4', '95', '17', '81765', '29790', '18'), +('4', '95', '17', '104413', '26923', '18'), +('4', '95', '7', '94053', '32681', '18'), +('4', '95', '7', '56079', '30077', '18'), +('4', '95', '7', '104411', '29013', '18'), +('4', '95', '7', '80525', '21481', '18'), +('4', '95', '9', '67098', '41006', '18'), +('4', '95', '9', '56033', '30737', '18'), +('4', '95', '9', '56031', '30629', '18'), +('4', '95', '9', '56070', '30493', '18'), +('4', '95', '15', '111342', '45685', '18'), +('4', '95', '15', '111348', '45532', '18'), +('4', '95', '15', '111343', '45160', '18'), +('4', '95', '15', '111345', '43604', '18'), +('4', '95', '20', '111354', '54338', '18'), +('4', '95', '20', '111352', '53826', '18'), +('4', '95', '20', '111355', '53419', '18'), +('4', '95', '20', '111351', '51721', '18'), +('4', '95', '12', '56073', '29824', '18'), +('4', '95', '12', '81795', '28915', '18'), +('4', '95', '12', '104408', '26458', '18'), +('4', '95', '12', '53385', '24843', '18'), +('4', '95', '18', '62986', '30659', '18'), +('4', '95', '18', '56041', '30194', '18'), +('4', '95', '18', '94054', '29011', '18'), +('4', '95', '18', '104412', '28813', '18'), +('4', '95', '19', '62990', '31976', '18'), +('4', '95', '19', '56037', '30676', '18'), +('4', '95', '19', '56075', '28740', '18'), +('4', '95', '19', '104409', '28234', '18'), +('4', '95', '13', '111815', '507097', '18'), +('4', '95', '13', '111871', '507066', '18'), +('4', '95', '13', '111515', '489028', '18'), +('4', '95', '13', '111512', '488002', '18'), +('4', '95', '14', '111815', '507097', '18'), +('4', '95', '14', '111871', '507066', '18'), +('4', '95', '14', '111515', '489028', '18'), +('4', '95', '14', '111512', '488002', '18'), +('4', '95', '11', '111529', '546327', '18'), +('4', '95', '11', '111229', '523852', '18'), +('4', '95', '11', '106769', '458791', '18'), +('4', '95', '11', '62939', '446457', '18'), +('4', '96', '22', '7867', '0', '18'), +('4', '96', '22', '39342', '0', '18'), +('4', '96', '22', '23597', '0', '18'), +('4', '96', '22', '66166', '0', '18'), +('4', '96', '1', '111300', '44847', '18'), +('4', '96', '1', '111302', '44671', '18'), +('4', '96', '1', '111305', '44269', '18'), +('4', '96', '1', '111307', '43918', '18'), +('4', '96', '2', '94056', '31595', '18'), +('4', '96', '2', '62985', '30151', '18'), +('4', '96', '2', '80524', '29320', '18'), +('4', '96', '2', '104410', '24710', '18'), +('4', '96', '3', '111315', '44831', '18'), +('4', '96', '3', '111313', '44333', '18'), +('4', '96', '3', '111316', '43236', '18'), +('4', '96', '3', '111014', '40525', '18'), +('4', '96', '5', '111317', '44708', '18'), +('4', '96', '5', '111318', '44022', '18'), +('4', '96', '5', '111320', '42624', '18'), +('4', '96', '5', '111319', '42336', '18'), +('4', '96', '8', '111331', '45166', '18'), +('4', '96', '8', '111332', '44383', '18'), +('4', '96', '8', '111328', '43800', '18'), +('4', '96', '8', '111030', '40890', '18'), +('4', '96', '6', '111324', '44311', '18'), +('4', '96', '6', '111322', '44132', '18'), +('4', '96', '6', '106812', '44096', '18'), +('4', '96', '6', '111326', '42781', '18'), +('4', '96', '17', '56046', '32625', '18'), +('4', '96', '17', '56083', '30898', '18'), +('4', '96', '17', '81765', '29791', '18'), +('4', '96', '17', '104413', '26925', '18'), +('4', '96', '7', '94053', '32681', '18'), +('4', '96', '7', '56079', '30077', '18'), +('4', '96', '7', '104411', '29014', '18'), +('4', '96', '7', '80525', '21482', '18'), +('4', '96', '9', '67098', '41007', '18'), +('4', '96', '9', '56033', '30738', '18'), +('4', '96', '9', '56031', '30629', '18'), +('4', '96', '9', '56070', '30493', '18'), +('4', '96', '15', '111342', '45686', '18'), +('4', '96', '15', '111348', '45533', '18'), +('4', '96', '15', '111343', '45160', '18'), +('4', '96', '15', '111345', '43605', '18'), +('4', '96', '20', '111354', '54339', '18'), +('4', '96', '20', '111352', '53826', '18'), +('4', '96', '20', '111355', '53419', '18'), +('4', '96', '20', '111351', '51722', '18'), +('4', '96', '12', '56073', '29825', '18'), +('4', '96', '12', '81795', '28916', '18'), +('4', '96', '12', '104408', '26459', '18'), +('4', '96', '12', '53385', '24843', '18'), +('4', '96', '18', '62986', '30661', '18'), +('4', '96', '18', '56041', '30194', '18'), +('4', '96', '18', '94054', '29012', '18'), +('4', '96', '18', '104412', '28813', '18'), +('4', '96', '19', '62990', '31977', '18'), +('4', '96', '19', '56037', '30677', '18'), +('4', '96', '19', '56075', '28741', '18'), +('4', '96', '19', '104409', '28235', '18'), +('4', '96', '13', '111815', '508358', '18'), +('4', '96', '13', '111871', '508266', '18'), +('4', '96', '13', '111515', '490228', '18'), +('4', '96', '13', '111512', '489203', '18'), +('4', '96', '14', '111815', '508358', '18'), +('4', '96', '14', '111871', '508266', '18'), +('4', '96', '14', '111515', '490228', '18'), +('4', '96', '14', '111512', '489203', '18'), +('4', '96', '11', '111529', '547288', '18'), +('4', '96', '11', '111229', '524753', '18'), +('4', '96', '11', '106769', '459572', '18'), +('4', '96', '11', '62939', '447177', '18'), +('4', '97', '22', '7867', '0', '18'), +('4', '97', '22', '39342', '0', '18'), +('4', '97', '22', '23597', '0', '18'), +('4', '97', '22', '66166', '0', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '97', '1', '111300', '44848', '18'), +('4', '97', '1', '111302', '44672', '18'), +('4', '97', '1', '111305', '44270', '18'), +('4', '97', '1', '111307', '43919', '18'), +('4', '97', '2', '94056', '31596', '18'), +('4', '97', '2', '62985', '30152', '18'), +('4', '97', '2', '80524', '29321', '18'), +('4', '97', '2', '104410', '24711', '18'), +('4', '97', '3', '111315', '44832', '18'), +('4', '97', '3', '111313', '44334', '18'), +('4', '97', '3', '111316', '43237', '18'), +('4', '97', '3', '111014', '40526', '18'), +('4', '97', '5', '111317', '44709', '18'), +('4', '97', '5', '111318', '44023', '18'), +('4', '97', '5', '111320', '42625', '18'), +('4', '97', '5', '111319', '42336', '18'), +('4', '97', '8', '111331', '45167', '18'), +('4', '97', '8', '111332', '44384', '18'), +('4', '97', '8', '111328', '43801', '18'), +('4', '97', '8', '111030', '40891', '18'), +('4', '97', '6', '111324', '44311', '18'), +('4', '97', '6', '111322', '44132', '18'), +('4', '97', '6', '106812', '44096', '18'), +('4', '97', '6', '111326', '42783', '18'), +('4', '97', '17', '56046', '32626', '18'), +('4', '97', '17', '56083', '30899', '18'), +('4', '97', '17', '81765', '29792', '18'), +('4', '97', '17', '104413', '26926', '18'), +('4', '97', '7', '94053', '32682', '18'), +('4', '97', '7', '56079', '30078', '18'), +('4', '97', '7', '104411', '29015', '18'), +('4', '97', '7', '80525', '21483', '18'), +('4', '97', '9', '67098', '41008', '18'), +('4', '97', '9', '56033', '30739', '18'), +('4', '97', '9', '56031', '30630', '18'), +('4', '97', '9', '56070', '30494', '18'), +('4', '97', '15', '111342', '45687', '18'), +('4', '97', '15', '111348', '45534', '18'), +('4', '97', '15', '111343', '45161', '18'), +('4', '97', '15', '111345', '43605', '18'), +('4', '97', '20', '111354', '54340', '18'), +('4', '97', '20', '111352', '53827', '18'), +('4', '97', '20', '111355', '53420', '18'), +('4', '97', '20', '111351', '51722', '18'), +('4', '97', '12', '56073', '29826', '18'), +('4', '97', '12', '81795', '28916', '18'), +('4', '97', '12', '104408', '26460', '18'), +('4', '97', '12', '53385', '24844', '18'), +('4', '97', '18', '62986', '30662', '18'), +('4', '97', '18', '56041', '30195', '18'), +('4', '97', '18', '94054', '29013', '18'), +('4', '97', '18', '104412', '28814', '18'), +('4', '97', '19', '62990', '31977', '18'), +('4', '97', '19', '56037', '30678', '18'), +('4', '97', '19', '56075', '28742', '18'), +('4', '97', '19', '104409', '28235', '18'), +('4', '97', '13', '111815', '509559', '18'), +('4', '97', '13', '111871', '509527', '18'), +('4', '97', '13', '111515', '491429', '18'), +('4', '97', '13', '111512', '490344', '18'), +('4', '97', '14', '111815', '509559', '18'), +('4', '97', '14', '111871', '509527', '18'), +('4', '97', '14', '111515', '491429', '18'), +('4', '97', '14', '111512', '490344', '18'), +('4', '97', '11', '111529', '548189', '18'), +('4', '97', '11', '111229', '525654', '18'), +('4', '97', '11', '106769', '460353', '18'), +('4', '97', '11', '62939', '447958', '18'), +('4', '98', '22', '7867', '0', '18'), +('4', '98', '22', '39342', '0', '18'), +('4', '98', '22', '23597', '0', '18'), +('4', '98', '22', '66166', '0', '18'), +('4', '98', '1', '111300', '44848', '18'), +('4', '98', '1', '111302', '44673', '18'), +('4', '98', '1', '111305', '44271', '18'), +('4', '98', '1', '111307', '43919', '18'), +('4', '98', '2', '94056', '31597', '18'), +('4', '98', '2', '62985', '30153', '18'), +('4', '98', '2', '80524', '29322', '18'), +('4', '98', '2', '104410', '24711', '18'), +('4', '98', '3', '111315', '44833', '18'), +('4', '98', '3', '111313', '44335', '18'), +('4', '98', '3', '111316', '43238', '18'), +('4', '98', '3', '111014', '40527', '18'), +('4', '98', '5', '111317', '44710', '18'), +('4', '98', '5', '111318', '44024', '18'), +('4', '98', '5', '111320', '42625', '18'), +('4', '98', '5', '111319', '42337', '18'), +('4', '98', '8', '111331', '45168', '18'), +('4', '98', '8', '111332', '44384', '18'), +('4', '98', '8', '111328', '43801', '18'), +('4', '98', '8', '111030', '40892', '18'), +('4', '98', '6', '111324', '44312', '18'), +('4', '98', '6', '111322', '44133', '18'), +('4', '98', '6', '106812', '44097', '18'), +('4', '98', '6', '111326', '42784', '18'), +('4', '98', '17', '56046', '32627', '18'), +('4', '98', '17', '56083', '30899', '18'), +('4', '98', '17', '81765', '29792', '18'), +('4', '98', '17', '104413', '26927', '18'), +('4', '98', '7', '94053', '32683', '18'), +('4', '98', '7', '56079', '30079', '18'), +('4', '98', '7', '104411', '29016', '18'), +('4', '98', '7', '80525', '21484', '18'), +('4', '98', '9', '67098', '41008', '18'), +('4', '98', '9', '56033', '30739', '18'), +('4', '98', '9', '56031', '30631', '18'), +('4', '98', '9', '56070', '30495', '18'), +('4', '98', '15', '111342', '45688', '18'), +('4', '98', '15', '111348', '45535', '18'), +('4', '98', '15', '111343', '45162', '18'), +('4', '98', '15', '111345', '43606', '18'), +('4', '98', '20', '111354', '54341', '18'), +('4', '98', '20', '111352', '53828', '18'), +('4', '98', '20', '111355', '53421', '18'), +('4', '98', '20', '111351', '51723', '18'), +('4', '98', '12', '56073', '29827', '18'), +('4', '98', '12', '81795', '28917', '18'), +('4', '98', '12', '104408', '26461', '18'), +('4', '98', '12', '53385', '24845', '18'), +('4', '98', '18', '62986', '30663', '18'), +('4', '98', '18', '56041', '30196', '18'), +('4', '98', '18', '94054', '29013', '18'), +('4', '98', '18', '104412', '28814', '18'), +('4', '98', '19', '62990', '31978', '18'), +('4', '98', '19', '56037', '30679', '18'), +('4', '98', '19', '56075', '28743', '18'), +('4', '98', '19', '104409', '28236', '18'), +('4', '98', '13', '111815', '510760', '18'), +('4', '98', '13', '111871', '510728', '18'), +('4', '98', '13', '111515', '492630', '18'), +('4', '98', '13', '111512', '491544', '18'), +('4', '98', '14', '111815', '510760', '18'), +('4', '98', '14', '111871', '510728', '18'), +('4', '98', '14', '111515', '492630', '18'), +('4', '98', '14', '111512', '491544', '18'), +('4', '98', '11', '111529', '549150', '18'), +('4', '98', '11', '111229', '526555', '18'), +('4', '98', '11', '106769', '461134', '18'), +('4', '98', '11', '62939', '448739', '18'), +('4', '99', '22', '7867', '0', '18'), +('4', '99', '22', '39342', '0', '18'), +('4', '99', '22', '23597', '0', '18'), +('4', '99', '22', '66166', '0', '18'), +('4', '99', '1', '111300', '44849', '18'), +('4', '99', '1', '111302', '44674', '18'), +('4', '99', '1', '111305', '44272', '18'), +('4', '99', '1', '111307', '43920', '18'), +('4', '99', '2', '94056', '31597', '18'), +('4', '99', '2', '62985', '30154', '18'), +('4', '99', '2', '80524', '29323', '18'), +('4', '99', '2', '104410', '24712', '18'), +('4', '99', '3', '111315', '44834', '18'), +('4', '99', '3', '111313', '44336', '18'), +('4', '99', '3', '111316', '43239', '18'), +('4', '99', '3', '111014', '40528', '18'), +('4', '99', '5', '111317', '44710', '18'), +('4', '99', '5', '111318', '44024', '18'), +('4', '99', '5', '111320', '42626', '18'), +('4', '99', '5', '111319', '42338', '18'), +('4', '99', '8', '111331', '45169', '18'), +('4', '99', '8', '111332', '44385', '18'), +('4', '99', '8', '111328', '43802', '18'), +('4', '99', '8', '111030', '40893', '18'), +('4', '99', '6', '111324', '44313', '18'), +('4', '99', '6', '111322', '44133', '18'), +('4', '99', '6', '106812', '44097', '18'), +('4', '99', '6', '111326', '42785', '18'), +('4', '99', '17', '56046', '32628', '18'), +('4', '99', '17', '56083', '30900', '18'), +('4', '99', '17', '81765', '29793', '18'), +('4', '99', '17', '104413', '26928', '18'), +('4', '99', '7', '94053', '32683', '18'), +('4', '99', '7', '56079', '30080', '18'), +('4', '99', '7', '104411', '29017', '18'), +('4', '99', '7', '80525', '21485', '18'), +('4', '99', '9', '67098', '41009', '18'), +('4', '99', '9', '56033', '30740', '18'), +('4', '99', '9', '56031', '30632', '18'), +('4', '99', '9', '56070', '30495', '18'), +('4', '99', '15', '111342', '45689', '18'), +('4', '99', '15', '111348', '45536', '18'), +('4', '99', '15', '111343', '45163', '18'), +('4', '99', '15', '111345', '43607', '18'), +('4', '99', '20', '111354', '54342', '18'), +('4', '99', '20', '111352', '53829', '18'), +('4', '99', '20', '111355', '53421', '18'), +('4', '99', '20', '111351', '51724', '18'), +('4', '99', '12', '56073', '29828', '18'), +('4', '99', '12', '81795', '28918', '18'), +('4', '99', '12', '104408', '26462', '18'), +('4', '99', '12', '53385', '24845', '18'), +('4', '99', '18', '62986', '30664', '18'), +('4', '99', '18', '56041', '30197', '18'), +('4', '99', '18', '94054', '29014', '18'), +('4', '99', '18', '104412', '28815', '18'), +('4', '99', '19', '62990', '31979', '18'), +('4', '99', '19', '56037', '30680', '18'), +('4', '99', '19', '56075', '28744', '18'), +('4', '99', '19', '104409', '28236', '18'), +('4', '99', '13', '111815', '512020', '18'), +('4', '99', '13', '111871', '511929', '18'), +('4', '99', '13', '111515', '493771', '18'), +('4', '99', '13', '111512', '492745', '18'), +('4', '99', '14', '111815', '512020', '18'), +('4', '99', '14', '111871', '511929', '18'), +('4', '99', '14', '111515', '493771', '18'), +('4', '99', '14', '111512', '492745', '18'), +('4', '99', '11', '111529', '550050', '18'), +('4', '99', '11', '111229', '527395', '18'), +('4', '99', '11', '106769', '461915', '18'), +('4', '99', '11', '62939', '449519', '18'), +('4', '100', '22', '7867', '0', '20'), +('4', '100', '22', '39342', '0', '20'), +('4', '100', '22', '23597', '0', '20'), +('4', '100', '22', '66166', '0', '20'), +('4', '100', '1', '98769', '62607', '20'), +('4', '100', '1', '111300', '44850', '20'), +('4', '100', '1', '111302', '44675', '20'), +('4', '100', '1', '111305', '44273', '20'), +('4', '100', '2', '94056', '31598', '20'), +('4', '100', '2', '62985', '30155', '20'), +('4', '100', '2', '80524', '29323', '20'), +('4', '100', '2', '104410', '24713', '20'), +('4', '100', '3', '111315', '44835', '20'), +('4', '100', '3', '111313', '44336', '20'), +('4', '100', '3', '111316', '43240', '20'), +('4', '100', '3', '111014', '40529', '20'), +('4', '100', '5', '111317', '44711', '20'), +('4', '100', '5', '111318', '44025', '20'), +('4', '100', '5', '111320', '42627', '20'), +('4', '100', '5', '111319', '42339', '20'), +('4', '100', '8', '111331', '45170', '20'), +('4', '100', '8', '111332', '44386', '20'), +('4', '100', '8', '111328', '43803', '20'), +('4', '100', '8', '111030', '40894', '20'), +('4', '100', '6', '111324', '44314', '20'), +('4', '100', '6', '111322', '44134', '20'), +('4', '100', '6', '106812', '44098', '20'), +('4', '100', '6', '111326', '42786', '20'), +('4', '100', '17', '56046', '32629', '20'), +('4', '100', '17', '56083', '30900', '20'), +('4', '100', '17', '81765', '29794', '20'), +('4', '100', '17', '104413', '26929', '20'), +('4', '100', '7', '94053', '32684', '20'), +('4', '100', '7', '56079', '30081', '20'), +('4', '100', '7', '104411', '29018', '20'), +('4', '100', '7', '80525', '21486', '20'), +('4', '100', '9', '67098', '41010', '20'), +('4', '100', '9', '56033', '30741', '20'), +('4', '100', '9', '56031', '30632', '20'), +('4', '100', '9', '56070', '30496', '20'), +('4', '100', '15', '111342', '45690', '20'), +('4', '100', '15', '111348', '45537', '20'), +('4', '100', '15', '111343', '45164', '20'), +('4', '100', '15', '111345', '43607', '20'), +('4', '100', '20', '111354', '54343', '20'), +('4', '100', '20', '111352', '53830', '20'), +('4', '100', '20', '111355', '53422', '20'), +('4', '100', '20', '111351', '51725', '20'), +('4', '100', '12', '56073', '29828', '20'), +('4', '100', '12', '81795', '28919', '20'), +('4', '100', '12', '104408', '26462', '20'), +('4', '100', '12', '53385', '24846', '20'), +('4', '100', '18', '62986', '30665', '20'), +('4', '100', '18', '56041', '30197', '20'), +('4', '100', '18', '94054', '29015', '20'), +('4', '100', '18', '104412', '28815', '20'), +('4', '100', '19', '62990', '31979', '20'), +('4', '100', '19', '56037', '30681', '20'), +('4', '100', '19', '56075', '28745', '20'), +('4', '100', '19', '104409', '28237', '20'), +('4', '100', '13', '111815', '515621', '20'), +('4', '100', '13', '111871', '515530', '20'), +('4', '100', '13', '111515', '497371', '20'), +('4', '100', '13', '111512', '496346', '20'), +('4', '100', '14', '111815', '515621', '20'), +('4', '100', '14', '111871', '515530', '20'), +('4', '100', '14', '111515', '497371', '20'), +('4', '100', '14', '111512', '496346', '20'), +('4', '100', '11', '111529', '551011', '20'), +('4', '100', '11', '111229', '528296', '20'), +('4', '100', '11', '106769', '462756', '20'), +('4', '100', '11', '62939', '450240', '20'), +('4', '100', '22', '7867', '0', '19'), +('4', '100', '22', '39342', '0', '19'), +('4', '100', '22', '23597', '0', '19'), +('4', '100', '22', '66166', '0', '19'), +('4', '100', '1', '98769', '62607', '19'), +('4', '100', '1', '111300', '44850', '19'), +('4', '100', '1', '111302', '44675', '19'), +('4', '100', '1', '111305', '44273', '19'), +('4', '100', '2', '94056', '31598', '19'), +('4', '100', '2', '62985', '30155', '19'), +('4', '100', '2', '80524', '29323', '19'), +('4', '100', '2', '104410', '24713', '19'), +('4', '100', '3', '111315', '44835', '19'), +('4', '100', '3', '111313', '44336', '19'), +('4', '100', '3', '111316', '43240', '19'), +('4', '100', '3', '111014', '40529', '19'), +('4', '100', '5', '111317', '44711', '19'), +('4', '100', '5', '111318', '44025', '19'), +('4', '100', '5', '111320', '42627', '19'), +('4', '100', '5', '111319', '42339', '19'), +('4', '100', '8', '111331', '45170', '19'), +('4', '100', '8', '111332', '44386', '19'), +('4', '100', '8', '111328', '43803', '19'), +('4', '100', '8', '111030', '40894', '19'), +('4', '100', '6', '111324', '44314', '19'), +('4', '100', '6', '111322', '44134', '19'), +('4', '100', '6', '106812', '44098', '19'), +('4', '100', '6', '111326', '42786', '19'), +('4', '100', '17', '56046', '32629', '19'), +('4', '100', '17', '56083', '30900', '19'), +('4', '100', '17', '81765', '29794', '19'), +('4', '100', '17', '104413', '26929', '19'), +('4', '100', '7', '94053', '32684', '19'), +('4', '100', '7', '56079', '30081', '19'), +('4', '100', '7', '104411', '29018', '19'), +('4', '100', '7', '80525', '21486', '19'), +('4', '100', '9', '67098', '41010', '19'), +('4', '100', '9', '56033', '30741', '19'), +('4', '100', '9', '56031', '30632', '19'), +('4', '100', '9', '56070', '30496', '19'), +('4', '100', '15', '111342', '45690', '19'), +('4', '100', '15', '111348', '45537', '19'), +('4', '100', '15', '111343', '45164', '19'), +('4', '100', '15', '111345', '43607', '19'), +('4', '100', '20', '111354', '54343', '19'), +('4', '100', '20', '111352', '53830', '19'), +('4', '100', '20', '111355', '53422', '19'), +('4', '100', '20', '111351', '51725', '19'), +('4', '100', '12', '56073', '29828', '19'), +('4', '100', '12', '81795', '28919', '19'), +('4', '100', '12', '104408', '26462', '19'), +('4', '100', '12', '53385', '24846', '19'), +('4', '100', '18', '62986', '30665', '19'), +('4', '100', '18', '56041', '30197', '19'), +('4', '100', '18', '94054', '29015', '19'), +('4', '100', '18', '104412', '28815', '19'), +('4', '100', '19', '62990', '31979', '19'), +('4', '100', '19', '56037', '30681', '19'), +('4', '100', '19', '56075', '28745', '19'), +('4', '100', '19', '104409', '28237', '19'), +('4', '100', '13', '111815', '513221', '19'), +('4', '100', '13', '111871', '513130', '19'), +('4', '100', '13', '111515', '494971', '19'), +('4', '100', '13', '111512', '493946', '19'), +('4', '100', '14', '111815', '513221', '19'), +('4', '100', '14', '111871', '513130', '19'), +('4', '100', '14', '111515', '494971', '19'), +('4', '100', '14', '111512', '493946', '19'), +('4', '100', '11', '111529', '551011', '19'), +('4', '100', '11', '111229', '528296', '19'), +('4', '100', '11', '106769', '462756', '19'), +('4', '100', '11', '62939', '450240', '19'), +('4', '101', '22', '7867', '0', '20'), +('4', '101', '22', '39342', '0', '20'), +('4', '101', '22', '23597', '0', '20'), +('4', '101', '22', '66166', '0', '20'), +('4', '101', '1', '98769', '62608', '20'), +('4', '101', '1', '111300', '44850', '20'), +('4', '101', '1', '111302', '44676', '20'), +('4', '101', '1', '111305', '44274', '20'), +('4', '101', '2', '94056', '31599', '20'), +('4', '101', '2', '62985', '30156', '20'), +('4', '101', '2', '80524', '29324', '20'), +('4', '101', '2', '104410', '24714', '20'), +('4', '101', '3', '111315', '44836', '20'), +('4', '101', '3', '111313', '44337', '20'), +('4', '101', '3', '111316', '43241', '20'), +('4', '101', '3', '111014', '40530', '20'), +('4', '101', '5', '111317', '44712', '20'), +('4', '101', '5', '111318', '44026', '20'), +('4', '101', '5', '111320', '42628', '20'), +('4', '101', '5', '111319', '42340', '20'), +('4', '101', '8', '111331', '45171', '20'), +('4', '101', '8', '111332', '44387', '20'), +('4', '101', '8', '111328', '43803', '20'), +('4', '101', '8', '111030', '40895', '20'), +('4', '101', '6', '111324', '44314', '20'), +('4', '101', '6', '111322', '44134', '20'), +('4', '101', '6', '106812', '44098', '20'), +('4', '101', '6', '111326', '42787', '20'), +('4', '101', '17', '56046', '32630', '20'), +('4', '101', '17', '56083', '30901', '20'), +('4', '101', '17', '81765', '29794', '20'), +('4', '101', '17', '104413', '26930', '20'), +('4', '101', '7', '94053', '32685', '20'), +('4', '101', '7', '56079', '30081', '20'), +('4', '101', '7', '104411', '29019', '20'), +('4', '101', '7', '80525', '21487', '20'), +('4', '101', '9', '67098', '41011', '20'), +('4', '101', '9', '56033', '30741', '20'), +('4', '101', '9', '56031', '30633', '20'), +('4', '101', '9', '56070', '30497', '20'), +('4', '101', '15', '111342', '45691', '20'), +('4', '101', '15', '111348', '45538', '20'), +('4', '101', '15', '111343', '45164', '20'), +('4', '101', '15', '111345', '43608', '20'), +('4', '101', '20', '111354', '54344', '20'), +('4', '101', '20', '111352', '53831', '20'), +('4', '101', '20', '111355', '53422', '20'), +('4', '101', '20', '111351', '51726', '20'), +('4', '101', '12', '56073', '29829', '20'), +('4', '101', '12', '81795', '28919', '20'), +('4', '101', '12', '104408', '26463', '20'), +('4', '101', '12', '53385', '24847', '20'), +('4', '101', '18', '62986', '30666', '20'), +('4', '101', '18', '56041', '30198', '20'), +('4', '101', '18', '94054', '29016', '20'), +('4', '101', '18', '104412', '28816', '20'), +('4', '101', '19', '62990', '31980', '20'), +('4', '101', '19', '56037', '30681', '20'), +('4', '101', '19', '56075', '28746', '20'), +('4', '101', '19', '104409', '28237', '20'), +('4', '101', '13', '111815', '516822', '20'), +('4', '101', '13', '111871', '516790', '20'), +('4', '101', '13', '111515', '498572', '20'), +('4', '101', '13', '111512', '497547', '20'), +('4', '101', '14', '111815', '516822', '20'), +('4', '101', '14', '111871', '516790', '20'), +('4', '101', '14', '111515', '498572', '20'), +('4', '101', '14', '111512', '497547', '20'), +('4', '101', '11', '111529', '551912', '20'), +('4', '101', '11', '111229', '529197', '20'), +('4', '101', '11', '106769', '463538', '20'), +('4', '101', '11', '62939', '451021', '20'), +('4', '102', '22', '7867', '0', '20'), +('4', '102', '22', '39342', '0', '20'), +('4', '102', '22', '23597', '0', '20'), +('4', '102', '22', '66166', '0', '20'), +('4', '102', '1', '98769', '62608', '20'), +('4', '102', '1', '111300', '44851', '20'), +('4', '102', '1', '111302', '44677', '20'), +('4', '102', '1', '111305', '44275', '20'), +('4', '102', '2', '94056', '31600', '20'), +('4', '102', '2', '62985', '30157', '20'), +('4', '102', '2', '80524', '29325', '20'), +('4', '102', '2', '104410', '24714', '20'), +('4', '102', '3', '111315', '44837', '20'), +('4', '102', '3', '111313', '44338', '20'), +('4', '102', '3', '111316', '43241', '20'), +('4', '102', '3', '111014', '40531', '20'), +('4', '102', '5', '111317', '44713', '20'), +('4', '102', '5', '111318', '44026', '20'), +('4', '102', '5', '111320', '42628', '20'), +('4', '102', '5', '111319', '42340', '20'), +('4', '102', '8', '111331', '45172', '20'), +('4', '102', '8', '111332', '44388', '20'), +('4', '102', '8', '111328', '43804', '20'), +('4', '102', '8', '111030', '40896', '20'), +('4', '102', '6', '111324', '44315', '20'), +('4', '102', '6', '111322', '44135', '20'), +('4', '102', '6', '106812', '44099', '20'), +('4', '102', '6', '111326', '42788', '20'), +('4', '102', '17', '56046', '32630', '20'), +('4', '102', '17', '56083', '30901', '20'), +('4', '102', '17', '81765', '29795', '20'), +('4', '102', '17', '104413', '26931', '20'), +('4', '102', '7', '94053', '32685', '20'), +('4', '102', '7', '56079', '30082', '20'), +('4', '102', '7', '104411', '29020', '20'), +('4', '102', '7', '80525', '21488', '20'), +('4', '102', '9', '67098', '41011', '20'), +('4', '102', '9', '56033', '30742', '20'), +('4', '102', '9', '56031', '30634', '20'), +('4', '102', '9', '56070', '30498', '20'), +('4', '102', '15', '111342', '45691', '20'), +('4', '102', '15', '111348', '45539', '20'), +('4', '102', '15', '111343', '45165', '20'), +('4', '102', '15', '111345', '43608', '20'), +('4', '102', '20', '111354', '54345', '20'), +('4', '102', '20', '111352', '53832', '20'), +('4', '102', '20', '111355', '53423', '20'), +('4', '102', '20', '111351', '51726', '20'), +('4', '102', '12', '56073', '29830', '20'), +('4', '102', '12', '81795', '28920', '20'), +('4', '102', '12', '104408', '26464', '20'), +('4', '102', '12', '53385', '24847', '20'), +('4', '102', '18', '62986', '30667', '20'), +('4', '102', '18', '56041', '30199', '20'), +('4', '102', '18', '94054', '29016', '20'), +('4', '102', '18', '104412', '28816', '20'), +('4', '102', '19', '62990', '31981', '20'), +('4', '102', '19', '56037', '30682', '20'), +('4', '102', '19', '56075', '28747', '20'), +('4', '102', '19', '104409', '28238', '20'), +('4', '102', '13', '111815', '518083', '20'), +('4', '102', '13', '111871', '517991', '20'), +('4', '102', '13', '111515', '499773', '20'), +('4', '102', '13', '111512', '498747', '20'), +('4', '102', '14', '111815', '518083', '20'), +('4', '102', '14', '111871', '517991', '20'), +('4', '102', '14', '111515', '499773', '20'), +('4', '102', '14', '111512', '498747', '20'), +('4', '102', '11', '111529', '552813', '20'), +('4', '102', '11', '111229', '530098', '20'), +('4', '102', '11', '106769', '464319', '20'), +('4', '102', '11', '62939', '451801', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '103', '22', '7867', '0', '20'), +('4', '103', '22', '39342', '0', '20'), +('4', '103', '22', '23597', '0', '20'), +('4', '103', '22', '66166', '0', '20'), +('4', '103', '1', '98769', '62609', '20'), +('4', '103', '1', '111300', '44852', '20'), +('4', '103', '1', '111302', '44678', '20'), +('4', '103', '1', '111305', '44277', '20'), +('4', '103', '2', '94056', '31600', '20'), +('4', '103', '2', '62985', '30158', '20'), +('4', '103', '2', '80524', '29326', '20'), +('4', '103', '2', '104410', '24715', '20'), +('4', '103', '3', '111315', '44838', '20'), +('4', '103', '3', '111313', '44339', '20'), +('4', '103', '3', '111316', '43242', '20'), +('4', '103', '3', '111014', '40532', '20'), +('4', '103', '5', '111317', '44714', '20'), +('4', '103', '5', '111318', '44027', '20'), +('4', '103', '5', '111320', '42629', '20'), +('4', '103', '5', '111319', '42341', '20'), +('4', '103', '8', '111331', '45173', '20'), +('4', '103', '8', '111332', '44389', '20'), +('4', '103', '8', '111328', '43805', '20'), +('4', '103', '8', '111030', '40897', '20'), +('4', '103', '6', '111324', '44316', '20'), +('4', '103', '6', '111322', '44135', '20'), +('4', '103', '6', '106812', '44099', '20'), +('4', '103', '6', '111326', '42789', '20'), +('4', '103', '17', '56046', '32631', '20'), +('4', '103', '17', '56083', '30902', '20'), +('4', '103', '17', '81765', '29796', '20'), +('4', '103', '17', '104413', '26933', '20'), +('4', '103', '7', '94053', '32686', '20'), +('4', '103', '7', '56079', '30083', '20'), +('4', '103', '7', '104411', '29021', '20'), +('4', '103', '7', '80525', '21489', '20'), +('4', '103', '9', '67098', '41012', '20'), +('4', '103', '9', '56033', '30743', '20'), +('4', '103', '9', '56031', '30634', '20'), +('4', '103', '9', '56070', '30498', '20'), +('4', '103', '15', '111342', '45692', '20'), +('4', '103', '15', '111348', '45540', '20'), +('4', '103', '15', '111343', '45166', '20'), +('4', '103', '15', '111345', '43609', '20'), +('4', '103', '20', '111354', '54346', '20'), +('4', '103', '20', '111352', '53833', '20'), +('4', '103', '20', '111355', '53424', '20'), +('4', '103', '20', '111351', '51727', '20'), +('4', '103', '12', '56073', '29831', '20'), +('4', '103', '12', '81795', '28921', '20'), +('4', '103', '12', '104408', '26465', '20'), +('4', '103', '12', '53385', '24848', '20'), +('4', '103', '18', '62986', '30668', '20'), +('4', '103', '18', '56041', '30199', '20'), +('4', '103', '18', '94054', '29017', '20'), +('4', '103', '18', '104412', '28817', '20'), +('4', '103', '19', '62990', '31981', '20'), +('4', '103', '19', '56037', '30683', '20'), +('4', '103', '19', '56075', '28748', '20'), +('4', '103', '19', '104409', '28239', '20'), +('4', '103', '13', '111815', '519284', '20'), +('4', '103', '13', '111871', '519192', '20'), +('4', '103', '13', '111515', '500974', '20'), +('4', '103', '13', '111512', '499888', '20'), +('4', '103', '14', '111815', '519284', '20'), +('4', '103', '14', '111871', '519192', '20'), +('4', '103', '14', '111515', '500974', '20'), +('4', '103', '14', '111512', '499888', '20'), +('4', '103', '11', '111529', '553774', '20'), +('4', '103', '11', '111229', '530999', '20'), +('4', '103', '11', '106769', '465100', '20'), +('4', '103', '11', '62939', '452582', '20'), +('4', '104', '22', '7867', '0', '20'), +('4', '104', '22', '39342', '0', '20'), +('4', '104', '22', '23597', '0', '20'), +('4', '104', '22', '66166', '0', '20'), +('4', '104', '1', '98769', '62610', '20'), +('4', '104', '1', '111300', '44853', '20'), +('4', '104', '1', '111302', '44679', '20'), +('4', '104', '1', '111305', '44278', '20'), +('4', '104', '2', '94056', '31601', '20'), +('4', '104', '2', '62985', '30159', '20'), +('4', '104', '2', '80524', '29327', '20'), +('4', '104', '2', '104410', '24716', '20'), +('4', '104', '3', '111315', '44839', '20'), +('4', '104', '3', '111313', '44340', '20'), +('4', '104', '3', '111316', '43243', '20'), +('4', '104', '3', '111014', '40533', '20'), +('4', '104', '5', '111317', '44715', '20'), +('4', '104', '5', '111318', '44028', '20'), +('4', '104', '5', '111320', '42630', '20'), +('4', '104', '5', '111319', '42342', '20'), +('4', '104', '8', '111331', '45174', '20'), +('4', '104', '8', '111332', '44390', '20'), +('4', '104', '8', '111328', '43805', '20'), +('4', '104', '8', '111030', '40898', '20'), +('4', '104', '6', '111324', '44316', '20'), +('4', '104', '6', '111322', '44136', '20'), +('4', '104', '6', '106812', '44100', '20'), +('4', '104', '6', '111326', '42790', '20'), +('4', '104', '17', '56046', '32632', '20'), +('4', '104', '17', '56083', '30902', '20'), +('4', '104', '17', '81765', '29796', '20'), +('4', '104', '17', '104413', '26934', '20'), +('4', '104', '7', '94053', '32687', '20'), +('4', '104', '7', '56079', '30084', '20'), +('4', '104', '7', '104411', '29022', '20'), +('4', '104', '7', '80525', '21490', '20'), +('4', '104', '9', '67098', '41013', '20'), +('4', '104', '9', '56033', '30743', '20'), +('4', '104', '9', '56031', '30635', '20'), +('4', '104', '9', '56070', '30499', '20'), +('4', '104', '15', '111342', '45693', '20'), +('4', '104', '15', '111348', '45541', '20'), +('4', '104', '15', '111343', '45167', '20'), +('4', '104', '15', '111345', '43610', '20'), +('4', '104', '20', '111354', '54347', '20'), +('4', '104', '20', '111352', '53833', '20'), +('4', '104', '20', '111355', '53424', '20'), +('4', '104', '20', '111351', '51728', '20'), +('4', '104', '12', '56073', '29832', '20'), +('4', '104', '12', '81795', '28921', '20'), +('4', '104', '12', '104408', '26465', '20'), +('4', '104', '12', '53385', '24848', '20'), +('4', '104', '18', '62986', '30669', '20'), +('4', '104', '18', '56041', '30200', '20'), +('4', '104', '18', '94054', '29018', '20'), +('4', '104', '18', '104412', '28817', '20'), +('4', '104', '19', '62990', '31982', '20'), +('4', '104', '19', '56037', '30684', '20'), +('4', '104', '19', '56075', '28749', '20'), +('4', '104', '19', '104409', '28239', '20'), +('4', '104', '13', '111815', '520484', '20'), +('4', '104', '13', '111871', '520453', '20'), +('4', '104', '13', '111515', '502174', '20'), +('4', '104', '13', '111512', '501089', '20'), +('4', '104', '14', '111815', '520484', '20'), +('4', '104', '14', '111871', '520453', '20'), +('4', '104', '14', '111515', '502174', '20'), +('4', '104', '14', '111512', '501089', '20'), +('4', '104', '11', '111529', '554674', '20'), +('4', '104', '11', '111229', '531900', '20'), +('4', '104', '11', '106769', '465881', '20'), +('4', '104', '11', '62939', '453303', '20'), +('4', '105', '22', '7867', '0', '23'), +('4', '105', '22', '39342', '0', '23'), +('4', '105', '22', '23597', '0', '23'), +('4', '105', '22', '66166', '0', '23'), +('4', '105', '1', '98769', '62610', '23'), +('4', '105', '1', '111300', '44853', '23'), +('4', '105', '1', '111302', '44680', '23'), +('4', '105', '1', '111305', '44279', '23'), +('4', '105', '2', '94056', '31602', '23'), +('4', '105', '2', '62985', '30160', '23'), +('4', '105', '2', '80524', '29328', '23'), +('4', '105', '2', '104410', '24717', '23'), +('4', '105', '3', '111315', '44840', '23'), +('4', '105', '3', '111313', '44341', '23'), +('4', '105', '3', '111316', '43244', '23'), +('4', '105', '3', '111014', '40533', '23'), +('4', '105', '5', '111317', '44716', '23'), +('4', '105', '5', '111318', '44028', '23'), +('4', '105', '5', '111320', '42631', '23'), +('4', '105', '5', '111319', '42343', '23'), +('4', '105', '8', '111331', '45175', '23'), +('4', '105', '8', '111332', '44390', '23'), +('4', '105', '8', '111328', '43806', '23'), +('4', '105', '8', '111030', '40899', '23'), +('4', '105', '6', '111324', '44317', '23'), +('4', '105', '6', '111322', '44136', '23'), +('4', '105', '6', '106812', '44100', '23'), +('4', '105', '6', '111326', '42791', '23'), +('4', '105', '17', '56046', '32633', '23'), +('4', '105', '17', '56083', '30903', '23'), +('4', '105', '17', '81765', '29797', '23'), +('4', '105', '17', '104413', '26935', '23'), +('4', '105', '7', '94053', '32687', '23'), +('4', '105', '7', '56079', '30085', '23'), +('4', '105', '7', '104411', '29023', '23'), +('4', '105', '7', '80525', '21491', '23'), +('4', '105', '9', '67098', '41014', '23'), +('4', '105', '9', '56033', '30744', '23'), +('4', '105', '9', '56031', '30636', '23'), +('4', '105', '9', '56070', '30500', '23'), +('4', '105', '15', '111342', '45694', '23'), +('4', '105', '15', '111348', '45542', '23'), +('4', '105', '15', '111343', '45168', '23'), +('4', '105', '15', '111345', '43610', '23'), +('4', '105', '20', '111354', '54348', '23'), +('4', '105', '20', '111352', '53834', '23'), +('4', '105', '20', '111355', '53425', '23'), +('4', '105', '20', '111351', '51729', '23'), +('4', '105', '12', '56073', '29833', '23'), +('4', '105', '12', '81795', '28922', '23'), +('4', '105', '12', '104408', '26466', '23'), +('4', '105', '12', '53385', '24849', '23'), +('4', '105', '18', '62986', '30670', '23'), +('4', '105', '18', '56041', '30201', '23'), +('4', '105', '18', '94054', '29018', '23'), +('4', '105', '18', '104412', '28818', '23'), +('4', '105', '19', '62990', '31983', '23'), +('4', '105', '19', '56037', '30685', '23'), +('4', '105', '19', '56075', '28750', '23'), +('4', '105', '19', '104409', '28240', '23'), +('4', '105', '13', '111815', '521745', '23'), +('4', '105', '13', '111871', '521654', '23'), +('4', '105', '13', '111515', '503315', '23'), +('4', '105', '13', '111512', '502289', '23'), +('4', '105', '14', '111815', '521745', '23'), +('4', '105', '14', '111871', '521654', '23'), +('4', '105', '14', '111515', '503315', '23'), +('4', '105', '14', '111512', '502289', '23'), +('4', '105', '11', '111529', '555635', '23'), +('4', '105', '11', '111229', '532740', '23'), +('4', '105', '11', '106769', '466662', '23'), +('4', '105', '11', '62939', '454083', '23'), +('4', '105', '22', '7867', '0', '22'), +('4', '105', '22', '39342', '0', '22'), +('4', '105', '22', '23597', '0', '22'), +('4', '105', '22', '66166', '0', '22'), +('4', '105', '1', '98769', '62610', '22'), +('4', '105', '1', '111300', '44853', '22'), +('4', '105', '1', '111302', '44680', '22'), +('4', '105', '1', '111305', '44279', '22'), +('4', '105', '2', '94056', '31602', '22'), +('4', '105', '2', '62985', '30160', '22'), +('4', '105', '2', '80524', '29328', '22'), +('4', '105', '2', '104410', '24717', '22'), +('4', '105', '3', '111315', '44840', '22'), +('4', '105', '3', '111313', '44341', '22'), +('4', '105', '3', '111316', '43244', '22'), +('4', '105', '3', '111014', '40533', '22'), +('4', '105', '5', '111317', '44716', '22'), +('4', '105', '5', '111318', '44028', '22'), +('4', '105', '5', '111320', '42631', '22'), +('4', '105', '5', '111319', '42343', '22'), +('4', '105', '8', '111331', '45175', '22'), +('4', '105', '8', '111332', '44390', '22'), +('4', '105', '8', '111328', '43806', '22'), +('4', '105', '8', '111030', '40899', '22'), +('4', '105', '6', '111324', '44317', '22'), +('4', '105', '6', '111322', '44136', '22'), +('4', '105', '6', '106812', '44100', '22'), +('4', '105', '6', '111326', '42791', '22'), +('4', '105', '17', '56046', '32633', '22'), +('4', '105', '17', '56083', '30903', '22'), +('4', '105', '17', '81765', '29797', '22'), +('4', '105', '17', '104413', '26935', '22'), +('4', '105', '7', '94053', '32687', '22'), +('4', '105', '7', '56079', '30085', '22'), +('4', '105', '7', '104411', '29023', '22'), +('4', '105', '7', '80525', '21491', '22'), +('4', '105', '9', '67098', '41014', '22'), +('4', '105', '9', '56033', '30744', '22'), +('4', '105', '9', '56031', '30636', '22'), +('4', '105', '9', '56070', '30500', '22'), +('4', '105', '15', '111342', '45694', '22'), +('4', '105', '15', '111348', '45542', '22'), +('4', '105', '15', '111343', '45168', '22'), +('4', '105', '15', '111345', '43610', '22'), +('4', '105', '20', '111354', '54348', '22'), +('4', '105', '20', '111352', '53834', '22'), +('4', '105', '20', '111355', '53425', '22'), +('4', '105', '20', '111351', '51729', '22'), +('4', '105', '12', '56073', '29833', '22'), +('4', '105', '12', '81795', '28922', '22'), +('4', '105', '12', '104408', '26466', '22'), +('4', '105', '12', '53385', '24849', '22'), +('4', '105', '18', '62986', '30670', '22'), +('4', '105', '18', '56041', '30201', '22'), +('4', '105', '18', '94054', '29018', '22'), +('4', '105', '18', '104412', '28818', '22'), +('4', '105', '19', '62990', '31983', '22'), +('4', '105', '19', '56037', '30685', '22'), +('4', '105', '19', '56075', '28750', '22'), +('4', '105', '19', '104409', '28240', '22'), +('4', '105', '13', '111815', '521745', '22'), +('4', '105', '13', '111871', '521654', '22'), +('4', '105', '13', '111515', '503315', '22'), +('4', '105', '13', '111512', '502289', '22'), +('4', '105', '14', '111815', '521745', '22'), +('4', '105', '14', '111871', '521654', '22'), +('4', '105', '14', '111515', '503315', '22'), +('4', '105', '14', '111512', '502289', '22'), +('4', '105', '11', '111529', '555635', '22'), +('4', '105', '11', '111229', '532740', '22'), +('4', '105', '11', '106769', '466662', '22'), +('4', '105', '11', '62939', '454083', '22'), +('4', '105', '22', '7867', '0', '21'), +('4', '105', '22', '39342', '0', '21'), +('4', '105', '22', '23597', '0', '21'), +('4', '105', '22', '66166', '0', '21'), +('4', '105', '1', '98769', '62610', '21'), +('4', '105', '1', '111300', '44853', '21'), +('4', '105', '1', '111302', '44680', '21'), +('4', '105', '1', '111305', '44279', '21'), +('4', '105', '2', '94056', '31602', '21'), +('4', '105', '2', '62985', '30160', '21'), +('4', '105', '2', '80524', '29328', '21'), +('4', '105', '2', '104410', '24717', '21'), +('4', '105', '3', '111315', '44840', '21'), +('4', '105', '3', '111313', '44341', '21'), +('4', '105', '3', '111316', '43244', '21'), +('4', '105', '3', '111014', '40533', '21'), +('4', '105', '5', '111317', '44716', '21'), +('4', '105', '5', '111318', '44028', '21'), +('4', '105', '5', '111320', '42631', '21'), +('4', '105', '5', '111319', '42343', '21'), +('4', '105', '8', '111331', '45175', '21'), +('4', '105', '8', '111332', '44390', '21'), +('4', '105', '8', '111328', '43806', '21'), +('4', '105', '8', '111030', '40899', '21'), +('4', '105', '6', '111324', '44317', '21'), +('4', '105', '6', '111322', '44136', '21'), +('4', '105', '6', '106812', '44100', '21'), +('4', '105', '6', '111326', '42791', '21'), +('4', '105', '17', '56046', '32633', '21'), +('4', '105', '17', '56083', '30903', '21'), +('4', '105', '17', '81765', '29797', '21'), +('4', '105', '17', '104413', '26935', '21'), +('4', '105', '7', '94053', '32687', '21'), +('4', '105', '7', '56079', '30085', '21'), +('4', '105', '7', '104411', '29023', '21'), +('4', '105', '7', '80525', '21491', '21'), +('4', '105', '9', '67098', '41014', '21'), +('4', '105', '9', '56033', '30744', '21'), +('4', '105', '9', '56031', '30636', '21'), +('4', '105', '9', '56070', '30500', '21'), +('4', '105', '15', '111342', '45694', '21'), +('4', '105', '15', '111348', '45542', '21'), +('4', '105', '15', '111343', '45168', '21'), +('4', '105', '15', '111345', '43610', '21'), +('4', '105', '20', '111354', '54348', '21'), +('4', '105', '20', '111352', '53834', '21'), +('4', '105', '20', '111355', '53425', '21'), +('4', '105', '20', '111351', '51729', '21'), +('4', '105', '12', '56073', '29833', '21'), +('4', '105', '12', '81795', '28922', '21'), +('4', '105', '12', '104408', '26466', '21'), +('4', '105', '12', '53385', '24849', '21'), +('4', '105', '18', '62986', '30670', '21'), +('4', '105', '18', '56041', '30201', '21'), +('4', '105', '18', '94054', '29018', '21'), +('4', '105', '18', '104412', '28818', '21'), +('4', '105', '19', '62990', '31983', '21'), +('4', '105', '19', '56037', '30685', '21'), +('4', '105', '19', '56075', '28750', '21'), +('4', '105', '19', '104409', '28240', '21'), +('4', '105', '13', '111815', '521745', '21'), +('4', '105', '13', '111871', '521654', '21'), +('4', '105', '13', '111515', '503315', '21'), +('4', '105', '13', '111512', '502289', '21'), +('4', '105', '14', '111815', '521745', '21'), +('4', '105', '14', '111871', '521654', '21'), +('4', '105', '14', '111515', '503315', '21'), +('4', '105', '14', '111512', '502289', '21'), +('4', '105', '11', '111529', '555635', '21'), +('4', '105', '11', '111229', '532740', '21'), +('4', '105', '11', '106769', '466662', '21'), +('4', '105', '11', '62939', '454083', '21'), +('4', '106', '22', '7867', '0', '23'), +('4', '106', '22', '39342', '0', '23'), +('4', '106', '22', '23597', '0', '23'), +('4', '106', '22', '66166', '0', '23'), +('4', '106', '1', '98769', '62611', '23'), +('4', '106', '1', '111300', '44854', '23'), +('4', '106', '1', '111302', '44681', '23'), +('4', '106', '1', '111305', '44280', '23'), +('4', '106', '2', '94056', '31602', '23'), +('4', '106', '2', '62985', '30161', '23'), +('4', '106', '2', '80524', '29329', '23'), +('4', '106', '2', '104410', '24717', '23'), +('4', '106', '3', '111315', '44841', '23'), +('4', '106', '3', '111313', '44342', '23'), +('4', '106', '3', '111316', '43245', '23'), +('4', '106', '3', '111014', '40534', '23'), +('4', '106', '5', '111317', '44716', '23'), +('4', '106', '5', '111318', '44029', '23'), +('4', '106', '5', '111320', '42631', '23'), +('4', '106', '5', '111319', '42344', '23'), +('4', '106', '8', '111331', '45176', '23'), +('4', '106', '8', '111332', '44391', '23'), +('4', '106', '8', '111328', '43806', '23'), +('4', '106', '8', '111030', '40900', '23'), +('4', '106', '6', '111324', '44318', '23'), +('4', '106', '6', '111322', '44137', '23'), +('4', '106', '6', '106812', '44101', '23'), +('4', '106', '6', '111326', '42792', '23'), +('4', '106', '17', '56046', '32634', '23'), +('4', '106', '17', '56083', '30903', '23'), +('4', '106', '17', '81765', '29798', '23'), +('4', '106', '17', '104413', '26936', '23'), +('4', '106', '7', '94053', '32688', '23'), +('4', '106', '7', '56079', '30085', '23'), +('4', '106', '7', '104411', '29024', '23'), +('4', '106', '7', '80525', '21492', '23'), +('4', '106', '9', '67098', '41014', '23'), +('4', '106', '9', '56033', '30745', '23'), +('4', '106', '9', '56031', '30636', '23'), +('4', '106', '9', '56070', '30500', '23'), +('4', '106', '15', '111342', '45695', '23'), +('4', '106', '15', '111348', '45543', '23'), +('4', '106', '15', '111343', '45168', '23'), +('4', '106', '15', '111345', '43611', '23'), +('4', '106', '20', '111354', '54349', '23'), +('4', '106', '20', '111352', '53835', '23'), +('4', '106', '20', '111355', '53425', '23'), +('4', '106', '20', '111351', '51730', '23'), +('4', '106', '12', '56073', '29834', '23'), +('4', '106', '12', '81795', '28923', '23'), +('4', '106', '12', '104408', '26467', '23'), +('4', '106', '12', '53385', '24850', '23'), +('4', '106', '18', '62986', '30671', '23'), +('4', '106', '18', '56041', '30201', '23'), +('4', '106', '18', '94054', '29019', '23'), +('4', '106', '18', '104412', '28818', '23'), +('4', '106', '19', '62990', '31983', '23'), +('4', '106', '19', '56037', '30686', '23'), +('4', '106', '19', '56075', '28751', '23'), +('4', '106', '19', '104409', '28240', '23'), +('4', '106', '13', '111815', '522946', '23'), +('4', '106', '13', '111871', '522855', '23'), +('4', '106', '13', '111515', '504516', '23'), +('4', '106', '13', '111512', '503490', '23'), +('4', '106', '14', '111815', '522946', '23'), +('4', '106', '14', '111871', '522855', '23'), +('4', '106', '14', '111515', '504516', '23'), +('4', '106', '14', '111512', '503490', '23'), +('4', '106', '11', '111529', '556536', '23'), +('4', '106', '11', '111229', '533641', '23'), +('4', '106', '11', '106769', '467443', '23'), +('4', '106', '11', '62939', '454864', '23'), +('4', '107', '22', '7867', '0', '23'), +('4', '107', '22', '39342', '0', '23'), +('4', '107', '22', '23597', '0', '23'), +('4', '107', '22', '66166', '0', '23'), +('4', '107', '1', '98769', '62611', '23'), +('4', '107', '1', '111300', '44855', '23'), +('4', '107', '1', '111302', '44682', '23'), +('4', '107', '1', '111305', '44281', '23'), +('4', '107', '2', '94056', '31603', '23'), +('4', '107', '2', '62985', '30162', '23'), +('4', '107', '2', '80524', '29330', '23'), +('4', '107', '2', '104410', '24718', '23'), +('4', '107', '3', '111315', '44841', '23'), +('4', '107', '3', '111313', '44342', '23'), +('4', '107', '3', '111316', '43245', '23'), +('4', '107', '3', '111014', '40535', '23'), +('4', '107', '5', '111317', '44717', '23'), +('4', '107', '5', '111318', '44030', '23'), +('4', '107', '5', '111320', '42632', '23'), +('4', '107', '5', '111319', '42344', '23'), +('4', '107', '8', '111331', '45177', '23'), +('4', '107', '8', '111332', '44392', '23'), +('4', '107', '8', '111328', '43807', '23'), +('4', '107', '8', '111030', '40901', '23'), +('4', '107', '6', '111324', '44319', '23'), +('4', '107', '6', '111322', '44137', '23'), +('4', '107', '6', '106812', '44101', '23'), +('4', '107', '6', '111326', '42793', '23'), +('4', '107', '17', '56046', '32635', '23'), +('4', '107', '17', '56083', '30904', '23'), +('4', '107', '17', '81765', '29798', '23'), +('4', '107', '17', '104413', '26937', '23'), +('4', '107', '7', '94053', '32689', '23'), +('4', '107', '7', '56079', '30086', '23'), +('4', '107', '7', '104411', '29025', '23'), +('4', '107', '7', '80525', '21493', '23'), +('4', '107', '9', '67098', '41015', '23'), +('4', '107', '9', '56033', '30745', '23'), +('4', '107', '9', '56031', '30637', '23'), +('4', '107', '9', '56070', '30501', '23'), +('4', '107', '15', '111342', '45696', '23'), +('4', '107', '15', '111348', '45544', '23'), +('4', '107', '15', '111343', '45169', '23'), +('4', '107', '15', '111345', '43611', '23'), +('4', '107', '20', '111354', '54350', '23'), +('4', '107', '20', '111352', '53836', '23'), +('4', '107', '20', '111355', '53426', '23'), +('4', '107', '20', '111351', '51731', '23'), +('4', '107', '12', '56073', '29835', '23'), +('4', '107', '12', '81795', '28923', '23'), +('4', '107', '12', '104408', '26468', '23'), +('4', '107', '12', '53385', '24850', '23'), +('4', '107', '18', '62986', '30672', '23'), +('4', '107', '18', '56041', '30202', '23'), +('4', '107', '18', '94054', '29020', '23'), +('4', '107', '18', '104412', '28818', '23'), +('4', '107', '19', '62990', '31984', '23'), +('4', '107', '19', '56037', '30687', '23'), +('4', '107', '19', '56075', '28752', '23'), +('4', '107', '19', '104409', '28241', '23'), +('4', '107', '13', '111815', '524147', '23'), +('4', '107', '13', '111871', '524115', '23'), +('4', '107', '13', '111515', '505717', '23'), +('4', '107', '13', '111512', '504691', '23'), +('4', '107', '14', '111815', '524147', '23'), +('4', '107', '14', '111871', '524115', '23'), +('4', '107', '14', '111515', '505717', '23'), +('4', '107', '14', '111512', '504691', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '107', '11', '111529', '557437', '23'), +('4', '107', '11', '111229', '534542', '23'), +('4', '107', '11', '106769', '468225', '23'), +('4', '107', '11', '62939', '455585', '23'), +('4', '108', '22', '7867', '0', '23'), +('4', '108', '22', '39342', '0', '23'), +('4', '108', '22', '23597', '0', '23'), +('4', '108', '22', '66166', '0', '23'), +('4', '108', '1', '98769', '62612', '23'), +('4', '108', '1', '111300', '44855', '23'), +('4', '108', '1', '111302', '44683', '23'), +('4', '108', '1', '111305', '44282', '23'), +('4', '108', '2', '94056', '31604', '23'), +('4', '108', '2', '62985', '30163', '23'), +('4', '108', '2', '80524', '29330', '23'), +('4', '108', '2', '104410', '24719', '23'), +('4', '108', '3', '111315', '44842', '23'), +('4', '108', '3', '111313', '44343', '23'), +('4', '108', '3', '111316', '43246', '23'), +('4', '108', '3', '111014', '40536', '23'), +('4', '108', '5', '111317', '44718', '23'), +('4', '108', '5', '111318', '44030', '23'), +('4', '108', '5', '111320', '42633', '23'), +('4', '108', '5', '111319', '42345', '23'), +('4', '108', '8', '111331', '45178', '23'), +('4', '108', '8', '111332', '44393', '23'), +('4', '108', '8', '111328', '43808', '23'), +('4', '108', '8', '111030', '40902', '23'), +('4', '108', '6', '111324', '44319', '23'), +('4', '108', '6', '111322', '44138', '23'), +('4', '108', '6', '106812', '44102', '23'), +('4', '108', '6', '111326', '42795', '23'), +('4', '108', '17', '56046', '32636', '23'), +('4', '108', '17', '56083', '30904', '23'), +('4', '108', '17', '81765', '29799', '23'), +('4', '108', '17', '104413', '26938', '23'), +('4', '108', '7', '94053', '32690', '23'), +('4', '108', '7', '56079', '30087', '23'), +('4', '108', '7', '104411', '29026', '23'), +('4', '108', '7', '80525', '21494', '23'), +('4', '108', '9', '67098', '41016', '23'), +('4', '108', '9', '56033', '30746', '23'), +('4', '108', '9', '56031', '30638', '23'), +('4', '108', '9', '56070', '30502', '23'), +('4', '108', '15', '111342', '45697', '23'), +('4', '108', '15', '111348', '45545', '23'), +('4', '108', '15', '111343', '45170', '23'), +('4', '108', '15', '111345', '43612', '23'), +('4', '108', '20', '111354', '54351', '23'), +('4', '108', '20', '111352', '53837', '23'), +('4', '108', '20', '111355', '53427', '23'), +('4', '108', '20', '111351', '51731', '23'), +('4', '108', '12', '56073', '29836', '23'), +('4', '108', '12', '81795', '28924', '23'), +('4', '108', '12', '104408', '26468', '23'), +('4', '108', '12', '53385', '24851', '23'), +('4', '108', '18', '62986', '30673', '23'), +('4', '108', '18', '56041', '30203', '23'), +('4', '108', '18', '94054', '29020', '23'), +('4', '108', '18', '104412', '28819', '23'), +('4', '108', '19', '62990', '31984', '23'), +('4', '108', '19', '56037', '30688', '23'), +('4', '108', '19', '56075', '28753', '23'), +('4', '108', '19', '104409', '28241', '23'), +('4', '108', '13', '111815', '525348', '23'), +('4', '108', '13', '111871', '525316', '23'), +('4', '108', '13', '111515', '506918', '23'), +('4', '108', '13', '111512', '505832', '23'), +('4', '108', '14', '111815', '525348', '23'), +('4', '108', '14', '111871', '525316', '23'), +('4', '108', '14', '111515', '506918', '23'), +('4', '108', '14', '111512', '505832', '23'), +('4', '108', '11', '111529', '558397', '23'), +('4', '108', '11', '111229', '535443', '23'), +('4', '108', '11', '106769', '469006', '23'), +('4', '108', '11', '62939', '456366', '23'), +('4', '109', '22', '7867', '0', '23'), +('4', '109', '22', '39342', '0', '23'), +('4', '109', '22', '23597', '0', '23'), +('4', '109', '22', '66166', '0', '23'), +('4', '109', '1', '98769', '62612', '23'), +('4', '109', '1', '111300', '44856', '23'), +('4', '109', '1', '111302', '44684', '23'), +('4', '109', '1', '111305', '44283', '23'), +('4', '109', '2', '94056', '31605', '23'), +('4', '109', '2', '62985', '30164', '23'), +('4', '109', '2', '80524', '29331', '23'), +('4', '109', '2', '104410', '24720', '23'), +('4', '109', '3', '111315', '44843', '23'), +('4', '109', '3', '111313', '44344', '23'), +('4', '109', '3', '111316', '43247', '23'), +('4', '109', '3', '111014', '40537', '23'), +('4', '109', '5', '111317', '44719', '23'), +('4', '109', '5', '111318', '44031', '23'), +('4', '109', '5', '111320', '42633', '23'), +('4', '109', '5', '111319', '42346', '23'), +('4', '109', '8', '111331', '45179', '23'), +('4', '109', '8', '111332', '44394', '23'), +('4', '109', '8', '111328', '43808', '23'), +('4', '109', '8', '111030', '40903', '23'), +('4', '109', '6', '111324', '44320', '23'), +('4', '109', '6', '111322', '44139', '23'), +('4', '109', '6', '106812', '44102', '23'), +('4', '109', '6', '111326', '42796', '23'), +('4', '109', '17', '56046', '32637', '23'), +('4', '109', '17', '56083', '30905', '23'), +('4', '109', '17', '81765', '29800', '23'), +('4', '109', '17', '104413', '26939', '23'), +('4', '109', '7', '94053', '32690', '23'), +('4', '109', '7', '56079', '30088', '23'), +('4', '109', '7', '104411', '29027', '23'), +('4', '109', '7', '80525', '21494', '23'), +('4', '109', '9', '67098', '41017', '23'), +('4', '109', '9', '56033', '30747', '23'), +('4', '109', '9', '56031', '30638', '23'), +('4', '109', '9', '56070', '30502', '23'), +('4', '109', '15', '111342', '45698', '23'), +('4', '109', '15', '111348', '45545', '23'), +('4', '109', '15', '111343', '45171', '23'), +('4', '109', '15', '111345', '43613', '23'), +('4', '109', '20', '111354', '54352', '23'), +('4', '109', '20', '111352', '53838', '23'), +('4', '109', '20', '111355', '53427', '23'), +('4', '109', '20', '111351', '51732', '23'), +('4', '109', '12', '56073', '29837', '23'), +('4', '109', '12', '81795', '28925', '23'), +('4', '109', '12', '104408', '26469', '23'), +('4', '109', '12', '53385', '24852', '23'), +('4', '109', '18', '62986', '30674', '23'), +('4', '109', '18', '56041', '30203', '23'), +('4', '109', '18', '94054', '29021', '23'), +('4', '109', '18', '104412', '28819', '23'), +('4', '109', '19', '62990', '31985', '23'), +('4', '109', '19', '56037', '30689', '23'), +('4', '109', '19', '56075', '28754', '23'), +('4', '109', '19', '104409', '28242', '23'), +('4', '109', '13', '111815', '526608', '23'), +('4', '109', '13', '111871', '526517', '23'), +('4', '109', '13', '111515', '508118', '23'), +('4', '109', '13', '111512', '507032', '23'), +('4', '109', '14', '111815', '526608', '23'), +('4', '109', '14', '111871', '526517', '23'), +('4', '109', '14', '111515', '508118', '23'), +('4', '109', '14', '111512', '507032', '23'), +('4', '109', '11', '111529', '559298', '23'), +('4', '109', '11', '111229', '536344', '23'), +('4', '109', '11', '106769', '469847', '23'), +('4', '109', '11', '62939', '457146', '23'), +('4', '110', '22', '7867', '0', '25'), +('4', '110', '22', '39342', '0', '25'), +('4', '110', '22', '23597', '0', '25'), +('4', '110', '22', '66166', '0', '25'), +('4', '110', '1', '98769', '62613', '25'), +('4', '110', '1', '111300', '44857', '25'), +('4', '110', '1', '111302', '44685', '25'), +('4', '110', '1', '111305', '44285', '25'), +('4', '110', '2', '94056', '31605', '25'), +('4', '110', '2', '62985', '30165', '25'), +('4', '110', '2', '80524', '29332', '25'), +('4', '110', '2', '104410', '24720', '25'), +('4', '110', '3', '111315', '44844', '25'), +('4', '110', '3', '111313', '44345', '25'), +('4', '110', '3', '111316', '43248', '25'), +('4', '110', '3', '111014', '40538', '25'), +('4', '110', '5', '111317', '44720', '25'), +('4', '110', '5', '111318', '44032', '25'), +('4', '110', '5', '111320', '42634', '25'), +('4', '110', '5', '111319', '42347', '25'), +('4', '110', '8', '111331', '45180', '25'), +('4', '110', '8', '111332', '44395', '25'), +('4', '110', '8', '111328', '43809', '25'), +('4', '110', '8', '111030', '40904', '25'), +('4', '110', '6', '111324', '44321', '25'), +('4', '110', '6', '111322', '44139', '25'), +('4', '110', '6', '106812', '44103', '25'), +('4', '110', '6', '111326', '42797', '25'), +('4', '110', '17', '56046', '32638', '25'), +('4', '110', '17', '56083', '30905', '25'), +('4', '110', '17', '81765', '29801', '25'), +('4', '110', '17', '104413', '26941', '25'), +('4', '110', '7', '94053', '32691', '25'), +('4', '110', '7', '56079', '30089', '25'), +('4', '110', '7', '104411', '29028', '25'), +('4', '110', '7', '80525', '21495', '25'), +('4', '110', '9', '67098', '41017', '25'), +('4', '110', '9', '56033', '30748', '25'), +('4', '110', '9', '56031', '30639', '25'), +('4', '110', '9', '56070', '30503', '25'), +('4', '110', '15', '111342', '45699', '25'), +('4', '110', '15', '111348', '45546', '25'), +('4', '110', '15', '111343', '45172', '25'), +('4', '110', '15', '111345', '43613', '25'), +('4', '110', '20', '111354', '54352', '25'), +('4', '110', '20', '111352', '53839', '25'), +('4', '110', '20', '111355', '53428', '25'), +('4', '110', '20', '111351', '51733', '25'), +('4', '110', '12', '56073', '29838', '25'), +('4', '110', '12', '81795', '28925', '25'), +('4', '110', '12', '104408', '26470', '25'), +('4', '110', '12', '53385', '24852', '25'), +('4', '110', '18', '62986', '30675', '25'), +('4', '110', '18', '56041', '30204', '25'), +('4', '110', '18', '94054', '29022', '25'), +('4', '110', '18', '104412', '28820', '25'), +('4', '110', '19', '62904', '37412', '25'), +('4', '110', '19', '62990', '31986', '25'), +('4', '110', '19', '56037', '30690', '25'), +('4', '110', '19', '56075', '28755', '25'), +('4', '110', '13', '111815', '530209', '25'), +('4', '110', '13', '111871', '530118', '25'), +('4', '110', '13', '111515', '511659', '25'), +('4', '110', '13', '111512', '510633', '25'), +('4', '110', '14', '111815', '530209', '25'), +('4', '110', '14', '111871', '530118', '25'), +('4', '110', '14', '111515', '511659', '25'), +('4', '110', '14', '111512', '510633', '25'), +('4', '110', '11', '111529', '560259', '25'), +('4', '110', '11', '111229', '537185', '25'), +('4', '110', '11', '106769', '470628', '25'), +('4', '110', '11', '62939', '457927', '25'), +('4', '110', '22', '7867', '0', '24'), +('4', '110', '22', '39342', '0', '24'), +('4', '110', '22', '23597', '0', '24'), +('4', '110', '22', '66166', '0', '24'), +('4', '110', '1', '98769', '62613', '24'), +('4', '110', '1', '111300', '44857', '24'), +('4', '110', '1', '111302', '44685', '24'), +('4', '110', '1', '111305', '44285', '24'), +('4', '110', '2', '94056', '31605', '24'), +('4', '110', '2', '62985', '30165', '24'), +('4', '110', '2', '80524', '29332', '24'), +('4', '110', '2', '104410', '24720', '24'), +('4', '110', '3', '111315', '44844', '24'), +('4', '110', '3', '111313', '44345', '24'), +('4', '110', '3', '111316', '43248', '24'), +('4', '110', '3', '111014', '40538', '24'), +('4', '110', '5', '111317', '44720', '24'), +('4', '110', '5', '111318', '44032', '24'), +('4', '110', '5', '111320', '42634', '24'), +('4', '110', '5', '111319', '42347', '24'), +('4', '110', '8', '111331', '45180', '24'), +('4', '110', '8', '111332', '44395', '24'), +('4', '110', '8', '111328', '43809', '24'), +('4', '110', '8', '111030', '40904', '24'), +('4', '110', '6', '111324', '44321', '24'), +('4', '110', '6', '111322', '44139', '24'), +('4', '110', '6', '106812', '44103', '24'), +('4', '110', '6', '111326', '42797', '24'), +('4', '110', '17', '56046', '32638', '24'), +('4', '110', '17', '56083', '30905', '24'), +('4', '110', '17', '81765', '29801', '24'), +('4', '110', '17', '104413', '26941', '24'), +('4', '110', '7', '94053', '32691', '24'), +('4', '110', '7', '56079', '30089', '24'), +('4', '110', '7', '104411', '29028', '24'), +('4', '110', '7', '80525', '21495', '24'), +('4', '110', '9', '67098', '41017', '24'), +('4', '110', '9', '56033', '30748', '24'), +('4', '110', '9', '56031', '30639', '24'), +('4', '110', '9', '56070', '30503', '24'), +('4', '110', '15', '111342', '45699', '24'), +('4', '110', '15', '111348', '45546', '24'), +('4', '110', '15', '111343', '45172', '24'), +('4', '110', '15', '111345', '43613', '24'), +('4', '110', '20', '111354', '54352', '24'), +('4', '110', '20', '111352', '53839', '24'), +('4', '110', '20', '111355', '53428', '24'), +('4', '110', '20', '111351', '51733', '24'), +('4', '110', '12', '56073', '29838', '24'), +('4', '110', '12', '81795', '28925', '24'), +('4', '110', '12', '104408', '26470', '24'), +('4', '110', '12', '53385', '24852', '24'), +('4', '110', '18', '62986', '30675', '24'), +('4', '110', '18', '56041', '30204', '24'), +('4', '110', '18', '94054', '29022', '24'), +('4', '110', '18', '104412', '28820', '24'), +('4', '110', '19', '62990', '31986', '24'), +('4', '110', '19', '56037', '30690', '24'), +('4', '110', '19', '56075', '28755', '24'), +('4', '110', '19', '104409', '28242', '24'), +('4', '110', '13', '111815', '530209', '24'), +('4', '110', '13', '111871', '530118', '24'), +('4', '110', '13', '111515', '511659', '24'), +('4', '110', '13', '111512', '510633', '24'), +('4', '110', '14', '111815', '530209', '24'), +('4', '110', '14', '111871', '530118', '24'), +('4', '110', '14', '111515', '511659', '24'), +('4', '110', '14', '111512', '510633', '24'), +('4', '110', '11', '111529', '560259', '24'), +('4', '110', '11', '111229', '537185', '24'), +('4', '110', '11', '106769', '470628', '24'), +('4', '110', '11', '62939', '457927', '24'), +('4', '111', '22', '7867', '0', '25'), +('4', '111', '22', '39342', '0', '25'), +('4', '111', '22', '23597', '0', '25'), +('4', '111', '22', '66166', '0', '25'), +('4', '111', '1', '98769', '62614', '25'), +('4', '111', '1', '111300', '44858', '25'), +('4', '111', '1', '111302', '44686', '25'), +('4', '111', '1', '111305', '44286', '25'), +('4', '111', '2', '94056', '31606', '25'), +('4', '111', '2', '62985', '30166', '25'), +('4', '111', '2', '80524', '29333', '25'), +('4', '111', '2', '104410', '24721', '25'), +('4', '111', '3', '111315', '44845', '25'), +('4', '111', '3', '111313', '44346', '25'), +('4', '111', '3', '111316', '43249', '25'), +('4', '111', '3', '111014', '40539', '25'), +('4', '111', '5', '111317', '44721', '25'), +('4', '111', '5', '111318', '44032', '25'), +('4', '111', '5', '111320', '42635', '25'), +('4', '111', '5', '111319', '42348', '25'), +('4', '111', '8', '111331', '45181', '25'), +('4', '111', '8', '111332', '44396', '25'), +('4', '111', '8', '111328', '43810', '25'), +('4', '111', '8', '111030', '40905', '25'), +('4', '111', '6', '111324', '44322', '25'), +('4', '111', '6', '111322', '44140', '25'), +('4', '111', '6', '106812', '44103', '25'), +('4', '111', '6', '111326', '42798', '25'), +('4', '111', '17', '56046', '32639', '25'), +('4', '111', '17', '56083', '30905', '25'), +('4', '111', '17', '81765', '29801', '25'), +('4', '111', '17', '104413', '26942', '25'), +('4', '111', '7', '94053', '32692', '25'), +('4', '111', '7', '56079', '30089', '25'), +('4', '111', '7', '104411', '29029', '25'), +('4', '111', '7', '80525', '21496', '25'), +('4', '111', '9', '67098', '41018', '25'), +('4', '111', '9', '56033', '30748', '25'), +('4', '111', '9', '56031', '30640', '25'), +('4', '111', '9', '56070', '30504', '25'), +('4', '111', '15', '111342', '45700', '25'), +('4', '111', '15', '111348', '45547', '25'), +('4', '111', '15', '111343', '45172', '25'), +('4', '111', '15', '111345', '43614', '25'), +('4', '111', '20', '111354', '54353', '25'), +('4', '111', '20', '111352', '53840', '25'), +('4', '111', '20', '111355', '53428', '25'), +('4', '111', '20', '111351', '51734', '25'), +('4', '111', '12', '56073', '29839', '25'), +('4', '111', '12', '81795', '28926', '25'), +('4', '111', '12', '104408', '26471', '25'), +('4', '111', '12', '53385', '24853', '25'), +('4', '111', '18', '62986', '30676', '25'), +('4', '111', '18', '56041', '30205', '25'), +('4', '111', '18', '94054', '29022', '25'), +('4', '111', '18', '104412', '28820', '25'), +('4', '111', '19', '62904', '37413', '25'), +('4', '111', '19', '62990', '31986', '25'), +('4', '111', '19', '56037', '30691', '25'), +('4', '111', '19', '56075', '28756', '25'), +('4', '111', '13', '111815', '531410', '25'), +('4', '111', '13', '111871', '531379', '25'), +('4', '111', '13', '111515', '512860', '25'), +('4', '111', '13', '111512', '511834', '25'), +('4', '111', '14', '111815', '531410', '25'), +('4', '111', '14', '111871', '531379', '25'), +('4', '111', '14', '111515', '512860', '25'), +('4', '111', '14', '111512', '511834', '25'), +('4', '111', '11', '111529', '561160', '25'), +('4', '111', '11', '111229', '538085', '25'), +('4', '111', '11', '106769', '471409', '25'), +('4', '111', '11', '62939', '458648', '25'), +('4', '112', '22', '7867', '0', '25'), +('4', '112', '22', '39342', '0', '25'), +('4', '112', '22', '23597', '0', '25'), +('4', '112', '22', '66166', '0', '25'), +('4', '112', '1', '98769', '62614', '25'), +('4', '112', '1', '111300', '44858', '25'), +('4', '112', '1', '111302', '44686', '25'), +('4', '112', '1', '111305', '44287', '25'), +('4', '112', '2', '94056', '31607', '25'), +('4', '112', '2', '62985', '30167', '25'), +('4', '112', '2', '80524', '29334', '25'), +('4', '112', '2', '104410', '24722', '25'), +('4', '112', '3', '111315', '44846', '25'), +('4', '112', '3', '111313', '44347', '25'), +('4', '112', '3', '111316', '43250', '25'), +('4', '112', '3', '111014', '40540', '25'), +('4', '112', '5', '111317', '44722', '25'), +('4', '112', '5', '111318', '44033', '25'), +('4', '112', '5', '111320', '42636', '25'), +('4', '112', '5', '111319', '42348', '25'), +('4', '112', '8', '111331', '45182', '25'), +('4', '112', '8', '111332', '44396', '25'), +('4', '112', '8', '111328', '43810', '25'), +('4', '112', '8', '111030', '40906', '25'), +('4', '112', '6', '111324', '44322', '25'), +('4', '112', '6', '111322', '44140', '25'), +('4', '112', '6', '106812', '44104', '25'), +('4', '112', '6', '111326', '42799', '25'), +('4', '112', '17', '56046', '32640', '25'), +('4', '112', '17', '56083', '30906', '25'), +('4', '112', '17', '81765', '29802', '25'), +('4', '112', '17', '104413', '26943', '25'), +('4', '112', '7', '94053', '32692', '25'), +('4', '112', '7', '56079', '30090', '25'), +('4', '112', '7', '104411', '29030', '25'), +('4', '112', '7', '80525', '21497', '25'), +('4', '112', '9', '67098', '41019', '25'), +('4', '112', '9', '56033', '30749', '25'), +('4', '112', '9', '56031', '30640', '25'), +('4', '112', '9', '56070', '30505', '25'), +('4', '112', '15', '111342', '45701', '25'), +('4', '112', '15', '111348', '45548', '25'), +('4', '112', '15', '111343', '45173', '25'), +('4', '112', '15', '111345', '43615', '25'), +('4', '112', '20', '111354', '54354', '25'), +('4', '112', '20', '111352', '53840', '25'), +('4', '112', '20', '111355', '53429', '25'), +('4', '112', '20', '111351', '51735', '25'), +('4', '112', '12', '56073', '29839', '25'), +('4', '112', '12', '81795', '28927', '25'), +('4', '112', '12', '104408', '26471', '25'), +('4', '112', '12', '53385', '24853', '25'), +('4', '112', '18', '62986', '30677', '25'), +('4', '112', '18', '56041', '30206', '25'), +('4', '112', '18', '94054', '29023', '25'), +('4', '112', '18', '104412', '28821', '25'), +('4', '112', '19', '62904', '37414', '25'), +('4', '112', '19', '62990', '31987', '25'), +('4', '112', '19', '56037', '30692', '25'), +('4', '112', '19', '56075', '28757', '25'), +('4', '112', '13', '111815', '532671', '25'), +('4', '112', '13', '111871', '532579', '25'), +('4', '112', '13', '111515', '514061', '25'), +('4', '112', '13', '111512', '513034', '25'), +('4', '112', '14', '111815', '532671', '25'), +('4', '112', '14', '111871', '532579', '25'), +('4', '112', '14', '111515', '514061', '25'), +('4', '112', '14', '111512', '513034', '25'), +('4', '112', '11', '111529', '562121', '25'), +('4', '112', '11', '111229', '538986', '25'), +('4', '112', '11', '106769', '472190', '25'), +('4', '112', '11', '62939', '459428', '25'), +('4', '113', '22', '7867', '0', '25'), +('4', '113', '22', '39342', '0', '25'), +('4', '113', '22', '23597', '0', '25'), +('4', '113', '22', '66166', '0', '25'), +('4', '113', '1', '98769', '62615', '25'), +('4', '113', '1', '111300', '44859', '25'), +('4', '113', '1', '111302', '44687', '25'), +('4', '113', '1', '111305', '44288', '25'), +('4', '113', '2', '94056', '31608', '25'), +('4', '113', '2', '62985', '30167', '25'), +('4', '113', '2', '80524', '29335', '25'), +('4', '113', '2', '104410', '24723', '25'), +('4', '113', '3', '111315', '44847', '25'), +('4', '113', '3', '111313', '44347', '25'), +('4', '113', '3', '111316', '43250', '25'), +('4', '113', '3', '111014', '40541', '25'), +('4', '113', '5', '111317', '44722', '25'), +('4', '113', '5', '111318', '44034', '25'), +('4', '113', '5', '111320', '42636', '25'), +('4', '113', '5', '111319', '42349', '25'), +('4', '113', '8', '111331', '45183', '25'), +('4', '113', '8', '111332', '44397', '25'), +('4', '113', '8', '111328', '43811', '25'), +('4', '113', '8', '111030', '40907', '25'), +('4', '113', '6', '111324', '44323', '25'), +('4', '113', '6', '111322', '44141', '25'), +('4', '113', '6', '106812', '44104', '25'), +('4', '113', '6', '111326', '42800', '25'), +('4', '113', '17', '56046', '32641', '25'), +('4', '113', '17', '56083', '30906', '25'), +('4', '113', '17', '81765', '29803', '25'), +('4', '113', '17', '104413', '26944', '25'), +('4', '113', '7', '94053', '32693', '25'), +('4', '113', '7', '56079', '30091', '25'), +('4', '113', '7', '104411', '29032', '25'), +('4', '113', '7', '80525', '21498', '25'), +('4', '113', '9', '67098', '41019', '25'), +('4', '113', '9', '56033', '30750', '25'), +('4', '113', '9', '56031', '30641', '25'), +('4', '113', '9', '56070', '30505', '25'), +('4', '113', '15', '111342', '45702', '25'), +('4', '113', '15', '111348', '45549', '25'), +('4', '113', '15', '111343', '45174', '25'), +('4', '113', '15', '111345', '43615', '25'), +('4', '113', '20', '111354', '54355', '25'), +('4', '113', '20', '111352', '53841', '25'), +('4', '113', '20', '111355', '53429', '25'), +('4', '113', '20', '111351', '51735', '25'), +('4', '113', '12', '56073', '29840', '25'), +('4', '113', '12', '81795', '28928', '25'), +('4', '113', '12', '104408', '26472', '25'), +('4', '113', '12', '53385', '24854', '25'), +('4', '113', '18', '62986', '30678', '25'), +('4', '113', '18', '56041', '30206', '25'), +('4', '113', '18', '94054', '29024', '25'), +('4', '113', '18', '104412', '28821', '25'), +('4', '113', '19', '62904', '37415', '25'), +('4', '113', '19', '62990', '31988', '25'), +('4', '113', '19', '56037', '30692', '25'), +('4', '113', '19', '56075', '28758', '25'), +('4', '113', '13', '111815', '533872', '25'), +('4', '113', '13', '111871', '533780', '25'), +('4', '113', '13', '111515', '515261', '25'), +('4', '113', '13', '111512', '514175', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('4', '113', '14', '111815', '533872', '25'), +('4', '113', '14', '111871', '533780', '25'), +('4', '113', '14', '111515', '515261', '25'), +('4', '113', '14', '111512', '514175', '25'), +('4', '113', '11', '111529', '563021', '25'), +('4', '113', '11', '111229', '539887', '25'), +('4', '113', '11', '106769', '472972', '25'), +('4', '113', '11', '62939', '460209', '25'), +('4', '114', '22', '7867', '0', '25'), +('4', '114', '22', '39342', '0', '25'), +('4', '114', '22', '23597', '0', '25'), +('4', '114', '22', '66166', '0', '25'), +('4', '114', '1', '98769', '62615', '25'), +('4', '114', '1', '111300', '44860', '25'), +('4', '114', '1', '111302', '44688', '25'), +('4', '114', '1', '111305', '44289', '25'), +('4', '114', '2', '94056', '31608', '25'), +('4', '114', '2', '62985', '30168', '25'), +('4', '114', '2', '80524', '29336', '25'), +('4', '114', '2', '104410', '24723', '25'), +('4', '114', '3', '111315', '44848', '25'), +('4', '114', '3', '111313', '44348', '25'), +('4', '114', '3', '111316', '43251', '25'), +('4', '114', '3', '111014', '40542', '25'), +('4', '114', '5', '111317', '44723', '25'), +('4', '114', '5', '111318', '44034', '25'), +('4', '114', '5', '111320', '42637', '25'), +('4', '114', '5', '111319', '42350', '25'), +('4', '114', '8', '111331', '45184', '25'), +('4', '114', '8', '111332', '44398', '25'), +('4', '114', '8', '111328', '43812', '25'), +('4', '114', '8', '111030', '40908', '25'), +('4', '114', '6', '111324', '44324', '25'), +('4', '114', '6', '111322', '44141', '25'), +('4', '114', '6', '106812', '44105', '25'), +('4', '114', '6', '111326', '42801', '25'), +('4', '114', '17', '56046', '32641', '25'), +('4', '114', '17', '56083', '30907', '25'), +('4', '114', '17', '81765', '29803', '25'), +('4', '114', '17', '104413', '26945', '25'), +('4', '114', '7', '94053', '32694', '25'), +('4', '114', '7', '56079', '30092', '25'), +('4', '114', '7', '104411', '29033', '25'), +('4', '114', '7', '80525', '21499', '25'), +('4', '114', '9', '67098', '41020', '25'), +('4', '114', '9', '56033', '30750', '25'), +('4', '114', '9', '56031', '30642', '25'), +('4', '114', '9', '56070', '30506', '25'), +('4', '114', '15', '111342', '45703', '25'), +('4', '114', '15', '111348', '45550', '25'), +('4', '114', '15', '111343', '45175', '25'), +('4', '114', '15', '111345', '43616', '25'), +('4', '114', '20', '111354', '54356', '25'), +('4', '114', '20', '111352', '53842', '25'), +('4', '114', '20', '111355', '53430', '25'), +('4', '114', '20', '111351', '51736', '25'), +('4', '114', '12', '56073', '29841', '25'), +('4', '114', '12', '81795', '28928', '25'), +('4', '114', '12', '104408', '26473', '25'), +('4', '114', '12', '53385', '24855', '25'), +('4', '114', '18', '62986', '30679', '25'), +('4', '114', '18', '56041', '30207', '25'), +('4', '114', '18', '94054', '29024', '25'), +('4', '114', '18', '104412', '28822', '25'), +('4', '114', '19', '62904', '37416', '25'), +('4', '114', '19', '62990', '31988', '25'), +('4', '114', '19', '56037', '30693', '25'), +('4', '114', '19', '56075', '28759', '25'), +('4', '114', '13', '111815', '535073', '25'), +('4', '114', '13', '111871', '535041', '25'), +('4', '114', '13', '111515', '516462', '25'), +('4', '114', '13', '111512', '515376', '25'), +('4', '114', '14', '111815', '535073', '25'), +('4', '114', '14', '111871', '535041', '25'), +('4', '114', '14', '111515', '516462', '25'), +('4', '114', '14', '111512', '515376', '25'), +('4', '114', '11', '111529', '563922', '25'), +('4', '114', '11', '111229', '540788', '25'), +('4', '114', '11', '106769', '473753', '25'), +('4', '114', '11', '62939', '460990', '25'), +('4', '115', '22', '7867', '0', '26'), +('4', '115', '22', '39342', '0', '26'), +('4', '115', '22', '23597', '0', '26'), +('4', '115', '22', '66166', '0', '26'), +('4', '115', '1', '98769', '62616', '26'), +('4', '115', '1', '111300', '44860', '26'), +('4', '115', '1', '111302', '44689', '26'), +('4', '115', '1', '111305', '44290', '26'), +('4', '115', '2', '94056', '31609', '26'), +('4', '115', '2', '62985', '30169', '26'), +('4', '115', '2', '80524', '29337', '26'), +('4', '115', '2', '104410', '24724', '26'), +('4', '115', '3', '111315', '44849', '26'), +('4', '115', '3', '111313', '44349', '26'), +('4', '115', '3', '111316', '43252', '26'), +('4', '115', '3', '111014', '40543', '26'), +('4', '115', '5', '111317', '44724', '26'), +('4', '115', '5', '111318', '44035', '26'), +('4', '115', '5', '111320', '42638', '26'), +('4', '115', '5', '111319', '42351', '26'), +('4', '115', '8', '111331', '45185', '26'), +('4', '115', '8', '111332', '44399', '26'), +('4', '115', '8', '111328', '43812', '26'), +('4', '115', '8', '111030', '40909', '26'), +('4', '115', '6', '111324', '44324', '26'), +('4', '115', '6', '111322', '44142', '26'), +('4', '115', '6', '106812', '44105', '26'), +('4', '115', '6', '111326', '42802', '26'), +('4', '115', '17', '56046', '32642', '26'), +('4', '115', '17', '56083', '30907', '26'), +('4', '115', '17', '81765', '29804', '26'), +('4', '115', '17', '104413', '26946', '26'), +('4', '115', '7', '94053', '32694', '26'), +('4', '115', '7', '56079', '30093', '26'), +('4', '115', '7', '104411', '29034', '26'), +('4', '115', '7', '80525', '21500', '26'), +('4', '115', '9', '67098', '41021', '26'), +('4', '115', '9', '56033', '30751', '26'), +('4', '115', '9', '56031', '30642', '26'), +('4', '115', '9', '56070', '30507', '26'), +('4', '115', '15', '111342', '45704', '26'), +('4', '115', '15', '111348', '45551', '26'), +('4', '115', '15', '111343', '45176', '26'), +('4', '115', '15', '111345', '43616', '26'), +('4', '115', '20', '111354', '54357', '26'), +('4', '115', '20', '111352', '53843', '26'), +('4', '115', '20', '111355', '53431', '26'), +('4', '115', '20', '111351', '51737', '26'), +('4', '115', '12', '56073', '29842', '26'), +('4', '115', '12', '81795', '28929', '26'), +('4', '115', '12', '104408', '26474', '26'), +('4', '115', '12', '53385', '24855', '26'), +('4', '115', '18', '62986', '30680', '26'), +('4', '115', '18', '56041', '30208', '26'), +('4', '115', '18', '94054', '29025', '26'), +('4', '115', '18', '104412', '28822', '26'), +('4', '115', '19', '62904', '37418', '26'), +('4', '115', '19', '62990', '31989', '26'), +('4', '115', '19', '56037', '30694', '26'), +('4', '115', '19', '56075', '28760', '26'), +('4', '115', '13', '111815', '536333', '26'), +('4', '115', '13', '111871', '536242', '26'), +('4', '115', '13', '111515', '517663', '26'), +('4', '115', '13', '111512', '516577', '26'), +('4', '115', '14', '111815', '536333', '26'), +('4', '115', '14', '111871', '536242', '26'), +('4', '115', '14', '111515', '517663', '26'), +('4', '115', '14', '111512', '516577', '26'), +('4', '115', '11', '111529', '564883', '26'), +('4', '115', '11', '111229', '541689', '26'), +('4', '115', '11', '106769', '474534', '26'), +('4', '115', '11', '62939', '461710', '26'), +('5', '1', '22', '8567', '0', '0'), +('5', '1', '22', '10323', '0', '0'), +('5', '1', '22', '8504', '0', '0'), +('5', '1', '22', '9246', '0', '0'), +('5', '1', '1', '14701', '4854', '0'), +('5', '1', '1', '14702', '3550', '0'), +('5', '1', '1', '10082', '2434', '0'), +('5', '1', '1', '10165', '1940', '0'), +('5', '1', '2', '4841', '8967', '0'), +('5', '1', '2', '4301', '7726', '0'), +('5', '1', '2', '4831', '6058', '0'), +('5', '1', '2', '10142', '4824', '0'), +('5', '1', '3', '4322', '5343', '0'), +('5', '1', '3', '1544', '4489', '0'), +('5', '1', '3', '21002', '2114', '0'), +('5', '1', '3', '21014', '2114', '0'), +('5', '1', '5', '14703', '7150', '0'), +('5', '1', '5', '27705', '5648', '0'), +('5', '1', '5', '14700', '4806', '0'), +('5', '1', '5', '10055', '4760', '0'), +('5', '1', '8', '11621', '26579', '0'), +('5', '1', '8', '11551', '8753', '0'), +('5', '1', '8', '1409', '7747', '0'), +('5', '1', '8', '11603', '6053', '0'), +('5', '1', '6', '1557', '8270', '0'), +('5', '1', '6', '11699', '5118', '0'), +('5', '1', '6', '25062', '3672', '0'), +('5', '1', '6', '4302', '3347', '0'), +('5', '1', '17', '4832', '11404', '0'), +('5', '1', '17', '4842', '9741', '0'), +('5', '1', '17', '4309', '8225', '0'), +('5', '1', '17', '11623', '7848', '0'), +('5', '1', '7', '4833', '6478', '0'), +('5', '1', '7', '4843', '5389', '0'), +('5', '1', '7', '4343', '3703', '0'), +('5', '1', '7', '1361', '3624', '0'), +('5', '1', '9', '4834', '4408', '0'), +('5', '1', '9', '12189', '3471', '0'), +('5', '1', '9', '4844', '3061', '0'), +('5', '1', '9', '4344', '3046', '0'), +('5', '1', '15', '10366', '8054', '0'), +('5', '1', '15', '10151', '7200', '0'), +('5', '1', '15', '14679', '7010', '0'), +('5', '1', '15', '14678', '5708', '0'), +('5', '1', '20', '2704', '23246', '0'), +('5', '1', '20', '11601', '17566', '0'), +('5', '1', '20', '2918', '10811', '0'), +('5', '1', '20', '1365', '10500', '0'), +('5', '1', '12', '4835', '9883', '0'), +('5', '1', '12', '20655', '7862', '0'), +('5', '1', '12', '4845', '5521', '0'), +('5', '1', '12', '2923', '4758', '0'), +('5', '1', '18', '4836', '6318', '0'), +('5', '1', '18', '4846', '5554', '0'), +('5', '1', '18', '4346', '4645', '0'), +('5', '1', '18', '3145', '4054', '0'), +('5', '1', '19', '4837', '6988', '0'), +('5', '1', '19', '4847', '5772', '0'), +('5', '1', '19', '68239', '5221', '0'), +('5', '1', '19', '3146', '3335', '0'), +('5', '1', '13', '5401', '19848', '0'), +('5', '1', '13', '27707', '19704', '0'), +('5', '1', '13', '5622', '16025', '0'), +('5', '1', '13', '11609', '15668', '0'), +('5', '1', '14', '11678', '32840', '0'), +('5', '1', '14', '9402', '32671', '0'), +('5', '1', '14', '11632', '27713', '0'), +('5', '1', '14', '11551', '23853', '0'), +('5', '1', '11', '8408', '6861', '0'), +('5', '1', '11', '8325', '6668', '0'), +('5', '1', '11', '8811', '5213', '0'), +('5', '1', '11', '8810', '4798', '0'), +('5', '2', '22', '8567', '0', '0'), +('5', '2', '22', '10323', '0', '0'), +('5', '2', '22', '8504', '0', '0'), +('5', '2', '22', '9246', '0', '0'), +('5', '2', '1', '14701', '4854', '0'), +('5', '2', '1', '14702', '3550', '0'), +('5', '2', '1', '10082', '2455', '0'), +('5', '2', '1', '10165', '1940', '0'), +('5', '2', '2', '4841', '8999', '0'), +('5', '2', '2', '4301', '7726', '0'), +('5', '2', '2', '4831', '6076', '0'), +('5', '2', '2', '10142', '4824', '0'), +('5', '2', '3', '4322', '5343', '0'), +('5', '2', '3', '1544', '4507', '0'), +('5', '2', '3', '21002', '2114', '0'), +('5', '2', '3', '21014', '2114', '0'), +('5', '2', '5', '14703', '7150', '0'), +('5', '2', '5', '27705', '5699', '0'), +('5', '2', '5', '14700', '4806', '0'), +('5', '2', '5', '10055', '4760', '0'), +('5', '2', '8', '11621', '26579', '0'), +('5', '2', '8', '11551', '8753', '0'), +('5', '2', '8', '1409', '7747', '0'), +('5', '2', '8', '11603', '6085', '0'), +('5', '2', '6', '1557', '8270', '0'), +('5', '2', '6', '11699', '5172', '0'), +('5', '2', '6', '25062', '3672', '0'), +('5', '2', '6', '4302', '3373', '0'), +('5', '2', '17', '4832', '11467', '0'), +('5', '2', '17', '4842', '9779', '0'), +('5', '2', '17', '4309', '8225', '0'), +('5', '2', '17', '11623', '7848', '0'), +('5', '2', '7', '4833', '6478', '0'), +('5', '2', '7', '4843', '5389', '0'), +('5', '2', '7', '4343', '3745', '0'), +('5', '2', '7', '1361', '3624', '0'), +('5', '2', '9', '4834', '4408', '0'), +('5', '2', '9', '12189', '3471', '0'), +('5', '2', '9', '4844', '3072', '0'), +('5', '2', '9', '4344', '3046', '0'), +('5', '2', '15', '10366', '8054', '0'), +('5', '2', '15', '10151', '7200', '0'), +('5', '2', '15', '14679', '7010', '0'), +('5', '2', '15', '14678', '5708', '0'), +('5', '2', '20', '2704', '23268', '0'), +('5', '2', '20', '11601', '17608', '0'), +('5', '2', '20', '2918', '10829', '0'), +('5', '2', '20', '1365', '10500', '0'), +('5', '2', '12', '4835', '9904', '0'), +('5', '2', '12', '20655', '7878', '0'), +('5', '2', '12', '4845', '5539', '0'), +('5', '2', '12', '2923', '4758', '0'), +('5', '2', '18', '4836', '6339', '0'), +('5', '2', '18', '4846', '5554', '0'), +('5', '2', '18', '4346', '4645', '0'), +('5', '2', '18', '3145', '4092', '0'), +('5', '2', '19', '4837', '7006', '0'), +('5', '2', '19', '4847', '5793', '0'), +('5', '2', '19', '68239', '5232', '0'), +('5', '2', '19', '3146', '3347', '0'), +('5', '2', '13', '5401', '19848', '0'), +('5', '2', '13', '27707', '19717', '0'), +('5', '2', '13', '5622', '16025', '0'), +('5', '2', '13', '11609', '15668', '0'), +('5', '2', '14', '11678', '32840', '0'), +('5', '2', '14', '9402', '32692', '0'), +('5', '2', '14', '11632', '27777', '0'), +('5', '2', '14', '11551', '23853', '0'), +('5', '2', '11', '8408', '6861', '0'), +('5', '2', '11', '8325', '6668', '0'), +('5', '2', '11', '8811', '5213', '0'), +('5', '2', '11', '8810', '4798', '0'), +('5', '3', '22', '8567', '0', '0'), +('5', '3', '22', '10323', '0', '0'), +('5', '3', '22', '8504', '0', '0'), +('5', '3', '22', '9246', '0', '0'), +('5', '3', '1', '14701', '4854', '0'), +('5', '3', '1', '14702', '3550', '0'), +('5', '3', '1', '10082', '2477', '0'), +('5', '3', '1', '10165', '1940', '0'), +('5', '3', '2', '4841', '9032', '0'), +('5', '3', '2', '4301', '7726', '0'), +('5', '3', '2', '4831', '6094', '0'), +('5', '3', '2', '10142', '4824', '0'), +('5', '3', '3', '4322', '5343', '0'), +('5', '3', '3', '1544', '4525', '0'), +('5', '3', '3', '21002', '2114', '0'), +('5', '3', '3', '21014', '2114', '0'), +('5', '3', '5', '14703', '7150', '0'), +('5', '3', '5', '27705', '5749', '0'), +('5', '3', '5', '14700', '4806', '0'), +('5', '3', '5', '10055', '4760', '0'), +('5', '3', '8', '11621', '26579', '0'), +('5', '3', '8', '11551', '8753', '0'), +('5', '3', '8', '1409', '7747', '0'), +('5', '3', '8', '11603', '6118', '0'), +('5', '3', '6', '1557', '8270', '0'), +('5', '3', '6', '11699', '5227', '0'), +('5', '3', '6', '25062', '3672', '0'), +('5', '3', '6', '4302', '3398', '0'), +('5', '3', '17', '4832', '11530', '0'), +('5', '3', '17', '4842', '9817', '0'), +('5', '3', '17', '4309', '8225', '0'), +('5', '3', '17', '11623', '7848', '0'), +('5', '3', '7', '4833', '6478', '0'), +('5', '3', '7', '4843', '5389', '0'), +('5', '3', '7', '4343', '3787', '0'), +('5', '3', '7', '1361', '3624', '0'), +('5', '3', '9', '4834', '4408', '0'), +('5', '3', '9', '12189', '3471', '0'), +('5', '3', '9', '4844', '3083', '0'), +('5', '3', '9', '4344', '3046', '0'), +('5', '3', '15', '10366', '8054', '0'), +('5', '3', '15', '10151', '7200', '0'), +('5', '3', '15', '14679', '7010', '0'), +('5', '3', '15', '14678', '5708', '0'), +('5', '3', '20', '2704', '23289', '0'), +('5', '3', '20', '11601', '17650', '0'), +('5', '3', '20', '2918', '10847', '0'), +('5', '3', '20', '1365', '10500', '0'), +('5', '3', '12', '4835', '9926', '0'), +('5', '3', '12', '20655', '7894', '0'), +('5', '3', '12', '4845', '5557', '0'), +('5', '3', '12', '2923', '4758', '0'), +('5', '3', '18', '4836', '6360', '0'), +('5', '3', '18', '4846', '5554', '0'), +('5', '3', '18', '4346', '4645', '0'), +('5', '3', '18', '3145', '4130', '0'), +('5', '3', '19', '4837', '7025', '0'), +('5', '3', '19', '4847', '5814', '0'), +('5', '3', '19', '68239', '5243', '0'), +('5', '3', '19', '3146', '3360', '0'), +('5', '3', '13', '5401', '19848', '0'), +('5', '3', '13', '27707', '19730', '0'), +('5', '3', '13', '5622', '16025', '0'), +('5', '3', '13', '11609', '15668', '0'), +('5', '3', '14', '11678', '32840', '0'), +('5', '3', '14', '9402', '32713', '0'), +('5', '3', '14', '11632', '27840', '0'), +('5', '3', '14', '11551', '23853', '0'), +('5', '3', '11', '8408', '6861', '0'), +('5', '3', '11', '8325', '6668', '0'), +('5', '3', '11', '8811', '5213', '0'), +('5', '3', '11', '8810', '4798', '0'), +('5', '4', '22', '8567', '0', '0'), +('5', '4', '22', '10323', '0', '0'), +('5', '4', '22', '8504', '0', '0'), +('5', '4', '22', '9246', '0', '0'), +('5', '4', '1', '14701', '4854', '0'), +('5', '4', '1', '14702', '3550', '0'), +('5', '4', '1', '10082', '2499', '0'), +('5', '4', '1', '10165', '1940', '0'), +('5', '4', '2', '4841', '9064', '0'), +('5', '4', '2', '4301', '7726', '0'), +('5', '4', '2', '4831', '6112', '0'), +('5', '4', '2', '10142', '4824', '0'), +('5', '4', '3', '4322', '5343', '0'), +('5', '4', '3', '1544', '4543', '0'), +('5', '4', '3', '21002', '2114', '0'), +('5', '4', '3', '21014', '2114', '0'), +('5', '4', '5', '14703', '7150', '0'), +('5', '4', '5', '27705', '5800', '0'), +('5', '4', '5', '14700', '4806', '0'), +('5', '4', '5', '10055', '4760', '0'), +('5', '4', '8', '11621', '26579', '0'), +('5', '4', '8', '11551', '8753', '0'), +('5', '4', '8', '1409', '7747', '0'), +('5', '4', '8', '11603', '6150', '0'), +('5', '4', '6', '1557', '8270', '0'), +('5', '4', '6', '11699', '5281', '0'), +('5', '4', '6', '25062', '3672', '0'), +('5', '4', '6', '4302', '3423', '0'), +('5', '4', '17', '4832', '11594', '0'), +('5', '4', '17', '4842', '9855', '0'), +('5', '4', '17', '4309', '8225', '0'), +('5', '4', '17', '11623', '7848', '0'), +('5', '4', '7', '4833', '6478', '0'), +('5', '4', '7', '4843', '5389', '0'), +('5', '4', '7', '4343', '3829', '0'), +('5', '4', '7', '1361', '3624', '0'), +('5', '4', '9', '4834', '4408', '0'), +('5', '4', '9', '12189', '3471', '0'), +('5', '4', '9', '4844', '3094', '0'), +('5', '4', '9', '4344', '3046', '0'), +('5', '4', '15', '10366', '8054', '0'), +('5', '4', '15', '10151', '7200', '0'), +('5', '4', '15', '14679', '7010', '0'), +('5', '4', '15', '14678', '5708', '0'), +('5', '4', '20', '2704', '23311', '0'), +('5', '4', '20', '11601', '17693', '0'), +('5', '4', '20', '2918', '10865', '0'), +('5', '4', '20', '1365', '10500', '0'), +('5', '4', '12', '4835', '9947', '0'), +('5', '4', '12', '20655', '7910', '0'), +('5', '4', '12', '4845', '5575', '0'), +('5', '4', '12', '2923', '4758', '0'), +('5', '4', '18', '4836', '6381', '0'), +('5', '4', '18', '4846', '5554', '0'), +('5', '4', '18', '4346', '4645', '0'), +('5', '4', '18', '3145', '4168', '0'), +('5', '4', '19', '4837', '7043', '0'), +('5', '4', '19', '4847', '5835', '0'), +('5', '4', '19', '68239', '5254', '0'), +('5', '4', '19', '3146', '3373', '0'), +('5', '4', '13', '5401', '19848', '0'), +('5', '4', '13', '27707', '19742', '0'), +('5', '4', '13', '5622', '16025', '0'), +('5', '4', '13', '11609', '15668', '0'), +('5', '4', '14', '11678', '32840', '0'), +('5', '4', '14', '9402', '32735', '0'), +('5', '4', '14', '11632', '27904', '0'), +('5', '4', '14', '11551', '23853', '0'), +('5', '4', '11', '8408', '6861', '0'), +('5', '4', '11', '8325', '6668', '0'), +('5', '4', '11', '8811', '5213', '0'), +('5', '4', '11', '8810', '4798', '0'), +('5', '5', '22', '8567', '0', '0'), +('5', '5', '22', '10323', '0', '0'), +('5', '5', '22', '8504', '0', '0'), +('5', '5', '22', '9246', '0', '0'), +('5', '5', '1', '14701', '4854', '0'), +('5', '5', '1', '14702', '3550', '0'), +('5', '5', '1', '10082', '2521', '0'), +('5', '5', '1', '10165', '1940', '0'), +('5', '5', '2', '4841', '9097', '0'), +('5', '5', '2', '4301', '7726', '0'), +('5', '5', '2', '4831', '6131', '0'), +('5', '5', '2', '10142', '4824', '0'), +('5', '5', '3', '4322', '5343', '0'), +('5', '5', '3', '1544', '4561', '0'), +('5', '5', '3', '21002', '2114', '0'), +('5', '5', '3', '21014', '2114', '0'), +('5', '5', '5', '14703', '7150', '0'), +('5', '5', '5', '27705', '5851', '0'), +('5', '5', '5', '14700', '4806', '0'), +('5', '5', '5', '10055', '4760', '0'), +('5', '5', '8', '11621', '26579', '0'), +('5', '5', '8', '11551', '8753', '0'), +('5', '5', '8', '1409', '7747', '0'), +('5', '5', '8', '11603', '6183', '0'), +('5', '5', '6', '1557', '8270', '0'), +('5', '5', '6', '11699', '5335', '0'), +('5', '5', '6', '25062', '3672', '0'), +('5', '5', '6', '4302', '3452', '0'), +('5', '5', '17', '4832', '11666', '0'), +('5', '5', '17', '4842', '9899', '0'), +('5', '5', '17', '4309', '8225', '0'), +('5', '5', '17', '11623', '7848', '0'), +('5', '5', '7', '4833', '6478', '0'), +('5', '5', '7', '4843', '5389', '0'), +('5', '5', '7', '4343', '3878', '0'), +('5', '5', '7', '1361', '3624', '0'), +('5', '5', '9', '4834', '4408', '0'), +('5', '5', '9', '12189', '3471', '0'), +('5', '5', '9', '4844', '3105', '0'), +('5', '5', '9', '4344', '3046', '0'), +('5', '5', '15', '10366', '8054', '0'), +('5', '5', '15', '10151', '7200', '0'), +('5', '5', '15', '14679', '7010', '0'), +('5', '5', '15', '14678', '5708', '0'), +('5', '5', '20', '2704', '23333', '0'), +('5', '5', '20', '11601', '17741', '0'), +('5', '5', '20', '2918', '10883', '0'), +('5', '5', '20', '1365', '10500', '0'), +('5', '5', '12', '4835', '9971', '0'), +('5', '5', '12', '20655', '7926', '0'), +('5', '5', '12', '4845', '5593', '0'), +('5', '5', '12', '2923', '4758', '0'), +('5', '5', '18', '4836', '6405', '0'), +('5', '5', '18', '4846', '5554', '0'), +('5', '5', '18', '4346', '4645', '0'), +('5', '5', '18', '3145', '4212', '0'), +('5', '5', '19', '4837', '7061', '0'), +('5', '5', '19', '4847', '5859', '0'), +('5', '5', '19', '68239', '5265', '0'), +('5', '5', '19', '3146', '3387', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '5', '13', '5401', '19848', '0'), +('5', '5', '13', '27707', '19755', '0'), +('5', '5', '13', '5622', '16025', '0'), +('5', '5', '13', '11609', '15668', '0'), +('5', '5', '14', '11678', '32840', '0'), +('5', '5', '14', '9402', '32759', '0'), +('5', '5', '14', '11632', '27976', '0'), +('5', '5', '14', '11551', '23853', '0'), +('5', '5', '11', '8408', '6861', '0'), +('5', '5', '11', '8325', '6668', '0'), +('5', '5', '11', '8811', '5213', '0'), +('5', '5', '11', '8810', '4798', '0'), +('5', '6', '22', '8567', '0', '0'), +('5', '6', '22', '10323', '0', '0'), +('5', '6', '22', '8504', '0', '0'), +('5', '6', '22', '9246', '0', '0'), +('5', '6', '1', '14701', '4854', '0'), +('5', '6', '1', '14702', '3550', '0'), +('5', '6', '1', '10082', '2542', '0'), +('5', '6', '1', '10165', '1940', '0'), +('5', '6', '2', '4841', '9130', '0'), +('5', '6', '2', '4301', '7726', '0'), +('5', '6', '2', '4831', '6149', '0'), +('5', '6', '2', '10142', '4824', '0'), +('5', '6', '3', '4322', '5343', '0'), +('5', '6', '3', '1544', '4579', '0'), +('5', '6', '3', '71529', '2161', '0'), +('5', '6', '3', '21002', '2114', '0'), +('5', '6', '5', '14703', '7150', '0'), +('5', '6', '5', '27705', '5902', '0'), +('5', '6', '5', '14700', '4806', '0'), +('5', '6', '5', '10055', '4760', '0'), +('5', '6', '8', '11621', '26579', '0'), +('5', '6', '8', '11551', '8753', '0'), +('5', '6', '8', '1409', '7747', '0'), +('5', '6', '8', '11603', '6216', '0'), +('5', '6', '6', '1557', '8270', '0'), +('5', '6', '6', '11699', '5390', '0'), +('5', '6', '6', '25062', '3672', '0'), +('5', '6', '6', '4302', '3478', '0'), +('5', '6', '17', '4832', '11730', '0'), +('5', '6', '17', '4842', '9937', '0'), +('5', '6', '17', '4309', '8225', '0'), +('5', '6', '17', '11623', '7848', '0'), +('5', '6', '7', '4833', '6478', '0'), +('5', '6', '7', '4843', '5389', '0'), +('5', '6', '7', '4343', '3920', '0'), +('5', '6', '7', '1361', '3624', '0'), +('5', '6', '9', '4834', '4408', '0'), +('5', '6', '9', '12189', '3471', '0'), +('5', '6', '9', '4844', '3115', '0'), +('5', '6', '9', '4344', '3046', '0'), +('5', '6', '15', '10366', '8054', '0'), +('5', '6', '15', '10151', '7200', '0'), +('5', '6', '15', '14679', '7010', '0'), +('5', '6', '15', '14678', '5708', '0'), +('5', '6', '20', '2704', '23355', '0'), +('5', '6', '20', '11601', '17783', '0'), +('5', '6', '20', '2918', '10901', '0'), +('5', '6', '20', '1365', '10500', '0'), +('5', '6', '12', '4835', '9992', '0'), +('5', '6', '12', '20655', '7942', '0'), +('5', '6', '12', '4845', '5611', '0'), +('5', '6', '12', '2923', '4758', '0'), +('5', '6', '18', '4836', '6427', '0'), +('5', '6', '18', '4846', '5554', '0'), +('5', '6', '18', '4346', '4645', '0'), +('5', '6', '18', '3145', '4250', '0'), +('5', '6', '19', '4837', '7079', '0'), +('5', '6', '19', '4847', '5880', '0'), +('5', '6', '19', '68239', '5275', '0'), +('5', '6', '19', '3146', '3400', '0'), +('5', '6', '13', '5401', '19848', '0'), +('5', '6', '13', '27707', '19768', '0'), +('5', '6', '13', '5622', '16025', '0'), +('5', '6', '13', '11609', '15668', '0'), +('5', '6', '14', '11678', '32840', '0'), +('5', '6', '14', '9402', '32780', '0'), +('5', '6', '14', '11632', '28040', '0'), +('5', '6', '14', '11551', '23853', '0'), +('5', '6', '11', '8408', '6861', '0'), +('5', '6', '11', '8325', '6668', '0'), +('5', '6', '11', '8811', '5213', '0'), +('5', '6', '11', '8810', '4798', '0'), +('5', '7', '22', '8567', '0', '0'), +('5', '7', '22', '10323', '0', '0'), +('5', '7', '22', '8504', '0', '0'), +('5', '7', '22', '9246', '0', '0'), +('5', '7', '1', '14701', '4854', '0'), +('5', '7', '1', '14702', '3550', '0'), +('5', '7', '1', '10082', '2564', '0'), +('5', '7', '1', '10165', '1940', '0'), +('5', '7', '2', '4841', '9162', '0'), +('5', '7', '2', '4301', '7726', '0'), +('5', '7', '2', '4831', '6167', '0'), +('5', '7', '2', '10142', '4824', '0'), +('5', '7', '3', '4322', '5343', '0'), +('5', '7', '3', '1544', '4598', '0'), +('5', '7', '3', '71529', '2533', '0'), +('5', '7', '3', '21002', '2114', '0'), +('5', '7', '5', '14703', '7150', '0'), +('5', '7', '5', '27705', '5952', '0'), +('5', '7', '5', '14700', '4806', '0'), +('5', '7', '5', '10055', '4760', '0'), +('5', '7', '8', '11621', '26579', '0'), +('5', '7', '8', '11551', '8753', '0'), +('5', '7', '8', '1409', '7747', '0'), +('5', '7', '8', '11603', '6248', '0'), +('5', '7', '6', '1557', '8270', '0'), +('5', '7', '6', '11699', '5444', '0'), +('5', '7', '6', '25062', '3672', '0'), +('5', '7', '6', '4302', '3503', '0'), +('5', '7', '17', '4832', '11793', '0'), +('5', '7', '17', '4842', '9975', '0'), +('5', '7', '17', '4309', '8225', '0'), +('5', '7', '17', '11623', '7848', '0'), +('5', '7', '7', '4833', '6478', '0'), +('5', '7', '7', '4843', '5389', '0'), +('5', '7', '7', '4343', '3962', '0'), +('5', '7', '7', '1361', '3624', '0'), +('5', '7', '9', '4834', '4408', '0'), +('5', '7', '9', '12189', '3471', '0'), +('5', '7', '9', '4844', '3126', '0'), +('5', '7', '9', '4344', '3046', '0'), +('5', '7', '15', '10366', '8054', '0'), +('5', '7', '15', '10151', '7200', '0'), +('5', '7', '15', '14679', '7010', '0'), +('5', '7', '15', '14678', '5708', '0'), +('5', '7', '20', '2704', '23376', '0'), +('5', '7', '20', '11601', '17825', '0'), +('5', '7', '20', '2918', '10919', '0'), +('5', '7', '20', '1365', '10500', '0'), +('5', '7', '12', '4835', '10013', '0'), +('5', '7', '12', '20655', '7958', '0'), +('5', '7', '12', '4845', '5629', '0'), +('5', '7', '12', '2923', '4758', '0'), +('5', '7', '18', '4836', '6448', '0'), +('5', '7', '18', '4846', '5554', '0'), +('5', '7', '18', '4346', '4645', '0'), +('5', '7', '18', '3145', '4288', '0'), +('5', '7', '19', '4837', '7097', '0'), +('5', '7', '19', '4847', '5902', '0'), +('5', '7', '19', '68239', '5286', '0'), +('5', '7', '19', '3146', '3413', '0'), +('5', '7', '13', '5401', '19848', '0'), +('5', '7', '13', '27707', '19780', '0'), +('5', '7', '13', '5622', '16025', '0'), +('5', '7', '13', '11609', '15668', '0'), +('5', '7', '14', '11678', '32840', '0'), +('5', '7', '14', '9402', '32801', '0'), +('5', '7', '14', '11632', '28103', '0'), +('5', '7', '14', '11551', '23853', '0'), +('5', '7', '11', '8408', '6861', '0'), +('5', '7', '11', '8325', '6668', '0'), +('5', '7', '11', '8811', '5213', '0'), +('5', '7', '11', '8810', '4798', '0'), +('5', '8', '22', '8567', '0', '0'), +('5', '8', '22', '10323', '0', '0'), +('5', '8', '22', '8504', '0', '0'), +('5', '8', '22', '9246', '0', '0'), +('5', '8', '1', '14701', '4854', '0'), +('5', '8', '1', '14702', '3550', '0'), +('5', '8', '1', '10082', '2586', '0'), +('5', '8', '1', '10165', '1940', '0'), +('5', '8', '2', '4841', '9195', '0'), +('5', '8', '2', '4301', '7726', '0'), +('5', '8', '2', '4831', '6185', '0'), +('5', '8', '2', '10142', '4824', '0'), +('5', '8', '3', '4322', '5343', '0'), +('5', '8', '3', '1544', '4616', '0'), +('5', '8', '3', '71529', '2911', '0'), +('5', '8', '3', '21002', '2114', '0'), +('5', '8', '5', '14703', '7150', '0'), +('5', '8', '5', '27705', '6003', '0'), +('5', '8', '5', '14700', '4806', '0'), +('5', '8', '5', '10055', '4760', '0'), +('5', '8', '8', '11621', '26579', '0'), +('5', '8', '8', '11551', '8753', '0'), +('5', '8', '8', '1409', '7747', '0'), +('5', '8', '8', '11603', '6281', '0'), +('5', '8', '6', '1557', '8270', '0'), +('5', '8', '6', '11699', '5498', '0'), +('5', '8', '6', '25062', '3672', '0'), +('5', '8', '6', '4302', '3532', '0'), +('5', '8', '17', '4832', '11866', '0'), +('5', '8', '17', '4842', '10019', '0'), +('5', '8', '17', '4309', '8225', '0'), +('5', '8', '17', '11623', '7848', '0'), +('5', '8', '7', '4833', '6478', '0'), +('5', '8', '7', '4843', '5389', '0'), +('5', '8', '7', '4343', '4011', '0'), +('5', '8', '7', '1361', '3624', '0'), +('5', '8', '9', '4834', '4408', '0'), +('5', '8', '9', '12189', '3471', '0'), +('5', '8', '9', '4844', '3137', '0'), +('5', '8', '9', '4344', '3046', '0'), +('5', '8', '15', '10366', '8054', '0'), +('5', '8', '15', '10151', '7200', '0'), +('5', '8', '15', '14679', '7010', '0'), +('5', '8', '15', '14678', '5708', '0'), +('5', '8', '20', '2704', '23398', '0'), +('5', '8', '20', '11601', '17874', '0'), +('5', '8', '20', '2918', '10937', '0'), +('5', '8', '20', '1365', '10500', '0'), +('5', '8', '12', '4835', '10037', '0'), +('5', '8', '12', '20655', '7975', '0'), +('5', '8', '12', '4845', '5647', '0'), +('5', '8', '12', '2923', '4758', '0'), +('5', '8', '18', '4836', '6472', '0'), +('5', '8', '18', '4846', '5554', '0'), +('5', '8', '18', '4346', '4645', '0'), +('5', '8', '18', '3145', '4331', '0'), +('5', '8', '19', '4837', '7115', '0'), +('5', '8', '19', '4847', '5926', '0'), +('5', '8', '19', '68239', '5297', '0'), +('5', '8', '19', '3146', '3427', '0'), +('5', '8', '13', '5401', '19848', '0'), +('5', '8', '13', '27707', '19793', '0'), +('5', '8', '13', '5622', '16025', '0'), +('5', '8', '13', '11609', '15668', '0'), +('5', '8', '14', '11678', '32840', '0'), +('5', '8', '14', '9402', '32825', '0'), +('5', '8', '14', '11632', '28175', '0'), +('5', '8', '14', '11551', '23853', '0'), +('5', '8', '11', '8408', '6861', '0'), +('5', '8', '11', '8325', '6668', '0'), +('5', '8', '11', '8811', '5213', '0'), +('5', '8', '11', '8810', '4798', '0'), +('5', '9', '22', '8567', '0', '0'), +('5', '9', '22', '10323', '0', '0'), +('5', '9', '22', '8504', '0', '0'), +('5', '9', '22', '9246', '0', '0'), +('5', '9', '1', '14701', '4854', '0'), +('5', '9', '1', '14702', '3550', '0'), +('5', '9', '1', '10082', '2608', '0'), +('5', '9', '1', '10165', '1940', '0'), +('5', '9', '2', '4841', '9228', '0'), +('5', '9', '2', '4301', '7726', '0'), +('5', '9', '2', '4831', '6203', '0'), +('5', '9', '2', '3140', '4839', '0'), +('5', '9', '3', '4322', '5343', '0'), +('5', '9', '3', '1544', '4634', '0'), +('5', '9', '3', '71529', '3290', '0'), +('5', '9', '3', '21002', '2114', '0'), +('5', '9', '5', '14703', '7150', '0'), +('5', '9', '5', '27705', '6054', '0'), +('5', '9', '5', '14700', '4806', '0'), +('5', '9', '5', '10055', '4760', '0'), +('5', '9', '8', '11621', '26579', '0'), +('5', '9', '8', '11551', '8753', '0'), +('5', '9', '8', '1409', '7747', '0'), +('5', '9', '8', '11603', '6314', '0'), +('5', '9', '6', '1557', '8270', '0'), +('5', '9', '6', '11699', '5553', '0'), +('5', '9', '6', '25062', '3672', '0'), +('5', '9', '6', '4302', '3558', '0'), +('5', '9', '17', '4832', '11929', '0'), +('5', '9', '17', '4842', '10057', '0'), +('5', '9', '17', '4309', '8225', '0'), +('5', '9', '17', '11623', '7848', '0'), +('5', '9', '7', '4833', '6478', '0'), +('5', '9', '7', '4843', '5389', '0'), +('5', '9', '7', '4343', '4053', '0'), +('5', '9', '7', '1361', '3624', '0'), +('5', '9', '9', '4834', '4408', '0'), +('5', '9', '9', '12189', '3471', '0'), +('5', '9', '9', '4844', '3148', '0'), +('5', '9', '9', '4344', '3046', '0'), +('5', '9', '15', '10366', '8054', '0'), +('5', '9', '15', '10151', '7200', '0'), +('5', '9', '15', '14679', '7010', '0'), +('5', '9', '15', '14678', '5708', '0'), +('5', '9', '20', '2704', '23420', '0'), +('5', '9', '20', '11601', '17916', '0'), +('5', '9', '20', '2918', '10956', '0'), +('5', '9', '20', '1365', '10500', '0'), +('5', '9', '12', '4835', '10059', '0'), +('5', '9', '12', '20655', '7991', '0'), +('5', '9', '12', '4845', '5666', '0'), +('5', '9', '12', '2923', '4758', '0'), +('5', '9', '18', '4836', '6493', '0'), +('5', '9', '18', '4846', '5554', '0'), +('5', '9', '18', '4346', '4645', '0'), +('5', '9', '18', '3145', '4369', '0'), +('5', '9', '19', '4837', '7133', '0'), +('5', '9', '19', '4847', '5947', '0'), +('5', '9', '19', '68239', '5308', '0'), +('5', '9', '19', '3146', '3440', '0'), +('5', '9', '13', '5401', '19848', '0'), +('5', '9', '13', '27707', '19806', '0'), +('5', '9', '13', '5622', '16025', '0'), +('5', '9', '13', '11609', '15668', '0'), +('5', '9', '14', '9402', '32846', '0'), +('5', '9', '14', '11678', '32840', '0'), +('5', '9', '14', '11632', '28239', '0'), +('5', '9', '14', '11551', '23853', '0'), +('5', '9', '11', '8408', '6861', '0'), +('5', '9', '11', '8325', '6668', '0'), +('5', '9', '11', '8811', '5213', '0'), +('5', '9', '11', '8810', '4798', '0'), +('5', '10', '22', '8567', '0', '0'), +('5', '10', '22', '10323', '0', '0'), +('5', '10', '22', '8504', '0', '0'), +('5', '10', '22', '9246', '0', '0'), +('5', '10', '1', '14701', '4854', '0'), +('5', '10', '1', '14702', '3550', '0'), +('5', '10', '1', '10082', '2629', '0'), +('5', '10', '1', '10165', '1940', '0'), +('5', '10', '2', '4841', '9260', '0'), +('5', '10', '2', '4301', '7726', '0'), +('5', '10', '2', '4831', '6221', '0'), +('5', '10', '2', '3140', '4857', '0'), +('5', '10', '3', '4322', '5343', '0'), +('5', '10', '3', '1544', '4652', '0'), +('5', '10', '3', '71529', '3675', '0'), +('5', '10', '3', '21002', '2114', '0'), +('5', '10', '5', '14703', '7150', '0'), +('5', '10', '5', '27705', '6104', '0'), +('5', '10', '5', '14700', '4806', '0'), +('5', '10', '5', '10055', '4760', '0'), +('5', '10', '8', '11621', '26579', '0'), +('5', '10', '8', '11551', '8753', '0'), +('5', '10', '8', '1409', '7747', '0'), +('5', '10', '8', '11603', '6346', '0'), +('5', '10', '6', '1557', '8270', '0'), +('5', '10', '6', '11699', '5607', '0'), +('5', '10', '6', '25062', '3672', '0'), +('5', '10', '6', '4302', '3587', '0'), +('5', '10', '17', '4832', '12001', '0'), +('5', '10', '17', '4842', '10100', '0'), +('5', '10', '17', '4309', '8225', '0'), +('5', '10', '17', '11623', '7848', '0'), +('5', '10', '7', '4833', '6478', '0'), +('5', '10', '7', '4843', '5389', '0'), +('5', '10', '7', '4343', '4101', '0'), +('5', '10', '7', '1361', '3624', '0'), +('5', '10', '9', '4834', '4408', '0'), +('5', '10', '9', '12189', '3471', '0'), +('5', '10', '9', '4844', '3159', '0'), +('5', '10', '9', '4344', '3046', '0'), +('5', '10', '15', '10366', '8054', '0'), +('5', '10', '15', '10151', '7200', '0'), +('5', '10', '15', '14679', '7010', '0'), +('5', '10', '15', '14678', '5708', '0'), +('5', '10', '20', '2704', '23441', '0'), +('5', '10', '20', '11601', '17964', '0'), +('5', '10', '20', '2918', '10974', '0'), +('5', '10', '20', '1365', '10500', '0'), +('5', '10', '12', '4835', '10083', '0'), +('5', '10', '12', '20655', '8007', '0'), +('5', '10', '12', '4845', '5684', '0'), +('5', '10', '12', '2923', '4758', '0'), +('5', '10', '18', '4836', '6517', '0'), +('5', '10', '18', '4846', '5554', '0'), +('5', '10', '18', '4346', '4645', '0'), +('5', '10', '18', '3145', '4413', '0'), +('5', '10', '19', '4837', '7151', '0'), +('5', '10', '19', '4847', '5971', '0'), +('5', '10', '19', '68239', '5319', '0'), +('5', '10', '19', '3146', '3454', '0'), +('5', '10', '13', '5401', '19848', '0'), +('5', '10', '13', '27707', '19818', '0'), +('5', '10', '13', '5622', '16025', '0'), +('5', '10', '13', '11609', '15668', '0'), +('5', '10', '14', '9402', '32870', '0'), +('5', '10', '14', '11678', '32840', '0'), +('5', '10', '14', '11632', '28311', '0'), +('5', '10', '14', '11551', '23853', '0'), +('5', '10', '11', '8408', '6861', '0'), +('5', '10', '11', '8325', '6668', '0'), +('5', '10', '11', '8811', '5213', '0'), +('5', '10', '11', '8810', '4798', '0'), +('5', '11', '22', '8567', '0', '0'), +('5', '11', '22', '10323', '0', '0'), +('5', '11', '22', '8504', '0', '0'), +('5', '11', '22', '9246', '0', '0'), +('5', '11', '1', '14701', '4854', '0'), +('5', '11', '1', '14702', '3550', '0'), +('5', '11', '1', '10082', '2651', '0'), +('5', '11', '1', '10165', '1940', '0'), +('5', '11', '2', '4841', '9293', '0'), +('5', '11', '2', '4301', '7726', '0'), +('5', '11', '2', '4831', '6239', '0'), +('5', '11', '2', '3140', '4875', '0'), +('5', '11', '3', '4322', '5343', '0'), +('5', '11', '3', '1544', '4670', '0'), +('5', '11', '3', '71529', '3691', '0'), +('5', '11', '3', '21002', '2114', '0'), +('5', '11', '5', '14703', '7150', '0'), +('5', '11', '5', '27705', '6155', '0'), +('5', '11', '5', '14700', '4806', '0'), +('5', '11', '5', '10055', '4760', '0'), +('5', '11', '8', '11621', '26579', '0'), +('5', '11', '8', '11551', '8753', '0'), +('5', '11', '8', '1409', '7747', '0'), +('5', '11', '8', '11603', '6379', '0'), +('5', '11', '6', '1557', '8270', '0'), +('5', '11', '6', '11699', '5662', '0'), +('5', '11', '6', '25062', '3672', '0'), +('5', '11', '6', '4302', '3612', '0'), +('5', '11', '17', '4832', '12065', '0'), +('5', '11', '17', '4842', '10138', '0'), +('5', '11', '17', '4309', '8225', '0'), +('5', '11', '17', '11623', '7848', '0'), +('5', '11', '7', '4833', '6478', '0'), +('5', '11', '7', '4843', '5389', '0'), +('5', '11', '7', '4343', '4143', '0'), +('5', '11', '7', '1361', '3624', '0'), +('5', '11', '9', '4834', '4408', '0'), +('5', '11', '9', '12189', '3471', '0'), +('5', '11', '9', '4844', '3170', '0'), +('5', '11', '9', '4344', '3046', '0'), +('5', '11', '15', '10366', '8054', '0'), +('5', '11', '15', '10151', '7200', '0'), +('5', '11', '15', '14679', '7010', '0'), +('5', '11', '15', '14678', '5708', '0'), +('5', '11', '20', '2704', '23463', '0'), +('5', '11', '20', '11601', '18007', '0'), +('5', '11', '20', '2918', '10992', '0'), +('5', '11', '20', '1365', '10500', '0'), +('5', '11', '12', '4835', '10104', '0'), +('5', '11', '12', '20655', '8023', '0'), +('5', '11', '12', '4845', '5702', '0'), +('5', '11', '12', '2923', '4758', '0'), +('5', '11', '18', '4836', '6538', '0'), +('5', '11', '18', '4846', '5554', '0'), +('5', '11', '18', '4346', '4645', '0'), +('5', '11', '18', '3145', '4451', '0'), +('5', '11', '19', '4837', '7170', '0'), +('5', '11', '19', '4847', '5992', '0'), +('5', '11', '19', '68239', '5330', '0'), +('5', '11', '19', '3146', '3467', '0'), +('5', '11', '13', '5401', '19848', '0'), +('5', '11', '13', '27707', '19831', '0'), +('5', '11', '13', '5622', '16025', '0'), +('5', '11', '13', '11609', '15668', '0'), +('5', '11', '14', '9402', '32892', '0'), +('5', '11', '14', '11678', '32840', '0'), +('5', '11', '14', '11632', '28375', '0'), +('5', '11', '14', '11551', '23853', '0'), +('5', '11', '11', '8408', '6861', '0'), +('5', '11', '11', '8325', '6668', '0'), +('5', '11', '11', '8811', '5213', '0'), +('5', '11', '11', '8810', '4798', '0'), +('5', '12', '22', '8567', '0', '0'), +('5', '12', '22', '10323', '0', '0'), +('5', '12', '22', '8504', '0', '0'), +('5', '12', '22', '9246', '0', '0'), +('5', '12', '1', '14701', '4854', '0'), +('5', '12', '1', '14702', '3550', '0'), +('5', '12', '1', '10082', '2673', '0'), +('5', '12', '1', '10165', '1940', '0'), +('5', '12', '2', '4841', '9325', '0'), +('5', '12', '2', '4301', '7726', '0'), +('5', '12', '2', '4831', '6257', '0'), +('5', '12', '2', '3140', '4893', '0'), +('5', '12', '3', '4322', '5343', '0'), +('5', '12', '3', '1544', '4688', '0'), +('5', '12', '3', '71529', '3711', '0'), +('5', '12', '3', '21002', '2114', '0'), +('5', '12', '5', '14703', '7150', '0'), +('5', '12', '5', '27705', '6206', '0'), +('5', '12', '5', '14700', '4806', '0'), +('5', '12', '5', '10055', '4760', '0'), +('5', '12', '8', '11621', '26579', '0'), +('5', '12', '8', '11551', '8753', '0'), +('5', '12', '8', '1409', '7747', '0'), +('5', '12', '8', '11603', '6411', '0'), +('5', '12', '6', '1557', '8270', '0'), +('5', '12', '6', '11699', '5716', '0'), +('5', '12', '6', '25062', '3672', '0'), +('5', '12', '6', '4302', '3641', '0'), +('5', '12', '17', '4832', '12137', '0'), +('5', '12', '17', '4842', '10182', '0'), +('5', '12', '17', '4309', '8225', '0'), +('5', '12', '17', '11623', '7848', '0'), +('5', '12', '7', '4833', '6478', '0'), +('5', '12', '7', '4843', '5389', '0'), +('5', '12', '7', '4343', '4192', '0'), +('5', '12', '7', '1361', '3624', '0'), +('5', '12', '9', '4834', '4408', '0'), +('5', '12', '9', '12189', '3471', '0'), +('5', '12', '9', '4844', '3181', '0'), +('5', '12', '9', '4344', '3046', '0'), +('5', '12', '15', '10366', '8054', '0'), +('5', '12', '15', '10151', '7200', '0'), +('5', '12', '15', '14679', '7010', '0'), +('5', '12', '15', '14678', '5708', '0'), +('5', '12', '20', '2704', '23485', '0'), +('5', '12', '20', '11601', '18055', '0'), +('5', '12', '20', '2918', '11010', '0'), +('5', '12', '20', '1365', '10500', '0'), +('5', '12', '12', '4835', '10128', '0'), +('5', '12', '12', '20655', '8040', '0'), +('5', '12', '12', '4845', '5720', '0'), +('5', '12', '12', '2923', '4758', '0'), +('5', '12', '18', '4836', '6562', '0'), +('5', '12', '18', '4846', '5554', '0'), +('5', '12', '18', '4346', '4645', '0'), +('5', '12', '18', '3145', '4494', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '12', '19', '4837', '7188', '0'), +('5', '12', '19', '4847', '6016', '0'), +('5', '12', '19', '68239', '5341', '0'), +('5', '12', '19', '3146', '3481', '0'), +('5', '12', '13', '5401', '19848', '0'), +('5', '12', '13', '27707', '19844', '0'), +('5', '12', '13', '5622', '16025', '0'), +('5', '12', '13', '11609', '15668', '0'), +('5', '12', '14', '9402', '32916', '0'), +('5', '12', '14', '11678', '32840', '0'), +('5', '12', '14', '11632', '28447', '0'), +('5', '12', '14', '11551', '23853', '0'), +('5', '12', '11', '8408', '6861', '0'), +('5', '12', '11', '8325', '6668', '0'), +('5', '12', '11', '8811', '5213', '0'), +('5', '12', '11', '8810', '4798', '0'), +('5', '13', '22', '8567', '0', '0'), +('5', '13', '22', '10323', '0', '0'), +('5', '13', '22', '8504', '0', '0'), +('5', '13', '22', '9246', '0', '0'), +('5', '13', '1', '14701', '4854', '0'), +('5', '13', '1', '14702', '3550', '0'), +('5', '13', '1', '10082', '2695', '0'), +('5', '13', '1', '10165', '1940', '0'), +('5', '13', '2', '4841', '9358', '0'), +('5', '13', '2', '4301', '7726', '0'), +('5', '13', '2', '4831', '6276', '0'), +('5', '13', '2', '3140', '4912', '0'), +('5', '13', '3', '4322', '5343', '0'), +('5', '13', '3', '1544', '4706', '0'), +('5', '13', '3', '71529', '3730', '0'), +('5', '13', '3', '21002', '2114', '0'), +('5', '13', '5', '14703', '7150', '0'), +('5', '13', '5', '27705', '6257', '0'), +('5', '13', '5', '14700', '4806', '0'), +('5', '13', '5', '10055', '4760', '0'), +('5', '13', '8', '11621', '26579', '0'), +('5', '13', '8', '11551', '8753', '0'), +('5', '13', '8', '1409', '7747', '0'), +('5', '13', '8', '11603', '6444', '0'), +('5', '13', '6', '1557', '8270', '0'), +('5', '13', '6', '11699', '5770', '0'), +('5', '13', '6', '25062', '3672', '0'), +('5', '13', '6', '4302', '3670', '0'), +('5', '13', '17', '4832', '12210', '0'), +('5', '13', '17', '4842', '10225', '0'), +('5', '13', '17', '4309', '8225', '0'), +('5', '13', '17', '11623', '7848', '0'), +('5', '13', '7', '4833', '6478', '0'), +('5', '13', '7', '4843', '5389', '0'), +('5', '13', '7', '4343', '4240', '0'), +('5', '13', '7', '1361', '3624', '0'), +('5', '13', '9', '4834', '4408', '0'), +('5', '13', '9', '12189', '3471', '0'), +('5', '13', '9', '4844', '3192', '0'), +('5', '13', '9', '4344', '3046', '0'), +('5', '13', '15', '10366', '8054', '0'), +('5', '13', '15', '10151', '7200', '0'), +('5', '13', '15', '14679', '7010', '0'), +('5', '13', '15', '14678', '5708', '0'), +('5', '13', '20', '2704', '23507', '0'), +('5', '13', '20', '11601', '18103', '0'), +('5', '13', '20', '2918', '11028', '0'), +('5', '13', '20', '1365', '10500', '0'), +('5', '13', '12', '4835', '10152', '0'), +('5', '13', '12', '20655', '8057', '0'), +('5', '13', '12', '4845', '5738', '0'), +('5', '13', '12', '2923', '4758', '0'), +('5', '13', '18', '4836', '6587', '0'), +('5', '13', '18', '4846', '5554', '0'), +('5', '13', '18', '4346', '4645', '0'), +('5', '13', '18', '3145', '4538', '0'), +('5', '13', '19', '4837', '7206', '0'), +('5', '13', '19', '4847', '6040', '0'), +('5', '13', '19', '68239', '5352', '0'), +('5', '13', '19', '3146', '3496', '0'), +('5', '13', '13', '27707', '19856', '0'), +('5', '13', '13', '5401', '19848', '0'), +('5', '13', '13', '5622', '16025', '0'), +('5', '13', '13', '11609', '15668', '0'), +('5', '13', '14', '9402', '32940', '0'), +('5', '13', '14', '11678', '32840', '0'), +('5', '13', '14', '11632', '28520', '0'), +('5', '13', '14', '11551', '23853', '0'), +('5', '13', '11', '8408', '6861', '0'), +('5', '13', '11', '8325', '6668', '0'), +('5', '13', '11', '8811', '5213', '0'), +('5', '13', '11', '8810', '4798', '0'), +('5', '14', '22', '8567', '0', '0'), +('5', '14', '22', '10323', '0', '0'), +('5', '14', '22', '8504', '0', '0'), +('5', '14', '22', '9246', '0', '0'), +('5', '14', '1', '14701', '4854', '0'), +('5', '14', '1', '14702', '3550', '0'), +('5', '14', '1', '10082', '2716', '0'), +('5', '14', '1', '10165', '1940', '0'), +('5', '14', '2', '4841', '9391', '0'), +('5', '14', '2', '4301', '7726', '0'), +('5', '14', '2', '4831', '6294', '0'), +('5', '14', '2', '3140', '4930', '0'), +('5', '14', '3', '4322', '5343', '0'), +('5', '14', '3', '1544', '4724', '0'), +('5', '14', '3', '71529', '3747', '0'), +('5', '14', '3', '21002', '2114', '0'), +('5', '14', '5', '14703', '7150', '0'), +('5', '14', '5', '27705', '6307', '0'), +('5', '14', '5', '14700', '4806', '0'), +('5', '14', '5', '10055', '4760', '0'), +('5', '14', '8', '11621', '26579', '0'), +('5', '14', '8', '11551', '8753', '0'), +('5', '14', '8', '1409', '7747', '0'), +('5', '14', '8', '11603', '6477', '0'), +('5', '14', '6', '1557', '8270', '0'), +('5', '14', '6', '11699', '5825', '0'), +('5', '14', '6', '4302', '3695', '0'), +('5', '14', '6', '25062', '3672', '0'), +('5', '14', '17', '4832', '12273', '0'), +('5', '14', '17', '4842', '10263', '0'), +('5', '14', '17', '4309', '8225', '0'), +('5', '14', '17', '11623', '7848', '0'), +('5', '14', '7', '4833', '6478', '0'), +('5', '14', '7', '4843', '5389', '0'), +('5', '14', '7', '4343', '4282', '0'), +('5', '14', '7', '1361', '3624', '0'), +('5', '14', '9', '4834', '4408', '0'), +('5', '14', '9', '12189', '3471', '0'), +('5', '14', '9', '4844', '3202', '0'), +('5', '14', '9', '4344', '3046', '0'), +('5', '14', '15', '10366', '8054', '0'), +('5', '14', '15', '10151', '7200', '0'), +('5', '14', '15', '14679', '7010', '0'), +('5', '14', '15', '14678', '5708', '0'), +('5', '14', '20', '2704', '23528', '0'), +('5', '14', '20', '11601', '18146', '0'), +('5', '14', '20', '2918', '11046', '0'), +('5', '14', '20', '1365', '10500', '0'), +('5', '14', '12', '4835', '10173', '0'), +('5', '14', '12', '20655', '8073', '0'), +('5', '14', '12', '4845', '5756', '0'), +('5', '14', '12', '2923', '4758', '0'), +('5', '14', '18', '4836', '6608', '0'), +('5', '14', '18', '4846', '5554', '0'), +('5', '14', '18', '4346', '4645', '0'), +('5', '14', '18', '3145', '4576', '0'), +('5', '14', '19', '4837', '7224', '0'), +('5', '14', '19', '4847', '6062', '0'), +('5', '14', '19', '68239', '5362', '0'), +('5', '14', '19', '3146', '3509', '0'), +('5', '14', '13', '27707', '19869', '0'), +('5', '14', '13', '5401', '19848', '0'), +('5', '14', '13', '5622', '16025', '0'), +('5', '14', '13', '11609', '15668', '0'), +('5', '14', '14', '9402', '32961', '0'), +('5', '14', '14', '11678', '32840', '0'), +('5', '14', '14', '11632', '28583', '0'), +('5', '14', '14', '11551', '23853', '0'), +('5', '14', '11', '8408', '6861', '0'), +('5', '14', '11', '8325', '6668', '0'), +('5', '14', '11', '8811', '5213', '0'), +('5', '14', '11', '8810', '4798', '0'), +('5', '15', '22', '8567', '0', '0'), +('5', '15', '22', '10323', '0', '0'), +('5', '15', '22', '8504', '0', '0'), +('5', '15', '22', '9246', '0', '0'), +('5', '15', '1', '14701', '4854', '0'), +('5', '15', '1', '14702', '3550', '0'), +('5', '15', '1', '10082', '2738', '0'), +('5', '15', '1', '10165', '1940', '0'), +('5', '15', '2', '4841', '9423', '0'), +('5', '15', '2', '4301', '7726', '0'), +('5', '15', '2', '4831', '6312', '0'), +('5', '15', '2', '3140', '4948', '0'), +('5', '15', '3', '4322', '5343', '0'), +('5', '15', '3', '1544', '4743', '0'), +('5', '15', '3', '71529', '3766', '0'), +('5', '15', '3', '21002', '2114', '0'), +('5', '15', '5', '14703', '7150', '0'), +('5', '15', '5', '27705', '6358', '0'), +('5', '15', '5', '14700', '4806', '0'), +('5', '15', '5', '10055', '4760', '0'), +('5', '15', '8', '11621', '26579', '0'), +('5', '15', '8', '11551', '8753', '0'), +('5', '15', '8', '1409', '7747', '0'), +('5', '15', '8', '11603', '6509', '0'), +('5', '15', '6', '1557', '8270', '0'), +('5', '15', '6', '11699', '5879', '0'), +('5', '15', '6', '4302', '3724', '0'), +('5', '15', '6', '25062', '3672', '0'), +('5', '15', '17', '4832', '12346', '0'), +('5', '15', '17', '4842', '10307', '0'), +('5', '15', '17', '4309', '8225', '0'), +('5', '15', '17', '11623', '7848', '0'), +('5', '15', '7', '4833', '6478', '0'), +('5', '15', '7', '4843', '5389', '0'), +('5', '15', '7', '4343', '4331', '0'), +('5', '15', '7', '1361', '3624', '0'), +('5', '15', '9', '4834', '4408', '0'), +('5', '15', '9', '12189', '3471', '0'), +('5', '15', '9', '4844', '3213', '0'), +('5', '15', '9', '4344', '3046', '0'), +('5', '15', '15', '10366', '8054', '0'), +('5', '15', '15', '10151', '7200', '0'), +('5', '15', '15', '14679', '7010', '0'), +('5', '15', '15', '14678', '5708', '0'), +('5', '15', '20', '2704', '23550', '0'), +('5', '15', '20', '11601', '18194', '0'), +('5', '15', '20', '2918', '11064', '0'), +('5', '15', '20', '1365', '10500', '0'), +('5', '15', '12', '4835', '10197', '0'), +('5', '15', '12', '20655', '8090', '0'), +('5', '15', '12', '4845', '5774', '0'), +('5', '15', '12', '2923', '4758', '0'), +('5', '15', '18', '4836', '6632', '0'), +('5', '15', '18', '4846', '5554', '0'), +('5', '15', '18', '4346', '4645', '0'), +('5', '15', '18', '3145', '4619', '0'), +('5', '15', '19', '4837', '7242', '0'), +('5', '15', '19', '4847', '6086', '0'), +('5', '15', '19', '68239', '5373', '0'), +('5', '15', '19', '3146', '3523', '0'), +('5', '15', '13', '27707', '19882', '0'), +('5', '15', '13', '5401', '19848', '0'), +('5', '15', '13', '5622', '16025', '0'), +('5', '15', '13', '11609', '15668', '0'), +('5', '15', '14', '9402', '32985', '0'), +('5', '15', '14', '11678', '32840', '0'), +('5', '15', '14', '11632', '28656', '0'), +('5', '15', '14', '11551', '23853', '0'), +('5', '15', '11', '8408', '6861', '0'), +('5', '15', '11', '8325', '6668', '0'), +('5', '15', '11', '8811', '5213', '0'), +('5', '15', '11', '8810', '4798', '0'), +('5', '16', '22', '8567', '0', '0'), +('5', '16', '22', '10323', '0', '0'), +('5', '16', '22', '8504', '0', '0'), +('5', '16', '22', '9246', '0', '0'), +('5', '16', '1', '14701', '4854', '0'), +('5', '16', '1', '14702', '3550', '0'), +('5', '16', '1', '10082', '2760', '0'), +('5', '16', '1', '10165', '1940', '0'), +('5', '16', '2', '4841', '9456', '0'), +('5', '16', '2', '4301', '7726', '0'), +('5', '16', '2', '4831', '6330', '0'), +('5', '16', '2', '3140', '4966', '0'), +('5', '16', '3', '4322', '5343', '0'), +('5', '16', '3', '1544', '4761', '0'), +('5', '16', '3', '71529', '3786', '0'), +('5', '16', '3', '21002', '2114', '0'), +('5', '16', '5', '14703', '7150', '0'), +('5', '16', '5', '27705', '6409', '0'), +('5', '16', '5', '14700', '4806', '0'), +('5', '16', '5', '10055', '4760', '0'), +('5', '16', '8', '11621', '26579', '0'), +('5', '16', '8', '11551', '8753', '0'), +('5', '16', '8', '1409', '7747', '0'), +('5', '16', '8', '11603', '6542', '0'), +('5', '16', '6', '1557', '8270', '0'), +('5', '16', '6', '11699', '5933', '0'), +('5', '16', '6', '4302', '3753', '0'), +('5', '16', '6', '25062', '3672', '0'), +('5', '16', '17', '4832', '12418', '0'), +('5', '16', '17', '4842', '10350', '0'), +('5', '16', '17', '4309', '8225', '0'), +('5', '16', '17', '11623', '7848', '0'), +('5', '16', '7', '4833', '6478', '0'), +('5', '16', '7', '4843', '5389', '0'), +('5', '16', '7', '4343', '4379', '0'), +('5', '16', '7', '1361', '3624', '0'), +('5', '16', '9', '4834', '4408', '0'), +('5', '16', '9', '12189', '3471', '0'), +('5', '16', '9', '4844', '3224', '0'), +('5', '16', '9', '4344', '3046', '0'), +('5', '16', '15', '10366', '8054', '0'), +('5', '16', '15', '10151', '7200', '0'), +('5', '16', '15', '14679', '7010', '0'), +('5', '16', '15', '14678', '5708', '0'), +('5', '16', '20', '2704', '23572', '0'), +('5', '16', '20', '11601', '18242', '0'), +('5', '16', '20', '2918', '11082', '0'), +('5', '16', '20', '1365', '10500', '0'), +('5', '16', '12', '4835', '10222', '0'), +('5', '16', '12', '20655', '8106', '0'), +('5', '16', '12', '4845', '5792', '0'), +('5', '16', '12', '2923', '4758', '0'), +('5', '16', '18', '4836', '6656', '0'), +('5', '16', '18', '4846', '5554', '0'), +('5', '16', '18', '3145', '4663', '0'), +('5', '16', '18', '4346', '4645', '0'), +('5', '16', '19', '4837', '7260', '0'), +('5', '16', '19', '4847', '6110', '0'), +('5', '16', '19', '68239', '5384', '0'), +('5', '16', '19', '3146', '3538', '0'), +('5', '16', '13', '27707', '19894', '0'), +('5', '16', '13', '5401', '19848', '0'), +('5', '16', '13', '5622', '16025', '0'), +('5', '16', '13', '11609', '15668', '0'), +('5', '16', '14', '9402', '33009', '0'), +('5', '16', '14', '11678', '32840', '0'), +('5', '16', '14', '11632', '28728', '0'), +('5', '16', '14', '11551', '23853', '0'), +('5', '16', '11', '8408', '6861', '0'), +('5', '16', '11', '8325', '6668', '0'), +('5', '16', '11', '8811', '5213', '0'), +('5', '16', '11', '45137', '5117', '0'), +('5', '17', '22', '8567', '0', '0'), +('5', '17', '22', '10323', '0', '0'), +('5', '17', '22', '8504', '0', '0'), +('5', '17', '22', '9246', '0', '0'), +('5', '17', '1', '14701', '4854', '0'), +('5', '17', '1', '14702', '3550', '0'), +('5', '17', '1', '10082', '2782', '0'), +('5', '17', '1', '10165', '1940', '0'), +('5', '17', '2', '4841', '9488', '0'), +('5', '17', '2', '4301', '7726', '0'), +('5', '17', '2', '4831', '6348', '0'), +('5', '17', '2', '3140', '4984', '0'), +('5', '17', '3', '4322', '5343', '0'), +('5', '17', '3', '1544', '4779', '0'), +('5', '17', '3', '71529', '3805', '0'), +('5', '17', '3', '21002', '2114', '0'), +('5', '17', '5', '14703', '7150', '0'), +('5', '17', '5', '27705', '6460', '0'), +('5', '17', '5', '14700', '4806', '0'), +('5', '17', '5', '10055', '4760', '0'), +('5', '17', '8', '11621', '26579', '0'), +('5', '17', '8', '11551', '8753', '0'), +('5', '17', '8', '1409', '7747', '0'), +('5', '17', '8', '11603', '6574', '0'), +('5', '17', '6', '1557', '8270', '0'), +('5', '17', '6', '11699', '5988', '0'), +('5', '17', '6', '4302', '3782', '0'), +('5', '17', '6', '25062', '3672', '0'), +('5', '17', '17', '4832', '12491', '0'), +('5', '17', '17', '4842', '10394', '0'), +('5', '17', '17', '4309', '8225', '0'), +('5', '17', '17', '11623', '7848', '0'), +('5', '17', '7', '4833', '6478', '0'), +('5', '17', '7', '4843', '5389', '0'), +('5', '17', '7', '4343', '4427', '0'), +('5', '17', '7', '1361', '3624', '0'), +('5', '17', '9', '4834', '4408', '0'), +('5', '17', '9', '12189', '3471', '0'), +('5', '17', '9', '4844', '3235', '0'), +('5', '17', '9', '4344', '3046', '0'), +('5', '17', '15', '10366', '8054', '0'), +('5', '17', '15', '10151', '7200', '0'), +('5', '17', '15', '14679', '7010', '0'), +('5', '17', '15', '14678', '5708', '0'), +('5', '17', '20', '2704', '23594', '0'), +('5', '17', '20', '11601', '18290', '0'), +('5', '17', '20', '2918', '11101', '0'), +('5', '17', '20', '1365', '10500', '0'), +('5', '17', '12', '4835', '10246', '0'), +('5', '17', '12', '20655', '8123', '0'), +('5', '17', '12', '4845', '5811', '0'), +('5', '17', '12', '2923', '4758', '0'), +('5', '17', '18', '4836', '6680', '0'), +('5', '17', '18', '4846', '5554', '0'), +('5', '17', '18', '3145', '4706', '0'), +('5', '17', '18', '4346', '4645', '0'), +('5', '17', '19', '4837', '7278', '0'), +('5', '17', '19', '4847', '6134', '0'), +('5', '17', '19', '68239', '5395', '0'), +('5', '17', '19', '3146', '3552', '0'), +('5', '17', '13', '27707', '19907', '0'), +('5', '17', '13', '5401', '19848', '0'), +('5', '17', '13', '5622', '16025', '0'), +('5', '17', '13', '11609', '15668', '0'), +('5', '17', '14', '9402', '33034', '0'), +('5', '17', '14', '11678', '32840', '0'), +('5', '17', '14', '11632', '28801', '0'), +('5', '17', '14', '11551', '23853', '0'), +('5', '17', '11', '8408', '6861', '0'), +('5', '17', '11', '8325', '6668', '0'), +('5', '17', '11', '45137', '5422', '0'), +('5', '17', '11', '8811', '5213', '0'), +('5', '18', '22', '8567', '0', '0'), +('5', '18', '22', '10323', '0', '0'), +('5', '18', '22', '8504', '0', '0'), +('5', '18', '22', '9246', '0', '0'), +('5', '18', '1', '14701', '4854', '0'), +('5', '18', '1', '14702', '3550', '0'), +('5', '18', '1', '10082', '2803', '0'), +('5', '18', '1', '10165', '1940', '0'), +('5', '18', '2', '4841', '9521', '0'), +('5', '18', '2', '4301', '7726', '0'), +('5', '18', '2', '4831', '6366', '0'), +('5', '18', '2', '3140', '5002', '0'), +('5', '18', '3', '4322', '5343', '0'), +('5', '18', '3', '1544', '4797', '0'), +('5', '18', '3', '71529', '3824', '0'), +('5', '18', '3', '21002', '2114', '0'), +('5', '18', '5', '14703', '7150', '0'), +('5', '18', '5', '27705', '6510', '0'), +('5', '18', '5', '14700', '4806', '0'), +('5', '18', '5', '10055', '4760', '0'), +('5', '18', '8', '11621', '26579', '0'), +('5', '18', '8', '11551', '8753', '0'), +('5', '18', '8', '1409', '7747', '0'), +('5', '18', '8', '11603', '6607', '0'), +('5', '18', '6', '1557', '8270', '0'), +('5', '18', '6', '11699', '6042', '0'), +('5', '18', '6', '4302', '3811', '0'), +('5', '18', '6', '25062', '3672', '0'), +('5', '18', '17', '4832', '12563', '0'), +('5', '18', '17', '4842', '10437', '0'), +('5', '18', '17', '4309', '8225', '0'), +('5', '18', '17', '11623', '7848', '0'), +('5', '18', '7', '4833', '6478', '0'), +('5', '18', '7', '4843', '5389', '0'), +('5', '18', '7', '4343', '4476', '0'), +('5', '18', '7', '1361', '3624', '0'), +('5', '18', '9', '4834', '4408', '0'), +('5', '18', '9', '12189', '3471', '0'), +('5', '18', '9', '4844', '3246', '0'), +('5', '18', '9', '4344', '3046', '0'), +('5', '18', '15', '10366', '8054', '0'), +('5', '18', '15', '10151', '7200', '0'), +('5', '18', '15', '14679', '7010', '0'), +('5', '18', '15', '14678', '5708', '0'), +('5', '18', '20', '2704', '23615', '0'), +('5', '18', '20', '11601', '18339', '0'), +('5', '18', '20', '2918', '11119', '0'), +('5', '18', '20', '1365', '10500', '0'), +('5', '18', '12', '4835', '10270', '0'), +('5', '18', '12', '20655', '8140', '0'), +('5', '18', '12', '4845', '5829', '0'), +('5', '18', '12', '2923', '4758', '0'), +('5', '18', '18', '4836', '6704', '0'), +('5', '18', '18', '4846', '5554', '0'), +('5', '18', '18', '3145', '4750', '0'), +('5', '18', '18', '4346', '4645', '0'), +('5', '18', '19', '4837', '7296', '0'), +('5', '18', '19', '4847', '6158', '0'), +('5', '18', '19', '68239', '5406', '0'), +('5', '18', '19', '3146', '3567', '0'), +('5', '18', '13', '27707', '19920', '0'), +('5', '18', '13', '5401', '19848', '0'), +('5', '18', '13', '5622', '16025', '0'), +('5', '18', '13', '11609', '15668', '0'), +('5', '18', '14', '9402', '33058', '0'), +('5', '18', '14', '11678', '32840', '0'), +('5', '18', '14', '11632', '28873', '0'), +('5', '18', '14', '11551', '23853', '0'), +('5', '18', '11', '8408', '6861', '0'), +('5', '18', '11', '8325', '6668', '0'), +('5', '18', '11', '45137', '5832', '0'), +('5', '18', '11', '8811', '5213', '0'), +('5', '19', '22', '8567', '0', '0'), +('5', '19', '22', '10323', '0', '0'), +('5', '19', '22', '8504', '0', '0'), +('5', '19', '22', '9246', '0', '0'), +('5', '19', '1', '14701', '4854', '0'), +('5', '19', '1', '14702', '3550', '0'), +('5', '19', '1', '10082', '2825', '0'), +('5', '19', '1', '10165', '1940', '0'), +('5', '19', '2', '4841', '9554', '0'), +('5', '19', '2', '4301', '7726', '0'), +('5', '19', '2', '4831', '6384', '0'), +('5', '19', '2', '3140', '5020', '0'), +('5', '19', '3', '4322', '5343', '0'), +('5', '19', '3', '1544', '4815', '0'), +('5', '19', '3', '71529', '3844', '0'), +('5', '19', '3', '21002', '2114', '0'), +('5', '19', '5', '14703', '7150', '0'), +('5', '19', '5', '27705', '6561', '0'), +('5', '19', '5', '14700', '4806', '0'), +('5', '19', '5', '10055', '4760', '0'), +('5', '19', '8', '11621', '26579', '0'), +('5', '19', '8', '11551', '8753', '0'), +('5', '19', '8', '1409', '7747', '0'), +('5', '19', '8', '11603', '6640', '0'), +('5', '19', '6', '1557', '8270', '0'), +('5', '19', '6', '11699', '6096', '0'), +('5', '19', '6', '4302', '3840', '0'), +('5', '19', '6', '25062', '3672', '0'), +('5', '19', '17', '4832', '12636', '0'), +('5', '19', '17', '4842', '10481', '0'), +('5', '19', '17', '4309', '8225', '0'), +('5', '19', '17', '11623', '7848', '0'), +('5', '19', '7', '4833', '6478', '0'), +('5', '19', '7', '4843', '5389', '0'), +('5', '19', '7', '4343', '4524', '0'), +('5', '19', '7', '1361', '3624', '0'), +('5', '19', '9', '4834', '4408', '0'), +('5', '19', '9', '12189', '3471', '0'), +('5', '19', '9', '4844', '3257', '0'), +('5', '19', '9', '4344', '3046', '0'), +('5', '19', '15', '10366', '8054', '0'), +('5', '19', '15', '10151', '7200', '0'), +('5', '19', '15', '14679', '7010', '0'), +('5', '19', '15', '14678', '5708', '0'), +('5', '19', '20', '2704', '23637', '0'), +('5', '19', '20', '11601', '18387', '0'), +('5', '19', '20', '2918', '11137', '0'), +('5', '19', '20', '1365', '10500', '0'), +('5', '19', '12', '4835', '10294', '0'), +('5', '19', '12', '20655', '8157', '0'), +('5', '19', '12', '4845', '5847', '0'), +('5', '19', '12', '2923', '4758', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '19', '18', '4836', '6729', '0'), +('5', '19', '18', '4846', '5554', '0'), +('5', '19', '18', '3145', '4793', '0'), +('5', '19', '18', '4346', '4645', '0'), +('5', '19', '19', '4837', '7314', '0'), +('5', '19', '19', '4847', '6182', '0'), +('5', '19', '19', '68239', '5417', '0'), +('5', '19', '19', '3146', '3581', '0'), +('5', '19', '13', '27707', '19932', '0'), +('5', '19', '13', '5401', '19848', '0'), +('5', '19', '13', '5622', '16025', '0'), +('5', '19', '13', '11609', '15668', '0'), +('5', '19', '14', '9402', '33082', '0'), +('5', '19', '14', '11678', '32840', '0'), +('5', '19', '14', '11632', '28946', '0'), +('5', '19', '14', '11551', '23853', '0'), +('5', '19', '11', '8408', '6861', '0'), +('5', '19', '11', '8325', '6668', '0'), +('5', '19', '11', '45137', '6151', '0'), +('5', '19', '11', '8811', '5213', '0'), +('5', '20', '22', '8567', '0', '0'), +('5', '20', '22', '10323', '0', '0'), +('5', '20', '22', '8504', '0', '0'), +('5', '20', '22', '9246', '0', '0'), +('5', '20', '1', '14701', '4854', '0'), +('5', '20', '1', '14702', '3550', '0'), +('5', '20', '1', '10082', '2847', '0'), +('5', '20', '1', '10165', '1940', '0'), +('5', '20', '2', '4841', '9586', '0'), +('5', '20', '2', '4301', '7726', '0'), +('5', '20', '2', '4831', '6402', '0'), +('5', '20', '2', '3140', '5038', '0'), +('5', '20', '3', '4322', '5343', '0'), +('5', '20', '3', '1544', '4833', '0'), +('5', '20', '3', '71529', '3863', '0'), +('5', '20', '3', '21002', '2114', '0'), +('5', '20', '5', '14703', '7150', '0'), +('5', '20', '5', '27705', '6612', '0'), +('5', '20', '5', '14700', '4806', '0'), +('5', '20', '5', '10055', '4760', '0'), +('5', '20', '8', '11621', '26579', '0'), +('5', '20', '8', '11551', '8753', '0'), +('5', '20', '8', '1409', '7747', '0'), +('5', '20', '8', '11603', '6672', '0'), +('5', '20', '6', '1557', '8270', '0'), +('5', '20', '6', '11699', '6151', '0'), +('5', '20', '6', '4302', '3869', '0'), +('5', '20', '6', '25062', '3672', '0'), +('5', '20', '17', '4832', '12708', '0'), +('5', '20', '17', '4842', '10524', '0'), +('5', '20', '17', '4309', '8225', '0'), +('5', '20', '17', '11623', '7848', '0'), +('5', '20', '7', '4833', '6478', '0'), +('5', '20', '7', '4843', '5389', '0'), +('5', '20', '7', '4343', '4572', '0'), +('5', '20', '7', '1361', '3624', '0'), +('5', '20', '9', '4834', '4408', '0'), +('5', '20', '9', '12189', '3471', '0'), +('5', '20', '9', '4844', '3268', '0'), +('5', '20', '9', '4344', '3046', '0'), +('5', '20', '15', '10366', '8054', '0'), +('5', '20', '15', '10151', '7200', '0'), +('5', '20', '15', '14679', '7010', '0'), +('5', '20', '15', '14678', '5708', '0'), +('5', '20', '20', '2704', '23659', '0'), +('5', '20', '20', '11601', '18435', '0'), +('5', '20', '20', '2918', '11155', '0'), +('5', '20', '20', '1365', '10500', '0'), +('5', '20', '12', '4835', '10318', '0'), +('5', '20', '12', '20655', '8174', '0'), +('5', '20', '12', '4845', '5865', '0'), +('5', '20', '12', '2923', '4758', '0'), +('5', '20', '18', '4836', '6753', '0'), +('5', '20', '18', '4846', '5554', '0'), +('5', '20', '18', '3145', '4837', '0'), +('5', '20', '18', '4346', '4645', '0'), +('5', '20', '19', '4837', '7333', '0'), +('5', '20', '19', '4847', '6207', '0'), +('5', '20', '19', '68239', '5428', '0'), +('5', '20', '19', '3146', '3596', '0'), +('5', '20', '13', '27707', '20710', '0'), +('5', '20', '13', '5401', '20330', '0'), +('5', '20', '13', '5622', '16648', '0'), +('5', '20', '13', '11609', '16292', '0'), +('5', '20', '14', '9402', '33106', '0'), +('5', '20', '14', '11678', '32840', '0'), +('5', '20', '14', '11632', '29018', '0'), +('5', '20', '14', '11551', '23853', '0'), +('5', '20', '11', '8408', '7116', '0'), +('5', '20', '11', '8325', '6932', '0'), +('5', '20', '11', '45137', '6633', '0'), +('5', '20', '11', '8811', '5421', '0'), +('5', '21', '22', '8567', '0', '0'), +('5', '21', '22', '10323', '0', '0'), +('5', '21', '22', '8504', '0', '0'), +('5', '21', '22', '9246', '0', '0'), +('5', '21', '1', '14701', '4854', '0'), +('5', '21', '1', '14702', '3550', '0'), +('5', '21', '1', '10082', '2869', '0'), +('5', '21', '1', '10165', '1940', '0'), +('5', '21', '2', '4841', '9619', '0'), +('5', '21', '2', '4301', '7726', '0'), +('5', '21', '2', '4831', '6421', '0'), +('5', '21', '2', '3140', '5057', '0'), +('5', '21', '3', '4322', '5343', '0'), +('5', '21', '3', '1544', '4851', '0'), +('5', '21', '3', '71529', '3882', '0'), +('5', '21', '3', '21002', '2114', '0'), +('5', '21', '5', '14703', '7150', '0'), +('5', '21', '5', '27705', '6663', '0'), +('5', '21', '5', '14700', '4806', '0'), +('5', '21', '5', '10055', '4760', '0'), +('5', '21', '8', '11621', '26579', '0'), +('5', '21', '8', '11551', '8753', '0'), +('5', '21', '8', '1409', '7747', '0'), +('5', '21', '8', '11603', '6705', '0'), +('5', '21', '6', '1557', '8270', '0'), +('5', '21', '6', '11699', '6205', '0'), +('5', '21', '6', '4302', '3898', '0'), +('5', '21', '6', '25062', '3672', '0'), +('5', '21', '17', '4832', '12781', '0'), +('5', '21', '17', '4842', '10568', '0'), +('5', '21', '17', '4309', '8225', '0'), +('5', '21', '17', '11623', '7848', '0'), +('5', '21', '7', '4833', '6478', '0'), +('5', '21', '7', '4843', '5389', '0'), +('5', '21', '7', '4343', '4621', '0'), +('5', '21', '7', '1361', '3624', '0'), +('5', '21', '9', '4834', '4408', '0'), +('5', '21', '9', '12189', '3471', '0'), +('5', '21', '9', '4844', '3279', '0'), +('5', '21', '9', '4344', '3046', '0'), +('5', '21', '15', '10366', '8054', '0'), +('5', '21', '15', '10151', '7200', '0'), +('5', '21', '15', '14679', '7010', '0'), +('5', '21', '15', '14678', '5708', '0'), +('5', '21', '20', '2704', '23681', '0'), +('5', '21', '20', '11601', '18484', '0'), +('5', '21', '20', '2918', '11173', '0'), +('5', '21', '20', '1365', '10500', '0'), +('5', '21', '12', '4835', '10342', '0'), +('5', '21', '12', '20655', '8191', '0'), +('5', '21', '12', '4845', '5883', '0'), +('5', '21', '12', '2923', '4758', '0'), +('5', '21', '18', '4836', '6777', '0'), +('5', '21', '18', '4846', '5554', '0'), +('5', '21', '18', '3145', '4880', '0'), +('5', '21', '18', '4346', '4645', '0'), +('5', '21', '19', '4837', '7351', '0'), +('5', '21', '19', '4847', '6231', '0'), +('5', '21', '19', '68239', '5439', '0'), +('5', '21', '19', '3146', '3610', '0'), +('5', '21', '13', '27707', '20978', '0'), +('5', '21', '13', '5401', '20472', '0'), +('5', '21', '13', '5622', '16847', '0'), +('5', '21', '13', '11609', '16490', '0'), +('5', '21', '14', '9402', '33130', '0'), +('5', '21', '14', '11678', '32840', '0'), +('5', '21', '14', '11632', '29091', '0'), +('5', '21', '14', '11551', '23853', '0'), +('5', '21', '11', '8408', '7192', '0'), +('5', '21', '11', '8325', '7008', '0'), +('5', '21', '11', '45137', '7004', '0'), +('5', '21', '11', '8811', '5478', '0'), +('5', '22', '22', '8567', '0', '0'), +('5', '22', '22', '10323', '0', '0'), +('5', '22', '22', '8504', '0', '0'), +('5', '22', '22', '9246', '0', '0'), +('5', '22', '1', '14701', '4854', '0'), +('5', '22', '1', '14702', '3550', '0'), +('5', '22', '1', '10082', '2890', '0'), +('5', '22', '1', '10165', '1940', '0'), +('5', '22', '2', '4841', '9652', '0'), +('5', '22', '2', '4301', '7726', '0'), +('5', '22', '2', '4831', '6439', '0'), +('5', '22', '2', '3140', '5075', '0'), +('5', '22', '3', '4322', '5343', '0'), +('5', '22', '3', '1544', '4869', '0'), +('5', '22', '3', '71529', '3902', '0'), +('5', '22', '3', '21002', '2114', '0'), +('5', '22', '5', '14703', '7150', '0'), +('5', '22', '5', '27705', '6713', '0'), +('5', '22', '5', '14700', '4806', '0'), +('5', '22', '5', '10055', '4760', '0'), +('5', '22', '8', '11621', '26579', '0'), +('5', '22', '8', '11551', '8753', '0'), +('5', '22', '8', '1409', '7747', '0'), +('5', '22', '8', '11603', '6738', '0'), +('5', '22', '6', '1557', '8270', '0'), +('5', '22', '6', '11699', '6260', '0'), +('5', '22', '6', '4302', '3927', '0'), +('5', '22', '6', '25062', '3672', '0'), +('5', '22', '17', '4832', '12853', '0'), +('5', '22', '17', '4842', '10611', '0'), +('5', '22', '17', '4309', '8225', '0'), +('5', '22', '17', '11623', '7848', '0'), +('5', '22', '7', '4833', '6478', '0'), +('5', '22', '7', '4843', '5389', '0'), +('5', '22', '7', '4343', '4669', '0'), +('5', '22', '7', '2458', '3631', '0'), +('5', '22', '9', '4834', '4408', '0'), +('5', '22', '9', '12189', '3471', '0'), +('5', '22', '9', '4844', '3289', '0'), +('5', '22', '9', '4344', '3046', '0'), +('5', '22', '15', '10366', '8054', '0'), +('5', '22', '15', '10151', '7200', '0'), +('5', '22', '15', '14679', '7010', '0'), +('5', '22', '15', '14678', '5708', '0'), +('5', '22', '20', '2704', '23702', '0'), +('5', '22', '20', '11601', '18532', '0'), +('5', '22', '20', '2918', '11191', '0'), +('5', '22', '20', '1365', '10500', '0'), +('5', '22', '12', '4835', '10367', '0'), +('5', '22', '12', '20655', '8208', '0'), +('5', '22', '12', '4845', '5901', '0'), +('5', '22', '12', '2923', '4758', '0'), +('5', '22', '18', '4836', '6801', '0'), +('5', '22', '18', '4846', '5554', '0'), +('5', '22', '18', '3145', '4924', '0'), +('5', '22', '18', '4346', '4645', '0'), +('5', '22', '19', '4837', '7369', '0'), +('5', '22', '19', '4847', '6255', '0'), +('5', '22', '19', '68239', '5449', '0'), +('5', '22', '19', '3146', '3625', '0'), +('5', '22', '13', '27707', '21217', '0'), +('5', '22', '13', '5401', '20613', '0'), +('5', '22', '13', '5622', '17017', '0'), +('5', '22', '13', '11609', '16660', '0'), +('5', '22', '14', '9402', '33154', '0'), +('5', '22', '14', '11678', '32840', '0'), +('5', '22', '14', '11632', '29163', '0'), +('5', '22', '14', '11551', '23853', '0'), +('5', '22', '11', '45137', '7481', '0'), +('5', '22', '11', '8408', '7268', '0'), +('5', '22', '11', '8325', '7093', '0'), +('5', '22', '11', '8811', '5544', '0'), +('5', '23', '22', '8567', '0', '0'), +('5', '23', '22', '10323', '0', '0'), +('5', '23', '22', '8504', '0', '0'), +('5', '23', '22', '9246', '0', '0'), +('5', '23', '1', '14701', '4854', '0'), +('5', '23', '1', '14702', '3550', '0'), +('5', '23', '1', '10082', '2912', '0'), +('5', '23', '1', '10165', '1940', '0'), +('5', '23', '2', '4841', '9684', '0'), +('5', '23', '2', '4301', '7726', '0'), +('5', '23', '2', '4831', '6457', '0'), +('5', '23', '2', '3140', '5093', '0'), +('5', '23', '3', '4322', '5343', '0'), +('5', '23', '3', '1544', '4887', '0'), +('5', '23', '3', '71529', '3921', '0'), +('5', '23', '3', '21002', '2114', '0'), +('5', '23', '5', '14703', '7150', '0'), +('5', '23', '5', '27705', '6764', '0'), +('5', '23', '5', '14700', '4806', '0'), +('5', '23', '5', '10055', '4760', '0'), +('5', '23', '8', '11621', '26579', '0'), +('5', '23', '8', '11551', '8753', '0'), +('5', '23', '8', '1409', '7747', '0'), +('5', '23', '8', '11603', '6770', '0'), +('5', '23', '6', '1557', '8270', '0'), +('5', '23', '6', '11699', '6314', '0'), +('5', '23', '6', '4302', '3956', '0'), +('5', '23', '6', '25062', '3672', '0'), +('5', '23', '17', '4832', '12926', '0'), +('5', '23', '17', '4842', '10655', '0'), +('5', '23', '17', '4309', '8225', '0'), +('5', '23', '17', '11623', '7848', '0'), +('5', '23', '7', '4833', '6478', '0'), +('5', '23', '7', '4843', '5389', '0'), +('5', '23', '7', '4343', '4717', '0'), +('5', '23', '7', '2458', '3645', '0'), +('5', '23', '9', '4834', '4408', '0'), +('5', '23', '9', '12189', '3471', '0'), +('5', '23', '9', '4844', '3300', '0'), +('5', '23', '9', '4344', '3046', '0'), +('5', '23', '15', '10366', '8054', '0'), +('5', '23', '15', '10151', '7200', '0'), +('5', '23', '15', '14679', '7010', '0'), +('5', '23', '15', '14678', '5708', '0'), +('5', '23', '20', '2704', '23724', '0'), +('5', '23', '20', '11601', '18580', '0'), +('5', '23', '20', '2918', '11209', '0'), +('5', '23', '20', '1365', '10500', '0'), +('5', '23', '12', '4835', '10391', '0'), +('5', '23', '12', '20655', '8225', '0'), +('5', '23', '12', '4845', '5919', '0'), +('5', '23', '12', '2923', '4758', '0'), +('5', '23', '18', '4836', '6825', '0'), +('5', '23', '18', '4846', '5554', '0'), +('5', '23', '18', '3145', '4967', '0'), +('5', '23', '18', '4346', '4645', '0'), +('5', '23', '19', '4837', '7387', '0'), +('5', '23', '19', '4847', '6279', '0'), +('5', '23', '19', '68239', '5460', '0'), +('5', '23', '19', '3146', '3639', '0'), +('5', '23', '13', '27707', '21457', '0'), +('5', '23', '13', '5401', '20755', '0'), +('5', '23', '13', '5622', '17215', '0'), +('5', '23', '13', '11609', '16858', '0'), +('5', '23', '14', '9402', '33179', '0'), +('5', '23', '14', '11678', '32840', '0'), +('5', '23', '14', '11632', '29236', '0'), +('5', '23', '14', '11551', '23853', '0'), +('5', '23', '11', '45137', '7856', '0'), +('5', '23', '11', '8408', '7343', '0'), +('5', '23', '11', '8325', '7168', '0'), +('5', '23', '11', '8811', '5601', '0'), +('5', '24', '22', '8567', '0', '0'), +('5', '24', '22', '10323', '0', '0'), +('5', '24', '22', '8504', '0', '0'), +('5', '24', '22', '9246', '0', '0'), +('5', '24', '1', '14701', '4854', '0'), +('5', '24', '1', '14702', '3550', '0'), +('5', '24', '1', '10082', '2934', '0'), +('5', '24', '1', '10165', '1940', '0'), +('5', '24', '2', '4841', '9717', '0'), +('5', '24', '2', '4301', '7726', '0'), +('5', '24', '2', '4831', '6475', '0'), +('5', '24', '2', '3140', '5111', '0'), +('5', '24', '3', '4322', '5343', '0'), +('5', '24', '3', '1544', '4906', '0'), +('5', '24', '3', '71529', '3940', '0'), +('5', '24', '3', '4505', '2119', '0'), +('5', '24', '5', '14703', '7150', '0'), +('5', '24', '5', '27705', '6815', '0'), +('5', '24', '5', '14700', '4806', '0'), +('5', '24', '5', '10055', '4760', '0'), +('5', '24', '8', '11621', '26579', '0'), +('5', '24', '8', '11551', '8753', '0'), +('5', '24', '8', '1409', '7747', '0'), +('5', '24', '8', '11603', '6803', '0'), +('5', '24', '6', '1557', '8270', '0'), +('5', '24', '6', '11699', '6368', '0'), +('5', '24', '6', '4302', '3985', '0'), +('5', '24', '6', '25062', '3672', '0'), +('5', '24', '17', '4832', '12998', '0'), +('5', '24', '17', '4842', '10698', '0'), +('5', '24', '17', '4309', '8225', '0'), +('5', '24', '17', '11623', '7848', '0'), +('5', '24', '7', '4833', '6478', '0'), +('5', '24', '7', '4843', '5389', '0'), +('5', '24', '7', '4343', '4766', '0'), +('5', '24', '7', '2458', '3660', '0'), +('5', '24', '9', '4834', '4408', '0'), +('5', '24', '9', '12189', '3471', '0'), +('5', '24', '9', '4844', '3311', '0'), +('5', '24', '9', '4344', '3046', '0'), +('5', '24', '15', '10366', '8054', '0'), +('5', '24', '15', '10151', '7200', '0'), +('5', '24', '15', '14679', '7010', '0'), +('5', '24', '15', '14678', '5708', '0'), +('5', '24', '20', '2704', '23746', '0'), +('5', '24', '20', '11601', '18629', '0'), +('5', '24', '20', '2918', '11227', '0'), +('5', '24', '20', '1365', '10500', '0'), +('5', '24', '12', '4835', '10415', '0'), +('5', '24', '12', '20655', '8242', '0'), +('5', '24', '12', '4845', '5937', '0'), +('5', '24', '12', '2923', '4758', '0'), +('5', '24', '18', '4836', '6849', '0'), +('5', '24', '18', '4846', '5554', '0'), +('5', '24', '18', '3145', '5011', '0'), +('5', '24', '18', '4346', '4645', '0'), +('5', '24', '19', '4837', '7405', '0'), +('5', '24', '19', '4847', '6303', '0'), +('5', '24', '19', '68239', '5471', '0'), +('5', '24', '19', '3146', '3654', '0'), +('5', '24', '13', '27707', '21696', '0'), +('5', '24', '13', '5401', '20897', '0'), +('5', '24', '13', '5622', '17413', '0'), +('5', '24', '13', '11609', '17057', '0'), +('5', '24', '14', '9402', '33203', '0'), +('5', '24', '14', '11678', '32840', '0'), +('5', '24', '14', '11632', '29308', '0'), +('5', '24', '14', '11551', '23853', '0'), +('5', '24', '11', '45137', '8282', '0'), +('5', '24', '11', '8408', '7419', '0'), +('5', '24', '11', '8325', '7253', '0'), +('5', '24', '11', '8811', '5667', '0'), +('5', '25', '22', '8567', '0', '0'), +('5', '25', '22', '10323', '0', '0'), +('5', '25', '22', '8504', '0', '0'), +('5', '25', '22', '9246', '0', '0'), +('5', '25', '1', '14701', '4854', '0'), +('5', '25', '1', '14702', '3550', '0'), +('5', '25', '1', '10082', '2956', '0'), +('5', '25', '1', '10165', '1940', '0'), +('5', '25', '2', '4841', '9749', '0'), +('5', '25', '2', '4301', '7726', '0'), +('5', '25', '2', '4831', '6493', '0'), +('5', '25', '2', '3140', '5129', '0'), +('5', '25', '3', '4322', '5343', '0'), +('5', '25', '3', '1544', '4924', '0'), +('5', '25', '3', '71529', '3962', '0'), +('5', '25', '3', '4505', '2144', '0'), +('5', '25', '5', '14703', '7150', '0'), +('5', '25', '5', '27705', '6866', '0'), +('5', '25', '5', '14700', '4806', '0'), +('5', '25', '5', '10055', '4760', '0'), +('5', '25', '8', '11621', '26579', '0'), +('5', '25', '8', '11551', '8753', '0'), +('5', '25', '8', '1409', '7747', '0'), +('5', '25', '8', '11603', '6835', '0'), +('5', '25', '6', '1557', '8270', '0'), +('5', '25', '6', '11699', '6423', '0'), +('5', '25', '6', '4302', '4018', '0'), +('5', '25', '6', '25062', '3672', '0'), +('5', '25', '17', '4832', '13080', '0'), +('5', '25', '17', '4842', '10747', '0'), +('5', '25', '17', '4309', '8225', '0'), +('5', '25', '17', '11623', '7848', '0'), +('5', '25', '7', '4833', '6478', '0'), +('5', '25', '7', '4843', '5389', '0'), +('5', '25', '7', '4343', '4820', '0'), +('5', '25', '7', '2458', '3674', '0'), +('5', '25', '9', '4834', '4408', '0'), +('5', '25', '9', '12189', '3471', '0'), +('5', '25', '9', '4844', '3322', '0'), +('5', '25', '9', '4344', '3046', '0'), +('5', '25', '15', '10366', '8054', '0'), +('5', '25', '15', '10151', '7200', '0'), +('5', '25', '15', '14679', '7010', '0'), +('5', '25', '15', '14678', '5708', '0'), +('5', '25', '20', '2704', '23768', '0'), +('5', '25', '20', '11601', '18683', '0'), +('5', '25', '20', '2918', '11246', '0'), +('5', '25', '20', '1365', '10500', '0'), +('5', '25', '12', '4835', '10442', '0'), +('5', '25', '12', '20655', '8260', '0'), +('5', '25', '12', '4845', '5956', '0'), +('5', '25', '12', '2923', '4758', '0'), +('5', '25', '18', '4836', '6877', '0'), +('5', '25', '18', '4846', '5554', '0'), +('5', '25', '18', '3145', '5060', '0'), +('5', '25', '18', '4346', '4645', '0'), +('5', '25', '19', '4837', '7423', '0'), +('5', '25', '19', '4847', '6330', '0'), +('5', '25', '19', '68239', '5482', '0'), +('5', '25', '19', '3146', '3670', '0'), +('5', '25', '13', '27707', '21964', '0'), +('5', '25', '13', '5401', '21038', '0'), +('5', '25', '13', '5622', '17583', '0'), +('5', '25', '13', '11609', '17227', '0'), +('5', '25', '14', '9402', '33230', '0'), +('5', '25', '14', '11678', '32840', '0'), +('5', '25', '14', '11632', '29390', '0'), +('5', '25', '14', '11551', '23853', '0'), +('5', '25', '11', '45137', '8749', '0'), +('5', '25', '11', '8408', '7494', '0'), +('5', '25', '11', '8325', '7329', '0'), +('5', '25', '11', '8811', '5733', '0'), +('5', '26', '22', '8567', '0', '0'), +('5', '26', '22', '10323', '0', '0'), +('5', '26', '22', '8504', '0', '0'), +('5', '26', '22', '9246', '0', '0'), +('5', '26', '1', '14701', '4854', '0'), +('5', '26', '1', '14702', '3550', '0'), +('5', '26', '1', '10082', '2977', '0'), +('5', '26', '1', '10165', '1940', '0'), +('5', '26', '2', '4841', '9782', '0'), +('5', '26', '2', '4301', '7726', '0'), +('5', '26', '2', '4831', '6511', '0'), +('5', '26', '2', '3140', '5147', '0'), +('5', '26', '3', '4322', '5343', '0'), +('5', '26', '3', '1544', '4942', '0'), +('5', '26', '3', '71529', '3981', '0'), +('5', '26', '3', '4505', '2170', '0'), +('5', '26', '5', '14703', '7150', '0'), +('5', '26', '5', '27705', '6916', '0'), +('5', '26', '5', '14700', '4806', '0'), +('5', '26', '5', '10055', '4760', '0'), +('5', '26', '8', '11621', '26579', '0'), +('5', '26', '8', '11551', '8753', '0'), +('5', '26', '8', '1409', '7747', '0'), +('5', '26', '8', '11603', '6868', '0'), +('5', '26', '6', '1557', '8270', '0'), +('5', '26', '6', '11699', '6477', '0'), +('5', '26', '6', '4302', '4047', '0'), +('5', '26', '6', '25062', '3672', '0'), +('5', '26', '17', '4832', '13152', '0'), +('5', '26', '17', '4842', '10790', '0'), +('5', '26', '17', '4309', '8225', '0'), +('5', '26', '17', '11623', '7848', '0'), +('5', '26', '7', '4833', '6478', '0'), +('5', '26', '7', '4843', '5389', '0'), +('5', '26', '7', '4343', '4868', '0'), +('5', '26', '7', '2458', '3689', '0'), +('5', '26', '9', '4834', '4408', '0'), +('5', '26', '9', '12189', '3471', '0'), +('5', '26', '9', '4844', '3333', '0'), +('5', '26', '9', '4344', '3046', '0'), +('5', '26', '15', '10366', '8054', '0'), +('5', '26', '15', '10151', '7200', '0'), +('5', '26', '15', '14679', '7010', '0'), +('5', '26', '15', '14678', '5708', '0'), +('5', '26', '20', '2704', '23789', '0'), +('5', '26', '20', '11601', '18731', '0'), +('5', '26', '20', '2918', '11264', '0'), +('5', '26', '20', '1365', '10500', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '26', '12', '4835', '10466', '0'), +('5', '26', '12', '20655', '8277', '0'), +('5', '26', '12', '4845', '5974', '0'), +('5', '26', '12', '2923', '4758', '0'), +('5', '26', '18', '4836', '6901', '0'), +('5', '26', '18', '4846', '5554', '0'), +('5', '26', '18', '3145', '5103', '0'), +('5', '26', '18', '4346', '4645', '0'), +('5', '26', '19', '4837', '7441', '0'), +('5', '26', '19', '4847', '6355', '0'), +('5', '26', '19', '68239', '5493', '0'), +('5', '26', '19', '3146', '3684', '0'), +('5', '26', '13', '27707', '22203', '0'), +('5', '26', '13', '5401', '21180', '0'), +('5', '26', '13', '5622', '17782', '0'), +('5', '26', '13', '11609', '17425', '0'), +('5', '26', '14', '9402', '33254', '0'), +('5', '26', '14', '11678', '32840', '0'), +('5', '26', '14', '11632', '29462', '0'), +('5', '26', '14', '11551', '23853', '0'), +('5', '26', '11', '45137', '9255', '0'), +('5', '26', '11', '8408', '7570', '0'), +('5', '26', '11', '8325', '7414', '0'), +('5', '26', '11', '8811', '5789', '0'), +('5', '27', '22', '8567', '0', '0'), +('5', '27', '22', '10323', '0', '0'), +('5', '27', '22', '8504', '0', '0'), +('5', '27', '22', '9246', '0', '0'), +('5', '27', '1', '14701', '4854', '0'), +('5', '27', '1', '14702', '3550', '0'), +('5', '27', '1', '10082', '2999', '0'), +('5', '27', '1', '10165', '1940', '0'), +('5', '27', '2', '4841', '9815', '0'), +('5', '27', '2', '4301', '7726', '0'), +('5', '27', '2', '4831', '6529', '0'), +('5', '27', '2', '3140', '5165', '0'), +('5', '27', '3', '4322', '5343', '0'), +('5', '27', '3', '1544', '4960', '0'), +('5', '27', '3', '71529', '4001', '0'), +('5', '27', '3', '4505', '2195', '0'), +('5', '27', '5', '14703', '7150', '0'), +('5', '27', '5', '27705', '6967', '0'), +('5', '27', '5', '14700', '4806', '0'), +('5', '27', '5', '10055', '4760', '0'), +('5', '27', '8', '11621', '26579', '0'), +('5', '27', '8', '11551', '8753', '0'), +('5', '27', '8', '1409', '7747', '0'), +('5', '27', '8', '11603', '6901', '0'), +('5', '27', '6', '1557', '8270', '0'), +('5', '27', '6', '11699', '6531', '0'), +('5', '27', '6', '4302', '4076', '0'), +('5', '27', '6', '25062', '3672', '0'), +('5', '27', '17', '4832', '13225', '0'), +('5', '27', '17', '4842', '10834', '0'), +('5', '27', '17', '4309', '8225', '0'), +('5', '27', '17', '11623', '7848', '0'), +('5', '27', '7', '4833', '6478', '0'), +('5', '27', '7', '4843', '5389', '0'), +('5', '27', '7', '4343', '4917', '0'), +('5', '27', '7', '2458', '3703', '0'), +('5', '27', '9', '4834', '4408', '0'), +('5', '27', '9', '12189', '3471', '0'), +('5', '27', '9', '4844', '3344', '0'), +('5', '27', '9', '4344', '3046', '0'), +('5', '27', '15', '10366', '8054', '0'), +('5', '27', '15', '10151', '7200', '0'), +('5', '27', '15', '14679', '7010', '0'), +('5', '27', '15', '14678', '5708', '0'), +('5', '27', '20', '2704', '23811', '0'), +('5', '27', '20', '11601', '18780', '0'), +('5', '27', '20', '2918', '11282', '0'), +('5', '27', '20', '1365', '10500', '0'), +('5', '27', '12', '4835', '10490', '0'), +('5', '27', '12', '20655', '8294', '0'), +('5', '27', '12', '4845', '5992', '0'), +('5', '27', '12', '2923', '4758', '0'), +('5', '27', '18', '4836', '6925', '0'), +('5', '27', '18', '4846', '5554', '0'), +('5', '27', '18', '3145', '5147', '0'), +('5', '27', '18', '4346', '4645', '0'), +('5', '27', '19', '4837', '7459', '0'), +('5', '27', '19', '4847', '6379', '0'), +('5', '27', '19', '68239', '5504', '0'), +('5', '27', '19', '3146', '3699', '0'), +('5', '27', '13', '27707', '22442', '0'), +('5', '27', '13', '5401', '21322', '0'), +('5', '27', '13', '5622', '17980', '0'), +('5', '27', '13', '11609', '17623', '0'), +('5', '27', '14', '9402', '33278', '0'), +('5', '27', '14', '11678', '32840', '0'), +('5', '27', '14', '11632', '29534', '0'), +('5', '27', '14', '11551', '23853', '0'), +('5', '27', '11', '45137', '9659', '0'), +('5', '27', '11', '8408', '7645', '0'), +('5', '27', '11', '8325', '7489', '0'), +('5', '27', '11', '8811', '5856', '0'), +('5', '28', '22', '8567', '0', '0'), +('5', '28', '22', '10323', '0', '0'), +('5', '28', '22', '8504', '0', '0'), +('5', '28', '22', '9246', '0', '0'), +('5', '28', '1', '14701', '4854', '0'), +('5', '28', '1', '14702', '3550', '0'), +('5', '28', '1', '10082', '3021', '0'), +('5', '28', '1', '10165', '1940', '0'), +('5', '28', '2', '4841', '9847', '0'), +('5', '28', '2', '4301', '7726', '0'), +('5', '28', '2', '4831', '6547', '0'), +('5', '28', '2', '3140', '5183', '0'), +('5', '28', '3', '4322', '5343', '0'), +('5', '28', '3', '1544', '4978', '0'), +('5', '28', '3', '71529', '4022', '0'), +('5', '28', '3', '4505', '2220', '0'), +('5', '28', '5', '14703', '7150', '0'), +('5', '28', '5', '27705', '7018', '0'), +('5', '28', '5', '14700', '4806', '0'), +('5', '28', '5', '10055', '4760', '0'), +('5', '28', '8', '11621', '26579', '0'), +('5', '28', '8', '11551', '8753', '0'), +('5', '28', '8', '1409', '7747', '0'), +('5', '28', '8', '11603', '6933', '0'), +('5', '28', '6', '1557', '8270', '0'), +('5', '28', '6', '11699', '6586', '0'), +('5', '28', '6', '4302', '4108', '0'), +('5', '28', '6', '25062', '3672', '0'), +('5', '28', '17', '4832', '13306', '0'), +('5', '28', '17', '4842', '10883', '0'), +('5', '28', '17', '4309', '8225', '0'), +('5', '28', '17', '11623', '7848', '0'), +('5', '28', '7', '4833', '6478', '0'), +('5', '28', '7', '4843', '5389', '0'), +('5', '28', '7', '4343', '4971', '0'), +('5', '28', '7', '2458', '3718', '0'), +('5', '28', '9', '4834', '4408', '0'), +('5', '28', '9', '12189', '3471', '0'), +('5', '28', '9', '4844', '3355', '0'), +('5', '28', '9', '4344', '3046', '0'), +('5', '28', '15', '10366', '8054', '0'), +('5', '28', '15', '10151', '7200', '0'), +('5', '28', '15', '14679', '7010', '0'), +('5', '28', '15', '14678', '5708', '0'), +('5', '28', '20', '2704', '23833', '0'), +('5', '28', '20', '11601', '18834', '0'), +('5', '28', '20', '2918', '11300', '0'), +('5', '28', '20', '1365', '10500', '0'), +('5', '28', '12', '4835', '10518', '0'), +('5', '28', '12', '20655', '8312', '0'), +('5', '28', '12', '4845', '6010', '0'), +('5', '28', '12', '2923', '4758', '0'), +('5', '28', '18', '4836', '6952', '0'), +('5', '28', '18', '4846', '5554', '0'), +('5', '28', '18', '3145', '5196', '0'), +('5', '28', '18', '4346', '4645', '0'), +('5', '28', '19', '4837', '7478', '0'), +('5', '28', '19', '4847', '6406', '0'), +('5', '28', '19', '68239', '5515', '0'), +('5', '28', '19', '3146', '3715', '0'), +('5', '28', '13', '27707', '22682', '0'), +('5', '28', '13', '5401', '21492', '0'), +('5', '28', '13', '5622', '18150', '0'), +('5', '28', '13', '11609', '17793', '0'), +('5', '28', '14', '9402', '33305', '0'), +('5', '28', '14', '11678', '32840', '0'), +('5', '28', '14', '11632', '29616', '0'), +('5', '28', '14', '11551', '23853', '0'), +('5', '28', '11', '45137', '10068', '0'), +('5', '28', '11', '8408', '7721', '0'), +('5', '28', '11', '8325', '7574', '0'), +('5', '28', '11', '8811', '5922', '0'), +('5', '29', '22', '8567', '0', '0'), +('5', '29', '22', '10323', '0', '0'), +('5', '29', '22', '8504', '0', '0'), +('5', '29', '22', '9246', '0', '0'), +('5', '29', '1', '14701', '4854', '0'), +('5', '29', '1', '14702', '3550', '0'), +('5', '29', '1', '10082', '3043', '0'), +('5', '29', '1', '10165', '1940', '0'), +('5', '29', '2', '4841', '9880', '0'), +('5', '29', '2', '4301', '7726', '0'), +('5', '29', '2', '4831', '6565', '0'), +('5', '29', '2', '3140', '5201', '0'), +('5', '29', '3', '4322', '5343', '0'), +('5', '29', '3', '1544', '4996', '0'), +('5', '29', '3', '71529', '4042', '0'), +('5', '29', '3', '4505', '2246', '0'), +('5', '29', '5', '14703', '7150', '0'), +('5', '29', '5', '27705', '7068', '0'), +('5', '29', '5', '14700', '4806', '0'), +('5', '29', '5', '10055', '4760', '0'), +('5', '29', '8', '11621', '26579', '0'), +('5', '29', '8', '11551', '8753', '0'), +('5', '29', '8', '1409', '7747', '0'), +('5', '29', '8', '11603', '6966', '0'), +('5', '29', '6', '1557', '8270', '0'), +('5', '29', '6', '11699', '6640', '0'), +('5', '29', '6', '4302', '4137', '0'), +('5', '29', '6', '25062', '3672', '0'), +('5', '29', '17', '4832', '13379', '0'), +('5', '29', '17', '4842', '10926', '0'), +('5', '29', '17', '4309', '8225', '0'), +('5', '29', '17', '11623', '7848', '0'), +('5', '29', '7', '4833', '6478', '0'), +('5', '29', '7', '4843', '5389', '0'), +('5', '29', '7', '4343', '5019', '0'), +('5', '29', '7', '2458', '3732', '0'), +('5', '29', '9', '4834', '4408', '0'), +('5', '29', '9', '12189', '3471', '0'), +('5', '29', '9', '4844', '3365', '0'), +('5', '29', '9', '4344', '3046', '0'), +('5', '29', '15', '10366', '8054', '0'), +('5', '29', '15', '10151', '7200', '0'), +('5', '29', '15', '14679', '7010', '0'), +('5', '29', '15', '14678', '5708', '0'), +('5', '29', '20', '2704', '23855', '0'), +('5', '29', '20', '11601', '18882', '0'), +('5', '29', '20', '2918', '11318', '0'), +('5', '29', '20', '1365', '10500', '0'), +('5', '29', '12', '4835', '10542', '0'), +('5', '29', '12', '20655', '8329', '0'), +('5', '29', '12', '4845', '6028', '0'), +('5', '29', '12', '2923', '4758', '0'), +('5', '29', '18', '4836', '6976', '0'), +('5', '29', '18', '4846', '5554', '0'), +('5', '29', '18', '3145', '5239', '0'), +('5', '29', '18', '4346', '4645', '0'), +('5', '29', '19', '4837', '7496', '0'), +('5', '29', '19', '4847', '6430', '0'), +('5', '29', '19', '68239', '5525', '0'), +('5', '29', '19', '3146', '3730', '0'), +('5', '29', '13', '27707', '22949', '0'), +('5', '29', '13', '5401', '21633', '0'), +('5', '29', '13', '5622', '18348', '0'), +('5', '29', '13', '11609', '17992', '0'), +('5', '29', '14', '9402', '33330', '0'), +('5', '29', '14', '11678', '32840', '0'), +('5', '29', '14', '11632', '29689', '0'), +('5', '29', '14', '11551', '23853', '0'), +('5', '29', '11', '45137', '10524', '0'), +('5', '29', '11', '8408', '7796', '0'), +('5', '29', '11', '8325', '7650', '0'), +('5', '29', '11', '8811', '5978', '0'), +('5', '30', '22', '8567', '0', '0'), +('5', '30', '22', '10323', '0', '0'), +('5', '30', '22', '8504', '0', '0'), +('5', '30', '22', '9246', '0', '0'), +('5', '30', '1', '14701', '4854', '0'), +('5', '30', '1', '14702', '3550', '0'), +('5', '30', '1', '10082', '3064', '0'), +('5', '30', '1', '10165', '1940', '0'), +('5', '30', '2', '4841', '9912', '0'), +('5', '30', '2', '4301', '7726', '0'), +('5', '30', '2', '4831', '6584', '0'), +('5', '30', '2', '4620', '5232', '0'), +('5', '30', '3', '4322', '5343', '0'), +('5', '30', '3', '1544', '5014', '0'), +('5', '30', '3', '71529', '4064', '0'), +('5', '30', '3', '4505', '2271', '0'), +('5', '30', '5', '14703', '7150', '0'), +('5', '30', '5', '27705', '7119', '0'), +('5', '30', '5', '14700', '4806', '0'), +('5', '30', '5', '10055', '4760', '0'), +('5', '30', '8', '11621', '26579', '0'), +('5', '30', '8', '11551', '8753', '0'), +('5', '30', '8', '1409', '7747', '0'), +('5', '30', '8', '11603', '6998', '0'), +('5', '30', '6', '1557', '8270', '0'), +('5', '30', '6', '11699', '6694', '0'), +('5', '30', '6', '4302', '4170', '0'), +('5', '30', '6', '25062', '3672', '0'), +('5', '30', '17', '4832', '13460', '0'), +('5', '30', '17', '4842', '10975', '0'), +('5', '30', '17', '4309', '8225', '0'), +('5', '30', '17', '11623', '7848', '0'), +('5', '30', '7', '4833', '6478', '0'), +('5', '30', '7', '4843', '5389', '0'), +('5', '30', '7', '4343', '5074', '0'), +('5', '30', '7', '2458', '3747', '0'), +('5', '30', '9', '4834', '4408', '0'), +('5', '30', '9', '12189', '3471', '0'), +('5', '30', '9', '4844', '3376', '0'), +('5', '30', '9', '4344', '3046', '0'), +('5', '30', '15', '10366', '8054', '0'), +('5', '30', '15', '10151', '7200', '0'), +('5', '30', '15', '14679', '7010', '0'), +('5', '30', '15', '14678', '5708', '0'), +('5', '30', '20', '2704', '23876', '0'), +('5', '30', '20', '11601', '18937', '0'), +('5', '30', '20', '2918', '11336', '0'), +('5', '30', '20', '1365', '10500', '0'), +('5', '30', '12', '4835', '10569', '0'), +('5', '30', '12', '20655', '8347', '0'), +('5', '30', '12', '4845', '6046', '0'), +('5', '30', '12', '11624', '4789', '0'), +('5', '30', '18', '4836', '7003', '0'), +('5', '30', '18', '4846', '5554', '0'), +('5', '30', '18', '3145', '5288', '0'), +('5', '30', '18', '4346', '4645', '0'), +('5', '30', '19', '4837', '7514', '0'), +('5', '30', '19', '4847', '6457', '0'), +('5', '30', '19', '68239', '5536', '0'), +('5', '30', '19', '3146', '3746', '0'), +('5', '30', '13', '27707', '23189', '0'), +('5', '30', '13', '5401', '21775', '0'), +('5', '30', '13', '5622', '18547', '0'), +('5', '30', '13', '11609', '18190', '0'), +('5', '30', '14', '9402', '33357', '0'), +('5', '30', '14', '11678', '32840', '0'), +('5', '30', '14', '11632', '29770', '0'), +('5', '30', '14', '11551', '23853', '0'), +('5', '30', '11', '45137', '10947', '0'), +('5', '30', '11', '8408', '7872', '0'), +('5', '30', '11', '8325', '7735', '0'), +('5', '30', '11', '8811', '6044', '0'), +('5', '31', '22', '8567', '0', '0'), +('5', '31', '22', '10323', '0', '0'), +('5', '31', '22', '8504', '0', '0'), +('5', '31', '22', '9246', '0', '0'), +('5', '31', '1', '14701', '4854', '0'), +('5', '31', '1', '14702', '3550', '0'), +('5', '31', '1', '10082', '3086', '0'), +('5', '31', '1', '10165', '1940', '0'), +('5', '31', '2', '4841', '9945', '0'), +('5', '31', '2', '4301', '7726', '0'), +('5', '31', '2', '4831', '6602', '0'), +('5', '31', '2', '4620', '5271', '0'), +('5', '31', '3', '4322', '5343', '0'), +('5', '31', '3', '1544', '5032', '0'), +('5', '31', '3', '71529', '4085', '0'), +('5', '31', '3', '4505', '2296', '0'), +('5', '31', '5', '27705', '7170', '0'), +('5', '31', '5', '14703', '7150', '0'), +('5', '31', '5', '14700', '4806', '0'), +('5', '31', '5', '10055', '4760', '0'), +('5', '31', '8', '11621', '26579', '0'), +('5', '31', '8', '11551', '8753', '0'), +('5', '31', '8', '1409', '7747', '0'), +('5', '31', '8', '11603', '7031', '0'), +('5', '31', '6', '1557', '8270', '0'), +('5', '31', '6', '11699', '6749', '0'), +('5', '31', '6', '4302', '4203', '0'), +('5', '31', '6', '25062', '3672', '0'), +('5', '31', '17', '4832', '13542', '0'), +('5', '31', '17', '4842', '11024', '0'), +('5', '31', '17', '4309', '8225', '0'), +('5', '31', '17', '11623', '7848', '0'), +('5', '31', '7', '4833', '6478', '0'), +('5', '31', '7', '4843', '5389', '0'), +('5', '31', '7', '4343', '5128', '0'), +('5', '31', '7', '2458', '3761', '0'), +('5', '31', '9', '4834', '4408', '0'), +('5', '31', '9', '12189', '3471', '0'), +('5', '31', '9', '4844', '3387', '0'), +('5', '31', '9', '4344', '3046', '0'), +('5', '31', '15', '10366', '8054', '0'), +('5', '31', '15', '10151', '7200', '0'), +('5', '31', '15', '14679', '7010', '0'), +('5', '31', '15', '14678', '5708', '0'), +('5', '31', '20', '2704', '23898', '0'), +('5', '31', '20', '11601', '18991', '0'), +('5', '31', '20', '2918', '11354', '0'), +('5', '31', '20', '1365', '10500', '0'), +('5', '31', '12', '4835', '10596', '0'), +('5', '31', '12', '20655', '8365', '0'), +('5', '31', '12', '4845', '6064', '0'), +('5', '31', '12', '11624', '4827', '0'), +('5', '31', '18', '4836', '7031', '0'), +('5', '31', '18', '4846', '5554', '0'), +('5', '31', '18', '3145', '5337', '0'), +('5', '31', '18', '4346', '4645', '0'), +('5', '31', '19', '4837', '7532', '0'), +('5', '31', '19', '4847', '6484', '0'), +('5', '31', '19', '68239', '5547', '0'), +('5', '31', '19', '3146', '3762', '0'), +('5', '31', '13', '27707', '23428', '0'), +('5', '31', '13', '5401', '21917', '0'), +('5', '31', '13', '5622', '18717', '0'), +('5', '31', '13', '11609', '18360', '0'), +('5', '31', '14', '9402', '33384', '0'), +('5', '31', '14', '11678', '32840', '0'), +('5', '31', '14', '11632', '29852', '0'), +('5', '31', '14', '11551', '23853', '0'), +('5', '31', '11', '45137', '11496', '0'), +('5', '31', '11', '8408', '7948', '0'), +('5', '31', '11', '8325', '7811', '0'), +('5', '31', '11', '8811', '6101', '0'), +('5', '32', '22', '8567', '0', '0'), +('5', '32', '22', '10323', '0', '0'), +('5', '32', '22', '8504', '0', '0'), +('5', '32', '22', '9246', '0', '0'), +('5', '32', '1', '14701', '4854', '0'), +('5', '32', '1', '14702', '3550', '0'), +('5', '32', '1', '10082', '3108', '0'), +('5', '32', '1', '10165', '1940', '0'), +('5', '32', '2', '4841', '9978', '0'), +('5', '32', '2', '4301', '7726', '0'), +('5', '32', '2', '4831', '6620', '0'), +('5', '32', '2', '4620', '5304', '0'), +('5', '32', '3', '4322', '5343', '0'), +('5', '32', '3', '1544', '5051', '0'), +('5', '32', '3', '71529', '4105', '0'), +('5', '32', '3', '4505', '2322', '0'), +('5', '32', '5', '27705', '7221', '0'), +('5', '32', '5', '14703', '7150', '0'), +('5', '32', '5', '14700', '4806', '0'), +('5', '32', '5', '10055', '4760', '0'), +('5', '32', '8', '11621', '26579', '0'), +('5', '32', '8', '11551', '8753', '0'), +('5', '32', '8', '1409', '7747', '0'), +('5', '32', '8', '11603', '7064', '0'), +('5', '32', '6', '1557', '8270', '0'), +('5', '32', '6', '11699', '6803', '0'), +('5', '32', '6', '4302', '4232', '0'), +('5', '32', '6', '25062', '3672', '0'), +('5', '32', '17', '4832', '13614', '0'), +('5', '32', '17', '4842', '11068', '0'), +('5', '32', '17', '4309', '8225', '0'), +('5', '32', '17', '11623', '7848', '0'), +('5', '32', '7', '4833', '6478', '0'), +('5', '32', '7', '4843', '5389', '0'), +('5', '32', '7', '4343', '5176', '0'), +('5', '32', '7', '2458', '3776', '0'), +('5', '32', '9', '4834', '4408', '0'), +('5', '32', '9', '12189', '3471', '0'), +('5', '32', '9', '4844', '3398', '0'), +('5', '32', '9', '4344', '3046', '0'), +('5', '32', '15', '10366', '8054', '0'), +('5', '32', '15', '10151', '7200', '0'), +('5', '32', '15', '14679', '7010', '0'), +('5', '32', '15', '14678', '5708', '0'), +('5', '32', '20', '2704', '23920', '0'), +('5', '32', '20', '11601', '19039', '0'), +('5', '32', '20', '2918', '11372', '0'), +('5', '32', '20', '1365', '10500', '0'), +('5', '32', '12', '4835', '10620', '0'), +('5', '32', '12', '20655', '8382', '0'), +('5', '32', '12', '4845', '6082', '0'), +('5', '32', '12', '11624', '4861', '0'), +('5', '32', '18', '4836', '7055', '0'), +('5', '32', '18', '4846', '5554', '0'), +('5', '32', '18', '3145', '5380', '0'), +('5', '32', '18', '4346', '4645', '0'), +('5', '32', '19', '4837', '7550', '0'), +('5', '32', '19', '4847', '6509', '0'), +('5', '32', '19', '68239', '5558', '0'), +('5', '32', '19', '3146', '3777', '0'), +('5', '32', '13', '27707', '23667', '0'), +('5', '32', '13', '5401', '22058', '0'), +('5', '32', '13', '5622', '18915', '0'), +('5', '32', '13', '11609', '18558', '0'), +('5', '32', '14', '9402', '33408', '0'), +('5', '32', '14', '11678', '32840', '0'), +('5', '32', '14', '11632', '29924', '0'), +('5', '32', '14', '11551', '23853', '0'), +('5', '32', '11', '45137', '11922', '0'), +('5', '32', '11', '8408', '8023', '0'), +('5', '32', '11', '8325', '7886', '0'), +('5', '32', '11', '8811', '6167', '0'), +('5', '33', '22', '8567', '0', '0'), +('5', '33', '22', '10323', '0', '0'), +('5', '33', '22', '8504', '0', '0'), +('5', '33', '22', '9246', '0', '0'), +('5', '33', '1', '14701', '4854', '0'), +('5', '33', '1', '14702', '3550', '0'), +('5', '33', '1', '10082', '3130', '0'), +('5', '33', '1', '10165', '1940', '0'), +('5', '33', '2', '4841', '10010', '0'), +('5', '33', '2', '4301', '7726', '0'), +('5', '33', '2', '4831', '6638', '0'), +('5', '33', '2', '4620', '5342', '0'), +('5', '33', '3', '4322', '5343', '0'), +('5', '33', '3', '1544', '5069', '0'), +('5', '33', '3', '71529', '4126', '0'), +('5', '33', '3', '4505', '2347', '0'), +('5', '33', '5', '27705', '7271', '0'), +('5', '33', '5', '14703', '7150', '0'), +('5', '33', '5', '14700', '4806', '0'), +('5', '33', '5', '10055', '4760', '0'), +('5', '33', '8', '11621', '26579', '0'), +('5', '33', '8', '11551', '8753', '0'), +('5', '33', '8', '1409', '7747', '0'), +('5', '33', '8', '11603', '7096', '0'), +('5', '33', '6', '1557', '8270', '0'), +('5', '33', '6', '11699', '6857', '0'), +('5', '33', '6', '4302', '4264', '0'), +('5', '33', '6', '25062', '3672', '0'), +('5', '33', '17', '4832', '13696', '0'), +('5', '33', '17', '4842', '11117', '0'), +('5', '33', '17', '4309', '8225', '0'), +('5', '33', '17', '11623', '7848', '0'), +('5', '33', '7', '4833', '6478', '0'), +('5', '33', '7', '4843', '5389', '0'), +('5', '33', '7', '4343', '5231', '0'), +('5', '33', '7', '2458', '3790', '0'), +('5', '33', '9', '4834', '4408', '0'), +('5', '33', '9', '12189', '3471', '0'), +('5', '33', '9', '4844', '3409', '0'), +('5', '33', '9', '4344', '3046', '0'), +('5', '33', '15', '10366', '8054', '0'), +('5', '33', '15', '10151', '7200', '0'), +('5', '33', '15', '14679', '7010', '0'), +('5', '33', '15', '14678', '5708', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '33', '20', '2704', '23942', '0'), +('5', '33', '20', '11601', '19094', '0'), +('5', '33', '20', '2918', '11390', '0'), +('5', '33', '20', '1365', '10500', '0'), +('5', '33', '12', '4835', '10647', '0'), +('5', '33', '12', '20655', '8400', '0'), +('5', '33', '12', '4845', '6100', '0'), +('5', '33', '12', '11624', '4899', '0'), +('5', '33', '18', '4836', '7082', '0'), +('5', '33', '18', '4846', '5554', '0'), +('5', '33', '18', '3145', '5429', '0'), +('5', '33', '18', '4346', '4645', '0'), +('5', '33', '19', '4837', '7568', '0'), +('5', '33', '19', '4847', '6536', '0'), +('5', '33', '19', '68239', '5569', '0'), +('5', '33', '19', '3146', '3793', '0'), +('5', '33', '13', '27707', '23935', '0'), +('5', '33', '13', '5401', '22200', '0'), +('5', '33', '13', '5622', '19113', '0'), +('5', '33', '13', '11609', '18728', '0'), +('5', '33', '14', '9402', '33435', '0'), +('5', '33', '14', '11678', '32840', '0'), +('5', '33', '14', '11632', '30006', '0'), +('5', '33', '14', '11551', '23853', '0'), +('5', '33', '11', '45137', '12410', '0'), +('5', '33', '11', '8408', '8108', '0'), +('5', '33', '11', '8325', '7971', '0'), +('5', '33', '11', '8811', '6233', '0'), +('5', '34', '22', '8567', '0', '0'), +('5', '34', '22', '10323', '0', '0'), +('5', '34', '22', '8504', '0', '0'), +('5', '34', '22', '9246', '0', '0'), +('5', '34', '1', '14701', '4854', '0'), +('5', '34', '1', '14702', '3550', '0'), +('5', '34', '1', '10082', '3151', '0'), +('5', '34', '1', '10165', '1940', '0'), +('5', '34', '2', '4841', '10043', '0'), +('5', '34', '2', '4301', '7726', '0'), +('5', '34', '2', '4831', '6656', '0'), +('5', '34', '2', '4620', '5380', '0'), +('5', '34', '3', '4322', '5343', '0'), +('5', '34', '3', '1544', '5087', '0'), +('5', '34', '3', '71529', '4148', '0'), +('5', '34', '3', '4505', '2373', '0'), +('5', '34', '5', '27705', '7322', '0'), +('5', '34', '5', '14703', '7150', '0'), +('5', '34', '5', '14700', '4806', '0'), +('5', '34', '5', '10055', '4760', '0'), +('5', '34', '8', '11621', '26579', '0'), +('5', '34', '8', '11551', '8753', '0'), +('5', '34', '8', '1409', '7747', '0'), +('5', '34', '8', '11603', '7129', '0'), +('5', '34', '6', '1557', '8270', '0'), +('5', '34', '6', '11699', '6912', '0'), +('5', '34', '6', '4302', '4297', '0'), +('5', '34', '6', '25062', '3672', '0'), +('5', '34', '17', '4832', '13777', '0'), +('5', '34', '17', '4842', '11166', '0'), +('5', '34', '17', '4309', '8225', '0'), +('5', '34', '17', '11623', '7848', '0'), +('5', '34', '7', '4833', '6478', '0'), +('5', '34', '7', '4843', '5389', '0'), +('5', '34', '7', '4343', '5285', '0'), +('5', '34', '7', '2458', '3805', '0'), +('5', '34', '9', '4834', '4408', '0'), +('5', '34', '9', '12189', '3471', '0'), +('5', '34', '9', '4844', '3420', '0'), +('5', '34', '9', '4344', '3046', '0'), +('5', '34', '15', '10366', '8054', '0'), +('5', '34', '15', '10151', '7200', '0'), +('5', '34', '15', '14679', '7010', '0'), +('5', '34', '15', '14678', '5708', '0'), +('5', '34', '20', '2704', '23963', '0'), +('5', '34', '20', '11601', '19148', '0'), +('5', '34', '20', '2918', '11409', '0'), +('5', '34', '20', '1365', '10500', '0'), +('5', '34', '12', '4835', '10675', '0'), +('5', '34', '12', '20655', '8418', '0'), +('5', '34', '12', '4845', '6119', '0'), +('5', '34', '12', '11624', '4937', '0'), +('5', '34', '18', '4836', '7109', '0'), +('5', '34', '18', '4846', '5554', '0'), +('5', '34', '18', '3145', '5478', '0'), +('5', '34', '18', '4346', '4645', '0'), +('5', '34', '19', '4837', '7586', '0'), +('5', '34', '19', '4847', '6563', '0'), +('5', '34', '19', '68239', '5580', '0'), +('5', '34', '19', '3146', '3809', '0'), +('5', '34', '13', '27707', '24174', '0'), +('5', '34', '13', '5401', '22342', '0'), +('5', '34', '13', '5622', '19283', '0'), +('5', '34', '13', '11609', '18927', '0'), +('5', '34', '14', '9402', '33462', '0'), +('5', '34', '14', '11678', '32840', '0'), +('5', '34', '14', '11632', '30087', '0'), +('5', '34', '14', '11551', '23853', '0'), +('5', '34', '11', '45137', '12853', '0'), +('5', '34', '11', '8408', '8184', '0'), +('5', '34', '11', '8325', '8047', '0'), +('5', '34', '11', '8811', '6290', '0'), +('5', '35', '22', '8567', '0', '0'), +('5', '35', '22', '10323', '0', '0'), +('5', '35', '22', '8504', '0', '0'), +('5', '35', '22', '9246', '0', '0'), +('5', '35', '1', '14701', '4854', '0'), +('5', '35', '1', '14702', '3550', '0'), +('5', '35', '1', '10082', '3173', '0'), +('5', '35', '1', '10165', '1940', '0'), +('5', '35', '2', '4841', '10076', '0'), +('5', '35', '2', '4301', '7726', '0'), +('5', '35', '2', '4831', '6674', '0'), +('5', '35', '2', '4620', '5418', '0'), +('5', '35', '3', '4322', '5343', '0'), +('5', '35', '3', '1544', '5105', '0'), +('5', '35', '3', '71529', '4170', '0'), +('5', '35', '3', '4505', '2398', '0'), +('5', '35', '5', '27705', '7373', '0'), +('5', '35', '5', '14703', '7150', '0'), +('5', '35', '5', '14700', '4806', '0'), +('5', '35', '5', '10055', '4760', '0'), +('5', '35', '8', '11621', '26579', '0'), +('5', '35', '8', '11551', '8753', '0'), +('5', '35', '8', '1409', '7747', '0'), +('5', '35', '8', '11603', '7162', '0'), +('5', '35', '6', '1557', '8270', '0'), +('5', '35', '6', '11699', '6966', '0'), +('5', '35', '6', '4302', '4329', '0'), +('5', '35', '6', '25062', '3672', '0'), +('5', '35', '17', '4832', '13859', '0'), +('5', '35', '17', '4842', '11214', '0'), +('5', '35', '17', '4309', '8225', '0'), +('5', '35', '17', '11623', '7848', '0'), +('5', '35', '7', '4833', '6478', '0'), +('5', '35', '7', '4843', '5389', '0'), +('5', '35', '7', '4343', '5339', '0'), +('5', '35', '7', '2458', '3819', '0'), +('5', '35', '9', '4834', '4408', '0'), +('5', '35', '9', '12189', '3471', '0'), +('5', '35', '9', '4844', '3431', '0'), +('5', '35', '9', '4344', '3046', '0'), +('5', '35', '15', '10366', '8054', '0'), +('5', '35', '15', '10151', '7200', '0'), +('5', '35', '15', '14679', '7010', '0'), +('5', '35', '15', '14678', '5708', '0'), +('5', '35', '20', '2704', '23985', '0'), +('5', '35', '20', '11601', '19203', '0'), +('5', '35', '20', '2918', '11427', '0'), +('5', '35', '20', '1365', '10500', '0'), +('5', '35', '12', '4835', '10702', '0'), +('5', '35', '12', '20655', '8436', '0'), +('5', '35', '12', '4845', '6137', '0'), +('5', '35', '12', '11624', '4975', '0'), +('5', '35', '18', '4836', '7136', '0'), +('5', '35', '18', '4846', '5554', '0'), +('5', '35', '18', '3145', '5527', '0'), +('5', '35', '18', '4346', '4645', '0'), +('5', '35', '19', '4837', '7604', '0'), +('5', '35', '19', '4847', '6590', '0'), +('5', '35', '19', '68239', '5591', '0'), +('5', '35', '19', '3146', '3826', '0'), +('5', '35', '13', '27707', '24414', '0'), +('5', '35', '13', '5401', '22483', '0'), +('5', '35', '13', '5622', '19482', '0'), +('5', '35', '13', '11609', '19125', '0'), +('5', '35', '14', '9402', '33490', '0'), +('5', '35', '14', '11678', '32840', '0'), +('5', '35', '14', '11632', '30169', '0'), +('5', '35', '14', '11551', '23853', '0'), +('5', '35', '11', '45137', '13431', '0'), +('5', '35', '11', '8408', '8259', '0'), +('5', '35', '11', '8325', '8132', '0'), +('5', '35', '11', '8811', '6356', '0'), +('5', '36', '22', '8567', '0', '0'), +('5', '36', '22', '10323', '0', '0'), +('5', '36', '22', '8504', '0', '0'), +('5', '36', '22', '9246', '0', '0'), +('5', '36', '1', '14701', '4854', '0'), +('5', '36', '1', '14702', '3550', '0'), +('5', '36', '1', '10082', '3195', '0'), +('5', '36', '1', '10165', '1940', '0'), +('5', '36', '2', '4841', '10108', '0'), +('5', '36', '2', '4301', '7726', '0'), +('5', '36', '2', '4831', '6692', '0'), +('5', '36', '2', '4620', '5457', '0'), +('5', '36', '3', '4322', '5343', '0'), +('5', '36', '3', '1544', '5123', '0'), +('5', '36', '3', '71529', '4192', '0'), +('5', '36', '3', '4505', '2423', '0'), +('5', '36', '5', '27705', '7424', '0'), +('5', '36', '5', '14703', '7150', '0'), +('5', '36', '5', '14700', '4806', '0'), +('5', '36', '5', '10055', '4760', '0'), +('5', '36', '8', '11621', '26579', '0'), +('5', '36', '8', '11551', '8753', '0'), +('5', '36', '8', '1409', '7747', '0'), +('5', '36', '8', '11603', '7194', '0'), +('5', '36', '6', '1557', '8270', '0'), +('5', '36', '6', '11699', '7021', '0'), +('5', '36', '6', '4302', '4362', '0'), +('5', '36', '6', '25062', '3672', '0'), +('5', '36', '17', '4832', '13940', '0'), +('5', '36', '17', '4842', '11263', '0'), +('5', '36', '17', '4309', '8225', '0'), +('5', '36', '17', '3141', '7863', '0'), +('5', '36', '7', '4833', '6478', '0'), +('5', '36', '7', '4343', '5394', '0'), +('5', '36', '7', '4843', '5389', '0'), +('5', '36', '7', '2458', '3834', '0'), +('5', '36', '9', '4834', '4408', '0'), +('5', '36', '9', '12189', '3471', '0'), +('5', '36', '9', '4844', '3442', '0'), +('5', '36', '9', '4344', '3046', '0'), +('5', '36', '15', '10366', '8054', '0'), +('5', '36', '15', '10151', '7200', '0'), +('5', '36', '15', '14679', '7010', '0'), +('5', '36', '15', '14678', '5708', '0'), +('5', '36', '20', '2704', '24007', '0'), +('5', '36', '20', '11601', '19257', '0'), +('5', '36', '20', '2918', '11445', '0'), +('5', '36', '20', '1365', '10500', '0'), +('5', '36', '12', '4835', '10729', '0'), +('5', '36', '12', '20655', '8454', '0'), +('5', '36', '12', '4845', '6155', '0'), +('5', '36', '12', '11624', '5013', '0'), +('5', '36', '18', '4836', '7163', '0'), +('5', '36', '18', '3145', '5576', '0'), +('5', '36', '18', '4846', '5554', '0'), +('5', '36', '18', '4346', '4645', '0'), +('5', '36', '19', '4837', '7623', '0'), +('5', '36', '19', '4847', '6617', '0'), +('5', '36', '19', '68239', '5602', '0'), +('5', '36', '19', '3146', '3842', '0'), +('5', '36', '13', '27707', '24653', '0'), +('5', '36', '13', '5401', '22653', '0'), +('5', '36', '13', '5622', '19680', '0'), +('5', '36', '13', '11609', '19295', '0'), +('5', '36', '14', '9402', '33517', '0'), +('5', '36', '14', '11678', '32840', '0'), +('5', '36', '14', '11632', '30250', '0'), +('5', '36', '14', '11551', '23853', '0'), +('5', '36', '11', '45137', '13898', '0'), +('5', '36', '11', '8408', '8335', '0'), +('5', '36', '11', '8325', '8207', '0'), +('5', '36', '11', '8811', '6422', '0'), +('5', '37', '22', '8567', '0', '0'), +('5', '37', '22', '10323', '0', '0'), +('5', '37', '22', '8504', '0', '0'), +('5', '37', '22', '9246', '0', '0'), +('5', '37', '1', '14701', '4854', '0'), +('5', '37', '1', '14702', '3550', '0'), +('5', '37', '1', '10082', '3217', '0'), +('5', '37', '1', '10165', '1940', '0'), +('5', '37', '2', '4841', '10141', '0'), +('5', '37', '2', '4301', '7726', '0'), +('5', '37', '2', '4831', '6710', '0'), +('5', '37', '2', '4620', '5495', '0'), +('5', '37', '3', '4322', '5343', '0'), +('5', '37', '3', '1544', '5141', '0'), +('5', '37', '3', '71529', '4213', '0'), +('5', '37', '3', '4505', '2449', '0'), +('5', '37', '5', '27705', '7474', '0'), +('5', '37', '5', '14703', '7150', '0'), +('5', '37', '5', '14700', '4806', '0'), +('5', '37', '5', '10055', '4760', '0'), +('5', '37', '8', '11621', '26579', '0'), +('5', '37', '8', '11551', '8753', '0'), +('5', '37', '8', '1409', '7747', '0'), +('5', '37', '8', '11603', '7227', '0'), +('5', '37', '6', '1557', '8270', '0'), +('5', '37', '6', '11699', '7075', '0'), +('5', '37', '6', '4302', '4395', '0'), +('5', '37', '6', '25062', '3672', '0'), +('5', '37', '17', '4832', '14022', '0'), +('5', '37', '17', '4842', '11312', '0'), +('5', '37', '17', '4309', '8225', '0'), +('5', '37', '17', '3141', '7918', '0'), +('5', '37', '7', '4833', '6478', '0'), +('5', '37', '7', '4343', '5448', '0'), +('5', '37', '7', '4843', '5389', '0'), +('5', '37', '7', '2458', '3848', '0'), +('5', '37', '9', '4834', '4408', '0'), +('5', '37', '9', '12189', '3471', '0'), +('5', '37', '9', '4844', '3452', '0'), +('5', '37', '9', '4344', '3046', '0'), +('5', '37', '15', '10366', '8054', '0'), +('5', '37', '15', '10151', '7200', '0'), +('5', '37', '15', '14679', '7010', '0'), +('5', '37', '15', '14678', '5708', '0'), +('5', '37', '20', '2704', '24029', '0'), +('5', '37', '20', '11601', '19311', '0'), +('5', '37', '20', '2918', '11463', '0'), +('5', '37', '20', '1365', '10500', '0'), +('5', '37', '12', '4835', '10756', '0'), +('5', '37', '12', '20655', '8473', '0'), +('5', '37', '12', '4845', '6173', '0'), +('5', '37', '12', '11624', '5051', '0'), +('5', '37', '18', '4836', '7191', '0'), +('5', '37', '18', '3145', '5625', '0'), +('5', '37', '18', '4846', '5554', '0'), +('5', '37', '18', '4346', '4645', '0'), +('5', '37', '19', '4837', '7641', '0'), +('5', '37', '19', '4847', '6644', '0'), +('5', '37', '19', '68239', '5612', '0'), +('5', '37', '19', '3146', '3858', '0'), +('5', '37', '13', '27707', '24921', '0'), +('5', '37', '13', '5401', '22795', '0'), +('5', '37', '13', '45120', '20081', '0'), +('5', '37', '13', '5622', '19850', '0'), +('5', '37', '14', '9402', '33544', '0'), +('5', '37', '14', '11678', '32840', '0'), +('5', '37', '14', '11632', '30332', '0'), +('5', '37', '14', '11551', '23853', '0'), +('5', '37', '11', '45137', '14405', '0'), +('5', '37', '11', '8408', '8410', '0'), +('5', '37', '11', '8325', '8292', '0'), +('5', '37', '11', '8811', '6479', '0'), +('5', '38', '22', '8567', '0', '0'), +('5', '38', '22', '10323', '0', '0'), +('5', '38', '22', '8504', '0', '0'), +('5', '38', '22', '9246', '0', '0'), +('5', '38', '1', '14701', '4854', '0'), +('5', '38', '1', '14702', '3550', '0'), +('5', '38', '1', '10082', '3238', '0'), +('5', '38', '1', '10165', '1940', '0'), +('5', '38', '2', '4841', '10173', '0'), +('5', '38', '2', '4301', '7726', '0'), +('5', '38', '2', '4831', '6729', '0'), +('5', '38', '2', '4620', '5533', '0'), +('5', '38', '3', '4322', '5343', '0'), +('5', '38', '3', '1544', '5159', '0'), +('5', '38', '3', '71529', '4235', '0'), +('5', '38', '3', '4505', '2474', '0'), +('5', '38', '5', '27705', '7525', '0'), +('5', '38', '5', '14703', '7150', '0'), +('5', '38', '5', '14700', '4806', '0'), +('5', '38', '5', '10055', '4760', '0'), +('5', '38', '8', '11621', '26579', '0'), +('5', '38', '8', '11551', '8753', '0'), +('5', '38', '8', '1409', '7747', '0'), +('5', '38', '8', '11603', '7259', '0'), +('5', '38', '6', '1557', '8270', '0'), +('5', '38', '6', '11699', '7129', '0'), +('5', '38', '6', '4302', '4427', '0'), +('5', '38', '6', '25062', '3672', '0'), +('5', '38', '17', '4832', '14103', '0'), +('5', '38', '17', '4842', '11361', '0'), +('5', '38', '17', '4309', '8225', '0'), +('5', '38', '17', '3141', '7972', '0'), +('5', '38', '7', '4833', '6478', '0'), +('5', '38', '7', '4343', '5502', '0'), +('5', '38', '7', '4843', '5389', '0'), +('5', '38', '7', '2458', '3863', '0'), +('5', '38', '9', '4834', '4408', '0'), +('5', '38', '9', '12189', '3471', '0'), +('5', '38', '9', '4844', '3463', '0'), +('5', '38', '9', '4344', '3046', '0'), +('5', '38', '15', '10366', '8054', '0'), +('5', '38', '15', '10151', '7200', '0'), +('5', '38', '15', '14679', '7010', '0'), +('5', '38', '15', '14678', '5708', '0'), +('5', '38', '20', '2704', '24050', '0'), +('5', '38', '20', '11601', '19366', '0'), +('5', '38', '20', '2918', '11481', '0'), +('5', '38', '20', '1365', '10500', '0'), +('5', '38', '12', '4835', '10783', '0'), +('5', '38', '12', '20655', '8491', '0'), +('5', '38', '12', '4845', '6191', '0'), +('5', '38', '12', '11624', '5089', '0'), +('5', '38', '18', '4836', '7218', '0'), +('5', '38', '18', '3145', '5674', '0'), +('5', '38', '18', '4846', '5554', '0'), +('5', '38', '18', '4346', '4645', '0'), +('5', '38', '19', '4837', '7659', '0'), +('5', '38', '19', '4847', '6672', '0'), +('5', '38', '19', '68239', '5623', '0'), +('5', '38', '19', '3146', '3875', '0'), +('5', '38', '13', '27707', '25160', '0'), +('5', '38', '13', '5401', '22937', '0'), +('5', '38', '13', '45120', '20899', '0'), +('5', '38', '13', '5622', '20048', '0'), +('5', '38', '14', '9402', '33571', '0'), +('5', '38', '14', '11678', '32840', '0'), +('5', '38', '14', '11632', '30413', '0'), +('5', '38', '14', '11551', '23853', '0'), +('5', '38', '11', '45137', '14878', '0'), +('5', '38', '11', '8408', '8486', '0'), +('5', '38', '11', '8325', '8368', '0'), +('5', '38', '11', '8811', '6545', '0'), +('5', '39', '22', '8567', '0', '0'), +('5', '39', '22', '10323', '0', '0'), +('5', '39', '22', '8504', '0', '0'), +('5', '39', '22', '9246', '0', '0'), +('5', '39', '1', '14701', '4854', '0'), +('5', '39', '1', '14702', '3550', '0'), +('5', '39', '1', '10082', '3260', '0'), +('5', '39', '1', '10165', '1940', '0'), +('5', '39', '2', '4841', '10206', '0'), +('5', '39', '2', '4301', '7726', '0'), +('5', '39', '2', '4831', '6747', '0'), +('5', '39', '2', '4620', '5571', '0'), +('5', '39', '3', '4322', '5343', '0'), +('5', '39', '3', '1544', '5177', '0'), +('5', '39', '3', '71529', '4257', '0'), +('5', '39', '3', '4505', '2499', '0'), +('5', '39', '5', '27705', '7576', '0'), +('5', '39', '5', '14703', '7150', '0'), +('5', '39', '5', '14700', '4806', '0'), +('5', '39', '5', '10055', '4760', '0'), +('5', '39', '8', '11621', '26579', '0'), +('5', '39', '8', '11551', '8753', '0'), +('5', '39', '8', '1409', '7747', '0'), +('5', '39', '8', '11603', '7292', '0'), +('5', '39', '6', '1557', '8270', '0'), +('5', '39', '6', '11699', '7184', '0'), +('5', '39', '6', '4302', '4460', '0'), +('5', '39', '6', '25062', '3672', '0'), +('5', '39', '17', '4832', '14185', '0'), +('5', '39', '17', '4842', '11410', '0'), +('5', '39', '17', '4309', '8225', '0'), +('5', '39', '17', '3141', '8027', '0'), +('5', '39', '7', '4833', '6478', '0'), +('5', '39', '7', '4343', '5557', '0'), +('5', '39', '7', '4843', '5389', '0'), +('5', '39', '7', '2458', '3877', '0'), +('5', '39', '9', '4834', '4408', '0'), +('5', '39', '9', '4844', '3474', '0'), +('5', '39', '9', '12189', '3471', '0'), +('5', '39', '9', '4344', '3046', '0'), +('5', '39', '15', '10366', '8054', '0'), +('5', '39', '15', '10151', '7200', '0'), +('5', '39', '15', '14679', '7010', '0'), +('5', '39', '15', '14678', '5708', '0'), +('5', '39', '20', '2704', '24072', '0'), +('5', '39', '20', '11601', '19420', '0'), +('5', '39', '20', '2918', '11499', '0'), +('5', '39', '20', '1365', '10500', '0'), +('5', '39', '12', '4835', '10810', '0'), +('5', '39', '12', '20655', '8509', '0'), +('5', '39', '12', '4845', '6209', '0'), +('5', '39', '12', '11624', '5127', '0'), +('5', '39', '18', '4836', '7245', '0'), +('5', '39', '18', '3145', '5723', '0'), +('5', '39', '18', '4846', '5554', '0'), +('5', '39', '18', '4346', '4645', '0'), +('5', '39', '19', '4837', '7677', '0'), +('5', '39', '19', '4847', '6699', '0'), +('5', '39', '19', '68239', '5634', '0'), +('5', '39', '19', '3146', '3891', '0'), +('5', '39', '13', '27707', '25400', '0'), +('5', '39', '13', '5401', '23078', '0'), +('5', '39', '13', '45120', '21549', '0'), +('5', '39', '13', '5622', '20247', '0'), +('5', '39', '14', '9402', '33598', '0'), +('5', '39', '14', '11678', '32840', '0'), +('5', '39', '14', '11632', '30495', '0'), +('5', '39', '14', '11551', '23853', '0'), +('5', '39', '11', '45137', '15485', '0'), +('5', '39', '11', '8408', '8561', '0'), +('5', '39', '11', '8325', '8453', '0'), +('5', '39', '11', '8811', '6602', '0'), +('5', '40', '22', '8567', '0', '0'), +('5', '40', '22', '10323', '0', '0'), +('5', '40', '22', '8504', '0', '0'), +('5', '40', '22', '9246', '0', '0'), +('5', '40', '1', '14701', '4854', '0'), +('5', '40', '1', '14702', '3550', '0'), +('5', '40', '1', '10082', '3282', '0'), +('5', '40', '1', '10165', '1940', '0'), +('5', '40', '2', '4841', '10239', '0'), +('5', '40', '2', '4301', '7726', '0'), +('5', '40', '2', '4831', '6765', '0'), +('5', '40', '2', '4620', '5609', '0'), +('5', '40', '3', '4322', '5343', '0'), +('5', '40', '3', '1544', '5196', '0'), +('5', '40', '3', '71529', '4279', '0'), +('5', '40', '3', '4505', '2525', '0'), +('5', '40', '5', '27705', '7627', '0'), +('5', '40', '5', '14703', '7150', '0'), +('5', '40', '5', '14700', '4806', '0'), +('5', '40', '5', '10055', '4760', '0'), +('5', '40', '8', '11621', '26579', '0'), +('5', '40', '8', '11551', '8753', '0'), +('5', '40', '8', '1409', '7747', '0'), +('5', '40', '8', '11603', '7325', '0'), +('5', '40', '6', '1557', '8270', '0'), +('5', '40', '6', '11699', '7238', '0'), +('5', '40', '6', '4302', '4493', '0'), +('5', '40', '6', '25062', '3672', '0'), +('5', '40', '17', '4832', '14266', '0'), +('5', '40', '17', '4842', '11459', '0'), +('5', '40', '17', '4309', '8225', '0'), +('5', '40', '17', '3141', '8081', '0'), +('5', '40', '7', '4833', '6478', '0'), +('5', '40', '7', '4343', '5611', '0'), +('5', '40', '7', '4843', '5389', '0'), +('5', '40', '7', '2458', '3892', '0'), +('5', '40', '9', '4834', '4408', '0'), +('5', '40', '9', '4844', '3485', '0'), +('5', '40', '9', '12189', '3471', '0'), +('5', '40', '9', '4311', '3057', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '40', '15', '10366', '8054', '0'), +('5', '40', '15', '10151', '7200', '0'), +('5', '40', '15', '14679', '7010', '0'), +('5', '40', '15', '14678', '5708', '0'), +('5', '40', '20', '2704', '24094', '0'), +('5', '40', '20', '11601', '19474', '0'), +('5', '40', '20', '2918', '11517', '0'), +('5', '40', '20', '1365', '10500', '0'), +('5', '40', '12', '4835', '10838', '0'), +('5', '40', '12', '20655', '8527', '0'), +('5', '40', '12', '4845', '6227', '0'), +('5', '40', '12', '11624', '5165', '0'), +('5', '40', '18', '4836', '7272', '0'), +('5', '40', '18', '3145', '5772', '0'), +('5', '40', '18', '4846', '5554', '0'), +('5', '40', '18', '4346', '4645', '0'), +('5', '40', '19', '4837', '7695', '0'), +('5', '40', '19', '4847', '6726', '0'), +('5', '40', '19', '68239', '5645', '0'), +('5', '40', '19', '3146', '3907', '0'), +('5', '40', '13', '27707', '25639', '0'), +('5', '40', '13', '5401', '23220', '0'), +('5', '40', '13', '45120', '22370', '0'), +('5', '40', '13', '5622', '20417', '0'), +('5', '40', '14', '9402', '33625', '0'), +('5', '40', '14', '11678', '32840', '0'), +('5', '40', '14', '11632', '30576', '0'), +('5', '40', '14', '11551', '23853', '0'), +('5', '40', '11', '45137', '15972', '0'), +('5', '40', '11', '8408', '8637', '0'), +('5', '40', '11', '8325', '8528', '0'), +('5', '40', '11', '8811', '6668', '0'), +('5', '41', '22', '8567', '0', '0'), +('5', '41', '22', '10323', '0', '0'), +('5', '41', '22', '8504', '0', '0'), +('5', '41', '22', '9246', '0', '0'), +('5', '41', '1', '14701', '4854', '0'), +('5', '41', '1', '14702', '3550', '0'), +('5', '41', '1', '10082', '3304', '0'), +('5', '41', '1', '10165', '1940', '0'), +('5', '41', '2', '4841', '10271', '0'), +('5', '41', '2', '4301', '7726', '0'), +('5', '41', '2', '4831', '6783', '0'), +('5', '41', '2', '4620', '5647', '0'), +('5', '41', '3', '4322', '5343', '0'), +('5', '41', '3', '1544', '5214', '0'), +('5', '41', '3', '71529', '4300', '0'), +('5', '41', '3', '4505', '2550', '0'), +('5', '41', '5', '27705', '7677', '0'), +('5', '41', '5', '14703', '7150', '0'), +('5', '41', '5', '14700', '4806', '0'), +('5', '41', '5', '10055', '4760', '0'), +('5', '41', '8', '11621', '26579', '0'), +('5', '41', '8', '11551', '8753', '0'), +('5', '41', '8', '1409', '7747', '0'), +('5', '41', '8', '11603', '7357', '0'), +('5', '41', '6', '1557', '8270', '0'), +('5', '41', '6', '11699', '7292', '0'), +('5', '41', '6', '4302', '4525', '0'), +('5', '41', '6', '25062', '3672', '0'), +('5', '41', '17', '4832', '14348', '0'), +('5', '41', '17', '4842', '11508', '0'), +('5', '41', '17', '4309', '8225', '0'), +('5', '41', '17', '3141', '8135', '0'), +('5', '41', '7', '4833', '6478', '0'), +('5', '41', '7', '4343', '5666', '0'), +('5', '41', '7', '4843', '5389', '0'), +('5', '41', '7', '2458', '3906', '0'), +('5', '41', '9', '4834', '4408', '0'), +('5', '41', '9', '4844', '3496', '0'), +('5', '41', '9', '12189', '3471', '0'), +('5', '41', '9', '4311', '3095', '0'), +('5', '41', '15', '10366', '8054', '0'), +('5', '41', '15', '10151', '7200', '0'), +('5', '41', '15', '14679', '7010', '0'), +('5', '41', '15', '14678', '5708', '0'), +('5', '41', '20', '2704', '24116', '0'), +('5', '41', '20', '11601', '19529', '0'), +('5', '41', '20', '2918', '11535', '0'), +('5', '41', '20', '1365', '10500', '0'), +('5', '41', '12', '4835', '10865', '0'), +('5', '41', '12', '20655', '8545', '0'), +('5', '41', '12', '4845', '6245', '0'), +('5', '41', '12', '11624', '5203', '0'), +('5', '41', '18', '4836', '7299', '0'), +('5', '41', '18', '3145', '5821', '0'), +('5', '41', '18', '4846', '5554', '0'), +('5', '41', '18', '4346', '4645', '0'), +('5', '41', '19', '4837', '7713', '0'), +('5', '41', '19', '4847', '6753', '0'), +('5', '41', '19', '68239', '5656', '0'), +('5', '41', '19', '3146', '3924', '0'), +('5', '41', '13', '27707', '25907', '0'), +('5', '41', '13', '5401', '23362', '0'), +('5', '41', '13', '45120', '23022', '0'), +('5', '41', '13', '5622', '20615', '0'), +('5', '41', '14', '9402', '33653', '0'), +('5', '41', '14', '11678', '32840', '0'), +('5', '41', '14', '11632', '30658', '0'), +('5', '41', '14', '11551', '23853', '0'), +('5', '41', '11', '45137', '16555', '0'), +('5', '41', '11', '8408', '8713', '0'), +('5', '41', '11', '8325', '8613', '0'), +('5', '41', '11', '8811', '6734', '0'), +('5', '42', '22', '8567', '0', '0'), +('5', '42', '22', '10323', '0', '0'), +('5', '42', '22', '8504', '0', '0'), +('5', '42', '22', '9246', '0', '0'), +('5', '42', '1', '14701', '4854', '0'), +('5', '42', '1', '14702', '3550', '0'), +('5', '42', '1', '10082', '3325', '0'), +('5', '42', '1', '10165', '1940', '0'), +('5', '42', '2', '4841', '10304', '0'), +('5', '42', '2', '4301', '7726', '0'), +('5', '42', '2', '4831', '6801', '0'), +('5', '42', '2', '4620', '5685', '0'), +('5', '42', '3', '4322', '5343', '0'), +('5', '42', '3', '1544', '5232', '0'), +('5', '42', '3', '71529', '4322', '0'), +('5', '42', '3', '4505', '2575', '0'), +('5', '42', '5', '27705', '7728', '0'), +('5', '42', '5', '14703', '7150', '0'), +('5', '42', '5', '14700', '4806', '0'), +('5', '42', '5', '10055', '4760', '0'), +('5', '42', '8', '11621', '26579', '0'), +('5', '42', '8', '11551', '8753', '0'), +('5', '42', '8', '1409', '7747', '0'), +('5', '42', '8', '11603', '7390', '0'), +('5', '42', '6', '1557', '8270', '0'), +('5', '42', '6', '11699', '7347', '0'), +('5', '42', '6', '4302', '4558', '0'), +('5', '42', '6', '25062', '3672', '0'), +('5', '42', '17', '4832', '14430', '0'), +('5', '42', '17', '4842', '11557', '0'), +('5', '42', '17', '4309', '8225', '0'), +('5', '42', '17', '3141', '8190', '0'), +('5', '42', '7', '4833', '6478', '0'), +('5', '42', '7', '4343', '5720', '0'), +('5', '42', '7', '4843', '5389', '0'), +('5', '42', '7', '2458', '3921', '0'), +('5', '42', '9', '4834', '4408', '0'), +('5', '42', '9', '4844', '3507', '0'), +('5', '42', '9', '12189', '3471', '0'), +('5', '42', '9', '4311', '3133', '0'), +('5', '42', '15', '10366', '8054', '0'), +('5', '42', '15', '10151', '7200', '0'), +('5', '42', '15', '14679', '7010', '0'), +('5', '42', '15', '14678', '5708', '0'), +('5', '42', '20', '2704', '24137', '0'), +('5', '42', '20', '11601', '19583', '0'), +('5', '42', '20', '2918', '11554', '0'), +('5', '42', '20', '1365', '10500', '0'), +('5', '42', '12', '4835', '10892', '0'), +('5', '42', '12', '20655', '8563', '0'), +('5', '42', '12', '4845', '6264', '0'), +('5', '42', '12', '11624', '5241', '0'), +('5', '42', '18', '4836', '7327', '0'), +('5', '42', '18', '3145', '5870', '0'), +('5', '42', '18', '4846', '5554', '0'), +('5', '42', '18', '4346', '4645', '0'), +('5', '42', '19', '4837', '7731', '0'), +('5', '42', '19', '4847', '6780', '0'), +('5', '42', '19', '68239', '5667', '0'), +('5', '42', '19', '3146', '3940', '0'), +('5', '42', '13', '27707', '26146', '0'), +('5', '42', '13', '45120', '23873', '0'), +('5', '42', '13', '5401', '23503', '0'), +('5', '42', '13', '5622', '20813', '0'), +('5', '42', '14', '9402', '33680', '0'), +('5', '42', '14', '11678', '32840', '0'), +('5', '42', '14', '11632', '30739', '0'), +('5', '42', '14', '11551', '23853', '0'), +('5', '42', '11', '45137', '17095', '0'), +('5', '42', '11', '8408', '8788', '0'), +('5', '42', '11', '8325', '8689', '0'), +('5', '42', '11', '8811', '6791', '0'), +('5', '43', '22', '8567', '0', '0'), +('5', '43', '22', '10323', '0', '0'), +('5', '43', '22', '8504', '0', '0'), +('5', '43', '22', '9246', '0', '0'), +('5', '43', '1', '14701', '4854', '0'), +('5', '43', '1', '14702', '3550', '0'), +('5', '43', '1', '10082', '3347', '0'), +('5', '43', '1', '10165', '1940', '0'), +('5', '43', '2', '4841', '10336', '0'), +('5', '43', '2', '4301', '7726', '0'), +('5', '43', '2', '4831', '6819', '0'), +('5', '43', '2', '4620', '5723', '0'), +('5', '43', '3', '4322', '5343', '0'), +('5', '43', '3', '1544', '5250', '0'), +('5', '43', '3', '71529', '4344', '0'), +('5', '43', '3', '4505', '2601', '0'), +('5', '43', '5', '27705', '7779', '0'), +('5', '43', '5', '14703', '7150', '0'), +('5', '43', '5', '14700', '4806', '0'), +('5', '43', '5', '10055', '4760', '0'), +('5', '43', '8', '11621', '26579', '0'), +('5', '43', '8', '11551', '8753', '0'), +('5', '43', '8', '1409', '7747', '0'), +('5', '43', '8', '11603', '7422', '0'), +('5', '43', '6', '1557', '8270', '0'), +('5', '43', '6', '11699', '7401', '0'), +('5', '43', '6', '4302', '4590', '0'), +('5', '43', '6', '25062', '3672', '0'), +('5', '43', '17', '4832', '14511', '0'), +('5', '43', '17', '4842', '11606', '0'), +('5', '43', '17', '3141', '8244', '0'), +('5', '43', '17', '4309', '8225', '0'), +('5', '43', '7', '4833', '6478', '0'), +('5', '43', '7', '4343', '5774', '0'), +('5', '43', '7', '4843', '5389', '0'), +('5', '43', '7', '2458', '3935', '0'), +('5', '43', '9', '4834', '4408', '0'), +('5', '43', '9', '4844', '3518', '0'), +('5', '43', '9', '12189', '3471', '0'), +('5', '43', '9', '4311', '3171', '0'), +('5', '43', '15', '10366', '8054', '0'), +('5', '43', '15', '10151', '7200', '0'), +('5', '43', '15', '14679', '7010', '0'), +('5', '43', '15', '14678', '5708', '0'), +('5', '43', '20', '2704', '24159', '0'), +('5', '43', '20', '11601', '19637', '0'), +('5', '43', '20', '2918', '11572', '0'), +('5', '43', '20', '1365', '10500', '0'), +('5', '43', '12', '4835', '10919', '0'), +('5', '43', '12', '20655', '8581', '0'), +('5', '43', '12', '4845', '6282', '0'), +('5', '43', '12', '11624', '5279', '0'), +('5', '43', '18', '4836', '7354', '0'), +('5', '43', '18', '3145', '5919', '0'), +('5', '43', '18', '4846', '5554', '0'), +('5', '43', '18', '4346', '4645', '0'), +('5', '43', '19', '4837', '7749', '0'), +('5', '43', '19', '4847', '6808', '0'), +('5', '43', '19', '68239', '5678', '0'), +('5', '43', '19', '3146', '3956', '0'), +('5', '43', '13', '27707', '26385', '0'), +('5', '43', '13', '45120', '24555', '0'), +('5', '43', '13', '5401', '23645', '0'), +('5', '43', '13', '5622', '20983', '0'), +('5', '43', '14', '9402', '33707', '0'), +('5', '43', '14', '11678', '32840', '0'), +('5', '43', '14', '11632', '30821', '0'), +('5', '43', '14', '11551', '23853', '0'), +('5', '43', '11', '45137', '17599', '0'), +('5', '43', '11', '8408', '8864', '0'), +('5', '43', '11', '8325', '8774', '0'), +('5', '43', '11', '8811', '6857', '0'), +('5', '44', '22', '8567', '0', '0'), +('5', '44', '22', '10323', '0', '0'), +('5', '44', '22', '8504', '0', '0'), +('5', '44', '22', '9246', '0', '0'), +('5', '44', '1', '14701', '4854', '0'), +('5', '44', '1', '14702', '3550', '0'), +('5', '44', '1', '10082', '3369', '0'), +('5', '44', '1', '10165', '1940', '0'), +('5', '44', '2', '4841', '10369', '0'), +('5', '44', '2', '4301', '7726', '0'), +('5', '44', '2', '4831', '6837', '0'), +('5', '44', '2', '4620', '5765', '0'), +('5', '44', '3', '4322', '5343', '0'), +('5', '44', '3', '1544', '5268', '0'), +('5', '44', '3', '71529', '4368', '0'), +('5', '44', '3', '4505', '2626', '0'), +('5', '44', '5', '27705', '7829', '0'), +('5', '44', '5', '14703', '7150', '0'), +('5', '44', '5', '14700', '4806', '0'), +('5', '44', '5', '10055', '4760', '0'), +('5', '44', '8', '11621', '26579', '0'), +('5', '44', '8', '11551', '8753', '0'), +('5', '44', '8', '1409', '7747', '0'), +('5', '44', '8', '11603', '7455', '0'), +('5', '44', '6', '1557', '8270', '0'), +('5', '44', '6', '11699', '7455', '0'), +('5', '44', '6', '4302', '4627', '0'), +('5', '44', '6', '25062', '3672', '0'), +('5', '44', '17', '4832', '14602', '0'), +('5', '44', '17', '4842', '11660', '0'), +('5', '44', '17', '3141', '8304', '0'), +('5', '44', '17', '4309', '8225', '0'), +('5', '44', '7', '4833', '6478', '0'), +('5', '44', '7', '4343', '5835', '0'), +('5', '44', '7', '4843', '5389', '0'), +('5', '44', '7', '2458', '3950', '0'), +('5', '44', '9', '4834', '4408', '0'), +('5', '44', '9', '4844', '3529', '0'), +('5', '44', '9', '12189', '3471', '0'), +('5', '44', '9', '4311', '3213', '0'), +('5', '44', '15', '10366', '8054', '0'), +('5', '44', '15', '10151', '7200', '0'), +('5', '44', '15', '14679', '7010', '0'), +('5', '44', '15', '14678', '5708', '0'), +('5', '44', '20', '2704', '24181', '0'), +('5', '44', '20', '11601', '19698', '0'), +('5', '44', '20', '2918', '11590', '0'), +('5', '44', '20', '1365', '10500', '0'), +('5', '44', '12', '4835', '10949', '0'), +('5', '44', '12', '20655', '8601', '0'), +('5', '44', '12', '4845', '6300', '0'), +('5', '44', '12', '11624', '5321', '0'), +('5', '44', '18', '4836', '7384', '0'), +('5', '44', '18', '3145', '5973', '0'), +('5', '44', '18', '4846', '5554', '0'), +('5', '44', '18', '4346', '4645', '0'), +('5', '44', '19', '4837', '7767', '0'), +('5', '44', '19', '4847', '6838', '0'), +('5', '44', '19', '68239', '5689', '0'), +('5', '44', '19', '3146', '3974', '0'), +('5', '44', '13', '27707', '26625', '0'), +('5', '44', '13', '45120', '25410', '0'), +('5', '44', '13', '5401', '23815', '0'), +('5', '44', '13', '5622', '21182', '0'), +('5', '44', '14', '9402', '33737', '0'), +('5', '44', '14', '11678', '32840', '0'), +('5', '44', '14', '11632', '30912', '0'), +('5', '44', '14', '11551', '23853', '0'), +('5', '44', '11', '45137', '18251', '0'), +('5', '44', '11', '8408', '8939', '0'), +('5', '44', '11', '8325', '8849', '0'), +('5', '44', '11', '8811', '6923', '0'), +('5', '45', '22', '8567', '0', '0'), +('5', '45', '22', '10323', '0', '0'), +('5', '45', '22', '8504', '0', '0'), +('5', '45', '22', '9246', '0', '0'), +('5', '45', '1', '14701', '4854', '0'), +('5', '45', '1', '14702', '3550', '0'), +('5', '45', '1', '10082', '3390', '0'), +('5', '45', '1', '10165', '1940', '0'), +('5', '45', '2', '4841', '10402', '0'), +('5', '45', '2', '4301', '7726', '0'), +('5', '45', '2', '4831', '6855', '0'), +('5', '45', '2', '4620', '5803', '0'), +('5', '45', '3', '4322', '5343', '0'), +('5', '45', '3', '1544', '5286', '0'), +('5', '45', '3', '71529', '4390', '0'), +('5', '45', '3', '4505', '2652', '0'), +('5', '45', '5', '27705', '7880', '0'), +('5', '45', '5', '14703', '7150', '0'), +('5', '45', '5', '14700', '4806', '0'), +('5', '45', '5', '10055', '4760', '0'), +('5', '45', '8', '11621', '26579', '0'), +('5', '45', '8', '11551', '8753', '0'), +('5', '45', '8', '1409', '7747', '0'), +('5', '45', '8', '11603', '7488', '0'), +('5', '45', '6', '1557', '8270', '0'), +('5', '45', '6', '11699', '7510', '0'), +('5', '45', '6', '4302', '4659', '0'), +('5', '45', '6', '25062', '3672', '0'), +('5', '45', '17', '4832', '14683', '0'), +('5', '45', '17', '4842', '11709', '0'), +('5', '45', '17', '3141', '8359', '0'), +('5', '45', '17', '4309', '8225', '0'), +('5', '45', '7', '4833', '6478', '0'), +('5', '45', '7', '4343', '5889', '0'), +('5', '45', '7', '4843', '5389', '0'), +('5', '45', '7', '2458', '3964', '0'), +('5', '45', '9', '4834', '4408', '0'), +('5', '45', '9', '4844', '3539', '0'), +('5', '45', '9', '12189', '3471', '0'), +('5', '45', '9', '4311', '3251', '0'), +('5', '45', '15', '10366', '8054', '0'), +('5', '45', '15', '10151', '7200', '0'), +('5', '45', '15', '14679', '7010', '0'), +('5', '45', '15', '14678', '5708', '0'), +('5', '45', '20', '2704', '24203', '0'), +('5', '45', '20', '11601', '19752', '0'), +('5', '45', '20', '2918', '11608', '0'), +('5', '45', '20', '1365', '10500', '0'), +('5', '45', '12', '4835', '10977', '0'), +('5', '45', '12', '20655', '8619', '0'), +('5', '45', '12', '4845', '6318', '0'), +('5', '45', '12', '11624', '5360', '0'), +('5', '45', '18', '4836', '7411', '0'), +('5', '45', '18', '3145', '6022', '0'), +('5', '45', '18', '4846', '5554', '0'), +('5', '45', '18', '4346', '4645', '0'), +('5', '45', '19', '4837', '7786', '0'), +('5', '45', '19', '4847', '6865', '0'), +('5', '45', '19', '68239', '5699', '0'), +('5', '45', '19', '3146', '3991', '0'), +('5', '45', '13', '27707', '26892', '0'), +('5', '45', '13', '45120', '26123', '0'), +('5', '45', '13', '5401', '23957', '0'), +('5', '45', '13', '5622', '21380', '0'), +('5', '45', '14', '9402', '33764', '0'), +('5', '45', '14', '11678', '32840', '0'), +('5', '45', '14', '11632', '30993', '0'), +('5', '45', '14', '11551', '23853', '0'), +('5', '45', '11', '45137', '18769', '0'), +('5', '45', '11', '8408', '9015', '0'), +('5', '45', '11', '8325', '8934', '0'), +('5', '45', '11', '8811', '6979', '0'), +('5', '46', '22', '8567', '0', '0'), +('5', '46', '22', '10323', '0', '0'), +('5', '46', '22', '8504', '0', '0'), +('5', '46', '22', '9246', '0', '0'), +('5', '46', '1', '14701', '4854', '0'), +('5', '46', '1', '14702', '3550', '0'), +('5', '46', '1', '10082', '3412', '0'), +('5', '46', '1', '10165', '1940', '0'), +('5', '46', '2', '4841', '10434', '0'), +('5', '46', '2', '4301', '7726', '0'), +('5', '46', '2', '4831', '6874', '0'), +('5', '46', '2', '4620', '5841', '0'), +('5', '46', '3', '4322', '5343', '0'), +('5', '46', '3', '1544', '5304', '0'), +('5', '46', '3', '71529', '4411', '0'), +('5', '46', '3', '4505', '2677', '0'), +('5', '46', '5', '27705', '7931', '0'), +('5', '46', '5', '14703', '7150', '0'), +('5', '46', '5', '14700', '4806', '0'), +('5', '46', '5', '10055', '4760', '0'), +('5', '46', '8', '11621', '26579', '0'), +('5', '46', '8', '11551', '8753', '0'), +('5', '46', '8', '1409', '7747', '0'), +('5', '46', '8', '11603', '7520', '0'), +('5', '46', '6', '1557', '8270', '0'), +('5', '46', '6', '11699', '7564', '0'), +('5', '46', '6', '4302', '4692', '0'), +('5', '46', '6', '25062', '3672', '0'), +('5', '46', '17', '4832', '14765', '0'), +('5', '46', '17', '4842', '11758', '0'), +('5', '46', '17', '3141', '8413', '0'), +('5', '46', '17', '4309', '8225', '0'), +('5', '46', '7', '4833', '6478', '0'), +('5', '46', '7', '4343', '5943', '0'), +('5', '46', '7', '4843', '5389', '0'), +('5', '46', '7', '2458', '3979', '0'), +('5', '46', '9', '4834', '4408', '0'), +('5', '46', '9', '4844', '3550', '0'), +('5', '46', '9', '12189', '3471', '0'), +('5', '46', '9', '4311', '3289', '0'), +('5', '46', '15', '10366', '8054', '0'), +('5', '46', '15', '10151', '7200', '0'), +('5', '46', '15', '14679', '7010', '0'), +('5', '46', '15', '14678', '5708', '0'), +('5', '46', '20', '2704', '24224', '0'), +('5', '46', '20', '11601', '19807', '0'), +('5', '46', '20', '2918', '11626', '0'), +('5', '46', '20', '1365', '10500', '0'), +('5', '46', '12', '4835', '11004', '0'), +('5', '46', '12', '20655', '8637', '0'), +('5', '46', '12', '4845', '6336', '0'), +('5', '46', '12', '11624', '5398', '0'), +('5', '46', '18', '4836', '7438', '0'), +('5', '46', '18', '3145', '6071', '0'), +('5', '46', '18', '4846', '5554', '0'), +('5', '46', '18', '4346', '4645', '0'), +('5', '46', '19', '4837', '7804', '0'), +('5', '46', '19', '4847', '6892', '0'), +('5', '46', '19', '68239', '5710', '0'), +('5', '46', '19', '3146', '4007', '0'), +('5', '46', '13', '45120', '27176', '0'), +('5', '46', '13', '27707', '27132', '0'), +('5', '46', '13', '5401', '24098', '0'), +('5', '46', '13', '5622', '21550', '0'), +('5', '46', '14', '9402', '33792', '0'), +('5', '46', '14', '11678', '32840', '0'), +('5', '46', '14', '11632', '31075', '0'), +('5', '46', '14', '11551', '23853', '0'), +('5', '46', '11', '45137', '19338', '0'), +('5', '46', '11', '8408', '9100', '0'), +('5', '46', '11', '8325', '9010', '0'), +('5', '46', '11', '8811', '7046', '0'), +('5', '47', '22', '8567', '0', '0'), +('5', '47', '22', '10323', '0', '0'), +('5', '47', '22', '8504', '0', '0'), +('5', '47', '22', '9246', '0', '0'), +('5', '47', '1', '14701', '4854', '0'), +('5', '47', '1', '14702', '3550', '0'), +('5', '47', '1', '10082', '3434', '0'), +('5', '47', '1', '10165', '1940', '0'), +('5', '47', '2', '4841', '10467', '0'), +('5', '47', '2', '4301', '7726', '0'), +('5', '47', '2', '4831', '6892', '0'), +('5', '47', '2', '4620', '5884', '0'), +('5', '47', '3', '4322', '5343', '0'), +('5', '47', '3', '1544', '5322', '0'), +('5', '47', '3', '71529', '4436', '0'), +('5', '47', '3', '4505', '2702', '0'), +('5', '47', '5', '27705', '7982', '0'), +('5', '47', '5', '14703', '7150', '0'), +('5', '47', '5', '14700', '4806', '0'), +('5', '47', '5', '10055', '4760', '0'), +('5', '47', '8', '11621', '26579', '0'), +('5', '47', '8', '11551', '8753', '0'), +('5', '47', '8', '1409', '7747', '0'), +('5', '47', '8', '11603', '7553', '0'), +('5', '47', '6', '1557', '8270', '0'), +('5', '47', '6', '11699', '7619', '0'), +('5', '47', '6', '4302', '4728', '0'), +('5', '47', '6', '25062', '3672', '0'), +('5', '47', '17', '4832', '14855', '0'), +('5', '47', '17', '4842', '11812', '0'), +('5', '47', '17', '3141', '8474', '0'), +('5', '47', '17', '4309', '8225', '0'), +('5', '47', '7', '4833', '6478', '0'), +('5', '47', '7', '4343', '6004', '0'), +('5', '47', '7', '4843', '5389', '0'), +('5', '47', '7', '2458', '3993', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '47', '9', '4834', '4408', '0'), +('5', '47', '9', '4844', '3561', '0'), +('5', '47', '9', '12189', '3471', '0'), +('5', '47', '9', '4311', '3332', '0'), +('5', '47', '15', '10366', '8054', '0'), +('5', '47', '15', '10151', '7200', '0'), +('5', '47', '15', '14679', '7010', '0'), +('5', '47', '15', '14678', '5708', '0'), +('5', '47', '20', '2704', '24246', '0'), +('5', '47', '20', '11601', '19867', '0'), +('5', '47', '20', '2918', '11644', '0'), +('5', '47', '20', '1365', '10500', '0'), +('5', '47', '12', '4835', '11034', '0'), +('5', '47', '12', '20655', '8656', '0'), +('5', '47', '12', '4845', '6354', '0'), +('5', '47', '12', '11624', '5440', '0'), +('5', '47', '18', '4836', '7468', '0'), +('5', '47', '18', '3145', '6125', '0'), +('5', '47', '18', '4846', '5554', '0'), +('5', '47', '18', '4346', '4645', '0'), +('5', '47', '19', '4837', '7822', '0'), +('5', '47', '19', '4847', '6922', '0'), +('5', '47', '19', '68239', '5721', '0'), +('5', '47', '19', '3146', '4025', '0'), +('5', '47', '13', '45120', '27893', '0'), +('5', '47', '13', '27707', '27371', '0'), +('5', '47', '13', '5401', '24240', '0'), +('5', '47', '13', '5622', '21748', '0'), +('5', '47', '14', '9402', '33822', '0'), +('5', '47', '14', '11678', '32840', '0'), +('5', '47', '14', '11632', '31165', '0'), +('5', '47', '14', '11551', '23853', '0'), +('5', '47', '11', '45137', '19866', '0'), +('5', '47', '11', '8408', '9175', '0'), +('5', '47', '11', '8325', '9095', '0'), +('5', '47', '11', '8811', '7102', '0'), +('5', '48', '22', '8567', '0', '0'), +('5', '48', '22', '10323', '0', '0'), +('5', '48', '22', '8504', '0', '0'), +('5', '48', '22', '9246', '0', '0'), +('5', '48', '1', '14701', '4854', '0'), +('5', '48', '1', '14702', '3550', '0'), +('5', '48', '1', '10082', '3456', '0'), +('5', '48', '1', '10165', '1940', '0'), +('5', '48', '2', '4841', '10500', '0'), +('5', '48', '2', '4301', '7726', '0'), +('5', '48', '2', '4831', '6910', '0'), +('5', '48', '2', '4620', '5922', '0'), +('5', '48', '3', '4322', '5343', '0'), +('5', '48', '3', '1544', '5340', '0'), +('5', '48', '3', '71529', '4457', '0'), +('5', '48', '3', '4505', '2728', '0'), +('5', '48', '5', '27705', '8032', '0'), +('5', '48', '5', '14703', '7150', '0'), +('5', '48', '5', '14700', '4806', '0'), +('5', '48', '5', '10055', '4760', '0'), +('5', '48', '8', '11621', '26579', '0'), +('5', '48', '8', '11551', '8753', '0'), +('5', '48', '8', '1409', '7747', '0'), +('5', '48', '8', '11603', '7586', '0'), +('5', '48', '6', '1557', '8270', '0'), +('5', '48', '6', '11699', '7673', '0'), +('5', '48', '6', '4302', '4761', '0'), +('5', '48', '6', '25062', '3672', '0'), +('5', '48', '17', '4832', '14937', '0'), +('5', '48', '17', '4842', '11861', '0'), +('5', '48', '17', '3141', '8528', '0'), +('5', '48', '17', '4309', '8225', '0'), +('5', '48', '7', '4833', '6478', '0'), +('5', '48', '7', '4343', '6058', '0'), +('5', '48', '7', '4843', '5389', '0'), +('5', '48', '7', '2458', '4008', '0'), +('5', '48', '9', '4834', '4408', '0'), +('5', '48', '9', '4844', '3572', '0'), +('5', '48', '9', '12189', '3471', '0'), +('5', '48', '9', '4311', '3370', '0'), +('5', '48', '15', '10366', '8054', '0'), +('5', '48', '15', '10151', '7200', '0'), +('5', '48', '15', '14679', '7010', '0'), +('5', '48', '15', '14678', '5708', '0'), +('5', '48', '20', '2704', '24268', '0'), +('5', '48', '20', '11601', '19921', '0'), +('5', '48', '20', '2918', '11662', '0'), +('5', '48', '20', '1365', '10500', '0'), +('5', '48', '12', '4835', '11061', '0'), +('5', '48', '12', '20655', '8674', '0'), +('5', '48', '12', '4845', '6372', '0'), +('5', '48', '12', '11624', '5478', '0'), +('5', '48', '18', '4836', '7496', '0'), +('5', '48', '18', '3145', '6174', '0'), +('5', '48', '18', '4846', '5554', '0'), +('5', '48', '18', '4346', '4645', '0'), +('5', '48', '19', '4837', '7840', '0'), +('5', '48', '19', '4847', '6949', '0'), +('5', '48', '19', '68239', '5732', '0'), +('5', '48', '19', '3146', '4041', '0'), +('5', '48', '13', '45120', '28807', '0'), +('5', '48', '13', '27707', '27610', '0'), +('5', '48', '13', '5401', '24382', '0'), +('5', '48', '13', '5622', '21947', '0'), +('5', '48', '14', '9402', '33849', '0'), +('5', '48', '14', '11678', '32840', '0'), +('5', '48', '14', '11632', '31247', '0'), +('5', '48', '14', '11551', '23853', '0'), +('5', '48', '11', '45137', '20544', '0'), +('5', '48', '11', '8408', '9251', '0'), +('5', '48', '11', '8325', '9171', '0'), +('5', '48', '11', '8811', '7168', '0'), +('5', '49', '22', '8567', '0', '0'), +('5', '49', '22', '10323', '0', '0'), +('5', '49', '22', '8504', '0', '0'), +('5', '49', '22', '9246', '0', '0'), +('5', '49', '1', '14701', '4854', '0'), +('5', '49', '1', '14702', '3550', '0'), +('5', '49', '1', '10082', '3477', '0'), +('5', '49', '1', '10165', '1940', '0'), +('5', '49', '2', '4841', '10532', '0'), +('5', '49', '2', '4301', '7726', '0'), +('5', '49', '2', '4831', '6928', '0'), +('5', '49', '2', '4620', '5964', '0'), +('5', '49', '3', '1544', '5359', '0'), +('5', '49', '3', '4322', '5343', '0'), +('5', '49', '3', '71529', '4481', '0'), +('5', '49', '3', '4505', '2753', '0'), +('5', '49', '5', '27705', '8083', '0'), +('5', '49', '5', '14703', '7150', '0'), +('5', '49', '5', '14700', '4806', '0'), +('5', '49', '5', '10055', '4760', '0'), +('5', '49', '8', '11621', '26579', '0'), +('5', '49', '8', '11551', '8753', '0'), +('5', '49', '8', '1409', '7747', '0'), +('5', '49', '8', '11603', '7618', '0'), +('5', '49', '6', '1557', '8270', '0'), +('5', '49', '6', '11699', '7727', '0'), +('5', '49', '6', '4302', '4797', '0'), +('5', '49', '6', '25062', '3672', '0'), +('5', '49', '17', '4832', '15028', '0'), +('5', '49', '17', '4842', '11916', '0'), +('5', '49', '17', '3141', '8588', '0'), +('5', '49', '17', '4309', '8225', '0'), +('5', '49', '7', '4833', '6478', '0'), +('5', '49', '7', '4343', '6119', '0'), +('5', '49', '7', '4843', '5389', '0'), +('5', '49', '7', '2458', '4022', '0'), +('5', '49', '9', '4834', '4408', '0'), +('5', '49', '9', '4844', '3583', '0'), +('5', '49', '9', '12189', '3471', '0'), +('5', '49', '9', '4311', '3412', '0'), +('5', '49', '15', '10366', '8054', '0'), +('5', '49', '15', '10151', '7200', '0'), +('5', '49', '15', '14679', '7010', '0'), +('5', '49', '15', '14678', '5708', '0'), +('5', '49', '20', '2704', '24289', '0'), +('5', '49', '20', '11601', '19982', '0'), +('5', '49', '20', '2918', '11680', '0'), +('5', '49', '20', '1365', '10500', '0'), +('5', '49', '12', '4835', '11091', '0'), +('5', '49', '12', '20655', '8694', '0'), +('5', '49', '12', '4845', '6390', '0'), +('5', '49', '12', '11624', '5520', '0'), +('5', '49', '18', '4836', '7526', '0'), +('5', '49', '18', '3145', '6228', '0'), +('5', '49', '18', '4846', '5554', '0'), +('5', '49', '18', '4346', '4645', '0'), +('5', '49', '19', '4837', '7858', '0'), +('5', '49', '19', '4847', '6980', '0'), +('5', '49', '19', '68239', '5743', '0'), +('5', '49', '19', '3146', '4059', '0'), +('5', '49', '13', '45120', '29554', '0'), +('5', '49', '13', '27707', '27878', '0'), +('5', '49', '13', '5401', '24523', '0'), +('5', '49', '13', '5622', '22117', '0'), +('5', '49', '14', '9402', '33879', '0'), +('5', '49', '14', '11678', '32840', '0'), +('5', '49', '14', '11632', '31337', '0'), +('5', '49', '14', '11551', '23853', '0'), +('5', '49', '11', '45137', '21096', '0'), +('5', '49', '11', '8408', '9326', '0'), +('5', '49', '11', '8325', '9256', '0'), +('5', '49', '11', '8811', '7234', '0'), +('5', '50', '22', '8567', '0', '0'), +('5', '50', '22', '10323', '0', '0'), +('5', '50', '22', '8504', '0', '0'), +('5', '50', '22', '9246', '0', '0'), +('5', '50', '1', '14701', '4854', '0'), +('5', '50', '1', '14702', '3550', '0'), +('5', '50', '1', '10082', '3499', '0'), +('5', '50', '1', '10165', '1940', '0'), +('5', '50', '2', '4841', '10565', '0'), +('5', '50', '2', '4301', '7726', '0'), +('5', '50', '2', '4831', '6946', '0'), +('5', '50', '2', '4620', '6006', '0'), +('5', '50', '3', '1544', '5377', '0'), +('5', '50', '3', '4322', '5343', '0'), +('5', '50', '3', '71529', '4506', '0'), +('5', '50', '3', '4505', '2778', '0'), +('5', '50', '5', '27705', '8134', '0'), +('5', '50', '5', '14703', '7150', '0'), +('5', '50', '5', '14700', '4806', '0'), +('5', '50', '5', '10055', '4760', '0'), +('5', '50', '8', '11621', '26579', '0'), +('5', '50', '8', '11551', '8753', '0'), +('5', '50', '8', '1409', '7747', '0'), +('5', '50', '8', '11603', '7651', '0'), +('5', '50', '6', '1557', '8270', '0'), +('5', '50', '6', '11699', '7782', '0'), +('5', '50', '6', '4302', '4833', '0'), +('5', '50', '6', '25062', '3672', '0'), +('5', '50', '17', '4832', '15118', '0'), +('5', '50', '17', '4842', '11970', '0'), +('5', '50', '17', '3141', '8649', '0'), +('5', '50', '17', '4309', '8225', '0'), +('5', '50', '7', '4833', '6478', '0'), +('5', '50', '7', '4343', '6179', '0'), +('5', '50', '7', '4843', '5389', '0'), +('5', '50', '7', '2458', '4037', '0'), +('5', '50', '9', '4834', '4408', '0'), +('5', '50', '9', '4844', '3594', '0'), +('5', '50', '9', '12189', '3471', '0'), +('5', '50', '9', '4311', '3454', '0'), +('5', '50', '15', '10366', '8054', '0'), +('5', '50', '15', '10151', '7200', '0'), +('5', '50', '15', '14679', '7010', '0'), +('5', '50', '15', '14678', '5708', '0'), +('5', '50', '20', '2704', '24311', '0'), +('5', '50', '20', '11601', '20042', '0'), +('5', '50', '20', '2918', '11699', '0'), +('5', '50', '20', '1365', '10500', '0'), +('5', '50', '12', '4835', '11122', '0'), +('5', '50', '12', '20655', '8713', '0'), +('5', '50', '12', '4845', '6409', '0'), +('5', '50', '12', '11624', '5562', '0'), +('5', '50', '18', '4836', '7556', '0'), +('5', '50', '18', '3145', '6283', '0'), +('5', '50', '18', '4846', '5554', '0'), +('5', '50', '18', '4346', '4645', '0'), +('5', '50', '19', '4837', '7876', '0'), +('5', '50', '19', '4847', '7010', '0'), +('5', '50', '19', '68239', '5754', '0'), +('5', '50', '19', '3146', '4078', '0'), +('5', '50', '13', '45120', '30501', '0'), +('5', '50', '13', '27707', '28117', '0'), +('5', '50', '13', '5401', '24665', '0'), +('5', '50', '13', '5622', '22315', '0'), +('5', '50', '14', '9402', '33909', '0'), +('5', '50', '14', '11678', '32840', '0'), +('5', '50', '14', '11632', '31428', '0'), +('5', '50', '14', '11551', '23853', '0'), +('5', '50', '11', '45137', '21698', '0'), +('5', '50', '11', '8408', '9402', '0'), +('5', '50', '11', '8325', '9331', '0'), +('5', '50', '11', '8811', '7291', '0'), +('5', '51', '22', '8567', '0', '0'), +('5', '51', '22', '10323', '0', '0'), +('5', '51', '22', '8504', '0', '0'), +('5', '51', '22', '9246', '0', '0'), +('5', '51', '1', '14701', '4854', '0'), +('5', '51', '1', '14702', '3550', '0'), +('5', '51', '1', '10082', '3521', '0'), +('5', '51', '1', '10165', '1940', '0'), +('5', '51', '2', '4841', '10597', '0'), +('5', '51', '2', '4301', '7726', '0'), +('5', '51', '2', '4831', '6964', '0'), +('5', '51', '2', '4620', '6044', '0'), +('5', '51', '3', '1544', '5395', '0'), +('5', '51', '3', '4322', '5343', '0'), +('5', '51', '3', '71529', '4527', '0'), +('5', '51', '3', '4505', '2804', '0'), +('5', '51', '5', '27705', '8185', '0'), +('5', '51', '5', '14703', '7150', '0'), +('5', '51', '5', '14700', '4806', '0'), +('5', '51', '5', '10055', '4760', '0'), +('5', '51', '8', '11621', '26579', '0'), +('5', '51', '8', '11551', '8753', '0'), +('5', '51', '8', '1409', '7747', '0'), +('5', '51', '8', '11603', '7683', '0'), +('5', '51', '6', '1557', '8270', '0'), +('5', '51', '6', '11699', '7836', '0'), +('5', '51', '6', '4302', '4866', '0'), +('5', '51', '6', '25062', '3672', '0'), +('5', '51', '17', '4832', '15200', '0'), +('5', '51', '17', '4842', '12019', '0'), +('5', '51', '17', '3141', '8703', '0'), +('5', '51', '17', '4309', '8225', '0'), +('5', '51', '7', '4833', '6478', '0'), +('5', '51', '7', '4343', '6233', '0'), +('5', '51', '7', '4843', '5389', '0'), +('5', '51', '7', '2458', '4051', '0'), +('5', '51', '9', '4834', '4408', '0'), +('5', '51', '9', '4844', '3605', '0'), +('5', '51', '9', '4311', '3492', '0'), +('5', '51', '9', '12189', '3471', '0'), +('5', '51', '15', '10366', '8054', '0'), +('5', '51', '15', '10151', '7200', '0'), +('5', '51', '15', '14679', '7010', '0'), +('5', '51', '15', '14678', '5708', '0'), +('5', '51', '20', '2704', '24333', '0'), +('5', '51', '20', '11601', '20096', '0'), +('5', '51', '20', '2918', '11717', '0'), +('5', '51', '20', '1365', '10500', '0'), +('5', '51', '12', '4835', '11149', '0'), +('5', '51', '12', '20655', '8731', '0'), +('5', '51', '12', '4845', '6427', '0'), +('5', '51', '12', '11624', '5601', '0'), +('5', '51', '18', '4836', '7583', '0'), +('5', '51', '18', '3145', '6332', '0'), +('5', '51', '18', '4846', '5554', '0'), +('5', '51', '18', '4346', '4645', '0'), +('5', '51', '19', '4837', '7894', '0'), +('5', '51', '19', '4847', '7037', '0'), +('5', '51', '19', '68239', '5765', '0'), +('5', '51', '19', '3146', '4094', '0'), +('5', '51', '13', '27961', '40794', '0'), +('5', '51', '13', '45120', '31248', '0'), +('5', '51', '13', '27895', '30222', '0'), +('5', '51', '13', '27707', '28357', '0'), +('5', '51', '14', '9402', '33937', '0'), +('5', '51', '14', '11678', '32840', '0'), +('5', '51', '14', '11632', '31510', '0'), +('5', '51', '14', '11551', '23853', '0'), +('5', '51', '11', '45137', '22252', '0'), +('5', '51', '11', '8408', '9478', '0'), +('5', '51', '11', '8325', '9407', '0'), +('5', '51', '11', '8811', '7357', '0'), +('5', '52', '22', '8567', '0', '0'), +('5', '52', '22', '10323', '0', '0'), +('5', '52', '22', '8504', '0', '0'), +('5', '52', '22', '9246', '0', '0'), +('5', '52', '1', '14701', '4854', '0'), +('5', '52', '1', '14702', '3550', '0'), +('5', '52', '1', '10082', '3543', '0'), +('5', '52', '1', '10165', '1940', '0'), +('5', '52', '2', '4841', '10630', '0'), +('5', '52', '2', '4301', '7726', '0'), +('5', '52', '2', '4831', '6982', '0'), +('5', '52', '2', '4620', '6087', '0'), +('5', '52', '3', '1544', '5413', '0'), +('5', '52', '3', '4322', '5343', '0'), +('5', '52', '3', '71529', '4552', '0'), +('5', '52', '3', '4505', '2829', '0'), +('5', '52', '5', '27705', '8235', '0'), +('5', '52', '5', '14703', '7150', '0'), +('5', '52', '5', '14700', '4806', '0'), +('5', '52', '5', '10055', '4760', '0'), +('5', '52', '8', '11621', '26579', '0'), +('5', '52', '8', '11551', '8753', '0'), +('5', '52', '8', '1409', '7747', '0'), +('5', '52', '8', '11603', '7716', '0'), +('5', '52', '6', '1557', '8270', '0'), +('5', '52', '6', '11699', '7890', '0'), +('5', '52', '6', '4302', '4902', '0'), +('5', '52', '6', '25062', '3672', '0'), +('5', '52', '17', '4832', '15290', '0'), +('5', '52', '17', '4842', '12073', '0'), +('5', '52', '17', '3141', '8763', '0'), +('5', '52', '17', '4309', '8225', '0'), +('5', '52', '7', '4833', '6478', '0'), +('5', '52', '7', '4343', '6294', '0'), +('5', '52', '7', '4843', '5389', '0'), +('5', '52', '7', '2458', '4066', '0'), +('5', '52', '9', '4834', '4408', '0'), +('5', '52', '9', '4844', '3616', '0'), +('5', '52', '9', '4311', '3535', '0'), +('5', '52', '9', '12189', '3471', '0'), +('5', '52', '15', '10366', '8054', '0'), +('5', '52', '15', '10151', '7200', '0'), +('5', '52', '15', '14679', '7010', '0'), +('5', '52', '15', '14678', '5708', '0'), +('5', '52', '20', '2704', '24355', '0'), +('5', '52', '20', '11601', '20157', '0'), +('5', '52', '20', '2918', '11735', '0'), +('5', '52', '20', '1365', '10500', '0'), +('5', '52', '12', '4835', '11179', '0'), +('5', '52', '12', '20655', '8750', '0'), +('5', '52', '12', '4845', '6445', '0'), +('5', '52', '12', '11624', '5643', '0'), +('5', '52', '18', '4836', '7613', '0'), +('5', '52', '18', '3145', '6386', '0'), +('5', '52', '18', '4846', '5554', '0'), +('5', '52', '18', '4346', '4645', '0'), +('5', '52', '19', '4837', '7912', '0'), +('5', '52', '19', '4847', '7067', '0'), +('5', '52', '19', '68239', '5776', '0'), +('5', '52', '19', '3146', '4112', '0'), +('5', '52', '13', '27961', '41154', '0'), +('5', '52', '13', '45120', '32197', '0'), +('5', '52', '13', '27895', '30467', '0'), +('5', '52', '13', '27707', '28596', '0'), +('5', '52', '14', '9402', '33967', '0'), +('5', '52', '14', '11678', '32840', '0'), +('5', '52', '14', '11632', '31600', '0'), +('5', '52', '14', '11551', '23853', '0'), +('5', '52', '11', '45137', '22963', '0'), +('5', '52', '11', '8408', '9553', '0'), +('5', '52', '11', '8325', '9492', '0'), +('5', '52', '11', '8811', '7423', '0'), +('5', '53', '22', '8567', '0', '0'), +('5', '53', '22', '10323', '0', '0'), +('5', '53', '22', '8504', '0', '0'), +('5', '53', '22', '9246', '0', '0'), +('5', '53', '1', '14701', '4854', '0'), +('5', '53', '1', '10082', '3564', '0'), +('5', '53', '1', '14702', '3550', '0'), +('5', '53', '1', '10165', '1940', '0'), +('5', '53', '2', '4841', '10663', '0'), +('5', '53', '2', '4301', '7726', '0'), +('5', '53', '2', '4831', '7000', '0'), +('5', '53', '2', '4620', '6129', '0'), +('5', '53', '3', '1544', '5431', '0'), +('5', '53', '3', '4322', '5343', '0'), +('5', '53', '3', '71529', '4576', '0'), +('5', '53', '3', '11052', '2881', '0'), +('5', '53', '5', '27705', '8286', '0'), +('5', '53', '5', '14703', '7150', '0'), +('5', '53', '5', '14700', '4806', '0'), +('5', '53', '5', '10055', '4760', '0'), +('5', '53', '8', '11621', '26579', '0'), +('5', '53', '8', '11551', '8753', '0'), +('5', '53', '8', '11603', '7749', '0'), +('5', '53', '8', '1409', '7747', '0'), +('5', '53', '6', '1557', '8270', '0'), +('5', '53', '6', '11699', '7945', '0'), +('5', '53', '6', '4302', '4938', '0'), +('5', '53', '6', '25062', '3672', '0'), +('5', '53', '17', '4832', '15381', '0'), +('5', '53', '17', '4842', '12128', '0'), +('5', '53', '17', '3141', '8824', '0'), +('5', '53', '17', '4309', '8225', '0'), +('5', '53', '7', '4833', '6478', '0'), +('5', '53', '7', '4343', '6354', '0'), +('5', '53', '7', '4843', '5389', '0'), +('5', '53', '7', '2458', '4080', '0'), +('5', '53', '9', '4834', '4408', '0'), +('5', '53', '9', '4844', '3626', '0'), +('5', '53', '9', '4311', '3577', '0'), +('5', '53', '9', '12189', '3471', '0'), +('5', '53', '15', '10366', '8054', '0'), +('5', '53', '15', '10151', '7200', '0'), +('5', '53', '15', '14679', '7010', '0'), +('5', '53', '15', '14678', '5708', '0'), +('5', '53', '20', '2704', '24376', '0'), +('5', '53', '20', '11601', '20217', '0'), +('5', '53', '20', '2918', '11753', '0'), +('5', '53', '20', '1365', '10500', '0'), +('5', '53', '12', '4835', '11209', '0'), +('5', '53', '12', '20655', '8770', '0'), +('5', '53', '12', '4845', '6463', '0'), +('5', '53', '12', '11624', '5685', '0'), +('5', '53', '18', '4836', '7644', '0'), +('5', '53', '18', '3145', '6440', '0'), +('5', '53', '18', '4846', '5554', '0'), +('5', '53', '18', '4346', '4645', '0'), +('5', '53', '19', '4837', '7931', '0'), +('5', '53', '19', '4847', '7097', '0'), +('5', '53', '19', '68239', '5786', '0'), +('5', '53', '19', '3146', '4130', '0'), +('5', '53', '13', '27961', '41514', '0'), +('5', '53', '13', '45120', '32977', '0'), +('5', '53', '13', '27895', '30684', '0'), +('5', '53', '13', '27707', '28864', '0'), +('5', '53', '14', '9402', '33997', '0'), +('5', '53', '14', '11678', '32840', '0'), +('5', '53', '14', '11632', '31691', '0'), +('5', '53', '14', '11551', '23853', '0'), +('5', '53', '11', '45137', '23536', '0'), +('5', '53', '11', '8408', '9629', '0'), +('5', '53', '11', '8325', '9567', '0'), +('5', '53', '11', '8811', '7480', '0'), +('5', '54', '22', '8567', '0', '0'), +('5', '54', '22', '10323', '0', '0'), +('5', '54', '22', '8504', '0', '0'), +('5', '54', '22', '9246', '0', '0'), +('5', '54', '1', '14701', '4854', '0'), +('5', '54', '1', '10082', '3586', '0'), +('5', '54', '1', '14702', '3550', '0'), +('5', '54', '1', '10165', '1940', '0'), +('5', '54', '2', '4841', '10695', '0'), +('5', '54', '2', '4301', '7726', '0'), +('5', '54', '2', '4831', '7018', '0'), +('5', '54', '2', '4620', '6171', '0'), +('5', '54', '3', '1544', '5449', '0'), +('5', '54', '3', '4322', '5343', '0'), +('5', '54', '3', '71529', '4600', '0'), +('5', '54', '3', '11052', '2935', '0'), +('5', '54', '5', '27705', '8337', '0'), +('5', '54', '5', '14703', '7150', '0'), +('5', '54', '5', '14700', '4806', '0'), +('5', '54', '5', '10055', '4760', '0'), +('5', '54', '8', '11621', '26579', '0'), +('5', '54', '8', '11551', '8753', '0'), +('5', '54', '8', '11603', '7781', '0'), +('5', '54', '8', '1409', '7747', '0'), +('5', '54', '6', '1557', '8270', '0'), +('5', '54', '6', '11699', '7999', '0'), +('5', '54', '6', '4302', '4975', '0'), +('5', '54', '6', '25062', '3672', '0'), +('5', '54', '17', '4832', '15471', '0'), +('5', '54', '17', '4842', '12182', '0'), +('5', '54', '17', '3141', '8884', '0'), +('5', '54', '17', '4309', '8225', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '54', '7', '4833', '6478', '0'), +('5', '54', '7', '4343', '6414', '0'), +('5', '54', '7', '4843', '5389', '0'), +('5', '54', '7', '2458', '4095', '0'), +('5', '54', '9', '4834', '4408', '0'), +('5', '54', '9', '4844', '3637', '0'), +('5', '54', '9', '4311', '3619', '0'), +('5', '54', '9', '12189', '3471', '0'), +('5', '54', '15', '10366', '8054', '0'), +('5', '54', '15', '10151', '7200', '0'), +('5', '54', '15', '14679', '7010', '0'), +('5', '54', '15', '14678', '5708', '0'), +('5', '54', '20', '2704', '24398', '0'), +('5', '54', '20', '11601', '20278', '0'), +('5', '54', '20', '2918', '11771', '0'), +('5', '54', '20', '1365', '10500', '0'), +('5', '54', '12', '4835', '11239', '0'), +('5', '54', '12', '20655', '8789', '0'), +('5', '54', '12', '4845', '6481', '0'), +('5', '54', '12', '11624', '5727', '0'), +('5', '54', '18', '4836', '7674', '0'), +('5', '54', '18', '3145', '6495', '0'), +('5', '54', '18', '4846', '5554', '0'), +('5', '54', '18', '4346', '4645', '0'), +('5', '54', '19', '4837', '7949', '0'), +('5', '54', '19', '4847', '7128', '0'), +('5', '54', '19', '68239', '5797', '0'), +('5', '54', '19', '3146', '4148', '0'), +('5', '54', '13', '27961', '41874', '0'), +('5', '54', '13', '45120', '33957', '0'), +('5', '54', '13', '27895', '30928', '0'), +('5', '54', '13', '27707', '29103', '0'), +('5', '54', '14', '9402', '34027', '0'), +('5', '54', '14', '11678', '32840', '0'), +('5', '54', '14', '11632', '31781', '0'), +('5', '54', '14', '11551', '23853', '0'), +('5', '54', '11', '45137', '24112', '0'), +('5', '54', '11', '8408', '9704', '0'), +('5', '54', '11', '8325', '9652', '0'), +('5', '54', '11', '8811', '7546', '0'), +('5', '55', '22', '8567', '0', '0'), +('5', '55', '22', '10323', '0', '0'), +('5', '55', '22', '8504', '0', '0'), +('5', '55', '22', '9246', '0', '0'), +('5', '55', '1', '14701', '4854', '0'), +('5', '55', '1', '10082', '3608', '0'), +('5', '55', '1', '14702', '3550', '0'), +('5', '55', '1', '10165', '1940', '0'), +('5', '55', '2', '4841', '10728', '0'), +('5', '55', '2', '4301', '7726', '0'), +('5', '55', '2', '4831', '7037', '0'), +('5', '55', '2', '4620', '6213', '0'), +('5', '55', '3', '1544', '5467', '0'), +('5', '55', '3', '4322', '5343', '0'), +('5', '55', '3', '71529', '4624', '0'), +('5', '55', '3', '11052', '2990', '0'), +('5', '55', '5', '27705', '8388', '0'), +('5', '55', '5', '14703', '7150', '0'), +('5', '55', '5', '14700', '4806', '0'), +('5', '55', '5', '10055', '4760', '0'), +('5', '55', '8', '11621', '26579', '0'), +('5', '55', '8', '11551', '8753', '0'), +('5', '55', '8', '11603', '7814', '0'), +('5', '55', '8', '1409', '7747', '0'), +('5', '55', '6', '1557', '8270', '0'), +('5', '55', '6', '11699', '8053', '0'), +('5', '55', '6', '4302', '5011', '0'), +('5', '55', '6', '25062', '3672', '0'), +('5', '55', '17', '4832', '15562', '0'), +('5', '55', '17', '4842', '12236', '0'), +('5', '55', '17', '3141', '8945', '0'), +('5', '55', '17', '4309', '8225', '0'), +('5', '55', '7', '4833', '6478', '0'), +('5', '55', '7', '4343', '6475', '0'), +('5', '55', '7', '4843', '5389', '0'), +('5', '55', '7', '2458', '4109', '0'), +('5', '55', '9', '4834', '4408', '0'), +('5', '55', '9', '4311', '3661', '0'), +('5', '55', '9', '4844', '3648', '0'), +('5', '55', '9', '12189', '3471', '0'), +('5', '55', '15', '10366', '8054', '0'), +('5', '55', '15', '10151', '7200', '0'), +('5', '55', '15', '14679', '7010', '0'), +('5', '55', '15', '14678', '5708', '0'), +('5', '55', '20', '2704', '24420', '0'), +('5', '55', '20', '11601', '20338', '0'), +('5', '55', '20', '2918', '11789', '0'), +('5', '55', '20', '1365', '10500', '0'), +('5', '55', '12', '4835', '11270', '0'), +('5', '55', '12', '20655', '8808', '0'), +('5', '55', '12', '4845', '6499', '0'), +('5', '55', '12', '11624', '5770', '0'), +('5', '55', '18', '4836', '7704', '0'), +('5', '55', '18', '3145', '6549', '0'), +('5', '55', '18', '4846', '5554', '0'), +('5', '55', '18', '4346', '4645', '0'), +('5', '55', '19', '4837', '7967', '0'), +('5', '55', '19', '4847', '7158', '0'), +('5', '55', '19', '68239', '5808', '0'), +('5', '55', '19', '3146', '4166', '0'), +('5', '55', '13', '27961', '42262', '0'), +('5', '55', '13', '45120', '35023', '0'), +('5', '55', '13', '27895', '31145', '0'), +('5', '55', '13', '27707', '29342', '0'), +('5', '55', '14', '9402', '34057', '0'), +('5', '55', '14', '11678', '32840', '0'), +('5', '55', '14', '11632', '31872', '0'), +('5', '55', '14', '11551', '23853', '0'), +('5', '55', '11', '45137', '24747', '0'), +('5', '55', '11', '8408', '9780', '0'), +('5', '55', '11', '8325', '9728', '0'), +('5', '55', '11', '8811', '7603', '0'), +('5', '56', '22', '8567', '0', '0'), +('5', '56', '22', '10323', '0', '0'), +('5', '56', '22', '8504', '0', '0'), +('5', '56', '22', '9246', '0', '0'), +('5', '56', '1', '14701', '4854', '0'), +('5', '56', '1', '10082', '3630', '0'), +('5', '56', '1', '14702', '3550', '0'), +('5', '56', '1', '10165', '1940', '0'), +('5', '56', '2', '4841', '10760', '0'), +('5', '56', '2', '4301', '7726', '0'), +('5', '56', '2', '4831', '7055', '0'), +('5', '56', '2', '4620', '6256', '0'), +('5', '56', '3', '1544', '5485', '0'), +('5', '56', '3', '4322', '5343', '0'), +('5', '56', '3', '71529', '4648', '0'), +('5', '56', '3', '11052', '3044', '0'), +('5', '56', '5', '27705', '8438', '0'), +('5', '56', '5', '14703', '7150', '0'), +('5', '56', '5', '14700', '4806', '0'), +('5', '56', '5', '10055', '4760', '0'), +('5', '56', '8', '11621', '26579', '0'), +('5', '56', '8', '11551', '8753', '0'), +('5', '56', '8', '11603', '7846', '0'), +('5', '56', '8', '1409', '7747', '0'), +('5', '56', '6', '1557', '8270', '0'), +('5', '56', '6', '11699', '8108', '0'), +('5', '56', '6', '4302', '5047', '0'), +('5', '56', '6', '25062', '3672', '0'), +('5', '56', '17', '4832', '15653', '0'), +('5', '56', '17', '4842', '12291', '0'), +('5', '56', '17', '3141', '9005', '0'), +('5', '56', '17', '4309', '8225', '0'), +('5', '56', '7', '4343', '6535', '0'), +('5', '56', '7', '4833', '6478', '0'), +('5', '56', '7', '4843', '5389', '0'), +('5', '56', '7', '2458', '4124', '0'), +('5', '56', '9', '4834', '4408', '0'), +('5', '56', '9', '4311', '3704', '0'), +('5', '56', '9', '4844', '3659', '0'), +('5', '56', '9', '12189', '3471', '0'), +('5', '56', '15', '10366', '8054', '0'), +('5', '56', '15', '10151', '7200', '0'), +('5', '56', '15', '14679', '7010', '0'), +('5', '56', '15', '14678', '5708', '0'), +('5', '56', '20', '2704', '24442', '0'), +('5', '56', '20', '11601', '20398', '0'), +('5', '56', '20', '2918', '11807', '0'), +('5', '56', '20', '1365', '10500', '0'), +('5', '56', '12', '4835', '11300', '0'), +('5', '56', '12', '20655', '8828', '0'), +('5', '56', '12', '4845', '6517', '0'), +('5', '56', '12', '11624', '5812', '0'), +('5', '56', '18', '4836', '7734', '0'), +('5', '56', '18', '3145', '6604', '0'), +('5', '56', '18', '4846', '5554', '0'), +('5', '56', '18', '4346', '4645', '0'), +('5', '56', '19', '4837', '7985', '0'), +('5', '56', '19', '4847', '7188', '0'), +('5', '56', '19', '68239', '5819', '0'), +('5', '56', '19', '3146', '4185', '0'), +('5', '56', '13', '27961', '42622', '0'), +('5', '56', '13', '45120', '35308', '0'), +('5', '56', '13', '27895', '31390', '0'), +('5', '56', '13', '27707', '29582', '0'), +('5', '56', '14', '9402', '34088', '0'), +('5', '56', '14', '11678', '32840', '0'), +('5', '56', '14', '11632', '31963', '0'), +('5', '56', '14', '11551', '23853', '0'), +('5', '56', '11', '45137', '25337', '0'), +('5', '56', '11', '8408', '9855', '0'), +('5', '56', '11', '8325', '9813', '0'), +('5', '56', '11', '8811', '7669', '0'), +('5', '57', '22', '8567', '0', '0'), +('5', '57', '22', '10323', '0', '0'), +('5', '57', '22', '8504', '0', '0'), +('5', '57', '22', '9246', '0', '0'), +('5', '57', '1', '14701', '4854', '0'), +('5', '57', '1', '10082', '3651', '0'), +('5', '57', '1', '14702', '3550', '0'), +('5', '57', '1', '10165', '1940', '0'), +('5', '57', '2', '4841', '10793', '0'), +('5', '57', '2', '4301', '7726', '0'), +('5', '57', '2', '4831', '7073', '0'), +('5', '57', '2', '4620', '6298', '0'), +('5', '57', '3', '1544', '5504', '0'), +('5', '57', '3', '4322', '5343', '0'), +('5', '57', '3', '71529', '4672', '0'), +('5', '57', '3', '11052', '3099', '0'), +('5', '57', '5', '27705', '8489', '0'), +('5', '57', '5', '14703', '7150', '0'), +('5', '57', '5', '14700', '4806', '0'), +('5', '57', '5', '4501', '4799', '0'), +('5', '57', '8', '11621', '26579', '0'), +('5', '57', '8', '11551', '8753', '0'), +('5', '57', '8', '11603', '7879', '0'), +('5', '57', '8', '1409', '7747', '0'), +('5', '57', '6', '1557', '8270', '0'), +('5', '57', '6', '11699', '8162', '0'), +('5', '57', '6', '4302', '5083', '0'), +('5', '57', '6', '25062', '3672', '0'), +('5', '57', '17', '4832', '15743', '0'), +('5', '57', '17', '4842', '12345', '0'), +('5', '57', '17', '3141', '9065', '0'), +('5', '57', '17', '4309', '8225', '0'), +('5', '57', '7', '4343', '6596', '0'), +('5', '57', '7', '4833', '6478', '0'), +('5', '57', '7', '4843', '5389', '0'), +('5', '57', '7', '2458', '4138', '0'), +('5', '57', '9', '4834', '4408', '0'), +('5', '57', '9', '4311', '3746', '0'), +('5', '57', '9', '4844', '3670', '0'), +('5', '57', '9', '12189', '3471', '0'), +('5', '57', '15', '10366', '8054', '0'), +('5', '57', '15', '10151', '7200', '0'), +('5', '57', '15', '14679', '7010', '0'), +('5', '57', '15', '14678', '5708', '0'), +('5', '57', '20', '2704', '24463', '0'), +('5', '57', '20', '11601', '20459', '0'), +('5', '57', '20', '2918', '11825', '0'), +('5', '57', '20', '1365', '10500', '0'), +('5', '57', '12', '4835', '11330', '0'), +('5', '57', '12', '20655', '8847', '0'), +('5', '57', '12', '4845', '6535', '0'), +('5', '57', '12', '11624', '5854', '0'), +('5', '57', '18', '4836', '7764', '0'), +('5', '57', '18', '3145', '6658', '0'), +('5', '57', '18', '4846', '5554', '0'), +('5', '57', '18', '4346', '4645', '0'), +('5', '57', '19', '4837', '8003', '0'), +('5', '57', '19', '4847', '7218', '0'), +('5', '57', '19', '68239', '5830', '0'), +('5', '57', '19', '3146', '4203', '0'), +('5', '57', '13', '27961', '42982', '0'), +('5', '57', '13', '45120', '35593', '0'), +('5', '57', '13', '27895', '31606', '0'), +('5', '57', '13', '27707', '29849', '0'), +('5', '57', '14', '9402', '34118', '0'), +('5', '57', '14', '11678', '32840', '0'), +('5', '57', '14', '11632', '32053', '0'), +('5', '57', '14', '11551', '23853', '0'), +('5', '57', '11', '45137', '26185', '0'), +('5', '57', '11', '8408', '9931', '0'), +('5', '57', '11', '8325', '9888', '0'), +('5', '57', '11', '8811', '7735', '0'), +('5', '58', '22', '8567', '0', '0'), +('5', '58', '22', '10323', '0', '0'), +('5', '58', '22', '8504', '0', '0'), +('5', '58', '22', '9246', '0', '0'), +('5', '58', '1', '14701', '4854', '0'), +('5', '58', '1', '10082', '3673', '0'), +('5', '58', '1', '14702', '3550', '0'), +('5', '58', '1', '10165', '1940', '0'), +('5', '58', '2', '4841', '10826', '0'), +('5', '58', '2', '4301', '7726', '0'), +('5', '58', '2', '4831', '7091', '0'), +('5', '58', '2', '4620', '6340', '0'), +('5', '58', '3', '1544', '5522', '0'), +('5', '58', '3', '4322', '5343', '0'), +('5', '58', '3', '71529', '4696', '0'), +('5', '58', '3', '11052', '3153', '0'), +('5', '58', '5', '27705', '8540', '0'), +('5', '58', '5', '14703', '7150', '0'), +('5', '58', '5', '4501', '4846', '0'), +('5', '58', '5', '14700', '4806', '0'), +('5', '58', '8', '11621', '26579', '0'), +('5', '58', '8', '11551', '8753', '0'), +('5', '58', '8', '11603', '7912', '0'), +('5', '58', '8', '1409', '7747', '0'), +('5', '58', '6', '1557', '8270', '0'), +('5', '58', '6', '11699', '8216', '0'), +('5', '58', '6', '4302', '5120', '0'), +('5', '58', '6', '25062', '3672', '0'), +('5', '58', '17', '4832', '15834', '0'), +('5', '58', '17', '4842', '12400', '0'), +('5', '58', '17', '3141', '9126', '0'), +('5', '58', '17', '4309', '8225', '0'), +('5', '58', '7', '4343', '6656', '0'), +('5', '58', '7', '4833', '6478', '0'), +('5', '58', '7', '4843', '5389', '0'), +('5', '58', '7', '2458', '4153', '0'), +('5', '58', '9', '4834', '4408', '0'), +('5', '58', '9', '4311', '3788', '0'), +('5', '58', '9', '4844', '3681', '0'), +('5', '58', '9', '12189', '3471', '0'), +('5', '58', '15', '10366', '8054', '0'), +('5', '58', '15', '10151', '7200', '0'), +('5', '58', '15', '14679', '7010', '0'), +('5', '58', '15', '14678', '5708', '0'), +('5', '58', '20', '2704', '24485', '0'), +('5', '58', '20', '11601', '20519', '0'), +('5', '58', '20', '2918', '11843', '0'), +('5', '58', '20', '1365', '10500', '0'), +('5', '58', '12', '4835', '11360', '0'), +('5', '58', '12', '20655', '8866', '0'), +('5', '58', '12', '4845', '6553', '0'), +('5', '58', '12', '11624', '5896', '0'), +('5', '58', '18', '4836', '7795', '0'), +('5', '58', '18', '3145', '6712', '0'), +('5', '58', '18', '4846', '5554', '0'), +('5', '58', '18', '4346', '4645', '0'), +('5', '58', '19', '4837', '8021', '0'), +('5', '58', '19', '4847', '7248', '0'), +('5', '58', '19', '68239', '5841', '0'), +('5', '58', '19', '3146', '4221', '0'), +('5', '58', '13', '27961', '43342', '0'), +('5', '58', '13', '45120', '35878', '0'), +('5', '58', '13', '27895', '31851', '0'), +('5', '58', '13', '27707', '30089', '0'), +('5', '58', '14', '9402', '34148', '0'), +('5', '58', '14', '11678', '32840', '0'), +('5', '58', '14', '11632', '32144', '0'), +('5', '58', '14', '11551', '23853', '0'), +('5', '58', '11', '45137', '26791', '0'), +('5', '58', '11', '8408', '10006', '0'), +('5', '58', '11', '8325', '9973', '0'), +('5', '58', '11', '8811', '7792', '0'), +('5', '59', '22', '8567', '0', '0'), +('5', '59', '22', '10323', '0', '0'), +('5', '59', '22', '8504', '0', '0'), +('5', '59', '22', '9246', '0', '0'), +('5', '59', '1', '14701', '4854', '0'), +('5', '59', '1', '10082', '3695', '0'), +('5', '59', '1', '14702', '3550', '0'), +('5', '59', '1', '10165', '1940', '0'), +('5', '59', '2', '4841', '10858', '0'), +('5', '59', '2', '4301', '7726', '0'), +('5', '59', '2', '4831', '7109', '0'), +('5', '59', '2', '4620', '6382', '0'), +('5', '59', '3', '1544', '5540', '0'), +('5', '59', '3', '4322', '5343', '0'), +('5', '59', '3', '71529', '4721', '0'), +('5', '59', '3', '11052', '3207', '0'), +('5', '59', '5', '27705', '8591', '0'), +('5', '59', '5', '14703', '7150', '0'), +('5', '59', '5', '4501', '4894', '0'), +('5', '59', '5', '14700', '4806', '0'), +('5', '59', '8', '11621', '26579', '0'), +('5', '59', '8', '11551', '8753', '0'), +('5', '59', '8', '11603', '7944', '0'), +('5', '59', '8', '1409', '7747', '0'), +('5', '59', '6', '11699', '8271', '0'), +('5', '59', '6', '1557', '8270', '0'), +('5', '59', '6', '4302', '5156', '0'), +('5', '59', '6', '25062', '3672', '0'), +('5', '59', '17', '4832', '15924', '0'), +('5', '59', '17', '4842', '12454', '0'), +('5', '59', '17', '3141', '9186', '0'), +('5', '59', '17', '4309', '8225', '0'), +('5', '59', '7', '4343', '6716', '0'), +('5', '59', '7', '4833', '6478', '0'), +('5', '59', '7', '4843', '5389', '0'), +('5', '59', '7', '2458', '4167', '0'), +('5', '59', '9', '4834', '4408', '0'), +('5', '59', '9', '4311', '3831', '0'), +('5', '59', '9', '4844', '3692', '0'), +('5', '59', '9', '12189', '3471', '0'), +('5', '59', '15', '10366', '8054', '0'), +('5', '59', '15', '10151', '7200', '0'), +('5', '59', '15', '14679', '7010', '0'), +('5', '59', '15', '14678', '5708', '0'), +('5', '59', '20', '2704', '24507', '0'), +('5', '59', '20', '11601', '20580', '0'), +('5', '59', '20', '2918', '11862', '0'), +('5', '59', '20', '1365', '10500', '0'), +('5', '59', '12', '4835', '11390', '0'), +('5', '59', '12', '20655', '8886', '0'), +('5', '59', '12', '4845', '6572', '0'), +('5', '59', '12', '11624', '5939', '0'), +('5', '59', '18', '4836', '7825', '0'), +('5', '59', '18', '3145', '6767', '0'), +('5', '59', '18', '4846', '5554', '0'), +('5', '59', '18', '4346', '4645', '0'), +('5', '59', '19', '4837', '8039', '0'), +('5', '59', '19', '4847', '7279', '0'), +('5', '59', '19', '68239', '5852', '0'), +('5', '59', '19', '3146', '4239', '0'), +('5', '59', '13', '27961', '43731', '0'), +('5', '59', '13', '45120', '36163', '0'), +('5', '59', '13', '27895', '32096', '0'), +('5', '59', '13', '27707', '30328', '0'), +('5', '59', '14', '9402', '34178', '0'), +('5', '59', '14', '11678', '32840', '0'), +('5', '59', '14', '11632', '32234', '0'), +('5', '59', '14', '11551', '23853', '0'), +('5', '59', '11', '45137', '27456', '0'), +('5', '59', '11', '8408', '10091', '0'), +('5', '59', '11', '8325', '10049', '0'), +('5', '59', '11', '8811', '7858', '0'), +('5', '60', '22', '21805', '0', '3'), +('5', '60', '22', '61948', '0', '3'), +('5', '60', '22', '21807', '0', '3'), +('5', '60', '22', '12425', '0', '3'), +('5', '60', '1', '7945', '24244', '3'), +('5', '60', '1', '26775', '17213', '3'), +('5', '60', '1', '63170', '15188', '3'), +('5', '60', '1', '29861', '14863', '3'), +('5', '60', '2', '26025', '23578', '3'), +('5', '60', '2', '2612', '23578', '3'), +('5', '60', '2', '26759', '16725', '3'), +('5', '60', '2', '28986', '15931', '3'), +('5', '60', '3', '26773', '18328', '3'), +('5', '60', '3', '26751', '15694', '3'), +('5', '60', '3', '28942', '15677', '3'), +('5', '60', '3', '31233', '14447', '3'), +('5', '60', '5', '28885', '32303', '3'), +('5', '60', '5', '27266', '26858', '3'), +('5', '60', '5', '8364', '21121', '3'), +('5', '60', '5', '7868', '16201', '3'), +('5', '60', '8', '26765', '35824', '3'), +('5', '60', '8', '26766', '35221', '3'), +('5', '60', '8', '31471', '31262', '3'), +('5', '60', '8', '11621', '23502', '3'), +('5', '60', '6', '28902', '35353', '3'), +('5', '60', '6', '30551', '16198', '3'), +('5', '60', '6', '28919', '16003', '3'), +('5', '60', '6', '26753', '14103', '3'), +('5', '60', '17', '28937', '36633', '3'), +('5', '60', '17', '29457', '31574', '3'), +('5', '60', '17', '27261', '21544', '3'), +('5', '60', '17', '26770', '21157', '3'), +('5', '60', '7', '28926', '17157', '3'), +('5', '60', '7', '7868', '16201', '3'), +('5', '60', '7', '26584', '15464', '3'), +('5', '60', '7', '8288', '14679', '3'), +('5', '60', '9', '31461', '31535', '3'), +('5', '60', '9', '7868', '16201', '3'), +('5', '60', '9', '26584', '15464', '3'), +('5', '60', '9', '31460', '14460', '3'), +('5', '60', '15', '27950', '23112', '3'), +('5', '60', '15', '26749', '18731', '3'), +('5', '60', '15', '63170', '15188', '3'), +('5', '60', '15', '7870', '14838', '3'), +('5', '60', '20', '28890', '32481', '3'), +('5', '60', '20', '31235', '30777', '3'), +('5', '60', '20', '31334', '28637', '3'), +('5', '60', '20', '26551', '28557', '3'), +('5', '60', '12', '25857', '31789', '3'), +('5', '60', '12', '28967', '17425', '3'), +('5', '60', '12', '26774', '15515', '3'), +('5', '60', '12', '31227', '14849', '3'), +('5', '60', '18', '28965', '16777', '3'), +('5', '60', '18', '28932', '14440', '3'), +('5', '60', '18', '8289', '14363', '3'), +('5', '60', '18', '26755', '13446', '3'), +('5', '60', '19', '30569', '35336', '3'), +('5', '60', '19', '28888', '29918', '3'), +('5', '60', '19', '24616', '23667', '3'), +('5', '60', '19', '7871', '14495', '3'), +('5', '60', '13', '28824', '59106', '3'), +('5', '60', '13', '31317', '55295', '3'), +('5', '60', '13', '30530', '55185', '3'), +('5', '60', '13', '27949', '54755', '3'), +('5', '60', '14', '28915', '17804', '3'), +('5', '60', '14', '28970', '17072', '3'), +('5', '60', '14', '26754', '16539', '3'), +('5', '60', '14', '26564', '15019', '3'), +('5', '60', '11', '30539', '39113', '3'), +('5', '60', '11', '28935', '38821', '3'), +('5', '60', '11', '7904', '33938', '3'), +('5', '60', '11', '26563', '28789', '3'), +('5', '60', '22', '8567', '0', '2'), +('5', '60', '22', '10323', '0', '2'), +('5', '60', '22', '9248', '0', '2'), +('5', '60', '22', '30014', '0', '2'), +('5', '60', '1', '2748', '8505', '2'), +('5', '60', '1', '31236', '7910', '2'), +('5', '60', '1', '62234', '7566', '2'), +('5', '60', '1', '5716', '7282', '2'), +('5', '60', '2', '2612', '24841', '2'), +('5', '60', '2', '26025', '24841', '2'), +('5', '60', '2', '29648', '15872', '2'), +('5', '60', '2', '25194', '14332', '2'), +('5', '60', '3', '31233', '16893', '2'), +('5', '60', '3', '31244', '13528', '2'), +('5', '60', '3', '31464', '11699', '2'), +('5', '60', '3', '31378', '10704', '2'), +('5', '60', '5', '27266', '27927', '2'), +('5', '60', '5', '31460', '17033', '2'), +('5', '60', '5', '31234', '14313', '2'), +('5', '60', '5', '31318', '12586', '2'), +('5', '60', '8', '31471', '33357', '2'), +('5', '60', '8', '11621', '24015', '2'), +('5', '60', '8', '27261', '22966', '2'), +('5', '60', '8', '22819', '20515', '2'), +('5', '60', '6', '31472', '15751', '2'), +('5', '60', '6', '31240', '12056', '2'), +('5', '60', '6', '5723', '11885', '2'), +('5', '60', '6', '24070', '11840', '2'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '60', '17', '29457', '34284', '2'), +('5', '60', '17', '27261', '22966', '2'), +('5', '60', '17', '25044', '16046', '2'), +('5', '60', '17', '10845', '15516', '2'), +('5', '60', '7', '5723', '11885', '2'), +('5', '60', '7', '29485', '9381', '2'), +('5', '60', '7', '31381', '8594', '2'), +('5', '60', '7', '31100', '7303', '2'), +('5', '60', '9', '31461', '34358', '2'), +('5', '60', '9', '31460', '17033', '2'), +('5', '60', '9', '5723', '11885', '2'), +('5', '60', '9', '31246', '10994', '2'), +('5', '60', '15', '31231', '16135', '2'), +('5', '60', '15', '25211', '15717', '2'), +('5', '60', '15', '30388', '12552', '2'), +('5', '60', '15', '30385', '11489', '2'), +('5', '60', '20', '31235', '33519', '2'), +('5', '60', '20', '31334', '30483', '2'), +('5', '60', '20', '31364', '30096', '2'), +('5', '60', '20', '31353', '23039', '2'), +('5', '60', '12', '25857', '33662', '2'), +('5', '60', '12', '31227', '18308', '2'), +('5', '60', '12', '31306', '14608', '2'), +('5', '60', '12', '29177', '14000', '2'), +('5', '60', '18', '31103', '10948', '2'), +('5', '60', '18', '31332', '8519', '2'), +('5', '60', '18', '25354', '8368', '2'), +('5', '60', '18', '31005', '8001', '2'), +('5', '60', '19', '24616', '24328', '2'), +('5', '60', '19', '25197', '10472', '2'), +('5', '60', '19', '62371', '9344', '2'), +('5', '60', '19', '29455', '8714', '2'), +('5', '60', '13', '31317', '56800', '2'), +('5', '60', '13', '31304', '55907', '2'), +('5', '60', '13', '2580', '54951', '2'), +('5', '60', '13', '31232', '52692', '2'), +('5', '60', '14', '31462', '19461', '2'), +('5', '60', '14', '31316', '16393', '2'), +('5', '60', '14', '25098', '15669', '2'), +('5', '60', '14', '31211', '15460', '2'), +('5', '60', '11', '29433', '24937', '2'), +('5', '60', '11', '27326', '24937', '2'), +('5', '60', '11', '31469', '24519', '2'), +('5', '60', '11', '45137', '23224', '2'), +('5', '60', '22', '8567', '0', '1'), +('5', '60', '22', '10323', '0', '1'), +('5', '60', '22', '12425', '0', '1'), +('5', '60', '22', '8504', '0', '1'), +('5', '60', '1', '62234', '9304', '1'), +('5', '60', '1', '10912', '7732', '1'), +('5', '60', '1', '5716', '6448', '1'), +('5', '60', '1', '5715', '5996', '1'), +('5', '60', '2', '10913', '17204', '1'), +('5', '60', '2', '1630', '9391', '1'), +('5', '60', '2', '50036', '8701', '1'), +('5', '60', '2', '4841', '7985', '1'), +('5', '60', '3', '46184', '8234', '1'), +('5', '60', '3', '1625', '5704', '1'), +('5', '60', '3', '1544', '4141', '1'), +('5', '60', '3', '4322', '4014', '1'), +('5', '60', '5', '14703', '7150', '1'), +('5', '60', '5', '27705', '5408', '1'), +('5', '60', '5', '8285', '4776', '1'), +('5', '60', '5', '14709', '4672', '1'), +('5', '60', '8', '11621', '25297', '1'), +('5', '60', '8', '1627', '21600', '1'), +('5', '60', '8', '1619', '21565', '1'), +('5', '60', '8', '1628', '14756', '1'), +('5', '60', '6', '5723', '14009', '1'), +('5', '60', '6', '5706', '8883', '1'), +('5', '60', '6', '1557', '7033', '1'), +('5', '60', '6', '11699', '5528', '1'), +('5', '60', '17', '10845', '19525', '1'), +('5', '60', '17', '14370', '13647', '1'), +('5', '60', '17', '4133', '9835', '1'), +('5', '60', '17', '4832', '9453', '1'), +('5', '60', '7', '5723', '14009', '1'), +('5', '60', '7', '62046', '5796', '1'), +('5', '60', '7', '4295', '4590', '1'), +('5', '60', '7', '4343', '4000', '1'), +('5', '60', '9', '5723', '14009', '1'), +('5', '60', '9', '5794', '3858', '1'), +('5', '60', '9', '4294', '3594', '1'), +('5', '60', '9', '4834', '2860', '1'), +('5', '60', '15', '5727', '12068', '1'), +('5', '60', '15', '5728', '8335', '1'), +('5', '60', '15', '10366', '8032', '1'), +('5', '60', '15', '10151', '7200', '1'), +('5', '60', '20', '2704', '22878', '1'), +('5', '60', '20', '1620', '19712', '1'), +('5', '60', '20', '11601', '18534', '1'), +('5', '60', '20', '1623', '12357', '1'), +('5', '60', '12', '4835', '8790', '1'), +('5', '60', '12', '20655', '6444', '1'), +('5', '60', '12', '4845', '4443', '1'), +('5', '60', '12', '3255', '4383', '1'), +('5', '60', '18', '4527', '8220', '1'), +('5', '60', '18', '5711', '5232', '1'), +('5', '60', '18', '11612', '5184', '1'), +('5', '60', '18', '4836', '4636', '1'), +('5', '60', '19', '24616', '25981', '1'), +('5', '60', '19', '4837', '5125', '1'), +('5', '60', '19', '4847', '4474', '1'), +('5', '60', '19', '4318', '4434', '1'), +('5', '60', '13', '27961', '42580', '1'), +('5', '60', '13', '5603', '38904', '1'), +('5', '60', '13', '14383', '37293', '1'), +('5', '60', '13', '45120', '35179', '1'), +('5', '60', '14', '10851', '25757', '1'), +('5', '60', '14', '9402', '24289', '1'), +('5', '60', '14', '9408', '23768', '1'), +('5', '60', '14', '11632', '21128', '1'), +('5', '60', '11', '45137', '25650', '1'), +('5', '60', '11', '5758', '17640', '1'), +('5', '60', '11', '8325', '10134', '1'), +('5', '60', '11', '8408', '10083', '1'), +('5', '61', '22', '21805', '0', '3'), +('5', '61', '22', '61948', '0', '3'), +('5', '61', '22', '21807', '0', '3'), +('5', '61', '22', '12425', '0', '3'), +('5', '61', '1', '7945', '24245', '3'), +('5', '61', '1', '26775', '17215', '3'), +('5', '61', '1', '63170', '15139', '3'), +('5', '61', '1', '29861', '14867', '3'), +('5', '61', '2', '26025', '23579', '3'), +('5', '61', '2', '2612', '23579', '3'), +('5', '61', '2', '26759', '16725', '3'), +('5', '61', '2', '28986', '15934', '3'), +('5', '61', '3', '26773', '18331', '3'), +('5', '61', '3', '26751', '15695', '3'), +('5', '61', '3', '28942', '15679', '3'), +('5', '61', '3', '31233', '14449', '3'), +('5', '61', '5', '28885', '32304', '3'), +('5', '61', '5', '27266', '26859', '3'), +('5', '61', '5', '8364', '21123', '3'), +('5', '61', '5', '7868', '16202', '3'), +('5', '61', '8', '26765', '35824', '3'), +('5', '61', '8', '26766', '35223', '3'), +('5', '61', '8', '31471', '31263', '3'), +('5', '61', '8', '11621', '23502', '3'), +('5', '61', '6', '28902', '35355', '3'), +('5', '61', '6', '30551', '16200', '3'), +('5', '61', '6', '28919', '16005', '3'), +('5', '61', '6', '26753', '14103', '3'), +('5', '61', '17', '28937', '36635', '3'), +('5', '61', '17', '29457', '31574', '3'), +('5', '61', '17', '27261', '21545', '3'), +('5', '61', '17', '26770', '21160', '3'), +('5', '61', '7', '28926', '17157', '3'), +('5', '61', '7', '7868', '16202', '3'), +('5', '61', '7', '26584', '15467', '3'), +('5', '61', '7', '8288', '14679', '3'), +('5', '61', '9', '31461', '31537', '3'), +('5', '61', '9', '7868', '16202', '3'), +('5', '61', '9', '26584', '15467', '3'), +('5', '61', '9', '31460', '14461', '3'), +('5', '61', '15', '27950', '23113', '3'), +('5', '61', '15', '26749', '18734', '3'), +('5', '61', '15', '63170', '15139', '3'), +('5', '61', '15', '7870', '14839', '3'), +('5', '61', '20', '28890', '32481', '3'), +('5', '61', '20', '31235', '30779', '3'), +('5', '61', '20', '31334', '28637', '3'), +('5', '61', '20', '26551', '28561', '3'), +('5', '61', '12', '25857', '31790', '3'), +('5', '61', '12', '28967', '17425', '3'), +('5', '61', '12', '26774', '15517', '3'), +('5', '61', '12', '31227', '14852', '3'), +('5', '61', '18', '28965', '16779', '3'), +('5', '61', '18', '28932', '14443', '3'), +('5', '61', '18', '8289', '14364', '3'), +('5', '61', '18', '26755', '13446', '3'), +('5', '61', '19', '30569', '35337', '3'), +('5', '61', '19', '28888', '29919', '3'), +('5', '61', '19', '24616', '23667', '3'), +('5', '61', '19', '7871', '14498', '3'), +('5', '61', '13', '28824', '59305', '3'), +('5', '61', '13', '31317', '55325', '3'), +('5', '61', '13', '30530', '55243', '3'), +('5', '61', '13', '27949', '54812', '3'), +('5', '61', '14', '28915', '17805', '3'), +('5', '61', '14', '28970', '17073', '3'), +('5', '61', '14', '26754', '16541', '3'), +('5', '61', '14', '26564', '15023', '3'), +('5', '61', '11', '30539', '39217', '3'), +('5', '61', '11', '28935', '38929', '3'), +('5', '61', '11', '7904', '33966', '3'), +('5', '61', '11', '26563', '28790', '3'), +('5', '62', '22', '21805', '0', '3'), +('5', '62', '22', '61948', '0', '3'), +('5', '62', '22', '21807', '0', '3'), +('5', '62', '22', '12425', '0', '3'), +('5', '62', '1', '7945', '24245', '3'), +('5', '62', '1', '26775', '17217', '3'), +('5', '62', '1', '63170', '15091', '3'), +('5', '62', '1', '29861', '14871', '3'), +('5', '62', '2', '26025', '23580', '3'), +('5', '62', '2', '2612', '23580', '3'), +('5', '62', '2', '26759', '16725', '3'), +('5', '62', '2', '28986', '15938', '3'), +('5', '62', '3', '26773', '18334', '3'), +('5', '62', '3', '26751', '15696', '3'), +('5', '62', '3', '28942', '15681', '3'), +('5', '62', '3', '31233', '14450', '3'), +('5', '62', '5', '28885', '32305', '3'), +('5', '62', '5', '27266', '26860', '3'), +('5', '62', '5', '8364', '21126', '3'), +('5', '62', '5', '7868', '16204', '3'), +('5', '62', '8', '26765', '35825', '3'), +('5', '62', '8', '26766', '35226', '3'), +('5', '62', '8', '31471', '31265', '3'), +('5', '62', '8', '11621', '23502', '3'), +('5', '62', '6', '28902', '35357', '3'), +('5', '62', '6', '30551', '16201', '3'), +('5', '62', '6', '28919', '16007', '3'), +('5', '62', '6', '26753', '14103', '3'), +('5', '62', '17', '28937', '36636', '3'), +('5', '62', '17', '29457', '31574', '3'), +('5', '62', '17', '27261', '21546', '3'), +('5', '62', '17', '26770', '21164', '3'), +('5', '62', '7', '28926', '17158', '3'), +('5', '62', '7', '7868', '16204', '3'), +('5', '62', '7', '26584', '15469', '3'), +('5', '62', '7', '8288', '14679', '3'), +('5', '62', '9', '31461', '31538', '3'), +('5', '62', '9', '7868', '16204', '3'), +('5', '62', '9', '26584', '15469', '3'), +('5', '62', '9', '31460', '14463', '3'), +('5', '62', '15', '27950', '23114', '3'), +('5', '62', '15', '26749', '18736', '3'), +('5', '62', '15', '63170', '15091', '3'), +('5', '62', '15', '7870', '14839', '3'), +('5', '62', '20', '28890', '32481', '3'), +('5', '62', '20', '31235', '30781', '3'), +('5', '62', '20', '31334', '28638', '3'), +('5', '62', '20', '26551', '28564', '3'), +('5', '62', '12', '25857', '31790', '3'), +('5', '62', '12', '28967', '17425', '3'), +('5', '62', '12', '26774', '15518', '3'), +('5', '62', '12', '31227', '14854', '3'), +('5', '62', '18', '28965', '16781', '3'), +('5', '62', '18', '28932', '14446', '3'), +('5', '62', '18', '8289', '14364', '3'), +('5', '62', '18', '26755', '13446', '3'), +('5', '62', '19', '30569', '35338', '3'), +('5', '62', '19', '28888', '29920', '3'), +('5', '62', '19', '24616', '23667', '3'), +('5', '62', '19', '7871', '14501', '3'), +('5', '62', '13', '28824', '59504', '3'), +('5', '62', '13', '31317', '55383', '3'), +('5', '62', '13', '30530', '55301', '3'), +('5', '62', '13', '31304', '54920', '3'), +('5', '62', '14', '28915', '17806', '3'), +('5', '62', '14', '28970', '17075', '3'), +('5', '62', '14', '26754', '16544', '3'), +('5', '62', '14', '26564', '15027', '3'), +('5', '62', '11', '30539', '39320', '3'), +('5', '62', '11', '28935', '39029', '3'), +('5', '62', '11', '7904', '33985', '3'), +('5', '62', '11', '26563', '28791', '3'), +('5', '63', '22', '21805', '0', '3'), +('5', '63', '22', '61948', '0', '3'), +('5', '63', '22', '21807', '0', '3'), +('5', '63', '22', '12425', '0', '3'), +('5', '63', '1', '7945', '24246', '3'), +('5', '63', '1', '26775', '17218', '3'), +('5', '63', '1', '63170', '15043', '3'), +('5', '63', '1', '29861', '14875', '3'), +('5', '63', '2', '26025', '23580', '3'), +('5', '63', '2', '2612', '23580', '3'), +('5', '63', '2', '26759', '16725', '3'), +('5', '63', '2', '28986', '15941', '3'), +('5', '63', '3', '26773', '18337', '3'), +('5', '63', '3', '26751', '15697', '3'), +('5', '63', '3', '28942', '15682', '3'), +('5', '63', '3', '31233', '14452', '3'), +('5', '63', '5', '28885', '32307', '3'), +('5', '63', '5', '27266', '26861', '3'), +('5', '63', '5', '8364', '21128', '3'), +('5', '63', '5', '7868', '16205', '3'), +('5', '63', '8', '26765', '35826', '3'), +('5', '63', '8', '26766', '35228', '3'), +('5', '63', '8', '31471', '31266', '3'), +('5', '63', '8', '11621', '23502', '3'), +('5', '63', '6', '28902', '35358', '3'), +('5', '63', '6', '30551', '16202', '3'), +('5', '63', '6', '28919', '16009', '3'), +('5', '63', '6', '26753', '14103', '3'), +('5', '63', '17', '28937', '36638', '3'), +('5', '63', '17', '29457', '31574', '3'), +('5', '63', '17', '27261', '21548', '3'), +('5', '63', '17', '26770', '21167', '3'), +('5', '63', '7', '28926', '17158', '3'), +('5', '63', '7', '7868', '16205', '3'), +('5', '63', '7', '26584', '15471', '3'), +('5', '63', '7', '8288', '14679', '3'), +('5', '63', '9', '31461', '31540', '3'), +('5', '63', '9', '7868', '16205', '3'), +('5', '63', '9', '26584', '15471', '3'), +('5', '63', '9', '31460', '14465', '3'), +('5', '63', '15', '27950', '23115', '3'), +('5', '63', '15', '26749', '18739', '3'), +('5', '63', '15', '63170', '15043', '3'), +('5', '63', '15', '7870', '14840', '3'), +('5', '63', '20', '28890', '32481', '3'), +('5', '63', '20', '31235', '30783', '3'), +('5', '63', '20', '31334', '28639', '3'), +('5', '63', '20', '26551', '28568', '3'), +('5', '63', '12', '25857', '31791', '3'), +('5', '63', '12', '28967', '17425', '3'), +('5', '63', '12', '26774', '15520', '3'), +('5', '63', '12', '31227', '14857', '3'), +('5', '63', '18', '28965', '16783', '3'), +('5', '63', '18', '28932', '14448', '3'), +('5', '63', '18', '8289', '14365', '3'), +('5', '63', '18', '26755', '13446', '3'), +('5', '63', '19', '30569', '35339', '3'), +('5', '63', '19', '28888', '29921', '3'), +('5', '63', '19', '24616', '23667', '3'), +('5', '63', '19', '7871', '14504', '3'), +('5', '63', '13', '28824', '59703', '3'), +('5', '63', '13', '31317', '55441', '3'), +('5', '63', '13', '30530', '55359', '3'), +('5', '63', '13', '31304', '55205', '3'), +('5', '63', '14', '28915', '17807', '3'), +('5', '63', '14', '28970', '17076', '3'), +('5', '63', '14', '26754', '16547', '3'), +('5', '63', '14', '26564', '15031', '3'), +('5', '63', '11', '30539', '39415', '3'), +('5', '63', '11', '28935', '39138', '3'), +('5', '63', '11', '7904', '34013', '3'), +('5', '63', '11', '26563', '28792', '3'), +('5', '64', '22', '21805', '0', '3'), +('5', '64', '22', '61948', '0', '3'), +('5', '64', '22', '21807', '0', '3'), +('5', '64', '22', '12425', '0', '3'), +('5', '64', '1', '7945', '24246', '3'), +('5', '64', '1', '26775', '17220', '3'), +('5', '64', '1', '63170', '14994', '3'), +('5', '64', '1', '29861', '14879', '3'), +('5', '64', '2', '26025', '23581', '3'), +('5', '64', '2', '2612', '23581', '3'), +('5', '64', '2', '26759', '16725', '3'), +('5', '64', '2', '28986', '15945', '3'), +('5', '64', '3', '26773', '18340', '3'), +('5', '64', '3', '26751', '15698', '3'), +('5', '64', '3', '28942', '15684', '3'), +('5', '64', '3', '31233', '14454', '3'), +('5', '64', '5', '28885', '32308', '3'), +('5', '64', '5', '27266', '26863', '3'), +('5', '64', '5', '8364', '21130', '3'), +('5', '64', '5', '7868', '16206', '3'), +('5', '64', '8', '26765', '35827', '3'), +('5', '64', '8', '26766', '35230', '3'), +('5', '64', '8', '31471', '31268', '3'), +('5', '64', '8', '11621', '23502', '3'), +('5', '64', '6', '28902', '35360', '3'), +('5', '64', '6', '30551', '16203', '3'), +('5', '64', '6', '28919', '16011', '3'), +('5', '64', '6', '26753', '14103', '3'), +('5', '64', '17', '28937', '36639', '3'), +('5', '64', '17', '29457', '31574', '3'), +('5', '64', '17', '27261', '21549', '3'), +('5', '64', '17', '26770', '21171', '3'), +('5', '64', '7', '28926', '17159', '3'), +('5', '64', '7', '7868', '16206', '3'), +('5', '64', '7', '26584', '15473', '3'), +('5', '64', '7', '8288', '14679', '3'), +('5', '64', '9', '31461', '31542', '3'), +('5', '64', '9', '7868', '16206', '3'), +('5', '64', '9', '26584', '15473', '3'), +('5', '64', '9', '31460', '14466', '3'), +('5', '64', '15', '27950', '23116', '3'), +('5', '64', '15', '26749', '18741', '3'), +('5', '64', '15', '63170', '14994', '3'), +('5', '64', '15', '7870', '14840', '3'), +('5', '64', '20', '28890', '32481', '3'), +('5', '64', '20', '31235', '30785', '3'), +('5', '64', '20', '31334', '28640', '3'), +('5', '64', '20', '26551', '28571', '3'), +('5', '64', '12', '25857', '31791', '3'), +('5', '64', '12', '28967', '17425', '3'), +('5', '64', '12', '26774', '15521', '3'), +('5', '64', '12', '31227', '14859', '3'), +('5', '64', '18', '28965', '16785', '3'), +('5', '64', '18', '28932', '14451', '3'), +('5', '64', '18', '8289', '14365', '3'), +('5', '64', '18', '26755', '13446', '3'), +('5', '64', '19', '30569', '35340', '3'), +('5', '64', '19', '28888', '29923', '3'), +('5', '64', '19', '24616', '23667', '3'), +('5', '64', '19', '7871', '14507', '3'), +('5', '64', '13', '28824', '59902', '3'), +('5', '64', '13', '31317', '55499', '3'), +('5', '64', '13', '31304', '55462', '3'), +('5', '64', '13', '30530', '55446', '3'), +('5', '64', '14', '28915', '17808', '3'), +('5', '64', '14', '28970', '17077', '3'), +('5', '64', '14', '26754', '16549', '3'), +('5', '64', '14', '26564', '15035', '3'), +('5', '64', '11', '30539', '39518', '3'), +('5', '64', '11', '28935', '39237', '3'), +('5', '64', '11', '7904', '34032', '3'), +('5', '64', '11', '26563', '28793', '3'), +('5', '65', '22', '21805', '0', '7'), +('5', '65', '22', '61948', '0', '7'), +('5', '65', '22', '21807', '0', '7'), +('5', '65', '22', '12425', '0', '7'), +('5', '65', '1', '68949', '57893', '7'), +('5', '65', '1', '7125', '45981', '7'), +('5', '65', '1', '32106', '42957', '7'), +('5', '65', '1', '69166', '41476', '7'), +('5', '65', '2', '28647', '46586', '7'), +('5', '65', '2', '28605', '45685', '7'), +('5', '65', '2', '28648', '45617', '7'), +('5', '65', '2', '69087', '35166', '7'), +('5', '65', '3', '69157', '39116', '7'), +('5', '65', '3', '69069', '35631', '7'), +('5', '65', '3', '69074', '34524', '7'), +('5', '65', '3', '69068', '34095', '7'), +('5', '65', '5', '67625', '42149', '7'), +('5', '65', '5', '69135', '39816', '7'), +('5', '65', '5', '7769', '35632', '7'), +('5', '65', '5', '69097', '35551', '7'), +('5', '65', '8', '69165', '63766', '7'), +('5', '65', '8', '69064', '60107', '7'), +('5', '65', '8', '69072', '58310', '7'), +('5', '65', '8', '69065', '36241', '7'), +('5', '65', '6', '68757', '53726', '7'), +('5', '65', '6', '13674', '49419', '7'), +('5', '65', '6', '69130', '40001', '7'), +('5', '65', '6', '19144', '39239', '7'), +('5', '65', '17', '69150', '44277', '7'), +('5', '65', '17', '28937', '36641', '7'), +('5', '65', '17', '68748', '35759', '7'), +('5', '65', '17', '68966', '35007', '7'), +('5', '65', '7', '16097', '40973', '7'), +('5', '65', '7', '69168', '38044', '7'), +('5', '65', '7', '69079', '34889', '7'), +('5', '65', '7', '68866', '31921', '7'), +('5', '65', '9', '68766', '44833', '7'), +('5', '65', '9', '16097', '40973', '7'), +('5', '65', '9', '69126', '40258', '7'), +('5', '65', '9', '11103', '39837', '7'), +('5', '65', '15', '9959', '39686', '7'), +('5', '65', '15', '69160', '39628', '7'), +('5', '65', '15', '68111', '39404', '7'), +('5', '65', '15', '69131', '38913', '7'), +('5', '65', '20', '16156', '54726', '7'), +('5', '65', '20', '69134', '42416', '7'), +('5', '65', '20', '67625', '42149', '7'), +('5', '65', '20', '16097', '40973', '7'), +('5', '65', '12', '69252', '40113', '7'), +('5', '65', '12', '69083', '34758', '7'), +('5', '65', '12', '25857', '31792', '7'), +('5', '65', '12', '68867', '30396', '7'), +('5', '65', '18', '69146', '42336', '7'), +('5', '65', '18', '68967', '33262', '7'), +('5', '65', '18', '68779', '32118', '7'), +('5', '65', '18', '28650', '30269', '7'), +('5', '65', '19', '19094', '39499', '7'), +('5', '65', '19', '69177', '39380', '7'), +('5', '65', '19', '69075', '35737', '7'), +('5', '65', '19', '30569', '35341', '7'), +('5', '65', '13', '69053', '102744', '7'), +('5', '65', '13', '68835', '97227', '7'), +('5', '65', '13', '69043', '95725', '7'), +('5', '65', '13', '69113', '93612', '7'), +('5', '65', '14', '69161', '45746', '7'), +('5', '65', '14', '69049', '39748', '7'), +('5', '65', '14', '69155', '39228', '7'), +('5', '65', '14', '69048', '36250', '7'), +('5', '65', '11', '69054', '61441', '7'), +('5', '65', '11', '27818', '47722', '7'), +('5', '65', '11', '68662', '46201', '7'), +('5', '65', '11', '27986', '41373', '7'), +('5', '65', '22', '21805', '0', '6'), +('5', '65', '22', '61948', '0', '6'), +('5', '65', '22', '21807', '0', '6'), +('5', '65', '22', '12425', '0', '6'), +('5', '65', '1', '7125', '45981', '6'), +('5', '65', '1', '32106', '42957', '6'), +('5', '65', '1', '7123', '31250', '6'), +('5', '65', '1', '4119', '26493', '6'), +('5', '65', '2', '28647', '46586', '6'), +('5', '65', '2', '28605', '45685', '6'), +('5', '65', '2', '28648', '45617', '6'), +('5', '65', '2', '26025', '23582', '6'), +('5', '65', '3', '26982', '29207', '6'), +('5', '65', '3', '9435', '26549', '6'), +('5', '65', '3', '26983', '24781', '6'), +('5', '65', '3', '29174', '24688', '6'), +('5', '65', '5', '7769', '35632', '6'), +('5', '65', '5', '28885', '32309', '6'), +('5', '65', '5', '8977', '28686', '6'), +('5', '65', '5', '8785', '27980', '6'), +('5', '65', '8', '26765', '35828', '6'), +('5', '65', '8', '26766', '35233', '6'), +('5', '65', '8', '15803', '32856', '6'), +('5', '65', '8', '31471', '31269', '6'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '65', '6', '13674', '49419', '6'), +('5', '65', '6', '19144', '39239', '6'), +('5', '65', '6', '28902', '35361', '6'), +('5', '65', '6', '71006', '33397', '6'), +('5', '65', '17', '28937', '36641', '6'), +('5', '65', '17', '29457', '31574', '6'), +('5', '65', '17', '47645', '30075', '6'), +('5', '65', '17', '15002', '25357', '6'), +('5', '65', '7', '16097', '40973', '6'), +('5', '65', '7', '21995', '25513', '6'), +('5', '65', '7', '68090', '22551', '6'), +('5', '65', '7', '11441', '21882', '6'), +('5', '65', '9', '16097', '40973', '6'), +('5', '65', '9', '11103', '39837', '6'), +('5', '65', '9', '31461', '31543', '6'), +('5', '65', '9', '32100', '29785', '6'), +('5', '65', '15', '9959', '39686', '6'), +('5', '65', '15', '68111', '39404', '6'), +('5', '65', '15', '26989', '30398', '6'), +('5', '65', '15', '10948', '27089', '6'), +('5', '65', '20', '16156', '54726', '6'), +('5', '65', '20', '16097', '40973', '6'), +('5', '65', '20', '15873', '38167', '6'), +('5', '65', '20', '28890', '32481', '6'), +('5', '65', '12', '25857', '31792', '6'), +('5', '65', '12', '28246', '29048', '6'), +('5', '65', '12', '27000', '27608', '6'), +('5', '65', '12', '27990', '22802', '6'), +('5', '65', '18', '28650', '30269', '6'), +('5', '65', '18', '16763', '24419', '6'), +('5', '65', '18', '28965', '16787', '6'), +('5', '65', '18', '68143', '15570', '6'), +('5', '65', '19', '19094', '39499', '6'), +('5', '65', '19', '30569', '35341', '6'), +('5', '65', '19', '28888', '29924', '6'), +('5', '65', '19', '25995', '28474', '6'), +('5', '65', '13', '26092', '88496', '6'), +('5', '65', '13', '22890', '83047', '6'), +('5', '65', '13', '24879', '76830', '6'), +('5', '65', '13', '29172', '73400', '6'), +('5', '65', '14', '27298', '34264', '6'), +('5', '65', '14', '28656', '25831', '6'), +('5', '65', '14', '28657', '24420', '6'), +('5', '65', '14', '68119', '23311', '6'), +('5', '65', '11', '27818', '47722', '6'), +('5', '65', '11', '27986', '41373', '6'), +('5', '65', '11', '29596', '40320', '6'), +('5', '65', '11', '30539', '39994', '6'), +('5', '65', '22', '61948', '0', '5'), +('5', '65', '22', '66397', '0', '5'), +('5', '65', '22', '21805', '0', '5'), +('5', '65', '22', '21807', '0', '5'), +('5', '65', '1', '7125', '45981', '5'), +('5', '65', '1', '32106', '42957', '5'), +('5', '65', '1', '7123', '31250', '5'), +('5', '65', '1', '4119', '26493', '5'), +('5', '65', '2', '28647', '46586', '5'), +('5', '65', '2', '28605', '45685', '5'), +('5', '65', '2', '28648', '45617', '5'), +('5', '65', '2', '26025', '23582', '5'), +('5', '65', '3', '26982', '29207', '5'), +('5', '65', '3', '9435', '26549', '5'), +('5', '65', '3', '26983', '24781', '5'), +('5', '65', '3', '29174', '24688', '5'), +('5', '65', '5', '7769', '35632', '5'), +('5', '65', '5', '28885', '32309', '5'), +('5', '65', '5', '8977', '28686', '5'), +('5', '65', '5', '8785', '27980', '5'), +('5', '65', '8', '26765', '35828', '5'), +('5', '65', '8', '26766', '35233', '5'), +('5', '65', '8', '15803', '32856', '5'), +('5', '65', '8', '31471', '31269', '5'), +('5', '65', '6', '13674', '49419', '5'), +('5', '65', '6', '19144', '39239', '5'), +('5', '65', '6', '28902', '35361', '5'), +('5', '65', '6', '71006', '33397', '5'), +('5', '65', '17', '28937', '36641', '5'), +('5', '65', '17', '29457', '31574', '5'), +('5', '65', '17', '47645', '30075', '5'), +('5', '65', '17', '15002', '25357', '5'), +('5', '65', '7', '16097', '40973', '5'), +('5', '65', '7', '21995', '25513', '5'), +('5', '65', '7', '11441', '21882', '5'), +('5', '65', '7', '27648', '18248', '5'), +('5', '65', '9', '16097', '40973', '5'), +('5', '65', '9', '11103', '39837', '5'), +('5', '65', '9', '31461', '31543', '5'), +('5', '65', '9', '32100', '29785', '5'), +('5', '65', '15', '9959', '39686', '5'), +('5', '65', '15', '26989', '30398', '5'), +('5', '65', '15', '10948', '27089', '5'), +('5', '65', '15', '26993', '26641', '5'), +('5', '65', '20', '16156', '54726', '5'), +('5', '65', '20', '16097', '40973', '5'), +('5', '65', '20', '15873', '38167', '5'), +('5', '65', '20', '28890', '32481', '5'), +('5', '65', '12', '25857', '31792', '5'), +('5', '65', '12', '28246', '29048', '5'), +('5', '65', '12', '27000', '27608', '5'), +('5', '65', '12', '27990', '22802', '5'), +('5', '65', '18', '28650', '30269', '5'), +('5', '65', '18', '16763', '24419', '5'), +('5', '65', '18', '28965', '16787', '5'), +('5', '65', '18', '28932', '14454', '5'), +('5', '65', '19', '19094', '39499', '5'), +('5', '65', '19', '30569', '35341', '5'), +('5', '65', '19', '28888', '29924', '5'), +('5', '65', '19', '25995', '28474', '5'), +('5', '65', '13', '26092', '88496', '5'), +('5', '65', '13', '22890', '83047', '5'), +('5', '65', '13', '24879', '76830', '5'), +('5', '65', '13', '29172', '73400', '5'), +('5', '65', '14', '27298', '34264', '5'), +('5', '65', '14', '28656', '25831', '5'), +('5', '65', '14', '28657', '24420', '5'), +('5', '65', '14', '26788', '22261', '5'), +('5', '65', '11', '27818', '47722', '5'), +('5', '65', '11', '27986', '41373', '5'), +('5', '65', '11', '29596', '40320', '5'), +('5', '65', '11', '30539', '39994', '5'), +('5', '65', '22', '61948', '0', '4'), +('5', '65', '22', '66397', '0', '4'), +('5', '65', '22', '21805', '0', '4'), +('5', '65', '22', '21807', '0', '4'), +('5', '65', '1', '7125', '45981', '4'), +('5', '65', '1', '32106', '42957', '4'), +('5', '65', '1', '7123', '31250', '4'), +('5', '65', '1', '4119', '26493', '4'), +('5', '65', '2', '28647', '46586', '4'), +('5', '65', '2', '28605', '45685', '4'), +('5', '65', '2', '28648', '45617', '4'), +('5', '65', '2', '26025', '23582', '4'), +('5', '65', '3', '26982', '29207', '4'), +('5', '65', '3', '9435', '26549', '4'), +('5', '65', '3', '26983', '24781', '4'), +('5', '65', '3', '29174', '24688', '4'), +('5', '65', '5', '7769', '35632', '4'), +('5', '65', '5', '28885', '32309', '4'), +('5', '65', '5', '8977', '28686', '4'), +('5', '65', '5', '8785', '27980', '4'), +('5', '65', '8', '26765', '35828', '4'), +('5', '65', '8', '26766', '35233', '4'), +('5', '65', '8', '15803', '32856', '4'), +('5', '65', '8', '31471', '31269', '4'), +('5', '65', '6', '13674', '49419', '4'), +('5', '65', '6', '19144', '39239', '4'), +('5', '65', '6', '28902', '35361', '4'), +('5', '65', '6', '71006', '33397', '4'), +('5', '65', '17', '28937', '36641', '4'), +('5', '65', '17', '29457', '31574', '4'), +('5', '65', '17', '47645', '30075', '4'), +('5', '65', '17', '15002', '25357', '4'), +('5', '65', '7', '16097', '40973', '4'), +('5', '65', '7', '21995', '25513', '4'), +('5', '65', '7', '11441', '21882', '4'), +('5', '65', '7', '27648', '18248', '4'), +('5', '65', '9', '16097', '40973', '4'), +('5', '65', '9', '11103', '39837', '4'), +('5', '65', '9', '31461', '31543', '4'), +('5', '65', '9', '32100', '29785', '4'), +('5', '65', '15', '9959', '39686', '4'), +('5', '65', '15', '26989', '30398', '4'), +('5', '65', '15', '10948', '27089', '4'), +('5', '65', '15', '26993', '26641', '4'), +('5', '65', '20', '16156', '54726', '4'), +('5', '65', '20', '16097', '40973', '4'), +('5', '65', '20', '15873', '38167', '4'), +('5', '65', '20', '28890', '32481', '4'), +('5', '65', '12', '25857', '31792', '4'), +('5', '65', '12', '28246', '29048', '4'), +('5', '65', '12', '27000', '27608', '4'), +('5', '65', '12', '27990', '22802', '4'), +('5', '65', '18', '28650', '30269', '4'), +('5', '65', '18', '16763', '24419', '4'), +('5', '65', '18', '28965', '16787', '4'), +('5', '65', '18', '28932', '14454', '4'), +('5', '65', '19', '19094', '39499', '4'), +('5', '65', '19', '30569', '35341', '4'), +('5', '65', '19', '28888', '29924', '4'), +('5', '65', '19', '25995', '28474', '4'), +('5', '65', '13', '26092', '88496', '4'), +('5', '65', '13', '22890', '83047', '4'), +('5', '65', '13', '24879', '76830', '4'), +('5', '65', '13', '29172', '73400', '4'), +('5', '65', '14', '27298', '34264', '4'), +('5', '65', '14', '28656', '25831', '4'), +('5', '65', '14', '28657', '24420', '4'), +('5', '65', '14', '26788', '22261', '4'), +('5', '65', '11', '27818', '47722', '4'), +('5', '65', '11', '27986', '41373', '4'), +('5', '65', '11', '29596', '40320', '4'), +('5', '65', '11', '30539', '39994', '4'), +('5', '66', '22', '21805', '0', '7'), +('5', '66', '22', '61948', '0', '7'), +('5', '66', '22', '21807', '0', '7'), +('5', '66', '22', '12425', '0', '7'), +('5', '66', '1', '68949', '57797', '7'), +('5', '66', '1', '7125', '45983', '7'), +('5', '66', '1', '32106', '42960', '7'), +('5', '66', '1', '69166', '41479', '7'), +('5', '66', '2', '28647', '46589', '7'), +('5', '66', '2', '28605', '45686', '7'), +('5', '66', '2', '28648', '45618', '7'), +('5', '66', '2', '69087', '35171', '7'), +('5', '66', '3', '69157', '39119', '7'), +('5', '66', '3', '69069', '35634', '7'), +('5', '66', '3', '69074', '34527', '7'), +('5', '66', '3', '69068', '34099', '7'), +('5', '66', '5', '67625', '42152', '7'), +('5', '66', '5', '69135', '39821', '7'), +('5', '66', '5', '69097', '35555', '7'), +('5', '66', '5', '7769', '35533', '7'), +('5', '66', '8', '69165', '63769', '7'), +('5', '66', '8', '69064', '60110', '7'), +('5', '66', '8', '69072', '58313', '7'), +('5', '66', '8', '69065', '36244', '7'), +('5', '66', '6', '68757', '53729', '7'), +('5', '66', '6', '13674', '49422', '7'), +('5', '66', '6', '69130', '40004', '7'), +('5', '66', '6', '19144', '39242', '7'), +('5', '66', '17', '69150', '44280', '7'), +('5', '66', '17', '28937', '36642', '7'), +('5', '66', '17', '68748', '35663', '7'), +('5', '66', '17', '68966', '35011', '7'), +('5', '66', '7', '16097', '40976', '7'), +('5', '66', '7', '69168', '38047', '7'), +('5', '66', '7', '69079', '34891', '7'), +('5', '66', '7', '68866', '31925', '7'), +('5', '66', '9', '68766', '44835', '7'), +('5', '66', '9', '16097', '40976', '7'), +('5', '66', '9', '69126', '40261', '7'), +('5', '66', '9', '11103', '39838', '7'), +('5', '66', '15', '9959', '39688', '7'), +('5', '66', '15', '69160', '39630', '7'), +('5', '66', '15', '68111', '39404', '7'), +('5', '66', '15', '69131', '38914', '7'), +('5', '66', '20', '16156', '54729', '7'), +('5', '66', '20', '69134', '42420', '7'), +('5', '66', '20', '67625', '42152', '7'), +('5', '66', '20', '16097', '40976', '7'), +('5', '66', '12', '69252', '40116', '7'), +('5', '66', '12', '69083', '34759', '7'), +('5', '66', '12', '25857', '31792', '7'), +('5', '66', '12', '68867', '30399', '7'), +('5', '66', '18', '69146', '42338', '7'), +('5', '66', '18', '68967', '33265', '7'), +('5', '66', '18', '68779', '32121', '7'), +('5', '66', '18', '28650', '30272', '7'), +('5', '66', '19', '19094', '39500', '7'), +('5', '66', '19', '69177', '39383', '7'), +('5', '66', '19', '69075', '35741', '7'), +('5', '66', '19', '30569', '35342', '7'), +('5', '66', '13', '69053', '102832', '7'), +('5', '66', '13', '68835', '97429', '7'), +('5', '66', '13', '69043', '95918', '7'), +('5', '66', '13', '69113', '93727', '7'), +('5', '66', '14', '69161', '45750', '7'), +('5', '66', '14', '69049', '39751', '7'), +('5', '66', '14', '69155', '39230', '7'), +('5', '66', '14', '69048', '36253', '7'), +('5', '66', '11', '69054', '61613', '7'), +('5', '66', '11', '27818', '47753', '7'), +('5', '66', '11', '68662', '46231', '7'), +('5', '66', '11', '27986', '41403', '7'), +('5', '67', '22', '21805', '0', '7'), +('5', '67', '22', '61948', '0', '7'), +('5', '67', '22', '21807', '0', '7'), +('5', '67', '22', '12425', '0', '7'), +('5', '67', '1', '68949', '57701', '7'), +('5', '67', '1', '7125', '45985', '7'), +('5', '67', '1', '32106', '42963', '7'), +('5', '67', '1', '69166', '41482', '7'), +('5', '67', '2', '28647', '46592', '7'), +('5', '67', '2', '28605', '45687', '7'), +('5', '67', '2', '28648', '45619', '7'), +('5', '67', '2', '69087', '35175', '7'), +('5', '67', '3', '69157', '39122', '7'), +('5', '67', '3', '69069', '35637', '7'), +('5', '67', '3', '69074', '34530', '7'), +('5', '67', '3', '69068', '34103', '7'), +('5', '67', '5', '67625', '42155', '7'), +('5', '67', '5', '69135', '39825', '7'), +('5', '67', '5', '69097', '35558', '7'), +('5', '67', '5', '7769', '35434', '7'), +('5', '67', '8', '69165', '63773', '7'), +('5', '67', '8', '69064', '60113', '7'), +('5', '67', '8', '69072', '58316', '7'), +('5', '67', '8', '69065', '36247', '7'), +('5', '67', '6', '68757', '53732', '7'), +('5', '67', '6', '13674', '49425', '7'), +('5', '67', '6', '69130', '40007', '7'), +('5', '67', '6', '19144', '39245', '7'), +('5', '67', '17', '69150', '44284', '7'), +('5', '67', '17', '28937', '36644', '7'), +('5', '67', '17', '68748', '35567', '7'), +('5', '67', '17', '68966', '35014', '7'), +('5', '67', '7', '16097', '40980', '7'), +('5', '67', '7', '69168', '38050', '7'), +('5', '67', '7', '69079', '34894', '7'), +('5', '67', '7', '68866', '31929', '7'), +('5', '67', '9', '68766', '44838', '7'), +('5', '67', '9', '16097', '40980', '7'), +('5', '67', '9', '69126', '40265', '7'), +('5', '67', '9', '11103', '39840', '7'), +('5', '67', '15', '9959', '39689', '7'), +('5', '67', '15', '69160', '39632', '7'), +('5', '67', '15', '68111', '39405', '7'), +('5', '67', '15', '69131', '38916', '7'), +('5', '67', '20', '16156', '54733', '7'), +('5', '67', '20', '69134', '42424', '7'), +('5', '67', '20', '67625', '42155', '7'), +('5', '67', '20', '16097', '40980', '7'), +('5', '67', '12', '69252', '40119', '7'), +('5', '67', '12', '69083', '34761', '7'), +('5', '67', '12', '25857', '31793', '7'), +('5', '67', '12', '68867', '30401', '7'), +('5', '67', '18', '69146', '42340', '7'), +('5', '67', '18', '68967', '33269', '7'), +('5', '67', '18', '68779', '32125', '7'), +('5', '67', '18', '28650', '30276', '7'), +('5', '67', '19', '19094', '39503', '7'), +('5', '67', '19', '69177', '39387', '7'), +('5', '67', '19', '69075', '35746', '7'), +('5', '67', '19', '30569', '35343', '7'), +('5', '67', '13', '69053', '102921', '7'), +('5', '67', '13', '68835', '97602', '7'), +('5', '67', '13', '69043', '96112', '7'), +('5', '67', '13', '69113', '93814', '7'), +('5', '67', '14', '69161', '45754', '7'), +('5', '67', '14', '69049', '39754', '7'), +('5', '67', '14', '69155', '39232', '7'), +('5', '67', '14', '69048', '36256', '7'), +('5', '67', '11', '69054', '61776', '7'), +('5', '67', '11', '27818', '47776', '7'), +('5', '67', '11', '68662', '46261', '7'), +('5', '67', '11', '27986', '41434', '7'), +('5', '68', '22', '21805', '0', '7'), +('5', '68', '22', '61948', '0', '7'), +('5', '68', '22', '21807', '0', '7'), +('5', '68', '22', '12425', '0', '7'), +('5', '68', '1', '68949', '57605', '7'), +('5', '68', '1', '7125', '45986', '7'), +('5', '68', '1', '32106', '42966', '7'), +('5', '68', '1', '69166', '41485', '7'), +('5', '68', '2', '28647', '46595', '7'), +('5', '68', '2', '28605', '45688', '7'), +('5', '68', '2', '28648', '45620', '7'), +('5', '68', '2', '69087', '35179', '7'), +('5', '68', '3', '69157', '39125', '7'), +('5', '68', '3', '69069', '35640', '7'), +('5', '68', '3', '69074', '34533', '7'), +('5', '68', '3', '69068', '34106', '7'), +('5', '68', '5', '67625', '42158', '7'), +('5', '68', '5', '69135', '39829', '7'), +('5', '68', '5', '69097', '35562', '7'), +('5', '68', '5', '7769', '35335', '7'), +('5', '68', '8', '69165', '63777', '7'), +('5', '68', '8', '69064', '60116', '7'), +('5', '68', '8', '69072', '58319', '7'), +('5', '68', '8', '69065', '36250', '7'), +('5', '68', '6', '68757', '53735', '7'), +('5', '68', '6', '13674', '49427', '7'), +('5', '68', '6', '69130', '40010', '7'), +('5', '68', '6', '19144', '39247', '7'), +('5', '68', '17', '69150', '44288', '7'), +('5', '68', '17', '28937', '36646', '7'), +('5', '68', '17', '68748', '35470', '7'), +('5', '68', '17', '68966', '35017', '7'), +('5', '68', '7', '16097', '40983', '7'), +('5', '68', '7', '69168', '38053', '7'), +('5', '68', '7', '69079', '34896', '7'), +('5', '68', '7', '68866', '31933', '7'), +('5', '68', '9', '68766', '44841', '7'), +('5', '68', '9', '16097', '40983', '7'), +('5', '68', '9', '69126', '40269', '7'), +('5', '68', '9', '11103', '39842', '7'), +('5', '68', '15', '9959', '39691', '7'), +('5', '68', '15', '69160', '39634', '7'), +('5', '68', '15', '68111', '39405', '7'), +('5', '68', '15', '69131', '38917', '7'), +('5', '68', '20', '16156', '54736', '7'), +('5', '68', '20', '69134', '42427', '7'), +('5', '68', '20', '67625', '42158', '7'), +('5', '68', '20', '16097', '40983', '7'), +('5', '68', '12', '69252', '40122', '7'), +('5', '68', '12', '69083', '34762', '7'), +('5', '68', '12', '25857', '31793', '7'), +('5', '68', '12', '68867', '30403', '7'), +('5', '68', '18', '69146', '42341', '7'), +('5', '68', '18', '68967', '33272', '7'), +('5', '68', '18', '68779', '32128', '7'), +('5', '68', '18', '28650', '30279', '7'), +('5', '68', '19', '19094', '39504', '7'), +('5', '68', '19', '69177', '39390', '7'), +('5', '68', '19', '69075', '35750', '7'), +('5', '68', '19', '30569', '35344', '7'), +('5', '68', '13', '69053', '103009', '7'), +('5', '68', '13', '68835', '97804', '7'), +('5', '68', '13', '69043', '96306', '7'), +('5', '68', '13', '68741', '93951', '7'), +('5', '68', '14', '69161', '45758', '7'), +('5', '68', '14', '69049', '39756', '7'), +('5', '68', '14', '69155', '39234', '7'), +('5', '68', '14', '69048', '36259', '7'), +('5', '68', '11', '69054', '61949', '7'), +('5', '68', '11', '27818', '47808', '7'), +('5', '68', '11', '68662', '46291', '7'), +('5', '68', '11', '96532', '42342', '7'), +('5', '69', '22', '21805', '0', '7'), +('5', '69', '22', '61948', '0', '7'), +('5', '69', '22', '21807', '0', '7'), +('5', '69', '22', '12425', '0', '7'), +('5', '69', '1', '68949', '57509', '7'), +('5', '69', '1', '7125', '45988', '7'), +('5', '69', '1', '32106', '42970', '7'), +('5', '69', '1', '69166', '41489', '7'), +('5', '69', '2', '28647', '46598', '7'), +('5', '69', '2', '28605', '45689', '7'), +('5', '69', '2', '28648', '45621', '7'), +('5', '69', '2', '69087', '35184', '7'), +('5', '69', '3', '69157', '39129', '7'), +('5', '69', '3', '69069', '35644', '7'), +('5', '69', '3', '69074', '34536', '7'), +('5', '69', '3', '69068', '34110', '7'), +('5', '69', '5', '67625', '42161', '7'), +('5', '69', '5', '69135', '39834', '7'), +('5', '69', '5', '69097', '35566', '7'), +('5', '69', '5', '68950', '35287', '7'), +('5', '69', '8', '69165', '63780', '7'), +('5', '69', '8', '69064', '60119', '7'), +('5', '69', '8', '69072', '58323', '7'), +('5', '69', '8', '69065', '36253', '7'), +('5', '69', '6', '68757', '53738', '7'), +('5', '69', '6', '13674', '49430', '7'), +('5', '69', '6', '69130', '40013', '7'), +('5', '69', '6', '19144', '39250', '7'), +('5', '69', '17', '69150', '44291', '7'), +('5', '69', '17', '28937', '36647', '7'), +('5', '69', '17', '68748', '35374', '7'), +('5', '69', '17', '68966', '35021', '7'), +('5', '69', '7', '16097', '40987', '7'), +('5', '69', '7', '69168', '38057', '7'), +('5', '69', '7', '69079', '34899', '7'), +('5', '69', '7', '68866', '31937', '7'), +('5', '69', '9', '68766', '44844', '7'), +('5', '69', '9', '16097', '40987', '7'), +('5', '69', '9', '69126', '40273', '7'), +('5', '69', '9', '11103', '39843', '7'), +('5', '69', '15', '9959', '39693', '7'), +('5', '69', '15', '69160', '39636', '7'), +('5', '69', '15', '68111', '39406', '7'), +('5', '69', '15', '69131', '38919', '7'), +('5', '69', '20', '16156', '54739', '7'), +('5', '69', '20', '69134', '42431', '7'), +('5', '69', '20', '67625', '42161', '7'), +('5', '69', '20', '16097', '40987', '7'), +('5', '69', '12', '69252', '40126', '7'), +('5', '69', '12', '69083', '34764', '7'), +('5', '69', '12', '25857', '31794', '7'), +('5', '69', '12', '68867', '30406', '7'), +('5', '69', '18', '69146', '42343', '7'), +('5', '69', '18', '68967', '33276', '7'), +('5', '69', '18', '68779', '32132', '7'), +('5', '69', '18', '28650', '30283', '7'), +('5', '69', '19', '19094', '39506', '7'), +('5', '69', '19', '69177', '39394', '7'), +('5', '69', '19', '69075', '35755', '7'), +('5', '69', '19', '30569', '35346', '7'), +('5', '69', '13', '69053', '103098', '7'), +('5', '69', '13', '68835', '98006', '7'), +('5', '69', '13', '69043', '96499', '7'), +('5', '69', '13', '68741', '94179', '7'), +('5', '69', '14', '69161', '45762', '7'), +('5', '69', '14', '69049', '39759', '7'), +('5', '69', '14', '69155', '39236', '7'), +('5', '69', '14', '69048', '36262', '7'), +('5', '69', '11', '69054', '62121', '7'), +('5', '69', '11', '27818', '47840', '7'), +('5', '69', '11', '68662', '46321', '7'), +('5', '69', '11', '96532', '43022', '7'), +('5', '70', '22', '12425', '0', '11'), +('5', '70', '22', '21807', '0', '11'), +('5', '70', '22', '21805', '0', '11'), +('5', '70', '22', '39342', '0', '11'), +('5', '70', '1', '39276', '72606', '11'), +('5', '70', '1', '83594', '70858', '11'), +('5', '70', '1', '71624', '60494', '11'), +('5', '70', '1', '68949', '57413', '11'), +('5', '70', '2', '70881', '67982', '11'), +('5', '70', '2', '83560', '49682', '11'), +('5', '70', '2', '28647', '46602', '11'), +('5', '70', '2', '28605', '45690', '11'), +('5', '70', '3', '39218', '66427', '11'), +('5', '70', '3', '47245', '61809', '11'), +('5', '70', '3', '39368', '57802', '11'), +('5', '70', '3', '39347', '56032', '11'), +('5', '70', '5', '39359', '55333', '11'), +('5', '70', '5', '39340', '51800', '11'), +('5', '70', '5', '39313', '50551', '11'), +('5', '70', '5', '39262', '50506', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '70', '8', '39330', '72153', '11'), +('5', '70', '8', '69165', '63784', '11'), +('5', '70', '8', '69064', '60122', '11'), +('5', '70', '8', '69072', '58326', '11'), +('5', '70', '6', '39337', '76418', '11'), +('5', '70', '6', '70717', '62738', '11'), +('5', '70', '6', '68757', '53741', '11'), +('5', '70', '6', '83660', '52265', '11'), +('5', '70', '17', '83603', '78959', '11'), +('5', '70', '17', '70886', '52113', '11'), +('5', '70', '17', '69150', '44295', '11'), +('5', '70', '17', '70701', '42501', '11'), +('5', '70', '7', '39267', '49868', '11'), +('5', '70', '7', '83564', '49757', '11'), +('5', '70', '7', '70882', '44783', '11'), +('5', '70', '7', '47204', '41003', '11'), +('5', '70', '9', '39335', '55654', '11'), +('5', '70', '9', '51706', '52747', '11'), +('5', '70', '9', '83652', '52628', '11'), +('5', '70', '9', '39291', '50563', '11'), +('5', '70', '15', '39374', '60212', '11'), +('5', '70', '15', '83458', '55358', '11'), +('5', '70', '15', '70621', '54685', '11'), +('5', '70', '15', '71117', '54550', '11'), +('5', '70', '20', '47283', '65767', '11'), +('5', '70', '20', '39365', '60598', '11'), +('5', '70', '20', '83533', '60122', '11'), +('5', '70', '20', '16156', '54742', '11'), +('5', '70', '12', '47212', '59767', '11'), +('5', '70', '12', '71075', '53143', '11'), +('5', '70', '12', '83568', '47569', '11'), +('5', '70', '12', '70884', '43652', '11'), +('5', '70', '18', '83607', '55097', '11'), +('5', '70', '18', '70887', '48943', '11'), +('5', '70', '18', '69146', '42345', '11'), +('5', '70', '18', '47200', '42264', '11'), +('5', '70', '19', '39355', '54742', '11'), +('5', '70', '19', '83572', '49501', '11'), +('5', '70', '19', '70885', '44770', '11'), +('5', '70', '19', '83550', '42155', '11'), +('5', '70', '13', '83639', '144704', '11'), +('5', '70', '13', '39254', '138881', '11'), +('5', '70', '13', '39294', '138707', '11'), +('5', '70', '13', '83581', '135240', '11'), +('5', '70', '14', '39341', '61411', '11'), +('5', '70', '14', '39372', '60645', '11'), +('5', '70', '14', '83640', '57345', '11'), +('5', '70', '14', '83656', '55503', '11'), +('5', '70', '11', '39331', '74656', '11'), +('5', '70', '11', '83582', '74502', '11'), +('5', '70', '11', '39311', '73491', '11'), +('5', '70', '11', '47325', '68373', '11'), +('5', '70', '22', '21807', '0', '10'), +('5', '70', '22', '21805', '0', '10'), +('5', '70', '22', '61948', '0', '10'), +('5', '70', '22', '12425', '0', '10'), +('5', '70', '1', '83594', '70858', '10'), +('5', '70', '1', '71624', '60494', '10'), +('5', '70', '1', '68949', '57413', '10'), +('5', '70', '1', '83630', '50188', '10'), +('5', '70', '2', '70881', '67982', '10'), +('5', '70', '2', '83560', '49682', '10'), +('5', '70', '2', '28647', '46602', '10'), +('5', '70', '2', '28605', '45690', '10'), +('5', '70', '3', '47245', '61809', '10'), +('5', '70', '3', '83658', '53250', '10'), +('5', '70', '3', '83636', '50164', '10'), +('5', '70', '3', '83617', '50045', '10'), +('5', '70', '5', '83651', '49150', '10'), +('5', '70', '5', '83599', '48523', '10'), +('5', '70', '5', '47275', '46337', '10'), +('5', '70', '5', '89308', '46164', '10'), +('5', '70', '8', '69165', '63784', '10'), +('5', '70', '8', '69064', '60122', '10'), +('5', '70', '8', '69072', '58326', '10'), +('5', '70', '8', '70662', '52679', '10'), +('5', '70', '6', '70717', '62738', '10'), +('5', '70', '6', '68757', '53741', '10'), +('5', '70', '6', '83660', '52265', '10'), +('5', '70', '6', '13674', '49433', '10'), +('5', '70', '17', '83603', '78959', '10'), +('5', '70', '17', '70886', '52113', '10'), +('5', '70', '17', '69150', '44295', '10'), +('5', '70', '17', '70701', '42501', '10'), +('5', '70', '7', '83564', '49757', '10'), +('5', '70', '7', '70882', '44783', '10'), +('5', '70', '7', '47204', '41003', '10'), +('5', '70', '7', '16097', '40990', '10'), +('5', '70', '9', '83652', '52628', '10'), +('5', '70', '9', '68766', '44846', '10'), +('5', '70', '9', '70883', '43413', '10'), +('5', '70', '9', '83462', '41531', '10'), +('5', '70', '15', '83458', '55358', '10'), +('5', '70', '15', '70621', '54685', '10'), +('5', '70', '15', '71117', '54550', '10'), +('5', '70', '15', '83661', '52186', '10'), +('5', '70', '20', '47283', '65767', '10'), +('5', '70', '20', '83533', '60122', '10'), +('5', '70', '20', '16156', '54742', '10'), +('5', '70', '20', '70604', '51396', '10'), +('5', '70', '12', '47212', '59767', '10'), +('5', '70', '12', '71075', '53143', '10'), +('5', '70', '12', '83568', '47569', '10'), +('5', '70', '12', '70884', '43652', '10'), +('5', '70', '18', '83607', '55097', '10'), +('5', '70', '18', '70887', '48943', '10'), +('5', '70', '18', '69146', '42345', '10'), +('5', '70', '18', '47200', '42264', '10'), +('5', '70', '19', '83572', '49501', '10'), +('5', '70', '19', '70885', '44770', '10'), +('5', '70', '19', '83550', '42155', '10'), +('5', '70', '19', '69439', '41524', '10'), +('5', '70', '13', '83639', '144704', '10'), +('5', '70', '13', '83581', '135240', '10'), +('5', '70', '13', '83579', '131906', '10'), +('5', '70', '13', '47316', '131203', '10'), +('5', '70', '14', '83640', '57345', '10'), +('5', '70', '14', '83656', '55503', '10'), +('5', '70', '14', '39315', '52081', '10'), +('5', '70', '14', '47310', '51521', '10'), +('5', '70', '11', '83582', '74502', '10'), +('5', '70', '11', '47325', '68373', '10'), +('5', '70', '11', '83539', '67460', '10'), +('5', '70', '11', '69054', '63286', '10'), +('5', '70', '22', '21805', '0', '9'), +('5', '70', '22', '61948', '0', '9'), +('5', '70', '22', '21807', '0', '9'), +('5', '70', '22', '12425', '0', '9'), +('5', '70', '1', '71624', '60494', '9'), +('5', '70', '1', '68949', '57413', '9'), +('5', '70', '1', '71668', '46177', '9'), +('5', '70', '1', '7125', '45990', '9'), +('5', '70', '2', '70881', '67982', '9'), +('5', '70', '2', '28647', '46602', '9'), +('5', '70', '2', '28605', '45690', '9'), +('5', '70', '2', '28648', '45623', '9'), +('5', '70', '3', '47245', '61809', '9'), +('5', '70', '3', '71667', '46815', '9'), +('5', '70', '3', '47299', '44586', '9'), +('5', '70', '3', '47300', '43352', '9'), +('5', '70', '5', '47275', '46337', '9'), +('5', '70', '5', '47273', '44650', '9'), +('5', '70', '5', '47274', '42805', '9'), +('5', '70', '5', '67625', '42164', '9'), +('5', '70', '8', '69165', '63784', '9'), +('5', '70', '8', '69064', '60122', '9'), +('5', '70', '8', '69072', '58326', '9'), +('5', '70', '8', '70662', '52679', '9'), +('5', '70', '6', '70717', '62738', '9'), +('5', '70', '6', '68757', '53741', '9'), +('5', '70', '6', '13674', '49433', '9'), +('5', '70', '6', '47278', '45553', '9'), +('5', '70', '17', '70886', '52113', '9'), +('5', '70', '17', '69150', '44295', '9'), +('5', '70', '17', '70701', '42501', '9'), +('5', '70', '17', '71638', '39778', '9'), +('5', '70', '7', '70882', '44783', '9'), +('5', '70', '7', '47204', '41003', '9'), +('5', '70', '7', '16097', '40990', '9'), +('5', '70', '7', '69168', '38060', '9'), +('5', '70', '9', '68766', '44846', '9'), +('5', '70', '9', '70883', '43413', '9'), +('5', '70', '9', '16097', '40990', '9'), +('5', '70', '9', '69126', '40277', '9'), +('5', '70', '15', '70621', '54685', '9'), +('5', '70', '15', '71117', '54550', '9'), +('5', '70', '15', '47290', '44627', '9'), +('5', '70', '15', '47291', '44065', '9'), +('5', '70', '20', '47283', '65767', '9'), +('5', '70', '20', '16156', '54742', '9'), +('5', '70', '20', '70604', '51396', '9'), +('5', '70', '20', '70975', '47215', '9'), +('5', '70', '12', '47212', '59767', '9'), +('5', '70', '12', '71075', '53143', '9'), +('5', '70', '12', '70884', '43652', '9'), +('5', '70', '12', '69252', '40129', '9'), +('5', '70', '18', '70887', '48943', '9'), +('5', '70', '18', '69146', '42345', '9'), +('5', '70', '18', '47200', '42264', '9'), +('5', '70', '18', '71646', '39621', '9'), +('5', '70', '19', '70885', '44770', '9'), +('5', '70', '19', '69439', '41524', '9'), +('5', '70', '19', '19094', '39509', '9'), +('5', '70', '19', '69177', '39398', '9'), +('5', '70', '13', '47316', '131203', '9'), +('5', '70', '13', '47320', '128042', '9'), +('5', '70', '13', '47324', '127203', '9'), +('5', '70', '13', '71663', '126157', '9'), +('5', '70', '14', '39315', '52081', '9'), +('5', '70', '14', '47310', '51521', '9'), +('5', '70', '14', '71669', '48317', '9'), +('5', '70', '14', '47252', '46627', '9'), +('5', '70', '11', '47325', '68373', '9'), +('5', '70', '11', '69054', '63286', '9'), +('5', '70', '11', '47265', '61480', '9'), +('5', '70', '11', '70628', '55310', '9'), +('5', '70', '22', '21805', '0', '8'), +('5', '70', '22', '61948', '0', '8'), +('5', '70', '22', '21807', '0', '8'), +('5', '70', '22', '12425', '0', '8'), +('5', '70', '1', '68949', '57413', '8'), +('5', '70', '1', '7125', '45990', '8'), +('5', '70', '1', '47287', '45792', '8'), +('5', '70', '1', '47289', '43708', '8'), +('5', '70', '2', '70881', '67982', '8'), +('5', '70', '2', '28647', '46602', '8'), +('5', '70', '2', '28605', '45690', '8'), +('5', '70', '2', '28648', '45623', '8'), +('5', '70', '3', '47245', '61809', '8'), +('5', '70', '3', '47299', '44586', '8'), +('5', '70', '3', '47300', '43352', '8'), +('5', '70', '3', '47301', '42328', '8'), +('5', '70', '5', '47275', '46337', '8'), +('5', '70', '5', '47273', '44650', '8'), +('5', '70', '5', '47274', '42805', '8'), +('5', '70', '5', '67625', '42164', '8'), +('5', '70', '8', '69165', '63784', '8'), +('5', '70', '8', '69064', '60122', '8'), +('5', '70', '8', '69072', '58326', '8'), +('5', '70', '8', '70662', '52679', '8'), +('5', '70', '6', '70717', '62738', '8'), +('5', '70', '6', '68757', '53741', '8'), +('5', '70', '6', '13674', '49433', '8'), +('5', '70', '6', '47278', '45553', '8'), +('5', '70', '17', '70886', '52113', '8'), +('5', '70', '17', '69150', '44295', '8'), +('5', '70', '17', '70701', '42501', '8'), +('5', '70', '17', '28937', '36649', '8'), +('5', '70', '7', '70882', '44783', '8'), +('5', '70', '7', '47204', '41003', '8'), +('5', '70', '7', '16097', '40990', '8'), +('5', '70', '7', '69168', '38060', '8'), +('5', '70', '9', '68766', '44846', '8'), +('5', '70', '9', '70883', '43413', '8'), +('5', '70', '9', '16097', '40990', '8'), +('5', '70', '9', '69126', '40277', '8'), +('5', '70', '15', '70621', '54685', '8'), +('5', '70', '15', '71117', '54550', '8'), +('5', '70', '15', '47290', '44627', '8'), +('5', '70', '15', '47291', '44065', '8'), +('5', '70', '20', '47283', '65767', '8'), +('5', '70', '20', '16156', '54742', '8'), +('5', '70', '20', '70604', '51396', '8'), +('5', '70', '20', '47282', '45524', '8'), +('5', '70', '12', '47212', '59767', '8'), +('5', '70', '12', '71075', '53143', '8'), +('5', '70', '12', '70884', '43652', '8'), +('5', '70', '12', '69252', '40129', '8'), +('5', '70', '18', '70887', '48943', '8'), +('5', '70', '18', '69146', '42345', '8'), +('5', '70', '18', '47200', '42264', '8'), +('5', '70', '18', '71094', '35538', '8'), +('5', '70', '19', '70885', '44770', '8'), +('5', '70', '19', '69439', '41524', '8'), +('5', '70', '19', '19094', '39509', '8'), +('5', '70', '19', '69177', '39398', '8'), +('5', '70', '13', '47316', '130884', '8'), +('5', '70', '13', '47320', '127617', '8'), +('5', '70', '13', '47324', '126778', '8'), +('5', '70', '13', '48136', '120308', '8'), +('5', '70', '14', '39315', '52081', '8'), +('5', '70', '14', '47310', '51521', '8'), +('5', '70', '14', '47252', '46627', '8'), +('5', '70', '14', '69161', '45766', '8'), +('5', '70', '11', '47325', '68373', '8'), +('5', '70', '11', '69054', '63002', '8'), +('5', '70', '11', '47265', '61480', '8'), +('5', '70', '11', '70628', '55310', '8'), +('5', '71', '22', '12425', '0', '11'), +('5', '71', '22', '21807', '0', '11'), +('5', '71', '22', '21805', '0', '11'), +('5', '71', '22', '39342', '0', '11'), +('5', '71', '1', '39276', '72609', '11'), +('5', '71', '1', '83594', '70862', '11'), +('5', '71', '1', '71624', '60497', '11'), +('5', '71', '1', '68949', '57317', '11'), +('5', '71', '2', '70881', '67985', '11'), +('5', '71', '2', '83560', '49688', '11'), +('5', '71', '2', '28647', '46605', '11'), +('5', '71', '2', '28605', '45691', '11'), +('5', '71', '3', '39218', '66430', '11'), +('5', '71', '3', '47245', '61811', '11'), +('5', '71', '3', '39368', '57806', '11'), +('5', '71', '3', '39347', '56037', '11'), +('5', '71', '5', '39359', '55336', '11'), +('5', '71', '5', '39340', '51804', '11'), +('5', '71', '5', '39313', '50556', '11'), +('5', '71', '5', '39262', '50509', '11'), +('5', '71', '8', '39330', '72155', '11'), +('5', '71', '8', '69165', '63788', '11'), +('5', '71', '8', '69064', '60125', '11'), +('5', '71', '8', '69072', '58329', '11'), +('5', '71', '6', '39337', '76421', '11'), +('5', '71', '6', '70717', '62742', '11'), +('5', '71', '6', '68757', '53744', '11'), +('5', '71', '6', '83660', '52268', '11'), +('5', '71', '17', '83603', '78964', '11'), +('5', '71', '17', '70886', '52118', '11'), +('5', '71', '17', '69150', '44298', '11'), +('5', '71', '17', '70701', '42506', '11'), +('5', '71', '7', '39267', '49871', '11'), +('5', '71', '7', '83564', '49763', '11'), +('5', '71', '7', '70882', '44789', '11'), +('5', '71', '7', '47204', '41006', '11'), +('5', '71', '9', '39335', '55659', '11'), +('5', '71', '9', '51706', '52751', '11'), +('5', '71', '9', '83652', '52631', '11'), +('5', '71', '9', '39291', '50566', '11'), +('5', '71', '15', '39374', '60217', '11'), +('5', '71', '15', '83458', '55362', '11'), +('5', '71', '15', '70621', '54689', '11'), +('5', '71', '15', '71117', '54555', '11'), +('5', '71', '20', '47283', '65768', '11'), +('5', '71', '20', '39365', '60603', '11'), +('5', '71', '20', '83533', '60125', '11'), +('5', '71', '20', '16156', '54745', '11'), +('5', '71', '12', '47212', '59771', '11'), +('5', '71', '12', '71075', '53146', '11'), +('5', '71', '12', '83568', '47575', '11'), +('5', '71', '12', '70884', '43653', '11'), +('5', '71', '18', '83607', '55102', '11'), +('5', '71', '18', '70887', '48947', '11'), +('5', '71', '18', '69146', '42347', '11'), +('5', '71', '18', '47200', '42268', '11'), +('5', '71', '19', '39355', '54747', '11'), +('5', '71', '19', '83572', '49507', '11'), +('5', '71', '19', '70885', '44773', '11'), +('5', '71', '19', '83550', '42159', '11'), +('5', '71', '13', '83639', '145388', '11'), +('5', '71', '13', '39254', '139209', '11'), +('5', '71', '13', '39294', '139035', '11'), +('5', '71', '13', '83581', '135357', '11'), +('5', '71', '14', '39341', '61413', '11'), +('5', '71', '14', '39372', '60651', '11'), +('5', '71', '14', '83640', '57350', '11'), +('5', '71', '14', '83656', '55508', '11'), +('5', '71', '11', '39331', '74684', '11'), +('5', '71', '11', '83582', '74542', '11'), +('5', '71', '11', '39311', '73496', '11'), +('5', '71', '11', '47325', '68404', '11'), +('5', '72', '22', '12425', '0', '11'), +('5', '72', '22', '21807', '0', '11'), +('5', '72', '22', '21805', '0', '11'), +('5', '72', '22', '39342', '0', '11'), +('5', '72', '1', '39276', '72613', '11'), +('5', '72', '1', '83594', '70867', '11'), +('5', '72', '1', '71624', '60500', '11'), +('5', '72', '1', '68949', '57222', '11'), +('5', '72', '2', '70881', '67988', '11'), +('5', '72', '2', '83560', '49694', '11'), +('5', '72', '2', '28647', '46608', '11'), +('5', '72', '2', '28605', '45692', '11'), +('5', '72', '3', '39218', '66434', '11'), +('5', '72', '3', '47245', '61813', '11'), +('5', '72', '3', '39368', '57810', '11'), +('5', '72', '3', '39347', '56042', '11'), +('5', '72', '5', '39359', '55340', '11'), +('5', '72', '5', '39340', '51809', '11'), +('5', '72', '5', '39313', '50561', '11'), +('5', '72', '5', '39262', '50513', '11'), +('5', '72', '8', '39330', '72157', '11'), +('5', '72', '8', '69165', '63791', '11'), +('5', '72', '8', '69064', '60129', '11'), +('5', '72', '8', '69072', '58333', '11'), +('5', '72', '6', '39337', '76425', '11'), +('5', '72', '6', '70717', '62746', '11'), +('5', '72', '6', '68757', '53747', '11'), +('5', '72', '6', '83660', '52272', '11'), +('5', '72', '17', '83603', '78969', '11'), +('5', '72', '17', '70886', '52122', '11'), +('5', '72', '17', '69150', '44302', '11'), +('5', '72', '17', '70701', '42511', '11'), +('5', '72', '7', '39267', '49875', '11'), +('5', '72', '7', '83564', '49769', '11'), +('5', '72', '7', '70882', '44794', '11'), +('5', '72', '7', '47204', '41009', '11'), +('5', '72', '9', '39335', '55664', '11'), +('5', '72', '9', '51706', '52756', '11'), +('5', '72', '9', '83652', '52635', '11'), +('5', '72', '9', '39291', '50570', '11'), +('5', '72', '15', '39374', '60223', '11'), +('5', '72', '15', '83458', '55365', '11'), +('5', '72', '15', '70621', '54693', '11'), +('5', '72', '15', '71117', '54560', '11'), +('5', '72', '20', '47283', '65770', '11'), +('5', '72', '20', '39365', '60608', '11'), +('5', '72', '20', '83533', '60128', '11'), +('5', '72', '20', '16156', '54749', '11'), +('5', '72', '12', '47212', '59775', '11'), +('5', '72', '12', '71075', '53149', '11'), +('5', '72', '12', '83568', '47581', '11'), +('5', '72', '12', '70884', '43655', '11'), +('5', '72', '18', '83607', '55107', '11'), +('5', '72', '18', '70887', '48951', '11'), +('5', '72', '18', '69146', '42349', '11'), +('5', '72', '18', '47200', '42272', '11'), +('5', '72', '19', '39355', '54752', '11'), +('5', '72', '19', '83572', '49513', '11'), +('5', '72', '19', '70885', '44777', '11'), +('5', '72', '19', '83550', '42163', '11'), +('5', '72', '13', '83639', '146073', '11'), +('5', '72', '13', '39254', '139536', '11'), +('5', '72', '13', '39294', '139363', '11'), +('5', '72', '13', '83581', '135474', '11'), +('5', '72', '14', '39341', '61416', '11'), +('5', '72', '14', '39372', '60657', '11'), +('5', '72', '14', '83640', '57354', '11'), +('5', '72', '14', '83656', '55514', '11'), +('5', '72', '11', '39331', '74722', '11'), +('5', '72', '11', '83582', '74583', '11'), +('5', '72', '11', '39311', '73501', '11'), +('5', '72', '11', '47325', '68445', '11'), +('5', '73', '22', '12425', '0', '11'), +('5', '73', '22', '21807', '0', '11'), +('5', '73', '22', '21805', '0', '11'), +('5', '73', '22', '39342', '0', '11'), +('5', '73', '1', '39276', '72616', '11'), +('5', '73', '1', '83594', '70871', '11'), +('5', '73', '1', '71624', '60503', '11'), +('5', '73', '1', '68949', '57126', '11'), +('5', '73', '2', '70881', '67991', '11'), +('5', '73', '2', '83560', '49701', '11'), +('5', '73', '2', '28647', '46611', '11'), +('5', '73', '2', '28605', '45693', '11'), +('5', '73', '3', '39218', '66437', '11'), +('5', '73', '3', '47245', '61815', '11'), +('5', '73', '3', '39368', '57814', '11'), +('5', '73', '3', '39347', '56047', '11'), +('5', '73', '5', '39359', '55344', '11'), +('5', '73', '5', '39340', '51813', '11'), +('5', '73', '5', '39313', '50565', '11'), +('5', '73', '5', '39262', '50516', '11'), +('5', '73', '8', '39330', '72158', '11'), +('5', '73', '8', '69165', '63795', '11'), +('5', '73', '8', '69064', '60132', '11'), +('5', '73', '8', '69072', '58336', '11'), +('5', '73', '6', '39337', '76429', '11'), +('5', '73', '6', '70717', '62750', '11'), +('5', '73', '6', '68757', '53750', '11'), +('5', '73', '6', '83660', '52275', '11'), +('5', '73', '17', '83603', '78974', '11'), +('5', '73', '17', '70886', '52127', '11'), +('5', '73', '17', '69150', '44306', '11'), +('5', '73', '17', '70701', '42517', '11'), +('5', '73', '7', '39267', '49879', '11'), +('5', '73', '7', '83564', '49775', '11'), +('5', '73', '7', '70882', '44800', '11'), +('5', '73', '7', '47204', '41012', '11'), +('5', '73', '9', '39335', '55669', '11'), +('5', '73', '9', '51706', '52761', '11'), +('5', '73', '9', '83652', '52639', '11'), +('5', '73', '9', '39291', '50574', '11'), +('5', '73', '15', '39374', '60228', '11'), +('5', '73', '15', '83458', '55369', '11'), +('5', '73', '15', '70621', '54696', '11'), +('5', '73', '15', '71117', '54565', '11'), +('5', '73', '20', '47283', '65772', '11'), +('5', '73', '20', '39365', '60613', '11'), +('5', '73', '20', '83533', '60130', '11'), +('5', '73', '20', '16156', '54752', '11'), +('5', '73', '12', '47212', '59778', '11'), +('5', '73', '12', '71075', '53153', '11'), +('5', '73', '12', '83568', '47588', '11'), +('5', '73', '12', '70884', '43657', '11'), +('5', '73', '18', '83607', '55113', '11'), +('5', '73', '18', '70887', '48955', '11'), +('5', '73', '18', '69146', '42350', '11'), +('5', '73', '18', '47200', '42275', '11'), +('5', '73', '19', '39355', '54757', '11'), +('5', '73', '19', '83572', '49519', '11'), +('5', '73', '19', '70885', '44780', '11'), +('5', '73', '19', '83550', '42167', '11'), +('5', '73', '13', '83639', '146758', '11'), +('5', '73', '13', '39254', '139864', '11'), +('5', '73', '13', '39294', '139691', '11'), +('5', '73', '13', '83581', '135591', '11'), +('5', '73', '14', '39341', '61419', '11'), +('5', '73', '14', '39372', '60663', '11'), +('5', '73', '14', '83640', '57359', '11'), +('5', '73', '14', '83656', '55519', '11'), +('5', '73', '11', '39331', '74750', '11'), +('5', '73', '11', '83582', '74623', '11'), +('5', '73', '11', '39311', '73505', '11'), +('5', '73', '11', '47325', '68476', '11'), +('5', '74', '22', '12425', '0', '11'), +('5', '74', '22', '21807', '0', '11'), +('5', '74', '22', '21805', '0', '11'), +('5', '74', '22', '39342', '0', '11'), +('5', '74', '1', '39276', '72620', '11'), +('5', '74', '1', '83594', '70875', '11'), +('5', '74', '1', '71624', '60507', '11'), +('5', '74', '1', '68949', '57030', '11'), +('5', '74', '2', '70881', '67995', '11'), +('5', '74', '2', '83560', '49707', '11'), +('5', '74', '2', '28647', '46615', '11'), +('5', '74', '2', '28605', '45694', '11'), +('5', '74', '3', '39218', '66440', '11'), +('5', '74', '3', '47245', '61817', '11'), +('5', '74', '3', '39368', '57819', '11'), +('5', '74', '3', '39347', '56052', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '74', '5', '39359', '55348', '11'), +('5', '74', '5', '39340', '51817', '11'), +('5', '74', '5', '39313', '50570', '11'), +('5', '74', '5', '39262', '50519', '11'), +('5', '74', '8', '39330', '72160', '11'), +('5', '74', '8', '69165', '63799', '11'), +('5', '74', '8', '69064', '60135', '11'), +('5', '74', '8', '69072', '58340', '11'), +('5', '74', '6', '39337', '76433', '11'), +('5', '74', '6', '70717', '62754', '11'), +('5', '74', '6', '68757', '53753', '11'), +('5', '74', '6', '83660', '52279', '11'), +('5', '74', '17', '83603', '78980', '11'), +('5', '74', '17', '70886', '52132', '11'), +('5', '74', '17', '69150', '44310', '11'), +('5', '74', '17', '70701', '42522', '11'), +('5', '74', '7', '39267', '49882', '11'), +('5', '74', '7', '83564', '49781', '11'), +('5', '74', '7', '70882', '44805', '11'), +('5', '74', '7', '47204', '41015', '11'), +('5', '74', '9', '39335', '55674', '11'), +('5', '74', '9', '51706', '52765', '11'), +('5', '74', '9', '83652', '52643', '11'), +('5', '74', '9', '39291', '50577', '11'), +('5', '74', '15', '39374', '60233', '11'), +('5', '74', '15', '83458', '55373', '11'), +('5', '74', '15', '70621', '54700', '11'), +('5', '74', '15', '71117', '54569', '11'), +('5', '74', '20', '47283', '65774', '11'), +('5', '74', '20', '39365', '60618', '11'), +('5', '74', '20', '83533', '60133', '11'), +('5', '74', '20', '16156', '54755', '11'), +('5', '74', '12', '47212', '59782', '11'), +('5', '74', '12', '71075', '53156', '11'), +('5', '74', '12', '83568', '47594', '11'), +('5', '74', '12', '70884', '43659', '11'), +('5', '74', '18', '83607', '55118', '11'), +('5', '74', '18', '70887', '48960', '11'), +('5', '74', '18', '69146', '42352', '11'), +('5', '74', '18', '47200', '42279', '11'), +('5', '74', '19', '39355', '54762', '11'), +('5', '74', '19', '83572', '49526', '11'), +('5', '74', '19', '70885', '44783', '11'), +('5', '74', '19', '83550', '42171', '11'), +('5', '74', '13', '83639', '147442', '11'), +('5', '74', '13', '39254', '140220', '11'), +('5', '74', '13', '39294', '140019', '11'), +('5', '74', '13', '83581', '135709', '11'), +('5', '74', '14', '39341', '61421', '11'), +('5', '74', '14', '39372', '60669', '11'), +('5', '74', '14', '83640', '57363', '11'), +('5', '74', '14', '83656', '55525', '11'), +('5', '74', '11', '39331', '74779', '11'), +('5', '74', '11', '83582', '74664', '11'), +('5', '74', '11', '39311', '73510', '11'), +('5', '74', '11', '47325', '68517', '11'), +('5', '75', '22', '12425', '0', '13'), +('5', '75', '22', '21807', '0', '13'), +('5', '75', '22', '39342', '0', '13'), +('5', '75', '22', '7867', '0', '13'), +('5', '75', '1', '80676', '81201', '13'), +('5', '75', '1', '80659', '80696', '13'), +('5', '75', '1', '80648', '76266', '13'), +('5', '75', '1', '80639', '74076', '13'), +('5', '75', '2', '70881', '67998', '13'), +('5', '75', '2', '53389', '65764', '13'), +('5', '75', '2', '83560', '49713', '13'), +('5', '75', '2', '28647', '46618', '13'), +('5', '75', '3', '80637', '76396', '13'), +('5', '75', '3', '39218', '66443', '13'), +('5', '75', '3', '46873', '65378', '13'), +('5', '75', '3', '46874', '64671', '13'), +('5', '75', '5', '46867', '89593', '13'), +('5', '75', '5', '80670', '82056', '13'), +('5', '75', '5', '80616', '72869', '13'), +('5', '75', '5', '46934', '70505', '13'), +('5', '75', '8', '46885', '95729', '13'), +('5', '75', '8', '80677', '83632', '13'), +('5', '75', '8', '80649', '74297', '13'), +('5', '75', '8', '39330', '72162', '13'), +('5', '75', '6', '80638', '99085', '13'), +('5', '75', '6', '39337', '76437', '13'), +('5', '75', '6', '46884', '71772', '13'), +('5', '75', '6', '46933', '71724', '13'), +('5', '75', '17', '83603', '78985', '13'), +('5', '75', '17', '53394', '69462', '13'), +('5', '75', '17', '46809', '56380', '13'), +('5', '75', '17', '70886', '52137', '13'), +('5', '75', '7', '53390', '66045', '13'), +('5', '75', '7', '39267', '49886', '13'), +('5', '75', '7', '83564', '49788', '13'), +('5', '75', '7', '70882', '44811', '13'), +('5', '75', '9', '46887', '72136', '13'), +('5', '75', '9', '53391', '65235', '13'), +('5', '75', '9', '39335', '55679', '13'), +('5', '75', '9', '51706', '52770', '13'), +('5', '75', '15', '79909', '85536', '13'), +('5', '75', '15', '80667', '83286', '13'), +('5', '75', '15', '80671', '81972', '13'), +('5', '75', '15', '80686', '81826', '13'), +('5', '75', '20', '80678', '106161', '13'), +('5', '75', '20', '46935', '73671', '13'), +('5', '75', '20', '80620', '71056', '13'), +('5', '75', '20', '46919', '65893', '13'), +('5', '75', '12', '53392', '87683', '13'), +('5', '75', '12', '47212', '59786', '13'), +('5', '75', '12', '71075', '53159', '13'), +('5', '75', '12', '83568', '47600', '13'), +('5', '75', '18', '53395', '68045', '13'), +('5', '75', '18', '83607', '55124', '13'), +('5', '75', '18', '46826', '53946', '13'), +('5', '75', '18', '70887', '48964', '13'), +('5', '75', '19', '53393', '66284', '13'), +('5', '75', '19', '39355', '54767', '13'), +('5', '75', '19', '83572', '49532', '13'), +('5', '75', '19', '70885', '44787', '13'), +('5', '75', '13', '46929', '185196', '13'), +('5', '75', '13', '80642', '178793', '13'), +('5', '75', '13', '80685', '177905', '13'), +('5', '75', '13', '80672', '177773', '13'), +('5', '75', '14', '80665', '78405', '13'), +('5', '75', '14', '80682', '78250', '13'), +('5', '75', '14', '80625', '71665', '13'), +('5', '75', '14', '46875', '67336', '13'), +('5', '75', '11', '80655', '108261', '13'), +('5', '75', '11', '46930', '100850', '13'), +('5', '75', '11', '46849', '84367', '13'), +('5', '75', '11', '80668', '81426', '13'), +('5', '75', '22', '12425', '0', '12'), +('5', '75', '22', '21807', '0', '12'), +('5', '75', '22', '39342', '0', '12'), +('5', '75', '22', '7867', '0', '12'), +('5', '75', '1', '39276', '72623', '12'), +('5', '75', '1', '46931', '71289', '12'), +('5', '75', '1', '83594', '70879', '12'), +('5', '75', '1', '46913', '65750', '12'), +('5', '75', '2', '70881', '67998', '12'), +('5', '75', '2', '53389', '65764', '12'), +('5', '75', '2', '83560', '49713', '12'), +('5', '75', '2', '28647', '46618', '12'), +('5', '75', '3', '39218', '66443', '12'), +('5', '75', '3', '46873', '65378', '12'), +('5', '75', '3', '46874', '64671', '12'), +('5', '75', '3', '47245', '61819', '12'), +('5', '75', '5', '46867', '89593', '12'), +('5', '75', '5', '46934', '70505', '12'), +('5', '75', '5', '46868', '64278', '12'), +('5', '75', '5', '39359', '55352', '12'), +('5', '75', '8', '46885', '95729', '12'), +('5', '75', '8', '39330', '72162', '12'), +('5', '75', '8', '69165', '63803', '12'), +('5', '75', '8', '69064', '60138', '12'), +('5', '75', '6', '39337', '76437', '12'), +('5', '75', '6', '46884', '71772', '12'), +('5', '75', '6', '46933', '71724', '12'), +('5', '75', '6', '46883', '70557', '12'), +('5', '75', '17', '83603', '78985', '12'), +('5', '75', '17', '53394', '69462', '12'), +('5', '75', '17', '46809', '56380', '12'), +('5', '75', '17', '70886', '52137', '12'), +('5', '75', '7', '53390', '66045', '12'), +('5', '75', '7', '39267', '49886', '12'), +('5', '75', '7', '83564', '49788', '12'), +('5', '75', '7', '70882', '44811', '12'), +('5', '75', '9', '46887', '72136', '12'), +('5', '75', '9', '53391', '65235', '12'), +('5', '75', '9', '39335', '55679', '12'), +('5', '75', '9', '51706', '52770', '12'), +('5', '75', '15', '46881', '72852', '12'), +('5', '75', '15', '46863', '67802', '12'), +('5', '75', '15', '46907', '67077', '12'), +('5', '75', '15', '46864', '63987', '12'), +('5', '75', '20', '46935', '73671', '12'), +('5', '75', '20', '46919', '65893', '12'), +('5', '75', '20', '47283', '65775', '12'), +('5', '75', '20', '46920', '64118', '12'), +('5', '75', '12', '53392', '87683', '12'), +('5', '75', '12', '47212', '59786', '12'), +('5', '75', '12', '71075', '53159', '12'), +('5', '75', '12', '83568', '47600', '12'), +('5', '75', '18', '53395', '68045', '12'), +('5', '75', '18', '83607', '55124', '12'), +('5', '75', '18', '46826', '53946', '12'), +('5', '75', '18', '70887', '48964', '12'), +('5', '75', '19', '53393', '66284', '12'), +('5', '75', '19', '39355', '54767', '12'), +('5', '75', '19', '83572', '49532', '12'), +('5', '75', '19', '70885', '44787', '12'), +('5', '75', '13', '46929', '185196', '12'), +('5', '75', '13', '46879', '165288', '12'), +('5', '75', '13', '46855', '154260', '12'), +('5', '75', '13', '46890', '153098', '12'), +('5', '75', '14', '46875', '67336', '12'), +('5', '75', '14', '46925', '66521', '12'), +('5', '75', '14', '46853', '61613', '12'), +('5', '75', '14', '39341', '61424', '12'), +('5', '75', '11', '46930', '100850', '12'), +('5', '75', '11', '46849', '84367', '12'), +('5', '75', '11', '39331', '74817', '12'), +('5', '75', '11', '83582', '74704', '12'), +('5', '76', '22', '12425', '0', '13'), +('5', '76', '22', '21807', '0', '13'), +('5', '76', '22', '39342', '0', '13'), +('5', '76', '22', '7867', '0', '13'), +('5', '76', '1', '80676', '81203', '13'), +('5', '76', '1', '80659', '80702', '13'), +('5', '76', '1', '80648', '76272', '13'), +('5', '76', '1', '80639', '74082', '13'), +('5', '76', '2', '70881', '68001', '13'), +('5', '76', '2', '53389', '65768', '13'), +('5', '76', '2', '83560', '49719', '13'), +('5', '76', '2', '28647', '46621', '13'), +('5', '76', '3', '80637', '76402', '13'), +('5', '76', '3', '39218', '66446', '13'), +('5', '76', '3', '46873', '65383', '13'), +('5', '76', '3', '46874', '64676', '13'), +('5', '76', '5', '46867', '89597', '13'), +('5', '76', '5', '80670', '82062', '13'), +('5', '76', '5', '80616', '72870', '13'), +('5', '76', '5', '46934', '70512', '13'), +('5', '76', '8', '46885', '95735', '13'), +('5', '76', '8', '80677', '83638', '13'), +('5', '76', '8', '80649', '74303', '13'), +('5', '76', '8', '39330', '72164', '13'), +('5', '76', '6', '80638', '99091', '13'), +('5', '76', '6', '39337', '76441', '13'), +('5', '76', '6', '46884', '71778', '13'), +('5', '76', '6', '46933', '71729', '13'), +('5', '76', '17', '83603', '78990', '13'), +('5', '76', '17', '53394', '69466', '13'), +('5', '76', '17', '46809', '56383', '13'), +('5', '76', '17', '70886', '52142', '13'), +('5', '76', '7', '53390', '66050', '13'), +('5', '76', '7', '39267', '49889', '13'), +('5', '76', '7', '83564', '49794', '13'), +('5', '76', '7', '70882', '44817', '13'), +('5', '76', '9', '46887', '72141', '13'), +('5', '76', '9', '53391', '65240', '13'), +('5', '76', '9', '39335', '55684', '13'), +('5', '76', '9', '51706', '52774', '13'), +('5', '76', '15', '79909', '85541', '13'), +('5', '76', '15', '80667', '83292', '13'), +('5', '76', '15', '80671', '81978', '13'), +('5', '76', '15', '80686', '81832', '13'), +('5', '76', '20', '80678', '106167', '13'), +('5', '76', '20', '46935', '73677', '13'), +('5', '76', '20', '80620', '71059', '13'), +('5', '76', '20', '46919', '65898', '13'), +('5', '76', '12', '53392', '87687', '13'), +('5', '76', '12', '47212', '59789', '13'), +('5', '76', '12', '71075', '53162', '13'), +('5', '76', '12', '83568', '47606', '13'), +('5', '76', '18', '53395', '68049', '13'), +('5', '76', '18', '83607', '55129', '13'), +('5', '76', '18', '46826', '53949', '13'), +('5', '76', '18', '70887', '48968', '13'), +('5', '76', '19', '53393', '66288', '13'), +('5', '76', '19', '39355', '54772', '13'), +('5', '76', '19', '83572', '49538', '13'), +('5', '76', '19', '70885', '44790', '13'), +('5', '76', '13', '46929', '185831', '13'), +('5', '76', '13', '80642', '178939', '13'), +('5', '76', '13', '80685', '178078', '13'), +('5', '76', '13', '80672', '177946', '13'), +('5', '76', '14', '80665', '78409', '13'), +('5', '76', '14', '80682', '78254', '13'), +('5', '76', '14', '80625', '71669', '13'), +('5', '76', '14', '46875', '67341', '13'), +('5', '76', '11', '80655', '108313', '13'), +('5', '76', '11', '46930', '100901', '13'), +('5', '76', '11', '46849', '84371', '13'), +('5', '76', '11', '80668', '81432', '13'), +('5', '77', '22', '12425', '0', '13'), +('5', '77', '22', '21807', '0', '13'), +('5', '77', '22', '39342', '0', '13'), +('5', '77', '22', '7867', '0', '13'), +('5', '77', '1', '80676', '81206', '13'), +('5', '77', '1', '80659', '80708', '13'), +('5', '77', '1', '80648', '76277', '13'), +('5', '77', '1', '80639', '74087', '13'), +('5', '77', '2', '70881', '68005', '13'), +('5', '77', '2', '53389', '65772', '13'), +('5', '77', '2', '83560', '49725', '13'), +('5', '77', '2', '28647', '46624', '13'), +('5', '77', '3', '80637', '76407', '13'), +('5', '77', '3', '39218', '66449', '13'), +('5', '77', '3', '46873', '65388', '13'), +('5', '77', '3', '46874', '64681', '13'), +('5', '77', '5', '46867', '89602', '13'), +('5', '77', '5', '80670', '82068', '13'), +('5', '77', '5', '80616', '72872', '13'), +('5', '77', '5', '46934', '70518', '13'), +('5', '77', '8', '46885', '95742', '13'), +('5', '77', '8', '80677', '83644', '13'), +('5', '77', '8', '80649', '74308', '13'), +('5', '77', '8', '39330', '72166', '13'), +('5', '77', '6', '80638', '99096', '13'), +('5', '77', '6', '39337', '76445', '13'), +('5', '77', '6', '46884', '71784', '13'), +('5', '77', '6', '46933', '71734', '13'), +('5', '77', '17', '83603', '78996', '13'), +('5', '77', '17', '53394', '69470', '13'), +('5', '77', '17', '46809', '56386', '13'), +('5', '77', '17', '70886', '52146', '13'), +('5', '77', '7', '53390', '66054', '13'), +('5', '77', '7', '39267', '49893', '13'), +('5', '77', '7', '83564', '49800', '13'), +('5', '77', '7', '70882', '44822', '13'), +('5', '77', '9', '46887', '72146', '13'), +('5', '77', '9', '53391', '65245', '13'), +('5', '77', '9', '39335', '55689', '13'), +('5', '77', '9', '51706', '52779', '13'), +('5', '77', '15', '79909', '85546', '13'), +('5', '77', '15', '80667', '83298', '13'), +('5', '77', '15', '80671', '81984', '13'), +('5', '77', '15', '80686', '81838', '13'), +('5', '77', '20', '80678', '106173', '13'), +('5', '77', '20', '46935', '73683', '13'), +('5', '77', '20', '80620', '71063', '13'), +('5', '77', '20', '46919', '65904', '13'), +('5', '77', '12', '53392', '87691', '13'), +('5', '77', '12', '47212', '59793', '13'), +('5', '77', '12', '71075', '53165', '13'), +('5', '77', '12', '83568', '47612', '13'), +('5', '77', '18', '53395', '68053', '13'), +('5', '77', '18', '83607', '55134', '13'), +('5', '77', '18', '46826', '53952', '13'), +('5', '77', '18', '70887', '48972', '13'), +('5', '77', '19', '53393', '66292', '13'), +('5', '77', '19', '39355', '54777', '13'), +('5', '77', '19', '83572', '49544', '13'), +('5', '77', '19', '70885', '44793', '13'), +('5', '77', '13', '46929', '186438', '13'), +('5', '77', '13', '80642', '179085', '13'), +('5', '77', '13', '80685', '178223', '13'), +('5', '77', '13', '80672', '178090', '13'), +('5', '77', '14', '80665', '78414', '13'), +('5', '77', '14', '80682', '78259', '13'), +('5', '77', '14', '80625', '71674', '13'), +('5', '77', '14', '46875', '67346', '13'), +('5', '77', '11', '80655', '108364', '13'), +('5', '77', '11', '46930', '100953', '13'), +('5', '77', '11', '46849', '84376', '13'), +('5', '77', '11', '80668', '81438', '13'), +('5', '78', '22', '12425', '0', '13'), +('5', '78', '22', '21807', '0', '13'), +('5', '78', '22', '39342', '0', '13'), +('5', '78', '22', '7867', '0', '13'), +('5', '78', '1', '80676', '81208', '13'), +('5', '78', '1', '80659', '80714', '13'), +('5', '78', '1', '80648', '76283', '13'), +('5', '78', '1', '80639', '74093', '13'), +('5', '78', '2', '70881', '68008', '13'), +('5', '78', '2', '53389', '65776', '13'), +('5', '78', '2', '83560', '49732', '13'), +('5', '78', '2', '28647', '46628', '13'), +('5', '78', '3', '80637', '76413', '13'), +('5', '78', '3', '39218', '66453', '13'), +('5', '78', '3', '46873', '65393', '13'), +('5', '78', '3', '46874', '64686', '13'), +('5', '78', '5', '46867', '89607', '13'), +('5', '78', '5', '80670', '82074', '13'), +('5', '78', '5', '80616', '72874', '13'), +('5', '78', '5', '46934', '70524', '13'), +('5', '78', '8', '46885', '95748', '13'), +('5', '78', '8', '80677', '83651', '13'), +('5', '78', '8', '80649', '74314', '13'), +('5', '78', '8', '39330', '72167', '13'), +('5', '78', '6', '80638', '99102', '13'), +('5', '78', '6', '39337', '76449', '13'), +('5', '78', '6', '46884', '71790', '13'), +('5', '78', '6', '46933', '71738', '13'), +('5', '78', '17', '83603', '79001', '13'), +('5', '78', '17', '53394', '69474', '13'), +('5', '78', '17', '46809', '56390', '13'), +('5', '78', '17', '70886', '52151', '13'), +('5', '78', '7', '53390', '66059', '13'), +('5', '78', '7', '39267', '49896', '13'), +('5', '78', '7', '83564', '49806', '13'), +('5', '78', '7', '70882', '44828', '13'), +('5', '78', '9', '46887', '72151', '13'), +('5', '78', '9', '53391', '65249', '13'), +('5', '78', '9', '39335', '55694', '13'), +('5', '78', '9', '51706', '52784', '13'), +('5', '78', '15', '79909', '85551', '13'), +('5', '78', '15', '80667', '83304', '13'), +('5', '78', '15', '80671', '81991', '13'), +('5', '78', '15', '80686', '81844', '13'), +('5', '78', '20', '80678', '106179', '13'), +('5', '78', '20', '46935', '73689', '13'), +('5', '78', '20', '80620', '71066', '13'), +('5', '78', '20', '46919', '65909', '13'), +('5', '78', '12', '53392', '87695', '13'), +('5', '78', '12', '47212', '59797', '13'), +('5', '78', '12', '71075', '53168', '13'), +('5', '78', '12', '83568', '47619', '13'), +('5', '78', '18', '53395', '68057', '13'), +('5', '78', '18', '83607', '55140', '13'), +('5', '78', '18', '46826', '53955', '13'), +('5', '78', '18', '70887', '48977', '13'), +('5', '78', '19', '53393', '66296', '13'), +('5', '78', '19', '39355', '54782', '13'), +('5', '78', '19', '83572', '49550', '13'), +('5', '78', '19', '70885', '44796', '13'), +('5', '78', '13', '46929', '187045', '13'), +('5', '78', '13', '80642', '179231', '13'), +('5', '78', '13', '80685', '178396', '13'), +('5', '78', '13', '80672', '178263', '13'), +('5', '78', '14', '80665', '78418', '13'), +('5', '78', '14', '80682', '78263', '13'), +('5', '78', '14', '80625', '71678', '13'), +('5', '78', '14', '46875', '67351', '13'), +('5', '78', '11', '80655', '108416', '13'), +('5', '78', '11', '46930', '101004', '13'), +('5', '78', '11', '46849', '84381', '13'), +('5', '78', '11', '80668', '81444', '13'), +('5', '79', '22', '12425', '0', '13'), +('5', '79', '22', '21807', '0', '13'), +('5', '79', '22', '39342', '0', '13'), +('5', '79', '22', '7867', '0', '13'), +('5', '79', '1', '80676', '81210', '13'), +('5', '79', '1', '80659', '80720', '13'), +('5', '79', '1', '80648', '76288', '13'), +('5', '79', '1', '80639', '74098', '13'), +('5', '79', '2', '70881', '68011', '13'), +('5', '79', '2', '53389', '65780', '13'), +('5', '79', '2', '83560', '49738', '13'), +('5', '79', '2', '28647', '46631', '13'), +('5', '79', '3', '80637', '76418', '13'), +('5', '79', '3', '39218', '66456', '13'), +('5', '79', '3', '46873', '65398', '13'), +('5', '79', '3', '46874', '64691', '13'), +('5', '79', '5', '46867', '89612', '13'), +('5', '79', '5', '80670', '82080', '13'), +('5', '79', '5', '80616', '72876', '13'), +('5', '79', '5', '46934', '70531', '13'), +('5', '79', '8', '46885', '95754', '13'), +('5', '79', '8', '80677', '83657', '13'), +('5', '79', '8', '80649', '74319', '13'), +('5', '79', '8', '39330', '72169', '13'), +('5', '79', '6', '80638', '99107', '13'), +('5', '79', '6', '39337', '76453', '13'), +('5', '79', '6', '46884', '71796', '13'), +('5', '79', '6', '46933', '71743', '13'), +('5', '79', '17', '83603', '79006', '13'), +('5', '79', '17', '53394', '69478', '13'), +('5', '79', '17', '46809', '56393', '13'), +('5', '79', '17', '70886', '52156', '13'), +('5', '79', '7', '53390', '66063', '13'), +('5', '79', '7', '39267', '49900', '13'), +('5', '79', '7', '83564', '49812', '13'), +('5', '79', '7', '70882', '44833', '13'), +('5', '79', '9', '46887', '72156', '13'), +('5', '79', '9', '53391', '65254', '13'), +('5', '79', '9', '39335', '55699', '13'), +('5', '79', '9', '51706', '52788', '13'), +('5', '79', '15', '79909', '85556', '13'), +('5', '79', '15', '80667', '83310', '13'), +('5', '79', '15', '80671', '81997', '13'), +('5', '79', '15', '80686', '81850', '13'), +('5', '79', '20', '80678', '106185', '13'), +('5', '79', '20', '46935', '73695', '13'), +('5', '79', '20', '80620', '71069', '13'), +('5', '79', '20', '46919', '65915', '13'), +('5', '79', '12', '53392', '87699', '13'), +('5', '79', '12', '47212', '59801', '13'), +('5', '79', '12', '71075', '53171', '13'), +('5', '79', '12', '83568', '47625', '13'), +('5', '79', '18', '53395', '68061', '13'), +('5', '79', '18', '83607', '55145', '13'), +('5', '79', '18', '46826', '53958', '13'), +('5', '79', '18', '70887', '48981', '13'), +('5', '79', '19', '53393', '66300', '13'), +('5', '79', '19', '39355', '54787', '13'), +('5', '79', '19', '83572', '49557', '13'), +('5', '79', '19', '70885', '44800', '13'), +('5', '79', '13', '46929', '187652', '13'), +('5', '79', '13', '80642', '179377', '13'), +('5', '79', '13', '80685', '178569', '13'), +('5', '79', '13', '80672', '178436', '13'), +('5', '79', '14', '80665', '78422', '13'), +('5', '79', '14', '80682', '78267', '13'), +('5', '79', '14', '80625', '71682', '13'), +('5', '79', '14', '46875', '67356', '13'), +('5', '79', '11', '80655', '108467', '13'), +('5', '79', '11', '46930', '101056', '13'), +('5', '79', '11', '46849', '84386', '13'), +('5', '79', '11', '80668', '81450', '13'), +('5', '80', '22', '12425', '0', '14'), +('5', '80', '22', '21807', '0', '14'), +('5', '80', '22', '39342', '0', '14'), +('5', '80', '22', '7867', '0', '14'), +('5', '80', '1', '102597', '108728', '14'), +('5', '80', '1', '102618', '108715', '14'), +('5', '80', '1', '102641', '108290', '14'), +('5', '80', '1', '102639', '107662', '14'), +('5', '80', '2', '102003', '73979', '14'), +('5', '80', '2', '70881', '68015', '14'), +('5', '80', '2', '102255', '66791', '14'), +('5', '80', '2', '53389', '65784', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '80', '3', '102726', '118887', '14'), +('5', '80', '3', '102619', '116075', '14'), +('5', '80', '3', '102598', '115933', '14'), +('5', '80', '3', '102725', '103547', '14'), +('5', '80', '5', '102599', '114063', '14'), +('5', '80', '5', '102620', '113730', '14'), +('5', '80', '5', '102745', '104103', '14'), +('5', '80', '5', '102551', '99443', '14'), +('5', '80', '8', '102601', '138428', '14'), +('5', '80', '8', '102552', '123411', '14'), +('5', '80', '8', '102622', '116061', '14'), +('5', '80', '8', '46885', '95761', '14'), +('5', '80', '6', '102621', '115755', '14'), +('5', '80', '6', '102600', '115512', '14'), +('5', '80', '6', '102558', '101434', '14'), +('5', '80', '6', '80638', '99113', '14'), +('5', '80', '17', '103586', '84511', '14'), +('5', '80', '17', '102006', '79401', '14'), +('5', '80', '17', '83603', '79012', '14'), +('5', '80', '17', '102258', '72070', '14'), +('5', '80', '7', '102004', '75379', '14'), +('5', '80', '7', '102256', '68040', '14'), +('5', '80', '7', '53390', '66068', '14'), +('5', '80', '7', '39267', '49904', '14'), +('5', '80', '9', '67098', '191992', '14'), +('5', '80', '9', '46887', '72161', '14'), +('5', '80', '9', '53391', '65259', '14'), +('5', '80', '9', '102287', '62250', '14'), +('5', '80', '15', '102623', '110481', '14'), +('5', '80', '15', '102602', '110183', '14'), +('5', '80', '15', '102636', '109598', '14'), +('5', '80', '15', '102637', '109369', '14'), +('5', '80', '20', '102624', '138851', '14'), +('5', '80', '20', '102603', '138476', '14'), +('5', '80', '20', '102553', '122996', '14'), +('5', '80', '20', '80678', '106192', '14'), +('5', '80', '12', '53392', '87703', '14'), +('5', '80', '12', '102253', '64256', '14'), +('5', '80', '12', '47212', '59804', '14'), +('5', '80', '12', '71075', '53174', '14'), +('5', '80', '18', '102005', '76793', '14'), +('5', '80', '18', '102257', '69351', '14'), +('5', '80', '18', '53395', '68065', '14'), +('5', '80', '18', '83607', '55151', '14'), +('5', '80', '19', '76131', '83621', '14'), +('5', '80', '19', '53393', '66304', '14'), +('5', '80', '19', '102254', '64611', '14'), +('5', '80', '19', '39355', '54793', '14'), +('5', '80', '13', '102663', '247479', '14'), +('5', '80', '13', '102653', '233541', '14'), +('5', '80', '13', '102664', '233416', '14'), +('5', '80', '13', '102658', '231516', '14'), +('5', '80', '14', '102632', '117542', '14'), +('5', '80', '14', '102633', '116414', '14'), +('5', '80', '14', '102570', '102486', '14'), +('5', '80', '14', '80665', '78427', '14'), +('5', '80', '11', '102667', '158426', '14'), +('5', '80', '11', '102589', '138433', '14'), +('5', '80', '11', '102643', '110836', '14'), +('5', '80', '11', '80655', '108519', '14'), +('5', '81', '22', '12425', '0', '14'), +('5', '81', '22', '21807', '0', '14'), +('5', '81', '22', '39342', '0', '14'), +('5', '81', '22', '7867', '0', '14'), +('5', '81', '1', '102597', '108733', '14'), +('5', '81', '1', '102618', '108720', '14'), +('5', '81', '1', '102641', '108295', '14'), +('5', '81', '1', '102639', '107668', '14'), +('5', '81', '2', '102003', '73981', '14'), +('5', '81', '2', '70881', '68018', '14'), +('5', '81', '2', '102255', '66796', '14'), +('5', '81', '2', '53389', '65788', '14'), +('5', '81', '3', '102726', '118893', '14'), +('5', '81', '3', '102619', '116081', '14'), +('5', '81', '3', '102598', '115940', '14'), +('5', '81', '3', '102725', '103551', '14'), +('5', '81', '5', '102599', '114067', '14'), +('5', '81', '5', '102620', '113733', '14'), +('5', '81', '5', '102745', '104109', '14'), +('5', '81', '5', '102551', '99446', '14'), +('5', '81', '8', '102601', '138431', '14'), +('5', '81', '8', '102552', '123417', '14'), +('5', '81', '8', '102622', '116066', '14'), +('5', '81', '8', '46885', '95767', '14'), +('5', '81', '6', '102621', '115760', '14'), +('5', '81', '6', '102600', '115518', '14'), +('5', '81', '6', '102558', '101439', '14'), +('5', '81', '6', '80638', '99118', '14'), +('5', '81', '17', '103586', '85571', '14'), +('5', '81', '17', '102006', '79406', '14'), +('5', '81', '17', '83603', '79017', '14'), +('5', '81', '17', '102258', '72075', '14'), +('5', '81', '7', '102004', '75385', '14'), +('5', '81', '7', '102256', '68045', '14'), +('5', '81', '7', '53390', '66073', '14'), +('5', '81', '7', '39267', '49907', '14'), +('5', '81', '9', '67098', '194395', '14'), +('5', '81', '9', '46887', '72166', '14'), +('5', '81', '9', '53391', '65264', '14'), +('5', '81', '9', '102287', '62254', '14'), +('5', '81', '15', '102623', '110484', '14'), +('5', '81', '15', '102602', '110187', '14'), +('5', '81', '15', '102636', '109602', '14'), +('5', '81', '15', '102637', '109376', '14'), +('5', '81', '20', '102624', '138858', '14'), +('5', '81', '20', '102603', '138482', '14'), +('5', '81', '20', '102553', '123003', '14'), +('5', '81', '20', '80678', '106198', '14'), +('5', '81', '12', '53392', '87707', '14'), +('5', '81', '12', '102253', '64260', '14'), +('5', '81', '12', '47212', '59808', '14'), +('5', '81', '12', '71075', '53178', '14'), +('5', '81', '18', '102005', '76799', '14'), +('5', '81', '18', '102257', '69356', '14'), +('5', '81', '18', '53395', '68069', '14'), +('5', '81', '18', '83607', '55156', '14'), +('5', '81', '19', '76131', '83622', '14'), +('5', '81', '19', '53393', '66308', '14'), +('5', '81', '19', '102254', '64614', '14'), +('5', '81', '19', '39355', '54798', '14'), +('5', '81', '13', '102663', '247794', '14'), +('5', '81', '13', '102653', '233743', '14'), +('5', '81', '13', '102664', '233619', '14'), +('5', '81', '13', '102658', '231689', '14'), +('5', '81', '14', '102632', '117548', '14'), +('5', '81', '14', '102633', '116418', '14'), +('5', '81', '14', '102570', '102490', '14'), +('5', '81', '14', '80665', '78431', '14'), +('5', '81', '11', '102667', '158487', '14'), +('5', '81', '11', '102589', '138482', '14'), +('5', '81', '11', '102643', '110839', '14'), +('5', '81', '11', '80655', '108570', '14'), +('5', '82', '22', '12425', '0', '14'), +('5', '82', '22', '21807', '0', '14'), +('5', '82', '22', '39342', '0', '14'), +('5', '82', '22', '7867', '0', '14'), +('5', '82', '1', '102597', '108738', '14'), +('5', '82', '1', '102618', '108724', '14'), +('5', '82', '1', '102641', '108300', '14'), +('5', '82', '1', '102639', '107675', '14'), +('5', '82', '2', '102003', '73984', '14'), +('5', '82', '2', '70881', '68021', '14'), +('5', '82', '2', '102255', '66801', '14'), +('5', '82', '2', '53389', '65792', '14'), +('5', '82', '3', '102726', '118899', '14'), +('5', '82', '3', '102619', '116088', '14'), +('5', '82', '3', '102598', '115946', '14'), +('5', '82', '3', '102725', '103556', '14'), +('5', '82', '5', '102599', '114072', '14'), +('5', '82', '5', '102620', '113736', '14'), +('5', '82', '5', '102745', '104114', '14'), +('5', '82', '5', '102551', '99449', '14'), +('5', '82', '8', '102601', '138434', '14'), +('5', '82', '8', '102552', '123424', '14'), +('5', '82', '8', '102622', '116071', '14'), +('5', '82', '8', '46885', '95774', '14'), +('5', '82', '6', '102621', '115765', '14'), +('5', '82', '6', '102600', '115524', '14'), +('5', '82', '6', '102558', '101445', '14'), +('5', '82', '6', '80638', '99124', '14'), +('5', '82', '17', '103586', '86631', '14'), +('5', '82', '17', '102006', '79411', '14'), +('5', '82', '17', '83603', '79023', '14'), +('5', '82', '17', '102258', '72079', '14'), +('5', '82', '7', '102004', '75390', '14'), +('5', '82', '7', '102256', '68050', '14'), +('5', '82', '7', '53390', '66077', '14'), +('5', '82', '7', '39267', '49911', '14'), +('5', '82', '9', '67098', '196799', '14'), +('5', '82', '9', '46887', '72172', '14'), +('5', '82', '9', '53391', '65269', '14'), +('5', '82', '9', '102287', '62258', '14'), +('5', '82', '15', '102623', '110488', '14'), +('5', '82', '15', '102602', '110192', '14'), +('5', '82', '15', '102636', '109607', '14'), +('5', '82', '15', '102637', '109382', '14'), +('5', '82', '20', '102624', '138866', '14'), +('5', '82', '20', '102603', '138489', '14'), +('5', '82', '20', '102553', '123010', '14'), +('5', '82', '20', '80678', '106204', '14'), +('5', '82', '12', '53392', '87711', '14'), +('5', '82', '12', '102253', '64264', '14'), +('5', '82', '12', '47212', '59812', '14'), +('5', '82', '12', '71075', '53181', '14'), +('5', '82', '18', '102005', '76805', '14'), +('5', '82', '18', '102257', '69361', '14'), +('5', '82', '18', '53395', '68073', '14'), +('5', '82', '18', '83607', '55161', '14'), +('5', '82', '19', '76131', '83623', '14'), +('5', '82', '19', '53393', '66312', '14'), +('5', '82', '19', '102254', '64617', '14'), +('5', '82', '19', '39355', '54803', '14'), +('5', '82', '13', '102663', '248138', '14'), +('5', '82', '13', '102653', '233945', '14'), +('5', '82', '13', '102664', '233794', '14'), +('5', '82', '13', '102658', '231890', '14'), +('5', '82', '14', '102632', '117554', '14'), +('5', '82', '14', '102633', '116422', '14'), +('5', '82', '14', '102570', '102495', '14'), +('5', '82', '14', '80665', '78435', '14'), +('5', '82', '11', '102667', '158548', '14'), +('5', '82', '11', '102589', '138541', '14'), +('5', '82', '11', '102643', '110841', '14'), +('5', '82', '11', '80655', '108622', '14'), +('5', '83', '22', '12425', '0', '14'), +('5', '83', '22', '21807', '0', '14'), +('5', '83', '22', '39342', '0', '14'), +('5', '83', '22', '7867', '0', '14'), +('5', '83', '1', '102597', '108744', '14'), +('5', '83', '1', '102618', '108730', '14'), +('5', '83', '1', '102641', '108306', '14'), +('5', '83', '1', '102639', '107683', '14'), +('5', '83', '2', '102003', '73987', '14'), +('5', '83', '2', '70881', '68025', '14'), +('5', '83', '2', '102255', '66806', '14'), +('5', '83', '2', '53389', '65797', '14'), +('5', '83', '3', '102726', '118906', '14'), +('5', '83', '3', '102619', '116095', '14'), +('5', '83', '3', '102598', '115953', '14'), +('5', '83', '3', '102725', '103561', '14'), +('5', '83', '5', '102599', '114077', '14'), +('5', '83', '5', '102620', '113740', '14'), +('5', '83', '5', '102745', '104120', '14'), +('5', '83', '5', '102551', '99452', '14'), +('5', '83', '8', '102601', '138437', '14'), +('5', '83', '8', '102552', '123430', '14'), +('5', '83', '8', '102622', '116077', '14'), +('5', '83', '8', '46885', '95780', '14'), +('5', '83', '6', '102621', '115770', '14'), +('5', '83', '6', '102600', '115530', '14'), +('5', '83', '6', '102558', '101451', '14'), +('5', '83', '6', '80638', '99130', '14'), +('5', '83', '17', '103586', '87691', '14'), +('5', '83', '17', '102006', '79416', '14'), +('5', '83', '17', '83603', '79029', '14'), +('5', '83', '17', '102258', '72084', '14'), +('5', '83', '7', '102004', '75396', '14'), +('5', '83', '7', '102256', '68055', '14'), +('5', '83', '7', '53390', '66082', '14'), +('5', '83', '7', '39267', '49915', '14'), +('5', '83', '9', '67098', '199204', '14'), +('5', '83', '9', '46887', '72177', '14'), +('5', '83', '9', '53391', '65274', '14'), +('5', '83', '9', '102287', '62261', '14'), +('5', '83', '15', '102623', '110492', '14'), +('5', '83', '15', '102602', '110196', '14'), +('5', '83', '15', '102636', '109611', '14'), +('5', '83', '15', '102637', '109390', '14'), +('5', '83', '20', '102624', '138874', '14'), +('5', '83', '20', '102603', '138495', '14'), +('5', '83', '20', '102553', '123017', '14'), +('5', '83', '20', '80678', '106210', '14'), +('5', '83', '12', '53392', '87715', '14'), +('5', '83', '12', '102253', '64268', '14'), +('5', '83', '12', '47212', '59816', '14'), +('5', '83', '12', '71075', '53184', '14'), +('5', '83', '18', '102005', '76811', '14'), +('5', '83', '18', '102257', '69367', '14'), +('5', '83', '18', '53395', '68077', '14'), +('5', '83', '18', '83607', '55167', '14'), +('5', '83', '19', '76131', '83624', '14'), +('5', '83', '19', '53393', '66317', '14'), +('5', '83', '19', '102254', '64620', '14'), +('5', '83', '19', '39355', '54808', '14'), +('5', '83', '13', '102663', '248481', '14'), +('5', '83', '13', '102653', '234119', '14'), +('5', '83', '13', '102664', '233997', '14'), +('5', '83', '13', '102658', '232064', '14'), +('5', '83', '14', '102632', '117560', '14'), +('5', '83', '14', '102633', '116426', '14'), +('5', '83', '14', '102570', '102501', '14'), +('5', '83', '14', '80665', '78440', '14'), +('5', '83', '11', '102667', '158619', '14'), +('5', '83', '11', '102589', '138591', '14'), +('5', '83', '11', '102643', '110844', '14'), +('5', '83', '11', '80655', '108673', '14'), +('5', '84', '22', '12425', '0', '14'), +('5', '84', '22', '21807', '0', '14'), +('5', '84', '22', '39342', '0', '14'), +('5', '84', '22', '7867', '0', '14'), +('5', '84', '1', '102597', '108749', '14'), +('5', '84', '1', '102618', '108735', '14'), +('5', '84', '1', '102641', '108311', '14'), +('5', '84', '1', '102639', '107689', '14'), +('5', '84', '2', '102003', '73989', '14'), +('5', '84', '2', '70881', '68028', '14'), +('5', '84', '2', '102255', '66811', '14'), +('5', '84', '2', '53389', '65801', '14'), +('5', '84', '3', '102726', '118911', '14'), +('5', '84', '3', '102619', '116101', '14'), +('5', '84', '3', '102598', '115959', '14'), +('5', '84', '3', '102725', '103565', '14'), +('5', '84', '5', '102599', '114082', '14'), +('5', '84', '5', '102620', '113743', '14'), +('5', '84', '5', '102745', '104125', '14'), +('5', '84', '5', '102551', '99455', '14'), +('5', '84', '8', '102601', '138440', '14'), +('5', '84', '8', '102552', '123437', '14'), +('5', '84', '8', '102622', '116082', '14'), +('5', '84', '8', '46885', '95786', '14'), +('5', '84', '6', '102621', '115775', '14'), +('5', '84', '6', '102600', '115536', '14'), +('5', '84', '6', '102558', '101457', '14'), +('5', '84', '6', '80638', '99135', '14'), +('5', '84', '17', '103586', '88750', '14'), +('5', '84', '17', '102006', '79421', '14'), +('5', '84', '17', '83603', '79034', '14'), +('5', '84', '17', '102258', '72089', '14'), +('5', '84', '7', '102004', '75401', '14'), +('5', '84', '7', '102256', '68060', '14'), +('5', '84', '7', '53390', '66086', '14'), +('5', '84', '7', '39267', '49918', '14'), +('5', '84', '9', '67098', '201608', '14'), +('5', '84', '9', '46887', '72182', '14'), +('5', '84', '9', '53391', '65279', '14'), +('5', '84', '9', '102287', '62265', '14'), +('5', '84', '15', '102623', '110496', '14'), +('5', '84', '15', '102602', '110201', '14'), +('5', '84', '15', '102636', '109615', '14'), +('5', '84', '15', '102637', '109397', '14'), +('5', '84', '20', '102624', '138881', '14'), +('5', '84', '20', '102603', '138501', '14'), +('5', '84', '20', '102553', '123023', '14'), +('5', '84', '20', '80678', '106216', '14'), +('5', '84', '12', '53392', '87719', '14'), +('5', '84', '12', '102253', '64272', '14'), +('5', '84', '12', '47212', '59819', '14'), +('5', '84', '12', '71075', '53187', '14'), +('5', '84', '18', '102005', '76817', '14'), +('5', '84', '18', '102257', '69372', '14'), +('5', '84', '18', '53395', '68081', '14'), +('5', '84', '18', '83607', '55172', '14'), +('5', '84', '19', '76131', '83625', '14'), +('5', '84', '19', '53393', '66321', '14'), +('5', '84', '19', '102254', '64623', '14'), +('5', '84', '19', '39355', '54813', '14'), +('5', '84', '13', '102663', '248796', '14'), +('5', '84', '13', '102653', '234321', '14'), +('5', '84', '13', '102664', '234200', '14'), +('5', '84', '13', '102658', '232265', '14'), +('5', '84', '14', '102632', '117567', '14'), +('5', '84', '14', '102633', '116431', '14'), +('5', '84', '14', '102570', '102506', '14'), +('5', '84', '14', '80665', '78444', '14'), +('5', '84', '11', '102667', '158679', '14'), +('5', '84', '11', '102589', '138649', '14'), +('5', '84', '11', '102643', '110847', '14'), +('5', '84', '11', '80655', '108725', '14'), +('5', '85', '22', '39342', '0', '16'), +('5', '85', '22', '12425', '0', '16'), +('5', '85', '22', '7867', '0', '16'), +('5', '85', '22', '23597', '0', '16'), +('5', '85', '1', '111309', '210756', '16'), +('5', '85', '1', '111303', '209728', '16'), +('5', '85', '1', '111300', '208507', '16'), +('5', '85', '1', '111305', '208269', '16'), +('5', '85', '2', '94056', '132504', '16'), +('5', '85', '2', '62985', '131801', '16'), +('5', '85', '2', '89368', '125999', '16'), +('5', '85', '2', '104403', '111559', '16'), +('5', '85', '3', '111312', '209871', '16'), +('5', '85', '3', '111315', '208980', '16'), +('5', '85', '3', '111313', '208922', '16'), +('5', '85', '3', '111316', '206889', '16'), +('5', '85', '5', '111318', '208644', '16'), +('5', '85', '5', '111320', '208491', '16'), +('5', '85', '5', '111319', '206469', '16'), +('5', '85', '5', '111017', '182939', '16'), +('5', '85', '8', '111331', '210650', '16'), +('5', '85', '8', '111328', '209948', '16'), +('5', '85', '8', '111332', '206881', '16'), +('5', '85', '8', '111030', '184870', '16'), +('5', '85', '6', '111322', '208968', '16'), +('5', '85', '6', '111324', '208945', '16'), +('5', '85', '6', '111326', '206575', '16'), +('5', '85', '6', '111021', '183238', '16'), +('5', '85', '17', '56046', '138978', '16'), +('5', '85', '17', '81765', '138328', '16'), +('5', '85', '17', '56083', '138169', '16'), +('5', '85', '17', '104406', '118634', '16'), +('5', '85', '7', '94053', '133294', '16'), +('5', '85', '7', '56079', '132459', '16'), +('5', '85', '7', '89369', '127273', '16'), +('5', '85', '7', '104404', '111185', '16'), +('5', '85', '9', '67098', '204013', '16'), +('5', '85', '9', '56031', '128658', '16'), +('5', '85', '9', '56033', '128410', '16'), +('5', '85', '9', '62992', '128369', '16'), +('5', '85', '15', '111348', '210067', '16'), +('5', '85', '15', '111343', '209759', '16'), +('5', '85', '15', '111341', '209646', '16'), +('5', '85', '15', '111345', '208113', '16'), +('5', '85', '20', '111354', '234408', '16'), +('5', '85', '20', '111355', '232437', '16'), +('5', '85', '20', '111353', '231723', '16'), +('5', '85', '20', '111351', '231219', '16'), +('5', '85', '12', '81795', '129622', '16'), +('5', '85', '12', '56073', '129567', '16'), +('5', '85', '12', '89366', '123199', '16'), +('5', '85', '12', '104401', '109797', '16'), +('5', '85', '18', '56041', '135529', '16'), +('5', '85', '18', '62986', '135428', '16'), +('5', '85', '18', '62987', '134266', '16'), +('5', '85', '18', '94054', '133963', '16'), +('5', '85', '19', '62990', '133774', '16'), +('5', '85', '19', '56037', '133010', '16'), +('5', '85', '19', '56075', '132137', '16'), +('5', '85', '19', '81763', '131712', '16'), +('5', '85', '13', '111526', '419365', '16'), +('5', '85', '13', '111514', '402918', '16'), +('5', '85', '13', '111520', '398975', '16'), +('5', '85', '13', '111525', '397467', '16'), +('5', '85', '14', '111536', '215732', '16'), +('5', '85', '14', '111535', '214391', '16'), +('5', '85', '14', '111538', '214109', '16'), +('5', '85', '14', '111236', '189832', '16'), +('5', '85', '11', '111529', '259389', '16'), +('5', '85', '11', '111229', '240244', '16'), +('5', '85', '11', '111338', '210040', '16'), +('5', '85', '11', '111336', '209845', '16'), +('5', '85', '22', '39342', '0', '15'), +('5', '85', '22', '12425', '0', '15'), +('5', '85', '22', '7867', '0', '15'), +('5', '85', '22', '23597', '0', '15'), +('5', '85', '1', '107054', '154037', '15'), +('5', '85', '1', '107019', '153121', '15'), +('5', '85', '1', '107053', '152449', '15'), +('5', '85', '1', '107001', '151693', '15'), +('5', '85', '2', '94056', '132504', '15'), +('5', '85', '2', '62985', '131801', '15'), +('5', '85', '2', '89368', '125999', '15'), +('5', '85', '2', '104403', '111559', '15'), +('5', '85', '3', '107020', '157272', '15'), +('5', '85', '3', '107055', '155417', '15'), +('5', '85', '3', '107002', '155151', '15'), +('5', '85', '3', '106849', '146973', '15'), +('5', '85', '5', '107021', '154938', '15'), +('5', '85', '5', '107056', '153747', '15'), +('5', '85', '5', '107003', '153055', '15'), +('5', '85', '5', '106811', '144387', '15'), +('5', '85', '8', '107023', '160146', '15'), +('5', '85', '8', '107058', '157676', '15'), +('5', '85', '8', '107005', '156470', '15'), +('5', '85', '8', '94070', '155680', '15'), +('5', '85', '6', '106812', '169112', '15'), +('5', '85', '6', '106843', '166855', '15'), +('5', '85', '6', '107022', '157493', '15'), +('5', '85', '6', '107004', '156009', '15'), +('5', '85', '17', '56046', '138978', '15'), +('5', '85', '17', '81765', '138328', '15'), +('5', '85', '17', '56083', '138169', '15'), +('5', '85', '17', '104406', '118634', '15'), +('5', '85', '7', '94053', '133294', '15'), +('5', '85', '7', '56079', '132459', '15'), +('5', '85', '7', '89369', '127273', '15'), +('5', '85', '7', '104404', '111185', '15'), +('5', '85', '9', '67098', '204013', '15'), +('5', '85', '9', '56031', '128658', '15'), +('5', '85', '9', '56033', '128410', '15'), +('5', '85', '9', '62992', '128369', '15'), +('5', '85', '15', '107025', '156816', '15'), +('5', '85', '15', '107062', '154380', '15'), +('5', '85', '15', '107007', '153935', '15'), +('5', '85', '15', '107051', '152625', '15'), +('5', '85', '20', '107026', '180930', '15'), +('5', '85', '20', '107059', '180156', '15'), +('5', '85', '20', '107008', '178558', '15'), +('5', '85', '20', '106816', '170247', '15'), +('5', '85', '12', '81795', '129622', '15'), +('5', '85', '12', '56073', '129567', '15'), +('5', '85', '12', '89366', '123199', '15'), +('5', '85', '12', '104401', '109797', '15'), +('5', '85', '18', '56041', '135529', '15'), +('5', '85', '18', '62986', '135428', '15'), +('5', '85', '18', '62987', '134266', '15'), +('5', '85', '18', '94054', '133963', '15'), +('5', '85', '19', '62990', '133774', '15'), +('5', '85', '19', '56037', '133010', '15'), +('5', '85', '19', '56075', '132137', '15'), +('5', '85', '19', '81763', '131712', '15'), +('5', '85', '13', '106857', '299525', '15'), +('5', '85', '13', '106866', '299164', '15'), +('5', '85', '13', '106862', '298634', '15'), +('5', '85', '13', '106865', '295094', '15'), +('5', '85', '14', '107064', '159136', '15'), +('5', '85', '14', '107065', '158931', '15'), +('5', '85', '14', '106851', '150360', '15'), +('5', '85', '14', '106852', '148458', '15'), +('5', '85', '11', '62939', '178977', '15'), +('5', '85', '11', '106769', '178270', '15'), +('5', '85', '11', '107024', '158932', '15'), +('5', '85', '11', '102667', '158741', '15'), +('5', '86', '22', '39342', '0', '16'), +('5', '86', '22', '12425', '0', '16'), +('5', '86', '22', '7867', '0', '16'), +('5', '86', '22', '23597', '0', '16'), +('5', '86', '1', '111309', '210761', '16'), +('5', '86', '1', '111303', '209733', '16'), +('5', '86', '1', '111300', '208512', '16'), +('5', '86', '1', '111305', '208274', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '86', '2', '94056', '132508', '16'), +('5', '86', '2', '62985', '131805', '16'), +('5', '86', '2', '89368', '126004', '16'), +('5', '86', '2', '104403', '111564', '16'), +('5', '86', '3', '111312', '209876', '16'), +('5', '86', '3', '111315', '208987', '16'), +('5', '86', '3', '111313', '208926', '16'), +('5', '86', '3', '111316', '206894', '16'), +('5', '86', '5', '111318', '208649', '16'), +('5', '86', '5', '111320', '208496', '16'), +('5', '86', '5', '111319', '206476', '16'), +('5', '86', '5', '111017', '182944', '16'), +('5', '86', '8', '111331', '210655', '16'), +('5', '86', '8', '111328', '209955', '16'), +('5', '86', '8', '111332', '206886', '16'), +('5', '86', '8', '111030', '184875', '16'), +('5', '86', '6', '111322', '208973', '16'), +('5', '86', '6', '111324', '208950', '16'), +('5', '86', '6', '111326', '206581', '16'), +('5', '86', '6', '111021', '183243', '16'), +('5', '86', '17', '56046', '138984', '16'), +('5', '86', '17', '81765', '138332', '16'), +('5', '86', '17', '56083', '138173', '16'), +('5', '86', '17', '104406', '118640', '16'), +('5', '86', '7', '94053', '133299', '16'), +('5', '86', '7', '56079', '132465', '16'), +('5', '86', '7', '89369', '127279', '16'), +('5', '86', '7', '104404', '111188', '16'), +('5', '86', '9', '67098', '206417', '16'), +('5', '86', '9', '56031', '128663', '16'), +('5', '86', '9', '56033', '128412', '16'), +('5', '86', '9', '62992', '128375', '16'), +('5', '86', '15', '111348', '210072', '16'), +('5', '86', '15', '111343', '209762', '16'), +('5', '86', '15', '111341', '209654', '16'), +('5', '86', '15', '111345', '208118', '16'), +('5', '86', '20', '111354', '234414', '16'), +('5', '86', '20', '111355', '232441', '16'), +('5', '86', '20', '111353', '231729', '16'), +('5', '86', '20', '111351', '231224', '16'), +('5', '86', '12', '81795', '129628', '16'), +('5', '86', '12', '56073', '129574', '16'), +('5', '86', '12', '89366', '123204', '16'), +('5', '86', '12', '104401', '109802', '16'), +('5', '86', '18', '56041', '135533', '16'), +('5', '86', '18', '62986', '135434', '16'), +('5', '86', '18', '62987', '134270', '16'), +('5', '86', '18', '94054', '133968', '16'), +('5', '86', '19', '62990', '133780', '16'), +('5', '86', '19', '56037', '133014', '16'), +('5', '86', '19', '56075', '132141', '16'), +('5', '86', '19', '81763', '131718', '16'), +('5', '86', '13', '111526', '419908', '16'), +('5', '86', '13', '111514', '403432', '16'), +('5', '86', '13', '111520', '399489', '16'), +('5', '86', '13', '111525', '397981', '16'), +('5', '86', '14', '111536', '215737', '16'), +('5', '86', '14', '111535', '214396', '16'), +('5', '86', '14', '111538', '214113', '16'), +('5', '86', '14', '111236', '189837', '16'), +('5', '86', '11', '111529', '259469', '16'), +('5', '86', '11', '111229', '240315', '16'), +('5', '86', '11', '111338', '210046', '16'), +('5', '86', '11', '111336', '209851', '16'), +('5', '87', '22', '39342', '0', '16'), +('5', '87', '22', '12425', '0', '16'), +('5', '87', '22', '7867', '0', '16'), +('5', '87', '22', '23597', '0', '16'), +('5', '87', '1', '111309', '210767', '16'), +('5', '87', '1', '111303', '209739', '16'), +('5', '87', '1', '111300', '208516', '16'), +('5', '87', '1', '111305', '208279', '16'), +('5', '87', '2', '94056', '132512', '16'), +('5', '87', '2', '62985', '131808', '16'), +('5', '87', '2', '89368', '126009', '16'), +('5', '87', '2', '104403', '111570', '16'), +('5', '87', '3', '111312', '209881', '16'), +('5', '87', '3', '111315', '208994', '16'), +('5', '87', '3', '111313', '208931', '16'), +('5', '87', '3', '111316', '206899', '16'), +('5', '87', '5', '111318', '208654', '16'), +('5', '87', '5', '111320', '208502', '16'), +('5', '87', '5', '111319', '206483', '16'), +('5', '87', '5', '111017', '182949', '16'), +('5', '87', '8', '111331', '210661', '16'), +('5', '87', '8', '111328', '209962', '16'), +('5', '87', '8', '111332', '206890', '16'), +('5', '87', '8', '111030', '184881', '16'), +('5', '87', '6', '111322', '208977', '16'), +('5', '87', '6', '111324', '208956', '16'), +('5', '87', '6', '111326', '206587', '16'), +('5', '87', '6', '111021', '183247', '16'), +('5', '87', '17', '56046', '138990', '16'), +('5', '87', '17', '81765', '138337', '16'), +('5', '87', '17', '56083', '138177', '16'), +('5', '87', '17', '104406', '118646', '16'), +('5', '87', '7', '94053', '133305', '16'), +('5', '87', '7', '56079', '132471', '16'), +('5', '87', '7', '89369', '127284', '16'), +('5', '87', '7', '104404', '111192', '16'), +('5', '87', '9', '67098', '208822', '16'), +('5', '87', '9', '56031', '128668', '16'), +('5', '87', '9', '56033', '128415', '16'), +('5', '87', '9', '62992', '128381', '16'), +('5', '87', '15', '111348', '210078', '16'), +('5', '87', '15', '111343', '209767', '16'), +('5', '87', '15', '111341', '209662', '16'), +('5', '87', '15', '111345', '208123', '16'), +('5', '87', '20', '111354', '234419', '16'), +('5', '87', '20', '111355', '232444', '16'), +('5', '87', '20', '111353', '231735', '16'), +('5', '87', '20', '111351', '231228', '16'), +('5', '87', '12', '81795', '129634', '16'), +('5', '87', '12', '56073', '129581', '16'), +('5', '87', '12', '89366', '123208', '16'), +('5', '87', '12', '104401', '109808', '16'), +('5', '87', '18', '56041', '135537', '16'), +('5', '87', '18', '62986', '135441', '16'), +('5', '87', '18', '62987', '134275', '16'), +('5', '87', '18', '94054', '133973', '16'), +('5', '87', '19', '62990', '133785', '16'), +('5', '87', '19', '56037', '133018', '16'), +('5', '87', '19', '56075', '132146', '16'), +('5', '87', '19', '81763', '131724', '16'), +('5', '87', '13', '111526', '420450', '16'), +('5', '87', '13', '111514', '403946', '16'), +('5', '87', '13', '111520', '400003', '16'), +('5', '87', '13', '111525', '398496', '16'), +('5', '87', '14', '111536', '215743', '16'), +('5', '87', '14', '111535', '214402', '16'), +('5', '87', '14', '111538', '214118', '16'), +('5', '87', '14', '111236', '189843', '16'), +('5', '87', '11', '111529', '259550', '16'), +('5', '87', '11', '111229', '240395', '16'), +('5', '87', '11', '111338', '210052', '16'), +('5', '87', '11', '111336', '209857', '16'), +('5', '88', '22', '39342', '0', '16'), +('5', '88', '22', '12425', '0', '16'), +('5', '88', '22', '7867', '0', '16'), +('5', '88', '22', '23597', '0', '16'), +('5', '88', '1', '111309', '210772', '16'), +('5', '88', '1', '111303', '209744', '16'), +('5', '88', '1', '111300', '208521', '16'), +('5', '88', '1', '111305', '208283', '16'), +('5', '88', '2', '94056', '132516', '16'), +('5', '88', '2', '62985', '131811', '16'), +('5', '88', '2', '89368', '126015', '16'), +('5', '88', '2', '104403', '111576', '16'), +('5', '88', '3', '111312', '209886', '16'), +('5', '88', '3', '111315', '209001', '16'), +('5', '88', '3', '111313', '208935', '16'), +('5', '88', '3', '111316', '206905', '16'), +('5', '88', '5', '111318', '208659', '16'), +('5', '88', '5', '111320', '208507', '16'), +('5', '88', '5', '111319', '206489', '16'), +('5', '88', '5', '111017', '182954', '16'), +('5', '88', '8', '111331', '210666', '16'), +('5', '88', '8', '111328', '209968', '16'), +('5', '88', '8', '111332', '206895', '16'), +('5', '88', '8', '111030', '184886', '16'), +('5', '88', '6', '111322', '208982', '16'), +('5', '88', '6', '111324', '208962', '16'), +('5', '88', '6', '111326', '206592', '16'), +('5', '88', '6', '111021', '183252', '16'), +('5', '88', '17', '56046', '138997', '16'), +('5', '88', '17', '81765', '138341', '16'), +('5', '88', '17', '56083', '138181', '16'), +('5', '88', '17', '104406', '118652', '16'), +('5', '88', '7', '94053', '133310', '16'), +('5', '88', '7', '56079', '132477', '16'), +('5', '88', '7', '89369', '127289', '16'), +('5', '88', '7', '104404', '111196', '16'), +('5', '88', '9', '67098', '211227', '16'), +('5', '88', '9', '56031', '128674', '16'), +('5', '88', '9', '56033', '128417', '16'), +('5', '88', '9', '62992', '128387', '16'), +('5', '88', '15', '111348', '210084', '16'), +('5', '88', '15', '111343', '209771', '16'), +('5', '88', '15', '111341', '209669', '16'), +('5', '88', '15', '111345', '208128', '16'), +('5', '88', '20', '111354', '234424', '16'), +('5', '88', '20', '111355', '232448', '16'), +('5', '88', '20', '111353', '231742', '16'), +('5', '88', '20', '111351', '231233', '16'), +('5', '88', '12', '81795', '129639', '16'), +('5', '88', '12', '56073', '129588', '16'), +('5', '88', '12', '89366', '123213', '16'), +('5', '88', '12', '104401', '109813', '16'), +('5', '88', '18', '56041', '135541', '16'), +('5', '88', '18', '62986', '135448', '16'), +('5', '88', '18', '62987', '134279', '16'), +('5', '88', '18', '94054', '133979', '16'), +('5', '88', '19', '62990', '133791', '16'), +('5', '88', '19', '56037', '133022', '16'), +('5', '88', '19', '56075', '132151', '16'), +('5', '88', '19', '81763', '131730', '16'), +('5', '88', '13', '111526', '420993', '16'), +('5', '88', '13', '111514', '404461', '16'), +('5', '88', '13', '111520', '400517', '16'), +('5', '88', '13', '111525', '398982', '16'), +('5', '88', '14', '111536', '215748', '16'), +('5', '88', '14', '111535', '214407', '16'), +('5', '88', '14', '111538', '214123', '16'), +('5', '88', '14', '111236', '189848', '16'), +('5', '88', '11', '111529', '259630', '16'), +('5', '88', '11', '111229', '240467', '16'), +('5', '88', '11', '111338', '210058', '16'), +('5', '88', '11', '111336', '209862', '16'), +('5', '89', '22', '39342', '0', '16'), +('5', '89', '22', '12425', '0', '16'), +('5', '89', '22', '7867', '0', '16'), +('5', '89', '22', '23597', '0', '16'), +('5', '89', '1', '111309', '210777', '16'), +('5', '89', '1', '111303', '209750', '16'), +('5', '89', '1', '111300', '208526', '16'), +('5', '89', '1', '111305', '208288', '16'), +('5', '89', '2', '94056', '132520', '16'), +('5', '89', '2', '62985', '131814', '16'), +('5', '89', '2', '89368', '126019', '16'), +('5', '89', '2', '104403', '111581', '16'), +('5', '89', '3', '111312', '209891', '16'), +('5', '89', '3', '111315', '209008', '16'), +('5', '89', '3', '111313', '208939', '16'), +('5', '89', '3', '111316', '206910', '16'), +('5', '89', '5', '111318', '208664', '16'), +('5', '89', '5', '111320', '208513', '16'), +('5', '89', '5', '111319', '206496', '16'), +('5', '89', '5', '111017', '182959', '16'), +('5', '89', '8', '111331', '210672', '16'), +('5', '89', '8', '111328', '209975', '16'), +('5', '89', '8', '111332', '206899', '16'), +('5', '89', '8', '111030', '184892', '16'), +('5', '89', '6', '111322', '208987', '16'), +('5', '89', '6', '111324', '208967', '16'), +('5', '89', '6', '111326', '206598', '16'), +('5', '89', '6', '111021', '183257', '16'), +('5', '89', '17', '56046', '139003', '16'), +('5', '89', '17', '81765', '138346', '16'), +('5', '89', '17', '56083', '138184', '16'), +('5', '89', '17', '104406', '118658', '16'), +('5', '89', '7', '94053', '133315', '16'), +('5', '89', '7', '56079', '132482', '16'), +('5', '89', '7', '89369', '127295', '16'), +('5', '89', '7', '104404', '111200', '16'), +('5', '89', '9', '67098', '213631', '16'), +('5', '89', '9', '56031', '128679', '16'), +('5', '89', '9', '56033', '128420', '16'), +('5', '89', '9', '62992', '128393', '16'), +('5', '89', '15', '111348', '210089', '16'), +('5', '89', '15', '111343', '209775', '16'), +('5', '89', '15', '111341', '209677', '16'), +('5', '89', '15', '111345', '208133', '16'), +('5', '89', '20', '111354', '234429', '16'), +('5', '89', '20', '111355', '232452', '16'), +('5', '89', '20', '111353', '231748', '16'), +('5', '89', '20', '111351', '231237', '16'), +('5', '89', '12', '81795', '129645', '16'), +('5', '89', '12', '56073', '129594', '16'), +('5', '89', '12', '89366', '123217', '16'), +('5', '89', '12', '104401', '109819', '16'), +('5', '89', '18', '56041', '135545', '16'), +('5', '89', '18', '62986', '135454', '16'), +('5', '89', '18', '62987', '134283', '16'), +('5', '89', '18', '94054', '133984', '16'), +('5', '89', '19', '62990', '133797', '16'), +('5', '89', '19', '56037', '133026', '16'), +('5', '89', '19', '56075', '132156', '16'), +('5', '89', '19', '81763', '131735', '16'), +('5', '89', '13', '111526', '421535', '16'), +('5', '89', '13', '111514', '404975', '16'), +('5', '89', '13', '111520', '401031', '16'), +('5', '89', '13', '111525', '399497', '16'), +('5', '89', '14', '111536', '215754', '16'), +('5', '89', '14', '111535', '214412', '16'), +('5', '89', '14', '111538', '214128', '16'), +('5', '89', '14', '111236', '189854', '16'), +('5', '89', '11', '111529', '259701', '16'), +('5', '89', '11', '111229', '240537', '16'), +('5', '89', '11', '111338', '210064', '16'), +('5', '89', '11', '111336', '209868', '16'), +('5', '90', '22', '39342', '0', '17'), +('5', '90', '22', '12425', '0', '17'), +('5', '90', '22', '7867', '0', '17'), +('5', '90', '22', '23597', '0', '17'), +('5', '90', '1', '111309', '210783', '17'), +('5', '90', '1', '111303', '209755', '17'), +('5', '90', '1', '111300', '208530', '17'), +('5', '90', '1', '111305', '208293', '17'), +('5', '90', '2', '94056', '132524', '17'), +('5', '90', '2', '62985', '131818', '17'), +('5', '90', '2', '89368', '126025', '17'), +('5', '90', '2', '104403', '111587', '17'), +('5', '90', '3', '111312', '209896', '17'), +('5', '90', '3', '111315', '209015', '17'), +('5', '90', '3', '111313', '208944', '17'), +('5', '90', '3', '111316', '206915', '17'), +('5', '90', '5', '111318', '208669', '17'), +('5', '90', '5', '111320', '208518', '17'), +('5', '90', '5', '111319', '206503', '17'), +('5', '90', '5', '111017', '182964', '17'), +('5', '90', '8', '111331', '210678', '17'), +('5', '90', '8', '111328', '209982', '17'), +('5', '90', '8', '111332', '206904', '17'), +('5', '90', '8', '111030', '184898', '17'), +('5', '90', '6', '111322', '208992', '17'), +('5', '90', '6', '111324', '208973', '17'), +('5', '90', '6', '111326', '206604', '17'), +('5', '90', '6', '111021', '183262', '17'), +('5', '90', '17', '56046', '139009', '17'), +('5', '90', '17', '81765', '138350', '17'), +('5', '90', '17', '56083', '138188', '17'), +('5', '90', '17', '104406', '118664', '17'), +('5', '90', '7', '94053', '133320', '17'), +('5', '90', '7', '56079', '132488', '17'), +('5', '90', '7', '89369', '127300', '17'), +('5', '90', '7', '104404', '111204', '17'), +('5', '90', '9', '67098', '216036', '17'), +('5', '90', '9', '56031', '128684', '17'), +('5', '90', '9', '56033', '128422', '17'), +('5', '90', '9', '62992', '128399', '17'), +('5', '90', '15', '111348', '210095', '17'), +('5', '90', '15', '111343', '209779', '17'), +('5', '90', '15', '111341', '209685', '17'), +('5', '90', '15', '111345', '208138', '17'), +('5', '90', '20', '111354', '234435', '17'), +('5', '90', '20', '111355', '232455', '17'), +('5', '90', '20', '111353', '231754', '17'), +('5', '90', '20', '111351', '231241', '17'), +('5', '90', '12', '81795', '129651', '17'), +('5', '90', '12', '56073', '129601', '17'), +('5', '90', '12', '89366', '123222', '17'), +('5', '90', '12', '104401', '109824', '17'), +('5', '90', '18', '56041', '135549', '17'), +('5', '90', '18', '62986', '135461', '17'), +('5', '90', '18', '62987', '134287', '17'), +('5', '90', '18', '94054', '133989', '17'), +('5', '90', '19', '62990', '133803', '17'), +('5', '90', '19', '56037', '133031', '17'), +('5', '90', '19', '56075', '132161', '17'), +('5', '90', '19', '81763', '131741', '17'), +('5', '90', '13', '111526', '422078', '17'), +('5', '90', '13', '111514', '405518', '17'), +('5', '90', '13', '111520', '401545', '17'), +('5', '90', '13', '111525', '400011', '17'), +('5', '90', '14', '111536', '215759', '17'), +('5', '90', '14', '111535', '214418', '17'), +('5', '90', '14', '111538', '214133', '17'), +('5', '90', '14', '111236', '189859', '17'), +('5', '90', '11', '111529', '259781', '17'), +('5', '90', '11', '111229', '240618', '17'), +('5', '90', '11', '111338', '210070', '17'), +('5', '90', '11', '111336', '209873', '17'), +('5', '91', '22', '39342', '0', '17'), +('5', '91', '22', '12425', '0', '17'), +('5', '91', '22', '7867', '0', '17'), +('5', '91', '22', '23597', '0', '17'), +('5', '91', '1', '111309', '210788', '17'), +('5', '91', '1', '111303', '209761', '17'), +('5', '91', '1', '111300', '208535', '17'), +('5', '91', '1', '111305', '208297', '17'), +('5', '91', '2', '94056', '132528', '17'), +('5', '91', '2', '62985', '131821', '17'), +('5', '91', '2', '89368', '126030', '17'), +('5', '91', '2', '104403', '111593', '17'), +('5', '91', '3', '111312', '209902', '17'), +('5', '91', '3', '111315', '209022', '17'), +('5', '91', '3', '111313', '208948', '17'), +('5', '91', '3', '111316', '206921', '17'), +('5', '91', '5', '111318', '208674', '17'), +('5', '91', '5', '111320', '208524', '17'), +('5', '91', '5', '111319', '206509', '17'), +('5', '91', '5', '111017', '182969', '17'), +('5', '91', '8', '111331', '210683', '17'), +('5', '91', '8', '111328', '209988', '17'), +('5', '91', '8', '111332', '206909', '17'), +('5', '91', '8', '111030', '184903', '17'), +('5', '91', '6', '111322', '208996', '17'), +('5', '91', '6', '111324', '208979', '17'), +('5', '91', '6', '111326', '206609', '17'), +('5', '91', '6', '111021', '183266', '17'), +('5', '91', '17', '56046', '139015', '17'), +('5', '91', '17', '81765', '138355', '17'), +('5', '91', '17', '56083', '138192', '17'), +('5', '91', '17', '104406', '118671', '17'), +('5', '91', '7', '94053', '133326', '17'), +('5', '91', '7', '56079', '132494', '17'), +('5', '91', '7', '89369', '127306', '17'), +('5', '91', '7', '104404', '111208', '17'), +('5', '91', '9', '67098', '216041', '17'), +('5', '91', '9', '56031', '128689', '17'), +('5', '91', '9', '56033', '128425', '17'), +('5', '91', '9', '62992', '128405', '17'), +('5', '91', '15', '111348', '210100', '17'), +('5', '91', '15', '111343', '209783', '17'), +('5', '91', '15', '111341', '209693', '17'), +('5', '91', '15', '111345', '208143', '17'), +('5', '91', '20', '111354', '234440', '17'), +('5', '91', '20', '111355', '232459', '17'), +('5', '91', '20', '111353', '231761', '17'), +('5', '91', '20', '111351', '231246', '17'), +('5', '91', '12', '81795', '129656', '17'), +('5', '91', '12', '56073', '129608', '17'), +('5', '91', '12', '89366', '123226', '17'), +('5', '91', '12', '104401', '109830', '17'), +('5', '91', '18', '56041', '135554', '17'), +('5', '91', '18', '62986', '135468', '17'), +('5', '91', '18', '62987', '134291', '17'), +('5', '91', '18', '94054', '133994', '17'), +('5', '91', '19', '62990', '133808', '17'), +('5', '91', '19', '56037', '133035', '17'), +('5', '91', '19', '56075', '132166', '17'), +('5', '91', '19', '81763', '131747', '17'), +('5', '91', '13', '111526', '422620', '17'), +('5', '91', '13', '111514', '406032', '17'), +('5', '91', '13', '111520', '402059', '17'), +('5', '91', '13', '111525', '400526', '17'), +('5', '91', '14', '111536', '215765', '17'), +('5', '91', '14', '111535', '214423', '17'), +('5', '91', '14', '111538', '214138', '17'), +('5', '91', '14', '111236', '189865', '17'), +('5', '91', '11', '111529', '259861', '17'), +('5', '91', '11', '111229', '240689', '17'), +('5', '91', '11', '111338', '210076', '17'), +('5', '91', '11', '111336', '209879', '17'), +('5', '92', '22', '39342', '0', '17'), +('5', '92', '22', '12425', '0', '17'), +('5', '92', '22', '7867', '0', '17'), +('5', '92', '22', '23597', '0', '17'), +('5', '92', '1', '111309', '210793', '17'), +('5', '92', '1', '111303', '209766', '17'), +('5', '92', '1', '111300', '208540', '17'), +('5', '92', '1', '111305', '208302', '17'), +('5', '92', '2', '94056', '132533', '17'), +('5', '92', '2', '62985', '131824', '17'), +('5', '92', '2', '89368', '126035', '17'), +('5', '92', '2', '104403', '111599', '17'), +('5', '92', '3', '111312', '209907', '17'), +('5', '92', '3', '111315', '209030', '17'), +('5', '92', '3', '111313', '208953', '17'), +('5', '92', '3', '111316', '206926', '17'), +('5', '92', '5', '111318', '208679', '17'), +('5', '92', '5', '111320', '208529', '17'), +('5', '92', '5', '111319', '206516', '17'), +('5', '92', '5', '111017', '182974', '17'), +('5', '92', '8', '111331', '210689', '17'), +('5', '92', '8', '111328', '209995', '17'), +('5', '92', '8', '111332', '206913', '17'), +('5', '92', '8', '111030', '184909', '17'), +('5', '92', '6', '111322', '209001', '17'), +('5', '92', '6', '111324', '208985', '17'), +('5', '92', '6', '111326', '206615', '17'), +('5', '92', '6', '111021', '183271', '17'), +('5', '92', '17', '56046', '139022', '17'), +('5', '92', '17', '81765', '138360', '17'), +('5', '92', '17', '56083', '138196', '17'), +('5', '92', '17', '104406', '118677', '17'), +('5', '92', '7', '94053', '133331', '17'), +('5', '92', '7', '56079', '132500', '17'), +('5', '92', '7', '89369', '127311', '17'), +('5', '92', '7', '104404', '111212', '17'), +('5', '92', '9', '67098', '216046', '17'), +('5', '92', '9', '56031', '128695', '17'), +('5', '92', '9', '56033', '128427', '17'), +('5', '92', '9', '62992', '128411', '17'), +('5', '92', '15', '111348', '210106', '17'), +('5', '92', '15', '111343', '209787', '17'), +('5', '92', '15', '111341', '209700', '17'), +('5', '92', '15', '111345', '208148', '17'), +('5', '92', '20', '111354', '234445', '17'), +('5', '92', '20', '111355', '232463', '17'), +('5', '92', '20', '111353', '231767', '17'), +('5', '92', '20', '111351', '231250', '17'), +('5', '92', '12', '81795', '129662', '17'), +('5', '92', '12', '56073', '129615', '17'), +('5', '92', '12', '89366', '123231', '17'), +('5', '92', '12', '104401', '109835', '17'), +('5', '92', '18', '56041', '135558', '17'), +('5', '92', '18', '62986', '135474', '17'), +('5', '92', '18', '62987', '134295', '17'), +('5', '92', '18', '94054', '134000', '17'), +('5', '92', '19', '62990', '133814', '17'), +('5', '92', '19', '56037', '133039', '17'), +('5', '92', '19', '56075', '132171', '17'), +('5', '92', '19', '81763', '131753', '17'), +('5', '92', '13', '111526', '423163', '17'), +('5', '92', '13', '111514', '406546', '17'), +('5', '92', '13', '111520', '402573', '17'), +('5', '92', '13', '111525', '401041', '17'), +('5', '92', '14', '111536', '215770', '17'), +('5', '92', '14', '111535', '214429', '17'), +('5', '92', '14', '111538', '214143', '17'), +('5', '92', '14', '111236', '189870', '17'), +('5', '92', '11', '111529', '259932', '17'), +('5', '92', '11', '111229', '240770', '17'), +('5', '92', '11', '111338', '210082', '17'), +('5', '92', '11', '111336', '209885', '17'), +('5', '93', '22', '39342', '0', '17'), +('5', '93', '22', '12425', '0', '17'), +('5', '93', '22', '7867', '0', '17'), +('5', '93', '22', '23597', '0', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '93', '1', '111309', '210799', '17'), +('5', '93', '1', '111303', '209772', '17'), +('5', '93', '1', '111300', '208545', '17'), +('5', '93', '1', '111305', '208307', '17'), +('5', '93', '2', '94056', '132537', '17'), +('5', '93', '2', '62985', '131827', '17'), +('5', '93', '2', '89368', '126040', '17'), +('5', '93', '2', '104403', '111605', '17'), +('5', '93', '3', '111312', '209912', '17'), +('5', '93', '3', '111315', '209037', '17'), +('5', '93', '3', '111313', '208957', '17'), +('5', '93', '3', '111316', '206932', '17'), +('5', '93', '5', '111318', '208684', '17'), +('5', '93', '5', '111320', '208535', '17'), +('5', '93', '5', '111319', '206523', '17'), +('5', '93', '5', '111017', '182979', '17'), +('5', '93', '8', '111331', '210695', '17'), +('5', '93', '8', '111328', '210002', '17'), +('5', '93', '8', '111332', '206918', '17'), +('5', '93', '8', '111030', '184915', '17'), +('5', '93', '6', '111322', '209006', '17'), +('5', '93', '6', '111324', '208991', '17'), +('5', '93', '6', '111326', '206621', '17'), +('5', '93', '6', '111021', '183276', '17'), +('5', '93', '17', '56046', '139028', '17'), +('5', '93', '17', '81765', '138364', '17'), +('5', '93', '17', '56083', '138200', '17'), +('5', '93', '17', '104406', '118683', '17'), +('5', '93', '7', '94053', '133336', '17'), +('5', '93', '7', '56079', '132506', '17'), +('5', '93', '7', '89369', '127316', '17'), +('5', '93', '7', '104404', '111216', '17'), +('5', '93', '9', '67098', '216051', '17'), +('5', '93', '9', '56031', '128700', '17'), +('5', '93', '9', '56033', '128430', '17'), +('5', '93', '9', '62992', '128417', '17'), +('5', '93', '15', '111348', '210112', '17'), +('5', '93', '15', '111343', '209791', '17'), +('5', '93', '15', '111341', '209708', '17'), +('5', '93', '15', '111345', '208153', '17'), +('5', '93', '20', '111354', '234451', '17'), +('5', '93', '20', '111355', '232467', '17'), +('5', '93', '20', '111353', '231773', '17'), +('5', '93', '20', '111351', '231255', '17'), +('5', '93', '12', '81795', '129668', '17'), +('5', '93', '12', '56073', '129622', '17'), +('5', '93', '12', '89366', '123235', '17'), +('5', '93', '12', '104401', '109841', '17'), +('5', '93', '18', '56041', '135562', '17'), +('5', '93', '18', '62986', '135481', '17'), +('5', '93', '18', '62987', '134300', '17'), +('5', '93', '18', '94054', '134005', '17'), +('5', '93', '19', '62990', '133820', '17'), +('5', '93', '19', '56037', '133044', '17'), +('5', '93', '19', '56075', '132176', '17'), +('5', '93', '19', '81763', '131758', '17'), +('5', '93', '13', '111526', '423706', '17'), +('5', '93', '13', '111514', '407061', '17'), +('5', '93', '13', '111520', '403087', '17'), +('5', '93', '13', '111525', '401555', '17'), +('5', '93', '14', '111536', '215776', '17'), +('5', '93', '14', '111535', '214435', '17'), +('5', '93', '14', '111538', '214148', '17'), +('5', '93', '14', '111236', '189876', '17'), +('5', '93', '11', '111529', '260013', '17'), +('5', '93', '11', '111229', '240841', '17'), +('5', '93', '11', '111338', '210088', '17'), +('5', '93', '11', '111336', '209891', '17'), +('5', '94', '22', '39342', '0', '17'), +('5', '94', '22', '12425', '0', '17'), +('5', '94', '22', '7867', '0', '17'), +('5', '94', '22', '23597', '0', '17'), +('5', '94', '1', '111309', '210804', '17'), +('5', '94', '1', '111303', '209777', '17'), +('5', '94', '1', '111300', '208549', '17'), +('5', '94', '1', '111305', '208312', '17'), +('5', '94', '2', '94056', '132541', '17'), +('5', '94', '2', '62985', '131831', '17'), +('5', '94', '2', '89368', '126046', '17'), +('5', '94', '2', '104403', '111610', '17'), +('5', '94', '3', '111312', '209918', '17'), +('5', '94', '3', '111315', '209044', '17'), +('5', '94', '3', '111313', '208962', '17'), +('5', '94', '3', '111316', '206937', '17'), +('5', '94', '5', '111318', '208689', '17'), +('5', '94', '5', '111320', '208540', '17'), +('5', '94', '5', '111319', '206530', '17'), +('5', '94', '5', '111017', '182984', '17'), +('5', '94', '8', '111331', '210701', '17'), +('5', '94', '8', '111328', '210009', '17'), +('5', '94', '8', '111332', '206922', '17'), +('5', '94', '8', '111030', '184921', '17'), +('5', '94', '6', '111322', '209011', '17'), +('5', '94', '6', '111324', '208997', '17'), +('5', '94', '6', '111326', '206627', '17'), +('5', '94', '6', '111021', '183281', '17'), +('5', '94', '17', '56046', '139034', '17'), +('5', '94', '17', '81765', '138369', '17'), +('5', '94', '17', '56083', '138204', '17'), +('5', '94', '17', '104406', '118690', '17'), +('5', '94', '7', '94053', '133342', '17'), +('5', '94', '7', '56079', '132512', '17'), +('5', '94', '7', '89369', '127322', '17'), +('5', '94', '7', '104404', '111220', '17'), +('5', '94', '9', '67098', '216055', '17'), +('5', '94', '9', '56031', '128705', '17'), +('5', '94', '9', '56033', '128432', '17'), +('5', '94', '9', '62992', '128423', '17'), +('5', '94', '15', '111348', '210118', '17'), +('5', '94', '15', '111343', '209795', '17'), +('5', '94', '15', '111341', '209716', '17'), +('5', '94', '15', '111345', '208158', '17'), +('5', '94', '20', '111354', '234456', '17'), +('5', '94', '20', '111355', '232470', '17'), +('5', '94', '20', '111353', '231780', '17'), +('5', '94', '20', '111351', '231259', '17'), +('5', '94', '12', '81795', '129674', '17'), +('5', '94', '12', '56073', '129629', '17'), +('5', '94', '12', '89366', '123240', '17'), +('5', '94', '12', '104401', '109847', '17'), +('5', '94', '18', '56041', '135566', '17'), +('5', '94', '18', '62986', '135488', '17'), +('5', '94', '18', '62987', '134304', '17'), +('5', '94', '18', '94054', '134010', '17'), +('5', '94', '19', '62990', '133826', '17'), +('5', '94', '19', '56037', '133048', '17'), +('5', '94', '19', '56075', '132181', '17'), +('5', '94', '19', '81763', '131764', '17'), +('5', '94', '13', '111526', '424220', '17'), +('5', '94', '13', '111514', '407575', '17'), +('5', '94', '13', '111520', '403601', '17'), +('5', '94', '13', '111525', '402070', '17'), +('5', '94', '14', '111536', '215781', '17'), +('5', '94', '14', '111535', '214440', '17'), +('5', '94', '14', '111538', '214153', '17'), +('5', '94', '14', '111236', '189881', '17'), +('5', '94', '11', '111529', '260093', '17'), +('5', '94', '11', '111229', '240912', '17'), +('5', '94', '11', '111338', '210095', '17'), +('5', '94', '11', '111336', '209897', '17'), +('5', '95', '22', '7867', '0', '18'), +('5', '95', '22', '39342', '0', '18'), +('5', '95', '22', '23597', '0', '18'), +('5', '95', '22', '53550', '0', '18'), +('5', '95', '1', '111309', '210810', '18'), +('5', '95', '1', '111303', '209783', '18'), +('5', '95', '1', '111300', '208554', '18'), +('5', '95', '1', '111305', '208317', '18'), +('5', '95', '2', '94056', '132545', '18'), +('5', '95', '2', '62985', '131834', '18'), +('5', '95', '2', '89368', '126051', '18'), +('5', '95', '2', '104403', '111616', '18'), +('5', '95', '3', '111312', '209923', '18'), +('5', '95', '3', '111315', '209051', '18'), +('5', '95', '3', '111313', '208966', '18'), +('5', '95', '3', '111316', '206942', '18'), +('5', '95', '5', '111318', '208693', '18'), +('5', '95', '5', '111320', '208546', '18'), +('5', '95', '5', '111319', '206536', '18'), +('5', '95', '5', '111017', '182988', '18'), +('5', '95', '8', '111331', '210706', '18'), +('5', '95', '8', '111328', '210015', '18'), +('5', '95', '8', '111332', '206927', '18'), +('5', '95', '8', '111030', '184926', '18'), +('5', '95', '6', '111322', '209016', '18'), +('5', '95', '6', '111324', '209003', '18'), +('5', '95', '6', '111326', '206632', '18'), +('5', '95', '6', '111021', '183286', '18'), +('5', '95', '17', '56046', '139041', '18'), +('5', '95', '17', '81765', '138373', '18'), +('5', '95', '17', '56083', '138208', '18'), +('5', '95', '17', '104406', '118696', '18'), +('5', '95', '7', '94053', '133347', '18'), +('5', '95', '7', '56079', '132517', '18'), +('5', '95', '7', '89369', '127327', '18'), +('5', '95', '7', '104404', '111224', '18'), +('5', '95', '9', '67098', '216060', '18'), +('5', '95', '9', '56031', '128710', '18'), +('5', '95', '9', '56033', '128435', '18'), +('5', '95', '9', '62992', '128429', '18'), +('5', '95', '15', '111348', '210123', '18'), +('5', '95', '15', '111343', '209799', '18'), +('5', '95', '15', '111341', '209724', '18'), +('5', '95', '15', '111345', '208163', '18'), +('5', '95', '20', '111354', '234461', '18'), +('5', '95', '20', '111355', '232474', '18'), +('5', '95', '20', '111353', '231786', '18'), +('5', '95', '20', '111351', '231264', '18'), +('5', '95', '12', '81795', '129680', '18'), +('5', '95', '12', '56073', '129636', '18'), +('5', '95', '12', '89366', '123244', '18'), +('5', '95', '12', '104401', '109852', '18'), +('5', '95', '18', '56041', '135570', '18'), +('5', '95', '18', '62986', '135494', '18'), +('5', '95', '18', '62987', '134308', '18'), +('5', '95', '18', '94054', '134016', '18'), +('5', '95', '19', '62990', '133832', '18'), +('5', '95', '19', '56037', '133052', '18'), +('5', '95', '19', '56075', '132186', '18'), +('5', '95', '19', '81763', '131770', '18'), +('5', '95', '13', '111526', '424762', '18'), +('5', '95', '13', '111514', '408089', '18'), +('5', '95', '13', '111520', '404115', '18'), +('5', '95', '13', '111525', '402585', '18'), +('5', '95', '14', '111536', '215787', '18'), +('5', '95', '14', '111535', '214446', '18'), +('5', '95', '14', '111538', '214158', '18'), +('5', '95', '14', '111236', '189887', '18'), +('5', '95', '11', '111529', '260173', '18'), +('5', '95', '11', '111229', '240993', '18'), +('5', '95', '11', '111338', '210101', '18'), +('5', '95', '11', '111336', '209902', '18'), +('5', '96', '22', '7867', '0', '18'), +('5', '96', '22', '39342', '0', '18'), +('5', '96', '22', '23597', '0', '18'), +('5', '96', '22', '53550', '0', '18'), +('5', '96', '1', '111309', '210815', '18'), +('5', '96', '1', '111303', '209789', '18'), +('5', '96', '1', '111300', '208559', '18'), +('5', '96', '1', '111305', '208321', '18'), +('5', '96', '2', '94056', '132549', '18'), +('5', '96', '2', '62985', '131837', '18'), +('5', '96', '2', '89368', '126056', '18'), +('5', '96', '2', '104403', '111622', '18'), +('5', '96', '3', '111312', '209928', '18'), +('5', '96', '3', '111315', '209058', '18'), +('5', '96', '3', '111313', '208971', '18'), +('5', '96', '3', '111316', '206948', '18'), +('5', '96', '5', '111318', '208698', '18'), +('5', '96', '5', '111320', '208551', '18'), +('5', '96', '5', '111319', '206543', '18'), +('5', '96', '5', '111017', '182993', '18'), +('5', '96', '8', '111331', '210712', '18'), +('5', '96', '8', '111328', '210022', '18'), +('5', '96', '8', '111332', '206932', '18'), +('5', '96', '8', '111030', '184932', '18'), +('5', '96', '6', '111322', '209020', '18'), +('5', '96', '6', '111324', '209009', '18'), +('5', '96', '6', '111326', '206638', '18'), +('5', '96', '6', '111021', '183290', '18'), +('5', '96', '17', '56046', '139047', '18'), +('5', '96', '17', '81765', '138378', '18'), +('5', '96', '17', '56083', '138212', '18'), +('5', '96', '17', '104406', '118702', '18'), +('5', '96', '7', '94053', '133353', '18'), +('5', '96', '7', '56079', '132523', '18'), +('5', '96', '7', '89369', '127333', '18'), +('5', '96', '7', '104404', '111228', '18'), +('5', '96', '9', '67098', '216065', '18'), +('5', '96', '9', '56031', '128716', '18'), +('5', '96', '9', '56033', '128438', '18'), +('5', '96', '9', '62992', '128435', '18'), +('5', '96', '15', '111348', '210129', '18'), +('5', '96', '15', '111343', '209804', '18'), +('5', '96', '15', '111341', '209732', '18'), +('5', '96', '15', '111345', '208168', '18'), +('5', '96', '20', '111354', '234467', '18'), +('5', '96', '20', '111355', '232478', '18'), +('5', '96', '20', '111353', '231792', '18'), +('5', '96', '20', '111351', '231268', '18'), +('5', '96', '12', '81795', '129686', '18'), +('5', '96', '12', '56073', '129643', '18'), +('5', '96', '12', '89366', '123249', '18'), +('5', '96', '12', '104401', '109858', '18'), +('5', '96', '18', '56041', '135574', '18'), +('5', '96', '18', '62986', '135501', '18'), +('5', '96', '18', '62987', '134312', '18'), +('5', '96', '18', '94054', '134021', '18'), +('5', '96', '19', '62990', '133837', '18'), +('5', '96', '19', '56037', '133057', '18'), +('5', '96', '19', '56075', '132191', '18'), +('5', '96', '19', '81763', '131776', '18'), +('5', '96', '13', '111526', '425305', '18'), +('5', '96', '13', '111514', '408632', '18'), +('5', '96', '13', '111520', '404629', '18'), +('5', '96', '13', '111525', '403099', '18'), +('5', '96', '14', '111536', '215792', '18'), +('5', '96', '14', '111535', '214451', '18'), +('5', '96', '14', '111538', '214163', '18'), +('5', '96', '14', '111236', '189892', '18'), +('5', '96', '11', '111529', '260244', '18'), +('5', '96', '11', '111229', '241064', '18'), +('5', '96', '11', '111338', '210107', '18'), +('5', '96', '11', '111336', '209908', '18'), +('5', '97', '22', '7867', '0', '18'), +('5', '97', '22', '39342', '0', '18'), +('5', '97', '22', '23597', '0', '18'), +('5', '97', '22', '53550', '0', '18'), +('5', '97', '1', '111309', '210820', '18'), +('5', '97', '1', '111303', '209794', '18'), +('5', '97', '1', '111300', '208563', '18'), +('5', '97', '1', '111305', '208326', '18'), +('5', '97', '2', '94056', '132554', '18'), +('5', '97', '2', '62985', '131841', '18'), +('5', '97', '2', '89368', '126061', '18'), +('5', '97', '2', '104403', '111628', '18'), +('5', '97', '3', '111312', '209933', '18'), +('5', '97', '3', '111315', '209066', '18'), +('5', '97', '3', '111313', '208975', '18'), +('5', '97', '3', '111316', '206953', '18'), +('5', '97', '5', '111318', '208703', '18'), +('5', '97', '5', '111320', '208557', '18'), +('5', '97', '5', '111319', '206550', '18'), +('5', '97', '5', '111017', '182998', '18'), +('5', '97', '8', '111331', '210718', '18'), +('5', '97', '8', '111328', '210029', '18'), +('5', '97', '8', '111332', '206936', '18'), +('5', '97', '8', '111030', '184938', '18'), +('5', '97', '6', '111322', '209025', '18'), +('5', '97', '6', '111324', '209015', '18'), +('5', '97', '6', '111326', '206644', '18'), +('5', '97', '6', '111021', '183295', '18'), +('5', '97', '17', '56046', '139053', '18'), +('5', '97', '17', '81765', '138383', '18'), +('5', '97', '17', '56083', '138216', '18'), +('5', '97', '17', '104406', '118709', '18'), +('5', '97', '7', '94053', '133358', '18'), +('5', '97', '7', '56079', '132529', '18'), +('5', '97', '7', '89369', '127338', '18'), +('5', '97', '7', '104404', '111232', '18'), +('5', '97', '9', '67098', '216070', '18'), +('5', '97', '9', '56031', '128721', '18'), +('5', '97', '9', '62992', '128441', '18'), +('5', '97', '9', '56033', '128440', '18'), +('5', '97', '15', '111348', '210135', '18'), +('5', '97', '15', '111343', '209808', '18'), +('5', '97', '15', '111341', '209740', '18'), +('5', '97', '15', '111345', '208173', '18'), +('5', '97', '20', '111354', '234472', '18'), +('5', '97', '20', '111355', '232481', '18'), +('5', '97', '20', '111353', '231799', '18'), +('5', '97', '20', '111351', '231273', '18'), +('5', '97', '12', '81795', '129691', '18'), +('5', '97', '12', '56073', '129650', '18'), +('5', '97', '12', '89366', '123253', '18'), +('5', '97', '12', '104401', '109863', '18'), +('5', '97', '18', '56041', '135578', '18'), +('5', '97', '18', '62986', '135508', '18'), +('5', '97', '18', '62987', '134316', '18'), +('5', '97', '18', '94054', '134026', '18'), +('5', '97', '19', '62990', '133843', '18'), +('5', '97', '19', '56037', '133061', '18'), +('5', '97', '19', '56075', '132196', '18'), +('5', '97', '19', '81763', '131782', '18'), +('5', '97', '13', '111526', '425847', '18'), +('5', '97', '13', '111514', '409147', '18'), +('5', '97', '13', '111520', '405144', '18'), +('5', '97', '13', '111525', '403614', '18'), +('5', '97', '14', '111536', '215798', '18'), +('5', '97', '14', '111535', '214457', '18'), +('5', '97', '14', '111538', '214168', '18'), +('5', '97', '14', '111236', '189898', '18'), +('5', '97', '11', '111529', '260325', '18'), +('5', '97', '11', '111229', '241145', '18'), +('5', '97', '11', '111338', '210113', '18'), +('5', '97', '11', '111336', '209914', '18'), +('5', '98', '22', '7867', '0', '18'), +('5', '98', '22', '39342', '0', '18'), +('5', '98', '22', '23597', '0', '18'), +('5', '98', '22', '53550', '0', '18'), +('5', '98', '1', '111309', '210826', '18'), +('5', '98', '1', '111303', '209800', '18'), +('5', '98', '1', '111300', '208568', '18'), +('5', '98', '1', '111305', '208331', '18'), +('5', '98', '2', '94056', '132558', '18'), +('5', '98', '2', '62985', '131844', '18'), +('5', '98', '2', '89368', '126066', '18'), +('5', '98', '2', '104403', '111633', '18'), +('5', '98', '3', '111312', '209939', '18'), +('5', '98', '3', '111315', '209073', '18'), +('5', '98', '3', '111313', '208980', '18'), +('5', '98', '3', '111316', '206959', '18'), +('5', '98', '5', '111318', '208708', '18'), +('5', '98', '5', '111320', '208562', '18'), +('5', '98', '5', '111319', '206557', '18'), +('5', '98', '5', '111017', '183003', '18'), +('5', '98', '8', '111331', '210724', '18'), +('5', '98', '8', '111328', '210036', '18'), +('5', '98', '8', '111332', '206941', '18'), +('5', '98', '8', '111030', '184944', '18'), +('5', '98', '6', '111322', '209030', '18'), +('5', '98', '6', '111324', '209020', '18'), +('5', '98', '6', '111326', '206650', '18'), +('5', '98', '6', '111021', '183300', '18'), +('5', '98', '17', '56046', '139060', '18'), +('5', '98', '17', '81765', '138387', '18'), +('5', '98', '17', '56083', '138220', '18'), +('5', '98', '17', '104406', '118715', '18'), +('5', '98', '7', '94053', '133363', '18'), +('5', '98', '7', '56079', '132535', '18'), +('5', '98', '7', '89369', '127344', '18'), +('5', '98', '7', '104404', '111236', '18'), +('5', '98', '9', '67098', '216074', '18'), +('5', '98', '9', '56031', '128726', '18'), +('5', '98', '9', '62992', '128448', '18'), +('5', '98', '9', '56033', '128443', '18'), +('5', '98', '15', '111348', '210141', '18'), +('5', '98', '15', '111343', '209812', '18'), +('5', '98', '15', '111341', '209748', '18'), +('5', '98', '15', '111345', '208178', '18'), +('5', '98', '20', '111354', '234477', '18'), +('5', '98', '20', '111355', '232485', '18'), +('5', '98', '20', '111353', '231805', '18'), +('5', '98', '20', '111351', '231277', '18'), +('5', '98', '12', '81795', '129697', '18'), +('5', '98', '12', '56073', '129657', '18'), +('5', '98', '12', '89366', '123258', '18'), +('5', '98', '12', '104401', '109869', '18'), +('5', '98', '18', '56041', '135582', '18'), +('5', '98', '18', '62986', '135515', '18'), +('5', '98', '18', '62987', '134321', '18'), +('5', '98', '18', '94054', '134032', '18'), +('5', '98', '19', '62990', '133849', '18'), +('5', '98', '19', '56037', '133065', '18'), +('5', '98', '19', '56075', '132201', '18'), +('5', '98', '19', '81763', '131788', '18'), +('5', '98', '13', '111526', '426390', '18'), +('5', '98', '13', '111514', '409661', '18'), +('5', '98', '13', '111520', '405658', '18'), +('5', '98', '13', '111525', '404129', '18'), +('5', '98', '14', '111536', '215803', '18'), +('5', '98', '14', '111535', '214463', '18'), +('5', '98', '14', '111538', '214173', '18'), +('5', '98', '14', '111236', '189903', '18'), +('5', '98', '11', '111529', '260405', '18'), +('5', '98', '11', '111229', '241216', '18'), +('5', '98', '11', '111338', '210119', '18'), +('5', '98', '11', '111336', '209920', '18'), +('5', '99', '22', '7867', '0', '18'), +('5', '99', '22', '39342', '0', '18'), +('5', '99', '22', '23597', '0', '18'), +('5', '99', '22', '53550', '0', '18'), +('5', '99', '1', '111309', '210831', '18'), +('5', '99', '1', '111303', '209805', '18'), +('5', '99', '1', '111300', '208573', '18'), +('5', '99', '1', '111305', '208336', '18'), +('5', '99', '2', '94056', '132562', '18'), +('5', '99', '2', '62985', '131847', '18'), +('5', '99', '2', '89368', '126072', '18'), +('5', '99', '2', '104403', '111639', '18'), +('5', '99', '3', '111312', '209944', '18'), +('5', '99', '3', '111315', '209080', '18'), +('5', '99', '3', '111313', '208984', '18'), +('5', '99', '3', '111316', '206964', '18'), +('5', '99', '5', '111318', '208713', '18'), +('5', '99', '5', '111320', '208568', '18'), +('5', '99', '5', '111319', '206564', '18'), +('5', '99', '5', '111017', '183008', '18'), +('5', '99', '8', '111331', '210729', '18'), +('5', '99', '8', '111328', '210043', '18'), +('5', '99', '8', '111332', '206946', '18'), +('5', '99', '8', '111030', '184949', '18'), +('5', '99', '6', '111322', '209035', '18'), +('5', '99', '6', '111324', '209026', '18'), +('5', '99', '6', '111326', '206655', '18'), +('5', '99', '6', '111021', '183305', '18'), +('5', '99', '17', '56046', '139066', '18'), +('5', '99', '17', '81765', '138392', '18'), +('5', '99', '17', '56083', '138224', '18'), +('5', '99', '17', '104406', '118721', '18'), +('5', '99', '7', '94053', '133369', '18'), +('5', '99', '7', '56079', '132541', '18'), +('5', '99', '7', '89369', '127349', '18'), +('5', '99', '7', '104404', '111240', '18'), +('5', '99', '9', '67098', '216079', '18'), +('5', '99', '9', '56031', '128732', '18'), +('5', '99', '9', '62992', '128454', '18'), +('5', '99', '9', '56033', '128445', '18'), +('5', '99', '15', '111348', '210147', '18'), +('5', '99', '15', '111343', '209816', '18'), +('5', '99', '15', '111341', '209755', '18'), +('5', '99', '15', '111345', '208183', '18'), +('5', '99', '20', '111354', '234483', '18'), +('5', '99', '20', '111355', '232489', '18'), +('5', '99', '20', '111353', '231811', '18'), +('5', '99', '20', '111351', '231282', '18'), +('5', '99', '12', '81795', '129703', '18'), +('5', '99', '12', '56073', '129664', '18'), +('5', '99', '12', '89366', '123263', '18'), +('5', '99', '12', '104401', '109875', '18'), +('5', '99', '18', '56041', '135586', '18'), +('5', '99', '18', '62986', '135521', '18'), +('5', '99', '18', '62987', '134325', '18'), +('5', '99', '18', '94054', '134037', '18'), +('5', '99', '19', '62990', '133855', '18'), +('5', '99', '19', '56037', '133070', '18'), +('5', '99', '19', '56075', '132206', '18'), +('5', '99', '19', '81763', '131793', '18'), +('5', '99', '13', '111526', '426933', '18'), +('5', '99', '13', '111514', '410175', '18'), +('5', '99', '13', '111520', '406172', '18'), +('5', '99', '13', '111525', '404643', '18'), +('5', '99', '14', '111536', '215809', '18'), +('5', '99', '14', '111535', '214468', '18'), +('5', '99', '14', '111538', '214178', '18'), +('5', '99', '14', '111236', '189909', '18'), +('5', '99', '11', '111529', '260476', '18'), +('5', '99', '11', '111229', '241287', '18'), +('5', '99', '11', '111338', '210125', '18'), +('5', '99', '11', '111336', '209925', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '100', '22', '7867', '0', '20'), +('5', '100', '22', '39342', '0', '20'), +('5', '100', '22', '23597', '0', '20'), +('5', '100', '22', '53550', '0', '20'), +('5', '100', '1', '98769', '351419', '20'), +('5', '100', '1', '111309', '210837', '20'), +('5', '100', '1', '111303', '209811', '20'), +('5', '100', '1', '111300', '208578', '20'), +('5', '100', '2', '94056', '132566', '20'), +('5', '100', '2', '62985', '131851', '20'), +('5', '100', '2', '89368', '126077', '20'), +('5', '100', '2', '104403', '111645', '20'), +('5', '100', '3', '111312', '209950', '20'), +('5', '100', '3', '111315', '209088', '20'), +('5', '100', '3', '111313', '208989', '20'), +('5', '100', '3', '111316', '206970', '20'), +('5', '100', '5', '111318', '208719', '20'), +('5', '100', '5', '111320', '208574', '20'), +('5', '100', '5', '111319', '206571', '20'), +('5', '100', '5', '111017', '183014', '20'), +('5', '100', '8', '111331', '210736', '20'), +('5', '100', '8', '111328', '210050', '20'), +('5', '100', '8', '111332', '206950', '20'), +('5', '100', '8', '111030', '184956', '20'), +('5', '100', '6', '111322', '209040', '20'), +('5', '100', '6', '111324', '209032', '20'), +('5', '100', '6', '111326', '206661', '20'), +('5', '100', '6', '111021', '183310', '20'), +('5', '100', '17', '56046', '139073', '20'), +('5', '100', '17', '81765', '138397', '20'), +('5', '100', '17', '56083', '138228', '20'), +('5', '100', '17', '104406', '118728', '20'), +('5', '100', '7', '94053', '133374', '20'), +('5', '100', '7', '56079', '132547', '20'), +('5', '100', '7', '89369', '127355', '20'), +('5', '100', '7', '104404', '111244', '20'), +('5', '100', '9', '67098', '216084', '20'), +('5', '100', '9', '56031', '128737', '20'), +('5', '100', '9', '62992', '128460', '20'), +('5', '100', '9', '56033', '128448', '20'), +('5', '100', '15', '111348', '210153', '20'), +('5', '100', '15', '111343', '209820', '20'), +('5', '100', '15', '111341', '209764', '20'), +('5', '100', '15', '111345', '208188', '20'), +('5', '100', '20', '111354', '234488', '20'), +('5', '100', '20', '111355', '232493', '20'), +('5', '100', '20', '111353', '231818', '20'), +('5', '100', '20', '111351', '231287', '20'), +('5', '100', '12', '81795', '129709', '20'), +('5', '100', '12', '56073', '129671', '20'), +('5', '100', '12', '89366', '123267', '20'), +('5', '100', '12', '104401', '109880', '20'), +('5', '100', '18', '56041', '135590', '20'), +('5', '100', '18', '62986', '135528', '20'), +('5', '100', '18', '62987', '134329', '20'), +('5', '100', '18', '94054', '134043', '20'), +('5', '100', '19', '62990', '133861', '20'), +('5', '100', '19', '56037', '133074', '20'), +('5', '100', '19', '56075', '132211', '20'), +('5', '100', '19', '81763', '131799', '20'), +('5', '100', '13', '111526', '428750', '20'), +('5', '100', '13', '111514', '411965', '20'), +('5', '100', '13', '111520', '407961', '20'), +('5', '100', '13', '111525', '406405', '20'), +('5', '100', '14', '111536', '215815', '20'), +('5', '100', '14', '111535', '214474', '20'), +('5', '100', '14', '111538', '214183', '20'), +('5', '100', '14', '111236', '189915', '20'), +('5', '100', '11', '133816', '271321', '20'), +('5', '100', '11', '111529', '260556', '20'), +('5', '100', '11', '111229', '241368', '20'), +('5', '100', '11', '111338', '210132', '20'), +('5', '100', '22', '7867', '0', '19'), +('5', '100', '22', '39342', '0', '19'), +('5', '100', '22', '23597', '0', '19'), +('5', '100', '22', '53550', '0', '19'), +('5', '100', '1', '98769', '351419', '19'), +('5', '100', '1', '111309', '210837', '19'), +('5', '100', '1', '111303', '209811', '19'), +('5', '100', '1', '111300', '208578', '19'), +('5', '100', '2', '94056', '132566', '19'), +('5', '100', '2', '62985', '131851', '19'), +('5', '100', '2', '89368', '126077', '19'), +('5', '100', '2', '104403', '111645', '19'), +('5', '100', '3', '111312', '209950', '19'), +('5', '100', '3', '111315', '209088', '19'), +('5', '100', '3', '111313', '208989', '19'), +('5', '100', '3', '111316', '206970', '19'), +('5', '100', '5', '111318', '208719', '19'), +('5', '100', '5', '111320', '208574', '19'), +('5', '100', '5', '111319', '206571', '19'), +('5', '100', '5', '111017', '183014', '19'), +('5', '100', '8', '111331', '210736', '19'), +('5', '100', '8', '111328', '210050', '19'), +('5', '100', '8', '111332', '206950', '19'), +('5', '100', '8', '111030', '184956', '19'), +('5', '100', '6', '111322', '209040', '19'), +('5', '100', '6', '111324', '209032', '19'), +('5', '100', '6', '111326', '206661', '19'), +('5', '100', '6', '111021', '183310', '19'), +('5', '100', '17', '56046', '139073', '19'), +('5', '100', '17', '81765', '138397', '19'), +('5', '100', '17', '56083', '138228', '19'), +('5', '100', '17', '104406', '118728', '19'), +('5', '100', '7', '94053', '133374', '19'), +('5', '100', '7', '56079', '132547', '19'), +('5', '100', '7', '89369', '127355', '19'), +('5', '100', '7', '104404', '111244', '19'), +('5', '100', '9', '67098', '216084', '19'), +('5', '100', '9', '56031', '128737', '19'), +('5', '100', '9', '62992', '128460', '19'), +('5', '100', '9', '56033', '128448', '19'), +('5', '100', '15', '111348', '210153', '19'), +('5', '100', '15', '111343', '209820', '19'), +('5', '100', '15', '111341', '209764', '19'), +('5', '100', '15', '111345', '208188', '19'), +('5', '100', '20', '111354', '234488', '19'), +('5', '100', '20', '111355', '232493', '19'), +('5', '100', '20', '111353', '231818', '19'), +('5', '100', '20', '111351', '231287', '19'), +('5', '100', '12', '81795', '129709', '19'), +('5', '100', '12', '56073', '129671', '19'), +('5', '100', '12', '89366', '123267', '19'), +('5', '100', '12', '104401', '109880', '19'), +('5', '100', '18', '56041', '135590', '19'), +('5', '100', '18', '62986', '135528', '19'), +('5', '100', '18', '62987', '134329', '19'), +('5', '100', '18', '94054', '134043', '19'), +('5', '100', '19', '62990', '133861', '19'), +('5', '100', '19', '56037', '133074', '19'), +('5', '100', '19', '56075', '132211', '19'), +('5', '100', '19', '81763', '131799', '19'), +('5', '100', '13', '111526', '427475', '19'), +('5', '100', '13', '111514', '410690', '19'), +('5', '100', '13', '111520', '406686', '19'), +('5', '100', '13', '111525', '405130', '19'), +('5', '100', '14', '111536', '215815', '19'), +('5', '100', '14', '111535', '214474', '19'), +('5', '100', '14', '111538', '214183', '19'), +('5', '100', '14', '111236', '189915', '19'), +('5', '100', '11', '133816', '271321', '19'), +('5', '100', '11', '111529', '260556', '19'), +('5', '100', '11', '111229', '241368', '19'), +('5', '100', '11', '111338', '210132', '19'), +('5', '101', '22', '7867', '0', '20'), +('5', '101', '22', '39342', '0', '20'), +('5', '101', '22', '23597', '0', '20'), +('5', '101', '22', '53550', '0', '20'), +('5', '101', '1', '98769', '351423', '20'), +('5', '101', '1', '111309', '210842', '20'), +('5', '101', '1', '111303', '209817', '20'), +('5', '101', '1', '111300', '208583', '20'), +('5', '101', '2', '94056', '132571', '20'), +('5', '101', '2', '62985', '131854', '20'), +('5', '101', '2', '89368', '126082', '20'), +('5', '101', '2', '104403', '111651', '20'), +('5', '101', '3', '111312', '209955', '20'), +('5', '101', '3', '111315', '209095', '20'), +('5', '101', '3', '111313', '208994', '20'), +('5', '101', '3', '111316', '206975', '20'), +('5', '101', '5', '111318', '208724', '20'), +('5', '101', '5', '111320', '208579', '20'), +('5', '101', '5', '111319', '206578', '20'), +('5', '101', '5', '111017', '183019', '20'), +('5', '101', '8', '111331', '210741', '20'), +('5', '101', '8', '111328', '210056', '20'), +('5', '101', '8', '111332', '206955', '20'), +('5', '101', '8', '111030', '184961', '20'), +('5', '101', '6', '111322', '209045', '20'), +('5', '101', '6', '111324', '209038', '20'), +('5', '101', '6', '111326', '206667', '20'), +('5', '101', '6', '111021', '183315', '20'), +('5', '101', '17', '56046', '139079', '20'), +('5', '101', '17', '81765', '138401', '20'), +('5', '101', '17', '56083', '138232', '20'), +('5', '101', '17', '104406', '118734', '20'), +('5', '101', '7', '94053', '133380', '20'), +('5', '101', '7', '56079', '132553', '20'), +('5', '101', '7', '89369', '127360', '20'), +('5', '101', '7', '104404', '111248', '20'), +('5', '101', '9', '67098', '216089', '20'), +('5', '101', '9', '56031', '128742', '20'), +('5', '101', '9', '62992', '128466', '20'), +('5', '101', '9', '56033', '128451', '20'), +('5', '101', '15', '111348', '210158', '20'), +('5', '101', '15', '111343', '209825', '20'), +('5', '101', '15', '111341', '209772', '20'), +('5', '101', '15', '111345', '208193', '20'), +('5', '101', '20', '111354', '234494', '20'), +('5', '101', '20', '111355', '232496', '20'), +('5', '101', '20', '111353', '231824', '20'), +('5', '101', '20', '111351', '231291', '20'), +('5', '101', '12', '81795', '129715', '20'), +('5', '101', '12', '56073', '129678', '20'), +('5', '101', '12', '89366', '123272', '20'), +('5', '101', '12', '104401', '109886', '20'), +('5', '101', '18', '56041', '135594', '20'), +('5', '101', '18', '62986', '135535', '20'), +('5', '101', '18', '62987', '134333', '20'), +('5', '101', '18', '94054', '134048', '20'), +('5', '101', '19', '62990', '133867', '20'), +('5', '101', '19', '56037', '133079', '20'), +('5', '101', '19', '56075', '132216', '20'), +('5', '101', '19', '81763', '131805', '20'), +('5', '101', '13', '111526', '429293', '20'), +('5', '101', '13', '111514', '412479', '20'), +('5', '101', '13', '111520', '408475', '20'), +('5', '101', '13', '111525', '406919', '20'), +('5', '101', '14', '111536', '215820', '20'), +('5', '101', '14', '111535', '214480', '20'), +('5', '101', '14', '111538', '214188', '20'), +('5', '101', '14', '111236', '189920', '20'), +('5', '101', '11', '133816', '271325', '20'), +('5', '101', '11', '111529', '260637', '20'), +('5', '101', '11', '111229', '241440', '20'), +('5', '101', '11', '111338', '210138', '20'), +('5', '102', '22', '7867', '0', '20'), +('5', '102', '22', '39342', '0', '20'), +('5', '102', '22', '23597', '0', '20'), +('5', '102', '22', '53550', '0', '20'), +('5', '102', '1', '98769', '351427', '20'), +('5', '102', '1', '111309', '210848', '20'), +('5', '102', '1', '111303', '209823', '20'), +('5', '102', '1', '111300', '208587', '20'), +('5', '102', '2', '94056', '132575', '20'), +('5', '102', '2', '62985', '131857', '20'), +('5', '102', '2', '89368', '126088', '20'), +('5', '102', '2', '104403', '111657', '20'), +('5', '102', '3', '111312', '209960', '20'), +('5', '102', '3', '111315', '209102', '20'), +('5', '102', '3', '111313', '208998', '20'), +('5', '102', '3', '111316', '206980', '20'), +('5', '102', '5', '111318', '208729', '20'), +('5', '102', '5', '111320', '208585', '20'), +('5', '102', '5', '111319', '206584', '20'), +('5', '102', '5', '111017', '183024', '20'), +('5', '102', '8', '111331', '210747', '20'), +('5', '102', '8', '111328', '210063', '20'), +('5', '102', '8', '111332', '206960', '20'), +('5', '102', '8', '111030', '184967', '20'), +('5', '102', '6', '111322', '209049', '20'), +('5', '102', '6', '111324', '209044', '20'), +('5', '102', '6', '111326', '206673', '20'), +('5', '102', '6', '111021', '183319', '20'), +('5', '102', '17', '56046', '139086', '20'), +('5', '102', '17', '81765', '138406', '20'), +('5', '102', '17', '56083', '138236', '20'), +('5', '102', '17', '104406', '118741', '20'), +('5', '102', '7', '94053', '133385', '20'), +('5', '102', '7', '56079', '132559', '20'), +('5', '102', '7', '89369', '127366', '20'), +('5', '102', '7', '104404', '111252', '20'), +('5', '102', '9', '67098', '216094', '20'), +('5', '102', '9', '56031', '128748', '20'), +('5', '102', '9', '62992', '128472', '20'), +('5', '102', '9', '56033', '128453', '20'), +('5', '102', '15', '111348', '210164', '20'), +('5', '102', '15', '111343', '209829', '20'), +('5', '102', '15', '111341', '209779', '20'), +('5', '102', '15', '111345', '208198', '20'), +('5', '102', '20', '111354', '234499', '20'), +('5', '102', '20', '111355', '232500', '20'), +('5', '102', '20', '111353', '231831', '20'), +('5', '102', '20', '111351', '231296', '20'), +('5', '102', '12', '81795', '129721', '20'), +('5', '102', '12', '56073', '129685', '20'), +('5', '102', '12', '89366', '123277', '20'), +('5', '102', '12', '104401', '109892', '20'), +('5', '102', '18', '56041', '135599', '20'), +('5', '102', '18', '62986', '135542', '20'), +('5', '102', '18', '62987', '134338', '20'), +('5', '102', '18', '94054', '134053', '20'), +('5', '102', '19', '62990', '133873', '20'), +('5', '102', '19', '56037', '133083', '20'), +('5', '102', '19', '56075', '132221', '20'), +('5', '102', '19', '81763', '131811', '20'), +('5', '102', '13', '111526', '429836', '20'), +('5', '102', '13', '111514', '413022', '20'), +('5', '102', '13', '111520', '408989', '20'), +('5', '102', '13', '111525', '407434', '20'), +('5', '102', '14', '111536', '215826', '20'), +('5', '102', '14', '111535', '214485', '20'), +('5', '102', '14', '111538', '214193', '20'), +('5', '102', '14', '111236', '189926', '20'), +('5', '102', '11', '133816', '271329', '20'), +('5', '102', '11', '111529', '260717', '20'), +('5', '102', '11', '111229', '241520', '20'), +('5', '102', '11', '111338', '210144', '20'), +('5', '103', '22', '7867', '0', '20'), +('5', '103', '22', '39342', '0', '20'), +('5', '103', '22', '23597', '0', '20'), +('5', '103', '22', '53550', '0', '20'), +('5', '103', '1', '98769', '351431', '20'), +('5', '103', '1', '111309', '210853', '20'), +('5', '103', '1', '111303', '209828', '20'), +('5', '103', '1', '111300', '208592', '20'), +('5', '103', '2', '94056', '132579', '20'), +('5', '103', '2', '62985', '131861', '20'), +('5', '103', '2', '89368', '126093', '20'), +('5', '103', '2', '104403', '111663', '20'), +('5', '103', '3', '111312', '209966', '20'), +('5', '103', '3', '111315', '209110', '20'), +('5', '103', '3', '111313', '209003', '20'), +('5', '103', '3', '111316', '206986', '20'), +('5', '103', '5', '111318', '208734', '20'), +('5', '103', '5', '111320', '208591', '20'), +('5', '103', '5', '111319', '206591', '20'), +('5', '103', '5', '111017', '183029', '20'), +('5', '103', '8', '111331', '210753', '20'), +('5', '103', '8', '111328', '210070', '20'), +('5', '103', '8', '111332', '206964', '20'), +('5', '103', '8', '111030', '184973', '20'), +('5', '103', '6', '111322', '209054', '20'), +('5', '103', '6', '111324', '209050', '20'), +('5', '103', '6', '111326', '206679', '20'), +('5', '103', '6', '111021', '183324', '20'), +('5', '103', '17', '56046', '139092', '20'), +('5', '103', '17', '81765', '138411', '20'), +('5', '103', '17', '56083', '138240', '20'), +('5', '103', '17', '104406', '118747', '20'), +('5', '103', '7', '94053', '133391', '20'), +('5', '103', '7', '56079', '132565', '20'), +('5', '103', '7', '89369', '127372', '20'), +('5', '103', '7', '104404', '111256', '20'), +('5', '103', '9', '67098', '216099', '20'), +('5', '103', '9', '56031', '128753', '20'), +('5', '103', '9', '62992', '128478', '20'), +('5', '103', '9', '56033', '128456', '20'), +('5', '103', '15', '111348', '210170', '20'), +('5', '103', '15', '111343', '209833', '20'), +('5', '103', '15', '111341', '209788', '20'), +('5', '103', '15', '111345', '208204', '20'), +('5', '103', '20', '111354', '234505', '20'), +('5', '103', '20', '111355', '232504', '20'), +('5', '103', '20', '111353', '231838', '20'), +('5', '103', '20', '111351', '231300', '20'), +('5', '103', '12', '81795', '129727', '20'), +('5', '103', '12', '56073', '129693', '20'), +('5', '103', '12', '89366', '123281', '20'), +('5', '103', '12', '104401', '109897', '20'), +('5', '103', '18', '56041', '135603', '20'), +('5', '103', '18', '62986', '135549', '20'), +('5', '103', '18', '62987', '134342', '20'), +('5', '103', '18', '94054', '134059', '20'), +('5', '103', '19', '62990', '133879', '20'), +('5', '103', '19', '56037', '133088', '20'), +('5', '103', '19', '56075', '132226', '20'), +('5', '103', '19', '81763', '131817', '20'), +('5', '103', '13', '111526', '430378', '20'), +('5', '103', '13', '111514', '413537', '20'), +('5', '103', '13', '111520', '409504', '20'), +('5', '103', '13', '111525', '407949', '20'), +('5', '103', '14', '111536', '215831', '20'), +('5', '103', '14', '111535', '214491', '20'), +('5', '103', '14', '111538', '214198', '20'), +('5', '103', '14', '111236', '189931', '20'), +('5', '103', '11', '133816', '271334', '20'), +('5', '103', '11', '111529', '260788', '20'), +('5', '103', '11', '111229', '241592', '20'), +('5', '103', '11', '111338', '210150', '20'), +('5', '104', '22', '7867', '0', '20'), +('5', '104', '22', '39342', '0', '20'), +('5', '104', '22', '23597', '0', '20'), +('5', '104', '22', '53550', '0', '20'), +('5', '104', '1', '98769', '351435', '20'), +('5', '104', '1', '111309', '210859', '20'), +('5', '104', '1', '111303', '209834', '20'), +('5', '104', '1', '111300', '208597', '20'), +('5', '104', '2', '94056', '132583', '20'), +('5', '104', '2', '62985', '131864', '20'), +('5', '104', '2', '89368', '126098', '20'), +('5', '104', '2', '104403', '111668', '20'), +('5', '104', '3', '111312', '209971', '20'), +('5', '104', '3', '111315', '209117', '20'), +('5', '104', '3', '111313', '209007', '20'), +('5', '104', '3', '111316', '206992', '20'), +('5', '104', '5', '111318', '208739', '20'), +('5', '104', '5', '111320', '208596', '20'), +('5', '104', '5', '111319', '206598', '20'), +('5', '104', '5', '111017', '183034', '20'), +('5', '104', '8', '111331', '210759', '20'), +('5', '104', '8', '111328', '210077', '20'), +('5', '104', '8', '111332', '206969', '20'), +('5', '104', '8', '111030', '184979', '20'), +('5', '104', '6', '111322', '209059', '20'), +('5', '104', '6', '111324', '209056', '20'), +('5', '104', '6', '111326', '206685', '20'), +('5', '104', '6', '111021', '183329', '20'), +('5', '104', '17', '56046', '139099', '20'), +('5', '104', '17', '81765', '138416', '20'), +('5', '104', '17', '56083', '138244', '20'), +('5', '104', '17', '104406', '118754', '20'), +('5', '104', '7', '94053', '133396', '20'), +('5', '104', '7', '56079', '132571', '20'), +('5', '104', '7', '89369', '127377', '20'), +('5', '104', '7', '104404', '111260', '20'), +('5', '104', '9', '67098', '216103', '20'), +('5', '104', '9', '56031', '128758', '20'), +('5', '104', '9', '62992', '128484', '20'), +('5', '104', '9', '56033', '128459', '20'), +('5', '104', '15', '111348', '210176', '20'), +('5', '104', '15', '111343', '209837', '20'), +('5', '104', '15', '111341', '209796', '20'), +('5', '104', '15', '111345', '208209', '20'), +('5', '104', '20', '111354', '234510', '20'), +('5', '104', '20', '111355', '232508', '20'), +('5', '104', '20', '111353', '231844', '20'), +('5', '104', '20', '111351', '231305', '20'), +('5', '104', '12', '81795', '129733', '20'), +('5', '104', '12', '56073', '129700', '20'), +('5', '104', '12', '89366', '123286', '20'), +('5', '104', '12', '104401', '109903', '20'), +('5', '104', '18', '56041', '135607', '20'), +('5', '104', '18', '62986', '135556', '20'), +('5', '104', '18', '62987', '134346', '20'), +('5', '104', '18', '94054', '134064', '20'), +('5', '104', '19', '62990', '133885', '20'), +('5', '104', '19', '56037', '133092', '20'), +('5', '104', '19', '56075', '132231', '20'), +('5', '104', '19', '81763', '131823', '20'), +('5', '104', '13', '111526', '430921', '20'), +('5', '104', '13', '111514', '414051', '20'), +('5', '104', '13', '111520', '410018', '20'), +('5', '104', '13', '111525', '408464', '20'), +('5', '104', '14', '111536', '215837', '20'), +('5', '104', '14', '111535', '214497', '20'), +('5', '104', '14', '111538', '214203', '20'), +('5', '104', '14', '111236', '189937', '20'), +('5', '104', '11', '133816', '271338', '20'), +('5', '104', '11', '111529', '260869', '20'), +('5', '104', '11', '111229', '241672', '20'), +('5', '104', '11', '111338', '210156', '20'), +('5', '105', '22', '39342', '0', '23'), +('5', '105', '22', '12425', '0', '23'), +('5', '105', '22', '7867', '0', '23'), +('5', '105', '22', '23597', '0', '23'), +('5', '105', '1', '98769', '351439', '23'), +('5', '105', '1', '111309', '210864', '23'), +('5', '105', '1', '111303', '209840', '23'), +('5', '105', '1', '111300', '208602', '23'), +('5', '105', '2', '94056', '132588', '23'), +('5', '105', '2', '62985', '131868', '23'), +('5', '105', '2', '89368', '126104', '23'), +('5', '105', '2', '104403', '111674', '23'), +('5', '105', '3', '111312', '209977', '23'), +('5', '105', '3', '111315', '209125', '23'), +('5', '105', '3', '111313', '209012', '23'), +('5', '105', '3', '111316', '206997', '23'), +('5', '105', '5', '111318', '208744', '23'), +('5', '105', '5', '111320', '208602', '23'), +('5', '105', '5', '111319', '206605', '23'), +('5', '105', '5', '111017', '183039', '23'), +('5', '105', '8', '111331', '210765', '23'), +('5', '105', '8', '111328', '210084', '23'), +('5', '105', '8', '111332', '206974', '23'), +('5', '105', '8', '111030', '184985', '23'), +('5', '105', '6', '111322', '209064', '23'), +('5', '105', '6', '111324', '209063', '23'), +('5', '105', '6', '111326', '206691', '23'), +('5', '105', '6', '111021', '183334', '23'), +('5', '105', '17', '56046', '139106', '23'), +('5', '105', '17', '81765', '138420', '23'), +('5', '105', '17', '56083', '138248', '23'), +('5', '105', '17', '104406', '118760', '23'), +('5', '105', '7', '94053', '133402', '23'), +('5', '105', '7', '56079', '132577', '23'), +('5', '105', '7', '89369', '127383', '23'), +('5', '105', '7', '104404', '111264', '23'), +('5', '105', '9', '67098', '216108', '23'), +('5', '105', '9', '56031', '128764', '23'), +('5', '105', '9', '62992', '128491', '23'), +('5', '105', '9', '56033', '128461', '23'), +('5', '105', '15', '111348', '210182', '23'), +('5', '105', '15', '111343', '209842', '23'), +('5', '105', '15', '111341', '209804', '23'), +('5', '105', '15', '111345', '208214', '23'), +('5', '105', '20', '111354', '234516', '23'), +('5', '105', '20', '111355', '232512', '23'), +('5', '105', '20', '111353', '231851', '23'), +('5', '105', '20', '111351', '231310', '23'), +('5', '105', '12', '81795', '129739', '23'), +('5', '105', '12', '56073', '129707', '23'), +('5', '105', '12', '89366', '123291', '23'), +('5', '105', '12', '104401', '109909', '23'), +('5', '105', '18', '56041', '135611', '23'), +('5', '105', '18', '62986', '135563', '23'), +('5', '105', '18', '62987', '134351', '23'), +('5', '105', '18', '94054', '134070', '23'), +('5', '105', '19', '62990', '133891', '23'), +('5', '105', '19', '56037', '133097', '23'), +('5', '105', '19', '56075', '132237', '23'), +('5', '105', '19', '81763', '131829', '23'), +('5', '105', '13', '111526', '431464', '23'), +('5', '105', '13', '111514', '414566', '23'), +('5', '105', '13', '111520', '410532', '23'), +('5', '105', '13', '111525', '408979', '23'), +('5', '105', '14', '111536', '215843', '23'), +('5', '105', '14', '111535', '214503', '23'), +('5', '105', '14', '111538', '214209', '23'), +('5', '105', '14', '111236', '189943', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '105', '11', '133816', '271343', '23'), +('5', '105', '11', '111529', '260949', '23'), +('5', '105', '11', '111229', '241744', '23'), +('5', '105', '11', '111338', '210163', '23'), +('5', '105', '22', '7867', '0', '22'), +('5', '105', '22', '39342', '0', '22'), +('5', '105', '22', '23597', '0', '22'), +('5', '105', '22', '53550', '0', '22'), +('5', '105', '1', '98769', '351439', '22'), +('5', '105', '1', '111309', '210864', '22'), +('5', '105', '1', '111303', '209840', '22'), +('5', '105', '1', '111300', '208602', '22'), +('5', '105', '2', '94056', '132588', '22'), +('5', '105', '2', '62985', '131868', '22'), +('5', '105', '2', '89368', '126104', '22'), +('5', '105', '2', '104403', '111674', '22'), +('5', '105', '3', '111312', '209977', '22'), +('5', '105', '3', '111315', '209125', '22'), +('5', '105', '3', '111313', '209012', '22'), +('5', '105', '3', '111316', '206997', '22'), +('5', '105', '5', '111318', '208744', '22'), +('5', '105', '5', '111320', '208602', '22'), +('5', '105', '5', '111319', '206605', '22'), +('5', '105', '5', '111017', '183039', '22'), +('5', '105', '8', '111331', '210765', '22'), +('5', '105', '8', '111328', '210084', '22'), +('5', '105', '8', '111332', '206974', '22'), +('5', '105', '8', '111030', '184985', '22'), +('5', '105', '6', '111322', '209064', '22'), +('5', '105', '6', '111324', '209063', '22'), +('5', '105', '6', '111326', '206691', '22'), +('5', '105', '6', '111021', '183334', '22'), +('5', '105', '17', '56046', '139106', '22'), +('5', '105', '17', '81765', '138420', '22'), +('5', '105', '17', '56083', '138248', '22'), +('5', '105', '17', '104406', '118760', '22'), +('5', '105', '7', '94053', '133402', '22'), +('5', '105', '7', '56079', '132577', '22'), +('5', '105', '7', '89369', '127383', '22'), +('5', '105', '7', '104404', '111264', '22'), +('5', '105', '9', '67098', '216108', '22'), +('5', '105', '9', '56031', '128764', '22'), +('5', '105', '9', '62992', '128491', '22'), +('5', '105', '9', '56033', '128461', '22'), +('5', '105', '15', '111348', '210182', '22'), +('5', '105', '15', '111343', '209842', '22'), +('5', '105', '15', '111341', '209804', '22'), +('5', '105', '15', '111345', '208214', '22'), +('5', '105', '20', '111354', '234516', '22'), +('5', '105', '20', '111355', '232512', '22'), +('5', '105', '20', '111353', '231851', '22'), +('5', '105', '20', '111351', '231310', '22'), +('5', '105', '12', '81795', '129739', '22'), +('5', '105', '12', '56073', '129707', '22'), +('5', '105', '12', '89366', '123291', '22'), +('5', '105', '12', '104401', '109909', '22'), +('5', '105', '18', '56041', '135611', '22'), +('5', '105', '18', '62986', '135563', '22'), +('5', '105', '18', '62987', '134351', '22'), +('5', '105', '18', '94054', '134070', '22'), +('5', '105', '19', '62990', '133891', '22'), +('5', '105', '19', '56037', '133097', '22'), +('5', '105', '19', '56075', '132237', '22'), +('5', '105', '19', '81763', '131829', '22'), +('5', '105', '13', '111526', '431464', '22'), +('5', '105', '13', '111514', '414566', '22'), +('5', '105', '13', '111520', '410532', '22'), +('5', '105', '13', '111525', '408979', '22'), +('5', '105', '14', '111536', '215843', '22'), +('5', '105', '14', '111535', '214503', '22'), +('5', '105', '14', '111538', '214209', '22'), +('5', '105', '14', '111236', '189943', '22'), +('5', '105', '11', '133816', '271343', '22'), +('5', '105', '11', '111529', '260949', '22'), +('5', '105', '11', '111229', '241744', '22'), +('5', '105', '11', '111338', '210163', '22'), +('5', '105', '22', '7867', '0', '21'), +('5', '105', '22', '39342', '0', '21'), +('5', '105', '22', '23597', '0', '21'), +('5', '105', '22', '53550', '0', '21'), +('5', '105', '1', '98769', '351439', '21'), +('5', '105', '1', '111309', '210864', '21'), +('5', '105', '1', '111303', '209840', '21'), +('5', '105', '1', '111300', '208602', '21'), +('5', '105', '2', '94056', '132588', '21'), +('5', '105', '2', '62985', '131868', '21'), +('5', '105', '2', '89368', '126104', '21'), +('5', '105', '2', '104403', '111674', '21'), +('5', '105', '3', '111312', '209977', '21'), +('5', '105', '3', '111315', '209125', '21'), +('5', '105', '3', '111313', '209012', '21'), +('5', '105', '3', '111316', '206997', '21'), +('5', '105', '5', '111318', '208744', '21'), +('5', '105', '5', '111320', '208602', '21'), +('5', '105', '5', '111319', '206605', '21'), +('5', '105', '5', '111017', '183039', '21'), +('5', '105', '8', '111331', '210765', '21'), +('5', '105', '8', '111328', '210084', '21'), +('5', '105', '8', '111332', '206974', '21'), +('5', '105', '8', '111030', '184985', '21'), +('5', '105', '6', '111322', '209064', '21'), +('5', '105', '6', '111324', '209063', '21'), +('5', '105', '6', '111326', '206691', '21'), +('5', '105', '6', '111021', '183334', '21'), +('5', '105', '17', '56046', '139106', '21'), +('5', '105', '17', '81765', '138420', '21'), +('5', '105', '17', '56083', '138248', '21'), +('5', '105', '17', '104406', '118760', '21'), +('5', '105', '7', '94053', '133402', '21'), +('5', '105', '7', '56079', '132577', '21'), +('5', '105', '7', '89369', '127383', '21'), +('5', '105', '7', '104404', '111264', '21'), +('5', '105', '9', '67098', '216108', '21'), +('5', '105', '9', '56031', '128764', '21'), +('5', '105', '9', '62992', '128491', '21'), +('5', '105', '9', '56033', '128461', '21'), +('5', '105', '15', '111348', '210182', '21'), +('5', '105', '15', '111343', '209842', '21'), +('5', '105', '15', '111341', '209804', '21'), +('5', '105', '15', '111345', '208214', '21'), +('5', '105', '20', '111354', '234516', '21'), +('5', '105', '20', '111355', '232512', '21'), +('5', '105', '20', '111353', '231851', '21'), +('5', '105', '20', '111351', '231310', '21'), +('5', '105', '12', '81795', '129739', '21'), +('5', '105', '12', '56073', '129707', '21'), +('5', '105', '12', '89366', '123291', '21'), +('5', '105', '12', '104401', '109909', '21'), +('5', '105', '18', '56041', '135611', '21'), +('5', '105', '18', '62986', '135563', '21'), +('5', '105', '18', '62987', '134351', '21'), +('5', '105', '18', '94054', '134070', '21'), +('5', '105', '19', '62990', '133891', '21'), +('5', '105', '19', '56037', '133097', '21'), +('5', '105', '19', '56075', '132237', '21'), +('5', '105', '19', '81763', '131829', '21'), +('5', '105', '13', '111526', '431464', '21'), +('5', '105', '13', '111514', '414566', '21'), +('5', '105', '13', '111520', '410532', '21'), +('5', '105', '13', '111525', '408979', '21'), +('5', '105', '14', '111536', '215843', '21'), +('5', '105', '14', '111535', '214503', '21'), +('5', '105', '14', '111538', '214209', '21'), +('5', '105', '14', '111236', '189943', '21'), +('5', '105', '11', '133816', '271343', '21'), +('5', '105', '11', '111529', '260949', '21'), +('5', '105', '11', '111229', '241744', '21'), +('5', '105', '11', '111338', '210163', '21'), +('5', '106', '22', '39342', '0', '23'), +('5', '106', '22', '12425', '0', '23'), +('5', '106', '22', '7867', '0', '23'), +('5', '106', '22', '23597', '0', '23'), +('5', '106', '1', '98769', '351443', '23'), +('5', '106', '1', '111309', '210870', '23'), +('5', '106', '1', '111303', '209846', '23'), +('5', '106', '1', '111300', '208607', '23'), +('5', '106', '2', '94056', '132592', '23'), +('5', '106', '2', '62985', '131871', '23'), +('5', '106', '2', '89368', '126109', '23'), +('5', '106', '2', '104403', '111680', '23'), +('5', '106', '3', '111312', '209982', '23'), +('5', '106', '3', '111315', '209132', '23'), +('5', '106', '3', '111313', '209017', '23'), +('5', '106', '3', '111316', '207003', '23'), +('5', '106', '5', '111318', '208749', '23'), +('5', '106', '5', '111320', '208608', '23'), +('5', '106', '5', '111319', '206613', '23'), +('5', '106', '5', '111017', '183044', '23'), +('5', '106', '8', '111331', '210771', '23'), +('5', '106', '8', '111328', '210091', '23'), +('5', '106', '8', '111332', '206979', '23'), +('5', '106', '8', '111030', '184991', '23'), +('5', '106', '6', '111324', '209069', '23'), +('5', '106', '6', '111322', '209069', '23'), +('5', '106', '6', '111326', '206697', '23'), +('5', '106', '6', '111021', '183339', '23'), +('5', '106', '17', '56046', '139112', '23'), +('5', '106', '17', '81765', '138425', '23'), +('5', '106', '17', '56083', '138252', '23'), +('5', '106', '17', '104406', '118767', '23'), +('5', '106', '7', '94053', '133407', '23'), +('5', '106', '7', '56079', '132584', '23'), +('5', '106', '7', '89369', '127389', '23'), +('5', '106', '7', '104404', '111268', '23'), +('5', '106', '9', '67098', '216113', '23'), +('5', '106', '9', '56031', '128769', '23'), +('5', '106', '9', '62992', '128497', '23'), +('5', '106', '9', '56033', '128464', '23'), +('5', '106', '15', '111348', '210188', '23'), +('5', '106', '15', '111343', '209846', '23'), +('5', '106', '15', '111341', '209812', '23'), +('5', '106', '15', '111345', '208219', '23'), +('5', '106', '20', '111354', '234521', '23'), +('5', '106', '20', '111355', '232516', '23'), +('5', '106', '20', '111353', '231857', '23'), +('5', '106', '20', '111351', '231314', '23'), +('5', '106', '12', '81795', '129745', '23'), +('5', '106', '12', '56073', '129715', '23'), +('5', '106', '12', '89366', '123296', '23'), +('5', '106', '12', '104401', '109915', '23'), +('5', '106', '18', '56041', '135615', '23'), +('5', '106', '18', '62986', '135570', '23'), +('5', '106', '18', '62987', '134355', '23'), +('5', '106', '18', '94054', '134076', '23'), +('5', '106', '19', '62990', '133897', '23'), +('5', '106', '19', '56037', '133101', '23'), +('5', '106', '19', '56075', '132242', '23'), +('5', '106', '19', '81763', '131835', '23'), +('5', '106', '13', '111526', '432006', '23'), +('5', '106', '13', '111514', '415080', '23'), +('5', '106', '13', '111520', '411046', '23'), +('5', '106', '13', '111525', '409494', '23'), +('5', '106', '14', '111536', '215848', '23'), +('5', '106', '14', '111535', '214509', '23'), +('5', '106', '14', '111538', '214214', '23'), +('5', '106', '14', '111236', '189948', '23'), +('5', '106', '11', '133816', '271348', '23'), +('5', '106', '11', '111529', '261020', '23'), +('5', '106', '11', '111229', '241815', '23'), +('5', '106', '11', '111338', '210169', '23'), +('5', '107', '22', '39342', '0', '23'), +('5', '107', '22', '12425', '0', '23'), +('5', '107', '22', '7867', '0', '23'), +('5', '107', '22', '23597', '0', '23'), +('5', '107', '1', '98769', '351447', '23'), +('5', '107', '1', '111309', '210875', '23'), +('5', '107', '1', '111303', '209852', '23'), +('5', '107', '1', '111300', '208612', '23'), +('5', '107', '2', '94056', '132597', '23'), +('5', '107', '2', '62985', '131874', '23'), +('5', '107', '2', '89368', '126115', '23'), +('5', '107', '2', '104403', '111686', '23'), +('5', '107', '3', '111312', '209987', '23'), +('5', '107', '3', '111315', '209139', '23'), +('5', '107', '3', '111313', '209021', '23'), +('5', '107', '3', '111316', '207008', '23'), +('5', '107', '5', '111318', '208754', '23'), +('5', '107', '5', '111320', '208613', '23'), +('5', '107', '5', '111319', '206619', '23'), +('5', '107', '5', '111017', '183049', '23'), +('5', '107', '8', '111331', '210777', '23'), +('5', '107', '8', '111328', '210098', '23'), +('5', '107', '8', '111332', '206983', '23'), +('5', '107', '8', '111030', '184997', '23'), +('5', '107', '6', '111324', '209075', '23'), +('5', '107', '6', '111322', '209074', '23'), +('5', '107', '6', '111326', '206703', '23'), +('5', '107', '6', '111021', '183344', '23'), +('5', '107', '17', '56046', '139119', '23'), +('5', '107', '17', '81765', '138430', '23'), +('5', '107', '17', '56083', '138256', '23'), +('5', '107', '17', '104406', '118773', '23'), +('5', '107', '7', '94053', '133413', '23'), +('5', '107', '7', '56079', '132589', '23'), +('5', '107', '7', '89369', '127394', '23'), +('5', '107', '7', '104404', '111272', '23'), +('5', '107', '9', '67098', '216118', '23'), +('5', '107', '9', '56031', '128775', '23'), +('5', '107', '9', '62992', '128503', '23'), +('5', '107', '9', '56033', '128467', '23'), +('5', '107', '15', '111348', '210194', '23'), +('5', '107', '15', '111343', '209850', '23'), +('5', '107', '15', '111341', '209820', '23'), +('5', '107', '15', '111345', '208224', '23'), +('5', '107', '20', '111354', '234526', '23'), +('5', '107', '20', '111355', '232519', '23'), +('5', '107', '20', '111353', '231864', '23'), +('5', '107', '20', '111351', '231319', '23'), +('5', '107', '12', '81795', '129751', '23'), +('5', '107', '12', '56073', '129721', '23'), +('5', '107', '12', '89366', '123300', '23'), +('5', '107', '12', '104401', '109920', '23'), +('5', '107', '18', '56041', '135619', '23'), +('5', '107', '18', '62986', '135577', '23'), +('5', '107', '18', '62987', '134359', '23'), +('5', '107', '18', '94054', '134081', '23'), +('5', '107', '19', '62990', '133903', '23'), +('5', '107', '19', '56037', '133105', '23'), +('5', '107', '19', '56075', '132247', '23'), +('5', '107', '19', '81763', '131841', '23'), +('5', '107', '13', '111526', '432549', '23'), +('5', '107', '13', '111514', '415595', '23'), +('5', '107', '13', '111520', '411560', '23'), +('5', '107', '13', '111525', '410008', '23'), +('5', '107', '14', '111536', '215854', '23'), +('5', '107', '14', '111535', '214514', '23'), +('5', '107', '14', '111538', '214219', '23'), +('5', '107', '14', '111236', '189954', '23'), +('5', '107', '11', '133816', '271352', '23'), +('5', '107', '11', '111529', '261101', '23'), +('5', '107', '11', '111229', '241896', '23'), +('5', '107', '11', '111338', '210176', '23'), +('5', '108', '22', '39342', '0', '23'), +('5', '108', '22', '12425', '0', '23'), +('5', '108', '22', '7867', '0', '23'), +('5', '108', '22', '23597', '0', '23'), +('5', '108', '1', '98769', '351452', '23'), +('5', '108', '1', '111309', '210881', '23'), +('5', '108', '1', '111303', '209858', '23'), +('5', '108', '1', '111300', '208617', '23'), +('5', '108', '2', '94056', '132601', '23'), +('5', '108', '2', '62985', '131878', '23'), +('5', '108', '2', '89368', '126120', '23'), +('5', '108', '2', '104403', '111692', '23'), +('5', '108', '3', '111312', '209993', '23'), +('5', '108', '3', '111315', '209147', '23'), +('5', '108', '3', '111313', '209026', '23'), +('5', '108', '3', '111316', '207014', '23'), +('5', '108', '5', '111318', '208759', '23'), +('5', '108', '5', '111320', '208619', '23'), +('5', '108', '5', '111319', '206627', '23'), +('5', '108', '5', '111017', '183054', '23'), +('5', '108', '8', '111331', '210783', '23'), +('5', '108', '8', '111328', '210105', '23'), +('5', '108', '8', '111332', '206988', '23'), +('5', '108', '8', '111030', '185003', '23'), +('5', '108', '6', '111324', '209081', '23'), +('5', '108', '6', '111322', '209079', '23'), +('5', '108', '6', '111326', '206709', '23'), +('5', '108', '6', '111021', '183349', '23'), +('5', '108', '17', '56046', '139126', '23'), +('5', '108', '17', '81765', '138435', '23'), +('5', '108', '17', '56083', '138260', '23'), +('5', '108', '17', '104406', '118780', '23'), +('5', '108', '7', '94053', '133418', '23'), +('5', '108', '7', '56079', '132596', '23'), +('5', '108', '7', '89369', '127400', '23'), +('5', '108', '7', '104404', '111277', '23'), +('5', '108', '9', '67098', '216123', '23'), +('5', '108', '9', '56031', '128780', '23'), +('5', '108', '9', '62992', '128510', '23'), +('5', '108', '9', '56033', '128469', '23'), +('5', '108', '15', '111348', '210200', '23'), +('5', '108', '15', '111343', '209854', '23'), +('5', '108', '15', '111341', '209828', '23'), +('5', '108', '15', '111345', '208230', '23'), +('5', '108', '20', '111354', '234532', '23'), +('5', '108', '20', '111355', '232523', '23'), +('5', '108', '20', '111353', '231870', '23'), +('5', '108', '20', '111351', '231323', '23'), +('5', '108', '12', '81795', '129757', '23'), +('5', '108', '12', '56073', '129729', '23'), +('5', '108', '12', '89366', '123305', '23'), +('5', '108', '12', '104401', '109926', '23'), +('5', '108', '18', '56041', '135624', '23'), +('5', '108', '18', '62986', '135584', '23'), +('5', '108', '18', '62987', '134363', '23'), +('5', '108', '18', '94054', '134087', '23'), +('5', '108', '19', '62990', '133909', '23'), +('5', '108', '19', '56037', '133110', '23'), +('5', '108', '19', '56075', '132252', '23'), +('5', '108', '19', '81763', '131847', '23'), +('5', '108', '13', '111526', '433092', '23'), +('5', '108', '13', '111514', '416109', '23'), +('5', '108', '13', '111520', '412075', '23'), +('5', '108', '13', '111525', '410523', '23'), +('5', '108', '14', '111536', '215860', '23'), +('5', '108', '14', '111535', '214520', '23'), +('5', '108', '14', '111538', '214224', '23'), +('5', '108', '14', '111236', '189960', '23'), +('5', '108', '11', '133816', '271356', '23'), +('5', '108', '11', '111529', '261181', '23'), +('5', '108', '11', '111229', '241968', '23'), +('5', '108', '11', '111338', '210182', '23'), +('5', '109', '22', '39342', '0', '23'), +('5', '109', '22', '12425', '0', '23'), +('5', '109', '22', '7867', '0', '23'), +('5', '109', '22', '23597', '0', '23'), +('5', '109', '1', '98769', '351456', '23'), +('5', '109', '1', '111309', '210887', '23'), +('5', '109', '1', '111303', '209864', '23'), +('5', '109', '1', '111300', '208622', '23'), +('5', '109', '2', '94056', '132606', '23'), +('5', '109', '2', '62985', '131881', '23'), +('5', '109', '2', '89368', '126126', '23'), +('5', '109', '2', '104403', '111698', '23'), +('5', '109', '3', '111312', '209999', '23'), +('5', '109', '3', '111315', '209155', '23'), +('5', '109', '3', '111313', '209031', '23'), +('5', '109', '3', '111316', '207020', '23'), +('5', '109', '5', '111318', '208765', '23'), +('5', '109', '5', '111320', '208625', '23'), +('5', '109', '5', '111319', '206634', '23'), +('5', '109', '5', '111017', '183060', '23'), +('5', '109', '8', '111331', '210789', '23'), +('5', '109', '8', '111328', '210112', '23'), +('5', '109', '8', '111332', '206993', '23'), +('5', '109', '8', '111030', '185009', '23'), +('5', '109', '6', '111324', '209087', '23'), +('5', '109', '6', '111322', '209084', '23'), +('5', '109', '6', '111326', '206715', '23'), +('5', '109', '6', '111021', '183354', '23'), +('5', '109', '17', '56046', '139132', '23'), +('5', '109', '17', '81765', '138440', '23'), +('5', '109', '17', '56083', '138265', '23'), +('5', '109', '17', '104406', '118787', '23'), +('5', '109', '7', '94053', '133424', '23'), +('5', '109', '7', '56079', '132602', '23'), +('5', '109', '7', '89369', '127406', '23'), +('5', '109', '7', '104404', '111281', '23'), +('5', '109', '9', '67098', '216128', '23'), +('5', '109', '9', '56031', '128786', '23'), +('5', '109', '9', '62992', '128516', '23'), +('5', '109', '9', '56033', '128472', '23'), +('5', '109', '15', '111348', '210206', '23'), +('5', '109', '15', '111343', '209859', '23'), +('5', '109', '15', '111341', '209837', '23'), +('5', '109', '15', '111345', '208235', '23'), +('5', '109', '20', '111354', '234538', '23'), +('5', '109', '20', '111355', '232527', '23'), +('5', '109', '20', '111353', '231877', '23'), +('5', '109', '20', '111351', '231328', '23'), +('5', '109', '12', '81795', '129763', '23'), +('5', '109', '12', '56073', '129736', '23'), +('5', '109', '12', '89366', '123310', '23'), +('5', '109', '12', '104401', '109932', '23'), +('5', '109', '18', '56041', '135628', '23'), +('5', '109', '18', '62986', '135591', '23'), +('5', '109', '18', '62987', '134368', '23'), +('5', '109', '18', '94054', '134092', '23'), +('5', '109', '19', '62990', '133915', '23'), +('5', '109', '19', '56037', '133115', '23'), +('5', '109', '19', '56075', '132258', '23'), +('5', '109', '19', '81763', '131853', '23'), +('5', '109', '13', '111526', '433635', '23'), +('5', '109', '13', '111514', '416652', '23'), +('5', '109', '13', '111520', '412589', '23'), +('5', '109', '13', '111525', '411038', '23'), +('5', '109', '14', '111536', '215866', '23'), +('5', '109', '14', '111535', '214526', '23'), +('5', '109', '14', '111538', '214229', '23'), +('5', '109', '14', '111236', '189966', '23'), +('5', '109', '11', '133816', '271361', '23'), +('5', '109', '11', '111529', '261253', '23'), +('5', '109', '11', '111229', '242049', '23'), +('5', '109', '11', '111338', '210189', '23'), +('5', '110', '22', '7867', '0', '25'), +('5', '110', '22', '39342', '0', '25'), +('5', '110', '22', '23597', '0', '25'), +('5', '110', '22', '53550', '0', '25'), +('5', '110', '1', '98769', '351460', '25'), +('5', '110', '1', '111309', '210892', '25'), +('5', '110', '1', '111303', '209870', '25'), +('5', '110', '1', '111300', '208627', '25'), +('5', '110', '2', '94056', '132610', '25'), +('5', '110', '2', '62985', '131885', '25'), +('5', '110', '2', '89368', '126131', '25'), +('5', '110', '2', '104403', '111704', '25'), +('5', '110', '3', '111312', '210004', '25'), +('5', '110', '3', '111315', '209162', '25'), +('5', '110', '3', '111313', '209036', '25'), +('5', '110', '3', '111316', '207025', '25'), +('5', '110', '5', '111318', '208770', '25'), +('5', '110', '5', '111320', '208631', '25'), +('5', '110', '5', '111319', '206641', '25'), +('5', '110', '5', '111017', '183065', '25'), +('5', '110', '8', '111331', '210795', '25'), +('5', '110', '8', '111328', '210120', '25'), +('5', '110', '8', '111332', '206998', '25'), +('5', '110', '8', '111030', '185015', '25'), +('5', '110', '6', '111324', '209093', '25'), +('5', '110', '6', '111322', '209089', '25'), +('5', '110', '6', '111326', '206721', '25'), +('5', '110', '6', '111021', '183359', '25'), +('5', '110', '17', '56046', '139139', '25'), +('5', '110', '17', '81765', '138445', '25'), +('5', '110', '17', '56083', '138269', '25'), +('5', '110', '17', '104406', '118794', '25'), +('5', '110', '7', '94053', '133430', '25'), +('5', '110', '7', '56079', '132608', '25'), +('5', '110', '7', '89369', '127412', '25'), +('5', '110', '7', '104404', '111285', '25'), +('5', '110', '9', '67098', '216133', '25'), +('5', '110', '9', '56031', '128791', '25'), +('5', '110', '9', '62992', '128522', '25'), +('5', '110', '9', '56033', '128475', '25'), +('5', '110', '15', '111348', '210213', '25'), +('5', '110', '15', '111343', '209863', '25'), +('5', '110', '15', '111341', '209845', '25'), +('5', '110', '15', '111345', '208240', '25'), +('5', '110', '20', '111354', '234543', '25'), +('5', '110', '20', '111355', '232531', '25'), +('5', '110', '20', '111353', '231884', '25'), +('5', '110', '20', '111351', '231333', '25'), +('5', '110', '12', '81795', '129770', '25'), +('5', '110', '12', '56073', '129744', '25'), +('5', '110', '12', '89366', '123315', '25'), +('5', '110', '12', '104401', '109938', '25'), +('5', '110', '18', '56041', '135632', '25'), +('5', '110', '18', '62986', '135598', '25'), +('5', '110', '18', '62987', '134372', '25'), +('5', '110', '18', '94054', '134098', '25'), +('5', '110', '19', '62990', '133921', '25'), +('5', '110', '19', '56037', '133119', '25'), +('5', '110', '19', '56075', '132263', '25'), +('5', '110', '19', '81763', '131859', '25'), +('5', '110', '13', '111526', '435452', '25'), +('5', '110', '13', '111514', '418442', '25'), +('5', '110', '13', '111520', '414378', '25'), +('5', '110', '13', '111525', '412828', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('5', '110', '14', '111536', '215871', '25'), +('5', '110', '14', '111535', '214532', '25'), +('5', '110', '14', '111538', '214234', '25'), +('5', '110', '14', '111236', '189971', '25'), +('5', '110', '11', '85213', '313630', '25'), +('5', '110', '11', '133816', '271366', '25'), +('5', '110', '11', '111529', '261333', '25'), +('5', '110', '11', '111229', '242120', '25'), +('5', '110', '22', '7867', '0', '24'), +('5', '110', '22', '39342', '0', '24'), +('5', '110', '22', '23597', '0', '24'), +('5', '110', '22', '53550', '0', '24'), +('5', '110', '1', '98769', '351460', '24'), +('5', '110', '1', '111309', '210892', '24'), +('5', '110', '1', '111303', '209870', '24'), +('5', '110', '1', '111300', '208627', '24'), +('5', '110', '2', '94056', '132610', '24'), +('5', '110', '2', '62985', '131885', '24'), +('5', '110', '2', '89368', '126131', '24'), +('5', '110', '2', '104403', '111704', '24'), +('5', '110', '3', '111312', '210004', '24'), +('5', '110', '3', '111315', '209162', '24'), +('5', '110', '3', '111313', '209036', '24'), +('5', '110', '3', '111316', '207025', '24'), +('5', '110', '5', '111318', '208770', '24'), +('5', '110', '5', '111320', '208631', '24'), +('5', '110', '5', '111319', '206641', '24'), +('5', '110', '5', '111017', '183065', '24'), +('5', '110', '8', '111331', '210795', '24'), +('5', '110', '8', '111328', '210120', '24'), +('5', '110', '8', '111332', '206998', '24'), +('5', '110', '8', '111030', '185015', '24'), +('5', '110', '6', '111324', '209093', '24'), +('5', '110', '6', '111322', '209089', '24'), +('5', '110', '6', '111326', '206721', '24'), +('5', '110', '6', '111021', '183359', '24'), +('5', '110', '17', '56046', '139139', '24'), +('5', '110', '17', '81765', '138445', '24'), +('5', '110', '17', '56083', '138269', '24'), +('5', '110', '17', '104406', '118794', '24'), +('5', '110', '7', '94053', '133430', '24'), +('5', '110', '7', '56079', '132608', '24'), +('5', '110', '7', '89369', '127412', '24'), +('5', '110', '7', '104404', '111285', '24'), +('5', '110', '9', '67098', '216133', '24'), +('5', '110', '9', '56031', '128791', '24'), +('5', '110', '9', '62992', '128522', '24'), +('5', '110', '9', '56033', '128475', '24'), +('5', '110', '15', '111348', '210213', '24'), +('5', '110', '15', '111343', '209863', '24'), +('5', '110', '15', '111341', '209845', '24'), +('5', '110', '15', '111345', '208240', '24'), +('5', '110', '20', '111354', '234543', '24'), +('5', '110', '20', '111355', '232531', '24'), +('5', '110', '20', '111353', '231884', '24'), +('5', '110', '20', '111351', '231333', '24'), +('5', '110', '12', '81795', '129770', '24'), +('5', '110', '12', '56073', '129744', '24'), +('5', '110', '12', '89366', '123315', '24'), +('5', '110', '12', '104401', '109938', '24'), +('5', '110', '18', '56041', '135632', '24'), +('5', '110', '18', '62986', '135598', '24'), +('5', '110', '18', '62987', '134372', '24'), +('5', '110', '18', '94054', '134098', '24'), +('5', '110', '19', '62990', '133921', '24'), +('5', '110', '19', '56037', '133119', '24'), +('5', '110', '19', '56075', '132263', '24'), +('5', '110', '19', '81763', '131859', '24'), +('5', '110', '13', '111526', '435452', '24'), +('5', '110', '13', '111514', '418442', '24'), +('5', '110', '13', '111520', '414378', '24'), +('5', '110', '13', '111525', '412828', '24'), +('5', '110', '14', '111536', '215871', '24'), +('5', '110', '14', '111535', '214532', '24'), +('5', '110', '14', '111538', '214234', '24'), +('5', '110', '14', '111236', '189971', '24'), +('5', '110', '11', '85213', '313630', '24'), +('5', '110', '11', '133816', '271366', '24'), +('5', '110', '11', '111529', '261333', '24'), +('5', '110', '11', '111229', '242120', '24'), +('5', '111', '22', '7867', '0', '25'), +('5', '111', '22', '39342', '0', '25'), +('5', '111', '22', '23597', '0', '25'), +('5', '111', '22', '53550', '0', '25'), +('5', '111', '1', '98769', '351464', '25'), +('5', '111', '1', '111309', '210898', '25'), +('5', '111', '1', '111303', '209876', '25'), +('5', '111', '1', '111300', '208632', '25'), +('5', '111', '2', '94056', '132614', '25'), +('5', '111', '2', '62985', '131888', '25'), +('5', '111', '2', '89368', '126137', '25'), +('5', '111', '2', '104403', '111710', '25'), +('5', '111', '3', '111312', '210010', '25'), +('5', '111', '3', '111315', '209170', '25'), +('5', '111', '3', '111313', '209040', '25'), +('5', '111', '3', '111316', '207031', '25'), +('5', '111', '5', '111318', '208775', '25'), +('5', '111', '5', '111320', '208637', '25'), +('5', '111', '5', '111319', '206648', '25'), +('5', '111', '5', '111017', '183070', '25'), +('5', '111', '8', '111331', '210801', '25'), +('5', '111', '8', '111328', '210127', '25'), +('5', '111', '8', '111332', '207003', '25'), +('5', '111', '8', '111030', '185021', '25'), +('5', '111', '6', '111324', '209100', '25'), +('5', '111', '6', '111322', '209094', '25'), +('5', '111', '6', '111326', '206727', '25'), +('5', '111', '6', '111021', '183364', '25'), +('5', '111', '17', '56046', '139146', '25'), +('5', '111', '17', '81765', '138449', '25'), +('5', '111', '17', '56083', '138273', '25'), +('5', '111', '17', '104406', '118800', '25'), +('5', '111', '7', '94053', '133435', '25'), +('5', '111', '7', '56079', '132614', '25'), +('5', '111', '7', '89369', '127417', '25'), +('5', '111', '7', '104404', '111289', '25'), +('5', '111', '9', '67098', '216138', '25'), +('5', '111', '9', '56031', '128796', '25'), +('5', '111', '9', '62992', '128529', '25'), +('5', '111', '9', '56033', '128478', '25'), +('5', '111', '15', '111348', '210219', '25'), +('5', '111', '15', '111343', '209867', '25'), +('5', '111', '15', '111341', '209853', '25'), +('5', '111', '15', '111345', '208245', '25'), +('5', '111', '20', '111354', '234549', '25'), +('5', '111', '20', '111355', '232535', '25'), +('5', '111', '20', '111353', '231890', '25'), +('5', '111', '20', '111351', '231337', '25'), +('5', '111', '12', '81795', '129776', '25'), +('5', '111', '12', '56073', '129751', '25'), +('5', '111', '12', '89366', '123319', '25'), +('5', '111', '12', '104401', '109944', '25'), +('5', '111', '18', '56041', '135636', '25'), +('5', '111', '18', '62986', '135605', '25'), +('5', '111', '18', '62987', '134377', '25'), +('5', '111', '18', '94054', '134104', '25'), +('5', '111', '19', '62990', '133927', '25'), +('5', '111', '19', '56037', '133124', '25'), +('5', '111', '19', '56075', '132268', '25'), +('5', '111', '19', '81763', '131865', '25'), +('5', '111', '13', '111526', '435995', '25'), +('5', '111', '13', '111514', '418957', '25'), +('5', '111', '13', '111520', '414893', '25'), +('5', '111', '13', '111525', '413314', '25'), +('5', '111', '14', '111536', '215877', '25'), +('5', '111', '14', '111535', '214538', '25'), +('5', '111', '14', '111538', '214240', '25'), +('5', '111', '14', '111236', '189977', '25'), +('5', '111', '11', '85213', '313635', '25'), +('5', '111', '11', '133816', '271370', '25'), +('5', '111', '11', '111529', '261414', '25'), +('5', '111', '11', '111229', '242192', '25'), +('5', '112', '22', '7867', '0', '25'), +('5', '112', '22', '39342', '0', '25'), +('5', '112', '22', '23597', '0', '25'), +('5', '112', '22', '53550', '0', '25'), +('5', '112', '1', '98769', '351469', '25'), +('5', '112', '1', '111309', '210904', '25'), +('5', '112', '1', '111303', '209882', '25'), +('5', '112', '1', '111300', '208637', '25'), +('5', '112', '2', '94056', '132619', '25'), +('5', '112', '2', '62985', '131892', '25'), +('5', '112', '2', '89368', '126142', '25'), +('5', '112', '2', '104403', '111716', '25'), +('5', '112', '3', '111312', '210015', '25'), +('5', '112', '3', '111315', '209178', '25'), +('5', '112', '3', '111313', '209045', '25'), +('5', '112', '3', '111316', '207037', '25'), +('5', '112', '5', '111318', '208780', '25'), +('5', '112', '5', '111320', '208642', '25'), +('5', '112', '5', '111319', '206655', '25'), +('5', '112', '5', '111017', '183075', '25'), +('5', '112', '8', '111331', '210808', '25'), +('5', '112', '8', '111328', '210134', '25'), +('5', '112', '8', '111332', '207008', '25'), +('5', '112', '8', '111030', '185028', '25'), +('5', '112', '6', '111324', '209106', '25'), +('5', '112', '6', '111322', '209099', '25'), +('5', '112', '6', '111326', '206733', '25'), +('5', '112', '6', '111021', '183369', '25'), +('5', '112', '17', '56046', '139153', '25'), +('5', '112', '17', '81765', '138454', '25'), +('5', '112', '17', '56083', '138277', '25'), +('5', '112', '17', '104406', '118807', '25'), +('5', '112', '7', '94053', '133441', '25'), +('5', '112', '7', '56079', '132621', '25'), +('5', '112', '7', '89369', '127423', '25'), +('5', '112', '7', '104404', '111294', '25'), +('5', '112', '9', '67098', '216143', '25'), +('5', '112', '9', '56031', '128802', '25'), +('5', '112', '9', '62992', '128535', '25'), +('5', '112', '9', '56033', '128480', '25'), +('5', '112', '15', '111348', '210225', '25'), +('5', '112', '15', '111343', '209872', '25'), +('5', '112', '15', '111341', '209862', '25'), +('5', '112', '15', '111345', '208251', '25'), +('5', '112', '20', '111354', '234555', '25'), +('5', '112', '20', '111355', '232539', '25'), +('5', '112', '20', '111353', '231897', '25'), +('5', '112', '20', '111351', '231342', '25'), +('5', '112', '12', '81795', '129782', '25'), +('5', '112', '12', '56073', '129758', '25'), +('5', '112', '12', '89366', '123324', '25'), +('5', '112', '12', '104401', '109950', '25'), +('5', '112', '18', '56041', '135640', '25'), +('5', '112', '18', '62986', '135613', '25'), +('5', '112', '18', '62987', '134381', '25'), +('5', '112', '18', '94054', '134109', '25'), +('5', '112', '19', '62990', '133933', '25'), +('5', '112', '19', '56037', '133129', '25'), +('5', '112', '19', '56075', '132273', '25'), +('5', '112', '19', '81763', '131871', '25'), +('5', '112', '13', '111526', '436538', '25'), +('5', '112', '13', '111514', '419471', '25'), +('5', '112', '13', '111520', '415407', '25'), +('5', '112', '13', '111525', '413829', '25'), +('5', '112', '14', '111536', '215883', '25'), +('5', '112', '14', '111535', '214544', '25'), +('5', '112', '14', '111538', '214245', '25'), +('5', '112', '14', '111236', '189983', '25'), +('5', '112', '11', '85213', '313639', '25'), +('5', '112', '11', '133816', '271375', '25'), +('5', '112', '11', '111529', '261495', '25'), +('5', '112', '11', '111229', '242272', '25'), +('5', '113', '22', '7867', '0', '25'), +('5', '113', '22', '39342', '0', '25'), +('5', '113', '22', '23597', '0', '25'), +('5', '113', '22', '53550', '0', '25'), +('5', '113', '1', '98769', '351473', '25'), +('5', '113', '1', '111309', '210909', '25'), +('5', '113', '1', '111303', '209887', '25'), +('5', '113', '1', '111300', '208642', '25'), +('5', '113', '2', '94056', '132623', '25'), +('5', '113', '2', '62985', '131895', '25'), +('5', '113', '2', '89368', '126148', '25'), +('5', '113', '2', '104403', '111722', '25'), +('5', '113', '3', '111312', '210021', '25'), +('5', '113', '3', '111315', '209185', '25'), +('5', '113', '3', '111313', '209050', '25'), +('5', '113', '3', '111316', '207043', '25'), +('5', '113', '5', '111318', '208785', '25'), +('5', '113', '5', '111320', '208648', '25'), +('5', '113', '5', '111319', '206662', '25'), +('5', '113', '5', '111017', '183080', '25'), +('5', '113', '8', '111331', '210814', '25'), +('5', '113', '8', '111328', '210141', '25'), +('5', '113', '8', '111332', '207012', '25'), +('5', '113', '8', '111030', '185034', '25'), +('5', '113', '6', '111324', '209112', '25'), +('5', '113', '6', '111322', '209105', '25'), +('5', '113', '6', '111326', '206739', '25'), +('5', '113', '6', '111021', '183375', '25'), +('5', '113', '17', '56046', '139159', '25'), +('5', '113', '17', '81765', '138459', '25'), +('5', '113', '17', '56083', '138281', '25'), +('5', '113', '17', '104406', '118814', '25'), +('5', '113', '7', '94053', '133446', '25'), +('5', '113', '7', '56079', '132627', '25'), +('5', '113', '7', '89369', '127429', '25'), +('5', '113', '7', '104404', '111298', '25'), +('5', '113', '9', '67098', '216148', '25'), +('5', '113', '9', '56031', '128807', '25'), +('5', '113', '9', '62992', '128541', '25'), +('5', '113', '9', '56033', '128483', '25'), +('5', '113', '15', '111348', '210231', '25'), +('5', '113', '15', '111343', '209876', '25'), +('5', '113', '15', '111341', '209870', '25'), +('5', '113', '15', '111345', '208256', '25'), +('5', '113', '20', '111354', '234560', '25'), +('5', '113', '20', '111355', '232543', '25'), +('5', '113', '20', '111353', '231904', '25'), +('5', '113', '20', '111351', '231347', '25'), +('5', '113', '12', '81795', '129788', '25'), +('5', '113', '12', '56073', '129766', '25'), +('5', '113', '12', '89366', '123329', '25'), +('5', '113', '12', '104401', '109956', '25'), +('5', '113', '18', '56041', '135645', '25'), +('5', '113', '18', '62986', '135620', '25'), +('5', '113', '18', '62987', '134385', '25'), +('5', '113', '18', '94054', '134115', '25'), +('5', '113', '19', '62990', '133939', '25'), +('5', '113', '19', '56037', '133133', '25'), +('5', '113', '19', '56075', '132279', '25'), +('5', '113', '19', '81763', '131877', '25'), +('5', '113', '13', '111526', '437052', '25'), +('5', '113', '13', '111514', '419986', '25'), +('5', '113', '13', '111520', '415921', '25'), +('5', '113', '13', '111525', '414344', '25'), +('5', '113', '14', '111536', '215889', '25'), +('5', '113', '14', '111535', '214550', '25'), +('5', '113', '14', '111538', '214250', '25'), +('5', '113', '14', '111236', '189989', '25'), +('5', '113', '11', '85213', '313643', '25'), +('5', '113', '11', '133816', '271379', '25'), +('5', '113', '11', '111529', '261566', '25'), +('5', '113', '11', '111229', '242344', '25'), +('5', '114', '22', '7867', '0', '25'), +('5', '114', '22', '39342', '0', '25'), +('5', '114', '22', '23597', '0', '25'), +('5', '114', '22', '53550', '0', '25'), +('5', '114', '1', '98769', '351477', '25'), +('5', '114', '1', '111309', '210915', '25'), +('5', '114', '1', '111303', '209893', '25'), +('5', '114', '1', '111300', '208647', '25'), +('5', '114', '2', '94056', '132628', '25'), +('5', '114', '2', '62985', '131899', '25'), +('5', '114', '2', '89368', '126153', '25'), +('5', '114', '2', '104403', '111728', '25'), +('5', '114', '3', '111312', '210027', '25'), +('5', '114', '3', '111315', '209193', '25'), +('5', '114', '3', '111313', '209055', '25'), +('5', '114', '3', '111316', '207048', '25'), +('5', '114', '5', '111318', '208791', '25'), +('5', '114', '5', '111320', '208654', '25'), +('5', '114', '5', '111319', '206670', '25'), +('5', '114', '5', '111017', '183086', '25'), +('5', '114', '8', '111331', '210820', '25'), +('5', '114', '8', '111328', '210148', '25'), +('5', '114', '8', '111332', '207017', '25'), +('5', '114', '8', '111030', '185040', '25'), +('5', '114', '6', '111324', '209118', '25'), +('5', '114', '6', '111322', '209110', '25'), +('5', '114', '6', '111326', '206745', '25'), +('5', '114', '6', '111021', '183380', '25'), +('5', '114', '17', '56046', '139166', '25'), +('5', '114', '17', '81765', '138464', '25'), +('5', '114', '17', '56083', '138285', '25'), +('5', '114', '17', '104406', '118821', '25'), +('5', '114', '7', '94053', '133452', '25'), +('5', '114', '7', '56079', '132633', '25'), +('5', '114', '7', '89369', '127435', '25'), +('5', '114', '7', '104404', '111302', '25'), +('5', '114', '9', '67098', '216153', '25'), +('5', '114', '9', '56031', '128813', '25'), +('5', '114', '9', '62992', '128548', '25'), +('5', '114', '9', '62984', '128491', '25'), +('5', '114', '15', '111348', '210237', '25'), +('5', '114', '15', '111343', '209881', '25'), +('5', '114', '15', '111341', '209878', '25'), +('5', '114', '15', '111345', '208261', '25'), +('5', '114', '20', '111354', '234566', '25'), +('5', '114', '20', '111355', '232547', '25'), +('5', '114', '20', '111353', '231911', '25'), +('5', '114', '20', '111351', '231352', '25'), +('5', '114', '12', '81795', '129794', '25'), +('5', '114', '12', '56073', '129773', '25'), +('5', '114', '12', '89366', '123334', '25'), +('5', '114', '12', '104401', '109962', '25'), +('5', '114', '18', '56041', '135649', '25'), +('5', '114', '18', '62986', '135627', '25'), +('5', '114', '18', '62987', '134390', '25'), +('5', '114', '18', '94054', '134121', '25'), +('5', '114', '19', '62990', '133945', '25'), +('5', '114', '19', '56037', '133138', '25'), +('5', '114', '19', '56075', '132284', '25'), +('5', '114', '19', '81763', '131883', '25'), +('5', '114', '13', '111526', '437595', '25'), +('5', '114', '13', '111514', '420501', '25'), +('5', '114', '13', '111520', '416436', '25'), +('5', '114', '13', '111525', '414859', '25'), +('5', '114', '14', '111536', '215895', '25'), +('5', '114', '14', '111535', '214556', '25'), +('5', '114', '14', '111538', '214255', '25'), +('5', '114', '14', '111236', '189995', '25'), +('5', '114', '11', '85213', '313647', '25'), +('5', '114', '11', '133816', '271384', '25'), +('5', '114', '11', '111529', '261646', '25'), +('5', '114', '11', '111229', '242425', '25'), +('5', '115', '22', '7867', '0', '26'), +('5', '115', '22', '39342', '0', '26'), +('5', '115', '22', '23597', '0', '26'), +('5', '115', '22', '53550', '0', '26'), +('5', '115', '1', '98769', '351481', '26'), +('5', '115', '1', '111309', '210920', '26'), +('5', '115', '1', '111303', '209899', '26'), +('5', '115', '1', '111300', '208652', '26'), +('5', '115', '2', '94056', '132632', '26'), +('5', '115', '2', '62985', '131902', '26'), +('5', '115', '2', '89368', '126159', '26'), +('5', '115', '2', '104403', '111734', '26'), +('5', '115', '3', '111312', '210032', '26'), +('5', '115', '3', '111315', '209201', '26'), +('5', '115', '3', '111313', '209059', '26'), +('5', '115', '3', '111316', '207054', '26'), +('5', '115', '5', '111318', '208796', '26'), +('5', '115', '5', '111320', '208660', '26'), +('5', '115', '5', '111319', '206677', '26'), +('5', '115', '5', '111017', '183091', '26'), +('5', '115', '8', '111331', '210826', '26'), +('5', '115', '8', '111328', '210155', '26'), +('5', '115', '8', '111332', '207022', '26'), +('5', '115', '8', '111030', '185046', '26'), +('5', '115', '6', '111324', '209124', '26'), +('5', '115', '6', '111322', '209115', '26'), +('5', '115', '6', '111326', '206751', '26'), +('5', '115', '6', '111021', '183385', '26'), +('5', '115', '17', '56046', '139173', '26'), +('5', '115', '17', '81765', '138469', '26'), +('5', '115', '17', '56083', '138289', '26'), +('5', '115', '17', '104406', '118827', '26'), +('5', '115', '7', '94053', '133458', '26'), +('5', '115', '7', '56079', '132639', '26'), +('5', '115', '7', '89369', '127440', '26'), +('5', '115', '7', '104404', '111306', '26'), +('5', '115', '9', '67098', '216158', '26'), +('5', '115', '9', '56031', '128818', '26'), +('5', '115', '9', '62992', '128554', '26'), +('5', '115', '9', '62984', '128498', '26'), +('5', '115', '15', '111348', '210243', '26'), +('5', '115', '15', '111341', '209886', '26'), +('5', '115', '15', '111343', '209885', '26'), +('5', '115', '15', '111345', '208267', '26'), +('5', '115', '20', '111354', '234571', '26'), +('5', '115', '20', '111355', '232551', '26'), +('5', '115', '20', '111353', '231917', '26'), +('5', '115', '20', '111351', '231356', '26'), +('5', '115', '12', '81795', '129801', '26'), +('5', '115', '12', '56073', '129781', '26'), +('5', '115', '12', '89366', '123339', '26'), +('5', '115', '12', '104401', '109968', '26'), +('5', '115', '18', '56041', '135653', '26'), +('5', '115', '18', '62986', '135634', '26'), +('5', '115', '18', '62987', '134394', '26'), +('5', '115', '18', '94054', '134126', '26'), +('5', '115', '19', '62990', '133952', '26'), +('5', '115', '19', '56037', '133142', '26'), +('5', '115', '19', '56075', '132289', '26'), +('5', '115', '19', '81763', '131889', '26'), +('5', '115', '13', '111526', '438138', '26'), +('5', '115', '13', '111514', '421044', '26'), +('5', '115', '13', '111520', '416950', '26'), +('5', '115', '13', '111525', '415374', '26'), +('5', '115', '14', '111536', '215900', '26'), +('5', '115', '14', '111535', '214562', '26'), +('5', '115', '14', '111538', '214260', '26'), +('5', '115', '14', '111236', '190000', '26'), +('5', '115', '11', '85213', '313651', '26'), +('5', '115', '11', '133816', '271388', '26'), +('5', '115', '11', '111529', '261727', '26'), +('5', '115', '11', '111229', '242496', '26'), +('6', '1', '22', '9246', '0', '0'), +('6', '1', '22', '10323', '0', '0'), +('6', '1', '22', '44492', '0', '0'), +('6', '1', '22', '13101', '0', '0'), +('6', '1', '1', '12801', '4762', '0'), +('6', '1', '1', '14702', '3750', '0'), +('6', '1', '1', '14701', '2862', '0'), +('6', '1', '1', '30361', '2640', '0'), +('6', '1', '2', '10143', '5368', '0'), +('6', '1', '2', '30363', '3700', '0'), +('6', '1', '2', '3000', '2534', '0'), +('6', '1', '2', '2294', '2064', '0'), +('6', '1', '3', '2706', '1379', '0'), +('6', '1', '3', '2295', '1042', '0'), +('6', '1', '3', '14706', '990', '0'), +('6', '1', '3', '14705', '990', '0'), +('6', '1', '5', '14703', '6050', '0'), +('6', '1', '5', '14700', '3318', '0'), +('6', '1', '5', '30362', '3140', '0'), +('6', '1', '5', '10055', '2780', '0'), +('6', '1', '8', '11603', '8419', '0'), +('6', '1', '8', '2349', '3554', '0'), +('6', '1', '8', '1363', '2510', '0'), +('6', '1', '8', '2287', '1539', '0'), +('6', '1', '6', '1557', '5310', '0'), +('6', '1', '6', '2705', '5089', '0'), +('6', '1', '6', '1401', '2174', '0'), +('6', '1', '6', '2286', '1982', '0'), +('6', '1', '17', '2285', '9415', '0'), +('6', '1', '17', '3802', '611', '0'), +('6', '1', '17', '3305', '403', '0'), +('6', '1', '17', '2281', '354', '0'), +('6', '1', '7', '1362', '2624', '0'), +('6', '1', '7', '31809', '2585', '0'), +('6', '1', '7', '1321', '1746', '0'), +('6', '1', '7', '2289', '1379', '0'), +('6', '1', '9', '3804', '2059', '0'), +('6', '1', '9', '4344', '2051', '0'), +('6', '1', '9', '10408', '2002', '0'), +('6', '1', '9', '14650', '1662', '0'), +('6', '1', '15', '10150', '3004', '0'), +('6', '1', '15', '10163', '2300', '0'), +('6', '1', '15', '14651', '2224', '0'), +('6', '1', '15', '30360', '1600', '0'), +('6', '1', '20', '11666', '8289', '0'), +('6', '1', '20', '11684', '7633', '0'), +('6', '1', '20', '2742', '5069', '0'), +('6', '1', '20', '2288', '4478', '0'), +('6', '1', '12', '2291', '3830', '0'), +('6', '1', '12', '2923', '3074', '0'), +('6', '1', '12', '20655', '2626', '0'), +('6', '1', '12', '2336', '1012', '0'), +('6', '1', '18', '4410', '1142', '0'), +('6', '1', '18', '2292', '889', '0'), +('6', '1', '18', '3806', '322', '0'), +('6', '1', '18', '2461', '241', '0'), +('6', '1', '19', '1368', '2016', '0'), +('6', '1', '19', '68239', '1960', '0'), +('6', '1', '19', '2293', '1271', '0'), +('6', '1', '19', '3807', '200', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '1', '13', '10333', '5300', '0'), +('6', '1', '13', '6411', '5274', '0'), +('6', '1', '13', '11683', '5116', '0'), +('6', '1', '13', '11563', '4074', '0'), +('6', '1', '14', '10333', '5300', '0'), +('6', '1', '14', '10334', '3503', '0'), +('6', '1', '14', '14762', '2204', '0'), +('6', '1', '14', '13168', '2090', '0'), +('6', '1', '11', '14762', '2204', '0'), +('6', '1', '11', '20677', '450', '0'), +('6', '1', '11', '13390', '150', '0'), +('6', '1', '11', '9246', '133', '0'), +('6', '2', '22', '9246', '0', '0'), +('6', '2', '22', '10323', '0', '0'), +('6', '2', '22', '44492', '0', '0'), +('6', '2', '22', '13101', '0', '0'), +('6', '2', '1', '12801', '4762', '0'), +('6', '2', '1', '14702', '3750', '0'), +('6', '2', '1', '14701', '2862', '0'), +('6', '2', '1', '30361', '2640', '0'), +('6', '2', '2', '10143', '5368', '0'), +('6', '2', '2', '30363', '3700', '0'), +('6', '2', '2', '3000', '2534', '0'), +('6', '2', '2', '2294', '2088', '0'), +('6', '2', '3', '2706', '1500', '0'), +('6', '2', '3', '2295', '1066', '0'), +('6', '2', '3', '14705', '990', '0'), +('6', '2', '3', '14706', '990', '0'), +('6', '2', '5', '14703', '6050', '0'), +('6', '2', '5', '14700', '3318', '0'), +('6', '2', '5', '30362', '3140', '0'), +('6', '2', '5', '10055', '2780', '0'), +('6', '2', '8', '11603', '8528', '0'), +('6', '2', '8', '2349', '3554', '0'), +('6', '2', '8', '1363', '2510', '0'), +('6', '2', '8', '2287', '1541', '0'), +('6', '2', '6', '1557', '5310', '0'), +('6', '2', '6', '2705', '5138', '0'), +('6', '2', '6', '1401', '2174', '0'), +('6', '2', '6', '2286', '1983', '0'), +('6', '2', '17', '2285', '9463', '0'), +('6', '2', '17', '3802', '771', '0'), +('6', '2', '17', '3305', '403', '0'), +('6', '2', '17', '4342', '368', '0'), +('6', '2', '7', '1362', '2624', '0'), +('6', '2', '7', '31809', '2621', '0'), +('6', '2', '7', '1321', '1746', '0'), +('6', '2', '7', '2289', '1427', '0'), +('6', '2', '9', '3804', '2168', '0'), +('6', '2', '9', '4344', '2051', '0'), +('6', '2', '9', '10408', '2002', '0'), +('6', '2', '9', '14650', '1662', '0'), +('6', '2', '15', '10150', '3004', '0'), +('6', '2', '15', '10163', '2300', '0'), +('6', '2', '15', '14651', '2224', '0'), +('6', '2', '15', '30360', '1600', '0'), +('6', '2', '20', '11666', '8291', '0'), +('6', '2', '20', '11684', '7730', '0'), +('6', '2', '20', '2742', '5072', '0'), +('6', '2', '20', '2288', '4478', '0'), +('6', '2', '12', '2291', '3830', '0'), +('6', '2', '12', '2923', '3074', '0'), +('6', '2', '12', '20655', '2651', '0'), +('6', '2', '12', '2336', '1012', '0'), +('6', '2', '18', '4410', '1142', '0'), +('6', '2', '18', '2292', '938', '0'), +('6', '2', '18', '3806', '383', '0'), +('6', '2', '18', '2461', '289', '0'), +('6', '2', '19', '1368', '2016', '0'), +('6', '2', '19', '68239', '1996', '0'), +('6', '2', '19', '2293', '1308', '0'), +('6', '2', '19', '4407', '278', '0'), +('6', '2', '13', '6411', '5382', '0'), +('6', '2', '13', '10333', '5300', '0'), +('6', '2', '13', '11683', '5225', '0'), +('6', '2', '13', '11563', '4147', '0'), +('6', '2', '14', '10333', '5300', '0'), +('6', '2', '14', '10334', '3503', '0'), +('6', '2', '14', '14762', '2204', '0'), +('6', '2', '14', '13168', '2090', '0'), +('6', '2', '11', '14762', '2204', '0'), +('6', '2', '11', '20677', '450', '0'), +('6', '2', '11', '9246', '254', '0'), +('6', '2', '11', '13390', '150', '0'), +('6', '3', '22', '9246', '0', '0'), +('6', '3', '22', '10323', '0', '0'), +('6', '3', '22', '44492', '0', '0'), +('6', '3', '22', '13101', '0', '0'), +('6', '3', '1', '12801', '4762', '0'), +('6', '3', '1', '14702', '3750', '0'), +('6', '3', '1', '14701', '2862', '0'), +('6', '3', '1', '30361', '2640', '0'), +('6', '3', '2', '10143', '5368', '0'), +('6', '3', '2', '30363', '3700', '0'), +('6', '3', '2', '3000', '2534', '0'), +('6', '3', '2', '2294', '2112', '0'), +('6', '3', '3', '2706', '1621', '0'), +('6', '3', '3', '2295', '1091', '0'), +('6', '3', '3', '14705', '990', '0'), +('6', '3', '3', '14706', '990', '0'), +('6', '3', '5', '14703', '6050', '0'), +('6', '3', '5', '14700', '3318', '0'), +('6', '3', '5', '30362', '3140', '0'), +('6', '3', '5', '10055', '2780', '0'), +('6', '3', '8', '11603', '8637', '0'), +('6', '3', '8', '2349', '3554', '0'), +('6', '3', '8', '1363', '2510', '0'), +('6', '3', '8', '2287', '1543', '0'), +('6', '3', '6', '1557', '5310', '0'), +('6', '3', '6', '2705', '5186', '0'), +('6', '3', '6', '1401', '2174', '0'), +('6', '3', '6', '2286', '1985', '0'), +('6', '3', '17', '2285', '9511', '0'), +('6', '3', '17', '3802', '931', '0'), +('6', '3', '17', '4342', '489', '0'), +('6', '3', '17', '3305', '403', '0'), +('6', '3', '7', '31809', '2657', '0'), +('6', '3', '7', '1362', '2624', '0'), +('6', '3', '7', '1321', '1746', '0'), +('6', '3', '7', '2289', '1475', '0'), +('6', '3', '9', '3804', '2276', '0'), +('6', '3', '9', '4344', '2051', '0'), +('6', '3', '9', '10408', '2002', '0'), +('6', '3', '9', '14650', '1662', '0'), +('6', '3', '15', '10150', '3004', '0'), +('6', '3', '15', '10163', '2300', '0'), +('6', '3', '15', '14651', '2224', '0'), +('6', '3', '15', '30360', '1600', '0'), +('6', '3', '20', '11666', '8293', '0'), +('6', '3', '20', '11684', '7826', '0'), +('6', '3', '20', '2742', '5076', '0'), +('6', '3', '20', '2288', '4478', '0'), +('6', '3', '12', '2291', '3830', '0'), +('6', '3', '12', '2923', '3074', '0'), +('6', '3', '12', '20655', '2676', '0'), +('6', '3', '12', '2336', '1012', '0'), +('6', '3', '18', '4410', '1142', '0'), +('6', '3', '18', '2292', '986', '0'), +('6', '3', '18', '3806', '443', '0'), +('6', '3', '18', '2461', '337', '0'), +('6', '3', '19', '68239', '2032', '0'), +('6', '3', '19', '1368', '2016', '0'), +('6', '3', '19', '2293', '1344', '0'), +('6', '3', '19', '4407', '386', '0'), +('6', '3', '13', '6411', '5491', '0'), +('6', '3', '13', '11683', '5333', '0'), +('6', '3', '13', '10333', '5300', '0'), +('6', '3', '13', '11563', '4219', '0'), +('6', '3', '14', '10333', '5300', '0'), +('6', '3', '14', '10334', '3503', '0'), +('6', '3', '14', '14762', '2204', '0'), +('6', '3', '14', '13168', '2090', '0'), +('6', '3', '11', '14762', '2204', '0'), +('6', '3', '11', '20677', '450', '0'), +('6', '3', '11', '9246', '374', '0'), +('6', '3', '11', '13390', '150', '0'), +('6', '4', '22', '9246', '0', '0'), +('6', '4', '22', '10323', '0', '0'), +('6', '4', '22', '44492', '0', '0'), +('6', '4', '22', '13101', '0', '0'), +('6', '4', '1', '12801', '4762', '0'), +('6', '4', '1', '14702', '3750', '0'), +('6', '4', '1', '14701', '2862', '0'), +('6', '4', '1', '30361', '2640', '0'), +('6', '4', '2', '10143', '5368', '0'), +('6', '4', '2', '30363', '3700', '0'), +('6', '4', '2', '3000', '2534', '0'), +('6', '4', '2', '2294', '2137', '0'), +('6', '4', '3', '2706', '1742', '0'), +('6', '4', '3', '2295', '1115', '0'), +('6', '4', '3', '14706', '990', '0'), +('6', '4', '3', '14705', '990', '0'), +('6', '4', '5', '14703', '6050', '0'), +('6', '4', '5', '14700', '3318', '0'), +('6', '4', '5', '30362', '3140', '0'), +('6', '4', '5', '10055', '2780', '0'), +('6', '4', '8', '11603', '8745', '0'), +('6', '4', '8', '2349', '3554', '0'), +('6', '4', '8', '1363', '2510', '0'), +('6', '4', '8', '2287', '1546', '0'), +('6', '4', '6', '1557', '5310', '0'), +('6', '4', '6', '2705', '5234', '0'), +('6', '4', '6', '1401', '2174', '0'), +('6', '4', '6', '2286', '1986', '0'), +('6', '4', '17', '2285', '9560', '0'), +('6', '4', '17', '3802', '1091', '0'), +('6', '4', '17', '4342', '610', '0'), +('6', '4', '17', '3305', '403', '0'), +('6', '4', '7', '31809', '2693', '0'), +('6', '4', '7', '1362', '2624', '0'), +('6', '4', '7', '1321', '1746', '0'), +('6', '4', '7', '2289', '1523', '0'), +('6', '4', '9', '3804', '2385', '0'), +('6', '4', '9', '4344', '2051', '0'), +('6', '4', '9', '10408', '2002', '0'), +('6', '4', '9', '14650', '1662', '0'), +('6', '4', '15', '10150', '3004', '0'), +('6', '4', '15', '10163', '2300', '0'), +('6', '4', '15', '14651', '2224', '0'), +('6', '4', '15', '30360', '1600', '0'), +('6', '4', '20', '11666', '8295', '0'), +('6', '4', '20', '11684', '7923', '0'), +('6', '4', '20', '2742', '5079', '0'), +('6', '4', '20', '2288', '4478', '0'), +('6', '4', '12', '2291', '3830', '0'), +('6', '4', '12', '2923', '3074', '0'), +('6', '4', '12', '20655', '2701', '0'), +('6', '4', '12', '2336', '1012', '0'), +('6', '4', '18', '4410', '1142', '0'), +('6', '4', '18', '2292', '1034', '0'), +('6', '4', '18', '3806', '504', '0'), +('6', '4', '18', '2461', '386', '0'), +('6', '4', '19', '68239', '2068', '0'), +('6', '4', '19', '1368', '2016', '0'), +('6', '4', '19', '2293', '1380', '0'), +('6', '4', '19', '4407', '495', '0'), +('6', '4', '13', '6411', '5600', '0'), +('6', '4', '13', '11683', '5442', '0'), +('6', '4', '13', '10333', '5300', '0'), +('6', '4', '13', '11563', '4292', '0'), +('6', '4', '14', '10333', '5300', '0'), +('6', '4', '14', '10334', '3503', '0'), +('6', '4', '14', '14762', '2204', '0'), +('6', '4', '14', '13168', '2090', '0'), +('6', '4', '11', '14762', '2204', '0'), +('6', '4', '11', '9246', '495', '0'), +('6', '4', '11', '20677', '450', '0'), +('6', '4', '11', '13390', '150', '0'), +('6', '5', '22', '9246', '0', '0'), +('6', '5', '22', '10323', '0', '0'), +('6', '5', '22', '44492', '0', '0'), +('6', '5', '22', '13101', '0', '0'), +('6', '5', '1', '12801', '4762', '0'), +('6', '5', '1', '14702', '3750', '0'), +('6', '5', '1', '14701', '2862', '0'), +('6', '5', '1', '30361', '2640', '0'), +('6', '5', '2', '10143', '5368', '0'), +('6', '5', '2', '30363', '3700', '0'), +('6', '5', '2', '3000', '2534', '0'), +('6', '5', '2', '2294', '2161', '0'), +('6', '5', '3', '2706', '1862', '0'), +('6', '5', '3', '2295', '1139', '0'), +('6', '5', '3', '14706', '990', '0'), +('6', '5', '3', '14705', '990', '0'), +('6', '5', '5', '14703', '6050', '0'), +('6', '5', '5', '14700', '3318', '0'), +('6', '5', '5', '30362', '3140', '0'), +('6', '5', '5', '10055', '2780', '0'), +('6', '5', '8', '11603', '8854', '0'), +('6', '5', '8', '2349', '3554', '0'), +('6', '5', '8', '1363', '2510', '0'), +('6', '5', '8', '2287', '1548', '0'), +('6', '5', '6', '1557', '5310', '0'), +('6', '5', '6', '2705', '5283', '0'), +('6', '5', '6', '1401', '2174', '0'), +('6', '5', '6', '2286', '1988', '0'), +('6', '5', '17', '2285', '9608', '0'), +('6', '5', '17', '3802', '1250', '0'), +('6', '5', '17', '4342', '731', '0'), +('6', '5', '17', '3305', '403', '0'), +('6', '5', '7', '31809', '2730', '0'), +('6', '5', '7', '1362', '2624', '0'), +('6', '5', '7', '1321', '1746', '0'), +('6', '5', '7', '2289', '1572', '0'), +('6', '5', '9', '3804', '2494', '0'), +('6', '5', '9', '4344', '2051', '0'), +('6', '5', '9', '10408', '2002', '0'), +('6', '5', '9', '14650', '1662', '0'), +('6', '5', '15', '10150', '3004', '0'), +('6', '5', '15', '10163', '2300', '0'), +('6', '5', '15', '14651', '2224', '0'), +('6', '5', '15', '30360', '1600', '0'), +('6', '5', '20', '11666', '8297', '0'), +('6', '5', '20', '11684', '8019', '0'), +('6', '5', '20', '2742', '5082', '0'), +('6', '5', '20', '2288', '4478', '0'), +('6', '5', '12', '2291', '3830', '0'), +('6', '5', '12', '2923', '3074', '0'), +('6', '5', '12', '20655', '2725', '0'), +('6', '5', '12', '2336', '1012', '0'), +('6', '5', '18', '4410', '1142', '0'), +('6', '5', '18', '2292', '1083', '0'), +('6', '5', '18', '3806', '564', '0'), +('6', '5', '18', '2461', '434', '0'), +('6', '5', '19', '68239', '2105', '0'), +('6', '5', '19', '1368', '2016', '0'), +('6', '5', '19', '2293', '1416', '0'), +('6', '5', '19', '4407', '604', '0'), +('6', '5', '13', '6411', '5709', '0'), +('6', '5', '13', '11683', '5551', '0'), +('6', '5', '13', '10333', '5300', '0'), +('6', '5', '13', '11563', '4364', '0'), +('6', '5', '14', '10333', '5300', '0'), +('6', '5', '14', '10334', '3503', '0'), +('6', '5', '14', '14762', '2204', '0'), +('6', '5', '14', '14555', '2203', '0'), +('6', '5', '11', '14762', '2204', '0'), +('6', '5', '11', '9246', '616', '0'), +('6', '5', '11', '20677', '450', '0'), +('6', '5', '11', '13390', '150', '0'), +('6', '6', '22', '9246', '0', '0'), +('6', '6', '22', '10323', '0', '0'), +('6', '6', '22', '44492', '0', '0'), +('6', '6', '22', '13101', '0', '0'), +('6', '6', '1', '12801', '4762', '0'), +('6', '6', '1', '14702', '3750', '0'), +('6', '6', '1', '14701', '2862', '0'), +('6', '6', '1', '30361', '2640', '0'), +('6', '6', '2', '10143', '5368', '0'), +('6', '6', '2', '30363', '3700', '0'), +('6', '6', '2', '3000', '2534', '0'), +('6', '6', '2', '2294', '2185', '0'), +('6', '6', '3', '2706', '1983', '0'), +('6', '6', '3', '2295', '1163', '0'), +('6', '6', '3', '11052', '1087', '0'), +('6', '6', '3', '14705', '990', '0'), +('6', '6', '5', '14703', '6050', '0'), +('6', '6', '5', '14700', '3318', '0'), +('6', '6', '5', '30362', '3140', '0'), +('6', '6', '5', '10055', '2780', '0'), +('6', '6', '8', '11603', '8963', '0'), +('6', '6', '8', '2349', '3554', '0'), +('6', '6', '8', '1363', '2510', '0'), +('6', '6', '8', '2287', '1551', '0'), +('6', '6', '6', '2705', '5331', '0'), +('6', '6', '6', '1557', '5310', '0'), +('6', '6', '6', '1401', '2174', '0'), +('6', '6', '6', '2286', '1989', '0'), +('6', '6', '17', '2285', '9656', '0'), +('6', '6', '17', '3802', '1410', '0'), +('6', '6', '17', '4342', '852', '0'), +('6', '6', '17', '2405', '428', '0'), +('6', '6', '7', '31809', '2766', '0'), +('6', '6', '7', '1362', '2624', '0'), +('6', '6', '7', '1321', '1746', '0'), +('6', '6', '7', '2289', '1620', '0'), +('6', '6', '9', '3804', '2603', '0'), +('6', '6', '9', '4344', '2051', '0'), +('6', '6', '9', '10408', '2002', '0'), +('6', '6', '9', '1541', '1697', '0'), +('6', '6', '15', '10150', '3004', '0'), +('6', '6', '15', '10163', '2300', '0'), +('6', '6', '15', '14651', '2224', '0'), +('6', '6', '15', '30360', '1600', '0'), +('6', '6', '20', '11666', '8300', '0'), +('6', '6', '20', '11684', '8116', '0'), +('6', '6', '20', '2742', '5085', '0'), +('6', '6', '20', '2288', '4478', '0'), +('6', '6', '12', '2291', '3830', '0'), +('6', '6', '12', '2923', '3074', '0'), +('6', '6', '12', '20655', '2750', '0'), +('6', '6', '12', '2336', '1012', '0'), +('6', '6', '18', '4410', '1142', '0'), +('6', '6', '18', '2292', '1131', '0'), +('6', '6', '18', '3806', '624', '0'), +('6', '6', '18', '2461', '482', '0'), +('6', '6', '19', '68239', '2141', '0'), +('6', '6', '19', '1368', '2016', '0'), +('6', '6', '19', '2293', '1452', '0'), +('6', '6', '19', '4407', '713', '0'), +('6', '6', '13', '6411', '5817', '0'), +('6', '6', '13', '11683', '5659', '0'), +('6', '6', '13', '10333', '5300', '0'), +('6', '6', '13', '11563', '4437', '0'), +('6', '6', '14', '10333', '5300', '0'), +('6', '6', '14', '10334', '3503', '0'), +('6', '6', '14', '14555', '2445', '0'), +('6', '6', '14', '14762', '2204', '0'), +('6', '6', '11', '14762', '2204', '0'), +('6', '6', '11', '9246', '737', '0'), +('6', '6', '11', '20677', '450', '0'), +('6', '6', '11', '13390', '150', '0'), +('6', '7', '22', '9246', '0', '0'), +('6', '7', '22', '10323', '0', '0'), +('6', '7', '22', '44492', '0', '0'), +('6', '7', '22', '13101', '0', '0'), +('6', '7', '1', '12801', '4762', '0'), +('6', '7', '1', '14702', '3750', '0'), +('6', '7', '1', '14701', '2862', '0'), +('6', '7', '1', '30361', '2640', '0'), +('6', '7', '2', '10143', '5368', '0'), +('6', '7', '2', '30363', '3700', '0'), +('6', '7', '2', '3000', '2534', '0'), +('6', '7', '2', '2294', '2209', '0'), +('6', '7', '3', '2706', '2104', '0'), +('6', '7', '3', '11052', '1268', '0'), +('6', '7', '3', '2295', '1187', '0'), +('6', '7', '3', '14705', '990', '0'), +('6', '7', '5', '14703', '6050', '0'), +('6', '7', '5', '14700', '3318', '0'), +('6', '7', '5', '30362', '3140', '0'), +('6', '7', '5', '10055', '2780', '0'), +('6', '7', '8', '11603', '9071', '0'), +('6', '7', '8', '2349', '3554', '0'), +('6', '7', '8', '1363', '2510', '0'), +('6', '7', '8', '2287', '1553', '0'), +('6', '7', '6', '2705', '5379', '0'), +('6', '7', '6', '1557', '5310', '0'), +('6', '7', '6', '1401', '2174', '0'), +('6', '7', '6', '2286', '1991', '0'), +('6', '7', '17', '2285', '9705', '0'), +('6', '7', '17', '3802', '1570', '0'), +('6', '7', '17', '4342', '972', '0'), +('6', '7', '17', '2405', '490', '0'), +('6', '7', '7', '31809', '2802', '0'), +('6', '7', '7', '1362', '2624', '0'), +('6', '7', '7', '1321', '1746', '0'), +('6', '7', '7', '2289', '1668', '0'), +('6', '7', '9', '3804', '2711', '0'), +('6', '7', '9', '4344', '2051', '0'), +('6', '7', '9', '10408', '2002', '0'), +('6', '7', '9', '1541', '1818', '0'), +('6', '7', '15', '10150', '3004', '0'), +('6', '7', '15', '10163', '2300', '0'), +('6', '7', '15', '14651', '2224', '0'), +('6', '7', '15', '30360', '1600', '0'), +('6', '7', '20', '11666', '8302', '0'), +('6', '7', '20', '11684', '8213', '0'), +('6', '7', '20', '2742', '5088', '0'), +('6', '7', '20', '2288', '4478', '0'), +('6', '7', '12', '2291', '3830', '0'), +('6', '7', '12', '2923', '3074', '0'), +('6', '7', '12', '20655', '2775', '0'), +('6', '7', '12', '2336', '1012', '0'), +('6', '7', '18', '2292', '1179', '0'), +('6', '7', '18', '4410', '1142', '0'), +('6', '7', '18', '3806', '685', '0'), +('6', '7', '18', '2461', '531', '0'), +('6', '7', '19', '68239', '2177', '0'), +('6', '7', '19', '1368', '2016', '0'), +('6', '7', '19', '2293', '1489', '0'), +('6', '7', '19', '4407', '821', '0'), +('6', '7', '13', '6411', '5926', '0'), +('6', '7', '13', '11683', '5768', '0'), +('6', '7', '13', '10333', '5300', '0'), +('6', '7', '13', '11563', '4509', '0'), +('6', '7', '14', '10333', '5300', '0'), +('6', '7', '14', '10334', '3503', '0'), +('6', '7', '14', '14555', '2686', '0'), +('6', '7', '14', '9690', '2450', '0'), +('6', '7', '11', '14762', '2204', '0'), +('6', '7', '11', '9246', '858', '0'), +('6', '7', '11', '20677', '450', '0'), +('6', '7', '11', '16941', '169', '0'), +('6', '8', '22', '9246', '0', '0'), +('6', '8', '22', '10323', '0', '0'), +('6', '8', '22', '44492', '0', '0'), +('6', '8', '22', '13101', '0', '0'), +('6', '8', '1', '12801', '4762', '0'), +('6', '8', '1', '14702', '3750', '0'), +('6', '8', '1', '14701', '2862', '0'), +('6', '8', '1', '30361', '2640', '0'), +('6', '8', '2', '10143', '5368', '0'), +('6', '8', '2', '30363', '3700', '0'), +('6', '8', '2', '3000', '2534', '0'), +('6', '8', '2', '2294', '2233', '0'), +('6', '8', '3', '2706', '2225', '0'), +('6', '8', '3', '11052', '1450', '0'), +('6', '8', '3', '2295', '1211', '0'), +('6', '8', '3', '14705', '990', '0'), +('6', '8', '5', '14703', '6050', '0'), +('6', '8', '5', '14700', '3318', '0'), +('6', '8', '5', '30362', '3140', '0'), +('6', '8', '5', '10055', '2780', '0'), +('6', '8', '8', '11603', '9180', '0'), +('6', '8', '8', '2349', '3554', '0'), +('6', '8', '8', '1363', '2510', '0'), +('6', '8', '8', '2287', '1556', '0'), +('6', '8', '6', '2705', '5428', '0'), +('6', '8', '6', '1557', '5310', '0'), +('6', '8', '6', '1401', '2174', '0'), +('6', '8', '6', '2286', '1992', '0'), +('6', '8', '17', '2285', '9753', '0'), +('6', '8', '17', '3802', '1730', '0'), +('6', '8', '17', '4342', '1093', '0'), +('6', '8', '17', '2405', '551', '0'), +('6', '8', '7', '31809', '2838', '0'), +('6', '8', '7', '1362', '2624', '0'), +('6', '8', '7', '1321', '1746', '0'), +('6', '8', '7', '2289', '1717', '0'), +('6', '8', '9', '3804', '2820', '0'), +('6', '8', '9', '4344', '2051', '0'), +('6', '8', '9', '10408', '2002', '0'), +('6', '8', '9', '1541', '1939', '0'), +('6', '8', '15', '10150', '3004', '0'), +('6', '8', '15', '10163', '2300', '0'), +('6', '8', '15', '14651', '2224', '0'), +('6', '8', '15', '30360', '1600', '0'), +('6', '8', '20', '11684', '8309', '0'), +('6', '8', '20', '11666', '8304', '0'), +('6', '8', '20', '2742', '5091', '0'), +('6', '8', '20', '2288', '4478', '0'), +('6', '8', '12', '2291', '3830', '0'), +('6', '8', '12', '2923', '3074', '0'), +('6', '8', '12', '20655', '2800', '0'), +('6', '8', '12', '2336', '1012', '0'), +('6', '8', '18', '2292', '1228', '0'), +('6', '8', '18', '4410', '1142', '0'), +('6', '8', '18', '3806', '745', '0'), +('6', '8', '18', '2461', '579', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '8', '19', '68239', '2213', '0'), +('6', '8', '19', '1368', '2016', '0'), +('6', '8', '19', '2293', '1525', '0'), +('6', '8', '19', '4407', '930', '0'), +('6', '8', '13', '6411', '6035', '0'), +('6', '8', '13', '11683', '5877', '0'), +('6', '8', '13', '10333', '5300', '0'), +('6', '8', '13', '11563', '4582', '0'), +('6', '8', '14', '10333', '5300', '0'), +('6', '8', '14', '10334', '3503', '0'), +('6', '8', '14', '14555', '2928', '0'), +('6', '8', '14', '9690', '2800', '0'), +('6', '8', '11', '14762', '2204', '0'), +('6', '8', '11', '9246', '978', '0'), +('6', '8', '11', '20677', '450', '0'), +('6', '8', '11', '16941', '193', '0'), +('6', '9', '22', '9246', '0', '0'), +('6', '9', '22', '10323', '0', '0'), +('6', '9', '22', '44492', '0', '0'), +('6', '9', '22', '13101', '0', '0'), +('6', '9', '1', '12801', '4762', '0'), +('6', '9', '1', '14702', '3750', '0'), +('6', '9', '1', '14701', '2862', '0'), +('6', '9', '1', '30361', '2640', '0'), +('6', '9', '2', '10143', '5368', '0'), +('6', '9', '2', '30363', '3700', '0'), +('6', '9', '2', '3000', '2534', '0'), +('6', '9', '2', '2294', '2257', '0'), +('6', '9', '3', '2706', '2346', '0'), +('6', '9', '3', '11052', '1631', '0'), +('6', '9', '3', '2295', '1236', '0'), +('6', '9', '3', '14705', '990', '0'), +('6', '9', '5', '14703', '6050', '0'), +('6', '9', '5', '14700', '3318', '0'), +('6', '9', '5', '30362', '3140', '0'), +('6', '9', '5', '10055', '2780', '0'), +('6', '9', '8', '11603', '9289', '0'), +('6', '9', '8', '2349', '3554', '0'), +('6', '9', '8', '1363', '2510', '0'), +('6', '9', '8', '2287', '1558', '0'), +('6', '9', '6', '2705', '5476', '0'), +('6', '9', '6', '1557', '5310', '0'), +('6', '9', '6', '1401', '2174', '0'), +('6', '9', '6', '2286', '1994', '0'), +('6', '9', '17', '2285', '9801', '0'), +('6', '9', '17', '3802', '1889', '0'), +('6', '9', '17', '4342', '1214', '0'), +('6', '9', '17', '2405', '612', '0'), +('6', '9', '7', '31809', '2874', '0'), +('6', '9', '7', '1362', '2624', '0'), +('6', '9', '7', '2289', '1765', '0'), +('6', '9', '7', '1321', '1746', '0'), +('6', '9', '9', '3804', '2929', '0'), +('6', '9', '9', '1541', '2060', '0'), +('6', '9', '9', '4344', '2051', '0'), +('6', '9', '9', '10408', '2002', '0'), +('6', '9', '15', '10150', '3004', '0'), +('6', '9', '15', '10163', '2300', '0'), +('6', '9', '15', '14651', '2224', '0'), +('6', '9', '15', '30360', '1600', '0'), +('6', '9', '20', '11684', '8406', '0'), +('6', '9', '20', '11666', '8306', '0'), +('6', '9', '20', '2742', '5094', '0'), +('6', '9', '20', '2288', '4478', '0'), +('6', '9', '12', '2291', '3830', '0'), +('6', '9', '12', '2923', '3074', '0'), +('6', '9', '12', '20655', '2824', '0'), +('6', '9', '12', '2336', '1012', '0'), +('6', '9', '18', '2292', '1276', '0'), +('6', '9', '18', '4410', '1142', '0'), +('6', '9', '18', '3806', '806', '0'), +('6', '9', '18', '2461', '627', '0'), +('6', '9', '19', '68239', '2250', '0'), +('6', '9', '19', '1368', '2016', '0'), +('6', '9', '19', '2293', '1561', '0'), +('6', '9', '19', '4407', '1039', '0'), +('6', '9', '13', '6411', '6143', '0'), +('6', '9', '13', '11683', '5986', '0'), +('6', '9', '13', '10333', '5300', '0'), +('6', '9', '13', '11563', '4654', '0'), +('6', '9', '14', '10333', '5300', '0'), +('6', '9', '14', '10334', '3503', '0'), +('6', '9', '14', '14555', '3170', '0'), +('6', '9', '14', '9690', '3150', '0'), +('6', '9', '11', '14762', '2204', '0'), +('6', '9', '11', '9246', '1099', '0'), +('6', '9', '11', '20677', '450', '0'), +('6', '9', '11', '16941', '217', '0'), +('6', '10', '22', '9246', '0', '0'), +('6', '10', '22', '10323', '0', '0'), +('6', '10', '22', '44492', '0', '0'), +('6', '10', '22', '13101', '0', '0'), +('6', '10', '1', '12801', '4762', '0'), +('6', '10', '1', '14702', '3750', '0'), +('6', '10', '1', '14701', '2862', '0'), +('6', '10', '1', '30361', '2640', '0'), +('6', '10', '2', '10143', '5368', '0'), +('6', '10', '2', '30363', '3700', '0'), +('6', '10', '2', '3000', '2534', '0'), +('6', '10', '2', '2294', '2281', '0'), +('6', '10', '3', '2706', '2466', '0'), +('6', '10', '3', '11052', '1812', '0'), +('6', '10', '3', '2295', '1260', '0'), +('6', '10', '3', '14705', '990', '0'), +('6', '10', '5', '14703', '6050', '0'), +('6', '10', '5', '14700', '3318', '0'), +('6', '10', '5', '30362', '3140', '0'), +('6', '10', '5', '10055', '2780', '0'), +('6', '10', '8', '11603', '9398', '0'), +('6', '10', '8', '2349', '3554', '0'), +('6', '10', '8', '1363', '2510', '0'), +('6', '10', '8', '2287', '1560', '0'), +('6', '10', '6', '2705', '5524', '0'), +('6', '10', '6', '1557', '5310', '0'), +('6', '10', '6', '1401', '2174', '0'), +('6', '10', '6', '2286', '1995', '0'), +('6', '10', '17', '2285', '9850', '0'), +('6', '10', '17', '3802', '2049', '0'), +('6', '10', '17', '4342', '1335', '0'), +('6', '10', '17', '2405', '673', '0'), +('6', '10', '7', '31809', '2911', '0'), +('6', '10', '7', '1362', '2624', '0'), +('6', '10', '7', '2289', '1813', '0'), +('6', '10', '7', '1321', '1746', '0'), +('6', '10', '9', '3804', '3037', '0'), +('6', '10', '9', '1541', '2180', '0'), +('6', '10', '9', '4344', '2051', '0'), +('6', '10', '9', '10408', '2002', '0'), +('6', '10', '15', '10150', '3004', '0'), +('6', '10', '15', '10163', '2300', '0'), +('6', '10', '15', '14651', '2224', '0'), +('6', '10', '15', '30360', '1600', '0'), +('6', '10', '20', '11684', '8503', '0'), +('6', '10', '20', '11666', '8308', '0'), +('6', '10', '20', '2742', '5097', '0'), +('6', '10', '20', '2288', '4478', '0'), +('6', '10', '12', '2291', '3830', '0'), +('6', '10', '12', '2923', '3074', '0'), +('6', '10', '12', '20655', '2849', '0'), +('6', '10', '12', '2336', '1012', '0'), +('6', '10', '18', '2292', '1324', '0'), +('6', '10', '18', '4410', '1142', '0'), +('6', '10', '18', '3806', '866', '0'), +('6', '10', '18', '2461', '675', '0'), +('6', '10', '19', '68239', '2286', '0'), +('6', '10', '19', '1368', '2016', '0'), +('6', '10', '19', '2293', '1597', '0'), +('6', '10', '19', '4407', '1147', '0'), +('6', '10', '13', '6411', '6252', '0'), +('6', '10', '13', '11683', '6094', '0'), +('6', '10', '13', '10333', '5300', '0'), +('6', '10', '13', '11563', '4726', '0'), +('6', '10', '14', '10333', '5300', '0'), +('6', '10', '14', '10334', '3503', '0'), +('6', '10', '14', '9690', '3500', '0'), +('6', '10', '14', '14555', '3411', '0'), +('6', '10', '11', '14762', '2204', '0'), +('6', '10', '11', '9246', '1220', '0'), +('6', '10', '11', '20677', '450', '0'), +('6', '10', '11', '16941', '242', '0'), +('6', '11', '22', '9246', '0', '0'), +('6', '11', '22', '10323', '0', '0'), +('6', '11', '22', '44492', '0', '0'), +('6', '11', '22', '13101', '0', '0'), +('6', '11', '1', '12801', '4762', '0'), +('6', '11', '1', '14702', '3750', '0'), +('6', '11', '1', '14701', '2862', '0'), +('6', '11', '1', '30361', '2640', '0'), +('6', '11', '2', '10143', '5368', '0'), +('6', '11', '2', '30363', '3700', '0'), +('6', '11', '2', '3000', '2534', '0'), +('6', '11', '2', '2294', '2306', '0'), +('6', '11', '3', '2706', '2587', '0'), +('6', '11', '3', '11052', '1993', '0'), +('6', '11', '3', '2295', '1284', '0'), +('6', '11', '3', '14705', '990', '0'), +('6', '11', '5', '14703', '6050', '0'), +('6', '11', '5', '14700', '3318', '0'), +('6', '11', '5', '30362', '3140', '0'), +('6', '11', '5', '10055', '2780', '0'), +('6', '11', '8', '11603', '9506', '0'), +('6', '11', '8', '2349', '3554', '0'), +('6', '11', '8', '1363', '2510', '0'), +('6', '11', '8', '2287', '1563', '0'), +('6', '11', '6', '2705', '5573', '0'), +('6', '11', '6', '1557', '5310', '0'), +('6', '11', '6', '1401', '2174', '0'), +('6', '11', '6', '2286', '1997', '0'), +('6', '11', '17', '2285', '9898', '0'), +('6', '11', '17', '3802', '2209', '0'), +('6', '11', '17', '4342', '1456', '0'), +('6', '11', '17', '2405', '735', '0'), +('6', '11', '7', '31809', '2947', '0'), +('6', '11', '7', '1362', '2624', '0'), +('6', '11', '7', '2289', '1862', '0'), +('6', '11', '7', '1321', '1746', '0'), +('6', '11', '9', '3804', '3146', '0'), +('6', '11', '9', '1541', '2301', '0'), +('6', '11', '9', '4344', '2051', '0'), +('6', '11', '9', '10408', '2002', '0'), +('6', '11', '15', '10150', '3004', '0'), +('6', '11', '15', '10163', '2300', '0'), +('6', '11', '15', '14651', '2224', '0'), +('6', '11', '15', '30360', '1600', '0'), +('6', '11', '20', '11684', '8599', '0'), +('6', '11', '20', '11666', '8310', '0'), +('6', '11', '20', '2742', '5100', '0'), +('6', '11', '20', '2288', '4478', '0'), +('6', '11', '12', '2291', '3830', '0'), +('6', '11', '12', '2923', '3074', '0'), +('6', '11', '12', '20655', '2874', '0'), +('6', '11', '12', '4345', '1037', '0'), +('6', '11', '18', '2292', '1373', '0'), +('6', '11', '18', '4410', '1142', '0'), +('6', '11', '18', '3806', '926', '0'), +('6', '11', '18', '2461', '724', '0'), +('6', '11', '19', '68239', '2322', '0'), +('6', '11', '19', '1368', '2016', '0'), +('6', '11', '19', '2293', '1634', '0'), +('6', '11', '19', '4407', '1256', '0'), +('6', '11', '13', '6411', '6361', '0'), +('6', '11', '13', '11683', '6203', '0'), +('6', '11', '13', '10333', '5300', '0'), +('6', '11', '13', '11563', '4799', '0'), +('6', '11', '14', '10333', '5300', '0'), +('6', '11', '14', '14555', '3653', '0'), +('6', '11', '14', '10334', '3503', '0'), +('6', '11', '14', '9690', '3500', '0'), +('6', '11', '11', '14762', '2204', '0'), +('6', '11', '11', '9246', '1341', '0'), +('6', '11', '11', '20677', '450', '0'), +('6', '11', '11', '16941', '266', '0'), +('6', '12', '22', '9246', '0', '0'), +('6', '12', '22', '10323', '0', '0'), +('6', '12', '22', '44492', '0', '0'), +('6', '12', '22', '13101', '0', '0'), +('6', '12', '1', '12801', '4762', '0'), +('6', '12', '1', '14702', '3750', '0'), +('6', '12', '1', '14701', '2862', '0'), +('6', '12', '1', '30361', '2640', '0'), +('6', '12', '2', '10143', '5368', '0'), +('6', '12', '2', '30363', '3700', '0'), +('6', '12', '2', '3000', '2534', '0'), +('6', '12', '2', '2294', '2330', '0'), +('6', '12', '3', '2706', '2708', '0'), +('6', '12', '3', '11052', '2174', '0'), +('6', '12', '3', '2295', '1308', '0'), +('6', '12', '3', '4505', '1045', '0'), +('6', '12', '5', '14703', '6050', '0'), +('6', '12', '5', '14700', '3318', '0'), +('6', '12', '5', '30362', '3140', '0'), +('6', '12', '5', '10055', '2780', '0'), +('6', '12', '8', '11603', '9615', '0'), +('6', '12', '8', '2349', '3554', '0'), +('6', '12', '8', '1363', '2510', '0'), +('6', '12', '8', '2287', '1565', '0'), +('6', '12', '6', '2705', '5621', '0'), +('6', '12', '6', '1557', '5310', '0'), +('6', '12', '6', '1401', '2174', '0'), +('6', '12', '6', '2286', '1998', '0'), +('6', '12', '17', '2285', '9946', '0'), +('6', '12', '17', '3802', '2369', '0'), +('6', '12', '17', '4342', '1576', '0'), +('6', '12', '17', '2405', '796', '0'), +('6', '12', '7', '31809', '2983', '0'), +('6', '12', '7', '1362', '2624', '0'), +('6', '12', '7', '2289', '1910', '0'), +('6', '12', '7', '1321', '1746', '0'), +('6', '12', '9', '3804', '3255', '0'), +('6', '12', '9', '1541', '2422', '0'), +('6', '12', '9', '4344', '2051', '0'), +('6', '12', '9', '10408', '2002', '0'), +('6', '12', '15', '10150', '3004', '0'), +('6', '12', '15', '10163', '2300', '0'), +('6', '12', '15', '14651', '2224', '0'), +('6', '12', '15', '30360', '1600', '0'), +('6', '12', '20', '11684', '8696', '0'), +('6', '12', '20', '11666', '8312', '0'), +('6', '12', '20', '2742', '5103', '0'), +('6', '12', '20', '2288', '4478', '0'), +('6', '12', '12', '2291', '3830', '0'), +('6', '12', '12', '2923', '3074', '0'), +('6', '12', '12', '20655', '2899', '0'), +('6', '12', '12', '4345', '1097', '0'), +('6', '12', '18', '2292', '1421', '0'), +('6', '12', '18', '4410', '1142', '0'), +('6', '12', '18', '3806', '987', '0'), +('6', '12', '18', '2461', '772', '0'), +('6', '12', '19', '68239', '2358', '0'), +('6', '12', '19', '1368', '2016', '0'), +('6', '12', '19', '2293', '1670', '0'), +('6', '12', '19', '4407', '1365', '0'), +('6', '12', '13', '6411', '6470', '0'), +('6', '12', '13', '11683', '6312', '0'), +('6', '12', '13', '10333', '5300', '0'), +('6', '12', '13', '11563', '4871', '0'), +('6', '12', '14', '10333', '5300', '0'), +('6', '12', '14', '14555', '3894', '0'), +('6', '12', '14', '10334', '3503', '0'), +('6', '12', '14', '9690', '3500', '0'), +('6', '12', '11', '14762', '2204', '0'), +('6', '12', '11', '9246', '1462', '0'), +('6', '12', '11', '20677', '450', '0'), +('6', '12', '11', '16941', '290', '0'), +('6', '13', '22', '9246', '0', '0'), +('6', '13', '22', '10323', '0', '0'), +('6', '13', '22', '44492', '0', '0'), +('6', '13', '22', '13101', '0', '0'), +('6', '13', '1', '12801', '4762', '0'), +('6', '13', '1', '14702', '3750', '0'), +('6', '13', '1', '14701', '2862', '0'), +('6', '13', '1', '30361', '2640', '0'), +('6', '13', '2', '10143', '5368', '0'), +('6', '13', '2', '30363', '3700', '0'), +('6', '13', '2', '3000', '2534', '0'), +('6', '13', '2', '2294', '2354', '0'), +('6', '13', '3', '2706', '2829', '0'), +('6', '13', '3', '11052', '2356', '0'), +('6', '13', '3', '2295', '1332', '0'), +('6', '13', '3', '4505', '1129', '0'), +('6', '13', '5', '14703', '6050', '0'), +('6', '13', '5', '14700', '3318', '0'), +('6', '13', '5', '30362', '3140', '0'), +('6', '13', '5', '10055', '2780', '0'), +('6', '13', '8', '11603', '9724', '0'), +('6', '13', '8', '2349', '3554', '0'), +('6', '13', '8', '1363', '2510', '0'), +('6', '13', '8', '2287', '1568', '0'), +('6', '13', '6', '2705', '5669', '0'), +('6', '13', '6', '1557', '5310', '0'), +('6', '13', '6', '1401', '2174', '0'), +('6', '13', '6', '2286', '2000', '0'), +('6', '13', '17', '2285', '9995', '0'), +('6', '13', '17', '3802', '2528', '0'), +('6', '13', '17', '4342', '1697', '0'), +('6', '13', '17', '2405', '857', '0'), +('6', '13', '7', '31809', '3019', '0'), +('6', '13', '7', '1362', '2624', '0'), +('6', '13', '7', '2289', '1958', '0'), +('6', '13', '7', '1321', '1746', '0'), +('6', '13', '9', '3804', '3364', '0'), +('6', '13', '9', '1541', '2543', '0'), +('6', '13', '9', '4344', '2051', '0'), +('6', '13', '9', '10408', '2002', '0'), +('6', '13', '15', '10150', '3004', '0'), +('6', '13', '15', '10163', '2300', '0'), +('6', '13', '15', '14651', '2224', '0'), +('6', '13', '15', '30360', '1600', '0'), +('6', '13', '20', '11684', '8793', '0'), +('6', '13', '20', '11666', '8314', '0'), +('6', '13', '20', '2742', '5106', '0'), +('6', '13', '20', '2288', '4478', '0'), +('6', '13', '12', '2291', '3830', '0'), +('6', '13', '12', '2923', '3074', '0'), +('6', '13', '12', '20655', '2923', '0'), +('6', '13', '12', '4345', '1158', '0'), +('6', '13', '18', '2292', '1469', '0'), +('6', '13', '18', '4410', '1142', '0'), +('6', '13', '18', '3806', '1047', '0'), +('6', '13', '18', '2461', '820', '0'), +('6', '13', '19', '68239', '2395', '0'), +('6', '13', '19', '1368', '2016', '0'), +('6', '13', '19', '2293', '1706', '0'), +('6', '13', '19', '4407', '1474', '0'), +('6', '13', '13', '6411', '6578', '0'), +('6', '13', '13', '11683', '6421', '0'), +('6', '13', '13', '10333', '5300', '0'), +('6', '13', '13', '11563', '4944', '0'), +('6', '13', '14', '10333', '5300', '0'), +('6', '13', '14', '14555', '4136', '0'), +('6', '13', '14', '10334', '3503', '0'), +('6', '13', '14', '9690', '3500', '0'), +('6', '13', '11', '14762', '2204', '0'), +('6', '13', '11', '9246', '1582', '0'), +('6', '13', '11', '20677', '450', '0'), +('6', '13', '11', '16941', '314', '0'), +('6', '14', '22', '9246', '0', '0'), +('6', '14', '22', '10323', '0', '0'), +('6', '14', '22', '44492', '0', '0'), +('6', '14', '22', '13101', '0', '0'), +('6', '14', '1', '12801', '4762', '0'), +('6', '14', '1', '14702', '3750', '0'), +('6', '14', '1', '14701', '2862', '0'), +('6', '14', '1', '30361', '2640', '0'), +('6', '14', '2', '10143', '5368', '0'), +('6', '14', '2', '30363', '3700', '0'), +('6', '14', '2', '3000', '2534', '0'), +('6', '14', '2', '2294', '2378', '0'), +('6', '14', '3', '2706', '2950', '0'), +('6', '14', '3', '11052', '2537', '0'), +('6', '14', '3', '2295', '1356', '0'), +('6', '14', '3', '4505', '1214', '0'), +('6', '14', '5', '14703', '6050', '0'), +('6', '14', '5', '14700', '3318', '0'), +('6', '14', '5', '30362', '3140', '0'), +('6', '14', '5', '10055', '2780', '0'), +('6', '14', '8', '11603', '9832', '0'), +('6', '14', '8', '2349', '3554', '0'), +('6', '14', '8', '1363', '2510', '0'), +('6', '14', '8', '2287', '1570', '0'), +('6', '14', '6', '2705', '5718', '0'), +('6', '14', '6', '1557', '5310', '0'), +('6', '14', '6', '1401', '2174', '0'), +('6', '14', '6', '2286', '2001', '0'), +('6', '14', '17', '2285', '10043', '0'), +('6', '14', '17', '3802', '2688', '0'), +('6', '14', '17', '4342', '1818', '0'), +('6', '14', '17', '2405', '919', '0'), +('6', '14', '7', '31809', '3056', '0'), +('6', '14', '7', '1362', '2624', '0'), +('6', '14', '7', '2289', '2007', '0'), +('6', '14', '7', '1321', '1746', '0'), +('6', '14', '9', '3804', '3472', '0'), +('6', '14', '9', '1541', '2664', '0'), +('6', '14', '9', '4344', '2051', '0'), +('6', '14', '9', '10408', '2002', '0'), +('6', '14', '15', '10150', '3004', '0'), +('6', '14', '15', '10163', '2300', '0'), +('6', '14', '15', '14651', '2224', '0'), +('6', '14', '15', '30360', '1600', '0'), +('6', '14', '20', '11684', '8889', '0'), +('6', '14', '20', '11666', '8316', '0'), +('6', '14', '20', '2742', '5109', '0'), +('6', '14', '20', '2288', '4478', '0'), +('6', '14', '12', '2291', '3830', '0'), +('6', '14', '12', '2923', '3074', '0'), +('6', '14', '12', '20655', '2948', '0'), +('6', '14', '12', '4345', '1218', '0'), +('6', '14', '18', '2292', '1518', '0'), +('6', '14', '18', '4410', '1142', '0'), +('6', '14', '18', '3806', '1108', '0'), +('6', '14', '18', '2461', '869', '0'), +('6', '14', '19', '68239', '2431', '0'), +('6', '14', '19', '1368', '2016', '0'), +('6', '14', '19', '2293', '1742', '0'), +('6', '14', '19', '4407', '1582', '0'), +('6', '14', '13', '6411', '6687', '0'), +('6', '14', '13', '11683', '6529', '0'), +('6', '14', '13', '10333', '5300', '0'), +('6', '14', '13', '11563', '5016', '0'), +('6', '14', '14', '10333', '5300', '0'), +('6', '14', '14', '14555', '4378', '0'), +('6', '14', '14', '10334', '3503', '0'), +('6', '14', '14', '9690', '3500', '0'), +('6', '14', '11', '14762', '2204', '0'), +('6', '14', '11', '9246', '1703', '0'), +('6', '14', '11', '20677', '450', '0'), +('6', '14', '11', '16941', '338', '0'), +('6', '15', '22', '9246', '0', '0'), +('6', '15', '22', '10323', '0', '0'), +('6', '15', '22', '44492', '0', '0'), +('6', '15', '22', '13101', '0', '0'), +('6', '15', '1', '12801', '4762', '0'), +('6', '15', '1', '14702', '3750', '0'), +('6', '15', '1', '14701', '2862', '0'), +('6', '15', '1', '30361', '2640', '0'), +('6', '15', '2', '10143', '5368', '0'), +('6', '15', '2', '30363', '3700', '0'), +('6', '15', '2', '3000', '2534', '0'), +('6', '15', '2', '2294', '2402', '0'), +('6', '15', '3', '2706', '3070', '0'), +('6', '15', '3', '11052', '2718', '0'), +('6', '15', '3', '2295', '1381', '0'), +('6', '15', '3', '4505', '1299', '0'), +('6', '15', '5', '14703', '6050', '0'), +('6', '15', '5', '14700', '3318', '0'), +('6', '15', '5', '30362', '3140', '0'), +('6', '15', '5', '10055', '2780', '0'), +('6', '15', '8', '11603', '9941', '0'), +('6', '15', '8', '2349', '3554', '0'), +('6', '15', '8', '1363', '2510', '0'), +('6', '15', '8', '2287', '1572', '0'), +('6', '15', '6', '2705', '5766', '0'), +('6', '15', '6', '1557', '5310', '0'), +('6', '15', '6', '1401', '2174', '0'), +('6', '15', '6', '2286', '2003', '0'), +('6', '15', '17', '2285', '10091', '0'), +('6', '15', '17', '3802', '2848', '0'), +('6', '15', '17', '4342', '1939', '0'), +('6', '15', '17', '2405', '980', '0'), +('6', '15', '7', '31809', '3092', '0'), +('6', '15', '7', '1362', '2624', '0'), +('6', '15', '7', '2289', '2055', '0'), +('6', '15', '7', '1321', '1746', '0'), +('6', '15', '9', '3804', '3581', '0'), +('6', '15', '9', '1541', '2784', '0'), +('6', '15', '9', '4344', '2051', '0'), +('6', '15', '9', '10408', '2002', '0'), +('6', '15', '15', '10150', '3004', '0'), +('6', '15', '15', '10163', '2300', '0'), +('6', '15', '15', '14651', '2224', '0'), +('6', '15', '15', '30360', '1600', '0'), +('6', '15', '20', '11684', '8986', '0'), +('6', '15', '20', '11666', '8319', '0'), +('6', '15', '20', '2742', '5112', '0'), +('6', '15', '20', '2288', '4478', '0'), +('6', '15', '12', '2291', '3830', '0'), +('6', '15', '12', '2923', '3074', '0'), +('6', '15', '12', '20655', '2973', '0'), +('6', '15', '12', '4345', '1278', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '15', '18', '2292', '1566', '0'), +('6', '15', '18', '3806', '1168', '0'), +('6', '15', '18', '4410', '1142', '0'), +('6', '15', '18', '2461', '917', '0'), +('6', '15', '19', '68239', '2467', '0'), +('6', '15', '19', '1368', '2016', '0'), +('6', '15', '19', '2293', '1779', '0'), +('6', '15', '19', '4407', '1691', '0'), +('6', '15', '13', '6411', '6796', '0'), +('6', '15', '13', '11683', '6638', '0'), +('6', '15', '13', '10333', '5300', '0'), +('6', '15', '13', '11563', '5089', '0'), +('6', '15', '14', '10333', '5300', '0'), +('6', '15', '14', '14555', '4619', '0'), +('6', '15', '14', '10334', '3503', '0'), +('6', '15', '14', '9690', '3500', '0'), +('6', '15', '11', '14762', '2204', '0'), +('6', '15', '11', '9246', '1824', '0'), +('6', '15', '11', '20677', '450', '0'), +('6', '15', '11', '16941', '362', '0'), +('6', '16', '22', '9246', '0', '0'), +('6', '16', '22', '10323', '0', '0'), +('6', '16', '22', '44492', '0', '0'), +('6', '16', '22', '13101', '0', '0'), +('6', '16', '1', '12801', '4762', '0'), +('6', '16', '1', '14702', '3750', '0'), +('6', '16', '1', '14701', '2862', '0'), +('6', '16', '1', '30361', '2640', '0'), +('6', '16', '2', '10143', '5368', '0'), +('6', '16', '2', '30363', '3700', '0'), +('6', '16', '2', '3000', '2534', '0'), +('6', '16', '2', '2294', '2426', '0'), +('6', '16', '3', '2706', '3191', '0'), +('6', '16', '3', '11052', '2899', '0'), +('6', '16', '3', '2295', '1405', '0'), +('6', '16', '3', '4505', '1383', '0'), +('6', '16', '5', '14703', '6050', '0'), +('6', '16', '5', '14700', '3318', '0'), +('6', '16', '5', '30362', '3140', '0'), +('6', '16', '5', '10055', '2780', '0'), +('6', '16', '8', '11603', '10050', '0'), +('6', '16', '8', '2349', '3554', '0'), +('6', '16', '8', '1363', '2510', '0'), +('6', '16', '8', '2287', '1575', '0'), +('6', '16', '6', '2705', '5814', '0'), +('6', '16', '6', '1557', '5310', '0'), +('6', '16', '6', '1401', '2174', '0'), +('6', '16', '6', '2286', '2004', '0'), +('6', '16', '17', '2285', '10140', '0'), +('6', '16', '17', '3802', '3008', '0'), +('6', '16', '17', '4342', '2060', '0'), +('6', '16', '17', '2405', '1041', '0'), +('6', '16', '7', '31809', '3128', '0'), +('6', '16', '7', '1362', '2624', '0'), +('6', '16', '7', '2289', '2103', '0'), +('6', '16', '7', '1321', '1746', '0'), +('6', '16', '9', '3804', '3690', '0'), +('6', '16', '9', '1541', '2905', '0'), +('6', '16', '9', '4344', '2051', '0'), +('6', '16', '9', '10408', '2002', '0'), +('6', '16', '15', '10150', '3004', '0'), +('6', '16', '15', '10163', '2300', '0'), +('6', '16', '15', '14651', '2224', '0'), +('6', '16', '15', '30360', '1600', '0'), +('6', '16', '20', '11684', '9082', '0'), +('6', '16', '20', '11666', '8321', '0'), +('6', '16', '20', '2742', '5115', '0'), +('6', '16', '20', '2288', '4478', '0'), +('6', '16', '12', '2291', '3830', '0'), +('6', '16', '12', '2923', '3074', '0'), +('6', '16', '12', '20655', '2998', '0'), +('6', '16', '12', '4345', '1339', '0'), +('6', '16', '18', '2292', '1614', '0'), +('6', '16', '18', '3806', '1228', '0'), +('6', '16', '18', '4410', '1142', '0'), +('6', '16', '18', '2461', '965', '0'), +('6', '16', '19', '68239', '2503', '0'), +('6', '16', '19', '1368', '2016', '0'), +('6', '16', '19', '2293', '1815', '0'), +('6', '16', '19', '4407', '1800', '0'), +('6', '16', '13', '6411', '6904', '0'), +('6', '16', '13', '11683', '6747', '0'), +('6', '16', '13', '10333', '5300', '0'), +('6', '16', '13', '11563', '5161', '0'), +('6', '16', '14', '10333', '5300', '0'), +('6', '16', '14', '14555', '4861', '0'), +('6', '16', '14', '10334', '3503', '0'), +('6', '16', '14', '9690', '3500', '0'), +('6', '16', '11', '14762', '2204', '0'), +('6', '16', '11', '9246', '1945', '0'), +('6', '16', '11', '20677', '450', '0'), +('6', '16', '11', '16941', '387', '0'), +('6', '17', '22', '9246', '0', '0'), +('6', '17', '22', '10323', '0', '0'), +('6', '17', '22', '44492', '0', '0'), +('6', '17', '22', '13101', '0', '0'), +('6', '17', '1', '12801', '4762', '0'), +('6', '17', '1', '14702', '3750', '0'), +('6', '17', '1', '14701', '2862', '0'), +('6', '17', '1', '30361', '2640', '0'), +('6', '17', '2', '10143', '5368', '0'), +('6', '17', '2', '30363', '3700', '0'), +('6', '17', '2', '3000', '2534', '0'), +('6', '17', '2', '2294', '2451', '0'), +('6', '17', '3', '2706', '3312', '0'), +('6', '17', '3', '11052', '3080', '0'), +('6', '17', '3', '4505', '1468', '0'), +('6', '17', '3', '14695', '1446', '0'), +('6', '17', '5', '14703', '6050', '0'), +('6', '17', '5', '14700', '3318', '0'), +('6', '17', '5', '30362', '3140', '0'), +('6', '17', '5', '10055', '2780', '0'), +('6', '17', '8', '11603', '10159', '0'), +('6', '17', '8', '2349', '3554', '0'), +('6', '17', '8', '1363', '2510', '0'), +('6', '17', '8', '2287', '1577', '0'), +('6', '17', '6', '2705', '5863', '0'), +('6', '17', '6', '1557', '5310', '0'), +('6', '17', '6', '1401', '2174', '0'), +('6', '17', '6', '2286', '2006', '0'), +('6', '17', '17', '2285', '10188', '0'), +('6', '17', '17', '3802', '3167', '0'), +('6', '17', '17', '4342', '2180', '0'), +('6', '17', '17', '2405', '1103', '0'), +('6', '17', '7', '31809', '3164', '0'), +('6', '17', '7', '1362', '2624', '0'), +('6', '17', '7', '2289', '2152', '0'), +('6', '17', '7', '1321', '1746', '0'), +('6', '17', '9', '3804', '3798', '0'), +('6', '17', '9', '1541', '3026', '0'), +('6', '17', '9', '4344', '2051', '0'), +('6', '17', '9', '10408', '2002', '0'), +('6', '17', '15', '10150', '3004', '0'), +('6', '17', '15', '10163', '2300', '0'), +('6', '17', '15', '14651', '2224', '0'), +('6', '17', '15', '30360', '1600', '0'), +('6', '17', '20', '11684', '9179', '0'), +('6', '17', '20', '11666', '8323', '0'), +('6', '17', '20', '2742', '5118', '0'), +('6', '17', '20', '2288', '4478', '0'), +('6', '17', '12', '2291', '3830', '0'), +('6', '17', '12', '2923', '3074', '0'), +('6', '17', '12', '20655', '3022', '0'), +('6', '17', '12', '4345', '1399', '0'), +('6', '17', '18', '2292', '1663', '0'), +('6', '17', '18', '3806', '1289', '0'), +('6', '17', '18', '4410', '1142', '0'), +('6', '17', '18', '2461', '1014', '0'), +('6', '17', '19', '68239', '2540', '0'), +('6', '17', '19', '1368', '2016', '0'), +('6', '17', '19', '4407', '1908', '0'), +('6', '17', '19', '2293', '1851', '0'), +('6', '17', '13', '6411', '7013', '0'), +('6', '17', '13', '11683', '6855', '0'), +('6', '17', '13', '10333', '5300', '0'), +('6', '17', '13', '11563', '5234', '0'), +('6', '17', '14', '10333', '5300', '0'), +('6', '17', '14', '14555', '5102', '0'), +('6', '17', '14', '10335', '3686', '0'), +('6', '17', '14', '10334', '3503', '0'), +('6', '17', '11', '14762', '2204', '0'), +('6', '17', '11', '9246', '2066', '0'), +('6', '17', '11', '20677', '450', '0'), +('6', '17', '11', '16941', '411', '0'), +('6', '18', '22', '9246', '0', '0'), +('6', '18', '22', '10323', '0', '0'), +('6', '18', '22', '44492', '0', '0'), +('6', '18', '22', '13101', '0', '0'), +('6', '18', '1', '12801', '4762', '0'), +('6', '18', '1', '14702', '3750', '0'), +('6', '18', '1', '14701', '2862', '0'), +('6', '18', '1', '30361', '2640', '0'), +('6', '18', '2', '10143', '5368', '0'), +('6', '18', '2', '30363', '3700', '0'), +('6', '18', '2', '3000', '2534', '0'), +('6', '18', '2', '2294', '2475', '0'), +('6', '18', '3', '2706', '3433', '0'), +('6', '18', '3', '11052', '3262', '0'), +('6', '18', '3', '4505', '1552', '0'), +('6', '18', '3', '14695', '1531', '0'), +('6', '18', '5', '14703', '6050', '0'), +('6', '18', '5', '14700', '3318', '0'), +('6', '18', '5', '30362', '3140', '0'), +('6', '18', '5', '10055', '2780', '0'), +('6', '18', '8', '11603', '10267', '0'), +('6', '18', '8', '2349', '3554', '0'), +('6', '18', '8', '1363', '2510', '0'), +('6', '18', '8', '2287', '1580', '0'), +('6', '18', '6', '2705', '5911', '0'), +('6', '18', '6', '1557', '5310', '0'), +('6', '18', '6', '1401', '2174', '0'), +('6', '18', '6', '2286', '2007', '0'), +('6', '18', '17', '2285', '10236', '0'), +('6', '18', '17', '3802', '3327', '0'), +('6', '18', '17', '4342', '2301', '0'), +('6', '18', '17', '2405', '1164', '0'), +('6', '18', '7', '31809', '3201', '0'), +('6', '18', '7', '1362', '2624', '0'), +('6', '18', '7', '2289', '2200', '0'), +('6', '18', '7', '1321', '1746', '0'), +('6', '18', '9', '3804', '3907', '0'), +('6', '18', '9', '1541', '3147', '0'), +('6', '18', '9', '4344', '2051', '0'), +('6', '18', '9', '10408', '2002', '0'), +('6', '18', '15', '10150', '3004', '0'), +('6', '18', '15', '10163', '2300', '0'), +('6', '18', '15', '14651', '2224', '0'), +('6', '18', '15', '30360', '1600', '0'), +('6', '18', '20', '11684', '9276', '0'), +('6', '18', '20', '11666', '8325', '0'), +('6', '18', '20', '2742', '5121', '0'), +('6', '18', '20', '2288', '4478', '0'), +('6', '18', '12', '2291', '3830', '0'), +('6', '18', '12', '2923', '3074', '0'), +('6', '18', '12', '20655', '3047', '0'), +('6', '18', '12', '4345', '1460', '0'), +('6', '18', '18', '2292', '1711', '0'), +('6', '18', '18', '3806', '1349', '0'), +('6', '18', '18', '4410', '1142', '0'), +('6', '18', '18', '2461', '1062', '0'), +('6', '18', '19', '68239', '2576', '0'), +('6', '18', '19', '4407', '2017', '0'), +('6', '18', '19', '1368', '2016', '0'), +('6', '18', '19', '2293', '1887', '0'), +('6', '18', '13', '6411', '7122', '0'), +('6', '18', '13', '11683', '6964', '0'), +('6', '18', '13', '14555', '5344', '0'), +('6', '18', '13', '11563', '5306', '0'), +('6', '18', '14', '14555', '5344', '0'), +('6', '18', '14', '10333', '5300', '0'), +('6', '18', '14', '10335', '3903', '0'), +('6', '18', '14', '10334', '3503', '0'), +('6', '18', '11', '14762', '2204', '0'), +('6', '18', '11', '9246', '2186', '0'), +('6', '18', '11', '20677', '450', '0'), +('6', '18', '11', '16941', '435', '0'), +('6', '19', '22', '9246', '0', '0'), +('6', '19', '22', '10323', '0', '0'), +('6', '19', '22', '44492', '0', '0'), +('6', '19', '22', '13101', '0', '0'), +('6', '19', '1', '12801', '4762', '0'), +('6', '19', '1', '14702', '3750', '0'), +('6', '19', '1', '14701', '2862', '0'), +('6', '19', '1', '30361', '2640', '0'), +('6', '19', '2', '10143', '5368', '0'), +('6', '19', '2', '30363', '3700', '0'), +('6', '19', '2', '3000', '2534', '0'), +('6', '19', '2', '2294', '2499', '0'), +('6', '19', '3', '2706', '3554', '0'), +('6', '19', '3', '11052', '3443', '0'), +('6', '19', '3', '4505', '1637', '0'), +('6', '19', '3', '14695', '1615', '0'), +('6', '19', '5', '14703', '6050', '0'), +('6', '19', '5', '14700', '3318', '0'), +('6', '19', '5', '30362', '3140', '0'), +('6', '19', '5', '10055', '2780', '0'), +('6', '19', '8', '11603', '10376', '0'), +('6', '19', '8', '2349', '3554', '0'), +('6', '19', '8', '1363', '2510', '0'), +('6', '19', '8', '2287', '1582', '0'), +('6', '19', '6', '2705', '5959', '0'), +('6', '19', '6', '1557', '5310', '0'), +('6', '19', '6', '1401', '2174', '0'), +('6', '19', '6', '2286', '2009', '0'), +('6', '19', '17', '2285', '10285', '0'), +('6', '19', '17', '3802', '3487', '0'), +('6', '19', '17', '4342', '2422', '0'), +('6', '19', '17', '2405', '1225', '0'), +('6', '19', '7', '31809', '3237', '0'), +('6', '19', '7', '1362', '2624', '0'), +('6', '19', '7', '2289', '2248', '0'), +('6', '19', '7', '1321', '1746', '0'), +('6', '19', '9', '3804', '4016', '0'), +('6', '19', '9', '1541', '3268', '0'), +('6', '19', '9', '4344', '2051', '0'), +('6', '19', '9', '10408', '2002', '0'), +('6', '19', '15', '10150', '3004', '0'), +('6', '19', '15', '10163', '2300', '0'), +('6', '19', '15', '14651', '2224', '0'), +('6', '19', '15', '30360', '1600', '0'), +('6', '19', '20', '11684', '9372', '0'), +('6', '19', '20', '11666', '8327', '0'), +('6', '19', '20', '2742', '5124', '0'), +('6', '19', '20', '2288', '4478', '0'), +('6', '19', '12', '2291', '3830', '0'), +('6', '19', '12', '2923', '3074', '0'), +('6', '19', '12', '20655', '3072', '0'), +('6', '19', '12', '4345', '1520', '0'), +('6', '19', '18', '2292', '1759', '0'), +('6', '19', '18', '3806', '1410', '0'), +('6', '19', '18', '4410', '1142', '0'), +('6', '19', '18', '2461', '1110', '0'), +('6', '19', '19', '68239', '2612', '0'), +('6', '19', '19', '4407', '2126', '0'), +('6', '19', '19', '1368', '2016', '0'), +('6', '19', '19', '2293', '1924', '0'), +('6', '19', '13', '6411', '7231', '0'), +('6', '19', '13', '11683', '7073', '0'), +('6', '19', '13', '14555', '5586', '0'), +('6', '19', '13', '11563', '5379', '0'), +('6', '19', '14', '14555', '5586', '0'), +('6', '19', '14', '10333', '5300', '0'), +('6', '19', '14', '10335', '4120', '0'), +('6', '19', '14', '10334', '3503', '0'), +('6', '19', '11', '9246', '2307', '0'), +('6', '19', '11', '14762', '2204', '0'), +('6', '19', '11', '16941', '459', '0'), +('6', '19', '11', '20677', '450', '0'), +('6', '20', '22', '9246', '0', '0'), +('6', '20', '22', '10323', '0', '0'), +('6', '20', '22', '44492', '0', '0'), +('6', '20', '22', '13101', '0', '0'), +('6', '20', '1', '12801', '4762', '0'), +('6', '20', '1', '14702', '3750', '0'), +('6', '20', '1', '14701', '2862', '0'), +('6', '20', '1', '30361', '2640', '0'), +('6', '20', '2', '10143', '5368', '0'), +('6', '20', '2', '30363', '3700', '0'), +('6', '20', '2', '3000', '2534', '0'), +('6', '20', '2', '2294', '2523', '0'), +('6', '20', '3', '2706', '3674', '0'), +('6', '20', '3', '11052', '3624', '0'), +('6', '20', '3', '4505', '1721', '0'), +('6', '20', '3', '14695', '1700', '0'), +('6', '20', '5', '14703', '6050', '0'), +('6', '20', '5', '14700', '3318', '0'), +('6', '20', '5', '30362', '3140', '0'), +('6', '20', '5', '10055', '2780', '0'), +('6', '20', '8', '11603', '10485', '0'), +('6', '20', '8', '2349', '3554', '0'), +('6', '20', '8', '1363', '2510', '0'), +('6', '20', '8', '2287', '1585', '0'), +('6', '20', '6', '2705', '6007', '0'), +('6', '20', '6', '1557', '5310', '0'), +('6', '20', '6', '1401', '2174', '0'), +('6', '20', '6', '2286', '2010', '0'), +('6', '20', '17', '2285', '10333', '0'), +('6', '20', '17', '3802', '3647', '0'), +('6', '20', '17', '4342', '2543', '0'), +('6', '20', '17', '2405', '1287', '0'), +('6', '20', '7', '31809', '3273', '0'), +('6', '20', '7', '1362', '2624', '0'), +('6', '20', '7', '2289', '2297', '0'), +('6', '20', '7', '1321', '1746', '0'), +('6', '20', '9', '3804', '4125', '0'), +('6', '20', '9', '1541', '3388', '0'), +('6', '20', '9', '4344', '2051', '0'), +('6', '20', '9', '10408', '2002', '0'), +('6', '20', '15', '10150', '3004', '0'), +('6', '20', '15', '10163', '2300', '0'), +('6', '20', '15', '14651', '2224', '0'), +('6', '20', '15', '30360', '1600', '0'), +('6', '20', '20', '11684', '9469', '0'), +('6', '20', '20', '11666', '8329', '0'), +('6', '20', '20', '2742', '5127', '0'), +('6', '20', '20', '2288', '4478', '0'), +('6', '20', '12', '2291', '3830', '0'), +('6', '20', '12', '20655', '3097', '0'), +('6', '20', '12', '2923', '3074', '0'), +('6', '20', '12', '4345', '1580', '0'), +('6', '20', '18', '2292', '1807', '0'), +('6', '20', '18', '3806', '1470', '0'), +('6', '20', '18', '2461', '1159', '0'), +('6', '20', '18', '4410', '1142', '0'), +('6', '20', '19', '68239', '2648', '0'), +('6', '20', '19', '4407', '2235', '0'), +('6', '20', '19', '1368', '2016', '0'), +('6', '20', '19', '2293', '1960', '0'), +('6', '20', '13', '6411', '7339', '0'), +('6', '20', '13', '11683', '7182', '0'), +('6', '20', '13', '14555', '5827', '0'), +('6', '20', '13', '11563', '5451', '0'), +('6', '20', '14', '14555', '5827', '0'), +('6', '20', '14', '10333', '5300', '0'), +('6', '20', '14', '10335', '4338', '0'), +('6', '20', '14', '10334', '3503', '0'), +('6', '20', '11', '9246', '2428', '0'), +('6', '20', '11', '14762', '2204', '0'), +('6', '20', '11', '16941', '483', '0'), +('6', '20', '11', '20677', '450', '0'), +('6', '21', '22', '9246', '0', '0'), +('6', '21', '22', '10323', '0', '0'), +('6', '21', '22', '44492', '0', '0'), +('6', '21', '22', '13101', '0', '0'), +('6', '21', '1', '12801', '4762', '0'), +('6', '21', '1', '14702', '3750', '0'), +('6', '21', '1', '14701', '2862', '0'), +('6', '21', '1', '30361', '2640', '0'), +('6', '21', '2', '10143', '5368', '0'), +('6', '21', '2', '30363', '3700', '0'), +('6', '21', '2', '2294', '2547', '0'), +('6', '21', '2', '3000', '2534', '0'), +('6', '21', '3', '11052', '3805', '0'), +('6', '21', '3', '2706', '3795', '0'), +('6', '21', '3', '4505', '1806', '0'), +('6', '21', '3', '14695', '1784', '0'), +('6', '21', '5', '14703', '6050', '0'), +('6', '21', '5', '14700', '3318', '0'), +('6', '21', '5', '30362', '3140', '0'), +('6', '21', '5', '10146', '2791', '0'), +('6', '21', '8', '11603', '10594', '0'), +('6', '21', '8', '2349', '3554', '0'), +('6', '21', '8', '1363', '2510', '0'), +('6', '21', '8', '2287', '1587', '0'), +('6', '21', '6', '2705', '6056', '0'), +('6', '21', '6', '1557', '5310', '0'), +('6', '21', '6', '1401', '2174', '0'), +('6', '21', '6', '1904', '2060', '0'), +('6', '21', '17', '2285', '10381', '0'), +('6', '21', '17', '3802', '3806', '0'), +('6', '21', '17', '4342', '2664', '0'), +('6', '21', '17', '2405', '1348', '0'), +('6', '21', '7', '31809', '3309', '0'), +('6', '21', '7', '1362', '2624', '0'), +('6', '21', '7', '2289', '2345', '0'), +('6', '21', '7', '1321', '1746', '0'), +('6', '21', '9', '3804', '4233', '0'), +('6', '21', '9', '1541', '3509', '0'), +('6', '21', '9', '4344', '2051', '0'), +('6', '21', '9', '10408', '2002', '0'), +('6', '21', '15', '10150', '3004', '0'), +('6', '21', '15', '10163', '2300', '0'), +('6', '21', '15', '14651', '2224', '0'), +('6', '21', '15', '30360', '1600', '0'), +('6', '21', '20', '11684', '9566', '0'), +('6', '21', '20', '11666', '8331', '0'), +('6', '21', '20', '2742', '5130', '0'), +('6', '21', '20', '2288', '4478', '0'), +('6', '21', '12', '2291', '3830', '0'), +('6', '21', '12', '20655', '3122', '0'), +('6', '21', '12', '2923', '3074', '0'), +('6', '21', '12', '4345', '1641', '0'), +('6', '21', '18', '2292', '1856', '0'), +('6', '21', '18', '3806', '1530', '0'), +('6', '21', '18', '2461', '1207', '0'), +('6', '21', '18', '4410', '1142', '0'), +('6', '21', '19', '68239', '2684', '0'), +('6', '21', '19', '4407', '2343', '0'), +('6', '21', '19', '1368', '2016', '0'), +('6', '21', '19', '2293', '1996', '0'), +('6', '21', '13', '6411', '7448', '0'), +('6', '21', '13', '11683', '7290', '0'), +('6', '21', '13', '14555', '6069', '0'), +('6', '21', '13', '11563', '5524', '0'), +('6', '21', '14', '14555', '6069', '0'), +('6', '21', '14', '10333', '5300', '0'), +('6', '21', '14', '10335', '4555', '0'), +('6', '21', '14', '13991', '3537', '0'), +('6', '21', '11', '9246', '2549', '0'), +('6', '21', '11', '14762', '2204', '0'), +('6', '21', '11', '16941', '507', '0'), +('6', '21', '11', '20677', '450', '0'), +('6', '22', '22', '9246', '0', '0'), +('6', '22', '22', '10323', '0', '0'), +('6', '22', '22', '44492', '0', '0'), +('6', '22', '22', '13101', '0', '0'), +('6', '22', '1', '12801', '4762', '0'), +('6', '22', '1', '14702', '3750', '0'), +('6', '22', '1', '14701', '2862', '0'), +('6', '22', '1', '30361', '2640', '0'), +('6', '22', '2', '10143', '5368', '0'), +('6', '22', '2', '30363', '3700', '0'), +('6', '22', '2', '2294', '2571', '0'), +('6', '22', '2', '3000', '2534', '0'), +('6', '22', '3', '11052', '3986', '0'), +('6', '22', '3', '2706', '3916', '0'), +('6', '22', '3', '4505', '1891', '0'), +('6', '22', '3', '14695', '1869', '0'), +('6', '22', '5', '14703', '6050', '0'), +('6', '22', '5', '14700', '3318', '0'), +('6', '22', '5', '30362', '3140', '0'), +('6', '22', '5', '10146', '2827', '0'), +('6', '22', '8', '11603', '10702', '0'), +('6', '22', '8', '2349', '3554', '0'), +('6', '22', '8', '1363', '2510', '0'), +('6', '22', '8', '2287', '1589', '0'), +('6', '22', '6', '2705', '6104', '0'), +('6', '22', '6', '1557', '5310', '0'), +('6', '22', '6', '1401', '2174', '0'), +('6', '22', '6', '1904', '2156', '0'), +('6', '22', '17', '2285', '10429', '0'), +('6', '22', '17', '3802', '3966', '0'), +('6', '22', '17', '4342', '2784', '0'), +('6', '22', '17', '2405', '1409', '0'), +('6', '22', '7', '31809', '3346', '0'), +('6', '22', '7', '1362', '2624', '0'), +('6', '22', '7', '2289', '2393', '0'), +('6', '22', '7', '1321', '1746', '0'), +('6', '22', '9', '3804', '4342', '0'), +('6', '22', '9', '1541', '3630', '0'), +('6', '22', '9', '4344', '2051', '0'), +('6', '22', '9', '10408', '2002', '0'), +('6', '22', '15', '10150', '3004', '0'), +('6', '22', '15', '10163', '2300', '0'), +('6', '22', '15', '14651', '2224', '0'), +('6', '22', '15', '30360', '1600', '0'), +('6', '22', '20', '11684', '9662', '0'), +('6', '22', '20', '11666', '8333', '0'), +('6', '22', '20', '2742', '5133', '0'), +('6', '22', '20', '2288', '4478', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '22', '12', '2291', '3830', '0'), +('6', '22', '12', '20655', '3146', '0'), +('6', '22', '12', '2923', '3074', '0'), +('6', '22', '12', '4345', '1701', '0'), +('6', '22', '18', '2292', '1904', '0'), +('6', '22', '18', '3806', '1591', '0'), +('6', '22', '18', '2461', '1255', '0'), +('6', '22', '18', '4410', '1142', '0'), +('6', '22', '19', '68239', '2721', '0'), +('6', '22', '19', '4407', '2452', '0'), +('6', '22', '19', '2293', '2032', '0'), +('6', '22', '19', '1368', '2016', '0'), +('6', '22', '13', '6411', '7557', '0'), +('6', '22', '13', '11683', '7399', '0'), +('6', '22', '13', '14555', '6310', '0'), +('6', '22', '13', '11563', '5596', '0'), +('6', '22', '14', '14555', '6310', '0'), +('6', '22', '14', '10333', '5300', '0'), +('6', '22', '14', '10335', '4773', '0'), +('6', '22', '14', '13991', '3658', '0'), +('6', '22', '11', '9246', '2670', '0'), +('6', '22', '11', '14762', '2204', '0'), +('6', '22', '11', '16941', '532', '0'), +('6', '22', '11', '20677', '450', '0'), +('6', '23', '22', '9246', '0', '0'), +('6', '23', '22', '10323', '0', '0'), +('6', '23', '22', '44492', '0', '0'), +('6', '23', '22', '13101', '0', '0'), +('6', '23', '1', '12801', '4762', '0'), +('6', '23', '1', '14702', '3750', '0'), +('6', '23', '1', '14701', '2862', '0'), +('6', '23', '1', '30361', '2640', '0'), +('6', '23', '2', '10143', '5368', '0'), +('6', '23', '2', '30363', '3700', '0'), +('6', '23', '2', '2294', '2596', '0'), +('6', '23', '2', '3000', '2534', '0'), +('6', '23', '3', '11052', '4168', '0'), +('6', '23', '3', '2706', '4037', '0'), +('6', '23', '3', '4505', '1975', '0'), +('6', '23', '3', '14695', '1953', '0'), +('6', '23', '5', '14703', '6050', '0'), +('6', '23', '5', '14700', '3318', '0'), +('6', '23', '5', '30362', '3140', '0'), +('6', '23', '5', '10146', '2864', '0'), +('6', '23', '8', '11603', '10811', '0'), +('6', '23', '8', '2349', '3554', '0'), +('6', '23', '8', '1363', '2510', '0'), +('6', '23', '8', '2287', '1592', '0'), +('6', '23', '6', '2705', '6152', '0'), +('6', '23', '6', '1557', '5310', '0'), +('6', '23', '6', '1904', '2253', '0'), +('6', '23', '6', '1401', '2174', '0'), +('6', '23', '17', '2285', '10478', '0'), +('6', '23', '17', '3802', '4126', '0'), +('6', '23', '17', '4342', '2905', '0'), +('6', '23', '17', '2405', '1470', '0'), +('6', '23', '7', '31809', '3382', '0'), +('6', '23', '7', '1362', '2624', '0'), +('6', '23', '7', '2289', '2442', '0'), +('6', '23', '7', '1321', '1746', '0'), +('6', '23', '9', '3804', '4451', '0'), +('6', '23', '9', '1541', '3751', '0'), +('6', '23', '9', '4344', '2051', '0'), +('6', '23', '9', '10408', '2002', '0'), +('6', '23', '15', '10150', '3004', '0'), +('6', '23', '15', '10163', '2300', '0'), +('6', '23', '15', '14651', '2224', '0'), +('6', '23', '15', '14631', '1667', '0'), +('6', '23', '20', '11684', '9759', '0'), +('6', '23', '20', '11666', '8335', '0'), +('6', '23', '20', '2742', '5136', '0'), +('6', '23', '20', '2288', '4478', '0'), +('6', '23', '12', '2291', '3830', '0'), +('6', '23', '12', '20655', '3171', '0'), +('6', '23', '12', '2923', '3074', '0'), +('6', '23', '12', '4345', '1762', '0'), +('6', '23', '18', '2292', '1952', '0'), +('6', '23', '18', '3806', '1651', '0'), +('6', '23', '18', '2461', '1304', '0'), +('6', '23', '18', '4410', '1142', '0'), +('6', '23', '19', '68239', '2757', '0'), +('6', '23', '19', '4407', '2561', '0'), +('6', '23', '19', '2293', '2069', '0'), +('6', '23', '19', '1368', '2016', '0'), +('6', '23', '13', '6411', '7665', '0'), +('6', '23', '13', '11683', '7508', '0'), +('6', '23', '13', '14555', '6552', '0'), +('6', '23', '13', '11563', '5669', '0'), +('6', '23', '14', '14555', '6552', '0'), +('6', '23', '14', '10333', '5300', '0'), +('6', '23', '14', '10335', '4990', '0'), +('6', '23', '14', '13991', '3778', '0'), +('6', '23', '11', '9246', '2790', '0'), +('6', '23', '11', '14762', '2204', '0'), +('6', '23', '11', '16941', '556', '0'), +('6', '23', '11', '20677', '450', '0'), +('6', '24', '22', '9246', '0', '0'), +('6', '24', '22', '10323', '0', '0'), +('6', '24', '22', '44492', '0', '0'), +('6', '24', '22', '13101', '0', '0'), +('6', '24', '1', '12801', '4762', '0'), +('6', '24', '1', '14702', '3750', '0'), +('6', '24', '1', '14701', '2862', '0'), +('6', '24', '1', '30361', '2640', '0'), +('6', '24', '2', '10143', '5368', '0'), +('6', '24', '2', '30363', '3700', '0'), +('6', '24', '2', '2294', '2620', '0'), +('6', '24', '2', '3000', '2534', '0'), +('6', '24', '3', '11052', '4349', '0'), +('6', '24', '3', '2706', '4158', '0'), +('6', '24', '3', '4505', '2060', '0'), +('6', '24', '3', '14695', '2038', '0'), +('6', '24', '5', '14703', '6050', '0'), +('6', '24', '5', '14700', '3318', '0'), +('6', '24', '5', '30362', '3140', '0'), +('6', '24', '5', '10146', '2900', '0'), +('6', '24', '8', '11603', '10920', '0'), +('6', '24', '8', '2349', '3554', '0'), +('6', '24', '8', '1363', '2510', '0'), +('6', '24', '8', '2287', '1594', '0'), +('6', '24', '6', '2705', '6201', '0'), +('6', '24', '6', '1557', '5310', '0'), +('6', '24', '6', '1904', '2350', '0'), +('6', '24', '6', '1401', '2174', '0'), +('6', '24', '17', '2285', '10526', '0'), +('6', '24', '17', '3802', '4286', '0'), +('6', '24', '17', '4342', '3026', '0'), +('6', '24', '17', '2405', '1532', '0'), +('6', '24', '7', '31809', '3418', '0'), +('6', '24', '7', '1362', '2624', '0'), +('6', '24', '7', '2289', '2490', '0'), +('6', '24', '7', '1321', '1746', '0'), +('6', '24', '9', '3804', '4559', '0'), +('6', '24', '9', '1541', '3872', '0'), +('6', '24', '9', '4344', '2051', '0'), +('6', '24', '9', '10408', '2002', '0'), +('6', '24', '15', '10150', '3004', '0'), +('6', '24', '15', '10163', '2300', '0'), +('6', '24', '15', '14651', '2224', '0'), +('6', '24', '15', '14631', '1740', '0'), +('6', '24', '20', '11684', '9856', '0'), +('6', '24', '20', '11666', '8338', '0'), +('6', '24', '20', '2742', '5139', '0'), +('6', '24', '20', '2288', '4478', '0'), +('6', '24', '12', '2291', '3830', '0'), +('6', '24', '12', '20655', '3196', '0'), +('6', '24', '12', '2923', '3074', '0'), +('6', '24', '12', '4345', '1822', '0'), +('6', '24', '18', '2292', '2001', '0'), +('6', '24', '18', '3806', '1712', '0'), +('6', '24', '18', '2461', '1352', '0'), +('6', '24', '18', '4410', '1142', '0'), +('6', '24', '19', '68239', '2793', '0'), +('6', '24', '19', '4407', '2669', '0'), +('6', '24', '19', '2293', '2105', '0'), +('6', '24', '19', '1368', '2016', '0'), +('6', '24', '13', '6411', '7774', '0'), +('6', '24', '13', '11683', '7616', '0'), +('6', '24', '13', '14555', '6794', '0'), +('6', '24', '13', '11563', '5741', '0'), +('6', '24', '14', '14555', '6794', '0'), +('6', '24', '14', '10333', '5300', '0'), +('6', '24', '14', '10335', '5208', '0'), +('6', '24', '14', '13991', '3899', '0'), +('6', '24', '11', '9246', '2911', '0'), +('6', '24', '11', '14762', '2204', '0'), +('6', '24', '11', '16941', '580', '0'), +('6', '24', '11', '20677', '450', '0'), +('6', '25', '22', '9246', '0', '0'), +('6', '25', '22', '10323', '0', '0'), +('6', '25', '22', '44492', '0', '0'), +('6', '25', '22', '13101', '0', '0'), +('6', '25', '1', '12801', '4762', '0'), +('6', '25', '1', '14702', '3750', '0'), +('6', '25', '1', '14701', '2862', '0'), +('6', '25', '1', '30361', '2640', '0'), +('6', '25', '2', '10143', '5368', '0'), +('6', '25', '2', '30363', '3700', '0'), +('6', '25', '2', '2294', '2644', '0'), +('6', '25', '2', '3000', '2534', '0'), +('6', '25', '3', '11052', '4530', '0'), +('6', '25', '3', '2706', '4278', '0'), +('6', '25', '3', '4505', '2144', '0'), +('6', '25', '3', '14695', '2122', '0'), +('6', '25', '5', '14703', '6050', '0'), +('6', '25', '5', '14700', '3318', '0'), +('6', '25', '5', '30362', '3140', '0'), +('6', '25', '5', '68291', '3044', '0'), +('6', '25', '8', '11603', '11028', '0'), +('6', '25', '8', '2349', '3554', '0'), +('6', '25', '8', '1363', '2510', '0'), +('6', '25', '8', '2287', '1597', '0'), +('6', '25', '6', '2705', '6249', '0'), +('6', '25', '6', '1557', '5310', '0'), +('6', '25', '6', '1904', '2446', '0'), +('6', '25', '6', '1401', '2174', '0'), +('6', '25', '17', '2285', '10574', '0'), +('6', '25', '17', '3802', '4445', '0'), +('6', '25', '17', '4342', '3147', '0'), +('6', '25', '17', '2405', '1593', '0'), +('6', '25', '7', '31809', '3454', '0'), +('6', '25', '7', '1362', '2624', '0'), +('6', '25', '7', '2289', '2538', '0'), +('6', '25', '7', '1321', '1746', '0'), +('6', '25', '9', '3804', '4668', '0'), +('6', '25', '9', '1541', '3992', '0'), +('6', '25', '9', '4344', '2051', '0'), +('6', '25', '9', '2290', '2047', '0'), +('6', '25', '15', '10150', '3004', '0'), +('6', '25', '15', '10163', '2300', '0'), +('6', '25', '15', '14651', '2224', '0'), +('6', '25', '15', '14631', '1812', '0'), +('6', '25', '20', '11684', '9952', '0'), +('6', '25', '20', '11666', '8340', '0'), +('6', '25', '20', '2742', '5142', '0'), +('6', '25', '20', '2288', '4478', '0'), +('6', '25', '12', '2291', '3830', '0'), +('6', '25', '12', '20655', '3221', '0'), +('6', '25', '12', '2923', '3074', '0'), +('6', '25', '12', '4345', '1882', '0'), +('6', '25', '18', '2292', '2049', '0'), +('6', '25', '18', '3806', '1772', '0'), +('6', '25', '18', '2461', '1400', '0'), +('6', '25', '18', '4410', '1142', '0'), +('6', '25', '19', '68239', '2829', '0'), +('6', '25', '19', '4407', '2778', '0'), +('6', '25', '19', '2293', '2141', '0'), +('6', '25', '19', '1368', '2016', '0'), +('6', '25', '13', '6411', '7883', '0'), +('6', '25', '13', '11683', '7725', '0'), +('6', '25', '13', '14555', '7035', '0'), +('6', '25', '13', '11563', '5814', '0'), +('6', '25', '14', '14555', '7035', '0'), +('6', '25', '14', '10335', '5425', '0'), +('6', '25', '14', '10333', '5300', '0'), +('6', '25', '14', '13991', '4020', '0'), +('6', '25', '11', '9246', '3032', '0'), +('6', '25', '11', '14762', '2204', '0'), +('6', '25', '11', '16941', '604', '0'), +('6', '25', '11', '20677', '450', '0'), +('6', '26', '22', '9246', '0', '0'), +('6', '26', '22', '10323', '0', '0'), +('6', '26', '22', '44492', '0', '0'), +('6', '26', '22', '13101', '0', '0'), +('6', '26', '1', '12801', '4762', '0'), +('6', '26', '1', '14702', '3750', '0'), +('6', '26', '1', '14701', '2862', '0'), +('6', '26', '1', '30361', '2640', '0'), +('6', '26', '2', '10143', '5368', '0'), +('6', '26', '2', '30363', '3700', '0'), +('6', '26', '2', '2294', '2668', '0'), +('6', '26', '2', '3000', '2534', '0'), +('6', '26', '3', '11052', '4711', '0'), +('6', '26', '3', '2706', '4399', '0'), +('6', '26', '3', '4505', '2229', '0'), +('6', '26', '3', '14695', '2207', '0'), +('6', '26', '5', '14703', '6050', '0'), +('6', '26', '5', '14700', '3318', '0'), +('6', '26', '5', '30362', '3140', '0'), +('6', '26', '5', '68291', '3093', '0'), +('6', '26', '8', '11603', '11137', '0'), +('6', '26', '8', '2349', '3554', '0'), +('6', '26', '8', '1363', '2510', '0'), +('6', '26', '8', '2287', '1599', '0'), +('6', '26', '6', '2705', '6297', '0'), +('6', '26', '6', '1557', '5310', '0'), +('6', '26', '6', '1904', '2543', '0'), +('6', '26', '6', '1401', '2174', '0'), +('6', '26', '17', '2285', '10623', '0'), +('6', '26', '17', '3802', '4605', '0'), +('6', '26', '17', '4342', '3268', '0'), +('6', '26', '17', '2405', '1654', '0'), +('6', '26', '7', '31809', '3491', '0'), +('6', '26', '7', '1362', '2624', '0'), +('6', '26', '7', '2289', '2587', '0'), +('6', '26', '7', '1321', '1746', '0'), +('6', '26', '9', '3804', '4777', '0'), +('6', '26', '9', '1541', '4113', '0'), +('6', '26', '9', '2290', '2108', '0'), +('6', '26', '9', '4344', '2051', '0'), +('6', '26', '15', '10150', '3004', '0'), +('6', '26', '15', '10163', '2300', '0'), +('6', '26', '15', '14651', '2224', '0'), +('6', '26', '15', '14631', '1884', '0'), +('6', '26', '20', '11684', '10049', '0'), +('6', '26', '20', '11666', '8342', '0'), +('6', '26', '20', '2742', '5145', '0'), +('6', '26', '20', '2288', '4478', '0'), +('6', '26', '12', '2291', '3830', '0'), +('6', '26', '12', '20655', '3245', '0'), +('6', '26', '12', '2923', '3074', '0'), +('6', '26', '12', '4345', '1943', '0'), +('6', '26', '18', '2292', '2097', '0'), +('6', '26', '18', '3806', '1832', '0'), +('6', '26', '18', '2461', '1449', '0'), +('6', '26', '18', '4410', '1142', '0'), +('6', '26', '19', '4407', '2887', '0'), +('6', '26', '19', '68239', '2866', '0'), +('6', '26', '19', '2293', '2177', '0'), +('6', '26', '19', '1368', '2016', '0'), +('6', '26', '13', '6411', '7992', '0'), +('6', '26', '13', '11683', '7834', '0'), +('6', '26', '13', '14555', '7277', '0'), +('6', '26', '13', '11563', '5886', '0'), +('6', '26', '14', '14555', '7277', '0'), +('6', '26', '14', '10335', '5643', '0'), +('6', '26', '14', '10333', '5300', '0'), +('6', '26', '14', '13991', '4141', '0'), +('6', '26', '11', '9246', '3153', '0'), +('6', '26', '11', '14762', '2204', '0'), +('6', '26', '11', '16941', '628', '0'), +('6', '26', '11', '20677', '450', '0'), +('6', '27', '22', '9246', '0', '0'), +('6', '27', '22', '10323', '0', '0'), +('6', '27', '22', '44492', '0', '0'), +('6', '27', '22', '13101', '0', '0'), +('6', '27', '1', '12801', '4762', '0'), +('6', '27', '1', '14702', '3750', '0'), +('6', '27', '1', '14701', '2862', '0'), +('6', '27', '1', '30361', '2640', '0'), +('6', '27', '2', '10143', '5368', '0'), +('6', '27', '2', '30363', '3700', '0'), +('6', '27', '2', '2294', '2692', '0'), +('6', '27', '2', '3000', '2534', '0'), +('6', '27', '3', '11052', '4892', '0'), +('6', '27', '3', '2706', '4520', '0'), +('6', '27', '3', '4505', '2313', '0'), +('6', '27', '3', '14695', '2292', '0'), +('6', '27', '5', '14703', '6050', '0'), +('6', '27', '5', '14700', '3318', '0'), +('6', '27', '5', '68291', '3141', '0'), +('6', '27', '5', '30362', '3140', '0'), +('6', '27', '8', '11603', '11246', '0'), +('6', '27', '8', '2349', '3554', '0'), +('6', '27', '8', '1363', '2510', '0'), +('6', '27', '8', '2287', '1601', '0'), +('6', '27', '6', '2705', '6346', '0'), +('6', '27', '6', '1557', '5310', '0'), +('6', '27', '6', '1904', '2639', '0'), +('6', '27', '6', '1401', '2174', '0'), +('6', '27', '17', '2285', '10671', '0'), +('6', '27', '17', '3802', '4765', '0'), +('6', '27', '17', '4342', '3388', '0'), +('6', '27', '17', '2405', '1716', '0'), +('6', '27', '7', '31809', '3527', '0'), +('6', '27', '7', '2289', '2635', '0'), +('6', '27', '7', '1362', '2624', '0'), +('6', '27', '7', '1321', '1746', '0'), +('6', '27', '9', '3804', '4886', '0'), +('6', '27', '9', '1541', '4234', '0'), +('6', '27', '9', '2290', '2169', '0'), +('6', '27', '9', '4344', '2051', '0'), +('6', '27', '15', '10150', '3004', '0'), +('6', '27', '15', '10163', '2300', '0'), +('6', '27', '15', '14651', '2224', '0'), +('6', '27', '15', '14631', '1957', '0'), +('6', '27', '20', '11684', '10146', '0'), +('6', '27', '20', '11666', '8344', '0'), +('6', '27', '20', '2742', '5148', '0'), +('6', '27', '20', '2288', '4478', '0'), +('6', '27', '12', '2291', '3830', '0'), +('6', '27', '12', '20655', '3270', '0'), +('6', '27', '12', '2923', '3074', '0'), +('6', '27', '12', '4345', '2003', '0'), +('6', '27', '18', '2292', '2146', '0'), +('6', '27', '18', '3806', '1893', '0'), +('6', '27', '18', '2461', '1497', '0'), +('6', '27', '18', '4410', '1142', '0'), +('6', '27', '19', '4407', '2996', '0'), +('6', '27', '19', '68239', '2902', '0'), +('6', '27', '19', '2293', '2214', '0'), +('6', '27', '19', '1368', '2016', '0'), +('6', '27', '13', '6411', '8100', '0'), +('6', '27', '13', '11683', '7943', '0'), +('6', '27', '13', '14555', '7518', '0'), +('6', '27', '13', '11563', '5959', '0'), +('6', '27', '14', '14555', '7518', '0'), +('6', '27', '14', '10335', '5860', '0'), +('6', '27', '14', '10333', '5300', '0'), +('6', '27', '14', '13991', '4262', '0'), +('6', '27', '11', '9246', '3274', '0'), +('6', '27', '11', '14762', '2204', '0'), +('6', '27', '11', '16941', '652', '0'), +('6', '27', '11', '20677', '450', '0'), +('6', '28', '22', '9246', '0', '0'), +('6', '28', '22', '10323', '0', '0'), +('6', '28', '22', '44492', '0', '0'), +('6', '28', '22', '13101', '0', '0'), +('6', '28', '1', '12801', '4762', '0'), +('6', '28', '1', '14702', '3750', '0'), +('6', '28', '1', '14701', '2862', '0'), +('6', '28', '1', '30361', '2640', '0'), +('6', '28', '2', '10143', '5368', '0'), +('6', '28', '2', '30363', '3700', '0'), +('6', '28', '2', '2294', '2716', '0'), +('6', '28', '2', '3000', '2534', '0'), +('6', '28', '3', '11052', '5074', '0'), +('6', '28', '3', '2706', '4641', '0'), +('6', '28', '3', '4505', '2398', '0'), +('6', '28', '3', '14695', '2376', '0'), +('6', '28', '5', '14703', '6050', '0'), +('6', '28', '5', '14700', '3318', '0'), +('6', '28', '5', '68291', '3189', '0'), +('6', '28', '5', '30362', '3140', '0'), +('6', '28', '8', '11603', '11355', '0'), +('6', '28', '8', '2349', '3554', '0'), +('6', '28', '8', '1363', '2510', '0'), +('6', '28', '8', '2287', '1604', '0'), +('6', '28', '6', '2705', '6394', '0'), +('6', '28', '6', '1557', '5310', '0'), +('6', '28', '6', '1904', '2736', '0'), +('6', '28', '6', '1401', '2174', '0'), +('6', '28', '17', '2285', '10719', '0'), +('6', '28', '17', '3802', '4925', '0'), +('6', '28', '17', '4342', '3509', '0'), +('6', '28', '17', '2405', '1777', '0'), +('6', '28', '7', '31809', '3563', '0'), +('6', '28', '7', '2289', '2683', '0'), +('6', '28', '7', '1362', '2624', '0'), +('6', '28', '7', '1321', '1746', '0'), +('6', '28', '9', '3804', '4994', '0'), +('6', '28', '9', '1541', '4355', '0'), +('6', '28', '9', '2290', '2230', '0'), +('6', '28', '9', '4344', '2051', '0'), +('6', '28', '15', '10150', '3004', '0'), +('6', '28', '15', '10163', '2300', '0'), +('6', '28', '15', '14651', '2224', '0'), +('6', '28', '15', '14631', '2029', '0'), +('6', '28', '20', '11684', '10242', '0'), +('6', '28', '20', '11666', '8346', '0'), +('6', '28', '20', '2742', '5151', '0'), +('6', '28', '20', '2288', '4478', '0'), +('6', '28', '12', '2291', '3830', '0'), +('6', '28', '12', '20655', '3295', '0'), +('6', '28', '12', '2923', '3074', '0'), +('6', '28', '12', '4345', '2064', '0'), +('6', '28', '18', '2292', '2194', '0'), +('6', '28', '18', '3806', '1953', '0'), +('6', '28', '18', '2461', '1545', '0'), +('6', '28', '18', '4410', '1142', '0'), +('6', '28', '19', '4407', '3104', '0'), +('6', '28', '19', '68239', '2938', '0'), +('6', '28', '19', '2293', '2250', '0'), +('6', '28', '19', '1368', '2016', '0'), +('6', '28', '13', '6411', '8209', '0'), +('6', '28', '13', '11683', '8051', '0'), +('6', '28', '13', '14555', '7760', '0'), +('6', '28', '13', '11563', '6031', '0'), +('6', '28', '14', '14555', '7760', '0'), +('6', '28', '14', '10335', '6077', '0'), +('6', '28', '14', '10333', '5300', '0'), +('6', '28', '14', '13991', '4382', '0'), +('6', '28', '11', '9246', '3394', '0'), +('6', '28', '11', '14762', '2204', '0'), +('6', '28', '11', '16941', '676', '0'), +('6', '28', '11', '20677', '450', '0'), +('6', '29', '22', '9246', '0', '0'), +('6', '29', '22', '10323', '0', '0'), +('6', '29', '22', '44492', '0', '0'), +('6', '29', '22', '13101', '0', '0'), +('6', '29', '1', '12801', '4762', '0'), +('6', '29', '1', '14702', '3750', '0'), +('6', '29', '1', '14701', '2862', '0'), +('6', '29', '1', '30361', '2640', '0'), +('6', '29', '2', '10143', '5368', '0'), +('6', '29', '2', '30363', '3700', '0'), +('6', '29', '2', '2294', '2741', '0'), +('6', '29', '2', '3000', '2534', '0'), +('6', '29', '3', '11052', '5255', '0'), +('6', '29', '3', '2706', '4762', '0'), +('6', '29', '3', '4505', '2482', '0'), +('6', '29', '3', '14695', '2461', '0'), +('6', '29', '5', '14703', '6050', '0'), +('6', '29', '5', '14700', '3318', '0'), +('6', '29', '5', '68291', '3238', '0'), +('6', '29', '5', '30362', '3140', '0'), +('6', '29', '8', '11603', '11463', '0'), +('6', '29', '8', '2349', '3554', '0'), +('6', '29', '8', '1363', '2510', '0'), +('6', '29', '8', '2287', '1606', '0'), +('6', '29', '6', '2705', '6442', '0'), +('6', '29', '6', '1557', '5310', '0'), +('6', '29', '6', '1904', '2833', '0'), +('6', '29', '6', '1401', '2174', '0'), +('6', '29', '17', '2285', '10768', '0'), +('6', '29', '17', '3802', '5084', '0'), +('6', '29', '17', '4342', '3630', '0'), +('6', '29', '17', '2405', '1838', '0'), +('6', '29', '7', '31809', '3599', '0'), +('6', '29', '7', '2289', '2731', '0'), +('6', '29', '7', '1362', '2624', '0'), +('6', '29', '7', '1321', '1746', '0'), +('6', '29', '9', '3804', '5103', '0'), +('6', '29', '9', '1541', '4476', '0'), +('6', '29', '9', '2290', '2291', '0'), +('6', '29', '9', '4344', '2051', '0'), +('6', '29', '15', '10150', '3004', '0'), +('6', '29', '15', '10163', '2300', '0'), +('6', '29', '15', '14651', '2224', '0'), +('6', '29', '15', '14631', '2102', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '29', '20', '11684', '10339', '0'), +('6', '29', '20', '11666', '8348', '0'), +('6', '29', '20', '2742', '5154', '0'), +('6', '29', '20', '2288', '4478', '0'), +('6', '29', '12', '2291', '3830', '0'), +('6', '29', '12', '20655', '3320', '0'), +('6', '29', '12', '2923', '3074', '0'), +('6', '29', '12', '4345', '2124', '0'), +('6', '29', '18', '2292', '2242', '0'), +('6', '29', '18', '3806', '2014', '0'), +('6', '29', '18', '2461', '1594', '0'), +('6', '29', '18', '4410', '1142', '0'), +('6', '29', '19', '4407', '3213', '0'), +('6', '29', '19', '68239', '2974', '0'), +('6', '29', '19', '2293', '2286', '0'), +('6', '29', '19', '1368', '2016', '0'), +('6', '29', '13', '6411', '8318', '0'), +('6', '29', '13', '11683', '8160', '0'), +('6', '29', '13', '14555', '8002', '0'), +('6', '29', '13', '11563', '6104', '0'), +('6', '29', '14', '14555', '8002', '0'), +('6', '29', '14', '10335', '6295', '0'), +('6', '29', '14', '10333', '5300', '0'), +('6', '29', '14', '13991', '4503', '0'), +('6', '29', '11', '9246', '3515', '0'), +('6', '29', '11', '14762', '2204', '0'), +('6', '29', '11', '16941', '701', '0'), +('6', '29', '11', '20677', '450', '0'), +('6', '30', '22', '9246', '0', '0'), +('6', '30', '22', '10323', '0', '0'), +('6', '30', '22', '44492', '0', '0'), +('6', '30', '22', '13101', '0', '0'), +('6', '30', '1', '12801', '4762', '0'), +('6', '30', '1', '14702', '3750', '0'), +('6', '30', '1', '14701', '2862', '0'), +('6', '30', '1', '30361', '2640', '0'), +('6', '30', '2', '10143', '5368', '0'), +('6', '30', '2', '30363', '3700', '0'), +('6', '30', '2', '2294', '2765', '0'), +('6', '30', '2', '3000', '2534', '0'), +('6', '30', '3', '11052', '5436', '0'), +('6', '30', '3', '2706', '4882', '0'), +('6', '30', '3', '4505', '2567', '0'), +('6', '30', '3', '14695', '2545', '0'), +('6', '30', '5', '14703', '6050', '0'), +('6', '30', '5', '14700', '3318', '0'), +('6', '30', '5', '68291', '3286', '0'), +('6', '30', '5', '30362', '3140', '0'), +('6', '30', '8', '11603', '11572', '0'), +('6', '30', '8', '2349', '3554', '0'), +('6', '30', '8', '1363', '2510', '0'), +('6', '30', '8', '2913', '1642', '0'), +('6', '30', '6', '2705', '6491', '0'), +('6', '30', '6', '1557', '5310', '0'), +('6', '30', '6', '1904', '2929', '0'), +('6', '30', '6', '1401', '2174', '0'), +('6', '30', '17', '2285', '10816', '0'), +('6', '30', '17', '3802', '5244', '0'), +('6', '30', '17', '4342', '3751', '0'), +('6', '30', '17', '2405', '1900', '0'), +('6', '30', '7', '31809', '3636', '0'), +('6', '30', '7', '2289', '2780', '0'), +('6', '30', '7', '1362', '2624', '0'), +('6', '30', '7', '1321', '1746', '0'), +('6', '30', '9', '3804', '5212', '0'), +('6', '30', '9', '1541', '4596', '0'), +('6', '30', '9', '2290', '2352', '0'), +('6', '30', '9', '4344', '2051', '0'), +('6', '30', '15', '10150', '3004', '0'), +('6', '30', '15', '10163', '2300', '0'), +('6', '30', '15', '14651', '2224', '0'), +('6', '30', '15', '14631', '2174', '0'), +('6', '30', '20', '11684', '10435', '0'), +('6', '30', '20', '11666', '8350', '0'), +('6', '30', '20', '2742', '5157', '0'), +('6', '30', '20', '2288', '4478', '0'), +('6', '30', '12', '2291', '3830', '0'), +('6', '30', '12', '20655', '3344', '0'), +('6', '30', '12', '2923', '3074', '0'), +('6', '30', '12', '4345', '2184', '0'), +('6', '30', '18', '2292', '2291', '0'), +('6', '30', '18', '3806', '2074', '0'), +('6', '30', '18', '2461', '1642', '0'), +('6', '30', '18', '4410', '1142', '0'), +('6', '30', '19', '4407', '3322', '0'), +('6', '30', '19', '68239', '3011', '0'), +('6', '30', '19', '2293', '2322', '0'), +('6', '30', '19', '1368', '2016', '0'), +('6', '30', '13', '6411', '8427', '0'), +('6', '30', '13', '11683', '8269', '0'), +('6', '30', '13', '14555', '8243', '0'), +('6', '30', '13', '11563', '6176', '0'), +('6', '30', '14', '14555', '8243', '0'), +('6', '30', '14', '10335', '6512', '0'), +('6', '30', '14', '10333', '5300', '0'), +('6', '30', '14', '13991', '4624', '0'), +('6', '30', '11', '9246', '3636', '0'), +('6', '30', '11', '14762', '2204', '0'), +('6', '30', '11', '16941', '725', '0'), +('6', '30', '11', '20677', '450', '0'), +('6', '31', '22', '9246', '0', '0'), +('6', '31', '22', '10323', '0', '0'), +('6', '31', '22', '44492', '0', '0'), +('6', '31', '22', '13101', '0', '0'), +('6', '31', '1', '12801', '4762', '0'), +('6', '31', '1', '14702', '3750', '0'), +('6', '31', '1', '14701', '2862', '0'), +('6', '31', '1', '30361', '2640', '0'), +('6', '31', '2', '10143', '5368', '0'), +('6', '31', '2', '30363', '3700', '0'), +('6', '31', '2', '2294', '2789', '0'), +('6', '31', '2', '3000', '2534', '0'), +('6', '31', '3', '11052', '5617', '0'), +('6', '31', '3', '2706', '5003', '0'), +('6', '31', '3', '4505', '2652', '0'), +('6', '31', '3', '14695', '2630', '0'), +('6', '31', '5', '14703', '6050', '0'), +('6', '31', '5', '68291', '3334', '0'), +('6', '31', '5', '14700', '3318', '0'), +('6', '31', '5', '10146', '3154', '0'), +('6', '31', '8', '11603', '11681', '0'), +('6', '31', '8', '2349', '3554', '0'), +('6', '31', '8', '1363', '2510', '0'), +('6', '31', '8', '2913', '1690', '0'), +('6', '31', '6', '2705', '6539', '0'), +('6', '31', '6', '1557', '5310', '0'), +('6', '31', '6', '1904', '3026', '0'), +('6', '31', '6', '1401', '2174', '0'), +('6', '31', '17', '2285', '10864', '0'), +('6', '31', '17', '3802', '5404', '0'), +('6', '31', '17', '4342', '3872', '0'), +('6', '31', '17', '2405', '1961', '0'), +('6', '31', '7', '31809', '3672', '0'), +('6', '31', '7', '2289', '2828', '0'), +('6', '31', '7', '1362', '2624', '0'), +('6', '31', '7', '1321', '1746', '0'), +('6', '31', '9', '3804', '5321', '0'), +('6', '31', '9', '1541', '4717', '0'), +('6', '31', '9', '2290', '2413', '0'), +('6', '31', '9', '4344', '2051', '0'), +('6', '31', '15', '10150', '3004', '0'), +('6', '31', '15', '10163', '2300', '0'), +('6', '31', '15', '14631', '2247', '0'), +('6', '31', '15', '14651', '2224', '0'), +('6', '31', '20', '11684', '10532', '0'), +('6', '31', '20', '11666', '8352', '0'), +('6', '31', '20', '2742', '5160', '0'), +('6', '31', '20', '2288', '4478', '0'), +('6', '31', '12', '2291', '3830', '0'), +('6', '31', '12', '20655', '3369', '0'), +('6', '31', '12', '2923', '3074', '0'), +('6', '31', '12', '4345', '2245', '0'), +('6', '31', '18', '2292', '2339', '0'), +('6', '31', '18', '3806', '2134', '0'), +('6', '31', '18', '2461', '1690', '0'), +('6', '31', '18', '4410', '1142', '0'), +('6', '31', '19', '4407', '3431', '0'), +('6', '31', '19', '68239', '3047', '0'), +('6', '31', '19', '2293', '2358', '0'), +('6', '31', '19', '1368', '2016', '0'), +('6', '31', '13', '6411', '8535', '0'), +('6', '31', '13', '14555', '8485', '0'), +('6', '31', '13', '11683', '8377', '0'), +('6', '31', '13', '11563', '6249', '0'), +('6', '31', '14', '14555', '8485', '0'), +('6', '31', '14', '10335', '6730', '0'), +('6', '31', '14', '10333', '5300', '0'), +('6', '31', '14', '13991', '4745', '0'), +('6', '31', '11', '9246', '3757', '0'), +('6', '31', '11', '14762', '2204', '0'), +('6', '31', '11', '16941', '749', '0'), +('6', '31', '11', '20677', '450', '0'), +('6', '32', '22', '9246', '0', '0'), +('6', '32', '22', '10323', '0', '0'), +('6', '32', '22', '44492', '0', '0'), +('6', '32', '22', '13101', '0', '0'), +('6', '32', '1', '12801', '4762', '0'), +('6', '32', '1', '14702', '3750', '0'), +('6', '32', '1', '14701', '2862', '0'), +('6', '32', '1', '30361', '2640', '0'), +('6', '32', '2', '10143', '5368', '0'), +('6', '32', '2', '30363', '3700', '0'), +('6', '32', '2', '2294', '2813', '0'), +('6', '32', '2', '3000', '2534', '0'), +('6', '32', '3', '11052', '5798', '0'), +('6', '32', '3', '2706', '5124', '0'), +('6', '32', '3', '4505', '2736', '0'), +('6', '32', '3', '14695', '2714', '0'), +('6', '32', '5', '14703', '6050', '0'), +('6', '32', '5', '68291', '3382', '0'), +('6', '32', '5', '14700', '3318', '0'), +('6', '32', '5', '10146', '3190', '0'), +('6', '32', '8', '11603', '11789', '0'), +('6', '32', '8', '2349', '3554', '0'), +('6', '32', '8', '1363', '2510', '0'), +('6', '32', '8', '2913', '1739', '0'), +('6', '32', '6', '2705', '6587', '0'), +('6', '32', '6', '1557', '5310', '0'), +('6', '32', '6', '1904', '3123', '0'), +('6', '32', '6', '1401', '2174', '0'), +('6', '32', '17', '2285', '10913', '0'), +('6', '32', '17', '3802', '5564', '0'), +('6', '32', '17', '4342', '3992', '0'), +('6', '32', '17', '2405', '2022', '0'), +('6', '32', '7', '31809', '3708', '0'), +('6', '32', '7', '2289', '2876', '0'), +('6', '32', '7', '1362', '2624', '0'), +('6', '32', '7', '1321', '1746', '0'), +('6', '32', '9', '3804', '5429', '0'), +('6', '32', '9', '1541', '4838', '0'), +('6', '32', '9', '2290', '2474', '0'), +('6', '32', '9', '4344', '2051', '0'), +('6', '32', '15', '10150', '3004', '0'), +('6', '32', '15', '14631', '2319', '0'), +('6', '32', '15', '10163', '2300', '0'), +('6', '32', '15', '14651', '2224', '0'), +('6', '32', '20', '11684', '10629', '0'), +('6', '32', '20', '11666', '8354', '0'), +('6', '32', '20', '2742', '5163', '0'), +('6', '32', '20', '2288', '4478', '0'), +('6', '32', '12', '2291', '3830', '0'), +('6', '32', '12', '20655', '3394', '0'), +('6', '32', '12', '2923', '3074', '0'), +('6', '32', '12', '4345', '2305', '0'), +('6', '32', '18', '2292', '2387', '0'), +('6', '32', '18', '3806', '2195', '0'), +('6', '32', '18', '2461', '1739', '0'), +('6', '32', '18', '4410', '1142', '0'), +('6', '32', '19', '4407', '3539', '0'), +('6', '32', '19', '68239', '3083', '0'), +('6', '32', '19', '2293', '2395', '0'), +('6', '32', '19', '1368', '2016', '0'), +('6', '32', '13', '14555', '8726', '0'), +('6', '32', '13', '6411', '8644', '0'), +('6', '32', '13', '11683', '8486', '0'), +('6', '32', '13', '11563', '6321', '0'), +('6', '32', '14', '14555', '8726', '0'), +('6', '32', '14', '10335', '6947', '0'), +('6', '32', '14', '10333', '5300', '0'), +('6', '32', '14', '13991', '4866', '0'), +('6', '32', '11', '9246', '3878', '0'), +('6', '32', '11', '14762', '2204', '0'), +('6', '32', '11', '16941', '773', '0'), +('6', '32', '11', '20677', '450', '0'), +('6', '33', '22', '9246', '0', '0'), +('6', '33', '22', '10323', '0', '0'), +('6', '33', '22', '44492', '0', '0'), +('6', '33', '22', '13101', '0', '0'), +('6', '33', '1', '12801', '4762', '0'), +('6', '33', '1', '14702', '3750', '0'), +('6', '33', '1', '14701', '2862', '0'), +('6', '33', '1', '30361', '2640', '0'), +('6', '33', '2', '10143', '5368', '0'), +('6', '33', '2', '30363', '3700', '0'), +('6', '33', '2', '2294', '2837', '0'), +('6', '33', '2', '3000', '2534', '0'), +('6', '33', '3', '11052', '5980', '0'), +('6', '33', '3', '2706', '5245', '0'), +('6', '33', '3', '4505', '2821', '0'), +('6', '33', '3', '14695', '2799', '0'), +('6', '33', '5', '14703', '6050', '0'), +('6', '33', '5', '68291', '3431', '0'), +('6', '33', '5', '14700', '3318', '0'), +('6', '33', '5', '10146', '3226', '0'), +('6', '33', '8', '11603', '11898', '0'), +('6', '33', '8', '2349', '3554', '0'), +('6', '33', '8', '1363', '2510', '0'), +('6', '33', '8', '2913', '1787', '0'), +('6', '33', '6', '2705', '6636', '0'), +('6', '33', '6', '1557', '5310', '0'), +('6', '33', '6', '1904', '3219', '0'), +('6', '33', '6', '1401', '2174', '0'), +('6', '33', '17', '2285', '10961', '0'), +('6', '33', '17', '3802', '5723', '0'), +('6', '33', '17', '4342', '4113', '0'), +('6', '33', '17', '2405', '2083', '0'), +('6', '33', '7', '31809', '3744', '0'), +('6', '33', '7', '2289', '2925', '0'), +('6', '33', '7', '1362', '2624', '0'), +('6', '33', '7', '1321', '1746', '0'), +('6', '33', '9', '3804', '5538', '0'), +('6', '33', '9', '1541', '4959', '0'), +('6', '33', '9', '2290', '2535', '0'), +('6', '33', '9', '4344', '2051', '0'), +('6', '33', '15', '10150', '3004', '0'), +('6', '33', '15', '14631', '2392', '0'), +('6', '33', '15', '10163', '2300', '0'), +('6', '33', '15', '14651', '2224', '0'), +('6', '33', '20', '11684', '10725', '0'), +('6', '33', '20', '11666', '8357', '0'), +('6', '33', '20', '2742', '5166', '0'), +('6', '33', '20', '2288', '4478', '0'), +('6', '33', '12', '2291', '3830', '0'), +('6', '33', '12', '20655', '3419', '0'), +('6', '33', '12', '2923', '3074', '0'), +('6', '33', '12', '4345', '2366', '0'), +('6', '33', '18', '2292', '2436', '0'), +('6', '33', '18', '3806', '2255', '0'), +('6', '33', '18', '2461', '1787', '0'), +('6', '33', '18', '4410', '1142', '0'), +('6', '33', '19', '4407', '3648', '0'), +('6', '33', '19', '68239', '3119', '0'), +('6', '33', '19', '2293', '2431', '0'), +('6', '33', '19', '1368', '2016', '0'), +('6', '33', '13', '14555', '8968', '0'), +('6', '33', '13', '6411', '8753', '0'), +('6', '33', '13', '11683', '8595', '0'), +('6', '33', '13', '11563', '6394', '0'), +('6', '33', '14', '14555', '8968', '0'), +('6', '33', '14', '10335', '7165', '0'), +('6', '33', '14', '10333', '5300', '0'), +('6', '33', '14', '13991', '4986', '0'), +('6', '33', '11', '9246', '3998', '0'), +('6', '33', '11', '14762', '2204', '0'), +('6', '33', '11', '16941', '797', '0'), +('6', '33', '11', '20677', '450', '0'), +('6', '34', '22', '9246', '0', '0'), +('6', '34', '22', '10323', '0', '0'), +('6', '34', '22', '44492', '0', '0'), +('6', '34', '22', '13101', '0', '0'), +('6', '34', '1', '12801', '4762', '0'), +('6', '34', '1', '14702', '3750', '0'), +('6', '34', '1', '14701', '2862', '0'), +('6', '34', '1', '30361', '2640', '0'), +('6', '34', '2', '10143', '5368', '0'), +('6', '34', '2', '30363', '3700', '0'), +('6', '34', '2', '2294', '2861', '0'), +('6', '34', '2', '2191', '2536', '0'), +('6', '34', '3', '11052', '6161', '0'), +('6', '34', '3', '2706', '5366', '0'), +('6', '34', '3', '4505', '2905', '0'), +('6', '34', '3', '14695', '2883', '0'), +('6', '34', '5', '14703', '6050', '0'), +('6', '34', '5', '68291', '3479', '0'), +('6', '34', '5', '14700', '3318', '0'), +('6', '34', '5', '10146', '3262', '0'), +('6', '34', '8', '11603', '12007', '0'), +('6', '34', '8', '2349', '3554', '0'), +('6', '34', '8', '1363', '2510', '0'), +('6', '34', '8', '2913', '1835', '0'), +('6', '34', '6', '2705', '6684', '0'), +('6', '34', '6', '1557', '5310', '0'), +('6', '34', '6', '1904', '3316', '0'), +('6', '34', '6', '1401', '2174', '0'), +('6', '34', '17', '2285', '11009', '0'), +('6', '34', '17', '3802', '5883', '0'), +('6', '34', '17', '4342', '4234', '0'), +('6', '34', '17', '2405', '2145', '0'), +('6', '34', '7', '31809', '3780', '0'), +('6', '34', '7', '2289', '2973', '0'), +('6', '34', '7', '1362', '2624', '0'), +('6', '34', '7', '1321', '1746', '0'), +('6', '34', '9', '3804', '5647', '0'), +('6', '34', '9', '1541', '5080', '0'), +('6', '34', '9', '2290', '2596', '0'), +('6', '34', '9', '4406', '2081', '0'), +('6', '34', '15', '10150', '3004', '0'), +('6', '34', '15', '14631', '2464', '0'), +('6', '34', '15', '10163', '2300', '0'), +('6', '34', '15', '14651', '2224', '0'), +('6', '34', '20', '11684', '10822', '0'), +('6', '34', '20', '11666', '8359', '0'), +('6', '34', '20', '2742', '5169', '0'), +('6', '34', '20', '2288', '4478', '0'), +('6', '34', '12', '2291', '3830', '0'), +('6', '34', '12', '20655', '3443', '0'), +('6', '34', '12', '2923', '3074', '0'), +('6', '34', '12', '4345', '2426', '0'), +('6', '34', '18', '2292', '2484', '0'), +('6', '34', '18', '3806', '2316', '0'), +('6', '34', '18', '2461', '1835', '0'), +('6', '34', '18', '4410', '1142', '0'), +('6', '34', '19', '4407', '3757', '0'), +('6', '34', '19', '68239', '3156', '0'), +('6', '34', '19', '2293', '2467', '0'), +('6', '34', '19', '1368', '2016', '0'), +('6', '34', '13', '14555', '9210', '0'), +('6', '34', '13', '6411', '8861', '0'), +('6', '34', '13', '11683', '8704', '0'), +('6', '34', '13', '11563', '6466', '0'), +('6', '34', '14', '14555', '9210', '0'), +('6', '34', '14', '10335', '7382', '0'), +('6', '34', '14', '10333', '5300', '0'), +('6', '34', '14', '13991', '5107', '0'), +('6', '34', '11', '9246', '4119', '0'), +('6', '34', '11', '14762', '2204', '0'), +('6', '34', '11', '16941', '821', '0'), +('6', '34', '11', '20677', '450', '0'), +('6', '35', '22', '9246', '0', '0'), +('6', '35', '22', '10323', '0', '0'), +('6', '35', '22', '44492', '0', '0'), +('6', '35', '22', '13101', '0', '0'), +('6', '35', '1', '12801', '4762', '0'), +('6', '35', '1', '14702', '3750', '0'), +('6', '35', '1', '14701', '2862', '0'), +('6', '35', '1', '30361', '2640', '0'), +('6', '35', '2', '10143', '5368', '0'), +('6', '35', '2', '30363', '3700', '0'), +('6', '35', '2', '2294', '2885', '0'), +('6', '35', '2', '2191', '2608', '0'), +('6', '35', '3', '11052', '6342', '0'), +('6', '35', '3', '2706', '5486', '0'), +('6', '35', '3', '4505', '2990', '0'), +('6', '35', '3', '14695', '2968', '0'), +('6', '35', '5', '14703', '6050', '0'), +('6', '35', '5', '68291', '3527', '0'), +('6', '35', '5', '14700', '3318', '0'), +('6', '35', '5', '10146', '3299', '0'), +('6', '35', '8', '11603', '12116', '0'), +('6', '35', '8', '2349', '3554', '0'), +('6', '35', '8', '1363', '2510', '0'), +('6', '35', '8', '2913', '1883', '0'), +('6', '35', '6', '2705', '6732', '0'), +('6', '35', '6', '1557', '5310', '0'), +('6', '35', '6', '1904', '3413', '0'), +('6', '35', '6', '1401', '2174', '0'), +('6', '35', '17', '2285', '11058', '0'), +('6', '35', '17', '3802', '6043', '0'), +('6', '35', '17', '4342', '4355', '0'), +('6', '35', '17', '2405', '2206', '0'), +('6', '35', '7', '31809', '3817', '0'), +('6', '35', '7', '2289', '3021', '0'), +('6', '35', '7', '1362', '2624', '0'), +('6', '35', '7', '1321', '1746', '0'), +('6', '35', '9', '3804', '5755', '0'), +('6', '35', '9', '1541', '5200', '0'), +('6', '35', '9', '2290', '2657', '0'), +('6', '35', '9', '4406', '2142', '0'), +('6', '35', '15', '10150', '3004', '0'), +('6', '35', '15', '14631', '2537', '0'), +('6', '35', '15', '10163', '2300', '0'), +('6', '35', '15', '14651', '2224', '0'), +('6', '35', '20', '11684', '10919', '0'), +('6', '35', '20', '11666', '8361', '0'), +('6', '35', '20', '2742', '5172', '0'), +('6', '35', '20', '2288', '4478', '0'), +('6', '35', '12', '2291', '3830', '0'), +('6', '35', '12', '20655', '3468', '0'), +('6', '35', '12', '2923', '3074', '0'), +('6', '35', '12', '4345', '2486', '0'), +('6', '35', '18', '2292', '2532', '0'), +('6', '35', '18', '3806', '2376', '0'), +('6', '35', '18', '2461', '1883', '0'), +('6', '35', '18', '4410', '1142', '0'), +('6', '35', '19', '4407', '3865', '0'), +('6', '35', '19', '68239', '3192', '0'), +('6', '35', '19', '2293', '2503', '0'), +('6', '35', '19', '1368', '2016', '0'), +('6', '35', '13', '14555', '9451', '0'), +('6', '35', '13', '6411', '8970', '0'), +('6', '35', '13', '11683', '8812', '0'), +('6', '35', '13', '11563', '6538', '0'), +('6', '35', '14', '14555', '9451', '0'), +('6', '35', '14', '10335', '7600', '0'), +('6', '35', '14', '10333', '5300', '0'), +('6', '35', '14', '13991', '5228', '0'), +('6', '35', '11', '9246', '4240', '0'), +('6', '35', '11', '14762', '2204', '0'), +('6', '35', '11', '16941', '846', '0'), +('6', '35', '11', '60396', '453', '0'), +('6', '36', '22', '9246', '0', '0'), +('6', '36', '22', '10323', '0', '0'), +('6', '36', '22', '44492', '0', '0'), +('6', '36', '22', '13101', '0', '0'), +('6', '36', '1', '12801', '4762', '0'), +('6', '36', '1', '14702', '3750', '0'), +('6', '36', '1', '14701', '2862', '0'), +('6', '36', '1', '30361', '2640', '0'), +('6', '36', '2', '10143', '5368', '0'), +('6', '36', '2', '30363', '3700', '0'), +('6', '36', '2', '2294', '2910', '0'), +('6', '36', '2', '2191', '2681', '0'), +('6', '36', '3', '11052', '6523', '0'), +('6', '36', '3', '2706', '5607', '0'), +('6', '36', '3', '4505', '3074', '0'), +('6', '36', '3', '14695', '3053', '0'), +('6', '36', '5', '14703', '6050', '0'), +('6', '36', '5', '68291', '3576', '0'), +('6', '36', '5', '10146', '3335', '0'), +('6', '36', '5', '14700', '3318', '0'), +('6', '36', '8', '11603', '12224', '0'), +('6', '36', '8', '2349', '3554', '0'), +('6', '36', '8', '1363', '2510', '0'), +('6', '36', '8', '2913', '1932', '0'), +('6', '36', '6', '2705', '6781', '0'), +('6', '36', '6', '1557', '5310', '0'), +('6', '36', '6', '1904', '3509', '0'), +('6', '36', '6', '1367', '2199', '0'), +('6', '36', '17', '2285', '11106', '0'), +('6', '36', '17', '3802', '6203', '0'), +('6', '36', '17', '4342', '4476', '0'), +('6', '36', '17', '2405', '2267', '0'), +('6', '36', '7', '31809', '3853', '0'), +('6', '36', '7', '2289', '3070', '0'), +('6', '36', '7', '1362', '2624', '0'), +('6', '36', '7', '1321', '1746', '0'), +('6', '36', '9', '3804', '5864', '0'), +('6', '36', '9', '1541', '5321', '0'), +('6', '36', '9', '2290', '2718', '0'), +('6', '36', '9', '4406', '2202', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '36', '15', '10150', '3004', '0'), +('6', '36', '15', '14631', '2609', '0'), +('6', '36', '15', '10163', '2300', '0'), +('6', '36', '15', '14651', '2224', '0'), +('6', '36', '20', '11684', '11015', '0'), +('6', '36', '20', '11666', '8363', '0'), +('6', '36', '20', '2742', '5175', '0'), +('6', '36', '20', '2288', '4478', '0'), +('6', '36', '12', '2291', '3830', '0'), +('6', '36', '12', '20655', '3493', '0'), +('6', '36', '12', '2923', '3074', '0'), +('6', '36', '12', '4345', '2547', '0'), +('6', '36', '18', '2292', '2581', '0'), +('6', '36', '18', '3806', '2436', '0'), +('6', '36', '18', '2461', '1932', '0'), +('6', '36', '18', '4410', '1142', '0'), +('6', '36', '19', '4407', '3974', '0'), +('6', '36', '19', '68239', '3228', '0'), +('6', '36', '19', '2293', '2540', '0'), +('6', '36', '19', '1368', '2016', '0'), +('6', '36', '13', '14555', '9693', '0'), +('6', '36', '13', '6411', '9079', '0'), +('6', '36', '13', '11683', '8921', '0'), +('6', '36', '13', '11563', '6611', '0'), +('6', '36', '14', '14555', '9693', '0'), +('6', '36', '14', '10335', '7817', '0'), +('6', '36', '14', '13991', '5349', '0'), +('6', '36', '14', '10333', '5300', '0'), +('6', '36', '11', '9246', '4361', '0'), +('6', '36', '11', '14762', '2204', '0'), +('6', '36', '11', '16941', '870', '0'), +('6', '36', '11', '60396', '465', '0'), +('6', '37', '22', '9246', '0', '0'), +('6', '37', '22', '10323', '0', '0'), +('6', '37', '22', '44492', '0', '0'), +('6', '37', '22', '13101', '0', '0'), +('6', '37', '1', '12801', '4762', '0'), +('6', '37', '1', '14702', '3750', '0'), +('6', '37', '1', '14701', '2862', '0'), +('6', '37', '1', '30361', '2640', '0'), +('6', '37', '2', '10143', '5368', '0'), +('6', '37', '2', '30363', '3700', '0'), +('6', '37', '2', '2294', '2934', '0'), +('6', '37', '2', '2191', '2753', '0'), +('6', '37', '3', '11052', '6704', '0'), +('6', '37', '3', '2706', '5728', '0'), +('6', '37', '3', '4505', '3159', '0'), +('6', '37', '3', '14695', '3137', '0'), +('6', '37', '5', '14703', '6050', '0'), +('6', '37', '5', '68291', '3624', '0'), +('6', '37', '5', '10146', '3371', '0'), +('6', '37', '5', '14700', '3318', '0'), +('6', '37', '8', '11603', '12333', '0'), +('6', '37', '8', '2349', '3554', '0'), +('6', '37', '8', '1363', '2510', '0'), +('6', '37', '8', '2913', '1980', '0'), +('6', '37', '6', '2705', '6829', '0'), +('6', '37', '6', '1557', '5310', '0'), +('6', '37', '6', '1904', '3606', '0'), +('6', '37', '6', '1367', '2259', '0'), +('6', '37', '17', '2285', '11154', '0'), +('6', '37', '17', '3802', '6363', '0'), +('6', '37', '17', '4342', '4596', '0'), +('6', '37', '17', '2405', '2329', '0'), +('6', '37', '7', '31809', '3889', '0'), +('6', '37', '7', '2289', '3118', '0'), +('6', '37', '7', '1362', '2624', '0'), +('6', '37', '7', '1321', '1746', '0'), +('6', '37', '9', '3804', '5973', '0'), +('6', '37', '9', '1541', '5442', '0'), +('6', '37', '9', '2290', '2779', '0'), +('6', '37', '9', '4406', '2263', '0'), +('6', '37', '15', '10150', '3004', '0'), +('6', '37', '15', '14631', '2682', '0'), +('6', '37', '15', '10163', '2300', '0'), +('6', '37', '15', '14651', '2224', '0'), +('6', '37', '20', '11684', '11112', '0'), +('6', '37', '20', '11666', '8365', '0'), +('6', '37', '20', '2742', '5178', '0'), +('6', '37', '20', '2288', '4478', '0'), +('6', '37', '12', '2291', '3830', '0'), +('6', '37', '12', '20655', '3518', '0'), +('6', '37', '12', '2923', '3074', '0'), +('6', '37', '12', '4345', '2607', '0'), +('6', '37', '18', '2292', '2629', '0'), +('6', '37', '18', '3806', '2497', '0'), +('6', '37', '18', '2461', '1980', '0'), +('6', '37', '18', '4410', '1142', '0'), +('6', '37', '19', '4407', '4083', '0'), +('6', '37', '19', '68239', '3264', '0'), +('6', '37', '19', '2293', '2576', '0'), +('6', '37', '19', '1368', '2016', '0'), +('6', '37', '13', '14555', '9934', '0'), +('6', '37', '13', '6411', '9188', '0'), +('6', '37', '13', '11683', '9030', '0'), +('6', '37', '13', '11563', '6683', '0'), +('6', '37', '14', '14555', '9934', '0'), +('6', '37', '14', '10335', '8034', '0'), +('6', '37', '14', '13991', '5470', '0'), +('6', '37', '14', '10333', '5300', '0'), +('6', '37', '11', '9246', '4482', '0'), +('6', '37', '11', '14762', '2204', '0'), +('6', '37', '11', '16941', '894', '0'), +('6', '37', '11', '60396', '477', '0'), +('6', '38', '22', '9246', '0', '0'), +('6', '38', '22', '10323', '0', '0'), +('6', '38', '22', '44492', '0', '0'), +('6', '38', '22', '13101', '0', '0'), +('6', '38', '1', '12801', '4762', '0'), +('6', '38', '1', '14702', '3750', '0'), +('6', '38', '1', '14701', '2862', '0'), +('6', '38', '1', '30361', '2640', '0'), +('6', '38', '2', '10143', '5368', '0'), +('6', '38', '2', '30363', '3700', '0'), +('6', '38', '2', '2294', '2958', '0'), +('6', '38', '2', '2191', '2826', '0'), +('6', '38', '3', '11052', '6886', '0'), +('6', '38', '3', '2706', '5849', '0'), +('6', '38', '3', '4505', '3243', '0'), +('6', '38', '3', '14695', '3222', '0'), +('6', '38', '5', '14703', '6050', '0'), +('6', '38', '5', '68291', '3672', '0'), +('6', '38', '5', '10146', '3407', '0'), +('6', '38', '5', '14700', '3318', '0'), +('6', '38', '8', '11603', '12442', '0'), +('6', '38', '8', '2349', '3554', '0'), +('6', '38', '8', '1363', '2510', '0'), +('6', '38', '8', '2913', '2028', '0'), +('6', '38', '6', '2705', '6877', '0'), +('6', '38', '6', '1557', '5310', '0'), +('6', '38', '6', '1904', '3703', '0'), +('6', '38', '6', '1367', '2319', '0'), +('6', '38', '17', '2285', '11203', '0'), +('6', '38', '17', '3802', '6522', '0'), +('6', '38', '17', '4342', '4717', '0'), +('6', '38', '17', '2405', '2390', '0'), +('6', '38', '7', '31809', '3925', '0'), +('6', '38', '7', '2289', '3166', '0'), +('6', '38', '7', '1362', '2624', '0'), +('6', '38', '7', '1321', '1746', '0'), +('6', '38', '9', '3804', '6082', '0'), +('6', '38', '9', '1541', '5563', '0'), +('6', '38', '9', '2290', '2840', '0'), +('6', '38', '9', '4406', '2323', '0'), +('6', '38', '15', '10150', '3004', '0'), +('6', '38', '15', '14631', '2754', '0'), +('6', '38', '15', '10163', '2300', '0'), +('6', '38', '15', '14651', '2224', '0'), +('6', '38', '20', '11684', '11209', '0'), +('6', '38', '20', '11666', '8367', '0'), +('6', '38', '20', '2742', '5181', '0'), +('6', '38', '20', '2288', '4478', '0'), +('6', '38', '12', '2291', '3830', '0'), +('6', '38', '12', '20655', '3543', '0'), +('6', '38', '12', '2923', '3074', '0'), +('6', '38', '12', '4345', '2668', '0'), +('6', '38', '18', '2292', '2677', '0'), +('6', '38', '18', '3806', '2557', '0'), +('6', '38', '18', '2461', '2028', '0'), +('6', '38', '18', '4410', '1142', '0'), +('6', '38', '19', '4407', '4192', '0'), +('6', '38', '19', '68239', '3301', '0'), +('6', '38', '19', '2293', '2612', '0'), +('6', '38', '19', '1368', '2016', '0'), +('6', '38', '13', '14555', '10176', '0'), +('6', '38', '13', '6411', '9296', '0'), +('6', '38', '13', '11683', '9139', '0'), +('6', '38', '13', '11563', '6756', '0'), +('6', '38', '14', '14555', '10176', '0'), +('6', '38', '14', '10335', '8252', '0'), +('6', '38', '14', '13991', '5590', '0'), +('6', '38', '14', '10333', '5300', '0'), +('6', '38', '11', '9246', '4602', '0'), +('6', '38', '11', '14762', '2204', '0'), +('6', '38', '11', '16941', '918', '0'), +('6', '38', '11', '60396', '489', '0'), +('6', '39', '22', '9246', '0', '0'), +('6', '39', '22', '10323', '0', '0'), +('6', '39', '22', '44492', '0', '0'), +('6', '39', '22', '13101', '0', '0'), +('6', '39', '1', '12801', '4762', '0'), +('6', '39', '1', '14702', '3750', '0'), +('6', '39', '1', '14701', '2862', '0'), +('6', '39', '1', '30361', '2640', '0'), +('6', '39', '2', '10143', '5368', '0'), +('6', '39', '2', '30363', '3700', '0'), +('6', '39', '2', '2294', '2982', '0'), +('6', '39', '2', '2191', '2898', '0'), +('6', '39', '3', '11052', '7067', '0'), +('6', '39', '3', '2706', '5970', '0'), +('6', '39', '3', '4505', '3328', '0'), +('6', '39', '3', '14695', '3306', '0'), +('6', '39', '5', '14703', '6050', '0'), +('6', '39', '5', '68291', '3721', '0'), +('6', '39', '5', '10146', '3444', '0'), +('6', '39', '5', '14700', '3318', '0'), +('6', '39', '8', '11603', '12550', '0'), +('6', '39', '8', '2349', '3554', '0'), +('6', '39', '8', '1363', '2510', '0'), +('6', '39', '8', '2913', '2077', '0'), +('6', '39', '6', '2705', '6926', '0'), +('6', '39', '6', '1557', '5310', '0'), +('6', '39', '6', '1904', '3799', '0'), +('6', '39', '6', '1367', '2380', '0'), +('6', '39', '17', '2285', '11251', '0'), +('6', '39', '17', '3802', '6682', '0'), +('6', '39', '17', '4342', '4838', '0'), +('6', '39', '17', '2405', '2451', '0'), +('6', '39', '7', '31809', '3962', '0'), +('6', '39', '7', '2289', '3215', '0'), +('6', '39', '7', '1362', '2624', '0'), +('6', '39', '7', '1321', '1746', '0'), +('6', '39', '9', '3804', '6190', '0'), +('6', '39', '9', '1541', '5684', '0'), +('6', '39', '9', '2290', '2901', '0'), +('6', '39', '9', '4406', '2383', '0'), +('6', '39', '15', '10150', '3004', '0'), +('6', '39', '15', '14631', '2827', '0'), +('6', '39', '15', '10163', '2300', '0'), +('6', '39', '15', '14651', '2224', '0'), +('6', '39', '20', '11684', '11305', '0'), +('6', '39', '20', '11666', '8369', '0'), +('6', '39', '20', '2742', '5184', '0'), +('6', '39', '20', '2288', '4478', '0'), +('6', '39', '12', '2291', '3830', '0'), +('6', '39', '12', '20655', '3567', '0'), +('6', '39', '12', '2923', '3074', '0'), +('6', '39', '12', '4345', '2728', '0'), +('6', '39', '18', '2292', '2726', '0'), +('6', '39', '18', '3806', '2618', '0'), +('6', '39', '18', '2461', '2077', '0'), +('6', '39', '18', '4410', '1142', '0'), +('6', '39', '19', '4407', '4300', '0'), +('6', '39', '19', '68239', '3337', '0'), +('6', '39', '19', '2293', '2648', '0'), +('6', '39', '19', '1368', '2016', '0'), +('6', '39', '13', '14555', '10418', '0'), +('6', '39', '13', '6411', '9405', '0'), +('6', '39', '13', '11683', '9247', '0'), +('6', '39', '13', '11563', '6828', '0'), +('6', '39', '14', '14555', '10418', '0'), +('6', '39', '14', '10335', '8469', '0'), +('6', '39', '14', '13991', '5711', '0'), +('6', '39', '14', '10333', '5300', '0'), +('6', '39', '11', '9246', '4723', '0'), +('6', '39', '11', '14762', '2204', '0'), +('6', '39', '11', '16941', '942', '0'), +('6', '39', '11', '60396', '501', '0'), +('6', '40', '22', '9246', '0', '0'), +('6', '40', '22', '10323', '0', '0'), +('6', '40', '22', '44492', '0', '0'), +('6', '40', '22', '13101', '0', '0'), +('6', '40', '1', '12801', '4762', '0'), +('6', '40', '1', '14702', '3750', '0'), +('6', '40', '1', '14701', '2862', '0'), +('6', '40', '1', '30361', '2640', '0'), +('6', '40', '2', '10143', '5368', '0'), +('6', '40', '2', '30363', '3700', '0'), +('6', '40', '2', '2294', '3006', '0'), +('6', '40', '2', '2191', '2970', '0'), +('6', '40', '3', '11052', '7248', '0'), +('6', '40', '3', '2706', '6090', '0'), +('6', '40', '3', '4505', '3413', '0'), +('6', '40', '3', '14695', '3391', '0'), +('6', '40', '5', '14703', '6050', '0'), +('6', '40', '5', '68291', '3769', '0'), +('6', '40', '5', '10146', '3480', '0'), +('6', '40', '5', '14700', '3318', '0'), +('6', '40', '8', '11603', '12659', '0'), +('6', '40', '8', '2349', '3554', '0'), +('6', '40', '8', '1363', '2510', '0'), +('6', '40', '8', '2913', '2125', '0'), +('6', '40', '6', '2705', '6974', '0'), +('6', '40', '6', '1557', '5310', '0'), +('6', '40', '6', '1904', '3896', '0'), +('6', '40', '6', '1367', '2440', '0'), +('6', '40', '17', '2285', '11299', '0'), +('6', '40', '17', '3802', '6842', '0'), +('6', '40', '17', '4342', '4959', '0'), +('6', '40', '17', '2405', '2513', '0'), +('6', '40', '7', '31809', '3998', '0'), +('6', '40', '7', '2289', '3263', '0'), +('6', '40', '7', '1362', '2624', '0'), +('6', '40', '7', '1321', '1746', '0'), +('6', '40', '9', '3804', '6299', '0'), +('6', '40', '9', '1541', '5804', '0'), +('6', '40', '9', '2290', '2962', '0'), +('6', '40', '9', '4406', '2444', '0'), +('6', '40', '15', '10150', '3004', '0'), +('6', '40', '15', '14631', '2899', '0'), +('6', '40', '15', '10163', '2300', '0'), +('6', '40', '15', '14651', '2224', '0'), +('6', '40', '20', '11684', '11402', '0'), +('6', '40', '20', '11666', '8371', '0'), +('6', '40', '20', '2742', '5187', '0'), +('6', '40', '20', '2288', '4478', '0'), +('6', '40', '12', '2291', '3830', '0'), +('6', '40', '12', '20655', '3592', '0'), +('6', '40', '12', '2923', '3074', '0'), +('6', '40', '12', '4345', '2788', '0'), +('6', '40', '18', '2292', '2774', '0'), +('6', '40', '18', '3806', '2678', '0'), +('6', '40', '18', '2461', '2125', '0'), +('6', '40', '18', '4410', '1142', '0'), +('6', '40', '19', '4407', '4409', '0'), +('6', '40', '19', '68239', '3373', '0'), +('6', '40', '19', '2293', '2685', '0'), +('6', '40', '19', '1368', '2016', '0'), +('6', '40', '13', '14555', '10659', '0'), +('6', '40', '13', '6411', '9514', '0'), +('6', '40', '13', '11683', '9356', '0'), +('6', '40', '13', '11563', '6901', '0'), +('6', '40', '14', '14555', '10659', '0'), +('6', '40', '14', '10335', '8687', '0'), +('6', '40', '14', '13991', '5832', '0'), +('6', '40', '14', '10333', '5300', '0'), +('6', '40', '11', '9246', '4844', '0'), +('6', '40', '11', '14762', '2204', '0'), +('6', '40', '11', '16941', '966', '0'), +('6', '40', '11', '60396', '513', '0'), +('6', '41', '22', '9246', '0', '0'), +('6', '41', '22', '10323', '0', '0'), +('6', '41', '22', '44492', '0', '0'), +('6', '41', '22', '13101', '0', '0'), +('6', '41', '1', '12801', '4762', '0'), +('6', '41', '1', '14702', '3750', '0'), +('6', '41', '1', '14701', '2862', '0'), +('6', '41', '1', '30361', '2640', '0'), +('6', '41', '2', '10143', '5368', '0'), +('6', '41', '2', '30363', '3700', '0'), +('6', '41', '2', '2191', '3043', '0'), +('6', '41', '2', '2294', '3030', '0'), +('6', '41', '3', '11052', '7429', '0'), +('6', '41', '3', '2706', '6211', '0'), +('6', '41', '3', '4505', '3497', '0'), +('6', '41', '3', '14695', '3475', '0'), +('6', '41', '5', '14703', '6050', '0'), +('6', '41', '5', '68291', '3817', '0'), +('6', '41', '5', '10146', '3516', '0'), +('6', '41', '5', '14700', '3318', '0'), +('6', '41', '8', '11603', '12768', '0'), +('6', '41', '8', '2349', '3554', '0'), +('6', '41', '8', '1363', '2510', '0'), +('6', '41', '8', '2913', '2173', '0'), +('6', '41', '6', '2705', '7022', '0'), +('6', '41', '6', '1557', '5310', '0'), +('6', '41', '6', '1904', '3992', '0'), +('6', '41', '6', '1367', '2501', '0'), +('6', '41', '17', '2285', '11348', '0'), +('6', '41', '17', '3802', '7002', '0'), +('6', '41', '17', '4342', '5080', '0'), +('6', '41', '17', '2405', '2574', '0'), +('6', '41', '7', '31809', '4034', '0'), +('6', '41', '7', '2289', '3311', '0'), +('6', '41', '7', '1362', '2624', '0'), +('6', '41', '7', '1321', '1746', '0'), +('6', '41', '9', '3804', '6408', '0'), +('6', '41', '9', '1541', '5925', '0'), +('6', '41', '9', '2290', '3023', '0'), +('6', '41', '9', '4406', '2504', '0'), +('6', '41', '15', '10150', '3004', '0'), +('6', '41', '15', '14631', '2972', '0'), +('6', '41', '15', '10163', '2300', '0'), +('6', '41', '15', '14651', '2224', '0'), +('6', '41', '20', '11684', '11498', '0'), +('6', '41', '20', '11666', '8374', '0'), +('6', '41', '20', '2742', '5190', '0'), +('6', '41', '20', '2288', '4478', '0'), +('6', '41', '12', '2291', '3830', '0'), +('6', '41', '12', '20655', '3617', '0'), +('6', '41', '12', '2923', '3074', '0'), +('6', '41', '12', '4345', '2849', '0'), +('6', '41', '18', '2292', '2822', '0'), +('6', '41', '18', '3806', '2738', '0'), +('6', '41', '18', '2461', '2173', '0'), +('6', '41', '18', '4410', '1142', '0'), +('6', '41', '19', '4407', '4518', '0'), +('6', '41', '19', '68239', '3409', '0'), +('6', '41', '19', '2293', '2721', '0'), +('6', '41', '19', '1368', '2016', '0'), +('6', '41', '13', '14555', '10901', '0'), +('6', '41', '13', '6411', '9622', '0'), +('6', '41', '13', '11683', '9465', '0'), +('6', '41', '13', '11563', '6973', '0'), +('6', '41', '14', '14555', '10901', '0'), +('6', '41', '14', '10335', '8904', '0'), +('6', '41', '14', '13991', '5953', '0'), +('6', '41', '14', '10333', '5300', '0'), +('6', '41', '11', '9246', '4965', '0'), +('6', '41', '11', '14762', '2204', '0'), +('6', '41', '11', '16941', '991', '0'), +('6', '41', '11', '60396', '525', '0'), +('6', '42', '22', '9246', '0', '0'), +('6', '42', '22', '10323', '0', '0'), +('6', '42', '22', '44492', '0', '0'), +('6', '42', '22', '13101', '0', '0'), +('6', '42', '1', '12801', '4762', '0'), +('6', '42', '1', '14702', '3750', '0'), +('6', '42', '1', '14701', '2862', '0'), +('6', '42', '1', '30361', '2640', '0'), +('6', '42', '2', '10143', '5368', '0'), +('6', '42', '2', '30363', '3700', '0'), +('6', '42', '2', '2191', '3115', '0'), +('6', '42', '2', '2294', '3055', '0'), +('6', '42', '3', '11052', '7610', '0'), +('6', '42', '3', '2706', '6332', '0'), +('6', '42', '3', '4505', '3582', '0'), +('6', '42', '3', '14695', '3560', '0'), +('6', '42', '5', '14703', '6050', '0'), +('6', '42', '5', '68291', '3866', '0'), +('6', '42', '5', '10146', '3552', '0'), +('6', '42', '5', '14700', '3318', '0'), +('6', '42', '8', '11603', '12877', '0'), +('6', '42', '8', '2349', '3554', '0'), +('6', '42', '8', '1363', '2510', '0'), +('6', '42', '8', '2913', '2222', '0'), +('6', '42', '6', '2705', '7071', '0'), +('6', '42', '6', '1557', '5310', '0'), +('6', '42', '6', '1904', '4089', '0'), +('6', '42', '6', '1367', '2561', '0'), +('6', '42', '17', '2285', '11396', '0'), +('6', '42', '17', '3802', '7161', '0'), +('6', '42', '17', '4342', '5200', '0'), +('6', '42', '17', '2405', '2635', '0'), +('6', '42', '7', '31809', '4070', '0'), +('6', '42', '7', '2289', '3360', '0'), +('6', '42', '7', '1362', '2624', '0'), +('6', '42', '7', '1321', '1746', '0'), +('6', '42', '9', '3804', '6516', '0'), +('6', '42', '9', '1541', '6046', '0'), +('6', '42', '9', '2290', '3084', '0'), +('6', '42', '9', '4406', '2565', '0'), +('6', '42', '15', '14631', '3044', '0'), +('6', '42', '15', '10150', '3004', '0'), +('6', '42', '15', '10163', '2300', '0'), +('6', '42', '15', '14651', '2224', '0'), +('6', '42', '20', '11684', '11595', '0'), +('6', '42', '20', '11666', '8376', '0'), +('6', '42', '20', '2742', '5193', '0'), +('6', '42', '20', '2288', '4478', '0'), +('6', '42', '12', '2291', '3830', '0'), +('6', '42', '12', '20655', '3642', '0'), +('6', '42', '12', '2923', '3074', '0'), +('6', '42', '12', '4345', '2909', '0'), +('6', '42', '18', '2292', '2871', '0'), +('6', '42', '18', '3806', '2799', '0'), +('6', '42', '18', '2461', '2222', '0'), +('6', '42', '18', '4410', '1142', '0'), +('6', '42', '19', '4407', '4626', '0'), +('6', '42', '19', '68239', '3446', '0'), +('6', '42', '19', '2293', '2757', '0'), +('6', '42', '19', '1368', '2016', '0'), +('6', '42', '13', '14555', '11142', '0'), +('6', '42', '13', '6411', '9731', '0'), +('6', '42', '13', '11683', '9573', '0'), +('6', '42', '13', '11563', '7046', '0'), +('6', '42', '14', '14555', '11142', '0'), +('6', '42', '14', '10335', '9122', '0'), +('6', '42', '14', '13991', '6074', '0'), +('6', '42', '14', '10333', '5300', '0'), +('6', '42', '11', '9246', '5086', '0'), +('6', '42', '11', '14762', '2204', '0'), +('6', '42', '11', '16941', '1015', '0'), +('6', '42', '11', '60396', '537', '0'), +('6', '43', '22', '9246', '0', '0'), +('6', '43', '22', '10323', '0', '0'), +('6', '43', '22', '44492', '0', '0'), +('6', '43', '22', '13101', '0', '0'), +('6', '43', '1', '12801', '4762', '0'), +('6', '43', '1', '14702', '3750', '0'), +('6', '43', '1', '14701', '2862', '0'), +('6', '43', '1', '30361', '2640', '0'), +('6', '43', '2', '10143', '5368', '0'), +('6', '43', '2', '30363', '3700', '0'), +('6', '43', '2', '2191', '3188', '0'), +('6', '43', '2', '2294', '3079', '0'), +('6', '43', '3', '11052', '7792', '0'), +('6', '43', '3', '2706', '6453', '0'), +('6', '43', '3', '4505', '3666', '0'), +('6', '43', '3', '14695', '3645', '0'), +('6', '43', '5', '14703', '6050', '0'), +('6', '43', '5', '68291', '3914', '0'), +('6', '43', '5', '10146', '3589', '0'), +('6', '43', '5', '14700', '3318', '0'), +('6', '43', '8', '11603', '12985', '0'), +('6', '43', '8', '2349', '3554', '0'), +('6', '43', '8', '1363', '2510', '0'), +('6', '43', '8', '2913', '2270', '0'), +('6', '43', '6', '2705', '7119', '0'), +('6', '43', '6', '1557', '5310', '0'), +('6', '43', '6', '1904', '4186', '0'), +('6', '43', '6', '1367', '2621', '0'), +('6', '43', '17', '2285', '11444', '0'), +('6', '43', '17', '3802', '7321', '0'), +('6', '43', '17', '4342', '5321', '0'), +('6', '43', '17', '2405', '2697', '0'), +('6', '43', '7', '31809', '4107', '0'), +('6', '43', '7', '2289', '3408', '0'), +('6', '43', '7', '1362', '2624', '0'), +('6', '43', '7', '1321', '1746', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '43', '9', '3804', '6625', '0'), +('6', '43', '9', '1541', '6167', '0'), +('6', '43', '9', '2290', '3145', '0'), +('6', '43', '9', '4406', '2625', '0'), +('6', '43', '15', '14631', '3117', '0'), +('6', '43', '15', '10150', '3004', '0'), +('6', '43', '15', '10163', '2300', '0'), +('6', '43', '15', '14651', '2224', '0'), +('6', '43', '20', '11684', '11692', '0'), +('6', '43', '20', '11666', '8378', '0'), +('6', '43', '20', '2742', '5196', '0'), +('6', '43', '20', '2288', '4478', '0'), +('6', '43', '12', '2291', '3830', '0'), +('6', '43', '12', '20655', '3666', '0'), +('6', '43', '12', '2923', '3074', '0'), +('6', '43', '12', '4345', '2970', '0'), +('6', '43', '18', '2292', '2919', '0'), +('6', '43', '18', '3806', '2859', '0'), +('6', '43', '18', '2461', '2270', '0'), +('6', '43', '18', '4410', '1142', '0'), +('6', '43', '19', '4407', '4735', '0'), +('6', '43', '19', '68239', '3482', '0'), +('6', '43', '19', '2293', '2793', '0'), +('6', '43', '19', '1368', '2016', '0'), +('6', '43', '13', '14555', '11384', '0'), +('6', '43', '13', '6411', '9840', '0'), +('6', '43', '13', '11683', '9682', '0'), +('6', '43', '13', '11563', '7118', '0'), +('6', '43', '14', '14555', '11384', '0'), +('6', '43', '14', '10335', '9339', '0'), +('6', '43', '14', '13991', '6194', '0'), +('6', '43', '14', '10333', '5300', '0'), +('6', '43', '11', '9246', '5206', '0'), +('6', '43', '11', '14762', '2204', '0'), +('6', '43', '11', '16941', '1039', '0'), +('6', '43', '11', '60396', '549', '0'), +('6', '44', '22', '9246', '0', '0'), +('6', '44', '22', '10323', '0', '0'), +('6', '44', '22', '44492', '0', '0'), +('6', '44', '22', '13101', '0', '0'), +('6', '44', '1', '12801', '4762', '0'), +('6', '44', '1', '14702', '3750', '0'), +('6', '44', '1', '14701', '2862', '0'), +('6', '44', '1', '30361', '2640', '0'), +('6', '44', '2', '10143', '5368', '0'), +('6', '44', '2', '30363', '3700', '0'), +('6', '44', '2', '2191', '3260', '0'), +('6', '44', '2', '2294', '3103', '0'), +('6', '44', '3', '11052', '7973', '0'), +('6', '44', '3', '2706', '6574', '0'), +('6', '44', '3', '4505', '3751', '0'), +('6', '44', '3', '14695', '3729', '0'), +('6', '44', '5', '14703', '6050', '0'), +('6', '44', '5', '68291', '3962', '0'), +('6', '44', '5', '10146', '3625', '0'), +('6', '44', '5', '14700', '3318', '0'), +('6', '44', '8', '11603', '13094', '0'), +('6', '44', '8', '2349', '3554', '0'), +('6', '44', '8', '1363', '2510', '0'), +('6', '44', '8', '2913', '2318', '0'), +('6', '44', '6', '2705', '7167', '0'), +('6', '44', '6', '1557', '5310', '0'), +('6', '44', '6', '1904', '4282', '0'), +('6', '44', '6', '1367', '2682', '0'), +('6', '44', '17', '2285', '11493', '0'), +('6', '44', '17', '3802', '7481', '0'), +('6', '44', '17', '4342', '5442', '0'), +('6', '44', '17', '2405', '2758', '0'), +('6', '44', '7', '31809', '4143', '0'), +('6', '44', '7', '2289', '3456', '0'), +('6', '44', '7', '1362', '2624', '0'), +('6', '44', '7', '1321', '1746', '0'), +('6', '44', '9', '3804', '6734', '0'), +('6', '44', '9', '1541', '6288', '0'), +('6', '44', '9', '2290', '3206', '0'), +('6', '44', '9', '4406', '2685', '0'), +('6', '44', '15', '14631', '3189', '0'), +('6', '44', '15', '10150', '3004', '0'), +('6', '44', '15', '10163', '2300', '0'), +('6', '44', '15', '14651', '2224', '0'), +('6', '44', '20', '11684', '11788', '0'), +('6', '44', '20', '11666', '8380', '0'), +('6', '44', '20', '2742', '5199', '0'), +('6', '44', '20', '2288', '4478', '0'), +('6', '44', '12', '2291', '3830', '0'), +('6', '44', '12', '20655', '3691', '0'), +('6', '44', '12', '2923', '3074', '0'), +('6', '44', '12', '4345', '3030', '0'), +('6', '44', '18', '2292', '2967', '0'), +('6', '44', '18', '3806', '2920', '0'), +('6', '44', '18', '2461', '2318', '0'), +('6', '44', '18', '4410', '1142', '0'), +('6', '44', '19', '4407', '4844', '0'), +('6', '44', '19', '68239', '3518', '0'), +('6', '44', '19', '2293', '2830', '0'), +('6', '44', '19', '1368', '2016', '0'), +('6', '44', '13', '14555', '11626', '0'), +('6', '44', '13', '6411', '9949', '0'), +('6', '44', '13', '11683', '9791', '0'), +('6', '44', '13', '11563', '7191', '0'), +('6', '44', '14', '14555', '11626', '0'), +('6', '44', '14', '10335', '9556', '0'), +('6', '44', '14', '13991', '6315', '0'), +('6', '44', '14', '9246', '5327', '0'), +('6', '44', '11', '9246', '5327', '0'), +('6', '44', '11', '14762', '2204', '0'), +('6', '44', '11', '16941', '1063', '0'), +('6', '44', '11', '60396', '562', '0'), +('6', '45', '22', '9246', '0', '0'), +('6', '45', '22', '10323', '0', '0'), +('6', '45', '22', '44492', '0', '0'), +('6', '45', '22', '13101', '0', '0'), +('6', '45', '1', '12801', '4762', '0'), +('6', '45', '1', '14702', '3750', '0'), +('6', '45', '1', '14701', '2862', '0'), +('6', '45', '1', '30361', '2640', '0'), +('6', '45', '2', '10143', '5368', '0'), +('6', '45', '2', '30363', '3700', '0'), +('6', '45', '2', '2191', '3333', '0'), +('6', '45', '2', '2294', '3127', '0'), +('6', '45', '3', '11052', '8154', '0'), +('6', '45', '3', '2706', '6694', '0'), +('6', '45', '3', '4505', '3835', '0'), +('6', '45', '3', '14695', '3814', '0'), +('6', '45', '5', '14703', '6050', '0'), +('6', '45', '5', '68291', '4011', '0'), +('6', '45', '5', '10146', '3661', '0'), +('6', '45', '5', '14700', '3318', '0'), +('6', '45', '8', '11603', '13203', '0'), +('6', '45', '8', '2349', '3554', '0'), +('6', '45', '8', '1363', '2510', '0'), +('6', '45', '8', '2913', '2367', '0'), +('6', '45', '6', '2705', '7215', '0'), +('6', '45', '6', '1557', '5310', '0'), +('6', '45', '6', '1904', '4379', '0'), +('6', '45', '6', '1367', '2742', '0'), +('6', '45', '17', '2285', '11541', '0'), +('6', '45', '17', '3802', '7641', '0'), +('6', '45', '17', '4342', '5563', '0'), +('6', '45', '17', '2405', '2819', '0'), +('6', '45', '7', '31809', '4179', '0'), +('6', '45', '7', '2289', '3505', '0'), +('6', '45', '7', '1362', '2624', '0'), +('6', '45', '7', '1321', '1746', '0'), +('6', '45', '9', '3804', '6843', '0'), +('6', '45', '9', '1541', '6408', '0'), +('6', '45', '9', '2290', '3267', '0'), +('6', '45', '9', '4406', '2746', '0'), +('6', '45', '15', '14631', '3262', '0'), +('6', '45', '15', '10150', '3004', '0'), +('6', '45', '15', '10163', '2300', '0'), +('6', '45', '15', '14651', '2224', '0'), +('6', '45', '20', '11684', '11885', '0'), +('6', '45', '20', '11666', '8382', '0'), +('6', '45', '20', '2742', '5202', '0'), +('6', '45', '20', '2288', '4478', '0'), +('6', '45', '12', '2291', '3830', '0'), +('6', '45', '12', '20655', '3716', '0'), +('6', '45', '12', '4345', '3090', '0'), +('6', '45', '12', '2923', '3074', '0'), +('6', '45', '18', '2292', '3015', '0'), +('6', '45', '18', '3806', '2980', '0'), +('6', '45', '18', '2461', '2367', '0'), +('6', '45', '18', '4410', '1142', '0'), +('6', '45', '19', '4407', '4953', '0'), +('6', '45', '19', '68239', '3554', '0'), +('6', '45', '19', '2293', '2866', '0'), +('6', '45', '19', '1368', '2016', '0'), +('6', '45', '13', '14555', '11867', '0'), +('6', '45', '13', '6411', '10057', '0'), +('6', '45', '13', '11683', '9901', '0'), +('6', '45', '13', '11563', '7263', '0'), +('6', '45', '14', '14555', '11867', '0'), +('6', '45', '14', '10335', '9774', '0'), +('6', '45', '14', '13991', '6436', '0'), +('6', '45', '14', '9246', '5448', '0'), +('6', '45', '11', '9246', '5448', '0'), +('6', '45', '11', '14762', '2204', '0'), +('6', '45', '11', '16941', '1087', '0'), +('6', '45', '11', '60396', '574', '0'), +('6', '46', '22', '9246', '0', '0'), +('6', '46', '22', '10323', '0', '0'), +('6', '46', '22', '44492', '0', '0'), +('6', '46', '22', '13101', '0', '0'), +('6', '46', '1', '12801', '4762', '0'), +('6', '46', '1', '14702', '3750', '0'), +('6', '46', '1', '14701', '2862', '0'), +('6', '46', '1', '30361', '2640', '0'), +('6', '46', '2', '10143', '5368', '0'), +('6', '46', '2', '30363', '3700', '0'), +('6', '46', '2', '2191', '3405', '0'), +('6', '46', '2', '2294', '3151', '0'), +('6', '46', '3', '11052', '8335', '0'), +('6', '46', '3', '2706', '6815', '0'), +('6', '46', '3', '4505', '3920', '0'), +('6', '46', '3', '14695', '3898', '0'), +('6', '46', '5', '14703', '6050', '0'), +('6', '46', '5', '68291', '4059', '0'), +('6', '46', '5', '10146', '3697', '0'), +('6', '46', '5', '2583', '3347', '0'), +('6', '46', '8', '11603', '13312', '0'), +('6', '46', '8', '2349', '3554', '0'), +('6', '46', '8', '1363', '2510', '0'), +('6', '46', '8', '2913', '2415', '0'), +('6', '46', '6', '2705', '7264', '0'), +('6', '46', '6', '1557', '5310', '0'), +('6', '46', '6', '1904', '4476', '0'), +('6', '46', '6', '1367', '2803', '0'), +('6', '46', '17', '2285', '11589', '0'), +('6', '46', '17', '3802', '7800', '0'), +('6', '46', '17', '4342', '5684', '0'), +('6', '46', '17', '2405', '2880', '0'), +('6', '46', '7', '31809', '4215', '0'), +('6', '46', '7', '2289', '3553', '0'), +('6', '46', '7', '1362', '2624', '0'), +('6', '46', '7', '1321', '1746', '0'), +('6', '46', '9', '3804', '6951', '0'), +('6', '46', '9', '1541', '6529', '0'), +('6', '46', '9', '2290', '3328', '0'), +('6', '46', '9', '4406', '2806', '0'), +('6', '46', '15', '14631', '3334', '0'), +('6', '46', '15', '10150', '3004', '0'), +('6', '46', '15', '10163', '2300', '0'), +('6', '46', '15', '14694', '2225', '0'), +('6', '46', '20', '11684', '11982', '0'), +('6', '46', '20', '11666', '8384', '0'), +('6', '46', '20', '2742', '5205', '0'), +('6', '46', '20', '2288', '4478', '0'), +('6', '46', '12', '2291', '3830', '0'), +('6', '46', '12', '20655', '3741', '0'), +('6', '46', '12', '4345', '3151', '0'), +('6', '46', '12', '2923', '3074', '0'), +('6', '46', '18', '2292', '3064', '0'), +('6', '46', '18', '3806', '3040', '0'), +('6', '46', '18', '2461', '2415', '0'), +('6', '46', '18', '4410', '1142', '0'), +('6', '46', '19', '4407', '5061', '0'), +('6', '46', '19', '68239', '3590', '0'), +('6', '46', '19', '2293', '2902', '0'), +('6', '46', '19', '1368', '2016', '0'), +('6', '46', '13', '14555', '12109', '0'), +('6', '46', '13', '6411', '10166', '0'), +('6', '46', '13', '11683', '10010', '0'), +('6', '46', '13', '11563', '7336', '0'), +('6', '46', '14', '14555', '12109', '0'), +('6', '46', '14', '10335', '9991', '0'), +('6', '46', '14', '13991', '6557', '0'), +('6', '46', '14', '9246', '5569', '0'), +('6', '46', '11', '9246', '5569', '0'), +('6', '46', '11', '14762', '2204', '0'), +('6', '46', '11', '16941', '1111', '0'), +('6', '46', '11', '60396', '586', '0'), +('6', '47', '22', '9246', '0', '0'), +('6', '47', '22', '10323', '0', '0'), +('6', '47', '22', '44492', '0', '0'), +('6', '47', '22', '13101', '0', '0'), +('6', '47', '1', '12801', '4762', '0'), +('6', '47', '1', '14702', '3750', '0'), +('6', '47', '1', '14701', '2862', '0'), +('6', '47', '1', '30361', '2640', '0'), +('6', '47', '2', '10143', '5368', '0'), +('6', '47', '2', '30363', '3700', '0'), +('6', '47', '2', '2191', '3478', '0'), +('6', '47', '2', '2294', '3175', '0'), +('6', '47', '3', '11052', '8516', '0'), +('6', '47', '3', '2706', '6936', '0'), +('6', '47', '3', '4505', '4005', '0'), +('6', '47', '3', '14695', '3983', '0'), +('6', '47', '5', '14703', '6050', '0'), +('6', '47', '5', '68291', '4107', '0'), +('6', '47', '5', '10146', '3733', '0'), +('6', '47', '5', '2583', '3383', '0'), +('6', '47', '8', '11603', '13420', '0'), +('6', '47', '8', '2349', '3554', '0'), +('6', '47', '8', '1363', '2510', '0'), +('6', '47', '8', '2913', '2463', '0'), +('6', '47', '6', '2705', '7312', '0'), +('6', '47', '6', '1557', '5310', '0'), +('6', '47', '6', '1904', '4572', '0'), +('6', '47', '6', '1367', '2863', '0'), +('6', '47', '17', '2285', '11637', '0'), +('6', '47', '17', '3802', '7960', '0'), +('6', '47', '17', '4342', '5804', '0'), +('6', '47', '17', '2405', '2942', '0'), +('6', '47', '7', '31809', '4252', '0'), +('6', '47', '7', '2289', '3601', '0'), +('6', '47', '7', '1362', '2624', '0'), +('6', '47', '7', '1321', '1746', '0'), +('6', '47', '9', '3804', '7060', '0'), +('6', '47', '9', '1541', '6650', '0'), +('6', '47', '9', '2290', '3389', '0'), +('6', '47', '9', '4406', '2867', '0'), +('6', '47', '15', '14631', '3407', '0'), +('6', '47', '15', '10150', '3004', '0'), +('6', '47', '15', '10163', '2300', '0'), +('6', '47', '15', '14694', '2273', '0'), +('6', '47', '20', '11684', '12078', '0'), +('6', '47', '20', '11666', '8386', '0'), +('6', '47', '20', '2742', '5208', '0'), +('6', '47', '20', '2288', '4478', '0'), +('6', '47', '12', '2291', '3830', '0'), +('6', '47', '12', '20655', '3765', '0'), +('6', '47', '12', '4345', '3211', '0'), +('6', '47', '12', '2923', '3074', '0'), +('6', '47', '18', '2292', '3112', '0'), +('6', '47', '18', '3806', '3101', '0'), +('6', '47', '18', '2461', '2463', '0'), +('6', '47', '18', '4410', '1142', '0'), +('6', '47', '19', '4407', '5170', '0'), +('6', '47', '19', '68239', '3627', '0'), +('6', '47', '19', '2293', '2938', '0'), +('6', '47', '19', '1368', '2016', '0'), +('6', '47', '13', '14555', '12350', '0'), +('6', '47', '13', '6411', '10275', '0'), +('6', '47', '13', '11683', '10119', '0'), +('6', '47', '13', '11563', '7408', '0'), +('6', '47', '14', '14555', '12350', '0'), +('6', '47', '14', '10335', '10209', '0'), +('6', '47', '14', '13991', '6678', '0'), +('6', '47', '14', '9246', '5690', '0'), +('6', '47', '11', '9246', '5690', '0'), +('6', '47', '11', '14762', '2204', '0'), +('6', '47', '11', '16941', '1136', '0'), +('6', '47', '11', '60396', '598', '0'), +('6', '48', '22', '9246', '0', '0'), +('6', '48', '22', '10323', '0', '0'), +('6', '48', '22', '44492', '0', '0'), +('6', '48', '22', '13101', '0', '0'), +('6', '48', '1', '12801', '4762', '0'), +('6', '48', '1', '14702', '3750', '0'), +('6', '48', '1', '14701', '2862', '0'), +('6', '48', '1', '30361', '2640', '0'), +('6', '48', '2', '10143', '5368', '0'), +('6', '48', '2', '30363', '3700', '0'), +('6', '48', '2', '2191', '3550', '0'), +('6', '48', '2', '2294', '3200', '0'), +('6', '48', '3', '11052', '8698', '0'), +('6', '48', '3', '2706', '7057', '0'), +('6', '48', '3', '4505', '4089', '0'), +('6', '48', '3', '14695', '4067', '0'), +('6', '48', '5', '14703', '6050', '0'), +('6', '48', '5', '68291', '4156', '0'), +('6', '48', '5', '10146', '3770', '0'), +('6', '48', '5', '2583', '3419', '0'), +('6', '48', '8', '11603', '13529', '0'), +('6', '48', '8', '2349', '3554', '0'), +('6', '48', '8', '2913', '2512', '0'), +('6', '48', '8', '1363', '2510', '0'), +('6', '48', '6', '2705', '7360', '0'), +('6', '48', '6', '1557', '5310', '0'), +('6', '48', '6', '1904', '4669', '0'), +('6', '48', '6', '1367', '2923', '0'), +('6', '48', '17', '2285', '11686', '0'), +('6', '48', '17', '3802', '8120', '0'), +('6', '48', '17', '4342', '5925', '0'), +('6', '48', '17', '2405', '3003', '0'), +('6', '48', '7', '31809', '4288', '0'), +('6', '48', '7', '2289', '3650', '0'), +('6', '48', '7', '1362', '2624', '0'), +('6', '48', '7', '1321', '1746', '0'), +('6', '48', '9', '3804', '7169', '0'), +('6', '48', '9', '1541', '6771', '0'), +('6', '48', '9', '2290', '3450', '0'), +('6', '48', '9', '4406', '2927', '0'), +('6', '48', '15', '14631', '3479', '0'), +('6', '48', '15', '10150', '3004', '0'), +('6', '48', '15', '14694', '2322', '0'), +('6', '48', '15', '10163', '2300', '0'), +('6', '48', '20', '11684', '12175', '0'), +('6', '48', '20', '11666', '8388', '0'), +('6', '48', '20', '2742', '5211', '0'), +('6', '48', '20', '2288', '4478', '0'), +('6', '48', '12', '2291', '3830', '0'), +('6', '48', '12', '20655', '3790', '0'), +('6', '48', '12', '4345', '3272', '0'), +('6', '48', '12', '2923', '3074', '0'), +('6', '48', '18', '3806', '3161', '0'), +('6', '48', '18', '2292', '3160', '0'), +('6', '48', '18', '2461', '2512', '0'), +('6', '48', '18', '4410', '1142', '0'), +('6', '48', '19', '4407', '5279', '0'), +('6', '48', '19', '68239', '3663', '0'), +('6', '48', '19', '2293', '2975', '0'), +('6', '48', '19', '1368', '2016', '0'), +('6', '48', '13', '14555', '12592', '0'), +('6', '48', '13', '6411', '10383', '0'), +('6', '48', '13', '11683', '10227', '0'), +('6', '48', '13', '11563', '7481', '0'), +('6', '48', '14', '14555', '12592', '0'), +('6', '48', '14', '10335', '10426', '0'), +('6', '48', '14', '13991', '6798', '0'), +('6', '48', '14', '9246', '5810', '0'), +('6', '48', '11', '9246', '5810', '0'), +('6', '48', '11', '14762', '2204', '0'), +('6', '48', '11', '16941', '1160', '0'), +('6', '48', '11', '60396', '610', '0'), +('6', '49', '22', '9246', '0', '0'), +('6', '49', '22', '10323', '0', '0'), +('6', '49', '22', '44492', '0', '0'), +('6', '49', '22', '13101', '0', '0'), +('6', '49', '1', '12801', '4762', '0'), +('6', '49', '1', '14702', '3750', '0'), +('6', '49', '1', '14701', '2862', '0'), +('6', '49', '1', '30361', '2640', '0'), +('6', '49', '2', '10143', '5368', '0'), +('6', '49', '2', '30363', '3700', '0'), +('6', '49', '2', '2191', '3623', '0'), +('6', '49', '2', '2294', '3224', '0'), +('6', '49', '3', '11052', '8879', '0'), +('6', '49', '3', '2706', '7178', '0'), +('6', '49', '3', '4505', '4174', '0'), +('6', '49', '3', '14695', '4152', '0'), +('6', '49', '5', '14703', '6050', '0'), +('6', '49', '5', '68291', '4204', '0'), +('6', '49', '5', '10146', '3806', '0'), +('6', '49', '5', '2583', '3455', '0'), +('6', '49', '8', '11603', '13638', '0'), +('6', '49', '8', '2349', '3554', '0'), +('6', '49', '8', '2913', '2560', '0'), +('6', '49', '8', '1363', '2510', '0'), +('6', '49', '6', '2705', '7409', '0'), +('6', '49', '6', '1557', '5310', '0'), +('6', '49', '6', '1904', '4766', '0'), +('6', '49', '6', '1367', '2984', '0'), +('6', '49', '17', '2285', '11734', '0'), +('6', '49', '17', '3802', '8280', '0'), +('6', '49', '17', '4342', '6046', '0'), +('6', '49', '17', '2405', '3064', '0'), +('6', '49', '7', '31809', '4324', '0'), +('6', '49', '7', '2289', '3698', '0'), +('6', '49', '7', '1362', '2624', '0'), +('6', '49', '7', '10336', '1779', '0'), +('6', '49', '9', '3804', '7277', '0'), +('6', '49', '9', '1541', '6892', '0'), +('6', '49', '9', '2290', '3511', '0'), +('6', '49', '9', '4406', '2987', '0'), +('6', '49', '15', '14631', '3552', '0'), +('6', '49', '15', '10150', '3004', '0'), +('6', '49', '15', '14694', '2370', '0'), +('6', '49', '15', '10163', '2300', '0'), +('6', '49', '20', '11684', '12272', '0'), +('6', '49', '20', '11666', '8390', '0'), +('6', '49', '20', '2742', '5214', '0'), +('6', '49', '20', '2288', '4478', '0'), +('6', '49', '12', '2291', '3830', '0'), +('6', '49', '12', '20655', '3815', '0'), +('6', '49', '12', '4345', '3332', '0'), +('6', '49', '12', '2923', '3074', '0'), +('6', '49', '18', '3806', '3222', '0'), +('6', '49', '18', '2292', '3209', '0'), +('6', '49', '18', '2461', '2560', '0'), +('6', '49', '18', '4410', '1142', '0'), +('6', '49', '19', '4407', '5387', '0'), +('6', '49', '19', '68239', '3699', '0'), +('6', '49', '19', '2293', '3011', '0'), +('6', '49', '19', '1368', '2016', '0'), +('6', '49', '13', '14555', '12834', '0'), +('6', '49', '13', '6411', '10492', '0'), +('6', '49', '13', '11683', '10336', '0'), +('6', '49', '13', '11563', '7553', '0'), +('6', '49', '14', '14555', '12834', '0'), +('6', '49', '14', '10335', '10644', '0'), +('6', '49', '14', '13991', '6919', '0'), +('6', '49', '14', '9246', '5931', '0'), +('6', '49', '11', '9246', '5931', '0'), +('6', '49', '11', '14762', '2204', '0'), +('6', '49', '11', '16941', '1184', '0'), +('6', '49', '11', '60396', '622', '0'), +('6', '50', '22', '9246', '0', '0'), +('6', '50', '22', '10323', '0', '0'), +('6', '50', '22', '44492', '0', '0'), +('6', '50', '22', '13101', '0', '0'), +('6', '50', '1', '12801', '4762', '0'), +('6', '50', '1', '14702', '3750', '0'), +('6', '50', '1', '14701', '2862', '0'), +('6', '50', '1', '30361', '2640', '0'), +('6', '50', '2', '10143', '5368', '0'), +('6', '50', '2', '30363', '3700', '0'), +('6', '50', '2', '2191', '3695', '0'), +('6', '50', '2', '2294', '3248', '0'), +('6', '50', '3', '11052', '9060', '0'), +('6', '50', '3', '2706', '7298', '0'), +('6', '50', '3', '4505', '4258', '0'), +('6', '50', '3', '14695', '4236', '0'), +('6', '50', '5', '14703', '6050', '0'), +('6', '50', '5', '68291', '4252', '0'), +('6', '50', '5', '10146', '3842', '0'), +('6', '50', '5', '2583', '3492', '0'), +('6', '50', '8', '11603', '13746', '0'), +('6', '50', '8', '2349', '3554', '0'), +('6', '50', '8', '2913', '2608', '0'), +('6', '50', '8', '1363', '2510', '0'), +('6', '50', '6', '2705', '7457', '0'), +('6', '50', '6', '1557', '5310', '0'), +('6', '50', '6', '1904', '4862', '0'), +('6', '50', '6', '1367', '3044', '0'), +('6', '50', '17', '2285', '11782', '0'), +('6', '50', '17', '3802', '8439', '0'), +('6', '50', '17', '4342', '6167', '0'), +('6', '50', '17', '2405', '3126', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '50', '7', '31809', '4360', '0'), +('6', '50', '7', '2289', '3746', '0'), +('6', '50', '7', '1362', '2624', '0'), +('6', '50', '7', '10336', '1816', '0'), +('6', '50', '9', '3804', '7386', '0'), +('6', '50', '9', '1541', '7012', '0'), +('6', '50', '9', '2290', '3572', '0'), +('6', '50', '9', '4406', '3048', '0'), +('6', '50', '15', '14631', '3624', '0'), +('6', '50', '15', '10150', '3004', '0'), +('6', '50', '15', '14694', '2418', '0'), +('6', '50', '15', '10163', '2300', '0'), +('6', '50', '20', '11684', '12368', '0'), +('6', '50', '20', '11666', '8393', '0'), +('6', '50', '20', '2742', '5217', '0'), +('6', '50', '20', '2288', '4478', '0'), +('6', '50', '12', '20655', '3840', '0'), +('6', '50', '12', '2291', '3830', '0'), +('6', '50', '12', '4345', '3392', '0'), +('6', '50', '12', '2923', '3074', '0'), +('6', '50', '18', '3806', '3282', '0'), +('6', '50', '18', '2292', '3257', '0'), +('6', '50', '18', '2461', '2608', '0'), +('6', '50', '18', '4410', '1142', '0'), +('6', '50', '19', '4407', '5496', '0'), +('6', '50', '19', '68239', '3735', '0'), +('6', '50', '19', '2293', '3047', '0'), +('6', '50', '19', '1368', '2016', '0'), +('6', '50', '13', '14555', '13075', '0'), +('6', '50', '13', '6411', '10601', '0'), +('6', '50', '13', '11683', '10445', '0'), +('6', '50', '13', '11563', '7626', '0'), +('6', '50', '14', '14555', '13075', '0'), +('6', '50', '14', '10335', '10861', '0'), +('6', '50', '14', '13991', '7040', '0'), +('6', '50', '14', '9246', '6052', '0'), +('6', '50', '11', '9246', '6052', '0'), +('6', '50', '11', '14762', '2204', '0'), +('6', '50', '11', '16941', '1208', '0'), +('6', '50', '11', '60396', '634', '0'), +('6', '51', '22', '9246', '0', '0'), +('6', '51', '22', '10323', '0', '0'), +('6', '51', '22', '44492', '0', '0'), +('6', '51', '22', '13101', '0', '0'), +('6', '51', '1', '12801', '4762', '0'), +('6', '51', '1', '14702', '3750', '0'), +('6', '51', '1', '14701', '2862', '0'), +('6', '51', '1', '30361', '2640', '0'), +('6', '51', '2', '10143', '5368', '0'), +('6', '51', '2', '2191', '3768', '0'), +('6', '51', '2', '30363', '3700', '0'), +('6', '51', '2', '2294', '3272', '0'), +('6', '51', '3', '11052', '9241', '0'), +('6', '51', '3', '2706', '7419', '0'), +('6', '51', '3', '4505', '4343', '0'), +('6', '51', '3', '14695', '4321', '0'), +('6', '51', '5', '14703', '6050', '0'), +('6', '51', '5', '68291', '4301', '0'), +('6', '51', '5', '10146', '3878', '0'), +('6', '51', '5', '2583', '3528', '0'), +('6', '51', '8', '11603', '13855', '0'), +('6', '51', '8', '2349', '3554', '0'), +('6', '51', '8', '2913', '2657', '0'), +('6', '51', '8', '1363', '2510', '0'), +('6', '51', '6', '2705', '7505', '0'), +('6', '51', '6', '1557', '5310', '0'), +('6', '51', '6', '1904', '4959', '0'), +('6', '51', '6', '1367', '3105', '0'), +('6', '51', '17', '2285', '11831', '0'), +('6', '51', '17', '3802', '8599', '0'), +('6', '51', '17', '4342', '6288', '0'), +('6', '51', '17', '2405', '3187', '0'), +('6', '51', '7', '31809', '4397', '0'), +('6', '51', '7', '2289', '3795', '0'), +('6', '51', '7', '1362', '2624', '0'), +('6', '51', '7', '10336', '1852', '0'), +('6', '51', '9', '3804', '7495', '0'), +('6', '51', '9', '1541', '7133', '0'), +('6', '51', '9', '2290', '3633', '0'), +('6', '51', '9', '4406', '3108', '0'), +('6', '51', '15', '14631', '3696', '0'), +('6', '51', '15', '10150', '3004', '0'), +('6', '51', '15', '14694', '2467', '0'), +('6', '51', '15', '10163', '2300', '0'), +('6', '51', '20', '11684', '12465', '0'), +('6', '51', '20', '11666', '8395', '0'), +('6', '51', '20', '2742', '5220', '0'), +('6', '51', '20', '2288', '4478', '0'), +('6', '51', '12', '20655', '3864', '0'), +('6', '51', '12', '2291', '3830', '0'), +('6', '51', '12', '4345', '3453', '0'), +('6', '51', '12', '2923', '3074', '0'), +('6', '51', '18', '3806', '3342', '0'), +('6', '51', '18', '2292', '3305', '0'), +('6', '51', '18', '2461', '2657', '0'), +('6', '51', '18', '4410', '1142', '0'), +('6', '51', '19', '4407', '5605', '0'), +('6', '51', '19', '68239', '3772', '0'), +('6', '51', '19', '2293', '3083', '0'), +('6', '51', '19', '1368', '2016', '0'), +('6', '51', '13', '14555', '13317', '0'), +('6', '51', '13', '6411', '10710', '0'), +('6', '51', '13', '11683', '10553', '0'), +('6', '51', '13', '11563', '7698', '0'), +('6', '51', '14', '14555', '13317', '0'), +('6', '51', '14', '10335', '11079', '0'), +('6', '51', '14', '13991', '7161', '0'), +('6', '51', '14', '9246', '6173', '0'), +('6', '51', '11', '9246', '6173', '0'), +('6', '51', '11', '14762', '2204', '0'), +('6', '51', '11', '16941', '1232', '0'), +('6', '51', '11', '60396', '646', '0'), +('6', '52', '22', '9246', '0', '0'), +('6', '52', '22', '10323', '0', '0'), +('6', '52', '22', '44492', '0', '0'), +('6', '52', '22', '13101', '0', '0'), +('6', '52', '1', '12801', '4762', '0'), +('6', '52', '1', '14702', '3750', '0'), +('6', '52', '1', '14701', '2862', '0'), +('6', '52', '1', '30361', '2640', '0'), +('6', '52', '2', '10143', '5368', '0'), +('6', '52', '2', '2191', '3840', '0'), +('6', '52', '2', '30363', '3700', '0'), +('6', '52', '2', '2294', '3296', '0'), +('6', '52', '3', '11052', '9422', '0'), +('6', '52', '3', '2706', '7540', '0'), +('6', '52', '3', '4505', '4427', '0'), +('6', '52', '3', '14695', '4406', '0'), +('6', '52', '5', '14703', '6050', '0'), +('6', '52', '5', '68291', '4349', '0'), +('6', '52', '5', '10146', '3915', '0'), +('6', '52', '5', '2583', '3564', '0'), +('6', '52', '8', '11603', '13964', '0'), +('6', '52', '8', '2349', '3554', '0'), +('6', '52', '8', '2913', '2705', '0'), +('6', '52', '8', '2340', '2537', '0'), +('6', '52', '6', '2705', '7554', '0'), +('6', '52', '6', '1557', '5310', '0'), +('6', '52', '6', '1904', '5055', '0'), +('6', '52', '6', '1367', '3165', '0'), +('6', '52', '17', '2285', '11879', '0'), +('6', '52', '17', '3802', '8759', '0'), +('6', '52', '17', '4342', '6408', '0'), +('6', '52', '17', '2405', '3248', '0'), +('6', '52', '7', '31809', '4433', '0'), +('6', '52', '7', '2289', '3843', '0'), +('6', '52', '7', '1362', '2624', '0'), +('6', '52', '7', '10336', '1888', '0'), +('6', '52', '9', '3804', '7604', '0'), +('6', '52', '9', '1541', '7254', '0'), +('6', '52', '9', '2290', '3694', '0'), +('6', '52', '9', '4406', '3169', '0'), +('6', '52', '15', '14631', '3769', '0'), +('6', '52', '15', '10150', '3004', '0'), +('6', '52', '15', '14694', '2515', '0'), +('6', '52', '15', '10163', '2300', '0'), +('6', '52', '20', '11684', '12562', '0'), +('6', '52', '20', '11666', '8397', '0'), +('6', '52', '20', '2742', '5223', '0'), +('6', '52', '20', '2288', '4478', '0'), +('6', '52', '12', '20655', '3889', '0'), +('6', '52', '12', '2291', '3830', '0'), +('6', '52', '12', '4345', '3513', '0'), +('6', '52', '12', '2923', '3074', '0'), +('6', '52', '18', '3806', '3403', '0'), +('6', '52', '18', '2292', '3354', '0'), +('6', '52', '18', '2461', '2705', '0'), +('6', '52', '18', '4410', '1142', '0'), +('6', '52', '19', '4407', '5714', '0'), +('6', '52', '19', '68239', '3808', '0'), +('6', '52', '19', '2293', '3120', '0'), +('6', '52', '19', '1368', '2016', '0'), +('6', '52', '13', '14555', '13558', '0'), +('6', '52', '13', '6411', '10818', '0'), +('6', '52', '13', '11683', '10662', '0'), +('6', '52', '13', '11563', '7771', '0'), +('6', '52', '14', '14555', '13558', '0'), +('6', '52', '14', '10335', '11296', '0'), +('6', '52', '14', '13991', '7282', '0'), +('6', '52', '14', '9246', '6294', '0'), +('6', '52', '11', '9246', '6294', '0'), +('6', '52', '11', '14762', '2204', '0'), +('6', '52', '11', '16941', '1256', '0'), +('6', '52', '11', '60396', '658', '0'), +('6', '53', '22', '9246', '0', '0'), +('6', '53', '22', '10323', '0', '0'), +('6', '53', '22', '44492', '0', '0'), +('6', '53', '22', '13101', '0', '0'), +('6', '53', '1', '12801', '4762', '0'), +('6', '53', '1', '14702', '3750', '0'), +('6', '53', '1', '14701', '2862', '0'), +('6', '53', '1', '30361', '2640', '0'), +('6', '53', '2', '10143', '5368', '0'), +('6', '53', '2', '2191', '3913', '0'), +('6', '53', '2', '30363', '3700', '0'), +('6', '53', '2', '2294', '3320', '0'), +('6', '53', '3', '11052', '9604', '0'), +('6', '53', '3', '2706', '7661', '0'), +('6', '53', '3', '4505', '4512', '0'), +('6', '53', '3', '14695', '4490', '0'), +('6', '53', '5', '14703', '6050', '0'), +('6', '53', '5', '68291', '4397', '0'), +('6', '53', '5', '10146', '3951', '0'), +('6', '53', '5', '2583', '3600', '0'), +('6', '53', '8', '11603', '14073', '0'), +('6', '53', '8', '2349', '3554', '0'), +('6', '53', '8', '2913', '2753', '0'), +('6', '53', '8', '2340', '2585', '0'), +('6', '53', '6', '2705', '7602', '0'), +('6', '53', '6', '1557', '5310', '0'), +('6', '53', '6', '1904', '5152', '0'), +('6', '53', '6', '1367', '3225', '0'), +('6', '53', '17', '2285', '11927', '0'), +('6', '53', '17', '3802', '8919', '0'), +('6', '53', '17', '4342', '6529', '0'), +('6', '53', '17', '2405', '3310', '0'), +('6', '53', '7', '31809', '4469', '0'), +('6', '53', '7', '2289', '3891', '0'), +('6', '53', '7', '1362', '2624', '0'), +('6', '53', '7', '10336', '1924', '0'), +('6', '53', '9', '3804', '7712', '0'), +('6', '53', '9', '1541', '7375', '0'), +('6', '53', '9', '2290', '3755', '0'), +('6', '53', '9', '4406', '3229', '0'), +('6', '53', '15', '14631', '3841', '0'), +('6', '53', '15', '10150', '3004', '0'), +('6', '53', '15', '14694', '2563', '0'), +('6', '53', '15', '10163', '2300', '0'), +('6', '53', '20', '11684', '12658', '0'), +('6', '53', '20', '11666', '8399', '0'), +('6', '53', '20', '2742', '5227', '0'), +('6', '53', '20', '2288', '4478', '0'), +('6', '53', '12', '20655', '3914', '0'), +('6', '53', '12', '2291', '3830', '0'), +('6', '53', '12', '4345', '3574', '0'), +('6', '53', '12', '2923', '3074', '0'), +('6', '53', '18', '3806', '3463', '0'), +('6', '53', '18', '2292', '3402', '0'), +('6', '53', '18', '2461', '2753', '0'), +('6', '53', '18', '4410', '1142', '0'), +('6', '53', '19', '4407', '5822', '0'), +('6', '53', '19', '68239', '3844', '0'), +('6', '53', '19', '2293', '3156', '0'), +('6', '53', '19', '1368', '2016', '0'), +('6', '53', '13', '14555', '13800', '0'), +('6', '53', '13', '6411', '10927', '0'), +('6', '53', '13', '11683', '10771', '0'), +('6', '53', '13', '11563', '7843', '0'), +('6', '53', '14', '14555', '13800', '0'), +('6', '53', '14', '10335', '11513', '0'), +('6', '53', '14', '13991', '7402', '0'), +('6', '53', '14', '9246', '6414', '0'), +('6', '53', '11', '9246', '6414', '0'), +('6', '53', '11', '14762', '2204', '0'), +('6', '53', '11', '16941', '1280', '0'), +('6', '53', '11', '60396', '670', '0'), +('6', '54', '22', '9246', '0', '0'), +('6', '54', '22', '10323', '0', '0'), +('6', '54', '22', '44492', '0', '0'), +('6', '54', '22', '13101', '0', '0'), +('6', '54', '1', '12801', '4762', '0'), +('6', '54', '1', '14702', '3750', '0'), +('6', '54', '1', '14701', '2862', '0'), +('6', '54', '1', '30361', '2640', '0'), +('6', '54', '2', '10143', '5368', '0'), +('6', '54', '2', '2191', '3985', '0'), +('6', '54', '2', '30363', '3700', '0'), +('6', '54', '2', '2294', '3345', '0'), +('6', '54', '3', '11052', '9785', '0'), +('6', '54', '3', '2706', '7782', '0'), +('6', '54', '3', '4505', '4596', '0'), +('6', '54', '3', '14695', '4575', '0'), +('6', '54', '5', '14703', '6050', '0'), +('6', '54', '5', '68291', '4446', '0'), +('6', '54', '5', '10146', '3987', '0'), +('6', '54', '5', '2583', '3637', '0'), +('6', '54', '8', '11603', '14181', '0'), +('6', '54', '8', '2349', '3554', '0'), +('6', '54', '8', '2913', '2802', '0'), +('6', '54', '8', '2340', '2633', '0'), +('6', '54', '6', '2705', '7650', '0'), +('6', '54', '6', '1557', '5310', '0'), +('6', '54', '6', '1904', '5249', '0'), +('6', '54', '6', '1367', '3286', '0'), +('6', '54', '17', '2285', '11976', '0'), +('6', '54', '17', '3802', '9078', '0'), +('6', '54', '17', '4342', '6650', '0'), +('6', '54', '17', '2405', '3371', '0'), +('6', '54', '7', '31809', '4505', '0'), +('6', '54', '7', '2289', '3939', '0'), +('6', '54', '7', '1362', '2624', '0'), +('6', '54', '7', '10336', '1961', '0'), +('6', '54', '9', '3804', '7821', '0'), +('6', '54', '9', '1541', '7496', '0'), +('6', '54', '9', '2290', '3816', '0'), +('6', '54', '9', '4406', '3289', '0'), +('6', '54', '15', '14631', '3914', '0'), +('6', '54', '15', '10150', '3004', '0'), +('6', '54', '15', '14694', '2612', '0'), +('6', '54', '15', '10163', '2300', '0'), +('6', '54', '20', '11684', '12755', '0'), +('6', '54', '20', '11666', '8401', '0'), +('6', '54', '20', '2742', '5230', '0'), +('6', '54', '20', '2288', '4478', '0'), +('6', '54', '12', '20655', '3939', '0'), +('6', '54', '12', '2291', '3830', '0'), +('6', '54', '12', '4345', '3634', '0'), +('6', '54', '12', '2923', '3074', '0'), +('6', '54', '18', '3806', '3524', '0'), +('6', '54', '18', '2292', '3450', '0'), +('6', '54', '18', '2461', '2802', '0'), +('6', '54', '18', '4410', '1142', '0'), +('6', '54', '19', '4407', '5931', '0'), +('6', '54', '19', '68239', '3880', '0'), +('6', '54', '19', '2293', '3192', '0'), +('6', '54', '19', '1368', '2016', '0'), +('6', '54', '13', '14555', '14042', '0'), +('6', '54', '13', '6411', '11036', '0'), +('6', '54', '13', '11683', '10880', '0'), +('6', '54', '13', '11563', '7916', '0'), +('6', '54', '14', '14555', '14042', '0'), +('6', '54', '14', '10335', '11731', '0'), +('6', '54', '14', '13991', '7523', '0'), +('6', '54', '14', '9246', '6535', '0'), +('6', '54', '11', '9246', '6535', '0'), +('6', '54', '11', '14762', '2204', '0'), +('6', '54', '11', '16941', '1305', '0'), +('6', '54', '11', '60396', '682', '0'), +('6', '55', '22', '9246', '0', '0'), +('6', '55', '22', '10323', '0', '0'), +('6', '55', '22', '44492', '0', '0'), +('6', '55', '22', '13101', '0', '0'), +('6', '55', '1', '12801', '4762', '0'), +('6', '55', '1', '14702', '3750', '0'), +('6', '55', '1', '14701', '2862', '0'), +('6', '55', '1', '30361', '2640', '0'), +('6', '55', '2', '10143', '5368', '0'), +('6', '55', '2', '2191', '4058', '0'), +('6', '55', '2', '30363', '3700', '0'), +('6', '55', '2', '2294', '3369', '0'), +('6', '55', '3', '11052', '9966', '0'), +('6', '55', '3', '2706', '7902', '0'), +('6', '55', '3', '4505', '4681', '0'), +('6', '55', '3', '14695', '4659', '0'), +('6', '55', '5', '14703', '6050', '0'), +('6', '55', '5', '68291', '4494', '0'), +('6', '55', '5', '10146', '4023', '0'), +('6', '55', '5', '2583', '3673', '0'), +('6', '55', '8', '11603', '14290', '0'), +('6', '55', '8', '2349', '3554', '0'), +('6', '55', '8', '2913', '2850', '0'), +('6', '55', '8', '2340', '2682', '0'), +('6', '55', '6', '2705', '7699', '0'), +('6', '55', '6', '1904', '5345', '0'), +('6', '55', '6', '1557', '5310', '0'), +('6', '55', '6', '1367', '3346', '0'), +('6', '55', '17', '2285', '12024', '0'), +('6', '55', '17', '3802', '9238', '0'), +('6', '55', '17', '4342', '6771', '0'), +('6', '55', '17', '2405', '3432', '0'), +('6', '55', '7', '31809', '4542', '0'), +('6', '55', '7', '2289', '3988', '0'), +('6', '55', '7', '1362', '2624', '0'), +('6', '55', '7', '10336', '1997', '0'), +('6', '55', '9', '3804', '7930', '0'), +('6', '55', '9', '1541', '7616', '0'), +('6', '55', '9', '2290', '3877', '0'), +('6', '55', '9', '4406', '3350', '0'), +('6', '55', '15', '14631', '3986', '0'), +('6', '55', '15', '10150', '3004', '0'), +('6', '55', '15', '14694', '2660', '0'), +('6', '55', '15', '10163', '2300', '0'), +('6', '55', '20', '11684', '12851', '0'), +('6', '55', '20', '11666', '8403', '0'), +('6', '55', '20', '2742', '5233', '0'), +('6', '55', '20', '2288', '4478', '0'), +('6', '55', '12', '20655', '3963', '0'), +('6', '55', '12', '2291', '3830', '0'), +('6', '55', '12', '4345', '3694', '0'), +('6', '55', '12', '2923', '3074', '0'), +('6', '55', '18', '3806', '3584', '0'), +('6', '55', '18', '2292', '3499', '0'), +('6', '55', '18', '2461', '2850', '0'), +('6', '55', '18', '4410', '1142', '0'), +('6', '55', '19', '4407', '6040', '0'), +('6', '55', '19', '68239', '3917', '0'), +('6', '55', '19', '2293', '3228', '0'), +('6', '55', '19', '1368', '2016', '0'), +('6', '55', '13', '14555', '14283', '0'), +('6', '55', '13', '6411', '11145', '0'), +('6', '55', '13', '11683', '10988', '0'), +('6', '55', '13', '11563', '7988', '0'), +('6', '55', '14', '14555', '14283', '0'), +('6', '55', '14', '10335', '11948', '0'), +('6', '55', '14', '13991', '7644', '0'), +('6', '55', '14', '9246', '6656', '0'), +('6', '55', '11', '9246', '6656', '0'), +('6', '55', '11', '14762', '2204', '0'), +('6', '55', '11', '16941', '1329', '0'), +('6', '55', '11', '60396', '694', '0'), +('6', '56', '22', '9246', '0', '0'), +('6', '56', '22', '10323', '0', '0'), +('6', '56', '22', '44492', '0', '0'), +('6', '56', '22', '13101', '0', '0'), +('6', '56', '1', '12801', '4762', '0'), +('6', '56', '1', '14702', '3750', '0'), +('6', '56', '1', '14701', '2862', '0'), +('6', '56', '1', '30361', '2640', '0'), +('6', '56', '2', '10143', '5368', '0'), +('6', '56', '2', '2191', '4130', '0'), +('6', '56', '2', '30363', '3700', '0'), +('6', '56', '2', '2294', '3393', '0'), +('6', '56', '3', '11052', '10147', '0'), +('6', '56', '3', '2706', '8023', '0'), +('6', '56', '3', '4505', '4766', '0'), +('6', '56', '3', '14695', '4744', '0'), +('6', '56', '5', '14703', '6050', '0'), +('6', '56', '5', '68291', '4542', '0'), +('6', '56', '5', '10146', '4060', '0'), +('6', '56', '5', '2583', '3709', '0'), +('6', '56', '8', '11603', '14399', '0'), +('6', '56', '8', '2349', '3554', '0'), +('6', '56', '8', '2913', '2898', '0'), +('6', '56', '8', '2340', '2730', '0'), +('6', '56', '6', '2705', '7747', '0'), +('6', '56', '6', '1904', '5442', '0'), +('6', '56', '6', '1557', '5310', '0'), +('6', '56', '6', '1367', '3407', '0'), +('6', '56', '17', '2285', '12072', '0'), +('6', '56', '17', '3802', '9398', '0'), +('6', '56', '17', '4342', '6892', '0'), +('6', '56', '17', '2405', '3494', '0'), +('6', '56', '7', '31809', '4578', '0'), +('6', '56', '7', '2289', '4036', '0'), +('6', '56', '7', '1362', '2624', '0'), +('6', '56', '7', '10336', '2033', '0'), +('6', '56', '9', '3804', '8039', '0'), +('6', '56', '9', '1541', '7737', '0'), +('6', '56', '9', '2290', '3938', '0'), +('6', '56', '9', '4406', '3410', '0'), +('6', '56', '15', '14631', '4059', '0'), +('6', '56', '15', '10150', '3004', '0'), +('6', '56', '15', '14694', '2708', '0'), +('6', '56', '15', '10163', '2300', '0'), +('6', '56', '20', '11684', '12948', '0'), +('6', '56', '20', '11666', '8405', '0'), +('6', '56', '20', '2742', '5236', '0'), +('6', '56', '20', '2288', '4478', '0'), +('6', '56', '12', '20655', '3988', '0'), +('6', '56', '12', '2291', '3830', '0'), +('6', '56', '12', '4345', '3755', '0'), +('6', '56', '12', '2923', '3074', '0'), +('6', '56', '18', '3806', '3644', '0'), +('6', '56', '18', '2292', '3547', '0'), +('6', '56', '18', '2461', '2898', '0'), +('6', '56', '18', '4410', '1142', '0'), +('6', '56', '19', '4407', '6149', '0'), +('6', '56', '19', '68239', '3953', '0'), +('6', '56', '19', '2293', '3264', '0'), +('6', '56', '19', '1368', '2016', '0'), +('6', '56', '13', '14555', '14525', '0'), +('6', '56', '13', '6411', '11253', '0'), +('6', '56', '13', '11683', '11097', '0'), +('6', '56', '13', '11649', '8075', '0'), +('6', '56', '14', '14555', '14525', '0'), +('6', '56', '14', '10335', '12166', '0'), +('6', '56', '14', '13991', '7765', '0'), +('6', '56', '14', '9246', '6777', '0'), +('6', '56', '11', '9246', '6777', '0'), +('6', '56', '11', '14762', '2204', '0'), +('6', '56', '11', '16941', '1353', '0'), +('6', '56', '11', '60396', '706', '0'), +('6', '57', '22', '9246', '0', '0'), +('6', '57', '22', '10323', '0', '0'), +('6', '57', '22', '44492', '0', '0'), +('6', '57', '22', '13101', '0', '0'), +('6', '57', '1', '12801', '4762', '0'), +('6', '57', '1', '14702', '3750', '0'), +('6', '57', '1', '14701', '2862', '0'), +('6', '57', '1', '30361', '2640', '0'), +('6', '57', '2', '10143', '5368', '0'), +('6', '57', '2', '2191', '4203', '0'), +('6', '57', '2', '30363', '3700', '0'), +('6', '57', '2', '1408', '3449', '0'), +('6', '57', '3', '11052', '10328', '0'), +('6', '57', '3', '2706', '8144', '0'), +('6', '57', '3', '4505', '4850', '0'), +('6', '57', '3', '14695', '4828', '0'), +('6', '57', '5', '14703', '6050', '0'), +('6', '57', '5', '68291', '4590', '0'), +('6', '57', '5', '10146', '4096', '0'), +('6', '57', '5', '2583', '3745', '0'), +('6', '57', '8', '11603', '14507', '0'), +('6', '57', '8', '2349', '3554', '0'), +('6', '57', '8', '2913', '2947', '0'), +('6', '57', '8', '2340', '2778', '0'), +('6', '57', '6', '2705', '7795', '0'), +('6', '57', '6', '1904', '5539', '0'), +('6', '57', '6', '1557', '5310', '0'), +('6', '57', '6', '1367', '3467', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '57', '17', '2285', '12121', '0'), +('6', '57', '17', '3802', '9558', '0'), +('6', '57', '17', '4342', '7012', '0'), +('6', '57', '17', '2405', '3555', '0'), +('6', '57', '7', '31809', '4614', '0'), +('6', '57', '7', '2289', '4084', '0'), +('6', '57', '7', '1362', '2624', '0'), +('6', '57', '7', '10336', '2069', '0'), +('6', '57', '9', '3804', '8147', '0'), +('6', '57', '9', '1541', '7858', '0'), +('6', '57', '9', '2290', '3999', '0'), +('6', '57', '9', '4406', '3471', '0'), +('6', '57', '15', '14631', '4131', '0'), +('6', '57', '15', '10150', '3004', '0'), +('6', '57', '15', '14694', '2757', '0'), +('6', '57', '15', '10163', '2300', '0'), +('6', '57', '20', '11684', '13045', '0'), +('6', '57', '20', '11666', '8407', '0'), +('6', '57', '20', '2742', '5239', '0'), +('6', '57', '20', '2288', '4478', '0'), +('6', '57', '12', '20655', '4013', '0'), +('6', '57', '12', '2291', '3830', '0'), +('6', '57', '12', '4345', '3815', '0'), +('6', '57', '12', '2923', '3074', '0'), +('6', '57', '18', '3806', '3705', '0'), +('6', '57', '18', '2292', '3595', '0'), +('6', '57', '18', '2461', '2947', '0'), +('6', '57', '18', '4410', '1142', '0'), +('6', '57', '19', '4407', '6257', '0'), +('6', '57', '19', '68239', '3989', '0'), +('6', '57', '19', '2293', '3301', '0'), +('6', '57', '19', '1368', '2016', '0'), +('6', '57', '13', '14555', '14766', '0'), +('6', '57', '13', '6411', '11362', '0'), +('6', '57', '13', '11683', '11206', '0'), +('6', '57', '13', '11649', '8166', '0'), +('6', '57', '14', '14555', '14766', '0'), +('6', '57', '14', '10335', '12383', '0'), +('6', '57', '14', '13991', '7886', '0'), +('6', '57', '14', '9246', '6898', '0'), +('6', '57', '11', '9246', '6898', '0'), +('6', '57', '11', '14762', '2204', '0'), +('6', '57', '11', '16941', '1377', '0'), +('6', '57', '11', '60396', '719', '0'), +('6', '58', '22', '9246', '0', '0'), +('6', '58', '22', '10323', '0', '0'), +('6', '58', '22', '44492', '0', '0'), +('6', '58', '22', '13101', '0', '0'), +('6', '58', '1', '12801', '4762', '0'), +('6', '58', '1', '14702', '3750', '0'), +('6', '58', '1', '14701', '2862', '0'), +('6', '58', '1', '30361', '2640', '0'), +('6', '58', '2', '10143', '5368', '0'), +('6', '58', '2', '2191', '4275', '0'), +('6', '58', '2', '30363', '3700', '0'), +('6', '58', '2', '1408', '3509', '0'), +('6', '58', '3', '11052', '10510', '0'), +('6', '58', '3', '2706', '8265', '0'), +('6', '58', '3', '4505', '4935', '0'), +('6', '58', '3', '14695', '4913', '0'), +('6', '58', '5', '14703', '6050', '0'), +('6', '58', '5', '68291', '4639', '0'), +('6', '58', '5', '10146', '4132', '0'), +('6', '58', '5', '2583', '3782', '0'), +('6', '58', '8', '11603', '14616', '0'), +('6', '58', '8', '2349', '3554', '0'), +('6', '58', '8', '2913', '2995', '0'), +('6', '58', '8', '2340', '2827', '0'), +('6', '58', '6', '2705', '7844', '0'), +('6', '58', '6', '1904', '5635', '0'), +('6', '58', '6', '1557', '5310', '0'), +('6', '58', '6', '1367', '3527', '0'), +('6', '58', '17', '2285', '12169', '0'), +('6', '58', '17', '3802', '9717', '0'), +('6', '58', '17', '4342', '7133', '0'), +('6', '58', '17', '2405', '3616', '0'), +('6', '58', '7', '31809', '4650', '0'), +('6', '58', '7', '2289', '4133', '0'), +('6', '58', '7', '1362', '2624', '0'), +('6', '58', '7', '10336', '2106', '0'), +('6', '58', '9', '3804', '8256', '0'), +('6', '58', '9', '1541', '7979', '0'), +('6', '58', '9', '2290', '4060', '0'), +('6', '58', '9', '4406', '3531', '0'), +('6', '58', '15', '14631', '4204', '0'), +('6', '58', '15', '10150', '3004', '0'), +('6', '58', '15', '14694', '2805', '0'), +('6', '58', '15', '10163', '2300', '0'), +('6', '58', '20', '11684', '13141', '0'), +('6', '58', '20', '11666', '8409', '0'), +('6', '58', '20', '2742', '5242', '0'), +('6', '58', '20', '2288', '4478', '0'), +('6', '58', '12', '20655', '4038', '0'), +('6', '58', '12', '4345', '3876', '0'), +('6', '58', '12', '2291', '3830', '0'), +('6', '58', '12', '2923', '3074', '0'), +('6', '58', '18', '3806', '3765', '0'), +('6', '58', '18', '2292', '3644', '0'), +('6', '58', '18', '2461', '2995', '0'), +('6', '58', '18', '4410', '1142', '0'), +('6', '58', '19', '4407', '6366', '0'), +('6', '58', '19', '68239', '4025', '0'), +('6', '58', '19', '2293', '3337', '0'), +('6', '58', '19', '1368', '2016', '0'), +('6', '58', '13', '14555', '15008', '0'), +('6', '58', '13', '6411', '11471', '0'), +('6', '58', '13', '11683', '11315', '0'), +('6', '58', '13', '11649', '8257', '0'), +('6', '58', '14', '14555', '15008', '0'), +('6', '58', '14', '10335', '12601', '0'), +('6', '58', '14', '13991', '8006', '0'), +('6', '58', '14', '9246', '7018', '0'), +('6', '58', '11', '9246', '7018', '0'), +('6', '58', '11', '14762', '2204', '0'), +('6', '58', '11', '16941', '1401', '0'), +('6', '58', '11', '60396', '731', '0'), +('6', '59', '22', '9246', '0', '0'), +('6', '59', '22', '10323', '0', '0'), +('6', '59', '22', '44492', '0', '0'), +('6', '59', '22', '13101', '0', '0'), +('6', '59', '1', '12801', '4762', '0'), +('6', '59', '1', '14702', '3750', '0'), +('6', '59', '1', '14701', '2862', '0'), +('6', '59', '1', '30361', '2640', '0'), +('6', '59', '2', '10143', '5368', '0'), +('6', '59', '2', '2191', '4348', '0'), +('6', '59', '2', '30363', '3700', '0'), +('6', '59', '2', '1408', '3570', '0'), +('6', '59', '3', '11052', '10691', '0'), +('6', '59', '3', '2706', '8386', '0'), +('6', '59', '3', '4505', '5019', '0'), +('6', '59', '3', '14695', '4997', '0'), +('6', '59', '5', '14703', '6050', '0'), +('6', '59', '5', '68291', '4687', '0'), +('6', '59', '5', '10146', '4168', '0'), +('6', '59', '5', '2583', '3818', '0'), +('6', '59', '8', '11603', '14725', '0'), +('6', '59', '8', '2349', '3554', '0'), +('6', '59', '8', '2913', '3043', '0'), +('6', '59', '8', '2340', '2875', '0'), +('6', '59', '6', '2705', '7892', '0'), +('6', '59', '6', '1904', '5732', '0'), +('6', '59', '6', '1557', '5310', '0'), +('6', '59', '6', '1367', '3588', '0'), +('6', '59', '17', '2285', '12217', '0'), +('6', '59', '17', '3802', '9877', '0'), +('6', '59', '17', '4342', '7254', '0'), +('6', '59', '17', '2405', '3677', '0'), +('6', '59', '7', '31809', '4686', '0'), +('6', '59', '7', '2289', '4181', '0'), +('6', '59', '7', '1362', '2624', '0'), +('6', '59', '7', '10336', '2142', '0'), +('6', '59', '9', '3804', '8365', '0'), +('6', '59', '9', '1541', '8100', '0'), +('6', '59', '9', '2290', '4121', '0'), +('6', '59', '9', '4406', '3591', '0'), +('6', '59', '15', '14631', '4276', '0'), +('6', '59', '15', '10150', '3004', '0'), +('6', '59', '15', '14694', '2853', '0'), +('6', '59', '15', '10163', '2300', '0'), +('6', '59', '20', '11684', '13238', '0'), +('6', '59', '20', '11666', '8412', '0'), +('6', '59', '20', '2742', '5245', '0'), +('6', '59', '20', '2288', '4478', '0'), +('6', '59', '12', '20655', '4063', '0'), +('6', '59', '12', '4345', '3936', '0'), +('6', '59', '12', '2291', '3830', '0'), +('6', '59', '12', '2923', '3074', '0'), +('6', '59', '18', '3806', '3826', '0'), +('6', '59', '18', '2292', '3692', '0'), +('6', '59', '18', '2461', '3043', '0'), +('6', '59', '18', '4410', '1142', '0'), +('6', '59', '19', '4407', '6475', '0'), +('6', '59', '19', '68239', '4062', '0'), +('6', '59', '19', '2293', '3373', '0'), +('6', '59', '19', '1368', '2016', '0'), +('6', '59', '13', '14555', '15250', '0'), +('6', '59', '13', '6411', '11579', '0'), +('6', '59', '13', '11683', '11423', '0'), +('6', '59', '13', '11649', '8347', '0'), +('6', '59', '14', '14555', '15250', '0'), +('6', '59', '14', '10335', '12818', '0'), +('6', '59', '14', '13991', '8127', '0'), +('6', '59', '14', '9246', '7139', '0'), +('6', '59', '11', '9246', '7139', '0'), +('6', '59', '11', '14762', '2204', '0'), +('6', '59', '11', '16941', '1425', '0'), +('6', '59', '11', '60396', '743', '0'), +('6', '60', '22', '66397', '0', '3'), +('6', '60', '22', '61948', '0', '3'), +('6', '60', '22', '21805', '0', '3'), +('6', '60', '22', '21807', '0', '3'), +('6', '60', '1', '63170', '22602', '3'), +('6', '60', '1', '30552', '19371', '3'), +('6', '60', '1', '23514', '17201', '3'), +('6', '60', '1', '28944', '13921', '3'), +('6', '60', '2', '26763', '32337', '3'), +('6', '60', '2', '1867', '15111', '3'), +('6', '60', '2', '26762', '13234', '3'), +('6', '60', '2', '28909', '12324', '3'), +('6', '60', '3', '26785', '36509', '3'), +('6', '60', '3', '28963', '29175', '3'), +('6', '60', '3', '31323', '26102', '3'), +('6', '60', '3', '26756', '23157', '3'), +('6', '60', '5', '28900', '39743', '3'), +('6', '60', '5', '51229', '24651', '3'), +('6', '60', '5', '26505', '24082', '3'), +('6', '60', '5', '28911', '23597', '3'), +('6', '60', '8', '51240', '36835', '3'), +('6', '60', '8', '1628', '31698', '3'), +('6', '60', '8', '28992', '16236', '3'), +('6', '60', '8', '28918', '14751', '3'), +('6', '60', '6', '1200', '16949', '3'), +('6', '60', '6', '28920', '14492', '3'), +('6', '60', '6', '30566', '14152', '3'), +('6', '60', '6', '28991', '13153', '3'), +('6', '60', '17', '26782', '17414', '3'), +('6', '60', '17', '10845', '13342', '3'), +('6', '60', '17', '28951', '12503', '3'), +('6', '60', '17', '9630', '11033', '3'), +('6', '60', '7', '28925', '15288', '3'), +('6', '60', '7', '7868', '14101', '3'), +('6', '60', '7', '28145', '13487', '3'), +('6', '60', '7', '26584', '13377', '3'), +('6', '60', '9', '26752', '49375', '3'), +('6', '60', '9', '26787', '26127', '3'), +('6', '60', '9', '31314', '24453', '3'), +('6', '60', '9', '59563', '22201', '3'), +('6', '60', '15', '51247', '35902', '3'), +('6', '60', '15', '11541', '23001', '3'), +('6', '60', '15', '63170', '22602', '3'), +('6', '60', '15', '51242', '16924', '3'), +('6', '60', '20', '11666', '28253', '3'), +('6', '60', '20', '28916', '16298', '3'), +('6', '60', '20', '30534', '13699', '3'), +('6', '60', '20', '26549', '13050', '3'), +('6', '60', '12', '30534', '13699', '3'), +('6', '60', '12', '28991', '13153', '3'), +('6', '60', '12', '31227', '12689', '3'), +('6', '60', '12', '28967', '12003', '3'), +('6', '60', '18', '26783', '42031', '3'), +('6', '60', '18', '28932', '12328', '3'), +('6', '60', '18', '8289', '12323', '3'), +('6', '60', '18', '27316', '10613', '3'), +('6', '60', '19', '28934', '36903', '3'), +('6', '60', '19', '31327', '30839', '3'), +('6', '60', '19', '31408', '23502', '3'), +('6', '60', '19', '30570', '15600', '3'), +('6', '60', '13', '28980', '38200', '3'), +('6', '60', '13', '14762', '22200', '3'), +('6', '60', '13', '26784', '16673', '3'), +('6', '60', '13', '28981', '15450', '3'), +('6', '60', '14', '28980', '38200', '3'), +('6', '60', '14', '28915', '24070', '3'), +('6', '60', '14', '14762', '22200', '3'), +('6', '60', '14', '26784', '16673', '3'), +('6', '60', '11', '14762', '22200', '3'), +('6', '60', '11', '2698', '18002', '3'), +('6', '60', '11', '26784', '16673', '3'), +('6', '60', '11', '30562', '13584', '3'), +('6', '60', '22', '10323', '0', '2'), +('6', '60', '22', '9248', '0', '2'), +('6', '60', '22', '12425', '0', '2'), +('6', '60', '22', '9254', '0', '2'), +('6', '60', '1', '2581', '14038', '2'), +('6', '60', '1', '2065', '9440', '2'), +('6', '60', '1', '10912', '7764', '2'), +('6', '60', '1', '62234', '6604', '2'), +('6', '60', '2', '10913', '12388', '2'), +('6', '60', '2', '31322', '9785', '2'), +('6', '60', '2', '29648', '9167', '2'), +('6', '60', '2', '1867', '9119', '2'), +('6', '60', '3', '31233', '13578', '2'), +('6', '60', '3', '1547', '11987', '2'), +('6', '60', '3', '31244', '11452', '2'), +('6', '60', '3', '31463', '10636', '2'), +('6', '60', '5', '31460', '12289', '2'), +('6', '60', '5', '30390', '10626', '2'), +('6', '60', '5', '31318', '10438', '2'), +('6', '60', '5', '29459', '9688', '2'), +('6', '60', '8', '1628', '13166', '2'), +('6', '60', '8', '31376', '12991', '2'), +('6', '60', '8', '11603', '9438', '2'), +('6', '60', '8', '5779', '9161', '2'), +('6', '60', '6', '29472', '6370', '2'), +('6', '60', '6', '1114', '5857', '2'), +('6', '60', '6', '2705', '5531', '2'), +('6', '60', '6', '1557', '5261', '2'), +('6', '60', '17', '10845', '15736', '2'), +('6', '60', '17', '9630', '12848', '2'), +('6', '60', '17', '31148', '11187', '2'), +('6', '60', '17', '25399', '10993', '2'), +('6', '60', '7', '31229', '11762', '2'), +('6', '60', '7', '29485', '7513', '2'), +('6', '60', '7', '31371', '4213', '2'), +('6', '60', '7', '31149', '3968', '2'), +('6', '60', '9', '31460', '12289', '2'), +('6', '60', '9', '31246', '8319', '2'), +('6', '60', '9', '31150', '4845', '2'), +('6', '60', '9', '31314', '4477', '2'), +('6', '60', '15', '25211', '12700', '2'), +('6', '60', '15', '31231', '12533', '2'), +('6', '60', '15', '62373', '7600', '2'), +('6', '60', '15', '62356', '6527', '2'), +('6', '60', '20', '25199', '13823', '2'), +('6', '60', '20', '25858', '13737', '2'), +('6', '60', '20', '2510', '12424', '2'), +('6', '60', '20', '1556', '12317', '2'), +('6', '60', '12', '31227', '14562', '2'), +('6', '60', '12', '25857', '10812', '2'), +('6', '60', '12', '31306', '8988', '2'), +('6', '60', '12', '29447', '5928', '2'), +('6', '60', '18', '31152', '10494', '2'), +('6', '60', '18', '25403', '8312', '2'), +('6', '60', '18', '31054', '8017', '2'), +('6', '60', '18', '62164', '7159', '2'), +('6', '60', '19', '29645', '15540', '2'), +('6', '60', '19', '31245', '14399', '2'), +('6', '60', '19', '31355', '9550', '2'), +('6', '60', '19', '31327', '8716', '2'), +('6', '60', '13', '20490', '13271', '2'), +('6', '60', '13', '31373', '13238', '2'), +('6', '60', '13', '22824', '11202', '2'), +('6', '60', '13', '29449', '10978', '2'), +('6', '60', '14', '31230', '15510', '2'), +('6', '60', '14', '31462', '11535', '2'), +('6', '60', '14', '22824', '11202', '2'), +('6', '60', '14', '29449', '10978', '2'), +('6', '60', '11', '31465', '14332', '2'), +('6', '60', '11', '1554', '13904', '2'), +('6', '60', '11', '2698', '10516', '2'), +('6', '60', '11', '31302', '10130', '2'), +('6', '60', '22', '10323', '0', '1'), +('6', '60', '22', '9246', '0', '1'), +('6', '60', '22', '12425', '0', '1'), +('6', '60', '22', '44492', '0', '1'), +('6', '60', '1', '10912', '12224', '1'), +('6', '60', '1', '62234', '8430', '1'), +('6', '60', '1', '12801', '4757', '1'), +('6', '60', '1', '5813', '4285', '1'), +('6', '60', '2', '10913', '18377', '1'), +('6', '60', '2', '10143', '5361', '1'), +('6', '60', '2', '62138', '3821', '1'), +('6', '60', '2', '30363', '3700', '1'), +('6', '60', '3', '5780', '7309', '1'), +('6', '60', '3', '11052', '6417', '1'), +('6', '60', '3', '2706', '5517', '1'), +('6', '60', '3', '46184', '5262', '1'), +('6', '60', '5', '14703', '6050', '1'), +('6', '60', '5', '8285', '4483', '1'), +('6', '60', '5', '14709', '4067', '1'), +('6', '60', '5', '14754', '3984', '1'), +('6', '60', '8', '1628', '16834', '1'), +('6', '60', '8', '11603', '12136', '1'), +('6', '60', '8', '1622', '10045', '1'), +('6', '60', '8', '5779', '9186', '1'), +('6', '60', '6', '2705', '6735', '1'), +('6', '60', '6', '1557', '5286', '1'), +('6', '60', '6', '4315', '4025', '1'), +('6', '60', '6', '1904', '3440', '1'), +('6', '60', '17', '10845', '21720', '1'), +('6', '60', '17', '4572', '11915', '1'), +('6', '60', '17', '2285', '11050', '1'), +('6', '60', '17', '3802', '6068', '1'), +('6', '60', '7', '62046', '4107', '1'), +('6', '60', '7', '31809', '3812', '1'), +('6', '60', '7', '2289', '3029', '1'), +('6', '60', '7', '1362', '2614', '1'), +('6', '60', '9', '3804', '5788', '1'), +('6', '60', '9', '1541', '5221', '1'), +('6', '60', '9', '1618', '4950', '1'), +('6', '60', '9', '2290', '2673', '1'), +('6', '60', '15', '5727', '6777', '1'), +('6', '60', '15', '5728', '5585', '1'), +('6', '60', '15', '5807', '5271', '1'), +('6', '60', '15', '10346', '4489', '1'), +('6', '60', '20', '1556', '15307', '1'), +('6', '60', '20', '11684', '10944', '1'), +('6', '60', '20', '11666', '8347', '1'), +('6', '60', '20', '5765', '8016', '1'), +('6', '60', '12', '2291', '3818', '1'), +('6', '60', '12', '20655', '3437', '1'), +('6', '60', '12', '2923', '3064', '1'), +('6', '60', '12', '4345', '2482', '1'), +('6', '60', '18', '62164', '9017', '1'), +('6', '60', '18', '4576', '8107', '1'), +('6', '60', '18', '2292', '2535', '1'), +('6', '60', '18', '3806', '2380', '1'), +('6', '60', '19', '5749', '4659', '1'), +('6', '60', '19', '4407', '3898', '1'), +('6', '60', '19', '68239', '3181', '1'), +('6', '60', '19', '2293', '2504', '1'), +('6', '60', '13', '20490', '19330', '1'), +('6', '60', '13', '24629', '13134', '1'), +('6', '60', '13', '24609', '11679', '1'), +('6', '60', '13', '14555', '9553', '1'), +('6', '60', '14', '24629', '13134', '1'), +('6', '60', '14', '24609', '11679', '1'), +('6', '60', '14', '14555', '9553', '1'), +('6', '60', '14', '14745', '8222', '1'), +('6', '60', '11', '46178', '7361', '1'), +('6', '60', '11', '5805', '5300', '1'), +('6', '60', '11', '5763', '5118', '1'), +('6', '60', '11', '79631', '4427', '1'), +('6', '61', '22', '66397', '0', '3'), +('6', '61', '22', '61948', '0', '3'), +('6', '61', '22', '21805', '0', '3'), +('6', '61', '22', '21807', '0', '3'), +('6', '61', '1', '63170', '22103', '3'), +('6', '61', '1', '30552', '19073', '3'), +('6', '61', '1', '23514', '16451', '3'), +('6', '61', '1', '28944', '13923', '3'), +('6', '61', '2', '26763', '31590', '3'), +('6', '61', '2', '1867', '14782', '3'), +('6', '61', '2', '26762', '13236', '3'), +('6', '61', '2', '28909', '12326', '3'), +('6', '61', '3', '26785', '35614', '3'), +('6', '61', '3', '28963', '28427', '3'), +('6', '61', '3', '31323', '25102', '3'), +('6', '61', '3', '26756', '22707', '3'), +('6', '61', '5', '28900', '38747', '3'), +('6', '61', '5', '51229', '24153', '3'), +('6', '61', '5', '28911', '23099', '3'), +('6', '61', '5', '26505', '22932', '3'), +('6', '61', '8', '51240', '35835', '3'), +('6', '61', '8', '1628', '30701', '3'), +('6', '61', '8', '28992', '16239', '3'), +('6', '61', '8', '28918', '14751', '3'), +('6', '61', '6', '1200', '16551', '3'), +('6', '61', '6', '28920', '14496', '3'), +('6', '61', '6', '30566', '14153', '3'), +('6', '61', '6', '28991', '13158', '3'), +('6', '61', '17', '26782', '17419', '3'), +('6', '61', '17', '10845', '13346', '3'), +('6', '61', '17', '28951', '12503', '3'), +('6', '61', '17', '9630', '11036', '3'), +('6', '61', '7', '28925', '15291', '3'), +('6', '61', '7', '7868', '14103', '3'), +('6', '61', '7', '28145', '13490', '3'), +('6', '61', '7', '26584', '13379', '3'), +('6', '61', '9', '26752', '47877', '3'), +('6', '61', '9', '26787', '25729', '3'), +('6', '61', '9', '31314', '23453', '3'), +('6', '61', '9', '59563', '21201', '3'), +('6', '61', '15', '51247', '34752', '3'), +('6', '61', '15', '63170', '22103', '3'), +('6', '61', '15', '11541', '21851', '3'), +('6', '61', '15', '51242', '16626', '3'), +('6', '61', '20', '11666', '27253', '3'), +('6', '61', '20', '28916', '16300', '3'), +('6', '61', '20', '30534', '13701', '3'), +('6', '61', '20', '26549', '13054', '3'), +('6', '61', '12', '30534', '13701', '3'), +('6', '61', '12', '28991', '13158', '3'), +('6', '61', '12', '31227', '12692', '3'), +('6', '61', '12', '28967', '12003', '3'), +('6', '61', '18', '26783', '40883', '3'), +('6', '61', '18', '28932', '12330', '3'), +('6', '61', '18', '8289', '12325', '3'), +('6', '61', '18', '27316', '10614', '3'), +('6', '61', '19', '28934', '35903', '3'), +('6', '61', '19', '31327', '29690', '3'), +('6', '61', '19', '31408', '22353', '3'), +('6', '61', '19', '30570', '15602', '3'), +('6', '61', '13', '28980', '37202', '3'), +('6', '61', '13', '14762', '21200', '3'), +('6', '61', '13', '26784', '16679', '3'), +('6', '61', '13', '28981', '15452', '3'), +('6', '61', '14', '28980', '37202', '3'), +('6', '61', '14', '28915', '23698', '3'), +('6', '61', '14', '14762', '21200', '3'), +('6', '61', '14', '26784', '16679', '3'), +('6', '61', '11', '14762', '21200', '3'), +('6', '61', '11', '2698', '17627', '3'), +('6', '61', '11', '26784', '16679', '3'), +('6', '61', '11', '30562', '13586', '3'), +('6', '62', '22', '66397', '0', '3'), +('6', '62', '22', '61948', '0', '3'), +('6', '62', '22', '21805', '0', '3'), +('6', '62', '22', '21807', '0', '3'), +('6', '62', '1', '63170', '21605', '3'), +('6', '62', '1', '30552', '18775', '3'), +('6', '62', '1', '23514', '15701', '3'), +('6', '62', '1', '28944', '13925', '3'), +('6', '62', '2', '26763', '30843', '3'), +('6', '62', '2', '1867', '14453', '3'), +('6', '62', '2', '26762', '13238', '3'), +('6', '62', '2', '28909', '12328', '3'), +('6', '62', '3', '26785', '34719', '3'), +('6', '62', '3', '28963', '27679', '3'), +('6', '62', '3', '31323', '24102', '3'), +('6', '62', '3', '26756', '22257', '3'), +('6', '62', '5', '28900', '37751', '3'), +('6', '62', '5', '51229', '23654', '3'), +('6', '62', '5', '28911', '22601', '3'), +('6', '62', '5', '26505', '21782', '3'), +('6', '62', '8', '51240', '34835', '3'), +('6', '62', '8', '1628', '29703', '3'), +('6', '62', '8', '28992', '16242', '3'), +('6', '62', '8', '28918', '14751', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '62', '6', '1200', '16152', '3'), +('6', '62', '6', '28920', '14500', '3'), +('6', '62', '6', '30566', '14155', '3'), +('6', '62', '6', '28991', '13163', '3'), +('6', '62', '17', '26782', '17425', '3'), +('6', '62', '17', '10845', '13350', '3'), +('6', '62', '17', '28951', '12503', '3'), +('6', '62', '17', '9630', '11039', '3'), +('6', '62', '7', '28925', '15294', '3'), +('6', '62', '7', '7868', '14104', '3'), +('6', '62', '7', '28145', '13493', '3'), +('6', '62', '7', '26584', '13381', '3'), +('6', '62', '9', '26752', '46379', '3'), +('6', '62', '9', '26787', '25331', '3'), +('6', '62', '9', '31314', '22453', '3'), +('6', '62', '9', '59563', '20201', '3'), +('6', '62', '15', '51247', '33602', '3'), +('6', '62', '15', '63170', '21605', '3'), +('6', '62', '15', '11541', '20701', '3'), +('6', '62', '15', '51242', '16327', '3'), +('6', '62', '20', '11666', '26253', '3'), +('6', '62', '20', '28916', '16301', '3'), +('6', '62', '20', '30534', '13703', '3'), +('6', '62', '20', '26549', '13058', '3'), +('6', '62', '12', '30534', '13703', '3'), +('6', '62', '12', '28991', '13163', '3'), +('6', '62', '12', '31227', '12695', '3'), +('6', '62', '12', '28967', '12003', '3'), +('6', '62', '18', '26783', '39735', '3'), +('6', '62', '18', '28932', '12332', '3'), +('6', '62', '18', '8289', '12327', '3'), +('6', '62', '18', '27316', '10615', '3'), +('6', '62', '19', '28934', '34903', '3'), +('6', '62', '19', '31327', '28541', '3'), +('6', '62', '19', '31408', '21204', '3'), +('6', '62', '19', '30570', '15603', '3'), +('6', '62', '13', '28980', '36205', '3'), +('6', '62', '13', '14762', '20200', '3'), +('6', '62', '13', '26784', '16685', '3'), +('6', '62', '13', '28981', '15455', '3'), +('6', '62', '14', '28980', '36205', '3'), +('6', '62', '14', '28915', '23326', '3'), +('6', '62', '14', '14762', '20200', '3'), +('6', '62', '14', '26784', '16685', '3'), +('6', '62', '11', '14762', '20200', '3'), +('6', '62', '11', '2698', '17252', '3'), +('6', '62', '11', '26784', '16685', '3'), +('6', '62', '11', '30562', '13588', '3'), +('6', '63', '22', '66397', '0', '3'), +('6', '63', '22', '61948', '0', '3'), +('6', '63', '22', '21805', '0', '3'), +('6', '63', '22', '21807', '0', '3'), +('6', '63', '1', '63170', '21107', '3'), +('6', '63', '1', '30552', '18477', '3'), +('6', '63', '1', '23514', '14951', '3'), +('6', '63', '1', '28944', '13927', '3'), +('6', '63', '2', '26763', '30096', '3'), +('6', '63', '2', '1867', '14124', '3'), +('6', '63', '2', '26762', '13240', '3'), +('6', '63', '2', '28909', '12330', '3'), +('6', '63', '3', '26785', '33824', '3'), +('6', '63', '3', '28963', '26931', '3'), +('6', '63', '3', '31323', '23102', '3'), +('6', '63', '3', '26756', '21807', '3'), +('6', '63', '5', '28900', '36755', '3'), +('6', '63', '5', '51229', '23156', '3'), +('6', '63', '5', '28911', '22103', '3'), +('6', '63', '5', '26505', '20632', '3'), +('6', '63', '8', '51240', '33835', '3'), +('6', '63', '8', '1628', '28706', '3'), +('6', '63', '8', '28992', '16245', '3'), +('6', '63', '8', '28918', '14751', '3'), +('6', '63', '6', '1200', '15754', '3'), +('6', '63', '6', '28920', '14504', '3'), +('6', '63', '6', '30566', '14157', '3'), +('6', '63', '6', '28991', '13168', '3'), +('6', '63', '17', '26782', '17430', '3'), +('6', '63', '17', '10845', '13354', '3'), +('6', '63', '17', '28951', '12503', '3'), +('6', '63', '17', '9630', '11042', '3'), +('6', '63', '7', '28925', '15297', '3'), +('6', '63', '7', '7868', '14106', '3'), +('6', '63', '7', '28145', '13496', '3'), +('6', '63', '7', '26584', '13383', '3'), +('6', '63', '9', '26752', '44881', '3'), +('6', '63', '9', '26787', '24933', '3'), +('6', '63', '9', '31314', '21453', '3'), +('6', '63', '9', '59563', '19201', '3'), +('6', '63', '15', '51247', '32452', '3'), +('6', '63', '15', '63170', '21107', '3'), +('6', '63', '15', '11541', '19551', '3'), +('6', '63', '15', '51242', '16028', '3'), +('6', '63', '20', '11666', '25253', '3'), +('6', '63', '20', '28916', '16303', '3'), +('6', '63', '20', '30534', '13706', '3'), +('6', '63', '20', '26549', '13062', '3'), +('6', '63', '12', '30534', '13706', '3'), +('6', '63', '12', '28991', '13168', '3'), +('6', '63', '12', '31227', '12698', '3'), +('6', '63', '12', '28967', '12003', '3'), +('6', '63', '18', '26783', '38587', '3'), +('6', '63', '18', '28932', '12334', '3'), +('6', '63', '18', '8289', '12329', '3'), +('6', '63', '18', '27316', '10616', '3'), +('6', '63', '19', '28934', '33903', '3'), +('6', '63', '19', '31327', '27393', '3'), +('6', '63', '19', '31408', '20055', '3'), +('6', '63', '19', '30570', '15605', '3'), +('6', '63', '13', '28980', '35207', '3'), +('6', '63', '13', '14762', '19200', '3'), +('6', '63', '13', '26784', '16691', '3'), +('6', '63', '13', '28981', '15457', '3'), +('6', '63', '14', '28980', '35207', '3'), +('6', '63', '14', '28915', '22954', '3'), +('6', '63', '14', '14762', '19200', '3'), +('6', '63', '14', '26784', '16691', '3'), +('6', '63', '11', '14762', '19200', '3'), +('6', '63', '11', '2698', '16877', '3'), +('6', '63', '11', '26784', '16691', '3'), +('6', '63', '11', '30562', '13590', '3'), +('6', '64', '22', '66397', '0', '3'), +('6', '64', '22', '61948', '0', '3'), +('6', '64', '22', '21805', '0', '3'), +('6', '64', '22', '21807', '0', '3'), +('6', '64', '1', '63170', '20608', '3'), +('6', '64', '1', '30552', '18179', '3'), +('6', '64', '1', '23514', '14201', '3'), +('6', '64', '1', '28944', '13929', '3'), +('6', '64', '2', '26763', '29349', '3'), +('6', '64', '2', '1867', '13795', '3'), +('6', '64', '2', '26762', '13242', '3'), +('6', '64', '2', '28909', '12332', '3'), +('6', '64', '3', '26785', '32929', '3'), +('6', '64', '3', '28963', '26183', '3'), +('6', '64', '3', '31323', '22102', '3'), +('6', '64', '3', '26756', '21357', '3'), +('6', '64', '5', '28900', '35759', '3'), +('6', '64', '5', '51229', '22658', '3'), +('6', '64', '5', '28911', '21605', '3'), +('6', '64', '5', '26505', '19482', '3'), +('6', '64', '8', '51240', '32836', '3'), +('6', '64', '8', '1628', '27708', '3'), +('6', '64', '8', '28992', '16248', '3'), +('6', '64', '8', '28918', '14751', '3'), +('6', '64', '6', '1200', '15356', '3'), +('6', '64', '6', '28920', '14508', '3'), +('6', '64', '6', '30566', '14158', '3'), +('6', '64', '6', '28991', '13173', '3'), +('6', '64', '17', '26782', '17435', '3'), +('6', '64', '17', '10845', '13358', '3'), +('6', '64', '17', '28951', '12503', '3'), +('6', '64', '17', '9630', '11045', '3'), +('6', '64', '7', '28925', '15300', '3'), +('6', '64', '7', '7868', '14108', '3'), +('6', '64', '7', '28145', '13499', '3'), +('6', '64', '7', '26584', '13385', '3'), +('6', '64', '9', '26752', '43383', '3'), +('6', '64', '9', '26787', '24535', '3'), +('6', '64', '9', '31314', '20453', '3'), +('6', '64', '9', '59563', '18201', '3'), +('6', '64', '15', '51247', '31302', '3'), +('6', '64', '15', '63170', '20608', '3'), +('6', '64', '15', '11541', '18401', '3'), +('6', '64', '15', '51242', '15729', '3'), +('6', '64', '20', '11666', '24253', '3'), +('6', '64', '20', '28916', '16304', '3'), +('6', '64', '20', '30534', '13708', '3'), +('6', '64', '20', '26549', '13066', '3'), +('6', '64', '12', '30534', '13708', '3'), +('6', '64', '12', '28991', '13173', '3'), +('6', '64', '12', '31227', '12702', '3'), +('6', '64', '12', '28967', '12003', '3'), +('6', '64', '18', '26783', '37439', '3'), +('6', '64', '18', '28932', '12337', '3'), +('6', '64', '18', '8289', '12331', '3'), +('6', '64', '18', '27316', '10617', '3'), +('6', '64', '19', '28934', '32903', '3'), +('6', '64', '19', '31327', '26244', '3'), +('6', '64', '19', '31408', '18906', '3'), +('6', '64', '19', '30570', '15607', '3'), +('6', '64', '13', '28980', '34210', '3'), +('6', '64', '13', '14762', '18200', '3'), +('6', '64', '13', '26784', '16697', '3'), +('6', '64', '13', '28981', '15460', '3'), +('6', '64', '14', '28980', '34210', '3'), +('6', '64', '14', '28915', '22582', '3'), +('6', '64', '14', '14762', '18200', '3'), +('6', '64', '14', '26784', '16697', '3'), +('6', '64', '11', '14762', '18200', '3'), +('6', '64', '11', '26784', '16697', '3'), +('6', '64', '11', '2698', '16502', '3'), +('6', '64', '11', '30562', '13592', '3'), +('6', '65', '22', '66397', '0', '7'), +('6', '65', '22', '61948', '0', '7'), +('6', '65', '22', '21805', '0', '7'), +('6', '65', '22', '21807', '0', '7'), +('6', '65', '1', '5594', '54307', '7'), +('6', '65', '1', '68949', '51136', '7'), +('6', '65', '1', '7130', '37984', '7'), +('6', '65', '1', '52121', '37904', '7'), +('6', '65', '2', '26763', '28603', '7'), +('6', '65', '2', '9496', '27858', '7'), +('6', '65', '2', '69089', '27769', '7'), +('6', '65', '2', '68189', '27500', '7'), +('6', '65', '3', '69068', '81635', '7'), +('6', '65', '3', '68819', '50203', '7'), +('6', '65', '3', '69132', '47279', '7'), +('6', '65', '3', '26984', '45535', '7'), +('6', '65', '5', '69097', '82184', '7'), +('6', '65', '5', '68950', '81868', '7'), +('6', '65', '5', '7769', '47163', '7'), +('6', '65', '5', '50414', '45506', '7'), +('6', '65', '8', '69064', '81033', '7'), +('6', '65', '8', '69164', '53285', '7'), +('6', '65', '8', '15815', '44159', '7'), +('6', '65', '8', '15823', '43090', '7'), +('6', '65', '6', '13647', '56834', '7'), +('6', '65', '6', '69073', '50429', '7'), +('6', '65', '6', '68841', '49968', '7'), +('6', '65', '6', '69066', '43655', '7'), +('6', '65', '17', '69152', '55188', '7'), +('6', '65', '17', '68750', '47472', '7'), +('6', '65', '17', '14943', '35137', '7'), +('6', '65', '17', '68189', '27500', '7'), +('6', '65', '7', '68901', '45922', '7'), +('6', '65', '7', '11575', '44919', '7'), +('6', '65', '7', '69175', '31220', '7'), +('6', '65', '7', '68007', '27500', '7'), +('6', '65', '9', '68767', '51884', '7'), +('6', '65', '9', '69100', '44483', '7'), +('6', '65', '9', '26752', '41885', '7'), +('6', '65', '9', '32110', '37243', '7'), +('6', '65', '15', '69160', '82711', '7'), +('6', '65', '15', '10234', '46753', '7'), +('6', '65', '15', '69382', '43903', '7'), +('6', '65', '15', '69070', '43268', '7'), +('6', '65', '20', '68951', '49036', '7'), +('6', '65', '20', '62446', '43334', '7'), +('6', '65', '20', '67625', '35235', '7'), +('6', '65', '20', '68556', '32597', '7'), +('6', '65', '12', '68902', '50291', '7'), +('6', '65', '12', '13603', '48340', '7'), +('6', '65', '12', '69085', '34929', '7'), +('6', '65', '12', '69254', '32894', '7'), +('6', '65', '18', '69148', '39735', '7'), +('6', '65', '18', '26783', '36292', '7'), +('6', '65', '18', '68981', '32073', '7'), +('6', '65', '18', '68007', '27500', '7'), +('6', '65', '19', '20422', '33467', '7'), +('6', '65', '19', '69179', '32735', '7'), +('6', '65', '19', '28934', '31903', '7'), +('6', '65', '19', '19079', '30099', '7'), +('6', '65', '13', '21886', '43548', '7'), +('6', '65', '13', '69098', '42150', '7'), +('6', '65', '13', '71241', '39703', '7'), +('6', '65', '13', '52054', '34949', '7'), +('6', '65', '14', '69155', '82831', '7'), +('6', '65', '14', '27280', '57050', '7'), +('6', '65', '14', '69404', '45062', '7'), +('6', '65', '14', '68117', '44464', '7'), +('6', '65', '11', '68952', '64470', '7'), +('6', '65', '11', '20898', '54198', '7'), +('6', '65', '11', '69162', '33654', '7'), +('6', '65', '11', '67606', '32121', '7'), +('6', '65', '22', '66397', '0', '6'), +('6', '65', '22', '61948', '0', '6'), +('6', '65', '22', '21805', '0', '6'), +('6', '65', '22', '21807', '0', '6'), +('6', '65', '1', '5594', '54307', '6'), +('6', '65', '1', '7130', '37984', '6'), +('6', '65', '1', '16257', '35537', '6'), +('6', '65', '1', '4118', '30805', '6'), +('6', '65', '2', '26763', '28603', '6'), +('6', '65', '2', '9496', '27858', '6'), +('6', '65', '2', '68007', '27500', '6'), +('6', '65', '2', '68189', '27500', '6'), +('6', '65', '3', '26984', '45535', '6'), +('6', '65', '3', '26785', '32034', '6'), +('6', '65', '3', '9490', '31850', '6'), +('6', '65', '3', '9463', '29257', '6'), +('6', '65', '5', '7769', '47163', '6'), +('6', '65', '5', '8774', '44757', '6'), +('6', '65', '5', '62446', '43334', '6'), +('6', '65', '5', '28900', '34763', '6'), +('6', '65', '8', '15815', '44159', '6'), +('6', '65', '8', '15823', '43090', '6'), +('6', '65', '8', '51240', '31836', '6'), +('6', '65', '8', '68189', '27500', '6'), +('6', '65', '6', '13647', '56834', '6'), +('6', '65', '6', '13634', '40792', '6'), +('6', '65', '6', '13644', '30011', '6'), +('6', '65', '6', '28660', '27767', '6'), +('6', '65', '17', '14943', '35137', '6'), +('6', '65', '17', '68007', '27500', '6'), +('6', '65', '17', '68189', '27500', '6'), +('6', '65', '17', '69403', '27406', '6'), +('6', '65', '7', '11575', '44919', '6'), +('6', '65', '7', '68007', '27500', '6'), +('6', '65', '7', '68189', '27500', '6'), +('6', '65', '7', '68052', '26400', '6'), +('6', '65', '9', '26752', '41885', '6'), +('6', '65', '9', '32110', '37243', '6'), +('6', '65', '9', '68189', '27500', '6'), +('6', '65', '9', '68007', '27500', '6'), +('6', '65', '15', '10234', '46753', '6'), +('6', '65', '15', '69382', '43903', '6'), +('6', '65', '15', '26993', '33289', '6'), +('6', '65', '15', '51247', '30152', '6'), +('6', '65', '20', '62446', '43334', '6'), +('6', '65', '20', '68189', '27500', '6'), +('6', '65', '20', '68007', '27500', '6'), +('6', '65', '20', '16158', '27468', '6'), +('6', '65', '12', '13603', '48340', '6'), +('6', '65', '12', '68007', '27500', '6'), +('6', '65', '12', '68189', '27500', '6'), +('6', '65', '12', '68052', '26400', '6'), +('6', '65', '18', '26783', '36292', '6'), +('6', '65', '18', '68007', '27500', '6'), +('6', '65', '18', '68189', '27500', '6'), +('6', '65', '18', '68052', '26400', '6'), +('6', '65', '19', '20422', '33467', '6'), +('6', '65', '19', '28934', '31903', '6'), +('6', '65', '19', '19079', '30099', '6'), +('6', '65', '19', '68007', '27500', '6'), +('6', '65', '13', '21886', '43548', '6'), +('6', '65', '13', '71241', '39703', '6'), +('6', '65', '13', '52054', '34949', '6'), +('6', '65', '13', '28980', '33212', '6'), +('6', '65', '14', '27280', '57050', '6'), +('6', '65', '14', '69404', '45062', '6'), +('6', '65', '14', '68117', '44464', '6'), +('6', '65', '14', '71241', '39703', '6'), +('6', '65', '11', '20898', '54198', '6'), +('6', '65', '11', '68116', '31533', '6'), +('6', '65', '11', '28798', '29202', '6'), +('6', '65', '11', '29033', '27755', '6'), +('6', '65', '22', '66397', '0', '5'), +('6', '65', '22', '61948', '0', '5'), +('6', '65', '22', '21805', '0', '5'), +('6', '65', '22', '21807', '0', '5'), +('6', '65', '1', '5594', '54307', '5'), +('6', '65', '1', '7130', '37984', '5'), +('6', '65', '1', '16257', '35537', '5'), +('6', '65', '1', '4118', '30805', '5'), +('6', '65', '2', '26763', '28603', '5'), +('6', '65', '2', '9496', '27858', '5'), +('6', '65', '2', '16158', '27468', '5'), +('6', '65', '2', '28648', '20813', '5'), +('6', '65', '3', '26984', '45535', '5'), +('6', '65', '3', '26785', '32034', '5'), +('6', '65', '3', '9490', '31850', '5'), +('6', '65', '3', '9463', '29257', '5'), +('6', '65', '5', '7769', '47163', '5'), +('6', '65', '5', '8774', '44757', '5'), +('6', '65', '5', '28900', '34763', '5'), +('6', '65', '5', '7756', '33759', '5'), +('6', '65', '8', '15815', '44159', '5'), +('6', '65', '8', '15823', '43090', '5'), +('6', '65', '8', '51240', '31836', '5'), +('6', '65', '8', '1628', '26710', '5'), +('6', '65', '6', '13647', '56834', '5'), +('6', '65', '6', '13634', '40792', '5'), +('6', '65', '6', '13644', '30011', '5'), +('6', '65', '6', '28660', '27767', '5'), +('6', '65', '17', '14943', '35137', '5'), +('6', '65', '17', '47651', '25253', '5'), +('6', '65', '17', '26782', '17440', '5'), +('6', '65', '17', '55297', '15468', '5'), +('6', '65', '7', '11575', '44919', '5'), +('6', '65', '7', '11549', '25431', '5'), +('6', '65', '7', '21994', '19259', '5'), +('6', '65', '7', '8781', '17417', '5'), +('6', '65', '9', '26752', '41885', '5'), +('6', '65', '9', '32110', '37243', '5'), +('6', '65', '9', '28668', '26001', '5'), +('6', '65', '9', '11054', '24585', '5'), +('6', '65', '15', '10234', '46753', '5'), +('6', '65', '15', '26993', '33289', '5'), +('6', '65', '15', '51247', '30152', '5'), +('6', '65', '15', '32109', '28384', '5'), +('6', '65', '20', '16158', '27468', '5'), +('6', '65', '20', '15871', '25538', '5'), +('6', '65', '20', '11666', '23253', '5'), +('6', '65', '20', '15927', '22754', '5'), +('6', '65', '12', '13603', '48340', '5'), +('6', '65', '12', '27000', '21813', '5'), +('6', '65', '12', '11878', '14940', '5'), +('6', '65', '12', '30534', '13711', '5'), +('6', '65', '18', '26783', '36292', '5'), +('6', '65', '18', '28652', '22992', '5'), +('6', '65', '18', '16811', '19006', '5'), +('6', '65', '18', '16605', '14753', '5'), +('6', '65', '19', '20422', '33467', '5'), +('6', '65', '19', '28934', '31903', '5'), +('6', '65', '19', '19079', '30099', '5'), +('6', '65', '19', '31327', '25096', '5'), +('6', '65', '13', '21886', '43548', '5'), +('6', '65', '13', '52054', '34949', '5'), +('6', '65', '13', '28980', '33212', '5'), +('6', '65', '13', '29033', '27755', '5'), +('6', '65', '14', '27280', '57050', '5'), +('6', '65', '14', '52054', '34949', '5'), +('6', '65', '14', '28980', '33212', '5'), +('6', '65', '14', '27285', '31415', '5'), +('6', '65', '11', '20898', '54198', '5'), +('6', '65', '11', '28798', '29202', '5'), +('6', '65', '11', '29033', '27755', '5'), +('6', '65', '11', '20496', '25871', '5'), +('6', '65', '22', '66397', '0', '4'), +('6', '65', '22', '61948', '0', '4'), +('6', '65', '22', '21805', '0', '4'), +('6', '65', '22', '21807', '0', '4'), +('6', '65', '1', '5594', '54307', '4'), +('6', '65', '1', '7130', '37984', '4'), +('6', '65', '1', '16257', '35537', '4'), +('6', '65', '1', '4118', '30805', '4'), +('6', '65', '2', '26763', '28603', '4'), +('6', '65', '2', '9496', '27858', '4'), +('6', '65', '2', '16158', '27468', '4'), +('6', '65', '2', '28648', '20813', '4'), +('6', '65', '3', '26984', '45535', '4'), +('6', '65', '3', '26785', '32034', '4'), +('6', '65', '3', '9490', '31850', '4'), +('6', '65', '3', '9463', '29257', '4'), +('6', '65', '5', '7769', '47163', '4'), +('6', '65', '5', '8774', '44757', '4'), +('6', '65', '5', '28900', '34763', '4'), +('6', '65', '5', '7756', '33759', '4'), +('6', '65', '8', '15815', '44159', '4'), +('6', '65', '8', '15823', '43090', '4'), +('6', '65', '8', '51240', '31836', '4'), +('6', '65', '8', '1628', '26710', '4'), +('6', '65', '6', '13647', '56834', '4'), +('6', '65', '6', '13634', '40792', '4'), +('6', '65', '6', '13644', '30011', '4'), +('6', '65', '6', '28660', '27767', '4'), +('6', '65', '17', '14943', '35137', '4'), +('6', '65', '17', '47651', '25253', '4'), +('6', '65', '17', '26782', '17440', '4'), +('6', '65', '17', '55297', '15468', '4'), +('6', '65', '7', '11575', '44919', '4'), +('6', '65', '7', '11549', '25431', '4'), +('6', '65', '7', '21994', '19259', '4'), +('6', '65', '7', '8781', '17417', '4'), +('6', '65', '9', '26752', '41885', '4'), +('6', '65', '9', '32110', '37243', '4'), +('6', '65', '9', '28668', '26001', '4'), +('6', '65', '9', '11054', '24585', '4'), +('6', '65', '15', '10234', '46753', '4'), +('6', '65', '15', '26993', '33289', '4'), +('6', '65', '15', '51247', '30152', '4'), +('6', '65', '15', '32109', '28384', '4'), +('6', '65', '20', '16158', '27468', '4'), +('6', '65', '20', '15871', '25538', '4'), +('6', '65', '20', '11666', '23253', '4'), +('6', '65', '20', '15927', '22754', '4'), +('6', '65', '12', '13603', '48340', '4'), +('6', '65', '12', '27000', '21813', '4'), +('6', '65', '12', '11878', '14940', '4'), +('6', '65', '12', '30534', '13711', '4'), +('6', '65', '18', '26783', '36292', '4'), +('6', '65', '18', '28652', '22992', '4'), +('6', '65', '18', '16811', '19006', '4'), +('6', '65', '18', '16605', '14753', '4'), +('6', '65', '19', '20422', '33467', '4'), +('6', '65', '19', '28934', '31903', '4'), +('6', '65', '19', '19079', '30099', '4'), +('6', '65', '19', '31327', '25096', '4'), +('6', '65', '13', '21886', '43548', '4'), +('6', '65', '13', '52054', '34949', '4'), +('6', '65', '13', '28980', '33212', '4'), +('6', '65', '13', '29033', '27755', '4'), +('6', '65', '14', '27280', '57050', '4'), +('6', '65', '14', '52054', '34949', '4'), +('6', '65', '14', '28980', '33212', '4'), +('6', '65', '14', '27285', '31415', '4'), +('6', '65', '11', '20898', '54198', '4'), +('6', '65', '11', '28798', '29202', '4'), +('6', '65', '11', '29033', '27755', '4'), +('6', '65', '11', '20496', '25871', '4'), +('6', '66', '22', '66397', '0', '7'), +('6', '66', '22', '61948', '0', '7'), +('6', '66', '22', '21805', '0', '7'), +('6', '66', '22', '21807', '0', '7'), +('6', '66', '1', '5594', '52807', '7'), +('6', '66', '1', '68949', '50141', '7'), +('6', '66', '1', '7130', '37489', '7'), +('6', '66', '1', '52121', '37408', '7'), +('6', '66', '2', '26763', '27856', '7'), +('6', '66', '2', '69089', '27773', '7'), +('6', '66', '2', '16158', '27022', '7'), +('6', '66', '2', '9496', '26859', '7'), +('6', '66', '3', '69068', '79390', '7'), +('6', '66', '3', '68819', '48706', '7'), +('6', '66', '3', '69132', '46784', '7'), +('6', '66', '3', '26984', '44540', '7'), +('6', '66', '5', '69097', '79940', '7'), +('6', '66', '5', '68950', '79622', '7'), +('6', '66', '5', '7769', '46167', '7'), +('6', '66', '5', '50414', '44259', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '66', '8', '69064', '79039', '7'), +('6', '66', '8', '69164', '52540', '7'), +('6', '66', '8', '15815', '43159', '7'), +('6', '66', '8', '15823', '41844', '7'), +('6', '66', '6', '13647', '55339', '7'), +('6', '66', '6', '69073', '49534', '7'), +('6', '66', '6', '68841', '48973', '7'), +('6', '66', '6', '69066', '43158', '7'), +('6', '66', '17', '69152', '54293', '7'), +('6', '66', '17', '68750', '46476', '7'), +('6', '66', '17', '14943', '34392', '7'), +('6', '66', '17', '68980', '27442', '7'), +('6', '66', '7', '68901', '45027', '7'), +('6', '66', '7', '11575', '43673', '7'), +('6', '66', '7', '69175', '31225', '7'), +('6', '66', '7', '69081', '27111', '7'), +('6', '66', '9', '68767', '50386', '7'), +('6', '66', '9', '69100', '43913', '7'), +('6', '66', '9', '26752', '40387', '7'), +('6', '66', '9', '32110', '36671', '7'), +('6', '66', '15', '69160', '80711', '7'), +('6', '66', '15', '10234', '45506', '7'), +('6', '66', '15', '69070', '42772', '7'), +('6', '66', '15', '69382', '42656', '7'), +('6', '66', '20', '68951', '48141', '7'), +('6', '66', '20', '62446', '42084', '7'), +('6', '66', '20', '67625', '35240', '7'), +('6', '66', '20', '69134', '32541', '7'), +('6', '66', '12', '68902', '49045', '7'), +('6', '66', '12', '13603', '47093', '7'), +('6', '66', '12', '69085', '34634', '7'), +('6', '66', '12', '69254', '32898', '7'), +('6', '66', '18', '69148', '39490', '7'), +('6', '66', '18', '26783', '35144', '7'), +('6', '66', '18', '68981', '31777', '7'), +('6', '66', '18', '68007', '26250', '7'), +('6', '66', '19', '69179', '32740', '7'), +('6', '66', '19', '20422', '32721', '7'), +('6', '66', '19', '28934', '30903', '7'), +('6', '66', '19', '19079', '29352', '7'), +('6', '66', '13', '21886', '42552', '7'), +('6', '66', '13', '69098', '41556', '7'), +('6', '66', '13', '71241', '38455', '7'), +('6', '66', '13', '69047', '34041', '7'), +('6', '66', '14', '69155', '80831', '7'), +('6', '66', '14', '27280', '55555', '7'), +('6', '66', '14', '69404', '43815', '7'), +('6', '66', '14', '68117', '43217', '7'), +('6', '66', '11', '68952', '62974', '7'), +('6', '66', '11', '20898', '52701', '7'), +('6', '66', '11', '69162', '33660', '7'), +('6', '66', '11', '67606', '32125', '7'), +('6', '67', '22', '66397', '0', '7'), +('6', '67', '22', '61948', '0', '7'), +('6', '67', '22', '21805', '0', '7'), +('6', '67', '22', '21807', '0', '7'), +('6', '67', '1', '5594', '51307', '7'), +('6', '67', '1', '68949', '49146', '7'), +('6', '67', '1', '7130', '36994', '7'), +('6', '67', '1', '52121', '36911', '7'), +('6', '67', '2', '69089', '27777', '7'), +('6', '67', '2', '26763', '27109', '7'), +('6', '67', '2', '16158', '26576', '7'), +('6', '67', '2', '9496', '25861', '7'), +('6', '67', '3', '69068', '77146', '7'), +('6', '67', '3', '68819', '47209', '7'), +('6', '67', '3', '69132', '46289', '7'), +('6', '67', '3', '26984', '43545', '7'), +('6', '67', '5', '69097', '77695', '7'), +('6', '67', '5', '68950', '77376', '7'), +('6', '67', '5', '7769', '45171', '7'), +('6', '67', '5', '50414', '43012', '7'), +('6', '67', '8', '69064', '77044', '7'), +('6', '67', '8', '69164', '51796', '7'), +('6', '67', '8', '15815', '42159', '7'), +('6', '67', '8', '15823', '40597', '7'), +('6', '67', '6', '13647', '53844', '7'), +('6', '67', '6', '69073', '48639', '7'), +('6', '67', '6', '68841', '47977', '7'), +('6', '67', '6', '69066', '42661', '7'), +('6', '67', '17', '69152', '53398', '7'), +('6', '67', '17', '68750', '45480', '7'), +('6', '67', '17', '14943', '33647', '7'), +('6', '67', '17', '68980', '27447', '7'), +('6', '67', '7', '68901', '44131', '7'), +('6', '67', '7', '11575', '42427', '7'), +('6', '67', '7', '69175', '31229', '7'), +('6', '67', '7', '69081', '27114', '7'), +('6', '67', '9', '68767', '48888', '7'), +('6', '67', '9', '69100', '43343', '7'), +('6', '67', '9', '26752', '38889', '7'), +('6', '67', '9', '32110', '36100', '7'), +('6', '67', '15', '69160', '78711', '7'), +('6', '67', '15', '10234', '44259', '7'), +('6', '67', '15', '69070', '42276', '7'), +('6', '67', '15', '69382', '41409', '7'), +('6', '67', '20', '68951', '47246', '7'), +('6', '67', '20', '62446', '40834', '7'), +('6', '67', '20', '67625', '35245', '7'), +('6', '67', '20', '69134', '32546', '7'), +('6', '67', '12', '68902', '47798', '7'), +('6', '67', '12', '13603', '45847', '7'), +('6', '67', '12', '69085', '34339', '7'), +('6', '67', '12', '69254', '32901', '7'), +('6', '67', '18', '69148', '39245', '7'), +('6', '67', '18', '26783', '33996', '7'), +('6', '67', '18', '68981', '31481', '7'), +('6', '67', '18', '68189', '25000', '7'), +('6', '67', '19', '69179', '32745', '7'), +('6', '67', '19', '20422', '31975', '7'), +('6', '67', '19', '28934', '29903', '7'), +('6', '67', '19', '19079', '28606', '7'), +('6', '67', '13', '21886', '41556', '7'), +('6', '67', '13', '69098', '40962', '7'), +('6', '67', '13', '71241', '37207', '7'), +('6', '67', '13', '69047', '33746', '7'), +('6', '67', '14', '69155', '78832', '7'), +('6', '67', '14', '27280', '54060', '7'), +('6', '67', '14', '69404', '42568', '7'), +('6', '67', '14', '68117', '41970', '7'), +('6', '67', '11', '68952', '61478', '7'), +('6', '67', '11', '20898', '51204', '7'), +('6', '67', '11', '69162', '33666', '7'), +('6', '67', '11', '67606', '32129', '7'), +('6', '68', '22', '66397', '0', '7'), +('6', '68', '22', '61948', '0', '7'), +('6', '68', '22', '21805', '0', '7'), +('6', '68', '22', '21807', '0', '7'), +('6', '68', '1', '5594', '49808', '7'), +('6', '68', '1', '68949', '48152', '7'), +('6', '68', '1', '7130', '36499', '7'), +('6', '68', '1', '52121', '36414', '7'), +('6', '68', '2', '69089', '27781', '7'), +('6', '68', '2', '26763', '26362', '7'), +('6', '68', '2', '16158', '26130', '7'), +('6', '68', '2', '9496', '24863', '7'), +('6', '68', '3', '69068', '74901', '7'), +('6', '68', '3', '69132', '45794', '7'), +('6', '68', '3', '68819', '45712', '7'), +('6', '68', '3', '26984', '42550', '7'), +('6', '68', '5', '69097', '75450', '7'), +('6', '68', '5', '68950', '75130', '7'), +('6', '68', '5', '7769', '44175', '7'), +('6', '68', '5', '50414', '41766', '7'), +('6', '68', '8', '69064', '75049', '7'), +('6', '68', '8', '69164', '51051', '7'), +('6', '68', '8', '15815', '41159', '7'), +('6', '68', '8', '15823', '39351', '7'), +('6', '68', '6', '13647', '52350', '7'), +('6', '68', '6', '69073', '47744', '7'), +('6', '68', '6', '68841', '46981', '7'), +('6', '68', '6', '69066', '42164', '7'), +('6', '68', '17', '69152', '52503', '7'), +('6', '68', '17', '68750', '44484', '7'), +('6', '68', '17', '14943', '32902', '7'), +('6', '68', '17', '68980', '27452', '7'), +('6', '68', '7', '68901', '43235', '7'), +('6', '68', '7', '11575', '41181', '7'), +('6', '68', '7', '69175', '31233', '7'), +('6', '68', '7', '69081', '27117', '7'), +('6', '68', '9', '68767', '47390', '7'), +('6', '68', '9', '69100', '42773', '7'), +('6', '68', '9', '26752', '37391', '7'), +('6', '68', '9', '32110', '35529', '7'), +('6', '68', '15', '69160', '76711', '7'), +('6', '68', '15', '10234', '43012', '7'), +('6', '68', '15', '69070', '41780', '7'), +('6', '68', '15', '69382', '40162', '7'), +('6', '68', '20', '68951', '46351', '7'), +('6', '68', '20', '62446', '39584', '7'), +('6', '68', '20', '67625', '35250', '7'), +('6', '68', '20', '69134', '32551', '7'), +('6', '68', '12', '68902', '46552', '7'), +('6', '68', '12', '13603', '44601', '7'), +('6', '68', '12', '69085', '34044', '7'), +('6', '68', '12', '69254', '32905', '7'), +('6', '68', '18', '69148', '39000', '7'), +('6', '68', '18', '26783', '32848', '7'), +('6', '68', '18', '68981', '31185', '7'), +('6', '68', '18', '68781', '24485', '7'), +('6', '68', '19', '69179', '32750', '7'), +('6', '68', '19', '20422', '31229', '7'), +('6', '68', '19', '28934', '28903', '7'), +('6', '68', '19', '69077', '28283', '7'), +('6', '68', '13', '21886', '40561', '7'), +('6', '68', '13', '69098', '40368', '7'), +('6', '68', '13', '71241', '35959', '7'), +('6', '68', '13', '69047', '33451', '7'), +('6', '68', '14', '69155', '76832', '7'), +('6', '68', '14', '27280', '52565', '7'), +('6', '68', '14', '69404', '41321', '7'), +('6', '68', '14', '68117', '40723', '7'), +('6', '68', '11', '68952', '59982', '7'), +('6', '68', '11', '20898', '49707', '7'), +('6', '68', '11', '69162', '33672', '7'), +('6', '68', '11', '67606', '32133', '7'), +('6', '69', '22', '66397', '0', '7'), +('6', '69', '22', '61948', '0', '7'), +('6', '69', '22', '21805', '0', '7'), +('6', '69', '22', '21807', '0', '7'), +('6', '69', '1', '5594', '48308', '7'), +('6', '69', '1', '68949', '47157', '7'), +('6', '69', '1', '7130', '36005', '7'), +('6', '69', '1', '52121', '35917', '7'), +('6', '69', '2', '69089', '27785', '7'), +('6', '69', '2', '16158', '25684', '7'), +('6', '69', '2', '26763', '25615', '7'), +('6', '69', '2', '67729', '24803', '7'), +('6', '69', '3', '69068', '72656', '7'), +('6', '69', '3', '69132', '45299', '7'), +('6', '69', '3', '68819', '44215', '7'), +('6', '69', '3', '26984', '41555', '7'), +('6', '69', '5', '69097', '73205', '7'), +('6', '69', '5', '68950', '72884', '7'), +('6', '69', '5', '7769', '43179', '7'), +('6', '69', '5', '8774', '40758', '7'), +('6', '69', '8', '69064', '73054', '7'), +('6', '69', '8', '69164', '50306', '7'), +('6', '69', '8', '15815', '40159', '7'), +('6', '69', '8', '15823', '38104', '7'), +('6', '69', '6', '13647', '50855', '7'), +('6', '69', '6', '69073', '46849', '7'), +('6', '69', '6', '68841', '45985', '7'), +('6', '69', '6', '69066', '41667', '7'), +('6', '69', '17', '69152', '51608', '7'), +('6', '69', '17', '68750', '43488', '7'), +('6', '69', '17', '14943', '32157', '7'), +('6', '69', '17', '68980', '27457', '7'), +('6', '69', '7', '68901', '42339', '7'), +('6', '69', '7', '11575', '39936', '7'), +('6', '69', '7', '69175', '31237', '7'), +('6', '69', '7', '69081', '27120', '7'), +('6', '69', '9', '68767', '45892', '7'), +('6', '69', '9', '69100', '42203', '7'), +('6', '69', '9', '26752', '35893', '7'), +('6', '69', '9', '32110', '34957', '7'), +('6', '69', '15', '69160', '74711', '7'), +('6', '69', '15', '10234', '41765', '7'), +('6', '69', '15', '69070', '41284', '7'), +('6', '69', '15', '69382', '38915', '7'), +('6', '69', '20', '68951', '45456', '7'), +('6', '69', '20', '62446', '38334', '7'), +('6', '69', '20', '67625', '35255', '7'), +('6', '69', '20', '69134', '32556', '7'), +('6', '69', '12', '68902', '45306', '7'), +('6', '69', '12', '13603', '43354', '7'), +('6', '69', '12', '69085', '33749', '7'), +('6', '69', '12', '69254', '32909', '7'), +('6', '69', '18', '69148', '38755', '7'), +('6', '69', '18', '26783', '31700', '7'), +('6', '69', '18', '68981', '30889', '7'), +('6', '69', '18', '68781', '24489', '7'), +('6', '69', '19', '69179', '32755', '7'), +('6', '69', '19', '20422', '30483', '7'), +('6', '69', '19', '69077', '28287', '7'), +('6', '69', '19', '28934', '27903', '7'), +('6', '69', '13', '69098', '39774', '7'), +('6', '69', '13', '21886', '39565', '7'), +('6', '69', '13', '71241', '34711', '7'), +('6', '69', '13', '69159', '33377', '7'), +('6', '69', '14', '69155', '74832', '7'), +('6', '69', '14', '27280', '51070', '7'), +('6', '69', '14', '69404', '40074', '7'), +('6', '69', '14', '69098', '39774', '7'), +('6', '69', '11', '68952', '58486', '7'), +('6', '69', '11', '20898', '48210', '7'), +('6', '69', '11', '69162', '33678', '7'), +('6', '69', '11', '67606', '32137', '7'), +('6', '70', '22', '21805', '0', '11'), +('6', '70', '22', '61948', '0', '11'), +('6', '70', '22', '21807', '0', '11'), +('6', '70', '22', '12425', '0', '11'), +('6', '70', '1', '39329', '108055', '11'), +('6', '70', '1', '71668', '59390', '11'), +('6', '70', '1', '83662', '52524', '11'), +('6', '70', '1', '83630', '48944', '11'), +('6', '70', '2', '83562', '39985', '11'), +('6', '70', '2', '70888', '38274', '11'), +('6', '70', '2', '83542', '34784', '11'), +('6', '70', '2', '47210', '32789', '11'), +('6', '70', '3', '69068', '70411', '11'), +('6', '70', '3', '83658', '64975', '11'), +('6', '70', '3', '70620', '62793', '11'), +('6', '70', '3', '39368', '50802', '11'), +('6', '70', '5', '69097', '70960', '11'), +('6', '70', '5', '68950', '70638', '11'), +('6', '70', '5', '47276', '58825', '11'), +('6', '70', '5', '51701', '50612', '11'), +('6', '70', '8', '39293', '108213', '11'), +('6', '70', '8', '83532', '73659', '11'), +('6', '70', '8', '69064', '71059', '11'), +('6', '70', '8', '83659', '66515', '11'), +('6', '70', '6', '71666', '90091', '11'), +('6', '70', '6', '39263', '61830', '11'), +('6', '70', '6', '83660', '59166', '11'), +('6', '70', '6', '39269', '57312', '11'), +('6', '70', '17', '70893', '68167', '11'), +('6', '70', '17', '83605', '67720', '11'), +('6', '70', '17', '69152', '50713', '11'), +('6', '70', '17', '68750', '42492', '11'), +('6', '70', '7', '39357', '66894', '11'), +('6', '70', '7', '68901', '41443', '11'), +('6', '70', '7', '83566', '40935', '11'), +('6', '70', '7', '11575', '38690', '11'), +('6', '70', '9', '51708', '109963', '11'), +('6', '70', '9', '68767', '44394', '11'), +('6', '70', '9', '83654', '43843', '11'), +('6', '70', '9', '39346', '43646', '11'), +('6', '70', '15', '83629', '107381', '11'), +('6', '70', '15', '69160', '72711', '11'), +('6', '70', '15', '47238', '69305', '11'), +('6', '70', '15', '39277', '61678', '11'), +('6', '70', '20', '47284', '67519', '11'), +('6', '70', '20', '47282', '57488', '11'), +('6', '70', '20', '83600', '48882', '11'), +('6', '70', '20', '39350', '46313', '11'), +('6', '70', '12', '68902', '44059', '11'), +('6', '70', '12', '13603', '42108', '11'), +('6', '70', '12', '83570', '41834', '11'), +('6', '70', '12', '83496', '39691', '11'), +('6', '70', '18', '83609', '111018', '11'), +('6', '70', '18', '70894', '40616', '11'), +('6', '70', '18', '69148', '38510', '11'), +('6', '70', '18', '71648', '36651', '11'), +('6', '70', '19', '70892', '82613', '11'), +('6', '70', '19', '83574', '55634', '11'), +('6', '70', '19', '47218', '51741', '11'), +('6', '70', '19', '39279', '41298', '11'), +('6', '70', '13', '83460', '64457', '11'), +('6', '70', '13', '39211', '59760', '11'), +('6', '70', '13', '83631', '56591', '11'), +('6', '70', '13', '83508', '54490', '11'), +('6', '70', '14', '69155', '72832', '11'), +('6', '70', '14', '83460', '64457', '11'), +('6', '70', '14', '39211', '59760', '11'), +('6', '70', '14', '83508', '54490', '11'), +('6', '70', '11', '39287', '108333', '11'), +('6', '70', '11', '68952', '56991', '11'), +('6', '70', '11', '71659', '55655', '11'), +('6', '70', '11', '39320', '50733', '11'), +('6', '70', '22', '61948', '0', '10'), +('6', '70', '22', '66397', '0', '10'), +('6', '70', '22', '21805', '0', '10'), +('6', '70', '22', '21807', '0', '10'), +('6', '70', '1', '71668', '59390', '10'), +('6', '70', '1', '83662', '52524', '10'), +('6', '70', '1', '83630', '48944', '10'), +('6', '70', '1', '5594', '46808', '10'), +('6', '70', '2', '83562', '39985', '10'), +('6', '70', '2', '70888', '38274', '10'), +('6', '70', '2', '83542', '34784', '10'), +('6', '70', '2', '47210', '32789', '10'), +('6', '70', '3', '69068', '70411', '10'), +('6', '70', '3', '83658', '64975', '10'), +('6', '70', '3', '70620', '62793', '10'), +('6', '70', '3', '70602', '49684', '10'), +('6', '70', '5', '69097', '70960', '10'), +('6', '70', '5', '68950', '70638', '10'), +('6', '70', '5', '47276', '58825', '10'), +('6', '70', '5', '70705', '44814', '10'), +('6', '70', '8', '83532', '73659', '10'), +('6', '70', '8', '69064', '71059', '10'), +('6', '70', '8', '83659', '66515', '10'), +('6', '70', '8', '47306', '58997', '10'), +('6', '70', '6', '71666', '90091', '10'), +('6', '70', '6', '83660', '59166', '10'), +('6', '70', '6', '47280', '50327', '10'), +('6', '70', '6', '13647', '49360', '10'), +('6', '70', '17', '70893', '68167', '10'), +('6', '70', '17', '83605', '67720', '10'), +('6', '70', '17', '69152', '50713', '10'), +('6', '70', '17', '68750', '42492', '10'), +('6', '70', '7', '68901', '41443', '10'), +('6', '70', '7', '83566', '40935', '10'), +('6', '70', '7', '11575', '38690', '10'), +('6', '70', '7', '70889', '37648', '10'), +('6', '70', '9', '68767', '44394', '10'), +('6', '70', '9', '83654', '43843', '10'), +('6', '70', '9', '69100', '41634', '10'), +('6', '70', '9', '70890', '36737', '10'), +('6', '70', '15', '83629', '107381', '10'), +('6', '70', '15', '69160', '72711', '10'), +('6', '70', '15', '47238', '69305', '10'), +('6', '70', '15', '47291', '56384', '10'), +('6', '70', '20', '47284', '67519', '10'), +('6', '70', '20', '47282', '57488', '10'), +('6', '70', '20', '83600', '48882', '10'), +('6', '70', '20', '68951', '44561', '10'), +('6', '70', '12', '68902', '44059', '10'), +('6', '70', '12', '13603', '42108', '10'), +('6', '70', '12', '83570', '41834', '10'), +('6', '70', '12', '83496', '39691', '10'), +('6', '70', '18', '83609', '111018', '10'), +('6', '70', '18', '70894', '40616', '10'), +('6', '70', '18', '69148', '38510', '10'), +('6', '70', '18', '71648', '36651', '10'), +('6', '70', '19', '70892', '82613', '10'), +('6', '70', '19', '83574', '55634', '10'), +('6', '70', '19', '47218', '51741', '10'), +('6', '70', '19', '83504', '34140', '10'), +('6', '70', '13', '83460', '64457', '10'), +('6', '70', '13', '83631', '56591', '10'), +('6', '70', '13', '83508', '54490', '10'), +('6', '70', '13', '71610', '43370', '10'), +('6', '70', '14', '69155', '72832', '10'), +('6', '70', '14', '83460', '64457', '10'), +('6', '70', '14', '83508', '54490', '10'), +('6', '70', '14', '39315', '50763', '10'), +('6', '70', '11', '68952', '56991', '10'), +('6', '70', '11', '71659', '55655', '10'), +('6', '70', '11', '20898', '46713', '10'), +('6', '70', '11', '83665', '45468', '10'), +('6', '70', '22', '66397', '0', '9'), +('6', '70', '22', '61948', '0', '9'), +('6', '70', '22', '21805', '0', '9'), +('6', '70', '22', '21807', '0', '9'), +('6', '70', '1', '71668', '59390', '9'), +('6', '70', '1', '5594', '46808', '9'), +('6', '70', '1', '68949', '46162', '9'), +('6', '70', '1', '47289', '41973', '9'), +('6', '70', '2', '70888', '38274', '9'), +('6', '70', '2', '47210', '32789', '9'), +('6', '70', '2', '69089', '27789', '9'), +('6', '70', '2', '71083', '26213', '9'), +('6', '70', '3', '69068', '70411', '9'), +('6', '70', '3', '70620', '62793', '9'), +('6', '70', '3', '70602', '49684', '9'), +('6', '70', '3', '71626', '46364', '9'), +('6', '70', '5', '69097', '70960', '9'), +('6', '70', '5', '68950', '70638', '9'), +('6', '70', '5', '47276', '58825', '9'), +('6', '70', '5', '70705', '44814', '9'), +('6', '70', '8', '69064', '71059', '9'), +('6', '70', '8', '47306', '58997', '9'), +('6', '70', '8', '71656', '56297', '9'), +('6', '70', '8', '69164', '49561', '9'), +('6', '70', '6', '71666', '90091', '9'), +('6', '70', '6', '47280', '50327', '9'), +('6', '70', '6', '13647', '49360', '9'), +('6', '70', '6', '69073', '45954', '9'), +('6', '70', '17', '70893', '68167', '9'), +('6', '70', '17', '69152', '50713', '9'), +('6', '70', '17', '68750', '42492', '9'), +('6', '70', '17', '71097', '41896', '9'), +('6', '70', '7', '68901', '41443', '9'), +('6', '70', '7', '11575', '38690', '9'), +('6', '70', '7', '70889', '37648', '9'), +('6', '70', '7', '47206', '33121', '9'), +('6', '70', '9', '68767', '44394', '9'), +('6', '70', '9', '69100', '41634', '9'), +('6', '70', '9', '70890', '36737', '9'), +('6', '70', '9', '26752', '34395', '9'), +('6', '70', '15', '69160', '72711', '9'), +('6', '70', '15', '47238', '69305', '9'), +('6', '70', '15', '47291', '56384', '9'), +('6', '70', '15', '47240', '51049', '9'), +('6', '70', '20', '47284', '67519', '9'), +('6', '70', '20', '47282', '57488', '9'), +('6', '70', '20', '68951', '44561', '9'), +('6', '70', '20', '62446', '37084', '9'), +('6', '70', '12', '68902', '44059', '9'), +('6', '70', '12', '13603', '42108', '9'), +('6', '70', '12', '70891', '37634', '9'), +('6', '70', '12', '69085', '33454', '9'), +('6', '70', '18', '70894', '40616', '9'), +('6', '70', '18', '69148', '38510', '9'), +('6', '70', '18', '71648', '36651', '9'), +('6', '70', '18', '47202', '33716', '9'), +('6', '70', '19', '70892', '82613', '9'), +('6', '70', '19', '47218', '51741', '9'), +('6', '70', '19', '71086', '34003', '9'), +('6', '70', '19', '69179', '32760', '9'), +('6', '70', '13', '71610', '43370', '9'), +('6', '70', '13', '62880', '41588', '9'), +('6', '70', '13', '71671', '40490', '9'), +('6', '70', '13', '69098', '39180', '9'), +('6', '70', '14', '69155', '72832', '9'), +('6', '70', '14', '39315', '50763', '9'), +('6', '70', '14', '27280', '49575', '9'), +('6', '70', '14', '71610', '43370', '9'), +('6', '70', '11', '68952', '56991', '9'), +('6', '70', '11', '71659', '55655', '9'), +('6', '70', '11', '20898', '46713', '9'), +('6', '70', '11', '47298', '37058', '9'), +('6', '70', '22', '66397', '0', '8'), +('6', '70', '22', '61948', '0', '8'), +('6', '70', '22', '21805', '0', '8'), +('6', '70', '22', '21807', '0', '8'), +('6', '70', '1', '5594', '46808', '8'), +('6', '70', '1', '68949', '46162', '8'), +('6', '70', '1', '47289', '41973', '8'), +('6', '70', '1', '47235', '39707', '8'), +('6', '70', '2', '70888', '38274', '8'), +('6', '70', '2', '47210', '32789', '8'), +('6', '70', '2', '69089', '27789', '8'), +('6', '70', '2', '71083', '26213', '8'), +('6', '70', '3', '69068', '70411', '8'), +('6', '70', '3', '70620', '62793', '8'), +('6', '70', '3', '70602', '49684', '8'), +('6', '70', '3', '69132', '44804', '8'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '70', '5', '69097', '70960', '8'), +('6', '70', '5', '68950', '70638', '8'), +('6', '70', '5', '47276', '58825', '8'), +('6', '70', '5', '70705', '44814', '8'), +('6', '70', '8', '69064', '71059', '8'), +('6', '70', '8', '47306', '58997', '8'), +('6', '70', '8', '69164', '49561', '8'), +('6', '70', '8', '15815', '39159', '8'), +('6', '70', '6', '47280', '50327', '8'), +('6', '70', '6', '13647', '49360', '8'), +('6', '70', '6', '69073', '45954', '8'), +('6', '70', '6', '68841', '44989', '8'), +('6', '70', '17', '70893', '68167', '8'), +('6', '70', '17', '69152', '50713', '8'), +('6', '70', '17', '68750', '42492', '8'), +('6', '70', '17', '71097', '41896', '8'), +('6', '70', '7', '68901', '41443', '8'), +('6', '70', '7', '11575', '38690', '8'), +('6', '70', '7', '70889', '37648', '8'), +('6', '70', '7', '47206', '33121', '8'), +('6', '70', '9', '68767', '44394', '8'), +('6', '70', '9', '69100', '41634', '8'), +('6', '70', '9', '70890', '36737', '8'), +('6', '70', '9', '26752', '34395', '8'), +('6', '70', '15', '69160', '72711', '8'), +('6', '70', '15', '47238', '69305', '8'), +('6', '70', '15', '47291', '56384', '8'), +('6', '70', '15', '47240', '51049', '8'), +('6', '70', '20', '47284', '67519', '8'), +('6', '70', '20', '47282', '57488', '8'), +('6', '70', '20', '68951', '44561', '8'), +('6', '70', '20', '62446', '37084', '8'), +('6', '70', '12', '68902', '44059', '8'), +('6', '70', '12', '13603', '42108', '8'), +('6', '70', '12', '70891', '37634', '8'), +('6', '70', '12', '69085', '33454', '8'), +('6', '70', '18', '70894', '40616', '8'), +('6', '70', '18', '69148', '38510', '8'), +('6', '70', '18', '47202', '33716', '8'), +('6', '70', '18', '68981', '30593', '8'), +('6', '70', '19', '70892', '82613', '8'), +('6', '70', '19', '47218', '51741', '8'), +('6', '70', '19', '71086', '34003', '8'), +('6', '70', '19', '69179', '32760', '8'), +('6', '70', '13', '62880', '41588', '8'), +('6', '70', '13', '69098', '39180', '8'), +('6', '70', '13', '21886', '38569', '8'), +('6', '70', '13', '47308', '38231', '8'), +('6', '70', '14', '69155', '72832', '8'), +('6', '70', '14', '39315', '50763', '8'), +('6', '70', '14', '27280', '49575', '8'), +('6', '70', '14', '69098', '39180', '8'), +('6', '70', '11', '68952', '56991', '8'), +('6', '70', '11', '20898', '46713', '8'), +('6', '70', '11', '47298', '37058', '8'), +('6', '70', '11', '47296', '35300', '8'), +('6', '71', '22', '21805', '0', '11'), +('6', '71', '22', '61948', '0', '11'), +('6', '71', '22', '21807', '0', '11'), +('6', '71', '22', '12425', '0', '11'), +('6', '71', '1', '39329', '105060', '11'), +('6', '71', '1', '71668', '58396', '11'), +('6', '71', '1', '83662', '52180', '11'), +('6', '71', '1', '83630', '48598', '11'), +('6', '71', '2', '83562', '39991', '11'), +('6', '71', '2', '70888', '38280', '11'), +('6', '71', '2', '83542', '34788', '11'), +('6', '71', '2', '47210', '32794', '11'), +('6', '71', '3', '69068', '68166', '11'), +('6', '71', '3', '83658', '63980', '11'), +('6', '71', '3', '70620', '61047', '11'), +('6', '71', '3', '39368', '50809', '11'), +('6', '71', '5', '69097', '68715', '11'), +('6', '71', '5', '68950', '68392', '11'), +('6', '71', '5', '47276', '57830', '11'), +('6', '71', '5', '39366', '50361', '11'), +('6', '71', '8', '39293', '105217', '11'), +('6', '71', '8', '83532', '71664', '11'), +('6', '71', '8', '69064', '69064', '11'), +('6', '71', '8', '83659', '65515', '11'), +('6', '71', '6', '71666', '87597', '11'), +('6', '71', '6', '39263', '60834', '11'), +('6', '71', '6', '83660', '58466', '11'), +('6', '71', '6', '39269', '56617', '11'), +('6', '71', '17', '70893', '66918', '11'), +('6', '71', '17', '83605', '66725', '11'), +('6', '71', '17', '69152', '49818', '11'), +('6', '71', '17', '68750', '41496', '11'), +('6', '71', '7', '39357', '65898', '11'), +('6', '71', '7', '83566', '40941', '11'), +('6', '71', '7', '68901', '40547', '11'), +('6', '71', '7', '70889', '37652', '11'), +('6', '71', '9', '51708', '106968', '11'), +('6', '71', '9', '83654', '43847', '11'), +('6', '71', '9', '39346', '43650', '11'), +('6', '71', '9', '68767', '42896', '11'), +('6', '71', '15', '83629', '104387', '11'), +('6', '71', '15', '69160', '70712', '11'), +('6', '71', '15', '47238', '67560', '11'), +('6', '71', '15', '39277', '60682', '11'), +('6', '71', '20', '47284', '66022', '11'), +('6', '71', '20', '47282', '56492', '11'), +('6', '71', '20', '83600', '48538', '11'), +('6', '71', '20', '39350', '46318', '11'), +('6', '71', '12', '68902', '42813', '11'), +('6', '71', '12', '83570', '41840', '11'), +('6', '71', '12', '84145', '40862', '11'), +('6', '71', '12', '83496', '39395', '11'), +('6', '71', '18', '83609', '108023', '11'), +('6', '71', '18', '70894', '40621', '11'), +('6', '71', '18', '69148', '38265', '11'), +('6', '71', '18', '71648', '36404', '11'), +('6', '71', '19', '70892', '80371', '11'), +('6', '71', '19', '83574', '54940', '11'), +('6', '71', '19', '47218', '50845', '11'), +('6', '71', '19', '39279', '41302', '11'), +('6', '71', '13', '83460', '62712', '11'), +('6', '71', '13', '39211', '58765', '11'), +('6', '71', '13', '83631', '55897', '11'), +('6', '71', '13', '83508', '53494', '11'), +('6', '71', '14', '69155', '70832', '11'), +('6', '71', '14', '83460', '62712', '11'), +('6', '71', '14', '39211', '58765', '11'), +('6', '71', '14', '83508', '53494', '11'), +('6', '71', '11', '39287', '105338', '11'), +('6', '71', '11', '68952', '55495', '11'), +('6', '71', '11', '71659', '54660', '11'), +('6', '71', '11', '39320', '50389', '11'), +('6', '72', '22', '21805', '0', '11'), +('6', '72', '22', '61948', '0', '11'), +('6', '72', '22', '21807', '0', '11'), +('6', '72', '22', '12425', '0', '11'), +('6', '72', '1', '39329', '102065', '11'), +('6', '72', '1', '71668', '57401', '11'), +('6', '72', '1', '83662', '51837', '11'), +('6', '72', '1', '83630', '48252', '11'), +('6', '72', '2', '83562', '39997', '11'), +('6', '72', '2', '70888', '38286', '11'), +('6', '72', '2', '83542', '34792', '11'), +('6', '72', '2', '47210', '32798', '11'), +('6', '72', '3', '69068', '65921', '11'), +('6', '72', '3', '83658', '62984', '11'), +('6', '72', '3', '70620', '59301', '11'), +('6', '72', '3', '39368', '50816', '11'), +('6', '72', '5', '69097', '66470', '11'), +('6', '72', '5', '68950', '66146', '11'), +('6', '72', '5', '47276', '56835', '11'), +('6', '72', '5', '39366', '50369', '11'), +('6', '72', '8', '39293', '102222', '11'), +('6', '72', '8', '83532', '69669', '11'), +('6', '72', '8', '69064', '67069', '11'), +('6', '72', '8', '83659', '64515', '11'), +('6', '72', '6', '71666', '85102', '11'), +('6', '72', '6', '39263', '59838', '11'), +('6', '72', '6', '83660', '57766', '11'), +('6', '72', '6', '39269', '55922', '11'), +('6', '72', '17', '83605', '65730', '11'), +('6', '72', '17', '70893', '65668', '11'), +('6', '72', '17', '69152', '48923', '11'), +('6', '72', '17', '68750', '40500', '11'), +('6', '72', '7', '39357', '64902', '11'), +('6', '72', '7', '83566', '40948', '11'), +('6', '72', '7', '68901', '39651', '11'), +('6', '72', '7', '70889', '37657', '11'), +('6', '72', '9', '51708', '103973', '11'), +('6', '72', '9', '83654', '43851', '11'), +('6', '72', '9', '39346', '43654', '11'), +('6', '72', '9', '39297', '41463', '11'), +('6', '72', '15', '83629', '101394', '11'), +('6', '72', '15', '69160', '68712', '11'), +('6', '72', '15', '47238', '65814', '11'), +('6', '72', '15', '39277', '59686', '11'), +('6', '72', '20', '47284', '64525', '11'), +('6', '72', '20', '47282', '55495', '11'), +('6', '72', '20', '83600', '48194', '11'), +('6', '72', '20', '39350', '46323', '11'), +('6', '72', '12', '83570', '41847', '11'), +('6', '72', '12', '68902', '41567', '11'), +('6', '72', '12', '84145', '39615', '11'), +('6', '72', '12', '83496', '39099', '11'), +('6', '72', '18', '83609', '105028', '11'), +('6', '72', '18', '70894', '40627', '11'), +('6', '72', '18', '69148', '38021', '11'), +('6', '72', '18', '71648', '36158', '11'), +('6', '72', '19', '70892', '78129', '11'), +('6', '72', '19', '83574', '54246', '11'), +('6', '72', '19', '47218', '49950', '11'), +('6', '72', '19', '39279', '41305', '11'), +('6', '72', '13', '83460', '60967', '11'), +('6', '72', '13', '39211', '57770', '11'), +('6', '72', '13', '83631', '55203', '11'), +('6', '72', '13', '83508', '52498', '11'), +('6', '72', '14', '69155', '68832', '11'), +('6', '72', '14', '83460', '60967', '11'), +('6', '72', '14', '39211', '57770', '11'), +('6', '72', '14', '83508', '52498', '11'), +('6', '72', '11', '39287', '102343', '11'), +('6', '72', '11', '68952', '53999', '11'), +('6', '72', '11', '71659', '53664', '11'), +('6', '72', '11', '39371', '50104', '11'), +('6', '73', '22', '21805', '0', '11'), +('6', '73', '22', '61948', '0', '11'), +('6', '73', '22', '21807', '0', '11'), +('6', '73', '22', '12425', '0', '11'), +('6', '73', '1', '39329', '99070', '11'), +('6', '73', '1', '71668', '56407', '11'), +('6', '73', '1', '83662', '51494', '11'), +('6', '73', '1', '83630', '47907', '11'), +('6', '73', '2', '83562', '40003', '11'), +('6', '73', '2', '70888', '38292', '11'), +('6', '73', '2', '83542', '34796', '11'), +('6', '73', '2', '47210', '32802', '11'), +('6', '73', '3', '69068', '63676', '11'), +('6', '73', '3', '83658', '61989', '11'), +('6', '73', '3', '70620', '57556', '11'), +('6', '73', '3', '39368', '50823', '11'), +('6', '73', '5', '69097', '64225', '11'), +('6', '73', '5', '68950', '63900', '11'), +('6', '73', '5', '47276', '55841', '11'), +('6', '73', '5', '39366', '50376', '11'), +('6', '73', '8', '39293', '99226', '11'), +('6', '73', '8', '83532', '67674', '11'), +('6', '73', '8', '69064', '65074', '11'), +('6', '73', '8', '83659', '63515', '11'), +('6', '73', '6', '71666', '82608', '11'), +('6', '73', '6', '39263', '58842', '11'), +('6', '73', '6', '83660', '57066', '11'), +('6', '73', '6', '39269', '55227', '11'), +('6', '73', '17', '83605', '64735', '11'), +('6', '73', '17', '70893', '64418', '11'), +('6', '73', '17', '69152', '48028', '11'), +('6', '73', '17', '71097', '39659', '11'), +('6', '73', '7', '39357', '63906', '11'), +('6', '73', '7', '83566', '40954', '11'), +('6', '73', '7', '68901', '38756', '11'), +('6', '73', '7', '70889', '37661', '11'), +('6', '73', '9', '51708', '100978', '11'), +('6', '73', '9', '83654', '43855', '11'), +('6', '73', '9', '39346', '43658', '11'), +('6', '73', '9', '39297', '41468', '11'), +('6', '73', '15', '83629', '98400', '11'), +('6', '73', '15', '69160', '66712', '11'), +('6', '73', '15', '47238', '64068', '11'), +('6', '73', '15', '39277', '58690', '11'), +('6', '73', '20', '47284', '63028', '11'), +('6', '73', '20', '47282', '54498', '11'), +('6', '73', '20', '83600', '47850', '11'), +('6', '73', '20', '39350', '46328', '11'), +('6', '73', '12', '83570', '41853', '11'), +('6', '73', '12', '68902', '40320', '11'), +('6', '73', '12', '83496', '38803', '11'), +('6', '73', '12', '84145', '38369', '11'), +('6', '73', '18', '83609', '102033', '11'), +('6', '73', '18', '70894', '40632', '11'), +('6', '73', '18', '69148', '37776', '11'), +('6', '73', '18', '71648', '35911', '11'), +('6', '73', '19', '70892', '75887', '11'), +('6', '73', '19', '83574', '53553', '11'), +('6', '73', '19', '47218', '49054', '11'), +('6', '73', '19', '39279', '41309', '11'), +('6', '73', '13', '83460', '59222', '11'), +('6', '73', '13', '39211', '56775', '11'), +('6', '73', '13', '83631', '54509', '11'), +('6', '73', '13', '83508', '51502', '11'), +('6', '73', '14', '69155', '66832', '11'), +('6', '73', '14', '83460', '59222', '11'), +('6', '73', '14', '39211', '56775', '11'), +('6', '73', '14', '83508', '51502', '11'), +('6', '73', '11', '39287', '99349', '11'), +('6', '73', '11', '71659', '52668', '11'), +('6', '73', '11', '68952', '52503', '11'), +('6', '73', '11', '39371', '50108', '11'), +('6', '74', '22', '21805', '0', '11'), +('6', '74', '22', '61948', '0', '11'), +('6', '74', '22', '21807', '0', '11'), +('6', '74', '22', '12425', '0', '11'), +('6', '74', '1', '39329', '96075', '11'), +('6', '74', '1', '71668', '55412', '11'), +('6', '74', '1', '83662', '51151', '11'), +('6', '74', '1', '83630', '47561', '11'), +('6', '74', '2', '83562', '40010', '11'), +('6', '74', '2', '70888', '38298', '11'), +('6', '74', '2', '83542', '34800', '11'), +('6', '74', '2', '47210', '32806', '11'), +('6', '74', '3', '69068', '61431', '11'), +('6', '74', '3', '83658', '60994', '11'), +('6', '74', '3', '70620', '55810', '11'), +('6', '74', '3', '39368', '50831', '11'), +('6', '74', '5', '69097', '61980', '11'), +('6', '74', '5', '68950', '61654', '11'), +('6', '74', '5', '47276', '54846', '11'), +('6', '74', '5', '39366', '50383', '11'), +('6', '74', '8', '39293', '96231', '11'), +('6', '74', '8', '83532', '65679', '11'), +('6', '74', '8', '69064', '63079', '11'), +('6', '74', '8', '83659', '62515', '11'), +('6', '74', '6', '71666', '80113', '11'), +('6', '74', '6', '39263', '57846', '11'), +('6', '74', '6', '83660', '56366', '11'), +('6', '74', '6', '39269', '54532', '11'), +('6', '74', '17', '83605', '63741', '11'), +('6', '74', '17', '70893', '63168', '11'), +('6', '74', '17', '69152', '47134', '11'), +('6', '74', '17', '71097', '38913', '11'), +('6', '74', '7', '39357', '62910', '11'), +('6', '74', '7', '83566', '40960', '11'), +('6', '74', '7', '68901', '37860', '11'), +('6', '74', '7', '70889', '37665', '11'), +('6', '74', '9', '51708', '97983', '11'), +('6', '74', '9', '83654', '43859', '11'), +('6', '74', '9', '39346', '43663', '11'), +('6', '74', '9', '39297', '41473', '11'), +('6', '74', '15', '83629', '95406', '11'), +('6', '74', '15', '69160', '64712', '11'), +('6', '74', '15', '47238', '62323', '11'), +('6', '74', '15', '39277', '57694', '11'), +('6', '74', '20', '47284', '61531', '11'), +('6', '74', '20', '47282', '53502', '11'), +('6', '74', '20', '83600', '47506', '11'), +('6', '74', '20', '39350', '46333', '11'), +('6', '74', '12', '83570', '41859', '11'), +('6', '74', '12', '68902', '39074', '11'), +('6', '74', '12', '83496', '38507', '11'), +('6', '74', '12', '70891', '37659', '11'), +('6', '74', '18', '83609', '99038', '11'), +('6', '74', '18', '70894', '40637', '11'), +('6', '74', '18', '69148', '37531', '11'), +('6', '74', '18', '71648', '35665', '11'), +('6', '74', '19', '70892', '73645', '11'), +('6', '74', '19', '83574', '52859', '11'), +('6', '74', '19', '47218', '48158', '11'), +('6', '74', '19', '39279', '41312', '11'), +('6', '74', '13', '83460', '57478', '11'), +('6', '74', '13', '39211', '55780', '11'), +('6', '74', '13', '83631', '53815', '11'), +('6', '74', '13', '83508', '50506', '11'), +('6', '74', '14', '69155', '64832', '11'), +('6', '74', '14', '83460', '57478', '11'), +('6', '74', '14', '39211', '55780', '11'), +('6', '74', '14', '83508', '50506', '11'), +('6', '74', '11', '39287', '96354', '11'), +('6', '74', '11', '71659', '51673', '11'), +('6', '74', '11', '68952', '51007', '11'), +('6', '74', '11', '39371', '50113', '11'), +('6', '75', '22', '21807', '0', '13'), +('6', '75', '22', '21805', '0', '13'), +('6', '75', '22', '12425', '0', '13'), +('6', '75', '22', '39342', '0', '13'), +('6', '75', '1', '39329', '93080', '13'), +('6', '75', '1', '80676', '69837', '13'), +('6', '75', '1', '80660', '66709', '13'), +('6', '75', '1', '80639', '63588', '13'), +('6', '75', '2', '53396', '54787', '13'), +('6', '75', '2', '83562', '40016', '13'), +('6', '75', '2', '70888', '38304', '13'), +('6', '75', '2', '83542', '34804', '13'), +('6', '75', '3', '80647', '63889', '13'), +('6', '75', '3', '83658', '59998', '13'), +('6', '75', '3', '69068', '59186', '13'), +('6', '75', '3', '46874', '56442', '13'), +('6', '75', '5', '80661', '67709', '13'), +('6', '75', '5', '46934', '60596', '13'), +('6', '75', '5', '80626', '60468', '13'), +('6', '75', '5', '69097', '59735', '13'), +('6', '75', '8', '39293', '93235', '13'), +('6', '75', '8', '80689', '70001', '13'), +('6', '75', '8', '83532', '63684', '13'), +('6', '75', '8', '80649', '63639', '13'), +('6', '75', '6', '71666', '77619', '13'), +('6', '75', '6', '80645', '63938', '13'), +('6', '75', '6', '46883', '60595', '13'), +('6', '75', '6', '46933', '60241', '13'), +('6', '75', '17', '83605', '62746', '13'), +('6', '75', '17', '70893', '61918', '13'), +('6', '75', '17', '53401', '56995', '13'), +('6', '75', '17', '69152', '46239', '13'), +('6', '75', '7', '39357', '61914', '13'), +('6', '75', '7', '53397', '54613', '13'), +('6', '75', '7', '83566', '40966', '13'), +('6', '75', '7', '70889', '37669', '13'), +('6', '75', '9', '51708', '94988', '13'), +('6', '75', '9', '46888', '60243', '13'), +('6', '75', '9', '53398', '54111', '13'), +('6', '75', '9', '83654', '43863', '13'), +('6', '75', '15', '83629', '92412', '13'), +('6', '75', '15', '79909', '73465', '13'), +('6', '75', '15', '80686', '69750', '13'), +('6', '75', '15', '79908', '67034', '13'), +('6', '75', '20', '80690', '70001', '13'), +('6', '75', '20', '46886', '61168', '13'), +('6', '75', '20', '47284', '60034', '13'), +('6', '75', '20', '80620', '59968', '13'), +('6', '75', '12', '53399', '54418', '13'), +('6', '75', '12', '83570', '41865', '13'), +('6', '75', '12', '83496', '38211', '13'), +('6', '75', '12', '68902', '37828', '13'), +('6', '75', '18', '83609', '96043', '13'), +('6', '75', '18', '53402', '56181', '13'), +('6', '75', '18', '70894', '40642', '13'), +('6', '75', '18', '69148', '37286', '13'), +('6', '75', '19', '70892', '71403', '13'), +('6', '75', '19', '53400', '54716', '13'), +('6', '75', '19', '83574', '52165', '13'), +('6', '75', '19', '47218', '47262', '13'), +('6', '75', '13', '80624', '59242', '13'), +('6', '75', '13', '83460', '55733', '13'), +('6', '75', '13', '39211', '54785', '13'), +('6', '75', '13', '83631', '53122', '13'), +('6', '75', '14', '80665', '64833', '13'), +('6', '75', '14', '69155', '62832', '13'), +('6', '75', '14', '80625', '59530', '13'), +('6', '75', '14', '46925', '56307', '13'), +('6', '75', '11', '39287', '93360', '13'), +('6', '75', '11', '80668', '69850', '13'), +('6', '75', '11', '46939', '61492', '13'), +('6', '75', '11', '80619', '60868', '13'), +('6', '75', '22', '21807', '0', '12'), +('6', '75', '22', '21805', '0', '12'), +('6', '75', '22', '12425', '0', '12'), +('6', '75', '22', '39342', '0', '12'), +('6', '75', '1', '39329', '93080', '12'), +('6', '75', '1', '46882', '61236', '12'), +('6', '75', '1', '46865', '56917', '12'), +('6', '75', '1', '46914', '56392', '12'), +('6', '75', '2', '53396', '54787', '12'), +('6', '75', '2', '83562', '40016', '12'), +('6', '75', '2', '70888', '38304', '12'), +('6', '75', '2', '83542', '34804', '12'), +('6', '75', '3', '83658', '59998', '12'), +('6', '75', '3', '69068', '59186', '12'), +('6', '75', '3', '46874', '56442', '12'), +('6', '75', '3', '46923', '56018', '12'), +('6', '75', '5', '46934', '60596', '12'), +('6', '75', '5', '69097', '59735', '12'), +('6', '75', '5', '68950', '59408', '12'), +('6', '75', '5', '46868', '56793', '12'), +('6', '75', '8', '39293', '93235', '12'), +('6', '75', '8', '83532', '63684', '12'), +('6', '75', '8', '83659', '61515', '12'), +('6', '75', '8', '69064', '61084', '12'), +('6', '75', '6', '71666', '77619', '12'), +('6', '75', '6', '46883', '60595', '12'), +('6', '75', '6', '46933', '60241', '12'), +('6', '75', '6', '46884', '59771', '12'), +('6', '75', '17', '83605', '62746', '12'), +('6', '75', '17', '70893', '61918', '12'), +('6', '75', '17', '53401', '56995', '12'), +('6', '75', '17', '69152', '46239', '12'), +('6', '75', '7', '39357', '61914', '12'), +('6', '75', '7', '53397', '54613', '12'), +('6', '75', '7', '83566', '40966', '12'), +('6', '75', '7', '70889', '37669', '12'), +('6', '75', '9', '51708', '94988', '12'), +('6', '75', '9', '46888', '60243', '12'), +('6', '75', '9', '53398', '54111', '12'), +('6', '75', '9', '83654', '43863', '12'), +('6', '75', '15', '83629', '92412', '12'), +('6', '75', '15', '69160', '62712', '12'), +('6', '75', '15', '46932', '61317', '12'), +('6', '75', '15', '47238', '60577', '12'), +('6', '75', '20', '46886', '61168', '12'), +('6', '75', '20', '47284', '60034', '12'), +('6', '75', '20', '46920', '56507', '12'), +('6', '75', '20', '46869', '56345', '12'), +('6', '75', '12', '53399', '54418', '12'), +('6', '75', '12', '83570', '41865', '12'), +('6', '75', '12', '83496', '38211', '12'), +('6', '75', '12', '68902', '37828', '12'), +('6', '75', '18', '83609', '96043', '12'), +('6', '75', '18', '53402', '56181', '12'), +('6', '75', '18', '70894', '40642', '12'), +('6', '75', '18', '69148', '37286', '12'), +('6', '75', '19', '70892', '71403', '12'), +('6', '75', '19', '53400', '54716', '12'), +('6', '75', '19', '83574', '52165', '12'), +('6', '75', '19', '47218', '47262', '12'), +('6', '75', '13', '83460', '55733', '12'), +('6', '75', '13', '39211', '54785', '12'), +('6', '75', '13', '83631', '53122', '12'), +('6', '75', '13', '46991', '49883', '12'), +('6', '75', '14', '69155', '62832', '12'), +('6', '75', '14', '46925', '56307', '12'), +('6', '75', '14', '83460', '55733', '12'), +('6', '75', '14', '46875', '55086', '12'), +('6', '75', '11', '39287', '93360', '12'), +('6', '75', '11', '46939', '61492', '12'), +('6', '75', '11', '46889', '59394', '12'), +('6', '75', '11', '46842', '56417', '12'), +('6', '76', '22', '21807', '0', '13'), +('6', '76', '22', '21805', '0', '13'), +('6', '76', '22', '12425', '0', '13'), +('6', '76', '22', '39342', '0', '13'), +('6', '76', '1', '39329', '90085', '13'), +('6', '76', '1', '80676', '69844', '13'), +('6', '76', '1', '80660', '66716', '13'), +('6', '76', '1', '80639', '63594', '13'), +('6', '76', '2', '53396', '54795', '13'), +('6', '76', '2', '83562', '40022', '13'), +('6', '76', '2', '70888', '38310', '13'), +('6', '76', '2', '83542', '34808', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '76', '3', '80647', '63895', '13'), +('6', '76', '3', '83658', '59003', '13'), +('6', '76', '3', '69068', '56941', '13'), +('6', '76', '3', '46874', '56449', '13'), +('6', '76', '5', '80661', '67716', '13'), +('6', '76', '5', '46934', '60603', '13'), +('6', '76', '5', '80626', '60474', '13'), +('6', '76', '5', '69097', '57491', '13'), +('6', '76', '8', '39293', '90239', '13'), +('6', '76', '8', '80689', '70008', '13'), +('6', '76', '8', '80649', '63645', '13'), +('6', '76', '8', '83532', '61689', '13'), +('6', '76', '6', '71666', '75124', '13'), +('6', '76', '6', '80645', '63945', '13'), +('6', '76', '6', '46883', '60602', '13'), +('6', '76', '6', '46933', '60248', '13'), +('6', '76', '17', '83605', '61751', '13'), +('6', '76', '17', '70893', '60668', '13'), +('6', '76', '17', '53401', '57002', '13'), +('6', '76', '17', '69152', '45344', '13'), +('6', '76', '7', '39357', '60918', '13'), +('6', '76', '7', '53397', '54619', '13'), +('6', '76', '7', '83566', '40972', '13'), +('6', '76', '7', '70889', '37673', '13'), +('6', '76', '9', '51708', '91993', '13'), +('6', '76', '9', '46888', '60251', '13'), +('6', '76', '9', '53398', '54118', '13'), +('6', '76', '9', '83654', '43868', '13'), +('6', '76', '15', '83629', '89418', '13'), +('6', '76', '15', '79909', '73471', '13'), +('6', '76', '15', '80686', '69758', '13'), +('6', '76', '15', '79908', '67040', '13'), +('6', '76', '20', '80690', '70008', '13'), +('6', '76', '20', '46886', '61176', '13'), +('6', '76', '20', '80620', '59969', '13'), +('6', '76', '20', '47284', '58537', '13'), +('6', '76', '12', '53399', '54422', '13'), +('6', '76', '12', '83570', '41871', '13'), +('6', '76', '12', '83496', '37915', '13'), +('6', '76', '12', '70891', '37671', '13'), +('6', '76', '18', '83609', '93049', '13'), +('6', '76', '18', '53402', '56188', '13'), +('6', '76', '18', '70894', '40647', '13'), +('6', '76', '18', '69148', '37041', '13'), +('6', '76', '19', '70892', '69161', '13'), +('6', '76', '19', '53400', '54716', '13'), +('6', '76', '19', '83574', '51471', '13'), +('6', '76', '19', '47218', '46366', '13'), +('6', '76', '13', '80624', '59248', '13'), +('6', '76', '13', '83460', '53988', '13'), +('6', '76', '13', '39211', '53790', '13'), +('6', '76', '13', '83631', '52428', '13'), +('6', '76', '14', '80665', '64839', '13'), +('6', '76', '14', '69155', '60832', '13'), +('6', '76', '14', '80625', '59536', '13'), +('6', '76', '14', '46925', '56313', '13'), +('6', '76', '11', '39287', '90365', '13'), +('6', '76', '11', '80668', '69857', '13'), +('6', '76', '11', '46939', '61499', '13'), +('6', '76', '11', '80619', '60874', '13'), +('6', '77', '22', '21807', '0', '13'), +('6', '77', '22', '21805', '0', '13'), +('6', '77', '22', '12425', '0', '13'), +('6', '77', '22', '39342', '0', '13'), +('6', '77', '1', '39329', '87090', '13'), +('6', '77', '1', '80676', '69851', '13'), +('6', '77', '1', '80660', '66723', '13'), +('6', '77', '1', '80639', '63601', '13'), +('6', '77', '2', '53396', '54802', '13'), +('6', '77', '2', '83562', '40028', '13'), +('6', '77', '2', '70888', '38316', '13'), +('6', '77', '2', '83542', '34812', '13'), +('6', '77', '3', '80647', '63902', '13'), +('6', '77', '3', '83658', '58007', '13'), +('6', '77', '3', '46874', '56456', '13'), +('6', '77', '3', '46923', '56030', '13'), +('6', '77', '5', '80661', '67722', '13'), +('6', '77', '5', '46934', '60610', '13'), +('6', '77', '5', '80626', '60480', '13'), +('6', '77', '5', '46868', '56807', '13'), +('6', '77', '8', '39293', '87244', '13'), +('6', '77', '8', '80689', '70015', '13'), +('6', '77', '8', '80649', '63652', '13'), +('6', '77', '8', '46936', '60851', '13'), +('6', '77', '6', '71666', '72630', '13'), +('6', '77', '6', '80645', '63951', '13'), +('6', '77', '6', '46883', '60609', '13'), +('6', '77', '6', '46933', '60255', '13'), +('6', '77', '17', '83605', '60756', '13'), +('6', '77', '17', '70893', '59418', '13'), +('6', '77', '17', '53401', '57009', '13'), +('6', '77', '17', '46817', '45276', '13'), +('6', '77', '7', '39357', '59922', '13'), +('6', '77', '7', '53397', '54625', '13'), +('6', '77', '7', '83566', '40978', '13'), +('6', '77', '7', '70889', '37678', '13'), +('6', '77', '9', '51708', '88999', '13'), +('6', '77', '9', '46888', '60258', '13'), +('6', '77', '9', '53398', '54124', '13'), +('6', '77', '9', '83654', '43872', '13'), +('6', '77', '15', '83629', '86424', '13'), +('6', '77', '15', '79909', '73477', '13'), +('6', '77', '15', '80686', '69765', '13'), +('6', '77', '15', '79908', '67046', '13'), +('6', '77', '20', '80690', '70015', '13'), +('6', '77', '20', '46886', '61184', '13'), +('6', '77', '20', '80620', '59969', '13'), +('6', '77', '20', '47284', '57040', '13'), +('6', '77', '12', '53399', '54427', '13'), +('6', '77', '12', '83570', '41877', '13'), +('6', '77', '12', '70891', '37677', '13'), +('6', '77', '12', '83496', '37619', '13'), +('6', '77', '18', '83609', '90054', '13'), +('6', '77', '18', '53402', '56195', '13'), +('6', '77', '18', '70894', '40652', '13'), +('6', '77', '18', '69148', '36796', '13'), +('6', '77', '19', '70892', '66919', '13'), +('6', '77', '19', '53400', '54716', '13'), +('6', '77', '19', '83574', '50777', '13'), +('6', '77', '19', '47218', '45470', '13'), +('6', '77', '13', '80624', '59253', '13'), +('6', '77', '13', '39211', '52795', '13'), +('6', '77', '13', '83460', '52243', '13'), +('6', '77', '13', '83631', '51734', '13'), +('6', '77', '14', '80665', '64844', '13'), +('6', '77', '14', '80625', '59541', '13'), +('6', '77', '14', '69155', '58833', '13'), +('6', '77', '14', '46925', '56319', '13'), +('6', '77', '11', '39287', '87370', '13'), +('6', '77', '11', '80668', '69865', '13'), +('6', '77', '11', '46939', '61506', '13'), +('6', '77', '11', '80619', '60880', '13'), +('6', '78', '22', '21807', '0', '13'), +('6', '78', '22', '21805', '0', '13'), +('6', '78', '22', '12425', '0', '13'), +('6', '78', '22', '39342', '0', '13'), +('6', '78', '1', '39329', '84095', '13'), +('6', '78', '1', '80676', '69858', '13'), +('6', '78', '1', '80660', '66730', '13'), +('6', '78', '1', '80639', '63607', '13'), +('6', '78', '2', '53396', '54809', '13'), +('6', '78', '2', '83562', '40034', '13'), +('6', '78', '2', '70888', '38322', '13'), +('6', '78', '2', '83542', '34816', '13'), +('6', '78', '3', '80647', '63908', '13'), +('6', '78', '3', '83658', '57012', '13'), +('6', '78', '3', '46874', '56463', '13'), +('6', '78', '3', '46923', '56037', '13'), +('6', '78', '5', '80661', '67729', '13'), +('6', '78', '5', '46934', '60617', '13'), +('6', '78', '5', '80626', '60486', '13'), +('6', '78', '5', '46868', '56815', '13'), +('6', '78', '8', '39293', '84248', '13'), +('6', '78', '8', '80689', '70023', '13'), +('6', '78', '8', '80649', '63658', '13'), +('6', '78', '8', '46936', '60859', '13'), +('6', '78', '6', '71666', '70135', '13'), +('6', '78', '6', '80645', '63958', '13'), +('6', '78', '6', '46883', '60617', '13'), +('6', '78', '6', '46933', '60262', '13'), +('6', '78', '17', '83605', '59761', '13'), +('6', '78', '17', '70893', '58169', '13'), +('6', '78', '17', '53401', '57016', '13'), +('6', '78', '17', '46817', '45280', '13'), +('6', '78', '7', '39357', '58927', '13'), +('6', '78', '7', '53397', '54631', '13'), +('6', '78', '7', '83566', '40984', '13'), +('6', '78', '7', '70889', '37682', '13'), +('6', '78', '9', '51708', '86004', '13'), +('6', '78', '9', '46888', '60265', '13'), +('6', '78', '9', '53398', '54130', '13'), +('6', '78', '9', '83654', '43876', '13'), +('6', '78', '15', '83629', '83430', '13'), +('6', '78', '15', '79909', '73483', '13'), +('6', '78', '15', '80686', '69773', '13'), +('6', '78', '15', '79908', '67051', '13'), +('6', '78', '20', '80690', '70023', '13'), +('6', '78', '20', '46886', '61192', '13'), +('6', '78', '20', '80620', '59969', '13'), +('6', '78', '20', '46920', '56525', '13'), +('6', '78', '12', '53399', '54431', '13'), +('6', '78', '12', '83570', '41883', '13'), +('6', '78', '12', '70891', '37684', '13'), +('6', '78', '12', '83496', '37323', '13'), +('6', '78', '18', '83609', '87059', '13'), +('6', '78', '18', '53402', '56202', '13'), +('6', '78', '18', '70894', '40658', '13'), +('6', '78', '18', '69148', '36551', '13'), +('6', '78', '19', '70892', '64677', '13'), +('6', '78', '19', '53400', '54717', '13'), +('6', '78', '19', '83574', '50083', '13'), +('6', '78', '19', '47218', '44574', '13'), +('6', '78', '13', '80624', '59258', '13'), +('6', '78', '13', '39211', '51800', '13'), +('6', '78', '13', '83631', '51040', '13'), +('6', '78', '13', '83460', '50498', '13'), +('6', '78', '14', '80665', '64849', '13'), +('6', '78', '14', '80625', '59546', '13'), +('6', '78', '14', '69155', '56833', '13'), +('6', '78', '14', '46925', '56326', '13'), +('6', '78', '11', '39287', '84376', '13'), +('6', '78', '11', '80668', '69872', '13'), +('6', '78', '11', '46939', '61514', '13'), +('6', '78', '11', '80619', '60886', '13'), +('6', '79', '22', '21807', '0', '13'), +('6', '79', '22', '21805', '0', '13'), +('6', '79', '22', '12425', '0', '13'), +('6', '79', '22', '39342', '0', '13'), +('6', '79', '1', '39329', '81100', '13'), +('6', '79', '1', '80676', '69866', '13'), +('6', '79', '1', '80660', '66737', '13'), +('6', '79', '1', '80639', '63614', '13'), +('6', '79', '2', '53396', '54816', '13'), +('6', '79', '2', '83562', '40040', '13'), +('6', '79', '2', '70888', '38328', '13'), +('6', '79', '2', '83542', '34820', '13'), +('6', '79', '3', '80647', '63915', '13'), +('6', '79', '3', '46874', '56470', '13'), +('6', '79', '3', '46923', '56043', '13'), +('6', '79', '3', '83658', '56016', '13'), +('6', '79', '5', '80661', '67736', '13'), +('6', '79', '5', '46934', '60624', '13'), +('6', '79', '5', '80626', '60492', '13'), +('6', '79', '5', '46868', '56822', '13'), +('6', '79', '8', '39293', '81253', '13'), +('6', '79', '8', '80689', '70030', '13'), +('6', '79', '8', '80649', '63665', '13'), +('6', '79', '8', '46936', '60867', '13'), +('6', '79', '6', '71666', '67641', '13'), +('6', '79', '6', '80645', '63965', '13'), +('6', '79', '6', '46883', '60624', '13'), +('6', '79', '6', '46933', '60269', '13'), +('6', '79', '17', '83605', '58766', '13'), +('6', '79', '17', '53401', '57023', '13'), +('6', '79', '17', '70893', '56919', '13'), +('6', '79', '17', '46817', '45284', '13'), +('6', '79', '7', '39357', '57931', '13'), +('6', '79', '7', '53397', '54637', '13'), +('6', '79', '7', '83566', '40991', '13'), +('6', '79', '7', '70889', '37686', '13'), +('6', '79', '9', '51708', '83009', '13'), +('6', '79', '9', '46888', '60272', '13'), +('6', '79', '9', '53398', '54136', '13'), +('6', '79', '9', '83654', '43880', '13'), +('6', '79', '15', '83629', '80436', '13'), +('6', '79', '15', '79909', '73490', '13'), +('6', '79', '15', '80686', '69780', '13'), +('6', '79', '15', '79908', '67057', '13'), +('6', '79', '20', '80690', '70030', '13'), +('6', '79', '20', '46886', '61201', '13'), +('6', '79', '20', '80620', '59969', '13'), +('6', '79', '20', '46920', '56531', '13'), +('6', '79', '12', '53399', '54435', '13'), +('6', '79', '12', '83570', '41890', '13'), +('6', '79', '12', '70891', '37690', '13'), +('6', '79', '12', '83496', '37027', '13'), +('6', '79', '18', '83609', '84064', '13'), +('6', '79', '18', '53402', '56209', '13'), +('6', '79', '18', '70894', '40663', '13'), +('6', '79', '18', '69148', '36306', '13'), +('6', '79', '19', '70892', '62435', '13'), +('6', '79', '19', '53400', '54717', '13'), +('6', '79', '19', '83574', '49389', '13'), +('6', '79', '19', '47218', '43678', '13'), +('6', '79', '13', '80624', '59263', '13'), +('6', '79', '13', '39211', '50805', '13'), +('6', '79', '13', '83631', '50347', '13'), +('6', '79', '13', '46991', '49910', '13'), +('6', '79', '14', '80665', '64854', '13'), +('6', '79', '14', '80625', '59551', '13'), +('6', '79', '14', '46925', '56332', '13'), +('6', '79', '14', '46875', '55104', '13'), +('6', '79', '11', '39287', '81381', '13'), +('6', '79', '11', '80668', '69879', '13'), +('6', '79', '11', '46939', '61521', '13'), +('6', '79', '11', '80619', '60893', '13'), +('6', '80', '22', '21807', '0', '14'), +('6', '80', '22', '21805', '0', '14'), +('6', '80', '22', '12425', '0', '14'), +('6', '80', '22', '39342', '0', '14'), +('6', '80', '1', '102611', '91338', '14'), +('6', '80', '1', '102640', '90651', '14'), +('6', '80', '1', '102639', '90576', '14'), +('6', '80', '1', '102641', '90496', '14'), +('6', '80', '2', '102017', '61092', '14'), +('6', '80', '2', '102269', '55056', '14'), +('6', '80', '2', '53396', '54823', '14'), +('6', '80', '2', '83562', '40046', '14'), +('6', '80', '3', '102612', '97077', '14'), +('6', '80', '3', '102626', '95174', '14'), +('6', '80', '3', '102742', '87957', '14'), +('6', '80', '3', '102560', '84724', '14'), +('6', '80', '5', '102731', '101451', '14'), +('6', '80', '5', '102613', '95206', '14'), +('6', '80', '5', '102627', '93481', '14'), +('6', '80', '5', '102730', '87888', '14'), +('6', '80', '8', '102728', '99782', '14'), +('6', '80', '8', '102615', '97032', '14'), +('6', '80', '8', '102629', '95570', '14'), +('6', '80', '8', '102569', '84816', '14'), +('6', '80', '6', '102614', '97795', '14'), +('6', '80', '6', '102628', '95731', '14'), +('6', '80', '6', '102561', '84912', '14'), +('6', '80', '6', '71666', '65147', '14'), +('6', '80', '17', '102020', '65167', '14'), +('6', '80', '17', '102272', '58480', '14'), +('6', '80', '17', '83605', '57772', '14'), +('6', '80', '17', '53401', '57030', '14'), +('6', '80', '7', '102018', '61856', '14'), +('6', '80', '7', '39357', '56935', '14'), +('6', '80', '7', '102270', '55717', '14'), +('6', '80', '7', '53397', '54643', '14'), +('6', '80', '9', '67098', '159947', '14'), +('6', '80', '9', '51708', '80014', '14'), +('6', '80', '9', '46888', '60279', '14'), +('6', '80', '9', '53398', '54142', '14'), +('6', '80', '15', '102723', '100581', '14'), +('6', '80', '15', '102616', '92907', '14'), +('6', '80', '15', '102636', '91860', '14'), +('6', '80', '15', '102635', '91664', '14'), +('6', '80', '20', '102617', '97391', '14'), +('6', '80', '20', '102631', '95913', '14'), +('6', '80', '20', '102563', '84526', '14'), +('6', '80', '20', '80690', '70038', '14'), +('6', '80', '12', '53399', '54439', '14'), +('6', '80', '12', '102267', '52682', '14'), +('6', '80', '12', '83570', '41896', '14'), +('6', '80', '12', '70891', '37696', '14'), +('6', '80', '18', '83609', '81069', '14'), +('6', '80', '18', '102019', '62853', '14'), +('6', '80', '18', '102271', '56719', '14'), +('6', '80', '18', '53402', '56216', '14'), +('6', '80', '19', '70892', '60193', '14'), +('6', '80', '19', '53400', '54717', '14'), +('6', '80', '19', '102268', '53666', '14'), +('6', '80', '19', '76131', '51295', '14'), +('6', '80', '13', '93856', '97138', '14'), +('6', '80', '13', '102735', '87782', '14'), +('6', '80', '13', '102734', '80948', '14'), +('6', '80', '13', '102582', '77531', '14'), +('6', '80', '14', '102633', '96197', '14'), +('6', '80', '14', '102632', '96180', '14'), +('6', '80', '14', '102570', '83406', '14'), +('6', '80', '14', '80665', '64859', '14'), +('6', '80', '11', '102643', '92601', '14'), +('6', '80', '11', '39287', '78387', '14'), +('6', '80', '11', '80668', '69887', '14'), +('6', '80', '11', '46939', '61528', '14'), +('6', '81', '22', '21807', '0', '14'), +('6', '81', '22', '21805', '0', '14'), +('6', '81', '22', '12425', '0', '14'), +('6', '81', '22', '39342', '0', '14'), +('6', '81', '1', '102611', '91345', '14'), +('6', '81', '1', '102640', '90657', '14'), +('6', '81', '1', '102639', '90581', '14'), +('6', '81', '1', '102641', '90502', '14'), +('6', '81', '2', '102017', '61096', '14'), +('6', '81', '2', '102269', '55059', '14'), +('6', '81', '2', '53396', '54830', '14'), +('6', '81', '2', '83562', '40053', '14'), +('6', '81', '3', '102612', '97083', '14'), +('6', '81', '3', '102626', '95179', '14'), +('6', '81', '3', '102742', '87966', '14'), +('6', '81', '3', '102560', '84730', '14'), +('6', '81', '5', '102731', '101460', '14'), +('6', '81', '5', '102613', '95211', '14'), +('6', '81', '5', '102627', '93486', '14'), +('6', '81', '5', '102730', '87895', '14'), +('6', '81', '8', '102728', '99789', '14'), +('6', '81', '8', '102615', '97040', '14'), +('6', '81', '8', '102629', '95575', '14'), +('6', '81', '8', '102569', '84825', '14'), +('6', '81', '6', '102614', '97803', '14'), +('6', '81', '6', '102628', '95738', '14'), +('6', '81', '6', '102561', '84921', '14'), +('6', '81', '6', '80645', '63978', '14'), +('6', '81', '17', '102020', '65173', '14'), +('6', '81', '17', '102272', '58488', '14'), +('6', '81', '17', '53401', '57038', '14'), +('6', '81', '17', '83605', '56777', '14'), +('6', '81', '7', '102018', '61862', '14'), +('6', '81', '7', '39357', '55939', '14'), +('6', '81', '7', '102270', '55723', '14'), +('6', '81', '7', '53397', '54649', '14'), +('6', '81', '9', '67098', '161951', '14'), +('6', '81', '9', '51708', '77019', '14'), +('6', '81', '9', '46888', '60287', '14'), +('6', '81', '9', '53398', '54148', '14'), +('6', '81', '15', '102723', '100588', '14'), +('6', '81', '15', '102616', '92916', '14'), +('6', '81', '15', '102636', '91868', '14'), +('6', '81', '15', '102635', '91669', '14'), +('6', '81', '20', '102617', '97393', '14'), +('6', '81', '20', '102631', '95922', '14'), +('6', '81', '20', '102563', '84532', '14'), +('6', '81', '20', '80690', '70045', '14'), +('6', '81', '12', '53399', '54443', '14'), +('6', '81', '12', '102267', '52687', '14'), +('6', '81', '12', '83570', '41902', '14'), +('6', '81', '12', '70891', '37702', '14'), +('6', '81', '18', '83609', '78074', '14'), +('6', '81', '18', '102019', '62861', '14'), +('6', '81', '18', '102271', '56725', '14'), +('6', '81', '18', '53402', '56223', '14'), +('6', '81', '19', '70892', '57951', '14'), +('6', '81', '19', '53400', '54717', '14'), +('6', '81', '19', '102268', '53671', '14'), +('6', '81', '19', '76131', '51298', '14'), +('6', '81', '13', '93856', '98358', '14'), +('6', '81', '13', '102735', '87789', '14'), +('6', '81', '13', '102734', '80955', '14'), +('6', '81', '13', '102582', '77539', '14'), +('6', '81', '14', '102633', '96203', '14'), +('6', '81', '14', '102632', '96188', '14'), +('6', '81', '14', '102570', '83408', '14'), +('6', '81', '14', '80665', '64864', '14'), +('6', '81', '11', '102643', '92605', '14'), +('6', '81', '11', '39287', '75392', '14'), +('6', '81', '11', '80668', '69894', '14'), +('6', '81', '11', '46939', '61535', '14'), +('6', '82', '22', '21807', '0', '14'), +('6', '82', '22', '21805', '0', '14'), +('6', '82', '22', '12425', '0', '14'), +('6', '82', '22', '39342', '0', '14'), +('6', '82', '1', '102611', '91352', '14'), +('6', '82', '1', '102640', '90662', '14'), +('6', '82', '1', '102639', '90585', '14'), +('6', '82', '1', '102641', '90508', '14'), +('6', '82', '2', '102017', '61100', '14'), +('6', '82', '2', '102269', '55063', '14'), +('6', '82', '2', '53396', '54837', '14'), +('6', '82', '2', '83562', '40059', '14'), +('6', '82', '3', '102612', '97089', '14'), +('6', '82', '3', '102626', '95185', '14'), +('6', '82', '3', '102742', '87974', '14'), +('6', '82', '3', '102560', '84737', '14'), +('6', '82', '5', '102731', '101469', '14'), +('6', '82', '5', '102613', '95215', '14'), +('6', '82', '5', '102627', '93491', '14'), +('6', '82', '5', '102730', '87902', '14'), +('6', '82', '8', '102728', '99796', '14'), +('6', '82', '8', '102615', '97047', '14'), +('6', '82', '8', '102629', '95579', '14'), +('6', '82', '8', '102569', '84835', '14'), +('6', '82', '6', '102614', '97810', '14'), +('6', '82', '6', '102628', '95745', '14'), +('6', '82', '6', '102561', '84930', '14'), +('6', '82', '6', '80645', '63984', '14'), +('6', '82', '17', '102020', '65178', '14'), +('6', '82', '17', '102272', '58496', '14'), +('6', '82', '17', '53401', '57045', '14'), +('6', '82', '17', '83605', '55782', '14'), +('6', '82', '7', '102018', '61868', '14'), +('6', '82', '7', '102270', '55728', '14'), +('6', '82', '7', '39357', '54943', '14'), +('6', '82', '7', '53397', '54656', '14'), +('6', '82', '9', '67098', '163955', '14'), +('6', '82', '9', '51708', '74024', '14'), +('6', '82', '9', '46888', '60294', '14'), +('6', '82', '9', '53398', '54154', '14'), +('6', '82', '15', '102723', '100595', '14'), +('6', '82', '15', '102616', '92924', '14'), +('6', '82', '15', '102636', '91876', '14'), +('6', '82', '15', '102635', '91675', '14'), +('6', '82', '20', '102617', '97396', '14'), +('6', '82', '20', '102631', '95931', '14'), +('6', '82', '20', '102563', '84538', '14'), +('6', '82', '20', '80690', '70052', '14'), +('6', '82', '12', '53399', '54447', '14'), +('6', '82', '12', '102267', '52692', '14'), +('6', '82', '12', '83570', '41908', '14'), +('6', '82', '12', '70891', '37708', '14'), +('6', '82', '18', '83609', '75080', '14'), +('6', '82', '18', '102019', '62870', '14'), +('6', '82', '18', '102271', '56731', '14'), +('6', '82', '18', '53402', '56230', '14'), +('6', '82', '19', '70892', '55709', '14'), +('6', '82', '19', '53400', '54717', '14'), +('6', '82', '19', '102268', '53676', '14'), +('6', '82', '19', '76131', '51301', '14'), +('6', '82', '13', '93856', '99578', '14'), +('6', '82', '13', '102735', '87796', '14'), +('6', '82', '13', '102734', '80961', '14'), +('6', '82', '13', '102582', '77548', '14'), +('6', '82', '14', '102633', '96209', '14'), +('6', '82', '14', '102632', '96196', '14'), +('6', '82', '14', '102570', '83410', '14'), +('6', '82', '14', '80665', '64869', '14'), +('6', '82', '11', '102643', '92609', '14'), +('6', '82', '11', '39287', '72397', '14'), +('6', '82', '11', '80668', '69901', '14'), +('6', '82', '11', '46939', '61542', '14'), +('6', '83', '22', '21807', '0', '14'), +('6', '83', '22', '21805', '0', '14'), +('6', '83', '22', '12425', '0', '14'), +('6', '83', '22', '39342', '0', '14'), +('6', '83', '1', '102611', '91358', '14'), +('6', '83', '1', '102640', '90668', '14'), +('6', '83', '1', '102639', '90590', '14'), +('6', '83', '1', '102641', '90515', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '83', '2', '102017', '61104', '14'), +('6', '83', '2', '102269', '55067', '14'), +('6', '83', '2', '53396', '54844', '14'), +('6', '83', '2', '83562', '40065', '14'), +('6', '83', '3', '102612', '97095', '14'), +('6', '83', '3', '102626', '95190', '14'), +('6', '83', '3', '102742', '87982', '14'), +('6', '83', '3', '102560', '84743', '14'), +('6', '83', '5', '102731', '101478', '14'), +('6', '83', '5', '102613', '95219', '14'), +('6', '83', '5', '102627', '93495', '14'), +('6', '83', '5', '102730', '87909', '14'), +('6', '83', '8', '102728', '99803', '14'), +('6', '83', '8', '102615', '97055', '14'), +('6', '83', '8', '102629', '95584', '14'), +('6', '83', '8', '102569', '84844', '14'), +('6', '83', '6', '102614', '97818', '14'), +('6', '83', '6', '102628', '95751', '14'), +('6', '83', '6', '102561', '84940', '14'), +('6', '83', '6', '80645', '63991', '14'), +('6', '83', '17', '102020', '65184', '14'), +('6', '83', '17', '102272', '58503', '14'), +('6', '83', '17', '53401', '57052', '14'), +('6', '83', '17', '83605', '54787', '14'), +('6', '83', '7', '102018', '61874', '14'), +('6', '83', '7', '102270', '55733', '14'), +('6', '83', '7', '53397', '54662', '14'), +('6', '83', '7', '39357', '53947', '14'), +('6', '83', '9', '67098', '165960', '14'), +('6', '83', '9', '51708', '71029', '14'), +('6', '83', '9', '46888', '60301', '14'), +('6', '83', '9', '53398', '54160', '14'), +('6', '83', '15', '102723', '100602', '14'), +('6', '83', '15', '102616', '92933', '14'), +('6', '83', '15', '102636', '91883', '14'), +('6', '83', '15', '102635', '91680', '14'), +('6', '83', '20', '102617', '97398', '14'), +('6', '83', '20', '102631', '95940', '14'), +('6', '83', '20', '102563', '84544', '14'), +('6', '83', '20', '80690', '70060', '14'), +('6', '83', '12', '53399', '54452', '14'), +('6', '83', '12', '102267', '52696', '14'), +('6', '83', '12', '83570', '41914', '14'), +('6', '83', '12', '70891', '37714', '14'), +('6', '83', '18', '83609', '72085', '14'), +('6', '83', '18', '102019', '62879', '14'), +('6', '83', '18', '102271', '56738', '14'), +('6', '83', '18', '53402', '56237', '14'), +('6', '83', '19', '53400', '54717', '14'), +('6', '83', '19', '102268', '53681', '14'), +('6', '83', '19', '70892', '53467', '14'), +('6', '83', '19', '76131', '51304', '14'), +('6', '83', '13', '93856', '100799', '14'), +('6', '83', '13', '102735', '87803', '14'), +('6', '83', '13', '102734', '80967', '14'), +('6', '83', '13', '102582', '77556', '14'), +('6', '83', '14', '102633', '96215', '14'), +('6', '83', '14', '102632', '96203', '14'), +('6', '83', '14', '102570', '83412', '14'), +('6', '83', '14', '80665', '64874', '14'), +('6', '83', '11', '102643', '92612', '14'), +('6', '83', '11', '80668', '69909', '14'), +('6', '83', '11', '39287', '69403', '14'), +('6', '83', '11', '46939', '61549', '14'), +('6', '84', '22', '21807', '0', '14'), +('6', '84', '22', '21805', '0', '14'), +('6', '84', '22', '12425', '0', '14'), +('6', '84', '22', '39342', '0', '14'), +('6', '84', '1', '102611', '91365', '14'), +('6', '84', '1', '102640', '90673', '14'), +('6', '84', '1', '102639', '90595', '14'), +('6', '84', '1', '102641', '90521', '14'), +('6', '84', '2', '102017', '61108', '14'), +('6', '84', '2', '102269', '55071', '14'), +('6', '84', '2', '53396', '54851', '14'), +('6', '84', '2', '83562', '40071', '14'), +('6', '84', '3', '102612', '97100', '14'), +('6', '84', '3', '102626', '95195', '14'), +('6', '84', '3', '102742', '87990', '14'), +('6', '84', '3', '102560', '84750', '14'), +('6', '84', '5', '102731', '101487', '14'), +('6', '84', '5', '102613', '95224', '14'), +('6', '84', '5', '102627', '93500', '14'), +('6', '84', '5', '102730', '87916', '14'), +('6', '84', '8', '102728', '99810', '14'), +('6', '84', '8', '102615', '97063', '14'), +('6', '84', '8', '102629', '95588', '14'), +('6', '84', '8', '102569', '84854', '14'), +('6', '84', '6', '102614', '97825', '14'), +('6', '84', '6', '102628', '95758', '14'), +('6', '84', '6', '102561', '84949', '14'), +('6', '84', '6', '80645', '63997', '14'), +('6', '84', '17', '102020', '65190', '14'), +('6', '84', '17', '102272', '58511', '14'), +('6', '84', '17', '53401', '57059', '14'), +('6', '84', '17', '83605', '53792', '14'), +('6', '84', '7', '102018', '61880', '14'), +('6', '84', '7', '102270', '55738', '14'), +('6', '84', '7', '53397', '54668', '14'), +('6', '84', '7', '39357', '52951', '14'), +('6', '84', '9', '67098', '167964', '14'), +('6', '84', '9', '51708', '68034', '14'), +('6', '84', '9', '46888', '60308', '14'), +('6', '84', '9', '53398', '54166', '14'), +('6', '84', '15', '102723', '100609', '14'), +('6', '84', '15', '102616', '92942', '14'), +('6', '84', '15', '102636', '91891', '14'), +('6', '84', '15', '102635', '91685', '14'), +('6', '84', '20', '102617', '97400', '14'), +('6', '84', '20', '102631', '95949', '14'), +('6', '84', '20', '102563', '84550', '14'), +('6', '84', '20', '80690', '70067', '14'), +('6', '84', '12', '53399', '54456', '14'), +('6', '84', '12', '102267', '52701', '14'), +('6', '84', '12', '83570', '41920', '14'), +('6', '84', '12', '70891', '37721', '14'), +('6', '84', '18', '83609', '69090', '14'), +('6', '84', '18', '102019', '62887', '14'), +('6', '84', '18', '102271', '56744', '14'), +('6', '84', '18', '53402', '56244', '14'), +('6', '84', '19', '53400', '54717', '14'), +('6', '84', '19', '102268', '53686', '14'), +('6', '84', '19', '76131', '51308', '14'), +('6', '84', '19', '70892', '51225', '14'), +('6', '84', '13', '93856', '102019', '14'), +('6', '84', '13', '102735', '87810', '14'), +('6', '84', '13', '102734', '80973', '14'), +('6', '84', '13', '102582', '77564', '14'), +('6', '84', '14', '102633', '96221', '14'), +('6', '84', '14', '102632', '96211', '14'), +('6', '84', '14', '102570', '83414', '14'), +('6', '84', '14', '80665', '64880', '14'), +('6', '84', '11', '102643', '92616', '14'), +('6', '84', '11', '80668', '69916', '14'), +('6', '84', '11', '39287', '66408', '14'), +('6', '84', '11', '46939', '61556', '14'), +('6', '85', '22', '12425', '0', '16'), +('6', '85', '22', '39342', '0', '16'), +('6', '85', '22', '7867', '0', '16'), +('6', '85', '22', '23597', '0', '16'), +('6', '85', '1', '111306', '176672', '16'), +('6', '85', '1', '111304', '176358', '16'), +('6', '85', '1', '111307', '176217', '16'), +('6', '85', '1', '111310', '174919', '16'), +('6', '85', '2', '62988', '110463', '16'), +('6', '85', '2', '62985', '110199', '16'), +('6', '85', '2', '94056', '109897', '16'), +('6', '85', '2', '104417', '93828', '16'), +('6', '85', '3', '111314', '177076', '16'), +('6', '85', '3', '111316', '175364', '16'), +('6', '85', '3', '111315', '174481', '16'), +('6', '85', '3', '111013', '155225', '16'), +('6', '85', '5', '111319', '176439', '16'), +('6', '85', '5', '111321', '175998', '16'), +('6', '85', '5', '111318', '173715', '16'), +('6', '85', '5', '111317', '173430', '16'), +('6', '85', '8', '111332', '177256', '16'), +('6', '85', '8', '111329', '175899', '16'), +('6', '85', '8', '111330', '175102', '16'), +('6', '85', '8', '111331', '172795', '16'), +('6', '85', '6', '111323', '177160', '16'), +('6', '85', '6', '111326', '175721', '16'), +('6', '85', '6', '111325', '175674', '16'), +('6', '85', '6', '111022', '155309', '16'), +('6', '85', '17', '56045', '114529', '16'), +('6', '85', '17', '56084', '114294', '16'), +('6', '85', '17', '104420', '97395', '16'), +('6', '85', '17', '54855', '72798', '16'), +('6', '85', '7', '56080', '109963', '16'), +('6', '85', '7', '56040', '108835', '16'), +('6', '85', '7', '104418', '93231', '16'), +('6', '85', '7', '54849', '70209', '16'), +('6', '85', '9', '67098', '169969', '16'), +('6', '85', '9', '81764', '106488', '16'), +('6', '85', '9', '56070', '106376', '16'), +('6', '85', '9', '62984', '106172', '16'), +('6', '85', '15', '111350', '178547', '16'), +('6', '85', '15', '111344', '177651', '16'), +('6', '85', '15', '111340', '177028', '16'), +('6', '85', '15', '111346', '176572', '16'), +('6', '85', '20', '111356', '177093', '16'), +('6', '85', '20', '111352', '176409', '16'), +('6', '85', '20', '111351', '173687', '16'), +('6', '85', '20', '111054', '155242', '16'), +('6', '85', '12', '56035', '108248', '16'), +('6', '85', '12', '56074', '107047', '16'), +('6', '85', '12', '104415', '91031', '16'), +('6', '85', '12', '49656', '70124', '16'), +('6', '85', '18', '56041', '113901', '16'), +('6', '85', '18', '62986', '112405', '16'), +('6', '85', '18', '104419', '96240', '16'), +('6', '85', '18', '54851', '71699', '16'), +('6', '85', '19', '81763', '110615', '16'), +('6', '85', '19', '62990', '110360', '16'), +('6', '85', '19', '56037', '110300', '16'), +('6', '85', '19', '56075', '110169', '16'), +('6', '85', '13', '111518', '170524', '16'), +('6', '85', '13', '111517', '168797', '16'), +('6', '85', '13', '111217', '154140', '16'), +('6', '85', '13', '111218', '154085', '16'), +('6', '85', '14', '111537', '177367', '16'), +('6', '85', '14', '111539', '175570', '16'), +('6', '85', '14', '111535', '175199', '16'), +('6', '85', '14', '111237', '155515', '16'), +('6', '85', '11', '111337', '176437', '16'), +('6', '85', '11', '111335', '176407', '16'), +('6', '85', '11', '111338', '172544', '16'), +('6', '85', '11', '111034', '154656', '16'), +('6', '85', '22', '12425', '0', '15'), +('6', '85', '22', '21807', '0', '15'), +('6', '85', '22', '39342', '0', '15'), +('6', '85', '22', '7867', '0', '15'), +('6', '85', '1', '107053', '129234', '15'), +('6', '85', '1', '107028', '128672', '15'), +('6', '85', '1', '107029', '128352', '15'), +('6', '85', '1', '107052', '128045', '15'), +('6', '85', '2', '62988', '110463', '15'), +('6', '85', '2', '62985', '110199', '15'), +('6', '85', '2', '94056', '109897', '15'), +('6', '85', '2', '104417', '93828', '15'), +('6', '85', '3', '107030', '130637', '15'), +('6', '85', '3', '107055', '128774', '15'), +('6', '85', '3', '106819', '122572', '15'), +('6', '85', '3', '106841', '121153', '15'), +('6', '85', '5', '107056', '128309', '15'), +('6', '85', '5', '107031', '128155', '15'), +('6', '85', '5', '106820', '123178', '15'), +('6', '85', '5', '106747', '109372', '15'), +('6', '85', '8', '107033', '130785', '15'), +('6', '85', '8', '107058', '130630', '15'), +('6', '85', '8', '106822', '125195', '15'), +('6', '85', '8', '106844', '121692', '15'), +('6', '85', '6', '107032', '130838', '15'), +('6', '85', '6', '107057', '129718', '15'), +('6', '85', '6', '106821', '123481', '15'), +('6', '85', '6', '106843', '122006', '15'), +('6', '85', '17', '56045', '114529', '15'), +('6', '85', '17', '56084', '114294', '15'), +('6', '85', '17', '104420', '97395', '15'), +('6', '85', '17', '54855', '72798', '15'), +('6', '85', '7', '56080', '109963', '15'), +('6', '85', '7', '56040', '108835', '15'), +('6', '85', '7', '104418', '93231', '15'), +('6', '85', '7', '54849', '70209', '15'), +('6', '85', '9', '67098', '169969', '15'), +('6', '85', '9', '81764', '106488', '15'), +('6', '85', '9', '56070', '106376', '15'), +('6', '85', '9', '62984', '106172', '15'), +('6', '85', '15', '107035', '130255', '15'), +('6', '85', '15', '107036', '129172', '15'), +('6', '85', '15', '107061', '127928', '15'), +('6', '85', '15', '107051', '127613', '15'), +('6', '85', '20', '107037', '132838', '15'), +('6', '85', '20', '107059', '131341', '15'), +('6', '85', '20', '106825', '125285', '15'), +('6', '85', '20', '106845', '122817', '15'), +('6', '85', '12', '56035', '108248', '15'), +('6', '85', '12', '56074', '107047', '15'), +('6', '85', '12', '104415', '91031', '15'), +('6', '85', '12', '53399', '54460', '15'), +('6', '85', '18', '56041', '113901', '15'), +('6', '85', '18', '62986', '112405', '15'), +('6', '85', '18', '104419', '96240', '15'), +('6', '85', '18', '54851', '71699', '15'), +('6', '85', '19', '81763', '110615', '15'), +('6', '85', '19', '62990', '110360', '15'), +('6', '85', '19', '56037', '110300', '15'), +('6', '85', '19', '56075', '110169', '15'), +('6', '85', '13', '56111', '111123', '15'), +('6', '85', '13', '62966', '109230', '15'), +('6', '85', '13', '106761', '108555', '15'), +('6', '85', '13', '93856', '103240', '15'), +('6', '85', '14', '107063', '132014', '15'), +('6', '85', '14', '107065', '129964', '15'), +('6', '85', '14', '106850', '124807', '15'), +('6', '85', '14', '106852', '122448', '15'), +('6', '85', '11', '107034', '130985', '15'), +('6', '85', '11', '106823', '123332', '15'), +('6', '85', '11', '56099', '108639', '15'), +('6', '85', '11', '62965', '108563', '15'), +('6', '86', '22', '12425', '0', '16'), +('6', '86', '22', '39342', '0', '16'), +('6', '86', '22', '7867', '0', '16'), +('6', '86', '22', '23597', '0', '16'), +('6', '86', '1', '111306', '176680', '16'), +('6', '86', '1', '111304', '176366', '16'), +('6', '86', '1', '111307', '176220', '16'), +('6', '86', '1', '111310', '174925', '16'), +('6', '86', '2', '62988', '110467', '16'), +('6', '86', '2', '62985', '110208', '16'), +('6', '86', '2', '94056', '109902', '16'), +('6', '86', '2', '104417', '93831', '16'), +('6', '86', '3', '111314', '177082', '16'), +('6', '86', '3', '111316', '175371', '16'), +('6', '86', '3', '111315', '174487', '16'), +('6', '86', '3', '111013', '155231', '16'), +('6', '86', '5', '111319', '176444', '16'), +('6', '86', '5', '111321', '176005', '16'), +('6', '86', '5', '111318', '173720', '16'), +('6', '86', '5', '111317', '173436', '16'), +('6', '86', '8', '111332', '177263', '16'), +('6', '86', '8', '111329', '175903', '16'), +('6', '86', '8', '111330', '175108', '16'), +('6', '86', '8', '111331', '172803', '16'), +('6', '86', '6', '111323', '177167', '16'), +('6', '86', '6', '111326', '175730', '16'), +('6', '86', '6', '111325', '175679', '16'), +('6', '86', '6', '111022', '155316', '16'), +('6', '86', '17', '56045', '114533', '16'), +('6', '86', '17', '56084', '114303', '16'), +('6', '86', '17', '104420', '97401', '16'), +('6', '86', '17', '54855', '72805', '16'), +('6', '86', '7', '56080', '109970', '16'), +('6', '86', '7', '56040', '108841', '16'), +('6', '86', '7', '104418', '93238', '16'), +('6', '86', '7', '54849', '70213', '16'), +('6', '86', '9', '67098', '171974', '16'), +('6', '86', '9', '81764', '106498', '16'), +('6', '86', '9', '56070', '106382', '16'), +('6', '86', '9', '62984', '106178', '16'), +('6', '86', '15', '111350', '178555', '16'), +('6', '86', '15', '111344', '177659', '16'), +('6', '86', '15', '111340', '177034', '16'), +('6', '86', '15', '111346', '176577', '16'), +('6', '86', '20', '111356', '177098', '16'), +('6', '86', '20', '111352', '176416', '16'), +('6', '86', '20', '111351', '173694', '16'), +('6', '86', '20', '111054', '155247', '16'), +('6', '86', '12', '56035', '108258', '16'), +('6', '86', '12', '56074', '107053', '16'), +('6', '86', '12', '104415', '91034', '16'), +('6', '86', '12', '49656', '70125', '16'), +('6', '86', '18', '56041', '113907', '16'), +('6', '86', '18', '62986', '112413', '16'), +('6', '86', '18', '104419', '96250', '16'), +('6', '86', '18', '54851', '71707', '16'), +('6', '86', '19', '81763', '110625', '16'), +('6', '86', '19', '62990', '110364', '16'), +('6', '86', '19', '56037', '110307', '16'), +('6', '86', '19', '56075', '110177', '16'), +('6', '86', '13', '111518', '170531', '16'), +('6', '86', '13', '111517', '168803', '16'), +('6', '86', '13', '111217', '154146', '16'), +('6', '86', '13', '111218', '154091', '16'), +('6', '86', '14', '111537', '177374', '16'), +('6', '86', '14', '111539', '175577', '16'), +('6', '86', '14', '111535', '175205', '16'), +('6', '86', '14', '111237', '155522', '16'), +('6', '86', '11', '111337', '176446', '16'), +('6', '86', '11', '111335', '176415', '16'), +('6', '86', '11', '111338', '172549', '16'), +('6', '86', '11', '111034', '154664', '16'), +('6', '87', '22', '12425', '0', '16'), +('6', '87', '22', '39342', '0', '16'), +('6', '87', '22', '7867', '0', '16'), +('6', '87', '22', '23597', '0', '16'), +('6', '87', '1', '111306', '176688', '16'), +('6', '87', '1', '111304', '176373', '16'), +('6', '87', '1', '111307', '176224', '16'), +('6', '87', '1', '111310', '174931', '16'), +('6', '87', '2', '62988', '110471', '16'), +('6', '87', '2', '62985', '110216', '16'), +('6', '87', '2', '94056', '109908', '16'), +('6', '87', '2', '104417', '93834', '16'), +('6', '87', '3', '111314', '177088', '16'), +('6', '87', '3', '111316', '175377', '16'), +('6', '87', '3', '111315', '174493', '16'), +('6', '87', '3', '111013', '155238', '16'), +('6', '87', '5', '111319', '176450', '16'), +('6', '87', '5', '111321', '176012', '16'), +('6', '87', '5', '111318', '173726', '16'), +('6', '87', '5', '111317', '173442', '16'), +('6', '87', '8', '111332', '177270', '16'), +('6', '87', '8', '111329', '175907', '16'), +('6', '87', '8', '111330', '175114', '16'), +('6', '87', '8', '111331', '172811', '16'), +('6', '87', '6', '111323', '177173', '16'), +('6', '87', '6', '111326', '175739', '16'), +('6', '87', '6', '111325', '175685', '16'), +('6', '87', '6', '111022', '155323', '16'), +('6', '87', '17', '56045', '114537', '16'), +('6', '87', '17', '56084', '114312', '16'), +('6', '87', '17', '104420', '97407', '16'), +('6', '87', '17', '54855', '72812', '16'), +('6', '87', '7', '56080', '109978', '16'), +('6', '87', '7', '56040', '108847', '16'), +('6', '87', '7', '104418', '93246', '16'), +('6', '87', '7', '54849', '70217', '16'), +('6', '87', '9', '67098', '173978', '16'), +('6', '87', '9', '81764', '106508', '16'), +('6', '87', '9', '56070', '106388', '16'), +('6', '87', '9', '62984', '106184', '16'), +('6', '87', '15', '111350', '178563', '16'), +('6', '87', '15', '111344', '177667', '16'), +('6', '87', '15', '111340', '177041', '16'), +('6', '87', '15', '111346', '176582', '16'), +('6', '87', '20', '111356', '177103', '16'), +('6', '87', '20', '111352', '176422', '16'), +('6', '87', '20', '111351', '173701', '16'), +('6', '87', '20', '111054', '155252', '16'), +('6', '87', '12', '56035', '108267', '16'), +('6', '87', '12', '56074', '107059', '16'), +('6', '87', '12', '104415', '91037', '16'), +('6', '87', '12', '49656', '70126', '16'), +('6', '87', '18', '56041', '113913', '16'), +('6', '87', '18', '62986', '112420', '16'), +('6', '87', '18', '104419', '96260', '16'), +('6', '87', '18', '54851', '71714', '16'), +('6', '87', '19', '81763', '110635', '16'), +('6', '87', '19', '62990', '110369', '16'), +('6', '87', '19', '56037', '110315', '16'), +('6', '87', '19', '56075', '110185', '16'), +('6', '87', '13', '111518', '170537', '16'), +('6', '87', '13', '111517', '168809', '16'), +('6', '87', '13', '111217', '154152', '16'), +('6', '87', '13', '111218', '154098', '16'), +('6', '87', '14', '111537', '177380', '16'), +('6', '87', '14', '111539', '175585', '16'), +('6', '87', '14', '111535', '175211', '16'), +('6', '87', '14', '111237', '155529', '16'), +('6', '87', '11', '111337', '176455', '16'), +('6', '87', '11', '111335', '176422', '16'), +('6', '87', '11', '111338', '172554', '16'), +('6', '87', '11', '111034', '154672', '16'), +('6', '88', '22', '12425', '0', '16'), +('6', '88', '22', '39342', '0', '16'), +('6', '88', '22', '7867', '0', '16'), +('6', '88', '22', '23597', '0', '16'), +('6', '88', '1', '111306', '176696', '16'), +('6', '88', '1', '111304', '176381', '16'), +('6', '88', '1', '111307', '176228', '16'), +('6', '88', '1', '111310', '174937', '16'), +('6', '88', '2', '62988', '110475', '16'), +('6', '88', '2', '62985', '110224', '16'), +('6', '88', '2', '94056', '109913', '16'), +('6', '88', '2', '104417', '93838', '16'), +('6', '88', '3', '111314', '177094', '16'), +('6', '88', '3', '111316', '175383', '16'), +('6', '88', '3', '111315', '174500', '16'), +('6', '88', '3', '111013', '155244', '16'), +('6', '88', '5', '111319', '176455', '16'), +('6', '88', '5', '111321', '176019', '16'), +('6', '88', '5', '111318', '173731', '16'), +('6', '88', '5', '111317', '173448', '16'), +('6', '88', '8', '111332', '177277', '16'), +('6', '88', '8', '111329', '175911', '16'), +('6', '88', '8', '111330', '175120', '16'), +('6', '88', '8', '111331', '172818', '16'), +('6', '88', '6', '111323', '177180', '16'), +('6', '88', '6', '111326', '175748', '16'), +('6', '88', '6', '111325', '175690', '16'), +('6', '88', '6', '111022', '155329', '16'), +('6', '88', '17', '56045', '114542', '16'), +('6', '88', '17', '56084', '114321', '16'), +('6', '88', '17', '104420', '97413', '16'), +('6', '88', '17', '54855', '72818', '16'), +('6', '88', '7', '56080', '109985', '16'), +('6', '88', '7', '56040', '108854', '16'), +('6', '88', '7', '104418', '93253', '16'), +('6', '88', '7', '54849', '70221', '16'), +('6', '88', '9', '67098', '175983', '16'), +('6', '88', '9', '81764', '106519', '16'), +('6', '88', '9', '56070', '106395', '16'), +('6', '88', '9', '62984', '106190', '16'), +('6', '88', '15', '111350', '178571', '16'), +('6', '88', '15', '111344', '177675', '16'), +('6', '88', '15', '111340', '177047', '16'), +('6', '88', '15', '111346', '176586', '16'), +('6', '88', '20', '111356', '177107', '16'), +('6', '88', '20', '111352', '176429', '16'), +('6', '88', '20', '111351', '173708', '16'), +('6', '88', '20', '111054', '155257', '16'), +('6', '88', '12', '56035', '108277', '16'), +('6', '88', '12', '56074', '107065', '16'), +('6', '88', '12', '104415', '91040', '16'), +('6', '88', '12', '49656', '70127', '16'), +('6', '88', '18', '56041', '113919', '16'), +('6', '88', '18', '62986', '112427', '16'), +('6', '88', '18', '104419', '96270', '16'), +('6', '88', '18', '54851', '71722', '16'), +('6', '88', '19', '81763', '110645', '16'), +('6', '88', '19', '62990', '110373', '16'), +('6', '88', '19', '56037', '110322', '16'), +('6', '88', '19', '56075', '110193', '16'), +('6', '88', '13', '111518', '170544', '16'), +('6', '88', '13', '111517', '168815', '16'), +('6', '88', '13', '111217', '154158', '16'), +('6', '88', '13', '111218', '154104', '16'), +('6', '88', '14', '111537', '177387', '16'), +('6', '88', '14', '111539', '175592', '16'), +('6', '88', '14', '111535', '175217', '16'), +('6', '88', '14', '111237', '155535', '16'), +('6', '88', '11', '111337', '176464', '16'), +('6', '88', '11', '111335', '176430', '16'), +('6', '88', '11', '111338', '172559', '16'), +('6', '88', '11', '111034', '154680', '16'), +('6', '89', '22', '12425', '0', '16'), +('6', '89', '22', '39342', '0', '16'), +('6', '89', '22', '7867', '0', '16'), +('6', '89', '22', '23597', '0', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '89', '1', '111306', '176705', '16'), +('6', '89', '1', '111304', '176388', '16'), +('6', '89', '1', '111307', '176231', '16'), +('6', '89', '1', '111310', '174943', '16'), +('6', '89', '2', '62988', '110479', '16'), +('6', '89', '2', '62985', '110233', '16'), +('6', '89', '2', '94056', '109918', '16'), +('6', '89', '2', '104417', '93841', '16'), +('6', '89', '3', '111314', '177101', '16'), +('6', '89', '3', '111316', '175389', '16'), +('6', '89', '3', '111315', '174506', '16'), +('6', '89', '3', '111013', '155250', '16'), +('6', '89', '5', '111319', '176460', '16'), +('6', '89', '5', '111321', '176027', '16'), +('6', '89', '5', '111318', '173736', '16'), +('6', '89', '5', '111317', '173454', '16'), +('6', '89', '8', '111332', '177284', '16'), +('6', '89', '8', '111329', '175915', '16'), +('6', '89', '8', '111330', '175127', '16'), +('6', '89', '8', '111331', '172826', '16'), +('6', '89', '6', '111323', '177186', '16'), +('6', '89', '6', '111326', '175757', '16'), +('6', '89', '6', '111325', '175695', '16'), +('6', '89', '6', '111022', '155336', '16'), +('6', '89', '17', '56045', '114546', '16'), +('6', '89', '17', '56084', '114330', '16'), +('6', '89', '17', '104420', '97420', '16'), +('6', '89', '17', '54855', '72825', '16'), +('6', '89', '7', '56080', '109993', '16'), +('6', '89', '7', '56040', '108860', '16'), +('6', '89', '7', '104418', '93260', '16'), +('6', '89', '7', '54849', '70224', '16'), +('6', '89', '9', '67098', '177988', '16'), +('6', '89', '9', '81764', '106529', '16'), +('6', '89', '9', '56070', '106401', '16'), +('6', '89', '9', '62984', '106196', '16'), +('6', '89', '15', '111350', '178579', '16'), +('6', '89', '15', '111344', '177683', '16'), +('6', '89', '15', '111340', '177053', '16'), +('6', '89', '15', '111346', '176591', '16'), +('6', '89', '20', '111356', '177112', '16'), +('6', '89', '20', '111352', '176436', '16'), +('6', '89', '20', '111351', '173715', '16'), +('6', '89', '20', '111054', '155262', '16'), +('6', '89', '12', '56035', '108286', '16'), +('6', '89', '12', '56074', '107072', '16'), +('6', '89', '12', '104415', '91043', '16'), +('6', '89', '12', '49656', '70127', '16'), +('6', '89', '18', '56041', '113925', '16'), +('6', '89', '18', '62986', '112435', '16'), +('6', '89', '18', '104419', '96279', '16'), +('6', '89', '18', '54851', '71729', '16'), +('6', '89', '19', '81763', '110655', '16'), +('6', '89', '19', '62990', '110377', '16'), +('6', '89', '19', '56037', '110329', '16'), +('6', '89', '19', '56075', '110201', '16'), +('6', '89', '13', '111518', '170550', '16'), +('6', '89', '13', '111517', '168821', '16'), +('6', '89', '13', '111217', '154164', '16'), +('6', '89', '13', '111218', '154110', '16'), +('6', '89', '14', '111537', '177393', '16'), +('6', '89', '14', '111539', '175600', '16'), +('6', '89', '14', '111535', '175223', '16'), +('6', '89', '14', '111237', '155542', '16'), +('6', '89', '11', '111337', '176473', '16'), +('6', '89', '11', '111335', '176438', '16'), +('6', '89', '11', '111338', '172564', '16'), +('6', '89', '11', '111034', '154687', '16'), +('6', '90', '22', '12425', '0', '17'), +('6', '90', '22', '39342', '0', '17'), +('6', '90', '22', '7867', '0', '17'), +('6', '90', '22', '23597', '0', '17'), +('6', '90', '1', '111306', '176713', '17'), +('6', '90', '1', '111304', '176396', '17'), +('6', '90', '1', '111307', '176235', '17'), +('6', '90', '1', '111310', '174950', '17'), +('6', '90', '2', '62988', '110484', '17'), +('6', '90', '2', '62985', '110241', '17'), +('6', '90', '2', '94056', '109924', '17'), +('6', '90', '2', '104417', '93844', '17'), +('6', '90', '3', '111314', '177107', '17'), +('6', '90', '3', '111316', '175395', '17'), +('6', '90', '3', '111315', '174512', '17'), +('6', '90', '3', '111013', '155256', '17'), +('6', '90', '5', '111319', '176466', '17'), +('6', '90', '5', '111321', '176034', '17'), +('6', '90', '5', '111318', '173741', '17'), +('6', '90', '5', '111317', '173460', '17'), +('6', '90', '8', '111332', '177292', '17'), +('6', '90', '8', '111329', '175919', '17'), +('6', '90', '8', '111330', '175133', '17'), +('6', '90', '8', '111331', '172833', '17'), +('6', '90', '6', '111323', '177193', '17'), +('6', '90', '6', '111326', '175766', '17'), +('6', '90', '6', '111325', '175701', '17'), +('6', '90', '6', '111022', '155342', '17'), +('6', '90', '17', '56045', '114550', '17'), +('6', '90', '17', '56084', '114339', '17'), +('6', '90', '17', '104420', '97426', '17'), +('6', '90', '17', '54855', '72832', '17'), +('6', '90', '7', '56080', '110001', '17'), +('6', '90', '7', '56040', '108866', '17'), +('6', '90', '7', '104418', '93267', '17'), +('6', '90', '7', '54849', '70228', '17'), +('6', '90', '9', '67098', '179994', '17'), +('6', '90', '9', '81764', '106539', '17'), +('6', '90', '9', '56070', '106407', '17'), +('6', '90', '9', '62984', '106203', '17'), +('6', '90', '15', '111350', '178587', '17'), +('6', '90', '15', '111344', '177692', '17'), +('6', '90', '15', '111340', '177060', '17'), +('6', '90', '15', '111346', '176596', '17'), +('6', '90', '20', '111356', '177117', '17'), +('6', '90', '20', '111352', '176442', '17'), +('6', '90', '20', '111351', '173722', '17'), +('6', '90', '20', '111054', '155267', '17'), +('6', '90', '12', '56035', '108296', '17'), +('6', '90', '12', '56074', '107078', '17'), +('6', '90', '12', '104415', '91047', '17'), +('6', '90', '12', '49656', '70128', '17'), +('6', '90', '18', '56041', '113931', '17'), +('6', '90', '18', '62986', '112442', '17'), +('6', '90', '18', '104419', '96289', '17'), +('6', '90', '18', '54851', '71737', '17'), +('6', '90', '19', '81763', '110665', '17'), +('6', '90', '19', '62990', '110382', '17'), +('6', '90', '19', '56037', '110336', '17'), +('6', '90', '19', '56075', '110209', '17'), +('6', '90', '13', '111518', '170557', '17'), +('6', '90', '13', '111517', '168827', '17'), +('6', '90', '13', '111217', '154170', '17'), +('6', '90', '13', '111218', '154116', '17'), +('6', '90', '14', '111537', '177400', '17'), +('6', '90', '14', '111539', '175607', '17'), +('6', '90', '14', '111535', '175229', '17'), +('6', '90', '14', '111237', '155548', '17'), +('6', '90', '11', '111337', '176483', '17'), +('6', '90', '11', '111335', '176446', '17'), +('6', '90', '11', '111338', '172569', '17'), +('6', '90', '11', '111034', '154695', '17'), +('6', '91', '22', '12425', '0', '17'), +('6', '91', '22', '39342', '0', '17'), +('6', '91', '22', '7867', '0', '17'), +('6', '91', '22', '23597', '0', '17'), +('6', '91', '1', '111306', '176721', '17'), +('6', '91', '1', '111304', '176403', '17'), +('6', '91', '1', '111307', '176238', '17'), +('6', '91', '1', '111310', '174956', '17'), +('6', '91', '2', '62988', '110488', '17'), +('6', '91', '2', '62985', '110249', '17'), +('6', '91', '2', '94056', '109929', '17'), +('6', '91', '2', '104417', '93847', '17'), +('6', '91', '3', '111314', '177113', '17'), +('6', '91', '3', '111316', '175401', '17'), +('6', '91', '3', '111315', '174518', '17'), +('6', '91', '3', '111013', '155262', '17'), +('6', '91', '5', '111319', '176471', '17'), +('6', '91', '5', '111321', '176041', '17'), +('6', '91', '5', '111318', '173746', '17'), +('6', '91', '5', '111317', '173466', '17'), +('6', '91', '8', '111332', '177299', '17'), +('6', '91', '8', '111329', '175923', '17'), +('6', '91', '8', '111330', '175139', '17'), +('6', '91', '8', '111331', '172841', '17'), +('6', '91', '6', '111323', '177199', '17'), +('6', '91', '6', '111326', '175775', '17'), +('6', '91', '6', '111325', '175706', '17'), +('6', '91', '6', '111022', '155349', '17'), +('6', '91', '17', '56045', '114554', '17'), +('6', '91', '17', '56084', '114348', '17'), +('6', '91', '17', '104420', '97432', '17'), +('6', '91', '17', '54855', '72839', '17'), +('6', '91', '7', '56080', '110008', '17'), +('6', '91', '7', '56040', '108872', '17'), +('6', '91', '7', '104418', '93275', '17'), +('6', '91', '7', '54849', '70232', '17'), +('6', '91', '9', '67098', '179999', '17'), +('6', '91', '9', '81764', '106549', '17'), +('6', '91', '9', '56070', '106413', '17'), +('6', '91', '9', '62984', '106209', '17'), +('6', '91', '15', '111350', '178595', '17'), +('6', '91', '15', '111344', '177700', '17'), +('6', '91', '15', '111340', '177066', '17'), +('6', '91', '15', '111346', '176601', '17'), +('6', '91', '20', '111356', '177122', '17'), +('6', '91', '20', '111352', '176449', '17'), +('6', '91', '20', '111351', '173729', '17'), +('6', '91', '20', '111054', '155271', '17'), +('6', '91', '12', '56035', '108305', '17'), +('6', '91', '12', '56074', '107084', '17'), +('6', '91', '12', '104415', '91050', '17'), +('6', '91', '12', '49656', '70129', '17'), +('6', '91', '18', '56041', '113937', '17'), +('6', '91', '18', '62986', '112450', '17'), +('6', '91', '18', '104419', '96299', '17'), +('6', '91', '18', '54851', '71744', '17'), +('6', '91', '19', '81763', '110675', '17'), +('6', '91', '19', '62990', '110386', '17'), +('6', '91', '19', '56037', '110343', '17'), +('6', '91', '19', '56075', '110217', '17'), +('6', '91', '13', '111518', '170563', '17'), +('6', '91', '13', '111517', '168833', '17'), +('6', '91', '13', '111217', '154176', '17'), +('6', '91', '13', '111218', '154123', '17'), +('6', '91', '14', '111537', '177406', '17'), +('6', '91', '14', '111539', '175615', '17'), +('6', '91', '14', '111535', '175235', '17'), +('6', '91', '14', '111237', '155555', '17'), +('6', '91', '11', '111337', '176492', '17'), +('6', '91', '11', '111335', '176453', '17'), +('6', '91', '11', '111338', '172573', '17'), +('6', '91', '11', '111034', '154703', '17'), +('6', '92', '22', '12425', '0', '17'), +('6', '92', '22', '39342', '0', '17'), +('6', '92', '22', '7867', '0', '17'), +('6', '92', '22', '23597', '0', '17'), +('6', '92', '1', '111306', '176729', '17'), +('6', '92', '1', '111304', '176411', '17'), +('6', '92', '1', '111307', '176242', '17'), +('6', '92', '1', '111310', '174962', '17'), +('6', '92', '2', '62988', '110492', '17'), +('6', '92', '2', '62985', '110257', '17'), +('6', '92', '2', '94056', '109934', '17'), +('6', '92', '2', '104417', '93850', '17'), +('6', '92', '3', '111314', '177119', '17'), +('6', '92', '3', '111316', '175408', '17'), +('6', '92', '3', '111315', '174524', '17'), +('6', '92', '3', '111013', '155268', '17'), +('6', '92', '5', '111319', '176476', '17'), +('6', '92', '5', '111321', '176048', '17'), +('6', '92', '5', '111318', '173751', '17'), +('6', '92', '5', '111317', '173472', '17'), +('6', '92', '8', '111332', '177306', '17'), +('6', '92', '8', '111329', '175927', '17'), +('6', '92', '8', '111330', '175145', '17'), +('6', '92', '8', '111331', '172848', '17'), +('6', '92', '6', '111323', '177206', '17'), +('6', '92', '6', '111326', '175784', '17'), +('6', '92', '6', '111325', '175711', '17'), +('6', '92', '6', '111022', '155356', '17'), +('6', '92', '17', '56045', '114558', '17'), +('6', '92', '17', '56084', '114357', '17'), +('6', '92', '17', '104420', '97438', '17'), +('6', '92', '17', '54855', '72846', '17'), +('6', '92', '7', '56080', '110016', '17'), +('6', '92', '7', '56040', '108878', '17'), +('6', '92', '7', '104418', '93282', '17'), +('6', '92', '7', '54849', '70236', '17'), +('6', '92', '9', '67098', '180004', '17'), +('6', '92', '9', '81764', '106560', '17'), +('6', '92', '9', '56070', '106419', '17'), +('6', '92', '9', '62984', '106215', '17'), +('6', '92', '15', '111350', '178603', '17'), +('6', '92', '15', '111344', '177708', '17'), +('6', '92', '15', '111340', '177072', '17'), +('6', '92', '15', '111346', '176605', '17'), +('6', '92', '20', '111356', '177127', '17'), +('6', '92', '20', '111352', '176455', '17'), +('6', '92', '20', '111351', '173736', '17'), +('6', '92', '20', '111054', '155276', '17'), +('6', '92', '12', '56035', '108315', '17'), +('6', '92', '12', '56074', '107090', '17'), +('6', '92', '12', '104415', '91053', '17'), +('6', '92', '12', '49656', '70130', '17'), +('6', '92', '18', '56041', '113943', '17'), +('6', '92', '18', '62986', '112457', '17'), +('6', '92', '18', '104419', '96309', '17'), +('6', '92', '18', '54851', '71752', '17'), +('6', '92', '19', '81763', '110685', '17'), +('6', '92', '19', '62990', '110390', '17'), +('6', '92', '19', '56037', '110350', '17'), +('6', '92', '19', '56075', '110225', '17'), +('6', '92', '13', '111518', '170570', '17'), +('6', '92', '13', '111517', '168840', '17'), +('6', '92', '13', '111217', '154182', '17'), +('6', '92', '13', '111218', '154129', '17'), +('6', '92', '14', '111537', '177413', '17'), +('6', '92', '14', '111539', '175623', '17'), +('6', '92', '14', '111535', '175241', '17'), +('6', '92', '14', '111237', '155561', '17'), +('6', '92', '11', '111337', '176501', '17'), +('6', '92', '11', '111335', '176461', '17'), +('6', '92', '11', '111338', '172578', '17'), +('6', '92', '11', '111034', '154711', '17'), +('6', '93', '22', '12425', '0', '17'), +('6', '93', '22', '39342', '0', '17'), +('6', '93', '22', '7867', '0', '17'), +('6', '93', '22', '23597', '0', '17'), +('6', '93', '1', '111306', '176737', '17'), +('6', '93', '1', '111304', '176418', '17'), +('6', '93', '1', '111307', '176246', '17'), +('6', '93', '1', '111310', '174968', '17'), +('6', '93', '2', '62988', '110496', '17'), +('6', '93', '2', '62985', '110266', '17'), +('6', '93', '2', '94056', '109940', '17'), +('6', '93', '2', '104417', '93853', '17'), +('6', '93', '3', '111314', '177125', '17'), +('6', '93', '3', '111316', '175414', '17'), +('6', '93', '3', '111315', '174531', '17'), +('6', '93', '3', '111013', '155275', '17'), +('6', '93', '5', '111319', '176482', '17'), +('6', '93', '5', '111321', '176055', '17'), +('6', '93', '5', '111318', '173756', '17'), +('6', '93', '5', '111317', '173478', '17'), +('6', '93', '8', '111332', '177313', '17'), +('6', '93', '8', '111329', '175931', '17'), +('6', '93', '8', '111330', '175151', '17'), +('6', '93', '8', '111331', '172856', '17'), +('6', '93', '6', '111323', '177213', '17'), +('6', '93', '6', '111326', '175793', '17'), +('6', '93', '6', '111325', '175717', '17'), +('6', '93', '6', '111022', '155362', '17'), +('6', '93', '17', '56045', '114562', '17'), +('6', '93', '17', '56084', '114366', '17'), +('6', '93', '17', '104420', '97445', '17'), +('6', '93', '17', '54855', '72853', '17'), +('6', '93', '7', '56080', '110023', '17'), +('6', '93', '7', '56040', '108884', '17'), +('6', '93', '7', '104418', '93289', '17'), +('6', '93', '7', '54849', '70239', '17'), +('6', '93', '9', '67098', '180010', '17'), +('6', '93', '9', '81764', '106570', '17'), +('6', '93', '9', '56070', '106425', '17'), +('6', '93', '9', '62984', '106221', '17'), +('6', '93', '15', '111350', '178611', '17'), +('6', '93', '15', '111344', '177716', '17'), +('6', '93', '15', '111340', '177079', '17'), +('6', '93', '15', '111346', '176610', '17'), +('6', '93', '20', '111356', '177132', '17'), +('6', '93', '20', '111352', '176462', '17'), +('6', '93', '20', '111351', '173743', '17'), +('6', '93', '20', '111054', '155281', '17'), +('6', '93', '12', '56035', '108324', '17'), +('6', '93', '12', '56074', '107096', '17'), +('6', '93', '12', '104415', '91056', '17'), +('6', '93', '12', '49656', '70131', '17'), +('6', '93', '18', '56041', '113949', '17'), +('6', '93', '18', '62986', '112465', '17'), +('6', '93', '18', '104419', '96318', '17'), +('6', '93', '18', '54851', '71759', '17'), +('6', '93', '19', '81763', '110695', '17'), +('6', '93', '19', '62990', '110395', '17'), +('6', '93', '19', '56037', '110358', '17'), +('6', '93', '19', '56075', '110233', '17'), +('6', '93', '13', '111518', '170576', '17'), +('6', '93', '13', '111517', '168846', '17'), +('6', '93', '13', '111217', '154188', '17'), +('6', '93', '13', '111218', '154135', '17'), +('6', '93', '14', '111537', '177420', '17'), +('6', '93', '14', '111539', '175630', '17'), +('6', '93', '14', '111535', '175247', '17'), +('6', '93', '14', '111237', '155568', '17'), +('6', '93', '11', '111337', '176510', '17'), +('6', '93', '11', '111335', '176469', '17'), +('6', '93', '11', '111338', '172583', '17'), +('6', '93', '11', '111034', '154718', '17'), +('6', '94', '22', '12425', '0', '17'), +('6', '94', '22', '39342', '0', '17'), +('6', '94', '22', '7867', '0', '17'), +('6', '94', '22', '23597', '0', '17'), +('6', '94', '1', '111306', '176745', '17'), +('6', '94', '1', '111304', '176426', '17'), +('6', '94', '1', '111307', '176249', '17'), +('6', '94', '1', '111310', '174975', '17'), +('6', '94', '2', '62988', '110500', '17'), +('6', '94', '2', '62985', '110274', '17'), +('6', '94', '2', '94056', '109945', '17'), +('6', '94', '2', '104417', '93856', '17'), +('6', '94', '3', '111314', '177131', '17'), +('6', '94', '3', '111316', '175420', '17'), +('6', '94', '3', '111315', '174537', '17'), +('6', '94', '3', '111013', '155281', '17'), +('6', '94', '5', '111319', '176487', '17'), +('6', '94', '5', '111321', '176062', '17'), +('6', '94', '5', '111318', '173761', '17'), +('6', '94', '5', '111317', '173484', '17'), +('6', '94', '8', '111332', '177320', '17'), +('6', '94', '8', '111329', '175935', '17'), +('6', '94', '8', '111330', '175157', '17'), +('6', '94', '8', '111331', '172864', '17'), +('6', '94', '6', '111323', '177219', '17'), +('6', '94', '6', '111326', '175802', '17'), +('6', '94', '6', '111325', '175722', '17'), +('6', '94', '6', '111022', '155369', '17'), +('6', '94', '17', '56045', '114566', '17'), +('6', '94', '17', '56084', '114375', '17'), +('6', '94', '17', '104420', '97451', '17'), +('6', '94', '17', '54855', '72860', '17'), +('6', '94', '7', '56080', '110031', '17'), +('6', '94', '7', '56040', '108891', '17'), +('6', '94', '7', '104418', '93297', '17'), +('6', '94', '7', '54849', '70243', '17'), +('6', '94', '9', '67098', '180015', '17'), +('6', '94', '9', '81764', '106580', '17'), +('6', '94', '9', '56070', '106431', '17'), +('6', '94', '9', '62984', '106228', '17'), +('6', '94', '15', '111350', '178619', '17'), +('6', '94', '15', '111344', '177724', '17'), +('6', '94', '15', '111340', '177085', '17'), +('6', '94', '15', '111346', '176615', '17'), +('6', '94', '20', '111356', '177136', '17'), +('6', '94', '20', '111352', '176468', '17'), +('6', '94', '20', '111351', '173749', '17'), +('6', '94', '20', '111054', '155286', '17'), +('6', '94', '12', '56035', '108334', '17'), +('6', '94', '12', '56074', '107102', '17'), +('6', '94', '12', '104415', '91059', '17'), +('6', '94', '12', '49656', '70132', '17'), +('6', '94', '18', '56041', '113955', '17'), +('6', '94', '18', '62986', '112472', '17'), +('6', '94', '18', '104419', '96328', '17'), +('6', '94', '18', '54851', '71767', '17'), +('6', '94', '19', '81763', '110704', '17'), +('6', '94', '19', '62990', '110399', '17'), +('6', '94', '19', '56037', '110365', '17'), +('6', '94', '19', '56075', '110241', '17'), +('6', '94', '13', '111518', '170583', '17'), +('6', '94', '13', '111517', '168852', '17'), +('6', '94', '13', '111217', '154194', '17'), +('6', '94', '13', '111218', '154141', '17'), +('6', '94', '14', '111537', '177426', '17'), +('6', '94', '14', '111539', '175638', '17'), +('6', '94', '14', '111535', '175253', '17'), +('6', '94', '14', '111237', '155575', '17'), +('6', '94', '11', '111337', '176519', '17'), +('6', '94', '11', '111335', '176477', '17'), +('6', '94', '11', '111338', '172588', '17'), +('6', '94', '11', '111034', '154726', '17'), +('6', '95', '22', '12425', '0', '18'), +('6', '95', '22', '39342', '0', '18'), +('6', '95', '22', '7867', '0', '18'), +('6', '95', '22', '23597', '0', '18'), +('6', '95', '1', '111306', '176753', '18'), +('6', '95', '1', '111304', '176433', '18'), +('6', '95', '1', '111307', '176253', '18'), +('6', '95', '1', '111310', '174981', '18'), +('6', '95', '2', '62988', '110504', '18'), +('6', '95', '2', '62985', '110282', '18'), +('6', '95', '2', '94056', '109950', '18'), +('6', '95', '2', '104417', '93860', '18'), +('6', '95', '3', '111314', '177138', '18'), +('6', '95', '3', '111316', '175426', '18'), +('6', '95', '3', '111315', '174543', '18'), +('6', '95', '3', '111013', '155287', '18'), +('6', '95', '5', '111319', '176493', '18'), +('6', '95', '5', '111321', '176069', '18'), +('6', '95', '5', '111318', '173766', '18'), +('6', '95', '5', '111317', '173490', '18'), +('6', '95', '8', '111332', '177327', '18'), +('6', '95', '8', '111329', '175939', '18'), +('6', '95', '8', '111330', '175163', '18'), +('6', '95', '8', '111331', '172871', '18'), +('6', '95', '6', '111323', '177226', '18'), +('6', '95', '6', '111326', '175811', '18'), +('6', '95', '6', '111325', '175727', '18'), +('6', '95', '6', '111022', '155375', '18'), +('6', '95', '17', '56045', '114571', '18'), +('6', '95', '17', '56084', '114384', '18'), +('6', '95', '17', '104420', '97457', '18'), +('6', '95', '17', '54855', '72866', '18'), +('6', '95', '7', '56080', '110038', '18'), +('6', '95', '7', '56040', '108897', '18'), +('6', '95', '7', '104418', '93304', '18'), +('6', '95', '7', '54849', '70247', '18'), +('6', '95', '9', '67098', '180020', '18'), +('6', '95', '9', '81764', '106591', '18'), +('6', '95', '9', '56070', '106437', '18'), +('6', '95', '9', '62984', '106234', '18'), +('6', '95', '15', '111350', '178627', '18'), +('6', '95', '15', '111344', '177732', '18'), +('6', '95', '15', '111340', '177091', '18'), +('6', '95', '15', '111346', '176620', '18'), +('6', '95', '20', '111356', '177141', '18'), +('6', '95', '20', '111352', '176475', '18'), +('6', '95', '20', '111351', '173756', '18'), +('6', '95', '20', '111054', '155291', '18'), +('6', '95', '12', '56035', '108343', '18'), +('6', '95', '12', '56074', '107108', '18'), +('6', '95', '12', '104415', '91063', '18'), +('6', '95', '12', '49656', '70132', '18'), +('6', '95', '18', '56041', '113961', '18'), +('6', '95', '18', '62986', '112479', '18'), +('6', '95', '18', '104419', '96338', '18'), +('6', '95', '18', '54851', '71775', '18'), +('6', '95', '19', '81763', '110714', '18'), +('6', '95', '19', '62990', '110403', '18'), +('6', '95', '19', '56037', '110372', '18'), +('6', '95', '19', '56075', '110249', '18'), +('6', '95', '13', '111518', '170589', '18'), +('6', '95', '13', '111517', '168858', '18'), +('6', '95', '13', '111217', '154200', '18'), +('6', '95', '13', '111218', '154148', '18'), +('6', '95', '14', '111537', '177433', '18'), +('6', '95', '14', '111539', '175645', '18'), +('6', '95', '14', '111535', '175259', '18'), +('6', '95', '14', '111237', '155581', '18'), +('6', '95', '11', '111337', '176528', '18'), +('6', '95', '11', '111335', '176484', '18'), +('6', '95', '11', '111338', '172593', '18'), +('6', '95', '11', '111034', '154734', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '96', '22', '12425', '0', '18'), +('6', '96', '22', '39342', '0', '18'), +('6', '96', '22', '7867', '0', '18'), +('6', '96', '22', '23597', '0', '18'), +('6', '96', '1', '111306', '176762', '18'), +('6', '96', '1', '111304', '176441', '18'), +('6', '96', '1', '111307', '176256', '18'), +('6', '96', '1', '111310', '174987', '18'), +('6', '96', '2', '62988', '110508', '18'), +('6', '96', '2', '62985', '110291', '18'), +('6', '96', '2', '94056', '109956', '18'), +('6', '96', '2', '104417', '93863', '18'), +('6', '96', '3', '111314', '177144', '18'), +('6', '96', '3', '111316', '175432', '18'), +('6', '96', '3', '111315', '174549', '18'), +('6', '96', '3', '111013', '155293', '18'), +('6', '96', '5', '111319', '176498', '18'), +('6', '96', '5', '111321', '176077', '18'), +('6', '96', '5', '111318', '173772', '18'), +('6', '96', '5', '111317', '173496', '18'), +('6', '96', '8', '111332', '177334', '18'), +('6', '96', '8', '111329', '175943', '18'), +('6', '96', '8', '111330', '175169', '18'), +('6', '96', '8', '111331', '172879', '18'), +('6', '96', '6', '111323', '177232', '18'), +('6', '96', '6', '111326', '175820', '18'), +('6', '96', '6', '111325', '175733', '18'), +('6', '96', '6', '111022', '155382', '18'), +('6', '96', '17', '56045', '114575', '18'), +('6', '96', '17', '56084', '114393', '18'), +('6', '96', '17', '104420', '97463', '18'), +('6', '96', '17', '54855', '72873', '18'), +('6', '96', '7', '56080', '110046', '18'), +('6', '96', '7', '56040', '108903', '18'), +('6', '96', '7', '104418', '93311', '18'), +('6', '96', '7', '54849', '70251', '18'), +('6', '96', '9', '67098', '180026', '18'), +('6', '96', '9', '81764', '106601', '18'), +('6', '96', '9', '56070', '106443', '18'), +('6', '96', '9', '62984', '106240', '18'), +('6', '96', '15', '111350', '178635', '18'), +('6', '96', '15', '111344', '177740', '18'), +('6', '96', '15', '111340', '177098', '18'), +('6', '96', '15', '111346', '176624', '18'), +('6', '96', '20', '111356', '177146', '18'), +('6', '96', '20', '111352', '176481', '18'), +('6', '96', '20', '111351', '173763', '18'), +('6', '96', '20', '111054', '155296', '18'), +('6', '96', '12', '56035', '108353', '18'), +('6', '96', '12', '56074', '107114', '18'), +('6', '96', '12', '104415', '91066', '18'), +('6', '96', '12', '49656', '70133', '18'), +('6', '96', '18', '56041', '113967', '18'), +('6', '96', '18', '62986', '112487', '18'), +('6', '96', '18', '104419', '96348', '18'), +('6', '96', '18', '54851', '71782', '18'), +('6', '96', '19', '81763', '110724', '18'), +('6', '96', '19', '62990', '110408', '18'), +('6', '96', '19', '56037', '110379', '18'), +('6', '96', '19', '56075', '110257', '18'), +('6', '96', '13', '111518', '170596', '18'), +('6', '96', '13', '111517', '168864', '18'), +('6', '96', '13', '111217', '154206', '18'), +('6', '96', '13', '111218', '154154', '18'), +('6', '96', '14', '111537', '177439', '18'), +('6', '96', '14', '111539', '175653', '18'), +('6', '96', '14', '111535', '175265', '18'), +('6', '96', '14', '111237', '155588', '18'), +('6', '96', '11', '111337', '176537', '18'), +('6', '96', '11', '111335', '176492', '18'), +('6', '96', '11', '111338', '172598', '18'), +('6', '96', '11', '111034', '154741', '18'), +('6', '97', '22', '12425', '0', '18'), +('6', '97', '22', '39342', '0', '18'), +('6', '97', '22', '7867', '0', '18'), +('6', '97', '22', '23597', '0', '18'), +('6', '97', '1', '111306', '176770', '18'), +('6', '97', '1', '111304', '176449', '18'), +('6', '97', '1', '111307', '176260', '18'), +('6', '97', '1', '111310', '174993', '18'), +('6', '97', '2', '62988', '110512', '18'), +('6', '97', '2', '62985', '110299', '18'), +('6', '97', '2', '94056', '109961', '18'), +('6', '97', '2', '104417', '93866', '18'), +('6', '97', '3', '111314', '177150', '18'), +('6', '97', '3', '111316', '175438', '18'), +('6', '97', '3', '111315', '174556', '18'), +('6', '97', '3', '111013', '155299', '18'), +('6', '97', '5', '111319', '176503', '18'), +('6', '97', '5', '111321', '176084', '18'), +('6', '97', '5', '111318', '173777', '18'), +('6', '97', '5', '111317', '173502', '18'), +('6', '97', '8', '111332', '177341', '18'), +('6', '97', '8', '111329', '175947', '18'), +('6', '97', '8', '111330', '175176', '18'), +('6', '97', '8', '111331', '172886', '18'), +('6', '97', '6', '111323', '177239', '18'), +('6', '97', '6', '111326', '175829', '18'), +('6', '97', '6', '111325', '175738', '18'), +('6', '97', '6', '111022', '155388', '18'), +('6', '97', '17', '56045', '114579', '18'), +('6', '97', '17', '56084', '114402', '18'), +('6', '97', '17', '104420', '97469', '18'), +('6', '97', '17', '54855', '72880', '18'), +('6', '97', '7', '56080', '110053', '18'), +('6', '97', '7', '56040', '108909', '18'), +('6', '97', '7', '104418', '93319', '18'), +('6', '97', '7', '54849', '70255', '18'), +('6', '97', '9', '67098', '180031', '18'), +('6', '97', '9', '81764', '106611', '18'), +('6', '97', '9', '56070', '106449', '18'), +('6', '97', '9', '62984', '106246', '18'), +('6', '97', '15', '111350', '178643', '18'), +('6', '97', '15', '111344', '177748', '18'), +('6', '97', '15', '111340', '177104', '18'), +('6', '97', '15', '111346', '176629', '18'), +('6', '97', '20', '111356', '177151', '18'), +('6', '97', '20', '111352', '176488', '18'), +('6', '97', '20', '111351', '173770', '18'), +('6', '97', '20', '111054', '155300', '18'), +('6', '97', '12', '56035', '108362', '18'), +('6', '97', '12', '56074', '107120', '18'), +('6', '97', '12', '104415', '91069', '18'), +('6', '97', '12', '49656', '70134', '18'), +('6', '97', '18', '56041', '113973', '18'), +('6', '97', '18', '62986', '112494', '18'), +('6', '97', '18', '104419', '96357', '18'), +('6', '97', '18', '54851', '71790', '18'), +('6', '97', '19', '81763', '110734', '18'), +('6', '97', '19', '62990', '110412', '18'), +('6', '97', '19', '56037', '110386', '18'), +('6', '97', '19', '56075', '110265', '18'), +('6', '97', '13', '111518', '170602', '18'), +('6', '97', '13', '111517', '168870', '18'), +('6', '97', '13', '111217', '154212', '18'), +('6', '97', '13', '111218', '154160', '18'), +('6', '97', '14', '111537', '177446', '18'), +('6', '97', '14', '111539', '175660', '18'), +('6', '97', '14', '111535', '175270', '18'), +('6', '97', '14', '111237', '155594', '18'), +('6', '97', '11', '111337', '176547', '18'), +('6', '97', '11', '111335', '176500', '18'), +('6', '97', '11', '111338', '172603', '18'), +('6', '97', '11', '111034', '154749', '18'), +('6', '98', '22', '12425', '0', '18'), +('6', '98', '22', '39342', '0', '18'), +('6', '98', '22', '7867', '0', '18'), +('6', '98', '22', '23597', '0', '18'), +('6', '98', '1', '111306', '176778', '18'), +('6', '98', '1', '111304', '176456', '18'), +('6', '98', '1', '111307', '176264', '18'), +('6', '98', '1', '111310', '174999', '18'), +('6', '98', '2', '62988', '110516', '18'), +('6', '98', '2', '62985', '110307', '18'), +('6', '98', '2', '94056', '109966', '18'), +('6', '98', '2', '104417', '93869', '18'), +('6', '98', '3', '111314', '177156', '18'), +('6', '98', '3', '111316', '175444', '18'), +('6', '98', '3', '111315', '174562', '18'), +('6', '98', '3', '111013', '155305', '18'), +('6', '98', '5', '111319', '176509', '18'), +('6', '98', '5', '111321', '176091', '18'), +('6', '98', '5', '111318', '173782', '18'), +('6', '98', '5', '111317', '173508', '18'), +('6', '98', '8', '111332', '177348', '18'), +('6', '98', '8', '111329', '175951', '18'), +('6', '98', '8', '111330', '175182', '18'), +('6', '98', '8', '111331', '172894', '18'), +('6', '98', '6', '111323', '177246', '18'), +('6', '98', '6', '111326', '175838', '18'), +('6', '98', '6', '111325', '175743', '18'), +('6', '98', '6', '111022', '155395', '18'), +('6', '98', '17', '56045', '114583', '18'), +('6', '98', '17', '56084', '114411', '18'), +('6', '98', '17', '104420', '97476', '18'), +('6', '98', '17', '54855', '72887', '18'), +('6', '98', '7', '56080', '110061', '18'), +('6', '98', '7', '56040', '108915', '18'), +('6', '98', '7', '104418', '93326', '18'), +('6', '98', '7', '54849', '70258', '18'), +('6', '98', '9', '67098', '180036', '18'), +('6', '98', '9', '81764', '106622', '18'), +('6', '98', '9', '56070', '106455', '18'), +('6', '98', '9', '62984', '106253', '18'), +('6', '98', '15', '111350', '178651', '18'), +('6', '98', '15', '111344', '177757', '18'), +('6', '98', '15', '111340', '177110', '18'), +('6', '98', '15', '111346', '176634', '18'), +('6', '98', '20', '111356', '177156', '18'), +('6', '98', '20', '111352', '176495', '18'), +('6', '98', '20', '111351', '173777', '18'), +('6', '98', '20', '111054', '155305', '18'), +('6', '98', '12', '56035', '108372', '18'), +('6', '98', '12', '56074', '107126', '18'), +('6', '98', '12', '104415', '91072', '18'), +('6', '98', '12', '49656', '70135', '18'), +('6', '98', '18', '56041', '113979', '18'), +('6', '98', '18', '62986', '112502', '18'), +('6', '98', '18', '104419', '96367', '18'), +('6', '98', '18', '54851', '71797', '18'), +('6', '98', '19', '81763', '110744', '18'), +('6', '98', '19', '62990', '110416', '18'), +('6', '98', '19', '56037', '110393', '18'), +('6', '98', '19', '56075', '110272', '18'), +('6', '98', '13', '111518', '170609', '18'), +('6', '98', '13', '111517', '168876', '18'), +('6', '98', '13', '111217', '154218', '18'), +('6', '98', '13', '111218', '154166', '18'), +('6', '98', '14', '111537', '177452', '18'), +('6', '98', '14', '111539', '175668', '18'), +('6', '98', '14', '111535', '175276', '18'), +('6', '98', '14', '111237', '155601', '18'), +('6', '98', '11', '111337', '176556', '18'), +('6', '98', '11', '111335', '176507', '18'), +('6', '98', '11', '111338', '172608', '18'), +('6', '98', '11', '111034', '154757', '18'), +('6', '99', '22', '12425', '0', '18'), +('6', '99', '22', '39342', '0', '18'), +('6', '99', '22', '7867', '0', '18'), +('6', '99', '22', '23597', '0', '18'), +('6', '99', '1', '111306', '176786', '18'), +('6', '99', '1', '111304', '176464', '18'), +('6', '99', '1', '111307', '176267', '18'), +('6', '99', '1', '111310', '175006', '18'), +('6', '99', '2', '62988', '110520', '18'), +('6', '99', '2', '62985', '110315', '18'), +('6', '99', '2', '94056', '109972', '18'), +('6', '99', '2', '104417', '93872', '18'), +('6', '99', '3', '111314', '177162', '18'), +('6', '99', '3', '111316', '175451', '18'), +('6', '99', '3', '111315', '174568', '18'), +('6', '99', '3', '111013', '155312', '18'), +('6', '99', '5', '111319', '176514', '18'), +('6', '99', '5', '111321', '176098', '18'), +('6', '99', '5', '111318', '173787', '18'), +('6', '99', '5', '111317', '173514', '18'), +('6', '99', '8', '111332', '177356', '18'), +('6', '99', '8', '111329', '175955', '18'), +('6', '99', '8', '111330', '175188', '18'), +('6', '99', '8', '111331', '172902', '18'), +('6', '99', '6', '111323', '177252', '18'), +('6', '99', '6', '111326', '175847', '18'), +('6', '99', '6', '111325', '175749', '18'), +('6', '99', '6', '111022', '155402', '18'), +('6', '99', '17', '56045', '114587', '18'), +('6', '99', '17', '56084', '114420', '18'), +('6', '99', '17', '104420', '97482', '18'), +('6', '99', '17', '54855', '72894', '18'), +('6', '99', '7', '56080', '110069', '18'), +('6', '99', '7', '56040', '108921', '18'), +('6', '99', '7', '104418', '93333', '18'), +('6', '99', '7', '54849', '70262', '18'), +('6', '99', '9', '67098', '180042', '18'), +('6', '99', '9', '81764', '106632', '18'), +('6', '99', '9', '56070', '106461', '18'), +('6', '99', '9', '62984', '106259', '18'), +('6', '99', '15', '111350', '178659', '18'), +('6', '99', '15', '111344', '177765', '18'), +('6', '99', '15', '111340', '177117', '18'), +('6', '99', '15', '111346', '176639', '18'), +('6', '99', '20', '111356', '177161', '18'), +('6', '99', '20', '111352', '176501', '18'), +('6', '99', '20', '111351', '173784', '18'), +('6', '99', '20', '111054', '155310', '18'), +('6', '99', '12', '56035', '108381', '18'), +('6', '99', '12', '56074', '107132', '18'), +('6', '99', '12', '104415', '91075', '18'), +('6', '99', '12', '49656', '70136', '18'), +('6', '99', '18', '56041', '113985', '18'), +('6', '99', '18', '62986', '112509', '18'), +('6', '99', '18', '104419', '96377', '18'), +('6', '99', '18', '54851', '71805', '18'), +('6', '99', '19', '81763', '110754', '18'), +('6', '99', '19', '62990', '110421', '18'), +('6', '99', '19', '56037', '110400', '18'), +('6', '99', '19', '56075', '110280', '18'), +('6', '99', '13', '111518', '170615', '18'), +('6', '99', '13', '111517', '168882', '18'), +('6', '99', '13', '111217', '154224', '18'), +('6', '99', '13', '111218', '154173', '18'), +('6', '99', '14', '111537', '177459', '18'), +('6', '99', '14', '111539', '175675', '18'), +('6', '99', '14', '111535', '175282', '18'), +('6', '99', '14', '111237', '155607', '18'), +('6', '99', '11', '111337', '176565', '18'), +('6', '99', '11', '111335', '176515', '18'), +('6', '99', '11', '111338', '172613', '18'), +('6', '99', '11', '111034', '154765', '18'), +('6', '100', '22', '12425', '0', '20'), +('6', '100', '22', '39342', '0', '20'), +('6', '100', '22', '7867', '0', '20'), +('6', '100', '22', '23597', '0', '20'), +('6', '100', '1', '98769', '284214', '20'), +('6', '100', '1', '111306', '176794', '20'), +('6', '100', '1', '111304', '176471', '20'), +('6', '100', '1', '111307', '176271', '20'), +('6', '100', '2', '62988', '110524', '20'), +('6', '100', '2', '62985', '110324', '20'), +('6', '100', '2', '94056', '109977', '20'), +('6', '100', '2', '104417', '93875', '20'), +('6', '100', '3', '111314', '177168', '20'), +('6', '100', '3', '111316', '175457', '20'), +('6', '100', '3', '111315', '174574', '20'), +('6', '100', '3', '111013', '155318', '20'), +('6', '100', '5', '111319', '176520', '20'), +('6', '100', '5', '111321', '176105', '20'), +('6', '100', '5', '111318', '173792', '20'), +('6', '100', '5', '111317', '173520', '20'), +('6', '100', '8', '111332', '177363', '20'), +('6', '100', '8', '111329', '175959', '20'), +('6', '100', '8', '111330', '175194', '20'), +('6', '100', '8', '111331', '172909', '20'), +('6', '100', '6', '111323', '177259', '20'), +('6', '100', '6', '111326', '175856', '20'), +('6', '100', '6', '111325', '175754', '20'), +('6', '100', '6', '111022', '155408', '20'), +('6', '100', '17', '56045', '114591', '20'), +('6', '100', '17', '56084', '114429', '20'), +('6', '100', '17', '104420', '97488', '20'), +('6', '100', '17', '54855', '72901', '20'), +('6', '100', '7', '56080', '110076', '20'), +('6', '100', '7', '56040', '108928', '20'), +('6', '100', '7', '104418', '93341', '20'), +('6', '100', '7', '54849', '70266', '20'), +('6', '100', '9', '67098', '180047', '20'), +('6', '100', '9', '81764', '106642', '20'), +('6', '100', '9', '56070', '106467', '20'), +('6', '100', '9', '62984', '106265', '20'), +('6', '100', '15', '111350', '178667', '20'), +('6', '100', '15', '111344', '177773', '20'), +('6', '100', '15', '111340', '177123', '20'), +('6', '100', '15', '111346', '176643', '20'), +('6', '100', '20', '111356', '177166', '20'), +('6', '100', '20', '111352', '176508', '20'), +('6', '100', '20', '111351', '173791', '20'), +('6', '100', '20', '111054', '155315', '20'), +('6', '100', '12', '56035', '108391', '20'), +('6', '100', '12', '56074', '107138', '20'), +('6', '100', '12', '104415', '91079', '20'), +('6', '100', '12', '49656', '70136', '20'), +('6', '100', '18', '56041', '113992', '20'), +('6', '100', '18', '62986', '112516', '20'), +('6', '100', '18', '104419', '96387', '20'), +('6', '100', '18', '54851', '71812', '20'), +('6', '100', '19', '81763', '110764', '20'), +('6', '100', '19', '62990', '110425', '20'), +('6', '100', '19', '56037', '110408', '20'), +('6', '100', '19', '56075', '110288', '20'), +('6', '100', '13', '111518', '170622', '20'), +('6', '100', '13', '111517', '168889', '20'), +('6', '100', '13', '111217', '154231', '20'), +('6', '100', '13', '111218', '154179', '20'), +('6', '100', '14', '111537', '177466', '20'), +('6', '100', '14', '111539', '175683', '20'), +('6', '100', '14', '111535', '175288', '20'), +('6', '100', '14', '111237', '155614', '20'), +('6', '100', '11', '133816', '229833', '20'), +('6', '100', '11', '111337', '176574', '20'), +('6', '100', '11', '111335', '176523', '20'), +('6', '100', '11', '111338', '172618', '20'), +('6', '100', '22', '12425', '0', '19'), +('6', '100', '22', '39342', '0', '19'), +('6', '100', '22', '7867', '0', '19'), +('6', '100', '22', '23597', '0', '19'), +('6', '100', '1', '98769', '284214', '19'), +('6', '100', '1', '111306', '176794', '19'), +('6', '100', '1', '111304', '176471', '19'), +('6', '100', '1', '111307', '176271', '19'), +('6', '100', '2', '62988', '110524', '19'), +('6', '100', '2', '62985', '110324', '19'), +('6', '100', '2', '94056', '109977', '19'), +('6', '100', '2', '104417', '93875', '19'), +('6', '100', '3', '111314', '177168', '19'), +('6', '100', '3', '111316', '175457', '19'), +('6', '100', '3', '111315', '174574', '19'), +('6', '100', '3', '111013', '155318', '19'), +('6', '100', '5', '111319', '176520', '19'), +('6', '100', '5', '111321', '176105', '19'), +('6', '100', '5', '111318', '173792', '19'), +('6', '100', '5', '111317', '173520', '19'), +('6', '100', '8', '111332', '177363', '19'), +('6', '100', '8', '111329', '175959', '19'), +('6', '100', '8', '111330', '175194', '19'), +('6', '100', '8', '111331', '172909', '19'), +('6', '100', '6', '111323', '177259', '19'), +('6', '100', '6', '111326', '175856', '19'), +('6', '100', '6', '111325', '175754', '19'), +('6', '100', '6', '111022', '155408', '19'), +('6', '100', '17', '56045', '114591', '19'), +('6', '100', '17', '56084', '114429', '19'), +('6', '100', '17', '104420', '97488', '19'), +('6', '100', '17', '54855', '72901', '19'), +('6', '100', '7', '56080', '110076', '19'), +('6', '100', '7', '56040', '108928', '19'), +('6', '100', '7', '104418', '93341', '19'), +('6', '100', '7', '54849', '70266', '19'), +('6', '100', '9', '67098', '180047', '19'), +('6', '100', '9', '81764', '106642', '19'), +('6', '100', '9', '56070', '106467', '19'), +('6', '100', '9', '62984', '106265', '19'), +('6', '100', '15', '111350', '178667', '19'), +('6', '100', '15', '111344', '177773', '19'), +('6', '100', '15', '111340', '177123', '19'), +('6', '100', '15', '111346', '176643', '19'), +('6', '100', '20', '111356', '177166', '19'), +('6', '100', '20', '111352', '176508', '19'), +('6', '100', '20', '111351', '173791', '19'), +('6', '100', '20', '111054', '155315', '19'), +('6', '100', '12', '56035', '108391', '19'), +('6', '100', '12', '56074', '107138', '19'), +('6', '100', '12', '104415', '91079', '19'), +('6', '100', '12', '49656', '70136', '19'), +('6', '100', '18', '56041', '113992', '19'), +('6', '100', '18', '62986', '112516', '19'), +('6', '100', '18', '104419', '96387', '19'), +('6', '100', '18', '54851', '71812', '19'), +('6', '100', '19', '81763', '110764', '19'), +('6', '100', '19', '62990', '110425', '19'), +('6', '100', '19', '56037', '110408', '19'), +('6', '100', '19', '56075', '110288', '19'), +('6', '100', '13', '111518', '170621', '19'), +('6', '100', '13', '111517', '168888', '19'), +('6', '100', '13', '111217', '154230', '19'), +('6', '100', '13', '111218', '154179', '19'), +('6', '100', '14', '111537', '177466', '19'), +('6', '100', '14', '111539', '175683', '19'), +('6', '100', '14', '111535', '175288', '19'), +('6', '100', '14', '111237', '155614', '19'), +('6', '100', '11', '133816', '229833', '19'), +('6', '100', '11', '111337', '176574', '19'), +('6', '100', '11', '111335', '176523', '19'), +('6', '100', '11', '111338', '172618', '19'), +('6', '101', '22', '12425', '0', '20'), +('6', '101', '22', '39342', '0', '20'), +('6', '101', '22', '7867', '0', '20'), +('6', '101', '22', '23597', '0', '20'), +('6', '101', '1', '98769', '284218', '20'), +('6', '101', '1', '111306', '176802', '20'), +('6', '101', '1', '111304', '176479', '20'), +('6', '101', '1', '111307', '176275', '20'), +('6', '101', '2', '62988', '110528', '20'), +('6', '101', '2', '62985', '110332', '20'), +('6', '101', '2', '94056', '109982', '20'), +('6', '101', '2', '104417', '93879', '20'), +('6', '101', '3', '111314', '177175', '20'), +('6', '101', '3', '111316', '175463', '20'), +('6', '101', '3', '111315', '174580', '20'), +('6', '101', '3', '111013', '155324', '20'), +('6', '101', '5', '111319', '176525', '20'), +('6', '101', '5', '111321', '176112', '20'), +('6', '101', '5', '111318', '173797', '20'), +('6', '101', '5', '111317', '173526', '20'), +('6', '101', '8', '111332', '177370', '20'), +('6', '101', '8', '111329', '175963', '20'), +('6', '101', '8', '111330', '175200', '20'), +('6', '101', '8', '111331', '172917', '20'), +('6', '101', '6', '111323', '177265', '20'), +('6', '101', '6', '111326', '175865', '20'), +('6', '101', '6', '111325', '175759', '20'), +('6', '101', '6', '111022', '155415', '20'), +('6', '101', '17', '56045', '114595', '20'), +('6', '101', '17', '56084', '114438', '20'), +('6', '101', '17', '104420', '97494', '20'), +('6', '101', '17', '54855', '72908', '20'), +('6', '101', '7', '56080', '110084', '20'), +('6', '101', '7', '56040', '108934', '20'), +('6', '101', '7', '104418', '93348', '20'), +('6', '101', '7', '54849', '70270', '20'), +('6', '101', '9', '67098', '180053', '20'), +('6', '101', '9', '81764', '106653', '20'), +('6', '101', '9', '56070', '106473', '20'), +('6', '101', '9', '62984', '106271', '20'), +('6', '101', '15', '111350', '178675', '20'), +('6', '101', '15', '111344', '177781', '20'), +('6', '101', '15', '111340', '177129', '20'), +('6', '101', '15', '111346', '176648', '20'), +('6', '101', '20', '111356', '177170', '20'), +('6', '101', '20', '111352', '176514', '20'), +('6', '101', '20', '111351', '173798', '20'), +('6', '101', '20', '111054', '155320', '20'), +('6', '101', '12', '56035', '108400', '20'), +('6', '101', '12', '56074', '107145', '20'), +('6', '101', '12', '104415', '91082', '20'), +('6', '101', '12', '49656', '70137', '20'), +('6', '101', '18', '56041', '113998', '20'), +('6', '101', '18', '62986', '112524', '20'), +('6', '101', '18', '104419', '96396', '20'), +('6', '101', '18', '54851', '71820', '20'), +('6', '101', '19', '81763', '110774', '20'), +('6', '101', '19', '62990', '110429', '20'), +('6', '101', '19', '56037', '110415', '20'), +('6', '101', '19', '56075', '110296', '20'), +('6', '101', '13', '111518', '170628', '20'), +('6', '101', '13', '111517', '168895', '20'), +('6', '101', '13', '111217', '154237', '20'), +('6', '101', '13', '111218', '154186', '20'), +('6', '101', '14', '111537', '177472', '20'), +('6', '101', '14', '111539', '175690', '20'), +('6', '101', '14', '111535', '175294', '20'), +('6', '101', '14', '111237', '155621', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '101', '11', '133816', '229838', '20'), +('6', '101', '11', '111337', '176583', '20'), +('6', '101', '11', '111335', '176531', '20'), +('6', '101', '11', '111338', '172623', '20'), +('6', '102', '22', '12425', '0', '20'), +('6', '102', '22', '39342', '0', '20'), +('6', '102', '22', '7867', '0', '20'), +('6', '102', '22', '23597', '0', '20'), +('6', '102', '1', '98769', '284222', '20'), +('6', '102', '1', '111306', '176811', '20'), +('6', '102', '1', '111304', '176486', '20'), +('6', '102', '1', '111307', '176278', '20'), +('6', '102', '2', '62988', '110532', '20'), +('6', '102', '2', '62985', '110340', '20'), +('6', '102', '2', '94056', '109988', '20'), +('6', '102', '2', '104417', '93882', '20'), +('6', '102', '3', '111314', '177181', '20'), +('6', '102', '3', '111316', '175469', '20'), +('6', '102', '3', '111315', '174587', '20'), +('6', '102', '3', '111013', '155330', '20'), +('6', '102', '5', '111319', '176530', '20'), +('6', '102', '5', '111321', '176120', '20'), +('6', '102', '5', '111318', '173802', '20'), +('6', '102', '5', '111317', '173532', '20'), +('6', '102', '8', '111332', '177377', '20'), +('6', '102', '8', '111329', '175967', '20'), +('6', '102', '8', '111330', '175206', '20'), +('6', '102', '8', '111331', '172924', '20'), +('6', '102', '6', '111323', '177272', '20'), +('6', '102', '6', '111326', '175874', '20'), +('6', '102', '6', '111325', '175765', '20'), +('6', '102', '6', '111022', '155421', '20'), +('6', '102', '17', '56045', '114600', '20'), +('6', '102', '17', '56084', '114447', '20'), +('6', '102', '17', '104420', '97501', '20'), +('6', '102', '17', '54855', '72914', '20'), +('6', '102', '7', '56080', '110091', '20'), +('6', '102', '7', '56040', '108940', '20'), +('6', '102', '7', '104418', '93355', '20'), +('6', '102', '7', '54849', '70274', '20'), +('6', '102', '9', '67098', '180058', '20'), +('6', '102', '9', '81764', '106663', '20'), +('6', '102', '9', '56070', '106480', '20'), +('6', '102', '9', '62984', '106277', '20'), +('6', '102', '15', '111350', '178683', '20'), +('6', '102', '15', '111344', '177789', '20'), +('6', '102', '15', '111340', '177136', '20'), +('6', '102', '15', '111346', '176653', '20'), +('6', '102', '20', '111356', '177175', '20'), +('6', '102', '20', '111352', '176521', '20'), +('6', '102', '20', '111351', '173805', '20'), +('6', '102', '20', '111054', '155325', '20'), +('6', '102', '12', '56035', '108410', '20'), +('6', '102', '12', '56074', '107151', '20'), +('6', '102', '12', '104415', '91085', '20'), +('6', '102', '12', '49656', '70138', '20'), +('6', '102', '18', '56041', '114004', '20'), +('6', '102', '18', '62986', '112531', '20'), +('6', '102', '18', '104419', '96406', '20'), +('6', '102', '18', '54851', '71827', '20'), +('6', '102', '19', '81763', '110784', '20'), +('6', '102', '19', '62990', '110434', '20'), +('6', '102', '19', '56037', '110422', '20'), +('6', '102', '19', '56075', '110304', '20'), +('6', '102', '13', '111518', '170635', '20'), +('6', '102', '13', '111517', '168901', '20'), +('6', '102', '13', '111217', '154243', '20'), +('6', '102', '13', '111218', '154192', '20'), +('6', '102', '14', '111537', '177479', '20'), +('6', '102', '14', '111539', '175698', '20'), +('6', '102', '14', '111535', '175300', '20'), +('6', '102', '14', '111237', '155627', '20'), +('6', '102', '11', '133816', '229843', '20'), +('6', '102', '11', '111337', '176592', '20'), +('6', '102', '11', '111335', '176538', '20'), +('6', '102', '11', '111338', '172628', '20'), +('6', '103', '22', '12425', '0', '20'), +('6', '103', '22', '39342', '0', '20'), +('6', '103', '22', '7867', '0', '20'), +('6', '103', '22', '23597', '0', '20'), +('6', '103', '1', '98769', '284226', '20'), +('6', '103', '1', '111306', '176819', '20'), +('6', '103', '1', '111304', '176494', '20'), +('6', '103', '1', '111307', '176282', '20'), +('6', '103', '2', '62988', '110536', '20'), +('6', '103', '2', '62985', '110349', '20'), +('6', '103', '2', '94056', '109993', '20'), +('6', '103', '2', '104417', '93885', '20'), +('6', '103', '3', '111314', '177187', '20'), +('6', '103', '3', '111316', '175475', '20'), +('6', '103', '3', '111315', '174593', '20'), +('6', '103', '3', '111013', '155336', '20'), +('6', '103', '5', '111319', '176536', '20'), +('6', '103', '5', '111321', '176127', '20'), +('6', '103', '5', '111318', '173807', '20'), +('6', '103', '5', '111317', '173538', '20'), +('6', '103', '8', '111332', '177384', '20'), +('6', '103', '8', '111329', '175971', '20'), +('6', '103', '8', '111330', '175212', '20'), +('6', '103', '8', '111331', '172932', '20'), +('6', '103', '6', '111323', '177278', '20'), +('6', '103', '6', '111326', '175882', '20'), +('6', '103', '6', '111325', '175770', '20'), +('6', '103', '6', '111022', '155428', '20'), +('6', '103', '17', '56045', '114604', '20'), +('6', '103', '17', '56084', '114456', '20'), +('6', '103', '17', '104420', '97507', '20'), +('6', '103', '17', '54855', '72921', '20'), +('6', '103', '7', '56080', '110099', '20'), +('6', '103', '7', '56040', '108946', '20'), +('6', '103', '7', '104418', '93362', '20'), +('6', '103', '7', '54849', '70277', '20'), +('6', '103', '9', '67098', '180063', '20'), +('6', '103', '9', '81764', '106673', '20'), +('6', '103', '9', '56070', '106486', '20'), +('6', '103', '9', '62984', '106284', '20'), +('6', '103', '15', '111350', '178691', '20'), +('6', '103', '15', '111344', '177797', '20'), +('6', '103', '15', '111340', '177142', '20'), +('6', '103', '15', '111346', '176658', '20'), +('6', '103', '20', '111356', '177180', '20'), +('6', '103', '20', '111352', '176527', '20'), +('6', '103', '20', '111351', '173812', '20'), +('6', '103', '20', '111054', '155329', '20'), +('6', '103', '12', '56035', '108419', '20'), +('6', '103', '12', '56074', '107157', '20'), +('6', '103', '12', '104415', '91088', '20'), +('6', '103', '12', '49656', '70139', '20'), +('6', '103', '18', '56041', '114010', '20'), +('6', '103', '18', '62986', '112539', '20'), +('6', '103', '18', '104419', '96416', '20'), +('6', '103', '18', '54851', '71835', '20'), +('6', '103', '19', '81763', '110794', '20'), +('6', '103', '19', '62990', '110438', '20'), +('6', '103', '19', '56037', '110429', '20'), +('6', '103', '19', '56075', '110312', '20'), +('6', '103', '13', '111518', '170641', '20'), +('6', '103', '13', '111517', '168907', '20'), +('6', '103', '13', '111217', '154249', '20'), +('6', '103', '13', '111218', '154198', '20'), +('6', '103', '14', '111537', '177485', '20'), +('6', '103', '14', '111539', '175705', '20'), +('6', '103', '14', '111535', '175306', '20'), +('6', '103', '14', '111237', '155634', '20'), +('6', '103', '11', '133816', '229848', '20'), +('6', '103', '11', '111337', '176601', '20'), +('6', '103', '11', '111335', '176546', '20'), +('6', '103', '11', '111338', '172633', '20'), +('6', '104', '22', '12425', '0', '20'), +('6', '104', '22', '39342', '0', '20'), +('6', '104', '22', '7867', '0', '20'), +('6', '104', '22', '23597', '0', '20'), +('6', '104', '1', '98769', '284230', '20'), +('6', '104', '1', '111306', '176827', '20'), +('6', '104', '1', '111304', '176501', '20'), +('6', '104', '1', '111307', '176285', '20'), +('6', '104', '2', '62988', '110540', '20'), +('6', '104', '2', '62985', '110357', '20'), +('6', '104', '2', '94056', '109998', '20'), +('6', '104', '2', '104417', '93888', '20'), +('6', '104', '3', '111314', '177193', '20'), +('6', '104', '3', '111316', '175481', '20'), +('6', '104', '3', '111315', '174599', '20'), +('6', '104', '3', '111013', '155342', '20'), +('6', '104', '5', '111319', '176541', '20'), +('6', '104', '5', '111321', '176134', '20'), +('6', '104', '5', '111318', '173812', '20'), +('6', '104', '5', '111317', '173544', '20'), +('6', '104', '8', '111332', '177391', '20'), +('6', '104', '8', '111329', '175975', '20'), +('6', '104', '8', '111330', '175218', '20'), +('6', '104', '8', '111331', '172939', '20'), +('6', '104', '6', '111323', '177285', '20'), +('6', '104', '6', '111326', '175891', '20'), +('6', '104', '6', '111325', '175775', '20'), +('6', '104', '6', '111022', '155434', '20'), +('6', '104', '17', '56045', '114608', '20'), +('6', '104', '17', '56084', '114465', '20'), +('6', '104', '17', '104420', '97513', '20'), +('6', '104', '17', '54855', '72928', '20'), +('6', '104', '7', '56080', '110106', '20'), +('6', '104', '7', '56040', '108952', '20'), +('6', '104', '7', '104418', '93370', '20'), +('6', '104', '7', '54849', '70281', '20'), +('6', '104', '9', '67098', '180069', '20'), +('6', '104', '9', '81764', '106683', '20'), +('6', '104', '9', '56070', '106492', '20'), +('6', '104', '9', '62984', '106290', '20'), +('6', '104', '15', '111350', '178699', '20'), +('6', '104', '15', '111344', '177805', '20'), +('6', '104', '15', '111340', '177148', '20'), +('6', '104', '15', '111346', '176662', '20'), +('6', '104', '20', '111356', '177185', '20'), +('6', '104', '20', '111352', '176534', '20'), +('6', '104', '20', '111351', '173818', '20'), +('6', '104', '20', '111054', '155334', '20'), +('6', '104', '12', '56035', '108429', '20'), +('6', '104', '12', '56074', '107163', '20'), +('6', '104', '12', '104415', '91091', '20'), +('6', '104', '12', '49656', '70140', '20'), +('6', '104', '18', '56041', '114016', '20'), +('6', '104', '18', '62986', '112546', '20'), +('6', '104', '18', '104419', '96426', '20'), +('6', '104', '18', '54851', '71842', '20'), +('6', '104', '19', '81763', '110804', '20'), +('6', '104', '19', '62990', '110443', '20'), +('6', '104', '19', '56037', '110436', '20'), +('6', '104', '19', '56075', '110320', '20'), +('6', '104', '13', '111518', '170648', '20'), +('6', '104', '13', '111517', '168914', '20'), +('6', '104', '13', '111217', '154255', '20'), +('6', '104', '13', '111218', '154204', '20'), +('6', '104', '14', '111537', '177492', '20'), +('6', '104', '14', '111539', '175713', '20'), +('6', '104', '14', '111535', '175312', '20'), +('6', '104', '14', '111237', '155640', '20'), +('6', '104', '11', '133816', '229853', '20'), +('6', '104', '11', '111337', '176611', '20'), +('6', '104', '11', '111335', '176554', '20'), +('6', '104', '11', '111338', '172638', '20'), +('6', '105', '22', '12425', '0', '23'), +('6', '105', '22', '39342', '0', '23'), +('6', '105', '22', '7867', '0', '23'), +('6', '105', '22', '23597', '0', '23'), +('6', '105', '1', '98769', '284235', '23'), +('6', '105', '1', '111306', '176835', '23'), +('6', '105', '1', '111304', '176509', '23'), +('6', '105', '1', '111307', '176289', '23'), +('6', '105', '2', '62988', '110544', '23'), +('6', '105', '2', '62985', '110365', '23'), +('6', '105', '2', '94056', '110004', '23'), +('6', '105', '2', '104417', '93891', '23'), +('6', '105', '3', '111314', '177199', '23'), +('6', '105', '3', '111316', '175487', '23'), +('6', '105', '3', '111315', '174605', '23'), +('6', '105', '3', '111013', '155349', '23'), +('6', '105', '5', '111319', '176547', '23'), +('6', '105', '5', '111321', '176141', '23'), +('6', '105', '5', '111318', '173818', '23'), +('6', '105', '5', '111317', '173550', '23'), +('6', '105', '8', '111332', '177398', '23'), +('6', '105', '8', '111329', '175979', '23'), +('6', '105', '8', '111330', '175225', '23'), +('6', '105', '8', '111331', '172947', '23'), +('6', '105', '6', '111323', '177292', '23'), +('6', '105', '6', '111326', '175900', '23'), +('6', '105', '6', '111325', '175781', '23'), +('6', '105', '6', '111022', '155441', '23'), +('6', '105', '17', '56045', '114612', '23'), +('6', '105', '17', '56084', '114474', '23'), +('6', '105', '17', '104420', '97519', '23'), +('6', '105', '17', '54855', '72935', '23'), +('6', '105', '7', '56080', '110114', '23'), +('6', '105', '7', '56040', '108958', '23'), +('6', '105', '7', '104418', '93377', '23'), +('6', '105', '7', '54849', '70285', '23'), +('6', '105', '9', '67098', '180074', '23'), +('6', '105', '9', '81764', '106694', '23'), +('6', '105', '9', '56070', '106498', '23'), +('6', '105', '9', '62984', '106296', '23'), +('6', '105', '15', '111350', '178707', '23'), +('6', '105', '15', '111344', '177814', '23'), +('6', '105', '15', '111340', '177155', '23'), +('6', '105', '15', '111346', '176667', '23'), +('6', '105', '20', '111356', '177190', '23'), +('6', '105', '20', '111352', '176540', '23'), +('6', '105', '20', '111351', '173825', '23'), +('6', '105', '20', '111054', '155339', '23'), +('6', '105', '12', '56035', '108438', '23'), +('6', '105', '12', '56074', '107169', '23'), +('6', '105', '12', '104415', '91095', '23'), +('6', '105', '12', '49656', '70141', '23'), +('6', '105', '18', '56041', '114022', '23'), +('6', '105', '18', '62986', '112554', '23'), +('6', '105', '18', '104419', '96435', '23'), +('6', '105', '18', '54851', '71850', '23'), +('6', '105', '19', '81763', '110814', '23'), +('6', '105', '19', '62990', '110447', '23'), +('6', '105', '19', '56037', '110443', '23'), +('6', '105', '19', '56075', '110328', '23'), +('6', '105', '13', '111518', '170654', '23'), +('6', '105', '13', '111517', '168920', '23'), +('6', '105', '13', '111217', '154261', '23'), +('6', '105', '13', '111218', '154211', '23'), +('6', '105', '14', '111537', '177498', '23'), +('6', '105', '14', '111539', '175720', '23'), +('6', '105', '14', '111535', '175318', '23'), +('6', '105', '14', '111237', '155647', '23'), +('6', '105', '11', '133816', '229858', '23'), +('6', '105', '11', '111337', '176620', '23'), +('6', '105', '11', '111335', '176562', '23'), +('6', '105', '11', '111338', '172643', '23'), +('6', '105', '22', '12425', '0', '22'), +('6', '105', '22', '39342', '0', '22'), +('6', '105', '22', '7867', '0', '22'), +('6', '105', '22', '23597', '0', '22'), +('6', '105', '1', '98769', '284235', '22'), +('6', '105', '1', '111306', '176835', '22'), +('6', '105', '1', '111304', '176509', '22'), +('6', '105', '1', '111307', '176289', '22'), +('6', '105', '2', '62988', '110544', '22'), +('6', '105', '2', '62985', '110365', '22'), +('6', '105', '2', '94056', '110004', '22'), +('6', '105', '2', '104417', '93891', '22'), +('6', '105', '3', '111314', '177199', '22'), +('6', '105', '3', '111316', '175487', '22'), +('6', '105', '3', '111315', '174605', '22'), +('6', '105', '3', '111013', '155349', '22'), +('6', '105', '5', '111319', '176547', '22'), +('6', '105', '5', '111321', '176141', '22'), +('6', '105', '5', '111318', '173818', '22'), +('6', '105', '5', '111317', '173550', '22'), +('6', '105', '8', '111332', '177398', '22'), +('6', '105', '8', '111329', '175979', '22'), +('6', '105', '8', '111330', '175225', '22'), +('6', '105', '8', '111331', '172947', '22'), +('6', '105', '6', '111323', '177292', '22'), +('6', '105', '6', '111326', '175900', '22'), +('6', '105', '6', '111325', '175781', '22'), +('6', '105', '6', '111022', '155441', '22'), +('6', '105', '17', '56045', '114612', '22'), +('6', '105', '17', '56084', '114474', '22'), +('6', '105', '17', '104420', '97519', '22'), +('6', '105', '17', '54855', '72935', '22'), +('6', '105', '7', '56080', '110114', '22'), +('6', '105', '7', '56040', '108958', '22'), +('6', '105', '7', '104418', '93377', '22'), +('6', '105', '7', '54849', '70285', '22'), +('6', '105', '9', '67098', '180074', '22'), +('6', '105', '9', '81764', '106694', '22'), +('6', '105', '9', '56070', '106498', '22'), +('6', '105', '9', '62984', '106296', '22'), +('6', '105', '15', '111350', '178707', '22'), +('6', '105', '15', '111344', '177814', '22'), +('6', '105', '15', '111340', '177155', '22'), +('6', '105', '15', '111346', '176667', '22'), +('6', '105', '20', '111356', '177190', '22'), +('6', '105', '20', '111352', '176540', '22'), +('6', '105', '20', '111351', '173825', '22'), +('6', '105', '20', '111054', '155339', '22'), +('6', '105', '12', '56035', '108438', '22'), +('6', '105', '12', '56074', '107169', '22'), +('6', '105', '12', '104415', '91095', '22'), +('6', '105', '12', '49656', '70141', '22'), +('6', '105', '18', '56041', '114022', '22'), +('6', '105', '18', '62986', '112554', '22'), +('6', '105', '18', '104419', '96435', '22'), +('6', '105', '18', '54851', '71850', '22'), +('6', '105', '19', '81763', '110814', '22'), +('6', '105', '19', '62990', '110447', '22'), +('6', '105', '19', '56037', '110443', '22'), +('6', '105', '19', '56075', '110328', '22'), +('6', '105', '13', '111518', '170654', '22'), +('6', '105', '13', '111517', '168920', '22'), +('6', '105', '13', '111217', '154261', '22'), +('6', '105', '13', '111218', '154211', '22'), +('6', '105', '14', '111537', '177498', '22'), +('6', '105', '14', '111539', '175720', '22'), +('6', '105', '14', '111535', '175318', '22'), +('6', '105', '14', '111237', '155647', '22'), +('6', '105', '11', '133816', '229858', '22'), +('6', '105', '11', '111337', '176620', '22'), +('6', '105', '11', '111335', '176562', '22'), +('6', '105', '11', '111338', '172643', '22'), +('6', '105', '22', '12425', '0', '21'), +('6', '105', '22', '39342', '0', '21'), +('6', '105', '22', '7867', '0', '21'), +('6', '105', '22', '23597', '0', '21'), +('6', '105', '1', '98769', '284235', '21'), +('6', '105', '1', '111306', '176835', '21'), +('6', '105', '1', '111304', '176509', '21'), +('6', '105', '1', '111307', '176289', '21'), +('6', '105', '2', '62988', '110544', '21'), +('6', '105', '2', '62985', '110365', '21'), +('6', '105', '2', '94056', '110004', '21'), +('6', '105', '2', '104417', '93891', '21'), +('6', '105', '3', '111314', '177199', '21'), +('6', '105', '3', '111316', '175487', '21'), +('6', '105', '3', '111315', '174605', '21'), +('6', '105', '3', '111013', '155349', '21'), +('6', '105', '5', '111319', '176547', '21'), +('6', '105', '5', '111321', '176141', '21'), +('6', '105', '5', '111318', '173818', '21'), +('6', '105', '5', '111317', '173550', '21'), +('6', '105', '8', '111332', '177398', '21'), +('6', '105', '8', '111329', '175979', '21'), +('6', '105', '8', '111330', '175225', '21'), +('6', '105', '8', '111331', '172947', '21'), +('6', '105', '6', '111323', '177292', '21'), +('6', '105', '6', '111326', '175900', '21'), +('6', '105', '6', '111325', '175781', '21'), +('6', '105', '6', '111022', '155441', '21'), +('6', '105', '17', '56045', '114612', '21'), +('6', '105', '17', '56084', '114474', '21'), +('6', '105', '17', '104420', '97519', '21'), +('6', '105', '17', '54855', '72935', '21'), +('6', '105', '7', '56080', '110114', '21'), +('6', '105', '7', '56040', '108958', '21'), +('6', '105', '7', '104418', '93377', '21'), +('6', '105', '7', '54849', '70285', '21'), +('6', '105', '9', '67098', '180074', '21'), +('6', '105', '9', '81764', '106694', '21'), +('6', '105', '9', '56070', '106498', '21'), +('6', '105', '9', '62984', '106296', '21'), +('6', '105', '15', '111350', '178707', '21'), +('6', '105', '15', '111344', '177814', '21'), +('6', '105', '15', '111340', '177155', '21'), +('6', '105', '15', '111346', '176667', '21'), +('6', '105', '20', '111356', '177190', '21'), +('6', '105', '20', '111352', '176540', '21'), +('6', '105', '20', '111351', '173825', '21'), +('6', '105', '20', '111054', '155339', '21'), +('6', '105', '12', '56035', '108438', '21'), +('6', '105', '12', '56074', '107169', '21'), +('6', '105', '12', '104415', '91095', '21'), +('6', '105', '12', '49656', '70141', '21'), +('6', '105', '18', '56041', '114022', '21'), +('6', '105', '18', '62986', '112554', '21'), +('6', '105', '18', '104419', '96435', '21'), +('6', '105', '18', '54851', '71850', '21'), +('6', '105', '19', '81763', '110814', '21'), +('6', '105', '19', '62990', '110447', '21'), +('6', '105', '19', '56037', '110443', '21'), +('6', '105', '19', '56075', '110328', '21'), +('6', '105', '13', '111518', '170654', '21'), +('6', '105', '13', '111517', '168920', '21'), +('6', '105', '13', '111217', '154261', '21'), +('6', '105', '13', '111218', '154211', '21'), +('6', '105', '14', '111537', '177498', '21'), +('6', '105', '14', '111539', '175720', '21'), +('6', '105', '14', '111535', '175318', '21'), +('6', '105', '14', '111237', '155647', '21'), +('6', '105', '11', '133816', '229858', '21'), +('6', '105', '11', '111337', '176620', '21'), +('6', '105', '11', '111335', '176562', '21'), +('6', '105', '11', '111338', '172643', '21'), +('6', '106', '22', '12425', '0', '23'), +('6', '106', '22', '39342', '0', '23'), +('6', '106', '22', '7867', '0', '23'), +('6', '106', '22', '23597', '0', '23'), +('6', '106', '1', '98769', '284239', '23'), +('6', '106', '1', '111306', '176843', '23'), +('6', '106', '1', '111304', '176516', '23'), +('6', '106', '1', '111307', '176293', '23'), +('6', '106', '2', '62988', '110548', '23'), +('6', '106', '2', '62985', '110373', '23'), +('6', '106', '2', '94056', '110009', '23'), +('6', '106', '2', '104417', '93894', '23'), +('6', '106', '3', '111314', '177205', '23'), +('6', '106', '3', '111316', '175494', '23'), +('6', '106', '3', '111315', '174612', '23'), +('6', '106', '3', '111013', '155355', '23'), +('6', '106', '5', '111319', '176552', '23'), +('6', '106', '5', '111321', '176148', '23'), +('6', '106', '5', '111318', '173823', '23'), +('6', '106', '5', '111317', '173556', '23'), +('6', '106', '8', '111332', '177405', '23'), +('6', '106', '8', '111329', '175983', '23'), +('6', '106', '8', '111330', '175231', '23'), +('6', '106', '8', '111331', '172955', '23'), +('6', '106', '6', '111323', '177298', '23'), +('6', '106', '6', '111326', '175909', '23'), +('6', '106', '6', '111325', '175786', '23'), +('6', '106', '6', '111022', '155448', '23'), +('6', '106', '17', '56045', '114616', '23'), +('6', '106', '17', '56084', '114484', '23'), +('6', '106', '17', '104420', '97525', '23'), +('6', '106', '17', '54855', '72942', '23'), +('6', '106', '7', '56080', '110121', '23'), +('6', '106', '7', '56040', '108965', '23'), +('6', '106', '7', '104418', '93384', '23'), +('6', '106', '7', '54849', '70289', '23'), +('6', '106', '9', '67098', '180079', '23'), +('6', '106', '9', '81764', '106704', '23'), +('6', '106', '9', '56070', '106504', '23'), +('6', '106', '9', '62984', '106302', '23'), +('6', '106', '15', '111350', '178715', '23'), +('6', '106', '15', '111344', '177822', '23'), +('6', '106', '15', '111340', '177161', '23'), +('6', '106', '15', '111346', '176672', '23'), +('6', '106', '20', '111356', '177195', '23'), +('6', '106', '20', '111352', '176547', '23'), +('6', '106', '20', '111351', '173832', '23'), +('6', '106', '20', '111054', '155344', '23'), +('6', '106', '12', '56035', '108448', '23'), +('6', '106', '12', '56074', '107175', '23'), +('6', '106', '12', '104415', '91098', '23'), +('6', '106', '12', '49656', '70141', '23'), +('6', '106', '18', '56041', '114028', '23'), +('6', '106', '18', '62986', '112561', '23'), +('6', '106', '18', '104419', '96445', '23'), +('6', '106', '18', '54851', '71857', '23'), +('6', '106', '19', '81763', '110823', '23'), +('6', '106', '19', '62990', '110451', '23'), +('6', '106', '19', '56037', '110450', '23'), +('6', '106', '19', '56075', '110336', '23'), +('6', '106', '13', '111518', '170661', '23'), +('6', '106', '13', '111517', '168926', '23'), +('6', '106', '13', '111217', '154267', '23'), +('6', '106', '13', '111218', '154217', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '106', '14', '111537', '177505', '23'), +('6', '106', '14', '111539', '175728', '23'), +('6', '106', '14', '111535', '175324', '23'), +('6', '106', '14', '111237', '155653', '23'), +('6', '106', '11', '133816', '229863', '23'), +('6', '106', '11', '111337', '176629', '23'), +('6', '106', '11', '111335', '176569', '23'), +('6', '106', '11', '111338', '172648', '23'), +('6', '107', '22', '12425', '0', '23'), +('6', '107', '22', '39342', '0', '23'), +('6', '107', '22', '7867', '0', '23'), +('6', '107', '22', '23597', '0', '23'), +('6', '107', '1', '98769', '284243', '23'), +('6', '107', '1', '111306', '176851', '23'), +('6', '107', '1', '111304', '176524', '23'), +('6', '107', '1', '111307', '176296', '23'), +('6', '107', '2', '62988', '110552', '23'), +('6', '107', '2', '62985', '110382', '23'), +('6', '107', '2', '94056', '110014', '23'), +('6', '107', '2', '104417', '93897', '23'), +('6', '107', '3', '111314', '177212', '23'), +('6', '107', '3', '111316', '175500', '23'), +('6', '107', '3', '111315', '174618', '23'), +('6', '107', '3', '111013', '155361', '23'), +('6', '107', '5', '111319', '176557', '23'), +('6', '107', '5', '111321', '176155', '23'), +('6', '107', '5', '111318', '173828', '23'), +('6', '107', '5', '111317', '173562', '23'), +('6', '107', '8', '111332', '177412', '23'), +('6', '107', '8', '111329', '175987', '23'), +('6', '107', '8', '111330', '175237', '23'), +('6', '107', '8', '111331', '172962', '23'), +('6', '107', '6', '111323', '177305', '23'), +('6', '107', '6', '111326', '175918', '23'), +('6', '107', '6', '111325', '175791', '23'), +('6', '107', '6', '111022', '155454', '23'), +('6', '107', '17', '56045', '114620', '23'), +('6', '107', '17', '56084', '114493', '23'), +('6', '107', '17', '104420', '97532', '23'), +('6', '107', '17', '54855', '72949', '23'), +('6', '107', '7', '56080', '110129', '23'), +('6', '107', '7', '56040', '108971', '23'), +('6', '107', '7', '104418', '93392', '23'), +('6', '107', '7', '54849', '70292', '23'), +('6', '107', '9', '67098', '180085', '23'), +('6', '107', '9', '81764', '106714', '23'), +('6', '107', '9', '56070', '106510', '23'), +('6', '107', '9', '62984', '106309', '23'), +('6', '107', '15', '111350', '178723', '23'), +('6', '107', '15', '111344', '177830', '23'), +('6', '107', '15', '111340', '177167', '23'), +('6', '107', '15', '111346', '176677', '23'), +('6', '107', '20', '111356', '177199', '23'), +('6', '107', '20', '111352', '176554', '23'), +('6', '107', '20', '111351', '173839', '23'), +('6', '107', '20', '111054', '155349', '23'), +('6', '107', '12', '56035', '108457', '23'), +('6', '107', '12', '56074', '107181', '23'), +('6', '107', '12', '104415', '91101', '23'), +('6', '107', '12', '49656', '70142', '23'), +('6', '107', '18', '56041', '114034', '23'), +('6', '107', '18', '62986', '112568', '23'), +('6', '107', '18', '104419', '96455', '23'), +('6', '107', '18', '54851', '71865', '23'), +('6', '107', '19', '81763', '110833', '23'), +('6', '107', '19', '56037', '110458', '23'), +('6', '107', '19', '62990', '110456', '23'), +('6', '107', '19', '56075', '110344', '23'), +('6', '107', '13', '111518', '170667', '23'), +('6', '107', '13', '111517', '168932', '23'), +('6', '107', '13', '111217', '154273', '23'), +('6', '107', '13', '111218', '154223', '23'), +('6', '107', '14', '111537', '177512', '23'), +('6', '107', '14', '111539', '175736', '23'), +('6', '107', '14', '111535', '175330', '23'), +('6', '107', '14', '111237', '155660', '23'), +('6', '107', '11', '133816', '229868', '23'), +('6', '107', '11', '111337', '176638', '23'), +('6', '107', '11', '111335', '176577', '23'), +('6', '107', '11', '111338', '172653', '23'), +('6', '108', '22', '12425', '0', '23'), +('6', '108', '22', '39342', '0', '23'), +('6', '108', '22', '7867', '0', '23'), +('6', '108', '22', '23597', '0', '23'), +('6', '108', '1', '98769', '284247', '23'), +('6', '108', '1', '111306', '176859', '23'), +('6', '108', '1', '111304', '176531', '23'), +('6', '108', '1', '111307', '176300', '23'), +('6', '108', '2', '62988', '110556', '23'), +('6', '108', '2', '62985', '110390', '23'), +('6', '108', '2', '94056', '110020', '23'), +('6', '108', '2', '104417', '93901', '23'), +('6', '108', '3', '111314', '177218', '23'), +('6', '108', '3', '111316', '175506', '23'), +('6', '108', '3', '111315', '174624', '23'), +('6', '108', '3', '111013', '155367', '23'), +('6', '108', '5', '111319', '176563', '23'), +('6', '108', '5', '111321', '176162', '23'), +('6', '108', '5', '111318', '173833', '23'), +('6', '108', '5', '111317', '173568', '23'), +('6', '108', '8', '111332', '177420', '23'), +('6', '108', '8', '111329', '175991', '23'), +('6', '108', '8', '111330', '175243', '23'), +('6', '108', '8', '111331', '172970', '23'), +('6', '108', '6', '111323', '177311', '23'), +('6', '108', '6', '111326', '175927', '23'), +('6', '108', '6', '111325', '175797', '23'), +('6', '108', '6', '111022', '155461', '23'), +('6', '108', '17', '56045', '114624', '23'), +('6', '108', '17', '56084', '114502', '23'), +('6', '108', '17', '104420', '97538', '23'), +('6', '108', '17', '54855', '72955', '23'), +('6', '108', '7', '56080', '110137', '23'), +('6', '108', '7', '56040', '108977', '23'), +('6', '108', '7', '104418', '93399', '23'), +('6', '108', '7', '54849', '70296', '23'), +('6', '108', '9', '67098', '180090', '23'), +('6', '108', '9', '81764', '106725', '23'), +('6', '108', '9', '56070', '106516', '23'), +('6', '108', '9', '62984', '106315', '23'), +('6', '108', '15', '111350', '178731', '23'), +('6', '108', '15', '111344', '177838', '23'), +('6', '108', '15', '111340', '177174', '23'), +('6', '108', '15', '111346', '176681', '23'), +('6', '108', '20', '111356', '177204', '23'), +('6', '108', '20', '111352', '176560', '23'), +('6', '108', '20', '111351', '173846', '23'), +('6', '108', '20', '111054', '155354', '23'), +('6', '108', '12', '56035', '108467', '23'), +('6', '108', '12', '56074', '107187', '23'), +('6', '108', '12', '104415', '91104', '23'), +('6', '108', '12', '49656', '70143', '23'), +('6', '108', '18', '56041', '114040', '23'), +('6', '108', '18', '62986', '112576', '23'), +('6', '108', '18', '104419', '96465', '23'), +('6', '108', '18', '54851', '71872', '23'), +('6', '108', '19', '81763', '110843', '23'), +('6', '108', '19', '56037', '110465', '23'), +('6', '108', '19', '62990', '110460', '23'), +('6', '108', '19', '56075', '110352', '23'), +('6', '108', '13', '111518', '170674', '23'), +('6', '108', '13', '111517', '168938', '23'), +('6', '108', '13', '111217', '154279', '23'), +('6', '108', '13', '111218', '154229', '23'), +('6', '108', '14', '111537', '177518', '23'), +('6', '108', '14', '111539', '175743', '23'), +('6', '108', '14', '111535', '175336', '23'), +('6', '108', '14', '111237', '155667', '23'), +('6', '108', '11', '133816', '229873', '23'), +('6', '108', '11', '111337', '176647', '23'), +('6', '108', '11', '111335', '176585', '23'), +('6', '108', '11', '111338', '172658', '23'), +('6', '109', '22', '12425', '0', '23'), +('6', '109', '22', '39342', '0', '23'), +('6', '109', '22', '7867', '0', '23'), +('6', '109', '22', '23597', '0', '23'), +('6', '109', '1', '98769', '284251', '23'), +('6', '109', '1', '111306', '176868', '23'), +('6', '109', '1', '111304', '176539', '23'), +('6', '109', '1', '111307', '176303', '23'), +('6', '109', '2', '62988', '110560', '23'), +('6', '109', '2', '62985', '110398', '23'), +('6', '109', '2', '94056', '110025', '23'), +('6', '109', '2', '104417', '93904', '23'), +('6', '109', '3', '111314', '177224', '23'), +('6', '109', '3', '111316', '175512', '23'), +('6', '109', '3', '111315', '174630', '23'), +('6', '109', '3', '111013', '155373', '23'), +('6', '109', '5', '111319', '176568', '23'), +('6', '109', '5', '111321', '176170', '23'), +('6', '109', '5', '111318', '173838', '23'), +('6', '109', '5', '111317', '173574', '23'), +('6', '109', '8', '111332', '177427', '23'), +('6', '109', '8', '111329', '175995', '23'), +('6', '109', '8', '111330', '175249', '23'), +('6', '109', '8', '111331', '172977', '23'), +('6', '109', '6', '111323', '177318', '23'), +('6', '109', '6', '111326', '175936', '23'), +('6', '109', '6', '111325', '175802', '23'), +('6', '109', '6', '111022', '155467', '23'), +('6', '109', '17', '56045', '114629', '23'), +('6', '109', '17', '56084', '114511', '23'), +('6', '109', '17', '104420', '97544', '23'), +('6', '109', '17', '54855', '72962', '23'), +('6', '109', '7', '56080', '110144', '23'), +('6', '109', '7', '56040', '108983', '23'), +('6', '109', '7', '104418', '93406', '23'), +('6', '109', '7', '54849', '70300', '23'), +('6', '109', '9', '67098', '180095', '23'), +('6', '109', '9', '81764', '106735', '23'), +('6', '109', '9', '56070', '106522', '23'), +('6', '109', '9', '62984', '106321', '23'), +('6', '109', '15', '111350', '178739', '23'), +('6', '109', '15', '111344', '177846', '23'), +('6', '109', '15', '111340', '177180', '23'), +('6', '109', '15', '111346', '176686', '23'), +('6', '109', '20', '111356', '177209', '23'), +('6', '109', '20', '111352', '176567', '23'), +('6', '109', '20', '111351', '173853', '23'), +('6', '109', '20', '111054', '155359', '23'), +('6', '109', '12', '56035', '108476', '23'), +('6', '109', '12', '56074', '107193', '23'), +('6', '109', '12', '104415', '91107', '23'), +('6', '109', '12', '49656', '70144', '23'), +('6', '109', '18', '56041', '114046', '23'), +('6', '109', '18', '62986', '112583', '23'), +('6', '109', '18', '104419', '96474', '23'), +('6', '109', '18', '54851', '71880', '23'), +('6', '109', '19', '81763', '110853', '23'), +('6', '109', '19', '56037', '110472', '23'), +('6', '109', '19', '62990', '110464', '23'), +('6', '109', '19', '56075', '110360', '23'), +('6', '109', '13', '111518', '170680', '23'), +('6', '109', '13', '111517', '168944', '23'), +('6', '109', '13', '111217', '154285', '23'), +('6', '109', '13', '111218', '154236', '23'), +('6', '109', '14', '111537', '177525', '23'), +('6', '109', '14', '111539', '175751', '23'), +('6', '109', '14', '111535', '175342', '23'), +('6', '109', '14', '111237', '155673', '23'), +('6', '109', '11', '133816', '229877', '23'), +('6', '109', '11', '111337', '176656', '23'), +('6', '109', '11', '111335', '176592', '23'), +('6', '109', '11', '111338', '172663', '23'), +('6', '110', '22', '39342', '0', '25'), +('6', '110', '22', '7867', '0', '25'), +('6', '110', '22', '23597', '0', '25'), +('6', '110', '22', '53550', '0', '25'), +('6', '110', '1', '98769', '284255', '25'), +('6', '110', '1', '111306', '176876', '25'), +('6', '110', '1', '111304', '176546', '25'), +('6', '110', '1', '111307', '176307', '25'), +('6', '110', '2', '62988', '110564', '25'), +('6', '110', '2', '62985', '110407', '25'), +('6', '110', '2', '94056', '110030', '25'), +('6', '110', '2', '104417', '93907', '25'), +('6', '110', '3', '111314', '177230', '25'), +('6', '110', '3', '111316', '175518', '25'), +('6', '110', '3', '111315', '174637', '25'), +('6', '110', '3', '111013', '155379', '25'), +('6', '110', '5', '111319', '176574', '25'), +('6', '110', '5', '111321', '176177', '25'), +('6', '110', '5', '111318', '173843', '25'), +('6', '110', '5', '111317', '173580', '25'), +('6', '110', '8', '111332', '177434', '25'), +('6', '110', '8', '111329', '175999', '25'), +('6', '110', '8', '111330', '175255', '25'), +('6', '110', '8', '111331', '172985', '25'), +('6', '110', '6', '111323', '177324', '25'), +('6', '110', '6', '111326', '175945', '25'), +('6', '110', '6', '111325', '175807', '25'), +('6', '110', '6', '111022', '155474', '25'), +('6', '110', '17', '56045', '114633', '25'), +('6', '110', '17', '56084', '114520', '25'), +('6', '110', '17', '104420', '97550', '25'), +('6', '110', '17', '54855', '72969', '25'), +('6', '110', '7', '56080', '110152', '25'), +('6', '110', '7', '56040', '108989', '25'), +('6', '110', '7', '104418', '93414', '25'), +('6', '110', '7', '54849', '70304', '25'), +('6', '110', '9', '67098', '180101', '25'), +('6', '110', '9', '81764', '106745', '25'), +('6', '110', '9', '56070', '106528', '25'), +('6', '110', '9', '62984', '106327', '25'), +('6', '110', '15', '111350', '178747', '25'), +('6', '110', '15', '111344', '177854', '25'), +('6', '110', '15', '111340', '177186', '25'), +('6', '110', '15', '111346', '176691', '25'), +('6', '110', '20', '111356', '177214', '25'), +('6', '110', '20', '111352', '176573', '25'), +('6', '110', '20', '111351', '173860', '25'), +('6', '110', '20', '111054', '155363', '25'), +('6', '110', '12', '56035', '108486', '25'), +('6', '110', '12', '56074', '107199', '25'), +('6', '110', '12', '104415', '91111', '25'), +('6', '110', '12', '49656', '70145', '25'), +('6', '110', '18', '56041', '114052', '25'), +('6', '110', '18', '62986', '112591', '25'), +('6', '110', '18', '104419', '96484', '25'), +('6', '110', '18', '54851', '71887', '25'), +('6', '110', '19', '81763', '110863', '25'), +('6', '110', '19', '56037', '110479', '25'), +('6', '110', '19', '62990', '110469', '25'), +('6', '110', '19', '56075', '110368', '25'), +('6', '110', '13', '111518', '170687', '25'), +('6', '110', '13', '111517', '168951', '25'), +('6', '110', '13', '111217', '154292', '25'), +('6', '110', '13', '111218', '154242', '25'), +('6', '110', '14', '111537', '177531', '25'), +('6', '110', '14', '111539', '175758', '25'), +('6', '110', '14', '111535', '175348', '25'), +('6', '110', '14', '111237', '155680', '25'), +('6', '110', '11', '85213', '257050', '25'), +('6', '110', '11', '133816', '229882', '25'), +('6', '110', '11', '111337', '176665', '25'), +('6', '110', '11', '111335', '176600', '25'), +('6', '110', '22', '39342', '0', '24'), +('6', '110', '22', '7867', '0', '24'), +('6', '110', '22', '23597', '0', '24'), +('6', '110', '22', '53550', '0', '24'), +('6', '110', '1', '98769', '284255', '24'), +('6', '110', '1', '111306', '176876', '24'), +('6', '110', '1', '111304', '176546', '24'), +('6', '110', '1', '111307', '176307', '24'), +('6', '110', '2', '62988', '110564', '24'), +('6', '110', '2', '62985', '110407', '24'), +('6', '110', '2', '94056', '110030', '24'), +('6', '110', '2', '104417', '93907', '24'), +('6', '110', '3', '111314', '177230', '24'), +('6', '110', '3', '111316', '175518', '24'), +('6', '110', '3', '111315', '174637', '24'), +('6', '110', '3', '111013', '155379', '24'), +('6', '110', '5', '111319', '176574', '24'), +('6', '110', '5', '111321', '176177', '24'), +('6', '110', '5', '111318', '173843', '24'), +('6', '110', '5', '111317', '173580', '24'), +('6', '110', '8', '111332', '177434', '24'), +('6', '110', '8', '111329', '175999', '24'), +('6', '110', '8', '111330', '175255', '24'), +('6', '110', '8', '111331', '172985', '24'), +('6', '110', '6', '111323', '177324', '24'), +('6', '110', '6', '111326', '175945', '24'), +('6', '110', '6', '111325', '175807', '24'), +('6', '110', '6', '111022', '155474', '24'), +('6', '110', '17', '56045', '114633', '24'), +('6', '110', '17', '56084', '114520', '24'), +('6', '110', '17', '104420', '97550', '24'), +('6', '110', '17', '54855', '72969', '24'), +('6', '110', '7', '56080', '110152', '24'), +('6', '110', '7', '56040', '108989', '24'), +('6', '110', '7', '104418', '93414', '24'), +('6', '110', '7', '54849', '70304', '24'), +('6', '110', '9', '67098', '180101', '24'), +('6', '110', '9', '81764', '106745', '24'), +('6', '110', '9', '56070', '106528', '24'), +('6', '110', '9', '62984', '106327', '24'), +('6', '110', '15', '111350', '178747', '24'), +('6', '110', '15', '111344', '177854', '24'), +('6', '110', '15', '111340', '177186', '24'), +('6', '110', '15', '111346', '176691', '24'), +('6', '110', '20', '111356', '177214', '24'), +('6', '110', '20', '111352', '176573', '24'), +('6', '110', '20', '111351', '173860', '24'), +('6', '110', '20', '111054', '155363', '24'), +('6', '110', '12', '56035', '108486', '24'), +('6', '110', '12', '56074', '107199', '24'), +('6', '110', '12', '104415', '91111', '24'), +('6', '110', '12', '49656', '70145', '24'), +('6', '110', '18', '56041', '114052', '24'), +('6', '110', '18', '62986', '112591', '24'), +('6', '110', '18', '104419', '96484', '24'), +('6', '110', '18', '54851', '71887', '24'), +('6', '110', '19', '81763', '110863', '24'), +('6', '110', '19', '56037', '110479', '24'), +('6', '110', '19', '62990', '110469', '24'), +('6', '110', '19', '56075', '110368', '24'), +('6', '110', '13', '111518', '170687', '24'), +('6', '110', '13', '111517', '168951', '24'), +('6', '110', '13', '111217', '154292', '24'), +('6', '110', '13', '111218', '154242', '24'), +('6', '110', '14', '111537', '177531', '24'), +('6', '110', '14', '111539', '175758', '24'), +('6', '110', '14', '111535', '175348', '24'), +('6', '110', '14', '111237', '155680', '24'), +('6', '110', '11', '85213', '257050', '24'), +('6', '110', '11', '133816', '229882', '24'), +('6', '110', '11', '111337', '176665', '24'), +('6', '110', '11', '111335', '176600', '24'), +('6', '111', '22', '39342', '0', '25'), +('6', '111', '22', '7867', '0', '25'), +('6', '111', '22', '23597', '0', '25'), +('6', '111', '22', '53550', '0', '25'), +('6', '111', '1', '98769', '284259', '25'), +('6', '111', '1', '111306', '176884', '25'), +('6', '111', '1', '111304', '176554', '25'), +('6', '111', '1', '111307', '176311', '25'), +('6', '111', '2', '62988', '110568', '25'), +('6', '111', '2', '62985', '110415', '25'), +('6', '111', '2', '94056', '110036', '25'), +('6', '111', '2', '104417', '93910', '25'), +('6', '111', '3', '111314', '177236', '25'), +('6', '111', '3', '111316', '175524', '25'), +('6', '111', '3', '111315', '174643', '25'), +('6', '111', '3', '111013', '155386', '25'), +('6', '111', '5', '111319', '176579', '25'), +('6', '111', '5', '111321', '176184', '25'), +('6', '111', '5', '111318', '173848', '25'), +('6', '111', '5', '111317', '173586', '25'), +('6', '111', '8', '111332', '177441', '25'), +('6', '111', '8', '111329', '176003', '25'), +('6', '111', '8', '111330', '175261', '25'), +('6', '111', '8', '111331', '172992', '25'), +('6', '111', '6', '111323', '177331', '25'), +('6', '111', '6', '111326', '175954', '25'), +('6', '111', '6', '111325', '175813', '25'), +('6', '111', '6', '111022', '155481', '25'), +('6', '111', '17', '56045', '114637', '25'), +('6', '111', '17', '56084', '114529', '25'), +('6', '111', '17', '104420', '97557', '25'), +('6', '111', '17', '54855', '72976', '25'), +('6', '111', '7', '56080', '110159', '25'), +('6', '111', '7', '56040', '108995', '25'), +('6', '111', '7', '104418', '93421', '25'), +('6', '111', '7', '54849', '70308', '25'), +('6', '111', '9', '67098', '180106', '25'), +('6', '111', '9', '81764', '106756', '25'), +('6', '111', '9', '56070', '106534', '25'), +('6', '111', '9', '62984', '106334', '25'), +('6', '111', '15', '111350', '178755', '25'), +('6', '111', '15', '111344', '177862', '25'), +('6', '111', '15', '111340', '177193', '25'), +('6', '111', '15', '111346', '176696', '25'), +('6', '111', '20', '111356', '177219', '25'), +('6', '111', '20', '111352', '176580', '25'), +('6', '111', '20', '111351', '173867', '25'), +('6', '111', '20', '111054', '155368', '25'), +('6', '111', '12', '56035', '108495', '25'), +('6', '111', '12', '56074', '107205', '25'), +('6', '111', '12', '104415', '91114', '25'), +('6', '111', '12', '49656', '70145', '25'), +('6', '111', '18', '56041', '114058', '25'), +('6', '111', '18', '62986', '112598', '25'), +('6', '111', '18', '104419', '96494', '25'), +('6', '111', '18', '54851', '71895', '25'), +('6', '111', '19', '81763', '110873', '25'), +('6', '111', '19', '56037', '110486', '25'), +('6', '111', '19', '62990', '110473', '25'), +('6', '111', '19', '56075', '110376', '25'), +('6', '111', '13', '111518', '170694', '25'), +('6', '111', '13', '111517', '168957', '25'), +('6', '111', '13', '111217', '154298', '25'), +('6', '111', '13', '111218', '154249', '25'), +('6', '111', '14', '111537', '177538', '25'), +('6', '111', '14', '111539', '175766', '25'), +('6', '111', '14', '111535', '175354', '25'), +('6', '111', '14', '111237', '155686', '25'), +('6', '111', '11', '85213', '257054', '25'), +('6', '111', '11', '133816', '229887', '25'), +('6', '111', '11', '111337', '176675', '25'), +('6', '111', '11', '111335', '176608', '25'), +('6', '112', '22', '39342', '0', '25'), +('6', '112', '22', '7867', '0', '25'), +('6', '112', '22', '23597', '0', '25'), +('6', '112', '22', '53550', '0', '25'), +('6', '112', '1', '98769', '284263', '25'), +('6', '112', '1', '111306', '176892', '25'), +('6', '112', '1', '111304', '176561', '25'), +('6', '112', '1', '111307', '176314', '25'), +('6', '112', '2', '62988', '110572', '25'), +('6', '112', '2', '62985', '110423', '25'), +('6', '112', '2', '94056', '110041', '25'), +('6', '112', '2', '104417', '93913', '25'), +('6', '112', '3', '111314', '177242', '25'), +('6', '112', '3', '111316', '175531', '25'), +('6', '112', '3', '111315', '174649', '25'), +('6', '112', '3', '111013', '155392', '25'), +('6', '112', '5', '111319', '176584', '25'), +('6', '112', '5', '111321', '176191', '25'), +('6', '112', '5', '111318', '173853', '25'), +('6', '112', '5', '111317', '173592', '25'), +('6', '112', '8', '111332', '177448', '25'), +('6', '112', '8', '111329', '176007', '25'), +('6', '112', '8', '111330', '175267', '25'), +('6', '112', '8', '111331', '173000', '25'), +('6', '112', '6', '111323', '177338', '25'), +('6', '112', '6', '111326', '175963', '25'), +('6', '112', '6', '111325', '175818', '25'), +('6', '112', '6', '111022', '155487', '25'), +('6', '112', '17', '56045', '114641', '25'), +('6', '112', '17', '56084', '114538', '25'), +('6', '112', '17', '104420', '97563', '25'), +('6', '112', '17', '54855', '72983', '25'), +('6', '112', '7', '56080', '110167', '25'), +('6', '112', '7', '56040', '109002', '25'), +('6', '112', '7', '104418', '93428', '25'), +('6', '112', '7', '54849', '70311', '25'), +('6', '112', '9', '67098', '180111', '25'), +('6', '112', '9', '81764', '106766', '25'), +('6', '112', '9', '56070', '106540', '25'), +('6', '112', '9', '62984', '106340', '25'), +('6', '112', '15', '111350', '178763', '25'), +('6', '112', '15', '111344', '177870', '25'), +('6', '112', '15', '111340', '177199', '25'), +('6', '112', '15', '111346', '176700', '25'), +('6', '112', '20', '111356', '177224', '25'), +('6', '112', '20', '111352', '176586', '25'), +('6', '112', '20', '111351', '173874', '25'), +('6', '112', '20', '111054', '155373', '25'), +('6', '112', '12', '56035', '108505', '25'), +('6', '112', '12', '56074', '107212', '25'), +('6', '112', '12', '104415', '91117', '25'), +('6', '112', '12', '49656', '70146', '25'), +('6', '112', '18', '56041', '114064', '25'), +('6', '112', '18', '62986', '112606', '25'), +('6', '112', '18', '104419', '96504', '25'), +('6', '112', '18', '54851', '71903', '25'), +('6', '112', '19', '81763', '110883', '25'), +('6', '112', '19', '56037', '110493', '25'), +('6', '112', '19', '62990', '110477', '25'), +('6', '112', '19', '56075', '110384', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('6', '112', '13', '111518', '170700', '25'), +('6', '112', '13', '111517', '168963', '25'), +('6', '112', '13', '111217', '154304', '25'), +('6', '112', '13', '111218', '154255', '25'), +('6', '112', '14', '111537', '177544', '25'), +('6', '112', '14', '111539', '175773', '25'), +('6', '112', '14', '111535', '175360', '25'), +('6', '112', '14', '111237', '155693', '25'), +('6', '112', '11', '85213', '257058', '25'), +('6', '112', '11', '133816', '229892', '25'), +('6', '112', '11', '111337', '176684', '25'), +('6', '112', '11', '111335', '176616', '25'), +('6', '113', '22', '39342', '0', '25'), +('6', '113', '22', '7867', '0', '25'), +('6', '113', '22', '23597', '0', '25'), +('6', '113', '22', '53550', '0', '25'), +('6', '113', '1', '98769', '284267', '25'), +('6', '113', '1', '111306', '176900', '25'), +('6', '113', '1', '111304', '176569', '25'), +('6', '113', '1', '111307', '176318', '25'), +('6', '113', '2', '62988', '110576', '25'), +('6', '113', '2', '62985', '110431', '25'), +('6', '113', '2', '94056', '110046', '25'), +('6', '113', '2', '104417', '93916', '25'), +('6', '113', '3', '111314', '177249', '25'), +('6', '113', '3', '111316', '175537', '25'), +('6', '113', '3', '111315', '174655', '25'), +('6', '113', '3', '111013', '155398', '25'), +('6', '113', '5', '111319', '176590', '25'), +('6', '113', '5', '111321', '176198', '25'), +('6', '113', '5', '111318', '173859', '25'), +('6', '113', '5', '111317', '173597', '25'), +('6', '113', '8', '111332', '177455', '25'), +('6', '113', '8', '111329', '176011', '25'), +('6', '113', '8', '111330', '175274', '25'), +('6', '113', '8', '111331', '173008', '25'), +('6', '113', '6', '111323', '177344', '25'), +('6', '113', '6', '111326', '175972', '25'), +('6', '113', '6', '111325', '175823', '25'), +('6', '113', '6', '111022', '155494', '25'), +('6', '113', '17', '56045', '114645', '25'), +('6', '113', '17', '56084', '114547', '25'), +('6', '113', '17', '104420', '97569', '25'), +('6', '113', '17', '54855', '72990', '25'), +('6', '113', '7', '56080', '110174', '25'), +('6', '113', '7', '56040', '109008', '25'), +('6', '113', '7', '104418', '93435', '25'), +('6', '113', '7', '54849', '70315', '25'), +('6', '113', '9', '67098', '180117', '25'), +('6', '113', '9', '81764', '106776', '25'), +('6', '113', '9', '56070', '106546', '25'), +('6', '113', '9', '62984', '106346', '25'), +('6', '113', '15', '111350', '178771', '25'), +('6', '113', '15', '111344', '177879', '25'), +('6', '113', '15', '111340', '177205', '25'), +('6', '113', '15', '111346', '176705', '25'), +('6', '113', '20', '111356', '177229', '25'), +('6', '113', '20', '111352', '176593', '25'), +('6', '113', '20', '111351', '173880', '25'), +('6', '113', '20', '111054', '155378', '25'), +('6', '113', '12', '56035', '108514', '25'), +('6', '113', '12', '56074', '107218', '25'), +('6', '113', '12', '104415', '91120', '25'), +('6', '113', '12', '49656', '70147', '25'), +('6', '113', '18', '56041', '114070', '25'), +('6', '113', '18', '62986', '112613', '25'), +('6', '113', '18', '104419', '96513', '25'), +('6', '113', '18', '54851', '71910', '25'), +('6', '113', '19', '81763', '110893', '25'), +('6', '113', '19', '56037', '110501', '25'), +('6', '113', '19', '62990', '110482', '25'), +('6', '113', '19', '56075', '110392', '25'), +('6', '113', '13', '111518', '170707', '25'), +('6', '113', '13', '111517', '168969', '25'), +('6', '113', '13', '111217', '154310', '25'), +('6', '113', '13', '111218', '154261', '25'), +('6', '113', '14', '111537', '177551', '25'), +('6', '113', '14', '111539', '175781', '25'), +('6', '113', '14', '111535', '175366', '25'), +('6', '113', '14', '111237', '155699', '25'), +('6', '113', '11', '85213', '257062', '25'), +('6', '113', '11', '133816', '229897', '25'), +('6', '113', '11', '111337', '176693', '25'), +('6', '113', '11', '111335', '176623', '25'), +('6', '114', '22', '39342', '0', '25'), +('6', '114', '22', '7867', '0', '25'), +('6', '114', '22', '23597', '0', '25'), +('6', '114', '22', '53550', '0', '25'), +('6', '114', '1', '98769', '284272', '25'), +('6', '114', '1', '111306', '176908', '25'), +('6', '114', '1', '111304', '176576', '25'), +('6', '114', '1', '111307', '176322', '25'), +('6', '114', '2', '62988', '110580', '25'), +('6', '114', '2', '62985', '110440', '25'), +('6', '114', '2', '94056', '110052', '25'), +('6', '114', '2', '104417', '93919', '25'), +('6', '114', '3', '111314', '177255', '25'), +('6', '114', '3', '111316', '175543', '25'), +('6', '114', '3', '111315', '174661', '25'), +('6', '114', '3', '111013', '155404', '25'), +('6', '114', '5', '111319', '176595', '25'), +('6', '114', '5', '111321', '176205', '25'), +('6', '114', '5', '111318', '173864', '25'), +('6', '114', '5', '111317', '173603', '25'), +('6', '114', '8', '111332', '177462', '25'), +('6', '114', '8', '111329', '176015', '25'), +('6', '114', '8', '111330', '175280', '25'), +('6', '114', '8', '111331', '173015', '25'), +('6', '114', '6', '111323', '177351', '25'), +('6', '114', '6', '111326', '175981', '25'), +('6', '114', '6', '111325', '175829', '25'), +('6', '114', '6', '111022', '155500', '25'), +('6', '114', '17', '56045', '114649', '25'), +('6', '114', '17', '56084', '114556', '25'), +('6', '114', '17', '104420', '97575', '25'), +('6', '114', '17', '54855', '72997', '25'), +('6', '114', '7', '56080', '110182', '25'), +('6', '114', '7', '56040', '109014', '25'), +('6', '114', '7', '104418', '93443', '25'), +('6', '114', '7', '54849', '70319', '25'), +('6', '114', '9', '67098', '180122', '25'), +('6', '114', '9', '81764', '106786', '25'), +('6', '114', '9', '56070', '106552', '25'), +('6', '114', '9', '62984', '106352', '25'), +('6', '114', '15', '111350', '178779', '25'), +('6', '114', '15', '111344', '177887', '25'), +('6', '114', '15', '111340', '177212', '25'), +('6', '114', '15', '111346', '176710', '25'), +('6', '114', '20', '111356', '177233', '25'), +('6', '114', '20', '111352', '176600', '25'), +('6', '114', '20', '111351', '173887', '25'), +('6', '114', '20', '111054', '155383', '25'), +('6', '114', '12', '56035', '108524', '25'), +('6', '114', '12', '56074', '107224', '25'), +('6', '114', '12', '104415', '91123', '25'), +('6', '114', '12', '49656', '70148', '25'), +('6', '114', '18', '56041', '114076', '25'), +('6', '114', '18', '62986', '112620', '25'), +('6', '114', '18', '104419', '96523', '25'), +('6', '114', '18', '54851', '71918', '25'), +('6', '114', '19', '81763', '110903', '25'), +('6', '114', '19', '56037', '110508', '25'), +('6', '114', '19', '62990', '110486', '25'), +('6', '114', '19', '56075', '110400', '25'), +('6', '114', '13', '111518', '170713', '25'), +('6', '114', '13', '111517', '168975', '25'), +('6', '114', '13', '111217', '154316', '25'), +('6', '114', '13', '111218', '154267', '25'), +('6', '114', '14', '111537', '177558', '25'), +('6', '114', '14', '111539', '175788', '25'), +('6', '114', '14', '111535', '175372', '25'), +('6', '114', '14', '111237', '155706', '25'), +('6', '114', '11', '85213', '257066', '25'), +('6', '114', '11', '133816', '229902', '25'), +('6', '114', '11', '111337', '176702', '25'), +('6', '114', '11', '111335', '176631', '25'), +('6', '115', '22', '39342', '0', '26'), +('6', '115', '22', '7867', '0', '26'), +('6', '115', '22', '23597', '0', '26'), +('6', '115', '22', '53550', '0', '26'), +('6', '115', '1', '98769', '284276', '26'), +('6', '115', '1', '111306', '176916', '26'), +('6', '115', '1', '111304', '176584', '26'), +('6', '115', '1', '111307', '176325', '26'), +('6', '115', '2', '62988', '110584', '26'), +('6', '115', '2', '62985', '110448', '26'), +('6', '115', '2', '94056', '110057', '26'), +('6', '115', '2', '104417', '93923', '26'), +('6', '115', '3', '111314', '177261', '26'), +('6', '115', '3', '111316', '175549', '26'), +('6', '115', '3', '111315', '174668', '26'), +('6', '115', '3', '111013', '155410', '26'), +('6', '115', '5', '111319', '176601', '26'), +('6', '115', '5', '111321', '176212', '26'), +('6', '115', '5', '111318', '173869', '26'), +('6', '115', '5', '111317', '173609', '26'), +('6', '115', '8', '111332', '177469', '26'), +('6', '115', '8', '111329', '176019', '26'), +('6', '115', '8', '111330', '175286', '26'), +('6', '115', '8', '111331', '173023', '26'), +('6', '115', '6', '111323', '177357', '26'), +('6', '115', '6', '111326', '175990', '26'), +('6', '115', '6', '111325', '175834', '26'), +('6', '115', '6', '111022', '155507', '26'), +('6', '115', '17', '56045', '114653', '26'), +('6', '115', '17', '56084', '114565', '26'), +('6', '115', '17', '104420', '97581', '26'), +('6', '115', '17', '54855', '73003', '26'), +('6', '115', '7', '56080', '110189', '26'), +('6', '115', '7', '56040', '109020', '26'), +('6', '115', '7', '104418', '93450', '26'), +('6', '115', '7', '54849', '70323', '26'), +('6', '115', '9', '67098', '180127', '26'), +('6', '115', '9', '81764', '106797', '26'), +('6', '115', '9', '56070', '106558', '26'), +('6', '115', '9', '62984', '106358', '26'), +('6', '115', '15', '111350', '178787', '26'), +('6', '115', '15', '111344', '177895', '26'), +('6', '115', '15', '111340', '177218', '26'), +('6', '115', '15', '111346', '176714', '26'), +('6', '115', '20', '111356', '177238', '26'), +('6', '115', '20', '111352', '176606', '26'), +('6', '115', '20', '111351', '173894', '26'), +('6', '115', '20', '111054', '155388', '26'), +('6', '115', '12', '56035', '108533', '26'), +('6', '115', '12', '56074', '107230', '26'), +('6', '115', '12', '104415', '91127', '26'), +('6', '115', '12', '49656', '70149', '26'), +('6', '115', '18', '56041', '114082', '26'), +('6', '115', '18', '62986', '112628', '26'), +('6', '115', '18', '104419', '96533', '26'), +('6', '115', '18', '54851', '71925', '26'), +('6', '115', '19', '81763', '110913', '26'), +('6', '115', '19', '56037', '110515', '26'), +('6', '115', '19', '62990', '110490', '26'), +('6', '115', '19', '56075', '110408', '26'), +('6', '115', '13', '111518', '170719', '26'), +('6', '115', '13', '111517', '168982', '26'), +('6', '115', '13', '111217', '154322', '26'), +('6', '115', '13', '111218', '154274', '26'), +('6', '115', '14', '111537', '177564', '26'), +('6', '115', '14', '111539', '175796', '26'), +('6', '115', '14', '111535', '175378', '26'), +('6', '115', '14', '111237', '155713', '26'), +('6', '115', '11', '85213', '257071', '26'), +('6', '115', '11', '133816', '229907', '26'), +('6', '115', '11', '111337', '176711', '26'), +('6', '115', '11', '111335', '176639', '26'), +('7', '1', '22', '9246', '0', '0'), +('7', '1', '22', '10323', '0', '0'), +('7', '1', '22', '21509', '0', '0'), +('7', '1', '22', '8332', '0', '0'), +('7', '1', '1', '14701', '4052', '0'), +('7', '1', '1', '14702', '2850', '0'), +('7', '1', '1', '10165', '1638', '0'), +('7', '1', '1', '30361', '1140', '0'), +('7', '1', '2', '10142', '3012', '0'), +('7', '1', '2', '4504', '2158', '0'), +('7', '1', '2', '1405', '1810', '0'), +('7', '1', '2', '2191', '1592', '0'), +('7', '1', '3', '10144', '1206', '0'), +('7', '1', '3', '2403', '1146', '0'), +('7', '1', '3', '14705', '990', '0'), +('7', '1', '3', '14706', '990', '0'), +('7', '1', '5', '14703', '6050', '0'), +('7', '1', '5', '14700', '3753', '0'), +('7', '1', '5', '10055', '3505', '0'), +('7', '1', '5', '2583', '2444', '0'), +('7', '1', '8', '11621', '14377', '0'), +('7', '1', '8', '11562', '9310', '0'), +('7', '1', '8', '27714', '7607', '0'), +('7', '1', '8', '1546', '6920', '0'), +('7', '1', '6', '1557', '6760', '0'), +('7', '1', '6', '1283', '2986', '0'), +('7', '1', '6', '11561', '2022', '0'), +('7', '1', '6', '25062', '768', '0'), +('7', '1', '17', '12256', '7630', '0'), +('7', '1', '17', '1201', '2467', '0'), +('7', '1', '17', '2348', '1785', '0'), +('7', '1', '17', '2341', '1646', '0'), +('7', '1', '7', '2458', '2406', '0'), +('7', '1', '7', '1361', '1764', '0'), +('7', '1', '7', '2342', '1615', '0'), +('7', '1', '7', '1202', '1374', '0'), +('7', '1', '9', '27714', '7607', '0'), +('7', '1', '9', '14650', '1952', '0'), +('7', '1', '9', '10360', '1351', '0'), +('7', '1', '9', '1203', '1143', '0'), +('7', '1', '15', '10366', '8163', '0'), +('7', '1', '15', '10151', '7200', '0'), +('7', '1', '15', '14679', '6255', '0'), +('7', '1', '15', '14678', '5104', '0'), +('7', '1', '20', '11698', '9997', '0'), +('7', '1', '20', '11601', '7505', '0'), +('7', '1', '20', '2917', '5211', '0'), +('7', '1', '20', '1365', '4200', '0'), +('7', '1', '12', '2923', '3654', '0'), +('7', '1', '12', '11624', '2315', '0'), +('7', '1', '12', '1204', '1396', '0'), +('7', '1', '12', '29682', '1143', '0'), +('7', '1', '18', '2461', '2557', '0'), +('7', '1', '18', '1205', '1056', '0'), +('7', '1', '18', '25725', '978', '0'), +('7', '1', '18', '2343', '785', '0'), +('7', '1', '19', '1280', '3540', '0'), +('7', '1', '19', '68239', '1360', '0'), +('7', '1', '19', '1206', '1328', '0'), +('7', '1', '19', '25726', '791', '0'), +('7', '1', '13', '27715', '25245', '0'), +('7', '1', '13', '6502', '17425', '0'), +('7', '1', '13', '71308', '7822', '0'), +('7', '1', '13', '6691', '7373', '0'), +('7', '1', '14', '27715', '25245', '0'), +('7', '1', '14', '6502', '17425', '0'), +('7', '1', '14', '11644', '11154', '0'), +('7', '1', '14', '71308', '7822', '0'), +('7', '1', '11', '14762', '854', '0'), +('7', '1', '11', '13748', '489', '0'), +('7', '1', '11', '9246', '453', '0'), +('7', '1', '11', '20677', '69', '0'), +('7', '2', '22', '9246', '0', '0'), +('7', '2', '22', '10323', '0', '0'), +('7', '2', '22', '21509', '0', '0'), +('7', '2', '22', '8332', '0', '0'), +('7', '2', '1', '14701', '4052', '0'), +('7', '2', '1', '14702', '2850', '0'), +('7', '2', '1', '10165', '1638', '0'), +('7', '2', '1', '30361', '1140', '0'), +('7', '2', '2', '10142', '3012', '0'), +('7', '2', '2', '4504', '2158', '0'), +('7', '2', '2', '1405', '1810', '0'), +('7', '2', '2', '2191', '1592', '0'), +('7', '2', '3', '10144', '1206', '0'), +('7', '2', '3', '2403', '1146', '0'), +('7', '2', '3', '14705', '990', '0'), +('7', '2', '3', '14706', '990', '0'), +('7', '2', '5', '14703', '6050', '0'), +('7', '2', '5', '14700', '3753', '0'), +('7', '2', '5', '10055', '3505', '0'), +('7', '2', '5', '2583', '2444', '0'), +('7', '2', '8', '11621', '14377', '0'), +('7', '2', '8', '11562', '9310', '0'), +('7', '2', '8', '27714', '7633', '0'), +('7', '2', '8', '1546', '6920', '0'), +('7', '2', '6', '1557', '6760', '0'), +('7', '2', '6', '1283', '2986', '0'), +('7', '2', '6', '11561', '2047', '0'), +('7', '2', '6', '25062', '768', '0'), +('7', '2', '17', '12256', '7649', '0'), +('7', '2', '17', '1201', '2467', '0'), +('7', '2', '17', '2348', '1803', '0'), +('7', '2', '17', '2341', '1646', '0'), +('7', '2', '7', '2458', '2406', '0'), +('7', '2', '7', '1361', '1764', '0'), +('7', '2', '7', '2342', '1626', '0'), +('7', '2', '7', '1202', '1407', '0'), +('7', '2', '9', '27714', '7633', '0'), +('7', '2', '9', '14650', '1952', '0'), +('7', '2', '9', '10360', '1351', '0'), +('7', '2', '9', '1203', '1161', '0'), +('7', '2', '15', '10366', '8163', '0'), +('7', '2', '15', '10151', '7200', '0'), +('7', '2', '15', '14679', '6255', '0'), +('7', '2', '15', '14678', '5104', '0'), +('7', '2', '20', '11698', '9997', '0'), +('7', '2', '20', '11601', '7541', '0'), +('7', '2', '20', '2917', '5211', '0'), +('7', '2', '20', '1365', '4200', '0'), +('7', '2', '12', '2923', '3654', '0'), +('7', '2', '12', '11624', '2340', '0'), +('7', '2', '12', '1204', '1396', '0'), +('7', '2', '12', '29682', '1143', '0'), +('7', '2', '18', '2461', '2557', '0'), +('7', '2', '18', '1205', '1056', '0'), +('7', '2', '18', '25725', '978', '0'), +('7', '2', '18', '2343', '785', '0'), +('7', '2', '19', '1280', '3540', '0'), +('7', '2', '19', '1206', '1361', '0'), +('7', '2', '19', '68239', '1360', '0'), +('7', '2', '19', '25726', '791', '0'), +('7', '2', '13', '27715', '25245', '0'), +('7', '2', '13', '6502', '17425', '0'), +('7', '2', '13', '71308', '7822', '0'), +('7', '2', '13', '6691', '7373', '0'), +('7', '2', '14', '27715', '25245', '0'), +('7', '2', '14', '6502', '17425', '0'), +('7', '2', '14', '11644', '11154', '0'), +('7', '2', '14', '71308', '7822', '0'), +('7', '2', '11', '14762', '854', '0'), +('7', '2', '11', '13748', '489', '0'), +('7', '2', '11', '9246', '453', '0'), +('7', '2', '11', '20677', '69', '0'), +('7', '3', '22', '9246', '0', '0'), +('7', '3', '22', '10323', '0', '0'), +('7', '3', '22', '21509', '0', '0'), +('7', '3', '22', '8332', '0', '0'), +('7', '3', '1', '14701', '4052', '0'), +('7', '3', '1', '14702', '2850', '0'), +('7', '3', '1', '10165', '1638', '0'), +('7', '3', '1', '30361', '1140', '0'), +('7', '3', '2', '10142', '3012', '0'), +('7', '3', '2', '4504', '2158', '0'), +('7', '3', '2', '1405', '1810', '0'), +('7', '3', '2', '2191', '1592', '0'), +('7', '3', '3', '10144', '1206', '0'), +('7', '3', '3', '2403', '1146', '0'), +('7', '3', '3', '14705', '990', '0'), +('7', '3', '3', '14706', '990', '0'), +('7', '3', '5', '14703', '6050', '0'), +('7', '3', '5', '14700', '3753', '0'), +('7', '3', '5', '10055', '3505', '0'), +('7', '3', '5', '2583', '2444', '0'), +('7', '3', '8', '11621', '14377', '0'), +('7', '3', '8', '11562', '9310', '0'), +('7', '3', '8', '27714', '7658', '0'), +('7', '3', '8', '1546', '6920', '0'), +('7', '3', '6', '1557', '6760', '0'), +('7', '3', '6', '1283', '2986', '0'), +('7', '3', '6', '11561', '2072', '0'), +('7', '3', '6', '25062', '768', '0'), +('7', '3', '17', '12256', '7667', '0'), +('7', '3', '17', '1201', '2467', '0'), +('7', '3', '17', '2348', '1821', '0'), +('7', '3', '17', '2341', '1646', '0'), +('7', '3', '7', '2458', '2406', '0'), +('7', '3', '7', '1361', '1764', '0'), +('7', '3', '7', '2342', '1637', '0'), +('7', '3', '7', '1202', '1439', '0'), +('7', '3', '9', '27714', '7658', '0'), +('7', '3', '9', '14650', '1952', '0'), +('7', '3', '9', '10360', '1351', '0'), +('7', '3', '9', '1203', '1179', '0'), +('7', '3', '15', '10366', '8163', '0'), +('7', '3', '15', '10151', '7200', '0'), +('7', '3', '15', '14679', '6255', '0'), +('7', '3', '15', '14678', '5104', '0'), +('7', '3', '20', '11698', '9997', '0'), +('7', '3', '20', '11601', '7577', '0'), +('7', '3', '20', '2917', '5211', '0'), +('7', '3', '20', '1365', '4200', '0'), +('7', '3', '12', '2923', '3654', '0'), +('7', '3', '12', '11624', '2365', '0'), +('7', '3', '12', '1204', '1396', '0'), +('7', '3', '12', '29682', '1143', '0'), +('7', '3', '18', '2461', '2557', '0'), +('7', '3', '18', '1205', '1056', '0'), +('7', '3', '18', '25725', '978', '0'), +('7', '3', '18', '2343', '785', '0'), +('7', '3', '19', '1280', '3540', '0'), +('7', '3', '19', '1206', '1393', '0'), +('7', '3', '19', '68239', '1360', '0'), +('7', '3', '19', '25726', '791', '0'), +('7', '3', '13', '27715', '25245', '0'), +('7', '3', '13', '6502', '17425', '0'), +('7', '3', '13', '71308', '7822', '0'), +('7', '3', '13', '6691', '7373', '0'), +('7', '3', '14', '27715', '25245', '0'), +('7', '3', '14', '6502', '17425', '0'), +('7', '3', '14', '11644', '11154', '0'), +('7', '3', '14', '71308', '7822', '0'), +('7', '3', '11', '14762', '854', '0'), +('7', '3', '11', '13748', '489', '0'), +('7', '3', '11', '9246', '453', '0'), +('7', '3', '11', '20677', '69', '0'), +('7', '4', '22', '9246', '0', '0'), +('7', '4', '22', '10323', '0', '0'), +('7', '4', '22', '21509', '0', '0'), +('7', '4', '22', '8332', '0', '0'), +('7', '4', '1', '14701', '4052', '0'), +('7', '4', '1', '14702', '2850', '0'), +('7', '4', '1', '10165', '1638', '0'), +('7', '4', '1', '30361', '1140', '0'), +('7', '4', '2', '10142', '3012', '0'), +('7', '4', '2', '4504', '2158', '0'), +('7', '4', '2', '1405', '1810', '0'), +('7', '4', '2', '2191', '1592', '0'), +('7', '4', '3', '10144', '1206', '0'), +('7', '4', '3', '2403', '1146', '0'), +('7', '4', '3', '14705', '990', '0'), +('7', '4', '3', '14706', '990', '0'), +('7', '4', '5', '14703', '6050', '0'), +('7', '4', '5', '14700', '3753', '0'), +('7', '4', '5', '10055', '3505', '0'), +('7', '4', '5', '2583', '2444', '0'), +('7', '4', '8', '11621', '14377', '0'), +('7', '4', '8', '11562', '9310', '0'), +('7', '4', '8', '27714', '7684', '0'), +('7', '4', '8', '1546', '6920', '0'), +('7', '4', '6', '1557', '6760', '0'), +('7', '4', '6', '1283', '2986', '0'), +('7', '4', '6', '11561', '2098', '0'), +('7', '4', '6', '25062', '768', '0'), +('7', '4', '17', '12256', '7685', '0'), +('7', '4', '17', '1201', '2467', '0'), +('7', '4', '17', '2348', '1839', '0'), +('7', '4', '17', '2341', '1646', '0'), +('7', '4', '7', '2458', '2406', '0'), +('7', '4', '7', '1361', '1764', '0'), +('7', '4', '7', '2342', '1647', '0'), +('7', '4', '7', '1202', '1472', '0'), +('7', '4', '9', '27714', '7684', '0'), +('7', '4', '9', '14650', '1952', '0'), +('7', '4', '9', '10360', '1351', '0'), +('7', '4', '9', '1203', '1197', '0'), +('7', '4', '15', '10366', '8163', '0'), +('7', '4', '15', '10151', '7200', '0'), +('7', '4', '15', '14679', '6255', '0'), +('7', '4', '15', '14678', '5104', '0'), +('7', '4', '20', '11698', '9997', '0'), +('7', '4', '20', '11601', '7613', '0'), +('7', '4', '20', '2917', '5211', '0'), +('7', '4', '20', '1365', '4200', '0'), +('7', '4', '12', '2923', '3654', '0'), +('7', '4', '12', '11624', '2391', '0'), +('7', '4', '12', '1204', '1396', '0'), +('7', '4', '12', '29682', '1143', '0'), +('7', '4', '18', '2461', '2557', '0'), +('7', '4', '18', '1205', '1056', '0'), +('7', '4', '18', '25725', '978', '0'), +('7', '4', '18', '2343', '785', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '4', '19', '1280', '3540', '0'), +('7', '4', '19', '1206', '1426', '0'), +('7', '4', '19', '68239', '1360', '0'), +('7', '4', '19', '25726', '791', '0'), +('7', '4', '13', '27715', '25245', '0'), +('7', '4', '13', '6502', '17425', '0'), +('7', '4', '13', '71308', '7822', '0'), +('7', '4', '13', '6691', '7373', '0'), +('7', '4', '14', '27715', '25245', '0'), +('7', '4', '14', '6502', '17425', '0'), +('7', '4', '14', '11644', '11154', '0'), +('7', '4', '14', '71308', '7822', '0'), +('7', '4', '11', '14762', '854', '0'), +('7', '4', '11', '13748', '489', '0'), +('7', '4', '11', '9246', '453', '0'), +('7', '4', '11', '20677', '69', '0'), +('7', '5', '22', '9246', '0', '0'), +('7', '5', '22', '10323', '0', '0'), +('7', '5', '22', '21509', '0', '0'), +('7', '5', '22', '8332', '0', '0'), +('7', '5', '1', '14701', '4052', '0'), +('7', '5', '1', '14702', '2850', '0'), +('7', '5', '1', '10165', '1638', '0'), +('7', '5', '1', '30361', '1140', '0'), +('7', '5', '2', '10142', '3012', '0'), +('7', '5', '2', '4504', '2158', '0'), +('7', '5', '2', '1405', '1810', '0'), +('7', '5', '2', '2191', '1592', '0'), +('7', '5', '3', '10144', '1206', '0'), +('7', '5', '3', '2403', '1146', '0'), +('7', '5', '3', '14705', '990', '0'), +('7', '5', '3', '14706', '990', '0'), +('7', '5', '5', '14703', '6050', '0'), +('7', '5', '5', '14700', '3753', '0'), +('7', '5', '5', '10055', '3505', '0'), +('7', '5', '5', '2583', '2444', '0'), +('7', '5', '8', '11621', '14377', '0'), +('7', '5', '8', '11562', '9310', '0'), +('7', '5', '8', '27714', '7709', '0'), +('7', '5', '8', '1546', '6920', '0'), +('7', '5', '6', '1557', '6760', '0'), +('7', '5', '6', '1283', '2986', '0'), +('7', '5', '6', '11561', '2123', '0'), +('7', '5', '6', '25062', '768', '0'), +('7', '5', '17', '12256', '7703', '0'), +('7', '5', '17', '1201', '2467', '0'), +('7', '5', '17', '2348', '1857', '0'), +('7', '5', '17', '2341', '1646', '0'), +('7', '5', '7', '2458', '2406', '0'), +('7', '5', '7', '1361', '1764', '0'), +('7', '5', '7', '2342', '1658', '0'), +('7', '5', '7', '1202', '1505', '0'), +('7', '5', '9', '27714', '7709', '0'), +('7', '5', '9', '14650', '1952', '0'), +('7', '5', '9', '10360', '1351', '0'), +('7', '5', '9', '1203', '1215', '0'), +('7', '5', '15', '10366', '8163', '0'), +('7', '5', '15', '10151', '7200', '0'), +('7', '5', '15', '14679', '6255', '0'), +('7', '5', '15', '14678', '5104', '0'), +('7', '5', '20', '11698', '9997', '0'), +('7', '5', '20', '11601', '7650', '0'), +('7', '5', '20', '2917', '5211', '0'), +('7', '5', '20', '1365', '4200', '0'), +('7', '5', '12', '2923', '3654', '0'), +('7', '5', '12', '11624', '2416', '0'), +('7', '5', '12', '1204', '1396', '0'), +('7', '5', '12', '29682', '1143', '0'), +('7', '5', '18', '2461', '2557', '0'), +('7', '5', '18', '1205', '1056', '0'), +('7', '5', '18', '25725', '978', '0'), +('7', '5', '18', '2343', '785', '0'), +('7', '5', '19', '1280', '3540', '0'), +('7', '5', '19', '1206', '1459', '0'), +('7', '5', '19', '68239', '1360', '0'), +('7', '5', '19', '25726', '791', '0'), +('7', '5', '13', '27715', '25245', '0'), +('7', '5', '13', '6502', '17425', '0'), +('7', '5', '13', '71308', '7822', '0'), +('7', '5', '13', '6691', '7373', '0'), +('7', '5', '14', '27715', '25245', '0'), +('7', '5', '14', '6502', '17425', '0'), +('7', '5', '14', '11644', '11154', '0'), +('7', '5', '14', '71308', '7822', '0'), +('7', '5', '11', '14762', '854', '0'), +('7', '5', '11', '13748', '489', '0'), +('7', '5', '11', '9246', '453', '0'), +('7', '5', '11', '20677', '69', '0'), +('7', '6', '22', '9246', '0', '0'), +('7', '6', '22', '10323', '0', '0'), +('7', '6', '22', '21509', '0', '0'), +('7', '6', '22', '8332', '0', '0'), +('7', '6', '1', '14701', '4052', '0'), +('7', '6', '1', '14702', '2850', '0'), +('7', '6', '1', '10165', '1638', '0'), +('7', '6', '1', '30361', '1140', '0'), +('7', '6', '2', '10142', '3012', '0'), +('7', '6', '2', '4504', '2158', '0'), +('7', '6', '2', '1405', '1810', '0'), +('7', '6', '2', '2191', '1592', '0'), +('7', '6', '3', '10144', '1206', '0'), +('7', '6', '3', '2403', '1146', '0'), +('7', '6', '3', '14705', '990', '0'), +('7', '6', '3', '14706', '990', '0'), +('7', '6', '5', '14703', '6050', '0'), +('7', '6', '5', '14700', '3753', '0'), +('7', '6', '5', '10055', '3505', '0'), +('7', '6', '5', '2583', '2444', '0'), +('7', '6', '8', '11621', '14377', '0'), +('7', '6', '8', '11562', '9310', '0'), +('7', '6', '8', '27714', '7734', '0'), +('7', '6', '8', '1546', '6920', '0'), +('7', '6', '6', '1557', '6760', '0'), +('7', '6', '6', '1283', '2986', '0'), +('7', '6', '6', '11561', '2148', '0'), +('7', '6', '6', '25062', '768', '0'), +('7', '6', '17', '12256', '7721', '0'), +('7', '6', '17', '1201', '2467', '0'), +('7', '6', '17', '2348', '1875', '0'), +('7', '6', '17', '2341', '1646', '0'), +('7', '6', '7', '2458', '2406', '0'), +('7', '6', '7', '1361', '1764', '0'), +('7', '6', '7', '2342', '1669', '0'), +('7', '6', '7', '1202', '1537', '0'), +('7', '6', '9', '27714', '7734', '0'), +('7', '6', '9', '14650', '1952', '0'), +('7', '6', '9', '10360', '1351', '0'), +('7', '6', '9', '1203', '1234', '0'), +('7', '6', '15', '10366', '8163', '0'), +('7', '6', '15', '10151', '7200', '0'), +('7', '6', '15', '14679', '6255', '0'), +('7', '6', '15', '14678', '5104', '0'), +('7', '6', '20', '11698', '9997', '0'), +('7', '6', '20', '11601', '7686', '0'), +('7', '6', '20', '2917', '5211', '0'), +('7', '6', '20', '1365', '4200', '0'), +('7', '6', '12', '2923', '3654', '0'), +('7', '6', '12', '11624', '2442', '0'), +('7', '6', '12', '1204', '1396', '0'), +('7', '6', '12', '29682', '1143', '0'), +('7', '6', '18', '2461', '2557', '0'), +('7', '6', '18', '1205', '1056', '0'), +('7', '6', '18', '25725', '978', '0'), +('7', '6', '18', '2343', '785', '0'), +('7', '6', '19', '1280', '3540', '0'), +('7', '6', '19', '1206', '1491', '0'), +('7', '6', '19', '68239', '1360', '0'), +('7', '6', '19', '25726', '791', '0'), +('7', '6', '13', '27715', '25245', '0'), +('7', '6', '13', '6502', '17425', '0'), +('7', '6', '13', '71308', '7822', '0'), +('7', '6', '13', '6691', '7373', '0'), +('7', '6', '14', '27715', '25245', '0'), +('7', '6', '14', '6502', '17425', '0'), +('7', '6', '14', '11644', '11154', '0'), +('7', '6', '14', '71308', '7822', '0'), +('7', '6', '11', '14762', '854', '0'), +('7', '6', '11', '13748', '489', '0'), +('7', '6', '11', '9246', '453', '0'), +('7', '6', '11', '20677', '69', '0'), +('7', '7', '22', '9246', '0', '0'), +('7', '7', '22', '10323', '0', '0'), +('7', '7', '22', '21509', '0', '0'), +('7', '7', '22', '8332', '0', '0'), +('7', '7', '1', '14701', '4052', '0'), +('7', '7', '1', '14702', '2850', '0'), +('7', '7', '1', '10165', '1638', '0'), +('7', '7', '1', '30361', '1140', '0'), +('7', '7', '2', '10142', '3012', '0'), +('7', '7', '2', '4504', '2158', '0'), +('7', '7', '2', '1405', '1810', '0'), +('7', '7', '2', '2191', '1592', '0'), +('7', '7', '3', '10144', '1206', '0'), +('7', '7', '3', '2403', '1146', '0'), +('7', '7', '3', '14705', '990', '0'), +('7', '7', '3', '14706', '990', '0'), +('7', '7', '5', '14703', '6050', '0'), +('7', '7', '5', '14700', '3753', '0'), +('7', '7', '5', '10055', '3505', '0'), +('7', '7', '5', '2583', '2444', '0'), +('7', '7', '8', '11621', '14377', '0'), +('7', '7', '8', '11562', '9310', '0'), +('7', '7', '8', '27714', '7764', '0'), +('7', '7', '8', '1546', '6920', '0'), +('7', '7', '6', '1557', '6760', '0'), +('7', '7', '6', '1283', '2986', '0'), +('7', '7', '6', '11561', '2178', '0'), +('7', '7', '6', '25062', '768', '0'), +('7', '7', '17', '12256', '7742', '0'), +('7', '7', '17', '1201', '2467', '0'), +('7', '7', '17', '2348', '1897', '0'), +('7', '7', '17', '2341', '1646', '0'), +('7', '7', '7', '2458', '2406', '0'), +('7', '7', '7', '1361', '1764', '0'), +('7', '7', '7', '2342', '1682', '0'), +('7', '7', '7', '1202', '1575', '0'), +('7', '7', '9', '27714', '7764', '0'), +('7', '7', '9', '14650', '1952', '0'), +('7', '7', '9', '10360', '1351', '0'), +('7', '7', '9', '1203', '1255', '0'), +('7', '7', '15', '10366', '8163', '0'), +('7', '7', '15', '10151', '7200', '0'), +('7', '7', '15', '14679', '6255', '0'), +('7', '7', '15', '14678', '5104', '0'), +('7', '7', '20', '11698', '9997', '0'), +('7', '7', '20', '11601', '7728', '0'), +('7', '7', '20', '2917', '5211', '0'), +('7', '7', '20', '1365', '4200', '0'), +('7', '7', '12', '2923', '3654', '0'), +('7', '7', '12', '11624', '2471', '0'), +('7', '7', '12', '1204', '1396', '0'), +('7', '7', '12', '29682', '1143', '0'), +('7', '7', '18', '2461', '2557', '0'), +('7', '7', '18', '1205', '1056', '0'), +('7', '7', '18', '25725', '978', '0'), +('7', '7', '18', '2343', '785', '0'), +('7', '7', '19', '1280', '3540', '0'), +('7', '7', '19', '1206', '1529', '0'), +('7', '7', '19', '68239', '1360', '0'), +('7', '7', '19', '25726', '791', '0'), +('7', '7', '13', '27715', '25245', '0'), +('7', '7', '13', '6502', '17425', '0'), +('7', '7', '13', '71308', '7822', '0'), +('7', '7', '13', '6691', '7373', '0'), +('7', '7', '14', '27715', '25245', '0'), +('7', '7', '14', '6502', '17425', '0'), +('7', '7', '14', '11644', '11154', '0'), +('7', '7', '14', '71308', '7822', '0'), +('7', '7', '11', '14762', '854', '0'), +('7', '7', '11', '13748', '489', '0'), +('7', '7', '11', '9246', '453', '0'), +('7', '7', '11', '20677', '69', '0'), +('7', '8', '22', '9246', '0', '0'), +('7', '8', '22', '10323', '0', '0'), +('7', '8', '22', '21509', '0', '0'), +('7', '8', '22', '8332', '0', '0'), +('7', '8', '1', '14701', '4052', '0'), +('7', '8', '1', '14702', '2850', '0'), +('7', '8', '1', '10165', '1638', '0'), +('7', '8', '1', '30361', '1140', '0'), +('7', '8', '2', '10142', '3012', '0'), +('7', '8', '2', '4504', '2158', '0'), +('7', '8', '2', '1405', '1810', '0'), +('7', '8', '2', '2191', '1592', '0'), +('7', '8', '3', '10144', '1206', '0'), +('7', '8', '3', '2403', '1146', '0'), +('7', '8', '3', '14705', '990', '0'), +('7', '8', '3', '14706', '990', '0'), +('7', '8', '5', '14703', '6050', '0'), +('7', '8', '5', '14700', '3753', '0'), +('7', '8', '5', '10055', '3505', '0'), +('7', '8', '5', '2583', '2444', '0'), +('7', '8', '8', '11621', '14377', '0'), +('7', '8', '8', '11562', '9310', '0'), +('7', '8', '8', '27714', '7789', '0'), +('7', '8', '8', '1546', '6920', '0'), +('7', '8', '6', '1557', '6760', '0'), +('7', '8', '6', '1283', '2986', '0'), +('7', '8', '6', '11561', '2203', '0'), +('7', '8', '6', '25062', '768', '0'), +('7', '8', '17', '12256', '7760', '0'), +('7', '8', '17', '1201', '2467', '0'), +('7', '8', '17', '2348', '1915', '0'), +('7', '8', '17', '2341', '1646', '0'), +('7', '8', '7', '2458', '2406', '0'), +('7', '8', '7', '1361', '1764', '0'), +('7', '8', '7', '2342', '1693', '0'), +('7', '8', '7', '1202', '1608', '0'), +('7', '8', '9', '27714', '7789', '0'), +('7', '8', '9', '14650', '1952', '0'), +('7', '8', '9', '10360', '1351', '0'), +('7', '8', '9', '1203', '1273', '0'), +('7', '8', '15', '10366', '8163', '0'), +('7', '8', '15', '10151', '7200', '0'), +('7', '8', '15', '14679', '6255', '0'), +('7', '8', '15', '14678', '5104', '0'), +('7', '8', '20', '11698', '9997', '0'), +('7', '8', '20', '11601', '7764', '0'), +('7', '8', '20', '2917', '5211', '0'), +('7', '8', '20', '1365', '4200', '0'), +('7', '8', '12', '2923', '3654', '0'), +('7', '8', '12', '11624', '2497', '0'), +('7', '8', '12', '1204', '1396', '0'), +('7', '8', '12', '29682', '1143', '0'), +('7', '8', '18', '2461', '2557', '0'), +('7', '8', '18', '1205', '1056', '0'), +('7', '8', '18', '25725', '978', '0'), +('7', '8', '18', '2343', '785', '0'), +('7', '8', '19', '1280', '3540', '0'), +('7', '8', '19', '1206', '1562', '0'), +('7', '8', '19', '68239', '1360', '0'), +('7', '8', '19', '25726', '791', '0'), +('7', '8', '13', '27715', '25245', '0'), +('7', '8', '13', '6502', '17425', '0'), +('7', '8', '13', '71308', '7822', '0'), +('7', '8', '13', '6691', '7373', '0'), +('7', '8', '14', '27715', '25245', '0'), +('7', '8', '14', '6502', '17425', '0'), +('7', '8', '14', '11644', '11154', '0'), +('7', '8', '14', '71308', '7822', '0'), +('7', '8', '11', '14762', '854', '0'), +('7', '8', '11', '13748', '489', '0'), +('7', '8', '11', '9246', '453', '0'), +('7', '8', '11', '20677', '69', '0'), +('7', '9', '22', '9246', '0', '0'), +('7', '9', '22', '10323', '0', '0'), +('7', '9', '22', '21509', '0', '0'), +('7', '9', '22', '8332', '0', '0'), +('7', '9', '1', '14701', '4052', '0'), +('7', '9', '1', '14702', '2850', '0'), +('7', '9', '1', '10165', '1638', '0'), +('7', '9', '1', '30361', '1140', '0'), +('7', '9', '2', '10142', '3012', '0'), +('7', '9', '2', '4504', '2158', '0'), +('7', '9', '2', '1405', '1810', '0'), +('7', '9', '2', '2191', '1592', '0'), +('7', '9', '3', '10144', '1206', '0'), +('7', '9', '3', '2403', '1146', '0'), +('7', '9', '3', '14705', '990', '0'), +('7', '9', '3', '14706', '990', '0'), +('7', '9', '5', '14703', '6050', '0'), +('7', '9', '5', '14700', '3753', '0'), +('7', '9', '5', '10055', '3505', '0'), +('7', '9', '5', '2583', '2444', '0'), +('7', '9', '8', '11621', '14377', '0'), +('7', '9', '8', '11562', '9310', '0'), +('7', '9', '8', '27714', '7815', '0'), +('7', '9', '8', '1546', '6920', '0'), +('7', '9', '6', '1557', '6760', '0'), +('7', '9', '6', '1283', '2986', '0'), +('7', '9', '6', '11561', '2229', '0'), +('7', '9', '6', '25062', '768', '0'), +('7', '9', '17', '12256', '7778', '0'), +('7', '9', '17', '1201', '2467', '0'), +('7', '9', '17', '2348', '1933', '0'), +('7', '9', '17', '2341', '1646', '0'), +('7', '9', '7', '2458', '2406', '0'), +('7', '9', '7', '1361', '1764', '0'), +('7', '9', '7', '2342', '1704', '0'), +('7', '9', '7', '1202', '1640', '0'), +('7', '9', '9', '27714', '7815', '0'), +('7', '9', '9', '14650', '1952', '0'), +('7', '9', '9', '10360', '1351', '0'), +('7', '9', '9', '1203', '1291', '0'), +('7', '9', '15', '10366', '8163', '0'), +('7', '9', '15', '10151', '7200', '0'), +('7', '9', '15', '14679', '6255', '0'), +('7', '9', '15', '14678', '5104', '0'), +('7', '9', '20', '11698', '9997', '0'), +('7', '9', '20', '11601', '7801', '0'), +('7', '9', '20', '2917', '5211', '0'), +('7', '9', '20', '1365', '4200', '0'), +('7', '9', '12', '2923', '3654', '0'), +('7', '9', '12', '11624', '2522', '0'), +('7', '9', '12', '1204', '1396', '0'), +('7', '9', '12', '29682', '1143', '0'), +('7', '9', '18', '2461', '2557', '0'), +('7', '9', '18', '1205', '1056', '0'), +('7', '9', '18', '25725', '978', '0'), +('7', '9', '18', '2343', '785', '0'), +('7', '9', '19', '1280', '3540', '0'), +('7', '9', '19', '1206', '1595', '0'), +('7', '9', '19', '68239', '1360', '0'), +('7', '9', '19', '25726', '791', '0'), +('7', '9', '13', '27715', '25245', '0'), +('7', '9', '13', '6502', '17425', '0'), +('7', '9', '13', '71308', '7822', '0'), +('7', '9', '13', '6691', '7373', '0'), +('7', '9', '14', '27715', '25245', '0'), +('7', '9', '14', '6502', '17425', '0'), +('7', '9', '14', '11644', '11154', '0'), +('7', '9', '14', '71308', '7822', '0'), +('7', '9', '11', '14762', '854', '0'), +('7', '9', '11', '13748', '489', '0'), +('7', '9', '11', '9246', '453', '0'), +('7', '9', '11', '20677', '69', '0'), +('7', '10', '22', '9246', '0', '0'), +('7', '10', '22', '10323', '0', '0'), +('7', '10', '22', '21509', '0', '0'), +('7', '10', '22', '8332', '0', '0'), +('7', '10', '1', '14701', '4052', '0'), +('7', '10', '1', '14702', '2850', '0'), +('7', '10', '1', '10165', '1638', '0'), +('7', '10', '1', '30361', '1140', '0'), +('7', '10', '2', '10142', '3012', '0'), +('7', '10', '2', '4504', '2158', '0'), +('7', '10', '2', '1405', '1810', '0'), +('7', '10', '2', '2191', '1592', '0'), +('7', '10', '3', '10144', '1206', '0'), +('7', '10', '3', '2403', '1146', '0'), +('7', '10', '3', '14705', '990', '0'), +('7', '10', '3', '14706', '990', '0'), +('7', '10', '5', '14703', '6050', '0'), +('7', '10', '5', '14700', '3753', '0'), +('7', '10', '5', '10055', '3505', '0'), +('7', '10', '5', '2583', '2444', '0'), +('7', '10', '8', '11621', '14377', '0'), +('7', '10', '8', '11562', '9310', '0'), +('7', '10', '8', '27714', '7840', '0'), +('7', '10', '8', '1546', '6920', '0'), +('7', '10', '6', '1557', '6760', '0'), +('7', '10', '6', '1283', '2986', '0'), +('7', '10', '6', '11561', '2254', '0'), +('7', '10', '6', '25062', '768', '0'), +('7', '10', '17', '12256', '7797', '0'), +('7', '10', '17', '1201', '2467', '0'), +('7', '10', '17', '2348', '1951', '0'), +('7', '10', '17', '2341', '1646', '0'), +('7', '10', '7', '2458', '2406', '0'), +('7', '10', '7', '1361', '1764', '0'), +('7', '10', '7', '2342', '1715', '0'), +('7', '10', '7', '1202', '1673', '0'), +('7', '10', '9', '27714', '7840', '0'), +('7', '10', '9', '14650', '1952', '0'), +('7', '10', '9', '10360', '1351', '0'), +('7', '10', '9', '1203', '1309', '0'), +('7', '10', '15', '10366', '8163', '0'), +('7', '10', '15', '10151', '7200', '0'), +('7', '10', '15', '14679', '6255', '0'), +('7', '10', '15', '14678', '5104', '0'), +('7', '10', '20', '11698', '9997', '0'), +('7', '10', '20', '11601', '7837', '0'), +('7', '10', '20', '2917', '5211', '0'), +('7', '10', '20', '1365', '4200', '0'), +('7', '10', '12', '2923', '3654', '0'), +('7', '10', '12', '11624', '2547', '0'), +('7', '10', '12', '1204', '1396', '0'), +('7', '10', '12', '29682', '1143', '0'), +('7', '10', '18', '2461', '2557', '0'), +('7', '10', '18', '1205', '1056', '0'), +('7', '10', '18', '25725', '978', '0'), +('7', '10', '18', '2343', '785', '0'), +('7', '10', '19', '1280', '3540', '0'), +('7', '10', '19', '1206', '1627', '0'), +('7', '10', '19', '68239', '1360', '0'), +('7', '10', '19', '25726', '791', '0'), +('7', '10', '13', '27715', '25245', '0'), +('7', '10', '13', '6502', '17425', '0'), +('7', '10', '13', '71308', '7822', '0'), +('7', '10', '13', '6691', '7373', '0'), +('7', '10', '14', '27715', '25245', '0'), +('7', '10', '14', '6502', '17425', '0'), +('7', '10', '14', '11644', '11154', '0'), +('7', '10', '14', '71308', '7822', '0'), +('7', '10', '11', '14762', '854', '0'), +('7', '10', '11', '13748', '489', '0'), +('7', '10', '11', '9246', '453', '0'), +('7', '10', '11', '20677', '69', '0'), +('7', '11', '22', '9246', '0', '0'), +('7', '11', '22', '10323', '0', '0'), +('7', '11', '22', '21509', '0', '0'), +('7', '11', '22', '8332', '0', '0'), +('7', '11', '1', '14701', '4052', '0'), +('7', '11', '1', '14702', '2850', '0'), +('7', '11', '1', '10165', '1638', '0'), +('7', '11', '1', '30361', '1140', '0'), +('7', '11', '2', '10142', '3012', '0'), +('7', '11', '2', '4504', '2158', '0'), +('7', '11', '2', '1405', '1810', '0'), +('7', '11', '2', '2191', '1592', '0'), +('7', '11', '3', '10144', '1206', '0'), +('7', '11', '3', '2403', '1146', '0'), +('7', '11', '3', '14705', '990', '0'), +('7', '11', '3', '14706', '990', '0'), +('7', '11', '5', '14703', '6050', '0'), +('7', '11', '5', '14700', '3753', '0'), +('7', '11', '5', '10055', '3505', '0'), +('7', '11', '5', '2583', '2444', '0'), +('7', '11', '8', '11621', '14377', '0'), +('7', '11', '8', '11562', '9310', '0'), +('7', '11', '8', '27714', '7870', '0'), +('7', '11', '8', '1546', '6920', '0'), +('7', '11', '6', '1557', '6760', '0'), +('7', '11', '6', '1283', '2986', '0'), +('7', '11', '6', '11561', '2284', '0'), +('7', '11', '6', '25062', '768', '0'), +('7', '11', '17', '12256', '7818', '0'), +('7', '11', '17', '1201', '2467', '0'), +('7', '11', '17', '2348', '1972', '0'), +('7', '11', '17', '2341', '1646', '0'), +('7', '11', '7', '2458', '2406', '0'), +('7', '11', '7', '1361', '1764', '0'), +('7', '11', '7', '2342', '1727', '0'), +('7', '11', '7', '1202', '1711', '0'), +('7', '11', '9', '27714', '7870', '0'), +('7', '11', '9', '14650', '1952', '0'), +('7', '11', '9', '10360', '1351', '0'), +('7', '11', '9', '1203', '1330', '0'), +('7', '11', '15', '10366', '8163', '0'), +('7', '11', '15', '10151', '7200', '0'), +('7', '11', '15', '14679', '6255', '0'), +('7', '11', '15', '14678', '5104', '0'), +('7', '11', '20', '11698', '9997', '0'), +('7', '11', '20', '11601', '7879', '0'), +('7', '11', '20', '2917', '5211', '0'), +('7', '11', '20', '1365', '4200', '0'), +('7', '11', '12', '2923', '3654', '0'), +('7', '11', '12', '11624', '2577', '0'), +('7', '11', '12', '1204', '1396', '0'), +('7', '11', '12', '29682', '1143', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '11', '18', '2461', '2557', '0'), +('7', '11', '18', '1205', '1056', '0'), +('7', '11', '18', '25725', '978', '0'), +('7', '11', '18', '2343', '785', '0'), +('7', '11', '19', '1280', '3540', '0'), +('7', '11', '19', '1206', '1665', '0'), +('7', '11', '19', '68239', '1360', '0'), +('7', '11', '19', '25726', '791', '0'), +('7', '11', '13', '27715', '25245', '0'), +('7', '11', '13', '6502', '17425', '0'), +('7', '11', '13', '71308', '7822', '0'), +('7', '11', '13', '6691', '7373', '0'), +('7', '11', '14', '27715', '25245', '0'), +('7', '11', '14', '6502', '17425', '0'), +('7', '11', '14', '11644', '11154', '0'), +('7', '11', '14', '71308', '7822', '0'), +('7', '11', '11', '14762', '854', '0'), +('7', '11', '11', '13748', '489', '0'), +('7', '11', '11', '9246', '453', '0'), +('7', '11', '11', '20677', '69', '0'), +('7', '12', '22', '9246', '0', '0'), +('7', '12', '22', '10323', '0', '0'), +('7', '12', '22', '21509', '0', '0'), +('7', '12', '22', '8332', '0', '0'), +('7', '12', '1', '14701', '4052', '0'), +('7', '12', '1', '14702', '2850', '0'), +('7', '12', '1', '10165', '1638', '0'), +('7', '12', '1', '30361', '1140', '0'), +('7', '12', '2', '10142', '3012', '0'), +('7', '12', '2', '4504', '2158', '0'), +('7', '12', '2', '1405', '1810', '0'), +('7', '12', '2', '2191', '1592', '0'), +('7', '12', '3', '10144', '1206', '0'), +('7', '12', '3', '2403', '1146', '0'), +('7', '12', '3', '14705', '990', '0'), +('7', '12', '3', '14706', '990', '0'), +('7', '12', '5', '14703', '6050', '0'), +('7', '12', '5', '14700', '3753', '0'), +('7', '12', '5', '10055', '3505', '0'), +('7', '12', '5', '2583', '2444', '0'), +('7', '12', '8', '11621', '14377', '0'), +('7', '12', '8', '11562', '9310', '0'), +('7', '12', '8', '27714', '7895', '0'), +('7', '12', '8', '1546', '6920', '0'), +('7', '12', '6', '1557', '6760', '0'), +('7', '12', '6', '1283', '2986', '0'), +('7', '12', '6', '11561', '2309', '0'), +('7', '12', '6', '25062', '768', '0'), +('7', '12', '17', '12256', '7836', '0'), +('7', '12', '17', '1201', '2467', '0'), +('7', '12', '17', '2348', '1990', '0'), +('7', '12', '17', '2341', '1646', '0'), +('7', '12', '7', '2458', '2406', '0'), +('7', '12', '7', '1361', '1764', '0'), +('7', '12', '7', '1202', '1744', '0'), +('7', '12', '7', '2342', '1738', '0'), +('7', '12', '9', '27714', '7895', '0'), +('7', '12', '9', '14650', '1952', '0'), +('7', '12', '9', '10360', '1351', '0'), +('7', '12', '9', '1203', '1348', '0'), +('7', '12', '15', '10366', '8163', '0'), +('7', '12', '15', '10151', '7200', '0'), +('7', '12', '15', '14679', '6255', '0'), +('7', '12', '15', '14678', '5104', '0'), +('7', '12', '20', '11698', '9997', '0'), +('7', '12', '20', '11601', '7915', '0'), +('7', '12', '20', '2917', '5211', '0'), +('7', '12', '20', '1365', '4200', '0'), +('7', '12', '12', '2923', '3654', '0'), +('7', '12', '12', '11624', '2602', '0'), +('7', '12', '12', '1204', '1396', '0'), +('7', '12', '12', '8909', '1145', '0'), +('7', '12', '18', '2461', '2557', '0'), +('7', '12', '18', '1205', '1056', '0'), +('7', '12', '18', '25725', '978', '0'), +('7', '12', '18', '2343', '785', '0'), +('7', '12', '19', '1280', '3540', '0'), +('7', '12', '19', '1206', '1698', '0'), +('7', '12', '19', '68239', '1360', '0'), +('7', '12', '19', '25726', '791', '0'), +('7', '12', '13', '27715', '25245', '0'), +('7', '12', '13', '6502', '17425', '0'), +('7', '12', '13', '71308', '7822', '0'), +('7', '12', '13', '6691', '7373', '0'), +('7', '12', '14', '27715', '25245', '0'), +('7', '12', '14', '6502', '17425', '0'), +('7', '12', '14', '11644', '11154', '0'), +('7', '12', '14', '71308', '7822', '0'), +('7', '12', '11', '14762', '854', '0'), +('7', '12', '11', '13748', '489', '0'), +('7', '12', '11', '9246', '453', '0'), +('7', '12', '11', '20677', '69', '0'), +('7', '13', '22', '9246', '0', '0'), +('7', '13', '22', '10323', '0', '0'), +('7', '13', '22', '21509', '0', '0'), +('7', '13', '22', '8332', '0', '0'), +('7', '13', '1', '14701', '4052', '0'), +('7', '13', '1', '14702', '2850', '0'), +('7', '13', '1', '10165', '1638', '0'), +('7', '13', '1', '30361', '1140', '0'), +('7', '13', '2', '10142', '3012', '0'), +('7', '13', '2', '4504', '2158', '0'), +('7', '13', '2', '1405', '1810', '0'), +('7', '13', '2', '2191', '1592', '0'), +('7', '13', '3', '10144', '1206', '0'), +('7', '13', '3', '2403', '1146', '0'), +('7', '13', '3', '14705', '990', '0'), +('7', '13', '3', '14706', '990', '0'), +('7', '13', '5', '14703', '6050', '0'), +('7', '13', '5', '14700', '3753', '0'), +('7', '13', '5', '10055', '3505', '0'), +('7', '13', '5', '2583', '2444', '0'), +('7', '13', '8', '11621', '14377', '0'), +('7', '13', '8', '11562', '9310', '0'), +('7', '13', '8', '27714', '7920', '0'), +('7', '13', '8', '1546', '6920', '0'), +('7', '13', '6', '1557', '6760', '0'), +('7', '13', '6', '1283', '2986', '0'), +('7', '13', '6', '11561', '2334', '0'), +('7', '13', '6', '25062', '768', '0'), +('7', '13', '17', '12256', '7854', '0'), +('7', '13', '17', '1201', '2467', '0'), +('7', '13', '17', '2348', '2008', '0'), +('7', '13', '17', '2341', '1646', '0'), +('7', '13', '7', '2458', '2406', '0'), +('7', '13', '7', '1202', '1776', '0'), +('7', '13', '7', '1361', '1764', '0'), +('7', '13', '7', '2342', '1749', '0'), +('7', '13', '9', '27714', '7920', '0'), +('7', '13', '9', '14650', '1952', '0'), +('7', '13', '9', '1203', '1366', '0'), +('7', '13', '9', '10360', '1351', '0'), +('7', '13', '15', '10366', '8163', '0'), +('7', '13', '15', '10151', '7200', '0'), +('7', '13', '15', '14679', '6255', '0'), +('7', '13', '15', '14678', '5104', '0'), +('7', '13', '20', '11698', '9997', '0'), +('7', '13', '20', '11601', '7952', '0'), +('7', '13', '20', '2917', '5211', '0'), +('7', '13', '20', '1365', '4200', '0'), +('7', '13', '12', '2923', '3654', '0'), +('7', '13', '12', '11624', '2628', '0'), +('7', '13', '12', '1204', '1396', '0'), +('7', '13', '12', '8909', '1155', '0'), +('7', '13', '18', '2461', '2557', '0'), +('7', '13', '18', '1205', '1056', '0'), +('7', '13', '18', '25725', '978', '0'), +('7', '13', '18', '2343', '785', '0'), +('7', '13', '19', '1280', '3540', '0'), +('7', '13', '19', '1206', '1730', '0'), +('7', '13', '19', '68239', '1360', '0'), +('7', '13', '19', '25726', '791', '0'), +('7', '13', '13', '27715', '25245', '0'), +('7', '13', '13', '6502', '17425', '0'), +('7', '13', '13', '71308', '7822', '0'), +('7', '13', '13', '6691', '7373', '0'), +('7', '13', '14', '27715', '25245', '0'), +('7', '13', '14', '6502', '17425', '0'), +('7', '13', '14', '11644', '11154', '0'), +('7', '13', '14', '71308', '7822', '0'), +('7', '13', '11', '14762', '854', '0'), +('7', '13', '11', '13748', '489', '0'), +('7', '13', '11', '9246', '453', '0'), +('7', '13', '11', '20677', '69', '0'), +('7', '14', '22', '9246', '0', '0'), +('7', '14', '22', '10323', '0', '0'), +('7', '14', '22', '21509', '0', '0'), +('7', '14', '22', '8332', '0', '0'), +('7', '14', '1', '14701', '4052', '0'), +('7', '14', '1', '14702', '2850', '0'), +('7', '14', '1', '10165', '1638', '0'), +('7', '14', '1', '30361', '1140', '0'), +('7', '14', '2', '10142', '3012', '0'), +('7', '14', '2', '4504', '2158', '0'), +('7', '14', '2', '1405', '1810', '0'), +('7', '14', '2', '2191', '1592', '0'), +('7', '14', '3', '10144', '1206', '0'), +('7', '14', '3', '2403', '1146', '0'), +('7', '14', '3', '14705', '990', '0'), +('7', '14', '3', '14706', '990', '0'), +('7', '14', '5', '14703', '6050', '0'), +('7', '14', '5', '14700', '3753', '0'), +('7', '14', '5', '10055', '3505', '0'), +('7', '14', '5', '2583', '2444', '0'), +('7', '14', '8', '11621', '14377', '0'), +('7', '14', '8', '11562', '9310', '0'), +('7', '14', '8', '27714', '7950', '0'), +('7', '14', '8', '1546', '6920', '0'), +('7', '14', '6', '1557', '6760', '0'), +('7', '14', '6', '1283', '2986', '0'), +('7', '14', '6', '11561', '2364', '0'), +('7', '14', '6', '25062', '768', '0'), +('7', '14', '17', '12256', '7875', '0'), +('7', '14', '17', '1201', '2467', '0'), +('7', '14', '17', '2348', '2029', '0'), +('7', '14', '17', '2341', '1646', '0'), +('7', '14', '7', '2458', '2406', '0'), +('7', '14', '7', '1202', '1814', '0'), +('7', '14', '7', '1361', '1764', '0'), +('7', '14', '7', '2342', '1762', '0'), +('7', '14', '9', '27714', '7950', '0'), +('7', '14', '9', '14650', '1952', '0'), +('7', '14', '9', '1203', '1388', '0'), +('7', '14', '9', '10360', '1351', '0'), +('7', '14', '15', '10366', '8163', '0'), +('7', '14', '15', '10151', '7200', '0'), +('7', '14', '15', '14679', '6255', '0'), +('7', '14', '15', '14678', '5104', '0'), +('7', '14', '20', '11698', '9997', '0'), +('7', '14', '20', '11601', '7994', '0'), +('7', '14', '20', '2917', '5211', '0'), +('7', '14', '20', '1365', '4200', '0'), +('7', '14', '12', '2923', '3654', '0'), +('7', '14', '12', '11624', '2657', '0'), +('7', '14', '12', '1204', '1396', '0'), +('7', '14', '12', '8909', '1165', '0'), +('7', '14', '18', '2461', '2557', '0'), +('7', '14', '18', '1205', '1056', '0'), +('7', '14', '18', '25725', '978', '0'), +('7', '14', '18', '2343', '785', '0'), +('7', '14', '19', '1280', '3540', '0'), +('7', '14', '19', '1206', '1769', '0'), +('7', '14', '19', '68239', '1360', '0'), +('7', '14', '19', '25726', '791', '0'), +('7', '14', '13', '27715', '25245', '0'), +('7', '14', '13', '6502', '17425', '0'), +('7', '14', '13', '71308', '7822', '0'), +('7', '14', '13', '6691', '7373', '0'), +('7', '14', '14', '27715', '25245', '0'), +('7', '14', '14', '6502', '17425', '0'), +('7', '14', '14', '11644', '11154', '0'), +('7', '14', '14', '71308', '7822', '0'), +('7', '14', '11', '14762', '854', '0'), +('7', '14', '11', '13748', '489', '0'), +('7', '14', '11', '9246', '453', '0'), +('7', '14', '11', '20677', '69', '0'), +('7', '15', '22', '9246', '0', '0'), +('7', '15', '22', '10323', '0', '0'), +('7', '15', '22', '21509', '0', '0'), +('7', '15', '22', '8332', '0', '0'), +('7', '15', '1', '14701', '4052', '0'), +('7', '15', '1', '14702', '2850', '0'), +('7', '15', '1', '10165', '1638', '0'), +('7', '15', '1', '30361', '1140', '0'), +('7', '15', '2', '10142', '3012', '0'), +('7', '15', '2', '4504', '2158', '0'), +('7', '15', '2', '1405', '1810', '0'), +('7', '15', '2', '2191', '1592', '0'), +('7', '15', '3', '10144', '1206', '0'), +('7', '15', '3', '2403', '1146', '0'), +('7', '15', '3', '14705', '990', '0'), +('7', '15', '3', '14706', '990', '0'), +('7', '15', '5', '14703', '6050', '0'), +('7', '15', '5', '14700', '3753', '0'), +('7', '15', '5', '10055', '3505', '0'), +('7', '15', '5', '2583', '2444', '0'), +('7', '15', '8', '11621', '14377', '0'), +('7', '15', '8', '11562', '9310', '0'), +('7', '15', '8', '27714', '7975', '0'), +('7', '15', '8', '1546', '6920', '0'), +('7', '15', '6', '1557', '6760', '0'), +('7', '15', '6', '1283', '2986', '0'), +('7', '15', '6', '11561', '2389', '0'), +('7', '15', '6', '25062', '768', '0'), +('7', '15', '17', '12256', '7893', '0'), +('7', '15', '17', '1201', '2467', '0'), +('7', '15', '17', '2348', '2048', '0'), +('7', '15', '17', '2341', '1646', '0'), +('7', '15', '7', '2458', '2406', '0'), +('7', '15', '7', '1202', '1847', '0'), +('7', '15', '7', '2342', '1773', '0'), +('7', '15', '7', '1361', '1764', '0'), +('7', '15', '9', '27714', '7975', '0'), +('7', '15', '9', '14650', '1952', '0'), +('7', '15', '9', '1203', '1406', '0'), +('7', '15', '9', '10360', '1351', '0'), +('7', '15', '15', '10366', '8163', '0'), +('7', '15', '15', '10151', '7200', '0'), +('7', '15', '15', '14679', '6255', '0'), +('7', '15', '15', '14678', '5104', '0'), +('7', '15', '20', '11698', '9997', '0'), +('7', '15', '20', '11601', '8030', '0'), +('7', '15', '20', '2917', '5211', '0'), +('7', '15', '20', '1365', '4200', '0'), +('7', '15', '12', '2923', '3654', '0'), +('7', '15', '12', '11624', '2683', '0'), +('7', '15', '12', '1204', '1396', '0'), +('7', '15', '12', '8909', '1174', '0'), +('7', '15', '18', '2461', '2557', '0'), +('7', '15', '18', '1205', '1056', '0'), +('7', '15', '18', '25725', '978', '0'), +('7', '15', '18', '2343', '785', '0'), +('7', '15', '19', '1280', '3540', '0'), +('7', '15', '19', '1206', '1801', '0'), +('7', '15', '19', '68239', '1360', '0'), +('7', '15', '19', '25726', '791', '0'), +('7', '15', '13', '27715', '25245', '0'), +('7', '15', '13', '6502', '17425', '0'), +('7', '15', '13', '71308', '7822', '0'), +('7', '15', '13', '6691', '7373', '0'), +('7', '15', '14', '27715', '25245', '0'), +('7', '15', '14', '6502', '17425', '0'), +('7', '15', '14', '11644', '11154', '0'), +('7', '15', '14', '71308', '7822', '0'), +('7', '15', '11', '14762', '854', '0'), +('7', '15', '11', '13748', '489', '0'), +('7', '15', '11', '9246', '453', '0'), +('7', '15', '11', '20677', '69', '0'), +('7', '16', '22', '9246', '0', '0'), +('7', '16', '22', '10323', '0', '0'), +('7', '16', '22', '21509', '0', '0'), +('7', '16', '22', '8332', '0', '0'), +('7', '16', '1', '14701', '4052', '0'), +('7', '16', '1', '14702', '2850', '0'), +('7', '16', '1', '10165', '1638', '0'), +('7', '16', '1', '30361', '1140', '0'), +('7', '16', '2', '10142', '3012', '0'), +('7', '16', '2', '4504', '2158', '0'), +('7', '16', '2', '1405', '1810', '0'), +('7', '16', '2', '2191', '1592', '0'), +('7', '16', '3', '10144', '1206', '0'), +('7', '16', '3', '2403', '1146', '0'), +('7', '16', '3', '14705', '990', '0'), +('7', '16', '3', '14706', '990', '0'), +('7', '16', '5', '14703', '6050', '0'), +('7', '16', '5', '14700', '3753', '0'), +('7', '16', '5', '10055', '3505', '0'), +('7', '16', '5', '2583', '2444', '0'), +('7', '16', '8', '11621', '14377', '0'), +('7', '16', '8', '11562', '9310', '0'), +('7', '16', '8', '27714', '8001', '0'), +('7', '16', '8', '1546', '6920', '0'), +('7', '16', '6', '1557', '6760', '0'), +('7', '16', '6', '1283', '2986', '0'), +('7', '16', '6', '11561', '2415', '0'), +('7', '16', '6', '25062', '768', '0'), +('7', '16', '17', '12256', '7911', '0'), +('7', '16', '17', '1201', '2467', '0'), +('7', '16', '17', '2348', '2066', '0'), +('7', '16', '17', '2341', '1646', '0'), +('7', '16', '7', '2458', '2406', '0'), +('7', '16', '7', '1202', '1880', '0'), +('7', '16', '7', '2342', '1783', '0'), +('7', '16', '7', '1361', '1764', '0'), +('7', '16', '9', '27714', '8001', '0'), +('7', '16', '9', '14650', '1952', '0'), +('7', '16', '9', '1203', '1424', '0'), +('7', '16', '9', '10360', '1351', '0'), +('7', '16', '15', '10366', '8163', '0'), +('7', '16', '15', '10151', '7200', '0'), +('7', '16', '15', '14679', '6255', '0'), +('7', '16', '15', '14678', '5104', '0'), +('7', '16', '20', '11698', '9997', '0'), +('7', '16', '20', '11601', '8066', '0'), +('7', '16', '20', '2917', '5211', '0'), +('7', '16', '20', '1365', '4200', '0'), +('7', '16', '12', '2923', '3654', '0'), +('7', '16', '12', '11624', '2708', '0'), +('7', '16', '12', '1204', '1396', '0'), +('7', '16', '12', '8909', '1184', '0'), +('7', '16', '18', '2461', '2557', '0'), +('7', '16', '18', '1205', '1056', '0'), +('7', '16', '18', '25725', '978', '0'), +('7', '16', '18', '2343', '785', '0'), +('7', '16', '19', '1280', '3540', '0'), +('7', '16', '19', '1206', '1834', '0'), +('7', '16', '19', '68239', '1360', '0'), +('7', '16', '19', '25726', '791', '0'), +('7', '16', '13', '27715', '25245', '0'), +('7', '16', '13', '6502', '17425', '0'), +('7', '16', '13', '71308', '7822', '0'), +('7', '16', '13', '6691', '7373', '0'), +('7', '16', '14', '27715', '25245', '0'), +('7', '16', '14', '6502', '17425', '0'), +('7', '16', '14', '11644', '11154', '0'), +('7', '16', '14', '71308', '7822', '0'), +('7', '16', '11', '14762', '854', '0'), +('7', '16', '11', '13748', '489', '0'), +('7', '16', '11', '9246', '453', '0'), +('7', '16', '11', '20677', '69', '0'), +('7', '17', '22', '9246', '0', '0'), +('7', '17', '22', '10323', '0', '0'), +('7', '17', '22', '21509', '0', '0'), +('7', '17', '22', '8332', '0', '0'), +('7', '17', '1', '14701', '4052', '0'), +('7', '17', '1', '14702', '2850', '0'), +('7', '17', '1', '10165', '1638', '0'), +('7', '17', '1', '30361', '1140', '0'), +('7', '17', '2', '10142', '3012', '0'), +('7', '17', '2', '4504', '2158', '0'), +('7', '17', '2', '1405', '1810', '0'), +('7', '17', '2', '2191', '1592', '0'), +('7', '17', '3', '10144', '1206', '0'), +('7', '17', '3', '2403', '1146', '0'), +('7', '17', '3', '14705', '990', '0'), +('7', '17', '3', '14706', '990', '0'), +('7', '17', '5', '14703', '6050', '0'), +('7', '17', '5', '14700', '3753', '0'), +('7', '17', '5', '10055', '3505', '0'), +('7', '17', '5', '2583', '2444', '0'), +('7', '17', '8', '11621', '14377', '0'), +('7', '17', '8', '11562', '9310', '0'), +('7', '17', '8', '27714', '8030', '0'), +('7', '17', '8', '1546', '6920', '0'), +('7', '17', '6', '1557', '6760', '0'), +('7', '17', '6', '1283', '2986', '0'), +('7', '17', '6', '11561', '2444', '0'), +('7', '17', '6', '25062', '768', '0'), +('7', '17', '17', '12256', '7932', '0'), +('7', '17', '17', '1201', '2467', '0'), +('7', '17', '17', '2348', '2087', '0'), +('7', '17', '17', '2341', '1646', '0'), +('7', '17', '7', '2458', '2406', '0'), +('7', '17', '7', '1202', '1918', '0'), +('7', '17', '7', '2342', '1796', '0'), +('7', '17', '7', '1361', '1764', '0'), +('7', '17', '9', '27714', '8030', '0'), +('7', '17', '9', '14650', '1952', '0'), +('7', '17', '9', '1203', '1445', '0'), +('7', '17', '9', '10360', '1351', '0'), +('7', '17', '15', '10366', '8163', '0'), +('7', '17', '15', '10151', '7200', '0'), +('7', '17', '15', '14679', '6255', '0'), +('7', '17', '15', '14678', '5104', '0'), +('7', '17', '20', '11698', '9997', '0'), +('7', '17', '20', '11601', '8109', '0'), +('7', '17', '20', '2917', '5211', '0'), +('7', '17', '20', '1365', '4200', '0'), +('7', '17', '12', '2923', '3654', '0'), +('7', '17', '12', '11624', '2738', '0'), +('7', '17', '12', '1204', '1396', '0'), +('7', '17', '12', '8909', '1194', '0'), +('7', '17', '18', '2461', '2557', '0'), +('7', '17', '18', '1205', '1056', '0'), +('7', '17', '18', '25725', '978', '0'), +('7', '17', '18', '2343', '785', '0'), +('7', '17', '19', '1280', '3540', '0'), +('7', '17', '19', '1206', '1872', '0'), +('7', '17', '19', '68239', '1360', '0'), +('7', '17', '19', '25726', '791', '0'), +('7', '17', '13', '27715', '25245', '0'), +('7', '17', '13', '6502', '17425', '0'), +('7', '17', '13', '71308', '7822', '0'), +('7', '17', '13', '6691', '7373', '0'), +('7', '17', '14', '27715', '25245', '0'), +('7', '17', '14', '6502', '17425', '0'), +('7', '17', '14', '11644', '11154', '0'), +('7', '17', '14', '71308', '7822', '0'), +('7', '17', '11', '14762', '854', '0'), +('7', '17', '11', '13748', '489', '0'), +('7', '17', '11', '9246', '453', '0'), +('7', '17', '11', '20677', '69', '0'), +('7', '18', '22', '9246', '0', '0'), +('7', '18', '22', '10323', '0', '0'), +('7', '18', '22', '21509', '0', '0'), +('7', '18', '22', '8332', '0', '0'), +('7', '18', '1', '14701', '4052', '0'), +('7', '18', '1', '14702', '2850', '0'), +('7', '18', '1', '10165', '1638', '0'), +('7', '18', '1', '30361', '1140', '0'), +('7', '18', '2', '10142', '3012', '0'), +('7', '18', '2', '4504', '2158', '0'), +('7', '18', '2', '1405', '1810', '0'), +('7', '18', '2', '2191', '1592', '0'), +('7', '18', '3', '10144', '1206', '0'), +('7', '18', '3', '2403', '1146', '0'), +('7', '18', '3', '14705', '990', '0'), +('7', '18', '3', '14706', '990', '0'), +('7', '18', '5', '14703', '6050', '0'), +('7', '18', '5', '14700', '3753', '0'), +('7', '18', '5', '10055', '3505', '0'), +('7', '18', '5', '2583', '2444', '0'), +('7', '18', '8', '11621', '14377', '0'), +('7', '18', '8', '11562', '9310', '0'), +('7', '18', '8', '27714', '8056', '0'), +('7', '18', '8', '1546', '6920', '0'), +('7', '18', '6', '1557', '6760', '0'), +('7', '18', '6', '1283', '2986', '0'), +('7', '18', '6', '11561', '2470', '0'), +('7', '18', '6', '25062', '768', '0'), +('7', '18', '17', '12256', '7951', '0'), +('7', '18', '17', '1201', '2467', '0'), +('7', '18', '17', '2348', '2105', '0'), +('7', '18', '17', '2341', '1646', '0'), +('7', '18', '7', '2458', '2406', '0'), +('7', '18', '7', '1202', '1950', '0'), +('7', '18', '7', '2342', '1807', '0'), +('7', '18', '7', '1361', '1764', '0'), +('7', '18', '9', '27714', '8056', '0'), +('7', '18', '9', '14650', '1952', '0'), +('7', '18', '9', '1203', '1463', '0'), +('7', '18', '9', '10360', '1351', '0'), +('7', '18', '15', '10366', '8163', '0'), +('7', '18', '15', '10151', '7200', '0'), +('7', '18', '15', '14679', '6255', '0'), +('7', '18', '15', '14678', '5104', '0'), +('7', '18', '20', '11698', '9997', '0'), +('7', '18', '20', '11601', '8145', '0'), +('7', '18', '20', '2917', '5211', '0'), +('7', '18', '20', '1365', '4200', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '18', '12', '2923', '3654', '0'), +('7', '18', '12', '11624', '2763', '0'), +('7', '18', '12', '1204', '1396', '0'), +('7', '18', '12', '8909', '1203', '0'), +('7', '18', '18', '2461', '2557', '0'), +('7', '18', '18', '1205', '1056', '0'), +('7', '18', '18', '25725', '978', '0'), +('7', '18', '18', '2343', '785', '0'), +('7', '18', '19', '1280', '3540', '0'), +('7', '18', '19', '1206', '1904', '0'), +('7', '18', '19', '68239', '1360', '0'), +('7', '18', '19', '25726', '791', '0'), +('7', '18', '13', '27715', '25245', '0'), +('7', '18', '13', '6502', '17425', '0'), +('7', '18', '13', '71308', '7822', '0'), +('7', '18', '13', '6691', '7373', '0'), +('7', '18', '14', '27715', '25245', '0'), +('7', '18', '14', '6502', '17425', '0'), +('7', '18', '14', '11644', '11154', '0'), +('7', '18', '14', '71308', '7822', '0'), +('7', '18', '11', '14762', '854', '0'), +('7', '18', '11', '13748', '489', '0'), +('7', '18', '11', '9246', '453', '0'), +('7', '18', '11', '20677', '69', '0'), +('7', '19', '22', '9246', '0', '0'), +('7', '19', '22', '10323', '0', '0'), +('7', '19', '22', '21509', '0', '0'), +('7', '19', '22', '8332', '0', '0'), +('7', '19', '1', '14701', '4052', '0'), +('7', '19', '1', '14702', '2850', '0'), +('7', '19', '1', '10165', '1638', '0'), +('7', '19', '1', '30361', '1140', '0'), +('7', '19', '2', '10142', '3012', '0'), +('7', '19', '2', '4504', '2158', '0'), +('7', '19', '2', '1405', '1810', '0'), +('7', '19', '2', '2191', '1592', '0'), +('7', '19', '3', '10144', '1206', '0'), +('7', '19', '3', '2403', '1146', '0'), +('7', '19', '3', '14705', '990', '0'), +('7', '19', '3', '14706', '990', '0'), +('7', '19', '5', '14703', '6050', '0'), +('7', '19', '5', '14700', '3753', '0'), +('7', '19', '5', '10055', '3505', '0'), +('7', '19', '5', '2583', '2444', '0'), +('7', '19', '8', '11621', '14377', '0'), +('7', '19', '8', '11562', '9310', '0'), +('7', '19', '8', '27714', '8085', '0'), +('7', '19', '8', '1546', '6920', '0'), +('7', '19', '6', '1557', '6760', '0'), +('7', '19', '6', '1283', '2986', '0'), +('7', '19', '6', '11561', '2499', '0'), +('7', '19', '6', '25062', '768', '0'), +('7', '19', '17', '12256', '7972', '0'), +('7', '19', '17', '1201', '2467', '0'), +('7', '19', '17', '2348', '2126', '0'), +('7', '19', '17', '2341', '1646', '0'), +('7', '19', '7', '2458', '2406', '0'), +('7', '19', '7', '1202', '1988', '0'), +('7', '19', '7', '2342', '1820', '0'), +('7', '19', '7', '1361', '1764', '0'), +('7', '19', '9', '27714', '8085', '0'), +('7', '19', '9', '14650', '1952', '0'), +('7', '19', '9', '1203', '1484', '0'), +('7', '19', '9', '10360', '1351', '0'), +('7', '19', '15', '10366', '8163', '0'), +('7', '19', '15', '10151', '7200', '0'), +('7', '19', '15', '14679', '6255', '0'), +('7', '19', '15', '14678', '5104', '0'), +('7', '19', '20', '11698', '9997', '0'), +('7', '19', '20', '11601', '8187', '0'), +('7', '19', '20', '2917', '5211', '0'), +('7', '19', '20', '1365', '4200', '0'), +('7', '19', '12', '2923', '3654', '0'), +('7', '19', '12', '11624', '2793', '0'), +('7', '19', '12', '1204', '1396', '0'), +('7', '19', '12', '8909', '1214', '0'), +('7', '19', '18', '2461', '2557', '0'), +('7', '19', '18', '1205', '1056', '0'), +('7', '19', '18', '25725', '978', '0'), +('7', '19', '18', '2343', '785', '0'), +('7', '19', '19', '1280', '3540', '0'), +('7', '19', '19', '1206', '1942', '0'), +('7', '19', '19', '68239', '1360', '0'), +('7', '19', '19', '25726', '791', '0'), +('7', '19', '13', '27715', '25245', '0'), +('7', '19', '13', '6502', '17425', '0'), +('7', '19', '13', '71308', '7822', '0'), +('7', '19', '13', '6691', '7373', '0'), +('7', '19', '14', '27715', '25245', '0'), +('7', '19', '14', '6502', '17425', '0'), +('7', '19', '14', '11644', '11154', '0'), +('7', '19', '14', '71308', '7822', '0'), +('7', '19', '11', '14762', '854', '0'), +('7', '19', '11', '13748', '489', '0'), +('7', '19', '11', '9246', '453', '0'), +('7', '19', '11', '20677', '69', '0'), +('7', '20', '22', '9246', '0', '0'), +('7', '20', '22', '10323', '0', '0'), +('7', '20', '22', '21509', '0', '0'), +('7', '20', '22', '8332', '0', '0'), +('7', '20', '1', '14701', '4052', '0'), +('7', '20', '1', '14702', '2850', '0'), +('7', '20', '1', '10165', '1638', '0'), +('7', '20', '1', '30361', '1140', '0'), +('7', '20', '2', '10142', '3012', '0'), +('7', '20', '2', '4504', '2158', '0'), +('7', '20', '2', '1405', '1810', '0'), +('7', '20', '2', '2191', '1592', '0'), +('7', '20', '3', '10144', '1206', '0'), +('7', '20', '3', '2403', '1146', '0'), +('7', '20', '3', '14705', '990', '0'), +('7', '20', '3', '14706', '990', '0'), +('7', '20', '5', '14703', '6050', '0'), +('7', '20', '5', '14700', '3753', '0'), +('7', '20', '5', '10055', '3505', '0'), +('7', '20', '5', '2583', '2444', '0'), +('7', '20', '8', '11621', '14377', '0'), +('7', '20', '8', '11562', '9310', '0'), +('7', '20', '8', '27714', '8111', '0'), +('7', '20', '8', '1546', '6920', '0'), +('7', '20', '6', '1557', '6760', '0'), +('7', '20', '6', '1283', '2986', '0'), +('7', '20', '6', '11561', '2525', '0'), +('7', '20', '6', '25062', '768', '0'), +('7', '20', '17', '12256', '7990', '0'), +('7', '20', '17', '1201', '2467', '0'), +('7', '20', '17', '2348', '2144', '0'), +('7', '20', '17', '2341', '1646', '0'), +('7', '20', '7', '2458', '2406', '0'), +('7', '20', '7', '1202', '2021', '0'), +('7', '20', '7', '2342', '1831', '0'), +('7', '20', '7', '1361', '1764', '0'), +('7', '20', '9', '27714', '8111', '0'), +('7', '20', '9', '14650', '1952', '0'), +('7', '20', '9', '1203', '1502', '0'), +('7', '20', '9', '10360', '1351', '0'), +('7', '20', '15', '10366', '8163', '0'), +('7', '20', '15', '10151', '7200', '0'), +('7', '20', '15', '14679', '6255', '0'), +('7', '20', '15', '14678', '5104', '0'), +('7', '20', '20', '11698', '9997', '0'), +('7', '20', '20', '11601', '8223', '0'), +('7', '20', '20', '2917', '5211', '0'), +('7', '20', '20', '1365', '4200', '0'), +('7', '20', '12', '2923', '3654', '0'), +('7', '20', '12', '11624', '2818', '0'), +('7', '20', '12', '1204', '1396', '0'), +('7', '20', '12', '8909', '1223', '0'), +('7', '20', '18', '2461', '2557', '0'), +('7', '20', '18', '1205', '1056', '0'), +('7', '20', '18', '25725', '978', '0'), +('7', '20', '18', '2343', '785', '0'), +('7', '20', '19', '1280', '3540', '0'), +('7', '20', '19', '1206', '1975', '0'), +('7', '20', '19', '68239', '1360', '0'), +('7', '20', '19', '25726', '791', '0'), +('7', '20', '13', '27715', '26223', '0'), +('7', '20', '13', '6502', '18105', '0'), +('7', '20', '13', '71308', '8134', '0'), +('7', '20', '13', '6691', '7673', '0'), +('7', '20', '14', '27715', '26223', '0'), +('7', '20', '14', '6502', '18105', '0'), +('7', '20', '14', '11644', '11154', '0'), +('7', '20', '14', '71308', '8134', '0'), +('7', '20', '11', '14762', '854', '0'), +('7', '20', '11', '13748', '489', '0'), +('7', '20', '11', '9246', '453', '0'), +('7', '20', '11', '20677', '69', '0'), +('7', '21', '22', '9246', '0', '0'), +('7', '21', '22', '10323', '0', '0'), +('7', '21', '22', '21509', '0', '0'), +('7', '21', '22', '8332', '0', '0'), +('7', '21', '1', '14701', '4052', '0'), +('7', '21', '1', '14702', '2850', '0'), +('7', '21', '1', '10165', '1638', '0'), +('7', '21', '1', '30361', '1140', '0'), +('7', '21', '2', '10142', '3012', '0'), +('7', '21', '2', '4504', '2158', '0'), +('7', '21', '2', '1405', '1810', '0'), +('7', '21', '2', '2191', '1592', '0'), +('7', '21', '3', '10144', '1206', '0'), +('7', '21', '3', '2403', '1146', '0'), +('7', '21', '3', '14705', '990', '0'), +('7', '21', '3', '14706', '990', '0'), +('7', '21', '5', '14703', '6050', '0'), +('7', '21', '5', '14700', '3753', '0'), +('7', '21', '5', '10055', '3505', '0'), +('7', '21', '5', '2583', '2444', '0'), +('7', '21', '8', '11621', '14377', '0'), +('7', '21', '8', '11562', '9310', '0'), +('7', '21', '8', '27714', '8140', '0'), +('7', '21', '8', '1546', '6920', '0'), +('7', '21', '6', '1557', '6760', '0'), +('7', '21', '6', '1283', '2986', '0'), +('7', '21', '6', '11561', '2554', '0'), +('7', '21', '6', '25062', '768', '0'), +('7', '21', '17', '12256', '8011', '0'), +('7', '21', '17', '1201', '2467', '0'), +('7', '21', '17', '2348', '2165', '0'), +('7', '21', '17', '2341', '1646', '0'), +('7', '21', '7', '2458', '2406', '0'), +('7', '21', '7', '1202', '2059', '0'), +('7', '21', '7', '2342', '1843', '0'), +('7', '21', '7', '1361', '1764', '0'), +('7', '21', '9', '27714', '8140', '0'), +('7', '21', '9', '14650', '1952', '0'), +('7', '21', '9', '1203', '1523', '0'), +('7', '21', '9', '10360', '1351', '0'), +('7', '21', '15', '10366', '8163', '0'), +('7', '21', '15', '10151', '7200', '0'), +('7', '21', '15', '14679', '6255', '0'), +('7', '21', '15', '14678', '5104', '0'), +('7', '21', '20', '11698', '9997', '0'), +('7', '21', '20', '11601', '8266', '0'), +('7', '21', '20', '2917', '5211', '0'), +('7', '21', '20', '1365', '4200', '0'), +('7', '21', '12', '2923', '3654', '0'), +('7', '21', '12', '11624', '2847', '0'), +('7', '21', '12', '1204', '1396', '0'), +('7', '21', '12', '8909', '1234', '0'), +('7', '21', '18', '2461', '2557', '0'), +('7', '21', '18', '1205', '1056', '0'), +('7', '21', '18', '25725', '978', '0'), +('7', '21', '18', '2343', '785', '0'), +('7', '21', '19', '1280', '3540', '0'), +('7', '21', '19', '1206', '2013', '0'), +('7', '21', '19', '68239', '1360', '0'), +('7', '21', '19', '25726', '791', '0'), +('7', '21', '13', '27715', '26520', '0'), +('7', '21', '13', '6502', '18318', '0'), +('7', '21', '13', '71308', '8219', '0'), +('7', '21', '13', '6691', '7765', '0'), +('7', '21', '14', '27715', '26520', '0'), +('7', '21', '14', '6502', '18318', '0'), +('7', '21', '14', '11644', '11154', '0'), +('7', '21', '14', '71308', '8219', '0'), +('7', '21', '11', '14762', '854', '0'), +('7', '21', '11', '13748', '489', '0'), +('7', '21', '11', '9246', '453', '0'), +('7', '21', '11', '20677', '69', '0'), +('7', '22', '22', '9246', '0', '0'), +('7', '22', '22', '10323', '0', '0'), +('7', '22', '22', '21509', '0', '0'), +('7', '22', '22', '8332', '0', '0'), +('7', '22', '1', '14701', '4052', '0'), +('7', '22', '1', '14702', '2850', '0'), +('7', '22', '1', '10165', '1638', '0'), +('7', '22', '1', '30361', '1140', '0'), +('7', '22', '2', '10142', '3012', '0'), +('7', '22', '2', '4504', '2158', '0'), +('7', '22', '2', '1405', '1810', '0'), +('7', '22', '2', '2191', '1592', '0'), +('7', '22', '3', '10144', '1206', '0'), +('7', '22', '3', '2403', '1146', '0'), +('7', '22', '3', '14705', '990', '0'), +('7', '22', '3', '14706', '990', '0'), +('7', '22', '5', '14703', '6050', '0'), +('7', '22', '5', '14700', '3753', '0'), +('7', '22', '5', '10055', '3505', '0'), +('7', '22', '5', '2583', '2444', '0'), +('7', '22', '8', '11621', '14377', '0'), +('7', '22', '8', '11562', '9310', '0'), +('7', '22', '8', '27714', '8166', '0'), +('7', '22', '8', '1546', '6920', '0'), +('7', '22', '6', '1557', '6760', '0'), +('7', '22', '6', '1283', '2986', '0'), +('7', '22', '6', '11561', '2580', '0'), +('7', '22', '6', '25062', '768', '0'), +('7', '22', '17', '12256', '8029', '0'), +('7', '22', '17', '1201', '2467', '0'), +('7', '22', '17', '2348', '2183', '0'), +('7', '22', '17', '2341', '1646', '0'), +('7', '22', '7', '2458', '2406', '0'), +('7', '22', '7', '1202', '2092', '0'), +('7', '22', '7', '2342', '1854', '0'), +('7', '22', '7', '1361', '1764', '0'), +('7', '22', '9', '27714', '8166', '0'), +('7', '22', '9', '14650', '1952', '0'), +('7', '22', '9', '1203', '1542', '0'), +('7', '22', '9', '10360', '1351', '0'), +('7', '22', '15', '10366', '8163', '0'), +('7', '22', '15', '10151', '7200', '0'), +('7', '22', '15', '14679', '6255', '0'), +('7', '22', '15', '14678', '5104', '0'), +('7', '22', '20', '11698', '9997', '0'), +('7', '22', '20', '11601', '8302', '0'), +('7', '22', '20', '2917', '5211', '0'), +('7', '22', '20', '1365', '4200', '0'), +('7', '22', '12', '2923', '3654', '0'), +('7', '22', '12', '11624', '2873', '0'), +('7', '22', '12', '1204', '1396', '0'), +('7', '22', '12', '8909', '1243', '0'), +('7', '22', '18', '2461', '2557', '0'), +('7', '22', '18', '1205', '1056', '0'), +('7', '22', '18', '25725', '978', '0'), +('7', '22', '18', '2343', '785', '0'), +('7', '22', '19', '1280', '3540', '0'), +('7', '22', '19', '1206', '2046', '0'), +('7', '22', '19', '68239', '1360', '0'), +('7', '22', '19', '25726', '791', '0'), +('7', '22', '13', '27715', '26860', '0'), +('7', '22', '13', '6502', '18530', '0'), +('7', '22', '13', '71308', '8304', '0'), +('7', '22', '13', '6691', '7858', '0'), +('7', '22', '14', '27715', '26860', '0'), +('7', '22', '14', '6502', '18530', '0'), +('7', '22', '14', '11644', '11154', '0'), +('7', '22', '14', '71308', '8304', '0'), +('7', '22', '11', '14762', '854', '0'), +('7', '22', '11', '13748', '489', '0'), +('7', '22', '11', '9246', '453', '0'), +('7', '22', '11', '20677', '69', '0'), +('7', '23', '22', '9246', '0', '0'), +('7', '23', '22', '10323', '0', '0'), +('7', '23', '22', '21509', '0', '0'), +('7', '23', '22', '8332', '0', '0'), +('7', '23', '1', '14701', '4052', '0'), +('7', '23', '1', '14702', '2850', '0'), +('7', '23', '1', '10165', '1638', '0'), +('7', '23', '1', '30361', '1140', '0'), +('7', '23', '2', '10142', '3012', '0'), +('7', '23', '2', '4504', '2158', '0'), +('7', '23', '2', '1405', '1810', '0'), +('7', '23', '2', '2191', '1592', '0'), +('7', '23', '3', '10144', '1206', '0'), +('7', '23', '3', '2403', '1146', '0'), +('7', '23', '3', '14705', '990', '0'), +('7', '23', '3', '14706', '990', '0'), +('7', '23', '5', '14703', '6050', '0'), +('7', '23', '5', '14700', '3753', '0'), +('7', '23', '5', '10055', '3505', '0'), +('7', '23', '5', '2583', '2444', '0'), +('7', '23', '8', '11621', '14377', '0'), +('7', '23', '8', '11562', '9310', '0'), +('7', '23', '8', '27714', '8195', '0'), +('7', '23', '8', '1546', '6920', '0'), +('7', '23', '6', '1557', '6760', '0'), +('7', '23', '6', '1283', '2986', '0'), +('7', '23', '6', '11561', '2609', '0'), +('7', '23', '6', '25062', '768', '0'), +('7', '23', '17', '12256', '8050', '0'), +('7', '23', '17', '1201', '2467', '0'), +('7', '23', '17', '2348', '2205', '0'), +('7', '23', '17', '2341', '1646', '0'), +('7', '23', '7', '2458', '2406', '0'), +('7', '23', '7', '1202', '2130', '0'), +('7', '23', '7', '2342', '1867', '0'), +('7', '23', '7', '1361', '1764', '0'), +('7', '23', '9', '27714', '8195', '0'), +('7', '23', '9', '14650', '1952', '0'), +('7', '23', '9', '1203', '1563', '0'), +('7', '23', '9', '10360', '1351', '0'), +('7', '23', '15', '10366', '8163', '0'), +('7', '23', '15', '10151', '7200', '0'), +('7', '23', '15', '14679', '6255', '0'), +('7', '23', '15', '14678', '5104', '0'), +('7', '23', '20', '11698', '9997', '0'), +('7', '23', '20', '11601', '8344', '0'), +('7', '23', '20', '2917', '5211', '0'), +('7', '23', '20', '1365', '4200', '0'), +('7', '23', '12', '2923', '3654', '0'), +('7', '23', '12', '11624', '2902', '0'), +('7', '23', '12', '1204', '1396', '0'), +('7', '23', '12', '8909', '1254', '0'), +('7', '23', '18', '2461', '2557', '0'), +('7', '23', '18', '1205', '1056', '0'), +('7', '23', '18', '25725', '978', '0'), +('7', '23', '18', '2343', '785', '0'), +('7', '23', '19', '1280', '3540', '0'), +('7', '23', '19', '1206', '2084', '0'), +('7', '23', '19', '68239', '1360', '0'), +('7', '23', '19', '25726', '791', '0'), +('7', '23', '13', '27715', '27158', '0'), +('7', '23', '13', '6502', '18743', '0'), +('7', '23', '13', '71308', '8389', '0'), +('7', '23', '13', '6691', '7927', '0'), +('7', '23', '14', '27715', '27158', '0'), +('7', '23', '14', '6502', '18743', '0'), +('7', '23', '14', '11644', '11154', '0'), +('7', '23', '14', '71308', '8389', '0'), +('7', '23', '11', '14762', '854', '0'), +('7', '23', '11', '13748', '489', '0'), +('7', '23', '11', '9246', '453', '0'), +('7', '23', '11', '20677', '69', '0'), +('7', '24', '22', '9246', '0', '0'), +('7', '24', '22', '10323', '0', '0'), +('7', '24', '22', '21509', '0', '0'), +('7', '24', '22', '8332', '0', '0'), +('7', '24', '1', '14701', '4052', '0'), +('7', '24', '1', '14702', '2850', '0'), +('7', '24', '1', '10165', '1638', '0'), +('7', '24', '1', '30361', '1140', '0'), +('7', '24', '2', '10142', '3012', '0'), +('7', '24', '2', '4504', '2158', '0'), +('7', '24', '2', '1405', '1810', '0'), +('7', '24', '2', '2191', '1592', '0'), +('7', '24', '3', '10144', '1206', '0'), +('7', '24', '3', '2403', '1146', '0'), +('7', '24', '3', '14705', '990', '0'), +('7', '24', '3', '14706', '990', '0'), +('7', '24', '5', '14703', '6050', '0'), +('7', '24', '5', '14700', '3753', '0'), +('7', '24', '5', '10055', '3505', '0'), +('7', '24', '5', '2583', '2444', '0'), +('7', '24', '8', '11621', '14377', '0'), +('7', '24', '8', '11562', '9310', '0'), +('7', '24', '8', '27714', '8225', '0'), +('7', '24', '8', '1546', '6920', '0'), +('7', '24', '6', '1557', '6760', '0'), +('7', '24', '6', '1283', '2986', '0'), +('7', '24', '6', '11561', '2639', '0'), +('7', '24', '6', '25062', '768', '0'), +('7', '24', '17', '12256', '8071', '0'), +('7', '24', '17', '1201', '2467', '0'), +('7', '24', '17', '2348', '2226', '0'), +('7', '24', '17', '2341', '1646', '0'), +('7', '24', '7', '2458', '2406', '0'), +('7', '24', '7', '1202', '2168', '0'), +('7', '24', '7', '2342', '1879', '0'), +('7', '24', '7', '1361', '1764', '0'), +('7', '24', '9', '27714', '8225', '0'), +('7', '24', '9', '14650', '1952', '0'), +('7', '24', '9', '1203', '1584', '0'), +('7', '24', '9', '10360', '1351', '0'), +('7', '24', '15', '10366', '8163', '0'), +('7', '24', '15', '10151', '7200', '0'), +('7', '24', '15', '14679', '6255', '0'), +('7', '24', '15', '14678', '5104', '0'), +('7', '24', '20', '11698', '9997', '0'), +('7', '24', '20', '11601', '8386', '0'), +('7', '24', '20', '2917', '5211', '0'), +('7', '24', '20', '1365', '4200', '0'), +('7', '24', '12', '2923', '3654', '0'), +('7', '24', '12', '11624', '2932', '0'), +('7', '24', '12', '1204', '1396', '0'), +('7', '24', '12', '8909', '1264', '0'), +('7', '24', '18', '2461', '2557', '0'), +('7', '24', '18', '1205', '1056', '0'), +('7', '24', '18', '25725', '978', '0'), +('7', '24', '18', '2343', '785', '0'), +('7', '24', '19', '1280', '3540', '0'), +('7', '24', '19', '1206', '2122', '0'), +('7', '24', '19', '68239', '1360', '0'), +('7', '24', '19', '25726', '791', '0'), +('7', '24', '13', '27715', '27455', '0'), +('7', '24', '13', '6502', '18955', '0'), +('7', '24', '13', '71308', '8474', '0'), +('7', '24', '13', '6691', '8020', '0'), +('7', '24', '14', '27715', '27455', '0'), +('7', '24', '14', '6502', '18955', '0'), +('7', '24', '14', '11644', '11154', '0'), +('7', '24', '14', '71308', '8474', '0'), +('7', '24', '11', '14762', '854', '0'), +('7', '24', '11', '13748', '489', '0'), +('7', '24', '11', '9246', '453', '0'), +('7', '24', '11', '20677', '69', '0'), +('7', '25', '22', '9246', '0', '0'), +('7', '25', '22', '10323', '0', '0'), +('7', '25', '22', '21509', '0', '0'), +('7', '25', '22', '8332', '0', '0'), +('7', '25', '1', '14701', '4052', '0'), +('7', '25', '1', '14702', '2850', '0'), +('7', '25', '1', '10165', '1638', '0'), +('7', '25', '1', '30361', '1140', '0'), +('7', '25', '2', '10142', '3012', '0'), +('7', '25', '2', '4504', '2158', '0'), +('7', '25', '2', '1405', '1810', '0'), +('7', '25', '2', '2191', '1592', '0'), +('7', '25', '3', '10144', '1206', '0'), +('7', '25', '3', '2403', '1146', '0'), +('7', '25', '3', '14705', '990', '0'), +('7', '25', '3', '14706', '990', '0'), +('7', '25', '5', '14703', '6050', '0'), +('7', '25', '5', '14700', '3753', '0'), +('7', '25', '5', '10055', '3505', '0'), +('7', '25', '5', '2583', '2444', '0'), +('7', '25', '8', '11621', '14377', '0'), +('7', '25', '8', '11562', '9310', '0'), +('7', '25', '8', '27714', '8250', '0'), +('7', '25', '8', '1546', '6920', '0'), +('7', '25', '6', '1557', '6760', '0'), +('7', '25', '6', '1283', '2986', '0'), +('7', '25', '6', '11561', '2664', '0'), +('7', '25', '6', '25062', '768', '0'), +('7', '25', '17', '12256', '8089', '0'), +('7', '25', '17', '1201', '2467', '0'), +('7', '25', '17', '2348', '2244', '0'), +('7', '25', '17', '2341', '1646', '0'), +('7', '25', '7', '2458', '2406', '0'), +('7', '25', '7', '1202', '2200', '0'), +('7', '25', '7', '2342', '1890', '0'), +('7', '25', '7', '1361', '1764', '0'), +('7', '25', '9', '27714', '8250', '0'), +('7', '25', '9', '14650', '1952', '0'), +('7', '25', '9', '1203', '1602', '0'), +('7', '25', '9', '10360', '1351', '0'), +('7', '25', '15', '10366', '8163', '0'), +('7', '25', '15', '10151', '7200', '0'), +('7', '25', '15', '14679', '6255', '0'), +('7', '25', '15', '14678', '5104', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '25', '20', '11698', '9997', '0'), +('7', '25', '20', '11601', '8423', '0'), +('7', '25', '20', '2917', '5211', '0'), +('7', '25', '20', '1365', '4200', '0'), +('7', '25', '12', '2923', '3654', '0'), +('7', '25', '12', '11624', '2957', '0'), +('7', '25', '12', '1204', '1396', '0'), +('7', '25', '12', '8909', '1274', '0'), +('7', '25', '18', '2461', '2557', '0'), +('7', '25', '18', '1205', '1056', '0'), +('7', '25', '18', '25725', '978', '0'), +('7', '25', '18', '2343', '785', '0'), +('7', '25', '19', '1280', '3540', '0'), +('7', '25', '19', '1206', '2154', '0'), +('7', '25', '19', '68239', '1360', '0'), +('7', '25', '19', '25726', '791', '0'), +('7', '25', '13', '27715', '27753', '0'), +('7', '25', '13', '6502', '19168', '0'), +('7', '25', '13', '71308', '8587', '0'), +('7', '25', '13', '6691', '8112', '0'), +('7', '25', '14', '27715', '27753', '0'), +('7', '25', '14', '6502', '19168', '0'), +('7', '25', '14', '11644', '11154', '0'), +('7', '25', '14', '71308', '8587', '0'), +('7', '25', '11', '14762', '854', '0'), +('7', '25', '11', '13748', '489', '0'), +('7', '25', '11', '9246', '453', '0'), +('7', '25', '11', '20677', '69', '0'), +('7', '26', '22', '9246', '0', '0'), +('7', '26', '22', '10323', '0', '0'), +('7', '26', '22', '21509', '0', '0'), +('7', '26', '22', '8332', '0', '0'), +('7', '26', '1', '14701', '4052', '0'), +('7', '26', '1', '14702', '2850', '0'), +('7', '26', '1', '10165', '1638', '0'), +('7', '26', '1', '30361', '1140', '0'), +('7', '26', '2', '10142', '3012', '0'), +('7', '26', '2', '4504', '2158', '0'), +('7', '26', '2', '1405', '1810', '0'), +('7', '26', '2', '2191', '1592', '0'), +('7', '26', '3', '10144', '1206', '0'), +('7', '26', '3', '2403', '1146', '0'), +('7', '26', '3', '14705', '990', '0'), +('7', '26', '3', '14706', '990', '0'), +('7', '26', '5', '14703', '6050', '0'), +('7', '26', '5', '14700', '3753', '0'), +('7', '26', '5', '10055', '3505', '0'), +('7', '26', '5', '2583', '2444', '0'), +('7', '26', '8', '11621', '14377', '0'), +('7', '26', '8', '11562', '9310', '0'), +('7', '26', '8', '27714', '8280', '0'), +('7', '26', '8', '1546', '6920', '0'), +('7', '26', '6', '1557', '6760', '0'), +('7', '26', '6', '1283', '2986', '0'), +('7', '26', '6', '11561', '2694', '0'), +('7', '26', '6', '25062', '768', '0'), +('7', '26', '17', '12256', '8111', '0'), +('7', '26', '17', '1201', '2467', '0'), +('7', '26', '17', '2348', '2265', '0'), +('7', '26', '17', '2341', '1646', '0'), +('7', '26', '7', '2458', '2406', '0'), +('7', '26', '7', '1202', '2238', '0'), +('7', '26', '7', '2342', '1903', '0'), +('7', '26', '7', '1361', '1764', '0'), +('7', '26', '9', '27714', '8280', '0'), +('7', '26', '9', '14650', '1952', '0'), +('7', '26', '9', '1203', '1623', '0'), +('7', '26', '9', '10360', '1351', '0'), +('7', '26', '15', '10366', '8163', '0'), +('7', '26', '15', '10151', '7200', '0'), +('7', '26', '15', '14679', '6255', '0'), +('7', '26', '15', '14678', '5104', '0'), +('7', '26', '20', '11698', '9997', '0'), +('7', '26', '20', '11601', '8465', '0'), +('7', '26', '20', '2917', '5211', '0'), +('7', '26', '20', '1365', '4200', '0'), +('7', '26', '12', '2923', '3654', '0'), +('7', '26', '12', '11624', '2987', '0'), +('7', '26', '12', '1204', '1396', '0'), +('7', '26', '12', '8909', '1284', '0'), +('7', '26', '18', '2461', '2557', '0'), +('7', '26', '18', '1205', '1056', '0'), +('7', '26', '18', '25725', '978', '0'), +('7', '26', '18', '2343', '785', '0'), +('7', '26', '19', '1280', '3540', '0'), +('7', '26', '19', '1206', '2193', '0'), +('7', '26', '19', '68239', '1360', '0'), +('7', '26', '19', '25726', '791', '0'), +('7', '26', '13', '27715', '28050', '0'), +('7', '26', '13', '6502', '19380', '0'), +('7', '26', '13', '71308', '8672', '0'), +('7', '26', '13', '6691', '8204', '0'), +('7', '26', '14', '27715', '28050', '0'), +('7', '26', '14', '6502', '19380', '0'), +('7', '26', '14', '11644', '11154', '0'), +('7', '26', '14', '71308', '8672', '0'), +('7', '26', '11', '14762', '854', '0'), +('7', '26', '11', '13748', '489', '0'), +('7', '26', '11', '9246', '453', '0'), +('7', '26', '11', '20677', '69', '0'), +('7', '27', '22', '9246', '0', '0'), +('7', '27', '22', '10323', '0', '0'), +('7', '27', '22', '21509', '0', '0'), +('7', '27', '22', '8332', '0', '0'), +('7', '27', '1', '14701', '4052', '0'), +('7', '27', '1', '14702', '2850', '0'), +('7', '27', '1', '10165', '1638', '0'), +('7', '27', '1', '30361', '1140', '0'), +('7', '27', '2', '10142', '3012', '0'), +('7', '27', '2', '4504', '2158', '0'), +('7', '27', '2', '1405', '1810', '0'), +('7', '27', '2', '2191', '1592', '0'), +('7', '27', '3', '10144', '1206', '0'), +('7', '27', '3', '2403', '1146', '0'), +('7', '27', '3', '14705', '990', '0'), +('7', '27', '3', '14706', '990', '0'), +('7', '27', '5', '14703', '6050', '0'), +('7', '27', '5', '14700', '3753', '0'), +('7', '27', '5', '10055', '3505', '0'), +('7', '27', '5', '2583', '2444', '0'), +('7', '27', '8', '11621', '14377', '0'), +('7', '27', '8', '11562', '9310', '0'), +('7', '27', '8', '27714', '8309', '0'), +('7', '27', '8', '1546', '6920', '0'), +('7', '27', '6', '1557', '6760', '0'), +('7', '27', '6', '1283', '2986', '0'), +('7', '27', '6', '11561', '2723', '0'), +('7', '27', '6', '25062', '768', '0'), +('7', '27', '17', '12256', '8132', '0'), +('7', '27', '17', '1201', '2467', '0'), +('7', '27', '17', '2348', '2286', '0'), +('7', '27', '17', '2341', '1646', '0'), +('7', '27', '7', '2458', '2406', '0'), +('7', '27', '7', '1202', '2276', '0'), +('7', '27', '7', '2342', '1916', '0'), +('7', '27', '7', '1361', '1764', '0'), +('7', '27', '9', '27714', '8309', '0'), +('7', '27', '9', '14650', '1952', '0'), +('7', '27', '9', '1203', '1644', '0'), +('7', '27', '9', '10360', '1351', '0'), +('7', '27', '15', '10366', '8163', '0'), +('7', '27', '15', '10151', '7200', '0'), +('7', '27', '15', '14679', '6255', '0'), +('7', '27', '15', '14678', '5104', '0'), +('7', '27', '20', '11698', '9997', '0'), +('7', '27', '20', '11601', '8507', '0'), +('7', '27', '20', '2917', '5211', '0'), +('7', '27', '20', '1365', '4200', '0'), +('7', '27', '12', '2923', '3654', '0'), +('7', '27', '12', '11624', '3017', '0'), +('7', '27', '12', '1204', '1396', '0'), +('7', '27', '12', '8909', '1295', '0'), +('7', '27', '18', '2461', '2557', '0'), +('7', '27', '18', '1205', '1056', '0'), +('7', '27', '18', '25725', '978', '0'), +('7', '27', '18', '2343', '785', '0'), +('7', '27', '19', '1280', '3540', '0'), +('7', '27', '19', '1206', '2231', '0'), +('7', '27', '19', '68239', '1360', '0'), +('7', '27', '19', '25726', '791', '0'), +('7', '27', '13', '27715', '28348', '0'), +('7', '27', '13', '6502', '19593', '0'), +('7', '27', '13', '71308', '8757', '0'), +('7', '27', '13', '6691', '8297', '0'), +('7', '27', '14', '27715', '28348', '0'), +('7', '27', '14', '6502', '19593', '0'), +('7', '27', '14', '11644', '11154', '0'), +('7', '27', '14', '71308', '8757', '0'), +('7', '27', '11', '14762', '854', '0'), +('7', '27', '11', '13748', '489', '0'), +('7', '27', '11', '9246', '453', '0'), +('7', '27', '11', '20677', '69', '0'), +('7', '28', '22', '9246', '0', '0'), +('7', '28', '22', '10323', '0', '0'), +('7', '28', '22', '21509', '0', '0'), +('7', '28', '22', '8332', '0', '0'), +('7', '28', '1', '14701', '4052', '0'), +('7', '28', '1', '14702', '2850', '0'), +('7', '28', '1', '10165', '1638', '0'), +('7', '28', '1', '30361', '1140', '0'), +('7', '28', '2', '10142', '3012', '0'), +('7', '28', '2', '4504', '2158', '0'), +('7', '28', '2', '1405', '1810', '0'), +('7', '28', '2', '2191', '1592', '0'), +('7', '28', '3', '10144', '1206', '0'), +('7', '28', '3', '2403', '1146', '0'), +('7', '28', '3', '14705', '990', '0'), +('7', '28', '3', '14706', '990', '0'), +('7', '28', '5', '14703', '6050', '0'), +('7', '28', '5', '14700', '3753', '0'), +('7', '28', '5', '10055', '3505', '0'), +('7', '28', '5', '2583', '2444', '0'), +('7', '28', '8', '11621', '14377', '0'), +('7', '28', '8', '11562', '9310', '0'), +('7', '28', '8', '27714', '8335', '0'), +('7', '28', '8', '1546', '6920', '0'), +('7', '28', '6', '1557', '6760', '0'), +('7', '28', '6', '1283', '2986', '0'), +('7', '28', '6', '11561', '2749', '0'), +('7', '28', '6', '25062', '768', '0'), +('7', '28', '17', '12256', '8150', '0'), +('7', '28', '17', '1201', '2467', '0'), +('7', '28', '17', '2348', '2304', '0'), +('7', '28', '17', '2341', '1646', '0'), +('7', '28', '7', '2458', '2406', '0'), +('7', '28', '7', '1202', '2309', '0'), +('7', '28', '7', '2342', '1927', '0'), +('7', '28', '7', '1361', '1764', '0'), +('7', '28', '9', '27714', '8335', '0'), +('7', '28', '9', '14650', '1952', '0'), +('7', '28', '9', '1203', '1662', '0'), +('7', '28', '9', '10360', '1351', '0'), +('7', '28', '15', '10366', '8163', '0'), +('7', '28', '15', '10151', '7200', '0'), +('7', '28', '15', '14679', '6255', '0'), +('7', '28', '15', '14678', '5104', '0'), +('7', '28', '20', '11698', '9997', '0'), +('7', '28', '20', '11601', '8544', '0'), +('7', '28', '20', '2917', '5211', '0'), +('7', '28', '20', '1365', '4200', '0'), +('7', '28', '12', '2923', '3654', '0'), +('7', '28', '12', '11624', '3042', '0'), +('7', '28', '12', '1204', '1396', '0'), +('7', '28', '12', '8909', '1304', '0'), +('7', '28', '18', '2461', '2557', '0'), +('7', '28', '18', '1205', '1056', '0'), +('7', '28', '18', '25725', '978', '0'), +('7', '28', '18', '2343', '785', '0'), +('7', '28', '19', '1280', '3540', '0'), +('7', '28', '19', '1206', '2263', '0'), +('7', '28', '19', '68239', '1360', '0'), +('7', '28', '19', '25726', '791', '0'), +('7', '28', '13', '27715', '28645', '0'), +('7', '28', '13', '6502', '19805', '0'), +('7', '28', '13', '71308', '8842', '0'), +('7', '28', '13', '6691', '8366', '0'), +('7', '28', '14', '27715', '28645', '0'), +('7', '28', '14', '6502', '19805', '0'), +('7', '28', '14', '11644', '11154', '0'), +('7', '28', '14', '71308', '8842', '0'), +('7', '28', '11', '14762', '854', '0'), +('7', '28', '11', '13748', '489', '0'), +('7', '28', '11', '9246', '453', '0'), +('7', '28', '11', '20677', '69', '0'), +('7', '29', '22', '9246', '0', '0'), +('7', '29', '22', '10323', '0', '0'), +('7', '29', '22', '21509', '0', '0'), +('7', '29', '22', '8332', '0', '0'), +('7', '29', '1', '14701', '4052', '0'), +('7', '29', '1', '14702', '2850', '0'), +('7', '29', '1', '10165', '1638', '0'), +('7', '29', '1', '30361', '1140', '0'), +('7', '29', '2', '10142', '3012', '0'), +('7', '29', '2', '4504', '2158', '0'), +('7', '29', '2', '1405', '1810', '0'), +('7', '29', '2', '2191', '1592', '0'), +('7', '29', '3', '10144', '1206', '0'), +('7', '29', '3', '2403', '1146', '0'), +('7', '29', '3', '14705', '990', '0'), +('7', '29', '3', '14706', '990', '0'), +('7', '29', '5', '14703', '6050', '0'), +('7', '29', '5', '14700', '3753', '0'), +('7', '29', '5', '10055', '3505', '0'), +('7', '29', '5', '2583', '2444', '0'), +('7', '29', '8', '11621', '14377', '0'), +('7', '29', '8', '11562', '9310', '0'), +('7', '29', '8', '27714', '8364', '0'), +('7', '29', '8', '1546', '6920', '0'), +('7', '29', '6', '1557', '6760', '0'), +('7', '29', '6', '1283', '2986', '0'), +('7', '29', '6', '11561', '2778', '0'), +('7', '29', '6', '25062', '768', '0'), +('7', '29', '17', '12256', '8171', '0'), +('7', '29', '17', '1201', '2467', '0'), +('7', '29', '17', '2348', '2325', '0'), +('7', '29', '17', '2341', '1646', '0'), +('7', '29', '7', '2458', '2406', '0'), +('7', '29', '7', '1202', '2347', '0'), +('7', '29', '7', '2342', '1939', '0'), +('7', '29', '7', '1361', '1764', '0'), +('7', '29', '9', '27714', '8364', '0'), +('7', '29', '9', '14650', '1952', '0'), +('7', '29', '9', '1203', '1684', '0'), +('7', '29', '9', '10360', '1351', '0'), +('7', '29', '15', '10366', '8163', '0'), +('7', '29', '15', '10151', '7200', '0'), +('7', '29', '15', '14679', '6255', '0'), +('7', '29', '15', '14678', '5104', '0'), +('7', '29', '20', '11698', '9997', '0'), +('7', '29', '20', '11601', '8586', '0'), +('7', '29', '20', '2917', '5211', '0'), +('7', '29', '20', '1365', '4200', '0'), +('7', '29', '12', '2923', '3654', '0'), +('7', '29', '12', '11624', '3072', '0'), +('7', '29', '12', '1204', '1396', '0'), +('7', '29', '12', '8909', '1315', '0'), +('7', '29', '18', '2461', '2557', '0'), +('7', '29', '18', '1205', '1056', '0'), +('7', '29', '18', '25725', '978', '0'), +('7', '29', '18', '2343', '785', '0'), +('7', '29', '19', '1280', '3540', '0'), +('7', '29', '19', '1206', '2301', '0'), +('7', '29', '19', '68239', '1360', '0'), +('7', '29', '19', '25726', '791', '0'), +('7', '29', '13', '27715', '28943', '0'), +('7', '29', '13', '6502', '20018', '0'), +('7', '29', '13', '71308', '8955', '0'), +('7', '29', '13', '6691', '8458', '0'), +('7', '29', '14', '27715', '28943', '0'), +('7', '29', '14', '6502', '20018', '0'), +('7', '29', '14', '11644', '11154', '0'), +('7', '29', '14', '71308', '8955', '0'), +('7', '29', '11', '14762', '854', '0'), +('7', '29', '11', '13748', '489', '0'), +('7', '29', '11', '9246', '453', '0'), +('7', '29', '11', '20677', '69', '0'), +('7', '30', '22', '9246', '0', '0'), +('7', '30', '22', '10323', '0', '0'), +('7', '30', '22', '21509', '0', '0'), +('7', '30', '22', '8332', '0', '0'), +('7', '30', '1', '14701', '4052', '0'), +('7', '30', '1', '14702', '2850', '0'), +('7', '30', '1', '10165', '1638', '0'), +('7', '30', '1', '30361', '1140', '0'), +('7', '30', '2', '10142', '3012', '0'), +('7', '30', '2', '4504', '2158', '0'), +('7', '30', '2', '1405', '1810', '0'), +('7', '30', '2', '2191', '1592', '0'), +('7', '30', '3', '10144', '1206', '0'), +('7', '30', '3', '2403', '1146', '0'), +('7', '30', '3', '14705', '990', '0'), +('7', '30', '3', '14706', '990', '0'), +('7', '30', '5', '14703', '6050', '0'), +('7', '30', '5', '14700', '3753', '0'), +('7', '30', '5', '10055', '3505', '0'), +('7', '30', '5', '2583', '2444', '0'), +('7', '30', '8', '11621', '14377', '0'), +('7', '30', '8', '11562', '9310', '0'), +('7', '30', '8', '27714', '8394', '0'), +('7', '30', '8', '1546', '6920', '0'), +('7', '30', '6', '1557', '6760', '0'), +('7', '30', '6', '1283', '2986', '0'), +('7', '30', '6', '11561', '2808', '0'), +('7', '30', '6', '25062', '768', '0'), +('7', '30', '17', '12256', '8192', '0'), +('7', '30', '17', '1201', '2467', '0'), +('7', '30', '17', '2348', '2347', '0'), +('7', '30', '17', '2341', '1646', '0'), +('7', '30', '7', '2458', '2406', '0'), +('7', '30', '7', '1202', '2385', '0'), +('7', '30', '7', '2342', '1952', '0'), +('7', '30', '7', '1361', '1764', '0'), +('7', '30', '9', '27714', '8394', '0'), +('7', '30', '9', '14650', '1952', '0'), +('7', '30', '9', '1203', '1705', '0'), +('7', '30', '9', '10360', '1351', '0'), +('7', '30', '15', '10366', '8163', '0'), +('7', '30', '15', '10151', '7200', '0'), +('7', '30', '15', '14679', '6255', '0'), +('7', '30', '15', '14678', '5104', '0'), +('7', '30', '20', '11698', '9997', '0'), +('7', '30', '20', '11601', '8628', '0'), +('7', '30', '20', '2917', '5211', '0'), +('7', '30', '20', '1365', '4200', '0'), +('7', '30', '12', '2923', '3654', '0'), +('7', '30', '12', '11624', '3101', '0'), +('7', '30', '12', '1204', '1396', '0'), +('7', '30', '12', '8909', '1325', '0'), +('7', '30', '18', '2461', '2557', '0'), +('7', '30', '18', '1205', '1056', '0'), +('7', '30', '18', '25725', '978', '0'), +('7', '30', '18', '2343', '785', '0'), +('7', '30', '19', '1280', '3540', '0'), +('7', '30', '19', '1206', '2339', '0'), +('7', '30', '19', '68239', '1360', '0'), +('7', '30', '19', '25726', '791', '0'), +('7', '30', '13', '27715', '29283', '0'), +('7', '30', '13', '6502', '20230', '0'), +('7', '30', '13', '71308', '9040', '0'), +('7', '30', '13', '6691', '8551', '0'), +('7', '30', '14', '27715', '29283', '0'), +('7', '30', '14', '6502', '20230', '0'), +('7', '30', '14', '11644', '11154', '0'), +('7', '30', '14', '71308', '9040', '0'), +('7', '30', '11', '14762', '854', '0'), +('7', '30', '11', '13748', '489', '0'), +('7', '30', '11', '9246', '453', '0'), +('7', '30', '11', '20677', '69', '0'), +('7', '31', '22', '9246', '0', '0'), +('7', '31', '22', '10323', '0', '0'), +('7', '31', '22', '21509', '0', '0'), +('7', '31', '22', '8332', '0', '0'), +('7', '31', '1', '14701', '4052', '0'), +('7', '31', '1', '14702', '2850', '0'), +('7', '31', '1', '10165', '1638', '0'), +('7', '31', '1', '30361', '1140', '0'), +('7', '31', '2', '10142', '3012', '0'), +('7', '31', '2', '4504', '2158', '0'), +('7', '31', '2', '1405', '1810', '0'), +('7', '31', '2', '2191', '1592', '0'), +('7', '31', '3', '10144', '1206', '0'), +('7', '31', '3', '2403', '1146', '0'), +('7', '31', '3', '14705', '990', '0'), +('7', '31', '3', '14706', '990', '0'), +('7', '31', '5', '14703', '6050', '0'), +('7', '31', '5', '14700', '3753', '0'), +('7', '31', '5', '10055', '3505', '0'), +('7', '31', '5', '2583', '2444', '0'), +('7', '31', '8', '11621', '14377', '0'), +('7', '31', '8', '11562', '9310', '0'), +('7', '31', '8', '27714', '8423', '0'), +('7', '31', '8', '1546', '6920', '0'), +('7', '31', '6', '1557', '6760', '0'), +('7', '31', '6', '1283', '2986', '0'), +('7', '31', '6', '11561', '2838', '0'), +('7', '31', '6', '25062', '768', '0'), +('7', '31', '17', '12256', '8213', '0'), +('7', '31', '17', '1201', '2467', '0'), +('7', '31', '17', '2348', '2368', '0'), +('7', '31', '17', '2341', '1646', '0'), +('7', '31', '7', '1202', '2423', '0'), +('7', '31', '7', '2458', '2406', '0'), +('7', '31', '7', '2342', '1965', '0'), +('7', '31', '7', '1361', '1764', '0'), +('7', '31', '9', '27714', '8423', '0'), +('7', '31', '9', '14650', '1952', '0'), +('7', '31', '9', '1203', '1726', '0'), +('7', '31', '9', '10360', '1351', '0'), +('7', '31', '15', '10366', '8163', '0'), +('7', '31', '15', '10151', '7200', '0'), +('7', '31', '15', '14679', '6255', '0'), +('7', '31', '15', '14678', '5104', '0'), +('7', '31', '20', '11698', '9997', '0'), +('7', '31', '20', '11601', '8670', '0'), +('7', '31', '20', '2917', '5211', '0'), +('7', '31', '20', '1365', '4200', '0'), +('7', '31', '12', '2923', '3654', '0'), +('7', '31', '12', '11624', '3131', '0'), +('7', '31', '12', '1204', '1396', '0'), +('7', '31', '12', '8909', '1336', '0'), +('7', '31', '18', '2461', '2557', '0'), +('7', '31', '18', '1205', '1056', '0'), +('7', '31', '18', '25725', '978', '0'), +('7', '31', '18', '2343', '785', '0'), +('7', '31', '19', '1280', '3540', '0'), +('7', '31', '19', '1206', '2377', '0'), +('7', '31', '19', '68239', '1360', '0'), +('7', '31', '19', '25726', '791', '0'), +('7', '31', '13', '27715', '29580', '0'), +('7', '31', '13', '6502', '20400', '0'), +('7', '31', '13', '71308', '9125', '0'), +('7', '31', '13', '6691', '8643', '0'), +('7', '31', '14', '27715', '29580', '0'), +('7', '31', '14', '6502', '20400', '0'), +('7', '31', '14', '11644', '11154', '0'), +('7', '31', '14', '71308', '9125', '0'), +('7', '31', '11', '14762', '854', '0'), +('7', '31', '11', '13748', '489', '0'), +('7', '31', '11', '9246', '453', '0'), +('7', '31', '11', '20677', '69', '0'), +('7', '32', '22', '9246', '0', '0'), +('7', '32', '22', '10323', '0', '0'), +('7', '32', '22', '21509', '0', '0'), +('7', '32', '22', '8332', '0', '0'), +('7', '32', '1', '14701', '4052', '0'), +('7', '32', '1', '14702', '2850', '0'), +('7', '32', '1', '10165', '1638', '0'), +('7', '32', '1', '30361', '1140', '0'), +('7', '32', '2', '10142', '3012', '0'), +('7', '32', '2', '4504', '2158', '0'), +('7', '32', '2', '1405', '1810', '0'), +('7', '32', '2', '2191', '1592', '0'), +('7', '32', '3', '10144', '1206', '0'), +('7', '32', '3', '2403', '1146', '0'), +('7', '32', '3', '14705', '990', '0'), +('7', '32', '3', '14706', '990', '0'), +('7', '32', '5', '14703', '6050', '0'), +('7', '32', '5', '14700', '3753', '0'), +('7', '32', '5', '10055', '3505', '0'), +('7', '32', '5', '2583', '2444', '0'), +('7', '32', '8', '11621', '14377', '0'), +('7', '32', '8', '11562', '9310', '0'), +('7', '32', '8', '27714', '8453', '0'), +('7', '32', '8', '1546', '6920', '0'), +('7', '32', '6', '1557', '6760', '0'), +('7', '32', '6', '1283', '2986', '0'), +('7', '32', '6', '11561', '2867', '0'), +('7', '32', '6', '25062', '768', '0'), +('7', '32', '17', '12256', '8234', '0'), +('7', '32', '17', '1201', '2467', '0'), +('7', '32', '17', '2348', '2389', '0'), +('7', '32', '17', '2341', '1646', '0'), +('7', '32', '7', '1202', '2461', '0'), +('7', '32', '7', '2458', '2406', '0'), +('7', '32', '7', '2342', '1977', '0'), +('7', '32', '7', '1361', '1764', '0'), +('7', '32', '9', '27714', '8453', '0'), +('7', '32', '9', '14650', '1952', '0'), +('7', '32', '9', '1203', '1747', '0'), +('7', '32', '9', '10360', '1351', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '32', '15', '10366', '8163', '0'), +('7', '32', '15', '10151', '7200', '0'), +('7', '32', '15', '14679', '6255', '0'), +('7', '32', '15', '14678', '5104', '0'), +('7', '32', '20', '11698', '9997', '0'), +('7', '32', '20', '11601', '8713', '0'), +('7', '32', '20', '2917', '5211', '0'), +('7', '32', '20', '1365', '4200', '0'), +('7', '32', '12', '2923', '3654', '0'), +('7', '32', '12', '11624', '3160', '0'), +('7', '32', '12', '1204', '1396', '0'), +('7', '32', '12', '8909', '1347', '0'), +('7', '32', '18', '2461', '2557', '0'), +('7', '32', '18', '1205', '1056', '0'), +('7', '32', '18', '25725', '978', '0'), +('7', '32', '18', '2343', '785', '0'), +('7', '32', '19', '1280', '3540', '0'), +('7', '32', '19', '1206', '2415', '0'), +('7', '32', '19', '68239', '1360', '0'), +('7', '32', '19', '25726', '791', '0'), +('7', '32', '13', '27715', '29878', '0'), +('7', '32', '13', '6502', '20613', '0'), +('7', '32', '13', '71308', '9210', '0'), +('7', '32', '13', '6691', '8736', '0'), +('7', '32', '14', '27715', '29878', '0'), +('7', '32', '14', '6502', '20613', '0'), +('7', '32', '14', '11644', '11154', '0'), +('7', '32', '14', '71308', '9210', '0'), +('7', '32', '11', '14762', '854', '0'), +('7', '32', '11', '13748', '489', '0'), +('7', '32', '11', '9246', '453', '0'), +('7', '32', '11', '20677', '69', '0'), +('7', '33', '22', '9246', '0', '0'), +('7', '33', '22', '10323', '0', '0'), +('7', '33', '22', '21509', '0', '0'), +('7', '33', '22', '8332', '0', '0'), +('7', '33', '1', '14701', '4052', '0'), +('7', '33', '1', '14702', '2850', '0'), +('7', '33', '1', '10165', '1638', '0'), +('7', '33', '1', '30361', '1140', '0'), +('7', '33', '2', '10142', '3012', '0'), +('7', '33', '2', '4504', '2158', '0'), +('7', '33', '2', '1405', '1810', '0'), +('7', '33', '2', '2191', '1592', '0'), +('7', '33', '3', '10144', '1206', '0'), +('7', '33', '3', '2403', '1146', '0'), +('7', '33', '3', '14705', '990', '0'), +('7', '33', '3', '14706', '990', '0'), +('7', '33', '5', '14703', '6050', '0'), +('7', '33', '5', '14700', '3753', '0'), +('7', '33', '5', '10055', '3505', '0'), +('7', '33', '5', '2583', '2444', '0'), +('7', '33', '8', '11621', '14377', '0'), +('7', '33', '8', '11562', '9310', '0'), +('7', '33', '8', '27714', '8483', '0'), +('7', '33', '8', '1546', '6920', '0'), +('7', '33', '6', '1557', '6760', '0'), +('7', '33', '6', '1283', '2986', '0'), +('7', '33', '6', '11561', '2897', '0'), +('7', '33', '6', '25062', '768', '0'), +('7', '33', '17', '12256', '8256', '0'), +('7', '33', '17', '1201', '2467', '0'), +('7', '33', '17', '2348', '2410', '0'), +('7', '33', '17', '2341', '1646', '0'), +('7', '33', '7', '1202', '2499', '0'), +('7', '33', '7', '2458', '2406', '0'), +('7', '33', '7', '2342', '1990', '0'), +('7', '33', '7', '1361', '1764', '0'), +('7', '33', '9', '27714', '8483', '0'), +('7', '33', '9', '14650', '1952', '0'), +('7', '33', '9', '1203', '1768', '0'), +('7', '33', '9', '10360', '1351', '0'), +('7', '33', '15', '10366', '8163', '0'), +('7', '33', '15', '10151', '7200', '0'), +('7', '33', '15', '14679', '6255', '0'), +('7', '33', '15', '14678', '5104', '0'), +('7', '33', '20', '11698', '9997', '0'), +('7', '33', '20', '11601', '8755', '0'), +('7', '33', '20', '2917', '5211', '0'), +('7', '33', '20', '1365', '4200', '0'), +('7', '33', '12', '2923', '3654', '0'), +('7', '33', '12', '11624', '3190', '0'), +('7', '33', '12', '1204', '1396', '0'), +('7', '33', '12', '8909', '1358', '0'), +('7', '33', '18', '2461', '2557', '0'), +('7', '33', '18', '1205', '1056', '0'), +('7', '33', '18', '25725', '978', '0'), +('7', '33', '18', '2343', '785', '0'), +('7', '33', '19', '1280', '3540', '0'), +('7', '33', '19', '1206', '2453', '0'), +('7', '33', '19', '68239', '1360', '0'), +('7', '33', '19', '25726', '791', '0'), +('7', '33', '13', '27715', '30175', '0'), +('7', '33', '13', '6502', '20825', '0'), +('7', '33', '13', '71308', '9295', '0'), +('7', '33', '13', '6691', '8805', '0'), +('7', '33', '14', '27715', '30175', '0'), +('7', '33', '14', '6502', '20825', '0'), +('7', '33', '14', '11644', '11154', '0'), +('7', '33', '14', '71308', '9295', '0'), +('7', '33', '11', '14762', '854', '0'), +('7', '33', '11', '13748', '489', '0'), +('7', '33', '11', '9246', '453', '0'), +('7', '33', '11', '20677', '69', '0'), +('7', '34', '22', '9246', '0', '0'), +('7', '34', '22', '10323', '0', '0'), +('7', '34', '22', '21509', '0', '0'), +('7', '34', '22', '8332', '0', '0'), +('7', '34', '1', '14701', '4052', '0'), +('7', '34', '1', '14702', '2850', '0'), +('7', '34', '1', '10165', '1638', '0'), +('7', '34', '1', '30361', '1140', '0'), +('7', '34', '2', '10142', '3012', '0'), +('7', '34', '2', '4504', '2158', '0'), +('7', '34', '2', '1405', '1810', '0'), +('7', '34', '2', '2191', '1592', '0'), +('7', '34', '3', '10144', '1206', '0'), +('7', '34', '3', '2403', '1146', '0'), +('7', '34', '3', '14705', '990', '0'), +('7', '34', '3', '14706', '990', '0'), +('7', '34', '5', '14703', '6050', '0'), +('7', '34', '5', '14700', '3753', '0'), +('7', '34', '5', '10055', '3505', '0'), +('7', '34', '5', '2583', '2444', '0'), +('7', '34', '8', '11621', '14377', '0'), +('7', '34', '8', '11562', '9310', '0'), +('7', '34', '8', '27714', '8508', '0'), +('7', '34', '8', '1546', '6920', '0'), +('7', '34', '6', '1557', '6760', '0'), +('7', '34', '6', '1283', '2986', '0'), +('7', '34', '6', '11561', '2922', '0'), +('7', '34', '6', '25062', '768', '0'), +('7', '34', '17', '12256', '8274', '0'), +('7', '34', '17', '1201', '2467', '0'), +('7', '34', '17', '2348', '2428', '0'), +('7', '34', '17', '2329', '1649', '0'), +('7', '34', '7', '1202', '2532', '0'), +('7', '34', '7', '2458', '2406', '0'), +('7', '34', '7', '2342', '2001', '0'), +('7', '34', '7', '1361', '1764', '0'), +('7', '34', '9', '27714', '8508', '0'), +('7', '34', '9', '14650', '1952', '0'), +('7', '34', '9', '1203', '1786', '0'), +('7', '34', '9', '10360', '1351', '0'), +('7', '34', '15', '10366', '8163', '0'), +('7', '34', '15', '10151', '7200', '0'), +('7', '34', '15', '14679', '6255', '0'), +('7', '34', '15', '14678', '5104', '0'), +('7', '34', '20', '11698', '9997', '0'), +('7', '34', '20', '11601', '8791', '0'), +('7', '34', '20', '2917', '5211', '0'), +('7', '34', '20', '1365', '4200', '0'), +('7', '34', '12', '2923', '3654', '0'), +('7', '34', '12', '11624', '3215', '0'), +('7', '34', '12', '1204', '1396', '0'), +('7', '34', '12', '8909', '1367', '0'), +('7', '34', '18', '2461', '2557', '0'), +('7', '34', '18', '1205', '1056', '0'), +('7', '34', '18', '25725', '978', '0'), +('7', '34', '18', '2462', '790', '0'), +('7', '34', '19', '1280', '3540', '0'), +('7', '34', '19', '1206', '2486', '0'), +('7', '34', '19', '68239', '1360', '0'), +('7', '34', '19', '25726', '791', '0'), +('7', '34', '13', '27715', '30473', '0'), +('7', '34', '13', '6502', '21038', '0'), +('7', '34', '13', '71308', '9409', '0'), +('7', '34', '13', '6691', '8897', '0'), +('7', '34', '14', '27715', '30473', '0'), +('7', '34', '14', '6502', '21038', '0'), +('7', '34', '14', '11644', '11154', '0'), +('7', '34', '14', '71308', '9409', '0'), +('7', '34', '11', '14762', '854', '0'), +('7', '34', '11', '13748', '489', '0'), +('7', '34', '11', '9246', '453', '0'), +('7', '34', '11', '20677', '69', '0'), +('7', '35', '22', '9246', '0', '0'), +('7', '35', '22', '10323', '0', '0'), +('7', '35', '22', '21509', '0', '0'), +('7', '35', '22', '8332', '0', '0'), +('7', '35', '1', '14701', '4052', '0'), +('7', '35', '1', '14702', '2850', '0'), +('7', '35', '1', '10165', '1638', '0'), +('7', '35', '1', '30361', '1140', '0'), +('7', '35', '2', '10142', '3012', '0'), +('7', '35', '2', '4504', '2158', '0'), +('7', '35', '2', '1405', '1810', '0'), +('7', '35', '2', '2191', '1592', '0'), +('7', '35', '3', '10144', '1206', '0'), +('7', '35', '3', '2403', '1146', '0'), +('7', '35', '3', '14705', '990', '0'), +('7', '35', '3', '14706', '990', '0'), +('7', '35', '5', '14703', '6050', '0'), +('7', '35', '5', '14700', '3753', '0'), +('7', '35', '5', '10055', '3505', '0'), +('7', '35', '5', '2583', '2444', '0'), +('7', '35', '8', '11621', '14377', '0'), +('7', '35', '8', '11562', '9310', '0'), +('7', '35', '8', '27714', '8538', '0'), +('7', '35', '8', '1546', '6920', '0'), +('7', '35', '6', '1557', '6760', '0'), +('7', '35', '6', '1283', '2986', '0'), +('7', '35', '6', '11561', '2952', '0'), +('7', '35', '6', '25062', '768', '0'), +('7', '35', '17', '12256', '8295', '0'), +('7', '35', '17', '1201', '2467', '0'), +('7', '35', '17', '2348', '2449', '0'), +('7', '35', '17', '2329', '1663', '0'), +('7', '35', '7', '1202', '2570', '0'), +('7', '35', '7', '2458', '2406', '0'), +('7', '35', '7', '2342', '2014', '0'), +('7', '35', '7', '1361', '1764', '0'), +('7', '35', '9', '27714', '8538', '0'), +('7', '35', '9', '14650', '1952', '0'), +('7', '35', '9', '1203', '1807', '0'), +('7', '35', '9', '10360', '1351', '0'), +('7', '35', '15', '10366', '8163', '0'), +('7', '35', '15', '10151', '7200', '0'), +('7', '35', '15', '14679', '6255', '0'), +('7', '35', '15', '14678', '5104', '0'), +('7', '35', '20', '11698', '9997', '0'), +('7', '35', '20', '11601', '8833', '0'), +('7', '35', '20', '2917', '5211', '0'), +('7', '35', '20', '1365', '4200', '0'), +('7', '35', '12', '2923', '3654', '0'), +('7', '35', '12', '11624', '3245', '0'), +('7', '35', '12', '1204', '1396', '0'), +('7', '35', '12', '8909', '1377', '0'), +('7', '35', '18', '2461', '2557', '0'), +('7', '35', '18', '1205', '1056', '0'), +('7', '35', '18', '25725', '978', '0'), +('7', '35', '18', '2462', '805', '0'), +('7', '35', '19', '1280', '3540', '0'), +('7', '35', '19', '1206', '2524', '0'), +('7', '35', '19', '68239', '1360', '0'), +('7', '35', '19', '25726', '791', '0'), +('7', '35', '13', '27715', '30770', '0'), +('7', '35', '13', '6502', '21250', '0'), +('7', '35', '13', '71308', '9494', '0'), +('7', '35', '13', '6691', '8990', '0'), +('7', '35', '14', '27715', '30770', '0'), +('7', '35', '14', '6502', '21250', '0'), +('7', '35', '14', '11644', '11154', '0'), +('7', '35', '14', '71308', '9494', '0'), +('7', '35', '11', '14762', '854', '0'), +('7', '35', '11', '13748', '489', '0'), +('7', '35', '11', '9246', '453', '0'), +('7', '35', '11', '20677', '69', '0'), +('7', '36', '22', '9246', '0', '0'), +('7', '36', '22', '10323', '0', '0'), +('7', '36', '22', '21509', '0', '0'), +('7', '36', '22', '8332', '0', '0'), +('7', '36', '1', '14701', '4052', '0'), +('7', '36', '1', '14702', '2850', '0'), +('7', '36', '1', '10165', '1638', '0'), +('7', '36', '1', '30361', '1140', '0'), +('7', '36', '2', '10142', '3012', '0'), +('7', '36', '2', '4504', '2158', '0'), +('7', '36', '2', '1405', '1810', '0'), +('7', '36', '2', '2191', '1592', '0'), +('7', '36', '3', '10144', '1206', '0'), +('7', '36', '3', '2403', '1146', '0'), +('7', '36', '3', '14705', '990', '0'), +('7', '36', '3', '14706', '990', '0'), +('7', '36', '5', '14703', '6050', '0'), +('7', '36', '5', '14700', '3753', '0'), +('7', '36', '5', '10055', '3505', '0'), +('7', '36', '5', '2583', '2444', '0'), +('7', '36', '8', '11621', '14377', '0'), +('7', '36', '8', '11562', '9310', '0'), +('7', '36', '8', '27714', '8567', '0'), +('7', '36', '8', '1546', '6920', '0'), +('7', '36', '6', '1557', '6760', '0'), +('7', '36', '6', '1283', '2986', '0'), +('7', '36', '6', '11561', '2981', '0'), +('7', '36', '6', '25062', '768', '0'), +('7', '36', '17', '12256', '8316', '0'), +('7', '36', '17', '2348', '2470', '0'), +('7', '36', '17', '1201', '2467', '0'), +('7', '36', '17', '2329', '1677', '0'), +('7', '36', '7', '1202', '2608', '0'), +('7', '36', '7', '2458', '2406', '0'), +('7', '36', '7', '2342', '2026', '0'), +('7', '36', '7', '1361', '1764', '0'), +('7', '36', '9', '27714', '8567', '0'), +('7', '36', '9', '14650', '1952', '0'), +('7', '36', '9', '1203', '1828', '0'), +('7', '36', '9', '10360', '1351', '0'), +('7', '36', '15', '10366', '8163', '0'), +('7', '36', '15', '10151', '7200', '0'), +('7', '36', '15', '14679', '6255', '0'), +('7', '36', '15', '14678', '5104', '0'), +('7', '36', '20', '11698', '9997', '0'), +('7', '36', '20', '11601', '8876', '0'), +('7', '36', '20', '2917', '5211', '0'), +('7', '36', '20', '1365', '4200', '0'), +('7', '36', '12', '2923', '3654', '0'), +('7', '36', '12', '11624', '3275', '0'), +('7', '36', '12', '1204', '1396', '0'), +('7', '36', '12', '8909', '1388', '0'), +('7', '36', '18', '2461', '2557', '0'), +('7', '36', '18', '1205', '1056', '0'), +('7', '36', '18', '25725', '978', '0'), +('7', '36', '18', '2462', '820', '0'), +('7', '36', '19', '1280', '3540', '0'), +('7', '36', '19', '1206', '2562', '0'), +('7', '36', '19', '68239', '1360', '0'), +('7', '36', '19', '25726', '791', '0'), +('7', '36', '13', '27715', '31068', '0'), +('7', '36', '13', '6502', '21463', '0'), +('7', '36', '13', '71308', '9579', '0'), +('7', '36', '13', '6691', '9082', '0'), +('7', '36', '14', '27715', '31068', '0'), +('7', '36', '14', '6502', '21463', '0'), +('7', '36', '14', '11644', '11154', '0'), +('7', '36', '14', '71308', '9579', '0'), +('7', '36', '11', '14762', '854', '0'), +('7', '36', '11', '13748', '489', '0'), +('7', '36', '11', '9246', '453', '0'), +('7', '36', '11', '20677', '69', '0'), +('7', '37', '22', '9246', '0', '0'), +('7', '37', '22', '10323', '0', '0'), +('7', '37', '22', '21509', '0', '0'), +('7', '37', '22', '8332', '0', '0'), +('7', '37', '1', '14701', '4052', '0'), +('7', '37', '1', '14702', '2850', '0'), +('7', '37', '1', '10165', '1638', '0'), +('7', '37', '1', '30361', '1140', '0'), +('7', '37', '2', '10142', '3012', '0'), +('7', '37', '2', '4504', '2158', '0'), +('7', '37', '2', '1405', '1810', '0'), +('7', '37', '2', '2191', '1592', '0'), +('7', '37', '3', '10144', '1206', '0'), +('7', '37', '3', '2403', '1146', '0'), +('7', '37', '3', '14705', '990', '0'), +('7', '37', '3', '14706', '990', '0'), +('7', '37', '5', '14703', '6050', '0'), +('7', '37', '5', '14700', '3753', '0'), +('7', '37', '5', '10055', '3505', '0'), +('7', '37', '5', '2583', '2444', '0'), +('7', '37', '8', '11621', '14377', '0'), +('7', '37', '8', '11562', '9310', '0'), +('7', '37', '8', '27714', '8597', '0'), +('7', '37', '8', '1546', '6920', '0'), +('7', '37', '6', '1557', '6760', '0'), +('7', '37', '6', '11561', '3011', '0'), +('7', '37', '6', '1283', '2986', '0'), +('7', '37', '6', '25062', '768', '0'), +('7', '37', '17', '12256', '8337', '0'), +('7', '37', '17', '2348', '2492', '0'), +('7', '37', '17', '1201', '2467', '0'), +('7', '37', '17', '2329', '1691', '0'), +('7', '37', '7', '1202', '2646', '0'), +('7', '37', '7', '2458', '2406', '0'), +('7', '37', '7', '2342', '2039', '0'), +('7', '37', '7', '1361', '1764', '0'), +('7', '37', '9', '27714', '8597', '0'), +('7', '37', '9', '14650', '1952', '0'), +('7', '37', '9', '1203', '1850', '0'), +('7', '37', '9', '10360', '1351', '0'), +('7', '37', '15', '10366', '8163', '0'), +('7', '37', '15', '10151', '7200', '0'), +('7', '37', '15', '14679', '6255', '0'), +('7', '37', '15', '14678', '5104', '0'), +('7', '37', '20', '11698', '9997', '0'), +('7', '37', '20', '11601', '8918', '0'), +('7', '37', '20', '2917', '5211', '0'), +('7', '37', '20', '1365', '4200', '0'), +('7', '37', '12', '2923', '3654', '0'), +('7', '37', '12', '11624', '3304', '0'), +('7', '37', '12', '8909', '1399', '0'), +('7', '37', '12', '1204', '1396', '0'), +('7', '37', '18', '2461', '2557', '0'), +('7', '37', '18', '1205', '1056', '0'), +('7', '37', '18', '25725', '978', '0'), +('7', '37', '18', '2462', '835', '0'), +('7', '37', '19', '1280', '3540', '0'), +('7', '37', '19', '1206', '2600', '0'), +('7', '37', '19', '68239', '1360', '0'), +('7', '37', '19', '25726', '791', '0'), +('7', '37', '13', '27715', '31365', '0'), +('7', '37', '13', '6502', '21675', '0'), +('7', '37', '13', '71308', '9664', '0'), +('7', '37', '13', '6691', '9174', '0'), +('7', '37', '14', '27715', '31365', '0'), +('7', '37', '14', '6502', '21675', '0'), +('7', '37', '14', '11644', '11154', '0'), +('7', '37', '14', '71308', '9664', '0'), +('7', '37', '11', '14762', '854', '0'), +('7', '37', '11', '13748', '489', '0'), +('7', '37', '11', '9246', '453', '0'), +('7', '37', '11', '20677', '69', '0'), +('7', '38', '22', '9246', '0', '0'), +('7', '38', '22', '10323', '0', '0'), +('7', '38', '22', '21509', '0', '0'), +('7', '38', '22', '8332', '0', '0'), +('7', '38', '1', '14701', '4052', '0'), +('7', '38', '1', '14702', '2850', '0'), +('7', '38', '1', '10165', '1638', '0'), +('7', '38', '1', '30361', '1140', '0'), +('7', '38', '2', '10142', '3012', '0'), +('7', '38', '2', '4504', '2158', '0'), +('7', '38', '2', '1405', '1810', '0'), +('7', '38', '2', '2191', '1592', '0'), +('7', '38', '3', '10144', '1206', '0'), +('7', '38', '3', '2403', '1146', '0'), +('7', '38', '3', '14705', '990', '0'), +('7', '38', '3', '14706', '990', '0'), +('7', '38', '5', '14703', '6050', '0'), +('7', '38', '5', '14700', '3753', '0'), +('7', '38', '5', '10055', '3505', '0'), +('7', '38', '5', '2583', '2444', '0'), +('7', '38', '8', '11621', '14377', '0'), +('7', '38', '8', '11562', '9310', '0'), +('7', '38', '8', '27714', '8626', '0'), +('7', '38', '8', '1546', '6920', '0'), +('7', '38', '6', '1557', '6760', '0'), +('7', '38', '6', '11561', '3041', '0'), +('7', '38', '6', '1283', '2986', '0'), +('7', '38', '6', '25062', '768', '0'), +('7', '38', '17', '12256', '8358', '0'), +('7', '38', '17', '2348', '2513', '0'), +('7', '38', '17', '1201', '2467', '0'), +('7', '38', '17', '2329', '1705', '0'), +('7', '38', '7', '1202', '2684', '0'), +('7', '38', '7', '2458', '2406', '0'), +('7', '38', '7', '2342', '2052', '0'), +('7', '38', '7', '1361', '1764', '0'), +('7', '38', '9', '27714', '8626', '0'), +('7', '38', '9', '14650', '1952', '0'), +('7', '38', '9', '1203', '1871', '0'), +('7', '38', '9', '10360', '1351', '0'), +('7', '38', '15', '10366', '8163', '0'), +('7', '38', '15', '10151', '7200', '0'), +('7', '38', '15', '14679', '6255', '0'), +('7', '38', '15', '14678', '5104', '0'), +('7', '38', '20', '11698', '9997', '0'), +('7', '38', '20', '11601', '8960', '0'), +('7', '38', '20', '2917', '5211', '0'), +('7', '38', '20', '1365', '4200', '0'), +('7', '38', '12', '2923', '3654', '0'), +('7', '38', '12', '11624', '3334', '0'), +('7', '38', '12', '8909', '1409', '0'), +('7', '38', '12', '1204', '1396', '0'), +('7', '38', '18', '2461', '2557', '0'), +('7', '38', '18', '1205', '1056', '0'), +('7', '38', '18', '25725', '978', '0'), +('7', '38', '18', '2462', '851', '0'), +('7', '38', '19', '1280', '3540', '0'), +('7', '38', '19', '1206', '2638', '0'), +('7', '38', '19', '68239', '1360', '0'), +('7', '38', '19', '25726', '791', '0'), +('7', '38', '13', '27715', '31705', '0'), +('7', '38', '13', '6502', '21888', '0'), +('7', '38', '13', '71308', '9777', '0'), +('7', '38', '13', '6691', '9244', '0'), +('7', '38', '14', '27715', '31705', '0'), +('7', '38', '14', '6502', '21888', '0'), +('7', '38', '14', '11644', '11154', '0'), +('7', '38', '14', '71308', '9777', '0'), +('7', '38', '11', '14762', '854', '0'), +('7', '38', '11', '13748', '489', '0'), +('7', '38', '11', '9246', '453', '0'), +('7', '38', '11', '20677', '69', '0'), +('7', '39', '22', '9246', '0', '0'), +('7', '39', '22', '10323', '0', '0'), +('7', '39', '22', '21509', '0', '0'), +('7', '39', '22', '8332', '0', '0'), +('7', '39', '1', '14701', '4052', '0'), +('7', '39', '1', '14702', '2850', '0'), +('7', '39', '1', '10165', '1638', '0'), +('7', '39', '1', '30361', '1140', '0'), +('7', '39', '2', '10142', '3012', '0'), +('7', '39', '2', '4504', '2158', '0'), +('7', '39', '2', '1405', '1810', '0'), +('7', '39', '2', '2191', '1592', '0'), +('7', '39', '3', '10144', '1206', '0'), +('7', '39', '3', '2403', '1146', '0'), +('7', '39', '3', '14705', '990', '0'), +('7', '39', '3', '14706', '990', '0'), +('7', '39', '5', '14703', '6050', '0'), +('7', '39', '5', '14700', '3753', '0'), +('7', '39', '5', '10055', '3505', '0'), +('7', '39', '5', '2583', '2444', '0'), +('7', '39', '8', '11621', '14377', '0'), +('7', '39', '8', '11562', '9310', '0'), +('7', '39', '8', '27714', '8656', '0'), +('7', '39', '8', '1546', '6920', '0'), +('7', '39', '6', '1557', '6760', '0'), +('7', '39', '6', '11561', '3070', '0'), +('7', '39', '6', '1283', '2986', '0'), +('7', '39', '6', '25062', '768', '0'), +('7', '39', '17', '12256', '8379', '0'), +('7', '39', '17', '2348', '2534', '0'), +('7', '39', '17', '1201', '2467', '0'), +('7', '39', '17', '2329', '1719', '0'), +('7', '39', '7', '1202', '2722', '0'), +('7', '39', '7', '2458', '2406', '0'), +('7', '39', '7', '2342', '2064', '0'), +('7', '39', '7', '1361', '1764', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '39', '9', '27714', '8656', '0'), +('7', '39', '9', '14650', '1952', '0'), +('7', '39', '9', '1203', '1892', '0'), +('7', '39', '9', '10360', '1351', '0'), +('7', '39', '15', '10366', '8163', '0'), +('7', '39', '15', '10151', '7200', '0'), +('7', '39', '15', '14679', '6255', '0'), +('7', '39', '15', '14678', '5104', '0'), +('7', '39', '20', '11698', '9997', '0'), +('7', '39', '20', '11601', '9003', '0'), +('7', '39', '20', '2917', '5211', '0'), +('7', '39', '20', '1365', '4200', '0'), +('7', '39', '12', '2923', '3654', '0'), +('7', '39', '12', '11624', '3363', '0'), +('7', '39', '12', '8909', '1420', '0'), +('7', '39', '12', '1204', '1396', '0'), +('7', '39', '18', '2461', '2557', '0'), +('7', '39', '18', '1205', '1056', '0'), +('7', '39', '18', '25725', '978', '0'), +('7', '39', '18', '2462', '866', '0'), +('7', '39', '19', '1280', '3540', '0'), +('7', '39', '19', '1206', '2676', '0'), +('7', '39', '19', '68239', '1360', '0'), +('7', '39', '19', '25726', '791', '0'), +('7', '39', '13', '27715', '32003', '0'), +('7', '39', '13', '6502', '22100', '0'), +('7', '39', '13', '71308', '9862', '0'), +('7', '39', '13', '6691', '9336', '0'), +('7', '39', '14', '27715', '32003', '0'), +('7', '39', '14', '6502', '22100', '0'), +('7', '39', '14', '11644', '11154', '0'), +('7', '39', '14', '71308', '9862', '0'), +('7', '39', '11', '14762', '854', '0'), +('7', '39', '11', '13748', '489', '0'), +('7', '39', '11', '9246', '453', '0'), +('7', '39', '11', '20677', '69', '0'), +('7', '40', '22', '9246', '0', '0'), +('7', '40', '22', '10323', '0', '0'), +('7', '40', '22', '21509', '0', '0'), +('7', '40', '22', '8332', '0', '0'), +('7', '40', '1', '14701', '4052', '0'), +('7', '40', '1', '14702', '2850', '0'), +('7', '40', '1', '10165', '1638', '0'), +('7', '40', '1', '30361', '1140', '0'), +('7', '40', '2', '10142', '3012', '0'), +('7', '40', '2', '4504', '2158', '0'), +('7', '40', '2', '1405', '1810', '0'), +('7', '40', '2', '2191', '1592', '0'), +('7', '40', '3', '10144', '1206', '0'), +('7', '40', '3', '2403', '1146', '0'), +('7', '40', '3', '14705', '990', '0'), +('7', '40', '3', '14706', '990', '0'), +('7', '40', '5', '14703', '6050', '0'), +('7', '40', '5', '14700', '3753', '0'), +('7', '40', '5', '10055', '3505', '0'), +('7', '40', '5', '2583', '2444', '0'), +('7', '40', '8', '11621', '14377', '0'), +('7', '40', '8', '11562', '9310', '0'), +('7', '40', '8', '27714', '8686', '0'), +('7', '40', '8', '1546', '6920', '0'), +('7', '40', '6', '1557', '6760', '0'), +('7', '40', '6', '11561', '3100', '0'), +('7', '40', '6', '1283', '2986', '0'), +('7', '40', '6', '25062', '768', '0'), +('7', '40', '17', '12256', '8401', '0'), +('7', '40', '17', '2348', '2555', '0'), +('7', '40', '17', '1201', '2467', '0'), +('7', '40', '17', '2329', '1733', '0'), +('7', '40', '7', '1202', '2760', '0'), +('7', '40', '7', '2458', '2406', '0'), +('7', '40', '7', '2342', '2077', '0'), +('7', '40', '7', '1361', '1764', '0'), +('7', '40', '9', '27714', '8686', '0'), +('7', '40', '9', '14650', '1952', '0'), +('7', '40', '9', '1203', '1913', '0'), +('7', '40', '9', '10360', '1351', '0'), +('7', '40', '15', '10366', '8163', '0'), +('7', '40', '15', '10151', '7200', '0'), +('7', '40', '15', '14679', '6255', '0'), +('7', '40', '15', '14678', '5104', '0'), +('7', '40', '20', '11698', '9997', '0'), +('7', '40', '20', '11601', '9045', '0'), +('7', '40', '20', '2917', '5211', '0'), +('7', '40', '20', '1365', '4200', '0'), +('7', '40', '12', '2923', '3654', '0'), +('7', '40', '12', '11624', '3393', '0'), +('7', '40', '12', '8909', '1431', '0'), +('7', '40', '12', '1204', '1396', '0'), +('7', '40', '18', '2461', '2557', '0'), +('7', '40', '18', '1205', '1056', '0'), +('7', '40', '18', '25725', '978', '0'), +('7', '40', '18', '2462', '881', '0'), +('7', '40', '19', '1280', '3540', '0'), +('7', '40', '19', '1206', '2714', '0'), +('7', '40', '19', '68239', '1360', '0'), +('7', '40', '19', '25726', '791', '0'), +('7', '40', '13', '27715', '32300', '0'), +('7', '40', '13', '6502', '22313', '0'), +('7', '40', '13', '71308', '9947', '0'), +('7', '40', '13', '6691', '9428', '0'), +('7', '40', '14', '27715', '32300', '0'), +('7', '40', '14', '6502', '22313', '0'), +('7', '40', '14', '11644', '11154', '0'), +('7', '40', '14', '71308', '9947', '0'), +('7', '40', '11', '14762', '854', '0'), +('7', '40', '11', '13748', '489', '0'), +('7', '40', '11', '9246', '453', '0'), +('7', '40', '11', '20677', '69', '0'), +('7', '41', '22', '9246', '0', '0'), +('7', '41', '22', '10323', '0', '0'), +('7', '41', '22', '21509', '0', '0'), +('7', '41', '22', '8332', '0', '0'), +('7', '41', '1', '14701', '4052', '0'), +('7', '41', '1', '14702', '2850', '0'), +('7', '41', '1', '10165', '1638', '0'), +('7', '41', '1', '30361', '1140', '0'), +('7', '41', '2', '10142', '3012', '0'), +('7', '41', '2', '4504', '2158', '0'), +('7', '41', '2', '1405', '1810', '0'), +('7', '41', '2', '2191', '1592', '0'), +('7', '41', '3', '10144', '1206', '0'), +('7', '41', '3', '2403', '1146', '0'), +('7', '41', '3', '14705', '990', '0'), +('7', '41', '3', '14706', '990', '0'), +('7', '41', '5', '14703', '6050', '0'), +('7', '41', '5', '14700', '3753', '0'), +('7', '41', '5', '10055', '3505', '0'), +('7', '41', '5', '2583', '2444', '0'), +('7', '41', '8', '11621', '14377', '0'), +('7', '41', '8', '11562', '9310', '0'), +('7', '41', '8', '27714', '8715', '0'), +('7', '41', '8', '1546', '6920', '0'), +('7', '41', '6', '1557', '6760', '0'), +('7', '41', '6', '11561', '3129', '0'), +('7', '41', '6', '1283', '2986', '0'), +('7', '41', '6', '25062', '768', '0'), +('7', '41', '17', '12256', '8422', '0'), +('7', '41', '17', '2348', '2576', '0'), +('7', '41', '17', '1201', '2467', '0'), +('7', '41', '17', '2329', '1748', '0'), +('7', '41', '7', '1202', '2798', '0'), +('7', '41', '7', '2458', '2406', '0'), +('7', '41', '7', '2342', '2090', '0'), +('7', '41', '7', '1361', '1764', '0'), +('7', '41', '9', '27714', '8715', '0'), +('7', '41', '9', '14650', '1952', '0'), +('7', '41', '9', '1203', '1934', '0'), +('7', '41', '9', '10360', '1351', '0'), +('7', '41', '15', '10366', '8163', '0'), +('7', '41', '15', '10151', '7200', '0'), +('7', '41', '15', '14679', '6255', '0'), +('7', '41', '15', '14678', '5104', '0'), +('7', '41', '20', '11698', '9997', '0'), +('7', '41', '20', '11601', '9087', '0'), +('7', '41', '20', '2917', '5211', '0'), +('7', '41', '20', '1365', '4200', '0'), +('7', '41', '12', '2923', '3654', '0'), +('7', '41', '12', '11624', '3422', '0'), +('7', '41', '12', '8909', '1441', '0'), +('7', '41', '12', '1204', '1396', '0'), +('7', '41', '18', '2461', '2557', '0'), +('7', '41', '18', '1205', '1056', '0'), +('7', '41', '18', '25725', '978', '0'), +('7', '41', '18', '2462', '897', '0'), +('7', '41', '19', '1280', '3540', '0'), +('7', '41', '19', '1206', '2752', '0'), +('7', '41', '19', '68239', '1360', '0'), +('7', '41', '19', '25726', '791', '0'), +('7', '41', '13', '27715', '32598', '0'), +('7', '41', '13', '6502', '22525', '0'), +('7', '41', '13', '71308', '10032', '0'), +('7', '41', '13', '6691', '9521', '0'), +('7', '41', '14', '27715', '32598', '0'), +('7', '41', '14', '6502', '22525', '0'), +('7', '41', '14', '11644', '11154', '0'), +('7', '41', '14', '71308', '10032', '0'), +('7', '41', '11', '14762', '854', '0'), +('7', '41', '11', '13748', '489', '0'), +('7', '41', '11', '9246', '453', '0'), +('7', '41', '11', '20677', '69', '0'), +('7', '42', '22', '9246', '0', '0'), +('7', '42', '22', '10323', '0', '0'), +('7', '42', '22', '21509', '0', '0'), +('7', '42', '22', '8332', '0', '0'), +('7', '42', '1', '14701', '4052', '0'), +('7', '42', '1', '14702', '2850', '0'), +('7', '42', '1', '10165', '1638', '0'), +('7', '42', '1', '30361', '1140', '0'), +('7', '42', '2', '10142', '3012', '0'), +('7', '42', '2', '4504', '2158', '0'), +('7', '42', '2', '1405', '1810', '0'), +('7', '42', '2', '2191', '1592', '0'), +('7', '42', '3', '10144', '1206', '0'), +('7', '42', '3', '2403', '1146', '0'), +('7', '42', '3', '14705', '990', '0'), +('7', '42', '3', '14706', '990', '0'), +('7', '42', '5', '14703', '6050', '0'), +('7', '42', '5', '14700', '3753', '0'), +('7', '42', '5', '10055', '3505', '0'), +('7', '42', '5', '2583', '2444', '0'), +('7', '42', '8', '11621', '14377', '0'), +('7', '42', '8', '11562', '9310', '0'), +('7', '42', '8', '27714', '8749', '0'), +('7', '42', '8', '1546', '6920', '0'), +('7', '42', '6', '1557', '6760', '0'), +('7', '42', '6', '11561', '3163', '0'), +('7', '42', '6', '1283', '2986', '0'), +('7', '42', '6', '25062', '768', '0'), +('7', '42', '17', '12256', '8446', '0'), +('7', '42', '17', '2348', '2600', '0'), +('7', '42', '17', '1201', '2467', '0'), +('7', '42', '17', '2329', '1764', '0'), +('7', '42', '7', '1202', '2842', '0'), +('7', '42', '7', '2458', '2406', '0'), +('7', '42', '7', '2342', '2104', '0'), +('7', '42', '7', '1361', '1764', '0'), +('7', '42', '9', '27714', '8749', '0'), +('7', '42', '9', '1203', '1958', '0'), +('7', '42', '9', '14650', '1952', '0'), +('7', '42', '9', '10360', '1351', '0'), +('7', '42', '15', '10366', '8163', '0'), +('7', '42', '15', '10151', '7200', '0'), +('7', '42', '15', '14679', '6255', '0'), +('7', '42', '15', '14678', '5104', '0'), +('7', '42', '20', '11698', '9997', '0'), +('7', '42', '20', '11601', '9135', '0'), +('7', '42', '20', '2917', '5211', '0'), +('7', '42', '20', '1365', '4200', '0'), +('7', '42', '12', '2923', '3654', '0'), +('7', '42', '12', '11624', '3456', '0'), +('7', '42', '12', '8909', '1454', '0'), +('7', '42', '12', '1204', '1396', '0'), +('7', '42', '18', '2461', '2557', '0'), +('7', '42', '18', '1205', '1056', '0'), +('7', '42', '18', '25725', '978', '0'), +('7', '42', '18', '2462', '914', '0'), +('7', '42', '19', '1280', '3540', '0'), +('7', '42', '19', '1206', '2796', '0'), +('7', '42', '19', '68239', '1360', '0'), +('7', '42', '19', '25726', '791', '0'), +('7', '42', '13', '27715', '32895', '0'), +('7', '42', '13', '6502', '22738', '0'), +('7', '42', '13', '71308', '10117', '0'), +('7', '42', '13', '6691', '9613', '0'), +('7', '42', '14', '27715', '32895', '0'), +('7', '42', '14', '6502', '22738', '0'), +('7', '42', '14', '11644', '11154', '0'), +('7', '42', '14', '71308', '10117', '0'), +('7', '42', '11', '14762', '854', '0'), +('7', '42', '11', '13748', '489', '0'), +('7', '42', '11', '9246', '453', '0'), +('7', '42', '11', '20677', '69', '0'), +('7', '43', '22', '9246', '0', '0'), +('7', '43', '22', '10323', '0', '0'), +('7', '43', '22', '21509', '0', '0'), +('7', '43', '22', '8332', '0', '0'), +('7', '43', '1', '14701', '4052', '0'), +('7', '43', '1', '14702', '2850', '0'), +('7', '43', '1', '10165', '1638', '0'), +('7', '43', '1', '30361', '1140', '0'), +('7', '43', '2', '10142', '3012', '0'), +('7', '43', '2', '4504', '2158', '0'), +('7', '43', '2', '1405', '1810', '0'), +('7', '43', '2', '2191', '1592', '0'), +('7', '43', '3', '10144', '1206', '0'), +('7', '43', '3', '2403', '1146', '0'), +('7', '43', '3', '14705', '990', '0'), +('7', '43', '3', '14706', '990', '0'), +('7', '43', '5', '14703', '6050', '0'), +('7', '43', '5', '14700', '3753', '0'), +('7', '43', '5', '10055', '3505', '0'), +('7', '43', '5', '2583', '2444', '0'), +('7', '43', '8', '11621', '14377', '0'), +('7', '43', '8', '11562', '9310', '0'), +('7', '43', '8', '27714', '8779', '0'), +('7', '43', '8', '1546', '6920', '0'), +('7', '43', '6', '1557', '6760', '0'), +('7', '43', '6', '11561', '3193', '0'), +('7', '43', '6', '1283', '2986', '0'), +('7', '43', '6', '25062', '768', '0'), +('7', '43', '17', '12256', '8467', '0'), +('7', '43', '17', '2348', '2621', '0'), +('7', '43', '17', '1201', '2467', '0'), +('7', '43', '17', '2329', '1778', '0'), +('7', '43', '7', '1202', '2880', '0'), +('7', '43', '7', '2458', '2406', '0'), +('7', '43', '7', '2342', '2117', '0'), +('7', '43', '7', '1361', '1764', '0'), +('7', '43', '9', '27714', '8779', '0'), +('7', '43', '9', '1203', '1979', '0'), +('7', '43', '9', '14650', '1952', '0'), +('7', '43', '9', '10360', '1351', '0'), +('7', '43', '15', '10366', '8163', '0'), +('7', '43', '15', '10151', '7200', '0'), +('7', '43', '15', '14679', '6255', '0'), +('7', '43', '15', '14678', '5104', '0'), +('7', '43', '20', '11698', '9997', '0'), +('7', '43', '20', '11601', '9178', '0'), +('7', '43', '20', '2917', '5211', '0'), +('7', '43', '20', '1365', '4200', '0'), +('7', '43', '12', '2923', '3654', '0'), +('7', '43', '12', '11624', '3486', '0'), +('7', '43', '12', '8909', '1464', '0'), +('7', '43', '12', '1204', '1396', '0'), +('7', '43', '18', '2461', '2557', '0'), +('7', '43', '18', '1205', '1056', '0'), +('7', '43', '18', '25725', '978', '0'), +('7', '43', '18', '2462', '929', '0'), +('7', '43', '19', '1280', '3540', '0'), +('7', '43', '19', '1206', '2834', '0'), +('7', '43', '19', '68239', '1360', '0'), +('7', '43', '19', '25726', '791', '0'), +('7', '43', '13', '27715', '33193', '0'), +('7', '43', '13', '6502', '22950', '0'), +('7', '43', '13', '71308', '10230', '0'), +('7', '43', '13', '6691', '9683', '0'), +('7', '43', '14', '27715', '33193', '0'), +('7', '43', '14', '6502', '22950', '0'), +('7', '43', '14', '11644', '11154', '0'), +('7', '43', '14', '71308', '10230', '0'), +('7', '43', '11', '14762', '854', '0'), +('7', '43', '11', '13748', '489', '0'), +('7', '43', '11', '9246', '453', '0'), +('7', '43', '11', '20677', '69', '0'), +('7', '44', '22', '9246', '0', '0'), +('7', '44', '22', '10323', '0', '0'), +('7', '44', '22', '21509', '0', '0'), +('7', '44', '22', '8332', '0', '0'), +('7', '44', '1', '14701', '4052', '0'), +('7', '44', '1', '14702', '2850', '0'), +('7', '44', '1', '10165', '1638', '0'), +('7', '44', '1', '30361', '1140', '0'), +('7', '44', '2', '10142', '3012', '0'), +('7', '44', '2', '4504', '2158', '0'), +('7', '44', '2', '1405', '1810', '0'), +('7', '44', '2', '2191', '1592', '0'), +('7', '44', '3', '10144', '1206', '0'), +('7', '44', '3', '2403', '1146', '0'), +('7', '44', '3', '14705', '990', '0'), +('7', '44', '3', '14706', '990', '0'), +('7', '44', '5', '14703', '6050', '0'), +('7', '44', '5', '14700', '3753', '0'), +('7', '44', '5', '10055', '3505', '0'), +('7', '44', '5', '2583', '2444', '0'), +('7', '44', '8', '11621', '14377', '0'), +('7', '44', '8', '11562', '9310', '0'), +('7', '44', '8', '27714', '8808', '0'), +('7', '44', '8', '1546', '6920', '0'), +('7', '44', '6', '1557', '6760', '0'), +('7', '44', '6', '11561', '3222', '0'), +('7', '44', '6', '1283', '2986', '0'), +('7', '44', '6', '25062', '768', '0'), +('7', '44', '17', '12256', '8488', '0'), +('7', '44', '17', '2348', '2643', '0'), +('7', '44', '17', '1201', '2467', '0'), +('7', '44', '17', '2329', '1792', '0'), +('7', '44', '7', '1202', '2918', '0'), +('7', '44', '7', '2458', '2406', '0'), +('7', '44', '7', '2342', '2129', '0'), +('7', '44', '7', '1361', '1764', '0'), +('7', '44', '9', '27714', '8808', '0'), +('7', '44', '9', '1203', '2001', '0'), +('7', '44', '9', '14650', '1952', '0'), +('7', '44', '9', '10360', '1351', '0'), +('7', '44', '15', '10366', '8163', '0'), +('7', '44', '15', '10151', '7200', '0'), +('7', '44', '15', '14679', '6255', '0'), +('7', '44', '15', '14678', '5104', '0'), +('7', '44', '20', '11698', '9997', '0'), +('7', '44', '20', '11601', '9220', '0'), +('7', '44', '20', '2917', '5211', '0'), +('7', '44', '20', '1365', '4200', '0'), +('7', '44', '12', '2923', '3654', '0'), +('7', '44', '12', '11624', '3516', '0'), +('7', '44', '12', '8909', '1475', '0'), +('7', '44', '12', '1204', '1396', '0'), +('7', '44', '18', '2461', '2557', '0'), +('7', '44', '18', '1205', '1056', '0'), +('7', '44', '18', '25725', '978', '0'), +('7', '44', '18', '2462', '945', '0'), +('7', '44', '19', '1280', '3540', '0'), +('7', '44', '19', '1206', '2872', '0'), +('7', '44', '19', '68239', '1360', '0'), +('7', '44', '19', '25726', '791', '0'), +('7', '44', '13', '27715', '33490', '0'), +('7', '44', '13', '6502', '23163', '0'), +('7', '44', '13', '71308', '10315', '0'), +('7', '44', '13', '6691', '9775', '0'), +('7', '44', '14', '27715', '33490', '0'), +('7', '44', '14', '6502', '23163', '0'), +('7', '44', '14', '11644', '11154', '0'), +('7', '44', '14', '71308', '10315', '0'), +('7', '44', '11', '14762', '854', '0'), +('7', '44', '11', '13748', '489', '0'), +('7', '44', '11', '9246', '453', '0'), +('7', '44', '11', '20677', '69', '0'), +('7', '45', '22', '9246', '0', '0'), +('7', '45', '22', '10323', '0', '0'), +('7', '45', '22', '21509', '0', '0'), +('7', '45', '22', '8332', '0', '0'), +('7', '45', '1', '14701', '4052', '0'), +('7', '45', '1', '14702', '2850', '0'), +('7', '45', '1', '10165', '1638', '0'), +('7', '45', '1', '30361', '1140', '0'), +('7', '45', '2', '10142', '3012', '0'), +('7', '45', '2', '4504', '2158', '0'), +('7', '45', '2', '1405', '1810', '0'), +('7', '45', '2', '2191', '1592', '0'), +('7', '45', '3', '10144', '1206', '0'), +('7', '45', '3', '2403', '1146', '0'), +('7', '45', '3', '14705', '990', '0'), +('7', '45', '3', '14706', '990', '0'), +('7', '45', '5', '14703', '6050', '0'), +('7', '45', '5', '14700', '3753', '0'), +('7', '45', '5', '10055', '3505', '0'), +('7', '45', '5', '2583', '2444', '0'), +('7', '45', '8', '11621', '14377', '0'), +('7', '45', '8', '11562', '9310', '0'), +('7', '45', '8', '27714', '8838', '0'), +('7', '45', '8', '1546', '6920', '0'), +('7', '45', '6', '1557', '6760', '0'), +('7', '45', '6', '11561', '3252', '0'), +('7', '45', '6', '1283', '2986', '0'), +('7', '45', '6', '25062', '768', '0'), +('7', '45', '17', '12256', '8509', '0'), +('7', '45', '17', '2348', '2664', '0'), +('7', '45', '17', '1201', '2467', '0'), +('7', '45', '17', '2329', '1806', '0'), +('7', '45', '7', '1202', '2956', '0'), +('7', '45', '7', '2458', '2406', '0'), +('7', '45', '7', '2342', '2142', '0'), +('7', '45', '7', '1361', '1764', '0'), +('7', '45', '9', '27714', '8838', '0'), +('7', '45', '9', '1203', '2022', '0'), +('7', '45', '9', '14650', '1952', '0'), +('7', '45', '9', '10360', '1351', '0'), +('7', '45', '15', '10366', '8163', '0'), +('7', '45', '15', '10151', '7200', '0'), +('7', '45', '15', '14679', '6255', '0'), +('7', '45', '15', '14678', '5104', '0'), +('7', '45', '20', '11698', '9997', '0'), +('7', '45', '20', '11601', '9262', '0'), +('7', '45', '20', '2917', '5211', '0'), +('7', '45', '20', '1365', '4200', '0'), +('7', '45', '12', '2923', '3654', '0'), +('7', '45', '12', '11624', '3545', '0'), +('7', '45', '12', '8909', '1486', '0'), +('7', '45', '12', '1204', '1396', '0'), +('7', '45', '18', '2461', '2557', '0'), +('7', '45', '18', '1205', '1056', '0'), +('7', '45', '18', '25725', '978', '0'), +('7', '45', '18', '2462', '960', '0'), +('7', '45', '19', '1280', '3540', '0'), +('7', '45', '19', '1206', '2910', '0'), +('7', '45', '19', '68239', '1360', '0'), +('7', '45', '19', '25726', '791', '0'), +('7', '45', '13', '27715', '33788', '0'), +('7', '45', '13', '6502', '23333', '0'), +('7', '45', '13', '71308', '10400', '0'), +('7', '45', '13', '6691', '9867', '0'), +('7', '45', '14', '27715', '33788', '0'), +('7', '45', '14', '6502', '23333', '0'), +('7', '45', '14', '11644', '11154', '0'), +('7', '45', '14', '71308', '10400', '0'), +('7', '45', '11', '14762', '854', '0'), +('7', '45', '11', '13748', '489', '0'), +('7', '45', '11', '9246', '453', '0'), +('7', '45', '11', '20677', '69', '0'), +('7', '46', '22', '9246', '0', '0'), +('7', '46', '22', '10323', '0', '0'), +('7', '46', '22', '21509', '0', '0'), +('7', '46', '22', '8332', '0', '0'), +('7', '46', '1', '14701', '4052', '0'), +('7', '46', '1', '14702', '2850', '0'), +('7', '46', '1', '10165', '1638', '0'), +('7', '46', '1', '30361', '1140', '0'), +('7', '46', '2', '10142', '3012', '0'), +('7', '46', '2', '4504', '2158', '0'), +('7', '46', '2', '1405', '1810', '0'), +('7', '46', '2', '10116', '1600', '0'), +('7', '46', '3', '10144', '1206', '0'), +('7', '46', '3', '2403', '1146', '0'), +('7', '46', '3', '14705', '990', '0'), +('7', '46', '3', '14706', '990', '0'), +('7', '46', '5', '14703', '6050', '0'), +('7', '46', '5', '14700', '3753', '0'), +('7', '46', '5', '10055', '3505', '0'), +('7', '46', '5', '2583', '2444', '0'), +('7', '46', '8', '11621', '14377', '0'), +('7', '46', '8', '11562', '9310', '0'), +('7', '46', '8', '27714', '8867', '0'), +('7', '46', '8', '1546', '6920', '0'), +('7', '46', '6', '1557', '6760', '0'), +('7', '46', '6', '11561', '3282', '0'), +('7', '46', '6', '1283', '2986', '0'), +('7', '46', '6', '25062', '768', '0'), +('7', '46', '17', '12256', '8530', '0'), +('7', '46', '17', '2348', '2685', '0'), +('7', '46', '17', '1201', '2467', '0'), +('7', '46', '17', '2329', '1820', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '46', '7', '1202', '2994', '0'), +('7', '46', '7', '2458', '2406', '0'), +('7', '46', '7', '2342', '2155', '0'), +('7', '46', '7', '1361', '1764', '0'), +('7', '46', '9', '27714', '8867', '0'), +('7', '46', '9', '1203', '2043', '0'), +('7', '46', '9', '14650', '1952', '0'), +('7', '46', '9', '10360', '1351', '0'), +('7', '46', '15', '10366', '8163', '0'), +('7', '46', '15', '10151', '7200', '0'), +('7', '46', '15', '14679', '6255', '0'), +('7', '46', '15', '14678', '5104', '0'), +('7', '46', '20', '11698', '9997', '0'), +('7', '46', '20', '11601', '9305', '0'), +('7', '46', '20', '2917', '5211', '0'), +('7', '46', '20', '1365', '4200', '0'), +('7', '46', '12', '2923', '3654', '0'), +('7', '46', '12', '11624', '3575', '0'), +('7', '46', '12', '8909', '1496', '0'), +('7', '46', '12', '1204', '1396', '0'), +('7', '46', '18', '2461', '2557', '0'), +('7', '46', '18', '1205', '1056', '0'), +('7', '46', '18', '25725', '978', '0'), +('7', '46', '18', '2462', '975', '0'), +('7', '46', '19', '1280', '3540', '0'), +('7', '46', '19', '1206', '2948', '0'), +('7', '46', '19', '68239', '1360', '0'), +('7', '46', '19', '25726', '791', '0'), +('7', '46', '13', '27715', '36423', '0'), +('7', '46', '13', '6502', '25160', '0'), +('7', '46', '13', '71308', '11194', '0'), +('7', '46', '13', '6691', '10630', '0'), +('7', '46', '14', '27715', '36423', '0'), +('7', '46', '14', '6502', '25160', '0'), +('7', '46', '14', '71308', '11194', '0'), +('7', '46', '14', '11644', '11154', '0'), +('7', '46', '11', '14762', '854', '0'), +('7', '46', '11', '13748', '489', '0'), +('7', '46', '11', '9246', '453', '0'), +('7', '46', '11', '20677', '69', '0'), +('7', '47', '22', '9246', '0', '0'), +('7', '47', '22', '10323', '0', '0'), +('7', '47', '22', '21509', '0', '0'), +('7', '47', '22', '8332', '0', '0'), +('7', '47', '1', '14701', '4052', '0'), +('7', '47', '1', '14702', '2850', '0'), +('7', '47', '1', '10165', '1638', '0'), +('7', '47', '1', '30361', '1140', '0'), +('7', '47', '2', '10142', '3012', '0'), +('7', '47', '2', '4504', '2158', '0'), +('7', '47', '2', '1405', '1810', '0'), +('7', '47', '2', '10116', '1616', '0'), +('7', '47', '3', '10144', '1206', '0'), +('7', '47', '3', '2403', '1146', '0'), +('7', '47', '3', '14705', '990', '0'), +('7', '47', '3', '14706', '990', '0'), +('7', '47', '5', '14703', '6050', '0'), +('7', '47', '5', '14700', '3753', '0'), +('7', '47', '5', '10055', '3505', '0'), +('7', '47', '5', '2583', '2444', '0'), +('7', '47', '8', '11621', '14377', '0'), +('7', '47', '8', '11562', '9310', '0'), +('7', '47', '8', '27714', '8897', '0'), +('7', '47', '8', '1546', '6920', '0'), +('7', '47', '6', '1557', '6760', '0'), +('7', '47', '6', '11561', '3311', '0'), +('7', '47', '6', '1283', '2986', '0'), +('7', '47', '6', '25062', '768', '0'), +('7', '47', '17', '12256', '8552', '0'), +('7', '47', '17', '2348', '2706', '0'), +('7', '47', '17', '1201', '2467', '0'), +('7', '47', '17', '2329', '1834', '0'), +('7', '47', '7', '1202', '3032', '0'), +('7', '47', '7', '2458', '2406', '0'), +('7', '47', '7', '2342', '2168', '0'), +('7', '47', '7', '1361', '1764', '0'), +('7', '47', '9', '27714', '8897', '0'), +('7', '47', '9', '1203', '2064', '0'), +('7', '47', '9', '14650', '1952', '0'), +('7', '47', '9', '10360', '1351', '0'), +('7', '47', '15', '10366', '8163', '0'), +('7', '47', '15', '10151', '7200', '0'), +('7', '47', '15', '14679', '6255', '0'), +('7', '47', '15', '14678', '5104', '0'), +('7', '47', '20', '11698', '9997', '0'), +('7', '47', '20', '11601', '9347', '0'), +('7', '47', '20', '2917', '5211', '0'), +('7', '47', '20', '2742', '4221', '0'), +('7', '47', '12', '2923', '3654', '0'), +('7', '47', '12', '11624', '3604', '0'), +('7', '47', '12', '8909', '1507', '0'), +('7', '47', '12', '1204', '1396', '0'), +('7', '47', '18', '2461', '2557', '0'), +('7', '47', '18', '1205', '1056', '0'), +('7', '47', '18', '2462', '990', '0'), +('7', '47', '18', '25725', '978', '0'), +('7', '47', '19', '1280', '3540', '0'), +('7', '47', '19', '1206', '2986', '0'), +('7', '47', '19', '68239', '1360', '0'), +('7', '47', '19', '25726', '791', '0'), +('7', '47', '13', '27715', '37528', '0'), +('7', '47', '13', '6502', '25925', '0'), +('7', '47', '13', '71308', '11505', '0'), +('7', '47', '13', '6691', '10930', '0'), +('7', '47', '14', '27715', '37528', '0'), +('7', '47', '14', '6502', '25925', '0'), +('7', '47', '14', '71308', '11505', '0'), +('7', '47', '14', '11644', '11154', '0'), +('7', '47', '11', '14762', '854', '0'), +('7', '47', '11', '13748', '489', '0'), +('7', '47', '11', '9246', '453', '0'), +('7', '47', '11', '20677', '69', '0'), +('7', '48', '22', '9246', '0', '0'), +('7', '48', '22', '10323', '0', '0'), +('7', '48', '22', '21509', '0', '0'), +('7', '48', '22', '8332', '0', '0'), +('7', '48', '1', '14701', '4052', '0'), +('7', '48', '1', '14702', '2850', '0'), +('7', '48', '1', '10165', '1638', '0'), +('7', '48', '1', '14623', '1156', '0'), +('7', '48', '2', '10142', '3012', '0'), +('7', '48', '2', '4504', '2158', '0'), +('7', '48', '2', '1405', '1810', '0'), +('7', '48', '2', '10116', '1636', '0'), +('7', '48', '3', '10144', '1206', '0'), +('7', '48', '3', '2403', '1146', '0'), +('7', '48', '3', '14705', '990', '0'), +('7', '48', '3', '14706', '990', '0'), +('7', '48', '5', '14703', '6050', '0'), +('7', '48', '5', '14700', '3753', '0'), +('7', '48', '5', '10055', '3505', '0'), +('7', '48', '5', '2583', '2444', '0'), +('7', '48', '8', '11621', '14377', '0'), +('7', '48', '8', '11562', '9310', '0'), +('7', '48', '8', '27714', '8931', '0'), +('7', '48', '8', '1546', '6920', '0'), +('7', '48', '6', '1557', '6760', '0'), +('7', '48', '6', '11561', '3345', '0'), +('7', '48', '6', '1283', '2986', '0'), +('7', '48', '6', '25062', '768', '0'), +('7', '48', '17', '12256', '8576', '0'), +('7', '48', '17', '2348', '2730', '0'), +('7', '48', '17', '1201', '2467', '0'), +('7', '48', '17', '2329', '1850', '0'), +('7', '48', '7', '1202', '3076', '0'), +('7', '48', '7', '2458', '2406', '0'), +('7', '48', '7', '2342', '2182', '0'), +('7', '48', '7', '1361', '1764', '0'), +('7', '48', '9', '27714', '8931', '0'), +('7', '48', '9', '1203', '2088', '0'), +('7', '48', '9', '14650', '1952', '0'), +('7', '48', '9', '10360', '1351', '0'), +('7', '48', '15', '10366', '8163', '0'), +('7', '48', '15', '10151', '7200', '0'), +('7', '48', '15', '14679', '6255', '0'), +('7', '48', '15', '14678', '5104', '0'), +('7', '48', '20', '11698', '9997', '0'), +('7', '48', '20', '11601', '9395', '0'), +('7', '48', '20', '2917', '5211', '0'), +('7', '48', '20', '2742', '4269', '0'), +('7', '48', '12', '2923', '3654', '0'), +('7', '48', '12', '11624', '3638', '0'), +('7', '48', '12', '8909', '1519', '0'), +('7', '48', '12', '1204', '1396', '0'), +('7', '48', '18', '2461', '2557', '0'), +('7', '48', '18', '1205', '1056', '0'), +('7', '48', '18', '2462', '1008', '0'), +('7', '48', '18', '25725', '978', '0'), +('7', '48', '19', '1280', '3540', '0'), +('7', '48', '19', '1206', '3030', '0'), +('7', '48', '19', '68239', '1360', '0'), +('7', '48', '19', '25726', '791', '0'), +('7', '48', '13', '27715', '38590', '0'), +('7', '48', '13', '6502', '26648', '0'), +('7', '48', '13', '71308', '11845', '0'), +('7', '48', '13', '6691', '11253', '0'), +('7', '48', '14', '27715', '38590', '0'), +('7', '48', '14', '6502', '26648', '0'), +('7', '48', '14', '71308', '11845', '0'), +('7', '48', '14', '6691', '11253', '0'), +('7', '48', '11', '14762', '854', '0'), +('7', '48', '11', '13748', '489', '0'), +('7', '48', '11', '9246', '453', '0'), +('7', '48', '11', '20677', '69', '0'), +('7', '49', '22', '9246', '0', '0'), +('7', '49', '22', '10323', '0', '0'), +('7', '49', '22', '21509', '0', '0'), +('7', '49', '22', '8332', '0', '0'), +('7', '49', '1', '14701', '4052', '0'), +('7', '49', '1', '14702', '2850', '0'), +('7', '49', '1', '10165', '1638', '0'), +('7', '49', '1', '14623', '1181', '0'), +('7', '49', '2', '10142', '3012', '0'), +('7', '49', '2', '4504', '2158', '0'), +('7', '49', '2', '1405', '1810', '0'), +('7', '49', '2', '10116', '1653', '0'), +('7', '49', '3', '10144', '1206', '0'), +('7', '49', '3', '2403', '1146', '0'), +('7', '49', '3', '14705', '990', '0'), +('7', '49', '3', '14706', '990', '0'), +('7', '49', '5', '14703', '6050', '0'), +('7', '49', '5', '14700', '3753', '0'), +('7', '49', '5', '10055', '3505', '0'), +('7', '49', '5', '2583', '2444', '0'), +('7', '49', '8', '11621', '14377', '0'), +('7', '49', '8', '11562', '9310', '0'), +('7', '49', '8', '27714', '8960', '0'), +('7', '49', '8', '1546', '6920', '0'), +('7', '49', '6', '1557', '6760', '0'), +('7', '49', '6', '11561', '3375', '0'), +('7', '49', '6', '1283', '2986', '0'), +('7', '49', '6', '25062', '768', '0'), +('7', '49', '17', '12256', '8597', '0'), +('7', '49', '17', '2348', '2751', '0'), +('7', '49', '17', '1201', '2467', '0'), +('7', '49', '17', '2329', '1864', '0'), +('7', '49', '7', '1202', '3114', '0'), +('7', '49', '7', '2458', '2406', '0'), +('7', '49', '7', '2342', '2195', '0'), +('7', '49', '7', '1361', '1764', '0'), +('7', '49', '9', '27714', '8960', '0'), +('7', '49', '9', '1203', '2109', '0'), +('7', '49', '9', '14650', '1952', '0'), +('7', '49', '9', '10360', '1351', '0'), +('7', '49', '15', '10366', '8163', '0'), +('7', '49', '15', '10151', '7200', '0'), +('7', '49', '15', '14679', '6255', '0'), +('7', '49', '15', '14678', '5104', '0'), +('7', '49', '20', '11698', '9997', '0'), +('7', '49', '20', '11601', '9437', '0'), +('7', '49', '20', '2917', '5211', '0'), +('7', '49', '20', '2742', '4311', '0'), +('7', '49', '12', '11624', '3668', '0'), +('7', '49', '12', '2923', '3654', '0'), +('7', '49', '12', '8909', '1530', '0'), +('7', '49', '12', '1204', '1396', '0'), +('7', '49', '18', '2461', '2557', '0'), +('7', '49', '18', '1205', '1056', '0'), +('7', '49', '18', '2462', '1023', '0'), +('7', '49', '18', '25725', '978', '0'), +('7', '49', '19', '1280', '3540', '0'), +('7', '49', '19', '1206', '3068', '0'), +('7', '49', '19', '68239', '1360', '0'), +('7', '49', '19', '25726', '791', '0'), +('7', '49', '13', '27715', '39653', '0'), +('7', '49', '13', '6502', '27413', '0'), +('7', '49', '13', '71308', '12157', '0'), +('7', '49', '13', '6691', '11553', '0'), +('7', '49', '14', '27715', '39653', '0'), +('7', '49', '14', '6502', '27413', '0'), +('7', '49', '14', '71308', '12157', '0'), +('7', '49', '14', '6691', '11553', '0'), +('7', '49', '11', '14762', '854', '0'), +('7', '49', '11', '13748', '489', '0'), +('7', '49', '11', '9246', '453', '0'), +('7', '49', '11', '20677', '69', '0'), +('7', '50', '22', '9246', '0', '0'), +('7', '50', '22', '10323', '0', '0'), +('7', '50', '22', '21509', '0', '0'), +('7', '50', '22', '8332', '0', '0'), +('7', '50', '1', '14701', '4052', '0'), +('7', '50', '1', '14702', '2850', '0'), +('7', '50', '1', '10165', '1638', '0'), +('7', '50', '1', '14623', '1207', '0'), +('7', '50', '2', '10142', '3012', '0'), +('7', '50', '2', '4504', '2158', '0'), +('7', '50', '2', '1405', '1810', '0'), +('7', '50', '2', '10116', '1670', '0'), +('7', '50', '3', '10144', '1206', '0'), +('7', '50', '3', '2403', '1146', '0'), +('7', '50', '3', '14705', '990', '0'), +('7', '50', '3', '14706', '990', '0'), +('7', '50', '5', '14703', '6050', '0'), +('7', '50', '5', '14700', '3753', '0'), +('7', '50', '5', '10055', '3505', '0'), +('7', '50', '5', '2583', '2444', '0'), +('7', '50', '8', '11621', '14377', '0'), +('7', '50', '8', '11562', '9310', '0'), +('7', '50', '8', '27714', '8990', '0'), +('7', '50', '8', '1546', '6920', '0'), +('7', '50', '6', '1557', '6760', '0'), +('7', '50', '6', '11561', '3404', '0'), +('7', '50', '6', '1283', '2986', '0'), +('7', '50', '6', '25062', '768', '0'), +('7', '50', '17', '12256', '8618', '0'), +('7', '50', '17', '2348', '2772', '0'), +('7', '50', '17', '1201', '2467', '0'), +('7', '50', '17', '2329', '1878', '0'), +('7', '50', '7', '1202', '3152', '0'), +('7', '50', '7', '2458', '2406', '0'), +('7', '50', '7', '2342', '2207', '0'), +('7', '50', '7', '1361', '1764', '0'), +('7', '50', '9', '27714', '8990', '0'), +('7', '50', '9', '1203', '2130', '0'), +('7', '50', '9', '14650', '1952', '0'), +('7', '50', '9', '10360', '1351', '0'), +('7', '50', '15', '10366', '8163', '0'), +('7', '50', '15', '10151', '7200', '0'), +('7', '50', '15', '14679', '6255', '0'), +('7', '50', '15', '14678', '5104', '0'), +('7', '50', '20', '11698', '9997', '0'), +('7', '50', '20', '11601', '9480', '0'), +('7', '50', '20', '2917', '5211', '0'), +('7', '50', '20', '2742', '4354', '0'), +('7', '50', '12', '11624', '3697', '0'), +('7', '50', '12', '2923', '3654', '0'), +('7', '50', '12', '8909', '1541', '0'), +('7', '50', '12', '1204', '1396', '0'), +('7', '50', '18', '2461', '2557', '0'), +('7', '50', '18', '1205', '1056', '0'), +('7', '50', '18', '2462', '1038', '0'), +('7', '50', '18', '25725', '978', '0'), +('7', '50', '19', '1280', '3540', '0'), +('7', '50', '19', '1206', '3106', '0'), +('7', '50', '19', '68239', '1360', '0'), +('7', '50', '19', '25726', '791', '0'), +('7', '50', '13', '27715', '40715', '0'), +('7', '50', '13', '6502', '28135', '0'), +('7', '50', '13', '71308', '12497', '0'), +('7', '50', '13', '6691', '11877', '0'), +('7', '50', '14', '27715', '40715', '0'), +('7', '50', '14', '6502', '28135', '0'), +('7', '50', '14', '71308', '12497', '0'), +('7', '50', '14', '6691', '11877', '0'), +('7', '50', '11', '14762', '854', '0'), +('7', '50', '11', '13748', '489', '0'), +('7', '50', '11', '9246', '453', '0'), +('7', '50', '11', '20677', '69', '0'), +('7', '51', '22', '9246', '0', '0'), +('7', '51', '22', '10323', '0', '0'), +('7', '51', '22', '21509', '0', '0'), +('7', '51', '22', '8332', '0', '0'), +('7', '51', '1', '27822', '4926', '0'), +('7', '51', '1', '14701', '4052', '0'), +('7', '51', '1', '14702', '2850', '0'), +('7', '51', '1', '10165', '1638', '0'), +('7', '51', '2', '10142', '3012', '0'), +('7', '51', '2', '4504', '2158', '0'), +('7', '51', '2', '1405', '1810', '0'), +('7', '51', '2', '10116', '1689', '0'), +('7', '51', '3', '10144', '1206', '0'), +('7', '51', '3', '2403', '1146', '0'), +('7', '51', '3', '14705', '990', '0'), +('7', '51', '3', '14706', '990', '0'), +('7', '51', '5', '14703', '6050', '0'), +('7', '51', '5', '14700', '3753', '0'), +('7', '51', '5', '10055', '3505', '0'), +('7', '51', '5', '2583', '2444', '0'), +('7', '51', '8', '11621', '14377', '0'), +('7', '51', '8', '11562', '9310', '0'), +('7', '51', '8', '27714', '9024', '0'), +('7', '51', '8', '1546', '6920', '0'), +('7', '51', '6', '1557', '6760', '0'), +('7', '51', '6', '11561', '3438', '0'), +('7', '51', '6', '1283', '2986', '0'), +('7', '51', '6', '25062', '768', '0'), +('7', '51', '17', '12256', '8642', '0'), +('7', '51', '17', '2348', '2797', '0'), +('7', '51', '17', '1201', '2467', '0'), +('7', '51', '17', '2329', '1895', '0'), +('7', '51', '7', '1202', '3195', '0'), +('7', '51', '7', '2458', '2406', '0'), +('7', '51', '7', '2342', '2222', '0'), +('7', '51', '7', '1361', '1764', '0'), +('7', '51', '9', '27714', '9024', '0'), +('7', '51', '9', '1203', '2155', '0'), +('7', '51', '9', '14650', '1952', '0'), +('7', '51', '9', '10360', '1351', '0'), +('7', '51', '15', '10366', '8163', '0'), +('7', '51', '15', '10151', '7200', '0'), +('7', '51', '15', '14679', '6255', '0'), +('7', '51', '15', '14678', '5104', '0'), +('7', '51', '20', '11698', '9997', '0'), +('7', '51', '20', '11601', '9528', '0'), +('7', '51', '20', '2917', '5211', '0'), +('7', '51', '20', '2742', '4402', '0'), +('7', '51', '12', '11624', '3731', '0'), +('7', '51', '12', '2923', '3654', '0'), +('7', '51', '12', '8909', '1553', '0'), +('7', '51', '12', '1204', '1396', '0'), +('7', '51', '18', '2461', '2557', '0'), +('7', '51', '18', '1205', '1056', '0'), +('7', '51', '18', '2462', '1056', '0'), +('7', '51', '18', '25725', '978', '0'), +('7', '51', '19', '1280', '3540', '0'), +('7', '51', '19', '1206', '3149', '0'), +('7', '51', '19', '68239', '1360', '0'), +('7', '51', '19', '25726', '791', '0'), +('7', '51', '13', '27715', '41820', '0'), +('7', '51', '13', '6502', '28858', '0'), +('7', '51', '13', '71308', '12809', '0'), +('7', '51', '13', '6691', '12177', '0'), +('7', '51', '14', '27715', '41820', '0'), +('7', '51', '14', '6502', '28858', '0'), +('7', '51', '14', '71308', '12809', '0'), +('7', '51', '14', '6691', '12177', '0'), +('7', '51', '11', '14762', '854', '0'), +('7', '51', '11', '13748', '489', '0'), +('7', '51', '11', '9246', '453', '0'), +('7', '51', '11', '20677', '69', '0'), +('7', '52', '22', '9246', '0', '0'), +('7', '52', '22', '10323', '0', '0'), +('7', '52', '22', '21509', '0', '0'), +('7', '52', '22', '8332', '0', '0'), +('7', '52', '1', '27822', '4926', '0'), +('7', '52', '1', '14701', '4052', '0'), +('7', '52', '1', '14702', '2850', '0'), +('7', '52', '1', '10165', '1638', '0'), +('7', '52', '2', '10142', '3012', '0'), +('7', '52', '2', '4504', '2158', '0'), +('7', '52', '2', '1405', '1810', '0'), +('7', '52', '2', '10116', '1706', '0'), +('7', '52', '3', '10144', '1206', '0'), +('7', '52', '3', '2403', '1146', '0'), +('7', '52', '3', '14705', '990', '0'), +('7', '52', '3', '14706', '990', '0'), +('7', '52', '5', '14703', '6050', '0'), +('7', '52', '5', '14700', '3753', '0'), +('7', '52', '5', '10055', '3505', '0'), +('7', '52', '5', '2583', '2444', '0'), +('7', '52', '8', '11621', '14377', '0'), +('7', '52', '8', '11562', '9310', '0'), +('7', '52', '8', '27714', '9053', '0'), +('7', '52', '8', '1546', '6920', '0'), +('7', '52', '6', '1557', '6760', '0'), +('7', '52', '6', '11561', '3468', '0'), +('7', '52', '6', '1283', '2986', '0'), +('7', '52', '6', '25062', '768', '0'), +('7', '52', '17', '12256', '8663', '0'), +('7', '52', '17', '2348', '2818', '0'), +('7', '52', '17', '1201', '2467', '0'), +('7', '52', '17', '2329', '1909', '0'), +('7', '52', '7', '1202', '3233', '0'), +('7', '52', '7', '2458', '2406', '0'), +('7', '52', '7', '2342', '2235', '0'), +('7', '52', '7', '1361', '1764', '0'), +('7', '52', '9', '27714', '9053', '0'), +('7', '52', '9', '1203', '2176', '0'), +('7', '52', '9', '14650', '1952', '0'), +('7', '52', '9', '10360', '1351', '0'), +('7', '52', '15', '10366', '8163', '0'), +('7', '52', '15', '10151', '7200', '0'), +('7', '52', '15', '14679', '6255', '0'), +('7', '52', '15', '14678', '5104', '0'), +('7', '52', '20', '11698', '9997', '0'), +('7', '52', '20', '11601', '9570', '0'), +('7', '52', '20', '2917', '5211', '0'), +('7', '52', '20', '2742', '4444', '0'), +('7', '52', '12', '11624', '3761', '0'), +('7', '52', '12', '2923', '3654', '0'), +('7', '52', '12', '8909', '1564', '0'), +('7', '52', '12', '1204', '1396', '0'), +('7', '52', '18', '2461', '2557', '0'), +('7', '52', '18', '2462', '1071', '0'), +('7', '52', '18', '1205', '1056', '0'), +('7', '52', '18', '25725', '978', '0'), +('7', '52', '19', '1280', '3540', '0'), +('7', '52', '19', '1206', '3187', '0'), +('7', '52', '19', '68239', '1360', '0'), +('7', '52', '19', '25726', '791', '0'), +('7', '52', '13', '27715', '42883', '0'), +('7', '52', '13', '6502', '29623', '0'), +('7', '52', '13', '71308', '13149', '0'), +('7', '52', '13', '6691', '12500', '0'), +('7', '52', '14', '27715', '42883', '0'), +('7', '52', '14', '6502', '29623', '0'), +('7', '52', '14', '71308', '13149', '0'), +('7', '52', '14', '6691', '12500', '0'), +('7', '52', '11', '14762', '854', '0'), +('7', '52', '11', '13748', '489', '0'), +('7', '52', '11', '9246', '453', '0'), +('7', '52', '11', '20677', '69', '0'), +('7', '53', '22', '9246', '0', '0'), +('7', '53', '22', '10323', '0', '0'), +('7', '53', '22', '21509', '0', '0'), +('7', '53', '22', '8332', '0', '0'), +('7', '53', '1', '27822', '4926', '0'), +('7', '53', '1', '14701', '4052', '0'), +('7', '53', '1', '14702', '2850', '0'), +('7', '53', '1', '10165', '1638', '0'), +('7', '53', '2', '10142', '3012', '0'), +('7', '53', '2', '4504', '2158', '0'), +('7', '53', '2', '1405', '1810', '0'), +('7', '53', '2', '10116', '1723', '0'), +('7', '53', '3', '10144', '1206', '0'), +('7', '53', '3', '2403', '1146', '0'), +('7', '53', '3', '14705', '990', '0'), +('7', '53', '3', '14706', '990', '0'), +('7', '53', '5', '14703', '6050', '0'), +('7', '53', '5', '14700', '3753', '0'), +('7', '53', '5', '10055', '3505', '0'), +('7', '53', '5', '2583', '2444', '0'), +('7', '53', '8', '11621', '14377', '0'), +('7', '53', '8', '11562', '9310', '0'), +('7', '53', '8', '27714', '9083', '0'), +('7', '53', '8', '1546', '6920', '0'), +('7', '53', '6', '1557', '6760', '0'), +('7', '53', '6', '11561', '3497', '0'), +('7', '53', '6', '1283', '2986', '0'), +('7', '53', '6', '25062', '768', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '53', '17', '12256', '8684', '0'), +('7', '53', '17', '2348', '2839', '0'), +('7', '53', '17', '1201', '2467', '0'), +('7', '53', '17', '2329', '1923', '0'), +('7', '53', '7', '1202', '3271', '0'), +('7', '53', '7', '2458', '2406', '0'), +('7', '53', '7', '2342', '2247', '0'), +('7', '53', '7', '1361', '1764', '0'), +('7', '53', '9', '27714', '9083', '0'), +('7', '53', '9', '1203', '2197', '0'), +('7', '53', '9', '14650', '1952', '0'), +('7', '53', '9', '10360', '1351', '0'), +('7', '53', '15', '10366', '8163', '0'), +('7', '53', '15', '10151', '7200', '0'), +('7', '53', '15', '14679', '6255', '0'), +('7', '53', '15', '14678', '5104', '0'), +('7', '53', '20', '11698', '9997', '0'), +('7', '53', '20', '11601', '9613', '0'), +('7', '53', '20', '2917', '5211', '0'), +('7', '53', '20', '2742', '4486', '0'), +('7', '53', '12', '11624', '3790', '0'), +('7', '53', '12', '2923', '3654', '0'), +('7', '53', '12', '8909', '1574', '0'), +('7', '53', '12', '1204', '1396', '0'), +('7', '53', '18', '2461', '2557', '0'), +('7', '53', '18', '2462', '1086', '0'), +('7', '53', '18', '1205', '1056', '0'), +('7', '53', '18', '25725', '978', '0'), +('7', '53', '19', '1280', '3540', '0'), +('7', '53', '19', '1206', '3225', '0'), +('7', '53', '19', '68239', '1360', '0'), +('7', '53', '19', '25726', '791', '0'), +('7', '53', '13', '27715', '43945', '0'), +('7', '53', '13', '6502', '30345', '0'), +('7', '53', '13', '71308', '13460', '0'), +('7', '53', '13', '6691', '12801', '0'), +('7', '53', '14', '27715', '43945', '0'), +('7', '53', '14', '6502', '30345', '0'), +('7', '53', '14', '71308', '13460', '0'), +('7', '53', '14', '6691', '12801', '0'), +('7', '53', '11', '14762', '854', '0'), +('7', '53', '11', '13748', '489', '0'), +('7', '53', '11', '9246', '453', '0'), +('7', '53', '11', '20677', '69', '0'), +('7', '54', '22', '9246', '0', '0'), +('7', '54', '22', '10323', '0', '0'), +('7', '54', '22', '21509', '0', '0'), +('7', '54', '22', '8332', '0', '0'), +('7', '54', '1', '27822', '4926', '0'), +('7', '54', '1', '14701', '4052', '0'), +('7', '54', '1', '14702', '2850', '0'), +('7', '54', '1', '10165', '1638', '0'), +('7', '54', '2', '10142', '3012', '0'), +('7', '54', '2', '4504', '2158', '0'), +('7', '54', '2', '1405', '1810', '0'), +('7', '54', '2', '10116', '1742', '0'), +('7', '54', '3', '10144', '1206', '0'), +('7', '54', '3', '2403', '1146', '0'), +('7', '54', '3', '14705', '990', '0'), +('7', '54', '3', '14706', '990', '0'), +('7', '54', '5', '14703', '6050', '0'), +('7', '54', '5', '14700', '3753', '0'), +('7', '54', '5', '10055', '3505', '0'), +('7', '54', '5', '2583', '2444', '0'), +('7', '54', '8', '11621', '14377', '0'), +('7', '54', '8', '11562', '9310', '0'), +('7', '54', '8', '27714', '9117', '0'), +('7', '54', '8', '1546', '6920', '0'), +('7', '54', '6', '1557', '6760', '0'), +('7', '54', '6', '11561', '3531', '0'), +('7', '54', '6', '1283', '2986', '0'), +('7', '54', '6', '25062', '768', '0'), +('7', '54', '17', '12256', '8709', '0'), +('7', '54', '17', '2348', '2863', '0'), +('7', '54', '17', '1201', '2467', '0'), +('7', '54', '17', '2329', '1939', '0'), +('7', '54', '7', '1202', '3315', '0'), +('7', '54', '7', '2458', '2406', '0'), +('7', '54', '7', '2342', '2262', '0'), +('7', '54', '7', '1361', '1764', '0'), +('7', '54', '9', '27714', '9117', '0'), +('7', '54', '9', '1203', '2221', '0'), +('7', '54', '9', '14650', '1952', '0'), +('7', '54', '9', '10360', '1351', '0'), +('7', '54', '15', '10366', '8163', '0'), +('7', '54', '15', '10151', '7200', '0'), +('7', '54', '15', '14679', '6255', '0'), +('7', '54', '15', '14678', '5104', '0'), +('7', '54', '20', '11698', '9997', '0'), +('7', '54', '20', '11601', '9661', '0'), +('7', '54', '20', '2917', '5211', '0'), +('7', '54', '20', '2742', '4535', '0'), +('7', '54', '12', '11624', '3824', '0'), +('7', '54', '12', '2923', '3654', '0'), +('7', '54', '12', '8909', '1586', '0'), +('7', '54', '12', '1204', '1396', '0'), +('7', '54', '18', '2461', '2557', '0'), +('7', '54', '18', '2462', '1104', '0'), +('7', '54', '18', '1205', '1056', '0'), +('7', '54', '18', '25725', '978', '0'), +('7', '54', '19', '1280', '3540', '0'), +('7', '54', '19', '1206', '3269', '0'), +('7', '54', '19', '68239', '1360', '0'), +('7', '54', '19', '25726', '791', '0'), +('7', '54', '13', '27715', '45050', '0'), +('7', '54', '13', '6502', '31110', '0'), +('7', '54', '13', '71308', '13772', '0'), +('7', '54', '13', '6691', '13124', '0'), +('7', '54', '14', '27715', '45050', '0'), +('7', '54', '14', '6502', '31110', '0'), +('7', '54', '14', '71308', '13772', '0'), +('7', '54', '14', '6691', '13124', '0'), +('7', '54', '11', '14762', '854', '0'), +('7', '54', '11', '13748', '489', '0'), +('7', '54', '11', '9246', '453', '0'), +('7', '54', '11', '20677', '69', '0'), +('7', '55', '22', '9246', '0', '0'), +('7', '55', '22', '10323', '0', '0'), +('7', '55', '22', '21509', '0', '0'), +('7', '55', '22', '8332', '0', '0'), +('7', '55', '1', '27822', '4926', '0'), +('7', '55', '1', '14701', '4052', '0'), +('7', '55', '1', '14702', '2850', '0'), +('7', '55', '1', '10165', '1638', '0'), +('7', '55', '2', '10142', '3012', '0'), +('7', '55', '2', '4504', '2158', '0'), +('7', '55', '2', '1405', '1810', '0'), +('7', '55', '2', '10116', '1759', '0'), +('7', '55', '3', '10144', '1206', '0'), +('7', '55', '3', '2403', '1146', '0'), +('7', '55', '3', '14705', '990', '0'), +('7', '55', '3', '14706', '990', '0'), +('7', '55', '5', '14703', '6050', '0'), +('7', '55', '5', '14700', '3753', '0'), +('7', '55', '5', '10055', '3505', '0'), +('7', '55', '5', '2583', '2444', '0'), +('7', '55', '8', '11621', '14377', '0'), +('7', '55', '8', '11562', '9310', '0'), +('7', '55', '8', '27714', '9146', '0'), +('7', '55', '8', '1546', '6920', '0'), +('7', '55', '6', '1557', '6760', '0'), +('7', '55', '6', '11561', '3561', '0'), +('7', '55', '6', '1283', '2986', '0'), +('7', '55', '6', '25062', '768', '0'), +('7', '55', '17', '12256', '8730', '0'), +('7', '55', '17', '2348', '2884', '0'), +('7', '55', '17', '1201', '2467', '0'), +('7', '55', '17', '2329', '1953', '0'), +('7', '55', '7', '1202', '3353', '0'), +('7', '55', '7', '2458', '2406', '0'), +('7', '55', '7', '2342', '2274', '0'), +('7', '55', '7', '1361', '1764', '0'), +('7', '55', '9', '27714', '9146', '0'), +('7', '55', '9', '1203', '2242', '0'), +('7', '55', '9', '14650', '1952', '0'), +('7', '55', '9', '10360', '1351', '0'), +('7', '55', '15', '10366', '8163', '0'), +('7', '55', '15', '10151', '7200', '0'), +('7', '55', '15', '14679', '6255', '0'), +('7', '55', '15', '14678', '5104', '0'), +('7', '55', '20', '11698', '9997', '0'), +('7', '55', '20', '11601', '9703', '0'), +('7', '55', '20', '2917', '5211', '0'), +('7', '55', '20', '2742', '4577', '0'), +('7', '55', '12', '11624', '3854', '0'), +('7', '55', '12', '2923', '3654', '0'), +('7', '55', '12', '8909', '1597', '0'), +('7', '55', '12', '1204', '1396', '0'), +('7', '55', '18', '2461', '2557', '0'), +('7', '55', '18', '2462', '1119', '0'), +('7', '55', '18', '1205', '1056', '0'), +('7', '55', '18', '25725', '978', '0'), +('7', '55', '19', '1280', '3540', '0'), +('7', '55', '19', '1206', '3307', '0'), +('7', '55', '19', '68239', '1360', '0'), +('7', '55', '19', '25726', '791', '0'), +('7', '55', '13', '27715', '46113', '0'), +('7', '55', '13', '6502', '31833', '0'), +('7', '55', '13', '71308', '14112', '0'), +('7', '55', '13', '6691', '13424', '0'), +('7', '55', '14', '27715', '46113', '0'), +('7', '55', '14', '6502', '31833', '0'), +('7', '55', '14', '71308', '14112', '0'), +('7', '55', '14', '6691', '13424', '0'), +('7', '55', '11', '14762', '854', '0'), +('7', '55', '11', '13748', '489', '0'), +('7', '55', '11', '9246', '453', '0'), +('7', '55', '11', '20677', '69', '0'), +('7', '56', '22', '9246', '0', '0'), +('7', '56', '22', '10323', '0', '0'), +('7', '56', '22', '21509', '0', '0'), +('7', '56', '22', '8332', '0', '0'), +('7', '56', '1', '27822', '4926', '0'), +('7', '56', '1', '14701', '4052', '0'), +('7', '56', '1', '14702', '2850', '0'), +('7', '56', '1', '10165', '1638', '0'), +('7', '56', '2', '10142', '3012', '0'), +('7', '56', '2', '4504', '2158', '0'), +('7', '56', '2', '1405', '1810', '0'), +('7', '56', '2', '10116', '1778', '0'), +('7', '56', '3', '10144', '1206', '0'), +('7', '56', '3', '2403', '1146', '0'), +('7', '56', '3', '14705', '990', '0'), +('7', '56', '3', '14706', '990', '0'), +('7', '56', '5', '14703', '6050', '0'), +('7', '56', '5', '14700', '3753', '0'), +('7', '56', '5', '10055', '3505', '0'), +('7', '56', '5', '2583', '2444', '0'), +('7', '56', '8', '11621', '14377', '0'), +('7', '56', '8', '11562', '9310', '0'), +('7', '56', '8', '27714', '9180', '0'), +('7', '56', '8', '1546', '6920', '0'), +('7', '56', '6', '1557', '6760', '0'), +('7', '56', '6', '11561', '3594', '0'), +('7', '56', '6', '1283', '2986', '0'), +('7', '56', '6', '25062', '768', '0'), +('7', '56', '17', '12256', '8754', '0'), +('7', '56', '17', '2348', '2908', '0'), +('7', '56', '17', '1201', '2467', '0'), +('7', '56', '17', '2329', '1969', '0'), +('7', '56', '7', '1202', '3396', '0'), +('7', '56', '7', '2458', '2406', '0'), +('7', '56', '7', '2342', '2289', '0'), +('7', '56', '7', '1361', '1764', '0'), +('7', '56', '9', '27714', '9180', '0'), +('7', '56', '9', '1203', '2266', '0'), +('7', '56', '9', '14650', '1952', '0'), +('7', '56', '9', '10360', '1351', '0'), +('7', '56', '15', '10366', '8163', '0'), +('7', '56', '15', '10151', '7200', '0'), +('7', '56', '15', '14679', '6255', '0'), +('7', '56', '15', '14678', '5104', '0'), +('7', '56', '20', '11698', '9997', '0'), +('7', '56', '20', '11601', '9752', '0'), +('7', '56', '20', '2917', '5211', '0'), +('7', '56', '20', '2742', '4625', '0'), +('7', '56', '12', '11624', '3888', '0'), +('7', '56', '12', '2923', '3654', '0'), +('7', '56', '12', '8909', '1609', '0'), +('7', '56', '12', '1204', '1396', '0'), +('7', '56', '18', '2461', '2557', '0'), +('7', '56', '18', '2462', '1137', '0'), +('7', '56', '18', '1205', '1056', '0'), +('7', '56', '18', '25725', '978', '0'), +('7', '56', '19', '1280', '3540', '0'), +('7', '56', '19', '1206', '3350', '0'), +('7', '56', '19', '68239', '1360', '0'), +('7', '56', '19', '25726', '791', '0'), +('7', '56', '13', '27715', '47175', '0'), +('7', '56', '13', '6502', '32598', '0'), +('7', '56', '13', '71308', '14424', '0'), +('7', '56', '13', '6691', '13748', '0'), +('7', '56', '14', '27715', '47175', '0'), +('7', '56', '14', '6502', '32598', '0'), +('7', '56', '14', '71308', '14424', '0'), +('7', '56', '14', '6691', '13748', '0'), +('7', '56', '11', '14762', '854', '0'), +('7', '56', '11', '13748', '489', '0'), +('7', '56', '11', '9246', '453', '0'), +('7', '56', '11', '20677', '69', '0'), +('7', '57', '22', '9246', '0', '0'), +('7', '57', '22', '10323', '0', '0'), +('7', '57', '22', '21509', '0', '0'), +('7', '57', '22', '8332', '0', '0'), +('7', '57', '1', '27822', '4926', '0'), +('7', '57', '1', '14701', '4052', '0'), +('7', '57', '1', '14702', '2850', '0'), +('7', '57', '1', '10165', '1638', '0'), +('7', '57', '2', '10142', '3012', '0'), +('7', '57', '2', '4504', '2158', '0'), +('7', '57', '2', '1405', '1810', '0'), +('7', '57', '2', '10116', '1795', '0'), +('7', '57', '3', '10144', '1206', '0'), +('7', '57', '3', '2403', '1146', '0'), +('7', '57', '3', '14705', '990', '0'), +('7', '57', '3', '14706', '990', '0'), +('7', '57', '5', '14703', '6050', '0'), +('7', '57', '5', '14700', '3753', '0'), +('7', '57', '5', '10055', '3505', '0'), +('7', '57', '5', '2583', '2444', '0'), +('7', '57', '8', '11621', '14377', '0'), +('7', '57', '8', '11562', '9310', '0'), +('7', '57', '8', '27714', '9210', '0'), +('7', '57', '8', '1546', '6920', '0'), +('7', '57', '6', '1557', '6760', '0'), +('7', '57', '6', '11561', '3624', '0'), +('7', '57', '6', '1283', '2986', '0'), +('7', '57', '6', '25062', '768', '0'), +('7', '57', '17', '12256', '8775', '0'), +('7', '57', '17', '2348', '2929', '0'), +('7', '57', '17', '1201', '2467', '0'), +('7', '57', '17', '2329', '1983', '0'), +('7', '57', '7', '1202', '3434', '0'), +('7', '57', '7', '2458', '2406', '0'), +('7', '57', '7', '2342', '2302', '0'), +('7', '57', '7', '1361', '1764', '0'), +('7', '57', '9', '27714', '9210', '0'), +('7', '57', '9', '1203', '2288', '0'), +('7', '57', '9', '14650', '1952', '0'), +('7', '57', '9', '10360', '1351', '0'), +('7', '57', '15', '10366', '8163', '0'), +('7', '57', '15', '10151', '7200', '0'), +('7', '57', '15', '14679', '6255', '0'), +('7', '57', '15', '14678', '5104', '0'), +('7', '57', '20', '11698', '9997', '0'), +('7', '57', '20', '11601', '9794', '0'), +('7', '57', '20', '2917', '5211', '0'), +('7', '57', '20', '2742', '4668', '0'), +('7', '57', '12', '11624', '3917', '0'), +('7', '57', '12', '2923', '3654', '0'), +('7', '57', '12', '8909', '1620', '0'), +('7', '57', '12', '1204', '1396', '0'), +('7', '57', '18', '2461', '2557', '0'), +('7', '57', '18', '2462', '1152', '0'), +('7', '57', '18', '1205', '1056', '0'), +('7', '57', '18', '25725', '978', '0'), +('7', '57', '19', '1280', '3540', '0'), +('7', '57', '19', '1206', '3388', '0'), +('7', '57', '19', '68239', '1360', '0'), +('7', '57', '19', '25726', '791', '0'), +('7', '57', '13', '27715', '48238', '0'), +('7', '57', '13', '6502', '33320', '0'), +('7', '57', '13', '71308', '14764', '0'), +('7', '57', '13', '6691', '14048', '0'), +('7', '57', '14', '27715', '48238', '0'), +('7', '57', '14', '6502', '33320', '0'), +('7', '57', '14', '71308', '14764', '0'), +('7', '57', '14', '6691', '14048', '0'), +('7', '57', '11', '14762', '854', '0'), +('7', '57', '11', '13748', '489', '0'), +('7', '57', '11', '9246', '453', '0'), +('7', '57', '11', '20677', '69', '0'), +('7', '58', '22', '9246', '0', '0'), +('7', '58', '22', '10323', '0', '0'), +('7', '58', '22', '21509', '0', '0'), +('7', '58', '22', '8332', '0', '0'), +('7', '58', '1', '27822', '4926', '0'), +('7', '58', '1', '14701', '4052', '0'), +('7', '58', '1', '14702', '2850', '0'), +('7', '58', '1', '10165', '1638', '0'), +('7', '58', '2', '10142', '3012', '0'), +('7', '58', '2', '4504', '2158', '0'), +('7', '58', '2', '10116', '1815', '0'), +('7', '58', '2', '1405', '1810', '0'), +('7', '58', '3', '10144', '1206', '0'), +('7', '58', '3', '2403', '1146', '0'), +('7', '58', '3', '14705', '990', '0'), +('7', '58', '3', '14706', '990', '0'), +('7', '58', '5', '14703', '6050', '0'), +('7', '58', '5', '14700', '3753', '0'), +('7', '58', '5', '10055', '3505', '0'), +('7', '58', '5', '2583', '2444', '0'), +('7', '58', '8', '11621', '14377', '0'), +('7', '58', '8', '11562', '9310', '0'), +('7', '58', '8', '27714', '9244', '0'), +('7', '58', '8', '1546', '6920', '0'), +('7', '58', '6', '1557', '6760', '0'), +('7', '58', '6', '11561', '3658', '0'), +('7', '58', '6', '1283', '2986', '0'), +('7', '58', '6', '25062', '768', '0'), +('7', '58', '17', '12256', '8799', '0'), +('7', '58', '17', '2348', '2954', '0'), +('7', '58', '17', '1201', '2467', '0'), +('7', '58', '17', '2329', '1999', '0'), +('7', '58', '7', '1202', '3478', '0'), +('7', '58', '7', '2458', '2406', '0'), +('7', '58', '7', '2342', '2316', '0'), +('7', '58', '7', '1361', '1764', '0'), +('7', '58', '9', '27714', '9244', '0'), +('7', '58', '9', '1203', '2312', '0'), +('7', '58', '9', '14650', '1952', '0'), +('7', '58', '9', '10360', '1351', '0'), +('7', '58', '15', '10366', '8163', '0'), +('7', '58', '15', '10151', '7200', '0'), +('7', '58', '15', '14679', '6255', '0'), +('7', '58', '15', '14678', '5104', '0'), +('7', '58', '20', '11698', '9997', '0'), +('7', '58', '20', '11601', '9842', '0'), +('7', '58', '20', '2917', '5211', '0'), +('7', '58', '20', '2742', '4716', '0'), +('7', '58', '12', '11624', '3951', '0'), +('7', '58', '12', '2923', '3654', '0'), +('7', '58', '12', '8909', '1632', '0'), +('7', '58', '12', '1204', '1396', '0'), +('7', '58', '18', '2461', '2557', '0'), +('7', '58', '18', '2462', '1169', '0'), +('7', '58', '18', '1205', '1056', '0'), +('7', '58', '18', '25725', '978', '0'), +('7', '58', '19', '1280', '3540', '0'), +('7', '58', '19', '1206', '3432', '0'), +('7', '58', '19', '68239', '1360', '0'), +('7', '58', '19', '25726', '791', '0'), +('7', '58', '13', '27715', '49343', '0'), +('7', '58', '13', '6502', '34085', '0'), +('7', '58', '13', '71308', '15075', '0'), +('7', '58', '13', '6691', '14371', '0'), +('7', '58', '14', '27715', '49343', '0'), +('7', '58', '14', '6502', '34085', '0'), +('7', '58', '14', '71308', '15075', '0'), +('7', '58', '14', '6691', '14371', '0'), +('7', '58', '11', '14762', '854', '0'), +('7', '58', '11', '13748', '489', '0'), +('7', '58', '11', '9246', '453', '0'), +('7', '58', '11', '20677', '69', '0'), +('7', '59', '22', '9246', '0', '0'), +('7', '59', '22', '10323', '0', '0'), +('7', '59', '22', '21509', '0', '0'), +('7', '59', '22', '8332', '0', '0'), +('7', '59', '1', '27822', '4926', '0'), +('7', '59', '1', '14701', '4052', '0'), +('7', '59', '1', '14702', '2850', '0'), +('7', '59', '1', '10165', '1638', '0'), +('7', '59', '2', '10142', '3012', '0'), +('7', '59', '2', '4504', '2158', '0'), +('7', '59', '2', '10116', '1831', '0'), +('7', '59', '2', '1405', '1810', '0'), +('7', '59', '3', '10144', '1206', '0'), +('7', '59', '3', '2403', '1146', '0'), +('7', '59', '3', '14705', '990', '0'), +('7', '59', '3', '14706', '990', '0'), +('7', '59', '5', '14703', '6050', '0'), +('7', '59', '5', '14700', '3753', '0'), +('7', '59', '5', '10055', '3505', '0'), +('7', '59', '5', '2583', '2444', '0'), +('7', '59', '8', '11621', '14377', '0'), +('7', '59', '8', '11562', '9310', '0'), +('7', '59', '8', '27714', '9273', '0'), +('7', '59', '8', '1546', '6920', '0'), +('7', '59', '6', '1557', '6760', '0'), +('7', '59', '6', '11561', '3687', '0'), +('7', '59', '6', '1283', '2986', '0'), +('7', '59', '6', '25062', '768', '0'), +('7', '59', '17', '12256', '8820', '0'), +('7', '59', '17', '2348', '2975', '0'), +('7', '59', '17', '1201', '2467', '0'), +('7', '59', '17', '2329', '2013', '0'), +('7', '59', '7', '1202', '3516', '0'), +('7', '59', '7', '2458', '2406', '0'), +('7', '59', '7', '2342', '2329', '0'), +('7', '59', '7', '1361', '1764', '0'), +('7', '59', '9', '27714', '9273', '0'), +('7', '59', '9', '1203', '2333', '0'), +('7', '59', '9', '14650', '1952', '0'), +('7', '59', '9', '10360', '1351', '0'), +('7', '59', '15', '10366', '8163', '0'), +('7', '59', '15', '10151', '7200', '0'), +('7', '59', '15', '14679', '6255', '0'), +('7', '59', '15', '14678', '5104', '0'), +('7', '59', '20', '11698', '9997', '0'), +('7', '59', '20', '11601', '9884', '0'), +('7', '59', '20', '2917', '5211', '0'), +('7', '59', '20', '2742', '4758', '0'), +('7', '59', '12', '11624', '3981', '0'), +('7', '59', '12', '2923', '3654', '0'), +('7', '59', '12', '8909', '1643', '0'), +('7', '59', '12', '1204', '1396', '0'), +('7', '59', '18', '2461', '2557', '0'), +('7', '59', '18', '2462', '1185', '0'), +('7', '59', '18', '1205', '1056', '0'), +('7', '59', '18', '25725', '978', '0'), +('7', '59', '19', '1280', '3540', '0'), +('7', '59', '19', '1206', '3470', '0'), +('7', '59', '19', '68239', '1360', '0'), +('7', '59', '19', '25726', '791', '0'), +('7', '59', '13', '27715', '50405', '0'), +('7', '59', '13', '6502', '34808', '0'), +('7', '59', '13', '71308', '15415', '0'), +('7', '59', '13', '6691', '14672', '0'), +('7', '59', '14', '27715', '50405', '0'), +('7', '59', '14', '6502', '34808', '0'), +('7', '59', '14', '71308', '15415', '0'), +('7', '59', '14', '6691', '14672', '0'), +('7', '59', '11', '14762', '854', '0'), +('7', '59', '11', '13748', '489', '0'), +('7', '59', '11', '9246', '453', '0'), +('7', '59', '11', '20677', '69', '0'), +('7', '60', '22', '61948', '0', '3'), +('7', '60', '22', '66397', '0', '3'), +('7', '60', '22', '21805', '0', '3'), +('7', '60', '22', '21807', '0', '3'), +('7', '60', '1', '28962', '13139', '3'), +('7', '60', '1', '29861', '12683', '3'), +('7', '60', '1', '63170', '12351', '3'), +('7', '60', '1', '7945', '11423', '3'), +('7', '60', '2', '31223', '18119', '3'), +('7', '60', '2', '26535', '13800', '3'), +('7', '60', '2', '2612', '12730', '3'), +('7', '60', '2', '26025', '12730', '3'), +('7', '60', '3', '31233', '12327', '3'), +('7', '60', '3', '26560', '11234', '3'), +('7', '60', '3', '26582', '10779', '3'), +('7', '60', '3', '31464', '10272', '3'), +('7', '60', '5', '8364', '19466', '3'), +('7', '60', '5', '27266', '13707', '3'), +('7', '60', '5', '26584', '13364', '3'), +('7', '60', '5', '31234', '12355', '3'), +('7', '60', '8', '31471', '19188', '3'), +('7', '60', '8', '26766', '13877', '3'), +('7', '60', '8', '11621', '12679', '3'), +('7', '60', '8', '28918', '12442', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '60', '6', '28902', '14134', '3'), +('7', '60', '6', '31472', '13149', '3'), +('7', '60', '6', '30551', '11895', '3'), +('7', '60', '6', '5723', '11600', '3'), +('7', '60', '17', '59949', '16564', '3'), +('7', '60', '17', '29456', '16564', '3'), +('7', '60', '17', '1137', '12397', '3'), +('7', '60', '17', '10845', '11795', '3'), +('7', '60', '7', '26584', '13364', '3'), +('7', '60', '7', '8288', '12596', '3'), +('7', '60', '7', '5723', '11600', '3'), +('7', '60', '7', '30528', '9277', '3'), +('7', '60', '9', '31461', '20093', '3'), +('7', '60', '9', '26584', '13364', '3'), +('7', '60', '9', '5723', '11600', '3'), +('7', '60', '9', '31460', '11356', '3'), +('7', '60', '15', '26749', '16111', '3'), +('7', '60', '15', '31231', '12575', '3'), +('7', '60', '15', '26757', '12441', '3'), +('7', '60', '15', '63170', '12351', '3'), +('7', '60', '20', '31235', '18385', '3'), +('7', '60', '20', '31334', '16220', '3'), +('7', '60', '20', '26551', '15795', '3'), +('7', '60', '20', '26556', '13393', '3'), +('7', '60', '12', '25857', '17882', '3'), +('7', '60', '12', '1683', '11597', '3'), +('7', '60', '12', '28967', '10442', '3'), +('7', '60', '12', '28949', '9640', '3'), +('7', '60', '18', '26772', '14824', '3'), +('7', '60', '18', '8289', '10330', '3'), +('7', '60', '18', '25212', '10202', '3'), +('7', '60', '18', '28965', '10100', '3'), +('7', '60', '19', '30569', '17655', '3'), +('7', '60', '19', '24616', '11338', '3'), +('7', '60', '19', '28888', '10808', '3'), +('7', '60', '19', '28934', '9237', '3'), +('7', '60', '13', '27315', '83476', '3'), +('7', '60', '13', '26809', '80922', '3'), +('7', '60', '13', '26849', '80649', '3'), +('7', '60', '13', '26861', '76897', '3'), +('7', '60', '14', '27315', '83476', '3'), +('7', '60', '14', '26809', '80922', '3'), +('7', '60', '14', '26849', '80649', '3'), +('7', '60', '14', '26861', '76897', '3'), +('7', '60', '11', '26563', '16416', '3'), +('7', '60', '11', '30565', '11304', '3'), +('7', '60', '11', '26562', '11117', '3'), +('7', '60', '11', '28948', '10698', '3'), +('7', '60', '22', '10323', '0', '2'), +('7', '60', '22', '9248', '0', '2'), +('7', '60', '22', '12425', '0', '2'), +('7', '60', '22', '30014', '0', '2'), +('7', '60', '1', '30391', '8045', '2'), +('7', '60', '1', '2748', '7995', '2'), +('7', '60', '1', '5716', '7597', '2'), +('7', '60', '1', '2065', '7363', '2'), +('7', '60', '2', '31223', '19787', '2'), +('7', '60', '2', '26025', '13525', '2'), +('7', '60', '2', '2612', '13525', '2'), +('7', '60', '2', '31417', '11414', '2'), +('7', '60', '3', '31233', '13588', '2'), +('7', '60', '3', '31464', '11476', '2'), +('7', '60', '3', '31244', '10486', '2'), +('7', '60', '3', '1547', '6381', '2'), +('7', '60', '5', '27266', '14267', '2'), +('7', '60', '5', '31234', '13392', '2'), +('7', '60', '5', '31460', '12903', '2'), +('7', '60', '5', '1550', '12060', '2'), +('7', '60', '8', '31471', '20559', '2'), +('7', '60', '8', '11621', '12962', '2'), +('7', '60', '8', '31376', '11730', '2'), +('7', '60', '8', '25207', '11267', '2'), +('7', '60', '6', '31472', '14621', '2'), +('7', '60', '6', '5723', '12099', '2'), +('7', '60', '6', '24070', '5900', '2'), +('7', '60', '6', '1557', '5523', '2'), +('7', '60', '17', '29456', '17150', '2'), +('7', '60', '17', '59949', '17150', '2'), +('7', '60', '17', '1137', '13856', '2'), +('7', '60', '17', '10845', '12241', '2'), +('7', '60', '7', '5723', '12099', '2'), +('7', '60', '7', '31191', '5278', '2'), +('7', '60', '7', '25442', '4226', '2'), +('7', '60', '7', '25544', '3967', '2'), +('7', '60', '9', '31461', '21512', '2'), +('7', '60', '9', '31460', '12903', '2'), +('7', '60', '9', '5723', '12099', '2'), +('7', '60', '9', '31354', '11431', '2'), +('7', '60', '15', '31231', '13318', '2'), +('7', '60', '15', '25211', '12625', '2'), +('7', '60', '15', '30385', '11099', '2'), +('7', '60', '15', '31377', '9717', '2'), +('7', '60', '20', '31235', '20220', '2'), +('7', '60', '20', '31334', '16913', '2'), +('7', '60', '20', '2510', '13627', '2'), +('7', '60', '20', '25858', '13518', '2'), +('7', '60', '12', '25857', '18691', '2'), +('7', '60', '12', '1683', '12561', '2'), +('7', '60', '12', '25201', '9484', '2'), +('7', '60', '12', '31227', '7477', '2'), +('7', '60', '18', '25212', '12205', '2'), +('7', '60', '18', '31332', '7148', '2'), +('7', '60', '18', '31194', '6843', '2'), +('7', '60', '18', '9642', '4625', '2'), +('7', '60', '19', '24616', '11719', '2'), +('7', '60', '19', '31195', '4914', '2'), +('7', '60', '19', '9643', '4643', '2'), +('7', '60', '19', '31336', '4012', '2'), +('7', '60', '13', '1154', '73538', '2'), +('7', '60', '13', '31241', '71340', '2'), +('7', '60', '13', '5776', '70053', '2'), +('7', '60', '13', '5839', '63571', '2'), +('7', '60', '14', '1154', '73538', '2'), +('7', '60', '14', '31241', '71340', '2'), +('7', '60', '14', '5776', '70053', '2'), +('7', '60', '14', '5836', '68143', '2'), +('7', '60', '11', '31469', '11306', '2'), +('7', '60', '11', '2698', '10909', '2'), +('7', '60', '11', '31303', '9345', '2'), +('7', '60', '11', '29462', '7433', '2'), +('7', '60', '22', '10323', '0', '1'), +('7', '60', '22', '12425', '0', '1'), +('7', '60', '22', '10664', '0', '1'), +('7', '60', '22', '9246', '0', '1'), +('7', '60', '1', '5716', '7477', '1'), +('7', '60', '1', '62234', '6934', '1'), +('7', '60', '1', '5704', '5433', '1'), +('7', '60', '1', '5715', '5433', '1'), +('7', '60', '2', '10913', '9444', '1'), +('7', '60', '2', '1630', '3846', '1'), +('7', '60', '2', '5799', '2856', '1'), +('7', '60', '2', '11276', '2270', '1'), +('7', '60', '3', '46184', '4821', '1'), +('7', '60', '3', '1625', '4224', '1'), +('7', '60', '3', '11477', '2196', '1'), +('7', '60', '3', '3259', '1575', '1'), +('7', '60', '5', '14703', '6050', '1'), +('7', '60', '5', '14700', '3567', '1'), +('7', '60', '5', '8285', '3345', '1'), +('7', '60', '5', '14709', '3228', '1'), +('7', '60', '8', '11621', '13670', '1'), +('7', '60', '8', '1619', '12680', '1'), +('7', '60', '8', '11562', '8691', '1'), +('7', '60', '8', '1622', '8326', '1'), +('7', '60', '6', '5723', '13347', '1'), +('7', '60', '6', '1557', '6141', '1'), +('7', '60', '6', '5706', '3144', '1'), +('7', '60', '6', '1283', '2377', '1'), +('7', '60', '17', '10845', '13354', '1'), +('7', '60', '17', '12256', '7269', '1'), +('7', '60', '17', '12970', '6637', '1'), +('7', '60', '17', '1268', '2937', '1'), +('7', '60', '7', '5723', '13347', '1'), +('7', '60', '7', '62046', '3101', '1'), +('7', '60', '7', '1202', '2248', '1'), +('7', '60', '7', '2458', '2035', '1'), +('7', '60', '9', '5723', '13347', '1'), +('7', '60', '9', '27714', '7542', '1'), +('7', '60', '9', '4199', '5948', '1'), +('7', '60', '9', '14650', '1828', '1'), +('7', '60', '15', '5727', '10173', '1'), +('7', '60', '15', '10366', '8096', '1'), +('7', '60', '15', '10151', '7200', '1'), +('7', '60', '15', '5728', '7128', '1'), +('7', '60', '20', '1620', '10180', '1'), +('7', '60', '20', '11698', '9261', '1'), +('7', '60', '20', '11601', '8403', '1'), +('7', '60', '20', '1623', '4978', '1'), +('7', '60', '12', '1683', '14969', '1'), +('7', '60', '12', '2923', '3407', '1'), +('7', '60', '12', '11624', '2542', '1'), +('7', '60', '12', '8909', '977', '1'), +('7', '60', '18', '2461', '2124', '1'), +('7', '60', '18', '5781', '1038', '1'), +('7', '60', '18', '2462', '710', '1'), +('7', '60', '18', '1205', '709', '1'), +('7', '60', '19', '24616', '12669', '1'), +('7', '60', '19', '1280', '2909', '1'), +('7', '60', '19', '1206', '2074', '1'), +('7', '60', '19', '4318', '1847', '1'), +('7', '60', '13', '27715', '51468', '1'), +('7', '60', '13', '7836', '49218', '1'), +('7', '60', '13', '6502', '35573', '1'), +('7', '60', '13', '5748', '31833', '1'), +('7', '60', '14', '27715', '51468', '1'), +('7', '60', '14', '7836', '49218', '1'), +('7', '60', '14', '6502', '35573', '1'), +('7', '60', '14', '5748', '31833', '1'), +('7', '60', '11', '62242', '4900', '1'), +('7', '60', '11', '46178', '3983', '1'), +('7', '60', '11', '79631', '3702', '1'), +('7', '60', '11', '5803', '1797', '1'), +('7', '61', '22', '61948', '0', '3'), +('7', '61', '22', '66397', '0', '3'), +('7', '61', '22', '21805', '0', '3'), +('7', '61', '22', '21807', '0', '3'), +('7', '61', '1', '28962', '13139', '3'), +('7', '61', '1', '29861', '12685', '3'), +('7', '61', '1', '63170', '12352', '3'), +('7', '61', '1', '7945', '11423', '3'), +('7', '61', '2', '31223', '18119', '3'), +('7', '61', '2', '26535', '13800', '3'), +('7', '61', '2', '2612', '12731', '3'), +('7', '61', '2', '26025', '12731', '3'), +('7', '61', '3', '31233', '12328', '3'), +('7', '61', '3', '26560', '11236', '3'), +('7', '61', '3', '26582', '10779', '3'), +('7', '61', '3', '31464', '10273', '3'), +('7', '61', '5', '8364', '19467', '3'), +('7', '61', '5', '27266', '13707', '3'), +('7', '61', '5', '26584', '13365', '3'), +('7', '61', '5', '31234', '12355', '3'), +('7', '61', '8', '31471', '19190', '3'), +('7', '61', '8', '26766', '13878', '3'), +('7', '61', '8', '11621', '12679', '3'), +('7', '61', '8', '28918', '12442', '3'), +('7', '61', '6', '28902', '14135', '3'), +('7', '61', '6', '31472', '13150', '3'), +('7', '61', '6', '30551', '11896', '3'), +('7', '61', '6', '5723', '11601', '3'), +('7', '61', '17', '59949', '16564', '3'), +('7', '61', '17', '29456', '16564', '3'), +('7', '61', '17', '1137', '12399', '3'), +('7', '61', '17', '10845', '11795', '3'), +('7', '61', '7', '26584', '13365', '3'), +('7', '61', '7', '8288', '12596', '3'), +('7', '61', '7', '5723', '11601', '3'), +('7', '61', '7', '30528', '9277', '3'), +('7', '61', '9', '31461', '20094', '3'), +('7', '61', '9', '26584', '13365', '3'), +('7', '61', '9', '5723', '11601', '3'), +('7', '61', '9', '31460', '11357', '3'), +('7', '61', '15', '26749', '16112', '3'), +('7', '61', '15', '31231', '12575', '3'), +('7', '61', '15', '26757', '12441', '3'), +('7', '61', '15', '63170', '12352', '3'), +('7', '61', '20', '31235', '18387', '3'), +('7', '61', '20', '31334', '16220', '3'), +('7', '61', '20', '26551', '15796', '3'), +('7', '61', '20', '26556', '13394', '3'), +('7', '61', '12', '25857', '17882', '3'), +('7', '61', '12', '1683', '11598', '3'), +('7', '61', '12', '28967', '10442', '3'), +('7', '61', '12', '28949', '9640', '3'), +('7', '61', '18', '26772', '14825', '3'), +('7', '61', '18', '8289', '10330', '3'), +('7', '61', '18', '25212', '10203', '3'), +('7', '61', '18', '28965', '10101', '3'), +('7', '61', '19', '30569', '17655', '3'), +('7', '61', '19', '24616', '11338', '3'), +('7', '61', '19', '28888', '10808', '3'), +('7', '61', '19', '28934', '9237', '3'), +('7', '61', '13', '27315', '83763', '3'), +('7', '61', '13', '26809', '81209', '3'), +('7', '61', '13', '26849', '80937', '3'), +('7', '61', '13', '26861', '77141', '3'), +('7', '61', '14', '27315', '83763', '3'), +('7', '61', '14', '26809', '81209', '3'), +('7', '61', '14', '26849', '80937', '3'), +('7', '61', '14', '26861', '77141', '3'), +('7', '61', '11', '26563', '16416', '3'), +('7', '61', '11', '30565', '11305', '3'), +('7', '61', '11', '26562', '11119', '3'), +('7', '61', '11', '28948', '10698', '3'), +('7', '62', '22', '61948', '0', '3'), +('7', '62', '22', '66397', '0', '3'), +('7', '62', '22', '21805', '0', '3'), +('7', '62', '22', '21807', '0', '3'), +('7', '62', '1', '28962', '13140', '3'), +('7', '62', '1', '29861', '12687', '3'), +('7', '62', '1', '63170', '12353', '3'), +('7', '62', '1', '7945', '11424', '3'), +('7', '62', '2', '31223', '18120', '3'), +('7', '62', '2', '26535', '13800', '3'), +('7', '62', '2', '2612', '12732', '3'), +('7', '62', '2', '26025', '12732', '3'), +('7', '62', '3', '31233', '12329', '3'), +('7', '62', '3', '26560', '11237', '3'), +('7', '62', '3', '26582', '10779', '3'), +('7', '62', '3', '31464', '10273', '3'), +('7', '62', '5', '8364', '19468', '3'), +('7', '62', '5', '27266', '13708', '3'), +('7', '62', '5', '26584', '13366', '3'), +('7', '62', '5', '31234', '12355', '3'), +('7', '62', '8', '31471', '19191', '3'), +('7', '62', '8', '26766', '13879', '3'), +('7', '62', '8', '11621', '12679', '3'), +('7', '62', '8', '28918', '12442', '3'), +('7', '62', '6', '28902', '14136', '3'), +('7', '62', '6', '31472', '13151', '3'), +('7', '62', '6', '30551', '11896', '3'), +('7', '62', '6', '5723', '11601', '3'), +('7', '62', '17', '59949', '16564', '3'), +('7', '62', '17', '29456', '16564', '3'), +('7', '62', '17', '1137', '12400', '3'), +('7', '62', '17', '10845', '11795', '3'), +('7', '62', '7', '26584', '13366', '3'), +('7', '62', '7', '8288', '12596', '3'), +('7', '62', '7', '5723', '11601', '3'), +('7', '62', '7', '30528', '9277', '3'), +('7', '62', '9', '31461', '20095', '3'), +('7', '62', '9', '26584', '13366', '3'), +('7', '62', '9', '5723', '11601', '3'), +('7', '62', '9', '31460', '11358', '3'), +('7', '62', '15', '26749', '16113', '3'), +('7', '62', '15', '31231', '12575', '3'), +('7', '62', '15', '26757', '12441', '3'), +('7', '62', '15', '63170', '12353', '3'), +('7', '62', '20', '31235', '18388', '3'), +('7', '62', '20', '31334', '16220', '3'), +('7', '62', '20', '26551', '15798', '3'), +('7', '62', '20', '26556', '13395', '3'), +('7', '62', '12', '25857', '17882', '3'), +('7', '62', '12', '1683', '11599', '3'), +('7', '62', '12', '28967', '10442', '3'), +('7', '62', '12', '28949', '9641', '3'), +('7', '62', '18', '26772', '14826', '3'), +('7', '62', '18', '8289', '10330', '3'), +('7', '62', '18', '25212', '10204', '3'), +('7', '62', '18', '28965', '10102', '3'), +('7', '62', '19', '30569', '17656', '3'), +('7', '62', '19', '24616', '11338', '3'), +('7', '62', '19', '28888', '10808', '3'), +('7', '62', '19', '28934', '9237', '3'), +('7', '62', '13', '27315', '84051', '3'), +('7', '62', '13', '26809', '81497', '3'), +('7', '62', '13', '26849', '81225', '3'), +('7', '62', '13', '26861', '77428', '3'), +('7', '62', '14', '27315', '84051', '3'), +('7', '62', '14', '26809', '81497', '3'), +('7', '62', '14', '26849', '81225', '3'), +('7', '62', '14', '26861', '77428', '3'), +('7', '62', '11', '26563', '16417', '3'), +('7', '62', '11', '30565', '11306', '3'), +('7', '62', '11', '26562', '11120', '3'), +('7', '62', '11', '28948', '10698', '3'), +('7', '63', '22', '61948', '0', '3'), +('7', '63', '22', '66397', '0', '3'), +('7', '63', '22', '21805', '0', '3'), +('7', '63', '22', '21807', '0', '3'), +('7', '63', '1', '28962', '13141', '3'), +('7', '63', '1', '29861', '12689', '3'), +('7', '63', '1', '63170', '12354', '3'), +('7', '63', '1', '7945', '11424', '3'), +('7', '63', '2', '31223', '18121', '3'), +('7', '63', '2', '26535', '13800', '3'), +('7', '63', '2', '2612', '12732', '3'), +('7', '63', '2', '26025', '12732', '3'), +('7', '63', '3', '31233', '12330', '3'), +('7', '63', '3', '26560', '11239', '3'), +('7', '63', '3', '26582', '10779', '3'), +('7', '63', '3', '31464', '10274', '3'), +('7', '63', '5', '8364', '19469', '3'), +('7', '63', '5', '27266', '13708', '3'), +('7', '63', '5', '26584', '13368', '3'), +('7', '63', '5', '31234', '12355', '3'), +('7', '63', '8', '31471', '19192', '3'), +('7', '63', '8', '26766', '13880', '3'), +('7', '63', '8', '11621', '12679', '3'), +('7', '63', '8', '28918', '12442', '3'), +('7', '63', '6', '28902', '14137', '3'), +('7', '63', '6', '31472', '13152', '3'), +('7', '63', '6', '30551', '11897', '3'), +('7', '63', '6', '5723', '11602', '3'), +('7', '63', '17', '59949', '16564', '3'), +('7', '63', '17', '29456', '16564', '3'), +('7', '63', '17', '1137', '12402', '3'), +('7', '63', '17', '10845', '11795', '3'), +('7', '63', '7', '26584', '13368', '3'), +('7', '63', '7', '8288', '12596', '3'), +('7', '63', '7', '5723', '11602', '3'), +('7', '63', '7', '30528', '9277', '3'), +('7', '63', '9', '31461', '20096', '3'), +('7', '63', '9', '26584', '13368', '3'), +('7', '63', '9', '5723', '11602', '3'), +('7', '63', '9', '31460', '11360', '3'), +('7', '63', '15', '26749', '16115', '3'), +('7', '63', '15', '31231', '12575', '3'), +('7', '63', '15', '26757', '12441', '3'), +('7', '63', '15', '63170', '12354', '3'), +('7', '63', '20', '31235', '18390', '3'), +('7', '63', '20', '31334', '16220', '3'), +('7', '63', '20', '26551', '15799', '3'), +('7', '63', '20', '26556', '13396', '3'), +('7', '63', '12', '25857', '17882', '3'), +('7', '63', '12', '1683', '11600', '3'), +('7', '63', '12', '28967', '10442', '3'), +('7', '63', '12', '28949', '9642', '3'), +('7', '63', '18', '26772', '14826', '3'), +('7', '63', '18', '8289', '10330', '3'), +('7', '63', '18', '25212', '10205', '3'), +('7', '63', '18', '28965', '10102', '3'), +('7', '63', '19', '30569', '17657', '3'), +('7', '63', '19', '24616', '11338', '3'), +('7', '63', '19', '28888', '10809', '3'), +('7', '63', '19', '28934', '9237', '3'), +('7', '63', '13', '27315', '84338', '3'), +('7', '63', '13', '26809', '81742', '3'), +('7', '63', '13', '26849', '81513', '3'), +('7', '63', '13', '26861', '77673', '3'), +('7', '63', '14', '27315', '84338', '3'), +('7', '63', '14', '26809', '81742', '3'), +('7', '63', '14', '26849', '81513', '3'), +('7', '63', '14', '26861', '77673', '3'), +('7', '63', '11', '26563', '16418', '3'), +('7', '63', '11', '30565', '11307', '3'), +('7', '63', '11', '26562', '11121', '3'), +('7', '63', '11', '28948', '10698', '3'), +('7', '64', '22', '61948', '0', '3'), +('7', '64', '22', '66397', '0', '3'), +('7', '64', '22', '21805', '0', '3'), +('7', '64', '22', '21807', '0', '3'), +('7', '64', '1', '28962', '13141', '3'), +('7', '64', '1', '29861', '12691', '3'), +('7', '64', '1', '63170', '12354', '3'), +('7', '64', '1', '7945', '11424', '3'), +('7', '64', '2', '31223', '18122', '3'), +('7', '64', '2', '26535', '13800', '3'), +('7', '64', '2', '2612', '12733', '3'), +('7', '64', '2', '26025', '12733', '3'), +('7', '64', '3', '31233', '12330', '3'), +('7', '64', '3', '26560', '11241', '3'), +('7', '64', '3', '26582', '10779', '3'), +('7', '64', '3', '31464', '10275', '3'), +('7', '64', '5', '8364', '19471', '3'), +('7', '64', '5', '27266', '13709', '3'), +('7', '64', '5', '26584', '13369', '3'), +('7', '64', '5', '31234', '12355', '3'), +('7', '64', '8', '31471', '19193', '3'), +('7', '64', '8', '26766', '13880', '3'), +('7', '64', '8', '11621', '12679', '3'), +('7', '64', '8', '28918', '12442', '3'), +('7', '64', '6', '28902', '14138', '3'), +('7', '64', '6', '31472', '13153', '3'), +('7', '64', '6', '30551', '11898', '3'), +('7', '64', '6', '5723', '11602', '3'), +('7', '64', '17', '59949', '16564', '3'), +('7', '64', '17', '29456', '16564', '3'), +('7', '64', '17', '1137', '12404', '3'), +('7', '64', '17', '10845', '11795', '3'), +('7', '64', '7', '26584', '13369', '3'), +('7', '64', '7', '8288', '12596', '3'), +('7', '64', '7', '5723', '11602', '3'), +('7', '64', '7', '30528', '9277', '3'), +('7', '64', '9', '31461', '20096', '3'), +('7', '64', '9', '26584', '13369', '3'), +('7', '64', '9', '5723', '11602', '3'), +('7', '64', '9', '31460', '11361', '3'), +('7', '64', '15', '26749', '16116', '3'), +('7', '64', '15', '31231', '12575', '3'), +('7', '64', '15', '26757', '12442', '3'), +('7', '64', '15', '63170', '12354', '3'), +('7', '64', '20', '31235', '18392', '3'), +('7', '64', '20', '31334', '16220', '3'), +('7', '64', '20', '26551', '15801', '3'), +('7', '64', '20', '26556', '13397', '3'), +('7', '64', '12', '25857', '17882', '3'), +('7', '64', '12', '1683', '11600', '3'), +('7', '64', '12', '28967', '10442', '3'), +('7', '64', '12', '28949', '9642', '3'), +('7', '64', '18', '26772', '14827', '3'), +('7', '64', '18', '8289', '10330', '3'), +('7', '64', '18', '25212', '10205', '3'), +('7', '64', '18', '28965', '10103', '3'), +('7', '64', '19', '30569', '17657', '3'), +('7', '64', '19', '24616', '11338', '3'), +('7', '64', '19', '28888', '10809', '3'), +('7', '64', '19', '28934', '9237', '3'), +('7', '64', '13', '27315', '84626', '3'), +('7', '64', '13', '26809', '82030', '3'), +('7', '64', '13', '26849', '81758', '3'), +('7', '64', '13', '26861', '77960', '3'), +('7', '64', '14', '27315', '84626', '3'), +('7', '64', '14', '26809', '82030', '3'), +('7', '64', '14', '26849', '81758', '3'), +('7', '64', '14', '26861', '77960', '3'), +('7', '64', '11', '26563', '16419', '3'), +('7', '64', '11', '30565', '11308', '3'), +('7', '64', '11', '26562', '11122', '3'), +('7', '64', '11', '28948', '10698', '3'), +('7', '65', '22', '66397', '0', '7'), +('7', '65', '22', '62787', '0', '7'), +('7', '65', '22', '61948', '0', '7'), +('7', '65', '22', '21805', '0', '7'), +('7', '65', '1', '68949', '39785', '7'), +('7', '65', '1', '69166', '37898', '7'), +('7', '65', '1', '7125', '31560', '7'), +('7', '65', '1', '68958', '29803', '7'), +('7', '65', '2', '67728', '25697', '7'), +('7', '65', '2', '28648', '20716', '7'), +('7', '65', '2', '31223', '18122', '7'), +('7', '65', '2', '28653', '18041', '7'), +('7', '65', '3', '69157', '30500', '7'), +('7', '65', '3', '68953', '28673', '7'), +('7', '65', '3', '68752', '24299', '7'), +('7', '65', '3', '69069', '23457', '7'), +('7', '65', '5', '67625', '32648', '7'), +('7', '65', '5', '68808', '30534', '7'), +('7', '65', '5', '7769', '29187', '7'), +('7', '65', '5', '68840', '27666', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '65', '8', '69165', '40595', '7'), +('7', '65', '8', '68844', '31071', '7'), +('7', '65', '8', '69064', '28773', '7'), +('7', '65', '8', '68787', '24902', '7'), +('7', '65', '6', '68955', '28399', '7'), +('7', '65', '6', '13674', '26844', '7'), +('7', '65', '6', '68757', '25280', '7'), +('7', '65', '6', '68789', '18731', '7'), +('7', '65', '17', '68978', '30260', '7'), +('7', '65', '17', '47650', '26105', '7'), +('7', '65', '17', '69152', '21002', '7'), +('7', '65', '17', '69403', '20607', '7'), +('7', '65', '7', '68896', '28298', '7'), +('7', '65', '7', '69175', '28210', '7'), +('7', '65', '7', '16097', '25634', '7'), +('7', '65', '7', '11435', '20893', '7'), +('7', '65', '9', '68899', '26884', '7'), +('7', '65', '9', '32110', '26064', '7'), +('7', '65', '9', '16097', '25634', '7'), +('7', '65', '9', '69128', '23706', '7'), +('7', '65', '15', '69160', '33587', '7'), +('7', '65', '15', '68948', '29473', '7'), +('7', '65', '15', '68842', '28195', '7'), +('7', '65', '15', '68784', '27219', '7'), +('7', '65', '20', '16156', '32852', '7'), +('7', '65', '20', '67625', '32648', '7'), +('7', '65', '20', '68951', '30656', '7'), +('7', '65', '20', '69134', '27953', '7'), +('7', '65', '12', '69254', '33123', '7'), +('7', '65', '12', '68643', '27089', '7'), +('7', '65', '12', '68897', '26058', '7'), +('7', '65', '12', '27000', '23191', '7'), +('7', '65', '18', '68979', '32289', '7'), +('7', '65', '18', '16727', '23514', '7'), +('7', '65', '18', '69148', '21017', '7'), +('7', '65', '18', '28652', '17680', '7'), +('7', '65', '19', '69179', '31435', '7'), +('7', '65', '19', '68898', '29282', '7'), +('7', '65', '19', '19446', '19375', '7'), +('7', '65', '19', '68711', '18778', '7'), +('7', '65', '13', '68740', '120110', '7'), +('7', '65', '13', '68837', '117028', '7'), +('7', '65', '13', '69120', '111218', '7'), +('7', '65', '13', '26740', '100232', '7'), +('7', '65', '14', '68740', '120110', '7'), +('7', '65', '14', '68837', '117028', '7'), +('7', '65', '14', '69120', '111218', '7'), +('7', '65', '14', '26740', '100232', '7'), +('7', '65', '11', '67606', '33465', '7'), +('7', '65', '11', '69158', '33261', '7'), +('7', '65', '11', '68952', '29504', '7'), +('7', '65', '11', '68848', '28259', '7'), +('7', '65', '22', '66397', '0', '6'), +('7', '65', '22', '62787', '0', '6'), +('7', '65', '22', '61948', '0', '6'), +('7', '65', '22', '21805', '0', '6'), +('7', '65', '1', '7125', '31560', '6'), +('7', '65', '1', '32106', '27404', '6'), +('7', '65', '1', '7123', '24878', '6'), +('7', '65', '1', '4119', '22672', '6'), +('7', '65', '2', '28648', '20716', '6'), +('7', '65', '2', '31223', '18122', '6'), +('7', '65', '2', '28653', '18041', '6'), +('7', '65', '2', '9809', '17457', '6'), +('7', '65', '3', '29174', '22781', '6'), +('7', '65', '3', '9435', '19118', '6'), +('7', '65', '3', '9480', '18044', '6'), +('7', '65', '3', '9481', '16208', '6'), +('7', '65', '5', '7769', '29187', '6'), +('7', '65', '5', '8977', '26322', '6'), +('7', '65', '5', '28654', '22580', '6'), +('7', '65', '5', '7767', '19475', '6'), +('7', '65', '8', '15805', '24664', '6'), +('7', '65', '8', '31471', '19194', '6'), +('7', '65', '8', '15803', '18816', '6'), +('7', '65', '8', '13672', '18107', '6'), +('7', '65', '6', '13674', '26844', '6'), +('7', '65', '6', '13672', '18107', '6'), +('7', '65', '6', '13767', '17785', '6'), +('7', '65', '6', '28658', '16200', '6'), +('7', '65', '17', '47650', '26105', '6'), +('7', '65', '17', '69403', '20607', '6'), +('7', '65', '17', '29456', '16564', '6'), +('7', '65', '17', '59949', '16564', '6'), +('7', '65', '7', '16097', '25634', '6'), +('7', '65', '7', '11435', '20893', '6'), +('7', '65', '7', '21994', '19712', '6'), +('7', '65', '7', '26584', '13370', '6'), +('7', '65', '9', '32110', '26064', '6'), +('7', '65', '9', '16097', '25634', '6'), +('7', '65', '9', '11054', '20926', '6'), +('7', '65', '9', '68198', '20910', '6'), +('7', '65', '15', '26989', '25989', '6'), +('7', '65', '15', '9959', '23797', '6'), +('7', '65', '15', '26991', '22688', '6'), +('7', '65', '15', '26990', '22305', '6'), +('7', '65', '20', '16156', '32852', '6'), +('7', '65', '20', '16097', '25634', '6'), +('7', '65', '20', '28663', '24302', '6'), +('7', '65', '20', '15873', '23265', '6'), +('7', '65', '12', '27000', '23191', '6'), +('7', '65', '12', '12624', '20573', '6'), +('7', '65', '12', '68083', '19657', '6'), +('7', '65', '12', '25857', '17882', '6'), +('7', '65', '18', '16727', '23514', '6'), +('7', '65', '18', '28652', '17680', '6'), +('7', '65', '18', '26772', '14827', '6'), +('7', '65', '18', '8289', '10330', '6'), +('7', '65', '19', '19446', '19375', '6'), +('7', '65', '19', '30569', '17658', '6'), +('7', '65', '19', '19082', '16975', '6'), +('7', '65', '19', '19094', '16255', '6'), +('7', '65', '13', '26740', '100232', '6'), +('7', '65', '13', '27315', '85711', '6'), +('7', '65', '13', '32108', '85229', '6'), +('7', '65', '13', '22894', '84968', '6'), +('7', '65', '14', '26740', '100232', '6'), +('7', '65', '14', '27315', '85711', '6'), +('7', '65', '14', '32108', '85229', '6'), +('7', '65', '14', '22894', '84968', '6'), +('7', '65', '11', '20496', '25545', '6'), +('7', '65', '11', '14733', '24990', '6'), +('7', '65', '11', '26987', '24475', '6'), +('7', '65', '11', '20625', '21122', '6'), +('7', '65', '22', '62787', '0', '5'), +('7', '65', '22', '21810', '0', '5'), +('7', '65', '22', '66397', '0', '5'), +('7', '65', '22', '61948', '0', '5'), +('7', '65', '1', '7125', '31560', '5'), +('7', '65', '1', '32106', '27404', '5'), +('7', '65', '1', '7123', '24878', '5'), +('7', '65', '1', '4119', '22672', '5'), +('7', '65', '2', '28648', '20716', '5'), +('7', '65', '2', '31223', '18122', '5'), +('7', '65', '2', '28653', '18041', '5'), +('7', '65', '2', '9809', '17457', '5'), +('7', '65', '3', '29174', '22781', '5'), +('7', '65', '3', '9435', '19118', '5'), +('7', '65', '3', '9480', '18044', '5'), +('7', '65', '3', '9481', '16208', '5'), +('7', '65', '5', '7769', '29187', '5'), +('7', '65', '5', '8977', '26322', '5'), +('7', '65', '5', '28654', '22580', '5'), +('7', '65', '5', '7767', '19475', '5'), +('7', '65', '8', '15805', '24664', '5'), +('7', '65', '8', '31471', '19194', '5'), +('7', '65', '8', '15803', '18816', '5'), +('7', '65', '8', '13672', '18107', '5'), +('7', '65', '6', '13674', '26844', '5'), +('7', '65', '6', '13672', '18107', '5'), +('7', '65', '6', '13767', '17785', '5'), +('7', '65', '6', '28658', '16200', '5'), +('7', '65', '17', '47650', '26105', '5'), +('7', '65', '17', '29456', '16564', '5'), +('7', '65', '17', '59949', '16564', '5'), +('7', '65', '17', '1137', '12405', '5'), +('7', '65', '7', '16097', '25634', '5'), +('7', '65', '7', '11435', '20893', '5'), +('7', '65', '7', '21994', '19712', '5'), +('7', '65', '7', '26584', '13370', '5'), +('7', '65', '9', '32110', '26064', '5'), +('7', '65', '9', '16097', '25634', '5'), +('7', '65', '9', '11054', '20926', '5'), +('7', '65', '9', '68198', '20910', '5'), +('7', '65', '15', '26989', '25989', '5'), +('7', '65', '15', '9959', '23797', '5'), +('7', '65', '15', '26991', '22688', '5'), +('7', '65', '15', '26990', '22305', '5'), +('7', '65', '20', '16156', '32852', '5'), +('7', '65', '20', '16097', '25634', '5'), +('7', '65', '20', '28663', '24302', '5'), +('7', '65', '20', '15873', '23265', '5'), +('7', '65', '12', '27000', '23191', '5'), +('7', '65', '12', '12624', '20573', '5'), +('7', '65', '12', '25857', '17882', '5'), +('7', '65', '12', '11879', '15307', '5'), +('7', '65', '18', '16727', '23514', '5'), +('7', '65', '18', '28652', '17680', '5'), +('7', '65', '18', '26772', '14827', '5'), +('7', '65', '18', '8289', '10330', '5'), +('7', '65', '19', '19446', '19375', '5'), +('7', '65', '19', '30569', '17658', '5'), +('7', '65', '19', '19082', '16975', '5'), +('7', '65', '19', '19094', '16255', '5'), +('7', '65', '13', '26740', '100232', '5'), +('7', '65', '13', '27315', '85711', '5'), +('7', '65', '13', '32108', '85229', '5'), +('7', '65', '13', '22894', '84968', '5'), +('7', '65', '14', '26740', '100232', '5'), +('7', '65', '14', '27315', '85711', '5'), +('7', '65', '14', '32108', '85229', '5'), +('7', '65', '14', '22894', '84968', '5'), +('7', '65', '11', '20496', '25545', '5'), +('7', '65', '11', '14733', '24990', '5'), +('7', '65', '11', '26987', '24475', '5'), +('7', '65', '11', '20625', '21122', '5'), +('7', '65', '22', '62787', '0', '4'), +('7', '65', '22', '21810', '0', '4'), +('7', '65', '22', '66397', '0', '4'), +('7', '65', '22', '61948', '0', '4'), +('7', '65', '1', '7125', '31560', '4'), +('7', '65', '1', '32106', '27404', '4'), +('7', '65', '1', '7123', '24878', '4'), +('7', '65', '1', '4119', '22672', '4'), +('7', '65', '2', '28648', '20716', '4'), +('7', '65', '2', '31223', '18122', '4'), +('7', '65', '2', '28653', '18041', '4'), +('7', '65', '2', '9809', '17457', '4'), +('7', '65', '3', '29174', '22781', '4'), +('7', '65', '3', '9435', '19118', '4'), +('7', '65', '3', '9480', '18044', '4'), +('7', '65', '3', '9481', '16208', '4'), +('7', '65', '5', '7769', '29187', '4'), +('7', '65', '5', '8977', '26322', '4'), +('7', '65', '5', '28654', '22580', '4'), +('7', '65', '5', '7767', '19475', '4'), +('7', '65', '8', '15805', '24664', '4'), +('7', '65', '8', '31471', '19194', '4'), +('7', '65', '8', '15803', '18816', '4'), +('7', '65', '8', '13672', '18107', '4'), +('7', '65', '6', '13674', '26844', '4'), +('7', '65', '6', '13672', '18107', '4'), +('7', '65', '6', '13767', '17785', '4'), +('7', '65', '6', '28658', '16200', '4'), +('7', '65', '17', '47650', '26105', '4'), +('7', '65', '17', '59949', '16564', '4'), +('7', '65', '17', '29456', '16564', '4'), +('7', '65', '17', '1137', '12405', '4'), +('7', '65', '7', '16097', '25634', '4'), +('7', '65', '7', '11435', '20893', '4'), +('7', '65', '7', '21994', '19712', '4'), +('7', '65', '7', '26584', '13370', '4'), +('7', '65', '9', '32110', '26064', '4'), +('7', '65', '9', '16097', '25634', '4'), +('7', '65', '9', '11054', '20926', '4'), +('7', '65', '9', '68198', '20910', '4'), +('7', '65', '15', '26989', '25989', '4'), +('7', '65', '15', '9959', '23797', '4'), +('7', '65', '15', '26991', '22688', '4'), +('7', '65', '15', '26990', '22305', '4'), +('7', '65', '20', '16156', '32852', '4'), +('7', '65', '20', '16097', '25634', '4'), +('7', '65', '20', '28663', '24302', '4'), +('7', '65', '20', '15873', '23265', '4'), +('7', '65', '12', '27000', '23191', '4'), +('7', '65', '12', '12624', '20573', '4'), +('7', '65', '12', '25857', '17882', '4'), +('7', '65', '12', '11879', '15307', '4'), +('7', '65', '18', '16727', '23514', '4'), +('7', '65', '18', '28652', '17680', '4'), +('7', '65', '18', '26772', '14827', '4'), +('7', '65', '18', '8289', '10330', '4'), +('7', '65', '19', '19446', '19375', '4'), +('7', '65', '19', '30569', '17658', '4'), +('7', '65', '19', '19082', '16975', '4'), +('7', '65', '19', '19094', '16255', '4'), +('7', '65', '13', '26740', '100232', '4'), +('7', '65', '13', '27315', '85711', '4'), +('7', '65', '13', '32108', '85229', '4'), +('7', '65', '13', '22894', '84968', '4'), +('7', '65', '14', '26740', '100232', '4'), +('7', '65', '14', '27315', '85711', '4'), +('7', '65', '14', '32108', '85229', '4'), +('7', '65', '14', '22894', '84968', '4'), +('7', '65', '11', '20496', '25545', '4'), +('7', '65', '11', '14733', '24990', '4'), +('7', '65', '11', '26987', '24475', '4'), +('7', '65', '11', '20625', '21122', '4'), +('7', '66', '22', '66397', '0', '7'), +('7', '66', '22', '62787', '0', '7'), +('7', '66', '22', '61948', '0', '7'), +('7', '66', '22', '21805', '0', '7'), +('7', '66', '1', '68949', '39787', '7'), +('7', '66', '1', '69166', '37900', '7'), +('7', '66', '1', '7125', '31560', '7'), +('7', '66', '1', '68958', '29804', '7'), +('7', '66', '2', '67728', '25699', '7'), +('7', '66', '2', '28648', '20716', '7'), +('7', '66', '2', '31223', '18123', '7'), +('7', '66', '2', '28653', '18042', '7'), +('7', '66', '3', '69157', '30501', '7'), +('7', '66', '3', '68953', '28675', '7'), +('7', '66', '3', '68752', '24300', '7'), +('7', '66', '3', '69069', '23459', '7'), +('7', '66', '5', '67625', '32649', '7'), +('7', '66', '5', '68808', '30535', '7'), +('7', '66', '5', '7769', '29187', '7'), +('7', '66', '5', '68840', '27668', '7'), +('7', '66', '8', '69165', '40596', '7'), +('7', '66', '8', '68844', '31073', '7'), +('7', '66', '8', '69064', '28774', '7'), +('7', '66', '8', '68787', '24902', '7'), +('7', '66', '6', '68955', '28400', '7'), +('7', '66', '6', '13674', '26845', '7'), +('7', '66', '6', '68757', '25282', '7'), +('7', '66', '6', '68789', '18732', '7'), +('7', '66', '17', '68978', '30262', '7'), +('7', '66', '17', '47650', '26107', '7'), +('7', '66', '17', '69152', '21003', '7'), +('7', '66', '17', '69403', '20609', '7'), +('7', '66', '7', '68896', '28300', '7'), +('7', '66', '7', '69175', '28212', '7'), +('7', '66', '7', '16097', '25636', '7'), +('7', '66', '7', '11435', '20894', '7'), +('7', '66', '9', '68899', '26885', '7'), +('7', '66', '9', '32110', '26066', '7'), +('7', '66', '9', '16097', '25636', '7'), +('7', '66', '9', '69128', '23707', '7'), +('7', '66', '15', '69160', '33588', '7'), +('7', '66', '15', '68948', '29474', '7'), +('7', '66', '15', '68842', '28197', '7'), +('7', '66', '15', '68784', '27220', '7'), +('7', '66', '20', '16156', '32853', '7'), +('7', '66', '20', '67625', '32649', '7'), +('7', '66', '20', '68951', '30658', '7'), +('7', '66', '20', '69134', '27955', '7'), +('7', '66', '12', '69254', '33125', '7'), +('7', '66', '12', '68643', '27090', '7'), +('7', '66', '12', '68897', '26060', '7'), +('7', '66', '12', '27000', '23191', '7'), +('7', '66', '18', '68979', '32290', '7'), +('7', '66', '18', '16727', '23515', '7'), +('7', '66', '18', '69148', '21018', '7'), +('7', '66', '18', '28652', '17680', '7'), +('7', '66', '19', '69179', '31437', '7'), +('7', '66', '19', '68898', '29283', '7'), +('7', '66', '19', '19446', '19376', '7'), +('7', '66', '19', '68711', '18779', '7'), +('7', '66', '13', '68740', '120462', '7'), +('7', '66', '13', '68837', '117200', '7'), +('7', '66', '13', '69120', '111473', '7'), +('7', '66', '13', '26740', '100402', '7'), +('7', '66', '14', '68740', '120462', '7'), +('7', '66', '14', '68837', '117200', '7'), +('7', '66', '14', '69120', '111473', '7'), +('7', '66', '14', '26740', '100402', '7'), +('7', '66', '11', '67606', '33467', '7'), +('7', '66', '11', '69158', '33262', '7'), +('7', '66', '11', '68952', '29505', '7'), +('7', '66', '11', '68848', '28260', '7'), +('7', '67', '22', '66397', '0', '7'), +('7', '67', '22', '62787', '0', '7'), +('7', '67', '22', '61948', '0', '7'), +('7', '67', '22', '21805', '0', '7'), +('7', '67', '1', '68949', '39789', '7'), +('7', '67', '1', '69166', '37901', '7'), +('7', '67', '1', '7125', '31561', '7'), +('7', '67', '1', '68958', '29805', '7'), +('7', '67', '2', '67728', '25701', '7'), +('7', '67', '2', '28648', '20716', '7'), +('7', '67', '2', '31223', '18124', '7'), +('7', '67', '2', '28653', '18043', '7'), +('7', '67', '3', '69157', '30503', '7'), +('7', '67', '3', '68953', '28676', '7'), +('7', '67', '3', '68752', '24301', '7'), +('7', '67', '3', '69069', '23461', '7'), +('7', '67', '5', '67625', '32650', '7'), +('7', '67', '5', '68808', '30536', '7'), +('7', '67', '5', '7769', '29187', '7'), +('7', '67', '5', '68840', '27670', '7'), +('7', '67', '8', '69165', '40598', '7'), +('7', '67', '8', '68844', '31075', '7'), +('7', '67', '8', '69064', '28774', '7'), +('7', '67', '8', '68787', '24902', '7'), +('7', '67', '6', '68955', '28401', '7'), +('7', '67', '6', '13674', '26847', '7'), +('7', '67', '6', '68757', '25283', '7'), +('7', '67', '6', '68789', '18733', '7'), +('7', '67', '17', '68978', '30264', '7'), +('7', '67', '17', '47650', '26109', '7'), +('7', '67', '17', '69152', '21003', '7'), +('7', '67', '17', '69403', '20610', '7'), +('7', '67', '7', '68896', '28302', '7'), +('7', '67', '7', '69175', '28213', '7'), +('7', '67', '7', '16097', '25638', '7'), +('7', '67', '7', '11435', '20895', '7'), +('7', '67', '9', '68899', '26887', '7'), +('7', '67', '9', '32110', '26067', '7'), +('7', '67', '9', '16097', '25638', '7'), +('7', '67', '9', '69128', '23708', '7'), +('7', '67', '15', '69160', '33590', '7'), +('7', '67', '15', '68948', '29476', '7'), +('7', '67', '15', '68842', '28199', '7'), +('7', '67', '15', '68784', '27221', '7'), +('7', '67', '20', '16156', '32855', '7'), +('7', '67', '20', '67625', '32650', '7'), +('7', '67', '20', '68951', '30660', '7'), +('7', '67', '20', '69134', '27956', '7'), +('7', '67', '12', '69254', '33127', '7'), +('7', '67', '12', '68643', '27091', '7'), +('7', '67', '12', '68897', '26062', '7'), +('7', '67', '12', '27000', '23191', '7'), +('7', '67', '18', '68979', '32292', '7'), +('7', '67', '18', '16727', '23517', '7'), +('7', '67', '18', '69148', '21019', '7'), +('7', '67', '18', '28652', '17681', '7'), +('7', '67', '19', '69179', '31438', '7'), +('7', '67', '19', '68898', '29284', '7'), +('7', '67', '19', '19446', '19377', '7'), +('7', '67', '19', '68711', '18780', '7'), +('7', '67', '13', '68740', '120814', '7'), +('7', '67', '13', '68837', '117372', '7'), +('7', '67', '13', '69120', '111761', '7'), +('7', '67', '13', '26740', '100572', '7'), +('7', '67', '14', '68740', '120814', '7'), +('7', '67', '14', '68837', '117372', '7'), +('7', '67', '14', '69120', '111761', '7'), +('7', '67', '14', '26740', '100572', '7'), +('7', '67', '11', '67606', '33468', '7'), +('7', '67', '11', '69158', '33264', '7'), +('7', '67', '11', '68952', '29506', '7'), +('7', '67', '11', '68848', '28262', '7'), +('7', '68', '22', '66397', '0', '7'), +('7', '68', '22', '62787', '0', '7'), +('7', '68', '22', '61948', '0', '7'), +('7', '68', '22', '21805', '0', '7'), +('7', '68', '1', '68949', '39791', '7'), +('7', '68', '1', '69166', '37903', '7'), +('7', '68', '1', '7125', '31562', '7'), +('7', '68', '1', '68958', '29807', '7'), +('7', '68', '2', '67728', '25703', '7'), +('7', '68', '2', '28648', '20716', '7'), +('7', '68', '2', '31223', '18125', '7'), +('7', '68', '2', '28653', '18044', '7'), +('7', '68', '3', '69157', '30504', '7'), +('7', '68', '3', '68953', '28678', '7'), +('7', '68', '3', '68752', '24303', '7'), +('7', '68', '3', '69069', '23463', '7'), +('7', '68', '5', '67625', '32651', '7'), +('7', '68', '5', '68808', '30538', '7'), +('7', '68', '5', '7769', '29187', '7'), +('7', '68', '5', '68840', '27672', '7'), +('7', '68', '8', '69165', '40600', '7'), +('7', '68', '8', '68844', '31077', '7'), +('7', '68', '8', '69064', '28775', '7'), +('7', '68', '8', '68787', '24902', '7'), +('7', '68', '6', '68955', '28403', '7'), +('7', '68', '6', '13674', '26848', '7'), +('7', '68', '6', '68757', '25284', '7'), +('7', '68', '6', '68789', '18733', '7'), +('7', '68', '17', '68978', '30266', '7'), +('7', '68', '17', '47650', '26111', '7'), +('7', '68', '17', '69152', '21004', '7'), +('7', '68', '17', '69403', '20612', '7'), +('7', '68', '7', '68896', '28305', '7'), +('7', '68', '7', '69175', '28214', '7'), +('7', '68', '7', '16097', '25640', '7'), +('7', '68', '7', '11435', '20896', '7'), +('7', '68', '9', '68899', '26888', '7'), +('7', '68', '9', '32110', '26068', '7'), +('7', '68', '9', '16097', '25640', '7'), +('7', '68', '9', '69128', '23710', '7'), +('7', '68', '15', '69160', '33592', '7'), +('7', '68', '15', '68948', '29478', '7'), +('7', '68', '15', '68842', '28200', '7'), +('7', '68', '15', '68784', '27223', '7'), +('7', '68', '20', '16156', '32856', '7'), +('7', '68', '20', '67625', '32651', '7'), +('7', '68', '20', '68951', '30661', '7'), +('7', '68', '20', '69134', '27957', '7'), +('7', '68', '12', '69254', '33128', '7'), +('7', '68', '12', '68643', '27092', '7'), +('7', '68', '12', '68897', '26063', '7'), +('7', '68', '12', '27000', '23191', '7'), +('7', '68', '18', '68979', '32293', '7'), +('7', '68', '18', '16727', '23518', '7'), +('7', '68', '18', '69148', '21019', '7'), +('7', '68', '18', '28652', '17681', '7'), +('7', '68', '19', '69179', '31440', '7'), +('7', '68', '19', '68898', '29285', '7'), +('7', '68', '19', '19446', '19378', '7'), +('7', '68', '19', '68711', '18782', '7'), +('7', '68', '13', '68740', '121166', '7'), +('7', '68', '13', '68837', '117587', '7'), +('7', '68', '13', '69120', '112049', '7'), +('7', '68', '13', '26740', '100700', '7'), +('7', '68', '14', '68740', '121166', '7'), +('7', '68', '14', '68837', '117587', '7'), +('7', '68', '14', '69120', '112049', '7'), +('7', '68', '14', '26740', '100700', '7'), +('7', '68', '11', '67606', '33469', '7'), +('7', '68', '11', '69158', '33265', '7'), +('7', '68', '11', '68952', '29508', '7'), +('7', '68', '11', '68848', '28263', '7'), +('7', '69', '22', '66397', '0', '7'), +('7', '69', '22', '62787', '0', '7'), +('7', '69', '22', '61948', '0', '7'), +('7', '69', '22', '21805', '0', '7'), +('7', '69', '1', '68949', '39793', '7'), +('7', '69', '1', '69166', '37904', '7'), +('7', '69', '1', '7125', '31563', '7'), +('7', '69', '1', '68958', '29808', '7'), +('7', '69', '2', '67728', '25704', '7'), +('7', '69', '2', '28648', '20716', '7'), +('7', '69', '2', '31223', '18125', '7'), +('7', '69', '2', '28653', '18045', '7'), +('7', '69', '3', '69157', '30505', '7'), +('7', '69', '3', '68953', '28679', '7'), +('7', '69', '3', '68752', '24304', '7'), +('7', '69', '3', '69069', '23464', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '69', '5', '67625', '32652', '7'), +('7', '69', '5', '68808', '30539', '7'), +('7', '69', '5', '7769', '29187', '7'), +('7', '69', '5', '68840', '27673', '7'), +('7', '69', '8', '69165', '40602', '7'), +('7', '69', '8', '68844', '31079', '7'), +('7', '69', '8', '69064', '28776', '7'), +('7', '69', '8', '68787', '24902', '7'), +('7', '69', '6', '68955', '28404', '7'), +('7', '69', '6', '13674', '26849', '7'), +('7', '69', '6', '68757', '25285', '7'), +('7', '69', '6', '68789', '18734', '7'), +('7', '69', '17', '68978', '30268', '7'), +('7', '69', '17', '47650', '26113', '7'), +('7', '69', '17', '69152', '21005', '7'), +('7', '69', '17', '69403', '20613', '7'), +('7', '69', '7', '68896', '28306', '7'), +('7', '69', '7', '69175', '28216', '7'), +('7', '69', '7', '16097', '25641', '7'), +('7', '69', '7', '11435', '20897', '7'), +('7', '69', '9', '68899', '26889', '7'), +('7', '69', '9', '32110', '26069', '7'), +('7', '69', '9', '16097', '25641', '7'), +('7', '69', '9', '69128', '23710', '7'), +('7', '69', '15', '69160', '33593', '7'), +('7', '69', '15', '68948', '29479', '7'), +('7', '69', '15', '68842', '28202', '7'), +('7', '69', '15', '68784', '27224', '7'), +('7', '69', '20', '16156', '32857', '7'), +('7', '69', '20', '67625', '32652', '7'), +('7', '69', '20', '68951', '30663', '7'), +('7', '69', '20', '69134', '27958', '7'), +('7', '69', '12', '69254', '33129', '7'), +('7', '69', '12', '68643', '27093', '7'), +('7', '69', '12', '68897', '26065', '7'), +('7', '69', '12', '27000', '23191', '7'), +('7', '69', '18', '68979', '32294', '7'), +('7', '69', '18', '16727', '23519', '7'), +('7', '69', '18', '69148', '21020', '7'), +('7', '69', '18', '28652', '17682', '7'), +('7', '69', '19', '69179', '31441', '7'), +('7', '69', '19', '68898', '29285', '7'), +('7', '69', '19', '19446', '19379', '7'), +('7', '69', '19', '68711', '18783', '7'), +('7', '69', '13', '68740', '121518', '7'), +('7', '69', '13', '68837', '117759', '7'), +('7', '69', '13', '69120', '112304', '7'), +('7', '69', '13', '26740', '100870', '7'), +('7', '69', '14', '68740', '121518', '7'), +('7', '69', '14', '68837', '117759', '7'), +('7', '69', '14', '69120', '112304', '7'), +('7', '69', '14', '26740', '100870', '7'), +('7', '69', '11', '67606', '33471', '7'), +('7', '69', '11', '69158', '33266', '7'), +('7', '69', '11', '68952', '29509', '7'), +('7', '69', '11', '68848', '28264', '7'), +('7', '70', '22', '61948', '0', '11'), +('7', '70', '22', '66397', '0', '11'), +('7', '70', '22', '21805', '0', '11'), +('7', '70', '22', '21807', '0', '11'), +('7', '70', '1', '83594', '50522', '11'), +('7', '70', '1', '39276', '50101', '11'), +('7', '70', '1', '39363', '46003', '11'), +('7', '70', '1', '39329', '43597', '11'), +('7', '70', '2', '70895', '45103', '11'), +('7', '70', '2', '83562', '42183', '11'), +('7', '70', '2', '83542', '37613', '11'), +('7', '70', '2', '47210', '28577', '11'), +('7', '70', '3', '39218', '40090', '11'), +('7', '70', '3', '89512', '39962', '11'), +('7', '70', '3', '83658', '39263', '11'), +('7', '70', '3', '39361', '37696', '11'), +('7', '70', '5', '39349', '51944', '11'), +('7', '70', '5', '47273', '37559', '11'), +('7', '70', '5', '47275', '37547', '11'), +('7', '70', '5', '83599', '36114', '11'), +('7', '70', '8', '70977', '43909', '11'), +('7', '70', '8', '39330', '41072', '11'), +('7', '70', '8', '69165', '40603', '11'), +('7', '70', '8', '39210', '37284', '11'), +('7', '70', '6', '39367', '50323', '11'), +('7', '70', '6', '83585', '43673', '11'), +('7', '70', '6', '70717', '39221', '11'), +('7', '70', '6', '83635', '35052', '11'), +('7', '70', '17', '68978', '30270', '11'), +('7', '70', '17', '47650', '26115', '11'), +('7', '70', '17', '70900', '25096', '11'), +('7', '70', '17', '83605', '23785', '11'), +('7', '70', '7', '39357', '45044', '11'), +('7', '70', '7', '83566', '43188', '11'), +('7', '70', '7', '70896', '37810', '11'), +('7', '70', '7', '39220', '35916', '11'), +('7', '70', '9', '39346', '49310', '11'), +('7', '70', '9', '51708', '46623', '11'), +('7', '70', '9', '83654', '45949', '11'), +('7', '70', '9', '70897', '39601', '11'), +('7', '70', '15', '39373', '52606', '11'), +('7', '70', '15', '39321', '41301', '11'), +('7', '70', '15', '51703', '39933', '11'), +('7', '70', '15', '83661', '39465', '11'), +('7', '70', '20', '39339', '43584', '11'), +('7', '70', '20', '47283', '41855', '11'), +('7', '70', '20', '39322', '39950', '11'), +('7', '70', '20', '47282', '33112', '11'), +('7', '70', '12', '83570', '37978', '11'), +('7', '70', '12', '47214', '37571', '11'), +('7', '70', '12', '70898', '36577', '11'), +('7', '70', '12', '71085', '36507', '11'), +('7', '70', '18', '68979', '32295', '11'), +('7', '70', '18', '70901', '30296', '11'), +('7', '70', '18', '71098', '27895', '11'), +('7', '70', '18', '83609', '25381', '11'), +('7', '70', '19', '83574', '42414', '11'), +('7', '70', '19', '70899', '40214', '11'), +('7', '70', '19', '39279', '39644', '11'), +('7', '70', '19', '83504', '33254', '11'), +('7', '70', '13', '83580', '180782', '11'), +('7', '70', '13', '39264', '176089', '11'), +('7', '70', '13', '67742', '168585', '11'), +('7', '70', '13', '83501', '167406', '11'), +('7', '70', '14', '83580', '180782', '11'), +('7', '70', '14', '39264', '176089', '11'), +('7', '70', '14', '67742', '168585', '11'), +('7', '70', '14', '83501', '167406', '11'), +('7', '70', '11', '39311', '48133', '11'), +('7', '70', '11', '83657', '45083', '11'), +('7', '70', '11', '39371', '44573', '11'), +('7', '70', '11', '39342', '43642', '11'), +('7', '70', '22', '66397', '0', '10'), +('7', '70', '22', '62787', '0', '10'), +('7', '70', '22', '61948', '0', '10'), +('7', '70', '22', '21805', '0', '10'), +('7', '70', '1', '83594', '50522', '10'), +('7', '70', '1', '71624', '42174', '10'), +('7', '70', '1', '83630', '42058', '10'), +('7', '70', '1', '47287', '41584', '10'), +('7', '70', '2', '70895', '45103', '10'), +('7', '70', '2', '83562', '42183', '10'), +('7', '70', '2', '83542', '37613', '10'), +('7', '70', '2', '47210', '28577', '10'), +('7', '70', '3', '89512', '39962', '10'), +('7', '70', '3', '83658', '39263', '10'), +('7', '70', '3', '83636', '37472', '10'), +('7', '70', '3', '56017', '36199', '10'), +('7', '70', '5', '47273', '37559', '10'), +('7', '70', '5', '47275', '37547', '10'), +('7', '70', '5', '83599', '36114', '10'), +('7', '70', '5', '67625', '32653', '10'), +('7', '70', '8', '70977', '43909', '10'), +('7', '70', '8', '69165', '40603', '10'), +('7', '70', '8', '68844', '31081', '10'), +('7', '70', '8', '83659', '31024', '10'), +('7', '70', '6', '83585', '43673', '10'), +('7', '70', '6', '70717', '39221', '10'), +('7', '70', '6', '83635', '35052', '10'), +('7', '70', '6', '71654', '34650', '10'), +('7', '70', '17', '68978', '30270', '10'), +('7', '70', '17', '47650', '26115', '10'), +('7', '70', '17', '70900', '25096', '10'), +('7', '70', '17', '83605', '23785', '10'), +('7', '70', '7', '83566', '43188', '10'), +('7', '70', '7', '70896', '37810', '10'), +('7', '70', '7', '83552', '35733', '10'), +('7', '70', '7', '47206', '29721', '10'), +('7', '70', '9', '83654', '45949', '10'), +('7', '70', '9', '70897', '39601', '10'), +('7', '70', '9', '83536', '34701', '10'), +('7', '70', '9', '83463', '34185', '10'), +('7', '70', '15', '83661', '39465', '10'), +('7', '70', '15', '47291', '38111', '10'), +('7', '70', '15', '47294', '37945', '10'), +('7', '70', '15', '83458', '36980', '10'), +('7', '70', '20', '47283', '41855', '10'), +('7', '70', '20', '47282', '33112', '10'), +('7', '70', '20', '16156', '32859', '10'), +('7', '70', '20', '83611', '32675', '10'), +('7', '70', '12', '83570', '37978', '10'), +('7', '70', '12', '47214', '37571', '10'), +('7', '70', '12', '70898', '36577', '10'), +('7', '70', '12', '71085', '36507', '10'), +('7', '70', '18', '68979', '32295', '10'), +('7', '70', '18', '70901', '30296', '10'), +('7', '70', '18', '71098', '27895', '10'), +('7', '70', '18', '83609', '25381', '10'), +('7', '70', '19', '83574', '42414', '10'), +('7', '70', '19', '70899', '40214', '10'), +('7', '70', '19', '83504', '33254', '10'), +('7', '70', '19', '70712', '33195', '10'), +('7', '70', '13', '83580', '180782', '10'), +('7', '70', '13', '67742', '168585', '10'), +('7', '70', '13', '83501', '167406', '10'), +('7', '70', '13', '47318', '166617', '10'), +('7', '70', '14', '83580', '180782', '10'), +('7', '70', '14', '67742', '168585', '10'), +('7', '70', '14', '83501', '167406', '10'), +('7', '70', '14', '47318', '166617', '10'), +('7', '70', '11', '83657', '45083', '10'), +('7', '70', '11', '83633', '43503', '10'), +('7', '70', '11', '83666', '43503', '10'), +('7', '70', '11', '83665', '39356', '10'), +('7', '70', '22', '66397', '0', '9'), +('7', '70', '22', '62787', '0', '9'), +('7', '70', '22', '61948', '0', '9'), +('7', '70', '22', '21805', '0', '9'), +('7', '70', '1', '71624', '42174', '9'), +('7', '70', '1', '47287', '41584', '9'), +('7', '70', '1', '68949', '39795', '9'), +('7', '70', '1', '71668', '39700', '9'), +('7', '70', '2', '70895', '45103', '9'), +('7', '70', '2', '47210', '28577', '9'), +('7', '70', '2', '71083', '26008', '9'), +('7', '70', '2', '67728', '25706', '9'), +('7', '70', '3', '56017', '36199', '9'), +('7', '70', '3', '47245', '36022', '9'), +('7', '70', '3', '47299', '33006', '9'), +('7', '70', '3', '70718', '32548', '9'), +('7', '70', '5', '47273', '37559', '9'), +('7', '70', '5', '47275', '37547', '9'), +('7', '70', '5', '67625', '32653', '9'), +('7', '70', '5', '68808', '30540', '9'), +('7', '70', '8', '70977', '43909', '9'), +('7', '70', '8', '69165', '40603', '9'), +('7', '70', '8', '68844', '31081', '9'), +('7', '70', '8', '70662', '30725', '9'), +('7', '70', '6', '70717', '39221', '9'), +('7', '70', '6', '71654', '34650', '9'), +('7', '70', '6', '68955', '28405', '9'), +('7', '70', '6', '13674', '26850', '9'), +('7', '70', '17', '68978', '30270', '9'), +('7', '70', '17', '47650', '26115', '9'), +('7', '70', '17', '70900', '25096', '9'), +('7', '70', '17', '69152', '21006', '9'), +('7', '70', '7', '70896', '37810', '9'), +('7', '70', '7', '47206', '29721', '9'), +('7', '70', '7', '68896', '28309', '9'), +('7', '70', '7', '69175', '28217', '9'), +('7', '70', '9', '70897', '39601', '9'), +('7', '70', '9', '47222', '34004', '9'), +('7', '70', '9', '68899', '26890', '9'), +('7', '70', '9', '71087', '26808', '9'), +('7', '70', '15', '47291', '38111', '9'), +('7', '70', '15', '47294', '37945', '9'), +('7', '70', '15', '71117', '35644', '9'), +('7', '70', '15', '47237', '35347', '9'), +('7', '70', '20', '47283', '41855', '9'), +('7', '70', '20', '47282', '33112', '9'), +('7', '70', '20', '16156', '32859', '9'), +('7', '70', '20', '67625', '32653', '9'), +('7', '70', '12', '47214', '37571', '9'), +('7', '70', '12', '70898', '36577', '9'), +('7', '70', '12', '71085', '36507', '9'), +('7', '70', '12', '69254', '33131', '9'), +('7', '70', '18', '68979', '32295', '9'), +('7', '70', '18', '70901', '30296', '9'), +('7', '70', '18', '71098', '27895', '9'), +('7', '70', '18', '83134', '25183', '9'), +('7', '70', '19', '70899', '40214', '9'), +('7', '70', '19', '70712', '33195', '9'), +('7', '70', '19', '69179', '31443', '9'), +('7', '70', '19', '47218', '30211', '9'), +('7', '70', '13', '67742', '168585', '9'), +('7', '70', '13', '47318', '166617', '9'), +('7', '70', '13', '70722', '154299', '9'), +('7', '70', '13', '47260', '152571', '9'), +('7', '70', '14', '67742', '168585', '9'), +('7', '70', '14', '47318', '166617', '9'), +('7', '70', '14', '70722', '154299', '9'), +('7', '70', '14', '47260', '152571', '9'), +('7', '70', '11', '67606', '33472', '9'), +('7', '70', '11', '69158', '33268', '9'), +('7', '70', '11', '47295', '32475', '9'), +('7', '70', '11', '71659', '31359', '9'), +('7', '70', '22', '66397', '0', '8'), +('7', '70', '22', '62787', '0', '8'), +('7', '70', '22', '61948', '0', '8'), +('7', '70', '22', '21805', '0', '8'), +('7', '70', '1', '47287', '41584', '8'), +('7', '70', '1', '68949', '39795', '8'), +('7', '70', '1', '47289', '39169', '8'), +('7', '70', '1', '69166', '37906', '8'), +('7', '70', '2', '70895', '45103', '8'), +('7', '70', '2', '47210', '28577', '8'), +('7', '70', '2', '71083', '26008', '8'), +('7', '70', '2', '67728', '25706', '8'), +('7', '70', '3', '56017', '36199', '8'), +('7', '70', '3', '47245', '36022', '8'), +('7', '70', '3', '47299', '33006', '8'), +('7', '70', '3', '70718', '32548', '8'), +('7', '70', '5', '47273', '37559', '8'), +('7', '70', '5', '47275', '37547', '8'), +('7', '70', '5', '67625', '32653', '8'), +('7', '70', '5', '68808', '30540', '8'), +('7', '70', '8', '69165', '40603', '8'), +('7', '70', '8', '68844', '31081', '8'), +('7', '70', '8', '70662', '30725', '8'), +('7', '70', '8', '69064', '28777', '8'), +('7', '70', '6', '70717', '39221', '8'), +('7', '70', '6', '68955', '28405', '8'), +('7', '70', '6', '13674', '26850', '8'), +('7', '70', '6', '71105', '26471', '8'), +('7', '70', '17', '68978', '30270', '8'), +('7', '70', '17', '47650', '26115', '8'), +('7', '70', '17', '70900', '25096', '8'), +('7', '70', '17', '69152', '21006', '8'), +('7', '70', '7', '70896', '37810', '8'), +('7', '70', '7', '47206', '29721', '8'), +('7', '70', '7', '68896', '28309', '8'), +('7', '70', '7', '69175', '28217', '8'), +('7', '70', '9', '70897', '39601', '8'), +('7', '70', '9', '47222', '34004', '8'), +('7', '70', '9', '68899', '26890', '8'), +('7', '70', '9', '71087', '26808', '8'), +('7', '70', '15', '47291', '38111', '8'), +('7', '70', '15', '47294', '37945', '8'), +('7', '70', '15', '71117', '35644', '8'), +('7', '70', '15', '47237', '35347', '8'), +('7', '70', '20', '47283', '41855', '8'), +('7', '70', '20', '47282', '33112', '8'), +('7', '70', '20', '16156', '32859', '8'), +('7', '70', '20', '67625', '32653', '8'), +('7', '70', '12', '47214', '37571', '8'), +('7', '70', '12', '70898', '36577', '8'), +('7', '70', '12', '71085', '36507', '8'), +('7', '70', '12', '69254', '33131', '8'), +('7', '70', '18', '68979', '32295', '8'), +('7', '70', '18', '70901', '30296', '8'), +('7', '70', '18', '71098', '27895', '8'), +('7', '70', '18', '16727', '23520', '8'), +('7', '70', '19', '70899', '40214', '8'), +('7', '70', '19', '70712', '33195', '8'), +('7', '70', '19', '69179', '31443', '8'), +('7', '70', '19', '47218', '30211', '8'), +('7', '70', '13', '67742', '168585', '8'), +('7', '70', '13', '47318', '166192', '8'), +('7', '70', '13', '70722', '153980', '8'), +('7', '70', '13', '47260', '152252', '8'), +('7', '70', '14', '67742', '168585', '8'), +('7', '70', '14', '47318', '166192', '8'), +('7', '70', '14', '70722', '153980', '8'), +('7', '70', '14', '47260', '152252', '8'), +('7', '70', '11', '67606', '33472', '8'), +('7', '70', '11', '69158', '33268', '8'), +('7', '70', '11', '47295', '32475', '8'), +('7', '70', '11', '68952', '29510', '8'), +('7', '71', '22', '61948', '0', '11'), +('7', '71', '22', '66397', '0', '11'), +('7', '71', '22', '21805', '0', '11'), +('7', '71', '22', '21807', '0', '11'), +('7', '71', '1', '83594', '50524', '11'), +('7', '71', '1', '39276', '50102', '11'), +('7', '71', '1', '39363', '46005', '11'), +('7', '71', '1', '39329', '43597', '11'), +('7', '71', '2', '70895', '45106', '11'), +('7', '71', '2', '83562', '42185', '11'), +('7', '71', '2', '83542', '37613', '11'), +('7', '71', '2', '47210', '28578', '11'), +('7', '71', '3', '39218', '40091', '11'), +('7', '71', '3', '89512', '39965', '11'), +('7', '71', '3', '83658', '39266', '11'), +('7', '71', '3', '39361', '37697', '11'), +('7', '71', '5', '39349', '51946', '11'), +('7', '71', '5', '47273', '37559', '11'), +('7', '71', '5', '47275', '37548', '11'), +('7', '71', '5', '83599', '36116', '11'), +('7', '71', '8', '70977', '43911', '11'), +('7', '71', '8', '39330', '41072', '11'), +('7', '71', '8', '69165', '40605', '11'), +('7', '71', '8', '39210', '37286', '11'), +('7', '71', '6', '39367', '50326', '11'), +('7', '71', '6', '83585', '43675', '11'), +('7', '71', '6', '70717', '39223', '11'), +('7', '71', '6', '83635', '35054', '11'), +('7', '71', '17', '68978', '30272', '11'), +('7', '71', '17', '47650', '26117', '11'), +('7', '71', '17', '70900', '25097', '11'), +('7', '71', '17', '83605', '23787', '11'), +('7', '71', '7', '39357', '45046', '11'), +('7', '71', '7', '83566', '43190', '11'), +('7', '71', '7', '70896', '37813', '11'), +('7', '71', '7', '39220', '35918', '11'), +('7', '71', '9', '39346', '49313', '11'), +('7', '71', '9', '51708', '46625', '11'), +('7', '71', '9', '83654', '45951', '11'), +('7', '71', '9', '70897', '39604', '11'), +('7', '71', '15', '39373', '52609', '11'), +('7', '71', '15', '39321', '41303', '11'), +('7', '71', '15', '51703', '39935', '11'), +('7', '71', '15', '83661', '39467', '11'), +('7', '71', '20', '39339', '43585', '11'), +('7', '71', '20', '47283', '41856', '11'), +('7', '71', '20', '39322', '39953', '11'), +('7', '71', '20', '47282', '33114', '11'), +('7', '71', '12', '83570', '37981', '11'), +('7', '71', '12', '47214', '37571', '11'), +('7', '71', '12', '70898', '36579', '11'), +('7', '71', '12', '71085', '36508', '11'), +('7', '71', '18', '68979', '32296', '11'), +('7', '71', '18', '70901', '30298', '11'), +('7', '71', '18', '71098', '27896', '11'), +('7', '71', '18', '83609', '25382', '11'), +('7', '71', '19', '83574', '42416', '11'), +('7', '71', '19', '70899', '40214', '11'), +('7', '71', '19', '39279', '39645', '11'), +('7', '71', '19', '83504', '33256', '11'), +('7', '71', '13', '83580', '181209', '11'), +('7', '71', '13', '39264', '176559', '11'), +('7', '71', '13', '67742', '168799', '11'), +('7', '71', '13', '83501', '167884', '11'), +('7', '71', '14', '83580', '181209', '11'), +('7', '71', '14', '39264', '176559', '11'), +('7', '71', '14', '67742', '168799', '11'), +('7', '71', '14', '83501', '167884', '11'), +('7', '71', '11', '39311', '48135', '11'), +('7', '71', '11', '83657', '45086', '11'), +('7', '71', '11', '39371', '44575', '11'), +('7', '71', '11', '39342', '43644', '11'), +('7', '72', '22', '61948', '0', '11'), +('7', '72', '22', '66397', '0', '11'), +('7', '72', '22', '21805', '0', '11'), +('7', '72', '22', '21807', '0', '11'), +('7', '72', '1', '83594', '50526', '11'), +('7', '72', '1', '39276', '50104', '11'), +('7', '72', '1', '39363', '46007', '11'), +('7', '72', '1', '39329', '43597', '11'), +('7', '72', '2', '70895', '45108', '11'), +('7', '72', '2', '83562', '42187', '11'), +('7', '72', '2', '83542', '37613', '11'), +('7', '72', '2', '47210', '28579', '11'), +('7', '72', '3', '39218', '40092', '11'), +('7', '72', '3', '89512', '39967', '11'), +('7', '72', '3', '83658', '39268', '11'), +('7', '72', '3', '39361', '37698', '11'), +('7', '72', '5', '39349', '51948', '11'), +('7', '72', '5', '47273', '37559', '11'), +('7', '72', '5', '47275', '37550', '11'), +('7', '72', '5', '83599', '36118', '11'), +('7', '72', '8', '70977', '43913', '11'), +('7', '72', '8', '39330', '41072', '11'), +('7', '72', '8', '69165', '40607', '11'), +('7', '72', '8', '39210', '37288', '11'), +('7', '72', '6', '39367', '50328', '11'), +('7', '72', '6', '83585', '43677', '11'), +('7', '72', '6', '70717', '39225', '11'), +('7', '72', '6', '83635', '35056', '11'), +('7', '72', '17', '68978', '30274', '11'), +('7', '72', '17', '47650', '26119', '11'), +('7', '72', '17', '70900', '25098', '11'), +('7', '72', '17', '83605', '23788', '11'), +('7', '72', '7', '39357', '45047', '11'), +('7', '72', '7', '83566', '43193', '11'), +('7', '72', '7', '70896', '37816', '11'), +('7', '72', '7', '39220', '35919', '11'), +('7', '72', '9', '39346', '49316', '11'), +('7', '72', '9', '51708', '46627', '11'), +('7', '72', '9', '83654', '45953', '11'), +('7', '72', '9', '70897', '39607', '11'), +('7', '72', '15', '39373', '52612', '11'), +('7', '72', '15', '39321', '41304', '11'), +('7', '72', '15', '51703', '39937', '11'), +('7', '72', '15', '83661', '39470', '11'), +('7', '72', '20', '39339', '43587', '11'), +('7', '72', '20', '47283', '41857', '11'), +('7', '72', '20', '39322', '39955', '11'), +('7', '72', '20', '47282', '33115', '11'), +('7', '72', '12', '83570', '37983', '11'), +('7', '72', '12', '47214', '37571', '11'), +('7', '72', '12', '70898', '36581', '11'), +('7', '72', '12', '71085', '36510', '11'), +('7', '72', '18', '68979', '32297', '11'), +('7', '72', '18', '70901', '30299', '11'), +('7', '72', '18', '71098', '27898', '11'), +('7', '72', '18', '83609', '25384', '11'), +('7', '72', '19', '83574', '42419', '11'), +('7', '72', '19', '70899', '40214', '11'), +('7', '72', '19', '39279', '39646', '11'), +('7', '72', '19', '83504', '33257', '11'), +('7', '72', '13', '83580', '181678', '11'), +('7', '72', '13', '39264', '176985', '11'), +('7', '72', '13', '67742', '169056', '11'), +('7', '72', '13', '83501', '168362', '11'), +('7', '72', '14', '83580', '181678', '11'), +('7', '72', '14', '39264', '176985', '11'), +('7', '72', '14', '67742', '169056', '11'), +('7', '72', '14', '83501', '168362', '11'), +('7', '72', '11', '39311', '48137', '11'), +('7', '72', '11', '83657', '45088', '11'), +('7', '72', '11', '39371', '44577', '11'), +('7', '72', '11', '39342', '43646', '11'), +('7', '73', '22', '61948', '0', '11'), +('7', '73', '22', '66397', '0', '11'), +('7', '73', '22', '21805', '0', '11'), +('7', '73', '22', '21807', '0', '11'), +('7', '73', '1', '83594', '50528', '11'), +('7', '73', '1', '39276', '50106', '11'), +('7', '73', '1', '39363', '46009', '11'), +('7', '73', '1', '39329', '43597', '11'), +('7', '73', '2', '70895', '45110', '11'), +('7', '73', '2', '83562', '42190', '11'), +('7', '73', '2', '83542', '37613', '11'), +('7', '73', '2', '47210', '28580', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '73', '3', '39218', '40093', '11'), +('7', '73', '3', '89512', '39969', '11'), +('7', '73', '3', '83658', '39270', '11'), +('7', '73', '3', '39361', '37700', '11'), +('7', '73', '5', '39349', '51950', '11'), +('7', '73', '5', '47273', '37559', '11'), +('7', '73', '5', '47275', '37551', '11'), +('7', '73', '5', '83599', '36120', '11'), +('7', '73', '8', '70977', '43915', '11'), +('7', '73', '8', '39330', '41072', '11'), +('7', '73', '8', '69165', '40609', '11'), +('7', '73', '8', '39210', '37290', '11'), +('7', '73', '6', '39367', '50330', '11'), +('7', '73', '6', '83585', '43679', '11'), +('7', '73', '6', '70717', '39227', '11'), +('7', '73', '6', '83635', '35058', '11'), +('7', '73', '17', '68978', '30276', '11'), +('7', '73', '17', '47650', '26121', '11'), +('7', '73', '17', '70900', '25099', '11'), +('7', '73', '17', '83605', '23789', '11'), +('7', '73', '7', '39357', '45049', '11'), +('7', '73', '7', '83566', '43195', '11'), +('7', '73', '7', '70896', '37819', '11'), +('7', '73', '7', '39220', '35921', '11'), +('7', '73', '9', '39346', '49319', '11'), +('7', '73', '9', '51708', '46629', '11'), +('7', '73', '9', '83654', '45955', '11'), +('7', '73', '9', '70897', '39611', '11'), +('7', '73', '15', '39373', '52614', '11'), +('7', '73', '15', '39321', '41306', '11'), +('7', '73', '15', '51703', '39939', '11'), +('7', '73', '15', '83661', '39472', '11'), +('7', '73', '20', '39339', '43588', '11'), +('7', '73', '20', '47283', '41858', '11'), +('7', '73', '20', '39322', '39958', '11'), +('7', '73', '20', '47282', '33117', '11'), +('7', '73', '12', '83570', '37985', '11'), +('7', '73', '12', '47214', '37571', '11'), +('7', '73', '12', '70898', '36584', '11'), +('7', '73', '12', '71085', '36511', '11'), +('7', '73', '18', '68979', '32299', '11'), +('7', '73', '18', '70901', '30301', '11'), +('7', '73', '18', '71098', '27900', '11'), +('7', '73', '18', '83609', '25385', '11'), +('7', '73', '19', '83574', '42421', '11'), +('7', '73', '19', '70899', '40214', '11'), +('7', '73', '19', '39279', '39648', '11'), +('7', '73', '19', '83504', '33259', '11'), +('7', '73', '13', '83580', '182104', '11'), +('7', '73', '13', '39264', '177412', '11'), +('7', '73', '13', '67742', '169313', '11'), +('7', '73', '13', '83501', '168840', '11'), +('7', '73', '14', '83580', '182104', '11'), +('7', '73', '14', '39264', '177412', '11'), +('7', '73', '14', '67742', '169313', '11'), +('7', '73', '14', '83501', '168840', '11'), +('7', '73', '11', '39311', '48139', '11'), +('7', '73', '11', '83657', '45091', '11'), +('7', '73', '11', '39371', '44579', '11'), +('7', '73', '11', '39342', '43648', '11'), +('7', '74', '22', '61948', '0', '11'), +('7', '74', '22', '66397', '0', '11'), +('7', '74', '22', '21805', '0', '11'), +('7', '74', '22', '21807', '0', '11'), +('7', '74', '1', '83594', '50530', '11'), +('7', '74', '1', '39276', '50107', '11'), +('7', '74', '1', '39363', '46011', '11'), +('7', '74', '1', '39329', '43597', '11'), +('7', '74', '2', '70895', '45112', '11'), +('7', '74', '2', '83562', '42192', '11'), +('7', '74', '2', '83542', '37613', '11'), +('7', '74', '2', '47210', '28581', '11'), +('7', '74', '3', '39218', '40094', '11'), +('7', '74', '3', '89512', '39971', '11'), +('7', '74', '3', '83658', '39272', '11'), +('7', '74', '3', '39361', '37701', '11'), +('7', '74', '5', '39349', '51952', '11'), +('7', '74', '5', '47273', '37559', '11'), +('7', '74', '5', '47275', '37553', '11'), +('7', '74', '5', '83599', '36122', '11'), +('7', '74', '8', '70977', '43917', '11'), +('7', '74', '8', '39330', '41072', '11'), +('7', '74', '8', '69165', '40610', '11'), +('7', '74', '8', '39210', '37291', '11'), +('7', '74', '6', '39367', '50332', '11'), +('7', '74', '6', '83585', '43681', '11'), +('7', '74', '6', '70717', '39229', '11'), +('7', '74', '6', '83635', '35060', '11'), +('7', '74', '17', '68978', '30278', '11'), +('7', '74', '17', '47650', '26123', '11'), +('7', '74', '17', '70900', '25101', '11'), +('7', '74', '17', '83605', '23790', '11'), +('7', '74', '7', '39357', '45051', '11'), +('7', '74', '7', '83566', '43197', '11'), +('7', '74', '7', '70896', '37822', '11'), +('7', '74', '7', '39220', '35923', '11'), +('7', '74', '9', '39346', '49321', '11'), +('7', '74', '9', '51708', '46631', '11'), +('7', '74', '9', '83654', '45957', '11'), +('7', '74', '9', '70897', '39614', '11'), +('7', '74', '15', '39373', '52617', '11'), +('7', '74', '15', '39321', '41307', '11'), +('7', '74', '15', '51703', '39941', '11'), +('7', '74', '15', '83661', '39474', '11'), +('7', '74', '20', '39339', '43589', '11'), +('7', '74', '20', '47283', '41860', '11'), +('7', '74', '20', '39322', '39960', '11'), +('7', '74', '20', '47282', '33118', '11'), +('7', '74', '12', '83570', '37987', '11'), +('7', '74', '12', '47214', '37571', '11'), +('7', '74', '12', '70898', '36586', '11'), +('7', '74', '12', '71085', '36513', '11'), +('7', '74', '18', '68979', '32300', '11'), +('7', '74', '18', '70901', '30303', '11'), +('7', '74', '18', '71098', '27901', '11'), +('7', '74', '18', '83609', '25387', '11'), +('7', '74', '19', '83574', '42423', '11'), +('7', '74', '19', '70899', '40214', '11'), +('7', '74', '19', '39279', '39649', '11'), +('7', '74', '19', '83504', '33260', '11'), +('7', '74', '13', '83580', '182573', '11'), +('7', '74', '13', '39264', '177881', '11'), +('7', '74', '13', '67742', '169528', '11'), +('7', '74', '13', '83501', '169318', '11'), +('7', '74', '14', '83580', '182573', '11'), +('7', '74', '14', '39264', '177881', '11'), +('7', '74', '14', '67742', '169528', '11'), +('7', '74', '14', '83501', '169318', '11'), +('7', '74', '11', '39311', '48141', '11'), +('7', '74', '11', '83657', '45094', '11'), +('7', '74', '11', '39371', '44581', '11'), +('7', '74', '11', '39342', '43650', '11'), +('7', '75', '22', '21805', '0', '13'), +('7', '75', '22', '61948', '0', '13'), +('7', '75', '22', '21807', '0', '13'), +('7', '75', '22', '12425', '0', '13'), +('7', '75', '1', '80676', '69391', '13'), +('7', '75', '1', '80648', '67201', '13'), +('7', '75', '1', '80639', '63498', '13'), +('7', '75', '1', '46931', '61470', '13'), +('7', '75', '2', '70895', '45114', '13'), +('7', '75', '2', '83562', '42194', '13'), +('7', '75', '2', '83542', '37613', '13'), +('7', '75', '2', '47210', '28582', '13'), +('7', '75', '3', '80636', '67372', '13'), +('7', '75', '3', '46924', '51187', '13'), +('7', '75', '3', '46902', '43692', '13'), +('7', '75', '3', '46852', '42680', '13'), +('7', '75', '5', '80669', '66041', '13'), +('7', '75', '5', '46918', '63587', '13'), +('7', '75', '5', '80616', '60877', '13'), +('7', '75', '5', '39349', '51954', '13'), +('7', '75', '8', '80687', '57435', '13'), +('7', '75', '8', '46885', '54094', '13'), +('7', '75', '8', '80649', '44420', '13'), +('7', '75', '8', '70977', '43919', '13'), +('7', '75', '6', '39367', '50335', '13'), +('7', '75', '6', '46884', '48133', '13'), +('7', '75', '6', '46933', '48085', '13'), +('7', '75', '6', '46858', '45760', '13'), +('7', '75', '17', '68978', '30280', '13'), +('7', '75', '17', '47650', '26125', '13'), +('7', '75', '17', '70900', '25102', '13'), +('7', '75', '17', '83605', '23791', '13'), +('7', '75', '7', '39357', '45053', '13'), +('7', '75', '7', '83566', '43200', '13'), +('7', '75', '7', '70896', '37825', '13'), +('7', '75', '7', '39220', '35925', '13'), +('7', '75', '9', '46888', '62712', '13'), +('7', '75', '9', '39346', '49324', '13'), +('7', '75', '9', '51708', '46633', '13'), +('7', '75', '9', '83654', '45959', '13'), +('7', '75', '15', '79909', '75105', '13'), +('7', '75', '15', '80686', '69955', '13'), +('7', '75', '15', '80657', '69529', '13'), +('7', '75', '15', '79908', '67742', '13'), +('7', '75', '20', '80688', '78091', '13'), +('7', '75', '20', '46935', '59705', '13'), +('7', '75', '20', '80620', '55460', '13'), +('7', '75', '20', '46870', '49334', '13'), +('7', '75', '12', '83570', '37990', '13'), +('7', '75', '12', '47214', '37571', '13'), +('7', '75', '12', '70898', '36588', '13'), +('7', '75', '12', '71085', '36514', '13'), +('7', '75', '18', '68979', '32301', '13'), +('7', '75', '18', '70901', '30304', '13'), +('7', '75', '18', '71098', '27903', '13'), +('7', '75', '18', '83609', '25388', '13'), +('7', '75', '19', '83574', '42426', '13'), +('7', '75', '19', '70899', '40214', '13'), +('7', '75', '19', '39279', '39651', '13'), +('7', '75', '19', '83504', '33262', '13'), +('7', '75', '13', '80684', '245665', '13'), +('7', '75', '13', '46878', '213989', '13'), +('7', '75', '13', '80643', '204667', '13'), +('7', '75', '13', '46829', '184241', '13'), +('7', '75', '14', '80684', '245665', '13'), +('7', '75', '14', '46878', '213989', '13'), +('7', '75', '14', '80643', '204667', '13'), +('7', '75', '14', '46829', '184241', '13'), +('7', '75', '11', '80668', '58623', '13'), +('7', '75', '11', '80630', '49116', '13'), +('7', '75', '11', '39311', '48144', '13'), +('7', '75', '11', '46850', '47372', '13'), +('7', '75', '22', '21805', '0', '12'), +('7', '75', '22', '61948', '0', '12'), +('7', '75', '22', '21807', '0', '12'), +('7', '75', '22', '12425', '0', '12'), +('7', '75', '1', '46931', '61470', '12'), +('7', '75', '1', '46866', '55530', '12'), +('7', '75', '1', '83594', '50532', '12'), +('7', '75', '1', '46894', '50268', '12'), +('7', '75', '2', '70895', '45114', '12'), +('7', '75', '2', '83562', '42194', '12'), +('7', '75', '2', '83542', '37613', '12'), +('7', '75', '2', '47210', '28582', '12'), +('7', '75', '3', '46924', '51187', '12'), +('7', '75', '3', '46902', '43692', '12'), +('7', '75', '3', '46852', '42680', '12'), +('7', '75', '3', '39218', '40095', '12'), +('7', '75', '5', '46918', '63587', '12'), +('7', '75', '5', '39349', '51954', '12'), +('7', '75', '5', '46934', '50896', '12'), +('7', '75', '5', '47273', '37559', '12'), +('7', '75', '8', '46885', '54094', '12'), +('7', '75', '8', '70977', '43919', '12'), +('7', '75', '8', '46848', '41934', '12'), +('7', '75', '8', '39330', '41072', '12'), +('7', '75', '6', '39367', '50335', '12'), +('7', '75', '6', '46884', '48133', '12'), +('7', '75', '6', '46933', '48085', '12'), +('7', '75', '6', '46858', '45760', '12'), +('7', '75', '17', '68978', '30280', '12'), +('7', '75', '17', '47650', '26125', '12'), +('7', '75', '17', '70900', '25102', '12'), +('7', '75', '17', '83605', '23791', '12'), +('7', '75', '7', '39357', '45053', '12'), +('7', '75', '7', '83566', '43200', '12'), +('7', '75', '7', '70896', '37825', '12'), +('7', '75', '7', '39220', '35925', '12'), +('7', '75', '9', '46888', '62712', '12'), +('7', '75', '9', '39346', '49324', '12'), +('7', '75', '9', '51708', '46633', '12'), +('7', '75', '9', '83654', '45959', '12'), +('7', '75', '15', '46881', '60370', '12'), +('7', '75', '15', '46893', '54844', '12'), +('7', '75', '15', '46916', '54532', '12'), +('7', '75', '15', '39373', '52620', '12'), +('7', '75', '20', '46935', '59705', '12'), +('7', '75', '20', '46870', '49334', '12'), +('7', '75', '20', '39339', '43591', '12'), +('7', '75', '20', '47283', '41861', '12'), +('7', '75', '12', '83570', '37990', '12'), +('7', '75', '12', '47214', '37571', '12'), +('7', '75', '12', '70898', '36588', '12'), +('7', '75', '12', '71085', '36514', '12'), +('7', '75', '18', '68979', '32301', '12'), +('7', '75', '18', '70901', '30304', '12'), +('7', '75', '18', '71098', '27903', '12'), +('7', '75', '18', '83609', '25388', '12'), +('7', '75', '19', '83574', '42426', '12'), +('7', '75', '19', '70899', '40214', '12'), +('7', '75', '19', '39279', '39651', '12'), +('7', '75', '19', '83504', '33262', '12'), +('7', '75', '13', '46878', '213989', '12'), +('7', '75', '13', '46829', '184241', '12'), +('7', '75', '13', '83580', '184105', '12'), +('7', '75', '13', '39264', '179371', '12'), +('7', '75', '14', '46878', '213989', '12'), +('7', '75', '14', '46829', '184241', '12'), +('7', '75', '14', '83580', '184105', '12'), +('7', '75', '14', '39264', '179371', '12'), +('7', '75', '11', '39311', '48144', '12'), +('7', '75', '11', '46850', '47372', '12'), +('7', '75', '11', '83657', '45096', '12'), +('7', '75', '11', '39371', '44583', '12'), +('7', '76', '22', '21805', '0', '13'), +('7', '76', '22', '61948', '0', '13'), +('7', '76', '22', '21807', '0', '13'), +('7', '76', '22', '12425', '0', '13'), +('7', '76', '1', '80676', '69391', '13'), +('7', '76', '1', '80648', '67203', '13'), +('7', '76', '1', '80639', '63501', '13'), +('7', '76', '1', '46931', '61473', '13'), +('7', '76', '2', '70895', '45117', '13'), +('7', '76', '2', '83562', '42196', '13'), +('7', '76', '2', '83542', '37613', '13'), +('7', '76', '2', '47210', '28583', '13'), +('7', '76', '3', '80636', '67372', '13'), +('7', '76', '3', '46924', '51189', '13'), +('7', '76', '3', '46902', '43694', '13'), +('7', '76', '3', '46852', '42682', '13'), +('7', '76', '5', '80669', '66044', '13'), +('7', '76', '5', '46918', '63590', '13'), +('7', '76', '5', '80616', '60877', '13'), +('7', '76', '5', '39349', '51955', '13'), +('7', '76', '8', '80687', '57437', '13'), +('7', '76', '8', '46885', '54096', '13'), +('7', '76', '8', '80649', '44421', '13'), +('7', '76', '8', '70977', '43921', '13'), +('7', '76', '6', '39367', '50337', '13'), +('7', '76', '6', '46884', '48135', '13'), +('7', '76', '6', '46933', '48087', '13'), +('7', '76', '6', '46858', '45762', '13'), +('7', '76', '17', '68978', '30282', '13'), +('7', '76', '17', '47650', '26127', '13'), +('7', '76', '17', '70900', '25103', '13'), +('7', '76', '17', '83605', '23792', '13'), +('7', '76', '7', '39357', '45055', '13'), +('7', '76', '7', '83566', '43202', '13'), +('7', '76', '7', '70896', '37828', '13'), +('7', '76', '7', '39220', '35926', '13'), +('7', '76', '9', '46888', '62715', '13'), +('7', '76', '9', '39346', '49327', '13'), +('7', '76', '9', '51708', '46635', '13'), +('7', '76', '9', '83654', '45961', '13'), +('7', '76', '15', '79909', '75107', '13'), +('7', '76', '15', '80686', '69957', '13'), +('7', '76', '15', '80657', '69529', '13'), +('7', '76', '15', '79908', '67744', '13'), +('7', '76', '20', '80688', '78094', '13'), +('7', '76', '20', '46935', '59708', '13'), +('7', '76', '20', '80620', '55462', '13'), +('7', '76', '20', '46870', '49336', '13'), +('7', '76', '12', '83570', '37992', '13'), +('7', '76', '12', '47214', '37571', '13'), +('7', '76', '12', '70898', '36591', '13'), +('7', '76', '12', '71085', '36516', '13'), +('7', '76', '18', '68979', '32302', '13'), +('7', '76', '18', '70901', '30306', '13'), +('7', '76', '18', '71098', '27905', '13'), +('7', '76', '18', '83609', '25389', '13'), +('7', '76', '19', '83574', '42428', '13'), +('7', '76', '19', '70899', '40214', '13'), +('7', '76', '19', '39279', '39652', '13'), +('7', '76', '19', '83504', '33263', '13'), +('7', '76', '13', '80684', '246007', '13'), +('7', '76', '13', '46878', '214462', '13'), +('7', '76', '13', '80643', '204979', '13'), +('7', '76', '13', '46829', '184630', '13'), +('7', '76', '14', '80684', '246007', '13'), +('7', '76', '14', '46878', '214462', '13'), +('7', '76', '14', '80643', '204979', '13'), +('7', '76', '14', '46829', '184630', '13'), +('7', '76', '11', '80668', '58625', '13'), +('7', '76', '11', '80630', '49118', '13'), +('7', '76', '11', '39311', '48146', '13'), +('7', '76', '11', '46850', '47374', '13'), +('7', '77', '22', '21805', '0', '13'), +('7', '77', '22', '61948', '0', '13'), +('7', '77', '22', '21807', '0', '13'), +('7', '77', '22', '12425', '0', '13'), +('7', '77', '1', '80676', '69391', '13'), +('7', '77', '1', '80648', '67206', '13'), +('7', '77', '1', '80639', '63503', '13'), +('7', '77', '1', '46931', '61476', '13'), +('7', '77', '2', '70895', '45119', '13'), +('7', '77', '2', '83562', '42199', '13'), +('7', '77', '2', '83542', '37613', '13'), +('7', '77', '2', '47210', '28584', '13'), +('7', '77', '3', '80636', '67372', '13'), +('7', '77', '3', '46924', '51192', '13'), +('7', '77', '3', '46902', '43696', '13'), +('7', '77', '3', '46852', '42683', '13'), +('7', '77', '5', '80669', '66047', '13'), +('7', '77', '5', '46918', '63593', '13'), +('7', '77', '5', '80616', '60877', '13'), +('7', '77', '5', '39349', '51957', '13'), +('7', '77', '8', '80687', '57439', '13'), +('7', '77', '8', '46885', '54098', '13'), +('7', '77', '8', '80649', '44423', '13'), +('7', '77', '8', '70977', '43923', '13'), +('7', '77', '6', '39367', '50339', '13'), +('7', '77', '6', '46884', '48138', '13'), +('7', '77', '6', '46933', '48088', '13'), +('7', '77', '6', '46858', '45764', '13'), +('7', '77', '17', '68978', '30284', '13'), +('7', '77', '17', '47650', '26129', '13'), +('7', '77', '17', '70900', '25104', '13'), +('7', '77', '17', '83605', '23793', '13'), +('7', '77', '7', '39357', '45057', '13'), +('7', '77', '7', '83566', '43204', '13'), +('7', '77', '7', '70896', '37832', '13'), +('7', '77', '7', '39220', '35928', '13'), +('7', '77', '9', '46888', '62718', '13'), +('7', '77', '9', '39346', '49330', '13'), +('7', '77', '9', '51708', '46637', '13'), +('7', '77', '9', '83654', '45963', '13'), +('7', '77', '15', '79909', '75109', '13'), +('7', '77', '15', '80686', '69960', '13'), +('7', '77', '15', '80657', '69529', '13'), +('7', '77', '15', '79908', '67746', '13'), +('7', '77', '20', '80688', '78097', '13'), +('7', '77', '20', '46935', '59711', '13'), +('7', '77', '20', '80620', '55464', '13'), +('7', '77', '20', '46870', '49338', '13'), +('7', '77', '12', '83570', '37994', '13'), +('7', '77', '12', '47214', '37571', '13'), +('7', '77', '12', '70898', '36593', '13'), +('7', '77', '12', '71085', '36517', '13'), +('7', '77', '18', '68979', '32303', '13'), +('7', '77', '18', '70901', '30307', '13'), +('7', '77', '18', '71098', '27907', '13'), +('7', '77', '18', '83609', '25391', '13'), +('7', '77', '19', '83574', '42430', '13'), +('7', '77', '19', '70899', '40214', '13'), +('7', '77', '19', '39279', '39653', '13'), +('7', '77', '19', '83504', '33265', '13'), +('7', '77', '13', '80684', '246349', '13'), +('7', '77', '13', '46878', '214894', '13'), +('7', '77', '13', '80643', '205252', '13'), +('7', '77', '13', '46829', '185061', '13'), +('7', '77', '14', '80684', '246349', '13'), +('7', '77', '14', '46878', '214894', '13'), +('7', '77', '14', '80643', '205252', '13'), +('7', '77', '14', '46829', '185061', '13'), +('7', '77', '11', '80668', '58628', '13'), +('7', '77', '11', '80630', '49120', '13'), +('7', '77', '11', '39311', '48148', '13'), +('7', '77', '11', '46850', '47376', '13'), +('7', '78', '22', '21805', '0', '13'), +('7', '78', '22', '61948', '0', '13'), +('7', '78', '22', '21807', '0', '13'), +('7', '78', '22', '12425', '0', '13'), +('7', '78', '1', '80676', '69391', '13'), +('7', '78', '1', '80648', '67208', '13'), +('7', '78', '1', '80639', '63506', '13'), +('7', '78', '1', '46931', '61479', '13'), +('7', '78', '2', '70895', '45121', '13'), +('7', '78', '2', '83562', '42201', '13'), +('7', '78', '2', '83542', '37613', '13'), +('7', '78', '2', '47210', '28585', '13'), +('7', '78', '3', '80636', '67372', '13'), +('7', '78', '3', '46924', '51195', '13'), +('7', '78', '3', '46902', '43698', '13'), +('7', '78', '3', '46852', '42685', '13'), +('7', '78', '5', '80669', '66049', '13'), +('7', '78', '5', '46918', '63595', '13'), +('7', '78', '5', '80616', '60877', '13'), +('7', '78', '5', '39349', '51959', '13'), +('7', '78', '8', '80687', '57442', '13'), +('7', '78', '8', '46885', '54101', '13'), +('7', '78', '8', '80649', '44425', '13'), +('7', '78', '8', '70977', '43925', '13'), +('7', '78', '6', '39367', '50341', '13'), +('7', '78', '6', '46884', '48140', '13'), +('7', '78', '6', '46933', '48090', '13'), +('7', '78', '6', '46858', '45766', '13'), +('7', '78', '17', '68978', '30286', '13'), +('7', '78', '17', '47650', '26131', '13'), +('7', '78', '17', '70900', '25106', '13'), +('7', '78', '17', '83605', '23794', '13'), +('7', '78', '7', '39357', '45059', '13'), +('7', '78', '7', '83566', '43207', '13'), +('7', '78', '7', '70896', '37835', '13'), +('7', '78', '7', '39220', '35930', '13'), +('7', '78', '9', '46888', '62721', '13'), +('7', '78', '9', '39346', '49333', '13'), +('7', '78', '9', '51708', '46639', '13'), +('7', '78', '9', '83654', '45965', '13'), +('7', '78', '15', '79909', '75112', '13'), +('7', '78', '15', '80686', '69963', '13'), +('7', '78', '15', '80657', '69529', '13'), +('7', '78', '15', '79908', '67748', '13'), +('7', '78', '20', '80688', '78099', '13'), +('7', '78', '20', '46935', '59714', '13'), +('7', '78', '20', '80620', '55466', '13'), +('7', '78', '20', '46870', '49340', '13'), +('7', '78', '12', '83570', '37996', '13'), +('7', '78', '12', '47214', '37571', '13'), +('7', '78', '12', '70898', '36595', '13'), +('7', '78', '12', '71085', '36519', '13'), +('7', '78', '18', '68979', '32305', '13'), +('7', '78', '18', '70901', '30309', '13'), +('7', '78', '18', '71098', '27908', '13'), +('7', '78', '18', '83609', '25392', '13'), +('7', '78', '19', '83574', '42433', '13'), +('7', '78', '19', '70899', '40214', '13'), +('7', '78', '19', '39279', '39655', '13'), +('7', '78', '19', '83504', '33266', '13'), +('7', '78', '13', '80684', '246691', '13'), +('7', '78', '13', '46878', '215366', '13'), +('7', '78', '13', '80643', '205564', '13'), +('7', '78', '13', '83580', '185470', '13'), +('7', '78', '14', '80684', '246691', '13'), +('7', '78', '14', '46878', '215366', '13'), +('7', '78', '14', '80643', '205564', '13'), +('7', '78', '14', '83580', '185470', '13'), +('7', '78', '11', '80668', '58630', '13'), +('7', '78', '11', '80630', '49122', '13'), +('7', '78', '11', '39311', '48150', '13'), +('7', '78', '11', '46850', '47378', '13'), +('7', '79', '22', '21805', '0', '13'), +('7', '79', '22', '61948', '0', '13'), +('7', '79', '22', '21807', '0', '13'), +('7', '79', '22', '12425', '0', '13'), +('7', '79', '1', '80676', '69391', '13'), +('7', '79', '1', '80648', '67211', '13'), +('7', '79', '1', '80639', '63509', '13'), +('7', '79', '1', '46931', '61482', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '79', '2', '70895', '45123', '13'), +('7', '79', '2', '83562', '42203', '13'), +('7', '79', '2', '83542', '37613', '13'), +('7', '79', '2', '47210', '28586', '13'), +('7', '79', '3', '80636', '67372', '13'), +('7', '79', '3', '46924', '51197', '13'), +('7', '79', '3', '46902', '43701', '13'), +('7', '79', '3', '46852', '42687', '13'), +('7', '79', '5', '80669', '66052', '13'), +('7', '79', '5', '46918', '63598', '13'), +('7', '79', '5', '80616', '60877', '13'), +('7', '79', '5', '39349', '51961', '13'), +('7', '79', '8', '80687', '57444', '13'), +('7', '79', '8', '46885', '54103', '13'), +('7', '79', '8', '80649', '44427', '13'), +('7', '79', '8', '70977', '43927', '13'), +('7', '79', '6', '39367', '50344', '13'), +('7', '79', '6', '46884', '48143', '13'), +('7', '79', '6', '46933', '48092', '13'), +('7', '79', '6', '46858', '45768', '13'), +('7', '79', '17', '68978', '30288', '13'), +('7', '79', '17', '47650', '26133', '13'), +('7', '79', '17', '70900', '25107', '13'), +('7', '79', '17', '83605', '23795', '13'), +('7', '79', '7', '39357', '45061', '13'), +('7', '79', '7', '83566', '43209', '13'), +('7', '79', '7', '70896', '37838', '13'), +('7', '79', '7', '39220', '35931', '13'), +('7', '79', '9', '46888', '62724', '13'), +('7', '79', '9', '39346', '49335', '13'), +('7', '79', '9', '51708', '46641', '13'), +('7', '79', '9', '83654', '45967', '13'), +('7', '79', '15', '79909', '75114', '13'), +('7', '79', '15', '80686', '69966', '13'), +('7', '79', '15', '80657', '69529', '13'), +('7', '79', '15', '79908', '67751', '13'), +('7', '79', '20', '80688', '78102', '13'), +('7', '79', '20', '46935', '59717', '13'), +('7', '79', '20', '80620', '55468', '13'), +('7', '79', '20', '46870', '49342', '13'), +('7', '79', '12', '83570', '37999', '13'), +('7', '79', '12', '47214', '37571', '13'), +('7', '79', '12', '70898', '36598', '13'), +('7', '79', '12', '71085', '36521', '13'), +('7', '79', '18', '68979', '32306', '13'), +('7', '79', '18', '70901', '30311', '13'), +('7', '79', '18', '71098', '27910', '13'), +('7', '79', '18', '83609', '25394', '13'), +('7', '79', '19', '83574', '42435', '13'), +('7', '79', '19', '70899', '40214', '13'), +('7', '79', '19', '39279', '39656', '13'), +('7', '79', '19', '83504', '33268', '13'), +('7', '79', '13', '80684', '247033', '13'), +('7', '79', '13', '46878', '215798', '13'), +('7', '79', '13', '80643', '205836', '13'), +('7', '79', '13', '83580', '185896', '13'), +('7', '79', '14', '80684', '247033', '13'), +('7', '79', '14', '46878', '215798', '13'), +('7', '79', '14', '80643', '205836', '13'), +('7', '79', '14', '83580', '185896', '13'), +('7', '79', '11', '80668', '58633', '13'), +('7', '79', '11', '80630', '49123', '13'), +('7', '79', '11', '39311', '48152', '13'), +('7', '79', '11', '46850', '47379', '13'), +('7', '80', '22', '21805', '0', '14'), +('7', '80', '22', '61948', '0', '14'), +('7', '80', '22', '21807', '0', '14'), +('7', '80', '22', '12425', '0', '14'), +('7', '80', '1', '102590', '95130', '14'), +('7', '80', '1', '102641', '95128', '14'), +('7', '80', '1', '102639', '93850', '14'), +('7', '80', '1', '102642', '93618', '14'), +('7', '80', '2', '102017', '57152', '14'), +('7', '80', '2', '102269', '51373', '14'), +('7', '80', '2', '70895', '45125', '14'), +('7', '80', '2', '83562', '42205', '14'), +('7', '80', '3', '102726', '104399', '14'), +('7', '80', '3', '102591', '101242', '14'), +('7', '80', '3', '102725', '90515', '14'), +('7', '80', '3', '102724', '76707', '14'), +('7', '80', '5', '102745', '91513', '14'), +('7', '80', '5', '102592', '83780', '14'), +('7', '80', '5', '102551', '82497', '14'), +('7', '80', '5', '102743', '68850', '14'), +('7', '80', '8', '102594', '74106', '14'), +('7', '80', '8', '102552', '64882', '14'), +('7', '80', '8', '80687', '57446', '14'), +('7', '80', '8', '46885', '54105', '14'), +('7', '80', '6', '102555', '68071', '14'), +('7', '80', '6', '102593', '64013', '14'), +('7', '80', '6', '39367', '50346', '14'), +('7', '80', '6', '46884', '48145', '14'), +('7', '80', '17', '102020', '33843', '14'), +('7', '80', '17', '102272', '30868', '14'), +('7', '80', '17', '68978', '30290', '14'), +('7', '80', '17', '47650', '26135', '14'), +('7', '80', '7', '102018', '50720', '14'), +('7', '80', '7', '102270', '50256', '14'), +('7', '80', '7', '39357', '45063', '14'), +('7', '80', '7', '83566', '43211', '14'), +('7', '80', '9', '46888', '62727', '14'), +('7', '80', '9', '102289', '52550', '14'), +('7', '80', '9', '39346', '49338', '14'), +('7', '80', '9', '67098', '47095', '14'), +('7', '80', '15', '102595', '97781', '14'), +('7', '80', '15', '102636', '96471', '14'), +('7', '80', '15', '102637', '96004', '14'), +('7', '80', '15', '102635', '95187', '14'), +('7', '80', '20', '102596', '96180', '14'), +('7', '80', '20', '102553', '87873', '14'), +('7', '80', '20', '80688', '78105', '14'), +('7', '80', '20', '46935', '59720', '14'), +('7', '80', '12', '102267', '55835', '14'), +('7', '80', '12', '83570', '38001', '14'), +('7', '80', '12', '47214', '37571', '14'), +('7', '80', '12', '70898', '36600', '14'), +('7', '80', '18', '102271', '47061', '14'), +('7', '80', '18', '102019', '42703', '14'), +('7', '80', '18', '68979', '32307', '14'), +('7', '80', '18', '70901', '30312', '14'), +('7', '80', '19', '102268', '49519', '14'), +('7', '80', '19', '83574', '42437', '14'), +('7', '80', '19', '76131', '41335', '14'), +('7', '80', '19', '70899', '40214', '14'), +('7', '80', '13', '102665', '325398', '14'), +('7', '80', '13', '102588', '270540', '14'), +('7', '80', '13', '102666', '268310', '14'), +('7', '80', '13', '80684', '247375', '14'), +('7', '80', '14', '102665', '325398', '14'), +('7', '80', '14', '102588', '270540', '14'), +('7', '80', '14', '102666', '268310', '14'), +('7', '80', '14', '80684', '247375', '14'), +('7', '80', '11', '102643', '74573', '14'), +('7', '80', '11', '102747', '72543', '14'), +('7', '80', '11', '80668', '58635', '14'), +('7', '80', '11', '102747', '54840', '14'), +('7', '81', '22', '21805', '0', '14'), +('7', '81', '22', '61948', '0', '14'), +('7', '81', '22', '21807', '0', '14'), +('7', '81', '22', '12425', '0', '14'), +('7', '81', '1', '102590', '95133', '14'), +('7', '81', '1', '102641', '95129', '14'), +('7', '81', '1', '102639', '93854', '14'), +('7', '81', '1', '102642', '93618', '14'), +('7', '81', '2', '102017', '57155', '14'), +('7', '81', '2', '102269', '51375', '14'), +('7', '81', '2', '70895', '45127', '14'), +('7', '81', '2', '83562', '42208', '14'), +('7', '81', '3', '102726', '104402', '14'), +('7', '81', '3', '102591', '101244', '14'), +('7', '81', '3', '102725', '90517', '14'), +('7', '81', '3', '102724', '76708', '14'), +('7', '81', '5', '102745', '91516', '14'), +('7', '81', '5', '102592', '83782', '14'), +('7', '81', '5', '102551', '82498', '14'), +('7', '81', '5', '102743', '68852', '14'), +('7', '81', '8', '102594', '74107', '14'), +('7', '81', '8', '102552', '64884', '14'), +('7', '81', '8', '80687', '57448', '14'), +('7', '81', '8', '46885', '54107', '14'), +('7', '81', '6', '102555', '68073', '14'), +('7', '81', '6', '102593', '64015', '14'), +('7', '81', '6', '39367', '50348', '14'), +('7', '81', '6', '46884', '48148', '14'), +('7', '81', '17', '102020', '33843', '14'), +('7', '81', '17', '102272', '30869', '14'), +('7', '81', '17', '68978', '30292', '14'), +('7', '81', '17', '47650', '26137', '14'), +('7', '81', '7', '102018', '50723', '14'), +('7', '81', '7', '102270', '50258', '14'), +('7', '81', '7', '39357', '45064', '14'), +('7', '81', '7', '83566', '43214', '14'), +('7', '81', '9', '46888', '62730', '14'), +('7', '81', '9', '102289', '52552', '14'), +('7', '81', '9', '39346', '49341', '14'), +('7', '81', '9', '67098', '47684', '14'), +('7', '81', '15', '102595', '97783', '14'), +('7', '81', '15', '102636', '96473', '14'), +('7', '81', '15', '102637', '96008', '14'), +('7', '81', '15', '102635', '95188', '14'), +('7', '81', '20', '102596', '96181', '14'), +('7', '81', '20', '102553', '87876', '14'), +('7', '81', '20', '80688', '78108', '14'), +('7', '81', '20', '46935', '59723', '14'), +('7', '81', '12', '102267', '55837', '14'), +('7', '81', '12', '83570', '38003', '14'), +('7', '81', '12', '47214', '37571', '14'), +('7', '81', '12', '70898', '36602', '14'), +('7', '81', '18', '102271', '47063', '14'), +('7', '81', '18', '102019', '42704', '14'), +('7', '81', '18', '68979', '32308', '14'), +('7', '81', '18', '70901', '30314', '14'), +('7', '81', '19', '102268', '49520', '14'), +('7', '81', '19', '83574', '42440', '14'), +('7', '81', '19', '76131', '41335', '14'), +('7', '81', '19', '70899', '40214', '14'), +('7', '81', '13', '102665', '326011', '14'), +('7', '81', '13', '102588', '271037', '14'), +('7', '81', '13', '102666', '268649', '14'), +('7', '81', '13', '80684', '247717', '14'), +('7', '81', '14', '102665', '326011', '14'), +('7', '81', '14', '102588', '271037', '14'), +('7', '81', '14', '102666', '268649', '14'), +('7', '81', '14', '80684', '247717', '14'), +('7', '81', '11', '102643', '74574', '14'), +('7', '81', '11', '102747', '72545', '14'), +('7', '81', '11', '80668', '58637', '14'), +('7', '81', '11', '102747', '54840', '14'), +('7', '82', '22', '21805', '0', '14'), +('7', '82', '22', '61948', '0', '14'), +('7', '82', '22', '21807', '0', '14'), +('7', '82', '22', '12425', '0', '14'), +('7', '82', '1', '102590', '95137', '14'), +('7', '82', '1', '102641', '95132', '14'), +('7', '82', '1', '102639', '93857', '14'), +('7', '82', '1', '102642', '93619', '14'), +('7', '82', '2', '102017', '57157', '14'), +('7', '82', '2', '102269', '51377', '14'), +('7', '82', '2', '70895', '45130', '14'), +('7', '82', '2', '83562', '42210', '14'), +('7', '82', '3', '102726', '104405', '14'), +('7', '82', '3', '102591', '101247', '14'), +('7', '82', '3', '102725', '90520', '14'), +('7', '82', '3', '102724', '76710', '14'), +('7', '82', '5', '102745', '91519', '14'), +('7', '82', '5', '102592', '83784', '14'), +('7', '82', '5', '102551', '82499', '14'), +('7', '82', '5', '102743', '68855', '14'), +('7', '82', '8', '102594', '74107', '14'), +('7', '82', '8', '102552', '64885', '14'), +('7', '82', '8', '80687', '57451', '14'), +('7', '82', '8', '46885', '54110', '14'), +('7', '82', '6', '102555', '68075', '14'), +('7', '82', '6', '102593', '64018', '14'), +('7', '82', '6', '39367', '50351', '14'), +('7', '82', '6', '46884', '48151', '14'), +('7', '82', '17', '102020', '33844', '14'), +('7', '82', '17', '102272', '30870', '14'), +('7', '82', '17', '68978', '30294', '14'), +('7', '82', '17', '47650', '26139', '14'), +('7', '82', '7', '102018', '50726', '14'), +('7', '82', '7', '102270', '50260', '14'), +('7', '82', '7', '39357', '45067', '14'), +('7', '82', '7', '83566', '43216', '14'), +('7', '82', '9', '46888', '62734', '14'), +('7', '82', '9', '102289', '52555', '14'), +('7', '82', '9', '39346', '49344', '14'), +('7', '82', '9', '67098', '48273', '14'), +('7', '82', '15', '102595', '97786', '14'), +('7', '82', '15', '102636', '96476', '14'), +('7', '82', '15', '102637', '96011', '14'), +('7', '82', '15', '102635', '95190', '14'), +('7', '82', '20', '102596', '96183', '14'), +('7', '82', '20', '102553', '87880', '14'), +('7', '82', '20', '80688', '78111', '14'), +('7', '82', '20', '46935', '59726', '14'), +('7', '82', '12', '102267', '55838', '14'), +('7', '82', '12', '83570', '38006', '14'), +('7', '82', '12', '47214', '37571', '14'), +('7', '82', '12', '70898', '36605', '14'), +('7', '82', '18', '102271', '47065', '14'), +('7', '82', '18', '102019', '42705', '14'), +('7', '82', '18', '68979', '32310', '14'), +('7', '82', '18', '70901', '30316', '14'), +('7', '82', '19', '102268', '49522', '14'), +('7', '82', '19', '83574', '42442', '14'), +('7', '82', '19', '76131', '41335', '14'), +('7', '82', '19', '70899', '40214', '14'), +('7', '82', '13', '102665', '326582', '14'), +('7', '82', '13', '102588', '271535', '14'), +('7', '82', '13', '102666', '269025', '14'), +('7', '82', '13', '80684', '248059', '14'), +('7', '82', '14', '102665', '326582', '14'), +('7', '82', '14', '102588', '271535', '14'), +('7', '82', '14', '102666', '269025', '14'), +('7', '82', '14', '80684', '248059', '14'), +('7', '82', '11', '102643', '74575', '14'), +('7', '82', '11', '102747', '72546', '14'), +('7', '82', '11', '80668', '58640', '14'), +('7', '82', '11', '102747', '54841', '14'), +('7', '83', '22', '21805', '0', '14'), +('7', '83', '22', '61948', '0', '14'), +('7', '83', '22', '21807', '0', '14'), +('7', '83', '22', '12425', '0', '14'), +('7', '83', '1', '102590', '95140', '14'), +('7', '83', '1', '102641', '95134', '14'), +('7', '83', '1', '102639', '93861', '14'), +('7', '83', '1', '102642', '93620', '14'), +('7', '83', '2', '102017', '57160', '14'), +('7', '83', '2', '102269', '51379', '14'), +('7', '83', '2', '70895', '45132', '14'), +('7', '83', '2', '83562', '42213', '14'), +('7', '83', '3', '102726', '104409', '14'), +('7', '83', '3', '102591', '101249', '14'), +('7', '83', '3', '102725', '90523', '14'), +('7', '83', '3', '102724', '76712', '14'), +('7', '83', '5', '102745', '91522', '14'), +('7', '83', '5', '102592', '83786', '14'), +('7', '83', '5', '102551', '82500', '14'), +('7', '83', '5', '102743', '68857', '14'), +('7', '83', '8', '102594', '74108', '14'), +('7', '83', '8', '102552', '64887', '14'), +('7', '83', '8', '80687', '57453', '14'), +('7', '83', '8', '46885', '54112', '14'), +('7', '83', '6', '102555', '68077', '14'), +('7', '83', '6', '102593', '64020', '14'), +('7', '83', '6', '39367', '50353', '14'), +('7', '83', '6', '46884', '48153', '14'), +('7', '83', '17', '102020', '33844', '14'), +('7', '83', '17', '102272', '30871', '14'), +('7', '83', '17', '68978', '30296', '14'), +('7', '83', '17', '47650', '26141', '14'), +('7', '83', '7', '102018', '50729', '14'), +('7', '83', '7', '102270', '50262', '14'), +('7', '83', '7', '39357', '45068', '14'), +('7', '83', '7', '83566', '43218', '14'), +('7', '83', '9', '46888', '62737', '14'), +('7', '83', '9', '102289', '52557', '14'), +('7', '83', '9', '39346', '49347', '14'), +('7', '83', '9', '67098', '48863', '14'), +('7', '83', '15', '102595', '97789', '14'), +('7', '83', '15', '102636', '96478', '14'), +('7', '83', '15', '102637', '96014', '14'), +('7', '83', '15', '102635', '95191', '14'), +('7', '83', '20', '102596', '96184', '14'), +('7', '83', '20', '102553', '87883', '14'), +('7', '83', '20', '80688', '78113', '14'), +('7', '83', '20', '46935', '59729', '14'), +('7', '83', '12', '102267', '55840', '14'), +('7', '83', '12', '83570', '38008', '14'), +('7', '83', '12', '47214', '37571', '14'), +('7', '83', '12', '70898', '36607', '14'), +('7', '83', '18', '102271', '47068', '14'), +('7', '83', '18', '102019', '42705', '14'), +('7', '83', '18', '68979', '32311', '14'), +('7', '83', '18', '70901', '30317', '14'), +('7', '83', '19', '102268', '49523', '14'), +('7', '83', '19', '83574', '42445', '14'), +('7', '83', '19', '76131', '41335', '14'), +('7', '83', '19', '70899', '40214', '14'), +('7', '83', '13', '102665', '327152', '14'), +('7', '83', '13', '102588', '271993', '14'), +('7', '83', '13', '102666', '269364', '14'), +('7', '83', '13', '80684', '248444', '14'), +('7', '83', '14', '102665', '327152', '14'), +('7', '83', '14', '102588', '271993', '14'), +('7', '83', '14', '102666', '269364', '14'), +('7', '83', '14', '80684', '248444', '14'), +('7', '83', '11', '102643', '74575', '14'), +('7', '83', '11', '102747', '72548', '14'), +('7', '83', '11', '80668', '58643', '14'), +('7', '83', '11', '102747', '54842', '14'), +('7', '84', '22', '21805', '0', '14'), +('7', '84', '22', '61948', '0', '14'), +('7', '84', '22', '21807', '0', '14'), +('7', '84', '22', '12425', '0', '14'), +('7', '84', '1', '102590', '95143', '14'), +('7', '84', '1', '102641', '95135', '14'), +('7', '84', '1', '102639', '93864', '14'), +('7', '84', '1', '102642', '93621', '14'), +('7', '84', '2', '102017', '57162', '14'), +('7', '84', '2', '102269', '51380', '14'), +('7', '84', '2', '70895', '45134', '14'), +('7', '84', '2', '83562', '42215', '14'), +('7', '84', '3', '102726', '104412', '14'), +('7', '84', '3', '102591', '101251', '14'), +('7', '84', '3', '102725', '90525', '14'), +('7', '84', '3', '102724', '76713', '14'), +('7', '84', '5', '102745', '91525', '14'), +('7', '84', '5', '102592', '83788', '14'), +('7', '84', '5', '102551', '82501', '14'), +('7', '84', '5', '102743', '68859', '14'), +('7', '84', '8', '102594', '74109', '14'), +('7', '84', '8', '102552', '64889', '14'), +('7', '84', '8', '80687', '57455', '14'), +('7', '84', '8', '46885', '54114', '14'), +('7', '84', '6', '102555', '68079', '14'), +('7', '84', '6', '102593', '64023', '14'), +('7', '84', '6', '39367', '50355', '14'), +('7', '84', '6', '46884', '48155', '14'), +('7', '84', '17', '102020', '33845', '14'), +('7', '84', '17', '102272', '30872', '14'), +('7', '84', '17', '68978', '30298', '14'), +('7', '84', '17', '47650', '26143', '14'), +('7', '84', '7', '102018', '50731', '14'), +('7', '84', '7', '102270', '50263', '14'), +('7', '84', '7', '39357', '45070', '14'), +('7', '84', '7', '83566', '43221', '14'), +('7', '84', '9', '46888', '62740', '14'), +('7', '84', '9', '102289', '52558', '14'), +('7', '84', '9', '67098', '49452', '14'), +('7', '84', '9', '39346', '49350', '14'), +('7', '84', '15', '102595', '97791', '14'), +('7', '84', '15', '102636', '96480', '14'), +('7', '84', '15', '102637', '96018', '14'), +('7', '84', '15', '102635', '95193', '14'), +('7', '84', '20', '102596', '96186', '14'), +('7', '84', '20', '102553', '87886', '14'), +('7', '84', '20', '80688', '78116', '14'), +('7', '84', '20', '46935', '59732', '14'), +('7', '84', '12', '102267', '55841', '14'), +('7', '84', '12', '83570', '38010', '14'), +('7', '84', '12', '47214', '37571', '14'), +('7', '84', '12', '70898', '36610', '14'), +('7', '84', '18', '102271', '47070', '14'), +('7', '84', '18', '102019', '42706', '14'), +('7', '84', '18', '68979', '32312', '14'), +('7', '84', '18', '70901', '30319', '14'), +('7', '84', '19', '102268', '49525', '14'), +('7', '84', '19', '83574', '42447', '14'), +('7', '84', '19', '76131', '41335', '14'), +('7', '84', '19', '70899', '40214', '14'), +('7', '84', '13', '102665', '327766', '14'), +('7', '84', '13', '102588', '272490', '14'), +('7', '84', '13', '102666', '269739', '14'), +('7', '84', '13', '80684', '248786', '14'), +('7', '84', '14', '102665', '327766', '14'), +('7', '84', '14', '102588', '272490', '14'), +('7', '84', '14', '102666', '269739', '14'), +('7', '84', '14', '80684', '248786', '14'), +('7', '84', '11', '102643', '74576', '14'), +('7', '84', '11', '102747', '72550', '14'), +('7', '84', '11', '80668', '58645', '14'), +('7', '84', '11', '102747', '54842', '14'), +('7', '85', '22', '12425', '0', '16'), +('7', '85', '22', '21807', '0', '16'), +('7', '85', '22', '21805', '0', '16'), +('7', '85', '22', '39342', '0', '16'), +('7', '85', '1', '111303', '181775', '16'), +('7', '85', '1', '111308', '181631', '16'), +('7', '85', '1', '111300', '180662', '16'), +('7', '85', '1', '111302', '180069', '16'), +('7', '85', '2', '104417', '94867', '16'), +('7', '85', '2', '94056', '77481', '16'), +('7', '85', '2', '49656', '72011', '16'), +('7', '85', '2', '62985', '59172', '16'), +('7', '85', '3', '111316', '177812', '16'), +('7', '85', '3', '111313', '170411', '16'), +('7', '85', '3', '111012', '158821', '16'), +('7', '85', '3', '111015', '155997', '16'), +('7', '85', '5', '111318', '169975', '16'), +('7', '85', '5', '111321', '169492', '16'), +('7', '85', '5', '111017', '158386', '16'), +('7', '85', '5', '111319', '148882', '16'), +('7', '85', '8', '111331', '166828', '16'), +('7', '85', '8', '111332', '149930', '16'), +('7', '85', '8', '111031', '137019', '16'), +('7', '85', '8', '111030', '130063', '16'), +('7', '85', '6', '111322', '152268', '16'), +('7', '85', '6', '111326', '149030', '16'), +('7', '85', '6', '111021', '133897', '16'), +('7', '85', '6', '111024', '133443', '16'), +('7', '85', '17', '49656', '72011', '16'), +('7', '85', '17', '56084', '55111', '16'), +('7', '85', '17', '56045', '53694', '16'), +('7', '85', '17', '104420', '49127', '16'), +('7', '85', '7', '56040', '95808', '16'), +('7', '85', '7', '56079', '89124', '16'), +('7', '85', '7', '104418', '84178', '16'), +('7', '85', '7', '49656', '72011', '16'), +('7', '85', '9', '62992', '111542', '16'), +('7', '85', '9', '104414', '91539', '16'), +('7', '85', '9', '49656', '72011', '16'), +('7', '85', '9', '54836', '71017', '16'), +('7', '85', '15', '111343', '182361', '16'), +('7', '85', '15', '111347', '181373', '16'), +('7', '85', '15', '111339', '178637', '16'), +('7', '85', '15', '111346', '178542', '16'), +('7', '85', '20', '111354', '188769', '16'), +('7', '85', '20', '111351', '183955', '16'), +('7', '85', '20', '111352', '182512', '16'), +('7', '85', '20', '111050', '162748', '16'), +('7', '85', '12', '56074', '104458', '16'), +('7', '85', '12', '104415', '93543', '16'), +('7', '85', '12', '81795', '83049', '16'), +('7', '85', '12', '49656', '72011', '16'), +('7', '85', '18', '62986', '82539', '16'), +('7', '85', '18', '49656', '72011', '16'), +('7', '85', '18', '104419', '67146', '16'), +('7', '85', '18', '54851', '53926', '16'), +('7', '85', '19', '62990', '102768', '16'), +('7', '85', '19', '104416', '86727', '16'), +('7', '85', '19', '49656', '72011', '16'), +('7', '85', '19', '102268', '49526', '16'), +('7', '85', '13', '111527', '504052', '16'), +('7', '85', '13', '111528', '460347', '16'), +('7', '85', '13', '111227', '440151', '16'), +('7', '85', '13', '111228', '423349', '16'), +('7', '85', '14', '111527', '504052', '16'), +('7', '85', '14', '111528', '460347', '16'), +('7', '85', '14', '111227', '440151', '16'), +('7', '85', '14', '111228', '423349', '16'), +('7', '85', '11', '111337', '143312', '16'), +('7', '85', '11', '111034', '131949', '16'), +('7', '85', '11', '111036', '131132', '16'), +('7', '85', '11', '111032', '122249', '16'), +('7', '85', '22', '21807', '0', '15'), +('7', '85', '22', '21805', '0', '15'), +('7', '85', '22', '61948', '0', '15'), +('7', '85', '22', '12425', '0', '15'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '85', '1', '107054', '135666', '15'), +('7', '85', '1', '107010', '133284', '15'), +('7', '85', '1', '107053', '132185', '15'), +('7', '85', '1', '107052', '129516', '15'), +('7', '85', '2', '104417', '94867', '15'), +('7', '85', '2', '94056', '77481', '15'), +('7', '85', '2', '62985', '59172', '15'), +('7', '85', '2', '102017', '57164', '15'), +('7', '85', '3', '107011', '136216', '15'), +('7', '85', '3', '106801', '120336', '15'), +('7', '85', '3', '106841', '114613', '15'), +('7', '85', '3', '107055', '109432', '15'), +('7', '85', '5', '107056', '129781', '15'), +('7', '85', '5', '107012', '125796', '15'), +('7', '85', '5', '62956', '112572', '15'), +('7', '85', '5', '106802', '111534', '15'), +('7', '85', '8', '106804', '115984', '15'), +('7', '85', '8', '106716', '108405', '15'), +('7', '85', '8', '107058', '106133', '15'), +('7', '85', '8', '106844', '102749', '15'), +('7', '85', '6', '107013', '113605', '15'), +('7', '85', '6', '107057', '108821', '15'), +('7', '85', '6', '106803', '104441', '15'), +('7', '85', '6', '56095', '88615', '15'), +('7', '85', '17', '56084', '55111', '15'), +('7', '85', '17', '56045', '53694', '15'), +('7', '85', '17', '104420', '49127', '15'), +('7', '85', '17', '102020', '33845', '15'), +('7', '85', '7', '56040', '95808', '15'), +('7', '85', '7', '56079', '89124', '15'), +('7', '85', '7', '104418', '84178', '15'), +('7', '85', '7', '54848', '55077', '15'), +('7', '85', '9', '62992', '111542', '15'), +('7', '85', '9', '104414', '91539', '15'), +('7', '85', '9', '54836', '71017', '15'), +('7', '85', '9', '46888', '62743', '15'), +('7', '85', '15', '107062', '133741', '15'), +('7', '85', '15', '107051', '132269', '15'), +('7', '85', '15', '107016', '131747', '15'), +('7', '85', '15', '107050', '129990', '15'), +('7', '85', '20', '107059', '127753', '15'), +('7', '85', '20', '107017', '125336', '15'), +('7', '85', '20', '62995', '122144', '15'), +('7', '85', '20', '106845', '114205', '15'), +('7', '85', '12', '56074', '104458', '15'), +('7', '85', '12', '104415', '93543', '15'), +('7', '85', '12', '81795', '83049', '15'), +('7', '85', '12', '102267', '55843', '15'), +('7', '85', '18', '62986', '82539', '15'), +('7', '85', '18', '104419', '67146', '15'), +('7', '85', '18', '54851', '53926', '15'), +('7', '85', '18', '102271', '47072', '15'), +('7', '85', '19', '62990', '102768', '15'), +('7', '85', '19', '104416', '86727', '15'), +('7', '85', '19', '102268', '49526', '15'), +('7', '85', '19', '83574', '42449', '15'), +('7', '85', '13', '106867', '387056', '15'), +('7', '85', '13', '106868', '377872', '15'), +('7', '85', '13', '102665', '328336', '15'), +('7', '85', '13', '106767', '324963', '15'), +('7', '85', '14', '106867', '387056', '15'), +('7', '85', '14', '106868', '377872', '15'), +('7', '85', '14', '102665', '328336', '15'), +('7', '85', '14', '106767', '324963', '15'), +('7', '85', '11', '62965', '102382', '15'), +('7', '85', '11', '106717', '99554', '15'), +('7', '85', '11', '56099', '94345', '15'), +('7', '85', '11', '107015', '88330', '15'), +('7', '86', '22', '12425', '0', '16'), +('7', '86', '22', '21807', '0', '16'), +('7', '86', '22', '21805', '0', '16'), +('7', '86', '22', '39342', '0', '16'), +('7', '86', '1', '111303', '181779', '16'), +('7', '86', '1', '111308', '181634', '16'), +('7', '86', '1', '111300', '180664', '16'), +('7', '86', '1', '111302', '180072', '16'), +('7', '86', '2', '104417', '94870', '16'), +('7', '86', '2', '94056', '77483', '16'), +('7', '86', '2', '49656', '72012', '16'), +('7', '86', '2', '62985', '59173', '16'), +('7', '86', '3', '111316', '177815', '16'), +('7', '86', '3', '111313', '170413', '16'), +('7', '86', '3', '111012', '158823', '16'), +('7', '86', '3', '111015', '156000', '16'), +('7', '86', '5', '111318', '169977', '16'), +('7', '86', '5', '111321', '169494', '16'), +('7', '86', '5', '111017', '158389', '16'), +('7', '86', '5', '111319', '148885', '16'), +('7', '86', '8', '111331', '166831', '16'), +('7', '86', '8', '111332', '149932', '16'), +('7', '86', '8', '111031', '137021', '16'), +('7', '86', '8', '111030', '130066', '16'), +('7', '86', '6', '111322', '152270', '16'), +('7', '86', '6', '111326', '149032', '16'), +('7', '86', '6', '111021', '133899', '16'), +('7', '86', '6', '111024', '133445', '16'), +('7', '86', '17', '49656', '72012', '16'), +('7', '86', '17', '56084', '55113', '16'), +('7', '86', '17', '56045', '53695', '16'), +('7', '86', '17', '104420', '49129', '16'), +('7', '86', '7', '56040', '95811', '16'), +('7', '86', '7', '56079', '89127', '16'), +('7', '86', '7', '104418', '84179', '16'), +('7', '86', '7', '49656', '72012', '16'), +('7', '86', '9', '62992', '111544', '16'), +('7', '86', '9', '104414', '91542', '16'), +('7', '86', '9', '49656', '72012', '16'), +('7', '86', '9', '54836', '71019', '16'), +('7', '86', '15', '111343', '182363', '16'), +('7', '86', '15', '111347', '181377', '16'), +('7', '86', '15', '111339', '178639', '16'), +('7', '86', '15', '111346', '178545', '16'), +('7', '86', '20', '111354', '188771', '16'), +('7', '86', '20', '111351', '183957', '16'), +('7', '86', '20', '111352', '182515', '16'), +('7', '86', '20', '111050', '162750', '16'), +('7', '86', '12', '56074', '104459', '16'), +('7', '86', '12', '104415', '93546', '16'), +('7', '86', '12', '81795', '83051', '16'), +('7', '86', '12', '49656', '72012', '16'), +('7', '86', '18', '62986', '82542', '16'), +('7', '86', '18', '49656', '72012', '16'), +('7', '86', '18', '104419', '67148', '16'), +('7', '86', '18', '54851', '53928', '16'), +('7', '86', '19', '62990', '102771', '16'), +('7', '86', '19', '104416', '86728', '16'), +('7', '86', '19', '49656', '72012', '16'), +('7', '86', '19', '102268', '49528', '16'), +('7', '86', '13', '111527', '504947', '16'), +('7', '86', '13', '111528', '460887', '16'), +('7', '86', '13', '111227', '440955', '16'), +('7', '86', '13', '111228', '423848', '16'), +('7', '86', '14', '111527', '504947', '16'), +('7', '86', '14', '111528', '460887', '16'), +('7', '86', '14', '111227', '440955', '16'), +('7', '86', '14', '111228', '423848', '16'), +('7', '86', '11', '111337', '143314', '16'), +('7', '86', '11', '111034', '131951', '16'), +('7', '86', '11', '111036', '131134', '16'), +('7', '86', '11', '111032', '122251', '16'), +('7', '87', '22', '12425', '0', '16'), +('7', '87', '22', '21807', '0', '16'), +('7', '87', '22', '21805', '0', '16'), +('7', '87', '22', '39342', '0', '16'), +('7', '87', '1', '111303', '181782', '16'), +('7', '87', '1', '111308', '181636', '16'), +('7', '87', '1', '111300', '180666', '16'), +('7', '87', '1', '111302', '180075', '16'), +('7', '87', '2', '104417', '94872', '16'), +('7', '87', '2', '94056', '77484', '16'), +('7', '87', '2', '49656', '72012', '16'), +('7', '87', '2', '62985', '59173', '16'), +('7', '87', '3', '111316', '177817', '16'), +('7', '87', '3', '111313', '170415', '16'), +('7', '87', '3', '111012', '158825', '16'), +('7', '87', '3', '111015', '156002', '16'), +('7', '87', '5', '111318', '169979', '16'), +('7', '87', '5', '111321', '169497', '16'), +('7', '87', '5', '111017', '158390', '16'), +('7', '87', '5', '111319', '148888', '16'), +('7', '87', '8', '111331', '166833', '16'), +('7', '87', '8', '111332', '149933', '16'), +('7', '87', '8', '111031', '137023', '16'), +('7', '87', '8', '111030', '130068', '16'), +('7', '87', '6', '111322', '152272', '16'), +('7', '87', '6', '111326', '149034', '16'), +('7', '87', '6', '111021', '133901', '16'), +('7', '87', '6', '111024', '133447', '16'), +('7', '87', '17', '49656', '72012', '16'), +('7', '87', '17', '56084', '55115', '16'), +('7', '87', '17', '56045', '53696', '16'), +('7', '87', '17', '104420', '49131', '16'), +('7', '87', '7', '56040', '95813', '16'), +('7', '87', '7', '56079', '89129', '16'), +('7', '87', '7', '104418', '84181', '16'), +('7', '87', '7', '49656', '72012', '16'), +('7', '87', '9', '62992', '111547', '16'), +('7', '87', '9', '104414', '91544', '16'), +('7', '87', '9', '49656', '72012', '16'), +('7', '87', '9', '54836', '71021', '16'), +('7', '87', '15', '111343', '182365', '16'), +('7', '87', '15', '111347', '181379', '16'), +('7', '87', '15', '111339', '178641', '16'), +('7', '87', '15', '111346', '178547', '16'), +('7', '87', '20', '111354', '188773', '16'), +('7', '87', '20', '111351', '183958', '16'), +('7', '87', '20', '111352', '182517', '16'), +('7', '87', '20', '111050', '162751', '16'), +('7', '87', '12', '56074', '104460', '16'), +('7', '87', '12', '104415', '93549', '16'), +('7', '87', '12', '81795', '83054', '16'), +('7', '87', '12', '49656', '72012', '16'), +('7', '87', '18', '62986', '82544', '16'), +('7', '87', '18', '49656', '72012', '16'), +('7', '87', '18', '104419', '67150', '16'), +('7', '87', '18', '54851', '53929', '16'), +('7', '87', '19', '62990', '102773', '16'), +('7', '87', '19', '104416', '86729', '16'), +('7', '87', '19', '49656', '72012', '16'), +('7', '87', '19', '102268', '49530', '16'), +('7', '87', '13', '111527', '505842', '16'), +('7', '87', '13', '111528', '461469', '16'), +('7', '87', '13', '111227', '441760', '16'), +('7', '87', '13', '111228', '424346', '16'), +('7', '87', '14', '111527', '505842', '16'), +('7', '87', '14', '111528', '461469', '16'), +('7', '87', '14', '111227', '441760', '16'), +('7', '87', '14', '111228', '424346', '16'), +('7', '87', '11', '111337', '143316', '16'), +('7', '87', '11', '111034', '131953', '16'), +('7', '87', '11', '111036', '131136', '16'), +('7', '87', '11', '111032', '122252', '16'), +('7', '88', '22', '12425', '0', '16'), +('7', '88', '22', '21807', '0', '16'), +('7', '88', '22', '21805', '0', '16'), +('7', '88', '22', '39342', '0', '16'), +('7', '88', '1', '111303', '181785', '16'), +('7', '88', '1', '111308', '181639', '16'), +('7', '88', '1', '111300', '180668', '16'), +('7', '88', '1', '111302', '180078', '16'), +('7', '88', '2', '104417', '94874', '16'), +('7', '88', '2', '94056', '77486', '16'), +('7', '88', '2', '49656', '72012', '16'), +('7', '88', '2', '62985', '59174', '16'), +('7', '88', '3', '111316', '177820', '16'), +('7', '88', '3', '111313', '170417', '16'), +('7', '88', '3', '111012', '158827', '16'), +('7', '88', '3', '111015', '156005', '16'), +('7', '88', '5', '111318', '169981', '16'), +('7', '88', '5', '111321', '169499', '16'), +('7', '88', '5', '111017', '158392', '16'), +('7', '88', '5', '111319', '148890', '16'), +('7', '88', '8', '111331', '166836', '16'), +('7', '88', '8', '111332', '149935', '16'), +('7', '88', '8', '111031', '137024', '16'), +('7', '88', '8', '111030', '130070', '16'), +('7', '88', '6', '111322', '152273', '16'), +('7', '88', '6', '111326', '149036', '16'), +('7', '88', '6', '111021', '133903', '16'), +('7', '88', '6', '111024', '133449', '16'), +('7', '88', '17', '49656', '72012', '16'), +('7', '88', '17', '56084', '55116', '16'), +('7', '88', '17', '56045', '53697', '16'), +('7', '88', '17', '104420', '49133', '16'), +('7', '88', '7', '56040', '95815', '16'), +('7', '88', '7', '56079', '89131', '16'), +('7', '88', '7', '104418', '84182', '16'), +('7', '88', '7', '49656', '72012', '16'), +('7', '88', '9', '62992', '111549', '16'), +('7', '88', '9', '104414', '91546', '16'), +('7', '88', '9', '49656', '72012', '16'), +('7', '88', '9', '54836', '71023', '16'), +('7', '88', '15', '111343', '182367', '16'), +('7', '88', '15', '111347', '181382', '16'), +('7', '88', '15', '111339', '178643', '16'), +('7', '88', '15', '111346', '178549', '16'), +('7', '88', '20', '111354', '188775', '16'), +('7', '88', '20', '111351', '183960', '16'), +('7', '88', '20', '111352', '182520', '16'), +('7', '88', '20', '111050', '162753', '16'), +('7', '88', '12', '56074', '104462', '16'), +('7', '88', '12', '104415', '93552', '16'), +('7', '88', '12', '81795', '83056', '16'), +('7', '88', '12', '49656', '72012', '16'), +('7', '88', '18', '62986', '82546', '16'), +('7', '88', '18', '49656', '72012', '16'), +('7', '88', '18', '104419', '67151', '16'), +('7', '88', '18', '54851', '53931', '16'), +('7', '88', '19', '62990', '102775', '16'), +('7', '88', '19', '104416', '86731', '16'), +('7', '88', '19', '49656', '72012', '16'), +('7', '88', '19', '102268', '49531', '16'), +('7', '88', '13', '111527', '506738', '16'), +('7', '88', '13', '111528', '462008', '16'), +('7', '88', '13', '111227', '442564', '16'), +('7', '88', '13', '111228', '424845', '16'), +('7', '88', '14', '111527', '506738', '16'), +('7', '88', '14', '111528', '462008', '16'), +('7', '88', '14', '111227', '442564', '16'), +('7', '88', '14', '111228', '424845', '16'), +('7', '88', '11', '111337', '143318', '16'), +('7', '88', '11', '111034', '131954', '16'), +('7', '88', '11', '111036', '131138', '16'), +('7', '88', '11', '111032', '122254', '16'), +('7', '89', '22', '12425', '0', '16'), +('7', '89', '22', '21807', '0', '16'), +('7', '89', '22', '21805', '0', '16'), +('7', '89', '22', '39342', '0', '16'), +('7', '89', '1', '111303', '181789', '16'), +('7', '89', '1', '111308', '181642', '16'), +('7', '89', '1', '111300', '180670', '16'), +('7', '89', '1', '111302', '180081', '16'), +('7', '89', '2', '104417', '94877', '16'), +('7', '89', '2', '94056', '77487', '16'), +('7', '89', '2', '49656', '72013', '16'), +('7', '89', '2', '62985', '59175', '16'), +('7', '89', '3', '111316', '177823', '16'), +('7', '89', '3', '111313', '170419', '16'), +('7', '89', '3', '111012', '158829', '16'), +('7', '89', '3', '111015', '156008', '16'), +('7', '89', '5', '111318', '169983', '16'), +('7', '89', '5', '111321', '169501', '16'), +('7', '89', '5', '111017', '158394', '16'), +('7', '89', '5', '111319', '148893', '16'), +('7', '89', '8', '111331', '166839', '16'), +('7', '89', '8', '111332', '149937', '16'), +('7', '89', '8', '111031', '137026', '16'), +('7', '89', '8', '111030', '130073', '16'), +('7', '89', '6', '111322', '152275', '16'), +('7', '89', '6', '111326', '149038', '16'), +('7', '89', '6', '111021', '133905', '16'), +('7', '89', '6', '111024', '133451', '16'), +('7', '89', '17', '49656', '72013', '16'), +('7', '89', '17', '56084', '55118', '16'), +('7', '89', '17', '56045', '53699', '16'), +('7', '89', '17', '104420', '49135', '16'), +('7', '89', '7', '56040', '95818', '16'), +('7', '89', '7', '56079', '89133', '16'), +('7', '89', '7', '104418', '84184', '16'), +('7', '89', '7', '49656', '72013', '16'), +('7', '89', '9', '62992', '111552', '16'), +('7', '89', '9', '104414', '91549', '16'), +('7', '89', '9', '49656', '72013', '16'), +('7', '89', '9', '54836', '71025', '16'), +('7', '89', '15', '111343', '182369', '16'), +('7', '89', '15', '111347', '181386', '16'), +('7', '89', '15', '111339', '178645', '16'), +('7', '89', '15', '111346', '178552', '16'), +('7', '89', '20', '111354', '188778', '16'), +('7', '89', '20', '111351', '183961', '16'), +('7', '89', '20', '111352', '182523', '16'), +('7', '89', '20', '111050', '162754', '16'), +('7', '89', '12', '56074', '104463', '16'), +('7', '89', '12', '104415', '93555', '16'), +('7', '89', '12', '81795', '83058', '16'), +('7', '89', '12', '49656', '72013', '16'), +('7', '89', '18', '62986', '82549', '16'), +('7', '89', '18', '49656', '72013', '16'), +('7', '89', '18', '104419', '67153', '16'), +('7', '89', '18', '54851', '53933', '16'), +('7', '89', '19', '62990', '102777', '16'), +('7', '89', '19', '104416', '86732', '16'), +('7', '89', '19', '49656', '72013', '16'), +('7', '89', '19', '102268', '49533', '16'), +('7', '89', '13', '111527', '507591', '16'), +('7', '89', '13', '111528', '462549', '16'), +('7', '89', '13', '111227', '443328', '16'), +('7', '89', '13', '111228', '425344', '16'), +('7', '89', '14', '111527', '507591', '16'), +('7', '89', '14', '111528', '462549', '16'), +('7', '89', '14', '111227', '443328', '16'), +('7', '89', '14', '111228', '425344', '16'), +('7', '89', '11', '111337', '143320', '16'), +('7', '89', '11', '111034', '131956', '16'), +('7', '89', '11', '111036', '131140', '16'), +('7', '89', '11', '111032', '122255', '16'), +('7', '90', '22', '12425', '0', '17'), +('7', '90', '22', '21807', '0', '17'), +('7', '90', '22', '21805', '0', '17'), +('7', '90', '22', '39342', '0', '17'), +('7', '90', '1', '111303', '181792', '17'), +('7', '90', '1', '111308', '181644', '17'), +('7', '90', '1', '111300', '180672', '17'), +('7', '90', '1', '111302', '180084', '17'), +('7', '90', '2', '104417', '94879', '17'), +('7', '90', '2', '94056', '77489', '17'), +('7', '90', '2', '49656', '72013', '17'), +('7', '90', '2', '62985', '59176', '17'), +('7', '90', '3', '111316', '177825', '17'), +('7', '90', '3', '111313', '170420', '17'), +('7', '90', '3', '111012', '158831', '17'), +('7', '90', '3', '111015', '156010', '17'), +('7', '90', '5', '111318', '169985', '17'), +('7', '90', '5', '111321', '169504', '17'), +('7', '90', '5', '111017', '158396', '17'), +('7', '90', '5', '111319', '148896', '17'), +('7', '90', '8', '111331', '166841', '17'), +('7', '90', '8', '111332', '149938', '17'), +('7', '90', '8', '111031', '137028', '17'), +('7', '90', '8', '111030', '130075', '17'), +('7', '90', '6', '111322', '152277', '17'), +('7', '90', '6', '111326', '149040', '17'), +('7', '90', '6', '111021', '133907', '17'), +('7', '90', '6', '111024', '133452', '17'), +('7', '90', '17', '49656', '72013', '17'), +('7', '90', '17', '56084', '55120', '17'), +('7', '90', '17', '56045', '53700', '17'), +('7', '90', '17', '104420', '49137', '17'), +('7', '90', '7', '56040', '95820', '17'), +('7', '90', '7', '56079', '89136', '17'), +('7', '90', '7', '104418', '84185', '17'), +('7', '90', '7', '49656', '72013', '17'), +('7', '90', '9', '62992', '111554', '17'), +('7', '90', '9', '104414', '91551', '17'), +('7', '90', '9', '49656', '72013', '17'), +('7', '90', '9', '54836', '71027', '17'), +('7', '90', '15', '111343', '182371', '17'), +('7', '90', '15', '111347', '181388', '17'), +('7', '90', '15', '111339', '178647', '17'), +('7', '90', '15', '111346', '178554', '17'), +('7', '90', '20', '111354', '188780', '17'), +('7', '90', '20', '111351', '183963', '17'), +('7', '90', '20', '111352', '182525', '17'), +('7', '90', '20', '111050', '162756', '17'), +('7', '90', '12', '56074', '104464', '17'), +('7', '90', '12', '104415', '93558', '17'), +('7', '90', '12', '81795', '83060', '17'), +('7', '90', '12', '49656', '72013', '17'), +('7', '90', '18', '62986', '82552', '17'), +('7', '90', '18', '49656', '72013', '17'), +('7', '90', '18', '104419', '67155', '17'), +('7', '90', '18', '54851', '53934', '17'), +('7', '90', '19', '62990', '102779', '17'), +('7', '90', '19', '104416', '86733', '17'), +('7', '90', '19', '49656', '72013', '17'), +('7', '90', '19', '102268', '49534', '17'), +('7', '90', '13', '111527', '508486', '17'), +('7', '90', '13', '111528', '463089', '17'), +('7', '90', '13', '111227', '444132', '17'), +('7', '90', '13', '111228', '425884', '17'), +('7', '90', '14', '111527', '508486', '17'), +('7', '90', '14', '111528', '463089', '17'), +('7', '90', '14', '111227', '444132', '17'), +('7', '90', '14', '111228', '425884', '17'), +('7', '90', '11', '111337', '143321', '17'), +('7', '90', '11', '111034', '131958', '17'), +('7', '90', '11', '111036', '131142', '17'), +('7', '90', '11', '111032', '122257', '17'), +('7', '91', '22', '12425', '0', '17'), +('7', '91', '22', '21807', '0', '17'), +('7', '91', '22', '21805', '0', '17'), +('7', '91', '22', '39342', '0', '17'), +('7', '91', '1', '111303', '181795', '17'), +('7', '91', '1', '111308', '181646', '17'), +('7', '91', '1', '111300', '180673', '17'), +('7', '91', '1', '111302', '180087', '17'), +('7', '91', '2', '104417', '94882', '17'), +('7', '91', '2', '94056', '77490', '17'), +('7', '91', '2', '49656', '72013', '17'), +('7', '91', '2', '62985', '59176', '17'), +('7', '91', '3', '111316', '177827', '17'), +('7', '91', '3', '111313', '170422', '17'), +('7', '91', '3', '111012', '158832', '17'), +('7', '91', '3', '111015', '156012', '17'), +('7', '91', '5', '111318', '169986', '17'), +('7', '91', '5', '111321', '169506', '17'), +('7', '91', '5', '111017', '158398', '17'), +('7', '91', '5', '111319', '148899', '17'), +('7', '91', '8', '111331', '166844', '17'), +('7', '91', '8', '111332', '149940', '17'), +('7', '91', '8', '111031', '137029', '17'), +('7', '91', '8', '111030', '130077', '17'), +('7', '91', '6', '111322', '152279', '17'), +('7', '91', '6', '111326', '149042', '17'), +('7', '91', '6', '111021', '133908', '17'), +('7', '91', '6', '111024', '133454', '17'), +('7', '91', '17', '49656', '72013', '17'), +('7', '91', '17', '56084', '55121', '17'), +('7', '91', '17', '56045', '53701', '17'), +('7', '91', '17', '104420', '49138', '17'), +('7', '91', '7', '56040', '95822', '17'), +('7', '91', '7', '56079', '89138', '17'), +('7', '91', '7', '104418', '84187', '17'), +('7', '91', '7', '49656', '72013', '17'), +('7', '91', '9', '62992', '111557', '17'), +('7', '91', '9', '104414', '91554', '17'), +('7', '91', '9', '49656', '72013', '17'), +('7', '91', '9', '54836', '71029', '17'), +('7', '91', '15', '111343', '182372', '17'), +('7', '91', '15', '111347', '181391', '17'), +('7', '91', '15', '111339', '178649', '17'), +('7', '91', '15', '111346', '178556', '17'), +('7', '91', '20', '111354', '188782', '17'), +('7', '91', '20', '111351', '183964', '17'), +('7', '91', '20', '111352', '182528', '17'), +('7', '91', '20', '111050', '162757', '17'), +('7', '91', '12', '56074', '104466', '17'), +('7', '91', '12', '104415', '93561', '17'), +('7', '91', '12', '81795', '83063', '17'), +('7', '91', '12', '49656', '72013', '17'), +('7', '91', '18', '62986', '82554', '17'), +('7', '91', '18', '49656', '72013', '17'), +('7', '91', '18', '104419', '67156', '17'), +('7', '91', '18', '54851', '53936', '17'), +('7', '91', '19', '62990', '102782', '17'), +('7', '91', '19', '104416', '86734', '17'), +('7', '91', '19', '49656', '72013', '17'), +('7', '91', '19', '102268', '49536', '17'), +('7', '91', '13', '111527', '509381', '17'), +('7', '91', '13', '111528', '463628', '17'), +('7', '91', '13', '111227', '444936', '17'), +('7', '91', '13', '111228', '426383', '17'), +('7', '91', '14', '111527', '509381', '17'), +('7', '91', '14', '111528', '463628', '17'), +('7', '91', '14', '111227', '444936', '17'), +('7', '91', '14', '111228', '426383', '17'), +('7', '91', '11', '111337', '143323', '17'), +('7', '91', '11', '111034', '131960', '17'), +('7', '91', '11', '111036', '131144', '17'), +('7', '91', '11', '111032', '122258', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '92', '22', '12425', '0', '17'), +('7', '92', '22', '21807', '0', '17'), +('7', '92', '22', '21805', '0', '17'), +('7', '92', '22', '39342', '0', '17'), +('7', '92', '1', '111303', '181799', '17'), +('7', '92', '1', '111308', '181649', '17'), +('7', '92', '1', '111300', '180676', '17'), +('7', '92', '1', '111302', '180091', '17'), +('7', '92', '2', '104417', '94884', '17'), +('7', '92', '2', '94056', '77492', '17'), +('7', '92', '2', '49656', '72014', '17'), +('7', '92', '2', '62985', '59177', '17'), +('7', '92', '3', '111316', '177830', '17'), +('7', '92', '3', '111313', '170424', '17'), +('7', '92', '3', '111012', '158834', '17'), +('7', '92', '3', '111015', '156015', '17'), +('7', '92', '5', '111318', '169988', '17'), +('7', '92', '5', '111321', '169508', '17'), +('7', '92', '5', '111017', '158400', '17'), +('7', '92', '5', '111319', '148902', '17'), +('7', '92', '8', '111331', '166847', '17'), +('7', '92', '8', '111332', '149941', '17'), +('7', '92', '8', '111031', '137031', '17'), +('7', '92', '8', '111030', '130080', '17'), +('7', '92', '6', '111322', '152281', '17'), +('7', '92', '6', '111326', '149045', '17'), +('7', '92', '6', '111021', '133910', '17'), +('7', '92', '6', '111024', '133456', '17'), +('7', '92', '17', '49656', '72014', '17'), +('7', '92', '17', '56084', '55123', '17'), +('7', '92', '17', '56045', '53702', '17'), +('7', '92', '17', '104420', '49140', '17'), +('7', '92', '7', '56040', '95825', '17'), +('7', '92', '7', '56079', '89140', '17'), +('7', '92', '7', '104418', '84188', '17'), +('7', '92', '7', '49656', '72014', '17'), +('7', '92', '9', '62992', '111559', '17'), +('7', '92', '9', '104414', '91556', '17'), +('7', '92', '9', '49656', '72014', '17'), +('7', '92', '9', '54836', '71031', '17'), +('7', '92', '15', '111343', '182374', '17'), +('7', '92', '15', '111347', '181395', '17'), +('7', '92', '15', '111339', '178651', '17'), +('7', '92', '15', '111346', '178559', '17'), +('7', '92', '20', '111354', '188785', '17'), +('7', '92', '20', '111351', '183966', '17'), +('7', '92', '20', '111352', '182530', '17'), +('7', '92', '20', '111050', '162759', '17'), +('7', '92', '12', '56074', '104467', '17'), +('7', '92', '12', '104415', '93565', '17'), +('7', '92', '12', '81795', '83065', '17'), +('7', '92', '12', '49656', '72014', '17'), +('7', '92', '18', '62986', '82557', '17'), +('7', '92', '18', '49656', '72014', '17'), +('7', '92', '18', '104419', '67158', '17'), +('7', '92', '18', '54851', '53937', '17'), +('7', '92', '19', '62990', '102784', '17'), +('7', '92', '19', '104416', '86735', '17'), +('7', '92', '19', '49656', '72014', '17'), +('7', '92', '19', '102268', '49537', '17'), +('7', '92', '13', '111527', '510277', '17'), +('7', '92', '13', '111528', '464169', '17'), +('7', '92', '13', '111227', '445741', '17'), +('7', '92', '13', '111228', '426882', '17'), +('7', '92', '14', '111527', '510277', '17'), +('7', '92', '14', '111528', '464169', '17'), +('7', '92', '14', '111227', '445741', '17'), +('7', '92', '14', '111228', '426882', '17'), +('7', '92', '11', '111337', '143325', '17'), +('7', '92', '11', '111034', '131962', '17'), +('7', '92', '11', '111036', '131146', '17'), +('7', '92', '11', '111032', '122260', '17'), +('7', '93', '22', '12425', '0', '17'), +('7', '93', '22', '21807', '0', '17'), +('7', '93', '22', '21805', '0', '17'), +('7', '93', '22', '39342', '0', '17'), +('7', '93', '1', '111303', '181802', '17'), +('7', '93', '1', '111308', '181652', '17'), +('7', '93', '1', '111300', '180677', '17'), +('7', '93', '1', '111302', '180094', '17'), +('7', '93', '2', '104417', '94887', '17'), +('7', '93', '2', '94056', '77493', '17'), +('7', '93', '2', '49656', '72014', '17'), +('7', '93', '2', '62985', '59178', '17'), +('7', '93', '3', '111316', '177832', '17'), +('7', '93', '3', '111313', '170426', '17'), +('7', '93', '3', '111012', '158836', '17'), +('7', '93', '3', '111015', '156017', '17'), +('7', '93', '5', '111318', '169990', '17'), +('7', '93', '5', '111321', '169511', '17'), +('7', '93', '5', '111017', '158402', '17'), +('7', '93', '5', '111319', '148904', '17'), +('7', '93', '8', '111331', '166849', '17'), +('7', '93', '8', '111332', '149943', '17'), +('7', '93', '8', '111031', '137032', '17'), +('7', '93', '8', '111030', '130082', '17'), +('7', '93', '6', '111322', '152283', '17'), +('7', '93', '6', '111326', '149047', '17'), +('7', '93', '6', '111021', '133912', '17'), +('7', '93', '6', '111024', '133458', '17'), +('7', '93', '17', '49656', '72014', '17'), +('7', '93', '17', '56084', '55125', '17'), +('7', '93', '17', '56045', '53703', '17'), +('7', '93', '17', '104420', '49142', '17'), +('7', '93', '7', '56040', '95827', '17'), +('7', '93', '7', '56079', '89142', '17'), +('7', '93', '7', '104418', '84190', '17'), +('7', '93', '7', '49656', '72014', '17'), +('7', '93', '9', '62992', '111562', '17'), +('7', '93', '9', '104414', '91558', '17'), +('7', '93', '9', '49656', '72014', '17'), +('7', '93', '9', '54836', '71033', '17'), +('7', '93', '15', '111343', '182376', '17'), +('7', '93', '15', '111347', '181397', '17'), +('7', '93', '15', '111339', '178653', '17'), +('7', '93', '15', '111346', '178561', '17'), +('7', '93', '20', '111354', '188787', '17'), +('7', '93', '20', '111351', '183967', '17'), +('7', '93', '20', '111352', '182533', '17'), +('7', '93', '20', '111050', '162760', '17'), +('7', '93', '12', '56074', '104468', '17'), +('7', '93', '12', '104415', '93568', '17'), +('7', '93', '12', '81795', '83067', '17'), +('7', '93', '12', '49656', '72014', '17'), +('7', '93', '18', '62986', '82559', '17'), +('7', '93', '18', '49656', '72014', '17'), +('7', '93', '18', '104419', '67160', '17'), +('7', '93', '18', '54851', '53939', '17'), +('7', '93', '19', '62990', '102786', '17'), +('7', '93', '19', '104416', '86736', '17'), +('7', '93', '19', '49656', '72014', '17'), +('7', '93', '19', '102268', '49539', '17'), +('7', '93', '13', '111527', '511172', '17'), +('7', '93', '13', '111528', '464708', '17'), +('7', '93', '13', '111227', '446545', '17'), +('7', '93', '13', '111228', '427380', '17'), +('7', '93', '14', '111527', '511172', '17'), +('7', '93', '14', '111528', '464708', '17'), +('7', '93', '14', '111227', '446545', '17'), +('7', '93', '14', '111228', '427380', '17'), +('7', '93', '11', '111337', '143327', '17'), +('7', '93', '11', '111034', '131963', '17'), +('7', '93', '11', '111036', '131148', '17'), +('7', '93', '11', '111032', '122262', '17'), +('7', '94', '22', '12425', '0', '17'), +('7', '94', '22', '21807', '0', '17'), +('7', '94', '22', '21805', '0', '17'), +('7', '94', '22', '39342', '0', '17'), +('7', '94', '1', '111303', '181805', '17'), +('7', '94', '1', '111308', '181655', '17'), +('7', '94', '1', '111300', '180679', '17'), +('7', '94', '1', '111302', '180097', '17'), +('7', '94', '2', '104417', '94889', '17'), +('7', '94', '2', '94056', '77495', '17'), +('7', '94', '2', '49656', '72014', '17'), +('7', '94', '2', '62985', '59179', '17'), +('7', '94', '3', '111316', '177835', '17'), +('7', '94', '3', '111313', '170428', '17'), +('7', '94', '3', '111012', '158838', '17'), +('7', '94', '3', '111015', '156020', '17'), +('7', '94', '5', '111318', '169992', '17'), +('7', '94', '5', '111321', '169513', '17'), +('7', '94', '5', '111017', '158404', '17'), +('7', '94', '5', '111319', '148907', '17'), +('7', '94', '8', '111331', '166852', '17'), +('7', '94', '8', '111332', '149944', '17'), +('7', '94', '8', '111031', '137034', '17'), +('7', '94', '8', '111030', '130085', '17'), +('7', '94', '6', '111322', '152285', '17'), +('7', '94', '6', '111326', '149049', '17'), +('7', '94', '6', '111021', '133914', '17'), +('7', '94', '6', '111024', '133460', '17'), +('7', '94', '17', '49656', '72014', '17'), +('7', '94', '17', '56084', '55126', '17'), +('7', '94', '17', '56045', '53704', '17'), +('7', '94', '17', '104420', '49144', '17'), +('7', '94', '7', '56040', '95830', '17'), +('7', '94', '7', '56079', '89145', '17'), +('7', '94', '7', '104418', '84192', '17'), +('7', '94', '7', '49656', '72014', '17'), +('7', '94', '9', '62992', '111564', '17'), +('7', '94', '9', '104414', '91561', '17'), +('7', '94', '9', '49656', '72014', '17'), +('7', '94', '9', '54836', '71035', '17'), +('7', '94', '15', '111343', '182378', '17'), +('7', '94', '15', '111347', '181401', '17'), +('7', '94', '15', '111339', '178656', '17'), +('7', '94', '15', '111346', '178563', '17'), +('7', '94', '20', '111354', '188789', '17'), +('7', '94', '20', '111351', '183969', '17'), +('7', '94', '20', '111352', '182536', '17'), +('7', '94', '20', '111050', '162762', '17'), +('7', '94', '12', '56074', '104470', '17'), +('7', '94', '12', '104415', '93571', '17'), +('7', '94', '12', '81795', '83070', '17'), +('7', '94', '12', '49656', '72014', '17'), +('7', '94', '18', '62986', '82562', '17'), +('7', '94', '18', '49656', '72014', '17'), +('7', '94', '18', '104419', '67162', '17'), +('7', '94', '18', '54851', '53941', '17'), +('7', '94', '19', '62990', '102788', '17'), +('7', '94', '19', '104416', '86737', '17'), +('7', '94', '19', '49656', '72014', '17'), +('7', '94', '19', '102268', '49540', '17'), +('7', '94', '13', '111527', '512067', '17'), +('7', '94', '13', '111528', '465249', '17'), +('7', '94', '13', '111227', '447309', '17'), +('7', '94', '13', '111228', '427879', '17'), +('7', '94', '14', '111527', '512067', '17'), +('7', '94', '14', '111528', '465249', '17'), +('7', '94', '14', '111227', '447309', '17'), +('7', '94', '14', '111228', '427879', '17'), +('7', '94', '11', '111337', '143329', '17'), +('7', '94', '11', '111034', '131965', '17'), +('7', '94', '11', '111036', '131150', '17'), +('7', '94', '11', '111032', '122263', '17'), +('7', '95', '22', '12425', '0', '18'), +('7', '95', '22', '21807', '0', '18'), +('7', '95', '22', '21805', '0', '18'), +('7', '95', '22', '39342', '0', '18'), +('7', '95', '1', '111303', '181809', '18'), +('7', '95', '1', '111308', '181657', '18'), +('7', '95', '1', '111300', '180681', '18'), +('7', '95', '1', '111302', '180100', '18'), +('7', '95', '2', '104417', '94892', '18'), +('7', '95', '2', '94056', '77496', '18'), +('7', '95', '2', '49656', '72015', '18'), +('7', '95', '2', '62985', '59180', '18'), +('7', '95', '3', '111316', '177838', '18'), +('7', '95', '3', '111313', '170429', '18'), +('7', '95', '3', '111012', '158840', '18'), +('7', '95', '3', '111015', '156023', '18'), +('7', '95', '5', '111318', '169994', '18'), +('7', '95', '5', '111321', '169516', '18'), +('7', '95', '5', '111017', '158406', '18'), +('7', '95', '5', '111319', '148910', '18'), +('7', '95', '8', '111331', '166855', '18'), +('7', '95', '8', '111332', '149946', '18'), +('7', '95', '8', '111031', '137036', '18'), +('7', '95', '8', '111030', '130087', '18'), +('7', '95', '6', '111322', '152286', '18'), +('7', '95', '6', '111326', '149051', '18'), +('7', '95', '6', '111021', '133916', '18'), +('7', '95', '6', '111024', '133462', '18'), +('7', '95', '17', '49656', '72015', '18'), +('7', '95', '17', '56084', '55128', '18'), +('7', '95', '17', '56045', '53705', '18'), +('7', '95', '17', '104420', '49146', '18'), +('7', '95', '7', '56040', '95832', '18'), +('7', '95', '7', '56079', '89147', '18'), +('7', '95', '7', '104418', '84193', '18'), +('7', '95', '7', '49656', '72015', '18'), +('7', '95', '9', '62992', '111567', '18'), +('7', '95', '9', '104414', '91563', '18'), +('7', '95', '9', '49656', '72015', '18'), +('7', '95', '9', '54836', '71036', '18'), +('7', '95', '15', '111343', '182380', '18'), +('7', '95', '15', '111347', '181404', '18'), +('7', '95', '15', '111339', '178658', '18'), +('7', '95', '15', '111346', '178566', '18'), +('7', '95', '20', '111354', '188792', '18'), +('7', '95', '20', '111351', '183970', '18'), +('7', '95', '20', '111352', '182538', '18'), +('7', '95', '20', '111050', '162764', '18'), +('7', '95', '12', '56074', '104471', '18'), +('7', '95', '12', '104415', '93574', '18'), +('7', '95', '12', '81795', '83072', '18'), +('7', '95', '12', '49656', '72015', '18'), +('7', '95', '18', '62986', '82565', '18'), +('7', '95', '18', '49656', '72015', '18'), +('7', '95', '18', '104419', '67163', '18'), +('7', '95', '18', '54851', '53942', '18'), +('7', '95', '19', '62990', '102791', '18'), +('7', '95', '19', '104416', '86738', '18'), +('7', '95', '19', '49656', '72015', '18'), +('7', '95', '19', '102268', '49542', '18'), +('7', '95', '13', '111527', '512920', '18'), +('7', '95', '13', '111528', '465789', '18'), +('7', '95', '13', '111227', '448113', '18'), +('7', '95', '13', '111228', '428378', '18'), +('7', '95', '14', '111527', '512920', '18'), +('7', '95', '14', '111528', '465789', '18'), +('7', '95', '14', '111227', '448113', '18'), +('7', '95', '14', '111228', '428378', '18'), +('7', '95', '11', '111337', '143331', '18'), +('7', '95', '11', '111034', '131967', '18'), +('7', '95', '11', '111036', '131152', '18'), +('7', '95', '11', '111032', '122265', '18'), +('7', '96', '22', '12425', '0', '18'), +('7', '96', '22', '21807', '0', '18'), +('7', '96', '22', '21805', '0', '18'), +('7', '96', '22', '39342', '0', '18'), +('7', '96', '1', '111303', '181812', '18'), +('7', '96', '1', '111308', '181660', '18'), +('7', '96', '1', '111300', '180683', '18'), +('7', '96', '1', '111302', '180103', '18'), +('7', '96', '2', '104417', '94894', '18'), +('7', '96', '2', '94056', '77498', '18'), +('7', '96', '2', '49656', '72015', '18'), +('7', '96', '2', '62985', '59180', '18'), +('7', '96', '3', '111316', '177840', '18'), +('7', '96', '3', '111313', '170431', '18'), +('7', '96', '3', '111012', '158842', '18'), +('7', '96', '3', '111015', '156025', '18'), +('7', '96', '5', '111318', '169996', '18'), +('7', '96', '5', '111321', '169518', '18'), +('7', '96', '5', '111017', '158408', '18'), +('7', '96', '5', '111319', '148913', '18'), +('7', '96', '8', '111331', '166857', '18'), +('7', '96', '8', '111332', '149948', '18'), +('7', '96', '8', '111031', '137037', '18'), +('7', '96', '8', '111030', '130090', '18'), +('7', '96', '6', '111322', '152288', '18'), +('7', '96', '6', '111326', '149053', '18'), +('7', '96', '6', '111021', '133918', '18'), +('7', '96', '6', '111024', '133464', '18'), +('7', '96', '17', '49656', '72015', '18'), +('7', '96', '17', '56084', '55130', '18'), +('7', '96', '17', '56045', '53707', '18'), +('7', '96', '17', '104420', '49148', '18'), +('7', '96', '7', '56040', '95835', '18'), +('7', '96', '7', '56079', '89149', '18'), +('7', '96', '7', '104418', '84195', '18'), +('7', '96', '7', '49656', '72015', '18'), +('7', '96', '9', '62992', '111570', '18'), +('7', '96', '9', '104414', '91566', '18'), +('7', '96', '9', '49656', '72015', '18'), +('7', '96', '9', '54836', '71039', '18'), +('7', '96', '15', '111343', '182382', '18'), +('7', '96', '15', '111347', '181407', '18'), +('7', '96', '15', '111339', '178660', '18'), +('7', '96', '15', '111346', '178568', '18'), +('7', '96', '20', '111354', '188794', '18'), +('7', '96', '20', '111351', '183972', '18'), +('7', '96', '20', '111352', '182541', '18'), +('7', '96', '20', '111050', '162765', '18'), +('7', '96', '12', '56074', '104473', '18'), +('7', '96', '12', '104415', '93578', '18'), +('7', '96', '12', '81795', '83074', '18'), +('7', '96', '12', '49656', '72015', '18'), +('7', '96', '18', '62986', '82567', '18'), +('7', '96', '18', '49656', '72015', '18'), +('7', '96', '18', '104419', '67165', '18'), +('7', '96', '18', '54851', '53944', '18'), +('7', '96', '19', '62990', '102793', '18'), +('7', '96', '19', '104416', '86739', '18'), +('7', '96', '19', '49656', '72015', '18'), +('7', '96', '19', '102268', '49544', '18'), +('7', '96', '13', '111527', '513816', '18'), +('7', '96', '13', '111528', '466329', '18'), +('7', '96', '13', '111227', '448918', '18'), +('7', '96', '13', '111228', '428877', '18'), +('7', '96', '14', '111527', '513816', '18'), +('7', '96', '14', '111528', '466329', '18'), +('7', '96', '14', '111227', '448918', '18'), +('7', '96', '14', '111228', '428877', '18'), +('7', '96', '11', '111337', '143333', '18'), +('7', '96', '11', '111034', '131969', '18'), +('7', '96', '11', '111036', '131154', '18'), +('7', '96', '11', '111032', '122266', '18'), +('7', '97', '22', '12425', '0', '18'), +('7', '97', '22', '21807', '0', '18'), +('7', '97', '22', '21805', '0', '18'), +('7', '97', '22', '39342', '0', '18'), +('7', '97', '1', '111303', '181815', '18'), +('7', '97', '1', '111308', '181662', '18'), +('7', '97', '1', '111300', '180685', '18'), +('7', '97', '1', '111302', '180106', '18'), +('7', '97', '2', '104417', '94897', '18'), +('7', '97', '2', '94056', '77500', '18'), +('7', '97', '2', '49656', '72015', '18'), +('7', '97', '2', '62985', '59181', '18'), +('7', '97', '3', '111316', '177843', '18'), +('7', '97', '3', '111313', '170433', '18'), +('7', '97', '3', '111012', '158844', '18'), +('7', '97', '3', '111015', '156028', '18'), +('7', '97', '5', '111318', '169997', '18'), +('7', '97', '5', '111321', '169520', '18'), +('7', '97', '5', '111017', '158410', '18'), +('7', '97', '5', '111319', '148915', '18'), +('7', '97', '8', '111331', '166860', '18'), +('7', '97', '8', '111332', '149949', '18'), +('7', '97', '8', '111031', '137039', '18'), +('7', '97', '8', '111030', '130092', '18'), +('7', '97', '6', '111322', '152290', '18'), +('7', '97', '6', '111326', '149055', '18'), +('7', '97', '6', '111021', '133920', '18'), +('7', '97', '6', '111024', '133465', '18'), +('7', '97', '17', '49656', '72015', '18'), +('7', '97', '17', '56084', '55131', '18'), +('7', '97', '17', '56045', '53708', '18'), +('7', '97', '17', '104420', '49150', '18'), +('7', '97', '7', '56040', '95837', '18'), +('7', '97', '7', '56079', '89151', '18'), +('7', '97', '7', '104418', '84196', '18'), +('7', '97', '7', '49656', '72015', '18'), +('7', '97', '9', '62992', '111572', '18'), +('7', '97', '9', '104414', '91568', '18'), +('7', '97', '9', '49656', '72015', '18'), +('7', '97', '9', '54836', '71040', '18'), +('7', '97', '15', '111343', '182384', '18'), +('7', '97', '15', '111347', '181410', '18'), +('7', '97', '15', '111339', '178662', '18'), +('7', '97', '15', '111346', '178570', '18'), +('7', '97', '20', '111354', '188796', '18'), +('7', '97', '20', '111351', '183974', '18'), +('7', '97', '20', '111352', '182543', '18'), +('7', '97', '20', '111050', '162767', '18'), +('7', '97', '12', '56074', '104474', '18'), +('7', '97', '12', '104415', '93581', '18'), +('7', '97', '12', '81795', '83077', '18'), +('7', '97', '12', '49656', '72015', '18'), +('7', '97', '18', '62986', '82570', '18'), +('7', '97', '18', '49656', '72015', '18'), +('7', '97', '18', '104419', '67167', '18'), +('7', '97', '18', '54851', '53945', '18'), +('7', '97', '19', '62990', '102795', '18'), +('7', '97', '19', '104416', '86741', '18'), +('7', '97', '19', '49656', '72015', '18'), +('7', '97', '19', '102268', '49545', '18'), +('7', '97', '13', '111527', '514711', '18'), +('7', '97', '13', '111528', '466869', '18'), +('7', '97', '13', '111227', '449722', '18'), +('7', '97', '13', '111228', '429417', '18'), +('7', '97', '14', '111527', '514711', '18'), +('7', '97', '14', '111528', '466869', '18'), +('7', '97', '14', '111227', '449722', '18'), +('7', '97', '14', '111228', '429417', '18'), +('7', '97', '11', '111337', '143335', '18'), +('7', '97', '11', '111034', '131971', '18'), +('7', '97', '11', '111036', '131156', '18'), +('7', '97', '11', '111032', '122268', '18'), +('7', '98', '22', '12425', '0', '18'), +('7', '98', '22', '21807', '0', '18'), +('7', '98', '22', '21805', '0', '18'), +('7', '98', '22', '39342', '0', '18'), +('7', '98', '1', '111303', '181819', '18'), +('7', '98', '1', '111308', '181665', '18'), +('7', '98', '1', '111300', '180687', '18'), +('7', '98', '1', '111302', '180110', '18'), +('7', '98', '2', '104417', '94899', '18'), +('7', '98', '2', '94056', '77501', '18'), +('7', '98', '2', '49656', '72016', '18'), +('7', '98', '2', '62985', '59182', '18'), +('7', '98', '3', '111316', '177845', '18'), +('7', '98', '3', '111313', '170435', '18'), +('7', '98', '3', '111012', '158846', '18'), +('7', '98', '3', '111015', '156030', '18'), +('7', '98', '5', '111318', '169999', '18'), +('7', '98', '5', '111321', '169523', '18'), +('7', '98', '5', '111017', '158412', '18'), +('7', '98', '5', '111319', '148918', '18'), +('7', '98', '8', '111331', '166863', '18'), +('7', '98', '8', '111332', '149951', '18'), +('7', '98', '8', '111031', '137041', '18'), +('7', '98', '8', '111030', '130094', '18'), +('7', '98', '6', '111322', '152292', '18'), +('7', '98', '6', '111326', '149057', '18'), +('7', '98', '6', '111021', '133922', '18'), +('7', '98', '6', '111024', '133467', '18'), +('7', '98', '17', '49656', '72016', '18'), +('7', '98', '17', '56084', '55133', '18'), +('7', '98', '17', '56045', '53709', '18'), +('7', '98', '17', '104420', '49152', '18'), +('7', '98', '7', '56040', '95840', '18'), +('7', '98', '7', '56079', '89154', '18'), +('7', '98', '7', '104418', '84198', '18'), +('7', '98', '7', '49656', '72016', '18'), +('7', '98', '9', '62992', '111575', '18'), +('7', '98', '9', '104414', '91571', '18'), +('7', '98', '9', '49656', '72016', '18'), +('7', '98', '9', '54836', '71042', '18'), +('7', '98', '15', '111343', '182386', '18'), +('7', '98', '15', '111347', '181413', '18'), +('7', '98', '15', '111339', '178664', '18'), +('7', '98', '15', '111346', '178573', '18'), +('7', '98', '20', '111354', '188799', '18'), +('7', '98', '20', '111351', '183975', '18'), +('7', '98', '20', '111352', '182546', '18'), +('7', '98', '20', '111050', '162768', '18'), +('7', '98', '12', '56074', '104475', '18'), +('7', '98', '12', '104415', '93584', '18'), +('7', '98', '12', '81795', '83079', '18'), +('7', '98', '12', '49656', '72016', '18'), +('7', '98', '18', '62986', '82573', '18'), +('7', '98', '18', '49656', '72016', '18'), +('7', '98', '18', '104419', '67168', '18'), +('7', '98', '18', '54851', '53947', '18'), +('7', '98', '19', '62990', '102797', '18'), +('7', '98', '19', '104416', '86742', '18'), +('7', '98', '19', '49656', '72016', '18'), +('7', '98', '19', '102268', '49547', '18'), +('7', '98', '13', '111527', '515606', '18'), +('7', '98', '13', '111528', '467409', '18'), +('7', '98', '13', '111227', '450526', '18'), +('7', '98', '13', '111228', '429916', '18'), +('7', '98', '14', '111527', '515606', '18'), +('7', '98', '14', '111528', '467409', '18'), +('7', '98', '14', '111227', '450526', '18'), +('7', '98', '14', '111228', '429916', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '98', '11', '111337', '143337', '18'), +('7', '98', '11', '111034', '131973', '18'), +('7', '98', '11', '111036', '131158', '18'), +('7', '98', '11', '111032', '122269', '18'), +('7', '99', '22', '12425', '0', '18'), +('7', '99', '22', '21807', '0', '18'), +('7', '99', '22', '21805', '0', '18'), +('7', '99', '22', '39342', '0', '18'), +('7', '99', '1', '111303', '181823', '18'), +('7', '99', '1', '111308', '181668', '18'), +('7', '99', '1', '111300', '180689', '18'), +('7', '99', '1', '111302', '180113', '18'), +('7', '99', '2', '104417', '94902', '18'), +('7', '99', '2', '94056', '77503', '18'), +('7', '99', '2', '49656', '72016', '18'), +('7', '99', '2', '62985', '59183', '18'), +('7', '99', '3', '111316', '177848', '18'), +('7', '99', '3', '111313', '170437', '18'), +('7', '99', '3', '111012', '158848', '18'), +('7', '99', '3', '111015', '156033', '18'), +('7', '99', '5', '111318', '170001', '18'), +('7', '99', '5', '111321', '169525', '18'), +('7', '99', '5', '111017', '158414', '18'), +('7', '99', '5', '111319', '148921', '18'), +('7', '99', '8', '111331', '166866', '18'), +('7', '99', '8', '111332', '149952', '18'), +('7', '99', '8', '111031', '137042', '18'), +('7', '99', '8', '111030', '130097', '18'), +('7', '99', '6', '111322', '152294', '18'), +('7', '99', '6', '111326', '149059', '18'), +('7', '99', '6', '111021', '133923', '18'), +('7', '99', '6', '111024', '133469', '18'), +('7', '99', '17', '49656', '72016', '18'), +('7', '99', '17', '56084', '55135', '18'), +('7', '99', '17', '56045', '53710', '18'), +('7', '99', '17', '104420', '49154', '18'), +('7', '99', '7', '56040', '95842', '18'), +('7', '99', '7', '56079', '89156', '18'), +('7', '99', '7', '104418', '84200', '18'), +('7', '99', '7', '49656', '72016', '18'), +('7', '99', '9', '62992', '111577', '18'), +('7', '99', '9', '104414', '91574', '18'), +('7', '99', '9', '49656', '72016', '18'), +('7', '99', '9', '54836', '71045', '18'), +('7', '99', '15', '111343', '182388', '18'), +('7', '99', '15', '111347', '181416', '18'), +('7', '99', '15', '111339', '178666', '18'), +('7', '99', '15', '111346', '178575', '18'), +('7', '99', '20', '111354', '188801', '18'), +('7', '99', '20', '111351', '183977', '18'), +('7', '99', '20', '111352', '182549', '18'), +('7', '99', '20', '111050', '162770', '18'), +('7', '99', '12', '56074', '104477', '18'), +('7', '99', '12', '104415', '93588', '18'), +('7', '99', '12', '81795', '83081', '18'), +('7', '99', '12', '49656', '72016', '18'), +('7', '99', '18', '62986', '82575', '18'), +('7', '99', '18', '49656', '72016', '18'), +('7', '99', '18', '104419', '67170', '18'), +('7', '99', '18', '54851', '53949', '18'), +('7', '99', '19', '62990', '102800', '18'), +('7', '99', '19', '104416', '86743', '18'), +('7', '99', '19', '49656', '72016', '18'), +('7', '99', '19', '102268', '49548', '18'), +('7', '99', '13', '111527', '516502', '18'), +('7', '99', '13', '111528', '467949', '18'), +('7', '99', '13', '111227', '451331', '18'), +('7', '99', '13', '111228', '430415', '18'), +('7', '99', '14', '111527', '516502', '18'), +('7', '99', '14', '111528', '467949', '18'), +('7', '99', '14', '111227', '451331', '18'), +('7', '99', '14', '111228', '430415', '18'), +('7', '99', '11', '111337', '143339', '18'), +('7', '99', '11', '111034', '131975', '18'), +('7', '99', '11', '111036', '131160', '18'), +('7', '99', '11', '111032', '122271', '18'), +('7', '100', '22', '12425', '0', '20'), +('7', '100', '22', '21807', '0', '20'), +('7', '100', '22', '21805', '0', '20'), +('7', '100', '22', '39342', '0', '20'), +('7', '100', '1', '98769', '303389', '20'), +('7', '100', '1', '111303', '181826', '20'), +('7', '100', '1', '111308', '181670', '20'), +('7', '100', '1', '111300', '180691', '20'), +('7', '100', '2', '104417', '94904', '20'), +('7', '100', '2', '94056', '77504', '20'), +('7', '100', '2', '49656', '72016', '20'), +('7', '100', '2', '62985', '59184', '20'), +('7', '100', '3', '111316', '177850', '20'), +('7', '100', '3', '111313', '170439', '20'), +('7', '100', '3', '111012', '158850', '20'), +('7', '100', '3', '111015', '156035', '20'), +('7', '100', '5', '111318', '170003', '20'), +('7', '100', '5', '111321', '169528', '20'), +('7', '100', '5', '111017', '158416', '20'), +('7', '100', '5', '111319', '148924', '20'), +('7', '100', '8', '111331', '166868', '20'), +('7', '100', '8', '111332', '149954', '20'), +('7', '100', '8', '111031', '137044', '20'), +('7', '100', '8', '111030', '130099', '20'), +('7', '100', '6', '111322', '152296', '20'), +('7', '100', '6', '111326', '149061', '20'), +('7', '100', '6', '111021', '133925', '20'), +('7', '100', '6', '111024', '133471', '20'), +('7', '100', '17', '49656', '72016', '20'), +('7', '100', '17', '56084', '55136', '20'), +('7', '100', '17', '56045', '53711', '20'), +('7', '100', '17', '104420', '49155', '20'), +('7', '100', '7', '56040', '95845', '20'), +('7', '100', '7', '56079', '89158', '20'), +('7', '100', '7', '104418', '84201', '20'), +('7', '100', '7', '49656', '72016', '20'), +('7', '100', '9', '62992', '111580', '20'), +('7', '100', '9', '104414', '91576', '20'), +('7', '100', '9', '49656', '72016', '20'), +('7', '100', '9', '54836', '71046', '20'), +('7', '100', '15', '111343', '182389', '20'), +('7', '100', '15', '111347', '181419', '20'), +('7', '100', '15', '111339', '178668', '20'), +('7', '100', '15', '111346', '178578', '20'), +('7', '100', '20', '111354', '188803', '20'), +('7', '100', '20', '111351', '183978', '20'), +('7', '100', '20', '111352', '182551', '20'), +('7', '100', '20', '111050', '162772', '20'), +('7', '100', '12', '56074', '104478', '20'), +('7', '100', '12', '104415', '93591', '20'), +('7', '100', '12', '81795', '83084', '20'), +('7', '100', '12', '49656', '72016', '20'), +('7', '100', '18', '62986', '82578', '20'), +('7', '100', '18', '49656', '72016', '20'), +('7', '100', '18', '104419', '67172', '20'), +('7', '100', '18', '54851', '53950', '20'), +('7', '100', '19', '62990', '102802', '20'), +('7', '100', '19', '104416', '86744', '20'), +('7', '100', '19', '49656', '72016', '20'), +('7', '100', '19', '102268', '49550', '20'), +('7', '100', '13', '111527', '519097', '20'), +('7', '100', '13', '111528', '468489', '20'), +('7', '100', '13', '111227', '453699', '20'), +('7', '100', '13', '111228', '430914', '20'), +('7', '100', '14', '111527', '519097', '20'), +('7', '100', '14', '111528', '468489', '20'), +('7', '100', '14', '111227', '453699', '20'), +('7', '100', '14', '111228', '430914', '20'), +('7', '100', '11', '133816', '202823', '20'), +('7', '100', '11', '111337', '143341', '20'), +('7', '100', '11', '111034', '131977', '20'), +('7', '100', '11', '111036', '131162', '20'), +('7', '100', '22', '12425', '0', '19'), +('7', '100', '22', '21807', '0', '19'), +('7', '100', '22', '21805', '0', '19'), +('7', '100', '22', '39342', '0', '19'), +('7', '100', '1', '98769', '303389', '19'), +('7', '100', '1', '111303', '181826', '19'), +('7', '100', '1', '111308', '181670', '19'), +('7', '100', '1', '111300', '180691', '19'), +('7', '100', '2', '104417', '94904', '19'), +('7', '100', '2', '94056', '77504', '19'), +('7', '100', '2', '49656', '72016', '19'), +('7', '100', '2', '62985', '59184', '19'), +('7', '100', '3', '111316', '177850', '19'), +('7', '100', '3', '111313', '170439', '19'), +('7', '100', '3', '111012', '158850', '19'), +('7', '100', '3', '111015', '156035', '19'), +('7', '100', '5', '111318', '170003', '19'), +('7', '100', '5', '111321', '169528', '19'), +('7', '100', '5', '111017', '158416', '19'), +('7', '100', '5', '111319', '148924', '19'), +('7', '100', '8', '111331', '166868', '19'), +('7', '100', '8', '111332', '149954', '19'), +('7', '100', '8', '111031', '137044', '19'), +('7', '100', '8', '111030', '130099', '19'), +('7', '100', '6', '111322', '152296', '19'), +('7', '100', '6', '111326', '149061', '19'), +('7', '100', '6', '111021', '133925', '19'), +('7', '100', '6', '111024', '133471', '19'), +('7', '100', '17', '49656', '72016', '19'), +('7', '100', '17', '56084', '55136', '19'), +('7', '100', '17', '56045', '53711', '19'), +('7', '100', '17', '104420', '49155', '19'), +('7', '100', '7', '56040', '95845', '19'), +('7', '100', '7', '56079', '89158', '19'), +('7', '100', '7', '104418', '84201', '19'), +('7', '100', '7', '49656', '72016', '19'), +('7', '100', '9', '62992', '111580', '19'), +('7', '100', '9', '104414', '91576', '19'), +('7', '100', '9', '49656', '72016', '19'), +('7', '100', '9', '54836', '71046', '19'), +('7', '100', '15', '111343', '182389', '19'), +('7', '100', '15', '111347', '181419', '19'), +('7', '100', '15', '111339', '178668', '19'), +('7', '100', '15', '111346', '178578', '19'), +('7', '100', '20', '111354', '188803', '19'), +('7', '100', '20', '111351', '183978', '19'), +('7', '100', '20', '111352', '182551', '19'), +('7', '100', '20', '111050', '162772', '19'), +('7', '100', '12', '56074', '104478', '19'), +('7', '100', '12', '104415', '93591', '19'), +('7', '100', '12', '81795', '83084', '19'), +('7', '100', '12', '49656', '72016', '19'), +('7', '100', '18', '62986', '82578', '19'), +('7', '100', '18', '49656', '72016', '19'), +('7', '100', '18', '104419', '67172', '19'), +('7', '100', '18', '54851', '53950', '19'), +('7', '100', '19', '62990', '102802', '19'), +('7', '100', '19', '104416', '86744', '19'), +('7', '100', '19', '49656', '72016', '19'), +('7', '100', '19', '102268', '49550', '19'), +('7', '100', '13', '111527', '517397', '19'), +('7', '100', '13', '111528', '468489', '19'), +('7', '100', '13', '111227', '452095', '19'), +('7', '100', '13', '111228', '430914', '19'), +('7', '100', '14', '111527', '517397', '19'), +('7', '100', '14', '111528', '468489', '19'), +('7', '100', '14', '111227', '452095', '19'), +('7', '100', '14', '111228', '430914', '19'), +('7', '100', '11', '133816', '202823', '19'), +('7', '100', '11', '111337', '143341', '19'), +('7', '100', '11', '111034', '131977', '19'), +('7', '100', '11', '111036', '131162', '19'), +('7', '101', '22', '12425', '0', '20'), +('7', '101', '22', '21807', '0', '20'), +('7', '101', '22', '21805', '0', '20'), +('7', '101', '22', '39342', '0', '20'), +('7', '101', '1', '98769', '303391', '20'), +('7', '101', '1', '111303', '181829', '20'), +('7', '101', '1', '111308', '181673', '20'), +('7', '101', '1', '111300', '180693', '20'), +('7', '101', '2', '104417', '94907', '20'), +('7', '101', '2', '94056', '77506', '20'), +('7', '101', '2', '49656', '72017', '20'), +('7', '101', '2', '62985', '59184', '20'), +('7', '101', '3', '111316', '177853', '20'), +('7', '101', '3', '111313', '170441', '20'), +('7', '101', '3', '111012', '158852', '20'), +('7', '101', '3', '111015', '156038', '20'), +('7', '101', '5', '111318', '170005', '20'), +('7', '101', '5', '111321', '169530', '20'), +('7', '101', '5', '111017', '158418', '20'), +('7', '101', '5', '111319', '148927', '20'), +('7', '101', '8', '111331', '166871', '20'), +('7', '101', '8', '111332', '149955', '20'), +('7', '101', '8', '111031', '137046', '20'), +('7', '101', '8', '111030', '130102', '20'), +('7', '101', '6', '111322', '152298', '20'), +('7', '101', '6', '111326', '149063', '20'), +('7', '101', '6', '111021', '133927', '20'), +('7', '101', '6', '111024', '133473', '20'), +('7', '101', '17', '49656', '72017', '20'), +('7', '101', '17', '56084', '55138', '20'), +('7', '101', '17', '56045', '53712', '20'), +('7', '101', '17', '104420', '49157', '20'), +('7', '101', '7', '56040', '95847', '20'), +('7', '101', '7', '56079', '89161', '20'), +('7', '101', '7', '104418', '84203', '20'), +('7', '101', '7', '49656', '72017', '20'), +('7', '101', '9', '62992', '111582', '20'), +('7', '101', '9', '104414', '91579', '20'), +('7', '101', '9', '49656', '72017', '20'), +('7', '101', '9', '54836', '71048', '20'), +('7', '101', '15', '111343', '182391', '20'), +('7', '101', '15', '111347', '181422', '20'), +('7', '101', '15', '111339', '178671', '20'), +('7', '101', '15', '111346', '178580', '20'), +('7', '101', '20', '111354', '188806', '20'), +('7', '101', '20', '111351', '183980', '20'), +('7', '101', '20', '111352', '182554', '20'), +('7', '101', '20', '111050', '162773', '20'), +('7', '101', '12', '56074', '104479', '20'), +('7', '101', '12', '104415', '93594', '20'), +('7', '101', '12', '81795', '83086', '20'), +('7', '101', '12', '49656', '72017', '20'), +('7', '101', '18', '62986', '82581', '20'), +('7', '101', '18', '49656', '72017', '20'), +('7', '101', '18', '104419', '67174', '20'), +('7', '101', '18', '54851', '53952', '20'), +('7', '101', '19', '62990', '102804', '20'), +('7', '101', '19', '104416', '86745', '20'), +('7', '101', '19', '49656', '72017', '20'), +('7', '101', '19', '102268', '49551', '20'), +('7', '101', '13', '111527', '519950', '20'), +('7', '101', '13', '111528', '469029', '20'), +('7', '101', '13', '111227', '454503', '20'), +('7', '101', '13', '111228', '431413', '20'), +('7', '101', '14', '111527', '519950', '20'), +('7', '101', '14', '111528', '469029', '20'), +('7', '101', '14', '111227', '454503', '20'), +('7', '101', '14', '111228', '431413', '20'), +('7', '101', '11', '133816', '202825', '20'), +('7', '101', '11', '111337', '143343', '20'), +('7', '101', '11', '111034', '131979', '20'), +('7', '101', '11', '111036', '131164', '20'), +('7', '102', '22', '12425', '0', '20'), +('7', '102', '22', '21807', '0', '20'), +('7', '102', '22', '21805', '0', '20'), +('7', '102', '22', '39342', '0', '20'), +('7', '102', '1', '98769', '303393', '20'), +('7', '102', '1', '111303', '181833', '20'), +('7', '102', '1', '111308', '181676', '20'), +('7', '102', '1', '111300', '180695', '20'), +('7', '102', '2', '104417', '94909', '20'), +('7', '102', '2', '94056', '77507', '20'), +('7', '102', '2', '49656', '72017', '20'), +('7', '102', '2', '62985', '59185', '20'), +('7', '102', '3', '111316', '177856', '20'), +('7', '102', '3', '111313', '170443', '20'), +('7', '102', '3', '111012', '158854', '20'), +('7', '102', '3', '111015', '156041', '20'), +('7', '102', '5', '111318', '170007', '20'), +('7', '102', '5', '111321', '169533', '20'), +('7', '102', '5', '111017', '158420', '20'), +('7', '102', '5', '111319', '148930', '20'), +('7', '102', '8', '111331', '166874', '20'), +('7', '102', '8', '111332', '149957', '20'), +('7', '102', '8', '111031', '137047', '20'), +('7', '102', '8', '111030', '130104', '20'), +('7', '102', '6', '111322', '152300', '20'), +('7', '102', '6', '111326', '149066', '20'), +('7', '102', '6', '111021', '133929', '20'), +('7', '102', '6', '111024', '133475', '20'), +('7', '102', '17', '49656', '72017', '20'), +('7', '102', '17', '56084', '55140', '20'), +('7', '102', '17', '56045', '53714', '20'), +('7', '102', '17', '104420', '49159', '20'), +('7', '102', '7', '56040', '95850', '20'), +('7', '102', '7', '56079', '89163', '20'), +('7', '102', '7', '104418', '84204', '20'), +('7', '102', '7', '49656', '72017', '20'), +('7', '102', '9', '62992', '111585', '20'), +('7', '102', '9', '104414', '91581', '20'), +('7', '102', '9', '49656', '72017', '20'), +('7', '102', '9', '54836', '71050', '20'), +('7', '102', '15', '111343', '182393', '20'), +('7', '102', '15', '111347', '181426', '20'), +('7', '102', '15', '111339', '178673', '20'), +('7', '102', '15', '111346', '178583', '20'), +('7', '102', '20', '111354', '188808', '20'), +('7', '102', '20', '111351', '183982', '20'), +('7', '102', '20', '111352', '182557', '20'), +('7', '102', '20', '111050', '162775', '20'), +('7', '102', '12', '56074', '104481', '20'), +('7', '102', '12', '104415', '93598', '20'), +('7', '102', '12', '81795', '83088', '20'), +('7', '102', '12', '49656', '72017', '20'), +('7', '102', '18', '62986', '82583', '20'), +('7', '102', '18', '49656', '72017', '20'), +('7', '102', '18', '104419', '67175', '20'), +('7', '102', '18', '54851', '53954', '20'), +('7', '102', '19', '62990', '102807', '20'), +('7', '102', '19', '104416', '86746', '20'), +('7', '102', '19', '49656', '72017', '20'), +('7', '102', '19', '102268', '49553', '20'), +('7', '102', '13', '111527', '520846', '20'), +('7', '102', '13', '111528', '469610', '20'), +('7', '102', '13', '111227', '455308', '20'), +('7', '102', '13', '111228', '431912', '20'), +('7', '102', '14', '111527', '520846', '20'), +('7', '102', '14', '111528', '469610', '20'), +('7', '102', '14', '111227', '455308', '20'), +('7', '102', '14', '111228', '431912', '20'), +('7', '102', '11', '133816', '202827', '20'), +('7', '102', '11', '111337', '143345', '20'), +('7', '102', '11', '111034', '131981', '20'), +('7', '102', '11', '111036', '131166', '20'), +('7', '103', '22', '12425', '0', '20'), +('7', '103', '22', '21807', '0', '20'), +('7', '103', '22', '21805', '0', '20'), +('7', '103', '22', '39342', '0', '20'), +('7', '103', '1', '98769', '303395', '20'), +('7', '103', '1', '111303', '181836', '20'), +('7', '103', '1', '111308', '181678', '20'), +('7', '103', '1', '111300', '180697', '20'), +('7', '103', '2', '104417', '94912', '20'), +('7', '103', '2', '94056', '77509', '20'), +('7', '103', '2', '49656', '72017', '20'), +('7', '103', '2', '62985', '59186', '20'), +('7', '103', '3', '111316', '177858', '20'), +('7', '103', '3', '111313', '170444', '20'), +('7', '103', '3', '111012', '158856', '20'), +('7', '103', '3', '111015', '156043', '20'), +('7', '103', '5', '111318', '170009', '20'), +('7', '103', '5', '111321', '169535', '20'), +('7', '103', '5', '111017', '158422', '20'), +('7', '103', '5', '111319', '148932', '20'), +('7', '103', '8', '111331', '166877', '20'), +('7', '103', '8', '111332', '149959', '20'), +('7', '103', '8', '111031', '137049', '20'), +('7', '103', '8', '111030', '130106', '20'), +('7', '103', '6', '111322', '152301', '20'), +('7', '103', '6', '111326', '149068', '20'), +('7', '103', '6', '111021', '133931', '20'), +('7', '103', '6', '111024', '133477', '20'), +('7', '103', '17', '49656', '72017', '20'), +('7', '103', '17', '56084', '55141', '20'), +('7', '103', '17', '56045', '53715', '20'), +('7', '103', '17', '104420', '49161', '20'), +('7', '103', '7', '56040', '95852', '20'), +('7', '103', '7', '56079', '89165', '20'), +('7', '103', '7', '104418', '84206', '20'), +('7', '103', '7', '49656', '72017', '20'), +('7', '103', '9', '62992', '111588', '20'), +('7', '103', '9', '104414', '91584', '20'), +('7', '103', '9', '49656', '72017', '20'), +('7', '103', '9', '54836', '71052', '20'), +('7', '103', '15', '111343', '182395', '20'), +('7', '103', '15', '111347', '181428', '20'), +('7', '103', '15', '111339', '178675', '20'), +('7', '103', '15', '111346', '178585', '20'), +('7', '103', '20', '111354', '188810', '20'), +('7', '103', '20', '111351', '183983', '20'), +('7', '103', '20', '111352', '182560', '20'), +('7', '103', '20', '111050', '162776', '20'), +('7', '103', '12', '56074', '104482', '20'), +('7', '103', '12', '104415', '93601', '20'), +('7', '103', '12', '81795', '83091', '20'), +('7', '103', '12', '49656', '72017', '20'), +('7', '103', '18', '62986', '82586', '20'), +('7', '103', '18', '49656', '72017', '20'), +('7', '103', '18', '104419', '67177', '20'), +('7', '103', '18', '54851', '53955', '20'), +('7', '103', '19', '62990', '102809', '20'), +('7', '103', '19', '104416', '86747', '20'), +('7', '103', '19', '49656', '72017', '20'), +('7', '103', '19', '102268', '49555', '20'), +('7', '103', '13', '111527', '521741', '20'), +('7', '103', '13', '111528', '470150', '20'), +('7', '103', '13', '111227', '456112', '20'), +('7', '103', '13', '111228', '432410', '20'), +('7', '103', '14', '111527', '521741', '20'), +('7', '103', '14', '111528', '470150', '20'), +('7', '103', '14', '111227', '456112', '20'), +('7', '103', '14', '111228', '432410', '20'), +('7', '103', '11', '133816', '202828', '20'), +('7', '103', '11', '111337', '143346', '20'), +('7', '103', '11', '111034', '131982', '20'), +('7', '103', '11', '111036', '131168', '20'), +('7', '104', '22', '12425', '0', '20'), +('7', '104', '22', '21807', '0', '20'), +('7', '104', '22', '21805', '0', '20'), +('7', '104', '22', '39342', '0', '20'), +('7', '104', '1', '98769', '303397', '20'), +('7', '104', '1', '111303', '181840', '20'), +('7', '104', '1', '111308', '181681', '20'), +('7', '104', '1', '111300', '180699', '20'), +('7', '104', '2', '104417', '94914', '20'), +('7', '104', '2', '94056', '77511', '20'), +('7', '104', '2', '49656', '72018', '20'), +('7', '104', '2', '62985', '59187', '20'), +('7', '104', '3', '111316', '177861', '20'), +('7', '104', '3', '111313', '170446', '20'), +('7', '104', '3', '111012', '158858', '20'), +('7', '104', '3', '111015', '156046', '20'), +('7', '104', '5', '111318', '170011', '20'), +('7', '104', '5', '111321', '169538', '20'), +('7', '104', '5', '111017', '158424', '20'), +('7', '104', '5', '111319', '148935', '20'), +('7', '104', '8', '111331', '166879', '20'), +('7', '104', '8', '111332', '149960', '20'), +('7', '104', '8', '111031', '137051', '20'), +('7', '104', '8', '111030', '130109', '20'), +('7', '104', '6', '111322', '152303', '20'), +('7', '104', '6', '111326', '149070', '20'), +('7', '104', '6', '111021', '133933', '20'), +('7', '104', '6', '111024', '133479', '20'), +('7', '104', '17', '49656', '72018', '20'), +('7', '104', '17', '56084', '55143', '20'), +('7', '104', '17', '56045', '53716', '20'), +('7', '104', '17', '104420', '49163', '20'), +('7', '104', '7', '56040', '95855', '20'), +('7', '104', '7', '56079', '89168', '20'), +('7', '104', '7', '104418', '84207', '20'), +('7', '104', '7', '49656', '72018', '20'), +('7', '104', '9', '62992', '111590', '20'), +('7', '104', '9', '104414', '91586', '20'), +('7', '104', '9', '49656', '72018', '20'), +('7', '104', '9', '54836', '71054', '20'), +('7', '104', '15', '111343', '182397', '20'), +('7', '104', '15', '111347', '181432', '20'), +('7', '104', '15', '111339', '178677', '20'), +('7', '104', '15', '111346', '178587', '20'), +('7', '104', '20', '111354', '188813', '20'), +('7', '104', '20', '111351', '183985', '20'), +('7', '104', '20', '111352', '182562', '20'), +('7', '104', '20', '111050', '162778', '20'), +('7', '104', '12', '56074', '104484', '20'), +('7', '104', '12', '104415', '93604', '20'), +('7', '104', '12', '81795', '83093', '20'), +('7', '104', '12', '49656', '72018', '20'), +('7', '104', '18', '62986', '82589', '20'), +('7', '104', '18', '49656', '72018', '20'), +('7', '104', '18', '104419', '67179', '20'), +('7', '104', '18', '54851', '53957', '20'), +('7', '104', '19', '62990', '102811', '20'), +('7', '104', '19', '104416', '86749', '20'), +('7', '104', '19', '49656', '72018', '20'), +('7', '104', '19', '102268', '49556', '20'), +('7', '104', '13', '111527', '522637', '20'), +('7', '104', '13', '111528', '470691', '20'), +('7', '104', '13', '111227', '456916', '20'), +('7', '104', '13', '111228', '432909', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '104', '14', '111527', '522637', '20'), +('7', '104', '14', '111528', '470691', '20'), +('7', '104', '14', '111227', '456916', '20'), +('7', '104', '14', '111228', '432909', '20'), +('7', '104', '11', '133816', '202831', '20'), +('7', '104', '11', '111337', '143349', '20'), +('7', '104', '11', '111034', '131984', '20'), +('7', '104', '11', '111036', '131170', '20'), +('7', '105', '22', '12425', '0', '23'), +('7', '105', '22', '21807', '0', '23'), +('7', '105', '22', '21805', '0', '23'), +('7', '105', '22', '39342', '0', '23'), +('7', '105', '1', '98769', '303399', '23'), +('7', '105', '1', '111303', '181843', '23'), +('7', '105', '1', '111308', '181684', '23'), +('7', '105', '1', '111300', '180701', '23'), +('7', '105', '2', '104417', '94917', '23'), +('7', '105', '2', '94056', '77512', '23'), +('7', '105', '2', '49656', '72018', '23'), +('7', '105', '2', '62985', '59188', '23'), +('7', '105', '3', '111316', '177864', '23'), +('7', '105', '3', '111313', '170448', '23'), +('7', '105', '3', '111012', '158860', '23'), +('7', '105', '3', '111015', '156049', '23'), +('7', '105', '5', '111318', '170013', '23'), +('7', '105', '5', '111321', '169540', '23'), +('7', '105', '5', '111017', '158426', '23'), +('7', '105', '5', '111319', '148938', '23'), +('7', '105', '8', '111331', '166882', '23'), +('7', '105', '8', '111332', '149962', '23'), +('7', '105', '8', '111031', '137052', '23'), +('7', '105', '8', '111030', '130112', '23'), +('7', '105', '6', '111322', '152305', '23'), +('7', '105', '6', '111326', '149072', '23'), +('7', '105', '6', '111021', '133935', '23'), +('7', '105', '6', '111024', '133481', '23'), +('7', '105', '17', '49656', '72018', '23'), +('7', '105', '17', '56084', '55145', '23'), +('7', '105', '17', '56045', '53717', '23'), +('7', '105', '17', '104420', '49165', '23'), +('7', '105', '7', '56040', '95857', '23'), +('7', '105', '7', '56079', '89170', '23'), +('7', '105', '7', '104418', '84209', '23'), +('7', '105', '7', '49656', '72018', '23'), +('7', '105', '9', '62992', '111593', '23'), +('7', '105', '9', '104414', '91589', '23'), +('7', '105', '9', '49656', '72018', '23'), +('7', '105', '9', '54836', '71056', '23'), +('7', '105', '15', '111343', '182399', '23'), +('7', '105', '15', '111347', '181435', '23'), +('7', '105', '15', '111339', '178679', '23'), +('7', '105', '15', '111346', '178590', '23'), +('7', '105', '20', '111354', '188815', '23'), +('7', '105', '20', '111351', '183987', '23'), +('7', '105', '20', '111352', '182565', '23'), +('7', '105', '20', '111050', '162780', '23'), +('7', '105', '12', '56074', '104485', '23'), +('7', '105', '12', '104415', '93607', '23'), +('7', '105', '12', '81795', '83096', '23'), +('7', '105', '12', '49656', '72018', '23'), +('7', '105', '18', '62986', '82591', '23'), +('7', '105', '18', '49656', '72018', '23'), +('7', '105', '18', '104419', '67181', '23'), +('7', '105', '18', '54851', '53959', '23'), +('7', '105', '19', '62990', '102813', '23'), +('7', '105', '19', '104416', '86750', '23'), +('7', '105', '19', '49656', '72018', '23'), +('7', '105', '19', '102268', '49558', '23'), +('7', '105', '13', '111527', '523532', '23'), +('7', '105', '13', '111528', '471231', '23'), +('7', '105', '13', '111227', '457721', '23'), +('7', '105', '13', '111228', '433450', '23'), +('7', '105', '14', '111527', '523532', '23'), +('7', '105', '14', '111528', '471231', '23'), +('7', '105', '14', '111227', '457721', '23'), +('7', '105', '14', '111228', '433450', '23'), +('7', '105', '11', '133816', '202833', '23'), +('7', '105', '11', '111337', '143351', '23'), +('7', '105', '11', '111034', '131986', '23'), +('7', '105', '11', '111036', '131172', '23'), +('7', '105', '22', '12425', '0', '22'), +('7', '105', '22', '21807', '0', '22'), +('7', '105', '22', '21805', '0', '22'), +('7', '105', '22', '39342', '0', '22'), +('7', '105', '1', '98769', '303399', '22'), +('7', '105', '1', '111303', '181843', '22'), +('7', '105', '1', '111308', '181684', '22'), +('7', '105', '1', '111300', '180701', '22'), +('7', '105', '2', '104417', '94917', '22'), +('7', '105', '2', '94056', '77512', '22'), +('7', '105', '2', '49656', '72018', '22'), +('7', '105', '2', '62985', '59188', '22'), +('7', '105', '3', '111316', '177864', '22'), +('7', '105', '3', '111313', '170448', '22'), +('7', '105', '3', '111012', '158860', '22'), +('7', '105', '3', '111015', '156049', '22'), +('7', '105', '5', '111318', '170013', '22'), +('7', '105', '5', '111321', '169540', '22'), +('7', '105', '5', '111017', '158426', '22'), +('7', '105', '5', '111319', '148938', '22'), +('7', '105', '8', '111331', '166882', '22'), +('7', '105', '8', '111332', '149962', '22'), +('7', '105', '8', '111031', '137052', '22'), +('7', '105', '8', '111030', '130112', '22'), +('7', '105', '6', '111322', '152305', '22'), +('7', '105', '6', '111326', '149072', '22'), +('7', '105', '6', '111021', '133935', '22'), +('7', '105', '6', '111024', '133481', '22'), +('7', '105', '17', '49656', '72018', '22'), +('7', '105', '17', '56084', '55145', '22'), +('7', '105', '17', '56045', '53717', '22'), +('7', '105', '17', '104420', '49165', '22'), +('7', '105', '7', '56040', '95857', '22'), +('7', '105', '7', '56079', '89170', '22'), +('7', '105', '7', '104418', '84209', '22'), +('7', '105', '7', '49656', '72018', '22'), +('7', '105', '9', '62992', '111593', '22'), +('7', '105', '9', '104414', '91589', '22'), +('7', '105', '9', '49656', '72018', '22'), +('7', '105', '9', '54836', '71056', '22'), +('7', '105', '15', '111343', '182399', '22'), +('7', '105', '15', '111347', '181435', '22'), +('7', '105', '15', '111339', '178679', '22'), +('7', '105', '15', '111346', '178590', '22'), +('7', '105', '20', '111354', '188815', '22'), +('7', '105', '20', '111351', '183987', '22'), +('7', '105', '20', '111352', '182565', '22'), +('7', '105', '20', '111050', '162780', '22'), +('7', '105', '12', '56074', '104485', '22'), +('7', '105', '12', '104415', '93607', '22'), +('7', '105', '12', '81795', '83096', '22'), +('7', '105', '12', '49656', '72018', '22'), +('7', '105', '18', '62986', '82591', '22'), +('7', '105', '18', '49656', '72018', '22'), +('7', '105', '18', '104419', '67181', '22'), +('7', '105', '18', '54851', '53959', '22'), +('7', '105', '19', '62990', '102813', '22'), +('7', '105', '19', '104416', '86750', '22'), +('7', '105', '19', '49656', '72018', '22'), +('7', '105', '19', '102268', '49558', '22'), +('7', '105', '13', '111527', '523532', '22'), +('7', '105', '13', '111528', '471231', '22'), +('7', '105', '13', '111227', '457721', '22'), +('7', '105', '13', '111228', '433450', '22'), +('7', '105', '14', '111527', '523532', '22'), +('7', '105', '14', '111528', '471231', '22'), +('7', '105', '14', '111227', '457721', '22'), +('7', '105', '14', '111228', '433450', '22'), +('7', '105', '11', '133816', '202833', '22'), +('7', '105', '11', '111337', '143351', '22'), +('7', '105', '11', '111034', '131986', '22'), +('7', '105', '11', '111036', '131172', '22'), +('7', '105', '22', '12425', '0', '21'), +('7', '105', '22', '21807', '0', '21'), +('7', '105', '22', '21805', '0', '21'), +('7', '105', '22', '39342', '0', '21'), +('7', '105', '1', '98769', '303399', '21'), +('7', '105', '1', '111303', '181843', '21'), +('7', '105', '1', '111308', '181684', '21'), +('7', '105', '1', '111300', '180701', '21'), +('7', '105', '2', '104417', '94917', '21'), +('7', '105', '2', '94056', '77512', '21'), +('7', '105', '2', '49656', '72018', '21'), +('7', '105', '2', '62985', '59188', '21'), +('7', '105', '3', '111316', '177864', '21'), +('7', '105', '3', '111313', '170448', '21'), +('7', '105', '3', '111012', '158860', '21'), +('7', '105', '3', '111015', '156049', '21'), +('7', '105', '5', '111318', '170013', '21'), +('7', '105', '5', '111321', '169540', '21'), +('7', '105', '5', '111017', '158426', '21'), +('7', '105', '5', '111319', '148938', '21'), +('7', '105', '8', '111331', '166882', '21'), +('7', '105', '8', '111332', '149962', '21'), +('7', '105', '8', '111031', '137052', '21'), +('7', '105', '8', '111030', '130112', '21'), +('7', '105', '6', '111322', '152305', '21'), +('7', '105', '6', '111326', '149072', '21'), +('7', '105', '6', '111021', '133935', '21'), +('7', '105', '6', '111024', '133481', '21'), +('7', '105', '17', '49656', '72018', '21'), +('7', '105', '17', '56084', '55145', '21'), +('7', '105', '17', '56045', '53717', '21'), +('7', '105', '17', '104420', '49165', '21'), +('7', '105', '7', '56040', '95857', '21'), +('7', '105', '7', '56079', '89170', '21'), +('7', '105', '7', '104418', '84209', '21'), +('7', '105', '7', '49656', '72018', '21'), +('7', '105', '9', '62992', '111593', '21'), +('7', '105', '9', '104414', '91589', '21'), +('7', '105', '9', '49656', '72018', '21'), +('7', '105', '9', '54836', '71056', '21'), +('7', '105', '15', '111343', '182399', '21'), +('7', '105', '15', '111347', '181435', '21'), +('7', '105', '15', '111339', '178679', '21'), +('7', '105', '15', '111346', '178590', '21'), +('7', '105', '20', '111354', '188815', '21'), +('7', '105', '20', '111351', '183987', '21'), +('7', '105', '20', '111352', '182565', '21'), +('7', '105', '20', '111050', '162780', '21'), +('7', '105', '12', '56074', '104485', '21'), +('7', '105', '12', '104415', '93607', '21'), +('7', '105', '12', '81795', '83096', '21'), +('7', '105', '12', '49656', '72018', '21'), +('7', '105', '18', '62986', '82591', '21'), +('7', '105', '18', '49656', '72018', '21'), +('7', '105', '18', '104419', '67181', '21'), +('7', '105', '18', '54851', '53959', '21'), +('7', '105', '19', '62990', '102813', '21'), +('7', '105', '19', '104416', '86750', '21'), +('7', '105', '19', '49656', '72018', '21'), +('7', '105', '19', '102268', '49558', '21'), +('7', '105', '13', '111527', '523532', '21'), +('7', '105', '13', '111528', '471231', '21'), +('7', '105', '13', '111227', '457721', '21'), +('7', '105', '13', '111228', '433450', '21'), +('7', '105', '14', '111527', '523532', '21'), +('7', '105', '14', '111528', '471231', '21'), +('7', '105', '14', '111227', '457721', '21'), +('7', '105', '14', '111228', '433450', '21'), +('7', '105', '11', '133816', '202833', '21'), +('7', '105', '11', '111337', '143351', '21'), +('7', '105', '11', '111034', '131986', '21'), +('7', '105', '11', '111036', '131172', '21'), +('7', '106', '22', '12425', '0', '23'), +('7', '106', '22', '21807', '0', '23'), +('7', '106', '22', '21805', '0', '23'), +('7', '106', '22', '39342', '0', '23'), +('7', '106', '1', '98769', '303401', '23'), +('7', '106', '1', '111303', '181847', '23'), +('7', '106', '1', '111308', '181687', '23'), +('7', '106', '1', '111300', '180703', '23'), +('7', '106', '2', '104417', '94920', '23'), +('7', '106', '2', '94056', '77514', '23'), +('7', '106', '2', '49656', '72019', '23'), +('7', '106', '2', '62985', '59188', '23'), +('7', '106', '3', '111316', '177866', '23'), +('7', '106', '3', '111313', '170450', '23'), +('7', '106', '3', '111012', '158862', '23'), +('7', '106', '3', '111015', '156051', '23'), +('7', '106', '5', '111318', '170015', '23'), +('7', '106', '5', '111321', '169543', '23'), +('7', '106', '5', '111017', '158428', '23'), +('7', '106', '5', '111319', '148941', '23'), +('7', '106', '8', '111331', '166885', '23'), +('7', '106', '8', '111332', '149964', '23'), +('7', '106', '8', '111031', '137054', '23'), +('7', '106', '8', '111030', '130114', '23'), +('7', '106', '6', '111322', '152307', '23'), +('7', '106', '6', '111326', '149074', '23'), +('7', '106', '6', '111021', '133937', '23'), +('7', '106', '6', '111024', '133483', '23'), +('7', '106', '17', '49656', '72019', '23'), +('7', '106', '17', '56084', '55147', '23'), +('7', '106', '17', '56045', '53718', '23'), +('7', '106', '17', '104420', '49167', '23'), +('7', '106', '7', '56040', '95860', '23'), +('7', '106', '7', '56079', '89173', '23'), +('7', '106', '7', '104418', '84211', '23'), +('7', '106', '7', '49656', '72019', '23'), +('7', '106', '9', '62992', '111596', '23'), +('7', '106', '9', '104414', '91591', '23'), +('7', '106', '9', '49656', '72019', '23'), +('7', '106', '9', '54836', '71059', '23'), +('7', '106', '15', '111343', '182401', '23'), +('7', '106', '15', '111347', '181438', '23'), +('7', '106', '15', '111339', '178682', '23'), +('7', '106', '15', '111346', '178592', '23'), +('7', '106', '20', '111354', '188818', '23'), +('7', '106', '20', '111351', '183988', '23'), +('7', '106', '20', '111352', '182568', '23'), +('7', '106', '20', '111050', '162781', '23'), +('7', '106', '12', '56074', '104486', '23'), +('7', '106', '12', '104415', '93611', '23'), +('7', '106', '12', '81795', '83098', '23'), +('7', '106', '12', '49656', '72019', '23'), +('7', '106', '18', '62986', '82594', '23'), +('7', '106', '18', '49656', '72019', '23'), +('7', '106', '18', '104419', '67182', '23'), +('7', '106', '18', '54851', '53961', '23'), +('7', '106', '19', '62990', '102816', '23'), +('7', '106', '19', '104416', '86751', '23'), +('7', '106', '19', '49656', '72019', '23'), +('7', '106', '19', '102268', '49560', '23'), +('7', '106', '13', '111527', '524428', '23'), +('7', '106', '13', '111528', '471771', '23'), +('7', '106', '13', '111227', '458485', '23'), +('7', '106', '13', '111228', '433949', '23'), +('7', '106', '14', '111527', '524428', '23'), +('7', '106', '14', '111528', '471771', '23'), +('7', '106', '14', '111227', '458485', '23'), +('7', '106', '14', '111228', '433949', '23'), +('7', '106', '11', '133816', '202835', '23'), +('7', '106', '11', '111337', '143353', '23'), +('7', '106', '11', '111034', '131988', '23'), +('7', '106', '11', '111036', '131174', '23'), +('7', '107', '22', '12425', '0', '23'), +('7', '107', '22', '21807', '0', '23'), +('7', '107', '22', '21805', '0', '23'), +('7', '107', '22', '39342', '0', '23'), +('7', '107', '1', '98769', '303403', '23'), +('7', '107', '1', '111303', '181851', '23'), +('7', '107', '1', '111308', '181690', '23'), +('7', '107', '1', '111300', '180705', '23'), +('7', '107', '2', '104417', '94922', '23'), +('7', '107', '2', '94056', '77515', '23'), +('7', '107', '2', '49656', '72019', '23'), +('7', '107', '2', '62985', '59189', '23'), +('7', '107', '3', '111316', '177869', '23'), +('7', '107', '3', '111313', '170452', '23'), +('7', '107', '3', '111012', '158864', '23'), +('7', '107', '3', '111015', '156054', '23'), +('7', '107', '5', '111318', '170016', '23'), +('7', '107', '5', '111321', '169545', '23'), +('7', '107', '5', '111017', '158430', '23'), +('7', '107', '5', '111319', '148944', '23'), +('7', '107', '8', '111331', '166888', '23'), +('7', '107', '8', '111332', '149965', '23'), +('7', '107', '8', '111031', '137056', '23'), +('7', '107', '8', '111030', '130117', '23'), +('7', '107', '6', '111322', '152309', '23'), +('7', '107', '6', '111326', '149076', '23'), +('7', '107', '6', '111021', '133939', '23'), +('7', '107', '6', '111024', '133485', '23'), +('7', '107', '17', '49656', '72019', '23'), +('7', '107', '17', '56084', '55148', '23'), +('7', '107', '17', '56045', '53720', '23'), +('7', '107', '17', '104420', '49169', '23'), +('7', '107', '7', '56040', '95862', '23'), +('7', '107', '7', '56079', '89175', '23'), +('7', '107', '7', '104418', '84212', '23'), +('7', '107', '7', '49656', '72019', '23'), +('7', '107', '9', '62992', '111598', '23'), +('7', '107', '9', '104414', '91594', '23'), +('7', '107', '9', '49656', '72019', '23'), +('7', '107', '9', '54836', '71061', '23'), +('7', '107', '15', '111343', '182403', '23'), +('7', '107', '15', '111347', '181441', '23'), +('7', '107', '15', '111339', '178684', '23'), +('7', '107', '15', '111346', '178595', '23'), +('7', '107', '20', '111354', '188820', '23'), +('7', '107', '20', '111351', '183990', '23'), +('7', '107', '20', '111352', '182571', '23'), +('7', '107', '20', '111050', '162783', '23'), +('7', '107', '12', '56074', '104488', '23'), +('7', '107', '12', '104415', '93614', '23'), +('7', '107', '12', '81795', '83100', '23'), +('7', '107', '12', '49656', '72019', '23'), +('7', '107', '18', '62986', '82597', '23'), +('7', '107', '18', '49656', '72019', '23'), +('7', '107', '18', '104419', '67184', '23'), +('7', '107', '18', '54851', '53962', '23'), +('7', '107', '19', '62990', '102818', '23'), +('7', '107', '19', '104416', '86752', '23'), +('7', '107', '19', '49656', '72019', '23'), +('7', '107', '19', '102268', '49561', '23'), +('7', '107', '13', '111527', '525281', '23'), +('7', '107', '13', '111528', '472311', '23'), +('7', '107', '13', '111227', '459289', '23'), +('7', '107', '13', '111228', '434448', '23'), +('7', '107', '14', '111527', '525281', '23'), +('7', '107', '14', '111528', '472311', '23'), +('7', '107', '14', '111227', '459289', '23'), +('7', '107', '14', '111228', '434448', '23'), +('7', '107', '11', '133816', '202837', '23'), +('7', '107', '11', '111337', '143355', '23'), +('7', '107', '11', '111034', '131990', '23'), +('7', '107', '11', '111036', '131177', '23'), +('7', '108', '22', '12425', '0', '23'), +('7', '108', '22', '21807', '0', '23'), +('7', '108', '22', '21805', '0', '23'), +('7', '108', '22', '39342', '0', '23'), +('7', '108', '1', '98769', '303406', '23'), +('7', '108', '1', '111303', '181854', '23'), +('7', '108', '1', '111308', '181692', '23'), +('7', '108', '1', '111300', '180708', '23'), +('7', '108', '2', '104417', '94925', '23'), +('7', '108', '2', '94056', '77517', '23'), +('7', '108', '2', '49656', '72019', '23'), +('7', '108', '2', '62985', '59190', '23'), +('7', '108', '3', '111316', '177872', '23'), +('7', '108', '3', '111313', '170454', '23'), +('7', '108', '3', '111012', '158866', '23'), +('7', '108', '3', '111015', '156057', '23'), +('7', '108', '5', '111318', '170018', '23'), +('7', '108', '5', '111321', '169548', '23'), +('7', '108', '5', '111017', '158432', '23'), +('7', '108', '5', '111319', '148947', '23'), +('7', '108', '8', '111331', '166891', '23'), +('7', '108', '8', '111332', '149967', '23'), +('7', '108', '8', '111031', '137058', '23'), +('7', '108', '8', '111030', '130119', '23'), +('7', '108', '6', '111322', '152311', '23'), +('7', '108', '6', '111326', '149079', '23'), +('7', '108', '6', '111021', '133941', '23'), +('7', '108', '6', '111024', '133487', '23'), +('7', '108', '17', '49656', '72019', '23'), +('7', '108', '17', '56084', '55150', '23'), +('7', '108', '17', '56045', '53721', '23'), +('7', '108', '17', '104420', '49171', '23'), +('7', '108', '7', '56040', '95865', '23'), +('7', '108', '7', '56079', '89178', '23'), +('7', '108', '7', '104418', '84214', '23'), +('7', '108', '7', '49656', '72019', '23'), +('7', '108', '9', '62992', '111601', '23'), +('7', '108', '9', '104414', '91597', '23'), +('7', '108', '9', '49656', '72019', '23'), +('7', '108', '9', '54836', '71063', '23'), +('7', '108', '15', '111343', '182405', '23'), +('7', '108', '15', '111347', '181445', '23'), +('7', '108', '15', '111339', '178686', '23'), +('7', '108', '15', '111346', '178597', '23'), +('7', '108', '20', '111354', '188823', '23'), +('7', '108', '20', '111351', '183991', '23'), +('7', '108', '20', '111352', '182574', '23'), +('7', '108', '20', '111050', '162785', '23'), +('7', '108', '12', '56074', '104489', '23'), +('7', '108', '12', '104415', '93618', '23'), +('7', '108', '12', '81795', '83103', '23'), +('7', '108', '12', '49656', '72019', '23'), +('7', '108', '18', '62986', '82600', '23'), +('7', '108', '18', '49656', '72019', '23'), +('7', '108', '18', '104419', '67186', '23'), +('7', '108', '18', '54851', '53964', '23'), +('7', '108', '19', '62990', '102821', '23'), +('7', '108', '19', '104416', '86753', '23'), +('7', '108', '19', '49656', '72019', '23'), +('7', '108', '19', '102268', '49563', '23'), +('7', '108', '13', '111527', '526176', '23'), +('7', '108', '13', '111528', '472851', '23'), +('7', '108', '13', '111227', '460094', '23'), +('7', '108', '13', '111228', '434947', '23'), +('7', '108', '14', '111527', '526176', '23'), +('7', '108', '14', '111528', '472851', '23'), +('7', '108', '14', '111227', '460094', '23'), +('7', '108', '14', '111228', '434947', '23'), +('7', '108', '11', '133816', '202839', '23'), +('7', '108', '11', '111337', '143357', '23'), +('7', '108', '11', '111034', '131992', '23'), +('7', '108', '11', '111036', '131179', '23'), +('7', '109', '22', '12425', '0', '23'), +('7', '109', '22', '21807', '0', '23'), +('7', '109', '22', '21805', '0', '23'), +('7', '109', '22', '39342', '0', '23'), +('7', '109', '1', '98769', '303407', '23'), +('7', '109', '1', '111303', '181857', '23'), +('7', '109', '1', '111308', '181695', '23'), +('7', '109', '1', '111300', '180709', '23'), +('7', '109', '2', '104417', '94927', '23'), +('7', '109', '2', '94056', '77518', '23'), +('7', '109', '2', '49656', '72020', '23'), +('7', '109', '2', '62985', '59191', '23'), +('7', '109', '3', '111316', '177874', '23'), +('7', '109', '3', '111313', '170456', '23'), +('7', '109', '3', '111012', '158868', '23'), +('7', '109', '3', '111015', '156059', '23'), +('7', '109', '5', '111318', '170020', '23'), +('7', '109', '5', '111321', '169550', '23'), +('7', '109', '5', '111017', '158434', '23'), +('7', '109', '5', '111319', '148950', '23'), +('7', '109', '8', '111331', '166893', '23'), +('7', '109', '8', '111332', '149968', '23'), +('7', '109', '8', '111031', '137059', '23'), +('7', '109', '8', '111030', '130121', '23'), +('7', '109', '6', '111322', '152313', '23'), +('7', '109', '6', '111326', '149080', '23'), +('7', '109', '6', '111021', '133943', '23'), +('7', '109', '6', '111024', '133488', '23'), +('7', '109', '17', '49656', '72020', '23'), +('7', '109', '17', '56084', '55152', '23'), +('7', '109', '17', '56045', '53722', '23'), +('7', '109', '17', '104420', '49173', '23'), +('7', '109', '7', '56040', '95867', '23'), +('7', '109', '7', '56079', '89180', '23'), +('7', '109', '7', '104418', '84216', '23'), +('7', '109', '7', '49656', '72020', '23'), +('7', '109', '9', '62992', '111603', '23'), +('7', '109', '9', '104414', '91599', '23'), +('7', '109', '9', '49656', '72020', '23'), +('7', '109', '9', '54836', '71065', '23'), +('7', '109', '15', '111343', '182407', '23'), +('7', '109', '15', '111347', '181447', '23'), +('7', '109', '15', '111339', '178688', '23'), +('7', '109', '15', '111346', '178600', '23'), +('7', '109', '20', '111354', '188825', '23'), +('7', '109', '20', '111351', '183993', '23'), +('7', '109', '20', '111352', '182576', '23'), +('7', '109', '20', '111050', '162786', '23'), +('7', '109', '12', '56074', '104491', '23'), +('7', '109', '12', '104415', '93621', '23'), +('7', '109', '12', '81795', '83105', '23'), +('7', '109', '12', '49656', '72020', '23'), +('7', '109', '18', '62986', '82602', '23'), +('7', '109', '18', '49656', '72020', '23'), +('7', '109', '18', '104419', '67188', '23'), +('7', '109', '18', '54851', '53966', '23'), +('7', '109', '19', '62990', '102823', '23'), +('7', '109', '19', '104416', '86754', '23'), +('7', '109', '19', '49656', '72020', '23'), +('7', '109', '19', '102268', '49564', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '109', '13', '111527', '527072', '23'), +('7', '109', '13', '111528', '473391', '23'), +('7', '109', '13', '111227', '460898', '23'), +('7', '109', '13', '111228', '435445', '23'), +('7', '109', '14', '111527', '527072', '23'), +('7', '109', '14', '111528', '473391', '23'), +('7', '109', '14', '111227', '460898', '23'), +('7', '109', '14', '111228', '435445', '23'), +('7', '109', '11', '133816', '202841', '23'), +('7', '109', '11', '111337', '143358', '23'), +('7', '109', '11', '111034', '131994', '23'), +('7', '109', '11', '111036', '131181', '23'), +('7', '110', '22', '12425', '0', '25'), +('7', '110', '22', '21807', '0', '25'), +('7', '110', '22', '39342', '0', '25'), +('7', '110', '22', '7867', '0', '25'), +('7', '110', '1', '98769', '303409', '25'), +('7', '110', '1', '111303', '181861', '25'), +('7', '110', '1', '111308', '181698', '25'), +('7', '110', '1', '111300', '180711', '25'), +('7', '110', '2', '104417', '94930', '25'), +('7', '110', '2', '94056', '77520', '25'), +('7', '110', '2', '49656', '72020', '25'), +('7', '110', '2', '62985', '59192', '25'), +('7', '110', '3', '111316', '177877', '25'), +('7', '110', '3', '111313', '170458', '25'), +('7', '110', '3', '111012', '158870', '25'), +('7', '110', '3', '111015', '156062', '25'), +('7', '110', '5', '111318', '170022', '25'), +('7', '110', '5', '111321', '169553', '25'), +('7', '110', '5', '111017', '158436', '25'), +('7', '110', '5', '111319', '148953', '25'), +('7', '110', '8', '111331', '166896', '25'), +('7', '110', '8', '111332', '149970', '25'), +('7', '110', '8', '111031', '137061', '25'), +('7', '110', '8', '111030', '130124', '25'), +('7', '110', '6', '111322', '152315', '25'), +('7', '110', '6', '111326', '149083', '25'), +('7', '110', '6', '111021', '133945', '25'), +('7', '110', '6', '111024', '133490', '25'), +('7', '110', '17', '49656', '72020', '25'), +('7', '110', '17', '56084', '55153', '25'), +('7', '110', '17', '56045', '53723', '25'), +('7', '110', '17', '104420', '49175', '25'), +('7', '110', '7', '56040', '95870', '25'), +('7', '110', '7', '56079', '89182', '25'), +('7', '110', '7', '104418', '84217', '25'), +('7', '110', '7', '49656', '72020', '25'), +('7', '110', '9', '62992', '111606', '25'), +('7', '110', '9', '104414', '91602', '25'), +('7', '110', '9', '49656', '72020', '25'), +('7', '110', '9', '54836', '71067', '25'), +('7', '110', '15', '111343', '182409', '25'), +('7', '110', '15', '111347', '181451', '25'), +('7', '110', '15', '111339', '178690', '25'), +('7', '110', '15', '111346', '178602', '25'), +('7', '110', '20', '111354', '188827', '25'), +('7', '110', '20', '111351', '183995', '25'), +('7', '110', '20', '111352', '182579', '25'), +('7', '110', '20', '111050', '162788', '25'), +('7', '110', '12', '56074', '104492', '25'), +('7', '110', '12', '104415', '93624', '25'), +('7', '110', '12', '81795', '83108', '25'), +('7', '110', '12', '49656', '72020', '25'), +('7', '110', '18', '62986', '82605', '25'), +('7', '110', '18', '49656', '72020', '25'), +('7', '110', '18', '104419', '67189', '25'), +('7', '110', '18', '54851', '53967', '25'), +('7', '110', '19', '62990', '102825', '25'), +('7', '110', '19', '104416', '86756', '25'), +('7', '110', '19', '49656', '72020', '25'), +('7', '110', '19', '102268', '49566', '25'), +('7', '110', '13', '111527', '529667', '25'), +('7', '110', '13', '111528', '473931', '25'), +('7', '110', '13', '111227', '463306', '25'), +('7', '110', '13', '111228', '435944', '25'), +('7', '110', '14', '111527', '529667', '25'), +('7', '110', '14', '111528', '473931', '25'), +('7', '110', '14', '111227', '463306', '25'), +('7', '110', '14', '111228', '435944', '25'), +('7', '110', '11', '85213', '270221', '25'), +('7', '110', '11', '133816', '202843', '25'), +('7', '110', '11', '111337', '143360', '25'), +('7', '110', '11', '111034', '131996', '25'), +('7', '110', '22', '12425', '0', '24'), +('7', '110', '22', '21807', '0', '24'), +('7', '110', '22', '39342', '0', '24'), +('7', '110', '22', '7867', '0', '24'), +('7', '110', '1', '98769', '303409', '24'), +('7', '110', '1', '111303', '181861', '24'), +('7', '110', '1', '111308', '181698', '24'), +('7', '110', '1', '111300', '180711', '24'), +('7', '110', '2', '104417', '94930', '24'), +('7', '110', '2', '94056', '77520', '24'), +('7', '110', '2', '49656', '72020', '24'), +('7', '110', '2', '62985', '59192', '24'), +('7', '110', '3', '111316', '177877', '24'), +('7', '110', '3', '111313', '170458', '24'), +('7', '110', '3', '111012', '158870', '24'), +('7', '110', '3', '111015', '156062', '24'), +('7', '110', '5', '111318', '170022', '24'), +('7', '110', '5', '111321', '169553', '24'), +('7', '110', '5', '111017', '158436', '24'), +('7', '110', '5', '111319', '148953', '24'), +('7', '110', '8', '111331', '166896', '24'), +('7', '110', '8', '111332', '149970', '24'), +('7', '110', '8', '111031', '137061', '24'), +('7', '110', '8', '111030', '130124', '24'), +('7', '110', '6', '111322', '152315', '24'), +('7', '110', '6', '111326', '149083', '24'), +('7', '110', '6', '111021', '133945', '24'), +('7', '110', '6', '111024', '133490', '24'), +('7', '110', '17', '49656', '72020', '24'), +('7', '110', '17', '56084', '55153', '24'), +('7', '110', '17', '56045', '53723', '24'), +('7', '110', '17', '104420', '49175', '24'), +('7', '110', '7', '56040', '95870', '24'), +('7', '110', '7', '56079', '89182', '24'), +('7', '110', '7', '104418', '84217', '24'), +('7', '110', '7', '49656', '72020', '24'), +('7', '110', '9', '62992', '111606', '24'), +('7', '110', '9', '104414', '91602', '24'), +('7', '110', '9', '49656', '72020', '24'), +('7', '110', '9', '54836', '71067', '24'), +('7', '110', '15', '111343', '182409', '24'), +('7', '110', '15', '111347', '181451', '24'), +('7', '110', '15', '111339', '178690', '24'), +('7', '110', '15', '111346', '178602', '24'), +('7', '110', '20', '111354', '188827', '24'), +('7', '110', '20', '111351', '183995', '24'), +('7', '110', '20', '111352', '182579', '24'), +('7', '110', '20', '111050', '162788', '24'), +('7', '110', '12', '56074', '104492', '24'), +('7', '110', '12', '104415', '93624', '24'), +('7', '110', '12', '81795', '83108', '24'), +('7', '110', '12', '49656', '72020', '24'), +('7', '110', '18', '62986', '82605', '24'), +('7', '110', '18', '49656', '72020', '24'), +('7', '110', '18', '104419', '67189', '24'), +('7', '110', '18', '54851', '53967', '24'), +('7', '110', '19', '62990', '102825', '24'), +('7', '110', '19', '104416', '86756', '24'), +('7', '110', '19', '49656', '72020', '24'), +('7', '110', '19', '102268', '49566', '24'), +('7', '110', '13', '111527', '529667', '24'), +('7', '110', '13', '111528', '473931', '24'), +('7', '110', '13', '111227', '463306', '24'), +('7', '110', '13', '111228', '435944', '24'), +('7', '110', '14', '111527', '529667', '24'), +('7', '110', '14', '111528', '473931', '24'), +('7', '110', '14', '111227', '463306', '24'), +('7', '110', '14', '111228', '435944', '24'), +('7', '110', '11', '85213', '270221', '24'), +('7', '110', '11', '133816', '202843', '24'), +('7', '110', '11', '111337', '143360', '24'), +('7', '110', '11', '111034', '131996', '24'), +('7', '111', '22', '12425', '0', '25'), +('7', '111', '22', '21807', '0', '25'), +('7', '111', '22', '39342', '0', '25'), +('7', '111', '22', '7867', '0', '25'), +('7', '111', '1', '98769', '303412', '25'), +('7', '111', '1', '111303', '181865', '25'), +('7', '111', '1', '111308', '181700', '25'), +('7', '111', '1', '111300', '180714', '25'), +('7', '111', '2', '104417', '94933', '25'), +('7', '111', '2', '94056', '77522', '25'), +('7', '111', '2', '49656', '72020', '25'), +('7', '111', '2', '62985', '59193', '25'), +('7', '111', '3', '111316', '177880', '25'), +('7', '111', '3', '111313', '170460', '25'), +('7', '111', '3', '111012', '158872', '25'), +('7', '111', '3', '111015', '156065', '25'), +('7', '111', '5', '111318', '170024', '25'), +('7', '111', '5', '111321', '169555', '25'), +('7', '111', '5', '111017', '158438', '25'), +('7', '111', '5', '111319', '148956', '25'), +('7', '111', '8', '111331', '166899', '25'), +('7', '111', '8', '111332', '149972', '25'), +('7', '111', '8', '111031', '137063', '25'), +('7', '111', '8', '111030', '130126', '25'), +('7', '111', '6', '111322', '152317', '25'), +('7', '111', '6', '111326', '149085', '25'), +('7', '111', '6', '111021', '133946', '25'), +('7', '111', '6', '111024', '133492', '25'), +('7', '111', '17', '49656', '72020', '25'), +('7', '111', '17', '56084', '55155', '25'), +('7', '111', '17', '56045', '53724', '25'), +('7', '111', '17', '104420', '49177', '25'), +('7', '111', '7', '56040', '95872', '25'), +('7', '111', '7', '56079', '89185', '25'), +('7', '111', '7', '104418', '84219', '25'), +('7', '111', '7', '49656', '72020', '25'), +('7', '111', '9', '62992', '111609', '25'), +('7', '111', '9', '104414', '91604', '25'), +('7', '111', '9', '49656', '72020', '25'), +('7', '111', '9', '54836', '71069', '25'), +('7', '111', '15', '111343', '182411', '25'), +('7', '111', '15', '111347', '181454', '25'), +('7', '111', '15', '111339', '178693', '25'), +('7', '111', '15', '111346', '178605', '25'), +('7', '111', '20', '111354', '188830', '25'), +('7', '111', '20', '111351', '183996', '25'), +('7', '111', '20', '111352', '182582', '25'), +('7', '111', '20', '111050', '162789', '25'), +('7', '111', '12', '56074', '104494', '25'), +('7', '111', '12', '104415', '93628', '25'), +('7', '111', '12', '81795', '83110', '25'), +('7', '111', '12', '49656', '72020', '25'), +('7', '111', '18', '62986', '82608', '25'), +('7', '111', '18', '49656', '72020', '25'), +('7', '111', '18', '104419', '67191', '25'), +('7', '111', '18', '54851', '53969', '25'), +('7', '111', '19', '62990', '102827', '25'), +('7', '111', '19', '104416', '86757', '25'), +('7', '111', '19', '49656', '72020', '25'), +('7', '111', '19', '102268', '49568', '25'), +('7', '111', '13', '111527', '530563', '25'), +('7', '111', '13', '111528', '474471', '25'), +('7', '111', '13', '111227', '464111', '25'), +('7', '111', '13', '111228', '436443', '25'), +('7', '111', '14', '111527', '530563', '25'), +('7', '111', '14', '111528', '474471', '25'), +('7', '111', '14', '111227', '464111', '25'), +('7', '111', '14', '111228', '436443', '25'), +('7', '111', '11', '85213', '270223', '25'), +('7', '111', '11', '133816', '202845', '25'), +('7', '111', '11', '111337', '143363', '25'), +('7', '111', '11', '111034', '131998', '25'), +('7', '112', '22', '12425', '0', '25'), +('7', '112', '22', '21807', '0', '25'), +('7', '112', '22', '39342', '0', '25'), +('7', '112', '22', '7867', '0', '25'), +('7', '112', '1', '98769', '303414', '25'), +('7', '112', '1', '111303', '181868', '25'), +('7', '112', '1', '111308', '181703', '25'), +('7', '112', '1', '111300', '180716', '25'), +('7', '112', '2', '104417', '94935', '25'), +('7', '112', '2', '94056', '77523', '25'), +('7', '112', '2', '49656', '72021', '25'), +('7', '112', '2', '62985', '59193', '25'), +('7', '112', '3', '111316', '177882', '25'), +('7', '112', '3', '111313', '170462', '25'), +('7', '112', '3', '111012', '158874', '25'), +('7', '112', '3', '111015', '156067', '25'), +('7', '112', '5', '111318', '170026', '25'), +('7', '112', '5', '111321', '169558', '25'), +('7', '112', '5', '111017', '158440', '25'), +('7', '112', '5', '111319', '148959', '25'), +('7', '112', '8', '111331', '166902', '25'), +('7', '112', '8', '111332', '149973', '25'), +('7', '112', '8', '111031', '137064', '25'), +('7', '112', '8', '111030', '130129', '25'), +('7', '112', '6', '111322', '152319', '25'), +('7', '112', '6', '111326', '149087', '25'), +('7', '112', '6', '111021', '133948', '25'), +('7', '112', '6', '111024', '133494', '25'), +('7', '112', '17', '49656', '72021', '25'), +('7', '112', '17', '56084', '55157', '25'), +('7', '112', '17', '56045', '53725', '25'), +('7', '112', '17', '104420', '49179', '25'), +('7', '112', '7', '56040', '95875', '25'), +('7', '112', '7', '56079', '89187', '25'), +('7', '112', '7', '104418', '84221', '25'), +('7', '112', '7', '49656', '72021', '25'), +('7', '112', '9', '62992', '111612', '25'), +('7', '112', '9', '104414', '91607', '25'), +('7', '112', '9', '49656', '72021', '25'), +('7', '112', '9', '54836', '71071', '25'), +('7', '112', '15', '111343', '182413', '25'), +('7', '112', '15', '111347', '181457', '25'), +('7', '112', '15', '111339', '178695', '25'), +('7', '112', '15', '111346', '178607', '25'), +('7', '112', '20', '111354', '188832', '25'), +('7', '112', '20', '111351', '183998', '25'), +('7', '112', '20', '111352', '182585', '25'), +('7', '112', '20', '111050', '162791', '25'), +('7', '112', '12', '56074', '104495', '25'), +('7', '112', '12', '104415', '93631', '25'), +('7', '112', '12', '81795', '83112', '25'), +('7', '112', '12', '49656', '72021', '25'), +('7', '112', '18', '62986', '82611', '25'), +('7', '112', '18', '49656', '72021', '25'), +('7', '112', '18', '104419', '67193', '25'), +('7', '112', '18', '54851', '53971', '25'), +('7', '112', '19', '62990', '102830', '25'), +('7', '112', '19', '104416', '86758', '25'), +('7', '112', '19', '49656', '72021', '25'), +('7', '112', '19', '102268', '49569', '25'), +('7', '112', '13', '111527', '531458', '25'), +('7', '112', '13', '111528', '475012', '25'), +('7', '112', '13', '111227', '464875', '25'), +('7', '112', '13', '111228', '436984', '25'), +('7', '112', '14', '111527', '531458', '25'), +('7', '112', '14', '111528', '475012', '25'), +('7', '112', '14', '111227', '464875', '25'), +('7', '112', '14', '111228', '436984', '25'), +('7', '112', '11', '85213', '270225', '25'), +('7', '112', '11', '133816', '202847', '25'), +('7', '112', '11', '111337', '143365', '25'), +('7', '112', '11', '111034', '132000', '25'), +('7', '113', '22', '12425', '0', '25'), +('7', '113', '22', '21807', '0', '25'), +('7', '113', '22', '39342', '0', '25'), +('7', '113', '22', '7867', '0', '25'), +('7', '113', '1', '98769', '303416', '25'), +('7', '113', '1', '111303', '181872', '25'), +('7', '113', '1', '111308', '181706', '25'), +('7', '113', '1', '111300', '180718', '25'), +('7', '113', '2', '104417', '94938', '25'), +('7', '113', '2', '94056', '77525', '25'), +('7', '113', '2', '49656', '72021', '25'), +('7', '113', '2', '62985', '59194', '25'), +('7', '113', '3', '111316', '177885', '25'), +('7', '113', '3', '111313', '170464', '25'), +('7', '113', '3', '111012', '158877', '25'), +('7', '113', '3', '111015', '156070', '25'), +('7', '113', '5', '111318', '170028', '25'), +('7', '113', '5', '111321', '169560', '25'), +('7', '113', '5', '111017', '158442', '25'), +('7', '113', '5', '111319', '148962', '25'), +('7', '113', '8', '111331', '166905', '25'), +('7', '113', '8', '111332', '149975', '25'), +('7', '113', '8', '111031', '137066', '25'), +('7', '113', '8', '111030', '130132', '25'), +('7', '113', '6', '111322', '152321', '25'), +('7', '113', '6', '111326', '149089', '25'), +('7', '113', '6', '111021', '133950', '25'), +('7', '113', '6', '111024', '133496', '25'), +('7', '113', '17', '49656', '72021', '25'), +('7', '113', '17', '56084', '55159', '25'), +('7', '113', '17', '56045', '53727', '25'), +('7', '113', '17', '104420', '49181', '25'), +('7', '113', '7', '56040', '95877', '25'), +('7', '113', '7', '56079', '89189', '25'), +('7', '113', '7', '104418', '84222', '25'), +('7', '113', '7', '49656', '72021', '25'), +('7', '113', '9', '62992', '111614', '25'), +('7', '113', '9', '104414', '91610', '25'), +('7', '113', '9', '49656', '72021', '25'), +('7', '113', '9', '54836', '71073', '25'), +('7', '113', '15', '111343', '182415', '25'), +('7', '113', '15', '111347', '181460', '25'), +('7', '113', '15', '111339', '178697', '25'), +('7', '113', '15', '111346', '178610', '25'), +('7', '113', '20', '111354', '188835', '25'), +('7', '113', '20', '111351', '184000', '25'), +('7', '113', '20', '111352', '182587', '25'), +('7', '113', '20', '111050', '162793', '25'), +('7', '113', '12', '56074', '104496', '25'), +('7', '113', '12', '104415', '93634', '25'), +('7', '113', '12', '81795', '83115', '25'), +('7', '113', '12', '49656', '72021', '25'), +('7', '113', '18', '62986', '82613', '25'), +('7', '113', '18', '49656', '72021', '25'), +('7', '113', '18', '104419', '67195', '25'), +('7', '113', '18', '54851', '53972', '25'), +('7', '113', '19', '62990', '102832', '25'), +('7', '113', '19', '104416', '86759', '25'), +('7', '113', '19', '49656', '72021', '25'), +('7', '113', '19', '102268', '49571', '25'), +('7', '113', '13', '111527', '532311', '25'), +('7', '113', '13', '111528', '475552', '25'), +('7', '113', '13', '111227', '465679', '25'), +('7', '113', '13', '111228', '437482', '25'), +('7', '113', '14', '111527', '532311', '25'), +('7', '113', '14', '111528', '475552', '25'), +('7', '113', '14', '111227', '465679', '25'), +('7', '113', '14', '111228', '437482', '25'), +('7', '113', '11', '85213', '270227', '25'), +('7', '113', '11', '133816', '202849', '25'), +('7', '113', '11', '111337', '143367', '25'), +('7', '113', '11', '111034', '132002', '25'), +('7', '114', '22', '12425', '0', '25'), +('7', '114', '22', '21807', '0', '25'), +('7', '114', '22', '39342', '0', '25'), +('7', '114', '22', '7867', '0', '25'), +('7', '114', '1', '98769', '303418', '25'), +('7', '114', '1', '111303', '181875', '25'), +('7', '114', '1', '111308', '181709', '25'), +('7', '114', '1', '111300', '180720', '25'), +('7', '114', '2', '104417', '94940', '25'), +('7', '114', '2', '94056', '77527', '25'), +('7', '114', '2', '49656', '72021', '25'), +('7', '114', '2', '62985', '59195', '25'), +('7', '114', '3', '111316', '177888', '25'), +('7', '114', '3', '111313', '170466', '25'), +('7', '114', '3', '111012', '158879', '25'), +('7', '114', '3', '111015', '156073', '25'), +('7', '114', '5', '111318', '170030', '25'), +('7', '114', '5', '111321', '169563', '25'), +('7', '114', '5', '111017', '158444', '25'), +('7', '114', '5', '111319', '148965', '25'), +('7', '114', '8', '111331', '166908', '25'), +('7', '114', '8', '111332', '149977', '25'), +('7', '114', '8', '111031', '137068', '25'), +('7', '114', '8', '111030', '130134', '25'), +('7', '114', '6', '111322', '152323', '25'), +('7', '114', '6', '111326', '149091', '25'), +('7', '114', '6', '111021', '133952', '25'), +('7', '114', '6', '111024', '133498', '25'), +('7', '114', '17', '49656', '72021', '25'), +('7', '114', '17', '56084', '55161', '25'), +('7', '114', '17', '56045', '53728', '25'), +('7', '114', '17', '104420', '49183', '25'), +('7', '114', '7', '56040', '95880', '25'), +('7', '114', '7', '56079', '89192', '25'), +('7', '114', '7', '104418', '84224', '25'), +('7', '114', '7', '49656', '72021', '25'), +('7', '114', '9', '62992', '111617', '25'), +('7', '114', '9', '104414', '91612', '25'), +('7', '114', '9', '49656', '72021', '25'), +('7', '114', '9', '54836', '71075', '25'), +('7', '114', '15', '111343', '182417', '25'), +('7', '114', '15', '111347', '181464', '25'), +('7', '114', '15', '111339', '178699', '25'), +('7', '114', '15', '111346', '178612', '25'), +('7', '114', '20', '111354', '188837', '25'), +('7', '114', '20', '111351', '184001', '25'), +('7', '114', '20', '111352', '182590', '25'), +('7', '114', '20', '111050', '162794', '25'), +('7', '114', '12', '56074', '104498', '25'), +('7', '114', '12', '104415', '93638', '25'), +('7', '114', '12', '81795', '83117', '25'), +('7', '114', '12', '49656', '72021', '25'), +('7', '114', '18', '62986', '82616', '25'), +('7', '114', '18', '49656', '72021', '25'), +('7', '114', '18', '104419', '67197', '25'), +('7', '114', '18', '54851', '53974', '25'), +('7', '114', '19', '62990', '102834', '25'), +('7', '114', '19', '104416', '86760', '25'), +('7', '114', '19', '49656', '72021', '25'), +('7', '114', '19', '102268', '49573', '25'), +('7', '114', '13', '111527', '533207', '25'), +('7', '114', '13', '111528', '476092', '25'), +('7', '114', '13', '111227', '466484', '25'), +('7', '114', '13', '111228', '437981', '25'), +('7', '114', '14', '111527', '533207', '25'), +('7', '114', '14', '111528', '476092', '25'), +('7', '114', '14', '111227', '466484', '25'), +('7', '114', '14', '111228', '437981', '25'), +('7', '114', '11', '85213', '270229', '25'), +('7', '114', '11', '133816', '202851', '25'), +('7', '114', '11', '111337', '143369', '25'), +('7', '114', '11', '111034', '132004', '25'), +('7', '115', '22', '12425', '0', '26'), +('7', '115', '22', '21807', '0', '26'), +('7', '115', '22', '39342', '0', '26'), +('7', '115', '22', '7867', '0', '26'), +('7', '115', '1', '98769', '303420', '26'), +('7', '115', '1', '111303', '181879', '26'), +('7', '115', '1', '111308', '181712', '26'), +('7', '115', '1', '111300', '180722', '26'), +('7', '115', '2', '104417', '94943', '26'), +('7', '115', '2', '94056', '77528', '26'), +('7', '115', '2', '49656', '72022', '26'), +('7', '115', '2', '62985', '59196', '26'), +('7', '115', '3', '111316', '177890', '26'), +('7', '115', '3', '111313', '170468', '26'), +('7', '115', '3', '111012', '158881', '26'), +('7', '115', '3', '111015', '156075', '26'), +('7', '115', '5', '111318', '170032', '26'), +('7', '115', '5', '111321', '169565', '26'), +('7', '115', '5', '111017', '158446', '26'), +('7', '115', '5', '111319', '148968', '26'), +('7', '115', '8', '111331', '166911', '26'), +('7', '115', '8', '111332', '149978', '26'), +('7', '115', '8', '111031', '137070', '26'), +('7', '115', '8', '111030', '130137', '26'), +('7', '115', '6', '111322', '152325', '26'), +('7', '115', '6', '111326', '149094', '26'), +('7', '115', '6', '111021', '133954', '26'), +('7', '115', '6', '111024', '133500', '26'), +('7', '115', '17', '49656', '72022', '26'), +('7', '115', '17', '56084', '55162', '26'), +('7', '115', '17', '56045', '53729', '26'), +('7', '115', '17', '104420', '49185', '26'), +('7', '115', '7', '56040', '95883', '26'), +('7', '115', '7', '56079', '89194', '26'), +('7', '115', '7', '104418', '84225', '26'), +('7', '115', '7', '49656', '72022', '26'), +('7', '115', '9', '62992', '111620', '26'), +('7', '115', '9', '104414', '91615', '26'), +('7', '115', '9', '49656', '72022', '26'), +('7', '115', '9', '54836', '71077', '26'), +('7', '115', '15', '111343', '182419', '26'), +('7', '115', '15', '111347', '181467', '26'), +('7', '115', '15', '111339', '178702', '26'), +('7', '115', '15', '111346', '178615', '26'), +('7', '115', '20', '111354', '188839', '26'), +('7', '115', '20', '111351', '184003', '26'), +('7', '115', '20', '111352', '182593', '26'), +('7', '115', '20', '111050', '162796', '26'), +('7', '115', '12', '56074', '104499', '26'), +('7', '115', '12', '104415', '93641', '26'), +('7', '115', '12', '81795', '83120', '26'), +('7', '115', '12', '49656', '72022', '26'), +('7', '115', '18', '62986', '82619', '26'), +('7', '115', '18', '49656', '72022', '26'), +('7', '115', '18', '104419', '67198', '26'), +('7', '115', '18', '54851', '53976', '26'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('7', '115', '19', '62990', '102837', '26'), +('7', '115', '19', '104416', '86761', '26'), +('7', '115', '19', '49656', '72022', '26'), +('7', '115', '19', '102268', '49574', '26'), +('7', '115', '13', '111527', '534102', '26'), +('7', '115', '13', '111528', '476632', '26'), +('7', '115', '13', '111227', '467288', '26'), +('7', '115', '13', '111228', '438480', '26'), +('7', '115', '14', '111527', '534102', '26'), +('7', '115', '14', '111528', '476632', '26'), +('7', '115', '14', '111227', '467288', '26'), +('7', '115', '14', '111228', '438480', '26'), +('7', '115', '11', '85213', '270231', '26'), +('7', '115', '11', '133816', '202853', '26'), +('7', '115', '11', '111337', '143371', '26'), +('7', '115', '11', '111034', '132006', '26'), +('8', '1', '22', '10323', '0', '0'), +('8', '1', '22', '10664', '0', '0'), +('8', '1', '22', '9246', '0', '0'), +('8', '1', '22', '21509', '0', '0'), +('8', '1', '1', '14701', '2452', '0'), +('8', '1', '1', '14702', '2050', '0'), +('8', '1', '1', '30361', '1440', '0'), +('8', '1', '1', '10165', '873', '0'), +('8', '1', '2', '4301', '3663', '0'), +('8', '1', '2', '4831', '3092', '0'), +('8', '1', '2', '10142', '3012', '0'), +('8', '1', '2', '10143', '2853', '0'), +('8', '1', '3', '27720', '3109', '0'), +('8', '1', '3', '2711', '1753', '0'), +('8', '1', '3', '21002', '1057', '0'), +('8', '1', '3', '21014', '1057', '0'), +('8', '1', '5', '27723', '4086', '0'), +('8', '1', '5', '14703', '3850', '0'), +('8', '1', '5', '14565', '3482', '0'), +('8', '1', '5', '14700', '2553', '0'), +('8', '1', '8', '11621', '11486', '0'), +('8', '1', '8', '11551', '4827', '0'), +('8', '1', '8', '11603', '3782', '0'), +('8', '1', '8', '1409', '3461', '0'), +('8', '1', '6', '1557', '6760', '0'), +('8', '1', '6', '27721', '2022', '0'), +('8', '1', '6', '4405', '1870', '0'), +('8', '1', '6', '25062', '1691', '0'), +('8', '1', '17', '4832', '6213', '0'), +('8', '1', '17', '4862', '5452', '0'), +('8', '1', '17', '11623', '4375', '0'), +('8', '1', '17', '4154', '4039', '0'), +('8', '1', '7', '4833', '3443', '0'), +('8', '1', '7', '4863', '2738', '0'), +('8', '1', '7', '4343', '2208', '0'), +('8', '1', '7', '4155', '1973', '0'), +('8', '1', '9', '1541', '2833', '0'), +('8', '1', '9', '4834', '2623', '0'), +('8', '1', '9', '4864', '2159', '0'), +('8', '1', '9', '12189', '1961', '0'), +('8', '1', '15', '10366', '3254', '0'), +('8', '1', '15', '14679', '2955', '0'), +('8', '1', '15', '10151', '2700', '0'), +('8', '1', '15', '14678', '2404', '0'), +('8', '1', '20', '11601', '7573', '0'), +('8', '1', '20', '11666', '5537', '0'), +('8', '1', '20', '2920', '4467', '0'), +('8', '1', '20', '1365', '4200', '0'), +('8', '1', '12', '4835', '4574', '0'), +('8', '1', '12', '20655', '4281', '0'), +('8', '1', '12', '4865', '2665', '0'), +('8', '1', '12', '3310', '2661', '0'), +('8', '1', '18', '4836', '3208', '0'), +('8', '1', '18', '4866', '2934', '0'), +('8', '1', '18', '4346', '2621', '0'), +('8', '1', '18', '4158', '2005', '0'), +('8', '1', '19', '4837', '3962', '0'), +('8', '1', '19', '68239', '2928', '0'), +('8', '1', '19', '4867', '2880', '0'), +('8', '1', '19', '4159', '1973', '0'), +('8', '1', '13', '27725', '4279', '0'), +('8', '1', '13', '5416', '3308', '0'), +('8', '1', '13', '7257', '3266', '0'), +('8', '1', '13', '6692', '3070', '0'), +('8', '1', '14', '5416', '3308', '0'), +('8', '1', '14', '7257', '3266', '0'), +('8', '1', '14', '6692', '3070', '0'), +('8', '1', '14', '7407', '3046', '0'), +('8', '1', '11', '13353', '1500', '0'), +('8', '1', '11', '14762', '1291', '0'), +('8', '1', '11', '9246', '930', '0'), +('8', '1', '11', '20677', '900', '0'), +('8', '2', '22', '10323', '0', '0'), +('8', '2', '22', '10664', '0', '0'), +('8', '2', '22', '9246', '0', '0'), +('8', '2', '22', '21509', '0', '0'), +('8', '2', '1', '14701', '2452', '0'), +('8', '2', '1', '14702', '2050', '0'), +('8', '2', '1', '30361', '1440', '0'), +('8', '2', '1', '10165', '873', '0'), +('8', '2', '2', '4301', '3663', '0'), +('8', '2', '2', '4831', '3105', '0'), +('8', '2', '2', '10142', '3012', '0'), +('8', '2', '2', '10143', '2853', '0'), +('8', '2', '3', '27720', '3121', '0'), +('8', '2', '3', '2711', '1765', '0'), +('8', '2', '3', '21002', '1057', '0'), +('8', '2', '3', '21014', '1057', '0'), +('8', '2', '5', '27723', '4091', '0'), +('8', '2', '5', '14703', '3850', '0'), +('8', '2', '5', '14565', '3487', '0'), +('8', '2', '5', '14700', '2553', '0'), +('8', '2', '8', '11621', '11486', '0'), +('8', '2', '8', '11551', '4827', '0'), +('8', '2', '8', '11603', '3803', '0'), +('8', '2', '8', '1409', '3461', '0'), +('8', '2', '6', '1557', '6760', '0'), +('8', '2', '6', '27721', '2022', '0'), +('8', '2', '6', '4405', '1870', '0'), +('8', '2', '6', '25062', '1691', '0'), +('8', '2', '17', '4832', '6234', '0'), +('8', '2', '17', '4862', '5452', '0'), +('8', '2', '17', '11623', '4375', '0'), +('8', '2', '17', '4154', '4047', '0'), +('8', '2', '7', '4833', '3443', '0'), +('8', '2', '7', '4863', '2759', '0'), +('8', '2', '7', '4343', '2222', '0'), +('8', '2', '7', '4155', '1973', '0'), +('8', '2', '9', '1541', '2833', '0'), +('8', '2', '9', '4834', '2623', '0'), +('8', '2', '9', '4864', '2166', '0'), +('8', '2', '9', '12189', '1961', '0'), +('8', '2', '15', '10366', '3254', '0'), +('8', '2', '15', '14679', '2955', '0'), +('8', '2', '15', '10151', '2700', '0'), +('8', '2', '15', '14678', '2404', '0'), +('8', '2', '20', '11601', '7588', '0'), +('8', '2', '20', '11666', '5547', '0'), +('8', '2', '20', '2920', '4467', '0'), +('8', '2', '20', '1365', '4200', '0'), +('8', '2', '12', '4835', '4581', '0'), +('8', '2', '12', '20655', '4289', '0'), +('8', '2', '12', '4865', '2665', '0'), +('8', '2', '12', '3310', '2661', '0'), +('8', '2', '18', '4836', '3216', '0'), +('8', '2', '18', '4866', '2947', '0'), +('8', '2', '18', '4346', '2621', '0'), +('8', '2', '18', '4158', '2005', '0'), +('8', '2', '19', '4837', '3974', '0'), +('8', '2', '19', '68239', '2935', '0'), +('8', '2', '19', '4867', '2893', '0'), +('8', '2', '19', '4159', '1973', '0'), +('8', '2', '13', '27725', '4279', '0'), +('8', '2', '13', '5416', '3308', '0'), +('8', '2', '13', '7257', '3266', '0'), +('8', '2', '13', '6692', '3070', '0'), +('8', '2', '14', '5416', '3308', '0'), +('8', '2', '14', '7257', '3266', '0'), +('8', '2', '14', '6692', '3070', '0'), +('8', '2', '14', '7407', '3046', '0'), +('8', '2', '11', '13353', '1500', '0'), +('8', '2', '11', '14762', '1291', '0'), +('8', '2', '11', '9246', '954', '0'), +('8', '2', '11', '20677', '900', '0'), +('8', '3', '22', '10323', '0', '0'), +('8', '3', '22', '10664', '0', '0'), +('8', '3', '22', '9246', '0', '0'), +('8', '3', '22', '21509', '0', '0'), +('8', '3', '1', '14701', '2452', '0'), +('8', '3', '1', '14702', '2050', '0'), +('8', '3', '1', '30361', '1440', '0'), +('8', '3', '1', '10165', '873', '0'), +('8', '3', '2', '4301', '3663', '0'), +('8', '3', '2', '4831', '3117', '0'), +('8', '3', '2', '10142', '3012', '0'), +('8', '3', '2', '10143', '2853', '0'), +('8', '3', '3', '27720', '3132', '0'), +('8', '3', '3', '2711', '1776', '0'), +('8', '3', '3', '21002', '1057', '0'), +('8', '3', '3', '21014', '1057', '0'), +('8', '3', '5', '27723', '4097', '0'), +('8', '3', '5', '14703', '3850', '0'), +('8', '3', '5', '14565', '3493', '0'), +('8', '3', '5', '14700', '2553', '0'), +('8', '3', '8', '11621', '11486', '0'), +('8', '3', '8', '11551', '4827', '0'), +('8', '3', '8', '11603', '3825', '0'), +('8', '3', '8', '1409', '3461', '0'), +('8', '3', '6', '1557', '6760', '0'), +('8', '3', '6', '27721', '2022', '0'), +('8', '3', '6', '4405', '1870', '0'), +('8', '3', '6', '25062', '1691', '0'), +('8', '3', '17', '4832', '6256', '0'), +('8', '3', '17', '4862', '5452', '0'), +('8', '3', '17', '11623', '4375', '0'), +('8', '3', '17', '4154', '4054', '0'), +('8', '3', '7', '4833', '3443', '0'), +('8', '3', '7', '4863', '2781', '0'), +('8', '3', '7', '4343', '2237', '0'), +('8', '3', '7', '4155', '1973', '0'), +('8', '3', '9', '1541', '2833', '0'), +('8', '3', '9', '4834', '2623', '0'), +('8', '3', '9', '4864', '2173', '0'), +('8', '3', '9', '12189', '1961', '0'), +('8', '3', '15', '10366', '3254', '0'), +('8', '3', '15', '14679', '2955', '0'), +('8', '3', '15', '10151', '2700', '0'), +('8', '3', '15', '14678', '2404', '0'), +('8', '3', '20', '11601', '7602', '0'), +('8', '3', '20', '11666', '5557', '0'), +('8', '3', '20', '2920', '4467', '0'), +('8', '3', '20', '1365', '4200', '0'), +('8', '3', '12', '4835', '4589', '0'), +('8', '3', '12', '20655', '4296', '0'), +('8', '3', '12', '4865', '2665', '0'), +('8', '3', '12', '3310', '2661', '0'), +('8', '3', '18', '4836', '3223', '0'), +('8', '3', '18', '4866', '2960', '0'), +('8', '3', '18', '4346', '2621', '0'), +('8', '3', '18', '4158', '2005', '0'), +('8', '3', '19', '4837', '3986', '0'), +('8', '3', '19', '68239', '2943', '0'), +('8', '3', '19', '4867', '2906', '0'), +('8', '3', '19', '4159', '1973', '0'), +('8', '3', '13', '27725', '4279', '0'), +('8', '3', '13', '5416', '3308', '0'), +('8', '3', '13', '7257', '3266', '0'), +('8', '3', '13', '6692', '3070', '0'), +('8', '3', '14', '5416', '3308', '0'), +('8', '3', '14', '7257', '3266', '0'), +('8', '3', '14', '6692', '3070', '0'), +('8', '3', '14', '7407', '3046', '0'), +('8', '3', '11', '13353', '1500', '0'), +('8', '3', '11', '14762', '1291', '0'), +('8', '3', '11', '9246', '978', '0'), +('8', '3', '11', '20677', '900', '0'), +('8', '4', '22', '10323', '0', '0'), +('8', '4', '22', '10664', '0', '0'), +('8', '4', '22', '9246', '0', '0'), +('8', '4', '22', '21509', '0', '0'), +('8', '4', '1', '14701', '2452', '0'), +('8', '4', '1', '14702', '2050', '0'), +('8', '4', '1', '30361', '1440', '0'), +('8', '4', '1', '10165', '873', '0'), +('8', '4', '2', '4301', '3663', '0'), +('8', '4', '2', '4831', '3129', '0'), +('8', '4', '2', '10142', '3012', '0'), +('8', '4', '2', '10143', '2853', '0'), +('8', '4', '3', '27720', '3144', '0'), +('8', '4', '3', '2711', '1788', '0'), +('8', '4', '3', '21002', '1057', '0'), +('8', '4', '3', '21014', '1057', '0'), +('8', '4', '5', '27723', '4103', '0'), +('8', '4', '5', '14703', '3850', '0'), +('8', '4', '5', '14565', '3499', '0'), +('8', '4', '5', '14700', '2553', '0'), +('8', '4', '8', '11621', '11486', '0'), +('8', '4', '8', '11551', '4827', '0'), +('8', '4', '8', '11603', '3847', '0'), +('8', '4', '8', '1409', '3461', '0'), +('8', '4', '6', '1557', '6760', '0'), +('8', '4', '6', '27721', '2022', '0'), +('8', '4', '6', '4405', '1870', '0'), +('8', '4', '6', '4302', '1696', '0'), +('8', '4', '17', '4832', '6278', '0'), +('8', '4', '17', '4862', '5452', '0'), +('8', '4', '17', '11623', '4375', '0'), +('8', '4', '17', '4154', '4061', '0'), +('8', '4', '7', '4833', '3443', '0'), +('8', '4', '7', '4863', '2803', '0'), +('8', '4', '7', '4343', '2251', '0'), +('8', '4', '7', '4155', '1973', '0'), +('8', '4', '9', '1541', '2833', '0'), +('8', '4', '9', '4834', '2623', '0'), +('8', '4', '9', '4864', '2181', '0'), +('8', '4', '9', '12189', '1961', '0'), +('8', '4', '15', '10366', '3254', '0'), +('8', '4', '15', '14679', '2955', '0'), +('8', '4', '15', '10151', '2700', '0'), +('8', '4', '15', '14678', '2404', '0'), +('8', '4', '20', '11601', '7617', '0'), +('8', '4', '20', '11666', '5567', '0'), +('8', '4', '20', '2920', '4467', '0'), +('8', '4', '20', '1365', '4200', '0'), +('8', '4', '12', '4835', '4596', '0'), +('8', '4', '12', '20655', '4304', '0'), +('8', '4', '12', '4865', '2665', '0'), +('8', '4', '12', '3310', '2661', '0'), +('8', '4', '18', '4836', '3230', '0'), +('8', '4', '18', '4866', '2974', '0'), +('8', '4', '18', '4346', '2621', '0'), +('8', '4', '18', '4158', '2005', '0'), +('8', '4', '19', '4837', '3999', '0'), +('8', '4', '19', '68239', '2950', '0'), +('8', '4', '19', '4867', '2919', '0'), +('8', '4', '19', '4159', '1973', '0'), +('8', '4', '13', '27725', '4279', '0'), +('8', '4', '13', '5416', '3308', '0'), +('8', '4', '13', '7257', '3266', '0'), +('8', '4', '13', '6692', '3070', '0'), +('8', '4', '14', '5416', '3308', '0'), +('8', '4', '14', '7257', '3266', '0'), +('8', '4', '14', '6692', '3070', '0'), +('8', '4', '14', '7407', '3046', '0'), +('8', '4', '11', '13353', '1500', '0'), +('8', '4', '11', '14762', '1291', '0'), +('8', '4', '11', '9246', '1003', '0'), +('8', '4', '11', '20677', '900', '0'), +('8', '5', '22', '10323', '0', '0'), +('8', '5', '22', '10664', '0', '0'), +('8', '5', '22', '9246', '0', '0'), +('8', '5', '22', '21509', '0', '0'), +('8', '5', '1', '14701', '2452', '0'), +('8', '5', '1', '14702', '2050', '0'), +('8', '5', '1', '30361', '1440', '0'), +('8', '5', '1', '10165', '873', '0'), +('8', '5', '2', '4301', '3663', '0'), +('8', '5', '2', '4831', '3141', '0'), +('8', '5', '2', '10142', '3012', '0'), +('8', '5', '2', '10143', '2853', '0'), +('8', '5', '3', '27720', '3156', '0'), +('8', '5', '3', '2711', '1800', '0'), +('8', '5', '3', '21014', '1057', '0'), +('8', '5', '3', '21002', '1057', '0'), +('8', '5', '5', '27723', '4109', '0'), +('8', '5', '5', '14703', '3850', '0'), +('8', '5', '5', '14565', '3505', '0'), +('8', '5', '5', '14700', '2553', '0'), +('8', '5', '8', '11621', '11486', '0'), +('8', '5', '8', '11551', '4827', '0'), +('8', '5', '8', '11603', '3869', '0'), +('8', '5', '8', '1409', '3461', '0'), +('8', '5', '6', '1557', '6760', '0'), +('8', '5', '6', '27721', '2022', '0'), +('8', '5', '6', '4405', '1870', '0'), +('8', '5', '6', '4302', '1704', '0'), +('8', '5', '17', '4832', '6300', '0'), +('8', '5', '17', '4862', '5452', '0'), +('8', '5', '17', '11623', '4375', '0'), +('8', '5', '17', '4154', '4068', '0'), +('8', '5', '7', '4833', '3443', '0'), +('8', '5', '7', '4863', '2825', '0'), +('8', '5', '7', '4343', '2266', '0'), +('8', '5', '7', '4155', '1973', '0'), +('8', '5', '9', '1541', '2833', '0'), +('8', '5', '9', '4834', '2623', '0'), +('8', '5', '9', '4864', '2188', '0'), +('8', '5', '9', '12189', '1961', '0'), +('8', '5', '15', '10366', '3254', '0'), +('8', '5', '15', '14679', '2955', '0'), +('8', '5', '15', '10151', '2700', '0'), +('8', '5', '15', '14678', '2404', '0'), +('8', '5', '20', '11601', '7631', '0'), +('8', '5', '20', '11666', '5578', '0'), +('8', '5', '20', '2920', '4467', '0'), +('8', '5', '20', '1365', '4200', '0'), +('8', '5', '12', '4835', '4603', '0'), +('8', '5', '12', '20655', '4312', '0'), +('8', '5', '12', '4865', '2665', '0'), +('8', '5', '12', '3310', '2661', '0'), +('8', '5', '18', '4836', '3237', '0'), +('8', '5', '18', '4866', '2987', '0'), +('8', '5', '18', '4346', '2621', '0'), +('8', '5', '18', '4158', '2005', '0'), +('8', '5', '19', '4837', '4011', '0'), +('8', '5', '19', '68239', '2957', '0'), +('8', '5', '19', '4867', '2932', '0'), +('8', '5', '19', '4159', '1973', '0'), +('8', '5', '13', '27725', '4279', '0'), +('8', '5', '13', '5416', '3308', '0'), +('8', '5', '13', '7257', '3266', '0'), +('8', '5', '13', '6692', '3070', '0'), +('8', '5', '14', '5416', '3308', '0'), +('8', '5', '14', '7257', '3266', '0'), +('8', '5', '14', '6692', '3070', '0'), +('8', '5', '14', '7407', '3046', '0'), +('8', '5', '11', '13353', '1500', '0'), +('8', '5', '11', '14762', '1291', '0'), +('8', '5', '11', '9246', '1027', '0'), +('8', '5', '11', '20677', '900', '0'), +('8', '6', '22', '10323', '0', '0'), +('8', '6', '22', '10664', '0', '0'), +('8', '6', '22', '9246', '0', '0'), +('8', '6', '22', '21509', '0', '0'), +('8', '6', '1', '14701', '2452', '0'), +('8', '6', '1', '14702', '2050', '0'), +('8', '6', '1', '30361', '1440', '0'), +('8', '6', '1', '10165', '873', '0'), +('8', '6', '2', '4301', '3663', '0'), +('8', '6', '2', '4831', '3153', '0'), +('8', '6', '2', '10142', '3012', '0'), +('8', '6', '2', '10143', '2853', '0'), +('8', '6', '3', '27720', '3167', '0'), +('8', '6', '3', '2711', '1811', '0'), +('8', '6', '3', '71529', '1110', '0'), +('8', '6', '3', '21014', '1057', '0'), +('8', '6', '5', '27723', '4115', '0'), +('8', '6', '5', '14703', '3850', '0'), +('8', '6', '5', '14565', '3511', '0'), +('8', '6', '5', '14700', '2553', '0'), +('8', '6', '8', '11621', '11486', '0'), +('8', '6', '8', '11551', '4827', '0'), +('8', '6', '8', '11603', '3890', '0'), +('8', '6', '8', '1409', '3461', '0'), +('8', '6', '6', '1557', '6760', '0'), +('8', '6', '6', '27721', '2022', '0'), +('8', '6', '6', '4405', '1870', '0'), +('8', '6', '6', '4302', '1713', '0'), +('8', '6', '17', '4832', '6321', '0'), +('8', '6', '17', '4862', '5452', '0'), +('8', '6', '17', '11623', '4375', '0'), +('8', '6', '17', '4154', '4076', '0'), +('8', '6', '7', '4833', '3443', '0'), +('8', '6', '7', '4863', '2846', '0'), +('8', '6', '7', '4343', '2280', '0'), +('8', '6', '7', '4155', '1973', '0'), +('8', '6', '9', '1541', '2833', '0'), +('8', '6', '9', '4834', '2623', '0'), +('8', '6', '9', '4864', '2195', '0'), +('8', '6', '9', '12189', '1961', '0'), +('8', '6', '15', '10366', '3254', '0'), +('8', '6', '15', '14679', '2955', '0'), +('8', '6', '15', '10151', '2700', '0'), +('8', '6', '15', '14678', '2404', '0'), +('8', '6', '20', '11601', '7646', '0'), +('8', '6', '20', '11666', '5588', '0'), +('8', '6', '20', '2920', '4467', '0'), +('8', '6', '20', '1365', '4200', '0'), +('8', '6', '12', '4835', '4610', '0'), +('8', '6', '12', '20655', '4319', '0'), +('8', '6', '12', '4865', '2665', '0'), +('8', '6', '12', '3310', '2661', '0'), +('8', '6', '18', '4836', '3245', '0'), +('8', '6', '18', '4866', '3000', '0'), +('8', '6', '18', '4346', '2621', '0'), +('8', '6', '18', '4158', '2005', '0'), +('8', '6', '19', '4837', '4023', '0'), +('8', '6', '19', '68239', '2964', '0'), +('8', '6', '19', '4867', '2945', '0'), +('8', '6', '19', '4159', '1973', '0'), +('8', '6', '13', '27725', '4279', '0'), +('8', '6', '13', '5416', '3308', '0'), +('8', '6', '13', '7257', '3266', '0'), +('8', '6', '13', '6692', '3070', '0'), +('8', '6', '14', '5416', '3308', '0'), +('8', '6', '14', '7257', '3266', '0'), +('8', '6', '14', '6692', '3070', '0'), +('8', '6', '14', '7407', '3046', '0'), +('8', '6', '11', '13353', '1500', '0'), +('8', '6', '11', '14762', '1291', '0'), +('8', '6', '11', '9246', '1051', '0'), +('8', '6', '11', '20677', '900', '0'), +('8', '7', '22', '10323', '0', '0'), +('8', '7', '22', '10664', '0', '0'), +('8', '7', '22', '9246', '0', '0'), +('8', '7', '22', '21509', '0', '0'), +('8', '7', '1', '14701', '2452', '0'), +('8', '7', '1', '14702', '2050', '0'), +('8', '7', '1', '30361', '1440', '0'), +('8', '7', '1', '10165', '873', '0'), +('8', '7', '2', '4301', '3663', '0'), +('8', '7', '2', '4831', '3165', '0'), +('8', '7', '2', '10142', '3012', '0'), +('8', '7', '2', '10143', '2853', '0'), +('8', '7', '3', '27720', '3179', '0'), +('8', '7', '3', '2711', '1823', '0'), +('8', '7', '3', '71529', '1300', '0'), +('8', '7', '3', '21014', '1057', '0'), +('8', '7', '5', '27723', '4121', '0'), +('8', '7', '5', '14703', '3850', '0'), +('8', '7', '5', '14565', '3517', '0'), +('8', '7', '5', '14700', '2553', '0'), +('8', '7', '8', '11621', '11486', '0'), +('8', '7', '8', '11551', '4827', '0'), +('8', '7', '8', '11603', '3912', '0'), +('8', '7', '8', '1409', '3461', '0'), +('8', '7', '6', '1557', '6760', '0'), +('8', '7', '6', '27721', '2022', '0'), +('8', '7', '6', '4405', '1870', '0'), +('8', '7', '6', '4302', '1723', '0'), +('8', '7', '17', '4832', '6347', '0'), +('8', '7', '17', '4862', '5452', '0'), +('8', '7', '17', '11623', '4375', '0'), +('8', '7', '17', '4154', '4084', '0'), +('8', '7', '7', '4833', '3443', '0'), +('8', '7', '7', '4863', '2868', '0'), +('8', '7', '7', '4343', '2297', '0'), +('8', '7', '7', '4155', '1973', '0'), +('8', '7', '9', '1541', '2833', '0'), +('8', '7', '9', '4834', '2623', '0'), +('8', '7', '9', '4864', '2202', '0'), +('8', '7', '9', '12189', '1961', '0'), +('8', '7', '15', '10366', '3254', '0'), +('8', '7', '15', '14679', '2955', '0'), +('8', '7', '15', '10151', '2700', '0'), +('8', '7', '15', '14678', '2404', '0'), +('8', '7', '20', '11601', '7663', '0'), +('8', '7', '20', '11666', '5600', '0'), +('8', '7', '20', '2920', '4467', '0'), +('8', '7', '20', '1365', '4200', '0'), +('8', '7', '12', '4835', '4619', '0'), +('8', '7', '12', '20655', '4328', '0'), +('8', '7', '12', '4865', '2665', '0'), +('8', '7', '12', '3310', '2661', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '7', '18', '4836', '3253', '0'), +('8', '7', '18', '4866', '3015', '0'), +('8', '7', '18', '4346', '2621', '0'), +('8', '7', '18', '4158', '2005', '0'), +('8', '7', '19', '4837', '4035', '0'), +('8', '7', '19', '68239', '2972', '0'), +('8', '7', '19', '4867', '2960', '0'), +('8', '7', '19', '4159', '1973', '0'), +('8', '7', '13', '27725', '4279', '0'), +('8', '7', '13', '5416', '3308', '0'), +('8', '7', '13', '7257', '3266', '0'), +('8', '7', '13', '6692', '3070', '0'), +('8', '7', '14', '5416', '3308', '0'), +('8', '7', '14', '7257', '3266', '0'), +('8', '7', '14', '6692', '3070', '0'), +('8', '7', '14', '7407', '3046', '0'), +('8', '7', '11', '13353', '1500', '0'), +('8', '7', '11', '14762', '1291', '0'), +('8', '7', '11', '9246', '1075', '0'), +('8', '7', '11', '20677', '900', '0'), +('8', '8', '22', '10323', '0', '0'), +('8', '8', '22', '10664', '0', '0'), +('8', '8', '22', '9246', '0', '0'), +('8', '8', '22', '21509', '0', '0'), +('8', '8', '1', '14701', '2452', '0'), +('8', '8', '1', '14702', '2050', '0'), +('8', '8', '1', '30361', '1440', '0'), +('8', '8', '1', '10165', '873', '0'), +('8', '8', '2', '4301', '3663', '0'), +('8', '8', '2', '4831', '3177', '0'), +('8', '8', '2', '10142', '3012', '0'), +('8', '8', '2', '10143', '2853', '0'), +('8', '8', '3', '27720', '3191', '0'), +('8', '8', '3', '2711', '1835', '0'), +('8', '8', '3', '71529', '1490', '0'), +('8', '8', '3', '21014', '1057', '0'), +('8', '8', '5', '27723', '4127', '0'), +('8', '8', '5', '14703', '3850', '0'), +('8', '8', '5', '14565', '3523', '0'), +('8', '8', '5', '14700', '2553', '0'), +('8', '8', '8', '11621', '11486', '0'), +('8', '8', '8', '11551', '4827', '0'), +('8', '8', '8', '11603', '3934', '0'), +('8', '8', '8', '1409', '3461', '0'), +('8', '8', '6', '1557', '6760', '0'), +('8', '8', '6', '27721', '2022', '0'), +('8', '8', '6', '4405', '1870', '0'), +('8', '8', '6', '4302', '1732', '0'), +('8', '8', '17', '4832', '6369', '0'), +('8', '8', '17', '4862', '5452', '0'), +('8', '8', '17', '11623', '4375', '0'), +('8', '8', '17', '4154', '4091', '0'), +('8', '8', '7', '4833', '3443', '0'), +('8', '8', '7', '4863', '2890', '0'), +('8', '8', '7', '4343', '2312', '0'), +('8', '8', '7', '4155', '1973', '0'), +('8', '8', '9', '1541', '2833', '0'), +('8', '8', '9', '4834', '2623', '0'), +('8', '8', '9', '4864', '2210', '0'), +('8', '8', '9', '12189', '1961', '0'), +('8', '8', '15', '10366', '3254', '0'), +('8', '8', '15', '14679', '2955', '0'), +('8', '8', '15', '10151', '2700', '0'), +('8', '8', '15', '14678', '2404', '0'), +('8', '8', '20', '11601', '7677', '0'), +('8', '8', '20', '11666', '5610', '0'), +('8', '8', '20', '2920', '4467', '0'), +('8', '8', '20', '1365', '4200', '0'), +('8', '8', '12', '4835', '4626', '0'), +('8', '8', '12', '20655', '4335', '0'), +('8', '8', '12', '4865', '2665', '0'), +('8', '8', '12', '3310', '2661', '0'), +('8', '8', '18', '4836', '3260', '0'), +('8', '8', '18', '4866', '3028', '0'), +('8', '8', '18', '4346', '2621', '0'), +('8', '8', '18', '4158', '2005', '0'), +('8', '8', '19', '4837', '4047', '0'), +('8', '8', '19', '68239', '2979', '0'), +('8', '8', '19', '4867', '2974', '0'), +('8', '8', '19', '4159', '1973', '0'), +('8', '8', '13', '27725', '4279', '0'), +('8', '8', '13', '5416', '3308', '0'), +('8', '8', '13', '7257', '3266', '0'), +('8', '8', '13', '6692', '3070', '0'), +('8', '8', '14', '5416', '3308', '0'), +('8', '8', '14', '7257', '3266', '0'), +('8', '8', '14', '6692', '3070', '0'), +('8', '8', '14', '7407', '3046', '0'), +('8', '8', '11', '13353', '1500', '0'), +('8', '8', '11', '14762', '1291', '0'), +('8', '8', '11', '9246', '1099', '0'), +('8', '8', '11', '20677', '900', '0'), +('8', '9', '22', '10323', '0', '0'), +('8', '9', '22', '10664', '0', '0'), +('8', '9', '22', '9246', '0', '0'), +('8', '9', '22', '21509', '0', '0'), +('8', '9', '1', '14701', '2452', '0'), +('8', '9', '1', '14702', '2050', '0'), +('8', '9', '1', '30361', '1440', '0'), +('8', '9', '1', '10165', '873', '0'), +('8', '9', '2', '4301', '3663', '0'), +('8', '9', '2', '4831', '3189', '0'), +('8', '9', '2', '10142', '3012', '0'), +('8', '9', '2', '10143', '2853', '0'), +('8', '9', '3', '27720', '3203', '0'), +('8', '9', '3', '2711', '1847', '0'), +('8', '9', '3', '71529', '1682', '0'), +('8', '9', '3', '21014', '1057', '0'), +('8', '9', '5', '27723', '4133', '0'), +('8', '9', '5', '14703', '3850', '0'), +('8', '9', '5', '14565', '3529', '0'), +('8', '9', '5', '14700', '2553', '0'), +('8', '9', '8', '11621', '11486', '0'), +('8', '9', '8', '11551', '4827', '0'), +('8', '9', '8', '11603', '3956', '0'), +('8', '9', '8', '1409', '3461', '0'), +('8', '9', '6', '1557', '6760', '0'), +('8', '9', '6', '27721', '2022', '0'), +('8', '9', '6', '4405', '1870', '0'), +('8', '9', '6', '4302', '1741', '0'), +('8', '9', '17', '4832', '6390', '0'), +('8', '9', '17', '4862', '5452', '0'), +('8', '9', '17', '11623', '4375', '0'), +('8', '9', '17', '4154', '4099', '0'), +('8', '9', '7', '4833', '3443', '0'), +('8', '9', '7', '4863', '2912', '0'), +('8', '9', '7', '4343', '2326', '0'), +('8', '9', '7', '4155', '1973', '0'), +('8', '9', '9', '1541', '2833', '0'), +('8', '9', '9', '4834', '2623', '0'), +('8', '9', '9', '4864', '2217', '0'), +('8', '9', '9', '12189', '1961', '0'), +('8', '9', '15', '10366', '3254', '0'), +('8', '9', '15', '14679', '2955', '0'), +('8', '9', '15', '10151', '2700', '0'), +('8', '9', '15', '14678', '2404', '0'), +('8', '9', '20', '11601', '7692', '0'), +('8', '9', '20', '11666', '5620', '0'), +('8', '9', '20', '2920', '4467', '0'), +('8', '9', '20', '1365', '4200', '0'), +('8', '9', '12', '4835', '4633', '0'), +('8', '9', '12', '20655', '4343', '0'), +('8', '9', '12', '4865', '2665', '0'), +('8', '9', '12', '3310', '2661', '0'), +('8', '9', '18', '4836', '3268', '0'), +('8', '9', '18', '4866', '3041', '0'), +('8', '9', '18', '4346', '2621', '0'), +('8', '9', '18', '4158', '2005', '0'), +('8', '9', '19', '4837', '4059', '0'), +('8', '9', '19', '4867', '2987', '0'), +('8', '9', '19', '68239', '2986', '0'), +('8', '9', '19', '4159', '1973', '0'), +('8', '9', '13', '27725', '4279', '0'), +('8', '9', '13', '5416', '3308', '0'), +('8', '9', '13', '7257', '3266', '0'), +('8', '9', '13', '6692', '3070', '0'), +('8', '9', '14', '5416', '3308', '0'), +('8', '9', '14', '7257', '3266', '0'), +('8', '9', '14', '6692', '3070', '0'), +('8', '9', '14', '7407', '3046', '0'), +('8', '9', '11', '13353', '1500', '0'), +('8', '9', '11', '14762', '1291', '0'), +('8', '9', '11', '9246', '1123', '0'), +('8', '9', '11', '20677', '900', '0'), +('8', '10', '22', '10323', '0', '0'), +('8', '10', '22', '10664', '0', '0'), +('8', '10', '22', '9246', '0', '0'), +('8', '10', '22', '21509', '0', '0'), +('8', '10', '1', '14701', '2452', '0'), +('8', '10', '1', '14702', '2050', '0'), +('8', '10', '1', '30361', '1440', '0'), +('8', '10', '1', '10165', '873', '0'), +('8', '10', '2', '4301', '3663', '0'), +('8', '10', '2', '4831', '3201', '0'), +('8', '10', '2', '10142', '3012', '0'), +('8', '10', '2', '10143', '2853', '0'), +('8', '10', '3', '27720', '3214', '0'), +('8', '10', '3', '71529', '1874', '0'), +('8', '10', '3', '2711', '1858', '0'), +('8', '10', '3', '21002', '1057', '0'), +('8', '10', '5', '27723', '4139', '0'), +('8', '10', '5', '14703', '3850', '0'), +('8', '10', '5', '14565', '3535', '0'), +('8', '10', '5', '14700', '2553', '0'), +('8', '10', '8', '11621', '11486', '0'), +('8', '10', '8', '11551', '4827', '0'), +('8', '10', '8', '11603', '3977', '0'), +('8', '10', '8', '1409', '3461', '0'), +('8', '10', '6', '1557', '6760', '0'), +('8', '10', '6', '27721', '2022', '0'), +('8', '10', '6', '4405', '1870', '0'), +('8', '10', '6', '4302', '1749', '0'), +('8', '10', '17', '4832', '6412', '0'), +('8', '10', '17', '4862', '5452', '0'), +('8', '10', '17', '11623', '4375', '0'), +('8', '10', '17', '4154', '4106', '0'), +('8', '10', '7', '4833', '3443', '0'), +('8', '10', '7', '4863', '2933', '0'), +('8', '10', '7', '4343', '2341', '0'), +('8', '10', '7', '4155', '1973', '0'), +('8', '10', '9', '1541', '2833', '0'), +('8', '10', '9', '4834', '2623', '0'), +('8', '10', '9', '4864', '2224', '0'), +('8', '10', '9', '12189', '1961', '0'), +('8', '10', '15', '10366', '3254', '0'), +('8', '10', '15', '14679', '2955', '0'), +('8', '10', '15', '10151', '2700', '0'), +('8', '10', '15', '14678', '2404', '0'), +('8', '10', '20', '11601', '7706', '0'), +('8', '10', '20', '11666', '5630', '0'), +('8', '10', '20', '2920', '4467', '0'), +('8', '10', '20', '1365', '4200', '0'), +('8', '10', '12', '4835', '4641', '0'), +('8', '10', '12', '20655', '4351', '0'), +('8', '10', '12', '4865', '2665', '0'), +('8', '10', '12', '3310', '2661', '0'), +('8', '10', '18', '4836', '3275', '0'), +('8', '10', '18', '4866', '3054', '0'), +('8', '10', '18', '4346', '2621', '0'), +('8', '10', '18', '4158', '2005', '0'), +('8', '10', '19', '4837', '4071', '0'), +('8', '10', '19', '4867', '3000', '0'), +('8', '10', '19', '68239', '2993', '0'), +('8', '10', '19', '4159', '1973', '0'), +('8', '10', '13', '27725', '4279', '0'), +('8', '10', '13', '5416', '3308', '0'), +('8', '10', '13', '7257', '3266', '0'), +('8', '10', '13', '6692', '3070', '0'), +('8', '10', '14', '5416', '3308', '0'), +('8', '10', '14', '7257', '3266', '0'), +('8', '10', '14', '6692', '3070', '0'), +('8', '10', '14', '7407', '3046', '0'), +('8', '10', '11', '13353', '1500', '0'), +('8', '10', '11', '14762', '1291', '0'), +('8', '10', '11', '9246', '1148', '0'), +('8', '10', '11', '20677', '900', '0'), +('8', '11', '22', '10323', '0', '0'), +('8', '11', '22', '10664', '0', '0'), +('8', '11', '22', '9246', '0', '0'), +('8', '11', '22', '21509', '0', '0'), +('8', '11', '1', '14701', '2452', '0'), +('8', '11', '1', '14702', '2050', '0'), +('8', '11', '1', '30361', '1440', '0'), +('8', '11', '1', '10165', '873', '0'), +('8', '11', '2', '4301', '3663', '0'), +('8', '11', '2', '4831', '3213', '0'), +('8', '11', '2', '10142', '3012', '0'), +('8', '11', '2', '10143', '2853', '0'), +('8', '11', '3', '27720', '3227', '0'), +('8', '11', '3', '71529', '1881', '0'), +('8', '11', '3', '2711', '1871', '0'), +('8', '11', '3', '21002', '1057', '0'), +('8', '11', '5', '27723', '4146', '0'), +('8', '11', '5', '14703', '3850', '0'), +('8', '11', '5', '14565', '3542', '0'), +('8', '11', '5', '14700', '2553', '0'), +('8', '11', '8', '11621', '11486', '0'), +('8', '11', '8', '11551', '4827', '0'), +('8', '11', '8', '11603', '3999', '0'), +('8', '11', '8', '1409', '3461', '0'), +('8', '11', '6', '1557', '6760', '0'), +('8', '11', '6', '27721', '2022', '0'), +('8', '11', '6', '4405', '1870', '0'), +('8', '11', '6', '4302', '1760', '0'), +('8', '11', '17', '4832', '6437', '0'), +('8', '11', '17', '4862', '5452', '0'), +('8', '11', '17', '11623', '4375', '0'), +('8', '11', '17', '4154', '4114', '0'), +('8', '11', '7', '4833', '3443', '0'), +('8', '11', '7', '4863', '2955', '0'), +('8', '11', '7', '4343', '2357', '0'), +('8', '11', '7', '4155', '1973', '0'), +('8', '11', '9', '1541', '2833', '0'), +('8', '11', '9', '4834', '2623', '0'), +('8', '11', '9', '4864', '2231', '0'), +('8', '11', '9', '12189', '1961', '0'), +('8', '11', '15', '10366', '3254', '0'), +('8', '11', '15', '14679', '2955', '0'), +('8', '11', '15', '10151', '2700', '0'), +('8', '11', '15', '14678', '2404', '0'), +('8', '11', '20', '11601', '7723', '0'), +('8', '11', '20', '11666', '5642', '0'), +('8', '11', '20', '2920', '4467', '0'), +('8', '11', '20', '1365', '4200', '0'), +('8', '11', '12', '4835', '4649', '0'), +('8', '11', '12', '20655', '4359', '0'), +('8', '11', '12', '4865', '2665', '0'), +('8', '11', '12', '3310', '2661', '0'), +('8', '11', '18', '4836', '3283', '0'), +('8', '11', '18', '4866', '3069', '0'), +('8', '11', '18', '4346', '2621', '0'), +('8', '11', '18', '4158', '2005', '0'), +('8', '11', '19', '4837', '4083', '0'), +('8', '11', '19', '4867', '3015', '0'), +('8', '11', '19', '68239', '3001', '0'), +('8', '11', '19', '4159', '1973', '0'), +('8', '11', '13', '27725', '4279', '0'), +('8', '11', '13', '5416', '3308', '0'), +('8', '11', '13', '7257', '3266', '0'), +('8', '11', '13', '6692', '3070', '0'), +('8', '11', '14', '5416', '3308', '0'), +('8', '11', '14', '7257', '3266', '0'), +('8', '11', '14', '6692', '3070', '0'), +('8', '11', '14', '11625', '3053', '0'), +('8', '11', '11', '13353', '1500', '0'), +('8', '11', '11', '14762', '1291', '0'), +('8', '11', '11', '9246', '1172', '0'), +('8', '11', '11', '20677', '900', '0'), +('8', '12', '22', '10323', '0', '0'), +('8', '12', '22', '10664', '0', '0'), +('8', '12', '22', '9246', '0', '0'), +('8', '12', '22', '21509', '0', '0'), +('8', '12', '1', '14701', '2452', '0'), +('8', '12', '1', '14702', '2050', '0'), +('8', '12', '1', '30361', '1440', '0'), +('8', '12', '1', '10165', '873', '0'), +('8', '12', '2', '4301', '3663', '0'), +('8', '12', '2', '4831', '3225', '0'), +('8', '12', '2', '10142', '3012', '0'), +('8', '12', '2', '10143', '2853', '0'), +('8', '12', '3', '27720', '3238', '0'), +('8', '12', '3', '71529', '1887', '0'), +('8', '12', '3', '2711', '1882', '0'), +('8', '12', '3', '21002', '1057', '0'), +('8', '12', '5', '27723', '4151', '0'), +('8', '12', '5', '14703', '3850', '0'), +('8', '12', '5', '14565', '3547', '0'), +('8', '12', '5', '14700', '2553', '0'), +('8', '12', '8', '11621', '11486', '0'), +('8', '12', '8', '11551', '4827', '0'), +('8', '12', '8', '11603', '4021', '0'), +('8', '12', '8', '1409', '3461', '0'), +('8', '12', '6', '1557', '6760', '0'), +('8', '12', '6', '27721', '2022', '0'), +('8', '12', '6', '4405', '1870', '0'), +('8', '12', '6', '4302', '1768', '0'), +('8', '12', '17', '4832', '6459', '0'), +('8', '12', '17', '4862', '5452', '0'), +('8', '12', '17', '11623', '4375', '0'), +('8', '12', '17', '4154', '4121', '0'), +('8', '12', '7', '4833', '3443', '0'), +('8', '12', '7', '4863', '2977', '0'), +('8', '12', '7', '4343', '2372', '0'), +('8', '12', '7', '4155', '1973', '0'), +('8', '12', '9', '1541', '2833', '0'), +('8', '12', '9', '4834', '2623', '0'), +('8', '12', '9', '4864', '2239', '0'), +('8', '12', '9', '12189', '1961', '0'), +('8', '12', '15', '10366', '3254', '0'), +('8', '12', '15', '14679', '2955', '0'), +('8', '12', '15', '10151', '2700', '0'), +('8', '12', '15', '14678', '2404', '0'), +('8', '12', '20', '11601', '7738', '0'), +('8', '12', '20', '11666', '5652', '0'), +('8', '12', '20', '2920', '4467', '0'), +('8', '12', '20', '1365', '4200', '0'), +('8', '12', '12', '4835', '4656', '0'), +('8', '12', '12', '20655', '4367', '0'), +('8', '12', '12', '4865', '2665', '0'), +('8', '12', '12', '3310', '2661', '0'), +('8', '12', '18', '4836', '3291', '0'), +('8', '12', '18', '4866', '3082', '0'), +('8', '12', '18', '4346', '2621', '0'), +('8', '12', '18', '4158', '2005', '0'), +('8', '12', '19', '4837', '4095', '0'), +('8', '12', '19', '4867', '3028', '0'), +('8', '12', '19', '68239', '3008', '0'), +('8', '12', '19', '4159', '1973', '0'), +('8', '12', '13', '27725', '4279', '0'), +('8', '12', '13', '5416', '3308', '0'), +('8', '12', '13', '7257', '3266', '0'), +('8', '12', '13', '6692', '3070', '0'), +('8', '12', '14', '5416', '3308', '0'), +('8', '12', '14', '7257', '3266', '0'), +('8', '12', '14', '6692', '3070', '0'), +('8', '12', '14', '11625', '3066', '0'), +('8', '12', '11', '13353', '1500', '0'), +('8', '12', '11', '14762', '1291', '0'), +('8', '12', '11', '9246', '1196', '0'), +('8', '12', '11', '20677', '900', '0'), +('8', '13', '22', '10323', '0', '0'), +('8', '13', '22', '10664', '0', '0'), +('8', '13', '22', '9246', '0', '0'), +('8', '13', '22', '21509', '0', '0'), +('8', '13', '1', '14701', '2452', '0'), +('8', '13', '1', '14702', '2050', '0'), +('8', '13', '1', '30361', '1440', '0'), +('8', '13', '1', '10165', '873', '0'), +('8', '13', '2', '4301', '3663', '0'), +('8', '13', '2', '4831', '3237', '0'), +('8', '13', '2', '10142', '3012', '0'), +('8', '13', '2', '10143', '2853', '0'), +('8', '13', '3', '27720', '3250', '0'), +('8', '13', '3', '2711', '1894', '0'), +('8', '13', '3', '71529', '1893', '0'), +('8', '13', '3', '21014', '1057', '0'), +('8', '13', '5', '27723', '4157', '0'), +('8', '13', '5', '14703', '3850', '0'), +('8', '13', '5', '14565', '3553', '0'), +('8', '13', '5', '14700', '2553', '0'), +('8', '13', '8', '11621', '11486', '0'), +('8', '13', '8', '11551', '4827', '0'), +('8', '13', '8', '11603', '4043', '0'), +('8', '13', '8', '1409', '3461', '0'), +('8', '13', '6', '1557', '6760', '0'), +('8', '13', '6', '27721', '2022', '0'), +('8', '13', '6', '4405', '1870', '0'), +('8', '13', '6', '4302', '1777', '0'), +('8', '13', '17', '4832', '6481', '0'), +('8', '13', '17', '4862', '5452', '0'), +('8', '13', '17', '11623', '4375', '0'), +('8', '13', '17', '4154', '4129', '0'), +('8', '13', '7', '4833', '3443', '0'), +('8', '13', '7', '4863', '2999', '0'), +('8', '13', '7', '4343', '2386', '0'), +('8', '13', '7', '4155', '1973', '0'), +('8', '13', '9', '1541', '2833', '0'), +('8', '13', '9', '4834', '2623', '0'), +('8', '13', '9', '4864', '2246', '0'), +('8', '13', '9', '12189', '1961', '0'), +('8', '13', '15', '10366', '3254', '0'), +('8', '13', '15', '14679', '2955', '0'), +('8', '13', '15', '10151', '2700', '0'), +('8', '13', '15', '14678', '2404', '0'), +('8', '13', '20', '11601', '7752', '0'), +('8', '13', '20', '11666', '5662', '0'), +('8', '13', '20', '2920', '4467', '0'), +('8', '13', '20', '1365', '4200', '0'), +('8', '13', '12', '4835', '4664', '0'), +('8', '13', '12', '20655', '4375', '0'), +('8', '13', '12', '4865', '2665', '0'), +('8', '13', '12', '3310', '2661', '0'), +('8', '13', '18', '4836', '3298', '0'), +('8', '13', '18', '4866', '3095', '0'), +('8', '13', '18', '4346', '2621', '0'), +('8', '13', '18', '4158', '2005', '0'), +('8', '13', '19', '4837', '4107', '0'), +('8', '13', '19', '4867', '3041', '0'), +('8', '13', '19', '68239', '3015', '0'), +('8', '13', '19', '4159', '1973', '0'), +('8', '13', '13', '27725', '4279', '0'), +('8', '13', '13', '5416', '3308', '0'), +('8', '13', '13', '7257', '3266', '0'), +('8', '13', '13', '11625', '3079', '0'), +('8', '13', '14', '5416', '3308', '0'), +('8', '13', '14', '7257', '3266', '0'), +('8', '13', '14', '11625', '3079', '0'), +('8', '13', '14', '6692', '3070', '0'), +('8', '13', '11', '13353', '1500', '0'), +('8', '13', '11', '14762', '1291', '0'), +('8', '13', '11', '9246', '1220', '0'), +('8', '13', '11', '20677', '900', '0'), +('8', '14', '22', '10323', '0', '0'), +('8', '14', '22', '10664', '0', '0'), +('8', '14', '22', '9246', '0', '0'), +('8', '14', '22', '21509', '0', '0'), +('8', '14', '1', '14701', '2452', '0'), +('8', '14', '1', '14702', '2050', '0'), +('8', '14', '1', '30361', '1440', '0'), +('8', '14', '1', '10165', '873', '0'), +('8', '14', '2', '4301', '3663', '0'), +('8', '14', '2', '4831', '3250', '0'), +('8', '14', '2', '10142', '3012', '0'), +('8', '14', '2', '10143', '2853', '0'), +('8', '14', '3', '27720', '3262', '0'), +('8', '14', '3', '2711', '1906', '0'), +('8', '14', '3', '71529', '1899', '0'), +('8', '14', '3', '21014', '1057', '0'), +('8', '14', '5', '27723', '4164', '0'), +('8', '14', '5', '14703', '3850', '0'), +('8', '14', '5', '14565', '3560', '0'), +('8', '14', '5', '14700', '2553', '0'), +('8', '14', '8', '11621', '11486', '0'), +('8', '14', '8', '11551', '4827', '0'), +('8', '14', '8', '11603', '4064', '0'), +('8', '14', '8', '1409', '3461', '0'), +('8', '14', '6', '1557', '6760', '0'), +('8', '14', '6', '27721', '2022', '0'), +('8', '14', '6', '4405', '1870', '0'), +('8', '14', '6', '4302', '1787', '0'), +('8', '14', '17', '4832', '6506', '0'), +('8', '14', '17', '4862', '5452', '0'), +('8', '14', '17', '11623', '4375', '0'), +('8', '14', '17', '4154', '4137', '0'), +('8', '14', '7', '4833', '3443', '0'), +('8', '14', '7', '4863', '3020', '0'), +('8', '14', '7', '4343', '2403', '0'), +('8', '14', '7', '4155', '1973', '0'), +('8', '14', '9', '1541', '2833', '0'), +('8', '14', '9', '4834', '2623', '0'), +('8', '14', '9', '4864', '2253', '0'), +('8', '14', '9', '12189', '1961', '0'), +('8', '14', '15', '10366', '3254', '0'), +('8', '14', '15', '14679', '2955', '0'), +('8', '14', '15', '10151', '2700', '0'), +('8', '14', '15', '14678', '2404', '0'), +('8', '14', '20', '11601', '7769', '0'), +('8', '14', '20', '11666', '5674', '0'), +('8', '14', '20', '2920', '4467', '0'), +('8', '14', '20', '1365', '4200', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '14', '12', '4835', '4672', '0'), +('8', '14', '12', '20655', '4383', '0'), +('8', '14', '12', '4865', '2665', '0'), +('8', '14', '12', '3310', '2661', '0'), +('8', '14', '18', '4836', '3306', '0'), +('8', '14', '18', '4866', '3111', '0'), +('8', '14', '18', '4346', '2621', '0'), +('8', '14', '18', '4158', '2005', '0'), +('8', '14', '19', '4837', '4119', '0'), +('8', '14', '19', '4867', '3056', '0'), +('8', '14', '19', '68239', '3022', '0'), +('8', '14', '19', '4159', '1973', '0'), +('8', '14', '13', '27725', '4279', '0'), +('8', '14', '13', '5416', '3308', '0'), +('8', '14', '13', '7257', '3266', '0'), +('8', '14', '13', '11625', '3094', '0'), +('8', '14', '14', '5416', '3308', '0'), +('8', '14', '14', '7257', '3266', '0'), +('8', '14', '14', '11625', '3094', '0'), +('8', '14', '14', '6692', '3070', '0'), +('8', '14', '11', '13353', '1500', '0'), +('8', '14', '11', '14762', '1291', '0'), +('8', '14', '11', '9246', '1244', '0'), +('8', '14', '11', '20677', '900', '0'), +('8', '15', '22', '10323', '0', '0'), +('8', '15', '22', '10664', '0', '0'), +('8', '15', '22', '9246', '0', '0'), +('8', '15', '22', '21509', '0', '0'), +('8', '15', '1', '14701', '2452', '0'), +('8', '15', '1', '14702', '2050', '0'), +('8', '15', '1', '30361', '1440', '0'), +('8', '15', '1', '10165', '873', '0'), +('8', '15', '2', '4301', '3663', '0'), +('8', '15', '2', '4831', '3262', '0'), +('8', '15', '2', '10142', '3012', '0'), +('8', '15', '2', '10143', '2853', '0'), +('8', '15', '3', '27720', '3274', '0'), +('8', '15', '3', '2711', '1918', '0'), +('8', '15', '3', '71529', '1905', '0'), +('8', '15', '3', '21014', '1057', '0'), +('8', '15', '5', '27723', '4170', '0'), +('8', '15', '5', '14703', '3850', '0'), +('8', '15', '5', '14565', '3566', '0'), +('8', '15', '5', '14700', '2553', '0'), +('8', '15', '8', '11621', '11486', '0'), +('8', '15', '8', '11551', '4827', '0'), +('8', '15', '8', '11603', '4086', '0'), +('8', '15', '8', '1409', '3461', '0'), +('8', '15', '6', '1557', '6760', '0'), +('8', '15', '6', '27721', '2022', '0'), +('8', '15', '6', '4405', '1870', '0'), +('8', '15', '6', '4302', '1796', '0'), +('8', '15', '17', '4832', '6528', '0'), +('8', '15', '17', '4862', '5452', '0'), +('8', '15', '17', '11623', '4375', '0'), +('8', '15', '17', '4154', '4144', '0'), +('8', '15', '7', '4833', '3443', '0'), +('8', '15', '7', '4863', '3042', '0'), +('8', '15', '7', '4343', '2418', '0'), +('8', '15', '7', '4155', '1973', '0'), +('8', '15', '9', '1541', '2833', '0'), +('8', '15', '9', '4834', '2623', '0'), +('8', '15', '9', '4864', '2260', '0'), +('8', '15', '9', '12189', '1961', '0'), +('8', '15', '15', '10366', '3254', '0'), +('8', '15', '15', '14679', '2955', '0'), +('8', '15', '15', '10151', '2700', '0'), +('8', '15', '15', '14678', '2404', '0'), +('8', '15', '20', '11601', '7784', '0'), +('8', '15', '20', '11666', '5684', '0'), +('8', '15', '20', '2920', '4467', '0'), +('8', '15', '20', '1365', '4200', '0'), +('8', '15', '12', '4835', '4679', '0'), +('8', '15', '12', '20655', '4390', '0'), +('8', '15', '12', '4865', '2665', '0'), +('8', '15', '12', '3310', '2661', '0'), +('8', '15', '18', '4836', '3314', '0'), +('8', '15', '18', '4866', '3124', '0'), +('8', '15', '18', '4346', '2621', '0'), +('8', '15', '18', '4158', '2005', '0'), +('8', '15', '19', '4837', '4131', '0'), +('8', '15', '19', '4867', '3069', '0'), +('8', '15', '19', '68239', '3030', '0'), +('8', '15', '19', '4159', '1973', '0'), +('8', '15', '13', '27725', '4279', '0'), +('8', '15', '13', '5416', '3308', '0'), +('8', '15', '13', '7257', '3266', '0'), +('8', '15', '13', '11625', '3107', '0'), +('8', '15', '14', '5416', '3308', '0'), +('8', '15', '14', '7257', '3266', '0'), +('8', '15', '14', '11625', '3107', '0'), +('8', '15', '14', '6692', '3070', '0'), +('8', '15', '11', '13353', '1500', '0'), +('8', '15', '11', '14762', '1291', '0'), +('8', '15', '11', '9246', '1268', '0'), +('8', '15', '11', '20677', '900', '0'), +('8', '16', '22', '10323', '0', '0'), +('8', '16', '22', '10664', '0', '0'), +('8', '16', '22', '9246', '0', '0'), +('8', '16', '22', '21509', '0', '0'), +('8', '16', '1', '14701', '2452', '0'), +('8', '16', '1', '14702', '2050', '0'), +('8', '16', '1', '30361', '1440', '0'), +('8', '16', '1', '10165', '873', '0'), +('8', '16', '2', '4301', '3663', '0'), +('8', '16', '2', '4831', '3274', '0'), +('8', '16', '2', '10142', '3012', '0'), +('8', '16', '2', '10143', '2853', '0'), +('8', '16', '3', '27720', '3285', '0'), +('8', '16', '3', '2711', '1929', '0'), +('8', '16', '3', '71529', '1911', '0'), +('8', '16', '3', '21014', '1057', '0'), +('8', '16', '5', '27723', '4175', '0'), +('8', '16', '5', '14703', '3850', '0'), +('8', '16', '5', '14565', '3571', '0'), +('8', '16', '5', '14700', '2553', '0'), +('8', '16', '8', '11621', '11486', '0'), +('8', '16', '8', '11551', '4827', '0'), +('8', '16', '8', '11603', '4108', '0'), +('8', '16', '8', '1409', '3461', '0'), +('8', '16', '6', '1557', '6760', '0'), +('8', '16', '6', '27721', '2022', '0'), +('8', '16', '6', '4405', '1870', '0'), +('8', '16', '6', '4302', '1805', '0'), +('8', '16', '17', '4832', '6550', '0'), +('8', '16', '17', '4862', '5452', '0'), +('8', '16', '17', '11623', '4375', '0'), +('8', '16', '17', '4154', '4152', '0'), +('8', '16', '7', '4833', '3443', '0'), +('8', '16', '7', '4863', '3064', '0'), +('8', '16', '7', '4343', '2432', '0'), +('8', '16', '7', '4155', '1973', '0'), +('8', '16', '9', '1541', '2833', '0'), +('8', '16', '9', '4834', '2623', '0'), +('8', '16', '9', '4864', '2268', '0'), +('8', '16', '9', '12189', '1961', '0'), +('8', '16', '15', '10366', '3254', '0'), +('8', '16', '15', '14679', '2955', '0'), +('8', '16', '15', '10151', '2700', '0'), +('8', '16', '15', '14678', '2404', '0'), +('8', '16', '20', '11601', '7798', '0'), +('8', '16', '20', '11666', '5694', '0'), +('8', '16', '20', '2920', '4467', '0'), +('8', '16', '20', '1365', '4200', '0'), +('8', '16', '12', '4835', '4687', '0'), +('8', '16', '12', '20655', '4398', '0'), +('8', '16', '12', '4865', '2665', '0'), +('8', '16', '12', '3310', '2661', '0'), +('8', '16', '18', '4836', '3321', '0'), +('8', '16', '18', '4866', '3137', '0'), +('8', '16', '18', '4346', '2621', '0'), +('8', '16', '18', '4158', '2005', '0'), +('8', '16', '19', '4837', '4143', '0'), +('8', '16', '19', '4867', '3082', '0'), +('8', '16', '19', '68239', '3037', '0'), +('8', '16', '19', '4159', '1973', '0'), +('8', '16', '13', '27725', '4279', '0'), +('8', '16', '13', '5416', '3308', '0'), +('8', '16', '13', '7257', '3266', '0'), +('8', '16', '13', '11625', '3120', '0'), +('8', '16', '14', '5416', '3308', '0'), +('8', '16', '14', '7257', '3266', '0'), +('8', '16', '14', '11625', '3120', '0'), +('8', '16', '14', '6692', '3070', '0'), +('8', '16', '11', '13353', '1500', '0'), +('8', '16', '11', '9246', '1293', '0'), +('8', '16', '11', '14762', '1291', '0'), +('8', '16', '11', '20677', '900', '0'), +('8', '17', '22', '10323', '0', '0'), +('8', '17', '22', '10664', '0', '0'), +('8', '17', '22', '9246', '0', '0'), +('8', '17', '22', '21509', '0', '0'), +('8', '17', '1', '14701', '2452', '0'), +('8', '17', '1', '14702', '2050', '0'), +('8', '17', '1', '30361', '1440', '0'), +('8', '17', '1', '10165', '873', '0'), +('8', '17', '2', '4301', '3663', '0'), +('8', '17', '2', '4831', '3286', '0'), +('8', '17', '2', '10142', '3012', '0'), +('8', '17', '2', '10143', '2853', '0'), +('8', '17', '3', '27720', '3298', '0'), +('8', '17', '3', '2711', '1942', '0'), +('8', '17', '3', '71529', '1918', '0'), +('8', '17', '3', '21014', '1057', '0'), +('8', '17', '5', '27723', '4182', '0'), +('8', '17', '5', '14703', '3850', '0'), +('8', '17', '5', '14565', '3578', '0'), +('8', '17', '5', '14700', '2553', '0'), +('8', '17', '8', '11621', '11486', '0'), +('8', '17', '8', '11551', '4827', '0'), +('8', '17', '8', '11603', '4130', '0'), +('8', '17', '8', '1409', '3461', '0'), +('8', '17', '6', '1557', '6760', '0'), +('8', '17', '6', '27721', '2022', '0'), +('8', '17', '6', '4405', '1870', '0'), +('8', '17', '6', '4302', '1815', '0'), +('8', '17', '17', '4832', '6575', '0'), +('8', '17', '17', '4862', '5452', '0'), +('8', '17', '17', '11623', '4375', '0'), +('8', '17', '17', '4154', '4160', '0'), +('8', '17', '7', '4833', '3443', '0'), +('8', '17', '7', '4863', '3086', '0'), +('8', '17', '7', '4343', '2449', '0'), +('8', '17', '7', '4155', '1973', '0'), +('8', '17', '9', '1541', '2833', '0'), +('8', '17', '9', '4834', '2623', '0'), +('8', '17', '9', '4864', '2275', '0'), +('8', '17', '9', '12189', '1961', '0'), +('8', '17', '15', '10366', '3254', '0'), +('8', '17', '15', '14679', '2955', '0'), +('8', '17', '15', '10151', '2700', '0'), +('8', '17', '15', '14678', '2404', '0'), +('8', '17', '20', '11601', '7815', '0'), +('8', '17', '20', '11666', '5706', '0'), +('8', '17', '20', '2920', '4467', '0'), +('8', '17', '20', '1365', '4200', '0'), +('8', '17', '12', '4835', '4695', '0'), +('8', '17', '12', '20655', '4406', '0'), +('8', '17', '12', '4865', '2665', '0'), +('8', '17', '12', '3310', '2661', '0'), +('8', '17', '18', '4836', '3329', '0'), +('8', '17', '18', '4866', '3152', '0'), +('8', '17', '18', '4346', '2621', '0'), +('8', '17', '18', '4158', '2005', '0'), +('8', '17', '19', '4837', '4156', '0'), +('8', '17', '19', '4867', '3097', '0'), +('8', '17', '19', '68239', '3044', '0'), +('8', '17', '19', '4159', '1973', '0'), +('8', '17', '13', '27725', '4279', '0'), +('8', '17', '13', '5416', '3308', '0'), +('8', '17', '13', '7257', '3266', '0'), +('8', '17', '13', '11625', '3136', '0'), +('8', '17', '14', '5416', '3308', '0'), +('8', '17', '14', '7257', '3266', '0'), +('8', '17', '14', '11625', '3136', '0'), +('8', '17', '14', '6692', '3070', '0'), +('8', '17', '11', '13353', '1500', '0'), +('8', '17', '11', '9246', '1317', '0'), +('8', '17', '11', '14762', '1291', '0'), +('8', '17', '11', '20677', '900', '0'), +('8', '18', '22', '10323', '0', '0'), +('8', '18', '22', '10664', '0', '0'), +('8', '18', '22', '9246', '0', '0'), +('8', '18', '22', '21509', '0', '0'), +('8', '18', '1', '14701', '2452', '0'), +('8', '18', '1', '14702', '2050', '0'), +('8', '18', '1', '30361', '1440', '0'), +('8', '18', '1', '10165', '873', '0'), +('8', '18', '2', '4301', '3663', '0'), +('8', '18', '2', '4831', '3298', '0'), +('8', '18', '2', '10142', '3012', '0'), +('8', '18', '2', '10143', '2853', '0'), +('8', '18', '3', '27720', '3309', '0'), +('8', '18', '3', '2711', '1953', '0'), +('8', '18', '3', '71529', '1924', '0'), +('8', '18', '3', '4505', '1059', '0'), +('8', '18', '5', '27723', '4188', '0'), +('8', '18', '5', '14703', '3850', '0'), +('8', '18', '5', '14565', '3584', '0'), +('8', '18', '5', '14700', '2553', '0'), +('8', '18', '8', '11621', '11486', '0'), +('8', '18', '8', '11551', '4827', '0'), +('8', '18', '8', '11603', '4151', '0'), +('8', '18', '8', '1409', '3461', '0'), +('8', '18', '6', '1557', '6760', '0'), +('8', '18', '6', '27721', '2022', '0'), +('8', '18', '6', '4405', '1870', '0'), +('8', '18', '6', '4302', '1823', '0'), +('8', '18', '17', '4832', '6597', '0'), +('8', '18', '17', '4862', '5452', '0'), +('8', '18', '17', '11623', '4375', '0'), +('8', '18', '17', '4154', '4167', '0'), +('8', '18', '7', '4833', '3443', '0'), +('8', '18', '7', '4863', '3107', '0'), +('8', '18', '7', '4343', '2464', '0'), +('8', '18', '7', '4155', '1973', '0'), +('8', '18', '9', '1541', '2833', '0'), +('8', '18', '9', '4834', '2623', '0'), +('8', '18', '9', '4864', '2282', '0'), +('8', '18', '9', '12189', '1961', '0'), +('8', '18', '15', '10366', '3254', '0'), +('8', '18', '15', '14679', '2955', '0'), +('8', '18', '15', '10151', '2700', '0'), +('8', '18', '15', '14678', '2404', '0'), +('8', '18', '20', '11601', '7830', '0'), +('8', '18', '20', '11666', '5716', '0'), +('8', '18', '20', '2920', '4467', '0'), +('8', '18', '20', '1365', '4200', '0'), +('8', '18', '12', '4835', '4702', '0'), +('8', '18', '12', '20655', '4414', '0'), +('8', '18', '12', '4865', '2665', '0'), +('8', '18', '12', '3310', '2661', '0'), +('8', '18', '18', '4836', '3336', '0'), +('8', '18', '18', '4866', '3165', '0'), +('8', '18', '18', '4346', '2621', '0'), +('8', '18', '18', '4158', '2005', '0'), +('8', '18', '19', '4837', '4168', '0'), +('8', '18', '19', '4867', '3111', '0'), +('8', '18', '19', '68239', '3051', '0'), +('8', '18', '19', '4159', '1973', '0'), +('8', '18', '13', '27725', '4279', '0'), +('8', '18', '13', '5416', '3308', '0'), +('8', '18', '13', '7257', '3266', '0'), +('8', '18', '13', '11625', '3149', '0'), +('8', '18', '14', '5416', '3308', '0'), +('8', '18', '14', '7257', '3266', '0'), +('8', '18', '14', '11625', '3149', '0'), +('8', '18', '14', '6692', '3070', '0'), +('8', '18', '11', '13353', '1500', '0'), +('8', '18', '11', '9246', '1341', '0'), +('8', '18', '11', '14762', '1291', '0'), +('8', '18', '11', '20677', '900', '0'), +('8', '19', '22', '10323', '0', '0'), +('8', '19', '22', '10664', '0', '0'), +('8', '19', '22', '9246', '0', '0'), +('8', '19', '22', '21509', '0', '0'), +('8', '19', '1', '14701', '2452', '0'), +('8', '19', '1', '14702', '2050', '0'), +('8', '19', '1', '30361', '1440', '0'), +('8', '19', '1', '10165', '873', '0'), +('8', '19', '2', '4301', '3663', '0'), +('8', '19', '2', '4831', '3310', '0'), +('8', '19', '2', '10142', '3012', '0'), +('8', '19', '2', '10143', '2853', '0'), +('8', '19', '3', '27720', '3322', '0'), +('8', '19', '3', '2711', '1966', '0'), +('8', '19', '3', '71529', '1930', '0'), +('8', '19', '3', '4505', '1076', '0'), +('8', '19', '5', '27723', '4195', '0'), +('8', '19', '5', '14703', '3850', '0'), +('8', '19', '5', '14565', '3591', '0'), +('8', '19', '5', '14700', '2553', '0'), +('8', '19', '8', '11621', '11486', '0'), +('8', '19', '8', '11551', '4827', '0'), +('8', '19', '8', '11603', '4173', '0'), +('8', '19', '8', '1409', '3461', '0'), +('8', '19', '6', '1557', '6760', '0'), +('8', '19', '6', '27721', '2022', '0'), +('8', '19', '6', '4405', '1870', '0'), +('8', '19', '6', '4302', '1834', '0'), +('8', '19', '17', '4832', '6622', '0'), +('8', '19', '17', '4862', '5452', '0'), +('8', '19', '17', '11623', '4375', '0'), +('8', '19', '17', '4154', '4176', '0'), +('8', '19', '7', '4833', '3443', '0'), +('8', '19', '7', '4863', '3129', '0'), +('8', '19', '7', '4343', '2481', '0'), +('8', '19', '7', '4155', '1973', '0'), +('8', '19', '9', '1541', '2833', '0'), +('8', '19', '9', '4834', '2623', '0'), +('8', '19', '9', '4864', '2289', '0'), +('8', '19', '9', '12189', '1961', '0'), +('8', '19', '15', '10366', '3254', '0'), +('8', '19', '15', '14679', '2955', '0'), +('8', '19', '15', '10151', '2700', '0'), +('8', '19', '15', '14678', '2404', '0'), +('8', '19', '20', '11601', '7847', '0'), +('8', '19', '20', '11666', '5728', '0'), +('8', '19', '20', '2920', '4467', '0'), +('8', '19', '20', '1365', '4200', '0'), +('8', '19', '12', '4835', '4711', '0'), +('8', '19', '12', '20655', '4422', '0'), +('8', '19', '12', '4865', '2665', '0'), +('8', '19', '12', '3310', '2661', '0'), +('8', '19', '18', '4836', '3345', '0'), +('8', '19', '18', '4866', '3180', '0'), +('8', '19', '18', '4346', '2621', '0'), +('8', '19', '18', '4158', '2005', '0'), +('8', '19', '19', '4837', '4180', '0'), +('8', '19', '19', '4867', '3126', '0'), +('8', '19', '19', '68239', '3059', '0'), +('8', '19', '19', '4159', '1973', '0'), +('8', '19', '13', '27725', '4279', '0'), +('8', '19', '13', '5416', '3308', '0'), +('8', '19', '13', '7257', '3266', '0'), +('8', '19', '13', '11625', '3164', '0'), +('8', '19', '14', '5416', '3308', '0'), +('8', '19', '14', '7257', '3266', '0'), +('8', '19', '14', '11625', '3164', '0'), +('8', '19', '14', '6692', '3070', '0'), +('8', '19', '11', '13353', '1500', '0'), +('8', '19', '11', '9246', '1365', '0'), +('8', '19', '11', '14762', '1291', '0'), +('8', '19', '11', '20677', '900', '0'), +('8', '20', '22', '10323', '0', '0'), +('8', '20', '22', '10664', '0', '0'), +('8', '20', '22', '9246', '0', '0'), +('8', '20', '22', '21509', '0', '0'), +('8', '20', '1', '14701', '2452', '0'), +('8', '20', '1', '14702', '2050', '0'), +('8', '20', '1', '30361', '1440', '0'), +('8', '20', '1', '10165', '873', '0'), +('8', '20', '2', '4301', '3663', '0'), +('8', '20', '2', '4831', '3322', '0'), +('8', '20', '2', '10142', '3012', '0'), +('8', '20', '2', '10143', '2853', '0'), +('8', '20', '3', '27720', '3333', '0'), +('8', '20', '3', '2711', '1977', '0'), +('8', '20', '3', '71529', '1936', '0'), +('8', '20', '3', '4505', '1093', '0'), +('8', '20', '5', '27723', '4201', '0'), +('8', '20', '5', '14703', '3850', '0'), +('8', '20', '5', '14565', '3597', '0'), +('8', '20', '5', '14700', '2553', '0'), +('8', '20', '8', '11621', '11486', '0'), +('8', '20', '8', '11551', '4827', '0'), +('8', '20', '8', '11603', '4195', '0'), +('8', '20', '8', '1409', '3461', '0'), +('8', '20', '6', '1557', '6760', '0'), +('8', '20', '6', '27721', '2022', '0'), +('8', '20', '6', '4405', '1870', '0'), +('8', '20', '6', '4302', '1842', '0'), +('8', '20', '17', '4832', '6644', '0'), +('8', '20', '17', '4862', '5452', '0'), +('8', '20', '17', '11623', '4375', '0'), +('8', '20', '17', '4154', '4183', '0'), +('8', '20', '7', '4833', '3443', '0'), +('8', '20', '7', '4863', '3151', '0'), +('8', '20', '7', '4343', '2495', '0'), +('8', '20', '7', '4155', '1973', '0'), +('8', '20', '9', '1541', '2833', '0'), +('8', '20', '9', '4834', '2623', '0'), +('8', '20', '9', '4864', '2297', '0'), +('8', '20', '9', '12189', '1961', '0'), +('8', '20', '15', '10366', '3254', '0'), +('8', '20', '15', '14679', '2955', '0'), +('8', '20', '15', '10151', '2700', '0'), +('8', '20', '15', '14678', '2404', '0'), +('8', '20', '20', '11601', '7861', '0'), +('8', '20', '20', '11666', '5738', '0'), +('8', '20', '20', '2920', '4467', '0'), +('8', '20', '20', '1365', '4200', '0'), +('8', '20', '12', '4835', '4718', '0'), +('8', '20', '12', '20655', '4430', '0'), +('8', '20', '12', '4865', '2665', '0'), +('8', '20', '12', '3310', '2661', '0'), +('8', '20', '18', '4836', '3352', '0'), +('8', '20', '18', '4866', '3193', '0'), +('8', '20', '18', '4346', '2621', '0'), +('8', '20', '18', '4158', '2005', '0'), +('8', '20', '19', '4837', '4192', '0'), +('8', '20', '19', '4867', '3139', '0'), +('8', '20', '19', '68239', '3066', '0'), +('8', '20', '19', '4159', '1973', '0'), +('8', '20', '13', '27725', '4279', '0'), +('8', '20', '13', '6952', '3581', '0'), +('8', '20', '13', '5416', '3308', '0'), +('8', '20', '13', '7257', '3266', '0'), +('8', '20', '14', '6952', '3581', '0'), +('8', '20', '14', '5416', '3308', '0'), +('8', '20', '14', '7257', '3266', '0'), +('8', '20', '14', '11625', '3177', '0'), +('8', '20', '11', '13353', '1500', '0'), +('8', '20', '11', '9246', '1389', '0'), +('8', '20', '11', '14762', '1291', '0'), +('8', '20', '11', '20677', '900', '0'), +('8', '21', '22', '10323', '0', '0'), +('8', '21', '22', '10664', '0', '0'), +('8', '21', '22', '9246', '0', '0'), +('8', '21', '22', '21509', '0', '0'), +('8', '21', '1', '14701', '2452', '0'), +('8', '21', '1', '14702', '2050', '0'), +('8', '21', '1', '30361', '1440', '0'), +('8', '21', '1', '10165', '873', '0'), +('8', '21', '2', '4301', '3663', '0'), +('8', '21', '2', '4831', '3334', '0'), +('8', '21', '2', '10142', '3012', '0'), +('8', '21', '2', '10143', '2853', '0'), +('8', '21', '3', '27720', '3345', '0'), +('8', '21', '3', '2711', '1989', '0'), +('8', '21', '3', '71529', '1943', '0'), +('8', '21', '3', '4505', '1110', '0'), +('8', '21', '5', '27723', '4207', '0'), +('8', '21', '5', '14703', '3850', '0'), +('8', '21', '5', '14565', '3603', '0'), +('8', '21', '5', '14700', '2553', '0'), +('8', '21', '8', '11621', '11486', '0'), +('8', '21', '8', '11551', '4827', '0'), +('8', '21', '8', '11603', '4217', '0'), +('8', '21', '8', '1409', '3461', '0'), +('8', '21', '6', '1557', '6760', '0'), +('8', '21', '6', '27721', '2022', '0'), +('8', '21', '6', '4405', '1870', '0'), +('8', '21', '6', '4302', '1852', '0'), +('8', '21', '17', '4832', '6669', '0'), +('8', '21', '17', '4862', '5452', '0'), +('8', '21', '17', '11623', '4375', '0'), +('8', '21', '17', '4154', '4192', '0'), +('8', '21', '7', '4833', '3443', '0'), +('8', '21', '7', '4863', '3173', '0'), +('8', '21', '7', '4343', '2512', '0'), +('8', '21', '7', '4155', '1973', '0'), +('8', '21', '9', '1541', '2833', '0'), +('8', '21', '9', '4834', '2623', '0'), +('8', '21', '9', '4864', '2304', '0'), +('8', '21', '9', '12189', '1961', '0'), +('8', '21', '15', '10366', '3254', '0'), +('8', '21', '15', '14679', '2955', '0'), +('8', '21', '15', '10151', '2700', '0'), +('8', '21', '15', '14678', '2404', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '21', '20', '11601', '7878', '0'), +('8', '21', '20', '11666', '5750', '0'), +('8', '21', '20', '2920', '4467', '0'), +('8', '21', '20', '1365', '4200', '0'), +('8', '21', '12', '4835', '4726', '0'), +('8', '21', '12', '20655', '4438', '0'), +('8', '21', '12', '4865', '2665', '0'), +('8', '21', '12', '3310', '2661', '0'), +('8', '21', '18', '4836', '3361', '0'), +('8', '21', '18', '4866', '3208', '0'), +('8', '21', '18', '4346', '2621', '0'), +('8', '21', '18', '4158', '2005', '0'), +('8', '21', '19', '4837', '4204', '0'), +('8', '21', '19', '4867', '3154', '0'), +('8', '21', '19', '68239', '3073', '0'), +('8', '21', '19', '4159', '1973', '0'), +('8', '21', '13', '27725', '4279', '0'), +('8', '21', '13', '6952', '3581', '0'), +('8', '21', '13', '5416', '3308', '0'), +('8', '21', '13', '7257', '3266', '0'), +('8', '21', '14', '6952', '3581', '0'), +('8', '21', '14', '5416', '3308', '0'), +('8', '21', '14', '7257', '3266', '0'), +('8', '21', '14', '11625', '3192', '0'), +('8', '21', '11', '13353', '1500', '0'), +('8', '21', '11', '9246', '1413', '0'), +('8', '21', '11', '14762', '1291', '0'), +('8', '21', '11', '20677', '900', '0'), +('8', '22', '22', '10323', '0', '0'), +('8', '22', '22', '10664', '0', '0'), +('8', '22', '22', '9246', '0', '0'), +('8', '22', '22', '21509', '0', '0'), +('8', '22', '1', '14701', '2452', '0'), +('8', '22', '1', '14702', '2050', '0'), +('8', '22', '1', '30361', '1440', '0'), +('8', '22', '1', '10165', '873', '0'), +('8', '22', '2', '4301', '3663', '0'), +('8', '22', '2', '4831', '3346', '0'), +('8', '22', '2', '10142', '3012', '0'), +('8', '22', '2', '10143', '2853', '0'), +('8', '22', '3', '27720', '3357', '0'), +('8', '22', '3', '2711', '2001', '0'), +('8', '22', '3', '71529', '1949', '0'), +('8', '22', '3', '4505', '1127', '0'), +('8', '22', '5', '27723', '4213', '0'), +('8', '22', '5', '14703', '3850', '0'), +('8', '22', '5', '14565', '3609', '0'), +('8', '22', '5', '14700', '2553', '0'), +('8', '22', '8', '11621', '11486', '0'), +('8', '22', '8', '11551', '4827', '0'), +('8', '22', '8', '11603', '4238', '0'), +('8', '22', '8', '1409', '3461', '0'), +('8', '22', '6', '1557', '6760', '0'), +('8', '22', '6', '27721', '2022', '0'), +('8', '22', '6', '4405', '1870', '0'), +('8', '22', '6', '4302', '1861', '0'), +('8', '22', '17', '4832', '6691', '0'), +('8', '22', '17', '4862', '5452', '0'), +('8', '22', '17', '11623', '4375', '0'), +('8', '22', '17', '4154', '4199', '0'), +('8', '22', '7', '4833', '3443', '0'), +('8', '22', '7', '4863', '3194', '0'), +('8', '22', '7', '4343', '2527', '0'), +('8', '22', '7', '4155', '1973', '0'), +('8', '22', '9', '1541', '2833', '0'), +('8', '22', '9', '4834', '2623', '0'), +('8', '22', '9', '4864', '2311', '0'), +('8', '22', '9', '12189', '1961', '0'), +('8', '22', '15', '10366', '3254', '0'), +('8', '22', '15', '14679', '2955', '0'), +('8', '22', '15', '10151', '2700', '0'), +('8', '22', '15', '14678', '2404', '0'), +('8', '22', '20', '11601', '7892', '0'), +('8', '22', '20', '11666', '5760', '0'), +('8', '22', '20', '2920', '4467', '0'), +('8', '22', '20', '1365', '4200', '0'), +('8', '22', '12', '4835', '4734', '0'), +('8', '22', '12', '20655', '4446', '0'), +('8', '22', '12', '4865', '2665', '0'), +('8', '22', '12', '3310', '2661', '0'), +('8', '22', '18', '4836', '3368', '0'), +('8', '22', '18', '4866', '3221', '0'), +('8', '22', '18', '4346', '2621', '0'), +('8', '22', '18', '4158', '2005', '0'), +('8', '22', '19', '4837', '4216', '0'), +('8', '22', '19', '4867', '3167', '0'), +('8', '22', '19', '68239', '3080', '0'), +('8', '22', '19', '4159', '1973', '0'), +('8', '22', '13', '27725', '4279', '0'), +('8', '22', '13', '6952', '3581', '0'), +('8', '22', '13', '5416', '3308', '0'), +('8', '22', '13', '7257', '3266', '0'), +('8', '22', '14', '6952', '3581', '0'), +('8', '22', '14', '5416', '3308', '0'), +('8', '22', '14', '7257', '3266', '0'), +('8', '22', '14', '11625', '3205', '0'), +('8', '22', '11', '13353', '1500', '0'), +('8', '22', '11', '9246', '1438', '0'), +('8', '22', '11', '14762', '1291', '0'), +('8', '22', '11', '20677', '900', '0'), +('8', '23', '22', '10323', '0', '0'), +('8', '23', '22', '10664', '0', '0'), +('8', '23', '22', '9246', '0', '0'), +('8', '23', '22', '21509', '0', '0'), +('8', '23', '1', '14701', '2452', '0'), +('8', '23', '1', '14702', '2050', '0'), +('8', '23', '1', '30361', '1440', '0'), +('8', '23', '1', '10165', '873', '0'), +('8', '23', '2', '4301', '3663', '0'), +('8', '23', '2', '4831', '3358', '0'), +('8', '23', '2', '10142', '3012', '0'), +('8', '23', '2', '10143', '2853', '0'), +('8', '23', '3', '27720', '3369', '0'), +('8', '23', '3', '2711', '2013', '0'), +('8', '23', '3', '71529', '1955', '0'), +('8', '23', '3', '4505', '1144', '0'), +('8', '23', '5', '27723', '4220', '0'), +('8', '23', '5', '14703', '3850', '0'), +('8', '23', '5', '14565', '3616', '0'), +('8', '23', '5', '14700', '2553', '0'), +('8', '23', '8', '11621', '11486', '0'), +('8', '23', '8', '11551', '4827', '0'), +('8', '23', '8', '11603', '4260', '0'), +('8', '23', '8', '1409', '3461', '0'), +('8', '23', '6', '1557', '6760', '0'), +('8', '23', '6', '27721', '2022', '0'), +('8', '23', '6', '4302', '1871', '0'), +('8', '23', '6', '4405', '1870', '0'), +('8', '23', '17', '4832', '6716', '0'), +('8', '23', '17', '4862', '5452', '0'), +('8', '23', '17', '11623', '4375', '0'), +('8', '23', '17', '4154', '4207', '0'), +('8', '23', '7', '4833', '3443', '0'), +('8', '23', '7', '4863', '3216', '0'), +('8', '23', '7', '4343', '2544', '0'), +('8', '23', '7', '4155', '1973', '0'), +('8', '23', '9', '1541', '2833', '0'), +('8', '23', '9', '4834', '2623', '0'), +('8', '23', '9', '4864', '2318', '0'), +('8', '23', '9', '12189', '1961', '0'), +('8', '23', '15', '10366', '3254', '0'), +('8', '23', '15', '14679', '2955', '0'), +('8', '23', '15', '10151', '2700', '0'), +('8', '23', '15', '14678', '2404', '0'), +('8', '23', '20', '11601', '7909', '0'), +('8', '23', '20', '11666', '5772', '0'), +('8', '23', '20', '2920', '4467', '0'), +('8', '23', '20', '1365', '4200', '0'), +('8', '23', '12', '4835', '4742', '0'), +('8', '23', '12', '20655', '4454', '0'), +('8', '23', '12', '4865', '2665', '0'), +('8', '23', '12', '3310', '2661', '0'), +('8', '23', '18', '4836', '3376', '0'), +('8', '23', '18', '4866', '3237', '0'), +('8', '23', '18', '4346', '2621', '0'), +('8', '23', '18', '4158', '2005', '0'), +('8', '23', '19', '4837', '4228', '0'), +('8', '23', '19', '4867', '3182', '0'), +('8', '23', '19', '68239', '3088', '0'), +('8', '23', '19', '4159', '1973', '0'), +('8', '23', '13', '27725', '4279', '0'), +('8', '23', '13', '6952', '3581', '0'), +('8', '23', '13', '5416', '3308', '0'), +('8', '23', '13', '7257', '3266', '0'), +('8', '23', '14', '6952', '3581', '0'), +('8', '23', '14', '5416', '3308', '0'), +('8', '23', '14', '7257', '3266', '0'), +('8', '23', '14', '11625', '3220', '0'), +('8', '23', '11', '13353', '1500', '0'), +('8', '23', '11', '9246', '1462', '0'), +('8', '23', '11', '14762', '1291', '0'), +('8', '23', '11', '20677', '900', '0'), +('8', '24', '22', '10323', '0', '0'), +('8', '24', '22', '10664', '0', '0'), +('8', '24', '22', '9246', '0', '0'), +('8', '24', '22', '21509', '0', '0'), +('8', '24', '1', '14701', '2452', '0'), +('8', '24', '1', '14702', '2050', '0'), +('8', '24', '1', '30361', '1440', '0'), +('8', '24', '1', '10165', '873', '0'), +('8', '24', '2', '4301', '3663', '0'), +('8', '24', '2', '4831', '3370', '0'), +('8', '24', '2', '10142', '3012', '0'), +('8', '24', '2', '10143', '2853', '0'), +('8', '24', '3', '27720', '3382', '0'), +('8', '24', '3', '2711', '2026', '0'), +('8', '24', '3', '71529', '1962', '0'), +('8', '24', '3', '4505', '1161', '0'), +('8', '24', '5', '27723', '4227', '0'), +('8', '24', '5', '14703', '3850', '0'), +('8', '24', '5', '14565', '3623', '0'), +('8', '24', '5', '14700', '2553', '0'), +('8', '24', '8', '11621', '11486', '0'), +('8', '24', '8', '11551', '4827', '0'), +('8', '24', '8', '11603', '4282', '0'), +('8', '24', '8', '1409', '3461', '0'), +('8', '24', '6', '1557', '6760', '0'), +('8', '24', '6', '27721', '2022', '0'), +('8', '24', '6', '4302', '1881', '0'), +('8', '24', '6', '4405', '1870', '0'), +('8', '24', '17', '4832', '6742', '0'), +('8', '24', '17', '4862', '5452', '0'), +('8', '24', '17', '11623', '4375', '0'), +('8', '24', '17', '4154', '4216', '0'), +('8', '24', '7', '4833', '3443', '0'), +('8', '24', '7', '4863', '3238', '0'), +('8', '24', '7', '4343', '2560', '0'), +('8', '24', '7', '4155', '1973', '0'), +('8', '24', '9', '1541', '2833', '0'), +('8', '24', '9', '4834', '2623', '0'), +('8', '24', '9', '4864', '2326', '0'), +('8', '24', '9', '12189', '1961', '0'), +('8', '24', '15', '10366', '3254', '0'), +('8', '24', '15', '14679', '2955', '0'), +('8', '24', '15', '10151', '2700', '0'), +('8', '24', '15', '14678', '2404', '0'), +('8', '24', '20', '11601', '7926', '0'), +('8', '24', '20', '11666', '5784', '0'), +('8', '24', '20', '2920', '4467', '0'), +('8', '24', '20', '1365', '4200', '0'), +('8', '24', '12', '4835', '4751', '0'), +('8', '24', '12', '20655', '4462', '0'), +('8', '24', '12', '4865', '2665', '0'), +('8', '24', '12', '3310', '2661', '0'), +('8', '24', '18', '4836', '3385', '0'), +('8', '24', '18', '4866', '3252', '0'), +('8', '24', '18', '4346', '2621', '0'), +('8', '24', '18', '4158', '2005', '0'), +('8', '24', '19', '4837', '4240', '0'), +('8', '24', '19', '4867', '3198', '0'), +('8', '24', '19', '68239', '3095', '0'), +('8', '24', '19', '4159', '1973', '0'), +('8', '24', '13', '27725', '4279', '0'), +('8', '24', '13', '6952', '3581', '0'), +('8', '24', '13', '5416', '3308', '0'), +('8', '24', '13', '7257', '3266', '0'), +('8', '24', '14', '6952', '3581', '0'), +('8', '24', '14', '5416', '3308', '0'), +('8', '24', '14', '7257', '3266', '0'), +('8', '24', '14', '11625', '3236', '0'), +('8', '24', '11', '13353', '1500', '0'), +('8', '24', '11', '9246', '1486', '0'), +('8', '24', '11', '14762', '1291', '0'), +('8', '24', '11', '20677', '900', '0'), +('8', '25', '22', '10323', '0', '0'), +('8', '25', '22', '10664', '0', '0'), +('8', '25', '22', '9246', '0', '0'), +('8', '25', '22', '21509', '0', '0'), +('8', '25', '1', '14701', '2452', '0'), +('8', '25', '1', '14702', '2050', '0'), +('8', '25', '1', '30361', '1440', '0'), +('8', '25', '1', '10165', '873', '0'), +('8', '25', '2', '4301', '3663', '0'), +('8', '25', '2', '4831', '3382', '0'), +('8', '25', '2', '10142', '3012', '0'), +('8', '25', '2', '10143', '2853', '0'), +('8', '25', '3', '27720', '3393', '0'), +('8', '25', '3', '2711', '2037', '0'), +('8', '25', '3', '71529', '1968', '0'), +('8', '25', '3', '4505', '1178', '0'), +('8', '25', '5', '27723', '4232', '0'), +('8', '25', '5', '14703', '3850', '0'), +('8', '25', '5', '14565', '3628', '0'), +('8', '25', '5', '14700', '2553', '0'), +('8', '25', '8', '11621', '11486', '0'), +('8', '25', '8', '11551', '4827', '0'), +('8', '25', '8', '11603', '4304', '0'), +('8', '25', '8', '1409', '3461', '0'), +('8', '25', '6', '1557', '6760', '0'), +('8', '25', '6', '27721', '2022', '0'), +('8', '25', '6', '4302', '1890', '0'), +('8', '25', '6', '4405', '1870', '0'), +('8', '25', '17', '4832', '6764', '0'), +('8', '25', '17', '4862', '5452', '0'), +('8', '25', '17', '11623', '4375', '0'), +('8', '25', '17', '4154', '4223', '0'), +('8', '25', '7', '4833', '3443', '0'), +('8', '25', '7', '4863', '3260', '0'), +('8', '25', '7', '4343', '2575', '0'), +('8', '25', '7', '4155', '1973', '0'), +('8', '25', '9', '1541', '2833', '0'), +('8', '25', '9', '4834', '2623', '0'), +('8', '25', '9', '4864', '2333', '0'), +('8', '25', '9', '12189', '1961', '0'), +('8', '25', '15', '10366', '3254', '0'), +('8', '25', '15', '14679', '2955', '0'), +('8', '25', '15', '10151', '2700', '0'), +('8', '25', '15', '14678', '2404', '0'), +('8', '25', '20', '11601', '7941', '0'), +('8', '25', '20', '11666', '5794', '0'), +('8', '25', '20', '2920', '4467', '0'), +('8', '25', '20', '1365', '4200', '0'), +('8', '25', '12', '4835', '4758', '0'), +('8', '25', '12', '20655', '4470', '0'), +('8', '25', '12', '4865', '2665', '0'), +('8', '25', '12', '3310', '2661', '0'), +('8', '25', '18', '4836', '3392', '0'), +('8', '25', '18', '4866', '3265', '0'), +('8', '25', '18', '4346', '2621', '0'), +('8', '25', '18', '4158', '2005', '0'), +('8', '25', '19', '4837', '4252', '0'), +('8', '25', '19', '4867', '3211', '0'), +('8', '25', '19', '68239', '3102', '0'), +('8', '25', '19', '4159', '1973', '0'), +('8', '25', '13', '27725', '4279', '0'), +('8', '25', '13', '6952', '3581', '0'), +('8', '25', '13', '5416', '3308', '0'), +('8', '25', '13', '7257', '3266', '0'), +('8', '25', '14', '6952', '3581', '0'), +('8', '25', '14', '5416', '3308', '0'), +('8', '25', '14', '7257', '3266', '0'), +('8', '25', '14', '11625', '3249', '0'), +('8', '25', '11', '9246', '1510', '0'), +('8', '25', '11', '13353', '1500', '0'), +('8', '25', '11', '14762', '1291', '0'), +('8', '25', '11', '20677', '900', '0'), +('8', '26', '22', '10323', '0', '0'), +('8', '26', '22', '10664', '0', '0'), +('8', '26', '22', '9246', '0', '0'), +('8', '26', '22', '21509', '0', '0'), +('8', '26', '1', '14701', '2452', '0'), +('8', '26', '1', '14702', '2050', '0'), +('8', '26', '1', '30361', '1440', '0'), +('8', '26', '1', '10165', '873', '0'), +('8', '26', '2', '4301', '3663', '0'), +('8', '26', '2', '4831', '3394', '0'), +('8', '26', '2', '10142', '3012', '0'), +('8', '26', '2', '10143', '2853', '0'), +('8', '26', '3', '27720', '3406', '0'), +('8', '26', '3', '2711', '2050', '0'), +('8', '26', '3', '71529', '1975', '0'), +('8', '26', '3', '4505', '1195', '0'), +('8', '26', '5', '27723', '4239', '0'), +('8', '26', '5', '14703', '3850', '0'), +('8', '26', '5', '14565', '3635', '0'), +('8', '26', '5', '14700', '2553', '0'), +('8', '26', '8', '11621', '11486', '0'), +('8', '26', '8', '11551', '4827', '0'), +('8', '26', '8', '11603', '4325', '0'), +('8', '26', '8', '1409', '3461', '0'), +('8', '26', '6', '1557', '6760', '0'), +('8', '26', '6', '27721', '2022', '0'), +('8', '26', '6', '4302', '1900', '0'), +('8', '26', '6', '4405', '1870', '0'), +('8', '26', '17', '4832', '6789', '0'), +('8', '26', '17', '4862', '5452', '0'), +('8', '26', '17', '11623', '4375', '0'), +('8', '26', '17', '4154', '4231', '0'), +('8', '26', '7', '4833', '3443', '0'), +('8', '26', '7', '4863', '3281', '0'), +('8', '26', '7', '4343', '2592', '0'), +('8', '26', '7', '4155', '1973', '0'), +('8', '26', '9', '1541', '2833', '0'), +('8', '26', '9', '4834', '2623', '0'), +('8', '26', '9', '4864', '2340', '0'), +('8', '26', '9', '12189', '1961', '0'), +('8', '26', '15', '10366', '3254', '0'), +('8', '26', '15', '14679', '2955', '0'), +('8', '26', '15', '10151', '2700', '0'), +('8', '26', '15', '14678', '2404', '0'), +('8', '26', '20', '11601', '7958', '0'), +('8', '26', '20', '11666', '5806', '0'), +('8', '26', '20', '2920', '4467', '0'), +('8', '26', '20', '1365', '4200', '0'), +('8', '26', '12', '4835', '4766', '0'), +('8', '26', '12', '20655', '4478', '0'), +('8', '26', '12', '4865', '2665', '0'), +('8', '26', '12', '3310', '2661', '0'), +('8', '26', '18', '4836', '3401', '0'), +('8', '26', '18', '4866', '3280', '0'), +('8', '26', '18', '4346', '2621', '0'), +('8', '26', '18', '4158', '2005', '0'), +('8', '26', '19', '4837', '4264', '0'), +('8', '26', '19', '4867', '3226', '0'), +('8', '26', '19', '68239', '3109', '0'), +('8', '26', '19', '4159', '1973', '0'), +('8', '26', '13', '27725', '4279', '0'), +('8', '26', '13', '6952', '3581', '0'), +('8', '26', '13', '5416', '3308', '0'), +('8', '26', '13', '7257', '3266', '0'), +('8', '26', '14', '6952', '3581', '0'), +('8', '26', '14', '5416', '3308', '0'), +('8', '26', '14', '7257', '3266', '0'), +('8', '26', '14', '11625', '3264', '0'), +('8', '26', '11', '9246', '1534', '0'), +('8', '26', '11', '13353', '1500', '0'), +('8', '26', '11', '14762', '1291', '0'), +('8', '26', '11', '20677', '900', '0'), +('8', '27', '22', '10323', '0', '0'), +('8', '27', '22', '10664', '0', '0'), +('8', '27', '22', '9246', '0', '0'), +('8', '27', '22', '21509', '0', '0'), +('8', '27', '1', '14701', '2452', '0'), +('8', '27', '1', '14702', '2050', '0'), +('8', '27', '1', '30361', '1440', '0'), +('8', '27', '1', '10165', '873', '0'), +('8', '27', '2', '4301', '3663', '0'), +('8', '27', '2', '4831', '3407', '0'), +('8', '27', '2', '10142', '3012', '0'), +('8', '27', '2', '10143', '2853', '0'), +('8', '27', '3', '27720', '3418', '0'), +('8', '27', '3', '2711', '2062', '0'), +('8', '27', '3', '71529', '1982', '0'), +('8', '27', '3', '4505', '1212', '0'), +('8', '27', '5', '27723', '4246', '0'), +('8', '27', '5', '14703', '3850', '0'), +('8', '27', '5', '14565', '3642', '0'), +('8', '27', '5', '14700', '2553', '0'), +('8', '27', '8', '11621', '11486', '0'), +('8', '27', '8', '11551', '4827', '0'), +('8', '27', '8', '11603', '4347', '0'), +('8', '27', '8', '1409', '3461', '0'), +('8', '27', '6', '1557', '6760', '0'), +('8', '27', '6', '27721', '2022', '0'), +('8', '27', '6', '4302', '1910', '0'), +('8', '27', '6', '4405', '1870', '0'), +('8', '27', '17', '4832', '6814', '0'), +('8', '27', '17', '4862', '5452', '0'), +('8', '27', '17', '11623', '4375', '0'), +('8', '27', '17', '4154', '4240', '0'), +('8', '27', '7', '4833', '3443', '0'), +('8', '27', '7', '4863', '3303', '0'), +('8', '27', '7', '4343', '2609', '0'), +('8', '27', '7', '4155', '1973', '0'), +('8', '27', '9', '1541', '2833', '0'), +('8', '27', '9', '4834', '2623', '0'), +('8', '27', '9', '4864', '2347', '0'), +('8', '27', '9', '12189', '1961', '0'), +('8', '27', '15', '10366', '3254', '0'), +('8', '27', '15', '14679', '2955', '0'), +('8', '27', '15', '10151', '2700', '0'), +('8', '27', '15', '14678', '2404', '0'), +('8', '27', '20', '11601', '7975', '0'), +('8', '27', '20', '11666', '5818', '0'), +('8', '27', '20', '2920', '4467', '0'), +('8', '27', '20', '1365', '4200', '0'), +('8', '27', '12', '4835', '4775', '0'), +('8', '27', '12', '20655', '4487', '0'), +('8', '27', '12', '4865', '2665', '0'), +('8', '27', '12', '3310', '2661', '0'), +('8', '27', '18', '4836', '3409', '0'), +('8', '27', '18', '4866', '3295', '0'), +('8', '27', '18', '4346', '2621', '0'), +('8', '27', '18', '4158', '2005', '0'), +('8', '27', '19', '4837', '4276', '0'), +('8', '27', '19', '4867', '3241', '0'), +('8', '27', '19', '68239', '3117', '0'), +('8', '27', '19', '4159', '1973', '0'), +('8', '27', '13', '27725', '4279', '0'), +('8', '27', '13', '6952', '3581', '0'), +('8', '27', '13', '5416', '3308', '0'), +('8', '27', '13', '11625', '3279', '0'), +('8', '27', '14', '6952', '3581', '0'), +('8', '27', '14', '5416', '3308', '0'), +('8', '27', '14', '11625', '3279', '0'), +('8', '27', '14', '7257', '3266', '0'), +('8', '27', '11', '9246', '1558', '0'), +('8', '27', '11', '13353', '1500', '0'), +('8', '27', '11', '14762', '1291', '0'), +('8', '27', '11', '20677', '900', '0'), +('8', '28', '22', '10323', '0', '0'), +('8', '28', '22', '10664', '0', '0'), +('8', '28', '22', '9246', '0', '0'), +('8', '28', '22', '21509', '0', '0'), +('8', '28', '1', '14701', '2452', '0'), +('8', '28', '1', '14702', '2050', '0'), +('8', '28', '1', '30361', '1440', '0'), +('8', '28', '1', '10165', '873', '0'), +('8', '28', '2', '4301', '3663', '0'), +('8', '28', '2', '4831', '3419', '0'), +('8', '28', '2', '10142', '3012', '0'), +('8', '28', '2', '10143', '2853', '0'), +('8', '28', '3', '27720', '3430', '0'), +('8', '28', '3', '2711', '2074', '0'), +('8', '28', '3', '71529', '1987', '0'), +('8', '28', '3', '4505', '1229', '0'), +('8', '28', '5', '27723', '4252', '0'), +('8', '28', '5', '14703', '3850', '0'), +('8', '28', '5', '14565', '3648', '0'), +('8', '28', '5', '14700', '2553', '0'), +('8', '28', '8', '11621', '11486', '0'), +('8', '28', '8', '11551', '4827', '0'), +('8', '28', '8', '11603', '4369', '0'), +('8', '28', '8', '1409', '3461', '0'), +('8', '28', '6', '1557', '6760', '0'), +('8', '28', '6', '27721', '2022', '0'), +('8', '28', '6', '4302', '1919', '0'), +('8', '28', '6', '4405', '1870', '0'), +('8', '28', '17', '4832', '6836', '0'), +('8', '28', '17', '4862', '5452', '0'), +('8', '28', '17', '11623', '4375', '0'), +('8', '28', '17', '4154', '4247', '0'), +('8', '28', '7', '4833', '3443', '0'), +('8', '28', '7', '4863', '3325', '0'), +('8', '28', '7', '4343', '2623', '0'), +('8', '28', '7', '4155', '1973', '0'), +('8', '28', '9', '1541', '2833', '0'), +('8', '28', '9', '4834', '2623', '0'), +('8', '28', '9', '4864', '2355', '0'), +('8', '28', '9', '12189', '1961', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '28', '15', '10366', '3254', '0'), +('8', '28', '15', '14679', '2955', '0'), +('8', '28', '15', '10151', '2700', '0'), +('8', '28', '15', '14678', '2404', '0'), +('8', '28', '20', '11601', '7989', '0'), +('8', '28', '20', '11666', '5828', '0'), +('8', '28', '20', '2920', '4467', '0'), +('8', '28', '20', '1365', '4200', '0'), +('8', '28', '12', '4835', '4782', '0'), +('8', '28', '12', '20655', '4494', '0'), +('8', '28', '12', '4865', '2665', '0'), +('8', '28', '12', '3310', '2661', '0'), +('8', '28', '18', '4836', '3416', '0'), +('8', '28', '18', '4866', '3308', '0'), +('8', '28', '18', '4346', '2621', '0'), +('8', '28', '18', '4158', '2005', '0'), +('8', '28', '19', '4837', '4288', '0'), +('8', '28', '19', '4867', '3254', '0'), +('8', '28', '19', '68239', '3124', '0'), +('8', '28', '19', '4159', '1973', '0'), +('8', '28', '13', '27725', '4279', '0'), +('8', '28', '13', '6952', '3581', '0'), +('8', '28', '13', '5416', '3308', '0'), +('8', '28', '13', '11625', '3292', '0'), +('8', '28', '14', '6952', '3581', '0'), +('8', '28', '14', '5416', '3308', '0'), +('8', '28', '14', '11625', '3292', '0'), +('8', '28', '14', '7257', '3266', '0'), +('8', '28', '11', '9246', '1582', '0'), +('8', '28', '11', '13353', '1500', '0'), +('8', '28', '11', '14762', '1291', '0'), +('8', '28', '11', '20677', '900', '0'), +('8', '29', '22', '10323', '0', '0'), +('8', '29', '22', '10664', '0', '0'), +('8', '29', '22', '9246', '0', '0'), +('8', '29', '22', '21509', '0', '0'), +('8', '29', '1', '14701', '2452', '0'), +('8', '29', '1', '14702', '2050', '0'), +('8', '29', '1', '30361', '1440', '0'), +('8', '29', '1', '10165', '873', '0'), +('8', '29', '2', '4301', '3663', '0'), +('8', '29', '2', '4831', '3431', '0'), +('8', '29', '2', '10142', '3012', '0'), +('8', '29', '2', '10143', '2853', '0'), +('8', '29', '3', '27720', '3442', '0'), +('8', '29', '3', '2711', '2086', '0'), +('8', '29', '3', '71529', '1994', '0'), +('8', '29', '3', '4505', '1245', '0'), +('8', '29', '5', '27723', '4259', '0'), +('8', '29', '5', '14703', '3850', '0'), +('8', '29', '5', '14565', '3655', '0'), +('8', '29', '5', '14700', '2553', '0'), +('8', '29', '8', '11621', '11486', '0'), +('8', '29', '8', '11551', '4827', '0'), +('8', '29', '8', '11603', '4391', '0'), +('8', '29', '8', '1409', '3461', '0'), +('8', '29', '6', '1557', '6760', '0'), +('8', '29', '6', '27721', '2022', '0'), +('8', '29', '6', '4302', '1929', '0'), +('8', '29', '6', '4405', '1870', '0'), +('8', '29', '17', '4832', '6861', '0'), +('8', '29', '17', '4862', '5452', '0'), +('8', '29', '17', '11623', '4375', '0'), +('8', '29', '17', '4154', '4256', '0'), +('8', '29', '7', '4833', '3443', '0'), +('8', '29', '7', '4863', '3347', '0'), +('8', '29', '7', '4343', '2640', '0'), +('8', '29', '7', '4155', '1973', '0'), +('8', '29', '9', '1541', '2833', '0'), +('8', '29', '9', '4834', '2623', '0'), +('8', '29', '9', '4864', '2362', '0'), +('8', '29', '9', '12189', '1961', '0'), +('8', '29', '15', '10366', '3254', '0'), +('8', '29', '15', '14679', '2955', '0'), +('8', '29', '15', '10151', '2700', '0'), +('8', '29', '15', '14678', '2404', '0'), +('8', '29', '20', '11601', '8006', '0'), +('8', '29', '20', '11666', '5840', '0'), +('8', '29', '20', '2920', '4467', '0'), +('8', '29', '20', '1365', '4200', '0'), +('8', '29', '12', '4835', '4790', '0'), +('8', '29', '12', '20655', '4503', '0'), +('8', '29', '12', '11624', '2666', '0'), +('8', '29', '12', '4865', '2665', '0'), +('8', '29', '18', '4836', '3425', '0'), +('8', '29', '18', '4866', '3324', '0'), +('8', '29', '18', '4346', '2621', '0'), +('8', '29', '18', '4158', '2005', '0'), +('8', '29', '19', '4837', '4301', '0'), +('8', '29', '19', '4867', '3269', '0'), +('8', '29', '19', '68239', '3131', '0'), +('8', '29', '19', '4159', '1973', '0'), +('8', '29', '13', '27725', '4279', '0'), +('8', '29', '13', '6952', '3581', '0'), +('8', '29', '13', '5416', '3308', '0'), +('8', '29', '13', '11625', '3307', '0'), +('8', '29', '14', '6952', '3581', '0'), +('8', '29', '14', '5416', '3308', '0'), +('8', '29', '14', '11625', '3307', '0'), +('8', '29', '14', '7257', '3266', '0'), +('8', '29', '11', '9246', '1607', '0'), +('8', '29', '11', '13353', '1500', '0'), +('8', '29', '11', '14762', '1291', '0'), +('8', '29', '11', '20677', '900', '0'), +('8', '30', '22', '10323', '0', '0'), +('8', '30', '22', '10664', '0', '0'), +('8', '30', '22', '9246', '0', '0'), +('8', '30', '22', '21509', '0', '0'), +('8', '30', '1', '14701', '2452', '0'), +('8', '30', '1', '14702', '2050', '0'), +('8', '30', '1', '30361', '1440', '0'), +('8', '30', '1', '10165', '873', '0'), +('8', '30', '2', '4301', '3663', '0'), +('8', '30', '2', '4831', '3443', '0'), +('8', '30', '2', '10142', '3012', '0'), +('8', '30', '2', '10143', '2853', '0'), +('8', '30', '3', '27720', '3454', '0'), +('8', '30', '3', '2711', '2098', '0'), +('8', '30', '3', '71529', '2001', '0'), +('8', '30', '3', '4505', '1262', '0'), +('8', '30', '5', '27723', '4265', '0'), +('8', '30', '5', '14703', '3850', '0'), +('8', '30', '5', '14565', '3661', '0'), +('8', '30', '5', '14700', '2553', '0'), +('8', '30', '8', '11621', '11486', '0'), +('8', '30', '8', '11551', '4827', '0'), +('8', '30', '8', '11603', '4412', '0'), +('8', '30', '8', '1409', '3461', '0'), +('8', '30', '6', '1557', '6760', '0'), +('8', '30', '6', '27721', '2022', '0'), +('8', '30', '6', '4302', '1939', '0'), +('8', '30', '6', '4405', '1870', '0'), +('8', '30', '17', '4832', '6887', '0'), +('8', '30', '17', '4862', '5452', '0'), +('8', '30', '17', '11623', '4375', '0'), +('8', '30', '17', '4154', '4264', '0'), +('8', '30', '7', '4833', '3443', '0'), +('8', '30', '7', '4863', '3368', '0'), +('8', '30', '7', '4343', '2657', '0'), +('8', '30', '7', '4155', '1973', '0'), +('8', '30', '9', '1541', '2833', '0'), +('8', '30', '9', '4834', '2623', '0'), +('8', '30', '9', '4864', '2369', '0'), +('8', '30', '9', '12189', '1961', '0'), +('8', '30', '15', '10366', '3254', '0'), +('8', '30', '15', '14679', '2955', '0'), +('8', '30', '15', '10151', '2700', '0'), +('8', '30', '15', '14678', '2404', '0'), +('8', '30', '20', '11601', '8023', '0'), +('8', '30', '20', '11666', '5852', '0'), +('8', '30', '20', '2920', '4467', '0'), +('8', '30', '20', '1365', '4200', '0'), +('8', '30', '12', '4835', '4799', '0'), +('8', '30', '12', '20655', '4511', '0'), +('8', '30', '12', '11624', '2678', '0'), +('8', '30', '12', '4865', '2665', '0'), +('8', '30', '18', '4836', '3433', '0'), +('8', '30', '18', '4866', '3339', '0'), +('8', '30', '18', '4346', '2621', '0'), +('8', '30', '18', '4158', '2005', '0'), +('8', '30', '19', '4837', '4313', '0'), +('8', '30', '19', '4867', '3284', '0'), +('8', '30', '19', '68239', '3138', '0'), +('8', '30', '19', '4159', '1973', '0'), +('8', '30', '13', '27725', '4279', '0'), +('8', '30', '13', '6952', '3581', '0'), +('8', '30', '13', '11625', '3323', '0'), +('8', '30', '13', '5416', '3308', '0'), +('8', '30', '14', '6952', '3581', '0'), +('8', '30', '14', '11625', '3323', '0'), +('8', '30', '14', '5416', '3308', '0'), +('8', '30', '14', '7257', '3266', '0'), +('8', '30', '11', '9246', '1631', '0'), +('8', '30', '11', '13353', '1500', '0'), +('8', '30', '11', '14762', '1291', '0'), +('8', '30', '11', '20677', '900', '0'), +('8', '31', '22', '10323', '0', '0'), +('8', '31', '22', '10664', '0', '0'), +('8', '31', '22', '9246', '0', '0'), +('8', '31', '22', '21509', '0', '0'), +('8', '31', '1', '14701', '2452', '0'), +('8', '31', '1', '14702', '2050', '0'), +('8', '31', '1', '30361', '1440', '0'), +('8', '31', '1', '10165', '873', '0'), +('8', '31', '2', '4301', '3663', '0'), +('8', '31', '2', '4831', '3455', '0'), +('8', '31', '2', '10142', '3012', '0'), +('8', '31', '2', '10143', '2853', '0'), +('8', '31', '3', '27720', '3466', '0'), +('8', '31', '3', '2711', '2110', '0'), +('8', '31', '3', '71529', '2008', '0'), +('8', '31', '3', '4505', '1279', '0'), +('8', '31', '5', '27723', '4272', '0'), +('8', '31', '5', '14703', '3850', '0'), +('8', '31', '5', '14565', '3668', '0'), +('8', '31', '5', '14700', '2553', '0'), +('8', '31', '8', '11621', '11486', '0'), +('8', '31', '8', '11551', '4827', '0'), +('8', '31', '8', '11603', '4434', '0'), +('8', '31', '8', '1409', '3461', '0'), +('8', '31', '6', '1557', '6760', '0'), +('8', '31', '6', '27721', '2022', '0'), +('8', '31', '6', '4302', '1949', '0'), +('8', '31', '6', '4405', '1870', '0'), +('8', '31', '17', '4832', '6912', '0'), +('8', '31', '17', '4862', '5452', '0'), +('8', '31', '17', '11623', '4375', '0'), +('8', '31', '17', '4154', '4272', '0'), +('8', '31', '7', '4833', '3443', '0'), +('8', '31', '7', '4863', '3390', '0'), +('8', '31', '7', '4343', '2674', '0'), +('8', '31', '7', '4155', '1973', '0'), +('8', '31', '9', '1541', '2833', '0'), +('8', '31', '9', '4834', '2623', '0'), +('8', '31', '9', '4864', '2376', '0'), +('8', '31', '9', '12189', '1961', '0'), +('8', '31', '15', '10366', '3254', '0'), +('8', '31', '15', '14679', '2955', '0'), +('8', '31', '15', '10151', '2700', '0'), +('8', '31', '15', '14678', '2404', '0'), +('8', '31', '20', '11601', '8040', '0'), +('8', '31', '20', '11666', '5863', '0'), +('8', '31', '20', '2920', '4467', '0'), +('8', '31', '20', '1365', '4200', '0'), +('8', '31', '12', '4835', '4807', '0'), +('8', '31', '12', '20655', '4519', '0'), +('8', '31', '12', '11624', '2689', '0'), +('8', '31', '12', '4865', '2665', '0'), +('8', '31', '18', '4836', '3442', '0'), +('8', '31', '18', '4866', '3354', '0'), +('8', '31', '18', '4346', '2621', '0'), +('8', '31', '18', '4158', '2005', '0'), +('8', '31', '19', '4837', '4325', '0'), +('8', '31', '19', '4867', '3300', '0'), +('8', '31', '19', '68239', '3146', '0'), +('8', '31', '19', '4159', '1973', '0'), +('8', '31', '13', '27725', '4279', '0'), +('8', '31', '13', '6952', '3581', '0'), +('8', '31', '13', '11625', '3338', '0'), +('8', '31', '13', '5416', '3308', '0'), +('8', '31', '14', '6952', '3581', '0'), +('8', '31', '14', '11625', '3338', '0'), +('8', '31', '14', '5416', '3308', '0'), +('8', '31', '14', '7257', '3266', '0'), +('8', '31', '11', '9246', '1655', '0'), +('8', '31', '11', '13353', '1500', '0'), +('8', '31', '11', '14762', '1291', '0'), +('8', '31', '11', '20677', '900', '0'), +('8', '32', '22', '10323', '0', '0'), +('8', '32', '22', '10664', '0', '0'), +('8', '32', '22', '9246', '0', '0'), +('8', '32', '22', '21509', '0', '0'), +('8', '32', '1', '14701', '2452', '0'), +('8', '32', '1', '14702', '2050', '0'), +('8', '32', '1', '30361', '1440', '0'), +('8', '32', '1', '10165', '873', '0'), +('8', '32', '2', '4301', '3663', '0'), +('8', '32', '2', '4831', '3467', '0'), +('8', '32', '2', '10142', '3012', '0'), +('8', '32', '2', '10143', '2853', '0'), +('8', '32', '3', '27720', '3479', '0'), +('8', '32', '3', '2711', '2123', '0'), +('8', '32', '3', '71529', '2014', '0'), +('8', '32', '3', '4505', '1296', '0'), +('8', '32', '5', '27723', '4279', '0'), +('8', '32', '5', '14703', '3850', '0'), +('8', '32', '5', '14565', '3675', '0'), +('8', '32', '5', '14700', '2553', '0'), +('8', '32', '8', '11621', '11486', '0'), +('8', '32', '8', '11551', '4827', '0'), +('8', '32', '8', '11603', '4456', '0'), +('8', '32', '8', '1409', '3461', '0'), +('8', '32', '6', '1557', '6760', '0'), +('8', '32', '6', '27721', '2022', '0'), +('8', '32', '6', '4302', '1960', '0'), +('8', '32', '6', '4405', '1870', '0'), +('8', '32', '17', '4832', '6938', '0'), +('8', '32', '17', '4862', '5452', '0'), +('8', '32', '17', '11623', '4375', '0'), +('8', '32', '17', '4154', '4281', '0'), +('8', '32', '7', '4833', '3443', '0'), +('8', '32', '7', '4863', '3412', '0'), +('8', '32', '7', '4343', '2691', '0'), +('8', '32', '7', '4155', '1973', '0'), +('8', '32', '9', '1541', '2833', '0'), +('8', '32', '9', '4834', '2623', '0'), +('8', '32', '9', '4864', '2384', '0'), +('8', '32', '9', '12189', '1961', '0'), +('8', '32', '15', '10366', '3254', '0'), +('8', '32', '15', '14679', '2955', '0'), +('8', '32', '15', '10151', '2700', '0'), +('8', '32', '15', '14678', '2404', '0'), +('8', '32', '20', '11601', '8057', '0'), +('8', '32', '20', '11666', '5875', '0'), +('8', '32', '20', '2920', '4467', '0'), +('8', '32', '20', '1365', '4200', '0'), +('8', '32', '12', '4835', '4816', '0'), +('8', '32', '12', '20655', '4527', '0'), +('8', '32', '12', '11624', '2701', '0'), +('8', '32', '12', '4865', '2665', '0'), +('8', '32', '18', '4836', '3450', '0'), +('8', '32', '18', '4866', '3369', '0'), +('8', '32', '18', '4346', '2621', '0'), +('8', '32', '18', '4158', '2005', '0'), +('8', '32', '19', '4837', '4337', '0'), +('8', '32', '19', '4867', '3315', '0'), +('8', '32', '19', '68239', '3153', '0'), +('8', '32', '19', '4159', '1973', '0'), +('8', '32', '13', '27725', '4279', '0'), +('8', '32', '13', '6952', '3581', '0'), +('8', '32', '13', '11625', '3353', '0'), +('8', '32', '13', '5416', '3308', '0'), +('8', '32', '14', '6952', '3581', '0'), +('8', '32', '14', '11625', '3353', '0'), +('8', '32', '14', '5416', '3308', '0'), +('8', '32', '14', '7257', '3266', '0'), +('8', '32', '11', '9246', '1679', '0'), +('8', '32', '11', '13353', '1500', '0'), +('8', '32', '11', '14762', '1291', '0'), +('8', '32', '11', '20677', '900', '0'), +('8', '33', '22', '10323', '0', '0'), +('8', '33', '22', '10664', '0', '0'), +('8', '33', '22', '9246', '0', '0'), +('8', '33', '22', '21509', '0', '0'), +('8', '33', '1', '14701', '2452', '0'), +('8', '33', '1', '14702', '2050', '0'), +('8', '33', '1', '30361', '1440', '0'), +('8', '33', '1', '10165', '873', '0'), +('8', '33', '2', '4301', '3663', '0'), +('8', '33', '2', '4831', '3479', '0'), +('8', '33', '2', '10142', '3012', '0'), +('8', '33', '2', '10143', '2853', '0'), +('8', '33', '3', '27720', '3491', '0'), +('8', '33', '3', '2711', '2135', '0'), +('8', '33', '3', '71529', '2021', '0'), +('8', '33', '3', '4505', '1313', '0'), +('8', '33', '5', '27723', '4286', '0'), +('8', '33', '5', '14703', '3850', '0'), +('8', '33', '5', '14565', '3682', '0'), +('8', '33', '5', '14700', '2553', '0'), +('8', '33', '8', '11621', '11486', '0'), +('8', '33', '8', '11551', '4827', '0'), +('8', '33', '8', '11603', '4478', '0'), +('8', '33', '8', '1409', '3461', '0'), +('8', '33', '6', '1557', '6760', '0'), +('8', '33', '6', '27721', '2022', '0'), +('8', '33', '6', '4302', '1970', '0'), +('8', '33', '6', '4405', '1870', '0'), +('8', '33', '17', '4832', '6963', '0'), +('8', '33', '17', '4862', '5452', '0'), +('8', '33', '17', '11623', '4375', '0'), +('8', '33', '17', '4154', '4289', '0'), +('8', '33', '7', '4833', '3443', '0'), +('8', '33', '7', '4863', '3434', '0'), +('8', '33', '7', '4343', '2708', '0'), +('8', '33', '7', '4155', '1973', '0'), +('8', '33', '9', '1541', '2833', '0'), +('8', '33', '9', '4834', '2623', '0'), +('8', '33', '9', '4864', '2391', '0'), +('8', '33', '9', '12189', '1961', '0'), +('8', '33', '15', '10366', '3254', '0'), +('8', '33', '15', '14679', '2955', '0'), +('8', '33', '15', '10151', '2700', '0'), +('8', '33', '15', '14678', '2404', '0'), +('8', '33', '20', '11601', '8074', '0'), +('8', '33', '20', '11666', '5887', '0'), +('8', '33', '20', '2920', '4467', '0'), +('8', '33', '20', '1365', '4200', '0'), +('8', '33', '12', '4835', '4824', '0'), +('8', '33', '12', '20655', '4535', '0'), +('8', '33', '12', '11624', '2713', '0'), +('8', '33', '12', '4865', '2665', '0'), +('8', '33', '18', '4836', '3459', '0'), +('8', '33', '18', '4866', '3385', '0'), +('8', '33', '18', '4346', '2621', '0'), +('8', '33', '18', '4158', '2005', '0'), +('8', '33', '19', '4837', '4349', '0'), +('8', '33', '19', '4867', '3330', '0'), +('8', '33', '19', '68239', '3160', '0'), +('8', '33', '19', '4159', '1973', '0'), +('8', '33', '13', '27725', '4279', '0'), +('8', '33', '13', '6952', '3581', '0'), +('8', '33', '13', '11625', '3368', '0'), +('8', '33', '13', '5416', '3308', '0'), +('8', '33', '14', '6952', '3581', '0'), +('8', '33', '14', '11625', '3368', '0'), +('8', '33', '14', '5416', '3308', '0'), +('8', '33', '14', '7257', '3266', '0'), +('8', '33', '11', '9246', '1703', '0'), +('8', '33', '11', '13353', '1500', '0'), +('8', '33', '11', '14762', '1291', '0'), +('8', '33', '11', '20677', '900', '0'), +('8', '34', '22', '10323', '0', '0'), +('8', '34', '22', '10664', '0', '0'), +('8', '34', '22', '9246', '0', '0'), +('8', '34', '22', '21509', '0', '0'), +('8', '34', '1', '14701', '2452', '0'), +('8', '34', '1', '14702', '2050', '0'), +('8', '34', '1', '30361', '1440', '0'), +('8', '34', '1', '10165', '873', '0'), +('8', '34', '2', '4301', '3663', '0'), +('8', '34', '2', '4831', '3491', '0'), +('8', '34', '2', '10142', '3012', '0'), +('8', '34', '2', '10143', '2853', '0'), +('8', '34', '3', '27720', '3503', '0'), +('8', '34', '3', '2711', '2147', '0'), +('8', '34', '3', '71529', '2027', '0'), +('8', '34', '3', '4505', '1330', '0'), +('8', '34', '5', '27723', '4291', '0'), +('8', '34', '5', '14703', '3850', '0'), +('8', '34', '5', '14565', '3687', '0'), +('8', '34', '5', '14700', '2553', '0'), +('8', '34', '8', '11621', '11486', '0'), +('8', '34', '8', '11551', '4827', '0'), +('8', '34', '8', '11603', '4499', '0'), +('8', '34', '8', '1409', '3461', '0'), +('8', '34', '6', '1557', '6760', '0'), +('8', '34', '6', '27721', '2022', '0'), +('8', '34', '6', '4302', '1978', '0'), +('8', '34', '6', '4405', '1870', '0'), +('8', '34', '17', '4832', '6985', '0'), +('8', '34', '17', '4862', '5452', '0'), +('8', '34', '17', '11623', '4375', '0'), +('8', '34', '17', '4154', '4297', '0'), +('8', '34', '7', '4863', '3455', '0'), +('8', '34', '7', '4833', '3443', '0'), +('8', '34', '7', '4343', '2722', '0'), +('8', '34', '7', '4155', '1973', '0'), +('8', '34', '9', '1541', '2833', '0'), +('8', '34', '9', '4834', '2623', '0'), +('8', '34', '9', '4864', '2398', '0'), +('8', '34', '9', '12189', '1961', '0'), +('8', '34', '15', '10366', '3254', '0'), +('8', '34', '15', '14679', '2955', '0'), +('8', '34', '15', '10151', '2700', '0'), +('8', '34', '15', '14678', '2404', '0'), +('8', '34', '20', '11601', '8088', '0'), +('8', '34', '20', '11666', '5897', '0'), +('8', '34', '20', '2920', '4467', '0'), +('8', '34', '20', '1365', '4200', '0'), +('8', '34', '12', '4835', '4832', '0'), +('8', '34', '12', '20655', '4543', '0'), +('8', '34', '12', '11624', '2723', '0'), +('8', '34', '12', '4865', '2665', '0'), +('8', '34', '18', '4836', '3466', '0'), +('8', '34', '18', '4866', '3398', '0'), +('8', '34', '18', '4346', '2621', '0'), +('8', '34', '18', '4158', '2005', '0'), +('8', '34', '19', '4837', '4361', '0'), +('8', '34', '19', '4867', '3343', '0'), +('8', '34', '19', '68239', '3167', '0'), +('8', '34', '19', '4159', '1973', '0'), +('8', '34', '13', '27725', '4279', '0'), +('8', '34', '13', '6952', '3581', '0'), +('8', '34', '13', '11625', '3381', '0'), +('8', '34', '13', '5416', '3308', '0'), +('8', '34', '14', '6952', '3581', '0'), +('8', '34', '14', '11625', '3381', '0'), +('8', '34', '14', '5416', '3308', '0'), +('8', '34', '14', '7257', '3266', '0'), +('8', '34', '11', '9246', '1727', '0'), +('8', '34', '11', '13353', '1500', '0'), +('8', '34', '11', '14762', '1291', '0'), +('8', '34', '11', '20677', '900', '0'), +('8', '35', '22', '10323', '0', '0'), +('8', '35', '22', '10664', '0', '0'), +('8', '35', '22', '9246', '0', '0'), +('8', '35', '22', '21509', '0', '0'), +('8', '35', '1', '14701', '2452', '0'), +('8', '35', '1', '14702', '2050', '0'), +('8', '35', '1', '30361', '1440', '0'), +('8', '35', '1', '10165', '873', '0'), +('8', '35', '2', '4301', '3663', '0'), +('8', '35', '2', '4831', '3503', '0'), +('8', '35', '2', '10142', '3012', '0'), +('8', '35', '2', '10143', '2853', '0'), +('8', '35', '3', '27720', '3515', '0'), +('8', '35', '3', '2711', '2159', '0'), +('8', '35', '3', '71529', '2034', '0'), +('8', '35', '3', '4505', '1347', '0'), +('8', '35', '5', '27723', '4298', '0'), +('8', '35', '5', '14703', '3850', '0'), +('8', '35', '5', '14565', '3694', '0'), +('8', '35', '5', '14700', '2553', '0'), +('8', '35', '8', '11621', '11486', '0'), +('8', '35', '8', '11551', '4827', '0'), +('8', '35', '8', '11603', '4521', '0'), +('8', '35', '8', '1409', '3461', '0'), +('8', '35', '6', '1557', '6760', '0'), +('8', '35', '6', '27721', '2022', '0'), +('8', '35', '6', '4302', '1989', '0'), +('8', '35', '6', '4405', '1870', '0'), +('8', '35', '17', '4832', '7010', '0'), +('8', '35', '17', '4862', '5452', '0'), +('8', '35', '17', '11623', '4375', '0'), +('8', '35', '17', '4154', '4305', '0'), +('8', '35', '7', '4863', '3477', '0'), +('8', '35', '7', '4833', '3443', '0'), +('8', '35', '7', '4343', '2739', '0'), +('8', '35', '7', '4155', '1973', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '35', '9', '1541', '2833', '0'), +('8', '35', '9', '4834', '2623', '0'), +('8', '35', '9', '4864', '2405', '0'), +('8', '35', '9', '12189', '1961', '0'), +('8', '35', '15', '10366', '3254', '0'), +('8', '35', '15', '14679', '2955', '0'), +('8', '35', '15', '10151', '2700', '0'), +('8', '35', '15', '14678', '2404', '0'), +('8', '35', '20', '11601', '8105', '0'), +('8', '35', '20', '11666', '5909', '0'), +('8', '35', '20', '2920', '4467', '0'), +('8', '35', '20', '1365', '4200', '0'), +('8', '35', '12', '4835', '4840', '0'), +('8', '35', '12', '20655', '4551', '0'), +('8', '35', '12', '11624', '2735', '0'), +('8', '35', '12', '4865', '2665', '0'), +('8', '35', '18', '4836', '3474', '0'), +('8', '35', '18', '4866', '3413', '0'), +('8', '35', '18', '4346', '2621', '0'), +('8', '35', '18', '4158', '2005', '0'), +('8', '35', '19', '4837', '4373', '0'), +('8', '35', '19', '4867', '3358', '0'), +('8', '35', '19', '68239', '3175', '0'), +('8', '35', '19', '4159', '1973', '0'), +('8', '35', '13', '27725', '4279', '0'), +('8', '35', '13', '6952', '3581', '0'), +('8', '35', '13', '11625', '3397', '0'), +('8', '35', '13', '5416', '3308', '0'), +('8', '35', '14', '6952', '3581', '0'), +('8', '35', '14', '11625', '3397', '0'), +('8', '35', '14', '5416', '3308', '0'), +('8', '35', '14', '7257', '3266', '0'), +('8', '35', '11', '9246', '1752', '0'), +('8', '35', '11', '13353', '1500', '0'), +('8', '35', '11', '14762', '1291', '0'), +('8', '35', '11', '20677', '900', '0'), +('8', '36', '22', '10323', '0', '0'), +('8', '36', '22', '10664', '0', '0'), +('8', '36', '22', '9246', '0', '0'), +('8', '36', '22', '21509', '0', '0'), +('8', '36', '1', '14701', '2452', '0'), +('8', '36', '1', '14702', '2050', '0'), +('8', '36', '1', '30361', '1440', '0'), +('8', '36', '1', '10165', '873', '0'), +('8', '36', '2', '4301', '3663', '0'), +('8', '36', '2', '4831', '3515', '0'), +('8', '36', '2', '10142', '3012', '0'), +('8', '36', '2', '10143', '2853', '0'), +('8', '36', '3', '27720', '3527', '0'), +('8', '36', '3', '2711', '2171', '0'), +('8', '36', '3', '71529', '2040', '0'), +('8', '36', '3', '4505', '1364', '0'), +('8', '36', '5', '27723', '4305', '0'), +('8', '36', '5', '14703', '3850', '0'), +('8', '36', '5', '14565', '3701', '0'), +('8', '36', '5', '14700', '2553', '0'), +('8', '36', '8', '11621', '11486', '0'), +('8', '36', '8', '11551', '4827', '0'), +('8', '36', '8', '11603', '4543', '0'), +('8', '36', '8', '1409', '3461', '0'), +('8', '36', '6', '1557', '6760', '0'), +('8', '36', '6', '27721', '2022', '0'), +('8', '36', '6', '4302', '1999', '0'), +('8', '36', '6', '4405', '1870', '0'), +('8', '36', '17', '4832', '7035', '0'), +('8', '36', '17', '4862', '5452', '0'), +('8', '36', '17', '11623', '4375', '0'), +('8', '36', '17', '4154', '4314', '0'), +('8', '36', '7', '4863', '3499', '0'), +('8', '36', '7', '4833', '3443', '0'), +('8', '36', '7', '4343', '2756', '0'), +('8', '36', '7', '4155', '1973', '0'), +('8', '36', '9', '1541', '2833', '0'), +('8', '36', '9', '4834', '2623', '0'), +('8', '36', '9', '4864', '2413', '0'), +('8', '36', '9', '12189', '1961', '0'), +('8', '36', '15', '10366', '3254', '0'), +('8', '36', '15', '14679', '2955', '0'), +('8', '36', '15', '10151', '2700', '0'), +('8', '36', '15', '14678', '2404', '0'), +('8', '36', '20', '11601', '8122', '0'), +('8', '36', '20', '11666', '5921', '0'), +('8', '36', '20', '2920', '4467', '0'), +('8', '36', '20', '1365', '4200', '0'), +('8', '36', '12', '4835', '4848', '0'), +('8', '36', '12', '20655', '4560', '0'), +('8', '36', '12', '11624', '2747', '0'), +('8', '36', '12', '4865', '2665', '0'), +('8', '36', '18', '4836', '3483', '0'), +('8', '36', '18', '4866', '3428', '0'), +('8', '36', '18', '4346', '2621', '0'), +('8', '36', '18', '4158', '2005', '0'), +('8', '36', '19', '4837', '4385', '0'), +('8', '36', '19', '4867', '3374', '0'), +('8', '36', '19', '68239', '3182', '0'), +('8', '36', '19', '4159', '1973', '0'), +('8', '36', '13', '27725', '4279', '0'), +('8', '36', '13', '6952', '3581', '0'), +('8', '36', '13', '11625', '3412', '0'), +('8', '36', '13', '5416', '3308', '0'), +('8', '36', '14', '6952', '3581', '0'), +('8', '36', '14', '11625', '3412', '0'), +('8', '36', '14', '5416', '3308', '0'), +('8', '36', '14', '7257', '3266', '0'), +('8', '36', '11', '9246', '1776', '0'), +('8', '36', '11', '13353', '1500', '0'), +('8', '36', '11', '14762', '1291', '0'), +('8', '36', '11', '20677', '900', '0'), +('8', '37', '22', '10323', '0', '0'), +('8', '37', '22', '10664', '0', '0'), +('8', '37', '22', '9246', '0', '0'), +('8', '37', '22', '21509', '0', '0'), +('8', '37', '1', '14701', '2452', '0'), +('8', '37', '1', '14702', '2050', '0'), +('8', '37', '1', '30361', '1440', '0'), +('8', '37', '1', '10165', '873', '0'), +('8', '37', '2', '4301', '3663', '0'), +('8', '37', '2', '4831', '3527', '0'), +('8', '37', '2', '10142', '3012', '0'), +('8', '37', '2', '10143', '2853', '0'), +('8', '37', '3', '27720', '3540', '0'), +('8', '37', '3', '2711', '2184', '0'), +('8', '37', '3', '71529', '2047', '0'), +('8', '37', '3', '4505', '1381', '0'), +('8', '37', '5', '27723', '4312', '0'), +('8', '37', '5', '14703', '3850', '0'), +('8', '37', '5', '14565', '3708', '0'), +('8', '37', '5', '14700', '2553', '0'), +('8', '37', '8', '11621', '11486', '0'), +('8', '37', '8', '11551', '4827', '0'), +('8', '37', '8', '11603', '4565', '0'), +('8', '37', '8', '1409', '3461', '0'), +('8', '37', '6', '1557', '6760', '0'), +('8', '37', '6', '27721', '2022', '0'), +('8', '37', '6', '4302', '2009', '0'), +('8', '37', '6', '4405', '1870', '0'), +('8', '37', '17', '4832', '7061', '0'), +('8', '37', '17', '4862', '5452', '0'), +('8', '37', '17', '11623', '4375', '0'), +('8', '37', '17', '4154', '4322', '0'), +('8', '37', '7', '4863', '3521', '0'), +('8', '37', '7', '4833', '3443', '0'), +('8', '37', '7', '4343', '2773', '0'), +('8', '37', '7', '4155', '1973', '0'), +('8', '37', '9', '1541', '2833', '0'), +('8', '37', '9', '4834', '2623', '0'), +('8', '37', '9', '4864', '2420', '0'), +('8', '37', '9', '12189', '1961', '0'), +('8', '37', '15', '10366', '3254', '0'), +('8', '37', '15', '14679', '2955', '0'), +('8', '37', '15', '10151', '2700', '0'), +('8', '37', '15', '14678', '2404', '0'), +('8', '37', '20', '11601', '8139', '0'), +('8', '37', '20', '11666', '5933', '0'), +('8', '37', '20', '2920', '4467', '0'), +('8', '37', '20', '1365', '4200', '0'), +('8', '37', '12', '4835', '4857', '0'), +('8', '37', '12', '20655', '4568', '0'), +('8', '37', '12', '11624', '2759', '0'), +('8', '37', '12', '4865', '2665', '0'), +('8', '37', '18', '4836', '3491', '0'), +('8', '37', '18', '4866', '3443', '0'), +('8', '37', '18', '4346', '2621', '0'), +('8', '37', '18', '4158', '2005', '0'), +('8', '37', '19', '4837', '4397', '0'), +('8', '37', '19', '4867', '3389', '0'), +('8', '37', '19', '68239', '3189', '0'), +('8', '37', '19', '4159', '1973', '0'), +('8', '37', '13', '27725', '4279', '0'), +('8', '37', '13', '6952', '3581', '0'), +('8', '37', '13', '11625', '3427', '0'), +('8', '37', '13', '5416', '3308', '0'), +('8', '37', '14', '6952', '3581', '0'), +('8', '37', '14', '11625', '3427', '0'), +('8', '37', '14', '5416', '3308', '0'), +('8', '37', '14', '5500', '3294', '0'), +('8', '37', '11', '9246', '1800', '0'), +('8', '37', '11', '13353', '1500', '0'), +('8', '37', '11', '14762', '1291', '0'), +('8', '37', '11', '20677', '900', '0'), +('8', '38', '22', '10323', '0', '0'), +('8', '38', '22', '10664', '0', '0'), +('8', '38', '22', '9246', '0', '0'), +('8', '38', '22', '21509', '0', '0'), +('8', '38', '1', '14701', '2452', '0'), +('8', '38', '1', '14702', '2050', '0'), +('8', '38', '1', '30361', '1440', '0'), +('8', '38', '1', '10165', '873', '0'), +('8', '38', '2', '4301', '3663', '0'), +('8', '38', '2', '4831', '3539', '0'), +('8', '38', '2', '10142', '3012', '0'), +('8', '38', '2', '10143', '2853', '0'), +('8', '38', '3', '27720', '3552', '0'), +('8', '38', '3', '2711', '2196', '0'), +('8', '38', '3', '71529', '2054', '0'), +('8', '38', '3', '4505', '1398', '0'), +('8', '38', '5', '27723', '4319', '0'), +('8', '38', '5', '14703', '3850', '0'), +('8', '38', '5', '14565', '3715', '0'), +('8', '38', '5', '14700', '2553', '0'), +('8', '38', '8', '11621', '11486', '0'), +('8', '38', '8', '11551', '4827', '0'), +('8', '38', '8', '11603', '4586', '0'), +('8', '38', '8', '1409', '3461', '0'), +('8', '38', '6', '1557', '6760', '0'), +('8', '38', '6', '27721', '2022', '0'), +('8', '38', '6', '4302', '2019', '0'), +('8', '38', '6', '4405', '1870', '0'), +('8', '38', '17', '4832', '7086', '0'), +('8', '38', '17', '4862', '5452', '0'), +('8', '38', '17', '11623', '4375', '0'), +('8', '38', '17', '4154', '4330', '0'), +('8', '38', '7', '4863', '3542', '0'), +('8', '38', '7', '4833', '3443', '0'), +('8', '38', '7', '4343', '2790', '0'), +('8', '38', '7', '4155', '1973', '0'), +('8', '38', '9', '1541', '2833', '0'), +('8', '38', '9', '4834', '2623', '0'), +('8', '38', '9', '4864', '2427', '0'), +('8', '38', '9', '12189', '1961', '0'), +('8', '38', '15', '10366', '3254', '0'), +('8', '38', '15', '14679', '2955', '0'), +('8', '38', '15', '10151', '2700', '0'), +('8', '38', '15', '14678', '2404', '0'), +('8', '38', '20', '11601', '8156', '0'), +('8', '38', '20', '11666', '5945', '0'), +('8', '38', '20', '2920', '4467', '0'), +('8', '38', '20', '1365', '4200', '0'), +('8', '38', '12', '4835', '4865', '0'), +('8', '38', '12', '20655', '4576', '0'), +('8', '38', '12', '11624', '2771', '0'), +('8', '38', '12', '4865', '2665', '0'), +('8', '38', '18', '4836', '3500', '0'), +('8', '38', '18', '4866', '3458', '0'), +('8', '38', '18', '4346', '2621', '0'), +('8', '38', '18', '4158', '2005', '0'), +('8', '38', '19', '4837', '4409', '0'), +('8', '38', '19', '4867', '3404', '0'), +('8', '38', '19', '68239', '3196', '0'), +('8', '38', '19', '4159', '1973', '0'), +('8', '38', '13', '27725', '4279', '0'), +('8', '38', '13', '6952', '3581', '0'), +('8', '38', '13', '11625', '3442', '0'), +('8', '38', '13', '5416', '3308', '0'), +('8', '38', '14', '6952', '3581', '0'), +('8', '38', '14', '11625', '3442', '0'), +('8', '38', '14', '5416', '3308', '0'), +('8', '38', '14', '5500', '3294', '0'), +('8', '38', '11', '9246', '1824', '0'), +('8', '38', '11', '13353', '1500', '0'), +('8', '38', '11', '14762', '1291', '0'), +('8', '38', '11', '20677', '900', '0'), +('8', '39', '22', '10323', '0', '0'), +('8', '39', '22', '10664', '0', '0'), +('8', '39', '22', '9246', '0', '0'), +('8', '39', '22', '21509', '0', '0'), +('8', '39', '1', '14701', '2452', '0'), +('8', '39', '1', '14702', '2050', '0'), +('8', '39', '1', '30361', '1440', '0'), +('8', '39', '1', '10165', '873', '0'), +('8', '39', '2', '4301', '3663', '0'), +('8', '39', '2', '4831', '3552', '0'), +('8', '39', '2', '10142', '3012', '0'), +('8', '39', '2', '10143', '2853', '0'), +('8', '39', '3', '27720', '3564', '0'), +('8', '39', '3', '2711', '2208', '0'), +('8', '39', '3', '71529', '2061', '0'), +('8', '39', '3', '4505', '1415', '0'), +('8', '39', '5', '27723', '4325', '0'), +('8', '39', '5', '14703', '3850', '0'), +('8', '39', '5', '14565', '3721', '0'), +('8', '39', '5', '14700', '2553', '0'), +('8', '39', '8', '11621', '11486', '0'), +('8', '39', '8', '11551', '4827', '0'), +('8', '39', '8', '11603', '4608', '0'), +('8', '39', '8', '1409', '3461', '0'), +('8', '39', '6', '1557', '6760', '0'), +('8', '39', '6', '4302', '2029', '0'), +('8', '39', '6', '27721', '2022', '0'), +('8', '39', '6', '4405', '1870', '0'), +('8', '39', '17', '4832', '7111', '0'), +('8', '39', '17', '4862', '5452', '0'), +('8', '39', '17', '11623', '4375', '0'), +('8', '39', '17', '4154', '4339', '0'), +('8', '39', '7', '4863', '3564', '0'), +('8', '39', '7', '4833', '3443', '0'), +('8', '39', '7', '4343', '2807', '0'), +('8', '39', '7', '4155', '1973', '0'), +('8', '39', '9', '1541', '2833', '0'), +('8', '39', '9', '4834', '2623', '0'), +('8', '39', '9', '4864', '2434', '0'), +('8', '39', '9', '12189', '1961', '0'), +('8', '39', '15', '10366', '3254', '0'), +('8', '39', '15', '14679', '2955', '0'), +('8', '39', '15', '10151', '2700', '0'), +('8', '39', '15', '14678', '2404', '0'), +('8', '39', '20', '11601', '8173', '0'), +('8', '39', '20', '11666', '5956', '0'), +('8', '39', '20', '2920', '4467', '0'), +('8', '39', '20', '1365', '4200', '0'), +('8', '39', '12', '4835', '4874', '0'), +('8', '39', '12', '20655', '4584', '0'), +('8', '39', '12', '11624', '2782', '0'), +('8', '39', '12', '4865', '2665', '0'), +('8', '39', '18', '4836', '3508', '0'), +('8', '39', '18', '4866', '3474', '0'), +('8', '39', '18', '4346', '2621', '0'), +('8', '39', '18', '4158', '2005', '0'), +('8', '39', '19', '4837', '4421', '0'), +('8', '39', '19', '4867', '3419', '0'), +('8', '39', '19', '68239', '3204', '0'), +('8', '39', '19', '4159', '1973', '0'), +('8', '39', '13', '27725', '4279', '0'), +('8', '39', '13', '6952', '3581', '0'), +('8', '39', '13', '11625', '3457', '0'), +('8', '39', '13', '5416', '3308', '0'), +('8', '39', '14', '6952', '3581', '0'), +('8', '39', '14', '11625', '3457', '0'), +('8', '39', '14', '5416', '3308', '0'), +('8', '39', '14', '5500', '3294', '0'), +('8', '39', '11', '9246', '1848', '0'), +('8', '39', '11', '13353', '1500', '0'), +('8', '39', '11', '14762', '1291', '0'), +('8', '39', '11', '20677', '900', '0'), +('8', '40', '22', '10323', '0', '0'), +('8', '40', '22', '10664', '0', '0'), +('8', '40', '22', '9246', '0', '0'), +('8', '40', '22', '21509', '0', '0'), +('8', '40', '1', '14701', '2452', '0'), +('8', '40', '1', '14702', '2050', '0'), +('8', '40', '1', '30361', '1440', '0'), +('8', '40', '1', '10165', '873', '0'), +('8', '40', '2', '4301', '3663', '0'), +('8', '40', '2', '4831', '3564', '0'), +('8', '40', '2', '10142', '3012', '0'), +('8', '40', '2', '10143', '2853', '0'), +('8', '40', '3', '27720', '3577', '0'), +('8', '40', '3', '2711', '2221', '0'), +('8', '40', '3', '71529', '2068', '0'), +('8', '40', '3', '11052', '1450', '0'), +('8', '40', '5', '27723', '4332', '0'), +('8', '40', '5', '14703', '3850', '0'), +('8', '40', '5', '14565', '3728', '0'), +('8', '40', '5', '14700', '2553', '0'), +('8', '40', '8', '11621', '11486', '0'), +('8', '40', '8', '11551', '4827', '0'), +('8', '40', '8', '11603', '4630', '0'), +('8', '40', '8', '1409', '3461', '0'), +('8', '40', '6', '1557', '6760', '0'), +('8', '40', '6', '4302', '2039', '0'), +('8', '40', '6', '27721', '2022', '0'), +('8', '40', '6', '4405', '1870', '0'), +('8', '40', '17', '4832', '7137', '0'), +('8', '40', '17', '4862', '5452', '0'), +('8', '40', '17', '11623', '4375', '0'), +('8', '40', '17', '4154', '4347', '0'), +('8', '40', '7', '4863', '3586', '0'), +('8', '40', '7', '4833', '3443', '0'), +('8', '40', '7', '4343', '2824', '0'), +('8', '40', '7', '4155', '1973', '0'), +('8', '40', '9', '1541', '2833', '0'), +('8', '40', '9', '4834', '2623', '0'), +('8', '40', '9', '4864', '2442', '0'), +('8', '40', '9', '12189', '1961', '0'), +('8', '40', '15', '10366', '3254', '0'), +('8', '40', '15', '14679', '2955', '0'), +('8', '40', '15', '10151', '2700', '0'), +('8', '40', '15', '14678', '2404', '0'), +('8', '40', '20', '11601', '8190', '0'), +('8', '40', '20', '11666', '5968', '0'), +('8', '40', '20', '2920', '4467', '0'), +('8', '40', '20', '1365', '4200', '0'), +('8', '40', '12', '4835', '4882', '0'), +('8', '40', '12', '20655', '4592', '0'), +('8', '40', '12', '11624', '2794', '0'), +('8', '40', '12', '4865', '2665', '0'), +('8', '40', '18', '4836', '3516', '0'), +('8', '40', '18', '4866', '3489', '0'), +('8', '40', '18', '4346', '2621', '0'), +('8', '40', '18', '4158', '2005', '0'), +('8', '40', '19', '4837', '4433', '0'), +('8', '40', '19', '4867', '3435', '0'), +('8', '40', '19', '68239', '3211', '0'), +('8', '40', '19', '4159', '1973', '0'), +('8', '40', '13', '27725', '4279', '0'), +('8', '40', '13', '6952', '3581', '0'), +('8', '40', '13', '11625', '3473', '0'), +('8', '40', '13', '5416', '3308', '0'), +('8', '40', '14', '6952', '3581', '0'), +('8', '40', '14', '11625', '3473', '0'), +('8', '40', '14', '5416', '3308', '0'), +('8', '40', '14', '5500', '3294', '0'), +('8', '40', '11', '9246', '1872', '0'), +('8', '40', '11', '13353', '1500', '0'), +('8', '40', '11', '14762', '1291', '0'), +('8', '40', '11', '20677', '900', '0'), +('8', '41', '22', '10323', '0', '0'), +('8', '41', '22', '10664', '0', '0'), +('8', '41', '22', '9246', '0', '0'), +('8', '41', '22', '21509', '0', '0'), +('8', '41', '1', '14701', '2452', '0'), +('8', '41', '1', '14702', '2050', '0'), +('8', '41', '1', '30361', '1440', '0'), +('8', '41', '1', '10165', '873', '0'), +('8', '41', '2', '4301', '3663', '0'), +('8', '41', '2', '4831', '3576', '0'), +('8', '41', '2', '10142', '3012', '0'), +('8', '41', '2', '10143', '2853', '0'), +('8', '41', '3', '27720', '3589', '0'), +('8', '41', '3', '2711', '2233', '0'), +('8', '41', '3', '71529', '2074', '0'), +('8', '41', '3', '11052', '1486', '0'), +('8', '41', '5', '27723', '4339', '0'), +('8', '41', '5', '14703', '3850', '0'), +('8', '41', '5', '14565', '3735', '0'), +('8', '41', '5', '14700', '2553', '0'), +('8', '41', '8', '11621', '11486', '0'), +('8', '41', '8', '11551', '4827', '0'), +('8', '41', '8', '11603', '4652', '0'), +('8', '41', '8', '1409', '3461', '0'), +('8', '41', '6', '1557', '6760', '0'), +('8', '41', '6', '4302', '2049', '0'), +('8', '41', '6', '27721', '2022', '0'), +('8', '41', '6', '4405', '1870', '0'), +('8', '41', '17', '4832', '7162', '0'), +('8', '41', '17', '4862', '5452', '0'), +('8', '41', '17', '11623', '4375', '0'), +('8', '41', '17', '4154', '4356', '0'), +('8', '41', '7', '4863', '3608', '0'), +('8', '41', '7', '4833', '3443', '0'), +('8', '41', '7', '4343', '2841', '0'), +('8', '41', '7', '4155', '1973', '0'), +('8', '41', '9', '1541', '2833', '0'), +('8', '41', '9', '4834', '2623', '0'), +('8', '41', '9', '4864', '2449', '0'), +('8', '41', '9', '12189', '1961', '0'), +('8', '41', '15', '10366', '3254', '0'), +('8', '41', '15', '14679', '2955', '0'), +('8', '41', '15', '10151', '2700', '0'), +('8', '41', '15', '14678', '2404', '0'), +('8', '41', '20', '11601', '8206', '0'), +('8', '41', '20', '11666', '5980', '0'), +('8', '41', '20', '2920', '4467', '0'), +('8', '41', '20', '1365', '4200', '0'), +('8', '41', '12', '4835', '4891', '0'), +('8', '41', '12', '20655', '4601', '0'), +('8', '41', '12', '11624', '2806', '0'), +('8', '41', '12', '4865', '2665', '0'), +('8', '41', '18', '4836', '3525', '0'), +('8', '41', '18', '4866', '3504', '0'), +('8', '41', '18', '4346', '2621', '0'), +('8', '41', '18', '4158', '2005', '0'), +('8', '41', '19', '4837', '4445', '0'), +('8', '41', '19', '4867', '3450', '0'), +('8', '41', '19', '68239', '3218', '0'), +('8', '41', '19', '4159', '1973', '0'), +('8', '41', '13', '27725', '4279', '0'), +('8', '41', '13', '6952', '3581', '0'), +('8', '41', '13', '11625', '3488', '0'), +('8', '41', '13', '5416', '3308', '0'), +('8', '41', '14', '6952', '3581', '0'), +('8', '41', '14', '11625', '3488', '0'), +('8', '41', '14', '5416', '3308', '0'), +('8', '41', '14', '5500', '3294', '0'), +('8', '41', '11', '9246', '1897', '0'), +('8', '41', '11', '13353', '1500', '0'), +('8', '41', '11', '14762', '1291', '0'), +('8', '41', '11', '20677', '900', '0'), +('8', '42', '22', '10323', '0', '0'), +('8', '42', '22', '10664', '0', '0'), +('8', '42', '22', '9246', '0', '0'), +('8', '42', '22', '21509', '0', '0'), +('8', '42', '1', '14701', '2452', '0'), +('8', '42', '1', '14702', '2050', '0'), +('8', '42', '1', '30361', '1440', '0'), +('8', '42', '1', '10165', '873', '0'), +('8', '42', '2', '4301', '3663', '0'), +('8', '42', '2', '4831', '3588', '0'), +('8', '42', '2', '10142', '3012', '0'), +('8', '42', '2', '10143', '2853', '0'), +('8', '42', '3', '27720', '3602', '0'), +('8', '42', '3', '2711', '2246', '0'), +('8', '42', '3', '71529', '2082', '0'), +('8', '42', '3', '11052', '1522', '0'), +('8', '42', '5', '27723', '4347', '0'), +('8', '42', '5', '14703', '3850', '0'), +('8', '42', '5', '14565', '3743', '0'), +('8', '42', '5', '14700', '2553', '0'), +('8', '42', '8', '11621', '11486', '0'), +('8', '42', '8', '11551', '4827', '0'), +('8', '42', '8', '11603', '4673', '0'), +('8', '42', '8', '1409', '3461', '0'), +('8', '42', '6', '1557', '6760', '0'), +('8', '42', '6', '4302', '2061', '0'), +('8', '42', '6', '27721', '2022', '0'), +('8', '42', '6', '4405', '1870', '0'), +('8', '42', '17', '4832', '7191', '0'), +('8', '42', '17', '4862', '5452', '0'), +('8', '42', '17', '11623', '4375', '0'), +('8', '42', '17', '4154', '4365', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '42', '7', '4863', '3629', '0'), +('8', '42', '7', '4833', '3443', '0'), +('8', '42', '7', '4343', '2860', '0'), +('8', '42', '7', '4155', '1973', '0'), +('8', '42', '9', '1541', '2833', '0'), +('8', '42', '9', '4834', '2623', '0'), +('8', '42', '9', '4864', '2456', '0'), +('8', '42', '9', '12189', '1961', '0'), +('8', '42', '15', '10366', '3254', '0'), +('8', '42', '15', '14679', '2955', '0'), +('8', '42', '15', '10151', '2700', '0'), +('8', '42', '15', '14678', '2404', '0'), +('8', '42', '20', '11601', '8226', '0'), +('8', '42', '20', '11666', '5994', '0'), +('8', '42', '20', '2920', '4467', '0'), +('8', '42', '20', '1365', '4200', '0'), +('8', '42', '12', '4835', '4900', '0'), +('8', '42', '12', '20655', '4609', '0'), +('8', '42', '12', '11624', '2820', '0'), +('8', '42', '12', '4865', '2665', '0'), +('8', '42', '18', '4836', '3535', '0'), +('8', '42', '18', '4866', '3521', '0'), +('8', '42', '18', '4346', '2621', '0'), +('8', '42', '18', '4158', '2005', '0'), +('8', '42', '19', '4837', '4458', '0'), +('8', '42', '19', '4867', '3467', '0'), +('8', '42', '19', '68239', '3225', '0'), +('8', '42', '19', '4159', '1973', '0'), +('8', '42', '13', '27725', '4279', '0'), +('8', '42', '13', '6952', '3581', '0'), +('8', '42', '13', '11625', '3505', '0'), +('8', '42', '13', '5416', '3308', '0'), +('8', '42', '14', '6952', '3581', '0'), +('8', '42', '14', '11625', '3505', '0'), +('8', '42', '14', '5416', '3308', '0'), +('8', '42', '14', '5500', '3294', '0'), +('8', '42', '11', '9246', '1921', '0'), +('8', '42', '11', '13353', '1500', '0'), +('8', '42', '11', '14762', '1291', '0'), +('8', '42', '11', '20677', '900', '0'), +('8', '43', '22', '10323', '0', '0'), +('8', '43', '22', '10664', '0', '0'), +('8', '43', '22', '9246', '0', '0'), +('8', '43', '22', '21509', '0', '0'), +('8', '43', '1', '14701', '2452', '0'), +('8', '43', '1', '14702', '2050', '0'), +('8', '43', '1', '30361', '1440', '0'), +('8', '43', '1', '10165', '873', '0'), +('8', '43', '2', '4301', '3663', '0'), +('8', '43', '2', '4831', '3600', '0'), +('8', '43', '2', '10142', '3012', '0'), +('8', '43', '2', '10143', '2853', '0'), +('8', '43', '3', '27720', '3614', '0'), +('8', '43', '3', '2711', '2258', '0'), +('8', '43', '3', '71529', '2089', '0'), +('8', '43', '3', '11052', '1558', '0'), +('8', '43', '5', '27723', '4353', '0'), +('8', '43', '5', '14703', '3850', '0'), +('8', '43', '5', '14565', '3749', '0'), +('8', '43', '5', '14700', '2553', '0'), +('8', '43', '8', '11621', '11486', '0'), +('8', '43', '8', '11551', '4827', '0'), +('8', '43', '8', '11603', '4695', '0'), +('8', '43', '8', '1409', '3461', '0'), +('8', '43', '6', '1557', '6760', '0'), +('8', '43', '6', '4302', '2071', '0'), +('8', '43', '6', '27721', '2022', '0'), +('8', '43', '6', '4405', '1870', '0'), +('8', '43', '17', '4832', '7217', '0'), +('8', '43', '17', '4862', '5452', '0'), +('8', '43', '17', '11623', '4375', '0'), +('8', '43', '17', '4154', '4374', '0'), +('8', '43', '7', '4863', '3651', '0'), +('8', '43', '7', '4833', '3443', '0'), +('8', '43', '7', '4343', '2877', '0'), +('8', '43', '7', '4155', '1973', '0'), +('8', '43', '9', '1541', '2833', '0'), +('8', '43', '9', '4834', '2623', '0'), +('8', '43', '9', '4864', '2463', '0'), +('8', '43', '9', '12189', '1961', '0'), +('8', '43', '15', '10366', '3254', '0'), +('8', '43', '15', '14679', '2955', '0'), +('8', '43', '15', '10151', '2700', '0'), +('8', '43', '15', '14678', '2404', '0'), +('8', '43', '20', '11601', '8243', '0'), +('8', '43', '20', '11666', '6005', '0'), +('8', '43', '20', '2920', '4467', '0'), +('8', '43', '20', '1365', '4200', '0'), +('8', '43', '12', '4835', '4909', '0'), +('8', '43', '12', '20655', '4618', '0'), +('8', '43', '12', '11624', '2831', '0'), +('8', '43', '12', '4865', '2665', '0'), +('8', '43', '18', '4836', '3543', '0'), +('8', '43', '18', '4866', '3537', '0'), +('8', '43', '18', '4346', '2621', '0'), +('8', '43', '18', '4158', '2005', '0'), +('8', '43', '19', '4837', '4470', '0'), +('8', '43', '19', '4867', '3482', '0'), +('8', '43', '19', '68239', '3233', '0'), +('8', '43', '19', '4159', '1973', '0'), +('8', '43', '13', '27725', '4279', '0'), +('8', '43', '13', '6952', '3581', '0'), +('8', '43', '13', '11625', '3520', '0'), +('8', '43', '13', '5416', '3308', '0'), +('8', '43', '14', '6952', '3581', '0'), +('8', '43', '14', '11625', '3520', '0'), +('8', '43', '14', '5416', '3308', '0'), +('8', '43', '14', '5500', '3294', '0'), +('8', '43', '11', '9246', '1945', '0'), +('8', '43', '11', '13353', '1500', '0'), +('8', '43', '11', '14762', '1291', '0'), +('8', '43', '11', '20677', '900', '0'), +('8', '44', '22', '10323', '0', '0'), +('8', '44', '22', '10664', '0', '0'), +('8', '44', '22', '9246', '0', '0'), +('8', '44', '22', '21509', '0', '0'), +('8', '44', '1', '14701', '2452', '0'), +('8', '44', '1', '14702', '2050', '0'), +('8', '44', '1', '30361', '1440', '0'), +('8', '44', '1', '10165', '873', '0'), +('8', '44', '2', '4301', '3663', '0'), +('8', '44', '2', '4831', '3612', '0'), +('8', '44', '2', '10142', '3012', '0'), +('8', '44', '2', '10143', '2853', '0'), +('8', '44', '3', '27720', '3627', '0'), +('8', '44', '3', '2711', '2271', '0'), +('8', '44', '3', '71529', '2096', '0'), +('8', '44', '3', '11052', '1595', '0'), +('8', '44', '5', '27723', '4360', '0'), +('8', '44', '5', '14703', '3850', '0'), +('8', '44', '5', '14565', '3756', '0'), +('8', '44', '5', '68291', '2561', '0'), +('8', '44', '8', '11621', '11486', '0'), +('8', '44', '8', '11551', '4827', '0'), +('8', '44', '8', '11603', '4717', '0'), +('8', '44', '8', '1409', '3461', '0'), +('8', '44', '6', '1557', '6760', '0'), +('8', '44', '6', '4302', '2081', '0'), +('8', '44', '6', '27721', '2022', '0'), +('8', '44', '6', '4405', '1870', '0'), +('8', '44', '17', '4832', '7242', '0'), +('8', '44', '17', '4862', '5452', '0'), +('8', '44', '17', '4154', '4382', '0'), +('8', '44', '17', '11623', '4375', '0'), +('8', '44', '7', '4863', '3673', '0'), +('8', '44', '7', '4833', '3443', '0'), +('8', '44', '7', '4343', '2894', '0'), +('8', '44', '7', '4155', '1973', '0'), +('8', '44', '9', '1541', '2833', '0'), +('8', '44', '9', '4834', '2623', '0'), +('8', '44', '9', '4864', '2471', '0'), +('8', '44', '9', '12189', '1961', '0'), +('8', '44', '15', '10366', '3254', '0'), +('8', '44', '15', '14679', '2955', '0'), +('8', '44', '15', '10151', '2700', '0'), +('8', '44', '15', '14678', '2404', '0'), +('8', '44', '20', '11601', '8260', '0'), +('8', '44', '20', '11666', '6017', '0'), +('8', '44', '20', '2920', '4467', '0'), +('8', '44', '20', '1365', '4200', '0'), +('8', '44', '12', '4835', '4917', '0'), +('8', '44', '12', '20655', '4626', '0'), +('8', '44', '12', '11624', '2843', '0'), +('8', '44', '12', '4865', '2665', '0'), +('8', '44', '18', '4866', '3552', '0'), +('8', '44', '18', '4836', '3552', '0'), +('8', '44', '18', '4346', '2621', '0'), +('8', '44', '18', '4158', '2005', '0'), +('8', '44', '19', '4837', '4482', '0'), +('8', '44', '19', '4867', '3498', '0'), +('8', '44', '19', '68239', '3240', '0'), +('8', '44', '19', '4159', '1973', '0'), +('8', '44', '13', '27725', '4279', '0'), +('8', '44', '13', '6952', '3581', '0'), +('8', '44', '13', '11625', '3536', '0'), +('8', '44', '13', '5416', '3308', '0'), +('8', '44', '14', '6952', '3581', '0'), +('8', '44', '14', '11625', '3536', '0'), +('8', '44', '14', '5416', '3308', '0'), +('8', '44', '14', '5500', '3294', '0'), +('8', '44', '11', '9246', '1969', '0'), +('8', '44', '11', '13353', '1500', '0'), +('8', '44', '11', '14762', '1291', '0'), +('8', '44', '11', '20677', '900', '0'), +('8', '45', '22', '10323', '0', '0'), +('8', '45', '22', '10664', '0', '0'), +('8', '45', '22', '9246', '0', '0'), +('8', '45', '22', '21509', '0', '0'), +('8', '45', '1', '14701', '2452', '0'), +('8', '45', '1', '14702', '2050', '0'), +('8', '45', '1', '30361', '1440', '0'), +('8', '45', '1', '10165', '873', '0'), +('8', '45', '2', '4301', '3663', '0'), +('8', '45', '2', '4831', '3624', '0'), +('8', '45', '2', '10142', '3012', '0'), +('8', '45', '2', '10143', '2853', '0'), +('8', '45', '3', '27720', '3639', '0'), +('8', '45', '3', '2711', '2283', '0'), +('8', '45', '3', '71529', '2102', '0'), +('8', '45', '3', '11052', '1631', '0'), +('8', '45', '5', '27723', '4367', '0'), +('8', '45', '5', '14703', '3850', '0'), +('8', '45', '5', '14565', '3763', '0'), +('8', '45', '5', '68291', '2571', '0'), +('8', '45', '8', '11621', '11486', '0'), +('8', '45', '8', '11551', '4827', '0'), +('8', '45', '8', '11603', '4738', '0'), +('8', '45', '8', '1409', '3461', '0'), +('8', '45', '6', '1557', '6760', '0'), +('8', '45', '6', '4302', '2092', '0'), +('8', '45', '6', '27721', '2022', '0'), +('8', '45', '6', '4405', '1870', '0'), +('8', '45', '17', '4832', '7267', '0'), +('8', '45', '17', '4862', '5452', '0'), +('8', '45', '17', '4154', '4391', '0'), +('8', '45', '17', '11623', '4375', '0'), +('8', '45', '7', '4863', '3694', '0'), +('8', '45', '7', '4833', '3443', '0'), +('8', '45', '7', '4343', '2911', '0'), +('8', '45', '7', '4155', '1973', '0'), +('8', '45', '9', '1541', '2833', '0'), +('8', '45', '9', '4834', '2623', '0'), +('8', '45', '9', '4864', '2478', '0'), +('8', '45', '9', '12189', '1961', '0'), +('8', '45', '15', '10366', '3254', '0'), +('8', '45', '15', '14679', '2955', '0'), +('8', '45', '15', '10151', '2700', '0'), +('8', '45', '15', '14678', '2404', '0'), +('8', '45', '20', '11601', '8277', '0'), +('8', '45', '20', '11666', '6029', '0'), +('8', '45', '20', '2920', '4467', '0'), +('8', '45', '20', '1365', '4200', '0'), +('8', '45', '12', '4835', '4926', '0'), +('8', '45', '12', '20655', '4634', '0'), +('8', '45', '12', '11624', '2855', '0'), +('8', '45', '12', '4865', '2665', '0'), +('8', '45', '18', '4866', '3567', '0'), +('8', '45', '18', '4836', '3560', '0'), +('8', '45', '18', '4346', '2621', '0'), +('8', '45', '18', '4158', '2005', '0'), +('8', '45', '19', '4837', '4494', '0'), +('8', '45', '19', '4867', '3513', '0'), +('8', '45', '19', '68239', '3247', '0'), +('8', '45', '19', '4159', '1973', '0'), +('8', '45', '13', '27725', '4279', '0'), +('8', '45', '13', '6952', '3581', '0'), +('8', '45', '13', '11625', '3551', '0'), +('8', '45', '13', '5416', '3308', '0'), +('8', '45', '14', '6952', '3581', '0'), +('8', '45', '14', '11625', '3551', '0'), +('8', '45', '14', '5416', '3308', '0'), +('8', '45', '14', '5500', '3294', '0'), +('8', '45', '11', '9246', '1993', '0'), +('8', '45', '11', '13353', '1500', '0'), +('8', '45', '11', '14762', '1291', '0'), +('8', '45', '11', '20677', '900', '0'), +('8', '46', '22', '10323', '0', '0'), +('8', '46', '22', '10664', '0', '0'), +('8', '46', '22', '9246', '0', '0'), +('8', '46', '22', '21509', '0', '0'), +('8', '46', '1', '14701', '2452', '0'), +('8', '46', '1', '14702', '2050', '0'), +('8', '46', '1', '30361', '1440', '0'), +('8', '46', '1', '10165', '873', '0'), +('8', '46', '2', '4301', '3663', '0'), +('8', '46', '2', '4831', '3636', '0'), +('8', '46', '2', '10142', '3012', '0'), +('8', '46', '2', '10143', '2853', '0'), +('8', '46', '3', '27720', '3651', '0'), +('8', '46', '3', '2711', '2295', '0'), +('8', '46', '3', '71529', '2109', '0'), +('8', '46', '3', '11052', '1667', '0'), +('8', '46', '5', '27723', '4374', '0'), +('8', '46', '5', '14703', '3850', '0'), +('8', '46', '5', '14565', '3770', '0'), +('8', '46', '5', '68291', '2581', '0'), +('8', '46', '8', '11621', '11486', '0'), +('8', '46', '8', '11551', '4827', '0'), +('8', '46', '8', '11603', '4760', '0'), +('8', '46', '8', '1409', '3461', '0'), +('8', '46', '6', '1557', '6760', '0'), +('8', '46', '6', '4302', '2102', '0'), +('8', '46', '6', '27721', '2022', '0'), +('8', '46', '6', '4405', '1870', '0'), +('8', '46', '17', '4832', '7293', '0'), +('8', '46', '17', '4862', '5452', '0'), +('8', '46', '17', '4154', '4399', '0'), +('8', '46', '17', '11623', '4375', '0'), +('8', '46', '7', '4863', '3716', '0'), +('8', '46', '7', '4833', '3443', '0'), +('8', '46', '7', '4343', '2928', '0'), +('8', '46', '7', '4155', '1973', '0'), +('8', '46', '9', '1541', '2833', '0'), +('8', '46', '9', '4834', '2623', '0'), +('8', '46', '9', '4864', '2485', '0'), +('8', '46', '9', '12189', '1961', '0'), +('8', '46', '15', '10366', '3254', '0'), +('8', '46', '15', '14679', '2955', '0'), +('8', '46', '15', '10151', '2700', '0'), +('8', '46', '15', '14678', '2404', '0'), +('8', '46', '20', '11601', '8293', '0'), +('8', '46', '20', '11666', '6041', '0'), +('8', '46', '20', '2920', '4467', '0'), +('8', '46', '20', '1365', '4200', '0'), +('8', '46', '12', '4835', '4934', '0'), +('8', '46', '12', '20655', '4642', '0'), +('8', '46', '12', '11624', '2867', '0'), +('8', '46', '12', '4345', '2668', '0'), +('8', '46', '18', '4866', '3582', '0'), +('8', '46', '18', '4836', '3568', '0'), +('8', '46', '18', '4346', '2621', '0'), +('8', '46', '18', '4158', '2005', '0'), +('8', '46', '19', '4837', '4506', '0'), +('8', '46', '19', '4867', '3528', '0'), +('8', '46', '19', '68239', '3254', '0'), +('8', '46', '19', '4159', '1973', '0'), +('8', '46', '13', '27725', '4279', '0'), +('8', '46', '13', '6952', '3581', '0'), +('8', '46', '13', '11625', '3566', '0'), +('8', '46', '13', '5416', '3308', '0'), +('8', '46', '14', '6952', '3581', '0'), +('8', '46', '14', '11625', '3566', '0'), +('8', '46', '14', '5416', '3308', '0'), +('8', '46', '14', '5500', '3294', '0'), +('8', '46', '11', '9246', '2017', '0'), +('8', '46', '11', '13353', '1500', '0'), +('8', '46', '11', '14762', '1291', '0'), +('8', '46', '11', '20677', '900', '0'), +('8', '47', '22', '10323', '0', '0'), +('8', '47', '22', '10664', '0', '0'), +('8', '47', '22', '9246', '0', '0'), +('8', '47', '22', '21509', '0', '0'), +('8', '47', '1', '14701', '2452', '0'), +('8', '47', '1', '14702', '2050', '0'), +('8', '47', '1', '30361', '1440', '0'), +('8', '47', '1', '10165', '873', '0'), +('8', '47', '2', '4301', '3663', '0'), +('8', '47', '2', '4831', '3648', '0'), +('8', '47', '2', '10142', '3012', '0'), +('8', '47', '2', '10143', '2853', '0'), +('8', '47', '3', '27720', '3664', '0'), +('8', '47', '3', '2711', '2308', '0'), +('8', '47', '3', '71529', '2116', '0'), +('8', '47', '3', '11052', '1703', '0'), +('8', '47', '5', '27723', '4380', '0'), +('8', '47', '5', '14703', '3850', '0'), +('8', '47', '5', '14565', '3776', '0'), +('8', '47', '5', '68291', '2590', '0'), +('8', '47', '8', '11621', '11486', '0'), +('8', '47', '8', '11551', '4827', '0'), +('8', '47', '8', '11603', '4782', '0'), +('8', '47', '8', '1409', '3461', '0'), +('8', '47', '6', '1557', '6760', '0'), +('8', '47', '6', '4302', '2112', '0'), +('8', '47', '6', '27721', '2022', '0'), +('8', '47', '6', '4405', '1870', '0'), +('8', '47', '17', '4832', '7318', '0'), +('8', '47', '17', '4862', '5452', '0'), +('8', '47', '17', '4154', '4408', '0'), +('8', '47', '17', '11623', '4375', '0'), +('8', '47', '7', '4863', '3738', '0'), +('8', '47', '7', '4833', '3443', '0'), +('8', '47', '7', '4343', '2945', '0'), +('8', '47', '7', '4155', '1973', '0'), +('8', '47', '9', '1541', '2833', '0'), +('8', '47', '9', '4834', '2623', '0'), +('8', '47', '9', '4864', '2492', '0'), +('8', '47', '9', '12189', '1961', '0'), +('8', '47', '15', '10366', '3254', '0'), +('8', '47', '15', '14679', '2955', '0'), +('8', '47', '15', '10151', '2700', '0'), +('8', '47', '15', '14678', '2404', '0'), +('8', '47', '20', '11601', '8310', '0'), +('8', '47', '20', '11666', '6053', '0'), +('8', '47', '20', '2920', '4467', '0'), +('8', '47', '20', '1365', '4200', '0'), +('8', '47', '12', '4835', '4943', '0'), +('8', '47', '12', '20655', '4650', '0'), +('8', '47', '12', '11624', '2879', '0'), +('8', '47', '12', '4345', '2680', '0'), +('8', '47', '18', '4866', '3598', '0'), +('8', '47', '18', '4836', '3577', '0'), +('8', '47', '18', '4346', '2621', '0'), +('8', '47', '18', '4158', '2005', '0'), +('8', '47', '19', '4837', '4518', '0'), +('8', '47', '19', '4867', '3543', '0'), +('8', '47', '19', '68239', '3262', '0'), +('8', '47', '19', '4159', '1973', '0'), +('8', '47', '13', '27725', '4279', '0'), +('8', '47', '13', '6952', '3581', '0'), +('8', '47', '13', '11625', '3581', '0'), +('8', '47', '13', '5416', '3308', '0'), +('8', '47', '14', '11625', '3581', '0'), +('8', '47', '14', '6952', '3581', '0'), +('8', '47', '14', '5416', '3308', '0'), +('8', '47', '14', '5500', '3294', '0'), +('8', '47', '11', '9246', '2042', '0'), +('8', '47', '11', '13353', '1500', '0'), +('8', '47', '11', '14762', '1291', '0'), +('8', '47', '11', '20677', '900', '0'), +('8', '48', '22', '10323', '0', '0'), +('8', '48', '22', '10664', '0', '0'), +('8', '48', '22', '9246', '0', '0'), +('8', '48', '22', '21509', '0', '0'), +('8', '48', '1', '14701', '2452', '0'), +('8', '48', '1', '14702', '2050', '0'), +('8', '48', '1', '30361', '1440', '0'), +('8', '48', '1', '10165', '873', '0'), +('8', '48', '2', '4301', '3663', '0'), +('8', '48', '2', '4831', '3660', '0'), +('8', '48', '2', '10142', '3012', '0'), +('8', '48', '2', '10143', '2853', '0'), +('8', '48', '3', '27720', '3677', '0'), +('8', '48', '3', '2711', '2321', '0'), +('8', '48', '3', '71529', '2124', '0'), +('8', '48', '3', '11052', '1740', '0'), +('8', '48', '5', '27723', '4388', '0'), +('8', '48', '5', '14703', '3850', '0'), +('8', '48', '5', '14565', '3784', '0'), +('8', '48', '5', '68291', '2600', '0'), +('8', '48', '8', '11621', '11486', '0'), +('8', '48', '8', '11551', '4827', '0'), +('8', '48', '8', '11603', '4804', '0'), +('8', '48', '8', '1409', '3461', '0'), +('8', '48', '6', '1557', '6760', '0'), +('8', '48', '6', '4302', '2123', '0'), +('8', '48', '6', '27721', '2022', '0'), +('8', '48', '6', '4405', '1870', '0'), +('8', '48', '17', '4832', '7347', '0'), +('8', '48', '17', '4862', '5452', '0'), +('8', '48', '17', '4154', '4417', '0'), +('8', '48', '17', '11623', '4375', '0'), +('8', '48', '7', '4863', '3760', '0'), +('8', '48', '7', '4833', '3443', '0'), +('8', '48', '7', '4343', '2964', '0'), +('8', '48', '7', '4155', '1973', '0'), +('8', '48', '9', '1541', '2833', '0'), +('8', '48', '9', '4834', '2623', '0'), +('8', '48', '9', '4864', '2500', '0'), +('8', '48', '9', '12189', '1961', '0'), +('8', '48', '15', '10366', '3254', '0'), +('8', '48', '15', '14679', '2955', '0'), +('8', '48', '15', '10151', '2700', '0'), +('8', '48', '15', '14678', '2404', '0'), +('8', '48', '20', '11601', '8330', '0'), +('8', '48', '20', '11666', '6066', '0'), +('8', '48', '20', '2920', '4467', '0'), +('8', '48', '20', '1365', '4200', '0'), +('8', '48', '12', '4835', '4952', '0'), +('8', '48', '12', '20655', '4659', '0'), +('8', '48', '12', '11624', '2892', '0'), +('8', '48', '12', '4345', '2692', '0'), +('8', '48', '18', '4866', '3615', '0'), +('8', '48', '18', '4836', '3587', '0'), +('8', '48', '18', '4346', '2621', '0'), +('8', '48', '18', '4158', '2005', '0'), +('8', '48', '19', '4837', '4530', '0'), +('8', '48', '19', '4867', '3561', '0'), +('8', '48', '19', '68239', '3269', '0'), +('8', '48', '19', '4159', '1973', '0'), +('8', '48', '13', '27725', '4279', '0'), +('8', '48', '13', '11625', '3599', '0'), +('8', '48', '13', '6952', '3581', '0'), +('8', '48', '13', '5416', '3308', '0'), +('8', '48', '14', '11625', '3599', '0'), +('8', '48', '14', '6952', '3581', '0'), +('8', '48', '14', '5416', '3308', '0'), +('8', '48', '14', '5500', '3294', '0'), +('8', '48', '11', '9246', '2066', '0'), +('8', '48', '11', '13353', '1500', '0'), +('8', '48', '11', '14762', '1291', '0'), +('8', '48', '11', '20677', '900', '0'), +('8', '49', '22', '10323', '0', '0'), +('8', '49', '22', '10664', '0', '0'), +('8', '49', '22', '9246', '0', '0'), +('8', '49', '22', '21509', '0', '0'), +('8', '49', '1', '14701', '2452', '0'), +('8', '49', '1', '14702', '2050', '0'), +('8', '49', '1', '30361', '1440', '0'), +('8', '49', '1', '10165', '873', '0'), +('8', '49', '2', '4831', '3672', '0'), +('8', '49', '2', '4301', '3663', '0'), +('8', '49', '2', '10142', '3012', '0'), +('8', '49', '2', '10143', '2853', '0'), +('8', '49', '3', '27720', '3689', '0'), +('8', '49', '3', '2711', '2333', '0'), +('8', '49', '3', '71529', '2130', '0'), +('8', '49', '3', '11052', '1776', '0'), +('8', '49', '5', '27723', '4395', '0'), +('8', '49', '5', '14703', '3850', '0'), +('8', '49', '5', '14565', '3791', '0'), +('8', '49', '5', '68291', '2610', '0'), +('8', '49', '8', '11621', '11486', '0'), +('8', '49', '8', '11551', '4827', '0'), +('8', '49', '8', '11603', '4825', '0'), +('8', '49', '8', '1409', '3461', '0'), +('8', '49', '6', '1557', '6760', '0'), +('8', '49', '6', '4302', '2134', '0'), +('8', '49', '6', '27721', '2022', '0'), +('8', '49', '6', '4405', '1870', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '49', '17', '4832', '7372', '0'), +('8', '49', '17', '4862', '5452', '0'), +('8', '49', '17', '4154', '4426', '0'), +('8', '49', '17', '11623', '4375', '0'), +('8', '49', '7', '4863', '3781', '0'), +('8', '49', '7', '4833', '3443', '0'), +('8', '49', '7', '4343', '2981', '0'), +('8', '49', '7', '2458', '1980', '0'), +('8', '49', '9', '1541', '2833', '0'), +('8', '49', '9', '4834', '2623', '0'), +('8', '49', '9', '4864', '2507', '0'), +('8', '49', '9', '12189', '1961', '0'), +('8', '49', '15', '10366', '3254', '0'), +('8', '49', '15', '14679', '2955', '0'), +('8', '49', '15', '10151', '2700', '0'), +('8', '49', '15', '14678', '2404', '0'), +('8', '49', '20', '11601', '8347', '0'), +('8', '49', '20', '11666', '6078', '0'), +('8', '49', '20', '2920', '4467', '0'), +('8', '49', '20', '1365', '4200', '0'), +('8', '49', '12', '4835', '4961', '0'), +('8', '49', '12', '20655', '4667', '0'), +('8', '49', '12', '11624', '2904', '0'), +('8', '49', '12', '4345', '2704', '0'), +('8', '49', '18', '4866', '3630', '0'), +('8', '49', '18', '4836', '3595', '0'), +('8', '49', '18', '4346', '2621', '0'), +('8', '49', '18', '4158', '2005', '0'), +('8', '49', '19', '4837', '4542', '0'), +('8', '49', '19', '4867', '3576', '0'), +('8', '49', '19', '68239', '3276', '0'), +('8', '49', '19', '4159', '1973', '0'), +('8', '49', '13', '27725', '4279', '0'), +('8', '49', '13', '11625', '3614', '0'), +('8', '49', '13', '6952', '3581', '0'), +('8', '49', '13', '5416', '3308', '0'), +('8', '49', '14', '11625', '3614', '0'), +('8', '49', '14', '6952', '3581', '0'), +('8', '49', '14', '5416', '3308', '0'), +('8', '49', '14', '5500', '3294', '0'), +('8', '49', '11', '9246', '2090', '0'), +('8', '49', '11', '13353', '1500', '0'), +('8', '49', '11', '14762', '1291', '0'), +('8', '49', '11', '20677', '900', '0'), +('8', '50', '22', '10323', '0', '0'), +('8', '50', '22', '10664', '0', '0'), +('8', '50', '22', '9246', '0', '0'), +('8', '50', '22', '21509', '0', '0'), +('8', '50', '1', '14701', '2452', '0'), +('8', '50', '1', '14702', '2050', '0'), +('8', '50', '1', '30361', '1440', '0'), +('8', '50', '1', '10165', '873', '0'), +('8', '50', '2', '4831', '3684', '0'), +('8', '50', '2', '4301', '3663', '0'), +('8', '50', '2', '10142', '3012', '0'), +('8', '50', '2', '10143', '2853', '0'), +('8', '50', '3', '27720', '3701', '0'), +('8', '50', '3', '2711', '2345', '0'), +('8', '50', '3', '71529', '2137', '0'), +('8', '50', '3', '11052', '1812', '0'), +('8', '50', '5', '27723', '4402', '0'), +('8', '50', '5', '14703', '3850', '0'), +('8', '50', '5', '14565', '3798', '0'), +('8', '50', '5', '4501', '2627', '0'), +('8', '50', '8', '11621', '11486', '0'), +('8', '50', '8', '11603', '4847', '0'), +('8', '50', '8', '11551', '4827', '0'), +('8', '50', '8', '1409', '3461', '0'), +('8', '50', '6', '1557', '6760', '0'), +('8', '50', '6', '4302', '2144', '0'), +('8', '50', '6', '27721', '2022', '0'), +('8', '50', '6', '4405', '1870', '0'), +('8', '50', '17', '4832', '7398', '0'), +('8', '50', '17', '4862', '5452', '0'), +('8', '50', '17', '4154', '4434', '0'), +('8', '50', '17', '11623', '4375', '0'), +('8', '50', '7', '4863', '3803', '0'), +('8', '50', '7', '4833', '3443', '0'), +('8', '50', '7', '4343', '2998', '0'), +('8', '50', '7', '2458', '1989', '0'), +('8', '50', '9', '1541', '2833', '0'), +('8', '50', '9', '4834', '2623', '0'), +('8', '50', '9', '4864', '2514', '0'), +('8', '50', '9', '12189', '1961', '0'), +('8', '50', '15', '10366', '3254', '0'), +('8', '50', '15', '14679', '2955', '0'), +('8', '50', '15', '10151', '2700', '0'), +('8', '50', '15', '14678', '2404', '0'), +('8', '50', '20', '11601', '8364', '0'), +('8', '50', '20', '11666', '6090', '0'), +('8', '50', '20', '2920', '4467', '0'), +('8', '50', '20', '1365', '4200', '0'), +('8', '50', '12', '4835', '4969', '0'), +('8', '50', '12', '20655', '4676', '0'), +('8', '50', '12', '11624', '2916', '0'), +('8', '50', '12', '4345', '2716', '0'), +('8', '50', '18', '4866', '3645', '0'), +('8', '50', '18', '4836', '3603', '0'), +('8', '50', '18', '4346', '2621', '0'), +('8', '50', '18', '4158', '2005', '0'), +('8', '50', '19', '4837', '4554', '0'), +('8', '50', '19', '4867', '3591', '0'), +('8', '50', '19', '68239', '3283', '0'), +('8', '50', '19', '4159', '1973', '0'), +('8', '50', '13', '27725', '4279', '0'), +('8', '50', '13', '11625', '3629', '0'), +('8', '50', '13', '6952', '3581', '0'), +('8', '50', '13', '5416', '3308', '0'), +('8', '50', '14', '11625', '3629', '0'), +('8', '50', '14', '6952', '3581', '0'), +('8', '50', '14', '5416', '3308', '0'), +('8', '50', '14', '5500', '3294', '0'), +('8', '50', '11', '9246', '2114', '0'), +('8', '50', '11', '13353', '1500', '0'), +('8', '50', '11', '14762', '1291', '0'), +('8', '50', '11', '20677', '900', '0'), +('8', '51', '22', '10323', '0', '0'), +('8', '51', '22', '10664', '0', '0'), +('8', '51', '22', '9246', '0', '0'), +('8', '51', '22', '21509', '0', '0'), +('8', '51', '1', '14701', '2452', '0'), +('8', '51', '1', '14702', '2050', '0'), +('8', '51', '1', '30361', '1440', '0'), +('8', '51', '1', '10165', '873', '0'), +('8', '51', '2', '4831', '3696', '0'), +('8', '51', '2', '4301', '3663', '0'), +('8', '51', '2', '10142', '3012', '0'), +('8', '51', '2', '10143', '2853', '0'), +('8', '51', '3', '27720', '3714', '0'), +('8', '51', '3', '2711', '2358', '0'), +('8', '51', '3', '71529', '2145', '0'), +('8', '51', '3', '11052', '1848', '0'), +('8', '51', '5', '27723', '4409', '0'), +('8', '51', '5', '14703', '3850', '0'), +('8', '51', '5', '14565', '3805', '0'), +('8', '51', '5', '4501', '2659', '0'), +('8', '51', '8', '11621', '11486', '0'), +('8', '51', '8', '11603', '4869', '0'), +('8', '51', '8', '11551', '4827', '0'), +('8', '51', '8', '1409', '3461', '0'), +('8', '51', '6', '1557', '6760', '0'), +('8', '51', '6', '4302', '2155', '0'), +('8', '51', '6', '27721', '2022', '0'), +('8', '51', '6', '4405', '1870', '0'), +('8', '51', '17', '4832', '7427', '0'), +('8', '51', '17', '4862', '5452', '0'), +('8', '51', '17', '4154', '4444', '0'), +('8', '51', '17', '11623', '4375', '0'), +('8', '51', '7', '4863', '3825', '0'), +('8', '51', '7', '4833', '3443', '0'), +('8', '51', '7', '4343', '3017', '0'), +('8', '51', '7', '2458', '1999', '0'), +('8', '51', '9', '1541', '2833', '0'), +('8', '51', '9', '4834', '2623', '0'), +('8', '51', '9', '4864', '2521', '0'), +('8', '51', '9', '12189', '1961', '0'), +('8', '51', '15', '10366', '3254', '0'), +('8', '51', '15', '14679', '2955', '0'), +('8', '51', '15', '10151', '2700', '0'), +('8', '51', '15', '14678', '2404', '0'), +('8', '51', '20', '11601', '8383', '0'), +('8', '51', '20', '11666', '6103', '0'), +('8', '51', '20', '2920', '4467', '0'), +('8', '51', '20', '1365', '4200', '0'), +('8', '51', '12', '4835', '4979', '0'), +('8', '51', '12', '20655', '4684', '0'), +('8', '51', '12', '11624', '2929', '0'), +('8', '51', '12', '4345', '2728', '0'), +('8', '51', '18', '4866', '3663', '0'), +('8', '51', '18', '4836', '3613', '0'), +('8', '51', '18', '4346', '2621', '0'), +('8', '51', '18', '4158', '2005', '0'), +('8', '51', '19', '4837', '4566', '0'), +('8', '51', '19', '4867', '3608', '0'), +('8', '51', '19', '68239', '3291', '0'), +('8', '51', '19', '4159', '1973', '0'), +('8', '51', '13', '27725', '4279', '0'), +('8', '51', '13', '11625', '3647', '0'), +('8', '51', '13', '6952', '3581', '0'), +('8', '51', '13', '5416', '3308', '0'), +('8', '51', '14', '11625', '3647', '0'), +('8', '51', '14', '6952', '3581', '0'), +('8', '51', '14', '5416', '3308', '0'), +('8', '51', '14', '5500', '3294', '0'), +('8', '51', '11', '9246', '2138', '0'), +('8', '51', '11', '13353', '1500', '0'), +('8', '51', '11', '14762', '1291', '0'), +('8', '51', '11', '20677', '900', '0'), +('8', '52', '22', '10323', '0', '0'), +('8', '52', '22', '10664', '0', '0'), +('8', '52', '22', '9246', '0', '0'), +('8', '52', '22', '21509', '0', '0'), +('8', '52', '1', '14701', '2452', '0'), +('8', '52', '1', '14702', '2050', '0'), +('8', '52', '1', '30361', '1440', '0'), +('8', '52', '1', '10165', '873', '0'), +('8', '52', '2', '4831', '3709', '0'), +('8', '52', '2', '4301', '3663', '0'), +('8', '52', '2', '10142', '3012', '0'), +('8', '52', '2', '10143', '2853', '0'), +('8', '52', '3', '27720', '3727', '0'), +('8', '52', '3', '2711', '2371', '0'), +('8', '52', '3', '71529', '2152', '0'), +('8', '52', '3', '11052', '1884', '0'), +('8', '52', '5', '27723', '4416', '0'), +('8', '52', '5', '14703', '3850', '0'), +('8', '52', '5', '14565', '3812', '0'), +('8', '52', '5', '4501', '2690', '0'), +('8', '52', '8', '11621', '11486', '0'), +('8', '52', '8', '11603', '4891', '0'), +('8', '52', '8', '11551', '4827', '0'), +('8', '52', '8', '1409', '3461', '0'), +('8', '52', '6', '1557', '6760', '0'), +('8', '52', '6', '4302', '2165', '0'), +('8', '52', '6', '27721', '2022', '0'), +('8', '52', '6', '4405', '1870', '0'), +('8', '52', '17', '4832', '7452', '0'), +('8', '52', '17', '4862', '5452', '0'), +('8', '52', '17', '4154', '4452', '0'), +('8', '52', '17', '11623', '4375', '0'), +('8', '52', '7', '4863', '3847', '0'), +('8', '52', '7', '4833', '3443', '0'), +('8', '52', '7', '4343', '3034', '0'), +('8', '52', '7', '2458', '2009', '0'), +('8', '52', '9', '1541', '2833', '0'), +('8', '52', '9', '4834', '2623', '0'), +('8', '52', '9', '4864', '2528', '0'), +('8', '52', '9', '12189', '1961', '0'), +('8', '52', '15', '10366', '3254', '0'), +('8', '52', '15', '14679', '2955', '0'), +('8', '52', '15', '10151', '2700', '0'), +('8', '52', '15', '14678', '2404', '0'), +('8', '52', '20', '11601', '8400', '0'), +('8', '52', '20', '11666', '6115', '0'), +('8', '52', '20', '2920', '4467', '0'), +('8', '52', '20', '1365', '4200', '0'), +('8', '52', '12', '4835', '4987', '0'), +('8', '52', '12', '20655', '4692', '0'), +('8', '52', '12', '11624', '2941', '0'), +('8', '52', '12', '4345', '2740', '0'), +('8', '52', '18', '4866', '3678', '0'), +('8', '52', '18', '4836', '3622', '0'), +('8', '52', '18', '4346', '2621', '0'), +('8', '52', '18', '4158', '2005', '0'), +('8', '52', '19', '4837', '4578', '0'), +('8', '52', '19', '4867', '3624', '0'), +('8', '52', '19', '68239', '3298', '0'), +('8', '52', '19', '4159', '1973', '0'), +('8', '52', '13', '27725', '4279', '0'), +('8', '52', '13', '11625', '3662', '0'), +('8', '52', '13', '6952', '3581', '0'), +('8', '52', '13', '5416', '3308', '0'), +('8', '52', '14', '11625', '3662', '0'), +('8', '52', '14', '6952', '3581', '0'), +('8', '52', '14', '5416', '3308', '0'), +('8', '52', '14', '5500', '3294', '0'), +('8', '52', '11', '9246', '2162', '0'), +('8', '52', '11', '13353', '1500', '0'), +('8', '52', '11', '14762', '1291', '0'), +('8', '52', '11', '20677', '900', '0'), +('8', '53', '22', '10323', '0', '0'), +('8', '53', '22', '10664', '0', '0'), +('8', '53', '22', '9246', '0', '0'), +('8', '53', '22', '21509', '0', '0'), +('8', '53', '1', '14701', '2452', '0'), +('8', '53', '1', '14702', '2050', '0'), +('8', '53', '1', '30361', '1440', '0'), +('8', '53', '1', '10165', '873', '0'), +('8', '53', '2', '4831', '3721', '0'), +('8', '53', '2', '4301', '3663', '0'), +('8', '53', '2', '10142', '3012', '0'), +('8', '53', '2', '10143', '2853', '0'), +('8', '53', '3', '27720', '3739', '0'), +('8', '53', '3', '2711', '2383', '0'), +('8', '53', '3', '71529', '2158', '0'), +('8', '53', '3', '11052', '1921', '0'), +('8', '53', '5', '27723', '4423', '0'), +('8', '53', '5', '14703', '3850', '0'), +('8', '53', '5', '14565', '3819', '0'), +('8', '53', '5', '4501', '2722', '0'), +('8', '53', '8', '11621', '11486', '0'), +('8', '53', '8', '11603', '4912', '0'), +('8', '53', '8', '11551', '4827', '0'), +('8', '53', '8', '1409', '3461', '0'), +('8', '53', '6', '1557', '6760', '0'), +('8', '53', '6', '4302', '2176', '0'), +('8', '53', '6', '27721', '2022', '0'), +('8', '53', '6', '4405', '1870', '0'), +('8', '53', '17', '4832', '7478', '0'), +('8', '53', '17', '4862', '5452', '0'), +('8', '53', '17', '4154', '4461', '0'), +('8', '53', '17', '11623', '4375', '0'), +('8', '53', '7', '4863', '3868', '0'), +('8', '53', '7', '4833', '3443', '0'), +('8', '53', '7', '4343', '3051', '0'), +('8', '53', '7', '2458', '2018', '0'), +('8', '53', '9', '1541', '2833', '0'), +('8', '53', '9', '4834', '2623', '0'), +('8', '53', '9', '4864', '2536', '0'), +('8', '53', '9', '12189', '1961', '0'), +('8', '53', '15', '10366', '3254', '0'), +('8', '53', '15', '14679', '2955', '0'), +('8', '53', '15', '10151', '2700', '0'), +('8', '53', '15', '14678', '2404', '0'), +('8', '53', '20', '11601', '8417', '0'), +('8', '53', '20', '11666', '6127', '0'), +('8', '53', '20', '2920', '4467', '0'), +('8', '53', '20', '1365', '4200', '0'), +('8', '53', '12', '4835', '4996', '0'), +('8', '53', '12', '20655', '4701', '0'), +('8', '53', '12', '11624', '2953', '0'), +('8', '53', '12', '4345', '2752', '0'), +('8', '53', '18', '4866', '3693', '0'), +('8', '53', '18', '4836', '3630', '0'), +('8', '53', '18', '4346', '2621', '0'), +('8', '53', '18', '4158', '2005', '0'), +('8', '53', '19', '4837', '4590', '0'), +('8', '53', '19', '4867', '3639', '0'), +('8', '53', '19', '68239', '3305', '0'), +('8', '53', '19', '4159', '1973', '0'), +('8', '53', '13', '27725', '4279', '0'), +('8', '53', '13', '11625', '3677', '0'), +('8', '53', '13', '6952', '3581', '0'), +('8', '53', '13', '5416', '3308', '0'), +('8', '53', '14', '11625', '3677', '0'), +('8', '53', '14', '6952', '3581', '0'), +('8', '53', '14', '5416', '3308', '0'), +('8', '53', '14', '5500', '3294', '0'), +('8', '53', '11', '9246', '2186', '0'), +('8', '53', '11', '13353', '1500', '0'), +('8', '53', '11', '14762', '1291', '0'), +('8', '53', '11', '20677', '900', '0'), +('8', '54', '22', '10323', '0', '0'), +('8', '54', '22', '10664', '0', '0'), +('8', '54', '22', '9246', '0', '0'), +('8', '54', '22', '21509', '0', '0'), +('8', '54', '1', '14701', '2452', '0'), +('8', '54', '1', '14702', '2050', '0'), +('8', '54', '1', '30361', '1440', '0'), +('8', '54', '1', '10165', '873', '0'), +('8', '54', '2', '4831', '3733', '0'), +('8', '54', '2', '4301', '3663', '0'), +('8', '54', '2', '10142', '3012', '0'), +('8', '54', '2', '10143', '2853', '0'), +('8', '54', '3', '27720', '3752', '0'), +('8', '54', '3', '2711', '2396', '0'), +('8', '54', '3', '71529', '2166', '0'), +('8', '54', '3', '11052', '1957', '0'), +('8', '54', '5', '27723', '4431', '0'), +('8', '54', '5', '14703', '3850', '0'), +('8', '54', '5', '14565', '3827', '0'), +('8', '54', '5', '4501', '2753', '0'), +('8', '54', '8', '11621', '11486', '0'), +('8', '54', '8', '11603', '4934', '0'), +('8', '54', '8', '11551', '4827', '0'), +('8', '54', '8', '1409', '3461', '0'), +('8', '54', '6', '1557', '6760', '0'), +('8', '54', '6', '4302', '2187', '0'), +('8', '54', '6', '27721', '2022', '0'), +('8', '54', '6', '4405', '1870', '0'), +('8', '54', '17', '4832', '7507', '0'), +('8', '54', '17', '4862', '5452', '0'), +('8', '54', '17', '4154', '4471', '0'), +('8', '54', '17', '11623', '4375', '0'), +('8', '54', '7', '4863', '3890', '0'), +('8', '54', '7', '4833', '3443', '0'), +('8', '54', '7', '4343', '3070', '0'), +('8', '54', '7', '2458', '2028', '0'), +('8', '54', '9', '1541', '2833', '0'), +('8', '54', '9', '4834', '2623', '0'), +('8', '54', '9', '4864', '2543', '0'), +('8', '54', '9', '12189', '1961', '0'), +('8', '54', '15', '10366', '3254', '0'), +('8', '54', '15', '14679', '2955', '0'), +('8', '54', '15', '10151', '2700', '0'), +('8', '54', '15', '14678', '2404', '0'), +('8', '54', '20', '11601', '8436', '0'), +('8', '54', '20', '11666', '6141', '0'), +('8', '54', '20', '2920', '4467', '0'), +('8', '54', '20', '1365', '4200', '0'), +('8', '54', '12', '4835', '5006', '0'), +('8', '54', '12', '20655', '4709', '0'), +('8', '54', '12', '11624', '2967', '0'), +('8', '54', '12', '4345', '2764', '0'), +('8', '54', '18', '4866', '3711', '0'), +('8', '54', '18', '4836', '3640', '0'), +('8', '54', '18', '4346', '2621', '0'), +('8', '54', '18', '4158', '2005', '0'), +('8', '54', '19', '4837', '4603', '0'), +('8', '54', '19', '4867', '3656', '0'), +('8', '54', '19', '68239', '3312', '0'), +('8', '54', '19', '4159', '1973', '0'), +('8', '54', '13', '27725', '4279', '0'), +('8', '54', '13', '11625', '3694', '0'), +('8', '54', '13', '6952', '3581', '0'), +('8', '54', '13', '5416', '3308', '0'), +('8', '54', '14', '11625', '3694', '0'), +('8', '54', '14', '6952', '3581', '0'), +('8', '54', '14', '5416', '3308', '0'), +('8', '54', '14', '5500', '3294', '0'), +('8', '54', '11', '9246', '2211', '0'), +('8', '54', '11', '13353', '1500', '0'), +('8', '54', '11', '14762', '1291', '0'), +('8', '54', '11', '20677', '900', '0'), +('8', '55', '22', '10323', '0', '0'), +('8', '55', '22', '10664', '0', '0'), +('8', '55', '22', '9246', '0', '0'), +('8', '55', '22', '21509', '0', '0'), +('8', '55', '1', '14701', '2452', '0'), +('8', '55', '1', '14702', '2050', '0'), +('8', '55', '1', '30361', '1440', '0'), +('8', '55', '1', '10165', '873', '0'), +('8', '55', '2', '4831', '3745', '0'), +('8', '55', '2', '4301', '3663', '0'), +('8', '55', '2', '10142', '3012', '0'), +('8', '55', '2', '10143', '2853', '0'), +('8', '55', '3', '27720', '3764', '0'), +('8', '55', '3', '2711', '2408', '0'), +('8', '55', '3', '71529', '2173', '0'), +('8', '55', '3', '11052', '1993', '0'), +('8', '55', '5', '27723', '4437', '0'), +('8', '55', '5', '14703', '3850', '0'), +('8', '55', '5', '14565', '3833', '0'), +('8', '55', '5', '4501', '2784', '0'), +('8', '55', '8', '11621', '11486', '0'), +('8', '55', '8', '11603', '4956', '0'), +('8', '55', '8', '11551', '4827', '0'), +('8', '55', '8', '1409', '3461', '0'), +('8', '55', '6', '1557', '6760', '0'), +('8', '55', '6', '4302', '2197', '0'), +('8', '55', '6', '27721', '2022', '0'), +('8', '55', '6', '4405', '1870', '0'), +('8', '55', '17', '4832', '7532', '0'), +('8', '55', '17', '4862', '5452', '0'), +('8', '55', '17', '4154', '4479', '0'), +('8', '55', '17', '11623', '4375', '0'), +('8', '55', '7', '4863', '3912', '0'), +('8', '55', '7', '4833', '3443', '0'), +('8', '55', '7', '4343', '3087', '0'), +('8', '55', '7', '2458', '2038', '0'), +('8', '55', '9', '1541', '2833', '0'), +('8', '55', '9', '4834', '2623', '0'), +('8', '55', '9', '4864', '2550', '0'), +('8', '55', '9', '12189', '1961', '0'), +('8', '55', '15', '10366', '3254', '0'), +('8', '55', '15', '14679', '2955', '0'), +('8', '55', '15', '10151', '2700', '0'), +('8', '55', '15', '14678', '2404', '0'), +('8', '55', '20', '11601', '8453', '0'), +('8', '55', '20', '11666', '6153', '0'), +('8', '55', '20', '2920', '4467', '0'), +('8', '55', '20', '1365', '4200', '0'), +('8', '55', '12', '4835', '5014', '0'), +('8', '55', '12', '20655', '4718', '0'), +('8', '55', '12', '11624', '2979', '0'), +('8', '55', '12', '4345', '2776', '0'), +('8', '55', '18', '4866', '3726', '0'), +('8', '55', '18', '4836', '3648', '0'), +('8', '55', '18', '4346', '2621', '0'), +('8', '55', '18', '4158', '2005', '0'), +('8', '55', '19', '4837', '4615', '0'), +('8', '55', '19', '4867', '3672', '0'), +('8', '55', '19', '68239', '3320', '0'), +('8', '55', '19', '4407', '1981', '0'), +('8', '55', '13', '27725', '4279', '0'), +('8', '55', '13', '11625', '3710', '0'), +('8', '55', '13', '6952', '3581', '0'), +('8', '55', '13', '5416', '3308', '0'), +('8', '55', '14', '11625', '3710', '0'), +('8', '55', '14', '6952', '3581', '0'), +('8', '55', '14', '5416', '3308', '0'), +('8', '55', '14', '5500', '3294', '0'), +('8', '55', '11', '9246', '2235', '0'), +('8', '55', '11', '13353', '1500', '0'), +('8', '55', '11', '14762', '1291', '0'), +('8', '55', '11', '20677', '900', '0'), +('8', '56', '22', '10323', '0', '0'), +('8', '56', '22', '10664', '0', '0'), +('8', '56', '22', '9246', '0', '0'), +('8', '56', '22', '21509', '0', '0'), +('8', '56', '1', '14701', '2452', '0'), +('8', '56', '1', '14702', '2050', '0'), +('8', '56', '1', '30361', '1440', '0'), +('8', '56', '1', '10165', '873', '0'), +('8', '56', '2', '4831', '3757', '0'), +('8', '56', '2', '4301', '3663', '0'), +('8', '56', '2', '10142', '3012', '0'), +('8', '56', '2', '10143', '2853', '0'), +('8', '56', '3', '27720', '3777', '0'), +('8', '56', '3', '2711', '2421', '0'), +('8', '56', '3', '71529', '2181', '0'), +('8', '56', '3', '11052', '2029', '0'), +('8', '56', '5', '27723', '4445', '0'), +('8', '56', '5', '14703', '3850', '0'), +('8', '56', '5', '14565', '3841', '0'), +('8', '56', '5', '4501', '2816', '0'), +('8', '56', '8', '11621', '11486', '0'), +('8', '56', '8', '11603', '4978', '0'), +('8', '56', '8', '11551', '4827', '0'), +('8', '56', '8', '1409', '3461', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '56', '6', '1557', '6760', '0'), +('8', '56', '6', '4302', '2209', '0'), +('8', '56', '6', '27721', '2022', '0'), +('8', '56', '6', '4405', '1870', '0'), +('8', '56', '17', '4832', '7561', '0'), +('8', '56', '17', '4862', '5452', '0'), +('8', '56', '17', '4154', '4489', '0'), +('8', '56', '17', '11623', '4375', '0'), +('8', '56', '7', '4863', '3934', '0'), +('8', '56', '7', '4833', '3443', '0'), +('8', '56', '7', '4343', '3106', '0'), +('8', '56', '7', '2458', '2047', '0'), +('8', '56', '9', '1541', '2833', '0'), +('8', '56', '9', '4834', '2623', '0'), +('8', '56', '9', '4864', '2557', '0'), +('8', '56', '9', '12189', '1961', '0'), +('8', '56', '15', '10366', '3254', '0'), +('8', '56', '15', '14679', '2955', '0'), +('8', '56', '15', '10151', '2700', '0'), +('8', '56', '15', '14678', '2404', '0'), +('8', '56', '20', '11601', '8472', '0'), +('8', '56', '20', '11666', '6166', '0'), +('8', '56', '20', '2920', '4467', '0'), +('8', '56', '20', '1365', '4200', '0'), +('8', '56', '12', '4835', '5024', '0'), +('8', '56', '12', '20655', '4726', '0'), +('8', '56', '12', '11624', '2992', '0'), +('8', '56', '12', '4345', '2788', '0'), +('8', '56', '18', '4866', '3743', '0'), +('8', '56', '18', '4836', '3658', '0'), +('8', '56', '18', '4346', '2621', '0'), +('8', '56', '18', '4158', '2005', '0'), +('8', '56', '19', '4837', '4627', '0'), +('8', '56', '19', '4867', '3689', '0'), +('8', '56', '19', '68239', '3327', '0'), +('8', '56', '19', '4407', '2003', '0'), +('8', '56', '13', '27725', '4279', '0'), +('8', '56', '13', '11625', '3727', '0'), +('8', '56', '13', '6952', '3581', '0'), +('8', '56', '13', '5416', '3308', '0'), +('8', '56', '14', '11625', '3727', '0'), +('8', '56', '14', '6952', '3581', '0'), +('8', '56', '14', '5416', '3308', '0'), +('8', '56', '14', '5500', '3294', '0'), +('8', '56', '11', '9246', '2259', '0'), +('8', '56', '11', '13353', '1500', '0'), +('8', '56', '11', '14762', '1291', '0'), +('8', '56', '11', '20677', '900', '0'), +('8', '57', '22', '10323', '0', '0'), +('8', '57', '22', '10664', '0', '0'), +('8', '57', '22', '9246', '0', '0'), +('8', '57', '22', '21509', '0', '0'), +('8', '57', '1', '14701', '2452', '0'), +('8', '57', '1', '14702', '2050', '0'), +('8', '57', '1', '30361', '1440', '0'), +('8', '57', '1', '10165', '873', '0'), +('8', '57', '2', '4831', '3769', '0'), +('8', '57', '2', '4301', '3663', '0'), +('8', '57', '2', '10142', '3012', '0'), +('8', '57', '2', '10143', '2853', '0'), +('8', '57', '3', '27720', '3790', '0'), +('8', '57', '3', '2711', '2434', '0'), +('8', '57', '3', '71529', '2187', '0'), +('8', '57', '3', '11052', '2066', '0'), +('8', '57', '5', '27723', '4452', '0'), +('8', '57', '5', '14703', '3850', '0'), +('8', '57', '5', '14565', '3848', '0'), +('8', '57', '5', '4501', '2847', '0'), +('8', '57', '8', '11621', '11486', '0'), +('8', '57', '8', '11603', '4999', '0'), +('8', '57', '8', '11551', '4827', '0'), +('8', '57', '8', '1409', '3461', '0'), +('8', '57', '6', '1557', '6760', '0'), +('8', '57', '6', '4302', '2219', '0'), +('8', '57', '6', '27721', '2022', '0'), +('8', '57', '6', '4405', '1870', '0'), +('8', '57', '17', '4832', '7586', '0'), +('8', '57', '17', '4862', '5452', '0'), +('8', '57', '17', '4154', '4497', '0'), +('8', '57', '17', '11623', '4375', '0'), +('8', '57', '7', '4863', '3955', '0'), +('8', '57', '7', '4833', '3443', '0'), +('8', '57', '7', '4343', '3123', '0'), +('8', '57', '7', '2458', '2057', '0'), +('8', '57', '9', '1541', '2833', '0'), +('8', '57', '9', '4834', '2623', '0'), +('8', '57', '9', '4864', '2565', '0'), +('8', '57', '9', '12189', '1961', '0'), +('8', '57', '15', '10366', '3254', '0'), +('8', '57', '15', '14679', '2955', '0'), +('8', '57', '15', '10151', '2700', '0'), +('8', '57', '15', '14678', '2404', '0'), +('8', '57', '20', '11601', '8489', '0'), +('8', '57', '20', '11666', '6178', '0'), +('8', '57', '20', '2920', '4467', '0'), +('8', '57', '20', '1365', '4200', '0'), +('8', '57', '12', '4835', '5032', '0'), +('8', '57', '12', '20655', '4734', '0'), +('8', '57', '12', '11624', '3004', '0'), +('8', '57', '12', '4345', '2801', '0'), +('8', '57', '18', '4866', '3759', '0'), +('8', '57', '18', '4836', '3666', '0'), +('8', '57', '18', '4346', '2621', '0'), +('8', '57', '18', '4158', '2005', '0'), +('8', '57', '19', '4837', '4639', '0'), +('8', '57', '19', '4867', '3704', '0'), +('8', '57', '19', '68239', '3334', '0'), +('8', '57', '19', '4407', '2024', '0'), +('8', '57', '13', '27725', '4279', '0'), +('8', '57', '13', '11625', '3742', '0'), +('8', '57', '13', '6952', '3581', '0'), +('8', '57', '13', '5416', '3308', '0'), +('8', '57', '14', '11625', '3742', '0'), +('8', '57', '14', '6952', '3581', '0'), +('8', '57', '14', '5416', '3308', '0'), +('8', '57', '14', '5500', '3294', '0'), +('8', '57', '11', '9246', '2283', '0'), +('8', '57', '11', '13353', '1500', '0'), +('8', '57', '11', '14762', '1291', '0'), +('8', '57', '11', '20677', '900', '0'), +('8', '58', '22', '10323', '0', '0'), +('8', '58', '22', '10664', '0', '0'), +('8', '58', '22', '9246', '0', '0'), +('8', '58', '22', '21509', '0', '0'), +('8', '58', '1', '14701', '2452', '0'), +('8', '58', '1', '14702', '2050', '0'), +('8', '58', '1', '30361', '1440', '0'), +('8', '58', '1', '10165', '873', '0'), +('8', '58', '2', '4831', '3781', '0'), +('8', '58', '2', '4301', '3663', '0'), +('8', '58', '2', '10142', '3012', '0'), +('8', '58', '2', '10143', '2853', '0'), +('8', '58', '3', '27720', '3803', '0'), +('8', '58', '3', '2711', '2447', '0'), +('8', '58', '3', '71529', '2195', '0'), +('8', '58', '3', '11052', '2102', '0'), +('8', '58', '5', '27723', '4460', '0'), +('8', '58', '5', '14565', '3856', '0'), +('8', '58', '5', '14703', '3850', '0'), +('8', '58', '5', '4501', '2879', '0'), +('8', '58', '8', '11621', '11486', '0'), +('8', '58', '8', '11603', '5021', '0'), +('8', '58', '8', '11551', '4827', '0'), +('8', '58', '8', '1409', '3461', '0'), +('8', '58', '6', '1557', '6760', '0'), +('8', '58', '6', '4302', '2231', '0'), +('8', '58', '6', '27721', '2022', '0'), +('8', '58', '6', '4405', '1870', '0'), +('8', '58', '17', '4832', '7615', '0'), +('8', '58', '17', '4862', '5452', '0'), +('8', '58', '17', '4154', '4507', '0'), +('8', '58', '17', '11623', '4375', '0'), +('8', '58', '7', '4863', '3977', '0'), +('8', '58', '7', '4833', '3443', '0'), +('8', '58', '7', '4343', '3143', '0'), +('8', '58', '7', '2458', '2067', '0'), +('8', '58', '9', '1541', '2833', '0'), +('8', '58', '9', '4834', '2623', '0'), +('8', '58', '9', '4864', '2572', '0'), +('8', '58', '9', '12189', '1961', '0'), +('8', '58', '15', '10366', '3254', '0'), +('8', '58', '15', '14679', '2955', '0'), +('8', '58', '15', '10151', '2700', '0'), +('8', '58', '15', '14678', '2404', '0'), +('8', '58', '20', '11601', '8508', '0'), +('8', '58', '20', '11666', '6191', '0'), +('8', '58', '20', '2920', '4467', '0'), +('8', '58', '20', '1365', '4200', '0'), +('8', '58', '12', '4835', '5042', '0'), +('8', '58', '12', '20655', '4743', '0'), +('8', '58', '12', '11624', '3017', '0'), +('8', '58', '12', '4345', '2813', '0'), +('8', '58', '18', '4866', '3776', '0'), +('8', '58', '18', '4836', '3676', '0'), +('8', '58', '18', '4346', '2621', '0'), +('8', '58', '18', '4158', '2005', '0'), +('8', '58', '19', '4837', '4651', '0'), +('8', '58', '19', '4867', '3722', '0'), +('8', '58', '19', '68239', '3341', '0'), +('8', '58', '19', '4407', '2046', '0'), +('8', '58', '13', '27725', '4279', '0'), +('8', '58', '13', '11625', '3760', '0'), +('8', '58', '13', '6952', '3581', '0'), +('8', '58', '13', '5416', '3308', '0'), +('8', '58', '14', '11625', '3760', '0'), +('8', '58', '14', '6952', '3581', '0'), +('8', '58', '14', '5416', '3308', '0'), +('8', '58', '14', '5500', '3294', '0'), +('8', '58', '11', '9246', '2307', '0'), +('8', '58', '11', '13353', '1500', '0'), +('8', '58', '11', '14762', '1291', '0'), +('8', '58', '11', '20677', '900', '0'), +('8', '59', '22', '10323', '0', '0'), +('8', '59', '22', '10664', '0', '0'), +('8', '59', '22', '9246', '0', '0'), +('8', '59', '22', '21509', '0', '0'), +('8', '59', '1', '14701', '2452', '0'), +('8', '59', '1', '14702', '2050', '0'), +('8', '59', '1', '30361', '1440', '0'), +('8', '59', '1', '10165', '873', '0'), +('8', '59', '2', '4831', '3793', '0'), +('8', '59', '2', '4301', '3663', '0'), +('8', '59', '2', '10142', '3012', '0'), +('8', '59', '2', '10143', '2853', '0'), +('8', '59', '3', '27720', '3815', '0'), +('8', '59', '3', '2711', '2459', '0'), +('8', '59', '3', '71529', '2202', '0'), +('8', '59', '3', '11052', '2138', '0'), +('8', '59', '5', '27723', '4466', '0'), +('8', '59', '5', '14565', '3862', '0'), +('8', '59', '5', '14703', '3850', '0'), +('8', '59', '5', '4501', '2910', '0'), +('8', '59', '8', '11621', '11486', '0'), +('8', '59', '8', '11603', '5043', '0'), +('8', '59', '8', '11551', '4827', '0'), +('8', '59', '8', '1409', '3461', '0'), +('8', '59', '6', '1557', '6760', '0'), +('8', '59', '6', '4302', '2241', '0'), +('8', '59', '6', '27721', '2022', '0'), +('8', '59', '6', '4405', '1870', '0'), +('8', '59', '17', '4832', '7641', '0'), +('8', '59', '17', '4862', '5452', '0'), +('8', '59', '17', '4154', '4515', '0'), +('8', '59', '17', '11623', '4375', '0'), +('8', '59', '7', '4863', '3999', '0'), +('8', '59', '7', '4833', '3443', '0'), +('8', '59', '7', '4343', '3160', '0'), +('8', '59', '7', '2458', '2076', '0'), +('8', '59', '9', '1541', '2833', '0'), +('8', '59', '9', '4834', '2623', '0'), +('8', '59', '9', '4864', '2579', '0'), +('8', '59', '9', '12189', '1961', '0'), +('8', '59', '15', '10366', '3254', '0'), +('8', '59', '15', '14679', '2955', '0'), +('8', '59', '15', '10151', '2700', '0'), +('8', '59', '15', '14678', '2404', '0'), +('8', '59', '20', '11601', '8525', '0'), +('8', '59', '20', '11666', '6203', '0'), +('8', '59', '20', '2920', '4467', '0'), +('8', '59', '20', '1365', '4200', '0'), +('8', '59', '12', '4835', '5050', '0'), +('8', '59', '12', '20655', '4751', '0'), +('8', '59', '12', '11624', '3029', '0'), +('8', '59', '12', '4345', '2825', '0'), +('8', '59', '18', '4866', '3791', '0'), +('8', '59', '18', '4836', '3684', '0'), +('8', '59', '18', '4346', '2621', '0'), +('8', '59', '18', '4158', '2005', '0'), +('8', '59', '19', '4837', '4663', '0'), +('8', '59', '19', '4867', '3737', '0'), +('8', '59', '19', '68239', '3349', '0'), +('8', '59', '19', '4407', '2068', '0'), +('8', '59', '13', '27725', '4279', '0'), +('8', '59', '13', '11625', '3775', '0'), +('8', '59', '13', '6952', '3581', '0'), +('8', '59', '13', '5416', '3308', '0'), +('8', '59', '14', '11625', '3775', '0'), +('8', '59', '14', '6952', '3581', '0'), +('8', '59', '14', '5416', '3308', '0'), +('8', '59', '14', '5500', '3294', '0'), +('8', '59', '11', '9246', '2331', '0'), +('8', '59', '11', '13353', '1500', '0'), +('8', '59', '11', '14762', '1291', '0'), +('8', '59', '11', '20677', '900', '0'), +('8', '60', '22', '66397', '0', '3'), +('8', '60', '22', '62787', '0', '3'), +('8', '60', '22', '61948', '0', '3'), +('8', '60', '22', '21805', '0', '3'), +('8', '60', '1', '7945', '10423', '3'), +('8', '60', '1', '26775', '9230', '3'), +('8', '60', '1', '29861', '8676', '3'), +('8', '60', '1', '28962', '8324', '3'), +('8', '60', '2', '2612', '9706', '3'), +('8', '60', '2', '26025', '9706', '3'), +('8', '60', '2', '26759', '9138', '3'), +('8', '60', '2', '28909', '8318', '3'), +('8', '60', '3', '26773', '9855', '3'), +('8', '60', '3', '26751', '8481', '3'), +('8', '60', '3', '31233', '8328', '3'), +('8', '60', '3', '28942', '8074', '3'), +('8', '60', '5', '28885', '15105', '3'), +('8', '60', '5', '8364', '12967', '3'), +('8', '60', '5', '27266', '12107', '3'), +('8', '60', '5', '7868', '10099', '3'), +('8', '60', '8', '26766', '16816', '3'), +('8', '60', '8', '26765', '16789', '3'), +('8', '60', '8', '31471', '13151', '3'), +('8', '60', '8', '28918', '10775', '3'), +('8', '60', '6', '28902', '17563', '3'), +('8', '60', '6', '30551', '10095', '3'), +('8', '60', '6', '28919', '8383', '3'), +('8', '60', '6', '26753', '8262', '3'), +('8', '60', '17', '28937', '16195', '3'), +('8', '60', '17', '29457', '13746', '3'), +('8', '60', '17', '7869', '12653', '3'), +('8', '60', '17', '26770', '12104', '3'), +('8', '60', '7', '7868', '10099', '3'), +('8', '60', '7', '28926', '9591', '3'), +('8', '60', '7', '26584', '9351', '3'), +('8', '60', '7', '8288', '8600', '3'), +('8', '60', '9', '31461', '14090', '3'), +('8', '60', '9', '7868', '10099', '3'), +('8', '60', '9', '26584', '9351', '3'), +('8', '60', '9', '26752', '7841', '3'), +('8', '60', '15', '26749', '11110', '3'), +('8', '60', '15', '27950', '10149', '3'), +('8', '60', '15', '26757', '9241', '3'), +('8', '60', '15', '31231', '8575', '3'), +('8', '60', '20', '28890', '15000', '3'), +('8', '60', '20', '26551', '12810', '3'), +('8', '60', '20', '31364', '12569', '3'), +('8', '60', '20', '31235', '12335', '3'), +('8', '60', '12', '25857', '14901', '3'), +('8', '60', '12', '28967', '9863', '3'), +('8', '60', '12', '26774', '9371', '3'), +('8', '60', '12', '31227', '8682', '3'), +('8', '60', '18', '28965', '9130', '3'), +('8', '60', '18', '28932', '8312', '3'), +('8', '60', '18', '8289', '8293', '3'), +('8', '60', '18', '26760', '7439', '3'), +('8', '60', '19', '30569', '16940', '3'), +('8', '60', '19', '28888', '13612', '3'), +('8', '60', '19', '24616', '9835', '3'), +('8', '60', '19', '7871', '8321', '3'), +('8', '60', '13', '69416', '16658', '3'), +('8', '60', '13', '31469', '14989', '3'), +('8', '60', '13', '26603', '13492', '3'), +('8', '60', '13', '28833', '13206', '3'), +('8', '60', '14', '28809', '17305', '3'), +('8', '60', '14', '69416', '16658', '3'), +('8', '60', '14', '31469', '14989', '3'), +('8', '60', '14', '26603', '13492', '3'), +('8', '60', '11', '28149', '12284', '3'), +('8', '60', '11', '26563', '11891', '3'), +('8', '60', '11', '28933', '10724', '3'), +('8', '60', '11', '31469', '10097', '3'), +('8', '60', '22', '9248', '0', '2'), +('8', '60', '22', '10323', '0', '2'), +('8', '60', '22', '12425', '0', '2'), +('8', '60', '22', '30014', '0', '2'), +('8', '60', '1', '62234', '4186', '2'), +('8', '60', '1', '2748', '4089', '2'), +('8', '60', '1', '31236', '3726', '2'), +('8', '60', '1', '62348', '3685', '2'), +('8', '60', '2', '2612', '10259', '2'), +('8', '60', '2', '26025', '10259', '2'), +('8', '60', '2', '29648', '8849', '2'), +('8', '60', '2', '10913', '7818', '2'), +('8', '60', '3', '31233', '9599', '2'), +('8', '60', '3', '31244', '7851', '2'), +('8', '60', '3', '25213', '6345', '2'), +('8', '60', '3', '31464', '5576', '2'), +('8', '60', '5', '27266', '12675', '2'), +('8', '60', '5', '31460', '8475', '2'), +('8', '60', '5', '31318', '7406', '2'), +('8', '60', '5', '31234', '7384', '2'), +('8', '60', '8', '31471', '14151', '2'), +('8', '60', '8', '27261', '10759', '2'), +('8', '60', '8', '11621', '9981', '2'), +('8', '60', '8', '22819', '8981', '2'), +('8', '60', '6', '31472', '8221', '2'), +('8', '60', '6', '31240', '6095', '2'), +('8', '60', '6', '1557', '5523', '2'), +('8', '60', '6', '24070', '5391', '2'), +('8', '60', '17', '29457', '15191', '2'), +('8', '60', '17', '27261', '10759', '2'), +('8', '60', '17', '10845', '9664', '2'), +('8', '60', '17', '27159', '8711', '2'), +('8', '60', '7', '29485', '5502', '2'), +('8', '60', '7', '5723', '5166', '2'), +('8', '60', '7', '31381', '4968', '2'), +('8', '60', '7', '62361', '4028', '2'), +('8', '60', '9', '31461', '15479', '2'), +('8', '60', '9', '31460', '8475', '2'), +('8', '60', '9', '31246', '6034', '2'), +('8', '60', '9', '5723', '5166', '2'), +('8', '60', '15', '31231', '9318', '2'), +('8', '60', '15', '25211', '8789', '2'), +('8', '60', '15', '30388', '7002', '2'), +('8', '60', '15', '5727', '5182', '2'), +('8', '60', '20', '31364', '13742', '2'), +('8', '60', '20', '31235', '13673', '2'), +('8', '60', '20', '31334', '12778', '2'), +('8', '60', '20', '31353', '10058', '2'), +('8', '60', '12', '25857', '15902', '2'), +('8', '60', '12', '31227', '10489', '2'), +('8', '60', '12', '31306', '7654', '2'), +('8', '60', '12', '29177', '5826', '2'), +('8', '60', '18', '31374', '3942', '2'), +('8', '60', '18', '31138', '3914', '2'), +('8', '60', '18', '31332', '3881', '2'), +('8', '60', '18', '25389', '3866', '2'), +('8', '60', '19', '24616', '10179', '2'), +('8', '60', '19', '62371', '5296', '2'), +('8', '60', '19', '25197', '4606', '2'), +('8', '60', '19', '29455', '3975', '2'), +('8', '60', '13', '69416', '17402', '2'), +('8', '60', '13', '31469', '15952', '2'), +('8', '60', '13', '1154', '12314', '2'), +('8', '60', '13', '1158', '11959', '2'), +('8', '60', '14', '69416', '17402', '2'), +('8', '60', '14', '31469', '15952', '2'), +('8', '60', '14', '1154', '12314', '2'), +('8', '60', '14', '1158', '11959', '2'), +('8', '60', '11', '31469', '11061', '2'), +('8', '60', '11', '1554', '8237', '2'), +('8', '60', '11', '2698', '7909', '2'), +('8', '60', '11', '31303', '5607', '2'), +('8', '60', '22', '10323', '0', '1'), +('8', '60', '22', '12425', '0', '1'), +('8', '60', '22', '10664', '0', '1'), +('8', '60', '22', '9246', '0', '1'), +('8', '60', '1', '62234', '5063', '1'), +('8', '60', '1', '10912', '4312', '1'), +('8', '60', '1', '5704', '2460', '1'), +('8', '60', '1', '5715', '2460', '1'), +('8', '60', '2', '10913', '10244', '1'), +('8', '60', '2', '50036', '4580', '1'), +('8', '60', '2', '1630', '3846', '1'), +('8', '60', '2', '4301', '2859', '1'), +('8', '60', '3', '46184', '4389', '1'), +('8', '60', '3', '1625', '3195', '1'), +('8', '60', '3', '27720', '2690', '1'), +('8', '60', '3', '5712', '2263', '1'), +('8', '60', '5', '14703', '3850', '1'), +('8', '60', '5', '27723', '3706', '1'), +('8', '60', '5', '14565', '3350', '1'), +('8', '60', '5', '14709', '2846', '1'), +('8', '60', '8', '11621', '10734', '1'), +('8', '60', '8', '1627', '9710', '1'), +('8', '60', '8', '1619', '8879', '1'), +('8', '60', '8', '1628', '7600', '1'), +('8', '60', '6', '1557', '6141', '1'), +('8', '60', '6', '5723', '6110', '1'), +('8', '60', '6', '5706', '3340', '1'), +('8', '60', '6', '5739', '2870', '1'), +('8', '60', '17', '10845', '11965', '1'), +('8', '60', '17', '4832', '4527', '1'), +('8', '60', '17', '4558', '4028', '1'), +('8', '60', '17', '4862', '3341', '1'), +('8', '60', '7', '5723', '6110', '1'), +('8', '60', '7', '62046', '3191', '1'), +('8', '60', '7', '4863', '2496', '1'), +('8', '60', '7', '4299', '2144', '1'), +('8', '60', '9', '5723', '6110', '1'), +('8', '60', '9', '1541', '2041', '1'), +('8', '60', '9', '5794', '1835', '1'), +('8', '60', '9', '4834', '1806', '1'), +('8', '60', '15', '5727', '5822', '1'), +('8', '60', '15', '5728', '4221', '1'), +('8', '60', '15', '10366', '3232', '1'), +('8', '60', '15', '5807', '3035', '1'), +('8', '60', '20', '1620', '8525', '1'), +('8', '60', '20', '11601', '7584', '1'), +('8', '60', '20', '11666', '5513', '1'), +('8', '60', '20', '1623', '4978', '1'), +('8', '60', '12', '4835', '3806', '1'), +('8', '60', '12', '20655', '3506', '1'), +('8', '60', '12', '2923', '2407', '1'), +('8', '60', '12', '11613', '2034', '1'), +('8', '60', '18', '11612', '2707', '1'), +('8', '60', '18', '4562', '2688', '1'), +('8', '60', '18', '4866', '2371', '1'), +('8', '60', '18', '4836', '2180', '1'), +('8', '60', '19', '24616', '11041', '1'), +('8', '60', '19', '4837', '3128', '1'), +('8', '60', '19', '68239', '2497', '1'), +('8', '60', '19', '4920', '2433', '1'), +('8', '60', '13', '20542', '10546', '1'), +('8', '60', '13', '24609', '9485', '1'), +('8', '60', '13', '6287', '9323', '1'), +('8', '60', '13', '24613', '6344', '1'), +('8', '60', '14', '20542', '10546', '1'), +('8', '60', '14', '24609', '9485', '1'), +('8', '60', '14', '6287', '9323', '1'), +('8', '60', '14', '24613', '6344', '1'), +('8', '60', '11', '46178', '4638', '1'), +('8', '60', '11', '79631', '4046', '1'), +('8', '60', '11', '62242', '3290', '1'), +('8', '60', '11', '5721', '2399', '1'), +('8', '61', '22', '66397', '0', '3'), +('8', '61', '22', '62787', '0', '3'), +('8', '61', '22', '61948', '0', '3'), +('8', '61', '22', '21805', '0', '3'), +('8', '61', '1', '7945', '10424', '3'), +('8', '61', '1', '26775', '9231', '3'), +('8', '61', '1', '29861', '8678', '3'), +('8', '61', '1', '28962', '8324', '3'), +('8', '61', '2', '2612', '9706', '3'), +('8', '61', '2', '26025', '9706', '3'), +('8', '61', '2', '26759', '9138', '3'), +('8', '61', '2', '28909', '8318', '3'), +('8', '61', '3', '26773', '9856', '3'), +('8', '61', '3', '26751', '8482', '3'), +('8', '61', '3', '31233', '8329', '3'), +('8', '61', '3', '28942', '8075', '3'), +('8', '61', '5', '28885', '15106', '3'), +('8', '61', '5', '8364', '12969', '3'), +('8', '61', '5', '27266', '12108', '3'), +('8', '61', '5', '7868', '10099', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '61', '8', '26766', '16818', '3'), +('8', '61', '8', '26765', '16790', '3'), +('8', '61', '8', '31471', '13151', '3'), +('8', '61', '8', '28918', '10775', '3'), +('8', '61', '6', '28902', '17563', '3'), +('8', '61', '6', '30551', '10096', '3'), +('8', '61', '6', '28919', '8383', '3'), +('8', '61', '6', '26753', '8262', '3'), +('8', '61', '17', '28937', '16195', '3'), +('8', '61', '17', '29457', '13746', '3'), +('8', '61', '17', '7869', '12655', '3'), +('8', '61', '17', '26770', '12106', '3'), +('8', '61', '7', '7868', '10099', '3'), +('8', '61', '7', '28926', '9591', '3'), +('8', '61', '7', '26584', '9352', '3'), +('8', '61', '7', '8288', '8600', '3'), +('8', '61', '9', '31461', '14091', '3'), +('8', '61', '9', '7868', '10099', '3'), +('8', '61', '9', '26584', '9352', '3'), +('8', '61', '9', '26752', '7842', '3'), +('8', '61', '15', '26749', '11112', '3'), +('8', '61', '15', '27950', '10149', '3'), +('8', '61', '15', '26757', '9241', '3'), +('8', '61', '15', '31231', '8575', '3'), +('8', '61', '20', '28890', '15000', '3'), +('8', '61', '20', '26551', '12811', '3'), +('8', '61', '20', '31364', '12569', '3'), +('8', '61', '20', '31235', '12336', '3'), +('8', '61', '12', '25857', '14901', '3'), +('8', '61', '12', '28967', '9863', '3'), +('8', '61', '12', '26774', '9371', '3'), +('8', '61', '12', '31227', '8684', '3'), +('8', '61', '18', '28965', '9131', '3'), +('8', '61', '18', '28932', '8313', '3'), +('8', '61', '18', '8289', '8293', '3'), +('8', '61', '18', '26760', '7440', '3'), +('8', '61', '19', '30569', '16940', '3'), +('8', '61', '19', '28888', '13613', '3'), +('8', '61', '19', '24616', '9835', '3'), +('8', '61', '19', '7871', '8322', '3'), +('8', '61', '13', '69416', '16659', '3'), +('8', '61', '13', '31469', '14989', '3'), +('8', '61', '13', '26603', '13524', '3'), +('8', '61', '13', '28833', '13240', '3'), +('8', '61', '14', '28809', '17306', '3'), +('8', '61', '14', '69416', '16659', '3'), +('8', '61', '14', '31469', '14989', '3'), +('8', '61', '14', '26603', '13524', '3'), +('8', '61', '11', '28149', '12284', '3'), +('8', '61', '11', '26563', '11892', '3'), +('8', '61', '11', '28933', '10725', '3'), +('8', '61', '11', '31469', '10098', '3'), +('8', '62', '22', '66397', '0', '3'), +('8', '62', '22', '62787', '0', '3'), +('8', '62', '22', '61948', '0', '3'), +('8', '62', '22', '21805', '0', '3'), +('8', '62', '1', '7945', '10424', '3'), +('8', '62', '1', '26775', '9231', '3'), +('8', '62', '1', '29861', '8679', '3'), +('8', '62', '1', '28962', '8324', '3'), +('8', '62', '2', '2612', '9706', '3'), +('8', '62', '2', '26025', '9706', '3'), +('8', '62', '2', '26759', '9138', '3'), +('8', '62', '2', '28909', '8319', '3'), +('8', '62', '3', '26773', '9857', '3'), +('8', '62', '3', '26751', '8482', '3'), +('8', '62', '3', '31233', '8330', '3'), +('8', '62', '3', '28942', '8075', '3'), +('8', '62', '5', '28885', '15106', '3'), +('8', '62', '5', '8364', '12970', '3'), +('8', '62', '5', '27266', '12108', '3'), +('8', '62', '5', '7868', '10100', '3'), +('8', '62', '8', '26766', '16819', '3'), +('8', '62', '8', '26765', '16790', '3'), +('8', '62', '8', '31471', '13152', '3'), +('8', '62', '8', '28918', '10775', '3'), +('8', '62', '6', '28902', '17564', '3'), +('8', '62', '6', '30551', '10096', '3'), +('8', '62', '6', '28919', '8384', '3'), +('8', '62', '6', '26753', '8262', '3'), +('8', '62', '17', '28937', '16196', '3'), +('8', '62', '17', '29457', '13746', '3'), +('8', '62', '17', '7869', '12656', '3'), +('8', '62', '17', '26770', '12107', '3'), +('8', '62', '7', '7868', '10100', '3'), +('8', '62', '7', '28926', '9591', '3'), +('8', '62', '7', '26584', '9353', '3'), +('8', '62', '7', '8288', '8600', '3'), +('8', '62', '9', '31461', '14092', '3'), +('8', '62', '9', '7868', '10100', '3'), +('8', '62', '9', '26584', '9353', '3'), +('8', '62', '9', '26752', '7842', '3'), +('8', '62', '15', '26749', '11113', '3'), +('8', '62', '15', '27950', '10149', '3'), +('8', '62', '15', '26757', '9241', '3'), +('8', '62', '15', '31231', '8575', '3'), +('8', '62', '20', '28890', '15000', '3'), +('8', '62', '20', '26551', '12813', '3'), +('8', '62', '20', '31364', '12570', '3'), +('8', '62', '20', '31235', '12336', '3'), +('8', '62', '12', '25857', '14902', '3'), +('8', '62', '12', '28967', '9863', '3'), +('8', '62', '12', '26774', '9372', '3'), +('8', '62', '12', '31227', '8685', '3'), +('8', '62', '18', '28965', '9131', '3'), +('8', '62', '18', '28932', '8314', '3'), +('8', '62', '18', '8289', '8293', '3'), +('8', '62', '18', '26760', '7441', '3'), +('8', '62', '19', '30569', '16940', '3'), +('8', '62', '19', '28888', '13613', '3'), +('8', '62', '19', '24616', '9835', '3'), +('8', '62', '19', '7871', '8323', '3'), +('8', '62', '13', '69416', '16660', '3'), +('8', '62', '13', '31469', '14990', '3'), +('8', '62', '13', '26603', '13555', '3'), +('8', '62', '13', '28833', '13273', '3'), +('8', '62', '14', '28809', '17306', '3'), +('8', '62', '14', '69416', '16660', '3'), +('8', '62', '14', '31469', '14990', '3'), +('8', '62', '14', '26603', '13555', '3'), +('8', '62', '11', '28149', '12285', '3'), +('8', '62', '11', '26563', '11892', '3'), +('8', '62', '11', '28933', '10725', '3'), +('8', '62', '11', '31469', '10098', '3'), +('8', '63', '22', '66397', '0', '3'), +('8', '63', '22', '62787', '0', '3'), +('8', '63', '22', '61948', '0', '3'), +('8', '63', '22', '21805', '0', '3'), +('8', '63', '1', '7945', '10424', '3'), +('8', '63', '1', '26775', '9232', '3'), +('8', '63', '1', '29861', '8681', '3'), +('8', '63', '1', '28962', '8325', '3'), +('8', '63', '2', '2612', '9707', '3'), +('8', '63', '2', '26025', '9707', '3'), +('8', '63', '2', '26759', '9138', '3'), +('8', '63', '2', '28909', '8319', '3'), +('8', '63', '3', '26773', '9858', '3'), +('8', '63', '3', '26751', '8483', '3'), +('8', '63', '3', '31233', '8330', '3'), +('8', '63', '3', '28942', '8076', '3'), +('8', '63', '5', '28885', '15107', '3'), +('8', '63', '5', '8364', '12971', '3'), +('8', '63', '5', '27266', '12109', '3'), +('8', '63', '5', '7868', '10100', '3'), +('8', '63', '8', '26766', '16820', '3'), +('8', '63', '8', '26765', '16790', '3'), +('8', '63', '8', '31471', '13152', '3'), +('8', '63', '8', '28918', '10775', '3'), +('8', '63', '6', '28902', '17564', '3'), +('8', '63', '6', '30551', '10096', '3'), +('8', '63', '6', '28919', '8384', '3'), +('8', '63', '6', '26753', '8262', '3'), +('8', '63', '17', '28937', '16196', '3'), +('8', '63', '17', '29457', '13746', '3'), +('8', '63', '17', '7869', '12657', '3'), +('8', '63', '17', '26770', '12108', '3'), +('8', '63', '7', '7868', '10100', '3'), +('8', '63', '7', '28926', '9592', '3'), +('8', '63', '7', '26584', '9354', '3'), +('8', '63', '7', '8288', '8600', '3'), +('8', '63', '9', '31461', '14092', '3'), +('8', '63', '9', '7868', '10100', '3'), +('8', '63', '9', '26584', '9354', '3'), +('8', '63', '9', '26752', '7843', '3'), +('8', '63', '15', '26749', '11114', '3'), +('8', '63', '15', '27950', '10150', '3'), +('8', '63', '15', '26757', '9242', '3'), +('8', '63', '15', '31231', '8575', '3'), +('8', '63', '20', '28890', '15000', '3'), +('8', '63', '20', '26551', '12814', '3'), +('8', '63', '20', '31364', '12570', '3'), +('8', '63', '20', '31235', '12337', '3'), +('8', '63', '12', '25857', '14902', '3'), +('8', '63', '12', '28967', '9863', '3'), +('8', '63', '12', '26774', '9372', '3'), +('8', '63', '12', '31227', '8686', '3'), +('8', '63', '18', '28965', '9132', '3'), +('8', '63', '18', '28932', '8315', '3'), +('8', '63', '18', '8289', '8294', '3'), +('8', '63', '18', '26760', '7441', '3'), +('8', '63', '19', '30569', '16941', '3'), +('8', '63', '19', '28888', '13614', '3'), +('8', '63', '19', '24616', '9835', '3'), +('8', '63', '19', '7871', '8324', '3'), +('8', '63', '13', '69416', '16660', '3'), +('8', '63', '13', '31469', '14990', '3'), +('8', '63', '13', '26603', '13587', '3'), +('8', '63', '13', '28833', '13307', '3'), +('8', '63', '14', '28809', '17307', '3'), +('8', '63', '14', '69416', '16660', '3'), +('8', '63', '14', '31469', '14990', '3'), +('8', '63', '14', '26603', '13587', '3'), +('8', '63', '11', '28149', '12285', '3'), +('8', '63', '11', '26563', '11892', '3'), +('8', '63', '11', '28933', '10726', '3'), +('8', '63', '11', '31469', '10098', '3'), +('8', '64', '22', '66397', '0', '3'), +('8', '64', '22', '62787', '0', '3'), +('8', '64', '22', '61948', '0', '3'), +('8', '64', '22', '21805', '0', '3'), +('8', '64', '1', '7945', '10424', '3'), +('8', '64', '1', '26775', '9232', '3'), +('8', '64', '1', '29861', '8683', '3'), +('8', '64', '1', '28962', '8325', '3'), +('8', '64', '2', '2612', '9707', '3'), +('8', '64', '2', '26025', '9707', '3'), +('8', '64', '2', '26759', '9138', '3'), +('8', '64', '2', '28909', '8320', '3'), +('8', '64', '3', '26773', '9860', '3'), +('8', '64', '3', '26751', '8483', '3'), +('8', '64', '3', '31233', '8331', '3'), +('8', '64', '3', '28942', '8076', '3'), +('8', '64', '5', '28885', '15107', '3'), +('8', '64', '5', '8364', '12972', '3'), +('8', '64', '5', '27266', '12109', '3'), +('8', '64', '5', '7868', '10101', '3'), +('8', '64', '8', '26766', '16821', '3'), +('8', '64', '8', '26765', '16791', '3'), +('8', '64', '8', '31471', '13153', '3'), +('8', '64', '8', '28918', '10775', '3'), +('8', '64', '6', '28902', '17565', '3'), +('8', '64', '6', '30551', '10097', '3'), +('8', '64', '6', '28919', '8385', '3'), +('8', '64', '6', '26753', '8262', '3'), +('8', '64', '17', '28937', '16197', '3'), +('8', '64', '17', '29457', '13746', '3'), +('8', '64', '17', '7869', '12659', '3'), +('8', '64', '17', '26770', '12110', '3'), +('8', '64', '7', '7868', '10101', '3'), +('8', '64', '7', '28926', '9592', '3'), +('8', '64', '7', '26584', '9355', '3'), +('8', '64', '7', '8288', '8600', '3'), +('8', '64', '9', '31461', '14093', '3'), +('8', '64', '9', '7868', '10101', '3'), +('8', '64', '9', '26584', '9355', '3'), +('8', '64', '9', '26752', '7844', '3'), +('8', '64', '15', '26749', '11115', '3'), +('8', '64', '15', '27950', '10150', '3'), +('8', '64', '15', '26757', '9242', '3'), +('8', '64', '15', '31231', '8575', '3'), +('8', '64', '20', '28890', '15000', '3'), +('8', '64', '20', '26551', '12816', '3'), +('8', '64', '20', '31364', '12571', '3'), +('8', '64', '20', '31235', '12338', '3'), +('8', '64', '12', '25857', '14903', '3'), +('8', '64', '12', '28967', '9863', '3'), +('8', '64', '12', '26774', '9373', '3'), +('8', '64', '12', '31227', '8687', '3'), +('8', '64', '18', '28965', '9133', '3'), +('8', '64', '18', '28932', '8316', '3'), +('8', '64', '18', '8289', '8294', '3'), +('8', '64', '18', '26760', '7442', '3'), +('8', '64', '19', '30569', '16941', '3'), +('8', '64', '19', '28888', '13614', '3'), +('8', '64', '19', '24616', '9835', '3'), +('8', '64', '19', '7871', '8325', '3'), +('8', '64', '13', '69416', '16661', '3'), +('8', '64', '13', '31469', '14990', '3'), +('8', '64', '13', '26603', '13618', '3'), +('8', '64', '13', '28833', '13340', '3'), +('8', '64', '14', '28809', '17308', '3'), +('8', '64', '14', '69416', '16661', '3'), +('8', '64', '14', '31469', '14990', '3'), +('8', '64', '14', '26603', '13618', '3'), +('8', '64', '11', '28149', '12285', '3'), +('8', '64', '11', '26563', '11893', '3'), +('8', '64', '11', '28933', '10726', '3'), +('8', '64', '11', '31469', '10099', '3'), +('8', '65', '22', '21810', '0', '7'), +('8', '65', '22', '62787', '0', '7'), +('8', '65', '22', '66397', '0', '7'), +('8', '65', '22', '21805', '0', '7'), +('8', '65', '1', '68949', '28439', '7'), +('8', '65', '1', '68958', '25923', '7'), +('8', '65', '1', '69166', '23593', '7'), +('8', '65', '1', '7125', '22577', '7'), +('8', '65', '2', '28647', '22738', '7'), +('8', '65', '2', '28605', '22546', '7'), +('8', '65', '2', '28648', '22534', '7'), +('8', '65', '2', '69087', '19856', '7'), +('8', '65', '3', '69157', '29601', '7'), +('8', '65', '3', '26982', '21199', '7'), +('8', '65', '3', '69069', '20576', '7'), +('8', '65', '3', '69074', '20230', '7'), +('8', '65', '5', '67625', '24422', '7'), +('8', '65', '5', '69135', '22369', '7'), +('8', '65', '5', '69097', '20828', '7'), +('8', '65', '5', '68950', '20520', '7'), +('8', '65', '8', '69165', '32205', '7'), +('8', '65', '8', '69064', '30658', '7'), +('8', '65', '8', '69072', '29583', '7'), +('8', '65', '8', '69065', '26937', '7'), +('8', '65', '6', '68757', '26586', '7'), +('8', '65', '6', '13674', '24050', '7'), +('8', '65', '6', '69130', '23015', '7'), +('8', '65', '6', '69066', '20937', '7'), +('8', '65', '17', '68748', '25351', '7'), +('8', '65', '17', '69150', '24856', '7'), +('8', '65', '17', '68968', '24825', '7'), +('8', '65', '17', '47643', '21769', '7'), +('8', '65', '7', '69168', '28154', '7'), +('8', '65', '7', '68871', '22265', '7'), +('8', '65', '7', '16097', '19814', '7'), +('8', '65', '7', '69079', '19516', '7'), +('8', '65', '9', '69126', '23193', '7'), +('8', '65', '9', '32100', '22669', '7'), +('8', '65', '9', '68766', '21278', '7'), +('8', '65', '9', '69099', '20760', '7'), +('8', '65', '15', '69131', '29126', '7'), +('8', '65', '15', '68956', '25534', '7'), +('8', '65', '15', '68785', '23394', '7'), +('8', '65', '15', '69160', '22652', '7'), +('8', '65', '20', '16156', '26970', '7'), +('8', '65', '20', '67625', '24422', '7'), +('8', '65', '20', '69134', '24015', '7'), +('8', '65', '20', '68951', '20011', '7'), +('8', '65', '12', '69252', '22763', '7'), +('8', '65', '12', '68872', '20833', '7'), +('8', '65', '12', '69083', '20051', '7'), +('8', '65', '12', '28246', '16495', '7'), +('8', '65', '18', '69146', '24147', '7'), +('8', '65', '18', '68779', '18021', '7'), +('8', '65', '18', '68969', '16838', '7'), +('8', '65', '18', '28650', '16834', '7'), +('8', '65', '19', '69075', '27123', '7'), +('8', '65', '19', '69177', '22296', '7'), +('8', '65', '19', '68873', '21397', '7'), +('8', '65', '19', '19094', '18981', '7'), +('8', '65', '13', '69052', '37626', '7'), +('8', '65', '13', '69040', '37422', '7'), +('8', '65', '13', '69114', '35334', '7'), +('8', '65', '13', '69156', '30729', '7'), +('8', '65', '14', '69052', '37626', '7'), +('8', '65', '14', '69040', '37422', '7'), +('8', '65', '14', '69114', '35334', '7'), +('8', '65', '14', '69156', '30729', '7'), +('8', '65', '11', '67606', '22850', '7'), +('8', '65', '11', '68952', '21421', '7'), +('8', '65', '11', '9574', '20076', '7'), +('8', '65', '11', '68848', '19060', '7'), +('8', '65', '22', '21810', '0', '6'), +('8', '65', '22', '62787', '0', '6'), +('8', '65', '22', '66397', '0', '6'), +('8', '65', '22', '21805', '0', '6'), +('8', '65', '1', '7125', '22577', '6'), +('8', '65', '1', '32106', '20898', '6'), +('8', '65', '1', '7123', '17645', '6'), +('8', '65', '1', '4119', '15315', '6'), +('8', '65', '2', '28647', '22738', '6'), +('8', '65', '2', '28605', '22546', '6'), +('8', '65', '2', '28648', '22534', '6'), +('8', '65', '2', '28653', '12239', '6'), +('8', '65', '3', '26982', '21199', '6'), +('8', '65', '3', '9435', '15350', '6'), +('8', '65', '3', '9488', '14139', '6'), +('8', '65', '3', '29174', '13988', '6'), +('8', '65', '5', '28654', '20391', '6'), +('8', '65', '5', '7769', '19017', '6'), +('8', '65', '5', '8977', '16626', '6'), +('8', '65', '5', '9289', '15510', '6'), +('8', '65', '8', '15805', '18041', '6'), +('8', '65', '8', '26766', '16822', '6'), +('8', '65', '8', '26765', '16791', '6'), +('8', '65', '8', '15824', '15816', '6'), +('8', '65', '6', '13674', '24050', '6'), +('8', '65', '6', '19144', '18690', '6'), +('8', '65', '6', '28902', '17565', '6'), +('8', '65', '6', '13673', '17264', '6'), +('8', '65', '17', '47643', '21769', '6'), +('8', '65', '17', '28937', '16198', '6'), +('8', '65', '17', '29457', '13746', '6'), +('8', '65', '17', '15002', '13513', '6'), +('8', '65', '7', '16097', '19814', '6'), +('8', '65', '7', '21995', '14686', '6'), +('8', '65', '7', '11444', '14246', '6'), +('8', '65', '7', '27648', '10278', '6'), +('8', '65', '9', '32100', '22669', '6'), +('8', '65', '9', '16097', '19814', '6'), +('8', '65', '9', '11103', '19296', '6'), +('8', '65', '9', '28666', '15653', '6'), +('8', '65', '15', '9959', '19217', '6'), +('8', '65', '15', '26989', '17836', '6'), +('8', '65', '15', '69389', '17596', '6'), +('8', '65', '15', '68111', '17375', '6'), +('8', '65', '20', '16156', '26970', '6'), +('8', '65', '20', '16097', '19814', '6'), +('8', '65', '20', '15873', '18257', '6'), +('8', '65', '20', '22880', '15912', '6'), +('8', '65', '12', '28246', '16495', '6'), +('8', '65', '12', '27000', '15648', '6'), +('8', '65', '12', '25857', '14903', '6'), +('8', '65', '12', '27990', '12977', '6'), +('8', '65', '18', '28650', '16834', '6'), +('8', '65', '18', '16771', '12587', '6'), +('8', '65', '18', '28965', '9133', '6'), +('8', '65', '18', '68143', '8490', '6'), +('8', '65', '19', '19094', '18981', '6'), +('8', '65', '19', '30569', '16941', '6'), +('8', '65', '19', '25995', '16183', '6'), +('8', '65', '19', '19549', '13649', '6'), +('8', '65', '13', '22986', '28929', '6'), +('8', '65', '13', '22998', '28273', '6'), +('8', '65', '13', '24570', '25867', '6'), +('8', '65', '13', '24695', '25238', '6'), +('8', '65', '14', '22986', '28929', '6'), +('8', '65', '14', '22998', '28273', '6'), +('8', '65', '14', '24570', '25867', '6'), +('8', '65', '14', '24695', '25238', '6'), +('8', '65', '11', '9574', '20076', '6'), +('8', '65', '11', '26987', '18397', '6'), +('8', '65', '11', '20496', '17872', '6'), +('8', '65', '11', '20625', '15000', '6'), +('8', '65', '22', '21810', '0', '5'), +('8', '65', '22', '62787', '0', '5'), +('8', '65', '22', '66397', '0', '5'), +('8', '65', '22', '21805', '0', '5'), +('8', '65', '1', '7125', '22577', '5'), +('8', '65', '1', '32106', '20898', '5'), +('8', '65', '1', '7123', '17645', '5'), +('8', '65', '1', '4119', '15315', '5'), +('8', '65', '2', '28647', '22738', '5'), +('8', '65', '2', '28605', '22546', '5'), +('8', '65', '2', '28648', '22534', '5'), +('8', '65', '2', '28653', '12239', '5'), +('8', '65', '3', '26982', '21199', '5'), +('8', '65', '3', '9435', '15350', '5'), +('8', '65', '3', '9488', '14139', '5'), +('8', '65', '3', '29174', '13988', '5'), +('8', '65', '5', '28654', '20391', '5'), +('8', '65', '5', '7769', '19017', '5'), +('8', '65', '5', '8977', '16626', '5'), +('8', '65', '5', '9289', '15510', '5'), +('8', '65', '8', '15805', '18041', '5'), +('8', '65', '8', '26766', '16822', '5'), +('8', '65', '8', '26765', '16791', '5'), +('8', '65', '8', '15824', '15816', '5'), +('8', '65', '6', '13674', '24050', '5'), +('8', '65', '6', '19144', '18690', '5'), +('8', '65', '6', '28902', '17565', '5'), +('8', '65', '6', '13673', '17264', '5'), +('8', '65', '17', '47643', '21769', '5'), +('8', '65', '17', '28937', '16198', '5'), +('8', '65', '17', '29457', '13746', '5'), +('8', '65', '17', '15002', '13513', '5'), +('8', '65', '7', '16097', '19814', '5'), +('8', '65', '7', '21995', '14686', '5'), +('8', '65', '7', '11444', '14246', '5'), +('8', '65', '7', '27648', '10278', '5'), +('8', '65', '9', '32100', '22669', '5'), +('8', '65', '9', '16097', '19814', '5'), +('8', '65', '9', '11103', '19296', '5'), +('8', '65', '9', '28666', '15653', '5'), +('8', '65', '15', '9959', '19217', '5'), +('8', '65', '15', '26989', '17836', '5'), +('8', '65', '15', '69389', '17596', '5'), +('8', '65', '15', '32109', '16958', '5'), +('8', '65', '20', '16156', '26970', '5'), +('8', '65', '20', '16097', '19814', '5'), +('8', '65', '20', '15873', '18257', '5'), +('8', '65', '20', '22880', '15912', '5'), +('8', '65', '12', '28246', '16495', '5'), +('8', '65', '12', '27000', '15648', '5'), +('8', '65', '12', '25857', '14903', '5'), +('8', '65', '12', '27990', '12977', '5'), +('8', '65', '18', '28650', '16834', '5'), +('8', '65', '18', '16771', '12587', '5'), +('8', '65', '18', '28965', '9133', '5'), +('8', '65', '18', '28932', '8317', '5'), +('8', '65', '19', '19094', '18981', '5'), +('8', '65', '19', '30569', '16941', '5'), +('8', '65', '19', '25995', '16183', '5'), +('8', '65', '19', '19549', '13649', '5'), +('8', '65', '13', '22986', '28929', '5'), +('8', '65', '13', '22998', '28273', '5'), +('8', '65', '13', '24570', '25867', '5'), +('8', '65', '13', '24695', '25238', '5'), +('8', '65', '14', '22986', '28929', '5'), +('8', '65', '14', '22998', '28273', '5'), +('8', '65', '14', '24570', '25867', '5'), +('8', '65', '14', '24695', '25238', '5'), +('8', '65', '11', '9574', '20076', '5'), +('8', '65', '11', '26987', '18397', '5'), +('8', '65', '11', '20496', '17872', '5'), +('8', '65', '11', '20625', '15000', '5'), +('8', '65', '22', '21810', '0', '4'), +('8', '65', '22', '62787', '0', '4'), +('8', '65', '22', '66397', '0', '4'), +('8', '65', '22', '21805', '0', '4'), +('8', '65', '1', '7125', '22577', '4'), +('8', '65', '1', '32106', '20898', '4'), +('8', '65', '1', '7123', '17645', '4'), +('8', '65', '1', '4119', '15315', '4'), +('8', '65', '2', '28647', '22738', '4'), +('8', '65', '2', '28605', '22546', '4'), +('8', '65', '2', '28648', '22534', '4'), +('8', '65', '2', '28653', '12239', '4'), +('8', '65', '3', '26982', '21199', '4'), +('8', '65', '3', '9435', '15350', '4'), +('8', '65', '3', '9488', '14139', '4'), +('8', '65', '3', '29174', '13988', '4'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '65', '5', '28654', '20391', '4'), +('8', '65', '5', '7769', '19017', '4'), +('8', '65', '5', '8977', '16626', '4'), +('8', '65', '5', '9289', '15510', '4'), +('8', '65', '8', '15805', '18041', '4'), +('8', '65', '8', '26766', '16822', '4'), +('8', '65', '8', '26765', '16791', '4'), +('8', '65', '8', '15824', '15816', '4'), +('8', '65', '6', '13674', '24050', '4'), +('8', '65', '6', '19144', '18690', '4'), +('8', '65', '6', '28902', '17565', '4'), +('8', '65', '6', '13673', '17264', '4'), +('8', '65', '17', '47643', '21769', '4'), +('8', '65', '17', '28937', '16198', '4'), +('8', '65', '17', '29457', '13746', '4'), +('8', '65', '17', '15002', '13513', '4'), +('8', '65', '7', '16097', '19814', '4'), +('8', '65', '7', '21995', '14686', '4'), +('8', '65', '7', '11444', '14246', '4'), +('8', '65', '7', '27648', '10278', '4'), +('8', '65', '9', '32100', '22669', '4'), +('8', '65', '9', '16097', '19814', '4'), +('8', '65', '9', '11103', '19296', '4'), +('8', '65', '9', '28666', '15653', '4'), +('8', '65', '15', '9959', '19217', '4'), +('8', '65', '15', '26989', '17836', '4'), +('8', '65', '15', '69389', '17596', '4'), +('8', '65', '15', '32109', '16958', '4'), +('8', '65', '20', '16156', '26970', '4'), +('8', '65', '20', '16097', '19814', '4'), +('8', '65', '20', '15873', '18257', '4'), +('8', '65', '20', '22880', '15912', '4'), +('8', '65', '12', '28246', '16495', '4'), +('8', '65', '12', '27000', '15648', '4'), +('8', '65', '12', '25857', '14903', '4'), +('8', '65', '12', '27990', '12977', '4'), +('8', '65', '18', '28650', '16834', '4'), +('8', '65', '18', '16771', '12587', '4'), +('8', '65', '18', '28965', '9133', '4'), +('8', '65', '18', '28932', '8317', '4'), +('8', '65', '19', '19094', '18981', '4'), +('8', '65', '19', '30569', '16941', '4'), +('8', '65', '19', '25995', '16183', '4'), +('8', '65', '19', '19549', '13649', '4'), +('8', '65', '13', '22986', '28929', '4'), +('8', '65', '13', '22998', '28273', '4'), +('8', '65', '13', '24570', '25867', '4'), +('8', '65', '13', '24695', '25238', '4'), +('8', '65', '14', '22986', '28929', '4'), +('8', '65', '14', '22998', '28273', '4'), +('8', '65', '14', '24570', '25867', '4'), +('8', '65', '14', '24695', '25238', '4'), +('8', '65', '11', '9574', '20076', '4'), +('8', '65', '11', '26987', '18397', '4'), +('8', '65', '11', '20496', '17872', '4'), +('8', '65', '11', '20625', '15000', '4'), +('8', '66', '22', '21810', '0', '7'), +('8', '66', '22', '62787', '0', '7'), +('8', '66', '22', '66397', '0', '7'), +('8', '66', '22', '21805', '0', '7'), +('8', '66', '1', '68949', '28441', '7'), +('8', '66', '1', '68958', '25924', '7'), +('8', '66', '1', '69166', '23594', '7'), +('8', '66', '1', '7125', '22578', '7'), +('8', '66', '2', '28647', '22740', '7'), +('8', '66', '2', '28605', '22546', '7'), +('8', '66', '2', '28648', '22535', '7'), +('8', '66', '2', '69087', '19858', '7'), +('8', '66', '3', '69157', '29603', '7'), +('8', '66', '3', '26982', '21201', '7'), +('8', '66', '3', '69069', '20577', '7'), +('8', '66', '3', '69074', '20231', '7'), +('8', '66', '5', '67625', '24424', '7'), +('8', '66', '5', '69135', '22370', '7'), +('8', '66', '5', '69097', '20830', '7'), +('8', '66', '5', '68950', '20522', '7'), +('8', '66', '8', '69165', '32206', '7'), +('8', '66', '8', '69064', '30660', '7'), +('8', '66', '8', '69072', '29585', '7'), +('8', '66', '8', '69065', '26938', '7'), +('8', '66', '6', '68757', '26587', '7'), +('8', '66', '6', '13674', '24051', '7'), +('8', '66', '6', '69130', '23016', '7'), +('8', '66', '6', '69066', '20938', '7'), +('8', '66', '17', '68748', '25353', '7'), +('8', '66', '17', '69150', '24857', '7'), +('8', '66', '17', '68968', '24826', '7'), +('8', '66', '17', '47643', '21771', '7'), +('8', '66', '7', '69168', '28155', '7'), +('8', '66', '7', '68871', '22267', '7'), +('8', '66', '7', '16097', '19815', '7'), +('8', '66', '7', '69079', '19517', '7'), +('8', '66', '9', '69126', '23194', '7'), +('8', '66', '9', '32100', '22670', '7'), +('8', '66', '9', '68766', '21279', '7'), +('8', '66', '9', '69099', '20761', '7'), +('8', '66', '15', '69131', '29127', '7'), +('8', '66', '15', '68956', '25535', '7'), +('8', '66', '15', '68785', '23395', '7'), +('8', '66', '15', '69160', '22652', '7'), +('8', '66', '20', '16156', '26971', '7'), +('8', '66', '20', '67625', '24424', '7'), +('8', '66', '20', '69134', '24017', '7'), +('8', '66', '20', '68951', '20013', '7'), +('8', '66', '12', '69252', '22765', '7'), +('8', '66', '12', '68872', '20834', '7'), +('8', '66', '12', '69083', '20052', '7'), +('8', '66', '12', '28246', '16496', '7'), +('8', '66', '18', '69146', '24148', '7'), +('8', '66', '18', '68779', '18023', '7'), +('8', '66', '18', '68969', '16839', '7'), +('8', '66', '18', '28650', '16836', '7'), +('8', '66', '19', '69075', '27125', '7'), +('8', '66', '19', '69177', '22298', '7'), +('8', '66', '19', '68873', '21399', '7'), +('8', '66', '19', '19094', '18982', '7'), +('8', '66', '13', '69052', '37783', '7'), +('8', '66', '13', '69040', '37465', '7'), +('8', '66', '13', '69114', '35335', '7'), +('8', '66', '13', '69156', '30730', '7'), +('8', '66', '14', '69052', '37783', '7'), +('8', '66', '14', '69040', '37465', '7'), +('8', '66', '14', '69114', '35335', '7'), +('8', '66', '14', '69156', '30730', '7'), +('8', '66', '11', '67606', '22852', '7'), +('8', '66', '11', '68952', '21422', '7'), +('8', '66', '11', '9574', '20076', '7'), +('8', '66', '11', '68848', '19061', '7'), +('8', '67', '22', '21810', '0', '7'), +('8', '67', '22', '62787', '0', '7'), +('8', '67', '22', '66397', '0', '7'), +('8', '67', '22', '21805', '0', '7'), +('8', '67', '1', '68949', '28443', '7'), +('8', '67', '1', '68958', '25926', '7'), +('8', '67', '1', '69166', '23596', '7'), +('8', '67', '1', '7125', '22579', '7'), +('8', '67', '2', '28647', '22741', '7'), +('8', '67', '2', '28605', '22546', '7'), +('8', '67', '2', '28648', '22536', '7'), +('8', '67', '2', '69087', '19860', '7'), +('8', '67', '3', '69157', '29604', '7'), +('8', '67', '3', '26982', '21202', '7'), +('8', '67', '3', '69069', '20578', '7'), +('8', '67', '3', '69074', '20232', '7'), +('8', '67', '5', '67625', '24425', '7'), +('8', '67', '5', '69135', '22372', '7'), +('8', '67', '5', '69097', '20831', '7'), +('8', '67', '5', '68950', '20523', '7'), +('8', '67', '8', '69165', '32208', '7'), +('8', '67', '8', '69064', '30661', '7'), +('8', '67', '8', '69072', '29586', '7'), +('8', '67', '8', '69065', '26940', '7'), +('8', '67', '6', '68757', '26589', '7'), +('8', '67', '6', '13674', '24052', '7'), +('8', '67', '6', '69130', '23018', '7'), +('8', '67', '6', '69066', '20940', '7'), +('8', '67', '17', '68748', '25354', '7'), +('8', '67', '17', '69150', '24859', '7'), +('8', '67', '17', '68968', '24828', '7'), +('8', '67', '17', '47643', '21772', '7'), +('8', '67', '7', '69168', '28157', '7'), +('8', '67', '7', '68871', '22268', '7'), +('8', '67', '7', '16097', '19816', '7'), +('8', '67', '7', '69079', '19518', '7'), +('8', '67', '9', '69126', '23196', '7'), +('8', '67', '9', '32100', '22671', '7'), +('8', '67', '9', '68766', '21280', '7'), +('8', '67', '9', '69099', '20762', '7'), +('8', '67', '15', '69131', '29128', '7'), +('8', '67', '15', '68956', '25537', '7'), +('8', '67', '15', '68785', '23397', '7'), +('8', '67', '15', '69160', '22653', '7'), +('8', '67', '20', '16156', '26973', '7'), +('8', '67', '20', '67625', '24425', '7'), +('8', '67', '20', '69134', '24018', '7'), +('8', '67', '20', '68951', '20015', '7'), +('8', '67', '12', '69252', '22766', '7'), +('8', '67', '12', '68872', '20835', '7'), +('8', '67', '12', '69083', '20053', '7'), +('8', '67', '12', '28246', '16497', '7'), +('8', '67', '18', '69146', '24149', '7'), +('8', '67', '18', '68779', '18024', '7'), +('8', '67', '18', '68969', '16840', '7'), +('8', '67', '18', '28650', '16837', '7'), +('8', '67', '19', '69075', '27127', '7'), +('8', '67', '19', '69177', '22300', '7'), +('8', '67', '19', '68873', '21400', '7'), +('8', '67', '19', '19094', '18983', '7'), +('8', '67', '13', '69052', '37940', '7'), +('8', '67', '13', '69040', '37508', '7'), +('8', '67', '13', '69114', '35336', '7'), +('8', '67', '13', '69156', '30730', '7'), +('8', '67', '14', '69052', '37940', '7'), +('8', '67', '14', '69040', '37508', '7'), +('8', '67', '14', '69114', '35336', '7'), +('8', '67', '14', '69156', '30730', '7'), +('8', '67', '11', '67606', '22853', '7'), +('8', '67', '11', '68952', '21423', '7'), +('8', '67', '11', '9574', '20077', '7'), +('8', '67', '11', '68848', '19062', '7'), +('8', '68', '22', '21810', '0', '7'), +('8', '68', '22', '62787', '0', '7'), +('8', '68', '22', '66397', '0', '7'), +('8', '68', '22', '21805', '0', '7'), +('8', '68', '1', '68949', '28445', '7'), +('8', '68', '1', '68958', '25928', '7'), +('8', '68', '1', '69166', '23597', '7'), +('8', '68', '1', '7125', '22579', '7'), +('8', '68', '2', '28647', '22742', '7'), +('8', '68', '2', '28605', '22547', '7'), +('8', '68', '2', '28648', '22536', '7'), +('8', '68', '2', '69087', '19861', '7'), +('8', '68', '3', '69157', '29606', '7'), +('8', '68', '3', '26982', '21204', '7'), +('8', '68', '3', '69069', '20579', '7'), +('8', '68', '3', '69074', '20233', '7'), +('8', '68', '5', '67625', '24427', '7'), +('8', '68', '5', '69135', '22374', '7'), +('8', '68', '5', '69097', '20833', '7'), +('8', '68', '5', '68950', '20524', '7'), +('8', '68', '8', '69165', '32209', '7'), +('8', '68', '8', '69064', '30663', '7'), +('8', '68', '8', '69072', '29588', '7'), +('8', '68', '8', '69065', '26941', '7'), +('8', '68', '6', '68757', '26590', '7'), +('8', '68', '6', '13674', '24053', '7'), +('8', '68', '6', '69130', '23019', '7'), +('8', '68', '6', '69066', '20941', '7'), +('8', '68', '17', '68748', '25356', '7'), +('8', '68', '17', '69150', '24861', '7'), +('8', '68', '17', '68968', '24829', '7'), +('8', '68', '17', '47643', '21774', '7'), +('8', '68', '7', '69168', '28158', '7'), +('8', '68', '7', '68871', '22270', '7'), +('8', '68', '7', '16097', '19818', '7'), +('8', '68', '7', '69079', '19519', '7'), +('8', '68', '9', '69126', '23197', '7'), +('8', '68', '9', '32100', '22671', '7'), +('8', '68', '9', '68766', '21281', '7'), +('8', '68', '9', '69099', '20764', '7'), +('8', '68', '15', '69131', '29129', '7'), +('8', '68', '15', '68956', '25538', '7'), +('8', '68', '15', '68785', '23398', '7'), +('8', '68', '15', '69160', '22654', '7'), +('8', '68', '20', '16156', '26974', '7'), +('8', '68', '20', '67625', '24427', '7'), +('8', '68', '20', '69134', '24020', '7'), +('8', '68', '20', '68951', '20016', '7'), +('8', '68', '12', '69252', '22767', '7'), +('8', '68', '12', '68872', '20836', '7'), +('8', '68', '12', '69083', '20054', '7'), +('8', '68', '12', '28246', '16498', '7'), +('8', '68', '18', '69146', '24150', '7'), +('8', '68', '18', '68779', '18025', '7'), +('8', '68', '18', '68969', '16842', '7'), +('8', '68', '18', '28650', '16839', '7'), +('8', '68', '19', '69075', '27128', '7'), +('8', '68', '19', '69177', '22301', '7'), +('8', '68', '19', '68873', '21402', '7'), +('8', '68', '19', '19094', '18984', '7'), +('8', '68', '13', '69052', '38097', '7'), +('8', '68', '13', '69040', '37551', '7'), +('8', '68', '13', '69114', '35338', '7'), +('8', '68', '13', '69156', '30731', '7'), +('8', '68', '14', '69052', '38097', '7'), +('8', '68', '14', '69040', '37551', '7'), +('8', '68', '14', '69114', '35338', '7'), +('8', '68', '14', '69156', '30731', '7'), +('8', '68', '11', '67606', '22855', '7'), +('8', '68', '11', '68952', '21425', '7'), +('8', '68', '11', '9574', '20077', '7'), +('8', '68', '11', '68848', '19064', '7'), +('8', '69', '22', '21810', '0', '7'), +('8', '69', '22', '62787', '0', '7'), +('8', '69', '22', '66397', '0', '7'), +('8', '69', '22', '21805', '0', '7'), +('8', '69', '1', '68949', '28446', '7'), +('8', '69', '1', '68958', '25929', '7'), +('8', '69', '1', '69166', '23598', '7'), +('8', '69', '1', '7125', '22580', '7'), +('8', '69', '2', '28647', '22744', '7'), +('8', '69', '2', '28605', '22547', '7'), +('8', '69', '2', '28648', '22537', '7'), +('8', '69', '2', '69087', '19863', '7'), +('8', '69', '3', '69157', '29607', '7'), +('8', '69', '3', '26982', '21205', '7'), +('8', '69', '3', '69069', '20580', '7'), +('8', '69', '3', '69074', '20235', '7'), +('8', '69', '5', '67625', '24428', '7'), +('8', '69', '5', '69135', '22375', '7'), +('8', '69', '5', '69097', '20835', '7'), +('8', '69', '5', '68950', '20525', '7'), +('8', '69', '8', '69165', '32211', '7'), +('8', '69', '8', '69064', '30664', '7'), +('8', '69', '8', '69072', '29589', '7'), +('8', '69', '8', '69065', '26942', '7'), +('8', '69', '6', '68757', '26591', '7'), +('8', '69', '6', '13674', '24054', '7'), +('8', '69', '6', '69130', '23020', '7'), +('8', '69', '6', '69066', '20942', '7'), +('8', '69', '17', '68748', '25357', '7'), +('8', '69', '17', '69150', '24862', '7'), +('8', '69', '17', '68968', '24830', '7'), +('8', '69', '17', '47643', '21775', '7'), +('8', '69', '7', '69168', '28159', '7'), +('8', '69', '7', '68871', '22272', '7'), +('8', '69', '7', '16097', '19819', '7'), +('8', '69', '7', '69079', '19520', '7'), +('8', '69', '9', '69126', '23199', '7'), +('8', '69', '9', '32100', '22672', '7'), +('8', '69', '9', '68766', '21282', '7'), +('8', '69', '9', '69099', '20765', '7'), +('8', '69', '15', '69131', '29130', '7'), +('8', '69', '15', '68956', '25540', '7'), +('8', '69', '15', '68785', '23399', '7'), +('8', '69', '15', '69160', '22654', '7'), +('8', '69', '20', '16156', '26975', '7'), +('8', '69', '20', '67625', '24428', '7'), +('8', '69', '20', '69134', '24022', '7'), +('8', '69', '20', '68951', '20018', '7'), +('8', '69', '12', '69252', '22769', '7'), +('8', '69', '12', '68872', '20837', '7'), +('8', '69', '12', '69083', '20055', '7'), +('8', '69', '12', '28246', '16499', '7'), +('8', '69', '18', '69146', '24151', '7'), +('8', '69', '18', '68779', '18027', '7'), +('8', '69', '18', '68969', '16843', '7'), +('8', '69', '18', '28650', '16840', '7'), +('8', '69', '19', '69075', '27130', '7'), +('8', '69', '19', '69177', '22303', '7'), +('8', '69', '19', '68873', '21403', '7'), +('8', '69', '19', '19094', '18984', '7'), +('8', '69', '13', '69052', '38254', '7'), +('8', '69', '13', '69040', '37594', '7'), +('8', '69', '13', '69114', '35339', '7'), +('8', '69', '13', '69156', '30732', '7'), +('8', '69', '14', '69052', '38254', '7'), +('8', '69', '14', '69040', '37594', '7'), +('8', '69', '14', '69114', '35339', '7'), +('8', '69', '14', '69156', '30732', '7'), +('8', '69', '11', '67606', '22856', '7'), +('8', '69', '11', '68952', '21426', '7'), +('8', '69', '11', '9574', '20078', '7'), +('8', '69', '11', '68848', '19065', '7'), +('8', '70', '22', '66397', '0', '11'), +('8', '70', '22', '62787', '0', '11'), +('8', '70', '22', '61948', '0', '11'), +('8', '70', '22', '21805', '0', '11'), +('8', '70', '1', '39276', '37403', '11'), +('8', '70', '1', '83594', '36475', '11'), +('8', '70', '1', '39282', '35664', '11'), +('8', '70', '1', '39343', '30490', '11'), +('8', '70', '2', '83560', '34184', '11'), +('8', '70', '2', '70902', '31692', '11'), +('8', '70', '2', '39222', '25415', '11'), +('8', '70', '2', '83494', '23262', '11'), +('8', '70', '3', '39347', '39210', '11'), +('8', '70', '3', '47245', '38523', '11'), +('8', '70', '3', '71667', '34042', '11'), +('8', '70', '3', '39218', '33940', '11'), +('8', '70', '5', '39349', '39558', '11'), +('8', '70', '5', '39359', '31326', '11'), +('8', '70', '5', '39313', '28613', '11'), +('8', '70', '5', '39262', '28418', '11'), +('8', '70', '8', '39330', '37447', '11'), +('8', '70', '8', '47305', '32734', '11'), +('8', '70', '8', '69165', '32212', '11'), +('8', '70', '8', '69064', '30666', '11'), +('8', '70', '6', '39337', '39153', '11'), +('8', '70', '6', '39327', '35773', '11'), +('8', '70', '6', '83635', '34270', '11'), +('8', '70', '6', '39367', '34132', '11'), +('8', '70', '17', '83603', '49592', '11'), +('8', '70', '17', '70907', '34123', '11'), +('8', '70', '17', '70701', '31768', '11'), +('8', '70', '17', '39935', '26047', '11'), +('8', '70', '7', '47204', '29313', '11'), +('8', '70', '7', '83564', '28433', '11'), +('8', '70', '7', '39267', '28248', '11'), +('8', '70', '7', '69168', '28161', '11'), +('8', '70', '9', '39335', '39288', '11'), +('8', '70', '9', '51706', '30134', '11'), +('8', '70', '9', '83652', '29862', '11'), +('8', '70', '9', '39291', '28783', '11'), +('8', '70', '15', '83458', '34066', '11'), +('8', '70', '15', '39374', '30262', '11'), +('8', '70', '15', '51703', '29669', '11'), +('8', '70', '15', '83661', '29517', '11'), +('8', '70', '20', '39365', '34276', '11'), +('8', '70', '20', '47283', '33493', '11'), +('8', '70', '20', '39339', '31287', '11'), +('8', '70', '20', '71657', '31021', '11'), +('8', '70', '12', '47212', '36605', '11'), +('8', '70', '12', '83568', '34222', '11'), +('8', '70', '12', '70905', '27907', '11'), +('8', '70', '12', '71075', '26544', '11'), +('8', '70', '18', '70908', '32307', '11'), +('8', '70', '18', '83607', '31848', '11'), +('8', '70', '18', '71646', '29173', '11'), +('8', '70', '18', '69146', '24153', '11'), +('8', '70', '19', '39355', '31292', '11'), +('8', '70', '19', '83550', '30459', '11'), +('8', '70', '19', '70906', '28907', '11'), +('8', '70', '19', '47216', '28762', '11'), +('8', '70', '13', '83639', '50088', '11'), +('8', '70', '13', '47312', '45899', '11'), +('8', '70', '13', '39323', '42088', '11'), +('8', '70', '13', '47314', '40224', '11'), +('8', '70', '14', '83639', '50088', '11'), +('8', '70', '14', '47312', '45899', '11'), +('8', '70', '14', '39323', '42088', '11'), +('8', '70', '14', '47314', '40224', '11'), +('8', '70', '11', '39371', '42334', '11'), +('8', '70', '11', '39311', '37796', '11'), +('8', '70', '11', '83657', '37632', '11'), +('8', '70', '11', '47297', '32318', '11'), +('8', '70', '22', '62787', '0', '10'), +('8', '70', '22', '21810', '0', '10'), +('8', '70', '22', '66397', '0', '10'), +('8', '70', '22', '61948', '0', '10'), +('8', '70', '1', '83594', '36475', '10'), +('8', '70', '1', '71624', '30246', '10'), +('8', '70', '1', '83546', '30000', '10'), +('8', '70', '1', '83630', '28517', '10'), +('8', '70', '2', '83560', '34184', '10'), +('8', '70', '2', '70902', '31692', '10'), +('8', '70', '2', '83494', '23262', '10'), +('8', '70', '2', '28647', '22745', '10'), +('8', '70', '3', '47245', '38523', '10'), +('8', '70', '3', '71667', '34042', '10'), +('8', '70', '3', '83658', '29983', '10'), +('8', '70', '3', '69157', '29608', '10'), +('8', '70', '5', '83651', '28144', '10'), +('8', '70', '5', '83599', '27369', '10'), +('8', '70', '5', '89308', '26423', '10'), +('8', '70', '5', '47275', '26168', '10'), +('8', '70', '8', '47305', '32734', '10'), +('8', '70', '8', '69165', '32212', '10'), +('8', '70', '8', '69064', '30666', '10'), +('8', '70', '8', '83659', '30408', '10'), +('8', '70', '6', '83635', '34270', '10'), +('8', '70', '6', '47278', '32714', '10'), +('8', '70', '6', '70717', '31995', '10'), +('8', '70', '6', '83660', '29789', '10'), +('8', '70', '17', '83603', '49592', '10'), +('8', '70', '17', '70907', '34123', '10'), +('8', '70', '17', '70701', '31768', '10'), +('8', '70', '17', '68748', '25359', '10'), +('8', '70', '7', '47204', '29313', '10'), +('8', '70', '7', '83564', '28433', '10'), +('8', '70', '7', '69168', '28161', '10'), +('8', '70', '7', '71074', '24800', '10'), +('8', '70', '9', '83652', '29862', '10'), +('8', '70', '9', '83534', '28251', '10'), +('8', '70', '9', '70619', '24163', '10'), +('8', '70', '9', '83462', '23411', '10'), +('8', '70', '15', '83458', '34066', '10'), +('8', '70', '15', '83661', '29517', '10'), +('8', '70', '15', '47237', '29486', '10'), +('8', '70', '15', '69131', '29131', '10'), +('8', '70', '20', '47283', '33493', '10'), +('8', '70', '20', '71657', '31021', '10'), +('8', '70', '20', '83533', '30339', '10'), +('8', '70', '20', '83650', '28837', '10'), +('8', '70', '12', '47212', '36605', '10'), +('8', '70', '12', '83568', '34222', '10'), +('8', '70', '12', '70905', '27907', '10'), +('8', '70', '12', '71075', '26544', '10'), +('8', '70', '18', '70908', '32307', '10'), +('8', '70', '18', '83607', '31848', '10'), +('8', '70', '18', '71646', '29173', '10'), +('8', '70', '18', '69146', '24153', '10'), +('8', '70', '19', '83550', '30459', '10'), +('8', '70', '19', '70906', '28907', '10'), +('8', '70', '19', '47216', '28762', '10'), +('8', '70', '19', '83572', '28145', '10'), +('8', '70', '13', '83639', '50088', '10'), +('8', '70', '13', '47312', '45899', '10'), +('8', '70', '13', '47314', '40224', '10'), +('8', '70', '13', '69052', '39504', '10'), +('8', '70', '14', '83639', '50088', '10'), +('8', '70', '14', '47312', '45899', '10'), +('8', '70', '14', '47314', '40224', '10'), +('8', '70', '14', '69052', '39504', '10'), +('8', '70', '11', '83657', '37632', '10'), +('8', '70', '11', '47297', '32318', '10'), +('8', '70', '11', '83619', '31843', '10'), +('8', '70', '11', '47296', '31456', '10'), +('8', '70', '22', '21810', '0', '9'), +('8', '70', '22', '62787', '0', '9'), +('8', '70', '22', '66397', '0', '9'), +('8', '70', '22', '21805', '0', '9'), +('8', '70', '1', '71624', '30246', '9'), +('8', '70', '1', '68949', '28448', '9'), +('8', '70', '1', '71668', '26322', '9'), +('8', '70', '1', '47287', '26029', '9'), +('8', '70', '2', '70902', '31692', '9'), +('8', '70', '2', '28647', '22745', '9'), +('8', '70', '2', '28605', '22547', '9'), +('8', '70', '2', '47208', '22539', '9'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '70', '3', '47245', '38523', '9'), +('8', '70', '3', '71667', '34042', '9'), +('8', '70', '3', '69157', '29608', '9'), +('8', '70', '3', '47299', '25295', '9'), +('8', '70', '5', '47275', '26168', '9'), +('8', '70', '5', '47273', '25403', '9'), +('8', '70', '5', '67625', '24430', '9'), +('8', '70', '5', '47274', '24053', '9'), +('8', '70', '8', '47305', '32734', '9'), +('8', '70', '8', '69165', '32212', '9'), +('8', '70', '8', '69064', '30666', '9'), +('8', '70', '8', '69072', '29590', '9'), +('8', '70', '6', '47278', '32714', '9'), +('8', '70', '6', '70717', '31995', '9'), +('8', '70', '6', '68757', '26592', '9'), +('8', '70', '6', '47279', '24444', '9'), +('8', '70', '17', '70907', '34123', '9'), +('8', '70', '17', '70701', '31768', '9'), +('8', '70', '17', '68748', '25359', '9'), +('8', '70', '17', '71093', '25149', '9'), +('8', '70', '7', '47204', '29313', '9'), +('8', '70', '7', '69168', '28161', '9'), +('8', '70', '7', '71074', '24800', '9'), +('8', '70', '7', '70903', '22683', '9'), +('8', '70', '9', '70619', '24163', '9'), +('8', '70', '9', '69126', '23201', '9'), +('8', '70', '9', '32100', '22673', '9'), +('8', '70', '9', '47220', '22388', '9'), +('8', '70', '15', '47237', '29486', '9'), +('8', '70', '15', '69131', '29131', '9'), +('8', '70', '15', '70621', '27589', '9'), +('8', '70', '15', '71117', '27177', '9'), +('8', '70', '20', '47283', '33493', '9'), +('8', '70', '20', '71657', '31021', '9'), +('8', '70', '20', '16156', '26977', '9'), +('8', '70', '20', '47282', '25696', '9'), +('8', '70', '12', '47212', '36605', '9'), +('8', '70', '12', '70905', '27907', '9'), +('8', '70', '12', '71075', '26544', '9'), +('8', '70', '12', '69252', '22770', '9'), +('8', '70', '18', '70908', '32307', '9'), +('8', '70', '18', '71646', '29173', '9'), +('8', '70', '18', '69146', '24153', '9'), +('8', '70', '18', '47200', '24005', '9'), +('8', '70', '19', '70906', '28907', '9'), +('8', '70', '19', '47216', '28762', '9'), +('8', '70', '19', '69075', '27132', '9'), +('8', '70', '19', '71076', '25581', '9'), +('8', '70', '13', '47312', '45899', '9'), +('8', '70', '13', '47314', '40224', '9'), +('8', '70', '13', '69052', '39504', '9'), +('8', '70', '13', '69040', '37929', '9'), +('8', '70', '14', '47312', '45899', '9'), +('8', '70', '14', '47314', '40224', '9'), +('8', '70', '14', '69052', '39504', '9'), +('8', '70', '14', '69040', '37929', '9'), +('8', '70', '11', '47297', '32318', '9'), +('8', '70', '11', '47296', '31456', '9'), +('8', '70', '11', '47295', '25751', '9'), +('8', '70', '11', '71659', '24091', '9'), +('8', '70', '22', '21810', '0', '8'), +('8', '70', '22', '62787', '0', '8'), +('8', '70', '22', '66397', '0', '8'), +('8', '70', '22', '21805', '0', '8'), +('8', '70', '1', '68949', '28448', '8'), +('8', '70', '1', '47287', '26029', '8'), +('8', '70', '1', '68958', '25931', '8'), +('8', '70', '1', '47289', '24918', '8'), +('8', '70', '2', '70902', '31692', '8'), +('8', '70', '2', '28647', '22745', '8'), +('8', '70', '2', '28605', '22547', '8'), +('8', '70', '2', '47208', '22539', '8'), +('8', '70', '3', '47245', '38523', '8'), +('8', '70', '3', '69157', '29608', '8'), +('8', '70', '3', '47299', '25295', '8'), +('8', '70', '3', '47300', '24266', '8'), +('8', '70', '5', '47275', '26168', '8'), +('8', '70', '5', '47273', '25403', '8'), +('8', '70', '5', '67625', '24430', '8'), +('8', '70', '5', '47274', '24053', '8'), +('8', '70', '8', '47305', '32734', '8'), +('8', '70', '8', '69165', '32212', '8'), +('8', '70', '8', '69064', '30666', '8'), +('8', '70', '8', '69072', '29590', '8'), +('8', '70', '6', '47278', '32714', '8'), +('8', '70', '6', '70717', '31995', '8'), +('8', '70', '6', '68757', '26592', '8'), +('8', '70', '6', '47279', '24444', '8'), +('8', '70', '17', '70907', '34123', '8'), +('8', '70', '17', '70701', '31768', '8'), +('8', '70', '17', '68748', '25359', '8'), +('8', '70', '17', '71093', '25149', '8'), +('8', '70', '7', '47204', '29313', '8'), +('8', '70', '7', '69168', '28161', '8'), +('8', '70', '7', '71074', '24800', '8'), +('8', '70', '7', '70903', '22683', '8'), +('8', '70', '9', '70619', '24163', '8'), +('8', '70', '9', '69126', '23201', '8'), +('8', '70', '9', '32100', '22673', '8'), +('8', '70', '9', '47220', '22388', '8'), +('8', '70', '15', '47237', '29486', '8'), +('8', '70', '15', '69131', '29131', '8'), +('8', '70', '15', '70621', '27589', '8'), +('8', '70', '15', '71117', '27177', '8'), +('8', '70', '20', '47283', '33493', '8'), +('8', '70', '20', '16156', '26977', '8'), +('8', '70', '20', '47282', '25696', '8'), +('8', '70', '20', '70604', '25082', '8'), +('8', '70', '12', '47212', '36605', '8'), +('8', '70', '12', '70905', '27907', '8'), +('8', '70', '12', '71075', '26544', '8'), +('8', '70', '12', '69252', '22770', '8'), +('8', '70', '18', '70908', '32307', '8'), +('8', '70', '18', '69146', '24153', '8'), +('8', '70', '18', '47200', '24005', '8'), +('8', '70', '18', '71094', '20079', '8'), +('8', '70', '19', '70906', '28907', '8'), +('8', '70', '19', '47216', '28762', '8'), +('8', '70', '19', '69075', '27132', '8'), +('8', '70', '19', '71076', '25581', '8'), +('8', '70', '13', '47312', '45826', '8'), +('8', '70', '13', '47314', '40130', '8'), +('8', '70', '13', '69052', '39192', '8'), +('8', '70', '13', '69040', '37846', '8'), +('8', '70', '14', '47312', '45826', '8'), +('8', '70', '14', '47314', '40130', '8'), +('8', '70', '14', '69052', '39192', '8'), +('8', '70', '14', '69040', '37846', '8'), +('8', '70', '11', '47297', '32318', '8'), +('8', '70', '11', '47296', '31456', '8'), +('8', '70', '11', '47295', '25751', '8'), +('8', '70', '11', '67606', '22857', '8'), +('8', '71', '22', '66397', '0', '11'), +('8', '71', '22', '62787', '0', '11'), +('8', '71', '22', '61948', '0', '11'), +('8', '71', '22', '21805', '0', '11'), +('8', '71', '1', '39276', '37404', '11'), +('8', '71', '1', '83594', '36477', '11'), +('8', '71', '1', '39282', '35665', '11'), +('8', '71', '1', '39343', '30492', '11'), +('8', '71', '2', '83560', '34187', '11'), +('8', '71', '2', '70902', '31693', '11'), +('8', '71', '2', '39222', '25417', '11'), +('8', '71', '2', '83494', '23263', '11'), +('8', '71', '3', '39347', '39212', '11'), +('8', '71', '3', '47245', '38523', '11'), +('8', '71', '3', '71667', '34043', '11'), +('8', '71', '3', '39218', '33941', '11'), +('8', '71', '5', '39349', '39560', '11'), +('8', '71', '5', '39359', '31327', '11'), +('8', '71', '5', '39313', '28615', '11'), +('8', '71', '5', '39262', '28420', '11'), +('8', '71', '8', '39330', '37448', '11'), +('8', '71', '8', '47305', '32735', '11'), +('8', '71', '8', '69165', '32214', '11'), +('8', '71', '8', '69064', '30667', '11'), +('8', '71', '6', '39337', '39155', '11'), +('8', '71', '6', '39327', '35774', '11'), +('8', '71', '6', '83635', '34272', '11'), +('8', '71', '6', '39367', '34133', '11'), +('8', '71', '17', '83603', '49595', '11'), +('8', '71', '17', '70907', '34125', '11'), +('8', '71', '17', '70701', '31770', '11'), +('8', '71', '17', '39935', '26047', '11'), +('8', '71', '7', '47204', '29314', '11'), +('8', '71', '7', '83564', '28435', '11'), +('8', '71', '7', '39267', '28250', '11'), +('8', '71', '7', '69168', '28162', '11'), +('8', '71', '9', '39335', '39290', '11'), +('8', '71', '9', '51706', '30136', '11'), +('8', '71', '9', '83652', '29864', '11'), +('8', '71', '9', '39291', '28785', '11'), +('8', '71', '15', '83458', '34067', '11'), +('8', '71', '15', '39374', '30265', '11'), +('8', '71', '15', '51703', '29671', '11'), +('8', '71', '15', '83661', '29519', '11'), +('8', '71', '20', '39365', '34278', '11'), +('8', '71', '20', '47283', '33494', '11'), +('8', '71', '20', '39339', '31289', '11'), +('8', '71', '20', '71657', '31022', '11'), +('8', '71', '12', '47212', '36607', '11'), +('8', '71', '12', '83568', '34224', '11'), +('8', '71', '12', '70905', '27908', '11'), +('8', '71', '12', '71075', '26546', '11'), +('8', '71', '18', '70908', '32309', '11'), +('8', '71', '18', '83607', '31850', '11'), +('8', '71', '18', '71646', '29175', '11'), +('8', '71', '18', '69146', '24154', '11'), +('8', '71', '19', '39355', '31294', '11'), +('8', '71', '19', '83550', '30461', '11'), +('8', '71', '19', '70906', '28908', '11'), +('8', '71', '19', '47216', '28763', '11'), +('8', '71', '13', '83639', '50272', '11'), +('8', '71', '13', '47312', '45937', '11'), +('8', '71', '13', '39323', '42135', '11'), +('8', '71', '13', '47314', '40272', '11'), +('8', '71', '14', '83639', '50272', '11'), +('8', '71', '14', '47312', '45937', '11'), +('8', '71', '14', '39323', '42135', '11'), +('8', '71', '14', '47314', '40272', '11'), +('8', '71', '11', '39371', '42335', '11'), +('8', '71', '11', '39311', '37798', '11'), +('8', '71', '11', '83657', '37634', '11'), +('8', '71', '11', '47297', '32320', '11'), +('8', '72', '22', '66397', '0', '11'), +('8', '72', '22', '62787', '0', '11'), +('8', '72', '22', '61948', '0', '11'), +('8', '72', '22', '21805', '0', '11'), +('8', '72', '1', '39276', '37406', '11'), +('8', '72', '1', '83594', '36479', '11'), +('8', '72', '1', '39282', '35667', '11'), +('8', '72', '1', '39343', '30494', '11'), +('8', '72', '2', '83560', '34189', '11'), +('8', '72', '2', '70902', '31694', '11'), +('8', '72', '2', '39222', '25418', '11'), +('8', '72', '2', '83494', '23265', '11'), +('8', '72', '3', '39347', '39214', '11'), +('8', '72', '3', '47245', '38524', '11'), +('8', '72', '3', '71667', '34044', '11'), +('8', '72', '3', '39218', '33943', '11'), +('8', '72', '5', '39349', '39561', '11'), +('8', '72', '5', '39359', '31329', '11'), +('8', '72', '5', '39313', '28617', '11'), +('8', '72', '5', '39262', '28421', '11'), +('8', '72', '8', '39330', '37449', '11'), +('8', '72', '8', '47305', '32735', '11'), +('8', '72', '8', '69165', '32215', '11'), +('8', '72', '8', '69064', '30669', '11'), +('8', '72', '6', '39337', '39156', '11'), +('8', '72', '6', '39327', '35775', '11'), +('8', '72', '6', '83635', '34274', '11'), +('8', '72', '6', '39367', '34134', '11'), +('8', '72', '17', '83603', '49597', '11'), +('8', '72', '17', '70907', '34127', '11'), +('8', '72', '17', '70701', '31772', '11'), +('8', '72', '17', '39935', '26048', '11'), +('8', '72', '7', '47204', '29315', '11'), +('8', '72', '7', '83564', '28438', '11'), +('8', '72', '7', '39267', '28252', '11'), +('8', '72', '7', '69168', '28164', '11'), +('8', '72', '9', '39335', '39292', '11'), +('8', '72', '9', '51706', '30138', '11'), +('8', '72', '9', '83652', '29865', '11'), +('8', '72', '9', '39291', '28787', '11'), +('8', '72', '15', '83458', '34069', '11'), +('8', '72', '15', '39374', '30267', '11'), +('8', '72', '15', '51703', '29673', '11'), +('8', '72', '15', '83661', '29521', '11'), +('8', '72', '20', '39365', '34280', '11'), +('8', '72', '20', '47283', '33494', '11'), +('8', '72', '20', '39339', '31290', '11'), +('8', '72', '20', '71657', '31022', '11'), +('8', '72', '12', '47212', '36609', '11'), +('8', '72', '12', '83568', '34227', '11'), +('8', '72', '12', '70905', '27909', '11'), +('8', '72', '12', '71075', '26547', '11'), +('8', '72', '18', '70908', '32311', '11'), +('8', '72', '18', '83607', '31852', '11'), +('8', '72', '18', '71646', '29176', '11'), +('8', '72', '18', '69146', '24155', '11'), +('8', '72', '19', '39355', '31296', '11'), +('8', '72', '19', '83550', '30462', '11'), +('8', '72', '19', '70906', '28909', '11'), +('8', '72', '19', '47216', '28765', '11'), +('8', '72', '13', '83639', '50457', '11'), +('8', '72', '13', '47312', '45975', '11'), +('8', '72', '13', '39323', '42183', '11'), +('8', '72', '13', '47314', '40320', '11'), +('8', '72', '14', '83639', '50457', '11'), +('8', '72', '14', '47312', '45975', '11'), +('8', '72', '14', '39323', '42183', '11'), +('8', '72', '14', '47314', '40320', '11'), +('8', '72', '11', '39371', '42337', '11'), +('8', '72', '11', '39311', '37800', '11'), +('8', '72', '11', '83657', '37636', '11'), +('8', '72', '11', '47297', '32321', '11'), +('8', '73', '22', '66397', '0', '11'), +('8', '73', '22', '62787', '0', '11'), +('8', '73', '22', '61948', '0', '11'), +('8', '73', '22', '21805', '0', '11'), +('8', '73', '1', '39276', '37407', '11'), +('8', '73', '1', '83594', '36480', '11'), +('8', '73', '1', '39282', '35668', '11'), +('8', '73', '1', '39343', '30496', '11'), +('8', '73', '2', '83560', '34192', '11'), +('8', '73', '2', '70902', '31695', '11'), +('8', '73', '2', '39222', '25420', '11'), +('8', '73', '2', '83494', '23266', '11'), +('8', '73', '3', '39347', '39216', '11'), +('8', '73', '3', '47245', '38525', '11'), +('8', '73', '3', '71667', '34044', '11'), +('8', '73', '3', '39218', '33944', '11'), +('8', '73', '5', '39349', '39563', '11'), +('8', '73', '5', '39359', '31330', '11'), +('8', '73', '5', '39313', '28619', '11'), +('8', '73', '5', '39262', '28423', '11'), +('8', '73', '8', '39330', '37450', '11'), +('8', '73', '8', '47305', '32736', '11'), +('8', '73', '8', '69165', '32217', '11'), +('8', '73', '8', '69064', '30670', '11'), +('8', '73', '6', '39337', '39158', '11'), +('8', '73', '6', '39327', '35776', '11'), +('8', '73', '6', '83635', '34276', '11'), +('8', '73', '6', '39367', '34135', '11'), +('8', '73', '17', '83603', '49599', '11'), +('8', '73', '17', '70907', '34129', '11'), +('8', '73', '17', '70701', '31774', '11'), +('8', '73', '17', '39935', '26049', '11'), +('8', '73', '7', '47204', '29316', '11'), +('8', '73', '7', '83564', '28440', '11'), +('8', '73', '7', '39267', '28253', '11'), +('8', '73', '7', '69168', '28165', '11'), +('8', '73', '9', '39335', '39294', '11'), +('8', '73', '9', '51706', '30140', '11'), +('8', '73', '9', '83652', '29867', '11'), +('8', '73', '9', '39291', '28788', '11'), +('8', '73', '15', '83458', '34070', '11'), +('8', '73', '15', '39374', '30269', '11'), +('8', '73', '15', '51703', '29675', '11'), +('8', '73', '15', '83661', '29523', '11'), +('8', '73', '20', '39365', '34282', '11'), +('8', '73', '20', '47283', '33495', '11'), +('8', '73', '20', '39339', '31292', '11'), +('8', '73', '20', '71657', '31023', '11'), +('8', '73', '12', '47212', '36610', '11'), +('8', '73', '12', '83568', '34229', '11'), +('8', '73', '12', '70905', '27910', '11'), +('8', '73', '12', '71075', '26548', '11'), +('8', '73', '18', '70908', '32312', '11'), +('8', '73', '18', '83607', '31854', '11'), +('8', '73', '18', '71646', '29177', '11'), +('8', '73', '18', '69146', '24156', '11'), +('8', '73', '19', '39355', '31298', '11'), +('8', '73', '19', '83550', '30464', '11'), +('8', '73', '19', '70906', '28910', '11'), +('8', '73', '19', '47216', '28767', '11'), +('8', '73', '13', '83639', '50642', '11'), +('8', '73', '13', '47312', '46013', '11'), +('8', '73', '13', '39323', '42231', '11'), +('8', '73', '13', '47314', '40368', '11'), +('8', '73', '14', '83639', '50642', '11'), +('8', '73', '14', '47312', '46013', '11'), +('8', '73', '14', '39323', '42231', '11'), +('8', '73', '14', '47314', '40368', '11'), +('8', '73', '11', '39371', '42339', '11'), +('8', '73', '11', '39311', '37802', '11'), +('8', '73', '11', '83657', '37638', '11'), +('8', '73', '11', '47297', '32322', '11'), +('8', '74', '22', '66397', '0', '11'), +('8', '74', '22', '62787', '0', '11'), +('8', '74', '22', '61948', '0', '11'), +('8', '74', '22', '21805', '0', '11'), +('8', '74', '1', '39276', '37408', '11'), +('8', '74', '1', '83594', '36482', '11'), +('8', '74', '1', '39282', '35670', '11'), +('8', '74', '1', '39343', '30498', '11'), +('8', '74', '2', '83560', '34194', '11'), +('8', '74', '2', '70902', '31696', '11'), +('8', '74', '2', '39222', '25421', '11'), +('8', '74', '2', '83494', '23268', '11'), +('8', '74', '3', '39347', '39218', '11'), +('8', '74', '3', '47245', '38525', '11'), +('8', '74', '3', '71667', '34045', '11'), +('8', '74', '3', '39218', '33946', '11'), +('8', '74', '5', '39349', '39564', '11'), +('8', '74', '5', '39359', '31332', '11'), +('8', '74', '5', '39313', '28621', '11'), +('8', '74', '5', '39262', '28424', '11'), +('8', '74', '8', '39330', '37451', '11'), +('8', '74', '8', '47305', '32737', '11'), +('8', '74', '8', '69165', '32218', '11'), +('8', '74', '8', '69064', '30672', '11'), +('8', '74', '6', '39337', '39159', '11'), +('8', '74', '6', '39327', '35777', '11'), +('8', '74', '6', '83635', '34278', '11'), +('8', '74', '6', '39367', '34136', '11'), +('8', '74', '17', '83603', '49601', '11'), +('8', '74', '17', '70907', '34131', '11'), +('8', '74', '17', '70701', '31776', '11'), +('8', '74', '17', '39935', '26050', '11'), +('8', '74', '7', '47204', '29318', '11'), +('8', '74', '7', '83564', '28443', '11'), +('8', '74', '7', '39267', '28255', '11'), +('8', '74', '7', '69168', '28167', '11'), +('8', '74', '9', '39335', '39296', '11'), +('8', '74', '9', '51706', '30142', '11'), +('8', '74', '9', '83652', '29868', '11'), +('8', '74', '9', '39291', '28790', '11'), +('8', '74', '15', '83458', '34072', '11'), +('8', '74', '15', '39374', '30271', '11'), +('8', '74', '15', '51703', '29677', '11'), +('8', '74', '15', '83661', '29525', '11'), +('8', '74', '20', '39365', '34284', '11'), +('8', '74', '20', '47283', '33495', '11'), +('8', '74', '20', '39339', '31293', '11'), +('8', '74', '20', '71657', '31024', '11'), +('8', '74', '12', '47212', '36612', '11'), +('8', '74', '12', '83568', '34232', '11'), +('8', '74', '12', '70905', '27911', '11'), +('8', '74', '12', '71075', '26549', '11'), +('8', '74', '18', '70908', '32314', '11'), +('8', '74', '18', '83607', '31856', '11'), +('8', '74', '18', '71646', '29179', '11'), +('8', '74', '18', '69146', '24157', '11'), +('8', '74', '19', '39355', '31300', '11'), +('8', '74', '19', '83550', '30465', '11'), +('8', '74', '19', '70906', '28911', '11'), +('8', '74', '19', '47216', '28769', '11'), +('8', '74', '13', '83639', '50827', '11'), +('8', '74', '13', '47312', '46051', '11'), +('8', '74', '13', '39323', '42278', '11'), +('8', '74', '13', '47314', '40416', '11'), +('8', '74', '14', '83639', '50827', '11'), +('8', '74', '14', '47312', '46051', '11'), +('8', '74', '14', '39323', '42278', '11'), +('8', '74', '14', '47314', '40416', '11'), +('8', '74', '11', '39371', '42341', '11'), +('8', '74', '11', '39311', '37804', '11'), +('8', '74', '11', '83657', '37640', '11'), +('8', '74', '11', '47297', '32324', '11'), +('8', '75', '22', '61948', '0', '13'), +('8', '75', '22', '66397', '0', '13'), +('8', '75', '22', '62787', '0', '13'), +('8', '75', '22', '21805', '0', '13'), +('8', '75', '1', '80676', '46605', '13'), +('8', '75', '1', '80659', '45626', '13'), +('8', '75', '1', '80648', '43484', '13'), +('8', '75', '1', '80639', '42456', '13'), +('8', '75', '2', '80552', '47770', '13'), +('8', '75', '2', '83560', '34197', '13'), +('8', '75', '2', '53410', '32668', '13'), +('8', '75', '2', '70902', '31697', '13'), +('8', '75', '3', '80637', '43549', '13'), +('8', '75', '3', '39347', '39220', '13'), +('8', '75', '3', '47245', '38526', '13'), +('8', '75', '3', '46924', '37343', '13'), +('8', '75', '5', '46867', '47175', '13'), +('8', '75', '5', '80670', '47062', '13'), +('8', '75', '5', '46918', '46557', '13'), +('8', '75', '5', '80616', '41499', '13'), +('8', '75', '8', '46885', '50715', '13'), +('8', '75', '8', '80677', '47907', '13'), +('8', '75', '8', '80649', '42471', '13'), +('8', '75', '8', '46908', '41530', '13'), +('8', '75', '6', '80638', '52533', '13'), +('8', '75', '6', '46933', '40769', '13'), +('8', '75', '6', '46884', '40580', '13'), +('8', '75', '6', '46883', '40433', '13'), +('8', '75', '17', '83603', '49603', '13'), +('8', '75', '17', '80555', '43360', '13'), +('8', '75', '17', '53415', '34376', '13'), +('8', '75', '17', '70907', '34133', '13'), +('8', '75', '7', '80553', '40573', '13'), +('8', '75', '7', '53411', '32570', '13'), +('8', '75', '7', '47204', '29319', '13'), +('8', '75', '7', '83564', '28445', '13'), +('8', '75', '9', '46887', '41072', '13'), +('8', '75', '9', '39335', '39298', '13'), +('8', '75', '9', '80549', '36492', '13'), +('8', '75', '9', '53412', '32723', '13'), +('8', '75', '15', '79909', '48605', '13'), +('8', '75', '15', '80667', '47785', '13'), +('8', '75', '15', '80686', '46987', '13'), +('8', '75', '15', '80671', '46702', '13'), +('8', '75', '20', '80678', '56927', '13'), +('8', '75', '20', '46935', '41952', '13'), +('8', '75', '20', '80620', '40677', '13'), +('8', '75', '20', '46870', '37428', '13'), +('8', '75', '12', '80550', '44710', '13'), +('8', '75', '12', '53413', '41206', '13'), +('8', '75', '12', '47212', '36614', '13'), +('8', '75', '12', '83568', '34234', '13'), +('8', '75', '18', '80554', '40983', '13'), +('8', '75', '18', '53416', '33692', '13'), +('8', '75', '18', '70908', '32316', '13'), +('8', '75', '18', '83607', '31859', '13'), +('8', '75', '19', '53414', '40651', '13'), +('8', '75', '19', '80551', '38815', '13'), +('8', '75', '19', '39355', '31302', '13'), +('8', '75', '19', '83550', '30467', '13'), +('8', '75', '13', '46856', '60727', '13'), +('8', '75', '13', '46854', '60427', '13'), +('8', '75', '13', '80674', '59143', '13'), +('8', '75', '13', '80652', '56991', '13'), +('8', '75', '14', '46856', '60727', '13'), +('8', '75', '14', '46854', '60427', '13'), +('8', '75', '14', '80674', '59143', '13'), +('8', '75', '14', '80675', '58350', '13'), +('8', '75', '11', '80668', '46672', '13'), +('8', '75', '11', '46850', '44073', '13'), +('8', '75', '11', '46849', '44035', '13'), +('8', '75', '11', '46930', '43725', '13'), +('8', '75', '22', '61948', '0', '12'), +('8', '75', '22', '66397', '0', '12'), +('8', '75', '22', '62787', '0', '12'), +('8', '75', '22', '21805', '0', '12'), +('8', '75', '1', '46931', '40517', '12'), +('8', '75', '1', '46866', '37570', '12'), +('8', '75', '1', '46913', '37498', '12'), +('8', '75', '1', '39276', '37410', '12'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '75', '2', '83560', '34197', '12'), +('8', '75', '2', '53410', '32668', '12'), +('8', '75', '2', '70902', '31697', '12'), +('8', '75', '2', '39222', '25423', '12'), +('8', '75', '3', '39347', '39220', '12'), +('8', '75', '3', '47245', '38526', '12'), +('8', '75', '3', '46924', '37343', '12'), +('8', '75', '3', '46873', '37235', '12'), +('8', '75', '5', '46867', '47175', '12'), +('8', '75', '5', '46918', '46557', '12'), +('8', '75', '5', '46934', '40470', '12'), +('8', '75', '5', '39349', '39566', '12'), +('8', '75', '8', '46885', '50715', '12'), +('8', '75', '8', '46908', '41530', '12'), +('8', '75', '8', '39330', '37453', '12'), +('8', '75', '8', '46848', '34374', '12'), +('8', '75', '6', '46933', '40769', '12'), +('8', '75', '6', '46884', '40580', '12'), +('8', '75', '6', '46883', '40433', '12'), +('8', '75', '6', '39337', '39161', '12'), +('8', '75', '17', '83603', '49603', '12'), +('8', '75', '17', '53415', '34376', '12'), +('8', '75', '17', '70907', '34133', '12'), +('8', '75', '17', '70701', '31779', '12'), +('8', '75', '7', '53411', '32570', '12'), +('8', '75', '7', '47204', '29319', '12'), +('8', '75', '7', '83564', '28445', '12'), +('8', '75', '7', '39267', '28257', '12'), +('8', '75', '9', '46887', '41072', '12'), +('8', '75', '9', '39335', '39298', '12'), +('8', '75', '9', '53412', '32723', '12'), +('8', '75', '9', '51706', '30144', '12'), +('8', '75', '15', '46881', '41295', '12'), +('8', '75', '15', '46863', '38308', '12'), +('8', '75', '15', '46916', '37095', '12'), +('8', '75', '15', '46893', '35488', '12'), +('8', '75', '20', '46935', '41952', '12'), +('8', '75', '20', '46870', '37428', '12'), +('8', '75', '20', '46919', '37220', '12'), +('8', '75', '20', '39365', '34286', '12'), +('8', '75', '12', '53413', '41206', '12'), +('8', '75', '12', '47212', '36614', '12'), +('8', '75', '12', '83568', '34234', '12'), +('8', '75', '12', '70905', '27912', '12'), +('8', '75', '18', '53416', '33692', '12'), +('8', '75', '18', '70908', '32316', '12'), +('8', '75', '18', '83607', '31859', '12'), +('8', '75', '18', '46826', '30487', '12'), +('8', '75', '19', '53414', '40651', '12'), +('8', '75', '19', '39355', '31302', '12'), +('8', '75', '19', '83550', '30467', '12'), +('8', '75', '19', '70906', '28912', '12'), +('8', '75', '13', '46856', '60727', '12'), +('8', '75', '13', '46854', '60427', '12'), +('8', '75', '13', '46940', '53022', '12'), +('8', '75', '13', '46927', '52261', '12'), +('8', '75', '14', '46856', '60727', '12'), +('8', '75', '14', '46854', '60427', '12'), +('8', '75', '14', '46940', '53022', '12'), +('8', '75', '14', '46927', '52261', '12'), +('8', '75', '11', '46850', '44073', '12'), +('8', '75', '11', '46849', '44035', '12'), +('8', '75', '11', '46930', '43725', '12'), +('8', '75', '11', '39371', '42343', '12'), +('8', '76', '22', '61948', '0', '13'), +('8', '76', '22', '66397', '0', '13'), +('8', '76', '22', '62787', '0', '13'), +('8', '76', '22', '21805', '0', '13'), +('8', '76', '1', '80676', '46606', '13'), +('8', '76', '1', '80659', '45628', '13'), +('8', '76', '1', '80648', '43486', '13'), +('8', '76', '1', '80639', '42459', '13'), +('8', '76', '2', '80552', '47772', '13'), +('8', '76', '2', '83560', '34199', '13'), +('8', '76', '2', '53410', '32670', '13'), +('8', '76', '2', '70902', '31698', '13'), +('8', '76', '3', '80637', '43551', '13'), +('8', '76', '3', '39347', '39221', '13'), +('8', '76', '3', '47245', '38526', '13'), +('8', '76', '3', '46924', '37345', '13'), +('8', '76', '5', '46867', '47177', '13'), +('8', '76', '5', '80670', '47065', '13'), +('8', '76', '5', '46918', '46559', '13'), +('8', '76', '5', '80616', '41500', '13'), +('8', '76', '8', '46885', '50717', '13'), +('8', '76', '8', '80677', '47910', '13'), +('8', '76', '8', '80649', '42474', '13'), +('8', '76', '8', '46908', '41532', '13'), +('8', '76', '6', '80638', '52536', '13'), +('8', '76', '6', '46933', '40771', '13'), +('8', '76', '6', '46884', '40582', '13'), +('8', '76', '6', '46883', '40435', '13'), +('8', '76', '17', '83603', '49605', '13'), +('8', '76', '17', '80555', '43363', '13'), +('8', '76', '17', '53415', '34376', '13'), +('8', '76', '17', '70907', '34135', '13'), +('8', '76', '7', '80553', '40575', '13'), +('8', '76', '7', '53411', '32571', '13'), +('8', '76', '7', '47204', '29320', '13'), +('8', '76', '7', '83564', '28447', '13'), +('8', '76', '9', '46887', '41074', '13'), +('8', '76', '9', '39335', '39300', '13'), +('8', '76', '9', '80549', '36494', '13'), +('8', '76', '9', '53412', '32725', '13'), +('8', '76', '15', '79909', '48607', '13'), +('8', '76', '15', '80667', '47787', '13'), +('8', '76', '15', '80686', '46989', '13'), +('8', '76', '15', '80671', '46705', '13'), +('8', '76', '20', '80678', '56929', '13'), +('8', '76', '20', '46935', '41954', '13'), +('8', '76', '20', '80620', '40678', '13'), +('8', '76', '20', '46870', '37429', '13'), +('8', '76', '12', '80550', '44712', '13'), +('8', '76', '12', '53413', '41207', '13'), +('8', '76', '12', '47212', '36615', '13'), +('8', '76', '12', '83568', '34236', '13'), +('8', '76', '18', '80554', '40985', '13'), +('8', '76', '18', '53416', '33693', '13'), +('8', '76', '18', '70908', '32318', '13'), +('8', '76', '18', '83607', '31861', '13'), +('8', '76', '19', '53414', '40653', '13'), +('8', '76', '19', '80551', '38817', '13'), +('8', '76', '19', '39355', '31304', '13'), +('8', '76', '19', '83550', '30469', '13'), +('8', '76', '13', '46856', '60913', '13'), +('8', '76', '13', '46854', '60613', '13'), +('8', '76', '13', '80674', '59144', '13'), +('8', '76', '13', '80652', '56993', '13'), +('8', '76', '14', '46856', '60913', '13'), +('8', '76', '14', '46854', '60613', '13'), +('8', '76', '14', '80674', '59144', '13'), +('8', '76', '14', '80675', '58352', '13'), +('8', '76', '11', '80668', '46674', '13'), +('8', '76', '11', '46850', '44075', '13'), +('8', '76', '11', '46849', '44037', '13'), +('8', '76', '11', '46930', '43727', '13'), +('8', '77', '22', '61948', '0', '13'), +('8', '77', '22', '66397', '0', '13'), +('8', '77', '22', '62787', '0', '13'), +('8', '77', '22', '21805', '0', '13'), +('8', '77', '1', '80676', '46608', '13'), +('8', '77', '1', '80659', '45630', '13'), +('8', '77', '1', '80648', '43488', '13'), +('8', '77', '1', '80639', '42461', '13'), +('8', '77', '2', '80552', '47774', '13'), +('8', '77', '2', '83560', '34201', '13'), +('8', '77', '2', '53410', '32672', '13'), +('8', '77', '2', '70902', '31699', '13'), +('8', '77', '3', '80637', '43553', '13'), +('8', '77', '3', '39347', '39223', '13'), +('8', '77', '3', '47245', '38527', '13'), +('8', '77', '3', '46924', '37347', '13'), +('8', '77', '5', '46867', '47179', '13'), +('8', '77', '5', '80670', '47068', '13'), +('8', '77', '5', '46918', '46561', '13'), +('8', '77', '5', '80616', '41501', '13'), +('8', '77', '8', '46885', '50720', '13'), +('8', '77', '8', '80677', '47913', '13'), +('8', '77', '8', '80649', '42476', '13'), +('8', '77', '8', '46908', '41533', '13'), +('8', '77', '6', '80638', '52538', '13'), +('8', '77', '6', '46933', '40773', '13'), +('8', '77', '6', '46884', '40584', '13'), +('8', '77', '6', '46883', '40438', '13'), +('8', '77', '17', '83603', '49607', '13'), +('8', '77', '17', '80555', '43366', '13'), +('8', '77', '17', '53415', '34377', '13'), +('8', '77', '17', '70907', '34137', '13'), +('8', '77', '7', '80553', '40577', '13'), +('8', '77', '7', '53411', '32572', '13'), +('8', '77', '7', '47204', '29322', '13'), +('8', '77', '7', '83564', '28450', '13'), +('8', '77', '9', '46887', '41076', '13'), +('8', '77', '9', '39335', '39302', '13'), +('8', '77', '9', '80549', '36496', '13'), +('8', '77', '9', '53412', '32727', '13'), +('8', '77', '15', '79909', '48609', '13'), +('8', '77', '15', '80667', '47790', '13'), +('8', '77', '15', '80686', '46992', '13'), +('8', '77', '15', '80671', '46708', '13'), +('8', '77', '20', '80678', '56932', '13'), +('8', '77', '20', '46935', '41956', '13'), +('8', '77', '20', '80620', '40679', '13'), +('8', '77', '20', '46870', '37431', '13'), +('8', '77', '12', '80550', '44714', '13'), +('8', '77', '12', '53413', '41208', '13'), +('8', '77', '12', '47212', '36617', '13'), +('8', '77', '12', '83568', '34239', '13'), +('8', '77', '18', '80554', '40987', '13'), +('8', '77', '18', '53416', '33695', '13'), +('8', '77', '18', '70908', '32320', '13'), +('8', '77', '18', '83607', '31863', '13'), +('8', '77', '19', '53414', '40655', '13'), +('8', '77', '19', '80551', '38819', '13'), +('8', '77', '19', '39355', '31306', '13'), +('8', '77', '19', '83550', '30470', '13'), +('8', '77', '13', '46856', '61098', '13'), +('8', '77', '13', '46854', '60798', '13'), +('8', '77', '13', '80674', '59146', '13'), +('8', '77', '13', '80652', '56994', '13'), +('8', '77', '14', '46856', '61098', '13'), +('8', '77', '14', '46854', '60798', '13'), +('8', '77', '14', '80674', '59146', '13'), +('8', '77', '14', '80675', '58354', '13'), +('8', '77', '11', '80668', '46677', '13'), +('8', '77', '11', '46850', '44077', '13'), +('8', '77', '11', '46849', '44039', '13'), +('8', '77', '11', '46930', '43729', '13'), +('8', '78', '22', '61948', '0', '13'), +('8', '78', '22', '66397', '0', '13'), +('8', '78', '22', '62787', '0', '13'), +('8', '78', '22', '21805', '0', '13'), +('8', '78', '1', '80676', '46609', '13'), +('8', '78', '1', '80659', '45633', '13'), +('8', '78', '1', '80648', '43491', '13'), +('8', '78', '1', '80639', '42463', '13'), +('8', '78', '2', '80552', '47777', '13'), +('8', '78', '2', '83560', '34204', '13'), +('8', '78', '2', '53410', '32674', '13'), +('8', '78', '2', '70902', '31700', '13'), +('8', '78', '3', '80637', '43556', '13'), +('8', '78', '3', '39347', '39225', '13'), +('8', '78', '3', '47245', '38528', '13'), +('8', '78', '3', '46924', '37349', '13'), +('8', '78', '5', '46867', '47181', '13'), +('8', '78', '5', '80670', '47070', '13'), +('8', '78', '5', '46918', '46563', '13'), +('8', '78', '5', '80616', '41503', '13'), +('8', '78', '8', '46885', '50722', '13'), +('8', '78', '8', '80677', '47915', '13'), +('8', '78', '8', '80649', '42478', '13'), +('8', '78', '8', '46908', '41535', '13'), +('8', '78', '6', '80638', '52540', '13'), +('8', '78', '6', '46933', '40775', '13'), +('8', '78', '6', '46884', '40587', '13'), +('8', '78', '6', '46883', '40441', '13'), +('8', '78', '17', '83603', '49609', '13'), +('8', '78', '17', '80555', '43368', '13'), +('8', '78', '17', '53415', '34378', '13'), +('8', '78', '17', '70907', '34139', '13'), +('8', '78', '7', '80553', '40580', '13'), +('8', '78', '7', '53411', '32573', '13'), +('8', '78', '7', '47204', '29323', '13'), +('8', '78', '7', '83564', '28452', '13'), +('8', '78', '9', '46887', '41078', '13'), +('8', '78', '9', '39335', '39304', '13'), +('8', '78', '9', '80549', '36498', '13'), +('8', '78', '9', '53412', '32729', '13'), +('8', '78', '15', '79909', '48611', '13'), +('8', '78', '15', '80667', '47793', '13'), +('8', '78', '15', '80686', '46995', '13'), +('8', '78', '15', '80671', '46710', '13'), +('8', '78', '20', '80678', '56935', '13'), +('8', '78', '20', '46935', '41959', '13'), +('8', '78', '20', '80620', '40680', '13'), +('8', '78', '20', '46870', '37433', '13'), +('8', '78', '12', '80550', '44716', '13'), +('8', '78', '12', '53413', '41208', '13'), +('8', '78', '12', '47212', '36618', '13'), +('8', '78', '12', '83568', '34241', '13'), +('8', '78', '18', '80554', '40990', '13'), +('8', '78', '18', '53416', '33697', '13'), +('8', '78', '18', '70908', '32321', '13'), +('8', '78', '18', '83607', '31865', '13'), +('8', '78', '19', '53414', '40657', '13'), +('8', '78', '19', '80551', '38822', '13'), +('8', '78', '19', '39355', '31308', '13'), +('8', '78', '19', '83550', '30472', '13'), +('8', '78', '13', '46856', '61284', '13'), +('8', '78', '13', '46854', '60984', '13'), +('8', '78', '13', '80674', '59148', '13'), +('8', '78', '13', '80652', '56996', '13'), +('8', '78', '14', '46856', '61284', '13'), +('8', '78', '14', '46854', '60984', '13'), +('8', '78', '14', '80674', '59148', '13'), +('8', '78', '14', '80675', '58355', '13'), +('8', '78', '11', '80668', '46680', '13'), +('8', '78', '11', '46850', '44079', '13'), +('8', '78', '11', '46849', '44041', '13'), +('8', '78', '11', '46930', '43730', '13'), +('8', '79', '22', '61948', '0', '13'), +('8', '79', '22', '66397', '0', '13'), +('8', '79', '22', '62787', '0', '13'), +('8', '79', '22', '21805', '0', '13'), +('8', '79', '1', '80676', '46611', '13'), +('8', '79', '1', '80659', '45635', '13'), +('8', '79', '1', '80648', '43493', '13'), +('8', '79', '1', '80639', '42466', '13'), +('8', '79', '2', '80552', '47779', '13'), +('8', '79', '2', '83560', '34206', '13'), +('8', '79', '2', '53410', '32676', '13'), +('8', '79', '2', '70902', '31701', '13'), +('8', '79', '3', '80637', '43558', '13'), +('8', '79', '3', '39347', '39227', '13'), +('8', '79', '3', '47245', '38528', '13'), +('8', '79', '3', '46924', '37351', '13'), +('8', '79', '5', '46867', '47183', '13'), +('8', '79', '5', '80670', '47073', '13'), +('8', '79', '5', '46918', '46565', '13'), +('8', '79', '5', '80616', '41504', '13'), +('8', '79', '8', '46885', '50725', '13'), +('8', '79', '8', '80677', '47918', '13'), +('8', '79', '8', '80649', '42481', '13'), +('8', '79', '8', '46908', '41537', '13'), +('8', '79', '6', '80638', '52543', '13'), +('8', '79', '6', '46933', '40777', '13'), +('8', '79', '6', '46884', '40589', '13'), +('8', '79', '6', '46883', '40443', '13'), +('8', '79', '17', '83603', '49611', '13'), +('8', '79', '17', '80555', '43371', '13'), +('8', '79', '17', '53415', '34379', '13'), +('8', '79', '17', '70907', '34141', '13'), +('8', '79', '7', '80553', '40582', '13'), +('8', '79', '7', '53411', '32574', '13'), +('8', '79', '7', '47204', '29324', '13'), +('8', '79', '7', '83564', '28455', '13'), +('8', '79', '9', '46887', '41081', '13'), +('8', '79', '9', '39335', '39306', '13'), +('8', '79', '9', '80549', '36501', '13'), +('8', '79', '9', '53412', '32731', '13'), +('8', '79', '15', '79909', '48613', '13'), +('8', '79', '15', '80667', '47795', '13'), +('8', '79', '15', '80686', '46997', '13'), +('8', '79', '15', '80671', '46713', '13'), +('8', '79', '20', '80678', '56937', '13'), +('8', '79', '20', '46935', '41961', '13'), +('8', '79', '20', '80620', '40681', '13'), +('8', '79', '20', '46870', '37435', '13'), +('8', '79', '12', '80550', '44718', '13'), +('8', '79', '12', '53413', '41209', '13'), +('8', '79', '12', '47212', '36620', '13'), +('8', '79', '12', '83568', '34244', '13'), +('8', '79', '18', '80554', '40992', '13'), +('8', '79', '18', '53416', '33699', '13'), +('8', '79', '18', '70908', '32323', '13'), +('8', '79', '18', '83607', '31867', '13'), +('8', '79', '19', '53414', '40659', '13'), +('8', '79', '19', '80551', '38824', '13'), +('8', '79', '19', '39355', '31310', '13'), +('8', '79', '19', '83550', '30473', '13'), +('8', '79', '13', '46856', '61470', '13'), +('8', '79', '13', '46854', '61170', '13'), +('8', '79', '13', '80674', '59150', '13'), +('8', '79', '13', '80652', '56998', '13'), +('8', '79', '14', '46856', '61470', '13'), +('8', '79', '14', '46854', '61170', '13'), +('8', '79', '14', '80674', '59150', '13'), +('8', '79', '14', '80675', '58357', '13'), +('8', '79', '11', '80668', '46682', '13'), +('8', '79', '11', '46850', '44081', '13'), +('8', '79', '11', '46849', '44043', '13'), +('8', '79', '11', '46930', '43732', '13'), +('8', '80', '22', '61948', '0', '14'), +('8', '80', '22', '66397', '0', '14'), +('8', '80', '22', '62787', '0', '14'), +('8', '80', '22', '21805', '0', '14'), +('8', '80', '1', '102641', '62121', '14'), +('8', '80', '1', '102597', '62027', '14'), +('8', '80', '1', '102618', '61952', '14'), +('8', '80', '1', '102639', '61890', '14'), +('8', '80', '2', '102192', '77396', '14'), +('8', '80', '2', '102080', '68287', '14'), +('8', '80', '2', '80552', '47781', '14'), +('8', '80', '2', '102003', '42396', '14'), +('8', '80', '3', '102726', '66995', '14'), +('8', '80', '3', '102619', '65757', '14'), +('8', '80', '3', '102598', '65614', '14'), +('8', '80', '3', '102725', '57929', '14'), +('8', '80', '5', '102620', '64727', '14'), +('8', '80', '5', '102599', '64706', '14'), +('8', '80', '5', '102745', '59025', '14'), +('8', '80', '5', '102551', '56611', '14'), +('8', '80', '8', '102601', '74867', '14'), +('8', '80', '8', '102552', '66544', '14'), +('8', '80', '8', '102622', '65602', '14'), +('8', '80', '8', '102527', '51405', '14'), +('8', '80', '6', '102621', '65879', '14'), +('8', '80', '6', '102600', '65666', '14'), +('8', '80', '6', '102558', '57441', '14'), +('8', '80', '6', '80638', '52545', '14'), +('8', '80', '17', '102195', '71069', '14'), +('8', '80', '17', '102083', '62297', '14'), +('8', '80', '17', '83603', '49614', '14'), +('8', '80', '17', '102006', '45263', '14'), +('8', '80', '7', '102193', '78466', '14'), +('8', '80', '7', '102081', '59329', '14'), +('8', '80', '7', '102004', '52721', '14'), +('8', '80', '7', '80553', '40585', '14'), +('8', '80', '9', '67098', '105903', '14'), +('8', '80', '9', '102189', '62670', '14'), +('8', '80', '9', '102077', '54857', '14'), +('8', '80', '9', '46887', '41083', '14'), +('8', '80', '15', '102602', '62849', '14'), +('8', '80', '15', '102623', '62694', '14'), +('8', '80', '15', '102637', '62583', '14'), +('8', '80', '15', '102636', '62567', '14'), +('8', '80', '20', '102624', '75020', '14'), +('8', '80', '20', '102603', '74874', '14'), +('8', '80', '20', '102553', '66265', '14'), +('8', '80', '20', '80678', '56940', '14'), +('8', '80', '12', '102078', '66663', '14'), +('8', '80', '12', '102190', '64657', '14'), +('8', '80', '12', '80550', '44720', '14'), +('8', '80', '12', '53413', '41210', '14'), +('8', '80', '18', '102194', '79285', '14'), +('8', '80', '18', '102082', '60107', '14'), +('8', '80', '18', '102005', '43823', '14'), +('8', '80', '18', '80554', '40995', '14'), +('8', '80', '19', '102191', '64839', '14'), +('8', '80', '19', '102079', '56646', '14'), +('8', '80', '19', '76131', '43552', '14'), +('8', '80', '19', '53414', '40661', '14'), +('8', '80', '13', '102720', '86656', '14'), +('8', '80', '13', '102649', '82545', '14'), +('8', '80', '13', '102719', '82110', '14'), +('8', '80', '13', '102660', '82104', '14'), +('8', '80', '14', '102720', '86656', '14'), +('8', '80', '14', '102649', '82545', '14'), +('8', '80', '14', '102661', '82155', '14'), +('8', '80', '14', '102719', '82110', '14'), +('8', '80', '11', '102643', '63521', '14'), +('8', '80', '11', '102747', '58151', '14'), +('8', '80', '11', '80668', '46685', '14'), +('8', '80', '11', '46850', '44082', '14'), +('8', '81', '22', '61948', '0', '14'), +('8', '81', '22', '66397', '0', '14'), +('8', '81', '22', '62787', '0', '14'), +('8', '81', '22', '21805', '0', '14'), +('8', '81', '1', '102641', '62124', '14'), +('8', '81', '1', '102597', '62029', '14'), +('8', '81', '1', '102618', '61954', '14'), +('8', '81', '1', '102639', '61893', '14'), +('8', '81', '2', '102192', '77398', '14'), +('8', '81', '2', '102080', '68288', '14'), +('8', '81', '2', '80552', '47784', '14'), +('8', '81', '2', '102003', '42397', '14'), +('8', '81', '3', '102726', '66997', '14'), +('8', '81', '3', '102619', '65760', '14'), +('8', '81', '3', '102598', '65617', '14'), +('8', '81', '3', '102725', '57931', '14'), +('8', '81', '5', '102620', '64728', '14'), +('8', '81', '5', '102599', '64707', '14'), +('8', '81', '5', '102745', '59027', '14'), +('8', '81', '5', '102551', '56612', '14'), +('8', '81', '8', '102601', '74868', '14'), +('8', '81', '8', '102552', '66547', '14'), +('8', '81', '8', '102622', '65604', '14'), +('8', '81', '8', '102527', '51407', '14'), +('8', '81', '6', '102621', '65882', '14'), +('8', '81', '6', '102600', '65669', '14'), +('8', '81', '6', '102558', '57443', '14'), +('8', '81', '6', '80638', '52547', '14'), +('8', '81', '17', '102195', '71071', '14'), +('8', '81', '17', '102083', '62299', '14'), +('8', '81', '17', '83603', '49616', '14'), +('8', '81', '17', '102006', '45265', '14'), +('8', '81', '7', '102193', '78467', '14'), +('8', '81', '7', '102081', '59331', '14'), +('8', '81', '7', '102004', '52724', '14'), +('8', '81', '7', '80553', '40587', '14'), +('8', '81', '9', '67098', '107228', '14'), +('8', '81', '9', '102189', '62672', '14'), +('8', '81', '9', '102077', '54858', '14'), +('8', '81', '9', '46887', '41085', '14'), +('8', '81', '15', '102602', '62851', '14'), +('8', '81', '15', '102623', '62695', '14'), +('8', '81', '15', '102637', '62586', '14'), +('8', '81', '15', '102636', '62569', '14'), +('8', '81', '20', '102624', '75022', '14'), +('8', '81', '20', '102603', '74877', '14'), +('8', '81', '20', '102553', '66267', '14'), +('8', '81', '20', '80678', '56942', '14'), +('8', '81', '12', '102078', '66665', '14'), +('8', '81', '12', '102190', '64659', '14'), +('8', '81', '12', '80550', '44722', '14'), +('8', '81', '12', '53413', '41211', '14'), +('8', '81', '18', '102194', '79286', '14'), +('8', '81', '18', '102082', '60108', '14'), +('8', '81', '18', '102005', '43826', '14'), +('8', '81', '18', '80554', '40997', '14'), +('8', '81', '19', '102191', '64841', '14'), +('8', '81', '19', '102079', '56646', '14'), +('8', '81', '19', '76131', '43552', '14'), +('8', '81', '19', '53414', '40663', '14'), +('8', '81', '13', '102720', '86689', '14'), +('8', '81', '13', '102649', '82584', '14'), +('8', '81', '13', '102660', '82142', '14'), +('8', '81', '13', '102719', '82142', '14'), +('8', '81', '14', '102720', '86689', '14'), +('8', '81', '14', '102649', '82584', '14'), +('8', '81', '14', '102661', '82193', '14'), +('8', '81', '14', '102660', '82142', '14'), +('8', '81', '11', '102643', '63523', '14'), +('8', '81', '11', '102747', '58153', '14'), +('8', '81', '11', '80668', '46687', '14'), +('8', '81', '11', '46850', '44084', '14'), +('8', '82', '22', '61948', '0', '14'), +('8', '82', '22', '66397', '0', '14'), +('8', '82', '22', '62787', '0', '14'), +('8', '82', '22', '21805', '0', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '82', '1', '102641', '62126', '14'), +('8', '82', '1', '102597', '62032', '14'), +('8', '82', '1', '102618', '61956', '14'), +('8', '82', '1', '102639', '61896', '14'), +('8', '82', '2', '102192', '77400', '14'), +('8', '82', '2', '102080', '68290', '14'), +('8', '82', '2', '80552', '47786', '14'), +('8', '82', '2', '102003', '42398', '14'), +('8', '82', '3', '102726', '67000', '14'), +('8', '82', '3', '102619', '65762', '14'), +('8', '82', '3', '102598', '65620', '14'), +('8', '82', '3', '102725', '57932', '14'), +('8', '82', '5', '102620', '64729', '14'), +('8', '82', '5', '102599', '64709', '14'), +('8', '82', '5', '102745', '59029', '14'), +('8', '82', '5', '102551', '56614', '14'), +('8', '82', '8', '102601', '74869', '14'), +('8', '82', '8', '102552', '66550', '14'), +('8', '82', '8', '102622', '65607', '14'), +('8', '82', '8', '102527', '51409', '14'), +('8', '82', '6', '102621', '65884', '14'), +('8', '82', '6', '102600', '65672', '14'), +('8', '82', '6', '102558', '57446', '14'), +('8', '82', '6', '80638', '52550', '14'), +('8', '82', '17', '102195', '71072', '14'), +('8', '82', '17', '102083', '62301', '14'), +('8', '82', '17', '83603', '49618', '14'), +('8', '82', '17', '102006', '45267', '14'), +('8', '82', '7', '102193', '78469', '14'), +('8', '82', '7', '102081', '59333', '14'), +('8', '82', '7', '102004', '52726', '14'), +('8', '82', '7', '80553', '40590', '14'), +('8', '82', '9', '67098', '108553', '14'), +('8', '82', '9', '102189', '62673', '14'), +('8', '82', '9', '102077', '54860', '14'), +('8', '82', '9', '46887', '41088', '14'), +('8', '82', '15', '102602', '62852', '14'), +('8', '82', '15', '102623', '62697', '14'), +('8', '82', '15', '102637', '62589', '14'), +('8', '82', '15', '102636', '62571', '14'), +('8', '82', '20', '102624', '75026', '14'), +('8', '82', '20', '102603', '74880', '14'), +('8', '82', '20', '102553', '66270', '14'), +('8', '82', '20', '80678', '56945', '14'), +('8', '82', '12', '102078', '66667', '14'), +('8', '82', '12', '102190', '64660', '14'), +('8', '82', '12', '80550', '44725', '14'), +('8', '82', '12', '53413', '41212', '14'), +('8', '82', '18', '102194', '79288', '14'), +('8', '82', '18', '102082', '60110', '14'), +('8', '82', '18', '102005', '43828', '14'), +('8', '82', '18', '80554', '41000', '14'), +('8', '82', '19', '102191', '64843', '14'), +('8', '82', '19', '102079', '56647', '14'), +('8', '82', '19', '76131', '43553', '14'), +('8', '82', '19', '53414', '40665', '14'), +('8', '82', '13', '102720', '86722', '14'), +('8', '82', '13', '102649', '82623', '14'), +('8', '82', '13', '102660', '82180', '14'), +('8', '82', '13', '102719', '82175', '14'), +('8', '82', '14', '102720', '86722', '14'), +('8', '82', '14', '102649', '82623', '14'), +('8', '82', '14', '102661', '82231', '14'), +('8', '82', '14', '102660', '82180', '14'), +('8', '82', '11', '102643', '63524', '14'), +('8', '82', '11', '102747', '58155', '14'), +('8', '82', '11', '80668', '46690', '14'), +('8', '82', '11', '46850', '44086', '14'), +('8', '83', '22', '61948', '0', '14'), +('8', '83', '22', '66397', '0', '14'), +('8', '83', '22', '62787', '0', '14'), +('8', '83', '22', '21805', '0', '14'), +('8', '83', '1', '102641', '62129', '14'), +('8', '83', '1', '102597', '62034', '14'), +('8', '83', '1', '102618', '61958', '14'), +('8', '83', '1', '102639', '61898', '14'), +('8', '83', '2', '102192', '77402', '14'), +('8', '83', '2', '102080', '68291', '14'), +('8', '83', '2', '80552', '47788', '14'), +('8', '83', '2', '102003', '42399', '14'), +('8', '83', '3', '102726', '67002', '14'), +('8', '83', '3', '102619', '65765', '14'), +('8', '83', '3', '102598', '65622', '14'), +('8', '83', '3', '102725', '57934', '14'), +('8', '83', '5', '102620', '64731', '14'), +('8', '83', '5', '102599', '64711', '14'), +('8', '83', '5', '102745', '59031', '14'), +('8', '83', '5', '102551', '56616', '14'), +('8', '83', '8', '102601', '74870', '14'), +('8', '83', '8', '102552', '66553', '14'), +('8', '83', '8', '102622', '65609', '14'), +('8', '83', '8', '102527', '51411', '14'), +('8', '83', '6', '102621', '65887', '14'), +('8', '83', '6', '102600', '65674', '14'), +('8', '83', '6', '102558', '57448', '14'), +('8', '83', '6', '80638', '52552', '14'), +('8', '83', '17', '102195', '71074', '14'), +('8', '83', '17', '102083', '62303', '14'), +('8', '83', '17', '83603', '49620', '14'), +('8', '83', '17', '102006', '45270', '14'), +('8', '83', '7', '102193', '78471', '14'), +('8', '83', '7', '102081', '59335', '14'), +('8', '83', '7', '102004', '52729', '14'), +('8', '83', '7', '80553', '40592', '14'), +('8', '83', '9', '67098', '109879', '14'), +('8', '83', '9', '102189', '62675', '14'), +('8', '83', '9', '102077', '54861', '14'), +('8', '83', '9', '46887', '41090', '14'), +('8', '83', '15', '102602', '62854', '14'), +('8', '83', '15', '102623', '62699', '14'), +('8', '83', '15', '102637', '62592', '14'), +('8', '83', '15', '102636', '62572', '14'), +('8', '83', '20', '102624', '75028', '14'), +('8', '83', '20', '102603', '74883', '14'), +('8', '83', '20', '102553', '66273', '14'), +('8', '83', '20', '80678', '56948', '14'), +('8', '83', '12', '102078', '66669', '14'), +('8', '83', '12', '102190', '64661', '14'), +('8', '83', '12', '80550', '44727', '14'), +('8', '83', '12', '53413', '41212', '14'), +('8', '83', '18', '102194', '79289', '14'), +('8', '83', '18', '102082', '60111', '14'), +('8', '83', '18', '102005', '43830', '14'), +('8', '83', '18', '80554', '41002', '14'), +('8', '83', '19', '102191', '64845', '14'), +('8', '83', '19', '102079', '56648', '14'), +('8', '83', '19', '76131', '43553', '14'), +('8', '83', '19', '53414', '40667', '14'), +('8', '83', '13', '102720', '86755', '14'), +('8', '83', '13', '102649', '82662', '14'), +('8', '83', '13', '102660', '82217', '14'), +('8', '83', '13', '102719', '82208', '14'), +('8', '83', '14', '102720', '86755', '14'), +('8', '83', '14', '102649', '82662', '14'), +('8', '83', '14', '102661', '82268', '14'), +('8', '83', '14', '102660', '82217', '14'), +('8', '83', '11', '102643', '63526', '14'), +('8', '83', '11', '102747', '58156', '14'), +('8', '83', '11', '80668', '46693', '14'), +('8', '83', '11', '46850', '44088', '14'), +('8', '84', '22', '61948', '0', '14'), +('8', '84', '22', '66397', '0', '14'), +('8', '84', '22', '62787', '0', '14'), +('8', '84', '22', '21805', '0', '14'), +('8', '84', '1', '102641', '62132', '14'), +('8', '84', '1', '102597', '62037', '14'), +('8', '84', '1', '102618', '61960', '14'), +('8', '84', '1', '102639', '61901', '14'), +('8', '84', '2', '102192', '77404', '14'), +('8', '84', '2', '102080', '68292', '14'), +('8', '84', '2', '80552', '47791', '14'), +('8', '84', '2', '102003', '42400', '14'), +('8', '84', '3', '102726', '67004', '14'), +('8', '84', '3', '102619', '65767', '14'), +('8', '84', '3', '102598', '65625', '14'), +('8', '84', '3', '102725', '57936', '14'), +('8', '84', '5', '102620', '64732', '14'), +('8', '84', '5', '102599', '64712', '14'), +('8', '84', '5', '102745', '59033', '14'), +('8', '84', '5', '102551', '56617', '14'), +('8', '84', '8', '102601', '74871', '14'), +('8', '84', '8', '102552', '66556', '14'), +('8', '84', '8', '102622', '65611', '14'), +('8', '84', '8', '102527', '51413', '14'), +('8', '84', '6', '102621', '65889', '14'), +('8', '84', '6', '102600', '65677', '14'), +('8', '84', '6', '102558', '57450', '14'), +('8', '84', '6', '80638', '52554', '14'), +('8', '84', '17', '102195', '71076', '14'), +('8', '84', '17', '102083', '62305', '14'), +('8', '84', '17', '83603', '49622', '14'), +('8', '84', '17', '102006', '45272', '14'), +('8', '84', '7', '102193', '78472', '14'), +('8', '84', '7', '102081', '59337', '14'), +('8', '84', '7', '102004', '52731', '14'), +('8', '84', '7', '80553', '40595', '14'), +('8', '84', '9', '67098', '111204', '14'), +('8', '84', '9', '102189', '62676', '14'), +('8', '84', '9', '102077', '54863', '14'), +('8', '84', '9', '46887', '41092', '14'), +('8', '84', '15', '102602', '62856', '14'), +('8', '84', '15', '102623', '62701', '14'), +('8', '84', '15', '102637', '62595', '14'), +('8', '84', '15', '102636', '62574', '14'), +('8', '84', '20', '102624', '75031', '14'), +('8', '84', '20', '102603', '74886', '14'), +('8', '84', '20', '102553', '66275', '14'), +('8', '84', '20', '80678', '56950', '14'), +('8', '84', '12', '102078', '66670', '14'), +('8', '84', '12', '102190', '64662', '14'), +('8', '84', '12', '80550', '44729', '14'), +('8', '84', '12', '53413', '41213', '14'), +('8', '84', '18', '102194', '79291', '14'), +('8', '84', '18', '102082', '60113', '14'), +('8', '84', '18', '102005', '43833', '14'), +('8', '84', '18', '80554', '41005', '14'), +('8', '84', '19', '102191', '64847', '14'), +('8', '84', '19', '102079', '56649', '14'), +('8', '84', '19', '76131', '43554', '14'), +('8', '84', '19', '53414', '40669', '14'), +('8', '84', '13', '102720', '86788', '14'), +('8', '84', '13', '102649', '82700', '14'), +('8', '84', '13', '102660', '82255', '14'), +('8', '84', '13', '102719', '82240', '14'), +('8', '84', '14', '102720', '86788', '14'), +('8', '84', '14', '102649', '82700', '14'), +('8', '84', '14', '102661', '82306', '14'), +('8', '84', '14', '102660', '82255', '14'), +('8', '84', '11', '102643', '63527', '14'), +('8', '84', '11', '102747', '58158', '14'), +('8', '84', '11', '80668', '46695', '14'), +('8', '84', '11', '46850', '44090', '14'), +('8', '85', '22', '21805', '0', '16'), +('8', '85', '22', '61948', '0', '16'), +('8', '85', '22', '66397', '0', '16'), +('8', '85', '22', '21807', '0', '16'), +('8', '85', '1', '111309', '117779', '16'), +('8', '85', '1', '111300', '117395', '16'), +('8', '85', '1', '111307', '117283', '16'), +('8', '85', '1', '111303', '117230', '16'), +('8', '85', '2', '111732', '128445', '16'), +('8', '85', '2', '111432', '117315', '16'), +('8', '85', '2', '111132', '103065', '16'), +('8', '85', '2', '104704', '94201', '16'), +('8', '85', '3', '111315', '117645', '16'), +('8', '85', '3', '111313', '117564', '16'), +('8', '85', '3', '111312', '117311', '16'), +('8', '85', '3', '111316', '116803', '16'), +('8', '85', '5', '111318', '117254', '16'), +('8', '85', '5', '111319', '117002', '16'), +('8', '85', '5', '111320', '116960', '16'), +('8', '85', '5', '111017', '103192', '16'), +('8', '85', '8', '111331', '117810', '16'), +('8', '85', '8', '111328', '117470', '16'), +('8', '85', '8', '111332', '117328', '16'), +('8', '85', '8', '111330', '117172', '16'), +('8', '85', '6', '111324', '117470', '16'), +('8', '85', '6', '111322', '117312', '16'), +('8', '85', '6', '111326', '116856', '16'), +('8', '85', '6', '111023', '103355', '16'), +('8', '85', '17', '111735', '134489', '16'), +('8', '85', '17', '111435', '123499', '16'), +('8', '85', '17', '111135', '109552', '16'), +('8', '85', '17', '105379', '95001', '16'), +('8', '85', '7', '111733', '128497', '16'), +('8', '85', '7', '111433', '117157', '16'), +('8', '85', '7', '111133', '102959', '16'), +('8', '85', '7', '104929', '93993', '16'), +('8', '85', '9', '111729', '124234', '16'), +('8', '85', '9', '111429', '113399', '16'), +('8', '85', '9', '67098', '112530', '16'), +('8', '85', '9', '111129', '99326', '16'), +('8', '85', '15', '111348', '117809', '16'), +('8', '85', '15', '111343', '117556', '16'), +('8', '85', '15', '111345', '117301', '16'), +('8', '85', '15', '111341', '117270', '16'), +('8', '85', '20', '111354', '127088', '16'), +('8', '85', '20', '111355', '126568', '16'), +('8', '85', '20', '111351', '126228', '16'), +('8', '85', '20', '111352', '126069', '16'), +('8', '85', '12', '111730', '126230', '16'), +('8', '85', '12', '111430', '115222', '16'), +('8', '85', '12', '111130', '100885', '16'), +('8', '85', '12', '104814', '92999', '16'), +('8', '85', '18', '111734', '130744', '16'), +('8', '85', '18', '111434', '119439', '16'), +('8', '85', '18', '111134', '105381', '16'), +('8', '85', '18', '105378', '91396', '16'), +('8', '85', '19', '111731', '127340', '16'), +('8', '85', '19', '111431', '116267', '16'), +('8', '85', '19', '111131', '102185', '16'), +('8', '85', '19', '105263', '88180', '16'), +('8', '85', '13', '111871', '154250', '16'), +('8', '85', '13', '111815', '152257', '16'), +('8', '85', '13', '111512', '144726', '16'), +('8', '85', '13', '111515', '144697', '16'), +('8', '85', '14', '111871', '154250', '16'), +('8', '85', '14', '111815', '152257', '16'), +('8', '85', '14', '111512', '144726', '16'), +('8', '85', '14', '111515', '144697', '16'), +('8', '85', '11', '111336', '117497', '16'), +('8', '85', '11', '111338', '117441', '16'), +('8', '85', '11', '111333', '117177', '16'), +('8', '85', '11', '111337', '116965', '16'), +('8', '85', '22', '21805', '0', '15'), +('8', '85', '22', '61948', '0', '15'), +('8', '85', '22', '66397', '0', '15'), +('8', '85', '22', '21807', '0', '15'), +('8', '85', '1', '107054', '87378', '15'), +('8', '85', '1', '107053', '86970', '15'), +('8', '85', '1', '107019', '86353', '15'), +('8', '85', '1', '107052', '86267', '15'), +('8', '85', '2', '104704', '94201', '15'), +('8', '85', '2', '104816', '94116', '15'), +('8', '85', '2', '104928', '94001', '15'), +('8', '85', '2', '105040', '89246', '15'), +('8', '85', '3', '107020', '88654', '15'), +('8', '85', '3', '107055', '88359', '15'), +('8', '85', '3', '107002', '87384', '15'), +('8', '85', '3', '106841', '82654', '15'), +('8', '85', '5', '107021', '87703', '15'), +('8', '85', '5', '107056', '87570', '15'), +('8', '85', '5', '107003', '87052', '15'), +('8', '85', '5', '106811', '81667', '15'), +('8', '85', '8', '107023', '89667', '15'), +('8', '85', '8', '107058', '89132', '15'), +('8', '85', '8', '107005', '88356', '15'), +('8', '85', '8', '94070', '83924', '15'), +('8', '85', '6', '106812', '91933', '15'), +('8', '85', '6', '106843', '91302', '15'), +('8', '85', '6', '107022', '88384', '15'), +('8', '85', '6', '107057', '88312', '15'), +('8', '85', '17', '105379', '95001', '15'), +('8', '85', '17', '105043', '94901', '15'), +('8', '85', '17', '105155', '94816', '15'), +('8', '85', '17', '105267', '94491', '15'), +('8', '85', '7', '104929', '93993', '15'), +('8', '85', '7', '104705', '93843', '15'), +('8', '85', '7', '104817', '93473', '15'), +('8', '85', '7', '105377', '88628', '15'), +('8', '85', '9', '67098', '112530', '15'), +('8', '85', '9', '105373', '85228', '15'), +('8', '85', '9', '105149', '85168', '15'), +('8', '85', '9', '105261', '85118', '15'), +('8', '85', '15', '107025', '88593', '15'), +('8', '85', '15', '107062', '87176', '15'), +('8', '85', '15', '107007', '87004', '15'), +('8', '85', '15', '107051', '86736', '15'), +('8', '85', '20', '107059', '98481', '15'), +('8', '85', '20', '107026', '98260', '15'), +('8', '85', '20', '107008', '97263', '15'), +('8', '85', '20', '106845', '92557', '15'), +('8', '85', '12', '104814', '92999', '15'), +('8', '85', '12', '104702', '92909', '15'), +('8', '85', '12', '104926', '92859', '15'), +('8', '85', '12', '105374', '87042', '15'), +('8', '85', '18', '105378', '91396', '15'), +('8', '85', '18', '105042', '91396', '15'), +('8', '85', '18', '105154', '91361', '15'), +('8', '85', '18', '105266', '91336', '15'), +('8', '85', '19', '105263', '88180', '15'), +('8', '85', '19', '105039', '88090', '15'), +('8', '85', '19', '105151', '87855', '15'), +('8', '85', '19', '105375', '87690', '15'), +('8', '85', '13', '106854', '109510', '15'), +('8', '85', '13', '106853', '108431', '15'), +('8', '85', '13', '106858', '108171', '15'), +('8', '85', '13', '106859', '104314', '15'), +('8', '85', '14', '106854', '109510', '15'), +('8', '85', '14', '106853', '108431', '15'), +('8', '85', '14', '106858', '108171', '15'), +('8', '85', '14', '106859', '104314', '15'), +('8', '85', '11', '107024', '89276', '15'), +('8', '85', '11', '107006', '87674', '15'), +('8', '85', '11', '106814', '82965', '15'), +('8', '85', '11', '62965', '74553', '15'), +('8', '86', '22', '21805', '0', '16'), +('8', '86', '22', '61948', '0', '16'), +('8', '86', '22', '66397', '0', '16'), +('8', '86', '22', '21807', '0', '16'), +('8', '86', '1', '111309', '117781', '16'), +('8', '86', '1', '111300', '117397', '16'), +('8', '86', '1', '111307', '117286', '16'), +('8', '86', '1', '111303', '117232', '16'), +('8', '86', '2', '111732', '128447', '16'), +('8', '86', '2', '111432', '117317', '16'), +('8', '86', '2', '111132', '103067', '16'), +('8', '86', '2', '104704', '94204', '16'), +('8', '86', '3', '111315', '117648', '16'), +('8', '86', '3', '111313', '117566', '16'), +('8', '86', '3', '111312', '117314', '16'), +('8', '86', '3', '111316', '116806', '16'), +('8', '86', '5', '111318', '117257', '16'), +('8', '86', '5', '111319', '117004', '16'), +('8', '86', '5', '111320', '116962', '16'), +('8', '86', '5', '111017', '103194', '16'), +('8', '86', '8', '111331', '117813', '16'), +('8', '86', '8', '111328', '117473', '16'), +('8', '86', '8', '111332', '117330', '16'), +('8', '86', '8', '111330', '117174', '16'), +('8', '86', '6', '111324', '117473', '16'), +('8', '86', '6', '111322', '117314', '16'), +('8', '86', '6', '111326', '116858', '16'), +('8', '86', '6', '111023', '103358', '16'), +('8', '86', '17', '111735', '134491', '16'), +('8', '86', '17', '111435', '123501', '16'), +('8', '86', '17', '111135', '109554', '16'), +('8', '86', '17', '105379', '95003', '16'), +('8', '86', '7', '111733', '128499', '16'), +('8', '86', '7', '111433', '117159', '16'), +('8', '86', '7', '111133', '102961', '16'), +('8', '86', '7', '104929', '93995', '16'), +('8', '86', '9', '111729', '124235', '16'), +('8', '86', '9', '67098', '113856', '16'), +('8', '86', '9', '111429', '113400', '16'), +('8', '86', '9', '111129', '99328', '16'), +('8', '86', '15', '111348', '117812', '16'), +('8', '86', '15', '111343', '117558', '16'), +('8', '86', '15', '111345', '117303', '16'), +('8', '86', '15', '111341', '117273', '16'), +('8', '86', '20', '111354', '127090', '16'), +('8', '86', '20', '111355', '126570', '16'), +('8', '86', '20', '111351', '126230', '16'), +('8', '86', '20', '111352', '126071', '16'), +('8', '86', '12', '111730', '126231', '16'), +('8', '86', '12', '111430', '115224', '16'), +('8', '86', '12', '111130', '100886', '16'), +('8', '86', '12', '104814', '93001', '16'), +('8', '86', '18', '111734', '130745', '16'), +('8', '86', '18', '111434', '119440', '16'), +('8', '86', '18', '111134', '105382', '16'), +('8', '86', '18', '105378', '91397', '16'), +('8', '86', '19', '111731', '127341', '16'), +('8', '86', '19', '111431', '116269', '16'), +('8', '86', '19', '111131', '102186', '16'), +('8', '86', '19', '105263', '88181', '16'), +('8', '86', '13', '111871', '154319', '16'), +('8', '86', '13', '111815', '152326', '16'), +('8', '86', '13', '111512', '144794', '16'), +('8', '86', '13', '111515', '144766', '16'), +('8', '86', '14', '111871', '154319', '16'), +('8', '86', '14', '111815', '152326', '16'), +('8', '86', '14', '111512', '144794', '16'), +('8', '86', '14', '111515', '144766', '16'), +('8', '86', '11', '111336', '117499', '16'), +('8', '86', '11', '111338', '117443', '16'), +('8', '86', '11', '111333', '117179', '16'), +('8', '86', '11', '111337', '116967', '16'), +('8', '87', '22', '21805', '0', '16'), +('8', '87', '22', '61948', '0', '16'), +('8', '87', '22', '66397', '0', '16'), +('8', '87', '22', '21807', '0', '16'), +('8', '87', '1', '111309', '117784', '16'), +('8', '87', '1', '111300', '117399', '16'), +('8', '87', '1', '111307', '117289', '16'), +('8', '87', '1', '111303', '117234', '16'), +('8', '87', '2', '111732', '128449', '16'), +('8', '87', '2', '111432', '117319', '16'), +('8', '87', '2', '111132', '103069', '16'), +('8', '87', '2', '104704', '94206', '16'), +('8', '87', '3', '111315', '117650', '16'), +('8', '87', '3', '111313', '117568', '16'), +('8', '87', '3', '111312', '117316', '16'), +('8', '87', '3', '111316', '116808', '16'), +('8', '87', '5', '111318', '117259', '16'), +('8', '87', '5', '111319', '117007', '16'), +('8', '87', '5', '111320', '116964', '16'), +('8', '87', '5', '111017', '103196', '16'), +('8', '87', '8', '111331', '117815', '16'), +('8', '87', '8', '111328', '117476', '16'), +('8', '87', '8', '111332', '117332', '16'), +('8', '87', '8', '111330', '117175', '16'), +('8', '87', '6', '111324', '117475', '16'), +('8', '87', '6', '111322', '117316', '16'), +('8', '87', '6', '111326', '116861', '16'), +('8', '87', '6', '111023', '103360', '16'), +('8', '87', '17', '111735', '134493', '16'), +('8', '87', '17', '111435', '123503', '16'), +('8', '87', '17', '111135', '109555', '16'), +('8', '87', '17', '105379', '95004', '16'), +('8', '87', '7', '111733', '128500', '16'), +('8', '87', '7', '111433', '117160', '16'), +('8', '87', '7', '111133', '102963', '16'), +('8', '87', '7', '104929', '93997', '16'), +('8', '87', '9', '111729', '124237', '16'), +('8', '87', '9', '67098', '115181', '16'), +('8', '87', '9', '111429', '113402', '16'), +('8', '87', '9', '111129', '99330', '16'), +('8', '87', '15', '111348', '117814', '16'), +('8', '87', '15', '111343', '117559', '16'), +('8', '87', '15', '111345', '117306', '16'), +('8', '87', '15', '111341', '117276', '16'), +('8', '87', '20', '111354', '127093', '16'), +('8', '87', '20', '111355', '126571', '16'), +('8', '87', '20', '111351', '126232', '16'), +('8', '87', '20', '111352', '126073', '16'), +('8', '87', '12', '111730', '126233', '16'), +('8', '87', '12', '111430', '115225', '16'), +('8', '87', '12', '111130', '100888', '16'), +('8', '87', '12', '104814', '93002', '16'), +('8', '87', '18', '111734', '130745', '16'), +('8', '87', '18', '111434', '119440', '16'), +('8', '87', '18', '111134', '105383', '16'), +('8', '87', '18', '105378', '91398', '16'), +('8', '87', '19', '111731', '127343', '16'), +('8', '87', '19', '111431', '116270', '16'), +('8', '87', '19', '111131', '102188', '16'), +('8', '87', '19', '105263', '88183', '16'), +('8', '87', '13', '111871', '154387', '16'), +('8', '87', '13', '111815', '152394', '16'), +('8', '87', '13', '111512', '144862', '16'), +('8', '87', '13', '111515', '144834', '16'), +('8', '87', '14', '111871', '154387', '16'), +('8', '87', '14', '111815', '152394', '16'), +('8', '87', '14', '111512', '144862', '16'), +('8', '87', '14', '111515', '144834', '16'), +('8', '87', '11', '111336', '117501', '16'), +('8', '87', '11', '111338', '117446', '16'), +('8', '87', '11', '111333', '117181', '16'), +('8', '87', '11', '111337', '116969', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '88', '22', '21805', '0', '16'), +('8', '88', '22', '61948', '0', '16'), +('8', '88', '22', '66397', '0', '16'), +('8', '88', '22', '21807', '0', '16'), +('8', '88', '1', '111309', '117786', '16'), +('8', '88', '1', '111300', '117401', '16'), +('8', '88', '1', '111307', '117292', '16'), +('8', '88', '1', '111303', '117236', '16'), +('8', '88', '2', '111732', '128451', '16'), +('8', '88', '2', '111432', '117321', '16'), +('8', '88', '2', '111132', '103071', '16'), +('8', '88', '2', '104704', '94208', '16'), +('8', '88', '3', '111315', '117653', '16'), +('8', '88', '3', '111313', '117570', '16'), +('8', '88', '3', '111312', '117318', '16'), +('8', '88', '3', '111316', '116810', '16'), +('8', '88', '5', '111318', '117261', '16'), +('8', '88', '5', '111319', '117010', '16'), +('8', '88', '5', '111320', '116966', '16'), +('8', '88', '5', '111017', '103198', '16'), +('8', '88', '8', '111331', '117817', '16'), +('8', '88', '8', '111328', '117479', '16'), +('8', '88', '8', '111332', '117334', '16'), +('8', '88', '8', '111330', '117177', '16'), +('8', '88', '6', '111324', '117477', '16'), +('8', '88', '6', '111322', '117318', '16'), +('8', '88', '6', '111326', '116863', '16'), +('8', '88', '6', '111023', '103362', '16'), +('8', '88', '17', '111735', '134494', '16'), +('8', '88', '17', '111435', '123504', '16'), +('8', '88', '17', '111135', '109557', '16'), +('8', '88', '17', '105379', '95006', '16'), +('8', '88', '7', '111733', '128502', '16'), +('8', '88', '7', '111433', '117162', '16'), +('8', '88', '7', '111133', '102965', '16'), +('8', '88', '7', '104929', '93999', '16'), +('8', '88', '9', '111729', '124239', '16'), +('8', '88', '9', '67098', '116507', '16'), +('8', '88', '9', '111429', '113404', '16'), +('8', '88', '9', '111129', '99332', '16'), +('8', '88', '15', '111348', '117816', '16'), +('8', '88', '15', '111343', '117561', '16'), +('8', '88', '15', '111345', '117308', '16'), +('8', '88', '15', '111341', '117279', '16'), +('8', '88', '20', '111354', '127095', '16'), +('8', '88', '20', '111355', '126573', '16'), +('8', '88', '20', '111351', '126234', '16'), +('8', '88', '20', '111352', '126075', '16'), +('8', '88', '12', '111730', '126235', '16'), +('8', '88', '12', '111430', '115227', '16'), +('8', '88', '12', '111130', '100890', '16'), +('8', '88', '12', '104814', '93004', '16'), +('8', '88', '18', '111734', '130746', '16'), +('8', '88', '18', '111434', '119441', '16'), +('8', '88', '18', '111134', '105383', '16'), +('8', '88', '18', '105378', '91398', '16'), +('8', '88', '19', '111731', '127344', '16'), +('8', '88', '19', '111431', '116272', '16'), +('8', '88', '19', '111131', '102189', '16'), +('8', '88', '19', '105263', '88184', '16'), +('8', '88', '13', '111871', '154456', '16'), +('8', '88', '13', '111815', '152462', '16'), +('8', '88', '13', '111512', '144930', '16'), +('8', '88', '13', '111515', '144902', '16'), +('8', '88', '14', '111871', '154456', '16'), +('8', '88', '14', '111815', '152462', '16'), +('8', '88', '14', '111512', '144930', '16'), +('8', '88', '14', '111515', '144902', '16'), +('8', '88', '11', '111336', '117503', '16'), +('8', '88', '11', '111338', '117448', '16'), +('8', '88', '11', '111333', '117183', '16'), +('8', '88', '11', '111337', '116972', '16'), +('8', '89', '22', '21805', '0', '16'), +('8', '89', '22', '61948', '0', '16'), +('8', '89', '22', '66397', '0', '16'), +('8', '89', '22', '21807', '0', '16'), +('8', '89', '1', '111309', '117789', '16'), +('8', '89', '1', '111300', '117403', '16'), +('8', '89', '1', '111307', '117295', '16'), +('8', '89', '1', '111303', '117237', '16'), +('8', '89', '2', '111732', '128453', '16'), +('8', '89', '2', '111432', '117323', '16'), +('8', '89', '2', '111132', '103073', '16'), +('8', '89', '2', '104704', '94210', '16'), +('8', '89', '3', '111315', '117656', '16'), +('8', '89', '3', '111313', '117572', '16'), +('8', '89', '3', '111312', '117320', '16'), +('8', '89', '3', '111316', '116812', '16'), +('8', '89', '5', '111318', '117263', '16'), +('8', '89', '5', '111319', '117013', '16'), +('8', '89', '5', '111320', '116969', '16'), +('8', '89', '5', '111017', '103201', '16'), +('8', '89', '8', '111331', '117819', '16'), +('8', '89', '8', '111328', '117482', '16'), +('8', '89', '8', '111332', '117336', '16'), +('8', '89', '8', '111330', '117179', '16'), +('8', '89', '6', '111324', '117480', '16'), +('8', '89', '6', '111322', '117320', '16'), +('8', '89', '6', '111326', '116866', '16'), +('8', '89', '6', '111023', '103365', '16'), +('8', '89', '17', '111735', '134496', '16'), +('8', '89', '17', '111435', '123506', '16'), +('8', '89', '17', '111135', '109558', '16'), +('8', '89', '17', '105379', '95008', '16'), +('8', '89', '7', '111733', '128504', '16'), +('8', '89', '7', '111433', '117164', '16'), +('8', '89', '7', '111133', '102967', '16'), +('8', '89', '7', '104929', '94001', '16'), +('8', '89', '9', '111729', '124241', '16'), +('8', '89', '9', '67098', '117833', '16'), +('8', '89', '9', '111429', '113406', '16'), +('8', '89', '9', '111129', '99333', '16'), +('8', '89', '15', '111348', '117818', '16'), +('8', '89', '15', '111343', '117563', '16'), +('8', '89', '15', '111345', '117310', '16'), +('8', '89', '15', '111341', '117283', '16'), +('8', '89', '20', '111354', '127097', '16'), +('8', '89', '20', '111355', '126574', '16'), +('8', '89', '20', '111351', '126236', '16'), +('8', '89', '20', '111352', '126077', '16'), +('8', '89', '12', '111730', '126236', '16'), +('8', '89', '12', '111430', '115229', '16'), +('8', '89', '12', '111130', '100891', '16'), +('8', '89', '12', '104814', '93006', '16'), +('8', '89', '18', '111734', '130747', '16'), +('8', '89', '18', '111434', '119442', '16'), +('8', '89', '18', '111134', '105384', '16'), +('8', '89', '18', '105378', '91399', '16'), +('8', '89', '19', '111731', '127346', '16'), +('8', '89', '19', '111431', '116273', '16'), +('8', '89', '19', '111131', '102191', '16'), +('8', '89', '19', '105263', '88185', '16'), +('8', '89', '13', '111871', '154524', '16'), +('8', '89', '13', '111815', '152531', '16'), +('8', '89', '13', '111512', '144999', '16'), +('8', '89', '13', '111515', '144970', '16'), +('8', '89', '14', '111871', '154524', '16'), +('8', '89', '14', '111815', '152531', '16'), +('8', '89', '14', '111512', '144999', '16'), +('8', '89', '14', '111515', '144970', '16'), +('8', '89', '11', '111336', '117505', '16'), +('8', '89', '11', '111338', '117450', '16'), +('8', '89', '11', '111333', '117185', '16'), +('8', '89', '11', '111337', '116974', '16'), +('8', '90', '22', '21805', '0', '17'), +('8', '90', '22', '61948', '0', '17'), +('8', '90', '22', '66397', '0', '17'), +('8', '90', '22', '21807', '0', '17'), +('8', '90', '1', '111309', '117791', '17'), +('8', '90', '1', '111300', '117405', '17'), +('8', '90', '1', '111307', '117298', '17'), +('8', '90', '1', '111303', '117239', '17'), +('8', '90', '2', '111732', '128456', '17'), +('8', '90', '2', '111432', '117326', '17'), +('8', '90', '2', '111132', '103076', '17'), +('8', '90', '2', '104704', '94212', '17'), +('8', '90', '3', '111315', '117658', '17'), +('8', '90', '3', '111313', '117574', '17'), +('8', '90', '3', '111312', '117322', '17'), +('8', '90', '3', '111316', '116814', '17'), +('8', '90', '5', '111318', '117266', '17'), +('8', '90', '5', '111319', '117015', '17'), +('8', '90', '5', '111320', '116971', '17'), +('8', '90', '5', '111017', '103203', '17'), +('8', '90', '8', '111331', '117822', '17'), +('8', '90', '8', '111328', '117484', '17'), +('8', '90', '8', '111332', '117338', '17'), +('8', '90', '8', '111330', '117181', '17'), +('8', '90', '6', '111324', '117482', '17'), +('8', '90', '6', '111322', '117322', '17'), +('8', '90', '6', '111326', '116868', '17'), +('8', '90', '6', '111023', '103367', '17'), +('8', '90', '17', '111735', '134497', '17'), +('8', '90', '17', '111435', '123507', '17'), +('8', '90', '17', '111135', '109560', '17'), +('8', '90', '17', '105379', '95009', '17'), +('8', '90', '7', '111733', '128506', '17'), +('8', '90', '7', '111433', '117166', '17'), +('8', '90', '7', '111133', '102968', '17'), +('8', '90', '7', '104929', '94002', '17'), +('8', '90', '9', '111729', '124243', '17'), +('8', '90', '9', '67098', '119158', '17'), +('8', '90', '9', '111429', '113408', '17'), +('8', '90', '9', '111129', '99335', '17'), +('8', '90', '15', '111348', '117820', '17'), +('8', '90', '15', '111343', '117564', '17'), +('8', '90', '15', '111345', '117313', '17'), +('8', '90', '15', '111341', '117286', '17'), +('8', '90', '20', '111354', '127099', '17'), +('8', '90', '20', '111355', '126576', '17'), +('8', '90', '20', '111351', '126238', '17'), +('8', '90', '20', '111352', '126079', '17'), +('8', '90', '12', '111730', '126238', '17'), +('8', '90', '12', '111430', '115230', '17'), +('8', '90', '12', '111130', '100893', '17'), +('8', '90', '12', '104814', '93007', '17'), +('8', '90', '18', '111734', '130747', '17'), +('8', '90', '18', '111434', '119442', '17'), +('8', '90', '18', '111134', '105385', '17'), +('8', '90', '18', '105378', '91400', '17'), +('8', '90', '19', '111731', '127347', '17'), +('8', '90', '19', '111431', '116274', '17'), +('8', '90', '19', '111131', '102192', '17'), +('8', '90', '19', '105263', '88187', '17'), +('8', '90', '13', '111871', '154593', '17'), +('8', '90', '13', '111815', '152599', '17'), +('8', '90', '13', '111512', '145067', '17'), +('8', '90', '13', '111515', '145038', '17'), +('8', '90', '14', '111871', '154593', '17'), +('8', '90', '14', '111815', '152599', '17'), +('8', '90', '14', '111512', '145067', '17'), +('8', '90', '14', '111515', '145038', '17'), +('8', '90', '11', '111336', '117507', '17'), +('8', '90', '11', '111338', '117453', '17'), +('8', '90', '11', '111333', '117187', '17'), +('8', '90', '11', '111337', '116976', '17'), +('8', '91', '22', '21805', '0', '17'), +('8', '91', '22', '61948', '0', '17'), +('8', '91', '22', '66397', '0', '17'), +('8', '91', '22', '21807', '0', '17'), +('8', '91', '1', '111309', '117794', '17'), +('8', '91', '1', '111300', '117407', '17'), +('8', '91', '1', '111307', '117301', '17'), +('8', '91', '1', '111303', '117241', '17'), +('8', '91', '2', '111732', '128458', '17'), +('8', '91', '2', '111432', '117328', '17'), +('8', '91', '2', '111132', '103078', '17'), +('8', '91', '2', '104704', '94214', '17'), +('8', '91', '3', '111315', '117661', '17'), +('8', '91', '3', '111313', '117576', '17'), +('8', '91', '3', '111312', '117324', '17'), +('8', '91', '3', '111316', '116817', '17'), +('8', '91', '5', '111318', '117268', '17'), +('8', '91', '5', '111319', '117018', '17'), +('8', '91', '5', '111320', '116973', '17'), +('8', '91', '5', '111017', '103205', '17'), +('8', '91', '8', '111331', '117824', '17'), +('8', '91', '8', '111328', '117487', '17'), +('8', '91', '8', '111332', '117340', '17'), +('8', '91', '8', '111330', '117183', '17'), +('8', '91', '6', '111324', '117484', '17'), +('8', '91', '6', '111322', '117324', '17'), +('8', '91', '6', '111326', '116871', '17'), +('8', '91', '6', '111023', '103369', '17'), +('8', '91', '17', '111735', '134499', '17'), +('8', '91', '17', '111435', '123509', '17'), +('8', '91', '17', '111135', '109561', '17'), +('8', '91', '17', '105379', '95011', '17'), +('8', '91', '7', '111733', '128508', '17'), +('8', '91', '7', '111433', '117168', '17'), +('8', '91', '7', '111133', '102970', '17'), +('8', '91', '7', '104929', '94004', '17'), +('8', '91', '9', '111729', '124245', '17'), +('8', '91', '9', '67098', '119160', '17'), +('8', '91', '9', '111429', '113410', '17'), +('8', '91', '9', '111129', '99337', '17'), +('8', '91', '15', '111348', '117822', '17'), +('8', '91', '15', '111343', '117566', '17'), +('8', '91', '15', '111345', '117315', '17'), +('8', '91', '15', '111341', '117289', '17'), +('8', '91', '20', '111354', '127101', '17'), +('8', '91', '20', '111355', '126577', '17'), +('8', '91', '20', '111351', '126240', '17'), +('8', '91', '20', '111352', '126081', '17'), +('8', '91', '12', '111730', '126239', '17'), +('8', '91', '12', '111430', '115232', '17'), +('8', '91', '12', '111130', '100894', '17'), +('8', '91', '12', '104814', '93009', '17'), +('8', '91', '18', '111734', '130748', '17'), +('8', '91', '18', '111434', '119443', '17'), +('8', '91', '18', '111134', '105386', '17'), +('8', '91', '18', '105378', '91401', '17'), +('8', '91', '19', '111731', '127348', '17'), +('8', '91', '19', '111431', '116276', '17'), +('8', '91', '19', '111131', '102193', '17'), +('8', '91', '19', '105263', '88188', '17'), +('8', '91', '13', '111871', '154661', '17'), +('8', '91', '13', '111815', '152667', '17'), +('8', '91', '13', '111512', '145135', '17'), +('8', '91', '13', '111515', '145106', '17'), +('8', '91', '14', '111871', '154661', '17'), +('8', '91', '14', '111815', '152667', '17'), +('8', '91', '14', '111512', '145135', '17'), +('8', '91', '14', '111515', '145106', '17'), +('8', '91', '11', '111336', '117510', '17'), +('8', '91', '11', '111338', '117455', '17'), +('8', '91', '11', '111333', '117188', '17'), +('8', '91', '11', '111337', '116978', '17'), +('8', '92', '22', '21805', '0', '17'), +('8', '92', '22', '61948', '0', '17'), +('8', '92', '22', '66397', '0', '17'), +('8', '92', '22', '21807', '0', '17'), +('8', '92', '1', '111309', '117796', '17'), +('8', '92', '1', '111300', '117409', '17'), +('8', '92', '1', '111307', '117304', '17'), +('8', '92', '1', '111303', '117243', '17'), +('8', '92', '2', '111732', '128460', '17'), +('8', '92', '2', '111432', '117330', '17'), +('8', '92', '2', '111132', '103080', '17'), +('8', '92', '2', '104704', '94217', '17'), +('8', '92', '3', '111315', '117664', '17'), +('8', '92', '3', '111313', '117578', '17'), +('8', '92', '3', '111312', '117326', '17'), +('8', '92', '3', '111316', '116819', '17'), +('8', '92', '5', '111318', '117270', '17'), +('8', '92', '5', '111319', '117021', '17'), +('8', '92', '5', '111320', '116975', '17'), +('8', '92', '5', '111017', '103208', '17'), +('8', '92', '8', '111331', '117826', '17'), +('8', '92', '8', '111328', '117490', '17'), +('8', '92', '8', '111332', '117343', '17'), +('8', '92', '8', '111330', '117185', '17'), +('8', '92', '6', '111324', '117487', '17'), +('8', '92', '6', '111322', '117326', '17'), +('8', '92', '6', '111326', '116873', '17'), +('8', '92', '6', '111023', '103372', '17'), +('8', '92', '17', '111735', '134501', '17'), +('8', '92', '17', '111435', '123511', '17'), +('8', '92', '17', '111135', '109563', '17'), +('8', '92', '17', '105379', '95013', '17'), +('8', '92', '7', '111733', '128510', '17'), +('8', '92', '7', '111433', '117170', '17'), +('8', '92', '7', '111133', '102972', '17'), +('8', '92', '7', '104929', '94006', '17'), +('8', '92', '9', '111729', '124246', '17'), +('8', '92', '9', '67098', '119162', '17'), +('8', '92', '9', '111429', '113411', '17'), +('8', '92', '9', '111129', '99339', '17'), +('8', '92', '15', '111348', '117824', '17'), +('8', '92', '15', '111343', '117568', '17'), +('8', '92', '15', '111345', '117317', '17'), +('8', '92', '15', '111341', '117292', '17'), +('8', '92', '20', '111354', '127104', '17'), +('8', '92', '20', '111355', '126579', '17'), +('8', '92', '20', '111351', '126243', '17'), +('8', '92', '20', '111352', '126084', '17'), +('8', '92', '12', '111730', '126241', '17'), +('8', '92', '12', '111430', '115234', '17'), +('8', '92', '12', '111130', '100896', '17'), +('8', '92', '12', '104814', '93011', '17'), +('8', '92', '18', '111734', '130749', '17'), +('8', '92', '18', '111434', '119444', '17'), +('8', '92', '18', '111134', '105386', '17'), +('8', '92', '18', '105378', '91401', '17'), +('8', '92', '19', '111731', '127350', '17'), +('8', '92', '19', '111431', '116277', '17'), +('8', '92', '19', '111131', '102195', '17'), +('8', '92', '19', '105263', '88190', '17'), +('8', '92', '13', '111871', '154730', '17'), +('8', '92', '13', '111815', '152735', '17'), +('8', '92', '13', '111512', '145203', '17'), +('8', '92', '13', '111515', '145174', '17'), +('8', '92', '14', '111871', '154730', '17'), +('8', '92', '14', '111815', '152735', '17'), +('8', '92', '14', '111512', '145203', '17'), +('8', '92', '14', '111515', '145174', '17'), +('8', '92', '11', '111336', '117512', '17'), +('8', '92', '11', '111338', '117458', '17'), +('8', '92', '11', '111333', '117190', '17'), +('8', '92', '11', '111337', '116980', '17'), +('8', '93', '22', '21805', '0', '17'), +('8', '93', '22', '61948', '0', '17'), +('8', '93', '22', '66397', '0', '17'), +('8', '93', '22', '21807', '0', '17'), +('8', '93', '1', '111309', '117799', '17'), +('8', '93', '1', '111300', '117411', '17'), +('8', '93', '1', '111307', '117307', '17'), +('8', '93', '1', '111303', '117245', '17'), +('8', '93', '2', '111732', '128462', '17'), +('8', '93', '2', '111432', '117332', '17'), +('8', '93', '2', '111132', '103082', '17'), +('8', '93', '2', '104704', '94219', '17'), +('8', '93', '3', '111315', '117667', '17'), +('8', '93', '3', '111313', '117580', '17'), +('8', '93', '3', '111312', '117328', '17'), +('8', '93', '3', '111316', '116821', '17'), +('8', '93', '5', '111318', '117272', '17'), +('8', '93', '5', '111319', '117023', '17'), +('8', '93', '5', '111320', '116977', '17'), +('8', '93', '5', '111017', '103210', '17'), +('8', '93', '8', '111331', '117828', '17'), +('8', '93', '8', '111328', '117493', '17'), +('8', '93', '8', '111332', '117345', '17'), +('8', '93', '8', '111330', '117187', '17'), +('8', '93', '6', '111324', '117489', '17'), +('8', '93', '6', '111322', '117328', '17'), +('8', '93', '6', '111326', '116876', '17'), +('8', '93', '6', '111023', '103374', '17'), +('8', '93', '17', '111735', '134502', '17'), +('8', '93', '17', '111435', '123512', '17'), +('8', '93', '17', '111135', '109565', '17'), +('8', '93', '17', '105379', '95014', '17'), +('8', '93', '7', '111733', '128511', '17'), +('8', '93', '7', '111433', '117171', '17'), +('8', '93', '7', '111133', '102974', '17'), +('8', '93', '7', '104929', '94008', '17'), +('8', '93', '9', '111729', '124248', '17'), +('8', '93', '9', '67098', '119164', '17'), +('8', '93', '9', '111429', '113413', '17'), +('8', '93', '9', '111129', '99341', '17'), +('8', '93', '15', '111348', '117826', '17'), +('8', '93', '15', '111343', '117570', '17'), +('8', '93', '15', '111345', '117319', '17'), +('8', '93', '15', '111341', '117295', '17'), +('8', '93', '20', '111354', '127106', '17'), +('8', '93', '20', '111355', '126580', '17'), +('8', '93', '20', '111351', '126245', '17'), +('8', '93', '20', '111352', '126086', '17'), +('8', '93', '12', '111730', '126243', '17'), +('8', '93', '12', '111430', '115235', '17'), +('8', '93', '12', '111130', '100898', '17'), +('8', '93', '12', '104814', '93012', '17'), +('8', '93', '18', '111734', '130750', '17'), +('8', '93', '18', '111434', '119445', '17'), +('8', '93', '18', '111134', '105387', '17'), +('8', '93', '18', '105378', '91402', '17'), +('8', '93', '19', '111731', '127351', '17'), +('8', '93', '19', '111431', '116279', '17'), +('8', '93', '19', '111131', '102196', '17'), +('8', '93', '19', '105263', '88191', '17'), +('8', '93', '13', '111871', '154798', '17'), +('8', '93', '13', '111815', '152804', '17'), +('8', '93', '13', '111512', '145271', '17'), +('8', '93', '13', '111515', '145242', '17'), +('8', '93', '14', '111871', '154798', '17'), +('8', '93', '14', '111815', '152804', '17'), +('8', '93', '14', '111512', '145271', '17'), +('8', '93', '14', '111515', '145242', '17'), +('8', '93', '11', '111336', '117514', '17'), +('8', '93', '11', '111338', '117460', '17'), +('8', '93', '11', '111333', '117192', '17'), +('8', '93', '11', '111337', '116982', '17'), +('8', '94', '22', '21805', '0', '17'), +('8', '94', '22', '61948', '0', '17'), +('8', '94', '22', '66397', '0', '17'), +('8', '94', '22', '21807', '0', '17'), +('8', '94', '1', '111309', '117801', '17'), +('8', '94', '1', '111300', '117414', '17'), +('8', '94', '1', '111307', '117311', '17'), +('8', '94', '1', '111303', '117247', '17'), +('8', '94', '2', '111732', '128464', '17'), +('8', '94', '2', '111432', '117334', '17'), +('8', '94', '2', '111132', '103084', '17'), +('8', '94', '2', '104704', '94221', '17'), +('8', '94', '3', '111315', '117669', '17'), +('8', '94', '3', '111313', '117582', '17'), +('8', '94', '3', '111312', '117330', '17'), +('8', '94', '3', '111316', '116823', '17'), +('8', '94', '5', '111318', '117275', '17'), +('8', '94', '5', '111319', '117026', '17'), +('8', '94', '5', '111320', '116980', '17'), +('8', '94', '5', '111017', '103212', '17'), +('8', '94', '8', '111331', '117830', '17'), +('8', '94', '8', '111328', '117496', '17'), +('8', '94', '8', '111332', '117347', '17'), +('8', '94', '8', '111330', '117189', '17'), +('8', '94', '6', '111324', '117491', '17'), +('8', '94', '6', '111322', '117330', '17'), +('8', '94', '6', '111326', '116878', '17'), +('8', '94', '6', '111023', '103376', '17'), +('8', '94', '17', '111735', '134504', '17'), +('8', '94', '17', '111435', '123514', '17'), +('8', '94', '17', '111135', '109566', '17'), +('8', '94', '17', '105379', '95016', '17'), +('8', '94', '7', '111733', '128513', '17'), +('8', '94', '7', '111433', '117173', '17'), +('8', '94', '7', '111133', '102976', '17'), +('8', '94', '7', '104929', '94010', '17'), +('8', '94', '9', '111729', '124250', '17'), +('8', '94', '9', '67098', '119166', '17'), +('8', '94', '9', '111429', '113415', '17'), +('8', '94', '9', '111129', '99343', '17'), +('8', '94', '15', '111348', '117828', '17'), +('8', '94', '15', '111343', '117571', '17'), +('8', '94', '15', '111345', '117322', '17'), +('8', '94', '15', '111341', '117299', '17'), +('8', '94', '20', '111354', '127108', '17'), +('8', '94', '20', '111355', '126582', '17'), +('8', '94', '20', '111351', '126247', '17'), +('8', '94', '20', '111352', '126088', '17'), +('8', '94', '12', '111730', '126244', '17'), +('8', '94', '12', '111430', '115237', '17'), +('8', '94', '12', '111130', '100899', '17'), +('8', '94', '12', '104814', '93014', '17'), +('8', '94', '18', '111734', '130750', '17'), +('8', '94', '18', '111434', '119445', '17'), +('8', '94', '18', '111134', '105388', '17'), +('8', '94', '18', '105378', '91403', '17'), +('8', '94', '19', '111731', '127353', '17'), +('8', '94', '19', '111431', '116280', '17'), +('8', '94', '19', '111131', '102198', '17'), +('8', '94', '19', '105263', '88192', '17'), +('8', '94', '13', '111871', '154867', '17'), +('8', '94', '13', '111815', '152872', '17'), +('8', '94', '13', '111512', '145340', '17'), +('8', '94', '13', '111515', '145310', '17'), +('8', '94', '14', '111871', '154867', '17'), +('8', '94', '14', '111815', '152872', '17'), +('8', '94', '14', '111512', '145340', '17'), +('8', '94', '14', '111515', '145310', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '94', '11', '111336', '117516', '17'), +('8', '94', '11', '111338', '117463', '17'), +('8', '94', '11', '111333', '117194', '17'), +('8', '94', '11', '111337', '116984', '17'), +('8', '95', '22', '21807', '0', '18'), +('8', '95', '22', '21805', '0', '18'), +('8', '95', '22', '61948', '0', '18'), +('8', '95', '22', '12425', '0', '18'), +('8', '95', '1', '111309', '117804', '18'), +('8', '95', '1', '111300', '117416', '18'), +('8', '95', '1', '111307', '117314', '18'), +('8', '95', '1', '111303', '117249', '18'), +('8', '95', '2', '111732', '128466', '18'), +('8', '95', '2', '111432', '117336', '18'), +('8', '95', '2', '111132', '103086', '18'), +('8', '95', '2', '104704', '94223', '18'), +('8', '95', '3', '111315', '117672', '18'), +('8', '95', '3', '111313', '117583', '18'), +('8', '95', '3', '111312', '117332', '18'), +('8', '95', '3', '111316', '116826', '18'), +('8', '95', '5', '111318', '117277', '18'), +('8', '95', '5', '111319', '117029', '18'), +('8', '95', '5', '111320', '116982', '18'), +('8', '95', '5', '111017', '103214', '18'), +('8', '95', '8', '111331', '117833', '18'), +('8', '95', '8', '111328', '117499', '18'), +('8', '95', '8', '111332', '117349', '18'), +('8', '95', '8', '111330', '117191', '18'), +('8', '95', '6', '111324', '117494', '18'), +('8', '95', '6', '111322', '117332', '18'), +('8', '95', '6', '111326', '116881', '18'), +('8', '95', '6', '111023', '103379', '18'), +('8', '95', '17', '111735', '134505', '18'), +('8', '95', '17', '111435', '123515', '18'), +('8', '95', '17', '111135', '109568', '18'), +('8', '95', '17', '105379', '95017', '18'), +('8', '95', '7', '111733', '128515', '18'), +('8', '95', '7', '111433', '117175', '18'), +('8', '95', '7', '111133', '102977', '18'), +('8', '95', '7', '104929', '94011', '18'), +('8', '95', '9', '111729', '124252', '18'), +('8', '95', '9', '67098', '119167', '18'), +('8', '95', '9', '111429', '113417', '18'), +('8', '95', '9', '111129', '99344', '18'), +('8', '95', '15', '111348', '117830', '18'), +('8', '95', '15', '111343', '117573', '18'), +('8', '95', '15', '111345', '117324', '18'), +('8', '95', '15', '111341', '117302', '18'), +('8', '95', '20', '111354', '127111', '18'), +('8', '95', '20', '111355', '126583', '18'), +('8', '95', '20', '111351', '126249', '18'), +('8', '95', '20', '111352', '126090', '18'), +('8', '95', '12', '111730', '126246', '18'), +('8', '95', '12', '111430', '115239', '18'), +('8', '95', '12', '111130', '100901', '18'), +('8', '95', '12', '104814', '93015', '18'), +('8', '95', '18', '111734', '130751', '18'), +('8', '95', '18', '111434', '119446', '18'), +('8', '95', '18', '111134', '105389', '18'), +('8', '95', '18', '105378', '91403', '18'), +('8', '95', '19', '111731', '127354', '18'), +('8', '95', '19', '111431', '116282', '18'), +('8', '95', '19', '111131', '102199', '18'), +('8', '95', '19', '105263', '88194', '18'), +('8', '95', '13', '111871', '154935', '18'), +('8', '95', '13', '111815', '152940', '18'), +('8', '95', '13', '111512', '145408', '18'), +('8', '95', '13', '111515', '145378', '18'), +('8', '95', '14', '111871', '154935', '18'), +('8', '95', '14', '111815', '152940', '18'), +('8', '95', '14', '111512', '145408', '18'), +('8', '95', '14', '111515', '145378', '18'), +('8', '95', '11', '111336', '117518', '18'), +('8', '95', '11', '111338', '117465', '18'), +('8', '95', '11', '111333', '117196', '18'), +('8', '95', '11', '111337', '116987', '18'), +('8', '96', '22', '21807', '0', '18'), +('8', '96', '22', '21805', '0', '18'), +('8', '96', '22', '61948', '0', '18'), +('8', '96', '22', '12425', '0', '18'), +('8', '96', '1', '111309', '117807', '18'), +('8', '96', '1', '111300', '117418', '18'), +('8', '96', '1', '111307', '117317', '18'), +('8', '96', '1', '111303', '117251', '18'), +('8', '96', '2', '111732', '128469', '18'), +('8', '96', '2', '111432', '117339', '18'), +('8', '96', '2', '111132', '103089', '18'), +('8', '96', '2', '104704', '94225', '18'), +('8', '96', '3', '111315', '117675', '18'), +('8', '96', '3', '111313', '117585', '18'), +('8', '96', '3', '111312', '117334', '18'), +('8', '96', '3', '111316', '116828', '18'), +('8', '96', '5', '111318', '117279', '18'), +('8', '96', '5', '111319', '117032', '18'), +('8', '96', '5', '111320', '116984', '18'), +('8', '96', '5', '111017', '103217', '18'), +('8', '96', '8', '111331', '117835', '18'), +('8', '96', '8', '111328', '117502', '18'), +('8', '96', '8', '111332', '117351', '18'), +('8', '96', '8', '111330', '117193', '18'), +('8', '96', '6', '111324', '117496', '18'), +('8', '96', '6', '111322', '117334', '18'), +('8', '96', '6', '111326', '116883', '18'), +('8', '96', '6', '111023', '103381', '18'), +('8', '96', '17', '111735', '134507', '18'), +('8', '96', '17', '111435', '123517', '18'), +('8', '96', '17', '111135', '109570', '18'), +('8', '96', '17', '105379', '95019', '18'), +('8', '96', '7', '111733', '128517', '18'), +('8', '96', '7', '111433', '117177', '18'), +('8', '96', '7', '111133', '102979', '18'), +('8', '96', '7', '104929', '94013', '18'), +('8', '96', '9', '111729', '124254', '18'), +('8', '96', '9', '67098', '119169', '18'), +('8', '96', '9', '111429', '113419', '18'), +('8', '96', '9', '111129', '99346', '18'), +('8', '96', '15', '111348', '117832', '18'), +('8', '96', '15', '111343', '117575', '18'), +('8', '96', '15', '111345', '117326', '18'), +('8', '96', '15', '111341', '117305', '18'), +('8', '96', '20', '111354', '127113', '18'), +('8', '96', '20', '111355', '126585', '18'), +('8', '96', '20', '111351', '126251', '18'), +('8', '96', '20', '111352', '126092', '18'), +('8', '96', '12', '111730', '126248', '18'), +('8', '96', '12', '111430', '115240', '18'), +('8', '96', '12', '111130', '100903', '18'), +('8', '96', '12', '104814', '93017', '18'), +('8', '96', '18', '111734', '130752', '18'), +('8', '96', '18', '111434', '119447', '18'), +('8', '96', '18', '111134', '105389', '18'), +('8', '96', '18', '105378', '91404', '18'), +('8', '96', '19', '111731', '127355', '18'), +('8', '96', '19', '111431', '116283', '18'), +('8', '96', '19', '111131', '102200', '18'), +('8', '96', '19', '105263', '88195', '18'), +('8', '96', '13', '111871', '155004', '18'), +('8', '96', '13', '111815', '153008', '18'), +('8', '96', '13', '111512', '145476', '18'), +('8', '96', '13', '111515', '145446', '18'), +('8', '96', '14', '111871', '155004', '18'), +('8', '96', '14', '111815', '153008', '18'), +('8', '96', '14', '111512', '145476', '18'), +('8', '96', '14', '111515', '145446', '18'), +('8', '96', '11', '111336', '117521', '18'), +('8', '96', '11', '111338', '117467', '18'), +('8', '96', '11', '111333', '117198', '18'), +('8', '96', '11', '111337', '116989', '18'), +('8', '97', '22', '21807', '0', '18'), +('8', '97', '22', '21805', '0', '18'), +('8', '97', '22', '61948', '0', '18'), +('8', '97', '22', '12425', '0', '18'), +('8', '97', '1', '111309', '117809', '18'), +('8', '97', '1', '111300', '117420', '18'), +('8', '97', '1', '111307', '117320', '18'), +('8', '97', '1', '111303', '117252', '18'), +('8', '97', '2', '111732', '128471', '18'), +('8', '97', '2', '111432', '117341', '18'), +('8', '97', '2', '111132', '103091', '18'), +('8', '97', '2', '104704', '94227', '18'), +('8', '97', '3', '111315', '117677', '18'), +('8', '97', '3', '111313', '117587', '18'), +('8', '97', '3', '111312', '117336', '18'), +('8', '97', '3', '111316', '116830', '18'), +('8', '97', '5', '111318', '117281', '18'), +('8', '97', '5', '111319', '117034', '18'), +('8', '97', '5', '111320', '116986', '18'), +('8', '97', '5', '111017', '103219', '18'), +('8', '97', '8', '111331', '117837', '18'), +('8', '97', '8', '111328', '117505', '18'), +('8', '97', '8', '111332', '117353', '18'), +('8', '97', '8', '111330', '117195', '18'), +('8', '97', '6', '111324', '117498', '18'), +('8', '97', '6', '111322', '117336', '18'), +('8', '97', '6', '111326', '116886', '18'), +('8', '97', '6', '111023', '103383', '18'), +('8', '97', '17', '111735', '134509', '18'), +('8', '97', '17', '111435', '123519', '18'), +('8', '97', '17', '111135', '109571', '18'), +('8', '97', '17', '105379', '95021', '18'), +('8', '97', '7', '111733', '128519', '18'), +('8', '97', '7', '111433', '117179', '18'), +('8', '97', '7', '111133', '102981', '18'), +('8', '97', '7', '104929', '94015', '18'), +('8', '97', '9', '111729', '124256', '18'), +('8', '97', '9', '67098', '119171', '18'), +('8', '97', '9', '111429', '113421', '18'), +('8', '97', '9', '111129', '99348', '18'), +('8', '97', '15', '111348', '117834', '18'), +('8', '97', '15', '111343', '117577', '18'), +('8', '97', '15', '111345', '117329', '18'), +('8', '97', '15', '111341', '117308', '18'), +('8', '97', '20', '111354', '127115', '18'), +('8', '97', '20', '111355', '126586', '18'), +('8', '97', '20', '111351', '126253', '18'), +('8', '97', '20', '111352', '126094', '18'), +('8', '97', '12', '111730', '126249', '18'), +('8', '97', '12', '111430', '115242', '18'), +('8', '97', '12', '111130', '100904', '18'), +('8', '97', '12', '104814', '93019', '18'), +('8', '97', '18', '111734', '130753', '18'), +('8', '97', '18', '111434', '119448', '18'), +('8', '97', '18', '111134', '105390', '18'), +('8', '97', '18', '105378', '91405', '18'), +('8', '97', '19', '111731', '127357', '18'), +('8', '97', '19', '111431', '116284', '18'), +('8', '97', '19', '111131', '102202', '18'), +('8', '97', '19', '105263', '88197', '18'), +('8', '97', '13', '111871', '155072', '18'), +('8', '97', '13', '111815', '153077', '18'), +('8', '97', '13', '111512', '145544', '18'), +('8', '97', '13', '111515', '145514', '18'), +('8', '97', '14', '111871', '155072', '18'), +('8', '97', '14', '111815', '153077', '18'), +('8', '97', '14', '111512', '145544', '18'), +('8', '97', '14', '111515', '145514', '18'), +('8', '97', '11', '111336', '117523', '18'), +('8', '97', '11', '111338', '117470', '18'), +('8', '97', '11', '111333', '117200', '18'), +('8', '97', '11', '111337', '116991', '18'), +('8', '98', '22', '21807', '0', '18'), +('8', '98', '22', '21805', '0', '18'), +('8', '98', '22', '61948', '0', '18'), +('8', '98', '22', '12425', '0', '18'), +('8', '98', '1', '111309', '117812', '18'), +('8', '98', '1', '111300', '117422', '18'), +('8', '98', '1', '111307', '117323', '18'), +('8', '98', '1', '111303', '117254', '18'), +('8', '98', '2', '111732', '128473', '18'), +('8', '98', '2', '111432', '117343', '18'), +('8', '98', '2', '111132', '103093', '18'), +('8', '98', '2', '104704', '94229', '18'), +('8', '98', '3', '111315', '117680', '18'), +('8', '98', '3', '111313', '117589', '18'), +('8', '98', '3', '111312', '117339', '18'), +('8', '98', '3', '111316', '116832', '18'), +('8', '98', '5', '111318', '117284', '18'), +('8', '98', '5', '111319', '117037', '18'), +('8', '98', '5', '111320', '116989', '18'), +('8', '98', '5', '111017', '103221', '18'), +('8', '98', '8', '111331', '117839', '18'), +('8', '98', '8', '111328', '117508', '18'), +('8', '98', '8', '111332', '117355', '18'), +('8', '98', '8', '111330', '117197', '18'), +('8', '98', '6', '111324', '117501', '18'), +('8', '98', '6', '111322', '117338', '18'), +('8', '98', '6', '111326', '116888', '18'), +('8', '98', '6', '111023', '103386', '18'), +('8', '98', '17', '111735', '134510', '18'), +('8', '98', '17', '111435', '123520', '18'), +('8', '98', '17', '111135', '109573', '18'), +('8', '98', '17', '105379', '95022', '18'), +('8', '98', '7', '111733', '128520', '18'), +('8', '98', '7', '111433', '117180', '18'), +('8', '98', '7', '111133', '102983', '18'), +('8', '98', '7', '104929', '94017', '18'), +('8', '98', '9', '111729', '124258', '18'), +('8', '98', '9', '67098', '119173', '18'), +('8', '98', '9', '111429', '113423', '18'), +('8', '98', '9', '111129', '99350', '18'), +('8', '98', '15', '111348', '117837', '18'), +('8', '98', '15', '111343', '117578', '18'), +('8', '98', '15', '111345', '117331', '18'), +('8', '98', '15', '111341', '117311', '18'), +('8', '98', '20', '111354', '127117', '18'), +('8', '98', '20', '111355', '126588', '18'), +('8', '98', '20', '111351', '126255', '18'), +('8', '98', '20', '111352', '126096', '18'), +('8', '98', '12', '111730', '126251', '18'), +('8', '98', '12', '111430', '115244', '18'), +('8', '98', '12', '111130', '100906', '18'), +('8', '98', '12', '104814', '93020', '18'), +('8', '98', '18', '111734', '130753', '18'), +('8', '98', '18', '111434', '119448', '18'), +('8', '98', '18', '111134', '105391', '18'), +('8', '98', '18', '105378', '91406', '18'), +('8', '98', '19', '111731', '127358', '18'), +('8', '98', '19', '111431', '116286', '18'), +('8', '98', '19', '111131', '102203', '18'), +('8', '98', '19', '105263', '88198', '18'), +('8', '98', '13', '111871', '155141', '18'), +('8', '98', '13', '111815', '153145', '18'), +('8', '98', '13', '111512', '145613', '18'), +('8', '98', '13', '111515', '145583', '18'), +('8', '98', '14', '111871', '155141', '18'), +('8', '98', '14', '111815', '153145', '18'), +('8', '98', '14', '111512', '145613', '18'), +('8', '98', '14', '111515', '145583', '18'), +('8', '98', '11', '111336', '117525', '18'), +('8', '98', '11', '111338', '117472', '18'), +('8', '98', '11', '111333', '117201', '18'), +('8', '98', '11', '111337', '116993', '18'), +('8', '99', '22', '21807', '0', '18'), +('8', '99', '22', '21805', '0', '18'), +('8', '99', '22', '61948', '0', '18'), +('8', '99', '22', '12425', '0', '18'), +('8', '99', '1', '111309', '117814', '18'), +('8', '99', '1', '111300', '117424', '18'), +('8', '99', '1', '111307', '117326', '18'), +('8', '99', '1', '111303', '117256', '18'), +('8', '99', '2', '111732', '128475', '18'), +('8', '99', '2', '111432', '117345', '18'), +('8', '99', '2', '111132', '103095', '18'), +('8', '99', '2', '104704', '94232', '18'), +('8', '99', '3', '111315', '117683', '18'), +('8', '99', '3', '111313', '117591', '18'), +('8', '99', '3', '111312', '117341', '18'), +('8', '99', '3', '111316', '116835', '18'), +('8', '99', '5', '111318', '117286', '18'), +('8', '99', '5', '111319', '117040', '18'), +('8', '99', '5', '111320', '116991', '18'), +('8', '99', '5', '111017', '103223', '18'), +('8', '99', '8', '111331', '117842', '18'), +('8', '99', '8', '111328', '117511', '18'), +('8', '99', '8', '111332', '117357', '18'), +('8', '99', '8', '111330', '117199', '18'), +('8', '99', '6', '111324', '117503', '18'), +('8', '99', '6', '111322', '117340', '18'), +('8', '99', '6', '111326', '116891', '18'), +('8', '99', '6', '111023', '103388', '18'), +('8', '99', '17', '111735', '134512', '18'), +('8', '99', '17', '111435', '123522', '18'), +('8', '99', '17', '111135', '109575', '18'), +('8', '99', '17', '105379', '95024', '18'), +('8', '99', '7', '111733', '128522', '18'), +('8', '99', '7', '111433', '117182', '18'), +('8', '99', '7', '111133', '102985', '18'), +('8', '99', '7', '104929', '94019', '18'), +('8', '99', '9', '111729', '124260', '18'), +('8', '99', '9', '67098', '119175', '18'), +('8', '99', '9', '111429', '113425', '18'), +('8', '99', '9', '111129', '99352', '18'), +('8', '99', '15', '111348', '117839', '18'), +('8', '99', '15', '111343', '117580', '18'), +('8', '99', '15', '111345', '117333', '18'), +('8', '99', '15', '111341', '117315', '18'), +('8', '99', '20', '111354', '127120', '18'), +('8', '99', '20', '111355', '126589', '18'), +('8', '99', '20', '111351', '126257', '18'), +('8', '99', '20', '111352', '126099', '18'), +('8', '99', '12', '111730', '126253', '18'), +('8', '99', '12', '111430', '115245', '18'), +('8', '99', '12', '111130', '100908', '18'), +('8', '99', '12', '104814', '93022', '18'), +('8', '99', '18', '111734', '130754', '18'), +('8', '99', '18', '111434', '119449', '18'), +('8', '99', '18', '111134', '105392', '18'), +('8', '99', '18', '105378', '91406', '18'), +('8', '99', '19', '111731', '127360', '18'), +('8', '99', '19', '111431', '116287', '18'), +('8', '99', '19', '111131', '102205', '18'), +('8', '99', '19', '105263', '88200', '18'), +('8', '99', '13', '111871', '155210', '18'), +('8', '99', '13', '111815', '153213', '18'), +('8', '99', '13', '111512', '145681', '18'), +('8', '99', '13', '111515', '145651', '18'), +('8', '99', '14', '111871', '155210', '18'), +('8', '99', '14', '111815', '153213', '18'), +('8', '99', '14', '111512', '145681', '18'), +('8', '99', '14', '111515', '145651', '18'), +('8', '99', '11', '111336', '117527', '18'), +('8', '99', '11', '111338', '117475', '18'), +('8', '99', '11', '111333', '117203', '18'), +('8', '99', '11', '111337', '116995', '18'), +('8', '100', '22', '21807', '0', '20'), +('8', '100', '22', '21805', '0', '20'), +('8', '100', '22', '61948', '0', '20'), +('8', '100', '22', '12425', '0', '20'), +('8', '100', '1', '98769', '192827', '20'), +('8', '100', '1', '111309', '117817', '20'), +('8', '100', '1', '111300', '117426', '20'), +('8', '100', '1', '111307', '117329', '20'), +('8', '100', '2', '111732', '128478', '20'), +('8', '100', '2', '111432', '117348', '20'), +('8', '100', '2', '111132', '103098', '20'), +('8', '100', '2', '104704', '94234', '20'), +('8', '100', '3', '111315', '117686', '20'), +('8', '100', '3', '111313', '117593', '20'), +('8', '100', '3', '111312', '117343', '20'), +('8', '100', '3', '111316', '116837', '20'), +('8', '100', '5', '111318', '117288', '20'), +('8', '100', '5', '111319', '117042', '20'), +('8', '100', '5', '111320', '116993', '20'), +('8', '100', '5', '111017', '103226', '20'), +('8', '100', '8', '111331', '117844', '20'), +('8', '100', '8', '111328', '117514', '20'), +('8', '100', '8', '111332', '117359', '20'), +('8', '100', '8', '111330', '117201', '20'), +('8', '100', '6', '111324', '117505', '20'), +('8', '100', '6', '111322', '117342', '20'), +('8', '100', '6', '111326', '116893', '20'), +('8', '100', '6', '111023', '103390', '20'), +('8', '100', '17', '111735', '134514', '20'), +('8', '100', '17', '111435', '123524', '20'), +('8', '100', '17', '111135', '109576', '20'), +('8', '100', '17', '105379', '95025', '20'), +('8', '100', '7', '111733', '128524', '20'), +('8', '100', '7', '111433', '117184', '20'), +('8', '100', '7', '111133', '102987', '20'), +('8', '100', '7', '104929', '94020', '20'), +('8', '100', '9', '111729', '124261', '20'), +('8', '100', '9', '67098', '119177', '20'), +('8', '100', '9', '111429', '113426', '20'), +('8', '100', '9', '111129', '99354', '20'), +('8', '100', '15', '111348', '117841', '20'), +('8', '100', '15', '111343', '117582', '20'), +('8', '100', '15', '111345', '117336', '20'), +('8', '100', '15', '111341', '117318', '20'), +('8', '100', '20', '111354', '127122', '20'), +('8', '100', '20', '111355', '126591', '20'), +('8', '100', '20', '111351', '126260', '20'), +('8', '100', '20', '111352', '126101', '20'), +('8', '100', '12', '111730', '126254', '20'), +('8', '100', '12', '111430', '115247', '20'), +('8', '100', '12', '111130', '100909', '20'), +('8', '100', '12', '104814', '93023', '20'), +('8', '100', '18', '111734', '130755', '20'), +('8', '100', '18', '111434', '119450', '20'), +('8', '100', '18', '111134', '105392', '20'), +('8', '100', '18', '105378', '91407', '20'), +('8', '100', '19', '111731', '127361', '20'), +('8', '100', '19', '111431', '116289', '20'), +('8', '100', '19', '111131', '102206', '20'), +('8', '100', '19', '105263', '88201', '20'), +('8', '100', '13', '111871', '155612', '20'), +('8', '100', '13', '111815', '153615', '20'), +('8', '100', '13', '111512', '146083', '20'), +('8', '100', '13', '111515', '146052', '20'), +('8', '100', '14', '111871', '155612', '20'), +('8', '100', '14', '111815', '153615', '20'), +('8', '100', '14', '111512', '146083', '20'), +('8', '100', '14', '111515', '146052', '20'), +('8', '100', '11', '133816', '149765', '20'), +('8', '100', '11', '111336', '117529', '20'), +('8', '100', '11', '111338', '117477', '20'), +('8', '100', '11', '111333', '117205', '20'), +('8', '100', '22', '21807', '0', '19'), +('8', '100', '22', '21805', '0', '19'), +('8', '100', '22', '61948', '0', '19'), +('8', '100', '22', '12425', '0', '19'), +('8', '100', '1', '98769', '192827', '19'), +('8', '100', '1', '111309', '117817', '19'), +('8', '100', '1', '111300', '117426', '19'), +('8', '100', '1', '111307', '117329', '19'), +('8', '100', '2', '111732', '128478', '19'), +('8', '100', '2', '111432', '117348', '19'), +('8', '100', '2', '111132', '103098', '19'), +('8', '100', '2', '104704', '94234', '19'), +('8', '100', '3', '111315', '117686', '19'), +('8', '100', '3', '111313', '117593', '19'), +('8', '100', '3', '111312', '117343', '19'), +('8', '100', '3', '111316', '116837', '19'), +('8', '100', '5', '111318', '117288', '19'), +('8', '100', '5', '111319', '117042', '19'), +('8', '100', '5', '111320', '116993', '19'), +('8', '100', '5', '111017', '103226', '19'), +('8', '100', '8', '111331', '117844', '19'), +('8', '100', '8', '111328', '117514', '19'), +('8', '100', '8', '111332', '117359', '19'), +('8', '100', '8', '111330', '117201', '19'), +('8', '100', '6', '111324', '117505', '19'), +('8', '100', '6', '111322', '117342', '19'), +('8', '100', '6', '111326', '116893', '19'), +('8', '100', '6', '111023', '103390', '19'), +('8', '100', '17', '111735', '134514', '19'), +('8', '100', '17', '111435', '123524', '19'), +('8', '100', '17', '111135', '109576', '19'), +('8', '100', '17', '105379', '95025', '19'), +('8', '100', '7', '111733', '128524', '19'), +('8', '100', '7', '111433', '117184', '19'), +('8', '100', '7', '111133', '102987', '19'), +('8', '100', '7', '104929', '94020', '19'), +('8', '100', '9', '111729', '124261', '19'), +('8', '100', '9', '67098', '119177', '19'), +('8', '100', '9', '111429', '113426', '19'), +('8', '100', '9', '111129', '99354', '19'), +('8', '100', '15', '111348', '117841', '19'), +('8', '100', '15', '111343', '117582', '19'), +('8', '100', '15', '111345', '117336', '19'), +('8', '100', '15', '111341', '117318', '19'), +('8', '100', '20', '111354', '127122', '19'), +('8', '100', '20', '111355', '126591', '19'), +('8', '100', '20', '111351', '126260', '19'), +('8', '100', '20', '111352', '126101', '19'), +('8', '100', '12', '111730', '126254', '19'), +('8', '100', '12', '111430', '115247', '19'), +('8', '100', '12', '111130', '100909', '19'), +('8', '100', '12', '104814', '93023', '19'), +('8', '100', '18', '111734', '130755', '19'), +('8', '100', '18', '111434', '119450', '19'), +('8', '100', '18', '111134', '105392', '19'), +('8', '100', '18', '105378', '91407', '19'), +('8', '100', '19', '111731', '127361', '19'), +('8', '100', '19', '111431', '116289', '19'), +('8', '100', '19', '111131', '102206', '19'), +('8', '100', '19', '105263', '88201', '19'), +('8', '100', '13', '111871', '155278', '19'), +('8', '100', '13', '111815', '153281', '19'), +('8', '100', '13', '111512', '145749', '19'), +('8', '100', '13', '111515', '145719', '19'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '100', '14', '111871', '155278', '19'), +('8', '100', '14', '111815', '153281', '19'), +('8', '100', '14', '111512', '145749', '19'), +('8', '100', '14', '111515', '145719', '19'), +('8', '100', '11', '133816', '149765', '19'), +('8', '100', '11', '111336', '117529', '19'), +('8', '100', '11', '111338', '117477', '19'), +('8', '100', '11', '111333', '117205', '19'), +('8', '101', '22', '21807', '0', '20'), +('8', '101', '22', '21805', '0', '20'), +('8', '101', '22', '61948', '0', '20'), +('8', '101', '22', '12425', '0', '20'), +('8', '101', '1', '98769', '192828', '20'), +('8', '101', '1', '111309', '117819', '20'), +('8', '101', '1', '111300', '117428', '20'), +('8', '101', '1', '111307', '117332', '20'), +('8', '101', '2', '111732', '128480', '20'), +('8', '101', '2', '111432', '117350', '20'), +('8', '101', '2', '111132', '103100', '20'), +('8', '101', '2', '104704', '94236', '20'), +('8', '101', '3', '111315', '117689', '20'), +('8', '101', '3', '111313', '117595', '20'), +('8', '101', '3', '111312', '117345', '20'), +('8', '101', '3', '111316', '116839', '20'), +('8', '101', '5', '111318', '117290', '20'), +('8', '101', '5', '111319', '117045', '20'), +('8', '101', '5', '111320', '116995', '20'), +('8', '101', '5', '111017', '103228', '20'), +('8', '101', '8', '111331', '117846', '20'), +('8', '101', '8', '111328', '117517', '20'), +('8', '101', '8', '111332', '117361', '20'), +('8', '101', '8', '111330', '117202', '20'), +('8', '101', '6', '111324', '117508', '20'), +('8', '101', '6', '111322', '117344', '20'), +('8', '101', '6', '111326', '116896', '20'), +('8', '101', '6', '111023', '103393', '20'), +('8', '101', '17', '111735', '134515', '20'), +('8', '101', '17', '111435', '123525', '20'), +('8', '101', '17', '111135', '109578', '20'), +('8', '101', '17', '105379', '95027', '20'), +('8', '101', '7', '111733', '128526', '20'), +('8', '101', '7', '111433', '117186', '20'), +('8', '101', '7', '111133', '102988', '20'), +('8', '101', '7', '104929', '94022', '20'), +('8', '101', '9', '111729', '124263', '20'), +('8', '101', '9', '67098', '119179', '20'), +('8', '101', '9', '111429', '113428', '20'), +('8', '101', '9', '111129', '99356', '20'), +('8', '101', '15', '111348', '117843', '20'), +('8', '101', '15', '111343', '117584', '20'), +('8', '101', '15', '111345', '117338', '20'), +('8', '101', '15', '111341', '117321', '20'), +('8', '101', '20', '111354', '127124', '20'), +('8', '101', '20', '111355', '126592', '20'), +('8', '101', '20', '111351', '126262', '20'), +('8', '101', '20', '111352', '126103', '20'), +('8', '101', '12', '111730', '126256', '20'), +('8', '101', '12', '111430', '115249', '20'), +('8', '101', '12', '111130', '100911', '20'), +('8', '101', '12', '104814', '93025', '20'), +('8', '101', '18', '111734', '130756', '20'), +('8', '101', '18', '111434', '119451', '20'), +('8', '101', '18', '111134', '105393', '20'), +('8', '101', '18', '105378', '91408', '20'), +('8', '101', '19', '111731', '127363', '20'), +('8', '101', '19', '111431', '116290', '20'), +('8', '101', '19', '111131', '102208', '20'), +('8', '101', '19', '105263', '88202', '20'), +('8', '101', '13', '111871', '155680', '20'), +('8', '101', '13', '111815', '153683', '20'), +('8', '101', '13', '111512', '146151', '20'), +('8', '101', '13', '111515', '146120', '20'), +('8', '101', '14', '111871', '155680', '20'), +('8', '101', '14', '111815', '153683', '20'), +('8', '101', '14', '111512', '146151', '20'), +('8', '101', '14', '111515', '146120', '20'), +('8', '101', '11', '133816', '149767', '20'), +('8', '101', '11', '111336', '117532', '20'), +('8', '101', '11', '111338', '117480', '20'), +('8', '101', '11', '111333', '117207', '20'), +('8', '102', '22', '21807', '0', '20'), +('8', '102', '22', '21805', '0', '20'), +('8', '102', '22', '61948', '0', '20'), +('8', '102', '22', '12425', '0', '20'), +('8', '102', '1', '98769', '192830', '20'), +('8', '102', '1', '111309', '117822', '20'), +('8', '102', '1', '111300', '117430', '20'), +('8', '102', '1', '111307', '117335', '20'), +('8', '102', '2', '111732', '128482', '20'), +('8', '102', '2', '111432', '117352', '20'), +('8', '102', '2', '111132', '103102', '20'), +('8', '102', '2', '104704', '94238', '20'), +('8', '102', '3', '111315', '117691', '20'), +('8', '102', '3', '111313', '117597', '20'), +('8', '102', '3', '111312', '117347', '20'), +('8', '102', '3', '111316', '116841', '20'), +('8', '102', '5', '111318', '117293', '20'), +('8', '102', '5', '111319', '117048', '20'), +('8', '102', '5', '111320', '116997', '20'), +('8', '102', '5', '111017', '103230', '20'), +('8', '102', '8', '111331', '117848', '20'), +('8', '102', '8', '111328', '117519', '20'), +('8', '102', '8', '111332', '117363', '20'), +('8', '102', '8', '111330', '117204', '20'), +('8', '102', '6', '111324', '117510', '20'), +('8', '102', '6', '111322', '117346', '20'), +('8', '102', '6', '111326', '116898', '20'), +('8', '102', '6', '111023', '103395', '20'), +('8', '102', '17', '111735', '134517', '20'), +('8', '102', '17', '111435', '123527', '20'), +('8', '102', '17', '111135', '109579', '20'), +('8', '102', '17', '105379', '95029', '20'), +('8', '102', '7', '111733', '128528', '20'), +('8', '102', '7', '111433', '117188', '20'), +('8', '102', '7', '111133', '102990', '20'), +('8', '102', '7', '104929', '94024', '20'), +('8', '102', '9', '111729', '124265', '20'), +('8', '102', '9', '67098', '119180', '20'), +('8', '102', '9', '111429', '113430', '20'), +('8', '102', '9', '111129', '99358', '20'), +('8', '102', '15', '111348', '117845', '20'), +('8', '102', '15', '111343', '117585', '20'), +('8', '102', '15', '111345', '117340', '20'), +('8', '102', '15', '111341', '117324', '20'), +('8', '102', '20', '111354', '127127', '20'), +('8', '102', '20', '111355', '126594', '20'), +('8', '102', '20', '111351', '126264', '20'), +('8', '102', '20', '111352', '126105', '20'), +('8', '102', '12', '111730', '126258', '20'), +('8', '102', '12', '111430', '115250', '20'), +('8', '102', '12', '111130', '100913', '20'), +('8', '102', '12', '104814', '93027', '20'), +('8', '102', '18', '111734', '130756', '20'), +('8', '102', '18', '111434', '119451', '20'), +('8', '102', '18', '111134', '105394', '20'), +('8', '102', '18', '105378', '91408', '20'), +('8', '102', '19', '111731', '127364', '20'), +('8', '102', '19', '111431', '116292', '20'), +('8', '102', '19', '111131', '102209', '20'), +('8', '102', '19', '105263', '88204', '20'), +('8', '102', '13', '111871', '155749', '20'), +('8', '102', '13', '111815', '153752', '20'), +('8', '102', '13', '111512', '146219', '20'), +('8', '102', '13', '111515', '146188', '20'), +('8', '102', '14', '111871', '155749', '20'), +('8', '102', '14', '111815', '153752', '20'), +('8', '102', '14', '111512', '146219', '20'), +('8', '102', '14', '111515', '146188', '20'), +('8', '102', '11', '133816', '149769', '20'), +('8', '102', '11', '111336', '117534', '20'), +('8', '102', '11', '111338', '117482', '20'), +('8', '102', '11', '111333', '117209', '20'), +('8', '103', '22', '21807', '0', '20'), +('8', '103', '22', '21805', '0', '20'), +('8', '103', '22', '61948', '0', '20'), +('8', '103', '22', '12425', '0', '20'), +('8', '103', '1', '98769', '192832', '20'), +('8', '103', '1', '111309', '117824', '20'), +('8', '103', '1', '111300', '117432', '20'), +('8', '103', '1', '111307', '117338', '20'), +('8', '103', '2', '111732', '128484', '20'), +('8', '103', '2', '111432', '117354', '20'), +('8', '103', '2', '111132', '103104', '20'), +('8', '103', '2', '104704', '94240', '20'), +('8', '103', '3', '111315', '117694', '20'), +('8', '103', '3', '111313', '117599', '20'), +('8', '103', '3', '111312', '117349', '20'), +('8', '103', '3', '111316', '116843', '20'), +('8', '103', '5', '111318', '117295', '20'), +('8', '103', '5', '111319', '117051', '20'), +('8', '103', '5', '111320', '117000', '20'), +('8', '103', '5', '111017', '103232', '20'), +('8', '103', '8', '111331', '117851', '20'), +('8', '103', '8', '111328', '117522', '20'), +('8', '103', '8', '111332', '117365', '20'), +('8', '103', '8', '111330', '117206', '20'), +('8', '103', '6', '111324', '117513', '20'), +('8', '103', '6', '111322', '117348', '20'), +('8', '103', '6', '111326', '116901', '20'), +('8', '103', '6', '111023', '103398', '20'), +('8', '103', '17', '111735', '134518', '20'), +('8', '103', '17', '111435', '123528', '20'), +('8', '103', '17', '111135', '109581', '20'), +('8', '103', '17', '105379', '95030', '20'), +('8', '103', '7', '111733', '128530', '20'), +('8', '103', '7', '111433', '117190', '20'), +('8', '103', '7', '111133', '102992', '20'), +('8', '103', '7', '104929', '94026', '20'), +('8', '103', '9', '111729', '124267', '20'), +('8', '103', '9', '67098', '119182', '20'), +('8', '103', '9', '111429', '113432', '20'), +('8', '103', '9', '111129', '99359', '20'), +('8', '103', '15', '111348', '117847', '20'), +('8', '103', '15', '111343', '117587', '20'), +('8', '103', '15', '111345', '117342', '20'), +('8', '103', '15', '111341', '117328', '20'), +('8', '103', '20', '111354', '127129', '20'), +('8', '103', '20', '111355', '126595', '20'), +('8', '103', '20', '111351', '126266', '20'), +('8', '103', '20', '111352', '126107', '20'), +('8', '103', '12', '111730', '126259', '20'), +('8', '103', '12', '111430', '115252', '20'), +('8', '103', '12', '111130', '100914', '20'), +('8', '103', '12', '104814', '93028', '20'), +('8', '103', '18', '111734', '130757', '20'), +('8', '103', '18', '111434', '119452', '20'), +('8', '103', '18', '111134', '105395', '20'), +('8', '103', '18', '105378', '91409', '20'), +('8', '103', '19', '111731', '127365', '20'), +('8', '103', '19', '111431', '116293', '20'), +('8', '103', '19', '111131', '102210', '20'), +('8', '103', '19', '105263', '88205', '20'), +('8', '103', '13', '111871', '155817', '20'), +('8', '103', '13', '111815', '153820', '20'), +('8', '103', '13', '111512', '146287', '20'), +('8', '103', '13', '111515', '146256', '20'), +('8', '103', '14', '111871', '155817', '20'), +('8', '103', '14', '111815', '153820', '20'), +('8', '103', '14', '111512', '146287', '20'), +('8', '103', '14', '111515', '146256', '20'), +('8', '103', '11', '133816', '149771', '20'), +('8', '103', '11', '111336', '117536', '20'), +('8', '103', '11', '111338', '117484', '20'), +('8', '103', '11', '111333', '117211', '20'), +('8', '104', '22', '21807', '0', '20'), +('8', '104', '22', '21805', '0', '20'), +('8', '104', '22', '61948', '0', '20'), +('8', '104', '22', '12425', '0', '20'), +('8', '104', '1', '98769', '192833', '20'), +('8', '104', '1', '111309', '117827', '20'), +('8', '104', '1', '111300', '117435', '20'), +('8', '104', '1', '111307', '117341', '20'), +('8', '104', '2', '111732', '128486', '20'), +('8', '104', '2', '111432', '117356', '20'), +('8', '104', '2', '111132', '103106', '20'), +('8', '104', '2', '104704', '94243', '20'), +('8', '104', '3', '111315', '117697', '20'), +('8', '104', '3', '111313', '117601', '20'), +('8', '104', '3', '111312', '117351', '20'), +('8', '104', '3', '111316', '116846', '20'), +('8', '104', '5', '111318', '117297', '20'), +('8', '104', '5', '111319', '117054', '20'), +('8', '104', '5', '111320', '117002', '20'), +('8', '104', '5', '111017', '103235', '20'), +('8', '104', '8', '111331', '117853', '20'), +('8', '104', '8', '111328', '117525', '20'), +('8', '104', '8', '111332', '117367', '20'), +('8', '104', '8', '111330', '117208', '20'), +('8', '104', '6', '111324', '117515', '20'), +('8', '104', '6', '111322', '117350', '20'), +('8', '104', '6', '111326', '116903', '20'), +('8', '104', '6', '111023', '103400', '20'), +('8', '104', '17', '111735', '134520', '20'), +('8', '104', '17', '111435', '123530', '20'), +('8', '104', '17', '111135', '109583', '20'), +('8', '104', '17', '105379', '95032', '20'), +('8', '104', '7', '111733', '128531', '20'), +('8', '104', '7', '111433', '117191', '20'), +('8', '104', '7', '111133', '102994', '20'), +('8', '104', '7', '104929', '94028', '20'), +('8', '104', '9', '111729', '124269', '20'), +('8', '104', '9', '67098', '119184', '20'), +('8', '104', '9', '111429', '113434', '20'), +('8', '104', '9', '111129', '99361', '20'), +('8', '104', '15', '111348', '117849', '20'), +('8', '104', '15', '111343', '117589', '20'), +('8', '104', '15', '111345', '117345', '20'), +('8', '104', '15', '111341', '117331', '20'), +('8', '104', '20', '111354', '127131', '20'), +('8', '104', '20', '111355', '126597', '20'), +('8', '104', '20', '111351', '126268', '20'), +('8', '104', '20', '111352', '126109', '20'), +('8', '104', '12', '111730', '126261', '20'), +('8', '104', '12', '111430', '115254', '20'), +('8', '104', '12', '111130', '100916', '20'), +('8', '104', '12', '104814', '93030', '20'), +('8', '104', '18', '111734', '130758', '20'), +('8', '104', '18', '111434', '119453', '20'), +('8', '104', '18', '111134', '105395', '20'), +('8', '104', '18', '105378', '91410', '20'), +('8', '104', '19', '111731', '127367', '20'), +('8', '104', '19', '111431', '116294', '20'), +('8', '104', '19', '111131', '102212', '20'), +('8', '104', '19', '105263', '88207', '20'), +('8', '104', '13', '111871', '155886', '20'), +('8', '104', '13', '111815', '153888', '20'), +('8', '104', '13', '111512', '146356', '20'), +('8', '104', '13', '111515', '146325', '20'), +('8', '104', '14', '111871', '155886', '20'), +('8', '104', '14', '111815', '153888', '20'), +('8', '104', '14', '111512', '146356', '20'), +('8', '104', '14', '111515', '146325', '20'), +('8', '104', '11', '133816', '149772', '20'), +('8', '104', '11', '111336', '117538', '20'), +('8', '104', '11', '111338', '117487', '20'), +('8', '104', '11', '111333', '117213', '20'), +('8', '105', '22', '21807', '0', '23'), +('8', '105', '22', '21805', '0', '23'), +('8', '105', '22', '61948', '0', '23'), +('8', '105', '22', '12425', '0', '23'), +('8', '105', '1', '98769', '192835', '23'), +('8', '105', '1', '111309', '117830', '23'), +('8', '105', '1', '111300', '117437', '23'), +('8', '105', '1', '111307', '117345', '23'), +('8', '105', '2', '111732', '128489', '23'), +('8', '105', '2', '111432', '117359', '23'), +('8', '105', '2', '111132', '103109', '23'), +('8', '105', '2', '104704', '94245', '23'), +('8', '105', '3', '111315', '117700', '23'), +('8', '105', '3', '111313', '117603', '23'), +('8', '105', '3', '111312', '117353', '23'), +('8', '105', '3', '111316', '116848', '23'), +('8', '105', '5', '111318', '117300', '23'), +('8', '105', '5', '111319', '117056', '23'), +('8', '105', '5', '111320', '117004', '23'), +('8', '105', '5', '111017', '103237', '23'), +('8', '105', '8', '111331', '117855', '23'), +('8', '105', '8', '111328', '117528', '23'), +('8', '105', '8', '111332', '117370', '23'), +('8', '105', '8', '111330', '117210', '23'), +('8', '105', '6', '111324', '117517', '23'), +('8', '105', '6', '111322', '117352', '23'), +('8', '105', '6', '111326', '116906', '23'), +('8', '105', '6', '111023', '103402', '23'), +('8', '105', '17', '111735', '134522', '23'), +('8', '105', '17', '111435', '123532', '23'), +('8', '105', '17', '111135', '109584', '23'), +('8', '105', '17', '105379', '95034', '23'), +('8', '105', '7', '111733', '128533', '23'), +('8', '105', '7', '111433', '117193', '23'), +('8', '105', '7', '111133', '102996', '23'), +('8', '105', '7', '104929', '94030', '23'), +('8', '105', '9', '111729', '124271', '23'), +('8', '105', '9', '67098', '119186', '23'), +('8', '105', '9', '111429', '113436', '23'), +('8', '105', '9', '111129', '99363', '23'), +('8', '105', '15', '111348', '117851', '23'), +('8', '105', '15', '111343', '117591', '23'), +('8', '105', '15', '111345', '117347', '23'), +('8', '105', '15', '111341', '117334', '23'), +('8', '105', '20', '111354', '127134', '23'), +('8', '105', '20', '111355', '126598', '23'), +('8', '105', '20', '111351', '126270', '23'), +('8', '105', '20', '111352', '126111', '23'), +('8', '105', '12', '111730', '126263', '23'), +('8', '105', '12', '111430', '115255', '23'), +('8', '105', '12', '111130', '100918', '23'), +('8', '105', '12', '104814', '93032', '23'), +('8', '105', '18', '111734', '130759', '23'), +('8', '105', '18', '111434', '119454', '23'), +('8', '105', '18', '111134', '105396', '23'), +('8', '105', '18', '105378', '91411', '23'), +('8', '105', '19', '111731', '127368', '23'), +('8', '105', '19', '111431', '116296', '23'), +('8', '105', '19', '111131', '102213', '23'), +('8', '105', '19', '105263', '88208', '23'), +('8', '105', '13', '111871', '155954', '23'), +('8', '105', '13', '111815', '153956', '23'), +('8', '105', '13', '111512', '146424', '23'), +('8', '105', '13', '111515', '146393', '23'), +('8', '105', '14', '111871', '155954', '23'), +('8', '105', '14', '111815', '153956', '23'), +('8', '105', '14', '111512', '146424', '23'), +('8', '105', '14', '111515', '146393', '23'), +('8', '105', '11', '133816', '149774', '23'), +('8', '105', '11', '111336', '117540', '23'), +('8', '105', '11', '111338', '117489', '23'), +('8', '105', '11', '111333', '117215', '23'), +('8', '105', '22', '21807', '0', '22'), +('8', '105', '22', '21805', '0', '22'), +('8', '105', '22', '61948', '0', '22'), +('8', '105', '22', '12425', '0', '22'), +('8', '105', '1', '98769', '192835', '22'), +('8', '105', '1', '111309', '117830', '22'), +('8', '105', '1', '111300', '117437', '22'), +('8', '105', '1', '111307', '117345', '22'), +('8', '105', '2', '111732', '128489', '22'), +('8', '105', '2', '111432', '117359', '22'), +('8', '105', '2', '111132', '103109', '22'), +('8', '105', '2', '104704', '94245', '22'), +('8', '105', '3', '111315', '117700', '22'), +('8', '105', '3', '111313', '117603', '22'), +('8', '105', '3', '111312', '117353', '22'), +('8', '105', '3', '111316', '116848', '22'), +('8', '105', '5', '111318', '117300', '22'), +('8', '105', '5', '111319', '117056', '22'), +('8', '105', '5', '111320', '117004', '22'), +('8', '105', '5', '111017', '103237', '22'), +('8', '105', '8', '111331', '117855', '22'), +('8', '105', '8', '111328', '117528', '22'), +('8', '105', '8', '111332', '117370', '22'), +('8', '105', '8', '111330', '117210', '22'), +('8', '105', '6', '111324', '117517', '22'), +('8', '105', '6', '111322', '117352', '22'), +('8', '105', '6', '111326', '116906', '22'), +('8', '105', '6', '111023', '103402', '22'), +('8', '105', '17', '111735', '134522', '22'), +('8', '105', '17', '111435', '123532', '22'), +('8', '105', '17', '111135', '109584', '22'), +('8', '105', '17', '105379', '95034', '22'), +('8', '105', '7', '111733', '128533', '22'), +('8', '105', '7', '111433', '117193', '22'), +('8', '105', '7', '111133', '102996', '22'), +('8', '105', '7', '104929', '94030', '22'), +('8', '105', '9', '111729', '124271', '22'), +('8', '105', '9', '67098', '119186', '22'), +('8', '105', '9', '111429', '113436', '22'), +('8', '105', '9', '111129', '99363', '22'), +('8', '105', '15', '111348', '117851', '22'), +('8', '105', '15', '111343', '117591', '22'), +('8', '105', '15', '111345', '117347', '22'), +('8', '105', '15', '111341', '117334', '22'), +('8', '105', '20', '111354', '127134', '22'), +('8', '105', '20', '111355', '126598', '22'), +('8', '105', '20', '111351', '126270', '22'), +('8', '105', '20', '111352', '126111', '22'), +('8', '105', '12', '111730', '126263', '22'), +('8', '105', '12', '111430', '115255', '22'), +('8', '105', '12', '111130', '100918', '22'), +('8', '105', '12', '104814', '93032', '22'), +('8', '105', '18', '111734', '130759', '22'), +('8', '105', '18', '111434', '119454', '22'), +('8', '105', '18', '111134', '105396', '22'), +('8', '105', '18', '105378', '91411', '22'), +('8', '105', '19', '111731', '127368', '22'), +('8', '105', '19', '111431', '116296', '22'), +('8', '105', '19', '111131', '102213', '22'), +('8', '105', '19', '105263', '88208', '22'), +('8', '105', '13', '111871', '155954', '22'), +('8', '105', '13', '111815', '153956', '22'), +('8', '105', '13', '111512', '146424', '22'), +('8', '105', '13', '111515', '146393', '22'), +('8', '105', '14', '111871', '155954', '22'), +('8', '105', '14', '111815', '153956', '22'), +('8', '105', '14', '111512', '146424', '22'), +('8', '105', '14', '111515', '146393', '22'), +('8', '105', '11', '133816', '149774', '22'), +('8', '105', '11', '111336', '117540', '22'), +('8', '105', '11', '111338', '117489', '22'), +('8', '105', '11', '111333', '117215', '22'), +('8', '105', '22', '21807', '0', '21'), +('8', '105', '22', '21805', '0', '21'), +('8', '105', '22', '61948', '0', '21'), +('8', '105', '22', '12425', '0', '21'), +('8', '105', '1', '98769', '192835', '21'), +('8', '105', '1', '111309', '117830', '21'), +('8', '105', '1', '111300', '117437', '21'), +('8', '105', '1', '111307', '117345', '21'), +('8', '105', '2', '111732', '128489', '21'), +('8', '105', '2', '111432', '117359', '21'), +('8', '105', '2', '111132', '103109', '21'), +('8', '105', '2', '104704', '94245', '21'), +('8', '105', '3', '111315', '117700', '21'), +('8', '105', '3', '111313', '117603', '21'), +('8', '105', '3', '111312', '117353', '21'), +('8', '105', '3', '111316', '116848', '21'), +('8', '105', '5', '111318', '117300', '21'), +('8', '105', '5', '111319', '117056', '21'), +('8', '105', '5', '111320', '117004', '21'), +('8', '105', '5', '111017', '103237', '21'), +('8', '105', '8', '111331', '117855', '21'), +('8', '105', '8', '111328', '117528', '21'), +('8', '105', '8', '111332', '117370', '21'), +('8', '105', '8', '111330', '117210', '21'), +('8', '105', '6', '111324', '117517', '21'), +('8', '105', '6', '111322', '117352', '21'), +('8', '105', '6', '111326', '116906', '21'), +('8', '105', '6', '111023', '103402', '21'), +('8', '105', '17', '111735', '134522', '21'), +('8', '105', '17', '111435', '123532', '21'), +('8', '105', '17', '111135', '109584', '21'), +('8', '105', '17', '105379', '95034', '21'), +('8', '105', '7', '111733', '128533', '21'), +('8', '105', '7', '111433', '117193', '21'), +('8', '105', '7', '111133', '102996', '21'), +('8', '105', '7', '104929', '94030', '21'), +('8', '105', '9', '111729', '124271', '21'), +('8', '105', '9', '67098', '119186', '21'), +('8', '105', '9', '111429', '113436', '21'), +('8', '105', '9', '111129', '99363', '21'), +('8', '105', '15', '111348', '117851', '21'), +('8', '105', '15', '111343', '117591', '21'), +('8', '105', '15', '111345', '117347', '21'), +('8', '105', '15', '111341', '117334', '21'), +('8', '105', '20', '111354', '127134', '21'), +('8', '105', '20', '111355', '126598', '21'), +('8', '105', '20', '111351', '126270', '21'), +('8', '105', '20', '111352', '126111', '21'), +('8', '105', '12', '111730', '126263', '21'), +('8', '105', '12', '111430', '115255', '21'), +('8', '105', '12', '111130', '100918', '21'), +('8', '105', '12', '104814', '93032', '21'), +('8', '105', '18', '111734', '130759', '21'), +('8', '105', '18', '111434', '119454', '21'), +('8', '105', '18', '111134', '105396', '21'), +('8', '105', '18', '105378', '91411', '21'), +('8', '105', '19', '111731', '127368', '21'), +('8', '105', '19', '111431', '116296', '21'), +('8', '105', '19', '111131', '102213', '21'), +('8', '105', '19', '105263', '88208', '21'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '105', '13', '111871', '155954', '21'), +('8', '105', '13', '111815', '153956', '21'), +('8', '105', '13', '111512', '146424', '21'), +('8', '105', '13', '111515', '146393', '21'), +('8', '105', '14', '111871', '155954', '21'), +('8', '105', '14', '111815', '153956', '21'), +('8', '105', '14', '111512', '146424', '21'), +('8', '105', '14', '111515', '146393', '21'), +('8', '105', '11', '133816', '149774', '21'), +('8', '105', '11', '111336', '117540', '21'), +('8', '105', '11', '111338', '117489', '21'), +('8', '105', '11', '111333', '117215', '21'), +('8', '106', '22', '21807', '0', '23'), +('8', '106', '22', '21805', '0', '23'), +('8', '106', '22', '61948', '0', '23'), +('8', '106', '22', '12425', '0', '23'), +('8', '106', '1', '98769', '192837', '23'), +('8', '106', '1', '111309', '117832', '23'), +('8', '106', '1', '111300', '117439', '23'), +('8', '106', '1', '111307', '117348', '23'), +('8', '106', '2', '111732', '128491', '23'), +('8', '106', '2', '111432', '117361', '23'), +('8', '106', '2', '111132', '103111', '23'), +('8', '106', '2', '104704', '94247', '23'), +('8', '106', '3', '111315', '117702', '23'), +('8', '106', '3', '111313', '117605', '23'), +('8', '106', '3', '111312', '117356', '23'), +('8', '106', '3', '111316', '116850', '23'), +('8', '106', '5', '111318', '117302', '23'), +('8', '106', '5', '111319', '117059', '23'), +('8', '106', '5', '111320', '117006', '23'), +('8', '106', '5', '111017', '103239', '23'), +('8', '106', '8', '111331', '117857', '23'), +('8', '106', '8', '111328', '117531', '23'), +('8', '106', '8', '111332', '117372', '23'), +('8', '106', '8', '111330', '117212', '23'), +('8', '106', '6', '111324', '117520', '23'), +('8', '106', '6', '111322', '117354', '23'), +('8', '106', '6', '111326', '116908', '23'), +('8', '106', '6', '111023', '103405', '23'), +('8', '106', '17', '111735', '134524', '23'), +('8', '106', '17', '111435', '123534', '23'), +('8', '106', '17', '111135', '109586', '23'), +('8', '106', '17', '105379', '95035', '23'), +('8', '106', '7', '111733', '128535', '23'), +('8', '106', '7', '111433', '117195', '23'), +('8', '106', '7', '111133', '102998', '23'), +('8', '106', '7', '104929', '94032', '23'), +('8', '106', '9', '111729', '124273', '23'), +('8', '106', '9', '67098', '119188', '23'), +('8', '106', '9', '111429', '113438', '23'), +('8', '106', '9', '111129', '99365', '23'), +('8', '106', '15', '111348', '117854', '23'), +('8', '106', '15', '111343', '117593', '23'), +('8', '106', '15', '111345', '117350', '23'), +('8', '106', '15', '111341', '117337', '23'), +('8', '106', '20', '111354', '127136', '23'), +('8', '106', '20', '111355', '126600', '23'), +('8', '106', '20', '111351', '126272', '23'), +('8', '106', '20', '111352', '126114', '23'), +('8', '106', '12', '111730', '126265', '23'), +('8', '106', '12', '111430', '115257', '23'), +('8', '106', '12', '111130', '100920', '23'), +('8', '106', '12', '104814', '93033', '23'), +('8', '106', '18', '111734', '130760', '23'), +('8', '106', '18', '111434', '119455', '23'), +('8', '106', '18', '111134', '105397', '23'), +('8', '106', '18', '105378', '91411', '23'), +('8', '106', '19', '111731', '127370', '23'), +('8', '106', '19', '111431', '116297', '23'), +('8', '106', '19', '111131', '102215', '23'), +('8', '106', '19', '105263', '88210', '23'), +('8', '106', '13', '111871', '156023', '23'), +('8', '106', '13', '111815', '154025', '23'), +('8', '106', '13', '111512', '146492', '23'), +('8', '106', '13', '111515', '146461', '23'), +('8', '106', '14', '111871', '156023', '23'), +('8', '106', '14', '111815', '154025', '23'), +('8', '106', '14', '111512', '146492', '23'), +('8', '106', '14', '111515', '146461', '23'), +('8', '106', '11', '133816', '149776', '23'), +('8', '106', '11', '111336', '117543', '23'), +('8', '106', '11', '111338', '117492', '23'), +('8', '106', '11', '111333', '117216', '23'), +('8', '107', '22', '21807', '0', '23'), +('8', '107', '22', '21805', '0', '23'), +('8', '107', '22', '61948', '0', '23'), +('8', '107', '22', '12425', '0', '23'), +('8', '107', '1', '98769', '192838', '23'), +('8', '107', '1', '111309', '117835', '23'), +('8', '107', '1', '111300', '117441', '23'), +('8', '107', '1', '111307', '117351', '23'), +('8', '107', '2', '111732', '128493', '23'), +('8', '107', '2', '111432', '117363', '23'), +('8', '107', '2', '111132', '103113', '23'), +('8', '107', '2', '104704', '94249', '23'), +('8', '107', '3', '111315', '117705', '23'), +('8', '107', '3', '111313', '117607', '23'), +('8', '107', '3', '111312', '117358', '23'), +('8', '107', '3', '111316', '116853', '23'), +('8', '107', '5', '111318', '117304', '23'), +('8', '107', '5', '111319', '117062', '23'), +('8', '107', '5', '111320', '117009', '23'), +('8', '107', '5', '111017', '103242', '23'), +('8', '107', '8', '111331', '117860', '23'), +('8', '107', '8', '111328', '117534', '23'), +('8', '107', '8', '111332', '117374', '23'), +('8', '107', '8', '111330', '117214', '23'), +('8', '107', '6', '111324', '117522', '23'), +('8', '107', '6', '111322', '117356', '23'), +('8', '107', '6', '111326', '116911', '23'), +('8', '107', '6', '111023', '103407', '23'), +('8', '107', '17', '111735', '134525', '23'), +('8', '107', '17', '111435', '123535', '23'), +('8', '107', '17', '111135', '109588', '23'), +('8', '107', '17', '105379', '95037', '23'), +('8', '107', '7', '111733', '128537', '23'), +('8', '107', '7', '111433', '117197', '23'), +('8', '107', '7', '111133', '103000', '23'), +('8', '107', '7', '104929', '94034', '23'), +('8', '107', '9', '111729', '124275', '23'), +('8', '107', '9', '67098', '119190', '23'), +('8', '107', '9', '111429', '113440', '23'), +('8', '107', '9', '111129', '99367', '23'), +('8', '107', '15', '111348', '117856', '23'), +('8', '107', '15', '111343', '117594', '23'), +('8', '107', '15', '111345', '117352', '23'), +('8', '107', '15', '111341', '117341', '23'), +('8', '107', '20', '111354', '127138', '23'), +('8', '107', '20', '111355', '126602', '23'), +('8', '107', '20', '111351', '126275', '23'), +('8', '107', '20', '111352', '126116', '23'), +('8', '107', '12', '111730', '126266', '23'), +('8', '107', '12', '111430', '115259', '23'), +('8', '107', '12', '111130', '100921', '23'), +('8', '107', '12', '104814', '93035', '23'), +('8', '107', '18', '111734', '130760', '23'), +('8', '107', '18', '111434', '119455', '23'), +('8', '107', '18', '111134', '105398', '23'), +('8', '107', '18', '105378', '91412', '23'), +('8', '107', '19', '111731', '127371', '23'), +('8', '107', '19', '111431', '116299', '23'), +('8', '107', '19', '111131', '102216', '23'), +('8', '107', '19', '105263', '88211', '23'), +('8', '107', '13', '111871', '156092', '23'), +('8', '107', '13', '111815', '154093', '23'), +('8', '107', '13', '111512', '146561', '23'), +('8', '107', '13', '111515', '146529', '23'), +('8', '107', '14', '111871', '156092', '23'), +('8', '107', '14', '111815', '154093', '23'), +('8', '107', '14', '111512', '146561', '23'), +('8', '107', '14', '111515', '146529', '23'), +('8', '107', '11', '133816', '149777', '23'), +('8', '107', '11', '111336', '117545', '23'), +('8', '107', '11', '111338', '117494', '23'), +('8', '107', '11', '111333', '117218', '23'), +('8', '108', '22', '21807', '0', '23'), +('8', '108', '22', '21805', '0', '23'), +('8', '108', '22', '61948', '0', '23'), +('8', '108', '22', '12425', '0', '23'), +('8', '108', '1', '98769', '192840', '23'), +('8', '108', '1', '111309', '117837', '23'), +('8', '108', '1', '111300', '117443', '23'), +('8', '108', '1', '111307', '117354', '23'), +('8', '108', '2', '111732', '128496', '23'), +('8', '108', '2', '111432', '117366', '23'), +('8', '108', '2', '111132', '103116', '23'), +('8', '108', '2', '104704', '94252', '23'), +('8', '108', '3', '111315', '117708', '23'), +('8', '108', '3', '111313', '117609', '23'), +('8', '108', '3', '111312', '117360', '23'), +('8', '108', '3', '111316', '116855', '23'), +('8', '108', '5', '111318', '117307', '23'), +('8', '108', '5', '111319', '117065', '23'), +('8', '108', '5', '111320', '117011', '23'), +('8', '108', '5', '111017', '103244', '23'), +('8', '108', '8', '111331', '117862', '23'), +('8', '108', '8', '111328', '117537', '23'), +('8', '108', '8', '111332', '117376', '23'), +('8', '108', '8', '111330', '117216', '23'), +('8', '108', '6', '111324', '117525', '23'), +('8', '108', '6', '111322', '117358', '23'), +('8', '108', '6', '111326', '116914', '23'), +('8', '108', '6', '111023', '103410', '23'), +('8', '108', '17', '111735', '134527', '23'), +('8', '108', '17', '111435', '123537', '23'), +('8', '108', '17', '111135', '109589', '23'), +('8', '108', '17', '105379', '95039', '23'), +('8', '108', '7', '111733', '128539', '23'), +('8', '108', '7', '111433', '117199', '23'), +('8', '108', '7', '111133', '103001', '23'), +('8', '108', '7', '104929', '94035', '23'), +('8', '108', '9', '111729', '124276', '23'), +('8', '108', '9', '67098', '119192', '23'), +('8', '108', '9', '111429', '113441', '23'), +('8', '108', '9', '111129', '99369', '23'), +('8', '108', '15', '111348', '117858', '23'), +('8', '108', '15', '111343', '117596', '23'), +('8', '108', '15', '111345', '117354', '23'), +('8', '108', '15', '111341', '117344', '23'), +('8', '108', '20', '111354', '127141', '23'), +('8', '108', '20', '111355', '126603', '23'), +('8', '108', '20', '111351', '126277', '23'), +('8', '108', '20', '111352', '126118', '23'), +('8', '108', '12', '111730', '126268', '23'), +('8', '108', '12', '111430', '115260', '23'), +('8', '108', '12', '111130', '100923', '23'), +('8', '108', '12', '104814', '93037', '23'), +('8', '108', '18', '111734', '130761', '23'), +('8', '108', '18', '111434', '119456', '23'), +('8', '108', '18', '111134', '105399', '23'), +('8', '108', '18', '105042', '91413', '23'), +('8', '108', '19', '111731', '127373', '23'), +('8', '108', '19', '111431', '116300', '23'), +('8', '108', '19', '111131', '102218', '23'), +('8', '108', '19', '105263', '88213', '23'), +('8', '108', '13', '111871', '156160', '23'), +('8', '108', '13', '111815', '154161', '23'), +('8', '108', '13', '111512', '146629', '23'), +('8', '108', '13', '111515', '146597', '23'), +('8', '108', '14', '111871', '156160', '23'), +('8', '108', '14', '111815', '154161', '23'), +('8', '108', '14', '111512', '146629', '23'), +('8', '108', '14', '111515', '146597', '23'), +('8', '108', '11', '133816', '149779', '23'), +('8', '108', '11', '111336', '117547', '23'), +('8', '108', '11', '111338', '117497', '23'), +('8', '108', '11', '111333', '117220', '23'), +('8', '109', '22', '21807', '0', '23'), +('8', '109', '22', '21805', '0', '23'), +('8', '109', '22', '61948', '0', '23'), +('8', '109', '22', '12425', '0', '23'), +('8', '109', '1', '98769', '192842', '23'), +('8', '109', '1', '111309', '117840', '23'), +('8', '109', '1', '111300', '117445', '23'), +('8', '109', '1', '111307', '117357', '23'), +('8', '109', '2', '111732', '128498', '23'), +('8', '109', '2', '111432', '117368', '23'), +('8', '109', '2', '111132', '103118', '23'), +('8', '109', '2', '104704', '94254', '23'), +('8', '109', '3', '111315', '117711', '23'), +('8', '109', '3', '111313', '117611', '23'), +('8', '109', '3', '111312', '117362', '23'), +('8', '109', '3', '111316', '116857', '23'), +('8', '109', '5', '111318', '117309', '23'), +('8', '109', '5', '111319', '117067', '23'), +('8', '109', '5', '111320', '117013', '23'), +('8', '109', '5', '111017', '103246', '23'), +('8', '109', '8', '111331', '117864', '23'), +('8', '109', '8', '111328', '117540', '23'), +('8', '109', '8', '111332', '117378', '23'), +('8', '109', '8', '111330', '117218', '23'), +('8', '109', '6', '111324', '117527', '23'), +('8', '109', '6', '111322', '117360', '23'), +('8', '109', '6', '111326', '116916', '23'), +('8', '109', '6', '111023', '103412', '23'), +('8', '109', '17', '111735', '134528', '23'), +('8', '109', '17', '111435', '123538', '23'), +('8', '109', '17', '111135', '109591', '23'), +('8', '109', '17', '105379', '95040', '23'), +('8', '109', '7', '111733', '128541', '23'), +('8', '109', '7', '111433', '117201', '23'), +('8', '109', '7', '111133', '103003', '23'), +('8', '109', '7', '104929', '94037', '23'), +('8', '109', '9', '111729', '124278', '23'), +('8', '109', '9', '67098', '119193', '23'), +('8', '109', '9', '111429', '113443', '23'), +('8', '109', '9', '111129', '99371', '23'), +('8', '109', '15', '111348', '117860', '23'), +('8', '109', '15', '111343', '117598', '23'), +('8', '109', '15', '111345', '117356', '23'), +('8', '109', '15', '111341', '117347', '23'), +('8', '109', '20', '111354', '127143', '23'), +('8', '109', '20', '111355', '126605', '23'), +('8', '109', '20', '111351', '126279', '23'), +('8', '109', '20', '111352', '126120', '23'), +('8', '109', '12', '111730', '126270', '23'), +('8', '109', '12', '111430', '115262', '23'), +('8', '109', '12', '111130', '100925', '23'), +('8', '109', '12', '104814', '93038', '23'), +('8', '109', '18', '111734', '130762', '23'), +('8', '109', '18', '111434', '119457', '23'), +('8', '109', '18', '111134', '105399', '23'), +('8', '109', '18', '105042', '91414', '23'), +('8', '109', '19', '111731', '127374', '23'), +('8', '109', '19', '111431', '116302', '23'), +('8', '109', '19', '111131', '102219', '23'), +('8', '109', '19', '105263', '88214', '23'), +('8', '109', '13', '111871', '156229', '23'), +('8', '109', '13', '111815', '154230', '23'), +('8', '109', '13', '111512', '146697', '23'), +('8', '109', '13', '111515', '146665', '23'), +('8', '109', '14', '111871', '156229', '23'), +('8', '109', '14', '111815', '154230', '23'), +('8', '109', '14', '111512', '146697', '23'), +('8', '109', '14', '111515', '146665', '23'), +('8', '109', '11', '133816', '149781', '23'), +('8', '109', '11', '111336', '117549', '23'), +('8', '109', '11', '111338', '117499', '23'), +('8', '109', '11', '111333', '117222', '23'), +('8', '110', '22', '12425', '0', '25'), +('8', '110', '22', '21807', '0', '25'), +('8', '110', '22', '21805', '0', '25'), +('8', '110', '22', '39342', '0', '25'), +('8', '110', '1', '98769', '192843', '25'), +('8', '110', '1', '111309', '117842', '25'), +('8', '110', '1', '111300', '117447', '25'), +('8', '110', '1', '111307', '117360', '25'), +('8', '110', '2', '111732', '128500', '25'), +('8', '110', '2', '111432', '117370', '25'), +('8', '110', '2', '111132', '103120', '25'), +('8', '110', '2', '104704', '94256', '25'), +('8', '110', '3', '111315', '117714', '25'), +('8', '110', '3', '111313', '117613', '25'), +('8', '110', '3', '111312', '117364', '25'), +('8', '110', '3', '111316', '116859', '25'), +('8', '110', '5', '111318', '117311', '25'), +('8', '110', '5', '111319', '117070', '25'), +('8', '110', '5', '111320', '117015', '25'), +('8', '110', '5', '111017', '103249', '25'), +('8', '110', '8', '111331', '117867', '25'), +('8', '110', '8', '111328', '117543', '25'), +('8', '110', '8', '111332', '117380', '25'), +('8', '110', '8', '111330', '117220', '25'), +('8', '110', '6', '111324', '117529', '25'), +('8', '110', '6', '111322', '117362', '25'), +('8', '110', '6', '111326', '116919', '25'), +('8', '110', '6', '111023', '103414', '25'), +('8', '110', '17', '111735', '134530', '25'), +('8', '110', '17', '111435', '123540', '25'), +('8', '110', '17', '111135', '109593', '25'), +('8', '110', '17', '105379', '95042', '25'), +('8', '110', '7', '111733', '128543', '25'), +('8', '110', '7', '111433', '117203', '25'), +('8', '110', '7', '111133', '103005', '25'), +('8', '110', '7', '104929', '94039', '25'), +('8', '110', '9', '111729', '124280', '25'), +('8', '110', '9', '67098', '119195', '25'), +('8', '110', '9', '111429', '113445', '25'), +('8', '110', '9', '111129', '99373', '25'), +('8', '110', '15', '111348', '117862', '25'), +('8', '110', '15', '111343', '117600', '25'), +('8', '110', '15', '111345', '117359', '25'), +('8', '110', '15', '111341', '117350', '25'), +('8', '110', '20', '111354', '127145', '25'), +('8', '110', '20', '111355', '126606', '25'), +('8', '110', '20', '111351', '126281', '25'), +('8', '110', '20', '111352', '126122', '25'), +('8', '110', '12', '111730', '126271', '25'), +('8', '110', '12', '111430', '115264', '25'), +('8', '110', '12', '111130', '100926', '25'), +('8', '110', '12', '104814', '93040', '25'), +('8', '110', '18', '111734', '130763', '25'), +('8', '110', '18', '111434', '119458', '25'), +('8', '110', '18', '111134', '105400', '25'), +('8', '110', '18', '105378', '91414', '25'), +('8', '110', '19', '111731', '127376', '25'), +('8', '110', '19', '111431', '116303', '25'), +('8', '110', '19', '111131', '102221', '25'), +('8', '110', '19', '105263', '88216', '25'), +('8', '110', '13', '111871', '156631', '25'), +('8', '110', '13', '111815', '154631', '25'), +('8', '110', '13', '111512', '147099', '25'), +('8', '110', '13', '111515', '147067', '25'), +('8', '110', '14', '111871', '156631', '25'), +('8', '110', '14', '111815', '154631', '25'), +('8', '110', '14', '111512', '147099', '25'), +('8', '110', '14', '111515', '147067', '25'), +('8', '110', '11', '85213', '172609', '25'), +('8', '110', '11', '133816', '149783', '25'), +('8', '110', '11', '111336', '117552', '25'), +('8', '110', '11', '111338', '117502', '25'), +('8', '110', '22', '12425', '0', '24'), +('8', '110', '22', '21807', '0', '24'), +('8', '110', '22', '21805', '0', '24'), +('8', '110', '22', '39342', '0', '24'), +('8', '110', '1', '98769', '192843', '24'), +('8', '110', '1', '111309', '117842', '24'), +('8', '110', '1', '111300', '117447', '24'), +('8', '110', '1', '111307', '117360', '24'), +('8', '110', '2', '111732', '128500', '24'), +('8', '110', '2', '111432', '117370', '24'), +('8', '110', '2', '111132', '103120', '24'), +('8', '110', '2', '104704', '94256', '24'), +('8', '110', '3', '111315', '117714', '24'), +('8', '110', '3', '111313', '117613', '24'), +('8', '110', '3', '111312', '117364', '24'), +('8', '110', '3', '111316', '116859', '24'), +('8', '110', '5', '111318', '117311', '24'), +('8', '110', '5', '111319', '117070', '24'), +('8', '110', '5', '111320', '117015', '24'), +('8', '110', '5', '111017', '103249', '24'), +('8', '110', '8', '111331', '117867', '24'), +('8', '110', '8', '111328', '117543', '24'), +('8', '110', '8', '111332', '117380', '24'), +('8', '110', '8', '111330', '117220', '24'), +('8', '110', '6', '111324', '117529', '24'), +('8', '110', '6', '111322', '117362', '24'), +('8', '110', '6', '111326', '116919', '24'), +('8', '110', '6', '111023', '103414', '24'), +('8', '110', '17', '111735', '134530', '24'), +('8', '110', '17', '111435', '123540', '24'), +('8', '110', '17', '111135', '109593', '24'), +('8', '110', '17', '105379', '95042', '24'), +('8', '110', '7', '111733', '128543', '24'), +('8', '110', '7', '111433', '117203', '24'), +('8', '110', '7', '111133', '103005', '24'), +('8', '110', '7', '104929', '94039', '24'), +('8', '110', '9', '111729', '124280', '24'), +('8', '110', '9', '67098', '119195', '24'), +('8', '110', '9', '111429', '113445', '24'), +('8', '110', '9', '111129', '99373', '24'), +('8', '110', '15', '111348', '117862', '24'), +('8', '110', '15', '111343', '117600', '24'), +('8', '110', '15', '111345', '117359', '24'), +('8', '110', '15', '111341', '117350', '24'), +('8', '110', '20', '111354', '127145', '24'), +('8', '110', '20', '111355', '126606', '24'), +('8', '110', '20', '111351', '126281', '24'), +('8', '110', '20', '111352', '126122', '24'), +('8', '110', '12', '111730', '126271', '24'), +('8', '110', '12', '111430', '115264', '24'), +('8', '110', '12', '111130', '100926', '24'), +('8', '110', '12', '104814', '93040', '24'), +('8', '110', '18', '111734', '130763', '24'), +('8', '110', '18', '111434', '119458', '24'), +('8', '110', '18', '111134', '105400', '24'), +('8', '110', '18', '105378', '91414', '24'), +('8', '110', '19', '111731', '127376', '24'), +('8', '110', '19', '111431', '116303', '24'), +('8', '110', '19', '111131', '102221', '24'), +('8', '110', '19', '105263', '88216', '24'), +('8', '110', '13', '111871', '156631', '24'), +('8', '110', '13', '111815', '154631', '24'), +('8', '110', '13', '111512', '147099', '24'), +('8', '110', '13', '111515', '147067', '24'), +('8', '110', '14', '111871', '156631', '24'), +('8', '110', '14', '111815', '154631', '24'), +('8', '110', '14', '111512', '147099', '24'), +('8', '110', '14', '111515', '147067', '24'), +('8', '110', '11', '85213', '172609', '24'), +('8', '110', '11', '133816', '149783', '24'), +('8', '110', '11', '111336', '117552', '24'), +('8', '110', '11', '111338', '117502', '24'), +('8', '111', '22', '12425', '0', '25'), +('8', '111', '22', '21807', '0', '25'), +('8', '111', '22', '21805', '0', '25'), +('8', '111', '22', '39342', '0', '25'), +('8', '111', '1', '98769', '192845', '25'), +('8', '111', '1', '111309', '117845', '25'), +('8', '111', '1', '111300', '117450', '25'), +('8', '111', '1', '111307', '117363', '25'), +('8', '111', '2', '111732', '128502', '25'), +('8', '111', '2', '111432', '117372', '25'), +('8', '111', '2', '111132', '103122', '25'), +('8', '111', '2', '104704', '94258', '25'), +('8', '111', '3', '111315', '117716', '25'), +('8', '111', '3', '111313', '117615', '25'), +('8', '111', '3', '111312', '117366', '25'), +('8', '111', '3', '111316', '116862', '25'), +('8', '111', '5', '111318', '117313', '25'), +('8', '111', '5', '111319', '117073', '25'), +('8', '111', '5', '111320', '117018', '25'), +('8', '111', '5', '111017', '103251', '25'), +('8', '111', '8', '111331', '117869', '25'), +('8', '111', '8', '111328', '117546', '25'), +('8', '111', '8', '111332', '117382', '25'), +('8', '111', '8', '111330', '117222', '25'), +('8', '111', '6', '111324', '117532', '25'), +('8', '111', '6', '111322', '117364', '25'), +('8', '111', '6', '111326', '116921', '25'), +('8', '111', '6', '111023', '103417', '25'), +('8', '111', '17', '111735', '134532', '25'), +('8', '111', '17', '111435', '123542', '25'), +('8', '111', '17', '111135', '109594', '25'), +('8', '111', '17', '105379', '95044', '25'), +('8', '111', '7', '111733', '128545', '25'), +('8', '111', '7', '111433', '117205', '25'), +('8', '111', '7', '111133', '103007', '25'), +('8', '111', '7', '104929', '94041', '25'), +('8', '111', '9', '111729', '124282', '25'), +('8', '111', '9', '67098', '119197', '25'), +('8', '111', '9', '111429', '113447', '25'), +('8', '111', '9', '111129', '99375', '25'), +('8', '111', '15', '111348', '117864', '25'), +('8', '111', '15', '111343', '117601', '25'), +('8', '111', '15', '111345', '117361', '25'), +('8', '111', '15', '111341', '117354', '25'), +('8', '111', '20', '111354', '127147', '25'), +('8', '111', '20', '111355', '126608', '25'), +('8', '111', '20', '111351', '126283', '25'), +('8', '111', '20', '111352', '126124', '25'), +('8', '111', '12', '111730', '126273', '25'), +('8', '111', '12', '111430', '115266', '25'), +('8', '111', '12', '111130', '100928', '25'), +('8', '111', '12', '104814', '93042', '25'), +('8', '111', '18', '111734', '130763', '25'), +('8', '111', '18', '111434', '119458', '25'), +('8', '111', '18', '111134', '105401', '25'), +('8', '111', '18', '105378', '91415', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('8', '111', '19', '111731', '127377', '25'), +('8', '111', '19', '111431', '116305', '25'), +('8', '111', '19', '111131', '102222', '25'), +('8', '111', '19', '105263', '88217', '25'), +('8', '111', '13', '111871', '156699', '25'), +('8', '111', '13', '111815', '154700', '25'), +('8', '111', '13', '111512', '147167', '25'), +('8', '111', '13', '111515', '147135', '25'), +('8', '111', '14', '111871', '156699', '25'), +('8', '111', '14', '111815', '154700', '25'), +('8', '111', '14', '111512', '147167', '25'), +('8', '111', '14', '111515', '147135', '25'), +('8', '111', '11', '85213', '172610', '25'), +('8', '111', '11', '133816', '149784', '25'), +('8', '111', '11', '111336', '117554', '25'), +('8', '111', '11', '111338', '117504', '25'), +('8', '112', '22', '12425', '0', '25'), +('8', '112', '22', '21807', '0', '25'), +('8', '112', '22', '21805', '0', '25'), +('8', '112', '22', '39342', '0', '25'), +('8', '112', '1', '98769', '192847', '25'), +('8', '112', '1', '111309', '117848', '25'), +('8', '112', '1', '111300', '117452', '25'), +('8', '112', '1', '111307', '117366', '25'), +('8', '112', '2', '111732', '128504', '25'), +('8', '112', '2', '111432', '117374', '25'), +('8', '112', '2', '111132', '103124', '25'), +('8', '112', '2', '104704', '94260', '25'), +('8', '112', '3', '111315', '117719', '25'), +('8', '112', '3', '111313', '117617', '25'), +('8', '112', '3', '111312', '117368', '25'), +('8', '112', '3', '111316', '116864', '25'), +('8', '112', '5', '111318', '117316', '25'), +('8', '112', '5', '111319', '117076', '25'), +('8', '112', '5', '111320', '117020', '25'), +('8', '112', '5', '111017', '103253', '25'), +('8', '112', '8', '111331', '117871', '25'), +('8', '112', '8', '111328', '117549', '25'), +('8', '112', '8', '111332', '117384', '25'), +('8', '112', '8', '111330', '117224', '25'), +('8', '112', '6', '111324', '117534', '25'), +('8', '112', '6', '111322', '117366', '25'), +('8', '112', '6', '111326', '116924', '25'), +('8', '112', '6', '111023', '103419', '25'), +('8', '112', '17', '111735', '134533', '25'), +('8', '112', '17', '111435', '123543', '25'), +('8', '112', '17', '111135', '109596', '25'), +('8', '112', '17', '105379', '95045', '25'), +('8', '112', '7', '111733', '128546', '25'), +('8', '112', '7', '111433', '117206', '25'), +('8', '112', '7', '111133', '103009', '25'), +('8', '112', '7', '104929', '94043', '25'), +('8', '112', '9', '111729', '124284', '25'), +('8', '112', '9', '67098', '119199', '25'), +('8', '112', '9', '111429', '113449', '25'), +('8', '112', '9', '111129', '99377', '25'), +('8', '112', '15', '111348', '117866', '25'), +('8', '112', '15', '111343', '117603', '25'), +('8', '112', '15', '111345', '117364', '25'), +('8', '112', '15', '111341', '117357', '25'), +('8', '112', '20', '111354', '127150', '25'), +('8', '112', '20', '111355', '126609', '25'), +('8', '112', '20', '111351', '126285', '25'), +('8', '112', '20', '111352', '126127', '25'), +('8', '112', '12', '111730', '126275', '25'), +('8', '112', '12', '111430', '115267', '25'), +('8', '112', '12', '111130', '100930', '25'), +('8', '112', '12', '104814', '93043', '25'), +('8', '112', '18', '111734', '130764', '25'), +('8', '112', '18', '111434', '119459', '25'), +('8', '112', '18', '111134', '105402', '25'), +('8', '112', '18', '105378', '91416', '25'), +('8', '112', '19', '111731', '127379', '25'), +('8', '112', '19', '111431', '116306', '25'), +('8', '112', '19', '111131', '102224', '25'), +('8', '112', '19', '105263', '88218', '25'), +('8', '112', '13', '111871', '156768', '25'), +('8', '112', '13', '111815', '154768', '25'), +('8', '112', '13', '111512', '147235', '25'), +('8', '112', '13', '111515', '147203', '25'), +('8', '112', '14', '111871', '156768', '25'), +('8', '112', '14', '111815', '154768', '25'), +('8', '112', '14', '111512', '147235', '25'), +('8', '112', '14', '111515', '147203', '25'), +('8', '112', '11', '85213', '172612', '25'), +('8', '112', '11', '133816', '149786', '25'), +('8', '112', '11', '111336', '117556', '25'), +('8', '112', '11', '111338', '117507', '25'), +('8', '113', '22', '12425', '0', '25'), +('8', '113', '22', '21807', '0', '25'), +('8', '113', '22', '21805', '0', '25'), +('8', '113', '22', '39342', '0', '25'), +('8', '113', '1', '98769', '192848', '25'), +('8', '113', '1', '111309', '117850', '25'), +('8', '113', '1', '111300', '117454', '25'), +('8', '113', '1', '111307', '117370', '25'), +('8', '113', '2', '111732', '128507', '25'), +('8', '113', '2', '111432', '117377', '25'), +('8', '113', '2', '111132', '103127', '25'), +('8', '113', '2', '104704', '94263', '25'), +('8', '113', '3', '111315', '117722', '25'), +('8', '113', '3', '111313', '117619', '25'), +('8', '113', '3', '111312', '117370', '25'), +('8', '113', '3', '111316', '116866', '25'), +('8', '113', '5', '111318', '117318', '25'), +('8', '113', '5', '111319', '117079', '25'), +('8', '113', '5', '111320', '117022', '25'), +('8', '113', '5', '111017', '103255', '25'), +('8', '113', '8', '111331', '117873', '25'), +('8', '113', '8', '111328', '117552', '25'), +('8', '113', '8', '111332', '117386', '25'), +('8', '113', '8', '111330', '117226', '25'), +('8', '113', '6', '111324', '117537', '25'), +('8', '113', '6', '111322', '117368', '25'), +('8', '113', '6', '111326', '116926', '25'), +('8', '113', '6', '111023', '103422', '25'), +('8', '113', '17', '111735', '134535', '25'), +('8', '113', '17', '111435', '123545', '25'), +('8', '113', '17', '111135', '109598', '25'), +('8', '113', '17', '105379', '95047', '25'), +('8', '113', '7', '111733', '128548', '25'), +('8', '113', '7', '111433', '117208', '25'), +('8', '113', '7', '111133', '103011', '25'), +('8', '113', '7', '104929', '94045', '25'), +('8', '113', '9', '111729', '124286', '25'), +('8', '113', '9', '67098', '119201', '25'), +('8', '113', '9', '111429', '113451', '25'), +('8', '113', '9', '111129', '99378', '25'), +('8', '113', '15', '111348', '117869', '25'), +('8', '113', '15', '111343', '117605', '25'), +('8', '113', '15', '111345', '117366', '25'), +('8', '113', '15', '111341', '117360', '25'), +('8', '113', '20', '111354', '127152', '25'), +('8', '113', '20', '111355', '126611', '25'), +('8', '113', '20', '111351', '126287', '25'), +('8', '113', '20', '111352', '126129', '25'), +('8', '113', '12', '111730', '126276', '25'), +('8', '113', '12', '111430', '115269', '25'), +('8', '113', '12', '111130', '100931', '25'), +('8', '113', '12', '104814', '93045', '25'), +('8', '113', '18', '111734', '130765', '25'), +('8', '113', '18', '111434', '119460', '25'), +('8', '113', '18', '111134', '105402', '25'), +('8', '113', '18', '105378', '91416', '25'), +('8', '113', '19', '111731', '127380', '25'), +('8', '113', '19', '111431', '116308', '25'), +('8', '113', '19', '111131', '102225', '25'), +('8', '113', '19', '105263', '88220', '25'), +('8', '113', '13', '111871', '156837', '25'), +('8', '113', '13', '111815', '154836', '25'), +('8', '113', '13', '111512', '147304', '25'), +('8', '113', '13', '111515', '147271', '25'), +('8', '113', '14', '111871', '156837', '25'), +('8', '113', '14', '111815', '154836', '25'), +('8', '113', '14', '111512', '147304', '25'), +('8', '113', '14', '111515', '147271', '25'), +('8', '113', '11', '85213', '172614', '25'), +('8', '113', '11', '133816', '149788', '25'), +('8', '113', '11', '111336', '117558', '25'), +('8', '113', '11', '111338', '117509', '25'), +('8', '114', '22', '12425', '0', '25'), +('8', '114', '22', '21807', '0', '25'), +('8', '114', '22', '21805', '0', '25'), +('8', '114', '22', '39342', '0', '25'), +('8', '114', '1', '98769', '192850', '25'), +('8', '114', '1', '111309', '117853', '25'), +('8', '114', '1', '111300', '117456', '25'), +('8', '114', '1', '111307', '117373', '25'), +('8', '114', '2', '111732', '128509', '25'), +('8', '114', '2', '111432', '117379', '25'), +('8', '114', '2', '111132', '103129', '25'), +('8', '114', '2', '104704', '94265', '25'), +('8', '114', '3', '111315', '117725', '25'), +('8', '114', '3', '111313', '117621', '25'), +('8', '114', '3', '111312', '117373', '25'), +('8', '114', '3', '111316', '116868', '25'), +('8', '114', '5', '111318', '117320', '25'), +('8', '114', '5', '111319', '117081', '25'), +('8', '114', '5', '111320', '117024', '25'), +('8', '114', '5', '111017', '103258', '25'), +('8', '114', '8', '111331', '117876', '25'), +('8', '114', '8', '111328', '117555', '25'), +('8', '114', '8', '111332', '117388', '25'), +('8', '114', '8', '111330', '117228', '25'), +('8', '114', '6', '111324', '117539', '25'), +('8', '114', '6', '111322', '117370', '25'), +('8', '114', '6', '111326', '116929', '25'), +('8', '114', '6', '111023', '103424', '25'), +('8', '114', '17', '111735', '134537', '25'), +('8', '114', '17', '111435', '123547', '25'), +('8', '114', '17', '111135', '109599', '25'), +('8', '114', '17', '105379', '95049', '25'), +('8', '114', '7', '111733', '128550', '25'), +('8', '114', '7', '111433', '117210', '25'), +('8', '114', '7', '111133', '103013', '25'), +('8', '114', '7', '104929', '94047', '25'), +('8', '114', '9', '111729', '124288', '25'), +('8', '114', '9', '67098', '119203', '25'), +('8', '114', '9', '111429', '113453', '25'), +('8', '114', '9', '111129', '99380', '25'), +('8', '114', '15', '111348', '117871', '25'), +('8', '114', '15', '111343', '117607', '25'), +('8', '114', '15', '111345', '117368', '25'), +('8', '114', '15', '111341', '117364', '25'), +('8', '114', '20', '111354', '127154', '25'), +('8', '114', '20', '111355', '126612', '25'), +('8', '114', '20', '111351', '126290', '25'), +('8', '114', '20', '111352', '126131', '25'), +('8', '114', '12', '111730', '126278', '25'), +('8', '114', '12', '111430', '115271', '25'), +('8', '114', '12', '111130', '100933', '25'), +('8', '114', '12', '104814', '93047', '25'), +('8', '114', '18', '111734', '130766', '25'), +('8', '114', '18', '111434', '119461', '25'), +('8', '114', '18', '111134', '105403', '25'), +('8', '114', '18', '105378', '91417', '25'), +('8', '114', '19', '111731', '127382', '25'), +('8', '114', '19', '111431', '116309', '25'), +('8', '114', '19', '111131', '102227', '25'), +('8', '114', '19', '105263', '88221', '25'), +('8', '114', '13', '111871', '156905', '25'), +('8', '114', '13', '111815', '154905', '25'), +('8', '114', '13', '111512', '147372', '25'), +('8', '114', '13', '111515', '147339', '25'), +('8', '114', '14', '111871', '156905', '25'), +('8', '114', '14', '111815', '154905', '25'), +('8', '114', '14', '111512', '147372', '25'), +('8', '114', '14', '111515', '147339', '25'), +('8', '114', '11', '85213', '172615', '25'), +('8', '114', '11', '133816', '149790', '25'), +('8', '114', '11', '111336', '117561', '25'), +('8', '114', '11', '111338', '117512', '25'), +('8', '115', '22', '12425', '0', '26'), +('8', '115', '22', '21807', '0', '26'), +('8', '115', '22', '21805', '0', '26'), +('8', '115', '22', '39342', '0', '26'), +('8', '115', '1', '98769', '192852', '26'), +('8', '115', '1', '111309', '117855', '26'), +('8', '115', '1', '111300', '117458', '26'), +('8', '115', '1', '111307', '117376', '26'), +('8', '115', '2', '111732', '128511', '26'), +('8', '115', '2', '111432', '117381', '26'), +('8', '115', '2', '111132', '103131', '26'), +('8', '115', '2', '104704', '94267', '26'), +('8', '115', '3', '111315', '117728', '26'), +('8', '115', '3', '111313', '117623', '26'), +('8', '115', '3', '111312', '117375', '26'), +('8', '115', '3', '111316', '116871', '26'), +('8', '115', '5', '111318', '117323', '26'), +('8', '115', '5', '111319', '117084', '26'), +('8', '115', '5', '111320', '117027', '26'), +('8', '115', '5', '111017', '103260', '26'), +('8', '115', '8', '111331', '117878', '26'), +('8', '115', '8', '111328', '117558', '26'), +('8', '115', '8', '111332', '117391', '26'), +('8', '115', '8', '111330', '117230', '26'), +('8', '115', '6', '111324', '117542', '26'), +('8', '115', '6', '111322', '117372', '26'), +('8', '115', '6', '111326', '116931', '26'), +('8', '115', '6', '111023', '103427', '26'), +('8', '115', '17', '111735', '134539', '26'), +('8', '115', '17', '111435', '123549', '26'), +('8', '115', '17', '111135', '109601', '26'), +('8', '115', '17', '105379', '95050', '26'), +('8', '115', '7', '111733', '128552', '26'), +('8', '115', '7', '111433', '117212', '26'), +('8', '115', '7', '111133', '103015', '26'), +('8', '115', '7', '104929', '94048', '26'), +('8', '115', '9', '111729', '124290', '26'), +('8', '115', '9', '67098', '119205', '26'), +('8', '115', '9', '111429', '113455', '26'), +('8', '115', '9', '111129', '99382', '26'), +('8', '115', '15', '111348', '117873', '26'), +('8', '115', '15', '111343', '117609', '26'), +('8', '115', '15', '111345', '117371', '26'), +('8', '115', '15', '111341', '117367', '26'), +('8', '115', '20', '111354', '127157', '26'), +('8', '115', '20', '111355', '126614', '26'), +('8', '115', '20', '111351', '126292', '26'), +('8', '115', '20', '111352', '126133', '26'), +('8', '115', '12', '111730', '126280', '26'), +('8', '115', '12', '111430', '115272', '26'), +('8', '115', '12', '111130', '100935', '26'), +('8', '115', '12', '104814', '93048', '26'), +('8', '115', '18', '111734', '130766', '26'), +('8', '115', '18', '111434', '119461', '26'), +('8', '115', '18', '111134', '105404', '26'), +('8', '115', '18', '105378', '91418', '26'), +('8', '115', '19', '111731', '127383', '26'), +('8', '115', '19', '111431', '116311', '26'), +('8', '115', '19', '111131', '102228', '26'), +('8', '115', '19', '105263', '88223', '26'), +('8', '115', '13', '111871', '156974', '26'), +('8', '115', '13', '111815', '154973', '26'), +('8', '115', '13', '111512', '147440', '26'), +('8', '115', '13', '111515', '147408', '26'), +('8', '115', '14', '111871', '156974', '26'), +('8', '115', '14', '111815', '154973', '26'), +('8', '115', '14', '111512', '147440', '26'), +('8', '115', '14', '111515', '147408', '26'), +('8', '115', '11', '85213', '172617', '26'), +('8', '115', '11', '133816', '149791', '26'), +('8', '115', '11', '111336', '117563', '26'), +('8', '115', '11', '111338', '117514', '26'), +('9', '1', '22', '8567', '0', '0'), +('9', '1', '22', '10323', '0', '0'), +('9', '1', '22', '66166', '0', '0'), +('9', '1', '22', '10664', '0', '0'), +('9', '1', '1', '30361', '1140', '0'), +('9', '1', '1', '14701', '362', '0'), +('9', '1', '1', '10165', '313', '0'), +('9', '1', '1', '14658', '258', '0'), +('9', '1', '2', '10142', '1272', '0'), +('9', '1', '2', '4341', '1262', '0'), +('9', '1', '2', '30363', '1200', '0'), +('9', '1', '2', '3040', '1082', '0'), +('9', '1', '3', '14706', '990', '0'), +('9', '1', '3', '14705', '990', '0'), +('9', '1', '3', '27702', '807', '0'), +('9', '1', '3', '14695', '423', '0'), +('9', '1', '5', '30362', '1140', '0'), +('9', '1', '5', '14552', '884', '0'), +('9', '1', '5', '10147', '630', '0'), +('9', '1', '5', '14703', '550', '0'), +('9', '1', '8', '11621', '8325', '0'), +('9', '1', '8', '11551', '1505', '0'), +('9', '1', '8', '3403', '1171', '0'), +('9', '1', '8', '1409', '812', '0'), +('9', '1', '6', '1557', '5310', '0'), +('9', '1', '6', '3309', '517', '0'), +('9', '1', '6', '3165', '512', '0'), +('9', '1', '6', '4165', '362', '0'), +('9', '1', '17', '11623', '1935', '0'), +('9', '1', '17', '4832', '1304', '0'), +('9', '1', '17', '4902', '1107', '0'), +('9', '1', '17', '3164', '867', '0'), +('9', '1', '7', '4833', '725', '0'), +('9', '1', '7', '4411', '633', '0'), +('9', '1', '7', '10104', '284', '0'), +('9', '1', '7', '3168', '271', '0'), +('9', '1', '9', '27703', '1840', '0'), +('9', '1', '9', '4834', '920', '0'), +('9', '1', '9', '4904', '574', '0'), +('9', '1', '9', '13280', '493', '0'), +('9', '1', '15', '14707', '1050', '0'), +('9', '1', '15', '10366', '805', '0'), +('9', '1', '15', '30360', '600', '0'), +('9', '1', '15', '14679', '580', '0'), +('9', '1', '20', '11676', '8690', '0'), +('9', '1', '20', '11601', '6959', '0'), +('9', '1', '20', '2922', '4899', '0'), +('9', '1', '20', '1365', '4200', '0'), +('9', '1', '12', '11624', '990', '0'), +('9', '1', '12', '20655', '744', '0'), +('9', '1', '12', '4905', '729', '0'), +('9', '1', '12', '4835', '659', '0'), +('9', '1', '18', '4412', '633', '0'), +('9', '1', '18', '4836', '428', '0'), +('9', '1', '18', '4906', '388', '0'), +('9', '1', '18', '2374', '266', '0'), +('9', '1', '19', '1534', '1276', '0'), +('9', '1', '19', '4837', '1024', '0'), +('9', '1', '19', '68239', '481', '0'), +('9', '1', '19', '4907', '392', '0'), +('9', '1', '13', '27704', '25288', '0'), +('9', '1', '13', '6692', '21631', '0'), +('9', '1', '13', '20858', '19380', '0'), +('9', '1', '13', '5416', '19170', '0'), +('9', '1', '14', '7257', '23041', '0'), +('9', '1', '14', '11557', '22800', '0'), +('9', '1', '14', '11661', '22080', '0'), +('9', '1', '14', '6692', '21631', '0'), +('9', '1', '11', '8325', '14120', '0'), +('9', '1', '11', '8408', '14050', '0'), +('9', '1', '11', '8811', '11040', '0'), +('9', '1', '11', '8810', '10160', '0'), +('9', '2', '22', '8567', '0', '0'), +('9', '2', '22', '10323', '0', '0'), +('9', '2', '22', '66166', '0', '0'), +('9', '2', '22', '10664', '0', '0'), +('9', '2', '1', '30361', '1140', '0'), +('9', '2', '1', '14701', '362', '0'), +('9', '2', '1', '10165', '313', '0'), +('9', '2', '1', '14658', '258', '0'), +('9', '2', '2', '10142', '1272', '0'), +('9', '2', '2', '4341', '1262', '0'), +('9', '2', '2', '30363', '1200', '0'), +('9', '2', '2', '3040', '1082', '0'), +('9', '2', '3', '14706', '990', '0'), +('9', '2', '3', '14705', '990', '0'), +('9', '2', '3', '27702', '807', '0'), +('9', '2', '3', '14695', '423', '0'), +('9', '2', '5', '30362', '1140', '0'), +('9', '2', '5', '14552', '884', '0'), +('9', '2', '5', '10147', '630', '0'), +('9', '2', '5', '14703', '550', '0'), +('9', '2', '8', '11621', '8325', '0'), +('9', '2', '8', '11551', '1505', '0'), +('9', '2', '8', '3403', '1171', '0'), +('9', '2', '8', '1409', '812', '0'), +('9', '2', '6', '1557', '5310', '0'), +('9', '2', '6', '3309', '517', '0'), +('9', '2', '6', '3165', '512', '0'), +('9', '2', '6', '4165', '362', '0'), +('9', '2', '17', '11623', '1935', '0'), +('9', '2', '17', '4832', '1309', '0'), +('9', '2', '17', '4902', '1107', '0'), +('9', '2', '17', '3164', '867', '0'), +('9', '2', '7', '4833', '725', '0'), +('9', '2', '7', '4411', '633', '0'), +('9', '2', '7', '10104', '284', '0'), +('9', '2', '7', '71303', '271', '0'), +('9', '2', '9', '27703', '1840', '0'), +('9', '2', '9', '4834', '920', '0'), +('9', '2', '9', '4904', '574', '0'), +('9', '2', '9', '13280', '493', '0'), +('9', '2', '15', '14707', '1050', '0'), +('9', '2', '15', '10366', '805', '0'), +('9', '2', '15', '30360', '600', '0'), +('9', '2', '15', '14679', '580', '0'), +('9', '2', '20', '11676', '8690', '0'), +('9', '2', '20', '11601', '6962', '0'), +('9', '2', '20', '2922', '4899', '0'), +('9', '2', '20', '1365', '4200', '0'), +('9', '2', '12', '11624', '993', '0'), +('9', '2', '12', '20655', '744', '0'), +('9', '2', '12', '4905', '729', '0'), +('9', '2', '12', '4835', '661', '0'), +('9', '2', '18', '4412', '633', '0'), +('9', '2', '18', '4836', '429', '0'), +('9', '2', '18', '4906', '388', '0'), +('9', '2', '18', '2374', '266', '0'), +('9', '2', '19', '1534', '1276', '0'), +('9', '2', '19', '4837', '1024', '0'), +('9', '2', '19', '68239', '481', '0'), +('9', '2', '19', '4907', '392', '0'), +('9', '2', '13', '27704', '25671', '0'), +('9', '2', '13', '6692', '21631', '0'), +('9', '2', '13', '20858', '19380', '0'), +('9', '2', '13', '5416', '19170', '0'), +('9', '2', '14', '7257', '23041', '0'), +('9', '2', '14', '11557', '22800', '0'), +('9', '2', '14', '11661', '22080', '0'), +('9', '2', '14', '6692', '21631', '0'), +('9', '2', '11', '8325', '14120', '0'), +('9', '2', '11', '8408', '14050', '0'), +('9', '2', '11', '8811', '11040', '0'), +('9', '2', '11', '8810', '10160', '0'), +('9', '3', '22', '8567', '0', '0'), +('9', '3', '22', '10323', '0', '0'), +('9', '3', '22', '66166', '0', '0'), +('9', '3', '22', '10664', '0', '0'), +('9', '3', '1', '30361', '1140', '0'), +('9', '3', '1', '14701', '362', '0'), +('9', '3', '1', '10165', '313', '0'), +('9', '3', '1', '14658', '258', '0'), +('9', '3', '2', '10142', '1272', '0'), +('9', '3', '2', '4341', '1262', '0'), +('9', '3', '2', '30363', '1200', '0'), +('9', '3', '2', '3040', '1082', '0'), +('9', '3', '3', '14706', '990', '0'), +('9', '3', '3', '14705', '990', '0'), +('9', '3', '3', '27702', '807', '0'), +('9', '3', '3', '14695', '423', '0'), +('9', '3', '5', '30362', '1140', '0'), +('9', '3', '5', '14552', '884', '0'), +('9', '3', '5', '10147', '630', '0'), +('9', '3', '5', '14703', '550', '0'), +('9', '3', '8', '11621', '8325', '0'), +('9', '3', '8', '11551', '1505', '0'), +('9', '3', '8', '3403', '1171', '0'), +('9', '3', '8', '1409', '812', '0'), +('9', '3', '6', '1557', '5310', '0'), +('9', '3', '6', '3309', '517', '0'), +('9', '3', '6', '3165', '512', '0'), +('9', '3', '6', '4165', '362', '0'), +('9', '3', '17', '11623', '1935', '0'), +('9', '3', '17', '4832', '1315', '0'), +('9', '3', '17', '4902', '1107', '0'), +('9', '3', '17', '3164', '867', '0'), +('9', '3', '7', '4833', '725', '0'), +('9', '3', '7', '4411', '633', '0'), +('9', '3', '7', '10104', '284', '0'), +('9', '3', '7', '71303', '271', '0'), +('9', '3', '9', '27703', '1840', '0'), +('9', '3', '9', '4834', '920', '0'), +('9', '3', '9', '4904', '574', '0'), +('9', '3', '9', '13280', '493', '0'), +('9', '3', '15', '14707', '1050', '0'), +('9', '3', '15', '10366', '805', '0'), +('9', '3', '15', '30360', '600', '0'), +('9', '3', '15', '14679', '580', '0'), +('9', '3', '20', '11676', '8690', '0'), +('9', '3', '20', '11601', '6966', '0'), +('9', '3', '20', '2922', '4899', '0'), +('9', '3', '20', '1365', '4200', '0'), +('9', '3', '12', '11624', '995', '0'), +('9', '3', '12', '20655', '745', '0'), +('9', '3', '12', '4905', '729', '0'), +('9', '3', '12', '4835', '662', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '3', '18', '4412', '633', '0'), +('9', '3', '18', '4836', '431', '0'), +('9', '3', '18', '4906', '388', '0'), +('9', '3', '18', '2374', '266', '0'), +('9', '3', '19', '1534', '1276', '0'), +('9', '3', '19', '4837', '1024', '0'), +('9', '3', '19', '68239', '481', '0'), +('9', '3', '19', '4907', '392', '0'), +('9', '3', '13', '27704', '26063', '0'), +('9', '3', '13', '6692', '21631', '0'), +('9', '3', '13', '20858', '19380', '0'), +('9', '3', '13', '11557', '19203', '0'), +('9', '3', '14', '7257', '23041', '0'), +('9', '3', '14', '11557', '22800', '0'), +('9', '3', '14', '11661', '22080', '0'), +('9', '3', '14', '6692', '21631', '0'), +('9', '3', '11', '8325', '14120', '0'), +('9', '3', '11', '8408', '14050', '0'), +('9', '3', '11', '8811', '11040', '0'), +('9', '3', '11', '8810', '10160', '0'), +('9', '4', '22', '8567', '0', '0'), +('9', '4', '22', '10323', '0', '0'), +('9', '4', '22', '66166', '0', '0'), +('9', '4', '22', '10664', '0', '0'), +('9', '4', '1', '30361', '1140', '0'), +('9', '4', '1', '14701', '362', '0'), +('9', '4', '1', '10165', '313', '0'), +('9', '4', '1', '14658', '258', '0'), +('9', '4', '2', '10142', '1272', '0'), +('9', '4', '2', '4341', '1262', '0'), +('9', '4', '2', '30363', '1200', '0'), +('9', '4', '2', '3040', '1082', '0'), +('9', '4', '3', '14706', '990', '0'), +('9', '4', '3', '14705', '990', '0'), +('9', '4', '3', '27702', '807', '0'), +('9', '4', '3', '14695', '423', '0'), +('9', '4', '5', '30362', '1140', '0'), +('9', '4', '5', '14552', '884', '0'), +('9', '4', '5', '10147', '630', '0'), +('9', '4', '5', '14703', '550', '0'), +('9', '4', '8', '11621', '8325', '0'), +('9', '4', '8', '11551', '1505', '0'), +('9', '4', '8', '3403', '1171', '0'), +('9', '4', '8', '1409', '812', '0'), +('9', '4', '6', '1557', '5310', '0'), +('9', '4', '6', '3309', '517', '0'), +('9', '4', '6', '3165', '512', '0'), +('9', '4', '6', '4165', '362', '0'), +('9', '4', '17', '11623', '1935', '0'), +('9', '4', '17', '4832', '1320', '0'), +('9', '4', '17', '4902', '1107', '0'), +('9', '4', '17', '3164', '867', '0'), +('9', '4', '7', '4833', '725', '0'), +('9', '4', '7', '4411', '633', '0'), +('9', '4', '7', '10104', '284', '0'), +('9', '4', '7', '71303', '271', '0'), +('9', '4', '9', '27703', '1840', '0'), +('9', '4', '9', '4834', '920', '0'), +('9', '4', '9', '4904', '574', '0'), +('9', '4', '9', '13280', '493', '0'), +('9', '4', '15', '14707', '1050', '0'), +('9', '4', '15', '10366', '805', '0'), +('9', '4', '15', '30360', '600', '0'), +('9', '4', '15', '14679', '580', '0'), +('9', '4', '20', '11676', '8690', '0'), +('9', '4', '20', '11601', '6969', '0'), +('9', '4', '20', '2922', '4899', '0'), +('9', '4', '20', '1365', '4200', '0'), +('9', '4', '12', '11624', '998', '0'), +('9', '4', '12', '20655', '746', '0'), +('9', '4', '12', '4905', '729', '0'), +('9', '4', '12', '4835', '664', '0'), +('9', '4', '18', '4412', '633', '0'), +('9', '4', '18', '4836', '433', '0'), +('9', '4', '18', '4906', '388', '0'), +('9', '4', '18', '2374', '266', '0'), +('9', '4', '19', '1534', '1276', '0'), +('9', '4', '19', '4837', '1024', '0'), +('9', '4', '19', '68239', '481', '0'), +('9', '4', '19', '4907', '392', '0'), +('9', '4', '13', '27704', '26463', '0'), +('9', '4', '13', '6692', '21631', '0'), +('9', '4', '13', '11557', '19505', '0'), +('9', '4', '13', '20858', '19380', '0'), +('9', '4', '14', '7257', '23041', '0'), +('9', '4', '14', '11557', '22800', '0'), +('9', '4', '14', '11661', '22080', '0'), +('9', '4', '14', '6692', '21631', '0'), +('9', '4', '11', '8325', '14120', '0'), +('9', '4', '11', '8408', '14050', '0'), +('9', '4', '11', '8811', '11040', '0'), +('9', '4', '11', '8810', '10160', '0'), +('9', '5', '22', '8567', '0', '0'), +('9', '5', '22', '10323', '0', '0'), +('9', '5', '22', '66166', '0', '0'), +('9', '5', '22', '10664', '0', '0'), +('9', '5', '1', '30361', '1140', '0'), +('9', '5', '1', '14701', '362', '0'), +('9', '5', '1', '10165', '313', '0'), +('9', '5', '1', '14658', '258', '0'), +('9', '5', '2', '10142', '1272', '0'), +('9', '5', '2', '4341', '1262', '0'), +('9', '5', '2', '30363', '1200', '0'), +('9', '5', '2', '3040', '1082', '0'), +('9', '5', '3', '14706', '990', '0'), +('9', '5', '3', '14705', '990', '0'), +('9', '5', '3', '27702', '807', '0'), +('9', '5', '3', '14695', '423', '0'), +('9', '5', '5', '30362', '1140', '0'), +('9', '5', '5', '14552', '884', '0'), +('9', '5', '5', '10147', '630', '0'), +('9', '5', '5', '14703', '550', '0'), +('9', '5', '8', '11621', '8325', '0'), +('9', '5', '8', '11551', '1505', '0'), +('9', '5', '8', '3403', '1171', '0'), +('9', '5', '8', '1409', '812', '0'), +('9', '5', '6', '1557', '5310', '0'), +('9', '5', '6', '3309', '517', '0'), +('9', '5', '6', '3165', '512', '0'), +('9', '5', '6', '4165', '362', '0'), +('9', '5', '17', '11623', '1935', '0'), +('9', '5', '17', '4832', '1326', '0'), +('9', '5', '17', '4902', '1107', '0'), +('9', '5', '17', '3164', '867', '0'), +('9', '5', '7', '4833', '725', '0'), +('9', '5', '7', '4411', '633', '0'), +('9', '5', '7', '10104', '284', '0'), +('9', '5', '7', '71303', '271', '0'), +('9', '5', '9', '27703', '1840', '0'), +('9', '5', '9', '4834', '920', '0'), +('9', '5', '9', '4904', '574', '0'), +('9', '5', '9', '13280', '493', '0'), +('9', '5', '15', '14707', '1050', '0'), +('9', '5', '15', '10366', '805', '0'), +('9', '5', '15', '30360', '600', '0'), +('9', '5', '15', '14679', '580', '0'), +('9', '5', '20', '11676', '8690', '0'), +('9', '5', '20', '11601', '6973', '0'), +('9', '5', '20', '2922', '4899', '0'), +('9', '5', '20', '1365', '4200', '0'), +('9', '5', '12', '11624', '1000', '0'), +('9', '5', '12', '20655', '746', '0'), +('9', '5', '12', '4905', '729', '0'), +('9', '5', '12', '4835', '666', '0'), +('9', '5', '18', '4412', '633', '0'), +('9', '5', '18', '4836', '435', '0'), +('9', '5', '18', '4906', '388', '0'), +('9', '5', '18', '2374', '266', '0'), +('9', '5', '19', '1534', '1276', '0'), +('9', '5', '19', '4837', '1024', '0'), +('9', '5', '19', '68239', '481', '0'), +('9', '5', '19', '4907', '392', '0'), +('9', '5', '13', '27704', '26872', '0'), +('9', '5', '13', '6692', '21631', '0'), +('9', '5', '13', '11557', '19814', '0'), +('9', '5', '13', '20858', '19380', '0'), +('9', '5', '14', '7257', '23041', '0'), +('9', '5', '14', '11557', '22800', '0'), +('9', '5', '14', '11661', '22080', '0'), +('9', '5', '14', '6692', '21631', '0'), +('9', '5', '11', '8325', '14120', '0'), +('9', '5', '11', '8408', '14050', '0'), +('9', '5', '11', '8811', '11040', '0'), +('9', '5', '11', '8810', '10160', '0'), +('9', '6', '22', '8567', '0', '0'), +('9', '6', '22', '10323', '0', '0'), +('9', '6', '22', '66166', '0', '0'), +('9', '6', '22', '10664', '0', '0'), +('9', '6', '1', '30361', '1140', '0'), +('9', '6', '1', '14701', '362', '0'), +('9', '6', '1', '10165', '313', '0'), +('9', '6', '1', '14658', '258', '0'), +('9', '6', '2', '10142', '1272', '0'), +('9', '6', '2', '4341', '1262', '0'), +('9', '6', '2', '30363', '1200', '0'), +('9', '6', '2', '3040', '1082', '0'), +('9', '6', '3', '14706', '990', '0'), +('9', '6', '3', '14705', '990', '0'), +('9', '6', '3', '27702', '807', '0'), +('9', '6', '3', '14695', '423', '0'), +('9', '6', '5', '30362', '1140', '0'), +('9', '6', '5', '14552', '884', '0'), +('9', '6', '5', '10147', '630', '0'), +('9', '6', '5', '14703', '550', '0'), +('9', '6', '8', '11621', '8325', '0'), +('9', '6', '8', '11551', '1505', '0'), +('9', '6', '8', '3403', '1171', '0'), +('9', '6', '8', '1409', '812', '0'), +('9', '6', '6', '1557', '5310', '0'), +('9', '6', '6', '3309', '517', '0'), +('9', '6', '6', '3165', '512', '0'), +('9', '6', '6', '4165', '362', '0'), +('9', '6', '17', '11623', '1935', '0'), +('9', '6', '17', '4832', '1331', '0'), +('9', '6', '17', '4902', '1107', '0'), +('9', '6', '17', '3164', '867', '0'), +('9', '6', '7', '4833', '725', '0'), +('9', '6', '7', '4411', '633', '0'), +('9', '6', '7', '10104', '284', '0'), +('9', '6', '7', '71303', '271', '0'), +('9', '6', '9', '27703', '1840', '0'), +('9', '6', '9', '4834', '920', '0'), +('9', '6', '9', '4904', '574', '0'), +('9', '6', '9', '13280', '493', '0'), +('9', '6', '15', '14707', '1050', '0'), +('9', '6', '15', '10366', '805', '0'), +('9', '6', '15', '30360', '600', '0'), +('9', '6', '15', '14679', '580', '0'), +('9', '6', '20', '11676', '8690', '0'), +('9', '6', '20', '11601', '6977', '0'), +('9', '6', '20', '2922', '4899', '0'), +('9', '6', '20', '1365', '4200', '0'), +('9', '6', '12', '11624', '1003', '0'), +('9', '6', '12', '20655', '747', '0'), +('9', '6', '12', '4905', '729', '0'), +('9', '6', '12', '4835', '668', '0'), +('9', '6', '18', '4412', '633', '0'), +('9', '6', '18', '4836', '437', '0'), +('9', '6', '18', '4906', '388', '0'), +('9', '6', '18', '2374', '266', '0'), +('9', '6', '19', '1534', '1276', '0'), +('9', '6', '19', '4837', '1024', '0'), +('9', '6', '19', '68239', '481', '0'), +('9', '6', '19', '4907', '392', '0'), +('9', '6', '13', '27704', '27289', '0'), +('9', '6', '13', '6692', '21631', '0'), +('9', '6', '13', '11557', '20129', '0'), +('9', '6', '13', '20858', '19380', '0'), +('9', '6', '14', '7257', '23041', '0'), +('9', '6', '14', '11557', '22800', '0'), +('9', '6', '14', '11661', '22080', '0'), +('9', '6', '14', '6692', '21631', '0'), +('9', '6', '11', '8325', '14120', '0'), +('9', '6', '11', '8408', '14050', '0'), +('9', '6', '11', '8811', '11040', '0'), +('9', '6', '11', '8810', '10160', '0'), +('9', '7', '22', '8567', '0', '0'), +('9', '7', '22', '10323', '0', '0'), +('9', '7', '22', '66166', '0', '0'), +('9', '7', '22', '10664', '0', '0'), +('9', '7', '1', '30361', '1140', '0'), +('9', '7', '1', '14701', '362', '0'), +('9', '7', '1', '10165', '313', '0'), +('9', '7', '1', '14658', '258', '0'), +('9', '7', '2', '10142', '1272', '0'), +('9', '7', '2', '4341', '1262', '0'), +('9', '7', '2', '30363', '1200', '0'), +('9', '7', '2', '3040', '1082', '0'), +('9', '7', '3', '14706', '990', '0'), +('9', '7', '3', '14705', '990', '0'), +('9', '7', '3', '27702', '807', '0'), +('9', '7', '3', '14695', '423', '0'), +('9', '7', '5', '30362', '1140', '0'), +('9', '7', '5', '14552', '884', '0'), +('9', '7', '5', '10147', '630', '0'), +('9', '7', '5', '14703', '550', '0'), +('9', '7', '8', '11621', '8325', '0'), +('9', '7', '8', '11551', '1505', '0'), +('9', '7', '8', '3403', '1171', '0'), +('9', '7', '8', '1409', '812', '0'), +('9', '7', '6', '1557', '5310', '0'), +('9', '7', '6', '3309', '517', '0'), +('9', '7', '6', '3165', '512', '0'), +('9', '7', '6', '4165', '362', '0'), +('9', '7', '17', '11623', '1935', '0'), +('9', '7', '17', '4832', '1338', '0'), +('9', '7', '17', '4902', '1107', '0'), +('9', '7', '17', '3164', '867', '0'), +('9', '7', '7', '4833', '725', '0'), +('9', '7', '7', '4411', '633', '0'), +('9', '7', '7', '10104', '284', '0'), +('9', '7', '7', '71303', '271', '0'), +('9', '7', '9', '27703', '1840', '0'), +('9', '7', '9', '4834', '920', '0'), +('9', '7', '9', '4904', '574', '0'), +('9', '7', '9', '13280', '493', '0'), +('9', '7', '15', '14707', '1050', '0'), +('9', '7', '15', '10366', '805', '0'), +('9', '7', '15', '30360', '600', '0'), +('9', '7', '15', '14679', '580', '0'), +('9', '7', '20', '11676', '8690', '0'), +('9', '7', '20', '11601', '6981', '0'), +('9', '7', '20', '2922', '4899', '0'), +('9', '7', '20', '1365', '4200', '0'), +('9', '7', '12', '11624', '1006', '0'), +('9', '7', '12', '20655', '748', '0'), +('9', '7', '12', '4905', '729', '0'), +('9', '7', '12', '4835', '670', '0'), +('9', '7', '18', '4412', '633', '0'), +('9', '7', '18', '4836', '439', '0'), +('9', '7', '18', '4906', '388', '0'), +('9', '7', '18', '2374', '266', '0'), +('9', '7', '19', '1534', '1276', '0'), +('9', '7', '19', '4837', '1024', '0'), +('9', '7', '19', '68239', '481', '0'), +('9', '7', '19', '4907', '392', '0'), +('9', '7', '13', '27704', '27716', '0'), +('9', '7', '13', '6692', '21631', '0'), +('9', '7', '13', '11557', '20450', '0'), +('9', '7', '13', '11661', '19384', '0'), +('9', '7', '14', '7257', '23041', '0'), +('9', '7', '14', '11557', '22800', '0'), +('9', '7', '14', '11661', '22080', '0'), +('9', '7', '14', '6692', '21631', '0'), +('9', '7', '11', '8325', '14120', '0'), +('9', '7', '11', '8408', '14050', '0'), +('9', '7', '11', '8811', '11040', '0'), +('9', '7', '11', '8810', '10160', '0'), +('9', '8', '22', '8567', '0', '0'), +('9', '8', '22', '10323', '0', '0'), +('9', '8', '22', '66166', '0', '0'), +('9', '8', '22', '10664', '0', '0'), +('9', '8', '1', '30361', '1140', '0'), +('9', '8', '1', '14701', '362', '0'), +('9', '8', '1', '10165', '313', '0'), +('9', '8', '1', '14658', '258', '0'), +('9', '8', '2', '10142', '1272', '0'), +('9', '8', '2', '4341', '1262', '0'), +('9', '8', '2', '30363', '1200', '0'), +('9', '8', '2', '3040', '1082', '0'), +('9', '8', '3', '14706', '990', '0'), +('9', '8', '3', '14705', '990', '0'), +('9', '8', '3', '27702', '807', '0'), +('9', '8', '3', '14695', '423', '0'), +('9', '8', '5', '30362', '1140', '0'), +('9', '8', '5', '14552', '884', '0'), +('9', '8', '5', '10147', '630', '0'), +('9', '8', '5', '14703', '550', '0'), +('9', '8', '8', '11621', '8325', '0'), +('9', '8', '8', '11551', '1505', '0'), +('9', '8', '8', '3403', '1171', '0'), +('9', '8', '8', '1409', '812', '0'), +('9', '8', '6', '1557', '5310', '0'), +('9', '8', '6', '3309', '517', '0'), +('9', '8', '6', '3165', '512', '0'), +('9', '8', '6', '4165', '362', '0'), +('9', '8', '17', '11623', '1935', '0'), +('9', '8', '17', '4832', '1343', '0'), +('9', '8', '17', '4902', '1107', '0'), +('9', '8', '17', '3164', '867', '0'), +('9', '8', '7', '4833', '725', '0'), +('9', '8', '7', '4411', '633', '0'), +('9', '8', '7', '10104', '284', '0'), +('9', '8', '7', '71303', '271', '0'), +('9', '8', '9', '27703', '1840', '0'), +('9', '8', '9', '4834', '920', '0'), +('9', '8', '9', '4904', '574', '0'), +('9', '8', '9', '13280', '493', '0'), +('9', '8', '15', '14707', '1050', '0'), +('9', '8', '15', '10366', '805', '0'), +('9', '8', '15', '30360', '600', '0'), +('9', '8', '15', '14679', '580', '0'), +('9', '8', '20', '11676', '8690', '0'), +('9', '8', '20', '11601', '6985', '0'), +('9', '8', '20', '2922', '4899', '0'), +('9', '8', '20', '1365', '4200', '0'), +('9', '8', '12', '11624', '1008', '0'), +('9', '8', '12', '20655', '749', '0'), +('9', '8', '12', '4905', '729', '0'), +('9', '8', '12', '4835', '672', '0'), +('9', '8', '18', '4412', '633', '0'), +('9', '8', '18', '4836', '441', '0'), +('9', '8', '18', '4906', '388', '0'), +('9', '8', '18', '2374', '266', '0'), +('9', '8', '19', '1534', '1276', '0'), +('9', '8', '19', '4837', '1024', '0'), +('9', '8', '19', '68239', '481', '0'), +('9', '8', '19', '4907', '392', '0'), +('9', '8', '13', '27704', '28151', '0'), +('9', '8', '13', '6692', '21631', '0'), +('9', '8', '13', '11557', '20778', '0'), +('9', '8', '13', '7257', '19775', '0'), +('9', '8', '14', '7257', '23041', '0'), +('9', '8', '14', '11557', '22800', '0'), +('9', '8', '14', '11661', '22080', '0'), +('9', '8', '14', '6692', '21631', '0'), +('9', '8', '11', '8325', '14120', '0'), +('9', '8', '11', '8408', '14050', '0'), +('9', '8', '11', '8811', '11040', '0'), +('9', '8', '11', '8810', '10160', '0'), +('9', '9', '22', '8567', '0', '0'), +('9', '9', '22', '10323', '0', '0'), +('9', '9', '22', '66166', '0', '0'), +('9', '9', '22', '10664', '0', '0'), +('9', '9', '1', '30361', '1140', '0'), +('9', '9', '1', '14701', '362', '0'), +('9', '9', '1', '10165', '313', '0'), +('9', '9', '1', '14658', '258', '0'), +('9', '9', '2', '10142', '1272', '0'), +('9', '9', '2', '4341', '1262', '0'), +('9', '9', '2', '30363', '1200', '0'), +('9', '9', '2', '3040', '1082', '0'), +('9', '9', '3', '14706', '990', '0'), +('9', '9', '3', '14705', '990', '0'), +('9', '9', '3', '27702', '807', '0'), +('9', '9', '3', '14695', '423', '0'), +('9', '9', '5', '30362', '1140', '0'), +('9', '9', '5', '14552', '884', '0'), +('9', '9', '5', '10147', '630', '0'), +('9', '9', '5', '14703', '550', '0'), +('9', '9', '8', '11621', '8325', '0'), +('9', '9', '8', '11551', '1505', '0'), +('9', '9', '8', '3403', '1171', '0'), +('9', '9', '8', '1409', '812', '0'), +('9', '9', '6', '1557', '5310', '0'), +('9', '9', '6', '3309', '517', '0'), +('9', '9', '6', '3165', '512', '0'), +('9', '9', '6', '4165', '362', '0'), +('9', '9', '17', '11623', '1935', '0'), +('9', '9', '17', '4832', '1348', '0'), +('9', '9', '17', '4902', '1107', '0'), +('9', '9', '17', '3164', '867', '0'), +('9', '9', '7', '4833', '725', '0'), +('9', '9', '7', '4411', '633', '0'), +('9', '9', '7', '10104', '284', '0'), +('9', '9', '7', '71303', '271', '0'), +('9', '9', '9', '27703', '1840', '0'), +('9', '9', '9', '4834', '920', '0'), +('9', '9', '9', '4904', '574', '0'), +('9', '9', '9', '13280', '493', '0'), +('9', '9', '15', '14707', '1050', '0'), +('9', '9', '15', '10366', '805', '0'), +('9', '9', '15', '30360', '600', '0'), +('9', '9', '15', '14679', '580', '0'), +('9', '9', '20', '11676', '8690', '0'), +('9', '9', '20', '11601', '6988', '0'), +('9', '9', '20', '2922', '4899', '0'), +('9', '9', '20', '1365', '4200', '0'), +('9', '9', '12', '11624', '1011', '0'), +('9', '9', '12', '20655', '749', '0'), +('9', '9', '12', '4905', '729', '0'), +('9', '9', '12', '4835', '674', '0'), +('9', '9', '18', '4412', '633', '0'), +('9', '9', '18', '4836', '442', '0'), +('9', '9', '18', '4906', '388', '0'), +('9', '9', '18', '2374', '266', '0'), +('9', '9', '19', '1534', '1276', '0'), +('9', '9', '19', '4837', '1024', '0'), +('9', '9', '19', '68239', '481', '0'), +('9', '9', '19', '4907', '392', '0'), +('9', '9', '13', '27704', '28594', '0'), +('9', '9', '13', '6692', '21631', '0'), +('9', '9', '13', '11557', '21113', '0'), +('9', '9', '13', '7257', '20255', '0'), +('9', '9', '14', '7257', '23041', '0'), +('9', '9', '14', '11557', '22800', '0'), +('9', '9', '14', '11661', '22080', '0'), +('9', '9', '14', '6692', '21631', '0'), +('9', '9', '11', '8325', '14120', '0'), +('9', '9', '11', '8408', '14050', '0'), +('9', '9', '11', '8811', '11040', '0'), +('9', '9', '11', '8810', '10160', '0'), +('9', '10', '22', '8567', '0', '0'), +('9', '10', '22', '10323', '0', '0'), +('9', '10', '22', '66166', '0', '0'), +('9', '10', '22', '10664', '0', '0'), +('9', '10', '1', '30361', '1140', '0'), +('9', '10', '1', '14701', '362', '0'), +('9', '10', '1', '10165', '313', '0'), +('9', '10', '1', '14658', '258', '0'), +('9', '10', '2', '10142', '1272', '0'), +('9', '10', '2', '4341', '1262', '0'), +('9', '10', '2', '30363', '1200', '0'), +('9', '10', '2', '3040', '1082', '0'), +('9', '10', '3', '14706', '990', '0'), +('9', '10', '3', '14705', '990', '0'), +('9', '10', '3', '27702', '807', '0'), +('9', '10', '3', '14695', '423', '0'), +('9', '10', '5', '30362', '1140', '0'), +('9', '10', '5', '14552', '884', '0'), +('9', '10', '5', '10147', '630', '0'), +('9', '10', '5', '14703', '550', '0'), +('9', '10', '8', '11621', '8325', '0'), +('9', '10', '8', '11551', '1505', '0'), +('9', '10', '8', '3403', '1171', '0'), +('9', '10', '8', '1409', '812', '0'), +('9', '10', '6', '1557', '5310', '0'), +('9', '10', '6', '3309', '517', '0'), +('9', '10', '6', '3165', '512', '0'), +('9', '10', '6', '4165', '362', '0'), +('9', '10', '17', '11623', '1935', '0'), +('9', '10', '17', '4832', '1354', '0'), +('9', '10', '17', '4902', '1107', '0'), +('9', '10', '17', '3164', '867', '0'), +('9', '10', '7', '4833', '725', '0'), +('9', '10', '7', '4411', '633', '0'), +('9', '10', '7', '10104', '284', '0'), +('9', '10', '7', '3168', '271', '0'), +('9', '10', '9', '27703', '1840', '0'), +('9', '10', '9', '4834', '920', '0'), +('9', '10', '9', '4904', '574', '0'), +('9', '10', '9', '13280', '493', '0'), +('9', '10', '15', '14707', '1050', '0'), +('9', '10', '15', '10366', '805', '0'), +('9', '10', '15', '30360', '600', '0'), +('9', '10', '15', '14679', '580', '0'), +('9', '10', '20', '11676', '8690', '0'), +('9', '10', '20', '11601', '6992', '0'), +('9', '10', '20', '2922', '4899', '0'), +('9', '10', '20', '1365', '4200', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '10', '12', '11624', '1014', '0'), +('9', '10', '12', '20655', '750', '0'), +('9', '10', '12', '4905', '729', '0'), +('9', '10', '12', '4835', '675', '0'), +('9', '10', '18', '4412', '633', '0'), +('9', '10', '18', '4836', '444', '0'), +('9', '10', '18', '4906', '388', '0'), +('9', '10', '18', '2374', '266', '0'), +('9', '10', '19', '1534', '1276', '0'), +('9', '10', '19', '4837', '1024', '0'), +('9', '10', '19', '68239', '481', '0'), +('9', '10', '19', '4907', '392', '0'), +('9', '10', '13', '27704', '29046', '0'), +('9', '10', '13', '6692', '21631', '0'), +('9', '10', '13', '11557', '21454', '0'), +('9', '10', '13', '7257', '20744', '0'), +('9', '10', '14', '7257', '23041', '0'), +('9', '10', '14', '11557', '22800', '0'), +('9', '10', '14', '11661', '22080', '0'), +('9', '10', '14', '6692', '21631', '0'), +('9', '10', '11', '8325', '14120', '0'), +('9', '10', '11', '8408', '14050', '0'), +('9', '10', '11', '8811', '11040', '0'), +('9', '10', '11', '8810', '10160', '0'), +('9', '11', '22', '8567', '0', '0'), +('9', '11', '22', '10323', '0', '0'), +('9', '11', '22', '66166', '0', '0'), +('9', '11', '22', '10664', '0', '0'), +('9', '11', '1', '30361', '1140', '0'), +('9', '11', '1', '14701', '362', '0'), +('9', '11', '1', '10165', '313', '0'), +('9', '11', '1', '14658', '258', '0'), +('9', '11', '2', '10142', '1272', '0'), +('9', '11', '2', '4341', '1262', '0'), +('9', '11', '2', '30363', '1200', '0'), +('9', '11', '2', '3040', '1082', '0'), +('9', '11', '3', '14706', '990', '0'), +('9', '11', '3', '14705', '990', '0'), +('9', '11', '3', '27702', '807', '0'), +('9', '11', '3', '14695', '423', '0'), +('9', '11', '5', '30362', '1140', '0'), +('9', '11', '5', '14552', '884', '0'), +('9', '11', '5', '10147', '630', '0'), +('9', '11', '5', '14703', '550', '0'), +('9', '11', '8', '11621', '8325', '0'), +('9', '11', '8', '11551', '1505', '0'), +('9', '11', '8', '3403', '1171', '0'), +('9', '11', '8', '1409', '812', '0'), +('9', '11', '6', '1557', '5310', '0'), +('9', '11', '6', '3309', '517', '0'), +('9', '11', '6', '3165', '512', '0'), +('9', '11', '6', '4165', '362', '0'), +('9', '11', '17', '11623', '1935', '0'), +('9', '11', '17', '4832', '1360', '0'), +('9', '11', '17', '4902', '1107', '0'), +('9', '11', '17', '3164', '867', '0'), +('9', '11', '7', '4833', '725', '0'), +('9', '11', '7', '4411', '633', '0'), +('9', '11', '7', '10104', '284', '0'), +('9', '11', '7', '71303', '271', '0'), +('9', '11', '9', '27703', '1840', '0'), +('9', '11', '9', '4834', '920', '0'), +('9', '11', '9', '4904', '574', '0'), +('9', '11', '9', '13280', '493', '0'), +('9', '11', '15', '14707', '1050', '0'), +('9', '11', '15', '10366', '805', '0'), +('9', '11', '15', '30360', '600', '0'), +('9', '11', '15', '14679', '580', '0'), +('9', '11', '20', '11676', '8690', '0'), +('9', '11', '20', '11601', '6996', '0'), +('9', '11', '20', '2922', '4899', '0'), +('9', '11', '20', '1365', '4200', '0'), +('9', '11', '12', '11624', '1017', '0'), +('9', '11', '12', '20655', '751', '0'), +('9', '11', '12', '4905', '729', '0'), +('9', '11', '12', '4835', '678', '0'), +('9', '11', '18', '4412', '633', '0'), +('9', '11', '18', '4836', '446', '0'), +('9', '11', '18', '4906', '388', '0'), +('9', '11', '18', '2374', '266', '0'), +('9', '11', '19', '1534', '1276', '0'), +('9', '11', '19', '4837', '1024', '0'), +('9', '11', '19', '68239', '481', '0'), +('9', '11', '19', '4907', '392', '0'), +('9', '11', '13', '27704', '29507', '0'), +('9', '11', '13', '11557', '21801', '0'), +('9', '11', '13', '6692', '21631', '0'), +('9', '11', '13', '7257', '21243', '0'), +('9', '11', '14', '7257', '23041', '0'), +('9', '11', '14', '11557', '22800', '0'), +('9', '11', '14', '11661', '22080', '0'), +('9', '11', '14', '6692', '21631', '0'), +('9', '11', '11', '8325', '14120', '0'), +('9', '11', '11', '8408', '14050', '0'), +('9', '11', '11', '8811', '11040', '0'), +('9', '11', '11', '8810', '10160', '0'), +('9', '12', '22', '8567', '0', '0'), +('9', '12', '22', '10323', '0', '0'), +('9', '12', '22', '66166', '0', '0'), +('9', '12', '22', '10664', '0', '0'), +('9', '12', '1', '30361', '1140', '0'), +('9', '12', '1', '14701', '362', '0'), +('9', '12', '1', '10165', '313', '0'), +('9', '12', '1', '14658', '258', '0'), +('9', '12', '2', '10142', '1272', '0'), +('9', '12', '2', '4341', '1262', '0'), +('9', '12', '2', '30363', '1200', '0'), +('9', '12', '2', '3040', '1082', '0'), +('9', '12', '3', '14706', '990', '0'), +('9', '12', '3', '14705', '990', '0'), +('9', '12', '3', '27702', '807', '0'), +('9', '12', '3', '14695', '423', '0'), +('9', '12', '5', '30362', '1140', '0'), +('9', '12', '5', '14552', '884', '0'), +('9', '12', '5', '10147', '630', '0'), +('9', '12', '5', '14703', '550', '0'), +('9', '12', '8', '11621', '8325', '0'), +('9', '12', '8', '11551', '1505', '0'), +('9', '12', '8', '3403', '1171', '0'), +('9', '12', '8', '1409', '812', '0'), +('9', '12', '6', '1557', '5310', '0'), +('9', '12', '6', '3309', '517', '0'), +('9', '12', '6', '3165', '512', '0'), +('9', '12', '6', '4165', '362', '0'), +('9', '12', '17', '11623', '1935', '0'), +('9', '12', '17', '4832', '1366', '0'), +('9', '12', '17', '4902', '1107', '0'), +('9', '12', '17', '3164', '867', '0'), +('9', '12', '7', '4833', '725', '0'), +('9', '12', '7', '4411', '633', '0'), +('9', '12', '7', '10104', '284', '0'), +('9', '12', '7', '71303', '271', '0'), +('9', '12', '9', '27703', '1840', '0'), +('9', '12', '9', '4834', '920', '0'), +('9', '12', '9', '4904', '574', '0'), +('9', '12', '9', '13280', '493', '0'), +('9', '12', '15', '14707', '1050', '0'), +('9', '12', '15', '10366', '805', '0'), +('9', '12', '15', '30360', '600', '0'), +('9', '12', '15', '14679', '580', '0'), +('9', '12', '20', '11676', '8690', '0'), +('9', '12', '20', '11601', '7000', '0'), +('9', '12', '20', '2922', '4899', '0'), +('9', '12', '20', '1365', '4200', '0'), +('9', '12', '12', '11624', '1019', '0'), +('9', '12', '12', '20655', '752', '0'), +('9', '12', '12', '4905', '729', '0'), +('9', '12', '12', '4835', '679', '0'), +('9', '12', '18', '4412', '633', '0'), +('9', '12', '18', '4836', '448', '0'), +('9', '12', '18', '4906', '388', '0'), +('9', '12', '18', '2374', '266', '0'), +('9', '12', '19', '1534', '1276', '0'), +('9', '12', '19', '4837', '1024', '0'), +('9', '12', '19', '68239', '481', '0'), +('9', '12', '19', '4907', '392', '0'), +('9', '12', '13', '27704', '29976', '0'), +('9', '12', '13', '11557', '22155', '0'), +('9', '12', '13', '7257', '21751', '0'), +('9', '12', '13', '6692', '21631', '0'), +('9', '12', '14', '7257', '23041', '0'), +('9', '12', '14', '11557', '22800', '0'), +('9', '12', '14', '11661', '22080', '0'), +('9', '12', '14', '6692', '21631', '0'), +('9', '12', '11', '8325', '14120', '0'), +('9', '12', '11', '8408', '14050', '0'), +('9', '12', '11', '8811', '11040', '0'), +('9', '12', '11', '8810', '10160', '0'), +('9', '13', '22', '8567', '0', '0'), +('9', '13', '22', '10323', '0', '0'), +('9', '13', '22', '66166', '0', '0'), +('9', '13', '22', '10664', '0', '0'), +('9', '13', '1', '30361', '1140', '0'), +('9', '13', '1', '14701', '362', '0'), +('9', '13', '1', '10165', '313', '0'), +('9', '13', '1', '14658', '258', '0'), +('9', '13', '2', '10142', '1272', '0'), +('9', '13', '2', '4341', '1262', '0'), +('9', '13', '2', '30363', '1200', '0'), +('9', '13', '2', '3040', '1082', '0'), +('9', '13', '3', '14706', '990', '0'), +('9', '13', '3', '14705', '990', '0'), +('9', '13', '3', '27702', '807', '0'), +('9', '13', '3', '14695', '423', '0'), +('9', '13', '5', '30362', '1140', '0'), +('9', '13', '5', '14552', '884', '0'), +('9', '13', '5', '10147', '630', '0'), +('9', '13', '5', '14703', '550', '0'), +('9', '13', '8', '11621', '8325', '0'), +('9', '13', '8', '11551', '1505', '0'), +('9', '13', '8', '3403', '1171', '0'), +('9', '13', '8', '1409', '812', '0'), +('9', '13', '6', '1557', '5310', '0'), +('9', '13', '6', '3309', '517', '0'), +('9', '13', '6', '3165', '512', '0'), +('9', '13', '6', '4165', '362', '0'), +('9', '13', '17', '11623', '1935', '0'), +('9', '13', '17', '4832', '1371', '0'), +('9', '13', '17', '4902', '1107', '0'), +('9', '13', '17', '3164', '867', '0'), +('9', '13', '7', '4833', '725', '0'), +('9', '13', '7', '4411', '633', '0'), +('9', '13', '7', '10104', '284', '0'), +('9', '13', '7', '71303', '271', '0'), +('9', '13', '9', '27703', '1840', '0'), +('9', '13', '9', '4834', '920', '0'), +('9', '13', '9', '4904', '574', '0'), +('9', '13', '9', '13280', '493', '0'), +('9', '13', '15', '14707', '1050', '0'), +('9', '13', '15', '10366', '805', '0'), +('9', '13', '15', '30360', '600', '0'), +('9', '13', '15', '14679', '580', '0'), +('9', '13', '20', '11676', '8690', '0'), +('9', '13', '20', '11601', '7003', '0'), +('9', '13', '20', '2922', '4899', '0'), +('9', '13', '20', '1365', '4200', '0'), +('9', '13', '12', '11624', '1022', '0'), +('9', '13', '12', '20655', '752', '0'), +('9', '13', '12', '4905', '729', '0'), +('9', '13', '12', '4835', '681', '0'), +('9', '13', '18', '4412', '633', '0'), +('9', '13', '18', '4836', '450', '0'), +('9', '13', '18', '4906', '388', '0'), +('9', '13', '18', '2374', '266', '0'), +('9', '13', '19', '1534', '1276', '0'), +('9', '13', '19', '4837', '1024', '0'), +('9', '13', '19', '68239', '481', '0'), +('9', '13', '19', '4907', '392', '0'), +('9', '13', '13', '27704', '30455', '0'), +('9', '13', '13', '11557', '22515', '0'), +('9', '13', '13', '7257', '22268', '0'), +('9', '13', '13', '11661', '21673', '0'), +('9', '13', '14', '7257', '23041', '0'), +('9', '13', '14', '11557', '22800', '0'), +('9', '13', '14', '11661', '22080', '0'), +('9', '13', '14', '6692', '21631', '0'), +('9', '13', '11', '8325', '14120', '0'), +('9', '13', '11', '8408', '14050', '0'), +('9', '13', '11', '8811', '11040', '0'), +('9', '13', '11', '8810', '10160', '0'), +('9', '14', '22', '8567', '0', '0'), +('9', '14', '22', '10323', '0', '0'), +('9', '14', '22', '66166', '0', '0'), +('9', '14', '22', '10664', '0', '0'), +('9', '14', '1', '30361', '1140', '0'), +('9', '14', '1', '14701', '362', '0'), +('9', '14', '1', '10165', '313', '0'), +('9', '14', '1', '14658', '258', '0'), +('9', '14', '2', '10142', '1272', '0'), +('9', '14', '2', '4341', '1262', '0'), +('9', '14', '2', '30363', '1200', '0'), +('9', '14', '2', '3040', '1082', '0'), +('9', '14', '3', '14706', '990', '0'), +('9', '14', '3', '14705', '990', '0'), +('9', '14', '3', '27702', '807', '0'), +('9', '14', '3', '14695', '423', '0'), +('9', '14', '5', '30362', '1140', '0'), +('9', '14', '5', '14552', '884', '0'), +('9', '14', '5', '10147', '630', '0'), +('9', '14', '5', '14703', '550', '0'), +('9', '14', '8', '11621', '8325', '0'), +('9', '14', '8', '11551', '1505', '0'), +('9', '14', '8', '3403', '1171', '0'), +('9', '14', '8', '1409', '812', '0'), +('9', '14', '6', '1557', '5310', '0'), +('9', '14', '6', '3309', '517', '0'), +('9', '14', '6', '3165', '512', '0'), +('9', '14', '6', '4165', '362', '0'), +('9', '14', '17', '11623', '1935', '0'), +('9', '14', '17', '4832', '1377', '0'), +('9', '14', '17', '4902', '1107', '0'), +('9', '14', '17', '3164', '867', '0'), +('9', '14', '7', '4833', '725', '0'), +('9', '14', '7', '4411', '633', '0'), +('9', '14', '7', '10104', '284', '0'), +('9', '14', '7', '71303', '271', '0'), +('9', '14', '9', '27703', '1840', '0'), +('9', '14', '9', '4834', '920', '0'), +('9', '14', '9', '4904', '574', '0'), +('9', '14', '9', '13280', '493', '0'), +('9', '14', '15', '14707', '1050', '0'), +('9', '14', '15', '10366', '805', '0'), +('9', '14', '15', '30360', '600', '0'), +('9', '14', '15', '14679', '580', '0'), +('9', '14', '20', '11676', '8690', '0'), +('9', '14', '20', '11601', '7008', '0'), +('9', '14', '20', '2922', '4899', '0'), +('9', '14', '20', '1365', '4200', '0'), +('9', '14', '12', '11624', '1025', '0'), +('9', '14', '12', '20655', '753', '0'), +('9', '14', '12', '4905', '729', '0'), +('9', '14', '12', '4835', '683', '0'), +('9', '14', '18', '4412', '633', '0'), +('9', '14', '18', '4836', '452', '0'), +('9', '14', '18', '4906', '388', '0'), +('9', '14', '18', '2374', '266', '0'), +('9', '14', '19', '1534', '1276', '0'), +('9', '14', '19', '4837', '1024', '0'), +('9', '14', '19', '68239', '481', '0'), +('9', '14', '19', '4907', '392', '0'), +('9', '14', '13', '27704', '30941', '0'), +('9', '14', '13', '11557', '22882', '0'), +('9', '14', '13', '7257', '22795', '0'), +('9', '14', '13', '11661', '22080', '0'), +('9', '14', '14', '7257', '23041', '0'), +('9', '14', '14', '11557', '22800', '0'), +('9', '14', '14', '11661', '22080', '0'), +('9', '14', '14', '6692', '21631', '0'), +('9', '14', '11', '8325', '14120', '0'), +('9', '14', '11', '8408', '14050', '0'), +('9', '14', '11', '8811', '11040', '0'), +('9', '14', '11', '8810', '10160', '0'), +('9', '15', '22', '8567', '0', '0'), +('9', '15', '22', '10323', '0', '0'), +('9', '15', '22', '66166', '0', '0'), +('9', '15', '22', '10664', '0', '0'), +('9', '15', '1', '30361', '1140', '0'), +('9', '15', '1', '14701', '362', '0'), +('9', '15', '1', '10165', '313', '0'), +('9', '15', '1', '14658', '258', '0'), +('9', '15', '2', '10142', '1272', '0'), +('9', '15', '2', '4341', '1262', '0'), +('9', '15', '2', '30363', '1200', '0'), +('9', '15', '2', '3040', '1082', '0'), +('9', '15', '3', '14706', '990', '0'), +('9', '15', '3', '14705', '990', '0'), +('9', '15', '3', '27702', '807', '0'), +('9', '15', '3', '14695', '423', '0'), +('9', '15', '5', '30362', '1140', '0'), +('9', '15', '5', '14552', '884', '0'), +('9', '15', '5', '10147', '630', '0'), +('9', '15', '5', '14703', '550', '0'), +('9', '15', '8', '11621', '8325', '0'), +('9', '15', '8', '11551', '1505', '0'), +('9', '15', '8', '3403', '1171', '0'), +('9', '15', '8', '1409', '812', '0'), +('9', '15', '6', '1557', '5310', '0'), +('9', '15', '6', '3309', '517', '0'), +('9', '15', '6', '3165', '512', '0'), +('9', '15', '6', '4165', '362', '0'), +('9', '15', '17', '11623', '1935', '0'), +('9', '15', '17', '4832', '1383', '0'), +('9', '15', '17', '4902', '1107', '0'), +('9', '15', '17', '3164', '867', '0'), +('9', '15', '7', '4833', '725', '0'), +('9', '15', '7', '4411', '633', '0'), +('9', '15', '7', '10104', '284', '0'), +('9', '15', '7', '71303', '271', '0'), +('9', '15', '9', '27703', '1840', '0'), +('9', '15', '9', '4834', '920', '0'), +('9', '15', '9', '4904', '574', '0'), +('9', '15', '9', '13280', '493', '0'), +('9', '15', '15', '14707', '1050', '0'), +('9', '15', '15', '10366', '805', '0'), +('9', '15', '15', '30360', '600', '0'), +('9', '15', '15', '14679', '580', '0'), +('9', '15', '20', '11676', '8690', '0'), +('9', '15', '20', '11601', '7011', '0'), +('9', '15', '20', '2922', '4899', '0'), +('9', '15', '20', '1365', '4200', '0'), +('9', '15', '12', '11624', '1027', '0'), +('9', '15', '12', '20655', '754', '0'), +('9', '15', '12', '4905', '729', '0'), +('9', '15', '12', '4835', '685', '0'), +('9', '15', '18', '4412', '633', '0'), +('9', '15', '18', '4836', '454', '0'), +('9', '15', '18', '4906', '388', '0'), +('9', '15', '18', '2374', '266', '0'), +('9', '15', '19', '1534', '1276', '0'), +('9', '15', '19', '4837', '1024', '0'), +('9', '15', '19', '68239', '481', '0'), +('9', '15', '19', '4907', '392', '0'), +('9', '15', '13', '27704', '31437', '0'), +('9', '15', '13', '7257', '23331', '0'), +('9', '15', '13', '11557', '23255', '0'), +('9', '15', '13', '11661', '22494', '0'), +('9', '15', '14', '7257', '23041', '0'), +('9', '15', '14', '11557', '22800', '0'), +('9', '15', '14', '11661', '22080', '0'), +('9', '15', '14', '6692', '21631', '0'), +('9', '15', '11', '8325', '14120', '0'), +('9', '15', '11', '8408', '14050', '0'), +('9', '15', '11', '8811', '11040', '0'), +('9', '15', '11', '8810', '10160', '0'), +('9', '16', '22', '8567', '0', '0'), +('9', '16', '22', '10323', '0', '0'), +('9', '16', '22', '66166', '0', '0'), +('9', '16', '22', '10664', '0', '0'), +('9', '16', '1', '30361', '1140', '0'), +('9', '16', '1', '14701', '362', '0'), +('9', '16', '1', '10165', '313', '0'), +('9', '16', '1', '14658', '258', '0'), +('9', '16', '2', '10142', '1272', '0'), +('9', '16', '2', '4341', '1262', '0'), +('9', '16', '2', '30363', '1200', '0'), +('9', '16', '2', '3040', '1082', '0'), +('9', '16', '3', '14706', '990', '0'), +('9', '16', '3', '14705', '990', '0'), +('9', '16', '3', '27702', '807', '0'), +('9', '16', '3', '14695', '423', '0'), +('9', '16', '5', '30362', '1140', '0'), +('9', '16', '5', '14552', '884', '0'), +('9', '16', '5', '10147', '630', '0'), +('9', '16', '5', '14703', '550', '0'), +('9', '16', '8', '11621', '8325', '0'), +('9', '16', '8', '11551', '1505', '0'), +('9', '16', '8', '3403', '1171', '0'), +('9', '16', '8', '1409', '812', '0'), +('9', '16', '6', '1557', '5310', '0'), +('9', '16', '6', '3309', '517', '0'), +('9', '16', '6', '3165', '512', '0'), +('9', '16', '6', '4165', '362', '0'), +('9', '16', '17', '11623', '1935', '0'), +('9', '16', '17', '4832', '1388', '0'), +('9', '16', '17', '4902', '1107', '0'), +('9', '16', '17', '3164', '867', '0'), +('9', '16', '7', '4833', '725', '0'), +('9', '16', '7', '4411', '633', '0'), +('9', '16', '7', '10104', '284', '0'), +('9', '16', '7', '71303', '271', '0'), +('9', '16', '9', '27703', '1840', '0'), +('9', '16', '9', '4834', '920', '0'), +('9', '16', '9', '4904', '574', '0'), +('9', '16', '9', '13280', '493', '0'), +('9', '16', '15', '14707', '1050', '0'), +('9', '16', '15', '10366', '805', '0'), +('9', '16', '15', '30360', '600', '0'), +('9', '16', '15', '14679', '580', '0'), +('9', '16', '20', '11676', '8690', '0'), +('9', '16', '20', '11601', '7015', '0'), +('9', '16', '20', '2922', '4899', '0'), +('9', '16', '20', '1365', '4200', '0'), +('9', '16', '12', '11624', '1030', '0'), +('9', '16', '12', '20655', '755', '0'), +('9', '16', '12', '4905', '729', '0'), +('9', '16', '12', '4835', '687', '0'), +('9', '16', '18', '4412', '633', '0'), +('9', '16', '18', '4836', '456', '0'), +('9', '16', '18', '4906', '388', '0'), +('9', '16', '18', '2374', '266', '0'), +('9', '16', '19', '1534', '1276', '0'), +('9', '16', '19', '4837', '1024', '0'), +('9', '16', '19', '68239', '481', '0'), +('9', '16', '19', '4907', '392', '0'), +('9', '16', '13', '27704', '31941', '0'), +('9', '16', '13', '7257', '23876', '0'), +('9', '16', '13', '11557', '23635', '0'), +('9', '16', '13', '11661', '22915', '0'), +('9', '16', '14', '7257', '23041', '0'), +('9', '16', '14', '11557', '22800', '0'), +('9', '16', '14', '11661', '22080', '0'), +('9', '16', '14', '6692', '21631', '0'), +('9', '16', '11', '8325', '14120', '0'), +('9', '16', '11', '8408', '14050', '0'), +('9', '16', '11', '8811', '11040', '0'), +('9', '16', '11', '8810', '10160', '0'), +('9', '17', '22', '8567', '0', '0'), +('9', '17', '22', '10323', '0', '0'), +('9', '17', '22', '66166', '0', '0'), +('9', '17', '22', '10664', '0', '0'), +('9', '17', '1', '30361', '1140', '0'), +('9', '17', '1', '14701', '362', '0'), +('9', '17', '1', '10165', '313', '0'), +('9', '17', '1', '14658', '258', '0'), +('9', '17', '2', '10142', '1272', '0'), +('9', '17', '2', '4341', '1262', '0'), +('9', '17', '2', '30363', '1200', '0'), +('9', '17', '2', '3040', '1082', '0'), +('9', '17', '3', '14706', '990', '0'), +('9', '17', '3', '14705', '990', '0'), +('9', '17', '3', '27702', '807', '0'), +('9', '17', '3', '14695', '423', '0'), +('9', '17', '5', '30362', '1140', '0'), +('9', '17', '5', '14552', '884', '0'), +('9', '17', '5', '10147', '630', '0'), +('9', '17', '5', '14703', '550', '0'), +('9', '17', '8', '11621', '8325', '0'), +('9', '17', '8', '11551', '1505', '0'), +('9', '17', '8', '3403', '1171', '0'), +('9', '17', '8', '1409', '812', '0'), +('9', '17', '6', '1557', '5310', '0'), +('9', '17', '6', '3309', '517', '0'), +('9', '17', '6', '3165', '512', '0'), +('9', '17', '6', '4165', '362', '0'), +('9', '17', '17', '11623', '1935', '0'), +('9', '17', '17', '4832', '1395', '0'), +('9', '17', '17', '4902', '1107', '0'), +('9', '17', '17', '3164', '867', '0'), +('9', '17', '7', '4833', '725', '0'), +('9', '17', '7', '4411', '633', '0'), +('9', '17', '7', '10104', '284', '0'), +('9', '17', '7', '71303', '271', '0'), +('9', '17', '9', '27703', '1840', '0'), +('9', '17', '9', '4834', '920', '0'), +('9', '17', '9', '4904', '574', '0'), +('9', '17', '9', '13280', '493', '0'), +('9', '17', '15', '14707', '1050', '0'), +('9', '17', '15', '10366', '805', '0'), +('9', '17', '15', '30360', '600', '0'), +('9', '17', '15', '14679', '580', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '17', '20', '11676', '8690', '0'), +('9', '17', '20', '11601', '7019', '0'), +('9', '17', '20', '2922', '4899', '0'), +('9', '17', '20', '1365', '4200', '0'), +('9', '17', '12', '11624', '1033', '0'), +('9', '17', '12', '20655', '756', '0'), +('9', '17', '12', '4905', '729', '0'), +('9', '17', '12', '4835', '689', '0'), +('9', '17', '18', '4412', '633', '0'), +('9', '17', '18', '4836', '458', '0'), +('9', '17', '18', '4906', '388', '0'), +('9', '17', '18', '2374', '266', '0'), +('9', '17', '19', '1534', '1276', '0'), +('9', '17', '19', '4837', '1024', '0'), +('9', '17', '19', '68239', '481', '0'), +('9', '17', '19', '4907', '392', '0'), +('9', '17', '13', '27704', '32453', '0'), +('9', '17', '13', '7257', '24431', '0'), +('9', '17', '13', '11557', '24021', '0'), +('9', '17', '13', '11661', '23344', '0'), +('9', '17', '14', '7257', '23041', '0'), +('9', '17', '14', '11557', '22800', '0'), +('9', '17', '14', '11661', '22080', '0'), +('9', '17', '14', '6692', '21631', '0'), +('9', '17', '11', '8325', '14120', '0'), +('9', '17', '11', '8408', '14050', '0'), +('9', '17', '11', '8811', '11040', '0'), +('9', '17', '11', '8810', '10160', '0'), +('9', '18', '22', '8567', '0', '0'), +('9', '18', '22', '10323', '0', '0'), +('9', '18', '22', '66166', '0', '0'), +('9', '18', '22', '10664', '0', '0'), +('9', '18', '1', '30361', '1140', '0'), +('9', '18', '1', '14701', '362', '0'), +('9', '18', '1', '10165', '313', '0'), +('9', '18', '1', '14658', '258', '0'), +('9', '18', '2', '10142', '1272', '0'), +('9', '18', '2', '4341', '1262', '0'), +('9', '18', '2', '30363', '1200', '0'), +('9', '18', '2', '3040', '1082', '0'), +('9', '18', '3', '14706', '990', '0'), +('9', '18', '3', '14705', '990', '0'), +('9', '18', '3', '27702', '807', '0'), +('9', '18', '3', '14695', '423', '0'), +('9', '18', '5', '30362', '1140', '0'), +('9', '18', '5', '14552', '884', '0'), +('9', '18', '5', '10147', '630', '0'), +('9', '18', '5', '14703', '550', '0'), +('9', '18', '8', '11621', '8325', '0'), +('9', '18', '8', '11551', '1505', '0'), +('9', '18', '8', '3403', '1171', '0'), +('9', '18', '8', '1409', '812', '0'), +('9', '18', '6', '1557', '5310', '0'), +('9', '18', '6', '3309', '517', '0'), +('9', '18', '6', '3165', '512', '0'), +('9', '18', '6', '4165', '362', '0'), +('9', '18', '17', '11623', '1935', '0'), +('9', '18', '17', '4832', '1400', '0'), +('9', '18', '17', '4902', '1107', '0'), +('9', '18', '17', '3164', '867', '0'), +('9', '18', '7', '4833', '725', '0'), +('9', '18', '7', '4411', '633', '0'), +('9', '18', '7', '10104', '284', '0'), +('9', '18', '7', '71303', '271', '0'), +('9', '18', '9', '27703', '1840', '0'), +('9', '18', '9', '4834', '920', '0'), +('9', '18', '9', '4904', '574', '0'), +('9', '18', '9', '13280', '493', '0'), +('9', '18', '15', '14707', '1050', '0'), +('9', '18', '15', '10366', '805', '0'), +('9', '18', '15', '30360', '600', '0'), +('9', '18', '15', '14679', '580', '0'), +('9', '18', '20', '11676', '8690', '0'), +('9', '18', '20', '11601', '7023', '0'), +('9', '18', '20', '2922', '4899', '0'), +('9', '18', '20', '1365', '4200', '0'), +('9', '18', '12', '11624', '1035', '0'), +('9', '18', '12', '20655', '756', '0'), +('9', '18', '12', '4905', '729', '0'), +('9', '18', '12', '4835', '691', '0'), +('9', '18', '18', '4412', '633', '0'), +('9', '18', '18', '4836', '460', '0'), +('9', '18', '18', '4906', '388', '0'), +('9', '18', '18', '2374', '266', '0'), +('9', '18', '19', '1534', '1276', '0'), +('9', '18', '19', '4837', '1024', '0'), +('9', '18', '19', '68239', '481', '0'), +('9', '18', '19', '4907', '392', '0'), +('9', '18', '13', '27704', '32975', '0'), +('9', '18', '13', '7257', '24995', '0'), +('9', '18', '13', '11557', '24414', '0'), +('9', '18', '13', '11661', '23779', '0'), +('9', '18', '14', '7257', '23041', '0'), +('9', '18', '14', '11557', '22800', '0'), +('9', '18', '14', '11661', '22080', '0'), +('9', '18', '14', '6692', '21631', '0'), +('9', '18', '11', '8325', '14120', '0'), +('9', '18', '11', '8408', '14050', '0'), +('9', '18', '11', '8811', '11040', '0'), +('9', '18', '11', '8810', '10160', '0'), +('9', '19', '22', '8567', '0', '0'), +('9', '19', '22', '10323', '0', '0'), +('9', '19', '22', '66166', '0', '0'), +('9', '19', '22', '10664', '0', '0'), +('9', '19', '1', '30361', '1140', '0'), +('9', '19', '1', '14701', '362', '0'), +('9', '19', '1', '10165', '313', '0'), +('9', '19', '1', '14658', '258', '0'), +('9', '19', '2', '10142', '1272', '0'), +('9', '19', '2', '4341', '1262', '0'), +('9', '19', '2', '30363', '1200', '0'), +('9', '19', '2', '3040', '1082', '0'), +('9', '19', '3', '14706', '990', '0'), +('9', '19', '3', '14705', '990', '0'), +('9', '19', '3', '27702', '807', '0'), +('9', '19', '3', '14695', '423', '0'), +('9', '19', '5', '30362', '1140', '0'), +('9', '19', '5', '14552', '884', '0'), +('9', '19', '5', '10147', '630', '0'), +('9', '19', '5', '14703', '550', '0'), +('9', '19', '8', '11621', '8325', '0'), +('9', '19', '8', '11551', '1505', '0'), +('9', '19', '8', '3403', '1171', '0'), +('9', '19', '8', '1409', '812', '0'), +('9', '19', '6', '1557', '5310', '0'), +('9', '19', '6', '3309', '517', '0'), +('9', '19', '6', '3165', '512', '0'), +('9', '19', '6', '4165', '362', '0'), +('9', '19', '17', '11623', '1935', '0'), +('9', '19', '17', '4832', '1406', '0'), +('9', '19', '17', '4902', '1107', '0'), +('9', '19', '17', '3164', '867', '0'), +('9', '19', '7', '4833', '725', '0'), +('9', '19', '7', '4411', '633', '0'), +('9', '19', '7', '10104', '284', '0'), +('9', '19', '7', '71303', '271', '0'), +('9', '19', '9', '27703', '1840', '0'), +('9', '19', '9', '4834', '920', '0'), +('9', '19', '9', '4904', '574', '0'), +('9', '19', '9', '13280', '493', '0'), +('9', '19', '15', '14707', '1050', '0'), +('9', '19', '15', '10366', '805', '0'), +('9', '19', '15', '30360', '600', '0'), +('9', '19', '15', '14679', '580', '0'), +('9', '19', '20', '11676', '8690', '0'), +('9', '19', '20', '11601', '7027', '0'), +('9', '19', '20', '2922', '4899', '0'), +('9', '19', '20', '1365', '4200', '0'), +('9', '19', '12', '11624', '1038', '0'), +('9', '19', '12', '20655', '757', '0'), +('9', '19', '12', '4905', '729', '0'), +('9', '19', '12', '4835', '693', '0'), +('9', '19', '18', '4412', '633', '0'), +('9', '19', '18', '4836', '462', '0'), +('9', '19', '18', '4906', '388', '0'), +('9', '19', '18', '2374', '266', '0'), +('9', '19', '19', '1534', '1276', '0'), +('9', '19', '19', '4837', '1024', '0'), +('9', '19', '19', '68239', '481', '0'), +('9', '19', '19', '4907', '392', '0'), +('9', '19', '13', '27704', '33504', '0'), +('9', '19', '13', '7257', '25569', '0'), +('9', '19', '13', '11557', '24813', '0'), +('9', '19', '13', '11661', '24222', '0'), +('9', '19', '14', '7257', '23041', '0'), +('9', '19', '14', '11557', '22800', '0'), +('9', '19', '14', '11661', '22080', '0'), +('9', '19', '14', '6692', '21631', '0'), +('9', '19', '11', '8325', '14120', '0'), +('9', '19', '11', '8408', '14050', '0'), +('9', '19', '11', '8811', '11040', '0'), +('9', '19', '11', '8810', '10160', '0'), +('9', '20', '22', '8567', '0', '0'), +('9', '20', '22', '10323', '0', '0'), +('9', '20', '22', '66166', '0', '0'), +('9', '20', '22', '10664', '0', '0'), +('9', '20', '1', '30361', '1140', '0'), +('9', '20', '1', '14701', '362', '0'), +('9', '20', '1', '10165', '313', '0'), +('9', '20', '1', '14658', '258', '0'), +('9', '20', '2', '10142', '1272', '0'), +('9', '20', '2', '4341', '1262', '0'), +('9', '20', '2', '30363', '1200', '0'), +('9', '20', '2', '3040', '1082', '0'), +('9', '20', '3', '14706', '990', '0'), +('9', '20', '3', '14705', '990', '0'), +('9', '20', '3', '27702', '807', '0'), +('9', '20', '3', '14695', '423', '0'), +('9', '20', '5', '30362', '1140', '0'), +('9', '20', '5', '14552', '884', '0'), +('9', '20', '5', '10147', '630', '0'), +('9', '20', '5', '14703', '550', '0'), +('9', '20', '8', '11621', '8325', '0'), +('9', '20', '8', '11551', '1505', '0'), +('9', '20', '8', '3403', '1171', '0'), +('9', '20', '8', '1409', '812', '0'), +('9', '20', '6', '1557', '5310', '0'), +('9', '20', '6', '3309', '517', '0'), +('9', '20', '6', '3165', '512', '0'), +('9', '20', '6', '4165', '362', '0'), +('9', '20', '17', '11623', '1935', '0'), +('9', '20', '17', '4832', '1412', '0'), +('9', '20', '17', '4902', '1107', '0'), +('9', '20', '17', '3164', '867', '0'), +('9', '20', '7', '4833', '725', '0'), +('9', '20', '7', '4411', '633', '0'), +('9', '20', '7', '10104', '284', '0'), +('9', '20', '7', '71303', '271', '0'), +('9', '20', '9', '27703', '1840', '0'), +('9', '20', '9', '4834', '920', '0'), +('9', '20', '9', '4904', '574', '0'), +('9', '20', '9', '13280', '493', '0'), +('9', '20', '15', '14707', '1050', '0'), +('9', '20', '15', '10366', '805', '0'), +('9', '20', '15', '30360', '600', '0'), +('9', '20', '15', '14679', '580', '0'), +('9', '20', '20', '11676', '8690', '0'), +('9', '20', '20', '11601', '7031', '0'), +('9', '20', '20', '2922', '4899', '0'), +('9', '20', '20', '1365', '4200', '0'), +('9', '20', '12', '11624', '1041', '0'), +('9', '20', '12', '20655', '758', '0'), +('9', '20', '12', '4905', '729', '0'), +('9', '20', '12', '4835', '695', '0'), +('9', '20', '18', '4412', '633', '0'), +('9', '20', '18', '4836', '464', '0'), +('9', '20', '18', '4906', '388', '0'), +('9', '20', '18', '2374', '266', '0'), +('9', '20', '19', '1534', '1276', '0'), +('9', '20', '19', '4837', '1024', '0'), +('9', '20', '19', '68239', '481', '0'), +('9', '20', '19', '4907', '392', '0'), +('9', '20', '13', '27704', '34043', '0'), +('9', '20', '13', '7257', '26152', '0'), +('9', '20', '13', '6952', '25785', '0'), +('9', '20', '13', '11557', '25219', '0'), +('9', '20', '14', '6952', '25785', '0'), +('9', '20', '14', '7257', '23041', '0'), +('9', '20', '14', '11557', '22800', '0'), +('9', '20', '14', '11661', '22080', '0'), +('9', '20', '11', '8325', '14120', '0'), +('9', '20', '11', '8408', '14050', '0'), +('9', '20', '11', '8811', '11040', '0'), +('9', '20', '11', '8810', '10160', '0'), +('9', '21', '22', '8567', '0', '0'), +('9', '21', '22', '10323', '0', '0'), +('9', '21', '22', '66166', '0', '0'), +('9', '21', '22', '10664', '0', '0'), +('9', '21', '1', '30361', '1140', '0'), +('9', '21', '1', '14701', '362', '0'), +('9', '21', '1', '10165', '313', '0'), +('9', '21', '1', '14658', '258', '0'), +('9', '21', '2', '10142', '1272', '0'), +('9', '21', '2', '4341', '1262', '0'), +('9', '21', '2', '30363', '1200', '0'), +('9', '21', '2', '3040', '1082', '0'), +('9', '21', '3', '14706', '990', '0'), +('9', '21', '3', '14705', '990', '0'), +('9', '21', '3', '27702', '807', '0'), +('9', '21', '3', '14695', '423', '0'), +('9', '21', '5', '30362', '1140', '0'), +('9', '21', '5', '14552', '884', '0'), +('9', '21', '5', '10147', '630', '0'), +('9', '21', '5', '14703', '550', '0'), +('9', '21', '8', '11621', '8325', '0'), +('9', '21', '8', '11551', '1505', '0'), +('9', '21', '8', '3403', '1171', '0'), +('9', '21', '8', '1409', '812', '0'), +('9', '21', '6', '1557', '5310', '0'), +('9', '21', '6', '3309', '517', '0'), +('9', '21', '6', '3165', '512', '0'), +('9', '21', '6', '4165', '362', '0'), +('9', '21', '17', '11623', '1935', '0'), +('9', '21', '17', '4832', '1418', '0'), +('9', '21', '17', '4902', '1107', '0'), +('9', '21', '17', '3164', '867', '0'), +('9', '21', '7', '4833', '725', '0'), +('9', '21', '7', '4411', '633', '0'), +('9', '21', '7', '10104', '284', '0'), +('9', '21', '7', '71303', '271', '0'), +('9', '21', '9', '27703', '1840', '0'), +('9', '21', '9', '4834', '920', '0'), +('9', '21', '9', '4904', '574', '0'), +('9', '21', '9', '13280', '493', '0'), +('9', '21', '15', '14707', '1050', '0'), +('9', '21', '15', '10366', '805', '0'), +('9', '21', '15', '30360', '600', '0'), +('9', '21', '15', '14679', '580', '0'), +('9', '21', '20', '11676', '8690', '0'), +('9', '21', '20', '11601', '7035', '0'), +('9', '21', '20', '2922', '4899', '0'), +('9', '21', '20', '1365', '4200', '0'), +('9', '21', '12', '11624', '1044', '0'), +('9', '21', '12', '20655', '759', '0'), +('9', '21', '12', '4905', '729', '0'), +('9', '21', '12', '4835', '697', '0'), +('9', '21', '18', '4412', '633', '0'), +('9', '21', '18', '4836', '466', '0'), +('9', '21', '18', '4906', '388', '0'), +('9', '21', '18', '2374', '266', '0'), +('9', '21', '19', '1534', '1276', '0'), +('9', '21', '19', '4837', '1024', '0'), +('9', '21', '19', '68239', '481', '0'), +('9', '21', '19', '4907', '392', '0'), +('9', '21', '13', '27704', '34590', '0'), +('9', '21', '13', '7257', '26744', '0'), +('9', '21', '13', '6952', '25785', '0'), +('9', '21', '13', '11557', '25631', '0'), +('9', '21', '14', '6952', '25785', '0'), +('9', '21', '14', '7257', '23041', '0'), +('9', '21', '14', '11557', '22800', '0'), +('9', '21', '14', '11661', '22080', '0'), +('9', '21', '11', '8325', '14120', '0'), +('9', '21', '11', '8408', '14050', '0'), +('9', '21', '11', '8811', '11040', '0'), +('9', '21', '11', '8810', '10160', '0'), +('9', '22', '22', '8567', '0', '0'), +('9', '22', '22', '10323', '0', '0'), +('9', '22', '22', '66166', '0', '0'), +('9', '22', '22', '10664', '0', '0'), +('9', '22', '1', '30361', '1140', '0'), +('9', '22', '1', '14701', '362', '0'), +('9', '22', '1', '10165', '313', '0'), +('9', '22', '1', '14658', '258', '0'), +('9', '22', '2', '10142', '1272', '0'), +('9', '22', '2', '4341', '1262', '0'), +('9', '22', '2', '30363', '1200', '0'), +('9', '22', '2', '3040', '1082', '0'), +('9', '22', '3', '14706', '990', '0'), +('9', '22', '3', '14705', '990', '0'), +('9', '22', '3', '27702', '807', '0'), +('9', '22', '3', '14695', '423', '0'), +('9', '22', '5', '30362', '1140', '0'), +('9', '22', '5', '14552', '884', '0'), +('9', '22', '5', '10147', '630', '0'), +('9', '22', '5', '14703', '550', '0'), +('9', '22', '8', '11621', '8325', '0'), +('9', '22', '8', '11551', '1505', '0'), +('9', '22', '8', '3403', '1171', '0'), +('9', '22', '8', '1409', '812', '0'), +('9', '22', '6', '1557', '5310', '0'), +('9', '22', '6', '3309', '517', '0'), +('9', '22', '6', '3165', '512', '0'), +('9', '22', '6', '4165', '362', '0'), +('9', '22', '17', '11623', '1935', '0'), +('9', '22', '17', '4832', '1424', '0'), +('9', '22', '17', '4902', '1107', '0'), +('9', '22', '17', '3164', '867', '0'), +('9', '22', '7', '4833', '725', '0'), +('9', '22', '7', '4411', '633', '0'), +('9', '22', '7', '10104', '284', '0'), +('9', '22', '7', '71303', '271', '0'), +('9', '22', '9', '27703', '1840', '0'), +('9', '22', '9', '4834', '920', '0'), +('9', '22', '9', '4904', '574', '0'), +('9', '22', '9', '13280', '493', '0'), +('9', '22', '15', '14707', '1050', '0'), +('9', '22', '15', '10366', '805', '0'), +('9', '22', '15', '30360', '600', '0'), +('9', '22', '15', '14679', '580', '0'), +('9', '22', '20', '11676', '8690', '0'), +('9', '22', '20', '11601', '7038', '0'), +('9', '22', '20', '2922', '4899', '0'), +('9', '22', '20', '1365', '4200', '0'), +('9', '22', '12', '11624', '1046', '0'), +('9', '22', '12', '20655', '759', '0'), +('9', '22', '12', '4905', '729', '0'), +('9', '22', '12', '4835', '699', '0'), +('9', '22', '18', '4412', '633', '0'), +('9', '22', '18', '4836', '467', '0'), +('9', '22', '18', '4906', '388', '0'), +('9', '22', '18', '2374', '266', '0'), +('9', '22', '19', '1534', '1276', '0'), +('9', '22', '19', '4837', '1024', '0'), +('9', '22', '19', '68239', '481', '0'), +('9', '22', '19', '4907', '392', '0'), +('9', '22', '13', '27704', '35146', '0'), +('9', '22', '13', '7257', '27345', '0'), +('9', '22', '13', '11557', '26050', '0'), +('9', '22', '13', '6952', '25785', '0'), +('9', '22', '14', '6952', '25785', '0'), +('9', '22', '14', '7257', '23041', '0'), +('9', '22', '14', '11557', '22800', '0'), +('9', '22', '14', '11661', '22080', '0'), +('9', '22', '11', '8325', '14120', '0'), +('9', '22', '11', '8408', '14050', '0'), +('9', '22', '11', '8811', '11040', '0'), +('9', '22', '11', '8810', '10160', '0'), +('9', '23', '22', '8567', '0', '0'), +('9', '23', '22', '10323', '0', '0'), +('9', '23', '22', '66166', '0', '0'), +('9', '23', '22', '10664', '0', '0'), +('9', '23', '1', '30361', '1140', '0'), +('9', '23', '1', '14701', '362', '0'), +('9', '23', '1', '10165', '313', '0'), +('9', '23', '1', '14658', '258', '0'), +('9', '23', '2', '10142', '1272', '0'), +('9', '23', '2', '4341', '1262', '0'), +('9', '23', '2', '30363', '1200', '0'), +('9', '23', '2', '3040', '1082', '0'), +('9', '23', '3', '14706', '990', '0'), +('9', '23', '3', '14705', '990', '0'), +('9', '23', '3', '27702', '807', '0'), +('9', '23', '3', '14695', '423', '0'), +('9', '23', '5', '30362', '1140', '0'), +('9', '23', '5', '14552', '884', '0'), +('9', '23', '5', '10147', '630', '0'), +('9', '23', '5', '14703', '550', '0'), +('9', '23', '8', '11621', '8325', '0'), +('9', '23', '8', '11551', '1505', '0'), +('9', '23', '8', '3403', '1171', '0'), +('9', '23', '8', '1409', '812', '0'), +('9', '23', '6', '1557', '5310', '0'), +('9', '23', '6', '3309', '517', '0'), +('9', '23', '6', '3165', '512', '0'), +('9', '23', '6', '4165', '362', '0'), +('9', '23', '17', '11623', '1935', '0'), +('9', '23', '17', '4832', '1430', '0'), +('9', '23', '17', '4902', '1107', '0'), +('9', '23', '17', '3164', '867', '0'), +('9', '23', '7', '4833', '725', '0'), +('9', '23', '7', '4411', '633', '0'), +('9', '23', '7', '10104', '284', '0'), +('9', '23', '7', '71303', '271', '0'), +('9', '23', '9', '27703', '1840', '0'), +('9', '23', '9', '4834', '920', '0'), +('9', '23', '9', '4904', '574', '0'), +('9', '23', '9', '13280', '493', '0'), +('9', '23', '15', '14707', '1050', '0'), +('9', '23', '15', '10366', '805', '0'), +('9', '23', '15', '30360', '600', '0'), +('9', '23', '15', '14679', '580', '0'), +('9', '23', '20', '11676', '8690', '0'), +('9', '23', '20', '11601', '7043', '0'), +('9', '23', '20', '2922', '4899', '0'), +('9', '23', '20', '1365', '4200', '0'), +('9', '23', '12', '11624', '1049', '0'), +('9', '23', '12', '20655', '760', '0'), +('9', '23', '12', '4905', '729', '0'), +('9', '23', '12', '4835', '701', '0'), +('9', '23', '18', '4412', '633', '0'), +('9', '23', '18', '4836', '470', '0'), +('9', '23', '18', '4906', '388', '0'), +('9', '23', '18', '3171', '266', '0'), +('9', '23', '19', '1534', '1276', '0'), +('9', '23', '19', '4837', '1024', '0'), +('9', '23', '19', '68239', '481', '0'), +('9', '23', '19', '4907', '392', '0'), +('9', '23', '13', '27704', '35711', '0'), +('9', '23', '13', '7257', '27956', '0'), +('9', '23', '13', '11557', '26475', '0'), +('9', '23', '13', '11661', '26065', '0'), +('9', '23', '14', '6952', '25785', '0'), +('9', '23', '14', '7257', '23041', '0'), +('9', '23', '14', '11557', '22800', '0'), +('9', '23', '14', '11661', '22080', '0'), +('9', '23', '11', '8325', '14120', '0'), +('9', '23', '11', '8408', '14050', '0'), +('9', '23', '11', '8811', '11040', '0'), +('9', '23', '11', '8810', '10160', '0'), +('9', '24', '22', '8567', '0', '0'), +('9', '24', '22', '10323', '0', '0'), +('9', '24', '22', '66166', '0', '0'), +('9', '24', '22', '10664', '0', '0'), +('9', '24', '1', '30361', '1140', '0'), +('9', '24', '1', '14701', '362', '0'), +('9', '24', '1', '10165', '313', '0'), +('9', '24', '1', '14658', '258', '0'), +('9', '24', '2', '10142', '1272', '0'), +('9', '24', '2', '4341', '1262', '0'), +('9', '24', '2', '30363', '1200', '0'), +('9', '24', '2', '3040', '1082', '0'), +('9', '24', '3', '14706', '990', '0'), +('9', '24', '3', '14705', '990', '0'), +('9', '24', '3', '27702', '807', '0'), +('9', '24', '3', '14695', '423', '0'), +('9', '24', '5', '30362', '1140', '0'), +('9', '24', '5', '14552', '884', '0'), +('9', '24', '5', '10147', '630', '0'), +('9', '24', '5', '14703', '550', '0'), +('9', '24', '8', '11621', '8325', '0'), +('9', '24', '8', '11551', '1505', '0'), +('9', '24', '8', '3403', '1171', '0'), +('9', '24', '8', '1409', '812', '0'), +('9', '24', '6', '1557', '5310', '0'), +('9', '24', '6', '3309', '517', '0'), +('9', '24', '6', '3165', '512', '0'), +('9', '24', '6', '4165', '362', '0'), +('9', '24', '17', '11623', '1935', '0'), +('9', '24', '17', '4832', '1436', '0'), +('9', '24', '17', '4902', '1107', '0'), +('9', '24', '17', '3164', '867', '0'), +('9', '24', '7', '4833', '725', '0'), +('9', '24', '7', '4411', '633', '0'), +('9', '24', '7', '10104', '284', '0'), +('9', '24', '7', '71303', '271', '0'), +('9', '24', '9', '27703', '1840', '0'), +('9', '24', '9', '4834', '920', '0'), +('9', '24', '9', '4904', '574', '0'), +('9', '24', '9', '13280', '493', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '24', '15', '14707', '1050', '0'), +('9', '24', '15', '10366', '805', '0'), +('9', '24', '15', '30360', '600', '0'), +('9', '24', '15', '14679', '580', '0'), +('9', '24', '20', '11676', '8690', '0'), +('9', '24', '20', '11601', '7047', '0'), +('9', '24', '20', '2922', '4899', '0'), +('9', '24', '20', '1365', '4200', '0'), +('9', '24', '12', '11624', '1052', '0'), +('9', '24', '12', '20655', '761', '0'), +('9', '24', '12', '4905', '729', '0'), +('9', '24', '12', '4835', '703', '0'), +('9', '24', '18', '4412', '633', '0'), +('9', '24', '18', '4836', '472', '0'), +('9', '24', '18', '4906', '388', '0'), +('9', '24', '18', '3171', '268', '0'), +('9', '24', '19', '1534', '1276', '0'), +('9', '24', '19', '4837', '1024', '0'), +('9', '24', '19', '68239', '481', '0'), +('9', '24', '19', '4907', '392', '0'), +('9', '24', '13', '27704', '36284', '0'), +('9', '24', '13', '7257', '28577', '0'), +('9', '24', '13', '11557', '26907', '0'), +('9', '24', '13', '11661', '26544', '0'), +('9', '24', '14', '6952', '25785', '0'), +('9', '24', '14', '7257', '23041', '0'), +('9', '24', '14', '11557', '22800', '0'), +('9', '24', '14', '11661', '22080', '0'), +('9', '24', '11', '8325', '14120', '0'), +('9', '24', '11', '8408', '14050', '0'), +('9', '24', '11', '8811', '11040', '0'), +('9', '24', '11', '8810', '10160', '0'), +('9', '25', '22', '8567', '0', '0'), +('9', '25', '22', '10323', '0', '0'), +('9', '25', '22', '66166', '0', '0'), +('9', '25', '22', '10664', '0', '0'), +('9', '25', '1', '30361', '1140', '0'), +('9', '25', '1', '14701', '362', '0'), +('9', '25', '1', '10165', '313', '0'), +('9', '25', '1', '14658', '258', '0'), +('9', '25', '2', '10142', '1272', '0'), +('9', '25', '2', '4341', '1262', '0'), +('9', '25', '2', '30363', '1200', '0'), +('9', '25', '2', '3040', '1082', '0'), +('9', '25', '3', '14706', '990', '0'), +('9', '25', '3', '14705', '990', '0'), +('9', '25', '3', '27702', '807', '0'), +('9', '25', '3', '14695', '423', '0'), +('9', '25', '5', '30362', '1140', '0'), +('9', '25', '5', '14552', '884', '0'), +('9', '25', '5', '10147', '630', '0'), +('9', '25', '5', '14703', '550', '0'), +('9', '25', '8', '11621', '8325', '0'), +('9', '25', '8', '11551', '1505', '0'), +('9', '25', '8', '3403', '1171', '0'), +('9', '25', '8', '1409', '812', '0'), +('9', '25', '6', '1557', '5310', '0'), +('9', '25', '6', '3309', '517', '0'), +('9', '25', '6', '3165', '512', '0'), +('9', '25', '6', '4165', '362', '0'), +('9', '25', '17', '11623', '1935', '0'), +('9', '25', '17', '4832', '1442', '0'), +('9', '25', '17', '4902', '1107', '0'), +('9', '25', '17', '3164', '867', '0'), +('9', '25', '7', '4833', '725', '0'), +('9', '25', '7', '4411', '633', '0'), +('9', '25', '7', '10104', '284', '0'), +('9', '25', '7', '71303', '271', '0'), +('9', '25', '9', '27703', '1840', '0'), +('9', '25', '9', '4834', '920', '0'), +('9', '25', '9', '4904', '574', '0'), +('9', '25', '9', '13280', '493', '0'), +('9', '25', '15', '14707', '1050', '0'), +('9', '25', '15', '10366', '805', '0'), +('9', '25', '15', '30360', '600', '0'), +('9', '25', '15', '14679', '580', '0'), +('9', '25', '20', '11676', '8690', '0'), +('9', '25', '20', '11601', '7050', '0'), +('9', '25', '20', '2922', '4899', '0'), +('9', '25', '20', '1365', '4200', '0'), +('9', '25', '12', '11624', '1055', '0'), +('9', '25', '12', '20655', '762', '0'), +('9', '25', '12', '4905', '729', '0'), +('9', '25', '12', '4835', '705', '0'), +('9', '25', '18', '4412', '633', '0'), +('9', '25', '18', '4836', '474', '0'), +('9', '25', '18', '4906', '388', '0'), +('9', '25', '18', '3171', '270', '0'), +('9', '25', '19', '1534', '1276', '0'), +('9', '25', '19', '4837', '1024', '0'), +('9', '25', '19', '68239', '481', '0'), +('9', '25', '19', '4907', '392', '0'), +('9', '25', '13', '27704', '36865', '0'), +('9', '25', '13', '7257', '29206', '0'), +('9', '25', '13', '11557', '27345', '0'), +('9', '25', '13', '11661', '27030', '0'), +('9', '25', '14', '6952', '25785', '0'), +('9', '25', '14', '7257', '23041', '0'), +('9', '25', '14', '11557', '22800', '0'), +('9', '25', '14', '11661', '22080', '0'), +('9', '25', '11', '8325', '14120', '0'), +('9', '25', '11', '8408', '14050', '0'), +('9', '25', '11', '8811', '11040', '0'), +('9', '25', '11', '8810', '10160', '0'), +('9', '26', '22', '8567', '0', '0'), +('9', '26', '22', '10323', '0', '0'), +('9', '26', '22', '66166', '0', '0'), +('9', '26', '22', '10664', '0', '0'), +('9', '26', '1', '30361', '1140', '0'), +('9', '26', '1', '14701', '362', '0'), +('9', '26', '1', '10165', '313', '0'), +('9', '26', '1', '14658', '258', '0'), +('9', '26', '2', '10142', '1272', '0'), +('9', '26', '2', '4341', '1262', '0'), +('9', '26', '2', '30363', '1200', '0'), +('9', '26', '2', '3040', '1082', '0'), +('9', '26', '3', '14706', '990', '0'), +('9', '26', '3', '14705', '990', '0'), +('9', '26', '3', '27702', '807', '0'), +('9', '26', '3', '14695', '423', '0'), +('9', '26', '5', '30362', '1140', '0'), +('9', '26', '5', '14552', '884', '0'), +('9', '26', '5', '10147', '630', '0'), +('9', '26', '5', '14703', '550', '0'), +('9', '26', '8', '11621', '8325', '0'), +('9', '26', '8', '11551', '1505', '0'), +('9', '26', '8', '3403', '1171', '0'), +('9', '26', '8', '1409', '812', '0'), +('9', '26', '6', '1557', '5310', '0'), +('9', '26', '6', '3309', '517', '0'), +('9', '26', '6', '3165', '512', '0'), +('9', '26', '6', '4165', '362', '0'), +('9', '26', '17', '11623', '1935', '0'), +('9', '26', '17', '4832', '1448', '0'), +('9', '26', '17', '4902', '1107', '0'), +('9', '26', '17', '3164', '867', '0'), +('9', '26', '7', '4833', '725', '0'), +('9', '26', '7', '4411', '633', '0'), +('9', '26', '7', '10104', '284', '0'), +('9', '26', '7', '71303', '271', '0'), +('9', '26', '9', '27703', '1840', '0'), +('9', '26', '9', '4834', '920', '0'), +('9', '26', '9', '4904', '574', '0'), +('9', '26', '9', '13280', '493', '0'), +('9', '26', '15', '14707', '1050', '0'), +('9', '26', '15', '10366', '805', '0'), +('9', '26', '15', '30360', '600', '0'), +('9', '26', '15', '14679', '580', '0'), +('9', '26', '20', '11676', '8690', '0'), +('9', '26', '20', '11601', '7055', '0'), +('9', '26', '20', '2922', '4899', '0'), +('9', '26', '20', '1365', '4200', '0'), +('9', '26', '12', '11624', '1058', '0'), +('9', '26', '12', '20655', '763', '0'), +('9', '26', '12', '4905', '729', '0'), +('9', '26', '12', '4835', '707', '0'), +('9', '26', '18', '4412', '633', '0'), +('9', '26', '18', '4836', '476', '0'), +('9', '26', '18', '4906', '388', '0'), +('9', '26', '18', '3171', '272', '0'), +('9', '26', '19', '1534', '1276', '0'), +('9', '26', '19', '4837', '1024', '0'), +('9', '26', '19', '68239', '481', '0'), +('9', '26', '19', '4907', '392', '0'), +('9', '26', '13', '27704', '37456', '0'), +('9', '26', '13', '7257', '29845', '0'), +('9', '26', '13', '11557', '27790', '0'), +('9', '26', '13', '11610', '27564', '0'), +('9', '26', '14', '6952', '25785', '0'), +('9', '26', '14', '7257', '23041', '0'), +('9', '26', '14', '11557', '22800', '0'), +('9', '26', '14', '11661', '22080', '0'), +('9', '26', '11', '8325', '14120', '0'), +('9', '26', '11', '8408', '14050', '0'), +('9', '26', '11', '8811', '11040', '0'), +('9', '26', '11', '8810', '10160', '0'), +('9', '27', '22', '8567', '0', '0'), +('9', '27', '22', '10323', '0', '0'), +('9', '27', '22', '66166', '0', '0'), +('9', '27', '22', '10664', '0', '0'), +('9', '27', '1', '30361', '1140', '0'), +('9', '27', '1', '14701', '362', '0'), +('9', '27', '1', '10165', '313', '0'), +('9', '27', '1', '14658', '258', '0'), +('9', '27', '2', '10142', '1272', '0'), +('9', '27', '2', '4341', '1262', '0'), +('9', '27', '2', '30363', '1200', '0'), +('9', '27', '2', '3040', '1082', '0'), +('9', '27', '3', '14706', '990', '0'), +('9', '27', '3', '14705', '990', '0'), +('9', '27', '3', '27702', '807', '0'), +('9', '27', '3', '14695', '423', '0'), +('9', '27', '5', '30362', '1140', '0'), +('9', '27', '5', '14552', '884', '0'), +('9', '27', '5', '10147', '630', '0'), +('9', '27', '5', '14703', '550', '0'), +('9', '27', '8', '11621', '8325', '0'), +('9', '27', '8', '11551', '1505', '0'), +('9', '27', '8', '3403', '1171', '0'), +('9', '27', '8', '1409', '812', '0'), +('9', '27', '6', '1557', '5310', '0'), +('9', '27', '6', '3309', '517', '0'), +('9', '27', '6', '3165', '512', '0'), +('9', '27', '6', '4165', '362', '0'), +('9', '27', '17', '11623', '1935', '0'), +('9', '27', '17', '4832', '1454', '0'), +('9', '27', '17', '4902', '1107', '0'), +('9', '27', '17', '3164', '867', '0'), +('9', '27', '7', '4833', '725', '0'), +('9', '27', '7', '4411', '633', '0'), +('9', '27', '7', '10104', '284', '0'), +('9', '27', '7', '71303', '271', '0'), +('9', '27', '9', '27703', '1840', '0'), +('9', '27', '9', '4834', '920', '0'), +('9', '27', '9', '4904', '574', '0'), +('9', '27', '9', '13280', '493', '0'), +('9', '27', '15', '14707', '1050', '0'), +('9', '27', '15', '10366', '805', '0'), +('9', '27', '15', '30360', '600', '0'), +('9', '27', '15', '14679', '580', '0'), +('9', '27', '20', '11676', '8690', '0'), +('9', '27', '20', '11601', '7059', '0'), +('9', '27', '20', '2922', '4899', '0'), +('9', '27', '20', '1365', '4200', '0'), +('9', '27', '12', '11624', '1060', '0'), +('9', '27', '12', '20655', '764', '0'), +('9', '27', '12', '4905', '729', '0'), +('9', '27', '12', '4835', '709', '0'), +('9', '27', '18', '4412', '633', '0'), +('9', '27', '18', '4836', '478', '0'), +('9', '27', '18', '4906', '388', '0'), +('9', '27', '18', '3171', '274', '0'), +('9', '27', '19', '1534', '1276', '0'), +('9', '27', '19', '4837', '1024', '0'), +('9', '27', '19', '68239', '481', '0'), +('9', '27', '19', '4907', '392', '0'), +('9', '27', '13', '27704', '38055', '0'), +('9', '27', '13', '7257', '30494', '0'), +('9', '27', '13', '11557', '28241', '0'), +('9', '27', '13', '11610', '28212', '0'), +('9', '27', '14', '6952', '25785', '0'), +('9', '27', '14', '7257', '23041', '0'), +('9', '27', '14', '11557', '22800', '0'), +('9', '27', '14', '11661', '22080', '0'), +('9', '27', '11', '8325', '14120', '0'), +('9', '27', '11', '8408', '14050', '0'), +('9', '27', '11', '8811', '11040', '0'), +('9', '27', '11', '45137', '10253', '0'), +('9', '28', '22', '8567', '0', '0'), +('9', '28', '22', '10323', '0', '0'), +('9', '28', '22', '66166', '0', '0'), +('9', '28', '22', '10664', '0', '0'), +('9', '28', '1', '30361', '1140', '0'), +('9', '28', '1', '14701', '362', '0'), +('9', '28', '1', '10165', '313', '0'), +('9', '28', '1', '14658', '258', '0'), +('9', '28', '2', '10142', '1272', '0'), +('9', '28', '2', '4341', '1262', '0'), +('9', '28', '2', '30363', '1200', '0'), +('9', '28', '2', '3040', '1082', '0'), +('9', '28', '3', '14706', '990', '0'), +('9', '28', '3', '14705', '990', '0'), +('9', '28', '3', '27702', '807', '0'), +('9', '28', '3', '14695', '423', '0'), +('9', '28', '5', '30362', '1140', '0'), +('9', '28', '5', '14552', '884', '0'), +('9', '28', '5', '10147', '630', '0'), +('9', '28', '5', '14703', '550', '0'), +('9', '28', '8', '11621', '8325', '0'), +('9', '28', '8', '11551', '1505', '0'), +('9', '28', '8', '3403', '1171', '0'), +('9', '28', '8', '1409', '812', '0'), +('9', '28', '6', '1557', '5310', '0'), +('9', '28', '6', '3309', '517', '0'), +('9', '28', '6', '3165', '512', '0'), +('9', '28', '6', '4165', '362', '0'), +('9', '28', '17', '11623', '1935', '0'), +('9', '28', '17', '4832', '1460', '0'), +('9', '28', '17', '4902', '1107', '0'), +('9', '28', '17', '3164', '867', '0'), +('9', '28', '7', '4833', '725', '0'), +('9', '28', '7', '4411', '633', '0'), +('9', '28', '7', '10104', '284', '0'), +('9', '28', '7', '71303', '271', '0'), +('9', '28', '9', '27703', '1840', '0'), +('9', '28', '9', '4834', '920', '0'), +('9', '28', '9', '4904', '574', '0'), +('9', '28', '9', '13280', '493', '0'), +('9', '28', '15', '14707', '1050', '0'), +('9', '28', '15', '10366', '805', '0'), +('9', '28', '15', '30360', '600', '0'), +('9', '28', '15', '14679', '580', '0'), +('9', '28', '20', '11676', '8690', '0'), +('9', '28', '20', '11601', '7063', '0'), +('9', '28', '20', '2922', '4899', '0'), +('9', '28', '20', '1365', '4200', '0'), +('9', '28', '12', '11624', '1063', '0'), +('9', '28', '12', '20655', '764', '0'), +('9', '28', '12', '4905', '729', '0'), +('9', '28', '12', '4835', '711', '0'), +('9', '28', '18', '4412', '633', '0'), +('9', '28', '18', '4836', '480', '0'), +('9', '28', '18', '4906', '388', '0'), +('9', '28', '18', '3171', '276', '0'), +('9', '28', '19', '1534', '1276', '0'), +('9', '28', '19', '4837', '1024', '0'), +('9', '28', '19', '68239', '481', '0'), +('9', '28', '19', '4907', '392', '0'), +('9', '28', '13', '27704', '38663', '0'), +('9', '28', '13', '7257', '31151', '0'), +('9', '28', '13', '11610', '28870', '0'), +('9', '28', '13', '11557', '28698', '0'), +('9', '28', '14', '6952', '25785', '0'), +('9', '28', '14', '7257', '23041', '0'), +('9', '28', '14', '11557', '22800', '0'), +('9', '28', '14', '11661', '22080', '0'), +('9', '28', '11', '8325', '14120', '0'), +('9', '28', '11', '8408', '14050', '0'), +('9', '28', '11', '8811', '11040', '0'), +('9', '28', '11', '45137', '10572', '0'), +('9', '29', '22', '8567', '0', '0'), +('9', '29', '22', '10323', '0', '0'), +('9', '29', '22', '66166', '0', '0'), +('9', '29', '22', '10664', '0', '0'), +('9', '29', '1', '30361', '1140', '0'), +('9', '29', '1', '14701', '362', '0'), +('9', '29', '1', '10165', '313', '0'), +('9', '29', '1', '14658', '258', '0'), +('9', '29', '2', '10142', '1272', '0'), +('9', '29', '2', '4341', '1262', '0'), +('9', '29', '2', '30363', '1200', '0'), +('9', '29', '2', '3040', '1082', '0'), +('9', '29', '3', '14706', '990', '0'), +('9', '29', '3', '14705', '990', '0'), +('9', '29', '3', '27702', '807', '0'), +('9', '29', '3', '14695', '423', '0'), +('9', '29', '5', '30362', '1140', '0'), +('9', '29', '5', '14552', '884', '0'), +('9', '29', '5', '10147', '630', '0'), +('9', '29', '5', '14703', '550', '0'), +('9', '29', '8', '11621', '8325', '0'), +('9', '29', '8', '11551', '1505', '0'), +('9', '29', '8', '3403', '1171', '0'), +('9', '29', '8', '1409', '812', '0'), +('9', '29', '6', '1557', '5310', '0'), +('9', '29', '6', '3309', '517', '0'), +('9', '29', '6', '3165', '512', '0'), +('9', '29', '6', '4165', '362', '0'), +('9', '29', '17', '11623', '1935', '0'), +('9', '29', '17', '4832', '1466', '0'), +('9', '29', '17', '4902', '1107', '0'), +('9', '29', '17', '3164', '867', '0'), +('9', '29', '7', '4833', '725', '0'), +('9', '29', '7', '4411', '633', '0'), +('9', '29', '7', '10104', '284', '0'), +('9', '29', '7', '71303', '271', '0'), +('9', '29', '9', '27703', '1840', '0'), +('9', '29', '9', '4834', '920', '0'), +('9', '29', '9', '4904', '574', '0'), +('9', '29', '9', '13280', '493', '0'), +('9', '29', '15', '14707', '1050', '0'), +('9', '29', '15', '10366', '805', '0'), +('9', '29', '15', '30360', '600', '0'), +('9', '29', '15', '14679', '580', '0'), +('9', '29', '20', '11676', '8690', '0'), +('9', '29', '20', '11601', '7067', '0'), +('9', '29', '20', '2922', '4899', '0'), +('9', '29', '20', '1365', '4200', '0'), +('9', '29', '12', '11624', '1066', '0'), +('9', '29', '12', '20655', '765', '0'), +('9', '29', '12', '4905', '729', '0'), +('9', '29', '12', '4835', '713', '0'), +('9', '29', '18', '4412', '633', '0'), +('9', '29', '18', '4836', '482', '0'), +('9', '29', '18', '4906', '388', '0'), +('9', '29', '18', '3171', '278', '0'), +('9', '29', '19', '1534', '1276', '0'), +('9', '29', '19', '4837', '1024', '0'), +('9', '29', '19', '68239', '481', '0'), +('9', '29', '19', '4907', '392', '0'), +('9', '29', '13', '27704', '39279', '0'), +('9', '29', '13', '7257', '31818', '0'), +('9', '29', '13', '11610', '29537', '0'), +('9', '29', '13', '11557', '29162', '0'), +('9', '29', '14', '6952', '25785', '0'), +('9', '29', '14', '7257', '23041', '0'), +('9', '29', '14', '11557', '22800', '0'), +('9', '29', '14', '11661', '22080', '0'), +('9', '29', '11', '8325', '14120', '0'), +('9', '29', '11', '8408', '14050', '0'), +('9', '29', '11', '8811', '11040', '0'), +('9', '29', '11', '45137', '10952', '0'), +('9', '30', '22', '8567', '0', '0'), +('9', '30', '22', '10323', '0', '0'), +('9', '30', '22', '66166', '0', '0'), +('9', '30', '22', '10664', '0', '0'), +('9', '30', '1', '30361', '1140', '0'), +('9', '30', '1', '14701', '362', '0'), +('9', '30', '1', '10165', '313', '0'), +('9', '30', '1', '14658', '258', '0'), +('9', '30', '2', '10142', '1272', '0'), +('9', '30', '2', '4341', '1262', '0'), +('9', '30', '2', '30363', '1200', '0'), +('9', '30', '2', '3040', '1082', '0'), +('9', '30', '3', '14706', '990', '0'), +('9', '30', '3', '14705', '990', '0'), +('9', '30', '3', '27702', '807', '0'), +('9', '30', '3', '14695', '423', '0'), +('9', '30', '5', '30362', '1140', '0'), +('9', '30', '5', '14552', '884', '0'), +('9', '30', '5', '10147', '630', '0'), +('9', '30', '5', '14703', '550', '0'), +('9', '30', '8', '11621', '8325', '0'), +('9', '30', '8', '11551', '1505', '0'), +('9', '30', '8', '3403', '1171', '0'), +('9', '30', '8', '1409', '812', '0'), +('9', '30', '6', '1557', '5310', '0'), +('9', '30', '6', '3309', '517', '0'), +('9', '30', '6', '3165', '512', '0'), +('9', '30', '6', '4165', '362', '0'), +('9', '30', '17', '11623', '1935', '0'), +('9', '30', '17', '4832', '1473', '0'), +('9', '30', '17', '4902', '1107', '0'), +('9', '30', '17', '3164', '867', '0'), +('9', '30', '7', '4833', '725', '0'), +('9', '30', '7', '4411', '633', '0'), +('9', '30', '7', '10104', '284', '0'), +('9', '30', '7', '71303', '271', '0'), +('9', '30', '9', '27703', '1840', '0'), +('9', '30', '9', '4834', '920', '0'), +('9', '30', '9', '4904', '574', '0'), +('9', '30', '9', '13280', '493', '0'), +('9', '30', '15', '14707', '1050', '0'), +('9', '30', '15', '10366', '805', '0'), +('9', '30', '15', '30360', '600', '0'), +('9', '30', '15', '14679', '580', '0'), +('9', '30', '20', '11676', '8690', '0'), +('9', '30', '20', '11601', '7071', '0'), +('9', '30', '20', '2922', '4899', '0'), +('9', '30', '20', '1365', '4200', '0'), +('9', '30', '12', '11624', '1069', '0'), +('9', '30', '12', '20655', '766', '0'), +('9', '30', '12', '4905', '729', '0'), +('9', '30', '12', '4835', '715', '0'), +('9', '30', '18', '4412', '633', '0'), +('9', '30', '18', '4836', '484', '0'), +('9', '30', '18', '4906', '388', '0'), +('9', '30', '18', '3171', '280', '0'), +('9', '30', '19', '1534', '1276', '0'), +('9', '30', '19', '4837', '1024', '0'), +('9', '30', '19', '68239', '481', '0'), +('9', '30', '19', '4907', '392', '0'), +('9', '30', '13', '27704', '39904', '0'), +('9', '30', '13', '7257', '32495', '0'), +('9', '30', '13', '11610', '30214', '0'), +('9', '30', '13', '11557', '29633', '0'), +('9', '30', '14', '6952', '25785', '0'), +('9', '30', '14', '7257', '23041', '0'), +('9', '30', '14', '11557', '22800', '0'), +('9', '30', '14', '11661', '22080', '0'), +('9', '30', '11', '8325', '14120', '0'), +('9', '30', '11', '8408', '14050', '0'), +('9', '30', '11', '45137', '11251', '0'), +('9', '30', '11', '8811', '11040', '0'), +('9', '31', '22', '8567', '0', '0'), +('9', '31', '22', '10323', '0', '0'), +('9', '31', '22', '66166', '0', '0'), +('9', '31', '22', '10664', '0', '0'), +('9', '31', '1', '30361', '1140', '0'), +('9', '31', '1', '14701', '362', '0'), +('9', '31', '1', '10165', '313', '0'), +('9', '31', '1', '14658', '258', '0'), +('9', '31', '2', '10142', '1272', '0'), +('9', '31', '2', '4341', '1262', '0'), +('9', '31', '2', '30363', '1200', '0'), +('9', '31', '2', '3040', '1082', '0'), +('9', '31', '3', '14706', '990', '0'), +('9', '31', '3', '14705', '990', '0'), +('9', '31', '3', '27702', '807', '0'), +('9', '31', '3', '14695', '423', '0'), +('9', '31', '5', '30362', '1140', '0'), +('9', '31', '5', '14552', '884', '0'), +('9', '31', '5', '10147', '630', '0'), +('9', '31', '5', '14703', '550', '0'), +('9', '31', '8', '11621', '8325', '0'), +('9', '31', '8', '11551', '1505', '0'), +('9', '31', '8', '3403', '1171', '0'), +('9', '31', '8', '1409', '812', '0'), +('9', '31', '6', '1557', '5310', '0'), +('9', '31', '6', '3309', '517', '0'), +('9', '31', '6', '3165', '512', '0'), +('9', '31', '6', '4165', '362', '0'), +('9', '31', '17', '11623', '1935', '0'), +('9', '31', '17', '4832', '1479', '0'), +('9', '31', '17', '4902', '1107', '0'), +('9', '31', '17', '3164', '867', '0'), +('9', '31', '7', '4833', '725', '0'), +('9', '31', '7', '4411', '633', '0'), +('9', '31', '7', '10104', '284', '0'), +('9', '31', '7', '71303', '271', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '31', '9', '27703', '1840', '0'), +('9', '31', '9', '4834', '920', '0'), +('9', '31', '9', '4904', '574', '0'), +('9', '31', '9', '13280', '493', '0'), +('9', '31', '15', '14707', '1050', '0'), +('9', '31', '15', '10366', '805', '0'), +('9', '31', '15', '30360', '600', '0'), +('9', '31', '15', '14679', '580', '0'), +('9', '31', '20', '11676', '8690', '0'), +('9', '31', '20', '11601', '7075', '0'), +('9', '31', '20', '2922', '4899', '0'), +('9', '31', '20', '1365', '4200', '0'), +('9', '31', '12', '11624', '1072', '0'), +('9', '31', '12', '20655', '767', '0'), +('9', '31', '12', '4905', '729', '0'), +('9', '31', '12', '4835', '717', '0'), +('9', '31', '18', '4412', '633', '0'), +('9', '31', '18', '4836', '486', '0'), +('9', '31', '18', '4906', '388', '0'), +('9', '31', '18', '3171', '283', '0'), +('9', '31', '19', '1534', '1276', '0'), +('9', '31', '19', '4837', '1024', '0'), +('9', '31', '19', '68239', '481', '0'), +('9', '31', '19', '4907', '392', '0'), +('9', '31', '13', '27704', '40537', '0'), +('9', '31', '13', '7257', '33181', '0'), +('9', '31', '13', '11610', '30899', '0'), +('9', '31', '13', '11557', '30110', '0'), +('9', '31', '14', '6952', '25785', '0'), +('9', '31', '14', '7257', '23041', '0'), +('9', '31', '14', '11557', '22800', '0'), +('9', '31', '14', '11661', '22080', '0'), +('9', '31', '11', '8325', '14120', '0'), +('9', '31', '11', '8408', '14050', '0'), +('9', '31', '11', '45137', '11771', '0'), +('9', '31', '11', '8811', '11040', '0'), +('9', '32', '22', '8567', '0', '0'), +('9', '32', '22', '10323', '0', '0'), +('9', '32', '22', '66166', '0', '0'), +('9', '32', '22', '10664', '0', '0'), +('9', '32', '1', '30361', '1140', '0'), +('9', '32', '1', '14701', '362', '0'), +('9', '32', '1', '10165', '313', '0'), +('9', '32', '1', '14658', '258', '0'), +('9', '32', '2', '10142', '1272', '0'), +('9', '32', '2', '4341', '1262', '0'), +('9', '32', '2', '30363', '1200', '0'), +('9', '32', '2', '3040', '1082', '0'), +('9', '32', '3', '14706', '990', '0'), +('9', '32', '3', '14705', '990', '0'), +('9', '32', '3', '27702', '807', '0'), +('9', '32', '3', '14695', '423', '0'), +('9', '32', '5', '30362', '1140', '0'), +('9', '32', '5', '14552', '884', '0'), +('9', '32', '5', '10147', '630', '0'), +('9', '32', '5', '14703', '550', '0'), +('9', '32', '8', '11621', '8325', '0'), +('9', '32', '8', '11551', '1505', '0'), +('9', '32', '8', '3403', '1171', '0'), +('9', '32', '8', '1409', '812', '0'), +('9', '32', '6', '1557', '5310', '0'), +('9', '32', '6', '3309', '517', '0'), +('9', '32', '6', '3165', '512', '0'), +('9', '32', '6', '4165', '362', '0'), +('9', '32', '17', '11623', '1935', '0'), +('9', '32', '17', '4832', '1485', '0'), +('9', '32', '17', '4902', '1107', '0'), +('9', '32', '17', '3164', '867', '0'), +('9', '32', '7', '4833', '725', '0'), +('9', '32', '7', '4411', '633', '0'), +('9', '32', '7', '10104', '284', '0'), +('9', '32', '7', '71303', '271', '0'), +('9', '32', '9', '27703', '1840', '0'), +('9', '32', '9', '4834', '920', '0'), +('9', '32', '9', '4904', '574', '0'), +('9', '32', '9', '13280', '493', '0'), +('9', '32', '15', '14707', '1050', '0'), +('9', '32', '15', '10366', '805', '0'), +('9', '32', '15', '30360', '600', '0'), +('9', '32', '15', '14679', '580', '0'), +('9', '32', '20', '11676', '8690', '0'), +('9', '32', '20', '11601', '7079', '0'), +('9', '32', '20', '2922', '4899', '0'), +('9', '32', '20', '1365', '4200', '0'), +('9', '32', '12', '11624', '1075', '0'), +('9', '32', '12', '20655', '768', '0'), +('9', '32', '12', '4905', '729', '0'), +('9', '32', '12', '4835', '719', '0'), +('9', '32', '18', '4412', '633', '0'), +('9', '32', '18', '4836', '488', '0'), +('9', '32', '18', '4906', '388', '0'), +('9', '32', '18', '3171', '285', '0'), +('9', '32', '19', '1534', '1276', '0'), +('9', '32', '19', '4837', '1024', '0'), +('9', '32', '19', '68239', '481', '0'), +('9', '32', '19', '4907', '392', '0'), +('9', '32', '13', '27704', '41180', '0'), +('9', '32', '13', '7257', '33876', '0'), +('9', '32', '13', '11610', '31595', '0'), +('9', '32', '13', '11661', '30634', '0'), +('9', '32', '14', '6952', '25785', '0'), +('9', '32', '14', '7257', '23041', '0'), +('9', '32', '14', '11557', '22800', '0'), +('9', '32', '14', '11661', '22080', '0'), +('9', '32', '11', '8325', '14120', '0'), +('9', '32', '11', '8408', '14050', '0'), +('9', '32', '11', '45137', '12091', '0'), +('9', '32', '11', '8811', '11040', '0'), +('9', '33', '22', '8567', '0', '0'), +('9', '33', '22', '10323', '0', '0'), +('9', '33', '22', '66166', '0', '0'), +('9', '33', '22', '10664', '0', '0'), +('9', '33', '1', '30361', '1140', '0'), +('9', '33', '1', '14701', '362', '0'), +('9', '33', '1', '10165', '313', '0'), +('9', '33', '1', '14658', '258', '0'), +('9', '33', '2', '10142', '1272', '0'), +('9', '33', '2', '4341', '1262', '0'), +('9', '33', '2', '30363', '1200', '0'), +('9', '33', '2', '3040', '1082', '0'), +('9', '33', '3', '14706', '990', '0'), +('9', '33', '3', '14705', '990', '0'), +('9', '33', '3', '27702', '807', '0'), +('9', '33', '3', '14695', '423', '0'), +('9', '33', '5', '30362', '1140', '0'), +('9', '33', '5', '14552', '884', '0'), +('9', '33', '5', '10147', '630', '0'), +('9', '33', '5', '14703', '550', '0'), +('9', '33', '8', '11621', '8325', '0'), +('9', '33', '8', '11551', '1505', '0'), +('9', '33', '8', '3403', '1171', '0'), +('9', '33', '8', '1409', '812', '0'), +('9', '33', '6', '1557', '5310', '0'), +('9', '33', '6', '3309', '517', '0'), +('9', '33', '6', '3165', '512', '0'), +('9', '33', '6', '4165', '362', '0'), +('9', '33', '17', '11623', '1935', '0'), +('9', '33', '17', '4832', '1492', '0'), +('9', '33', '17', '4902', '1107', '0'), +('9', '33', '17', '3164', '867', '0'), +('9', '33', '7', '4833', '725', '0'), +('9', '33', '7', '4411', '633', '0'), +('9', '33', '7', '10104', '284', '0'), +('9', '33', '7', '4343', '274', '0'), +('9', '33', '9', '27703', '1840', '0'), +('9', '33', '9', '4834', '920', '0'), +('9', '33', '9', '4904', '574', '0'), +('9', '33', '9', '13280', '493', '0'), +('9', '33', '15', '14707', '1050', '0'), +('9', '33', '15', '10366', '805', '0'), +('9', '33', '15', '30360', '600', '0'), +('9', '33', '15', '14679', '580', '0'), +('9', '33', '20', '11676', '8690', '0'), +('9', '33', '20', '11601', '7084', '0'), +('9', '33', '20', '2922', '4899', '0'), +('9', '33', '20', '1365', '4200', '0'), +('9', '33', '12', '11624', '1078', '0'), +('9', '33', '12', '20655', '769', '0'), +('9', '33', '12', '4905', '729', '0'), +('9', '33', '12', '4835', '721', '0'), +('9', '33', '18', '4412', '633', '0'), +('9', '33', '18', '4836', '490', '0'), +('9', '33', '18', '4906', '388', '0'), +('9', '33', '18', '3171', '287', '0'), +('9', '33', '19', '1534', '1276', '0'), +('9', '33', '19', '4837', '1024', '0'), +('9', '33', '19', '68239', '481', '0'), +('9', '33', '19', '4907', '392', '0'), +('9', '33', '13', '27704', '41831', '0'), +('9', '33', '13', '7257', '34580', '0'), +('9', '33', '13', '11610', '32299', '0'), +('9', '33', '13', '11661', '31177', '0'), +('9', '33', '14', '6952', '25785', '0'), +('9', '33', '14', '7257', '23041', '0'), +('9', '33', '14', '11557', '22800', '0'), +('9', '33', '14', '11661', '22080', '0'), +('9', '33', '11', '8325', '14120', '0'), +('9', '33', '11', '8408', '14050', '0'), +('9', '33', '11', '45137', '12471', '0'), +('9', '33', '11', '8811', '11040', '0'), +('9', '34', '22', '8567', '0', '0'), +('9', '34', '22', '10323', '0', '0'), +('9', '34', '22', '66166', '0', '0'), +('9', '34', '22', '10664', '0', '0'), +('9', '34', '1', '30361', '1140', '0'), +('9', '34', '1', '14701', '362', '0'), +('9', '34', '1', '10165', '313', '0'), +('9', '34', '1', '14658', '258', '0'), +('9', '34', '2', '10142', '1272', '0'), +('9', '34', '2', '4341', '1262', '0'), +('9', '34', '2', '30363', '1200', '0'), +('9', '34', '2', '3040', '1082', '0'), +('9', '34', '3', '14706', '990', '0'), +('9', '34', '3', '14705', '990', '0'), +('9', '34', '3', '27702', '807', '0'), +('9', '34', '3', '14695', '423', '0'), +('9', '34', '5', '30362', '1140', '0'), +('9', '34', '5', '14552', '884', '0'), +('9', '34', '5', '10147', '630', '0'), +('9', '34', '5', '14703', '550', '0'), +('9', '34', '8', '11621', '8325', '0'), +('9', '34', '8', '11551', '1505', '0'), +('9', '34', '8', '3403', '1171', '0'), +('9', '34', '8', '1409', '812', '0'), +('9', '34', '6', '1557', '5310', '0'), +('9', '34', '6', '3309', '517', '0'), +('9', '34', '6', '3165', '512', '0'), +('9', '34', '6', '4165', '362', '0'), +('9', '34', '17', '11623', '1935', '0'), +('9', '34', '17', '4832', '1497', '0'), +('9', '34', '17', '4902', '1107', '0'), +('9', '34', '17', '3164', '867', '0'), +('9', '34', '7', '4833', '725', '0'), +('9', '34', '7', '4411', '633', '0'), +('9', '34', '7', '10104', '284', '0'), +('9', '34', '7', '4343', '277', '0'), +('9', '34', '9', '27703', '1840', '0'), +('9', '34', '9', '4834', '920', '0'), +('9', '34', '9', '4904', '574', '0'), +('9', '34', '9', '13280', '493', '0'), +('9', '34', '15', '14707', '1050', '0'), +('9', '34', '15', '10366', '805', '0'), +('9', '34', '15', '30360', '600', '0'), +('9', '34', '15', '14679', '580', '0'), +('9', '34', '20', '11676', '8690', '0'), +('9', '34', '20', '11601', '7087', '0'), +('9', '34', '20', '2922', '4899', '0'), +('9', '34', '20', '1365', '4200', '0'), +('9', '34', '12', '11624', '1080', '0'), +('9', '34', '12', '20655', '769', '0'), +('9', '34', '12', '4905', '729', '0'), +('9', '34', '12', '4835', '723', '0'), +('9', '34', '18', '4412', '633', '0'), +('9', '34', '18', '4836', '492', '0'), +('9', '34', '18', '4906', '388', '0'), +('9', '34', '18', '3171', '289', '0'), +('9', '34', '19', '1534', '1276', '0'), +('9', '34', '19', '4837', '1024', '0'), +('9', '34', '19', '68239', '481', '0'), +('9', '34', '19', '4907', '392', '0'), +('9', '34', '13', '27704', '42490', '0'), +('9', '34', '13', '7257', '35294', '0'), +('9', '34', '13', '11610', '33013', '0'), +('9', '34', '13', '11661', '31728', '0'), +('9', '34', '14', '6952', '25785', '0'), +('9', '34', '14', '7257', '23041', '0'), +('9', '34', '14', '11557', '22800', '0'), +('9', '34', '14', '11661', '22080', '0'), +('9', '34', '11', '8325', '14120', '0'), +('9', '34', '11', '8408', '14050', '0'), +('9', '34', '11', '45137', '12771', '0'), +('9', '34', '11', '8811', '11040', '0'), +('9', '35', '22', '8567', '0', '0'), +('9', '35', '22', '10323', '0', '0'), +('9', '35', '22', '66166', '0', '0'), +('9', '35', '22', '10664', '0', '0'), +('9', '35', '1', '30361', '1140', '0'), +('9', '35', '1', '14701', '362', '0'), +('9', '35', '1', '10165', '313', '0'), +('9', '35', '1', '14658', '258', '0'), +('9', '35', '2', '10142', '1272', '0'), +('9', '35', '2', '4341', '1262', '0'), +('9', '35', '2', '30363', '1200', '0'), +('9', '35', '2', '3040', '1082', '0'), +('9', '35', '3', '14706', '990', '0'), +('9', '35', '3', '14705', '990', '0'), +('9', '35', '3', '27702', '807', '0'), +('9', '35', '3', '14695', '423', '0'), +('9', '35', '5', '30362', '1140', '0'), +('9', '35', '5', '14552', '884', '0'), +('9', '35', '5', '10147', '630', '0'), +('9', '35', '5', '14703', '550', '0'), +('9', '35', '8', '11621', '8325', '0'), +('9', '35', '8', '11551', '1505', '0'), +('9', '35', '8', '3403', '1171', '0'), +('9', '35', '8', '1409', '812', '0'), +('9', '35', '6', '1557', '5310', '0'), +('9', '35', '6', '3309', '517', '0'), +('9', '35', '6', '3165', '512', '0'), +('9', '35', '6', '4165', '362', '0'), +('9', '35', '17', '11623', '1935', '0'), +('9', '35', '17', '4832', '1503', '0'), +('9', '35', '17', '4902', '1107', '0'), +('9', '35', '17', '3164', '867', '0'), +('9', '35', '7', '4833', '725', '0'), +('9', '35', '7', '4411', '633', '0'), +('9', '35', '7', '10104', '284', '0'), +('9', '35', '7', '4343', '281', '0'), +('9', '35', '9', '27703', '1840', '0'), +('9', '35', '9', '4834', '920', '0'), +('9', '35', '9', '4904', '574', '0'), +('9', '35', '9', '13280', '493', '0'), +('9', '35', '15', '14707', '1050', '0'), +('9', '35', '15', '10366', '805', '0'), +('9', '35', '15', '30360', '600', '0'), +('9', '35', '15', '14679', '580', '0'), +('9', '35', '20', '11676', '8690', '0'), +('9', '35', '20', '11601', '7092', '0'), +('9', '35', '20', '2922', '4899', '0'), +('9', '35', '20', '1365', '4200', '0'), +('9', '35', '12', '11624', '1083', '0'), +('9', '35', '12', '20655', '770', '0'), +('9', '35', '12', '4905', '729', '0'), +('9', '35', '12', '4835', '725', '0'), +('9', '35', '18', '4412', '633', '0'), +('9', '35', '18', '4836', '494', '0'), +('9', '35', '18', '4906', '388', '0'), +('9', '35', '18', '3171', '291', '0'), +('9', '35', '19', '1534', '1276', '0'), +('9', '35', '19', '4837', '1024', '0'), +('9', '35', '19', '68239', '481', '0'), +('9', '35', '19', '4907', '392', '0'), +('9', '35', '13', '27704', '43158', '0'), +('9', '35', '13', '7257', '36017', '0'), +('9', '35', '13', '11610', '33736', '0'), +('9', '35', '13', '11661', '32286', '0'), +('9', '35', '14', '6952', '25785', '0'), +('9', '35', '14', '7257', '23041', '0'), +('9', '35', '14', '11557', '22800', '0'), +('9', '35', '14', '11661', '22080', '0'), +('9', '35', '11', '8325', '14120', '0'), +('9', '35', '11', '8408', '14050', '0'), +('9', '35', '11', '45137', '13291', '0'), +('9', '35', '11', '8811', '11040', '0'), +('9', '36', '22', '8567', '0', '0'), +('9', '36', '22', '10323', '0', '0'), +('9', '36', '22', '66166', '0', '0'), +('9', '36', '22', '10664', '0', '0'), +('9', '36', '1', '30361', '1140', '0'), +('9', '36', '1', '14701', '362', '0'), +('9', '36', '1', '10165', '313', '0'), +('9', '36', '1', '14658', '258', '0'), +('9', '36', '2', '10142', '1272', '0'), +('9', '36', '2', '4341', '1262', '0'), +('9', '36', '2', '30363', '1200', '0'), +('9', '36', '2', '3040', '1082', '0'), +('9', '36', '3', '14706', '990', '0'), +('9', '36', '3', '14705', '990', '0'), +('9', '36', '3', '27702', '807', '0'), +('9', '36', '3', '14695', '423', '0'), +('9', '36', '5', '30362', '1140', '0'), +('9', '36', '5', '14552', '884', '0'), +('9', '36', '5', '10147', '630', '0'), +('9', '36', '5', '14703', '550', '0'), +('9', '36', '8', '11621', '8325', '0'), +('9', '36', '8', '11551', '1505', '0'), +('9', '36', '8', '3403', '1171', '0'), +('9', '36', '8', '1409', '812', '0'), +('9', '36', '6', '1557', '5310', '0'), +('9', '36', '6', '3309', '517', '0'), +('9', '36', '6', '3165', '512', '0'), +('9', '36', '6', '4165', '362', '0'), +('9', '36', '17', '11623', '1935', '0'), +('9', '36', '17', '4832', '1510', '0'), +('9', '36', '17', '4902', '1107', '0'), +('9', '36', '17', '3164', '867', '0'), +('9', '36', '7', '4833', '725', '0'), +('9', '36', '7', '4411', '633', '0'), +('9', '36', '7', '4343', '286', '0'), +('9', '36', '7', '10104', '284', '0'), +('9', '36', '9', '27703', '1840', '0'), +('9', '36', '9', '4834', '920', '0'), +('9', '36', '9', '4904', '574', '0'), +('9', '36', '9', '13280', '493', '0'), +('9', '36', '15', '14707', '1050', '0'), +('9', '36', '15', '10366', '805', '0'), +('9', '36', '15', '30360', '600', '0'), +('9', '36', '15', '14679', '580', '0'), +('9', '36', '20', '11676', '8690', '0'), +('9', '36', '20', '11601', '7096', '0'), +('9', '36', '20', '2922', '4899', '0'), +('9', '36', '20', '1365', '4200', '0'), +('9', '36', '12', '11624', '1086', '0'), +('9', '36', '12', '20655', '771', '0'), +('9', '36', '12', '4905', '729', '0'), +('9', '36', '12', '4835', '727', '0'), +('9', '36', '18', '4412', '633', '0'), +('9', '36', '18', '4836', '496', '0'), +('9', '36', '18', '4906', '388', '0'), +('9', '36', '18', '3171', '293', '0'), +('9', '36', '19', '1534', '1276', '0'), +('9', '36', '19', '4837', '1024', '0'), +('9', '36', '19', '68239', '481', '0'), +('9', '36', '19', '4907', '392', '0'), +('9', '36', '13', '27704', '43835', '0'), +('9', '36', '13', '7257', '36750', '0'), +('9', '36', '13', '11610', '34469', '0'), +('9', '36', '13', '11661', '32851', '0'), +('9', '36', '14', '6952', '25785', '0'), +('9', '36', '14', '7257', '23041', '0'), +('9', '36', '14', '11557', '22800', '0'), +('9', '36', '14', '11661', '22080', '0'), +('9', '36', '11', '8325', '14120', '0'), +('9', '36', '11', '8408', '14050', '0'), +('9', '36', '11', '45137', '13591', '0'), +('9', '36', '11', '8811', '11040', '0'), +('9', '37', '22', '8567', '0', '0'), +('9', '37', '22', '10323', '0', '0'), +('9', '37', '22', '66166', '0', '0'), +('9', '37', '22', '10664', '0', '0'), +('9', '37', '1', '30361', '1140', '0'), +('9', '37', '1', '14701', '362', '0'), +('9', '37', '1', '10165', '313', '0'), +('9', '37', '1', '14658', '258', '0'), +('9', '37', '2', '10142', '1272', '0'), +('9', '37', '2', '4341', '1262', '0'), +('9', '37', '2', '30363', '1200', '0'), +('9', '37', '2', '3040', '1082', '0'), +('9', '37', '3', '14706', '990', '0'), +('9', '37', '3', '14705', '990', '0'), +('9', '37', '3', '27702', '807', '0'), +('9', '37', '3', '14695', '423', '0'), +('9', '37', '5', '30362', '1140', '0'), +('9', '37', '5', '14552', '884', '0'), +('9', '37', '5', '10147', '630', '0'), +('9', '37', '5', '14703', '550', '0'), +('9', '37', '8', '11621', '8325', '0'), +('9', '37', '8', '11551', '1505', '0'), +('9', '37', '8', '3403', '1171', '0'), +('9', '37', '8', '1409', '812', '0'), +('9', '37', '6', '1557', '5310', '0'), +('9', '37', '6', '3309', '517', '0'), +('9', '37', '6', '3165', '512', '0'), +('9', '37', '6', '4165', '362', '0'), +('9', '37', '17', '11623', '1935', '0'), +('9', '37', '17', '4832', '1516', '0'), +('9', '37', '17', '4902', '1107', '0'), +('9', '37', '17', '3164', '867', '0'), +('9', '37', '7', '4833', '725', '0'), +('9', '37', '7', '4411', '633', '0'), +('9', '37', '7', '4343', '290', '0'), +('9', '37', '7', '10104', '284', '0'), +('9', '37', '9', '27703', '1840', '0'), +('9', '37', '9', '4834', '920', '0'), +('9', '37', '9', '4904', '574', '0'), +('9', '37', '9', '13280', '493', '0'), +('9', '37', '15', '14707', '1050', '0'), +('9', '37', '15', '10366', '805', '0'), +('9', '37', '15', '30360', '600', '0'), +('9', '37', '15', '14679', '580', '0'), +('9', '37', '20', '11676', '8690', '0'), +('9', '37', '20', '11601', '7100', '0'), +('9', '37', '20', '2922', '4899', '0'), +('9', '37', '20', '1365', '4200', '0'), +('9', '37', '12', '11624', '1089', '0'), +('9', '37', '12', '20655', '772', '0'), +('9', '37', '12', '4835', '730', '0'), +('9', '37', '12', '4905', '729', '0'), +('9', '37', '18', '4412', '633', '0'), +('9', '37', '18', '4836', '498', '0'), +('9', '37', '18', '4906', '388', '0'), +('9', '37', '18', '3171', '295', '0'), +('9', '37', '19', '1534', '1276', '0'), +('9', '37', '19', '4837', '1024', '0'), +('9', '37', '19', '68239', '481', '0'), +('9', '37', '19', '4907', '392', '0'), +('9', '37', '13', '27704', '44520', '0'), +('9', '37', '13', '7257', '37492', '0'), +('9', '37', '13', '11610', '35211', '0'), +('9', '37', '13', '11661', '33424', '0'), +('9', '37', '14', '6952', '25785', '0'), +('9', '37', '14', '5500', '23715', '0'), +('9', '37', '14', '7257', '23041', '0'), +('9', '37', '14', '11557', '22800', '0'), +('9', '37', '11', '8325', '14120', '0'), +('9', '37', '11', '8408', '14050', '0'), +('9', '37', '11', '45137', '13992', '0'), +('9', '37', '11', '8811', '11040', '0'), +('9', '38', '22', '8567', '0', '0'), +('9', '38', '22', '10323', '0', '0'), +('9', '38', '22', '66166', '0', '0'), +('9', '38', '22', '10664', '0', '0'), +('9', '38', '1', '30361', '1140', '0'), +('9', '38', '1', '14701', '362', '0'), +('9', '38', '1', '10165', '313', '0'), +('9', '38', '1', '14658', '258', '0'), +('9', '38', '2', '10142', '1272', '0'), +('9', '38', '2', '4341', '1262', '0'), +('9', '38', '2', '30363', '1200', '0'), +('9', '38', '2', '3040', '1082', '0'), +('9', '38', '3', '14706', '990', '0'), +('9', '38', '3', '14705', '990', '0'), +('9', '38', '3', '27702', '807', '0'), +('9', '38', '3', '14695', '423', '0'), +('9', '38', '5', '30362', '1140', '0'), +('9', '38', '5', '14552', '884', '0'), +('9', '38', '5', '10147', '630', '0'), +('9', '38', '5', '14703', '550', '0'), +('9', '38', '8', '11621', '8325', '0'), +('9', '38', '8', '11551', '1505', '0'), +('9', '38', '8', '3403', '1171', '0'), +('9', '38', '8', '1409', '812', '0'), +('9', '38', '6', '1557', '5310', '0'), +('9', '38', '6', '3309', '517', '0'), +('9', '38', '6', '3165', '512', '0'), +('9', '38', '6', '4165', '362', '0'), +('9', '38', '17', '11623', '1935', '0'), +('9', '38', '17', '4832', '1522', '0'), +('9', '38', '17', '4902', '1107', '0'), +('9', '38', '17', '3164', '867', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '38', '7', '4833', '725', '0'), +('9', '38', '7', '4411', '633', '0'), +('9', '38', '7', '4343', '294', '0'), +('9', '38', '7', '10104', '284', '0'), +('9', '38', '9', '27703', '1840', '0'), +('9', '38', '9', '4834', '920', '0'), +('9', '38', '9', '4904', '574', '0'), +('9', '38', '9', '13280', '493', '0'), +('9', '38', '15', '14707', '1050', '0'), +('9', '38', '15', '10366', '805', '0'), +('9', '38', '15', '30360', '600', '0'), +('9', '38', '15', '14679', '580', '0'), +('9', '38', '20', '11676', '8690', '0'), +('9', '38', '20', '11601', '7104', '0'), +('9', '38', '20', '2922', '4899', '0'), +('9', '38', '20', '1365', '4200', '0'), +('9', '38', '12', '11624', '1092', '0'), +('9', '38', '12', '20655', '773', '0'), +('9', '38', '12', '4835', '732', '0'), +('9', '38', '12', '4905', '729', '0'), +('9', '38', '18', '4412', '633', '0'), +('9', '38', '18', '4836', '500', '0'), +('9', '38', '18', '4906', '388', '0'), +('9', '38', '18', '3171', '297', '0'), +('9', '38', '19', '1534', '1276', '0'), +('9', '38', '19', '4837', '1024', '0'), +('9', '38', '19', '68239', '481', '0'), +('9', '38', '19', '4907', '392', '0'), +('9', '38', '13', '27704', '45215', '0'), +('9', '38', '13', '7257', '38243', '0'), +('9', '38', '13', '11610', '35962', '0'), +('9', '38', '13', '11661', '34003', '0'), +('9', '38', '14', '6952', '25785', '0'), +('9', '38', '14', '5500', '23715', '0'), +('9', '38', '14', '7257', '23041', '0'), +('9', '38', '14', '11557', '22800', '0'), +('9', '38', '11', '45137', '14292', '0'), +('9', '38', '11', '8325', '14120', '0'), +('9', '38', '11', '8408', '14050', '0'), +('9', '38', '11', '8811', '11040', '0'), +('9', '39', '22', '8567', '0', '0'), +('9', '39', '22', '10323', '0', '0'), +('9', '39', '22', '66166', '0', '0'), +('9', '39', '22', '10664', '0', '0'), +('9', '39', '1', '30361', '1140', '0'), +('9', '39', '1', '14701', '362', '0'), +('9', '39', '1', '10165', '313', '0'), +('9', '39', '1', '14658', '258', '0'), +('9', '39', '2', '10142', '1272', '0'), +('9', '39', '2', '4341', '1262', '0'), +('9', '39', '2', '30363', '1200', '0'), +('9', '39', '2', '3040', '1082', '0'), +('9', '39', '3', '14706', '990', '0'), +('9', '39', '3', '14705', '990', '0'), +('9', '39', '3', '27702', '807', '0'), +('9', '39', '3', '14695', '423', '0'), +('9', '39', '5', '30362', '1140', '0'), +('9', '39', '5', '14552', '884', '0'), +('9', '39', '5', '10147', '630', '0'), +('9', '39', '5', '14703', '550', '0'), +('9', '39', '8', '11621', '8325', '0'), +('9', '39', '8', '11551', '1505', '0'), +('9', '39', '8', '3403', '1171', '0'), +('9', '39', '8', '1409', '812', '0'), +('9', '39', '6', '1557', '5310', '0'), +('9', '39', '6', '3309', '517', '0'), +('9', '39', '6', '3165', '512', '0'), +('9', '39', '6', '4165', '362', '0'), +('9', '39', '17', '11623', '1935', '0'), +('9', '39', '17', '4832', '1529', '0'), +('9', '39', '17', '4902', '1107', '0'), +('9', '39', '17', '3164', '867', '0'), +('9', '39', '7', '4833', '725', '0'), +('9', '39', '7', '4411', '633', '0'), +('9', '39', '7', '4343', '298', '0'), +('9', '39', '7', '10104', '284', '0'), +('9', '39', '9', '27703', '1840', '0'), +('9', '39', '9', '4834', '920', '0'), +('9', '39', '9', '4904', '574', '0'), +('9', '39', '9', '13280', '493', '0'), +('9', '39', '15', '14707', '1050', '0'), +('9', '39', '15', '10366', '805', '0'), +('9', '39', '15', '30360', '600', '0'), +('9', '39', '15', '14679', '580', '0'), +('9', '39', '20', '11676', '8690', '0'), +('9', '39', '20', '11601', '7108', '0'), +('9', '39', '20', '2922', '4899', '0'), +('9', '39', '20', '1365', '4200', '0'), +('9', '39', '12', '11624', '1095', '0'), +('9', '39', '12', '20655', '773', '0'), +('9', '39', '12', '4835', '734', '0'), +('9', '39', '12', '4905', '729', '0'), +('9', '39', '18', '4412', '633', '0'), +('9', '39', '18', '4836', '503', '0'), +('9', '39', '18', '4906', '388', '0'), +('9', '39', '18', '3171', '299', '0'), +('9', '39', '19', '1534', '1276', '0'), +('9', '39', '19', '4837', '1024', '0'), +('9', '39', '19', '68239', '481', '0'), +('9', '39', '19', '4907', '392', '0'), +('9', '39', '13', '27704', '45917', '0'), +('9', '39', '13', '7257', '39004', '0'), +('9', '39', '13', '11610', '36723', '0'), +('9', '39', '13', '11661', '34590', '0'), +('9', '39', '14', '6952', '25785', '0'), +('9', '39', '14', '5500', '23715', '0'), +('9', '39', '14', '7257', '23041', '0'), +('9', '39', '14', '11557', '22800', '0'), +('9', '39', '11', '45137', '14813', '0'), +('9', '39', '11', '8325', '14120', '0'), +('9', '39', '11', '8408', '14050', '0'), +('9', '39', '11', '8811', '11040', '0'), +('9', '40', '22', '8567', '0', '0'), +('9', '40', '22', '10323', '0', '0'), +('9', '40', '22', '66166', '0', '0'), +('9', '40', '22', '10664', '0', '0'), +('9', '40', '1', '30361', '1140', '0'), +('9', '40', '1', '14701', '362', '0'), +('9', '40', '1', '10165', '313', '0'), +('9', '40', '1', '14658', '258', '0'), +('9', '40', '2', '10142', '1272', '0'), +('9', '40', '2', '4341', '1262', '0'), +('9', '40', '2', '30363', '1200', '0'), +('9', '40', '2', '3040', '1082', '0'), +('9', '40', '3', '14706', '990', '0'), +('9', '40', '3', '14705', '990', '0'), +('9', '40', '3', '27702', '807', '0'), +('9', '40', '3', '14695', '423', '0'), +('9', '40', '5', '30362', '1140', '0'), +('9', '40', '5', '14552', '884', '0'), +('9', '40', '5', '10147', '630', '0'), +('9', '40', '5', '14703', '550', '0'), +('9', '40', '8', '11621', '8325', '0'), +('9', '40', '8', '11551', '1505', '0'), +('9', '40', '8', '3403', '1171', '0'), +('9', '40', '8', '1409', '812', '0'), +('9', '40', '6', '1557', '5310', '0'), +('9', '40', '6', '3309', '517', '0'), +('9', '40', '6', '3165', '512', '0'), +('9', '40', '6', '4165', '362', '0'), +('9', '40', '17', '11623', '1935', '0'), +('9', '40', '17', '4832', '1535', '0'), +('9', '40', '17', '4902', '1107', '0'), +('9', '40', '17', '3164', '867', '0'), +('9', '40', '7', '4833', '725', '0'), +('9', '40', '7', '4411', '633', '0'), +('9', '40', '7', '4343', '303', '0'), +('9', '40', '7', '10104', '284', '0'), +('9', '40', '9', '27703', '1840', '0'), +('9', '40', '9', '4834', '920', '0'), +('9', '40', '9', '4904', '574', '0'), +('9', '40', '9', '13280', '493', '0'), +('9', '40', '15', '14707', '1050', '0'), +('9', '40', '15', '10366', '805', '0'), +('9', '40', '15', '30360', '600', '0'), +('9', '40', '15', '14679', '580', '0'), +('9', '40', '20', '11676', '8690', '0'), +('9', '40', '20', '11601', '7113', '0'), +('9', '40', '20', '2922', '4899', '0'), +('9', '40', '20', '1365', '4200', '0'), +('9', '40', '12', '11624', '1098', '0'), +('9', '40', '12', '20655', '774', '0'), +('9', '40', '12', '4835', '736', '0'), +('9', '40', '12', '4905', '729', '0'), +('9', '40', '18', '4412', '633', '0'), +('9', '40', '18', '4836', '505', '0'), +('9', '40', '18', '4906', '388', '0'), +('9', '40', '18', '3171', '301', '0'), +('9', '40', '19', '1534', '1276', '0'), +('9', '40', '19', '4837', '1024', '0'), +('9', '40', '19', '68239', '481', '0'), +('9', '40', '19', '4907', '392', '0'), +('9', '40', '13', '27704', '46629', '0'), +('9', '40', '13', '7257', '39774', '0'), +('9', '40', '13', '11610', '37493', '0'), +('9', '40', '13', '11661', '35184', '0'), +('9', '40', '14', '6952', '25785', '0'), +('9', '40', '14', '5500', '23715', '0'), +('9', '40', '14', '7257', '23041', '0'), +('9', '40', '14', '11557', '22800', '0'), +('9', '40', '11', '45137', '15134', '0'), +('9', '40', '11', '8325', '14120', '0'), +('9', '40', '11', '8408', '14050', '0'), +('9', '40', '11', '8811', '11040', '0'), +('9', '41', '22', '8567', '0', '0'), +('9', '41', '22', '10323', '0', '0'), +('9', '41', '22', '66166', '0', '0'), +('9', '41', '22', '10664', '0', '0'), +('9', '41', '1', '30361', '1140', '0'), +('9', '41', '1', '14701', '362', '0'), +('9', '41', '1', '10165', '313', '0'), +('9', '41', '1', '14658', '258', '0'), +('9', '41', '2', '10142', '1272', '0'), +('9', '41', '2', '4341', '1262', '0'), +('9', '41', '2', '30363', '1200', '0'), +('9', '41', '2', '3040', '1082', '0'), +('9', '41', '3', '14706', '990', '0'), +('9', '41', '3', '14705', '990', '0'), +('9', '41', '3', '27702', '807', '0'), +('9', '41', '3', '14695', '423', '0'), +('9', '41', '5', '30362', '1140', '0'), +('9', '41', '5', '14552', '884', '0'), +('9', '41', '5', '10147', '630', '0'), +('9', '41', '5', '14703', '550', '0'), +('9', '41', '8', '11621', '8325', '0'), +('9', '41', '8', '11551', '1505', '0'), +('9', '41', '8', '3403', '1171', '0'), +('9', '41', '8', '1409', '812', '0'), +('9', '41', '6', '1557', '5310', '0'), +('9', '41', '6', '3309', '517', '0'), +('9', '41', '6', '3165', '512', '0'), +('9', '41', '6', '4165', '362', '0'), +('9', '41', '17', '11623', '1935', '0'), +('9', '41', '17', '4832', '1541', '0'), +('9', '41', '17', '4902', '1107', '0'), +('9', '41', '17', '3164', '867', '0'), +('9', '41', '7', '4833', '725', '0'), +('9', '41', '7', '4411', '633', '0'), +('9', '41', '7', '4343', '307', '0'), +('9', '41', '7', '10104', '284', '0'), +('9', '41', '9', '27703', '1840', '0'), +('9', '41', '9', '4834', '920', '0'), +('9', '41', '9', '4904', '574', '0'), +('9', '41', '9', '13280', '493', '0'), +('9', '41', '15', '14707', '1050', '0'), +('9', '41', '15', '10366', '805', '0'), +('9', '41', '15', '30360', '600', '0'), +('9', '41', '15', '14679', '580', '0'), +('9', '41', '20', '11676', '8690', '0'), +('9', '41', '20', '11601', '7117', '0'), +('9', '41', '20', '2922', '4899', '0'), +('9', '41', '20', '1365', '4200', '0'), +('9', '41', '12', '11624', '1101', '0'), +('9', '41', '12', '20655', '775', '0'), +('9', '41', '12', '4835', '738', '0'), +('9', '41', '12', '4905', '729', '0'), +('9', '41', '18', '4412', '633', '0'), +('9', '41', '18', '4836', '507', '0'), +('9', '41', '18', '4906', '388', '0'), +('9', '41', '18', '3171', '303', '0'), +('9', '41', '19', '1534', '1276', '0'), +('9', '41', '19', '4837', '1024', '0'), +('9', '41', '19', '68239', '481', '0'), +('9', '41', '19', '4907', '392', '0'), +('9', '41', '13', '27704', '47349', '0'), +('9', '41', '13', '7257', '40553', '0'), +('9', '41', '13', '11610', '38272', '0'), +('9', '41', '13', '11661', '35785', '0'), +('9', '41', '14', '6952', '25785', '0'), +('9', '41', '14', '5500', '23715', '0'), +('9', '41', '14', '7257', '23041', '0'), +('9', '41', '14', '11557', '22800', '0'), +('9', '41', '11', '45137', '15575', '0'), +('9', '41', '11', '8325', '14120', '0'), +('9', '41', '11', '8408', '14050', '0'), +('9', '41', '11', '8811', '11040', '0'), +('9', '42', '22', '8567', '0', '0'), +('9', '42', '22', '10323', '0', '0'), +('9', '42', '22', '66166', '0', '0'), +('9', '42', '22', '10664', '0', '0'), +('9', '42', '1', '30361', '1140', '0'), +('9', '42', '1', '14701', '362', '0'), +('9', '42', '1', '10165', '313', '0'), +('9', '42', '1', '14658', '258', '0'), +('9', '42', '2', '10142', '1272', '0'), +('9', '42', '2', '4341', '1262', '0'), +('9', '42', '2', '30363', '1200', '0'), +('9', '42', '2', '3040', '1082', '0'), +('9', '42', '3', '14706', '990', '0'), +('9', '42', '3', '14705', '990', '0'), +('9', '42', '3', '27702', '807', '0'), +('9', '42', '3', '14695', '423', '0'), +('9', '42', '5', '30362', '1140', '0'), +('9', '42', '5', '14552', '884', '0'), +('9', '42', '5', '10147', '630', '0'), +('9', '42', '5', '14703', '550', '0'), +('9', '42', '8', '11621', '8325', '0'), +('9', '42', '8', '11551', '1505', '0'), +('9', '42', '8', '3403', '1171', '0'), +('9', '42', '8', '1409', '812', '0'), +('9', '42', '6', '1557', '5310', '0'), +('9', '42', '6', '3309', '517', '0'), +('9', '42', '6', '3165', '512', '0'), +('9', '42', '6', '4165', '362', '0'), +('9', '42', '17', '11623', '1935', '0'), +('9', '42', '17', '4832', '1549', '0'), +('9', '42', '17', '4902', '1107', '0'), +('9', '42', '17', '3164', '867', '0'), +('9', '42', '7', '4833', '725', '0'), +('9', '42', '7', '4411', '633', '0'), +('9', '42', '7', '4343', '312', '0'), +('9', '42', '7', '10104', '284', '0'), +('9', '42', '9', '27703', '1840', '0'), +('9', '42', '9', '4834', '920', '0'), +('9', '42', '9', '4904', '574', '0'), +('9', '42', '9', '13280', '493', '0'), +('9', '42', '15', '14707', '1050', '0'), +('9', '42', '15', '10366', '805', '0'), +('9', '42', '15', '30360', '600', '0'), +('9', '42', '15', '14679', '580', '0'), +('9', '42', '20', '11676', '8690', '0'), +('9', '42', '20', '11601', '7122', '0'), +('9', '42', '20', '2922', '4899', '0'), +('9', '42', '20', '1365', '4200', '0'), +('9', '42', '12', '11624', '1104', '0'), +('9', '42', '12', '20655', '776', '0'), +('9', '42', '12', '4835', '740', '0'), +('9', '42', '12', '4905', '729', '0'), +('9', '42', '18', '4412', '633', '0'), +('9', '42', '18', '4836', '509', '0'), +('9', '42', '18', '4906', '388', '0'), +('9', '42', '18', '3171', '306', '0'), +('9', '42', '19', '1534', '1276', '0'), +('9', '42', '19', '4837', '1024', '0'), +('9', '42', '19', '68239', '481', '0'), +('9', '42', '19', '4907', '392', '0'), +('9', '42', '13', '27704', '48077', '0'), +('9', '42', '13', '7257', '41342', '0'), +('9', '42', '13', '11610', '39061', '0'), +('9', '42', '13', '11661', '36394', '0'), +('9', '42', '14', '6952', '25785', '0'), +('9', '42', '14', '5500', '23715', '0'), +('9', '42', '14', '7257', '23041', '0'), +('9', '42', '14', '11557', '22800', '0'), +('9', '42', '11', '45137', '15957', '0'), +('9', '42', '11', '8325', '14120', '0'), +('9', '42', '11', '8408', '14050', '0'), +('9', '42', '11', '8811', '11040', '0'), +('9', '43', '22', '8567', '0', '0'), +('9', '43', '22', '10323', '0', '0'), +('9', '43', '22', '66166', '0', '0'), +('9', '43', '22', '10664', '0', '0'), +('9', '43', '1', '30361', '1140', '0'), +('9', '43', '1', '14701', '362', '0'), +('9', '43', '1', '10165', '313', '0'), +('9', '43', '1', '14658', '258', '0'), +('9', '43', '2', '10142', '1272', '0'), +('9', '43', '2', '4341', '1262', '0'), +('9', '43', '2', '30363', '1200', '0'), +('9', '43', '2', '3040', '1082', '0'), +('9', '43', '3', '14706', '990', '0'), +('9', '43', '3', '14705', '990', '0'), +('9', '43', '3', '27702', '807', '0'), +('9', '43', '3', '14695', '423', '0'), +('9', '43', '5', '30362', '1140', '0'), +('9', '43', '5', '14552', '884', '0'), +('9', '43', '5', '10147', '630', '0'), +('9', '43', '5', '14703', '550', '0'), +('9', '43', '8', '11621', '8325', '0'), +('9', '43', '8', '11551', '1505', '0'), +('9', '43', '8', '3403', '1171', '0'), +('9', '43', '8', '1409', '812', '0'), +('9', '43', '6', '1557', '5310', '0'), +('9', '43', '6', '3309', '517', '0'), +('9', '43', '6', '3165', '512', '0'), +('9', '43', '6', '4165', '362', '0'), +('9', '43', '17', '11623', '1935', '0'), +('9', '43', '17', '4832', '1555', '0'), +('9', '43', '17', '4902', '1107', '0'), +('9', '43', '17', '3164', '867', '0'), +('9', '43', '7', '4833', '725', '0'), +('9', '43', '7', '4411', '633', '0'), +('9', '43', '7', '4343', '316', '0'), +('9', '43', '7', '10104', '284', '0'), +('9', '43', '9', '27703', '1840', '0'), +('9', '43', '9', '4834', '920', '0'), +('9', '43', '9', '4904', '574', '0'), +('9', '43', '9', '13280', '493', '0'), +('9', '43', '15', '14707', '1050', '0'), +('9', '43', '15', '10366', '805', '0'), +('9', '43', '15', '30360', '600', '0'), +('9', '43', '15', '14679', '580', '0'), +('9', '43', '20', '11676', '8690', '0'), +('9', '43', '20', '11601', '7126', '0'), +('9', '43', '20', '2922', '4899', '0'), +('9', '43', '20', '1365', '4200', '0'), +('9', '43', '12', '11624', '1107', '0'), +('9', '43', '12', '20655', '777', '0'), +('9', '43', '12', '4835', '743', '0'), +('9', '43', '12', '4905', '729', '0'), +('9', '43', '18', '4412', '633', '0'), +('9', '43', '18', '4836', '511', '0'), +('9', '43', '18', '4906', '388', '0'), +('9', '43', '18', '3171', '308', '0'), +('9', '43', '19', '1534', '1276', '0'), +('9', '43', '19', '4837', '1024', '0'), +('9', '43', '19', '68239', '481', '0'), +('9', '43', '19', '4907', '392', '0'), +('9', '43', '13', '27704', '48815', '0'), +('9', '43', '13', '7257', '42140', '0'), +('9', '43', '13', '11610', '39859', '0'), +('9', '43', '13', '11661', '37009', '0'), +('9', '43', '14', '6952', '25785', '0'), +('9', '43', '14', '5500', '23715', '0'), +('9', '43', '14', '7257', '23041', '0'), +('9', '43', '14', '11557', '22800', '0'), +('9', '43', '11', '45137', '16278', '0'), +('9', '43', '11', '8325', '14120', '0'), +('9', '43', '11', '8408', '14050', '0'), +('9', '43', '11', '8811', '11040', '0'), +('9', '44', '22', '8567', '0', '0'), +('9', '44', '22', '10323', '0', '0'), +('9', '44', '22', '66166', '0', '0'), +('9', '44', '22', '10664', '0', '0'), +('9', '44', '1', '30361', '1140', '0'), +('9', '44', '1', '14701', '362', '0'), +('9', '44', '1', '10165', '313', '0'), +('9', '44', '1', '14658', '258', '0'), +('9', '44', '2', '10142', '1272', '0'), +('9', '44', '2', '4341', '1262', '0'), +('9', '44', '2', '30363', '1200', '0'), +('9', '44', '2', '3040', '1082', '0'), +('9', '44', '3', '14706', '990', '0'), +('9', '44', '3', '14705', '990', '0'), +('9', '44', '3', '27702', '807', '0'), +('9', '44', '3', '14695', '423', '0'), +('9', '44', '5', '30362', '1140', '0'), +('9', '44', '5', '14552', '884', '0'), +('9', '44', '5', '10147', '630', '0'), +('9', '44', '5', '14703', '550', '0'), +('9', '44', '8', '11621', '8325', '0'), +('9', '44', '8', '11551', '1505', '0'), +('9', '44', '8', '3403', '1171', '0'), +('9', '44', '8', '1409', '812', '0'), +('9', '44', '6', '1557', '5310', '0'), +('9', '44', '6', '3309', '517', '0'), +('9', '44', '6', '3165', '512', '0'), +('9', '44', '6', '4165', '362', '0'), +('9', '44', '17', '11623', '1935', '0'), +('9', '44', '17', '4832', '1561', '0'), +('9', '44', '17', '4902', '1107', '0'), +('9', '44', '17', '3164', '867', '0'), +('9', '44', '7', '4833', '725', '0'), +('9', '44', '7', '4411', '633', '0'), +('9', '44', '7', '4343', '320', '0'), +('9', '44', '7', '10104', '284', '0'), +('9', '44', '9', '27703', '1840', '0'), +('9', '44', '9', '4834', '920', '0'), +('9', '44', '9', '4904', '574', '0'), +('9', '44', '9', '13280', '493', '0'), +('9', '44', '15', '14707', '1050', '0'), +('9', '44', '15', '10366', '805', '0'), +('9', '44', '15', '30360', '600', '0'), +('9', '44', '15', '14679', '580', '0'), +('9', '44', '20', '11676', '8690', '0'), +('9', '44', '20', '11601', '7130', '0'), +('9', '44', '20', '2922', '4899', '0'), +('9', '44', '20', '1365', '4200', '0'), +('9', '44', '12', '11624', '1110', '0'), +('9', '44', '12', '20655', '778', '0'), +('9', '44', '12', '4835', '745', '0'), +('9', '44', '12', '4905', '729', '0'), +('9', '44', '18', '4412', '633', '0'), +('9', '44', '18', '4836', '513', '0'), +('9', '44', '18', '4906', '388', '0'), +('9', '44', '18', '3171', '310', '0'), +('9', '44', '19', '1534', '1276', '0'), +('9', '44', '19', '4837', '1024', '0'), +('9', '44', '19', '68239', '481', '0'), +('9', '44', '19', '4907', '392', '0'), +('9', '44', '13', '27704', '49560', '0'), +('9', '44', '13', '7257', '42948', '0'), +('9', '44', '13', '11610', '40667', '0'), +('9', '44', '13', '11661', '37632', '0'), +('9', '44', '14', '6952', '25785', '0'), +('9', '44', '14', '5500', '23715', '0'), +('9', '44', '14', '7257', '23041', '0'), +('9', '44', '14', '11557', '22800', '0'), +('9', '44', '11', '45137', '16799', '0'), +('9', '44', '11', '8325', '14120', '0'), +('9', '44', '11', '8408', '14050', '0'), +('9', '44', '11', '8811', '11040', '0'), +('9', '45', '22', '8567', '0', '0'), +('9', '45', '22', '10323', '0', '0'), +('9', '45', '22', '66166', '0', '0'), +('9', '45', '22', '10664', '0', '0'), +('9', '45', '1', '30361', '1140', '0'), +('9', '45', '1', '14701', '362', '0'), +('9', '45', '1', '10165', '313', '0'), +('9', '45', '1', '14658', '258', '0'), +('9', '45', '2', '10142', '1272', '0'), +('9', '45', '2', '4341', '1262', '0'), +('9', '45', '2', '30363', '1200', '0'), +('9', '45', '2', '3040', '1082', '0'), +('9', '45', '3', '14706', '990', '0'), +('9', '45', '3', '14705', '990', '0'), +('9', '45', '3', '27702', '807', '0'), +('9', '45', '3', '14695', '423', '0'), +('9', '45', '5', '30362', '1140', '0'), +('9', '45', '5', '14552', '884', '0'), +('9', '45', '5', '10147', '630', '0'), +('9', '45', '5', '14703', '550', '0'), +('9', '45', '8', '11621', '8325', '0'), +('9', '45', '8', '11551', '1505', '0'), +('9', '45', '8', '3403', '1171', '0'), +('9', '45', '8', '1409', '812', '0'), +('9', '45', '6', '1557', '5310', '0'), +('9', '45', '6', '3309', '517', '0'), +('9', '45', '6', '3165', '512', '0'), +('9', '45', '6', '4165', '362', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '45', '17', '11623', '1935', '0'), +('9', '45', '17', '4832', '1568', '0'), +('9', '45', '17', '4902', '1107', '0'), +('9', '45', '17', '3164', '867', '0'), +('9', '45', '7', '4833', '725', '0'), +('9', '45', '7', '4411', '633', '0'), +('9', '45', '7', '4343', '324', '0'), +('9', '45', '7', '10104', '284', '0'), +('9', '45', '9', '27703', '1840', '0'), +('9', '45', '9', '4834', '920', '0'), +('9', '45', '9', '4904', '574', '0'), +('9', '45', '9', '13280', '493', '0'), +('9', '45', '15', '14707', '1050', '0'), +('9', '45', '15', '10366', '805', '0'), +('9', '45', '15', '30360', '600', '0'), +('9', '45', '15', '14679', '580', '0'), +('9', '45', '20', '11676', '8690', '0'), +('9', '45', '20', '11601', '7134', '0'), +('9', '45', '20', '2922', '4899', '0'), +('9', '45', '20', '1365', '4200', '0'), +('9', '45', '12', '11624', '1113', '0'), +('9', '45', '12', '20655', '779', '0'), +('9', '45', '12', '4835', '747', '0'), +('9', '45', '12', '4905', '729', '0'), +('9', '45', '18', '4412', '633', '0'), +('9', '45', '18', '4836', '516', '0'), +('9', '45', '18', '4906', '388', '0'), +('9', '45', '18', '3171', '312', '0'), +('9', '45', '19', '1534', '1276', '0'), +('9', '45', '19', '4837', '1024', '0'), +('9', '45', '19', '68239', '481', '0'), +('9', '45', '19', '4907', '392', '0'), +('9', '45', '13', '7510', '54375', '0'), +('9', '45', '13', '27704', '50315', '0'), +('9', '45', '13', '7257', '43765', '0'), +('9', '45', '13', '11610', '41483', '0'), +('9', '45', '14', '6952', '25785', '0'), +('9', '45', '14', '5500', '23715', '0'), +('9', '45', '14', '7257', '23041', '0'), +('9', '45', '14', '11557', '22800', '0'), +('9', '45', '11', '45137', '17101', '0'), +('9', '45', '11', '8325', '14120', '0'), +('9', '45', '11', '8408', '14050', '0'), +('9', '45', '11', '8811', '11040', '0'), +('9', '46', '22', '8567', '0', '0'), +('9', '46', '22', '10323', '0', '0'), +('9', '46', '22', '66166', '0', '0'), +('9', '46', '22', '10664', '0', '0'), +('9', '46', '1', '30361', '1140', '0'), +('9', '46', '1', '14701', '362', '0'), +('9', '46', '1', '10165', '313', '0'), +('9', '46', '1', '14658', '258', '0'), +('9', '46', '2', '10142', '1272', '0'), +('9', '46', '2', '4341', '1262', '0'), +('9', '46', '2', '30363', '1200', '0'), +('9', '46', '2', '3040', '1082', '0'), +('9', '46', '3', '14706', '990', '0'), +('9', '46', '3', '14705', '990', '0'), +('9', '46', '3', '27702', '807', '0'), +('9', '46', '3', '14695', '423', '0'), +('9', '46', '5', '30362', '1140', '0'), +('9', '46', '5', '14552', '884', '0'), +('9', '46', '5', '10147', '630', '0'), +('9', '46', '5', '14703', '550', '0'), +('9', '46', '8', '11621', '8325', '0'), +('9', '46', '8', '11551', '1505', '0'), +('9', '46', '8', '3403', '1171', '0'), +('9', '46', '8', '1409', '812', '0'), +('9', '46', '6', '1557', '5310', '0'), +('9', '46', '6', '3309', '517', '0'), +('9', '46', '6', '3165', '512', '0'), +('9', '46', '6', '4165', '362', '0'), +('9', '46', '17', '11623', '1935', '0'), +('9', '46', '17', '4832', '1574', '0'), +('9', '46', '17', '4902', '1107', '0'), +('9', '46', '17', '3164', '867', '0'), +('9', '46', '7', '4833', '725', '0'), +('9', '46', '7', '4411', '633', '0'), +('9', '46', '7', '4343', '329', '0'), +('9', '46', '7', '10104', '284', '0'), +('9', '46', '9', '27703', '1840', '0'), +('9', '46', '9', '4834', '920', '0'), +('9', '46', '9', '4904', '574', '0'), +('9', '46', '9', '13280', '493', '0'), +('9', '46', '15', '14707', '1050', '0'), +('9', '46', '15', '10366', '805', '0'), +('9', '46', '15', '30360', '600', '0'), +('9', '46', '15', '14679', '580', '0'), +('9', '46', '20', '11676', '8690', '0'), +('9', '46', '20', '11601', '7139', '0'), +('9', '46', '20', '2922', '4899', '0'), +('9', '46', '20', '1365', '4200', '0'), +('9', '46', '12', '11624', '1116', '0'), +('9', '46', '12', '20655', '780', '0'), +('9', '46', '12', '4835', '749', '0'), +('9', '46', '12', '4905', '729', '0'), +('9', '46', '18', '4412', '633', '0'), +('9', '46', '18', '4836', '518', '0'), +('9', '46', '18', '4906', '388', '0'), +('9', '46', '18', '3171', '314', '0'), +('9', '46', '19', '1534', '1276', '0'), +('9', '46', '19', '4837', '1024', '0'), +('9', '46', '19', '68239', '481', '0'), +('9', '46', '19', '4907', '392', '0'), +('9', '46', '13', '7510', '55012', '0'), +('9', '46', '13', '27704', '51078', '0'), +('9', '46', '13', '7257', '44591', '0'), +('9', '46', '13', '11610', '42310', '0'), +('9', '46', '14', '6952', '25785', '0'), +('9', '46', '14', '5500', '23715', '0'), +('9', '46', '14', '7257', '23041', '0'), +('9', '46', '14', '11557', '22800', '0'), +('9', '46', '11', '45137', '17482', '0'), +('9', '46', '11', '8325', '14120', '0'), +('9', '46', '11', '8408', '14050', '0'), +('9', '46', '11', '8811', '11040', '0'), +('9', '47', '22', '8567', '0', '0'), +('9', '47', '22', '10323', '0', '0'), +('9', '47', '22', '66166', '0', '0'), +('9', '47', '22', '10664', '0', '0'), +('9', '47', '1', '30361', '1140', '0'), +('9', '47', '1', '14701', '362', '0'), +('9', '47', '1', '10165', '313', '0'), +('9', '47', '1', '14658', '258', '0'), +('9', '47', '2', '10142', '1272', '0'), +('9', '47', '2', '4341', '1262', '0'), +('9', '47', '2', '30363', '1200', '0'), +('9', '47', '2', '3040', '1082', '0'), +('9', '47', '3', '14706', '990', '0'), +('9', '47', '3', '14705', '990', '0'), +('9', '47', '3', '27702', '807', '0'), +('9', '47', '3', '14695', '423', '0'), +('9', '47', '5', '30362', '1140', '0'), +('9', '47', '5', '14552', '884', '0'), +('9', '47', '5', '10147', '630', '0'), +('9', '47', '5', '14703', '550', '0'), +('9', '47', '8', '11621', '8325', '0'), +('9', '47', '8', '11551', '1505', '0'), +('9', '47', '8', '3403', '1171', '0'), +('9', '47', '8', '1409', '812', '0'), +('9', '47', '6', '1557', '5310', '0'), +('9', '47', '6', '3309', '517', '0'), +('9', '47', '6', '3165', '512', '0'), +('9', '47', '6', '4165', '362', '0'), +('9', '47', '17', '11623', '1935', '0'), +('9', '47', '17', '4832', '1580', '0'), +('9', '47', '17', '4902', '1107', '0'), +('9', '47', '17', '3164', '867', '0'), +('9', '47', '7', '4833', '725', '0'), +('9', '47', '7', '4411', '633', '0'), +('9', '47', '7', '4343', '333', '0'), +('9', '47', '7', '10104', '284', '0'), +('9', '47', '9', '27703', '1840', '0'), +('9', '47', '9', '4834', '920', '0'), +('9', '47', '9', '4904', '574', '0'), +('9', '47', '9', '13280', '493', '0'), +('9', '47', '15', '14707', '1050', '0'), +('9', '47', '15', '10366', '805', '0'), +('9', '47', '15', '30360', '600', '0'), +('9', '47', '15', '14679', '580', '0'), +('9', '47', '20', '11676', '8690', '0'), +('9', '47', '20', '11601', '7143', '0'), +('9', '47', '20', '2922', '4899', '0'), +('9', '47', '20', '1365', '4200', '0'), +('9', '47', '12', '11624', '1119', '0'), +('9', '47', '12', '20655', '780', '0'), +('9', '47', '12', '4835', '751', '0'), +('9', '47', '12', '4905', '729', '0'), +('9', '47', '18', '4412', '633', '0'), +('9', '47', '18', '4836', '520', '0'), +('9', '47', '18', '4906', '388', '0'), +('9', '47', '18', '3171', '316', '0'), +('9', '47', '19', '1534', '1276', '0'), +('9', '47', '19', '4837', '1024', '0'), +('9', '47', '19', '68239', '481', '0'), +('9', '47', '19', '4907', '392', '0'), +('9', '47', '13', '7510', '55657', '0'), +('9', '47', '13', '27704', '51850', '0'), +('9', '47', '13', '7257', '45426', '0'), +('9', '47', '13', '11610', '43145', '0'), +('9', '47', '14', '6952', '25785', '0'), +('9', '47', '14', '5500', '23715', '0'), +('9', '47', '14', '7257', '23041', '0'), +('9', '47', '14', '11557', '22800', '0'), +('9', '47', '11', '45137', '17804', '0'), +('9', '47', '11', '8325', '14120', '0'), +('9', '47', '11', '8408', '14050', '0'), +('9', '47', '11', '8811', '11040', '0'), +('9', '48', '22', '8567', '0', '0'), +('9', '48', '22', '10323', '0', '0'), +('9', '48', '22', '66166', '0', '0'), +('9', '48', '22', '10664', '0', '0'), +('9', '48', '1', '30361', '1140', '0'), +('9', '48', '1', '14701', '362', '0'), +('9', '48', '1', '10165', '313', '0'), +('9', '48', '1', '14658', '258', '0'), +('9', '48', '2', '10142', '1272', '0'), +('9', '48', '2', '4341', '1262', '0'), +('9', '48', '2', '30363', '1200', '0'), +('9', '48', '2', '3040', '1082', '0'), +('9', '48', '3', '14706', '990', '0'), +('9', '48', '3', '14705', '990', '0'), +('9', '48', '3', '27702', '807', '0'), +('9', '48', '3', '14695', '423', '0'), +('9', '48', '5', '30362', '1140', '0'), +('9', '48', '5', '14552', '884', '0'), +('9', '48', '5', '10147', '630', '0'), +('9', '48', '5', '14703', '550', '0'), +('9', '48', '8', '11621', '8325', '0'), +('9', '48', '8', '11551', '1505', '0'), +('9', '48', '8', '3403', '1171', '0'), +('9', '48', '8', '1409', '812', '0'), +('9', '48', '6', '1557', '5310', '0'), +('9', '48', '6', '3309', '517', '0'), +('9', '48', '6', '3165', '512', '0'), +('9', '48', '6', '4165', '362', '0'), +('9', '48', '17', '11623', '1935', '0'), +('9', '48', '17', '4832', '1588', '0'), +('9', '48', '17', '4902', '1107', '0'), +('9', '48', '17', '3164', '867', '0'), +('9', '48', '7', '4833', '725', '0'), +('9', '48', '7', '4411', '633', '0'), +('9', '48', '7', '4343', '338', '0'), +('9', '48', '7', '10104', '284', '0'), +('9', '48', '9', '27703', '1840', '0'), +('9', '48', '9', '4834', '920', '0'), +('9', '48', '9', '4904', '574', '0'), +('9', '48', '9', '13280', '493', '0'), +('9', '48', '15', '14707', '1050', '0'), +('9', '48', '15', '10366', '805', '0'), +('9', '48', '15', '30360', '600', '0'), +('9', '48', '15', '14679', '580', '0'), +('9', '48', '20', '11676', '8690', '0'), +('9', '48', '20', '11601', '7148', '0'), +('9', '48', '20', '2922', '4899', '0'), +('9', '48', '20', '1365', '4200', '0'), +('9', '48', '12', '11624', '1123', '0'), +('9', '48', '12', '20655', '781', '0'), +('9', '48', '12', '4835', '753', '0'), +('9', '48', '12', '4905', '729', '0'), +('9', '48', '18', '4412', '633', '0'), +('9', '48', '18', '4836', '522', '0'), +('9', '48', '18', '4906', '388', '0'), +('9', '48', '18', '3171', '319', '0'), +('9', '48', '19', '1534', '1276', '0'), +('9', '48', '19', '4837', '1024', '0'), +('9', '48', '19', '68239', '481', '0'), +('9', '48', '19', '4907', '392', '0'), +('9', '48', '13', '7510', '56308', '0'), +('9', '48', '13', '27704', '52631', '0'), +('9', '48', '13', '7257', '46271', '0'), +('9', '48', '13', '11610', '43990', '0'), +('9', '48', '14', '6952', '25785', '0'), +('9', '48', '14', '5500', '23715', '0'), +('9', '48', '14', '7257', '23041', '0'), +('9', '48', '14', '11557', '22800', '0'), +('9', '48', '11', '45137', '18327', '0'), +('9', '48', '11', '8325', '14120', '0'), +('9', '48', '11', '8408', '14050', '0'), +('9', '48', '11', '8811', '11040', '0'), +('9', '49', '22', '8567', '0', '0'), +('9', '49', '22', '10323', '0', '0'), +('9', '49', '22', '66166', '0', '0'), +('9', '49', '22', '10664', '0', '0'), +('9', '49', '1', '30361', '1140', '0'), +('9', '49', '1', '14701', '362', '0'), +('9', '49', '1', '10165', '313', '0'), +('9', '49', '1', '14658', '258', '0'), +('9', '49', '2', '10142', '1272', '0'), +('9', '49', '2', '4341', '1262', '0'), +('9', '49', '2', '30363', '1200', '0'), +('9', '49', '2', '3040', '1082', '0'), +('9', '49', '3', '14706', '990', '0'), +('9', '49', '3', '14705', '990', '0'), +('9', '49', '3', '27702', '807', '0'), +('9', '49', '3', '14695', '423', '0'), +('9', '49', '5', '30362', '1140', '0'), +('9', '49', '5', '14552', '884', '0'), +('9', '49', '5', '10147', '630', '0'), +('9', '49', '5', '14703', '550', '0'), +('9', '49', '8', '11621', '8325', '0'), +('9', '49', '8', '11551', '1505', '0'), +('9', '49', '8', '3403', '1171', '0'), +('9', '49', '8', '1409', '812', '0'), +('9', '49', '6', '1557', '5310', '0'), +('9', '49', '6', '3309', '517', '0'), +('9', '49', '6', '3165', '512', '0'), +('9', '49', '6', '4165', '362', '0'), +('9', '49', '17', '11623', '1935', '0'), +('9', '49', '17', '4832', '1594', '0'), +('9', '49', '17', '4902', '1107', '0'), +('9', '49', '17', '3164', '867', '0'), +('9', '49', '7', '4833', '725', '0'), +('9', '49', '7', '4411', '633', '0'), +('9', '49', '7', '4343', '342', '0'), +('9', '49', '7', '10104', '284', '0'), +('9', '49', '9', '27703', '1840', '0'), +('9', '49', '9', '4834', '920', '0'), +('9', '49', '9', '4904', '574', '0'), +('9', '49', '9', '13280', '493', '0'), +('9', '49', '15', '14707', '1050', '0'), +('9', '49', '15', '10366', '805', '0'), +('9', '49', '15', '30360', '600', '0'), +('9', '49', '15', '14679', '580', '0'), +('9', '49', '20', '11676', '8690', '0'), +('9', '49', '20', '11601', '7152', '0'), +('9', '49', '20', '2922', '4899', '0'), +('9', '49', '20', '1365', '4200', '0'), +('9', '49', '12', '11624', '1126', '0'), +('9', '49', '12', '20655', '782', '0'), +('9', '49', '12', '4835', '755', '0'), +('9', '49', '12', '4905', '729', '0'), +('9', '49', '18', '4412', '633', '0'), +('9', '49', '18', '4836', '524', '0'), +('9', '49', '18', '4906', '388', '0'), +('9', '49', '18', '3171', '321', '0'), +('9', '49', '19', '1534', '1276', '0'), +('9', '49', '19', '4837', '1024', '0'), +('9', '49', '19', '68239', '481', '0'), +('9', '49', '19', '4907', '392', '0'), +('9', '49', '13', '7510', '56967', '0'), +('9', '49', '13', '27704', '53420', '0'), +('9', '49', '13', '7257', '47126', '0'), +('9', '49', '13', '11610', '44844', '0'), +('9', '49', '14', '6952', '25785', '0'), +('9', '49', '14', '5500', '23715', '0'), +('9', '49', '14', '7257', '23041', '0'), +('9', '49', '14', '11557', '22800', '0'), +('9', '49', '11', '45137', '18629', '0'), +('9', '49', '11', '8325', '14120', '0'), +('9', '49', '11', '8408', '14050', '0'), +('9', '49', '11', '8811', '11040', '0'), +('9', '50', '22', '8567', '0', '0'), +('9', '50', '22', '10323', '0', '0'), +('9', '50', '22', '66166', '0', '0'), +('9', '50', '22', '10664', '0', '0'), +('9', '50', '1', '30361', '1140', '0'), +('9', '50', '1', '14701', '362', '0'), +('9', '50', '1', '10165', '313', '0'), +('9', '50', '1', '14658', '258', '0'), +('9', '50', '2', '10142', '1272', '0'), +('9', '50', '2', '4341', '1262', '0'), +('9', '50', '2', '30363', '1200', '0'), +('9', '50', '2', '3040', '1082', '0'), +('9', '50', '3', '14706', '990', '0'), +('9', '50', '3', '14705', '990', '0'), +('9', '50', '3', '27702', '807', '0'), +('9', '50', '3', '14695', '423', '0'), +('9', '50', '5', '30362', '1140', '0'), +('9', '50', '5', '14552', '884', '0'), +('9', '50', '5', '10147', '630', '0'), +('9', '50', '5', '14703', '550', '0'), +('9', '50', '8', '11621', '8325', '0'), +('9', '50', '8', '11551', '1505', '0'), +('9', '50', '8', '3403', '1171', '0'), +('9', '50', '8', '1409', '812', '0'), +('9', '50', '6', '1557', '5310', '0'), +('9', '50', '6', '3309', '517', '0'), +('9', '50', '6', '3165', '512', '0'), +('9', '50', '6', '4165', '362', '0'), +('9', '50', '17', '11623', '1935', '0'), +('9', '50', '17', '4832', '1600', '0'), +('9', '50', '17', '4902', '1107', '0'), +('9', '50', '17', '3164', '867', '0'), +('9', '50', '7', '4833', '725', '0'), +('9', '50', '7', '4411', '633', '0'), +('9', '50', '7', '4343', '346', '0'), +('9', '50', '7', '10104', '284', '0'), +('9', '50', '9', '27703', '1840', '0'), +('9', '50', '9', '4834', '920', '0'), +('9', '50', '9', '4904', '574', '0'), +('9', '50', '9', '13280', '493', '0'), +('9', '50', '15', '14707', '1050', '0'), +('9', '50', '15', '10366', '805', '0'), +('9', '50', '15', '30360', '600', '0'), +('9', '50', '15', '14679', '580', '0'), +('9', '50', '20', '11676', '8690', '0'), +('9', '50', '20', '11601', '7156', '0'), +('9', '50', '20', '2922', '4899', '0'), +('9', '50', '20', '1365', '4200', '0'), +('9', '50', '12', '11624', '1129', '0'), +('9', '50', '12', '20655', '783', '0'), +('9', '50', '12', '4835', '758', '0'), +('9', '50', '12', '4905', '729', '0'), +('9', '50', '18', '4412', '633', '0'), +('9', '50', '18', '4836', '526', '0'), +('9', '50', '18', '4906', '388', '0'), +('9', '50', '18', '3171', '323', '0'), +('9', '50', '19', '1534', '1276', '0'), +('9', '50', '19', '4837', '1024', '0'), +('9', '50', '19', '68239', '481', '0'), +('9', '50', '19', '4907', '392', '0'), +('9', '50', '13', '7510', '57633', '0'), +('9', '50', '13', '27704', '54217', '0'), +('9', '50', '13', '7257', '47989', '0'), +('9', '50', '13', '11610', '45708', '0'), +('9', '50', '14', '6952', '25785', '0'), +('9', '50', '14', '5500', '23715', '0'), +('9', '50', '14', '7257', '23041', '0'), +('9', '50', '14', '11557', '22800', '0'), +('9', '50', '11', '45137', '19011', '0'), +('9', '50', '11', '8325', '14120', '0'), +('9', '50', '11', '8408', '14050', '0'), +('9', '50', '11', '8811', '11040', '0'), +('9', '51', '22', '8567', '0', '0'), +('9', '51', '22', '10323', '0', '0'), +('9', '51', '22', '66166', '0', '0'), +('9', '51', '22', '10664', '0', '0'), +('9', '51', '1', '30361', '1140', '0'), +('9', '51', '1', '27822', '481', '0'), +('9', '51', '1', '14701', '362', '0'), +('9', '51', '1', '10165', '313', '0'), +('9', '51', '2', '10142', '1272', '0'), +('9', '51', '2', '4341', '1262', '0'), +('9', '51', '2', '30363', '1200', '0'), +('9', '51', '2', '3040', '1082', '0'), +('9', '51', '3', '14706', '990', '0'), +('9', '51', '3', '14705', '990', '0'), +('9', '51', '3', '27702', '807', '0'), +('9', '51', '3', '14695', '423', '0'), +('9', '51', '5', '30362', '1140', '0'), +('9', '51', '5', '14552', '884', '0'), +('9', '51', '5', '10147', '630', '0'), +('9', '51', '5', '14703', '550', '0'), +('9', '51', '8', '11621', '8325', '0'), +('9', '51', '8', '11551', '1505', '0'), +('9', '51', '8', '3403', '1171', '0'), +('9', '51', '8', '1409', '812', '0'), +('9', '51', '6', '1557', '5310', '0'), +('9', '51', '6', '3309', '517', '0'), +('9', '51', '6', '3165', '512', '0'), +('9', '51', '6', '4165', '362', '0'), +('9', '51', '17', '11623', '1935', '0'), +('9', '51', '17', '4832', '1608', '0'), +('9', '51', '17', '4902', '1107', '0'), +('9', '51', '17', '3164', '867', '0'), +('9', '51', '7', '4833', '725', '0'), +('9', '51', '7', '4411', '633', '0'), +('9', '51', '7', '4343', '351', '0'), +('9', '51', '7', '10104', '284', '0'), +('9', '51', '9', '27703', '1840', '0'), +('9', '51', '9', '4834', '920', '0'), +('9', '51', '9', '4904', '574', '0'), +('9', '51', '9', '13280', '493', '0'), +('9', '51', '15', '14707', '1050', '0'), +('9', '51', '15', '10366', '805', '0'), +('9', '51', '15', '30360', '600', '0'), +('9', '51', '15', '14679', '580', '0'), +('9', '51', '20', '11676', '8690', '0'), +('9', '51', '20', '11601', '7161', '0'), +('9', '51', '20', '2922', '4899', '0'), +('9', '51', '20', '1365', '4200', '0'), +('9', '51', '12', '11624', '1132', '0'), +('9', '51', '12', '20655', '784', '0'), +('9', '51', '12', '4835', '760', '0'), +('9', '51', '12', '4905', '729', '0'), +('9', '51', '18', '4412', '633', '0'), +('9', '51', '18', '4836', '529', '0'), +('9', '51', '18', '4906', '388', '0'), +('9', '51', '18', '3171', '325', '0'), +('9', '51', '19', '1534', '1276', '0'), +('9', '51', '19', '4837', '1024', '0'), +('9', '51', '19', '68239', '481', '0'), +('9', '51', '19', '4907', '392', '0'), +('9', '51', '13', '7510', '58306', '0'), +('9', '51', '13', '27704', '55024', '0'), +('9', '51', '13', '7257', '48862', '0'), +('9', '51', '13', '11610', '46581', '0'), +('9', '51', '14', '6952', '25785', '0'), +('9', '51', '14', '5500', '23715', '0'), +('9', '51', '14', '7257', '23041', '0'), +('9', '51', '14', '11557', '22800', '0'), +('9', '51', '11', '45137', '19314', '0'), +('9', '51', '11', '8325', '14120', '0'), +('9', '51', '11', '8408', '14050', '0'), +('9', '51', '11', '8811', '11040', '0'), +('9', '52', '22', '8567', '0', '0'), +('9', '52', '22', '10323', '0', '0'), +('9', '52', '22', '66166', '0', '0'), +('9', '52', '22', '10664', '0', '0'), +('9', '52', '1', '30361', '1140', '0'), +('9', '52', '1', '27822', '481', '0'), +('9', '52', '1', '14701', '362', '0'), +('9', '52', '1', '10165', '313', '0'), +('9', '52', '2', '10142', '1272', '0'), +('9', '52', '2', '4341', '1262', '0'), +('9', '52', '2', '30363', '1200', '0'), +('9', '52', '2', '3040', '1082', '0'), +('9', '52', '3', '14706', '990', '0'), +('9', '52', '3', '14705', '990', '0'), +('9', '52', '3', '27702', '807', '0'), +('9', '52', '3', '14695', '423', '0'), +('9', '52', '5', '30362', '1140', '0'), +('9', '52', '5', '14552', '884', '0'), +('9', '52', '5', '10147', '630', '0'), +('9', '52', '5', '14703', '550', '0'), +('9', '52', '8', '11621', '8325', '0'), +('9', '52', '8', '11551', '1505', '0'), +('9', '52', '8', '3403', '1171', '0'), +('9', '52', '8', '1409', '812', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '52', '6', '1557', '5310', '0'), +('9', '52', '6', '3309', '517', '0'), +('9', '52', '6', '3165', '512', '0'), +('9', '52', '6', '4165', '362', '0'), +('9', '52', '17', '11623', '1935', '0'), +('9', '52', '17', '4832', '1614', '0'), +('9', '52', '17', '4902', '1107', '0'), +('9', '52', '17', '3164', '867', '0'), +('9', '52', '7', '4833', '725', '0'), +('9', '52', '7', '4411', '633', '0'), +('9', '52', '7', '4343', '355', '0'), +('9', '52', '7', '10104', '284', '0'), +('9', '52', '9', '27703', '1840', '0'), +('9', '52', '9', '4834', '920', '0'), +('9', '52', '9', '4904', '574', '0'), +('9', '52', '9', '13280', '493', '0'), +('9', '52', '15', '14707', '1050', '0'), +('9', '52', '15', '10366', '805', '0'), +('9', '52', '15', '30360', '600', '0'), +('9', '52', '15', '14679', '580', '0'), +('9', '52', '20', '11676', '8690', '0'), +('9', '52', '20', '11601', '7165', '0'), +('9', '52', '20', '2922', '4899', '0'), +('9', '52', '20', '1365', '4200', '0'), +('9', '52', '12', '11624', '1135', '0'), +('9', '52', '12', '20655', '785', '0'), +('9', '52', '12', '4835', '762', '0'), +('9', '52', '12', '4905', '729', '0'), +('9', '52', '18', '4412', '633', '0'), +('9', '52', '18', '4836', '531', '0'), +('9', '52', '18', '4906', '388', '0'), +('9', '52', '18', '3171', '328', '0'), +('9', '52', '19', '1534', '1276', '0'), +('9', '52', '19', '4837', '1024', '0'), +('9', '52', '19', '68239', '481', '0'), +('9', '52', '19', '4907', '392', '0'), +('9', '52', '13', '7510', '58987', '0'), +('9', '52', '13', '27704', '55839', '0'), +('9', '52', '13', '7257', '49745', '0'), +('9', '52', '13', '11610', '47463', '0'), +('9', '52', '14', '6952', '25785', '0'), +('9', '52', '14', '5500', '23715', '0'), +('9', '52', '14', '7257', '23041', '0'), +('9', '52', '14', '11557', '22800', '0'), +('9', '52', '11', '45137', '19856', '0'), +('9', '52', '11', '8325', '14120', '0'), +('9', '52', '11', '8408', '14050', '0'), +('9', '52', '11', '8811', '11040', '0'), +('9', '53', '22', '8567', '0', '0'), +('9', '53', '22', '10323', '0', '0'), +('9', '53', '22', '66166', '0', '0'), +('9', '53', '22', '10664', '0', '0'), +('9', '53', '1', '30361', '1140', '0'), +('9', '53', '1', '27822', '481', '0'), +('9', '53', '1', '14701', '362', '0'), +('9', '53', '1', '10165', '313', '0'), +('9', '53', '2', '10142', '1272', '0'), +('9', '53', '2', '4341', '1262', '0'), +('9', '53', '2', '30363', '1200', '0'), +('9', '53', '2', '3040', '1082', '0'), +('9', '53', '3', '14706', '990', '0'), +('9', '53', '3', '14705', '990', '0'), +('9', '53', '3', '27702', '807', '0'), +('9', '53', '3', '14695', '423', '0'), +('9', '53', '5', '30362', '1140', '0'), +('9', '53', '5', '14552', '884', '0'), +('9', '53', '5', '10147', '630', '0'), +('9', '53', '5', '14703', '550', '0'), +('9', '53', '8', '11621', '8325', '0'), +('9', '53', '8', '11551', '1505', '0'), +('9', '53', '8', '3403', '1171', '0'), +('9', '53', '8', '1409', '812', '0'), +('9', '53', '6', '1557', '5310', '0'), +('9', '53', '6', '3309', '517', '0'), +('9', '53', '6', '3165', '512', '0'), +('9', '53', '6', '4165', '362', '0'), +('9', '53', '17', '11623', '1935', '0'), +('9', '53', '17', '4832', '1620', '0'), +('9', '53', '17', '4902', '1107', '0'), +('9', '53', '17', '3164', '867', '0'), +('9', '53', '7', '4833', '725', '0'), +('9', '53', '7', '4411', '633', '0'), +('9', '53', '7', '4343', '359', '0'), +('9', '53', '7', '10104', '284', '0'), +('9', '53', '9', '27703', '1840', '0'), +('9', '53', '9', '4834', '920', '0'), +('9', '53', '9', '4904', '574', '0'), +('9', '53', '9', '13280', '493', '0'), +('9', '53', '15', '14707', '1050', '0'), +('9', '53', '15', '10366', '805', '0'), +('9', '53', '15', '30360', '600', '0'), +('9', '53', '15', '14679', '580', '0'), +('9', '53', '20', '11676', '8690', '0'), +('9', '53', '20', '11601', '7169', '0'), +('9', '53', '20', '2922', '4899', '0'), +('9', '53', '20', '1365', '4200', '0'), +('9', '53', '12', '11624', '1138', '0'), +('9', '53', '12', '20655', '786', '0'), +('9', '53', '12', '4835', '764', '0'), +('9', '53', '12', '4905', '729', '0'), +('9', '53', '18', '4412', '633', '0'), +('9', '53', '18', '4836', '533', '0'), +('9', '53', '18', '4906', '388', '0'), +('9', '53', '18', '3171', '330', '0'), +('9', '53', '19', '1534', '1276', '0'), +('9', '53', '19', '4837', '1024', '0'), +('9', '53', '19', '68239', '481', '0'), +('9', '53', '19', '4907', '392', '0'), +('9', '53', '13', '7510', '59674', '0'), +('9', '53', '13', '27704', '56663', '0'), +('9', '53', '13', '7257', '50636', '0'), +('9', '53', '13', '11610', '48355', '0'), +('9', '53', '14', '6952', '25785', '0'), +('9', '53', '14', '5500', '23715', '0'), +('9', '53', '14', '7257', '23041', '0'), +('9', '53', '14', '11557', '22800', '0'), +('9', '53', '11', '45137', '20159', '0'), +('9', '53', '11', '8325', '14120', '0'), +('9', '53', '11', '8408', '14050', '0'), +('9', '53', '11', '8811', '11040', '0'), +('9', '54', '22', '8567', '0', '0'), +('9', '54', '22', '10323', '0', '0'), +('9', '54', '22', '66166', '0', '0'), +('9', '54', '22', '10664', '0', '0'), +('9', '54', '1', '30361', '1140', '0'), +('9', '54', '1', '27822', '481', '0'), +('9', '54', '1', '14701', '362', '0'), +('9', '54', '1', '10165', '313', '0'), +('9', '54', '2', '10142', '1272', '0'), +('9', '54', '2', '4341', '1262', '0'), +('9', '54', '2', '30363', '1200', '0'), +('9', '54', '2', '3040', '1082', '0'), +('9', '54', '3', '14706', '990', '0'), +('9', '54', '3', '14705', '990', '0'), +('9', '54', '3', '27702', '807', '0'), +('9', '54', '3', '14695', '423', '0'), +('9', '54', '5', '30362', '1140', '0'), +('9', '54', '5', '14552', '884', '0'), +('9', '54', '5', '10147', '630', '0'), +('9', '54', '5', '14703', '550', '0'), +('9', '54', '8', '11621', '8325', '0'), +('9', '54', '8', '11551', '1505', '0'), +('9', '54', '8', '3403', '1171', '0'), +('9', '54', '8', '1409', '812', '0'), +('9', '54', '6', '1557', '5310', '0'), +('9', '54', '6', '3309', '517', '0'), +('9', '54', '6', '3165', '512', '0'), +('9', '54', '6', '4165', '362', '0'), +('9', '54', '17', '11623', '1935', '0'), +('9', '54', '17', '4832', '1627', '0'), +('9', '54', '17', '4902', '1107', '0'), +('9', '54', '17', '3164', '867', '0'), +('9', '54', '7', '4833', '725', '0'), +('9', '54', '7', '4411', '633', '0'), +('9', '54', '7', '4343', '364', '0'), +('9', '54', '7', '10104', '284', '0'), +('9', '54', '9', '27703', '1840', '0'), +('9', '54', '9', '4834', '920', '0'), +('9', '54', '9', '4904', '574', '0'), +('9', '54', '9', '13280', '493', '0'), +('9', '54', '15', '14707', '1050', '0'), +('9', '54', '15', '10366', '805', '0'), +('9', '54', '15', '30360', '600', '0'), +('9', '54', '15', '14679', '580', '0'), +('9', '54', '20', '11676', '8690', '0'), +('9', '54', '20', '11601', '7174', '0'), +('9', '54', '20', '2922', '4899', '0'), +('9', '54', '20', '1365', '4200', '0'), +('9', '54', '12', '11624', '1141', '0'), +('9', '54', '12', '20655', '787', '0'), +('9', '54', '12', '4835', '767', '0'), +('9', '54', '12', '4905', '729', '0'), +('9', '54', '18', '4412', '633', '0'), +('9', '54', '18', '4836', '535', '0'), +('9', '54', '18', '4906', '388', '0'), +('9', '54', '18', '3171', '332', '0'), +('9', '54', '19', '1534', '1276', '0'), +('9', '54', '19', '4837', '1024', '0'), +('9', '54', '19', '68239', '481', '0'), +('9', '54', '19', '4907', '392', '0'), +('9', '54', '13', '7510', '60369', '0'), +('9', '54', '13', '27704', '57495', '0'), +('9', '54', '13', '7257', '51537', '0'), +('9', '54', '13', '11610', '49256', '0'), +('9', '54', '14', '6952', '25785', '0'), +('9', '54', '14', '5500', '23715', '0'), +('9', '54', '14', '7257', '23041', '0'), +('9', '54', '14', '11557', '22800', '0'), +('9', '54', '11', '45137', '20482', '0'), +('9', '54', '11', '8325', '14120', '0'), +('9', '54', '11', '8408', '14050', '0'), +('9', '54', '11', '8811', '11040', '0'), +('9', '55', '22', '8567', '0', '0'), +('9', '55', '22', '10323', '0', '0'), +('9', '55', '22', '66166', '0', '0'), +('9', '55', '22', '10664', '0', '0'), +('9', '55', '1', '30361', '1140', '0'), +('9', '55', '1', '27822', '481', '0'), +('9', '55', '1', '14701', '362', '0'), +('9', '55', '1', '10165', '313', '0'), +('9', '55', '2', '10142', '1272', '0'), +('9', '55', '2', '4341', '1262', '0'), +('9', '55', '2', '30363', '1200', '0'), +('9', '55', '2', '3040', '1082', '0'), +('9', '55', '3', '14706', '990', '0'), +('9', '55', '3', '14705', '990', '0'), +('9', '55', '3', '27702', '807', '0'), +('9', '55', '3', '14695', '423', '0'), +('9', '55', '5', '30362', '1140', '0'), +('9', '55', '5', '14552', '884', '0'), +('9', '55', '5', '10147', '630', '0'), +('9', '55', '5', '14703', '550', '0'), +('9', '55', '8', '11621', '8325', '0'), +('9', '55', '8', '11551', '1505', '0'), +('9', '55', '8', '3403', '1171', '0'), +('9', '55', '8', '1409', '812', '0'), +('9', '55', '6', '1557', '5310', '0'), +('9', '55', '6', '3309', '517', '0'), +('9', '55', '6', '3165', '512', '0'), +('9', '55', '6', '4165', '362', '0'), +('9', '55', '17', '11623', '1935', '0'), +('9', '55', '17', '4832', '1634', '0'), +('9', '55', '17', '4902', '1107', '0'), +('9', '55', '17', '3164', '867', '0'), +('9', '55', '7', '4833', '725', '0'), +('9', '55', '7', '4411', '633', '0'), +('9', '55', '7', '4343', '368', '0'), +('9', '55', '7', '10104', '284', '0'), +('9', '55', '9', '27703', '1840', '0'), +('9', '55', '9', '4834', '920', '0'), +('9', '55', '9', '4904', '574', '0'), +('9', '55', '9', '13280', '493', '0'), +('9', '55', '15', '14707', '1050', '0'), +('9', '55', '15', '10366', '805', '0'), +('9', '55', '15', '30360', '600', '0'), +('9', '55', '15', '14679', '580', '0'), +('9', '55', '20', '11676', '8690', '0'), +('9', '55', '20', '11601', '7178', '0'), +('9', '55', '20', '2922', '4899', '0'), +('9', '55', '20', '1365', '4200', '0'), +('9', '55', '12', '11624', '1144', '0'), +('9', '55', '12', '20655', '788', '0'), +('9', '55', '12', '4835', '769', '0'), +('9', '55', '12', '4905', '729', '0'), +('9', '55', '18', '4412', '633', '0'), +('9', '55', '18', '4836', '538', '0'), +('9', '55', '18', '4906', '388', '0'), +('9', '55', '18', '3171', '334', '0'), +('9', '55', '19', '1534', '1276', '0'), +('9', '55', '19', '4837', '1024', '0'), +('9', '55', '19', '68239', '481', '0'), +('9', '55', '19', '4907', '392', '0'), +('9', '55', '13', '7510', '61071', '0'), +('9', '55', '13', '27704', '58336', '0'), +('9', '55', '13', '7257', '52448', '0'), +('9', '55', '13', '11610', '50167', '0'), +('9', '55', '14', '6952', '25785', '0'), +('9', '55', '14', '5500', '23715', '0'), +('9', '55', '14', '7257', '23041', '0'), +('9', '55', '14', '11557', '22800', '0'), +('9', '55', '11', '45137', '20865', '0'), +('9', '55', '11', '8325', '14120', '0'), +('9', '55', '11', '8408', '14050', '0'), +('9', '55', '11', '8811', '11040', '0'), +('9', '56', '22', '8567', '0', '0'), +('9', '56', '22', '10323', '0', '0'), +('9', '56', '22', '66166', '0', '0'), +('9', '56', '22', '10664', '0', '0'), +('9', '56', '1', '30361', '1140', '0'), +('9', '56', '1', '27822', '481', '0'), +('9', '56', '1', '14701', '362', '0'), +('9', '56', '1', '10165', '313', '0'), +('9', '56', '2', '10142', '1272', '0'), +('9', '56', '2', '4341', '1262', '0'), +('9', '56', '2', '30363', '1200', '0'), +('9', '56', '2', '3040', '1082', '0'), +('9', '56', '3', '14706', '990', '0'), +('9', '56', '3', '14705', '990', '0'), +('9', '56', '3', '27702', '807', '0'), +('9', '56', '3', '14695', '423', '0'), +('9', '56', '5', '30362', '1140', '0'), +('9', '56', '5', '14552', '884', '0'), +('9', '56', '5', '10147', '630', '0'), +('9', '56', '5', '14703', '550', '0'), +('9', '56', '8', '11621', '8325', '0'), +('9', '56', '8', '11551', '1505', '0'), +('9', '56', '8', '3403', '1171', '0'), +('9', '56', '8', '1409', '812', '0'), +('9', '56', '6', '1557', '5310', '0'), +('9', '56', '6', '3309', '517', '0'), +('9', '56', '6', '3165', '512', '0'), +('9', '56', '6', '4165', '362', '0'), +('9', '56', '17', '11623', '1935', '0'), +('9', '56', '17', '4832', '1641', '0'), +('9', '56', '17', '4902', '1107', '0'), +('9', '56', '17', '3164', '867', '0'), +('9', '56', '7', '4833', '725', '0'), +('9', '56', '7', '4411', '633', '0'), +('9', '56', '7', '4343', '373', '0'), +('9', '56', '7', '10104', '284', '0'), +('9', '56', '9', '27703', '1840', '0'), +('9', '56', '9', '4834', '920', '0'), +('9', '56', '9', '4904', '574', '0'), +('9', '56', '9', '13280', '493', '0'), +('9', '56', '15', '14707', '1050', '0'), +('9', '56', '15', '10366', '805', '0'), +('9', '56', '15', '30360', '600', '0'), +('9', '56', '15', '14679', '580', '0'), +('9', '56', '20', '11676', '8690', '0'), +('9', '56', '20', '11601', '7183', '0'), +('9', '56', '20', '2922', '4899', '0'), +('9', '56', '20', '1365', '4200', '0'), +('9', '56', '12', '11624', '1148', '0'), +('9', '56', '12', '20655', '788', '0'), +('9', '56', '12', '4835', '771', '0'), +('9', '56', '12', '4905', '729', '0'), +('9', '56', '18', '4412', '633', '0'), +('9', '56', '18', '4836', '540', '0'), +('9', '56', '18', '4906', '388', '0'), +('9', '56', '18', '3171', '337', '0'), +('9', '56', '19', '1534', '1276', '0'), +('9', '56', '19', '4837', '1024', '0'), +('9', '56', '19', '68239', '481', '0'), +('9', '56', '19', '4907', '392', '0'), +('9', '56', '13', '7510', '61780', '0'), +('9', '56', '13', '27704', '59185', '0'), +('9', '56', '13', '7257', '53368', '0'), +('9', '56', '13', '11610', '51086', '0'), +('9', '56', '14', '6952', '25785', '0'), +('9', '56', '14', '5500', '23715', '0'), +('9', '56', '14', '7257', '23041', '0'), +('9', '56', '14', '11557', '22800', '0'), +('9', '56', '11', '45137', '21168', '0'), +('9', '56', '11', '8325', '14120', '0'), +('9', '56', '11', '8408', '14050', '0'), +('9', '56', '11', '8811', '11040', '0'), +('9', '57', '22', '8567', '0', '0'), +('9', '57', '22', '10323', '0', '0'), +('9', '57', '22', '66166', '0', '0'), +('9', '57', '22', '10664', '0', '0'), +('9', '57', '1', '30361', '1140', '0'), +('9', '57', '1', '27822', '481', '0'), +('9', '57', '1', '14701', '362', '0'), +('9', '57', '1', '10165', '313', '0'), +('9', '57', '2', '10142', '1272', '0'), +('9', '57', '2', '4341', '1262', '0'), +('9', '57', '2', '30363', '1200', '0'), +('9', '57', '2', '3040', '1082', '0'), +('9', '57', '3', '14706', '990', '0'), +('9', '57', '3', '14705', '990', '0'), +('9', '57', '3', '27702', '807', '0'), +('9', '57', '3', '14695', '423', '0'), +('9', '57', '5', '30362', '1140', '0'), +('9', '57', '5', '14552', '884', '0'), +('9', '57', '5', '10147', '630', '0'), +('9', '57', '5', '14703', '550', '0'), +('9', '57', '8', '11621', '8325', '0'), +('9', '57', '8', '11551', '1505', '0'), +('9', '57', '8', '3403', '1171', '0'), +('9', '57', '8', '1409', '812', '0'), +('9', '57', '6', '1557', '5310', '0'), +('9', '57', '6', '3309', '517', '0'), +('9', '57', '6', '3165', '512', '0'), +('9', '57', '6', '4165', '362', '0'), +('9', '57', '17', '11623', '1935', '0'), +('9', '57', '17', '4832', '1647', '0'), +('9', '57', '17', '4902', '1107', '0'), +('9', '57', '17', '3164', '867', '0'), +('9', '57', '7', '4833', '725', '0'), +('9', '57', '7', '4411', '633', '0'), +('9', '57', '7', '4343', '378', '0'), +('9', '57', '7', '10104', '284', '0'), +('9', '57', '9', '27703', '1840', '0'), +('9', '57', '9', '4834', '920', '0'), +('9', '57', '9', '4904', '574', '0'), +('9', '57', '9', '13280', '493', '0'), +('9', '57', '15', '14707', '1050', '0'), +('9', '57', '15', '10366', '805', '0'), +('9', '57', '15', '30360', '600', '0'), +('9', '57', '15', '14679', '580', '0'), +('9', '57', '20', '11676', '8690', '0'), +('9', '57', '20', '11601', '7188', '0'), +('9', '57', '20', '2922', '4899', '0'), +('9', '57', '20', '1365', '4200', '0'), +('9', '57', '12', '11624', '1151', '0'), +('9', '57', '12', '20655', '789', '0'), +('9', '57', '12', '4835', '773', '0'), +('9', '57', '12', '4905', '729', '0'), +('9', '57', '18', '4412', '633', '0'), +('9', '57', '18', '4836', '542', '0'), +('9', '57', '18', '4906', '388', '0'), +('9', '57', '18', '3171', '339', '0'), +('9', '57', '19', '1534', '1276', '0'), +('9', '57', '19', '4837', '1024', '0'), +('9', '57', '19', '68239', '481', '0'), +('9', '57', '19', '4907', '392', '0'), +('9', '57', '13', '7510', '62497', '0'), +('9', '57', '13', '27704', '60044', '0'), +('9', '57', '13', '7257', '54297', '0'), +('9', '57', '13', '11610', '52016', '0'), +('9', '57', '14', '6952', '25785', '0'), +('9', '57', '14', '5500', '23715', '0'), +('9', '57', '14', '7257', '23041', '0'), +('9', '57', '14', '11557', '22800', '0'), +('9', '57', '11', '45137', '21832', '0'), +('9', '57', '11', '8325', '14120', '0'), +('9', '57', '11', '8408', '14050', '0'), +('9', '57', '11', '8811', '11040', '0'), +('9', '58', '22', '8567', '0', '0'), +('9', '58', '22', '10323', '0', '0'), +('9', '58', '22', '66166', '0', '0'), +('9', '58', '22', '10664', '0', '0'), +('9', '58', '1', '30361', '1140', '0'), +('9', '58', '1', '27822', '481', '0'), +('9', '58', '1', '14701', '362', '0'), +('9', '58', '1', '10165', '313', '0'), +('9', '58', '2', '10142', '1272', '0'), +('9', '58', '2', '4341', '1262', '0'), +('9', '58', '2', '30363', '1200', '0'), +('9', '58', '2', '3040', '1082', '0'), +('9', '58', '3', '14706', '990', '0'), +('9', '58', '3', '14705', '990', '0'), +('9', '58', '3', '27702', '807', '0'), +('9', '58', '3', '14695', '423', '0'), +('9', '58', '5', '30362', '1140', '0'), +('9', '58', '5', '14552', '884', '0'), +('9', '58', '5', '10147', '630', '0'), +('9', '58', '5', '14703', '550', '0'), +('9', '58', '8', '11621', '8325', '0'), +('9', '58', '8', '11551', '1505', '0'), +('9', '58', '8', '3403', '1171', '0'), +('9', '58', '8', '1409', '812', '0'), +('9', '58', '6', '1557', '5310', '0'), +('9', '58', '6', '3309', '517', '0'), +('9', '58', '6', '3165', '512', '0'), +('9', '58', '6', '4165', '362', '0'), +('9', '58', '17', '11623', '1935', '0'), +('9', '58', '17', '4832', '1655', '0'), +('9', '58', '17', '4902', '1107', '0'), +('9', '58', '17', '3164', '867', '0'), +('9', '58', '7', '4833', '725', '0'), +('9', '58', '7', '4411', '633', '0'), +('9', '58', '7', '4343', '382', '0'), +('9', '58', '7', '10104', '284', '0'), +('9', '58', '9', '27703', '1840', '0'), +('9', '58', '9', '4834', '920', '0'), +('9', '58', '9', '4904', '574', '0'), +('9', '58', '9', '13280', '493', '0'), +('9', '58', '15', '14707', '1050', '0'), +('9', '58', '15', '10366', '805', '0'), +('9', '58', '15', '30360', '600', '0'), +('9', '58', '15', '14679', '580', '0'), +('9', '58', '20', '11676', '8690', '0'), +('9', '58', '20', '11601', '7192', '0'), +('9', '58', '20', '2922', '4899', '0'), +('9', '58', '20', '1365', '4200', '0'), +('9', '58', '12', '11624', '1154', '0'), +('9', '58', '12', '20655', '790', '0'), +('9', '58', '12', '4835', '776', '0'), +('9', '58', '12', '4905', '729', '0'), +('9', '58', '18', '4412', '633', '0'), +('9', '58', '18', '4836', '545', '0'), +('9', '58', '18', '4906', '388', '0'), +('9', '58', '18', '3171', '341', '0'), +('9', '58', '19', '1534', '1276', '0'), +('9', '58', '19', '4837', '1024', '0'), +('9', '58', '19', '68239', '481', '0'), +('9', '58', '19', '4907', '392', '0'), +('9', '58', '13', '7510', '63220', '0'), +('9', '58', '13', '27704', '60911', '0'), +('9', '58', '13', '7257', '55235', '0'), +('9', '58', '13', '11610', '52954', '0'), +('9', '58', '14', '6952', '25785', '0'), +('9', '58', '14', '5500', '23715', '0'), +('9', '58', '14', '7257', '23041', '0'), +('9', '58', '14', '11557', '22800', '0'), +('9', '58', '11', '45137', '22155', '0'), +('9', '58', '11', '8325', '14120', '0'), +('9', '58', '11', '8408', '14050', '0'), +('9', '58', '11', '8811', '11040', '0'), +('9', '59', '22', '8567', '0', '0'), +('9', '59', '22', '10323', '0', '0'), +('9', '59', '22', '66166', '0', '0'), +('9', '59', '22', '10664', '0', '0'), +('9', '59', '1', '30361', '1140', '0'), +('9', '59', '1', '27822', '481', '0'), +('9', '59', '1', '14701', '362', '0'), +('9', '59', '1', '10165', '313', '0'), +('9', '59', '2', '10142', '1272', '0'), +('9', '59', '2', '4341', '1262', '0'), +('9', '59', '2', '30363', '1200', '0'), +('9', '59', '2', '3040', '1082', '0'), +('9', '59', '3', '14706', '990', '0'), +('9', '59', '3', '14705', '990', '0'), +('9', '59', '3', '27702', '807', '0'), +('9', '59', '3', '14695', '423', '0'), +('9', '59', '5', '30362', '1140', '0'), +('9', '59', '5', '14552', '884', '0'), +('9', '59', '5', '10147', '630', '0'), +('9', '59', '5', '14703', '550', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '59', '8', '11621', '8325', '0'), +('9', '59', '8', '11551', '1505', '0'), +('9', '59', '8', '3403', '1171', '0'), +('9', '59', '8', '1409', '812', '0'), +('9', '59', '6', '1557', '5310', '0'), +('9', '59', '6', '3309', '517', '0'), +('9', '59', '6', '3165', '512', '0'), +('9', '59', '6', '4165', '362', '0'), +('9', '59', '17', '11623', '1935', '0'), +('9', '59', '17', '4832', '1661', '0'), +('9', '59', '17', '4902', '1107', '0'), +('9', '59', '17', '3164', '867', '0'), +('9', '59', '7', '4833', '725', '0'), +('9', '59', '7', '4411', '633', '0'), +('9', '59', '7', '4343', '387', '0'), +('9', '59', '7', '10104', '284', '0'), +('9', '59', '9', '27703', '1840', '0'), +('9', '59', '9', '4834', '920', '0'), +('9', '59', '9', '4904', '574', '0'), +('9', '59', '9', '13280', '493', '0'), +('9', '59', '15', '14707', '1050', '0'), +('9', '59', '15', '10366', '805', '0'), +('9', '59', '15', '30360', '600', '0'), +('9', '59', '15', '14679', '580', '0'), +('9', '59', '20', '11676', '8690', '0'), +('9', '59', '20', '11601', '7197', '0'), +('9', '59', '20', '2922', '4899', '0'), +('9', '59', '20', '1365', '4200', '0'), +('9', '59', '12', '11624', '1157', '0'), +('9', '59', '12', '20655', '791', '0'), +('9', '59', '12', '4835', '778', '0'), +('9', '59', '12', '4905', '729', '0'), +('9', '59', '18', '4412', '633', '0'), +('9', '59', '18', '4836', '547', '0'), +('9', '59', '18', '4906', '388', '0'), +('9', '59', '18', '3171', '343', '0'), +('9', '59', '19', '1534', '1276', '0'), +('9', '59', '19', '4837', '1024', '0'), +('9', '59', '19', '68239', '481', '0'), +('9', '59', '19', '4907', '392', '0'), +('9', '59', '13', '7510', '63951', '0'), +('9', '59', '13', '27704', '61786', '0'), +('9', '59', '13', '7257', '56183', '0'), +('9', '59', '13', '11610', '53902', '0'), +('9', '59', '14', '6952', '25785', '0'), +('9', '59', '14', '5500', '23715', '0'), +('9', '59', '14', '7257', '23041', '0'), +('9', '59', '14', '11557', '22800', '0'), +('9', '59', '11', '45137', '22539', '0'), +('9', '59', '11', '8325', '14120', '0'), +('9', '59', '11', '8408', '14050', '0'), +('9', '59', '11', '8811', '11040', '0'), +('9', '60', '22', '21805', '0', '3'), +('9', '60', '22', '61948', '0', '3'), +('9', '60', '22', '21807', '0', '3'), +('9', '60', '22', '12425', '0', '3'), +('9', '60', '1', '7945', '8905', '3'), +('9', '60', '1', '26775', '5024', '3'), +('9', '60', '1', '28962', '3771', '3'), +('9', '60', '1', '28945', '3505', '3'), +('9', '60', '2', '26025', '8155', '3'), +('9', '60', '2', '2612', '8155', '3'), +('9', '60', '2', '28995', '3910', '3'), +('9', '60', '2', '1630', '3401', '3'), +('9', '60', '3', '26773', '5183', '3'), +('9', '60', '3', '31464', '2872', '3'), +('9', '60', '3', '28963', '2807', '3'), +('9', '60', '3', '51239', '2313', '3'), +('9', '60', '5', '28885', '10215', '3'), +('9', '60', '5', '27266', '9662', '3'), +('9', '60', '5', '8364', '6428', '3'), +('9', '60', '5', '7868', '4014', '3'), +('9', '60', '8', '26766', '10726', '3'), +('9', '60', '8', '31471', '10077', '3'), +('9', '60', '8', '26765', '10063', '3'), +('9', '60', '8', '11621', '8153', '3'), +('9', '60', '6', '28902', '12108', '3'), +('9', '60', '6', '1557', '5251', '3'), +('9', '60', '6', '30551', '4022', '3'), +('9', '60', '6', '31472', '4010', '3'), +('9', '60', '17', '27261', '7905', '3'), +('9', '60', '17', '28951', '2503', '3'), +('9', '60', '17', '7926', '2275', '3'), +('9', '60', '17', '30564', '2199', '3'), +('9', '60', '7', '26771', '7520', '3'), +('9', '60', '7', '7194', '4506', '3'), +('9', '60', '7', '7868', '4014', '3'), +('9', '60', '7', '5854', '3727', '3'), +('9', '60', '9', '31461', '9968', '3'), +('9', '60', '9', '7868', '4014', '3'), +('9', '60', '9', '26584', '3258', '3'), +('9', '60', '9', '28943', '2916', '3'), +('9', '60', '15', '27950', '7106', '3'), +('9', '60', '15', '26757', '4406', '3'), +('9', '60', '15', '26749', '3508', '3'), +('9', '60', '15', '28939', '2662', '3'), +('9', '60', '20', '28890', '9806', '3'), +('9', '60', '20', '31364', '9468', '3'), +('9', '60', '20', '31334', '9413', '3'), +('9', '60', '20', '27963', '9257', '3'), +('9', '60', '12', '25857', '10312', '3'), +('9', '60', '12', '29177', '5160', '3'), +('9', '60', '12', '2746', '4855', '3'), +('9', '60', '12', '28958', '3574', '3'), +('9', '60', '18', '28965', '3012', '3'), +('9', '60', '18', '26750', '2918', '3'), +('9', '60', '18', '26755', '2510', '3'), +('9', '60', '18', '28932', '2212', '3'), +('9', '60', '19', '30569', '10869', '3'), +('9', '60', '19', '51226', '9671', '3'), +('9', '60', '19', '28888', '9614', '3'), +('9', '60', '19', '24616', '9059', '3'), +('9', '60', '13', '1158', '98198', '3'), +('9', '60', '13', '2509', '95638', '3'), +('9', '60', '13', '28805', '83801', '3'), +('9', '60', '13', '51231', '83665', '3'), +('9', '60', '14', '1158', '64099', '3'), +('9', '60', '14', '1154', '61911', '3'), +('9', '60', '14', '2509', '56470', '3'), +('9', '60', '14', '1136', '54544', '3'), +('9', '60', '11', '30539', '40487', '3'), +('9', '60', '11', '28935', '39046', '3'), +('9', '60', '11', '31335', '27996', '3'), +('9', '60', '11', '7904', '27434', '3'), +('9', '60', '22', '66166', '0', '2'), +('9', '60', '22', '10323', '0', '2'), +('9', '60', '22', '9248', '0', '2'), +('9', '60', '22', '12425', '0', '2'), +('9', '60', '1', '2748', '1744', '2'), +('9', '60', '1', '31236', '1494', '2'), +('9', '60', '1', '30361', '1140', '2'), +('9', '60', '1', '5716', '919', '2'), +('9', '60', '2', '2612', '8209', '2'), +('9', '60', '2', '26025', '8209', '2'), +('9', '60', '2', '1630', '3405', '2'), +('9', '60', '2', '29648', '3319', '2'), +('9', '60', '3', '31464', '3088', '2'), +('9', '60', '3', '31233', '2409', '2'), +('9', '60', '3', '25213', '2329', '2'), +('9', '60', '3', '31244', '2097', '2'), +('9', '60', '5', '27266', '9782', '2'), +('9', '60', '5', '31234', '3486', '2'), +('9', '60', '5', '31460', '2414', '2'), +('9', '60', '5', '31318', '2343', '2'), +('9', '60', '8', '31471', '10341', '2'), +('9', '60', '8', '11621', '8182', '2'), +('9', '60', '8', '27261', '7951', '2'), +('9', '60', '8', '22819', '7682', '2'), +('9', '60', '6', '1557', '5261', '2'), +('9', '60', '6', '31472', '4105', '2'), +('9', '60', '6', '31240', '2799', '2'), +('9', '60', '6', '5723', '2485', '2'), +('9', '60', '17', '27261', '7951', '2'), +('9', '60', '17', '27159', '2112', '2'), +('9', '60', '17', '27148', '1843', '2'), +('9', '60', '17', '27137', '1574', '2'), +('9', '60', '7', '5723', '2485', '2'), +('9', '60', '7', '29485', '1695', '2'), +('9', '60', '7', '31381', '1412', '2'), +('9', '60', '7', '31371', '1395', '2'), +('9', '60', '9', '31461', '10145', '2'), +('9', '60', '9', '5723', '2485', '2'), +('9', '60', '9', '31460', '2414', '2'), +('9', '60', '9', '1172', '2234', '2'), +('9', '60', '15', '31231', '2533', '2'), +('9', '60', '15', '25211', '1859', '2'), +('9', '60', '15', '30385', '1464', '2'), +('9', '60', '15', '62373', '1246', '2'), +('9', '60', '20', '31235', '9651', '2'), +('9', '60', '20', '31364', '9646', '2'), +('9', '60', '20', '31334', '9536', '2'), +('9', '60', '20', '31353', '9197', '2'), +('9', '60', '12', '25857', '10431', '2'), +('9', '60', '12', '29177', '5262', '2'), +('9', '60', '12', '2746', '4900', '2'), +('9', '60', '12', '31227', '2863', '2'), +('9', '60', '18', '31371', '1395', '2'), +('9', '60', '18', '31131', '1327', '2'), +('9', '60', '18', '31386', '1101', '2'), +('9', '60', '18', '31332', '1045', '2'), +('9', '60', '19', '24616', '9151', '2'), +('9', '60', '19', '31238', '1828', '2'), +('9', '60', '19', '29455', '1412', '2'), +('9', '60', '19', '1099', '1104', '2'), +('9', '60', '13', '1158', '98338', '2'), +('9', '60', '13', '2509', '95740', '2'), +('9', '60', '13', '11057', '83713', '2'), +('9', '60', '13', '31224', '80113', '2'), +('9', '60', '14', '1158', '64238', '2'), +('9', '60', '14', '1154', '62070', '2'), +('9', '60', '14', '2509', '56572', '2'), +('9', '60', '14', '1136', '54685', '2'), +('9', '60', '11', '31335', '24516', '2'), +('9', '60', '11', '27326', '24489', '2'), +('9', '60', '11', '29433', '24489', '2'), +('9', '60', '11', '27306', '24234', '2'), +('9', '60', '22', '8567', '0', '1'), +('9', '60', '22', '10323', '0', '1'), +('9', '60', '22', '66166', '0', '1'), +('9', '60', '22', '10664', '0', '1'), +('9', '60', '1', '30361', '1140', '1'), +('9', '60', '1', '62234', '1019', '1'), +('9', '60', '1', '5716', '963', '1'), +('9', '60', '1', '10912', '807', '1'), +('9', '60', '2', '1630', '3418', '1'), +('9', '60', '2', '10913', '3020', '1'), +('9', '60', '2', '10142', '1243', '1'), +('9', '60', '2', '11276', '1243', '1'), +('9', '60', '3', '14706', '990', '1'), +('9', '60', '3', '14705', '990', '1'), +('9', '60', '3', '46184', '987', '1'), +('9', '60', '3', '1625', '625', '1'), +('9', '60', '5', '14709', '1156', '1'), +('9', '60', '5', '30362', '1140', '1'), +('9', '60', '5', '30996', '991', '1'), +('9', '60', '5', '10147', '630', '1'), +('9', '60', '8', '11621', '8253', '1'), +('9', '60', '8', '1627', '7871', '1'), +('9', '60', '8', '1619', '6251', '1'), +('9', '60', '8', '5779', '1686', '1'), +('9', '60', '6', '1557', '5286', '1'), +('9', '60', '6', '5723', '2566', '1'), +('9', '60', '6', '5739', '1843', '1'), +('9', '60', '6', '5804', '1382', '1'), +('9', '60', '17', '11623', '1388', '1'), +('9', '60', '17', '4551', '1202', '1'), +('9', '60', '17', '4832', '985', '1'), +('9', '60', '17', '3301', '763', '1'), +('9', '60', '7', '5723', '2566', '1'), +('9', '60', '7', '62046', '1035', '1'), +('9', '60', '7', '5703', '706', '1'), +('9', '60', '7', '28407', '454', '1'), +('9', '60', '9', '5723', '2566', '1'), +('9', '60', '9', '27703', '1578', '1'), +('9', '60', '9', '11584', '997', '1'), +('9', '60', '9', '4834', '801', '1'), +('9', '60', '15', '14707', '1050', '1'), +('9', '60', '15', '5727', '941', '1'), +('9', '60', '15', '62237', '929', '1'), +('9', '60', '15', '10366', '803', '1'), +('9', '60', '20', '11676', '8489', '1'), +('9', '60', '20', '11601', '6791', '1'), +('9', '60', '20', '1620', '6134', '1'), +('9', '60', '20', '1623', '4807', '1'), +('9', '60', '12', '11624', '857', '1'), +('9', '60', '12', '20655', '672', '1'), +('9', '60', '12', '4835', '665', '1'), +('9', '60', '12', '2923', '564', '1'), +('9', '60', '18', '4555', '839', '1'), +('9', '60', '18', '4317', '706', '1'), +('9', '60', '18', '4412', '435', '1'), +('9', '60', '18', '4906', '352', '1'), +('9', '60', '19', '24616', '9381', '1'), +('9', '60', '19', '1534', '999', '1'), +('9', '60', '19', '4837', '973', '1'), +('9', '60', '19', '4920', '923', '1'), +('9', '60', '13', '11057', '84361', '1'), +('9', '60', '13', '62190', '69801', '1'), +('9', '60', '13', '7510', '64689', '1'), +('9', '60', '13', '27704', '62520', '1'), +('9', '60', '14', '6287', '54119', '1'), +('9', '60', '14', '24613', '45675', '1'), +('9', '60', '14', '11057', '45193', '1'), +('9', '60', '14', '10821', '44235', '1'), +('9', '60', '11', '45137', '22736', '1'), +('9', '60', '11', '8325', '14120', '1'), +('9', '60', '11', '8408', '13931', '1'), +('9', '60', '11', '8811', '11040', '1'), +('9', '61', '22', '21805', '0', '3'), +('9', '61', '22', '61948', '0', '3'), +('9', '61', '22', '21807', '0', '3'), +('9', '61', '22', '12425', '0', '3'), +('9', '61', '1', '7945', '8905', '3'), +('9', '61', '1', '26775', '5024', '3'), +('9', '61', '1', '28962', '3771', '3'), +('9', '61', '1', '28945', '3505', '3'), +('9', '61', '2', '26025', '8155', '3'), +('9', '61', '2', '2612', '8155', '3'), +('9', '61', '2', '28995', '3910', '3'), +('9', '61', '2', '1630', '3401', '3'), +('9', '61', '3', '26773', '5183', '3'), +('9', '61', '3', '31464', '2872', '3'), +('9', '61', '3', '28963', '2807', '3'), +('9', '61', '3', '51239', '2313', '3'), +('9', '61', '5', '28885', '10216', '3'), +('9', '61', '5', '27266', '9662', '3'), +('9', '61', '5', '8364', '6428', '3'), +('9', '61', '5', '7868', '4014', '3'), +('9', '61', '8', '26766', '10726', '3'), +('9', '61', '8', '31471', '10077', '3'), +('9', '61', '8', '26765', '10063', '3'), +('9', '61', '8', '11621', '8153', '3'), +('9', '61', '6', '28902', '12108', '3'), +('9', '61', '6', '1557', '5251', '3'), +('9', '61', '6', '30551', '4022', '3'), +('9', '61', '6', '31472', '4010', '3'), +('9', '61', '17', '27261', '7905', '3'), +('9', '61', '17', '28951', '2503', '3'), +('9', '61', '17', '7926', '2275', '3'), +('9', '61', '17', '30564', '2199', '3'), +('9', '61', '7', '26771', '7520', '3'), +('9', '61', '7', '7194', '4506', '3'), +('9', '61', '7', '7868', '4014', '3'), +('9', '61', '7', '5854', '3727', '3'), +('9', '61', '9', '31461', '9968', '3'), +('9', '61', '9', '7868', '4014', '3'), +('9', '61', '9', '26584', '3258', '3'), +('9', '61', '9', '28943', '2916', '3'), +('9', '61', '15', '27950', '7106', '3'), +('9', '61', '15', '26757', '4406', '3'), +('9', '61', '15', '26749', '3508', '3'), +('9', '61', '15', '28939', '2662', '3'), +('9', '61', '20', '28890', '9806', '3'), +('9', '61', '20', '31364', '9468', '3'), +('9', '61', '20', '31334', '9413', '3'), +('9', '61', '20', '27963', '9257', '3'), +('9', '61', '12', '25857', '10312', '3'), +('9', '61', '12', '29177', '5160', '3'), +('9', '61', '12', '2746', '4855', '3'), +('9', '61', '12', '28958', '3574', '3'), +('9', '61', '18', '28965', '3012', '3'), +('9', '61', '18', '26750', '2918', '3'), +('9', '61', '18', '26755', '2510', '3'), +('9', '61', '18', '28932', '2212', '3'), +('9', '61', '19', '30569', '10869', '3'), +('9', '61', '19', '51226', '9671', '3'), +('9', '61', '19', '28888', '9614', '3'), +('9', '61', '19', '24616', '9059', '3'), +('9', '61', '13', '1158', '99559', '3'), +('9', '61', '13', '2509', '97026', '3'), +('9', '61', '13', '28805', '84989', '3'), +('9', '61', '13', '51231', '84927', '3'), +('9', '61', '14', '1158', '64494', '3'), +('9', '61', '14', '1154', '62324', '3'), +('9', '61', '14', '2509', '56743', '3'), +('9', '61', '14', '1136', '54919', '3'), +('9', '61', '11', '30539', '40645', '3'), +('9', '61', '11', '28935', '39211', '3'), +('9', '61', '11', '31335', '27996', '3'), +('9', '61', '11', '7904', '27434', '3'), +('9', '62', '22', '21805', '0', '3'), +('9', '62', '22', '61948', '0', '3'), +('9', '62', '22', '21807', '0', '3'), +('9', '62', '22', '12425', '0', '3'), +('9', '62', '1', '7945', '8905', '3'), +('9', '62', '1', '26775', '5024', '3'), +('9', '62', '1', '28962', '3771', '3'), +('9', '62', '1', '28945', '3505', '3'), +('9', '62', '2', '26025', '8156', '3'), +('9', '62', '2', '2612', '8156', '3'), +('9', '62', '2', '28995', '3910', '3'), +('9', '62', '2', '1630', '3401', '3'), +('9', '62', '3', '26773', '5184', '3'), +('9', '62', '3', '31464', '2872', '3'), +('9', '62', '3', '28963', '2807', '3'), +('9', '62', '3', '51239', '2313', '3'), +('9', '62', '5', '28885', '10216', '3'), +('9', '62', '5', '27266', '9662', '3'), +('9', '62', '5', '8364', '6428', '3'), +('9', '62', '5', '7868', '4014', '3'), +('9', '62', '8', '26766', '10726', '3'), +('9', '62', '8', '31471', '10077', '3'), +('9', '62', '8', '26765', '10063', '3'), +('9', '62', '8', '11621', '8153', '3'), +('9', '62', '6', '28902', '12108', '3'), +('9', '62', '6', '1557', '5251', '3'), +('9', '62', '6', '30551', '4022', '3'), +('9', '62', '6', '31472', '4010', '3'), +('9', '62', '17', '27261', '7905', '3'), +('9', '62', '17', '28951', '2503', '3'), +('9', '62', '17', '7926', '2275', '3'), +('9', '62', '17', '30564', '2199', '3'), +('9', '62', '7', '26771', '7520', '3'), +('9', '62', '7', '7194', '4506', '3'), +('9', '62', '7', '7868', '4014', '3'), +('9', '62', '7', '5854', '3728', '3'), +('9', '62', '9', '31461', '9968', '3'), +('9', '62', '9', '7868', '4014', '3'), +('9', '62', '9', '26584', '3258', '3'), +('9', '62', '9', '28943', '2916', '3'), +('9', '62', '15', '27950', '7106', '3'), +('9', '62', '15', '26757', '4406', '3'), +('9', '62', '15', '26749', '3508', '3'), +('9', '62', '15', '28939', '2662', '3'), +('9', '62', '20', '28890', '9806', '3'), +('9', '62', '20', '31364', '9468', '3'), +('9', '62', '20', '31334', '9413', '3'), +('9', '62', '20', '27963', '9257', '3'), +('9', '62', '12', '25857', '10312', '3'), +('9', '62', '12', '29177', '5160', '3'), +('9', '62', '12', '2746', '4855', '3'), +('9', '62', '12', '28958', '3574', '3'), +('9', '62', '18', '28965', '3012', '3'), +('9', '62', '18', '26750', '2918', '3'), +('9', '62', '18', '26755', '2510', '3'), +('9', '62', '18', '28932', '2212', '3'), +('9', '62', '19', '30569', '10869', '3'), +('9', '62', '19', '51226', '9671', '3'), +('9', '62', '19', '28888', '9614', '3'), +('9', '62', '19', '24616', '9059', '3'), +('9', '62', '13', '1158', '100930', '3'), +('9', '62', '13', '2509', '98424', '3'), +('9', '62', '13', '51231', '86201', '3'), +('9', '62', '13', '28805', '86189', '3'), +('9', '62', '14', '1158', '64888', '3'), +('9', '62', '14', '1154', '62736', '3'), +('9', '62', '14', '2509', '57016', '3'), +('9', '62', '14', '1136', '55294', '3'), +('9', '62', '11', '30539', '40802', '3'), +('9', '62', '11', '28935', '39377', '3'), +('9', '62', '11', '31335', '27996', '3'), +('9', '62', '11', '7904', '27434', '3'), +('9', '63', '22', '21805', '0', '3'), +('9', '63', '22', '61948', '0', '3'), +('9', '63', '22', '21807', '0', '3'), +('9', '63', '22', '12425', '0', '3'), +('9', '63', '1', '7945', '8905', '3'), +('9', '63', '1', '26775', '5024', '3'), +('9', '63', '1', '28962', '3771', '3'), +('9', '63', '1', '28945', '3505', '3'), +('9', '63', '2', '26025', '8156', '3'), +('9', '63', '2', '2612', '8156', '3'), +('9', '63', '2', '28995', '3910', '3'), +('9', '63', '2', '1630', '3401', '3'), +('9', '63', '3', '26773', '5184', '3'), +('9', '63', '3', '31464', '2872', '3'), +('9', '63', '3', '28963', '2807', '3'), +('9', '63', '3', '51239', '2313', '3'), +('9', '63', '5', '28885', '10216', '3'), +('9', '63', '5', '27266', '9662', '3'), +('9', '63', '5', '8364', '6428', '3'), +('9', '63', '5', '7868', '4014', '3'), +('9', '63', '8', '26766', '10726', '3'), +('9', '63', '8', '31471', '10077', '3'), +('9', '63', '8', '26765', '10063', '3'), +('9', '63', '8', '11621', '8153', '3'), +('9', '63', '6', '28902', '12108', '3'), +('9', '63', '6', '1557', '5251', '3'), +('9', '63', '6', '30551', '4022', '3'), +('9', '63', '6', '31472', '4010', '3'), +('9', '63', '17', '27261', '7905', '3'), +('9', '63', '17', '28951', '2503', '3'), +('9', '63', '17', '7926', '2275', '3'), +('9', '63', '17', '30564', '2199', '3'), +('9', '63', '7', '26771', '7520', '3'), +('9', '63', '7', '7194', '4506', '3'), +('9', '63', '7', '7868', '4014', '3'), +('9', '63', '7', '5854', '3728', '3'), +('9', '63', '9', '31461', '9968', '3'), +('9', '63', '9', '7868', '4014', '3'), +('9', '63', '9', '26584', '3259', '3'), +('9', '63', '9', '28943', '2916', '3'), +('9', '63', '15', '27950', '7107', '3'), +('9', '63', '15', '26757', '4406', '3'), +('9', '63', '15', '26749', '3508', '3'), +('9', '63', '15', '28939', '2662', '3'), +('9', '63', '20', '28890', '9806', '3'), +('9', '63', '20', '31364', '9468', '3'), +('9', '63', '20', '31334', '9413', '3'), +('9', '63', '20', '27963', '9257', '3'), +('9', '63', '12', '25857', '10312', '3'), +('9', '63', '12', '29177', '5160', '3'), +('9', '63', '12', '2746', '4855', '3'), +('9', '63', '12', '28958', '3574', '3'), +('9', '63', '18', '28965', '3012', '3'), +('9', '63', '18', '26750', '2918', '3'), +('9', '63', '18', '26755', '2510', '3'), +('9', '63', '18', '28932', '2213', '3'), +('9', '63', '19', '30569', '10869', '3'), +('9', '63', '19', '51226', '9671', '3'), +('9', '63', '19', '28888', '9614', '3'), +('9', '63', '19', '24616', '9059', '3'), +('9', '63', '13', '1158', '102310', '3'), +('9', '63', '13', '2509', '99833', '3'), +('9', '63', '13', '51231', '87487', '3'), +('9', '63', '13', '28805', '87400', '3'), +('9', '63', '14', '1158', '65283', '3'), +('9', '63', '14', '1154', '63149', '3'), +('9', '63', '14', '2509', '57290', '3'), +('9', '63', '14', '1136', '55669', '3'), +('9', '63', '11', '30539', '40960', '3'), +('9', '63', '11', '28935', '39542', '3'), +('9', '63', '11', '31335', '27996', '3'), +('9', '63', '11', '7904', '27434', '3'), +('9', '64', '22', '21805', '0', '3'), +('9', '64', '22', '61948', '0', '3'), +('9', '64', '22', '21807', '0', '3'), +('9', '64', '22', '12425', '0', '3'), +('9', '64', '1', '7945', '8905', '3'), +('9', '64', '1', '26775', '5024', '3'), +('9', '64', '1', '28962', '3771', '3'), +('9', '64', '1', '28945', '3505', '3'), +('9', '64', '2', '26025', '8156', '3'), +('9', '64', '2', '2612', '8156', '3'), +('9', '64', '2', '28995', '3910', '3'), +('9', '64', '2', '1630', '3401', '3'), +('9', '64', '3', '26773', '5184', '3'), +('9', '64', '3', '31464', '2872', '3'), +('9', '64', '3', '28963', '2807', '3'), +('9', '64', '3', '51239', '2313', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '64', '5', '28885', '10216', '3'), +('9', '64', '5', '27266', '9662', '3'), +('9', '64', '5', '8364', '6428', '3'), +('9', '64', '5', '7868', '4014', '3'), +('9', '64', '8', '26766', '10726', '3'), +('9', '64', '8', '31471', '10077', '3'), +('9', '64', '8', '26765', '10063', '3'), +('9', '64', '8', '11621', '8153', '3'), +('9', '64', '6', '28902', '12108', '3'), +('9', '64', '6', '1557', '5251', '3'), +('9', '64', '6', '30551', '4022', '3'), +('9', '64', '6', '31472', '4010', '3'), +('9', '64', '17', '27261', '7905', '3'), +('9', '64', '17', '28951', '2503', '3'), +('9', '64', '17', '7926', '2275', '3'), +('9', '64', '17', '30564', '2200', '3'), +('9', '64', '7', '26771', '7521', '3'), +('9', '64', '7', '7194', '4506', '3'), +('9', '64', '7', '7868', '4014', '3'), +('9', '64', '7', '5854', '3728', '3'), +('9', '64', '9', '31461', '9968', '3'), +('9', '64', '9', '7868', '4014', '3'), +('9', '64', '9', '26584', '3259', '3'), +('9', '64', '9', '28943', '2916', '3'), +('9', '64', '15', '27950', '7107', '3'), +('9', '64', '15', '26757', '4406', '3'), +('9', '64', '15', '26749', '3509', '3'), +('9', '64', '15', '28939', '2662', '3'), +('9', '64', '20', '28890', '9806', '3'), +('9', '64', '20', '31364', '9468', '3'), +('9', '64', '20', '31334', '9413', '3'), +('9', '64', '20', '27963', '9257', '3'), +('9', '64', '12', '25857', '10312', '3'), +('9', '64', '12', '29177', '5160', '3'), +('9', '64', '12', '2746', '4855', '3'), +('9', '64', '12', '28958', '3574', '3'), +('9', '64', '18', '28965', '3012', '3'), +('9', '64', '18', '26750', '2918', '3'), +('9', '64', '18', '26755', '2510', '3'), +('9', '64', '18', '28932', '2213', '3'), +('9', '64', '19', '30569', '10869', '3'), +('9', '64', '19', '51226', '9671', '3'), +('9', '64', '19', '28888', '9615', '3'), +('9', '64', '19', '24616', '9059', '3'), +('9', '64', '13', '1158', '103699', '3'), +('9', '64', '13', '2509', '101252', '3'), +('9', '64', '13', '51231', '88786', '3'), +('9', '64', '13', '28805', '88623', '3'), +('9', '64', '14', '1158', '65677', '3'), +('9', '64', '14', '1154', '63561', '3'), +('9', '64', '14', '2509', '57563', '3'), +('9', '64', '14', '1136', '56044', '3'), +('9', '64', '11', '30539', '41117', '3'), +('9', '64', '11', '28935', '39707', '3'), +('9', '64', '11', '31335', '27996', '3'), +('9', '64', '11', '7904', '27434', '3'), +('9', '65', '22', '21805', '0', '7'), +('9', '65', '22', '61948', '0', '7'), +('9', '65', '22', '66397', '0', '7'), +('9', '65', '22', '21807', '0', '7'), +('9', '65', '1', '68949', '15217', '7'), +('9', '65', '1', '7125', '13612', '7'), +('9', '65', '1', '32106', '11331', '7'), +('9', '65', '1', '69166', '9535', '7'), +('9', '65', '2', '28605', '13577', '7'), +('9', '65', '2', '28648', '13557', '7'), +('9', '65', '2', '26025', '8156', '7'), +('9', '65', '2', '2612', '8156', '7'), +('9', '65', '3', '68753', '8077', '7'), +('9', '65', '3', '69157', '8042', '7'), +('9', '65', '3', '26982', '7729', '7'), +('9', '65', '3', '69069', '7653', '7'), +('9', '65', '5', '28885', '10216', '7'), +('9', '65', '5', '68808', '10080', '7'), +('9', '65', '5', '7769', '9907', '7'), +('9', '65', '5', '27266', '9662', '7'), +('9', '65', '8', '69064', '18028', '7'), +('9', '65', '8', '69165', '17787', '7'), +('9', '65', '8', '69072', '14715', '7'), +('9', '65', '8', '26766', '10726', '7'), +('9', '65', '6', '68757', '16916', '7'), +('9', '65', '6', '13674', '12812', '7'), +('9', '65', '6', '28902', '12108', '7'), +('9', '65', '6', '19144', '10765', '7'), +('9', '65', '17', '69151', '11199', '7'), +('9', '65', '17', '68780', '8173', '7'), +('9', '65', '17', '27261', '7905', '7'), +('9', '65', '17', '14961', '6844', '7'), +('9', '65', '7', '68706', '13614', '7'), +('9', '65', '7', '16097', '10987', '7'), +('9', '65', '7', '26771', '7521', '7'), +('9', '65', '7', '69080', '7217', '7'), +('9', '65', '9', '68766', '12167', '7'), +('9', '65', '9', '11096', '11359', '7'), +('9', '65', '9', '16097', '10987', '7'), +('9', '65', '9', '31461', '9968', '7'), +('9', '65', '15', '9959', '10764', '7'), +('9', '65', '15', '68111', '10535', '7'), +('9', '65', '15', '69160', '8437', '7'), +('9', '65', '15', '69070', '8332', '7'), +('9', '65', '20', '16156', '17157', '7'), +('9', '65', '20', '16097', '10987', '7'), +('9', '65', '20', '69134', '10832', '7'), +('9', '65', '20', '15873', '10673', '7'), +('9', '65', '12', '25857', '10312', '7'), +('9', '65', '12', '28246', '7399', '7'), +('9', '65', '12', '27000', '6243', '7'), +('9', '65', '12', '12598', '5988', '7'), +('9', '65', '18', '69147', '10096', '7'), +('9', '65', '18', '68971', '9183', '7'), +('9', '65', '18', '16717', '7833', '7'), +('9', '65', '18', '68749', '7410', '7'), +('9', '65', '19', '30569', '10869', '7'), +('9', '65', '19', '19094', '10781', '7'), +('9', '65', '19', '51226', '9671', '7'), +('9', '65', '19', '28888', '9615', '7'), +('9', '65', '13', '69115', '159978', '7'), +('9', '65', '13', '69052', '140250', '7'), +('9', '65', '13', '68943', '121685', '7'), +('9', '65', '13', '68770', '115637', '7'), +('9', '65', '14', '69052', '140250', '7'), +('9', '65', '14', '22998', '115321', '7'), +('9', '65', '14', '68419', '97411', '7'), +('9', '65', '14', '69115', '86025', '7'), +('9', '65', '11', '69054', '57040', '7'), +('9', '65', '11', '29596', '42854', '7'), +('9', '65', '11', '30539', '42062', '7'), +('9', '65', '11', '28935', '40697', '7'), +('9', '65', '22', '21805', '0', '6'), +('9', '65', '22', '61948', '0', '6'), +('9', '65', '22', '66397', '0', '6'), +('9', '65', '22', '21807', '0', '6'), +('9', '65', '1', '7125', '13612', '6'), +('9', '65', '1', '32106', '11331', '6'), +('9', '65', '1', '7945', '8905', '6'), +('9', '65', '1', '16255', '6744', '6'), +('9', '65', '2', '28605', '13577', '6'), +('9', '65', '2', '28648', '13557', '6'), +('9', '65', '2', '26025', '8156', '6'), +('9', '65', '2', '2612', '8156', '6'), +('9', '65', '3', '26982', '7729', '6'), +('9', '65', '3', '29174', '6281', '6'), +('9', '65', '3', '12592', '6186', '6'), +('9', '65', '3', '9480', '5926', '6'), +('9', '65', '5', '28885', '10216', '6'), +('9', '65', '5', '7769', '9907', '6'), +('9', '65', '5', '27266', '9662', '6'), +('9', '65', '5', '8785', '9605', '6'), +('9', '65', '8', '26766', '10726', '6'), +('9', '65', '8', '15803', '10257', '6'), +('9', '65', '8', '31471', '10077', '6'), +('9', '65', '8', '26765', '10063', '6'), +('9', '65', '6', '13674', '12812', '6'), +('9', '65', '6', '28902', '12108', '6'), +('9', '65', '6', '19144', '10765', '6'), +('9', '65', '6', '13672', '6199', '6'), +('9', '65', '17', '27261', '7905', '6'), +('9', '65', '17', '14961', '6844', '6'), +('9', '65', '17', '47648', '5454', '6'), +('9', '65', '17', '69403', '5332', '6'), +('9', '65', '7', '16097', '10987', '6'), +('9', '65', '7', '26771', '7521', '6'), +('9', '65', '7', '68197', '6373', '6'), +('9', '65', '7', '11432', '6280', '6'), +('9', '65', '9', '11096', '11359', '6'), +('9', '65', '9', '16097', '10987', '6'), +('9', '65', '9', '31461', '9968', '6'), +('9', '65', '9', '28666', '6208', '6'), +('9', '65', '15', '9959', '10764', '6'), +('9', '65', '15', '68111', '10535', '6'), +('9', '65', '15', '27950', '7107', '6'), +('9', '65', '15', '69389', '6385', '6'), +('9', '65', '20', '16156', '17157', '6'), +('9', '65', '20', '16097', '10987', '6'), +('9', '65', '20', '15873', '10673', '6'), +('9', '65', '20', '28890', '9806', '6'), +('9', '65', '12', '25857', '10312', '6'), +('9', '65', '12', '28246', '7399', '6'), +('9', '65', '12', '27000', '6243', '6'), +('9', '65', '12', '12598', '5988', '6'), +('9', '65', '18', '16717', '7833', '6'), +('9', '65', '18', '28651', '6414', '6'), +('9', '65', '18', '28965', '3012', '6'), +('9', '65', '18', '26750', '2918', '6'), +('9', '65', '19', '30569', '10869', '6'), +('9', '65', '19', '19094', '10781', '6'), +('9', '65', '19', '51226', '9671', '6'), +('9', '65', '19', '28888', '9615', '6'), +('9', '65', '13', '22998', '115321', '6'), +('9', '65', '13', '24695', '114920', '6'), +('9', '65', '13', '24602', '114623', '6'), +('9', '65', '13', '24692', '113619', '6'), +('9', '65', '14', '22998', '115321', '6'), +('9', '65', '14', '22986', '68667', '6'), +('9', '65', '14', '1158', '68044', '6'), +('9', '65', '14', '1154', '66036', '6'), +('9', '65', '11', '29596', '42854', '6'), +('9', '65', '11', '30539', '42062', '6'), +('9', '65', '11', '28935', '40697', '6'), +('9', '65', '11', '55224', '40406', '6'), +('9', '65', '22', '61948', '0', '5'), +('9', '65', '22', '66397', '0', '5'), +('9', '65', '22', '62787', '0', '5'), +('9', '65', '22', '21805', '0', '5'), +('9', '65', '1', '7125', '13612', '5'), +('9', '65', '1', '32106', '11331', '5'), +('9', '65', '1', '7945', '8905', '5'), +('9', '65', '1', '16255', '6744', '5'), +('9', '65', '2', '28605', '13577', '5'), +('9', '65', '2', '28648', '13557', '5'), +('9', '65', '2', '2612', '8156', '5'), +('9', '65', '2', '26025', '8156', '5'), +('9', '65', '3', '26982', '7729', '5'), +('9', '65', '3', '29174', '6281', '5'), +('9', '65', '3', '12592', '6186', '5'), +('9', '65', '3', '9480', '5926', '5'), +('9', '65', '5', '28885', '10216', '5'), +('9', '65', '5', '7769', '9907', '5'), +('9', '65', '5', '27266', '9662', '5'), +('9', '65', '5', '8785', '9605', '5'), +('9', '65', '8', '26766', '10726', '5'), +('9', '65', '8', '15803', '10257', '5'), +('9', '65', '8', '31471', '10077', '5'), +('9', '65', '8', '26765', '10063', '5'), +('9', '65', '6', '13674', '12812', '5'), +('9', '65', '6', '28902', '12108', '5'), +('9', '65', '6', '19144', '10765', '5'), +('9', '65', '6', '13672', '6199', '5'), +('9', '65', '17', '27261', '7905', '5'), +('9', '65', '17', '14961', '6844', '5'), +('9', '65', '17', '47648', '5454', '5'), +('9', '65', '17', '14962', '3264', '5'), +('9', '65', '7', '16097', '10987', '5'), +('9', '65', '7', '26771', '7521', '5'), +('9', '65', '7', '68197', '6373', '5'), +('9', '65', '7', '11432', '6280', '5'), +('9', '65', '9', '11096', '11359', '5'), +('9', '65', '9', '16097', '10987', '5'), +('9', '65', '9', '31461', '9968', '5'), +('9', '65', '9', '28666', '6208', '5'), +('9', '65', '15', '9959', '10764', '5'), +('9', '65', '15', '27950', '7107', '5'), +('9', '65', '15', '69389', '6385', '5'), +('9', '65', '15', '10654', '5191', '5'), +('9', '65', '20', '16156', '17157', '5'), +('9', '65', '20', '16097', '10987', '5'), +('9', '65', '20', '15873', '10673', '5'), +('9', '65', '20', '28890', '9806', '5'), +('9', '65', '12', '25857', '10312', '5'), +('9', '65', '12', '28246', '7399', '5'), +('9', '65', '12', '27000', '6243', '5'), +('9', '65', '12', '12598', '5988', '5'), +('9', '65', '18', '16717', '7833', '5'), +('9', '65', '18', '28651', '6414', '5'), +('9', '65', '18', '28965', '3012', '5'), +('9', '65', '18', '26750', '2918', '5'), +('9', '65', '19', '30569', '10869', '5'), +('9', '65', '19', '19094', '10781', '5'), +('9', '65', '19', '51226', '9671', '5'), +('9', '65', '19', '28888', '9615', '5'), +('9', '65', '13', '22998', '115321', '5'), +('9', '65', '13', '24695', '114920', '5'), +('9', '65', '13', '24602', '114623', '5'), +('9', '65', '13', '24692', '113619', '5'), +('9', '65', '14', '22998', '115321', '5'), +('9', '65', '14', '22986', '68667', '5'), +('9', '65', '14', '1158', '68044', '5'), +('9', '65', '14', '1154', '66036', '5'), +('9', '65', '11', '29596', '42854', '5'), +('9', '65', '11', '30539', '42062', '5'), +('9', '65', '11', '28935', '40697', '5'), +('9', '65', '11', '55224', '40406', '5'), +('9', '65', '22', '61948', '0', '4'), +('9', '65', '22', '66397', '0', '4'), +('9', '65', '22', '62787', '0', '4'), +('9', '65', '22', '21805', '0', '4'), +('9', '65', '1', '7125', '13612', '4'), +('9', '65', '1', '32106', '11331', '4'), +('9', '65', '1', '7945', '8905', '4'), +('9', '65', '1', '16255', '6744', '4'), +('9', '65', '2', '28605', '13577', '4'), +('9', '65', '2', '28648', '13557', '4'), +('9', '65', '2', '2612', '8156', '4'), +('9', '65', '2', '26025', '8156', '4'), +('9', '65', '3', '26982', '7729', '4'), +('9', '65', '3', '29174', '6281', '4'), +('9', '65', '3', '12592', '6186', '4'), +('9', '65', '3', '9480', '5926', '4'), +('9', '65', '5', '28885', '10216', '4'), +('9', '65', '5', '7769', '9907', '4'), +('9', '65', '5', '27266', '9662', '4'), +('9', '65', '5', '8785', '9605', '4'), +('9', '65', '8', '26766', '10726', '4'), +('9', '65', '8', '15803', '10257', '4'), +('9', '65', '8', '31471', '10077', '4'), +('9', '65', '8', '26765', '10063', '4'), +('9', '65', '6', '13674', '12812', '4'), +('9', '65', '6', '28902', '12108', '4'), +('9', '65', '6', '19144', '10765', '4'), +('9', '65', '6', '13672', '6199', '4'), +('9', '65', '17', '27261', '7905', '4'), +('9', '65', '17', '14961', '6844', '4'), +('9', '65', '17', '47648', '5454', '4'), +('9', '65', '17', '14962', '3264', '4'), +('9', '65', '7', '16097', '10987', '4'), +('9', '65', '7', '26771', '7521', '4'), +('9', '65', '7', '68197', '6373', '4'), +('9', '65', '7', '11432', '6280', '4'), +('9', '65', '9', '11096', '11359', '4'), +('9', '65', '9', '16097', '10987', '4'), +('9', '65', '9', '31461', '9968', '4'), +('9', '65', '9', '28666', '6208', '4'), +('9', '65', '15', '9959', '10764', '4'), +('9', '65', '15', '27950', '7107', '4'), +('9', '65', '15', '69389', '6385', '4'), +('9', '65', '15', '10654', '5191', '4'), +('9', '65', '20', '16156', '17157', '4'), +('9', '65', '20', '16097', '10987', '4'), +('9', '65', '20', '15873', '10673', '4'), +('9', '65', '20', '28890', '9806', '4'), +('9', '65', '12', '25857', '10312', '4'), +('9', '65', '12', '28246', '7399', '4'), +('9', '65', '12', '27000', '6243', '4'), +('9', '65', '12', '12598', '5988', '4'), +('9', '65', '18', '16717', '7833', '4'), +('9', '65', '18', '28651', '6414', '4'), +('9', '65', '18', '28965', '3012', '4'), +('9', '65', '18', '26750', '2918', '4'), +('9', '65', '19', '30569', '10869', '4'), +('9', '65', '19', '19094', '10781', '4'), +('9', '65', '19', '51226', '9671', '4'), +('9', '65', '19', '28888', '9615', '4'), +('9', '65', '13', '22998', '115321', '4'), +('9', '65', '13', '24695', '114920', '4'), +('9', '65', '13', '24602', '114623', '4'), +('9', '65', '13', '24692', '113619', '4'), +('9', '65', '14', '22998', '115321', '4'), +('9', '65', '14', '22986', '68667', '4'), +('9', '65', '14', '1158', '68044', '4'), +('9', '65', '14', '1154', '66036', '4'), +('9', '65', '11', '29596', '42854', '4'), +('9', '65', '11', '30539', '42062', '4'), +('9', '65', '11', '28935', '40697', '4'), +('9', '65', '11', '29598', '39856', '4'), +('9', '66', '22', '21805', '0', '7'), +('9', '66', '22', '61948', '0', '7'), +('9', '66', '22', '66397', '0', '7'), +('9', '66', '22', '21807', '0', '7'), +('9', '66', '1', '68949', '15217', '7'), +('9', '66', '1', '7125', '13612', '7'), +('9', '66', '1', '32106', '11331', '7'), +('9', '66', '1', '69166', '9535', '7'), +('9', '66', '2', '28605', '13577', '7'), +('9', '66', '2', '28648', '13557', '7'), +('9', '66', '2', '26025', '8156', '7'), +('9', '66', '2', '2612', '8156', '7'), +('9', '66', '3', '68753', '8077', '7'), +('9', '66', '3', '69157', '8042', '7'), +('9', '66', '3', '26982', '7729', '7'), +('9', '66', '3', '69069', '7653', '7'), +('9', '66', '5', '28885', '10216', '7'), +('9', '66', '5', '68808', '10080', '7'), +('9', '66', '5', '7769', '9907', '7'), +('9', '66', '5', '27266', '9662', '7'), +('9', '66', '8', '69064', '18028', '7'), +('9', '66', '8', '69165', '17787', '7'), +('9', '66', '8', '69072', '14716', '7'), +('9', '66', '8', '26766', '10726', '7'), +('9', '66', '6', '68757', '16916', '7'), +('9', '66', '6', '13674', '12813', '7'), +('9', '66', '6', '28902', '12108', '7'), +('9', '66', '6', '19144', '10765', '7'), +('9', '66', '17', '69151', '11200', '7'), +('9', '66', '17', '68780', '8174', '7'), +('9', '66', '17', '27261', '7905', '7'), +('9', '66', '17', '14961', '6845', '7'), +('9', '66', '7', '68706', '13614', '7'), +('9', '66', '7', '16097', '10987', '7'), +('9', '66', '7', '26771', '7521', '7'), +('9', '66', '7', '69080', '7217', '7'), +('9', '66', '9', '68766', '12167', '7'), +('9', '66', '9', '11096', '11360', '7'), +('9', '66', '9', '16097', '10987', '7'), +('9', '66', '9', '31461', '9968', '7'), +('9', '66', '15', '9959', '10764', '7'), +('9', '66', '15', '68111', '10535', '7'), +('9', '66', '15', '69160', '8437', '7'), +('9', '66', '15', '69070', '8332', '7'), +('9', '66', '20', '16156', '17157', '7'), +('9', '66', '20', '16097', '10987', '7'), +('9', '66', '20', '69134', '10832', '7'), +('9', '66', '20', '15873', '10673', '7'), +('9', '66', '12', '25857', '10312', '7'), +('9', '66', '12', '28246', '7399', '7'), +('9', '66', '12', '27000', '6243', '7'), +('9', '66', '12', '12598', '5988', '7'), +('9', '66', '18', '69147', '10097', '7'), +('9', '66', '18', '68971', '9183', '7'), +('9', '66', '18', '16717', '7833', '7'), +('9', '66', '18', '68749', '7410', '7'), +('9', '66', '19', '30569', '10869', '7'), +('9', '66', '19', '19094', '10782', '7'), +('9', '66', '19', '51226', '9671', '7'), +('9', '66', '19', '28888', '9615', '7'), +('9', '66', '13', '69115', '162182', '7'), +('9', '66', '13', '69052', '141375', '7'), +('9', '66', '13', '68943', '123395', '7'), +('9', '66', '13', '68770', '117269', '7'), +('9', '66', '14', '69052', '141375', '7'), +('9', '66', '14', '22998', '116278', '7'), +('9', '66', '14', '68419', '98349', '7'), +('9', '66', '14', '69115', '86287', '7'), +('9', '66', '11', '69054', '57340', '7'), +('9', '66', '11', '29596', '43019', '7'), +('9', '66', '11', '30539', '42220', '7'), +('9', '66', '11', '28935', '40862', '7'), +('9', '67', '22', '21805', '0', '7'), +('9', '67', '22', '61948', '0', '7'), +('9', '67', '22', '66397', '0', '7'), +('9', '67', '22', '21807', '0', '7'), +('9', '67', '1', '68949', '15217', '7'), +('9', '67', '1', '7125', '13612', '7'), +('9', '67', '1', '32106', '11331', '7'), +('9', '67', '1', '69166', '9535', '7'), +('9', '67', '2', '28605', '13578', '7'), +('9', '67', '2', '28648', '13557', '7'), +('9', '67', '2', '26025', '8156', '7'), +('9', '67', '2', '2612', '8156', '7'), +('9', '67', '3', '68753', '8078', '7'), +('9', '67', '3', '69157', '8042', '7'), +('9', '67', '3', '26982', '7730', '7'), +('9', '67', '3', '69069', '7654', '7'), +('9', '67', '5', '28885', '10216', '7'), +('9', '67', '5', '68808', '10080', '7'), +('9', '67', '5', '7769', '9907', '7'), +('9', '67', '5', '27266', '9663', '7'), +('9', '67', '8', '69064', '18028', '7'), +('9', '67', '8', '69165', '17788', '7'), +('9', '67', '8', '69072', '14716', '7'), +('9', '67', '8', '26766', '10727', '7'), +('9', '67', '6', '68757', '16916', '7'), +('9', '67', '6', '13674', '12813', '7'), +('9', '67', '6', '28902', '12109', '7'), +('9', '67', '6', '19144', '10766', '7'), +('9', '67', '17', '69151', '11200', '7'), +('9', '67', '17', '68780', '8174', '7'), +('9', '67', '17', '27261', '7905', '7'), +('9', '67', '17', '14961', '6845', '7'), +('9', '67', '7', '68706', '13614', '7'), +('9', '67', '7', '16097', '10988', '7'), +('9', '67', '7', '26771', '7521', '7'), +('9', '67', '7', '69080', '7217', '7'), +('9', '67', '9', '68766', '12167', '7'), +('9', '67', '9', '11096', '11360', '7'), +('9', '67', '9', '16097', '10988', '7'), +('9', '67', '9', '31461', '9968', '7'), +('9', '67', '15', '9959', '10764', '7'), +('9', '67', '15', '68111', '10535', '7'), +('9', '67', '15', '69160', '8437', '7'), +('9', '67', '15', '69070', '8332', '7'), +('9', '67', '20', '16156', '17157', '7'), +('9', '67', '20', '16097', '10988', '7'), +('9', '67', '20', '69134', '10832', '7'), +('9', '67', '20', '15873', '10673', '7'), +('9', '67', '12', '25857', '10312', '7'), +('9', '67', '12', '28246', '7399', '7'), +('9', '67', '12', '27000', '6243', '7'), +('9', '67', '12', '12598', '5988', '7'), +('9', '67', '18', '69147', '10097', '7'), +('9', '67', '18', '68971', '9183', '7'), +('9', '67', '18', '16717', '7833', '7'), +('9', '67', '18', '68749', '7410', '7'), +('9', '67', '19', '30569', '10869', '7'), +('9', '67', '19', '19094', '10782', '7'), +('9', '67', '19', '51226', '9671', '7'), +('9', '67', '19', '28888', '9615', '7'), +('9', '67', '13', '69115', '164405', '7'), +('9', '67', '13', '69052', '142500', '7'), +('9', '67', '13', '68943', '125121', '7'), +('9', '67', '13', '68770', '118917', '7'), +('9', '67', '14', '69052', '142500', '7'), +('9', '67', '14', '22998', '117234', '7'), +('9', '67', '14', '68419', '99286', '7'), +('9', '67', '14', '69115', '86550', '7'), +('9', '67', '11', '69054', '57640', '7'), +('9', '67', '11', '29596', '43184', '7'), +('9', '67', '11', '30539', '42378', '7'), +('9', '67', '11', '28935', '41028', '7'), +('9', '68', '22', '21805', '0', '7'), +('9', '68', '22', '61948', '0', '7'), +('9', '68', '22', '66397', '0', '7'), +('9', '68', '22', '21807', '0', '7'), +('9', '68', '1', '68949', '15218', '7'), +('9', '68', '1', '7125', '13612', '7'), +('9', '68', '1', '32106', '11331', '7'), +('9', '68', '1', '69166', '9535', '7'), +('9', '68', '2', '28605', '13578', '7'), +('9', '68', '2', '28648', '13557', '7'), +('9', '68', '2', '26025', '8156', '7'), +('9', '68', '2', '2612', '8156', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '68', '3', '68753', '8078', '7'), +('9', '68', '3', '69157', '8043', '7'), +('9', '68', '3', '26982', '7730', '7'), +('9', '68', '3', '69069', '7654', '7'), +('9', '68', '5', '28885', '10216', '7'), +('9', '68', '5', '68808', '10080', '7'), +('9', '68', '5', '7769', '9907', '7'), +('9', '68', '5', '27266', '9663', '7'), +('9', '68', '8', '69064', '18028', '7'), +('9', '68', '8', '69165', '17788', '7'), +('9', '68', '8', '69072', '14716', '7'), +('9', '68', '8', '26766', '10727', '7'), +('9', '68', '6', '68757', '16917', '7'), +('9', '68', '6', '13674', '12813', '7'), +('9', '68', '6', '28902', '12109', '7'), +('9', '68', '6', '19144', '10766', '7'), +('9', '68', '17', '69151', '11200', '7'), +('9', '68', '17', '68780', '8174', '7'), +('9', '68', '17', '27261', '7905', '7'), +('9', '68', '17', '14961', '6845', '7'), +('9', '68', '7', '68706', '13615', '7'), +('9', '68', '7', '16097', '10988', '7'), +('9', '68', '7', '26771', '7521', '7'), +('9', '68', '7', '69080', '7217', '7'), +('9', '68', '9', '68766', '12167', '7'), +('9', '68', '9', '11096', '11360', '7'), +('9', '68', '9', '16097', '10988', '7'), +('9', '68', '9', '31461', '9969', '7'), +('9', '68', '15', '9959', '10764', '7'), +('9', '68', '15', '68111', '10535', '7'), +('9', '68', '15', '69160', '8437', '7'), +('9', '68', '15', '69070', '8332', '7'), +('9', '68', '20', '16156', '17158', '7'), +('9', '68', '20', '16097', '10988', '7'), +('9', '68', '20', '69134', '10832', '7'), +('9', '68', '20', '15873', '10673', '7'), +('9', '68', '12', '25857', '10312', '7'), +('9', '68', '12', '28246', '7399', '7'), +('9', '68', '12', '27000', '6243', '7'), +('9', '68', '12', '12598', '5988', '7'), +('9', '68', '18', '69147', '10097', '7'), +('9', '68', '18', '68971', '9183', '7'), +('9', '68', '18', '16717', '7833', '7'), +('9', '68', '18', '68749', '7410', '7'), +('9', '68', '19', '30569', '10869', '7'), +('9', '68', '19', '19094', '10782', '7'), +('9', '68', '19', '51226', '9671', '7'), +('9', '68', '19', '28888', '9615', '7'), +('9', '68', '13', '69115', '166646', '7'), +('9', '68', '13', '69052', '143625', '7'), +('9', '68', '13', '68943', '126863', '7'), +('9', '68', '13', '68770', '120580', '7'), +('9', '68', '14', '69052', '143625', '7'), +('9', '68', '14', '22998', '118190', '7'), +('9', '68', '14', '68419', '100224', '7'), +('9', '68', '14', '69115', '86813', '7'), +('9', '68', '11', '69054', '57940', '7'), +('9', '68', '11', '29596', '43349', '7'), +('9', '68', '11', '30539', '42535', '7'), +('9', '68', '11', '28935', '41193', '7'), +('9', '69', '22', '21805', '0', '7'), +('9', '69', '22', '61948', '0', '7'), +('9', '69', '22', '66397', '0', '7'), +('9', '69', '22', '21807', '0', '7'), +('9', '69', '1', '68949', '15218', '7'), +('9', '69', '1', '7125', '13612', '7'), +('9', '69', '1', '32106', '11332', '7'), +('9', '69', '1', '69166', '9535', '7'), +('9', '69', '2', '28605', '13578', '7'), +('9', '69', '2', '28648', '13557', '7'), +('9', '69', '2', '26025', '8156', '7'), +('9', '69', '2', '2612', '8156', '7'), +('9', '69', '3', '68753', '8078', '7'), +('9', '69', '3', '69157', '8043', '7'), +('9', '69', '3', '26982', '7730', '7'), +('9', '69', '3', '69069', '7654', '7'), +('9', '69', '5', '28885', '10216', '7'), +('9', '69', '5', '68808', '10080', '7'), +('9', '69', '5', '7769', '9907', '7'), +('9', '69', '5', '27266', '9663', '7'), +('9', '69', '8', '69064', '18028', '7'), +('9', '69', '8', '69165', '17788', '7'), +('9', '69', '8', '69072', '14716', '7'), +('9', '69', '8', '26766', '10727', '7'), +('9', '69', '6', '68757', '16917', '7'), +('9', '69', '6', '13674', '12813', '7'), +('9', '69', '6', '28902', '12109', '7'), +('9', '69', '6', '19144', '10766', '7'), +('9', '69', '17', '69151', '11200', '7'), +('9', '69', '17', '68780', '8174', '7'), +('9', '69', '17', '27261', '7905', '7'), +('9', '69', '17', '14961', '6845', '7'), +('9', '69', '7', '68706', '13615', '7'), +('9', '69', '7', '16097', '10988', '7'), +('9', '69', '7', '26771', '7521', '7'), +('9', '69', '7', '69080', '7218', '7'), +('9', '69', '9', '68766', '12167', '7'), +('9', '69', '9', '11096', '11360', '7'), +('9', '69', '9', '16097', '10988', '7'), +('9', '69', '9', '31461', '9969', '7'), +('9', '69', '15', '9959', '10764', '7'), +('9', '69', '15', '68111', '10535', '7'), +('9', '69', '15', '69160', '8437', '7'), +('9', '69', '15', '69070', '8332', '7'), +('9', '69', '20', '16156', '17158', '7'), +('9', '69', '20', '16097', '10988', '7'), +('9', '69', '20', '69134', '10833', '7'), +('9', '69', '20', '15873', '10673', '7'), +('9', '69', '12', '25857', '10312', '7'), +('9', '69', '12', '28246', '7399', '7'), +('9', '69', '12', '27000', '6243', '7'), +('9', '69', '12', '12598', '5988', '7'), +('9', '69', '18', '69147', '10097', '7'), +('9', '69', '18', '68971', '9183', '7'), +('9', '69', '18', '16717', '7833', '7'), +('9', '69', '18', '68749', '7410', '7'), +('9', '69', '19', '30569', '10869', '7'), +('9', '69', '19', '19094', '10782', '7'), +('9', '69', '19', '51226', '9671', '7'), +('9', '69', '19', '28888', '9615', '7'), +('9', '69', '13', '69115', '168905', '7'), +('9', '69', '13', '69052', '144750', '7'), +('9', '69', '13', '68943', '128620', '7'), +('9', '69', '13', '68770', '122258', '7'), +('9', '69', '14', '69052', '144750', '7'), +('9', '69', '14', '22998', '119147', '7'), +('9', '69', '14', '68419', '101161', '7'), +('9', '69', '14', '69115', '87075', '7'), +('9', '69', '11', '69054', '58240', '7'), +('9', '69', '11', '29596', '43514', '7'), +('9', '69', '11', '30539', '42693', '7'), +('9', '69', '11', '28935', '41358', '7'), +('9', '70', '22', '12425', '0', '11'), +('9', '70', '22', '21807', '0', '11'), +('9', '70', '22', '21805', '0', '11'), +('9', '70', '22', '24071', '0', '11'), +('9', '70', '1', '83594', '18222', '11'), +('9', '70', '1', '39276', '17920', '11'), +('9', '70', '1', '71624', '15617', '11'), +('9', '70', '1', '68949', '15218', '11'), +('9', '70', '2', '70909', '18006', '11'), +('9', '70', '2', '28605', '13578', '11'), +('9', '70', '2', '28648', '13557', '11'), +('9', '70', '2', '83561', '9411', '11'), +('9', '70', '3', '39218', '16941', '11'), +('9', '70', '3', '47245', '14692', '11'), +('9', '70', '3', '39361', '10992', '11'), +('9', '70', '3', '70979', '9966', '11'), +('9', '70', '5', '39349', '16825', '11'), +('9', '70', '5', '47273', '10873', '11'), +('9', '70', '5', '28885', '10216', '11'), +('9', '70', '5', '39262', '10144', '11'), +('9', '70', '8', '69064', '18028', '11'), +('9', '70', '8', '69165', '17788', '11'), +('9', '70', '8', '39330', '15609', '11'), +('9', '70', '8', '69072', '14716', '11'), +('9', '70', '6', '70717', '17097', '11'), +('9', '70', '6', '68757', '16917', '11'), +('9', '70', '6', '83530', '15290', '11'), +('9', '70', '6', '13674', '12813', '11'), +('9', '70', '17', '83604', '20909', '11'), +('9', '70', '17', '70914', '12980', '11'), +('9', '70', '17', '69151', '11200', '11'), +('9', '70', '17', '70713', '9403', '11'), +('9', '70', '7', '68706', '13615', '11'), +('9', '70', '7', '16097', '10988', '11'), +('9', '70', '7', '83565', '10396', '11'), +('9', '70', '7', '70910', '9521', '11'), +('9', '70', '9', '68766', '12167', '11'), +('9', '70', '9', '11096', '11360', '11'), +('9', '70', '9', '16097', '10988', '11'), +('9', '70', '9', '39345', '10251', '11'), +('9', '70', '15', '83458', '14635', '11'), +('9', '70', '15', '71117', '13594', '11'), +('9', '70', '15', '70621', '13527', '11'), +('9', '70', '15', '71588', '13185', '11'), +('9', '70', '20', '16156', '17158', '11'), +('9', '70', '20', '47283', '15360', '11'), +('9', '70', '20', '70604', '12931', '11'), +('9', '70', '20', '39339', '11567', '11'), +('9', '70', '12', '71080', '14564', '11'), +('9', '70', '12', '47213', '13704', '11'), +('9', '70', '12', '25857', '10312', '11'), +('9', '70', '12', '39356', '9545', '11'), +('9', '70', '18', '70915', '12703', '11'), +('9', '70', '18', '83608', '12190', '11'), +('9', '70', '18', '69147', '10097', '11'), +('9', '70', '18', '71096', '9668', '11'), +('9', '70', '19', '69439', '13026', '11'), +('9', '70', '19', '30569', '10869', '11'), +('9', '70', '19', '19094', '10782', '11'), +('9', '70', '19', '51226', '9671', '11'), +('9', '70', '13', '83578', '201443', '11'), +('9', '70', '13', '83639', '187805', '11'), +('9', '70', '13', '47317', '185380', '11'), +('9', '70', '13', '83547', '174388', '11'), +('9', '70', '14', '83639', '187805', '11'), +('9', '70', '14', '69052', '153751', '11'), +('9', '70', '14', '22998', '126797', '11'), +('9', '70', '14', '47314', '113782', '11'), +('9', '70', '11', '69054', '60640', '11'), +('9', '70', '11', '83539', '51225', '11'), +('9', '70', '11', '83582', '48330', '11'), +('9', '70', '11', '29596', '44834', '11'), +('9', '70', '22', '21805', '0', '10'), +('9', '70', '22', '61948', '0', '10'), +('9', '70', '22', '66397', '0', '10'), +('9', '70', '22', '21807', '0', '10'), +('9', '70', '1', '83594', '18222', '10'), +('9', '70', '1', '71624', '15617', '10'), +('9', '70', '1', '68949', '15218', '10'), +('9', '70', '1', '7125', '13612', '10'), +('9', '70', '2', '70909', '18006', '10'), +('9', '70', '2', '28605', '13578', '10'), +('9', '70', '2', '28648', '13557', '10'), +('9', '70', '2', '83561', '9411', '10'), +('9', '70', '3', '47245', '14692', '10'), +('9', '70', '3', '70979', '9966', '10'), +('9', '70', '3', '83636', '9775', '10'), +('9', '70', '3', '89512', '8923', '10'), +('9', '70', '5', '47273', '10873', '10'), +('9', '70', '5', '28885', '10216', '10'), +('9', '70', '5', '68808', '10080', '10'), +('9', '70', '5', '7769', '9907', '10'), +('9', '70', '8', '69064', '18028', '10'), +('9', '70', '8', '69165', '17788', '10'), +('9', '70', '8', '69072', '14716', '10'), +('9', '70', '8', '70662', '13536', '10'), +('9', '70', '6', '70717', '17097', '10'), +('9', '70', '6', '68757', '16917', '10'), +('9', '70', '6', '83530', '15290', '10'), +('9', '70', '6', '13674', '12813', '10'), +('9', '70', '17', '83604', '20909', '10'), +('9', '70', '17', '70914', '12980', '10'), +('9', '70', '17', '69151', '11200', '10'), +('9', '70', '17', '70713', '9403', '10'), +('9', '70', '7', '68706', '13615', '10'), +('9', '70', '7', '16097', '10988', '10'), +('9', '70', '7', '83565', '10396', '10'), +('9', '70', '7', '70910', '9521', '10'), +('9', '70', '9', '68766', '12167', '10'), +('9', '70', '9', '11096', '11360', '10'), +('9', '70', '9', '16097', '10988', '10'), +('9', '70', '9', '31461', '9969', '10'), +('9', '70', '15', '83458', '14635', '10'), +('9', '70', '15', '71117', '13594', '10'), +('9', '70', '15', '70621', '13527', '10'), +('9', '70', '15', '71588', '13185', '10'), +('9', '70', '20', '16156', '17158', '10'), +('9', '70', '20', '47283', '15360', '10'), +('9', '70', '20', '70604', '12931', '10'), +('9', '70', '20', '16097', '10988', '10'), +('9', '70', '12', '71080', '14564', '10'), +('9', '70', '12', '47213', '13704', '10'), +('9', '70', '12', '25857', '10312', '10'), +('9', '70', '12', '86611', '7600', '10'), +('9', '70', '18', '70915', '12703', '10'), +('9', '70', '18', '83608', '12190', '10'), +('9', '70', '18', '69147', '10097', '10'), +('9', '70', '18', '71096', '9668', '10'), +('9', '70', '19', '69439', '13026', '10'), +('9', '70', '19', '30569', '10869', '10'), +('9', '70', '19', '19094', '10782', '10'), +('9', '70', '19', '51226', '9671', '10'), +('9', '70', '13', '83578', '201443', '10'), +('9', '70', '13', '83639', '187805', '10'), +('9', '70', '13', '47317', '185380', '10'), +('9', '70', '13', '83547', '174388', '10'), +('9', '70', '14', '83639', '187805', '10'), +('9', '70', '14', '69052', '153751', '10'), +('9', '70', '14', '22998', '126797', '10'), +('9', '70', '14', '47314', '113782', '10'), +('9', '70', '11', '69054', '60640', '10'), +('9', '70', '11', '83539', '51225', '10'), +('9', '70', '11', '83582', '48330', '10'), +('9', '70', '11', '29596', '44834', '10'), +('9', '70', '22', '21805', '0', '9'), +('9', '70', '22', '61948', '0', '9'), +('9', '70', '22', '66397', '0', '9'), +('9', '70', '22', '21807', '0', '9'), +('9', '70', '1', '71624', '15617', '9'), +('9', '70', '1', '68949', '15218', '9'), +('9', '70', '1', '7125', '13612', '9'), +('9', '70', '1', '32106', '11332', '9'), +('9', '70', '2', '70909', '18006', '9'), +('9', '70', '2', '28605', '13578', '9'), +('9', '70', '2', '28648', '13557', '9'), +('9', '70', '2', '2612', '8156', '9'), +('9', '70', '3', '47245', '14692', '9'), +('9', '70', '3', '70979', '9966', '9'), +('9', '70', '3', '68753', '8078', '9'), +('9', '70', '3', '69157', '8043', '9'), +('9', '70', '5', '47273', '10873', '9'), +('9', '70', '5', '28885', '10216', '9'), +('9', '70', '5', '68808', '10080', '9'), +('9', '70', '5', '7769', '9907', '9'), +('9', '70', '8', '69064', '18028', '9'), +('9', '70', '8', '69165', '17788', '9'), +('9', '70', '8', '69072', '14716', '9'), +('9', '70', '8', '70662', '13536', '9'), +('9', '70', '6', '70717', '17097', '9'), +('9', '70', '6', '68757', '16917', '9'), +('9', '70', '6', '13674', '12813', '9'), +('9', '70', '6', '28902', '12109', '9'), +('9', '70', '17', '70914', '12980', '9'), +('9', '70', '17', '69151', '11200', '9'), +('9', '70', '17', '70713', '9403', '9'), +('9', '70', '17', '68780', '8174', '9'), +('9', '70', '7', '68706', '13615', '9'), +('9', '70', '7', '16097', '10988', '9'), +('9', '70', '7', '70910', '9521', '9'), +('9', '70', '7', '70711', '8048', '9'), +('9', '70', '9', '68766', '12167', '9'), +('9', '70', '9', '11096', '11360', '9'), +('9', '70', '9', '16097', '10988', '9'), +('9', '70', '9', '31461', '9969', '9'), +('9', '70', '15', '71117', '13594', '9'), +('9', '70', '15', '70621', '13527', '9'), +('9', '70', '15', '71588', '13185', '9'), +('9', '70', '15', '71608', '12115', '9'), +('9', '70', '20', '16156', '17158', '9'), +('9', '70', '20', '47283', '15360', '9'), +('9', '70', '20', '70604', '12931', '9'), +('9', '70', '20', '16097', '10988', '9'), +('9', '70', '12', '71080', '14564', '9'), +('9', '70', '12', '47213', '13704', '9'), +('9', '70', '12', '25857', '10312', '9'), +('9', '70', '12', '28246', '7400', '9'), +('9', '70', '18', '70915', '12703', '9'), +('9', '70', '18', '69147', '10097', '9'), +('9', '70', '18', '71096', '9668', '9'), +('9', '70', '18', '82717', '9354', '9'), +('9', '70', '19', '69439', '13026', '9'), +('9', '70', '19', '30569', '10869', '9'), +('9', '70', '19', '19094', '10782', '9'), +('9', '70', '19', '51226', '9671', '9'), +('9', '70', '13', '47317', '185380', '9'), +('9', '70', '13', '69115', '173020', '9'), +('9', '70', '13', '70710', '171735', '9'), +('9', '70', '13', '71645', '168599', '9'), +('9', '70', '14', '69052', '153751', '9'), +('9', '70', '14', '22998', '126797', '9'), +('9', '70', '14', '47314', '113782', '9'), +('9', '70', '14', '68419', '108661', '9'), +('9', '70', '11', '69054', '60640', '9'), +('9', '70', '11', '29596', '44834', '9'), +('9', '70', '11', '70317', '44242', '9'), +('9', '70', '11', '30539', '43953', '9'), +('9', '70', '22', '21805', '0', '8'), +('9', '70', '22', '61948', '0', '8'), +('9', '70', '22', '66397', '0', '8'), +('9', '70', '22', '21807', '0', '8'), +('9', '70', '1', '68949', '15218', '8'), +('9', '70', '1', '7125', '13612', '8'), +('9', '70', '1', '32106', '11332', '8'), +('9', '70', '1', '47287', '10142', '8'), +('9', '70', '2', '70909', '18006', '8'), +('9', '70', '2', '28605', '13578', '8'), +('9', '70', '2', '28648', '13557', '8'), +('9', '70', '2', '2612', '8156', '8'), +('9', '70', '3', '47245', '14692', '8'), +('9', '70', '3', '68753', '8078', '8'), +('9', '70', '3', '69157', '8043', '8'), +('9', '70', '3', '71109', '7924', '8'), +('9', '70', '5', '47273', '10873', '8'), +('9', '70', '5', '28885', '10216', '8'), +('9', '70', '5', '68808', '10080', '8'), +('9', '70', '5', '7769', '9907', '8'), +('9', '70', '8', '69064', '18028', '8'), +('9', '70', '8', '69165', '17788', '8'), +('9', '70', '8', '69072', '14716', '8'), +('9', '70', '8', '70662', '13536', '8'), +('9', '70', '6', '70717', '17097', '8'), +('9', '70', '6', '68757', '16917', '8'), +('9', '70', '6', '13674', '12813', '8'), +('9', '70', '6', '28902', '12109', '8'), +('9', '70', '17', '70914', '12980', '8'), +('9', '70', '17', '69151', '11200', '8'), +('9', '70', '17', '70713', '9403', '8'), +('9', '70', '17', '68780', '8174', '8'), +('9', '70', '7', '68706', '13615', '8'), +('9', '70', '7', '16097', '10988', '8'), +('9', '70', '7', '70910', '9521', '8'), +('9', '70', '7', '70711', '8048', '8'), +('9', '70', '9', '68766', '12167', '8'), +('9', '70', '9', '11096', '11360', '8'), +('9', '70', '9', '16097', '10988', '8'), +('9', '70', '9', '31461', '9969', '8'), +('9', '70', '15', '71117', '13594', '8'), +('9', '70', '15', '70621', '13527', '8'), +('9', '70', '15', '9959', '10764', '8'), +('9', '70', '15', '68111', '10535', '8'), +('9', '70', '20', '16156', '17158', '8'), +('9', '70', '20', '47283', '15360', '8'), +('9', '70', '20', '70604', '12931', '8'), +('9', '70', '20', '16097', '10988', '8'), +('9', '70', '12', '71080', '14564', '8'), +('9', '70', '12', '47213', '13704', '8'), +('9', '70', '12', '25857', '10312', '8'), +('9', '70', '12', '28246', '7400', '8'), +('9', '70', '18', '70915', '12703', '8'), +('9', '70', '18', '69147', '10097', '8'), +('9', '70', '18', '71096', '9668', '8'), +('9', '70', '18', '68971', '9183', '8'), +('9', '70', '19', '69439', '13026', '8'), +('9', '70', '19', '30569', '10869', '8'), +('9', '70', '19', '19094', '10782', '8'), +('9', '70', '19', '51226', '9671', '8'), +('9', '70', '13', '47317', '184780', '8'), +('9', '70', '13', '69115', '172495', '8'), +('9', '70', '13', '70710', '171285', '8'), +('9', '70', '13', '52348', '167809', '8'), +('9', '70', '14', '69052', '151501', '8'), +('9', '70', '14', '22998', '124884', '8'), +('9', '70', '14', '47314', '113107', '8'), +('9', '70', '14', '68419', '106786', '8'), +('9', '70', '11', '69054', '60040', '8'), +('9', '70', '11', '29596', '44504', '8'), +('9', '70', '11', '70317', '43942', '8'), +('9', '70', '11', '30539', '43638', '8'), +('9', '71', '22', '12425', '0', '11'), +('9', '71', '22', '21807', '0', '11'), +('9', '71', '22', '21805', '0', '11'), +('9', '71', '22', '24071', '0', '11'), +('9', '71', '1', '83594', '18222', '11'), +('9', '71', '1', '39276', '17920', '11'), +('9', '71', '1', '71624', '15617', '11'), +('9', '71', '1', '68949', '15218', '11'), +('9', '71', '2', '70909', '18007', '11'), +('9', '71', '2', '28605', '13578', '11'), +('9', '71', '2', '28648', '13557', '11'), +('9', '71', '2', '83561', '9411', '11'), +('9', '71', '3', '39218', '16941', '11'), +('9', '71', '3', '47245', '14692', '11'), +('9', '71', '3', '39361', '10993', '11'), +('9', '71', '3', '70979', '9966', '11'), +('9', '71', '5', '39349', '16825', '11'), +('9', '71', '5', '47273', '10873', '11'), +('9', '71', '5', '28885', '10216', '11'), +('9', '71', '5', '39262', '10144', '11'), +('9', '71', '8', '69064', '18029', '11'), +('9', '71', '8', '69165', '17788', '11'), +('9', '71', '8', '39330', '15609', '11'), +('9', '71', '8', '69072', '14716', '11'), +('9', '71', '6', '70717', '17097', '11'), +('9', '71', '6', '68757', '16917', '11'), +('9', '71', '6', '83530', '15290', '11'), +('9', '71', '6', '13674', '12813', '11'), +('9', '71', '17', '83604', '20909', '11'), +('9', '71', '17', '70914', '12980', '11'), +('9', '71', '17', '69151', '11201', '11'), +('9', '71', '17', '70713', '9403', '11'), +('9', '71', '7', '68706', '13615', '11'), +('9', '71', '7', '16097', '10988', '11'), +('9', '71', '7', '83565', '10397', '11'), +('9', '71', '7', '70910', '9521', '11'), +('9', '71', '9', '68766', '12168', '11'), +('9', '71', '9', '11096', '11360', '11'), +('9', '71', '9', '16097', '10988', '11'), +('9', '71', '9', '39345', '10252', '11'), +('9', '71', '15', '83458', '14635', '11'), +('9', '71', '15', '71117', '13595', '11'), +('9', '71', '15', '70621', '13528', '11'), +('9', '71', '15', '71588', '13185', '11'), +('9', '71', '20', '16156', '17158', '11'), +('9', '71', '20', '47283', '15360', '11'), +('9', '71', '20', '70604', '12931', '11'), +('9', '71', '20', '39339', '11568', '11'), +('9', '71', '12', '71080', '14565', '11'), +('9', '71', '12', '47213', '13704', '11'), +('9', '71', '12', '25857', '10312', '11'), +('9', '71', '12', '39356', '9545', '11'), +('9', '71', '18', '70915', '12703', '11'), +('9', '71', '18', '83608', '12190', '11'), +('9', '71', '18', '69147', '10097', '11'), +('9', '71', '18', '71096', '9668', '11'), +('9', '71', '19', '69439', '13027', '11'), +('9', '71', '19', '30569', '10870', '11'), +('9', '71', '19', '19094', '10782', '11'), +('9', '71', '19', '51226', '9671', '11'), +('9', '71', '13', '83578', '204087', '11'), +('9', '71', '13', '83639', '189128', '11'), +('9', '71', '13', '47317', '187956', '11'), +('9', '71', '13', '83547', '176726', '11'), +('9', '71', '14', '83639', '189128', '11'), +('9', '71', '14', '69052', '154876', '11'), +('9', '71', '14', '22998', '127753', '11'), +('9', '71', '14', '47314', '114120', '11'), +('9', '71', '11', '69054', '60940', '11'), +('9', '71', '11', '83539', '51376', '11'), +('9', '71', '11', '83582', '48331', '11'), +('9', '71', '11', '29596', '44999', '11'), +('9', '72', '22', '12425', '0', '11'), +('9', '72', '22', '21807', '0', '11'), +('9', '72', '22', '21805', '0', '11'), +('9', '72', '22', '24071', '0', '11'), +('9', '72', '1', '83594', '18222', '11'), +('9', '72', '1', '39276', '17920', '11'), +('9', '72', '1', '71624', '15617', '11'), +('9', '72', '1', '68949', '15218', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '72', '2', '70909', '18007', '11'), +('9', '72', '2', '28605', '13578', '11'), +('9', '72', '2', '28648', '13557', '11'), +('9', '72', '2', '83561', '9412', '11'), +('9', '72', '3', '39218', '16941', '11'), +('9', '72', '3', '47245', '14692', '11'), +('9', '72', '3', '39361', '10993', '11'), +('9', '72', '3', '70979', '9966', '11'), +('9', '72', '5', '39349', '16825', '11'), +('9', '72', '5', '47273', '10873', '11'), +('9', '72', '5', '28885', '10216', '11'), +('9', '72', '5', '39262', '10144', '11'), +('9', '72', '8', '69064', '18029', '11'), +('9', '72', '8', '69165', '17789', '11'), +('9', '72', '8', '39330', '15609', '11'), +('9', '72', '8', '69072', '14716', '11'), +('9', '72', '6', '70717', '17097', '11'), +('9', '72', '6', '68757', '16917', '11'), +('9', '72', '6', '83530', '15290', '11'), +('9', '72', '6', '13674', '12814', '11'), +('9', '72', '17', '83604', '20909', '11'), +('9', '72', '17', '70914', '12981', '11'), +('9', '72', '17', '69151', '11201', '11'), +('9', '72', '17', '70713', '9403', '11'), +('9', '72', '7', '68706', '13615', '11'), +('9', '72', '7', '16097', '10989', '11'), +('9', '72', '7', '83565', '10397', '11'), +('9', '72', '7', '70910', '9521', '11'), +('9', '72', '9', '68766', '12168', '11'), +('9', '72', '9', '11096', '11360', '11'), +('9', '72', '9', '16097', '10989', '11'), +('9', '72', '9', '39345', '10252', '11'), +('9', '72', '15', '83458', '14635', '11'), +('9', '72', '15', '71117', '13595', '11'), +('9', '72', '15', '70621', '13528', '11'), +('9', '72', '15', '71588', '13185', '11'), +('9', '72', '20', '16156', '17158', '11'), +('9', '72', '20', '47283', '15360', '11'), +('9', '72', '20', '70604', '12931', '11'), +('9', '72', '20', '39339', '11568', '11'), +('9', '72', '12', '71080', '14565', '11'), +('9', '72', '12', '47213', '13704', '11'), +('9', '72', '12', '25857', '10312', '11'), +('9', '72', '12', '39356', '9546', '11'), +('9', '72', '18', '70915', '12703', '11'), +('9', '72', '18', '83608', '12191', '11'), +('9', '72', '18', '69147', '10098', '11'), +('9', '72', '18', '71096', '9669', '11'), +('9', '72', '19', '69439', '13027', '11'), +('9', '72', '19', '30569', '10870', '11'), +('9', '72', '19', '19094', '10782', '11'), +('9', '72', '19', '51226', '9671', '11'), +('9', '72', '13', '83578', '206751', '11'), +('9', '72', '13', '47317', '190551', '11'), +('9', '72', '13', '83639', '190451', '11'), +('9', '72', '13', '83547', '179084', '11'), +('9', '72', '14', '83639', '190451', '11'), +('9', '72', '14', '69052', '156001', '11'), +('9', '72', '14', '22998', '128710', '11'), +('9', '72', '14', '47314', '114457', '11'), +('9', '72', '11', '69054', '61240', '11'), +('9', '72', '11', '83539', '51526', '11'), +('9', '72', '11', '83582', '48331', '11'), +('9', '72', '11', '29596', '45164', '11'), +('9', '73', '22', '12425', '0', '11'), +('9', '73', '22', '21807', '0', '11'), +('9', '73', '22', '21805', '0', '11'), +('9', '73', '22', '24071', '0', '11'), +('9', '73', '1', '83594', '18222', '11'), +('9', '73', '1', '39276', '17920', '11'), +('9', '73', '1', '71624', '15617', '11'), +('9', '73', '1', '68949', '15219', '11'), +('9', '73', '2', '70909', '18007', '11'), +('9', '73', '2', '28605', '13578', '11'), +('9', '73', '2', '28648', '13557', '11'), +('9', '73', '2', '83561', '9412', '11'), +('9', '73', '3', '39218', '16941', '11'), +('9', '73', '3', '47245', '14692', '11'), +('9', '73', '3', '39361', '10993', '11'), +('9', '73', '3', '70979', '9966', '11'), +('9', '73', '5', '39349', '16825', '11'), +('9', '73', '5', '47273', '10873', '11'), +('9', '73', '5', '28885', '10216', '11'), +('9', '73', '5', '39262', '10144', '11'), +('9', '73', '8', '69064', '18029', '11'), +('9', '73', '8', '69165', '17789', '11'), +('9', '73', '8', '39330', '15609', '11'), +('9', '73', '8', '69072', '14717', '11'), +('9', '73', '6', '70717', '17097', '11'), +('9', '73', '6', '68757', '16917', '11'), +('9', '73', '6', '83530', '15290', '11'), +('9', '73', '6', '13674', '12814', '11'), +('9', '73', '17', '83604', '20910', '11'), +('9', '73', '17', '70914', '12981', '11'), +('9', '73', '17', '69151', '11201', '11'), +('9', '73', '17', '70713', '9403', '11'), +('9', '73', '7', '68706', '13615', '11'), +('9', '73', '7', '16097', '10989', '11'), +('9', '73', '7', '83565', '10397', '11'), +('9', '73', '7', '70910', '9522', '11'), +('9', '73', '9', '68766', '12168', '11'), +('9', '73', '9', '11096', '11360', '11'), +('9', '73', '9', '16097', '10989', '11'), +('9', '73', '9', '39345', '10252', '11'), +('9', '73', '15', '83458', '14635', '11'), +('9', '73', '15', '71117', '13595', '11'), +('9', '73', '15', '70621', '13528', '11'), +('9', '73', '15', '71588', '13185', '11'), +('9', '73', '20', '16156', '17158', '11'), +('9', '73', '20', '47283', '15360', '11'), +('9', '73', '20', '70604', '12931', '11'), +('9', '73', '20', '39339', '11568', '11'), +('9', '73', '12', '71080', '14565', '11'), +('9', '73', '12', '47213', '13704', '11'), +('9', '73', '12', '25857', '10312', '11'), +('9', '73', '12', '39356', '9546', '11'), +('9', '73', '18', '70915', '12703', '11'), +('9', '73', '18', '83608', '12191', '11'), +('9', '73', '18', '69147', '10098', '11'), +('9', '73', '18', '71096', '9669', '11'), +('9', '73', '19', '69439', '13027', '11'), +('9', '73', '19', '30569', '10870', '11'), +('9', '73', '19', '19094', '10782', '11'), +('9', '73', '19', '51226', '9671', '11'), +('9', '73', '13', '83578', '209434', '11'), +('9', '73', '13', '47317', '193167', '11'), +('9', '73', '13', '83639', '191774', '11'), +('9', '73', '13', '83547', '181459', '11'), +('9', '73', '14', '83639', '191774', '11'), +('9', '73', '14', '69052', '157126', '11'), +('9', '73', '14', '22998', '129666', '11'), +('9', '73', '14', '47314', '114795', '11'), +('9', '73', '11', '69054', '61541', '11'), +('9', '73', '11', '83539', '51676', '11'), +('9', '73', '11', '83582', '48331', '11'), +('9', '73', '11', '29596', '45329', '11'), +('9', '74', '22', '12425', '0', '11'), +('9', '74', '22', '21807', '0', '11'), +('9', '74', '22', '21805', '0', '11'), +('9', '74', '22', '24071', '0', '11'), +('9', '74', '1', '83594', '18222', '11'), +('9', '74', '1', '39276', '17920', '11'), +('9', '74', '1', '71624', '15617', '11'), +('9', '74', '1', '68949', '15219', '11'), +('9', '74', '2', '70909', '18007', '11'), +('9', '74', '2', '28605', '13578', '11'), +('9', '74', '2', '28648', '13557', '11'), +('9', '74', '2', '83561', '9412', '11'), +('9', '74', '3', '39218', '16941', '11'), +('9', '74', '3', '47245', '14693', '11'), +('9', '74', '3', '39361', '10993', '11'), +('9', '74', '3', '70979', '9967', '11'), +('9', '74', '5', '39349', '16825', '11'), +('9', '74', '5', '47273', '10873', '11'), +('9', '74', '5', '28885', '10216', '11'), +('9', '74', '5', '39262', '10144', '11'), +('9', '74', '8', '69064', '18029', '11'), +('9', '74', '8', '69165', '17789', '11'), +('9', '74', '8', '39330', '15609', '11'), +('9', '74', '8', '69072', '14717', '11'), +('9', '74', '6', '70717', '17098', '11'), +('9', '74', '6', '68757', '16917', '11'), +('9', '74', '6', '83530', '15290', '11'), +('9', '74', '6', '13674', '12814', '11'), +('9', '74', '17', '83604', '20910', '11'), +('9', '74', '17', '70914', '12981', '11'), +('9', '74', '17', '69151', '11201', '11'), +('9', '74', '17', '70713', '9403', '11'), +('9', '74', '7', '68706', '13615', '11'), +('9', '74', '7', '16097', '10989', '11'), +('9', '74', '7', '83565', '10397', '11'), +('9', '74', '7', '70910', '9522', '11'), +('9', '74', '9', '68766', '12168', '11'), +('9', '74', '9', '11096', '11360', '11'), +('9', '74', '9', '16097', '10989', '11'), +('9', '74', '9', '39345', '10252', '11'), +('9', '74', '15', '83458', '14635', '11'), +('9', '74', '15', '71117', '13596', '11'), +('9', '74', '15', '70621', '13528', '11'), +('9', '74', '15', '71588', '13185', '11'), +('9', '74', '20', '16156', '17159', '11'), +('9', '74', '20', '47283', '15360', '11'), +('9', '74', '20', '70604', '12931', '11'), +('9', '74', '20', '39339', '11568', '11'), +('9', '74', '12', '71080', '14565', '11'), +('9', '74', '12', '47213', '13704', '11'), +('9', '74', '12', '25857', '10312', '11'), +('9', '74', '12', '39356', '9546', '11'), +('9', '74', '18', '70915', '12703', '11'), +('9', '74', '18', '83608', '12191', '11'), +('9', '74', '18', '69147', '10098', '11'), +('9', '74', '18', '71096', '9669', '11'), +('9', '74', '19', '69439', '13027', '11'), +('9', '74', '19', '30569', '10870', '11'), +('9', '74', '19', '19094', '10782', '11'), +('9', '74', '19', '51226', '9672', '11'), +('9', '74', '13', '83578', '212137', '11'), +('9', '74', '13', '47317', '195802', '11'), +('9', '74', '13', '83639', '193098', '11'), +('9', '74', '13', '83547', '183854', '11'), +('9', '74', '14', '83639', '193098', '11'), +('9', '74', '14', '69052', '158251', '11'), +('9', '74', '14', '22998', '130623', '11'), +('9', '74', '14', '47314', '115132', '11'), +('9', '74', '11', '69054', '61841', '11'), +('9', '74', '11', '83539', '51826', '11'), +('9', '74', '11', '83582', '48331', '11'), +('9', '74', '11', '29596', '45494', '11'), +('9', '75', '22', '12425', '0', '13'), +('9', '75', '22', '21807', '0', '13'), +('9', '75', '22', '24071', '0', '13'), +('9', '75', '22', '39342', '0', '13'), +('9', '75', '1', '83594', '18223', '13'), +('9', '75', '1', '39276', '17920', '13'), +('9', '75', '1', '71624', '15617', '13'), +('9', '75', '1', '68949', '15219', '13'), +('9', '75', '2', '70909', '18008', '13'), +('9', '75', '2', '28605', '13578', '13'), +('9', '75', '2', '28648', '13557', '13'), +('9', '75', '2', '53417', '11813', '13'), +('9', '75', '3', '39218', '16941', '13'), +('9', '75', '3', '47245', '14693', '13'), +('9', '75', '3', '80636', '14011', '13'), +('9', '75', '3', '39361', '10993', '13'), +('9', '75', '5', '46918', '20110', '13'), +('9', '75', '5', '39349', '16826', '13'), +('9', '75', '5', '80669', '14359', '13'), +('9', '75', '5', '80616', '13242', '13'), +('9', '75', '8', '46885', '22306', '13'), +('9', '75', '8', '69064', '18029', '13'), +('9', '75', '8', '69165', '17789', '13'), +('9', '75', '8', '46814', '16498', '13'), +('9', '75', '6', '80638', '22851', '13'), +('9', '75', '6', '70717', '17098', '13'), +('9', '75', '6', '68757', '16918', '13'), +('9', '75', '6', '83530', '15291', '13'), +('9', '75', '17', '83604', '20910', '13'), +('9', '75', '17', '53422', '14166', '13'), +('9', '75', '17', '70914', '12981', '13'), +('9', '75', '17', '69151', '11201', '13'), +('9', '75', '7', '68706', '13615', '13'), +('9', '75', '7', '53418', '12205', '13'), +('9', '75', '7', '16097', '10989', '13'), +('9', '75', '7', '83565', '10398', '13'), +('9', '75', '9', '53419', '12274', '13'), +('9', '75', '9', '68766', '12168', '13'), +('9', '75', '9', '46937', '11953', '13'), +('9', '75', '9', '11096', '11360', '13'), +('9', '75', '15', '83458', '14636', '13'), +('9', '75', '15', '79909', '14633', '13'), +('9', '75', '15', '80657', '14302', '13'), +('9', '75', '15', '80627', '13658', '13'), +('9', '75', '20', '80688', '24752', '13'), +('9', '75', '20', '16156', '17159', '13'), +('9', '75', '20', '47283', '15360', '13'), +('9', '75', '20', '46935', '14483', '13'), +('9', '75', '12', '53420', '20356', '13'), +('9', '75', '12', '71080', '14565', '13'), +('9', '75', '12', '47213', '13704', '13'), +('9', '75', '12', '25857', '10312', '13'), +('9', '75', '18', '53423', '13086', '13'), +('9', '75', '18', '70915', '12704', '13'), +('9', '75', '18', '83608', '12192', '13'), +('9', '75', '18', '69147', '10098', '13'), +('9', '75', '19', '69439', '13027', '13'), +('9', '75', '19', '53421', '12454', '13'), +('9', '75', '19', '30569', '10870', '13'), +('9', '75', '19', '19094', '10782', '13'), +('9', '75', '13', '80653', '274605', '13'), +('9', '75', '13', '80613', '265531', '13'), +('9', '75', '13', '46927', '259025', '13'), +('9', '75', '13', '46831', '229137', '13'), +('9', '75', '14', '46856', '213638', '13'), +('9', '75', '14', '46854', '211478', '13'), +('9', '75', '14', '83639', '201036', '13'), +('9', '75', '14', '69052', '165001', '13'), +('9', '75', '11', '69054', '63641', '13'), +('9', '75', '11', '80655', '63069', '13'), +('9', '75', '11', '46930', '58335', '13'), +('9', '75', '11', '83539', '52726', '13'), +('9', '75', '22', '12425', '0', '12'), +('9', '75', '22', '21807', '0', '12'), +('9', '75', '22', '24071', '0', '12'), +('9', '75', '22', '39342', '0', '12'), +('9', '75', '1', '83594', '18223', '12'), +('9', '75', '1', '39276', '17920', '12'), +('9', '75', '1', '71624', '15617', '12'), +('9', '75', '1', '68949', '15219', '12'), +('9', '75', '2', '70909', '18008', '12'), +('9', '75', '2', '28605', '13578', '12'), +('9', '75', '2', '28648', '13557', '12'), +('9', '75', '2', '53417', '11813', '12'), +('9', '75', '3', '39218', '16941', '12'), +('9', '75', '3', '47245', '14693', '12'), +('9', '75', '3', '39361', '10993', '12'), +('9', '75', '3', '70979', '9967', '12'), +('9', '75', '5', '46918', '20110', '12'), +('9', '75', '5', '39349', '16826', '12'), +('9', '75', '5', '47273', '10873', '12'), +('9', '75', '5', '28885', '10216', '12'), +('9', '75', '8', '46885', '22306', '12'), +('9', '75', '8', '69064', '18029', '12'), +('9', '75', '8', '69165', '17789', '12'), +('9', '75', '8', '46814', '16498', '12'), +('9', '75', '6', '70717', '17098', '12'), +('9', '75', '6', '68757', '16918', '12'), +('9', '75', '6', '83530', '15291', '12'), +('9', '75', '6', '13674', '12814', '12'), +('9', '75', '17', '83604', '20910', '12'), +('9', '75', '17', '53422', '14166', '12'), +('9', '75', '17', '70914', '12981', '12'), +('9', '75', '17', '69151', '11201', '12'), +('9', '75', '7', '68706', '13615', '12'), +('9', '75', '7', '53418', '12205', '12'), +('9', '75', '7', '16097', '10989', '12'), +('9', '75', '7', '83565', '10398', '12'), +('9', '75', '9', '53419', '12274', '12'), +('9', '75', '9', '68766', '12168', '12'), +('9', '75', '9', '46937', '11953', '12'), +('9', '75', '9', '11096', '11360', '12'), +('9', '75', '15', '83458', '14636', '12'), +('9', '75', '15', '71117', '13596', '12'), +('9', '75', '15', '70621', '13528', '12'), +('9', '75', '15', '71588', '13185', '12'), +('9', '75', '20', '16156', '17159', '12'), +('9', '75', '20', '47283', '15360', '12'), +('9', '75', '20', '46935', '14483', '12'), +('9', '75', '20', '70604', '12932', '12'), +('9', '75', '12', '53420', '20356', '12'), +('9', '75', '12', '71080', '14565', '12'), +('9', '75', '12', '47213', '13704', '12'), +('9', '75', '12', '25857', '10312', '12'), +('9', '75', '18', '53423', '13086', '12'), +('9', '75', '18', '70915', '12704', '12'), +('9', '75', '18', '83608', '12192', '12'), +('9', '75', '18', '69147', '10098', '12'), +('9', '75', '19', '69439', '13027', '12'), +('9', '75', '19', '53421', '12454', '12'), +('9', '75', '19', '30569', '10870', '12'), +('9', '75', '19', '19094', '10782', '12'), +('9', '75', '13', '46927', '259025', '12'), +('9', '75', '13', '46831', '229137', '12'), +('9', '75', '13', '83578', '217109', '12'), +('9', '75', '13', '46856', '213638', '12'), +('9', '75', '14', '46856', '213638', '12'), +('9', '75', '14', '46854', '211478', '12'), +('9', '75', '14', '83639', '201036', '12'), +('9', '75', '14', '69052', '165001', '12'), +('9', '75', '11', '69054', '63641', '12'), +('9', '75', '11', '46930', '58335', '12'), +('9', '75', '11', '83539', '52726', '12'), +('9', '75', '11', '83582', '48331', '12'), +('9', '76', '22', '12425', '0', '13'), +('9', '76', '22', '21807', '0', '13'), +('9', '76', '22', '24071', '0', '13'), +('9', '76', '22', '39342', '0', '13'), +('9', '76', '1', '83594', '18223', '13'), +('9', '76', '1', '39276', '17921', '13'), +('9', '76', '1', '71624', '15618', '13'), +('9', '76', '1', '68949', '15219', '13'), +('9', '76', '2', '70909', '18008', '13'), +('9', '76', '2', '28605', '13578', '13'), +('9', '76', '2', '28648', '13557', '13'), +('9', '76', '2', '53417', '11813', '13'), +('9', '76', '3', '39218', '16941', '13'), +('9', '76', '3', '47245', '14693', '13'), +('9', '76', '3', '80636', '14011', '13'), +('9', '76', '3', '39361', '10993', '13'), +('9', '76', '5', '46918', '20110', '13'), +('9', '76', '5', '39349', '16826', '13'), +('9', '76', '5', '80669', '14359', '13'), +('9', '76', '5', '80616', '13242', '13'), +('9', '76', '8', '46885', '22306', '13'), +('9', '76', '8', '69064', '18029', '13'), +('9', '76', '8', '69165', '17789', '13'), +('9', '76', '8', '46814', '16498', '13'), +('9', '76', '6', '80638', '22852', '13'), +('9', '76', '6', '70717', '17098', '13'), +('9', '76', '6', '68757', '16918', '13'), +('9', '76', '6', '83530', '15291', '13'), +('9', '76', '17', '83604', '20911', '13'), +('9', '76', '17', '53422', '14166', '13'), +('9', '76', '17', '70914', '12981', '13'), +('9', '76', '17', '69151', '11202', '13'), +('9', '76', '7', '68706', '13616', '13'), +('9', '76', '7', '53418', '12205', '13'), +('9', '76', '7', '16097', '10989', '13'), +('9', '76', '7', '83565', '10398', '13'), +('9', '76', '9', '53419', '12274', '13'), +('9', '76', '9', '68766', '12168', '13'), +('9', '76', '9', '46937', '11953', '13'), +('9', '76', '9', '11096', '11360', '13'), +('9', '76', '15', '83458', '14636', '13'), +('9', '76', '15', '79909', '14633', '13'), +('9', '76', '15', '80657', '14302', '13'), +('9', '76', '15', '80627', '13658', '13'), +('9', '76', '20', '80688', '24752', '13'), +('9', '76', '20', '16156', '17159', '13'), +('9', '76', '20', '47283', '15360', '13'), +('9', '76', '20', '46935', '14483', '13'), +('9', '76', '12', '53420', '20356', '13'), +('9', '76', '12', '71080', '14565', '13'), +('9', '76', '12', '47213', '13704', '13'), +('9', '76', '12', '25857', '10312', '13'), +('9', '76', '18', '53423', '13086', '13'), +('9', '76', '18', '70915', '12704', '13'), +('9', '76', '18', '83608', '12192', '13'), +('9', '76', '18', '69147', '10098', '13'), +('9', '76', '19', '69439', '13027', '13'), +('9', '76', '19', '53421', '12455', '13'), +('9', '76', '19', '30569', '10870', '13'), +('9', '76', '19', '19094', '10782', '13'), +('9', '76', '13', '80653', '278081', '13'), +('9', '76', '13', '80613', '269091', '13'), +('9', '76', '13', '46927', '262208', '13'), +('9', '76', '13', '46831', '232030', '13'), +('9', '76', '14', '46856', '214961', '13'), +('9', '76', '14', '46854', '212801', '13'), +('9', '76', '14', '83639', '202359', '13'), +('9', '76', '14', '69052', '166127', '13'), +('9', '76', '11', '69054', '63941', '13'), +('9', '76', '11', '80655', '63069', '13'), +('9', '76', '11', '46930', '58335', '13'), +('9', '76', '11', '83539', '52876', '13'), +('9', '77', '22', '12425', '0', '13'), +('9', '77', '22', '21807', '0', '13'), +('9', '77', '22', '24071', '0', '13'), +('9', '77', '22', '39342', '0', '13'), +('9', '77', '1', '83594', '18223', '13'), +('9', '77', '1', '39276', '17921', '13'), +('9', '77', '1', '71624', '15618', '13'), +('9', '77', '1', '68949', '15219', '13'), +('9', '77', '2', '70909', '18008', '13'), +('9', '77', '2', '28605', '13578', '13'), +('9', '77', '2', '28648', '13557', '13'), +('9', '77', '2', '53417', '11814', '13'), +('9', '77', '3', '39218', '16941', '13'), +('9', '77', '3', '47245', '14693', '13'), +('9', '77', '3', '80636', '14011', '13'), +('9', '77', '3', '39361', '10994', '13'), +('9', '77', '5', '46918', '20111', '13'), +('9', '77', '5', '39349', '16826', '13'), +('9', '77', '5', '80669', '14359', '13'), +('9', '77', '5', '80616', '13242', '13'), +('9', '77', '8', '46885', '22306', '13'), +('9', '77', '8', '69064', '18029', '13'), +('9', '77', '8', '69165', '17790', '13'), +('9', '77', '8', '46814', '16498', '13'), +('9', '77', '6', '80638', '22852', '13'), +('9', '77', '6', '70717', '17098', '13'), +('9', '77', '6', '68757', '16918', '13'), +('9', '77', '6', '83530', '15291', '13'), +('9', '77', '17', '83604', '20911', '13'), +('9', '77', '17', '53422', '14166', '13'), +('9', '77', '17', '70914', '12982', '13'), +('9', '77', '17', '69151', '11202', '13'), +('9', '77', '7', '68706', '13616', '13'), +('9', '77', '7', '53418', '12205', '13'), +('9', '77', '7', '16097', '10990', '13'), +('9', '77', '7', '83565', '10398', '13'), +('9', '77', '9', '53419', '12275', '13'), +('9', '77', '9', '68766', '12168', '13'), +('9', '77', '9', '46937', '11953', '13'), +('9', '77', '9', '11096', '11360', '13'), +('9', '77', '15', '83458', '14636', '13'), +('9', '77', '15', '79909', '14633', '13'), +('9', '77', '15', '80657', '14302', '13'), +('9', '77', '15', '80627', '13658', '13'), +('9', '77', '20', '80688', '24752', '13'), +('9', '77', '20', '16156', '17159', '13'), +('9', '77', '20', '47283', '15361', '13'), +('9', '77', '20', '46935', '14483', '13'), +('9', '77', '12', '53420', '20356', '13'), +('9', '77', '12', '71080', '14565', '13'), +('9', '77', '12', '47213', '13704', '13'), +('9', '77', '12', '25857', '10312', '13'), +('9', '77', '18', '53423', '13086', '13'), +('9', '77', '18', '70915', '12704', '13'), +('9', '77', '18', '83608', '12192', '13'), +('9', '77', '18', '69147', '10098', '13'), +('9', '77', '19', '69439', '13027', '13'), +('9', '77', '19', '53421', '12455', '13'), +('9', '77', '19', '30569', '10870', '13'), +('9', '77', '19', '19094', '10783', '13'), +('9', '77', '13', '80653', '281586', '13'), +('9', '77', '13', '80613', '272682', '13'), +('9', '77', '13', '46927', '265417', '13'), +('9', '77', '13', '46831', '234944', '13'), +('9', '77', '14', '46856', '216284', '13'), +('9', '77', '14', '46854', '214124', '13'), +('9', '77', '14', '83639', '203682', '13'), +('9', '77', '14', '69052', '167252', '13'), +('9', '77', '11', '69054', '64241', '13'), +('9', '77', '11', '80655', '63069', '13'), +('9', '77', '11', '46930', '58335', '13'), +('9', '77', '11', '83539', '53026', '13'), +('9', '78', '22', '12425', '0', '13'), +('9', '78', '22', '21807', '0', '13'), +('9', '78', '22', '24071', '0', '13'), +('9', '78', '22', '39342', '0', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '78', '1', '83594', '18223', '13'), +('9', '78', '1', '39276', '17921', '13'), +('9', '78', '1', '71624', '15618', '13'), +('9', '78', '1', '68949', '15220', '13'), +('9', '78', '2', '70909', '18008', '13'), +('9', '78', '2', '28605', '13578', '13'), +('9', '78', '2', '28648', '13557', '13'), +('9', '78', '2', '53417', '11814', '13'), +('9', '78', '3', '39218', '16941', '13'), +('9', '78', '3', '47245', '14693', '13'), +('9', '78', '3', '80636', '14011', '13'), +('9', '78', '3', '39361', '10994', '13'), +('9', '78', '5', '46918', '20111', '13'), +('9', '78', '5', '39349', '16826', '13'), +('9', '78', '5', '80669', '14360', '13'), +('9', '78', '5', '80616', '13242', '13'), +('9', '78', '8', '46885', '22306', '13'), +('9', '78', '8', '69064', '18029', '13'), +('9', '78', '8', '69165', '17790', '13'), +('9', '78', '8', '46814', '16498', '13'), +('9', '78', '6', '80638', '22852', '13'), +('9', '78', '6', '70717', '17098', '13'), +('9', '78', '6', '68757', '16918', '13'), +('9', '78', '6', '83530', '15291', '13'), +('9', '78', '17', '83604', '20911', '13'), +('9', '78', '17', '53422', '14167', '13'), +('9', '78', '17', '70914', '12982', '13'), +('9', '78', '17', '69151', '11202', '13'), +('9', '78', '7', '68706', '13616', '13'), +('9', '78', '7', '53418', '12205', '13'), +('9', '78', '7', '16097', '10990', '13'), +('9', '78', '7', '83565', '10398', '13'), +('9', '78', '9', '53419', '12275', '13'), +('9', '78', '9', '68766', '12169', '13'), +('9', '78', '9', '46937', '11954', '13'), +('9', '78', '9', '11096', '11360', '13'), +('9', '78', '15', '83458', '14636', '13'), +('9', '78', '15', '79909', '14633', '13'), +('9', '78', '15', '80657', '14302', '13'), +('9', '78', '15', '80627', '13658', '13'), +('9', '78', '20', '80688', '24753', '13'), +('9', '78', '20', '16156', '17159', '13'), +('9', '78', '20', '47283', '15361', '13'), +('9', '78', '20', '46935', '14483', '13'), +('9', '78', '12', '53420', '20357', '13'), +('9', '78', '12', '71080', '14566', '13'), +('9', '78', '12', '47213', '13704', '13'), +('9', '78', '12', '25857', '10312', '13'), +('9', '78', '18', '53423', '13086', '13'), +('9', '78', '18', '70915', '12704', '13'), +('9', '78', '18', '83608', '12192', '13'), +('9', '78', '18', '69147', '10098', '13'), +('9', '78', '19', '69439', '13027', '13'), +('9', '78', '19', '53421', '12455', '13'), +('9', '78', '19', '30569', '10870', '13'), +('9', '78', '19', '19094', '10783', '13'), +('9', '78', '13', '80653', '285121', '13'), +('9', '78', '13', '80613', '276303', '13'), +('9', '78', '13', '46927', '268649', '13'), +('9', '78', '13', '46831', '237881', '13'), +('9', '78', '14', '46856', '217607', '13'), +('9', '78', '14', '46854', '215447', '13'), +('9', '78', '14', '83639', '205005', '13'), +('9', '78', '14', '69052', '168377', '13'), +('9', '78', '11', '69054', '64541', '13'), +('9', '78', '11', '80655', '63069', '13'), +('9', '78', '11', '46930', '58335', '13'), +('9', '78', '11', '83539', '53176', '13'), +('9', '79', '22', '12425', '0', '13'), +('9', '79', '22', '21807', '0', '13'), +('9', '79', '22', '24071', '0', '13'), +('9', '79', '22', '39342', '0', '13'), +('9', '79', '1', '83594', '18223', '13'), +('9', '79', '1', '39276', '17921', '13'), +('9', '79', '1', '71624', '15618', '13'), +('9', '79', '1', '68949', '15220', '13'), +('9', '79', '2', '70909', '18009', '13'), +('9', '79', '2', '28605', '13578', '13'), +('9', '79', '2', '28648', '13557', '13'), +('9', '79', '2', '53417', '11814', '13'), +('9', '79', '3', '39218', '16942', '13'), +('9', '79', '3', '47245', '14693', '13'), +('9', '79', '3', '80636', '14011', '13'), +('9', '79', '3', '39361', '10994', '13'), +('9', '79', '5', '46918', '20111', '13'), +('9', '79', '5', '39349', '16826', '13'), +('9', '79', '5', '80669', '14360', '13'), +('9', '79', '5', '80616', '13242', '13'), +('9', '79', '8', '46885', '22307', '13'), +('9', '79', '8', '69064', '18030', '13'), +('9', '79', '8', '69165', '17790', '13'), +('9', '79', '8', '46814', '16498', '13'), +('9', '79', '6', '80638', '22852', '13'), +('9', '79', '6', '70717', '17099', '13'), +('9', '79', '6', '68757', '16918', '13'), +('9', '79', '6', '83530', '15291', '13'), +('9', '79', '17', '83604', '20911', '13'), +('9', '79', '17', '53422', '14167', '13'), +('9', '79', '17', '70914', '12982', '13'), +('9', '79', '17', '69151', '11202', '13'), +('9', '79', '7', '68706', '13616', '13'), +('9', '79', '7', '53418', '12205', '13'), +('9', '79', '7', '16097', '10990', '13'), +('9', '79', '7', '83565', '10399', '13'), +('9', '79', '9', '53419', '12275', '13'), +('9', '79', '9', '68766', '12169', '13'), +('9', '79', '9', '46937', '11954', '13'), +('9', '79', '9', '11096', '11361', '13'), +('9', '79', '15', '83458', '14636', '13'), +('9', '79', '15', '79909', '14634', '13'), +('9', '79', '15', '80657', '14302', '13'), +('9', '79', '15', '80627', '13659', '13'), +('9', '79', '20', '80688', '24753', '13'), +('9', '79', '20', '16156', '17159', '13'), +('9', '79', '20', '47283', '15361', '13'), +('9', '79', '20', '46935', '14484', '13'), +('9', '79', '12', '53420', '20357', '13'), +('9', '79', '12', '71080', '14566', '13'), +('9', '79', '12', '47213', '13704', '13'), +('9', '79', '12', '25857', '10312', '13'), +('9', '79', '18', '53423', '13086', '13'), +('9', '79', '18', '70915', '12705', '13'), +('9', '79', '18', '83608', '12193', '13'), +('9', '79', '18', '69147', '10099', '13'), +('9', '79', '19', '69439', '13028', '13'), +('9', '79', '19', '53421', '12455', '13'), +('9', '79', '19', '30569', '10870', '13'), +('9', '79', '19', '19094', '10783', '13'), +('9', '79', '13', '80653', '288686', '13'), +('9', '79', '13', '80613', '279955', '13'), +('9', '79', '13', '46927', '271907', '13'), +('9', '79', '13', '46831', '240840', '13'), +('9', '79', '14', '46856', '218930', '13'), +('9', '79', '14', '46854', '216770', '13'), +('9', '79', '14', '83639', '206329', '13'), +('9', '79', '14', '69052', '169502', '13'), +('9', '79', '11', '69054', '64841', '13'), +('9', '79', '11', '80655', '63070', '13'), +('9', '79', '11', '46930', '58336', '13'), +('9', '79', '11', '83539', '53327', '13'), +('9', '80', '22', '12425', '0', '14'), +('9', '80', '22', '21807', '0', '14'), +('9', '80', '22', '24071', '0', '14'), +('9', '80', '22', '39342', '0', '14'), +('9', '80', '1', '102641', '19583', '14'), +('9', '80', '1', '102590', '18557', '14'), +('9', '80', '1', '83594', '18224', '14'), +('9', '80', '1', '102639', '18092', '14'), +('9', '80', '2', '70909', '18009', '14'), +('9', '80', '2', '102010', '14099', '14'), +('9', '80', '2', '28605', '13579', '14'), +('9', '80', '2', '28648', '13557', '14'), +('9', '80', '3', '102591', '19951', '14'), +('9', '80', '3', '102726', '19551', '14'), +('9', '80', '3', '102554', '18340', '14'), +('9', '80', '3', '39218', '16942', '14'), +('9', '80', '5', '46918', '20111', '14'), +('9', '80', '5', '102592', '19985', '14'), +('9', '80', '5', '102745', '18449', '14'), +('9', '80', '5', '102551', '17604', '14'), +('9', '80', '8', '102552', '26311', '14'), +('9', '80', '8', '102527', '23612', '14'), +('9', '80', '8', '46885', '22307', '14'), +('9', '80', '8', '102504', '21627', '14'), +('9', '80', '6', '80638', '22853', '14'), +('9', '80', '6', '102593', '19201', '14'), +('9', '80', '6', '102555', '17355', '14'), +('9', '80', '6', '70717', '17099', '14'), +('9', '80', '17', '83604', '20912', '14'), +('9', '80', '17', '102013', '14448', '14'), +('9', '80', '17', '53422', '14167', '14'), +('9', '80', '17', '102265', '13865', '14'), +('9', '80', '7', '102011', '14534', '14'), +('9', '80', '7', '68706', '13616', '14'), +('9', '80', '7', '102263', '13584', '14'), +('9', '80', '7', '53418', '12206', '14'), +('9', '80', '9', '67098', '22361', '14'), +('9', '80', '9', '53419', '12275', '14'), +('9', '80', '9', '68766', '12169', '14'), +('9', '80', '9', '46937', '11954', '14'), +('9', '80', '15', '102595', '20075', '14'), +('9', '80', '15', '102636', '19904', '14'), +('9', '80', '15', '102637', '19317', '14'), +('9', '80', '15', '102635', '18659', '14'), +('9', '80', '20', '102596', '28148', '14'), +('9', '80', '20', '102553', '25246', '14'), +('9', '80', '20', '80688', '24753', '14'), +('9', '80', '20', '102506', '18308', '14'), +('9', '80', '12', '53420', '20357', '14'), +('9', '80', '12', '71080', '14566', '14'), +('9', '80', '12', '47213', '13704', '14'), +('9', '80', '12', '102260', '12412', '14'), +('9', '80', '18', '102012', '14790', '14'), +('9', '80', '18', '102264', '13415', '14'), +('9', '80', '18', '53423', '13086', '14'), +('9', '80', '18', '70915', '12705', '14'), +('9', '80', '19', '76131', '18100', '14'), +('9', '80', '19', '69439', '13028', '14'), +('9', '80', '19', '53421', '12456', '14'), +('9', '80', '19', '102261', '11942', '14'), +('9', '80', '13', '102660', '391221', '14'), +('9', '80', '13', '102584', '373632', '14'), +('9', '80', '13', '102548', '297279', '14'), +('9', '80', '13', '80653', '292280', '14'), +('9', '80', '14', '46856', '220254', '14'), +('9', '80', '14', '46854', '218094', '14'), +('9', '80', '14', '83639', '207652', '14'), +('9', '80', '14', '102649', '184985', '14'), +('9', '80', '11', '102667', '82372', '14'), +('9', '80', '11', '102589', '72336', '14'), +('9', '80', '11', '69054', '65141', '14'), +('9', '80', '11', '80655', '63070', '14'), +('9', '81', '22', '12425', '0', '14'), +('9', '81', '22', '21807', '0', '14'), +('9', '81', '22', '24071', '0', '14'), +('9', '81', '22', '39342', '0', '14'), +('9', '81', '1', '102641', '19584', '14'), +('9', '81', '1', '102590', '18557', '14'), +('9', '81', '1', '83594', '18224', '14'), +('9', '81', '1', '102639', '18092', '14'), +('9', '81', '2', '70909', '18009', '14'), +('9', '81', '2', '102010', '14099', '14'), +('9', '81', '2', '28605', '13579', '14'), +('9', '81', '2', '28648', '13557', '14'), +('9', '81', '3', '102591', '19952', '14'), +('9', '81', '3', '102726', '19551', '14'), +('9', '81', '3', '102554', '18340', '14'), +('9', '81', '3', '39218', '16942', '14'), +('9', '81', '5', '46918', '20112', '14'), +('9', '81', '5', '102592', '19985', '14'), +('9', '81', '5', '102745', '18449', '14'), +('9', '81', '5', '102551', '17604', '14'), +('9', '81', '8', '102552', '26311', '14'), +('9', '81', '8', '102527', '23613', '14'), +('9', '81', '8', '46885', '22307', '14'), +('9', '81', '8', '102504', '21627', '14'), +('9', '81', '6', '80638', '22853', '14'), +('9', '81', '6', '102593', '19202', '14'), +('9', '81', '6', '102555', '17355', '14'), +('9', '81', '6', '70717', '17099', '14'), +('9', '81', '17', '83604', '20912', '14'), +('9', '81', '17', '102013', '14448', '14'), +('9', '81', '17', '53422', '14167', '14'), +('9', '81', '17', '102265', '13866', '14'), +('9', '81', '7', '102011', '14534', '14'), +('9', '81', '7', '68706', '13616', '14'), +('9', '81', '7', '102263', '13584', '14'), +('9', '81', '7', '53418', '12206', '14'), +('9', '81', '9', '67098', '22641', '14'), +('9', '81', '9', '53419', '12276', '14'), +('9', '81', '9', '68766', '12169', '14'), +('9', '81', '9', '46937', '11954', '14'), +('9', '81', '15', '102595', '20075', '14'), +('9', '81', '15', '102636', '19904', '14'), +('9', '81', '15', '102637', '19317', '14'), +('9', '81', '15', '102635', '18659', '14'), +('9', '81', '20', '102596', '28148', '14'), +('9', '81', '20', '102553', '25247', '14'), +('9', '81', '20', '80688', '24753', '14'), +('9', '81', '20', '102506', '18308', '14'), +('9', '81', '12', '53420', '20357', '14'), +('9', '81', '12', '71080', '14566', '14'), +('9', '81', '12', '47213', '13704', '14'), +('9', '81', '12', '102260', '12412', '14'), +('9', '81', '18', '102012', '14790', '14'), +('9', '81', '18', '102264', '13415', '14'), +('9', '81', '18', '53423', '13087', '14'), +('9', '81', '18', '70915', '12705', '14'), +('9', '81', '19', '76131', '18100', '14'), +('9', '81', '19', '69439', '13028', '14'), +('9', '81', '19', '53421', '12456', '14'), +('9', '81', '19', '102261', '11942', '14'), +('9', '81', '13', '102660', '395901', '14'), +('9', '81', '13', '102584', '378362', '14'), +('9', '81', '13', '102548', '300902', '14'), +('9', '81', '13', '80653', '295903', '14'), +('9', '81', '14', '46856', '221577', '14'), +('9', '81', '14', '46854', '219417', '14'), +('9', '81', '14', '83639', '208975', '14'), +('9', '81', '14', '102649', '185248', '14'), +('9', '81', '11', '102667', '82372', '14'), +('9', '81', '11', '102589', '72336', '14'), +('9', '81', '11', '69054', '65441', '14'), +('9', '81', '11', '80655', '63070', '14'), +('9', '82', '22', '12425', '0', '14'), +('9', '82', '22', '21807', '0', '14'), +('9', '82', '22', '24071', '0', '14'), +('9', '82', '22', '39342', '0', '14'), +('9', '82', '1', '102641', '19584', '14'), +('9', '82', '1', '102590', '18557', '14'), +('9', '82', '1', '83594', '18224', '14'), +('9', '82', '1', '102639', '18092', '14'), +('9', '82', '2', '70909', '18009', '14'), +('9', '82', '2', '102010', '14099', '14'), +('9', '82', '2', '28605', '13579', '14'), +('9', '82', '2', '28648', '13557', '14'), +('9', '82', '3', '102591', '19952', '14'), +('9', '82', '3', '102726', '19552', '14'), +('9', '82', '3', '102554', '18341', '14'), +('9', '82', '3', '39218', '16942', '14'), +('9', '82', '5', '46918', '20112', '14'), +('9', '82', '5', '102592', '19986', '14'), +('9', '82', '5', '102745', '18450', '14'), +('9', '82', '5', '102551', '17604', '14'), +('9', '82', '8', '102552', '26311', '14'), +('9', '82', '8', '102527', '23613', '14'), +('9', '82', '8', '46885', '22308', '14'), +('9', '82', '8', '102504', '21627', '14'), +('9', '82', '6', '80638', '22853', '14'), +('9', '82', '6', '102593', '19202', '14'), +('9', '82', '6', '102555', '17355', '14'), +('9', '82', '6', '70717', '17099', '14'), +('9', '82', '17', '83604', '20912', '14'), +('9', '82', '17', '102013', '14448', '14'), +('9', '82', '17', '53422', '14168', '14'), +('9', '82', '17', '102265', '13866', '14'), +('9', '82', '7', '102011', '14535', '14'), +('9', '82', '7', '68706', '13616', '14'), +('9', '82', '7', '102263', '13584', '14'), +('9', '82', '7', '53418', '12206', '14'), +('9', '82', '9', '67098', '22920', '14'), +('9', '82', '9', '53419', '12276', '14'), +('9', '82', '9', '68766', '12169', '14'), +('9', '82', '9', '46937', '11955', '14'), +('9', '82', '15', '102595', '20075', '14'), +('9', '82', '15', '102636', '19904', '14'), +('9', '82', '15', '102637', '19318', '14'), +('9', '82', '15', '102635', '18659', '14'), +('9', '82', '20', '102596', '28148', '14'), +('9', '82', '20', '102553', '25247', '14'), +('9', '82', '20', '80688', '24754', '14'), +('9', '82', '20', '102506', '18308', '14'), +('9', '82', '12', '53420', '20357', '14'), +('9', '82', '12', '71080', '14566', '14'), +('9', '82', '12', '47213', '13704', '14'), +('9', '82', '12', '102260', '12412', '14'), +('9', '82', '18', '102012', '14790', '14'), +('9', '82', '18', '102264', '13416', '14'), +('9', '82', '18', '53423', '13087', '14'), +('9', '82', '18', '70915', '12705', '14'), +('9', '82', '19', '76131', '18100', '14'), +('9', '82', '19', '69439', '13028', '14'), +('9', '82', '19', '53421', '12456', '14'), +('9', '82', '19', '102261', '11943', '14'), +('9', '82', '13', '102660', '400617', '14'), +('9', '82', '13', '102584', '383130', '14'), +('9', '82', '13', '102548', '304555', '14'), +('9', '82', '13', '80653', '299557', '14'), +('9', '82', '14', '46856', '222900', '14'), +('9', '82', '14', '46854', '220740', '14'), +('9', '82', '14', '83639', '210298', '14'), +('9', '82', '14', '102649', '185511', '14'), +('9', '82', '11', '102667', '82373', '14'), +('9', '82', '11', '102589', '72336', '14'), +('9', '82', '11', '69054', '65742', '14'), +('9', '82', '11', '80655', '63070', '14'), +('9', '83', '22', '12425', '0', '14'), +('9', '83', '22', '21807', '0', '14'), +('9', '83', '22', '24071', '0', '14'), +('9', '83', '22', '39342', '0', '14'), +('9', '83', '1', '102641', '19584', '14'), +('9', '83', '1', '102590', '18558', '14'), +('9', '83', '1', '83594', '18224', '14'), +('9', '83', '1', '102639', '18093', '14'), +('9', '83', '2', '70909', '18010', '14'), +('9', '83', '2', '102010', '14100', '14'), +('9', '83', '2', '28605', '13579', '14'), +('9', '83', '2', '28648', '13557', '14'), +('9', '83', '3', '102591', '19952', '14'), +('9', '83', '3', '102726', '19552', '14'), +('9', '83', '3', '102554', '18341', '14'), +('9', '83', '3', '39218', '16942', '14'), +('9', '83', '5', '46918', '20112', '14'), +('9', '83', '5', '102592', '19986', '14'), +('9', '83', '5', '102745', '18450', '14'), +('9', '83', '5', '102551', '17604', '14'), +('9', '83', '8', '102552', '26312', '14'), +('9', '83', '8', '102527', '23614', '14'), +('9', '83', '8', '46885', '22308', '14'), +('9', '83', '8', '102504', '21628', '14'), +('9', '83', '6', '80638', '22853', '14'), +('9', '83', '6', '102593', '19203', '14'), +('9', '83', '6', '102555', '17356', '14'), +('9', '83', '6', '70717', '17100', '14'), +('9', '83', '17', '83604', '20913', '14'), +('9', '83', '17', '102013', '14448', '14'), +('9', '83', '17', '53422', '14168', '14'), +('9', '83', '17', '102265', '13866', '14'), +('9', '83', '7', '102011', '14535', '14'), +('9', '83', '7', '68706', '13616', '14'), +('9', '83', '7', '102263', '13584', '14'), +('9', '83', '7', '53418', '12206', '14'), +('9', '83', '9', '67098', '23200', '14'), +('9', '83', '9', '53419', '12276', '14'), +('9', '83', '9', '68766', '12169', '14'), +('9', '83', '9', '46937', '11955', '14'), +('9', '83', '15', '102595', '20076', '14'), +('9', '83', '15', '102636', '19904', '14'), +('9', '83', '15', '102637', '19318', '14'), +('9', '83', '15', '102635', '18659', '14'), +('9', '83', '20', '102596', '28148', '14'), +('9', '83', '20', '102553', '25247', '14'), +('9', '83', '20', '80688', '24754', '14'), +('9', '83', '20', '102506', '18309', '14'), +('9', '83', '12', '53420', '20358', '14'), +('9', '83', '12', '71080', '14566', '14'), +('9', '83', '12', '47213', '13704', '14'), +('9', '83', '12', '102260', '12412', '14'), +('9', '83', '18', '102012', '14791', '14'), +('9', '83', '18', '102264', '13416', '14'), +('9', '83', '18', '53423', '13087', '14'), +('9', '83', '18', '70915', '12706', '14'), +('9', '83', '19', '76131', '18100', '14'), +('9', '83', '19', '69439', '13028', '14'), +('9', '83', '19', '53421', '12456', '14'), +('9', '83', '19', '102261', '11943', '14'), +('9', '83', '13', '102660', '405369', '14'), +('9', '83', '13', '102584', '387934', '14'), +('9', '83', '13', '102548', '308238', '14'), +('9', '83', '13', '80653', '303239', '14'), +('9', '83', '14', '46856', '224223', '14'), +('9', '83', '14', '46854', '222063', '14'), +('9', '83', '14', '83639', '211622', '14'), +('9', '83', '14', '102649', '185774', '14'), +('9', '83', '11', '102667', '82373', '14'), +('9', '83', '11', '102589', '72336', '14'), +('9', '83', '11', '69054', '66042', '14'), +('9', '83', '11', '80655', '63071', '14'), +('9', '84', '22', '12425', '0', '14'), +('9', '84', '22', '21807', '0', '14'), +('9', '84', '22', '24071', '0', '14'), +('9', '84', '22', '39342', '0', '14'), +('9', '84', '1', '102641', '19584', '14'), +('9', '84', '1', '102590', '18558', '14'), +('9', '84', '1', '83594', '18224', '14'), +('9', '84', '1', '102639', '18093', '14'), +('9', '84', '2', '70909', '18010', '14'), +('9', '84', '2', '102010', '14100', '14'), +('9', '84', '2', '28605', '13579', '14'), +('9', '84', '2', '28648', '13557', '14'), +('9', '84', '3', '102591', '19952', '14'), +('9', '84', '3', '102726', '19552', '14'), +('9', '84', '3', '102554', '18341', '14'), +('9', '84', '3', '39218', '16942', '14'), +('9', '84', '5', '46918', '20113', '14'), +('9', '84', '5', '102592', '19986', '14'), +('9', '84', '5', '102745', '18450', '14'), +('9', '84', '5', '102551', '17604', '14'), +('9', '84', '8', '102552', '26312', '14'), +('9', '84', '8', '102527', '23614', '14'), +('9', '84', '8', '46885', '22308', '14'), +('9', '84', '8', '102504', '21628', '14'), +('9', '84', '6', '80638', '22854', '14'), +('9', '84', '6', '102593', '19203', '14'), +('9', '84', '6', '102555', '17356', '14'), +('9', '84', '6', '70717', '17100', '14'), +('9', '84', '17', '83604', '20913', '14'), +('9', '84', '17', '102013', '14448', '14'), +('9', '84', '17', '53422', '14168', '14'), +('9', '84', '17', '102265', '13866', '14'), +('9', '84', '7', '102011', '14535', '14'), +('9', '84', '7', '68706', '13617', '14'), +('9', '84', '7', '102263', '13584', '14'), +('9', '84', '7', '53418', '12206', '14'), +('9', '84', '9', '67098', '23480', '14'), +('9', '84', '9', '53419', '12277', '14'), +('9', '84', '9', '68766', '12170', '14'), +('9', '84', '9', '46937', '11955', '14'), +('9', '84', '15', '102595', '20076', '14'), +('9', '84', '15', '102636', '19905', '14'), +('9', '84', '15', '102637', '19318', '14'), +('9', '84', '15', '102635', '18660', '14'), +('9', '84', '20', '102596', '28148', '14'), +('9', '84', '20', '102553', '25248', '14'), +('9', '84', '20', '80688', '24754', '14'), +('9', '84', '20', '102506', '18309', '14'), +('9', '84', '12', '53420', '20358', '14'), +('9', '84', '12', '71080', '14567', '14'), +('9', '84', '12', '47213', '13704', '14'), +('9', '84', '12', '102260', '12412', '14'), +('9', '84', '18', '102012', '14791', '14'), +('9', '84', '18', '102264', '13416', '14'), +('9', '84', '18', '53423', '13087', '14'), +('9', '84', '18', '70915', '12706', '14'), +('9', '84', '19', '76131', '18100', '14'), +('9', '84', '19', '69439', '13028', '14'), +('9', '84', '19', '53421', '12457', '14'), +('9', '84', '19', '102261', '11943', '14'), +('9', '84', '13', '102660', '410157', '14'), +('9', '84', '13', '102584', '392775', '14'), +('9', '84', '13', '102548', '311950', '14'), +('9', '84', '13', '80653', '306951', '14'), +('9', '84', '14', '46856', '225547', '14'), +('9', '84', '14', '46854', '223387', '14'), +('9', '84', '14', '83639', '212945', '14'), +('9', '84', '14', '102649', '186036', '14'), +('9', '84', '11', '102667', '82373', '14'), +('9', '84', '11', '102589', '72336', '14'), +('9', '84', '11', '69054', '66342', '14'), +('9', '84', '11', '80655', '63071', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '85', '22', '24071', '0', '16'), +('9', '85', '22', '12425', '0', '16'), +('9', '85', '22', '39342', '0', '16'), +('9', '85', '22', '7867', '0', '16'), +('9', '85', '1', '111300', '29765', '16'), +('9', '85', '1', '111308', '29611', '16'), +('9', '85', '1', '111302', '29544', '16'), +('9', '85', '1', '111305', '29199', '16'), +('9', '85', '2', '94056', '22220', '16'), +('9', '85', '2', '62985', '20722', '16'), +('9', '85', '2', '70909', '18010', '16'), +('9', '85', '2', '104410', '16669', '16'), +('9', '85', '3', '111315', '29694', '16'), +('9', '85', '3', '111313', '29289', '16'), +('9', '85', '3', '111316', '27990', '16'), +('9', '85', '3', '111014', '27343', '16'), +('9', '85', '5', '111318', '28937', '16'), +('9', '85', '5', '111320', '27603', '16'), +('9', '85', '5', '111319', '27033', '16'), +('9', '85', '5', '111017', '26662', '16'), +('9', '85', '8', '106804', '32488', '16'), +('9', '85', '8', '94070', '30885', '16'), +('9', '85', '8', '111331', '30186', '16'), +('9', '85', '8', '106716', '29874', '16'), +('9', '85', '6', '106803', '32070', '16'), +('9', '85', '6', '106843', '32016', '16'), +('9', '85', '6', '111324', '29207', '16'), +('9', '85', '6', '111322', '29111', '16'), +('9', '85', '17', '56046', '22839', '16'), +('9', '85', '17', '56083', '21082', '16'), +('9', '85', '17', '83604', '20913', '16'), +('9', '85', '17', '81765', '20069', '16'), +('9', '85', '7', '94053', '23375', '16'), +('9', '85', '7', '104411', '21125', '16'), +('9', '85', '7', '56079', '20854', '16'), +('9', '85', '7', '102011', '14535', '16'), +('9', '85', '9', '67098', '23760', '16'), +('9', '85', '9', '56033', '21696', '16'), +('9', '85', '9', '56031', '21649', '16'), +('9', '85', '9', '56070', '21504', '16'), +('9', '85', '15', '111343', '30237', '16'), +('9', '85', '15', '111347', '28597', '16'), +('9', '85', '15', '111345', '28556', '16'), +('9', '85', '15', '111042', '27937', '16'), +('9', '85', '20', '111354', '39579', '16'), +('9', '85', '20', '111352', '38456', '16'), +('9', '85', '20', '111355', '38444', '16'), +('9', '85', '20', '111052', '37279', '16'), +('9', '85', '12', '56073', '20686', '16'), +('9', '85', '12', '53420', '20358', '16'), +('9', '85', '12', '81795', '19885', '16'), +('9', '85', '12', '104408', '18679', '16'), +('9', '85', '18', '62986', '21049', '16'), +('9', '85', '18', '104412', '20674', '16'), +('9', '85', '18', '56041', '20401', '16'), +('9', '85', '18', '94054', '19332', '16'), +('9', '85', '19', '62990', '22524', '16'), +('9', '85', '19', '56037', '21254', '16'), +('9', '85', '19', '104409', '20303', '16'), +('9', '85', '19', '56075', '19366', '16'), +('9', '85', '13', '111523', '634016', '16'), +('9', '85', '13', '111871', '605640', '16'), +('9', '85', '13', '111522', '591389', '16'), +('9', '85', '13', '111223', '559846', '16'), +('9', '85', '14', '111523', '269647', '16'), +('9', '85', '14', '111815', '269093', '16'), +('9', '85', '14', '111871', '268844', '16'), +('9', '85', '14', '111515', '260346', '16'), +('9', '85', '11', '111529', '104846', '16'), +('9', '85', '11', '111229', '100415', '16'), +('9', '85', '11', '106769', '86159', '16'), +('9', '85', '11', '62939', '84446', '16'), +('9', '85', '22', '12425', '0', '15'), +('9', '85', '22', '21807', '0', '15'), +('9', '85', '22', '24071', '0', '15'), +('9', '85', '22', '39342', '0', '15'), +('9', '85', '1', '107054', '26906', '15'), +('9', '85', '1', '107010', '25631', '15'), +('9', '85', '1', '106840', '25156', '15'), +('9', '85', '1', '106800', '24677', '15'), +('9', '85', '2', '94056', '22220', '15'), +('9', '85', '2', '62985', '20722', '15'), +('9', '85', '2', '70909', '18010', '15'), +('9', '85', '2', '104410', '16669', '15'), +('9', '85', '3', '107011', '26365', '15'), +('9', '85', '3', '106801', '24561', '15'), +('9', '85', '3', '107055', '24244', '15'), +('9', '85', '3', '106841', '22916', '15'), +('9', '85', '5', '107012', '25192', '15'), +('9', '85', '5', '106802', '24296', '15'), +('9', '85', '5', '107056', '23865', '15'), +('9', '85', '5', '106714', '22376', '15'), +('9', '85', '8', '106804', '32488', '15'), +('9', '85', '8', '94070', '30885', '15'), +('9', '85', '8', '106716', '29874', '15'), +('9', '85', '8', '106601', '28045', '15'), +('9', '85', '6', '106803', '32070', '15'), +('9', '85', '6', '106843', '32016', '15'), +('9', '85', '6', '106504', '28106', '15'), +('9', '85', '6', '106600', '28021', '15'), +('9', '85', '17', '56046', '22839', '15'), +('9', '85', '17', '56083', '21082', '15'), +('9', '85', '17', '83604', '20913', '15'), +('9', '85', '17', '81765', '20069', '15'), +('9', '85', '7', '94053', '23375', '15'), +('9', '85', '7', '104411', '21125', '15'), +('9', '85', '7', '56079', '20854', '15'), +('9', '85', '7', '102011', '14535', '15'), +('9', '85', '9', '67098', '23760', '15'), +('9', '85', '9', '56033', '21696', '15'), +('9', '85', '9', '56031', '21649', '15'), +('9', '85', '9', '56070', '21504', '15'), +('9', '85', '15', '107016', '23505', '15'), +('9', '85', '15', '107051', '23472', '15'), +('9', '85', '15', '107062', '23104', '15'), +('9', '85', '15', '106837', '22477', '15'), +('9', '85', '20', '107059', '32585', '15'), +('9', '85', '20', '107017', '31212', '15'), +('9', '85', '20', '106845', '30920', '15'), +('9', '85', '20', '62995', '30046', '15'), +('9', '85', '12', '56073', '20686', '15'), +('9', '85', '12', '53420', '20358', '15'), +('9', '85', '12', '81795', '19885', '15'), +('9', '85', '12', '104408', '18679', '15'), +('9', '85', '18', '62986', '21049', '15'), +('9', '85', '18', '104412', '20674', '15'), +('9', '85', '18', '56041', '20401', '15'), +('9', '85', '18', '94054', '19332', '15'), +('9', '85', '19', '62990', '22524', '15'), +('9', '85', '19', '56037', '21254', '15'), +('9', '85', '19', '104409', '20303', '15'), +('9', '85', '19', '56075', '19366', '15'), +('9', '85', '13', '106863', '461353', '15'), +('9', '85', '13', '106763', '425451', '15'), +('9', '85', '13', '62996', '421425', '15'), +('9', '85', '13', '102660', '414980', '15'), +('9', '85', '14', '46856', '226870', '15'), +('9', '85', '14', '46854', '224710', '15'), +('9', '85', '14', '83639', '214268', '15'), +('9', '85', '14', '106854', '213454', '15'), +('9', '85', '11', '106769', '86159', '15'), +('9', '85', '11', '62939', '84446', '15'), +('9', '85', '11', '102667', '82373', '15'), +('9', '85', '11', '106616', '78963', '15'), +('9', '86', '22', '24071', '0', '16'), +('9', '86', '22', '12425', '0', '16'), +('9', '86', '22', '39342', '0', '16'), +('9', '86', '22', '7867', '0', '16'), +('9', '86', '1', '111300', '29765', '16'), +('9', '86', '1', '111308', '29611', '16'), +('9', '86', '1', '111302', '29544', '16'), +('9', '86', '1', '111305', '29199', '16'), +('9', '86', '2', '94056', '22220', '16'), +('9', '86', '2', '62985', '20722', '16'), +('9', '86', '2', '70909', '18010', '16'), +('9', '86', '2', '104410', '16669', '16'), +('9', '86', '3', '111315', '29694', '16'), +('9', '86', '3', '111313', '29290', '16'), +('9', '86', '3', '111316', '27990', '16'), +('9', '86', '3', '111014', '27344', '16'), +('9', '86', '5', '111318', '28938', '16'), +('9', '86', '5', '111320', '27603', '16'), +('9', '86', '5', '111319', '27033', '16'), +('9', '86', '5', '111017', '26662', '16'), +('9', '86', '8', '106804', '32488', '16'), +('9', '86', '8', '94070', '30885', '16'), +('9', '86', '8', '111331', '30187', '16'), +('9', '86', '8', '106716', '29875', '16'), +('9', '86', '6', '106803', '32071', '16'), +('9', '86', '6', '106843', '32017', '16'), +('9', '86', '6', '111324', '29207', '16'), +('9', '86', '6', '111322', '29111', '16'), +('9', '86', '17', '56046', '22839', '16'), +('9', '86', '17', '56083', '21082', '16'), +('9', '86', '17', '83604', '20913', '16'), +('9', '86', '17', '81765', '20069', '16'), +('9', '86', '7', '94053', '23376', '16'), +('9', '86', '7', '104411', '21126', '16'), +('9', '86', '7', '56079', '20854', '16'), +('9', '86', '7', '102011', '14536', '16'), +('9', '86', '9', '67098', '24039', '16'), +('9', '86', '9', '56033', '21696', '16'), +('9', '86', '9', '56031', '21649', '16'), +('9', '86', '9', '56070', '21504', '16'), +('9', '86', '15', '111343', '30237', '16'), +('9', '86', '15', '111347', '28597', '16'), +('9', '86', '15', '111345', '28556', '16'), +('9', '86', '15', '111042', '27937', '16'), +('9', '86', '20', '111354', '39580', '16'), +('9', '86', '20', '111352', '38456', '16'), +('9', '86', '20', '111355', '38444', '16'), +('9', '86', '20', '111052', '37279', '16'), +('9', '86', '12', '56073', '20686', '16'), +('9', '86', '12', '53420', '20358', '16'), +('9', '86', '12', '81795', '19885', '16'), +('9', '86', '12', '104408', '18680', '16'), +('9', '86', '18', '62986', '21049', '16'), +('9', '86', '18', '104412', '20674', '16'), +('9', '86', '18', '56041', '20401', '16'), +('9', '86', '18', '94054', '19332', '16'), +('9', '86', '19', '62990', '22525', '16'), +('9', '86', '19', '56037', '21255', '16'), +('9', '86', '19', '104409', '20304', '16'), +('9', '86', '19', '56075', '19366', '16'), +('9', '86', '13', '111523', '641756', '16'), +('9', '86', '13', '111871', '612829', '16'), +('9', '86', '13', '111522', '598577', '16'), +('9', '86', '13', '111223', '566484', '16'), +('9', '86', '14', '111523', '270128', '16'), +('9', '86', '14', '111815', '269573', '16'), +('9', '86', '14', '111871', '269324', '16'), +('9', '86', '14', '111515', '260826', '16'), +('9', '86', '11', '111529', '104847', '16'), +('9', '86', '11', '111229', '100415', '16'), +('9', '86', '11', '106769', '86160', '16'), +('9', '86', '11', '62939', '84446', '16'), +('9', '87', '22', '24071', '0', '16'), +('9', '87', '22', '12425', '0', '16'), +('9', '87', '22', '39342', '0', '16'), +('9', '87', '22', '7867', '0', '16'), +('9', '87', '1', '111300', '29765', '16'), +('9', '87', '1', '111308', '29611', '16'), +('9', '87', '1', '111302', '29544', '16'), +('9', '87', '1', '111305', '29199', '16'), +('9', '87', '2', '94056', '22220', '16'), +('9', '87', '2', '62985', '20722', '16'), +('9', '87', '2', '70909', '18010', '16'), +('9', '87', '2', '104410', '16669', '16'), +('9', '87', '3', '111315', '29695', '16'), +('9', '87', '3', '111313', '29290', '16'), +('9', '87', '3', '111316', '27991', '16'), +('9', '87', '3', '111014', '27344', '16'), +('9', '87', '5', '111318', '28938', '16'), +('9', '87', '5', '111320', '27603', '16'), +('9', '87', '5', '111319', '27034', '16'), +('9', '87', '5', '111017', '26662', '16'), +('9', '87', '8', '106804', '32489', '16'), +('9', '87', '8', '94070', '30885', '16'), +('9', '87', '8', '111331', '30187', '16'), +('9', '87', '8', '106716', '29875', '16'), +('9', '87', '6', '106803', '32071', '16'), +('9', '87', '6', '106843', '32017', '16'), +('9', '87', '6', '111324', '29207', '16'), +('9', '87', '6', '111322', '29111', '16'), +('9', '87', '17', '56046', '22839', '16'), +('9', '87', '17', '56083', '21083', '16'), +('9', '87', '17', '83604', '20914', '16'), +('9', '87', '17', '81765', '20070', '16'), +('9', '87', '7', '94053', '23376', '16'), +('9', '87', '7', '104411', '21126', '16'), +('9', '87', '7', '56079', '20854', '16'), +('9', '87', '7', '102011', '14536', '16'), +('9', '87', '9', '67098', '24319', '16'), +('9', '87', '9', '56033', '21696', '16'), +('9', '87', '9', '56031', '21649', '16'), +('9', '87', '9', '56070', '21504', '16'), +('9', '87', '15', '111343', '30238', '16'), +('9', '87', '15', '111347', '28597', '16'), +('9', '87', '15', '111345', '28556', '16'), +('9', '87', '15', '111042', '27937', '16'), +('9', '87', '20', '111354', '39580', '16'), +('9', '87', '20', '111352', '38457', '16'), +('9', '87', '20', '111355', '38444', '16'), +('9', '87', '20', '111052', '37279', '16'), +('9', '87', '12', '56073', '20687', '16'), +('9', '87', '12', '53420', '20358', '16'), +('9', '87', '12', '81795', '19885', '16'), +('9', '87', '12', '104408', '18680', '16'), +('9', '87', '18', '62986', '21050', '16'), +('9', '87', '18', '104412', '20674', '16'), +('9', '87', '18', '56041', '20401', '16'), +('9', '87', '18', '94054', '19332', '16'), +('9', '87', '19', '62990', '22525', '16'), +('9', '87', '19', '56037', '21255', '16'), +('9', '87', '19', '104409', '20304', '16'), +('9', '87', '19', '56075', '19366', '16'), +('9', '87', '13', '111523', '649552', '16'), +('9', '87', '13', '111871', '620070', '16'), +('9', '87', '13', '111522', '605819', '16'), +('9', '87', '13', '111223', '573170', '16'), +('9', '87', '14', '111523', '270608', '16'), +('9', '87', '14', '111815', '270053', '16'), +('9', '87', '14', '111871', '269804', '16'), +('9', '87', '14', '111515', '261306', '16'), +('9', '87', '11', '111529', '104847', '16'), +('9', '87', '11', '111229', '100415', '16'), +('9', '87', '11', '106769', '86160', '16'), +('9', '87', '11', '62939', '84446', '16'), +('9', '88', '22', '24071', '0', '16'), +('9', '88', '22', '12425', '0', '16'), +('9', '88', '22', '39342', '0', '16'), +('9', '88', '22', '7867', '0', '16'), +('9', '88', '1', '111300', '29765', '16'), +('9', '88', '1', '111308', '29612', '16'), +('9', '88', '1', '111302', '29545', '16'), +('9', '88', '1', '111305', '29200', '16'), +('9', '88', '2', '94056', '22221', '16'), +('9', '88', '2', '62985', '20722', '16'), +('9', '88', '2', '70909', '18011', '16'), +('9', '88', '2', '104410', '16669', '16'), +('9', '88', '3', '111315', '29695', '16'), +('9', '88', '3', '111313', '29290', '16'), +('9', '88', '3', '111316', '27991', '16'), +('9', '88', '3', '111014', '27345', '16'), +('9', '88', '5', '111318', '28938', '16'), +('9', '88', '5', '111320', '27604', '16'), +('9', '88', '5', '111319', '27034', '16'), +('9', '88', '5', '111017', '26662', '16'), +('9', '88', '8', '106804', '32489', '16'), +('9', '88', '8', '94070', '30886', '16'), +('9', '88', '8', '111331', '30187', '16'), +('9', '88', '8', '106716', '29875', '16'), +('9', '88', '6', '106803', '32071', '16'), +('9', '88', '6', '106843', '32017', '16'), +('9', '88', '6', '111324', '29207', '16'), +('9', '88', '6', '111322', '29111', '16'), +('9', '88', '17', '56046', '22840', '16'), +('9', '88', '17', '56083', '21083', '16'), +('9', '88', '17', '83604', '20914', '16'), +('9', '88', '17', '81765', '20070', '16'), +('9', '88', '7', '94053', '23376', '16'), +('9', '88', '7', '104411', '21126', '16'), +('9', '88', '7', '56079', '20855', '16'), +('9', '88', '7', '102011', '14536', '16'), +('9', '88', '9', '67098', '24599', '16'), +('9', '88', '9', '56033', '21696', '16'), +('9', '88', '9', '56031', '21649', '16'), +('9', '88', '9', '56070', '21504', '16'), +('9', '88', '15', '111343', '30238', '16'), +('9', '88', '15', '111347', '28598', '16'), +('9', '88', '15', '111345', '28556', '16'), +('9', '88', '15', '111042', '27937', '16'), +('9', '88', '20', '111354', '39580', '16'), +('9', '88', '20', '111352', '38457', '16'), +('9', '88', '20', '111355', '38445', '16'), +('9', '88', '20', '111052', '37280', '16'), +('9', '88', '12', '56073', '20687', '16'), +('9', '88', '12', '53420', '20359', '16'), +('9', '88', '12', '81795', '19886', '16'), +('9', '88', '12', '104408', '18680', '16'), +('9', '88', '18', '62986', '21050', '16'), +('9', '88', '18', '104412', '20674', '16'), +('9', '88', '18', '56041', '20401', '16'), +('9', '88', '18', '94054', '19333', '16'), +('9', '88', '19', '62990', '22525', '16'), +('9', '88', '19', '56037', '21255', '16'), +('9', '88', '19', '104409', '20304', '16'), +('9', '88', '19', '56075', '19367', '16'), +('9', '88', '13', '111523', '657406', '16'), +('9', '88', '13', '111871', '627364', '16'), +('9', '88', '13', '111522', '613113', '16'), +('9', '88', '13', '111223', '579905', '16'), +('9', '88', '14', '111523', '271088', '16'), +('9', '88', '14', '111815', '270534', '16'), +('9', '88', '14', '111871', '270284', '16'), +('9', '88', '14', '111515', '261786', '16'), +('9', '88', '11', '111529', '104847', '16'), +('9', '88', '11', '111229', '100415', '16'), +('9', '88', '11', '106769', '86160', '16'), +('9', '88', '11', '62939', '84446', '16'), +('9', '89', '22', '24071', '0', '16'), +('9', '89', '22', '12425', '0', '16'), +('9', '89', '22', '39342', '0', '16'), +('9', '89', '22', '7867', '0', '16'), +('9', '89', '1', '111300', '29766', '16'), +('9', '89', '1', '111308', '29612', '16'), +('9', '89', '1', '111302', '29545', '16'), +('9', '89', '1', '111305', '29200', '16'), +('9', '89', '2', '94056', '22221', '16'), +('9', '89', '2', '62985', '20723', '16'), +('9', '89', '2', '70909', '18011', '16'), +('9', '89', '2', '104410', '16670', '16'), +('9', '89', '3', '111315', '29696', '16'), +('9', '89', '3', '111313', '29290', '16'), +('9', '89', '3', '111316', '27991', '16'), +('9', '89', '3', '111014', '27345', '16'), +('9', '89', '5', '111318', '28938', '16'), +('9', '89', '5', '111320', '27604', '16'), +('9', '89', '5', '111319', '27034', '16'), +('9', '89', '5', '111017', '26663', '16'), +('9', '89', '8', '106804', '32489', '16'), +('9', '89', '8', '94070', '30886', '16'), +('9', '89', '8', '111331', '30188', '16'), +('9', '89', '8', '106716', '29876', '16'), +('9', '89', '6', '106803', '32071', '16'), +('9', '89', '6', '106843', '32018', '16'), +('9', '89', '6', '111324', '29208', '16'), +('9', '89', '6', '111322', '29112', '16'), +('9', '89', '17', '56046', '22840', '16'), +('9', '89', '17', '56083', '21083', '16'), +('9', '89', '17', '83604', '20914', '16'), +('9', '89', '17', '81765', '20070', '16'), +('9', '89', '7', '94053', '23377', '16'), +('9', '89', '7', '104411', '21126', '16'), +('9', '89', '7', '56079', '20855', '16'), +('9', '89', '7', '102011', '14536', '16'), +('9', '89', '9', '67098', '24879', '16'), +('9', '89', '9', '56033', '21696', '16'), +('9', '89', '9', '56031', '21649', '16'), +('9', '89', '9', '56070', '21504', '16'), +('9', '89', '15', '111343', '30238', '16'), +('9', '89', '15', '111347', '28598', '16'), +('9', '89', '15', '111345', '28556', '16'), +('9', '89', '15', '111042', '27937', '16'), +('9', '89', '20', '111354', '39580', '16'), +('9', '89', '20', '111352', '38457', '16'), +('9', '89', '20', '111355', '38445', '16'), +('9', '89', '20', '111052', '37280', '16'), +('9', '89', '12', '56073', '20687', '16'), +('9', '89', '12', '53420', '20359', '16'), +('9', '89', '12', '81795', '19886', '16'), +('9', '89', '12', '104408', '18680', '16'), +('9', '89', '18', '62986', '21050', '16'), +('9', '89', '18', '104412', '20674', '16'), +('9', '89', '18', '56041', '20401', '16'), +('9', '89', '18', '94054', '19333', '16'), +('9', '89', '19', '62990', '22525', '16'), +('9', '89', '19', '56037', '21255', '16'), +('9', '89', '19', '104409', '20305', '16'), +('9', '89', '19', '56075', '19367', '16'), +('9', '89', '13', '111523', '665316', '16'), +('9', '89', '13', '111871', '634711', '16'), +('9', '89', '13', '111522', '620459', '16'), +('9', '89', '13', '111223', '586687', '16'), +('9', '89', '14', '111523', '271568', '16'), +('9', '89', '14', '111815', '271014', '16'), +('9', '89', '14', '111871', '270765', '16'), +('9', '89', '14', '111515', '262267', '16'), +('9', '89', '11', '111529', '104847', '16'), +('9', '89', '11', '111229', '100416', '16'), +('9', '89', '11', '106769', '86160', '16'), +('9', '89', '11', '62939', '84447', '16'), +('9', '90', '22', '24071', '0', '17'), +('9', '90', '22', '12425', '0', '17'), +('9', '90', '22', '39342', '0', '17'), +('9', '90', '22', '7867', '0', '17'), +('9', '90', '1', '111300', '29766', '17'), +('9', '90', '1', '111308', '29612', '17'), +('9', '90', '1', '111302', '29545', '17'), +('9', '90', '1', '111305', '29200', '17'), +('9', '90', '2', '94056', '22221', '17'), +('9', '90', '2', '62985', '20723', '17'), +('9', '90', '2', '70909', '18011', '17'), +('9', '90', '2', '104410', '16670', '17'), +('9', '90', '3', '111315', '29696', '17'), +('9', '90', '3', '111313', '29290', '17'), +('9', '90', '3', '111316', '27991', '17'), +('9', '90', '3', '111014', '27345', '17'), +('9', '90', '5', '111318', '28938', '17'), +('9', '90', '5', '111320', '27604', '17'), +('9', '90', '5', '111319', '27035', '17'), +('9', '90', '5', '111017', '26663', '17'), +('9', '90', '8', '106804', '32489', '17'), +('9', '90', '8', '94070', '30886', '17'), +('9', '90', '8', '111331', '30188', '17'), +('9', '90', '8', '106716', '29876', '17'), +('9', '90', '6', '106803', '32071', '17'), +('9', '90', '6', '106843', '32018', '17'), +('9', '90', '6', '111324', '29208', '17'), +('9', '90', '6', '111322', '29112', '17'), +('9', '90', '17', '56046', '22841', '17'), +('9', '90', '17', '56083', '21083', '17'), +('9', '90', '17', '83604', '20915', '17'), +('9', '90', '17', '81765', '20070', '17'), +('9', '90', '7', '94053', '23377', '17'), +('9', '90', '7', '104411', '21127', '17'), +('9', '90', '7', '56079', '20855', '17'), +('9', '90', '7', '102011', '14537', '17'), +('9', '90', '9', '67098', '25159', '17'), +('9', '90', '9', '56033', '21696', '17'), +('9', '90', '9', '56031', '21650', '17'), +('9', '90', '9', '56070', '21505', '17'), +('9', '90', '15', '111343', '30238', '17'), +('9', '90', '15', '111347', '28598', '17'), +('9', '90', '15', '111345', '28557', '17'), +('9', '90', '15', '111042', '27938', '17'), +('9', '90', '20', '111354', '39581', '17'), +('9', '90', '20', '111352', '38457', '17'), +('9', '90', '20', '111355', '38445', '17'), +('9', '90', '20', '111052', '37280', '17'), +('9', '90', '12', '56073', '20688', '17'), +('9', '90', '12', '53420', '20359', '17'), +('9', '90', '12', '81795', '19886', '17'), +('9', '90', '12', '104408', '18681', '17'), +('9', '90', '18', '62986', '21051', '17'), +('9', '90', '18', '104412', '20674', '17'), +('9', '90', '18', '56041', '20401', '17'), +('9', '90', '18', '94054', '19333', '17'), +('9', '90', '19', '62990', '22526', '17'), +('9', '90', '19', '56037', '21256', '17'), +('9', '90', '19', '104409', '20305', '17'), +('9', '90', '19', '56075', '19367', '17'), +('9', '90', '13', '111523', '673283', '17'), +('9', '90', '13', '111871', '642110', '17'), +('9', '90', '13', '111522', '627858', '17'), +('9', '90', '13', '111223', '593518', '17'), +('9', '90', '14', '111523', '272049', '17'), +('9', '90', '14', '111815', '271494', '17'), +('9', '90', '14', '111871', '271245', '17'), +('9', '90', '14', '111515', '262747', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '90', '11', '111529', '104847', '17'), +('9', '90', '11', '111229', '100416', '17'), +('9', '90', '11', '106769', '86161', '17'), +('9', '90', '11', '62939', '84447', '17'), +('9', '91', '22', '24071', '0', '17'), +('9', '91', '22', '12425', '0', '17'), +('9', '91', '22', '39342', '0', '17'), +('9', '91', '22', '7867', '0', '17'), +('9', '91', '1', '111300', '29766', '17'), +('9', '91', '1', '111308', '29612', '17'), +('9', '91', '1', '111302', '29545', '17'), +('9', '91', '1', '111305', '29200', '17'), +('9', '91', '2', '94056', '22221', '17'), +('9', '91', '2', '62985', '20723', '17'), +('9', '91', '2', '70909', '18011', '17'), +('9', '91', '2', '104410', '16670', '17'), +('9', '91', '3', '111315', '29696', '17'), +('9', '91', '3', '111313', '29290', '17'), +('9', '91', '3', '111316', '27992', '17'), +('9', '91', '3', '111014', '27346', '17'), +('9', '91', '5', '111318', '28939', '17'), +('9', '91', '5', '111320', '27604', '17'), +('9', '91', '5', '111319', '27035', '17'), +('9', '91', '5', '111017', '26663', '17'), +('9', '91', '8', '106804', '32490', '17'), +('9', '91', '8', '94070', '30886', '17'), +('9', '91', '8', '111331', '30188', '17'), +('9', '91', '8', '106716', '29876', '17'), +('9', '91', '6', '106803', '32071', '17'), +('9', '91', '6', '106843', '32018', '17'), +('9', '91', '6', '111324', '29208', '17'), +('9', '91', '6', '111322', '29112', '17'), +('9', '91', '17', '56046', '22841', '17'), +('9', '91', '17', '56083', '21083', '17'), +('9', '91', '17', '83604', '20915', '17'), +('9', '91', '17', '81765', '20070', '17'), +('9', '91', '7', '94053', '23377', '17'), +('9', '91', '7', '104411', '21127', '17'), +('9', '91', '7', '56079', '20856', '17'), +('9', '91', '7', '102011', '14537', '17'), +('9', '91', '9', '67098', '25159', '17'), +('9', '91', '9', '56033', '21697', '17'), +('9', '91', '9', '56031', '21650', '17'), +('9', '91', '9', '56070', '21505', '17'), +('9', '91', '15', '111343', '30238', '17'), +('9', '91', '15', '111347', '28598', '17'), +('9', '91', '15', '111345', '28557', '17'), +('9', '91', '15', '111042', '27938', '17'), +('9', '91', '20', '111354', '39581', '17'), +('9', '91', '20', '111352', '38458', '17'), +('9', '91', '20', '111355', '38445', '17'), +('9', '91', '20', '111052', '37280', '17'), +('9', '91', '12', '56073', '20688', '17'), +('9', '91', '12', '53420', '20359', '17'), +('9', '91', '12', '81795', '19886', '17'), +('9', '91', '12', '104408', '18681', '17'), +('9', '91', '18', '62986', '21051', '17'), +('9', '91', '18', '104412', '20675', '17'), +('9', '91', '18', '56041', '20401', '17'), +('9', '91', '18', '94054', '19333', '17'), +('9', '91', '19', '62990', '22526', '17'), +('9', '91', '19', '56037', '21256', '17'), +('9', '91', '19', '104409', '20305', '17'), +('9', '91', '19', '56075', '19367', '17'), +('9', '91', '13', '111523', '681307', '17'), +('9', '91', '13', '111871', '649561', '17'), +('9', '91', '13', '111522', '635310', '17'), +('9', '91', '13', '111223', '600398', '17'), +('9', '91', '14', '111523', '272529', '17'), +('9', '91', '14', '111815', '271974', '17'), +('9', '91', '14', '111871', '271725', '17'), +('9', '91', '14', '111515', '263227', '17'), +('9', '91', '11', '111529', '104848', '17'), +('9', '91', '11', '111229', '100416', '17'), +('9', '91', '11', '106769', '86161', '17'), +('9', '91', '11', '62939', '84447', '17'), +('9', '92', '22', '24071', '0', '17'), +('9', '92', '22', '12425', '0', '17'), +('9', '92', '22', '39342', '0', '17'), +('9', '92', '22', '7867', '0', '17'), +('9', '92', '1', '111300', '29766', '17'), +('9', '92', '1', '111308', '29613', '17'), +('9', '92', '1', '111302', '29546', '17'), +('9', '92', '1', '111305', '29201', '17'), +('9', '92', '2', '94056', '22222', '17'), +('9', '92', '2', '62985', '20723', '17'), +('9', '92', '2', '70909', '18012', '17'), +('9', '92', '2', '104410', '16670', '17'), +('9', '92', '3', '111315', '29697', '17'), +('9', '92', '3', '111313', '29291', '17'), +('9', '92', '3', '111316', '27992', '17'), +('9', '92', '3', '111014', '27346', '17'), +('9', '92', '5', '111318', '28939', '17'), +('9', '92', '5', '111320', '27605', '17'), +('9', '92', '5', '111319', '27035', '17'), +('9', '92', '5', '111017', '26663', '17'), +('9', '92', '8', '106804', '32490', '17'), +('9', '92', '8', '94070', '30887', '17'), +('9', '92', '8', '111331', '30189', '17'), +('9', '92', '8', '106716', '29877', '17'), +('9', '92', '6', '106803', '32071', '17'), +('9', '92', '6', '106843', '32019', '17'), +('9', '92', '6', '111324', '29209', '17'), +('9', '92', '6', '111322', '29112', '17'), +('9', '92', '17', '56046', '22841', '17'), +('9', '92', '17', '56083', '21083', '17'), +('9', '92', '17', '83604', '20915', '17'), +('9', '92', '17', '81765', '20071', '17'), +('9', '92', '7', '94053', '23377', '17'), +('9', '92', '7', '104411', '21127', '17'), +('9', '92', '7', '56079', '20856', '17'), +('9', '92', '7', '102011', '14537', '17'), +('9', '92', '9', '67098', '25159', '17'), +('9', '92', '9', '56033', '21697', '17'), +('9', '92', '9', '56031', '21650', '17'), +('9', '92', '9', '56070', '21505', '17'), +('9', '92', '15', '111343', '30239', '17'), +('9', '92', '15', '111347', '28599', '17'), +('9', '92', '15', '111345', '28557', '17'), +('9', '92', '15', '111042', '27938', '17'), +('9', '92', '20', '111354', '39581', '17'), +('9', '92', '20', '111352', '38458', '17'), +('9', '92', '20', '111355', '38445', '17'), +('9', '92', '20', '111052', '37281', '17'), +('9', '92', '12', '56073', '20688', '17'), +('9', '92', '12', '53420', '20360', '17'), +('9', '92', '12', '81795', '19887', '17'), +('9', '92', '12', '104408', '18681', '17'), +('9', '92', '18', '62986', '21051', '17'), +('9', '92', '18', '104412', '20675', '17'), +('9', '92', '18', '56041', '20401', '17'), +('9', '92', '18', '94054', '19334', '17'), +('9', '92', '19', '62990', '22526', '17'), +('9', '92', '19', '56037', '21256', '17'), +('9', '92', '19', '104409', '20306', '17'), +('9', '92', '19', '56075', '19368', '17'), +('9', '92', '13', '111523', '689388', '17'), +('9', '92', '13', '111871', '657066', '17'), +('9', '92', '13', '111522', '642814', '17'), +('9', '92', '13', '111223', '607325', '17'), +('9', '92', '14', '111523', '273009', '17'), +('9', '92', '14', '111815', '272455', '17'), +('9', '92', '14', '111871', '272206', '17'), +('9', '92', '14', '111515', '263707', '17'), +('9', '92', '11', '111529', '104848', '17'), +('9', '92', '11', '111229', '100416', '17'), +('9', '92', '11', '106769', '86161', '17'), +('9', '92', '11', '62939', '84448', '17'), +('9', '93', '22', '24071', '0', '17'), +('9', '93', '22', '12425', '0', '17'), +('9', '93', '22', '39342', '0', '17'), +('9', '93', '22', '7867', '0', '17'), +('9', '93', '1', '111300', '29766', '17'), +('9', '93', '1', '111308', '29613', '17'), +('9', '93', '1', '111302', '29546', '17'), +('9', '93', '1', '111305', '29201', '17'), +('9', '93', '2', '94056', '22222', '17'), +('9', '93', '2', '62985', '20723', '17'), +('9', '93', '2', '70909', '18012', '17'), +('9', '93', '2', '104410', '16671', '17'), +('9', '93', '3', '111315', '29697', '17'), +('9', '93', '3', '111313', '29291', '17'), +('9', '93', '3', '111316', '27992', '17'), +('9', '93', '3', '111014', '27346', '17'), +('9', '93', '5', '111318', '28939', '17'), +('9', '93', '5', '111320', '27605', '17'), +('9', '93', '5', '111319', '27036', '17'), +('9', '93', '5', '111017', '26663', '17'), +('9', '93', '8', '106804', '32490', '17'), +('9', '93', '8', '94070', '30887', '17'), +('9', '93', '8', '111331', '30189', '17'), +('9', '93', '8', '106716', '29877', '17'), +('9', '93', '6', '106803', '32071', '17'), +('9', '93', '6', '106843', '32019', '17'), +('9', '93', '6', '111324', '29209', '17'), +('9', '93', '6', '111322', '29112', '17'), +('9', '93', '17', '56046', '22842', '17'), +('9', '93', '17', '56083', '21084', '17'), +('9', '93', '17', '83604', '20916', '17'), +('9', '93', '17', '81765', '20071', '17'), +('9', '93', '7', '94053', '23378', '17'), +('9', '93', '7', '104411', '21127', '17'), +('9', '93', '7', '56079', '20856', '17'), +('9', '93', '7', '102011', '14537', '17'), +('9', '93', '9', '67098', '25159', '17'), +('9', '93', '9', '56033', '21697', '17'), +('9', '93', '9', '56031', '21650', '17'), +('9', '93', '9', '56070', '21505', '17'), +('9', '93', '15', '111343', '30239', '17'), +('9', '93', '15', '111347', '28599', '17'), +('9', '93', '15', '111345', '28557', '17'), +('9', '93', '15', '111042', '27938', '17'), +('9', '93', '20', '111354', '39581', '17'), +('9', '93', '20', '111352', '38458', '17'), +('9', '93', '20', '111355', '38446', '17'), +('9', '93', '20', '111052', '37281', '17'), +('9', '93', '12', '56073', '20689', '17'), +('9', '93', '12', '53420', '20360', '17'), +('9', '93', '12', '81795', '19887', '17'), +('9', '93', '12', '104408', '18681', '17'), +('9', '93', '18', '62986', '21052', '17'), +('9', '93', '18', '104412', '20675', '17'), +('9', '93', '18', '56041', '20402', '17'), +('9', '93', '18', '94054', '19334', '17'), +('9', '93', '19', '62990', '22526', '17'), +('9', '93', '19', '56037', '21256', '17'), +('9', '93', '19', '104409', '20306', '17'), +('9', '93', '19', '56075', '19368', '17'), +('9', '93', '13', '111523', '697526', '17'), +('9', '93', '13', '111871', '664623', '17'), +('9', '93', '13', '111522', '650371', '17'), +('9', '93', '13', '111223', '614301', '17'), +('9', '93', '14', '111523', '273489', '17'), +('9', '93', '14', '111815', '272935', '17'), +('9', '93', '14', '111871', '272686', '17'), +('9', '93', '14', '111515', '264188', '17'), +('9', '93', '11', '111529', '104848', '17'), +('9', '93', '11', '111229', '100417', '17'), +('9', '93', '11', '106769', '86161', '17'), +('9', '93', '11', '62939', '84448', '17'), +('9', '94', '22', '24071', '0', '17'), +('9', '94', '22', '12425', '0', '17'), +('9', '94', '22', '39342', '0', '17'), +('9', '94', '22', '7867', '0', '17'), +('9', '94', '1', '111300', '29767', '17'), +('9', '94', '1', '111308', '29613', '17'), +('9', '94', '1', '111302', '29546', '17'), +('9', '94', '1', '111305', '29201', '17'), +('9', '94', '2', '94056', '22222', '17'), +('9', '94', '2', '62985', '20723', '17'), +('9', '94', '2', '70909', '18012', '17'), +('9', '94', '2', '104410', '16671', '17'), +('9', '94', '3', '111315', '29697', '17'), +('9', '94', '3', '111313', '29291', '17'), +('9', '94', '3', '111316', '27992', '17'), +('9', '94', '3', '111014', '27347', '17'), +('9', '94', '5', '111318', '28939', '17'), +('9', '94', '5', '111320', '27605', '17'), +('9', '94', '5', '111319', '27036', '17'), +('9', '94', '5', '111017', '26664', '17'), +('9', '94', '8', '106804', '32490', '17'), +('9', '94', '8', '94070', '30887', '17'), +('9', '94', '8', '111331', '30189', '17'), +('9', '94', '8', '106716', '29877', '17'), +('9', '94', '6', '106803', '32071', '17'), +('9', '94', '6', '106843', '32019', '17'), +('9', '94', '6', '111324', '29209', '17'), +('9', '94', '6', '111322', '29113', '17'), +('9', '94', '17', '56046', '22842', '17'), +('9', '94', '17', '56083', '21084', '17'), +('9', '94', '17', '83604', '20916', '17'), +('9', '94', '17', '81765', '20071', '17'), +('9', '94', '7', '94053', '23378', '17'), +('9', '94', '7', '104411', '21127', '17'), +('9', '94', '7', '56079', '20857', '17'), +('9', '94', '7', '102011', '14538', '17'), +('9', '94', '9', '67098', '25160', '17'), +('9', '94', '9', '56033', '21697', '17'), +('9', '94', '9', '56031', '21650', '17'), +('9', '94', '9', '56070', '21505', '17'), +('9', '94', '15', '111343', '30239', '17'), +('9', '94', '15', '111347', '28599', '17'), +('9', '94', '15', '111345', '28557', '17'), +('9', '94', '15', '111042', '27938', '17'), +('9', '94', '20', '111354', '39582', '17'), +('9', '94', '20', '111352', '38458', '17'), +('9', '94', '20', '111355', '38446', '17'), +('9', '94', '20', '111052', '37281', '17'), +('9', '94', '12', '56073', '20689', '17'), +('9', '94', '12', '53420', '20360', '17'), +('9', '94', '12', '81795', '19887', '17'), +('9', '94', '12', '104408', '18682', '17'), +('9', '94', '18', '62986', '21052', '17'), +('9', '94', '18', '104412', '20675', '17'), +('9', '94', '18', '56041', '20402', '17'), +('9', '94', '18', '94054', '19334', '17'), +('9', '94', '19', '62990', '22527', '17'), +('9', '94', '19', '56037', '21257', '17'), +('9', '94', '19', '104409', '20306', '17'), +('9', '94', '19', '56075', '19368', '17'), +('9', '94', '13', '111523', '705721', '17'), +('9', '94', '13', '111871', '672232', '17'), +('9', '94', '13', '111522', '657980', '17'), +('9', '94', '13', '111223', '621325', '17'), +('9', '94', '14', '111523', '273970', '17'), +('9', '94', '14', '111815', '273415', '17'), +('9', '94', '14', '111871', '273166', '17'), +('9', '94', '14', '111515', '264668', '17'), +('9', '94', '11', '111529', '104848', '17'), +('9', '94', '11', '111229', '100417', '17'), +('9', '94', '11', '106769', '86162', '17'), +('9', '94', '11', '62939', '84448', '17'), +('9', '95', '22', '39342', '0', '18'), +('9', '95', '22', '24071', '0', '18'), +('9', '95', '22', '12425', '0', '18'), +('9', '95', '22', '7867', '0', '18'), +('9', '95', '1', '111300', '29767', '18'), +('9', '95', '1', '111308', '29614', '18'), +('9', '95', '1', '111302', '29547', '18'), +('9', '95', '1', '111305', '29201', '18'), +('9', '95', '2', '94056', '22222', '18'), +('9', '95', '2', '62985', '20723', '18'), +('9', '95', '2', '70909', '18013', '18'), +('9', '95', '2', '104410', '16671', '18'), +('9', '95', '3', '111315', '29698', '18'), +('9', '95', '3', '111313', '29291', '18'), +('9', '95', '3', '111316', '27993', '18'), +('9', '95', '3', '111014', '27347', '18'), +('9', '95', '5', '111318', '28939', '18'), +('9', '95', '5', '111320', '27606', '18'), +('9', '95', '5', '111319', '27036', '18'), +('9', '95', '5', '111017', '26664', '18'), +('9', '95', '8', '106804', '32491', '18'), +('9', '95', '8', '94070', '30887', '18'), +('9', '95', '8', '111331', '30189', '18'), +('9', '95', '8', '106716', '29878', '18'), +('9', '95', '6', '106803', '32071', '18'), +('9', '95', '6', '106843', '32020', '18'), +('9', '95', '6', '111324', '29209', '18'), +('9', '95', '6', '111322', '29113', '18'), +('9', '95', '17', '56046', '22842', '18'), +('9', '95', '17', '56083', '21084', '18'), +('9', '95', '17', '83604', '20916', '18'), +('9', '95', '17', '81765', '20071', '18'), +('9', '95', '7', '94053', '23378', '18'), +('9', '95', '7', '104411', '21128', '18'), +('9', '95', '7', '56079', '20857', '18'), +('9', '95', '7', '102011', '14538', '18'), +('9', '95', '9', '67098', '25160', '18'), +('9', '95', '9', '56033', '21697', '18'), +('9', '95', '9', '56031', '21650', '18'), +('9', '95', '9', '56070', '21505', '18'), +('9', '95', '15', '111343', '30239', '18'), +('9', '95', '15', '111347', '28600', '18'), +('9', '95', '15', '111345', '28558', '18'), +('9', '95', '15', '111042', '27939', '18'), +('9', '95', '20', '111354', '39582', '18'), +('9', '95', '20', '111352', '38459', '18'), +('9', '95', '20', '111355', '38446', '18'), +('9', '95', '20', '111052', '37281', '18'), +('9', '95', '12', '56073', '20690', '18'), +('9', '95', '12', '53420', '20360', '18'), +('9', '95', '12', '81795', '19888', '18'), +('9', '95', '12', '104408', '18682', '18'), +('9', '95', '18', '62986', '21053', '18'), +('9', '95', '18', '104412', '20675', '18'), +('9', '95', '18', '56041', '20402', '18'), +('9', '95', '18', '94054', '19335', '18'), +('9', '95', '19', '62990', '22527', '18'), +('9', '95', '19', '56037', '21257', '18'), +('9', '95', '19', '104409', '20307', '18'), +('9', '95', '19', '56075', '19368', '18'), +('9', '95', '13', '111523', '713972', '18'), +('9', '95', '13', '111871', '679894', '18'), +('9', '95', '13', '111522', '665642', '18'), +('9', '95', '13', '111223', '628397', '18'), +('9', '95', '14', '111523', '274450', '18'), +('9', '95', '14', '111815', '273896', '18'), +('9', '95', '14', '111871', '273646', '18'), +('9', '95', '14', '111515', '265148', '18'), +('9', '95', '11', '111529', '104849', '18'), +('9', '95', '11', '111229', '100417', '18'), +('9', '95', '11', '106769', '86162', '18'), +('9', '95', '11', '62939', '84448', '18'), +('9', '96', '22', '39342', '0', '18'), +('9', '96', '22', '24071', '0', '18'), +('9', '96', '22', '12425', '0', '18'), +('9', '96', '22', '7867', '0', '18'), +('9', '96', '1', '111300', '29767', '18'), +('9', '96', '1', '111308', '29614', '18'), +('9', '96', '1', '111302', '29547', '18'), +('9', '96', '1', '111305', '29202', '18'), +('9', '96', '2', '94056', '22223', '18'), +('9', '96', '2', '62985', '20724', '18'), +('9', '96', '2', '70909', '18013', '18'), +('9', '96', '2', '104410', '16671', '18'), +('9', '96', '3', '111315', '29698', '18'), +('9', '96', '3', '111313', '29291', '18'), +('9', '96', '3', '111316', '27993', '18'), +('9', '96', '3', '111014', '27348', '18'), +('9', '96', '5', '111318', '28940', '18'), +('9', '96', '5', '111320', '27606', '18'), +('9', '96', '5', '111319', '27037', '18'), +('9', '96', '5', '111017', '26664', '18'), +('9', '96', '8', '106804', '32491', '18'), +('9', '96', '8', '94070', '30888', '18'), +('9', '96', '8', '111331', '30190', '18'), +('9', '96', '8', '106716', '29878', '18'), +('9', '96', '6', '106803', '32071', '18'), +('9', '96', '6', '106843', '32020', '18'), +('9', '96', '6', '111324', '29210', '18'), +('9', '96', '6', '111322', '29113', '18'), +('9', '96', '17', '56046', '22843', '18'), +('9', '96', '17', '56083', '21084', '18'), +('9', '96', '17', '83604', '20916', '18'), +('9', '96', '17', '81765', '20072', '18'), +('9', '96', '7', '94053', '23378', '18'), +('9', '96', '7', '104411', '21128', '18'), +('9', '96', '7', '56079', '20857', '18'), +('9', '96', '7', '102011', '14538', '18'), +('9', '96', '9', '67098', '25160', '18'), +('9', '96', '9', '56033', '21697', '18'), +('9', '96', '9', '56031', '21651', '18'), +('9', '96', '9', '56070', '21505', '18'), +('9', '96', '15', '111343', '30239', '18'), +('9', '96', '15', '111347', '28600', '18'), +('9', '96', '15', '111345', '28558', '18'), +('9', '96', '15', '111042', '27939', '18'), +('9', '96', '20', '111354', '39582', '18'), +('9', '96', '20', '111352', '38459', '18'), +('9', '96', '20', '111355', '38446', '18'), +('9', '96', '20', '111052', '37281', '18'), +('9', '96', '12', '56073', '20690', '18'), +('9', '96', '12', '53420', '20360', '18'), +('9', '96', '12', '81795', '19888', '18'), +('9', '96', '12', '104408', '18682', '18'), +('9', '96', '18', '62986', '21053', '18'), +('9', '96', '18', '104412', '20675', '18'), +('9', '96', '18', '56041', '20402', '18'), +('9', '96', '18', '94054', '19335', '18'), +('9', '96', '19', '62990', '22527', '18'), +('9', '96', '19', '56037', '21257', '18'), +('9', '96', '19', '104409', '20307', '18'), +('9', '96', '19', '56075', '19369', '18'), +('9', '96', '13', '111523', '722281', '18'), +('9', '96', '13', '111871', '687608', '18'), +('9', '96', '13', '111522', '673356', '18'), +('9', '96', '13', '111223', '635518', '18'), +('9', '96', '14', '111523', '274930', '18'), +('9', '96', '14', '111815', '274376', '18'), +('9', '96', '14', '111871', '274127', '18'), +('9', '96', '14', '111515', '265628', '18'), +('9', '96', '11', '111529', '104849', '18'), +('9', '96', '11', '111229', '100417', '18'), +('9', '96', '11', '106769', '86162', '18'), +('9', '96', '11', '62939', '84449', '18'), +('9', '97', '22', '39342', '0', '18'), +('9', '97', '22', '24071', '0', '18'), +('9', '97', '22', '12425', '0', '18'), +('9', '97', '22', '7867', '0', '18'), +('9', '97', '1', '111300', '29767', '18'), +('9', '97', '1', '111308', '29614', '18'), +('9', '97', '1', '111302', '29547', '18'), +('9', '97', '1', '111305', '29202', '18'), +('9', '97', '2', '94056', '22223', '18'), +('9', '97', '2', '62985', '20724', '18'), +('9', '97', '2', '70909', '18013', '18'), +('9', '97', '2', '104410', '16672', '18'), +('9', '97', '3', '111315', '29699', '18'), +('9', '97', '3', '111313', '29292', '18'), +('9', '97', '3', '111316', '27993', '18'), +('9', '97', '3', '111014', '27348', '18'), +('9', '97', '5', '111318', '28940', '18'), +('9', '97', '5', '111320', '27606', '18'), +('9', '97', '5', '111319', '27037', '18'), +('9', '97', '5', '111017', '26664', '18'), +('9', '97', '8', '106804', '32491', '18'), +('9', '97', '8', '94070', '30888', '18'), +('9', '97', '8', '111331', '30190', '18'), +('9', '97', '8', '106716', '29878', '18'), +('9', '97', '6', '106803', '32071', '18'), +('9', '97', '6', '106843', '32020', '18'), +('9', '97', '6', '111324', '29210', '18'), +('9', '97', '6', '111322', '29113', '18'), +('9', '97', '17', '56046', '22843', '18'), +('9', '97', '17', '56083', '21084', '18'), +('9', '97', '17', '83604', '20917', '18'), +('9', '97', '17', '81765', '20072', '18'), +('9', '97', '7', '94053', '23379', '18'), +('9', '97', '7', '104411', '21128', '18'), +('9', '97', '7', '56079', '20857', '18'), +('9', '97', '7', '102011', '14538', '18'), +('9', '97', '9', '67098', '25160', '18'), +('9', '97', '9', '56033', '21697', '18'), +('9', '97', '9', '56031', '21651', '18'), +('9', '97', '9', '56070', '21505', '18'), +('9', '97', '15', '111343', '30239', '18'), +('9', '97', '15', '111347', '28600', '18'), +('9', '97', '15', '111345', '28558', '18'), +('9', '97', '15', '111042', '27939', '18'), +('9', '97', '20', '111354', '39582', '18'), +('9', '97', '20', '111352', '38459', '18'), +('9', '97', '20', '111355', '38446', '18'), +('9', '97', '20', '111052', '37282', '18'), +('9', '97', '12', '56073', '20690', '18'), +('9', '97', '12', '53420', '20361', '18'), +('9', '97', '12', '81795', '19888', '18'), +('9', '97', '12', '104408', '18682', '18'), +('9', '97', '18', '62986', '21053', '18'), +('9', '97', '18', '104412', '20675', '18'), +('9', '97', '18', '56041', '20402', '18'), +('9', '97', '18', '94054', '19335', '18'), +('9', '97', '19', '62990', '22527', '18'), +('9', '97', '19', '56037', '21257', '18'), +('9', '97', '19', '104409', '20307', '18'), +('9', '97', '19', '56075', '19369', '18'), +('9', '97', '13', '111523', '730646', '18'), +('9', '97', '13', '111871', '695375', '18'), +('9', '97', '13', '111522', '681123', '18'), +('9', '97', '13', '111223', '642686', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '97', '14', '111523', '275411', '18'), +('9', '97', '14', '111815', '274856', '18'), +('9', '97', '14', '111871', '274607', '18'), +('9', '97', '14', '111515', '266109', '18'), +('9', '97', '11', '111529', '104849', '18'), +('9', '97', '11', '111229', '100418', '18'), +('9', '97', '11', '106769', '86162', '18'), +('9', '97', '11', '62939', '84449', '18'), +('9', '98', '22', '39342', '0', '18'), +('9', '98', '22', '24071', '0', '18'), +('9', '98', '22', '12425', '0', '18'), +('9', '98', '22', '7867', '0', '18'), +('9', '98', '1', '111300', '29767', '18'), +('9', '98', '1', '111308', '29614', '18'), +('9', '98', '1', '111302', '29548', '18'), +('9', '98', '1', '111305', '29202', '18'), +('9', '98', '2', '94056', '22223', '18'), +('9', '98', '2', '62985', '20724', '18'), +('9', '98', '2', '70909', '18013', '18'), +('9', '98', '2', '104410', '16672', '18'), +('9', '98', '3', '111315', '29699', '18'), +('9', '98', '3', '111313', '29292', '18'), +('9', '98', '3', '111316', '27993', '18'), +('9', '98', '3', '111014', '27348', '18'), +('9', '98', '5', '111318', '28940', '18'), +('9', '98', '5', '111320', '27606', '18'), +('9', '98', '5', '111319', '27037', '18'), +('9', '98', '5', '111017', '26664', '18'), +('9', '98', '8', '106804', '32491', '18'), +('9', '98', '8', '94070', '30888', '18'), +('9', '98', '8', '111331', '30190', '18'), +('9', '98', '8', '106716', '29879', '18'), +('9', '98', '6', '106803', '32072', '18'), +('9', '98', '6', '106843', '32021', '18'), +('9', '98', '6', '111324', '29210', '18'), +('9', '98', '6', '111322', '29114', '18'), +('9', '98', '17', '56046', '22843', '18'), +('9', '98', '17', '56083', '21084', '18'), +('9', '98', '17', '83604', '20917', '18'), +('9', '98', '17', '81765', '20072', '18'), +('9', '98', '7', '94053', '23379', '18'), +('9', '98', '7', '104411', '21128', '18'), +('9', '98', '7', '56079', '20858', '18'), +('9', '98', '7', '102011', '14539', '18'), +('9', '98', '9', '67098', '25160', '18'), +('9', '98', '9', '56033', '21698', '18'), +('9', '98', '9', '56031', '21651', '18'), +('9', '98', '9', '56070', '21505', '18'), +('9', '98', '15', '111343', '30240', '18'), +('9', '98', '15', '111347', '28601', '18'), +('9', '98', '15', '111345', '28558', '18'), +('9', '98', '15', '111042', '27939', '18'), +('9', '98', '20', '111354', '39583', '18'), +('9', '98', '20', '111352', '38460', '18'), +('9', '98', '20', '111355', '38446', '18'), +('9', '98', '20', '111052', '37282', '18'), +('9', '98', '12', '56073', '20691', '18'), +('9', '98', '12', '53420', '20361', '18'), +('9', '98', '12', '81795', '19889', '18'), +('9', '98', '12', '104408', '18683', '18'), +('9', '98', '18', '62986', '21054', '18'), +('9', '98', '18', '104412', '20675', '18'), +('9', '98', '18', '56041', '20402', '18'), +('9', '98', '18', '94054', '19335', '18'), +('9', '98', '19', '62990', '22528', '18'), +('9', '98', '19', '56037', '21258', '18'), +('9', '98', '19', '104409', '20308', '18'), +('9', '98', '19', '56075', '19369', '18'), +('9', '98', '13', '111523', '739068', '18'), +('9', '98', '13', '111871', '703195', '18'), +('9', '98', '13', '111522', '688943', '18'), +('9', '98', '13', '111223', '649903', '18'), +('9', '98', '14', '111523', '275891', '18'), +('9', '98', '14', '111815', '275336', '18'), +('9', '98', '14', '111871', '275087', '18'), +('9', '98', '14', '111515', '266589', '18'), +('9', '98', '11', '111529', '104849', '18'), +('9', '98', '11', '111229', '100418', '18'), +('9', '98', '11', '106769', '86163', '18'), +('9', '98', '11', '62939', '84449', '18'), +('9', '99', '22', '39342', '0', '18'), +('9', '99', '22', '24071', '0', '18'), +('9', '99', '22', '12425', '0', '18'), +('9', '99', '22', '7867', '0', '18'), +('9', '99', '1', '111300', '29768', '18'), +('9', '99', '1', '111308', '29615', '18'), +('9', '99', '1', '111302', '29548', '18'), +('9', '99', '1', '111305', '29202', '18'), +('9', '99', '2', '94056', '22223', '18'), +('9', '99', '2', '62985', '20724', '18'), +('9', '99', '2', '70909', '18014', '18'), +('9', '99', '2', '104410', '16672', '18'), +('9', '99', '3', '111315', '29699', '18'), +('9', '99', '3', '111313', '29292', '18'), +('9', '99', '3', '111316', '27994', '18'), +('9', '99', '3', '111014', '27349', '18'), +('9', '99', '5', '111318', '28940', '18'), +('9', '99', '5', '111320', '27607', '18'), +('9', '99', '5', '111319', '27038', '18'), +('9', '99', '5', '111017', '26665', '18'), +('9', '99', '8', '106804', '32492', '18'), +('9', '99', '8', '94070', '30888', '18'), +('9', '99', '8', '111331', '30191', '18'), +('9', '99', '8', '106716', '29879', '18'), +('9', '99', '6', '106803', '32072', '18'), +('9', '99', '6', '106843', '32021', '18'), +('9', '99', '6', '111324', '29211', '18'), +('9', '99', '6', '111322', '29114', '18'), +('9', '99', '17', '56046', '22844', '18'), +('9', '99', '17', '56083', '21084', '18'), +('9', '99', '17', '83604', '20917', '18'), +('9', '99', '17', '81765', '20072', '18'), +('9', '99', '7', '94053', '23379', '18'), +('9', '99', '7', '104411', '21129', '18'), +('9', '99', '7', '56079', '20858', '18'), +('9', '99', '7', '102011', '14539', '18'), +('9', '99', '9', '67098', '25161', '18'), +('9', '99', '9', '56033', '21698', '18'), +('9', '99', '9', '56031', '21651', '18'), +('9', '99', '9', '56070', '21506', '18'), +('9', '99', '15', '111343', '30240', '18'), +('9', '99', '15', '111347', '28601', '18'), +('9', '99', '15', '111345', '28558', '18'), +('9', '99', '15', '111042', '27939', '18'), +('9', '99', '20', '111354', '39583', '18'), +('9', '99', '20', '111352', '38460', '18'), +('9', '99', '20', '111355', '38447', '18'), +('9', '99', '20', '111052', '37282', '18'), +('9', '99', '12', '56073', '20691', '18'), +('9', '99', '12', '53420', '20361', '18'), +('9', '99', '12', '81795', '19889', '18'), +('9', '99', '12', '104408', '18683', '18'), +('9', '99', '18', '62986', '21054', '18'), +('9', '99', '18', '104412', '20676', '18'), +('9', '99', '18', '56041', '20402', '18'), +('9', '99', '18', '94054', '19336', '18'), +('9', '99', '19', '62990', '22528', '18'), +('9', '99', '19', '56037', '21258', '18'), +('9', '99', '19', '104409', '20308', '18'), +('9', '99', '19', '56075', '19369', '18'), +('9', '99', '13', '111523', '747548', '18'), +('9', '99', '13', '111871', '711067', '18'), +('9', '99', '13', '111522', '696815', '18'), +('9', '99', '13', '111223', '657169', '18'), +('9', '99', '14', '111523', '276371', '18'), +('9', '99', '14', '111815', '275817', '18'), +('9', '99', '14', '111871', '275568', '18'), +('9', '99', '14', '111515', '267069', '18'), +('9', '99', '11', '111529', '104850', '18'), +('9', '99', '11', '111229', '100418', '18'), +('9', '99', '11', '106769', '86163', '18'), +('9', '99', '11', '62939', '84450', '18'), +('9', '100', '22', '39342', '0', '20'), +('9', '100', '22', '24071', '0', '20'), +('9', '100', '22', '12425', '0', '20'), +('9', '100', '22', '7867', '0', '20'), +('9', '100', '1', '98769', '37501', '20'), +('9', '100', '1', '111300', '29768', '20'), +('9', '100', '1', '111308', '29615', '20'), +('9', '100', '1', '111302', '29548', '20'), +('9', '100', '2', '94056', '22223', '20'), +('9', '100', '2', '62985', '20724', '20'), +('9', '100', '2', '70909', '18014', '20'), +('9', '100', '2', '104410', '16672', '20'), +('9', '100', '3', '111315', '29700', '20'), +('9', '100', '3', '111313', '29292', '20'), +('9', '100', '3', '111316', '27994', '20'), +('9', '100', '3', '111014', '27349', '20'), +('9', '100', '5', '111318', '28940', '20'), +('9', '100', '5', '111320', '27607', '20'), +('9', '100', '5', '111319', '27038', '20'), +('9', '100', '5', '111017', '26665', '20'), +('9', '100', '8', '106804', '32492', '20'), +('9', '100', '8', '94070', '30889', '20'), +('9', '100', '8', '111331', '30191', '20'), +('9', '100', '8', '106716', '29879', '20'), +('9', '100', '6', '106803', '32072', '20'), +('9', '100', '6', '106843', '32021', '20'), +('9', '100', '6', '111324', '29211', '20'), +('9', '100', '6', '111322', '29114', '20'), +('9', '100', '17', '56046', '22844', '20'), +('9', '100', '17', '56083', '21085', '20'), +('9', '100', '17', '83604', '20918', '20'), +('9', '100', '17', '81765', '20072', '20'), +('9', '100', '7', '94053', '23380', '20'), +('9', '100', '7', '104411', '21129', '20'), +('9', '100', '7', '56079', '20858', '20'), +('9', '100', '7', '102011', '14539', '20'), +('9', '100', '9', '67098', '25161', '20'), +('9', '100', '9', '56033', '21698', '20'), +('9', '100', '9', '56031', '21651', '20'), +('9', '100', '9', '56070', '21506', '20'), +('9', '100', '15', '111343', '30240', '20'), +('9', '100', '15', '111347', '28601', '20'), +('9', '100', '15', '111345', '28559', '20'), +('9', '100', '15', '111042', '27940', '20'), +('9', '100', '20', '111354', '39583', '20'), +('9', '100', '20', '111352', '38460', '20'), +('9', '100', '20', '111355', '38447', '20'), +('9', '100', '20', '111052', '37282', '20'), +('9', '100', '12', '56073', '20691', '20'), +('9', '100', '12', '53420', '20361', '20'), +('9', '100', '12', '81795', '19889', '20'), +('9', '100', '12', '104408', '18683', '20'), +('9', '100', '18', '62986', '21054', '20'), +('9', '100', '18', '104412', '20676', '20'), +('9', '100', '18', '56041', '20402', '20'), +('9', '100', '18', '94054', '19336', '20'), +('9', '100', '19', '62990', '22528', '20'), +('9', '100', '19', '56037', '21258', '20'), +('9', '100', '19', '104409', '20309', '20'), +('9', '100', '19', '56075', '19370', '20'), +('9', '100', '13', '111523', '758484', '20'), +('9', '100', '13', '111871', '721392', '20'), +('9', '100', '13', '111522', '707140', '20'), +('9', '100', '13', '111223', '666882', '20'), +('9', '100', '14', '111523', '279252', '20'), +('9', '100', '14', '111815', '278697', '20'), +('9', '100', '14', '111871', '278448', '20'), +('9', '100', '14', '111515', '269949', '20'), +('9', '100', '11', '111529', '104850', '20'), +('9', '100', '11', '111229', '100418', '20'), +('9', '100', '11', '106769', '86163', '20'), +('9', '100', '11', '62939', '84450', '20'), +('9', '100', '22', '39342', '0', '19'), +('9', '100', '22', '24071', '0', '19'), +('9', '100', '22', '12425', '0', '19'), +('9', '100', '22', '7867', '0', '19'), +('9', '100', '1', '98769', '37501', '19'), +('9', '100', '1', '111300', '29768', '19'), +('9', '100', '1', '111308', '29615', '19'), +('9', '100', '1', '111302', '29548', '19'), +('9', '100', '2', '94056', '22223', '19'), +('9', '100', '2', '62985', '20724', '19'), +('9', '100', '2', '70909', '18014', '19'), +('9', '100', '2', '104410', '16672', '19'), +('9', '100', '3', '111315', '29700', '19'), +('9', '100', '3', '111313', '29292', '19'), +('9', '100', '3', '111316', '27994', '19'), +('9', '100', '3', '111014', '27349', '19'), +('9', '100', '5', '111318', '28940', '19'), +('9', '100', '5', '111320', '27607', '19'), +('9', '100', '5', '111319', '27038', '19'), +('9', '100', '5', '111017', '26665', '19'), +('9', '100', '8', '106804', '32492', '19'), +('9', '100', '8', '94070', '30889', '19'), +('9', '100', '8', '111331', '30191', '19'), +('9', '100', '8', '106716', '29879', '19'), +('9', '100', '6', '106803', '32072', '19'), +('9', '100', '6', '106843', '32021', '19'), +('9', '100', '6', '111324', '29211', '19'), +('9', '100', '6', '111322', '29114', '19'), +('9', '100', '17', '56046', '22844', '19'), +('9', '100', '17', '56083', '21085', '19'), +('9', '100', '17', '83604', '20918', '19'), +('9', '100', '17', '81765', '20072', '19'), +('9', '100', '7', '94053', '23380', '19'), +('9', '100', '7', '104411', '21129', '19'), +('9', '100', '7', '56079', '20858', '19'), +('9', '100', '7', '102011', '14539', '19'), +('9', '100', '9', '67098', '25161', '19'), +('9', '100', '9', '56033', '21698', '19'), +('9', '100', '9', '56031', '21651', '19'), +('9', '100', '9', '56070', '21506', '19'), +('9', '100', '15', '111343', '30240', '19'), +('9', '100', '15', '111347', '28601', '19'), +('9', '100', '15', '111345', '28559', '19'), +('9', '100', '15', '111042', '27940', '19'), +('9', '100', '20', '111354', '39583', '19'), +('9', '100', '20', '111352', '38460', '19'), +('9', '100', '20', '111355', '38447', '19'), +('9', '100', '20', '111052', '37282', '19'), +('9', '100', '12', '56073', '20691', '19'), +('9', '100', '12', '53420', '20361', '19'), +('9', '100', '12', '81795', '19889', '19'), +('9', '100', '12', '104408', '18683', '19'), +('9', '100', '18', '62986', '21054', '19'), +('9', '100', '18', '104412', '20676', '19'), +('9', '100', '18', '56041', '20402', '19'), +('9', '100', '18', '94054', '19336', '19'), +('9', '100', '19', '62990', '22528', '19'), +('9', '100', '19', '56037', '21258', '19'), +('9', '100', '19', '104409', '20309', '19'), +('9', '100', '19', '56075', '19370', '19'), +('9', '100', '13', '111523', '756084', '19'), +('9', '100', '13', '111871', '718992', '19'), +('9', '100', '13', '111522', '704740', '19'), +('9', '100', '13', '111223', '664482', '19'), +('9', '100', '14', '111523', '276852', '19'), +('9', '100', '14', '111815', '276297', '19'), +('9', '100', '14', '111871', '276048', '19'), +('9', '100', '14', '111515', '267549', '19'), +('9', '100', '11', '111529', '104850', '19'), +('9', '100', '11', '111229', '100418', '19'), +('9', '100', '11', '106769', '86163', '19'), +('9', '100', '11', '62939', '84450', '19'), +('9', '101', '22', '39342', '0', '20'), +('9', '101', '22', '24071', '0', '20'), +('9', '101', '22', '12425', '0', '20'), +('9', '101', '22', '7867', '0', '20'), +('9', '101', '1', '98769', '37501', '20'), +('9', '101', '1', '111300', '29768', '20'), +('9', '101', '1', '111308', '29615', '20'), +('9', '101', '1', '111302', '29549', '20'), +('9', '101', '2', '94056', '22224', '20'), +('9', '101', '2', '62985', '20724', '20'), +('9', '101', '2', '70909', '18014', '20'), +('9', '101', '2', '104410', '16672', '20'), +('9', '101', '3', '111315', '29700', '20'), +('9', '101', '3', '111313', '29292', '20'), +('9', '101', '3', '111316', '27994', '20'), +('9', '101', '3', '111014', '27350', '20'), +('9', '101', '5', '111318', '28941', '20'), +('9', '101', '5', '111320', '27607', '20'), +('9', '101', '5', '111319', '27038', '20'), +('9', '101', '5', '111017', '26665', '20'), +('9', '101', '8', '106804', '32492', '20'), +('9', '101', '8', '94070', '30889', '20'), +('9', '101', '8', '111331', '30191', '20'), +('9', '101', '8', '106716', '29880', '20'), +('9', '101', '6', '106803', '32072', '20'), +('9', '101', '6', '106843', '32022', '20'), +('9', '101', '6', '111324', '29211', '20'), +('9', '101', '6', '111322', '29114', '20'), +('9', '101', '17', '56046', '22845', '20'), +('9', '101', '17', '56083', '21085', '20'), +('9', '101', '17', '83604', '20918', '20'), +('9', '101', '17', '81765', '20073', '20'), +('9', '101', '7', '94053', '23380', '20'), +('9', '101', '7', '104411', '21129', '20'), +('9', '101', '7', '56079', '20859', '20'), +('9', '101', '7', '102011', '14540', '20'), +('9', '101', '9', '67098', '25161', '20'), +('9', '101', '9', '56033', '21698', '20'), +('9', '101', '9', '56031', '21651', '20'), +('9', '101', '9', '56070', '21506', '20'), +('9', '101', '15', '111343', '30240', '20'), +('9', '101', '15', '111347', '28602', '20'), +('9', '101', '15', '111345', '28559', '20'), +('9', '101', '15', '111042', '27940', '20'), +('9', '101', '20', '111354', '39583', '20'), +('9', '101', '20', '111352', '38460', '20'), +('9', '101', '20', '111355', '38447', '20'), +('9', '101', '20', '111052', '37283', '20'), +('9', '101', '12', '56073', '20692', '20'), +('9', '101', '12', '53420', '20361', '20'), +('9', '101', '12', '81795', '19890', '20'), +('9', '101', '12', '104408', '18683', '20'), +('9', '101', '18', '62986', '21055', '20'), +('9', '101', '18', '104412', '20676', '20'), +('9', '101', '18', '56041', '20402', '20'), +('9', '101', '18', '94054', '19336', '20'), +('9', '101', '19', '62990', '22528', '20'), +('9', '101', '19', '56037', '21258', '20'), +('9', '101', '19', '104409', '20309', '20'), +('9', '101', '19', '56075', '19370', '20'), +('9', '101', '13', '111523', '767076', '20'), +('9', '101', '13', '111871', '729369', '20'), +('9', '101', '13', '111522', '715117', '20'), +('9', '101', '13', '111223', '674244', '20'), +('9', '101', '14', '111523', '279732', '20'), +('9', '101', '14', '111815', '279177', '20'), +('9', '101', '14', '111871', '278928', '20'), +('9', '101', '14', '111515', '270430', '20'), +('9', '101', '11', '111529', '104850', '20'), +('9', '101', '11', '111229', '100419', '20'), +('9', '101', '11', '106769', '86163', '20'), +('9', '101', '11', '62939', '84450', '20'), +('9', '102', '22', '39342', '0', '20'), +('9', '102', '22', '24071', '0', '20'), +('9', '102', '22', '12425', '0', '20'), +('9', '102', '22', '7867', '0', '20'), +('9', '102', '1', '98769', '37501', '20'), +('9', '102', '1', '111300', '29768', '20'), +('9', '102', '1', '111308', '29615', '20'), +('9', '102', '1', '111302', '29549', '20'), +('9', '102', '2', '94056', '22224', '20'), +('9', '102', '2', '62985', '20725', '20'), +('9', '102', '2', '70909', '18014', '20'), +('9', '102', '2', '104410', '16673', '20'), +('9', '102', '3', '111315', '29701', '20'), +('9', '102', '3', '111313', '29293', '20'), +('9', '102', '3', '111316', '27994', '20'), +('9', '102', '3', '111014', '27350', '20'), +('9', '102', '5', '111318', '28941', '20'), +('9', '102', '5', '111320', '27608', '20'), +('9', '102', '5', '111319', '27039', '20'), +('9', '102', '5', '111017', '26665', '20'), +('9', '102', '8', '106804', '32492', '20'), +('9', '102', '8', '94070', '30889', '20'), +('9', '102', '8', '111331', '30192', '20'), +('9', '102', '8', '106716', '29880', '20'), +('9', '102', '6', '106803', '32072', '20'), +('9', '102', '6', '106843', '32022', '20'), +('9', '102', '6', '111324', '29211', '20'), +('9', '102', '6', '111322', '29114', '20'), +('9', '102', '17', '56046', '22845', '20'), +('9', '102', '17', '56083', '21085', '20'), +('9', '102', '17', '83604', '20918', '20'), +('9', '102', '17', '81765', '20073', '20'), +('9', '102', '7', '94053', '23380', '20'), +('9', '102', '7', '104411', '21129', '20'), +('9', '102', '7', '56079', '20859', '20'), +('9', '102', '7', '102011', '14540', '20'), +('9', '102', '9', '67098', '25162', '20'), +('9', '102', '9', '56033', '21698', '20'), +('9', '102', '9', '56031', '21652', '20'), +('9', '102', '9', '56070', '21506', '20'), +('9', '102', '15', '111343', '30240', '20'), +('9', '102', '15', '111347', '28602', '20'), +('9', '102', '15', '111345', '28559', '20'), +('9', '102', '15', '111042', '27940', '20'), +('9', '102', '20', '111354', '39584', '20'), +('9', '102', '20', '111352', '38461', '20'), +('9', '102', '20', '111355', '38447', '20'), +('9', '102', '20', '111052', '37283', '20'), +('9', '102', '12', '56073', '20692', '20'), +('9', '102', '12', '53420', '20362', '20'), +('9', '102', '12', '81795', '19890', '20'), +('9', '102', '12', '104408', '18684', '20'), +('9', '102', '18', '62986', '21055', '20'), +('9', '102', '18', '104412', '20676', '20'), +('9', '102', '18', '56041', '20403', '20'), +('9', '102', '18', '94054', '19337', '20'), +('9', '102', '19', '62990', '22529', '20'), +('9', '102', '19', '56037', '21259', '20'), +('9', '102', '19', '104409', '20309', '20'), +('9', '102', '19', '56075', '19370', '20'), +('9', '102', '13', '111523', '775726', '20'), +('9', '102', '13', '111871', '737399', '20'), +('9', '102', '13', '111522', '723147', '20'), +('9', '102', '13', '111223', '681654', '20'), +('9', '102', '14', '111523', '280212', '20'), +('9', '102', '14', '111815', '279658', '20'), +('9', '102', '14', '111871', '279408', '20'), +('9', '102', '14', '111515', '270910', '20'), +('9', '102', '11', '111529', '104850', '20'), +('9', '102', '11', '111229', '100419', '20'), +('9', '102', '11', '106769', '86164', '20'), +('9', '102', '11', '62939', '84450', '20'), +('9', '103', '22', '39342', '0', '20'), +('9', '103', '22', '24071', '0', '20'), +('9', '103', '22', '12425', '0', '20'), +('9', '103', '22', '7867', '0', '20'), +('9', '103', '1', '98769', '37501', '20'), +('9', '103', '1', '111300', '29768', '20'), +('9', '103', '1', '111308', '29616', '20'), +('9', '103', '1', '111302', '29549', '20'), +('9', '103', '2', '94056', '22224', '20'), +('9', '103', '2', '62985', '20725', '20'), +('9', '103', '2', '70909', '18015', '20'), +('9', '103', '2', '104410', '16673', '20'), +('9', '103', '3', '111315', '29701', '20'), +('9', '103', '3', '111313', '29293', '20'), +('9', '103', '3', '111316', '27995', '20'), +('9', '103', '3', '111014', '27350', '20'), +('9', '103', '5', '111318', '28941', '20'), +('9', '103', '5', '111320', '27608', '20'), +('9', '103', '5', '111319', '27039', '20'), +('9', '103', '5', '111017', '26665', '20'), +('9', '103', '8', '106804', '32493', '20'), +('9', '103', '8', '94070', '30889', '20'), +('9', '103', '8', '111331', '30192', '20'), +('9', '103', '8', '106716', '29880', '20'), +('9', '103', '6', '106803', '32072', '20'), +('9', '103', '6', '106843', '32022', '20'), +('9', '103', '6', '111324', '29212', '20'), +('9', '103', '6', '111322', '29115', '20'), +('9', '103', '17', '56046', '22845', '20'), +('9', '103', '17', '56083', '21085', '20'), +('9', '103', '17', '83604', '20919', '20'), +('9', '103', '17', '81765', '20073', '20'), +('9', '103', '7', '94053', '23380', '20'), +('9', '103', '7', '104411', '21130', '20'), +('9', '103', '7', '56079', '20859', '20'), +('9', '103', '7', '102011', '14540', '20'), +('9', '103', '9', '67098', '25162', '20'), +('9', '103', '9', '56033', '21698', '20'), +('9', '103', '9', '56031', '21652', '20'), +('9', '103', '9', '56070', '21506', '20'), +('9', '103', '15', '111343', '30241', '20'), +('9', '103', '15', '111347', '28602', '20'), +('9', '103', '15', '111345', '28559', '20'), +('9', '103', '15', '111042', '27940', '20'), +('9', '103', '20', '111354', '39584', '20'), +('9', '103', '20', '111352', '38461', '20'), +('9', '103', '20', '111355', '38447', '20'), +('9', '103', '20', '111052', '37283', '20'), +('9', '103', '12', '56073', '20693', '20'), +('9', '103', '12', '53420', '20362', '20'), +('9', '103', '12', '81795', '19890', '20'), +('9', '103', '12', '104408', '18684', '20'), +('9', '103', '18', '62986', '21056', '20'), +('9', '103', '18', '104412', '20676', '20'), +('9', '103', '18', '56041', '20403', '20'), +('9', '103', '18', '94054', '19337', '20'), +('9', '103', '19', '62990', '22529', '20'), +('9', '103', '19', '56037', '21259', '20'), +('9', '103', '19', '104409', '20310', '20'), +('9', '103', '19', '56075', '19370', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '103', '13', '111523', '784433', '20'), +('9', '103', '13', '111871', '745481', '20'), +('9', '103', '13', '111522', '731229', '20'), +('9', '103', '13', '111223', '689112', '20'), +('9', '103', '14', '111523', '280692', '20'), +('9', '103', '14', '111815', '280138', '20'), +('9', '103', '14', '111871', '279889', '20'), +('9', '103', '14', '111515', '271390', '20'), +('9', '103', '11', '111529', '104851', '20'), +('9', '103', '11', '111229', '100419', '20'), +('9', '103', '11', '106769', '86164', '20'), +('9', '103', '11', '62939', '84451', '20'), +('9', '104', '22', '39342', '0', '20'), +('9', '104', '22', '24071', '0', '20'), +('9', '104', '22', '12425', '0', '20'), +('9', '104', '22', '7867', '0', '20'), +('9', '104', '1', '98769', '37501', '20'), +('9', '104', '1', '111300', '29768', '20'), +('9', '104', '1', '111308', '29616', '20'), +('9', '104', '1', '111302', '29550', '20'), +('9', '104', '2', '94056', '22224', '20'), +('9', '104', '2', '62985', '20725', '20'), +('9', '104', '2', '70909', '18015', '20'), +('9', '104', '2', '104410', '16673', '20'), +('9', '104', '3', '111315', '29701', '20'), +('9', '104', '3', '111313', '29293', '20'), +('9', '104', '3', '111316', '27995', '20'), +('9', '104', '3', '111014', '27351', '20'), +('9', '104', '5', '111318', '28941', '20'), +('9', '104', '5', '111320', '27608', '20'), +('9', '104', '5', '111319', '27039', '20'), +('9', '104', '5', '111017', '26666', '20'), +('9', '104', '8', '106804', '32493', '20'), +('9', '104', '8', '94070', '30890', '20'), +('9', '104', '8', '111331', '30192', '20'), +('9', '104', '8', '106716', '29881', '20'), +('9', '104', '6', '106803', '32072', '20'), +('9', '104', '6', '106843', '32023', '20'), +('9', '104', '6', '111324', '29212', '20'), +('9', '104', '6', '111322', '29115', '20'), +('9', '104', '17', '56046', '22846', '20'), +('9', '104', '17', '56083', '21085', '20'), +('9', '104', '17', '83604', '20919', '20'), +('9', '104', '17', '81765', '20073', '20'), +('9', '104', '7', '94053', '23381', '20'), +('9', '104', '7', '104411', '21130', '20'), +('9', '104', '7', '56079', '20860', '20'), +('9', '104', '7', '102011', '14540', '20'), +('9', '104', '9', '67098', '25162', '20'), +('9', '104', '9', '56033', '21698', '20'), +('9', '104', '9', '56031', '21652', '20'), +('9', '104', '9', '56070', '21506', '20'), +('9', '104', '15', '111343', '30241', '20'), +('9', '104', '15', '111347', '28603', '20'), +('9', '104', '15', '111345', '28559', '20'), +('9', '104', '15', '111042', '27940', '20'), +('9', '104', '20', '111354', '39584', '20'), +('9', '104', '20', '111352', '38461', '20'), +('9', '104', '20', '111355', '38448', '20'), +('9', '104', '20', '111052', '37283', '20'), +('9', '104', '12', '56073', '20693', '20'), +('9', '104', '12', '53420', '20362', '20'), +('9', '104', '12', '81795', '19891', '20'), +('9', '104', '12', '104408', '18684', '20'), +('9', '104', '18', '62986', '21056', '20'), +('9', '104', '18', '104412', '20676', '20'), +('9', '104', '18', '56041', '20403', '20'), +('9', '104', '18', '94054', '19337', '20'), +('9', '104', '19', '62990', '22529', '20'), +('9', '104', '19', '56037', '21259', '20'), +('9', '104', '19', '104409', '20310', '20'), +('9', '104', '19', '56075', '19371', '20'), +('9', '104', '13', '111523', '793196', '20'), +('9', '104', '13', '111871', '753616', '20'), +('9', '104', '13', '111522', '739364', '20'), +('9', '104', '13', '111223', '696618', '20'), +('9', '104', '14', '111523', '281173', '20'), +('9', '104', '14', '111815', '280618', '20'), +('9', '104', '14', '111871', '280369', '20'), +('9', '104', '14', '111515', '271870', '20'), +('9', '104', '11', '111529', '104851', '20'), +('9', '104', '11', '111229', '100419', '20'), +('9', '104', '11', '106769', '86164', '20'), +('9', '104', '11', '62939', '84451', '20'), +('9', '105', '22', '39342', '0', '23'), +('9', '105', '22', '24071', '0', '23'), +('9', '105', '22', '12425', '0', '23'), +('9', '105', '22', '7867', '0', '23'), +('9', '105', '1', '98769', '37502', '23'), +('9', '105', '1', '111300', '29769', '23'), +('9', '105', '1', '111308', '29616', '23'), +('9', '105', '1', '111302', '29550', '23'), +('9', '105', '2', '94056', '22225', '23'), +('9', '105', '2', '62985', '20725', '23'), +('9', '105', '2', '70909', '18015', '23'), +('9', '105', '2', '104410', '16673', '23'), +('9', '105', '3', '111315', '29702', '23'), +('9', '105', '3', '111313', '29293', '23'), +('9', '105', '3', '111316', '27995', '23'), +('9', '105', '3', '111014', '27351', '23'), +('9', '105', '5', '111318', '28941', '23'), +('9', '105', '5', '111320', '27608', '23'), +('9', '105', '5', '111319', '27040', '23'), +('9', '105', '5', '111017', '26666', '23'), +('9', '105', '8', '106804', '32493', '23'), +('9', '105', '8', '94070', '30890', '23'), +('9', '105', '8', '111331', '30192', '23'), +('9', '105', '8', '106716', '29881', '23'), +('9', '105', '6', '106803', '32072', '23'), +('9', '105', '6', '106843', '32023', '23'), +('9', '105', '6', '111324', '29212', '23'), +('9', '105', '6', '111322', '29115', '23'), +('9', '105', '17', '56046', '22846', '23'), +('9', '105', '17', '56083', '21085', '23'), +('9', '105', '17', '83604', '20919', '23'), +('9', '105', '17', '81765', '20074', '23'), +('9', '105', '7', '94053', '23381', '23'), +('9', '105', '7', '104411', '21130', '23'), +('9', '105', '7', '56079', '20860', '23'), +('9', '105', '7', '102011', '14541', '23'), +('9', '105', '9', '67098', '25162', '23'), +('9', '105', '9', '56033', '21699', '23'), +('9', '105', '9', '56031', '21652', '23'), +('9', '105', '9', '56070', '21506', '23'), +('9', '105', '15', '111343', '30241', '23'), +('9', '105', '15', '111347', '28603', '23'), +('9', '105', '15', '111345', '28560', '23'), +('9', '105', '15', '111042', '27940', '23'), +('9', '105', '20', '111354', '39584', '23'), +('9', '105', '20', '111352', '38461', '23'), +('9', '105', '20', '111355', '38448', '23'), +('9', '105', '20', '111052', '37284', '23'), +('9', '105', '12', '56073', '20693', '23'), +('9', '105', '12', '53420', '20362', '23'), +('9', '105', '12', '81795', '19891', '23'), +('9', '105', '12', '104408', '18685', '23'), +('9', '105', '18', '62986', '21056', '23'), +('9', '105', '18', '104412', '20676', '23'), +('9', '105', '18', '56041', '20403', '23'), +('9', '105', '18', '94054', '19337', '23'), +('9', '105', '19', '62990', '22529', '23'), +('9', '105', '19', '56037', '21259', '23'), +('9', '105', '19', '104409', '20310', '23'), +('9', '105', '19', '56075', '19371', '23'), +('9', '105', '13', '111523', '802017', '23'), +('9', '105', '13', '111871', '761804', '23'), +('9', '105', '13', '111522', '747551', '23'), +('9', '105', '13', '111223', '704173', '23'), +('9', '105', '14', '111523', '281653', '23'), +('9', '105', '14', '111815', '281098', '23'), +('9', '105', '14', '111871', '280849', '23'), +('9', '105', '14', '111515', '272351', '23'), +('9', '105', '11', '111529', '104851', '23'), +('9', '105', '11', '111229', '100420', '23'), +('9', '105', '11', '106769', '86164', '23'), +('9', '105', '11', '62939', '84451', '23'), +('9', '105', '22', '39342', '0', '22'), +('9', '105', '22', '24071', '0', '22'), +('9', '105', '22', '12425', '0', '22'), +('9', '105', '22', '7867', '0', '22'), +('9', '105', '1', '98769', '37502', '22'), +('9', '105', '1', '111300', '29769', '22'), +('9', '105', '1', '111308', '29616', '22'), +('9', '105', '1', '111302', '29550', '22'), +('9', '105', '2', '94056', '22225', '22'), +('9', '105', '2', '62985', '20725', '22'), +('9', '105', '2', '70909', '18015', '22'), +('9', '105', '2', '104410', '16673', '22'), +('9', '105', '3', '111315', '29702', '22'), +('9', '105', '3', '111313', '29293', '22'), +('9', '105', '3', '111316', '27995', '22'), +('9', '105', '3', '111014', '27351', '22'), +('9', '105', '5', '111318', '28941', '22'), +('9', '105', '5', '111320', '27608', '22'), +('9', '105', '5', '111319', '27040', '22'), +('9', '105', '5', '111017', '26666', '22'), +('9', '105', '8', '106804', '32493', '22'), +('9', '105', '8', '94070', '30890', '22'), +('9', '105', '8', '111331', '30192', '22'), +('9', '105', '8', '106716', '29881', '22'), +('9', '105', '6', '106803', '32072', '22'), +('9', '105', '6', '106843', '32023', '22'), +('9', '105', '6', '111324', '29212', '22'), +('9', '105', '6', '111322', '29115', '22'), +('9', '105', '17', '56046', '22846', '22'), +('9', '105', '17', '56083', '21085', '22'), +('9', '105', '17', '83604', '20919', '22'), +('9', '105', '17', '81765', '20074', '22'), +('9', '105', '7', '94053', '23381', '22'), +('9', '105', '7', '104411', '21130', '22'), +('9', '105', '7', '56079', '20860', '22'), +('9', '105', '7', '102011', '14541', '22'), +('9', '105', '9', '67098', '25162', '22'), +('9', '105', '9', '56033', '21699', '22'), +('9', '105', '9', '56031', '21652', '22'), +('9', '105', '9', '56070', '21506', '22'), +('9', '105', '15', '111343', '30241', '22'), +('9', '105', '15', '111347', '28603', '22'), +('9', '105', '15', '111345', '28560', '22'), +('9', '105', '15', '111042', '27940', '22'), +('9', '105', '20', '111354', '39584', '22'), +('9', '105', '20', '111352', '38461', '22'), +('9', '105', '20', '111355', '38448', '22'), +('9', '105', '20', '111052', '37284', '22'), +('9', '105', '12', '56073', '20693', '22'), +('9', '105', '12', '53420', '20362', '22'), +('9', '105', '12', '81795', '19891', '22'), +('9', '105', '12', '104408', '18685', '22'), +('9', '105', '18', '62986', '21056', '22'), +('9', '105', '18', '104412', '20676', '22'), +('9', '105', '18', '56041', '20403', '22'), +('9', '105', '18', '94054', '19337', '22'), +('9', '105', '19', '62990', '22529', '22'), +('9', '105', '19', '56037', '21259', '22'), +('9', '105', '19', '104409', '20310', '22'), +('9', '105', '19', '56075', '19371', '22'), +('9', '105', '13', '111523', '802017', '22'), +('9', '105', '13', '111871', '761804', '22'), +('9', '105', '13', '111522', '747551', '22'), +('9', '105', '13', '111223', '704173', '22'), +('9', '105', '14', '111523', '281653', '22'), +('9', '105', '14', '111815', '281098', '22'), +('9', '105', '14', '111871', '280849', '22'), +('9', '105', '14', '111515', '272351', '22'), +('9', '105', '11', '111529', '104851', '22'), +('9', '105', '11', '111229', '100420', '22'), +('9', '105', '11', '106769', '86164', '22'), +('9', '105', '11', '62939', '84451', '22'), +('9', '105', '22', '39342', '0', '21'), +('9', '105', '22', '24071', '0', '21'), +('9', '105', '22', '12425', '0', '21'), +('9', '105', '22', '7867', '0', '21'), +('9', '105', '1', '98769', '37502', '21'), +('9', '105', '1', '111300', '29769', '21'), +('9', '105', '1', '111308', '29616', '21'), +('9', '105', '1', '111302', '29550', '21'), +('9', '105', '2', '94056', '22225', '21'), +('9', '105', '2', '62985', '20725', '21'), +('9', '105', '2', '70909', '18015', '21'), +('9', '105', '2', '104410', '16673', '21'), +('9', '105', '3', '111315', '29702', '21'), +('9', '105', '3', '111313', '29293', '21'), +('9', '105', '3', '111316', '27995', '21'), +('9', '105', '3', '111014', '27351', '21'), +('9', '105', '5', '111318', '28941', '21'), +('9', '105', '5', '111320', '27608', '21'), +('9', '105', '5', '111319', '27040', '21'), +('9', '105', '5', '111017', '26666', '21'), +('9', '105', '8', '106804', '32493', '21'), +('9', '105', '8', '94070', '30890', '21'), +('9', '105', '8', '111331', '30192', '21'), +('9', '105', '8', '106716', '29881', '21'), +('9', '105', '6', '106803', '32072', '21'), +('9', '105', '6', '106843', '32023', '21'), +('9', '105', '6', '111324', '29212', '21'), +('9', '105', '6', '111322', '29115', '21'), +('9', '105', '17', '56046', '22846', '21'), +('9', '105', '17', '56083', '21085', '21'), +('9', '105', '17', '83604', '20919', '21'), +('9', '105', '17', '81765', '20074', '21'), +('9', '105', '7', '94053', '23381', '21'), +('9', '105', '7', '104411', '21130', '21'), +('9', '105', '7', '56079', '20860', '21'), +('9', '105', '7', '102011', '14541', '21'), +('9', '105', '9', '67098', '25162', '21'), +('9', '105', '9', '56033', '21699', '21'), +('9', '105', '9', '56031', '21652', '21'), +('9', '105', '9', '56070', '21506', '21'), +('9', '105', '15', '111343', '30241', '21'), +('9', '105', '15', '111347', '28603', '21'), +('9', '105', '15', '111345', '28560', '21'), +('9', '105', '15', '111042', '27940', '21'), +('9', '105', '20', '111354', '39584', '21'), +('9', '105', '20', '111352', '38461', '21'), +('9', '105', '20', '111355', '38448', '21'), +('9', '105', '20', '111052', '37284', '21'), +('9', '105', '12', '56073', '20693', '21'), +('9', '105', '12', '53420', '20362', '21'), +('9', '105', '12', '81795', '19891', '21'), +('9', '105', '12', '104408', '18685', '21'), +('9', '105', '18', '62986', '21056', '21'), +('9', '105', '18', '104412', '20676', '21'), +('9', '105', '18', '56041', '20403', '21'), +('9', '105', '18', '94054', '19337', '21'), +('9', '105', '19', '62990', '22529', '21'), +('9', '105', '19', '56037', '21259', '21'), +('9', '105', '19', '104409', '20310', '21'), +('9', '105', '19', '56075', '19371', '21'), +('9', '105', '13', '111523', '802017', '21'), +('9', '105', '13', '111871', '761804', '21'), +('9', '105', '13', '111522', '747551', '21'), +('9', '105', '13', '111223', '704173', '21'), +('9', '105', '14', '111523', '281653', '21'), +('9', '105', '14', '111815', '281098', '21'), +('9', '105', '14', '111871', '280849', '21'), +('9', '105', '14', '111515', '272351', '21'), +('9', '105', '11', '111529', '104851', '21'), +('9', '105', '11', '111229', '100420', '21'), +('9', '105', '11', '106769', '86164', '21'), +('9', '105', '11', '62939', '84451', '21'), +('9', '106', '22', '39342', '0', '23'), +('9', '106', '22', '24071', '0', '23'), +('9', '106', '22', '12425', '0', '23'), +('9', '106', '22', '7867', '0', '23'), +('9', '106', '1', '98769', '37502', '23'), +('9', '106', '1', '111300', '29769', '23'), +('9', '106', '1', '111308', '29617', '23'), +('9', '106', '1', '111302', '29550', '23'), +('9', '106', '2', '94056', '22225', '23'), +('9', '106', '2', '62985', '20725', '23'), +('9', '106', '2', '70909', '18015', '23'), +('9', '106', '2', '104410', '16674', '23'), +('9', '106', '3', '111315', '29702', '23'), +('9', '106', '3', '111313', '29293', '23'), +('9', '106', '3', '111316', '27995', '23'), +('9', '106', '3', '111014', '27352', '23'), +('9', '106', '5', '111318', '28942', '23'), +('9', '106', '5', '111320', '27609', '23'), +('9', '106', '5', '111319', '27040', '23'), +('9', '106', '5', '111017', '26666', '23'), +('9', '106', '8', '106804', '32493', '23'), +('9', '106', '8', '94070', '30890', '23'), +('9', '106', '8', '111331', '30193', '23'), +('9', '106', '8', '106716', '29881', '23'), +('9', '106', '6', '106803', '32072', '23'), +('9', '106', '6', '106843', '32023', '23'), +('9', '106', '6', '111324', '29213', '23'), +('9', '106', '6', '111322', '29115', '23'), +('9', '106', '17', '56046', '22846', '23'), +('9', '106', '17', '56083', '21086', '23'), +('9', '106', '17', '83604', '20919', '23'), +('9', '106', '17', '81765', '20074', '23'), +('9', '106', '7', '94053', '23381', '23'), +('9', '106', '7', '104411', '21130', '23'), +('9', '106', '7', '56079', '20860', '23'), +('9', '106', '7', '102011', '14541', '23'), +('9', '106', '9', '67098', '25163', '23'), +('9', '106', '9', '56033', '21699', '23'), +('9', '106', '9', '56031', '21652', '23'), +('9', '106', '9', '56070', '21506', '23'), +('9', '106', '15', '111343', '30241', '23'), +('9', '106', '15', '111347', '28603', '23'), +('9', '106', '15', '111345', '28560', '23'), +('9', '106', '15', '111042', '27941', '23'), +('9', '106', '20', '111354', '39584', '23'), +('9', '106', '20', '111352', '38462', '23'), +('9', '106', '20', '111355', '38448', '23'), +('9', '106', '20', '111052', '37284', '23'), +('9', '106', '12', '56073', '20694', '23'), +('9', '106', '12', '53420', '20363', '23'), +('9', '106', '12', '81795', '19891', '23'), +('9', '106', '12', '104408', '18685', '23'), +('9', '106', '18', '62986', '21057', '23'), +('9', '106', '18', '104412', '20676', '23'), +('9', '106', '18', '56041', '20403', '23'), +('9', '106', '18', '94054', '19338', '23'), +('9', '106', '19', '62990', '22530', '23'), +('9', '106', '19', '56037', '21260', '23'), +('9', '106', '19', '104409', '20311', '23'), +('9', '106', '19', '56075', '19371', '23'), +('9', '106', '13', '111523', '810894', '23'), +('9', '106', '13', '111871', '770044', '23'), +('9', '106', '13', '111522', '755791', '23'), +('9', '106', '13', '111223', '711776', '23'), +('9', '106', '14', '111523', '282133', '23'), +('9', '106', '14', '111815', '281579', '23'), +('9', '106', '14', '111871', '281330', '23'), +('9', '106', '14', '111515', '272831', '23'), +('9', '106', '11', '111529', '104851', '23'), +('9', '106', '11', '111229', '100420', '23'), +('9', '106', '11', '106769', '86165', '23'), +('9', '106', '11', '62939', '84452', '23'), +('9', '107', '22', '39342', '0', '23'), +('9', '107', '22', '24071', '0', '23'), +('9', '107', '22', '12425', '0', '23'), +('9', '107', '22', '7867', '0', '23'), +('9', '107', '1', '98769', '37502', '23'), +('9', '107', '1', '111300', '29769', '23'), +('9', '107', '1', '111308', '29617', '23'), +('9', '107', '1', '111302', '29551', '23'), +('9', '107', '2', '94056', '22225', '23'), +('9', '107', '2', '62985', '20725', '23'), +('9', '107', '2', '70909', '18016', '23'), +('9', '107', '2', '104410', '16674', '23'), +('9', '107', '3', '111315', '29703', '23'), +('9', '107', '3', '111313', '29294', '23'), +('9', '107', '3', '111316', '27996', '23'), +('9', '107', '3', '111014', '27352', '23'), +('9', '107', '5', '111318', '28942', '23'), +('9', '107', '5', '111320', '27609', '23'), +('9', '107', '5', '111319', '27040', '23'), +('9', '107', '5', '111017', '26666', '23'), +('9', '107', '8', '106804', '32494', '23'), +('9', '107', '8', '94070', '30890', '23'), +('9', '107', '8', '111331', '30193', '23'), +('9', '107', '8', '106716', '29882', '23'), +('9', '107', '6', '106803', '32072', '23'), +('9', '107', '6', '106843', '32024', '23'), +('9', '107', '6', '111324', '29213', '23'), +('9', '107', '6', '111322', '29116', '23'), +('9', '107', '17', '56046', '22847', '23'), +('9', '107', '17', '56083', '21086', '23'), +('9', '107', '17', '83604', '20920', '23'), +('9', '107', '17', '81765', '20074', '23'), +('9', '107', '7', '94053', '23382', '23'), +('9', '107', '7', '104411', '21131', '23'), +('9', '107', '7', '56079', '20861', '23'), +('9', '107', '7', '102011', '14541', '23'), +('9', '107', '9', '67098', '25163', '23'), +('9', '107', '9', '56033', '21699', '23'), +('9', '107', '9', '56031', '21652', '23'), +('9', '107', '9', '56070', '21507', '23'), +('9', '107', '15', '111343', '30241', '23'), +('9', '107', '15', '111347', '28603', '23'), +('9', '107', '15', '111345', '28560', '23'), +('9', '107', '15', '111042', '27941', '23'), +('9', '107', '20', '111354', '39585', '23'), +('9', '107', '20', '111352', '38462', '23'), +('9', '107', '20', '111355', '38448', '23'), +('9', '107', '20', '111052', '37284', '23'), +('9', '107', '12', '56073', '20694', '23'), +('9', '107', '12', '53420', '20363', '23'), +('9', '107', '12', '81795', '19892', '23'), +('9', '107', '12', '104408', '18685', '23'), +('9', '107', '18', '62986', '21057', '23'), +('9', '107', '18', '104412', '20677', '23'), +('9', '107', '18', '56041', '20403', '23'), +('9', '107', '18', '94054', '19338', '23'), +('9', '107', '19', '62990', '22530', '23'), +('9', '107', '19', '56037', '21260', '23'), +('9', '107', '19', '104409', '20311', '23'), +('9', '107', '19', '56075', '19371', '23'), +('9', '107', '13', '111523', '819828', '23'), +('9', '107', '13', '111871', '778337', '23'), +('9', '107', '13', '111522', '764084', '23'), +('9', '107', '13', '111223', '719427', '23'), +('9', '107', '14', '111523', '282614', '23'), +('9', '107', '14', '111815', '282059', '23'), +('9', '107', '14', '111871', '281810', '23'), +('9', '107', '14', '111515', '273311', '23'), +('9', '107', '11', '111529', '104852', '23'), +('9', '107', '11', '111229', '100420', '23'), +('9', '107', '11', '106769', '86165', '23'), +('9', '107', '11', '62939', '84452', '23'), +('9', '108', '22', '39342', '0', '23'), +('9', '108', '22', '24071', '0', '23'), +('9', '108', '22', '12425', '0', '23'), +('9', '108', '22', '7867', '0', '23'), +('9', '108', '1', '98769', '37502', '23'), +('9', '108', '1', '111300', '29769', '23'), +('9', '108', '1', '111308', '29617', '23'), +('9', '108', '1', '111302', '29551', '23'), +('9', '108', '2', '94056', '22225', '23'), +('9', '108', '2', '62985', '20725', '23'), +('9', '108', '2', '70909', '18016', '23'), +('9', '108', '2', '104410', '16674', '23'), +('9', '108', '3', '111315', '29703', '23'), +('9', '108', '3', '111313', '29294', '23'), +('9', '108', '3', '111316', '27996', '23'), +('9', '108', '3', '111014', '27352', '23'), +('9', '108', '5', '111318', '28942', '23'), +('9', '108', '5', '111320', '27609', '23'), +('9', '108', '5', '111319', '27041', '23'), +('9', '108', '5', '111017', '26666', '23'), +('9', '108', '8', '106804', '32494', '23'), +('9', '108', '8', '94070', '30891', '23'), +('9', '108', '8', '111331', '30193', '23'), +('9', '108', '8', '106716', '29882', '23'), +('9', '108', '6', '106803', '32072', '23'), +('9', '108', '6', '106843', '32024', '23'), +('9', '108', '6', '111324', '29213', '23'), +('9', '108', '6', '111322', '29116', '23'), +('9', '108', '17', '56046', '22847', '23'), +('9', '108', '17', '56083', '21086', '23'), +('9', '108', '17', '83604', '20920', '23'), +('9', '108', '17', '81765', '20074', '23'), +('9', '108', '7', '94053', '23382', '23'), +('9', '108', '7', '104411', '21131', '23'), +('9', '108', '7', '56079', '20861', '23'), +('9', '108', '7', '102011', '14541', '23'), +('9', '108', '9', '67098', '25163', '23'), +('9', '108', '9', '56033', '21699', '23'), +('9', '108', '9', '56031', '21653', '23'), +('9', '108', '9', '56070', '21507', '23'), +('9', '108', '15', '111343', '30242', '23'), +('9', '108', '15', '111347', '28604', '23'), +('9', '108', '15', '111345', '28560', '23'), +('9', '108', '15', '111042', '27941', '23'), +('9', '108', '20', '111354', '39585', '23'), +('9', '108', '20', '111352', '38462', '23'), +('9', '108', '20', '111355', '38448', '23'), +('9', '108', '20', '111052', '37284', '23'), +('9', '108', '12', '56073', '20694', '23'), +('9', '108', '12', '53420', '20363', '23'), +('9', '108', '12', '81795', '19892', '23'), +('9', '108', '12', '104408', '18685', '23'), +('9', '108', '18', '62986', '21058', '23'), +('9', '108', '18', '104412', '20677', '23'), +('9', '108', '18', '56041', '20403', '23'), +('9', '108', '18', '94054', '19338', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '108', '19', '62990', '22530', '23'), +('9', '108', '19', '56037', '21260', '23'), +('9', '108', '19', '104409', '20312', '23'), +('9', '108', '19', '56075', '19372', '23'), +('9', '108', '13', '111523', '828819', '23'), +('9', '108', '13', '111871', '786682', '23'), +('9', '108', '13', '111522', '772429', '23'), +('9', '108', '13', '111223', '727126', '23'), +('9', '108', '14', '111523', '283094', '23'), +('9', '108', '14', '111815', '282539', '23'), +('9', '108', '14', '111871', '282290', '23'), +('9', '108', '14', '111515', '273791', '23'), +('9', '108', '11', '111529', '104852', '23'), +('9', '108', '11', '111229', '100421', '23'), +('9', '108', '11', '106769', '86165', '23'), +('9', '108', '11', '62939', '84452', '23'), +('9', '109', '22', '39342', '0', '23'), +('9', '109', '22', '24071', '0', '23'), +('9', '109', '22', '12425', '0', '23'), +('9', '109', '22', '7867', '0', '23'), +('9', '109', '1', '98769', '37502', '23'), +('9', '109', '1', '111300', '29770', '23'), +('9', '109', '1', '111308', '29617', '23'), +('9', '109', '1', '111302', '29551', '23'), +('9', '109', '2', '94056', '22226', '23'), +('9', '109', '2', '62985', '20726', '23'), +('9', '109', '2', '70909', '18016', '23'), +('9', '109', '2', '104410', '16674', '23'), +('9', '109', '3', '111315', '29703', '23'), +('9', '109', '3', '111313', '29294', '23'), +('9', '109', '3', '111316', '27996', '23'), +('9', '109', '3', '111014', '27353', '23'), +('9', '109', '5', '111318', '28942', '23'), +('9', '109', '5', '111320', '27609', '23'), +('9', '109', '5', '111319', '27041', '23'), +('9', '109', '5', '111017', '26667', '23'), +('9', '109', '8', '106804', '32494', '23'), +('9', '109', '8', '94070', '30891', '23'), +('9', '109', '8', '111331', '30194', '23'), +('9', '109', '8', '106716', '29882', '23'), +('9', '109', '6', '106803', '32073', '23'), +('9', '109', '6', '106843', '32024', '23'), +('9', '109', '6', '111324', '29214', '23'), +('9', '109', '6', '111322', '29116', '23'), +('9', '109', '17', '56046', '22848', '23'), +('9', '109', '17', '56083', '21086', '23'), +('9', '109', '17', '83604', '20920', '23'), +('9', '109', '17', '81765', '20074', '23'), +('9', '109', '7', '94053', '23382', '23'), +('9', '109', '7', '104411', '21131', '23'), +('9', '109', '7', '56079', '20861', '23'), +('9', '109', '7', '102011', '14542', '23'), +('9', '109', '9', '67098', '25163', '23'), +('9', '109', '9', '56033', '21699', '23'), +('9', '109', '9', '56031', '21653', '23'), +('9', '109', '9', '56070', '21507', '23'), +('9', '109', '15', '111343', '30242', '23'), +('9', '109', '15', '111347', '28604', '23'), +('9', '109', '15', '111345', '28560', '23'), +('9', '109', '15', '111042', '27941', '23'), +('9', '109', '20', '111354', '39585', '23'), +('9', '109', '20', '111352', '38463', '23'), +('9', '109', '20', '111355', '38448', '23'), +('9', '109', '20', '111052', '37285', '23'), +('9', '109', '12', '56073', '20695', '23'), +('9', '109', '12', '53420', '20363', '23'), +('9', '109', '12', '81795', '19892', '23'), +('9', '109', '12', '104408', '18686', '23'), +('9', '109', '18', '62986', '21058', '23'), +('9', '109', '18', '104412', '20677', '23'), +('9', '109', '18', '56041', '20403', '23'), +('9', '109', '18', '94054', '19339', '23'), +('9', '109', '19', '62990', '22530', '23'), +('9', '109', '19', '56037', '21261', '23'), +('9', '109', '19', '104409', '20312', '23'), +('9', '109', '19', '56075', '19372', '23'), +('9', '109', '13', '111523', '837867', '23'), +('9', '109', '13', '111871', '795080', '23'), +('9', '109', '13', '111522', '780827', '23'), +('9', '109', '13', '111223', '734874', '23'), +('9', '109', '14', '111523', '283574', '23'), +('9', '109', '14', '111815', '283019', '23'), +('9', '109', '14', '111871', '282771', '23'), +('9', '109', '14', '111515', '274272', '23'), +('9', '109', '11', '111529', '104852', '23'), +('9', '109', '11', '111229', '100421', '23'), +('9', '109', '11', '106769', '86165', '23'), +('9', '109', '11', '62939', '84452', '23'), +('9', '110', '22', '39342', '0', '25'), +('9', '110', '22', '24071', '0', '25'), +('9', '110', '22', '12425', '0', '25'), +('9', '110', '22', '7867', '0', '25'), +('9', '110', '1', '98769', '37503', '25'), +('9', '110', '1', '111300', '29770', '25'), +('9', '110', '1', '111308', '29618', '25'), +('9', '110', '1', '111302', '29552', '25'), +('9', '110', '2', '94056', '22226', '25'), +('9', '110', '2', '62985', '20726', '25'), +('9', '110', '2', '70909', '18016', '25'), +('9', '110', '2', '104410', '16675', '25'), +('9', '110', '3', '111315', '29704', '25'), +('9', '110', '3', '111313', '29294', '25'), +('9', '110', '3', '111316', '27997', '25'), +('9', '110', '3', '111014', '27353', '25'), +('9', '110', '5', '111318', '28942', '25'), +('9', '110', '5', '111320', '27610', '25'), +('9', '110', '5', '111319', '27041', '25'), +('9', '110', '5', '111017', '26667', '25'), +('9', '110', '8', '106804', '32494', '25'), +('9', '110', '8', '94070', '30891', '25'), +('9', '110', '8', '111331', '30194', '25'), +('9', '110', '8', '106716', '29883', '25'), +('9', '110', '6', '106803', '32073', '25'), +('9', '110', '6', '106843', '32025', '25'), +('9', '110', '6', '111324', '29214', '25'), +('9', '110', '6', '111322', '29116', '25'), +('9', '110', '17', '56046', '22848', '25'), +('9', '110', '17', '56083', '21086', '25'), +('9', '110', '17', '83604', '20921', '25'), +('9', '110', '17', '81765', '20075', '25'), +('9', '110', '7', '94053', '23382', '25'), +('9', '110', '7', '104411', '21131', '25'), +('9', '110', '7', '56079', '20861', '25'), +('9', '110', '7', '102011', '14542', '25'), +('9', '110', '9', '67098', '25164', '25'), +('9', '110', '9', '56033', '21699', '25'), +('9', '110', '9', '56031', '21653', '25'), +('9', '110', '9', '56070', '21507', '25'), +('9', '110', '15', '111343', '30242', '25'), +('9', '110', '15', '111347', '28604', '25'), +('9', '110', '15', '111345', '28561', '25'), +('9', '110', '15', '111042', '27941', '25'), +('9', '110', '20', '111354', '39585', '25'), +('9', '110', '20', '111352', '38463', '25'), +('9', '110', '20', '111355', '38449', '25'), +('9', '110', '20', '111052', '37285', '25'), +('9', '110', '12', '56073', '20695', '25'), +('9', '110', '12', '53420', '20363', '25'), +('9', '110', '12', '81795', '19893', '25'), +('9', '110', '12', '104408', '18686', '25'), +('9', '110', '18', '62986', '21058', '25'), +('9', '110', '18', '104412', '20677', '25'), +('9', '110', '18', '56041', '20404', '25'), +('9', '110', '18', '94054', '19339', '25'), +('9', '110', '19', '62904', '24498', '25'), +('9', '110', '19', '62990', '22531', '25'), +('9', '110', '19', '56037', '21261', '25'), +('9', '110', '19', '104409', '20312', '25'), +('9', '110', '13', '111523', '849372', '25'), +('9', '110', '13', '111871', '805930', '25'), +('9', '110', '13', '111522', '791677', '25'), +('9', '110', '13', '111223', '745070', '25'), +('9', '110', '14', '111523', '286455', '25'), +('9', '110', '14', '111815', '285900', '25'), +('9', '110', '14', '111871', '285651', '25'), +('9', '110', '14', '46856', '279796', '25'), +('9', '110', '11', '111529', '104852', '25'), +('9', '110', '11', '111229', '100421', '25'), +('9', '110', '11', '106769', '86166', '25'), +('9', '110', '11', '62939', '84453', '25'), +('9', '110', '22', '39342', '0', '24'), +('9', '110', '22', '24071', '0', '24'), +('9', '110', '22', '12425', '0', '24'), +('9', '110', '22', '7867', '0', '24'), +('9', '110', '1', '98769', '37503', '24'), +('9', '110', '1', '111300', '29770', '24'), +('9', '110', '1', '111308', '29618', '24'), +('9', '110', '1', '111302', '29552', '24'), +('9', '110', '2', '94056', '22226', '24'), +('9', '110', '2', '62985', '20726', '24'), +('9', '110', '2', '70909', '18016', '24'), +('9', '110', '2', '104410', '16675', '24'), +('9', '110', '3', '111315', '29704', '24'), +('9', '110', '3', '111313', '29294', '24'), +('9', '110', '3', '111316', '27997', '24'), +('9', '110', '3', '111014', '27353', '24'), +('9', '110', '5', '111318', '28942', '24'), +('9', '110', '5', '111320', '27610', '24'), +('9', '110', '5', '111319', '27041', '24'), +('9', '110', '5', '111017', '26667', '24'), +('9', '110', '8', '106804', '32494', '24'), +('9', '110', '8', '94070', '30891', '24'), +('9', '110', '8', '111331', '30194', '24'), +('9', '110', '8', '106716', '29883', '24'), +('9', '110', '6', '106803', '32073', '24'), +('9', '110', '6', '106843', '32025', '24'), +('9', '110', '6', '111324', '29214', '24'), +('9', '110', '6', '111322', '29116', '24'), +('9', '110', '17', '56046', '22848', '24'), +('9', '110', '17', '56083', '21086', '24'), +('9', '110', '17', '83604', '20921', '24'), +('9', '110', '17', '81765', '20075', '24'), +('9', '110', '7', '94053', '23382', '24'), +('9', '110', '7', '104411', '21131', '24'), +('9', '110', '7', '56079', '20861', '24'), +('9', '110', '7', '102011', '14542', '24'), +('9', '110', '9', '67098', '25164', '24'), +('9', '110', '9', '56033', '21699', '24'), +('9', '110', '9', '56031', '21653', '24'), +('9', '110', '9', '56070', '21507', '24'), +('9', '110', '15', '111343', '30242', '24'), +('9', '110', '15', '111347', '28604', '24'), +('9', '110', '15', '111345', '28561', '24'), +('9', '110', '15', '111042', '27941', '24'), +('9', '110', '20', '111354', '39585', '24'), +('9', '110', '20', '111352', '38463', '24'), +('9', '110', '20', '111355', '38449', '24'), +('9', '110', '20', '111052', '37285', '24'), +('9', '110', '12', '56073', '20695', '24'), +('9', '110', '12', '53420', '20363', '24'), +('9', '110', '12', '81795', '19893', '24'), +('9', '110', '12', '104408', '18686', '24'), +('9', '110', '18', '62986', '21058', '24'), +('9', '110', '18', '104412', '20677', '24'), +('9', '110', '18', '56041', '20404', '24'), +('9', '110', '18', '94054', '19339', '24'), +('9', '110', '19', '62990', '22531', '24'), +('9', '110', '19', '56037', '21261', '24'), +('9', '110', '19', '104409', '20312', '24'), +('9', '110', '19', '56075', '19372', '24'), +('9', '110', '13', '111523', '849372', '24'), +('9', '110', '13', '111871', '805930', '24'), +('9', '110', '13', '111522', '791677', '24'), +('9', '110', '13', '111223', '745070', '24'), +('9', '110', '14', '111523', '286455', '24'), +('9', '110', '14', '111815', '285900', '24'), +('9', '110', '14', '111871', '285651', '24'), +('9', '110', '14', '46856', '279796', '24'), +('9', '110', '11', '111529', '104852', '24'), +('9', '110', '11', '111229', '100421', '24'), +('9', '110', '11', '106769', '86166', '24'), +('9', '110', '11', '62939', '84453', '24'), +('9', '111', '22', '39342', '0', '25'), +('9', '111', '22', '24071', '0', '25'), +('9', '111', '22', '12425', '0', '25'), +('9', '111', '22', '7867', '0', '25'), +('9', '111', '1', '98769', '37503', '25'), +('9', '111', '1', '111300', '29770', '25'), +('9', '111', '1', '111308', '29618', '25'), +('9', '111', '1', '111302', '29552', '25'), +('9', '111', '2', '94056', '22226', '25'), +('9', '111', '2', '62985', '20726', '25'), +('9', '111', '2', '70909', '18017', '25'), +('9', '111', '2', '104410', '16675', '25'), +('9', '111', '3', '111315', '29704', '25'), +('9', '111', '3', '111313', '29295', '25'), +('9', '111', '3', '111316', '27997', '25'), +('9', '111', '3', '111014', '27354', '25'), +('9', '111', '5', '111318', '28943', '25'), +('9', '111', '5', '111320', '27610', '25'), +('9', '111', '5', '111319', '27042', '25'), +('9', '111', '5', '111017', '26667', '25'), +('9', '111', '8', '106804', '32495', '25'), +('9', '111', '8', '94070', '30891', '25'), +('9', '111', '8', '111331', '30194', '25'), +('9', '111', '8', '106716', '29883', '25'), +('9', '111', '6', '106803', '32073', '25'), +('9', '111', '6', '106843', '32025', '25'), +('9', '111', '6', '111324', '29214', '25'), +('9', '111', '6', '111322', '29116', '25'), +('9', '111', '17', '56046', '22848', '25'), +('9', '111', '17', '56083', '21086', '25'), +('9', '111', '17', '83604', '20921', '25'), +('9', '111', '17', '81765', '20075', '25'), +('9', '111', '7', '94053', '23383', '25'), +('9', '111', '7', '104411', '21131', '25'), +('9', '111', '7', '56079', '20862', '25'), +('9', '111', '7', '102011', '14542', '25'), +('9', '111', '9', '67098', '25164', '25'), +('9', '111', '9', '56033', '21700', '25'), +('9', '111', '9', '56031', '21653', '25'), +('9', '111', '9', '56070', '21507', '25'), +('9', '111', '15', '111343', '30242', '25'), +('9', '111', '15', '111347', '28605', '25'), +('9', '111', '15', '111345', '28561', '25'), +('9', '111', '15', '111042', '27942', '25'), +('9', '111', '20', '111354', '39586', '25'), +('9', '111', '20', '111352', '38463', '25'), +('9', '111', '20', '111355', '38449', '25'), +('9', '111', '20', '111052', '37285', '25'), +('9', '111', '12', '56073', '20696', '25'), +('9', '111', '12', '53420', '20364', '25'), +('9', '111', '12', '81795', '19893', '25'), +('9', '111', '12', '104408', '18686', '25'), +('9', '111', '18', '62986', '21059', '25'), +('9', '111', '18', '104412', '20677', '25'), +('9', '111', '18', '56041', '20404', '25'), +('9', '111', '18', '94054', '19339', '25'), +('9', '111', '19', '62904', '24499', '25'), +('9', '111', '19', '62990', '22531', '25'), +('9', '111', '19', '56037', '21261', '25'), +('9', '111', '19', '104409', '20313', '25'), +('9', '111', '13', '111523', '858534', '25'), +('9', '111', '13', '111871', '814433', '25'), +('9', '111', '13', '111522', '800180', '25'), +('9', '111', '13', '111223', '752914', '25'), +('9', '111', '14', '111523', '286935', '25'), +('9', '111', '14', '111815', '286380', '25'), +('9', '111', '14', '111871', '286131', '25'), +('9', '111', '14', '46856', '281119', '25'), +('9', '111', '11', '111529', '104853', '25'), +('9', '111', '11', '111229', '100421', '25'), +('9', '111', '11', '106769', '86166', '25'), +('9', '111', '11', '62939', '84453', '25'), +('9', '112', '22', '39342', '0', '25'), +('9', '112', '22', '24071', '0', '25'), +('9', '112', '22', '12425', '0', '25'), +('9', '112', '22', '7867', '0', '25'), +('9', '112', '1', '98769', '37503', '25'), +('9', '112', '1', '111300', '29770', '25'), +('9', '112', '1', '111308', '29618', '25'), +('9', '112', '1', '111302', '29552', '25'), +('9', '112', '2', '94056', '22226', '25'), +('9', '112', '2', '62985', '20726', '25'), +('9', '112', '2', '70909', '18017', '25'), +('9', '112', '2', '104410', '16675', '25'), +('9', '112', '3', '111315', '29705', '25'), +('9', '112', '3', '111313', '29295', '25'), +('9', '112', '3', '111316', '27997', '25'), +('9', '112', '3', '111014', '27354', '25'), +('9', '112', '5', '111318', '28943', '25'), +('9', '112', '5', '111320', '27610', '25'), +('9', '112', '5', '111319', '27042', '25'), +('9', '112', '5', '111017', '26667', '25'), +('9', '112', '8', '106804', '32495', '25'), +('9', '112', '8', '94070', '30892', '25'), +('9', '112', '8', '111331', '30195', '25'), +('9', '112', '8', '106716', '29883', '25'), +('9', '112', '6', '106803', '32073', '25'), +('9', '112', '6', '106843', '32026', '25'), +('9', '112', '6', '111324', '29214', '25'), +('9', '112', '6', '111322', '29117', '25'), +('9', '112', '17', '56046', '22849', '25'), +('9', '112', '17', '56083', '21087', '25'), +('9', '112', '17', '83604', '20921', '25'), +('9', '112', '17', '81765', '20075', '25'), +('9', '112', '7', '94053', '23383', '25'), +('9', '112', '7', '104411', '21132', '25'), +('9', '112', '7', '56079', '20862', '25'), +('9', '112', '7', '102011', '14542', '25'), +('9', '112', '9', '67098', '25164', '25'), +('9', '112', '9', '56033', '21700', '25'), +('9', '112', '9', '56031', '21653', '25'), +('9', '112', '9', '56070', '21507', '25'), +('9', '112', '15', '111343', '30242', '25'), +('9', '112', '15', '111347', '28605', '25'), +('9', '112', '15', '111345', '28561', '25'), +('9', '112', '15', '111042', '27942', '25'), +('9', '112', '20', '111354', '39586', '25'), +('9', '112', '20', '111352', '38463', '25'), +('9', '112', '20', '111355', '38449', '25'), +('9', '112', '20', '111052', '37285', '25'), +('9', '112', '12', '56073', '20696', '25'), +('9', '112', '12', '53420', '20364', '25'), +('9', '112', '12', '81795', '19893', '25'), +('9', '112', '12', '104408', '18686', '25'), +('9', '112', '18', '62986', '21059', '25'), +('9', '112', '18', '104412', '20677', '25'), +('9', '112', '18', '56041', '20404', '25'), +('9', '112', '18', '94054', '19339', '25'), +('9', '112', '19', '62904', '24499', '25'), +('9', '112', '19', '62990', '22531', '25'), +('9', '112', '19', '56037', '21261', '25'), +('9', '112', '19', '104409', '20313', '25'), +('9', '112', '13', '111523', '867752', '25'), +('9', '112', '13', '111871', '822988', '25'), +('9', '112', '13', '111522', '808735', '25'), +('9', '112', '13', '111223', '760806', '25'), +('9', '112', '14', '111523', '287415', '25'), +('9', '112', '14', '111815', '286860', '25'), +('9', '112', '14', '111871', '286611', '25'), +('9', '112', '14', '46856', '282442', '25'), +('9', '112', '11', '111529', '104853', '25'), +('9', '112', '11', '111229', '100422', '25'), +('9', '112', '11', '106769', '86166', '25'), +('9', '112', '11', '62939', '84453', '25'), +('9', '113', '22', '39342', '0', '25'), +('9', '113', '22', '24071', '0', '25'), +('9', '113', '22', '12425', '0', '25'), +('9', '113', '22', '7867', '0', '25'), +('9', '113', '1', '98769', '37503', '25'), +('9', '113', '1', '111300', '29770', '25'), +('9', '113', '1', '111308', '29618', '25'), +('9', '113', '1', '111302', '29553', '25'), +('9', '113', '2', '94056', '22227', '25'), +('9', '113', '2', '62985', '20726', '25'), +('9', '113', '2', '70909', '18017', '25'), +('9', '113', '2', '104410', '16675', '25'), +('9', '113', '3', '111315', '29705', '25'), +('9', '113', '3', '111313', '29295', '25'), +('9', '113', '3', '111316', '27997', '25'), +('9', '113', '3', '111014', '27354', '25'), +('9', '113', '5', '111318', '28943', '25'), +('9', '113', '5', '111320', '27611', '25'), +('9', '113', '5', '111319', '27042', '25'), +('9', '113', '5', '111017', '26667', '25'), +('9', '113', '8', '106804', '32495', '25'), +('9', '113', '8', '94070', '30892', '25'), +('9', '113', '8', '111331', '30195', '25'), +('9', '113', '8', '106716', '29884', '25'), +('9', '113', '6', '106803', '32073', '25'), +('9', '113', '6', '106843', '32026', '25'), +('9', '113', '6', '111324', '29215', '25'), +('9', '113', '6', '111322', '29117', '25'), +('9', '113', '17', '56046', '22849', '25'), +('9', '113', '17', '56083', '21087', '25'), +('9', '113', '17', '83604', '20922', '25'), +('9', '113', '17', '81765', '20075', '25'), +('9', '113', '7', '94053', '23383', '25'), +('9', '113', '7', '104411', '21132', '25'), +('9', '113', '7', '56079', '20862', '25'), +('9', '113', '7', '102011', '14543', '25'), +('9', '113', '9', '67098', '25164', '25'), +('9', '113', '9', '56033', '21700', '25'), +('9', '113', '9', '56031', '21653', '25'), +('9', '113', '9', '56070', '21507', '25'), +('9', '113', '15', '111343', '30243', '25'), +('9', '113', '15', '111347', '28605', '25'), +('9', '113', '15', '111345', '28561', '25'), +('9', '113', '15', '111042', '27942', '25'), +('9', '113', '20', '111354', '39586', '25'), +('9', '113', '20', '111352', '38464', '25'), +('9', '113', '20', '111355', '38449', '25'), +('9', '113', '20', '111052', '37286', '25'), +('9', '113', '12', '56073', '20696', '25'), +('9', '113', '12', '53420', '20364', '25'), +('9', '113', '12', '81795', '19894', '25'), +('9', '113', '12', '104408', '18687', '25'), +('9', '113', '18', '62986', '21060', '25'), +('9', '113', '18', '104412', '20677', '25'), +('9', '113', '18', '56041', '20404', '25'), +('9', '113', '18', '94054', '19340', '25'), +('9', '113', '19', '62904', '24499', '25'), +('9', '113', '19', '62990', '22532', '25'), +('9', '113', '19', '56037', '21262', '25'), +('9', '113', '19', '104409', '20313', '25'), +('9', '113', '13', '111523', '877028', '25'), +('9', '113', '13', '111871', '831596', '25'), +('9', '113', '13', '111522', '817343', '25'), +('9', '113', '13', '111223', '768747', '25'), +('9', '113', '14', '111523', '287895', '25'), +('9', '113', '14', '111815', '287341', '25'), +('9', '113', '14', '111871', '287092', '25'), +('9', '113', '14', '46856', '283766', '25'), +('9', '113', '11', '111529', '104853', '25'), +('9', '113', '11', '111229', '100422', '25'), +('9', '113', '11', '106769', '86166', '25'), +('9', '113', '11', '62939', '84454', '25'), +('9', '114', '22', '39342', '0', '25'), +('9', '114', '22', '24071', '0', '25'), +('9', '114', '22', '12425', '0', '25'), +('9', '114', '22', '7867', '0', '25'), +('9', '114', '1', '98769', '37503', '25'), +('9', '114', '1', '111300', '29771', '25'), +('9', '114', '1', '111308', '29619', '25'), +('9', '114', '1', '111302', '29553', '25'), +('9', '114', '2', '94056', '22227', '25'), +('9', '114', '2', '62985', '20726', '25'), +('9', '114', '2', '70909', '18018', '25'), +('9', '114', '2', '104410', '16676', '25'), +('9', '114', '3', '111315', '29705', '25'), +('9', '114', '3', '111313', '29295', '25'), +('9', '114', '3', '111316', '27998', '25'), +('9', '114', '3', '111014', '27355', '25'), +('9', '114', '5', '111318', '28943', '25'), +('9', '114', '5', '111320', '27611', '25'), +('9', '114', '5', '111319', '27043', '25'), +('9', '114', '5', '111017', '26668', '25'), +('9', '114', '8', '106804', '32496', '25'), +('9', '114', '8', '94070', '30892', '25'), +('9', '114', '8', '111331', '30195', '25'), +('9', '114', '8', '106716', '29884', '25'), +('9', '114', '6', '106803', '32073', '25'), +('9', '114', '6', '106843', '32026', '25'), +('9', '114', '6', '111324', '29215', '25'), +('9', '114', '6', '111322', '29117', '25'), +('9', '114', '17', '56046', '22850', '25'), +('9', '114', '17', '56083', '21087', '25'), +('9', '114', '17', '83604', '20922', '25'), +('9', '114', '17', '81765', '20076', '25'), +('9', '114', '7', '94053', '23384', '25'), +('9', '114', '7', '104411', '21132', '25'), +('9', '114', '7', '56079', '20863', '25'), +('9', '114', '7', '102011', '14543', '25'), +('9', '114', '9', '67098', '25165', '25'), +('9', '114', '9', '56033', '21700', '25'), +('9', '114', '9', '56031', '21654', '25'), +('9', '114', '9', '56070', '21507', '25'), +('9', '114', '15', '111343', '30243', '25'), +('9', '114', '15', '111347', '28606', '25'), +('9', '114', '15', '111345', '28561', '25'), +('9', '114', '15', '111042', '27942', '25'), +('9', '114', '20', '111354', '39586', '25'), +('9', '114', '20', '111352', '38464', '25'), +('9', '114', '20', '111355', '38449', '25'), +('9', '114', '20', '111052', '37286', '25'), +('9', '114', '12', '56073', '20697', '25'), +('9', '114', '12', '53420', '20364', '25'), +('9', '114', '12', '81795', '19894', '25'), +('9', '114', '12', '104408', '18687', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('9', '114', '18', '62986', '21060', '25'), +('9', '114', '18', '104412', '20678', '25'), +('9', '114', '18', '56041', '20404', '25'), +('9', '114', '18', '94054', '19340', '25'), +('9', '114', '19', '62904', '24499', '25'), +('9', '114', '19', '62990', '22532', '25'), +('9', '114', '19', '56037', '21262', '25'), +('9', '114', '19', '104409', '20314', '25'), +('9', '114', '13', '111523', '886360', '25'), +('9', '114', '13', '111871', '840257', '25'), +('9', '114', '13', '111522', '826004', '25'), +('9', '114', '13', '111222', '776739', '25'), +('9', '114', '14', '111523', '288376', '25'), +('9', '114', '14', '111815', '287821', '25'), +('9', '114', '14', '111871', '287572', '25'), +('9', '114', '14', '46856', '285089', '25'), +('9', '114', '11', '111529', '104853', '25'), +('9', '114', '11', '111229', '100422', '25'), +('9', '114', '11', '106769', '86167', '25'), +('9', '114', '11', '62939', '84454', '25'), +('9', '115', '22', '39342', '0', '26'), +('9', '115', '22', '24071', '0', '26'), +('9', '115', '22', '12425', '0', '26'), +('9', '115', '22', '7867', '0', '26'), +('9', '115', '1', '98769', '37504', '26'), +('9', '115', '1', '111300', '29771', '26'), +('9', '115', '1', '111308', '29619', '26'), +('9', '115', '1', '111302', '29553', '26'), +('9', '115', '2', '94056', '22227', '26'), +('9', '115', '2', '62985', '20727', '26'), +('9', '115', '2', '70909', '18018', '26'), +('9', '115', '2', '104410', '16676', '26'), +('9', '115', '3', '111315', '29706', '26'), +('9', '115', '3', '111313', '29295', '26'), +('9', '115', '3', '111316', '27998', '26'), +('9', '115', '3', '111014', '27355', '26'), +('9', '115', '5', '111318', '28943', '26'), +('9', '115', '5', '111320', '27611', '26'), +('9', '115', '5', '111319', '27043', '26'), +('9', '115', '5', '111017', '26668', '26'), +('9', '115', '8', '106804', '32496', '26'), +('9', '115', '8', '94070', '30893', '26'), +('9', '115', '8', '111331', '30196', '26'), +('9', '115', '8', '106716', '29885', '26'), +('9', '115', '6', '106803', '32073', '26'), +('9', '115', '6', '106843', '32027', '26'), +('9', '115', '6', '111324', '29215', '26'), +('9', '115', '6', '111322', '29117', '26'), +('9', '115', '17', '56046', '22850', '26'), +('9', '115', '17', '56083', '21087', '26'), +('9', '115', '17', '83604', '20922', '26'), +('9', '115', '17', '81765', '20076', '26'), +('9', '115', '7', '94053', '23384', '26'), +('9', '115', '7', '104411', '21132', '26'), +('9', '115', '7', '56079', '20863', '26'), +('9', '115', '7', '102011', '14543', '26'), +('9', '115', '9', '67098', '25165', '26'), +('9', '115', '9', '56033', '21700', '26'), +('9', '115', '9', '56031', '21654', '26'), +('9', '115', '9', '56070', '21508', '26'), +('9', '115', '15', '111343', '30243', '26'), +('9', '115', '15', '111347', '28606', '26'), +('9', '115', '15', '111345', '28562', '26'), +('9', '115', '15', '111042', '27942', '26'), +('9', '115', '20', '111354', '39587', '26'), +('9', '115', '20', '111352', '38464', '26'), +('9', '115', '20', '111355', '38450', '26'), +('9', '115', '20', '111052', '37286', '26'), +('9', '115', '12', '56073', '20697', '26'), +('9', '115', '12', '53420', '20365', '26'), +('9', '115', '12', '81795', '19894', '26'), +('9', '115', '12', '104408', '18687', '26'), +('9', '115', '18', '62986', '21060', '26'), +('9', '115', '18', '104412', '20678', '26'), +('9', '115', '18', '56041', '20404', '26'), +('9', '115', '18', '94054', '19340', '26'), +('9', '115', '19', '62904', '24500', '26'), +('9', '115', '19', '62990', '22532', '26'), +('9', '115', '19', '56037', '21262', '26'), +('9', '115', '19', '104409', '20314', '26'), +('9', '115', '13', '111523', '895749', '26'), +('9', '115', '13', '111871', '848970', '26'), +('9', '115', '13', '111522', '834717', '26'), +('9', '115', '13', '111222', '784889', '26'), +('9', '115', '14', '111523', '288856', '26'), +('9', '115', '14', '111815', '288301', '26'), +('9', '115', '14', '111871', '288052', '26'), +('9', '115', '14', '46856', '286412', '26'), +('9', '115', '11', '111529', '104854', '26'), +('9', '115', '11', '111229', '100422', '26'), +('9', '115', '11', '106769', '86167', '26'), +('9', '115', '11', '62939', '84454', '26'), +('10', '1', '22', '9246', '0', '0'), +('10', '1', '22', '21518', '0', '0'), +('10', '1', '22', '10323', '0', '0'), +('10', '1', '22', '44492', '0', '0'), +('10', '1', '1', '14702', '5000', '0'), +('10', '1', '1', '14701', '4612', '0'), +('10', '1', '1', '30361', '2640', '0'), +('10', '1', '1', '10321', '1000', '0'), +('10', '1', '2', '10143', '7118', '0'), +('10', '1', '2', '30363', '3700', '0'), +('10', '1', '2', '3000', '2534', '0'), +('10', '1', '2', '2294', '2064', '0'), +('10', '1', '3', '2295', '1042', '0'), +('10', '1', '3', '14705', '990', '0'), +('10', '1', '3', '14706', '990', '0'), +('10', '1', '3', '10144', '614', '0'), +('10', '1', '5', '14703', '8800', '0'), +('10', '1', '5', '14700', '4818', '0'), +('10', '1', '5', '10055', '4030', '0'), +('10', '1', '5', '30362', '3140', '0'), +('10', '1', '8', '11603', '8419', '0'), +('10', '1', '8', '1546', '8223', '0'), +('10', '1', '8', '2349', '3554', '0'), +('10', '1', '8', '11621', '3521', '0'), +('10', '1', '6', '1557', '5310', '0'), +('10', '1', '6', '1401', '2924', '0'), +('10', '1', '6', '2286', '1989', '0'), +('10', '1', '6', '27728', '1105', '0'), +('10', '1', '17', '2285', '9415', '0'), +('10', '1', '17', '4872', '2830', '0'), +('10', '1', '17', '4946', '565', '0'), +('10', '1', '17', '3305', '403', '0'), +('10', '1', '7', '1362', '3124', '0'), +('10', '1', '7', '1321', '1746', '0'), +('10', '1', '7', '2289', '1379', '0'), +('10', '1', '7', '2458', '936', '0'), +('10', '1', '9', '27727', '5103', '0'), +('10', '1', '9', '14650', '2412', '0'), +('10', '1', '9', '4344', '2051', '0'), +('10', '1', '9', '10408', '2002', '0'), +('10', '1', '15', '10366', '4805', '0'), +('10', '1', '15', '10151', '4200', '0'), +('10', '1', '15', '10163', '3800', '0'), +('10', '1', '15', '14679', '3330', '0'), +('10', '1', '20', '11666', '12050', '0'), +('10', '1', '20', '27727', '5103', '0'), +('10', '1', '20', '2742', '5085', '0'), +('10', '1', '20', '2288', '4478', '0'), +('10', '1', '12', '2923', '4324', '0'), +('10', '1', '12', '2291', '3830', '0'), +('10', '1', '12', '20655', '3629', '0'), +('10', '1', '12', '4835', '3109', '0'), +('10', '1', '18', '4410', '1642', '0'), +('10', '1', '18', '2461', '991', '0'), +('10', '1', '18', '2292', '889', '0'), +('10', '1', '18', '1366', '747', '0'), +('10', '1', '19', '2293', '3271', '0'), +('10', '1', '19', '68239', '2710', '0'), +('10', '1', '19', '1368', '2016', '0'), +('10', '1', '19', '4877', '1500', '0'), +('10', '1', '13', '27729', '8171', '0'), +('10', '1', '13', '11694', '7684', '0'), +('10', '1', '13', '10333', '6800', '0'), +('10', '1', '13', '10334', '3503', '0'), +('10', '1', '14', '10333', '6800', '0'), +('10', '1', '14', '12802', '5139', '0'), +('10', '1', '14', '10334', '3503', '0'), +('10', '1', '14', '11632', '3480', '0'), +('10', '1', '11', '14762', '3204', '0'), +('10', '1', '11', '7051', '2216', '0'), +('10', '1', '11', '20677', '1200', '0'), +('10', '1', '11', '7048', '191', '0'), +('10', '2', '22', '9246', '0', '0'), +('10', '2', '22', '21518', '0', '0'), +('10', '2', '22', '10323', '0', '0'), +('10', '2', '22', '44492', '0', '0'), +('10', '2', '1', '14702', '5000', '0'), +('10', '2', '1', '14701', '4612', '0'), +('10', '2', '1', '30361', '2640', '0'), +('10', '2', '1', '10321', '1000', '0'), +('10', '2', '2', '10143', '7118', '0'), +('10', '2', '2', '30363', '3700', '0'), +('10', '2', '2', '3000', '2534', '0'), +('10', '2', '2', '2294', '2088', '0'), +('10', '2', '3', '2295', '1066', '0'), +('10', '2', '3', '14705', '990', '0'), +('10', '2', '3', '14706', '990', '0'), +('10', '2', '3', '10144', '614', '0'), +('10', '2', '5', '14703', '8800', '0'), +('10', '2', '5', '14700', '4818', '0'), +('10', '2', '5', '10055', '4030', '0'), +('10', '2', '5', '30362', '3140', '0'), +('10', '2', '8', '11603', '8528', '0'), +('10', '2', '8', '1546', '8344', '0'), +('10', '2', '8', '2349', '3554', '0'), +('10', '2', '8', '11621', '3521', '0'), +('10', '2', '6', '1557', '5310', '0'), +('10', '2', '6', '1401', '2924', '0'), +('10', '2', '6', '2286', '1998', '0'), +('10', '2', '6', '27728', '1250', '0'), +('10', '2', '17', '2285', '9463', '0'), +('10', '2', '17', '4872', '3004', '0'), +('10', '2', '17', '4946', '565', '0'), +('10', '2', '17', '3305', '403', '0'), +('10', '2', '7', '1362', '3124', '0'), +('10', '2', '7', '1321', '1746', '0'), +('10', '2', '7', '2289', '1427', '0'), +('10', '2', '7', '2458', '936', '0'), +('10', '2', '9', '27727', '5163', '0'), +('10', '2', '9', '14650', '2412', '0'), +('10', '2', '9', '4344', '2051', '0'), +('10', '2', '9', '10408', '2002', '0'), +('10', '2', '15', '10366', '4805', '0'), +('10', '2', '15', '10151', '4200', '0'), +('10', '2', '15', '10163', '3800', '0'), +('10', '2', '15', '14679', '3330', '0'), +('10', '2', '20', '11666', '12062', '0'), +('10', '2', '20', '27727', '5163', '0'), +('10', '2', '20', '2742', '5103', '0'), +('10', '2', '20', '2288', '4478', '0'), +('10', '2', '12', '2923', '4324', '0'), +('10', '2', '12', '2291', '3830', '0'), +('10', '2', '12', '20655', '3657', '0'), +('10', '2', '12', '4835', '3118', '0'), +('10', '2', '18', '4410', '1642', '0'), +('10', '2', '18', '2461', '1039', '0'), +('10', '2', '18', '2292', '938', '0'), +('10', '2', '18', '1366', '747', '0'), +('10', '2', '19', '2293', '3308', '0'), +('10', '2', '19', '68239', '2746', '0'), +('10', '2', '19', '1368', '2016', '0'), +('10', '2', '19', '4877', '1500', '0'), +('10', '2', '13', '27729', '8340', '0'), +('10', '2', '13', '11694', '7865', '0'), +('10', '2', '13', '10333', '6800', '0'), +('10', '2', '13', '10334', '3503', '0'), +('10', '2', '14', '10333', '6800', '0'), +('10', '2', '14', '12802', '5199', '0'), +('10', '2', '14', '11632', '3507', '0'), +('10', '2', '14', '10334', '3503', '0'), +('10', '2', '11', '14762', '3204', '0'), +('10', '2', '11', '7051', '2277', '0'), +('10', '2', '11', '20677', '1200', '0'), +('10', '2', '11', '9246', '254', '0'), +('10', '3', '22', '9246', '0', '0'), +('10', '3', '22', '21518', '0', '0'), +('10', '3', '22', '10323', '0', '0'), +('10', '3', '22', '44492', '0', '0'), +('10', '3', '1', '14702', '5000', '0'), +('10', '3', '1', '14701', '4612', '0'), +('10', '3', '1', '30361', '2640', '0'), +('10', '3', '1', '10321', '1000', '0'), +('10', '3', '2', '10143', '7118', '0'), +('10', '3', '2', '30363', '3700', '0'), +('10', '3', '2', '3000', '2534', '0'), +('10', '3', '2', '2294', '2112', '0'), +('10', '3', '3', '2295', '1091', '0'), +('10', '3', '3', '14705', '990', '0'), +('10', '3', '3', '14706', '990', '0'), +('10', '3', '3', '10144', '614', '0'), +('10', '3', '5', '14703', '8800', '0'), +('10', '3', '5', '14700', '4818', '0'), +('10', '3', '5', '10055', '4030', '0'), +('10', '3', '5', '30362', '3140', '0'), +('10', '3', '8', '11603', '8637', '0'), +('10', '3', '8', '1546', '8465', '0'), +('10', '3', '8', '2349', '3554', '0'), +('10', '3', '8', '11621', '3521', '0'), +('10', '3', '6', '1557', '5310', '0'), +('10', '3', '6', '1401', '2924', '0'), +('10', '3', '6', '2286', '2007', '0'), +('10', '3', '6', '27728', '1395', '0'), +('10', '3', '17', '2285', '9511', '0'), +('10', '3', '17', '4872', '3177', '0'), +('10', '3', '17', '4946', '565', '0'), +('10', '3', '17', '4342', '489', '0'), +('10', '3', '7', '1362', '3124', '0'), +('10', '3', '7', '1321', '1746', '0'), +('10', '3', '7', '2289', '1475', '0'), +('10', '3', '7', '2458', '936', '0'), +('10', '3', '9', '27727', '5223', '0'), +('10', '3', '9', '14650', '2412', '0'), +('10', '3', '9', '4344', '2051', '0'), +('10', '3', '9', '10408', '2002', '0'), +('10', '3', '15', '10366', '4805', '0'), +('10', '3', '15', '10151', '4200', '0'), +('10', '3', '15', '10163', '3800', '0'), +('10', '3', '15', '14679', '3330', '0'), +('10', '3', '20', '11666', '12075', '0'), +('10', '3', '20', '27727', '5223', '0'), +('10', '3', '20', '2742', '5121', '0'), +('10', '3', '20', '2288', '4478', '0'), +('10', '3', '12', '2923', '4324', '0'), +('10', '3', '12', '2291', '3830', '0'), +('10', '3', '12', '20655', '3685', '0'), +('10', '3', '12', '4835', '3127', '0'), +('10', '3', '18', '4410', '1642', '0'), +('10', '3', '18', '2461', '1087', '0'), +('10', '3', '18', '2292', '986', '0'), +('10', '3', '18', '1366', '747', '0'), +('10', '3', '19', '2293', '3344', '0'), +('10', '3', '19', '68239', '2782', '0'), +('10', '3', '19', '1368', '2016', '0'), +('10', '3', '19', '4877', '1500', '0'), +('10', '3', '13', '27729', '8509', '0'), +('10', '3', '13', '11694', '8046', '0'), +('10', '3', '13', '10333', '6800', '0'), +('10', '3', '13', '10334', '3503', '0'), +('10', '3', '14', '10333', '6800', '0'), +('10', '3', '14', '12802', '5260', '0'), +('10', '3', '14', '11632', '3535', '0'), +('10', '3', '14', '10334', '3503', '0'), +('10', '3', '11', '14762', '3204', '0'), +('10', '3', '11', '7051', '2337', '0'), +('10', '3', '11', '20677', '1200', '0'), +('10', '3', '11', '9246', '374', '0'), +('10', '4', '22', '9246', '0', '0'), +('10', '4', '22', '21518', '0', '0'), +('10', '4', '22', '10323', '0', '0'), +('10', '4', '22', '44492', '0', '0'), +('10', '4', '1', '14702', '5000', '0'), +('10', '4', '1', '14701', '4612', '0'), +('10', '4', '1', '30361', '2640', '0'), +('10', '4', '1', '10321', '1000', '0'), +('10', '4', '2', '10143', '7118', '0'), +('10', '4', '2', '30363', '3700', '0'), +('10', '4', '2', '3000', '2534', '0'), +('10', '4', '2', '2294', '2137', '0'), +('10', '4', '3', '2295', '1115', '0'), +('10', '4', '3', '14705', '990', '0'), +('10', '4', '3', '14706', '990', '0'), +('10', '4', '3', '11052', '725', '0'), +('10', '4', '5', '14703', '8800', '0'), +('10', '4', '5', '14700', '4818', '0'), +('10', '4', '5', '10055', '4030', '0'), +('10', '4', '5', '30362', '3140', '0'), +('10', '4', '8', '11603', '8745', '0'), +('10', '4', '8', '1546', '8586', '0'), +('10', '4', '8', '2349', '3554', '0'), +('10', '4', '8', '11621', '3521', '0'), +('10', '4', '6', '1557', '5310', '0'), +('10', '4', '6', '1401', '2924', '0'), +('10', '4', '6', '2286', '2016', '0'), +('10', '4', '6', '27728', '1540', '0'), +('10', '4', '17', '2285', '9560', '0'), +('10', '4', '17', '4872', '3350', '0'), +('10', '4', '17', '4342', '610', '0'), +('10', '4', '17', '4946', '565', '0'), +('10', '4', '7', '1362', '3124', '0'), +('10', '4', '7', '1321', '1746', '0'), +('10', '4', '7', '2289', '1523', '0'), +('10', '4', '7', '2458', '936', '0'), +('10', '4', '9', '27727', '5284', '0'), +('10', '4', '9', '14650', '2412', '0'), +('10', '4', '9', '4344', '2051', '0'), +('10', '4', '9', '10408', '2002', '0'), +('10', '4', '15', '10366', '4805', '0'), +('10', '4', '15', '10151', '4200', '0'), +('10', '4', '15', '10163', '3800', '0'), +('10', '4', '15', '14679', '3330', '0'), +('10', '4', '20', '11666', '12088', '0'), +('10', '4', '20', '27727', '5284', '0'), +('10', '4', '20', '2742', '5139', '0'), +('10', '4', '20', '2288', '4478', '0'), +('10', '4', '12', '2923', '4324', '0'), +('10', '4', '12', '2291', '3830', '0'), +('10', '4', '12', '20655', '3713', '0'), +('10', '4', '12', '4835', '3136', '0'), +('10', '4', '18', '4410', '1642', '0'), +('10', '4', '18', '2461', '1136', '0'), +('10', '4', '18', '2292', '1034', '0'), +('10', '4', '18', '1366', '747', '0'), +('10', '4', '19', '2293', '3380', '0'), +('10', '4', '19', '68239', '2818', '0'), +('10', '4', '19', '1368', '2016', '0'), +('10', '4', '19', '4877', '1500', '0'), +('10', '4', '13', '27729', '8678', '0'), +('10', '4', '13', '11694', '8227', '0'), +('10', '4', '13', '10333', '6800', '0'), +('10', '4', '13', '10334', '3503', '0'), +('10', '4', '14', '10333', '6800', '0'), +('10', '4', '14', '12802', '5320', '0'), +('10', '4', '14', '11632', '3562', '0'), +('10', '4', '14', '1679', '3533', '0'), +('10', '4', '11', '14762', '3204', '0'), +('10', '4', '11', '7051', '2398', '0'), +('10', '4', '11', '20677', '1200', '0'), +('10', '4', '11', '9246', '495', '0'), +('10', '5', '22', '9246', '0', '0'), +('10', '5', '22', '21518', '0', '0'), +('10', '5', '22', '10323', '0', '0'), +('10', '5', '22', '44492', '0', '0'), +('10', '5', '1', '14702', '5000', '0'), +('10', '5', '1', '14701', '4612', '0'), +('10', '5', '1', '30361', '2640', '0'), +('10', '5', '1', '10321', '1000', '0'), +('10', '5', '2', '10143', '7118', '0'), +('10', '5', '2', '30363', '3700', '0'), +('10', '5', '2', '3000', '2534', '0'), +('10', '5', '2', '2294', '2161', '0'), +('10', '5', '3', '2295', '1139', '0'), +('10', '5', '3', '14705', '990', '0'), +('10', '5', '3', '14706', '990', '0'), +('10', '5', '3', '11052', '906', '0'), +('10', '5', '5', '14703', '8800', '0'), +('10', '5', '5', '14700', '4818', '0'), +('10', '5', '5', '10055', '4030', '0'), +('10', '5', '5', '30362', '3140', '0'), +('10', '5', '8', '11603', '8854', '0'), +('10', '5', '8', '1546', '8707', '0'), +('10', '5', '8', '2349', '3554', '0'), +('10', '5', '8', '11621', '3521', '0'), +('10', '5', '6', '1557', '5310', '0'), +('10', '5', '6', '1401', '2924', '0'), +('10', '5', '6', '2286', '2026', '0'), +('10', '5', '6', '27728', '1685', '0'), +('10', '5', '17', '2285', '9608', '0'), +('10', '5', '17', '4872', '3524', '0'), +('10', '5', '17', '4342', '731', '0'), +('10', '5', '17', '4946', '565', '0'), +('10', '5', '7', '1362', '3124', '0'), +('10', '5', '7', '1321', '1746', '0'), +('10', '5', '7', '2289', '1572', '0'), +('10', '5', '7', '2458', '936', '0'), +('10', '5', '9', '27727', '5344', '0'), +('10', '5', '9', '14650', '2412', '0'), +('10', '5', '9', '4344', '2051', '0'), +('10', '5', '9', '10408', '2002', '0'), +('10', '5', '15', '10366', '4805', '0'), +('10', '5', '15', '10151', '4200', '0'), +('10', '5', '15', '10163', '3800', '0'), +('10', '5', '15', '14679', '3330', '0'), +('10', '5', '20', '11666', '12100', '0'), +('10', '5', '20', '27727', '5344', '0'), +('10', '5', '20', '2742', '5157', '0'), +('10', '5', '20', '2288', '4478', '0'), +('10', '5', '12', '2923', '4324', '0'), +('10', '5', '12', '2291', '3830', '0'), +('10', '5', '12', '20655', '3740', '0'), +('10', '5', '12', '4835', '3145', '0'), +('10', '5', '18', '4410', '1642', '0'), +('10', '5', '18', '2461', '1184', '0'), +('10', '5', '18', '2292', '1083', '0'), +('10', '5', '18', '1366', '747', '0'), +('10', '5', '19', '2293', '3416', '0'), +('10', '5', '19', '68239', '2855', '0'), +('10', '5', '19', '1368', '2016', '0'), +('10', '5', '19', '4877', '1500', '0'), +('10', '5', '13', '27729', '8848', '0'), +('10', '5', '13', '11694', '8408', '0'), +('10', '5', '13', '10333', '6800', '0'), +('10', '5', '13', '10334', '3503', '0'), +('10', '5', '14', '10333', '6800', '0'), +('10', '5', '14', '12802', '5381', '0'), +('10', '5', '14', '1679', '3594', '0'), +('10', '5', '14', '11632', '3589', '0'), +('10', '5', '11', '14762', '3204', '0'), +('10', '5', '11', '7051', '2458', '0'), +('10', '5', '11', '20677', '1200', '0'), +('10', '5', '11', '9246', '616', '0'), +('10', '6', '22', '9246', '0', '0'), +('10', '6', '22', '21518', '0', '0'), +('10', '6', '22', '10323', '0', '0'), +('10', '6', '22', '44492', '0', '0'), +('10', '6', '1', '14702', '5000', '0'), +('10', '6', '1', '14701', '4612', '0'), +('10', '6', '1', '30361', '2640', '0'), +('10', '6', '1', '10321', '1000', '0'), +('10', '6', '2', '10143', '7118', '0'), +('10', '6', '2', '30363', '3700', '0'), +('10', '6', '2', '3000', '2534', '0'), +('10', '6', '2', '2294', '2185', '0'), +('10', '6', '3', '2295', '1163', '0'), +('10', '6', '3', '11052', '1087', '0'), +('10', '6', '3', '14705', '990', '0'), +('10', '6', '3', '14706', '990', '0'), +('10', '6', '5', '14703', '8800', '0'), +('10', '6', '5', '14700', '4818', '0'), +('10', '6', '5', '10055', '4030', '0'), +('10', '6', '5', '30362', '3140', '0'), +('10', '6', '8', '11603', '8963', '0'), +('10', '6', '8', '1546', '8827', '0'), +('10', '6', '8', '2349', '3554', '0'), +('10', '6', '8', '11621', '3521', '0'), +('10', '6', '6', '1557', '5310', '0'), +('10', '6', '6', '1401', '2924', '0'), +('10', '6', '6', '2286', '2035', '0'), +('10', '6', '6', '27728', '1830', '0'), +('10', '6', '17', '2285', '9656', '0'), +('10', '6', '17', '4872', '3697', '0'), +('10', '6', '17', '4342', '852', '0'), +('10', '6', '17', '4946', '565', '0'), +('10', '6', '7', '1362', '3124', '0'), +('10', '6', '7', '1321', '1746', '0'), +('10', '6', '7', '2289', '1620', '0'), +('10', '6', '7', '2458', '936', '0'), +('10', '6', '9', '27727', '5405', '0'), +('10', '6', '9', '14650', '2412', '0'), +('10', '6', '9', '4344', '2051', '0'), +('10', '6', '9', '10408', '2002', '0'), +('10', '6', '15', '10366', '4805', '0'), +('10', '6', '15', '10151', '4200', '0'), +('10', '6', '15', '10163', '3800', '0'), +('10', '6', '15', '14679', '3330', '0'), +('10', '6', '20', '11666', '12113', '0'), +('10', '6', '20', '27727', '5405', '0'), +('10', '6', '20', '2742', '5175', '0'), +('10', '6', '20', '2288', '4478', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '6', '12', '2923', '4324', '0'), +('10', '6', '12', '2291', '3830', '0'), +('10', '6', '12', '20655', '3768', '0'), +('10', '6', '12', '4835', '3154', '0'), +('10', '6', '18', '4410', '1642', '0'), +('10', '6', '18', '2461', '1232', '0'), +('10', '6', '18', '2292', '1131', '0'), +('10', '6', '18', '1366', '747', '0'), +('10', '6', '19', '2293', '3452', '0'), +('10', '6', '19', '68239', '2891', '0'), +('10', '6', '19', '1368', '2016', '0'), +('10', '6', '19', '4877', '1500', '0'), +('10', '6', '13', '27729', '9017', '0'), +('10', '6', '13', '11694', '8590', '0'), +('10', '6', '13', '10333', '6800', '0'), +('10', '6', '13', '10334', '3503', '0'), +('10', '6', '14', '10333', '6800', '0'), +('10', '6', '14', '12802', '5441', '0'), +('10', '6', '14', '1679', '3654', '0'), +('10', '6', '14', '11632', '3616', '0'), +('10', '6', '11', '14762', '3204', '0'), +('10', '6', '11', '7051', '2518', '0'), +('10', '6', '11', '20677', '1200', '0'), +('10', '6', '11', '9246', '737', '0'), +('10', '7', '22', '9246', '0', '0'), +('10', '7', '22', '21518', '0', '0'), +('10', '7', '22', '10323', '0', '0'), +('10', '7', '22', '44492', '0', '0'), +('10', '7', '1', '14702', '5000', '0'), +('10', '7', '1', '14701', '4612', '0'), +('10', '7', '1', '30361', '2640', '0'), +('10', '7', '1', '10321', '1000', '0'), +('10', '7', '2', '10143', '7118', '0'), +('10', '7', '2', '30363', '3700', '0'), +('10', '7', '2', '3000', '2534', '0'), +('10', '7', '2', '2294', '2209', '0'), +('10', '7', '3', '11052', '1268', '0'), +('10', '7', '3', '2295', '1187', '0'), +('10', '7', '3', '14705', '990', '0'), +('10', '7', '3', '14706', '990', '0'), +('10', '7', '5', '14703', '8800', '0'), +('10', '7', '5', '14700', '4818', '0'), +('10', '7', '5', '10055', '4030', '0'), +('10', '7', '5', '30362', '3140', '0'), +('10', '7', '8', '11603', '9071', '0'), +('10', '7', '8', '1546', '8948', '0'), +('10', '7', '8', '2349', '3554', '0'), +('10', '7', '8', '11621', '3521', '0'), +('10', '7', '6', '1557', '5310', '0'), +('10', '7', '6', '1401', '2924', '0'), +('10', '7', '6', '2286', '2044', '0'), +('10', '7', '6', '27728', '1975', '0'), +('10', '7', '17', '2285', '9705', '0'), +('10', '7', '17', '4872', '3870', '0'), +('10', '7', '17', '4342', '972', '0'), +('10', '7', '17', '4946', '565', '0'), +('10', '7', '7', '1362', '3124', '0'), +('10', '7', '7', '1321', '1746', '0'), +('10', '7', '7', '2289', '1668', '0'), +('10', '7', '7', '2458', '936', '0'), +('10', '7', '9', '27727', '5465', '0'), +('10', '7', '9', '14650', '2412', '0'), +('10', '7', '9', '4344', '2051', '0'), +('10', '7', '9', '10408', '2002', '0'), +('10', '7', '15', '10366', '4805', '0'), +('10', '7', '15', '10151', '4200', '0'), +('10', '7', '15', '10163', '3800', '0'), +('10', '7', '15', '14679', '3330', '0'), +('10', '7', '20', '11666', '12126', '0'), +('10', '7', '20', '27727', '5465', '0'), +('10', '7', '20', '2742', '5193', '0'), +('10', '7', '20', '2288', '4478', '0'), +('10', '7', '12', '2923', '4324', '0'), +('10', '7', '12', '2291', '3830', '0'), +('10', '7', '12', '20655', '3796', '0'), +('10', '7', '12', '4835', '3163', '0'), +('10', '7', '18', '4410', '1642', '0'), +('10', '7', '18', '2461', '1281', '0'), +('10', '7', '18', '2292', '1179', '0'), +('10', '7', '18', '1366', '747', '0'), +('10', '7', '19', '2293', '3489', '0'), +('10', '7', '19', '68239', '2927', '0'), +('10', '7', '19', '1368', '2016', '0'), +('10', '7', '19', '4877', '1500', '0'), +('10', '7', '13', '27729', '9186', '0'), +('10', '7', '13', '11694', '8771', '0'), +('10', '7', '13', '10333', '6800', '0'), +('10', '7', '13', '10334', '3503', '0'), +('10', '7', '14', '10333', '6800', '0'), +('10', '7', '14', '12802', '5501', '0'), +('10', '7', '14', '1679', '3715', '0'), +('10', '7', '14', '11632', '3643', '0'), +('10', '7', '11', '14762', '3204', '0'), +('10', '7', '11', '7051', '2579', '0'), +('10', '7', '11', '20677', '1200', '0'), +('10', '7', '11', '9246', '858', '0'), +('10', '8', '22', '9246', '0', '0'), +('10', '8', '22', '21518', '0', '0'), +('10', '8', '22', '10323', '0', '0'), +('10', '8', '22', '44492', '0', '0'), +('10', '8', '1', '14702', '5000', '0'), +('10', '8', '1', '14701', '4612', '0'), +('10', '8', '1', '30361', '2640', '0'), +('10', '8', '1', '10321', '1000', '0'), +('10', '8', '2', '10143', '7118', '0'), +('10', '8', '2', '30363', '3700', '0'), +('10', '8', '2', '3000', '2534', '0'), +('10', '8', '2', '2294', '2233', '0'), +('10', '8', '3', '11052', '1450', '0'), +('10', '8', '3', '2295', '1211', '0'), +('10', '8', '3', '14705', '990', '0'), +('10', '8', '3', '14706', '990', '0'), +('10', '8', '5', '14703', '8800', '0'), +('10', '8', '5', '14700', '4818', '0'), +('10', '8', '5', '10055', '4030', '0'), +('10', '8', '5', '30362', '3140', '0'), +('10', '8', '8', '11603', '9180', '0'), +('10', '8', '8', '1546', '9069', '0'), +('10', '8', '8', '2349', '3554', '0'), +('10', '8', '8', '11621', '3521', '0'), +('10', '8', '6', '1557', '5310', '0'), +('10', '8', '6', '1401', '2924', '0'), +('10', '8', '6', '27728', '2120', '0'), +('10', '8', '6', '2286', '2053', '0'), +('10', '8', '17', '2285', '9753', '0'), +('10', '8', '17', '4872', '4044', '0'), +('10', '8', '17', '4342', '1093', '0'), +('10', '8', '17', '2405', '587', '0'), +('10', '8', '7', '1362', '3124', '0'), +('10', '8', '7', '1321', '1746', '0'), +('10', '8', '7', '2289', '1717', '0'), +('10', '8', '7', '2458', '936', '0'), +('10', '8', '9', '27727', '5525', '0'), +('10', '8', '9', '14650', '2412', '0'), +('10', '8', '9', '4344', '2051', '0'), +('10', '8', '9', '10408', '2002', '0'), +('10', '8', '15', '10366', '4805', '0'), +('10', '8', '15', '10151', '4200', '0'), +('10', '8', '15', '10163', '3800', '0'), +('10', '8', '15', '14679', '3330', '0'), +('10', '8', '20', '11666', '12138', '0'), +('10', '8', '20', '27727', '5525', '0'), +('10', '8', '20', '2742', '5211', '0'), +('10', '8', '20', '2288', '4478', '0'), +('10', '8', '12', '2923', '4324', '0'), +('10', '8', '12', '2291', '3830', '0'), +('10', '8', '12', '20655', '3824', '0'), +('10', '8', '12', '4835', '3172', '0'), +('10', '8', '18', '4410', '1642', '0'), +('10', '8', '18', '2461', '1329', '0'), +('10', '8', '18', '2292', '1228', '0'), +('10', '8', '18', '4876', '784', '0'), +('10', '8', '19', '2293', '3525', '0'), +('10', '8', '19', '68239', '2963', '0'), +('10', '8', '19', '1368', '2016', '0'), +('10', '8', '19', '4837', '1507', '0'), +('10', '8', '13', '27729', '9355', '0'), +('10', '8', '13', '11694', '8952', '0'), +('10', '8', '13', '10333', '6800', '0'), +('10', '8', '13', '10334', '3503', '0'), +('10', '8', '14', '10333', '6800', '0'), +('10', '8', '14', '12802', '5562', '0'), +('10', '8', '14', '1679', '3775', '0'), +('10', '8', '14', '11632', '3670', '0'), +('10', '8', '11', '14762', '3204', '0'), +('10', '8', '11', '7051', '2639', '0'), +('10', '8', '11', '20677', '1200', '0'), +('10', '8', '11', '9246', '978', '0'), +('10', '9', '22', '9246', '0', '0'), +('10', '9', '22', '21518', '0', '0'), +('10', '9', '22', '10323', '0', '0'), +('10', '9', '22', '44492', '0', '0'), +('10', '9', '1', '14702', '5000', '0'), +('10', '9', '1', '14701', '4612', '0'), +('10', '9', '1', '30361', '2640', '0'), +('10', '9', '1', '10321', '1000', '0'), +('10', '9', '2', '10143', '7118', '0'), +('10', '9', '2', '30363', '3700', '0'), +('10', '9', '2', '3000', '2534', '0'), +('10', '9', '2', '2294', '2257', '0'), +('10', '9', '3', '11052', '1631', '0'), +('10', '9', '3', '2295', '1236', '0'), +('10', '9', '3', '14706', '990', '0'), +('10', '9', '3', '14705', '990', '0'), +('10', '9', '5', '14703', '8800', '0'), +('10', '9', '5', '14700', '4818', '0'), +('10', '9', '5', '10055', '4030', '0'), +('10', '9', '5', '30362', '3140', '0'), +('10', '9', '8', '11603', '9289', '0'), +('10', '9', '8', '1546', '9190', '0'), +('10', '9', '8', '2349', '3554', '0'), +('10', '9', '8', '11621', '3521', '0'), +('10', '9', '6', '1557', '5310', '0'), +('10', '9', '6', '1401', '2924', '0'), +('10', '9', '6', '27728', '2265', '0'), +('10', '9', '6', '2286', '2062', '0'), +('10', '9', '17', '2285', '9801', '0'), +('10', '9', '17', '4872', '4217', '0'), +('10', '9', '17', '4342', '1214', '0'), +('10', '9', '17', '2405', '653', '0'), +('10', '9', '7', '1362', '3124', '0'), +('10', '9', '7', '2289', '1765', '0'), +('10', '9', '7', '1321', '1746', '0'), +('10', '9', '7', '2458', '936', '0'), +('10', '9', '9', '27727', '5586', '0'), +('10', '9', '9', '14650', '2412', '0'), +('10', '9', '9', '4344', '2051', '0'), +('10', '9', '9', '10408', '2002', '0'), +('10', '9', '15', '10366', '4805', '0'), +('10', '9', '15', '10151', '4200', '0'), +('10', '9', '15', '10163', '3800', '0'), +('10', '9', '15', '14679', '3330', '0'), +('10', '9', '20', '11666', '12151', '0'), +('10', '9', '20', '27727', '5586', '0'), +('10', '9', '20', '2742', '5230', '0'), +('10', '9', '20', '2288', '4478', '0'), +('10', '9', '12', '2923', '4324', '0'), +('10', '9', '12', '20655', '3852', '0'), +('10', '9', '12', '2291', '3830', '0'), +('10', '9', '12', '4835', '3181', '0'), +('10', '9', '18', '4410', '1642', '0'), +('10', '9', '18', '2461', '1377', '0'), +('10', '9', '18', '2292', '1276', '0'), +('10', '9', '18', '4876', '844', '0'), +('10', '9', '19', '2293', '3561', '0'), +('10', '9', '19', '68239', '3000', '0'), +('10', '9', '19', '1368', '2016', '0'), +('10', '9', '19', '4837', '1567', '0'), +('10', '9', '13', '27729', '9524', '0'), +('10', '9', '13', '11694', '9133', '0'), +('10', '9', '13', '10333', '6800', '0'), +('10', '9', '13', '10334', '3503', '0'), +('10', '9', '14', '10333', '6800', '0'), +('10', '9', '14', '12802', '5622', '0'), +('10', '9', '14', '1679', '3835', '0'), +('10', '9', '14', '11632', '3698', '0'), +('10', '9', '11', '14762', '3204', '0'), +('10', '9', '11', '7051', '2700', '0'), +('10', '9', '11', '20677', '1200', '0'), +('10', '9', '11', '9246', '1099', '0'), +('10', '10', '22', '9246', '0', '0'), +('10', '10', '22', '21518', '0', '0'), +('10', '10', '22', '10323', '0', '0'), +('10', '10', '22', '44492', '0', '0'), +('10', '10', '1', '14702', '5000', '0'), +('10', '10', '1', '14701', '4612', '0'), +('10', '10', '1', '30361', '2640', '0'), +('10', '10', '1', '10321', '1000', '0'), +('10', '10', '2', '10143', '7118', '0'), +('10', '10', '2', '30363', '3700', '0'), +('10', '10', '2', '3000', '2534', '0'), +('10', '10', '2', '2294', '2281', '0'), +('10', '10', '3', '11052', '1812', '0'), +('10', '10', '3', '2295', '1260', '0'), +('10', '10', '3', '14706', '990', '0'), +('10', '10', '3', '14705', '990', '0'), +('10', '10', '5', '14703', '8800', '0'), +('10', '10', '5', '14700', '4818', '0'), +('10', '10', '5', '10055', '4030', '0'), +('10', '10', '5', '30362', '3140', '0'), +('10', '10', '8', '11603', '9398', '0'), +('10', '10', '8', '1546', '9311', '0'), +('10', '10', '8', '2349', '3554', '0'), +('10', '10', '8', '11621', '3521', '0'), +('10', '10', '6', '1557', '5310', '0'), +('10', '10', '6', '1401', '2924', '0'), +('10', '10', '6', '27728', '2410', '0'), +('10', '10', '6', '2286', '2071', '0'), +('10', '10', '17', '2285', '9850', '0'), +('10', '10', '17', '4872', '4391', '0'), +('10', '10', '17', '4342', '1335', '0'), +('10', '10', '17', '2405', '719', '0'), +('10', '10', '7', '1362', '3124', '0'), +('10', '10', '7', '2289', '1813', '0'), +('10', '10', '7', '1321', '1746', '0'), +('10', '10', '7', '2458', '936', '0'), +('10', '10', '9', '27727', '5646', '0'), +('10', '10', '9', '14650', '2412', '0'), +('10', '10', '9', '4344', '2051', '0'), +('10', '10', '9', '10408', '2002', '0'), +('10', '10', '15', '10366', '4805', '0'), +('10', '10', '15', '10151', '4200', '0'), +('10', '10', '15', '10163', '3800', '0'), +('10', '10', '15', '14679', '3330', '0'), +('10', '10', '20', '11666', '12164', '0'), +('10', '10', '20', '27727', '5646', '0'), +('10', '10', '20', '2742', '5248', '0'), +('10', '10', '20', '2288', '4478', '0'), +('10', '10', '12', '2923', '4324', '0'), +('10', '10', '12', '20655', '3879', '0'), +('10', '10', '12', '2291', '3830', '0'), +('10', '10', '12', '4835', '3190', '0'), +('10', '10', '18', '4410', '1642', '0'), +('10', '10', '18', '2461', '1425', '0'), +('10', '10', '18', '2292', '1324', '0'), +('10', '10', '18', '4876', '905', '0'), +('10', '10', '19', '2293', '3597', '0'), +('10', '10', '19', '68239', '3036', '0'), +('10', '10', '19', '1368', '2016', '0'), +('10', '10', '19', '4837', '1628', '0'), +('10', '10', '13', '27729', '9693', '0'), +('10', '10', '13', '11694', '9314', '0'), +('10', '10', '13', '10333', '6800', '0'), +('10', '10', '13', '10334', '3503', '0'), +('10', '10', '14', '10333', '6800', '0'), +('10', '10', '14', '12802', '5683', '0'), +('10', '10', '14', '1679', '3896', '0'), +('10', '10', '14', '11632', '3725', '0'), +('10', '10', '11', '14762', '3204', '0'), +('10', '10', '11', '7051', '2760', '0'), +('10', '10', '11', '9246', '1220', '0'), +('10', '10', '11', '20677', '1200', '0'), +('10', '11', '22', '9246', '0', '0'), +('10', '11', '22', '21518', '0', '0'), +('10', '11', '22', '10323', '0', '0'), +('10', '11', '22', '44492', '0', '0'), +('10', '11', '1', '14702', '5000', '0'), +('10', '11', '1', '14701', '4612', '0'), +('10', '11', '1', '30361', '2640', '0'), +('10', '11', '1', '10321', '1000', '0'), +('10', '11', '2', '10143', '7118', '0'), +('10', '11', '2', '30363', '3700', '0'), +('10', '11', '2', '3000', '2534', '0'), +('10', '11', '2', '2294', '2306', '0'), +('10', '11', '3', '11052', '1993', '0'), +('10', '11', '3', '2295', '1284', '0'), +('10', '11', '3', '14706', '990', '0'), +('10', '11', '3', '14705', '990', '0'), +('10', '11', '5', '14703', '8800', '0'), +('10', '11', '5', '14700', '4818', '0'), +('10', '11', '5', '10055', '4030', '0'), +('10', '11', '5', '30362', '3140', '0'), +('10', '11', '8', '11603', '9506', '0'), +('10', '11', '8', '1546', '9431', '0'), +('10', '11', '8', '2349', '3554', '0'), +('10', '11', '8', '11621', '3521', '0'), +('10', '11', '6', '1557', '5310', '0'), +('10', '11', '6', '1401', '2924', '0'), +('10', '11', '6', '27728', '2555', '0'), +('10', '11', '6', '2286', '2080', '0'), +('10', '11', '17', '2285', '9898', '0'), +('10', '11', '17', '4872', '4564', '0'), +('10', '11', '17', '4342', '1456', '0'), +('10', '11', '17', '2405', '785', '0'), +('10', '11', '7', '1362', '3124', '0'), +('10', '11', '7', '2289', '1862', '0'), +('10', '11', '7', '1321', '1746', '0'), +('10', '11', '7', '2458', '936', '0'), +('10', '11', '9', '27727', '5707', '0'), +('10', '11', '9', '14650', '2412', '0'), +('10', '11', '9', '4344', '2051', '0'), +('10', '11', '9', '10408', '2002', '0'), +('10', '11', '15', '10366', '4805', '0'), +('10', '11', '15', '10151', '4200', '0'), +('10', '11', '15', '10163', '3800', '0'), +('10', '11', '15', '14679', '3330', '0'), +('10', '11', '20', '11666', '12176', '0'), +('10', '11', '20', '27727', '5707', '0'), +('10', '11', '20', '2742', '5266', '0'), +('10', '11', '20', '2288', '4478', '0'), +('10', '11', '12', '2923', '4324', '0'), +('10', '11', '12', '20655', '3907', '0'), +('10', '11', '12', '2291', '3830', '0'), +('10', '11', '12', '4835', '3199', '0'), +('10', '11', '18', '4410', '1642', '0'), +('10', '11', '18', '2461', '1474', '0'), +('10', '11', '18', '2292', '1373', '0'), +('10', '11', '18', '4876', '965', '0'), +('10', '11', '19', '2293', '3634', '0'), +('10', '11', '19', '68239', '3072', '0'), +('10', '11', '19', '1368', '2016', '0'), +('10', '11', '19', '4837', '1688', '0'), +('10', '11', '13', '27729', '9862', '0'), +('10', '11', '13', '11694', '9496', '0'), +('10', '11', '13', '10333', '6800', '0'), +('10', '11', '13', '10334', '3503', '0'), +('10', '11', '14', '10333', '6800', '0'), +('10', '11', '14', '12802', '5743', '0'), +('10', '11', '14', '1679', '3956', '0'), +('10', '11', '14', '11632', '3752', '0'), +('10', '11', '11', '14762', '3204', '0'), +('10', '11', '11', '7051', '2820', '0'), +('10', '11', '11', '9246', '1341', '0'), +('10', '11', '11', '20677', '1200', '0'), +('10', '12', '22', '9246', '0', '0'), +('10', '12', '22', '21518', '0', '0'), +('10', '12', '22', '10323', '0', '0'), +('10', '12', '22', '44492', '0', '0'), +('10', '12', '1', '14702', '5000', '0'), +('10', '12', '1', '14701', '4612', '0'), +('10', '12', '1', '30361', '2640', '0'), +('10', '12', '1', '10321', '1000', '0'), +('10', '12', '2', '10143', '7118', '0'), +('10', '12', '2', '30363', '3700', '0'), +('10', '12', '2', '3000', '2534', '0'), +('10', '12', '2', '2294', '2330', '0'), +('10', '12', '3', '11052', '2174', '0'), +('10', '12', '3', '2295', '1308', '0'), +('10', '12', '3', '4505', '1045', '0'), +('10', '12', '3', '14695', '1023', '0'), +('10', '12', '5', '14703', '8800', '0'), +('10', '12', '5', '14700', '4818', '0'), +('10', '12', '5', '10055', '4030', '0'), +('10', '12', '5', '30362', '3140', '0'), +('10', '12', '8', '11603', '9615', '0'), +('10', '12', '8', '1546', '9552', '0'), +('10', '12', '8', '2349', '3554', '0'), +('10', '12', '8', '11621', '3521', '0'), +('10', '12', '6', '1557', '5310', '0'), +('10', '12', '6', '1401', '2924', '0'), +('10', '12', '6', '27728', '2700', '0'), +('10', '12', '6', '2286', '2089', '0'), +('10', '12', '17', '2285', '9946', '0'), +('10', '12', '17', '4872', '4737', '0'), +('10', '12', '17', '4342', '1576', '0'), +('10', '12', '17', '2405', '850', '0'), +('10', '12', '7', '1362', '3124', '0'), +('10', '12', '7', '2289', '1910', '0'), +('10', '12', '7', '1321', '1746', '0'), +('10', '12', '7', '2458', '936', '0'), +('10', '12', '9', '27727', '5767', '0'), +('10', '12', '9', '14650', '2412', '0'), +('10', '12', '9', '4344', '2051', '0'), +('10', '12', '9', '10408', '2002', '0'), +('10', '12', '15', '10366', '4805', '0'), +('10', '12', '15', '10151', '4200', '0'), +('10', '12', '15', '10163', '3800', '0'), +('10', '12', '15', '14679', '3330', '0'), +('10', '12', '20', '11666', '12189', '0'), +('10', '12', '20', '27727', '5767', '0'), +('10', '12', '20', '2742', '5284', '0'), +('10', '12', '20', '2288', '4478', '0'), +('10', '12', '12', '2923', '4324', '0'), +('10', '12', '12', '20655', '3935', '0'), +('10', '12', '12', '2291', '3830', '0'), +('10', '12', '12', '4835', '3208', '0'), +('10', '12', '18', '4410', '1642', '0'), +('10', '12', '18', '2461', '1522', '0'), +('10', '12', '18', '2292', '1421', '0'), +('10', '12', '18', '4876', '1025', '0'), +('10', '12', '19', '2293', '3670', '0'), +('10', '12', '19', '68239', '3108', '0'), +('10', '12', '19', '1368', '2016', '0'), +('10', '12', '19', '4837', '1749', '0'), +('10', '12', '13', '27729', '10031', '0'), +('10', '12', '13', '11694', '9677', '0'), +('10', '12', '13', '10333', '6800', '0'), +('10', '12', '13', '10334', '3503', '0'), +('10', '12', '14', '10333', '6800', '0'), +('10', '12', '14', '12802', '5803', '0'), +('10', '12', '14', '1679', '4017', '0'), +('10', '12', '14', '11632', '3779', '0'), +('10', '12', '11', '14762', '3204', '0'), +('10', '12', '11', '7051', '2881', '0'), +('10', '12', '11', '9246', '1462', '0'), +('10', '12', '11', '20677', '1200', '0'), +('10', '13', '22', '9246', '0', '0'), +('10', '13', '22', '21518', '0', '0'), +('10', '13', '22', '10323', '0', '0'), +('10', '13', '22', '44492', '0', '0'), +('10', '13', '1', '14702', '5000', '0'), +('10', '13', '1', '14701', '4612', '0'), +('10', '13', '1', '30361', '2640', '0'), +('10', '13', '1', '10321', '1000', '0'), +('10', '13', '2', '10143', '7118', '0'), +('10', '13', '2', '30363', '3700', '0'), +('10', '13', '2', '3000', '2534', '0'), +('10', '13', '2', '2294', '2354', '0'), +('10', '13', '3', '11052', '2356', '0'), +('10', '13', '3', '2295', '1332', '0'), +('10', '13', '3', '4505', '1129', '0'), +('10', '13', '3', '14695', '1108', '0'), +('10', '13', '5', '14703', '8800', '0'), +('10', '13', '5', '14700', '4818', '0'), +('10', '13', '5', '10055', '4030', '0'), +('10', '13', '5', '30362', '3140', '0'), +('10', '13', '8', '11603', '9724', '0'), +('10', '13', '8', '1546', '9673', '0'), +('10', '13', '8', '2349', '3554', '0'), +('10', '13', '8', '11621', '3521', '0'), +('10', '13', '6', '1557', '5310', '0'), +('10', '13', '6', '1401', '2924', '0'), +('10', '13', '6', '27728', '2845', '0'), +('10', '13', '6', '2286', '2098', '0'), +('10', '13', '17', '2285', '9995', '0'), +('10', '13', '17', '4872', '4911', '0'), +('10', '13', '17', '4342', '1697', '0'), +('10', '13', '17', '2405', '916', '0'), +('10', '13', '7', '1362', '3124', '0'), +('10', '13', '7', '2289', '1958', '0'), +('10', '13', '7', '1321', '1746', '0'), +('10', '13', '7', '2458', '936', '0'), +('10', '13', '9', '27727', '5827', '0'), +('10', '13', '9', '14650', '2412', '0'), +('10', '13', '9', '4344', '2051', '0'), +('10', '13', '9', '10408', '2002', '0'), +('10', '13', '15', '10366', '4805', '0'), +('10', '13', '15', '10151', '4200', '0'), +('10', '13', '15', '10163', '3800', '0'), +('10', '13', '15', '14679', '3330', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '13', '20', '11666', '12202', '0'), +('10', '13', '20', '27727', '5827', '0'), +('10', '13', '20', '2742', '5302', '0'), +('10', '13', '20', '2288', '4478', '0'), +('10', '13', '12', '2923', '4324', '0'), +('10', '13', '12', '20655', '3963', '0'), +('10', '13', '12', '2291', '3830', '0'), +('10', '13', '12', '4835', '3217', '0'), +('10', '13', '18', '4410', '1642', '0'), +('10', '13', '18', '2461', '1570', '0'), +('10', '13', '18', '2292', '1469', '0'), +('10', '13', '18', '4876', '1086', '0'), +('10', '13', '19', '2293', '3706', '0'), +('10', '13', '19', '68239', '3145', '0'), +('10', '13', '19', '1368', '2016', '0'), +('10', '13', '19', '4837', '1809', '0'), +('10', '13', '13', '27729', '10201', '0'), +('10', '13', '13', '11694', '9858', '0'), +('10', '13', '13', '10333', '6800', '0'), +('10', '13', '13', '10334', '3503', '0'), +('10', '13', '14', '10333', '6800', '0'), +('10', '13', '14', '12802', '5864', '0'), +('10', '13', '14', '1679', '4077', '0'), +('10', '13', '14', '11632', '3806', '0'), +('10', '13', '11', '14762', '3204', '0'), +('10', '13', '11', '7051', '2941', '0'), +('10', '13', '11', '9246', '1582', '0'), +('10', '13', '11', '20677', '1200', '0'), +('10', '14', '22', '9246', '0', '0'), +('10', '14', '22', '21518', '0', '0'), +('10', '14', '22', '10323', '0', '0'), +('10', '14', '22', '44492', '0', '0'), +('10', '14', '1', '14702', '5000', '0'), +('10', '14', '1', '14701', '4612', '0'), +('10', '14', '1', '30361', '2640', '0'), +('10', '14', '1', '10321', '1000', '0'), +('10', '14', '2', '10143', '7118', '0'), +('10', '14', '2', '30363', '3700', '0'), +('10', '14', '2', '3000', '2534', '0'), +('10', '14', '2', '2294', '2378', '0'), +('10', '14', '3', '11052', '2537', '0'), +('10', '14', '3', '2295', '1356', '0'), +('10', '14', '3', '4505', '1214', '0'), +('10', '14', '3', '14695', '1192', '0'), +('10', '14', '5', '14703', '8800', '0'), +('10', '14', '5', '14700', '4818', '0'), +('10', '14', '5', '10055', '4030', '0'), +('10', '14', '5', '30362', '3140', '0'), +('10', '14', '8', '11603', '9832', '0'), +('10', '14', '8', '1546', '9794', '0'), +('10', '14', '8', '2349', '3554', '0'), +('10', '14', '8', '11621', '3521', '0'), +('10', '14', '6', '1557', '5310', '0'), +('10', '14', '6', '27728', '2990', '0'), +('10', '14', '6', '1401', '2924', '0'), +('10', '14', '6', '2286', '2107', '0'), +('10', '14', '17', '2285', '10043', '0'), +('10', '14', '17', '4872', '5084', '0'), +('10', '14', '17', '4342', '1818', '0'), +('10', '14', '17', '2405', '982', '0'), +('10', '14', '7', '1362', '3124', '0'), +('10', '14', '7', '2289', '2007', '0'), +('10', '14', '7', '1321', '1746', '0'), +('10', '14', '7', '2458', '936', '0'), +('10', '14', '9', '27727', '5888', '0'), +('10', '14', '9', '14650', '2412', '0'), +('10', '14', '9', '4344', '2051', '0'), +('10', '14', '9', '10408', '2002', '0'), +('10', '14', '15', '10366', '4805', '0'), +('10', '14', '15', '10151', '4200', '0'), +('10', '14', '15', '10163', '3800', '0'), +('10', '14', '15', '14679', '3330', '0'), +('10', '14', '20', '11666', '12214', '0'), +('10', '14', '20', '27727', '5888', '0'), +('10', '14', '20', '2742', '5320', '0'), +('10', '14', '20', '2288', '4478', '0'), +('10', '14', '12', '2923', '4324', '0'), +('10', '14', '12', '20655', '3990', '0'), +('10', '14', '12', '2291', '3830', '0'), +('10', '14', '12', '4835', '3227', '0'), +('10', '14', '18', '4410', '1642', '0'), +('10', '14', '18', '2461', '1619', '0'), +('10', '14', '18', '2292', '1518', '0'), +('10', '14', '18', '4876', '1146', '0'), +('10', '14', '19', '2293', '3742', '0'), +('10', '14', '19', '68239', '3181', '0'), +('10', '14', '19', '1368', '2016', '0'), +('10', '14', '19', '4837', '1869', '0'), +('10', '14', '13', '27729', '10370', '0'), +('10', '14', '13', '11694', '10039', '0'), +('10', '14', '13', '10333', '6800', '0'), +('10', '14', '13', '10334', '3503', '0'), +('10', '14', '14', '10333', '6800', '0'), +('10', '14', '14', '12802', '5924', '0'), +('10', '14', '14', '1679', '4137', '0'), +('10', '14', '14', '11632', '3834', '0'), +('10', '14', '11', '14762', '3204', '0'), +('10', '14', '11', '7051', '3002', '0'), +('10', '14', '11', '9246', '1703', '0'), +('10', '14', '11', '20677', '1200', '0'), +('10', '15', '22', '9246', '0', '0'), +('10', '15', '22', '21518', '0', '0'), +('10', '15', '22', '10323', '0', '0'), +('10', '15', '22', '44492', '0', '0'), +('10', '15', '1', '14702', '5000', '0'), +('10', '15', '1', '14701', '4612', '0'), +('10', '15', '1', '30361', '2640', '0'), +('10', '15', '1', '10321', '1000', '0'), +('10', '15', '2', '10143', '7118', '0'), +('10', '15', '2', '30363', '3700', '0'), +('10', '15', '2', '3000', '2534', '0'), +('10', '15', '2', '2294', '2402', '0'), +('10', '15', '3', '11052', '2718', '0'), +('10', '15', '3', '2295', '1381', '0'), +('10', '15', '3', '4505', '1299', '0'), +('10', '15', '3', '14695', '1277', '0'), +('10', '15', '5', '14703', '8800', '0'), +('10', '15', '5', '14700', '4818', '0'), +('10', '15', '5', '10055', '4030', '0'), +('10', '15', '5', '30362', '3140', '0'), +('10', '15', '8', '11603', '9941', '0'), +('10', '15', '8', '1546', '9915', '0'), +('10', '15', '8', '2349', '3554', '0'), +('10', '15', '8', '11621', '3521', '0'), +('10', '15', '6', '1557', '5310', '0'), +('10', '15', '6', '27728', '3135', '0'), +('10', '15', '6', '1401', '2924', '0'), +('10', '15', '6', '2286', '2116', '0'), +('10', '15', '17', '2285', '10091', '0'), +('10', '15', '17', '4872', '5257', '0'), +('10', '15', '17', '4342', '1939', '0'), +('10', '15', '17', '2405', '1048', '0'), +('10', '15', '7', '1362', '3124', '0'), +('10', '15', '7', '2289', '2055', '0'), +('10', '15', '7', '1321', '1746', '0'), +('10', '15', '7', '2458', '936', '0'), +('10', '15', '9', '27727', '5948', '0'), +('10', '15', '9', '14650', '2412', '0'), +('10', '15', '9', '4344', '2051', '0'), +('10', '15', '9', '10408', '2002', '0'), +('10', '15', '15', '10366', '4805', '0'), +('10', '15', '15', '10151', '4200', '0'), +('10', '15', '15', '10163', '3800', '0'), +('10', '15', '15', '14679', '3330', '0'), +('10', '15', '20', '11666', '12227', '0'), +('10', '15', '20', '27727', '5948', '0'), +('10', '15', '20', '2742', '5338', '0'), +('10', '15', '20', '2288', '4478', '0'), +('10', '15', '12', '2923', '4324', '0'), +('10', '15', '12', '20655', '4018', '0'), +('10', '15', '12', '2291', '3830', '0'), +('10', '15', '12', '4835', '3236', '0'), +('10', '15', '18', '2461', '1667', '0'), +('10', '15', '18', '4410', '1642', '0'), +('10', '15', '18', '2292', '1566', '0'), +('10', '15', '18', '4876', '1207', '0'), +('10', '15', '19', '2293', '3779', '0'), +('10', '15', '19', '68239', '3217', '0'), +('10', '15', '19', '1368', '2016', '0'), +('10', '15', '19', '4837', '1930', '0'), +('10', '15', '13', '27729', '10539', '0'), +('10', '15', '13', '11694', '10220', '0'), +('10', '15', '13', '10333', '6800', '0'), +('10', '15', '13', '10334', '3503', '0'), +('10', '15', '14', '10333', '6800', '0'), +('10', '15', '14', '12802', '5985', '0'), +('10', '15', '14', '1679', '4198', '0'), +('10', '15', '14', '11632', '3861', '0'), +('10', '15', '11', '14762', '3204', '0'), +('10', '15', '11', '7051', '3062', '0'), +('10', '15', '11', '9246', '1824', '0'), +('10', '15', '11', '20677', '1200', '0'), +('10', '16', '22', '9246', '0', '0'), +('10', '16', '22', '21518', '0', '0'), +('10', '16', '22', '10323', '0', '0'), +('10', '16', '22', '44492', '0', '0'), +('10', '16', '1', '14702', '5000', '0'), +('10', '16', '1', '14701', '4612', '0'), +('10', '16', '1', '30361', '2640', '0'), +('10', '16', '1', '10321', '1000', '0'), +('10', '16', '2', '10143', '7118', '0'), +('10', '16', '2', '30363', '3700', '0'), +('10', '16', '2', '3000', '2534', '0'), +('10', '16', '2', '2294', '2426', '0'), +('10', '16', '3', '11052', '2899', '0'), +('10', '16', '3', '2295', '1405', '0'), +('10', '16', '3', '4505', '1383', '0'), +('10', '16', '3', '14695', '1361', '0'), +('10', '16', '5', '14703', '8800', '0'), +('10', '16', '5', '14700', '4818', '0'), +('10', '16', '5', '10055', '4030', '0'), +('10', '16', '5', '30362', '3140', '0'), +('10', '16', '8', '11603', '10050', '0'), +('10', '16', '8', '1546', '10035', '0'), +('10', '16', '8', '2349', '3554', '0'), +('10', '16', '8', '11621', '3521', '0'), +('10', '16', '6', '1557', '5310', '0'), +('10', '16', '6', '27728', '3280', '0'), +('10', '16', '6', '1401', '2924', '0'), +('10', '16', '6', '2286', '2125', '0'), +('10', '16', '17', '2285', '10140', '0'), +('10', '16', '17', '4872', '5431', '0'), +('10', '16', '17', '4342', '2060', '0'), +('10', '16', '17', '2405', '1114', '0'), +('10', '16', '7', '1362', '3124', '0'), +('10', '16', '7', '2289', '2103', '0'), +('10', '16', '7', '1321', '1746', '0'), +('10', '16', '7', '2458', '936', '0'), +('10', '16', '9', '27727', '6009', '0'), +('10', '16', '9', '14650', '2412', '0'), +('10', '16', '9', '4344', '2051', '0'), +('10', '16', '9', '10408', '2002', '0'), +('10', '16', '15', '10366', '4805', '0'), +('10', '16', '15', '10151', '4200', '0'), +('10', '16', '15', '10163', '3800', '0'), +('10', '16', '15', '14679', '3330', '0'), +('10', '16', '20', '11666', '12240', '0'), +('10', '16', '20', '27727', '6009', '0'), +('10', '16', '20', '2742', '5356', '0'), +('10', '16', '20', '2288', '4478', '0'), +('10', '16', '12', '2923', '4324', '0'), +('10', '16', '12', '20655', '4046', '0'), +('10', '16', '12', '2291', '3830', '0'), +('10', '16', '12', '4835', '3245', '0'), +('10', '16', '18', '2461', '1715', '0'), +('10', '16', '18', '4410', '1642', '0'), +('10', '16', '18', '2292', '1614', '0'), +('10', '16', '18', '4876', '1267', '0'), +('10', '16', '19', '2293', '3815', '0'), +('10', '16', '19', '68239', '3253', '0'), +('10', '16', '19', '1368', '2016', '0'), +('10', '16', '19', '4837', '1990', '0'), +('10', '16', '13', '27729', '10708', '0'), +('10', '16', '13', '11694', '10402', '0'), +('10', '16', '13', '10333', '6800', '0'), +('10', '16', '13', '10334', '3503', '0'), +('10', '16', '14', '10333', '6800', '0'), +('10', '16', '14', '12802', '6045', '0'), +('10', '16', '14', '1679', '4258', '0'), +('10', '16', '14', '11632', '3888', '0'), +('10', '16', '11', '14762', '3204', '0'), +('10', '16', '11', '7051', '3122', '0'), +('10', '16', '11', '9246', '1945', '0'), +('10', '16', '11', '20677', '1200', '0'), +('10', '17', '22', '9246', '0', '0'), +('10', '17', '22', '21518', '0', '0'), +('10', '17', '22', '10323', '0', '0'), +('10', '17', '22', '44492', '0', '0'), +('10', '17', '1', '14702', '5000', '0'), +('10', '17', '1', '14701', '4612', '0'), +('10', '17', '1', '30361', '2640', '0'), +('10', '17', '1', '10321', '1000', '0'), +('10', '17', '2', '10143', '7118', '0'), +('10', '17', '2', '30363', '3700', '0'), +('10', '17', '2', '3000', '2534', '0'), +('10', '17', '2', '2294', '2451', '0'), +('10', '17', '3', '11052', '3080', '0'), +('10', '17', '3', '4505', '1468', '0'), +('10', '17', '3', '14695', '1446', '0'), +('10', '17', '3', '2295', '1429', '0'), +('10', '17', '5', '14703', '8800', '0'), +('10', '17', '5', '14700', '4818', '0'), +('10', '17', '5', '10055', '4030', '0'), +('10', '17', '5', '27726', '3141', '0'), +('10', '17', '8', '11603', '10159', '0'), +('10', '17', '8', '1546', '10156', '0'), +('10', '17', '8', '2349', '3554', '0'), +('10', '17', '8', '11621', '3521', '0'), +('10', '17', '6', '1557', '5310', '0'), +('10', '17', '6', '27728', '3425', '0'), +('10', '17', '6', '1401', '2924', '0'), +('10', '17', '6', '2286', '2134', '0'), +('10', '17', '17', '2285', '10188', '0'), +('10', '17', '17', '4872', '5604', '0'), +('10', '17', '17', '4342', '2180', '0'), +('10', '17', '17', '2405', '1180', '0'), +('10', '17', '7', '1362', '3124', '0'), +('10', '17', '7', '2289', '2152', '0'), +('10', '17', '7', '1321', '1746', '0'), +('10', '17', '7', '2458', '936', '0'), +('10', '17', '9', '27727', '6069', '0'), +('10', '17', '9', '14650', '2412', '0'), +('10', '17', '9', '4344', '2051', '0'), +('10', '17', '9', '10408', '2002', '0'), +('10', '17', '15', '10366', '4805', '0'), +('10', '17', '15', '10151', '4200', '0'), +('10', '17', '15', '10163', '3800', '0'), +('10', '17', '15', '14679', '3330', '0'), +('10', '17', '20', '11666', '12252', '0'), +('10', '17', '20', '27727', '6069', '0'), +('10', '17', '20', '2742', '5374', '0'), +('10', '17', '20', '2288', '4478', '0'), +('10', '17', '12', '2923', '4324', '0'), +('10', '17', '12', '20655', '4074', '0'), +('10', '17', '12', '2291', '3830', '0'), +('10', '17', '12', '4835', '3254', '0'), +('10', '17', '18', '2461', '1764', '0'), +('10', '17', '18', '2292', '1663', '0'), +('10', '17', '18', '4410', '1642', '0'), +('10', '17', '18', '4876', '1327', '0'), +('10', '17', '19', '2293', '3851', '0'), +('10', '17', '19', '68239', '3290', '0'), +('10', '17', '19', '4837', '2051', '0'), +('10', '17', '19', '1368', '2016', '0'), +('10', '17', '13', '27729', '10877', '0'), +('10', '17', '13', '11694', '10583', '0'), +('10', '17', '13', '10333', '6800', '0'), +('10', '17', '13', '10334', '3503', '0'), +('10', '17', '14', '10333', '6800', '0'), +('10', '17', '14', '12802', '6105', '0'), +('10', '17', '14', '1679', '4319', '0'), +('10', '17', '14', '11632', '3915', '0'), +('10', '17', '11', '14762', '3204', '0'), +('10', '17', '11', '7051', '3183', '0'), +('10', '17', '11', '9246', '2066', '0'), +('10', '17', '11', '20677', '1200', '0'), +('10', '18', '22', '9246', '0', '0'), +('10', '18', '22', '21518', '0', '0'), +('10', '18', '22', '10323', '0', '0'), +('10', '18', '22', '44492', '0', '0'), +('10', '18', '1', '14702', '5000', '0'), +('10', '18', '1', '14701', '4612', '0'), +('10', '18', '1', '30361', '2640', '0'), +('10', '18', '1', '10321', '1000', '0'), +('10', '18', '2', '10143', '7118', '0'), +('10', '18', '2', '30363', '3700', '0'), +('10', '18', '2', '3000', '2534', '0'), +('10', '18', '2', '2294', '2475', '0'), +('10', '18', '3', '11052', '3262', '0'), +('10', '18', '3', '4505', '1552', '0'), +('10', '18', '3', '14695', '1531', '0'), +('10', '18', '3', '2295', '1453', '0'), +('10', '18', '5', '14703', '8800', '0'), +('10', '18', '5', '14700', '4818', '0'), +('10', '18', '5', '10055', '4030', '0'), +('10', '18', '5', '27726', '3238', '0'), +('10', '18', '8', '1546', '10277', '0'), +('10', '18', '8', '11603', '10267', '0'), +('10', '18', '8', '2349', '3554', '0'), +('10', '18', '8', '11621', '3521', '0'), +('10', '18', '6', '1557', '5310', '0'), +('10', '18', '6', '27728', '3570', '0'), +('10', '18', '6', '1401', '2924', '0'), +('10', '18', '6', '2286', '2143', '0'), +('10', '18', '17', '2285', '10236', '0'), +('10', '18', '17', '4872', '5777', '0'), +('10', '18', '17', '4342', '2301', '0'), +('10', '18', '17', '2405', '1245', '0'), +('10', '18', '7', '1362', '3124', '0'), +('10', '18', '7', '2289', '2200', '0'), +('10', '18', '7', '1321', '1746', '0'), +('10', '18', '7', '2458', '936', '0'), +('10', '18', '9', '27727', '6129', '0'), +('10', '18', '9', '14650', '2412', '0'), +('10', '18', '9', '4344', '2051', '0'), +('10', '18', '9', '10408', '2002', '0'), +('10', '18', '15', '10366', '4805', '0'), +('10', '18', '15', '10151', '4200', '0'), +('10', '18', '15', '10163', '3800', '0'), +('10', '18', '15', '14679', '3330', '0'), +('10', '18', '20', '11666', '12265', '0'), +('10', '18', '20', '27727', '6129', '0'), +('10', '18', '20', '2742', '5393', '0'), +('10', '18', '20', '2288', '4478', '0'), +('10', '18', '12', '2923', '4324', '0'), +('10', '18', '12', '20655', '4102', '0'), +('10', '18', '12', '2291', '3830', '0'), +('10', '18', '12', '4835', '3263', '0'), +('10', '18', '18', '2461', '1812', '0'), +('10', '18', '18', '2292', '1711', '0'), +('10', '18', '18', '4410', '1642', '0'), +('10', '18', '18', '4876', '1388', '0'), +('10', '18', '19', '2293', '3887', '0'), +('10', '18', '19', '68239', '3326', '0'), +('10', '18', '19', '4837', '2111', '0'), +('10', '18', '19', '4407', '2017', '0'), +('10', '18', '13', '27729', '11046', '0'), +('10', '18', '13', '11694', '10764', '0'), +('10', '18', '13', '10333', '6800', '0'), +('10', '18', '13', '10334', '3503', '0'), +('10', '18', '14', '10333', '6800', '0'), +('10', '18', '14', '12802', '6166', '0'), +('10', '18', '14', '1679', '4379', '0'), +('10', '18', '14', '11632', '3942', '0'), +('10', '18', '11', '7051', '3243', '0'), +('10', '18', '11', '14762', '3204', '0'), +('10', '18', '11', '9246', '2186', '0'), +('10', '18', '11', '20677', '1200', '0'), +('10', '19', '22', '9246', '0', '0'), +('10', '19', '22', '21518', '0', '0'), +('10', '19', '22', '10323', '0', '0'), +('10', '19', '22', '44492', '0', '0'), +('10', '19', '1', '14702', '5000', '0'), +('10', '19', '1', '14701', '4612', '0'), +('10', '19', '1', '30361', '2640', '0'), +('10', '19', '1', '10321', '1000', '0'), +('10', '19', '2', '10143', '7118', '0'), +('10', '19', '2', '30363', '3700', '0'), +('10', '19', '2', '3000', '2534', '0'), +('10', '19', '2', '2294', '2499', '0'), +('10', '19', '3', '11052', '3443', '0'), +('10', '19', '3', '4505', '1637', '0'), +('10', '19', '3', '14695', '1615', '0'), +('10', '19', '3', '2295', '1477', '0'), +('10', '19', '5', '14703', '8800', '0'), +('10', '19', '5', '14700', '4818', '0'), +('10', '19', '5', '10055', '4030', '0'), +('10', '19', '5', '27726', '3334', '0'), +('10', '19', '8', '1546', '10398', '0'), +('10', '19', '8', '11603', '10376', '0'), +('10', '19', '8', '2349', '3554', '0'), +('10', '19', '8', '11621', '3521', '0'), +('10', '19', '6', '1557', '5310', '0'), +('10', '19', '6', '27728', '3715', '0'), +('10', '19', '6', '1401', '2924', '0'), +('10', '19', '6', '2286', '2152', '0'), +('10', '19', '17', '2285', '10285', '0'), +('10', '19', '17', '4872', '5951', '0'), +('10', '19', '17', '4342', '2422', '0'), +('10', '19', '17', '2405', '1311', '0'), +('10', '19', '7', '1362', '3124', '0'), +('10', '19', '7', '2289', '2248', '0'), +('10', '19', '7', '1321', '1746', '0'), +('10', '19', '7', '2458', '936', '0'), +('10', '19', '9', '27727', '6190', '0'), +('10', '19', '9', '14650', '2412', '0'), +('10', '19', '9', '4344', '2051', '0'), +('10', '19', '9', '10408', '2002', '0'), +('10', '19', '15', '10366', '4805', '0'), +('10', '19', '15', '10151', '4200', '0'), +('10', '19', '15', '10163', '3800', '0'), +('10', '19', '15', '14679', '3330', '0'), +('10', '19', '20', '11666', '12278', '0'), +('10', '19', '20', '27727', '6190', '0'), +('10', '19', '20', '2742', '5411', '0'), +('10', '19', '20', '2288', '4478', '0'), +('10', '19', '12', '2923', '4324', '0'), +('10', '19', '12', '20655', '4129', '0'), +('10', '19', '12', '2291', '3830', '0'), +('10', '19', '12', '4835', '3272', '0'), +('10', '19', '18', '2461', '1860', '0'), +('10', '19', '18', '2292', '1759', '0'), +('10', '19', '18', '4410', '1642', '0'), +('10', '19', '18', '4876', '1448', '0'), +('10', '19', '19', '2293', '3924', '0'), +('10', '19', '19', '68239', '3362', '0'), +('10', '19', '19', '4837', '2171', '0'), +('10', '19', '19', '4407', '2126', '0'), +('10', '19', '13', '27729', '11215', '0'), +('10', '19', '13', '11694', '10945', '0'), +('10', '19', '13', '10333', '6800', '0'), +('10', '19', '13', '10334', '3503', '0'), +('10', '19', '14', '10333', '6800', '0'), +('10', '19', '14', '12802', '6226', '0'), +('10', '19', '14', '1679', '4439', '0'), +('10', '19', '14', '10335', '4120', '0'), +('10', '19', '11', '7051', '3304', '0'), +('10', '19', '11', '14762', '3204', '0'), +('10', '19', '11', '9246', '2307', '0'), +('10', '19', '11', '20677', '1200', '0'), +('10', '20', '22', '9246', '0', '0'), +('10', '20', '22', '21518', '0', '0'), +('10', '20', '22', '10323', '0', '0'), +('10', '20', '22', '44492', '0', '0'), +('10', '20', '1', '14702', '5000', '0'), +('10', '20', '1', '14701', '4612', '0'), +('10', '20', '1', '30361', '2640', '0'), +('10', '20', '1', '10321', '1000', '0'), +('10', '20', '2', '10143', '7118', '0'), +('10', '20', '2', '30363', '3700', '0'), +('10', '20', '2', '3000', '2534', '0'), +('10', '20', '2', '2294', '2523', '0'), +('10', '20', '3', '11052', '3624', '0'), +('10', '20', '3', '4505', '1721', '0'), +('10', '20', '3', '14695', '1700', '0'), +('10', '20', '3', '2295', '1501', '0'), +('10', '20', '5', '14703', '8800', '0'), +('10', '20', '5', '14700', '4818', '0'), +('10', '20', '5', '10055', '4030', '0'), +('10', '20', '5', '27726', '3431', '0'), +('10', '20', '8', '1546', '10519', '0'), +('10', '20', '8', '11603', '10485', '0'), +('10', '20', '8', '2349', '3554', '0'), +('10', '20', '8', '11621', '3521', '0'), +('10', '20', '6', '1557', '5310', '0'), +('10', '20', '6', '27728', '3860', '0'), +('10', '20', '6', '1401', '2924', '0'), +('10', '20', '6', '2286', '2161', '0'), +('10', '20', '17', '2285', '10333', '0'), +('10', '20', '17', '4872', '6124', '0'), +('10', '20', '17', '4342', '2543', '0'), +('10', '20', '17', '2405', '1377', '0'), +('10', '20', '7', '1362', '3124', '0'), +('10', '20', '7', '2289', '2297', '0'), +('10', '20', '7', '1321', '1746', '0'), +('10', '20', '7', '71303', '950', '0'), +('10', '20', '9', '27727', '6250', '0'), +('10', '20', '9', '14650', '2412', '0'), +('10', '20', '9', '4344', '2051', '0'), +('10', '20', '9', '10408', '2002', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '20', '15', '10366', '4805', '0'), +('10', '20', '15', '10151', '4200', '0'), +('10', '20', '15', '10163', '3800', '0'), +('10', '20', '15', '14679', '3330', '0'), +('10', '20', '20', '11666', '12291', '0'), +('10', '20', '20', '27727', '6250', '0'), +('10', '20', '20', '2742', '5429', '0'), +('10', '20', '20', '2288', '4478', '0'), +('10', '20', '12', '2923', '4324', '0'), +('10', '20', '12', '20655', '4157', '0'), +('10', '20', '12', '2291', '3830', '0'), +('10', '20', '12', '4835', '3281', '0'), +('10', '20', '18', '2461', '1909', '0'), +('10', '20', '18', '2292', '1807', '0'), +('10', '20', '18', '4410', '1642', '0'), +('10', '20', '18', '4876', '1509', '0'), +('10', '20', '19', '2293', '3960', '0'), +('10', '20', '19', '68239', '3398', '0'), +('10', '20', '19', '4407', '2235', '0'), +('10', '20', '19', '4837', '2232', '0'), +('10', '20', '13', '27729', '11384', '0'), +('10', '20', '13', '11694', '11126', '0'), +('10', '20', '13', '10333', '6800', '0'), +('10', '20', '13', '10334', '3503', '0'), +('10', '20', '14', '10333', '6800', '0'), +('10', '20', '14', '12802', '6287', '0'), +('10', '20', '14', '1679', '4500', '0'), +('10', '20', '14', '10335', '4338', '0'), +('10', '20', '11', '7051', '3364', '0'), +('10', '20', '11', '14762', '3204', '0'), +('10', '20', '11', '9246', '2428', '0'), +('10', '20', '11', '20677', '1200', '0'), +('10', '21', '22', '9246', '0', '0'), +('10', '21', '22', '21518', '0', '0'), +('10', '21', '22', '10323', '0', '0'), +('10', '21', '22', '44492', '0', '0'), +('10', '21', '1', '14702', '5000', '0'), +('10', '21', '1', '14701', '4612', '0'), +('10', '21', '1', '30361', '2640', '0'), +('10', '21', '1', '10321', '1000', '0'), +('10', '21', '2', '10143', '7118', '0'), +('10', '21', '2', '30363', '3700', '0'), +('10', '21', '2', '2294', '2547', '0'), +('10', '21', '2', '3000', '2534', '0'), +('10', '21', '3', '11052', '3805', '0'), +('10', '21', '3', '4505', '1806', '0'), +('10', '21', '3', '14695', '1784', '0'), +('10', '21', '3', '2295', '1525', '0'), +('10', '21', '5', '14703', '8800', '0'), +('10', '21', '5', '14700', '4818', '0'), +('10', '21', '5', '10055', '4030', '0'), +('10', '21', '5', '27726', '3528', '0'), +('10', '21', '8', '1546', '10639', '0'), +('10', '21', '8', '11603', '10594', '0'), +('10', '21', '8', '2349', '3554', '0'), +('10', '21', '8', '11621', '3521', '0'), +('10', '21', '6', '1557', '5310', '0'), +('10', '21', '6', '27728', '4005', '0'), +('10', '21', '6', '1401', '2924', '0'), +('10', '21', '6', '2286', '2170', '0'), +('10', '21', '17', '2285', '10381', '0'), +('10', '21', '17', '4872', '6297', '0'), +('10', '21', '17', '4342', '2664', '0'), +('10', '21', '17', '2405', '1443', '0'), +('10', '21', '7', '1362', '3124', '0'), +('10', '21', '7', '2289', '2345', '0'), +('10', '21', '7', '1321', '1746', '0'), +('10', '21', '7', '71303', '986', '0'), +('10', '21', '9', '27727', '6311', '0'), +('10', '21', '9', '14650', '2412', '0'), +('10', '21', '9', '4344', '2051', '0'), +('10', '21', '9', '10408', '2002', '0'), +('10', '21', '15', '10366', '4805', '0'), +('10', '21', '15', '10151', '4200', '0'), +('10', '21', '15', '10163', '3800', '0'), +('10', '21', '15', '14679', '3330', '0'), +('10', '21', '20', '11666', '12303', '0'), +('10', '21', '20', '27727', '6311', '0'), +('10', '21', '20', '2742', '5447', '0'), +('10', '21', '20', '2288', '4478', '0'), +('10', '21', '12', '2923', '4324', '0'), +('10', '21', '12', '20655', '4185', '0'), +('10', '21', '12', '2291', '3830', '0'), +('10', '21', '12', '4835', '3290', '0'), +('10', '21', '18', '2461', '1957', '0'), +('10', '21', '18', '2292', '1856', '0'), +('10', '21', '18', '4410', '1642', '0'), +('10', '21', '18', '4876', '1569', '0'), +('10', '21', '19', '2293', '3996', '0'), +('10', '21', '19', '68239', '3434', '0'), +('10', '21', '19', '4407', '2343', '0'), +('10', '21', '19', '4837', '2292', '0'), +('10', '21', '13', '27729', '11553', '0'), +('10', '21', '13', '11694', '11308', '0'), +('10', '21', '13', '10333', '6800', '0'), +('10', '21', '13', '10334', '3503', '0'), +('10', '21', '14', '10333', '6800', '0'), +('10', '21', '14', '12802', '6347', '0'), +('10', '21', '14', '1679', '4560', '0'), +('10', '21', '14', '10335', '4555', '0'), +('10', '21', '11', '7051', '3424', '0'), +('10', '21', '11', '14762', '3204', '0'), +('10', '21', '11', '9246', '2549', '0'), +('10', '21', '11', '20677', '1200', '0'), +('10', '22', '22', '9246', '0', '0'), +('10', '22', '22', '21518', '0', '0'), +('10', '22', '22', '10323', '0', '0'), +('10', '22', '22', '44492', '0', '0'), +('10', '22', '1', '14702', '5000', '0'), +('10', '22', '1', '14701', '4612', '0'), +('10', '22', '1', '30361', '2640', '0'), +('10', '22', '1', '10321', '1000', '0'), +('10', '22', '2', '10143', '7118', '0'), +('10', '22', '2', '30363', '3700', '0'), +('10', '22', '2', '2294', '2571', '0'), +('10', '22', '2', '3000', '2534', '0'), +('10', '22', '3', '11052', '3986', '0'), +('10', '22', '3', '4505', '1891', '0'), +('10', '22', '3', '14695', '1869', '0'), +('10', '22', '3', '2295', '1550', '0'), +('10', '22', '5', '14703', '8800', '0'), +('10', '22', '5', '14700', '4818', '0'), +('10', '22', '5', '10055', '4030', '0'), +('10', '22', '5', '27726', '3624', '0'), +('10', '22', '8', '1546', '10760', '0'), +('10', '22', '8', '11603', '10702', '0'), +('10', '22', '8', '2349', '3554', '0'), +('10', '22', '8', '11621', '3521', '0'), +('10', '22', '6', '1557', '5310', '0'), +('10', '22', '6', '27728', '4150', '0'), +('10', '22', '6', '1401', '2924', '0'), +('10', '22', '6', '2286', '2180', '0'), +('10', '22', '17', '2285', '10429', '0'), +('10', '22', '17', '4872', '6471', '0'), +('10', '22', '17', '4342', '2784', '0'), +('10', '22', '17', '2405', '1509', '0'), +('10', '22', '7', '1362', '3124', '0'), +('10', '22', '7', '2289', '2393', '0'), +('10', '22', '7', '1321', '1746', '0'), +('10', '22', '7', '71303', '1022', '0'), +('10', '22', '9', '27727', '6371', '0'), +('10', '22', '9', '14650', '2412', '0'), +('10', '22', '9', '4344', '2051', '0'), +('10', '22', '9', '10408', '2002', '0'), +('10', '22', '15', '10366', '4805', '0'), +('10', '22', '15', '10151', '4200', '0'), +('10', '22', '15', '10163', '3800', '0'), +('10', '22', '15', '14679', '3330', '0'), +('10', '22', '20', '11666', '12316', '0'), +('10', '22', '20', '27727', '6371', '0'), +('10', '22', '20', '2742', '5465', '0'), +('10', '22', '20', '2288', '4478', '0'), +('10', '22', '12', '2923', '4324', '0'), +('10', '22', '12', '20655', '4213', '0'), +('10', '22', '12', '2291', '3830', '0'), +('10', '22', '12', '4835', '3299', '0'), +('10', '22', '18', '2461', '2005', '0'), +('10', '22', '18', '2292', '1904', '0'), +('10', '22', '18', '4410', '1642', '0'), +('10', '22', '18', '4876', '1629', '0'), +('10', '22', '19', '2293', '4032', '0'), +('10', '22', '19', '68239', '3471', '0'), +('10', '22', '19', '4407', '2452', '0'), +('10', '22', '19', '4837', '2353', '0'), +('10', '22', '13', '27729', '11723', '0'), +('10', '22', '13', '11694', '11489', '0'), +('10', '22', '13', '10333', '6800', '0'), +('10', '22', '13', '10334', '3503', '0'), +('10', '22', '14', '10333', '6800', '0'), +('10', '22', '14', '12802', '6407', '0'), +('10', '22', '14', '10335', '4773', '0'), +('10', '22', '14', '1679', '4621', '0'), +('10', '22', '11', '7051', '3485', '0'), +('10', '22', '11', '14762', '3204', '0'), +('10', '22', '11', '9246', '2670', '0'), +('10', '22', '11', '20677', '1200', '0'), +('10', '23', '22', '9246', '0', '0'), +('10', '23', '22', '21518', '0', '0'), +('10', '23', '22', '10323', '0', '0'), +('10', '23', '22', '44492', '0', '0'), +('10', '23', '1', '14702', '5000', '0'), +('10', '23', '1', '14701', '4612', '0'), +('10', '23', '1', '30361', '2640', '0'), +('10', '23', '1', '10321', '1000', '0'), +('10', '23', '2', '10143', '7118', '0'), +('10', '23', '2', '30363', '3700', '0'), +('10', '23', '2', '2294', '2596', '0'), +('10', '23', '2', '3000', '2534', '0'), +('10', '23', '3', '11052', '4168', '0'), +('10', '23', '3', '4505', '1975', '0'), +('10', '23', '3', '14695', '1953', '0'), +('10', '23', '3', '2295', '1574', '0'), +('10', '23', '5', '14703', '8800', '0'), +('10', '23', '5', '14700', '4818', '0'), +('10', '23', '5', '10055', '4030', '0'), +('10', '23', '5', '27726', '3721', '0'), +('10', '23', '8', '1546', '10881', '0'), +('10', '23', '8', '11603', '10811', '0'), +('10', '23', '8', '2349', '3554', '0'), +('10', '23', '8', '11621', '3521', '0'), +('10', '23', '6', '1557', '5310', '0'), +('10', '23', '6', '27728', '4294', '0'), +('10', '23', '6', '1401', '2924', '0'), +('10', '23', '6', '1904', '2253', '0'), +('10', '23', '17', '2285', '10478', '0'), +('10', '23', '17', '4872', '6644', '0'), +('10', '23', '17', '4342', '2905', '0'), +('10', '23', '17', '2405', '1575', '0'), +('10', '23', '7', '1362', '3124', '0'), +('10', '23', '7', '2289', '2442', '0'), +('10', '23', '7', '1321', '1746', '0'), +('10', '23', '7', '71303', '1059', '0'), +('10', '23', '9', '27727', '6431', '0'), +('10', '23', '9', '14650', '2412', '0'), +('10', '23', '9', '4344', '2051', '0'), +('10', '23', '9', '10408', '2002', '0'), +('10', '23', '15', '10366', '4805', '0'), +('10', '23', '15', '10151', '4200', '0'), +('10', '23', '15', '10163', '3800', '0'), +('10', '23', '15', '14679', '3330', '0'), +('10', '23', '20', '11666', '12329', '0'), +('10', '23', '20', '27727', '6431', '0'), +('10', '23', '20', '2742', '5483', '0'), +('10', '23', '20', '2288', '4478', '0'), +('10', '23', '12', '2923', '4324', '0'), +('10', '23', '12', '20655', '4241', '0'), +('10', '23', '12', '2291', '3830', '0'), +('10', '23', '12', '4835', '3308', '0'), +('10', '23', '18', '2461', '2054', '0'), +('10', '23', '18', '2292', '1952', '0'), +('10', '23', '18', '4876', '1690', '0'), +('10', '23', '18', '4410', '1642', '0'), +('10', '23', '19', '2293', '4069', '0'), +('10', '23', '19', '68239', '3507', '0'), +('10', '23', '19', '4407', '2561', '0'), +('10', '23', '19', '4837', '2413', '0'), +('10', '23', '13', '27729', '11892', '0'), +('10', '23', '13', '11694', '11670', '0'), +('10', '23', '13', '10333', '6800', '0'), +('10', '23', '13', '7051', '3547', '0'), +('10', '23', '14', '10333', '6800', '0'), +('10', '23', '14', '12802', '6468', '0'), +('10', '23', '14', '10335', '4990', '0'), +('10', '23', '14', '1679', '4681', '0'), +('10', '23', '11', '7051', '3545', '0'), +('10', '23', '11', '14762', '3204', '0'), +('10', '23', '11', '9246', '2790', '0'), +('10', '23', '11', '20677', '1200', '0'), +('10', '24', '22', '9246', '0', '0'), +('10', '24', '22', '21518', '0', '0'), +('10', '24', '22', '10323', '0', '0'), +('10', '24', '22', '44492', '0', '0'), +('10', '24', '1', '14702', '5000', '0'), +('10', '24', '1', '14701', '4612', '0'), +('10', '24', '1', '30361', '2640', '0'), +('10', '24', '1', '10321', '1000', '0'), +('10', '24', '2', '10143', '7118', '0'), +('10', '24', '2', '30363', '3700', '0'), +('10', '24', '2', '2294', '2620', '0'), +('10', '24', '2', '3000', '2534', '0'), +('10', '24', '3', '11052', '4349', '0'), +('10', '24', '3', '4505', '2060', '0'), +('10', '24', '3', '14695', '2038', '0'), +('10', '24', '3', '2295', '1598', '0'), +('10', '24', '5', '14703', '8800', '0'), +('10', '24', '5', '14700', '4818', '0'), +('10', '24', '5', '10055', '4030', '0'), +('10', '24', '5', '27726', '3818', '0'), +('10', '24', '8', '1546', '11002', '0'), +('10', '24', '8', '11603', '10920', '0'), +('10', '24', '8', '2349', '3554', '0'), +('10', '24', '8', '11621', '3521', '0'), +('10', '24', '6', '1557', '5310', '0'), +('10', '24', '6', '27728', '4439', '0'), +('10', '24', '6', '1401', '2924', '0'), +('10', '24', '6', '1904', '2350', '0'), +('10', '24', '17', '2285', '10526', '0'), +('10', '24', '17', '4872', '6817', '0'), +('10', '24', '17', '4342', '3026', '0'), +('10', '24', '17', '2405', '1640', '0'), +('10', '24', '7', '1362', '3124', '0'), +('10', '24', '7', '2289', '2490', '0'), +('10', '24', '7', '1321', '1746', '0'), +('10', '24', '7', '71303', '1095', '0'), +('10', '24', '9', '27727', '6492', '0'), +('10', '24', '9', '14650', '2412', '0'), +('10', '24', '9', '2290', '2058', '0'), +('10', '24', '9', '4344', '2051', '0'), +('10', '24', '15', '10366', '4805', '0'), +('10', '24', '15', '10151', '4200', '0'), +('10', '24', '15', '10163', '3800', '0'), +('10', '24', '15', '14679', '3330', '0'), +('10', '24', '20', '11666', '12341', '0'), +('10', '24', '20', '27727', '6492', '0'), +('10', '24', '20', '2742', '5501', '0'), +('10', '24', '20', '2288', '4478', '0'), +('10', '24', '12', '2923', '4324', '0'), +('10', '24', '12', '20655', '4268', '0'), +('10', '24', '12', '2291', '3830', '0'), +('10', '24', '12', '4835', '3317', '0'), +('10', '24', '18', '2461', '2102', '0'), +('10', '24', '18', '2292', '2001', '0'), +('10', '24', '18', '4876', '1750', '0'), +('10', '24', '18', '4410', '1642', '0'), +('10', '24', '19', '2293', '4105', '0'), +('10', '24', '19', '68239', '3543', '0'), +('10', '24', '19', '4407', '2669', '0'), +('10', '24', '19', '4837', '2473', '0'), +('10', '24', '13', '27729', '12061', '0'), +('10', '24', '13', '11694', '11851', '0'), +('10', '24', '13', '10333', '6800', '0'), +('10', '24', '13', '7051', '3607', '0'), +('10', '24', '14', '10333', '6800', '0'), +('10', '24', '14', '12802', '6528', '0'), +('10', '24', '14', '10335', '5208', '0'), +('10', '24', '14', '1679', '4741', '0'), +('10', '24', '11', '7051', '3606', '0'), +('10', '24', '11', '14762', '3204', '0'), +('10', '24', '11', '9246', '2911', '0'), +('10', '24', '11', '20677', '1200', '0'), +('10', '25', '22', '9246', '0', '0'), +('10', '25', '22', '21518', '0', '0'), +('10', '25', '22', '10323', '0', '0'), +('10', '25', '22', '44492', '0', '0'), +('10', '25', '1', '14702', '5000', '0'), +('10', '25', '1', '14701', '4612', '0'), +('10', '25', '1', '30361', '2640', '0'), +('10', '25', '1', '10321', '1000', '0'), +('10', '25', '2', '10143', '7118', '0'), +('10', '25', '2', '30363', '3700', '0'), +('10', '25', '2', '2294', '2644', '0'), +('10', '25', '2', '3000', '2534', '0'), +('10', '25', '3', '11052', '4530', '0'), +('10', '25', '3', '4505', '2144', '0'), +('10', '25', '3', '14695', '2122', '0'), +('10', '25', '3', '2295', '1622', '0'), +('10', '25', '5', '14703', '8800', '0'), +('10', '25', '5', '14700', '4818', '0'), +('10', '25', '5', '10055', '4030', '0'), +('10', '25', '5', '27726', '3914', '0'), +('10', '25', '8', '1546', '11123', '0'), +('10', '25', '8', '11603', '11028', '0'), +('10', '25', '8', '2349', '3554', '0'), +('10', '25', '8', '11621', '3521', '0'), +('10', '25', '6', '1557', '5310', '0'), +('10', '25', '6', '27728', '4584', '0'), +('10', '25', '6', '1401', '2924', '0'), +('10', '25', '6', '1904', '2446', '0'), +('10', '25', '17', '2285', '10574', '0'), +('10', '25', '17', '4872', '6991', '0'), +('10', '25', '17', '4342', '3147', '0'), +('10', '25', '17', '2405', '1706', '0'), +('10', '25', '7', '1362', '3124', '0'), +('10', '25', '7', '2289', '2538', '0'), +('10', '25', '7', '1321', '1746', '0'), +('10', '25', '7', '71303', '1131', '0'), +('10', '25', '9', '27727', '6552', '0'), +('10', '25', '9', '14650', '2412', '0'), +('10', '25', '9', '2290', '2122', '0'), +('10', '25', '9', '4344', '2051', '0'), +('10', '25', '15', '10366', '4805', '0'), +('10', '25', '15', '10151', '4200', '0'), +('10', '25', '15', '10163', '3800', '0'), +('10', '25', '15', '14679', '3330', '0'), +('10', '25', '20', '11666', '12354', '0'), +('10', '25', '20', '27727', '6552', '0'), +('10', '25', '20', '2742', '5519', '0'), +('10', '25', '20', '2288', '4478', '0'), +('10', '25', '12', '2923', '4324', '0'), +('10', '25', '12', '20655', '4296', '0'), +('10', '25', '12', '2291', '3830', '0'), +('10', '25', '12', '4835', '3326', '0'), +('10', '25', '18', '2461', '2150', '0'), +('10', '25', '18', '2292', '2049', '0'), +('10', '25', '18', '4876', '1811', '0'), +('10', '25', '18', '4410', '1642', '0'), +('10', '25', '19', '2293', '4141', '0'), +('10', '25', '19', '68239', '3579', '0'), +('10', '25', '19', '4407', '2778', '0'), +('10', '25', '19', '4837', '2534', '0'), +('10', '25', '13', '27729', '12230', '0'), +('10', '25', '13', '11694', '12032', '0'), +('10', '25', '13', '10333', '6800', '0'), +('10', '25', '13', '7051', '3668', '0'), +('10', '25', '14', '10333', '6800', '0'), +('10', '25', '14', '12802', '6589', '0'), +('10', '25', '14', '10335', '5425', '0'), +('10', '25', '14', '1679', '4802', '0'), +('10', '25', '11', '7051', '3666', '0'), +('10', '25', '11', '14762', '3204', '0'), +('10', '25', '11', '9246', '3032', '0'), +('10', '25', '11', '20677', '1200', '0'), +('10', '26', '22', '9246', '0', '0'), +('10', '26', '22', '21518', '0', '0'), +('10', '26', '22', '10323', '0', '0'), +('10', '26', '22', '44492', '0', '0'), +('10', '26', '1', '14702', '5000', '0'), +('10', '26', '1', '14701', '4612', '0'), +('10', '26', '1', '30361', '2640', '0'), +('10', '26', '1', '10321', '1000', '0'), +('10', '26', '2', '10143', '7118', '0'), +('10', '26', '2', '30363', '3700', '0'), +('10', '26', '2', '2294', '2668', '0'), +('10', '26', '2', '3000', '2534', '0'), +('10', '26', '3', '11052', '4711', '0'), +('10', '26', '3', '4505', '2229', '0'), +('10', '26', '3', '14695', '2207', '0'), +('10', '26', '3', '2295', '1646', '0'), +('10', '26', '5', '14703', '8800', '0'), +('10', '26', '5', '14700', '4818', '0'), +('10', '26', '5', '10055', '4030', '0'), +('10', '26', '5', '27726', '4011', '0'), +('10', '26', '8', '1546', '11243', '0'), +('10', '26', '8', '11603', '11137', '0'), +('10', '26', '8', '2349', '3554', '0'), +('10', '26', '8', '11621', '3521', '0'), +('10', '26', '6', '1557', '5310', '0'), +('10', '26', '6', '27728', '4729', '0'), +('10', '26', '6', '1401', '2924', '0'), +('10', '26', '6', '1904', '2543', '0'), +('10', '26', '17', '2285', '10623', '0'), +('10', '26', '17', '4872', '7164', '0'), +('10', '26', '17', '4342', '3268', '0'), +('10', '26', '17', '2405', '1772', '0'), +('10', '26', '7', '1362', '3124', '0'), +('10', '26', '7', '2289', '2587', '0'), +('10', '26', '7', '1321', '1746', '0'), +('10', '26', '7', '71303', '1167', '0'), +('10', '26', '9', '27727', '6613', '0'), +('10', '26', '9', '14650', '2412', '0'), +('10', '26', '9', '2290', '2186', '0'), +('10', '26', '9', '4344', '2051', '0'), +('10', '26', '15', '10366', '4805', '0'), +('10', '26', '15', '10151', '4200', '0'), +('10', '26', '15', '10163', '3800', '0'), +('10', '26', '15', '14679', '3330', '0'), +('10', '26', '20', '11666', '12367', '0'), +('10', '26', '20', '27727', '6613', '0'), +('10', '26', '20', '2742', '5538', '0'), +('10', '26', '20', '2288', '4478', '0'), +('10', '26', '12', '20655', '4324', '0'), +('10', '26', '12', '2923', '4324', '0'), +('10', '26', '12', '2291', '3830', '0'), +('10', '26', '12', '4835', '3335', '0'), +('10', '26', '18', '2461', '2199', '0'), +('10', '26', '18', '2292', '2097', '0'), +('10', '26', '18', '4876', '1871', '0'), +('10', '26', '18', '4410', '1642', '0'), +('10', '26', '19', '2293', '4177', '0'), +('10', '26', '19', '68239', '3616', '0'), +('10', '26', '19', '4407', '2887', '0'), +('10', '26', '19', '4837', '2594', '0'), +('10', '26', '13', '27729', '12399', '0'), +('10', '26', '13', '11694', '12214', '0'), +('10', '26', '13', '10333', '6800', '0'), +('10', '26', '13', '7051', '3728', '0'), +('10', '26', '14', '10333', '6800', '0'), +('10', '26', '14', '12802', '6649', '0'), +('10', '26', '14', '10335', '5643', '0'), +('10', '26', '14', '1679', '4862', '0'), +('10', '26', '11', '7051', '3726', '0'), +('10', '26', '11', '14762', '3204', '0'), +('10', '26', '11', '9246', '3153', '0'), +('10', '26', '11', '20677', '1200', '0'), +('10', '27', '22', '9246', '0', '0'), +('10', '27', '22', '21518', '0', '0'), +('10', '27', '22', '10323', '0', '0'), +('10', '27', '22', '44492', '0', '0'), +('10', '27', '1', '14702', '5000', '0'), +('10', '27', '1', '14701', '4612', '0'), +('10', '27', '1', '30361', '2640', '0'), +('10', '27', '1', '10321', '1000', '0'), +('10', '27', '2', '10143', '7118', '0'), +('10', '27', '2', '30363', '3700', '0'), +('10', '27', '2', '2294', '2692', '0'), +('10', '27', '2', '3000', '2534', '0'), +('10', '27', '3', '11052', '4892', '0'), +('10', '27', '3', '4505', '2313', '0'), +('10', '27', '3', '14695', '2292', '0'), +('10', '27', '3', '2295', '1670', '0'), +('10', '27', '5', '14703', '8800', '0'), +('10', '27', '5', '14700', '4818', '0'), +('10', '27', '5', '27726', '4108', '0'), +('10', '27', '5', '10055', '4030', '0'), +('10', '27', '8', '1546', '11364', '0'), +('10', '27', '8', '11603', '11246', '0'), +('10', '27', '8', '2349', '3554', '0'), +('10', '27', '8', '11621', '3521', '0'), +('10', '27', '6', '1557', '5310', '0'), +('10', '27', '6', '27728', '4874', '0'), +('10', '27', '6', '1401', '2924', '0'), +('10', '27', '6', '1904', '2639', '0'), +('10', '27', '17', '2285', '10671', '0'), +('10', '27', '17', '4872', '7337', '0'), +('10', '27', '17', '4342', '3388', '0'), +('10', '27', '17', '2405', '1838', '0'), +('10', '27', '7', '1362', '3124', '0'), +('10', '27', '7', '2289', '2635', '0'), +('10', '27', '7', '1321', '1746', '0'), +('10', '27', '7', '71303', '1204', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '27', '9', '27727', '6673', '0'), +('10', '27', '9', '14650', '2412', '0'), +('10', '27', '9', '2290', '2250', '0'), +('10', '27', '9', '4344', '2051', '0'), +('10', '27', '15', '10366', '4805', '0'), +('10', '27', '15', '10151', '4200', '0'), +('10', '27', '15', '10163', '3800', '0'), +('10', '27', '15', '14679', '3330', '0'), +('10', '27', '20', '11666', '12379', '0'), +('10', '27', '20', '27727', '6673', '0'), +('10', '27', '20', '2742', '5556', '0'), +('10', '27', '20', '2288', '4478', '0'), +('10', '27', '12', '20655', '4352', '0'), +('10', '27', '12', '2923', '4324', '0'), +('10', '27', '12', '2291', '3830', '0'), +('10', '27', '12', '4835', '3344', '0'), +('10', '27', '18', '2461', '2247', '0'), +('10', '27', '18', '2292', '2146', '0'), +('10', '27', '18', '4876', '1931', '0'), +('10', '27', '18', '4410', '1642', '0'), +('10', '27', '19', '2293', '4214', '0'), +('10', '27', '19', '68239', '3652', '0'), +('10', '27', '19', '4407', '2996', '0'), +('10', '27', '19', '4837', '2655', '0'), +('10', '27', '13', '27729', '12568', '0'), +('10', '27', '13', '11694', '12395', '0'), +('10', '27', '13', '10333', '6800', '0'), +('10', '27', '13', '7051', '3788', '0'), +('10', '27', '14', '10333', '6800', '0'), +('10', '27', '14', '12802', '6709', '0'), +('10', '27', '14', '10335', '5860', '0'), +('10', '27', '14', '1679', '4923', '0'), +('10', '27', '11', '7051', '3787', '0'), +('10', '27', '11', '9246', '3274', '0'), +('10', '27', '11', '14762', '3204', '0'), +('10', '27', '11', '20677', '1200', '0'), +('10', '28', '22', '9246', '0', '0'), +('10', '28', '22', '21518', '0', '0'), +('10', '28', '22', '10323', '0', '0'), +('10', '28', '22', '44492', '0', '0'), +('10', '28', '1', '14702', '5000', '0'), +('10', '28', '1', '14701', '4612', '0'), +('10', '28', '1', '30361', '2640', '0'), +('10', '28', '1', '14630', '1015', '0'), +('10', '28', '2', '10143', '7118', '0'), +('10', '28', '2', '30363', '3700', '0'), +('10', '28', '2', '2294', '2716', '0'), +('10', '28', '2', '3000', '2534', '0'), +('10', '28', '3', '11052', '5074', '0'), +('10', '28', '3', '4505', '2398', '0'), +('10', '28', '3', '14695', '2376', '0'), +('10', '28', '3', '2295', '1695', '0'), +('10', '28', '5', '14703', '8800', '0'), +('10', '28', '5', '14700', '4818', '0'), +('10', '28', '5', '27726', '4204', '0'), +('10', '28', '5', '10055', '4030', '0'), +('10', '28', '8', '1546', '11485', '0'), +('10', '28', '8', '11603', '11355', '0'), +('10', '28', '8', '2349', '3554', '0'), +('10', '28', '8', '11621', '3521', '0'), +('10', '28', '6', '1557', '5310', '0'), +('10', '28', '6', '27728', '5019', '0'), +('10', '28', '6', '1401', '2924', '0'), +('10', '28', '6', '1904', '2736', '0'), +('10', '28', '17', '2285', '10719', '0'), +('10', '28', '17', '4872', '7511', '0'), +('10', '28', '17', '4342', '3509', '0'), +('10', '28', '17', '2405', '1904', '0'), +('10', '28', '7', '1362', '3124', '0'), +('10', '28', '7', '2289', '2683', '0'), +('10', '28', '7', '1321', '1746', '0'), +('10', '28', '7', '71303', '1240', '0'), +('10', '28', '9', '27727', '6733', '0'), +('10', '28', '9', '14650', '2412', '0'), +('10', '28', '9', '2290', '2314', '0'), +('10', '28', '9', '4344', '2051', '0'), +('10', '28', '15', '10366', '4805', '0'), +('10', '28', '15', '10151', '4200', '0'), +('10', '28', '15', '10163', '3800', '0'), +('10', '28', '15', '14679', '3330', '0'), +('10', '28', '20', '11666', '12392', '0'), +('10', '28', '20', '27727', '6733', '0'), +('10', '28', '20', '2742', '5574', '0'), +('10', '28', '20', '2288', '4478', '0'), +('10', '28', '12', '20655', '4379', '0'), +('10', '28', '12', '2923', '4324', '0'), +('10', '28', '12', '2291', '3830', '0'), +('10', '28', '12', '4835', '3353', '0'), +('10', '28', '18', '2461', '2295', '0'), +('10', '28', '18', '2292', '2194', '0'), +('10', '28', '18', '4876', '1992', '0'), +('10', '28', '18', '4410', '1642', '0'), +('10', '28', '19', '2293', '4250', '0'), +('10', '28', '19', '68239', '3688', '0'), +('10', '28', '19', '4407', '3104', '0'), +('10', '28', '19', '4837', '2715', '0'), +('10', '28', '13', '27729', '12737', '0'), +('10', '28', '13', '11694', '12576', '0'), +('10', '28', '13', '10333', '6800', '0'), +('10', '28', '13', '7051', '3849', '0'), +('10', '28', '14', '10333', '6800', '0'), +('10', '28', '14', '12802', '6770', '0'), +('10', '28', '14', '10335', '6077', '0'), +('10', '28', '14', '1679', '4983', '0'), +('10', '28', '11', '7051', '3847', '0'), +('10', '28', '11', '9246', '3394', '0'), +('10', '28', '11', '14762', '3204', '0'), +('10', '28', '11', '20677', '1200', '0'), +('10', '29', '22', '9246', '0', '0'), +('10', '29', '22', '21518', '0', '0'), +('10', '29', '22', '10323', '0', '0'), +('10', '29', '22', '44492', '0', '0'), +('10', '29', '1', '14702', '5000', '0'), +('10', '29', '1', '14701', '4612', '0'), +('10', '29', '1', '30361', '2640', '0'), +('10', '29', '1', '14630', '1051', '0'), +('10', '29', '2', '10143', '7118', '0'), +('10', '29', '2', '30363', '3700', '0'), +('10', '29', '2', '2294', '2741', '0'), +('10', '29', '2', '3000', '2534', '0'), +('10', '29', '3', '11052', '5255', '0'), +('10', '29', '3', '4505', '2482', '0'), +('10', '29', '3', '14695', '2461', '0'), +('10', '29', '3', '2295', '1719', '0'), +('10', '29', '5', '14703', '8800', '0'), +('10', '29', '5', '14700', '4818', '0'), +('10', '29', '5', '27726', '4301', '0'), +('10', '29', '5', '10055', '4030', '0'), +('10', '29', '8', '1546', '11606', '0'), +('10', '29', '8', '11603', '11463', '0'), +('10', '29', '8', '2349', '3554', '0'), +('10', '29', '8', '11621', '3521', '0'), +('10', '29', '6', '1557', '5310', '0'), +('10', '29', '6', '27728', '5164', '0'), +('10', '29', '6', '1401', '2924', '0'), +('10', '29', '6', '1904', '2833', '0'), +('10', '29', '17', '2285', '10768', '0'), +('10', '29', '17', '4872', '7684', '0'), +('10', '29', '17', '4342', '3630', '0'), +('10', '29', '17', '2405', '1970', '0'), +('10', '29', '7', '1362', '3124', '0'), +('10', '29', '7', '2289', '2731', '0'), +('10', '29', '7', '1321', '1746', '0'), +('10', '29', '7', '71303', '1276', '0'), +('10', '29', '9', '27727', '6794', '0'), +('10', '29', '9', '14650', '2412', '0'), +('10', '29', '9', '2290', '2378', '0'), +('10', '29', '9', '4344', '2051', '0'), +('10', '29', '15', '10366', '4805', '0'), +('10', '29', '15', '10151', '4200', '0'), +('10', '29', '15', '10163', '3800', '0'), +('10', '29', '15', '14679', '3330', '0'), +('10', '29', '20', '11666', '12405', '0'), +('10', '29', '20', '27727', '6794', '0'), +('10', '29', '20', '2742', '5592', '0'), +('10', '29', '20', '2288', '4478', '0'), +('10', '29', '12', '20655', '4407', '0'), +('10', '29', '12', '2923', '4324', '0'), +('10', '29', '12', '2291', '3830', '0'), +('10', '29', '12', '4835', '3362', '0'), +('10', '29', '18', '2461', '2344', '0'), +('10', '29', '18', '2292', '2242', '0'), +('10', '29', '18', '4876', '2052', '0'), +('10', '29', '18', '4410', '1642', '0'), +('10', '29', '19', '2293', '4286', '0'), +('10', '29', '19', '68239', '3724', '0'), +('10', '29', '19', '4407', '3213', '0'), +('10', '29', '19', '4837', '2775', '0'), +('10', '29', '13', '27729', '12906', '0'), +('10', '29', '13', '11694', '12757', '0'), +('10', '29', '13', '10333', '6800', '0'), +('10', '29', '13', '7051', '3909', '0'), +('10', '29', '14', '12802', '6830', '0'), +('10', '29', '14', '10333', '6800', '0'), +('10', '29', '14', '10335', '6295', '0'), +('10', '29', '14', '1679', '5043', '0'), +('10', '29', '11', '7051', '3908', '0'), +('10', '29', '11', '9246', '3515', '0'), +('10', '29', '11', '14762', '3204', '0'), +('10', '29', '11', '7048', '1206', '0'), +('10', '30', '22', '9246', '0', '0'), +('10', '30', '22', '21518', '0', '0'), +('10', '30', '22', '10323', '0', '0'), +('10', '30', '22', '44492', '0', '0'), +('10', '30', '1', '14702', '5000', '0'), +('10', '30', '1', '14701', '4612', '0'), +('10', '30', '1', '30361', '2640', '0'), +('10', '30', '1', '14630', '1087', '0'), +('10', '30', '2', '10143', '7118', '0'), +('10', '30', '2', '30363', '3700', '0'), +('10', '30', '2', '2294', '2765', '0'), +('10', '30', '2', '3000', '2534', '0'), +('10', '30', '3', '11052', '5436', '0'), +('10', '30', '3', '4505', '2567', '0'), +('10', '30', '3', '14695', '2545', '0'), +('10', '30', '3', '2295', '1743', '0'), +('10', '30', '5', '14703', '8800', '0'), +('10', '30', '5', '14700', '4818', '0'), +('10', '30', '5', '27726', '4398', '0'), +('10', '30', '5', '68291', '4036', '0'), +('10', '30', '8', '1546', '11727', '0'), +('10', '30', '8', '11603', '11572', '0'), +('10', '30', '8', '2349', '3554', '0'), +('10', '30', '8', '11621', '3521', '0'), +('10', '30', '6', '1557', '5310', '0'), +('10', '30', '6', '27728', '5309', '0'), +('10', '30', '6', '1904', '2929', '0'), +('10', '30', '6', '1401', '2924', '0'), +('10', '30', '17', '2285', '10816', '0'), +('10', '30', '17', '4872', '7857', '0'), +('10', '30', '17', '4342', '3751', '0'), +('10', '30', '17', '2405', '2035', '0'), +('10', '30', '7', '1362', '3124', '0'), +('10', '30', '7', '2289', '2780', '0'), +('10', '30', '7', '1321', '1746', '0'), +('10', '30', '7', '71303', '1312', '0'), +('10', '30', '9', '27727', '6854', '0'), +('10', '30', '9', '2290', '2442', '0'), +('10', '30', '9', '14650', '2412', '0'), +('10', '30', '9', '4344', '2051', '0'), +('10', '30', '15', '10366', '4805', '0'), +('10', '30', '15', '10151', '4200', '0'), +('10', '30', '15', '10163', '3800', '0'), +('10', '30', '15', '14679', '3330', '0'), +('10', '30', '20', '11666', '12417', '0'), +('10', '30', '20', '27727', '6854', '0'), +('10', '30', '20', '2742', '5610', '0'), +('10', '30', '20', '2288', '4478', '0'), +('10', '30', '12', '20655', '4435', '0'), +('10', '30', '12', '2923', '4324', '0'), +('10', '30', '12', '2291', '3830', '0'), +('10', '30', '12', '4835', '3371', '0'), +('10', '30', '18', '2461', '2392', '0'), +('10', '30', '18', '2292', '2291', '0'), +('10', '30', '18', '4876', '2113', '0'), +('10', '30', '18', '4410', '1642', '0'), +('10', '30', '19', '2293', '4322', '0'), +('10', '30', '19', '68239', '3761', '0'), +('10', '30', '19', '4407', '3322', '0'), +('10', '30', '19', '4837', '2836', '0'), +('10', '30', '13', '27729', '13076', '0'), +('10', '30', '13', '11694', '12938', '0'), +('10', '30', '13', '10333', '6800', '0'), +('10', '30', '13', '7051', '3970', '0'), +('10', '30', '14', '12802', '6891', '0'), +('10', '30', '14', '10333', '6800', '0'), +('10', '30', '14', '10335', '6512', '0'), +('10', '30', '14', '1679', '5104', '0'), +('10', '30', '11', '7051', '3968', '0'), +('10', '30', '11', '9246', '3636', '0'), +('10', '30', '11', '14762', '3204', '0'), +('10', '30', '11', '7048', '1242', '0'), +('10', '31', '22', '9246', '0', '0'), +('10', '31', '22', '21518', '0', '0'), +('10', '31', '22', '10323', '0', '0'), +('10', '31', '22', '44492', '0', '0'), +('10', '31', '1', '14702', '5000', '0'), +('10', '31', '1', '14701', '4612', '0'), +('10', '31', '1', '30361', '2640', '0'), +('10', '31', '1', '14630', '1123', '0'), +('10', '31', '2', '10143', '7118', '0'), +('10', '31', '2', '30363', '3700', '0'), +('10', '31', '2', '2294', '2789', '0'), +('10', '31', '2', '3000', '2534', '0'), +('10', '31', '3', '11052', '5617', '0'), +('10', '31', '3', '4505', '2652', '0'), +('10', '31', '3', '14695', '2630', '0'), +('10', '31', '3', '2295', '1767', '0'), +('10', '31', '5', '14703', '8800', '0'), +('10', '31', '5', '14700', '4818', '0'), +('10', '31', '5', '27726', '4494', '0'), +('10', '31', '5', '68291', '4084', '0'), +('10', '31', '8', '1546', '11847', '0'), +('10', '31', '8', '11603', '11681', '0'), +('10', '31', '8', '2349', '3554', '0'), +('10', '31', '8', '11621', '3521', '0'), +('10', '31', '6', '27728', '5454', '0'), +('10', '31', '6', '1557', '5310', '0'), +('10', '31', '6', '1904', '3026', '0'), +('10', '31', '6', '1401', '2924', '0'), +('10', '31', '17', '2285', '10864', '0'), +('10', '31', '17', '4872', '8031', '0'), +('10', '31', '17', '4342', '3872', '0'), +('10', '31', '17', '2405', '2101', '0'), +('10', '31', '7', '1362', '3124', '0'), +('10', '31', '7', '2289', '2828', '0'), +('10', '31', '7', '1321', '1746', '0'), +('10', '31', '7', '71303', '1349', '0'), +('10', '31', '9', '27727', '6915', '0'), +('10', '31', '9', '2290', '2506', '0'), +('10', '31', '9', '14650', '2412', '0'), +('10', '31', '9', '10149', '2054', '0'), +('10', '31', '15', '10366', '4805', '0'), +('10', '31', '15', '10151', '4200', '0'), +('10', '31', '15', '10163', '3800', '0'), +('10', '31', '15', '14679', '3330', '0'), +('10', '31', '20', '11666', '12430', '0'), +('10', '31', '20', '27727', '6915', '0'), +('10', '31', '20', '2742', '5628', '0'), +('10', '31', '20', '1543', '4579', '0'), +('10', '31', '12', '20655', '4463', '0'), +('10', '31', '12', '2923', '4324', '0'), +('10', '31', '12', '2291', '3830', '0'), +('10', '31', '12', '4835', '3381', '0'), +('10', '31', '18', '2461', '2440', '0'), +('10', '31', '18', '2292', '2339', '0'), +('10', '31', '18', '4876', '2173', '0'), +('10', '31', '18', '4410', '1642', '0'), +('10', '31', '19', '2293', '4358', '0'), +('10', '31', '19', '68239', '3797', '0'), +('10', '31', '19', '4407', '3431', '0'), +('10', '31', '19', '4837', '2896', '0'), +('10', '31', '13', '27729', '13245', '0'), +('10', '31', '13', '11694', '13120', '0'), +('10', '31', '13', '10333', '6800', '0'), +('10', '31', '13', '13730', '4061', '0'), +('10', '31', '14', '12802', '6951', '0'), +('10', '31', '14', '10333', '6800', '0'), +('10', '31', '14', '10335', '6730', '0'), +('10', '31', '14', '1679', '5164', '0'), +('10', '31', '11', '7051', '4028', '0'), +('10', '31', '11', '9246', '3757', '0'), +('10', '31', '11', '14762', '3204', '0'), +('10', '31', '11', '7048', '1278', '0'), +('10', '32', '22', '9246', '0', '0'), +('10', '32', '22', '21518', '0', '0'), +('10', '32', '22', '10323', '0', '0'), +('10', '32', '22', '44492', '0', '0'), +('10', '32', '1', '14702', '5000', '0'), +('10', '32', '1', '14701', '4612', '0'), +('10', '32', '1', '30361', '2640', '0'), +('10', '32', '1', '14630', '1160', '0'), +('10', '32', '2', '10143', '7118', '0'), +('10', '32', '2', '30363', '3700', '0'), +('10', '32', '2', '2294', '2813', '0'), +('10', '32', '2', '3000', '2534', '0'), +('10', '32', '3', '11052', '5798', '0'), +('10', '32', '3', '4505', '2736', '0'), +('10', '32', '3', '14695', '2714', '0'), +('10', '32', '3', '2295', '1791', '0'), +('10', '32', '5', '14703', '8800', '0'), +('10', '32', '5', '14700', '4818', '0'), +('10', '32', '5', '27726', '4591', '0'), +('10', '32', '5', '68291', '4132', '0'), +('10', '32', '8', '1546', '11968', '0'), +('10', '32', '8', '11603', '11789', '0'), +('10', '32', '8', '2349', '3554', '0'), +('10', '32', '8', '11621', '3521', '0'), +('10', '32', '6', '27728', '5599', '0'), +('10', '32', '6', '1557', '5310', '0'), +('10', '32', '6', '1904', '3123', '0'), +('10', '32', '6', '1401', '2924', '0'), +('10', '32', '17', '2285', '10913', '0'), +('10', '32', '17', '4872', '8204', '0'), +('10', '32', '17', '4342', '3992', '0'), +('10', '32', '17', '2405', '2167', '0'), +('10', '32', '7', '1362', '3124', '0'), +('10', '32', '7', '2289', '2876', '0'), +('10', '32', '7', '1321', '1746', '0'), +('10', '32', '7', '71303', '1385', '0'), +('10', '32', '9', '27727', '6975', '0'), +('10', '32', '9', '2290', '2571', '0'), +('10', '32', '9', '14650', '2412', '0'), +('10', '32', '9', '10149', '2090', '0'), +('10', '32', '15', '10366', '4805', '0'), +('10', '32', '15', '10151', '4200', '0'), +('10', '32', '15', '10163', '3800', '0'), +('10', '32', '15', '27730', '3338', '0'), +('10', '32', '20', '11666', '12443', '0'), +('10', '32', '20', '27727', '6975', '0'), +('10', '32', '20', '2742', '5646', '0'), +('10', '32', '20', '1543', '4700', '0'), +('10', '32', '12', '20655', '4491', '0'), +('10', '32', '12', '2923', '4324', '0'), +('10', '32', '12', '2291', '3830', '0'), +('10', '32', '12', '4835', '3390', '0'), +('10', '32', '18', '2461', '2489', '0'), +('10', '32', '18', '2292', '2387', '0'), +('10', '32', '18', '4876', '2233', '0'), +('10', '32', '18', '4410', '1642', '0'), +('10', '32', '19', '2293', '4395', '0'), +('10', '32', '19', '68239', '3833', '0'), +('10', '32', '19', '4407', '3539', '0'), +('10', '32', '19', '4837', '2957', '0'), +('10', '32', '13', '27729', '13414', '0'), +('10', '32', '13', '11694', '13301', '0'), +('10', '32', '13', '10333', '6800', '0'), +('10', '32', '13', '13730', '4179', '0'), +('10', '32', '14', '12802', '7011', '0'), +('10', '32', '14', '10335', '6947', '0'), +('10', '32', '14', '10333', '6800', '0'), +('10', '32', '14', '1679', '5225', '0'), +('10', '32', '11', '7051', '4089', '0'), +('10', '32', '11', '9246', '3878', '0'), +('10', '32', '11', '14762', '3204', '0'), +('10', '32', '11', '7048', '1315', '0'), +('10', '33', '22', '9246', '0', '0'), +('10', '33', '22', '21518', '0', '0'), +('10', '33', '22', '10323', '0', '0'), +('10', '33', '22', '44492', '0', '0'), +('10', '33', '1', '14702', '5000', '0'), +('10', '33', '1', '14701', '4612', '0'), +('10', '33', '1', '30361', '2640', '0'), +('10', '33', '1', '14630', '1196', '0'), +('10', '33', '2', '10143', '7118', '0'), +('10', '33', '2', '30363', '3700', '0'), +('10', '33', '2', '2294', '2837', '0'), +('10', '33', '2', '3000', '2534', '0'), +('10', '33', '3', '11052', '5980', '0'), +('10', '33', '3', '4505', '2821', '0'), +('10', '33', '3', '14695', '2799', '0'), +('10', '33', '3', '2295', '1815', '0'), +('10', '33', '5', '14703', '8800', '0'), +('10', '33', '5', '14700', '4818', '0'), +('10', '33', '5', '27726', '4687', '0'), +('10', '33', '5', '68291', '4181', '0'), +('10', '33', '8', '1546', '12089', '0'), +('10', '33', '8', '11603', '11898', '0'), +('10', '33', '8', '2349', '3554', '0'), +('10', '33', '8', '11621', '3521', '0'), +('10', '33', '6', '27728', '5744', '0'), +('10', '33', '6', '1557', '5310', '0'), +('10', '33', '6', '1904', '3219', '0'), +('10', '33', '6', '1401', '2924', '0'), +('10', '33', '17', '2285', '10961', '0'), +('10', '33', '17', '4872', '8378', '0'), +('10', '33', '17', '4342', '4113', '0'), +('10', '33', '17', '2405', '2233', '0'), +('10', '33', '7', '1362', '3124', '0'), +('10', '33', '7', '2289', '2925', '0'), +('10', '33', '7', '1321', '1746', '0'), +('10', '33', '7', '71303', '1421', '0'), +('10', '33', '9', '27727', '7035', '0'), +('10', '33', '9', '2290', '2635', '0'), +('10', '33', '9', '14650', '2412', '0'), +('10', '33', '9', '10149', '2126', '0'), +('10', '33', '15', '10366', '4805', '0'), +('10', '33', '15', '10151', '4200', '0'), +('10', '33', '15', '10163', '3800', '0'), +('10', '33', '15', '27730', '3422', '0'), +('10', '33', '20', '11666', '12455', '0'), +('10', '33', '20', '27727', '7035', '0'), +('10', '33', '20', '2742', '5664', '0'), +('10', '33', '20', '1543', '4821', '0'), +('10', '33', '12', '20655', '4518', '0'), +('10', '33', '12', '2923', '4324', '0'), +('10', '33', '12', '2291', '3830', '0'), +('10', '33', '12', '4835', '3399', '0'), +('10', '33', '18', '2461', '2537', '0'), +('10', '33', '18', '2292', '2436', '0'), +('10', '33', '18', '4876', '2294', '0'), +('10', '33', '18', '4410', '1642', '0'), +('10', '33', '19', '2293', '4431', '0'), +('10', '33', '19', '68239', '3869', '0'), +('10', '33', '19', '4407', '3648', '0'), +('10', '33', '19', '4837', '3017', '0'), +('10', '33', '13', '27729', '13583', '0'), +('10', '33', '13', '11694', '13482', '0'), +('10', '33', '13', '10333', '6800', '0'), +('10', '33', '13', '13730', '4297', '0'), +('10', '33', '14', '10335', '7165', '0'), +('10', '33', '14', '12802', '7072', '0'), +('10', '33', '14', '10333', '6800', '0'), +('10', '33', '14', '1679', '5285', '0'), +('10', '33', '11', '7051', '4149', '0'), +('10', '33', '11', '9246', '3998', '0'), +('10', '33', '11', '14762', '3204', '0'), +('10', '33', '11', '7048', '1351', '0'), +('10', '34', '22', '9246', '0', '0'), +('10', '34', '22', '21518', '0', '0'), +('10', '34', '22', '10323', '0', '0'), +('10', '34', '22', '44492', '0', '0'), +('10', '34', '1', '14702', '5000', '0'), +('10', '34', '1', '14701', '4612', '0'), +('10', '34', '1', '30361', '2640', '0'), +('10', '34', '1', '14630', '1232', '0'), +('10', '34', '2', '10143', '7118', '0'), +('10', '34', '2', '30363', '3700', '0'), +('10', '34', '2', '2294', '2861', '0'), +('10', '34', '2', '2191', '2536', '0'), +('10', '34', '3', '11052', '6161', '0'), +('10', '34', '3', '4505', '2905', '0'), +('10', '34', '3', '14695', '2883', '0'), +('10', '34', '3', '2295', '1840', '0'), +('10', '34', '5', '14703', '8800', '0'), +('10', '34', '5', '14700', '4818', '0'), +('10', '34', '5', '27726', '4784', '0'), +('10', '34', '5', '68291', '4229', '0'), +('10', '34', '8', '1546', '12210', '0'), +('10', '34', '8', '11603', '12007', '0'), +('10', '34', '8', '2349', '3554', '0'), +('10', '34', '8', '11621', '3521', '0'), +('10', '34', '6', '27728', '5889', '0'), +('10', '34', '6', '1557', '5310', '0'), +('10', '34', '6', '1904', '3316', '0'), +('10', '34', '6', '1401', '2924', '0'), +('10', '34', '17', '2285', '11009', '0'), +('10', '34', '17', '4872', '8551', '0'), +('10', '34', '17', '4342', '4234', '0'), +('10', '34', '17', '2405', '2299', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '34', '7', '1362', '3124', '0'), +('10', '34', '7', '2289', '2973', '0'), +('10', '34', '7', '1321', '1746', '0'), +('10', '34', '7', '71303', '1457', '0'), +('10', '34', '9', '27727', '7096', '0'), +('10', '34', '9', '2290', '2699', '0'), +('10', '34', '9', '14650', '2412', '0'), +('10', '34', '9', '10149', '2162', '0'), +('10', '34', '15', '10366', '4805', '0'), +('10', '34', '15', '10151', '4200', '0'), +('10', '34', '15', '10163', '3800', '0'), +('10', '34', '15', '27730', '3507', '0'), +('10', '34', '20', '11666', '12468', '0'), +('10', '34', '20', '27727', '7096', '0'), +('10', '34', '20', '2742', '5683', '0'), +('10', '34', '20', '1543', '4942', '0'), +('10', '34', '12', '20655', '4546', '0'), +('10', '34', '12', '2923', '4324', '0'), +('10', '34', '12', '2291', '3830', '0'), +('10', '34', '12', '4835', '3408', '0'), +('10', '34', '18', '2461', '2585', '0'), +('10', '34', '18', '2292', '2484', '0'), +('10', '34', '18', '4876', '2354', '0'), +('10', '34', '18', '4410', '1642', '0'), +('10', '34', '19', '2293', '4467', '0'), +('10', '34', '19', '68239', '3906', '0'), +('10', '34', '19', '4407', '3757', '0'), +('10', '34', '19', '4837', '3077', '0'), +('10', '34', '13', '27729', '13752', '0'), +('10', '34', '13', '11694', '13663', '0'), +('10', '34', '13', '10333', '6800', '0'), +('10', '34', '13', '13730', '4414', '0'), +('10', '34', '14', '10335', '7382', '0'), +('10', '34', '14', '12802', '7132', '0'), +('10', '34', '14', '10333', '6800', '0'), +('10', '34', '14', '1679', '5345', '0'), +('10', '34', '11', '7051', '4210', '0'), +('10', '34', '11', '9246', '4119', '0'), +('10', '34', '11', '14762', '3204', '0'), +('10', '34', '11', '7048', '1387', '0'), +('10', '35', '22', '9246', '0', '0'), +('10', '35', '22', '21518', '0', '0'), +('10', '35', '22', '10323', '0', '0'), +('10', '35', '22', '44492', '0', '0'), +('10', '35', '1', '14702', '5000', '0'), +('10', '35', '1', '14701', '4612', '0'), +('10', '35', '1', '30361', '2640', '0'), +('10', '35', '1', '14630', '1268', '0'), +('10', '35', '2', '10143', '7118', '0'), +('10', '35', '2', '30363', '3700', '0'), +('10', '35', '2', '2294', '2885', '0'), +('10', '35', '2', '2191', '2608', '0'), +('10', '35', '3', '11052', '6342', '0'), +('10', '35', '3', '4505', '2990', '0'), +('10', '35', '3', '14695', '2968', '0'), +('10', '35', '3', '2295', '1864', '0'), +('10', '35', '5', '14703', '8800', '0'), +('10', '35', '5', '27726', '4881', '0'), +('10', '35', '5', '14700', '4818', '0'), +('10', '35', '5', '68291', '4277', '0'), +('10', '35', '8', '1546', '12331', '0'), +('10', '35', '8', '11603', '12116', '0'), +('10', '35', '8', '2349', '3554', '0'), +('10', '35', '8', '11621', '3521', '0'), +('10', '35', '6', '27728', '6034', '0'), +('10', '35', '6', '1557', '5310', '0'), +('10', '35', '6', '1904', '3413', '0'), +('10', '35', '6', '1401', '2924', '0'), +('10', '35', '17', '2285', '11058', '0'), +('10', '35', '17', '4872', '8724', '0'), +('10', '35', '17', '4342', '4355', '0'), +('10', '35', '17', '2405', '2365', '0'), +('10', '35', '7', '1362', '3124', '0'), +('10', '35', '7', '2289', '3021', '0'), +('10', '35', '7', '1321', '1746', '0'), +('10', '35', '7', '71303', '1493', '0'), +('10', '35', '9', '27727', '7156', '0'), +('10', '35', '9', '2290', '2763', '0'), +('10', '35', '9', '14650', '2412', '0'), +('10', '35', '9', '10149', '2199', '0'), +('10', '35', '15', '10366', '4805', '0'), +('10', '35', '15', '10151', '4200', '0'), +('10', '35', '15', '10163', '3800', '0'), +('10', '35', '15', '27730', '3592', '0'), +('10', '35', '20', '11666', '12481', '0'), +('10', '35', '20', '27727', '7156', '0'), +('10', '35', '20', '2742', '5701', '0'), +('10', '35', '20', '1543', '5063', '0'), +('10', '35', '12', '20655', '4574', '0'), +('10', '35', '12', '2923', '4324', '0'), +('10', '35', '12', '2291', '3830', '0'), +('10', '35', '12', '4835', '3417', '0'), +('10', '35', '18', '2461', '2633', '0'), +('10', '35', '18', '2292', '2532', '0'), +('10', '35', '18', '4876', '2415', '0'), +('10', '35', '18', '4410', '1642', '0'), +('10', '35', '19', '2293', '4503', '0'), +('10', '35', '19', '68239', '3942', '0'), +('10', '35', '19', '4407', '3865', '0'), +('10', '35', '19', '4837', '3138', '0'), +('10', '35', '13', '27729', '13921', '0'), +('10', '35', '13', '11694', '13844', '0'), +('10', '35', '13', '10333', '6800', '0'), +('10', '35', '13', '13730', '4532', '0'), +('10', '35', '14', '10335', '7600', '0'), +('10', '35', '14', '12802', '7193', '0'), +('10', '35', '14', '10333', '6800', '0'), +('10', '35', '14', '1679', '5406', '0'), +('10', '35', '11', '7051', '4270', '0'), +('10', '35', '11', '9246', '4240', '0'), +('10', '35', '11', '14762', '3204', '0'), +('10', '35', '11', '7048', '1423', '0'), +('10', '36', '22', '9246', '0', '0'), +('10', '36', '22', '21518', '0', '0'), +('10', '36', '22', '10323', '0', '0'), +('10', '36', '22', '44492', '0', '0'), +('10', '36', '1', '14702', '5000', '0'), +('10', '36', '1', '14701', '4612', '0'), +('10', '36', '1', '30361', '2640', '0'), +('10', '36', '1', '14630', '1305', '0'), +('10', '36', '2', '10143', '7118', '0'), +('10', '36', '2', '30363', '3700', '0'), +('10', '36', '2', '2294', '2910', '0'), +('10', '36', '2', '2191', '2681', '0'), +('10', '36', '3', '11052', '6523', '0'), +('10', '36', '3', '4505', '3074', '0'), +('10', '36', '3', '14695', '3053', '0'), +('10', '36', '3', '2295', '1888', '0'), +('10', '36', '5', '14703', '8800', '0'), +('10', '36', '5', '27726', '4977', '0'), +('10', '36', '5', '14700', '4818', '0'), +('10', '36', '5', '68291', '4326', '0'), +('10', '36', '8', '1546', '12451', '0'), +('10', '36', '8', '11603', '12224', '0'), +('10', '36', '8', '2349', '3554', '0'), +('10', '36', '8', '11621', '3521', '0'), +('10', '36', '6', '27728', '6179', '0'), +('10', '36', '6', '1557', '5310', '0'), +('10', '36', '6', '1904', '3509', '0'), +('10', '36', '6', '1401', '2924', '0'), +('10', '36', '17', '2285', '11106', '0'), +('10', '36', '17', '4872', '8898', '0'), +('10', '36', '17', '4342', '4476', '0'), +('10', '36', '17', '2405', '2430', '0'), +('10', '36', '7', '1362', '3124', '0'), +('10', '36', '7', '2289', '3070', '0'), +('10', '36', '7', '1321', '1746', '0'), +('10', '36', '7', '71303', '1530', '0'), +('10', '36', '9', '27727', '7217', '0'), +('10', '36', '9', '2290', '2827', '0'), +('10', '36', '9', '14650', '2412', '0'), +('10', '36', '9', '10149', '2235', '0'), +('10', '36', '15', '10366', '4805', '0'), +('10', '36', '15', '10151', '4200', '0'), +('10', '36', '15', '10163', '3800', '0'), +('10', '36', '15', '27730', '3676', '0'), +('10', '36', '20', '11666', '12493', '0'), +('10', '36', '20', '27727', '7217', '0'), +('10', '36', '20', '2742', '5719', '0'), +('10', '36', '20', '1543', '5183', '0'), +('10', '36', '12', '20655', '4602', '0'), +('10', '36', '12', '2923', '4324', '0'), +('10', '36', '12', '2291', '3830', '0'), +('10', '36', '12', '4835', '3426', '0'), +('10', '36', '18', '2461', '2682', '0'), +('10', '36', '18', '2292', '2581', '0'), +('10', '36', '18', '4876', '2475', '0'), +('10', '36', '18', '4410', '1642', '0'), +('10', '36', '19', '2293', '4540', '0'), +('10', '36', '19', '68239', '3978', '0'), +('10', '36', '19', '4407', '3974', '0'), +('10', '36', '19', '4837', '3198', '0'), +('10', '36', '13', '27729', '14090', '0'), +('10', '36', '13', '11694', '14026', '0'), +('10', '36', '13', '10333', '6800', '0'), +('10', '36', '13', '13730', '4650', '0'), +('10', '36', '14', '10335', '7817', '0'), +('10', '36', '14', '12802', '7253', '0'), +('10', '36', '14', '10333', '6800', '0'), +('10', '36', '14', '1679', '5466', '0'), +('10', '36', '11', '9246', '4361', '0'), +('10', '36', '11', '7051', '4330', '0'), +('10', '36', '11', '14762', '3204', '0'), +('10', '36', '11', '7048', '1459', '0'), +('10', '37', '22', '9246', '0', '0'), +('10', '37', '22', '21518', '0', '0'), +('10', '37', '22', '10323', '0', '0'), +('10', '37', '22', '44492', '0', '0'), +('10', '37', '1', '14702', '5000', '0'), +('10', '37', '1', '14701', '4612', '0'), +('10', '37', '1', '30361', '2640', '0'), +('10', '37', '1', '14630', '1341', '0'), +('10', '37', '2', '10143', '7118', '0'), +('10', '37', '2', '30363', '3700', '0'), +('10', '37', '2', '2294', '2934', '0'), +('10', '37', '2', '2191', '2753', '0'), +('10', '37', '3', '11052', '6704', '0'), +('10', '37', '3', '4505', '3159', '0'), +('10', '37', '3', '14695', '3137', '0'), +('10', '37', '3', '2295', '1912', '0'), +('10', '37', '5', '14703', '8800', '0'), +('10', '37', '5', '27726', '5074', '0'), +('10', '37', '5', '14700', '4818', '0'), +('10', '37', '5', '68291', '4374', '0'), +('10', '37', '8', '1546', '12572', '0'), +('10', '37', '8', '11603', '12333', '0'), +('10', '37', '8', '2349', '3554', '0'), +('10', '37', '8', '11621', '3521', '0'), +('10', '37', '6', '27728', '6324', '0'), +('10', '37', '6', '1557', '5310', '0'), +('10', '37', '6', '1904', '3606', '0'), +('10', '37', '6', '1401', '2924', '0'), +('10', '37', '17', '2285', '11154', '0'), +('10', '37', '17', '4872', '9071', '0'), +('10', '37', '17', '4342', '4596', '0'), +('10', '37', '17', '2405', '2496', '0'), +('10', '37', '7', '1362', '3124', '0'), +('10', '37', '7', '2289', '3118', '0'), +('10', '37', '7', '1321', '1746', '0'), +('10', '37', '7', '71303', '1566', '0'), +('10', '37', '9', '27727', '7277', '0'), +('10', '37', '9', '2290', '2891', '0'), +('10', '37', '9', '14650', '2412', '0'), +('10', '37', '9', '4874', '2289', '0'), +('10', '37', '15', '10366', '4805', '0'), +('10', '37', '15', '10151', '4200', '0'), +('10', '37', '15', '10163', '3800', '0'), +('10', '37', '15', '27730', '3761', '0'), +('10', '37', '20', '11666', '12506', '0'), +('10', '37', '20', '27727', '7277', '0'), +('10', '37', '20', '2742', '5737', '0'), +('10', '37', '20', '1543', '5304', '0'), +('10', '37', '12', '20655', '4629', '0'), +('10', '37', '12', '2923', '4324', '0'), +('10', '37', '12', '2291', '3830', '0'), +('10', '37', '12', '4835', '3435', '0'), +('10', '37', '18', '2461', '2730', '0'), +('10', '37', '18', '2292', '2629', '0'), +('10', '37', '18', '4876', '2535', '0'), +('10', '37', '18', '4410', '1642', '0'), +('10', '37', '19', '2293', '4576', '0'), +('10', '37', '19', '4407', '4083', '0'), +('10', '37', '19', '68239', '4014', '0'), +('10', '37', '19', '4837', '3259', '0'), +('10', '37', '13', '27729', '14259', '0'), +('10', '37', '13', '11694', '14207', '0'), +('10', '37', '13', '10333', '6800', '0'), +('10', '37', '13', '13730', '4768', '0'), +('10', '37', '14', '10335', '8034', '0'), +('10', '37', '14', '12802', '7313', '0'), +('10', '37', '14', '10333', '6800', '0'), +('10', '37', '14', '1679', '5527', '0'), +('10', '37', '11', '9246', '4482', '0'), +('10', '37', '11', '7051', '4391', '0'), +('10', '37', '11', '14762', '3204', '0'), +('10', '37', '11', '7048', '1496', '0'), +('10', '38', '22', '9246', '0', '0'), +('10', '38', '22', '21518', '0', '0'), +('10', '38', '22', '10323', '0', '0'), +('10', '38', '22', '44492', '0', '0'), +('10', '38', '1', '14702', '5000', '0'), +('10', '38', '1', '14701', '4612', '0'), +('10', '38', '1', '30361', '2640', '0'), +('10', '38', '1', '14630', '1377', '0'), +('10', '38', '2', '10143', '7118', '0'), +('10', '38', '2', '30363', '3700', '0'), +('10', '38', '2', '2294', '2958', '0'), +('10', '38', '2', '2191', '2826', '0'), +('10', '38', '3', '11052', '6886', '0'), +('10', '38', '3', '4505', '3243', '0'), +('10', '38', '3', '14695', '3222', '0'), +('10', '38', '3', '2295', '1936', '0'), +('10', '38', '5', '14703', '8800', '0'), +('10', '38', '5', '27726', '5171', '0'), +('10', '38', '5', '14700', '4818', '0'), +('10', '38', '5', '68291', '4422', '0'), +('10', '38', '8', '1546', '12693', '0'), +('10', '38', '8', '11603', '12442', '0'), +('10', '38', '8', '2349', '3554', '0'), +('10', '38', '8', '11621', '3521', '0'), +('10', '38', '6', '27728', '6469', '0'), +('10', '38', '6', '1557', '5310', '0'), +('10', '38', '6', '1904', '3703', '0'), +('10', '38', '6', '1401', '2924', '0'), +('10', '38', '17', '2285', '11203', '0'), +('10', '38', '17', '4872', '9244', '0'), +('10', '38', '17', '4342', '4717', '0'), +('10', '38', '17', '2405', '2562', '0'), +('10', '38', '7', '2289', '3166', '0'), +('10', '38', '7', '1362', '3124', '0'), +('10', '38', '7', '1321', '1746', '0'), +('10', '38', '7', '71303', '1602', '0'), +('10', '38', '9', '27727', '7337', '0'), +('10', '38', '9', '2290', '2955', '0'), +('10', '38', '9', '14650', '2412', '0'), +('10', '38', '9', '4874', '2350', '0'), +('10', '38', '15', '10366', '4805', '0'), +('10', '38', '15', '10151', '4200', '0'), +('10', '38', '15', '27730', '3845', '0'), +('10', '38', '15', '10163', '3800', '0'), +('10', '38', '20', '11666', '12519', '0'), +('10', '38', '20', '27727', '7337', '0'), +('10', '38', '20', '2742', '5755', '0'), +('10', '38', '20', '1543', '5425', '0'), +('10', '38', '12', '20655', '4657', '0'), +('10', '38', '12', '2923', '4324', '0'), +('10', '38', '12', '2291', '3830', '0'), +('10', '38', '12', '4835', '3444', '0'), +('10', '38', '18', '2461', '2778', '0'), +('10', '38', '18', '2292', '2677', '0'), +('10', '38', '18', '4876', '2596', '0'), +('10', '38', '18', '4410', '1642', '0'), +('10', '38', '19', '2293', '4612', '0'), +('10', '38', '19', '4407', '4192', '0'), +('10', '38', '19', '68239', '4051', '0'), +('10', '38', '19', '4837', '3319', '0'), +('10', '38', '13', '27729', '14429', '0'), +('10', '38', '13', '11694', '14388', '0'), +('10', '38', '13', '10333', '6800', '0'), +('10', '38', '13', '13730', '4885', '0'), +('10', '38', '14', '10335', '8252', '0'), +('10', '38', '14', '12802', '7374', '0'), +('10', '38', '14', '10333', '6800', '0'), +('10', '38', '14', '13991', '5590', '0'), +('10', '38', '11', '9246', '4602', '0'), +('10', '38', '11', '7051', '4451', '0'), +('10', '38', '11', '14762', '3204', '0'), +('10', '38', '11', '7048', '1532', '0'), +('10', '39', '22', '9246', '0', '0'), +('10', '39', '22', '21518', '0', '0'), +('10', '39', '22', '10323', '0', '0'), +('10', '39', '22', '44492', '0', '0'), +('10', '39', '1', '14702', '5000', '0'), +('10', '39', '1', '14701', '4612', '0'), +('10', '39', '1', '30361', '2640', '0'), +('10', '39', '1', '14630', '1413', '0'), +('10', '39', '2', '10143', '7118', '0'), +('10', '39', '2', '30363', '3700', '0'), +('10', '39', '2', '2294', '2982', '0'), +('10', '39', '2', '2191', '2898', '0'), +('10', '39', '3', '11052', '7067', '0'), +('10', '39', '3', '4505', '3328', '0'), +('10', '39', '3', '14695', '3306', '0'), +('10', '39', '3', '2295', '1960', '0'), +('10', '39', '5', '14703', '8800', '0'), +('10', '39', '5', '27726', '5267', '0'), +('10', '39', '5', '14700', '4818', '0'), +('10', '39', '5', '68291', '4471', '0'), +('10', '39', '8', '1546', '12814', '0'), +('10', '39', '8', '11603', '12550', '0'), +('10', '39', '8', '2349', '3554', '0'), +('10', '39', '8', '11621', '3521', '0'), +('10', '39', '6', '27728', '6614', '0'), +('10', '39', '6', '1557', '5310', '0'), +('10', '39', '6', '1904', '3799', '0'), +('10', '39', '6', '1401', '2924', '0'), +('10', '39', '17', '2285', '11251', '0'), +('10', '39', '17', '4872', '9418', '0'), +('10', '39', '17', '4342', '4838', '0'), +('10', '39', '17', '2405', '2628', '0'), +('10', '39', '7', '2289', '3215', '0'), +('10', '39', '7', '1362', '3124', '0'), +('10', '39', '7', '1321', '1746', '0'), +('10', '39', '7', '71303', '1638', '0'), +('10', '39', '9', '27727', '7398', '0'), +('10', '39', '9', '2290', '3019', '0'), +('10', '39', '9', '14650', '2412', '0'), +('10', '39', '9', '4874', '2410', '0'), +('10', '39', '15', '10366', '4805', '0'), +('10', '39', '15', '10151', '4200', '0'), +('10', '39', '15', '27730', '3930', '0'), +('10', '39', '15', '10163', '3800', '0'), +('10', '39', '20', '11666', '12532', '0'), +('10', '39', '20', '27727', '7398', '0'), +('10', '39', '20', '2742', '5773', '0'), +('10', '39', '20', '1543', '5546', '0'), +('10', '39', '12', '20655', '4685', '0'), +('10', '39', '12', '2923', '4324', '0'), +('10', '39', '12', '2291', '3830', '0'), +('10', '39', '12', '4835', '3453', '0'), +('10', '39', '18', '2461', '2827', '0'), +('10', '39', '18', '2292', '2726', '0'), +('10', '39', '18', '4876', '2656', '0'), +('10', '39', '18', '4410', '1642', '0'), +('10', '39', '19', '2293', '4648', '0'), +('10', '39', '19', '4407', '4300', '0'), +('10', '39', '19', '68239', '4087', '0'), +('10', '39', '19', '4837', '3379', '0'), +('10', '39', '13', '27729', '14598', '0'), +('10', '39', '13', '11694', '14569', '0'), +('10', '39', '13', '10333', '6800', '0'), +('10', '39', '13', '13730', '5003', '0'), +('10', '39', '14', '10335', '8469', '0'), +('10', '39', '14', '12802', '7434', '0'), +('10', '39', '14', '10333', '6800', '0'), +('10', '39', '14', '13991', '5711', '0'), +('10', '39', '11', '9246', '4723', '0'), +('10', '39', '11', '7051', '4512', '0'), +('10', '39', '11', '14762', '3204', '0'), +('10', '39', '11', '7048', '1568', '0'), +('10', '40', '22', '9246', '0', '0'), +('10', '40', '22', '21518', '0', '0'), +('10', '40', '22', '10323', '0', '0'), +('10', '40', '22', '44492', '0', '0'), +('10', '40', '1', '14702', '5000', '0'), +('10', '40', '1', '14701', '4612', '0'), +('10', '40', '1', '30361', '2640', '0'), +('10', '40', '1', '14630', '1450', '0'), +('10', '40', '2', '10143', '7118', '0'), +('10', '40', '2', '30363', '3700', '0'), +('10', '40', '2', '2294', '3006', '0'), +('10', '40', '2', '2191', '2970', '0'), +('10', '40', '3', '11052', '7248', '0'), +('10', '40', '3', '4505', '3413', '0'), +('10', '40', '3', '14695', '3391', '0'), +('10', '40', '3', '2295', '1985', '0'), +('10', '40', '5', '14703', '8800', '0'), +('10', '40', '5', '27726', '5364', '0'), +('10', '40', '5', '14700', '4818', '0'), +('10', '40', '5', '68291', '4519', '0'), +('10', '40', '8', '1546', '12935', '0'), +('10', '40', '8', '11603', '12659', '0'), +('10', '40', '8', '2349', '3554', '0'), +('10', '40', '8', '11621', '3521', '0'), +('10', '40', '6', '27728', '6759', '0'), +('10', '40', '6', '1557', '5310', '0'), +('10', '40', '6', '1904', '3896', '0'), +('10', '40', '6', '1401', '2924', '0'), +('10', '40', '17', '2285', '11299', '0'), +('10', '40', '17', '4872', '9591', '0'), +('10', '40', '17', '4342', '4959', '0'), +('10', '40', '17', '2405', '2694', '0'), +('10', '40', '7', '2289', '3263', '0'), +('10', '40', '7', '1362', '3124', '0'), +('10', '40', '7', '1321', '1746', '0'), +('10', '40', '7', '71303', '1675', '0'), +('10', '40', '9', '27727', '7458', '0'), +('10', '40', '9', '2290', '3083', '0'), +('10', '40', '9', '4874', '2470', '0'), +('10', '40', '9', '4406', '2444', '0'), +('10', '40', '15', '10366', '4805', '0'), +('10', '40', '15', '10151', '4200', '0'), +('10', '40', '15', '27730', '4014', '0'), +('10', '40', '15', '10163', '3800', '0'), +('10', '40', '20', '11666', '12544', '0'), +('10', '40', '20', '27727', '7458', '0'), +('10', '40', '20', '2742', '5791', '0'), +('10', '40', '20', '1543', '5667', '0'), +('10', '40', '12', '20655', '4713', '0'), +('10', '40', '12', '2923', '4324', '0'), +('10', '40', '12', '2291', '3830', '0'), +('10', '40', '12', '4835', '3462', '0'), +('10', '40', '18', '2461', '2875', '0'), +('10', '40', '18', '2292', '2774', '0'), +('10', '40', '18', '4876', '2717', '0'), +('10', '40', '18', '4410', '1642', '0'), +('10', '40', '19', '2293', '4685', '0'), +('10', '40', '19', '4407', '4409', '0'), +('10', '40', '19', '68239', '4123', '0'), +('10', '40', '19', '4837', '3440', '0'), +('10', '40', '13', '27729', '14767', '0'), +('10', '40', '13', '11694', '14750', '0'), +('10', '40', '13', '10333', '6800', '0'), +('10', '40', '13', '13730', '5121', '0'), +('10', '40', '14', '10335', '8687', '0'), +('10', '40', '14', '12802', '7495', '0'), +('10', '40', '14', '10333', '6800', '0'), +('10', '40', '14', '13991', '5832', '0'), +('10', '40', '11', '9246', '4844', '0'), +('10', '40', '11', '7051', '4572', '0'), +('10', '40', '11', '14762', '3204', '0'), +('10', '40', '11', '7048', '1604', '0'), +('10', '41', '22', '9246', '0', '0'), +('10', '41', '22', '21518', '0', '0'), +('10', '41', '22', '10323', '0', '0'), +('10', '41', '22', '44492', '0', '0'), +('10', '41', '1', '14702', '5000', '0'), +('10', '41', '1', '14701', '4612', '0'), +('10', '41', '1', '30361', '2640', '0'), +('10', '41', '1', '14630', '1486', '0'), +('10', '41', '2', '10143', '7118', '0'), +('10', '41', '2', '30363', '3700', '0'), +('10', '41', '2', '2191', '3043', '0'), +('10', '41', '2', '2294', '3030', '0'), +('10', '41', '3', '11052', '7429', '0'), +('10', '41', '3', '4505', '3497', '0'), +('10', '41', '3', '14695', '3475', '0'), +('10', '41', '3', '2295', '2009', '0'), +('10', '41', '5', '14703', '8800', '0'), +('10', '41', '5', '27726', '5461', '0'), +('10', '41', '5', '14700', '4818', '0'), +('10', '41', '5', '68291', '4567', '0'), +('10', '41', '8', '1546', '13055', '0'), +('10', '41', '8', '11603', '12768', '0'), +('10', '41', '8', '2349', '3554', '0'), +('10', '41', '8', '11621', '3521', '0'), +('10', '41', '6', '27728', '6904', '0'), +('10', '41', '6', '1557', '5310', '0'), +('10', '41', '6', '1904', '3992', '0'), +('10', '41', '6', '1401', '2924', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '41', '17', '2285', '11348', '0'), +('10', '41', '17', '4872', '9764', '0'), +('10', '41', '17', '4342', '5080', '0'), +('10', '41', '17', '2405', '2760', '0'), +('10', '41', '7', '2289', '3311', '0'), +('10', '41', '7', '1362', '3124', '0'), +('10', '41', '7', '1321', '1746', '0'), +('10', '41', '7', '71303', '1711', '0'), +('10', '41', '9', '27727', '7519', '0'), +('10', '41', '9', '2290', '3147', '0'), +('10', '41', '9', '4874', '2531', '0'), +('10', '41', '9', '4406', '2504', '0'), +('10', '41', '15', '10366', '4805', '0'), +('10', '41', '15', '10151', '4200', '0'), +('10', '41', '15', '27730', '4099', '0'), +('10', '41', '15', '10163', '3800', '0'), +('10', '41', '20', '11666', '12557', '0'), +('10', '41', '20', '27727', '7519', '0'), +('10', '41', '20', '2742', '5809', '0'), +('10', '41', '20', '1543', '5787', '0'), +('10', '41', '12', '20655', '4741', '0'), +('10', '41', '12', '2923', '4324', '0'), +('10', '41', '12', '2291', '3830', '0'), +('10', '41', '12', '4835', '3471', '0'), +('10', '41', '18', '2461', '2923', '0'), +('10', '41', '18', '2292', '2822', '0'), +('10', '41', '18', '4876', '2777', '0'), +('10', '41', '18', '4410', '1642', '0'), +('10', '41', '19', '2293', '4721', '0'), +('10', '41', '19', '4407', '4518', '0'), +('10', '41', '19', '68239', '4159', '0'), +('10', '41', '19', '4837', '3500', '0'), +('10', '41', '13', '27729', '14936', '0'), +('10', '41', '13', '11694', '14932', '0'), +('10', '41', '13', '10333', '6800', '0'), +('10', '41', '13', '13730', '5239', '0'), +('10', '41', '14', '10335', '8904', '0'), +('10', '41', '14', '12802', '7555', '0'), +('10', '41', '14', '10333', '6800', '0'), +('10', '41', '14', '13991', '5953', '0'), +('10', '41', '11', '9246', '4965', '0'), +('10', '41', '11', '7051', '4632', '0'), +('10', '41', '11', '14762', '3204', '0'), +('10', '41', '11', '7048', '1641', '0'), +('10', '42', '22', '9246', '0', '0'), +('10', '42', '22', '21518', '0', '0'), +('10', '42', '22', '10323', '0', '0'), +('10', '42', '22', '44492', '0', '0'), +('10', '42', '1', '14702', '5000', '0'), +('10', '42', '1', '14701', '4612', '0'), +('10', '42', '1', '30361', '2640', '0'), +('10', '42', '1', '14630', '1522', '0'), +('10', '42', '2', '10143', '7118', '0'), +('10', '42', '2', '30363', '3700', '0'), +('10', '42', '2', '2191', '3115', '0'), +('10', '42', '2', '2294', '3055', '0'), +('10', '42', '3', '11052', '7610', '0'), +('10', '42', '3', '4505', '3582', '0'), +('10', '42', '3', '14695', '3560', '0'), +('10', '42', '3', '14692', '2034', '0'), +('10', '42', '5', '14703', '8800', '0'), +('10', '42', '5', '27726', '5557', '0'), +('10', '42', '5', '14700', '4818', '0'), +('10', '42', '5', '68291', '4616', '0'), +('10', '42', '8', '1546', '13176', '0'), +('10', '42', '8', '11603', '12877', '0'), +('10', '42', '8', '2349', '3554', '0'), +('10', '42', '8', '11621', '3521', '0'), +('10', '42', '6', '27728', '7049', '0'), +('10', '42', '6', '1557', '5310', '0'), +('10', '42', '6', '1904', '4089', '0'), +('10', '42', '6', '1401', '2924', '0'), +('10', '42', '17', '2285', '11396', '0'), +('10', '42', '17', '4872', '9938', '0'), +('10', '42', '17', '4342', '5200', '0'), +('10', '42', '17', '2405', '2826', '0'), +('10', '42', '7', '2289', '3360', '0'), +('10', '42', '7', '1362', '3124', '0'), +('10', '42', '7', '71303', '1747', '0'), +('10', '42', '7', '1321', '1746', '0'), +('10', '42', '9', '27727', '7579', '0'), +('10', '42', '9', '2290', '3211', '0'), +('10', '42', '9', '4874', '2591', '0'), +('10', '42', '9', '4406', '2565', '0'), +('10', '42', '15', '10366', '4805', '0'), +('10', '42', '15', '10151', '4200', '0'), +('10', '42', '15', '27730', '4184', '0'), +('10', '42', '15', '10163', '3800', '0'), +('10', '42', '20', '11666', '12570', '0'), +('10', '42', '20', '27727', '7579', '0'), +('10', '42', '20', '1543', '5908', '0'), +('10', '42', '20', '2742', '5827', '0'), +('10', '42', '12', '20655', '4768', '0'), +('10', '42', '12', '2923', '4324', '0'), +('10', '42', '12', '2291', '3830', '0'), +('10', '42', '12', '4835', '3480', '0'), +('10', '42', '18', '2461', '2972', '0'), +('10', '42', '18', '2292', '2871', '0'), +('10', '42', '18', '4876', '2837', '0'), +('10', '42', '18', '4410', '1642', '0'), +('10', '42', '19', '2293', '4757', '0'), +('10', '42', '19', '4407', '4626', '0'), +('10', '42', '19', '68239', '4196', '0'), +('10', '42', '19', '4837', '3561', '0'), +('10', '42', '13', '11694', '15113', '0'), +('10', '42', '13', '27729', '15105', '0'), +('10', '42', '13', '10333', '6800', '0'), +('10', '42', '13', '13730', '5357', '0'), +('10', '42', '14', '10335', '9122', '0'), +('10', '42', '14', '12802', '7615', '0'), +('10', '42', '14', '10333', '6800', '0'), +('10', '42', '14', '13991', '6074', '0'), +('10', '42', '11', '9246', '5086', '0'), +('10', '42', '11', '7051', '4693', '0'), +('10', '42', '11', '14762', '3204', '0'), +('10', '42', '11', '7048', '1677', '0'), +('10', '43', '22', '9246', '0', '0'), +('10', '43', '22', '21518', '0', '0'), +('10', '43', '22', '10323', '0', '0'), +('10', '43', '22', '44492', '0', '0'), +('10', '43', '1', '14702', '5000', '0'), +('10', '43', '1', '14701', '4612', '0'), +('10', '43', '1', '30361', '2640', '0'), +('10', '43', '1', '14630', '1558', '0'), +('10', '43', '2', '10143', '7118', '0'), +('10', '43', '2', '30363', '3700', '0'), +('10', '43', '2', '2191', '3188', '0'), +('10', '43', '2', '2294', '3079', '0'), +('10', '43', '3', '11052', '7792', '0'), +('10', '43', '3', '4505', '3666', '0'), +('10', '43', '3', '14695', '3645', '0'), +('10', '43', '3', '14692', '2083', '0'), +('10', '43', '5', '14703', '8800', '0'), +('10', '43', '5', '27726', '5654', '0'), +('10', '43', '5', '14700', '4818', '0'), +('10', '43', '5', '68291', '4664', '0'), +('10', '43', '8', '1546', '13297', '0'), +('10', '43', '8', '11603', '12985', '0'), +('10', '43', '8', '2349', '3554', '0'), +('10', '43', '8', '11621', '3521', '0'), +('10', '43', '6', '27728', '7194', '0'), +('10', '43', '6', '1557', '5310', '0'), +('10', '43', '6', '1904', '4186', '0'), +('10', '43', '6', '1401', '2924', '0'), +('10', '43', '17', '2285', '11444', '0'), +('10', '43', '17', '4872', '10111', '0'), +('10', '43', '17', '4342', '5321', '0'), +('10', '43', '17', '2405', '2891', '0'), +('10', '43', '7', '2289', '3408', '0'), +('10', '43', '7', '1362', '3124', '0'), +('10', '43', '7', '71303', '1783', '0'), +('10', '43', '7', '1321', '1746', '0'), +('10', '43', '9', '27727', '7639', '0'), +('10', '43', '9', '2290', '3275', '0'), +('10', '43', '9', '4874', '2652', '0'), +('10', '43', '9', '4406', '2625', '0'), +('10', '43', '15', '10366', '4805', '0'), +('10', '43', '15', '27730', '4268', '0'), +('10', '43', '15', '10151', '4200', '0'), +('10', '43', '15', '10163', '3800', '0'), +('10', '43', '20', '11666', '12582', '0'), +('10', '43', '20', '27727', '7639', '0'), +('10', '43', '20', '1543', '6029', '0'), +('10', '43', '20', '2742', '5846', '0'), +('10', '43', '12', '20655', '4796', '0'), +('10', '43', '12', '2923', '4324', '0'), +('10', '43', '12', '2291', '3830', '0'), +('10', '43', '12', '4835', '3489', '0'), +('10', '43', '18', '2461', '3020', '0'), +('10', '43', '18', '2292', '2919', '0'), +('10', '43', '18', '4876', '2898', '0'), +('10', '43', '18', '4410', '1642', '0'), +('10', '43', '19', '2293', '4793', '0'), +('10', '43', '19', '4407', '4735', '0'), +('10', '43', '19', '68239', '4232', '0'), +('10', '43', '19', '4837', '3621', '0'), +('10', '43', '13', '11694', '15294', '0'), +('10', '43', '13', '27729', '15274', '0'), +('10', '43', '13', '10333', '6800', '0'), +('10', '43', '13', '13730', '5474', '0'), +('10', '43', '14', '10335', '9339', '0'), +('10', '43', '14', '12802', '7676', '0'), +('10', '43', '14', '10333', '6800', '0'), +('10', '43', '14', '13991', '6194', '0'), +('10', '43', '11', '9246', '5206', '0'), +('10', '43', '11', '7051', '4753', '0'), +('10', '43', '11', '14762', '3204', '0'), +('10', '43', '11', '7048', '1713', '0'), +('10', '44', '22', '9246', '0', '0'), +('10', '44', '22', '21518', '0', '0'), +('10', '44', '22', '10323', '0', '0'), +('10', '44', '22', '44492', '0', '0'), +('10', '44', '1', '14702', '5000', '0'), +('10', '44', '1', '14701', '4612', '0'), +('10', '44', '1', '30361', '2640', '0'), +('10', '44', '1', '14630', '1595', '0'), +('10', '44', '2', '10143', '7118', '0'), +('10', '44', '2', '30363', '3700', '0'), +('10', '44', '2', '2191', '3260', '0'), +('10', '44', '2', '2294', '3103', '0'), +('10', '44', '3', '11052', '7973', '0'), +('10', '44', '3', '4505', '3751', '0'), +('10', '44', '3', '14695', '3729', '0'), +('10', '44', '3', '14692', '2131', '0'), +('10', '44', '5', '14703', '8800', '0'), +('10', '44', '5', '27726', '5750', '0'), +('10', '44', '5', '14700', '4818', '0'), +('10', '44', '5', '68291', '4712', '0'), +('10', '44', '8', '1546', '13418', '0'), +('10', '44', '8', '11603', '13094', '0'), +('10', '44', '8', '2349', '3554', '0'), +('10', '44', '8', '11621', '3521', '0'), +('10', '44', '6', '27728', '7339', '0'), +('10', '44', '6', '1557', '5310', '0'), +('10', '44', '6', '1904', '4282', '0'), +('10', '44', '6', '1401', '2924', '0'), +('10', '44', '17', '2285', '11493', '0'), +('10', '44', '17', '4872', '10284', '0'), +('10', '44', '17', '4342', '5442', '0'), +('10', '44', '17', '2405', '2957', '0'), +('10', '44', '7', '2289', '3456', '0'), +('10', '44', '7', '1362', '3124', '0'), +('10', '44', '7', '71303', '1820', '0'), +('10', '44', '7', '1321', '1746', '0'), +('10', '44', '9', '27727', '7700', '0'), +('10', '44', '9', '2290', '3339', '0'), +('10', '44', '9', '4874', '2712', '0'), +('10', '44', '9', '4406', '2685', '0'), +('10', '44', '15', '10366', '4805', '0'), +('10', '44', '15', '27730', '4353', '0'), +('10', '44', '15', '10151', '4200', '0'), +('10', '44', '15', '10163', '3800', '0'), +('10', '44', '20', '11666', '12595', '0'), +('10', '44', '20', '27727', '7700', '0'), +('10', '44', '20', '1543', '6150', '0'), +('10', '44', '20', '2742', '5864', '0'), +('10', '44', '12', '20655', '4824', '0'), +('10', '44', '12', '2923', '4324', '0'), +('10', '44', '12', '2291', '3830', '0'), +('10', '44', '12', '4835', '3498', '0'), +('10', '44', '18', '2461', '3068', '0'), +('10', '44', '18', '2292', '2967', '0'), +('10', '44', '18', '4876', '2958', '0'), +('10', '44', '18', '4410', '1642', '0'), +('10', '44', '19', '4407', '4844', '0'), +('10', '44', '19', '2293', '4830', '0'), +('10', '44', '19', '68239', '4268', '0'), +('10', '44', '19', '4837', '3681', '0'), +('10', '44', '13', '11694', '15475', '0'), +('10', '44', '13', '27729', '15443', '0'), +('10', '44', '13', '10333', '6800', '0'), +('10', '44', '13', '13730', '5592', '0'), +('10', '44', '14', '10335', '9556', '0'), +('10', '44', '14', '12802', '7736', '0'), +('10', '44', '14', '10333', '6800', '0'), +('10', '44', '14', '13991', '6315', '0'), +('10', '44', '11', '9246', '5327', '0'), +('10', '44', '11', '7051', '4814', '0'), +('10', '44', '11', '14762', '3204', '0'), +('10', '44', '11', '7048', '1749', '0'), +('10', '45', '22', '9246', '0', '0'), +('10', '45', '22', '21518', '0', '0'), +('10', '45', '22', '10323', '0', '0'), +('10', '45', '22', '44492', '0', '0'), +('10', '45', '1', '14702', '5000', '0'), +('10', '45', '1', '14701', '4612', '0'), +('10', '45', '1', '30361', '2640', '0'), +('10', '45', '1', '14630', '1631', '0'), +('10', '45', '2', '10143', '7118', '0'), +('10', '45', '2', '30363', '3700', '0'), +('10', '45', '2', '2191', '3333', '0'), +('10', '45', '2', '2294', '3127', '0'), +('10', '45', '3', '11052', '8154', '0'), +('10', '45', '3', '4505', '3835', '0'), +('10', '45', '3', '14695', '3814', '0'), +('10', '45', '3', '14692', '2179', '0'), +('10', '45', '5', '14703', '8800', '0'), +('10', '45', '5', '27726', '5847', '0'), +('10', '45', '5', '14700', '4818', '0'), +('10', '45', '5', '68291', '4761', '0'), +('10', '45', '8', '1546', '13539', '0'), +('10', '45', '8', '11603', '13203', '0'), +('10', '45', '8', '2349', '3554', '0'), +('10', '45', '8', '11621', '3521', '0'), +('10', '45', '6', '27728', '7484', '0'), +('10', '45', '6', '1557', '5310', '0'), +('10', '45', '6', '1904', '4379', '0'), +('10', '45', '6', '1401', '2924', '0'), +('10', '45', '17', '2285', '11541', '0'), +('10', '45', '17', '4872', '10458', '0'), +('10', '45', '17', '4342', '5563', '0'), +('10', '45', '17', '2405', '3023', '0'), +('10', '45', '7', '2289', '3505', '0'), +('10', '45', '7', '1362', '3124', '0'), +('10', '45', '7', '71303', '1856', '0'), +('10', '45', '7', '1321', '1746', '0'), +('10', '45', '9', '27727', '7760', '0'), +('10', '45', '9', '2290', '3403', '0'), +('10', '45', '9', '4874', '2772', '0'), +('10', '45', '9', '4406', '2746', '0'), +('10', '45', '15', '10366', '4805', '0'), +('10', '45', '15', '27730', '4437', '0'), +('10', '45', '15', '10151', '4200', '0'), +('10', '45', '15', '10163', '3800', '0'), +('10', '45', '20', '11666', '12608', '0'), +('10', '45', '20', '27727', '7760', '0'), +('10', '45', '20', '1543', '6271', '0'), +('10', '45', '20', '2742', '5882', '0'), +('10', '45', '12', '20655', '4852', '0'), +('10', '45', '12', '2923', '4324', '0'), +('10', '45', '12', '2291', '3830', '0'), +('10', '45', '12', '4835', '3507', '0'), +('10', '45', '18', '2461', '3117', '0'), +('10', '45', '18', '4876', '3019', '0'), +('10', '45', '18', '2292', '3015', '0'), +('10', '45', '18', '4410', '1642', '0'), +('10', '45', '19', '4407', '4953', '0'), +('10', '45', '19', '2293', '4866', '0'), +('10', '45', '19', '68239', '4304', '0'), +('10', '45', '19', '4837', '3742', '0'), +('10', '45', '13', '11694', '15656', '0'), +('10', '45', '13', '27729', '15612', '0'), +('10', '45', '13', '10333', '6800', '0'), +('10', '45', '13', '13730', '5710', '0'), +('10', '45', '14', '10335', '9774', '0'), +('10', '45', '14', '12802', '7797', '0'), +('10', '45', '14', '10333', '6800', '0'), +('10', '45', '14', '13991', '6436', '0'), +('10', '45', '11', '9246', '5448', '0'), +('10', '45', '11', '7051', '4874', '0'), +('10', '45', '11', '14762', '3204', '0'), +('10', '45', '11', '7048', '1786', '0'), +('10', '46', '22', '9246', '0', '0'), +('10', '46', '22', '21518', '0', '0'), +('10', '46', '22', '10323', '0', '0'), +('10', '46', '22', '44492', '0', '0'), +('10', '46', '1', '14702', '5000', '0'), +('10', '46', '1', '14701', '4612', '0'), +('10', '46', '1', '30361', '2640', '0'), +('10', '46', '1', '14630', '1667', '0'), +('10', '46', '2', '10143', '7118', '0'), +('10', '46', '2', '30363', '3700', '0'), +('10', '46', '2', '2191', '3405', '0'), +('10', '46', '2', '2294', '3151', '0'), +('10', '46', '3', '11052', '8335', '0'), +('10', '46', '3', '4505', '3920', '0'), +('10', '46', '3', '14695', '3898', '0'), +('10', '46', '3', '14692', '2228', '0'), +('10', '46', '5', '14703', '8800', '0'), +('10', '46', '5', '27726', '5944', '0'), +('10', '46', '5', '14700', '4818', '0'), +('10', '46', '5', '68291', '4809', '0'), +('10', '46', '8', '1546', '13659', '0'), +('10', '46', '8', '11603', '13312', '0'), +('10', '46', '8', '2349', '3554', '0'), +('10', '46', '8', '11621', '3521', '0'), +('10', '46', '6', '27728', '7629', '0'), +('10', '46', '6', '1557', '5310', '0'), +('10', '46', '6', '1904', '4476', '0'), +('10', '46', '6', '1401', '2924', '0'), +('10', '46', '17', '2285', '11589', '0'), +('10', '46', '17', '4872', '10631', '0'), +('10', '46', '17', '4342', '5684', '0'), +('10', '46', '17', '2405', '3089', '0'), +('10', '46', '7', '2289', '3553', '0'), +('10', '46', '7', '1362', '3124', '0'), +('10', '46', '7', '71303', '1892', '0'), +('10', '46', '7', '1321', '1746', '0'), +('10', '46', '9', '27727', '7821', '0'), +('10', '46', '9', '2290', '3467', '0'), +('10', '46', '9', '4874', '2833', '0'), +('10', '46', '9', '4406', '2806', '0'), +('10', '46', '15', '10366', '4805', '0'), +('10', '46', '15', '27730', '4522', '0'), +('10', '46', '15', '10151', '4200', '0'), +('10', '46', '15', '10163', '3800', '0'), +('10', '46', '20', '11666', '12620', '0'), +('10', '46', '20', '27727', '7821', '0'), +('10', '46', '20', '1543', '6391', '0'), +('10', '46', '20', '2742', '5900', '0'), +('10', '46', '12', '20655', '4880', '0'), +('10', '46', '12', '2923', '4324', '0'), +('10', '46', '12', '2291', '3830', '0'), +('10', '46', '12', '4835', '3516', '0'), +('10', '46', '18', '2461', '3165', '0'), +('10', '46', '18', '4876', '3079', '0'), +('10', '46', '18', '2292', '3064', '0'), +('10', '46', '18', '4410', '1642', '0'), +('10', '46', '19', '4407', '5061', '0'), +('10', '46', '19', '2293', '4902', '0'), +('10', '46', '19', '68239', '4340', '0'), +('10', '46', '19', '4837', '3802', '0'), +('10', '46', '13', '11694', '15838', '0'), +('10', '46', '13', '27729', '15781', '0'), +('10', '46', '13', '10333', '6800', '0'), +('10', '46', '13', '13730', '5828', '0'), +('10', '46', '14', '10335', '9991', '0'), +('10', '46', '14', '12802', '7857', '0'), +('10', '46', '14', '10333', '6800', '0'), +('10', '46', '14', '13991', '6557', '0'), +('10', '46', '11', '9246', '5569', '0'), +('10', '46', '11', '7051', '4934', '0'), +('10', '46', '11', '14762', '3204', '0'), +('10', '46', '11', '7048', '1822', '0'), +('10', '47', '22', '9246', '0', '0'), +('10', '47', '22', '21518', '0', '0'), +('10', '47', '22', '10323', '0', '0'), +('10', '47', '22', '44492', '0', '0'), +('10', '47', '1', '14702', '5000', '0'), +('10', '47', '1', '14701', '4612', '0'), +('10', '47', '1', '30361', '2640', '0'), +('10', '47', '1', '14630', '1703', '0'), +('10', '47', '2', '10143', '7118', '0'), +('10', '47', '2', '30363', '3700', '0'), +('10', '47', '2', '2191', '3478', '0'), +('10', '47', '2', '2294', '3175', '0'), +('10', '47', '3', '11052', '8516', '0'), +('10', '47', '3', '4505', '4005', '0'), +('10', '47', '3', '14695', '3983', '0'), +('10', '47', '3', '14692', '2276', '0'), +('10', '47', '5', '14703', '8800', '0'), +('10', '47', '5', '27726', '6040', '0'), +('10', '47', '5', '68291', '4857', '0'), +('10', '47', '5', '14700', '4818', '0'), +('10', '47', '8', '1546', '13780', '0'), +('10', '47', '8', '11603', '13420', '0'), +('10', '47', '8', '2349', '3554', '0'), +('10', '47', '8', '11621', '3521', '0'), +('10', '47', '6', '27728', '7774', '0'), +('10', '47', '6', '1557', '5310', '0'), +('10', '47', '6', '1904', '4572', '0'), +('10', '47', '6', '1401', '2924', '0'), +('10', '47', '17', '2285', '11637', '0'), +('10', '47', '17', '4872', '10804', '0'), +('10', '47', '17', '4342', '5804', '0'), +('10', '47', '17', '2405', '3155', '0'), +('10', '47', '7', '2289', '3601', '0'), +('10', '47', '7', '1362', '3124', '0'), +('10', '47', '7', '71303', '1928', '0'), +('10', '47', '7', '1321', '1746', '0'), +('10', '47', '9', '27727', '7881', '0'), +('10', '47', '9', '2290', '3531', '0'), +('10', '47', '9', '4874', '2893', '0'), +('10', '47', '9', '4406', '2867', '0'), +('10', '47', '15', '10366', '4805', '0'), +('10', '47', '15', '27730', '4606', '0'), +('10', '47', '15', '10151', '4200', '0'), +('10', '47', '15', '10163', '3800', '0'), +('10', '47', '20', '11666', '12633', '0'), +('10', '47', '20', '27727', '7881', '0'), +('10', '47', '20', '1543', '6512', '0'), +('10', '47', '20', '2742', '5918', '0'), +('10', '47', '12', '20655', '4907', '0'), +('10', '47', '12', '2923', '4324', '0'), +('10', '47', '12', '2291', '3830', '0'), +('10', '47', '12', '4835', '3525', '0'), +('10', '47', '18', '2461', '3213', '0'), +('10', '47', '18', '4876', '3139', '0'), +('10', '47', '18', '2292', '3112', '0'), +('10', '47', '18', '4410', '1642', '0'), +('10', '47', '19', '4407', '5170', '0'), +('10', '47', '19', '2293', '4938', '0'), +('10', '47', '19', '68239', '4377', '0'), +('10', '47', '19', '4837', '3863', '0'), +('10', '47', '13', '11694', '16019', '0'), +('10', '47', '13', '27729', '15951', '0'), +('10', '47', '13', '10333', '6800', '0'), +('10', '47', '13', '13730', '5945', '0'), +('10', '47', '14', '10335', '10209', '0'), +('10', '47', '14', '12802', '7917', '0'), +('10', '47', '14', '10333', '6800', '0'), +('10', '47', '14', '13991', '6678', '0'), +('10', '47', '11', '9246', '5690', '0'), +('10', '47', '11', '7051', '4995', '0'), +('10', '47', '11', '14762', '3204', '0'), +('10', '47', '11', '7048', '1858', '0'), +('10', '48', '22', '9246', '0', '0'), +('10', '48', '22', '21518', '0', '0'), +('10', '48', '22', '10323', '0', '0'), +('10', '48', '22', '44492', '0', '0'), +('10', '48', '1', '14702', '5000', '0'), +('10', '48', '1', '14701', '4612', '0'), +('10', '48', '1', '30361', '2640', '0'), +('10', '48', '1', '14630', '1740', '0'), +('10', '48', '2', '10143', '7118', '0'), +('10', '48', '2', '30363', '3700', '0'), +('10', '48', '2', '2191', '3550', '0'), +('10', '48', '2', '2294', '3200', '0'), +('10', '48', '3', '11052', '8698', '0'), +('10', '48', '3', '4505', '4089', '0'), +('10', '48', '3', '14695', '4067', '0'), +('10', '48', '3', '14692', '2324', '0'), +('10', '48', '5', '14703', '8800', '0'), +('10', '48', '5', '27726', '6137', '0'), +('10', '48', '5', '68291', '4906', '0'), +('10', '48', '5', '14700', '4818', '0'), +('10', '48', '8', '1546', '13901', '0'), +('10', '48', '8', '11603', '13529', '0'), +('10', '48', '8', '2349', '3554', '0'), +('10', '48', '8', '11621', '3521', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '48', '6', '27728', '7918', '0'), +('10', '48', '6', '1557', '5310', '0'), +('10', '48', '6', '1904', '4669', '0'), +('10', '48', '6', '1401', '2924', '0'), +('10', '48', '17', '2285', '11686', '0'), +('10', '48', '17', '4872', '10978', '0'), +('10', '48', '17', '4342', '5925', '0'), +('10', '48', '17', '2405', '3221', '0'), +('10', '48', '7', '2289', '3650', '0'), +('10', '48', '7', '1362', '3124', '0'), +('10', '48', '7', '71303', '1965', '0'), +('10', '48', '7', '1321', '1746', '0'), +('10', '48', '9', '27727', '7941', '0'), +('10', '48', '9', '2290', '3595', '0'), +('10', '48', '9', '4874', '2954', '0'), +('10', '48', '9', '4406', '2927', '0'), +('10', '48', '15', '10366', '4805', '0'), +('10', '48', '15', '27730', '4691', '0'), +('10', '48', '15', '10151', '4200', '0'), +('10', '48', '15', '10163', '3800', '0'), +('10', '48', '20', '11666', '12646', '0'), +('10', '48', '20', '27727', '7941', '0'), +('10', '48', '20', '1543', '6633', '0'), +('10', '48', '20', '2742', '5936', '0'), +('10', '48', '12', '20655', '4935', '0'), +('10', '48', '12', '2923', '4324', '0'), +('10', '48', '12', '2291', '3830', '0'), +('10', '48', '12', '4835', '3535', '0'), +('10', '48', '18', '2461', '3262', '0'), +('10', '48', '18', '4876', '3200', '0'), +('10', '48', '18', '2292', '3160', '0'), +('10', '48', '18', '4410', '1642', '0'), +('10', '48', '19', '4407', '5279', '0'), +('10', '48', '19', '2293', '4975', '0'), +('10', '48', '19', '68239', '4413', '0'), +('10', '48', '19', '4837', '3923', '0'), +('10', '48', '13', '11694', '16200', '0'), +('10', '48', '13', '27729', '16120', '0'), +('10', '48', '13', '10333', '6800', '0'), +('10', '48', '13', '13730', '6063', '0'), +('10', '48', '14', '10335', '10426', '0'), +('10', '48', '14', '12802', '7978', '0'), +('10', '48', '14', '10333', '6800', '0'), +('10', '48', '14', '13991', '6798', '0'), +('10', '48', '11', '9246', '5810', '0'), +('10', '48', '11', '7051', '5055', '0'), +('10', '48', '11', '14762', '3204', '0'), +('10', '48', '11', '7048', '1894', '0'), +('10', '49', '22', '9246', '0', '0'), +('10', '49', '22', '21518', '0', '0'), +('10', '49', '22', '10323', '0', '0'), +('10', '49', '22', '44492', '0', '0'), +('10', '49', '1', '14702', '5000', '0'), +('10', '49', '1', '14701', '4612', '0'), +('10', '49', '1', '30361', '2640', '0'), +('10', '49', '1', '14630', '1776', '0'), +('10', '49', '2', '10143', '7118', '0'), +('10', '49', '2', '30363', '3700', '0'), +('10', '49', '2', '2191', '3623', '0'), +('10', '49', '2', '2294', '3224', '0'), +('10', '49', '3', '11052', '8879', '0'), +('10', '49', '3', '4505', '4174', '0'), +('10', '49', '3', '14695', '4152', '0'), +('10', '49', '3', '14692', '2373', '0'), +('10', '49', '5', '14703', '8800', '0'), +('10', '49', '5', '27726', '6234', '0'), +('10', '49', '5', '68291', '4954', '0'), +('10', '49', '5', '14700', '4818', '0'), +('10', '49', '8', '1546', '14022', '0'), +('10', '49', '8', '11603', '13638', '0'), +('10', '49', '8', '2349', '3554', '0'), +('10', '49', '8', '11621', '3521', '0'), +('10', '49', '6', '27728', '8063', '0'), +('10', '49', '6', '1557', '5310', '0'), +('10', '49', '6', '1904', '4766', '0'), +('10', '49', '6', '1401', '2924', '0'), +('10', '49', '17', '2285', '11734', '0'), +('10', '49', '17', '4872', '11151', '0'), +('10', '49', '17', '4342', '6046', '0'), +('10', '49', '17', '2405', '3286', '0'), +('10', '49', '7', '2289', '3698', '0'), +('10', '49', '7', '1362', '3124', '0'), +('10', '49', '7', '71303', '2001', '0'), +('10', '49', '7', '10336', '1779', '0'), +('10', '49', '9', '27727', '8002', '0'), +('10', '49', '9', '2290', '3659', '0'), +('10', '49', '9', '4874', '3014', '0'), +('10', '49', '9', '4406', '2987', '0'), +('10', '49', '15', '10366', '4805', '0'), +('10', '49', '15', '27730', '4775', '0'), +('10', '49', '15', '10151', '4200', '0'), +('10', '49', '15', '10163', '3800', '0'), +('10', '49', '20', '11666', '12658', '0'), +('10', '49', '20', '27727', '8002', '0'), +('10', '49', '20', '1543', '6754', '0'), +('10', '49', '20', '2742', '5954', '0'), +('10', '49', '12', '20655', '4963', '0'), +('10', '49', '12', '2923', '4324', '0'), +('10', '49', '12', '2291', '3830', '0'), +('10', '49', '12', '4835', '3544', '0'), +('10', '49', '18', '2461', '3310', '0'), +('10', '49', '18', '4876', '3260', '0'), +('10', '49', '18', '2292', '3209', '0'), +('10', '49', '18', '4410', '1642', '0'), +('10', '49', '19', '4407', '5387', '0'), +('10', '49', '19', '2293', '5011', '0'), +('10', '49', '19', '68239', '4449', '0'), +('10', '49', '19', '4837', '3983', '0'), +('10', '49', '13', '11694', '16381', '0'), +('10', '49', '13', '27729', '16289', '0'), +('10', '49', '13', '10333', '6800', '0'), +('10', '49', '13', '13730', '6181', '0'), +('10', '49', '14', '10335', '10644', '0'), +('10', '49', '14', '12802', '8038', '0'), +('10', '49', '14', '13991', '6919', '0'), +('10', '49', '14', '10333', '6800', '0'), +('10', '49', '11', '9246', '5931', '0'), +('10', '49', '11', '7051', '5116', '0'), +('10', '49', '11', '14762', '3204', '0'), +('10', '49', '11', '7048', '1931', '0'), +('10', '50', '22', '9246', '0', '0'), +('10', '50', '22', '21518', '0', '0'), +('10', '50', '22', '10323', '0', '0'), +('10', '50', '22', '44492', '0', '0'), +('10', '50', '1', '14702', '5000', '0'), +('10', '50', '1', '14701', '4612', '0'), +('10', '50', '1', '30361', '2640', '0'), +('10', '50', '1', '14630', '1812', '0'), +('10', '50', '2', '10143', '7118', '0'), +('10', '50', '2', '30363', '3700', '0'), +('10', '50', '2', '2191', '3695', '0'), +('10', '50', '2', '2294', '3248', '0'), +('10', '50', '3', '11052', '9060', '0'), +('10', '50', '3', '4505', '4258', '0'), +('10', '50', '3', '14695', '4236', '0'), +('10', '50', '3', '14692', '2421', '0'), +('10', '50', '5', '14703', '8800', '0'), +('10', '50', '5', '27726', '6330', '0'), +('10', '50', '5', '68291', '5002', '0'), +('10', '50', '5', '14700', '4818', '0'), +('10', '50', '8', '1546', '14143', '0'), +('10', '50', '8', '11603', '13746', '0'), +('10', '50', '8', '2349', '3554', '0'), +('10', '50', '8', '11621', '3521', '0'), +('10', '50', '6', '27728', '8208', '0'), +('10', '50', '6', '1557', '5310', '0'), +('10', '50', '6', '1904', '4862', '0'), +('10', '50', '6', '1401', '2924', '0'), +('10', '50', '17', '2285', '11782', '0'), +('10', '50', '17', '4872', '11324', '0'), +('10', '50', '17', '4342', '6167', '0'), +('10', '50', '17', '2405', '3352', '0'), +('10', '50', '7', '2289', '3746', '0'), +('10', '50', '7', '1362', '3124', '0'), +('10', '50', '7', '71303', '2037', '0'), +('10', '50', '7', '10336', '1816', '0'), +('10', '50', '9', '27727', '8062', '0'), +('10', '50', '9', '2290', '3723', '0'), +('10', '50', '9', '4874', '3074', '0'), +('10', '50', '9', '4406', '3048', '0'), +('10', '50', '15', '27730', '4860', '0'), +('10', '50', '15', '10366', '4805', '0'), +('10', '50', '15', '10151', '4200', '0'), +('10', '50', '15', '10163', '3800', '0'), +('10', '50', '20', '11666', '12671', '0'), +('10', '50', '20', '27727', '8062', '0'), +('10', '50', '20', '1543', '6875', '0'), +('10', '50', '20', '2742', '5972', '0'), +('10', '50', '12', '20655', '4991', '0'), +('10', '50', '12', '2923', '4324', '0'), +('10', '50', '12', '2291', '3830', '0'), +('10', '50', '12', '4835', '3553', '0'), +('10', '50', '18', '2461', '3358', '0'), +('10', '50', '18', '4876', '3321', '0'), +('10', '50', '18', '2292', '3257', '0'), +('10', '50', '18', '4410', '1642', '0'), +('10', '50', '19', '4407', '5496', '0'), +('10', '50', '19', '2293', '5047', '0'), +('10', '50', '19', '68239', '4485', '0'), +('10', '50', '19', '4837', '4044', '0'), +('10', '50', '13', '11694', '16562', '0'), +('10', '50', '13', '27729', '16458', '0'), +('10', '50', '13', '10333', '6800', '0'), +('10', '50', '13', '13730', '6299', '0'), +('10', '50', '14', '10335', '10861', '0'), +('10', '50', '14', '12802', '8099', '0'), +('10', '50', '14', '13991', '7040', '0'), +('10', '50', '14', '10333', '6800', '0'), +('10', '50', '11', '9246', '6052', '0'), +('10', '50', '11', '7051', '5176', '0'), +('10', '50', '11', '14762', '3204', '0'), +('10', '50', '11', '7048', '1967', '0'), +('10', '51', '22', '9246', '0', '0'), +('10', '51', '22', '21518', '0', '0'), +('10', '51', '22', '10323', '0', '0'), +('10', '51', '22', '44492', '0', '0'), +('10', '51', '1', '14702', '5000', '0'), +('10', '51', '1', '14701', '4612', '0'), +('10', '51', '1', '30361', '2640', '0'), +('10', '51', '1', '14630', '1848', '0'), +('10', '51', '2', '10143', '7118', '0'), +('10', '51', '2', '2191', '3768', '0'), +('10', '51', '2', '30363', '3700', '0'), +('10', '51', '2', '2294', '3272', '0'), +('10', '51', '3', '11052', '9241', '0'), +('10', '51', '3', '4505', '4343', '0'), +('10', '51', '3', '14695', '4321', '0'), +('10', '51', '3', '14692', '2469', '0'), +('10', '51', '5', '14703', '8800', '0'), +('10', '51', '5', '27726', '6427', '0'), +('10', '51', '5', '68291', '5051', '0'), +('10', '51', '5', '14700', '4818', '0'), +('10', '51', '8', '1546', '14263', '0'), +('10', '51', '8', '11603', '13855', '0'), +('10', '51', '8', '2349', '3554', '0'), +('10', '51', '8', '11621', '3521', '0'), +('10', '51', '6', '27728', '8353', '0'), +('10', '51', '6', '1557', '5310', '0'), +('10', '51', '6', '1904', '4959', '0'), +('10', '51', '6', '1401', '2924', '0'), +('10', '51', '17', '2285', '11831', '0'), +('10', '51', '17', '4872', '11498', '0'), +('10', '51', '17', '4342', '6288', '0'), +('10', '51', '17', '2405', '3418', '0'), +('10', '51', '7', '2289', '3795', '0'), +('10', '51', '7', '1362', '3124', '0'), +('10', '51', '7', '71303', '2073', '0'), +('10', '51', '7', '10336', '1852', '0'), +('10', '51', '9', '27727', '8123', '0'), +('10', '51', '9', '2290', '3787', '0'), +('10', '51', '9', '4874', '3135', '0'), +('10', '51', '9', '4406', '3108', '0'), +('10', '51', '15', '27730', '4945', '0'), +('10', '51', '15', '10366', '4805', '0'), +('10', '51', '15', '10151', '4200', '0'), +('10', '51', '15', '10163', '3800', '0'), +('10', '51', '20', '11666', '12684', '0'), +('10', '51', '20', '27727', '8123', '0'), +('10', '51', '20', '1543', '6995', '0'), +('10', '51', '20', '2742', '5991', '0'), +('10', '51', '12', '20655', '5018', '0'), +('10', '51', '12', '2923', '4324', '0'), +('10', '51', '12', '2291', '3830', '0'), +('10', '51', '12', '4835', '3562', '0'), +('10', '51', '18', '2461', '3407', '0'), +('10', '51', '18', '4876', '3381', '0'), +('10', '51', '18', '2292', '3305', '0'), +('10', '51', '18', '4410', '1642', '0'), +('10', '51', '19', '4407', '5605', '0'), +('10', '51', '19', '2293', '5083', '0'), +('10', '51', '19', '68239', '4522', '0'), +('10', '51', '19', '4837', '4104', '0'), +('10', '51', '13', '11694', '16744', '0'), +('10', '51', '13', '27729', '16627', '0'), +('10', '51', '13', '10333', '6800', '0'), +('10', '51', '13', '13730', '6417', '0'), +('10', '51', '14', '10335', '11079', '0'), +('10', '51', '14', '12802', '8159', '0'), +('10', '51', '14', '13991', '7161', '0'), +('10', '51', '14', '10333', '6800', '0'), +('10', '51', '11', '9246', '6173', '0'), +('10', '51', '11', '7051', '5236', '0'), +('10', '51', '11', '14762', '3204', '0'), +('10', '51', '11', '7048', '2003', '0'), +('10', '52', '22', '9246', '0', '0'), +('10', '52', '22', '21518', '0', '0'), +('10', '52', '22', '10323', '0', '0'), +('10', '52', '22', '44492', '0', '0'), +('10', '52', '1', '14702', '5000', '0'), +('10', '52', '1', '14701', '4612', '0'), +('10', '52', '1', '30361', '2640', '0'), +('10', '52', '1', '14630', '1884', '0'), +('10', '52', '2', '10143', '7118', '0'), +('10', '52', '2', '2191', '3840', '0'), +('10', '52', '2', '30363', '3700', '0'), +('10', '52', '2', '2294', '3296', '0'), +('10', '52', '3', '11052', '9422', '0'), +('10', '52', '3', '4505', '4427', '0'), +('10', '52', '3', '14695', '4406', '0'), +('10', '52', '3', '14692', '2517', '0'), +('10', '52', '5', '14703', '8800', '0'), +('10', '52', '5', '27726', '6524', '0'), +('10', '52', '5', '68291', '5099', '0'), +('10', '52', '5', '14700', '4818', '0'), +('10', '52', '8', '1546', '14384', '0'), +('10', '52', '8', '11603', '13964', '0'), +('10', '52', '8', '2349', '3554', '0'), +('10', '52', '8', '11621', '3521', '0'), +('10', '52', '6', '27728', '8498', '0'), +('10', '52', '6', '1557', '5310', '0'), +('10', '52', '6', '1904', '5055', '0'), +('10', '52', '6', '1401', '2924', '0'), +('10', '52', '17', '2285', '11879', '0'), +('10', '52', '17', '4872', '11671', '0'), +('10', '52', '17', '4342', '6408', '0'), +('10', '52', '17', '2405', '3484', '0'), +('10', '52', '7', '2289', '3843', '0'), +('10', '52', '7', '1362', '3124', '0'), +('10', '52', '7', '71303', '2110', '0'), +('10', '52', '7', '10336', '1888', '0'), +('10', '52', '9', '27727', '8183', '0'), +('10', '52', '9', '2290', '3851', '0'), +('10', '52', '9', '4874', '3195', '0'), +('10', '52', '9', '4406', '3169', '0'), +('10', '52', '15', '27730', '5029', '0'), +('10', '52', '15', '10366', '4805', '0'), +('10', '52', '15', '10151', '4200', '0'), +('10', '52', '15', '10163', '3800', '0'), +('10', '52', '20', '11666', '12696', '0'), +('10', '52', '20', '27727', '8183', '0'), +('10', '52', '20', '1543', '7116', '0'), +('10', '52', '20', '2742', '6009', '0'), +('10', '52', '12', '20655', '5046', '0'), +('10', '52', '12', '2923', '4324', '0'), +('10', '52', '12', '2291', '3830', '0'), +('10', '52', '12', '4835', '3571', '0'), +('10', '52', '18', '2461', '3455', '0'), +('10', '52', '18', '4876', '3441', '0'), +('10', '52', '18', '2292', '3354', '0'), +('10', '52', '18', '4410', '1642', '0'), +('10', '52', '19', '4407', '5714', '0'), +('10', '52', '19', '2293', '5120', '0'), +('10', '52', '19', '68239', '4558', '0'), +('10', '52', '19', '4837', '4165', '0'), +('10', '52', '13', '11694', '16925', '0'), +('10', '52', '13', '27729', '16796', '0'), +('10', '52', '13', '10333', '6800', '0'), +('10', '52', '13', '13730', '6534', '0'), +('10', '52', '14', '10335', '11296', '0'), +('10', '52', '14', '12802', '8219', '0'), +('10', '52', '14', '13991', '7282', '0'), +('10', '52', '14', '10333', '6800', '0'), +('10', '52', '11', '9246', '6294', '0'), +('10', '52', '11', '7051', '5297', '0'), +('10', '52', '11', '14762', '3204', '0'), +('10', '52', '11', '7048', '2039', '0'), +('10', '53', '22', '9246', '0', '0'), +('10', '53', '22', '21518', '0', '0'), +('10', '53', '22', '10323', '0', '0'), +('10', '53', '22', '44492', '0', '0'), +('10', '53', '1', '14702', '5000', '0'), +('10', '53', '1', '14701', '4612', '0'), +('10', '53', '1', '30361', '2640', '0'), +('10', '53', '1', '14630', '1921', '0'), +('10', '53', '2', '10143', '7118', '0'), +('10', '53', '2', '2191', '3913', '0'), +('10', '53', '2', '30363', '3700', '0'), +('10', '53', '2', '2294', '3320', '0'), +('10', '53', '3', '11052', '9604', '0'), +('10', '53', '3', '4505', '4512', '0'), +('10', '53', '3', '14695', '4490', '0'), +('10', '53', '3', '14692', '2566', '0'), +('10', '53', '5', '14703', '8800', '0'), +('10', '53', '5', '27726', '6620', '0'), +('10', '53', '5', '68291', '5147', '0'), +('10', '53', '5', '14700', '4818', '0'), +('10', '53', '8', '1546', '14505', '0'), +('10', '53', '8', '11603', '14073', '0'), +('10', '53', '8', '2349', '3554', '0'), +('10', '53', '8', '11621', '3521', '0'), +('10', '53', '6', '27728', '8643', '0'), +('10', '53', '6', '1557', '5310', '0'), +('10', '53', '6', '1904', '5152', '0'), +('10', '53', '6', '1401', '2924', '0'), +('10', '53', '17', '2285', '11927', '0'), +('10', '53', '17', '4872', '11844', '0'), +('10', '53', '17', '4342', '6529', '0'), +('10', '53', '17', '2405', '3550', '0'), +('10', '53', '7', '2289', '3891', '0'), +('10', '53', '7', '1362', '3124', '0'), +('10', '53', '7', '71303', '2146', '0'), +('10', '53', '7', '10336', '1924', '0'), +('10', '53', '9', '27727', '8243', '0'), +('10', '53', '9', '2290', '3915', '0'), +('10', '53', '9', '4874', '3256', '0'), +('10', '53', '9', '4406', '3229', '0'), +('10', '53', '15', '27730', '5114', '0'), +('10', '53', '15', '10366', '4805', '0'), +('10', '53', '15', '10151', '4200', '0'), +('10', '53', '15', '14631', '3841', '0'), +('10', '53', '20', '11666', '12709', '0'), +('10', '53', '20', '27727', '8243', '0'), +('10', '53', '20', '1543', '7237', '0'), +('10', '53', '20', '2742', '6027', '0'), +('10', '53', '12', '20655', '5074', '0'), +('10', '53', '12', '2923', '4324', '0'), +('10', '53', '12', '2291', '3830', '0'), +('10', '53', '12', '4835', '3580', '0'), +('10', '53', '18', '2461', '3503', '0'), +('10', '53', '18', '4876', '3502', '0'), +('10', '53', '18', '2292', '3402', '0'), +('10', '53', '18', '4410', '1642', '0'), +('10', '53', '19', '4407', '5822', '0'), +('10', '53', '19', '2293', '5156', '0'), +('10', '53', '19', '68239', '4594', '0'), +('10', '53', '19', '4837', '4225', '0'), +('10', '53', '13', '11694', '17106', '0'), +('10', '53', '13', '27729', '16965', '0'), +('10', '53', '13', '10333', '6800', '0'), +('10', '53', '13', '13730', '6652', '0'), +('10', '53', '14', '10335', '11513', '0'), +('10', '53', '14', '12802', '8280', '0'), +('10', '53', '14', '13991', '7402', '0'), +('10', '53', '14', '10333', '6800', '0'), +('10', '53', '11', '9246', '6414', '0'), +('10', '53', '11', '7051', '5357', '0'), +('10', '53', '11', '14762', '3204', '0'), +('10', '53', '11', '7048', '2076', '0'), +('10', '54', '22', '9246', '0', '0'), +('10', '54', '22', '21518', '0', '0'), +('10', '54', '22', '10323', '0', '0'), +('10', '54', '22', '44492', '0', '0'), +('10', '54', '1', '14702', '5000', '0'), +('10', '54', '1', '14701', '4612', '0'), +('10', '54', '1', '30361', '2640', '0'), +('10', '54', '1', '14630', '1957', '0'), +('10', '54', '2', '10143', '7118', '0'), +('10', '54', '2', '2191', '3985', '0'), +('10', '54', '2', '30363', '3700', '0'), +('10', '54', '2', '2294', '3345', '0'), +('10', '54', '3', '11052', '9785', '0'), +('10', '54', '3', '4505', '4596', '0'), +('10', '54', '3', '14695', '4575', '0'), +('10', '54', '3', '14692', '2614', '0'), +('10', '54', '5', '14703', '8800', '0'), +('10', '54', '5', '27726', '6717', '0'), +('10', '54', '5', '68291', '5196', '0'), +('10', '54', '5', '14700', '4818', '0'), +('10', '54', '8', '1546', '14626', '0'), +('10', '54', '8', '11603', '14181', '0'), +('10', '54', '8', '2349', '3554', '0'), +('10', '54', '8', '11621', '3521', '0'), +('10', '54', '6', '27728', '8788', '0'), +('10', '54', '6', '1557', '5310', '0'), +('10', '54', '6', '1904', '5249', '0'), +('10', '54', '6', '1401', '2924', '0'), +('10', '54', '17', '4872', '12018', '0'), +('10', '54', '17', '2285', '11976', '0'), +('10', '54', '17', '4342', '6650', '0'), +('10', '54', '17', '2405', '3616', '0'), +('10', '54', '7', '2289', '3939', '0'), +('10', '54', '7', '1362', '3124', '0'), +('10', '54', '7', '71303', '2182', '0'), +('10', '54', '7', '10336', '1961', '0'), +('10', '54', '9', '27727', '8304', '0'), +('10', '54', '9', '2290', '3979', '0'), +('10', '54', '9', '4874', '3316', '0'), +('10', '54', '9', '4406', '3289', '0'), +('10', '54', '15', '27730', '5198', '0'), +('10', '54', '15', '10366', '4805', '0'), +('10', '54', '15', '10151', '4200', '0'), +('10', '54', '15', '14631', '3914', '0'), +('10', '54', '20', '11666', '12722', '0'), +('10', '54', '20', '27727', '8304', '0'), +('10', '54', '20', '1543', '7358', '0'), +('10', '54', '20', '2742', '6045', '0'), +('10', '54', '12', '20655', '5102', '0'), +('10', '54', '12', '2923', '4324', '0'), +('10', '54', '12', '2291', '3830', '0'), +('10', '54', '12', '4345', '3634', '0'), +('10', '54', '18', '4876', '3562', '0'), +('10', '54', '18', '2461', '3552', '0'), +('10', '54', '18', '2292', '3450', '0'), +('10', '54', '18', '4410', '1642', '0'), +('10', '54', '19', '4407', '5931', '0'), +('10', '54', '19', '2293', '5192', '0'), +('10', '54', '19', '68239', '4630', '0'), +('10', '54', '19', '4837', '4285', '0'), +('10', '54', '13', '11694', '17287', '0'), +('10', '54', '13', '27729', '17134', '0'), +('10', '54', '13', '10333', '6800', '0'), +('10', '54', '13', '13730', '6770', '0'), +('10', '54', '14', '10335', '11731', '0'), +('10', '54', '14', '12802', '8340', '0'), +('10', '54', '14', '13991', '7523', '0'), +('10', '54', '14', '9407', '6831', '0'), +('10', '54', '11', '9246', '6535', '0'), +('10', '54', '11', '7051', '5418', '0'), +('10', '54', '11', '14762', '3204', '0'), +('10', '54', '11', '7048', '2112', '0'), +('10', '55', '22', '9246', '0', '0'), +('10', '55', '22', '21518', '0', '0'), +('10', '55', '22', '10323', '0', '0'), +('10', '55', '22', '44492', '0', '0'), +('10', '55', '1', '14702', '5000', '0'), +('10', '55', '1', '14701', '4612', '0'), +('10', '55', '1', '30361', '2640', '0'), +('10', '55', '1', '14630', '1993', '0'), +('10', '55', '2', '10143', '7118', '0'), +('10', '55', '2', '2191', '4058', '0'), +('10', '55', '2', '30363', '3700', '0'), +('10', '55', '2', '4947', '3394', '0'), +('10', '55', '3', '11052', '9966', '0'), +('10', '55', '3', '4505', '4681', '0'), +('10', '55', '3', '14695', '4659', '0'), +('10', '55', '3', '14692', '2662', '0'), +('10', '55', '5', '14703', '8800', '0'), +('10', '55', '5', '27726', '6814', '0'), +('10', '55', '5', '68291', '5244', '0'), +('10', '55', '5', '14700', '4818', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '55', '8', '1546', '14747', '0'), +('10', '55', '8', '11603', '14290', '0'), +('10', '55', '8', '2349', '3554', '0'), +('10', '55', '8', '11621', '3521', '0'), +('10', '55', '6', '27728', '8933', '0'), +('10', '55', '6', '1904', '5345', '0'), +('10', '55', '6', '1557', '5310', '0'), +('10', '55', '6', '1401', '2924', '0'), +('10', '55', '17', '4872', '12191', '0'), +('10', '55', '17', '2285', '12024', '0'), +('10', '55', '17', '4342', '6771', '0'), +('10', '55', '17', '2405', '3681', '0'), +('10', '55', '7', '2289', '3988', '0'), +('10', '55', '7', '1362', '3124', '0'), +('10', '55', '7', '71303', '2218', '0'), +('10', '55', '7', '10336', '1997', '0'), +('10', '55', '9', '27727', '8364', '0'), +('10', '55', '9', '2290', '4043', '0'), +('10', '55', '9', '4874', '3376', '0'), +('10', '55', '9', '4406', '3350', '0'), +('10', '55', '15', '27730', '5283', '0'), +('10', '55', '15', '10366', '4805', '0'), +('10', '55', '15', '10151', '4200', '0'), +('10', '55', '15', '14631', '3986', '0'), +('10', '55', '20', '11666', '12734', '0'), +('10', '55', '20', '27727', '8364', '0'), +('10', '55', '20', '1543', '7479', '0'), +('10', '55', '20', '2742', '6063', '0'), +('10', '55', '12', '20655', '5130', '0'), +('10', '55', '12', '2923', '4324', '0'), +('10', '55', '12', '2291', '3830', '0'), +('10', '55', '12', '4345', '3694', '0'), +('10', '55', '18', '4876', '3623', '0'), +('10', '55', '18', '2461', '3600', '0'), +('10', '55', '18', '2292', '3499', '0'), +('10', '55', '18', '4410', '1642', '0'), +('10', '55', '19', '4407', '6040', '0'), +('10', '55', '19', '2293', '5228', '0'), +('10', '55', '19', '68239', '4667', '0'), +('10', '55', '19', '4837', '4346', '0'), +('10', '55', '13', '11694', '17468', '0'), +('10', '55', '13', '27729', '17304', '0'), +('10', '55', '13', '13730', '6888', '0'), +('10', '55', '13', '10333', '6800', '0'), +('10', '55', '14', '10335', '11948', '0'), +('10', '55', '14', '12802', '8401', '0'), +('10', '55', '14', '13991', '7644', '0'), +('10', '55', '14', '9407', '6952', '0'), +('10', '55', '11', '9246', '6656', '0'), +('10', '55', '11', '7051', '5478', '0'), +('10', '55', '11', '14762', '3204', '0'), +('10', '55', '11', '7048', '2148', '0'), +('10', '56', '22', '9246', '0', '0'), +('10', '56', '22', '21518', '0', '0'), +('10', '56', '22', '10323', '0', '0'), +('10', '56', '22', '44492', '0', '0'), +('10', '56', '1', '14702', '5000', '0'), +('10', '56', '1', '14701', '4612', '0'), +('10', '56', '1', '30361', '2640', '0'), +('10', '56', '1', '14630', '2029', '0'), +('10', '56', '2', '10143', '7118', '0'), +('10', '56', '2', '2191', '4130', '0'), +('10', '56', '2', '30363', '3700', '0'), +('10', '56', '2', '4947', '3455', '0'), +('10', '56', '3', '11052', '10147', '0'), +('10', '56', '3', '4505', '4766', '0'), +('10', '56', '3', '14695', '4744', '0'), +('10', '56', '3', '14692', '2711', '0'), +('10', '56', '5', '14703', '8800', '0'), +('10', '56', '5', '27726', '6910', '0'), +('10', '56', '5', '68291', '5292', '0'), +('10', '56', '5', '14700', '4818', '0'), +('10', '56', '8', '1546', '14867', '0'), +('10', '56', '8', '11603', '14399', '0'), +('10', '56', '8', '2349', '3554', '0'), +('10', '56', '8', '11621', '3521', '0'), +('10', '56', '6', '27728', '9078', '0'), +('10', '56', '6', '1904', '5442', '0'), +('10', '56', '6', '1557', '5310', '0'), +('10', '56', '6', '1401', '2924', '0'), +('10', '56', '17', '4872', '12365', '0'), +('10', '56', '17', '2285', '12072', '0'), +('10', '56', '17', '4342', '6892', '0'), +('10', '56', '17', '2405', '3747', '0'), +('10', '56', '7', '2289', '4036', '0'), +('10', '56', '7', '1362', '3124', '0'), +('10', '56', '7', '71303', '2255', '0'), +('10', '56', '7', '10336', '2033', '0'), +('10', '56', '9', '27727', '8425', '0'), +('10', '56', '9', '2290', '4107', '0'), +('10', '56', '9', '4874', '3437', '0'), +('10', '56', '9', '4406', '3410', '0'), +('10', '56', '15', '27730', '5367', '0'), +('10', '56', '15', '10366', '4805', '0'), +('10', '56', '15', '10151', '4200', '0'), +('10', '56', '15', '14631', '4059', '0'), +('10', '56', '20', '11666', '12747', '0'), +('10', '56', '20', '27727', '8425', '0'), +('10', '56', '20', '1543', '7599', '0'), +('10', '56', '20', '2742', '6081', '0'), +('10', '56', '12', '20655', '5157', '0'), +('10', '56', '12', '2923', '4324', '0'), +('10', '56', '12', '2291', '3830', '0'), +('10', '56', '12', '4345', '3755', '0'), +('10', '56', '18', '4876', '3683', '0'), +('10', '56', '18', '2461', '3648', '0'), +('10', '56', '18', '2292', '3547', '0'), +('10', '56', '18', '4410', '1642', '0'), +('10', '56', '19', '4407', '6149', '0'), +('10', '56', '19', '2293', '5264', '0'), +('10', '56', '19', '68239', '4703', '0'), +('10', '56', '19', '4837', '4406', '0'), +('10', '56', '13', '11694', '17650', '0'), +('10', '56', '13', '27729', '17473', '0'), +('10', '56', '13', '13730', '7005', '0'), +('10', '56', '13', '10333', '6800', '0'), +('10', '56', '14', '10335', '12166', '0'), +('10', '56', '14', '12802', '8461', '0'), +('10', '56', '14', '13991', '7765', '0'), +('10', '56', '14', '9407', '7073', '0'), +('10', '56', '11', '9246', '6777', '0'), +('10', '56', '11', '7051', '5538', '0'), +('10', '56', '11', '14762', '3204', '0'), +('10', '56', '11', '7048', '2184', '0'), +('10', '57', '22', '9246', '0', '0'), +('10', '57', '22', '21518', '0', '0'), +('10', '57', '22', '10323', '0', '0'), +('10', '57', '22', '44492', '0', '0'), +('10', '57', '1', '14702', '5000', '0'), +('10', '57', '1', '14701', '4612', '0'), +('10', '57', '1', '30361', '2640', '0'), +('10', '57', '1', '14630', '2066', '0'), +('10', '57', '2', '10143', '7118', '0'), +('10', '57', '2', '2191', '4203', '0'), +('10', '57', '2', '30363', '3700', '0'), +('10', '57', '2', '4947', '3515', '0'), +('10', '57', '3', '11052', '10328', '0'), +('10', '57', '3', '4505', '4850', '0'), +('10', '57', '3', '14695', '4828', '0'), +('10', '57', '3', '14692', '2759', '0'), +('10', '57', '5', '14703', '8800', '0'), +('10', '57', '5', '27726', '7007', '0'), +('10', '57', '5', '68291', '5340', '0'), +('10', '57', '5', '14700', '4818', '0'), +('10', '57', '8', '1546', '14988', '0'), +('10', '57', '8', '11603', '14507', '0'), +('10', '57', '8', '2349', '3554', '0'), +('10', '57', '8', '11621', '3521', '0'), +('10', '57', '6', '27728', '9223', '0'), +('10', '57', '6', '1904', '5539', '0'), +('10', '57', '6', '1557', '5310', '0'), +('10', '57', '6', '1401', '2924', '0'), +('10', '57', '17', '4872', '12538', '0'), +('10', '57', '17', '2285', '12121', '0'), +('10', '57', '17', '4342', '7012', '0'), +('10', '57', '17', '2405', '3813', '0'), +('10', '57', '7', '2289', '4084', '0'), +('10', '57', '7', '1362', '3124', '0'), +('10', '57', '7', '71303', '2291', '0'), +('10', '57', '7', '10336', '2069', '0'), +('10', '57', '9', '27727', '8485', '0'), +('10', '57', '9', '2290', '4171', '0'), +('10', '57', '9', '4874', '3497', '0'), +('10', '57', '9', '4406', '3471', '0'), +('10', '57', '15', '27730', '5452', '0'), +('10', '57', '15', '10366', '4805', '0'), +('10', '57', '15', '10151', '4200', '0'), +('10', '57', '15', '14631', '4131', '0'), +('10', '57', '20', '11666', '12760', '0'), +('10', '57', '20', '27727', '8485', '0'), +('10', '57', '20', '1543', '7720', '0'), +('10', '57', '20', '2742', '6099', '0'), +('10', '57', '12', '20655', '5185', '0'), +('10', '57', '12', '2923', '4324', '0'), +('10', '57', '12', '2291', '3830', '0'), +('10', '57', '12', '4345', '3815', '0'), +('10', '57', '18', '4876', '3743', '0'), +('10', '57', '18', '2461', '3697', '0'), +('10', '57', '18', '2292', '3595', '0'), +('10', '57', '18', '4410', '1642', '0'), +('10', '57', '19', '4407', '6257', '0'), +('10', '57', '19', '2293', '5301', '0'), +('10', '57', '19', '68239', '4739', '0'), +('10', '57', '19', '4837', '4467', '0'), +('10', '57', '13', '11694', '17831', '0'), +('10', '57', '13', '27729', '17642', '0'), +('10', '57', '13', '13730', '7123', '0'), +('10', '57', '13', '9246', '6898', '0'), +('10', '57', '14', '10335', '12383', '0'), +('10', '57', '14', '12802', '8521', '0'), +('10', '57', '14', '13991', '7886', '0'), +('10', '57', '14', '9407', '7194', '0'), +('10', '57', '11', '9246', '6898', '0'), +('10', '57', '11', '7051', '5599', '0'), +('10', '57', '11', '14762', '3204', '0'), +('10', '57', '11', '7048', '2221', '0'), +('10', '58', '22', '9246', '0', '0'), +('10', '58', '22', '21518', '0', '0'), +('10', '58', '22', '10323', '0', '0'), +('10', '58', '22', '44492', '0', '0'), +('10', '58', '1', '14702', '5000', '0'), +('10', '58', '1', '14701', '4612', '0'), +('10', '58', '1', '30361', '2640', '0'), +('10', '58', '1', '14630', '2102', '0'), +('10', '58', '2', '10143', '7118', '0'), +('10', '58', '2', '2191', '4275', '0'), +('10', '58', '2', '30363', '3700', '0'), +('10', '58', '2', '4947', '3576', '0'), +('10', '58', '3', '11052', '10510', '0'), +('10', '58', '3', '4505', '4935', '0'), +('10', '58', '3', '14695', '4913', '0'), +('10', '58', '3', '14692', '2807', '0'), +('10', '58', '5', '14703', '8800', '0'), +('10', '58', '5', '27726', '7103', '0'), +('10', '58', '5', '68291', '5389', '0'), +('10', '58', '5', '14700', '4818', '0'), +('10', '58', '8', '1546', '15109', '0'), +('10', '58', '8', '11603', '14616', '0'), +('10', '58', '8', '2349', '3554', '0'), +('10', '58', '8', '11621', '3521', '0'), +('10', '58', '6', '27728', '9368', '0'), +('10', '58', '6', '1904', '5635', '0'), +('10', '58', '6', '1557', '5310', '0'), +('10', '58', '6', '1401', '2924', '0'), +('10', '58', '17', '4872', '12711', '0'), +('10', '58', '17', '2285', '12169', '0'), +('10', '58', '17', '4342', '7133', '0'), +('10', '58', '17', '2405', '3879', '0'), +('10', '58', '7', '2289', '4133', '0'), +('10', '58', '7', '1362', '3124', '0'), +('10', '58', '7', '71303', '2327', '0'), +('10', '58', '7', '10336', '2106', '0'), +('10', '58', '9', '27727', '8545', '0'), +('10', '58', '9', '2290', '4235', '0'), +('10', '58', '9', '4874', '3558', '0'), +('10', '58', '9', '4406', '3531', '0'), +('10', '58', '15', '27730', '5536', '0'), +('10', '58', '15', '10366', '4805', '0'), +('10', '58', '15', '14631', '4204', '0'), +('10', '58', '15', '10151', '4200', '0'), +('10', '58', '20', '11666', '12773', '0'), +('10', '58', '20', '27727', '8545', '0'), +('10', '58', '20', '1543', '7841', '0'), +('10', '58', '20', '2742', '6117', '0'), +('10', '58', '12', '20655', '5213', '0'), +('10', '58', '12', '2923', '4324', '0'), +('10', '58', '12', '4345', '3876', '0'), +('10', '58', '12', '2291', '3830', '0'), +('10', '58', '18', '4876', '3804', '0'), +('10', '58', '18', '2461', '3745', '0'), +('10', '58', '18', '2292', '3644', '0'), +('10', '58', '18', '4410', '1642', '0'), +('10', '58', '19', '4407', '6366', '0'), +('10', '58', '19', '2293', '5337', '0'), +('10', '58', '19', '68239', '4775', '0'), +('10', '58', '19', '4837', '4527', '0'), +('10', '58', '13', '11694', '18012', '0'), +('10', '58', '13', '27729', '17811', '0'), +('10', '58', '13', '13730', '7241', '0'), +('10', '58', '13', '9246', '7018', '0'), +('10', '58', '14', '10335', '12601', '0'), +('10', '58', '14', '12802', '8582', '0'), +('10', '58', '14', '13991', '8006', '0'), +('10', '58', '14', '9407', '7314', '0'), +('10', '58', '11', '9246', '7018', '0'), +('10', '58', '11', '7051', '5659', '0'), +('10', '58', '11', '14762', '3204', '0'), +('10', '58', '11', '7048', '2257', '0'), +('10', '59', '22', '9246', '0', '0'), +('10', '59', '22', '21518', '0', '0'), +('10', '59', '22', '10323', '0', '0'), +('10', '59', '22', '44492', '0', '0'), +('10', '59', '1', '14702', '5000', '0'), +('10', '59', '1', '14701', '4612', '0'), +('10', '59', '1', '30361', '2640', '0'), +('10', '59', '1', '14630', '2138', '0'), +('10', '59', '2', '10143', '7118', '0'), +('10', '59', '2', '2191', '4348', '0'), +('10', '59', '2', '30363', '3700', '0'), +('10', '59', '2', '4947', '3636', '0'), +('10', '59', '3', '11052', '10691', '0'), +('10', '59', '3', '4505', '5019', '0'), +('10', '59', '3', '14695', '4997', '0'), +('10', '59', '3', '14692', '2856', '0'), +('10', '59', '5', '14703', '8800', '0'), +('10', '59', '5', '27726', '7200', '0'), +('10', '59', '5', '68291', '5437', '0'), +('10', '59', '5', '14700', '4818', '0'), +('10', '59', '8', '1546', '15230', '0'), +('10', '59', '8', '11603', '14725', '0'), +('10', '59', '8', '2349', '3554', '0'), +('10', '59', '8', '11621', '3521', '0'), +('10', '59', '6', '27728', '9513', '0'), +('10', '59', '6', '1904', '5732', '0'), +('10', '59', '6', '1557', '5310', '0'), +('10', '59', '6', '1401', '2924', '0'), +('10', '59', '17', '4872', '12885', '0'), +('10', '59', '17', '2285', '12217', '0'), +('10', '59', '17', '4342', '7254', '0'), +('10', '59', '17', '2405', '3945', '0'), +('10', '59', '7', '2289', '4181', '0'), +('10', '59', '7', '1362', '3124', '0'), +('10', '59', '7', '71303', '2363', '0'), +('10', '59', '7', '10336', '2142', '0'), +('10', '59', '9', '27727', '8606', '0'), +('10', '59', '9', '2290', '4299', '0'), +('10', '59', '9', '4874', '3618', '0'), +('10', '59', '9', '4406', '3591', '0'), +('10', '59', '15', '27730', '5621', '0'), +('10', '59', '15', '10366', '4805', '0'), +('10', '59', '15', '14631', '4276', '0'), +('10', '59', '15', '10151', '4200', '0'), +('10', '59', '20', '11666', '12785', '0'), +('10', '59', '20', '27727', '8606', '0'), +('10', '59', '20', '1543', '7962', '0'), +('10', '59', '20', '2742', '6136', '0'), +('10', '59', '12', '20655', '5241', '0'), +('10', '59', '12', '2923', '4324', '0'), +('10', '59', '12', '4345', '3936', '0'), +('10', '59', '12', '2291', '3830', '0'), +('10', '59', '18', '4876', '3864', '0'), +('10', '59', '18', '2461', '3793', '0'), +('10', '59', '18', '2292', '3692', '0'), +('10', '59', '18', '4410', '1642', '0'), +('10', '59', '19', '4407', '6475', '0'), +('10', '59', '19', '2293', '5373', '0'), +('10', '59', '19', '68239', '4812', '0'), +('10', '59', '19', '4837', '4587', '0'), +('10', '59', '13', '11694', '18193', '0'), +('10', '59', '13', '27729', '17980', '0'), +('10', '59', '13', '13730', '7359', '0'), +('10', '59', '13', '9246', '7139', '0'), +('10', '59', '14', '10335', '12818', '0'), +('10', '59', '14', '12802', '8642', '0'), +('10', '59', '14', '13991', '8127', '0'), +('10', '59', '14', '9407', '7435', '0'), +('10', '59', '11', '9246', '7139', '0'), +('10', '59', '11', '7051', '5720', '0'), +('10', '59', '11', '14762', '3204', '0'), +('10', '59', '11', '7048', '2293', '0'), +('10', '60', '22', '21805', '0', '3'), +('10', '60', '22', '21807', '0', '3'), +('10', '60', '22', '12425', '0', '3'), +('10', '60', '22', '7867', '0', '3'), +('10', '60', '1', '30552', '24371', '3'), +('10', '60', '1', '29861', '17848', '3'), +('10', '60', '1', '63170', '17620', '3'), +('10', '60', '1', '28944', '16421', '3'), +('10', '60', '2', '26763', '37360', '3'), +('10', '60', '2', '1867', '17611', '3'), +('10', '60', '2', '26762', '17536', '3'), +('10', '60', '2', '28909', '17324', '3'), +('10', '60', '3', '28963', '34190', '3'), +('10', '60', '3', '31323', '26102', '3'), +('10', '60', '3', '26785', '23531', '3'), +('10', '60', '3', '30553', '18164', '3'), +('10', '60', '5', '28900', '42243', '3'), +('10', '60', '5', '26505', '24082', '3'), +('10', '60', '5', '8364', '23811', '3'), +('10', '60', '5', '51229', '19666', '3'), +('10', '60', '8', '51240', '40600', '3'), +('10', '60', '8', '1628', '34460', '3'), +('10', '60', '8', '28992', '22509', '3'), +('10', '60', '8', '28918', '19751', '3'), +('10', '60', '6', '30566', '19670', '3'), +('10', '60', '6', '28920', '19492', '3'), +('10', '60', '6', '1200', '19461', '3'), +('10', '60', '6', '28991', '18153', '3'), +('10', '60', '17', '26782', '23702', '3'), +('10', '60', '17', '28951', '17878', '3'), +('10', '60', '17', '10845', '17592', '3'), +('10', '60', '17', '27159', '15550', '3'), +('10', '60', '7', '28925', '19568', '3'), +('10', '60', '7', '7868', '19113', '3'), +('10', '60', '7', '26584', '18399', '3'), +('10', '60', '7', '28991', '18153', '3'), +('10', '60', '9', '26752', '54390', '3'), +('10', '60', '9', '26787', '32392', '3'), +('10', '60', '9', '31314', '26203', '3'), +('10', '60', '9', '30552', '24371', '3'), +('10', '60', '15', '51247', '39408', '3'), +('10', '60', '15', '11541', '23001', '3'), +('10', '60', '15', '28994', '21640', '3'), +('10', '60', '15', '51242', '19682', '3'), +('10', '60', '20', '11666', '32013', '3'), +('10', '60', '20', '28916', '22548', '3'), +('10', '60', '20', '30534', '18711', '3'), +('10', '60', '20', '26549', '18080', '3'), +('10', '60', '12', '30534', '18711', '3'), +('10', '60', '12', '28967', '18253', '3'), +('10', '60', '12', '28991', '18153', '3'), +('10', '60', '12', '31227', '17712', '3'), +('10', '60', '18', '26783', '45811', '3'), +('10', '60', '18', '28932', '17358', '3'), +('10', '60', '18', '8289', '17323', '3'), +('10', '60', '18', '28965', '16855', '3'), +('10', '60', '19', '31327', '32099', '3'), +('10', '60', '19', '31408', '23508', '3'), +('10', '60', '19', '28934', '21903', '3'), +('10', '60', '19', '30570', '20612', '3'), +('10', '60', '13', '28980', '44473', '3'), +('10', '60', '13', '14762', '23200', '3'), +('10', '60', '13', '26784', '22960', '3'), +('10', '60', '13', '28921', '21098', '3'), +('10', '60', '14', '28980', '44473', '3'), +('10', '60', '14', '14762', '23200', '3'), +('10', '60', '14', '26784', '22960', '3'), +('10', '60', '14', '26786', '22260', '3'), +('10', '60', '11', '14762', '23200', '3'), +('10', '60', '11', '26784', '22960', '3'), +('10', '60', '11', '28921', '21098', '3'), +('10', '60', '11', '30562', '18584', '3'), +('10', '60', '22', '10323', '0', '2'), +('10', '60', '22', '9248', '0', '2'), +('10', '60', '22', '9254', '0', '2'), +('10', '60', '22', '9246', '0', '2'), +('10', '60', '1', '2581', '18201', '2'), +('10', '60', '1', '2065', '12104', '2'), +('10', '60', '1', '10912', '9514', '2'), +('10', '60', '1', '62234', '9170', '2'), +('10', '60', '2', '10913', '16138', '2'), +('10', '60', '2', '29648', '14363', '2'), +('10', '60', '2', '31226', '13765', '2'), +('10', '60', '2', '31322', '13285', '2'), +('10', '60', '3', '31233', '18741', '2'), +('10', '60', '3', '31244', '15202', '2'), +('10', '60', '3', '1547', '14568', '2'), +('10', '60', '3', '31463', '11832', '2'), +('10', '60', '5', '31460', '17535', '2'), +('10', '60', '5', '30390', '14540', '2'), +('10', '60', '5', '31318', '14270', '2'), +('10', '60', '5', '29459', '13520', '2'), +('10', '60', '8', '31376', '17991', '2'), +('10', '60', '8', '1628', '16046', '2'), +('10', '60', '8', '5779', '12911', '2'), +('10', '60', '8', '1622', '12614', '2'), +('10', '60', '6', '27151', '10416', '2'), +('10', '60', '6', '29472', '8919', '2'), +('10', '60', '6', '27140', '8815', '2'), +('10', '60', '6', '1114', '7521', '2'), +('10', '60', '17', '10845', '19986', '2'), +('10', '60', '17', '27159', '16544', '2'), +('10', '60', '17', '27148', '14642', '2'), +('10', '60', '17', '31106', '14429', '2'), +('10', '60', '7', '31229', '11762', '2'), +('10', '60', '7', '29485', '10128', '2'), +('10', '60', '7', '31381', '7945', '2'), +('10', '60', '7', '5723', '6611', '2'), +('10', '60', '9', '31460', '17535', '2'), +('10', '60', '9', '31246', '11146', '2'), +('10', '60', '9', '31461', '8298', '2'), +('10', '60', '9', '5723', '6611', '2'), +('10', '60', '15', '25211', '17700', '2'), +('10', '60', '15', '31231', '17533', '2'), +('10', '60', '15', '62373', '10465', '2'), +('10', '60', '15', '5727', '10465', '2'), +('10', '60', '20', '25858', '18787', '2'), +('10', '60', '20', '25199', '18323', '2'), +('10', '60', '20', '2510', '17669', '2'), +('10', '60', '20', '1556', '17317', '2'), +('10', '60', '12', '31227', '19808', '2'), +('10', '60', '12', '25857', '14562', '2'), +('10', '60', '12', '31306', '13988', '2'), +('10', '60', '12', '31402', '5877', '2'), +('10', '60', '18', '31110', '12929', '2'), +('10', '60', '18', '25361', '11466', '2'), +('10', '60', '18', '31012', '11230', '2'), +('10', '60', '18', '25463', '11191', '2'), +('10', '60', '19', '29645', '19790', '2'), +('10', '60', '19', '31245', '19628', '2'), +('10', '60', '19', '31355', '11632', '2'), +('10', '60', '19', '31327', '10080', '2'), +('10', '60', '13', '31373', '16988', '2'), +('10', '60', '13', '5149', '13561', '2'), +('10', '60', '13', '10651', '13118', '2'), +('10', '60', '13', '24609', '13050', '2'), +('10', '60', '14', '31230', '20755', '2'), +('10', '60', '14', '31462', '15367', '2'), +('10', '60', '14', '25098', '12768', '2'), +('10', '60', '14', '31216', '11943', '2'), +('10', '60', '11', '1554', '19067', '2'), +('10', '60', '11', '31465', '16832', '2'), +('10', '60', '11', '2698', '14266', '2'), +('10', '60', '11', '5149', '13558', '2'), +('10', '60', '22', '10323', '0', '1'), +('10', '60', '22', '9246', '0', '1'), +('10', '60', '22', '21518', '0', '1'), +('10', '60', '22', '12425', '0', '1'), +('10', '60', '1', '10912', '13974', '1'), +('10', '60', '1', '62234', '11144', '1'), +('10', '60', '1', '5815', '6035', '1'), +('10', '60', '1', '5814', '6035', '1'), +('10', '60', '2', '10913', '22127', '1'), +('10', '60', '2', '10143', '7111', '1'), +('10', '60', '2', '62138', '5571', '1'), +('10', '60', '2', '5799', '4530', '1'), +('10', '60', '3', '46184', '7726', '1'), +('10', '60', '3', '5780', '7309', '1'), +('10', '60', '3', '11052', '6417', '1'), +('10', '60', '3', '1625', '5981', '1'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '60', '5', '14703', '8800', '1'), +('10', '60', '5', '8285', '5733', '1'), +('10', '60', '5', '27726', '4901', '1'), +('10', '60', '5', '14709', '4835', '1'), +('10', '60', '8', '1628', '20012', '1'), +('10', '60', '8', '1622', '14009', '1'), +('10', '60', '8', '5779', '12936', '1'), +('10', '60', '8', '1546', '12339', '1'), +('10', '60', '6', '5723', '6864', '1'), +('10', '60', '6', '27728', '6069', '1'), +('10', '60', '6', '1557', '5286', '1'), +('10', '60', '6', '4315', '4292', '1'), +('10', '60', '17', '10845', '25970', '1'), +('10', '60', '17', '4530', '13606', '1'), +('10', '60', '17', '2285', '11050', '1'), +('10', '60', '17', '4872', '8732', '1'), +('10', '60', '7', '5723', '6864', '1'), +('10', '60', '7', '62046', '5357', '1'), +('10', '60', '7', '1362', '3114', '1'), +('10', '60', '7', '2289', '3029', '1'), +('10', '60', '9', '27727', '7164', '1'), +('10', '60', '9', '5723', '6864', '1'), +('10', '60', '9', '1618', '4950', '1'), +('10', '60', '9', '2290', '2780', '1'), +('10', '60', '15', '5727', '11294', '1'), +('10', '60', '15', '5728', '8835', '1'), +('10', '60', '15', '5807', '6521', '1'), +('10', '60', '15', '5733', '5600', '1'), +('10', '60', '20', '1556', '20307', '1'), +('10', '60', '20', '11666', '12471', '1'), +('10', '60', '20', '5765', '8016', '1'), +('10', '60', '20', '27727', '7164', '1'), +('10', '60', '12', '20655', '4544', '1'), +('10', '60', '12', '2923', '4314', '1'), +('10', '60', '12', '2291', '3818', '1'), +('10', '60', '12', '4835', '3380', '1'), +('10', '60', '18', '4534', '11017', '1'), +('10', '60', '18', '62164', '10838', '1'), +('10', '60', '18', '2461', '2636', '1'), +('10', '60', '18', '2292', '2535', '1'), +('10', '60', '19', '5749', '4659', '1'), +('10', '60', '19', '2293', '4504', '1'), +('10', '60', '19', '68239', '3931', '1'), +('10', '60', '19', '4407', '3898', '1'), +('10', '60', '13', '10651', '19511', '1'), +('10', '60', '13', '5149', '18461', '1'), +('10', '60', '13', '24609', '15429', '1'), +('10', '60', '13', '27729', '13991', '1'), +('10', '60', '14', '24629', '13134', '1'), +('10', '60', '14', '14745', '8222', '1'), +('10', '60', '14', '10335', '7694', '1'), +('10', '60', '14', '12802', '7185', '1'), +('10', '60', '11', '5149', '18459', '1'), +('10', '60', '11', '7205', '10711', '1'), +('10', '60', '11', '46178', '9611', '1'), +('10', '60', '11', '5148', '9299', '1'), +('10', '61', '22', '21805', '0', '3'), +('10', '61', '22', '21807', '0', '3'), +('10', '61', '22', '12425', '0', '3'), +('10', '61', '22', '7867', '0', '3'), +('10', '61', '1', '30552', '24073', '3'), +('10', '61', '1', '29861', '17854', '3'), +('10', '61', '1', '63170', '17522', '3'), +('10', '61', '1', '28944', '16423', '3'), +('10', '61', '2', '26763', '36613', '3'), +('10', '61', '2', '26762', '17539', '3'), +('10', '61', '2', '28909', '17326', '3'), +('10', '61', '2', '1867', '17282', '3'), +('10', '61', '3', '28963', '33442', '3'), +('10', '61', '3', '31323', '25102', '3'), +('10', '61', '3', '26785', '23357', '3'), +('10', '61', '3', '30553', '18167', '3'), +('10', '61', '5', '28900', '41247', '3'), +('10', '61', '5', '8364', '23815', '3'), +('10', '61', '5', '26505', '22932', '3'), +('10', '61', '5', '51229', '19568', '3'), +('10', '61', '8', '51240', '39601', '3'), +('10', '61', '8', '1628', '33463', '3'), +('10', '61', '8', '28992', '22512', '3'), +('10', '61', '8', '28918', '19751', '3'), +('10', '61', '6', '30566', '19672', '3'), +('10', '61', '6', '28920', '19496', '3'), +('10', '61', '6', '1200', '19063', '3'), +('10', '61', '6', '28991', '18158', '3'), +('10', '61', '17', '26782', '23708', '3'), +('10', '61', '17', '28951', '17878', '3'), +('10', '61', '17', '10845', '17596', '3'), +('10', '61', '17', '27159', '15552', '3'), +('10', '61', '7', '28925', '19572', '3'), +('10', '61', '7', '7868', '19115', '3'), +('10', '61', '7', '26584', '18402', '3'), +('10', '61', '7', '28991', '18158', '3'), +('10', '61', '9', '26752', '52892', '3'), +('10', '61', '9', '26787', '31994', '3'), +('10', '61', '9', '31314', '25203', '3'), +('10', '61', '9', '30552', '24073', '3'), +('10', '61', '15', '51247', '38258', '3'), +('10', '61', '15', '11541', '21851', '3'), +('10', '61', '15', '28994', '21642', '3'), +('10', '61', '15', '51242', '19383', '3'), +('10', '61', '20', '11666', '31013', '3'), +('10', '61', '20', '28916', '22550', '3'), +('10', '61', '20', '30534', '18713', '3'), +('10', '61', '20', '26549', '18084', '3'), +('10', '61', '12', '30534', '18713', '3'), +('10', '61', '12', '28967', '18253', '3'), +('10', '61', '12', '28991', '18158', '3'), +('10', '61', '12', '31227', '17715', '3'), +('10', '61', '18', '26783', '44664', '3'), +('10', '61', '18', '28932', '17361', '3'), +('10', '61', '18', '8289', '17325', '3'), +('10', '61', '18', '28965', '16857', '3'), +('10', '61', '19', '31327', '30951', '3'), +('10', '61', '19', '31408', '22359', '3'), +('10', '61', '19', '28934', '21703', '3'), +('10', '61', '19', '30570', '20614', '3'), +('10', '61', '13', '28980', '43475', '3'), +('10', '61', '13', '26784', '22967', '3'), +('10', '61', '13', '14762', '22200', '3'), +('10', '61', '13', '28921', '21104', '3'), +('10', '61', '14', '28980', '43475', '3'), +('10', '61', '14', '26784', '22967', '3'), +('10', '61', '14', '26786', '22266', '3'), +('10', '61', '14', '14762', '22200', '3'), +('10', '61', '11', '26784', '22967', '3'), +('10', '61', '11', '14762', '22200', '3'), +('10', '61', '11', '28921', '21104', '3'), +('10', '61', '11', '30562', '18586', '3'), +('10', '62', '22', '21805', '0', '3'), +('10', '62', '22', '21807', '0', '3'), +('10', '62', '22', '12425', '0', '3'), +('10', '62', '22', '7867', '0', '3'), +('10', '62', '1', '30552', '23775', '3'), +('10', '62', '1', '29861', '17860', '3'), +('10', '62', '1', '63170', '17424', '3'), +('10', '62', '1', '28944', '16425', '3'), +('10', '62', '2', '26763', '35867', '3'), +('10', '62', '2', '26762', '17542', '3'), +('10', '62', '2', '28909', '17328', '3'), +('10', '62', '2', '7385', '16967', '3'), +('10', '62', '3', '28963', '32694', '3'), +('10', '62', '3', '31323', '24102', '3'), +('10', '62', '3', '26785', '23182', '3'), +('10', '62', '3', '30553', '18169', '3'), +('10', '62', '5', '28900', '40251', '3'), +('10', '62', '5', '8364', '23818', '3'), +('10', '62', '5', '26505', '21782', '3'), +('10', '62', '5', '51229', '19470', '3'), +('10', '62', '8', '51240', '38601', '3'), +('10', '62', '8', '1628', '32466', '3'), +('10', '62', '8', '28992', '22516', '3'), +('10', '62', '8', '28918', '19751', '3'), +('10', '62', '6', '30566', '19673', '3'), +('10', '62', '6', '28920', '19500', '3'), +('10', '62', '6', '1200', '18665', '3'), +('10', '62', '6', '28991', '18163', '3'), +('10', '62', '17', '26782', '23713', '3'), +('10', '62', '17', '28951', '17878', '3'), +('10', '62', '17', '10845', '17600', '3'), +('10', '62', '17', '27159', '15554', '3'), +('10', '62', '7', '28925', '19575', '3'), +('10', '62', '7', '7868', '19117', '3'), +('10', '62', '7', '26584', '18404', '3'), +('10', '62', '7', '28991', '18163', '3'), +('10', '62', '9', '26752', '51395', '3'), +('10', '62', '9', '26787', '31596', '3'), +('10', '62', '9', '31314', '24203', '3'), +('10', '62', '9', '30552', '23775', '3'), +('10', '62', '15', '51247', '37108', '3'), +('10', '62', '15', '28994', '21644', '3'), +('10', '62', '15', '11541', '20701', '3'), +('10', '62', '15', '51242', '19085', '3'), +('10', '62', '20', '11666', '30014', '3'), +('10', '62', '20', '28916', '22551', '3'), +('10', '62', '20', '30534', '18716', '3'), +('10', '62', '20', '26549', '18089', '3'), +('10', '62', '12', '30534', '18716', '3'), +('10', '62', '12', '28967', '18253', '3'), +('10', '62', '12', '28991', '18163', '3'), +('10', '62', '12', '31227', '17719', '3'), +('10', '62', '18', '26783', '43516', '3'), +('10', '62', '18', '28932', '17363', '3'), +('10', '62', '18', '8289', '17327', '3'), +('10', '62', '18', '28965', '16859', '3'), +('10', '62', '19', '31327', '29802', '3'), +('10', '62', '19', '28934', '21503', '3'), +('10', '62', '19', '31408', '21210', '3'), +('10', '62', '19', '30570', '20616', '3'), +('10', '62', '13', '28980', '42478', '3'), +('10', '62', '13', '26784', '22974', '3'), +('10', '62', '13', '14762', '21200', '3'), +('10', '62', '13', '28921', '21109', '3'), +('10', '62', '14', '28980', '42478', '3'), +('10', '62', '14', '26784', '22974', '3'), +('10', '62', '14', '26786', '22271', '3'), +('10', '62', '14', '14762', '21200', '3'), +('10', '62', '11', '26784', '22974', '3'), +('10', '62', '11', '14762', '21200', '3'), +('10', '62', '11', '28921', '21109', '3'), +('10', '62', '11', '30562', '18588', '3'), +('10', '63', '22', '21805', '0', '3'), +('10', '63', '22', '21807', '0', '3'), +('10', '63', '22', '12425', '0', '3'), +('10', '63', '22', '7867', '0', '3'), +('10', '63', '1', '30552', '23477', '3'), +('10', '63', '1', '29861', '17865', '3'), +('10', '63', '1', '63170', '17326', '3'), +('10', '63', '1', '28944', '16427', '3'), +('10', '63', '2', '26763', '35120', '3'), +('10', '63', '2', '26762', '17545', '3'), +('10', '63', '2', '28909', '17330', '3'), +('10', '63', '2', '7385', '16970', '3'), +('10', '63', '3', '28963', '31946', '3'), +('10', '63', '3', '31323', '23102', '3'), +('10', '63', '3', '26785', '23008', '3'), +('10', '63', '3', '30553', '18172', '3'), +('10', '63', '5', '28900', '39255', '3'), +('10', '63', '5', '8364', '23821', '3'), +('10', '63', '5', '26505', '20632', '3'), +('10', '63', '5', '51229', '19372', '3'), +('10', '63', '8', '51240', '37601', '3'), +('10', '63', '8', '1628', '31468', '3'), +('10', '63', '8', '28992', '22519', '3'), +('10', '63', '8', '28918', '19751', '3'), +('10', '63', '6', '30566', '19675', '3'), +('10', '63', '6', '28920', '19504', '3'), +('10', '63', '6', '1200', '18267', '3'), +('10', '63', '6', '28991', '18168', '3'), +('10', '63', '17', '26782', '23719', '3'), +('10', '63', '17', '28951', '17878', '3'), +('10', '63', '17', '10845', '17604', '3'), +('10', '63', '17', '27159', '15555', '3'), +('10', '63', '7', '28925', '19579', '3'), +('10', '63', '7', '7868', '19119', '3'), +('10', '63', '7', '26584', '18406', '3'), +('10', '63', '7', '28991', '18168', '3'), +('10', '63', '9', '26752', '49897', '3'), +('10', '63', '9', '26787', '31199', '3'), +('10', '63', '9', '30552', '23477', '3'), +('10', '63', '9', '31314', '23203', '3'), +('10', '63', '15', '51247', '35959', '3'), +('10', '63', '15', '28994', '21647', '3'), +('10', '63', '15', '11541', '19551', '3'), +('10', '63', '15', '51242', '18786', '3'), +('10', '63', '20', '11666', '29014', '3'), +('10', '63', '20', '28916', '22553', '3'), +('10', '63', '20', '30534', '18719', '3'), +('10', '63', '20', '26549', '18093', '3'), +('10', '63', '12', '30534', '18719', '3'), +('10', '63', '12', '28967', '18253', '3'), +('10', '63', '12', '28991', '18168', '3'), +('10', '63', '12', '31227', '17722', '3'), +('10', '63', '18', '26783', '42369', '3'), +('10', '63', '18', '28932', '17366', '3'), +('10', '63', '18', '8289', '17329', '3'), +('10', '63', '18', '28965', '16860', '3'), +('10', '63', '19', '31327', '28654', '3'), +('10', '63', '19', '28934', '21303', '3'), +('10', '63', '19', '30570', '20618', '3'), +('10', '63', '19', '31408', '20061', '3'), +('10', '63', '13', '28980', '41481', '3'), +('10', '63', '13', '26784', '22981', '3'), +('10', '63', '13', '28921', '21115', '3'), +('10', '63', '13', '28981', '20481', '3'), +('10', '63', '14', '28980', '41481', '3'), +('10', '63', '14', '26784', '22981', '3'), +('10', '63', '14', '26786', '22277', '3'), +('10', '63', '14', '28921', '21115', '3'), +('10', '63', '11', '26784', '22981', '3'), +('10', '63', '11', '28921', '21115', '3'), +('10', '63', '11', '14762', '20200', '3'), +('10', '63', '11', '30562', '18590', '3'), +('10', '64', '22', '21805', '0', '3'), +('10', '64', '22', '21807', '0', '3'), +('10', '64', '22', '12425', '0', '3'), +('10', '64', '22', '7867', '0', '3'), +('10', '64', '1', '30552', '23179', '3'), +('10', '64', '1', '29861', '17871', '3'), +('10', '64', '1', '63170', '17227', '3'), +('10', '64', '1', '28944', '16429', '3'), +('10', '64', '2', '26763', '34373', '3'), +('10', '64', '2', '26762', '17548', '3'), +('10', '64', '2', '28909', '17332', '3'), +('10', '64', '2', '7385', '16974', '3'), +('10', '64', '3', '28963', '31199', '3'), +('10', '64', '3', '26785', '22833', '3'), +('10', '64', '3', '31323', '22102', '3'), +('10', '64', '3', '30553', '18175', '3'), +('10', '64', '5', '28900', '38259', '3'), +('10', '64', '5', '8364', '23825', '3'), +('10', '64', '5', '26505', '19482', '3'), +('10', '64', '5', '51229', '19274', '3'), +('10', '64', '8', '51240', '36602', '3'), +('10', '64', '8', '1628', '30471', '3'), +('10', '64', '8', '28992', '22522', '3'), +('10', '64', '8', '28918', '19751', '3'), +('10', '64', '6', '30566', '19677', '3'), +('10', '64', '6', '28920', '19508', '3'), +('10', '64', '6', '28991', '18173', '3'), +('10', '64', '6', '1200', '17869', '3'), +('10', '64', '17', '26782', '23725', '3'), +('10', '64', '17', '28951', '17878', '3'), +('10', '64', '17', '10845', '17608', '3'), +('10', '64', '17', '27159', '15557', '3'), +('10', '64', '7', '28925', '19582', '3'), +('10', '64', '7', '7868', '19120', '3'), +('10', '64', '7', '26584', '18409', '3'), +('10', '64', '7', '28991', '18173', '3'), +('10', '64', '9', '26752', '48399', '3'), +('10', '64', '9', '26787', '30801', '3'), +('10', '64', '9', '30552', '23179', '3'), +('10', '64', '9', '31314', '22203', '3'), +('10', '64', '15', '51247', '34809', '3'), +('10', '64', '15', '28994', '21649', '3'), +('10', '64', '15', '51242', '18487', '3'), +('10', '64', '15', '11541', '18401', '3'), +('10', '64', '20', '11666', '28014', '3'), +('10', '64', '20', '28916', '22554', '3'), +('10', '64', '20', '30534', '18721', '3'), +('10', '64', '20', '26549', '18098', '3'), +('10', '64', '12', '30534', '18721', '3'), +('10', '64', '12', '28967', '18253', '3'), +('10', '64', '12', '28991', '18173', '3'), +('10', '64', '12', '31227', '17726', '3'), +('10', '64', '18', '26783', '41221', '3'), +('10', '64', '18', '28932', '17369', '3'), +('10', '64', '18', '8289', '17331', '3'), +('10', '64', '18', '28965', '16862', '3'), +('10', '64', '19', '31327', '27506', '3'), +('10', '64', '19', '28934', '21103', '3'), +('10', '64', '19', '30570', '20619', '3'), +('10', '64', '19', '31408', '18912', '3'), +('10', '64', '13', '28980', '40484', '3'), +('10', '64', '13', '26784', '22987', '3'), +('10', '64', '13', '28921', '21121', '3'), +('10', '64', '13', '28981', '20484', '3'), +('10', '64', '14', '28980', '40484', '3'), +('10', '64', '14', '26784', '22987', '3'), +('10', '64', '14', '26786', '22283', '3'), +('10', '64', '14', '28921', '21121', '3'), +('10', '64', '11', '26784', '22987', '3'), +('10', '64', '11', '28921', '21121', '3'), +('10', '64', '11', '14762', '19200', '3'), +('10', '64', '11', '30562', '18592', '3'), +('10', '65', '22', '21805', '0', '7'), +('10', '65', '22', '61948', '0', '7'), +('10', '65', '22', '21807', '0', '7'), +('10', '65', '22', '12425', '0', '7'), +('10', '65', '1', '5594', '62582', '7'), +('10', '65', '1', '52121', '49262', '7'), +('10', '65', '1', '7130', '48592', '7'), +('10', '65', '1', '68756', '47887', '7'), +('10', '65', '2', '69088', '39405', '7'), +('10', '65', '2', '67726', '35660', '7'), +('10', '65', '2', '26763', '33627', '7'), +('10', '65', '2', '9496', '31121', '7'), +('10', '65', '3', '69068', '93593', '7'), +('10', '65', '3', '69132', '60779', '7'), +('10', '65', '3', '68819', '56986', '7'), +('10', '65', '3', '26984', '54567', '7'), +('10', '65', '5', '69097', '94667', '7'), +('10', '65', '5', '68950', '94637', '7'), +('10', '65', '5', '68719', '51727', '7'), +('10', '65', '5', '50414', '50584', '7'), +('10', '65', '8', '69064', '93558', '7'), +('10', '65', '8', '69164', '51443', '7'), +('10', '65', '8', '15823', '49609', '7'), +('10', '65', '8', '69065', '42783', '7'), +('10', '65', '6', '13647', '65367', '7'), +('10', '65', '6', '69073', '62429', '7'), +('10', '65', '6', '69066', '55438', '7'), +('10', '65', '6', '13634', '47574', '7'), +('10', '65', '17', '69151', '69978', '7'), +('10', '65', '17', '47649', '62056', '7'), +('10', '65', '17', '68780', '40676', '7'), +('10', '65', '17', '68974', '39972', '7'), +('10', '65', '7', '68886', '56818', '7'), +('10', '65', '7', '11529', '51694', '7'), +('10', '65', '7', '69169', '44755', '7'), +('10', '65', '7', '69080', '38740', '7'), +('10', '65', '9', '69127', '76155', '7'), +('10', '65', '9', '68767', '58892', '7'), +('10', '65', '9', '26752', '46901', '7'), +('10', '65', '9', '69100', '43508', '7'), +('10', '65', '15', '69160', '96243', '7'), +('10', '65', '15', '69070', '55917', '7'), +('10', '65', '15', '10234', '54035', '7'), +('10', '65', '15', '69382', '50685', '7'), +('10', '65', '20', '68951', '61068', '7'), +('10', '65', '20', '62446', '49599', '7'), +('10', '65', '20', '67625', '49559', '7'), +('10', '65', '20', '69134', '47069', '7'), +('10', '65', '12', '69084', '47081', '7'), +('10', '65', '12', '69253', '46938', '7'), +('10', '65', '12', '68887', '38213', '7'), +('10', '65', '12', '28246', '31809', '7'), +('10', '65', '18', '69147', '53991', '7'), +('10', '65', '18', '68975', '43615', '7'), +('10', '65', '18', '26783', '40074', '7'), +('10', '65', '18', '68749', '35380', '7'), +('10', '65', '19', '69178', '46519', '7'), +('10', '65', '19', '69076', '39995', '7'), +('10', '65', '19', '68888', '36204', '7'), +('10', '65', '19', '26988', '29550', '7'), +('10', '65', '13', '21886', '51823', '7'), +('10', '65', '13', '69098', '51765', '7'), +('10', '65', '13', '69159', '46151', '7'), +('10', '65', '13', '69047', '44876', '7'), +('10', '65', '14', '69155', '96364', '7'), +('10', '65', '14', '27280', '68300', '7'), +('10', '65', '14', '69404', '52937', '7'), +('10', '65', '14', '69098', '51765', '7'), +('10', '65', '11', '68952', '76874', '7'), +('10', '65', '11', '20898', '62698', '7'), +('10', '65', '11', '69162', '46453', '7'), +('10', '65', '11', '67606', '45153', '7'), +('10', '65', '22', '21805', '0', '6'), +('10', '65', '22', '61948', '0', '6'), +('10', '65', '22', '21807', '0', '6'), +('10', '65', '22', '12425', '0', '6'), +('10', '65', '1', '5594', '62582', '6'), +('10', '65', '1', '7130', '48592', '6'), +('10', '65', '1', '4118', '35055', '6'), +('10', '65', '1', '10242', '34592', '6'), +('10', '65', '2', '26763', '33627', '6'), +('10', '65', '2', '9496', '31121', '6'), +('10', '65', '2', '28648', '29563', '6'), +('10', '65', '2', '28605', '29558', '6'), +('10', '65', '3', '26984', '54567', '6'), +('10', '65', '3', '26982', '42729', '6'), +('10', '65', '3', '9490', '35620', '6'), +('10', '65', '3', '9463', '34257', '6'), +('10', '65', '5', '62446', '49599', '6'), +('10', '65', '5', '7769', '40688', '6'), +('10', '65', '5', '7756', '38279', '6'), +('10', '65', '5', '7770', '37736', '6'), +('10', '65', '8', '15823', '49609', '6'), +('10', '65', '8', '15805', '36747', '6'), +('10', '65', '8', '51240', '35602', '6'), +('10', '65', '8', '15815', '34341', '6'), +('10', '65', '6', '13647', '65367', '6'), +('10', '65', '6', '13634', '47574', '6'), +('10', '65', '6', '28661', '36217', '6'), +('10', '65', '6', '28660', '34786', '6'), +('10', '65', '17', '47649', '62056', '6'), +('10', '65', '17', '69403', '34989', '6'), +('10', '65', '17', '68189', '27500', '6'), +('10', '65', '17', '68007', '27500', '6'), +('10', '65', '7', '11529', '51694', '6'), +('10', '65', '7', '68197', '30010', '6'), +('10', '65', '7', '68189', '27500', '6'), +('10', '65', '7', '68007', '27500', '6'), +('10', '65', '9', '26752', '46901', '6'), +('10', '65', '9', '21993', '35214', '6'), +('10', '65', '9', '28668', '32768', '6'), +('10', '65', '9', '28666', '31688', '6'), +('10', '65', '15', '10234', '54035', '6'), +('10', '65', '15', '69382', '50685', '6'), +('10', '65', '15', '26993', '42789', '6'), +('10', '65', '15', '26989', '37112', '6'), +('10', '65', '20', '62446', '49599', '6'), +('10', '65', '20', '15871', '32321', '6'), +('10', '65', '20', '15927', '32233', '6'), +('10', '65', '20', '15877', '31624', '6'), +('10', '65', '12', '28246', '31809', '6'), +('10', '65', '12', '27000', '31438', '6'), +('10', '65', '12', '68007', '27500', '6'), +('10', '65', '12', '68189', '27500', '6'), +('10', '65', '18', '26783', '40074', '6'), +('10', '65', '18', '28651', '33151', '6'), +('10', '65', '18', '68007', '27500', '6'), +('10', '65', '18', '68189', '27500', '6'), +('10', '65', '19', '26988', '29550', '6'), +('10', '65', '19', '68189', '27500', '6'), +('10', '65', '19', '68007', '27500', '6'), +('10', '65', '19', '20078', '27053', '6'), +('10', '65', '13', '21886', '51823', '6'), +('10', '65', '13', '71241', '42716', '6'), +('10', '65', '13', '52054', '39949', '6'), +('10', '65', '13', '28980', '39487', '6'), +('10', '65', '14', '27280', '68300', '6'), +('10', '65', '14', '69404', '52937', '6'), +('10', '65', '14', '68117', '50730', '6'), +('10', '65', '14', '71241', '42716', '6'), +('10', '65', '11', '20898', '62698', '6'), +('10', '65', '11', '20496', '36412', '6'), +('10', '65', '11', '26987', '34899', '6'), +('10', '65', '11', '9574', '31598', '6'), +('10', '65', '22', '61948', '0', '5'), +('10', '65', '22', '21805', '0', '5'), +('10', '65', '22', '21807', '0', '5'), +('10', '65', '22', '12425', '0', '5'), +('10', '65', '1', '5594', '62582', '5'), +('10', '65', '1', '7130', '48592', '5'), +('10', '65', '1', '4118', '35055', '5'), +('10', '65', '1', '10242', '34592', '5'), +('10', '65', '2', '26763', '33627', '5'), +('10', '65', '2', '9496', '31121', '5'), +('10', '65', '2', '28648', '29563', '5'), +('10', '65', '2', '28605', '29558', '5'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '65', '3', '26984', '54567', '5'), +('10', '65', '3', '26982', '42729', '5'), +('10', '65', '3', '9490', '35620', '5'), +('10', '65', '3', '9463', '34257', '5'), +('10', '65', '5', '7769', '40688', '5'), +('10', '65', '5', '7756', '38279', '5'), +('10', '65', '5', '7770', '37736', '5'), +('10', '65', '5', '28900', '37263', '5'), +('10', '65', '8', '15823', '49609', '5'), +('10', '65', '8', '15805', '36747', '5'), +('10', '65', '8', '51240', '35602', '5'), +('10', '65', '8', '15815', '34341', '5'), +('10', '65', '6', '13647', '65367', '5'), +('10', '65', '6', '13634', '47574', '5'), +('10', '65', '6', '28661', '36217', '5'), +('10', '65', '6', '28660', '34786', '5'), +('10', '65', '17', '47649', '62056', '5'), +('10', '65', '17', '14961', '26171', '5'), +('10', '65', '17', '26782', '23731', '5'), +('10', '65', '17', '55297', '20497', '5'), +('10', '65', '7', '11529', '51694', '5'), +('10', '65', '7', '68197', '30010', '5'), +('10', '65', '7', '11518', '26240', '5'), +('10', '65', '7', '8781', '24191', '5'), +('10', '65', '9', '26752', '46901', '5'), +('10', '65', '9', '21993', '35214', '5'), +('10', '65', '9', '28668', '32768', '5'), +('10', '65', '9', '28666', '31688', '5'), +('10', '65', '15', '10234', '54035', '5'), +('10', '65', '15', '26993', '42789', '5'), +('10', '65', '15', '26989', '37112', '5'), +('10', '65', '15', '32109', '36241', '5'), +('10', '65', '20', '15871', '32321', '5'), +('10', '65', '20', '15927', '32233', '5'), +('10', '65', '20', '15877', '31624', '5'), +('10', '65', '20', '22880', '31552', '5'), +('10', '65', '12', '28246', '31809', '5'), +('10', '65', '12', '27000', '31438', '5'), +('10', '65', '12', '13579', '23862', '5'), +('10', '65', '12', '11878', '19959', '5'), +('10', '65', '18', '26783', '40074', '5'), +('10', '65', '18', '28651', '33151', '5'), +('10', '65', '18', '16803', '26274', '5'), +('10', '65', '18', '28932', '17371', '5'), +('10', '65', '19', '26988', '29550', '5'), +('10', '65', '19', '20078', '27053', '5'), +('10', '65', '19', '31327', '26357', '5'), +('10', '65', '19', '19094', '22982', '5'), +('10', '65', '13', '21886', '51823', '5'), +('10', '65', '13', '52054', '39949', '5'), +('10', '65', '13', '28980', '39487', '5'), +('10', '65', '13', '29033', '31029', '5'), +('10', '65', '14', '27280', '68300', '5'), +('10', '65', '14', '52054', '39949', '5'), +('10', '65', '14', '28980', '39487', '5'), +('10', '65', '14', '27285', '34931', '5'), +('10', '65', '11', '20898', '62698', '5'), +('10', '65', '11', '20496', '36412', '5'), +('10', '65', '11', '26987', '34899', '5'), +('10', '65', '11', '9574', '31598', '5'), +('10', '65', '22', '61948', '0', '4'), +('10', '65', '22', '21805', '0', '4'), +('10', '65', '22', '21807', '0', '4'), +('10', '65', '22', '12425', '0', '4'), +('10', '65', '1', '5594', '62582', '4'), +('10', '65', '1', '7130', '48592', '4'), +('10', '65', '1', '4118', '35055', '4'), +('10', '65', '1', '10242', '34592', '4'), +('10', '65', '2', '26763', '33627', '4'), +('10', '65', '2', '9496', '31121', '4'), +('10', '65', '2', '28648', '29563', '4'), +('10', '65', '2', '28605', '29558', '4'), +('10', '65', '3', '26984', '54567', '4'), +('10', '65', '3', '26982', '42729', '4'), +('10', '65', '3', '9490', '35620', '4'), +('10', '65', '3', '9463', '34257', '4'), +('10', '65', '5', '7769', '40688', '4'), +('10', '65', '5', '7756', '38279', '4'), +('10', '65', '5', '7770', '37736', '4'), +('10', '65', '5', '28900', '37263', '4'), +('10', '65', '8', '15823', '49609', '4'), +('10', '65', '8', '15805', '36747', '4'), +('10', '65', '8', '51240', '35602', '4'), +('10', '65', '8', '15815', '34341', '4'), +('10', '65', '6', '13647', '65367', '4'), +('10', '65', '6', '13634', '47574', '4'), +('10', '65', '6', '28661', '36217', '4'), +('10', '65', '6', '28660', '34786', '4'), +('10', '65', '17', '47649', '62056', '4'), +('10', '65', '17', '14961', '26171', '4'), +('10', '65', '17', '26782', '23731', '4'), +('10', '65', '17', '55297', '20497', '4'), +('10', '65', '7', '11529', '51694', '4'), +('10', '65', '7', '68197', '30010', '4'), +('10', '65', '7', '11518', '26240', '4'), +('10', '65', '7', '8781', '24191', '4'), +('10', '65', '9', '26752', '46901', '4'), +('10', '65', '9', '21993', '35214', '4'), +('10', '65', '9', '28668', '32768', '4'), +('10', '65', '9', '28666', '31688', '4'), +('10', '65', '15', '10234', '54035', '4'), +('10', '65', '15', '26993', '42789', '4'), +('10', '65', '15', '26989', '37112', '4'), +('10', '65', '15', '32109', '36241', '4'), +('10', '65', '20', '15871', '32321', '4'), +('10', '65', '20', '15927', '32233', '4'), +('10', '65', '20', '15877', '31624', '4'), +('10', '65', '20', '22880', '31552', '4'), +('10', '65', '12', '28246', '31809', '4'), +('10', '65', '12', '27000', '31438', '4'), +('10', '65', '12', '13579', '23862', '4'), +('10', '65', '12', '11878', '19959', '4'), +('10', '65', '18', '26783', '40074', '4'), +('10', '65', '18', '28651', '33151', '4'), +('10', '65', '18', '16803', '26274', '4'), +('10', '65', '18', '28932', '17371', '4'), +('10', '65', '19', '26988', '29550', '4'), +('10', '65', '19', '20078', '27053', '4'), +('10', '65', '19', '31327', '26357', '4'), +('10', '65', '19', '19094', '22982', '4'), +('10', '65', '13', '21886', '51823', '4'), +('10', '65', '13', '52054', '39949', '4'), +('10', '65', '13', '28980', '39487', '4'), +('10', '65', '13', '29033', '31029', '4'), +('10', '65', '14', '27280', '68300', '4'), +('10', '65', '14', '52054', '39949', '4'), +('10', '65', '14', '28980', '39487', '4'), +('10', '65', '14', '27285', '34931', '4'), +('10', '65', '11', '20898', '62698', '4'), +('10', '65', '11', '20496', '36412', '4'), +('10', '65', '11', '26987', '34899', '4'), +('10', '65', '11', '9574', '31598', '4'), +('10', '66', '22', '21805', '0', '7'), +('10', '66', '22', '61948', '0', '7'), +('10', '66', '22', '21807', '0', '7'), +('10', '66', '22', '12425', '0', '7'), +('10', '66', '1', '5594', '61082', '7'), +('10', '66', '1', '52121', '48766', '7'), +('10', '66', '1', '7130', '48097', '7'), +('10', '66', '1', '69166', '47881', '7'), +('10', '66', '2', '69088', '39410', '7'), +('10', '66', '2', '67726', '35665', '7'), +('10', '66', '2', '26763', '32880', '7'), +('10', '66', '2', '9496', '30123', '7'), +('10', '66', '3', '69068', '91348', '7'), +('10', '66', '3', '69132', '60284', '7'), +('10', '66', '3', '68819', '55489', '7'), +('10', '66', '3', '26984', '53573', '7'), +('10', '66', '5', '69097', '92423', '7'), +('10', '66', '5', '68950', '92391', '7'), +('10', '66', '5', '68719', '50730', '7'), +('10', '66', '5', '67625', '49565', '7'), +('10', '66', '8', '69064', '91563', '7'), +('10', '66', '8', '69164', '51298', '7'), +('10', '66', '8', '15823', '48363', '7'), +('10', '66', '8', '69065', '42786', '7'), +('10', '66', '6', '13647', '63872', '7'), +('10', '66', '6', '69073', '61534', '7'), +('10', '66', '6', '69066', '54941', '7'), +('10', '66', '6', '69163', '47174', '7'), +('10', '66', '17', '69151', '69081', '7'), +('10', '66', '17', '47649', '60813', '7'), +('10', '66', '17', '68780', '40480', '7'), +('10', '66', '17', '68974', '39978', '7'), +('10', '66', '7', '68886', '55923', '7'), +('10', '66', '7', '11529', '50449', '7'), +('10', '66', '7', '69169', '44759', '7'), +('10', '66', '7', '69080', '38743', '7'), +('10', '66', '9', '69127', '74909', '7'), +('10', '66', '9', '68767', '57394', '7'), +('10', '66', '9', '26752', '45404', '7'), +('10', '66', '9', '69100', '43513', '7'), +('10', '66', '15', '69160', '94244', '7'), +('10', '66', '15', '69070', '55421', '7'), +('10', '66', '15', '10234', '52789', '7'), +('10', '66', '15', '69382', '49439', '7'), +('10', '66', '20', '68951', '60174', '7'), +('10', '66', '20', '67625', '49565', '7'), +('10', '66', '20', '62446', '48349', '7'), +('10', '66', '20', '69134', '47074', '7'), +('10', '66', '12', '69253', '46943', '7'), +('10', '66', '12', '69084', '46786', '7'), +('10', '66', '12', '68887', '38217', '7'), +('10', '66', '12', '28246', '31814', '7'), +('10', '66', '18', '69147', '53745', '7'), +('10', '66', '18', '68975', '43320', '7'), +('10', '66', '18', '26783', '38927', '7'), +('10', '66', '18', '68749', '35385', '7'), +('10', '66', '19', '69178', '46525', '7'), +('10', '66', '19', '69076', '39999', '7'), +('10', '66', '19', '68888', '36208', '7'), +('10', '66', '19', '26988', '29553', '7'), +('10', '66', '13', '69098', '51172', '7'), +('10', '66', '13', '21886', '50827', '7'), +('10', '66', '13', '69159', '46158', '7'), +('10', '66', '13', '69047', '44582', '7'), +('10', '66', '14', '69155', '94364', '7'), +('10', '66', '14', '27280', '66805', '7'), +('10', '66', '14', '69404', '51690', '7'), +('10', '66', '14', '69098', '51172', '7'), +('10', '66', '11', '68952', '75379', '7'), +('10', '66', '11', '20898', '61201', '7'), +('10', '66', '11', '69162', '46459', '7'), +('10', '66', '11', '67606', '45158', '7'), +('10', '67', '22', '21805', '0', '7'), +('10', '67', '22', '61948', '0', '7'), +('10', '67', '22', '21807', '0', '7'), +('10', '67', '22', '12425', '0', '7'), +('10', '67', '1', '5594', '59583', '7'), +('10', '67', '1', '52121', '48269', '7'), +('10', '67', '1', '69166', '47886', '7'), +('10', '67', '1', '7130', '47603', '7'), +('10', '67', '2', '69088', '39414', '7'), +('10', '67', '2', '67726', '35671', '7'), +('10', '67', '2', '26763', '32134', '7'), +('10', '67', '2', '28648', '29571', '7'), +('10', '67', '3', '69068', '89104', '7'), +('10', '67', '3', '69132', '59789', '7'), +('10', '67', '3', '68819', '53993', '7'), +('10', '67', '3', '26984', '52578', '7'), +('10', '67', '5', '69097', '90178', '7'), +('10', '67', '5', '68950', '90146', '7'), +('10', '67', '5', '68719', '49733', '7'), +('10', '67', '5', '67625', '49570', '7'), +('10', '67', '8', '69064', '89569', '7'), +('10', '67', '8', '69164', '51154', '7'), +('10', '67', '8', '15823', '47117', '7'), +('10', '67', '8', '69065', '42789', '7'), +('10', '67', '6', '13647', '62378', '7'), +('10', '67', '6', '69073', '60639', '7'), +('10', '67', '6', '69066', '54445', '7'), +('10', '67', '6', '69163', '47179', '7'), +('10', '67', '17', '69151', '68185', '7'), +('10', '67', '17', '47649', '59570', '7'), +('10', '67', '17', '68780', '40284', '7'), +('10', '67', '17', '68974', '39983', '7'), +('10', '67', '7', '68886', '55027', '7'), +('10', '67', '7', '11529', '49203', '7'), +('10', '67', '7', '69169', '44764', '7'), +('10', '67', '7', '69080', '38747', '7'), +('10', '67', '9', '69127', '73662', '7'), +('10', '67', '9', '68767', '55896', '7'), +('10', '67', '9', '26752', '43906', '7'), +('10', '67', '9', '69100', '43518', '7'), +('10', '67', '15', '69160', '92245', '7'), +('10', '67', '15', '69070', '54926', '7'), +('10', '67', '15', '10234', '51543', '7'), +('10', '67', '15', '52121', '48269', '7'), +('10', '67', '20', '68951', '59280', '7'), +('10', '67', '20', '67625', '49570', '7'), +('10', '67', '20', '62446', '47099', '7'), +('10', '67', '20', '69134', '47080', '7'), +('10', '67', '12', '69253', '46947', '7'), +('10', '67', '12', '69084', '46491', '7'), +('10', '67', '12', '68887', '38221', '7'), +('10', '67', '12', '28246', '31818', '7'), +('10', '67', '18', '69147', '53499', '7'), +('10', '67', '18', '68975', '43025', '7'), +('10', '67', '18', '26783', '37779', '7'), +('10', '67', '18', '68749', '35389', '7'), +('10', '67', '19', '69178', '46530', '7'), +('10', '67', '19', '69076', '40004', '7'), +('10', '67', '19', '68888', '36213', '7'), +('10', '67', '19', '26988', '29556', '7'), +('10', '67', '13', '69098', '50579', '7'), +('10', '67', '13', '21886', '49832', '7'), +('10', '67', '13', '69159', '46165', '7'), +('10', '67', '13', '69047', '44288', '7'), +('10', '67', '14', '69155', '92365', '7'), +('10', '67', '14', '27280', '65310', '7'), +('10', '67', '14', '69098', '50579', '7'), +('10', '67', '14', '69404', '50443', '7'), +('10', '67', '11', '68952', '73883', '7'), +('10', '67', '11', '20898', '59704', '7'), +('10', '67', '11', '69162', '46466', '7'), +('10', '67', '11', '67606', '45163', '7'), +('10', '68', '22', '21805', '0', '7'), +('10', '68', '22', '61948', '0', '7'), +('10', '68', '22', '21807', '0', '7'), +('10', '68', '22', '12425', '0', '7'), +('10', '68', '1', '5594', '58083', '7'), +('10', '68', '1', '69166', '47890', '7'), +('10', '68', '1', '52121', '47773', '7'), +('10', '68', '1', '7130', '47108', '7'), +('10', '68', '2', '69088', '39419', '7'), +('10', '68', '2', '67726', '35676', '7'), +('10', '68', '2', '26763', '31387', '7'), +('10', '68', '2', '28648', '29575', '7'), +('10', '68', '3', '69068', '86860', '7'), +('10', '68', '3', '69132', '59294', '7'), +('10', '68', '3', '68819', '52496', '7'), +('10', '68', '3', '26984', '51584', '7'), +('10', '68', '5', '69097', '87934', '7'), +('10', '68', '5', '68950', '87900', '7'), +('10', '68', '5', '67625', '49576', '7'), +('10', '68', '5', '68719', '48737', '7'), +('10', '68', '8', '69064', '87574', '7'), +('10', '68', '8', '69164', '51010', '7'), +('10', '68', '8', '15823', '45871', '7'), +('10', '68', '8', '69065', '42791', '7'), +('10', '68', '6', '13647', '60884', '7'), +('10', '68', '6', '69073', '59744', '7'), +('10', '68', '6', '69066', '53948', '7'), +('10', '68', '6', '69163', '47185', '7'), +('10', '68', '17', '69151', '67289', '7'), +('10', '68', '17', '47649', '58327', '7'), +('10', '68', '17', '68780', '40087', '7'), +('10', '68', '17', '68974', '39989', '7'), +('10', '68', '7', '68886', '54132', '7'), +('10', '68', '7', '11529', '47957', '7'), +('10', '68', '7', '69169', '44768', '7'), +('10', '68', '7', '69080', '38750', '7'), +('10', '68', '9', '69127', '72416', '7'), +('10', '68', '9', '68767', '54398', '7'), +('10', '68', '9', '69100', '43524', '7'), +('10', '68', '9', '26752', '42408', '7'), +('10', '68', '15', '69160', '90245', '7'), +('10', '68', '15', '69070', '54430', '7'), +('10', '68', '15', '10234', '50296', '7'), +('10', '68', '15', '52121', '47773', '7'), +('10', '68', '20', '68951', '58385', '7'), +('10', '68', '20', '67625', '49576', '7'), +('10', '68', '20', '69134', '47085', '7'), +('10', '68', '20', '62446', '45849', '7'), +('10', '68', '12', '69253', '46951', '7'), +('10', '68', '12', '69084', '46196', '7'), +('10', '68', '12', '68887', '38224', '7'), +('10', '68', '12', '28246', '31822', '7'), +('10', '68', '18', '69147', '53252', '7'), +('10', '68', '18', '68975', '42729', '7'), +('10', '68', '18', '26783', '36632', '7'), +('10', '68', '18', '68749', '35394', '7'), +('10', '68', '19', '69178', '46536', '7'), +('10', '68', '19', '69076', '40008', '7'), +('10', '68', '19', '68888', '36217', '7'), +('10', '68', '19', '26988', '29559', '7'), +('10', '68', '13', '69098', '49986', '7'), +('10', '68', '13', '21886', '48836', '7'), +('10', '68', '13', '69159', '46172', '7'), +('10', '68', '13', '69047', '43994', '7'), +('10', '68', '14', '69155', '90366', '7'), +('10', '68', '14', '27280', '63815', '7'), +('10', '68', '14', '69098', '49986', '7'), +('10', '68', '14', '69404', '49196', '7'), +('10', '68', '11', '68952', '72388', '7'), +('10', '68', '11', '20898', '58207', '7'), +('10', '68', '11', '69162', '46473', '7'), +('10', '68', '11', '67606', '45167', '7'), +('10', '69', '22', '21805', '0', '7'), +('10', '69', '22', '61948', '0', '7'), +('10', '69', '22', '21807', '0', '7'), +('10', '69', '22', '12425', '0', '7'), +('10', '69', '1', '5594', '56583', '7'), +('10', '69', '1', '69166', '47894', '7'), +('10', '69', '1', '52121', '47276', '7'), +('10', '69', '1', '7130', '46614', '7'), +('10', '69', '2', '69088', '39424', '7'), +('10', '69', '2', '67726', '35682', '7'), +('10', '69', '2', '26763', '30641', '7'), +('10', '69', '2', '28648', '29579', '7'), +('10', '69', '3', '69068', '84615', '7'), +('10', '69', '3', '69132', '58799', '7'), +('10', '69', '3', '68819', '51000', '7'), +('10', '69', '3', '26984', '50590', '7'), +('10', '69', '5', '69097', '85689', '7'), +('10', '69', '5', '68950', '85655', '7'), +('10', '69', '5', '67625', '49581', '7'), +('10', '69', '5', '68719', '47740', '7'), +('10', '69', '8', '69064', '85580', '7'), +('10', '69', '8', '69164', '50865', '7'), +('10', '69', '8', '15823', '44625', '7'), +('10', '69', '8', '69065', '42794', '7'), +('10', '69', '6', '13647', '59389', '7'), +('10', '69', '6', '69073', '58849', '7'), +('10', '69', '6', '69066', '53452', '7'), +('10', '69', '6', '69163', '47190', '7'), +('10', '69', '17', '69151', '66393', '7'), +('10', '69', '17', '47649', '57084', '7'), +('10', '69', '17', '68974', '39995', '7'), +('10', '69', '17', '68780', '39891', '7'), +('10', '69', '7', '68886', '53237', '7'), +('10', '69', '7', '11529', '46712', '7'), +('10', '69', '7', '69169', '44773', '7'), +('10', '69', '7', '69080', '38754', '7'), +('10', '69', '9', '69127', '71169', '7'), +('10', '69', '9', '68767', '52901', '7'), +('10', '69', '9', '69100', '43529', '7'), +('10', '69', '9', '26752', '40911', '7'), +('10', '69', '15', '69160', '88246', '7'), +('10', '69', '15', '69070', '53935', '7'), +('10', '69', '15', '10234', '49050', '7'), +('10', '69', '15', '52121', '47276', '7'), +('10', '69', '20', '68951', '57491', '7'), +('10', '69', '20', '67625', '49581', '7'), +('10', '69', '20', '69134', '47091', '7'), +('10', '69', '20', '62446', '44600', '7'), +('10', '69', '12', '69253', '46956', '7'), +('10', '69', '12', '69084', '45901', '7'), +('10', '69', '12', '68887', '38228', '7'), +('10', '69', '12', '28246', '31827', '7'), +('10', '69', '18', '69147', '53006', '7'), +('10', '69', '18', '68975', '42434', '7'), +('10', '69', '18', '26783', '35484', '7'), +('10', '69', '18', '68749', '35398', '7'), +('10', '69', '19', '69178', '46542', '7'), +('10', '69', '19', '69076', '40012', '7'), +('10', '69', '19', '68888', '36222', '7'), +('10', '69', '19', '26988', '29562', '7'), +('10', '69', '13', '69098', '49392', '7'), +('10', '69', '13', '21886', '47841', '7'), +('10', '69', '13', '69159', '46179', '7'), +('10', '69', '13', '69047', '43699', '7'), +('10', '69', '14', '69155', '88366', '7'), +('10', '69', '14', '27280', '62320', '7'), +('10', '69', '14', '69098', '49392', '7'), +('10', '69', '14', '69404', '47949', '7'), +('10', '69', '11', '68952', '70892', '7'), +('10', '69', '11', '20898', '56710', '7'), +('10', '69', '11', '69162', '46480', '7'), +('10', '69', '11', '67606', '45172', '7'), +('10', '70', '22', '12425', '0', '11'), +('10', '70', '22', '21807', '0', '11'), +('10', '70', '22', '39342', '0', '11'), +('10', '70', '22', '7867', '0', '11'), +('10', '70', '1', '39329', '126105', '11'), +('10', '70', '1', '71668', '76106', '11'), +('10', '70', '1', '83662', '70387', '11'), +('10', '70', '1', '83630', '66247', '11'), +('10', '70', '2', '83561', '56790', '11'), +('10', '70', '2', '70916', '53127', '11'), +('10', '70', '2', '83551', '50589', '11'), +('10', '70', '2', '47209', '46828', '11'), +('10', '70', '3', '69068', '82371', '11'), +('10', '70', '3', '70620', '74587', '11'), +('10', '70', '3', '39368', '71162', '11'), +('10', '70', '3', '83636', '66717', '11'), +('10', '70', '5', '83612', '85466', '11'), +('10', '70', '5', '69097', '83445', '11'), +('10', '70', '5', '68950', '83409', '11'), +('10', '70', '5', '39366', '70973', '11'), +('10', '70', '8', '39293', '125213', '11'), +('10', '70', '8', '83532', '87185', '11'), +('10', '70', '8', '83659', '84387', '11'), +('10', '70', '8', '69064', '83585', '11'), +('10', '70', '6', '71666', '106462', '11'), +('10', '70', '6', '83660', '77598', '11'), +('10', '70', '6', '39269', '74420', '11'), +('10', '70', '6', '47280', '65077', '11'), +('10', '70', '17', '83604', '69186', '11'), +('10', '70', '17', '69151', '65496', '11'), +('10', '70', '17', '70921', '59574', '11'), +('10', '70', '17', '47649', '55840', '11'), +('10', '70', '7', '39273', '58652', '11'), +('10', '70', '7', '83565', '57840', '11'), +('10', '70', '7', '83495', '54228', '11'), +('10', '70', '7', '68886', '52342', '11'), +('10', '70', '9', '51707', '128333', '11'), +('10', '70', '9', '39225', '90256', '11'), +('10', '70', '9', '69127', '69922', '11'), +('10', '70', '9', '39345', '63285', '11'), +('10', '70', '15', '83629', '124666', '11'), +('10', '70', '15', '69160', '86246', '11'), +('10', '70', '15', '47238', '82597', '11'), +('10', '70', '15', '39277', '78722', '11'), +('10', '70', '20', '47284', '81792', '11'), +('10', '70', '20', '47282', '74154', '11'), +('10', '70', '20', '83600', '64917', '11'), +('10', '70', '20', '39350', '64598', '11'), +('10', '70', '12', '70919', '97189', '11'), +('10', '70', '12', '39356', '86039', '11'), +('10', '70', '12', '83569', '58214', '11'), +('10', '70', '12', '39219', '52985', '11'), +('10', '70', '18', '83608', '129433', '11'), +('10', '70', '18', '70922', '84947', '11'), +('10', '70', '18', '69147', '52759', '11'), +('10', '70', '18', '71647', '50518', '11'), +('10', '70', '19', '83573', '96114', '11'), +('10', '70', '19', '47217', '65518', '11'), +('10', '70', '19', '70920', '64116', '11'), +('10', '70', '19', '83541', '50237', '11'), +('10', '70', '13', '83460', '76234', '11'), +('10', '70', '13', '39211', '76043', '11'), +('10', '70', '13', '83631', '72841', '11'), +('10', '70', '13', '83508', '68775', '11'), +('10', '70', '14', '69155', '86367', '11'), +('10', '70', '14', '83460', '76234', '11'), +('10', '70', '14', '39211', '76043', '11'), +('10', '70', '14', '39372', '71066', '11'), +('10', '70', '11', '39287', '125333', '11'), +('10', '70', '11', '39371', '70898', '11'), +('10', '70', '11', '68952', '69397', '11'), +('10', '70', '11', '39320', '68277', '11'), +('10', '70', '22', '21805', '0', '10'), +('10', '70', '22', '61948', '0', '10'), +('10', '70', '22', '21807', '0', '10'), +('10', '70', '22', '12425', '0', '10'), +('10', '70', '1', '71668', '76106', '10'), +('10', '70', '1', '83662', '70387', '10'), +('10', '70', '1', '83630', '66247', '10'), +('10', '70', '1', '83587', '58066', '10'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '70', '2', '83561', '56790', '10'), +('10', '70', '2', '70916', '53127', '10'), +('10', '70', '2', '83551', '50589', '10'), +('10', '70', '2', '47209', '46828', '10'), +('10', '70', '3', '69068', '82371', '10'), +('10', '70', '3', '70620', '74587', '10'), +('10', '70', '3', '83636', '66717', '10'), +('10', '70', '3', '83658', '66233', '10'), +('10', '70', '5', '83612', '85466', '10'), +('10', '70', '5', '69097', '83445', '10'), +('10', '70', '5', '68950', '83409', '10'), +('10', '70', '5', '83651', '59963', '10'), +('10', '70', '8', '83532', '87185', '10'), +('10', '70', '8', '83659', '84387', '10'), +('10', '70', '8', '69064', '83585', '10'), +('10', '70', '8', '71656', '70838', '10'), +('10', '70', '6', '71666', '106462', '10'), +('10', '70', '6', '83660', '77598', '10'), +('10', '70', '6', '47280', '65077', '10'), +('10', '70', '6', '83635', '58768', '10'), +('10', '70', '17', '83604', '69186', '10'), +('10', '70', '17', '69151', '65496', '10'), +('10', '70', '17', '70921', '59574', '10'), +('10', '70', '17', '47649', '55840', '10'), +('10', '70', '7', '83565', '57840', '10'), +('10', '70', '7', '83495', '54228', '10'), +('10', '70', '7', '68886', '52342', '10'), +('10', '70', '7', '70917', '51971', '10'), +('10', '70', '9', '69127', '69922', '10'), +('10', '70', '9', '83653', '62213', '10'), +('10', '70', '9', '68767', '51403', '10'), +('10', '70', '9', '70918', '51234', '10'), +('10', '70', '15', '83629', '124666', '10'), +('10', '70', '15', '69160', '86246', '10'), +('10', '70', '15', '47238', '82597', '10'), +('10', '70', '15', '47291', '72537', '10'), +('10', '70', '20', '47284', '81792', '10'), +('10', '70', '20', '47282', '74154', '10'), +('10', '70', '20', '83600', '64917', '10'), +('10', '70', '20', '83650', '59873', '10'), +('10', '70', '12', '70919', '97189', '10'), +('10', '70', '12', '83569', '58214', '10'), +('10', '70', '12', '83503', '48428', '10'), +('10', '70', '12', '69253', '46960', '10'), +('10', '70', '18', '83608', '129433', '10'), +('10', '70', '18', '70922', '84947', '10'), +('10', '70', '18', '69147', '52759', '10'), +('10', '70', '18', '71647', '50518', '10'), +('10', '70', '19', '83573', '96114', '10'), +('10', '70', '19', '47217', '65518', '10'), +('10', '70', '19', '70920', '64116', '10'), +('10', '70', '19', '83541', '50237', '10'), +('10', '70', '13', '83460', '76234', '10'), +('10', '70', '13', '83631', '72841', '10'), +('10', '70', '13', '83508', '68775', '10'), +('10', '70', '13', '57405', '57681', '10'), +('10', '70', '14', '69155', '86367', '10'), +('10', '70', '14', '83460', '76234', '10'), +('10', '70', '14', '39315', '68931', '10'), +('10', '70', '14', '83508', '68775', '10'), +('10', '70', '11', '68952', '69397', '10'), +('10', '70', '11', '83665', '63369', '10'), +('10', '70', '11', '71652', '62671', '10'), +('10', '70', '11', '83657', '61831', '10'), +('10', '70', '22', '21805', '0', '9'), +('10', '70', '22', '61948', '0', '9'), +('10', '70', '22', '21807', '0', '9'), +('10', '70', '22', '12425', '0', '9'), +('10', '70', '1', '71668', '76106', '9'), +('10', '70', '1', '47289', '57091', '9'), +('10', '70', '1', '47288', '55085', '9'), +('10', '70', '1', '5594', '55084', '9'), +('10', '70', '2', '70916', '53127', '9'), +('10', '70', '2', '47209', '46828', '9'), +('10', '70', '2', '69088', '39428', '9'), +('10', '70', '2', '71078', '37768', '9'), +('10', '70', '3', '69068', '82371', '9'), +('10', '70', '3', '70620', '74587', '9'), +('10', '70', '3', '71626', '59775', '9'), +('10', '70', '3', '70602', '59434', '9'), +('10', '70', '5', '69097', '83445', '9'), +('10', '70', '5', '68950', '83409', '9'), +('10', '70', '5', '70705', '58233', '9'), +('10', '70', '5', '47276', '57360', '9'), +('10', '70', '8', '69064', '83585', '9'), +('10', '70', '8', '71656', '70838', '9'), +('10', '70', '8', '47306', '58655', '9'), +('10', '70', '8', '71665', '56961', '9'), +('10', '70', '6', '71666', '106462', '9'), +('10', '70', '6', '47280', '65077', '9'), +('10', '70', '6', '69073', '57954', '9'), +('10', '70', '6', '13647', '57895', '9'), +('10', '70', '17', '69151', '65496', '9'), +('10', '70', '17', '70921', '59574', '9'), +('10', '70', '17', '47649', '55840', '9'), +('10', '70', '17', '71095', '53702', '9'), +('10', '70', '7', '68886', '52342', '9'), +('10', '70', '7', '70917', '51971', '9'), +('10', '70', '7', '47205', '46908', '9'), +('10', '70', '7', '70711', '45759', '9'), +('10', '70', '9', '69127', '69922', '9'), +('10', '70', '9', '68767', '51403', '9'), +('10', '70', '9', '70918', '51234', '9'), +('10', '70', '9', '47221', '46967', '9'), +('10', '70', '15', '69160', '86246', '9'), +('10', '70', '15', '47238', '82597', '9'), +('10', '70', '15', '47291', '72537', '9'), +('10', '70', '15', '47290', '54392', '9'), +('10', '70', '20', '47284', '81792', '9'), +('10', '70', '20', '47282', '74154', '9'), +('10', '70', '20', '68951', '56596', '9'), +('10', '70', '20', '47281', '51663', '9'), +('10', '70', '12', '70919', '97189', '9'), +('10', '70', '12', '69253', '46960', '9'), +('10', '70', '12', '47213', '46906', '9'), +('10', '70', '12', '69084', '45606', '9'), +('10', '70', '18', '70922', '84947', '9'), +('10', '70', '18', '69147', '52759', '9'), +('10', '70', '18', '71647', '50518', '9'), +('10', '70', '18', '47201', '47825', '9'), +('10', '70', '19', '47217', '65518', '9'), +('10', '70', '19', '70920', '64116', '9'), +('10', '70', '19', '71081', '49255', '9'), +('10', '70', '19', '69178', '46547', '9'), +('10', '70', '13', '57405', '57681', '9'), +('10', '70', '13', '71671', '57036', '9'), +('10', '70', '13', '47308', '52375', '9'), +('10', '70', '13', '47307', '51531', '9'), +('10', '70', '14', '69155', '86367', '9'), +('10', '70', '14', '39315', '68931', '9'), +('10', '70', '14', '27280', '60825', '9'), +('10', '70', '14', '71671', '57036', '9'), +('10', '70', '11', '68952', '69397', '9'), +('10', '70', '11', '71652', '62671', '9'), +('10', '70', '11', '20898', '55213', '9'), +('10', '70', '11', '71659', '54447', '9'), +('10', '70', '22', '21805', '0', '8'), +('10', '70', '22', '61948', '0', '8'), +('10', '70', '22', '21807', '0', '8'), +('10', '70', '22', '12425', '0', '8'), +('10', '70', '1', '47289', '57091', '8'), +('10', '70', '1', '47288', '55085', '8'), +('10', '70', '1', '5594', '55084', '8'), +('10', '70', '1', '47235', '52722', '8'), +('10', '70', '2', '70916', '53127', '8'), +('10', '70', '2', '47209', '46828', '8'), +('10', '70', '2', '69088', '39428', '8'), +('10', '70', '2', '71078', '37768', '8'), +('10', '70', '3', '69068', '82371', '8'), +('10', '70', '3', '70620', '74587', '8'), +('10', '70', '3', '70602', '59434', '8'), +('10', '70', '3', '47299', '58663', '8'), +('10', '70', '5', '69097', '83445', '8'), +('10', '70', '5', '68950', '83409', '8'), +('10', '70', '5', '70705', '58233', '8'), +('10', '70', '5', '47276', '57360', '8'), +('10', '70', '8', '69064', '83585', '8'), +('10', '70', '8', '47306', '58655', '8'), +('10', '70', '8', '47304', '50794', '8'), +('10', '70', '8', '69164', '50721', '8'), +('10', '70', '6', '47280', '65077', '8'), +('10', '70', '6', '69073', '57954', '8'), +('10', '70', '6', '13647', '57895', '8'), +('10', '70', '6', '47229', '57419', '8'), +('10', '70', '17', '69151', '65496', '8'), +('10', '70', '17', '70921', '59574', '8'), +('10', '70', '17', '47649', '55840', '8'), +('10', '70', '17', '71095', '53702', '8'), +('10', '70', '7', '68886', '52342', '8'), +('10', '70', '7', '70917', '51971', '8'), +('10', '70', '7', '47205', '46908', '8'), +('10', '70', '7', '70711', '45759', '8'), +('10', '70', '9', '69127', '69922', '8'), +('10', '70', '9', '68767', '51403', '8'), +('10', '70', '9', '70918', '51234', '8'), +('10', '70', '9', '47221', '46967', '8'), +('10', '70', '15', '69160', '86246', '8'), +('10', '70', '15', '47238', '82597', '8'), +('10', '70', '15', '47291', '72537', '8'), +('10', '70', '15', '47290', '54392', '8'), +('10', '70', '20', '47284', '81792', '8'), +('10', '70', '20', '47282', '74154', '8'), +('10', '70', '20', '68951', '56596', '8'), +('10', '70', '20', '47281', '51663', '8'), +('10', '70', '12', '70919', '97189', '8'), +('10', '70', '12', '69253', '46960', '8'), +('10', '70', '12', '47213', '46906', '8'), +('10', '70', '12', '69084', '45606', '8'), +('10', '70', '18', '70922', '84947', '8'), +('10', '70', '18', '69147', '52759', '8'), +('10', '70', '18', '47201', '47825', '8'), +('10', '70', '18', '68975', '42139', '8'), +('10', '70', '19', '47217', '65518', '8'), +('10', '70', '19', '70920', '64116', '8'), +('10', '70', '19', '71081', '49255', '8'), +('10', '70', '19', '69178', '46547', '8'), +('10', '70', '13', '57405', '57681', '8'), +('10', '70', '13', '47308', '52375', '8'), +('10', '70', '13', '47307', '51531', '8'), +('10', '70', '13', '69098', '48799', '8'), +('10', '70', '14', '69155', '86367', '8'), +('10', '70', '14', '39315', '68931', '8'), +('10', '70', '14', '27280', '60825', '8'), +('10', '70', '14', '47308', '52375', '8'), +('10', '70', '11', '68952', '69397', '8'), +('10', '70', '11', '20898', '55213', '8'), +('10', '70', '11', '47298', '51400', '8'), +('10', '70', '11', '47296', '50828', '8'), +('10', '71', '22', '12425', '0', '11'), +('10', '71', '22', '21807', '0', '11'), +('10', '71', '22', '39342', '0', '11'), +('10', '71', '22', '7867', '0', '11'), +('10', '71', '1', '39329', '123110', '11'), +('10', '71', '1', '71668', '75112', '11'), +('10', '71', '1', '83662', '70044', '11'), +('10', '71', '1', '83630', '65902', '11'), +('10', '71', '2', '83561', '56797', '11'), +('10', '71', '2', '70916', '53133', '11'), +('10', '71', '2', '83551', '50594', '11'), +('10', '71', '2', '47209', '46833', '11'), +('10', '71', '3', '69068', '80126', '11'), +('10', '71', '3', '70620', '72842', '11'), +('10', '71', '3', '39368', '71170', '11'), +('10', '71', '3', '83636', '66373', '11'), +('10', '71', '5', '83612', '84273', '11'), +('10', '71', '5', '69097', '81201', '11'), +('10', '71', '5', '68950', '81163', '11'), +('10', '71', '5', '39366', '70981', '11'), +('10', '71', '8', '39293', '122217', '11'), +('10', '71', '8', '83532', '85191', '11'), +('10', '71', '8', '83659', '83388', '11'), +('10', '71', '8', '69064', '81591', '11'), +('10', '71', '6', '71666', '103968', '11'), +('10', '71', '6', '83660', '76899', '11'), +('10', '71', '6', '39269', '73725', '11'), +('10', '71', '6', '39362', '64794', '11'), +('10', '71', '17', '83604', '68992', '11'), +('10', '71', '17', '69151', '64600', '11'), +('10', '71', '17', '70921', '59580', '11'), +('10', '71', '17', '47649', '54597', '11'), +('10', '71', '7', '39273', '58656', '11'), +('10', '71', '7', '83565', '57847', '11'), +('10', '71', '7', '83495', '53933', '11'), +('10', '71', '7', '70917', '51976', '11'), +('10', '71', '9', '51707', '125339', '11'), +('10', '71', '9', '39225', '88511', '11'), +('10', '71', '9', '69127', '68676', '11'), +('10', '71', '9', '39345', '63290', '11'), +('10', '71', '15', '83629', '121673', '11'), +('10', '71', '15', '69160', '84247', '11'), +('10', '71', '15', '47238', '80852', '11'), +('10', '71', '15', '39277', '77727', '11'), +('10', '71', '20', '47284', '80295', '11'), +('10', '71', '20', '47282', '73157', '11'), +('10', '71', '20', '39350', '64603', '11'), +('10', '71', '20', '83600', '64573', '11'), +('10', '71', '12', '70919', '94946', '11'), +('10', '71', '12', '39356', '85044', '11'), +('10', '71', '12', '83569', '58221', '11'), +('10', '71', '12', '39219', '52989', '11'), +('10', '71', '18', '83608', '126439', '11'), +('10', '71', '18', '70922', '83448', '11'), +('10', '71', '18', '69147', '52513', '11'), +('10', '71', '18', '71647', '50272', '11'), +('10', '71', '19', '83573', '94371', '11'), +('10', '71', '19', '47217', '64623', '11'), +('10', '71', '19', '70920', '63524', '11'), +('10', '71', '19', '83541', '50241', '11'), +('10', '71', '13', '39211', '75048', '11'), +('10', '71', '13', '83460', '74489', '11'), +('10', '71', '13', '83631', '72147', '11'), +('10', '71', '13', '83508', '67779', '11'), +('10', '71', '14', '69155', '84367', '11'), +('10', '71', '14', '39211', '75048', '11'), +('10', '71', '14', '83460', '74489', '11'), +('10', '71', '14', '39372', '71073', '11'), +('10', '71', '11', '39287', '122338', '11'), +('10', '71', '11', '39371', '70903', '11'), +('10', '71', '11', '39320', '67934', '11'), +('10', '71', '11', '68952', '67902', '11'), +('10', '72', '22', '12425', '0', '11'), +('10', '72', '22', '21807', '0', '11'), +('10', '72', '22', '39342', '0', '11'), +('10', '72', '22', '7867', '0', '11'), +('10', '72', '1', '39329', '120115', '11'), +('10', '72', '1', '71668', '74118', '11'), +('10', '72', '1', '83662', '69702', '11'), +('10', '72', '1', '83630', '65556', '11'), +('10', '72', '2', '83561', '56804', '11'), +('10', '72', '2', '70916', '53139', '11'), +('10', '72', '2', '83551', '50598', '11'), +('10', '72', '2', '47209', '46838', '11'), +('10', '72', '3', '69068', '77882', '11'), +('10', '72', '3', '39368', '71177', '11'), +('10', '72', '3', '70620', '71096', '11'), +('10', '72', '3', '83636', '66029', '11'), +('10', '72', '5', '83612', '83079', '11'), +('10', '72', '5', '69097', '78956', '11'), +('10', '72', '5', '68950', '78918', '11'), +('10', '72', '5', '39366', '70989', '11'), +('10', '72', '8', '39293', '119222', '11'), +('10', '72', '8', '83532', '83196', '11'), +('10', '72', '8', '83659', '82388', '11'), +('10', '72', '8', '69064', '79596', '11'), +('10', '72', '6', '71666', '101474', '11'), +('10', '72', '6', '83660', '76200', '11'), +('10', '72', '6', '39269', '73031', '11'), +('10', '72', '6', '39362', '64802', '11'), +('10', '72', '17', '83604', '68798', '11'), +('10', '72', '17', '69151', '63704', '11'), +('10', '72', '17', '70921', '59586', '11'), +('10', '72', '17', '47649', '53354', '11'), +('10', '72', '7', '39273', '58660', '11'), +('10', '72', '7', '83565', '57854', '11'), +('10', '72', '7', '83495', '53637', '11'), +('10', '72', '7', '70917', '51981', '11'), +('10', '72', '9', '51707', '122345', '11'), +('10', '72', '9', '39225', '86766', '11'), +('10', '72', '9', '69127', '67429', '11'), +('10', '72', '9', '39345', '63295', '11'), +('10', '72', '15', '83629', '118680', '11'), +('10', '72', '15', '69160', '82248', '11'), +('10', '72', '15', '47238', '79107', '11'), +('10', '72', '15', '39277', '76731', '11'), +('10', '72', '20', '47284', '78798', '11'), +('10', '72', '20', '47282', '72161', '11'), +('10', '72', '20', '39350', '64609', '11'), +('10', '72', '20', '83600', '64230', '11'), +('10', '72', '12', '70919', '92703', '11'), +('10', '72', '12', '39356', '84049', '11'), +('10', '72', '12', '83569', '58228', '11'), +('10', '72', '12', '39219', '52994', '11'), +('10', '72', '18', '83608', '123445', '11'), +('10', '72', '18', '70922', '81949', '11'), +('10', '72', '18', '69147', '52267', '11'), +('10', '72', '18', '71647', '50026', '11'), +('10', '72', '19', '83573', '92628', '11'), +('10', '72', '19', '47217', '63727', '11'), +('10', '72', '19', '70920', '62932', '11'), +('10', '72', '19', '83541', '50245', '11'), +('10', '72', '13', '39211', '74054', '11'), +('10', '72', '13', '83460', '72744', '11'), +('10', '72', '13', '83631', '71453', '11'), +('10', '72', '13', '83508', '66784', '11'), +('10', '72', '14', '69155', '82368', '11'), +('10', '72', '14', '39211', '74054', '11'), +('10', '72', '14', '83460', '72744', '11'), +('10', '72', '14', '39372', '71080', '11'), +('10', '72', '11', '39287', '119343', '11'), +('10', '72', '11', '39371', '70908', '11'), +('10', '72', '11', '39320', '67591', '11'), +('10', '72', '11', '68952', '66406', '11'), +('10', '73', '22', '12425', '0', '11'), +('10', '73', '22', '21807', '0', '11'), +('10', '73', '22', '39342', '0', '11'), +('10', '73', '22', '7867', '0', '11'), +('10', '73', '1', '39329', '117120', '11'), +('10', '73', '1', '71668', '73124', '11'), +('10', '73', '1', '83662', '69359', '11'), +('10', '73', '1', '83630', '65211', '11'), +('10', '73', '2', '83561', '56811', '11'), +('10', '73', '2', '70916', '53145', '11'), +('10', '73', '2', '83551', '50603', '11'), +('10', '73', '2', '47209', '46842', '11'), +('10', '73', '3', '69068', '75638', '11'), +('10', '73', '3', '39368', '71185', '11'), +('10', '73', '3', '70620', '69351', '11'), +('10', '73', '3', '83636', '65685', '11'), +('10', '73', '5', '83612', '81886', '11'), +('10', '73', '5', '69097', '76712', '11'), +('10', '73', '5', '68950', '76672', '11'), +('10', '73', '5', '39366', '70996', '11'), +('10', '73', '8', '39293', '116226', '11'), +('10', '73', '8', '83659', '81389', '11'), +('10', '73', '8', '83532', '81201', '11'), +('10', '73', '8', '69064', '77601', '11'), +('10', '73', '6', '71666', '98980', '11'), +('10', '73', '6', '83660', '75501', '11'), +('10', '73', '6', '39269', '72337', '11'), +('10', '73', '6', '39362', '64809', '11'), +('10', '73', '17', '83604', '68604', '11'), +('10', '73', '17', '69151', '62808', '11'), +('10', '73', '17', '70921', '59592', '11'), +('10', '73', '17', '47649', '52111', '11'), +('10', '73', '7', '39273', '58664', '11'), +('10', '73', '7', '83565', '57861', '11'), +('10', '73', '7', '83495', '53342', '11'), +('10', '73', '7', '70917', '51986', '11'), +('10', '73', '9', '51707', '119351', '11'), +('10', '73', '9', '39225', '85020', '11'), +('10', '73', '9', '69127', '66183', '11'), +('10', '73', '9', '39345', '63300', '11'), +('10', '73', '15', '83629', '115686', '11'), +('10', '73', '15', '69160', '80248', '11'), +('10', '73', '15', '47238', '77362', '11'), +('10', '73', '15', '39277', '75736', '11'), +('10', '73', '20', '47284', '77302', '11'), +('10', '73', '20', '47282', '71165', '11'), +('10', '73', '20', '39350', '64614', '11'), +('10', '73', '20', '39360', '64121', '11'), +('10', '73', '12', '70919', '90460', '11'), +('10', '73', '12', '39356', '83054', '11'), +('10', '73', '12', '83569', '58235', '11'), +('10', '73', '12', '39219', '52999', '11'), +('10', '73', '18', '83608', '120451', '11'), +('10', '73', '18', '70922', '80449', '11'), +('10', '73', '18', '69147', '52020', '11'), +('10', '73', '18', '71647', '49780', '11'), +('10', '73', '19', '83573', '90885', '11'), +('10', '73', '19', '47217', '62832', '11'), +('10', '73', '19', '70920', '62340', '11'), +('10', '73', '19', '83541', '50249', '11'), +('10', '73', '13', '39211', '73060', '11'), +('10', '73', '13', '83460', '71000', '11'), +('10', '73', '13', '83631', '70759', '11'), +('10', '73', '13', '83508', '65788', '11'), +('10', '73', '14', '69155', '80369', '11'), +('10', '73', '14', '39211', '73060', '11'), +('10', '73', '14', '39372', '71088', '11'), +('10', '73', '14', '83460', '71000', '11'), +('10', '73', '11', '39287', '116349', '11'), +('10', '73', '11', '39371', '70913', '11'), +('10', '73', '11', '39320', '67247', '11'), +('10', '73', '11', '39281', '65805', '11'), +('10', '74', '22', '12425', '0', '11'), +('10', '74', '22', '21807', '0', '11'), +('10', '74', '22', '39342', '0', '11'), +('10', '74', '22', '7867', '0', '11'), +('10', '74', '1', '39329', '114125', '11'), +('10', '74', '1', '71668', '72130', '11'), +('10', '74', '1', '83662', '69016', '11'), +('10', '74', '1', '83630', '64866', '11'), +('10', '74', '2', '83561', '56818', '11'), +('10', '74', '2', '70916', '53151', '11'), +('10', '74', '2', '83551', '50608', '11'), +('10', '74', '2', '47209', '46847', '11'), +('10', '74', '3', '69068', '73393', '11'), +('10', '74', '3', '39368', '71193', '11'), +('10', '74', '3', '70620', '67606', '11'), +('10', '74', '3', '83658', '65455', '11'), +('10', '74', '5', '83612', '80693', '11'), +('10', '74', '5', '69097', '74467', '11'), +('10', '74', '5', '68950', '74426', '11'), +('10', '74', '5', '39366', '71004', '11'), +('10', '74', '8', '39293', '113231', '11'), +('10', '74', '8', '83659', '80390', '11'), +('10', '74', '8', '83532', '79207', '11'), +('10', '74', '8', '69064', '75607', '11'), +('10', '74', '6', '71666', '96486', '11'), +('10', '74', '6', '83660', '74802', '11'), +('10', '74', '6', '39269', '71642', '11'), +('10', '74', '6', '39362', '64817', '11'), +('10', '74', '17', '83604', '68410', '11'), +('10', '74', '17', '69151', '61911', '11'), +('10', '74', '17', '70921', '59598', '11'), +('10', '74', '17', '47649', '50868', '11'), +('10', '74', '7', '39273', '58668', '11'), +('10', '74', '7', '83565', '57868', '11'), +('10', '74', '7', '83495', '53047', '11'), +('10', '74', '7', '70917', '51992', '11'), +('10', '74', '9', '51707', '116356', '11'), +('10', '74', '9', '39225', '83275', '11'), +('10', '74', '9', '69127', '64936', '11'), +('10', '74', '9', '39345', '63305', '11'), +('10', '74', '15', '83629', '112693', '11'), +('10', '74', '15', '69160', '78249', '11'), +('10', '74', '15', '47238', '75617', '11'), +('10', '74', '15', '39277', '74740', '11'), +('10', '74', '20', '47284', '75805', '11'), +('10', '74', '20', '47282', '70169', '11'), +('10', '74', '20', '39350', '64620', '11'), +('10', '74', '20', '39360', '64129', '11'), +('10', '74', '12', '70919', '88217', '11'), +('10', '74', '12', '39356', '82058', '11'), +('10', '74', '12', '83569', '58242', '11'), +('10', '74', '12', '39219', '53003', '11'), +('10', '74', '18', '83608', '117457', '11'), +('10', '74', '18', '70922', '78950', '11'), +('10', '74', '18', '69147', '51774', '11'), +('10', '74', '18', '71647', '49534', '11'), +('10', '74', '19', '83573', '89142', '11'), +('10', '74', '19', '47217', '61936', '11'), +('10', '74', '19', '70920', '61748', '11'), +('10', '74', '19', '83541', '50253', '11'), +('10', '74', '13', '39211', '72065', '11'), +('10', '74', '13', '83631', '70065', '11'), +('10', '74', '13', '83460', '69255', '11'), +('10', '74', '13', '39295', '65340', '11'), +('10', '74', '14', '69155', '78369', '11'), +('10', '74', '14', '39211', '72065', '11'), +('10', '74', '14', '39372', '71095', '11'), +('10', '74', '14', '83460', '69255', '11'), +('10', '74', '11', '39287', '113354', '11'), +('10', '74', '11', '39371', '70918', '11'), +('10', '74', '11', '39320', '66904', '11'), +('10', '74', '11', '39281', '65460', '11'), +('10', '75', '22', '12425', '0', '13'), +('10', '75', '22', '39342', '0', '13'), +('10', '75', '22', '7867', '0', '13'), +('10', '75', '22', '23597', '0', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '75', '1', '39329', '111130', '13'), +('10', '75', '1', '80676', '98587', '13'), +('10', '75', '1', '80660', '94273', '13'), +('10', '75', '1', '80639', '90023', '13'), +('10', '75', '2', '53424', '77033', '13'), +('10', '75', '2', '83561', '56825', '13'), +('10', '75', '2', '70916', '53157', '13'), +('10', '75', '2', '83551', '50613', '13'), +('10', '75', '3', '80647', '90199', '13'), +('10', '75', '3', '46874', '79343', '13'), +('10', '75', '3', '46923', '78999', '13'), +('10', '75', '3', '46852', '72038', '13'), +('10', '75', '5', '80661', '95322', '13'), +('10', '75', '5', '46934', '85817', '13'), +('10', '75', '5', '80626', '85624', '13'), +('10', '75', '5', '83612', '79499', '13'), +('10', '75', '8', '39293', '110235', '13'), +('10', '75', '8', '80689', '98868', '13'), +('10', '75', '8', '80649', '89999', '13'), +('10', '75', '8', '46936', '85633', '13'), +('10', '75', '6', '71666', '93993', '13'), +('10', '75', '6', '80645', '90248', '13'), +('10', '75', '6', '46883', '85816', '13'), +('10', '75', '6', '46933', '85538', '13'), +('10', '75', '17', '83604', '68216', '13'), +('10', '75', '17', '46825', '63595', '13'), +('10', '75', '17', '69151', '61015', '13'), +('10', '75', '17', '70921', '59604', '13'), +('10', '75', '7', '53425', '76676', '13'), +('10', '75', '7', '39273', '58673', '13'), +('10', '75', '7', '83565', '57875', '13'), +('10', '75', '7', '83495', '52751', '13'), +('10', '75', '9', '51707', '113362', '13'), +('10', '75', '9', '46937', '85617', '13'), +('10', '75', '9', '39225', '81530', '13'), +('10', '75', '9', '53426', '76812', '13'), +('10', '75', '15', '83629', '109699', '13'), +('10', '75', '15', '79909', '102396', '13'), +('10', '75', '15', '80686', '98618', '13'), +('10', '75', '15', '80656', '94397', '13'), +('10', '75', '20', '80690', '98868', '13'), +('10', '75', '20', '46886', '85899', '13'), +('10', '75', '20', '80620', '85100', '13'), +('10', '75', '20', '46869', '79157', '13'), +('10', '75', '12', '70919', '85974', '13'), +('10', '75', '12', '39356', '81063', '13'), +('10', '75', '12', '53427', '76725', '13'), +('10', '75', '12', '53949', '76325', '13'), +('10', '75', '18', '83608', '114463', '13'), +('10', '75', '18', '53430', '78841', '13'), +('10', '75', '18', '70922', '77451', '13'), +('10', '75', '18', '46818', '63229', '13'), +('10', '75', '19', '83573', '87399', '13'), +('10', '75', '19', '70920', '61156', '13'), +('10', '75', '19', '47217', '61040', '13'), +('10', '75', '19', '83541', '50257', '13'), +('10', '75', '13', '80633', '89591', '13'), +('10', '75', '13', '80624', '83289', '13'), +('10', '75', '13', '39211', '71071', '13'), +('10', '75', '13', '46991', '69435', '13'), +('10', '75', '14', '80665', '92455', '13'), +('10', '75', '14', '80625', '84652', '13'), +('10', '75', '14', '46925', '79223', '13'), +('10', '75', '14', '46875', '78502', '13'), +('10', '75', '11', '39287', '110360', '13'), +('10', '75', '11', '80668', '98742', '13'), +('10', '75', '11', '46939', '86223', '13'), +('10', '75', '11', '80619', '85924', '13'), +('10', '75', '22', '12425', '0', '12'), +('10', '75', '22', '39342', '0', '12'), +('10', '75', '22', '7867', '0', '12'), +('10', '75', '22', '23597', '0', '12'), +('10', '75', '1', '39329', '111130', '12'), +('10', '75', '1', '46882', '85786', '12'), +('10', '75', '1', '46865', '79473', '12'), +('10', '75', '1', '46914', '79102', '12'), +('10', '75', '2', '53424', '77033', '12'), +('10', '75', '2', '83561', '56825', '12'), +('10', '75', '2', '70916', '53157', '12'), +('10', '75', '2', '83551', '50613', '12'), +('10', '75', '3', '46874', '79343', '12'), +('10', '75', '3', '46923', '78999', '12'), +('10', '75', '3', '46852', '72038', '12'), +('10', '75', '3', '46902', '71329', '12'), +('10', '75', '5', '46934', '85817', '12'), +('10', '75', '5', '83612', '79499', '12'), +('10', '75', '5', '46868', '79353', '12'), +('10', '75', '5', '46917', '79315', '12'), +('10', '75', '8', '39293', '110235', '12'), +('10', '75', '8', '46936', '85633', '12'), +('10', '75', '8', '83659', '79391', '12'), +('10', '75', '8', '83532', '77212', '12'), +('10', '75', '6', '71666', '93993', '12'), +('10', '75', '6', '46883', '85816', '12'), +('10', '75', '6', '46933', '85538', '12'), +('10', '75', '6', '46884', '85096', '12'), +('10', '75', '17', '83604', '68216', '12'), +('10', '75', '17', '46825', '63595', '12'), +('10', '75', '17', '69151', '61015', '12'), +('10', '75', '17', '70921', '59604', '12'), +('10', '75', '7', '53425', '76676', '12'), +('10', '75', '7', '39273', '58673', '12'), +('10', '75', '7', '83565', '57875', '12'), +('10', '75', '7', '83495', '52751', '12'), +('10', '75', '9', '51707', '113362', '12'), +('10', '75', '9', '46937', '85617', '12'), +('10', '75', '9', '39225', '81530', '12'), +('10', '75', '9', '53426', '76812', '12'), +('10', '75', '15', '83629', '109699', '12'), +('10', '75', '15', '46932', '85873', '12'), +('10', '75', '15', '46864', '79627', '12'), +('10', '75', '15', '46915', '78979', '12'), +('10', '75', '20', '46886', '85899', '12'), +('10', '75', '20', '46869', '79157', '12'), +('10', '75', '20', '46920', '79107', '12'), +('10', '75', '20', '47284', '74309', '12'), +('10', '75', '12', '70919', '85974', '12'), +('10', '75', '12', '39356', '81063', '12'), +('10', '75', '12', '53427', '76725', '12'), +('10', '75', '12', '53949', '76325', '12'), +('10', '75', '18', '83608', '114463', '12'), +('10', '75', '18', '53430', '78841', '12'), +('10', '75', '18', '70922', '77451', '12'), +('10', '75', '18', '46818', '63229', '12'), +('10', '75', '19', '83573', '87399', '12'), +('10', '75', '19', '70920', '61156', '12'), +('10', '75', '19', '47217', '61040', '12'), +('10', '75', '19', '83541', '50257', '12'), +('10', '75', '13', '39211', '71071', '12'), +('10', '75', '13', '46991', '69435', '12'), +('10', '75', '13', '83631', '69372', '12'), +('10', '75', '13', '83460', '67511', '12'), +('10', '75', '14', '46925', '79223', '12'), +('10', '75', '14', '46875', '78502', '12'), +('10', '75', '14', '69155', '76370', '12'), +('10', '75', '14', '46903', '72370', '12'), +('10', '75', '11', '39287', '110360', '12'), +('10', '75', '11', '46939', '86223', '12'), +('10', '75', '11', '46889', '84960', '12'), +('10', '75', '11', '46899', '72261', '12'), +('10', '76', '22', '12425', '0', '13'), +('10', '76', '22', '39342', '0', '13'), +('10', '76', '22', '7867', '0', '13'), +('10', '76', '22', '23597', '0', '13'), +('10', '76', '1', '39329', '108135', '13'), +('10', '76', '1', '80676', '98594', '13'), +('10', '76', '1', '80660', '94281', '13'), +('10', '76', '1', '80639', '90030', '13'), +('10', '76', '2', '53424', '77040', '13'), +('10', '76', '2', '83561', '56832', '13'), +('10', '76', '2', '70916', '53163', '13'), +('10', '76', '2', '83551', '50617', '13'), +('10', '76', '3', '80647', '90206', '13'), +('10', '76', '3', '46874', '79350', '13'), +('10', '76', '3', '46923', '79006', '13'), +('10', '76', '3', '46852', '72046', '13'), +('10', '76', '5', '80661', '95330', '13'), +('10', '76', '5', '46934', '85825', '13'), +('10', '76', '5', '80626', '85631', '13'), +('10', '76', '5', '46868', '79361', '13'), +('10', '76', '8', '39293', '107239', '13'), +('10', '76', '8', '80689', '98876', '13'), +('10', '76', '8', '80649', '90006', '13'), +('10', '76', '8', '46936', '85641', '13'), +('10', '76', '6', '71666', '91499', '13'), +('10', '76', '6', '80645', '90256', '13'), +('10', '76', '6', '46883', '85824', '13'), +('10', '76', '6', '46933', '85545', '13'), +('10', '76', '17', '83604', '68022', '13'), +('10', '76', '17', '46825', '63599', '13'), +('10', '76', '17', '69151', '60119', '13'), +('10', '76', '17', '70921', '59609', '13'), +('10', '76', '7', '53425', '76683', '13'), +('10', '76', '7', '39273', '58677', '13'), +('10', '76', '7', '83565', '57882', '13'), +('10', '76', '7', '83495', '52456', '13'), +('10', '76', '9', '51707', '110368', '13'), +('10', '76', '9', '46937', '85625', '13'), +('10', '76', '9', '39225', '79784', '13'), +('10', '76', '9', '53426', '76819', '13'), +('10', '76', '15', '83629', '106706', '13'), +('10', '76', '15', '79909', '102403', '13'), +('10', '76', '15', '80686', '98626', '13'), +('10', '76', '15', '80656', '94405', '13'), +('10', '76', '20', '80690', '98876', '13'), +('10', '76', '20', '46886', '85908', '13'), +('10', '76', '20', '80620', '85101', '13'), +('10', '76', '20', '46869', '79165', '13'), +('10', '76', '12', '70919', '83731', '13'), +('10', '76', '12', '39356', '80068', '13'), +('10', '76', '12', '53427', '76730', '13'), +('10', '76', '12', '53949', '76330', '13'), +('10', '76', '18', '83608', '111469', '13'), +('10', '76', '18', '53430', '78849', '13'), +('10', '76', '18', '70922', '75952', '13'), +('10', '76', '18', '46818', '63234', '13'), +('10', '76', '19', '83573', '85656', '13'), +('10', '76', '19', '70920', '60564', '13'), +('10', '76', '19', '47217', '60145', '13'), +('10', '76', '19', '83541', '50261', '13'), +('10', '76', '13', '80633', '89597', '13'), +('10', '76', '13', '80624', '83295', '13'), +('10', '76', '13', '39211', '70076', '13'), +('10', '76', '13', '46991', '69443', '13'), +('10', '76', '14', '80665', '92461', '13'), +('10', '76', '14', '80625', '84658', '13'), +('10', '76', '14', '46925', '79230', '13'), +('10', '76', '14', '46875', '78507', '13'), +('10', '76', '11', '39287', '107365', '13'), +('10', '76', '11', '80668', '98751', '13'), +('10', '76', '11', '46939', '86231', '13'), +('10', '76', '11', '80619', '85931', '13'), +('10', '77', '22', '12425', '0', '13'), +('10', '77', '22', '39342', '0', '13'), +('10', '77', '22', '7867', '0', '13'), +('10', '77', '22', '23597', '0', '13'), +('10', '77', '1', '39329', '105140', '13'), +('10', '77', '1', '80676', '98601', '13'), +('10', '77', '1', '80660', '94289', '13'), +('10', '77', '1', '80639', '90037', '13'), +('10', '77', '2', '53424', '77047', '13'), +('10', '77', '2', '83561', '56839', '13'), +('10', '77', '2', '70916', '53169', '13'), +('10', '77', '2', '83551', '50622', '13'), +('10', '77', '3', '80647', '90213', '13'), +('10', '77', '3', '46874', '79358', '13'), +('10', '77', '3', '46923', '79013', '13'), +('10', '77', '3', '46852', '72053', '13'), +('10', '77', '5', '80661', '95338', '13'), +('10', '77', '5', '46934', '85833', '13'), +('10', '77', '5', '80626', '85638', '13'), +('10', '77', '5', '46868', '79369', '13'), +('10', '77', '8', '39293', '104244', '13'), +('10', '77', '8', '80689', '98885', '13'), +('10', '77', '8', '80649', '90013', '13'), +('10', '77', '8', '46936', '85649', '13'), +('10', '77', '6', '80645', '90263', '13'), +('10', '77', '6', '71666', '89005', '13'), +('10', '77', '6', '46883', '85833', '13'), +('10', '77', '6', '46933', '85553', '13'), +('10', '77', '17', '83604', '67828', '13'), +('10', '77', '17', '46825', '63602', '13'), +('10', '77', '17', '70921', '59615', '13'), +('10', '77', '17', '69151', '59223', '13'), +('10', '77', '7', '53425', '76690', '13'), +('10', '77', '7', '39273', '58681', '13'), +('10', '77', '7', '83565', '57889', '13'), +('10', '77', '7', '83495', '52160', '13'), +('10', '77', '9', '51707', '107374', '13'), +('10', '77', '9', '46937', '85633', '13'), +('10', '77', '9', '39225', '78039', '13'), +('10', '77', '9', '53426', '76826', '13'), +('10', '77', '15', '83629', '103713', '13'), +('10', '77', '15', '79909', '102410', '13'), +('10', '77', '15', '80686', '98634', '13'), +('10', '77', '15', '80656', '94412', '13'), +('10', '77', '20', '80690', '98885', '13'), +('10', '77', '20', '46886', '85917', '13'), +('10', '77', '20', '80620', '85102', '13'), +('10', '77', '20', '46869', '79173', '13'), +('10', '77', '12', '70919', '81488', '13'), +('10', '77', '12', '39356', '79073', '13'), +('10', '77', '12', '53427', '76735', '13'), +('10', '77', '12', '53949', '76335', '13'), +('10', '77', '18', '83608', '108475', '13'), +('10', '77', '18', '53430', '78856', '13'), +('10', '77', '18', '70922', '74453', '13'), +('10', '77', '18', '46818', '63238', '13'), +('10', '77', '19', '83573', '83913', '13'), +('10', '77', '19', '70920', '59972', '13'), +('10', '77', '19', '47217', '59249', '13'), +('10', '77', '19', '83541', '50265', '13'), +('10', '77', '13', '80633', '89603', '13'), +('10', '77', '13', '80624', '83301', '13'), +('10', '77', '13', '46991', '69450', '13'), +('10', '77', '13', '39211', '69082', '13'), +('10', '77', '14', '80665', '92467', '13'), +('10', '77', '14', '80625', '84664', '13'), +('10', '77', '14', '46925', '79237', '13'), +('10', '77', '14', '46875', '78513', '13'), +('10', '77', '11', '39287', '104370', '13'), +('10', '77', '11', '80668', '98759', '13'), +('10', '77', '11', '46939', '86239', '13'), +('10', '77', '11', '80619', '85938', '13'), +('10', '78', '22', '12425', '0', '13'), +('10', '78', '22', '39342', '0', '13'), +('10', '78', '22', '7867', '0', '13'), +('10', '78', '22', '23597', '0', '13'), +('10', '78', '1', '39329', '102145', '13'), +('10', '78', '1', '80676', '98608', '13'), +('10', '78', '1', '80660', '94297', '13'), +('10', '78', '1', '80639', '90045', '13'), +('10', '78', '2', '53424', '77054', '13'), +('10', '78', '2', '83561', '56846', '13'), +('10', '78', '2', '70916', '53175', '13'), +('10', '78', '2', '83551', '50627', '13'), +('10', '78', '3', '80647', '90221', '13'), +('10', '78', '3', '46874', '79366', '13'), +('10', '78', '3', '46923', '79020', '13'), +('10', '78', '3', '46852', '72061', '13'), +('10', '78', '5', '80661', '95346', '13'), +('10', '78', '5', '46934', '85841', '13'), +('10', '78', '5', '80626', '85645', '13'), +('10', '78', '5', '46868', '79377', '13'), +('10', '78', '8', '39293', '101248', '13'), +('10', '78', '8', '80689', '98893', '13'), +('10', '78', '8', '80649', '90021', '13'), +('10', '78', '8', '46936', '85658', '13'), +('10', '78', '6', '80645', '90270', '13'), +('10', '78', '6', '71666', '86511', '13'), +('10', '78', '6', '46883', '85841', '13'), +('10', '78', '6', '46933', '85561', '13'), +('10', '78', '17', '83604', '67634', '13'), +('10', '78', '17', '46825', '63606', '13'), +('10', '78', '17', '70921', '59621', '13'), +('10', '78', '17', '69151', '58326', '13'), +('10', '78', '7', '53425', '76696', '13'), +('10', '78', '7', '39273', '58685', '13'), +('10', '78', '7', '83565', '57896', '13'), +('10', '78', '7', '70917', '52012', '13'), +('10', '78', '9', '51707', '104379', '13'), +('10', '78', '9', '46937', '85641', '13'), +('10', '78', '9', '53426', '76832', '13'), +('10', '78', '9', '39225', '76293', '13'), +('10', '78', '15', '79909', '102417', '13'), +('10', '78', '15', '83629', '100719', '13'), +('10', '78', '15', '80686', '98643', '13'), +('10', '78', '15', '80656', '94420', '13'), +('10', '78', '20', '80690', '98893', '13'), +('10', '78', '20', '46886', '85926', '13'), +('10', '78', '20', '80620', '85102', '13'), +('10', '78', '20', '46869', '79180', '13'), +('10', '78', '12', '70919', '79245', '13'), +('10', '78', '12', '39356', '78077', '13'), +('10', '78', '12', '53427', '76740', '13'), +('10', '78', '12', '53949', '76340', '13'), +('10', '78', '18', '83608', '105481', '13'), +('10', '78', '18', '53430', '78864', '13'), +('10', '78', '18', '70922', '72954', '13'), +('10', '78', '18', '46818', '63243', '13'), +('10', '78', '19', '83573', '82170', '13'), +('10', '78', '19', '70920', '59380', '13'), +('10', '78', '19', '47217', '58354', '13'), +('10', '78', '19', '83541', '50269', '13'), +('10', '78', '13', '80633', '89608', '13'), +('10', '78', '13', '80624', '83307', '13'), +('10', '78', '13', '46991', '69458', '13'), +('10', '78', '13', '39211', '68087', '13'), +('10', '78', '14', '80665', '92473', '13'), +('10', '78', '14', '80625', '84670', '13'), +('10', '78', '14', '46925', '79244', '13'), +('10', '78', '14', '46875', '78518', '13'), +('10', '78', '11', '39287', '101376', '13'), +('10', '78', '11', '80668', '98767', '13'), +('10', '78', '11', '46939', '86247', '13'), +('10', '78', '11', '80619', '85945', '13'), +('10', '79', '22', '12425', '0', '13'), +('10', '79', '22', '39342', '0', '13'), +('10', '79', '22', '7867', '0', '13'), +('10', '79', '22', '23597', '0', '13'), +('10', '79', '1', '39329', '99150', '13'), +('10', '79', '1', '80676', '98616', '13'), +('10', '79', '1', '80660', '94304', '13'), +('10', '79', '1', '80639', '90052', '13'), +('10', '79', '2', '53424', '77061', '13'), +('10', '79', '2', '83561', '56852', '13'), +('10', '79', '2', '70916', '53181', '13'), +('10', '79', '2', '83551', '50632', '13'), +('10', '79', '3', '80647', '90228', '13'), +('10', '79', '3', '46874', '79374', '13'), +('10', '79', '3', '46923', '79027', '13'), +('10', '79', '3', '46852', '72069', '13'), +('10', '79', '5', '80661', '95354', '13'), +('10', '79', '5', '46934', '85849', '13'), +('10', '79', '5', '80626', '85652', '13'), +('10', '79', '5', '46868', '79385', '13'), +('10', '79', '8', '80689', '98901', '13'), +('10', '79', '8', '39293', '98253', '13'), +('10', '79', '8', '80649', '90028', '13'), +('10', '79', '8', '46936', '85666', '13'), +('10', '79', '6', '80645', '90278', '13'), +('10', '79', '6', '46883', '85849', '13'), +('10', '79', '6', '46933', '85569', '13'), +('10', '79', '6', '46884', '85125', '13'), +('10', '79', '17', '83604', '67440', '13'), +('10', '79', '17', '46825', '63610', '13'), +('10', '79', '17', '70921', '59627', '13'), +('10', '79', '17', '69151', '57430', '13'), +('10', '79', '7', '53425', '76703', '13'), +('10', '79', '7', '39273', '58690', '13'), +('10', '79', '7', '83565', '57903', '13'), +('10', '79', '7', '70917', '52018', '13'), +('10', '79', '9', '51707', '101385', '13'), +('10', '79', '9', '46937', '85649', '13'), +('10', '79', '9', '53426', '76839', '13'), +('10', '79', '9', '39225', '74548', '13'), +('10', '79', '15', '79909', '102424', '13'), +('10', '79', '15', '80686', '98651', '13'), +('10', '79', '15', '83629', '97726', '13'), +('10', '79', '15', '80656', '94428', '13'), +('10', '79', '20', '80690', '98901', '13'), +('10', '79', '20', '46886', '85935', '13'), +('10', '79', '20', '80620', '85103', '13'), +('10', '79', '20', '46869', '79188', '13'), +('10', '79', '12', '39356', '77082', '13'), +('10', '79', '12', '70919', '77001', '13'), +('10', '79', '12', '53427', '76745', '13'), +('10', '79', '12', '53949', '76345', '13'), +('10', '79', '18', '83608', '102487', '13'), +('10', '79', '18', '53430', '78872', '13'), +('10', '79', '18', '70922', '71455', '13'), +('10', '79', '18', '46818', '63247', '13'), +('10', '79', '19', '83573', '80426', '13'), +('10', '79', '19', '70920', '58788', '13'), +('10', '79', '19', '47217', '57458', '13'), +('10', '79', '19', '83541', '50273', '13'), +('10', '79', '13', '80633', '89614', '13'), +('10', '79', '13', '80624', '83312', '13'), +('10', '79', '13', '46991', '69466', '13'), +('10', '79', '13', '39211', '67093', '13'), +('10', '79', '14', '80665', '92478', '13'), +('10', '79', '14', '80625', '84675', '13'), +('10', '79', '14', '46925', '79251', '13'), +('10', '79', '14', '46875', '78523', '13'), +('10', '79', '11', '80668', '98775', '13'), +('10', '79', '11', '39287', '98381', '13'), +('10', '79', '11', '46939', '86255', '13'), +('10', '79', '11', '80619', '85952', '13'), +('10', '80', '22', '12425', '0', '14'), +('10', '80', '22', '39342', '0', '14'), +('10', '80', '22', '7867', '0', '14'), +('10', '80', '22', '23597', '0', '14'), +('10', '80', '1', '102611', '128784', '14'), +('10', '80', '1', '102625', '128458', '14'), +('10', '80', '1', '102639', '128287', '14'), +('10', '80', '1', '102640', '128286', '14'), +('10', '80', '2', '102010', '86536', '14'), +('10', '80', '2', '102262', '77804', '14'), +('10', '80', '2', '53424', '77068', '14'), +('10', '80', '2', '83561', '56859', '14'), +('10', '80', '3', '102612', '136701', '14'), +('10', '80', '3', '102626', '135881', '14'), +('10', '80', '3', '102742', '123832', '14'), +('10', '80', '3', '102560', '119621', '14'), +('10', '80', '5', '102731', '142346', '14'), +('10', '80', '5', '102613', '134149', '14'), +('10', '80', '5', '102627', '133111', '14'), +('10', '80', '5', '102730', '123748', '14'), +('10', '80', '8', '102728', '141202', '14'), +('10', '80', '8', '102615', '136685', '14'), +('10', '80', '8', '102629', '136245', '14'), +('10', '80', '8', '102569', '119721', '14'), +('10', '80', '6', '102614', '137480', '14'), +('10', '80', '6', '102628', '136391', '14'), +('10', '80', '6', '102561', '119831', '14'), +('10', '80', '6', '80645', '90285', '14'), +('10', '80', '17', '102013', '92288', '14'), +('10', '80', '17', '102265', '83041', '14'), +('10', '80', '17', '83604', '67246', '14'), +('10', '80', '17', '46825', '63614', '14'), +('10', '80', '7', '102011', '87676', '14'), +('10', '80', '7', '102263', '78530', '14'), +('10', '80', '7', '53425', '76710', '14'), +('10', '80', '7', '39273', '58694', '14'), +('10', '80', '9', '67098', '231065', '14'), +('10', '80', '9', '51707', '98391', '14'), +('10', '80', '9', '46937', '85657', '14'), +('10', '80', '9', '53426', '76846', '14'), +('10', '80', '15', '102723', '140901', '14'), +('10', '80', '15', '102616', '130567', '14'), +('10', '80', '15', '102636', '130041', '14'), +('10', '80', '15', '102635', '129773', '14'), +('10', '80', '20', '102617', '137050', '14'), +('10', '80', '20', '102631', '136574', '14'), +('10', '80', '20', '102563', '119478', '14'), +('10', '80', '20', '80690', '98910', '14'), +('10', '80', '12', '53427', '76750', '14'), +('10', '80', '12', '53949', '76350', '14'), +('10', '80', '12', '39356', '76087', '14'), +('10', '80', '12', '70919', '74758', '14'), +('10', '80', '18', '83608', '99493', '14'), +('10', '80', '18', '102012', '88831', '14'), +('10', '80', '18', '102264', '80548', '14'), +('10', '80', '18', '53430', '78880', '14'), +('10', '80', '19', '83573', '78683', '14'), +('10', '80', '19', '102261', '75801', '14'), +('10', '80', '19', '76131', '73145', '14'), +('10', '80', '19', '70920', '58196', '14'), +('10', '80', '13', '93856', '138176', '14'), +('10', '80', '13', '102735', '123072', '14'), +('10', '80', '13', '102734', '113728', '14'), +('10', '80', '13', '102582', '108976', '14'), +('10', '80', '14', '102632', '136358', '14'), +('10', '80', '14', '102633', '136341', '14'), +('10', '80', '14', '102570', '118550', '14'), +('10', '80', '14', '80665', '92484', '14'), +('10', '80', '11', '102643', '131452', '14'), +('10', '80', '11', '80668', '98784', '14'), +('10', '80', '11', '39287', '95387', '14'), +('10', '80', '11', '46939', '86263', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '81', '22', '12425', '0', '14'), +('10', '81', '22', '39342', '0', '14'), +('10', '81', '22', '7867', '0', '14'), +('10', '81', '22', '23597', '0', '14'), +('10', '81', '1', '102611', '128792', '14'), +('10', '81', '1', '102625', '128467', '14'), +('10', '81', '1', '102639', '128293', '14'), +('10', '81', '1', '102640', '128292', '14'), +('10', '81', '2', '102010', '86541', '14'), +('10', '81', '2', '102262', '77806', '14'), +('10', '81', '2', '53424', '77075', '14'), +('10', '81', '2', '83561', '56866', '14'), +('10', '81', '3', '102612', '136707', '14'), +('10', '81', '3', '102626', '135887', '14'), +('10', '81', '3', '102742', '123841', '14'), +('10', '81', '3', '102560', '119628', '14'), +('10', '81', '5', '102731', '142356', '14'), +('10', '81', '5', '102613', '134155', '14'), +('10', '81', '5', '102627', '133116', '14'), +('10', '81', '5', '102730', '123756', '14'), +('10', '81', '8', '102728', '141210', '14'), +('10', '81', '8', '102615', '136694', '14'), +('10', '81', '8', '102629', '136250', '14'), +('10', '81', '8', '102569', '119731', '14'), +('10', '81', '6', '102614', '137489', '14'), +('10', '81', '6', '102628', '136399', '14'), +('10', '81', '6', '102561', '119841', '14'), +('10', '81', '6', '80645', '90293', '14'), +('10', '81', '17', '102013', '92297', '14'), +('10', '81', '17', '102265', '83050', '14'), +('10', '81', '17', '83604', '67052', '14'), +('10', '81', '17', '46825', '63617', '14'), +('10', '81', '7', '102011', '87684', '14'), +('10', '81', '7', '102263', '78533', '14'), +('10', '81', '7', '53425', '76717', '14'), +('10', '81', '7', '39273', '58698', '14'), +('10', '81', '9', '67098', '233959', '14'), +('10', '81', '9', '51707', '95397', '14'), +('10', '81', '9', '46937', '85666', '14'), +('10', '81', '9', '53426', '76853', '14'), +('10', '81', '15', '102723', '140909', '14'), +('10', '81', '15', '102616', '130576', '14'), +('10', '81', '15', '102636', '130050', '14'), +('10', '81', '15', '102635', '129779', '14'), +('10', '81', '20', '102617', '137053', '14'), +('10', '81', '20', '102631', '136584', '14'), +('10', '81', '20', '102563', '119485', '14'), +('10', '81', '20', '80690', '98918', '14'), +('10', '81', '12', '53427', '76755', '14'), +('10', '81', '12', '53949', '76355', '14'), +('10', '81', '12', '39356', '75092', '14'), +('10', '81', '12', '102260', '74604', '14'), +('10', '81', '18', '83608', '96499', '14'), +('10', '81', '18', '102012', '88838', '14'), +('10', '81', '18', '102264', '80557', '14'), +('10', '81', '18', '53430', '78887', '14'), +('10', '81', '19', '83573', '76940', '14'), +('10', '81', '19', '102261', '75807', '14'), +('10', '81', '19', '76131', '73148', '14'), +('10', '81', '19', '70920', '57604', '14'), +('10', '81', '13', '93856', '139910', '14'), +('10', '81', '13', '102735', '123079', '14'), +('10', '81', '13', '102734', '113735', '14'), +('10', '81', '13', '102582', '108985', '14'), +('10', '81', '14', '102632', '136367', '14'), +('10', '81', '14', '102633', '136348', '14'), +('10', '81', '14', '102570', '118553', '14'), +('10', '81', '14', '80665', '92490', '14'), +('10', '81', '11', '102643', '131456', '14'), +('10', '81', '11', '80668', '98792', '14'), +('10', '81', '11', '39287', '92392', '14'), +('10', '81', '11', '46939', '86271', '14'), +('10', '82', '22', '12425', '0', '14'), +('10', '82', '22', '39342', '0', '14'), +('10', '82', '22', '7867', '0', '14'), +('10', '82', '22', '23597', '0', '14'), +('10', '82', '1', '102611', '128800', '14'), +('10', '82', '1', '102625', '128477', '14'), +('10', '82', '1', '102639', '128299', '14'), +('10', '82', '1', '102640', '128299', '14'), +('10', '82', '2', '102010', '86546', '14'), +('10', '82', '2', '102262', '77809', '14'), +('10', '82', '2', '53424', '77082', '14'), +('10', '82', '2', '83561', '56873', '14'), +('10', '82', '3', '102612', '136713', '14'), +('10', '82', '3', '102626', '135894', '14'), +('10', '82', '3', '102742', '123850', '14'), +('10', '82', '3', '102560', '119634', '14'), +('10', '82', '5', '102731', '142366', '14'), +('10', '82', '5', '102613', '134160', '14'), +('10', '82', '5', '102627', '133121', '14'), +('10', '82', '5', '102730', '123764', '14'), +('10', '82', '8', '102728', '141218', '14'), +('10', '82', '8', '102615', '136702', '14'), +('10', '82', '8', '102629', '136255', '14'), +('10', '82', '8', '102569', '119741', '14'), +('10', '82', '6', '102614', '137497', '14'), +('10', '82', '6', '102628', '136406', '14'), +('10', '82', '6', '102561', '119852', '14'), +('10', '82', '6', '80645', '90300', '14'), +('10', '82', '17', '102013', '92305', '14'), +('10', '82', '17', '102265', '83059', '14'), +('10', '82', '17', '83604', '66858', '14'), +('10', '82', '17', '46825', '63621', '14'), +('10', '82', '7', '102011', '87691', '14'), +('10', '82', '7', '102263', '78537', '14'), +('10', '82', '7', '53425', '76724', '14'), +('10', '82', '7', '39273', '58702', '14'), +('10', '82', '9', '67098', '236853', '14'), +('10', '82', '9', '51707', '92402', '14'), +('10', '82', '9', '46937', '85674', '14'), +('10', '82', '9', '53426', '76859', '14'), +('10', '82', '15', '102723', '140917', '14'), +('10', '82', '15', '102616', '130586', '14'), +('10', '82', '15', '102636', '130058', '14'), +('10', '82', '15', '102635', '129784', '14'), +('10', '82', '20', '102617', '137055', '14'), +('10', '82', '20', '102631', '136594', '14'), +('10', '82', '20', '102563', '119492', '14'), +('10', '82', '20', '80690', '98926', '14'), +('10', '82', '12', '53427', '76760', '14'), +('10', '82', '12', '53949', '76360', '14'), +('10', '82', '12', '102260', '74612', '14'), +('10', '82', '12', '39356', '74096', '14'), +('10', '82', '18', '83608', '93505', '14'), +('10', '82', '18', '102012', '88845', '14'), +('10', '82', '18', '102264', '80566', '14'), +('10', '82', '18', '53430', '78895', '14'), +('10', '82', '19', '102261', '75812', '14'), +('10', '82', '19', '83573', '75197', '14'), +('10', '82', '19', '76131', '73151', '14'), +('10', '82', '19', '70920', '57012', '14'), +('10', '82', '13', '93856', '141644', '14'), +('10', '82', '13', '102735', '123087', '14'), +('10', '82', '13', '102734', '113741', '14'), +('10', '82', '13', '102582', '108994', '14'), +('10', '82', '14', '102632', '136376', '14'), +('10', '82', '14', '102633', '136354', '14'), +('10', '82', '14', '102570', '118555', '14'), +('10', '82', '14', '80665', '92496', '14'), +('10', '82', '11', '102643', '131460', '14'), +('10', '82', '11', '80668', '98800', '14'), +('10', '82', '11', '39287', '89397', '14'), +('10', '82', '11', '46939', '86279', '14'), +('10', '83', '22', '12425', '0', '14'), +('10', '83', '22', '39342', '0', '14'), +('10', '83', '22', '7867', '0', '14'), +('10', '83', '22', '23597', '0', '14'), +('10', '83', '1', '102611', '128808', '14'), +('10', '83', '1', '102625', '128486', '14'), +('10', '83', '1', '102640', '128305', '14'), +('10', '83', '1', '102639', '128304', '14'), +('10', '83', '2', '102010', '86552', '14'), +('10', '83', '2', '102262', '77811', '14'), +('10', '83', '2', '53424', '77089', '14'), +('10', '83', '2', '83561', '56880', '14'), +('10', '83', '3', '102612', '136719', '14'), +('10', '83', '3', '102626', '135900', '14'), +('10', '83', '3', '102742', '123859', '14'), +('10', '83', '3', '102560', '119641', '14'), +('10', '83', '5', '102731', '142376', '14'), +('10', '83', '5', '102613', '134165', '14'), +('10', '83', '5', '102627', '133127', '14'), +('10', '83', '5', '102730', '123771', '14'), +('10', '83', '8', '102728', '141226', '14'), +('10', '83', '8', '102615', '136711', '14'), +('10', '83', '8', '102629', '136261', '14'), +('10', '83', '8', '102569', '119750', '14'), +('10', '83', '6', '102614', '137505', '14'), +('10', '83', '6', '102628', '136413', '14'), +('10', '83', '6', '102561', '119862', '14'), +('10', '83', '6', '80645', '90307', '14'), +('10', '83', '17', '102013', '92314', '14'), +('10', '83', '17', '102265', '83068', '14'), +('10', '83', '17', '83604', '66664', '14'), +('10', '83', '17', '46825', '63625', '14'), +('10', '83', '7', '102011', '87699', '14'), +('10', '83', '7', '102263', '78540', '14'), +('10', '83', '7', '53425', '76731', '14'), +('10', '83', '7', '39273', '58706', '14'), +('10', '83', '9', '67098', '239747', '14'), +('10', '83', '9', '51707', '89408', '14'), +('10', '83', '9', '46937', '85682', '14'), +('10', '83', '9', '53426', '76866', '14'), +('10', '83', '15', '102723', '140925', '14'), +('10', '83', '15', '102616', '130595', '14'), +('10', '83', '15', '102636', '130066', '14'), +('10', '83', '15', '102635', '129790', '14'), +('10', '83', '20', '102617', '137058', '14'), +('10', '83', '20', '102631', '136604', '14'), +('10', '83', '20', '102563', '119500', '14'), +('10', '83', '20', '80690', '98934', '14'), +('10', '83', '12', '53427', '76765', '14'), +('10', '83', '12', '53949', '76365', '14'), +('10', '83', '12', '102260', '74620', '14'), +('10', '83', '12', '39356', '73101', '14'), +('10', '83', '18', '83608', '90511', '14'), +('10', '83', '18', '102012', '88852', '14'), +('10', '83', '18', '102264', '80576', '14'), +('10', '83', '18', '53430', '78903', '14'), +('10', '83', '19', '102261', '75818', '14'), +('10', '83', '19', '83573', '73454', '14'), +('10', '83', '19', '76131', '73154', '14'), +('10', '83', '19', '70920', '56420', '14'), +('10', '83', '13', '93856', '143378', '14'), +('10', '83', '13', '102735', '123095', '14'), +('10', '83', '13', '102734', '113748', '14'), +('10', '83', '13', '102582', '109004', '14'), +('10', '83', '14', '102632', '136384', '14'), +('10', '83', '14', '102633', '136361', '14'), +('10', '83', '14', '102570', '118558', '14'), +('10', '83', '14', '80665', '92501', '14'), +('10', '83', '11', '102643', '131464', '14'), +('10', '83', '11', '80668', '98809', '14'), +('10', '83', '11', '39287', '86403', '14'), +('10', '83', '11', '46939', '86287', '14'), +('10', '84', '22', '12425', '0', '14'), +('10', '84', '22', '39342', '0', '14'), +('10', '84', '22', '7867', '0', '14'), +('10', '84', '22', '23597', '0', '14'), +('10', '84', '1', '102611', '128816', '14'), +('10', '84', '1', '102625', '128495', '14'), +('10', '84', '1', '102640', '128311', '14'), +('10', '84', '1', '102639', '128310', '14'), +('10', '84', '2', '102010', '86557', '14'), +('10', '84', '2', '102262', '77814', '14'), +('10', '84', '2', '53424', '77096', '14'), +('10', '84', '2', '83561', '56887', '14'), +('10', '84', '3', '102612', '136726', '14'), +('10', '84', '3', '102626', '135906', '14'), +('10', '84', '3', '102742', '123867', '14'), +('10', '84', '3', '102560', '119648', '14'), +('10', '84', '5', '102731', '142386', '14'), +('10', '84', '5', '102613', '134170', '14'), +('10', '84', '5', '102627', '133132', '14'), +('10', '84', '5', '102730', '123779', '14'), +('10', '84', '8', '102728', '141234', '14'), +('10', '84', '8', '102615', '136720', '14'), +('10', '84', '8', '102629', '136266', '14'), +('10', '84', '8', '102569', '119760', '14'), +('10', '84', '6', '102614', '137513', '14'), +('10', '84', '6', '102628', '136421', '14'), +('10', '84', '6', '102561', '119873', '14'), +('10', '84', '6', '80645', '90315', '14'), +('10', '84', '17', '102013', '92323', '14'), +('10', '84', '17', '102265', '83077', '14'), +('10', '84', '17', '83604', '66470', '14'), +('10', '84', '17', '46825', '63629', '14'), +('10', '84', '7', '102011', '87707', '14'), +('10', '84', '7', '102263', '78543', '14'), +('10', '84', '7', '53425', '76738', '14'), +('10', '84', '7', '39273', '58711', '14'), +('10', '84', '9', '67098', '242641', '14'), +('10', '84', '9', '51707', '86414', '14'), +('10', '84', '9', '46937', '85690', '14'), +('10', '84', '9', '53426', '76873', '14'), +('10', '84', '15', '102723', '140933', '14'), +('10', '84', '15', '102616', '130605', '14'), +('10', '84', '15', '102636', '130074', '14'), +('10', '84', '15', '102635', '129795', '14'), +('10', '84', '20', '102617', '137061', '14'), +('10', '84', '20', '102631', '136614', '14'), +('10', '84', '20', '102563', '119507', '14'), +('10', '84', '20', '80690', '98943', '14'), +('10', '84', '12', '53427', '76769', '14'), +('10', '84', '12', '53949', '76369', '14'), +('10', '84', '12', '102260', '74628', '14'), +('10', '84', '12', '39356', '72106', '14'), +('10', '84', '18', '102012', '88858', '14'), +('10', '84', '18', '83608', '87517', '14'), +('10', '84', '18', '102264', '80585', '14'), +('10', '84', '18', '53430', '78911', '14'), +('10', '84', '19', '102261', '75823', '14'), +('10', '84', '19', '76131', '73158', '14'), +('10', '84', '19', '83573', '71711', '14'), +('10', '84', '19', '70920', '55828', '14'), +('10', '84', '13', '93856', '145113', '14'), +('10', '84', '13', '102735', '123102', '14'), +('10', '84', '13', '102734', '113754', '14'), +('10', '84', '13', '102582', '109013', '14'), +('10', '84', '14', '102632', '136393', '14'), +('10', '84', '14', '102633', '136368', '14'), +('10', '84', '14', '102570', '118560', '14'), +('10', '84', '14', '80665', '92507', '14'), +('10', '84', '11', '102643', '131468', '14'), +('10', '84', '11', '80668', '98817', '14'), +('10', '84', '11', '46939', '86294', '14'), +('10', '84', '11', '80619', '85986', '14'), +('10', '85', '22', '39342', '0', '16'), +('10', '85', '22', '7867', '0', '16'), +('10', '85', '22', '23597', '0', '16'), +('10', '85', '22', '53550', '0', '16'), +('10', '85', '1', '111304', '250832', '16'), +('10', '85', '1', '111307', '250683', '16'), +('10', '85', '1', '111310', '250237', '16'), +('10', '85', '1', '111300', '249582', '16'), +('10', '85', '2', '62985', '156988', '16'), +('10', '85', '2', '94056', '156729', '16'), +('10', '85', '2', '62988', '155953', '16'), +('10', '85', '2', '104410', '133040', '16'), +('10', '85', '3', '111314', '251223', '16'), +('10', '85', '3', '111316', '249928', '16'), +('10', '85', '3', '111315', '249877', '16'), +('10', '85', '3', '111013', '219622', '16'), +('10', '85', '5', '111319', '251022', '16'), +('10', '85', '5', '111317', '249361', '16'), +('10', '85', '5', '111318', '249189', '16'), +('10', '85', '5', '111320', '249027', '16'), +('10', '85', '8', '111332', '251353', '16'), +('10', '85', '8', '111330', '250080', '16'), +('10', '85', '8', '111331', '249195', '16'), +('10', '85', '8', '111328', '249041', '16'), +('10', '85', '6', '111323', '251286', '16'), +('10', '85', '6', '111326', '250133', '16'), +('10', '85', '6', '111324', '249736', '16'), +('10', '85', '6', '111022', '219686', '16'), +('10', '85', '17', '81765', '163817', '16'), +('10', '85', '17', '56046', '163341', '16'), +('10', '85', '17', '56083', '163207', '16'), +('10', '85', '17', '104413', '138743', '16'), +('10', '85', '7', '94053', '155773', '16'), +('10', '85', '7', '56080', '155404', '16'), +('10', '85', '7', '104411', '131944', '16'), +('10', '85', '7', '54848', '100468', '16'), +('10', '85', '9', '67098', '245535', '16'), +('10', '85', '9', '81764', '151932', '16'), +('10', '85', '9', '56070', '151731', '16'), +('10', '85', '9', '62984', '151619', '16'), +('10', '85', '15', '111350', '251999', '16'), +('10', '85', '15', '111344', '251558', '16'), +('10', '85', '15', '111340', '251035', '16'), +('10', '85', '15', '111342', '249877', '16'), +('10', '85', '20', '111356', '251422', '16'), +('10', '85', '20', '111352', '250452', '16'), +('10', '85', '20', '111351', '249778', '16'), +('10', '85', '20', '111054', '219821', '16'), +('10', '85', '12', '56073', '153084', '16'), +('10', '85', '12', '56035', '152762', '16'), +('10', '85', '12', '104408', '129497', '16'), +('10', '85', '12', '49656', '99908', '16'), +('10', '85', '18', '56041', '161953', '16'), +('10', '85', '18', '62986', '160649', '16'), +('10', '85', '18', '94054', '160375', '16'), +('10', '85', '18', '104412', '135859', '16'), +('10', '85', '19', '81763', '157991', '16'), +('10', '85', '19', '56037', '157614', '16'), +('10', '85', '19', '62990', '157599', '16'), +('10', '85', '19', '56075', '157558', '16'), +('10', '85', '13', '111518', '242442', '16'), +('10', '85', '13', '111517', '240246', '16'), +('10', '85', '13', '111217', '219545', '16'), +('10', '85', '13', '111218', '218997', '16'), +('10', '85', '14', '111539', '252777', '16'), +('10', '85', '14', '111537', '251989', '16'), +('10', '85', '14', '111535', '251727', '16'), +('10', '85', '14', '111239', '221176', '16'), +('10', '85', '11', '111337', '250546', '16'), +('10', '85', '11', '111334', '250457', '16'), +('10', '85', '11', '111338', '248770', '16'), +('10', '85', '11', '111033', '218956', '16'), +('10', '85', '22', '12425', '0', '15'), +('10', '85', '22', '39342', '0', '15'), +('10', '85', '22', '7867', '0', '15'), +('10', '85', '22', '23597', '0', '15'), +('10', '85', '1', '107053', '183132', '15'), +('10', '85', '1', '107052', '182288', '15'), +('10', '85', '1', '107054', '181032', '15'), +('10', '85', '1', '107028', '180989', '15'), +('10', '85', '2', '62985', '156988', '15'), +('10', '85', '2', '94056', '156729', '15'), +('10', '85', '2', '62988', '155953', '15'), +('10', '85', '2', '104410', '133040', '15'), +('10', '85', '3', '107055', '184473', '15'), +('10', '85', '3', '107030', '184472', '15'), +('10', '85', '3', '106819', '173390', '15'), +('10', '85', '3', '106841', '172398', '15'), +('10', '85', '5', '107056', '182923', '15'), +('10', '85', '5', '107031', '181097', '15'), +('10', '85', '5', '106820', '173324', '15'), +('10', '85', '5', '106747', '154799', '15'), +('10', '85', '8', '107058', '187103', '15'), +('10', '85', '8', '107033', '185474', '15'), +('10', '85', '8', '106822', '176577', '15'), +('10', '85', '8', '106844', '173906', '15'), +('10', '85', '6', '107057', '184836', '15'), +('10', '85', '6', '107032', '184722', '15'), +('10', '85', '6', '106821', '174370', '15'), +('10', '85', '6', '106843', '172891', '15'), +('10', '85', '17', '81765', '163817', '15'), +('10', '85', '17', '56046', '163341', '15'), +('10', '85', '17', '56083', '163207', '15'), +('10', '85', '17', '104413', '138743', '15'), +('10', '85', '7', '94053', '155773', '15'), +('10', '85', '7', '56080', '155404', '15'), +('10', '85', '7', '104411', '131944', '15'), +('10', '85', '7', '54848', '100468', '15'), +('10', '85', '9', '67098', '245535', '15'), +('10', '85', '9', '81764', '151932', '15'), +('10', '85', '9', '56070', '151731', '15'), +('10', '85', '9', '62984', '151619', '15'), +('10', '85', '15', '107035', '183011', '15'), +('10', '85', '15', '107036', '182671', '15'), +('10', '85', '15', '107051', '181897', '15'), +('10', '85', '15', '107050', '180905', '15'), +('10', '85', '20', '107059', '187788', '15'), +('10', '85', '20', '107037', '187506', '15'), +('10', '85', '20', '106825', '176967', '15'), +('10', '85', '20', '106845', '175031', '15'), +('10', '85', '12', '56073', '153084', '15'), +('10', '85', '12', '56035', '152762', '15'), +('10', '85', '12', '104408', '129497', '15'), +('10', '85', '12', '53427', '76774', '15'), +('10', '85', '18', '56041', '161953', '15'), +('10', '85', '18', '62986', '160649', '15'), +('10', '85', '18', '94054', '160375', '15'), +('10', '85', '18', '104412', '135859', '15'), +('10', '85', '19', '81763', '157991', '15'), +('10', '85', '19', '56037', '157614', '15'), +('10', '85', '19', '62990', '157599', '15'), +('10', '85', '19', '56075', '157558', '15'), +('10', '85', '13', '62931', '157305', '15'), +('10', '85', '13', '62966', '155593', '15'), +('10', '85', '13', '106761', '155330', '15'), +('10', '85', '13', '93856', '146848', '15'), +('10', '85', '14', '107063', '186157', '15'), +('10', '85', '14', '107065', '185592', '15'), +('10', '85', '14', '106850', '176021', '15'), +('10', '85', '14', '106852', '174162', '15'), +('10', '85', '11', '107034', '185203', '15'), +('10', '85', '11', '106823', '174550', '15'), +('10', '85', '11', '56099', '155678', '15'), +('10', '85', '11', '62965', '155052', '15'), +('10', '86', '22', '39342', '0', '16'), +('10', '86', '22', '7867', '0', '16'), +('10', '86', '22', '23597', '0', '16'), +('10', '86', '22', '53550', '0', '16'), +('10', '86', '1', '111304', '250840', '16'), +('10', '86', '1', '111307', '250688', '16'), +('10', '86', '1', '111310', '250244', '16'), +('10', '86', '1', '111300', '249588', '16'), +('10', '86', '2', '62985', '156996', '16'), +('10', '86', '2', '94056', '156735', '16'), +('10', '86', '2', '62988', '155958', '16'), +('10', '86', '2', '104410', '133046', '16'), +('10', '86', '3', '111314', '251230', '16'), +('10', '86', '3', '111316', '249935', '16'), +('10', '86', '3', '111315', '249884', '16'), +('10', '86', '3', '111013', '219630', '16'), +('10', '86', '5', '111319', '251028', '16'), +('10', '86', '5', '111317', '249367', '16'), +('10', '86', '5', '111318', '249195', '16'), +('10', '86', '5', '111320', '249033', '16'), +('10', '86', '8', '111332', '251360', '16'), +('10', '86', '8', '111330', '250087', '16'), +('10', '86', '8', '111331', '249203', '16'), +('10', '86', '8', '111328', '249046', '16'), +('10', '86', '6', '111323', '251294', '16'), +('10', '86', '6', '111326', '250143', '16'), +('10', '86', '6', '111324', '249742', '16'), +('10', '86', '6', '111022', '219693', '16'), +('10', '86', '17', '81765', '163823', '16'), +('10', '86', '17', '56046', '163348', '16'), +('10', '86', '17', '56083', '163211', '16'), +('10', '86', '17', '104413', '138753', '16'), +('10', '86', '7', '94053', '155778', '16'), +('10', '86', '7', '56080', '155412', '16'), +('10', '86', '7', '104411', '131954', '16'), +('10', '86', '7', '54848', '100475', '16'), +('10', '86', '9', '67098', '248430', '16'), +('10', '86', '9', '81764', '151943', '16'), +('10', '86', '9', '56070', '151737', '16'), +('10', '86', '9', '62984', '151627', '16'), +('10', '86', '15', '111350', '252008', '16'), +('10', '86', '15', '111344', '251567', '16'), +('10', '86', '15', '111340', '251042', '16'), +('10', '86', '15', '111342', '249885', '16'), +('10', '86', '20', '111356', '251428', '16'), +('10', '86', '20', '111352', '250460', '16'), +('10', '86', '20', '111351', '249785', '16'), +('10', '86', '20', '111054', '219827', '16'), +('10', '86', '12', '56073', '153091', '16'), +('10', '86', '12', '56035', '152772', '16'), +('10', '86', '12', '104408', '129503', '16'), +('10', '86', '12', '49656', '99909', '16'), +('10', '86', '18', '56041', '161960', '16'), +('10', '86', '18', '62986', '160657', '16'), +('10', '86', '18', '94054', '160380', '16'), +('10', '86', '18', '104412', '135863', '16'), +('10', '86', '19', '81763', '158002', '16'), +('10', '86', '19', '56037', '157622', '16'), +('10', '86', '19', '62990', '157604', '16'), +('10', '86', '19', '56075', '157567', '16'), +('10', '86', '13', '111518', '242450', '16'), +('10', '86', '13', '111517', '240253', '16'), +('10', '86', '13', '111217', '219551', '16'), +('10', '86', '13', '111218', '219004', '16'), +('10', '86', '14', '111539', '252785', '16'), +('10', '86', '14', '111537', '251997', '16'), +('10', '86', '14', '111535', '251734', '16'), +('10', '86', '14', '111239', '221184', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '86', '11', '111337', '250556', '16'), +('10', '86', '11', '111334', '250464', '16'), +('10', '86', '11', '111338', '248776', '16'), +('10', '86', '11', '111033', '218963', '16'), +('10', '87', '22', '39342', '0', '16'), +('10', '87', '22', '7867', '0', '16'), +('10', '87', '22', '23597', '0', '16'), +('10', '87', '22', '53550', '0', '16'), +('10', '87', '1', '111304', '250848', '16'), +('10', '87', '1', '111307', '250692', '16'), +('10', '87', '1', '111310', '250252', '16'), +('10', '87', '1', '111300', '249594', '16'), +('10', '87', '2', '62985', '157005', '16'), +('10', '87', '2', '94056', '156741', '16'), +('10', '87', '2', '62988', '155963', '16'), +('10', '87', '2', '104410', '133052', '16'), +('10', '87', '3', '111314', '251237', '16'), +('10', '87', '3', '111316', '249942', '16'), +('10', '87', '3', '111315', '249891', '16'), +('10', '87', '3', '111013', '219637', '16'), +('10', '87', '5', '111319', '251034', '16'), +('10', '87', '5', '111317', '249374', '16'), +('10', '87', '5', '111318', '249201', '16'), +('10', '87', '5', '111320', '249039', '16'), +('10', '87', '8', '111332', '251368', '16'), +('10', '87', '8', '111330', '250094', '16'), +('10', '87', '8', '111331', '249212', '16'), +('10', '87', '8', '111328', '249051', '16'), +('10', '87', '6', '111323', '251301', '16'), +('10', '87', '6', '111326', '250152', '16'), +('10', '87', '6', '111324', '249748', '16'), +('10', '87', '6', '111022', '219701', '16'), +('10', '87', '17', '81765', '163829', '16'), +('10', '87', '17', '56046', '163356', '16'), +('10', '87', '17', '56083', '163215', '16'), +('10', '87', '17', '104413', '138763', '16'), +('10', '87', '7', '94053', '155784', '16'), +('10', '87', '7', '56080', '155420', '16'), +('10', '87', '7', '104411', '131963', '16'), +('10', '87', '7', '54848', '100481', '16'), +('10', '87', '9', '67098', '251324', '16'), +('10', '87', '9', '81764', '151954', '16'), +('10', '87', '9', '56070', '151744', '16'), +('10', '87', '9', '62984', '151634', '16'), +('10', '87', '15', '111350', '252017', '16'), +('10', '87', '15', '111344', '251576', '16'), +('10', '87', '15', '111340', '251049', '16'), +('10', '87', '15', '111342', '249893', '16'), +('10', '87', '20', '111356', '251434', '16'), +('10', '87', '20', '111352', '250467', '16'), +('10', '87', '20', '111351', '249793', '16'), +('10', '87', '20', '111054', '219834', '16'), +('10', '87', '12', '56073', '153098', '16'), +('10', '87', '12', '56035', '152782', '16'), +('10', '87', '12', '104408', '129510', '16'), +('10', '87', '12', '49656', '99910', '16'), +('10', '87', '18', '56041', '161966', '16'), +('10', '87', '18', '62986', '160666', '16'), +('10', '87', '18', '94054', '160385', '16'), +('10', '87', '18', '104412', '135867', '16'), +('10', '87', '19', '81763', '158012', '16'), +('10', '87', '19', '56037', '157630', '16'), +('10', '87', '19', '62990', '157609', '16'), +('10', '87', '19', '56075', '157575', '16'), +('10', '87', '13', '111518', '242457', '16'), +('10', '87', '13', '111517', '240260', '16'), +('10', '87', '13', '111217', '219558', '16'), +('10', '87', '13', '111218', '219011', '16'), +('10', '87', '14', '111539', '252794', '16'), +('10', '87', '14', '111537', '252004', '16'), +('10', '87', '14', '111535', '251741', '16'), +('10', '87', '14', '111239', '221192', '16'), +('10', '87', '11', '111337', '250566', '16'), +('10', '87', '11', '111334', '250471', '16'), +('10', '87', '11', '111338', '248782', '16'), +('10', '87', '11', '111033', '218970', '16'), +('10', '88', '22', '39342', '0', '16'), +('10', '88', '22', '7867', '0', '16'), +('10', '88', '22', '23597', '0', '16'), +('10', '88', '22', '53550', '0', '16'), +('10', '88', '1', '111304', '250856', '16'), +('10', '88', '1', '111307', '250697', '16'), +('10', '88', '1', '111310', '250259', '16'), +('10', '88', '1', '111300', '249600', '16'), +('10', '88', '2', '62985', '157014', '16'), +('10', '88', '2', '94056', '156747', '16'), +('10', '88', '2', '62988', '155968', '16'), +('10', '88', '2', '104410', '133058', '16'), +('10', '88', '3', '111314', '251244', '16'), +('10', '88', '3', '111316', '249949', '16'), +('10', '88', '3', '111315', '249899', '16'), +('10', '88', '3', '111013', '219644', '16'), +('10', '88', '5', '111319', '251041', '16'), +('10', '88', '5', '111317', '249381', '16'), +('10', '88', '5', '111318', '249206', '16'), +('10', '88', '5', '111320', '249045', '16'), +('10', '88', '8', '111332', '251376', '16'), +('10', '88', '8', '111330', '250100', '16'), +('10', '88', '8', '111331', '249220', '16'), +('10', '88', '8', '111328', '249056', '16'), +('10', '88', '6', '111323', '251309', '16'), +('10', '88', '6', '111326', '250162', '16'), +('10', '88', '6', '111324', '249754', '16'), +('10', '88', '6', '111022', '219708', '16'), +('10', '88', '17', '81765', '163835', '16'), +('10', '88', '17', '56046', '163363', '16'), +('10', '88', '17', '56083', '163219', '16'), +('10', '88', '17', '104413', '138773', '16'), +('10', '88', '7', '94053', '155789', '16'), +('10', '88', '7', '56080', '155429', '16'), +('10', '88', '7', '104411', '131972', '16'), +('10', '88', '7', '54848', '100487', '16'), +('10', '88', '9', '67098', '254219', '16'), +('10', '88', '9', '81764', '151965', '16'), +('10', '88', '9', '56070', '151750', '16'), +('10', '88', '9', '62984', '151641', '16'), +('10', '88', '15', '111350', '252026', '16'), +('10', '88', '15', '111344', '251585', '16'), +('10', '88', '15', '111340', '251056', '16'), +('10', '88', '15', '111342', '249900', '16'), +('10', '88', '20', '111356', '251440', '16'), +('10', '88', '20', '111352', '250474', '16'), +('10', '88', '20', '111351', '249800', '16'), +('10', '88', '20', '111054', '219840', '16'), +('10', '88', '12', '56073', '153106', '16'), +('10', '88', '12', '56035', '152791', '16'), +('10', '88', '12', '104408', '129516', '16'), +('10', '88', '12', '49656', '99910', '16'), +('10', '88', '18', '56041', '161972', '16'), +('10', '88', '18', '62986', '160674', '16'), +('10', '88', '18', '94054', '160391', '16'), +('10', '88', '18', '104412', '135871', '16'), +('10', '88', '19', '81763', '158023', '16'), +('10', '88', '19', '56037', '157638', '16'), +('10', '88', '19', '62990', '157614', '16'), +('10', '88', '19', '56075', '157584', '16'), +('10', '88', '13', '111518', '242464', '16'), +('10', '88', '13', '111517', '240267', '16'), +('10', '88', '13', '111217', '219565', '16'), +('10', '88', '13', '111218', '219018', '16'), +('10', '88', '14', '111539', '252802', '16'), +('10', '88', '14', '111537', '252011', '16'), +('10', '88', '14', '111535', '251748', '16'), +('10', '88', '14', '111239', '221200', '16'), +('10', '88', '11', '111337', '250576', '16'), +('10', '88', '11', '111334', '250477', '16'), +('10', '88', '11', '111338', '248788', '16'), +('10', '88', '11', '111033', '218977', '16'), +('10', '89', '22', '39342', '0', '16'), +('10', '89', '22', '7867', '0', '16'), +('10', '89', '22', '23597', '0', '16'), +('10', '89', '22', '53550', '0', '16'), +('10', '89', '1', '111304', '250865', '16'), +('10', '89', '1', '111307', '250702', '16'), +('10', '89', '1', '111310', '250266', '16'), +('10', '89', '1', '111305', '249609', '16'), +('10', '89', '2', '62985', '157023', '16'), +('10', '89', '2', '94056', '156753', '16'), +('10', '89', '2', '62988', '155973', '16'), +('10', '89', '2', '104410', '133064', '16'), +('10', '89', '3', '111314', '251251', '16'), +('10', '89', '3', '111316', '249956', '16'), +('10', '89', '3', '111315', '249906', '16'), +('10', '89', '3', '111013', '219651', '16'), +('10', '89', '5', '111319', '251047', '16'), +('10', '89', '5', '111317', '249388', '16'), +('10', '89', '5', '111318', '249212', '16'), +('10', '89', '5', '111320', '249051', '16'), +('10', '89', '8', '111332', '251383', '16'), +('10', '89', '8', '111330', '250107', '16'), +('10', '89', '8', '111331', '249229', '16'), +('10', '89', '8', '111328', '249061', '16'), +('10', '89', '6', '111323', '251316', '16'), +('10', '89', '6', '111326', '250172', '16'), +('10', '89', '6', '111324', '249759', '16'), +('10', '89', '6', '111022', '219716', '16'), +('10', '89', '17', '81765', '163840', '16'), +('10', '89', '17', '56046', '163370', '16'), +('10', '89', '17', '56083', '163223', '16'), +('10', '89', '17', '104413', '138783', '16'), +('10', '89', '7', '94053', '155795', '16'), +('10', '89', '7', '56080', '155437', '16'), +('10', '89', '7', '104411', '131981', '16'), +('10', '89', '7', '54848', '100494', '16'), +('10', '89', '9', '67098', '257114', '16'), +('10', '89', '9', '81764', '151976', '16'), +('10', '89', '9', '56070', '151757', '16'), +('10', '89', '9', '62984', '151649', '16'), +('10', '89', '15', '111350', '252034', '16'), +('10', '89', '15', '111344', '251593', '16'), +('10', '89', '15', '111340', '251063', '16'), +('10', '89', '15', '111342', '249908', '16'), +('10', '89', '20', '111356', '251446', '16'), +('10', '89', '20', '111352', '250482', '16'), +('10', '89', '20', '111351', '249807', '16'), +('10', '89', '20', '111054', '219846', '16'), +('10', '89', '12', '56073', '153113', '16'), +('10', '89', '12', '56035', '152801', '16'), +('10', '89', '12', '104408', '129522', '16'), +('10', '89', '12', '49656', '99911', '16'), +('10', '89', '18', '56041', '161979', '16'), +('10', '89', '18', '62986', '160683', '16'), +('10', '89', '18', '94054', '160396', '16'), +('10', '89', '18', '104412', '135875', '16'), +('10', '89', '19', '81763', '158033', '16'), +('10', '89', '19', '56037', '157646', '16'), +('10', '89', '19', '62990', '157619', '16'), +('10', '89', '19', '56075', '157593', '16'), +('10', '89', '13', '111518', '242472', '16'), +('10', '89', '13', '111517', '240274', '16'), +('10', '89', '13', '111217', '219572', '16'), +('10', '89', '13', '111218', '219025', '16'), +('10', '89', '14', '111539', '252810', '16'), +('10', '89', '14', '111537', '252019', '16'), +('10', '89', '14', '111535', '251755', '16'), +('10', '89', '14', '111239', '221208', '16'), +('10', '89', '11', '111337', '250586', '16'), +('10', '89', '11', '111334', '250484', '16'), +('10', '89', '11', '111338', '248794', '16'), +('10', '89', '11', '111033', '218984', '16'), +('10', '90', '22', '39342', '0', '17'), +('10', '90', '22', '7867', '0', '17'), +('10', '90', '22', '23597', '0', '17'), +('10', '90', '22', '53550', '0', '17'), +('10', '90', '1', '111304', '250873', '17'), +('10', '90', '1', '111307', '250707', '17'), +('10', '90', '1', '111310', '250274', '17'), +('10', '90', '1', '111305', '249619', '17'), +('10', '90', '2', '62985', '157031', '17'), +('10', '90', '2', '94056', '156759', '17'), +('10', '90', '2', '62988', '155978', '17'), +('10', '90', '2', '104410', '133071', '17'), +('10', '90', '3', '111314', '251258', '17'), +('10', '90', '3', '111316', '249963', '17'), +('10', '90', '3', '111315', '249913', '17'), +('10', '90', '3', '111013', '219658', '17'), +('10', '90', '5', '111319', '251053', '17'), +('10', '90', '5', '111317', '249395', '17'), +('10', '90', '5', '111318', '249218', '17'), +('10', '90', '5', '111320', '249057', '17'), +('10', '90', '8', '111332', '251391', '17'), +('10', '90', '8', '111330', '250114', '17'), +('10', '90', '8', '111331', '249237', '17'), +('10', '90', '8', '111328', '249066', '17'), +('10', '90', '6', '111323', '251324', '17'), +('10', '90', '6', '111326', '250181', '17'), +('10', '90', '6', '111324', '249765', '17'), +('10', '90', '6', '111022', '219723', '17'), +('10', '90', '17', '81765', '163846', '17'), +('10', '90', '17', '56046', '163377', '17'), +('10', '90', '17', '56083', '163227', '17'), +('10', '90', '17', '104413', '138793', '17'), +('10', '90', '7', '94053', '155800', '17'), +('10', '90', '7', '56080', '155445', '17'), +('10', '90', '7', '104411', '131990', '17'), +('10', '90', '7', '54848', '100500', '17'), +('10', '90', '9', '67098', '260009', '17'), +('10', '90', '9', '81764', '151986', '17'), +('10', '90', '9', '56070', '151763', '17'), +('10', '90', '9', '62984', '151656', '17'), +('10', '90', '15', '111350', '252043', '17'), +('10', '90', '15', '111344', '251602', '17'), +('10', '90', '15', '111340', '251070', '17'), +('10', '90', '15', '111342', '249916', '17'), +('10', '90', '20', '111356', '251452', '17'), +('10', '90', '20', '111352', '250489', '17'), +('10', '90', '20', '111351', '249815', '17'), +('10', '90', '20', '111054', '219852', '17'), +('10', '90', '12', '56073', '153120', '17'), +('10', '90', '12', '56035', '152811', '17'), +('10', '90', '12', '104408', '129528', '17'), +('10', '90', '12', '49656', '99912', '17'), +('10', '90', '18', '56041', '161985', '17'), +('10', '90', '18', '62986', '160691', '17'), +('10', '90', '18', '94054', '160402', '17'), +('10', '90', '18', '104412', '135879', '17'), +('10', '90', '19', '81763', '158044', '17'), +('10', '90', '19', '56037', '157654', '17'), +('10', '90', '19', '62990', '157624', '17'), +('10', '90', '19', '56075', '157601', '17'), +('10', '90', '13', '111518', '242479', '17'), +('10', '90', '13', '111517', '240281', '17'), +('10', '90', '13', '111217', '219578', '17'), +('10', '90', '13', '111218', '219032', '17'), +('10', '90', '14', '111539', '252818', '17'), +('10', '90', '14', '111537', '252026', '17'), +('10', '90', '14', '111535', '251762', '17'), +('10', '90', '14', '111239', '221217', '17'), +('10', '90', '11', '111337', '250596', '17'), +('10', '90', '11', '111334', '250491', '17'), +('10', '90', '11', '111338', '248800', '17'), +('10', '90', '11', '111033', '218991', '17'), +('10', '91', '22', '39342', '0', '17'), +('10', '91', '22', '7867', '0', '17'), +('10', '91', '22', '23597', '0', '17'), +('10', '91', '22', '53550', '0', '17'), +('10', '91', '1', '111304', '250881', '17'), +('10', '91', '1', '111307', '250711', '17'), +('10', '91', '1', '111310', '250281', '17'), +('10', '91', '1', '111305', '249629', '17'), +('10', '91', '2', '62985', '157040', '17'), +('10', '91', '2', '94056', '156765', '17'), +('10', '91', '2', '62988', '155983', '17'), +('10', '91', '2', '104410', '133077', '17'), +('10', '91', '3', '111314', '251265', '17'), +('10', '91', '3', '111316', '249970', '17'), +('10', '91', '3', '111315', '249921', '17'), +('10', '91', '3', '111013', '219665', '17'), +('10', '91', '5', '111319', '251060', '17'), +('10', '91', '5', '111317', '249402', '17'), +('10', '91', '5', '111318', '249223', '17'), +('10', '91', '5', '111320', '249063', '17'), +('10', '91', '8', '111332', '251399', '17'), +('10', '91', '8', '111330', '250121', '17'), +('10', '91', '8', '111331', '249246', '17'), +('10', '91', '8', '111328', '249071', '17'), +('10', '91', '6', '111323', '251331', '17'), +('10', '91', '6', '111326', '250191', '17'), +('10', '91', '6', '111324', '249771', '17'), +('10', '91', '6', '111022', '219731', '17'), +('10', '91', '17', '81765', '163852', '17'), +('10', '91', '17', '56046', '163385', '17'), +('10', '91', '17', '56083', '163231', '17'), +('10', '91', '17', '104413', '138803', '17'), +('10', '91', '7', '94053', '155806', '17'), +('10', '91', '7', '56080', '155454', '17'), +('10', '91', '7', '104411', '132000', '17'), +('10', '91', '7', '54848', '100506', '17'), +('10', '91', '9', '67098', '260015', '17'), +('10', '91', '9', '81764', '151997', '17'), +('10', '91', '9', '56070', '151770', '17'), +('10', '91', '9', '62984', '151664', '17'), +('10', '91', '15', '111350', '252052', '17'), +('10', '91', '15', '111344', '251611', '17'), +('10', '91', '15', '111340', '251077', '17'), +('10', '91', '15', '111342', '249924', '17'), +('10', '91', '20', '111356', '251458', '17'), +('10', '91', '20', '111352', '250496', '17'), +('10', '91', '20', '111351', '249822', '17'), +('10', '91', '20', '111054', '219858', '17'), +('10', '91', '12', '56073', '153127', '17'), +('10', '91', '12', '56035', '152821', '17'), +('10', '91', '12', '104408', '129535', '17'), +('10', '91', '12', '49656', '99913', '17'), +('10', '91', '18', '56041', '161992', '17'), +('10', '91', '18', '62986', '160700', '17'), +('10', '91', '18', '94054', '160407', '17'), +('10', '91', '18', '104412', '135883', '17'), +('10', '91', '19', '81763', '158054', '17'), +('10', '91', '19', '56037', '157661', '17'), +('10', '91', '19', '62990', '157629', '17'), +('10', '91', '19', '56075', '157610', '17'), +('10', '91', '13', '111518', '242486', '17'), +('10', '91', '13', '111517', '240288', '17'), +('10', '91', '13', '111217', '219585', '17'), +('10', '91', '13', '111218', '219039', '17'), +('10', '91', '14', '111539', '252826', '17'), +('10', '91', '14', '111537', '252034', '17'), +('10', '91', '14', '111535', '251769', '17'), +('10', '91', '14', '111239', '221225', '17'), +('10', '91', '11', '111337', '250605', '17'), +('10', '91', '11', '111334', '250498', '17'), +('10', '91', '11', '111338', '248805', '17'), +('10', '91', '11', '111033', '218998', '17'), +('10', '92', '22', '39342', '0', '17'), +('10', '92', '22', '7867', '0', '17'), +('10', '92', '22', '23597', '0', '17'), +('10', '92', '22', '53550', '0', '17'), +('10', '92', '1', '111304', '250889', '17'), +('10', '92', '1', '111307', '250716', '17'), +('10', '92', '1', '111310', '250288', '17'), +('10', '92', '1', '111305', '249639', '17'), +('10', '92', '2', '62985', '157049', '17'), +('10', '92', '2', '94056', '156771', '17'), +('10', '92', '2', '62988', '155988', '17'), +('10', '92', '2', '104410', '133083', '17'), +('10', '92', '3', '111314', '251272', '17'), +('10', '92', '3', '111316', '249977', '17'), +('10', '92', '3', '111315', '249928', '17'), +('10', '92', '3', '111013', '219672', '17'), +('10', '92', '5', '111319', '251066', '17'), +('10', '92', '5', '111317', '249409', '17'), +('10', '92', '5', '111318', '249229', '17'), +('10', '92', '5', '111320', '249069', '17'), +('10', '92', '8', '111332', '251406', '17'), +('10', '92', '8', '111330', '250127', '17'), +('10', '92', '8', '111331', '249254', '17'), +('10', '92', '8', '111328', '249076', '17'), +('10', '92', '6', '111323', '251339', '17'), +('10', '92', '6', '111326', '250201', '17'), +('10', '92', '6', '111324', '249777', '17'), +('10', '92', '6', '111022', '219738', '17'), +('10', '92', '17', '81765', '163858', '17'), +('10', '92', '17', '56046', '163392', '17'), +('10', '92', '17', '56083', '163235', '17'), +('10', '92', '17', '104413', '138813', '17'), +('10', '92', '7', '94053', '155811', '17'), +('10', '92', '7', '56080', '155462', '17'), +('10', '92', '7', '104411', '132009', '17'), +('10', '92', '7', '54848', '100512', '17'), +('10', '92', '9', '67098', '260021', '17'), +('10', '92', '9', '81764', '152008', '17'), +('10', '92', '9', '56070', '151776', '17'), +('10', '92', '9', '62984', '151671', '17'), +('10', '92', '15', '111350', '252061', '17'), +('10', '92', '15', '111344', '251620', '17'), +('10', '92', '15', '111340', '251084', '17'), +('10', '92', '15', '111342', '249932', '17'), +('10', '92', '20', '111356', '251464', '17'), +('10', '92', '20', '111352', '250504', '17'), +('10', '92', '20', '111351', '249829', '17'), +('10', '92', '20', '111054', '219864', '17'), +('10', '92', '12', '56073', '153135', '17'), +('10', '92', '12', '56035', '152831', '17'), +('10', '92', '12', '104408', '129541', '17'), +('10', '92', '12', '49656', '99914', '17'), +('10', '92', '18', '56041', '161998', '17'), +('10', '92', '18', '62986', '160708', '17'), +('10', '92', '18', '94054', '160412', '17'), +('10', '92', '18', '104412', '135887', '17'), +('10', '92', '19', '81763', '158065', '17'), +('10', '92', '19', '56037', '157669', '17'), +('10', '92', '19', '62990', '157634', '17'), +('10', '92', '19', '56075', '157619', '17'), +('10', '92', '13', '111518', '242493', '17'), +('10', '92', '13', '111517', '240295', '17'), +('10', '92', '13', '111217', '219592', '17'), +('10', '92', '13', '111218', '219045', '17'), +('10', '92', '14', '111539', '252835', '17'), +('10', '92', '14', '111537', '252041', '17'), +('10', '92', '14', '111535', '251776', '17'), +('10', '92', '14', '111239', '221233', '17'), +('10', '92', '11', '111337', '250615', '17'), +('10', '92', '11', '111334', '250505', '17'), +('10', '92', '11', '111338', '248811', '17'), +('10', '92', '11', '111033', '219005', '17'), +('10', '93', '22', '39342', '0', '17'), +('10', '93', '22', '7867', '0', '17'), +('10', '93', '22', '23597', '0', '17'), +('10', '93', '22', '53550', '0', '17'), +('10', '93', '1', '111304', '250897', '17'), +('10', '93', '1', '111307', '250721', '17'), +('10', '93', '1', '111310', '250296', '17'), +('10', '93', '1', '111305', '249649', '17'), +('10', '93', '2', '62985', '157058', '17'), +('10', '93', '2', '94056', '156777', '17'), +('10', '93', '2', '62988', '155993', '17'), +('10', '93', '2', '104410', '133089', '17'), +('10', '93', '3', '111314', '251279', '17'), +('10', '93', '3', '111316', '249983', '17'), +('10', '93', '3', '111315', '249935', '17'), +('10', '93', '3', '111013', '219679', '17'), +('10', '93', '5', '111319', '251073', '17'), +('10', '93', '5', '111317', '249416', '17'), +('10', '93', '5', '111318', '249235', '17'), +('10', '93', '5', '111320', '249075', '17'), +('10', '93', '8', '111332', '251414', '17'), +('10', '93', '8', '111330', '250134', '17'), +('10', '93', '8', '111331', '249262', '17'), +('10', '93', '8', '111328', '249081', '17'), +('10', '93', '6', '111323', '251346', '17'), +('10', '93', '6', '111326', '250210', '17'), +('10', '93', '6', '111324', '249783', '17'), +('10', '93', '6', '111022', '219746', '17'), +('10', '93', '17', '81765', '163864', '17'), +('10', '93', '17', '56046', '163399', '17'), +('10', '93', '17', '56083', '163239', '17'), +('10', '93', '17', '104413', '138823', '17'), +('10', '93', '7', '94053', '155817', '17'), +('10', '93', '7', '56080', '155470', '17'), +('10', '93', '7', '104411', '132018', '17'), +('10', '93', '7', '54848', '100519', '17'), +('10', '93', '9', '67098', '260027', '17'), +('10', '93', '9', '81764', '152019', '17'), +('10', '93', '9', '56070', '151782', '17'), +('10', '93', '9', '62984', '151678', '17'), +('10', '93', '15', '111350', '252070', '17'), +('10', '93', '15', '111344', '251629', '17'), +('10', '93', '15', '111340', '251091', '17'), +('10', '93', '15', '111342', '249940', '17'), +('10', '93', '20', '111356', '251471', '17'), +('10', '93', '20', '111352', '250511', '17'), +('10', '93', '20', '111351', '249837', '17'), +('10', '93', '20', '111054', '219870', '17'), +('10', '93', '12', '56073', '153142', '17'), +('10', '93', '12', '56035', '152841', '17'), +('10', '93', '12', '104408', '129547', '17'), +('10', '93', '12', '49656', '99915', '17'), +('10', '93', '18', '56041', '162004', '17'), +('10', '93', '18', '62986', '160717', '17'), +('10', '93', '18', '94054', '160418', '17'), +('10', '93', '18', '104412', '135891', '17'), +('10', '93', '19', '81763', '158075', '17'), +('10', '93', '19', '56037', '157677', '17'), +('10', '93', '19', '62990', '157639', '17'), +('10', '93', '19', '56075', '157627', '17'), +('10', '93', '13', '111518', '242501', '17'), +('10', '93', '13', '111517', '240302', '17'), +('10', '93', '13', '111217', '219598', '17'), +('10', '93', '13', '111218', '219052', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '93', '14', '111539', '252843', '17'), +('10', '93', '14', '111537', '252049', '17'), +('10', '93', '14', '111535', '251783', '17'), +('10', '93', '14', '111239', '221241', '17'), +('10', '93', '11', '111337', '250625', '17'), +('10', '93', '11', '111334', '250512', '17'), +('10', '93', '11', '111338', '248817', '17'), +('10', '93', '11', '111033', '219011', '17'), +('10', '94', '22', '39342', '0', '17'), +('10', '94', '22', '7867', '0', '17'), +('10', '94', '22', '23597', '0', '17'), +('10', '94', '22', '53550', '0', '17'), +('10', '94', '1', '111304', '250905', '17'), +('10', '94', '1', '111307', '250725', '17'), +('10', '94', '1', '111310', '250303', '17'), +('10', '94', '1', '111305', '249659', '17'), +('10', '94', '2', '62985', '157066', '17'), +('10', '94', '2', '94056', '156783', '17'), +('10', '94', '2', '62988', '155998', '17'), +('10', '94', '2', '104410', '133096', '17'), +('10', '94', '3', '111314', '251286', '17'), +('10', '94', '3', '111316', '249990', '17'), +('10', '94', '3', '111315', '249943', '17'), +('10', '94', '3', '111013', '219686', '17'), +('10', '94', '5', '111319', '251079', '17'), +('10', '94', '5', '111317', '249423', '17'), +('10', '94', '5', '111318', '249240', '17'), +('10', '94', '5', '111320', '249081', '17'), +('10', '94', '8', '111332', '251422', '17'), +('10', '94', '8', '111330', '250141', '17'), +('10', '94', '8', '111331', '249271', '17'), +('10', '94', '8', '111328', '249086', '17'), +('10', '94', '6', '111323', '251354', '17'), +('10', '94', '6', '111326', '250220', '17'), +('10', '94', '6', '111324', '249789', '17'), +('10', '94', '6', '111022', '219753', '17'), +('10', '94', '17', '81765', '163869', '17'), +('10', '94', '17', '56046', '163407', '17'), +('10', '94', '17', '56083', '163243', '17'), +('10', '94', '17', '104413', '138833', '17'), +('10', '94', '7', '94053', '155823', '17'), +('10', '94', '7', '56080', '155479', '17'), +('10', '94', '7', '104411', '132027', '17'), +('10', '94', '7', '54848', '100525', '17'), +('10', '94', '9', '67098', '260033', '17'), +('10', '94', '9', '81764', '152030', '17'), +('10', '94', '9', '56070', '151789', '17'), +('10', '94', '9', '62984', '151686', '17'), +('10', '94', '15', '111350', '252079', '17'), +('10', '94', '15', '111344', '251638', '17'), +('10', '94', '15', '111340', '251098', '17'), +('10', '94', '15', '111342', '249948', '17'), +('10', '94', '20', '111356', '251477', '17'), +('10', '94', '20', '111352', '250519', '17'), +('10', '94', '20', '111351', '249844', '17'), +('10', '94', '20', '111054', '219876', '17'), +('10', '94', '12', '56073', '153149', '17'), +('10', '94', '12', '56035', '152851', '17'), +('10', '94', '12', '104408', '129554', '17'), +('10', '94', '12', '49656', '99916', '17'), +('10', '94', '18', '56041', '162011', '17'), +('10', '94', '18', '62986', '160725', '17'), +('10', '94', '18', '94054', '160423', '17'), +('10', '94', '18', '104412', '135895', '17'), +('10', '94', '19', '81763', '158086', '17'), +('10', '94', '19', '56037', '157685', '17'), +('10', '94', '19', '62990', '157645', '17'), +('10', '94', '19', '56075', '157636', '17'), +('10', '94', '13', '111518', '242508', '17'), +('10', '94', '13', '111517', '240309', '17'), +('10', '94', '13', '111217', '219605', '17'), +('10', '94', '13', '111218', '219059', '17'), +('10', '94', '14', '111539', '252851', '17'), +('10', '94', '14', '111537', '252056', '17'), +('10', '94', '14', '111535', '251789', '17'), +('10', '94', '14', '111239', '221250', '17'), +('10', '94', '11', '111337', '250635', '17'), +('10', '94', '11', '111334', '250519', '17'), +('10', '94', '11', '111338', '248823', '17'), +('10', '94', '11', '111033', '219018', '17'), +('10', '95', '22', '39342', '0', '18'), +('10', '95', '22', '7867', '0', '18'), +('10', '95', '22', '23597', '0', '18'), +('10', '95', '22', '54829', '0', '18'), +('10', '95', '1', '111304', '250913', '18'), +('10', '95', '1', '111307', '250730', '18'), +('10', '95', '1', '111310', '250310', '18'), +('10', '95', '1', '111305', '249669', '18'), +('10', '95', '2', '62985', '157075', '18'), +('10', '95', '2', '94056', '156789', '18'), +('10', '95', '2', '62988', '156003', '18'), +('10', '95', '2', '104410', '133102', '18'), +('10', '95', '3', '111314', '251293', '18'), +('10', '95', '3', '111316', '249997', '18'), +('10', '95', '3', '111315', '249950', '18'), +('10', '95', '3', '111013', '219693', '18'), +('10', '95', '5', '111319', '251085', '18'), +('10', '95', '5', '111317', '249430', '18'), +('10', '95', '5', '111318', '249246', '18'), +('10', '95', '5', '111320', '249087', '18'), +('10', '95', '8', '111332', '251429', '18'), +('10', '95', '8', '111330', '250148', '18'), +('10', '95', '8', '111331', '249279', '18'), +('10', '95', '8', '111328', '249091', '18'), +('10', '95', '6', '111323', '251361', '18'), +('10', '95', '6', '111326', '250230', '18'), +('10', '95', '6', '111324', '249794', '18'), +('10', '95', '6', '111022', '219761', '18'), +('10', '95', '17', '81765', '163875', '18'), +('10', '95', '17', '56046', '163414', '18'), +('10', '95', '17', '56083', '163247', '18'), +('10', '95', '17', '104413', '138843', '18'), +('10', '95', '7', '94053', '155828', '18'), +('10', '95', '7', '56080', '155487', '18'), +('10', '95', '7', '104411', '132037', '18'), +('10', '95', '7', '54848', '100531', '18'), +('10', '95', '9', '67098', '260039', '18'), +('10', '95', '9', '81764', '152041', '18'), +('10', '95', '9', '56070', '151795', '18'), +('10', '95', '9', '62984', '151693', '18'), +('10', '95', '15', '111350', '252088', '18'), +('10', '95', '15', '111344', '251646', '18'), +('10', '95', '15', '111340', '251105', '18'), +('10', '95', '15', '111342', '249955', '18'), +('10', '95', '20', '111356', '251483', '18'), +('10', '95', '20', '111352', '250526', '18'), +('10', '95', '20', '111351', '249852', '18'), +('10', '95', '20', '111054', '219882', '18'), +('10', '95', '12', '56073', '153157', '18'), +('10', '95', '12', '56035', '152861', '18'), +('10', '95', '12', '104408', '129560', '18'), +('10', '95', '12', '49656', '99917', '18'), +('10', '95', '18', '56041', '162017', '18'), +('10', '95', '18', '62986', '160734', '18'), +('10', '95', '18', '94054', '160429', '18'), +('10', '95', '18', '104412', '135899', '18'), +('10', '95', '19', '81763', '158096', '18'), +('10', '95', '19', '56037', '157693', '18'), +('10', '95', '19', '62990', '157650', '18'), +('10', '95', '19', '56075', '157645', '18'), +('10', '95', '13', '111518', '242515', '18'), +('10', '95', '13', '111517', '240316', '18'), +('10', '95', '13', '111217', '219612', '18'), +('10', '95', '13', '111218', '219066', '18'), +('10', '95', '14', '111539', '252859', '18'), +('10', '95', '14', '111537', '252063', '18'), +('10', '95', '14', '111535', '251796', '18'), +('10', '95', '14', '111239', '221258', '18'), +('10', '95', '11', '111337', '250645', '18'), +('10', '95', '11', '111334', '250526', '18'), +('10', '95', '11', '111338', '248829', '18'), +('10', '95', '11', '111033', '219025', '18'), +('10', '96', '22', '39342', '0', '18'), +('10', '96', '22', '7867', '0', '18'), +('10', '96', '22', '23597', '0', '18'), +('10', '96', '22', '54829', '0', '18'), +('10', '96', '1', '111304', '250921', '18'), +('10', '96', '1', '111307', '250735', '18'), +('10', '96', '1', '111310', '250318', '18'), +('10', '96', '1', '111305', '249680', '18'), +('10', '96', '2', '62985', '157084', '18'), +('10', '96', '2', '94056', '156795', '18'), +('10', '96', '2', '62988', '156008', '18'), +('10', '96', '2', '104410', '133108', '18'), +('10', '96', '3', '111314', '251300', '18'), +('10', '96', '3', '111316', '250004', '18'), +('10', '96', '3', '111315', '249957', '18'), +('10', '96', '3', '111013', '219700', '18'), +('10', '96', '5', '111319', '251092', '18'), +('10', '96', '5', '111317', '249437', '18'), +('10', '96', '5', '111318', '249252', '18'), +('10', '96', '5', '111320', '249093', '18'), +('10', '96', '8', '111332', '251437', '18'), +('10', '96', '8', '111330', '250154', '18'), +('10', '96', '8', '111331', '249288', '18'), +('10', '96', '8', '111328', '249096', '18'), +('10', '96', '6', '111323', '251369', '18'), +('10', '96', '6', '111326', '250239', '18'), +('10', '96', '6', '111324', '249800', '18'), +('10', '96', '6', '111022', '219768', '18'), +('10', '96', '17', '81765', '163881', '18'), +('10', '96', '17', '56046', '163421', '18'), +('10', '96', '17', '56083', '163251', '18'), +('10', '96', '17', '104413', '138853', '18'), +('10', '96', '7', '94053', '155834', '18'), +('10', '96', '7', '56080', '155495', '18'), +('10', '96', '7', '104411', '132046', '18'), +('10', '96', '7', '54848', '100538', '18'), +('10', '96', '9', '67098', '260045', '18'), +('10', '96', '9', '81764', '152051', '18'), +('10', '96', '9', '56070', '151802', '18'), +('10', '96', '9', '62984', '151700', '18'), +('10', '96', '15', '111350', '252097', '18'), +('10', '96', '15', '111344', '251655', '18'), +('10', '96', '15', '111340', '251112', '18'), +('10', '96', '15', '111342', '249963', '18'), +('10', '96', '20', '111356', '251489', '18'), +('10', '96', '20', '111352', '250533', '18'), +('10', '96', '20', '111351', '249859', '18'), +('10', '96', '20', '111054', '219888', '18'), +('10', '96', '12', '56073', '153164', '18'), +('10', '96', '12', '56035', '152871', '18'), +('10', '96', '12', '104408', '129566', '18'), +('10', '96', '12', '49656', '99918', '18'), +('10', '96', '18', '56041', '162023', '18'), +('10', '96', '18', '62986', '160742', '18'), +('10', '96', '18', '94054', '160434', '18'), +('10', '96', '18', '104412', '135903', '18'), +('10', '96', '19', '81763', '158107', '18'), +('10', '96', '19', '56037', '157701', '18'), +('10', '96', '19', '62990', '157655', '18'), +('10', '96', '19', '56075', '157654', '18'), +('10', '96', '13', '111518', '242522', '18'), +('10', '96', '13', '111517', '240323', '18'), +('10', '96', '13', '111217', '219618', '18'), +('10', '96', '13', '111218', '219073', '18'), +('10', '96', '14', '111539', '252867', '18'), +('10', '96', '14', '111537', '252071', '18'), +('10', '96', '14', '111535', '251803', '18'), +('10', '96', '14', '111239', '221266', '18'), +('10', '96', '11', '111337', '250655', '18'), +('10', '96', '11', '111334', '250533', '18'), +('10', '96', '11', '111338', '248835', '18'), +('10', '96', '11', '111033', '219032', '18'), +('10', '97', '22', '39342', '0', '18'), +('10', '97', '22', '7867', '0', '18'), +('10', '97', '22', '23597', '0', '18'), +('10', '97', '22', '54829', '0', '18'), +('10', '97', '1', '111304', '250929', '18'), +('10', '97', '1', '111307', '250739', '18'), +('10', '97', '1', '111310', '250325', '18'), +('10', '97', '1', '111305', '249690', '18'), +('10', '97', '2', '62985', '157092', '18'), +('10', '97', '2', '94056', '156801', '18'), +('10', '97', '2', '62988', '156013', '18'), +('10', '97', '2', '104410', '133114', '18'), +('10', '97', '3', '111314', '251307', '18'), +('10', '97', '3', '111316', '250011', '18'), +('10', '97', '3', '111315', '249965', '18'), +('10', '97', '3', '111013', '219707', '18'), +('10', '97', '5', '111319', '251098', '18'), +('10', '97', '5', '111317', '249444', '18'), +('10', '97', '5', '111318', '249257', '18'), +('10', '97', '5', '111320', '249099', '18'), +('10', '97', '8', '111332', '251445', '18'), +('10', '97', '8', '111330', '250161', '18'), +('10', '97', '8', '111331', '249296', '18'), +('10', '97', '8', '111328', '249102', '18'), +('10', '97', '6', '111323', '251376', '18'), +('10', '97', '6', '111326', '250249', '18'), +('10', '97', '6', '111324', '249806', '18'), +('10', '97', '6', '111022', '219776', '18'), +('10', '97', '17', '81765', '163887', '18'), +('10', '97', '17', '56046', '163428', '18'), +('10', '97', '17', '56083', '163255', '18'), +('10', '97', '17', '104413', '138863', '18'), +('10', '97', '7', '94053', '155839', '18'), +('10', '97', '7', '56080', '155504', '18'), +('10', '97', '7', '104411', '132055', '18'), +('10', '97', '7', '54848', '100544', '18'), +('10', '97', '9', '67098', '260051', '18'), +('10', '97', '9', '81764', '152062', '18'), +('10', '97', '9', '56070', '151808', '18'), +('10', '97', '9', '62984', '151708', '18'), +('10', '97', '15', '111350', '252105', '18'), +('10', '97', '15', '111344', '251664', '18'), +('10', '97', '15', '111340', '251119', '18'), +('10', '97', '15', '111342', '249971', '18'), +('10', '97', '20', '111356', '251495', '18'), +('10', '97', '20', '111352', '250541', '18'), +('10', '97', '20', '111351', '249866', '18'), +('10', '97', '20', '111054', '219894', '18'), +('10', '97', '12', '56073', '153171', '18'), +('10', '97', '12', '56035', '152881', '18'), +('10', '97', '12', '104408', '129573', '18'), +('10', '97', '12', '49656', '99919', '18'), +('10', '97', '18', '56041', '162030', '18'), +('10', '97', '18', '62986', '160751', '18'), +('10', '97', '18', '94054', '160439', '18'), +('10', '97', '18', '104412', '135907', '18'), +('10', '97', '19', '81763', '158117', '18'), +('10', '97', '19', '56037', '157709', '18'), +('10', '97', '19', '56075', '157662', '18'), +('10', '97', '19', '62990', '157660', '18'), +('10', '97', '13', '111518', '242530', '18'), +('10', '97', '13', '111517', '240330', '18'), +('10', '97', '13', '111217', '219625', '18'), +('10', '97', '13', '111218', '219080', '18'), +('10', '97', '14', '111539', '252876', '18'), +('10', '97', '14', '111537', '252078', '18'), +('10', '97', '14', '111535', '251810', '18'), +('10', '97', '14', '111239', '221274', '18'), +('10', '97', '11', '111337', '250664', '18'), +('10', '97', '11', '111334', '250540', '18'), +('10', '97', '11', '111338', '248841', '18'), +('10', '97', '11', '111033', '219039', '18'), +('10', '98', '22', '39342', '0', '18'), +('10', '98', '22', '7867', '0', '18'), +('10', '98', '22', '23597', '0', '18'), +('10', '98', '22', '54829', '0', '18'), +('10', '98', '1', '111304', '250937', '18'), +('10', '98', '1', '111307', '250744', '18'), +('10', '98', '1', '111310', '250332', '18'), +('10', '98', '1', '111305', '249700', '18'), +('10', '98', '2', '62985', '157101', '18'), +('10', '98', '2', '94056', '156807', '18'), +('10', '98', '2', '62988', '156018', '18'), +('10', '98', '2', '104410', '133120', '18'), +('10', '98', '3', '111314', '251314', '18'), +('10', '98', '3', '111316', '250018', '18'), +('10', '98', '3', '111315', '249972', '18'), +('10', '98', '3', '111013', '219714', '18'), +('10', '98', '5', '111319', '251104', '18'), +('10', '98', '5', '111317', '249451', '18'), +('10', '98', '5', '111318', '249263', '18'), +('10', '98', '5', '111320', '249105', '18'), +('10', '98', '8', '111332', '251452', '18'), +('10', '98', '8', '111330', '250168', '18'), +('10', '98', '8', '111331', '249305', '18'), +('10', '98', '8', '111328', '249107', '18'), +('10', '98', '6', '111323', '251384', '18'), +('10', '98', '6', '111326', '250259', '18'), +('10', '98', '6', '111324', '249812', '18'), +('10', '98', '6', '111022', '219783', '18'), +('10', '98', '17', '81765', '163893', '18'), +('10', '98', '17', '56046', '163436', '18'), +('10', '98', '17', '56083', '163259', '18'), +('10', '98', '17', '104413', '138873', '18'), +('10', '98', '7', '94053', '155845', '18'), +('10', '98', '7', '56080', '155512', '18'), +('10', '98', '7', '104411', '132064', '18'), +('10', '98', '7', '54848', '100550', '18'), +('10', '98', '9', '67098', '260058', '18'), +('10', '98', '9', '81764', '152073', '18'), +('10', '98', '9', '56070', '151815', '18'), +('10', '98', '9', '62984', '151715', '18'), +('10', '98', '15', '111350', '252114', '18'), +('10', '98', '15', '111344', '251673', '18'), +('10', '98', '15', '111340', '251126', '18'), +('10', '98', '15', '111342', '249979', '18'), +('10', '98', '20', '111356', '251501', '18'), +('10', '98', '20', '111352', '250548', '18'), +('10', '98', '20', '111351', '249874', '18'), +('10', '98', '20', '111054', '219900', '18'), +('10', '98', '12', '56073', '153178', '18'), +('10', '98', '12', '56035', '152891', '18'), +('10', '98', '12', '104408', '129579', '18'), +('10', '98', '12', '49656', '99920', '18'), +('10', '98', '18', '56041', '162036', '18'), +('10', '98', '18', '62986', '160759', '18'), +('10', '98', '18', '94054', '160445', '18'), +('10', '98', '18', '104412', '135911', '18'), +('10', '98', '19', '81763', '158128', '18'), +('10', '98', '19', '56037', '157717', '18'), +('10', '98', '19', '56075', '157671', '18'), +('10', '98', '19', '62990', '157665', '18'), +('10', '98', '13', '111518', '242537', '18'), +('10', '98', '13', '111517', '240337', '18'), +('10', '98', '13', '111217', '219632', '18'), +('10', '98', '13', '111218', '219087', '18'), +('10', '98', '14', '111539', '252884', '18'), +('10', '98', '14', '111537', '252086', '18'), +('10', '98', '14', '111535', '251817', '18'), +('10', '98', '14', '111239', '221282', '18'), +('10', '98', '11', '111337', '250674', '18'), +('10', '98', '11', '111334', '250546', '18'), +('10', '98', '11', '111338', '248847', '18'), +('10', '98', '11', '111033', '219046', '18'), +('10', '99', '22', '39342', '0', '18'), +('10', '99', '22', '7867', '0', '18'), +('10', '99', '22', '23597', '0', '18'), +('10', '99', '22', '54829', '0', '18'), +('10', '99', '1', '111304', '250945', '18'), +('10', '99', '1', '111307', '250749', '18'), +('10', '99', '1', '111310', '250340', '18'), +('10', '99', '1', '111305', '249710', '18'), +('10', '99', '2', '62985', '157110', '18'), +('10', '99', '2', '94056', '156813', '18'), +('10', '99', '2', '62988', '156024', '18'), +('10', '99', '2', '104410', '133127', '18'), +('10', '99', '3', '111314', '251321', '18'), +('10', '99', '3', '111316', '250025', '18'), +('10', '99', '3', '111315', '249979', '18'), +('10', '99', '3', '111013', '219721', '18'), +('10', '99', '5', '111319', '251111', '18'), +('10', '99', '5', '111317', '249458', '18'), +('10', '99', '5', '111318', '249269', '18'), +('10', '99', '5', '111320', '249111', '18'), +('10', '99', '8', '111332', '251460', '18'), +('10', '99', '8', '111330', '250175', '18'), +('10', '99', '8', '111331', '249313', '18'), +('10', '99', '8', '111328', '249112', '18'), +('10', '99', '6', '111323', '251391', '18'), +('10', '99', '6', '111326', '250268', '18'), +('10', '99', '6', '111324', '249818', '18'), +('10', '99', '6', '111022', '219791', '18'), +('10', '99', '17', '81765', '163898', '18'), +('10', '99', '17', '56046', '163443', '18'), +('10', '99', '17', '56083', '163263', '18'), +('10', '99', '17', '104413', '138883', '18'), +('10', '99', '7', '94053', '155850', '18'), +('10', '99', '7', '56080', '155520', '18'), +('10', '99', '7', '104411', '132073', '18'), +('10', '99', '7', '54848', '100556', '18'), +('10', '99', '9', '67098', '260064', '18'), +('10', '99', '9', '81764', '152084', '18'), +('10', '99', '9', '56070', '151821', '18'), +('10', '99', '9', '62984', '151723', '18'), +('10', '99', '15', '111350', '252123', '18'), +('10', '99', '15', '111344', '251682', '18'), +('10', '99', '15', '111340', '251133', '18'), +('10', '99', '15', '111342', '249987', '18'), +('10', '99', '20', '111356', '251507', '18'), +('10', '99', '20', '111352', '250555', '18'), +('10', '99', '20', '111351', '249881', '18'), +('10', '99', '20', '111054', '219906', '18'), +('10', '99', '12', '56073', '153186', '18'), +('10', '99', '12', '56035', '152901', '18'), +('10', '99', '12', '104408', '129585', '18'), +('10', '99', '12', '49656', '99921', '18'), +('10', '99', '18', '56041', '162043', '18'), +('10', '99', '18', '62986', '160768', '18'), +('10', '99', '18', '94054', '160450', '18'), +('10', '99', '18', '104412', '135915', '18'), +('10', '99', '19', '81763', '158138', '18'), +('10', '99', '19', '56037', '157725', '18'), +('10', '99', '19', '56075', '157680', '18'), +('10', '99', '19', '62990', '157670', '18'), +('10', '99', '13', '111518', '242544', '18'), +('10', '99', '13', '111517', '240344', '18'), +('10', '99', '13', '111217', '219639', '18'), +('10', '99', '13', '111218', '219094', '18'), +('10', '99', '14', '111539', '252892', '18'), +('10', '99', '14', '111537', '252093', '18'), +('10', '99', '14', '111535', '251824', '18'), +('10', '99', '14', '111239', '221291', '18'), +('10', '99', '11', '111337', '250684', '18'), +('10', '99', '11', '111334', '250553', '18'), +('10', '99', '11', '111338', '248852', '18'), +('10', '99', '11', '111033', '219053', '18'), +('10', '100', '22', '39342', '0', '20'), +('10', '100', '22', '7867', '0', '20'), +('10', '100', '22', '23597', '0', '20'), +('10', '100', '22', '54829', '0', '20'), +('10', '100', '1', '98769', '417021', '20'), +('10', '100', '1', '111304', '250954', '20'), +('10', '100', '1', '111307', '250753', '20'), +('10', '100', '1', '111310', '250347', '20'), +('10', '100', '2', '62985', '157119', '20'), +('10', '100', '2', '94056', '156819', '20'), +('10', '100', '2', '62988', '156029', '20'), +('10', '100', '2', '104410', '133133', '20'), +('10', '100', '3', '111314', '251328', '20'), +('10', '100', '3', '111316', '250032', '20'), +('10', '100', '3', '111315', '249987', '20'), +('10', '100', '3', '111013', '219728', '20'), +('10', '100', '5', '111319', '251117', '20'), +('10', '100', '5', '111317', '249465', '20'), +('10', '100', '5', '111318', '249275', '20'), +('10', '100', '5', '111320', '249117', '20'), +('10', '100', '8', '111332', '251468', '20'), +('10', '100', '8', '111330', '250181', '20'), +('10', '100', '8', '111331', '249322', '20'), +('10', '100', '8', '111328', '249117', '20'), +('10', '100', '6', '111323', '251399', '20'), +('10', '100', '6', '111326', '250278', '20'), +('10', '100', '6', '111324', '249823', '20'), +('10', '100', '6', '111022', '219798', '20'), +('10', '100', '17', '81765', '163904', '20'), +('10', '100', '17', '56046', '163450', '20'), +('10', '100', '17', '56083', '163267', '20'), +('10', '100', '17', '104413', '138893', '20'), +('10', '100', '7', '94053', '155856', '20'), +('10', '100', '7', '56080', '155529', '20'), +('10', '100', '7', '104411', '132083', '20'), +('10', '100', '7', '54848', '100563', '20'), +('10', '100', '9', '67098', '260070', '20'), +('10', '100', '9', '81764', '152095', '20'), +('10', '100', '9', '56070', '151827', '20'), +('10', '100', '9', '62984', '151730', '20'), +('10', '100', '15', '111350', '252132', '20'), +('10', '100', '15', '111344', '251690', '20'), +('10', '100', '15', '111340', '251140', '20'), +('10', '100', '15', '111342', '249995', '20'), +('10', '100', '20', '111356', '251513', '20'), +('10', '100', '20', '111352', '250563', '20'), +('10', '100', '20', '111351', '249888', '20'), +('10', '100', '20', '111054', '219912', '20'), +('10', '100', '12', '56073', '153193', '20'), +('10', '100', '12', '56035', '152911', '20'), +('10', '100', '12', '104408', '129591', '20'), +('10', '100', '12', '49656', '99921', '20'), +('10', '100', '18', '56041', '162049', '20'), +('10', '100', '18', '62986', '160776', '20'), +('10', '100', '18', '94054', '160455', '20'), +('10', '100', '18', '104412', '135919', '20'), +('10', '100', '19', '81763', '158149', '20'), +('10', '100', '19', '56037', '157733', '20'), +('10', '100', '19', '56075', '157688', '20'), +('10', '100', '19', '62990', '157675', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '100', '13', '111518', '242552', '20'), +('10', '100', '13', '111517', '240352', '20'), +('10', '100', '13', '111217', '219646', '20'), +('10', '100', '13', '111218', '219102', '20'), +('10', '100', '14', '111539', '252900', '20'), +('10', '100', '14', '111537', '252101', '20'), +('10', '100', '14', '111535', '251831', '20'), +('10', '100', '14', '111239', '221299', '20'), +('10', '100', '11', '133816', '330373', '20'), +('10', '100', '11', '111337', '250694', '20'), +('10', '100', '11', '111334', '250560', '20'), +('10', '100', '11', '111338', '248858', '20'), +('10', '100', '22', '39342', '0', '19'), +('10', '100', '22', '7867', '0', '19'), +('10', '100', '22', '23597', '0', '19'), +('10', '100', '22', '54829', '0', '19'), +('10', '100', '1', '98769', '417021', '19'), +('10', '100', '1', '111304', '250954', '19'), +('10', '100', '1', '111307', '250753', '19'), +('10', '100', '1', '111310', '250347', '19'), +('10', '100', '2', '62985', '157119', '19'), +('10', '100', '2', '94056', '156819', '19'), +('10', '100', '2', '62988', '156029', '19'), +('10', '100', '2', '104410', '133133', '19'), +('10', '100', '3', '111314', '251328', '19'), +('10', '100', '3', '111316', '250032', '19'), +('10', '100', '3', '111315', '249987', '19'), +('10', '100', '3', '111013', '219728', '19'), +('10', '100', '5', '111319', '251117', '19'), +('10', '100', '5', '111317', '249465', '19'), +('10', '100', '5', '111318', '249275', '19'), +('10', '100', '5', '111320', '249117', '19'), +('10', '100', '8', '111332', '251468', '19'), +('10', '100', '8', '111330', '250181', '19'), +('10', '100', '8', '111331', '249322', '19'), +('10', '100', '8', '111328', '249117', '19'), +('10', '100', '6', '111323', '251399', '19'), +('10', '100', '6', '111326', '250278', '19'), +('10', '100', '6', '111324', '249823', '19'), +('10', '100', '6', '111022', '219798', '19'), +('10', '100', '17', '81765', '163904', '19'), +('10', '100', '17', '56046', '163450', '19'), +('10', '100', '17', '56083', '163267', '19'), +('10', '100', '17', '104413', '138893', '19'), +('10', '100', '7', '94053', '155856', '19'), +('10', '100', '7', '56080', '155529', '19'), +('10', '100', '7', '104411', '132083', '19'), +('10', '100', '7', '54848', '100563', '19'), +('10', '100', '9', '67098', '260070', '19'), +('10', '100', '9', '81764', '152095', '19'), +('10', '100', '9', '56070', '151827', '19'), +('10', '100', '9', '62984', '151730', '19'), +('10', '100', '15', '111350', '252132', '19'), +('10', '100', '15', '111344', '251690', '19'), +('10', '100', '15', '111340', '251140', '19'), +('10', '100', '15', '111342', '249995', '19'), +('10', '100', '20', '111356', '251513', '19'), +('10', '100', '20', '111352', '250563', '19'), +('10', '100', '20', '111351', '249888', '19'), +('10', '100', '20', '111054', '219912', '19'), +('10', '100', '12', '56073', '153193', '19'), +('10', '100', '12', '56035', '152911', '19'), +('10', '100', '12', '104408', '129591', '19'), +('10', '100', '12', '49656', '99921', '19'), +('10', '100', '18', '56041', '162049', '19'), +('10', '100', '18', '62986', '160776', '19'), +('10', '100', '18', '94054', '160455', '19'), +('10', '100', '18', '104412', '135919', '19'), +('10', '100', '19', '81763', '158149', '19'), +('10', '100', '19', '56037', '157733', '19'), +('10', '100', '19', '56075', '157688', '19'), +('10', '100', '19', '62990', '157675', '19'), +('10', '100', '13', '111518', '242551', '19'), +('10', '100', '13', '111517', '240351', '19'), +('10', '100', '13', '111217', '219645', '19'), +('10', '100', '13', '111218', '219101', '19'), +('10', '100', '14', '111539', '252900', '19'), +('10', '100', '14', '111537', '252101', '19'), +('10', '100', '14', '111535', '251831', '19'), +('10', '100', '14', '111239', '221299', '19'), +('10', '100', '11', '133816', '330373', '19'), +('10', '100', '11', '111337', '250694', '19'), +('10', '100', '11', '111334', '250560', '19'), +('10', '100', '11', '111338', '248858', '19'), +('10', '101', '22', '39342', '0', '20'), +('10', '101', '22', '7867', '0', '20'), +('10', '101', '22', '23597', '0', '20'), +('10', '101', '22', '54829', '0', '20'), +('10', '101', '1', '98769', '417026', '20'), +('10', '101', '1', '111304', '250962', '20'), +('10', '101', '1', '111307', '250758', '20'), +('10', '101', '1', '111310', '250354', '20'), +('10', '101', '2', '62985', '157127', '20'), +('10', '101', '2', '94056', '156825', '20'), +('10', '101', '2', '62988', '156034', '20'), +('10', '101', '2', '104410', '133139', '20'), +('10', '101', '3', '111314', '251335', '20'), +('10', '101', '3', '111316', '250039', '20'), +('10', '101', '3', '111315', '249994', '20'), +('10', '101', '3', '111013', '219735', '20'), +('10', '101', '5', '111319', '251124', '20'), +('10', '101', '5', '111317', '249472', '20'), +('10', '101', '5', '111318', '249280', '20'), +('10', '101', '5', '111320', '249123', '20'), +('10', '101', '8', '111332', '251475', '20'), +('10', '101', '8', '111330', '250188', '20'), +('10', '101', '8', '111331', '249330', '20'), +('10', '101', '8', '111328', '249122', '20'), +('10', '101', '6', '111323', '251406', '20'), +('10', '101', '6', '111326', '250288', '20'), +('10', '101', '6', '111324', '249829', '20'), +('10', '101', '6', '111022', '219806', '20'), +('10', '101', '17', '81765', '163910', '20'), +('10', '101', '17', '56046', '163458', '20'), +('10', '101', '17', '56083', '163271', '20'), +('10', '101', '17', '104413', '138903', '20'), +('10', '101', '7', '94053', '155862', '20'), +('10', '101', '7', '56080', '155537', '20'), +('10', '101', '7', '104411', '132092', '20'), +('10', '101', '7', '54848', '100569', '20'), +('10', '101', '9', '67098', '260076', '20'), +('10', '101', '9', '81764', '152106', '20'), +('10', '101', '9', '56070', '151834', '20'), +('10', '101', '9', '62984', '151737', '20'), +('10', '101', '15', '111350', '252141', '20'), +('10', '101', '15', '111344', '251699', '20'), +('10', '101', '15', '111340', '251147', '20'), +('10', '101', '15', '111342', '250002', '20'), +('10', '101', '20', '111356', '251519', '20'), +('10', '101', '20', '111352', '250570', '20'), +('10', '101', '20', '111351', '249896', '20'), +('10', '101', '20', '111054', '219919', '20'), +('10', '101', '12', '56073', '153200', '20'), +('10', '101', '12', '56035', '152921', '20'), +('10', '101', '12', '104408', '129598', '20'), +('10', '101', '12', '49656', '99922', '20'), +('10', '101', '18', '56041', '162055', '20'), +('10', '101', '18', '62986', '160785', '20'), +('10', '101', '18', '94054', '160461', '20'), +('10', '101', '18', '104412', '135923', '20'), +('10', '101', '19', '81763', '158159', '20'), +('10', '101', '19', '56037', '157740', '20'), +('10', '101', '19', '56075', '157697', '20'), +('10', '101', '19', '62990', '157680', '20'), +('10', '101', '13', '111518', '242559', '20'), +('10', '101', '13', '111517', '240359', '20'), +('10', '101', '13', '111217', '219653', '20'), +('10', '101', '13', '111218', '219109', '20'), +('10', '101', '14', '111539', '252909', '20'), +('10', '101', '14', '111537', '252108', '20'), +('10', '101', '14', '111535', '251838', '20'), +('10', '101', '14', '111239', '221307', '20'), +('10', '101', '11', '133816', '330379', '20'), +('10', '101', '11', '111337', '250704', '20'), +('10', '101', '11', '111334', '250567', '20'), +('10', '101', '11', '111338', '248864', '20'), +('10', '102', '22', '39342', '0', '20'), +('10', '102', '22', '7867', '0', '20'), +('10', '102', '22', '23597', '0', '20'), +('10', '102', '22', '54829', '0', '20'), +('10', '102', '1', '98769', '417031', '20'), +('10', '102', '1', '111304', '250970', '20'), +('10', '102', '1', '111307', '250763', '20'), +('10', '102', '1', '111310', '250362', '20'), +('10', '102', '2', '62985', '157136', '20'), +('10', '102', '2', '94056', '156831', '20'), +('10', '102', '2', '62988', '156039', '20'), +('10', '102', '2', '104410', '133145', '20'), +('10', '102', '3', '111314', '251342', '20'), +('10', '102', '3', '111316', '250046', '20'), +('10', '102', '3', '111315', '250001', '20'), +('10', '102', '3', '111013', '219742', '20'), +('10', '102', '5', '111319', '251130', '20'), +('10', '102', '5', '111317', '249479', '20'), +('10', '102', '5', '111318', '249286', '20'), +('10', '102', '5', '111320', '249129', '20'), +('10', '102', '8', '111332', '251483', '20'), +('10', '102', '8', '111330', '250195', '20'), +('10', '102', '8', '111331', '249338', '20'), +('10', '102', '8', '111328', '249127', '20'), +('10', '102', '6', '111323', '251414', '20'), +('10', '102', '6', '111326', '250297', '20'), +('10', '102', '6', '111324', '249835', '20'), +('10', '102', '6', '111022', '219813', '20'), +('10', '102', '17', '81765', '163916', '20'), +('10', '102', '17', '56046', '163465', '20'), +('10', '102', '17', '56083', '163274', '20'), +('10', '102', '17', '104413', '138913', '20'), +('10', '102', '7', '94053', '155867', '20'), +('10', '102', '7', '56080', '155545', '20'), +('10', '102', '7', '104411', '132101', '20'), +('10', '102', '7', '54848', '100575', '20'), +('10', '102', '9', '67098', '260082', '20'), +('10', '102', '9', '81764', '152116', '20'), +('10', '102', '9', '56070', '151840', '20'), +('10', '102', '9', '62984', '151745', '20'), +('10', '102', '15', '111350', '252150', '20'), +('10', '102', '15', '111344', '251708', '20'), +('10', '102', '15', '111340', '251154', '20'), +('10', '102', '15', '111342', '250010', '20'), +('10', '102', '20', '111356', '251525', '20'), +('10', '102', '20', '111352', '250577', '20'), +('10', '102', '20', '111351', '249903', '20'), +('10', '102', '20', '111054', '219925', '20'), +('10', '102', '12', '56073', '153208', '20'), +('10', '102', '12', '56035', '152931', '20'), +('10', '102', '12', '104408', '129604', '20'), +('10', '102', '12', '49656', '99923', '20'), +('10', '102', '18', '56041', '162062', '20'), +('10', '102', '18', '62986', '160794', '20'), +('10', '102', '18', '94054', '160466', '20'), +('10', '102', '18', '104412', '135927', '20'), +('10', '102', '19', '81763', '158170', '20'), +('10', '102', '19', '56037', '157748', '20'), +('10', '102', '19', '56075', '157706', '20'), +('10', '102', '19', '62990', '157685', '20'), +('10', '102', '13', '111518', '242566', '20'), +('10', '102', '13', '111517', '240366', '20'), +('10', '102', '13', '111217', '219659', '20'), +('10', '102', '13', '111218', '219116', '20'), +('10', '102', '14', '111539', '252917', '20'), +('10', '102', '14', '111537', '252115', '20'), +('10', '102', '14', '111535', '251845', '20'), +('10', '102', '14', '111239', '221315', '20'), +('10', '102', '11', '133816', '330384', '20'), +('10', '102', '11', '111337', '250714', '20'), +('10', '102', '11', '111334', '250574', '20'), +('10', '102', '11', '111338', '248870', '20'), +('10', '103', '22', '39342', '0', '20'), +('10', '103', '22', '7867', '0', '20'), +('10', '103', '22', '23597', '0', '20'), +('10', '103', '22', '54829', '0', '20'), +('10', '103', '1', '98769', '417036', '20'), +('10', '103', '1', '111304', '250978', '20'), +('10', '103', '1', '111307', '250767', '20'), +('10', '103', '1', '111310', '250369', '20'), +('10', '103', '2', '62985', '157145', '20'), +('10', '103', '2', '94056', '156838', '20'), +('10', '103', '2', '62988', '156044', '20'), +('10', '103', '2', '104410', '133151', '20'), +('10', '103', '3', '111314', '251349', '20'), +('10', '103', '3', '111316', '250052', '20'), +('10', '103', '3', '111315', '250009', '20'), +('10', '103', '3', '111013', '219749', '20'), +('10', '103', '5', '111319', '251136', '20'), +('10', '103', '5', '111317', '249485', '20'), +('10', '103', '5', '111318', '249292', '20'), +('10', '103', '5', '111320', '249135', '20'), +('10', '103', '8', '111332', '251491', '20'), +('10', '103', '8', '111330', '250202', '20'), +('10', '103', '8', '111331', '249347', '20'), +('10', '103', '8', '111328', '249132', '20'), +('10', '103', '6', '111323', '251421', '20'), +('10', '103', '6', '111326', '250307', '20'), +('10', '103', '6', '111324', '249841', '20'), +('10', '103', '6', '111022', '219821', '20'), +('10', '103', '17', '81765', '163921', '20'), +('10', '103', '17', '56046', '163472', '20'), +('10', '103', '17', '56083', '163278', '20'), +('10', '103', '17', '104413', '138923', '20'), +('10', '103', '7', '94053', '155873', '20'), +('10', '103', '7', '56080', '155554', '20'), +('10', '103', '7', '104411', '132110', '20'), +('10', '103', '7', '54848', '100582', '20'), +('10', '103', '9', '67098', '260088', '20'), +('10', '103', '9', '81764', '152127', '20'), +('10', '103', '9', '56070', '151847', '20'), +('10', '103', '9', '62984', '151752', '20'), +('10', '103', '15', '111350', '252159', '20'), +('10', '103', '15', '111344', '251717', '20'), +('10', '103', '15', '111340', '251161', '20'), +('10', '103', '15', '111342', '250018', '20'), +('10', '103', '20', '111356', '251531', '20'), +('10', '103', '20', '111352', '250585', '20'), +('10', '103', '20', '111351', '249910', '20'), +('10', '103', '20', '111054', '219931', '20'), +('10', '103', '12', '56073', '153215', '20'), +('10', '103', '12', '56035', '152941', '20'), +('10', '103', '12', '104408', '129610', '20'), +('10', '103', '12', '49656', '99924', '20'), +('10', '103', '18', '56041', '162068', '20'), +('10', '103', '18', '62986', '160802', '20'), +('10', '103', '18', '94054', '160472', '20'), +('10', '103', '18', '104412', '135931', '20'), +('10', '103', '19', '81763', '158181', '20'), +('10', '103', '19', '56037', '157756', '20'), +('10', '103', '19', '56075', '157714', '20'), +('10', '103', '19', '62990', '157690', '20'), +('10', '103', '13', '111518', '242574', '20'), +('10', '103', '13', '111517', '240373', '20'), +('10', '103', '13', '111217', '219666', '20'), +('10', '103', '13', '111218', '219123', '20'), +('10', '103', '14', '111539', '252925', '20'), +('10', '103', '14', '111537', '252123', '20'), +('10', '103', '14', '111535', '251852', '20'), +('10', '103', '14', '111239', '221323', '20'), +('10', '103', '11', '133816', '330390', '20'), +('10', '103', '11', '111337', '250724', '20'), +('10', '103', '11', '111334', '250581', '20'), +('10', '103', '11', '111338', '248876', '20'), +('10', '104', '22', '39342', '0', '20'), +('10', '104', '22', '7867', '0', '20'), +('10', '104', '22', '23597', '0', '20'), +('10', '104', '22', '54829', '0', '20'), +('10', '104', '1', '98769', '417040', '20'), +('10', '104', '1', '111304', '250986', '20'), +('10', '104', '1', '111307', '250772', '20'), +('10', '104', '1', '111310', '250376', '20'), +('10', '104', '2', '62985', '157154', '20'), +('10', '104', '2', '94056', '156844', '20'), +('10', '104', '2', '62988', '156049', '20'), +('10', '104', '2', '104410', '133158', '20'), +('10', '104', '3', '111314', '251356', '20'), +('10', '104', '3', '111316', '250059', '20'), +('10', '104', '3', '111315', '250016', '20'), +('10', '104', '3', '111013', '219756', '20'), +('10', '104', '5', '111319', '251143', '20'), +('10', '104', '5', '111317', '249492', '20'), +('10', '104', '5', '111318', '249297', '20'), +('10', '104', '5', '111320', '249141', '20'), +('10', '104', '8', '111332', '251498', '20'), +('10', '104', '8', '111330', '250208', '20'), +('10', '104', '8', '111331', '249355', '20'), +('10', '104', '8', '111328', '249137', '20'), +('10', '104', '6', '111323', '251429', '20'), +('10', '104', '6', '111326', '250317', '20'), +('10', '104', '6', '111324', '249847', '20'), +('10', '104', '6', '111022', '219828', '20'), +('10', '104', '17', '81765', '163927', '20'), +('10', '104', '17', '56046', '163479', '20'), +('10', '104', '17', '56083', '163282', '20'), +('10', '104', '17', '104413', '138933', '20'), +('10', '104', '7', '94053', '155878', '20'), +('10', '104', '7', '56080', '155562', '20'), +('10', '104', '7', '104411', '132119', '20'), +('10', '104', '7', '54848', '100588', '20'), +('10', '104', '9', '67098', '260094', '20'), +('10', '104', '9', '81764', '152138', '20'), +('10', '104', '9', '56070', '151853', '20'), +('10', '104', '9', '62984', '151760', '20'), +('10', '104', '15', '111350', '252168', '20'), +('10', '104', '15', '111344', '251726', '20'), +('10', '104', '15', '111340', '251168', '20'), +('10', '104', '15', '111342', '250026', '20'), +('10', '104', '20', '111356', '251537', '20'), +('10', '104', '20', '111352', '250592', '20'), +('10', '104', '20', '111351', '249918', '20'), +('10', '104', '20', '111054', '219937', '20'), +('10', '104', '12', '56073', '153222', '20'), +('10', '104', '12', '56035', '152951', '20'), +('10', '104', '12', '104408', '129617', '20'), +('10', '104', '12', '49656', '99925', '20'), +('10', '104', '18', '56041', '162075', '20'), +('10', '104', '18', '62986', '160811', '20'), +('10', '104', '18', '94054', '160477', '20'), +('10', '104', '18', '104412', '135936', '20'), +('10', '104', '19', '81763', '158191', '20'), +('10', '104', '19', '56037', '157764', '20'), +('10', '104', '19', '56075', '157723', '20'), +('10', '104', '19', '62990', '157696', '20'), +('10', '104', '13', '111518', '242581', '20'), +('10', '104', '13', '111517', '240380', '20'), +('10', '104', '13', '111217', '219673', '20'), +('10', '104', '13', '111218', '219130', '20'), +('10', '104', '14', '111539', '252933', '20'), +('10', '104', '14', '111537', '252130', '20'), +('10', '104', '14', '111535', '251859', '20'), +('10', '104', '14', '111239', '221332', '20'), +('10', '104', '11', '133816', '330395', '20'), +('10', '104', '11', '111337', '250733', '20'), +('10', '104', '11', '111334', '250588', '20'), +('10', '104', '11', '111338', '248882', '20'), +('10', '105', '22', '39342', '0', '23'), +('10', '105', '22', '7867', '0', '23'), +('10', '105', '22', '23597', '0', '23'), +('10', '105', '22', '54829', '0', '23'), +('10', '105', '1', '98769', '417045', '23'), +('10', '105', '1', '111304', '250994', '23'), +('10', '105', '1', '111307', '250777', '23'), +('10', '105', '1', '111310', '250383', '23'), +('10', '105', '2', '62985', '157162', '23'), +('10', '105', '2', '94056', '156850', '23'), +('10', '105', '2', '62988', '156054', '23'), +('10', '105', '2', '104410', '133164', '23'), +('10', '105', '3', '111314', '251363', '23'), +('10', '105', '3', '111316', '250066', '23'), +('10', '105', '3', '111315', '250024', '23'), +('10', '105', '3', '111013', '219763', '23'), +('10', '105', '5', '111319', '251149', '23'), +('10', '105', '5', '111317', '249499', '23'), +('10', '105', '5', '111318', '249303', '23'), +('10', '105', '5', '111320', '249147', '23'), +('10', '105', '8', '111332', '251506', '23'), +('10', '105', '8', '111330', '250215', '23'), +('10', '105', '8', '111331', '249364', '23'), +('10', '105', '8', '111328', '249142', '23'), +('10', '105', '6', '111323', '251436', '23'), +('10', '105', '6', '111326', '250327', '23'), +('10', '105', '6', '111324', '249853', '23'), +('10', '105', '6', '111022', '219836', '23'), +('10', '105', '17', '81765', '163933', '23'), +('10', '105', '17', '56046', '163487', '23'), +('10', '105', '17', '56083', '163286', '23'), +('10', '105', '17', '104413', '138943', '23'), +('10', '105', '7', '94053', '155884', '23'), +('10', '105', '7', '56080', '155570', '23'), +('10', '105', '7', '104411', '132129', '23'), +('10', '105', '7', '54848', '100594', '23'), +('10', '105', '9', '67098', '260100', '23'), +('10', '105', '9', '81764', '152149', '23'), +('10', '105', '9', '56070', '151859', '23'), +('10', '105', '9', '62984', '151767', '23'), +('10', '105', '15', '111350', '252176', '23'), +('10', '105', '15', '111344', '251734', '23'), +('10', '105', '15', '111340', '251175', '23'), +('10', '105', '15', '111342', '250034', '23'), +('10', '105', '20', '111356', '251543', '23'), +('10', '105', '20', '111352', '250599', '23'), +('10', '105', '20', '111351', '249925', '23'), +('10', '105', '20', '111054', '219943', '23'), +('10', '105', '12', '56073', '153229', '23'), +('10', '105', '12', '56035', '152960', '23'), +('10', '105', '12', '104408', '129623', '23'), +('10', '105', '12', '49656', '99926', '23'), +('10', '105', '18', '56041', '162081', '23'), +('10', '105', '18', '62986', '160819', '23'), +('10', '105', '18', '94054', '160482', '23'), +('10', '105', '18', '104412', '135940', '23'), +('10', '105', '19', '81763', '158202', '23'), +('10', '105', '19', '56037', '157772', '23'), +('10', '105', '19', '56075', '157732', '23'), +('10', '105', '19', '62990', '157701', '23'), +('10', '105', '13', '111518', '242588', '23'), +('10', '105', '13', '111517', '240387', '23'), +('10', '105', '13', '111217', '219679', '23'), +('10', '105', '13', '111218', '219137', '23'), +('10', '105', '14', '111539', '252941', '23'), +('10', '105', '14', '111537', '252138', '23'), +('10', '105', '14', '111535', '251865', '23'), +('10', '105', '14', '111239', '221340', '23'), +('10', '105', '11', '133816', '330401', '23'), +('10', '105', '11', '111337', '250743', '23'), +('10', '105', '11', '111334', '250595', '23'), +('10', '105', '11', '111338', '248888', '23'), +('10', '105', '22', '39342', '0', '22'), +('10', '105', '22', '7867', '0', '22'), +('10', '105', '22', '23597', '0', '22'), +('10', '105', '22', '54829', '0', '22'), +('10', '105', '1', '98769', '417045', '22'), +('10', '105', '1', '111304', '250994', '22'), +('10', '105', '1', '111307', '250777', '22'), +('10', '105', '1', '111310', '250383', '22'), +('10', '105', '2', '62985', '157162', '22'), +('10', '105', '2', '94056', '156850', '22'), +('10', '105', '2', '62988', '156054', '22'), +('10', '105', '2', '104410', '133164', '22'), +('10', '105', '3', '111314', '251363', '22'), +('10', '105', '3', '111316', '250066', '22'), +('10', '105', '3', '111315', '250024', '22'), +('10', '105', '3', '111013', '219763', '22'), +('10', '105', '5', '111319', '251149', '22'), +('10', '105', '5', '111317', '249499', '22'), +('10', '105', '5', '111318', '249303', '22'), +('10', '105', '5', '111320', '249147', '22'), +('10', '105', '8', '111332', '251506', '22'), +('10', '105', '8', '111330', '250215', '22'), +('10', '105', '8', '111331', '249364', '22'), +('10', '105', '8', '111328', '249142', '22'), +('10', '105', '6', '111323', '251436', '22'), +('10', '105', '6', '111326', '250327', '22'), +('10', '105', '6', '111324', '249853', '22'), +('10', '105', '6', '111022', '219836', '22'), +('10', '105', '17', '81765', '163933', '22'), +('10', '105', '17', '56046', '163487', '22'), +('10', '105', '17', '56083', '163286', '22'), +('10', '105', '17', '104413', '138943', '22'), +('10', '105', '7', '94053', '155884', '22'), +('10', '105', '7', '56080', '155570', '22'), +('10', '105', '7', '104411', '132129', '22'), +('10', '105', '7', '54848', '100594', '22'), +('10', '105', '9', '67098', '260100', '22'), +('10', '105', '9', '81764', '152149', '22'), +('10', '105', '9', '56070', '151859', '22'), +('10', '105', '9', '62984', '151767', '22'), +('10', '105', '15', '111350', '252176', '22'), +('10', '105', '15', '111344', '251734', '22'), +('10', '105', '15', '111340', '251175', '22'), +('10', '105', '15', '111342', '250034', '22'), +('10', '105', '20', '111356', '251543', '22'), +('10', '105', '20', '111352', '250599', '22'), +('10', '105', '20', '111351', '249925', '22'), +('10', '105', '20', '111054', '219943', '22'), +('10', '105', '12', '56073', '153229', '22'), +('10', '105', '12', '56035', '152960', '22'), +('10', '105', '12', '104408', '129623', '22'), +('10', '105', '12', '49656', '99926', '22'), +('10', '105', '18', '56041', '162081', '22'), +('10', '105', '18', '62986', '160819', '22'), +('10', '105', '18', '94054', '160482', '22'), +('10', '105', '18', '104412', '135940', '22'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '105', '19', '81763', '158202', '22'), +('10', '105', '19', '56037', '157772', '22'), +('10', '105', '19', '56075', '157732', '22'), +('10', '105', '19', '62990', '157701', '22'), +('10', '105', '13', '111518', '242588', '22'), +('10', '105', '13', '111517', '240387', '22'), +('10', '105', '13', '111217', '219679', '22'), +('10', '105', '13', '111218', '219137', '22'), +('10', '105', '14', '111539', '252941', '22'), +('10', '105', '14', '111537', '252138', '22'), +('10', '105', '14', '111535', '251865', '22'), +('10', '105', '14', '111239', '221340', '22'), +('10', '105', '11', '133816', '330401', '22'), +('10', '105', '11', '111337', '250743', '22'), +('10', '105', '11', '111334', '250595', '22'), +('10', '105', '11', '111338', '248888', '22'), +('10', '105', '22', '39342', '0', '21'), +('10', '105', '22', '7867', '0', '21'), +('10', '105', '22', '23597', '0', '21'), +('10', '105', '22', '54829', '0', '21'), +('10', '105', '1', '98769', '417045', '21'), +('10', '105', '1', '111304', '250994', '21'), +('10', '105', '1', '111307', '250777', '21'), +('10', '105', '1', '111310', '250383', '21'), +('10', '105', '2', '62985', '157162', '21'), +('10', '105', '2', '94056', '156850', '21'), +('10', '105', '2', '62988', '156054', '21'), +('10', '105', '2', '104410', '133164', '21'), +('10', '105', '3', '111314', '251363', '21'), +('10', '105', '3', '111316', '250066', '21'), +('10', '105', '3', '111315', '250024', '21'), +('10', '105', '3', '111013', '219763', '21'), +('10', '105', '5', '111319', '251149', '21'), +('10', '105', '5', '111317', '249499', '21'), +('10', '105', '5', '111318', '249303', '21'), +('10', '105', '5', '111320', '249147', '21'), +('10', '105', '8', '111332', '251506', '21'), +('10', '105', '8', '111330', '250215', '21'), +('10', '105', '8', '111331', '249364', '21'), +('10', '105', '8', '111328', '249142', '21'), +('10', '105', '6', '111323', '251436', '21'), +('10', '105', '6', '111326', '250327', '21'), +('10', '105', '6', '111324', '249853', '21'), +('10', '105', '6', '111022', '219836', '21'), +('10', '105', '17', '81765', '163933', '21'), +('10', '105', '17', '56046', '163487', '21'), +('10', '105', '17', '56083', '163286', '21'), +('10', '105', '17', '104413', '138943', '21'), +('10', '105', '7', '94053', '155884', '21'), +('10', '105', '7', '56080', '155570', '21'), +('10', '105', '7', '104411', '132129', '21'), +('10', '105', '7', '54848', '100594', '21'), +('10', '105', '9', '67098', '260100', '21'), +('10', '105', '9', '81764', '152149', '21'), +('10', '105', '9', '56070', '151859', '21'), +('10', '105', '9', '62984', '151767', '21'), +('10', '105', '15', '111350', '252176', '21'), +('10', '105', '15', '111344', '251734', '21'), +('10', '105', '15', '111340', '251175', '21'), +('10', '105', '15', '111342', '250034', '21'), +('10', '105', '20', '111356', '251543', '21'), +('10', '105', '20', '111352', '250599', '21'), +('10', '105', '20', '111351', '249925', '21'), +('10', '105', '20', '111054', '219943', '21'), +('10', '105', '12', '56073', '153229', '21'), +('10', '105', '12', '56035', '152960', '21'), +('10', '105', '12', '104408', '129623', '21'), +('10', '105', '12', '49656', '99926', '21'), +('10', '105', '18', '56041', '162081', '21'), +('10', '105', '18', '62986', '160819', '21'), +('10', '105', '18', '94054', '160482', '21'), +('10', '105', '18', '104412', '135940', '21'), +('10', '105', '19', '81763', '158202', '21'), +('10', '105', '19', '56037', '157772', '21'), +('10', '105', '19', '56075', '157732', '21'), +('10', '105', '19', '62990', '157701', '21'), +('10', '105', '13', '111518', '242588', '21'), +('10', '105', '13', '111517', '240387', '21'), +('10', '105', '13', '111217', '219679', '21'), +('10', '105', '13', '111218', '219137', '21'), +('10', '105', '14', '111539', '252941', '21'), +('10', '105', '14', '111537', '252138', '21'), +('10', '105', '14', '111535', '251865', '21'), +('10', '105', '14', '111239', '221340', '21'), +('10', '105', '11', '133816', '330401', '21'), +('10', '105', '11', '111337', '250743', '21'), +('10', '105', '11', '111334', '250595', '21'), +('10', '105', '11', '111338', '248888', '21'), +('10', '106', '22', '39342', '0', '23'), +('10', '106', '22', '7867', '0', '23'), +('10', '106', '22', '23597', '0', '23'), +('10', '106', '22', '54829', '0', '23'), +('10', '106', '1', '98769', '417050', '23'), +('10', '106', '1', '111304', '251002', '23'), +('10', '106', '1', '111307', '250782', '23'), +('10', '106', '1', '111310', '250391', '23'), +('10', '106', '2', '62985', '157171', '23'), +('10', '106', '2', '94056', '156856', '23'), +('10', '106', '2', '62988', '156059', '23'), +('10', '106', '2', '104410', '133170', '23'), +('10', '106', '3', '111314', '251371', '23'), +('10', '106', '3', '111316', '250073', '23'), +('10', '106', '3', '111315', '250031', '23'), +('10', '106', '3', '111013', '219770', '23'), +('10', '106', '5', '111319', '251155', '23'), +('10', '106', '5', '111317', '249506', '23'), +('10', '106', '5', '111318', '249309', '23'), +('10', '106', '5', '111320', '249153', '23'), +('10', '106', '8', '111332', '251514', '23'), +('10', '106', '8', '111330', '250222', '23'), +('10', '106', '8', '111331', '249372', '23'), +('10', '106', '8', '111328', '249147', '23'), +('10', '106', '6', '111323', '251444', '23'), +('10', '106', '6', '111326', '250336', '23'), +('10', '106', '6', '111324', '249858', '23'), +('10', '106', '6', '111022', '219843', '23'), +('10', '106', '17', '81765', '163939', '23'), +('10', '106', '17', '56046', '163494', '23'), +('10', '106', '17', '56083', '163290', '23'), +('10', '106', '17', '104413', '138953', '23'), +('10', '106', '7', '94053', '155889', '23'), +('10', '106', '7', '56080', '155579', '23'), +('10', '106', '7', '104411', '132138', '23'), +('10', '106', '7', '54848', '100601', '23'), +('10', '106', '9', '67098', '260106', '23'), +('10', '106', '9', '81764', '152160', '23'), +('10', '106', '9', '56070', '151866', '23'), +('10', '106', '9', '62984', '151774', '23'), +('10', '106', '15', '111350', '252185', '23'), +('10', '106', '15', '111344', '251743', '23'), +('10', '106', '15', '111340', '251182', '23'), +('10', '106', '15', '111342', '250042', '23'), +('10', '106', '20', '111356', '251549', '23'), +('10', '106', '20', '111352', '250607', '23'), +('10', '106', '20', '111351', '249933', '23'), +('10', '106', '20', '111054', '219949', '23'), +('10', '106', '12', '56073', '153237', '23'), +('10', '106', '12', '56035', '152970', '23'), +('10', '106', '12', '104408', '129629', '23'), +('10', '106', '12', '49656', '99927', '23'), +('10', '106', '18', '56041', '162087', '23'), +('10', '106', '18', '62986', '160828', '23'), +('10', '106', '18', '94054', '160488', '23'), +('10', '106', '18', '104412', '135944', '23'), +('10', '106', '19', '81763', '158212', '23'), +('10', '106', '19', '56037', '157780', '23'), +('10', '106', '19', '56075', '157741', '23'), +('10', '106', '19', '62990', '157706', '23'), +('10', '106', '13', '111518', '242596', '23'), +('10', '106', '13', '111517', '240394', '23'), +('10', '106', '13', '111217', '219686', '23'), +('10', '106', '13', '111218', '219144', '23'), +('10', '106', '14', '111539', '252950', '23'), +('10', '106', '14', '111537', '252145', '23'), +('10', '106', '14', '111535', '251872', '23'), +('10', '106', '14', '111239', '221348', '23'), +('10', '106', '11', '133816', '330407', '23'), +('10', '106', '11', '111337', '250753', '23'), +('10', '106', '11', '111334', '250602', '23'), +('10', '106', '11', '111338', '248894', '23'), +('10', '107', '22', '39342', '0', '23'), +('10', '107', '22', '7867', '0', '23'), +('10', '107', '22', '23597', '0', '23'), +('10', '107', '22', '54829', '0', '23'), +('10', '107', '1', '98769', '417054', '23'), +('10', '107', '1', '111304', '251010', '23'), +('10', '107', '1', '111307', '250786', '23'), +('10', '107', '1', '111310', '250398', '23'), +('10', '107', '2', '62985', '157180', '23'), +('10', '107', '2', '94056', '156862', '23'), +('10', '107', '2', '62988', '156064', '23'), +('10', '107', '2', '104410', '133176', '23'), +('10', '107', '3', '111314', '251378', '23'), +('10', '107', '3', '111316', '250080', '23'), +('10', '107', '3', '111315', '250038', '23'), +('10', '107', '3', '111013', '219777', '23'), +('10', '107', '5', '111319', '251162', '23'), +('10', '107', '5', '111317', '249513', '23'), +('10', '107', '5', '111318', '249314', '23'), +('10', '107', '5', '111320', '249159', '23'), +('10', '107', '8', '111332', '251521', '23'), +('10', '107', '8', '111330', '250229', '23'), +('10', '107', '8', '111331', '249381', '23'), +('10', '107', '8', '111328', '249152', '23'), +('10', '107', '6', '111323', '251451', '23'), +('10', '107', '6', '111326', '250346', '23'), +('10', '107', '6', '111324', '249864', '23'), +('10', '107', '6', '111022', '219851', '23'), +('10', '107', '17', '81765', '163945', '23'), +('10', '107', '17', '56046', '163501', '23'), +('10', '107', '17', '56083', '163294', '23'), +('10', '107', '17', '104413', '138963', '23'), +('10', '107', '7', '94053', '155895', '23'), +('10', '107', '7', '56080', '155587', '23'), +('10', '107', '7', '104411', '132147', '23'), +('10', '107', '7', '54848', '100607', '23'), +('10', '107', '9', '67098', '260112', '23'), +('10', '107', '9', '81764', '152171', '23'), +('10', '107', '9', '56070', '151872', '23'), +('10', '107', '9', '62984', '151782', '23'), +('10', '107', '15', '111350', '252194', '23'), +('10', '107', '15', '111344', '251752', '23'), +('10', '107', '15', '111340', '251189', '23'), +('10', '107', '15', '111342', '250050', '23'), +('10', '107', '20', '111356', '251556', '23'), +('10', '107', '20', '111352', '250614', '23'), +('10', '107', '20', '111351', '249940', '23'), +('10', '107', '20', '111054', '219955', '23'), +('10', '107', '12', '56073', '153244', '23'), +('10', '107', '12', '56035', '152980', '23'), +('10', '107', '12', '104408', '129636', '23'), +('10', '107', '12', '49656', '99928', '23'), +('10', '107', '18', '56041', '162094', '23'), +('10', '107', '18', '62986', '160836', '23'), +('10', '107', '18', '94054', '160493', '23'), +('10', '107', '18', '104412', '135948', '23'), +('10', '107', '19', '81763', '158223', '23'), +('10', '107', '19', '56037', '157788', '23'), +('10', '107', '19', '56075', '157749', '23'), +('10', '107', '19', '62990', '157711', '23'), +('10', '107', '13', '111518', '242603', '23'), +('10', '107', '13', '111517', '240401', '23'), +('10', '107', '13', '111217', '219693', '23'), +('10', '107', '13', '111218', '219151', '23'), +('10', '107', '14', '111539', '252958', '23'), +('10', '107', '14', '111537', '252152', '23'), +('10', '107', '14', '111535', '251879', '23'), +('10', '107', '14', '111239', '221356', '23'), +('10', '107', '11', '133816', '330412', '23'), +('10', '107', '11', '111337', '250763', '23'), +('10', '107', '11', '111334', '250609', '23'), +('10', '107', '11', '111338', '248899', '23'), +('10', '108', '22', '39342', '0', '23'), +('10', '108', '22', '7867', '0', '23'), +('10', '108', '22', '23597', '0', '23'), +('10', '108', '22', '54829', '0', '23'), +('10', '108', '1', '98769', '417059', '23'), +('10', '108', '1', '111304', '251018', '23'), +('10', '108', '1', '111307', '250791', '23'), +('10', '108', '1', '111310', '250405', '23'), +('10', '108', '2', '62985', '157189', '23'), +('10', '108', '2', '94056', '156868', '23'), +('10', '108', '2', '62988', '156069', '23'), +('10', '108', '2', '104410', '133182', '23'), +('10', '108', '3', '111314', '251385', '23'), +('10', '108', '3', '111316', '250087', '23'), +('10', '108', '3', '111315', '250046', '23'), +('10', '108', '3', '111013', '219784', '23'), +('10', '108', '5', '111319', '251168', '23'), +('10', '108', '5', '111317', '249520', '23'), +('10', '108', '5', '111318', '249320', '23'), +('10', '108', '5', '111320', '249164', '23'), +('10', '108', '8', '111332', '251529', '23'), +('10', '108', '8', '111330', '250235', '23'), +('10', '108', '8', '111331', '249389', '23'), +('10', '108', '8', '111328', '249157', '23'), +('10', '108', '6', '111323', '251459', '23'), +('10', '108', '6', '111326', '250356', '23'), +('10', '108', '6', '111324', '249870', '23'), +('10', '108', '6', '111022', '219858', '23'), +('10', '108', '17', '81765', '163950', '23'), +('10', '108', '17', '56046', '163509', '23'), +('10', '108', '17', '56083', '163298', '23'), +('10', '108', '17', '104413', '138973', '23'), +('10', '108', '7', '94053', '155900', '23'), +('10', '108', '7', '56080', '155595', '23'), +('10', '108', '7', '104411', '132156', '23'), +('10', '108', '7', '54848', '100613', '23'), +('10', '108', '9', '67098', '260118', '23'), +('10', '108', '9', '81764', '152181', '23'), +('10', '108', '9', '56070', '151879', '23'), +('10', '108', '9', '62984', '151789', '23'), +('10', '108', '15', '111350', '252203', '23'), +('10', '108', '15', '111344', '251761', '23'), +('10', '108', '15', '111340', '251196', '23'), +('10', '108', '15', '111342', '250057', '23'), +('10', '108', '20', '111356', '251562', '23'), +('10', '108', '20', '111352', '250622', '23'), +('10', '108', '20', '111351', '249947', '23'), +('10', '108', '20', '111054', '219961', '23'), +('10', '108', '12', '56073', '153251', '23'), +('10', '108', '12', '56035', '152990', '23'), +('10', '108', '12', '104408', '129642', '23'), +('10', '108', '12', '49656', '99929', '23'), +('10', '108', '18', '56041', '162100', '23'), +('10', '108', '18', '62986', '160845', '23'), +('10', '108', '18', '94054', '160499', '23'), +('10', '108', '18', '104412', '135952', '23'), +('10', '108', '19', '81763', '158233', '23'), +('10', '108', '19', '56037', '157796', '23'), +('10', '108', '19', '56075', '157758', '23'), +('10', '108', '19', '62990', '157716', '23'), +('10', '108', '13', '111518', '242610', '23'), +('10', '108', '13', '111517', '240408', '23'), +('10', '108', '13', '111217', '219700', '23'), +('10', '108', '13', '111218', '219158', '23'), +('10', '108', '14', '111539', '252966', '23'), +('10', '108', '14', '111537', '252160', '23'), +('10', '108', '14', '111535', '251886', '23'), +('10', '108', '14', '111239', '221364', '23'), +('10', '108', '11', '133816', '330418', '23'), +('10', '108', '11', '111337', '250773', '23'), +('10', '108', '11', '111334', '250615', '23'), +('10', '108', '11', '111338', '248905', '23'), +('10', '109', '22', '39342', '0', '23'), +('10', '109', '22', '7867', '0', '23'), +('10', '109', '22', '23597', '0', '23'), +('10', '109', '22', '54829', '0', '23'), +('10', '109', '1', '98769', '417064', '23'), +('10', '109', '1', '111304', '251026', '23'), +('10', '109', '1', '111307', '250796', '23'), +('10', '109', '1', '111310', '250413', '23'), +('10', '109', '2', '62985', '157197', '23'), +('10', '109', '2', '94056', '156874', '23'), +('10', '109', '2', '62988', '156074', '23'), +('10', '109', '2', '104410', '133189', '23'), +('10', '109', '3', '111314', '251392', '23'), +('10', '109', '3', '111316', '250094', '23'), +('10', '109', '3', '111315', '250053', '23'), +('10', '109', '3', '111013', '219791', '23'), +('10', '109', '5', '111319', '251174', '23'), +('10', '109', '5', '111317', '249527', '23'), +('10', '109', '5', '111318', '249326', '23'), +('10', '109', '5', '111320', '249170', '23'), +('10', '109', '8', '111332', '251537', '23'), +('10', '109', '8', '111330', '250242', '23'), +('10', '109', '8', '111331', '249398', '23'), +('10', '109', '8', '111328', '249162', '23'), +('10', '109', '6', '111323', '251466', '23'), +('10', '109', '6', '111326', '250365', '23'), +('10', '109', '6', '111324', '249876', '23'), +('10', '109', '6', '111022', '219865', '23'), +('10', '109', '17', '81765', '163956', '23'), +('10', '109', '17', '56046', '163516', '23'), +('10', '109', '17', '56083', '163302', '23'), +('10', '109', '17', '104413', '138983', '23'), +('10', '109', '7', '94053', '155906', '23'), +('10', '109', '7', '56080', '155604', '23'), +('10', '109', '7', '104411', '132165', '23'), +('10', '109', '7', '54848', '100619', '23'), +('10', '109', '9', '67098', '260124', '23'), +('10', '109', '9', '81764', '152192', '23'), +('10', '109', '9', '56070', '151885', '23'), +('10', '109', '9', '62984', '151796', '23'), +('10', '109', '15', '111350', '252212', '23'), +('10', '109', '15', '111344', '251770', '23'), +('10', '109', '15', '111340', '251203', '23'), +('10', '109', '15', '111342', '250065', '23'), +('10', '109', '20', '111356', '251568', '23'), +('10', '109', '20', '111352', '250629', '23'), +('10', '109', '20', '111351', '249955', '23'), +('10', '109', '20', '111054', '219967', '23'), +('10', '109', '12', '56073', '153259', '23'), +('10', '109', '12', '56035', '153000', '23'), +('10', '109', '12', '104408', '129648', '23'), +('10', '109', '12', '49656', '99930', '23'), +('10', '109', '18', '56041', '162107', '23'), +('10', '109', '18', '62986', '160853', '23'), +('10', '109', '18', '94054', '160504', '23'), +('10', '109', '18', '104412', '135956', '23'), +('10', '109', '19', '81763', '158244', '23'), +('10', '109', '19', '56037', '157804', '23'), +('10', '109', '19', '56075', '157767', '23'), +('10', '109', '19', '62990', '157721', '23'), +('10', '109', '13', '111518', '242617', '23'), +('10', '109', '13', '111517', '240415', '23'), +('10', '109', '13', '111217', '219706', '23'), +('10', '109', '13', '111218', '219165', '23'), +('10', '109', '14', '111539', '252974', '23'), +('10', '109', '14', '111537', '252167', '23'), +('10', '109', '14', '111535', '251893', '23'), +('10', '109', '14', '111239', '221373', '23'), +('10', '109', '11', '133816', '330423', '23'), +('10', '109', '11', '111337', '250783', '23'), +('10', '109', '11', '111334', '250622', '23'), +('10', '109', '11', '111338', '248911', '23'), +('10', '110', '22', '7867', '0', '25'), +('10', '110', '22', '39342', '0', '25'), +('10', '110', '22', '23597', '0', '25'), +('10', '110', '22', '53550', '0', '25'), +('10', '110', '1', '98769', '417068', '25'), +('10', '110', '1', '111304', '251034', '25'), +('10', '110', '1', '111307', '250800', '25'), +('10', '110', '1', '111310', '250420', '25'), +('10', '110', '2', '62985', '157206', '25'), +('10', '110', '2', '94056', '156880', '25'), +('10', '110', '2', '62988', '156079', '25'), +('10', '110', '2', '104410', '133195', '25'), +('10', '110', '3', '111314', '251399', '25'), +('10', '110', '3', '111316', '250101', '25'), +('10', '110', '3', '111315', '250060', '25'), +('10', '110', '3', '111013', '219798', '25'), +('10', '110', '5', '111319', '251181', '25'), +('10', '110', '5', '111317', '249534', '25'), +('10', '110', '5', '111318', '249331', '25'), +('10', '110', '5', '111320', '249176', '25'), +('10', '110', '8', '111332', '251544', '25'), +('10', '110', '8', '111330', '250249', '25'), +('10', '110', '8', '111331', '249406', '25'), +('10', '110', '8', '111328', '249167', '25'), +('10', '110', '6', '111323', '251473', '25'), +('10', '110', '6', '111326', '250375', '25'), +('10', '110', '6', '111324', '249882', '25'), +('10', '110', '6', '111022', '219873', '25'), +('10', '110', '17', '81765', '163962', '25'), +('10', '110', '17', '56046', '163523', '25'), +('10', '110', '17', '56083', '163306', '25'), +('10', '110', '17', '104413', '138993', '25'), +('10', '110', '7', '94053', '155912', '25'), +('10', '110', '7', '56080', '155612', '25'), +('10', '110', '7', '104411', '132175', '25'), +('10', '110', '7', '54848', '100626', '25'), +('10', '110', '9', '67098', '260130', '25'), +('10', '110', '9', '81764', '152203', '25'), +('10', '110', '9', '56070', '151892', '25'), +('10', '110', '9', '62984', '151804', '25'), +('10', '110', '15', '111350', '252221', '25'), +('10', '110', '15', '111344', '251778', '25'), +('10', '110', '15', '111340', '251210', '25'), +('10', '110', '15', '111342', '250073', '25'), +('10', '110', '20', '111356', '251574', '25'), +('10', '110', '20', '111352', '250636', '25'), +('10', '110', '20', '111351', '249962', '25'), +('10', '110', '20', '111054', '219973', '25'), +('10', '110', '12', '56073', '153266', '25'), +('10', '110', '12', '56035', '153010', '25'), +('10', '110', '12', '104408', '129654', '25'), +('10', '110', '12', '49656', '99931', '25'), +('10', '110', '18', '56041', '162113', '25'), +('10', '110', '18', '62986', '160862', '25'), +('10', '110', '18', '94054', '160509', '25'), +('10', '110', '18', '104412', '135960', '25'), +('10', '110', '19', '62904', '213670', '25'), +('10', '110', '19', '81763', '158254', '25'), +('10', '110', '19', '56037', '157812', '25'), +('10', '110', '19', '56075', '157775', '25'), +('10', '110', '13', '111518', '242625', '25'), +('10', '110', '13', '111517', '240422', '25'), +('10', '110', '13', '111217', '219714', '25'), +('10', '110', '13', '111218', '219172', '25'), +('10', '110', '14', '111539', '252982', '25'), +('10', '110', '14', '111537', '252175', '25'), +('10', '110', '14', '111535', '251900', '25'), +('10', '110', '14', '111239', '221381', '25'), +('10', '110', '11', '85213', '374863', '25'), +('10', '110', '11', '133816', '330429', '25'), +('10', '110', '11', '111337', '250792', '25'), +('10', '110', '11', '111334', '250629', '25'), +('10', '110', '22', '7867', '0', '24'), +('10', '110', '22', '39342', '0', '24'), +('10', '110', '22', '23597', '0', '24'), +('10', '110', '22', '53550', '0', '24'), +('10', '110', '1', '98769', '417068', '24'), +('10', '110', '1', '111304', '251034', '24'), +('10', '110', '1', '111307', '250800', '24'), +('10', '110', '1', '111310', '250420', '24'), +('10', '110', '2', '62985', '157206', '24'), +('10', '110', '2', '94056', '156880', '24'), +('10', '110', '2', '62988', '156079', '24'), +('10', '110', '2', '104410', '133195', '24'), +('10', '110', '3', '111314', '251399', '24'), +('10', '110', '3', '111316', '250101', '24'), +('10', '110', '3', '111315', '250060', '24'), +('10', '110', '3', '111013', '219798', '24'), +('10', '110', '5', '111319', '251181', '24'), +('10', '110', '5', '111317', '249534', '24'), +('10', '110', '5', '111318', '249331', '24'), +('10', '110', '5', '111320', '249176', '24'), +('10', '110', '8', '111332', '251544', '24'), +('10', '110', '8', '111330', '250249', '24'), +('10', '110', '8', '111331', '249406', '24'), +('10', '110', '8', '111328', '249167', '24'), +('10', '110', '6', '111323', '251473', '24'), +('10', '110', '6', '111326', '250375', '24'), +('10', '110', '6', '111324', '249882', '24'), +('10', '110', '6', '111022', '219873', '24'), +('10', '110', '17', '81765', '163962', '24'), +('10', '110', '17', '56046', '163523', '24'), +('10', '110', '17', '56083', '163306', '24'), +('10', '110', '17', '104413', '138993', '24'), +('10', '110', '7', '94053', '155912', '24'), +('10', '110', '7', '56080', '155612', '24'), +('10', '110', '7', '104411', '132175', '24'), +('10', '110', '7', '54848', '100626', '24'), +('10', '110', '9', '67098', '260130', '24'), +('10', '110', '9', '81764', '152203', '24'), +('10', '110', '9', '56070', '151892', '24'), +('10', '110', '9', '62984', '151804', '24'), +('10', '110', '15', '111350', '252221', '24'), +('10', '110', '15', '111344', '251778', '24'), +('10', '110', '15', '111340', '251210', '24'), +('10', '110', '15', '111342', '250073', '24'), +('10', '110', '20', '111356', '251574', '24'), +('10', '110', '20', '111352', '250636', '24'), +('10', '110', '20', '111351', '249962', '24'), +('10', '110', '20', '111054', '219973', '24'), +('10', '110', '12', '56073', '153266', '24'), +('10', '110', '12', '56035', '153010', '24'), +('10', '110', '12', '104408', '129654', '24'), +('10', '110', '12', '49656', '99931', '24'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('10', '110', '18', '56041', '162113', '24'), +('10', '110', '18', '62986', '160862', '24'), +('10', '110', '18', '94054', '160509', '24'), +('10', '110', '18', '104412', '135960', '24'), +('10', '110', '19', '81763', '158254', '24'), +('10', '110', '19', '56037', '157812', '24'), +('10', '110', '19', '56075', '157775', '24'), +('10', '110', '19', '62990', '157726', '24'), +('10', '110', '13', '111518', '242625', '24'), +('10', '110', '13', '111517', '240422', '24'), +('10', '110', '13', '111217', '219714', '24'), +('10', '110', '13', '111218', '219172', '24'), +('10', '110', '14', '111539', '252982', '24'), +('10', '110', '14', '111537', '252175', '24'), +('10', '110', '14', '111535', '251900', '24'), +('10', '110', '14', '111239', '221381', '24'), +('10', '110', '11', '85213', '374863', '24'), +('10', '110', '11', '133816', '330429', '24'), +('10', '110', '11', '111337', '250792', '24'), +('10', '110', '11', '111334', '250629', '24'), +('10', '111', '22', '7867', '0', '25'), +('10', '111', '22', '39342', '0', '25'), +('10', '111', '22', '23597', '0', '25'), +('10', '111', '22', '53550', '0', '25'), +('10', '111', '1', '98769', '417073', '25'), +('10', '111', '1', '111304', '251043', '25'), +('10', '111', '1', '111307', '250805', '25'), +('10', '111', '1', '111310', '250427', '25'), +('10', '111', '2', '62985', '157215', '25'), +('10', '111', '2', '94056', '156886', '25'), +('10', '111', '2', '62988', '156084', '25'), +('10', '111', '2', '104410', '133201', '25'), +('10', '111', '3', '111314', '251406', '25'), +('10', '111', '3', '111316', '250108', '25'), +('10', '111', '3', '111315', '250068', '25'), +('10', '111', '3', '111013', '219805', '25'), +('10', '111', '5', '111319', '251187', '25'), +('10', '111', '5', '111317', '249541', '25'), +('10', '111', '5', '111318', '249337', '25'), +('10', '111', '5', '111320', '249182', '25'), +('10', '111', '8', '111332', '251552', '25'), +('10', '111', '8', '111330', '250256', '25'), +('10', '111', '8', '111331', '249415', '25'), +('10', '111', '8', '111328', '249172', '25'), +('10', '111', '6', '111323', '251481', '25'), +('10', '111', '6', '111326', '250385', '25'), +('10', '111', '6', '111324', '249888', '25'), +('10', '111', '6', '111022', '219880', '25'), +('10', '111', '17', '81765', '163968', '25'), +('10', '111', '17', '56046', '163531', '25'), +('10', '111', '17', '56083', '163310', '25'), +('10', '111', '17', '104413', '139003', '25'), +('10', '111', '7', '94053', '155917', '25'), +('10', '111', '7', '56080', '155620', '25'), +('10', '111', '7', '104411', '132184', '25'), +('10', '111', '7', '54848', '100632', '25'), +('10', '111', '9', '67098', '260136', '25'), +('10', '111', '9', '81764', '152214', '25'), +('10', '111', '9', '56070', '151898', '25'), +('10', '111', '9', '62984', '151811', '25'), +('10', '111', '15', '111350', '252230', '25'), +('10', '111', '15', '111344', '251787', '25'), +('10', '111', '15', '111340', '251217', '25'), +('10', '111', '15', '111342', '250081', '25'), +('10', '111', '20', '111356', '251580', '25'), +('10', '111', '20', '111352', '250644', '25'), +('10', '111', '20', '111351', '249969', '25'), +('10', '111', '20', '111054', '219979', '25'), +('10', '111', '12', '56073', '153273', '25'), +('10', '111', '12', '56035', '153020', '25'), +('10', '111', '12', '104408', '129661', '25'), +('10', '111', '12', '49656', '99932', '25'), +('10', '111', '18', '56041', '162119', '25'), +('10', '111', '18', '62986', '160870', '25'), +('10', '111', '18', '94054', '160515', '25'), +('10', '111', '18', '104412', '135964', '25'), +('10', '111', '19', '62904', '213680', '25'), +('10', '111', '19', '81763', '158265', '25'), +('10', '111', '19', '56037', '157819', '25'), +('10', '111', '19', '56075', '157784', '25'), +('10', '111', '13', '111518', '242632', '25'), +('10', '111', '13', '111517', '240429', '25'), +('10', '111', '13', '111217', '219720', '25'), +('10', '111', '13', '111218', '219179', '25'), +('10', '111', '14', '111539', '252991', '25'), +('10', '111', '14', '111537', '252182', '25'), +('10', '111', '14', '111535', '251907', '25'), +('10', '111', '14', '111239', '221389', '25'), +('10', '111', '11', '85213', '374868', '25'), +('10', '111', '11', '133816', '330434', '25'), +('10', '111', '11', '111337', '250802', '25'), +('10', '111', '11', '111334', '250636', '25'), +('10', '112', '22', '7867', '0', '25'), +('10', '112', '22', '39342', '0', '25'), +('10', '112', '22', '23597', '0', '25'), +('10', '112', '22', '53550', '0', '25'), +('10', '112', '1', '98769', '417078', '25'), +('10', '112', '1', '111304', '251051', '25'), +('10', '112', '1', '111307', '250810', '25'), +('10', '112', '1', '111310', '250435', '25'), +('10', '112', '2', '62985', '157224', '25'), +('10', '112', '2', '94056', '156892', '25'), +('10', '112', '2', '62988', '156089', '25'), +('10', '112', '2', '104410', '133207', '25'), +('10', '112', '3', '111314', '251413', '25'), +('10', '112', '3', '111316', '250115', '25'), +('10', '112', '3', '111315', '250075', '25'), +('10', '112', '3', '111013', '219812', '25'), +('10', '112', '5', '111319', '251194', '25'), +('10', '112', '5', '111317', '249548', '25'), +('10', '112', '5', '111318', '249343', '25'), +('10', '112', '5', '111320', '249188', '25'), +('10', '112', '8', '111332', '251560', '25'), +('10', '112', '8', '111330', '250262', '25'), +('10', '112', '8', '111331', '249423', '25'), +('10', '112', '8', '111328', '249177', '25'), +('10', '112', '6', '111323', '251488', '25'), +('10', '112', '6', '111326', '250394', '25'), +('10', '112', '6', '111324', '249893', '25'), +('10', '112', '6', '111022', '219888', '25'), +('10', '112', '17', '81765', '163973', '25'), +('10', '112', '17', '56046', '163538', '25'), +('10', '112', '17', '56083', '163314', '25'), +('10', '112', '17', '104413', '139013', '25'), +('10', '112', '7', '94053', '155923', '25'), +('10', '112', '7', '56080', '155629', '25'), +('10', '112', '7', '104411', '132193', '25'), +('10', '112', '7', '54848', '100638', '25'), +('10', '112', '9', '67098', '260143', '25'), +('10', '112', '9', '81764', '152225', '25'), +('10', '112', '9', '56070', '151904', '25'), +('10', '112', '9', '62984', '151819', '25'), +('10', '112', '15', '111350', '252239', '25'), +('10', '112', '15', '111344', '251796', '25'), +('10', '112', '15', '111340', '251224', '25'), +('10', '112', '15', '111342', '250089', '25'), +('10', '112', '20', '111356', '251586', '25'), +('10', '112', '20', '111352', '250651', '25'), +('10', '112', '20', '111351', '249977', '25'), +('10', '112', '20', '111054', '219985', '25'), +('10', '112', '12', '56073', '153280', '25'), +('10', '112', '12', '56035', '153030', '25'), +('10', '112', '12', '104408', '129667', '25'), +('10', '112', '12', '49656', '99933', '25'), +('10', '112', '18', '56041', '162126', '25'), +('10', '112', '18', '62986', '160879', '25'), +('10', '112', '18', '94054', '160520', '25'), +('10', '112', '18', '104412', '135968', '25'), +('10', '112', '19', '62904', '213691', '25'), +('10', '112', '19', '81763', '158275', '25'), +('10', '112', '19', '56037', '157827', '25'), +('10', '112', '19', '56075', '157793', '25'), +('10', '112', '13', '111518', '242640', '25'), +('10', '112', '13', '111517', '240436', '25'), +('10', '112', '13', '111217', '219727', '25'), +('10', '112', '13', '111218', '219186', '25'), +('10', '112', '14', '111539', '252999', '25'), +('10', '112', '14', '111537', '252190', '25'), +('10', '112', '14', '111535', '251914', '25'), +('10', '112', '14', '111239', '221397', '25'), +('10', '112', '11', '85213', '374873', '25'), +('10', '112', '11', '133816', '330440', '25'), +('10', '112', '11', '111337', '250812', '25'), +('10', '112', '11', '111334', '250643', '25'), +('10', '113', '22', '7867', '0', '25'), +('10', '113', '22', '39342', '0', '25'), +('10', '113', '22', '23597', '0', '25'), +('10', '113', '22', '53550', '0', '25'), +('10', '113', '1', '98769', '417082', '25'), +('10', '113', '1', '111304', '251059', '25'), +('10', '113', '1', '111307', '250814', '25'), +('10', '113', '1', '111310', '250442', '25'), +('10', '113', '2', '62985', '157232', '25'), +('10', '113', '2', '94056', '156898', '25'), +('10', '113', '2', '62988', '156094', '25'), +('10', '113', '2', '104410', '133214', '25'), +('10', '113', '3', '111314', '251420', '25'), +('10', '113', '3', '111316', '250121', '25'), +('10', '113', '3', '111315', '250082', '25'), +('10', '113', '3', '111013', '219819', '25'), +('10', '113', '5', '111319', '251200', '25'), +('10', '113', '5', '111317', '249555', '25'), +('10', '113', '5', '111318', '249349', '25'), +('10', '113', '5', '111320', '249194', '25'), +('10', '113', '8', '111332', '251567', '25'), +('10', '113', '8', '111330', '250269', '25'), +('10', '113', '8', '111331', '249431', '25'), +('10', '113', '8', '111328', '249182', '25'), +('10', '113', '6', '111323', '251496', '25'), +('10', '113', '6', '111326', '250404', '25'), +('10', '113', '6', '111324', '249899', '25'), +('10', '113', '6', '111022', '219895', '25'), +('10', '113', '17', '81765', '163979', '25'), +('10', '113', '17', '56046', '163545', '25'), +('10', '113', '17', '56083', '163318', '25'), +('10', '113', '17', '104413', '139023', '25'), +('10', '113', '7', '94053', '155928', '25'), +('10', '113', '7', '56080', '155637', '25'), +('10', '113', '7', '104411', '132202', '25'), +('10', '113', '7', '54848', '100645', '25'), +('10', '113', '9', '67098', '260149', '25'), +('10', '113', '9', '81764', '152236', '25'), +('10', '113', '9', '56070', '151911', '25'), +('10', '113', '9', '62984', '151826', '25'), +('10', '113', '15', '111350', '252248', '25'), +('10', '113', '15', '111344', '251805', '25'), +('10', '113', '15', '111340', '251232', '25'), +('10', '113', '15', '111342', '250097', '25'), +('10', '113', '20', '111356', '251592', '25'), +('10', '113', '20', '111352', '250658', '25'), +('10', '113', '20', '111351', '249984', '25'), +('10', '113', '20', '111054', '219991', '25'), +('10', '113', '12', '56073', '153288', '25'), +('10', '113', '12', '56035', '153040', '25'), +('10', '113', '12', '104408', '129673', '25'), +('10', '113', '12', '49656', '99933', '25'), +('10', '113', '18', '56041', '162132', '25'), +('10', '113', '18', '62986', '160887', '25'), +('10', '113', '18', '94054', '160526', '25'), +('10', '113', '18', '104412', '135972', '25'), +('10', '113', '19', '62904', '213701', '25'), +('10', '113', '19', '81763', '158286', '25'), +('10', '113', '19', '56037', '157835', '25'), +('10', '113', '19', '56075', '157801', '25'), +('10', '113', '13', '111518', '242647', '25'), +('10', '113', '13', '111517', '240443', '25'), +('10', '113', '13', '111217', '219734', '25'), +('10', '113', '13', '111218', '219193', '25'), +('10', '113', '14', '111539', '253007', '25'), +('10', '113', '14', '111537', '252197', '25'), +('10', '113', '14', '111535', '251921', '25'), +('10', '113', '14', '111239', '221406', '25'), +('10', '113', '11', '85213', '374877', '25'), +('10', '113', '11', '133816', '330446', '25'), +('10', '113', '11', '111337', '250822', '25'), +('10', '113', '11', '111334', '250650', '25'), +('10', '114', '22', '7867', '0', '25'), +('10', '114', '22', '39342', '0', '25'), +('10', '114', '22', '23597', '0', '25'), +('10', '114', '22', '53550', '0', '25'), +('10', '114', '1', '98769', '417087', '25'), +('10', '114', '1', '111304', '251067', '25'), +('10', '114', '1', '111307', '250819', '25'), +('10', '114', '1', '111310', '250449', '25'), +('10', '114', '2', '62985', '157241', '25'), +('10', '114', '2', '94056', '156904', '25'), +('10', '114', '2', '62988', '156099', '25'), +('10', '114', '2', '104410', '133220', '25'), +('10', '114', '3', '111314', '251427', '25'), +('10', '114', '3', '111316', '250128', '25'), +('10', '114', '3', '111315', '250090', '25'), +('10', '114', '3', '111013', '219826', '25'), +('10', '114', '5', '111319', '251206', '25'), +('10', '114', '5', '111317', '249562', '25'), +('10', '114', '5', '111318', '249354', '25'), +('10', '114', '5', '111320', '249200', '25'), +('10', '114', '8', '111332', '251575', '25'), +('10', '114', '8', '111330', '250276', '25'), +('10', '114', '8', '111331', '249440', '25'), +('10', '114', '8', '111328', '249187', '25'), +('10', '114', '6', '111323', '251503', '25'), +('10', '114', '6', '111326', '250414', '25'), +('10', '114', '6', '111324', '249905', '25'), +('10', '114', '6', '111022', '219903', '25'), +('10', '114', '17', '81765', '163985', '25'), +('10', '114', '17', '56046', '163552', '25'), +('10', '114', '17', '56083', '163322', '25'), +('10', '114', '17', '104413', '139033', '25'), +('10', '114', '7', '94053', '155934', '25'), +('10', '114', '7', '56080', '155645', '25'), +('10', '114', '7', '104411', '132212', '25'), +('10', '114', '7', '54848', '100651', '25'), +('10', '114', '9', '67098', '260155', '25'), +('10', '114', '9', '81764', '152246', '25'), +('10', '114', '9', '56070', '151917', '25'), +('10', '114', '9', '62984', '151833', '25'), +('10', '114', '15', '111350', '252256', '25'), +('10', '114', '15', '111344', '251814', '25'), +('10', '114', '15', '111340', '251239', '25'), +('10', '114', '15', '111342', '250105', '25'), +('10', '114', '20', '111356', '251598', '25'), +('10', '114', '20', '111352', '250666', '25'), +('10', '114', '20', '111351', '249992', '25'), +('10', '114', '20', '111054', '219997', '25'), +('10', '114', '12', '56073', '153295', '25'), +('10', '114', '12', '56035', '153050', '25'), +('10', '114', '12', '104408', '129680', '25'), +('10', '114', '12', '49656', '99934', '25'), +('10', '114', '18', '56041', '162138', '25'), +('10', '114', '18', '62986', '160896', '25'), +('10', '114', '18', '94054', '160531', '25'), +('10', '114', '18', '104412', '135976', '25'), +('10', '114', '19', '62904', '213711', '25'), +('10', '114', '19', '81763', '158296', '25'), +('10', '114', '19', '56037', '157843', '25'), +('10', '114', '19', '56075', '157810', '25'), +('10', '114', '13', '111518', '242654', '25'), +('10', '114', '13', '111517', '240450', '25'), +('10', '114', '13', '111217', '219740', '25'), +('10', '114', '13', '111218', '219200', '25'), +('10', '114', '14', '111539', '253015', '25'), +('10', '114', '14', '111537', '252204', '25'), +('10', '114', '14', '111535', '251928', '25'), +('10', '114', '14', '111239', '221414', '25'), +('10', '114', '11', '85213', '374882', '25'), +('10', '114', '11', '133816', '330451', '25'), +('10', '114', '11', '111337', '250832', '25'), +('10', '114', '11', '111334', '250657', '25'), +('10', '115', '22', '7867', '0', '26'), +('10', '115', '22', '39342', '0', '26'), +('10', '115', '22', '23597', '0', '26'), +('10', '115', '22', '53550', '0', '26'), +('10', '115', '1', '98769', '417092', '26'), +('10', '115', '1', '111304', '251075', '26'), +('10', '115', '1', '111307', '250824', '26'), +('10', '115', '1', '111310', '250457', '26'), +('10', '115', '2', '62985', '157250', '26'), +('10', '115', '2', '94056', '156910', '26'), +('10', '115', '2', '62988', '156105', '26'), +('10', '115', '2', '104410', '133226', '26'), +('10', '115', '3', '111314', '251434', '26'), +('10', '115', '3', '111316', '250135', '26'), +('10', '115', '3', '111315', '250097', '26'), +('10', '115', '3', '111013', '219833', '26'), +('10', '115', '5', '111319', '251213', '26'), +('10', '115', '5', '111317', '249569', '26'), +('10', '115', '5', '111318', '249360', '26'), +('10', '115', '5', '111320', '249206', '26'), +('10', '115', '8', '111332', '251583', '26'), +('10', '115', '8', '111330', '250283', '26'), +('10', '115', '8', '111331', '249448', '26'), +('10', '115', '8', '111328', '249192', '26'), +('10', '115', '6', '111323', '251511', '26'), +('10', '115', '6', '111326', '250423', '26'), +('10', '115', '6', '111324', '249911', '26'), +('10', '115', '6', '111022', '219910', '26'), +('10', '115', '17', '81765', '163991', '26'), +('10', '115', '17', '56046', '163560', '26'), +('10', '115', '17', '56083', '163326', '26'), +('10', '115', '17', '104413', '139043', '26'), +('10', '115', '7', '94053', '155939', '26'), +('10', '115', '7', '56080', '155654', '26'), +('10', '115', '7', '104411', '132221', '26'), +('10', '115', '7', '54848', '100657', '26'), +('10', '115', '9', '67098', '260161', '26'), +('10', '115', '9', '81764', '152257', '26'), +('10', '115', '9', '56070', '151924', '26'), +('10', '115', '9', '62984', '151841', '26'), +('10', '115', '15', '111350', '252265', '26'), +('10', '115', '15', '111344', '251823', '26'), +('10', '115', '15', '111340', '251246', '26'), +('10', '115', '15', '111342', '250112', '26'), +('10', '115', '20', '111356', '251604', '26'), +('10', '115', '20', '111352', '250673', '26'), +('10', '115', '20', '111351', '249999', '26'), +('10', '115', '20', '111054', '220004', '26'), +('10', '115', '12', '56073', '153302', '26'), +('10', '115', '12', '56035', '153060', '26'), +('10', '115', '12', '104408', '129686', '26'), +('10', '115', '12', '49656', '99935', '26'), +('10', '115', '18', '56041', '162145', '26'), +('10', '115', '18', '62986', '160904', '26'), +('10', '115', '18', '94054', '160536', '26'), +('10', '115', '18', '104412', '135980', '26'), +('10', '115', '19', '62904', '213722', '26'), +('10', '115', '19', '81763', '158307', '26'), +('10', '115', '19', '56037', '157851', '26'), +('10', '115', '19', '56075', '157819', '26'), +('10', '115', '13', '111518', '242661', '26'), +('10', '115', '13', '111517', '240457', '26'), +('10', '115', '13', '111217', '219747', '26'), +('10', '115', '13', '111218', '219207', '26'), +('10', '115', '14', '111539', '253023', '26'), +('10', '115', '14', '111537', '252212', '26'), +('10', '115', '14', '111535', '251935', '26'), +('10', '115', '14', '111239', '221422', '26'), +('10', '115', '11', '85213', '374887', '26'), +('10', '115', '11', '133816', '330457', '26'), +('10', '115', '11', '111337', '250842', '26'), +('10', '115', '11', '111334', '250664', '26'), +('11', '1', '22', '10323', '0', '0'), +('11', '1', '22', '9246', '0', '0'), +('11', '1', '22', '21509', '0', '0'), +('11', '1', '22', '8007', '0', '0'), +('11', '1', '1', '14702', '3750', '0'), +('11', '1', '1', '14701', '2862', '0'), +('11', '1', '1', '30361', '2640', '0'), +('11', '1', '1', '10321', '1000', '0'), +('11', '1', '2', '10143', '5368', '0'), +('11', '1', '2', '30363', '3700', '0'), +('11', '1', '2', '1232', '2527', '0'), +('11', '1', '2', '1211', '1485', '0'), +('11', '1', '3', '1544', '5712', '0'), +('11', '1', '3', '1212', '1330', '0'), +('11', '1', '3', '14705', '990', '0'), +('11', '1', '3', '14706', '990', '0'), +('11', '1', '5', '14703', '6050', '0'), +('11', '1', '5', '14700', '3318', '0'), +('11', '1', '5', '30362', '3140', '0'), +('11', '1', '5', '14560', '2807', '0'), +('11', '1', '8', '11603', '8419', '0'), +('11', '1', '8', '1278', '5104', '0'), +('11', '1', '8', '2349', '3554', '0'), +('11', '1', '8', '1216', '1343', '0'), +('11', '1', '6', '1279', '6886', '0'), +('11', '1', '6', '1557', '5310', '0'), +('11', '1', '6', '1905', '5031', '0'), +('11', '1', '6', '1401', '2174', '0'), +('11', '1', '17', '1253', '10051', '0'), +('11', '1', '17', '1644', '8427', '0'), +('11', '1', '17', '11641', '5763', '0'), +('11', '1', '17', '1357', '5468', '0'), +('11', '1', '7', '1362', '2624', '0'), +('11', '1', '7', '1321', '1746', '0'), +('11', '1', '7', '1648', '885', '0'), +('11', '1', '7', '1234', '565', '0'), +('11', '1', '9', '12804', '6753', '0'), +('11', '1', '9', '27712', '2597', '0'), +('11', '1', '9', '4344', '2051', '0'), +('11', '1', '9', '10408', '2002', '0'), +('11', '1', '15', '27713', '5072', '0'), +('11', '1', '15', '20659', '3136', '0'), +('11', '1', '15', '10150', '3004', '0'), +('11', '1', '15', '10163', '2300', '0'), +('11', '1', '20', '11666', '8289', '0'), +('11', '1', '20', '2742', '5069', '0'), +('11', '1', '20', '1217', '1339', '0'), +('11', '1', '20', '1647', '1334', '0'), +('11', '1', '12', '2923', '3074', '0'), +('11', '1', '12', '20655', '2626', '0'), +('11', '1', '12', '1404', '2512', '0'), +('11', '1', '12', '1236', '1627', '0'), +('11', '1', '18', '4410', '1142', '0'), +('11', '1', '18', '1651', '971', '0'), +('11', '1', '18', '1221', '454', '0'), +('11', '1', '18', '1237', '436', '0'), +('11', '1', '19', '1368', '2016', '0'), +('11', '1', '19', '68239', '1960', '0'), +('11', '1', '19', '1652', '1834', '0'), +('11', '1', '19', '3317', '1680', '0'), +('11', '1', '13', '14759', '5262', '0'), +('11', '1', '13', '10527', '4500', '0'), +('11', '1', '13', '11689', '4217', '0'), +('11', '1', '13', '11625', '3514', '0'), +('11', '1', '14', '10219', '5681', '0'), +('11', '1', '14', '14759', '5262', '0'), +('11', '1', '14', '10527', '4500', '0'), +('11', '1', '14', '11625', '3514', '0'), +('11', '1', '11', '14762', '2204', '0'), +('11', '1', '11', '13169', '1536', '0'), +('11', '1', '11', '13353', '1500', '0'), +('11', '1', '11', '20677', '450', '0'), +('11', '2', '22', '10323', '0', '0'), +('11', '2', '22', '9246', '0', '0'), +('11', '2', '22', '21509', '0', '0'), +('11', '2', '22', '8007', '0', '0'), +('11', '2', '1', '14702', '3750', '0'), +('11', '2', '1', '14701', '2862', '0'), +('11', '2', '1', '30361', '2640', '0'), +('11', '2', '1', '10321', '1000', '0'), +('11', '2', '2', '10143', '5368', '0'), +('11', '2', '2', '30363', '3700', '0'), +('11', '2', '2', '1232', '2623', '0'), +('11', '2', '2', '1211', '1569', '0'), +('11', '2', '3', '1544', '5772', '0'), +('11', '2', '3', '1212', '1342', '0'), +('11', '2', '3', '14705', '990', '0'), +('11', '2', '3', '14706', '990', '0'), +('11', '2', '5', '14703', '6050', '0'), +('11', '2', '5', '14700', '3318', '0'), +('11', '2', '5', '30362', '3140', '0'), +('11', '2', '5', '14560', '2928', '0'), +('11', '2', '8', '11603', '8528', '0'), +('11', '2', '8', '1278', '5166', '0'), +('11', '2', '8', '2349', '3554', '0'), +('11', '2', '8', '1216', '1356', '0'), +('11', '2', '6', '1279', '6947', '0'), +('11', '2', '6', '1557', '5310', '0'), +('11', '2', '6', '1905', '5033', '0'), +('11', '2', '6', '1401', '2174', '0'), +('11', '2', '17', '1253', '10053', '0'), +('11', '2', '17', '1644', '8487', '0'), +('11', '2', '17', '11641', '5944', '0'), +('11', '2', '17', '1357', '5468', '0'), +('11', '2', '7', '1362', '2624', '0'), +('11', '2', '7', '1321', '1746', '0'), +('11', '2', '7', '1648', '945', '0'), +('11', '2', '7', '1234', '649', '0'), +('11', '2', '9', '12804', '6753', '0'), +('11', '2', '9', '27712', '2657', '0'), +('11', '2', '9', '4344', '2051', '0'), +('11', '2', '9', '10408', '2002', '0'), +('11', '2', '15', '27713', '5133', '0'), +('11', '2', '15', '20659', '3172', '0'), +('11', '2', '15', '10150', '3004', '0'), +('11', '2', '15', '10163', '2300', '0'), +('11', '2', '20', '11666', '8290', '0'), +('11', '2', '20', '2742', '5071', '0'), +('11', '2', '20', '1217', '1351', '0'), +('11', '2', '20', '1647', '1334', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '2', '12', '2923', '3074', '0'), +('11', '2', '12', '20655', '2651', '0'), +('11', '2', '12', '1404', '2512', '0'), +('11', '2', '12', '1236', '1723', '0'), +('11', '2', '18', '4410', '1142', '0'), +('11', '2', '18', '1651', '1008', '0'), +('11', '2', '18', '1221', '454', '0'), +('11', '2', '18', '1237', '436', '0'), +('11', '2', '19', '1368', '2016', '0'), +('11', '2', '19', '68239', '1996', '0'), +('11', '2', '19', '1652', '1834', '0'), +('11', '2', '19', '3317', '1680', '0'), +('11', '2', '13', '14759', '5333', '0'), +('11', '2', '13', '10527', '4500', '0'), +('11', '2', '13', '11689', '4308', '0'), +('11', '2', '13', '11625', '3516', '0'), +('11', '2', '14', '10219', '5681', '0'), +('11', '2', '14', '14759', '5333', '0'), +('11', '2', '14', '10527', '4500', '0'), +('11', '2', '14', '11625', '3516', '0'), +('11', '2', '11', '14762', '2204', '0'), +('11', '2', '11', '13169', '1572', '0'), +('11', '2', '11', '13353', '1500', '0'), +('11', '2', '11', '20677', '450', '0'), +('11', '3', '22', '10323', '0', '0'), +('11', '3', '22', '9246', '0', '0'), +('11', '3', '22', '21509', '0', '0'), +('11', '3', '22', '8007', '0', '0'), +('11', '3', '1', '14702', '3750', '0'), +('11', '3', '1', '14701', '2862', '0'), +('11', '3', '1', '30361', '2640', '0'), +('11', '3', '1', '10321', '1000', '0'), +('11', '3', '2', '10143', '5368', '0'), +('11', '3', '2', '30363', '3700', '0'), +('11', '3', '2', '1232', '2720', '0'), +('11', '3', '2', '1211', '1654', '0'), +('11', '3', '3', '1544', '5833', '0'), +('11', '3', '3', '1212', '1354', '0'), +('11', '3', '3', '14705', '990', '0'), +('11', '3', '3', '14706', '990', '0'), +('11', '3', '5', '14703', '6050', '0'), +('11', '3', '5', '14700', '3318', '0'), +('11', '3', '5', '30362', '3140', '0'), +('11', '3', '5', '14560', '3049', '0'), +('11', '3', '8', '11603', '8637', '0'), +('11', '3', '8', '1278', '5228', '0'), +('11', '3', '8', '2349', '3554', '0'), +('11', '3', '8', '1216', '1368', '0'), +('11', '3', '6', '1279', '7007', '0'), +('11', '3', '6', '1557', '5310', '0'), +('11', '3', '6', '1905', '5034', '0'), +('11', '3', '6', '1401', '2174', '0'), +('11', '3', '17', '1253', '10056', '0'), +('11', '3', '17', '1644', '8548', '0'), +('11', '3', '17', '11641', '6125', '0'), +('11', '3', '17', '1357', '5468', '0'), +('11', '3', '7', '1362', '2624', '0'), +('11', '3', '7', '1321', '1746', '0'), +('11', '3', '7', '1648', '1005', '0'), +('11', '3', '7', '1234', '734', '0'), +('11', '3', '9', '12804', '6753', '0'), +('11', '3', '9', '27712', '2717', '0'), +('11', '3', '9', '4344', '2051', '0'), +('11', '3', '9', '10408', '2002', '0'), +('11', '3', '15', '27713', '5193', '0'), +('11', '3', '15', '20659', '3209', '0'), +('11', '3', '15', '10150', '3004', '0'), +('11', '3', '15', '10163', '2300', '0'), +('11', '3', '20', '11666', '8292', '0'), +('11', '3', '20', '2742', '5074', '0'), +('11', '3', '20', '1217', '1363', '0'), +('11', '3', '20', '1647', '1334', '0'), +('11', '3', '12', '2923', '3074', '0'), +('11', '3', '12', '20655', '2675', '0'), +('11', '3', '12', '1404', '2512', '0'), +('11', '3', '12', '1236', '1820', '0'), +('11', '3', '18', '4410', '1142', '0'), +('11', '3', '18', '1651', '1044', '0'), +('11', '3', '18', '1221', '454', '0'), +('11', '3', '18', '1237', '436', '0'), +('11', '3', '19', '68239', '2032', '0'), +('11', '3', '19', '1368', '2016', '0'), +('11', '3', '19', '1652', '1834', '0'), +('11', '3', '19', '3317', '1680', '0'), +('11', '3', '13', '14759', '5405', '0'), +('11', '3', '13', '10527', '4500', '0'), +('11', '3', '13', '11689', '4398', '0'), +('11', '3', '13', '11625', '3519', '0'), +('11', '3', '14', '10219', '5681', '0'), +('11', '3', '14', '14759', '5405', '0'), +('11', '3', '14', '10527', '4500', '0'), +('11', '3', '14', '11625', '3519', '0'), +('11', '3', '11', '14762', '2204', '0'), +('11', '3', '11', '13169', '1609', '0'), +('11', '3', '11', '13353', '1500', '0'), +('11', '3', '11', '20677', '450', '0'), +('11', '4', '22', '10323', '0', '0'), +('11', '4', '22', '9246', '0', '0'), +('11', '4', '22', '21509', '0', '0'), +('11', '4', '22', '8007', '0', '0'), +('11', '4', '1', '14702', '3750', '0'), +('11', '4', '1', '14701', '2862', '0'), +('11', '4', '1', '30361', '2640', '0'), +('11', '4', '1', '10321', '1000', '0'), +('11', '4', '2', '10143', '5368', '0'), +('11', '4', '2', '30363', '3700', '0'), +('11', '4', '2', '1232', '2817', '0'), +('11', '4', '2', '1211', '1738', '0'), +('11', '4', '3', '1544', '5893', '0'), +('11', '4', '3', '1212', '1366', '0'), +('11', '4', '3', '14705', '990', '0'), +('11', '4', '3', '14706', '990', '0'), +('11', '4', '5', '14703', '6050', '0'), +('11', '4', '5', '14700', '3318', '0'), +('11', '4', '5', '14560', '3169', '0'), +('11', '4', '5', '30362', '3140', '0'), +('11', '4', '8', '11603', '8745', '0'), +('11', '4', '8', '1278', '5290', '0'), +('11', '4', '8', '2349', '3554', '0'), +('11', '4', '8', '1216', '1380', '0'), +('11', '4', '6', '1279', '7068', '0'), +('11', '4', '6', '1557', '5310', '0'), +('11', '4', '6', '1905', '5035', '0'), +('11', '4', '6', '1401', '2174', '0'), +('11', '4', '17', '1253', '10058', '0'), +('11', '4', '17', '1644', '8608', '0'), +('11', '4', '17', '11641', '6306', '0'), +('11', '4', '17', '1357', '5468', '0'), +('11', '4', '7', '1362', '2624', '0'), +('11', '4', '7', '1321', '1746', '0'), +('11', '4', '7', '1648', '1066', '0'), +('11', '4', '7', '1234', '818', '0'), +('11', '4', '9', '12804', '6753', '0'), +('11', '4', '9', '27712', '2778', '0'), +('11', '4', '9', '4344', '2051', '0'), +('11', '4', '9', '10408', '2002', '0'), +('11', '4', '15', '27713', '5254', '0'), +('11', '4', '15', '20659', '3245', '0'), +('11', '4', '15', '10150', '3004', '0'), +('11', '4', '15', '10163', '2300', '0'), +('11', '4', '20', '11666', '8294', '0'), +('11', '4', '20', '2742', '5076', '0'), +('11', '4', '20', '1217', '1375', '0'), +('11', '4', '20', '1647', '1334', '0'), +('11', '4', '12', '2923', '3074', '0'), +('11', '4', '12', '20655', '2700', '0'), +('11', '4', '12', '1404', '2512', '0'), +('11', '4', '12', '1236', '1917', '0'), +('11', '4', '18', '4410', '1142', '0'), +('11', '4', '18', '1651', '1080', '0'), +('11', '4', '18', '1221', '454', '0'), +('11', '4', '18', '1237', '436', '0'), +('11', '4', '19', '68239', '2068', '0'), +('11', '4', '19', '1368', '2016', '0'), +('11', '4', '19', '1652', '1834', '0'), +('11', '4', '19', '3317', '1680', '0'), +('11', '4', '13', '14759', '5476', '0'), +('11', '4', '13', '10527', '4500', '0'), +('11', '4', '13', '11689', '4489', '0'), +('11', '4', '13', '11625', '3521', '0'), +('11', '4', '14', '10219', '5681', '0'), +('11', '4', '14', '14759', '5476', '0'), +('11', '4', '14', '10527', '4500', '0'), +('11', '4', '14', '11625', '3521', '0'), +('11', '4', '11', '14762', '2204', '0'), +('11', '4', '11', '13169', '1645', '0'), +('11', '4', '11', '13353', '1500', '0'), +('11', '4', '11', '9246', '495', '0'), +('11', '5', '22', '10323', '0', '0'), +('11', '5', '22', '9246', '0', '0'), +('11', '5', '22', '21509', '0', '0'), +('11', '5', '22', '8007', '0', '0'), +('11', '5', '1', '14702', '3750', '0'), +('11', '5', '1', '14701', '2862', '0'), +('11', '5', '1', '30361', '2640', '0'), +('11', '5', '1', '10321', '1000', '0'), +('11', '5', '2', '10143', '5368', '0'), +('11', '5', '2', '30363', '3700', '0'), +('11', '5', '2', '1232', '2913', '0'), +('11', '5', '2', '1211', '1823', '0'), +('11', '5', '3', '1544', '5953', '0'), +('11', '5', '3', '1212', '1379', '0'), +('11', '5', '3', '14705', '990', '0'), +('11', '5', '3', '14706', '990', '0'), +('11', '5', '5', '14703', '6050', '0'), +('11', '5', '5', '14700', '3318', '0'), +('11', '5', '5', '14560', '3290', '0'), +('11', '5', '5', '30362', '3140', '0'), +('11', '5', '8', '11603', '8854', '0'), +('11', '5', '8', '1278', '5352', '0'), +('11', '5', '8', '2349', '3554', '0'), +('11', '5', '8', '1216', '1392', '0'), +('11', '5', '6', '1279', '7128', '0'), +('11', '5', '6', '1557', '5310', '0'), +('11', '5', '6', '1905', '5036', '0'), +('11', '5', '6', '1401', '2174', '0'), +('11', '5', '17', '1253', '10060', '0'), +('11', '5', '17', '1644', '8668', '0'), +('11', '5', '17', '11641', '6488', '0'), +('11', '5', '17', '1357', '5468', '0'), +('11', '5', '7', '1362', '2624', '0'), +('11', '5', '7', '1321', '1746', '0'), +('11', '5', '7', '1648', '1126', '0'), +('11', '5', '7', '1234', '903', '0'), +('11', '5', '9', '12804', '6753', '0'), +('11', '5', '9', '27712', '2838', '0'), +('11', '5', '9', '4344', '2051', '0'), +('11', '5', '9', '10408', '2002', '0'), +('11', '5', '15', '27713', '5314', '0'), +('11', '5', '15', '20659', '3281', '0'), +('11', '5', '15', '10150', '3004', '0'), +('11', '5', '15', '10163', '2300', '0'), +('11', '5', '20', '11666', '8295', '0'), +('11', '5', '20', '2742', '5079', '0'), +('11', '5', '20', '1217', '1387', '0'), +('11', '5', '20', '1647', '1334', '0'), +('11', '5', '12', '2923', '3074', '0'), +('11', '5', '12', '20655', '2725', '0'), +('11', '5', '12', '1404', '2512', '0'), +('11', '5', '12', '1236', '2013', '0'), +('11', '5', '18', '4410', '1142', '0'), +('11', '5', '18', '1651', '1116', '0'), +('11', '5', '18', '1221', '454', '0'), +('11', '5', '18', '1237', '436', '0'), +('11', '5', '19', '68239', '2105', '0'), +('11', '5', '19', '1368', '2016', '0'), +('11', '5', '19', '1652', '1834', '0'), +('11', '5', '19', '3317', '1680', '0'), +('11', '5', '13', '14759', '5547', '0'), +('11', '5', '13', '11689', '4579', '0'), +('11', '5', '13', '10527', '4500', '0'), +('11', '5', '13', '11625', '3523', '0'), +('11', '5', '14', '10219', '5681', '0'), +('11', '5', '14', '14759', '5547', '0'), +('11', '5', '14', '10527', '4500', '0'), +('11', '5', '14', '11625', '3523', '0'), +('11', '5', '11', '14762', '2204', '0'), +('11', '5', '11', '13169', '1681', '0'), +('11', '5', '11', '13353', '1500', '0'), +('11', '5', '11', '9246', '616', '0'), +('11', '6', '22', '10323', '0', '0'), +('11', '6', '22', '9246', '0', '0'), +('11', '6', '22', '21509', '0', '0'), +('11', '6', '22', '8007', '0', '0'), +('11', '6', '1', '14702', '3750', '0'), +('11', '6', '1', '14701', '2862', '0'), +('11', '6', '1', '30361', '2640', '0'), +('11', '6', '1', '10321', '1000', '0'), +('11', '6', '2', '10143', '5368', '0'), +('11', '6', '2', '30363', '3700', '0'), +('11', '6', '2', '1232', '3010', '0'), +('11', '6', '2', '1211', '1908', '0'), +('11', '6', '3', '1544', '6014', '0'), +('11', '6', '3', '1212', '1391', '0'), +('11', '6', '3', '11052', '1087', '0'), +('11', '6', '3', '14706', '990', '0'), +('11', '6', '5', '14703', '6050', '0'), +('11', '6', '5', '14560', '3411', '0'), +('11', '6', '5', '14700', '3318', '0'), +('11', '6', '5', '30362', '3140', '0'), +('11', '6', '8', '11603', '8963', '0'), +('11', '6', '8', '1278', '5413', '0'), +('11', '6', '8', '2349', '3554', '0'), +('11', '6', '8', '1216', '1404', '0'), +('11', '6', '6', '1279', '7188', '0'), +('11', '6', '6', '1557', '5310', '0'), +('11', '6', '6', '1905', '5037', '0'), +('11', '6', '6', '1401', '2174', '0'), +('11', '6', '17', '1253', '10063', '0'), +('11', '6', '17', '1644', '8729', '0'), +('11', '6', '17', '11641', '6669', '0'), +('11', '6', '17', '1357', '5468', '0'), +('11', '6', '7', '1362', '2624', '0'), +('11', '6', '7', '1321', '1746', '0'), +('11', '6', '7', '1648', '1187', '0'), +('11', '6', '7', '1234', '988', '0'), +('11', '6', '9', '12804', '6753', '0'), +('11', '6', '9', '27712', '2899', '0'), +('11', '6', '9', '4344', '2051', '0'), +('11', '6', '9', '10408', '2002', '0'), +('11', '6', '15', '27713', '5374', '0'), +('11', '6', '15', '20659', '3317', '0'), +('11', '6', '15', '10150', '3004', '0'), +('11', '6', '15', '10163', '2300', '0'), +('11', '6', '20', '11666', '8297', '0'), +('11', '6', '20', '2742', '5081', '0'), +('11', '6', '20', '1217', '1399', '0'), +('11', '6', '20', '1647', '1334', '0'), +('11', '6', '12', '2923', '3074', '0'), +('11', '6', '12', '20655', '2749', '0'), +('11', '6', '12', '1404', '2512', '0'), +('11', '6', '12', '1236', '2110', '0'), +('11', '6', '18', '1651', '1152', '0'), +('11', '6', '18', '4410', '1142', '0'), +('11', '6', '18', '1221', '454', '0'), +('11', '6', '18', '1237', '436', '0'), +('11', '6', '19', '68239', '2141', '0'), +('11', '6', '19', '1368', '2016', '0'), +('11', '6', '19', '1652', '1834', '0'), +('11', '6', '19', '3317', '1680', '0'), +('11', '6', '13', '14759', '5619', '0'), +('11', '6', '13', '11689', '4670', '0'), +('11', '6', '13', '10527', '4500', '0'), +('11', '6', '13', '11625', '3525', '0'), +('11', '6', '14', '10219', '5681', '0'), +('11', '6', '14', '14759', '5619', '0'), +('11', '6', '14', '10527', '4500', '0'), +('11', '6', '14', '11625', '3525', '0'), +('11', '6', '11', '14762', '2204', '0'), +('11', '6', '11', '13169', '1717', '0'), +('11', '6', '11', '13353', '1500', '0'), +('11', '6', '11', '9246', '737', '0'), +('11', '7', '22', '10323', '0', '0'), +('11', '7', '22', '9246', '0', '0'), +('11', '7', '22', '21509', '0', '0'), +('11', '7', '22', '8007', '0', '0'), +('11', '7', '1', '14702', '3750', '0'), +('11', '7', '1', '14701', '2862', '0'), +('11', '7', '1', '30361', '2640', '0'), +('11', '7', '1', '10321', '1000', '0'), +('11', '7', '2', '10143', '5368', '0'), +('11', '7', '2', '30363', '3700', '0'), +('11', '7', '2', '1232', '3107', '0'), +('11', '7', '2', '1211', '1992', '0'), +('11', '7', '3', '1544', '6074', '0'), +('11', '7', '3', '1212', '1403', '0'), +('11', '7', '3', '11052', '1268', '0'), +('11', '7', '3', '14706', '990', '0'), +('11', '7', '5', '14703', '6050', '0'), +('11', '7', '5', '14560', '3532', '0'), +('11', '7', '5', '14700', '3318', '0'), +('11', '7', '5', '30362', '3140', '0'), +('11', '7', '8', '11603', '9071', '0'), +('11', '7', '8', '1278', '5475', '0'), +('11', '7', '8', '2349', '3554', '0'), +('11', '7', '8', '1216', '1416', '0'), +('11', '7', '6', '1279', '7249', '0'), +('11', '7', '6', '1557', '5310', '0'), +('11', '7', '6', '1905', '5039', '0'), +('11', '7', '6', '1401', '2174', '0'), +('11', '7', '17', '1253', '10065', '0'), +('11', '7', '17', '1644', '8789', '0'), +('11', '7', '17', '11641', '6850', '0'), +('11', '7', '17', '1357', '5468', '0'), +('11', '7', '7', '1362', '2624', '0'), +('11', '7', '7', '1321', '1746', '0'), +('11', '7', '7', '1648', '1247', '0'), +('11', '7', '7', '1234', '1072', '0'), +('11', '7', '9', '12804', '6753', '0'), +('11', '7', '9', '27712', '2959', '0'), +('11', '7', '9', '4344', '2051', '0'), +('11', '7', '9', '10408', '2002', '0'), +('11', '7', '15', '27713', '5435', '0'), +('11', '7', '15', '20659', '3354', '0'), +('11', '7', '15', '10150', '3004', '0'), +('11', '7', '15', '10163', '2300', '0'), +('11', '7', '20', '11666', '8299', '0'), +('11', '7', '20', '2742', '5083', '0'), +('11', '7', '20', '1217', '1411', '0'), +('11', '7', '20', '1647', '1334', '0'), +('11', '7', '12', '2923', '3074', '0'), +('11', '7', '12', '20655', '2774', '0'), +('11', '7', '12', '1404', '2512', '0'), +('11', '7', '12', '1236', '2207', '0'), +('11', '7', '18', '1651', '1189', '0'), +('11', '7', '18', '4410', '1142', '0'), +('11', '7', '18', '1221', '454', '0'), +('11', '7', '18', '1237', '436', '0'), +('11', '7', '19', '68239', '2177', '0'), +('11', '7', '19', '1368', '2016', '0'), +('11', '7', '19', '1652', '1834', '0'), +('11', '7', '19', '3317', '1680', '0'), +('11', '7', '13', '14759', '5690', '0'), +('11', '7', '13', '11689', '4761', '0'), +('11', '7', '13', '10527', '4500', '0'), +('11', '7', '13', '11625', '3527', '0'), +('11', '7', '14', '14759', '5690', '0'), +('11', '7', '14', '10219', '5681', '0'), +('11', '7', '14', '10527', '4500', '0'), +('11', '7', '14', '11625', '3527', '0'), +('11', '7', '11', '14762', '2204', '0'), +('11', '7', '11', '13169', '1754', '0'), +('11', '7', '11', '13353', '1500', '0'), +('11', '7', '11', '9246', '858', '0'), +('11', '8', '22', '10323', '0', '0'), +('11', '8', '22', '9246', '0', '0'), +('11', '8', '22', '21509', '0', '0'), +('11', '8', '22', '8007', '0', '0'), +('11', '8', '1', '14702', '3750', '0'), +('11', '8', '1', '14701', '2862', '0'), +('11', '8', '1', '30361', '2640', '0'), +('11', '8', '1', '10321', '1000', '0'), +('11', '8', '2', '10143', '5368', '0'), +('11', '8', '2', '30363', '3700', '0'), +('11', '8', '2', '1232', '3203', '0'), +('11', '8', '2', '1211', '2077', '0'), +('11', '8', '3', '1544', '6135', '0'), +('11', '8', '3', '11052', '1450', '0'), +('11', '8', '3', '1212', '1415', '0'), +('11', '8', '3', '14706', '990', '0'), +('11', '8', '5', '14703', '6050', '0'), +('11', '8', '5', '14560', '3653', '0'), +('11', '8', '5', '14700', '3318', '0'), +('11', '8', '5', '30362', '3140', '0'), +('11', '8', '8', '11603', '9180', '0'), +('11', '8', '8', '1278', '5537', '0'), +('11', '8', '8', '2349', '3554', '0'), +('11', '8', '8', '1216', '1428', '0'), +('11', '8', '6', '1279', '7309', '0'), +('11', '8', '6', '1557', '5310', '0'), +('11', '8', '6', '1905', '5040', '0'), +('11', '8', '6', '1401', '2174', '0'), +('11', '8', '17', '1253', '10068', '0'), +('11', '8', '17', '1644', '8850', '0'), +('11', '8', '17', '11641', '7031', '0'), +('11', '8', '17', '1357', '5468', '0'), +('11', '8', '7', '1362', '2624', '0'), +('11', '8', '7', '1321', '1746', '0'), +('11', '8', '7', '1648', '1307', '0'), +('11', '8', '7', '1234', '1157', '0'), +('11', '8', '9', '12804', '6753', '0'), +('11', '8', '9', '27712', '3019', '0'), +('11', '8', '9', '4344', '2051', '0'), +('11', '8', '9', '10408', '2002', '0'), +('11', '8', '15', '27713', '5495', '0'), +('11', '8', '15', '20659', '3390', '0'), +('11', '8', '15', '10150', '3004', '0'), +('11', '8', '15', '10163', '2300', '0'), +('11', '8', '20', '11666', '8300', '0'), +('11', '8', '20', '2742', '5086', '0'), +('11', '8', '20', '1217', '1423', '0'), +('11', '8', '20', '1647', '1334', '0'), +('11', '8', '12', '2923', '3074', '0'), +('11', '8', '12', '20655', '2799', '0'), +('11', '8', '12', '1404', '2512', '0'), +('11', '8', '12', '1236', '2303', '0'), +('11', '8', '18', '1651', '1225', '0'), +('11', '8', '18', '4410', '1142', '0'), +('11', '8', '18', '1221', '454', '0'), +('11', '8', '18', '1237', '436', '0'), +('11', '8', '19', '68239', '2213', '0'), +('11', '8', '19', '1368', '2016', '0'), +('11', '8', '19', '1652', '1834', '0'), +('11', '8', '19', '3317', '1680', '0'), +('11', '8', '13', '14759', '5761', '0'), +('11', '8', '13', '11689', '4851', '0'), +('11', '8', '13', '10527', '4500', '0'), +('11', '8', '13', '11625', '3529', '0'), +('11', '8', '14', '14759', '5761', '0'), +('11', '8', '14', '10219', '5681', '0'), +('11', '8', '14', '10527', '4500', '0'), +('11', '8', '14', '11625', '3529', '0'), +('11', '8', '11', '14762', '2204', '0'), +('11', '8', '11', '13169', '1790', '0'), +('11', '8', '11', '13353', '1500', '0'), +('11', '8', '11', '9246', '978', '0'), +('11', '9', '22', '10323', '0', '0'), +('11', '9', '22', '9246', '0', '0'), +('11', '9', '22', '21509', '0', '0'), +('11', '9', '22', '8007', '0', '0'), +('11', '9', '1', '14702', '3750', '0'), +('11', '9', '1', '14701', '2862', '0'), +('11', '9', '1', '30361', '2640', '0'), +('11', '9', '1', '10321', '1000', '0'), +('11', '9', '2', '10143', '5368', '0'), +('11', '9', '2', '30363', '3700', '0'), +('11', '9', '2', '1232', '3300', '0'), +('11', '9', '2', '1211', '2161', '0'), +('11', '9', '3', '1544', '6195', '0'), +('11', '9', '3', '11052', '1631', '0'), +('11', '9', '3', '1212', '1427', '0'), +('11', '9', '3', '14706', '990', '0'), +('11', '9', '5', '14703', '6050', '0'), +('11', '9', '5', '14560', '3773', '0'), +('11', '9', '5', '14700', '3318', '0'), +('11', '9', '5', '30362', '3140', '0'), +('11', '9', '8', '11603', '9289', '0'), +('11', '9', '8', '1278', '5599', '0'), +('11', '9', '8', '2349', '3554', '0'), +('11', '9', '8', '1216', '1440', '0'), +('11', '9', '6', '1279', '7370', '0'), +('11', '9', '6', '1557', '5310', '0'), +('11', '9', '6', '1905', '5041', '0'), +('11', '9', '6', '1401', '2174', '0'), +('11', '9', '17', '1253', '10070', '0'), +('11', '9', '17', '1644', '8910', '0'), +('11', '9', '17', '11641', '7212', '0'), +('11', '9', '17', '1233', '5508', '0'), +('11', '9', '7', '1362', '2624', '0'), +('11', '9', '7', '1321', '1746', '0'), +('11', '9', '7', '1648', '1368', '0'), +('11', '9', '7', '1234', '1241', '0'), +('11', '9', '9', '12804', '6753', '0'), +('11', '9', '9', '27712', '3080', '0'), +('11', '9', '9', '4344', '2051', '0'), +('11', '9', '9', '10408', '2002', '0'), +('11', '9', '15', '27713', '5556', '0'), +('11', '9', '15', '20659', '3426', '0'), +('11', '9', '15', '10150', '3004', '0'), +('11', '9', '15', '10163', '2300', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '9', '20', '11666', '8302', '0'), +('11', '9', '20', '2742', '5088', '0'), +('11', '9', '20', '1217', '1435', '0'), +('11', '9', '20', '1647', '1334', '0'), +('11', '9', '12', '2923', '3074', '0'), +('11', '9', '12', '20655', '2823', '0'), +('11', '9', '12', '1404', '2512', '0'), +('11', '9', '12', '1236', '2400', '0'), +('11', '9', '18', '1651', '1261', '0'), +('11', '9', '18', '4410', '1142', '0'), +('11', '9', '18', '1221', '454', '0'), +('11', '9', '18', '1237', '436', '0'), +('11', '9', '19', '68239', '2250', '0'), +('11', '9', '19', '1368', '2016', '0'), +('11', '9', '19', '1652', '1834', '0'), +('11', '9', '19', '3317', '1680', '0'), +('11', '9', '13', '14759', '5832', '0'), +('11', '9', '13', '11689', '4942', '0'), +('11', '9', '13', '10527', '4500', '0'), +('11', '9', '13', '11625', '3532', '0'), +('11', '9', '14', '14759', '5832', '0'), +('11', '9', '14', '10219', '5681', '0'), +('11', '9', '14', '10527', '4500', '0'), +('11', '9', '14', '11625', '3532', '0'), +('11', '9', '11', '14762', '2204', '0'), +('11', '9', '11', '13169', '1826', '0'), +('11', '9', '11', '13353', '1500', '0'), +('11', '9', '11', '9246', '1099', '0'), +('11', '10', '22', '10323', '0', '0'), +('11', '10', '22', '9246', '0', '0'), +('11', '10', '22', '21509', '0', '0'), +('11', '10', '22', '8007', '0', '0'), +('11', '10', '1', '14702', '3750', '0'), +('11', '10', '1', '14701', '2862', '0'), +('11', '10', '1', '30361', '2640', '0'), +('11', '10', '1', '10321', '1000', '0'), +('11', '10', '2', '10143', '5368', '0'), +('11', '10', '2', '30363', '3700', '0'), +('11', '10', '2', '1232', '3397', '0'), +('11', '10', '2', '1211', '2246', '0'), +('11', '10', '3', '1544', '6255', '0'), +('11', '10', '3', '11052', '1812', '0'), +('11', '10', '3', '1212', '1439', '0'), +('11', '10', '3', '14706', '990', '0'), +('11', '10', '5', '14703', '6050', '0'), +('11', '10', '5', '14560', '3894', '0'), +('11', '10', '5', '14700', '3318', '0'), +('11', '10', '5', '30362', '3140', '0'), +('11', '10', '8', '11603', '9398', '0'), +('11', '10', '8', '1278', '5661', '0'), +('11', '10', '8', '2349', '3554', '0'), +('11', '10', '8', '1216', '1452', '0'), +('11', '10', '6', '1279', '7430', '0'), +('11', '10', '6', '1557', '5310', '0'), +('11', '10', '6', '1905', '5042', '0'), +('11', '10', '6', '1401', '2174', '0'), +('11', '10', '17', '1253', '10072', '0'), +('11', '10', '17', '1644', '8970', '0'), +('11', '10', '17', '11641', '7394', '0'), +('11', '10', '17', '1233', '5667', '0'), +('11', '10', '7', '1362', '2624', '0'), +('11', '10', '7', '1321', '1746', '0'), +('11', '10', '7', '1648', '1428', '0'), +('11', '10', '7', '1234', '1326', '0'), +('11', '10', '9', '12804', '6753', '0'), +('11', '10', '9', '27712', '3140', '0'), +('11', '10', '9', '4344', '2051', '0'), +('11', '10', '9', '10408', '2002', '0'), +('11', '10', '15', '27713', '5616', '0'), +('11', '10', '15', '20659', '3462', '0'), +('11', '10', '15', '10150', '3004', '0'), +('11', '10', '15', '10163', '2300', '0'), +('11', '10', '20', '11666', '8304', '0'), +('11', '10', '20', '2742', '5091', '0'), +('11', '10', '20', '1217', '1447', '0'), +('11', '10', '20', '1647', '1334', '0'), +('11', '10', '12', '2923', '3074', '0'), +('11', '10', '12', '20655', '2848', '0'), +('11', '10', '12', '1404', '2512', '0'), +('11', '10', '12', '1236', '2497', '0'), +('11', '10', '18', '1651', '1297', '0'), +('11', '10', '18', '4410', '1142', '0'), +('11', '10', '18', '1221', '454', '0'), +('11', '10', '18', '1237', '436', '0'), +('11', '10', '19', '68239', '2286', '0'), +('11', '10', '19', '1368', '2016', '0'), +('11', '10', '19', '1652', '1834', '0'), +('11', '10', '19', '3317', '1680', '0'), +('11', '10', '13', '14759', '5904', '0'), +('11', '10', '13', '11689', '5032', '0'), +('11', '10', '13', '10527', '4500', '0'), +('11', '10', '13', '11625', '3534', '0'), +('11', '10', '14', '14759', '5904', '0'), +('11', '10', '14', '10219', '5681', '0'), +('11', '10', '14', '10527', '4500', '0'), +('11', '10', '14', '11625', '3534', '0'), +('11', '10', '11', '14762', '2204', '0'), +('11', '10', '11', '13169', '1862', '0'), +('11', '10', '11', '13353', '1500', '0'), +('11', '10', '11', '9246', '1220', '0'), +('11', '11', '22', '10323', '0', '0'), +('11', '11', '22', '9246', '0', '0'), +('11', '11', '22', '21509', '0', '0'), +('11', '11', '22', '8007', '0', '0'), +('11', '11', '1', '14702', '3750', '0'), +('11', '11', '1', '14701', '2862', '0'), +('11', '11', '1', '30361', '2640', '0'), +('11', '11', '1', '10321', '1000', '0'), +('11', '11', '2', '10143', '5368', '0'), +('11', '11', '2', '30363', '3700', '0'), +('11', '11', '2', '1232', '3493', '0'), +('11', '11', '2', '1211', '2330', '0'), +('11', '11', '3', '1544', '6316', '0'), +('11', '11', '3', '11052', '1993', '0'), +('11', '11', '3', '1212', '1451', '0'), +('11', '11', '3', '14706', '990', '0'), +('11', '11', '5', '14703', '6050', '0'), +('11', '11', '5', '14560', '4015', '0'), +('11', '11', '5', '14700', '3318', '0'), +('11', '11', '5', '30362', '3140', '0'), +('11', '11', '8', '11603', '9506', '0'), +('11', '11', '8', '1278', '5723', '0'), +('11', '11', '8', '2349', '3554', '0'), +('11', '11', '8', '1216', '1464', '0'), +('11', '11', '6', '1279', '7490', '0'), +('11', '11', '6', '1557', '5310', '0'), +('11', '11', '6', '1905', '5043', '0'), +('11', '11', '6', '1401', '2174', '0'), +('11', '11', '17', '1253', '10075', '0'), +('11', '11', '17', '1644', '9031', '0'), +('11', '11', '17', '11641', '7575', '0'), +('11', '11', '17', '1233', '5826', '0'), +('11', '11', '7', '1362', '2624', '0'), +('11', '11', '7', '1321', '1746', '0'), +('11', '11', '7', '1648', '1489', '0'), +('11', '11', '7', '1234', '1410', '0'), +('11', '11', '9', '12804', '6753', '0'), +('11', '11', '9', '27712', '3201', '0'), +('11', '11', '9', '4344', '2051', '0'), +('11', '11', '9', '10408', '2002', '0'), +('11', '11', '15', '27713', '5676', '0'), +('11', '11', '15', '20659', '3499', '0'), +('11', '11', '15', '10150', '3004', '0'), +('11', '11', '15', '10163', '2300', '0'), +('11', '11', '20', '11666', '8305', '0'), +('11', '11', '20', '2742', '5093', '0'), +('11', '11', '20', '1217', '1459', '0'), +('11', '11', '20', '1647', '1334', '0'), +('11', '11', '12', '2923', '3074', '0'), +('11', '11', '12', '20655', '2873', '0'), +('11', '11', '12', '1236', '2593', '0'), +('11', '11', '12', '1404', '2512', '0'), +('11', '11', '18', '1651', '1334', '0'), +('11', '11', '18', '4410', '1142', '0'), +('11', '11', '18', '1221', '454', '0'), +('11', '11', '18', '1237', '436', '0'), +('11', '11', '19', '68239', '2322', '0'), +('11', '11', '19', '1368', '2016', '0'), +('11', '11', '19', '1652', '1834', '0'), +('11', '11', '19', '3317', '1680', '0'), +('11', '11', '13', '14759', '5975', '0'), +('11', '11', '13', '11689', '5123', '0'), +('11', '11', '13', '10527', '4500', '0'), +('11', '11', '13', '11625', '3536', '0'), +('11', '11', '14', '14759', '5975', '0'), +('11', '11', '14', '10219', '5681', '0'), +('11', '11', '14', '10527', '4500', '0'), +('11', '11', '14', '11625', '3536', '0'), +('11', '11', '11', '14762', '2204', '0'), +('11', '11', '11', '13169', '1899', '0'), +('11', '11', '11', '13353', '1500', '0'), +('11', '11', '11', '9246', '1341', '0'), +('11', '12', '22', '10323', '0', '0'), +('11', '12', '22', '9246', '0', '0'), +('11', '12', '22', '21509', '0', '0'), +('11', '12', '22', '8007', '0', '0'), +('11', '12', '1', '14702', '3750', '0'), +('11', '12', '1', '14701', '2862', '0'), +('11', '12', '1', '30361', '2640', '0'), +('11', '12', '1', '10321', '1000', '0'), +('11', '12', '2', '10143', '5368', '0'), +('11', '12', '2', '30363', '3700', '0'), +('11', '12', '2', '1232', '3590', '0'), +('11', '12', '2', '1211', '2415', '0'), +('11', '12', '3', '1544', '6376', '0'), +('11', '12', '3', '11052', '2174', '0'), +('11', '12', '3', '1212', '1463', '0'), +('11', '12', '3', '4505', '1045', '0'), +('11', '12', '5', '14703', '6050', '0'), +('11', '12', '5', '14560', '4136', '0'), +('11', '12', '5', '14700', '3318', '0'), +('11', '12', '5', '30362', '3140', '0'), +('11', '12', '8', '11603', '9615', '0'), +('11', '12', '8', '1278', '5784', '0'), +('11', '12', '8', '2349', '3554', '0'), +('11', '12', '8', '1216', '1476', '0'), +('11', '12', '6', '1279', '7551', '0'), +('11', '12', '6', '1557', '5310', '0'), +('11', '12', '6', '1905', '5045', '0'), +('11', '12', '6', '1401', '2174', '0'), +('11', '12', '17', '1253', '10077', '0'), +('11', '12', '17', '1644', '9091', '0'), +('11', '12', '17', '11641', '7756', '0'), +('11', '12', '17', '1233', '5986', '0'), +('11', '12', '7', '1362', '2624', '0'), +('11', '12', '7', '1321', '1746', '0'), +('11', '12', '7', '1648', '1549', '0'), +('11', '12', '7', '1234', '1495', '0'), +('11', '12', '9', '12804', '6753', '0'), +('11', '12', '9', '27712', '3261', '0'), +('11', '12', '9', '4344', '2051', '0'), +('11', '12', '9', '10408', '2002', '0'), +('11', '12', '15', '27713', '5737', '0'), +('11', '12', '15', '20659', '3535', '0'), +('11', '12', '15', '10150', '3004', '0'), +('11', '12', '15', '10163', '2300', '0'), +('11', '12', '20', '11666', '8307', '0'), +('11', '12', '20', '2742', '5095', '0'), +('11', '12', '20', '1217', '1472', '0'), +('11', '12', '20', '1647', '1334', '0'), +('11', '12', '12', '2923', '3074', '0'), +('11', '12', '12', '20655', '2897', '0'), +('11', '12', '12', '1236', '2690', '0'), +('11', '12', '12', '1404', '2512', '0'), +('11', '12', '18', '1651', '1370', '0'), +('11', '12', '18', '4410', '1142', '0'), +('11', '12', '18', '1221', '454', '0'), +('11', '12', '18', '1237', '436', '0'), +('11', '12', '19', '68239', '2358', '0'), +('11', '12', '19', '1368', '2016', '0'), +('11', '12', '19', '1652', '1834', '0'), +('11', '12', '19', '3317', '1680', '0'), +('11', '12', '13', '14759', '6046', '0'), +('11', '12', '13', '11689', '5214', '0'), +('11', '12', '13', '10527', '4500', '0'), +('11', '12', '13', '13400', '3580', '0'), +('11', '12', '14', '14759', '6046', '0'), +('11', '12', '14', '10219', '5681', '0'), +('11', '12', '14', '10527', '4500', '0'), +('11', '12', '14', '11625', '3538', '0'), +('11', '12', '11', '14762', '2204', '0'), +('11', '12', '11', '13169', '1935', '0'), +('11', '12', '11', '13353', '1500', '0'), +('11', '12', '11', '9246', '1462', '0'), +('11', '13', '22', '10323', '0', '0'), +('11', '13', '22', '9246', '0', '0'), +('11', '13', '22', '21509', '0', '0'), +('11', '13', '22', '8007', '0', '0'), +('11', '13', '1', '14702', '3750', '0'), +('11', '13', '1', '14701', '2862', '0'), +('11', '13', '1', '30361', '2640', '0'), +('11', '13', '1', '10082', '1038', '0'), +('11', '13', '2', '10143', '5368', '0'), +('11', '13', '2', '30363', '3700', '0'), +('11', '13', '2', '1232', '3687', '0'), +('11', '13', '2', '1211', '2499', '0'), +('11', '13', '3', '1544', '6437', '0'), +('11', '13', '3', '11052', '2356', '0'), +('11', '13', '3', '1212', '1475', '0'), +('11', '13', '3', '4505', '1129', '0'), +('11', '13', '5', '14703', '6050', '0'), +('11', '13', '5', '14560', '4257', '0'), +('11', '13', '5', '14700', '3318', '0'), +('11', '13', '5', '30362', '3140', '0'), +('11', '13', '8', '11603', '9724', '0'), +('11', '13', '8', '1278', '5846', '0'), +('11', '13', '8', '2349', '3554', '0'), +('11', '13', '8', '1216', '1488', '0'), +('11', '13', '6', '1279', '7611', '0'), +('11', '13', '6', '1557', '5310', '0'), +('11', '13', '6', '1905', '5046', '0'), +('11', '13', '6', '1401', '2174', '0'), +('11', '13', '17', '1253', '10080', '0'), +('11', '13', '17', '1644', '9152', '0'), +('11', '13', '17', '11641', '7937', '0'), +('11', '13', '17', '1233', '6145', '0'), +('11', '13', '7', '1362', '2624', '0'), +('11', '13', '7', '1321', '1746', '0'), +('11', '13', '7', '1648', '1609', '0'), +('11', '13', '7', '1234', '1579', '0'), +('11', '13', '9', '12804', '6753', '0'), +('11', '13', '9', '27712', '3321', '0'), +('11', '13', '9', '4344', '2051', '0'), +('11', '13', '9', '10408', '2002', '0'), +('11', '13', '15', '27713', '5797', '0'), +('11', '13', '15', '20659', '3571', '0'), +('11', '13', '15', '10150', '3004', '0'), +('11', '13', '15', '10163', '2300', '0'), +('11', '13', '20', '11666', '8309', '0'), +('11', '13', '20', '2742', '5098', '0'), +('11', '13', '20', '1217', '1484', '0'), +('11', '13', '20', '1647', '1334', '0'), +('11', '13', '12', '2923', '3074', '0'), +('11', '13', '12', '20655', '2922', '0'), +('11', '13', '12', '1236', '2787', '0'), +('11', '13', '12', '1404', '2512', '0'), +('11', '13', '18', '1651', '1406', '0'), +('11', '13', '18', '4410', '1142', '0'), +('11', '13', '18', '1221', '454', '0'), +('11', '13', '18', '1237', '436', '0'), +('11', '13', '19', '68239', '2395', '0'), +('11', '13', '19', '1368', '2016', '0'), +('11', '13', '19', '1652', '1834', '0'), +('11', '13', '19', '3317', '1680', '0'), +('11', '13', '13', '14759', '6117', '0'), +('11', '13', '13', '11689', '5304', '0'), +('11', '13', '13', '10527', '4500', '0'), +('11', '13', '13', '13400', '3628', '0'), +('11', '13', '14', '14759', '6117', '0'), +('11', '13', '14', '10219', '5681', '0'), +('11', '13', '14', '10527', '4500', '0'), +('11', '13', '14', '11625', '3540', '0'), +('11', '13', '11', '14762', '2204', '0'), +('11', '13', '11', '13169', '1971', '0'), +('11', '13', '11', '9246', '1582', '0'), +('11', '13', '11', '13353', '1500', '0'), +('11', '14', '22', '10323', '0', '0'), +('11', '14', '22', '9246', '0', '0'), +('11', '14', '22', '21509', '0', '0'), +('11', '14', '22', '8007', '0', '0'), +('11', '14', '1', '14702', '3750', '0'), +('11', '14', '1', '14701', '2862', '0'), +('11', '14', '1', '30361', '2640', '0'), +('11', '14', '1', '10082', '1111', '0'), +('11', '14', '2', '10143', '5368', '0'), +('11', '14', '2', '1232', '3783', '0'), +('11', '14', '2', '30363', '3700', '0'), +('11', '14', '2', '1211', '2584', '0'), +('11', '14', '3', '1544', '6497', '0'), +('11', '14', '3', '11052', '2537', '0'), +('11', '14', '3', '1212', '1487', '0'), +('11', '14', '3', '4505', '1214', '0'), +('11', '14', '5', '14703', '6050', '0'), +('11', '14', '5', '14560', '4377', '0'), +('11', '14', '5', '14700', '3318', '0'), +('11', '14', '5', '30362', '3140', '0'), +('11', '14', '8', '11603', '9832', '0'), +('11', '14', '8', '1278', '5908', '0'), +('11', '14', '8', '2349', '3554', '0'), +('11', '14', '8', '1216', '1501', '0'), +('11', '14', '6', '1279', '7672', '0'), +('11', '14', '6', '1557', '5310', '0'), +('11', '14', '6', '1905', '5047', '0'), +('11', '14', '6', '1401', '2174', '0'), +('11', '14', '17', '1253', '10082', '0'), +('11', '14', '17', '1644', '9212', '0'), +('11', '14', '17', '11641', '8118', '0'), +('11', '14', '17', '1233', '6305', '0'), +('11', '14', '7', '1362', '2624', '0'), +('11', '14', '7', '1321', '1746', '0'), +('11', '14', '7', '1648', '1670', '0'), +('11', '14', '7', '1234', '1664', '0'), +('11', '14', '9', '12804', '6753', '0'), +('11', '14', '9', '27712', '3382', '0'), +('11', '14', '9', '4344', '2051', '0'), +('11', '14', '9', '1649', '2025', '0'), +('11', '14', '15', '27713', '5858', '0'), +('11', '14', '15', '20659', '3607', '0'), +('11', '14', '15', '10150', '3004', '0'), +('11', '14', '15', '10163', '2300', '0'), +('11', '14', '20', '11666', '8311', '0'), +('11', '14', '20', '2742', '5100', '0'), +('11', '14', '20', '1217', '1496', '0'), +('11', '14', '20', '1647', '1334', '0'), +('11', '14', '12', '2923', '3074', '0'), +('11', '14', '12', '20655', '2946', '0'), +('11', '14', '12', '1236', '2883', '0'), +('11', '14', '12', '1404', '2512', '0'), +('11', '14', '18', '1651', '1442', '0'), +('11', '14', '18', '4410', '1142', '0'), +('11', '14', '18', '1221', '454', '0'), +('11', '14', '18', '1237', '436', '0'), +('11', '14', '19', '68239', '2431', '0'), +('11', '14', '19', '1368', '2016', '0'), +('11', '14', '19', '1652', '1834', '0'), +('11', '14', '19', '3317', '1680', '0'), +('11', '14', '13', '14759', '6189', '0'), +('11', '14', '13', '11689', '5395', '0'), +('11', '14', '13', '10527', '4500', '0'), +('11', '14', '13', '13400', '3676', '0'), +('11', '14', '14', '14759', '6189', '0'), +('11', '14', '14', '10219', '5681', '0'), +('11', '14', '14', '10527', '4500', '0'), +('11', '14', '14', '11625', '3542', '0'), +('11', '14', '11', '14762', '2204', '0'), +('11', '14', '11', '13169', '2007', '0'), +('11', '14', '11', '9246', '1703', '0'), +('11', '14', '11', '13353', '1500', '0'), +('11', '15', '22', '10323', '0', '0'), +('11', '15', '22', '9246', '0', '0'), +('11', '15', '22', '21509', '0', '0'), +('11', '15', '22', '8007', '0', '0'), +('11', '15', '1', '14702', '3750', '0'), +('11', '15', '1', '14701', '2862', '0'), +('11', '15', '1', '30361', '2640', '0'), +('11', '15', '1', '10082', '1183', '0'), +('11', '15', '2', '10143', '5368', '0'), +('11', '15', '2', '1232', '3880', '0'), +('11', '15', '2', '30363', '3700', '0'), +('11', '15', '2', '1211', '2669', '0'), +('11', '15', '3', '1544', '6557', '0'), +('11', '15', '3', '11052', '2718', '0'), +('11', '15', '3', '1212', '1499', '0'), +('11', '15', '3', '4505', '1299', '0'), +('11', '15', '5', '14703', '6050', '0'), +('11', '15', '5', '14560', '4498', '0'), +('11', '15', '5', '14700', '3318', '0'), +('11', '15', '5', '30362', '3140', '0'), +('11', '15', '8', '11603', '9941', '0'), +('11', '15', '8', '1278', '5970', '0'), +('11', '15', '8', '2349', '3554', '0'), +('11', '15', '8', '1216', '1513', '0'), +('11', '15', '6', '1279', '7732', '0'), +('11', '15', '6', '1557', '5310', '0'), +('11', '15', '6', '1905', '5048', '0'), +('11', '15', '6', '1401', '2174', '0'), +('11', '15', '17', '1253', '10085', '0'), +('11', '15', '17', '1644', '9272', '0'), +('11', '15', '17', '11641', '8300', '0'), +('11', '15', '17', '1233', '6464', '0'), +('11', '15', '7', '1362', '2624', '0'), +('11', '15', '7', '1234', '1749', '0'), +('11', '15', '7', '1321', '1746', '0'), +('11', '15', '7', '1648', '1730', '0'), +('11', '15', '9', '12804', '6753', '0'), +('11', '15', '9', '27712', '3442', '0'), +('11', '15', '9', '1649', '2062', '0'), +('11', '15', '9', '4344', '2051', '0'), +('11', '15', '15', '27713', '5918', '0'), +('11', '15', '15', '20659', '3644', '0'), +('11', '15', '15', '10150', '3004', '0'), +('11', '15', '15', '10163', '2300', '0'), +('11', '15', '20', '11666', '8312', '0'), +('11', '15', '20', '2742', '5103', '0'), +('11', '15', '20', '1217', '1508', '0'), +('11', '15', '20', '1647', '1334', '0'), +('11', '15', '12', '2923', '3074', '0'), +('11', '15', '12', '1236', '2980', '0'), +('11', '15', '12', '20655', '2971', '0'), +('11', '15', '12', '1404', '2512', '0'), +('11', '15', '18', '1651', '1479', '0'), +('11', '15', '18', '4410', '1142', '0'), +('11', '15', '18', '1221', '454', '0'), +('11', '15', '18', '1237', '436', '0'), +('11', '15', '19', '68239', '2467', '0'), +('11', '15', '19', '1368', '2016', '0'), +('11', '15', '19', '1652', '1834', '0'), +('11', '15', '19', '4407', '1691', '0'), +('11', '15', '13', '14759', '6260', '0'), +('11', '15', '13', '11689', '5485', '0'), +('11', '15', '13', '10527', '4500', '0'), +('11', '15', '13', '13400', '3725', '0'), +('11', '15', '14', '14759', '6260', '0'), +('11', '15', '14', '10219', '5681', '0'), +('11', '15', '14', '10527', '4500', '0'), +('11', '15', '14', '11625', '3545', '0'), +('11', '15', '11', '14762', '2204', '0'), +('11', '15', '11', '13169', '2044', '0'), +('11', '15', '11', '9246', '1824', '0'), +('11', '15', '11', '13353', '1500', '0'), +('11', '16', '22', '10323', '0', '0'), +('11', '16', '22', '9246', '0', '0'), +('11', '16', '22', '21509', '0', '0'), +('11', '16', '22', '8007', '0', '0'), +('11', '16', '1', '14702', '3750', '0'), +('11', '16', '1', '14701', '2862', '0'), +('11', '16', '1', '30361', '2640', '0'), +('11', '16', '1', '10082', '1256', '0'), +('11', '16', '2', '10143', '5368', '0'), +('11', '16', '2', '1232', '3976', '0'), +('11', '16', '2', '30363', '3700', '0'), +('11', '16', '2', '1211', '2753', '0'), +('11', '16', '3', '1544', '6618', '0'), +('11', '16', '3', '11052', '2899', '0'), +('11', '16', '3', '1212', '1511', '0'), +('11', '16', '3', '4505', '1383', '0'), +('11', '16', '5', '14703', '6050', '0'), +('11', '16', '5', '14560', '4619', '0'), +('11', '16', '5', '14700', '3318', '0'), +('11', '16', '5', '30362', '3140', '0'), +('11', '16', '8', '11603', '10050', '0'), +('11', '16', '8', '1278', '6032', '0'), +('11', '16', '8', '2349', '3554', '0'), +('11', '16', '8', '1216', '1525', '0'), +('11', '16', '6', '1279', '7792', '0'), +('11', '16', '6', '1557', '5310', '0'), +('11', '16', '6', '1905', '5050', '0'), +('11', '16', '6', '1401', '2174', '0'), +('11', '16', '17', '1253', '10087', '0'), +('11', '16', '17', '1644', '9333', '0'), +('11', '16', '17', '11641', '8481', '0'), +('11', '16', '17', '1233', '6624', '0'), +('11', '16', '7', '1362', '2624', '0'), +('11', '16', '7', '1234', '1833', '0'), +('11', '16', '7', '1218', '1797', '0'), +('11', '16', '7', '1648', '1791', '0'), +('11', '16', '9', '12804', '6753', '0'), +('11', '16', '9', '27712', '3503', '0'), +('11', '16', '9', '1649', '2098', '0'), +('11', '16', '9', '4344', '2051', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '16', '15', '27713', '5978', '0'), +('11', '16', '15', '20659', '3680', '0'), +('11', '16', '15', '10150', '3004', '0'), +('11', '16', '15', '10163', '2300', '0'), +('11', '16', '20', '11666', '8314', '0'), +('11', '16', '20', '2742', '5105', '0'), +('11', '16', '20', '1217', '1520', '0'), +('11', '16', '20', '1647', '1334', '0'), +('11', '16', '12', '1236', '3076', '0'), +('11', '16', '12', '2923', '3074', '0'), +('11', '16', '12', '20655', '2996', '0'), +('11', '16', '12', '1404', '2512', '0'), +('11', '16', '18', '1651', '1515', '0'), +('11', '16', '18', '4410', '1142', '0'), +('11', '16', '18', '1221', '454', '0'), +('11', '16', '18', '1237', '436', '0'), +('11', '16', '19', '68239', '2503', '0'), +('11', '16', '19', '1368', '2016', '0'), +('11', '16', '19', '1652', '1834', '0'), +('11', '16', '19', '4407', '1800', '0'), +('11', '16', '13', '14759', '6331', '0'), +('11', '16', '13', '11689', '5576', '0'), +('11', '16', '13', '10527', '4500', '0'), +('11', '16', '13', '13400', '3773', '0'), +('11', '16', '14', '14759', '6331', '0'), +('11', '16', '14', '10219', '5681', '0'), +('11', '16', '14', '10527', '4500', '0'), +('11', '16', '14', '11625', '3547', '0'), +('11', '16', '11', '14762', '2204', '0'), +('11', '16', '11', '13169', '2080', '0'), +('11', '16', '11', '9246', '1945', '0'), +('11', '16', '11', '13353', '1500', '0'), +('11', '17', '22', '10323', '0', '0'), +('11', '17', '22', '9246', '0', '0'), +('11', '17', '22', '21509', '0', '0'), +('11', '17', '22', '8007', '0', '0'), +('11', '17', '1', '14702', '3750', '0'), +('11', '17', '1', '14701', '2862', '0'), +('11', '17', '1', '30361', '2640', '0'), +('11', '17', '1', '10082', '1328', '0'), +('11', '17', '2', '10143', '5368', '0'), +('11', '17', '2', '1232', '4073', '0'), +('11', '17', '2', '30363', '3700', '0'), +('11', '17', '2', '1211', '2838', '0'), +('11', '17', '3', '1544', '6678', '0'), +('11', '17', '3', '11052', '3080', '0'), +('11', '17', '3', '1212', '1523', '0'), +('11', '17', '3', '4505', '1468', '0'), +('11', '17', '5', '14703', '6050', '0'), +('11', '17', '5', '14560', '4740', '0'), +('11', '17', '5', '14700', '3318', '0'), +('11', '17', '5', '30362', '3140', '0'), +('11', '17', '8', '11603', '10159', '0'), +('11', '17', '8', '1278', '6094', '0'), +('11', '17', '8', '2349', '3554', '0'), +('11', '17', '8', '1216', '1537', '0'), +('11', '17', '6', '1279', '7853', '0'), +('11', '17', '6', '1557', '5310', '0'), +('11', '17', '6', '1905', '5051', '0'), +('11', '17', '6', '1401', '2174', '0'), +('11', '17', '17', '1253', '10089', '0'), +('11', '17', '17', '1644', '9393', '0'), +('11', '17', '17', '11641', '8662', '0'), +('11', '17', '17', '1233', '6783', '0'), +('11', '17', '7', '1362', '2624', '0'), +('11', '17', '7', '1234', '1918', '0'), +('11', '17', '7', '1218', '1882', '0'), +('11', '17', '7', '1648', '1851', '0'), +('11', '17', '9', '12804', '6753', '0'), +('11', '17', '9', '27712', '3563', '0'), +('11', '17', '9', '1649', '2134', '0'), +('11', '17', '9', '4344', '2051', '0'), +('11', '17', '15', '27713', '6039', '0'), +('11', '17', '15', '20659', '3716', '0'), +('11', '17', '15', '10150', '3004', '0'), +('11', '17', '15', '10163', '2300', '0'), +('11', '17', '20', '11666', '8316', '0'), +('11', '17', '20', '2742', '5108', '0'), +('11', '17', '20', '1217', '1532', '0'), +('11', '17', '20', '1647', '1334', '0'), +('11', '17', '12', '1236', '3173', '0'), +('11', '17', '12', '2923', '3074', '0'), +('11', '17', '12', '20655', '3020', '0'), +('11', '17', '12', '1404', '2512', '0'), +('11', '17', '18', '1651', '1551', '0'), +('11', '17', '18', '4410', '1142', '0'), +('11', '17', '18', '1221', '454', '0'), +('11', '17', '18', '1237', '436', '0'), +('11', '17', '19', '68239', '2540', '0'), +('11', '17', '19', '1368', '2016', '0'), +('11', '17', '19', '4407', '1908', '0'), +('11', '17', '19', '1652', '1834', '0'), +('11', '17', '13', '14759', '6403', '0'), +('11', '17', '13', '11689', '5667', '0'), +('11', '17', '13', '10527', '4500', '0'), +('11', '17', '13', '13400', '3821', '0'), +('11', '17', '14', '14759', '6403', '0'), +('11', '17', '14', '10219', '5681', '0'), +('11', '17', '14', '10527', '4500', '0'), +('11', '17', '14', '11625', '3549', '0'), +('11', '17', '11', '14762', '2204', '0'), +('11', '17', '11', '13169', '2116', '0'), +('11', '17', '11', '9246', '2066', '0'), +('11', '17', '11', '13353', '1500', '0'), +('11', '18', '22', '10323', '0', '0'), +('11', '18', '22', '9246', '0', '0'), +('11', '18', '22', '21509', '0', '0'), +('11', '18', '22', '8007', '0', '0'), +('11', '18', '1', '14702', '3750', '0'), +('11', '18', '1', '14701', '2862', '0'), +('11', '18', '1', '30361', '2640', '0'), +('11', '18', '1', '10082', '1401', '0'), +('11', '18', '2', '10143', '5368', '0'), +('11', '18', '2', '1232', '4170', '0'), +('11', '18', '2', '30363', '3700', '0'), +('11', '18', '2', '1211', '2922', '0'), +('11', '18', '3', '1544', '6739', '0'), +('11', '18', '3', '11052', '3262', '0'), +('11', '18', '3', '4505', '1552', '0'), +('11', '18', '3', '1212', '1536', '0'), +('11', '18', '5', '14703', '6050', '0'), +('11', '18', '5', '14560', '4861', '0'), +('11', '18', '5', '14700', '3318', '0'), +('11', '18', '5', '30362', '3140', '0'), +('11', '18', '8', '11603', '10267', '0'), +('11', '18', '8', '1278', '6156', '0'), +('11', '18', '8', '2349', '3554', '0'), +('11', '18', '8', '1216', '1549', '0'), +('11', '18', '6', '1279', '7913', '0'), +('11', '18', '6', '1557', '5310', '0'), +('11', '18', '6', '1905', '5052', '0'), +('11', '18', '6', '1401', '2174', '0'), +('11', '18', '17', '1253', '10092', '0'), +('11', '18', '17', '1644', '9454', '0'), +('11', '18', '17', '11641', '8843', '0'), +('11', '18', '17', '1233', '6943', '0'), +('11', '18', '7', '1362', '2624', '0'), +('11', '18', '7', '1234', '2002', '0'), +('11', '18', '7', '1218', '1966', '0'), +('11', '18', '7', '1648', '1911', '0'), +('11', '18', '9', '12804', '6753', '0'), +('11', '18', '9', '27712', '3623', '0'), +('11', '18', '9', '1649', '2170', '0'), +('11', '18', '9', '4344', '2051', '0'), +('11', '18', '15', '27713', '6099', '0'), +('11', '18', '15', '20659', '3752', '0'), +('11', '18', '15', '10150', '3004', '0'), +('11', '18', '15', '10163', '2300', '0'), +('11', '18', '20', '11666', '8317', '0'), +('11', '18', '20', '2742', '5110', '0'), +('11', '18', '20', '1217', '1544', '0'), +('11', '18', '20', '1647', '1334', '0'), +('11', '18', '12', '1236', '3270', '0'), +('11', '18', '12', '2923', '3074', '0'), +('11', '18', '12', '20655', '3045', '0'), +('11', '18', '12', '1404', '2512', '0'), +('11', '18', '18', '1651', '1587', '0'), +('11', '18', '18', '4410', '1142', '0'), +('11', '18', '18', '1221', '454', '0'), +('11', '18', '18', '1237', '436', '0'), +('11', '18', '19', '68239', '2576', '0'), +('11', '18', '19', '4407', '2017', '0'), +('11', '18', '19', '1368', '2016', '0'), +('11', '18', '19', '1652', '1834', '0'), +('11', '18', '13', '14759', '6474', '0'), +('11', '18', '13', '11689', '5757', '0'), +('11', '18', '13', '10527', '4500', '0'), +('11', '18', '13', '13400', '3870', '0'), +('11', '18', '14', '14759', '6474', '0'), +('11', '18', '14', '10219', '5681', '0'), +('11', '18', '14', '10527', '4500', '0'), +('11', '18', '14', '11625', '3551', '0'), +('11', '18', '11', '14762', '2204', '0'), +('11', '18', '11', '9246', '2186', '0'), +('11', '18', '11', '13169', '2152', '0'), +('11', '18', '11', '13353', '1500', '0'), +('11', '19', '22', '10323', '0', '0'), +('11', '19', '22', '9246', '0', '0'), +('11', '19', '22', '21509', '0', '0'), +('11', '19', '22', '8007', '0', '0'), +('11', '19', '1', '14702', '3750', '0'), +('11', '19', '1', '14701', '2862', '0'), +('11', '19', '1', '30361', '2640', '0'), +('11', '19', '1', '10082', '1473', '0'), +('11', '19', '2', '10143', '5368', '0'), +('11', '19', '2', '1232', '4266', '0'), +('11', '19', '2', '30363', '3700', '0'), +('11', '19', '2', '1211', '3007', '0'), +('11', '19', '3', '1544', '6799', '0'), +('11', '19', '3', '11052', '3443', '0'), +('11', '19', '3', '4505', '1637', '0'), +('11', '19', '3', '1212', '1548', '0'), +('11', '19', '5', '14703', '6050', '0'), +('11', '19', '5', '14560', '4981', '0'), +('11', '19', '5', '14700', '3318', '0'), +('11', '19', '5', '30362', '3140', '0'), +('11', '19', '8', '11603', '10376', '0'), +('11', '19', '8', '1278', '6217', '0'), +('11', '19', '8', '2349', '3554', '0'), +('11', '19', '8', '1216', '1561', '0'), +('11', '19', '6', '1279', '7974', '0'), +('11', '19', '6', '1557', '5310', '0'), +('11', '19', '6', '1905', '5053', '0'), +('11', '19', '6', '1401', '2174', '0'), +('11', '19', '17', '1253', '10094', '0'), +('11', '19', '17', '1644', '9514', '0'), +('11', '19', '17', '11641', '9024', '0'), +('11', '19', '17', '1233', '7102', '0'), +('11', '19', '7', '1362', '2624', '0'), +('11', '19', '7', '1234', '2087', '0'), +('11', '19', '7', '1218', '2051', '0'), +('11', '19', '7', '1648', '1972', '0'), +('11', '19', '9', '12804', '6753', '0'), +('11', '19', '9', '27712', '3684', '0'), +('11', '19', '9', '1649', '2207', '0'), +('11', '19', '9', '4344', '2051', '0'), +('11', '19', '15', '27713', '6160', '0'), +('11', '19', '15', '20659', '3789', '0'), +('11', '19', '15', '10150', '3004', '0'), +('11', '19', '15', '10163', '2300', '0'), +('11', '19', '20', '11666', '8319', '0'), +('11', '19', '20', '2742', '5112', '0'), +('11', '19', '20', '1217', '1556', '0'), +('11', '19', '20', '1647', '1334', '0'), +('11', '19', '12', '1236', '3366', '0'), +('11', '19', '12', '2923', '3074', '0'), +('11', '19', '12', '20655', '3070', '0'), +('11', '19', '12', '1404', '2512', '0'), +('11', '19', '18', '1651', '1624', '0'), +('11', '19', '18', '4410', '1142', '0'), +('11', '19', '18', '1221', '454', '0'), +('11', '19', '18', '1237', '436', '0'), +('11', '19', '19', '68239', '2612', '0'), +('11', '19', '19', '4407', '2126', '0'), +('11', '19', '19', '1368', '2016', '0'), +('11', '19', '19', '1652', '1834', '0'), +('11', '19', '13', '14759', '6545', '0'), +('11', '19', '13', '11689', '5848', '0'), +('11', '19', '13', '10527', '4500', '0'), +('11', '19', '13', '13400', '3918', '0'), +('11', '19', '14', '14759', '6545', '0'), +('11', '19', '14', '10219', '5681', '0'), +('11', '19', '14', '10527', '4500', '0'), +('11', '19', '14', '11625', '3553', '0'), +('11', '19', '11', '9246', '2307', '0'), +('11', '19', '11', '14762', '2204', '0'), +('11', '19', '11', '13169', '2189', '0'), +('11', '19', '11', '13353', '1500', '0'), +('11', '20', '22', '10323', '0', '0'), +('11', '20', '22', '9246', '0', '0'), +('11', '20', '22', '21509', '0', '0'), +('11', '20', '22', '8007', '0', '0'), +('11', '20', '1', '14702', '3750', '0'), +('11', '20', '1', '14701', '2862', '0'), +('11', '20', '1', '30361', '2640', '0'), +('11', '20', '1', '10082', '1546', '0'), +('11', '20', '2', '10143', '5368', '0'), +('11', '20', '2', '1232', '4363', '0'), +('11', '20', '2', '30363', '3700', '0'), +('11', '20', '2', '1211', '3091', '0'), +('11', '20', '3', '1544', '6859', '0'), +('11', '20', '3', '11052', '3624', '0'), +('11', '20', '3', '4505', '1721', '0'), +('11', '20', '3', '1212', '1560', '0'), +('11', '20', '5', '14703', '6050', '0'), +('11', '20', '5', '14560', '5102', '0'), +('11', '20', '5', '14700', '3318', '0'), +('11', '20', '5', '30362', '3140', '0'), +('11', '20', '8', '11603', '10485', '0'), +('11', '20', '8', '1278', '6279', '0'), +('11', '20', '8', '2349', '3554', '0'), +('11', '20', '8', '1216', '1573', '0'), +('11', '20', '6', '1279', '8034', '0'), +('11', '20', '6', '1557', '5310', '0'), +('11', '20', '6', '1905', '5054', '0'), +('11', '20', '6', '1401', '2174', '0'), +('11', '20', '17', '1253', '10097', '0'), +('11', '20', '17', '1644', '9574', '0'), +('11', '20', '17', '11641', '9206', '0'), +('11', '20', '17', '1233', '7262', '0'), +('11', '20', '7', '1362', '2624', '0'), +('11', '20', '7', '1234', '2171', '0'), +('11', '20', '7', '1218', '2135', '0'), +('11', '20', '7', '1648', '2032', '0'), +('11', '20', '9', '12804', '6753', '0'), +('11', '20', '9', '27712', '3744', '0'), +('11', '20', '9', '1649', '2243', '0'), +('11', '20', '9', '4344', '2051', '0'), +('11', '20', '15', '27713', '6220', '0'), +('11', '20', '15', '20659', '3825', '0'), +('11', '20', '15', '10150', '3004', '0'), +('11', '20', '15', '10163', '2300', '0'), +('11', '20', '20', '11666', '8321', '0'), +('11', '20', '20', '2742', '5115', '0'), +('11', '20', '20', '1217', '1568', '0'), +('11', '20', '20', '1647', '1334', '0'), +('11', '20', '12', '1236', '3463', '0'), +('11', '20', '12', '20655', '3094', '0'), +('11', '20', '12', '2923', '3074', '0'), +('11', '20', '12', '1404', '2512', '0'), +('11', '20', '18', '1651', '1660', '0'), +('11', '20', '18', '4410', '1142', '0'), +('11', '20', '18', '1221', '454', '0'), +('11', '20', '18', '1237', '436', '0'), +('11', '20', '19', '68239', '2648', '0'), +('11', '20', '19', '4407', '2235', '0'), +('11', '20', '19', '1368', '2016', '0'), +('11', '20', '19', '1652', '1834', '0'), +('11', '20', '13', '14759', '6616', '0'), +('11', '20', '13', '11689', '5938', '0'), +('11', '20', '13', '10527', '4500', '0'), +('11', '20', '13', '13400', '3966', '0'), +('11', '20', '14', '14759', '6616', '0'), +('11', '20', '14', '10219', '5681', '0'), +('11', '20', '14', '10527', '4500', '0'), +('11', '20', '14', '11625', '3556', '0'), +('11', '20', '11', '9246', '2428', '0'), +('11', '20', '11', '13169', '2225', '0'), +('11', '20', '11', '14762', '2204', '0'), +('11', '20', '11', '13353', '1500', '0'), +('11', '21', '22', '10323', '0', '0'), +('11', '21', '22', '9246', '0', '0'), +('11', '21', '22', '21509', '0', '0'), +('11', '21', '22', '8007', '0', '0'), +('11', '21', '1', '14702', '3750', '0'), +('11', '21', '1', '14701', '2862', '0'), +('11', '21', '1', '30361', '2640', '0'), +('11', '21', '1', '10082', '1618', '0'), +('11', '21', '2', '10143', '5368', '0'), +('11', '21', '2', '1232', '4460', '0'), +('11', '21', '2', '30363', '3700', '0'), +('11', '21', '2', '1211', '3176', '0'), +('11', '21', '3', '1544', '6920', '0'), +('11', '21', '3', '11052', '3805', '0'), +('11', '21', '3', '4505', '1806', '0'), +('11', '21', '3', '1212', '1572', '0'), +('11', '21', '5', '14703', '6050', '0'), +('11', '21', '5', '14560', '5223', '0'), +('11', '21', '5', '14700', '3318', '0'), +('11', '21', '5', '30362', '3140', '0'), +('11', '21', '8', '11603', '10594', '0'), +('11', '21', '8', '1278', '6341', '0'), +('11', '21', '8', '2349', '3554', '0'), +('11', '21', '8', '1216', '1585', '0'), +('11', '21', '6', '1279', '8094', '0'), +('11', '21', '6', '1557', '5310', '0'), +('11', '21', '6', '1905', '5056', '0'), +('11', '21', '6', '1401', '2174', '0'), +('11', '21', '17', '1253', '10099', '0'), +('11', '21', '17', '1644', '9635', '0'), +('11', '21', '17', '11641', '9387', '0'), +('11', '21', '17', '1233', '7421', '0'), +('11', '21', '7', '1362', '2624', '0'), +('11', '21', '7', '1234', '2256', '0'), +('11', '21', '7', '1218', '2220', '0'), +('11', '21', '7', '1648', '2093', '0'), +('11', '21', '9', '12804', '6753', '0'), +('11', '21', '9', '27712', '3805', '0'), +('11', '21', '9', '1649', '2279', '0'), +('11', '21', '9', '4344', '2051', '0'), +('11', '21', '15', '27713', '6280', '0'), +('11', '21', '15', '20659', '3861', '0'), +('11', '21', '15', '10150', '3004', '0'), +('11', '21', '15', '10163', '2300', '0'), +('11', '21', '20', '11666', '8322', '0'), +('11', '21', '20', '2742', '5117', '0'), +('11', '21', '20', '1217', '1580', '0'), +('11', '21', '20', '1647', '1334', '0'), +('11', '21', '12', '1236', '3560', '0'), +('11', '21', '12', '20655', '3119', '0'), +('11', '21', '12', '2923', '3074', '0'), +('11', '21', '12', '1404', '2512', '0'), +('11', '21', '18', '1651', '1696', '0'), +('11', '21', '18', '4410', '1142', '0'), +('11', '21', '18', '1221', '454', '0'), +('11', '21', '18', '1237', '436', '0'), +('11', '21', '19', '68239', '2684', '0'), +('11', '21', '19', '4407', '2343', '0'), +('11', '21', '19', '1368', '2016', '0'), +('11', '21', '19', '1652', '1834', '0'), +('11', '21', '13', '14759', '6688', '0'), +('11', '21', '13', '11689', '6029', '0'), +('11', '21', '13', '10527', '4500', '0'), +('11', '21', '13', '13400', '4015', '0'), +('11', '21', '14', '14759', '6688', '0'), +('11', '21', '14', '10219', '5681', '0'), +('11', '21', '14', '10527', '4500', '0'), +('11', '21', '14', '11625', '3558', '0'), +('11', '21', '11', '9246', '2549', '0'), +('11', '21', '11', '13169', '2261', '0'), +('11', '21', '11', '14762', '2204', '0'), +('11', '21', '11', '13353', '1500', '0'), +('11', '22', '22', '10323', '0', '0'), +('11', '22', '22', '9246', '0', '0'), +('11', '22', '22', '21509', '0', '0'), +('11', '22', '22', '8007', '0', '0'), +('11', '22', '1', '14702', '3750', '0'), +('11', '22', '1', '14701', '2862', '0'), +('11', '22', '1', '30361', '2640', '0'), +('11', '22', '1', '10082', '1691', '0'), +('11', '22', '2', '10143', '5368', '0'), +('11', '22', '2', '1232', '4556', '0'), +('11', '22', '2', '30363', '3700', '0'), +('11', '22', '2', '1211', '3261', '0'), +('11', '22', '3', '1544', '6980', '0'), +('11', '22', '3', '11052', '3986', '0'), +('11', '22', '3', '4505', '1891', '0'), +('11', '22', '3', '1212', '1584', '0'), +('11', '22', '5', '14703', '6050', '0'), +('11', '22', '5', '14560', '5344', '0'), +('11', '22', '5', '14700', '3318', '0'), +('11', '22', '5', '30362', '3140', '0'), +('11', '22', '8', '11603', '10702', '0'), +('11', '22', '8', '1278', '6403', '0'), +('11', '22', '8', '2349', '3554', '0'), +('11', '22', '8', '1216', '1597', '0'), +('11', '22', '6', '1279', '8155', '0'), +('11', '22', '6', '1557', '5310', '0'), +('11', '22', '6', '1905', '5057', '0'), +('11', '22', '6', '1401', '2174', '0'), +('11', '22', '17', '1253', '10101', '0'), +('11', '22', '17', '1644', '9695', '0'), +('11', '22', '17', '11641', '9568', '0'), +('11', '22', '17', '1233', '7581', '0'), +('11', '22', '7', '1362', '2624', '0'), +('11', '22', '7', '1234', '2341', '0'), +('11', '22', '7', '1218', '2304', '0'), +('11', '22', '7', '1648', '2153', '0'), +('11', '22', '9', '12804', '6753', '0'), +('11', '22', '9', '27712', '3865', '0'), +('11', '22', '9', '1649', '2315', '0'), +('11', '22', '9', '4344', '2051', '0'), +('11', '22', '15', '27713', '6341', '0'), +('11', '22', '15', '20659', '3897', '0'), +('11', '22', '15', '10150', '3004', '0'), +('11', '22', '15', '10163', '2300', '0'), +('11', '22', '20', '11666', '8324', '0'), +('11', '22', '20', '2742', '5120', '0'), +('11', '22', '20', '1217', '1592', '0'), +('11', '22', '20', '2467', '1341', '0'), +('11', '22', '12', '1236', '3656', '0'), +('11', '22', '12', '20655', '3144', '0'), +('11', '22', '12', '2923', '3074', '0'), +('11', '22', '12', '1404', '2512', '0'), +('11', '22', '18', '1651', '1732', '0'), +('11', '22', '18', '4410', '1142', '0'), +('11', '22', '18', '1221', '454', '0'), +('11', '22', '18', '1237', '436', '0'), +('11', '22', '19', '68239', '2721', '0'), +('11', '22', '19', '4407', '2452', '0'), +('11', '22', '19', '1368', '2016', '0'), +('11', '22', '19', '1652', '1834', '0'), +('11', '22', '13', '14759', '6759', '0'), +('11', '22', '13', '11689', '6120', '0'), +('11', '22', '13', '10527', '4500', '0'), +('11', '22', '13', '13400', '4063', '0'), +('11', '22', '14', '14759', '6759', '0'), +('11', '22', '14', '10219', '5681', '0'), +('11', '22', '14', '10527', '4500', '0'), +('11', '22', '14', '11625', '3560', '0'), +('11', '22', '11', '9246', '2670', '0'), +('11', '22', '11', '13169', '2297', '0'), +('11', '22', '11', '14762', '2204', '0'), +('11', '22', '11', '13353', '1500', '0'), +('11', '23', '22', '10323', '0', '0'), +('11', '23', '22', '9246', '0', '0'), +('11', '23', '22', '21509', '0', '0'), +('11', '23', '22', '8007', '0', '0'), +('11', '23', '1', '14702', '3750', '0'), +('11', '23', '1', '14701', '2862', '0'), +('11', '23', '1', '30361', '2640', '0'), +('11', '23', '1', '10082', '1763', '0'), +('11', '23', '2', '10143', '5368', '0'), +('11', '23', '2', '1232', '4653', '0'), +('11', '23', '2', '30363', '3700', '0'), +('11', '23', '2', '1211', '3345', '0'), +('11', '23', '3', '1544', '7041', '0'), +('11', '23', '3', '11052', '4168', '0'), +('11', '23', '3', '4505', '1975', '0'), +('11', '23', '3', '1212', '1596', '0'), +('11', '23', '5', '14703', '6050', '0'), +('11', '23', '5', '14560', '5465', '0'), +('11', '23', '5', '14700', '3318', '0'), +('11', '23', '5', '30362', '3140', '0'), +('11', '23', '8', '11603', '10811', '0'), +('11', '23', '8', '1278', '6465', '0'), +('11', '23', '8', '2349', '3554', '0'), +('11', '23', '8', '1216', '1609', '0'), +('11', '23', '6', '1279', '8215', '0'), +('11', '23', '6', '1557', '5310', '0'), +('11', '23', '6', '1905', '5058', '0'), +('11', '23', '6', '1401', '2174', '0'), +('11', '23', '17', '1253', '10104', '0'), +('11', '23', '17', '1644', '9756', '0'), +('11', '23', '17', '11641', '9749', '0'), +('11', '23', '17', '1233', '7740', '0'), +('11', '23', '7', '1362', '2624', '0'), +('11', '23', '7', '1234', '2425', '0'), +('11', '23', '7', '1218', '2389', '0'), +('11', '23', '7', '1648', '2213', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '23', '9', '12804', '6753', '0'), +('11', '23', '9', '27712', '3925', '0'), +('11', '23', '9', '1649', '2352', '0'), +('11', '23', '9', '4344', '2051', '0'), +('11', '23', '15', '27713', '6401', '0'), +('11', '23', '15', '20659', '3934', '0'), +('11', '23', '15', '10150', '3004', '0'), +('11', '23', '15', '10163', '2300', '0'), +('11', '23', '20', '11666', '8326', '0'), +('11', '23', '20', '2742', '5122', '0'), +('11', '23', '20', '1217', '1604', '0'), +('11', '23', '20', '2467', '1401', '0'), +('11', '23', '12', '1236', '3753', '0'), +('11', '23', '12', '20655', '3168', '0'), +('11', '23', '12', '2923', '3074', '0'), +('11', '23', '12', '1404', '2512', '0'), +('11', '23', '18', '1651', '1769', '0'), +('11', '23', '18', '4410', '1142', '0'), +('11', '23', '18', '1221', '454', '0'), +('11', '23', '18', '1237', '436', '0'), +('11', '23', '19', '68239', '2757', '0'), +('11', '23', '19', '4407', '2561', '0'), +('11', '23', '19', '1368', '2016', '0'), +('11', '23', '19', '1652', '1834', '0'), +('11', '23', '13', '14759', '6830', '0'), +('11', '23', '13', '11689', '6210', '0'), +('11', '23', '13', '10527', '4500', '0'), +('11', '23', '13', '13400', '4111', '0'), +('11', '23', '14', '14759', '6830', '0'), +('11', '23', '14', '10219', '5681', '0'), +('11', '23', '14', '10527', '4500', '0'), +('11', '23', '14', '6359', '3631', '0'), +('11', '23', '11', '9246', '2790', '0'), +('11', '23', '11', '13169', '2334', '0'), +('11', '23', '11', '14762', '2204', '0'), +('11', '23', '11', '13353', '1500', '0'), +('11', '24', '22', '10323', '0', '0'), +('11', '24', '22', '9246', '0', '0'), +('11', '24', '22', '21509', '0', '0'), +('11', '24', '22', '8007', '0', '0'), +('11', '24', '1', '14702', '3750', '0'), +('11', '24', '1', '14701', '2862', '0'), +('11', '24', '1', '30361', '2640', '0'), +('11', '24', '1', '10082', '1836', '0'), +('11', '24', '2', '10143', '5368', '0'), +('11', '24', '2', '1232', '4750', '0'), +('11', '24', '2', '30363', '3700', '0'), +('11', '24', '2', '1211', '3430', '0'), +('11', '24', '3', '1544', '7101', '0'), +('11', '24', '3', '11052', '4349', '0'), +('11', '24', '3', '4505', '2060', '0'), +('11', '24', '3', '1212', '1608', '0'), +('11', '24', '5', '14703', '6050', '0'), +('11', '24', '5', '14560', '5585', '0'), +('11', '24', '5', '14700', '3318', '0'), +('11', '24', '5', '30362', '3140', '0'), +('11', '24', '8', '11603', '10920', '0'), +('11', '24', '8', '1278', '6527', '0'), +('11', '24', '8', '2349', '3554', '0'), +('11', '24', '8', '1057', '1648', '0'), +('11', '24', '6', '1279', '8276', '0'), +('11', '24', '6', '1557', '5310', '0'), +('11', '24', '6', '1905', '5059', '0'), +('11', '24', '6', '1645', '2199', '0'), +('11', '24', '17', '1253', '10106', '0'), +('11', '24', '17', '11641', '9930', '0'), +('11', '24', '17', '1644', '9816', '0'), +('11', '24', '17', '1233', '7899', '0'), +('11', '24', '7', '1362', '2624', '0'), +('11', '24', '7', '1234', '2510', '0'), +('11', '24', '7', '1218', '2474', '0'), +('11', '24', '7', '1648', '2274', '0'), +('11', '24', '9', '12804', '6753', '0'), +('11', '24', '9', '27712', '3986', '0'), +('11', '24', '9', '1649', '2388', '0'), +('11', '24', '9', '4344', '2051', '0'), +('11', '24', '15', '27713', '6462', '0'), +('11', '24', '15', '20659', '3970', '0'), +('11', '24', '15', '10150', '3004', '0'), +('11', '24', '15', '10163', '2300', '0'), +('11', '24', '20', '11666', '8327', '0'), +('11', '24', '20', '2742', '5124', '0'), +('11', '24', '20', '1217', '1616', '0'), +('11', '24', '20', '2467', '1462', '0'), +('11', '24', '12', '1236', '3850', '0'), +('11', '24', '12', '20655', '3193', '0'), +('11', '24', '12', '2923', '3074', '0'), +('11', '24', '12', '1404', '2512', '0'), +('11', '24', '18', '1651', '1805', '0'), +('11', '24', '18', '4410', '1142', '0'), +('11', '24', '18', '1221', '454', '0'), +('11', '24', '18', '1237', '436', '0'), +('11', '24', '19', '68239', '2793', '0'), +('11', '24', '19', '4407', '2669', '0'), +('11', '24', '19', '1368', '2016', '0'), +('11', '24', '19', '1652', '1834', '0'), +('11', '24', '13', '14759', '6901', '0'), +('11', '24', '13', '11689', '6301', '0'), +('11', '24', '13', '10527', '4500', '0'), +('11', '24', '13', '13400', '4160', '0'), +('11', '24', '14', '14759', '6901', '0'), +('11', '24', '14', '10219', '5681', '0'), +('11', '24', '14', '10527', '4500', '0'), +('11', '24', '14', '6359', '3752', '0'), +('11', '24', '11', '9246', '2911', '0'), +('11', '24', '11', '13169', '2370', '0'), +('11', '24', '11', '14762', '2204', '0'), +('11', '24', '11', '13353', '1500', '0'), +('11', '25', '22', '10323', '0', '0'), +('11', '25', '22', '9246', '0', '0'), +('11', '25', '22', '21509', '0', '0'), +('11', '25', '22', '8007', '0', '0'), +('11', '25', '1', '14702', '3750', '0'), +('11', '25', '1', '14701', '2862', '0'), +('11', '25', '1', '30361', '2640', '0'), +('11', '25', '1', '10082', '1908', '0'), +('11', '25', '2', '10143', '5368', '0'), +('11', '25', '2', '1232', '4846', '0'), +('11', '25', '2', '30363', '3700', '0'), +('11', '25', '2', '1211', '3514', '0'), +('11', '25', '3', '1544', '7161', '0'), +('11', '25', '3', '11052', '4530', '0'), +('11', '25', '3', '4505', '2144', '0'), +('11', '25', '3', '1212', '1620', '0'), +('11', '25', '5', '14703', '6050', '0'), +('11', '25', '5', '14560', '5706', '0'), +('11', '25', '5', '14700', '3318', '0'), +('11', '25', '5', '11646', '3226', '0'), +('11', '25', '8', '11603', '11028', '0'), +('11', '25', '8', '1278', '6589', '0'), +('11', '25', '8', '2349', '3554', '0'), +('11', '25', '8', '1057', '1708', '0'), +('11', '25', '6', '1279', '8336', '0'), +('11', '25', '6', '1557', '5310', '0'), +('11', '25', '6', '1905', '5060', '0'), +('11', '25', '6', '1645', '2235', '0'), +('11', '25', '17', '11641', '10112', '0'), +('11', '25', '17', '1253', '10109', '0'), +('11', '25', '17', '1644', '9876', '0'), +('11', '25', '17', '1233', '8059', '0'), +('11', '25', '7', '1362', '2624', '0'), +('11', '25', '7', '1234', '2594', '0'), +('11', '25', '7', '1218', '2558', '0'), +('11', '25', '7', '1648', '2334', '0'), +('11', '25', '9', '12804', '6753', '0'), +('11', '25', '9', '27712', '4046', '0'), +('11', '25', '9', '1649', '2424', '0'), +('11', '25', '9', '4344', '2051', '0'), +('11', '25', '15', '27713', '6522', '0'), +('11', '25', '15', '20659', '4006', '0'), +('11', '25', '15', '10150', '3004', '0'), +('11', '25', '15', '10163', '2300', '0'), +('11', '25', '20', '11666', '8329', '0'), +('11', '25', '20', '2742', '5127', '0'), +('11', '25', '20', '1217', '1629', '0'), +('11', '25', '20', '2467', '1522', '0'), +('11', '25', '12', '1236', '3946', '0'), +('11', '25', '12', '20655', '3218', '0'), +('11', '25', '12', '2923', '3074', '0'), +('11', '25', '12', '2336', '2522', '0'), +('11', '25', '18', '1651', '1841', '0'), +('11', '25', '18', '4410', '1142', '0'), +('11', '25', '18', '1221', '454', '0'), +('11', '25', '18', '1237', '436', '0'), +('11', '25', '19', '68239', '2829', '0'), +('11', '25', '19', '4407', '2778', '0'), +('11', '25', '19', '1368', '2016', '0'), +('11', '25', '19', '1652', '1834', '0'), +('11', '25', '13', '14759', '6973', '0'), +('11', '25', '13', '11689', '6391', '0'), +('11', '25', '13', '10527', '4500', '0'), +('11', '25', '13', '13400', '4208', '0'), +('11', '25', '14', '14759', '6973', '0'), +('11', '25', '14', '10219', '5681', '0'), +('11', '25', '14', '10527', '4500', '0'), +('11', '25', '14', '6359', '3873', '0'), +('11', '25', '11', '9246', '3032', '0'), +('11', '25', '11', '13169', '2406', '0'), +('11', '25', '11', '14762', '2204', '0'), +('11', '25', '11', '13353', '1500', '0'), +('11', '26', '22', '10323', '0', '0'), +('11', '26', '22', '9246', '0', '0'), +('11', '26', '22', '21509', '0', '0'), +('11', '26', '22', '8007', '0', '0'), +('11', '26', '1', '14702', '3750', '0'), +('11', '26', '1', '14701', '2862', '0'), +('11', '26', '1', '30361', '2640', '0'), +('11', '26', '1', '10082', '1981', '0'), +('11', '26', '2', '10143', '5368', '0'), +('11', '26', '2', '1232', '4943', '0'), +('11', '26', '2', '30363', '3700', '0'), +('11', '26', '2', '1211', '3599', '0'), +('11', '26', '3', '1544', '7222', '0'), +('11', '26', '3', '11052', '4711', '0'), +('11', '26', '3', '4505', '2229', '0'), +('11', '26', '3', '1212', '1632', '0'), +('11', '26', '5', '14703', '6050', '0'), +('11', '26', '5', '14560', '5827', '0'), +('11', '26', '5', '11646', '3383', '0'), +('11', '26', '5', '14700', '3318', '0'), +('11', '26', '8', '11603', '11137', '0'), +('11', '26', '8', '1278', '6650', '0'), +('11', '26', '8', '2349', '3554', '0'), +('11', '26', '8', '1057', '1769', '0'), +('11', '26', '6', '1279', '8396', '0'), +('11', '26', '6', '1557', '5310', '0'), +('11', '26', '6', '1905', '5062', '0'), +('11', '26', '6', '1645', '2271', '0'), +('11', '26', '17', '11641', '10293', '0'), +('11', '26', '17', '1253', '10111', '0'), +('11', '26', '17', '1644', '9937', '0'), +('11', '26', '17', '1233', '8218', '0'), +('11', '26', '7', '1234', '2679', '0'), +('11', '26', '7', '1218', '2643', '0'), +('11', '26', '7', '1362', '2624', '0'), +('11', '26', '7', '1648', '2395', '0'), +('11', '26', '9', '12804', '6753', '0'), +('11', '26', '9', '27712', '4107', '0'), +('11', '26', '9', '1649', '2460', '0'), +('11', '26', '9', '4344', '2051', '0'), +('11', '26', '15', '27713', '6582', '0'), +('11', '26', '15', '20659', '4042', '0'), +('11', '26', '15', '10150', '3004', '0'), +('11', '26', '15', '10163', '2300', '0'), +('11', '26', '20', '11666', '8331', '0'), +('11', '26', '20', '2742', '5129', '0'), +('11', '26', '20', '1217', '1641', '0'), +('11', '26', '20', '2467', '1582', '0'), +('11', '26', '12', '1236', '4043', '0'), +('11', '26', '12', '20655', '3242', '0'), +('11', '26', '12', '2923', '3074', '0'), +('11', '26', '12', '2336', '2582', '0'), +('11', '26', '18', '1651', '1877', '0'), +('11', '26', '18', '4410', '1142', '0'), +('11', '26', '18', '1221', '454', '0'), +('11', '26', '18', '1237', '436', '0'), +('11', '26', '19', '4407', '2887', '0'), +('11', '26', '19', '68239', '2866', '0'), +('11', '26', '19', '1368', '2016', '0'), +('11', '26', '19', '1652', '1834', '0'), +('11', '26', '13', '14759', '7044', '0'), +('11', '26', '13', '11689', '6482', '0'), +('11', '26', '13', '10527', '4500', '0'), +('11', '26', '13', '13400', '4256', '0'), +('11', '26', '14', '14759', '7044', '0'), +('11', '26', '14', '10219', '5681', '0'), +('11', '26', '14', '10527', '4500', '0'), +('11', '26', '14', '6359', '3994', '0'), +('11', '26', '11', '9246', '3153', '0'), +('11', '26', '11', '13169', '2442', '0'), +('11', '26', '11', '14762', '2204', '0'), +('11', '26', '11', '13353', '1500', '0'), +('11', '27', '22', '10323', '0', '0'), +('11', '27', '22', '9246', '0', '0'), +('11', '27', '22', '21509', '0', '0'), +('11', '27', '22', '8007', '0', '0'), +('11', '27', '1', '14702', '3750', '0'), +('11', '27', '1', '14701', '2862', '0'), +('11', '27', '1', '30361', '2640', '0'), +('11', '27', '1', '10082', '2053', '0'), +('11', '27', '2', '10143', '5368', '0'), +('11', '27', '2', '1232', '5039', '0'), +('11', '27', '2', '30363', '3700', '0'), +('11', '27', '2', '1211', '3683', '0'), +('11', '27', '3', '1544', '7282', '0'), +('11', '27', '3', '11052', '4892', '0'), +('11', '27', '3', '4505', '2313', '0'), +('11', '27', '3', '1212', '1644', '0'), +('11', '27', '5', '14703', '6050', '0'), +('11', '27', '5', '14560', '5948', '0'), +('11', '27', '5', '11646', '3540', '0'), +('11', '27', '5', '14700', '3318', '0'), +('11', '27', '8', '11603', '11246', '0'), +('11', '27', '8', '1278', '6712', '0'), +('11', '27', '8', '2349', '3554', '0'), +('11', '27', '8', '1057', '1829', '0'), +('11', '27', '6', '1279', '8457', '0'), +('11', '27', '6', '1557', '5310', '0'), +('11', '27', '6', '1905', '5063', '0'), +('11', '27', '6', '1645', '2307', '0'), +('11', '27', '17', '11641', '10474', '0'), +('11', '27', '17', '1253', '10114', '0'), +('11', '27', '17', '1644', '9997', '0'), +('11', '27', '17', '1233', '8378', '0'), +('11', '27', '7', '1234', '2763', '0'), +('11', '27', '7', '1218', '2727', '0'), +('11', '27', '7', '1362', '2624', '0'), +('11', '27', '7', '1648', '2455', '0'), +('11', '27', '9', '12804', '6753', '0'), +('11', '27', '9', '27712', '4167', '0'), +('11', '27', '9', '1649', '2497', '0'), +('11', '27', '9', '4344', '2051', '0'), +('11', '27', '15', '27713', '6643', '0'), +('11', '27', '15', '20659', '4078', '0'), +('11', '27', '15', '10150', '3004', '0'), +('11', '27', '15', '10163', '2300', '0'), +('11', '27', '20', '11666', '8333', '0'), +('11', '27', '20', '2742', '5132', '0'), +('11', '27', '20', '1217', '1653', '0'), +('11', '27', '20', '2467', '1643', '0'), +('11', '27', '12', '1236', '4139', '0'), +('11', '27', '12', '20655', '3267', '0'), +('11', '27', '12', '2923', '3074', '0'), +('11', '27', '12', '2336', '2643', '0'), +('11', '27', '18', '1651', '1914', '0'), +('11', '27', '18', '4410', '1142', '0'), +('11', '27', '18', '1221', '454', '0'), +('11', '27', '18', '1237', '436', '0'), +('11', '27', '19', '4407', '2996', '0'), +('11', '27', '19', '68239', '2902', '0'), +('11', '27', '19', '1368', '2016', '0'), +('11', '27', '19', '1652', '1834', '0'), +('11', '27', '13', '14759', '7115', '0'), +('11', '27', '13', '11689', '6573', '0'), +('11', '27', '13', '10527', '4500', '0'), +('11', '27', '13', '13400', '4305', '0'), +('11', '27', '14', '14759', '7115', '0'), +('11', '27', '14', '10219', '5681', '0'), +('11', '27', '14', '10527', '4500', '0'), +('11', '27', '14', '6359', '4115', '0'), +('11', '27', '11', '9246', '3274', '0'), +('11', '27', '11', '13169', '2478', '0'), +('11', '27', '11', '14762', '2204', '0'), +('11', '27', '11', '13353', '1500', '0'), +('11', '28', '22', '10323', '0', '0'), +('11', '28', '22', '9246', '0', '0'), +('11', '28', '22', '21509', '0', '0'), +('11', '28', '22', '8007', '0', '0'), +('11', '28', '1', '14702', '3750', '0'), +('11', '28', '1', '14701', '2862', '0'), +('11', '28', '1', '30361', '2640', '0'), +('11', '28', '1', '10082', '2126', '0'), +('11', '28', '2', '10143', '5368', '0'), +('11', '28', '2', '1232', '5136', '0'), +('11', '28', '2', '1211', '3768', '0'), +('11', '28', '2', '30363', '3700', '0'), +('11', '28', '3', '1544', '7343', '0'), +('11', '28', '3', '11052', '5074', '0'), +('11', '28', '3', '4505', '2398', '0'), +('11', '28', '3', '1212', '1656', '0'), +('11', '28', '5', '14560', '6069', '0'), +('11', '28', '5', '14703', '6050', '0'), +('11', '28', '5', '11646', '3697', '0'), +('11', '28', '5', '14700', '3318', '0'), +('11', '28', '8', '11603', '11355', '0'), +('11', '28', '8', '1278', '6774', '0'), +('11', '28', '8', '2349', '3554', '0'), +('11', '28', '8', '1057', '1890', '0'), +('11', '28', '6', '1279', '8517', '0'), +('11', '28', '6', '1557', '5310', '0'), +('11', '28', '6', '1905', '5064', '0'), +('11', '28', '6', '1645', '2344', '0'), +('11', '28', '17', '11641', '10655', '0'), +('11', '28', '17', '1253', '10116', '0'), +('11', '28', '17', '1644', '10058', '0'), +('11', '28', '17', '1233', '8537', '0'), +('11', '28', '7', '1234', '2848', '0'), +('11', '28', '7', '1218', '2812', '0'), +('11', '28', '7', '1362', '2624', '0'), +('11', '28', '7', '1648', '2515', '0'), +('11', '28', '9', '12804', '6753', '0'), +('11', '28', '9', '27712', '4227', '0'), +('11', '28', '9', '1649', '2533', '0'), +('11', '28', '9', '4344', '2051', '0'), +('11', '28', '15', '27713', '6703', '0'), +('11', '28', '15', '20659', '4115', '0'), +('11', '28', '15', '10150', '3004', '0'), +('11', '28', '15', '10163', '2300', '0'), +('11', '28', '20', '11666', '8334', '0'), +('11', '28', '20', '2742', '5134', '0'), +('11', '28', '20', '2467', '1703', '0'), +('11', '28', '20', '1217', '1665', '0'), +('11', '28', '12', '1236', '4236', '0'), +('11', '28', '12', '20655', '3291', '0'), +('11', '28', '12', '2923', '3074', '0'), +('11', '28', '12', '2336', '2703', '0'), +('11', '28', '18', '1651', '1950', '0'), +('11', '28', '18', '4410', '1142', '0'), +('11', '28', '18', '1221', '454', '0'), +('11', '28', '18', '1237', '436', '0'), +('11', '28', '19', '4407', '3104', '0'), +('11', '28', '19', '68239', '2938', '0'), +('11', '28', '19', '1368', '2016', '0'), +('11', '28', '19', '1652', '1834', '0'), +('11', '28', '13', '14759', '7187', '0'), +('11', '28', '13', '11689', '6663', '0'), +('11', '28', '13', '10527', '4500', '0'), +('11', '28', '13', '13400', '4353', '0'), +('11', '28', '14', '14759', '7187', '0'), +('11', '28', '14', '10219', '5681', '0'), +('11', '28', '14', '10527', '4500', '0'), +('11', '28', '14', '6359', '4235', '0'), +('11', '28', '11', '9246', '3394', '0'), +('11', '28', '11', '13169', '2515', '0'), +('11', '28', '11', '14762', '2204', '0'), +('11', '28', '11', '13353', '1500', '0'), +('11', '29', '22', '10323', '0', '0'), +('11', '29', '22', '9246', '0', '0'), +('11', '29', '22', '21509', '0', '0'), +('11', '29', '22', '8007', '0', '0'), +('11', '29', '1', '14702', '3750', '0'), +('11', '29', '1', '14701', '2862', '0'), +('11', '29', '1', '30361', '2640', '0'), +('11', '29', '1', '10082', '2198', '0'), +('11', '29', '2', '10143', '5368', '0'), +('11', '29', '2', '1232', '5233', '0'), +('11', '29', '2', '1211', '3852', '0'), +('11', '29', '2', '30363', '3700', '0'), +('11', '29', '3', '1544', '7403', '0'), +('11', '29', '3', '11052', '5255', '0'), +('11', '29', '3', '4505', '2482', '0'), +('11', '29', '3', '1212', '1668', '0'), +('11', '29', '5', '14560', '6189', '0'), +('11', '29', '5', '14703', '6050', '0'), +('11', '29', '5', '11646', '3854', '0'), +('11', '29', '5', '14700', '3318', '0'), +('11', '29', '8', '11603', '11463', '0'), +('11', '29', '8', '1278', '6836', '0'), +('11', '29', '8', '2349', '3554', '0'), +('11', '29', '8', '1057', '1950', '0'), +('11', '29', '6', '1279', '8578', '0'), +('11', '29', '6', '1557', '5310', '0'), +('11', '29', '6', '1905', '5065', '0'), +('11', '29', '6', '1645', '2380', '0'), +('11', '29', '17', '11641', '10836', '0'), +('11', '29', '17', '1644', '10118', '0'), +('11', '29', '17', '1253', '10118', '0'), +('11', '29', '17', '1233', '8697', '0'), +('11', '29', '7', '1234', '2932', '0'), +('11', '29', '7', '1218', '2896', '0'), +('11', '29', '7', '1362', '2624', '0'), +('11', '29', '7', '1648', '2576', '0'), +('11', '29', '9', '12804', '6753', '0'), +('11', '29', '9', '27712', '4288', '0'), +('11', '29', '9', '1649', '2569', '0'), +('11', '29', '9', '4344', '2051', '0'), +('11', '29', '15', '27713', '6764', '0'), +('11', '29', '15', '20659', '4151', '0'), +('11', '29', '15', '10150', '3004', '0'), +('11', '29', '15', '10163', '2300', '0'), +('11', '29', '20', '11666', '8336', '0'), +('11', '29', '20', '2742', '5137', '0'), +('11', '29', '20', '2467', '1764', '0'), +('11', '29', '20', '1217', '1677', '0'), +('11', '29', '12', '1236', '4333', '0'), +('11', '29', '12', '20655', '3316', '0'), +('11', '29', '12', '2923', '3074', '0'), +('11', '29', '12', '2336', '2764', '0'), +('11', '29', '18', '1651', '1986', '0'), +('11', '29', '18', '4410', '1142', '0'), +('11', '29', '18', '1221', '454', '0'), +('11', '29', '18', '1237', '436', '0'), +('11', '29', '19', '4407', '3213', '0'), +('11', '29', '19', '68239', '2974', '0'), +('11', '29', '19', '1368', '2016', '0'), +('11', '29', '19', '1652', '1834', '0'), +('11', '29', '13', '14759', '7258', '0'), +('11', '29', '13', '11689', '6754', '0'), +('11', '29', '13', '10527', '4500', '0'), +('11', '29', '13', '13400', '4401', '0'), +('11', '29', '14', '14759', '7258', '0'), +('11', '29', '14', '10219', '5681', '0'), +('11', '29', '14', '10527', '4500', '0'), +('11', '29', '14', '6359', '4356', '0'), +('11', '29', '11', '9246', '3515', '0'), +('11', '29', '11', '13169', '2551', '0'), +('11', '29', '11', '14762', '2204', '0'), +('11', '29', '11', '13353', '1500', '0'), +('11', '30', '22', '10323', '0', '0'), +('11', '30', '22', '9246', '0', '0'), +('11', '30', '22', '21509', '0', '0'), +('11', '30', '22', '8007', '0', '0'), +('11', '30', '1', '14702', '3750', '0'), +('11', '30', '1', '14701', '2862', '0'), +('11', '30', '1', '30361', '2640', '0'), +('11', '30', '1', '10082', '2271', '0'), +('11', '30', '2', '10143', '5368', '0'), +('11', '30', '2', '1232', '5329', '0'), +('11', '30', '2', '1211', '3937', '0'), +('11', '30', '2', '30363', '3700', '0'), +('11', '30', '3', '1544', '7463', '0'), +('11', '30', '3', '11052', '5436', '0'), +('11', '30', '3', '4505', '2567', '0'), +('11', '30', '3', '1212', '1681', '0'), +('11', '30', '5', '14560', '6310', '0'), +('11', '30', '5', '14703', '6050', '0'), +('11', '30', '5', '11646', '4011', '0'), +('11', '30', '5', '10216', '3324', '0'), +('11', '30', '8', '11603', '11572', '0'), +('11', '30', '8', '1278', '6898', '0'), +('11', '30', '8', '2349', '3554', '0'), +('11', '30', '8', '1057', '2010', '0'), +('11', '30', '6', '1279', '8638', '0'), +('11', '30', '6', '1557', '5310', '0'), +('11', '30', '6', '1905', '5066', '0'), +('11', '30', '6', '1645', '2416', '0'), +('11', '30', '17', '11641', '11018', '0'), +('11', '30', '17', '1644', '10178', '0'), +('11', '30', '17', '1253', '10121', '0'), +('11', '30', '17', '1233', '8856', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '30', '7', '1234', '3017', '0'), +('11', '30', '7', '1218', '2981', '0'), +('11', '30', '7', '1648', '2636', '0'), +('11', '30', '7', '1362', '2624', '0'), +('11', '30', '9', '12804', '6753', '0'), +('11', '30', '9', '27712', '4348', '0'), +('11', '30', '9', '1649', '2605', '0'), +('11', '30', '9', '4344', '2051', '0'), +('11', '30', '15', '27713', '6824', '0'), +('11', '30', '15', '20659', '4187', '0'), +('11', '30', '15', '10150', '3004', '0'), +('11', '30', '15', '10163', '2300', '0'), +('11', '30', '20', '11666', '8338', '0'), +('11', '30', '20', '2742', '5139', '0'), +('11', '30', '20', '2467', '1824', '0'), +('11', '30', '20', '1217', '1689', '0'), +('11', '30', '12', '1236', '4429', '0'), +('11', '30', '12', '20655', '3341', '0'), +('11', '30', '12', '2923', '3074', '0'), +('11', '30', '12', '2336', '2824', '0'), +('11', '30', '18', '1651', '2022', '0'), +('11', '30', '18', '4410', '1142', '0'), +('11', '30', '18', '1221', '454', '0'), +('11', '30', '18', '1237', '436', '0'), +('11', '30', '19', '4407', '3322', '0'), +('11', '30', '19', '68239', '3011', '0'), +('11', '30', '19', '1368', '2016', '0'), +('11', '30', '19', '1652', '1834', '0'), +('11', '30', '13', '14759', '7329', '0'), +('11', '30', '13', '11689', '6844', '0'), +('11', '30', '13', '10527', '4500', '0'), +('11', '30', '13', '6359', '4477', '0'), +('11', '30', '14', '14759', '7329', '0'), +('11', '30', '14', '10219', '5681', '0'), +('11', '30', '14', '10527', '4500', '0'), +('11', '30', '14', '6359', '4477', '0'), +('11', '30', '11', '9246', '3636', '0'), +('11', '30', '11', '13169', '2587', '0'), +('11', '30', '11', '14762', '2204', '0'), +('11', '30', '11', '13353', '1500', '0'), +('11', '31', '22', '10323', '0', '0'), +('11', '31', '22', '9246', '0', '0'), +('11', '31', '22', '21509', '0', '0'), +('11', '31', '22', '8007', '0', '0'), +('11', '31', '1', '14702', '3750', '0'), +('11', '31', '1', '14701', '2862', '0'), +('11', '31', '1', '30361', '2640', '0'), +('11', '31', '1', '10082', '2343', '0'), +('11', '31', '2', '1232', '5426', '0'), +('11', '31', '2', '10143', '5368', '0'), +('11', '31', '2', '1211', '4022', '0'), +('11', '31', '2', '30363', '3700', '0'), +('11', '31', '3', '1544', '7524', '0'), +('11', '31', '3', '11052', '5617', '0'), +('11', '31', '3', '4505', '2652', '0'), +('11', '31', '3', '1212', '1693', '0'), +('11', '31', '5', '14560', '6431', '0'), +('11', '31', '5', '14703', '6050', '0'), +('11', '31', '5', '11646', '4168', '0'), +('11', '31', '5', '10216', '3384', '0'), +('11', '31', '8', '11603', '11681', '0'), +('11', '31', '8', '1278', '6960', '0'), +('11', '31', '8', '2349', '3554', '0'), +('11', '31', '8', '1057', '2071', '0'), +('11', '31', '6', '1279', '8698', '0'), +('11', '31', '6', '1557', '5310', '0'), +('11', '31', '6', '1905', '5068', '0'), +('11', '31', '6', '1645', '2452', '0'), +('11', '31', '17', '11641', '11199', '0'), +('11', '31', '17', '1644', '10239', '0'), +('11', '31', '17', '1253', '10123', '0'), +('11', '31', '17', '1233', '9016', '0'), +('11', '31', '7', '1234', '3102', '0'), +('11', '31', '7', '1218', '3066', '0'), +('11', '31', '7', '1648', '2697', '0'), +('11', '31', '7', '1362', '2624', '0'), +('11', '31', '9', '12804', '6753', '0'), +('11', '31', '9', '27712', '4409', '0'), +('11', '31', '9', '1649', '2642', '0'), +('11', '31', '9', '4344', '2051', '0'), +('11', '31', '15', '27713', '6884', '0'), +('11', '31', '15', '20659', '4223', '0'), +('11', '31', '15', '10150', '3004', '0'), +('11', '31', '15', '10163', '2300', '0'), +('11', '31', '20', '11666', '8339', '0'), +('11', '31', '20', '2742', '5141', '0'), +('11', '31', '20', '2467', '1884', '0'), +('11', '31', '20', '1217', '1701', '0'), +('11', '31', '12', '1236', '4526', '0'), +('11', '31', '12', '20655', '3365', '0'), +('11', '31', '12', '2923', '3074', '0'), +('11', '31', '12', '2336', '2884', '0'), +('11', '31', '18', '1651', '2058', '0'), +('11', '31', '18', '4410', '1142', '0'), +('11', '31', '18', '1221', '454', '0'), +('11', '31', '18', '1237', '436', '0'), +('11', '31', '19', '4407', '3431', '0'), +('11', '31', '19', '68239', '3047', '0'), +('11', '31', '19', '1368', '2016', '0'), +('11', '31', '19', '1652', '1834', '0'), +('11', '31', '13', '14759', '7400', '0'), +('11', '31', '13', '11689', '6935', '0'), +('11', '31', '13', '6359', '4598', '0'), +('11', '31', '13', '10527', '4500', '0'), +('11', '31', '14', '14759', '7400', '0'), +('11', '31', '14', '10219', '5681', '0'), +('11', '31', '14', '6359', '4598', '0'), +('11', '31', '14', '10527', '4500', '0'), +('11', '31', '11', '9246', '3757', '0'), +('11', '31', '11', '13169', '2623', '0'), +('11', '31', '11', '14762', '2204', '0'), +('11', '31', '11', '13353', '1500', '0'), +('11', '32', '22', '10323', '0', '0'), +('11', '32', '22', '9246', '0', '0'), +('11', '32', '22', '21509', '0', '0'), +('11', '32', '22', '8007', '0', '0'), +('11', '32', '1', '14702', '3750', '0'), +('11', '32', '1', '14701', '2862', '0'), +('11', '32', '1', '30361', '2640', '0'), +('11', '32', '1', '10082', '2416', '0'), +('11', '32', '2', '1232', '5523', '0'), +('11', '32', '2', '10143', '5368', '0'), +('11', '32', '2', '1211', '4106', '0'), +('11', '32', '2', '30363', '3700', '0'), +('11', '32', '3', '1544', '7584', '0'), +('11', '32', '3', '11052', '5798', '0'), +('11', '32', '3', '4505', '2736', '0'), +('11', '32', '3', '1212', '1705', '0'), +('11', '32', '5', '14560', '6552', '0'), +('11', '32', '5', '14703', '6050', '0'), +('11', '32', '5', '11646', '4325', '0'), +('11', '32', '5', '10216', '3445', '0'), +('11', '32', '8', '11603', '11789', '0'), +('11', '32', '8', '1278', '7021', '0'), +('11', '32', '8', '2349', '3554', '0'), +('11', '32', '8', '1057', '2131', '0'), +('11', '32', '6', '1279', '8759', '0'), +('11', '32', '6', '1557', '5310', '0'), +('11', '32', '6', '1905', '5069', '0'), +('11', '32', '6', '1645', '2489', '0'), +('11', '32', '17', '11641', '11380', '0'), +('11', '32', '17', '1644', '10299', '0'), +('11', '32', '17', '1253', '10126', '0'), +('11', '32', '17', '1233', '9175', '0'), +('11', '32', '7', '1234', '3186', '0'), +('11', '32', '7', '1218', '3150', '0'), +('11', '32', '7', '1648', '2757', '0'), +('11', '32', '7', '1362', '2624', '0'), +('11', '32', '9', '12804', '6753', '0'), +('11', '32', '9', '27712', '4469', '0'), +('11', '32', '9', '1649', '2678', '0'), +('11', '32', '9', '4344', '2051', '0'), +('11', '32', '15', '27713', '6945', '0'), +('11', '32', '15', '20659', '4260', '0'), +('11', '32', '15', '10150', '3004', '0'), +('11', '32', '15', '10163', '2300', '0'), +('11', '32', '20', '11666', '8341', '0'), +('11', '32', '20', '2742', '5144', '0'), +('11', '32', '20', '2467', '1945', '0'), +('11', '32', '20', '1217', '1713', '0'), +('11', '32', '12', '1236', '4623', '0'), +('11', '32', '12', '20655', '3390', '0'), +('11', '32', '12', '2923', '3074', '0'), +('11', '32', '12', '2336', '2945', '0'), +('11', '32', '18', '1651', '2095', '0'), +('11', '32', '18', '4410', '1142', '0'), +('11', '32', '18', '1221', '454', '0'), +('11', '32', '18', '1237', '436', '0'), +('11', '32', '19', '4407', '3539', '0'), +('11', '32', '19', '68239', '3083', '0'), +('11', '32', '19', '1368', '2016', '0'), +('11', '32', '19', '1652', '1834', '0'), +('11', '32', '13', '14759', '7472', '0'), +('11', '32', '13', '11689', '7026', '0'), +('11', '32', '13', '6359', '4719', '0'), +('11', '32', '13', '13400', '4546', '0'), +('11', '32', '14', '14759', '7472', '0'), +('11', '32', '14', '10219', '5681', '0'), +('11', '32', '14', '6359', '4719', '0'), +('11', '32', '14', '10527', '4500', '0'), +('11', '32', '11', '9246', '3878', '0'), +('11', '32', '11', '13169', '2660', '0'), +('11', '32', '11', '14762', '2204', '0'), +('11', '32', '11', '13353', '1500', '0'), +('11', '33', '22', '10323', '0', '0'), +('11', '33', '22', '9246', '0', '0'), +('11', '33', '22', '21509', '0', '0'), +('11', '33', '22', '8007', '0', '0'), +('11', '33', '1', '14702', '3750', '0'), +('11', '33', '1', '14701', '2862', '0'), +('11', '33', '1', '30361', '2640', '0'), +('11', '33', '1', '10082', '2488', '0'), +('11', '33', '2', '1232', '5619', '0'), +('11', '33', '2', '10143', '5368', '0'), +('11', '33', '2', '1211', '4191', '0'), +('11', '33', '2', '30363', '3700', '0'), +('11', '33', '3', '1544', '7645', '0'), +('11', '33', '3', '11052', '5980', '0'), +('11', '33', '3', '4505', '2821', '0'), +('11', '33', '3', '1212', '1717', '0'), +('11', '33', '5', '14560', '6673', '0'), +('11', '33', '5', '14703', '6050', '0'), +('11', '33', '5', '11646', '4482', '0'), +('11', '33', '5', '10216', '3505', '0'), +('11', '33', '8', '11603', '11898', '0'), +('11', '33', '8', '1278', '7083', '0'), +('11', '33', '8', '2349', '3554', '0'), +('11', '33', '8', '1057', '2192', '0'), +('11', '33', '6', '1279', '8819', '0'), +('11', '33', '6', '1557', '5310', '0'), +('11', '33', '6', '1905', '5070', '0'), +('11', '33', '6', '1645', '2525', '0'), +('11', '33', '17', '11641', '11561', '0'), +('11', '33', '17', '1644', '10360', '0'), +('11', '33', '17', '1253', '10128', '0'), +('11', '33', '17', '1233', '9335', '0'), +('11', '33', '7', '1234', '3271', '0'), +('11', '33', '7', '1218', '3235', '0'), +('11', '33', '7', '1648', '2817', '0'), +('11', '33', '7', '1362', '2624', '0'), +('11', '33', '9', '12804', '6753', '0'), +('11', '33', '9', '27712', '4529', '0'), +('11', '33', '9', '1649', '2714', '0'), +('11', '33', '9', '4344', '2051', '0'), +('11', '33', '15', '27713', '7005', '0'), +('11', '33', '15', '20659', '4296', '0'), +('11', '33', '15', '10150', '3004', '0'), +('11', '33', '15', '10163', '2300', '0'), +('11', '33', '20', '11666', '8343', '0'), +('11', '33', '20', '2742', '5146', '0'), +('11', '33', '20', '2467', '2005', '0'), +('11', '33', '20', '1217', '1725', '0'), +('11', '33', '12', '1236', '4719', '0'), +('11', '33', '12', '20655', '3415', '0'), +('11', '33', '12', '2923', '3074', '0'), +('11', '33', '12', '2336', '3005', '0'), +('11', '33', '18', '1651', '2131', '0'), +('11', '33', '18', '4410', '1142', '0'), +('11', '33', '18', '1221', '454', '0'), +('11', '33', '18', '1237', '436', '0'), +('11', '33', '19', '4407', '3648', '0'), +('11', '33', '19', '68239', '3119', '0'), +('11', '33', '19', '1368', '2016', '0'), +('11', '33', '19', '1652', '1834', '0'), +('11', '33', '13', '14759', '7543', '0'), +('11', '33', '13', '11689', '7116', '0'), +('11', '33', '13', '6359', '4839', '0'), +('11', '33', '13', '13400', '4595', '0'), +('11', '33', '14', '14759', '7543', '0'), +('11', '33', '14', '10219', '5681', '0'), +('11', '33', '14', '6359', '4839', '0'), +('11', '33', '14', '10527', '4500', '0'), +('11', '33', '11', '9246', '3998', '0'), +('11', '33', '11', '13169', '2696', '0'), +('11', '33', '11', '14762', '2204', '0'), +('11', '33', '11', '13353', '1500', '0'), +('11', '34', '22', '10323', '0', '0'), +('11', '34', '22', '9246', '0', '0'), +('11', '34', '22', '21509', '0', '0'), +('11', '34', '22', '8007', '0', '0'), +('11', '34', '1', '14702', '3750', '0'), +('11', '34', '1', '14701', '2862', '0'), +('11', '34', '1', '30361', '2640', '0'), +('11', '34', '1', '10082', '2561', '0'), +('11', '34', '2', '1232', '5716', '0'), +('11', '34', '2', '10143', '5368', '0'), +('11', '34', '2', '1211', '4275', '0'), +('11', '34', '2', '10141', '3709', '0'), +('11', '34', '3', '1544', '7705', '0'), +('11', '34', '3', '11052', '6161', '0'), +('11', '34', '3', '4505', '2905', '0'), +('11', '34', '3', '1212', '1729', '0'), +('11', '34', '5', '14560', '6793', '0'), +('11', '34', '5', '14703', '6050', '0'), +('11', '34', '5', '11646', '4639', '0'), +('11', '34', '5', '10216', '3566', '0'), +('11', '34', '8', '11603', '12007', '0'), +('11', '34', '8', '1278', '7145', '0'), +('11', '34', '8', '2349', '3554', '0'), +('11', '34', '8', '1057', '2252', '0'), +('11', '34', '6', '1279', '8880', '0'), +('11', '34', '6', '1557', '5310', '0'), +('11', '34', '6', '1905', '5071', '0'), +('11', '34', '6', '1645', '2561', '0'), +('11', '34', '17', '11641', '11742', '0'), +('11', '34', '17', '1644', '10420', '0'), +('11', '34', '17', '1253', '10130', '0'), +('11', '34', '17', '1233', '9494', '0'), +('11', '34', '7', '1234', '3355', '0'), +('11', '34', '7', '1218', '3319', '0'), +('11', '34', '7', '1648', '2878', '0'), +('11', '34', '7', '1362', '2624', '0'), +('11', '34', '9', '12804', '6753', '0'), +('11', '34', '9', '27712', '4590', '0'), +('11', '34', '9', '1649', '2750', '0'), +('11', '34', '9', '4408', '2087', '0'), +('11', '34', '15', '27713', '7066', '0'), +('11', '34', '15', '20659', '4332', '0'), +('11', '34', '15', '10150', '3004', '0'), +('11', '34', '15', '10163', '2300', '0'), +('11', '34', '20', '11666', '8344', '0'), +('11', '34', '20', '2742', '5149', '0'), +('11', '34', '20', '2467', '2066', '0'), +('11', '34', '20', '1217', '1737', '0'), +('11', '34', '12', '1236', '4816', '0'), +('11', '34', '12', '20655', '3439', '0'), +('11', '34', '12', '2923', '3074', '0'), +('11', '34', '12', '2336', '3066', '0'), +('11', '34', '18', '1651', '2167', '0'), +('11', '34', '18', '4410', '1142', '0'), +('11', '34', '18', '1221', '454', '0'), +('11', '34', '18', '1237', '436', '0'), +('11', '34', '19', '4407', '3757', '0'), +('11', '34', '19', '68239', '3156', '0'), +('11', '34', '19', '1368', '2016', '0'), +('11', '34', '19', '1652', '1834', '0'), +('11', '34', '13', '14759', '7614', '0'), +('11', '34', '13', '11689', '7207', '0'), +('11', '34', '13', '6359', '4960', '0'), +('11', '34', '13', '13400', '4643', '0'), +('11', '34', '14', '14759', '7614', '0'), +('11', '34', '14', '10219', '5681', '0'), +('11', '34', '14', '6359', '4960', '0'), +('11', '34', '14', '10527', '4500', '0'), +('11', '34', '11', '9246', '4119', '0'), +('11', '34', '11', '13169', '2732', '0'), +('11', '34', '11', '14762', '2204', '0'), +('11', '34', '11', '13353', '1500', '0'), +('11', '35', '22', '10323', '0', '0'), +('11', '35', '22', '9246', '0', '0'), +('11', '35', '22', '21509', '0', '0'), +('11', '35', '22', '8007', '0', '0'), +('11', '35', '1', '14702', '3750', '0'), +('11', '35', '1', '14701', '2862', '0'), +('11', '35', '1', '30361', '2640', '0'), +('11', '35', '1', '10082', '2633', '0'), +('11', '35', '2', '1232', '5813', '0'), +('11', '35', '2', '10143', '5368', '0'), +('11', '35', '2', '1211', '4360', '0'), +('11', '35', '2', '10141', '3817', '0'), +('11', '35', '3', '1544', '7765', '0'), +('11', '35', '3', '11052', '6342', '0'), +('11', '35', '3', '4505', '2990', '0'), +('11', '35', '3', '1212', '1741', '0'), +('11', '35', '5', '14560', '6914', '0'), +('11', '35', '5', '14703', '6050', '0'), +('11', '35', '5', '11646', '4796', '0'), +('11', '35', '5', '10216', '3626', '0'), +('11', '35', '8', '11603', '12116', '0'), +('11', '35', '8', '1278', '7207', '0'), +('11', '35', '8', '2349', '3554', '0'), +('11', '35', '8', '1057', '2312', '0'), +('11', '35', '6', '1279', '8940', '0'), +('11', '35', '6', '1557', '5310', '0'), +('11', '35', '6', '1905', '5072', '0'), +('11', '35', '6', '1645', '2597', '0'), +('11', '35', '17', '11641', '11924', '0'), +('11', '35', '17', '1644', '10480', '0'), +('11', '35', '17', '1253', '10133', '0'), +('11', '35', '17', '1233', '9653', '0'), +('11', '35', '7', '1234', '3440', '0'), +('11', '35', '7', '1218', '3404', '0'), +('11', '35', '7', '1648', '2938', '0'), +('11', '35', '7', '1362', '2624', '0'), +('11', '35', '9', '12804', '6753', '0'), +('11', '35', '9', '27712', '4650', '0'), +('11', '35', '9', '1649', '2787', '0'), +('11', '35', '9', '4408', '2147', '0'), +('11', '35', '15', '27713', '7126', '0'), +('11', '35', '15', '20659', '4368', '0'), +('11', '35', '15', '10150', '3004', '0'), +('11', '35', '15', '10163', '2300', '0'), +('11', '35', '20', '11666', '8346', '0'), +('11', '35', '20', '2742', '5151', '0'), +('11', '35', '20', '2467', '2126', '0'), +('11', '35', '20', '1364', '1783', '0'), +('11', '35', '12', '1236', '4913', '0'), +('11', '35', '12', '20655', '3464', '0'), +('11', '35', '12', '2336', '3126', '0'), +('11', '35', '12', '2923', '3074', '0'), +('11', '35', '18', '1651', '2203', '0'), +('11', '35', '18', '4410', '1142', '0'), +('11', '35', '18', '1221', '454', '0'), +('11', '35', '18', '1237', '436', '0'), +('11', '35', '19', '4407', '3865', '0'), +('11', '35', '19', '68239', '3192', '0'), +('11', '35', '19', '1368', '2016', '0'), +('11', '35', '19', '1652', '1834', '0'), +('11', '35', '13', '14759', '7685', '0'), +('11', '35', '13', '11689', '7297', '0'), +('11', '35', '13', '6359', '5081', '0'), +('11', '35', '13', '13400', '4691', '0'), +('11', '35', '14', '14759', '7685', '0'), +('11', '35', '14', '10219', '5681', '0'), +('11', '35', '14', '6359', '5081', '0'), +('11', '35', '14', '10527', '4500', '0'), +('11', '35', '11', '9246', '4240', '0'), +('11', '35', '11', '13169', '2768', '0'), +('11', '35', '11', '14762', '2204', '0'), +('11', '35', '11', '13353', '1500', '0'), +('11', '36', '22', '10323', '0', '0'), +('11', '36', '22', '9246', '0', '0'), +('11', '36', '22', '21509', '0', '0'), +('11', '36', '22', '8007', '0', '0'), +('11', '36', '1', '14702', '3750', '0'), +('11', '36', '1', '14701', '2862', '0'), +('11', '36', '1', '10082', '2706', '0'), +('11', '36', '1', '30361', '2640', '0'), +('11', '36', '2', '1232', '5909', '0'), +('11', '36', '2', '10143', '5368', '0'), +('11', '36', '2', '1211', '4444', '0'), +('11', '36', '2', '10141', '3926', '0'), +('11', '36', '3', '1544', '7826', '0'), +('11', '36', '3', '11052', '6523', '0'), +('11', '36', '3', '4505', '3074', '0'), +('11', '36', '3', '1212', '1753', '0'), +('11', '36', '5', '14560', '7035', '0'), +('11', '36', '5', '14703', '6050', '0'), +('11', '36', '5', '11646', '4953', '0'), +('11', '36', '5', '10216', '3686', '0'), +('11', '36', '8', '11603', '12224', '0'), +('11', '36', '8', '1278', '7269', '0'), +('11', '36', '8', '2349', '3554', '0'), +('11', '36', '8', '1057', '2373', '0'), +('11', '36', '6', '1279', '9000', '0'), +('11', '36', '6', '1557', '5310', '0'), +('11', '36', '6', '1905', '5074', '0'), +('11', '36', '6', '1645', '2634', '0'), +('11', '36', '17', '11641', '12105', '0'), +('11', '36', '17', '1644', '10541', '0'), +('11', '36', '17', '1253', '10135', '0'), +('11', '36', '17', '1233', '9813', '0'), +('11', '36', '7', '1234', '3524', '0'), +('11', '36', '7', '1218', '3488', '0'), +('11', '36', '7', '1648', '2999', '0'), +('11', '36', '7', '1362', '2624', '0'), +('11', '36', '9', '12804', '6753', '0'), +('11', '36', '9', '27712', '4711', '0'), +('11', '36', '9', '1649', '2823', '0'), +('11', '36', '9', '4408', '2208', '0'), +('11', '36', '15', '27713', '7186', '0'), +('11', '36', '15', '20659', '4405', '0'), +('11', '36', '15', '10150', '3004', '0'), +('11', '36', '15', '10163', '2300', '0'), +('11', '36', '20', '11666', '8348', '0'), +('11', '36', '20', '2742', '5153', '0'), +('11', '36', '20', '2467', '2186', '0'), +('11', '36', '20', '1364', '1832', '0'), +('11', '36', '12', '1236', '5009', '0'), +('11', '36', '12', '20655', '3489', '0'), +('11', '36', '12', '2336', '3186', '0'), +('11', '36', '12', '2923', '3074', '0'), +('11', '36', '18', '1651', '2240', '0'), +('11', '36', '18', '4410', '1142', '0'), +('11', '36', '18', '1221', '454', '0'), +('11', '36', '18', '1237', '436', '0'), +('11', '36', '19', '4407', '3974', '0'), +('11', '36', '19', '68239', '3228', '0'), +('11', '36', '19', '1368', '2016', '0'), +('11', '36', '19', '1652', '1834', '0'), +('11', '36', '13', '14759', '7757', '0'), +('11', '36', '13', '11689', '7388', '0'), +('11', '36', '13', '6359', '5202', '0'), +('11', '36', '13', '13500', '4787', '0'), +('11', '36', '14', '14759', '7757', '0'), +('11', '36', '14', '10219', '5681', '0'), +('11', '36', '14', '6359', '5202', '0'), +('11', '36', '14', '10527', '4500', '0'), +('11', '36', '11', '9246', '4361', '0'), +('11', '36', '11', '13169', '2805', '0'), +('11', '36', '11', '14762', '2204', '0'), +('11', '36', '11', '13353', '1500', '0'), +('11', '37', '22', '10323', '0', '0'), +('11', '37', '22', '9246', '0', '0'), +('11', '37', '22', '21509', '0', '0'), +('11', '37', '22', '8007', '0', '0'), +('11', '37', '1', '14702', '3750', '0'), +('11', '37', '1', '14701', '2862', '0'), +('11', '37', '1', '10082', '2778', '0'), +('11', '37', '1', '30361', '2640', '0'), +('11', '37', '2', '1232', '6006', '0'), +('11', '37', '2', '10143', '5368', '0'), +('11', '37', '2', '1211', '4529', '0'), +('11', '37', '2', '10141', '4035', '0'), +('11', '37', '3', '1544', '7886', '0'), +('11', '37', '3', '11052', '6704', '0'), +('11', '37', '3', '4505', '3159', '0'), +('11', '37', '3', '1212', '1765', '0'), +('11', '37', '5', '14560', '7156', '0'), +('11', '37', '5', '14703', '6050', '0'), +('11', '37', '5', '11646', '5110', '0'), +('11', '37', '5', '10216', '3747', '0'), +('11', '37', '8', '11603', '12333', '0'), +('11', '37', '8', '1278', '7331', '0'), +('11', '37', '8', '2349', '3554', '0'), +('11', '37', '8', '1057', '2433', '0'), +('11', '37', '6', '1279', '9061', '0'), +('11', '37', '6', '1557', '5310', '0'), +('11', '37', '6', '1905', '5075', '0'), +('11', '37', '6', '1645', '2670', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '37', '17', '11641', '12286', '0'), +('11', '37', '17', '1644', '10601', '0'), +('11', '37', '17', '1253', '10138', '0'), +('11', '37', '17', '1233', '9972', '0'), +('11', '37', '7', '1234', '3609', '0'), +('11', '37', '7', '1218', '3573', '0'), +('11', '37', '7', '1648', '3059', '0'), +('11', '37', '7', '1362', '2624', '0'), +('11', '37', '9', '12804', '6753', '0'), +('11', '37', '9', '27712', '4771', '0'), +('11', '37', '9', '1649', '2859', '0'), +('11', '37', '9', '4408', '2268', '0'), +('11', '37', '15', '27713', '7247', '0'), +('11', '37', '15', '20659', '4441', '0'), +('11', '37', '15', '10150', '3004', '0'), +('11', '37', '15', '10163', '2300', '0'), +('11', '37', '20', '11666', '8349', '0'), +('11', '37', '20', '2742', '5156', '0'), +('11', '37', '20', '2467', '2247', '0'), +('11', '37', '20', '1364', '1880', '0'), +('11', '37', '12', '1236', '5106', '0'), +('11', '37', '12', '20655', '3513', '0'), +('11', '37', '12', '2336', '3247', '0'), +('11', '37', '12', '2923', '3074', '0'), +('11', '37', '18', '1651', '2276', '0'), +('11', '37', '18', '4410', '1142', '0'), +('11', '37', '18', '1221', '454', '0'), +('11', '37', '18', '1237', '436', '0'), +('11', '37', '19', '4407', '4083', '0'), +('11', '37', '19', '68239', '3264', '0'), +('11', '37', '19', '1368', '2016', '0'), +('11', '37', '19', '1652', '1834', '0'), +('11', '37', '13', '14759', '7828', '0'), +('11', '37', '13', '11689', '7479', '0'), +('11', '37', '13', '6359', '5323', '0'), +('11', '37', '13', '13500', '4908', '0'), +('11', '37', '14', '14759', '7828', '0'), +('11', '37', '14', '10219', '5681', '0'), +('11', '37', '14', '6359', '5323', '0'), +('11', '37', '14', '10527', '4500', '0'), +('11', '37', '11', '9246', '4482', '0'), +('11', '37', '11', '13169', '2841', '0'), +('11', '37', '11', '14762', '2204', '0'), +('11', '37', '11', '13353', '1500', '0'), +('11', '38', '22', '10323', '0', '0'), +('11', '38', '22', '9246', '0', '0'), +('11', '38', '22', '21509', '0', '0'), +('11', '38', '22', '8007', '0', '0'), +('11', '38', '1', '14702', '3750', '0'), +('11', '38', '1', '14701', '2862', '0'), +('11', '38', '1', '10082', '2850', '0'), +('11', '38', '1', '30361', '2640', '0'), +('11', '38', '2', '1232', '6103', '0'), +('11', '38', '2', '10143', '5368', '0'), +('11', '38', '2', '1211', '4613', '0'), +('11', '38', '2', '10141', '4143', '0'), +('11', '38', '3', '1544', '7947', '0'), +('11', '38', '3', '11052', '6886', '0'), +('11', '38', '3', '4505', '3243', '0'), +('11', '38', '3', '1212', '1777', '0'), +('11', '38', '5', '14560', '7277', '0'), +('11', '38', '5', '14703', '6050', '0'), +('11', '38', '5', '11646', '5268', '0'), +('11', '38', '5', '10216', '3807', '0'), +('11', '38', '8', '11603', '12442', '0'), +('11', '38', '8', '1278', '7393', '0'), +('11', '38', '8', '2349', '3554', '0'), +('11', '38', '8', '1057', '2494', '0'), +('11', '38', '6', '1279', '9121', '0'), +('11', '38', '6', '1557', '5310', '0'), +('11', '38', '6', '1905', '5076', '0'), +('11', '38', '6', '1645', '2706', '0'), +('11', '38', '17', '11641', '12467', '0'), +('11', '38', '17', '1644', '10662', '0'), +('11', '38', '17', '1253', '10140', '0'), +('11', '38', '17', '1233', '10132', '0'), +('11', '38', '7', '1234', '3693', '0'), +('11', '38', '7', '1218', '3657', '0'), +('11', '38', '7', '1648', '3119', '0'), +('11', '38', '7', '1362', '2624', '0'), +('11', '38', '9', '12804', '6753', '0'), +('11', '38', '9', '27712', '4831', '0'), +('11', '38', '9', '1649', '2895', '0'), +('11', '38', '9', '4408', '2328', '0'), +('11', '38', '15', '27713', '7307', '0'), +('11', '38', '15', '20659', '4477', '0'), +('11', '38', '15', '10150', '3004', '0'), +('11', '38', '15', '20789', '2348', '0'), +('11', '38', '20', '11666', '8351', '0'), +('11', '38', '20', '2742', '5158', '0'), +('11', '38', '20', '2467', '2307', '0'), +('11', '38', '20', '1364', '1928', '0'), +('11', '38', '12', '1236', '5203', '0'), +('11', '38', '12', '20655', '3538', '0'), +('11', '38', '12', '2336', '3307', '0'), +('11', '38', '12', '2923', '3074', '0'), +('11', '38', '18', '1651', '2312', '0'), +('11', '38', '18', '4410', '1142', '0'), +('11', '38', '18', '1221', '454', '0'), +('11', '38', '18', '1237', '436', '0'), +('11', '38', '19', '4407', '4192', '0'), +('11', '38', '19', '68239', '3301', '0'), +('11', '38', '19', '1368', '2016', '0'), +('11', '38', '19', '1652', '1834', '0'), +('11', '38', '13', '14759', '7899', '0'), +('11', '38', '13', '11689', '7569', '0'), +('11', '38', '13', '6359', '5443', '0'), +('11', '38', '13', '13500', '5028', '0'), +('11', '38', '14', '14759', '7899', '0'), +('11', '38', '14', '10219', '5681', '0'), +('11', '38', '14', '6359', '5443', '0'), +('11', '38', '14', '9246', '4602', '0'), +('11', '38', '11', '9246', '4602', '0'), +('11', '38', '11', '13169', '2877', '0'), +('11', '38', '11', '14762', '2204', '0'), +('11', '38', '11', '13353', '1500', '0'), +('11', '39', '22', '10323', '0', '0'), +('11', '39', '22', '9246', '0', '0'), +('11', '39', '22', '21509', '0', '0'), +('11', '39', '22', '8007', '0', '0'), +('11', '39', '1', '14702', '3750', '0'), +('11', '39', '1', '10082', '2923', '0'), +('11', '39', '1', '14701', '2862', '0'), +('11', '39', '1', '30361', '2640', '0'), +('11', '39', '2', '1232', '6199', '0'), +('11', '39', '2', '10143', '5368', '0'), +('11', '39', '2', '1211', '4698', '0'), +('11', '39', '2', '10141', '4252', '0'), +('11', '39', '3', '1544', '8007', '0'), +('11', '39', '3', '11052', '7067', '0'), +('11', '39', '3', '4505', '3328', '0'), +('11', '39', '3', '1212', '1789', '0'), +('11', '39', '5', '14560', '7397', '0'), +('11', '39', '5', '14703', '6050', '0'), +('11', '39', '5', '11646', '5425', '0'), +('11', '39', '5', '10216', '3868', '0'), +('11', '39', '8', '11603', '12550', '0'), +('11', '39', '8', '1278', '7454', '0'), +('11', '39', '8', '2349', '3554', '0'), +('11', '39', '8', '1057', '2554', '0'), +('11', '39', '6', '1279', '9182', '0'), +('11', '39', '6', '1557', '5310', '0'), +('11', '39', '6', '1905', '5077', '0'), +('11', '39', '6', '1645', '2742', '0'), +('11', '39', '17', '11641', '12648', '0'), +('11', '39', '17', '1644', '10722', '0'), +('11', '39', '17', '1233', '10291', '0'), +('11', '39', '17', '1253', '10143', '0'), +('11', '39', '7', '1234', '3778', '0'), +('11', '39', '7', '1218', '3742', '0'), +('11', '39', '7', '1648', '3180', '0'), +('11', '39', '7', '1362', '2624', '0'), +('11', '39', '9', '12804', '6753', '0'), +('11', '39', '9', '27712', '4892', '0'), +('11', '39', '9', '1649', '2931', '0'), +('11', '39', '9', '4408', '2389', '0'), +('11', '39', '15', '27713', '7368', '0'), +('11', '39', '15', '20659', '4513', '0'), +('11', '39', '15', '10150', '3004', '0'), +('11', '39', '15', '20789', '2397', '0'), +('11', '39', '20', '11666', '8353', '0'), +('11', '39', '20', '2742', '5161', '0'), +('11', '39', '20', '2467', '2368', '0'), +('11', '39', '20', '1364', '1977', '0'), +('11', '39', '12', '1236', '5299', '0'), +('11', '39', '12', '20655', '3563', '0'), +('11', '39', '12', '2336', '3368', '0'), +('11', '39', '12', '2923', '3074', '0'), +('11', '39', '18', '1651', '2348', '0'), +('11', '39', '18', '4410', '1142', '0'), +('11', '39', '18', '1221', '454', '0'), +('11', '39', '18', '1237', '436', '0'), +('11', '39', '19', '4407', '4300', '0'), +('11', '39', '19', '68239', '3337', '0'), +('11', '39', '19', '1368', '2016', '0'), +('11', '39', '19', '1652', '1834', '0'), +('11', '39', '13', '14759', '7971', '0'), +('11', '39', '13', '11689', '7660', '0'), +('11', '39', '13', '6359', '5564', '0'), +('11', '39', '13', '13500', '5149', '0'), +('11', '39', '14', '14759', '7971', '0'), +('11', '39', '14', '10219', '5681', '0'), +('11', '39', '14', '6359', '5564', '0'), +('11', '39', '14', '9246', '4723', '0'), +('11', '39', '11', '9246', '4723', '0'), +('11', '39', '11', '13169', '2913', '0'), +('11', '39', '11', '14762', '2204', '0'), +('11', '39', '11', '13353', '1500', '0'), +('11', '40', '22', '10323', '0', '0'), +('11', '40', '22', '9246', '0', '0'), +('11', '40', '22', '21509', '0', '0'), +('11', '40', '22', '8007', '0', '0'), +('11', '40', '1', '14702', '3750', '0'), +('11', '40', '1', '10082', '2995', '0'), +('11', '40', '1', '14701', '2862', '0'), +('11', '40', '1', '30361', '2640', '0'), +('11', '40', '2', '1232', '6296', '0'), +('11', '40', '2', '10143', '5368', '0'), +('11', '40', '2', '1211', '4783', '0'), +('11', '40', '2', '10141', '4361', '0'), +('11', '40', '3', '1544', '8067', '0'), +('11', '40', '3', '11052', '7248', '0'), +('11', '40', '3', '4505', '3413', '0'), +('11', '40', '3', '1212', '1801', '0'), +('11', '40', '5', '14560', '7518', '0'), +('11', '40', '5', '14703', '6050', '0'), +('11', '40', '5', '11646', '5582', '0'), +('11', '40', '5', '10216', '3928', '0'), +('11', '40', '8', '11603', '12659', '0'), +('11', '40', '8', '1278', '7516', '0'), +('11', '40', '8', '2349', '3554', '0'), +('11', '40', '8', '1057', '2614', '0'), +('11', '40', '6', '1279', '9242', '0'), +('11', '40', '6', '1557', '5310', '0'), +('11', '40', '6', '1905', '5079', '0'), +('11', '40', '6', '1645', '2779', '0'), +('11', '40', '17', '11641', '12830', '0'), +('11', '40', '17', '1644', '10782', '0'), +('11', '40', '17', '1233', '10451', '0'), +('11', '40', '17', '1253', '10145', '0'), +('11', '40', '7', '1234', '3863', '0'), +('11', '40', '7', '1218', '3827', '0'), +('11', '40', '7', '1648', '3240', '0'), +('11', '40', '7', '1362', '2624', '0'), +('11', '40', '9', '12804', '6753', '0'), +('11', '40', '9', '27712', '4952', '0'), +('11', '40', '9', '1649', '2968', '0'), +('11', '40', '9', '4408', '2449', '0'), +('11', '40', '15', '27713', '7428', '0'), +('11', '40', '15', '20659', '4550', '0'), +('11', '40', '15', '10150', '3004', '0'), +('11', '40', '15', '20789', '2445', '0'), +('11', '40', '20', '11666', '8354', '0'), +('11', '40', '20', '2742', '5163', '0'), +('11', '40', '20', '2467', '2428', '0'), +('11', '40', '20', '1364', '2025', '0'), +('11', '40', '12', '1236', '5396', '0'), +('11', '40', '12', '20655', '3587', '0'), +('11', '40', '12', '2336', '3428', '0'), +('11', '40', '12', '2923', '3074', '0'), +('11', '40', '18', '1651', '2385', '0'), +('11', '40', '18', '4410', '1142', '0'), +('11', '40', '18', '1221', '454', '0'), +('11', '40', '18', '1237', '436', '0'), +('11', '40', '19', '4407', '4409', '0'), +('11', '40', '19', '68239', '3373', '0'), +('11', '40', '19', '1368', '2016', '0'), +('11', '40', '19', '1652', '1834', '0'), +('11', '40', '13', '14759', '8042', '0'), +('11', '40', '13', '11689', '7750', '0'), +('11', '40', '13', '6359', '5685', '0'), +('11', '40', '13', '13500', '5270', '0'), +('11', '40', '14', '14759', '8042', '0'), +('11', '40', '14', '6359', '5685', '0'), +('11', '40', '14', '10219', '5681', '0'), +('11', '40', '14', '9246', '4844', '0'), +('11', '40', '11', '9246', '4844', '0'), +('11', '40', '11', '13169', '2950', '0'), +('11', '40', '11', '14762', '2204', '0'), +('11', '40', '11', '13353', '1500', '0'), +('11', '41', '22', '10323', '0', '0'), +('11', '41', '22', '9246', '0', '0'), +('11', '41', '22', '21509', '0', '0'), +('11', '41', '22', '8007', '0', '0'), +('11', '41', '1', '14702', '3750', '0'), +('11', '41', '1', '10082', '3068', '0'), +('11', '41', '1', '14701', '2862', '0'), +('11', '41', '1', '30361', '2640', '0'), +('11', '41', '2', '1232', '6392', '0'), +('11', '41', '2', '10143', '5368', '0'), +('11', '41', '2', '1211', '4867', '0'), +('11', '41', '2', '10141', '4470', '0'), +('11', '41', '3', '1544', '8128', '0'), +('11', '41', '3', '11052', '7429', '0'), +('11', '41', '3', '4505', '3497', '0'), +('11', '41', '3', '1212', '1813', '0'), +('11', '41', '5', '14560', '7639', '0'), +('11', '41', '5', '14703', '6050', '0'), +('11', '41', '5', '11646', '5739', '0'), +('11', '41', '5', '10216', '3988', '0'), +('11', '41', '8', '11603', '12768', '0'), +('11', '41', '8', '1278', '7578', '0'), +('11', '41', '8', '2349', '3554', '0'), +('11', '41', '8', '1057', '2675', '0'), +('11', '41', '6', '1279', '9302', '0'), +('11', '41', '6', '1557', '5310', '0'), +('11', '41', '6', '1905', '5080', '0'), +('11', '41', '6', '1645', '2815', '0'), +('11', '41', '17', '11641', '13011', '0'), +('11', '41', '17', '1644', '10843', '0'), +('11', '41', '17', '1233', '10610', '0'), +('11', '41', '17', '1253', '10147', '0'), +('11', '41', '7', '1234', '3947', '0'), +('11', '41', '7', '1218', '3911', '0'), +('11', '41', '7', '1648', '3301', '0'), +('11', '41', '7', '1362', '2624', '0'), +('11', '41', '9', '12804', '6753', '0'), +('11', '41', '9', '27712', '5013', '0'), +('11', '41', '9', '1649', '3004', '0'), +('11', '41', '9', '4408', '2510', '0'), +('11', '41', '15', '27713', '7488', '0'), +('11', '41', '15', '20659', '4586', '0'), +('11', '41', '15', '10150', '3004', '0'), +('11', '41', '15', '20789', '2493', '0'), +('11', '41', '20', '11666', '8356', '0'), +('11', '41', '20', '2742', '5165', '0'), +('11', '41', '20', '2467', '2488', '0'), +('11', '41', '20', '1364', '2073', '0'), +('11', '41', '12', '1236', '5492', '0'), +('11', '41', '12', '20655', '3612', '0'), +('11', '41', '12', '2336', '3488', '0'), +('11', '41', '12', '2923', '3074', '0'), +('11', '41', '18', '1651', '2421', '0'), +('11', '41', '18', '4410', '1142', '0'), +('11', '41', '18', '1221', '454', '0'), +('11', '41', '18', '1237', '436', '0'), +('11', '41', '19', '4407', '4518', '0'), +('11', '41', '19', '68239', '3409', '0'), +('11', '41', '19', '1368', '2016', '0'), +('11', '41', '19', '1652', '1834', '0'), +('11', '41', '13', '14759', '8113', '0'), +('11', '41', '13', '11689', '7841', '0'), +('11', '41', '13', '6359', '5806', '0'), +('11', '41', '13', '13500', '5391', '0'), +('11', '41', '14', '14759', '8113', '0'), +('11', '41', '14', '6359', '5806', '0'), +('11', '41', '14', '10219', '5681', '0'), +('11', '41', '14', '9246', '4965', '0'), +('11', '41', '11', '9246', '4965', '0'), +('11', '41', '11', '13169', '2986', '0'), +('11', '41', '11', '14762', '2204', '0'), +('11', '41', '11', '13353', '1500', '0'), +('11', '42', '22', '10323', '0', '0'), +('11', '42', '22', '9246', '0', '0'), +('11', '42', '22', '21509', '0', '0'), +('11', '42', '22', '8007', '0', '0'), +('11', '42', '1', '14702', '3750', '0'), +('11', '42', '1', '10082', '3140', '0'), +('11', '42', '1', '14701', '2862', '0'), +('11', '42', '1', '30361', '2640', '0'), +('11', '42', '2', '1232', '6489', '0'), +('11', '42', '2', '10143', '5368', '0'), +('11', '42', '2', '1211', '4952', '0'), +('11', '42', '2', '10141', '4578', '0'), +('11', '42', '3', '1544', '8188', '0'), +('11', '42', '3', '11052', '7610', '0'), +('11', '42', '3', '4505', '3582', '0'), +('11', '42', '3', '1212', '1825', '0'), +('11', '42', '5', '14560', '7760', '0'), +('11', '42', '5', '14703', '6050', '0'), +('11', '42', '5', '11646', '5896', '0'), +('11', '42', '5', '10216', '4049', '0'), +('11', '42', '8', '11603', '12877', '0'), +('11', '42', '8', '1278', '7640', '0'), +('11', '42', '8', '2349', '3554', '0'), +('11', '42', '8', '1057', '2735', '0'), +('11', '42', '6', '1279', '9363', '0'), +('11', '42', '6', '1557', '5310', '0'), +('11', '42', '6', '1905', '5081', '0'), +('11', '42', '6', '1645', '2851', '0'), +('11', '42', '17', '11641', '13192', '0'), +('11', '42', '17', '1644', '10903', '0'), +('11', '42', '17', '1233', '10770', '0'), +('11', '42', '17', '1214', '10299', '0'), +('11', '42', '7', '1234', '4032', '0'), +('11', '42', '7', '1218', '3996', '0'), +('11', '42', '7', '1648', '3361', '0'), +('11', '42', '7', '1362', '2624', '0'), +('11', '42', '9', '12804', '6753', '0'), +('11', '42', '9', '27712', '5073', '0'), +('11', '42', '9', '1649', '3040', '0'), +('11', '42', '9', '4408', '2570', '0'), +('11', '42', '15', '27713', '7549', '0'), +('11', '42', '15', '20659', '4622', '0'), +('11', '42', '15', '10150', '3004', '0'), +('11', '42', '15', '20789', '2542', '0'), +('11', '42', '20', '11666', '8358', '0'), +('11', '42', '20', '2742', '5168', '0'), +('11', '42', '20', '2467', '2549', '0'), +('11', '42', '20', '1364', '2122', '0'), +('11', '42', '12', '1236', '5589', '0'), +('11', '42', '12', '20655', '3636', '0'), +('11', '42', '12', '2336', '3549', '0'), +('11', '42', '12', '2923', '3074', '0'), +('11', '42', '18', '1651', '2457', '0'), +('11', '42', '18', '4410', '1142', '0'), +('11', '42', '18', '1221', '454', '0'), +('11', '42', '18', '1237', '436', '0'), +('11', '42', '19', '4407', '4626', '0'), +('11', '42', '19', '68239', '3446', '0'), +('11', '42', '19', '1368', '2016', '0'), +('11', '42', '19', '1652', '1834', '0'), +('11', '42', '13', '14759', '8184', '0'), +('11', '42', '13', '11689', '7932', '0'), +('11', '42', '13', '6359', '5927', '0'), +('11', '42', '13', '13500', '5512', '0'), +('11', '42', '14', '14759', '8184', '0'), +('11', '42', '14', '6359', '5927', '0'), +('11', '42', '14', '10219', '5681', '0'), +('11', '42', '14', '9246', '5086', '0'), +('11', '42', '11', '9246', '5086', '0'), +('11', '42', '11', '13169', '3022', '0'), +('11', '42', '11', '14762', '2204', '0'), +('11', '42', '11', '13353', '1500', '0'), +('11', '43', '22', '10323', '0', '0'), +('11', '43', '22', '9246', '0', '0'), +('11', '43', '22', '21509', '0', '0'), +('11', '43', '22', '8007', '0', '0'), +('11', '43', '1', '14702', '3750', '0'), +('11', '43', '1', '10082', '3213', '0'), +('11', '43', '1', '14701', '2862', '0'), +('11', '43', '1', '30361', '2640', '0'), +('11', '43', '2', '1232', '6586', '0'), +('11', '43', '2', '10143', '5368', '0'), +('11', '43', '2', '1211', '5036', '0'), +('11', '43', '2', '10141', '4687', '0'), +('11', '43', '3', '1544', '8249', '0'), +('11', '43', '3', '11052', '7792', '0'), +('11', '43', '3', '4505', '3666', '0'), +('11', '43', '3', '1212', '1838', '0'), +('11', '43', '5', '14560', '7881', '0'), +('11', '43', '5', '11646', '6053', '0'), +('11', '43', '5', '14703', '6050', '0'), +('11', '43', '5', '10216', '4109', '0'), +('11', '43', '8', '11603', '12985', '0'), +('11', '43', '8', '1278', '7702', '0'), +('11', '43', '8', '2349', '3554', '0'), +('11', '43', '8', '1057', '2796', '0'), +('11', '43', '6', '1279', '9423', '0'), +('11', '43', '6', '1557', '5310', '0'), +('11', '43', '6', '1905', '5082', '0'), +('11', '43', '6', '1645', '2887', '0'), +('11', '43', '17', '11641', '13373', '0'), +('11', '43', '17', '1644', '10964', '0'), +('11', '43', '17', '1233', '10929', '0'), +('11', '43', '17', '1214', '10460', '0'), +('11', '43', '7', '1234', '4116', '0'), +('11', '43', '7', '1218', '4080', '0'), +('11', '43', '7', '1648', '3421', '0'), +('11', '43', '7', '1362', '2624', '0'), +('11', '43', '9', '12804', '6753', '0'), +('11', '43', '9', '27712', '5133', '0'), +('11', '43', '9', '1649', '3076', '0'), +('11', '43', '9', '4408', '2630', '0'), +('11', '43', '15', '27713', '7609', '0'), +('11', '43', '15', '20659', '4658', '0'), +('11', '43', '15', '10150', '3004', '0'), +('11', '43', '15', '20789', '2590', '0'), +('11', '43', '20', '11666', '8360', '0'), +('11', '43', '20', '2742', '5170', '0'), +('11', '43', '20', '2467', '2609', '0'), +('11', '43', '20', '1364', '2170', '0'), +('11', '43', '12', '1236', '5686', '0'), +('11', '43', '12', '20655', '3661', '0'), +('11', '43', '12', '2336', '3609', '0'), +('11', '43', '12', '2923', '3074', '0'), +('11', '43', '18', '1651', '2493', '0'), +('11', '43', '18', '4410', '1142', '0'), +('11', '43', '18', '1221', '454', '0'), +('11', '43', '18', '1237', '436', '0'), +('11', '43', '19', '4407', '4735', '0'), +('11', '43', '19', '68239', '3482', '0'), +('11', '43', '19', '1368', '2016', '0'), +('11', '43', '19', '1652', '1834', '0'), +('11', '43', '13', '14759', '8256', '0'), +('11', '43', '13', '11689', '8022', '0'), +('11', '43', '13', '6359', '6047', '0'), +('11', '43', '13', '13500', '5632', '0'), +('11', '43', '14', '14759', '8256', '0'), +('11', '43', '14', '6359', '6047', '0'), +('11', '43', '14', '10219', '5681', '0'), +('11', '43', '14', '9246', '5206', '0'), +('11', '43', '11', '9246', '5206', '0'), +('11', '43', '11', '13169', '3058', '0'), +('11', '43', '11', '14762', '2204', '0'), +('11', '43', '11', '13353', '1500', '0'), +('11', '44', '22', '10323', '0', '0'), +('11', '44', '22', '9246', '0', '0'), +('11', '44', '22', '21509', '0', '0'), +('11', '44', '22', '8007', '0', '0'), +('11', '44', '1', '14702', '3750', '0'), +('11', '44', '1', '10082', '3285', '0'), +('11', '44', '1', '14701', '2862', '0'), +('11', '44', '1', '10107', '2658', '0'), +('11', '44', '2', '1232', '6682', '0'), +('11', '44', '2', '10143', '5368', '0'), +('11', '44', '2', '1211', '5121', '0'), +('11', '44', '2', '10141', '4796', '0'), +('11', '44', '3', '1544', '8309', '0'), +('11', '44', '3', '11052', '7973', '0'), +('11', '44', '3', '4505', '3751', '0'), +('11', '44', '3', '1212', '1850', '0'), +('11', '44', '5', '14560', '8001', '0'), +('11', '44', '5', '11646', '6210', '0'), +('11', '44', '5', '14703', '6050', '0'), +('11', '44', '5', '10216', '4170', '0'), +('11', '44', '8', '11603', '13094', '0'), +('11', '44', '8', '1278', '7764', '0'), +('11', '44', '8', '2349', '3554', '0'), +('11', '44', '8', '1057', '2856', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '44', '6', '1279', '9484', '0'), +('11', '44', '6', '1557', '5310', '0'), +('11', '44', '6', '1905', '5083', '0'), +('11', '44', '6', '1645', '2924', '0'), +('11', '44', '17', '11641', '13554', '0'), +('11', '44', '17', '1233', '11089', '0'), +('11', '44', '17', '1644', '11024', '0'), +('11', '44', '17', '1214', '10620', '0'), +('11', '44', '7', '1234', '4201', '0'), +('11', '44', '7', '1218', '4165', '0'), +('11', '44', '7', '1648', '3482', '0'), +('11', '44', '7', '1362', '2624', '0'), +('11', '44', '9', '12804', '6753', '0'), +('11', '44', '9', '27712', '5194', '0'), +('11', '44', '9', '1649', '3113', '0'), +('11', '44', '9', '4408', '2691', '0'), +('11', '44', '15', '27713', '7670', '0'), +('11', '44', '15', '20659', '4695', '0'), +('11', '44', '15', '10150', '3004', '0'), +('11', '44', '15', '20789', '2638', '0'), +('11', '44', '20', '11666', '8361', '0'), +('11', '44', '20', '2742', '5173', '0'), +('11', '44', '20', '2467', '2670', '0'), +('11', '44', '20', '1364', '2218', '0'), +('11', '44', '12', '1236', '5782', '0'), +('11', '44', '12', '20655', '3686', '0'), +('11', '44', '12', '2336', '3670', '0'), +('11', '44', '12', '2923', '3074', '0'), +('11', '44', '18', '1651', '2530', '0'), +('11', '44', '18', '4410', '1142', '0'), +('11', '44', '18', '1221', '454', '0'), +('11', '44', '18', '1237', '436', '0'), +('11', '44', '19', '4407', '4844', '0'), +('11', '44', '19', '68239', '3518', '0'), +('11', '44', '19', '1368', '2016', '0'), +('11', '44', '19', '1652', '1834', '0'), +('11', '44', '13', '14759', '8327', '0'), +('11', '44', '13', '11689', '8113', '0'), +('11', '44', '13', '6359', '6168', '0'), +('11', '44', '13', '13500', '5753', '0'), +('11', '44', '14', '14759', '8327', '0'), +('11', '44', '14', '6359', '6168', '0'), +('11', '44', '14', '10219', '5681', '0'), +('11', '44', '14', '9246', '5327', '0'), +('11', '44', '11', '9246', '5327', '0'), +('11', '44', '11', '13169', '3095', '0'), +('11', '44', '11', '14762', '2204', '0'), +('11', '44', '11', '13353', '1500', '0'), +('11', '45', '22', '10323', '0', '0'), +('11', '45', '22', '9246', '0', '0'), +('11', '45', '22', '21509', '0', '0'), +('11', '45', '22', '8007', '0', '0'), +('11', '45', '1', '14702', '3750', '0'), +('11', '45', '1', '10082', '3358', '0'), +('11', '45', '1', '14701', '2862', '0'), +('11', '45', '1', '10107', '2718', '0'), +('11', '45', '2', '1232', '6779', '0'), +('11', '45', '2', '10143', '5368', '0'), +('11', '45', '2', '1211', '5205', '0'), +('11', '45', '2', '10141', '4904', '0'), +('11', '45', '3', '1544', '8369', '0'), +('11', '45', '3', '11052', '8154', '0'), +('11', '45', '3', '4505', '3835', '0'), +('11', '45', '3', '1212', '1862', '0'), +('11', '45', '5', '14560', '8122', '0'), +('11', '45', '5', '11646', '6367', '0'), +('11', '45', '5', '14703', '6050', '0'), +('11', '45', '5', '10216', '4230', '0'), +('11', '45', '8', '11603', '13203', '0'), +('11', '45', '8', '1278', '7826', '0'), +('11', '45', '8', '2349', '3554', '0'), +('11', '45', '8', '1057', '2916', '0'), +('11', '45', '6', '1279', '9544', '0'), +('11', '45', '6', '1557', '5310', '0'), +('11', '45', '6', '1905', '5085', '0'), +('11', '45', '6', '1645', '2960', '0'), +('11', '45', '17', '11641', '13736', '0'), +('11', '45', '17', '1233', '11248', '0'), +('11', '45', '17', '1644', '11084', '0'), +('11', '45', '17', '1214', '10780', '0'), +('11', '45', '7', '1234', '4285', '0'), +('11', '45', '7', '1218', '4249', '0'), +('11', '45', '7', '1648', '3542', '0'), +('11', '45', '7', '1362', '2624', '0'), +('11', '45', '9', '12804', '6753', '0'), +('11', '45', '9', '27712', '5254', '0'), +('11', '45', '9', '1649', '3149', '0'), +('11', '45', '9', '4408', '2751', '0'), +('11', '45', '15', '27713', '7730', '0'), +('11', '45', '15', '20659', '4731', '0'), +('11', '45', '15', '10150', '3004', '0'), +('11', '45', '15', '20789', '2686', '0'), +('11', '45', '20', '11666', '8363', '0'), +('11', '45', '20', '2742', '5175', '0'), +('11', '45', '20', '2467', '2730', '0'), +('11', '45', '20', '1364', '2266', '0'), +('11', '45', '12', '1236', '5879', '0'), +('11', '45', '12', '2336', '3730', '0'), +('11', '45', '12', '20655', '3710', '0'), +('11', '45', '12', '1650', '3103', '0'), +('11', '45', '18', '1651', '2566', '0'), +('11', '45', '18', '4410', '1142', '0'), +('11', '45', '18', '1221', '454', '0'), +('11', '45', '18', '1237', '436', '0'), +('11', '45', '19', '4407', '4953', '0'), +('11', '45', '19', '68239', '3554', '0'), +('11', '45', '19', '1368', '2016', '0'), +('11', '45', '19', '1652', '1834', '0'), +('11', '45', '13', '14759', '8398', '0'), +('11', '45', '13', '11689', '8203', '0'), +('11', '45', '13', '6359', '6289', '0'), +('11', '45', '13', '13500', '5874', '0'), +('11', '45', '14', '14759', '8398', '0'), +('11', '45', '14', '6359', '6289', '0'), +('11', '45', '14', '10219', '5681', '0'), +('11', '45', '14', '9246', '5448', '0'), +('11', '45', '11', '9246', '5448', '0'), +('11', '45', '11', '13169', '3131', '0'), +('11', '45', '11', '14762', '2204', '0'), +('11', '45', '11', '13353', '1500', '0'), +('11', '46', '22', '10323', '0', '0'), +('11', '46', '22', '9246', '0', '0'), +('11', '46', '22', '21509', '0', '0'), +('11', '46', '22', '8007', '0', '0'), +('11', '46', '1', '14702', '3750', '0'), +('11', '46', '1', '10082', '3430', '0'), +('11', '46', '1', '14701', '2862', '0'), +('11', '46', '1', '10107', '2778', '0'), +('11', '46', '2', '1232', '6876', '0'), +('11', '46', '2', '10143', '5368', '0'), +('11', '46', '2', '1211', '5290', '0'), +('11', '46', '2', '10141', '5013', '0'), +('11', '46', '3', '1544', '8430', '0'), +('11', '46', '3', '11052', '8335', '0'), +('11', '46', '3', '4505', '3920', '0'), +('11', '46', '3', '1212', '1874', '0'), +('11', '46', '5', '14560', '8243', '0'), +('11', '46', '5', '11646', '6524', '0'), +('11', '46', '5', '14703', '6050', '0'), +('11', '46', '5', '10216', '4290', '0'), +('11', '46', '8', '11603', '13312', '0'), +('11', '46', '8', '1278', '7887', '0'), +('11', '46', '8', '2349', '3554', '0'), +('11', '46', '8', '1057', '2977', '0'), +('11', '46', '6', '1279', '9604', '0'), +('11', '46', '6', '1557', '5310', '0'), +('11', '46', '6', '1905', '5086', '0'), +('11', '46', '6', '1645', '2996', '0'), +('11', '46', '17', '11641', '13917', '0'), +('11', '46', '17', '1233', '11407', '0'), +('11', '46', '17', '1644', '11145', '0'), +('11', '46', '17', '1214', '10940', '0'), +('11', '46', '7', '1234', '4370', '0'), +('11', '46', '7', '1218', '4334', '0'), +('11', '46', '7', '1648', '3603', '0'), +('11', '46', '7', '1362', '2624', '0'), +('11', '46', '9', '12804', '6753', '0'), +('11', '46', '9', '27712', '5315', '0'), +('11', '46', '9', '1649', '3185', '0'), +('11', '46', '9', '4408', '2812', '0'), +('11', '46', '15', '27713', '7790', '0'), +('11', '46', '15', '20659', '4767', '0'), +('11', '46', '15', '10150', '3004', '0'), +('11', '46', '15', '20789', '2735', '0'), +('11', '46', '20', '11666', '8365', '0'), +('11', '46', '20', '2742', '5178', '0'), +('11', '46', '20', '2467', '2790', '0'), +('11', '46', '20', '1364', '2315', '0'), +('11', '46', '12', '1236', '5976', '0'), +('11', '46', '12', '2336', '3790', '0'), +('11', '46', '12', '20655', '3735', '0'), +('11', '46', '12', '1650', '3152', '0'), +('11', '46', '18', '1651', '2602', '0'), +('11', '46', '18', '4410', '1142', '0'), +('11', '46', '18', '1221', '454', '0'), +('11', '46', '18', '1237', '436', '0'), +('11', '46', '19', '4407', '5061', '0'), +('11', '46', '19', '68239', '3590', '0'), +('11', '46', '19', '1368', '2016', '0'), +('11', '46', '19', '1652', '1834', '0'), +('11', '46', '13', '14759', '8469', '0'), +('11', '46', '13', '11689', '8294', '0'), +('11', '46', '13', '6359', '6410', '0'), +('11', '46', '13', '13500', '5995', '0'), +('11', '46', '14', '14759', '8469', '0'), +('11', '46', '14', '6359', '6410', '0'), +('11', '46', '14', '10219', '5681', '0'), +('11', '46', '14', '9246', '5569', '0'), +('11', '46', '11', '9246', '5569', '0'), +('11', '46', '11', '13169', '3167', '0'), +('11', '46', '11', '14762', '2204', '0'), +('11', '46', '11', '13353', '1500', '0'), +('11', '47', '22', '10323', '0', '0'), +('11', '47', '22', '9246', '0', '0'), +('11', '47', '22', '21509', '0', '0'), +('11', '47', '22', '8007', '0', '0'), +('11', '47', '1', '14702', '3750', '0'), +('11', '47', '1', '10082', '3503', '0'), +('11', '47', '1', '14701', '2862', '0'), +('11', '47', '1', '10107', '2839', '0'), +('11', '47', '2', '1232', '6972', '0'), +('11', '47', '2', '1211', '5375', '0'), +('11', '47', '2', '10143', '5368', '0'), +('11', '47', '2', '10141', '5122', '0'), +('11', '47', '3', '11052', '8516', '0'), +('11', '47', '3', '1544', '8490', '0'), +('11', '47', '3', '4505', '4005', '0'), +('11', '47', '3', '1212', '1886', '0'), +('11', '47', '5', '14560', '8364', '0'), +('11', '47', '5', '11646', '6681', '0'), +('11', '47', '5', '14703', '6050', '0'), +('11', '47', '5', '10216', '4351', '0'), +('11', '47', '8', '11603', '13420', '0'), +('11', '47', '8', '1278', '7949', '0'), +('11', '47', '8', '2349', '3554', '0'), +('11', '47', '8', '1057', '3037', '0'), +('11', '47', '6', '1279', '9665', '0'), +('11', '47', '6', '1557', '5310', '0'), +('11', '47', '6', '1905', '5087', '0'), +('11', '47', '6', '1645', '3032', '0'), +('11', '47', '17', '11641', '14098', '0'), +('11', '47', '17', '1233', '11567', '0'), +('11', '47', '17', '1644', '11205', '0'), +('11', '47', '17', '1214', '11100', '0'), +('11', '47', '7', '1234', '4455', '0'), +('11', '47', '7', '1218', '4418', '0'), +('11', '47', '7', '1648', '3663', '0'), +('11', '47', '7', '1362', '2624', '0'), +('11', '47', '9', '12804', '6753', '0'), +('11', '47', '9', '27712', '5375', '0'), +('11', '47', '9', '1649', '3221', '0'), +('11', '47', '9', '4408', '2872', '0'), +('11', '47', '15', '27713', '7851', '0'), +('11', '47', '15', '20659', '4803', '0'), +('11', '47', '15', '10150', '3004', '0'), +('11', '47', '15', '20789', '2783', '0'), +('11', '47', '20', '11666', '8366', '0'), +('11', '47', '20', '2742', '5180', '0'), +('11', '47', '20', '2467', '2851', '0'), +('11', '47', '20', '1364', '2363', '0'), +('11', '47', '12', '1236', '6072', '0'), +('11', '47', '12', '2336', '3851', '0'), +('11', '47', '12', '20655', '3760', '0'), +('11', '47', '12', '4345', '3211', '0'), +('11', '47', '18', '1651', '2638', '0'), +('11', '47', '18', '4410', '1142', '0'), +('11', '47', '18', '1221', '454', '0'), +('11', '47', '18', '1237', '436', '0'), +('11', '47', '19', '4407', '5170', '0'), +('11', '47', '19', '68239', '3627', '0'), +('11', '47', '19', '1368', '2016', '0'), +('11', '47', '19', '1652', '1834', '0'), +('11', '47', '13', '14759', '8541', '0'), +('11', '47', '13', '11689', '8385', '0'), +('11', '47', '13', '6359', '6531', '0'), +('11', '47', '13', '13500', '6116', '0'), +('11', '47', '14', '14759', '8541', '0'), +('11', '47', '14', '6359', '6531', '0'), +('11', '47', '14', '9246', '5690', '0'), +('11', '47', '14', '10219', '5681', '0'), +('11', '47', '11', '9246', '5690', '0'), +('11', '47', '11', '13169', '3203', '0'), +('11', '47', '11', '14762', '2204', '0'), +('11', '47', '11', '13353', '1500', '0'), +('11', '48', '22', '10323', '0', '0'), +('11', '48', '22', '9246', '0', '0'), +('11', '48', '22', '21509', '0', '0'), +('11', '48', '22', '8007', '0', '0'), +('11', '48', '1', '14702', '3750', '0'), +('11', '48', '1', '10082', '3575', '0'), +('11', '48', '1', '10107', '2899', '0'), +('11', '48', '1', '14701', '2862', '0'), +('11', '48', '2', '1232', '7069', '0'), +('11', '48', '2', '1211', '5459', '0'), +('11', '48', '2', '10143', '5368', '0'), +('11', '48', '2', '10141', '5231', '0'), +('11', '48', '3', '11052', '8698', '0'), +('11', '48', '3', '1544', '8551', '0'), +('11', '48', '3', '4505', '4089', '0'), +('11', '48', '3', '1212', '1898', '0'), +('11', '48', '5', '14560', '8485', '0'), +('11', '48', '5', '11646', '6838', '0'), +('11', '48', '5', '14703', '6050', '0'), +('11', '48', '5', '10216', '4411', '0'), +('11', '48', '8', '11603', '13529', '0'), +('11', '48', '8', '1278', '8011', '0'), +('11', '48', '8', '2349', '3554', '0'), +('11', '48', '8', '1057', '3098', '0'), +('11', '48', '6', '1279', '9725', '0'), +('11', '48', '6', '1557', '5310', '0'), +('11', '48', '6', '1905', '5088', '0'), +('11', '48', '6', '1645', '3069', '0'), +('11', '48', '17', '11641', '14279', '0'), +('11', '48', '17', '1233', '11726', '0'), +('11', '48', '17', '1644', '11266', '0'), +('11', '48', '17', '1214', '11261', '0'), +('11', '48', '7', '1234', '4539', '0'), +('11', '48', '7', '1218', '4503', '0'), +('11', '48', '7', '1648', '3723', '0'), +('11', '48', '7', '1362', '2624', '0'), +('11', '48', '9', '12804', '6753', '0'), +('11', '48', '9', '27712', '5435', '0'), +('11', '48', '9', '1649', '3258', '0'), +('11', '48', '9', '4408', '2932', '0'), +('11', '48', '15', '27713', '7911', '0'), +('11', '48', '15', '20659', '4840', '0'), +('11', '48', '15', '10150', '3004', '0'), +('11', '48', '15', '20789', '2831', '0'), +('11', '48', '20', '11666', '8368', '0'), +('11', '48', '20', '2742', '5182', '0'), +('11', '48', '20', '2467', '2911', '0'), +('11', '48', '20', '1364', '2411', '0'), +('11', '48', '12', '1236', '6169', '0'), +('11', '48', '12', '2336', '3911', '0'), +('11', '48', '12', '20655', '3784', '0'), +('11', '48', '12', '4345', '3272', '0'), +('11', '48', '18', '1651', '2675', '0'), +('11', '48', '18', '4410', '1142', '0'), +('11', '48', '18', '1221', '454', '0'), +('11', '48', '18', '1237', '436', '0'), +('11', '48', '19', '4407', '5279', '0'), +('11', '48', '19', '68239', '3663', '0'), +('11', '48', '19', '1368', '2016', '0'), +('11', '48', '19', '1652', '1834', '0'), +('11', '48', '13', '14759', '8612', '0'), +('11', '48', '13', '11689', '8475', '0'), +('11', '48', '13', '6359', '6651', '0'), +('11', '48', '13', '13500', '6236', '0'), +('11', '48', '14', '14759', '8612', '0'), +('11', '48', '14', '6359', '6651', '0'), +('11', '48', '14', '9246', '5810', '0'), +('11', '48', '14', '10219', '5681', '0'), +('11', '48', '11', '9246', '5810', '0'), +('11', '48', '11', '13169', '3240', '0'), +('11', '48', '11', '14762', '2204', '0'), +('11', '48', '11', '13353', '1500', '0'), +('11', '49', '22', '10323', '0', '0'), +('11', '49', '22', '9246', '0', '0'), +('11', '49', '22', '21509', '0', '0'), +('11', '49', '22', '8007', '0', '0'), +('11', '49', '1', '14702', '3750', '0'), +('11', '49', '1', '10082', '3648', '0'), +('11', '49', '1', '10107', '2960', '0'), +('11', '49', '1', '14701', '2862', '0'), +('11', '49', '2', '1232', '7166', '0'), +('11', '49', '2', '1211', '5544', '0'), +('11', '49', '2', '10143', '5368', '0'), +('11', '49', '2', '10141', '5339', '0'), +('11', '49', '3', '11052', '8879', '0'), +('11', '49', '3', '1544', '8611', '0'), +('11', '49', '3', '4505', '4174', '0'), +('11', '49', '3', '1212', '1910', '0'), +('11', '49', '5', '14560', '8605', '0'), +('11', '49', '5', '11646', '6995', '0'), +('11', '49', '5', '14703', '6050', '0'), +('11', '49', '5', '10216', '4472', '0'), +('11', '49', '8', '11603', '13638', '0'), +('11', '49', '8', '1278', '8073', '0'), +('11', '49', '8', '2349', '3554', '0'), +('11', '49', '8', '1057', '3158', '0'), +('11', '49', '6', '1279', '9786', '0'), +('11', '49', '6', '1557', '5310', '0'), +('11', '49', '6', '1905', '5089', '0'), +('11', '49', '6', '1645', '3105', '0'), +('11', '49', '17', '11641', '14460', '0'), +('11', '49', '17', '1233', '11886', '0'), +('11', '49', '17', '1214', '11421', '0'), +('11', '49', '17', '1644', '11326', '0'), +('11', '49', '7', '1234', '4624', '0'), +('11', '49', '7', '1218', '4588', '0'), +('11', '49', '7', '1648', '3784', '0'), +('11', '49', '7', '1362', '2624', '0'), +('11', '49', '9', '12804', '6753', '0'), +('11', '49', '9', '27712', '5496', '0'), +('11', '49', '9', '1649', '3294', '0'), +('11', '49', '9', '4408', '2993', '0'), +('11', '49', '15', '27713', '7972', '0'), +('11', '49', '15', '20659', '4876', '0'), +('11', '49', '15', '10150', '3004', '0'), +('11', '49', '15', '20789', '2880', '0'), +('11', '49', '20', '11666', '8370', '0'), +('11', '49', '20', '2742', '5185', '0'), +('11', '49', '20', '2467', '2972', '0'), +('11', '49', '20', '1364', '2460', '0'), +('11', '49', '12', '1236', '6266', '0'), +('11', '49', '12', '2336', '3972', '0'), +('11', '49', '12', '20655', '3809', '0'), +('11', '49', '12', '4345', '3332', '0'), +('11', '49', '18', '1651', '2711', '0'), +('11', '49', '18', '4410', '1142', '0'), +('11', '49', '18', '1221', '454', '0'), +('11', '49', '18', '1237', '436', '0'), +('11', '49', '19', '4407', '5387', '0'), +('11', '49', '19', '68239', '3699', '0'), +('11', '49', '19', '1368', '2016', '0'), +('11', '49', '19', '1652', '1834', '0'), +('11', '49', '13', '14759', '8683', '0'), +('11', '49', '13', '11689', '8566', '0'), +('11', '49', '13', '6359', '6772', '0'), +('11', '49', '13', '13500', '6357', '0'), +('11', '49', '14', '14759', '8683', '0'), +('11', '49', '14', '6359', '6772', '0'), +('11', '49', '14', '9246', '5931', '0'), +('11', '49', '14', '10219', '5681', '0'), +('11', '49', '11', '9246', '5931', '0'), +('11', '49', '11', '13169', '3276', '0'), +('11', '49', '11', '14762', '2204', '0'), +('11', '49', '11', '13353', '1500', '0'), +('11', '50', '22', '10323', '0', '0'), +('11', '50', '22', '9246', '0', '0'), +('11', '50', '22', '21509', '0', '0'), +('11', '50', '22', '8007', '0', '0'), +('11', '50', '1', '14702', '3750', '0'), +('11', '50', '1', '10082', '3720', '0'), +('11', '50', '1', '10107', '3020', '0'), +('11', '50', '1', '14701', '2862', '0'), +('11', '50', '2', '1232', '7262', '0'), +('11', '50', '2', '1211', '5628', '0'), +('11', '50', '2', '10141', '5448', '0'), +('11', '50', '2', '10143', '5368', '0'), +('11', '50', '3', '11052', '9060', '0'), +('11', '50', '3', '1544', '8671', '0'), +('11', '50', '3', '4505', '4258', '0'), +('11', '50', '3', '1212', '1922', '0'), +('11', '50', '5', '14560', '8726', '0'), +('11', '50', '5', '11646', '7152', '0'), +('11', '50', '5', '14703', '6050', '0'), +('11', '50', '5', '10216', '4532', '0'), +('11', '50', '8', '11603', '13746', '0'), +('11', '50', '8', '1278', '8135', '0'), +('11', '50', '8', '2349', '3554', '0'), +('11', '50', '8', '1057', '3218', '0'), +('11', '50', '6', '1279', '9846', '0'), +('11', '50', '6', '1557', '5310', '0'), +('11', '50', '6', '1905', '5091', '0'), +('11', '50', '6', '1645', '3141', '0'), +('11', '50', '17', '11641', '14642', '0'), +('11', '50', '17', '1233', '12045', '0'), +('11', '50', '17', '1214', '11581', '0'), +('11', '50', '17', '1644', '11386', '0'), +('11', '50', '7', '1234', '4708', '0'), +('11', '50', '7', '1218', '4672', '0'), +('11', '50', '7', '1648', '3844', '0'), +('11', '50', '7', '1362', '2624', '0'), +('11', '50', '9', '12804', '6753', '0'), +('11', '50', '9', '27712', '5556', '0'), +('11', '50', '9', '1649', '3330', '0'), +('11', '50', '9', '4408', '3053', '0'), +('11', '50', '15', '27713', '8032', '0'), +('11', '50', '15', '20659', '4912', '0'), +('11', '50', '15', '10150', '3004', '0'), +('11', '50', '15', '20789', '2928', '0'), +('11', '50', '20', '11666', '8371', '0'), +('11', '50', '20', '2742', '5187', '0'), +('11', '50', '20', '2467', '3032', '0'), +('11', '50', '20', '1364', '2508', '0'), +('11', '50', '12', '1236', '6362', '0'), +('11', '50', '12', '2336', '4032', '0'), +('11', '50', '12', '20655', '3834', '0'), +('11', '50', '12', '4345', '3392', '0'), +('11', '50', '18', '1651', '2747', '0'), +('11', '50', '18', '4410', '1142', '0'), +('11', '50', '18', '1221', '454', '0'), +('11', '50', '18', '1237', '436', '0'), +('11', '50', '19', '4407', '5496', '0'), +('11', '50', '19', '68239', '3735', '0'), +('11', '50', '19', '1368', '2016', '0'), +('11', '50', '19', '1652', '1834', '0'), +('11', '50', '13', '14759', '8755', '0'), +('11', '50', '13', '11689', '8657', '0'), +('11', '50', '13', '6359', '6893', '0'), +('11', '50', '13', '13500', '6478', '0'), +('11', '50', '14', '14759', '8755', '0'), +('11', '50', '14', '6359', '6893', '0'), +('11', '50', '14', '9246', '6052', '0'), +('11', '50', '14', '10404', '5736', '0'), +('11', '50', '11', '9246', '6052', '0'), +('11', '50', '11', '13169', '3312', '0'), +('11', '50', '11', '14762', '2204', '0'), +('11', '50', '11', '13353', '1500', '0'), +('11', '51', '22', '10323', '0', '0'), +('11', '51', '22', '9246', '0', '0'), +('11', '51', '22', '21509', '0', '0'), +('11', '51', '22', '8007', '0', '0'), +('11', '51', '1', '10082', '3793', '0'), +('11', '51', '1', '14702', '3750', '0'), +('11', '51', '1', '10107', '3080', '0'), +('11', '51', '1', '14701', '2862', '0'), +('11', '51', '2', '1232', '7359', '0'), +('11', '51', '2', '1211', '5713', '0'), +('11', '51', '2', '10141', '5557', '0'), +('11', '51', '2', '10143', '5368', '0'), +('11', '51', '3', '11052', '9241', '0'), +('11', '51', '3', '1544', '8732', '0'), +('11', '51', '3', '4505', '4343', '0'), +('11', '51', '3', '1212', '1934', '0'), +('11', '51', '5', '14560', '8847', '0'), +('11', '51', '5', '11646', '7309', '0'), +('11', '51', '5', '14703', '6050', '0'), +('11', '51', '5', '10216', '4592', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '51', '8', '11603', '13855', '0'), +('11', '51', '8', '1278', '8197', '0'), +('11', '51', '8', '2349', '3554', '0'), +('11', '51', '8', '1057', '3279', '0'), +('11', '51', '6', '1279', '9906', '0'), +('11', '51', '6', '1557', '5310', '0'), +('11', '51', '6', '1905', '5092', '0'), +('11', '51', '6', '1645', '3177', '0'), +('11', '51', '17', '11641', '14823', '0'), +('11', '51', '17', '1233', '12205', '0'), +('11', '51', '17', '1214', '11741', '0'), +('11', '51', '17', '1644', '11447', '0'), +('11', '51', '7', '27885', '6055', '0'), +('11', '51', '7', '1234', '4793', '0'), +('11', '51', '7', '1218', '4757', '0'), +('11', '51', '7', '1648', '3905', '0'), +('11', '51', '9', '12804', '6753', '0'), +('11', '51', '9', '27712', '5617', '0'), +('11', '51', '9', '1649', '3366', '0'), +('11', '51', '9', '4408', '3114', '0'), +('11', '51', '15', '27713', '8092', '0'), +('11', '51', '15', '20659', '4948', '0'), +('11', '51', '15', '10150', '3004', '0'), +('11', '51', '15', '20789', '2976', '0'), +('11', '51', '20', '11666', '8373', '0'), +('11', '51', '20', '2742', '5190', '0'), +('11', '51', '20', '2467', '3092', '0'), +('11', '51', '20', '1364', '2556', '0'), +('11', '51', '12', '1236', '6459', '0'), +('11', '51', '12', '2336', '4092', '0'), +('11', '51', '12', '20655', '3858', '0'), +('11', '51', '12', '4345', '3453', '0'), +('11', '51', '18', '1651', '2783', '0'), +('11', '51', '18', '4410', '1142', '0'), +('11', '51', '18', '1221', '454', '0'), +('11', '51', '18', '1237', '436', '0'), +('11', '51', '19', '4407', '5605', '0'), +('11', '51', '19', '68239', '3772', '0'), +('11', '51', '19', '1368', '2016', '0'), +('11', '51', '19', '1652', '1834', '0'), +('11', '51', '13', '14759', '8826', '0'), +('11', '51', '13', '11689', '8747', '0'), +('11', '51', '13', '6359', '7014', '0'), +('11', '51', '13', '13500', '6599', '0'), +('11', '51', '14', '14759', '8826', '0'), +('11', '51', '14', '6359', '7014', '0'), +('11', '51', '14', '9246', '6173', '0'), +('11', '51', '14', '10404', '5845', '0'), +('11', '51', '11', '9246', '6173', '0'), +('11', '51', '11', '13169', '3348', '0'), +('11', '51', '11', '14762', '2204', '0'), +('11', '51', '11', '13353', '1500', '0'), +('11', '52', '22', '10323', '0', '0'), +('11', '52', '22', '9246', '0', '0'), +('11', '52', '22', '21509', '0', '0'), +('11', '52', '22', '8007', '0', '0'), +('11', '52', '1', '10082', '3865', '0'), +('11', '52', '1', '14702', '3750', '0'), +('11', '52', '1', '10107', '3141', '0'), +('11', '52', '1', '14701', '2862', '0'), +('11', '52', '2', '1232', '7455', '0'), +('11', '52', '2', '1211', '5797', '0'), +('11', '52', '2', '10141', '5666', '0'), +('11', '52', '2', '10143', '5368', '0'), +('11', '52', '3', '11052', '9422', '0'), +('11', '52', '3', '1544', '8792', '0'), +('11', '52', '3', '4505', '4427', '0'), +('11', '52', '3', '1212', '1946', '0'), +('11', '52', '5', '14560', '8968', '0'), +('11', '52', '5', '11646', '7466', '0'), +('11', '52', '5', '14703', '6050', '0'), +('11', '52', '5', '10216', '4653', '0'), +('11', '52', '8', '11603', '13964', '0'), +('11', '52', '8', '1278', '8258', '0'), +('11', '52', '8', '2349', '3554', '0'), +('11', '52', '8', '1057', '3339', '0'), +('11', '52', '6', '1279', '9967', '0'), +('11', '52', '6', '1557', '5310', '0'), +('11', '52', '6', '1905', '5093', '0'), +('11', '52', '6', '1645', '3213', '0'), +('11', '52', '17', '11641', '15004', '0'), +('11', '52', '17', '1233', '12364', '0'), +('11', '52', '17', '1214', '11901', '0'), +('11', '52', '17', '1644', '11507', '0'), +('11', '52', '7', '27885', '6103', '0'), +('11', '52', '7', '1234', '4877', '0'), +('11', '52', '7', '1218', '4841', '0'), +('11', '52', '7', '1648', '3965', '0'), +('11', '52', '9', '12804', '6753', '0'), +('11', '52', '9', '27712', '5677', '0'), +('11', '52', '9', '1649', '3403', '0'), +('11', '52', '9', '4408', '3174', '0'), +('11', '52', '15', '27713', '8153', '0'), +('11', '52', '15', '20659', '4984', '0'), +('11', '52', '15', '20789', '3025', '0'), +('11', '52', '15', '10150', '3004', '0'), +('11', '52', '20', '11666', '8375', '0'), +('11', '52', '20', '2742', '5192', '0'), +('11', '52', '20', '2467', '3153', '0'), +('11', '52', '20', '1364', '2605', '0'), +('11', '52', '12', '1236', '6555', '0'), +('11', '52', '12', '2336', '4153', '0'), +('11', '52', '12', '20655', '3883', '0'), +('11', '52', '12', '4345', '3513', '0'), +('11', '52', '18', '1651', '2820', '0'), +('11', '52', '18', '4410', '1142', '0'), +('11', '52', '18', '1221', '454', '0'), +('11', '52', '18', '1237', '436', '0'), +('11', '52', '19', '4407', '5714', '0'), +('11', '52', '19', '68239', '3808', '0'), +('11', '52', '19', '1368', '2016', '0'), +('11', '52', '19', '1652', '1834', '0'), +('11', '52', '13', '14759', '8897', '0'), +('11', '52', '13', '11689', '8838', '0'), +('11', '52', '13', '6359', '7135', '0'), +('11', '52', '13', '13500', '6720', '0'), +('11', '52', '14', '14759', '8897', '0'), +('11', '52', '14', '6359', '7135', '0'), +('11', '52', '14', '9246', '6294', '0'), +('11', '52', '14', '10404', '5953', '0'), +('11', '52', '11', '9246', '6294', '0'), +('11', '52', '11', '13169', '3384', '0'), +('11', '52', '11', '14762', '2204', '0'), +('11', '52', '11', '13353', '1500', '0'), +('11', '53', '22', '10323', '0', '0'), +('11', '53', '22', '9246', '0', '0'), +('11', '53', '22', '21509', '0', '0'), +('11', '53', '22', '8007', '0', '0'), +('11', '53', '1', '10082', '3938', '0'), +('11', '53', '1', '14702', '3750', '0'), +('11', '53', '1', '10107', '3201', '0'), +('11', '53', '1', '14701', '2862', '0'), +('11', '53', '2', '1232', '7552', '0'), +('11', '53', '2', '1211', '5882', '0'), +('11', '53', '2', '10141', '5774', '0'), +('11', '53', '2', '10143', '5368', '0'), +('11', '53', '3', '11052', '9604', '0'), +('11', '53', '3', '1544', '8853', '0'), +('11', '53', '3', '4505', '4512', '0'), +('11', '53', '3', '1212', '1958', '0'), +('11', '53', '5', '14560', '9089', '0'), +('11', '53', '5', '11646', '7623', '0'), +('11', '53', '5', '14703', '6050', '0'), +('11', '53', '5', '10216', '4713', '0'), +('11', '53', '8', '11603', '14073', '0'), +('11', '53', '8', '1278', '8320', '0'), +('11', '53', '8', '2349', '3554', '0'), +('11', '53', '8', '1057', '3400', '0'), +('11', '53', '6', '1279', '10027', '0'), +('11', '53', '6', '1557', '5310', '0'), +('11', '53', '6', '1905', '5094', '0'), +('11', '53', '6', '1645', '3250', '0'), +('11', '53', '17', '11641', '15185', '0'), +('11', '53', '17', '1233', '12524', '0'), +('11', '53', '17', '1214', '12061', '0'), +('11', '53', '17', '1644', '11568', '0'), +('11', '53', '7', '27885', '6151', '0'), +('11', '53', '7', '1234', '4962', '0'), +('11', '53', '7', '1218', '4926', '0'), +('11', '53', '7', '1648', '4025', '0'), +('11', '53', '9', '12804', '6753', '0'), +('11', '53', '9', '27712', '5737', '0'), +('11', '53', '9', '1649', '3439', '0'), +('11', '53', '9', '4408', '3234', '0'), +('11', '53', '15', '27713', '8213', '0'), +('11', '53', '15', '20659', '5021', '0'), +('11', '53', '15', '20789', '3073', '0'), +('11', '53', '15', '10150', '3004', '0'), +('11', '53', '20', '11666', '8376', '0'), +('11', '53', '20', '2742', '5194', '0'), +('11', '53', '20', '2467', '3213', '0'), +('11', '53', '20', '1364', '2653', '0'), +('11', '53', '12', '1236', '6652', '0'), +('11', '53', '12', '2336', '4213', '0'), +('11', '53', '12', '20655', '3908', '0'), +('11', '53', '12', '4345', '3574', '0'), +('11', '53', '18', '1651', '2856', '0'), +('11', '53', '18', '4410', '1142', '0'), +('11', '53', '18', '1221', '454', '0'), +('11', '53', '18', '1237', '436', '0'), +('11', '53', '19', '4407', '5822', '0'), +('11', '53', '19', '68239', '3844', '0'), +('11', '53', '19', '1368', '2016', '0'), +('11', '53', '19', '1652', '1834', '0'), +('11', '53', '13', '14759', '8968', '0'), +('11', '53', '13', '11689', '8929', '0'), +('11', '53', '13', '6359', '7255', '0'), +('11', '53', '13', '13500', '6840', '0'), +('11', '53', '14', '14759', '8968', '0'), +('11', '53', '14', '6359', '7255', '0'), +('11', '53', '14', '9246', '6414', '0'), +('11', '53', '14', '10404', '6062', '0'), +('11', '53', '11', '9246', '6414', '0'), +('11', '53', '11', '13169', '3421', '0'), +('11', '53', '11', '14762', '2204', '0'), +('11', '53', '11', '13353', '1500', '0'), +('11', '54', '22', '10323', '0', '0'), +('11', '54', '22', '9246', '0', '0'), +('11', '54', '22', '21509', '0', '0'), +('11', '54', '22', '8007', '0', '0'), +('11', '54', '1', '10082', '4010', '0'), +('11', '54', '1', '14702', '3750', '0'), +('11', '54', '1', '10107', '3262', '0'), +('11', '54', '1', '14701', '2862', '0'), +('11', '54', '2', '1232', '7649', '0'), +('11', '54', '2', '1211', '5966', '0'), +('11', '54', '2', '10141', '5883', '0'), +('11', '54', '2', '10143', '5368', '0'), +('11', '54', '3', '11052', '9785', '0'), +('11', '54', '3', '1544', '8913', '0'), +('11', '54', '3', '4505', '4596', '0'), +('11', '54', '3', '10101', '1975', '0'), +('11', '54', '5', '14560', '9209', '0'), +('11', '54', '5', '11646', '7780', '0'), +('11', '54', '5', '14703', '6050', '0'), +('11', '54', '5', '10216', '4774', '0'), +('11', '54', '8', '11603', '14181', '0'), +('11', '54', '8', '1278', '8382', '0'), +('11', '54', '8', '2349', '3554', '0'), +('11', '54', '8', '1057', '3460', '0'), +('11', '54', '6', '1279', '10088', '0'), +('11', '54', '6', '1557', '5310', '0'), +('11', '54', '6', '1905', '5095', '0'), +('11', '54', '6', '1645', '3286', '0'), +('11', '54', '17', '11641', '15366', '0'), +('11', '54', '17', '1233', '12683', '0'), +('11', '54', '17', '1214', '12222', '0'), +('11', '54', '17', '1644', '11628', '0'), +('11', '54', '7', '27885', '6199', '0'), +('11', '54', '7', '1234', '5046', '0'), +('11', '54', '7', '1218', '5010', '0'), +('11', '54', '7', '1648', '4086', '0'), +('11', '54', '9', '12804', '6753', '0'), +('11', '54', '9', '27712', '5798', '0'), +('11', '54', '9', '1649', '3475', '0'), +('11', '54', '9', '4408', '3295', '0'), +('11', '54', '15', '27713', '8274', '0'), +('11', '54', '15', '20659', '5057', '0'), +('11', '54', '15', '20789', '3121', '0'), +('11', '54', '15', '10150', '3004', '0'), +('11', '54', '20', '11666', '8378', '0'), +('11', '54', '20', '2742', '5197', '0'), +('11', '54', '20', '2467', '3274', '0'), +('11', '54', '20', '1364', '2701', '0'), +('11', '54', '12', '1236', '6749', '0'), +('11', '54', '12', '2336', '4274', '0'), +('11', '54', '12', '20655', '3932', '0'), +('11', '54', '12', '4345', '3634', '0'), +('11', '54', '18', '1651', '2892', '0'), +('11', '54', '18', '4410', '1142', '0'), +('11', '54', '18', '1221', '454', '0'), +('11', '54', '18', '1237', '436', '0'), +('11', '54', '19', '4407', '5931', '0'), +('11', '54', '19', '68239', '3880', '0'), +('11', '54', '19', '1368', '2016', '0'), +('11', '54', '19', '1652', '1834', '0'), +('11', '54', '13', '14759', '9040', '0'), +('11', '54', '13', '11689', '9019', '0'), +('11', '54', '13', '6359', '7376', '0'), +('11', '54', '13', '13500', '6961', '0'), +('11', '54', '14', '14759', '9040', '0'), +('11', '54', '14', '6359', '7376', '0'), +('11', '54', '14', '9246', '6535', '0'), +('11', '54', '14', '10404', '6171', '0'), +('11', '54', '11', '9246', '6535', '0'), +('11', '54', '11', '13169', '3457', '0'), +('11', '54', '11', '14762', '2204', '0'), +('11', '54', '11', '13353', '1500', '0'), +('11', '55', '22', '10323', '0', '0'), +('11', '55', '22', '9246', '0', '0'), +('11', '55', '22', '21509', '0', '0'), +('11', '55', '22', '8007', '0', '0'), +('11', '55', '1', '10082', '4083', '0'), +('11', '55', '1', '14702', '3750', '0'), +('11', '55', '1', '10107', '3322', '0'), +('11', '55', '1', '14701', '2862', '0'), +('11', '55', '2', '1232', '7745', '0'), +('11', '55', '2', '1211', '6051', '0'), +('11', '55', '2', '10141', '5992', '0'), +('11', '55', '2', '10143', '5368', '0'), +('11', '55', '3', '11052', '9966', '0'), +('11', '55', '3', '1544', '8973', '0'), +('11', '55', '3', '4505', '4681', '0'), +('11', '55', '3', '10101', '2011', '0'), +('11', '55', '5', '14560', '9330', '0'), +('11', '55', '5', '11646', '7937', '0'), +('11', '55', '5', '14703', '6050', '0'), +('11', '55', '5', '10216', '4834', '0'), +('11', '55', '8', '11603', '14290', '0'), +('11', '55', '8', '1278', '8444', '0'), +('11', '55', '8', '2349', '3554', '0'), +('11', '55', '8', '1057', '3520', '0'), +('11', '55', '6', '1279', '10148', '0'), +('11', '55', '6', '1557', '5310', '0'), +('11', '55', '6', '1905', '5097', '0'), +('11', '55', '6', '1645', '3322', '0'), +('11', '55', '17', '11641', '15548', '0'), +('11', '55', '17', '1233', '12843', '0'), +('11', '55', '17', '1214', '12382', '0'), +('11', '55', '17', '1644', '11688', '0'), +('11', '55', '7', '27885', '6248', '0'), +('11', '55', '7', '1234', '5131', '0'), +('11', '55', '7', '1218', '5095', '0'), +('11', '55', '7', '1648', '4146', '0'), +('11', '55', '9', '12804', '6753', '0'), +('11', '55', '9', '27712', '5858', '0'), +('11', '55', '9', '1649', '3511', '0'), +('11', '55', '9', '4408', '3355', '0'), +('11', '55', '15', '27713', '8334', '0'), +('11', '55', '15', '20659', '5093', '0'), +('11', '55', '15', '20789', '3170', '0'), +('11', '55', '15', '10150', '3004', '0'), +('11', '55', '20', '11666', '8380', '0'), +('11', '55', '20', '2742', '5199', '0'), +('11', '55', '20', '2467', '3334', '0'), +('11', '55', '20', '1364', '2750', '0'), +('11', '55', '12', '1236', '6845', '0'), +('11', '55', '12', '2336', '4334', '0'), +('11', '55', '12', '20655', '3957', '0'), +('11', '55', '12', '4345', '3694', '0'), +('11', '55', '18', '1651', '2928', '0'), +('11', '55', '18', '4410', '1142', '0'), +('11', '55', '18', '1221', '454', '0'), +('11', '55', '18', '1237', '436', '0'), +('11', '55', '19', '4407', '6040', '0'), +('11', '55', '19', '68239', '3917', '0'), +('11', '55', '19', '1368', '2016', '0'), +('11', '55', '19', '1652', '1834', '0'), +('11', '55', '13', '14759', '9111', '0'), +('11', '55', '13', '11689', '9110', '0'), +('11', '55', '13', '6359', '7497', '0'), +('11', '55', '13', '13500', '7082', '0'), +('11', '55', '14', '14759', '9111', '0'), +('11', '55', '14', '6359', '7497', '0'), +('11', '55', '14', '9246', '6656', '0'), +('11', '55', '14', '10404', '6280', '0'), +('11', '55', '11', '9246', '6656', '0'), +('11', '55', '11', '13169', '3493', '0'), +('11', '55', '11', '14762', '2204', '0'), +('11', '55', '11', '13353', '1500', '0'), +('11', '56', '22', '10323', '0', '0'), +('11', '56', '22', '9246', '0', '0'), +('11', '56', '22', '21509', '0', '0'), +('11', '56', '22', '8007', '0', '0'), +('11', '56', '1', '10082', '4155', '0'), +('11', '56', '1', '14702', '3750', '0'), +('11', '56', '1', '10107', '3382', '0'), +('11', '56', '1', '14701', '2862', '0'), +('11', '56', '2', '1232', '7842', '0'), +('11', '56', '2', '1211', '6136', '0'), +('11', '56', '2', '10141', '6100', '0'), +('11', '56', '2', '10143', '5368', '0'), +('11', '56', '3', '11052', '10147', '0'), +('11', '56', '3', '1544', '9034', '0'), +('11', '56', '3', '4505', '4766', '0'), +('11', '56', '3', '10101', '2048', '0'), +('11', '56', '5', '14560', '9451', '0'), +('11', '56', '5', '11646', '8094', '0'), +('11', '56', '5', '14703', '6050', '0'), +('11', '56', '5', '10216', '4894', '0'), +('11', '56', '8', '11603', '14399', '0'), +('11', '56', '8', '1278', '8506', '0'), +('11', '56', '8', '1057', '3581', '0'), +('11', '56', '8', '2349', '3554', '0'), +('11', '56', '6', '1279', '10208', '0'), +('11', '56', '6', '1557', '5310', '0'), +('11', '56', '6', '1905', '5098', '0'), +('11', '56', '6', '1645', '3358', '0'), +('11', '56', '17', '11641', '15729', '0'), +('11', '56', '17', '1233', '13002', '0'), +('11', '56', '17', '1214', '12542', '0'), +('11', '56', '17', '1644', '11749', '0'), +('11', '56', '7', '27885', '6296', '0'), +('11', '56', '7', '1234', '5216', '0'), +('11', '56', '7', '1218', '5180', '0'), +('11', '56', '7', '1648', '4207', '0'), +('11', '56', '9', '12804', '6753', '0'), +('11', '56', '9', '27712', '5919', '0'), +('11', '56', '9', '1649', '3548', '0'), +('11', '56', '9', '4408', '3416', '0'), +('11', '56', '15', '27713', '8394', '0'), +('11', '56', '15', '20659', '5129', '0'), +('11', '56', '15', '20789', '3218', '0'), +('11', '56', '15', '10150', '3004', '0'), +('11', '56', '20', '11666', '8382', '0'), +('11', '56', '20', '2742', '5202', '0'), +('11', '56', '20', '2467', '3394', '0'), +('11', '56', '20', '1364', '2798', '0'), +('11', '56', '12', '1236', '6942', '0'), +('11', '56', '12', '2336', '4394', '0'), +('11', '56', '12', '20655', '3981', '0'), +('11', '56', '12', '4345', '3755', '0'), +('11', '56', '18', '1651', '2964', '0'), +('11', '56', '18', '4410', '1142', '0'), +('11', '56', '18', '1221', '454', '0'), +('11', '56', '18', '1237', '436', '0'), +('11', '56', '19', '4407', '6149', '0'), +('11', '56', '19', '68239', '3953', '0'), +('11', '56', '19', '1368', '2016', '0'), +('11', '56', '19', '1652', '1834', '0'), +('11', '56', '13', '11689', '9200', '0'), +('11', '56', '13', '14759', '9182', '0'), +('11', '56', '13', '6359', '7618', '0'), +('11', '56', '13', '13500', '7203', '0'), +('11', '56', '14', '14759', '9182', '0'), +('11', '56', '14', '6359', '7618', '0'), +('11', '56', '14', '9246', '6777', '0'), +('11', '56', '14', '10404', '6388', '0'), +('11', '56', '11', '9246', '6777', '0'), +('11', '56', '11', '13169', '3529', '0'), +('11', '56', '11', '14762', '2204', '0'), +('11', '56', '11', '13353', '1500', '0'), +('11', '57', '22', '10323', '0', '0'), +('11', '57', '22', '9246', '0', '0'), +('11', '57', '22', '21509', '0', '0'), +('11', '57', '22', '8007', '0', '0'), +('11', '57', '1', '10082', '4228', '0'), +('11', '57', '1', '14702', '3750', '0'), +('11', '57', '1', '10107', '3443', '0'), +('11', '57', '1', '14701', '2862', '0'), +('11', '57', '2', '1232', '7939', '0'), +('11', '57', '2', '1211', '6220', '0'), +('11', '57', '2', '10141', '6209', '0'), +('11', '57', '2', '10143', '5368', '0'), +('11', '57', '3', '11052', '10328', '0'), +('11', '57', '3', '1544', '9094', '0'), +('11', '57', '3', '4505', '4850', '0'), +('11', '57', '3', '10101', '2084', '0'), +('11', '57', '5', '14560', '9572', '0'), +('11', '57', '5', '11646', '8251', '0'), +('11', '57', '5', '14703', '6050', '0'), +('11', '57', '5', '10216', '4955', '0'), +('11', '57', '8', '11603', '14507', '0'), +('11', '57', '8', '1278', '8568', '0'), +('11', '57', '8', '1057', '3641', '0'), +('11', '57', '8', '2349', '3554', '0'), +('11', '57', '6', '1279', '10269', '0'), +('11', '57', '6', '1557', '5310', '0'), +('11', '57', '6', '1905', '5099', '0'), +('11', '57', '6', '1645', '3395', '0'), +('11', '57', '17', '11641', '15910', '0'), +('11', '57', '17', '1233', '13161', '0'), +('11', '57', '17', '1214', '12702', '0'), +('11', '57', '17', '1644', '11809', '0'), +('11', '57', '7', '27885', '6344', '0'), +('11', '57', '7', '1234', '5300', '0'), +('11', '57', '7', '1218', '5264', '0'), +('11', '57', '7', '1648', '4267', '0'), +('11', '57', '9', '12804', '6753', '0'), +('11', '57', '9', '27712', '5979', '0'), +('11', '57', '9', '1649', '3584', '0'), +('11', '57', '9', '4408', '3476', '0'), +('11', '57', '15', '27713', '8455', '0'), +('11', '57', '15', '20659', '5166', '0'), +('11', '57', '15', '20789', '3266', '0'), +('11', '57', '15', '10150', '3004', '0'), +('11', '57', '20', '11666', '8383', '0'), +('11', '57', '20', '2742', '5204', '0'), +('11', '57', '20', '2467', '3455', '0'), +('11', '57', '20', '1364', '2846', '0'), +('11', '57', '12', '1236', '7039', '0'), +('11', '57', '12', '2336', '4455', '0'), +('11', '57', '12', '20655', '4006', '0'), +('11', '57', '12', '4345', '3815', '0'), +('11', '57', '18', '1651', '3001', '0'), +('11', '57', '18', '4410', '1142', '0'), +('11', '57', '18', '1221', '454', '0'), +('11', '57', '18', '1237', '436', '0'), +('11', '57', '19', '4407', '6257', '0'), +('11', '57', '19', '68239', '3989', '0'), +('11', '57', '19', '1368', '2016', '0'), +('11', '57', '19', '1652', '1834', '0'), +('11', '57', '13', '11689', '9291', '0'), +('11', '57', '13', '14759', '9253', '0'), +('11', '57', '13', '6359', '7739', '0'), +('11', '57', '13', '13500', '7324', '0'), +('11', '57', '14', '14759', '9253', '0'), +('11', '57', '14', '6359', '7739', '0'), +('11', '57', '14', '9246', '6898', '0'), +('11', '57', '14', '10404', '6497', '0'), +('11', '57', '11', '9246', '6898', '0'), +('11', '57', '11', '13169', '3566', '0'), +('11', '57', '11', '14762', '2204', '0'), +('11', '57', '11', '13353', '1500', '0'), +('11', '58', '22', '10323', '0', '0'), +('11', '58', '22', '9246', '0', '0'), +('11', '58', '22', '21509', '0', '0'), +('11', '58', '22', '8007', '0', '0'), +('11', '58', '1', '10082', '4300', '0'), +('11', '58', '1', '14702', '3750', '0'), +('11', '58', '1', '10107', '3503', '0'), +('11', '58', '1', '14701', '2862', '0'), +('11', '58', '2', '1232', '8035', '0'), +('11', '58', '2', '10141', '6318', '0'), +('11', '58', '2', '1211', '6305', '0'), +('11', '58', '2', '10143', '5368', '0'), +('11', '58', '3', '11052', '10510', '0'), +('11', '58', '3', '1544', '9155', '0'), +('11', '58', '3', '4505', '4935', '0'), +('11', '58', '3', '10101', '2120', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '58', '5', '14560', '9693', '0'), +('11', '58', '5', '11646', '8408', '0'), +('11', '58', '5', '14703', '6050', '0'), +('11', '58', '5', '10216', '5015', '0'), +('11', '58', '8', '11603', '14616', '0'), +('11', '58', '8', '1278', '8630', '0'), +('11', '58', '8', '1057', '3702', '0'), +('11', '58', '8', '2349', '3554', '0'), +('11', '58', '6', '1279', '10329', '0'), +('11', '58', '6', '1557', '5310', '0'), +('11', '58', '6', '1905', '5100', '0'), +('11', '58', '6', '1645', '3431', '0'), +('11', '58', '17', '11641', '16091', '0'), +('11', '58', '17', '1233', '13321', '0'), +('11', '58', '17', '1214', '12862', '0'), +('11', '58', '17', '1644', '11870', '0'), +('11', '58', '7', '27885', '6393', '0'), +('11', '58', '7', '1234', '5385', '0'), +('11', '58', '7', '1218', '5349', '0'), +('11', '58', '7', '1648', '4327', '0'), +('11', '58', '9', '12804', '6753', '0'), +('11', '58', '9', '27712', '6039', '0'), +('11', '58', '9', '1649', '3620', '0'), +('11', '58', '9', '4408', '3536', '0'), +('11', '58', '15', '27713', '8515', '0'), +('11', '58', '15', '20659', '5202', '0'), +('11', '58', '15', '20789', '3315', '0'), +('11', '58', '15', '10150', '3004', '0'), +('11', '58', '20', '11666', '8385', '0'), +('11', '58', '20', '2742', '5207', '0'), +('11', '58', '20', '2467', '3515', '0'), +('11', '58', '20', '1364', '2895', '0'), +('11', '58', '12', '1236', '7135', '0'), +('11', '58', '12', '2336', '4515', '0'), +('11', '58', '12', '20655', '4031', '0'), +('11', '58', '12', '4345', '3876', '0'), +('11', '58', '18', '1651', '3037', '0'), +('11', '58', '18', '4410', '1142', '0'), +('11', '58', '18', '1221', '454', '0'), +('11', '58', '18', '1237', '436', '0'), +('11', '58', '19', '4407', '6366', '0'), +('11', '58', '19', '68239', '4025', '0'), +('11', '58', '19', '1368', '2016', '0'), +('11', '58', '19', '1652', '1834', '0'), +('11', '58', '13', '11689', '9382', '0'), +('11', '58', '13', '14759', '9325', '0'), +('11', '58', '13', '6359', '7859', '0'), +('11', '58', '13', '13500', '7444', '0'), +('11', '58', '14', '14759', '9325', '0'), +('11', '58', '14', '6359', '7859', '0'), +('11', '58', '14', '9246', '7018', '0'), +('11', '58', '14', '10404', '6606', '0'), +('11', '58', '11', '9246', '7018', '0'), +('11', '58', '11', '13169', '3602', '0'), +('11', '58', '11', '14762', '2204', '0'), +('11', '58', '11', '13353', '1500', '0'), +('11', '59', '22', '10323', '0', '0'), +('11', '59', '22', '9246', '0', '0'), +('11', '59', '22', '21509', '0', '0'), +('11', '59', '22', '8007', '0', '0'), +('11', '59', '1', '10082', '4373', '0'), +('11', '59', '1', '14702', '3750', '0'), +('11', '59', '1', '10107', '3564', '0'), +('11', '59', '1', '14701', '2862', '0'), +('11', '59', '2', '1232', '8132', '0'), +('11', '59', '2', '10141', '6427', '0'), +('11', '59', '2', '1211', '6389', '0'), +('11', '59', '2', '10143', '5368', '0'), +('11', '59', '3', '11052', '10691', '0'), +('11', '59', '3', '1544', '9215', '0'), +('11', '59', '3', '4505', '5019', '0'), +('11', '59', '3', '10101', '2156', '0'), +('11', '59', '5', '14560', '9813', '0'), +('11', '59', '5', '11646', '8565', '0'), +('11', '59', '5', '14703', '6050', '0'), +('11', '59', '5', '10216', '5076', '0'), +('11', '59', '8', '11603', '14725', '0'), +('11', '59', '8', '1278', '8691', '0'), +('11', '59', '8', '1057', '3762', '0'), +('11', '59', '8', '2349', '3554', '0'), +('11', '59', '6', '1279', '10390', '0'), +('11', '59', '6', '1557', '5310', '0'), +('11', '59', '6', '1905', '5101', '0'), +('11', '59', '6', '1645', '3467', '0'), +('11', '59', '17', '11641', '16272', '0'), +('11', '59', '17', '1233', '13480', '0'), +('11', '59', '17', '1214', '13023', '0'), +('11', '59', '17', '1644', '11930', '0'), +('11', '59', '7', '27885', '6441', '0'), +('11', '59', '7', '1234', '5469', '0'), +('11', '59', '7', '1218', '5433', '0'), +('11', '59', '7', '1648', '4388', '0'), +('11', '59', '9', '12804', '6753', '0'), +('11', '59', '9', '27712', '6100', '0'), +('11', '59', '9', '1649', '3656', '0'), +('11', '59', '9', '4408', '3597', '0'), +('11', '59', '15', '27713', '8576', '0'), +('11', '59', '15', '20659', '5238', '0'), +('11', '59', '15', '20789', '3363', '0'), +('11', '59', '15', '10150', '3004', '0'), +('11', '59', '20', '11666', '8387', '0'), +('11', '59', '20', '2742', '5209', '0'), +('11', '59', '20', '2467', '3576', '0'), +('11', '59', '20', '1364', '2943', '0'), +('11', '59', '12', '1236', '7232', '0'), +('11', '59', '12', '2336', '4576', '0'), +('11', '59', '12', '20655', '4055', '0'), +('11', '59', '12', '4345', '3936', '0'), +('11', '59', '18', '1651', '3073', '0'), +('11', '59', '18', '4410', '1142', '0'), +('11', '59', '18', '1221', '454', '0'), +('11', '59', '18', '1237', '436', '0'), +('11', '59', '19', '4407', '6475', '0'), +('11', '59', '19', '68239', '4062', '0'), +('11', '59', '19', '1368', '2016', '0'), +('11', '59', '19', '1652', '1834', '0'), +('11', '59', '13', '11689', '9472', '0'), +('11', '59', '13', '14759', '9396', '0'), +('11', '59', '13', '6359', '7980', '0'), +('11', '59', '13', '13500', '7565', '0'), +('11', '59', '14', '14759', '9396', '0'), +('11', '59', '14', '6359', '7980', '0'), +('11', '59', '14', '9246', '7139', '0'), +('11', '59', '14', '10404', '6714', '0'), +('11', '59', '11', '9246', '7139', '0'), +('11', '59', '11', '13169', '3638', '0'), +('11', '59', '11', '14762', '2204', '0'), +('11', '59', '11', '13353', '1500', '0'), +('11', '60', '22', '66397', '0', '3'), +('11', '60', '22', '61948', '0', '3'), +('11', '60', '22', '21805', '0', '3'), +('11', '60', '22', '21807', '0', '3'), +('11', '60', '1', '30552', '19371', '3'), +('11', '60', '1', '28944', '13921', '3'), +('11', '60', '1', '29861', '12809', '3'), +('11', '60', '1', '63170', '12601', '3'), +('11', '60', '2', '26763', '32336', '3'), +('11', '60', '2', '1211', '21455', '3'), +('11', '60', '2', '1867', '15111', '3'), +('11', '60', '2', '51235', '14699', '3'), +('11', '60', '3', '5772', '20355', '3'), +('11', '60', '3', '30553', '13148', '3'), +('11', '60', '3', '31233', '12326', '3'), +('11', '60', '3', '7387', '12058', '3'), +('11', '60', '5', '26505', '24082', '3'), +('11', '60', '5', '8364', '17538', '3'), +('11', '60', '5', '29459', '15663', '3'), +('11', '60', '5', '28901', '14742', '3'), +('11', '60', '8', '28964', '16235', '3'), +('11', '60', '8', '28992', '16055', '3'), +('11', '60', '8', '28918', '14751', '3'), +('11', '60', '8', '8359', '14248', '3'), +('11', '60', '6', '28920', '14492', '3'), +('11', '60', '6', '28902', '12905', '3'), +('11', '60', '6', '28147', '12684', '3'), +('11', '60', '6', '28919', '10507', '3'), +('11', '60', '17', '26776', '17411', '3'), +('11', '60', '17', '28910', '17177', '3'), +('11', '60', '17', '26604', '16211', '3'), +('11', '60', '17', '55296', '15446', '3'), +('11', '60', '7', '28924', '15286', '3'), +('11', '60', '7', '7868', '14101', '3'), +('11', '60', '7', '8288', '12504', '3'), +('11', '60', '7', '26555', '11907', '3'), +('11', '60', '9', '31314', '24573', '3'), +('11', '60', '9', '59563', '22201', '3'), +('11', '60', '9', '30168', '20301', '3'), +('11', '60', '9', '30552', '19371', '3'), +('11', '60', '15', '51247', '35902', '3'), +('11', '60', '15', '11541', '23001', '3'), +('11', '60', '15', '28993', '15374', '3'), +('11', '60', '15', '28944', '13921', '3'), +('11', '60', '20', '11666', '28252', '3'), +('11', '60', '20', '28916', '16298', '3'), +('11', '60', '20', '30534', '13698', '3'), +('11', '60', '20', '26549', '13048', '3'), +('11', '60', '12', '28144', '50605', '3'), +('11', '60', '12', '30534', '13698', '3'), +('11', '60', '12', '28967', '12003', '3'), +('11', '60', '12', '28972', '10232', '3'), +('11', '60', '18', '26777', '14772', '3'), +('11', '60', '18', '28932', '12327', '3'), +('11', '60', '18', '8289', '12323', '3'), +('11', '60', '18', '27316', '10613', '3'), +('11', '60', '19', '31327', '30838', '3'), +('11', '60', '19', '31408', '23502', '3'), +('11', '60', '19', '28934', '16903', '3'), +('11', '60', '19', '30570', '15600', '3'), +('11', '60', '13', '28980', '38199', '3'), +('11', '60', '13', '26778', '19370', '3'), +('11', '60', '13', '28981', '15449', '3'), +('11', '60', '13', '28917', '14804', '3'), +('11', '60', '14', '28980', '38199', '3'), +('11', '60', '14', '26778', '19370', '3'), +('11', '60', '14', '26780', '16401', '3'), +('11', '60', '14', '28981', '15449', '3'), +('11', '60', '11', '26778', '19370', '3'), +('11', '60', '11', '30562', '13584', '3'), +('11', '60', '11', '1554', '12674', '3'), +('11', '60', '11', '28948', '12652', '3'), +('11', '60', '22', '10323', '0', '2'), +('11', '60', '22', '9248', '0', '2'), +('11', '60', '22', '12425', '0', '2'), +('11', '60', '22', '30014', '0', '2'), +('11', '60', '1', '31228', '12489', '2'), +('11', '60', '1', '10912', '7764', '2'), +('11', '60', '1', '62234', '6602', '2'), +('11', '60', '1', '1720', '5655', '2'), +('11', '60', '2', '10913', '12388', '2'), +('11', '60', '2', '48043', '10300', '2'), +('11', '60', '2', '29648', '9159', '2'), +('11', '60', '2', '1867', '9119', '2'), +('11', '60', '3', '31233', '13571', '2'), +('11', '60', '3', '1547', '11983', '2'), +('11', '60', '3', '31244', '11452', '2'), +('11', '60', '3', '31463', '10628', '2'), +('11', '60', '5', '31460', '12280', '2'), +('11', '60', '5', '31318', '10435', '2'), +('11', '60', '5', '29459', '9685', '2'), +('11', '60', '5', '27259', '9128', '2'), +('11', '60', '8', '1628', '13160', '2'), +('11', '60', '8', '31390', '10618', '2'), +('11', '60', '8', '11603', '9438', '2'), +('11', '60', '8', '5779', '9161', '2'), +('11', '60', '6', '29468', '10684', '2'), +('11', '60', '6', '1279', '7459', '2'), +('11', '60', '6', '29472', '6368', '2'), +('11', '60', '6', '1114', '5851', '2'), +('11', '60', '17', '31239', '16808', '2'), +('11', '60', '17', '10845', '15736', '2'), +('11', '60', '17', '1552', '14938', '2'), +('11', '60', '17', '29333', '11572', '2'), +('11', '60', '7', '31342', '8713', '2'), +('11', '60', '7', '29485', '7509', '2'), +('11', '60', '7', '31237', '7104', '2'), +('11', '60', '7', '31371', '4209', '2'), +('11', '60', '9', '31460', '12280', '2'), +('11', '60', '9', '31246', '8306', '2'), +('11', '60', '9', '1559', '7811', '2'), +('11', '60', '9', '12804', '6751', '2'), +('11', '60', '15', '25211', '12700', '2'), +('11', '60', '15', '31231', '12533', '2'), +('11', '60', '15', '25198', '9869', '2'), +('11', '60', '15', '62373', '7596', '2'), +('11', '60', '20', '25858', '13787', '2'), +('11', '60', '20', '2510', '12414', '2'), +('11', '60', '20', '1556', '12317', '2'), +('11', '60', '20', '6835', '8298', '2'), +('11', '60', '12', '25857', '10812', '2'), +('11', '60', '12', '31340', '10679', '2'), +('11', '60', '12', '31306', '8988', '2'), +('11', '60', '12', '25311', '3957', '2'), +('11', '60', '18', '31339', '10479', '2'), +('11', '60', '18', '31166', '6286', '2'), +('11', '60', '18', '31371', '4209', '2'), +('11', '60', '18', '26017', '3601', '2'), +('11', '60', '19', '29645', '15540', '2'), +('11', '60', '19', '31245', '14390', '2'), +('11', '60', '19', '31355', '9547', '2'), +('11', '60', '19', '31327', '8711', '2'), +('11', '60', '13', '1156', '14797', '2'), +('11', '60', '13', '31326', '13591', '2'), +('11', '60', '13', '1117', '12559', '2'), +('11', '60', '13', '20544', '12346', '2'), +('11', '60', '14', '2498', '13825', '2'), +('11', '60', '14', '31462', '11532', '2'), +('11', '60', '14', '29449', '10978', '2'), +('11', '60', '14', '31302', '10130', '2'), +('11', '60', '11', '31466', '14368', '2'), +('11', '60', '11', '1554', '13897', '2'), +('11', '60', '11', '2698', '10516', '2'), +('11', '60', '11', '31302', '10130', '2'), +('11', '60', '22', '10323', '0', '1'), +('11', '60', '22', '12425', '0', '1'), +('11', '60', '22', '9246', '0', '1'), +('11', '60', '22', '21509', '0', '1'), +('11', '60', '1', '10912', '12224', '1'), +('11', '60', '1', '62234', '8422', '1'), +('11', '60', '1', '5744', '3857', '1'), +('11', '60', '1', '14702', '3750', '1'), +('11', '60', '2', '10913', '18377', '1'), +('11', '60', '2', '48043', '14842', '1'), +('11', '60', '2', '1232', '5840', '1'), +('11', '60', '2', '1414', '5666', '1'), +('11', '60', '3', '1544', '7769', '1'), +('11', '60', '3', '5780', '7309', '1'), +('11', '60', '3', '11052', '6417', '1'), +('11', '60', '3', '46184', '5253', '1'), +('11', '60', '5', '14560', '6949', '1'), +('11', '60', '5', '14703', '6050', '1'), +('11', '60', '5', '11646', '4861', '1'), +('11', '60', '5', '8285', '4483', '1'), +('11', '60', '8', '1628', '16817', '1'), +('11', '60', '8', '11603', '12136', '1'), +('11', '60', '8', '1622', '10037', '1'), +('11', '60', '8', '5779', '9186', '1'), +('11', '60', '6', '29468', '14508', '1'), +('11', '60', '6', '1279', '8954', '1'), +('11', '60', '6', '1557', '5286', '1'), +('11', '60', '6', '1905', '5061', '1'), +('11', '60', '17', '10845', '21720', '1'), +('11', '60', '17', '11641', '11965', '1'), +('11', '60', '17', '24623', '11497', '1'), +('11', '60', '17', '1644', '10478', '1'), +('11', '60', '7', '27885', '5289', '1'), +('11', '60', '7', '1234', '3462', '1'), +('11', '60', '7', '1218', '3429', '1'), +('11', '60', '7', '1648', '2953', '1'), +('11', '60', '9', '12804', '6752', '1'), +('11', '60', '9', '1618', '4950', '1'), +('11', '60', '9', '27712', '4660', '1'), +('11', '60', '9', '4780', '3017', '1'), +('11', '60', '15', '27713', '7146', '1'), +('11', '60', '15', '5727', '6766', '1'), +('11', '60', '15', '5728', '5585', '1'), +('11', '60', '15', '14738', '5482', '1'), +('11', '60', '20', '1556', '15307', '1'), +('11', '60', '20', '11666', '8332', '1'), +('11', '60', '20', '5765', '8016', '1'), +('11', '60', '20', '2742', '5125', '1'), +('11', '60', '12', '4582', '9422', '1'), +('11', '60', '12', '1236', '4940', '1'), +('11', '60', '12', '20655', '3433', '1'), +('11', '60', '12', '2336', '3146', '1'), +('11', '60', '18', '5819', '4510', '1'), +('11', '60', '18', '24765', '3127', '1'), +('11', '60', '18', '1651', '2204', '1'), +('11', '60', '18', '4410', '1125', '1'), +('11', '60', '19', '5749', '4659', '1'), +('11', '60', '19', '4407', '3898', '1'), +('11', '60', '19', '68239', '3181', '1'), +('11', '60', '19', '1368', '2010', '1'), +('11', '60', '13', '20544', '18348', '1'), +('11', '60', '13', '24629', '13134', '1'), +('11', '60', '13', '24609', '11679', '1'), +('11', '60', '13', '24628', '8684', '1'), +('11', '60', '14', '24629', '13134', '1'), +('11', '60', '14', '24609', '11679', '1'), +('11', '60', '14', '14742', '8770', '1'), +('11', '60', '14', '14745', '8222', '1'), +('11', '60', '11', '46178', '7361', '1'), +('11', '60', '11', '5763', '7257', '1'), +('11', '60', '11', '5774', '7036', '1'), +('11', '60', '11', '5805', '5300', '1'), +('11', '61', '22', '66397', '0', '3'), +('11', '61', '22', '61948', '0', '3'), +('11', '61', '22', '21805', '0', '3'), +('11', '61', '22', '21807', '0', '3'), +('11', '61', '1', '30552', '19073', '3'), +('11', '61', '1', '28944', '13923', '3'), +('11', '61', '1', '29861', '12814', '3'), +('11', '61', '1', '63170', '12503', '3'), +('11', '61', '2', '26763', '31589', '3'), +('11', '61', '2', '1211', '20456', '3'), +('11', '61', '2', '1867', '14782', '3'), +('11', '61', '2', '51235', '14601', '3'), +('11', '61', '3', '5772', '20180', '3'), +('11', '61', '3', '30553', '13151', '3'), +('11', '61', '3', '31233', '12328', '3'), +('11', '61', '3', '7387', '12060', '3'), +('11', '61', '5', '26505', '22932', '3'), +('11', '61', '5', '8364', '17541', '3'), +('11', '61', '5', '29459', '15334', '3'), +('11', '61', '5', '28901', '14746', '3'), +('11', '61', '8', '28964', '16238', '3'), +('11', '61', '8', '28992', '16055', '3'), +('11', '61', '8', '28918', '14751', '3'), +('11', '61', '8', '8359', '14250', '3'), +('11', '61', '6', '28920', '14496', '3'), +('11', '61', '6', '28902', '12905', '3'), +('11', '61', '6', '28147', '12687', '3'), +('11', '61', '6', '28919', '10507', '3'), +('11', '61', '17', '26776', '17416', '3'), +('11', '61', '17', '28910', '17029', '3'), +('11', '61', '17', '26604', '16216', '3'), +('11', '61', '17', '55296', '15450', '3'), +('11', '61', '7', '28924', '15289', '3'), +('11', '61', '7', '7868', '14102', '3'), +('11', '61', '7', '8288', '12504', '3'), +('11', '61', '7', '26555', '11907', '3'), +('11', '61', '9', '31314', '23575', '3'), +('11', '61', '9', '59563', '21201', '3'), +('11', '61', '9', '30168', '19301', '3'), +('11', '61', '9', '30552', '19073', '3'), +('11', '61', '15', '51247', '34752', '3'), +('11', '61', '15', '11541', '21851', '3'), +('11', '61', '15', '28993', '15376', '3'), +('11', '61', '15', '28944', '13923', '3'), +('11', '61', '20', '11666', '27252', '3'), +('11', '61', '20', '28916', '16300', '3'), +('11', '61', '20', '30534', '13701', '3'), +('11', '61', '20', '26549', '13052', '3'), +('11', '61', '12', '28144', '49610', '3'), +('11', '61', '12', '30534', '13701', '3'), +('11', '61', '12', '28967', '12003', '3'), +('11', '61', '12', '28972', '10235', '3'), +('11', '61', '18', '26777', '14774', '3'), +('11', '61', '18', '28932', '12329', '3'), +('11', '61', '18', '8289', '12325', '3'), +('11', '61', '18', '27316', '10614', '3'), +('11', '61', '19', '31327', '29690', '3'), +('11', '61', '19', '31408', '22353', '3'), +('11', '61', '19', '28934', '16703', '3'), +('11', '61', '19', '30570', '15601', '3'), +('11', '61', '13', '28980', '37202', '3'), +('11', '61', '13', '26778', '19256', '3'), +('11', '61', '13', '28981', '15452', '3'), +('11', '61', '13', '28917', '14804', '3'), +('11', '61', '14', '28980', '37202', '3'), +('11', '61', '14', '26778', '19256', '3'), +('11', '61', '14', '26780', '16404', '3'), +('11', '61', '14', '28981', '15452', '3'), +('11', '61', '11', '26778', '19256', '3'), +('11', '61', '11', '30562', '13586', '3'), +('11', '61', '11', '1554', '12676', '3'), +('11', '61', '11', '28948', '12652', '3'), +('11', '62', '22', '66397', '0', '3'), +('11', '62', '22', '61948', '0', '3'), +('11', '62', '22', '21805', '0', '3'), +('11', '62', '22', '21807', '0', '3'), +('11', '62', '1', '30552', '18775', '3'), +('11', '62', '1', '28944', '13925', '3'), +('11', '62', '1', '29861', '12819', '3'), +('11', '62', '1', '63170', '12404', '3'), +('11', '62', '2', '26763', '30842', '3'), +('11', '62', '2', '1211', '19457', '3'), +('11', '62', '2', '51235', '14504', '3'), +('11', '62', '2', '1867', '14453', '3'), +('11', '62', '3', '5772', '20005', '3'), +('11', '62', '3', '30553', '13153', '3'), +('11', '62', '3', '31233', '12330', '3'), +('11', '62', '3', '7387', '12063', '3'), +('11', '62', '5', '26505', '21782', '3'), +('11', '62', '5', '8364', '17544', '3'), +('11', '62', '5', '29459', '15005', '3'), +('11', '62', '5', '28901', '14750', '3'), +('11', '62', '8', '28964', '16241', '3'), +('11', '62', '8', '28992', '16055', '3'), +('11', '62', '8', '28918', '14751', '3'), +('11', '62', '8', '8359', '14252', '3'), +('11', '62', '6', '28920', '14500', '3'), +('11', '62', '6', '28902', '12905', '3'), +('11', '62', '6', '28147', '12690', '3'), +('11', '62', '6', '28919', '10507', '3'), +('11', '62', '17', '26776', '17421', '3'), +('11', '62', '17', '28910', '16881', '3'), +('11', '62', '17', '26604', '16221', '3'), +('11', '62', '17', '55296', '15454', '3'), +('11', '62', '7', '28924', '15292', '3'), +('11', '62', '7', '7868', '14104', '3'), +('11', '62', '7', '8288', '12504', '3'), +('11', '62', '7', '26555', '11907', '3'), +('11', '62', '9', '31314', '22577', '3'), +('11', '62', '9', '59563', '20201', '3'), +('11', '62', '9', '30552', '18775', '3'), +('11', '62', '9', '30168', '18301', '3'), +('11', '62', '15', '51247', '33602', '3'), +('11', '62', '15', '11541', '20701', '3'), +('11', '62', '15', '28993', '15378', '3'), +('11', '62', '15', '28944', '13925', '3'), +('11', '62', '20', '11666', '26252', '3'), +('11', '62', '20', '28916', '16301', '3'), +('11', '62', '20', '30534', '13703', '3'), +('11', '62', '20', '26549', '13056', '3'), +('11', '62', '12', '28144', '48615', '3'), +('11', '62', '12', '30534', '13703', '3'), +('11', '62', '12', '28967', '12003', '3'), +('11', '62', '12', '28972', '10238', '3'), +('11', '62', '18', '26777', '14776', '3'), +('11', '62', '18', '28932', '12331', '3'), +('11', '62', '18', '8289', '12327', '3'), +('11', '62', '18', '27316', '10615', '3'), +('11', '62', '19', '31327', '28541', '3'), +('11', '62', '19', '31408', '21204', '3'), +('11', '62', '19', '28934', '16503', '3'), +('11', '62', '19', '30570', '15603', '3'), +('11', '62', '13', '28980', '36204', '3'), +('11', '62', '13', '26778', '19142', '3'), +('11', '62', '13', '28981', '15454', '3'), +('11', '62', '13', '28917', '14804', '3'), +('11', '62', '14', '28980', '36204', '3'), +('11', '62', '14', '26778', '19142', '3'), +('11', '62', '14', '26780', '16407', '3'), +('11', '62', '14', '28981', '15454', '3'), +('11', '62', '11', '26778', '19142', '3'), +('11', '62', '11', '30562', '13588', '3'), +('11', '62', '11', '1554', '12678', '3'), +('11', '62', '11', '28948', '12652', '3'), +('11', '63', '22', '66397', '0', '3'), +('11', '63', '22', '61948', '0', '3'), +('11', '63', '22', '21805', '0', '3'), +('11', '63', '22', '21807', '0', '3'), +('11', '63', '1', '30552', '18477', '3'), +('11', '63', '1', '28944', '13927', '3'), +('11', '63', '1', '29861', '12824', '3'), +('11', '63', '1', '63170', '12306', '3'), +('11', '63', '2', '26763', '30095', '3'), +('11', '63', '2', '1211', '18459', '3'), +('11', '63', '2', '51235', '14406', '3'), +('11', '63', '2', '1867', '14124', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '63', '3', '5772', '19831', '3'), +('11', '63', '3', '30553', '13156', '3'), +('11', '63', '3', '31233', '12332', '3'), +('11', '63', '3', '7387', '12065', '3'), +('11', '63', '5', '26505', '20632', '3'), +('11', '63', '5', '8364', '17547', '3'), +('11', '63', '5', '28901', '14754', '3'), +('11', '63', '5', '29459', '14676', '3'), +('11', '63', '8', '28964', '16244', '3'), +('11', '63', '8', '28992', '16055', '3'), +('11', '63', '8', '28918', '14751', '3'), +('11', '63', '8', '8359', '14255', '3'), +('11', '63', '6', '28920', '14504', '3'), +('11', '63', '6', '28902', '12905', '3'), +('11', '63', '6', '28147', '12693', '3'), +('11', '63', '6', '28919', '10507', '3'), +('11', '63', '17', '26776', '17426', '3'), +('11', '63', '17', '28910', '16733', '3'), +('11', '63', '17', '26604', '16226', '3'), +('11', '63', '17', '55296', '15459', '3'), +('11', '63', '7', '28924', '15295', '3'), +('11', '63', '7', '7868', '14105', '3'), +('11', '63', '7', '8288', '12504', '3'), +('11', '63', '7', '26555', '11907', '3'), +('11', '63', '9', '31314', '21579', '3'), +('11', '63', '9', '59563', '19201', '3'), +('11', '63', '9', '30552', '18477', '3'), +('11', '63', '9', '30168', '17301', '3'), +('11', '63', '15', '51247', '32452', '3'), +('11', '63', '15', '11541', '19551', '3'), +('11', '63', '15', '28993', '15380', '3'), +('11', '63', '15', '28944', '13927', '3'), +('11', '63', '20', '11666', '25252', '3'), +('11', '63', '20', '28916', '16303', '3'), +('11', '63', '20', '30534', '13705', '3'), +('11', '63', '20', '26549', '13061', '3'), +('11', '63', '12', '28144', '47621', '3'), +('11', '63', '12', '30534', '13705', '3'), +('11', '63', '12', '28967', '12003', '3'), +('11', '63', '12', '28972', '10241', '3'), +('11', '63', '18', '26777', '14778', '3'), +('11', '63', '18', '28932', '12333', '3'), +('11', '63', '18', '8289', '12329', '3'), +('11', '63', '18', '27316', '10616', '3'), +('11', '63', '19', '31327', '27392', '3'), +('11', '63', '19', '31408', '20055', '3'), +('11', '63', '19', '28934', '16303', '3'), +('11', '63', '19', '30570', '15604', '3'), +('11', '63', '13', '28980', '35206', '3'), +('11', '63', '13', '26778', '19029', '3'), +('11', '63', '13', '28981', '15456', '3'), +('11', '63', '13', '28917', '14804', '3'), +('11', '63', '14', '28980', '35206', '3'), +('11', '63', '14', '26778', '19029', '3'), +('11', '63', '14', '26780', '16410', '3'), +('11', '63', '14', '28981', '15456', '3'), +('11', '63', '11', '26778', '19029', '3'), +('11', '63', '11', '30562', '13590', '3'), +('11', '63', '11', '1554', '12680', '3'), +('11', '63', '11', '28948', '12652', '3'), +('11', '64', '22', '66397', '0', '3'), +('11', '64', '22', '61948', '0', '3'), +('11', '64', '22', '21805', '0', '3'), +('11', '64', '22', '21807', '0', '3'), +('11', '64', '1', '30552', '18179', '3'), +('11', '64', '1', '28944', '13929', '3'), +('11', '64', '1', '29861', '12829', '3'), +('11', '64', '1', '63170', '12208', '3'), +('11', '64', '2', '26763', '29348', '3'), +('11', '64', '2', '1211', '17460', '3'), +('11', '64', '2', '51235', '14309', '3'), +('11', '64', '2', '1867', '13795', '3'), +('11', '64', '3', '5772', '19656', '3'), +('11', '64', '3', '30553', '13158', '3'), +('11', '64', '3', '31233', '12334', '3'), +('11', '64', '3', '7387', '12068', '3'), +('11', '64', '5', '26505', '19482', '3'), +('11', '64', '5', '8364', '17550', '3'), +('11', '64', '5', '28901', '14758', '3'), +('11', '64', '5', '29459', '14347', '3'), +('11', '64', '8', '28964', '16247', '3'), +('11', '64', '8', '28992', '16055', '3'), +('11', '64', '8', '28918', '14751', '3'), +('11', '64', '8', '8359', '14257', '3'), +('11', '64', '6', '28920', '14508', '3'), +('11', '64', '6', '28902', '12905', '3'), +('11', '64', '6', '28147', '12696', '3'), +('11', '64', '6', '28919', '10507', '3'), +('11', '64', '17', '26776', '17431', '3'), +('11', '64', '17', '28910', '16585', '3'), +('11', '64', '17', '26604', '16231', '3'), +('11', '64', '17', '55296', '15463', '3'), +('11', '64', '7', '28924', '15299', '3'), +('11', '64', '7', '7868', '14107', '3'), +('11', '64', '7', '8288', '12504', '3'), +('11', '64', '7', '26555', '11907', '3'), +('11', '64', '9', '31314', '20581', '3'), +('11', '64', '9', '59563', '18201', '3'), +('11', '64', '9', '30552', '18179', '3'), +('11', '64', '9', '28891', '16802', '3'), +('11', '64', '15', '51247', '31302', '3'), +('11', '64', '15', '11541', '18401', '3'), +('11', '64', '15', '28993', '15382', '3'), +('11', '64', '15', '28944', '13929', '3'), +('11', '64', '20', '11666', '24252', '3'), +('11', '64', '20', '28916', '16304', '3'), +('11', '64', '20', '30534', '13708', '3'), +('11', '64', '20', '26549', '13065', '3'), +('11', '64', '12', '28144', '46626', '3'), +('11', '64', '12', '30534', '13708', '3'), +('11', '64', '12', '28967', '12003', '3'), +('11', '64', '12', '28972', '10244', '3'), +('11', '64', '18', '26777', '14780', '3'), +('11', '64', '18', '28932', '12335', '3'), +('11', '64', '18', '8289', '12331', '3'), +('11', '64', '18', '27316', '10617', '3'), +('11', '64', '19', '31327', '26244', '3'), +('11', '64', '19', '31408', '18905', '3'), +('11', '64', '19', '28934', '16103', '3'), +('11', '64', '19', '30570', '15606', '3'), +('11', '64', '13', '28980', '34209', '3'), +('11', '64', '13', '26778', '18915', '3'), +('11', '64', '13', '28981', '15459', '3'), +('11', '64', '13', '28917', '14804', '3'), +('11', '64', '14', '28980', '34209', '3'), +('11', '64', '14', '26778', '18915', '3'), +('11', '64', '14', '26780', '16413', '3'), +('11', '64', '14', '28981', '15459', '3'), +('11', '64', '11', '26778', '18915', '3'), +('11', '64', '11', '30562', '13592', '3'), +('11', '64', '11', '1554', '12682', '3'), +('11', '64', '11', '28948', '12652', '3'), +('11', '65', '22', '66397', '0', '7'), +('11', '65', '22', '62787', '0', '7'), +('11', '65', '22', '61948', '0', '7'), +('11', '65', '22', '21805', '0', '7'), +('11', '65', '1', '69106', '101822', '7'), +('11', '65', '1', '5594', '54631', '7'), +('11', '65', '1', '7130', '38058', '7'), +('11', '65', '1', '52121', '37978', '7'), +('11', '65', '2', '46141', '29571', '7'), +('11', '65', '2', '26763', '28602', '7'), +('11', '65', '2', '68007', '27500', '7'), +('11', '65', '2', '67733', '26882', '7'), +('11', '65', '3', '68819', '50202', '7'), +('11', '65', '3', '68783', '35488', '7'), +('11', '65', '3', '69132', '34779', '7'), +('11', '65', '3', '69157', '32620', '7'), +('11', '65', '5', '62446', '43528', '7'), +('11', '65', '5', '67625', '35284', '7'), +('11', '65', '5', '7756', '33759', '7'), +('11', '65', '5', '69135', '32323', '7'), +('11', '65', '8', '69164', '38409', '7'), +('11', '65', '8', '69064', '31033', '7'), +('11', '65', '8', '69072', '30219', '7'), +('11', '65', '8', '68954', '30203', '7'), +('11', '65', '6', '13638', '41857', '7'), +('11', '65', '6', '13634', '40791', '7'), +('11', '65', '6', '69163', '33884', '7'), +('11', '65', '6', '68841', '32367', '7'), +('11', '65', '17', '47653', '58752', '7'), +('11', '65', '17', '69153', '40053', '7'), +('11', '65', '17', '68782', '32334', '7'), +('11', '65', '17', '68990', '30585', '7'), +('11', '65', '7', '69176', '32568', '7'), +('11', '65', '7', '69082', '29653', '7'), +('11', '65', '7', '68007', '27500', '7'), +('11', '65', '7', '68921', '27081', '7'), +('11', '65', '9', '69129', '53529', '7'), +('11', '65', '9', '68767', '51883', '7'), +('11', '65', '9', '28665', '34512', '7'), +('11', '65', '9', '69100', '31982', '7'), +('11', '65', '15', '68672', '59600', '7'), +('11', '65', '15', '52121', '37978', '7'), +('11', '65', '15', '69160', '32710', '7'), +('11', '65', '15', '69060', '30948', '7'), +('11', '65', '20', '62446', '43528', '7'), +('11', '65', '20', '67625', '35284', '7'), +('11', '65', '20', '69134', '32785', '7'), +('11', '65', '20', '68951', '28335', '7'), +('11', '65', '12', '28144', '45631', '7'), +('11', '65', '12', '69086', '36133', '7'), +('11', '65', '12', '69255', '34342', '7'), +('11', '65', '12', '68007', '27500', '7'), +('11', '65', '18', '69149', '41461', '7'), +('11', '65', '18', '68991', '34770', '7'), +('11', '65', '18', '28649', '27985', '7'), +('11', '65', '18', '68007', '27500', '7'), +('11', '65', '19', '68923', '50168', '7'), +('11', '65', '19', '69251', '34083', '7'), +('11', '65', '19', '69078', '28719', '7'), +('11', '65', '19', '68007', '27500', '7'), +('11', '65', '13', '21876', '43548', '7'), +('11', '65', '13', '26748', '41987', '7'), +('11', '65', '13', '68445', '39749', '7'), +('11', '65', '13', '52054', '34949', '7'), +('11', '65', '14', '69404', '45187', '7'), +('11', '65', '14', '68117', '44268', '7'), +('11', '65', '14', '26748', '41987', '7'), +('11', '65', '14', '52054', '34949', '7'), +('11', '65', '11', '68952', '64594', '7'), +('11', '65', '11', '20508', '60559', '7'), +('11', '65', '11', '20898', '54198', '7'), +('11', '65', '11', '69162', '33652', '7'), +('11', '65', '22', '66397', '0', '6'), +('11', '65', '22', '62787', '0', '6'), +('11', '65', '22', '61948', '0', '6'), +('11', '65', '22', '21805', '0', '6'), +('11', '65', '1', '5594', '54631', '6'), +('11', '65', '1', '7130', '38058', '6'), +('11', '65', '1', '4118', '30805', '6'), +('11', '65', '1', '7132', '30483', '6'), +('11', '65', '2', '26763', '28602', '6'), +('11', '65', '2', '68007', '27500', '6'), +('11', '65', '2', '68006', '22000', '6'), +('11', '65', '2', '68195', '21781', '6'), +('11', '65', '3', '68007', '27500', '6'), +('11', '65', '3', '9435', '22838', '6'), +('11', '65', '3', '68006', '22000', '6'), +('11', '65', '3', '42230', '20000', '6'), +('11', '65', '5', '62446', '43528', '6'), +('11', '65', '5', '7756', '33759', '6'), +('11', '65', '5', '7769', '29688', '6'), +('11', '65', '5', '8774', '27541', '6'), +('11', '65', '8', '68007', '27500', '6'), +('11', '65', '8', '15815', '26752', '6'), +('11', '65', '8', '15805', '26196', '6'), +('11', '65', '8', '15847', '22713', '6'), +('11', '65', '6', '13638', '41857', '6'), +('11', '65', '6', '13634', '40791', '6'), +('11', '65', '6', '68007', '27500', '6'), +('11', '65', '6', '28661', '25683', '6'), +('11', '65', '17', '47653', '58752', '6'), +('11', '65', '17', '68007', '27500', '6'), +('11', '65', '17', '69403', '27455', '6'), +('11', '65', '17', '14747', '22011', '6'), +('11', '65', '7', '68007', '27500', '6'), +('11', '65', '7', '68006', '22000', '6'), +('11', '65', '7', '11618', '20716', '6'), +('11', '65', '7', '42230', '20000', '6'), +('11', '65', '9', '28665', '34512', '6'), +('11', '65', '9', '68007', '27500', '6'), +('11', '65', '9', '28668', '26001', '6'), +('11', '65', '9', '59564', '22201', '6'), +('11', '65', '15', '51247', '30152', '6'), +('11', '65', '15', '32109', '28457', '6'), +('11', '65', '15', '68007', '27500', '6'), +('11', '65', '15', '71237', '27006', '6'), +('11', '65', '20', '62446', '43528', '6'), +('11', '65', '20', '68007', '27500', '6'), +('11', '65', '20', '11666', '23252', '6'), +('11', '65', '20', '15927', '22953', '6'), +('11', '65', '12', '28144', '45631', '6'), +('11', '65', '12', '68007', '27500', '6'), +('11', '65', '12', '26996', '27033', '6'), +('11', '65', '12', '68006', '22000', '6'), +('11', '65', '18', '28649', '27985', '6'), +('11', '65', '18', '68007', '27500', '6'), +('11', '65', '18', '68006', '22000', '6'), +('11', '65', '18', '42230', '20000', '6'), +('11', '65', '19', '68007', '27500', '6'), +('11', '65', '19', '31327', '25095', '6'), +('11', '65', '19', '68196', '23447', '6'), +('11', '65', '19', '68006', '22000', '6'), +('11', '65', '13', '21876', '43548', '6'), +('11', '65', '13', '26748', '41987', '6'), +('11', '65', '13', '52054', '34949', '6'), +('11', '65', '13', '28980', '33211', '6'), +('11', '65', '14', '69404', '45187', '6'), +('11', '65', '14', '68117', '44268', '6'), +('11', '65', '14', '26748', '41987', '6'), +('11', '65', '14', '52054', '34949', '6'), +('11', '65', '11', '20508', '60559', '6'), +('11', '65', '11', '20898', '54198', '6'), +('11', '65', '11', '68007', '27500', '6'), +('11', '65', '11', '20496', '25869', '6'), +('11', '65', '22', '66397', '0', '5'), +('11', '65', '22', '62787', '0', '5'), +('11', '65', '22', '61948', '0', '5'), +('11', '65', '22', '21805', '0', '5'), +('11', '65', '1', '5594', '54631', '5'), +('11', '65', '1', '7130', '38058', '5'), +('11', '65', '1', '4118', '30805', '5'), +('11', '65', '1', '7132', '30483', '5'), +('11', '65', '2', '26763', '28602', '5'), +('11', '65', '2', '68195', '21781', '5'), +('11', '65', '2', '28653', '18177', '5'), +('11', '65', '2', '16158', '17567', '5'), +('11', '65', '3', '9435', '22838', '5'), +('11', '65', '3', '5772', '19481', '5'), +('11', '65', '3', '9444', '16766', '5'), +('11', '65', '3', '9468', '16159', '5'), +('11', '65', '5', '7756', '33759', '5'), +('11', '65', '5', '7769', '29688', '5'), +('11', '65', '5', '8774', '27541', '5'), +('11', '65', '5', '8782', '19203', '5'), +('11', '65', '8', '15815', '26752', '5'), +('11', '65', '8', '15805', '26196', '5'), +('11', '65', '8', '15847', '22713', '5'), +('11', '65', '8', '21998', '21863', '5'), +('11', '65', '6', '13638', '41857', '5'), +('11', '65', '6', '13634', '40791', '5'), +('11', '65', '6', '28661', '25683', '5'), +('11', '65', '6', '19144', '15214', '5'), +('11', '65', '17', '47653', '58752', '5'), +('11', '65', '17', '14747', '22011', '5'), +('11', '65', '17', '65242', '18496', '5'), +('11', '65', '17', '26776', '17436', '5'), +('11', '65', '7', '11618', '20716', '5'), +('11', '65', '7', '21994', '19616', '5'), +('11', '65', '7', '11324', '17303', '5'), +('11', '65', '7', '11323', '15816', '5'), +('11', '65', '9', '28665', '34512', '5'), +('11', '65', '9', '28668', '26001', '5'), +('11', '65', '9', '59564', '22201', '5'), +('11', '65', '9', '68198', '21639', '5'), +('11', '65', '15', '51247', '30152', '5'), +('11', '65', '15', '32109', '28457', '5'), +('11', '65', '15', '14818', '24133', '5'), +('11', '65', '15', '26990', '22391', '5'), +('11', '65', '20', '11666', '23252', '5'), +('11', '65', '20', '15927', '22953', '5'), +('11', '65', '20', '15877', '22374', '5'), +('11', '65', '20', '15881', '22158', '5'), +('11', '65', '12', '28144', '45631', '5'), +('11', '65', '12', '26996', '27033', '5'), +('11', '65', '12', '13623', '17089', '5'), +('11', '65', '12', '11878', '14939', '5'), +('11', '65', '18', '28649', '27985', '5'), +('11', '65', '18', '19024', '19004', '5'), +('11', '65', '18', '26777', '14782', '5'), +('11', '65', '18', '28932', '12337', '5'), +('11', '65', '19', '31327', '25095', '5'), +('11', '65', '19', '68196', '23447', '5'), +('11', '65', '19', '31408', '17756', '5'), +('11', '65', '19', '20431', '16965', '5'), +('11', '65', '13', '21876', '43548', '5'), +('11', '65', '13', '26748', '41987', '5'), +('11', '65', '13', '52054', '34949', '5'), +('11', '65', '13', '28980', '33211', '5'), +('11', '65', '14', '26748', '41987', '5'), +('11', '65', '14', '52054', '34949', '5'), +('11', '65', '14', '28980', '33211', '5'), +('11', '65', '14', '27285', '31414', '5'), +('11', '65', '11', '20508', '60559', '5'), +('11', '65', '11', '20898', '54198', '5'), +('11', '65', '11', '20496', '25869', '5'), +('11', '65', '11', '20519', '25559', '5'), +('11', '65', '22', '66397', '0', '4'), +('11', '65', '22', '62787', '0', '4'), +('11', '65', '22', '61948', '0', '4'), +('11', '65', '22', '21805', '0', '4'), +('11', '65', '1', '5594', '54631', '4'), +('11', '65', '1', '7130', '38058', '4'), +('11', '65', '1', '4118', '30805', '4'), +('11', '65', '1', '7132', '30483', '4'), +('11', '65', '2', '26763', '28602', '4'), +('11', '65', '2', '68195', '21781', '4'), +('11', '65', '2', '28653', '18177', '4'), +('11', '65', '2', '16158', '17567', '4'), +('11', '65', '3', '9435', '22838', '4'), +('11', '65', '3', '5772', '19481', '4'), +('11', '65', '3', '9444', '16766', '4'), +('11', '65', '3', '9468', '16159', '4'), +('11', '65', '5', '7756', '33759', '4'), +('11', '65', '5', '7769', '29688', '4'), +('11', '65', '5', '8774', '27541', '4'), +('11', '65', '5', '8782', '19203', '4'), +('11', '65', '8', '15815', '26752', '4'), +('11', '65', '8', '15805', '26196', '4'), +('11', '65', '8', '15847', '22713', '4'), +('11', '65', '8', '21998', '21863', '4'), +('11', '65', '6', '13638', '41857', '4'), +('11', '65', '6', '13634', '40791', '4'), +('11', '65', '6', '28661', '25683', '4'), +('11', '65', '6', '19144', '15214', '4'), +('11', '65', '17', '47653', '58752', '4'), +('11', '65', '17', '14747', '22011', '4'), +('11', '65', '17', '26776', '17436', '4'), +('11', '65', '17', '28910', '16437', '4'), +('11', '65', '7', '11618', '20716', '4'), +('11', '65', '7', '21994', '19616', '4'), +('11', '65', '7', '11324', '17303', '4'), +('11', '65', '7', '11323', '15816', '4'), +('11', '65', '9', '28665', '34512', '4'), +('11', '65', '9', '28668', '26001', '4'), +('11', '65', '9', '59564', '22201', '4'), +('11', '65', '9', '68198', '21639', '4'), +('11', '65', '15', '51247', '30152', '4'), +('11', '65', '15', '32109', '28457', '4'), +('11', '65', '15', '14818', '24133', '4'), +('11', '65', '15', '26990', '22391', '4'), +('11', '65', '20', '11666', '23252', '4'), +('11', '65', '20', '15927', '22953', '4'), +('11', '65', '20', '15877', '22374', '4'), +('11', '65', '20', '15881', '22158', '4'), +('11', '65', '12', '28144', '45631', '4'), +('11', '65', '12', '26996', '27033', '4'), +('11', '65', '12', '13623', '17089', '4'), +('11', '65', '12', '11878', '14939', '4'), +('11', '65', '18', '28649', '27985', '4'), +('11', '65', '18', '19024', '19004', '4'), +('11', '65', '18', '26777', '14782', '4'), +('11', '65', '18', '28932', '12337', '4'), +('11', '65', '19', '31327', '25095', '4'), +('11', '65', '19', '68196', '23447', '4'), +('11', '65', '19', '31408', '17756', '4'), +('11', '65', '19', '20431', '16965', '4'), +('11', '65', '13', '21876', '43548', '4'), +('11', '65', '13', '26748', '41987', '4'), +('11', '65', '13', '52054', '34949', '4'), +('11', '65', '13', '28980', '33211', '4'), +('11', '65', '14', '26748', '41987', '4'), +('11', '65', '14', '52054', '34949', '4'), +('11', '65', '14', '28980', '33211', '4'), +('11', '65', '14', '27285', '31414', '4'), +('11', '65', '11', '20508', '60559', '4'), +('11', '65', '11', '20898', '54198', '4'), +('11', '65', '11', '20496', '25869', '4'), +('11', '65', '11', '20519', '25559', '4'), +('11', '66', '22', '66397', '0', '7'), +('11', '66', '22', '62787', '0', '7'), +('11', '66', '22', '61948', '0', '7'), +('11', '66', '22', '21805', '0', '7'), +('11', '66', '1', '69106', '100078', '7'), +('11', '66', '1', '5594', '53136', '7'), +('11', '66', '1', '7130', '37563', '7'), +('11', '66', '1', '52121', '37481', '7'), +('11', '66', '2', '46141', '29575', '7'), +('11', '66', '2', '26763', '27855', '7'), +('11', '66', '2', '67733', '26887', '7'), +('11', '66', '2', '68007', '26250', '7'), +('11', '66', '3', '68819', '48705', '7'), +('11', '66', '3', '68783', '34992', '7'), +('11', '66', '3', '69132', '34784', '7'), +('11', '66', '3', '69157', '32624', '7'), +('11', '66', '5', '62446', '42281', '7'), +('11', '66', '5', '67625', '35289', '7'), +('11', '66', '5', '7756', '32610', '7'), +('11', '66', '5', '69135', '32327', '7'), +('11', '66', '8', '69164', '38264', '7'), +('11', '66', '8', '69064', '31038', '7'), +('11', '66', '8', '69072', '30223', '7'), +('11', '66', '8', '68954', '30206', '7'), +('11', '66', '6', '13638', '40861', '7'), +('11', '66', '6', '13634', '39794', '7'), +('11', '66', '6', '69163', '33889', '7'), +('11', '66', '6', '68841', '32172', '7'), +('11', '66', '17', '47653', '57258', '7'), +('11', '66', '17', '69153', '39879', '7'), +('11', '66', '17', '68782', '32139', '7'), +('11', '66', '17', '68990', '30590', '7'), +('11', '66', '7', '69176', '32572', '7'), +('11', '66', '7', '69082', '29656', '7'), +('11', '66', '7', '68921', '27086', '7'), +('11', '66', '7', '68007', '26250', '7'), +('11', '66', '9', '69129', '52732', '7'), +('11', '66', '9', '68767', '50385', '7'), +('11', '66', '9', '28665', '34015', '7'), +('11', '66', '9', '69100', '31987', '7'), +('11', '66', '15', '68672', '58353', '7'), +('11', '66', '15', '52121', '37481', '7'), +('11', '66', '15', '69160', '32710', '7'), +('11', '66', '15', '69060', '30954', '7'), +('11', '66', '20', '62446', '42281', '7'), +('11', '66', '20', '67625', '35289', '7'), +('11', '66', '20', '69134', '32790', '7'), +('11', '66', '20', '68951', '28340', '7'), +('11', '66', '12', '28144', '44636', '7'), +('11', '66', '12', '69086', '35838', '7'), +('11', '66', '12', '69255', '34345', '7'), +('11', '66', '12', '26996', '26838', '7'), +('11', '66', '18', '69149', '41216', '7'), +('11', '66', '18', '68991', '34475', '7'), +('11', '66', '18', '28649', '27990', '7'), +('11', '66', '18', '68751', '26834', '7'), +('11', '66', '19', '68923', '48672', '7'), +('11', '66', '19', '69251', '34088', '7'), +('11', '66', '19', '69078', '28723', '7'), +('11', '66', '19', '68007', '26250', '7'), +('11', '66', '13', '21876', '42553', '7'), +('11', '66', '13', '26748', '40741', '7'), +('11', '66', '13', '68445', '38502', '7'), +('11', '66', '13', '52054', '33802', '7'), +('11', '66', '14', '69404', '43940', '7'), +('11', '66', '14', '68117', '43018', '7'), +('11', '66', '14', '26748', '40741', '7'), +('11', '66', '14', '52054', '33802', '7'), +('11', '66', '11', '68952', '63098', '7'), +('11', '66', '11', '20508', '59309', '7'), +('11', '66', '11', '20898', '52701', '7'), +('11', '66', '11', '69162', '33658', '7'), +('11', '67', '22', '66397', '0', '7'), +('11', '67', '22', '62787', '0', '7'), +('11', '67', '22', '61948', '0', '7'), +('11', '67', '22', '21805', '0', '7'), +('11', '67', '1', '69106', '98334', '7'), +('11', '67', '1', '5594', '51641', '7'), +('11', '67', '1', '7130', '37068', '7'), +('11', '67', '1', '52121', '36984', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '67', '2', '46141', '29579', '7'), +('11', '67', '2', '26763', '27108', '7'), +('11', '67', '2', '67733', '26892', '7'), +('11', '67', '2', '68007', '25000', '7'), +('11', '67', '3', '68819', '47208', '7'), +('11', '67', '3', '69132', '34789', '7'), +('11', '67', '3', '68783', '34496', '7'), +('11', '67', '3', '69157', '32628', '7'), +('11', '67', '5', '62446', '41034', '7'), +('11', '67', '5', '67625', '35294', '7'), +('11', '67', '5', '69135', '32331', '7'), +('11', '67', '5', '7756', '31462', '7'), +('11', '67', '8', '69164', '38119', '7'), +('11', '67', '8', '69064', '31043', '7'), +('11', '67', '8', '69072', '30227', '7'), +('11', '67', '8', '68954', '30209', '7'), +('11', '67', '6', '13638', '39865', '7'), +('11', '67', '6', '13634', '38798', '7'), +('11', '67', '6', '69163', '33894', '7'), +('11', '67', '6', '68841', '31976', '7'), +('11', '67', '17', '47653', '55764', '7'), +('11', '67', '17', '69153', '39705', '7'), +('11', '67', '17', '68782', '31944', '7'), +('11', '67', '17', '68990', '30595', '7'), +('11', '67', '7', '69176', '32576', '7'), +('11', '67', '7', '69082', '29659', '7'), +('11', '67', '7', '68921', '27091', '7'), +('11', '67', '7', '68007', '25000', '7'), +('11', '67', '9', '69129', '51936', '7'), +('11', '67', '9', '68767', '48887', '7'), +('11', '67', '9', '28665', '33519', '7'), +('11', '67', '9', '69100', '31992', '7'), +('11', '67', '15', '68672', '57106', '7'), +('11', '67', '15', '52121', '36984', '7'), +('11', '67', '15', '69160', '32710', '7'), +('11', '67', '15', '69060', '30960', '7'), +('11', '67', '20', '62446', '41034', '7'), +('11', '67', '20', '67625', '35294', '7'), +('11', '67', '20', '69134', '32795', '7'), +('11', '67', '20', '68951', '28345', '7'), +('11', '67', '12', '28144', '43641', '7'), +('11', '67', '12', '69086', '35543', '7'), +('11', '67', '12', '69255', '34349', '7'), +('11', '67', '12', '26996', '26643', '7'), +('11', '67', '18', '69149', '40972', '7'), +('11', '67', '18', '68991', '34179', '7'), +('11', '67', '18', '28649', '27995', '7'), +('11', '67', '18', '68751', '26839', '7'), +('11', '67', '19', '68923', '47176', '7'), +('11', '67', '19', '69251', '34093', '7'), +('11', '67', '19', '69078', '28727', '7'), +('11', '67', '19', '68007', '25000', '7'), +('11', '67', '13', '21876', '41557', '7'), +('11', '67', '13', '26748', '39495', '7'), +('11', '67', '13', '68445', '37255', '7'), +('11', '67', '13', '69159', '33363', '7'), +('11', '67', '14', '69404', '42693', '7'), +('11', '67', '14', '68117', '41768', '7'), +('11', '67', '14', '26748', '39495', '7'), +('11', '67', '14', '69159', '33363', '7'), +('11', '67', '11', '68952', '61602', '7'), +('11', '67', '11', '20508', '58059', '7'), +('11', '67', '11', '20898', '51204', '7'), +('11', '67', '11', '69162', '33664', '7'), +('11', '68', '22', '66397', '0', '7'), +('11', '68', '22', '62787', '0', '7'), +('11', '68', '22', '61948', '0', '7'), +('11', '68', '22', '21805', '0', '7'), +('11', '68', '1', '69106', '96590', '7'), +('11', '68', '1', '5594', '50146', '7'), +('11', '68', '1', '7130', '36573', '7'), +('11', '68', '1', '52121', '36487', '7'), +('11', '68', '2', '46141', '29583', '7'), +('11', '68', '2', '67733', '26897', '7'), +('11', '68', '2', '26763', '26361', '7'), +('11', '68', '2', '68007', '23750', '7'), +('11', '68', '3', '68819', '45711', '7'), +('11', '68', '3', '69132', '34794', '7'), +('11', '68', '3', '68783', '34000', '7'), +('11', '68', '3', '69157', '32632', '7'), +('11', '68', '5', '62446', '39788', '7'), +('11', '68', '5', '67625', '35299', '7'), +('11', '68', '5', '69135', '32335', '7'), +('11', '68', '5', '69097', '30648', '7'), +('11', '68', '8', '69164', '37974', '7'), +('11', '68', '8', '69064', '31048', '7'), +('11', '68', '8', '69072', '30231', '7'), +('11', '68', '8', '68954', '30212', '7'), +('11', '68', '6', '13638', '38869', '7'), +('11', '68', '6', '13634', '37802', '7'), +('11', '68', '6', '69163', '33899', '7'), +('11', '68', '6', '68841', '31780', '7'), +('11', '68', '17', '47653', '54270', '7'), +('11', '68', '17', '69153', '39531', '7'), +('11', '68', '17', '68782', '31749', '7'), +('11', '68', '17', '68990', '30600', '7'), +('11', '68', '7', '69176', '32580', '7'), +('11', '68', '7', '69082', '29662', '7'), +('11', '68', '7', '68921', '27096', '7'), +('11', '68', '7', '68007', '23750', '7'), +('11', '68', '9', '69129', '51139', '7'), +('11', '68', '9', '68767', '47390', '7'), +('11', '68', '9', '28665', '33022', '7'), +('11', '68', '9', '69100', '31997', '7'), +('11', '68', '15', '68672', '55859', '7'), +('11', '68', '15', '52121', '36487', '7'), +('11', '68', '15', '69160', '32710', '7'), +('11', '68', '15', '69060', '30966', '7'), +('11', '68', '20', '62446', '39788', '7'), +('11', '68', '20', '67625', '35299', '7'), +('11', '68', '20', '69134', '32800', '7'), +('11', '68', '20', '68951', '28350', '7'), +('11', '68', '12', '28144', '42646', '7'), +('11', '68', '12', '69086', '35248', '7'), +('11', '68', '12', '69255', '34353', '7'), +('11', '68', '12', '26996', '26448', '7'), +('11', '68', '18', '69149', '40727', '7'), +('11', '68', '18', '68991', '33883', '7'), +('11', '68', '18', '28649', '28000', '7'), +('11', '68', '18', '68751', '26844', '7'), +('11', '68', '19', '68923', '45680', '7'), +('11', '68', '19', '69251', '34098', '7'), +('11', '68', '19', '69078', '28732', '7'), +('11', '68', '19', '68007', '23750', '7'), +('11', '68', '13', '21876', '40561', '7'), +('11', '68', '13', '26748', '38248', '7'), +('11', '68', '13', '68445', '36008', '7'), +('11', '68', '13', '69159', '33369', '7'), +('11', '68', '14', '69404', '41446', '7'), +('11', '68', '14', '68117', '40518', '7'), +('11', '68', '14', '26748', '38248', '7'), +('11', '68', '14', '69159', '33369', '7'), +('11', '68', '11', '68952', '60106', '7'), +('11', '68', '11', '20508', '56809', '7'), +('11', '68', '11', '20898', '49707', '7'), +('11', '68', '11', '69162', '33670', '7'), +('11', '69', '22', '66397', '0', '7'), +('11', '69', '22', '62787', '0', '7'), +('11', '69', '22', '61948', '0', '7'), +('11', '69', '22', '21805', '0', '7'), +('11', '69', '1', '69106', '94846', '7'), +('11', '69', '1', '5594', '48652', '7'), +('11', '69', '1', '7130', '36078', '7'), +('11', '69', '1', '52121', '35990', '7'), +('11', '69', '2', '46141', '29587', '7'), +('11', '69', '2', '67733', '26902', '7'), +('11', '69', '2', '26763', '25614', '7'), +('11', '69', '2', '68007', '22500', '7'), +('11', '69', '3', '68819', '44214', '7'), +('11', '69', '3', '69132', '34799', '7'), +('11', '69', '3', '68783', '33504', '7'), +('11', '69', '3', '69157', '32636', '7'), +('11', '69', '5', '62446', '38541', '7'), +('11', '69', '5', '67625', '35304', '7'), +('11', '69', '5', '69135', '32339', '7'), +('11', '69', '5', '69097', '30653', '7'), +('11', '69', '8', '69164', '37829', '7'), +('11', '69', '8', '69064', '31053', '7'), +('11', '69', '8', '69072', '30235', '7'), +('11', '69', '8', '68954', '30215', '7'), +('11', '69', '6', '13638', '37873', '7'), +('11', '69', '6', '13634', '36805', '7'), +('11', '69', '6', '69163', '33904', '7'), +('11', '69', '6', '68841', '31584', '7'), +('11', '69', '17', '47653', '52776', '7'), +('11', '69', '17', '69153', '39357', '7'), +('11', '69', '17', '68782', '31554', '7'), +('11', '69', '17', '68990', '30605', '7'), +('11', '69', '7', '69176', '32584', '7'), +('11', '69', '7', '69082', '29665', '7'), +('11', '69', '7', '68921', '27101', '7'), +('11', '69', '7', '68007', '22500', '7'), +('11', '69', '9', '69129', '50342', '7'), +('11', '69', '9', '68767', '45892', '7'), +('11', '69', '9', '28665', '32526', '7'), +('11', '69', '9', '69100', '32002', '7'), +('11', '69', '15', '68672', '54612', '7'), +('11', '69', '15', '52121', '35990', '7'), +('11', '69', '15', '69160', '32710', '7'), +('11', '69', '15', '69060', '30972', '7'), +('11', '69', '20', '62446', '38541', '7'), +('11', '69', '20', '67625', '35304', '7'), +('11', '69', '20', '69134', '32805', '7'), +('11', '69', '20', '68951', '28355', '7'), +('11', '69', '12', '28144', '41651', '7'), +('11', '69', '12', '69086', '34953', '7'), +('11', '69', '12', '69255', '34356', '7'), +('11', '69', '12', '26996', '26253', '7'), +('11', '69', '18', '69149', '40482', '7'), +('11', '69', '18', '68991', '33587', '7'), +('11', '69', '18', '28649', '28005', '7'), +('11', '69', '18', '68751', '26849', '7'), +('11', '69', '19', '68923', '44184', '7'), +('11', '69', '19', '69251', '34103', '7'), +('11', '69', '19', '69078', '28736', '7'), +('11', '69', '19', '68196', '23472', '7'), +('11', '69', '13', '21876', '39565', '7'), +('11', '69', '13', '26748', '37002', '7'), +('11', '69', '13', '68445', '34761', '7'), +('11', '69', '13', '69159', '33375', '7'), +('11', '69', '14', '69404', '40199', '7'), +('11', '69', '14', '68117', '39268', '7'), +('11', '69', '14', '26748', '37002', '7'), +('11', '69', '14', '69159', '33375', '7'), +('11', '69', '11', '68952', '58610', '7'), +('11', '69', '11', '20508', '55559', '7'), +('11', '69', '11', '20898', '48210', '7'), +('11', '69', '11', '69162', '33676', '7'), +('11', '70', '22', '21805', '0', '11'), +('11', '70', '22', '61948', '0', '11'), +('11', '70', '22', '21807', '0', '11'), +('11', '70', '22', '12425', '0', '11'), +('11', '70', '1', '83594', '93261', '11'), +('11', '70', '1', '69106', '93103', '11'), +('11', '70', '1', '70981', '61150', '11'), +('11', '70', '1', '5594', '47157', '11'), +('11', '70', '2', '39358', '50359', '11'), +('11', '70', '2', '83563', '42020', '11'), +('11', '70', '2', '39285', '41486', '11'), +('11', '70', '2', '70923', '38381', '11'), +('11', '70', '3', '39368', '50876', '11'), +('11', '70', '3', '70602', '49684', '11'), +('11', '70', '3', '83658', '47423', '11'), +('11', '70', '3', '39312', '43781', '11'), +('11', '70', '5', '83612', '68680', '11'), +('11', '70', '5', '51701', '50736', '11'), +('11', '70', '5', '39340', '46726', '11'), +('11', '70', '5', '39328', '43524', '11'), +('11', '70', '8', '70704', '95099', '11'), +('11', '70', '8', '83659', '44588', '11'), +('11', '70', '8', '39352', '44138', '11'), +('11', '70', '8', '39330', '43575', '11'), +('11', '70', '6', '39224', '88948', '11'), +('11', '70', '6', '83407', '53588', '11'), +('11', '70', '6', '39362', '46500', '11'), +('11', '70', '6', '39263', '45828', '11'), +('11', '70', '17', '47653', '51282', '11'), +('11', '70', '17', '83606', '50503', '11'), +('11', '70', '17', '70928', '43414', '11'), +('11', '70', '17', '69153', '39184', '11'), +('11', '70', '7', '83567', '41170', '11'), +('11', '70', '7', '70924', '37645', '11'), +('11', '70', '7', '47207', '35939', '11'), +('11', '70', '7', '83543', '35809', '11'), +('11', '70', '9', '39226', '75655', '11'), +('11', '70', '9', '69129', '49545', '11'), +('11', '70', '9', '39336', '47023', '11'), +('11', '70', '9', '51709', '44520', '11'), +('11', '70', '15', '68672', '53365', '11'), +('11', '70', '15', '39376', '50251', '11'), +('11', '70', '15', '83595', '47912', '11'), +('11', '70', '15', '83628', '42792', '11'), +('11', '70', '20', '47281', '73134', '11'), +('11', '70', '20', '47284', '67518', '11'), +('11', '70', '20', '71609', '49605', '11'), +('11', '70', '20', '39350', '46311', '11'), +('11', '70', '12', '83553', '41209', '11'), +('11', '70', '12', '28144', '40656', '11'), +('11', '70', '12', '83571', '40545', '11'), +('11', '70', '12', '70926', '37632', '11'), +('11', '70', '18', '83610', '71652', '11'), +('11', '70', '18', '70929', '58738', '11'), +('11', '70', '18', '69149', '40237', '11'), +('11', '70', '18', '71649', '38181', '11'), +('11', '70', '19', '83575', '80845', '11'), +('11', '70', '19', '70927', '69613', '11'), +('11', '70', '19', '68923', '42688', '11'), +('11', '70', '19', '83497', '40657', '11'), +('11', '70', '13', '83632', '79690', '11'), +('11', '70', '13', '39295', '49683', '11'), +('11', '70', '13', '39351', '44984', '11'), +('11', '70', '13', '39324', '42877', '11'), +('11', '70', '14', '83500', '70741', '11'), +('11', '70', '14', '83641', '50507', '11'), +('11', '70', '14', '39372', '50243', '11'), +('11', '70', '14', '39295', '49683', '11'), +('11', '70', '11', '83642', '94943', '11'), +('11', '70', '11', '68952', '57114', '11'), +('11', '70', '11', '20508', '54310', '11'), +('11', '70', '11', '39320', '50732', '11'), +('11', '70', '22', '61948', '0', '10'), +('11', '70', '22', '66397', '0', '10'), +('11', '70', '22', '21805', '0', '10'), +('11', '70', '22', '21807', '0', '10'), +('11', '70', '1', '83594', '93261', '10'), +('11', '70', '1', '69106', '93103', '10'), +('11', '70', '1', '70981', '61150', '10'), +('11', '70', '1', '5594', '47157', '10'), +('11', '70', '2', '83563', '42020', '10'), +('11', '70', '2', '70923', '38381', '10'), +('11', '70', '2', '47211', '35038', '10'), +('11', '70', '2', '83505', '34207', '10'), +('11', '70', '3', '70602', '49684', '10'), +('11', '70', '3', '83658', '47423', '10'), +('11', '70', '3', '47299', '43136', '10'), +('11', '70', '3', '68819', '42717', '10'), +('11', '70', '5', '83612', '68680', '10'), +('11', '70', '5', '47276', '42823', '10'), +('11', '70', '5', '83651', '42417', '10'), +('11', '70', '5', '83620', '42029', '10'), +('11', '70', '8', '70704', '95099', '10'), +('11', '70', '8', '83659', '44588', '10'), +('11', '70', '8', '47306', '43121', '10'), +('11', '70', '8', '71665', '40664', '10'), +('11', '70', '6', '83407', '53588', '10'), +('11', '70', '6', '83660', '43888', '10'), +('11', '70', '6', '83635', '41463', '10'), +('11', '70', '6', '47280', '38827', '10'), +('11', '70', '17', '47653', '51282', '10'), +('11', '70', '17', '83606', '50503', '10'), +('11', '70', '17', '70928', '43414', '10'), +('11', '70', '17', '69153', '39184', '10'), +('11', '70', '7', '83567', '41170', '10'), +('11', '70', '7', '70924', '37645', '10'), +('11', '70', '7', '47207', '35939', '10'), +('11', '70', '7', '83543', '35809', '10'), +('11', '70', '9', '69129', '49545', '10'), +('11', '70', '9', '68767', '44394', '10'), +('11', '70', '9', '83655', '44384', '10'), +('11', '70', '9', '70925', '36909', '10'), +('11', '70', '15', '68672', '53365', '10'), +('11', '70', '15', '83595', '47912', '10'), +('11', '70', '15', '83628', '42792', '10'), +('11', '70', '15', '83629', '41380', '10'), +('11', '70', '20', '47281', '73134', '10'), +('11', '70', '20', '47284', '67518', '10'), +('11', '70', '20', '71609', '49605', '10'), +('11', '70', '20', '83650', '42337', '10'), +('11', '70', '12', '83553', '41209', '10'), +('11', '70', '12', '28144', '40656', '10'), +('11', '70', '12', '83571', '40545', '10'), +('11', '70', '12', '70926', '37632', '10'), +('11', '70', '18', '83610', '71652', '10'), +('11', '70', '18', '70929', '58738', '10'), +('11', '70', '18', '69149', '40237', '10'), +('11', '70', '18', '71649', '38181', '10'), +('11', '70', '19', '83575', '80845', '10'), +('11', '70', '19', '70927', '69613', '10'), +('11', '70', '19', '68923', '42688', '10'), +('11', '70', '19', '83497', '40657', '10'), +('11', '70', '13', '83632', '79690', '10'), +('11', '70', '13', '64067', '41635', '10'), +('11', '70', '13', '71671', '40739', '10'), +('11', '70', '13', '21876', '38570', '10'), +('11', '70', '14', '83500', '70741', '10'), +('11', '70', '14', '83641', '50507', '10'), +('11', '70', '14', '83656', '45206', '10'), +('11', '70', '14', '39315', '43186', '10'), +('11', '70', '11', '83642', '94943', '10'), +('11', '70', '11', '68952', '57114', '10'), +('11', '70', '11', '20508', '54310', '10'), +('11', '70', '11', '71652', '49131', '10'), +('11', '70', '22', '66397', '0', '9'), +('11', '70', '22', '62787', '0', '9'), +('11', '70', '22', '61948', '0', '9'), +('11', '70', '22', '21805', '0', '9'), +('11', '70', '1', '69106', '93103', '9'), +('11', '70', '1', '70981', '61150', '9'), +('11', '70', '1', '5594', '47157', '9'), +('11', '70', '1', '47288', '39793', '9'), +('11', '70', '2', '70923', '38381', '9'), +('11', '70', '2', '47211', '35038', '9'), +('11', '70', '2', '70724', '33629', '9'), +('11', '70', '2', '46141', '29592', '9'), +('11', '70', '3', '70602', '49684', '9'), +('11', '70', '3', '47299', '43136', '9'), +('11', '70', '3', '68819', '42717', '9'), +('11', '70', '3', '47302', '37353', '9'), +('11', '70', '5', '47276', '42823', '9'), +('11', '70', '5', '62446', '37294', '9'), +('11', '70', '5', '67625', '35309', '9'), +('11', '70', '5', '47224', '34874', '9'), +('11', '70', '8', '70704', '95099', '9'), +('11', '70', '8', '47306', '43121', '9'), +('11', '70', '8', '71665', '40664', '9'), +('11', '70', '8', '69164', '37684', '9'), +('11', '70', '6', '47280', '38827', '9'), +('11', '70', '6', '13638', '36877', '9'), +('11', '70', '6', '13634', '35809', '9'), +('11', '70', '6', '47228', '34959', '9'), +('11', '70', '17', '47653', '51282', '9'), +('11', '70', '17', '70928', '43414', '9'), +('11', '70', '17', '69153', '39184', '9'), +('11', '70', '17', '70714', '35077', '9'), +('11', '70', '7', '70924', '37645', '9'), +('11', '70', '7', '47207', '35939', '9'), +('11', '70', '7', '69176', '32588', '9'), +('11', '70', '7', '69082', '29668', '9'), +('11', '70', '9', '69129', '49545', '9'), +('11', '70', '9', '68767', '44394', '9'), +('11', '70', '9', '70925', '36909', '9'), +('11', '70', '9', '47223', '35153', '9'), +('11', '70', '15', '68672', '53365', '9'), +('11', '70', '15', '47290', '38392', '9'), +('11', '70', '15', '47293', '38331', '9'), +('11', '70', '15', '47240', '36647', '9'), +('11', '70', '20', '47281', '73134', '9'), +('11', '70', '20', '47284', '67518', '9'), +('11', '70', '20', '71609', '49605', '9'), +('11', '70', '20', '47282', '37612', '9'), +('11', '70', '12', '28144', '40656', '9'), +('11', '70', '12', '70926', '37632', '9'), +('11', '70', '12', '47215', '35409', '9'), +('11', '70', '12', '69086', '34658', '9'), +('11', '70', '18', '70929', '58738', '9'), +('11', '70', '18', '69149', '40237', '9'), +('11', '70', '18', '71649', '38181', '9'), +('11', '70', '18', '47203', '35683', '9'), +('11', '70', '19', '70927', '69613', '9'), +('11', '70', '19', '68923', '42688', '9'), +('11', '70', '19', '47219', '38640', '9'), +('11', '70', '19', '69251', '34108', '9'), +('11', '70', '13', '64067', '41635', '9'), +('11', '70', '13', '71671', '40739', '9'), +('11', '70', '13', '21876', '38570', '9'), +('11', '70', '13', '47308', '38355', '9'), +('11', '70', '14', '39315', '43186', '9'), +('11', '70', '14', '71661', '42371', '9'), +('11', '70', '14', '71671', '40739', '9'), +('11', '70', '14', '71669', '39911', '9'), +('11', '70', '11', '68952', '57114', '9'), +('11', '70', '11', '20508', '54310', '9'), +('11', '70', '11', '71652', '49131', '9'), +('11', '70', '11', '20898', '46713', '9'), +('11', '70', '22', '66397', '0', '8'), +('11', '70', '22', '62787', '0', '8'), +('11', '70', '22', '61948', '0', '8'), +('11', '70', '22', '21805', '0', '8'), +('11', '70', '1', '69106', '93103', '8'), +('11', '70', '1', '5594', '47157', '8'), +('11', '70', '1', '47288', '39793', '8'), +('11', '70', '1', '47234', '38218', '8'), +('11', '70', '2', '70923', '38381', '8'), +('11', '70', '2', '47211', '35038', '8'), +('11', '70', '2', '70724', '33629', '8'), +('11', '70', '2', '46141', '29592', '8'), +('11', '70', '3', '70602', '49684', '8'), +('11', '70', '3', '47299', '43136', '8'), +('11', '70', '3', '68819', '42717', '8'), +('11', '70', '3', '47302', '37353', '8'), +('11', '70', '5', '47276', '42823', '8'), +('11', '70', '5', '62446', '37294', '8'), +('11', '70', '5', '67625', '35309', '8'), +('11', '70', '5', '47224', '34874', '8'), +('11', '70', '8', '70704', '95099', '8'), +('11', '70', '8', '47306', '43121', '8'), +('11', '70', '8', '69164', '37684', '8'), +('11', '70', '8', '47304', '35028', '8'), +('11', '70', '6', '47280', '38827', '8'), +('11', '70', '6', '13638', '36877', '8'), +('11', '70', '6', '13634', '35809', '8'), +('11', '70', '6', '47228', '34959', '8'), +('11', '70', '17', '47653', '51282', '8'), +('11', '70', '17', '70928', '43414', '8'), +('11', '70', '17', '69153', '39184', '8'), +('11', '70', '17', '70714', '35077', '8'), +('11', '70', '7', '70924', '37645', '8'), +('11', '70', '7', '47207', '35939', '8'), +('11', '70', '7', '69176', '32588', '8'), +('11', '70', '7', '69082', '29668', '8'), +('11', '70', '9', '69129', '49545', '8'), +('11', '70', '9', '68767', '44394', '8'), +('11', '70', '9', '70925', '36909', '8'), +('11', '70', '9', '47223', '35153', '8'), +('11', '70', '15', '68672', '53365', '8'), +('11', '70', '15', '47290', '38392', '8'), +('11', '70', '15', '47293', '38331', '8'), +('11', '70', '15', '47240', '36647', '8'), +('11', '70', '20', '47281', '73134', '8'), +('11', '70', '20', '47284', '67518', '8'), +('11', '70', '20', '47282', '37612', '8'), +('11', '70', '20', '62446', '37294', '8'), +('11', '70', '12', '28144', '40656', '8'), +('11', '70', '12', '70926', '37632', '8'), +('11', '70', '12', '47215', '35409', '8'), +('11', '70', '12', '69086', '34658', '8'), +('11', '70', '18', '70929', '58738', '8'), +('11', '70', '18', '69149', '40237', '8'), +('11', '70', '18', '47203', '35683', '8'), +('11', '70', '18', '68991', '33291', '8'), +('11', '70', '19', '70927', '69613', '8'), +('11', '70', '19', '68923', '42688', '8'), +('11', '70', '19', '47219', '38640', '8'), +('11', '70', '19', '69251', '34108', '8'), +('11', '70', '13', '64067', '41635', '8'), +('11', '70', '13', '21876', '38570', '8'), +('11', '70', '13', '47308', '38355', '8'), +('11', '70', '13', '47307', '36985', '8'), +('11', '70', '14', '39315', '43186', '8'), +('11', '70', '14', '69404', '38952', '8'), +('11', '70', '14', '47308', '38355', '8'), +('11', '70', '14', '68117', '38018', '8'), +('11', '70', '11', '68952', '57114', '8'), +('11', '70', '11', '20508', '54310', '8'), +('11', '70', '11', '20898', '46713', '8'), +('11', '70', '11', '70296', '40804', '8'), +('11', '71', '22', '21805', '0', '11'), +('11', '71', '22', '61948', '0', '11'), +('11', '71', '22', '21807', '0', '11'), +('11', '71', '22', '12425', '0', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '71', '1', '69106', '91359', '11'), +('11', '71', '1', '83594', '90866', '11'), +('11', '71', '1', '70981', '60157', '11'), +('11', '71', '1', '39353', '45881', '11'), +('11', '71', '2', '39358', '50164', '11'), +('11', '71', '2', '83563', '42028', '11'), +('11', '71', '2', '39285', '41491', '11'), +('11', '71', '2', '70923', '38387', '11'), +('11', '71', '3', '39368', '50883', '11'), +('11', '71', '3', '70602', '48438', '11'), +('11', '71', '3', '83658', '47228', '11'), +('11', '71', '3', '39312', '43787', '11'), +('11', '71', '5', '83612', '67486', '11'), +('11', '71', '5', '51701', '50391', '11'), +('11', '71', '5', '39340', '46733', '11'), +('11', '71', '5', '39328', '43530', '11'), +('11', '71', '8', '70704', '93355', '11'), +('11', '71', '8', '83659', '44588', '11'), +('11', '71', '8', '39352', '44138', '11'), +('11', '71', '8', '39330', '43581', '11'), +('11', '71', '6', '39224', '86552', '11'), +('11', '71', '6', '83407', '52341', '11'), +('11', '71', '6', '39362', '46507', '11'), +('11', '71', '6', '39263', '45632', '11'), +('11', '71', '17', '83606', '50310', '11'), +('11', '71', '17', '47653', '49789', '11'), +('11', '71', '17', '70928', '43414', '11'), +('11', '71', '17', '69153', '39010', '11'), +('11', '71', '7', '83567', '41178', '11'), +('11', '71', '7', '70924', '37649', '11'), +('11', '71', '7', '47207', '35943', '11'), +('11', '71', '7', '83543', '35814', '11'), +('11', '71', '9', '39226', '73910', '11'), +('11', '71', '9', '69129', '48748', '11'), +('11', '71', '9', '39336', '47030', '11'), +('11', '71', '9', '51709', '44525', '11'), +('11', '71', '15', '68672', '52118', '11'), +('11', '71', '15', '39376', '50258', '11'), +('11', '71', '15', '83595', '47567', '11'), +('11', '71', '15', '83628', '42797', '11'), +('11', '71', '20', '47281', '71334', '11'), +('11', '71', '20', '47284', '66021', '11'), +('11', '71', '20', '71609', '48358', '11'), +('11', '71', '20', '39350', '46316', '11'), +('11', '71', '12', '83553', '40914', '11'), +('11', '71', '12', '83571', '40553', '11'), +('11', '71', '12', '28144', '39661', '11'), +('11', '71', '12', '70926', '37638', '11'), +('11', '71', '18', '83610', '70459', '11'), +('11', '71', '18', '70929', '57843', '11'), +('11', '71', '18', '69149', '39992', '11'), +('11', '71', '18', '71649', '37936', '11'), +('11', '71', '19', '83575', '79103', '11'), +('11', '71', '19', '70927', '67621', '11'), +('11', '71', '19', '68923', '41193', '11'), +('11', '71', '19', '83497', '40362', '11'), +('11', '71', '13', '83632', '77946', '11'), +('11', '71', '13', '39295', '49338', '11'), +('11', '71', '13', '39351', '44989', '11'), +('11', '71', '13', '39324', '42884', '11'), +('11', '71', '14', '83500', '68945', '11'), +('11', '71', '14', '39372', '50249', '11'), +('11', '71', '14', '83641', '50163', '11'), +('11', '71', '14', '39295', '49338', '11'), +('11', '71', '11', '83642', '92547', '11'), +('11', '71', '11', '68952', '55618', '11'), +('11', '71', '11', '20508', '53060', '11'), +('11', '71', '11', '39320', '50388', '11'), +('11', '72', '22', '21805', '0', '11'), +('11', '72', '22', '61948', '0', '11'), +('11', '72', '22', '21807', '0', '11'), +('11', '72', '22', '12425', '0', '11'), +('11', '72', '1', '69106', '89615', '11'), +('11', '72', '1', '83594', '88471', '11'), +('11', '72', '1', '70981', '59164', '11'), +('11', '72', '1', '39353', '45889', '11'), +('11', '72', '2', '39358', '49970', '11'), +('11', '72', '2', '83563', '42036', '11'), +('11', '72', '2', '39285', '41497', '11'), +('11', '72', '2', '70923', '38394', '11'), +('11', '72', '3', '39368', '50890', '11'), +('11', '72', '3', '70602', '47192', '11'), +('11', '72', '3', '83658', '47032', '11'), +('11', '72', '3', '39312', '43793', '11'), +('11', '72', '5', '83612', '66292', '11'), +('11', '72', '5', '51701', '50046', '11'), +('11', '72', '5', '39340', '46740', '11'), +('11', '72', '5', '39328', '43536', '11'), +('11', '72', '8', '70704', '91611', '11'), +('11', '72', '8', '83659', '44588', '11'), +('11', '72', '8', '39352', '44138', '11'), +('11', '72', '8', '39330', '43587', '11'), +('11', '72', '6', '39224', '84155', '11'), +('11', '72', '6', '83407', '51093', '11'), +('11', '72', '6', '39362', '46514', '11'), +('11', '72', '6', '39263', '45436', '11'), +('11', '72', '17', '83606', '50117', '11'), +('11', '72', '17', '47653', '48295', '11'), +('11', '72', '17', '70928', '43414', '11'), +('11', '72', '17', '69153', '38836', '11'), +('11', '72', '7', '83567', '41186', '11'), +('11', '72', '7', '70924', '37653', '11'), +('11', '72', '7', '47207', '35948', '11'), +('11', '72', '7', '83543', '35819', '11'), +('11', '72', '9', '39226', '72164', '11'), +('11', '72', '9', '69129', '47951', '11'), +('11', '72', '9', '39336', '47037', '11'), +('11', '72', '9', '51709', '44530', '11'), +('11', '72', '15', '68672', '50872', '11'), +('11', '72', '15', '39376', '50265', '11'), +('11', '72', '15', '83595', '47222', '11'), +('11', '72', '15', '83628', '42801', '11'), +('11', '72', '20', '47281', '69534', '11'), +('11', '72', '20', '47284', '64524', '11'), +('11', '72', '20', '71609', '47111', '11'), +('11', '72', '20', '39350', '46321', '11'), +('11', '72', '12', '83553', '40619', '11'), +('11', '72', '12', '83571', '40562', '11'), +('11', '72', '12', '28144', '38666', '11'), +('11', '72', '12', '70926', '37644', '11'), +('11', '72', '18', '83610', '69266', '11'), +('11', '72', '18', '70929', '56949', '11'), +('11', '72', '18', '69149', '39747', '11'), +('11', '72', '18', '71649', '37690', '11'), +('11', '72', '19', '83575', '77362', '11'), +('11', '72', '19', '70927', '65629', '11'), +('11', '72', '19', '83497', '40067', '11'), +('11', '72', '19', '68923', '39697', '11'), +('11', '72', '13', '83632', '76202', '11'), +('11', '72', '13', '39295', '48993', '11'), +('11', '72', '13', '39351', '44994', '11'), +('11', '72', '13', '39324', '42891', '11'), +('11', '72', '14', '83500', '67149', '11'), +('11', '72', '14', '39372', '50255', '11'), +('11', '72', '14', '83641', '49820', '11'), +('11', '72', '14', '39295', '48993', '11'), +('11', '72', '11', '83642', '90151', '11'), +('11', '72', '11', '68952', '54122', '11'), +('11', '72', '11', '20508', '51810', '11'), +('11', '72', '11', '39371', '50102', '11'), +('11', '73', '22', '21805', '0', '11'), +('11', '73', '22', '61948', '0', '11'), +('11', '73', '22', '21807', '0', '11'), +('11', '73', '22', '12425', '0', '11'), +('11', '73', '1', '69106', '87871', '11'), +('11', '73', '1', '83594', '86076', '11'), +('11', '73', '1', '70981', '58171', '11'), +('11', '73', '1', '39353', '45896', '11'), +('11', '73', '2', '39358', '49775', '11'), +('11', '73', '2', '83563', '42044', '11'), +('11', '73', '2', '39285', '41502', '11'), +('11', '73', '2', '70923', '38400', '11'), +('11', '73', '3', '39368', '50897', '11'), +('11', '73', '3', '83658', '46837', '11'), +('11', '73', '3', '70602', '45946', '11'), +('11', '73', '3', '39312', '43800', '11'), +('11', '73', '5', '83612', '65098', '11'), +('11', '73', '5', '51701', '49701', '11'), +('11', '73', '5', '39340', '46747', '11'), +('11', '73', '5', '39328', '43542', '11'), +('11', '73', '8', '70704', '89867', '11'), +('11', '73', '8', '83659', '44588', '11'), +('11', '73', '8', '39352', '44138', '11'), +('11', '73', '8', '39330', '43593', '11'), +('11', '73', '6', '39224', '81759', '11'), +('11', '73', '6', '83407', '49845', '11'), +('11', '73', '6', '39362', '46521', '11'), +('11', '73', '6', '39263', '45240', '11'), +('11', '73', '17', '83606', '49924', '11'), +('11', '73', '17', '47653', '46801', '11'), +('11', '73', '17', '70928', '43414', '11'), +('11', '73', '17', '69153', '38662', '11'), +('11', '73', '7', '83567', '41195', '11'), +('11', '73', '7', '70924', '37657', '11'), +('11', '73', '7', '47207', '35952', '11'), +('11', '73', '7', '83543', '35824', '11'), +('11', '73', '9', '39226', '70419', '11'), +('11', '73', '9', '69129', '47154', '11'), +('11', '73', '9', '39336', '47045', '11'), +('11', '73', '9', '51709', '44535', '11'), +('11', '73', '15', '39376', '50272', '11'), +('11', '73', '15', '68672', '49625', '11'), +('11', '73', '15', '83595', '46877', '11'), +('11', '73', '15', '83628', '42805', '11'), +('11', '73', '20', '47281', '67734', '11'), +('11', '73', '20', '47284', '63027', '11'), +('11', '73', '20', '39350', '46326', '11'), +('11', '73', '20', '71609', '45864', '11'), +('11', '73', '12', '83571', '40570', '11'), +('11', '73', '12', '83553', '40324', '11'), +('11', '73', '12', '28144', '37671', '11'), +('11', '73', '12', '70926', '37650', '11'), +('11', '73', '18', '83610', '68073', '11'), +('11', '73', '18', '70929', '56054', '11'), +('11', '73', '18', '69149', '39502', '11'), +('11', '73', '18', '71649', '37445', '11'), +('11', '73', '19', '83575', '75620', '11'), +('11', '73', '19', '70927', '63637', '11'), +('11', '73', '19', '83497', '39772', '11'), +('11', '73', '19', '68923', '38201', '11'), +('11', '73', '13', '83632', '74459', '11'), +('11', '73', '13', '39295', '48649', '11'), +('11', '73', '13', '39351', '44999', '11'), +('11', '73', '13', '39324', '42898', '11'), +('11', '73', '14', '83500', '65353', '11'), +('11', '73', '14', '39372', '50262', '11'), +('11', '73', '14', '83641', '49476', '11'), +('11', '73', '14', '39295', '48649', '11'), +('11', '73', '11', '83642', '87755', '11'), +('11', '73', '11', '68952', '52626', '11'), +('11', '73', '11', '20508', '50560', '11'), +('11', '73', '11', '39371', '50106', '11'), +('11', '74', '22', '21805', '0', '11'), +('11', '74', '22', '61948', '0', '11'), +('11', '74', '22', '21807', '0', '11'), +('11', '74', '22', '12425', '0', '11'), +('11', '74', '1', '69106', '86127', '11'), +('11', '74', '1', '83594', '83681', '11'), +('11', '74', '1', '70981', '57178', '11'), +('11', '74', '1', '39353', '45903', '11'), +('11', '74', '2', '39358', '49580', '11'), +('11', '74', '2', '83563', '42052', '11'), +('11', '74', '2', '39285', '41508', '11'), +('11', '74', '2', '70923', '38406', '11'), +('11', '74', '3', '39368', '50904', '11'), +('11', '74', '3', '83658', '46641', '11'), +('11', '74', '3', '70602', '44700', '11'), +('11', '74', '3', '39312', '43806', '11'), +('11', '74', '5', '83612', '63904', '11'), +('11', '74', '5', '51701', '49356', '11'), +('11', '74', '5', '39340', '46754', '11'), +('11', '74', '5', '39328', '43548', '11'), +('11', '74', '8', '70704', '88123', '11'), +('11', '74', '8', '83659', '44588', '11'), +('11', '74', '8', '39352', '44138', '11'), +('11', '74', '8', '39330', '43599', '11'), +('11', '74', '6', '39224', '79362', '11'), +('11', '74', '6', '83407', '48597', '11'), +('11', '74', '6', '39362', '46528', '11'), +('11', '74', '6', '39263', '45044', '11'), +('11', '74', '17', '83606', '49731', '11'), +('11', '74', '17', '47653', '45307', '11'), +('11', '74', '17', '70928', '43414', '11'), +('11', '74', '17', '69153', '38488', '11'), +('11', '74', '7', '83567', '41203', '11'), +('11', '74', '7', '70924', '37661', '11'), +('11', '74', '7', '47207', '35956', '11'), +('11', '74', '7', '83543', '35829', '11'), +('11', '74', '9', '39226', '68674', '11'), +('11', '74', '9', '39336', '47052', '11'), +('11', '74', '9', '69129', '46357', '11'), +('11', '74', '9', '51709', '44540', '11'), +('11', '74', '15', '39376', '50279', '11'), +('11', '74', '15', '68672', '48378', '11'), +('11', '74', '15', '83595', '46532', '11'), +('11', '74', '15', '83628', '42809', '11'), +('11', '74', '20', '47281', '65934', '11'), +('11', '74', '20', '47284', '61530', '11'), +('11', '74', '20', '39350', '46331', '11'), +('11', '74', '20', '71609', '44618', '11'), +('11', '74', '12', '83571', '40578', '11'), +('11', '74', '12', '83553', '40029', '11'), +('11', '74', '12', '70926', '37656', '11'), +('11', '74', '12', '28144', '36676', '11'), +('11', '74', '18', '83610', '66880', '11'), +('11', '74', '18', '70929', '55159', '11'), +('11', '74', '18', '69149', '39257', '11'), +('11', '74', '18', '71649', '37200', '11'), +('11', '74', '19', '83575', '73878', '11'), +('11', '74', '19', '70927', '61645', '11'), +('11', '74', '19', '83497', '39477', '11'), +('11', '74', '19', '39223', '38179', '11'), +('11', '74', '13', '83632', '72715', '11'), +('11', '74', '13', '39295', '48304', '11'), +('11', '74', '13', '39351', '45004', '11'), +('11', '74', '13', '39324', '42906', '11'), +('11', '74', '14', '83500', '63558', '11'), +('11', '74', '14', '39372', '50268', '11'), +('11', '74', '14', '83641', '49132', '11'), +('11', '74', '14', '39295', '48304', '11'), +('11', '74', '11', '83642', '85359', '11'), +('11', '74', '11', '68952', '51131', '11'), +('11', '74', '11', '39371', '50110', '11'), +('11', '74', '11', '39320', '49356', '11'), +('11', '75', '22', '21807', '0', '13'), +('11', '75', '22', '21805', '0', '13'), +('11', '75', '22', '12425', '0', '13'), +('11', '75', '22', '39342', '0', '13'), +('11', '75', '1', '69106', '84383', '13'), +('11', '75', '1', '83594', '81286', '13'), +('11', '75', '1', '80676', '69837', '13'), +('11', '75', '1', '80639', '63710', '13'), +('11', '75', '2', '39358', '49385', '13'), +('11', '75', '2', '83563', '42060', '13'), +('11', '75', '2', '39285', '41513', '13'), +('11', '75', '2', '70923', '38412', '13'), +('11', '75', '3', '80647', '63886', '13'), +('11', '75', '3', '46874', '56540', '13'), +('11', '75', '3', '46852', '51239', '13'), +('11', '75', '3', '39368', '50911', '13'), +('11', '75', '5', '80661', '67756', '13'), +('11', '75', '5', '83612', '62710', '13'), +('11', '75', '5', '80615', '61755', '13'), +('11', '75', '5', '46934', '60743', '13'), +('11', '75', '8', '70704', '86379', '13'), +('11', '75', '8', '80679', '70183', '13'), +('11', '75', '8', '80649', '63686', '13'), +('11', '75', '8', '46936', '60834', '13'), +('11', '75', '6', '39224', '76966', '13'), +('11', '75', '6', '80646', '63406', '13'), +('11', '75', '6', '46883', '60742', '13'), +('11', '75', '6', '46933', '60239', '13'), +('11', '75', '17', '53436', '57557', '13'), +('11', '75', '17', '83606', '49538', '13'), +('11', '75', '17', '47653', '43813', '13'), +('11', '75', '17', '70928', '43414', '13'), +('11', '75', '7', '53432', '55062', '13'), +('11', '75', '7', '83567', '41211', '13'), +('11', '75', '7', '70924', '37666', '13'), +('11', '75', '7', '47207', '35960', '13'), +('11', '75', '9', '39226', '66929', '13'), +('11', '75', '9', '46938', '61261', '13'), +('11', '75', '9', '39336', '47059', '13'), +('11', '75', '9', '69129', '45560', '13'), +('11', '75', '15', '79909', '73588', '13'), +('11', '75', '15', '80666', '70407', '13'), +('11', '75', '15', '80686', '69798', '13'), +('11', '75', '15', '79908', '67157', '13'), +('11', '75', '20', '80680', '70048', '13'), +('11', '75', '20', '47281', '64134', '13'), +('11', '75', '20', '46886', '61341', '13'), +('11', '75', '20', '80620', '60041', '13'), +('11', '75', '12', '53434', '54762', '13'), +('11', '75', '12', '83571', '40586', '13'), +('11', '75', '12', '83553', '39734', '13'), +('11', '75', '12', '70926', '37662', '13'), +('11', '75', '18', '83610', '65687', '13'), +('11', '75', '18', '53437', '56739', '13'), +('11', '75', '18', '70929', '54264', '13'), +('11', '75', '18', '46810', '46184', '13'), +('11', '75', '19', '83575', '72136', '13'), +('11', '75', '19', '70927', '59653', '13'), +('11', '75', '19', '83497', '39182', '13'), +('11', '75', '19', '39223', '38184', '13'), +('11', '75', '13', '83632', '70971', '13'), +('11', '75', '13', '80633', '64542', '13'), +('11', '75', '13', '80624', '59241', '13'), +('11', '75', '13', '46906', '49911', '13'), +('11', '75', '14', '80665', '64907', '13'), +('11', '75', '14', '80635', '63301', '13'), +('11', '75', '14', '83500', '61762', '13'), +('11', '75', '14', '80625', '59604', '13'), +('11', '75', '11', '83642', '82964', '13'), +('11', '75', '11', '80668', '69922', '13'), +('11', '75', '11', '46939', '61665', '13'), +('11', '75', '11', '80629', '61264', '13'), +('11', '75', '22', '21807', '0', '12'), +('11', '75', '22', '21805', '0', '12'), +('11', '75', '22', '12425', '0', '12'), +('11', '75', '22', '39342', '0', '12'), +('11', '75', '1', '69106', '84383', '12'), +('11', '75', '1', '83594', '81286', '12'), +('11', '75', '1', '46882', '61234', '12'), +('11', '75', '1', '46914', '56540', '12'), +('11', '75', '2', '39358', '49385', '12'), +('11', '75', '2', '83563', '42060', '12'), +('11', '75', '2', '39285', '41513', '12'), +('11', '75', '2', '70923', '38412', '12'), +('11', '75', '3', '46874', '56540', '12'), +('11', '75', '3', '46852', '51239', '12'), +('11', '75', '3', '39368', '50911', '12'), +('11', '75', '3', '46902', '49771', '12'), +('11', '75', '5', '83612', '62710', '12'), +('11', '75', '5', '46934', '60743', '12'), +('11', '75', '5', '46860', '57015', '12'), +('11', '75', '5', '46868', '56791', '12'), +('11', '75', '8', '70704', '86379', '12'), +('11', '75', '8', '46936', '60834', '12'), +('11', '75', '8', '46847', '51084', '12'), +('11', '75', '8', '83659', '44588', '12'), +('11', '75', '6', '39224', '76966', '12'), +('11', '75', '6', '46883', '60742', '12'), +('11', '75', '6', '46933', '60239', '12'), +('11', '75', '6', '46884', '59768', '12'), +('11', '75', '17', '53436', '57557', '12'), +('11', '75', '17', '83606', '49538', '12'), +('11', '75', '17', '47653', '43813', '12'), +('11', '75', '17', '70928', '43414', '12'), +('11', '75', '7', '53432', '55062', '12'), +('11', '75', '7', '83567', '41211', '12'), +('11', '75', '7', '70924', '37666', '12'), +('11', '75', '7', '47207', '35960', '12'), +('11', '75', '9', '39226', '66929', '12'), +('11', '75', '9', '46938', '61261', '12'), +('11', '75', '9', '39336', '47059', '12'), +('11', '75', '9', '69129', '45560', '12'), +('11', '75', '15', '46932', '61314', '12'), +('11', '75', '15', '46864', '57319', '12'), +('11', '75', '15', '46843', '51838', '12'), +('11', '75', '15', '39376', '50286', '12'), +('11', '75', '20', '47281', '64134', '12'), +('11', '75', '20', '46886', '61341', '12'), +('11', '75', '20', '47284', '60033', '12'), +('11', '75', '20', '46920', '56607', '12'), +('11', '75', '12', '53434', '54762', '12'), +('11', '75', '12', '83571', '40586', '12'), +('11', '75', '12', '83553', '39734', '12'), +('11', '75', '12', '70926', '37662', '12'), +('11', '75', '18', '83610', '65687', '12'), +('11', '75', '18', '53437', '56739', '12'), +('11', '75', '18', '70929', '54264', '12'), +('11', '75', '18', '46810', '46184', '12'), +('11', '75', '19', '83575', '72136', '12'), +('11', '75', '19', '70927', '59653', '12'), +('11', '75', '19', '83497', '39182', '12'), +('11', '75', '19', '39223', '38184', '12'), +('11', '75', '13', '83632', '70971', '12'), +('11', '75', '13', '46906', '49911', '12'), +('11', '75', '13', '39295', '47959', '12'), +('11', '75', '13', '39351', '45009', '12'), +('11', '75', '14', '83500', '61762', '12'), +('11', '75', '14', '46925', '56405', '12'), +('11', '75', '14', '46875', '55183', '12'), +('11', '75', '14', '46903', '51571', '12'), +('11', '75', '11', '83642', '82964', '12'), +('11', '75', '11', '46939', '61665', '12'), +('11', '75', '11', '46889', '59391', '12'), +('11', '75', '11', '46900', '50984', '12'), +('11', '76', '22', '21807', '0', '13'), +('11', '76', '22', '21805', '0', '13'), +('11', '76', '22', '12425', '0', '13'), +('11', '76', '22', '39342', '0', '13'), +('11', '76', '1', '69106', '82639', '13'), +('11', '76', '1', '83594', '78891', '13'), +('11', '76', '1', '80676', '69844', '13'), +('11', '76', '1', '80639', '63717', '13'), +('11', '76', '2', '39358', '49190', '13'), +('11', '76', '2', '83563', '42068', '13'), +('11', '76', '2', '39285', '41519', '13'), +('11', '76', '2', '70923', '38418', '13'), +('11', '76', '3', '80647', '63893', '13'), +('11', '76', '3', '46874', '56547', '13'), +('11', '76', '3', '46852', '51246', '13'), +('11', '76', '3', '39368', '50918', '13'), +('11', '76', '5', '80661', '67763', '13'), +('11', '76', '5', '80615', '61761', '13'), +('11', '76', '5', '83612', '61516', '13'), +('11', '76', '5', '46934', '60750', '13'), +('11', '76', '8', '70704', '84635', '13'), +('11', '76', '8', '80679', '70183', '13'), +('11', '76', '8', '80649', '63693', '13'), +('11', '76', '8', '46936', '60842', '13'), +('11', '76', '6', '39224', '74569', '13'), +('11', '76', '6', '80646', '63406', '13'), +('11', '76', '6', '46883', '60749', '13'), +('11', '76', '6', '46933', '60246', '13'), +('11', '76', '17', '53436', '57564', '13'), +('11', '76', '17', '83606', '49345', '13'), +('11', '76', '17', '70928', '43414', '13'), +('11', '76', '17', '47653', '42319', '13'), +('11', '76', '7', '53432', '55068', '13'), +('11', '76', '7', '83567', '41219', '13'), +('11', '76', '7', '70924', '37670', '13'), +('11', '76', '7', '47207', '35964', '13'), +('11', '76', '9', '39226', '65183', '13'), +('11', '76', '9', '46938', '61269', '13'), +('11', '76', '9', '39336', '47066', '13'), +('11', '76', '9', '69129', '44763', '13'), +('11', '76', '15', '79909', '73594', '13'), +('11', '76', '15', '80666', '70407', '13'), +('11', '76', '15', '80686', '69805', '13'), +('11', '76', '15', '79908', '67163', '13'), +('11', '76', '20', '80680', '70055', '13'), +('11', '76', '20', '47281', '62335', '13'), +('11', '76', '20', '46886', '61349', '13'), +('11', '76', '20', '80620', '60041', '13'), +('11', '76', '12', '53434', '54766', '13'), +('11', '76', '12', '83571', '40594', '13'), +('11', '76', '12', '83553', '39439', '13'), +('11', '76', '12', '70926', '37668', '13'), +('11', '76', '18', '83610', '64494', '13'), +('11', '76', '18', '53437', '56746', '13'), +('11', '76', '18', '70929', '53369', '13'), +('11', '76', '18', '46810', '46189', '13'), +('11', '76', '19', '83575', '70394', '13'), +('11', '76', '19', '70927', '57661', '13'), +('11', '76', '19', '83497', '38887', '13'), +('11', '76', '19', '39223', '38189', '13'), +('11', '76', '13', '83632', '69228', '13'), +('11', '76', '13', '80633', '64547', '13'), +('11', '76', '13', '80624', '59246', '13'), +('11', '76', '13', '46906', '49919', '13'), +('11', '76', '14', '80665', '64912', '13'), +('11', '76', '14', '80635', '63306', '13'), +('11', '76', '14', '83500', '59966', '13'), +('11', '76', '14', '80625', '59609', '13'), +('11', '76', '11', '83642', '80568', '13'), +('11', '76', '11', '80668', '69929', '13'), +('11', '76', '11', '46939', '61672', '13'), +('11', '76', '11', '80629', '61270', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '77', '22', '21807', '0', '13'), +('11', '77', '22', '21805', '0', '13'), +('11', '77', '22', '12425', '0', '13'), +('11', '77', '22', '39342', '0', '13'), +('11', '77', '1', '69106', '80895', '13'), +('11', '77', '1', '83594', '76497', '13'), +('11', '77', '1', '80676', '69851', '13'), +('11', '77', '1', '80639', '63723', '13'), +('11', '77', '2', '39358', '48995', '13'), +('11', '77', '2', '83563', '42076', '13'), +('11', '77', '2', '39285', '41524', '13'), +('11', '77', '2', '70923', '38424', '13'), +('11', '77', '3', '80647', '63899', '13'), +('11', '77', '3', '46874', '56554', '13'), +('11', '77', '3', '46852', '51253', '13'), +('11', '77', '3', '39368', '50925', '13'), +('11', '77', '5', '80661', '67770', '13'), +('11', '77', '5', '80615', '61767', '13'), +('11', '77', '5', '46934', '60757', '13'), +('11', '77', '5', '83612', '60322', '13'), +('11', '77', '8', '70704', '82891', '13'), +('11', '77', '8', '80679', '70183', '13'), +('11', '77', '8', '80649', '63699', '13'), +('11', '77', '8', '46936', '60849', '13'), +('11', '77', '6', '39224', '72173', '13'), +('11', '77', '6', '80646', '63406', '13'), +('11', '77', '6', '46883', '60756', '13'), +('11', '77', '6', '46933', '60253', '13'), +('11', '77', '17', '53436', '57571', '13'), +('11', '77', '17', '83606', '49152', '13'), +('11', '77', '17', '70928', '43414', '13'), +('11', '77', '17', '47653', '40825', '13'), +('11', '77', '7', '53432', '55074', '13'), +('11', '77', '7', '83567', '41227', '13'), +('11', '77', '7', '70924', '37674', '13'), +('11', '77', '7', '47207', '35968', '13'), +('11', '77', '9', '39226', '63438', '13'), +('11', '77', '9', '46938', '61277', '13'), +('11', '77', '9', '39336', '47073', '13'), +('11', '77', '9', '51709', '44556', '13'), +('11', '77', '15', '79909', '73600', '13'), +('11', '77', '15', '80666', '70407', '13'), +('11', '77', '15', '80686', '69812', '13'), +('11', '77', '15', '79908', '67168', '13'), +('11', '77', '20', '80680', '70062', '13'), +('11', '77', '20', '46886', '61357', '13'), +('11', '77', '20', '47281', '60535', '13'), +('11', '77', '20', '80620', '60041', '13'), +('11', '77', '12', '53434', '54770', '13'), +('11', '77', '12', '83571', '40602', '13'), +('11', '77', '12', '83553', '39144', '13'), +('11', '77', '12', '70926', '37674', '13'), +('11', '77', '18', '83610', '63302', '13'), +('11', '77', '18', '53437', '56753', '13'), +('11', '77', '18', '70929', '52474', '13'), +('11', '77', '18', '46810', '46194', '13'), +('11', '77', '19', '83575', '68652', '13'), +('11', '77', '19', '70927', '55669', '13'), +('11', '77', '19', '83497', '38592', '13'), +('11', '77', '19', '39223', '38194', '13'), +('11', '77', '13', '83632', '67484', '13'), +('11', '77', '13', '80633', '64552', '13'), +('11', '77', '13', '80624', '59251', '13'), +('11', '77', '13', '46906', '49926', '13'), +('11', '77', '14', '80665', '64917', '13'), +('11', '77', '14', '80635', '63311', '13'), +('11', '77', '14', '80625', '59614', '13'), +('11', '77', '14', '83500', '58170', '13'), +('11', '77', '11', '83642', '78172', '13'), +('11', '77', '11', '80668', '69937', '13'), +('11', '77', '11', '46939', '61679', '13'), +('11', '77', '11', '80629', '61276', '13'), +('11', '78', '22', '21807', '0', '13'), +('11', '78', '22', '21805', '0', '13'), +('11', '78', '22', '12425', '0', '13'), +('11', '78', '22', '39342', '0', '13'), +('11', '78', '1', '69106', '79151', '13'), +('11', '78', '1', '83594', '74102', '13'), +('11', '78', '1', '80676', '69858', '13'), +('11', '78', '1', '80639', '63730', '13'), +('11', '78', '2', '39358', '48800', '13'), +('11', '78', '2', '83563', '42085', '13'), +('11', '78', '2', '39285', '41530', '13'), +('11', '78', '2', '70923', '38430', '13'), +('11', '78', '3', '80647', '63906', '13'), +('11', '78', '3', '46874', '56561', '13'), +('11', '78', '3', '46852', '51261', '13'), +('11', '78', '3', '39368', '50932', '13'), +('11', '78', '5', '80661', '67777', '13'), +('11', '78', '5', '80615', '61773', '13'), +('11', '78', '5', '46934', '60764', '13'), +('11', '78', '5', '83612', '59128', '13'), +('11', '78', '8', '70704', '81147', '13'), +('11', '78', '8', '80679', '70183', '13'), +('11', '78', '8', '80649', '63706', '13'), +('11', '78', '8', '46936', '60857', '13'), +('11', '78', '6', '39224', '69776', '13'), +('11', '78', '6', '80646', '63406', '13'), +('11', '78', '6', '46883', '60764', '13'), +('11', '78', '6', '46933', '60260', '13'), +('11', '78', '17', '53436', '57578', '13'), +('11', '78', '17', '83606', '48959', '13'), +('11', '78', '17', '70928', '43414', '13'), +('11', '78', '17', '47653', '39331', '13'), +('11', '78', '7', '53432', '55080', '13'), +('11', '78', '7', '83567', '41235', '13'), +('11', '78', '7', '70924', '37678', '13'), +('11', '78', '7', '47207', '35972', '13'), +('11', '78', '9', '39226', '61693', '13'), +('11', '78', '9', '46938', '61285', '13'), +('11', '78', '9', '39336', '47080', '13'), +('11', '78', '9', '51709', '44561', '13'), +('11', '78', '15', '79909', '73606', '13'), +('11', '78', '15', '80666', '70408', '13'), +('11', '78', '15', '80686', '69820', '13'), +('11', '78', '15', '79908', '67174', '13'), +('11', '78', '20', '80680', '70070', '13'), +('11', '78', '20', '46886', '61365', '13'), +('11', '78', '20', '80620', '60042', '13'), +('11', '78', '20', '47281', '58735', '13'), +('11', '78', '12', '53434', '54774', '13'), +('11', '78', '12', '83571', '40610', '13'), +('11', '78', '12', '83553', '38849', '13'), +('11', '78', '12', '70926', '37681', '13'), +('11', '78', '18', '83610', '62109', '13'), +('11', '78', '18', '53437', '56760', '13'), +('11', '78', '18', '70929', '51579', '13'), +('11', '78', '18', '46810', '46199', '13'), +('11', '78', '19', '83575', '66910', '13'), +('11', '78', '19', '70927', '53677', '13'), +('11', '78', '19', '83497', '38297', '13'), +('11', '78', '19', '39223', '38199', '13'), +('11', '78', '13', '83632', '65740', '13'), +('11', '78', '13', '80633', '64558', '13'), +('11', '78', '13', '80624', '59256', '13'), +('11', '78', '13', '46906', '49933', '13'), +('11', '78', '14', '80665', '64922', '13'), +('11', '78', '14', '80635', '63316', '13'), +('11', '78', '14', '80625', '59619', '13'), +('11', '78', '14', '46925', '56423', '13'), +('11', '78', '11', '83642', '75776', '13'), +('11', '78', '11', '80668', '69944', '13'), +('11', '78', '11', '46939', '61686', '13'), +('11', '78', '11', '80629', '61282', '13'), +('11', '79', '22', '21807', '0', '13'), +('11', '79', '22', '21805', '0', '13'), +('11', '79', '22', '12425', '0', '13'), +('11', '79', '22', '39342', '0', '13'), +('11', '79', '1', '69106', '77407', '13'), +('11', '79', '1', '83594', '71707', '13'), +('11', '79', '1', '80676', '69866', '13'), +('11', '79', '1', '80639', '63736', '13'), +('11', '79', '2', '39358', '48605', '13'), +('11', '79', '2', '83563', '42093', '13'), +('11', '79', '2', '39285', '41535', '13'), +('11', '79', '2', '70923', '38436', '13'), +('11', '79', '3', '80647', '63912', '13'), +('11', '79', '3', '46874', '56568', '13'), +('11', '79', '3', '46852', '51268', '13'), +('11', '79', '3', '39368', '50939', '13'), +('11', '79', '5', '80661', '67784', '13'), +('11', '79', '5', '80615', '61779', '13'), +('11', '79', '5', '46934', '60771', '13'), +('11', '79', '5', '83612', '57935', '13'), +('11', '79', '8', '70704', '79403', '13'), +('11', '79', '8', '80679', '70184', '13'), +('11', '79', '8', '80649', '63712', '13'), +('11', '79', '8', '46936', '60865', '13'), +('11', '79', '6', '39224', '67380', '13'), +('11', '79', '6', '80646', '63406', '13'), +('11', '79', '6', '46883', '60771', '13'), +('11', '79', '6', '46933', '60267', '13'), +('11', '79', '17', '53436', '57585', '13'), +('11', '79', '17', '83606', '48767', '13'), +('11', '79', '17', '70928', '43415', '13'), +('11', '79', '17', '47653', '37837', '13'), +('11', '79', '7', '53432', '55086', '13'), +('11', '79', '7', '83567', '41243', '13'), +('11', '79', '7', '70924', '37682', '13'), +('11', '79', '7', '47207', '35976', '13'), +('11', '79', '9', '46938', '61293', '13'), +('11', '79', '9', '39226', '59947', '13'), +('11', '79', '9', '39336', '47087', '13'), +('11', '79', '9', '51709', '44566', '13'), +('11', '79', '15', '79909', '73612', '13'), +('11', '79', '15', '80666', '70408', '13'), +('11', '79', '15', '80686', '69827', '13'), +('11', '79', '15', '79908', '67180', '13'), +('11', '79', '20', '80680', '70077', '13'), +('11', '79', '20', '46886', '61373', '13'), +('11', '79', '20', '80620', '60042', '13'), +('11', '79', '20', '47281', '56935', '13'), +('11', '79', '12', '53434', '54778', '13'), +('11', '79', '12', '83571', '40618', '13'), +('11', '79', '12', '83553', '38554', '13'), +('11', '79', '12', '70926', '37687', '13'), +('11', '79', '18', '83610', '60916', '13'), +('11', '79', '18', '53437', '56767', '13'), +('11', '79', '18', '70929', '50684', '13'), +('11', '79', '18', '46810', '46204', '13'), +('11', '79', '19', '83575', '65168', '13'), +('11', '79', '19', '70927', '51685', '13'), +('11', '79', '19', '39223', '38204', '13'), +('11', '79', '19', '83497', '38002', '13'), +('11', '79', '13', '80633', '64563', '13'), +('11', '79', '13', '83632', '63996', '13'), +('11', '79', '13', '80624', '59261', '13'), +('11', '79', '13', '46906', '49940', '13'), +('11', '79', '14', '80665', '64927', '13'), +('11', '79', '14', '80635', '63321', '13'), +('11', '79', '14', '80625', '59624', '13'), +('11', '79', '14', '46925', '56429', '13'), +('11', '79', '11', '83642', '73380', '13'), +('11', '79', '11', '80668', '69951', '13'), +('11', '79', '11', '46939', '61693', '13'), +('11', '79', '11', '80629', '61289', '13'), +('11', '80', '22', '21807', '0', '14'), +('11', '80', '22', '21805', '0', '14'), +('11', '80', '22', '12425', '0', '14'), +('11', '80', '22', '39342', '0', '14'), +('11', '80', '1', '102604', '93329', '14'), +('11', '80', '1', '102640', '91044', '14'), +('11', '80', '1', '102639', '90906', '14'), +('11', '80', '1', '102641', '90809', '14'), +('11', '80', '2', '102024', '63069', '14'), +('11', '80', '2', '102276', '57118', '14'), +('11', '80', '2', '39358', '48410', '14'), +('11', '80', '2', '83563', '42101', '14'), +('11', '80', '3', '102605', '98400', '14'), +('11', '80', '3', '102742', '88030', '14'), +('11', '80', '3', '102560', '84616', '14'), +('11', '80', '3', '102741', '81073', '14'), +('11', '80', '5', '102731', '101523', '14'), +('11', '80', '5', '102606', '97066', '14'), +('11', '80', '5', '102730', '87935', '14'), +('11', '80', '5', '102565', '84171', '14'), +('11', '80', '8', '102728', '99879', '14'), +('11', '80', '8', '102608', '98468', '14'), +('11', '80', '8', '102728', '84064', '14'), +('11', '80', '8', '70704', '77659', '14'), +('11', '80', '6', '102607', '98511', '14'), +('11', '80', '6', '102561', '84843', '14'), +('11', '80', '6', '39224', '64983', '14'), +('11', '80', '6', '80646', '63407', '14'), +('11', '80', '17', '102027', '66483', '14'), +('11', '80', '17', '102279', '60151', '14'), +('11', '80', '17', '53436', '57592', '14'), +('11', '80', '17', '83606', '48574', '14'), +('11', '80', '7', '102025', '63501', '14'), +('11', '80', '7', '102277', '57335', '14'), +('11', '80', '7', '53432', '55092', '14'), +('11', '80', '7', '83567', '41251', '14'), +('11', '80', '9', '67098', '159918', '14'), +('11', '80', '9', '46938', '61301', '14'), +('11', '80', '9', '39226', '58202', '14'), +('11', '80', '9', '102291', '53447', '14'), +('11', '80', '15', '102723', '100578', '14'), +('11', '80', '15', '102609', '94612', '14'), +('11', '80', '15', '102637', '91417', '14'), +('11', '80', '15', '102634', '91342', '14'), +('11', '80', '20', '102610', '98717', '14'), +('11', '80', '20', '102563', '84734', '14'), +('11', '80', '20', '80680', '70085', '14'), +('11', '80', '20', '46886', '61381', '14'), +('11', '80', '12', '53434', '54782', '14'), +('11', '80', '12', '102274', '54624', '14'), +('11', '80', '12', '83571', '40626', '14'), +('11', '80', '12', '83553', '38260', '14'), +('11', '80', '18', '102026', '64496', '14'), +('11', '80', '18', '83610', '59723', '14'), +('11', '80', '18', '102278', '58032', '14'), +('11', '80', '18', '53437', '56774', '14'), +('11', '80', '19', '83575', '63426', '14'), +('11', '80', '19', '102275', '54893', '14'), +('11', '80', '19', '70927', '49693', '14'), +('11', '80', '19', '39223', '38209', '14'), +('11', '80', '13', '102657', '89343', '14'), +('11', '80', '13', '102735', '87780', '14'), +('11', '80', '13', '102734', '80947', '14'), +('11', '80', '13', '102586', '78338', '14'), +('11', '80', '14', '102633', '96295', '14'), +('11', '80', '14', '102632', '96149', '14'), +('11', '80', '14', '102570', '84233', '14'), +('11', '80', '14', '80665', '64932', '14'), +('11', '80', '11', '102643', '93371', '14'), +('11', '80', '11', '83642', '70984', '14'), +('11', '80', '11', '80668', '69959', '14'), +('11', '80', '11', '46939', '61700', '14'), +('11', '81', '22', '21807', '0', '14'), +('11', '81', '22', '21805', '0', '14'), +('11', '81', '22', '12425', '0', '14'), +('11', '81', '22', '39342', '0', '14'), +('11', '81', '1', '102604', '93334', '14'), +('11', '81', '1', '102640', '91053', '14'), +('11', '81', '1', '102639', '90913', '14'), +('11', '81', '1', '102641', '90818', '14'), +('11', '81', '2', '102024', '63074', '14'), +('11', '81', '2', '102276', '57124', '14'), +('11', '81', '2', '39358', '48215', '14'), +('11', '81', '2', '83563', '42109', '14'), +('11', '81', '3', '102605', '98404', '14'), +('11', '81', '3', '102742', '88039', '14'), +('11', '81', '3', '102560', '84622', '14'), +('11', '81', '3', '102741', '81080', '14'), +('11', '81', '5', '102731', '101532', '14'), +('11', '81', '5', '102606', '97069', '14'), +('11', '81', '5', '102730', '87942', '14'), +('11', '81', '5', '102565', '84177', '14'), +('11', '81', '8', '102728', '99886', '14'), +('11', '81', '8', '102608', '98475', '14'), +('11', '81', '8', '102728', '84069', '14'), +('11', '81', '8', '70704', '75915', '14'), +('11', '81', '6', '102607', '98518', '14'), +('11', '81', '6', '102561', '84849', '14'), +('11', '81', '6', '80646', '63407', '14'), +('11', '81', '6', '39224', '62587', '14'), +('11', '81', '17', '102027', '66487', '14'), +('11', '81', '17', '102279', '60156', '14'), +('11', '81', '17', '53436', '57599', '14'), +('11', '81', '17', '83606', '48381', '14'), +('11', '81', '7', '102025', '63509', '14'), +('11', '81', '7', '102277', '57340', '14'), +('11', '81', '7', '53432', '55099', '14'), +('11', '81', '7', '83567', '41259', '14'), +('11', '81', '9', '67098', '161921', '14'), +('11', '81', '9', '46938', '61309', '14'), +('11', '81', '9', '39226', '56457', '14'), +('11', '81', '9', '102291', '53452', '14'), +('11', '81', '15', '102723', '100585', '14'), +('11', '81', '15', '102609', '94619', '14'), +('11', '81', '15', '102637', '91425', '14'), +('11', '81', '15', '102634', '91347', '14'), +('11', '81', '20', '102610', '98726', '14'), +('11', '81', '20', '102563', '84736', '14'), +('11', '81', '20', '80680', '70092', '14'), +('11', '81', '20', '46886', '61389', '14'), +('11', '81', '12', '53434', '54786', '14'), +('11', '81', '12', '102274', '54630', '14'), +('11', '81', '12', '83571', '40634', '14'), +('11', '81', '12', '83553', '37965', '14'), +('11', '81', '18', '102026', '64498', '14'), +('11', '81', '18', '83610', '58530', '14'), +('11', '81', '18', '102278', '58041', '14'), +('11', '81', '18', '53437', '56781', '14'), +('11', '81', '19', '83575', '61684', '14'), +('11', '81', '19', '102275', '54894', '14'), +('11', '81', '19', '70927', '47701', '14'), +('11', '81', '19', '39223', '38214', '14'), +('11', '81', '13', '102657', '89347', '14'), +('11', '81', '13', '102735', '87787', '14'), +('11', '81', '13', '102734', '80953', '14'), +('11', '81', '13', '102586', '78340', '14'), +('11', '81', '14', '102633', '96301', '14'), +('11', '81', '14', '102632', '96155', '14'), +('11', '81', '14', '102570', '84241', '14'), +('11', '81', '14', '80665', '64937', '14'), +('11', '81', '11', '102643', '93376', '14'), +('11', '81', '11', '80668', '69966', '14'), +('11', '81', '11', '83642', '68588', '14'), +('11', '81', '11', '46939', '61708', '14'), +('11', '82', '22', '21807', '0', '14'), +('11', '82', '22', '21805', '0', '14'), +('11', '82', '22', '12425', '0', '14'), +('11', '82', '22', '39342', '0', '14'), +('11', '82', '1', '102604', '93340', '14'), +('11', '82', '1', '102640', '91063', '14'), +('11', '82', '1', '102639', '90920', '14'), +('11', '82', '1', '102641', '90828', '14'), +('11', '82', '2', '102024', '63080', '14'), +('11', '82', '2', '102276', '57129', '14'), +('11', '82', '2', '39358', '48020', '14'), +('11', '82', '2', '83563', '42117', '14'), +('11', '82', '3', '102605', '98408', '14'), +('11', '82', '3', '102742', '88047', '14'), +('11', '82', '3', '102560', '84628', '14'), +('11', '82', '3', '102741', '81087', '14'), +('11', '82', '5', '102731', '101541', '14'), +('11', '82', '5', '102606', '97072', '14'), +('11', '82', '5', '102730', '87950', '14'), +('11', '82', '5', '102565', '84184', '14'), +('11', '82', '8', '102728', '99893', '14'), +('11', '82', '8', '102608', '98483', '14'), +('11', '82', '8', '102728', '84074', '14'), +('11', '82', '8', '70704', '74171', '14'), +('11', '82', '6', '102607', '98525', '14'), +('11', '82', '6', '102561', '84856', '14'), +('11', '82', '6', '80646', '63407', '14'), +('11', '82', '6', '102529', '61250', '14'), +('11', '82', '17', '102027', '66491', '14'), +('11', '82', '17', '102279', '60161', '14'), +('11', '82', '17', '53436', '57606', '14'), +('11', '82', '17', '83606', '48188', '14'), +('11', '82', '7', '102025', '63516', '14'), +('11', '82', '7', '102277', '57345', '14'), +('11', '82', '7', '53432', '55105', '14'), +('11', '82', '7', '83567', '41267', '14'), +('11', '82', '9', '67098', '163924', '14'), +('11', '82', '9', '46938', '61317', '14'), +('11', '82', '9', '39226', '54711', '14'), +('11', '82', '9', '102291', '53457', '14'), +('11', '82', '15', '102723', '100592', '14'), +('11', '82', '15', '102609', '94626', '14'), +('11', '82', '15', '102637', '91434', '14'), +('11', '82', '15', '102634', '91352', '14'), +('11', '82', '20', '102610', '98734', '14'), +('11', '82', '20', '102563', '84739', '14'), +('11', '82', '20', '80680', '70099', '14'), +('11', '82', '20', '46886', '61397', '14'), +('11', '82', '12', '53434', '54790', '14'), +('11', '82', '12', '102274', '54635', '14'), +('11', '82', '12', '83571', '40643', '14'), +('11', '82', '12', '70926', '37705', '14'), +('11', '82', '18', '102026', '64500', '14'), +('11', '82', '18', '102278', '58049', '14'), +('11', '82', '18', '83610', '57337', '14'), +('11', '82', '18', '53437', '56789', '14'), +('11', '82', '19', '83575', '59943', '14'), +('11', '82', '19', '102275', '54896', '14'), +('11', '82', '19', '70927', '45709', '14'), +('11', '82', '19', '39223', '38219', '14'), +('11', '82', '13', '102657', '89351', '14'), +('11', '82', '13', '102735', '87794', '14'), +('11', '82', '13', '102734', '80959', '14'), +('11', '82', '13', '102586', '78342', '14'), +('11', '82', '14', '102633', '96307', '14'), +('11', '82', '14', '102632', '96161', '14'), +('11', '82', '14', '102570', '84250', '14'), +('11', '82', '14', '80665', '64942', '14'), +('11', '82', '11', '102643', '93381', '14'), +('11', '82', '11', '80668', '69973', '14'), +('11', '82', '11', '83642', '66192', '14'), +('11', '82', '11', '46939', '61715', '14'), +('11', '83', '22', '21807', '0', '14'), +('11', '83', '22', '21805', '0', '14'), +('11', '83', '22', '12425', '0', '14'), +('11', '83', '22', '39342', '0', '14'), +('11', '83', '1', '102604', '93345', '14'), +('11', '83', '1', '102640', '91072', '14'), +('11', '83', '1', '102639', '90927', '14'), +('11', '83', '1', '102641', '90837', '14'), +('11', '83', '2', '102024', '63086', '14'), +('11', '83', '2', '102276', '57134', '14'), +('11', '83', '2', '39358', '47825', '14'), +('11', '83', '2', '83563', '42125', '14'), +('11', '83', '3', '102605', '98412', '14'), +('11', '83', '3', '102742', '88055', '14'), +('11', '83', '3', '102560', '84634', '14'), +('11', '83', '3', '102741', '81095', '14'), +('11', '83', '5', '102731', '101550', '14'), +('11', '83', '5', '102606', '97075', '14'), +('11', '83', '5', '102730', '87957', '14'), +('11', '83', '5', '102565', '84190', '14'), +('11', '83', '8', '102728', '99900', '14'), +('11', '83', '8', '102608', '98490', '14'), +('11', '83', '8', '102728', '84079', '14'), +('11', '83', '8', '70704', '72427', '14'), +('11', '83', '6', '102607', '98532', '14'), +('11', '83', '6', '102561', '84862', '14'), +('11', '83', '6', '80646', '63407', '14'), +('11', '83', '6', '102529', '61256', '14'), +('11', '83', '17', '102027', '66496', '14'), +('11', '83', '17', '102279', '60166', '14'), +('11', '83', '17', '53436', '57613', '14'), +('11', '83', '17', '83606', '47995', '14'), +('11', '83', '7', '102025', '63524', '14'), +('11', '83', '7', '102277', '57350', '14'), +('11', '83', '7', '53432', '55111', '14'), +('11', '83', '7', '83567', '41276', '14'), +('11', '83', '9', '67098', '165927', '14'), +('11', '83', '9', '46938', '61325', '14'), +('11', '83', '9', '102291', '53462', '14'), +('11', '83', '9', '39226', '52966', '14'), +('11', '83', '15', '102723', '100599', '14'), +('11', '83', '15', '102609', '94633', '14'), +('11', '83', '15', '102637', '91442', '14'), +('11', '83', '15', '102634', '91357', '14'), +('11', '83', '20', '102610', '98743', '14'), +('11', '83', '20', '102563', '84741', '14'), +('11', '83', '20', '80680', '70107', '14'), +('11', '83', '20', '46886', '61406', '14'), +('11', '83', '12', '53434', '54795', '14'), +('11', '83', '12', '102274', '54641', '14'), +('11', '83', '12', '83571', '40651', '14'), +('11', '83', '12', '70926', '37711', '14'), +('11', '83', '18', '102026', '64503', '14'), +('11', '83', '18', '102278', '58058', '14'), +('11', '83', '18', '53437', '56796', '14'), +('11', '83', '18', '83610', '56144', '14'), +('11', '83', '19', '83575', '58201', '14'), +('11', '83', '19', '102275', '54898', '14'), +('11', '83', '19', '70927', '43717', '14'), +('11', '83', '19', '39223', '38225', '14'), +('11', '83', '13', '102657', '89355', '14'), +('11', '83', '13', '102735', '87802', '14'), +('11', '83', '13', '102734', '80965', '14'), +('11', '83', '13', '102586', '78343', '14'), +('11', '83', '14', '102633', '96314', '14'), +('11', '83', '14', '102632', '96167', '14'), +('11', '83', '14', '102570', '84258', '14'), +('11', '83', '14', '80665', '64947', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '83', '11', '102643', '93386', '14'), +('11', '83', '11', '80668', '69981', '14'), +('11', '83', '11', '83642', '63797', '14'), +('11', '83', '11', '46939', '61722', '14'), +('11', '84', '22', '21807', '0', '14'), +('11', '84', '22', '21805', '0', '14'), +('11', '84', '22', '12425', '0', '14'), +('11', '84', '22', '39342', '0', '14'), +('11', '84', '1', '102604', '93351', '14'), +('11', '84', '1', '102640', '91082', '14'), +('11', '84', '1', '102639', '90934', '14'), +('11', '84', '1', '102641', '90846', '14'), +('11', '84', '2', '102024', '63092', '14'), +('11', '84', '2', '102276', '57139', '14'), +('11', '84', '2', '39358', '47630', '14'), +('11', '84', '2', '83563', '42133', '14'), +('11', '84', '3', '102605', '98417', '14'), +('11', '84', '3', '102742', '88063', '14'), +('11', '84', '3', '102560', '84640', '14'), +('11', '84', '3', '102741', '81102', '14'), +('11', '84', '5', '102731', '101559', '14'), +('11', '84', '5', '102606', '97078', '14'), +('11', '84', '5', '102730', '87964', '14'), +('11', '84', '5', '102565', '84196', '14'), +('11', '84', '8', '102728', '99907', '14'), +('11', '84', '8', '102608', '98497', '14'), +('11', '84', '8', '102728', '84084', '14'), +('11', '84', '8', '70704', '70683', '14'), +('11', '84', '6', '102607', '98539', '14'), +('11', '84', '6', '102561', '84868', '14'), +('11', '84', '6', '80646', '63407', '14'), +('11', '84', '6', '102529', '61261', '14'), +('11', '84', '17', '102027', '66500', '14'), +('11', '84', '17', '102279', '60170', '14'), +('11', '84', '17', '53436', '57620', '14'), +('11', '84', '17', '83606', '47802', '14'), +('11', '84', '7', '102025', '63531', '14'), +('11', '84', '7', '102277', '57355', '14'), +('11', '84', '7', '53432', '55117', '14'), +('11', '84', '7', '83567', '41284', '14'), +('11', '84', '9', '67098', '167930', '14'), +('11', '84', '9', '46938', '61334', '14'), +('11', '84', '9', '102291', '53467', '14'), +('11', '84', '9', '39226', '51221', '14'), +('11', '84', '15', '102723', '100606', '14'), +('11', '84', '15', '102609', '94640', '14'), +('11', '84', '15', '102637', '91451', '14'), +('11', '84', '15', '102634', '91362', '14'), +('11', '84', '20', '102610', '98752', '14'), +('11', '84', '20', '102563', '84743', '14'), +('11', '84', '20', '80680', '70114', '14'), +('11', '84', '20', '46886', '61414', '14'), +('11', '84', '12', '53434', '54799', '14'), +('11', '84', '12', '102274', '54646', '14'), +('11', '84', '12', '83571', '40659', '14'), +('11', '84', '12', '70926', '37717', '14'), +('11', '84', '18', '102026', '64505', '14'), +('11', '84', '18', '102278', '58066', '14'), +('11', '84', '18', '53437', '56803', '14'), +('11', '84', '18', '83610', '54951', '14'), +('11', '84', '19', '83575', '56459', '14'), +('11', '84', '19', '102275', '54899', '14'), +('11', '84', '19', '70927', '41725', '14'), +('11', '84', '19', '39223', '38230', '14'), +('11', '84', '13', '102657', '89360', '14'), +('11', '84', '13', '102735', '87809', '14'), +('11', '84', '13', '102734', '80972', '14'), +('11', '84', '13', '102586', '78345', '14'), +('11', '84', '14', '102633', '96320', '14'), +('11', '84', '14', '102632', '96174', '14'), +('11', '84', '14', '102570', '84267', '14'), +('11', '84', '14', '80665', '64952', '14'), +('11', '84', '11', '102643', '93391', '14'), +('11', '84', '11', '80668', '69988', '14'), +('11', '84', '11', '46939', '61729', '14'), +('11', '84', '11', '83642', '61401', '14'), +('11', '85', '22', '12425', '0', '16'), +('11', '85', '22', '21807', '0', '16'), +('11', '85', '22', '39342', '0', '16'), +('11', '85', '22', '23597', '0', '16'), +('11', '85', '1', '111311', '178878', '16'), +('11', '85', '1', '111307', '176729', '16'), +('11', '85', '1', '111306', '176548', '16'), +('11', '85', '1', '111304', '176260', '16'), +('11', '85', '2', '62985', '109924', '16'), +('11', '85', '2', '94056', '109850', '16'), +('11', '85', '2', '104424', '96011', '16'), +('11', '85', '2', '54845', '71062', '16'), +('11', '85', '3', '111314', '177232', '16'), +('11', '85', '3', '111316', '175462', '16'), +('11', '85', '3', '111315', '174577', '16'), +('11', '85', '3', '111013', '155381', '16'), +('11', '85', '5', '111319', '176738', '16'), +('11', '85', '5', '111321', '175950', '16'), +('11', '85', '5', '111318', '173992', '16'), +('11', '85', '5', '111018', '154888', '16'), +('11', '85', '8', '111332', '177320', '16'), +('11', '85', '8', '111329', '176302', '16'), +('11', '85', '8', '111331', '172730', '16'), +('11', '85', '8', '111031', '155570', '16'), +('11', '85', '6', '111323', '177189', '16'), +('11', '85', '6', '111326', '175717', '16'), +('11', '85', '6', '111325', '175671', '16'), +('11', '85', '6', '111022', '155338', '16'), +('11', '85', '17', '56043', '117674', '16'), +('11', '85', '17', '56084', '114253', '16'), +('11', '85', '17', '104427', '99659', '16'), +('11', '85', '17', '54854', '75099', '16'), +('11', '85', '7', '56080', '110001', '16'), +('11', '85', '7', '56040', '109322', '16'), +('11', '85', '7', '104425', '95449', '16'), +('11', '85', '7', '54848', '70202', '16'), +('11', '85', '9', '67098', '169933', '16'), +('11', '85', '9', '104834', '121623', '16'), +('11', '85', '9', '56070', '106382', '16'), +('11', '85', '9', '56031', '106268', '16'), +('11', '85', '15', '111349', '179189', '16'), +('11', '85', '15', '111344', '177460', '16'), +('11', '85', '15', '111340', '177008', '16'), +('11', '85', '15', '111346', '176797', '16'), +('11', '85', '20', '111356', '177333', '16'), +('11', '85', '20', '111352', '176330', '16'), +('11', '85', '20', '111351', '173837', '16'), +('11', '85', '20', '111054', '155482', '16'), +('11', '85', '12', '56035', '108322', '16'), +('11', '85', '12', '56074', '107146', '16'), +('11', '85', '12', '104422', '93327', '16'), +('11', '85', '12', '49656', '70149', '16'), +('11', '85', '18', '56041', '114128', '16'), +('11', '85', '18', '62986', '112297', '16'), +('11', '85', '18', '104426', '97176', '16'), +('11', '85', '18', '54851', '71458', '16'), +('11', '85', '19', '81763', '110788', '16'), +('11', '85', '19', '62990', '110654', '16'), +('11', '85', '19', '56075', '110070', '16'), +('11', '85', '19', '56037', '110007', '16'), +('11', '85', '13', '111521', '183105', '16'), +('11', '85', '13', '111524', '173737', '16'), +('11', '85', '13', '111519', '173706', '16'), +('11', '85', '13', '111221', '162251', '16'), +('11', '85', '14', '111537', '177345', '16'), +('11', '85', '14', '111535', '175126', '16'), +('11', '85', '14', '111237', '155494', '16'), +('11', '85', '14', '111235', '153374', '16'), +('11', '85', '11', '111335', '176352', '16'), +('11', '85', '11', '111337', '176230', '16'), +('11', '85', '11', '111338', '172743', '16'), +('11', '85', '11', '111034', '154601', '16'), +('11', '85', '22', '21807', '0', '15'), +('11', '85', '22', '21805', '0', '15'), +('11', '85', '22', '12425', '0', '15'), +('11', '85', '22', '7867', '0', '15'), +('11', '85', '1', '107040', '134005', '15'), +('11', '85', '1', '107039', '131455', '15'), +('11', '85', '1', '107053', '129474', '15'), +('11', '85', '1', '107052', '128131', '15'), +('11', '85', '2', '62985', '109924', '15'), +('11', '85', '2', '94056', '109850', '15'), +('11', '85', '2', '104424', '96011', '15'), +('11', '85', '2', '54845', '71062', '15'), +('11', '85', '3', '107041', '135359', '15'), +('11', '85', '3', '107055', '129021', '15'), +('11', '85', '3', '106828', '125872', '15'), +('11', '85', '3', '106841', '122324', '15'), +('11', '85', '5', '107042', '134128', '15'), +('11', '85', '5', '107056', '128629', '15'), +('11', '85', '5', '106829', '125788', '15'), +('11', '85', '5', '56090', '111532', '15'), +('11', '85', '8', '107044', '135397', '15'), +('11', '85', '8', '107058', '130351', '15'), +('11', '85', '8', '106831', '126647', '15'), +('11', '85', '8', '106844', '121694', '15'), +('11', '85', '6', '107043', '135260', '15'), +('11', '85', '6', '107057', '130139', '15'), +('11', '85', '6', '106830', '126231', '15'), +('11', '85', '6', '106843', '121782', '15'), +('11', '85', '17', '56043', '117674', '15'), +('11', '85', '17', '56084', '114253', '15'), +('11', '85', '17', '104427', '99659', '15'), +('11', '85', '17', '54854', '75099', '15'), +('11', '85', '7', '56080', '110001', '15'), +('11', '85', '7', '56040', '109322', '15'), +('11', '85', '7', '104425', '95449', '15'), +('11', '85', '7', '54848', '70202', '15'), +('11', '85', '9', '67098', '169933', '15'), +('11', '85', '9', '104834', '121623', '15'), +('11', '85', '9', '56070', '106382', '15'), +('11', '85', '9', '56031', '106268', '15'), +('11', '85', '15', '107046', '133773', '15'), +('11', '85', '15', '107047', '133388', '15'), +('11', '85', '15', '107061', '128590', '15'), +('11', '85', '15', '107050', '127206', '15'), +('11', '85', '20', '107048', '135514', '15'), +('11', '85', '20', '107059', '131474', '15'), +('11', '85', '20', '106834', '127467', '15'), +('11', '85', '20', '106845', '123295', '15'), +('11', '85', '12', '56035', '108322', '15'), +('11', '85', '12', '56074', '107146', '15'), +('11', '85', '12', '104422', '93327', '15'), +('11', '85', '12', '53434', '54803', '15'), +('11', '85', '18', '56041', '114128', '15'), +('11', '85', '18', '62986', '112297', '15'), +('11', '85', '18', '104426', '97176', '15'), +('11', '85', '18', '54851', '71458', '15'), +('11', '85', '19', '81763', '110788', '15'), +('11', '85', '19', '62990', '110654', '15'), +('11', '85', '19', '56075', '110070', '15'), +('11', '85', '19', '56037', '110007', '15'), +('11', '85', '13', '106864', '126330', '15'), +('11', '85', '13', '106861', '124705', '15'), +('11', '85', '13', '106764', '113318', '15'), +('11', '85', '13', '62932', '112350', '15'), +('11', '85', '14', '107063', '131398', '15'), +('11', '85', '14', '107065', '129574', '15'), +('11', '85', '14', '106850', '123984', '15'), +('11', '85', '14', '106852', '122296', '15'), +('11', '85', '11', '107045', '133387', '15'), +('11', '85', '11', '106832', '123829', '15'), +('11', '85', '11', '106739', '111016', '15'), +('11', '85', '11', '56099', '108914', '15'), +('11', '86', '22', '12425', '0', '16'), +('11', '86', '22', '21807', '0', '16'), +('11', '86', '22', '39342', '0', '16'), +('11', '86', '22', '23597', '0', '16'), +('11', '86', '1', '111311', '178882', '16'), +('11', '86', '1', '111307', '176737', '16'), +('11', '86', '1', '111306', '176554', '16'), +('11', '86', '1', '111304', '176265', '16'), +('11', '86', '2', '62985', '109928', '16'), +('11', '86', '2', '94056', '109853', '16'), +('11', '86', '2', '104424', '96019', '16'), +('11', '86', '2', '54845', '71068', '16'), +('11', '86', '3', '111314', '177238', '16'), +('11', '86', '3', '111316', '175468', '16'), +('11', '86', '3', '111315', '174583', '16'), +('11', '86', '3', '111013', '155388', '16'), +('11', '86', '5', '111319', '176746', '16'), +('11', '86', '5', '111321', '175956', '16'), +('11', '86', '5', '111318', '174000', '16'), +('11', '86', '5', '111018', '154895', '16'), +('11', '86', '8', '111332', '177327', '16'), +('11', '86', '8', '111329', '176310', '16'), +('11', '86', '8', '111331', '172736', '16'), +('11', '86', '8', '111031', '155576', '16'), +('11', '86', '6', '111323', '177195', '16'), +('11', '86', '6', '111326', '175725', '16'), +('11', '86', '6', '111325', '175676', '16'), +('11', '86', '6', '111022', '155344', '16'), +('11', '86', '17', '56043', '117680', '16'), +('11', '86', '17', '56084', '114259', '16'), +('11', '86', '17', '104427', '99666', '16'), +('11', '86', '17', '54854', '75103', '16'), +('11', '86', '7', '56080', '110008', '16'), +('11', '86', '7', '56040', '109332', '16'), +('11', '86', '7', '104425', '95454', '16'), +('11', '86', '7', '54848', '70208', '16'), +('11', '86', '9', '67098', '171937', '16'), +('11', '86', '9', '104834', '121629', '16'), +('11', '86', '9', '56070', '106387', '16'), +('11', '86', '9', '56031', '106278', '16'), +('11', '86', '15', '111349', '179197', '16'), +('11', '86', '15', '111344', '177464', '16'), +('11', '86', '15', '111340', '177013', '16'), +('11', '86', '15', '111346', '176803', '16'), +('11', '86', '20', '111356', '177339', '16'), +('11', '86', '20', '111352', '176335', '16'), +('11', '86', '20', '111351', '173844', '16'), +('11', '86', '20', '111054', '155488', '16'), +('11', '86', '12', '56035', '108331', '16'), +('11', '86', '12', '56074', '107152', '16'), +('11', '86', '12', '104422', '93335', '16'), +('11', '86', '12', '49656', '70150', '16'), +('11', '86', '18', '56041', '114137', '16'), +('11', '86', '18', '62986', '112302', '16'), +('11', '86', '18', '104426', '97178', '16'), +('11', '86', '18', '54851', '71462', '16'), +('11', '86', '19', '81763', '110798', '16'), +('11', '86', '19', '62990', '110662', '16'), +('11', '86', '19', '56075', '110074', '16'), +('11', '86', '19', '56037', '110009', '16'), +('11', '86', '13', '111521', '183111', '16'), +('11', '86', '13', '111524', '173743', '16'), +('11', '86', '13', '111519', '173713', '16'), +('11', '86', '13', '111221', '162257', '16'), +('11', '86', '14', '111537', '177350', '16'), +('11', '86', '14', '111535', '175129', '16'), +('11', '86', '14', '111237', '155499', '16'), +('11', '86', '14', '111235', '153378', '16'), +('11', '86', '11', '111335', '176358', '16'), +('11', '86', '11', '111337', '176236', '16'), +('11', '86', '11', '111338', '172749', '16'), +('11', '86', '11', '111034', '154607', '16'), +('11', '87', '22', '12425', '0', '16'), +('11', '87', '22', '21807', '0', '16'), +('11', '87', '22', '39342', '0', '16'), +('11', '87', '22', '23597', '0', '16'), +('11', '87', '1', '111311', '178886', '16'), +('11', '87', '1', '111307', '176745', '16'), +('11', '87', '1', '111306', '176559', '16'), +('11', '87', '1', '111304', '176270', '16'), +('11', '87', '2', '62985', '109932', '16'), +('11', '87', '2', '94056', '109856', '16'), +('11', '87', '2', '104424', '96027', '16'), +('11', '87', '2', '54845', '71073', '16'), +('11', '87', '3', '111314', '177245', '16'), +('11', '87', '3', '111316', '175474', '16'), +('11', '87', '3', '111315', '174589', '16'), +('11', '87', '3', '111013', '155394', '16'), +('11', '87', '5', '111319', '176753', '16'), +('11', '87', '5', '111321', '175961', '16'), +('11', '87', '5', '111318', '174007', '16'), +('11', '87', '5', '111018', '154902', '16'), +('11', '87', '8', '111332', '177334', '16'), +('11', '87', '8', '111329', '176317', '16'), +('11', '87', '8', '111331', '172741', '16'), +('11', '87', '8', '111031', '155583', '16'), +('11', '87', '6', '111323', '177200', '16'), +('11', '87', '6', '111326', '175732', '16'), +('11', '87', '6', '111325', '175680', '16'), +('11', '87', '6', '111022', '155350', '16'), +('11', '87', '17', '56043', '117685', '16'), +('11', '87', '17', '56084', '114265', '16'), +('11', '87', '17', '104427', '99672', '16'), +('11', '87', '17', '54854', '75108', '16'), +('11', '87', '7', '56080', '110015', '16'), +('11', '87', '7', '56040', '109342', '16'), +('11', '87', '7', '104425', '95460', '16'), +('11', '87', '7', '54848', '70214', '16'), +('11', '87', '9', '67098', '173940', '16'), +('11', '87', '9', '104834', '121635', '16'), +('11', '87', '9', '56070', '106393', '16'), +('11', '87', '9', '56031', '106288', '16'), +('11', '87', '15', '111349', '179205', '16'), +('11', '87', '15', '111344', '177469', '16'), +('11', '87', '15', '111340', '177019', '16'), +('11', '87', '15', '111346', '176809', '16'), +('11', '87', '20', '111356', '177345', '16'), +('11', '87', '20', '111352', '176340', '16'), +('11', '87', '20', '111351', '173852', '16'), +('11', '87', '20', '111054', '155495', '16'), +('11', '87', '12', '56035', '108341', '16'), +('11', '87', '12', '56074', '107158', '16'), +('11', '87', '12', '104422', '93343', '16'), +('11', '87', '12', '49656', '70150', '16'), +('11', '87', '18', '56041', '114145', '16'), +('11', '87', '18', '62986', '112307', '16'), +('11', '87', '18', '104426', '97180', '16'), +('11', '87', '18', '54851', '71466', '16'), +('11', '87', '19', '81763', '110808', '16'), +('11', '87', '19', '62990', '110669', '16'), +('11', '87', '19', '56075', '110079', '16'), +('11', '87', '19', '56037', '110012', '16'), +('11', '87', '13', '111521', '183116', '16'), +('11', '87', '13', '111524', '173750', '16'), +('11', '87', '13', '111519', '173720', '16'), +('11', '87', '13', '111221', '162263', '16'), +('11', '87', '14', '111537', '177355', '16'), +('11', '87', '14', '111535', '175133', '16'), +('11', '87', '14', '111237', '155504', '16'), +('11', '87', '14', '111235', '153382', '16'), +('11', '87', '11', '111335', '176364', '16'), +('11', '87', '11', '111337', '176242', '16'), +('11', '87', '11', '111338', '172755', '16'), +('11', '87', '11', '111034', '154613', '16'), +('11', '88', '22', '12425', '0', '16'), +('11', '88', '22', '21807', '0', '16'), +('11', '88', '22', '39342', '0', '16'), +('11', '88', '22', '23597', '0', '16'), +('11', '88', '1', '111311', '178891', '16'), +('11', '88', '1', '111307', '176754', '16'), +('11', '88', '1', '111306', '176565', '16'), +('11', '88', '1', '111304', '176275', '16'), +('11', '88', '2', '62985', '109935', '16'), +('11', '88', '2', '94056', '109860', '16'), +('11', '88', '2', '104424', '96035', '16'), +('11', '88', '2', '54845', '71079', '16'), +('11', '88', '3', '111314', '177252', '16'), +('11', '88', '3', '111316', '175480', '16'), +('11', '88', '3', '111315', '174596', '16'), +('11', '88', '3', '111013', '155401', '16'), +('11', '88', '5', '111319', '176760', '16'), +('11', '88', '5', '111321', '175966', '16'), +('11', '88', '5', '111318', '174015', '16'), +('11', '88', '5', '111018', '154909', '16'), +('11', '88', '8', '111332', '177340', '16'), +('11', '88', '8', '111329', '176325', '16'), +('11', '88', '8', '111331', '172747', '16'), +('11', '88', '8', '111031', '155590', '16'), +('11', '88', '6', '111323', '177206', '16'), +('11', '88', '6', '111326', '175740', '16'), +('11', '88', '6', '111325', '175685', '16'), +('11', '88', '6', '111022', '155356', '16'), +('11', '88', '17', '56043', '117691', '16'), +('11', '88', '17', '56084', '114271', '16'), +('11', '88', '17', '104427', '99678', '16'), +('11', '88', '17', '54854', '75113', '16'), +('11', '88', '7', '56080', '110022', '16'), +('11', '88', '7', '56040', '109353', '16'), +('11', '88', '7', '104425', '95465', '16'), +('11', '88', '7', '54848', '70220', '16'), +('11', '88', '9', '67098', '175944', '16'), +('11', '88', '9', '104834', '121641', '16'), +('11', '88', '9', '56070', '106398', '16'), +('11', '88', '9', '56031', '106298', '16'), +('11', '88', '15', '111349', '179213', '16'), +('11', '88', '15', '111344', '177474', '16'), +('11', '88', '15', '111340', '177024', '16'), +('11', '88', '15', '111346', '176815', '16'), +('11', '88', '20', '111356', '177351', '16'), +('11', '88', '20', '111352', '176346', '16'), +('11', '88', '20', '111351', '173859', '16'), +('11', '88', '20', '111054', '155501', '16'), +('11', '88', '12', '56035', '108350', '16'), +('11', '88', '12', '56074', '107164', '16'), +('11', '88', '12', '104422', '93351', '16'), +('11', '88', '12', '49656', '70151', '16'), +('11', '88', '18', '56041', '114154', '16'), +('11', '88', '18', '62986', '112312', '16'), +('11', '88', '18', '104426', '97181', '16'), +('11', '88', '18', '54851', '71470', '16'), +('11', '88', '19', '81763', '110818', '16'), +('11', '88', '19', '62990', '110677', '16'), +('11', '88', '19', '56075', '110084', '16'), +('11', '88', '19', '56037', '110014', '16'), +('11', '88', '13', '111521', '183121', '16'), +('11', '88', '13', '111524', '173757', '16'), +('11', '88', '13', '111519', '173728', '16'), +('11', '88', '13', '111221', '162269', '16'), +('11', '88', '14', '111537', '177360', '16'), +('11', '88', '14', '111535', '175137', '16'), +('11', '88', '14', '111237', '155509', '16'), +('11', '88', '14', '111235', '153386', '16'), +('11', '88', '11', '111335', '176369', '16'), +('11', '88', '11', '111337', '176248', '16'), +('11', '88', '11', '111338', '172761', '16'), +('11', '88', '11', '111034', '154619', '16'), +('11', '89', '22', '12425', '0', '16'), +('11', '89', '22', '21807', '0', '16'), +('11', '89', '22', '39342', '0', '16'), +('11', '89', '22', '23597', '0', '16'), +('11', '89', '1', '111311', '178895', '16'), +('11', '89', '1', '111307', '176762', '16'), +('11', '89', '1', '111306', '176571', '16'), +('11', '89', '1', '111304', '176280', '16'), +('11', '89', '2', '62985', '109939', '16'), +('11', '89', '2', '94056', '109863', '16'), +('11', '89', '2', '104424', '96043', '16'), +('11', '89', '2', '54845', '71085', '16'), +('11', '89', '3', '111314', '177258', '16'), +('11', '89', '3', '111316', '175486', '16'), +('11', '89', '3', '111315', '174602', '16'), +('11', '89', '3', '111013', '155407', '16'), +('11', '89', '5', '111319', '176767', '16'), +('11', '89', '5', '111321', '175971', '16'), +('11', '89', '5', '111318', '174022', '16'), +('11', '89', '5', '111018', '154917', '16'), +('11', '89', '8', '111332', '177347', '16'), +('11', '89', '8', '111329', '176332', '16'), +('11', '89', '8', '111331', '172752', '16'), +('11', '89', '8', '111031', '155596', '16'), +('11', '89', '6', '111323', '177212', '16'), +('11', '89', '6', '111326', '175748', '16'), +('11', '89', '6', '111325', '175690', '16'), +('11', '89', '6', '111022', '155361', '16'), +('11', '89', '17', '56043', '117697', '16'), +('11', '89', '17', '56084', '114277', '16'), +('11', '89', '17', '104427', '99684', '16'), +('11', '89', '17', '54854', '75117', '16'), +('11', '89', '7', '56080', '110030', '16'), +('11', '89', '7', '56040', '109363', '16'), +('11', '89', '7', '104425', '95471', '16'), +('11', '89', '7', '54848', '70226', '16'), +('11', '89', '9', '67098', '177947', '16'), +('11', '89', '9', '104834', '121647', '16'), +('11', '89', '9', '56070', '106403', '16'), +('11', '89', '9', '56031', '106309', '16'), +('11', '89', '15', '111349', '179221', '16'), +('11', '89', '15', '111344', '177478', '16'), +('11', '89', '15', '111340', '177030', '16'), +('11', '89', '15', '111346', '176821', '16'), +('11', '89', '20', '111356', '177357', '16'), +('11', '89', '20', '111352', '176351', '16'), +('11', '89', '20', '111351', '173867', '16'), +('11', '89', '20', '111054', '155507', '16'), +('11', '89', '12', '56035', '108360', '16'), +('11', '89', '12', '56074', '107170', '16'), +('11', '89', '12', '104422', '93359', '16'), +('11', '89', '12', '49656', '70152', '16'), +('11', '89', '18', '56041', '114162', '16'), +('11', '89', '18', '62986', '112317', '16'), +('11', '89', '18', '104426', '97183', '16'), +('11', '89', '18', '54851', '71474', '16'), +('11', '89', '19', '81763', '110828', '16'), +('11', '89', '19', '62990', '110684', '16'), +('11', '89', '19', '56075', '110088', '16'), +('11', '89', '19', '56037', '110017', '16'), +('11', '89', '13', '111521', '183127', '16'), +('11', '89', '13', '111524', '173763', '16'), +('11', '89', '13', '111519', '173735', '16'), +('11', '89', '13', '111221', '162275', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '89', '14', '111537', '177366', '16'), +('11', '89', '14', '111535', '175141', '16'), +('11', '89', '14', '111237', '155514', '16'), +('11', '89', '14', '111235', '153390', '16'), +('11', '89', '11', '111335', '176375', '16'), +('11', '89', '11', '111337', '176254', '16'), +('11', '89', '11', '111338', '172767', '16'), +('11', '89', '11', '111034', '154625', '16'), +('11', '90', '22', '12425', '0', '17'), +('11', '90', '22', '21807', '0', '17'), +('11', '90', '22', '39342', '0', '17'), +('11', '90', '22', '23597', '0', '17'), +('11', '90', '1', '111311', '178899', '17'), +('11', '90', '1', '111307', '176770', '17'), +('11', '90', '1', '111306', '176576', '17'), +('11', '90', '1', '111304', '176285', '17'), +('11', '90', '2', '62985', '109943', '17'), +('11', '90', '2', '94056', '109866', '17'), +('11', '90', '2', '104424', '96051', '17'), +('11', '90', '2', '54845', '71091', '17'), +('11', '90', '3', '111314', '177265', '17'), +('11', '90', '3', '111316', '175493', '17'), +('11', '90', '3', '111315', '174608', '17'), +('11', '90', '3', '111013', '155414', '17'), +('11', '90', '5', '111319', '176774', '17'), +('11', '90', '5', '111321', '175976', '17'), +('11', '90', '5', '111318', '174030', '17'), +('11', '90', '5', '111018', '154924', '17'), +('11', '90', '8', '111332', '177354', '17'), +('11', '90', '8', '111329', '176340', '17'), +('11', '90', '8', '111331', '172757', '17'), +('11', '90', '8', '111031', '155603', '17'), +('11', '90', '6', '111323', '177218', '17'), +('11', '90', '6', '111326', '175756', '17'), +('11', '90', '6', '111325', '175694', '17'), +('11', '90', '6', '111022', '155367', '17'), +('11', '90', '17', '56043', '117702', '17'), +('11', '90', '17', '56084', '114284', '17'), +('11', '90', '17', '104427', '99690', '17'), +('11', '90', '17', '54854', '75122', '17'), +('11', '90', '7', '56080', '110037', '17'), +('11', '90', '7', '56040', '109373', '17'), +('11', '90', '7', '104425', '95476', '17'), +('11', '90', '7', '54848', '70232', '17'), +('11', '90', '9', '67098', '179951', '17'), +('11', '90', '9', '104834', '121653', '17'), +('11', '90', '9', '56070', '106408', '17'), +('11', '90', '9', '56031', '106319', '17'), +('11', '90', '15', '111349', '179229', '17'), +('11', '90', '15', '111344', '177483', '17'), +('11', '90', '15', '111340', '177035', '17'), +('11', '90', '15', '111346', '176826', '17'), +('11', '90', '20', '111356', '177364', '17'), +('11', '90', '20', '111352', '176356', '17'), +('11', '90', '20', '111351', '173874', '17'), +('11', '90', '20', '111054', '155513', '17'), +('11', '90', '12', '56035', '108369', '17'), +('11', '90', '12', '56074', '107176', '17'), +('11', '90', '12', '104422', '93367', '17'), +('11', '90', '12', '49656', '70153', '17'), +('11', '90', '18', '56041', '114171', '17'), +('11', '90', '18', '62986', '112322', '17'), +('11', '90', '18', '104426', '97185', '17'), +('11', '90', '18', '54851', '71479', '17'), +('11', '90', '19', '81763', '110838', '17'), +('11', '90', '19', '62990', '110692', '17'), +('11', '90', '19', '56075', '110093', '17'), +('11', '90', '19', '56037', '110019', '17'), +('11', '90', '13', '111521', '183132', '17'), +('11', '90', '13', '111524', '173770', '17'), +('11', '90', '13', '111519', '173743', '17'), +('11', '90', '13', '111221', '162281', '17'), +('11', '90', '14', '111537', '177371', '17'), +('11', '90', '14', '111535', '175145', '17'), +('11', '90', '14', '111237', '155519', '17'), +('11', '90', '14', '111235', '153394', '17'), +('11', '90', '11', '111335', '176381', '17'), +('11', '90', '11', '111337', '176260', '17'), +('11', '90', '11', '111338', '172773', '17'), +('11', '90', '11', '111034', '154631', '17'), +('11', '91', '22', '12425', '0', '17'), +('11', '91', '22', '21807', '0', '17'), +('11', '91', '22', '39342', '0', '17'), +('11', '91', '22', '23597', '0', '17'), +('11', '91', '1', '111311', '178903', '17'), +('11', '91', '1', '111307', '176778', '17'), +('11', '91', '1', '111306', '176582', '17'), +('11', '91', '1', '111304', '176290', '17'), +('11', '91', '2', '62985', '109947', '17'), +('11', '91', '2', '94056', '109869', '17'), +('11', '91', '2', '104424', '96059', '17'), +('11', '91', '2', '54845', '71097', '17'), +('11', '91', '3', '111314', '177271', '17'), +('11', '91', '3', '111316', '175499', '17'), +('11', '91', '3', '111315', '174614', '17'), +('11', '91', '3', '111013', '155421', '17'), +('11', '91', '5', '111319', '176781', '17'), +('11', '91', '5', '111321', '175981', '17'), +('11', '91', '5', '111318', '174037', '17'), +('11', '91', '5', '111018', '154931', '17'), +('11', '91', '8', '111332', '177360', '17'), +('11', '91', '8', '111329', '176347', '17'), +('11', '91', '8', '111331', '172763', '17'), +('11', '91', '8', '111031', '155610', '17'), +('11', '91', '6', '111323', '177223', '17'), +('11', '91', '6', '111326', '175763', '17'), +('11', '91', '6', '111325', '175699', '17'), +('11', '91', '6', '111022', '155373', '17'), +('11', '91', '17', '56043', '117708', '17'), +('11', '91', '17', '56084', '114290', '17'), +('11', '91', '17', '104427', '99696', '17'), +('11', '91', '17', '54854', '75127', '17'), +('11', '91', '7', '56080', '110044', '17'), +('11', '91', '7', '56040', '109383', '17'), +('11', '91', '7', '104425', '95482', '17'), +('11', '91', '7', '54848', '70238', '17'), +('11', '91', '9', '67098', '179955', '17'), +('11', '91', '9', '104834', '121659', '17'), +('11', '91', '9', '56070', '106414', '17'), +('11', '91', '9', '56031', '106329', '17'), +('11', '91', '15', '111349', '179237', '17'), +('11', '91', '15', '111344', '177488', '17'), +('11', '91', '15', '111340', '177041', '17'), +('11', '91', '15', '111346', '176832', '17'), +('11', '91', '20', '111356', '177370', '17'), +('11', '91', '20', '111352', '176362', '17'), +('11', '91', '20', '111351', '173882', '17'), +('11', '91', '20', '111054', '155519', '17'), +('11', '91', '12', '56035', '108379', '17'), +('11', '91', '12', '56074', '107182', '17'), +('11', '91', '12', '104422', '93375', '17'), +('11', '91', '12', '49656', '70154', '17'), +('11', '91', '18', '56041', '114179', '17'), +('11', '91', '18', '62986', '112327', '17'), +('11', '91', '18', '104426', '97187', '17'), +('11', '91', '18', '54851', '71483', '17'), +('11', '91', '19', '81763', '110847', '17'), +('11', '91', '19', '62990', '110699', '17'), +('11', '91', '19', '56075', '110098', '17'), +('11', '91', '19', '56037', '110022', '17'), +('11', '91', '13', '111521', '183137', '17'), +('11', '91', '13', '111524', '173776', '17'), +('11', '91', '13', '111519', '173750', '17'), +('11', '91', '13', '111221', '162287', '17'), +('11', '91', '14', '111537', '177376', '17'), +('11', '91', '14', '111535', '175149', '17'), +('11', '91', '14', '111237', '155524', '17'), +('11', '91', '14', '111235', '153398', '17'), +('11', '91', '11', '111335', '176387', '17'), +('11', '91', '11', '111337', '176266', '17'), +('11', '91', '11', '111338', '172779', '17'), +('11', '91', '11', '111034', '154637', '17'), +('11', '92', '22', '12425', '0', '17'), +('11', '92', '22', '21807', '0', '17'), +('11', '92', '22', '39342', '0', '17'), +('11', '92', '22', '23597', '0', '17'), +('11', '92', '1', '111311', '178907', '17'), +('11', '92', '1', '111307', '176786', '17'), +('11', '92', '1', '111306', '176587', '17'), +('11', '92', '1', '111304', '176295', '17'), +('11', '92', '2', '62985', '109951', '17'), +('11', '92', '2', '94056', '109873', '17'), +('11', '92', '2', '104424', '96067', '17'), +('11', '92', '2', '54845', '71103', '17'), +('11', '92', '3', '111314', '177278', '17'), +('11', '92', '3', '111316', '175505', '17'), +('11', '92', '3', '111315', '174620', '17'), +('11', '92', '3', '111013', '155427', '17'), +('11', '92', '5', '111319', '176788', '17'), +('11', '92', '5', '111321', '175986', '17'), +('11', '92', '5', '111318', '174045', '17'), +('11', '92', '5', '111018', '154938', '17'), +('11', '92', '8', '111332', '177367', '17'), +('11', '92', '8', '111329', '176355', '17'), +('11', '92', '8', '111331', '172768', '17'), +('11', '92', '8', '111031', '155616', '17'), +('11', '92', '6', '111323', '177229', '17'), +('11', '92', '6', '111326', '175771', '17'), +('11', '92', '6', '111325', '175704', '17'), +('11', '92', '6', '111022', '155379', '17'), +('11', '92', '17', '56043', '117713', '17'), +('11', '92', '17', '56084', '114296', '17'), +('11', '92', '17', '104427', '99702', '17'), +('11', '92', '17', '54854', '75131', '17'), +('11', '92', '7', '56080', '110051', '17'), +('11', '92', '7', '56040', '109393', '17'), +('11', '92', '7', '104425', '95487', '17'), +('11', '92', '7', '54848', '70244', '17'), +('11', '92', '9', '67098', '179960', '17'), +('11', '92', '9', '104834', '121665', '17'), +('11', '92', '9', '56070', '106419', '17'), +('11', '92', '9', '56031', '106339', '17'), +('11', '92', '15', '111349', '179246', '17'), +('11', '92', '15', '111344', '177493', '17'), +('11', '92', '15', '111340', '177046', '17'), +('11', '92', '15', '111346', '176838', '17'), +('11', '92', '20', '111356', '177376', '17'), +('11', '92', '20', '111352', '176367', '17'), +('11', '92', '20', '111351', '173889', '17'), +('11', '92', '20', '111054', '155525', '17'), +('11', '92', '12', '56035', '108388', '17'), +('11', '92', '12', '56074', '107188', '17'), +('11', '92', '12', '104422', '93383', '17'), +('11', '92', '12', '49656', '70155', '17'), +('11', '92', '18', '56041', '114188', '17'), +('11', '92', '18', '62986', '112332', '17'), +('11', '92', '18', '104426', '97189', '17'), +('11', '92', '18', '54851', '71487', '17'), +('11', '92', '19', '81763', '110857', '17'), +('11', '92', '19', '62990', '110707', '17'), +('11', '92', '19', '56075', '110103', '17'), +('11', '92', '19', '56037', '110024', '17'), +('11', '92', '13', '111521', '183143', '17'), +('11', '92', '13', '111524', '173783', '17'), +('11', '92', '13', '111519', '173758', '17'), +('11', '92', '13', '111221', '162293', '17'), +('11', '92', '14', '111537', '177381', '17'), +('11', '92', '14', '111535', '175153', '17'), +('11', '92', '14', '111237', '155530', '17'), +('11', '92', '14', '111235', '153402', '17'), +('11', '92', '11', '111335', '176393', '17'), +('11', '92', '11', '111337', '176272', '17'), +('11', '92', '11', '111338', '172786', '17'), +('11', '92', '11', '111034', '154643', '17'), +('11', '93', '22', '12425', '0', '17'), +('11', '93', '22', '21807', '0', '17'), +('11', '93', '22', '39342', '0', '17'), +('11', '93', '22', '23597', '0', '17'), +('11', '93', '1', '111311', '178911', '17'), +('11', '93', '1', '111307', '176794', '17'), +('11', '93', '1', '111306', '176593', '17'), +('11', '93', '1', '111304', '176300', '17'), +('11', '93', '2', '62985', '109955', '17'), +('11', '93', '2', '94056', '109876', '17'), +('11', '93', '2', '104424', '96075', '17'), +('11', '93', '2', '54845', '71109', '17'), +('11', '93', '3', '111314', '177284', '17'), +('11', '93', '3', '111316', '175511', '17'), +('11', '93', '3', '111315', '174627', '17'), +('11', '93', '3', '111013', '155434', '17'), +('11', '93', '5', '111319', '176796', '17'), +('11', '93', '5', '111321', '175991', '17'), +('11', '93', '5', '111318', '174052', '17'), +('11', '93', '5', '111018', '154945', '17'), +('11', '93', '8', '111332', '177374', '17'), +('11', '93', '8', '111329', '176363', '17'), +('11', '93', '8', '111331', '172773', '17'), +('11', '93', '8', '111031', '155623', '17'), +('11', '93', '6', '111323', '177235', '17'), +('11', '93', '6', '111326', '175779', '17'), +('11', '93', '6', '111325', '175709', '17'), +('11', '93', '6', '111022', '155384', '17'), +('11', '93', '17', '56043', '117719', '17'), +('11', '93', '17', '56084', '114302', '17'), +('11', '93', '17', '104427', '99709', '17'), +('11', '93', '17', '54854', '75136', '17'), +('11', '93', '7', '56080', '110058', '17'), +('11', '93', '7', '56040', '109403', '17'), +('11', '93', '7', '104425', '95493', '17'), +('11', '93', '7', '54848', '70250', '17'), +('11', '93', '9', '67098', '179964', '17'), +('11', '93', '9', '104834', '121671', '17'), +('11', '93', '9', '56070', '106424', '17'), +('11', '93', '9', '56031', '106349', '17'), +('11', '93', '15', '111349', '179254', '17'), +('11', '93', '15', '111344', '177497', '17'), +('11', '93', '15', '111340', '177052', '17'), +('11', '93', '15', '111346', '176844', '17'), +('11', '93', '20', '111356', '177382', '17'), +('11', '93', '20', '111352', '176372', '17'), +('11', '93', '20', '111351', '173897', '17'), +('11', '93', '20', '111054', '155532', '17'), +('11', '93', '12', '56035', '108398', '17'), +('11', '93', '12', '56074', '107194', '17'), +('11', '93', '12', '104422', '93390', '17'), +('11', '93', '12', '49656', '70155', '17'), +('11', '93', '18', '56041', '114196', '17'), +('11', '93', '18', '62986', '112337', '17'), +('11', '93', '18', '104426', '97191', '17'), +('11', '93', '18', '54851', '71491', '17'), +('11', '93', '19', '81763', '110867', '17'), +('11', '93', '19', '62990', '110714', '17'), +('11', '93', '19', '56075', '110107', '17'), +('11', '93', '19', '56037', '110027', '17'), +('11', '93', '13', '111521', '183148', '17'), +('11', '93', '13', '111524', '173790', '17'), +('11', '93', '13', '111519', '173765', '17'), +('11', '93', '13', '111221', '162299', '17'), +('11', '93', '14', '111537', '177386', '17'), +('11', '93', '14', '111535', '175157', '17'), +('11', '93', '14', '111237', '155535', '17'), +('11', '93', '14', '111235', '153406', '17'), +('11', '93', '11', '111335', '176399', '17'), +('11', '93', '11', '111337', '176278', '17'), +('11', '93', '11', '111338', '172792', '17'), +('11', '93', '11', '111034', '154648', '17'), +('11', '94', '22', '12425', '0', '17'), +('11', '94', '22', '21807', '0', '17'), +('11', '94', '22', '39342', '0', '17'), +('11', '94', '22', '23597', '0', '17'), +('11', '94', '1', '111311', '178915', '17'), +('11', '94', '1', '111307', '176803', '17'), +('11', '94', '1', '111306', '176598', '17'), +('11', '94', '1', '111304', '176304', '17'), +('11', '94', '2', '62985', '109959', '17'), +('11', '94', '2', '94056', '109879', '17'), +('11', '94', '2', '104424', '96083', '17'), +('11', '94', '2', '54845', '71114', '17'), +('11', '94', '3', '111314', '177291', '17'), +('11', '94', '3', '111316', '175517', '17'), +('11', '94', '3', '111315', '174633', '17'), +('11', '94', '3', '111013', '155440', '17'), +('11', '94', '5', '111319', '176803', '17'), +('11', '94', '5', '111321', '175996', '17'), +('11', '94', '5', '111318', '174060', '17'), +('11', '94', '5', '111018', '154952', '17'), +('11', '94', '8', '111332', '177380', '17'), +('11', '94', '8', '111329', '176370', '17'), +('11', '94', '8', '111331', '172779', '17'), +('11', '94', '8', '111031', '155630', '17'), +('11', '94', '6', '111323', '177241', '17'), +('11', '94', '6', '111326', '175786', '17'), +('11', '94', '6', '111325', '175713', '17'), +('11', '94', '6', '111022', '155390', '17'), +('11', '94', '17', '56043', '117724', '17'), +('11', '94', '17', '56084', '114308', '17'), +('11', '94', '17', '104427', '99715', '17'), +('11', '94', '17', '54854', '75141', '17'), +('11', '94', '7', '56080', '110065', '17'), +('11', '94', '7', '56040', '109413', '17'), +('11', '94', '7', '104425', '95498', '17'), +('11', '94', '7', '54848', '70256', '17'), +('11', '94', '9', '67098', '179968', '17'), +('11', '94', '9', '104834', '121677', '17'), +('11', '94', '9', '56070', '106429', '17'), +('11', '94', '9', '56031', '106359', '17'), +('11', '94', '15', '111349', '179262', '17'), +('11', '94', '15', '111344', '177502', '17'), +('11', '94', '15', '111340', '177057', '17'), +('11', '94', '15', '111346', '176850', '17'), +('11', '94', '20', '111356', '177388', '17'), +('11', '94', '20', '111352', '176378', '17'), +('11', '94', '20', '111351', '173904', '17'), +('11', '94', '20', '111054', '155538', '17'), +('11', '94', '12', '56035', '108407', '17'), +('11', '94', '12', '56074', '107200', '17'), +('11', '94', '12', '104422', '93398', '17'), +('11', '94', '12', '49656', '70156', '17'), +('11', '94', '18', '56041', '114205', '17'), +('11', '94', '18', '62986', '112342', '17'), +('11', '94', '18', '104426', '97193', '17'), +('11', '94', '18', '54851', '71495', '17'), +('11', '94', '19', '81763', '110877', '17'), +('11', '94', '19', '62990', '110722', '17'), +('11', '94', '19', '56075', '110112', '17'), +('11', '94', '19', '56037', '110029', '17'), +('11', '94', '13', '111521', '183153', '17'), +('11', '94', '13', '111524', '173796', '17'), +('11', '94', '13', '111519', '173772', '17'), +('11', '94', '13', '111221', '162305', '17'), +('11', '94', '14', '111537', '177391', '17'), +('11', '94', '14', '111535', '175161', '17'), +('11', '94', '14', '111237', '155540', '17'), +('11', '94', '14', '111235', '153410', '17'), +('11', '94', '11', '111335', '176405', '17'), +('11', '94', '11', '111337', '176285', '17'), +('11', '94', '11', '111338', '172798', '17'), +('11', '94', '11', '111034', '154654', '17'), +('11', '95', '22', '12425', '0', '18'), +('11', '95', '22', '21807', '0', '18'), +('11', '95', '22', '39342', '0', '18'), +('11', '95', '22', '23597', '0', '18'), +('11', '95', '1', '128691', '229877', '18'), +('11', '95', '1', '111311', '178919', '18'), +('11', '95', '1', '111307', '176811', '18'), +('11', '95', '1', '111306', '176604', '18'), +('11', '95', '2', '62985', '109963', '18'), +('11', '95', '2', '94056', '109883', '18'), +('11', '95', '2', '104424', '96091', '18'), +('11', '95', '2', '54845', '71120', '18'), +('11', '95', '3', '111314', '177297', '18'), +('11', '95', '3', '111316', '175523', '18'), +('11', '95', '3', '111315', '174639', '18'), +('11', '95', '3', '111013', '155447', '18'), +('11', '95', '5', '111319', '176810', '18'), +('11', '95', '5', '111321', '176002', '18'), +('11', '95', '5', '111318', '174067', '18'), +('11', '95', '5', '111018', '154959', '18'), +('11', '95', '8', '111332', '177387', '18'), +('11', '95', '8', '111329', '176378', '18'), +('11', '95', '8', '111331', '172784', '18'), +('11', '95', '8', '111031', '155636', '18'), +('11', '95', '6', '111323', '177246', '18'), +('11', '95', '6', '111326', '175794', '18'), +('11', '95', '6', '111325', '175718', '18'), +('11', '95', '6', '111022', '155396', '18'), +('11', '95', '17', '56043', '117730', '18'), +('11', '95', '17', '56084', '114314', '18'), +('11', '95', '17', '104427', '99721', '18'), +('11', '95', '17', '54854', '75145', '18'), +('11', '95', '7', '56080', '110072', '18'), +('11', '95', '7', '56040', '109424', '18'), +('11', '95', '7', '104425', '95504', '18'), +('11', '95', '7', '54848', '70263', '18'), +('11', '95', '9', '67098', '179973', '18'), +('11', '95', '9', '104834', '121683', '18'), +('11', '95', '9', '56070', '106435', '18'), +('11', '95', '9', '56031', '106369', '18'), +('11', '95', '15', '111349', '179270', '18'), +('11', '95', '15', '111344', '177507', '18'), +('11', '95', '15', '111340', '177063', '18'), +('11', '95', '15', '111346', '176856', '18'), +('11', '95', '20', '128733', '227264', '18'), +('11', '95', '20', '111356', '177395', '18'), +('11', '95', '20', '111352', '176383', '18'), +('11', '95', '20', '111351', '173912', '18'), +('11', '95', '12', '56035', '108417', '18'), +('11', '95', '12', '56074', '107206', '18'), +('11', '95', '12', '104422', '93406', '18'), +('11', '95', '12', '49656', '70157', '18'), +('11', '95', '18', '56041', '114213', '18'), +('11', '95', '18', '62986', '112347', '18'), +('11', '95', '18', '104426', '97195', '18'), +('11', '95', '18', '54851', '71499', '18'), +('11', '95', '19', '81763', '110887', '18'), +('11', '95', '19', '62990', '110730', '18'), +('11', '95', '19', '56075', '110117', '18'), +('11', '95', '19', '56037', '110032', '18'), +('11', '95', '13', '111521', '183159', '18'), +('11', '95', '13', '111524', '173803', '18'), +('11', '95', '13', '111519', '173780', '18'), +('11', '95', '13', '111221', '162311', '18'), +('11', '95', '14', '111537', '177396', '18'), +('11', '95', '14', '111535', '175165', '18'), +('11', '95', '14', '111237', '155545', '18'), +('11', '95', '14', '111235', '153414', '18'), +('11', '95', '11', '111335', '176411', '18'), +('11', '95', '11', '111337', '176291', '18'), +('11', '95', '11', '111338', '172804', '18'), +('11', '95', '11', '111034', '154660', '18'), +('11', '96', '22', '12425', '0', '18'), +('11', '96', '22', '21807', '0', '18'), +('11', '96', '22', '39342', '0', '18'), +('11', '96', '22', '23597', '0', '18'), +('11', '96', '1', '128691', '229883', '18'), +('11', '96', '1', '111311', '178923', '18'), +('11', '96', '1', '111307', '176819', '18'), +('11', '96', '1', '111306', '176609', '18'), +('11', '96', '2', '62985', '109966', '18'), +('11', '96', '2', '94056', '109886', '18'), +('11', '96', '2', '104424', '96099', '18'), +('11', '96', '2', '54845', '71126', '18'), +('11', '96', '3', '111314', '177304', '18'), +('11', '96', '3', '111316', '175529', '18'), +('11', '96', '3', '111315', '174645', '18'), +('11', '96', '3', '111013', '155453', '18'), +('11', '96', '5', '111319', '176817', '18'), +('11', '96', '5', '111321', '176007', '18'), +('11', '96', '5', '111318', '174075', '18'), +('11', '96', '5', '111018', '154967', '18'), +('11', '96', '8', '111332', '177394', '18'), +('11', '96', '8', '111329', '176385', '18'), +('11', '96', '8', '111331', '172789', '18'), +('11', '96', '8', '111031', '155643', '18'), +('11', '96', '6', '111323', '177252', '18'), +('11', '96', '6', '111326', '175802', '18'), +('11', '96', '6', '111325', '175723', '18'), +('11', '96', '6', '111022', '155402', '18'), +('11', '96', '17', '56043', '117735', '18'), +('11', '96', '17', '56084', '114321', '18'), +('11', '96', '17', '104427', '99727', '18'), +('11', '96', '17', '54854', '75150', '18'), +('11', '96', '7', '56080', '110079', '18'), +('11', '96', '7', '56040', '109434', '18'), +('11', '96', '7', '104425', '95509', '18'), +('11', '96', '7', '54848', '70269', '18'), +('11', '96', '9', '67098', '179977', '18'), +('11', '96', '9', '104834', '121689', '18'), +('11', '96', '9', '56070', '106440', '18'), +('11', '96', '9', '56031', '106379', '18'), +('11', '96', '15', '111349', '179278', '18'), +('11', '96', '15', '111344', '177511', '18'), +('11', '96', '15', '111340', '177068', '18'), +('11', '96', '15', '111346', '176862', '18'), +('11', '96', '20', '128733', '227270', '18'), +('11', '96', '20', '111356', '177401', '18'), +('11', '96', '20', '111352', '176388', '18'), +('11', '96', '20', '111351', '173919', '18'), +('11', '96', '12', '56035', '108426', '18'), +('11', '96', '12', '56074', '107213', '18'), +('11', '96', '12', '104422', '93414', '18'), +('11', '96', '12', '49656', '70158', '18'), +('11', '96', '18', '56041', '114221', '18'), +('11', '96', '18', '62986', '112352', '18'), +('11', '96', '18', '104426', '97197', '18'), +('11', '96', '18', '54851', '71503', '18'), +('11', '96', '19', '81763', '110897', '18'), +('11', '96', '19', '62990', '110737', '18'), +('11', '96', '19', '56075', '110122', '18'), +('11', '96', '19', '56037', '110034', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '96', '13', '111521', '183164', '18'), +('11', '96', '13', '111524', '173810', '18'), +('11', '96', '13', '111519', '173787', '18'), +('11', '96', '13', '111221', '162317', '18'), +('11', '96', '14', '111537', '177402', '18'), +('11', '96', '14', '111535', '175169', '18'), +('11', '96', '14', '111237', '155550', '18'), +('11', '96', '14', '111235', '153417', '18'), +('11', '96', '11', '111335', '176417', '18'), +('11', '96', '11', '111337', '176297', '18'), +('11', '96', '11', '111338', '172810', '18'), +('11', '96', '11', '111034', '154666', '18'), +('11', '97', '22', '12425', '0', '18'), +('11', '97', '22', '21807', '0', '18'), +('11', '97', '22', '39342', '0', '18'), +('11', '97', '22', '23597', '0', '18'), +('11', '97', '1', '128691', '229890', '18'), +('11', '97', '1', '111311', '178927', '18'), +('11', '97', '1', '111307', '176827', '18'), +('11', '97', '1', '111306', '176615', '18'), +('11', '97', '2', '62985', '109970', '18'), +('11', '97', '2', '94056', '109889', '18'), +('11', '97', '2', '104424', '96107', '18'), +('11', '97', '2', '54845', '71132', '18'), +('11', '97', '3', '111314', '177310', '18'), +('11', '97', '3', '111316', '175535', '18'), +('11', '97', '3', '111315', '174651', '18'), +('11', '97', '3', '111013', '155460', '18'), +('11', '97', '5', '111319', '176824', '18'), +('11', '97', '5', '111321', '176012', '18'), +('11', '97', '5', '111318', '174082', '18'), +('11', '97', '5', '111018', '154974', '18'), +('11', '97', '8', '111332', '177400', '18'), +('11', '97', '8', '111329', '176393', '18'), +('11', '97', '8', '111331', '172795', '18'), +('11', '97', '8', '111031', '155650', '18'), +('11', '97', '6', '111323', '177258', '18'), +('11', '97', '6', '111326', '175810', '18'), +('11', '97', '6', '111325', '175727', '18'), +('11', '97', '6', '111022', '155407', '18'), +('11', '97', '17', '56043', '117741', '18'), +('11', '97', '17', '56084', '114327', '18'), +('11', '97', '17', '104427', '99733', '18'), +('11', '97', '17', '54854', '75155', '18'), +('11', '97', '7', '56080', '110087', '18'), +('11', '97', '7', '56040', '109444', '18'), +('11', '97', '7', '104425', '95515', '18'), +('11', '97', '7', '54848', '70275', '18'), +('11', '97', '9', '67098', '179981', '18'), +('11', '97', '9', '104834', '121695', '18'), +('11', '97', '9', '56070', '106445', '18'), +('11', '97', '9', '56031', '106389', '18'), +('11', '97', '15', '111349', '179286', '18'), +('11', '97', '15', '111344', '177516', '18'), +('11', '97', '15', '111340', '177074', '18'), +('11', '97', '15', '111346', '176868', '18'), +('11', '97', '20', '128733', '227276', '18'), +('11', '97', '20', '111356', '177407', '18'), +('11', '97', '20', '111352', '176393', '18'), +('11', '97', '20', '111351', '173927', '18'), +('11', '97', '12', '56035', '108436', '18'), +('11', '97', '12', '56074', '107219', '18'), +('11', '97', '12', '104422', '93422', '18'), +('11', '97', '12', '49656', '70159', '18'), +('11', '97', '18', '56041', '114230', '18'), +('11', '97', '18', '62986', '112357', '18'), +('11', '97', '18', '104426', '97199', '18'), +('11', '97', '18', '54851', '71507', '18'), +('11', '97', '19', '81763', '110907', '18'), +('11', '97', '19', '62990', '110745', '18'), +('11', '97', '19', '56075', '110126', '18'), +('11', '97', '19', '56037', '110037', '18'), +('11', '97', '13', '111521', '183169', '18'), +('11', '97', '13', '111524', '173816', '18'), +('11', '97', '13', '111519', '173795', '18'), +('11', '97', '13', '111221', '162323', '18'), +('11', '97', '14', '111537', '177407', '18'), +('11', '97', '14', '111535', '175173', '18'), +('11', '97', '14', '111237', '155555', '18'), +('11', '97', '14', '111235', '153421', '18'), +('11', '97', '11', '111335', '176423', '18'), +('11', '97', '11', '111337', '176303', '18'), +('11', '97', '11', '111338', '172816', '18'), +('11', '97', '11', '111034', '154672', '18'), +('11', '98', '22', '12425', '0', '18'), +('11', '98', '22', '21807', '0', '18'), +('11', '98', '22', '39342', '0', '18'), +('11', '98', '22', '23597', '0', '18'), +('11', '98', '1', '128691', '229896', '18'), +('11', '98', '1', '111311', '178932', '18'), +('11', '98', '1', '111307', '176835', '18'), +('11', '98', '1', '111306', '176620', '18'), +('11', '98', '2', '62985', '109974', '18'), +('11', '98', '2', '94056', '109893', '18'), +('11', '98', '2', '104424', '96115', '18'), +('11', '98', '2', '54845', '71138', '18'), +('11', '98', '3', '111314', '177317', '18'), +('11', '98', '3', '111316', '175541', '18'), +('11', '98', '3', '111315', '174657', '18'), +('11', '98', '3', '111013', '155466', '18'), +('11', '98', '5', '111319', '176831', '18'), +('11', '98', '5', '111321', '176017', '18'), +('11', '98', '5', '111318', '174090', '18'), +('11', '98', '5', '111018', '154981', '18'), +('11', '98', '8', '111332', '177407', '18'), +('11', '98', '8', '111329', '176400', '18'), +('11', '98', '8', '111331', '172800', '18'), +('11', '98', '8', '111031', '155656', '18'), +('11', '98', '6', '111323', '177264', '18'), +('11', '98', '6', '111326', '175817', '18'), +('11', '98', '6', '111325', '175732', '18'), +('11', '98', '6', '111022', '155413', '18'), +('11', '98', '17', '56043', '117746', '18'), +('11', '98', '17', '56084', '114333', '18'), +('11', '98', '17', '104427', '99739', '18'), +('11', '98', '17', '54854', '75160', '18'), +('11', '98', '7', '56080', '110094', '18'), +('11', '98', '7', '56040', '109454', '18'), +('11', '98', '7', '104425', '95520', '18'), +('11', '98', '7', '54848', '70281', '18'), +('11', '98', '9', '67098', '179986', '18'), +('11', '98', '9', '104834', '121701', '18'), +('11', '98', '9', '56070', '106450', '18'), +('11', '98', '9', '56031', '106399', '18'), +('11', '98', '15', '111349', '179294', '18'), +('11', '98', '15', '111344', '177521', '18'), +('11', '98', '15', '111340', '177079', '18'), +('11', '98', '15', '111346', '176874', '18'), +('11', '98', '20', '128733', '227282', '18'), +('11', '98', '20', '111356', '177413', '18'), +('11', '98', '20', '111352', '176399', '18'), +('11', '98', '20', '111351', '173934', '18'), +('11', '98', '12', '56035', '108445', '18'), +('11', '98', '12', '56074', '107225', '18'), +('11', '98', '12', '104422', '93430', '18'), +('11', '98', '12', '49656', '70159', '18'), +('11', '98', '18', '56041', '114238', '18'), +('11', '98', '18', '62986', '112362', '18'), +('11', '98', '18', '104426', '97201', '18'), +('11', '98', '18', '54851', '71511', '18'), +('11', '98', '19', '81763', '110917', '18'), +('11', '98', '19', '62990', '110752', '18'), +('11', '98', '19', '56075', '110131', '18'), +('11', '98', '19', '56037', '110040', '18'), +('11', '98', '13', '111521', '183175', '18'), +('11', '98', '13', '111524', '173823', '18'), +('11', '98', '13', '111519', '173802', '18'), +('11', '98', '13', '111221', '162329', '18'), +('11', '98', '14', '111537', '177412', '18'), +('11', '98', '14', '111535', '175177', '18'), +('11', '98', '14', '111237', '155560', '18'), +('11', '98', '14', '111235', '153425', '18'), +('11', '98', '11', '111335', '176429', '18'), +('11', '98', '11', '111337', '176309', '18'), +('11', '98', '11', '111338', '172822', '18'), +('11', '98', '11', '111034', '154678', '18'), +('11', '99', '22', '12425', '0', '18'), +('11', '99', '22', '21807', '0', '18'), +('11', '99', '22', '39342', '0', '18'), +('11', '99', '22', '23597', '0', '18'), +('11', '99', '1', '128691', '229903', '18'), +('11', '99', '1', '111311', '178936', '18'), +('11', '99', '1', '111307', '176843', '18'), +('11', '99', '1', '111306', '176626', '18'), +('11', '99', '2', '62985', '109978', '18'), +('11', '99', '2', '94056', '109896', '18'), +('11', '99', '2', '104424', '96123', '18'), +('11', '99', '2', '54845', '71144', '18'), +('11', '99', '3', '111314', '177323', '18'), +('11', '99', '3', '111316', '175548', '18'), +('11', '99', '3', '111315', '174664', '18'), +('11', '99', '3', '111013', '155473', '18'), +('11', '99', '5', '111319', '176839', '18'), +('11', '99', '5', '111321', '176022', '18'), +('11', '99', '5', '111318', '174097', '18'), +('11', '99', '5', '111018', '154988', '18'), +('11', '99', '8', '111332', '177414', '18'), +('11', '99', '8', '111329', '176408', '18'), +('11', '99', '8', '111331', '172805', '18'), +('11', '99', '8', '111031', '155663', '18'), +('11', '99', '6', '111323', '177269', '18'), +('11', '99', '6', '111326', '175825', '18'), +('11', '99', '6', '111325', '175737', '18'), +('11', '99', '6', '111022', '155419', '18'), +('11', '99', '17', '56043', '117752', '18'), +('11', '99', '17', '56084', '114339', '18'), +('11', '99', '17', '104427', '99745', '18'), +('11', '99', '17', '54854', '75164', '18'), +('11', '99', '7', '56080', '110101', '18'), +('11', '99', '7', '56040', '109464', '18'), +('11', '99', '7', '104425', '95526', '18'), +('11', '99', '7', '54848', '70287', '18'), +('11', '99', '9', '67098', '179990', '18'), +('11', '99', '9', '104834', '121707', '18'), +('11', '99', '9', '56070', '106456', '18'), +('11', '99', '9', '56031', '106409', '18'), +('11', '99', '15', '111349', '179302', '18'), +('11', '99', '15', '111344', '177525', '18'), +('11', '99', '15', '111340', '177085', '18'), +('11', '99', '15', '111346', '176880', '18'), +('11', '99', '20', '128733', '227288', '18'), +('11', '99', '20', '111356', '177419', '18'), +('11', '99', '20', '111352', '176404', '18'), +('11', '99', '20', '111351', '173941', '18'), +('11', '99', '12', '56035', '108454', '18'), +('11', '99', '12', '56074', '107231', '18'), +('11', '99', '12', '104422', '93438', '18'), +('11', '99', '12', '49656', '70160', '18'), +('11', '99', '18', '56041', '114247', '18'), +('11', '99', '18', '62986', '112367', '18'), +('11', '99', '18', '104426', '97203', '18'), +('11', '99', '18', '54851', '71515', '18'), +('11', '99', '19', '81763', '110927', '18'), +('11', '99', '19', '62990', '110760', '18'), +('11', '99', '19', '56075', '110136', '18'), +('11', '99', '19', '56037', '110042', '18'), +('11', '99', '13', '111521', '183180', '18'), +('11', '99', '13', '111524', '173829', '18'), +('11', '99', '13', '111519', '173810', '18'), +('11', '99', '13', '111221', '162335', '18'), +('11', '99', '14', '111537', '177417', '18'), +('11', '99', '14', '111535', '175181', '18'), +('11', '99', '14', '111237', '155565', '18'), +('11', '99', '14', '111235', '153429', '18'), +('11', '99', '11', '111335', '176434', '18'), +('11', '99', '11', '111337', '176315', '18'), +('11', '99', '11', '111338', '172829', '18'), +('11', '99', '11', '111034', '154684', '18'), +('11', '100', '22', '12425', '0', '20'), +('11', '100', '22', '21807', '0', '20'), +('11', '100', '22', '39342', '0', '20'), +('11', '100', '22', '23597', '0', '20'), +('11', '100', '1', '98769', '284382', '20'), +('11', '100', '1', '128691', '229909', '20'), +('11', '100', '1', '111311', '178940', '20'), +('11', '100', '1', '111307', '176852', '20'), +('11', '100', '2', '62985', '109982', '20'), +('11', '100', '2', '94056', '109899', '20'), +('11', '100', '2', '104424', '96131', '20'), +('11', '100', '2', '54845', '71150', '20'), +('11', '100', '3', '111314', '177330', '20'), +('11', '100', '3', '111316', '175554', '20'), +('11', '100', '3', '111315', '174670', '20'), +('11', '100', '3', '111013', '155479', '20'), +('11', '100', '5', '111319', '176846', '20'), +('11', '100', '5', '111321', '176027', '20'), +('11', '100', '5', '111318', '174105', '20'), +('11', '100', '5', '111018', '154995', '20'), +('11', '100', '8', '111332', '177420', '20'), +('11', '100', '8', '111329', '176415', '20'), +('11', '100', '8', '111331', '172811', '20'), +('11', '100', '8', '111031', '155670', '20'), +('11', '100', '6', '111323', '177275', '20'), +('11', '100', '6', '111326', '175833', '20'), +('11', '100', '6', '111325', '175741', '20'), +('11', '100', '6', '111022', '155425', '20'), +('11', '100', '17', '56043', '117758', '20'), +('11', '100', '17', '56084', '114345', '20'), +('11', '100', '17', '104427', '99752', '20'), +('11', '100', '17', '54854', '75169', '20'), +('11', '100', '7', '56080', '110108', '20'), +('11', '100', '7', '56040', '109474', '20'), +('11', '100', '7', '104425', '95531', '20'), +('11', '100', '7', '54848', '70293', '20'), +('11', '100', '9', '67098', '179994', '20'), +('11', '100', '9', '104834', '121713', '20'), +('11', '100', '9', '56070', '106461', '20'), +('11', '100', '9', '56031', '106419', '20'), +('11', '100', '15', '111349', '179311', '20'), +('11', '100', '15', '111344', '177530', '20'), +('11', '100', '15', '111340', '177090', '20'), +('11', '100', '15', '111346', '176886', '20'), +('11', '100', '20', '128733', '227294', '20'), +('11', '100', '20', '111356', '177426', '20'), +('11', '100', '20', '111352', '176409', '20'), +('11', '100', '20', '111351', '173949', '20'), +('11', '100', '12', '56035', '108464', '20'), +('11', '100', '12', '56074', '107237', '20'), +('11', '100', '12', '104422', '93446', '20'), +('11', '100', '12', '49656', '70161', '20'), +('11', '100', '18', '56041', '114255', '20'), +('11', '100', '18', '62986', '112372', '20'), +('11', '100', '18', '104426', '97205', '20'), +('11', '100', '18', '54851', '71520', '20'), +('11', '100', '19', '81763', '110937', '20'), +('11', '100', '19', '62990', '110767', '20'), +('11', '100', '19', '56075', '110140', '20'), +('11', '100', '19', '56037', '110045', '20'), +('11', '100', '13', '111521', '183186', '20'), +('11', '100', '13', '111524', '173837', '20'), +('11', '100', '13', '111519', '173817', '20'), +('11', '100', '13', '111221', '162341', '20'), +('11', '100', '14', '111537', '177422', '20'), +('11', '100', '14', '111535', '175185', '20'), +('11', '100', '14', '111237', '155571', '20'), +('11', '100', '14', '111235', '153433', '20'), +('11', '100', '11', '133816', '229826', '20'), +('11', '100', '11', '111335', '176440', '20'), +('11', '100', '11', '111337', '176321', '20'), +('11', '100', '11', '111338', '172835', '20'), +('11', '100', '22', '12425', '0', '19'), +('11', '100', '22', '21807', '0', '19'), +('11', '100', '22', '39342', '0', '19'), +('11', '100', '22', '23597', '0', '19'), +('11', '100', '1', '98769', '284382', '19'), +('11', '100', '1', '128691', '229909', '19'), +('11', '100', '1', '111311', '178940', '19'), +('11', '100', '1', '111307', '176852', '19'), +('11', '100', '2', '62985', '109982', '19'), +('11', '100', '2', '94056', '109899', '19'), +('11', '100', '2', '104424', '96131', '19'), +('11', '100', '2', '54845', '71150', '19'), +('11', '100', '3', '111314', '177330', '19'), +('11', '100', '3', '111316', '175554', '19'), +('11', '100', '3', '111315', '174670', '19'), +('11', '100', '3', '111013', '155479', '19'), +('11', '100', '5', '111319', '176846', '19'), +('11', '100', '5', '111321', '176027', '19'), +('11', '100', '5', '111318', '174105', '19'), +('11', '100', '5', '111018', '154995', '19'), +('11', '100', '8', '111332', '177420', '19'), +('11', '100', '8', '111329', '176415', '19'), +('11', '100', '8', '111331', '172811', '19'), +('11', '100', '8', '111031', '155670', '19'), +('11', '100', '6', '111323', '177275', '19'), +('11', '100', '6', '111326', '175833', '19'), +('11', '100', '6', '111325', '175741', '19'), +('11', '100', '6', '111022', '155425', '19'), +('11', '100', '17', '56043', '117758', '19'), +('11', '100', '17', '56084', '114345', '19'), +('11', '100', '17', '104427', '99752', '19'), +('11', '100', '17', '54854', '75169', '19'), +('11', '100', '7', '56080', '110108', '19'), +('11', '100', '7', '56040', '109474', '19'), +('11', '100', '7', '104425', '95531', '19'), +('11', '100', '7', '54848', '70293', '19'), +('11', '100', '9', '67098', '179994', '19'), +('11', '100', '9', '104834', '121713', '19'), +('11', '100', '9', '56070', '106461', '19'), +('11', '100', '9', '56031', '106419', '19'), +('11', '100', '15', '111349', '179311', '19'), +('11', '100', '15', '111344', '177530', '19'), +('11', '100', '15', '111340', '177090', '19'), +('11', '100', '15', '111346', '176886', '19'), +('11', '100', '20', '128733', '227294', '19'), +('11', '100', '20', '111356', '177426', '19'), +('11', '100', '20', '111352', '176409', '19'), +('11', '100', '20', '111351', '173949', '19'), +('11', '100', '12', '56035', '108464', '19'), +('11', '100', '12', '56074', '107237', '19'), +('11', '100', '12', '104422', '93446', '19'), +('11', '100', '12', '49656', '70161', '19'), +('11', '100', '18', '56041', '114255', '19'), +('11', '100', '18', '62986', '112372', '19'), +('11', '100', '18', '104426', '97205', '19'), +('11', '100', '18', '54851', '71520', '19'), +('11', '100', '19', '81763', '110937', '19'), +('11', '100', '19', '62990', '110767', '19'), +('11', '100', '19', '56075', '110140', '19'), +('11', '100', '19', '56037', '110045', '19'), +('11', '100', '13', '111521', '183185', '19'), +('11', '100', '13', '111524', '173836', '19'), +('11', '100', '13', '111519', '173817', '19'), +('11', '100', '13', '111221', '162341', '19'), +('11', '100', '14', '111537', '177422', '19'), +('11', '100', '14', '111535', '175185', '19'), +('11', '100', '14', '111237', '155571', '19'), +('11', '100', '14', '111235', '153433', '19'), +('11', '100', '11', '133816', '229826', '19'), +('11', '100', '11', '111335', '176440', '19'), +('11', '100', '11', '111337', '176321', '19'), +('11', '100', '11', '111338', '172835', '19'), +('11', '101', '22', '12425', '0', '20'), +('11', '101', '22', '21807', '0', '20'), +('11', '101', '22', '39342', '0', '20'), +('11', '101', '22', '23597', '0', '20'), +('11', '101', '1', '98769', '284386', '20'), +('11', '101', '1', '128691', '229915', '20'), +('11', '101', '1', '111311', '178944', '20'), +('11', '101', '1', '111307', '176860', '20'), +('11', '101', '2', '62985', '109986', '20'), +('11', '101', '2', '94056', '109903', '20'), +('11', '101', '2', '104424', '96139', '20'), +('11', '101', '2', '54845', '71156', '20'), +('11', '101', '3', '111314', '177337', '20'), +('11', '101', '3', '111316', '175560', '20'), +('11', '101', '3', '111315', '174676', '20'), +('11', '101', '3', '111013', '155486', '20'), +('11', '101', '5', '111319', '176853', '20'), +('11', '101', '5', '111321', '176032', '20'), +('11', '101', '5', '111318', '174112', '20'), +('11', '101', '5', '111018', '155002', '20'), +('11', '101', '8', '111332', '177427', '20'), +('11', '101', '8', '111329', '176423', '20'), +('11', '101', '8', '111331', '172816', '20'), +('11', '101', '8', '111031', '155677', '20'), +('11', '101', '6', '111323', '177281', '20'), +('11', '101', '6', '111326', '175840', '20'), +('11', '101', '6', '111325', '175746', '20'), +('11', '101', '6', '111022', '155430', '20'), +('11', '101', '17', '56043', '117763', '20'), +('11', '101', '17', '56084', '114351', '20'), +('11', '101', '17', '104427', '99758', '20'), +('11', '101', '17', '54854', '75174', '20'), +('11', '101', '7', '56080', '110115', '20'), +('11', '101', '7', '56040', '109484', '20'), +('11', '101', '7', '104425', '95537', '20'), +('11', '101', '7', '54848', '70299', '20'), +('11', '101', '9', '67098', '179999', '20'), +('11', '101', '9', '104834', '121720', '20'), +('11', '101', '9', '56070', '106466', '20'), +('11', '101', '9', '56031', '106429', '20'), +('11', '101', '15', '111349', '179319', '20'), +('11', '101', '15', '111344', '177535', '20'), +('11', '101', '15', '111340', '177096', '20'), +('11', '101', '15', '111346', '176891', '20'), +('11', '101', '20', '128733', '227299', '20'), +('11', '101', '20', '111356', '177432', '20'), +('11', '101', '20', '111352', '176415', '20'), +('11', '101', '20', '111351', '173956', '20'), +('11', '101', '12', '56035', '108473', '20'), +('11', '101', '12', '56074', '107243', '20'), +('11', '101', '12', '104422', '93454', '20'), +('11', '101', '12', '49656', '70162', '20'), +('11', '101', '18', '56041', '114264', '20'), +('11', '101', '18', '62986', '112377', '20'), +('11', '101', '18', '104426', '97207', '20'), +('11', '101', '18', '54851', '71524', '20'), +('11', '101', '19', '81763', '110946', '20'), +('11', '101', '19', '62990', '110775', '20'), +('11', '101', '19', '56075', '110145', '20'), +('11', '101', '19', '56037', '110047', '20'), +('11', '101', '13', '111521', '183191', '20'), +('11', '101', '13', '111524', '173843', '20'), +('11', '101', '13', '111519', '173825', '20'), +('11', '101', '13', '111221', '162347', '20'), +('11', '101', '14', '111537', '177427', '20'), +('11', '101', '14', '111535', '175189', '20'), +('11', '101', '14', '111237', '155576', '20'), +('11', '101', '14', '111235', '153437', '20'), +('11', '101', '11', '133816', '229830', '20'), +('11', '101', '11', '111335', '176446', '20'), +('11', '101', '11', '111337', '176327', '20'), +('11', '101', '11', '111338', '172841', '20'), +('11', '102', '22', '12425', '0', '20'), +('11', '102', '22', '21807', '0', '20'), +('11', '102', '22', '39342', '0', '20'), +('11', '102', '22', '23597', '0', '20'), +('11', '102', '1', '98769', '284390', '20'), +('11', '102', '1', '128691', '229922', '20'), +('11', '102', '1', '111311', '178948', '20'), +('11', '102', '1', '111307', '176868', '20'), +('11', '102', '2', '62985', '109990', '20'), +('11', '102', '2', '94056', '109906', '20'), +('11', '102', '2', '104424', '96147', '20'), +('11', '102', '2', '54845', '71161', '20'), +('11', '102', '3', '111314', '177343', '20'), +('11', '102', '3', '111316', '175566', '20'), +('11', '102', '3', '111315', '174682', '20'), +('11', '102', '3', '111013', '155492', '20'), +('11', '102', '5', '111319', '176860', '20'), +('11', '102', '5', '111321', '176037', '20'), +('11', '102', '5', '111318', '174120', '20'), +('11', '102', '5', '111018', '155010', '20'), +('11', '102', '8', '111332', '177434', '20'), +('11', '102', '8', '111329', '176430', '20'), +('11', '102', '8', '111331', '172821', '20'), +('11', '102', '8', '111031', '155683', '20'), +('11', '102', '6', '111323', '177287', '20'), +('11', '102', '6', '111326', '175848', '20'), +('11', '102', '6', '111325', '175751', '20'), +('11', '102', '6', '111022', '155436', '20'), +('11', '102', '17', '56043', '117769', '20'), +('11', '102', '17', '56084', '114358', '20'), +('11', '102', '17', '104427', '99764', '20'), +('11', '102', '17', '54854', '75178', '20'), +('11', '102', '7', '56080', '110122', '20'), +('11', '102', '7', '56040', '109494', '20'), +('11', '102', '7', '104425', '95542', '20'), +('11', '102', '7', '54848', '70305', '20'), +('11', '102', '9', '67098', '180003', '20'), +('11', '102', '9', '104834', '121726', '20'), +('11', '102', '9', '56070', '106471', '20'), +('11', '102', '9', '56031', '106440', '20'), +('11', '102', '15', '111349', '179327', '20'), +('11', '102', '15', '111344', '177540', '20'), +('11', '102', '15', '111340', '177101', '20'), +('11', '102', '15', '111346', '176897', '20'), +('11', '102', '20', '128733', '227305', '20'), +('11', '102', '20', '111356', '177438', '20'), +('11', '102', '20', '111352', '176420', '20'), +('11', '102', '20', '111351', '173964', '20'), +('11', '102', '12', '56035', '108483', '20'), +('11', '102', '12', '56074', '107249', '20'), +('11', '102', '12', '104422', '93461', '20'), +('11', '102', '12', '49656', '70163', '20'), +('11', '102', '18', '56041', '114272', '20'), +('11', '102', '18', '62986', '112382', '20'), +('11', '102', '18', '104426', '97209', '20'), +('11', '102', '18', '54851', '71528', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '102', '19', '81763', '110956', '20'), +('11', '102', '19', '62990', '110782', '20'), +('11', '102', '19', '56075', '110150', '20'), +('11', '102', '19', '56037', '110050', '20'), +('11', '102', '13', '111521', '183197', '20'), +('11', '102', '13', '111524', '173850', '20'), +('11', '102', '13', '111519', '173832', '20'), +('11', '102', '13', '111221', '162353', '20'), +('11', '102', '14', '111537', '177432', '20'), +('11', '102', '14', '111535', '175193', '20'), +('11', '102', '14', '111237', '155581', '20'), +('11', '102', '14', '111235', '153441', '20'), +('11', '102', '11', '133816', '229834', '20'), +('11', '102', '11', '111335', '176452', '20'), +('11', '102', '11', '111337', '176333', '20'), +('11', '102', '11', '111338', '172847', '20'), +('11', '103', '22', '12425', '0', '20'), +('11', '103', '22', '21807', '0', '20'), +('11', '103', '22', '39342', '0', '20'), +('11', '103', '22', '23597', '0', '20'), +('11', '103', '1', '98769', '284395', '20'), +('11', '103', '1', '128691', '229928', '20'), +('11', '103', '1', '111311', '178952', '20'), +('11', '103', '1', '111307', '176876', '20'), +('11', '103', '2', '62985', '109994', '20'), +('11', '103', '2', '94056', '109909', '20'), +('11', '103', '2', '104424', '96155', '20'), +('11', '103', '2', '54845', '71167', '20'), +('11', '103', '3', '111314', '177350', '20'), +('11', '103', '3', '111316', '175572', '20'), +('11', '103', '3', '111315', '174688', '20'), +('11', '103', '3', '111013', '155499', '20'), +('11', '103', '5', '111319', '176867', '20'), +('11', '103', '5', '111321', '176043', '20'), +('11', '103', '5', '111318', '174127', '20'), +('11', '103', '5', '111018', '155017', '20'), +('11', '103', '8', '111332', '177441', '20'), +('11', '103', '8', '111329', '176438', '20'), +('11', '103', '8', '111331', '172827', '20'), +('11', '103', '8', '111031', '155690', '20'), +('11', '103', '6', '111323', '177292', '20'), +('11', '103', '6', '111326', '175856', '20'), +('11', '103', '6', '111325', '175756', '20'), +('11', '103', '6', '111022', '155442', '20'), +('11', '103', '17', '56043', '117774', '20'), +('11', '103', '17', '56084', '114364', '20'), +('11', '103', '17', '104427', '99770', '20'), +('11', '103', '17', '54854', '75183', '20'), +('11', '103', '7', '56080', '110129', '20'), +('11', '103', '7', '56040', '109505', '20'), +('11', '103', '7', '104425', '95548', '20'), +('11', '103', '7', '54848', '70311', '20'), +('11', '103', '9', '67098', '180007', '20'), +('11', '103', '9', '104834', '121732', '20'), +('11', '103', '9', '56070', '106477', '20'), +('11', '103', '9', '56031', '106450', '20'), +('11', '103', '15', '111349', '179335', '20'), +('11', '103', '15', '111344', '177544', '20'), +('11', '103', '15', '111340', '177107', '20'), +('11', '103', '15', '111346', '176903', '20'), +('11', '103', '20', '128733', '227311', '20'), +('11', '103', '20', '111356', '177444', '20'), +('11', '103', '20', '111352', '176425', '20'), +('11', '103', '20', '111351', '173971', '20'), +('11', '103', '12', '56035', '108492', '20'), +('11', '103', '12', '56074', '107255', '20'), +('11', '103', '12', '104422', '93469', '20'), +('11', '103', '12', '49656', '70164', '20'), +('11', '103', '18', '56041', '114281', '20'), +('11', '103', '18', '62986', '112387', '20'), +('11', '103', '18', '104426', '97211', '20'), +('11', '103', '18', '54851', '71532', '20'), +('11', '103', '19', '81763', '110966', '20'), +('11', '103', '19', '62990', '110790', '20'), +('11', '103', '19', '56075', '110155', '20'), +('11', '103', '19', '56037', '110052', '20'), +('11', '103', '13', '111521', '183202', '20'), +('11', '103', '13', '111524', '173856', '20'), +('11', '103', '13', '111519', '173840', '20'), +('11', '103', '13', '111221', '162359', '20'), +('11', '103', '14', '111537', '177438', '20'), +('11', '103', '14', '111535', '175197', '20'), +('11', '103', '14', '111237', '155586', '20'), +('11', '103', '14', '111235', '153445', '20'), +('11', '103', '11', '133816', '229838', '20'), +('11', '103', '11', '111335', '176458', '20'), +('11', '103', '11', '111337', '176340', '20'), +('11', '103', '11', '111338', '172853', '20'), +('11', '104', '22', '12425', '0', '20'), +('11', '104', '22', '21807', '0', '20'), +('11', '104', '22', '39342', '0', '20'), +('11', '104', '22', '23597', '0', '20'), +('11', '104', '1', '98769', '284399', '20'), +('11', '104', '1', '128691', '229935', '20'), +('11', '104', '1', '111311', '178956', '20'), +('11', '104', '1', '111307', '176884', '20'), +('11', '104', '2', '62985', '109997', '20'), +('11', '104', '2', '94056', '109913', '20'), +('11', '104', '2', '104424', '96163', '20'), +('11', '104', '2', '54845', '71173', '20'), +('11', '104', '3', '111314', '177356', '20'), +('11', '104', '3', '111316', '175578', '20'), +('11', '104', '3', '111315', '174694', '20'), +('11', '104', '3', '111013', '155506', '20'), +('11', '104', '5', '111319', '176874', '20'), +('11', '104', '5', '111321', '176048', '20'), +('11', '104', '5', '111318', '174135', '20'), +('11', '104', '5', '111018', '155024', '20'), +('11', '104', '8', '111332', '177447', '20'), +('11', '104', '8', '111329', '176446', '20'), +('11', '104', '8', '111331', '172832', '20'), +('11', '104', '8', '111031', '155697', '20'), +('11', '104', '6', '111323', '177298', '20'), +('11', '104', '6', '111326', '175864', '20'), +('11', '104', '6', '111325', '175760', '20'), +('11', '104', '6', '111022', '155448', '20'), +('11', '104', '17', '56043', '117780', '20'), +('11', '104', '17', '56084', '114370', '20'), +('11', '104', '17', '104427', '99776', '20'), +('11', '104', '17', '54854', '75188', '20'), +('11', '104', '7', '56080', '110136', '20'), +('11', '104', '7', '56040', '109515', '20'), +('11', '104', '7', '104425', '95553', '20'), +('11', '104', '7', '54848', '70317', '20'), +('11', '104', '9', '67098', '180012', '20'), +('11', '104', '9', '104834', '121738', '20'), +('11', '104', '9', '56070', '106482', '20'), +('11', '104', '9', '56031', '106460', '20'), +('11', '104', '15', '111349', '179343', '20'), +('11', '104', '15', '111344', '177549', '20'), +('11', '104', '15', '111340', '177112', '20'), +('11', '104', '15', '111346', '176909', '20'), +('11', '104', '20', '128733', '227317', '20'), +('11', '104', '20', '111356', '177450', '20'), +('11', '104', '20', '111352', '176431', '20'), +('11', '104', '20', '111351', '173979', '20'), +('11', '104', '12', '56035', '108502', '20'), +('11', '104', '12', '56074', '107261', '20'), +('11', '104', '12', '104422', '93477', '20'), +('11', '104', '12', '49656', '70164', '20'), +('11', '104', '18', '56041', '114289', '20'), +('11', '104', '18', '62986', '112392', '20'), +('11', '104', '18', '104426', '97213', '20'), +('11', '104', '18', '54851', '71536', '20'), +('11', '104', '19', '81763', '110976', '20'), +('11', '104', '19', '62990', '110797', '20'), +('11', '104', '19', '56075', '110159', '20'), +('11', '104', '19', '56037', '110055', '20'), +('11', '104', '13', '111521', '183207', '20'), +('11', '104', '13', '111524', '173863', '20'), +('11', '104', '13', '111519', '173847', '20'), +('11', '104', '13', '111221', '162365', '20'), +('11', '104', '14', '111537', '177443', '20'), +('11', '104', '14', '111535', '175201', '20'), +('11', '104', '14', '111237', '155591', '20'), +('11', '104', '14', '111235', '153449', '20'), +('11', '104', '11', '133816', '229842', '20'), +('11', '104', '11', '111335', '176464', '20'), +('11', '104', '11', '111337', '176346', '20'), +('11', '104', '11', '111338', '172859', '20'), +('11', '105', '22', '12425', '0', '23'), +('11', '105', '22', '21807', '0', '23'), +('11', '105', '22', '39342', '0', '23'), +('11', '105', '22', '23597', '0', '23'), +('11', '105', '1', '98769', '284403', '23'), +('11', '105', '1', '128691', '229941', '23'), +('11', '105', '1', '111311', '178960', '23'), +('11', '105', '1', '111307', '176892', '23'), +('11', '105', '2', '62985', '110001', '23'), +('11', '105', '2', '94056', '109916', '23'), +('11', '105', '2', '104424', '96171', '23'), +('11', '105', '2', '54845', '71179', '23'), +('11', '105', '3', '111314', '177363', '23'), +('11', '105', '3', '111316', '175584', '23'), +('11', '105', '3', '111315', '174701', '23'), +('11', '105', '3', '111013', '155512', '23'), +('11', '105', '5', '111319', '176882', '23'), +('11', '105', '5', '111321', '176053', '23'), +('11', '105', '5', '111318', '174142', '23'), +('11', '105', '5', '111018', '155031', '23'), +('11', '105', '8', '111332', '177454', '23'), +('11', '105', '8', '111329', '176453', '23'), +('11', '105', '8', '111331', '172837', '23'), +('11', '105', '8', '111031', '155703', '23'), +('11', '105', '6', '111323', '177304', '23'), +('11', '105', '6', '111326', '175871', '23'), +('11', '105', '6', '111325', '175765', '23'), +('11', '105', '6', '111022', '155453', '23'), +('11', '105', '17', '56043', '117785', '23'), +('11', '105', '17', '56084', '114376', '23'), +('11', '105', '17', '104427', '99782', '23'), +('11', '105', '17', '54854', '75192', '23'), +('11', '105', '7', '56080', '110144', '23'), +('11', '105', '7', '56040', '109525', '23'), +('11', '105', '7', '104425', '95558', '23'), +('11', '105', '7', '54848', '70323', '23'), +('11', '105', '9', '67098', '180016', '23'), +('11', '105', '9', '104834', '121744', '23'), +('11', '105', '9', '56070', '106487', '23'), +('11', '105', '9', '56031', '106470', '23'), +('11', '105', '15', '111349', '179351', '23'), +('11', '105', '15', '111344', '177554', '23'), +('11', '105', '15', '111340', '177118', '23'), +('11', '105', '15', '111346', '176915', '23'), +('11', '105', '20', '128733', '227323', '23'), +('11', '105', '20', '111356', '177457', '23'), +('11', '105', '20', '111352', '176436', '23'), +('11', '105', '20', '111351', '173986', '23'), +('11', '105', '12', '56035', '108511', '23'), +('11', '105', '12', '56074', '107267', '23'), +('11', '105', '12', '104422', '93485', '23'), +('11', '105', '12', '49656', '70165', '23'), +('11', '105', '18', '56041', '114297', '23'), +('11', '105', '18', '62986', '112397', '23'), +('11', '105', '18', '104426', '97215', '23'), +('11', '105', '18', '54851', '71540', '23'), +('11', '105', '19', '81763', '110986', '23'), +('11', '105', '19', '62990', '110805', '23'), +('11', '105', '19', '56075', '110164', '23'), +('11', '105', '19', '56037', '110057', '23'), +('11', '105', '13', '111521', '183213', '23'), +('11', '105', '13', '111524', '173870', '23'), +('11', '105', '13', '111519', '173855', '23'), +('11', '105', '13', '111221', '162371', '23'), +('11', '105', '14', '111537', '177448', '23'), +('11', '105', '14', '111535', '175204', '23'), +('11', '105', '14', '111237', '155596', '23'), +('11', '105', '14', '111235', '153453', '23'), +('11', '105', '11', '133816', '229846', '23'), +('11', '105', '11', '111335', '176470', '23'), +('11', '105', '11', '111337', '176352', '23'), +('11', '105', '11', '111338', '172865', '23'), +('11', '105', '22', '12425', '0', '22'), +('11', '105', '22', '21807', '0', '22'), +('11', '105', '22', '39342', '0', '22'), +('11', '105', '22', '23597', '0', '22'), +('11', '105', '1', '98769', '284403', '22'), +('11', '105', '1', '128691', '229941', '22'), +('11', '105', '1', '111311', '178960', '22'), +('11', '105', '1', '111307', '176892', '22'), +('11', '105', '2', '62985', '110001', '22'), +('11', '105', '2', '94056', '109916', '22'), +('11', '105', '2', '104424', '96171', '22'), +('11', '105', '2', '54845', '71179', '22'), +('11', '105', '3', '111314', '177363', '22'), +('11', '105', '3', '111316', '175584', '22'), +('11', '105', '3', '111315', '174701', '22'), +('11', '105', '3', '111013', '155512', '22'), +('11', '105', '5', '111319', '176882', '22'), +('11', '105', '5', '111321', '176053', '22'), +('11', '105', '5', '111318', '174142', '22'), +('11', '105', '5', '111018', '155031', '22'), +('11', '105', '8', '111332', '177454', '22'), +('11', '105', '8', '111329', '176453', '22'), +('11', '105', '8', '111331', '172837', '22'), +('11', '105', '8', '111031', '155703', '22'), +('11', '105', '6', '111323', '177304', '22'), +('11', '105', '6', '111326', '175871', '22'), +('11', '105', '6', '111325', '175765', '22'), +('11', '105', '6', '111022', '155453', '22'), +('11', '105', '17', '56043', '117785', '22'), +('11', '105', '17', '56084', '114376', '22'), +('11', '105', '17', '104427', '99782', '22'), +('11', '105', '17', '54854', '75192', '22'), +('11', '105', '7', '56080', '110144', '22'), +('11', '105', '7', '56040', '109525', '22'), +('11', '105', '7', '104425', '95558', '22'), +('11', '105', '7', '54848', '70323', '22'), +('11', '105', '9', '67098', '180016', '22'), +('11', '105', '9', '104834', '121744', '22'), +('11', '105', '9', '56070', '106487', '22'), +('11', '105', '9', '56031', '106470', '22'), +('11', '105', '15', '111349', '179351', '22'), +('11', '105', '15', '111344', '177554', '22'), +('11', '105', '15', '111340', '177118', '22'), +('11', '105', '15', '111346', '176915', '22'), +('11', '105', '20', '128733', '227323', '22'), +('11', '105', '20', '111356', '177457', '22'), +('11', '105', '20', '111352', '176436', '22'), +('11', '105', '20', '111351', '173986', '22'), +('11', '105', '12', '56035', '108511', '22'), +('11', '105', '12', '56074', '107267', '22'), +('11', '105', '12', '104422', '93485', '22'), +('11', '105', '12', '49656', '70165', '22'), +('11', '105', '18', '56041', '114297', '22'), +('11', '105', '18', '62986', '112397', '22'), +('11', '105', '18', '104426', '97215', '22'), +('11', '105', '18', '54851', '71540', '22'), +('11', '105', '19', '81763', '110986', '22'), +('11', '105', '19', '62990', '110805', '22'), +('11', '105', '19', '56075', '110164', '22'), +('11', '105', '19', '56037', '110057', '22'), +('11', '105', '13', '111521', '183213', '22'), +('11', '105', '13', '111524', '173870', '22'), +('11', '105', '13', '111519', '173855', '22'), +('11', '105', '13', '111221', '162371', '22'), +('11', '105', '14', '111537', '177448', '22'), +('11', '105', '14', '111535', '175204', '22'), +('11', '105', '14', '111237', '155596', '22'), +('11', '105', '14', '111235', '153453', '22'), +('11', '105', '11', '133816', '229846', '22'), +('11', '105', '11', '111335', '176470', '22'), +('11', '105', '11', '111337', '176352', '22'), +('11', '105', '11', '111338', '172865', '22'), +('11', '105', '22', '12425', '0', '21'), +('11', '105', '22', '21807', '0', '21'), +('11', '105', '22', '39342', '0', '21'), +('11', '105', '22', '23597', '0', '21'), +('11', '105', '1', '98769', '284403', '21'), +('11', '105', '1', '128691', '229941', '21'), +('11', '105', '1', '111311', '178960', '21'), +('11', '105', '1', '111307', '176892', '21'), +('11', '105', '2', '62985', '110001', '21'), +('11', '105', '2', '94056', '109916', '21'), +('11', '105', '2', '104424', '96171', '21'), +('11', '105', '2', '54845', '71179', '21'), +('11', '105', '3', '111314', '177363', '21'), +('11', '105', '3', '111316', '175584', '21'), +('11', '105', '3', '111315', '174701', '21'), +('11', '105', '3', '111013', '155512', '21'), +('11', '105', '5', '111319', '176882', '21'), +('11', '105', '5', '111321', '176053', '21'), +('11', '105', '5', '111318', '174142', '21'), +('11', '105', '5', '111018', '155031', '21'), +('11', '105', '8', '111332', '177454', '21'), +('11', '105', '8', '111329', '176453', '21'), +('11', '105', '8', '111331', '172837', '21'), +('11', '105', '8', '111031', '155703', '21'), +('11', '105', '6', '111323', '177304', '21'), +('11', '105', '6', '111326', '175871', '21'), +('11', '105', '6', '111325', '175765', '21'), +('11', '105', '6', '111022', '155453', '21'), +('11', '105', '17', '56043', '117785', '21'), +('11', '105', '17', '56084', '114376', '21'), +('11', '105', '17', '104427', '99782', '21'), +('11', '105', '17', '54854', '75192', '21'), +('11', '105', '7', '56080', '110144', '21'), +('11', '105', '7', '56040', '109525', '21'), +('11', '105', '7', '104425', '95558', '21'), +('11', '105', '7', '54848', '70323', '21'), +('11', '105', '9', '67098', '180016', '21'), +('11', '105', '9', '104834', '121744', '21'), +('11', '105', '9', '56070', '106487', '21'), +('11', '105', '9', '56031', '106470', '21'), +('11', '105', '15', '111349', '179351', '21'), +('11', '105', '15', '111344', '177554', '21'), +('11', '105', '15', '111340', '177118', '21'), +('11', '105', '15', '111346', '176915', '21'), +('11', '105', '20', '128733', '227323', '21'), +('11', '105', '20', '111356', '177457', '21'), +('11', '105', '20', '111352', '176436', '21'), +('11', '105', '20', '111351', '173986', '21'), +('11', '105', '12', '56035', '108511', '21'), +('11', '105', '12', '56074', '107267', '21'), +('11', '105', '12', '104422', '93485', '21'), +('11', '105', '12', '49656', '70165', '21'), +('11', '105', '18', '56041', '114297', '21'), +('11', '105', '18', '62986', '112397', '21'), +('11', '105', '18', '104426', '97215', '21'), +('11', '105', '18', '54851', '71540', '21'), +('11', '105', '19', '81763', '110986', '21'), +('11', '105', '19', '62990', '110805', '21'), +('11', '105', '19', '56075', '110164', '21'), +('11', '105', '19', '56037', '110057', '21'), +('11', '105', '13', '111521', '183213', '21'), +('11', '105', '13', '111524', '173870', '21'), +('11', '105', '13', '111519', '173855', '21'), +('11', '105', '13', '111221', '162371', '21'), +('11', '105', '14', '111537', '177448', '21'), +('11', '105', '14', '111535', '175204', '21'), +('11', '105', '14', '111237', '155596', '21'), +('11', '105', '14', '111235', '153453', '21'), +('11', '105', '11', '133816', '229846', '21'), +('11', '105', '11', '111335', '176470', '21'), +('11', '105', '11', '111337', '176352', '21'), +('11', '105', '11', '111338', '172865', '21'), +('11', '106', '22', '12425', '0', '23'), +('11', '106', '22', '21807', '0', '23'), +('11', '106', '22', '39342', '0', '23'), +('11', '106', '22', '23597', '0', '23'), +('11', '106', '1', '98769', '284407', '23'), +('11', '106', '1', '128691', '229948', '23'), +('11', '106', '1', '111311', '178964', '23'), +('11', '106', '1', '111307', '176901', '23'), +('11', '106', '2', '62985', '110005', '23'), +('11', '106', '2', '94056', '109919', '23'), +('11', '106', '2', '104424', '96179', '23'), +('11', '106', '2', '54845', '71185', '23'), +('11', '106', '3', '111314', '177369', '23'), +('11', '106', '3', '111316', '175590', '23'), +('11', '106', '3', '111315', '174707', '23'), +('11', '106', '3', '111013', '155519', '23'), +('11', '106', '5', '111319', '176889', '23'), +('11', '106', '5', '111321', '176058', '23'), +('11', '106', '5', '111318', '174150', '23'), +('11', '106', '5', '111018', '155038', '23'), +('11', '106', '8', '111332', '177461', '23'), +('11', '106', '8', '111329', '176461', '23'), +('11', '106', '8', '111331', '172843', '23'), +('11', '106', '8', '111031', '155710', '23'), +('11', '106', '6', '111323', '177310', '23'), +('11', '106', '6', '111326', '175879', '23'), +('11', '106', '6', '111325', '175770', '23'), +('11', '106', '6', '111022', '155459', '23'), +('11', '106', '17', '56043', '117791', '23'), +('11', '106', '17', '56084', '114382', '23'), +('11', '106', '17', '104427', '99789', '23'), +('11', '106', '17', '54854', '75197', '23'), +('11', '106', '7', '56080', '110151', '23'), +('11', '106', '7', '56040', '109535', '23'), +('11', '106', '7', '104425', '95564', '23'), +('11', '106', '7', '54848', '70330', '23'), +('11', '106', '9', '67098', '180020', '23'), +('11', '106', '9', '104834', '121750', '23'), +('11', '106', '9', '56070', '106492', '23'), +('11', '106', '9', '56031', '106480', '23'), +('11', '106', '15', '111349', '179359', '23'), +('11', '106', '15', '111344', '177558', '23'), +('11', '106', '15', '111340', '177123', '23'), +('11', '106', '15', '111346', '176921', '23'), +('11', '106', '20', '128733', '227329', '23'), +('11', '106', '20', '111356', '177463', '23'), +('11', '106', '20', '111352', '176441', '23'), +('11', '106', '20', '111351', '173994', '23'), +('11', '106', '12', '56035', '108521', '23'), +('11', '106', '12', '56074', '107273', '23'), +('11', '106', '12', '104422', '93493', '23'), +('11', '106', '12', '49656', '70166', '23'), +('11', '106', '18', '56041', '114306', '23'), +('11', '106', '18', '62986', '112402', '23'), +('11', '106', '18', '104426', '97217', '23'), +('11', '106', '18', '54851', '71544', '23'), +('11', '106', '19', '81763', '110996', '23'), +('11', '106', '19', '62990', '110812', '23'), +('11', '106', '19', '56075', '110169', '23'), +('11', '106', '19', '56037', '110060', '23'), +('11', '106', '13', '111521', '183218', '23'), +('11', '106', '13', '111524', '173876', '23'), +('11', '106', '13', '111519', '173862', '23'), +('11', '106', '13', '111221', '162377', '23'), +('11', '106', '14', '111537', '177453', '23'), +('11', '106', '14', '111535', '175208', '23'), +('11', '106', '14', '111237', '155601', '23'), +('11', '106', '14', '111235', '153457', '23'), +('11', '106', '11', '133816', '229850', '23'), +('11', '106', '11', '111335', '176476', '23'), +('11', '106', '11', '111337', '176358', '23'), +('11', '106', '11', '111338', '172872', '23'), +('11', '107', '22', '12425', '0', '23'), +('11', '107', '22', '21807', '0', '23'), +('11', '107', '22', '39342', '0', '23'), +('11', '107', '22', '23597', '0', '23'), +('11', '107', '1', '98769', '284412', '23'), +('11', '107', '1', '128691', '229954', '23'), +('11', '107', '1', '111311', '178969', '23'), +('11', '107', '1', '111307', '176909', '23'), +('11', '107', '2', '62985', '110009', '23'), +('11', '107', '2', '94056', '109922', '23'), +('11', '107', '2', '104424', '96187', '23'), +('11', '107', '2', '54845', '71191', '23'), +('11', '107', '3', '111314', '177376', '23'), +('11', '107', '3', '111316', '175597', '23'), +('11', '107', '3', '111315', '174713', '23'), +('11', '107', '3', '111013', '155525', '23'), +('11', '107', '5', '111319', '176896', '23'), +('11', '107', '5', '111321', '176063', '23'), +('11', '107', '5', '111318', '174157', '23'), +('11', '107', '5', '111018', '155045', '23'), +('11', '107', '8', '111332', '177467', '23'), +('11', '107', '8', '111329', '176468', '23'), +('11', '107', '8', '111331', '172848', '23'), +('11', '107', '8', '111031', '155717', '23'), +('11', '107', '6', '111323', '177315', '23'), +('11', '107', '6', '111326', '175887', '23'), +('11', '107', '6', '111325', '175774', '23'), +('11', '107', '6', '111022', '155465', '23'), +('11', '107', '17', '56043', '117796', '23'), +('11', '107', '17', '56084', '114388', '23'), +('11', '107', '17', '104427', '99795', '23'), +('11', '107', '17', '54854', '75202', '23'), +('11', '107', '7', '56080', '110158', '23'), +('11', '107', '7', '56040', '109545', '23'), +('11', '107', '7', '104425', '95569', '23'), +('11', '107', '7', '54848', '70336', '23'), +('11', '107', '9', '67098', '180024', '23'), +('11', '107', '9', '104834', '121756', '23'), +('11', '107', '9', '56070', '106498', '23'), +('11', '107', '9', '56031', '106490', '23'), +('11', '107', '15', '111349', '179367', '23'), +('11', '107', '15', '111344', '177563', '23'), +('11', '107', '15', '111340', '177129', '23'), +('11', '107', '15', '111346', '176927', '23'), +('11', '107', '20', '128733', '227335', '23'), +('11', '107', '20', '111356', '177469', '23'), +('11', '107', '20', '111352', '176447', '23'), +('11', '107', '20', '111351', '174001', '23'), +('11', '107', '12', '56035', '108530', '23'), +('11', '107', '12', '56074', '107279', '23'), +('11', '107', '12', '104422', '93501', '23'), +('11', '107', '12', '49656', '70167', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '107', '18', '56041', '114314', '23'), +('11', '107', '18', '62986', '112407', '23'), +('11', '107', '18', '104426', '97219', '23'), +('11', '107', '18', '54851', '71548', '23'), +('11', '107', '19', '81763', '111006', '23'), +('11', '107', '19', '62990', '110820', '23'), +('11', '107', '19', '56075', '110173', '23'), +('11', '107', '19', '56037', '110062', '23'), +('11', '107', '13', '111521', '183223', '23'), +('11', '107', '13', '111524', '173883', '23'), +('11', '107', '13', '111519', '173869', '23'), +('11', '107', '13', '111221', '162383', '23'), +('11', '107', '14', '111537', '177458', '23'), +('11', '107', '14', '111535', '175212', '23'), +('11', '107', '14', '111237', '155607', '23'), +('11', '107', '14', '111235', '153461', '23'), +('11', '107', '11', '133816', '229854', '23'), +('11', '107', '11', '111335', '176482', '23'), +('11', '107', '11', '111337', '176364', '23'), +('11', '107', '11', '111338', '172878', '23'), +('11', '108', '22', '12425', '0', '23'), +('11', '108', '22', '21807', '0', '23'), +('11', '108', '22', '39342', '0', '23'), +('11', '108', '22', '23597', '0', '23'), +('11', '108', '1', '98769', '284416', '23'), +('11', '108', '1', '128691', '229961', '23'), +('11', '108', '1', '111311', '178973', '23'), +('11', '108', '1', '111307', '176917', '23'), +('11', '108', '2', '62985', '110013', '23'), +('11', '108', '2', '94056', '109926', '23'), +('11', '108', '2', '104424', '96195', '23'), +('11', '108', '2', '54845', '71197', '23'), +('11', '108', '3', '111314', '177382', '23'), +('11', '108', '3', '111316', '175603', '23'), +('11', '108', '3', '111315', '174719', '23'), +('11', '108', '3', '111013', '155532', '23'), +('11', '108', '5', '111319', '176903', '23'), +('11', '108', '5', '111321', '176068', '23'), +('11', '108', '5', '111318', '174165', '23'), +('11', '108', '5', '111018', '155052', '23'), +('11', '108', '8', '111332', '177474', '23'), +('11', '108', '8', '111329', '176476', '23'), +('11', '108', '8', '111331', '172853', '23'), +('11', '108', '8', '111031', '155723', '23'), +('11', '108', '6', '111323', '177321', '23'), +('11', '108', '6', '111326', '175894', '23'), +('11', '108', '6', '111325', '175779', '23'), +('11', '108', '6', '111022', '155471', '23'), +('11', '108', '17', '56043', '117802', '23'), +('11', '108', '17', '56084', '114395', '23'), +('11', '108', '17', '104427', '99801', '23'), +('11', '108', '17', '54854', '75206', '23'), +('11', '108', '7', '56080', '110165', '23'), +('11', '108', '7', '56040', '109555', '23'), +('11', '108', '7', '104425', '95575', '23'), +('11', '108', '7', '54848', '70342', '23'), +('11', '108', '9', '67098', '180029', '23'), +('11', '108', '9', '104834', '121762', '23'), +('11', '108', '9', '56070', '106503', '23'), +('11', '108', '9', '56031', '106500', '23'), +('11', '108', '15', '111349', '179375', '23'), +('11', '108', '15', '111344', '177568', '23'), +('11', '108', '15', '111340', '177134', '23'), +('11', '108', '15', '111346', '176933', '23'), +('11', '108', '20', '128733', '227341', '23'), +('11', '108', '20', '111356', '177475', '23'), +('11', '108', '20', '111352', '176452', '23'), +('11', '108', '20', '111351', '174009', '23'), +('11', '108', '12', '56035', '108540', '23'), +('11', '108', '12', '56074', '107285', '23'), +('11', '108', '12', '104422', '93509', '23'), +('11', '108', '12', '49656', '70168', '23'), +('11', '108', '18', '56041', '114323', '23'), +('11', '108', '18', '62986', '112412', '23'), +('11', '108', '18', '104426', '97221', '23'), +('11', '108', '18', '54851', '71552', '23'), +('11', '108', '19', '81763', '111016', '23'), +('11', '108', '19', '62990', '110827', '23'), +('11', '108', '19', '56075', '110178', '23'), +('11', '108', '19', '56037', '110065', '23'), +('11', '108', '13', '111521', '183229', '23'), +('11', '108', '13', '111524', '173890', '23'), +('11', '108', '13', '111519', '173877', '23'), +('11', '108', '13', '111221', '162389', '23'), +('11', '108', '14', '111537', '177463', '23'), +('11', '108', '14', '111535', '175216', '23'), +('11', '108', '14', '111237', '155612', '23'), +('11', '108', '14', '111235', '153465', '23'), +('11', '108', '11', '133816', '229858', '23'), +('11', '108', '11', '111335', '176488', '23'), +('11', '108', '11', '111337', '176370', '23'), +('11', '108', '11', '111338', '172884', '23'), +('11', '109', '22', '12425', '0', '23'), +('11', '109', '22', '21807', '0', '23'), +('11', '109', '22', '39342', '0', '23'), +('11', '109', '22', '23597', '0', '23'), +('11', '109', '1', '98769', '284420', '23'), +('11', '109', '1', '128691', '229967', '23'), +('11', '109', '1', '111311', '178977', '23'), +('11', '109', '1', '111307', '176925', '23'), +('11', '109', '2', '62985', '110017', '23'), +('11', '109', '2', '94056', '109929', '23'), +('11', '109', '2', '104424', '96203', '23'), +('11', '109', '2', '54845', '71203', '23'), +('11', '109', '3', '111314', '177389', '23'), +('11', '109', '3', '111316', '175609', '23'), +('11', '109', '3', '111315', '174725', '23'), +('11', '109', '3', '111013', '155538', '23'), +('11', '109', '5', '111319', '176910', '23'), +('11', '109', '5', '111321', '176073', '23'), +('11', '109', '5', '111318', '174172', '23'), +('11', '109', '5', '111018', '155060', '23'), +('11', '109', '8', '111332', '177481', '23'), +('11', '109', '8', '111329', '176483', '23'), +('11', '109', '8', '111331', '172859', '23'), +('11', '109', '8', '111031', '155730', '23'), +('11', '109', '6', '111323', '177327', '23'), +('11', '109', '6', '111326', '175902', '23'), +('11', '109', '6', '111325', '175784', '23'), +('11', '109', '6', '111022', '155476', '23'), +('11', '109', '17', '56043', '117807', '23'), +('11', '109', '17', '56084', '114401', '23'), +('11', '109', '17', '104427', '99807', '23'), +('11', '109', '17', '54854', '75211', '23'), +('11', '109', '7', '56080', '110172', '23'), +('11', '109', '7', '56040', '109565', '23'), +('11', '109', '7', '104425', '95580', '23'), +('11', '109', '7', '54848', '70348', '23'), +('11', '109', '9', '67098', '180033', '23'), +('11', '109', '9', '104834', '121768', '23'), +('11', '109', '9', '56031', '106510', '23'), +('11', '109', '9', '56070', '106508', '23'), +('11', '109', '15', '111349', '179384', '23'), +('11', '109', '15', '111344', '177573', '23'), +('11', '109', '15', '111340', '177140', '23'), +('11', '109', '15', '111346', '176939', '23'), +('11', '109', '20', '128733', '227347', '23'), +('11', '109', '20', '111356', '177481', '23'), +('11', '109', '20', '111352', '176457', '23'), +('11', '109', '20', '111351', '174016', '23'), +('11', '109', '12', '56035', '108549', '23'), +('11', '109', '12', '56074', '107291', '23'), +('11', '109', '12', '104422', '93517', '23'), +('11', '109', '12', '49656', '70168', '23'), +('11', '109', '18', '56041', '114331', '23'), +('11', '109', '18', '62986', '112417', '23'), +('11', '109', '18', '104426', '97223', '23'), +('11', '109', '18', '54851', '71557', '23'), +('11', '109', '19', '81763', '111026', '23'), +('11', '109', '19', '62990', '110835', '23'), +('11', '109', '19', '56075', '110183', '23'), +('11', '109', '19', '56037', '110067', '23'), +('11', '109', '13', '111521', '183234', '23'), +('11', '109', '13', '111524', '173896', '23'), +('11', '109', '13', '111519', '173884', '23'), +('11', '109', '13', '111221', '162395', '23'), +('11', '109', '14', '111537', '177468', '23'), +('11', '109', '14', '111535', '175220', '23'), +('11', '109', '14', '111237', '155617', '23'), +('11', '109', '14', '111235', '153469', '23'), +('11', '109', '11', '133816', '229862', '23'), +('11', '109', '11', '111335', '176493', '23'), +('11', '109', '11', '111337', '176376', '23'), +('11', '109', '11', '111338', '172890', '23'), +('11', '110', '22', '12425', '0', '25'), +('11', '110', '22', '39342', '0', '25'), +('11', '110', '22', '7867', '0', '25'), +('11', '110', '22', '53550', '0', '25'), +('11', '110', '1', '98769', '284425', '25'), +('11', '110', '1', '128691', '229973', '25'), +('11', '110', '1', '111311', '178981', '25'), +('11', '110', '1', '111307', '176933', '25'), +('11', '110', '2', '62985', '110021', '25'), +('11', '110', '2', '94056', '109932', '25'), +('11', '110', '2', '104424', '96211', '25'), +('11', '110', '2', '54845', '71208', '25'), +('11', '110', '3', '111314', '177395', '25'), +('11', '110', '3', '111316', '175615', '25'), +('11', '110', '3', '111315', '174732', '25'), +('11', '110', '3', '111013', '155545', '25'), +('11', '110', '5', '111319', '176917', '25'), +('11', '110', '5', '111321', '176078', '25'), +('11', '110', '5', '111318', '174180', '25'), +('11', '110', '5', '111018', '155067', '25'), +('11', '110', '8', '111332', '177487', '25'), +('11', '110', '8', '111329', '176491', '25'), +('11', '110', '8', '111331', '172864', '25'), +('11', '110', '8', '111031', '155737', '25'), +('11', '110', '6', '111323', '177333', '25'), +('11', '110', '6', '111326', '175910', '25'), +('11', '110', '6', '111325', '175789', '25'), +('11', '110', '6', '111022', '155482', '25'), +('11', '110', '17', '56043', '117813', '25'), +('11', '110', '17', '56084', '114407', '25'), +('11', '110', '17', '104427', '99813', '25'), +('11', '110', '17', '54854', '75216', '25'), +('11', '110', '7', '56080', '110179', '25'), +('11', '110', '7', '56040', '109576', '25'), +('11', '110', '7', '104425', '95586', '25'), +('11', '110', '7', '54848', '70354', '25'), +('11', '110', '9', '67098', '180037', '25'), +('11', '110', '9', '104834', '121774', '25'), +('11', '110', '9', '56031', '106520', '25'), +('11', '110', '9', '56070', '106514', '25'), +('11', '110', '15', '111349', '179392', '25'), +('11', '110', '15', '111344', '177577', '25'), +('11', '110', '15', '111340', '177145', '25'), +('11', '110', '15', '111346', '176945', '25'), +('11', '110', '20', '128733', '227353', '25'), +('11', '110', '20', '111356', '177488', '25'), +('11', '110', '20', '111352', '176463', '25'), +('11', '110', '20', '111351', '174024', '25'), +('11', '110', '12', '56035', '108559', '25'), +('11', '110', '12', '56074', '107297', '25'), +('11', '110', '12', '104422', '93525', '25'), +('11', '110', '12', '49656', '70169', '25'), +('11', '110', '18', '56041', '114340', '25'), +('11', '110', '18', '62986', '112422', '25'), +('11', '110', '18', '104426', '97225', '25'), +('11', '110', '18', '54851', '71561', '25'), +('11', '110', '19', '81763', '111036', '25'), +('11', '110', '19', '62990', '110842', '25'), +('11', '110', '19', '56075', '110188', '25'), +('11', '110', '19', '56037', '110070', '25'), +('11', '110', '13', '111521', '183240', '25'), +('11', '110', '13', '111524', '173903', '25'), +('11', '110', '13', '111519', '173892', '25'), +('11', '110', '13', '111221', '162401', '25'), +('11', '110', '14', '111537', '177473', '25'), +('11', '110', '14', '111535', '175224', '25'), +('11', '110', '14', '111237', '155622', '25'), +('11', '110', '14', '111235', '153473', '25'), +('11', '110', '11', '85213', '257097', '25'), +('11', '110', '11', '133816', '229867', '25'), +('11', '110', '11', '111335', '176499', '25'), +('11', '110', '11', '111337', '176382', '25'), +('11', '110', '22', '12425', '0', '24'), +('11', '110', '22', '39342', '0', '24'), +('11', '110', '22', '7867', '0', '24'), +('11', '110', '22', '53550', '0', '24'), +('11', '110', '1', '98769', '284425', '24'), +('11', '110', '1', '128691', '229973', '24'), +('11', '110', '1', '111311', '178981', '24'), +('11', '110', '1', '111307', '176933', '24'), +('11', '110', '2', '62985', '110021', '24'), +('11', '110', '2', '94056', '109932', '24'), +('11', '110', '2', '104424', '96211', '24'), +('11', '110', '2', '54845', '71208', '24'), +('11', '110', '3', '111314', '177395', '24'), +('11', '110', '3', '111316', '175615', '24'), +('11', '110', '3', '111315', '174732', '24'), +('11', '110', '3', '111013', '155545', '24'), +('11', '110', '5', '111319', '176917', '24'), +('11', '110', '5', '111321', '176078', '24'), +('11', '110', '5', '111318', '174180', '24'), +('11', '110', '5', '111018', '155067', '24'), +('11', '110', '8', '111332', '177487', '24'), +('11', '110', '8', '111329', '176491', '24'), +('11', '110', '8', '111331', '172864', '24'), +('11', '110', '8', '111031', '155737', '24'), +('11', '110', '6', '111323', '177333', '24'), +('11', '110', '6', '111326', '175910', '24'), +('11', '110', '6', '111325', '175789', '24'), +('11', '110', '6', '111022', '155482', '24'), +('11', '110', '17', '56043', '117813', '24'), +('11', '110', '17', '56084', '114407', '24'), +('11', '110', '17', '104427', '99813', '24'), +('11', '110', '17', '54854', '75216', '24'), +('11', '110', '7', '56080', '110179', '24'), +('11', '110', '7', '56040', '109576', '24'), +('11', '110', '7', '104425', '95586', '24'), +('11', '110', '7', '54848', '70354', '24'), +('11', '110', '9', '67098', '180037', '24'), +('11', '110', '9', '104834', '121774', '24'), +('11', '110', '9', '56031', '106520', '24'), +('11', '110', '9', '56070', '106514', '24'), +('11', '110', '15', '111349', '179392', '24'), +('11', '110', '15', '111344', '177577', '24'), +('11', '110', '15', '111340', '177145', '24'), +('11', '110', '15', '111346', '176945', '24'), +('11', '110', '20', '128733', '227353', '24'), +('11', '110', '20', '111356', '177488', '24'), +('11', '110', '20', '111352', '176463', '24'), +('11', '110', '20', '111351', '174024', '24'), +('11', '110', '12', '56035', '108559', '24'), +('11', '110', '12', '56074', '107297', '24'), +('11', '110', '12', '104422', '93525', '24'), +('11', '110', '12', '49656', '70169', '24'), +('11', '110', '18', '56041', '114340', '24'), +('11', '110', '18', '62986', '112422', '24'), +('11', '110', '18', '104426', '97225', '24'), +('11', '110', '18', '54851', '71561', '24'), +('11', '110', '19', '81763', '111036', '24'), +('11', '110', '19', '62990', '110842', '24'), +('11', '110', '19', '56075', '110188', '24'), +('11', '110', '19', '56037', '110070', '24'), +('11', '110', '13', '111521', '183240', '24'), +('11', '110', '13', '111524', '173903', '24'), +('11', '110', '13', '111519', '173892', '24'), +('11', '110', '13', '111221', '162401', '24'), +('11', '110', '14', '111537', '177473', '24'), +('11', '110', '14', '111535', '175224', '24'), +('11', '110', '14', '111237', '155622', '24'), +('11', '110', '14', '111235', '153473', '24'), +('11', '110', '11', '85213', '257097', '24'), +('11', '110', '11', '133816', '229867', '24'), +('11', '110', '11', '111335', '176499', '24'), +('11', '110', '11', '111337', '176382', '24'), +('11', '111', '22', '12425', '0', '25'), +('11', '111', '22', '39342', '0', '25'), +('11', '111', '22', '7867', '0', '25'), +('11', '111', '22', '53550', '0', '25'), +('11', '111', '1', '98769', '284429', '25'), +('11', '111', '1', '128691', '229980', '25'), +('11', '111', '1', '111311', '178985', '25'), +('11', '111', '1', '111307', '176941', '25'), +('11', '111', '2', '62985', '110024', '25'), +('11', '111', '2', '94056', '109936', '25'), +('11', '111', '2', '104424', '96219', '25'), +('11', '111', '2', '54845', '71214', '25'), +('11', '111', '3', '111314', '177402', '25'), +('11', '111', '3', '111316', '175621', '25'), +('11', '111', '3', '111315', '174738', '25'), +('11', '111', '3', '111013', '155551', '25'), +('11', '111', '5', '111319', '176924', '25'), +('11', '111', '5', '111321', '176084', '25'), +('11', '111', '5', '111318', '174187', '25'), +('11', '111', '5', '111018', '155074', '25'), +('11', '111', '8', '111332', '177494', '25'), +('11', '111', '8', '111329', '176498', '25'), +('11', '111', '8', '111331', '172869', '25'), +('11', '111', '8', '111031', '155743', '25'), +('11', '111', '6', '111323', '177338', '25'), +('11', '111', '6', '111326', '175918', '25'), +('11', '111', '6', '111325', '175793', '25'), +('11', '111', '6', '111022', '155488', '25'), +('11', '111', '17', '56043', '117819', '25'), +('11', '111', '17', '56084', '114413', '25'), +('11', '111', '17', '104427', '99819', '25'), +('11', '111', '17', '54854', '75220', '25'), +('11', '111', '7', '56080', '110186', '25'), +('11', '111', '7', '56040', '109586', '25'), +('11', '111', '7', '104425', '95591', '25'), +('11', '111', '7', '54848', '70360', '25'), +('11', '111', '9', '67098', '180042', '25'), +('11', '111', '9', '104834', '121780', '25'), +('11', '111', '9', '56031', '106530', '25'), +('11', '111', '9', '56070', '106519', '25'), +('11', '111', '15', '111349', '179400', '25'), +('11', '111', '15', '111344', '177582', '25'), +('11', '111', '15', '111340', '177151', '25'), +('11', '111', '15', '111346', '176951', '25'), +('11', '111', '20', '128733', '227359', '25'), +('11', '111', '20', '111356', '177494', '25'), +('11', '111', '20', '111352', '176468', '25'), +('11', '111', '20', '111351', '174031', '25'), +('11', '111', '12', '56035', '108568', '25'), +('11', '111', '12', '56074', '107304', '25'), +('11', '111', '12', '104422', '93532', '25'), +('11', '111', '12', '49656', '70170', '25'), +('11', '111', '18', '56041', '114348', '25'), +('11', '111', '18', '62986', '112427', '25'), +('11', '111', '18', '104426', '97226', '25'), +('11', '111', '18', '54851', '71565', '25'), +('11', '111', '19', '81763', '111045', '25'), +('11', '111', '19', '62990', '110850', '25'), +('11', '111', '19', '56075', '110192', '25'), +('11', '111', '19', '56037', '110072', '25'), +('11', '111', '13', '111521', '183245', '25'), +('11', '111', '13', '111524', '173910', '25'), +('11', '111', '13', '111519', '173900', '25'), +('11', '111', '13', '111221', '162407', '25'), +('11', '111', '14', '111537', '177479', '25'), +('11', '111', '14', '111535', '175228', '25'), +('11', '111', '14', '111237', '155627', '25'), +('11', '111', '14', '111235', '153477', '25'), +('11', '111', '11', '85213', '257102', '25'), +('11', '111', '11', '133816', '229871', '25'), +('11', '111', '11', '111335', '176505', '25'), +('11', '111', '11', '111337', '176388', '25'), +('11', '112', '22', '12425', '0', '25'), +('11', '112', '22', '39342', '0', '25'), +('11', '112', '22', '7867', '0', '25'), +('11', '112', '22', '53550', '0', '25'), +('11', '112', '1', '98769', '284433', '25'), +('11', '112', '1', '128691', '229986', '25'), +('11', '112', '1', '111311', '178989', '25'), +('11', '112', '1', '111307', '176950', '25'), +('11', '112', '2', '62985', '110028', '25'), +('11', '112', '2', '94056', '109939', '25'), +('11', '112', '2', '104424', '96227', '25'), +('11', '112', '2', '54845', '71220', '25'), +('11', '112', '3', '111314', '177408', '25'), +('11', '112', '3', '111316', '175627', '25'), +('11', '112', '3', '111315', '174744', '25'), +('11', '112', '3', '111013', '155558', '25'), +('11', '112', '5', '111319', '176932', '25'), +('11', '112', '5', '111321', '176089', '25'), +('11', '112', '5', '111318', '174195', '25'), +('11', '112', '5', '111018', '155081', '25'), +('11', '112', '8', '111332', '177501', '25'), +('11', '112', '8', '111329', '176506', '25'), +('11', '112', '8', '111331', '172875', '25'), +('11', '112', '8', '111031', '155750', '25'), +('11', '112', '6', '111323', '177344', '25'), +('11', '112', '6', '111326', '175925', '25'), +('11', '112', '6', '111325', '175798', '25'), +('11', '112', '6', '111022', '155493', '25'), +('11', '112', '17', '56043', '117824', '25'), +('11', '112', '17', '56084', '114419', '25'), +('11', '112', '17', '104427', '99825', '25'), +('11', '112', '17', '54854', '75225', '25'), +('11', '112', '7', '56080', '110193', '25'), +('11', '112', '7', '56040', '109596', '25'), +('11', '112', '7', '104425', '95597', '25'), +('11', '112', '7', '54848', '70366', '25'), +('11', '112', '9', '67098', '180046', '25'), +('11', '112', '9', '104834', '121786', '25'), +('11', '112', '9', '56031', '106540', '25'), +('11', '112', '9', '56070', '106524', '25'), +('11', '112', '15', '111349', '179408', '25'), +('11', '112', '15', '111344', '177587', '25'), +('11', '112', '15', '111340', '177156', '25'), +('11', '112', '15', '111346', '176957', '25'), +('11', '112', '20', '128733', '227365', '25'), +('11', '112', '20', '111356', '177500', '25'), +('11', '112', '20', '111352', '176473', '25'), +('11', '112', '20', '111351', '174039', '25'), +('11', '112', '12', '56035', '108578', '25'), +('11', '112', '12', '56074', '107310', '25'), +('11', '112', '12', '104422', '93540', '25'), +('11', '112', '12', '49656', '70171', '25'), +('11', '112', '18', '56041', '114357', '25'), +('11', '112', '18', '62986', '112432', '25'), +('11', '112', '18', '104426', '97228', '25'), +('11', '112', '18', '54851', '71569', '25'), +('11', '112', '19', '81763', '111055', '25'), +('11', '112', '19', '62990', '110857', '25'), +('11', '112', '19', '56075', '110197', '25'), +('11', '112', '19', '56037', '110075', '25'), +('11', '112', '13', '111521', '183251', '25'), +('11', '112', '13', '111524', '173917', '25'), +('11', '112', '13', '111519', '173907', '25'), +('11', '112', '13', '111221', '162413', '25'), +('11', '112', '14', '111537', '177484', '25'), +('11', '112', '14', '111535', '175232', '25'), +('11', '112', '14', '111237', '155632', '25'), +('11', '112', '14', '111235', '153481', '25'), +('11', '112', '11', '85213', '257106', '25'), +('11', '112', '11', '133816', '229875', '25'), +('11', '112', '11', '111335', '176511', '25'), +('11', '112', '11', '111337', '176395', '25'), +('11', '113', '22', '12425', '0', '25'), +('11', '113', '22', '39342', '0', '25'), +('11', '113', '22', '7867', '0', '25'), +('11', '113', '22', '53550', '0', '25'), +('11', '113', '1', '98769', '284437', '25'), +('11', '113', '1', '128691', '229993', '25'), +('11', '113', '1', '111311', '178993', '25'), +('11', '113', '1', '111307', '176958', '25'), +('11', '113', '2', '62985', '110032', '25'), +('11', '113', '2', '94056', '109942', '25'), +('11', '113', '2', '104424', '96235', '25'), +('11', '113', '2', '54845', '71226', '25'), +('11', '113', '3', '111314', '177415', '25'), +('11', '113', '3', '111316', '175633', '25'), +('11', '113', '3', '111315', '174750', '25'), +('11', '113', '3', '111013', '155564', '25'), +('11', '113', '5', '111319', '176939', '25'), +('11', '113', '5', '111321', '176094', '25'), +('11', '113', '5', '111318', '174202', '25'), +('11', '113', '5', '111018', '155088', '25'), +('11', '113', '8', '111332', '177507', '25'), +('11', '113', '8', '111329', '176513', '25'), +('11', '113', '8', '111331', '172880', '25'), +('11', '113', '8', '111031', '155757', '25'), +('11', '113', '6', '111323', '177350', '25'), +('11', '113', '6', '111326', '175933', '25'), +('11', '113', '6', '111325', '175803', '25'), +('11', '113', '6', '111022', '155499', '25'), +('11', '113', '17', '56043', '117830', '25'), +('11', '113', '17', '56084', '114425', '25'), +('11', '113', '17', '104427', '99832', '25'), +('11', '113', '17', '54854', '75230', '25'), +('11', '113', '7', '56080', '110201', '25'), +('11', '113', '7', '56040', '109606', '25'), +('11', '113', '7', '104425', '95602', '25'), +('11', '113', '7', '54848', '70372', '25'), +('11', '113', '9', '67098', '180050', '25'), +('11', '113', '9', '104834', '121792', '25'), +('11', '113', '9', '56031', '106550', '25'), +('11', '113', '9', '56070', '106529', '25'), +('11', '113', '15', '111349', '179416', '25'), +('11', '113', '15', '111344', '177591', '25'), +('11', '113', '15', '111340', '177162', '25'), +('11', '113', '15', '111346', '176962', '25'), +('11', '113', '20', '128733', '227370', '25'), +('11', '113', '20', '111356', '177506', '25'), +('11', '113', '20', '111352', '176479', '25'), +('11', '113', '20', '111351', '174046', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('11', '113', '12', '56035', '108587', '25'), +('11', '113', '12', '56074', '107316', '25'), +('11', '113', '12', '104422', '93548', '25'), +('11', '113', '12', '49656', '70172', '25'), +('11', '113', '18', '56041', '114365', '25'), +('11', '113', '18', '62986', '112437', '25'), +('11', '113', '18', '104426', '97230', '25'), +('11', '113', '18', '54851', '71573', '25'), +('11', '113', '19', '81763', '111065', '25'), +('11', '113', '19', '62990', '110865', '25'), +('11', '113', '19', '56075', '110202', '25'), +('11', '113', '19', '56037', '110077', '25'), +('11', '113', '13', '111521', '183256', '25'), +('11', '113', '13', '111524', '173923', '25'), +('11', '113', '13', '111519', '173915', '25'), +('11', '113', '13', '111221', '162419', '25'), +('11', '113', '14', '111537', '177489', '25'), +('11', '113', '14', '111535', '175236', '25'), +('11', '113', '14', '111237', '155637', '25'), +('11', '113', '14', '111235', '153485', '25'), +('11', '113', '11', '85213', '257110', '25'), +('11', '113', '11', '133816', '229879', '25'), +('11', '113', '11', '111335', '176517', '25'), +('11', '113', '11', '111337', '176401', '25'), +('11', '114', '22', '12425', '0', '25'), +('11', '114', '22', '39342', '0', '25'), +('11', '114', '22', '7867', '0', '25'), +('11', '114', '22', '53550', '0', '25'), +('11', '114', '1', '98769', '284442', '25'), +('11', '114', '1', '128691', '229999', '25'), +('11', '114', '1', '111311', '178997', '25'), +('11', '114', '1', '111307', '176966', '25'), +('11', '114', '2', '62985', '110036', '25'), +('11', '114', '2', '94056', '109946', '25'), +('11', '114', '2', '104424', '96243', '25'), +('11', '114', '2', '54845', '71232', '25'), +('11', '114', '3', '111314', '177421', '25'), +('11', '114', '3', '111316', '175639', '25'), +('11', '114', '3', '111315', '174756', '25'), +('11', '114', '3', '111013', '155571', '25'), +('11', '114', '5', '111319', '176946', '25'), +('11', '114', '5', '111321', '176099', '25'), +('11', '114', '5', '111318', '174210', '25'), +('11', '114', '5', '111018', '155095', '25'), +('11', '114', '8', '111332', '177514', '25'), +('11', '114', '8', '111329', '176521', '25'), +('11', '114', '8', '111331', '172885', '25'), +('11', '114', '8', '111031', '155764', '25'), +('11', '114', '6', '111323', '177355', '25'), +('11', '114', '6', '111326', '175941', '25'), +('11', '114', '6', '111325', '175807', '25'), +('11', '114', '6', '111022', '155505', '25'), +('11', '114', '17', '56043', '117835', '25'), +('11', '114', '17', '56084', '114432', '25'), +('11', '114', '17', '104427', '99838', '25'), +('11', '114', '17', '54854', '75235', '25'), +('11', '114', '7', '56080', '110208', '25'), +('11', '114', '7', '56040', '109616', '25'), +('11', '114', '7', '104425', '95608', '25'), +('11', '114', '7', '54848', '70378', '25'), +('11', '114', '9', '67098', '180055', '25'), +('11', '114', '9', '104834', '121798', '25'), +('11', '114', '9', '56031', '106560', '25'), +('11', '114', '9', '56070', '106535', '25'), +('11', '114', '15', '111349', '179424', '25'), +('11', '114', '15', '111344', '177596', '25'), +('11', '114', '15', '111340', '177167', '25'), +('11', '114', '15', '111346', '176968', '25'), +('11', '114', '20', '128733', '227376', '25'), +('11', '114', '20', '111356', '177512', '25'), +('11', '114', '20', '111352', '176484', '25'), +('11', '114', '20', '111351', '174054', '25'), +('11', '114', '12', '56035', '108597', '25'), +('11', '114', '12', '56074', '107322', '25'), +('11', '114', '12', '104422', '93556', '25'), +('11', '114', '12', '49656', '70172', '25'), +('11', '114', '18', '56041', '114374', '25'), +('11', '114', '18', '62986', '112442', '25'), +('11', '114', '18', '104426', '97232', '25'), +('11', '114', '18', '54851', '71577', '25'), +('11', '114', '19', '81763', '111075', '25'), +('11', '114', '19', '62990', '110872', '25'), +('11', '114', '19', '56075', '110206', '25'), +('11', '114', '19', '56037', '110080', '25'), +('11', '114', '13', '111521', '183262', '25'), +('11', '114', '13', '111524', '173930', '25'), +('11', '114', '13', '111519', '173922', '25'), +('11', '114', '13', '111221', '162425', '25'), +('11', '114', '14', '111537', '177494', '25'), +('11', '114', '14', '111535', '175240', '25'), +('11', '114', '14', '111237', '155643', '25'), +('11', '114', '14', '111235', '153489', '25'), +('11', '114', '11', '85213', '257114', '25'), +('11', '114', '11', '133816', '229883', '25'), +('11', '114', '11', '111335', '176523', '25'), +('11', '114', '11', '111337', '176407', '25'), +('11', '115', '22', '12425', '0', '26'), +('11', '115', '22', '39342', '0', '26'), +('11', '115', '22', '7867', '0', '26'), +('11', '115', '22', '53550', '0', '26'), +('11', '115', '1', '98769', '284446', '26'), +('11', '115', '1', '128691', '230006', '26'), +('11', '115', '1', '111311', '179001', '26'), +('11', '115', '1', '111307', '176974', '26'), +('11', '115', '2', '62985', '110040', '26'), +('11', '115', '2', '94056', '109949', '26'), +('11', '115', '2', '104424', '96251', '26'), +('11', '115', '2', '54845', '71238', '26'), +('11', '115', '3', '111314', '177428', '26'), +('11', '115', '3', '111316', '175646', '26'), +('11', '115', '3', '111315', '174762', '26'), +('11', '115', '3', '111013', '155577', '26'), +('11', '115', '5', '111319', '176953', '26'), +('11', '115', '5', '111321', '176104', '26'), +('11', '115', '5', '111318', '174217', '26'), +('11', '115', '5', '111018', '155103', '26'), +('11', '115', '8', '111332', '177521', '26'), +('11', '115', '8', '111329', '176529', '26'), +('11', '115', '8', '111331', '172891', '26'), +('11', '115', '8', '111031', '155770', '26'), +('11', '115', '6', '111323', '177361', '26'), +('11', '115', '6', '111326', '175948', '26'), +('11', '115', '6', '111325', '175812', '26'), +('11', '115', '6', '111022', '155511', '26'), +('11', '115', '17', '56043', '117841', '26'), +('11', '115', '17', '56084', '114438', '26'), +('11', '115', '17', '104427', '99844', '26'), +('11', '115', '17', '54854', '75239', '26'), +('11', '115', '7', '56080', '110215', '26'), +('11', '115', '7', '56040', '109626', '26'), +('11', '115', '7', '104425', '95613', '26'), +('11', '115', '7', '54848', '70384', '26'), +('11', '115', '9', '67098', '180059', '26'), +('11', '115', '9', '104834', '121804', '26'), +('11', '115', '9', '56031', '106571', '26'), +('11', '115', '9', '56070', '106540', '26'), +('11', '115', '15', '111349', '179432', '26'), +('11', '115', '15', '111344', '177601', '26'), +('11', '115', '15', '111340', '177173', '26'), +('11', '115', '15', '111346', '176974', '26'), +('11', '115', '20', '128733', '227382', '26'), +('11', '115', '20', '111356', '177519', '26'), +('11', '115', '20', '111352', '176489', '26'), +('11', '115', '20', '111351', '174061', '26'), +('11', '115', '12', '56035', '108606', '26'), +('11', '115', '12', '56074', '107328', '26'), +('11', '115', '12', '104422', '93564', '26'), +('11', '115', '12', '49656', '70173', '26'), +('11', '115', '18', '56041', '114382', '26'), +('11', '115', '18', '62986', '112447', '26'), +('11', '115', '18', '104426', '97234', '26'), +('11', '115', '18', '54851', '71581', '26'), +('11', '115', '19', '81763', '111085', '26'), +('11', '115', '19', '62990', '110880', '26'), +('11', '115', '19', '56075', '110211', '26'), +('11', '115', '19', '56037', '110082', '26'), +('11', '115', '13', '111521', '183267', '26'), +('11', '115', '13', '111524', '173936', '26'), +('11', '115', '13', '111519', '173929', '26'), +('11', '115', '13', '111221', '162431', '26'), +('11', '115', '14', '111537', '177499', '26'), +('11', '115', '14', '111535', '175244', '26'), +('11', '115', '14', '111237', '155648', '26'), +('11', '115', '14', '111235', '153492', '26'), +('11', '115', '11', '85213', '257118', '26'), +('11', '115', '11', '133816', '229887', '26'), +('11', '115', '11', '111335', '176529', '26'), +('11', '115', '11', '111337', '176413', '26'), +('12', '1', '22', '10323', '0', '0'), +('12', '1', '22', '9246', '0', '0'), +('12', '1', '22', '21509', '0', '0'), +('12', '1', '22', '8007', '0', '0'), +('12', '1', '1', '14702', '2350', '0'), +('12', '1', '1', '30361', '2040', '0'), +('12', '1', '1', '14701', '1862', '0'), +('12', '1', '1', '10321', '600', '0'), +('12', '1', '2', '10143', '3368', '0'), +('12', '1', '2', '30363', '2700', '0'), +('12', '1', '2', '1271', '2300', '0'), +('12', '1', '2', '10142', '1272', '0'), +('12', '1', '3', '14705', '990', '0'), +('12', '1', '3', '14706', '990', '0'), +('12', '1', '3', '1212', '925', '0'), +('12', '1', '3', '1272', '649', '0'), +('12', '1', '5', '14703', '3850', '0'), +('12', '1', '5', '27710', '3066', '0'), +('12', '1', '5', '14556', '3018', '0'), +('12', '1', '5', '30362', '2340', '0'), +('12', '1', '8', '11603', '5376', '0'), +('12', '1', '8', '2349', '2154', '0'), +('12', '1', '8', '11621', '1021', '0'), +('12', '1', '8', '1216', '939', '0'), +('12', '1', '6', '1557', '5310', '0'), +('12', '1', '6', '1905', '3031', '0'), +('12', '1', '6', '1542', '2237', '0'), +('12', '1', '6', '1273', '1416', '0'), +('12', '1', '17', '1253', '6051', '0'), +('12', '1', '17', '1644', '5203', '0'), +('12', '1', '17', '11641', '3690', '0'), +('12', '1', '17', '1357', '3468', '0'), +('12', '1', '7', '1362', '1624', '0'), +('12', '1', '7', '1321', '1146', '0'), +('12', '1', '7', '1648', '660', '0'), +('12', '1', '7', '1227', '575', '0'), +('12', '1', '9', '12803', '3470', '0'), +('12', '1', '9', '4344', '1251', '0'), +('12', '1', '9', '10408', '1202', '0'), +('12', '1', '9', '14650', '1062', '0'), +('12', '1', '15', '11686', '3070', '0'), +('12', '1', '15', '10150', '1804', '0'), +('12', '1', '15', '10163', '1500', '0'), +('12', '1', '15', '14651', '1424', '0'), +('12', '1', '20', '11666', '5289', '0'), +('12', '1', '20', '2742', '3069', '0'), +('12', '1', '20', '1217', '934', '0'), +('12', '1', '20', '1647', '934', '0'), +('12', '1', '12', '2923', '2074', '0'), +('12', '1', '12', '20655', '1816', '0'), +('12', '1', '12', '1404', '1512', '0'), +('12', '1', '12', '1229', '1282', '0'), +('12', '1', '18', '1651', '757', '0'), +('12', '1', '18', '4410', '742', '0'), +('12', '1', '18', '1230', '485', '0'), +('12', '1', '18', '1221', '454', '0'), +('12', '1', '19', '68239', '1345', '0'), +('12', '1', '19', '1652', '1234', '0'), +('12', '1', '19', '1368', '1216', '0'), +('12', '1', '19', '1222', '452', '0'), +('12', '1', '13', '20656', '3666', '0'), +('12', '1', '13', '14337', '3174', '0'), +('12', '1', '13', '11625', '2114', '0'), +('12', '1', '13', '13400', '1829', '0'), +('12', '1', '14', '10219', '3681', '0'), +('12', '1', '14', '20656', '3666', '0'), +('12', '1', '14', '11625', '2114', '0'), +('12', '1', '14', '13353', '1501', '0'), +('12', '1', '11', '13353', '1500', '0'), +('12', '1', '11', '14762', '1404', '0'), +('12', '1', '11', '20677', '450', '0'), +('12', '1', '11', '13942', '91', '0'), +('12', '2', '22', '10323', '0', '0'), +('12', '2', '22', '9246', '0', '0'), +('12', '2', '22', '21509', '0', '0'), +('12', '2', '22', '8007', '0', '0'), +('12', '2', '1', '14702', '2350', '0'), +('12', '2', '1', '30361', '2040', '0'), +('12', '2', '1', '14701', '1862', '0'), +('12', '2', '1', '10321', '600', '0'), +('12', '2', '2', '10143', '3368', '0'), +('12', '2', '2', '30363', '2700', '0'), +('12', '2', '2', '1271', '2358', '0'), +('12', '2', '2', '10142', '1272', '0'), +('12', '2', '3', '14705', '990', '0'), +('12', '2', '3', '14706', '990', '0'), +('12', '2', '3', '1212', '933', '0'), +('12', '2', '3', '1272', '714', '0'), +('12', '2', '5', '14703', '3850', '0'), +('12', '2', '5', '27710', '3103', '0'), +('12', '2', '5', '14556', '3018', '0'), +('12', '2', '5', '30362', '2340', '0'), +('12', '2', '8', '11603', '5441', '0'), +('12', '2', '8', '2349', '2154', '0'), +('12', '2', '8', '11621', '1021', '0'), +('12', '2', '8', '1216', '946', '0'), +('12', '2', '6', '1557', '5310', '0'), +('12', '2', '6', '1905', '3033', '0'), +('12', '2', '6', '1542', '2302', '0'), +('12', '2', '6', '1273', '1453', '0'), +('12', '2', '17', '1253', '6053', '0'), +('12', '2', '17', '1644', '5239', '0'), +('12', '2', '17', '11641', '3799', '0'), +('12', '2', '17', '1357', '3468', '0'), +('12', '2', '7', '1362', '1624', '0'), +('12', '2', '7', '1321', '1146', '0'), +('12', '2', '7', '1648', '697', '0'), +('12', '2', '7', '1227', '626', '0'), +('12', '2', '9', '12803', '3434', '0'), +('12', '2', '9', '4344', '1251', '0'), +('12', '2', '9', '10408', '1202', '0'), +('12', '2', '9', '14650', '1062', '0'), +('12', '2', '15', '11686', '3106', '0'), +('12', '2', '15', '10150', '1804', '0'), +('12', '2', '15', '10163', '1500', '0'), +('12', '2', '15', '14651', '1424', '0'), +('12', '2', '20', '11666', '5290', '0'), +('12', '2', '20', '2742', '3071', '0'), +('12', '2', '20', '1217', '941', '0'), +('12', '2', '20', '1647', '934', '0'), +('12', '2', '12', '2923', '2074', '0'), +('12', '2', '12', '20655', '1831', '0'), +('12', '2', '12', '1404', '1512', '0'), +('12', '2', '12', '1229', '1333', '0'), +('12', '2', '18', '1651', '779', '0'), +('12', '2', '18', '4410', '742', '0'), +('12', '2', '18', '1230', '485', '0'), +('12', '2', '18', '1221', '454', '0'), +('12', '2', '19', '68239', '1367', '0'), +('12', '2', '19', '1652', '1234', '0'), +('12', '2', '19', '1368', '1216', '0'), +('12', '2', '19', '1222', '452', '0'), +('12', '2', '13', '20656', '3703', '0'), +('12', '2', '13', '14337', '3246', '0'), +('12', '2', '13', '11625', '2116', '0'), +('12', '2', '13', '13400', '1858', '0'), +('12', '2', '14', '20656', '3703', '0'), +('12', '2', '14', '10219', '3681', '0'), +('12', '2', '14', '11625', '2116', '0'), +('12', '2', '14', '13353', '1501', '0'), +('12', '2', '11', '13353', '1500', '0'), +('12', '2', '11', '14762', '1404', '0'), +('12', '2', '11', '20677', '450', '0'), +('12', '2', '11', '9246', '157', '0'), +('12', '3', '22', '10323', '0', '0'), +('12', '3', '22', '9246', '0', '0'), +('12', '3', '22', '21509', '0', '0'), +('12', '3', '22', '8007', '0', '0'), +('12', '3', '1', '14702', '2350', '0'), +('12', '3', '1', '30361', '2040', '0'), +('12', '3', '1', '14701', '1862', '0'), +('12', '3', '1', '10321', '600', '0'), +('12', '3', '2', '10143', '3368', '0'), +('12', '3', '2', '30363', '2700', '0'), +('12', '3', '2', '1271', '2416', '0'), +('12', '3', '2', '10142', '1272', '0'), +('12', '3', '3', '14705', '990', '0'), +('12', '3', '3', '14706', '990', '0'), +('12', '3', '3', '1212', '940', '0'), +('12', '3', '3', '1272', '779', '0'), +('12', '3', '5', '14703', '3850', '0'), +('12', '3', '5', '27710', '3139', '0'), +('12', '3', '5', '14556', '3018', '0'), +('12', '3', '5', '30362', '2340', '0'), +('12', '3', '8', '11603', '5506', '0'), +('12', '3', '8', '2349', '2154', '0'), +('12', '3', '8', '11621', '1021', '0'), +('12', '3', '8', '1216', '953', '0'), +('12', '3', '6', '1557', '5310', '0'), +('12', '3', '6', '1905', '3034', '0'), +('12', '3', '6', '1542', '2367', '0'), +('12', '3', '6', '1273', '1489', '0'), +('12', '3', '17', '1253', '6056', '0'), +('12', '3', '17', '1644', '5275', '0'), +('12', '3', '17', '11641', '3908', '0'), +('12', '3', '17', '1357', '3468', '0'), +('12', '3', '7', '1362', '1624', '0'), +('12', '3', '7', '1321', '1146', '0'), +('12', '3', '7', '1648', '733', '0'), +('12', '3', '7', '1227', '676', '0'), +('12', '3', '9', '12803', '3397', '0'), +('12', '3', '9', '4344', '1251', '0'), +('12', '3', '9', '10408', '1202', '0'), +('12', '3', '9', '14650', '1062', '0'), +('12', '3', '15', '11686', '3143', '0'), +('12', '3', '15', '10150', '1804', '0'), +('12', '3', '15', '10163', '1500', '0'), +('12', '3', '15', '14651', '1424', '0'), +('12', '3', '20', '11666', '5292', '0'), +('12', '3', '20', '2742', '3074', '0'), +('12', '3', '20', '1217', '948', '0'), +('12', '3', '20', '1647', '934', '0'), +('12', '3', '12', '2923', '2074', '0'), +('12', '3', '12', '20655', '1846', '0'), +('12', '3', '12', '1404', '1512', '0'), +('12', '3', '12', '1229', '1384', '0'), +('12', '3', '18', '1651', '800', '0'), +('12', '3', '18', '4410', '742', '0'), +('12', '3', '18', '1230', '486', '0'), +('12', '3', '18', '1221', '454', '0'), +('12', '3', '19', '68239', '1389', '0'), +('12', '3', '19', '1652', '1234', '0'), +('12', '3', '19', '1368', '1216', '0'), +('12', '3', '19', '1222', '452', '0'), +('12', '3', '13', '20656', '3739', '0'), +('12', '3', '13', '14337', '3319', '0'), +('12', '3', '13', '11625', '2119', '0'), +('12', '3', '13', '13400', '1887', '0'), +('12', '3', '14', '20656', '3739', '0'), +('12', '3', '14', '10219', '3681', '0'), +('12', '3', '14', '11625', '2119', '0'), +('12', '3', '14', '13987', '1509', '0'), +('12', '3', '11', '13353', '1500', '0'), +('12', '3', '11', '14762', '1404', '0'), +('12', '3', '11', '20677', '450', '0'), +('12', '3', '11', '9246', '230', '0'), +('12', '4', '22', '10323', '0', '0'), +('12', '4', '22', '9246', '0', '0'), +('12', '4', '22', '21509', '0', '0'), +('12', '4', '22', '8007', '0', '0'), +('12', '4', '1', '14702', '2350', '0'), +('12', '4', '1', '30361', '2040', '0'), +('12', '4', '1', '14701', '1862', '0'), +('12', '4', '1', '10321', '600', '0'), +('12', '4', '2', '10143', '3368', '0'), +('12', '4', '2', '30363', '2700', '0'), +('12', '4', '2', '1271', '2474', '0'), +('12', '4', '2', '10142', '1272', '0'), +('12', '4', '3', '14705', '990', '0'), +('12', '4', '3', '14706', '990', '0'), +('12', '4', '3', '1212', '947', '0'), +('12', '4', '3', '1272', '844', '0'), +('12', '4', '5', '14703', '3850', '0'), +('12', '4', '5', '27710', '3175', '0'), +('12', '4', '5', '14556', '3018', '0'), +('12', '4', '5', '30362', '2340', '0'), +('12', '4', '8', '11603', '5571', '0'), +('12', '4', '8', '2349', '2154', '0'), +('12', '4', '8', '11621', '1021', '0'), +('12', '4', '8', '1216', '960', '0'), +('12', '4', '6', '1557', '5310', '0'), +('12', '4', '6', '1905', '3035', '0'), +('12', '4', '6', '1542', '2432', '0'), +('12', '4', '6', '1273', '1525', '0'), +('12', '4', '17', '1253', '6058', '0'), +('12', '4', '17', '1644', '5311', '0'), +('12', '4', '17', '11641', '4016', '0'), +('12', '4', '17', '1357', '3468', '0'), +('12', '4', '7', '1362', '1624', '0'), +('12', '4', '7', '1321', '1146', '0'), +('12', '4', '7', '1648', '769', '0'), +('12', '4', '7', '1227', '727', '0'), +('12', '4', '9', '12803', '3361', '0'), +('12', '4', '9', '4344', '1251', '0'), +('12', '4', '9', '10408', '1202', '0'), +('12', '4', '9', '14650', '1062', '0'), +('12', '4', '15', '11686', '3179', '0'), +('12', '4', '15', '10150', '1804', '0'), +('12', '4', '15', '10163', '1500', '0'), +('12', '4', '15', '14651', '1424', '0'), +('12', '4', '20', '11666', '5294', '0'), +('12', '4', '20', '2742', '3076', '0'), +('12', '4', '20', '1217', '956', '0'), +('12', '4', '20', '1647', '934', '0'), +('12', '4', '12', '2923', '2074', '0'), +('12', '4', '12', '20655', '1861', '0'), +('12', '4', '12', '1404', '1512', '0'), +('12', '4', '12', '1229', '1434', '0'), +('12', '4', '18', '1651', '822', '0'), +('12', '4', '18', '4410', '742', '0'), +('12', '4', '18', '1230', '487', '0'), +('12', '4', '18', '1221', '454', '0'), +('12', '4', '19', '68239', '1410', '0'), +('12', '4', '19', '1652', '1234', '0'), +('12', '4', '19', '1368', '1216', '0'), +('12', '4', '19', '1222', '452', '0'), +('12', '4', '13', '20656', '3775', '0'), +('12', '4', '13', '14337', '3391', '0'), +('12', '4', '13', '11625', '2121', '0'), +('12', '4', '13', '13400', '1916', '0'), +('12', '4', '14', '20656', '3775', '0'), +('12', '4', '14', '10219', '3681', '0'), +('12', '4', '14', '11625', '2121', '0'), +('12', '4', '14', '13987', '1545', '0'), +('12', '4', '11', '13353', '1500', '0'), +('12', '4', '11', '14762', '1404', '0'), +('12', '4', '11', '20677', '450', '0'), +('12', '4', '11', '9246', '302', '0'), +('12', '5', '22', '10323', '0', '0'), +('12', '5', '22', '9246', '0', '0'), +('12', '5', '22', '21509', '0', '0'), +('12', '5', '22', '8007', '0', '0'), +('12', '5', '1', '14702', '2350', '0'), +('12', '5', '1', '30361', '2040', '0'), +('12', '5', '1', '14701', '1862', '0'), +('12', '5', '1', '10321', '600', '0'), +('12', '5', '2', '10143', '3368', '0'), +('12', '5', '2', '30363', '2700', '0'), +('12', '5', '2', '1271', '2532', '0'), +('12', '5', '2', '1225', '1290', '0'), +('12', '5', '3', '14705', '990', '0'), +('12', '5', '3', '14706', '990', '0'), +('12', '5', '3', '1212', '954', '0'), +('12', '5', '3', '1272', '910', '0'), +('12', '5', '5', '14703', '3850', '0'), +('12', '5', '5', '27710', '3211', '0'), +('12', '5', '5', '14556', '3018', '0'), +('12', '5', '5', '30362', '2340', '0'), +('12', '5', '8', '11603', '5637', '0'), +('12', '5', '8', '2349', '2154', '0'), +('12', '5', '8', '11621', '1021', '0'), +('12', '5', '8', '1216', '968', '0'), +('12', '5', '6', '1557', '5310', '0'), +('12', '5', '6', '1905', '3036', '0'), +('12', '5', '6', '1542', '2497', '0'), +('12', '5', '6', '1273', '1561', '0'), +('12', '5', '17', '1253', '6060', '0'), +('12', '5', '17', '1644', '5348', '0'), +('12', '5', '17', '11641', '4125', '0'), +('12', '5', '17', '1357', '3468', '0'), +('12', '5', '7', '1362', '1624', '0'), +('12', '5', '7', '1321', '1146', '0'), +('12', '5', '7', '1648', '805', '0'), +('12', '5', '7', '1227', '778', '0'), +('12', '5', '9', '12803', '3325', '0'), +('12', '5', '9', '4344', '1251', '0'), +('12', '5', '9', '10408', '1202', '0'), +('12', '5', '9', '14650', '1062', '0'), +('12', '5', '15', '11686', '3215', '0'), +('12', '5', '15', '10150', '1804', '0'), +('12', '5', '15', '10163', '1500', '0'), +('12', '5', '15', '14651', '1424', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '5', '20', '11666', '5295', '0'), +('12', '5', '20', '2742', '3079', '0'), +('12', '5', '20', '1217', '963', '0'), +('12', '5', '20', '1647', '934', '0'), +('12', '5', '12', '2923', '2074', '0'), +('12', '5', '12', '20655', '1876', '0'), +('12', '5', '12', '1404', '1512', '0'), +('12', '5', '12', '1229', '1485', '0'), +('12', '5', '18', '1651', '844', '0'), +('12', '5', '18', '4410', '742', '0'), +('12', '5', '18', '1230', '487', '0'), +('12', '5', '18', '1221', '454', '0'), +('12', '5', '19', '68239', '1432', '0'), +('12', '5', '19', '1652', '1234', '0'), +('12', '5', '19', '1368', '1216', '0'), +('12', '5', '19', '1222', '452', '0'), +('12', '5', '13', '20656', '3811', '0'), +('12', '5', '13', '14337', '3464', '0'), +('12', '5', '13', '11625', '2123', '0'), +('12', '5', '13', '13400', '1945', '0'), +('12', '5', '14', '20656', '3811', '0'), +('12', '5', '14', '10219', '3681', '0'), +('12', '5', '14', '11625', '2123', '0'), +('12', '5', '14', '13987', '1581', '0'), +('12', '5', '11', '13353', '1500', '0'), +('12', '5', '11', '14762', '1404', '0'), +('12', '5', '11', '20677', '450', '0'), +('12', '5', '11', '9246', '374', '0'), +('12', '6', '22', '10323', '0', '0'), +('12', '6', '22', '9246', '0', '0'), +('12', '6', '22', '21509', '0', '0'), +('12', '6', '22', '8007', '0', '0'), +('12', '6', '1', '14702', '2350', '0'), +('12', '6', '1', '30361', '2040', '0'), +('12', '6', '1', '14701', '1862', '0'), +('12', '6', '1', '10321', '600', '0'), +('12', '6', '2', '10143', '3368', '0'), +('12', '6', '2', '30363', '2700', '0'), +('12', '6', '2', '1271', '2590', '0'), +('12', '6', '2', '1225', '1342', '0'), +('12', '6', '3', '14706', '990', '0'), +('12', '6', '3', '14705', '990', '0'), +('12', '6', '3', '1272', '975', '0'), +('12', '6', '3', '1212', '962', '0'), +('12', '6', '5', '14703', '3850', '0'), +('12', '6', '5', '27710', '3248', '0'), +('12', '6', '5', '14556', '3018', '0'), +('12', '6', '5', '30362', '2340', '0'), +('12', '6', '8', '11603', '5702', '0'), +('12', '6', '8', '2349', '2154', '0'), +('12', '6', '8', '11621', '1021', '0'), +('12', '6', '8', '1216', '975', '0'), +('12', '6', '6', '1557', '5310', '0'), +('12', '6', '6', '1905', '3037', '0'), +('12', '6', '6', '1542', '2563', '0'), +('12', '6', '6', '1273', '1598', '0'), +('12', '6', '17', '1253', '6063', '0'), +('12', '6', '17', '1644', '5384', '0'), +('12', '6', '17', '11641', '4234', '0'), +('12', '6', '17', '1357', '3468', '0'), +('12', '6', '7', '1362', '1624', '0'), +('12', '6', '7', '1321', '1146', '0'), +('12', '6', '7', '1648', '842', '0'), +('12', '6', '7', '1227', '829', '0'), +('12', '6', '9', '12803', '3289', '0'), +('12', '6', '9', '4344', '1251', '0'), +('12', '6', '9', '10408', '1202', '0'), +('12', '6', '9', '14650', '1062', '0'), +('12', '6', '15', '11686', '3251', '0'), +('12', '6', '15', '10150', '1804', '0'), +('12', '6', '15', '10163', '1500', '0'), +('12', '6', '15', '14651', '1424', '0'), +('12', '6', '20', '11666', '5297', '0'), +('12', '6', '20', '2742', '3081', '0'), +('12', '6', '20', '1217', '970', '0'), +('12', '6', '20', '1647', '934', '0'), +('12', '6', '12', '2923', '2074', '0'), +('12', '6', '12', '20655', '1891', '0'), +('12', '6', '12', '1229', '1536', '0'), +('12', '6', '12', '1404', '1512', '0'), +('12', '6', '18', '1651', '865', '0'), +('12', '6', '18', '4410', '742', '0'), +('12', '6', '18', '1230', '488', '0'), +('12', '6', '18', '1221', '454', '0'), +('12', '6', '19', '68239', '1454', '0'), +('12', '6', '19', '1652', '1234', '0'), +('12', '6', '19', '1368', '1216', '0'), +('12', '6', '19', '1222', '452', '0'), +('12', '6', '13', '20656', '3848', '0'), +('12', '6', '13', '14337', '3536', '0'), +('12', '6', '13', '11625', '2125', '0'), +('12', '6', '13', '13400', '1974', '0'), +('12', '6', '14', '20656', '3848', '0'), +('12', '6', '14', '10219', '3681', '0'), +('12', '6', '14', '11625', '2125', '0'), +('12', '6', '14', '9690', '1620', '0'), +('12', '6', '11', '13353', '1500', '0'), +('12', '6', '11', '14762', '1404', '0'), +('12', '6', '11', '20677', '450', '0'), +('12', '6', '11', '9246', '447', '0'), +('12', '7', '22', '10323', '0', '0'), +('12', '7', '22', '9246', '0', '0'), +('12', '7', '22', '21509', '0', '0'), +('12', '7', '22', '8007', '0', '0'), +('12', '7', '1', '14702', '2350', '0'), +('12', '7', '1', '30361', '2040', '0'), +('12', '7', '1', '14701', '1862', '0'), +('12', '7', '1', '10321', '600', '0'), +('12', '7', '2', '10143', '3368', '0'), +('12', '7', '2', '30363', '2700', '0'), +('12', '7', '2', '1271', '2648', '0'), +('12', '7', '2', '1225', '1394', '0'), +('12', '7', '3', '1272', '1040', '0'), +('12', '7', '3', '14705', '990', '0'), +('12', '7', '3', '14706', '990', '0'), +('12', '7', '3', '1212', '969', '0'), +('12', '7', '5', '14703', '3850', '0'), +('12', '7', '5', '27710', '3284', '0'), +('12', '7', '5', '14556', '3018', '0'), +('12', '7', '5', '30362', '2340', '0'), +('12', '7', '8', '11603', '5767', '0'), +('12', '7', '8', '2349', '2154', '0'), +('12', '7', '8', '11621', '1021', '0'), +('12', '7', '8', '1216', '982', '0'), +('12', '7', '6', '1557', '5310', '0'), +('12', '7', '6', '1905', '3039', '0'), +('12', '7', '6', '1542', '2628', '0'), +('12', '7', '6', '1273', '1634', '0'), +('12', '7', '17', '1253', '6065', '0'), +('12', '7', '17', '1644', '5420', '0'), +('12', '7', '17', '11641', '4343', '0'), +('12', '7', '17', '1357', '3468', '0'), +('12', '7', '7', '1362', '1624', '0'), +('12', '7', '7', '1321', '1146', '0'), +('12', '7', '7', '1227', '879', '0'), +('12', '7', '7', '1648', '878', '0'), +('12', '7', '9', '12803', '3252', '0'), +('12', '7', '9', '4344', '1251', '0'), +('12', '7', '9', '10408', '1202', '0'), +('12', '7', '9', '1649', '1070', '0'), +('12', '7', '15', '11686', '3288', '0'), +('12', '7', '15', '10150', '1804', '0'), +('12', '7', '15', '10163', '1500', '0'), +('12', '7', '15', '14651', '1424', '0'), +('12', '7', '20', '11666', '5299', '0'), +('12', '7', '20', '2742', '3083', '0'), +('12', '7', '20', '1217', '977', '0'), +('12', '7', '20', '1647', '934', '0'), +('12', '7', '12', '2923', '2074', '0'), +('12', '7', '12', '20655', '1906', '0'), +('12', '7', '12', '1229', '1587', '0'), +('12', '7', '12', '1404', '1512', '0'), +('12', '7', '18', '1651', '887', '0'), +('12', '7', '18', '4410', '742', '0'), +('12', '7', '18', '1230', '489', '0'), +('12', '7', '18', '1221', '454', '0'), +('12', '7', '19', '68239', '1476', '0'), +('12', '7', '19', '1652', '1234', '0'), +('12', '7', '19', '1368', '1216', '0'), +('12', '7', '19', '4407', '517', '0'), +('12', '7', '13', '20656', '3884', '0'), +('12', '7', '13', '14337', '3609', '0'), +('12', '7', '13', '11625', '2127', '0'), +('12', '7', '13', '13400', '2003', '0'), +('12', '7', '14', '20656', '3884', '0'), +('12', '7', '14', '10219', '3681', '0'), +('12', '7', '14', '11625', '2127', '0'), +('12', '7', '14', '9690', '1890', '0'), +('12', '7', '11', '13353', '1500', '0'), +('12', '7', '11', '14762', '1404', '0'), +('12', '7', '11', '9246', '519', '0'), +('12', '7', '11', '20677', '450', '0'), +('12', '8', '22', '10323', '0', '0'), +('12', '8', '22', '9246', '0', '0'), +('12', '8', '22', '21509', '0', '0'), +('12', '8', '22', '8007', '0', '0'), +('12', '8', '1', '14702', '2350', '0'), +('12', '8', '1', '30361', '2040', '0'), +('12', '8', '1', '14701', '1862', '0'), +('12', '8', '1', '10321', '600', '0'), +('12', '8', '2', '10143', '3368', '0'), +('12', '8', '2', '1271', '2706', '0'), +('12', '8', '2', '30363', '2700', '0'), +('12', '8', '2', '1225', '1446', '0'), +('12', '8', '3', '1272', '1105', '0'), +('12', '8', '3', '14705', '990', '0'), +('12', '8', '3', '14706', '990', '0'), +('12', '8', '3', '1212', '976', '0'), +('12', '8', '5', '14703', '3850', '0'), +('12', '8', '5', '27710', '3320', '0'), +('12', '8', '5', '14556', '3018', '0'), +('12', '8', '5', '30362', '2340', '0'), +('12', '8', '8', '11603', '5832', '0'), +('12', '8', '8', '2349', '2154', '0'), +('12', '8', '8', '11621', '1021', '0'), +('12', '8', '8', '1216', '989', '0'), +('12', '8', '6', '1557', '5310', '0'), +('12', '8', '6', '1905', '3040', '0'), +('12', '8', '6', '1542', '2693', '0'), +('12', '8', '6', '1273', '1670', '0'), +('12', '8', '17', '1253', '6068', '0'), +('12', '8', '17', '1644', '5456', '0'), +('12', '8', '17', '11641', '4451', '0'), +('12', '8', '17', '1357', '3468', '0'), +('12', '8', '7', '1362', '1624', '0'), +('12', '8', '7', '1321', '1146', '0'), +('12', '8', '7', '1227', '930', '0'), +('12', '8', '7', '1648', '914', '0'), +('12', '8', '9', '12803', '3216', '0'), +('12', '8', '9', '4344', '1251', '0'), +('12', '8', '9', '10408', '1202', '0'), +('12', '8', '9', '1649', '1092', '0'), +('12', '8', '15', '11686', '3324', '0'), +('12', '8', '15', '10150', '1804', '0'), +('12', '8', '15', '10163', '1500', '0'), +('12', '8', '15', '14651', '1424', '0'), +('12', '8', '20', '11666', '5300', '0'), +('12', '8', '20', '2742', '3086', '0'), +('12', '8', '20', '1217', '985', '0'), +('12', '8', '20', '1647', '934', '0'), +('12', '8', '12', '2923', '2074', '0'), +('12', '8', '12', '20655', '1921', '0'), +('12', '8', '12', '1229', '1637', '0'), +('12', '8', '12', '1404', '1512', '0'), +('12', '8', '18', '1651', '909', '0'), +('12', '8', '18', '4410', '742', '0'), +('12', '8', '18', '1230', '490', '0'), +('12', '8', '18', '1221', '454', '0'), +('12', '8', '19', '68239', '1497', '0'), +('12', '8', '19', '1652', '1234', '0'), +('12', '8', '19', '1368', '1216', '0'), +('12', '8', '19', '4407', '582', '0'), +('12', '8', '13', '20656', '3920', '0'), +('12', '8', '13', '14337', '3681', '0'), +('12', '8', '13', '9690', '2160', '0'), +('12', '8', '13', '11625', '2129', '0'), +('12', '8', '14', '20656', '3920', '0'), +('12', '8', '14', '10219', '3681', '0'), +('12', '8', '14', '9690', '2160', '0'), +('12', '8', '14', '11625', '2129', '0'), +('12', '8', '11', '13353', '1500', '0'), +('12', '8', '11', '14762', '1404', '0'), +('12', '8', '11', '9246', '592', '0'), +('12', '8', '11', '20677', '450', '0'), +('12', '9', '22', '10323', '0', '0'), +('12', '9', '22', '9246', '0', '0'), +('12', '9', '22', '21509', '0', '0'), +('12', '9', '22', '8007', '0', '0'), +('12', '9', '1', '14702', '2350', '0'), +('12', '9', '1', '30361', '2040', '0'), +('12', '9', '1', '14701', '1862', '0'), +('12', '9', '1', '10321', '600', '0'), +('12', '9', '2', '10143', '3368', '0'), +('12', '9', '2', '1271', '2764', '0'), +('12', '9', '2', '30363', '2700', '0'), +('12', '9', '2', '1225', '1498', '0'), +('12', '9', '3', '1272', '1171', '0'), +('12', '9', '3', '14705', '990', '0'), +('12', '9', '3', '14706', '990', '0'), +('12', '9', '3', '1212', '983', '0'), +('12', '9', '5', '14703', '3850', '0'), +('12', '9', '5', '27710', '3356', '0'), +('12', '9', '5', '14556', '3018', '0'), +('12', '9', '5', '30362', '2340', '0'), +('12', '9', '8', '11603', '5897', '0'), +('12', '9', '8', '2349', '2154', '0'), +('12', '9', '8', '11621', '1021', '0'), +('12', '9', '8', '1216', '997', '0'), +('12', '9', '6', '1557', '5310', '0'), +('12', '9', '6', '1905', '3041', '0'), +('12', '9', '6', '1542', '2758', '0'), +('12', '9', '6', '1273', '1706', '0'), +('12', '9', '17', '1253', '6070', '0'), +('12', '9', '17', '1644', '5493', '0'), +('12', '9', '17', '11641', '4560', '0'), +('12', '9', '17', '1357', '3468', '0'), +('12', '9', '7', '1362', '1624', '0'), +('12', '9', '7', '1321', '1146', '0'), +('12', '9', '7', '1227', '981', '0'), +('12', '9', '7', '1648', '950', '0'), +('12', '9', '9', '12803', '3180', '0'), +('12', '9', '9', '4344', '1251', '0'), +('12', '9', '9', '10408', '1202', '0'), +('12', '9', '9', '1649', '1114', '0'), +('12', '9', '15', '11686', '3360', '0'), +('12', '9', '15', '10150', '1804', '0'), +('12', '9', '15', '10163', '1500', '0'), +('12', '9', '15', '14651', '1424', '0'), +('12', '9', '20', '11666', '5302', '0'), +('12', '9', '20', '2742', '3088', '0'), +('12', '9', '20', '1217', '992', '0'), +('12', '9', '20', '1647', '934', '0'), +('12', '9', '12', '2923', '2074', '0'), +('12', '9', '12', '20655', '1936', '0'), +('12', '9', '12', '1229', '1688', '0'), +('12', '9', '12', '1404', '1512', '0'), +('12', '9', '18', '1651', '931', '0'), +('12', '9', '18', '4410', '742', '0'), +('12', '9', '18', '1230', '490', '0'), +('12', '9', '18', '1221', '454', '0'), +('12', '9', '19', '68239', '1519', '0'), +('12', '9', '19', '1652', '1234', '0'), +('12', '9', '19', '1368', '1216', '0'), +('12', '9', '19', '4407', '647', '0'), +('12', '9', '13', '20656', '3956', '0'), +('12', '9', '13', '14337', '3754', '0'), +('12', '9', '13', '9690', '2430', '0'), +('12', '9', '13', '11625', '2132', '0'), +('12', '9', '14', '20656', '3956', '0'), +('12', '9', '14', '10219', '3681', '0'), +('12', '9', '14', '9690', '2430', '0'), +('12', '9', '14', '11625', '2132', '0'), +('12', '9', '11', '13353', '1500', '0'), +('12', '9', '11', '14762', '1404', '0'), +('12', '9', '11', '9246', '664', '0'), +('12', '9', '11', '20677', '450', '0'), +('12', '10', '22', '10323', '0', '0'), +('12', '10', '22', '9246', '0', '0'), +('12', '10', '22', '21509', '0', '0'), +('12', '10', '22', '8007', '0', '0'), +('12', '10', '1', '14702', '2350', '0'), +('12', '10', '1', '30361', '2040', '0'), +('12', '10', '1', '14701', '1862', '0'), +('12', '10', '1', '10321', '600', '0'), +('12', '10', '2', '10143', '3368', '0'), +('12', '10', '2', '1271', '2822', '0'), +('12', '10', '2', '30363', '2700', '0'), +('12', '10', '2', '1225', '1550', '0'), +('12', '10', '3', '1272', '1236', '0'), +('12', '10', '3', '11052', '1087', '0'), +('12', '10', '3', '1212', '991', '0'), +('12', '10', '3', '14706', '990', '0'), +('12', '10', '5', '14703', '3850', '0'), +('12', '10', '5', '27710', '3393', '0'), +('12', '10', '5', '14556', '3018', '0'), +('12', '10', '5', '30362', '2340', '0'), +('12', '10', '8', '11603', '5963', '0'), +('12', '10', '8', '2349', '2154', '0'), +('12', '10', '8', '11621', '1021', '0'), +('12', '10', '8', '1216', '1004', '0'), +('12', '10', '6', '1557', '5310', '0'), +('12', '10', '6', '1905', '3042', '0'), +('12', '10', '6', '1542', '2824', '0'), +('12', '10', '6', '1273', '1743', '0'), +('12', '10', '17', '1253', '6072', '0'), +('12', '10', '17', '1644', '5529', '0'), +('12', '10', '17', '11641', '4669', '0'), +('12', '10', '17', '1357', '3468', '0'), +('12', '10', '7', '1362', '1624', '0'), +('12', '10', '7', '1321', '1146', '0'), +('12', '10', '7', '1227', '1032', '0'), +('12', '10', '7', '1648', '987', '0'), +('12', '10', '9', '12803', '3144', '0'), +('12', '10', '9', '4344', '1251', '0'), +('12', '10', '9', '10408', '1202', '0'), +('12', '10', '9', '1649', '1136', '0'), +('12', '10', '15', '11686', '3396', '0'), +('12', '10', '15', '10150', '1804', '0'), +('12', '10', '15', '10163', '1500', '0'), +('12', '10', '15', '14651', '1424', '0'), +('12', '10', '20', '11666', '5304', '0'), +('12', '10', '20', '2742', '3091', '0'), +('12', '10', '20', '1217', '999', '0'), +('12', '10', '20', '1647', '934', '0'), +('12', '10', '12', '2923', '2074', '0'), +('12', '10', '12', '20655', '1951', '0'), +('12', '10', '12', '1229', '1739', '0'), +('12', '10', '12', '1404', '1512', '0'), +('12', '10', '18', '1651', '952', '0'), +('12', '10', '18', '4410', '742', '0'), +('12', '10', '18', '1230', '491', '0'), +('12', '10', '18', '1221', '454', '0'), +('12', '10', '19', '68239', '1541', '0'), +('12', '10', '19', '1652', '1234', '0'), +('12', '10', '19', '1368', '1216', '0'), +('12', '10', '19', '4407', '713', '0'), +('12', '10', '13', '20656', '3993', '0'), +('12', '10', '13', '14337', '3826', '0'), +('12', '10', '13', '9690', '2700', '0'), +('12', '10', '13', '11625', '2134', '0'), +('12', '10', '14', '20656', '3993', '0'), +('12', '10', '14', '10219', '3681', '0'), +('12', '10', '14', '9690', '2700', '0'), +('12', '10', '14', '11625', '2134', '0'), +('12', '10', '11', '13353', '1500', '0'), +('12', '10', '11', '14762', '1404', '0'), +('12', '10', '11', '9246', '737', '0'), +('12', '10', '11', '20677', '450', '0'), +('12', '11', '22', '10323', '0', '0'), +('12', '11', '22', '9246', '0', '0'), +('12', '11', '22', '21509', '0', '0'), +('12', '11', '22', '8007', '0', '0'), +('12', '11', '1', '14702', '2350', '0'), +('12', '11', '1', '30361', '2040', '0'), +('12', '11', '1', '14701', '1862', '0'), +('12', '11', '1', '10321', '600', '0'), +('12', '11', '2', '10143', '3368', '0'), +('12', '11', '2', '1271', '2880', '0'), +('12', '11', '2', '30363', '2700', '0'), +('12', '11', '2', '1225', '1602', '0'), +('12', '11', '3', '1272', '1301', '0'), +('12', '11', '3', '11052', '1196', '0'), +('12', '11', '3', '1212', '998', '0'), +('12', '11', '3', '14706', '990', '0'), +('12', '11', '5', '14703', '3850', '0'), +('12', '11', '5', '27710', '3429', '0'), +('12', '11', '5', '14556', '3018', '0'), +('12', '11', '5', '30362', '2340', '0'), +('12', '11', '8', '11603', '6028', '0'), +('12', '11', '8', '2349', '2154', '0'), +('12', '11', '8', '11621', '1021', '0'), +('12', '11', '8', '1216', '1011', '0'), +('12', '11', '6', '1557', '5310', '0'), +('12', '11', '6', '1905', '3043', '0'), +('12', '11', '6', '1542', '2889', '0'), +('12', '11', '6', '1273', '1779', '0'), +('12', '11', '17', '1253', '6075', '0'), +('12', '11', '17', '1644', '5565', '0'), +('12', '11', '17', '11641', '4777', '0'), +('12', '11', '17', '1357', '3468', '0'), +('12', '11', '7', '1362', '1624', '0'), +('12', '11', '7', '1321', '1146', '0'), +('12', '11', '7', '1227', '1082', '0'), +('12', '11', '7', '1648', '1023', '0'), +('12', '11', '9', '12803', '3107', '0'), +('12', '11', '9', '4344', '1251', '0'), +('12', '11', '9', '10408', '1202', '0'), +('12', '11', '9', '1649', '1157', '0'), +('12', '11', '15', '11686', '3432', '0'), +('12', '11', '15', '10150', '1804', '0'), +('12', '11', '15', '10163', '1500', '0'), +('12', '11', '15', '14651', '1424', '0'), +('12', '11', '20', '11666', '5305', '0'), +('12', '11', '20', '2742', '3093', '0'), +('12', '11', '20', '1217', '1006', '0'), +('12', '11', '20', '1647', '934', '0'), +('12', '11', '12', '2923', '2074', '0'), +('12', '11', '12', '20655', '1966', '0'), +('12', '11', '12', '1229', '1790', '0'), +('12', '11', '12', '1404', '1512', '0'), +('12', '11', '18', '1651', '974', '0'), +('12', '11', '18', '4410', '742', '0'), +('12', '11', '18', '1230', '492', '0'), +('12', '11', '18', '1221', '454', '0'), +('12', '11', '19', '68239', '1563', '0'), +('12', '11', '19', '1652', '1234', '0'), +('12', '11', '19', '1368', '1216', '0'), +('12', '11', '19', '4407', '778', '0'), +('12', '11', '13', '20656', '4029', '0'), +('12', '11', '13', '14337', '3898', '0'), +('12', '11', '13', '9690', '2700', '0'), +('12', '11', '13', '11625', '2136', '0'), +('12', '11', '14', '20656', '4029', '0'), +('12', '11', '14', '10219', '3681', '0'), +('12', '11', '14', '9690', '2700', '0'), +('12', '11', '14', '11625', '2136', '0'), +('12', '11', '11', '13353', '1500', '0'), +('12', '11', '11', '14762', '1404', '0'), +('12', '11', '11', '9246', '809', '0'), +('12', '11', '11', '20677', '450', '0'), +('12', '12', '22', '10323', '0', '0'), +('12', '12', '22', '9246', '0', '0'), +('12', '12', '22', '21509', '0', '0'), +('12', '12', '22', '8007', '0', '0'), +('12', '12', '1', '14702', '2350', '0'), +('12', '12', '1', '30361', '2040', '0'), +('12', '12', '1', '14701', '1862', '0'), +('12', '12', '1', '10082', '618', '0'), +('12', '12', '2', '10143', '3368', '0'), +('12', '12', '2', '1271', '2938', '0'), +('12', '12', '2', '30363', '2700', '0'), +('12', '12', '2', '1225', '1654', '0'), +('12', '12', '3', '1272', '1366', '0'), +('12', '12', '3', '11052', '1305', '0'), +('12', '12', '3', '1212', '1005', '0'), +('12', '12', '3', '14705', '990', '0'), +('12', '12', '5', '14703', '3850', '0'), +('12', '12', '5', '27710', '3465', '0'), +('12', '12', '5', '14556', '3018', '0'), +('12', '12', '5', '30362', '2340', '0'), +('12', '12', '8', '11603', '6093', '0'), +('12', '12', '8', '2349', '2154', '0'), +('12', '12', '8', '11621', '1021', '0'), +('12', '12', '8', '1216', '1018', '0'), +('12', '12', '6', '1557', '5310', '0'), +('12', '12', '6', '1905', '3045', '0'), +('12', '12', '6', '1542', '2954', '0'), +('12', '12', '6', '1273', '1815', '0'), +('12', '12', '17', '1253', '6077', '0'), +('12', '12', '17', '1644', '5601', '0'), +('12', '12', '17', '11641', '4886', '0'), +('12', '12', '17', '1357', '3468', '0'), +('12', '12', '7', '1362', '1624', '0'), +('12', '12', '7', '1321', '1146', '0'), +('12', '12', '7', '1227', '1133', '0'), +('12', '12', '7', '1648', '1059', '0'), +('12', '12', '9', '12803', '3071', '0'), +('12', '12', '9', '4344', '1251', '0'), +('12', '12', '9', '10408', '1202', '0'), +('12', '12', '9', '1649', '1179', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '12', '15', '11686', '3469', '0'), +('12', '12', '15', '10150', '1804', '0'), +('12', '12', '15', '10163', '1500', '0'), +('12', '12', '15', '14651', '1424', '0'), +('12', '12', '20', '11666', '5307', '0'), +('12', '12', '20', '2742', '3095', '0'), +('12', '12', '20', '1217', '1014', '0'), +('12', '12', '20', '1647', '934', '0'), +('12', '12', '12', '2923', '2074', '0'), +('12', '12', '12', '20655', '1981', '0'), +('12', '12', '12', '1229', '1840', '0'), +('12', '12', '12', '1404', '1512', '0'), +('12', '12', '18', '1651', '996', '0'), +('12', '12', '18', '4410', '742', '0'), +('12', '12', '18', '1230', '493', '0'), +('12', '12', '18', '1221', '454', '0'), +('12', '12', '19', '68239', '1584', '0'), +('12', '12', '19', '1652', '1234', '0'), +('12', '12', '19', '1368', '1216', '0'), +('12', '12', '19', '4407', '843', '0'), +('12', '12', '13', '20656', '4065', '0'), +('12', '12', '13', '14337', '3971', '0'), +('12', '12', '13', '9690', '2700', '0'), +('12', '12', '13', '13400', '2148', '0'), +('12', '12', '14', '20656', '4065', '0'), +('12', '12', '14', '10219', '3681', '0'), +('12', '12', '14', '9690', '2700', '0'), +('12', '12', '14', '11625', '2138', '0'), +('12', '12', '11', '13353', '1500', '0'), +('12', '12', '11', '14762', '1404', '0'), +('12', '12', '11', '9246', '882', '0'), +('12', '12', '11', '20677', '450', '0'), +('12', '13', '22', '10323', '0', '0'), +('12', '13', '22', '9246', '0', '0'), +('12', '13', '22', '21509', '0', '0'), +('12', '13', '22', '8007', '0', '0'), +('12', '13', '1', '14702', '2350', '0'), +('12', '13', '1', '30361', '2040', '0'), +('12', '13', '1', '14701', '1862', '0'), +('12', '13', '1', '10082', '662', '0'), +('12', '13', '2', '10143', '3368', '0'), +('12', '13', '2', '1271', '2996', '0'), +('12', '13', '2', '30363', '2700', '0'), +('12', '13', '2', '1225', '1705', '0'), +('12', '13', '3', '1272', '1432', '0'), +('12', '13', '3', '11052', '1413', '0'), +('12', '13', '3', '1212', '1012', '0'), +('12', '13', '3', '14705', '990', '0'), +('12', '13', '5', '14703', '3850', '0'), +('12', '13', '5', '27710', '3501', '0'), +('12', '13', '5', '14556', '3018', '0'), +('12', '13', '5', '30362', '2340', '0'), +('12', '13', '8', '11603', '6158', '0'), +('12', '13', '8', '2349', '2154', '0'), +('12', '13', '8', '1216', '1026', '0'), +('12', '13', '8', '11621', '1021', '0'), +('12', '13', '6', '1557', '5310', '0'), +('12', '13', '6', '1905', '3046', '0'), +('12', '13', '6', '1542', '3019', '0'), +('12', '13', '6', '1273', '1851', '0'), +('12', '13', '17', '1253', '6080', '0'), +('12', '13', '17', '1644', '5638', '0'), +('12', '13', '17', '11641', '4995', '0'), +('12', '13', '17', '1357', '3468', '0'), +('12', '13', '7', '1362', '1624', '0'), +('12', '13', '7', '1227', '1184', '0'), +('12', '13', '7', '1321', '1146', '0'), +('12', '13', '7', '1218', '1104', '0'), +('12', '13', '9', '12803', '3035', '0'), +('12', '13', '9', '4344', '1251', '0'), +('12', '13', '9', '10408', '1202', '0'), +('12', '13', '9', '1649', '1201', '0'), +('12', '13', '15', '11686', '3505', '0'), +('12', '13', '15', '10150', '1804', '0'), +('12', '13', '15', '10163', '1500', '0'), +('12', '13', '15', '14651', '1424', '0'), +('12', '13', '20', '11666', '5309', '0'), +('12', '13', '20', '2742', '3098', '0'), +('12', '13', '20', '1217', '1021', '0'), +('12', '13', '20', '1647', '934', '0'), +('12', '13', '12', '2923', '2074', '0'), +('12', '13', '12', '20655', '1996', '0'), +('12', '13', '12', '1229', '1891', '0'), +('12', '13', '12', '1404', '1512', '0'), +('12', '13', '18', '1651', '1018', '0'), +('12', '13', '18', '4410', '742', '0'), +('12', '13', '18', '1230', '493', '0'), +('12', '13', '18', '1221', '454', '0'), +('12', '13', '19', '68239', '1606', '0'), +('12', '13', '19', '1652', '1234', '0'), +('12', '13', '19', '1368', '1216', '0'), +('12', '13', '19', '4407', '908', '0'), +('12', '13', '13', '20656', '4101', '0'), +('12', '13', '13', '14337', '4043', '0'), +('12', '13', '13', '9690', '2700', '0'), +('12', '13', '13', '13400', '2177', '0'), +('12', '13', '14', '20656', '4101', '0'), +('12', '13', '14', '10219', '3681', '0'), +('12', '13', '14', '9690', '2700', '0'), +('12', '13', '14', '11625', '2140', '0'), +('12', '13', '11', '13353', '1500', '0'), +('12', '13', '11', '14762', '1404', '0'), +('12', '13', '11', '9246', '954', '0'), +('12', '13', '11', '20677', '450', '0'), +('12', '14', '22', '10323', '0', '0'), +('12', '14', '22', '9246', '0', '0'), +('12', '14', '22', '21509', '0', '0'), +('12', '14', '22', '8007', '0', '0'), +('12', '14', '1', '14702', '2350', '0'), +('12', '14', '1', '30361', '2040', '0'), +('12', '14', '1', '14701', '1862', '0'), +('12', '14', '1', '10082', '705', '0'), +('12', '14', '2', '10143', '3368', '0'), +('12', '14', '2', '1271', '3054', '0'), +('12', '14', '2', '30363', '2700', '0'), +('12', '14', '2', '1225', '1757', '0'), +('12', '14', '3', '11052', '1522', '0'), +('12', '14', '3', '1272', '1497', '0'), +('12', '14', '3', '1212', '1020', '0'), +('12', '14', '3', '14705', '990', '0'), +('12', '14', '5', '14703', '3850', '0'), +('12', '14', '5', '27710', '3538', '0'), +('12', '14', '5', '14556', '3018', '0'), +('12', '14', '5', '30362', '2340', '0'), +('12', '14', '8', '11603', '6224', '0'), +('12', '14', '8', '2349', '2154', '0'), +('12', '14', '8', '1216', '1033', '0'), +('12', '14', '8', '11621', '1021', '0'), +('12', '14', '6', '1557', '5310', '0'), +('12', '14', '6', '1542', '3085', '0'), +('12', '14', '6', '1905', '3047', '0'), +('12', '14', '6', '1273', '1888', '0'), +('12', '14', '17', '1253', '6082', '0'), +('12', '14', '17', '1644', '5674', '0'), +('12', '14', '17', '11641', '5104', '0'), +('12', '14', '17', '1214', '3535', '0'), +('12', '14', '7', '1362', '1624', '0'), +('12', '14', '7', '1227', '1234', '0'), +('12', '14', '7', '1218', '1154', '0'), +('12', '14', '7', '1321', '1146', '0'), +('12', '14', '9', '12803', '2999', '0'), +('12', '14', '9', '4344', '1251', '0'), +('12', '14', '9', '1649', '1223', '0'), +('12', '14', '9', '10408', '1202', '0'), +('12', '14', '15', '11686', '3541', '0'), +('12', '14', '15', '10150', '1804', '0'), +('12', '14', '15', '10163', '1500', '0'), +('12', '14', '15', '14651', '1424', '0'), +('12', '14', '20', '11666', '5311', '0'), +('12', '14', '20', '2742', '3100', '0'), +('12', '14', '20', '1217', '1028', '0'), +('12', '14', '20', '1647', '934', '0'), +('12', '14', '12', '2923', '2074', '0'), +('12', '14', '12', '20655', '2011', '0'), +('12', '14', '12', '1229', '1942', '0'), +('12', '14', '12', '1404', '1512', '0'), +('12', '14', '18', '1651', '1039', '0'), +('12', '14', '18', '4410', '742', '0'), +('12', '14', '18', '1230', '494', '0'), +('12', '14', '18', '1221', '454', '0'), +('12', '14', '19', '68239', '1628', '0'), +('12', '14', '19', '1652', '1234', '0'), +('12', '14', '19', '1368', '1216', '0'), +('12', '14', '19', '4407', '973', '0'), +('12', '14', '13', '20656', '4138', '0'), +('12', '14', '13', '14337', '4116', '0'), +('12', '14', '13', '9690', '2700', '0'), +('12', '14', '13', '13400', '2206', '0'), +('12', '14', '14', '20656', '4138', '0'), +('12', '14', '14', '10219', '3681', '0'), +('12', '14', '14', '9690', '2700', '0'), +('12', '14', '14', '11625', '2142', '0'), +('12', '14', '11', '13353', '1500', '0'), +('12', '14', '11', '14762', '1404', '0'), +('12', '14', '11', '9246', '1027', '0'), +('12', '14', '11', '20677', '450', '0'), +('12', '15', '22', '10323', '0', '0'), +('12', '15', '22', '9246', '0', '0'), +('12', '15', '22', '21509', '0', '0'), +('12', '15', '22', '8007', '0', '0'), +('12', '15', '1', '14702', '2350', '0'), +('12', '15', '1', '30361', '2040', '0'), +('12', '15', '1', '14701', '1862', '0'), +('12', '15', '1', '10082', '749', '0'), +('12', '15', '2', '10143', '3368', '0'), +('12', '15', '2', '1271', '3112', '0'), +('12', '15', '2', '30363', '2700', '0'), +('12', '15', '2', '1225', '1809', '0'), +('12', '15', '3', '11052', '1631', '0'), +('12', '15', '3', '1272', '1562', '0'), +('12', '15', '3', '1212', '1027', '0'), +('12', '15', '3', '14705', '990', '0'), +('12', '15', '5', '14703', '3850', '0'), +('12', '15', '5', '27710', '3574', '0'), +('12', '15', '5', '14556', '3018', '0'), +('12', '15', '5', '30362', '2340', '0'), +('12', '15', '8', '11603', '6289', '0'), +('12', '15', '8', '2349', '2154', '0'), +('12', '15', '8', '1216', '1040', '0'), +('12', '15', '8', '11621', '1021', '0'), +('12', '15', '6', '1557', '5310', '0'), +('12', '15', '6', '1542', '3150', '0'), +('12', '15', '6', '1905', '3048', '0'), +('12', '15', '6', '1273', '1924', '0'), +('12', '15', '17', '1253', '6085', '0'), +('12', '15', '17', '1644', '5710', '0'), +('12', '15', '17', '11641', '5212', '0'), +('12', '15', '17', '1214', '3632', '0'), +('12', '15', '7', '1362', '1624', '0'), +('12', '15', '7', '1227', '1285', '0'), +('12', '15', '7', '1218', '1205', '0'), +('12', '15', '7', '1648', '1168', '0'), +('12', '15', '9', '12803', '2962', '0'), +('12', '15', '9', '4344', '1251', '0'), +('12', '15', '9', '1649', '1244', '0'), +('12', '15', '9', '10408', '1202', '0'), +('12', '15', '15', '11686', '3577', '0'), +('12', '15', '15', '10150', '1804', '0'), +('12', '15', '15', '10163', '1500', '0'), +('12', '15', '15', '14651', '1424', '0'), +('12', '15', '20', '11666', '5312', '0'), +('12', '15', '20', '2742', '3103', '0'), +('12', '15', '20', '1217', '1035', '0'), +('12', '15', '20', '1647', '934', '0'), +('12', '15', '12', '2923', '2074', '0'), +('12', '15', '12', '20655', '2026', '0'), +('12', '15', '12', '1229', '1992', '0'), +('12', '15', '12', '1404', '1512', '0'), +('12', '15', '18', '1651', '1061', '0'), +('12', '15', '18', '4410', '742', '0'), +('12', '15', '18', '1230', '495', '0'), +('12', '15', '18', '1221', '454', '0'), +('12', '15', '19', '68239', '1650', '0'), +('12', '15', '19', '1652', '1234', '0'), +('12', '15', '19', '1368', '1216', '0'), +('12', '15', '19', '4407', '1039', '0'), +('12', '15', '13', '14337', '4188', '0'), +('12', '15', '13', '20656', '4174', '0'), +('12', '15', '13', '9690', '2700', '0'), +('12', '15', '13', '13400', '2235', '0'), +('12', '15', '14', '20656', '4174', '0'), +('12', '15', '14', '10219', '3681', '0'), +('12', '15', '14', '9690', '2700', '0'), +('12', '15', '14', '11625', '2145', '0'), +('12', '15', '11', '13353', '1500', '0'), +('12', '15', '11', '14762', '1404', '0'), +('12', '15', '11', '9246', '1099', '0'), +('12', '15', '11', '20677', '450', '0'), +('12', '16', '22', '10323', '0', '0'), +('12', '16', '22', '9246', '0', '0'), +('12', '16', '22', '21509', '0', '0'), +('12', '16', '22', '8007', '0', '0'), +('12', '16', '1', '14702', '2350', '0'), +('12', '16', '1', '30361', '2040', '0'), +('12', '16', '1', '14701', '1862', '0'), +('12', '16', '1', '10082', '792', '0'), +('12', '16', '2', '10143', '3368', '0'), +('12', '16', '2', '1271', '3170', '0'), +('12', '16', '2', '30363', '2700', '0'), +('12', '16', '2', '1225', '1861', '0'), +('12', '16', '3', '11052', '1740', '0'), +('12', '16', '3', '1272', '1627', '0'), +('12', '16', '3', '1212', '1034', '0'), +('12', '16', '3', '14705', '990', '0'), +('12', '16', '5', '14703', '3850', '0'), +('12', '16', '5', '27710', '3610', '0'), +('12', '16', '5', '14556', '3018', '0'), +('12', '16', '5', '30362', '2340', '0'), +('12', '16', '8', '11603', '6354', '0'), +('12', '16', '8', '2349', '2154', '0'), +('12', '16', '8', '1216', '1047', '0'), +('12', '16', '8', '11621', '1021', '0'), +('12', '16', '6', '1557', '5310', '0'), +('12', '16', '6', '1542', '3215', '0'), +('12', '16', '6', '1905', '3050', '0'), +('12', '16', '6', '1273', '1960', '0'), +('12', '16', '17', '1253', '6087', '0'), +('12', '16', '17', '1644', '5746', '0'), +('12', '16', '17', '11641', '5321', '0'), +('12', '16', '17', '1214', '3730', '0'), +('12', '16', '7', '1362', '1624', '0'), +('12', '16', '7', '1227', '1336', '0'), +('12', '16', '7', '1218', '1256', '0'), +('12', '16', '7', '1648', '1204', '0'), +('12', '16', '9', '12803', '2926', '0'), +('12', '16', '9', '1649', '1266', '0'), +('12', '16', '9', '4344', '1251', '0'), +('12', '16', '9', '10408', '1202', '0'), +('12', '16', '15', '11686', '3614', '0'), +('12', '16', '15', '10150', '1804', '0'), +('12', '16', '15', '10163', '1500', '0'), +('12', '16', '15', '14651', '1424', '0'), +('12', '16', '20', '11666', '5314', '0'), +('12', '16', '20', '2742', '3105', '0'), +('12', '16', '20', '1217', '1043', '0'), +('12', '16', '20', '1647', '934', '0'), +('12', '16', '12', '2923', '2074', '0'), +('12', '16', '12', '1229', '2043', '0'), +('12', '16', '12', '20655', '2041', '0'), +('12', '16', '12', '1404', '1512', '0'), +('12', '16', '18', '1651', '1083', '0'), +('12', '16', '18', '4410', '742', '0'), +('12', '16', '18', '1230', '495', '0'), +('12', '16', '18', '1221', '454', '0'), +('12', '16', '19', '68239', '1671', '0'), +('12', '16', '19', '1652', '1234', '0'), +('12', '16', '19', '1368', '1216', '0'), +('12', '16', '19', '4407', '1104', '0'), +('12', '16', '13', '14337', '4261', '0'), +('12', '16', '13', '20656', '4210', '0'), +('12', '16', '13', '9690', '2700', '0'), +('12', '16', '13', '13400', '2264', '0'), +('12', '16', '14', '20656', '4210', '0'), +('12', '16', '14', '10219', '3681', '0'), +('12', '16', '14', '9690', '2700', '0'), +('12', '16', '14', '11625', '2147', '0'), +('12', '16', '11', '13353', '1500', '0'), +('12', '16', '11', '14762', '1404', '0'), +('12', '16', '11', '9246', '1172', '0'), +('12', '16', '11', '20677', '450', '0'), +('12', '17', '22', '10323', '0', '0'), +('12', '17', '22', '9246', '0', '0'), +('12', '17', '22', '21509', '0', '0'), +('12', '17', '22', '8007', '0', '0'), +('12', '17', '1', '14702', '2350', '0'), +('12', '17', '1', '30361', '2040', '0'), +('12', '17', '1', '14701', '1862', '0'), +('12', '17', '1', '10082', '836', '0'), +('12', '17', '2', '10143', '3368', '0'), +('12', '17', '2', '1271', '3228', '0'), +('12', '17', '2', '30363', '2700', '0'), +('12', '17', '2', '1225', '1913', '0'), +('12', '17', '3', '11052', '1848', '0'), +('12', '17', '3', '1272', '1692', '0'), +('12', '17', '3', '1212', '1041', '0'), +('12', '17', '3', '14705', '990', '0'), +('12', '17', '5', '14703', '3850', '0'), +('12', '17', '5', '27710', '3646', '0'), +('12', '17', '5', '14556', '3018', '0'), +('12', '17', '5', '30362', '2340', '0'), +('12', '17', '8', '11603', '6419', '0'), +('12', '17', '8', '2349', '2154', '0'), +('12', '17', '8', '1216', '1055', '0'), +('12', '17', '8', '11621', '1021', '0'), +('12', '17', '6', '1557', '5310', '0'), +('12', '17', '6', '1542', '3280', '0'), +('12', '17', '6', '1905', '3051', '0'), +('12', '17', '6', '1273', '1996', '0'), +('12', '17', '17', '1253', '6089', '0'), +('12', '17', '17', '1644', '5783', '0'), +('12', '17', '17', '11641', '5430', '0'), +('12', '17', '17', '1214', '3827', '0'), +('12', '17', '7', '1362', '1624', '0'), +('12', '17', '7', '1227', '1387', '0'), +('12', '17', '7', '1218', '1307', '0'), +('12', '17', '7', '1648', '1240', '0'), +('12', '17', '9', '12803', '2890', '0'), +('12', '17', '9', '1649', '1288', '0'), +('12', '17', '9', '4344', '1251', '0'), +('12', '17', '9', '10408', '1202', '0'), +('12', '17', '15', '11686', '3650', '0'), +('12', '17', '15', '10150', '1804', '0'), +('12', '17', '15', '10163', '1500', '0'), +('12', '17', '15', '14651', '1424', '0'), +('12', '17', '20', '11666', '5316', '0'), +('12', '17', '20', '2742', '3108', '0'), +('12', '17', '20', '1217', '1050', '0'), +('12', '17', '20', '1647', '934', '0'), +('12', '17', '12', '1229', '2094', '0'), +('12', '17', '12', '2923', '2074', '0'), +('12', '17', '12', '20655', '2056', '0'), +('12', '17', '12', '1404', '1512', '0'), +('12', '17', '18', '1651', '1105', '0'), +('12', '17', '18', '4410', '742', '0'), +('12', '17', '18', '1230', '496', '0'), +('12', '17', '18', '1221', '454', '0'), +('12', '17', '19', '68239', '1693', '0'), +('12', '17', '19', '1652', '1234', '0'), +('12', '17', '19', '1368', '1216', '0'), +('12', '17', '19', '4407', '1169', '0'), +('12', '17', '13', '14337', '4333', '0'), +('12', '17', '13', '20656', '4246', '0'), +('12', '17', '13', '9690', '2700', '0'), +('12', '17', '13', '13400', '2293', '0'), +('12', '17', '14', '20656', '4246', '0'), +('12', '17', '14', '10219', '3681', '0'), +('12', '17', '14', '9690', '2700', '0'), +('12', '17', '14', '11625', '2149', '0'), +('12', '17', '11', '13353', '1500', '0'), +('12', '17', '11', '14762', '1404', '0'), +('12', '17', '11', '9246', '1244', '0'), +('12', '17', '11', '20677', '450', '0'), +('12', '18', '22', '10323', '0', '0'), +('12', '18', '22', '9246', '0', '0'), +('12', '18', '22', '21509', '0', '0'), +('12', '18', '22', '8007', '0', '0'), +('12', '18', '1', '14702', '2350', '0'), +('12', '18', '1', '30361', '2040', '0'), +('12', '18', '1', '14701', '1862', '0'), +('12', '18', '1', '10082', '879', '0'), +('12', '18', '2', '10143', '3368', '0'), +('12', '18', '2', '1271', '3286', '0'), +('12', '18', '2', '30363', '2700', '0'), +('12', '18', '2', '1225', '1965', '0'), +('12', '18', '3', '11052', '1957', '0'), +('12', '18', '3', '1272', '1758', '0'), +('12', '18', '3', '1212', '1049', '0'), +('12', '18', '3', '14706', '990', '0'), +('12', '18', '5', '14703', '3850', '0'), +('12', '18', '5', '27710', '3683', '0'), +('12', '18', '5', '14556', '3018', '0'), +('12', '18', '5', '30362', '2340', '0'), +('12', '18', '8', '11603', '6485', '0'), +('12', '18', '8', '2349', '2154', '0'), +('12', '18', '8', '1216', '1062', '0'), +('12', '18', '8', '11621', '1021', '0'), +('12', '18', '6', '1557', '5310', '0'), +('12', '18', '6', '1542', '3345', '0'), +('12', '18', '6', '1905', '3052', '0'), +('12', '18', '6', '1273', '2033', '0'), +('12', '18', '17', '1253', '6092', '0'), +('12', '18', '17', '1644', '5819', '0'), +('12', '18', '17', '11641', '5539', '0'), +('12', '18', '17', '1214', '3924', '0'), +('12', '18', '7', '1362', '1624', '0'), +('12', '18', '7', '1227', '1437', '0'), +('12', '18', '7', '1218', '1357', '0'), +('12', '18', '7', '1648', '1276', '0'), +('12', '18', '9', '12803', '2854', '0'), +('12', '18', '9', '1649', '1310', '0'), +('12', '18', '9', '4344', '1251', '0'), +('12', '18', '9', '10408', '1202', '0'), +('12', '18', '15', '11686', '3686', '0'), +('12', '18', '15', '10150', '1804', '0'), +('12', '18', '15', '10163', '1500', '0'), +('12', '18', '15', '14651', '1424', '0'), +('12', '18', '20', '11666', '5317', '0'), +('12', '18', '20', '2742', '3110', '0'), +('12', '18', '20', '1217', '1057', '0'), +('12', '18', '20', '1647', '934', '0'), +('12', '18', '12', '1229', '2145', '0'), +('12', '18', '12', '2923', '2074', '0'), +('12', '18', '12', '20655', '2071', '0'), +('12', '18', '12', '1404', '1512', '0'), +('12', '18', '18', '1651', '1126', '0'), +('12', '18', '18', '4410', '742', '0'), +('12', '18', '18', '1230', '497', '0'), +('12', '18', '18', '1221', '454', '0'), +('12', '18', '19', '68239', '1715', '0'), +('12', '18', '19', '1652', '1234', '0'), +('12', '18', '19', '4407', '1234', '0'), +('12', '18', '19', '1368', '1216', '0'), +('12', '18', '13', '14337', '4406', '0'), +('12', '18', '13', '20656', '4283', '0'), +('12', '18', '13', '9690', '2700', '0'), +('12', '18', '13', '13400', '2322', '0'), +('12', '18', '14', '20656', '4283', '0'), +('12', '18', '14', '10219', '3681', '0'), +('12', '18', '14', '9690', '2700', '0'), +('12', '18', '14', '6359', '2158', '0'), +('12', '18', '11', '13353', '1500', '0'), +('12', '18', '11', '14762', '1404', '0'), +('12', '18', '11', '9246', '1317', '0'), +('12', '18', '11', '20677', '450', '0'), +('12', '19', '22', '10323', '0', '0'), +('12', '19', '22', '9246', '0', '0'), +('12', '19', '22', '21509', '0', '0'), +('12', '19', '22', '8007', '0', '0'), +('12', '19', '1', '14702', '2350', '0'), +('12', '19', '1', '30361', '2040', '0'), +('12', '19', '1', '14701', '1862', '0'), +('12', '19', '1', '10082', '923', '0'), +('12', '19', '2', '10143', '3368', '0'), +('12', '19', '2', '1271', '3344', '0'), +('12', '19', '2', '30363', '2700', '0'), +('12', '19', '2', '1225', '2017', '0'), +('12', '19', '3', '11052', '2066', '0'), +('12', '19', '3', '1272', '1823', '0'), +('12', '19', '3', '1212', '1056', '0'), +('12', '19', '3', '4505', '994', '0'), +('12', '19', '5', '14703', '3850', '0'), +('12', '19', '5', '27710', '3719', '0'), +('12', '19', '5', '14556', '3018', '0'), +('12', '19', '5', '30362', '2340', '0'), +('12', '19', '8', '11603', '6550', '0'), +('12', '19', '8', '2349', '2154', '0'), +('12', '19', '8', '1216', '1069', '0'), +('12', '19', '8', '11621', '1021', '0'), +('12', '19', '6', '1557', '5310', '0'), +('12', '19', '6', '1542', '3411', '0'), +('12', '19', '6', '1905', '3053', '0'), +('12', '19', '6', '1273', '2069', '0'), +('12', '19', '17', '1253', '6094', '0'), +('12', '19', '17', '1644', '5855', '0'), +('12', '19', '17', '11641', '5647', '0'), +('12', '19', '17', '1214', '4022', '0'), +('12', '19', '7', '1362', '1624', '0'), +('12', '19', '7', '1227', '1488', '0'), +('12', '19', '7', '1218', '1408', '0'), +('12', '19', '7', '1648', '1313', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '19', '9', '12803', '2817', '0'), +('12', '19', '9', '1649', '1331', '0'), +('12', '19', '9', '4344', '1251', '0'), +('12', '19', '9', '10408', '1202', '0'), +('12', '19', '15', '11686', '3722', '0'), +('12', '19', '15', '10150', '1804', '0'), +('12', '19', '15', '10163', '1500', '0'), +('12', '19', '15', '14651', '1424', '0'), +('12', '19', '20', '11666', '5319', '0'), +('12', '19', '20', '2742', '3112', '0'), +('12', '19', '20', '1217', '1064', '0'), +('12', '19', '20', '1647', '934', '0'), +('12', '19', '12', '1229', '2195', '0'), +('12', '19', '12', '20655', '2086', '0'), +('12', '19', '12', '2923', '2074', '0'), +('12', '19', '12', '1404', '1512', '0'), +('12', '19', '18', '1651', '1148', '0'), +('12', '19', '18', '4410', '742', '0'), +('12', '19', '18', '1230', '498', '0'), +('12', '19', '18', '1221', '454', '0'), +('12', '19', '19', '68239', '1737', '0'), +('12', '19', '19', '4407', '1300', '0'), +('12', '19', '19', '1652', '1234', '0'), +('12', '19', '19', '1368', '1216', '0'), +('12', '19', '13', '14337', '4478', '0'), +('12', '19', '13', '20656', '4319', '0'), +('12', '19', '13', '9690', '2700', '0'), +('12', '19', '13', '13400', '2351', '0'), +('12', '19', '14', '20656', '4319', '0'), +('12', '19', '14', '10219', '3681', '0'), +('12', '19', '14', '9690', '2700', '0'), +('12', '19', '14', '6359', '2230', '0'), +('12', '19', '11', '13353', '1500', '0'), +('12', '19', '11', '14762', '1404', '0'), +('12', '19', '11', '9246', '1389', '0'), +('12', '19', '11', '20677', '450', '0'), +('12', '20', '22', '10323', '0', '0'), +('12', '20', '22', '9246', '0', '0'), +('12', '20', '22', '21509', '0', '0'), +('12', '20', '22', '8007', '0', '0'), +('12', '20', '1', '14702', '2350', '0'), +('12', '20', '1', '30361', '2040', '0'), +('12', '20', '1', '14701', '1862', '0'), +('12', '20', '1', '10082', '966', '0'), +('12', '20', '2', '1271', '3402', '0'), +('12', '20', '2', '10143', '3368', '0'), +('12', '20', '2', '30363', '2700', '0'), +('12', '20', '2', '1225', '2069', '0'), +('12', '20', '3', '11052', '2174', '0'), +('12', '20', '3', '1272', '1888', '0'), +('12', '20', '3', '1212', '1063', '0'), +('12', '20', '3', '4505', '1045', '0'), +('12', '20', '5', '14703', '3850', '0'), +('12', '20', '5', '27710', '3755', '0'), +('12', '20', '5', '14556', '3018', '0'), +('12', '20', '5', '30362', '2340', '0'), +('12', '20', '8', '11603', '6615', '0'), +('12', '20', '8', '2349', '2154', '0'), +('12', '20', '8', '1216', '1076', '0'), +('12', '20', '8', '11621', '1021', '0'), +('12', '20', '6', '1557', '5310', '0'), +('12', '20', '6', '1542', '3476', '0'), +('12', '20', '6', '1905', '3054', '0'), +('12', '20', '6', '1273', '2105', '0'), +('12', '20', '17', '1253', '6097', '0'), +('12', '20', '17', '1644', '5891', '0'), +('12', '20', '17', '11641', '5756', '0'), +('12', '20', '17', '1214', '4119', '0'), +('12', '20', '7', '1362', '1624', '0'), +('12', '20', '7', '1227', '1539', '0'), +('12', '20', '7', '1218', '1459', '0'), +('12', '20', '7', '1648', '1349', '0'), +('12', '20', '9', '12803', '2781', '0'), +('12', '20', '9', '1649', '1353', '0'), +('12', '20', '9', '4344', '1251', '0'), +('12', '20', '9', '10408', '1202', '0'), +('12', '20', '15', '11686', '3759', '0'), +('12', '20', '15', '10150', '1804', '0'), +('12', '20', '15', '10163', '1500', '0'), +('12', '20', '15', '14651', '1424', '0'), +('12', '20', '20', '11666', '5321', '0'), +('12', '20', '20', '2742', '3115', '0'), +('12', '20', '20', '1217', '1072', '0'), +('12', '20', '20', '1647', '934', '0'), +('12', '20', '12', '1229', '2246', '0'), +('12', '20', '12', '20655', '2101', '0'), +('12', '20', '12', '2923', '2074', '0'), +('12', '20', '12', '1404', '1512', '0'), +('12', '20', '18', '1651', '1170', '0'), +('12', '20', '18', '4410', '742', '0'), +('12', '20', '18', '1230', '498', '0'), +('12', '20', '18', '1221', '454', '0'), +('12', '20', '19', '68239', '1758', '0'), +('12', '20', '19', '4407', '1365', '0'), +('12', '20', '19', '1652', '1234', '0'), +('12', '20', '19', '1368', '1216', '0'), +('12', '20', '13', '14337', '4551', '0'), +('12', '20', '13', '20656', '4355', '0'), +('12', '20', '13', '9690', '2700', '0'), +('12', '20', '13', '13400', '2380', '0'), +('12', '20', '14', '20656', '4355', '0'), +('12', '20', '14', '10219', '3681', '0'), +('12', '20', '14', '9690', '2700', '0'), +('12', '20', '14', '6359', '2303', '0'), +('12', '20', '11', '13353', '1500', '0'), +('12', '20', '11', '9246', '1462', '0'), +('12', '20', '11', '14762', '1404', '0'), +('12', '20', '11', '20677', '450', '0'), +('12', '21', '22', '10323', '0', '0'), +('12', '21', '22', '9246', '0', '0'), +('12', '21', '22', '21509', '0', '0'), +('12', '21', '22', '8007', '0', '0'), +('12', '21', '1', '14702', '2350', '0'), +('12', '21', '1', '30361', '2040', '0'), +('12', '21', '1', '14701', '1862', '0'), +('12', '21', '1', '10082', '1009', '0'), +('12', '21', '2', '1271', '3460', '0'), +('12', '21', '2', '10143', '3368', '0'), +('12', '21', '2', '30363', '2700', '0'), +('12', '21', '2', '1225', '2121', '0'), +('12', '21', '3', '11052', '2283', '0'), +('12', '21', '3', '1272', '1953', '0'), +('12', '21', '3', '4505', '1096', '0'), +('12', '21', '3', '1212', '1070', '0'), +('12', '21', '5', '14703', '3850', '0'), +('12', '21', '5', '27710', '3791', '0'), +('12', '21', '5', '14556', '3018', '0'), +('12', '21', '5', '30362', '2340', '0'), +('12', '21', '8', '11603', '6680', '0'), +('12', '21', '8', '2349', '2154', '0'), +('12', '21', '8', '1216', '1084', '0'), +('12', '21', '8', '11621', '1021', '0'), +('12', '21', '6', '1557', '5310', '0'), +('12', '21', '6', '1542', '3541', '0'), +('12', '21', '6', '1905', '3056', '0'), +('12', '21', '6', '1273', '2141', '0'), +('12', '21', '17', '1253', '6099', '0'), +('12', '21', '17', '1644', '5927', '0'), +('12', '21', '17', '11641', '5865', '0'), +('12', '21', '17', '1214', '4217', '0'), +('12', '21', '7', '1362', '1624', '0'), +('12', '21', '7', '1227', '1590', '0'), +('12', '21', '7', '1218', '1510', '0'), +('12', '21', '7', '1648', '1385', '0'), +('12', '21', '9', '12803', '2745', '0'), +('12', '21', '9', '1649', '1375', '0'), +('12', '21', '9', '4344', '1251', '0'), +('12', '21', '9', '10408', '1202', '0'), +('12', '21', '15', '11686', '3795', '0'), +('12', '21', '15', '10150', '1804', '0'), +('12', '21', '15', '10163', '1500', '0'), +('12', '21', '15', '14651', '1424', '0'), +('12', '21', '20', '11666', '5322', '0'), +('12', '21', '20', '2742', '3117', '0'), +('12', '21', '20', '1217', '1079', '0'), +('12', '21', '20', '1647', '934', '0'), +('12', '21', '12', '1229', '2297', '0'), +('12', '21', '12', '20655', '2116', '0'), +('12', '21', '12', '2923', '2074', '0'), +('12', '21', '12', '1404', '1512', '0'), +('12', '21', '18', '1651', '1192', '0'), +('12', '21', '18', '4410', '742', '0'), +('12', '21', '18', '1230', '499', '0'), +('12', '21', '18', '1221', '454', '0'), +('12', '21', '19', '68239', '1780', '0'), +('12', '21', '19', '4407', '1430', '0'), +('12', '21', '19', '1652', '1234', '0'), +('12', '21', '19', '1368', '1216', '0'), +('12', '21', '13', '14337', '4623', '0'), +('12', '21', '13', '20656', '4391', '0'), +('12', '21', '13', '9690', '2700', '0'), +('12', '21', '13', '13400', '2409', '0'), +('12', '21', '14', '20656', '4391', '0'), +('12', '21', '14', '10219', '3681', '0'), +('12', '21', '14', '9690', '2700', '0'), +('12', '21', '14', '6359', '2375', '0'), +('12', '21', '11', '9246', '1534', '0'), +('12', '21', '11', '13353', '1500', '0'), +('12', '21', '11', '14762', '1404', '0'), +('12', '21', '11', '20677', '450', '0'), +('12', '22', '22', '10323', '0', '0'), +('12', '22', '22', '9246', '0', '0'), +('12', '22', '22', '21509', '0', '0'), +('12', '22', '22', '8007', '0', '0'), +('12', '22', '1', '14702', '2350', '0'), +('12', '22', '1', '30361', '2040', '0'), +('12', '22', '1', '14701', '1862', '0'), +('12', '22', '1', '10082', '1053', '0'), +('12', '22', '2', '1271', '3518', '0'), +('12', '22', '2', '10143', '3368', '0'), +('12', '22', '2', '30363', '2700', '0'), +('12', '22', '2', '1225', '2173', '0'), +('12', '22', '3', '11052', '2392', '0'), +('12', '22', '3', '1272', '2019', '0'), +('12', '22', '3', '4505', '1146', '0'), +('12', '22', '3', '1212', '1078', '0'), +('12', '22', '5', '14703', '3850', '0'), +('12', '22', '5', '27710', '3827', '0'), +('12', '22', '5', '14556', '3018', '0'), +('12', '22', '5', '30362', '2340', '0'), +('12', '22', '8', '11603', '6746', '0'), +('12', '22', '8', '2349', '2154', '0'), +('12', '22', '8', '1216', '1091', '0'), +('12', '22', '8', '11621', '1021', '0'), +('12', '22', '6', '1557', '5310', '0'), +('12', '22', '6', '1542', '3606', '0'), +('12', '22', '6', '1905', '3057', '0'), +('12', '22', '6', '1273', '2177', '0'), +('12', '22', '17', '1253', '6101', '0'), +('12', '22', '17', '11641', '5973', '0'), +('12', '22', '17', '1644', '5964', '0'), +('12', '22', '17', '1214', '4314', '0'), +('12', '22', '7', '1227', '1640', '0'), +('12', '22', '7', '1362', '1624', '0'), +('12', '22', '7', '1218', '1560', '0'), +('12', '22', '7', '1648', '1421', '0'), +('12', '22', '9', '12803', '2709', '0'), +('12', '22', '9', '1649', '1396', '0'), +('12', '22', '9', '4344', '1251', '0'), +('12', '22', '9', '10408', '1202', '0'), +('12', '22', '15', '11686', '3831', '0'), +('12', '22', '15', '10150', '1804', '0'), +('12', '22', '15', '10163', '1500', '0'), +('12', '22', '15', '14651', '1424', '0'), +('12', '22', '20', '11666', '5324', '0'), +('12', '22', '20', '2742', '3120', '0'), +('12', '22', '20', '1217', '1086', '0'), +('12', '22', '20', '1647', '934', '0'), +('12', '22', '12', '1229', '2348', '0'), +('12', '22', '12', '20655', '2131', '0'), +('12', '22', '12', '2923', '2074', '0'), +('12', '22', '12', '1404', '1512', '0'), +('12', '22', '18', '1651', '1213', '0'), +('12', '22', '18', '4410', '742', '0'), +('12', '22', '18', '1230', '500', '0'), +('12', '22', '18', '1221', '454', '0'), +('12', '22', '19', '68239', '1802', '0'), +('12', '22', '19', '4407', '1495', '0'), +('12', '22', '19', '1652', '1234', '0'), +('12', '22', '19', '1368', '1216', '0'), +('12', '22', '13', '14337', '4696', '0'), +('12', '22', '13', '20656', '4427', '0'), +('12', '22', '13', '9690', '2700', '0'), +('12', '22', '13', '6359', '2448', '0'), +('12', '22', '14', '20656', '4427', '0'), +('12', '22', '14', '10219', '3681', '0'), +('12', '22', '14', '9690', '2700', '0'), +('12', '22', '14', '6359', '2448', '0'), +('12', '22', '11', '9246', '1607', '0'), +('12', '22', '11', '13353', '1500', '0'), +('12', '22', '11', '14762', '1404', '0'), +('12', '22', '11', '20677', '450', '0'), +('12', '23', '22', '10323', '0', '0'), +('12', '23', '22', '9246', '0', '0'), +('12', '23', '22', '21509', '0', '0'), +('12', '23', '22', '8007', '0', '0'), +('12', '23', '1', '14702', '2350', '0'), +('12', '23', '1', '30361', '2040', '0'), +('12', '23', '1', '14701', '1862', '0'), +('12', '23', '1', '10082', '1096', '0'), +('12', '23', '2', '1271', '3576', '0'), +('12', '23', '2', '10143', '3368', '0'), +('12', '23', '2', '30363', '2700', '0'), +('12', '23', '2', '1225', '2225', '0'), +('12', '23', '3', '11052', '2501', '0'), +('12', '23', '3', '1272', '2084', '0'), +('12', '23', '3', '4505', '1197', '0'), +('12', '23', '3', '1212', '1085', '0'), +('12', '23', '5', '27710', '3864', '0'), +('12', '23', '5', '14703', '3850', '0'), +('12', '23', '5', '14556', '3018', '0'), +('12', '23', '5', '30362', '2340', '0'), +('12', '23', '8', '11603', '6811', '0'), +('12', '23', '8', '2349', '2154', '0'), +('12', '23', '8', '1216', '1098', '0'), +('12', '23', '8', '1057', '1032', '0'), +('12', '23', '6', '1557', '5310', '0'), +('12', '23', '6', '1542', '3672', '0'), +('12', '23', '6', '1905', '3058', '0'), +('12', '23', '6', '1273', '2214', '0'), +('12', '23', '17', '1253', '6104', '0'), +('12', '23', '17', '11641', '6082', '0'), +('12', '23', '17', '1644', '6000', '0'), +('12', '23', '17', '1214', '4411', '0'), +('12', '23', '7', '1227', '1691', '0'), +('12', '23', '7', '1362', '1624', '0'), +('12', '23', '7', '1218', '1611', '0'), +('12', '23', '7', '1648', '1458', '0'), +('12', '23', '9', '12803', '2673', '0'), +('12', '23', '9', '1649', '1418', '0'), +('12', '23', '9', '4344', '1251', '0'), +('12', '23', '9', '10408', '1202', '0'), +('12', '23', '15', '11686', '3867', '0'), +('12', '23', '15', '10150', '1804', '0'), +('12', '23', '15', '10163', '1500', '0'), +('12', '23', '15', '14651', '1424', '0'), +('12', '23', '20', '11666', '5326', '0'), +('12', '23', '20', '2742', '3122', '0'), +('12', '23', '20', '1217', '1093', '0'), +('12', '23', '20', '1647', '934', '0'), +('12', '23', '12', '1229', '2398', '0'), +('12', '23', '12', '20655', '2146', '0'), +('12', '23', '12', '2923', '2074', '0'), +('12', '23', '12', '1404', '1512', '0'), +('12', '23', '18', '1651', '1235', '0'), +('12', '23', '18', '4410', '742', '0'), +('12', '23', '18', '1230', '500', '0'), +('12', '23', '18', '1221', '454', '0'), +('12', '23', '19', '68239', '1824', '0'), +('12', '23', '19', '4407', '1561', '0'), +('12', '23', '19', '1652', '1234', '0'), +('12', '23', '19', '1368', '1216', '0'), +('12', '23', '13', '14337', '4768', '0'), +('12', '23', '13', '20656', '4464', '0'), +('12', '23', '13', '9690', '2700', '0'), +('12', '23', '13', '6359', '2520', '0'), +('12', '23', '14', '20656', '4464', '0'), +('12', '23', '14', '10219', '3681', '0'), +('12', '23', '14', '9690', '2700', '0'), +('12', '23', '14', '6359', '2520', '0'), +('12', '23', '11', '9246', '1679', '0'), +('12', '23', '11', '13353', '1500', '0'), +('12', '23', '11', '14762', '1404', '0'), +('12', '23', '11', '20677', '450', '0'), +('12', '24', '22', '10323', '0', '0'), +('12', '24', '22', '9246', '0', '0'), +('12', '24', '22', '21509', '0', '0'), +('12', '24', '22', '8007', '0', '0'), +('12', '24', '1', '14702', '2350', '0'), +('12', '24', '1', '30361', '2040', '0'), +('12', '24', '1', '14701', '1862', '0'), +('12', '24', '1', '10082', '1140', '0'), +('12', '24', '2', '1271', '3634', '0'), +('12', '24', '2', '10143', '3368', '0'), +('12', '24', '2', '30363', '2700', '0'), +('12', '24', '2', '1225', '2277', '0'), +('12', '24', '3', '11052', '2609', '0'), +('12', '24', '3', '1272', '2149', '0'), +('12', '24', '3', '4505', '1248', '0'), +('12', '24', '3', '1212', '1092', '0'), +('12', '24', '5', '27710', '3900', '0'), +('12', '24', '5', '14703', '3850', '0'), +('12', '24', '5', '14556', '3018', '0'), +('12', '24', '5', '30362', '2340', '0'), +('12', '24', '8', '11603', '6876', '0'), +('12', '24', '8', '2349', '2154', '0'), +('12', '24', '8', '1216', '1105', '0'), +('12', '24', '8', '1057', '1068', '0'), +('12', '24', '6', '1557', '5310', '0'), +('12', '24', '6', '1542', '3737', '0'), +('12', '24', '6', '1905', '3059', '0'), +('12', '24', '6', '1273', '2250', '0'), +('12', '24', '17', '11641', '6191', '0'), +('12', '24', '17', '1253', '6106', '0'), +('12', '24', '17', '1644', '6036', '0'), +('12', '24', '17', '1214', '4509', '0'), +('12', '24', '7', '1227', '1742', '0'), +('12', '24', '7', '1218', '1662', '0'), +('12', '24', '7', '1362', '1624', '0'), +('12', '24', '7', '1648', '1494', '0'), +('12', '24', '9', '12803', '2636', '0'), +('12', '24', '9', '1649', '1440', '0'), +('12', '24', '9', '4344', '1251', '0'), +('12', '24', '9', '10408', '1202', '0'), +('12', '24', '15', '11686', '3904', '0'), +('12', '24', '15', '10150', '1804', '0'), +('12', '24', '15', '10163', '1500', '0'), +('12', '24', '15', '14651', '1424', '0'), +('12', '24', '20', '11666', '5327', '0'), +('12', '24', '20', '2742', '3124', '0'), +('12', '24', '20', '1217', '1101', '0'), +('12', '24', '20', '1647', '934', '0'), +('12', '24', '12', '1229', '2449', '0'), +('12', '24', '12', '20655', '2161', '0'), +('12', '24', '12', '2923', '2074', '0'), +('12', '24', '12', '1404', '1512', '0'), +('12', '24', '18', '1651', '1257', '0'), +('12', '24', '18', '4410', '742', '0'), +('12', '24', '18', '1230', '501', '0'), +('12', '24', '18', '1221', '454', '0'), +('12', '24', '19', '68239', '1845', '0'), +('12', '24', '19', '4407', '1626', '0'), +('12', '24', '19', '1652', '1234', '0'), +('12', '24', '19', '1368', '1216', '0'), +('12', '24', '13', '14337', '4841', '0'), +('12', '24', '13', '20656', '4500', '0'), +('12', '24', '13', '9690', '2700', '0'), +('12', '24', '13', '6359', '2593', '0'), +('12', '24', '14', '20656', '4500', '0'), +('12', '24', '14', '10219', '3681', '0'), +('12', '24', '14', '9690', '2700', '0'), +('12', '24', '14', '6359', '2593', '0'), +('12', '24', '11', '9246', '1752', '0'), +('12', '24', '11', '13353', '1500', '0'), +('12', '24', '11', '14762', '1404', '0'), +('12', '24', '11', '20677', '450', '0'), +('12', '25', '22', '10323', '0', '0'), +('12', '25', '22', '9246', '0', '0'), +('12', '25', '22', '21509', '0', '0'), +('12', '25', '22', '8007', '0', '0'), +('12', '25', '1', '14702', '2350', '0'), +('12', '25', '1', '30361', '2040', '0'), +('12', '25', '1', '14701', '1862', '0'), +('12', '25', '1', '10082', '1183', '0'), +('12', '25', '2', '1271', '3692', '0'), +('12', '25', '2', '10143', '3368', '0'), +('12', '25', '2', '30363', '2700', '0'), +('12', '25', '2', '1225', '2329', '0'), +('12', '25', '3', '11052', '2718', '0'), +('12', '25', '3', '1272', '2214', '0'), +('12', '25', '3', '4505', '1299', '0'), +('12', '25', '3', '1212', '1099', '0'), +('12', '25', '5', '27710', '3936', '0'), +('12', '25', '5', '14703', '3850', '0'), +('12', '25', '5', '14556', '3018', '0'), +('12', '25', '5', '30362', '2340', '0'), +('12', '25', '8', '11603', '6941', '0'), +('12', '25', '8', '2349', '2154', '0'), +('12', '25', '8', '1216', '1113', '0'), +('12', '25', '8', '1057', '1104', '0'), +('12', '25', '6', '1557', '5310', '0'), +('12', '25', '6', '1542', '3802', '0'), +('12', '25', '6', '1905', '3060', '0'), +('12', '25', '6', '1273', '2286', '0'), +('12', '25', '17', '11641', '6300', '0'), +('12', '25', '17', '1253', '6109', '0'), +('12', '25', '17', '1644', '6072', '0'), +('12', '25', '17', '1214', '4606', '0'), +('12', '25', '7', '1227', '1793', '0'), +('12', '25', '7', '1218', '1713', '0'), +('12', '25', '7', '1362', '1624', '0'), +('12', '25', '7', '1648', '1530', '0'), +('12', '25', '9', '12803', '2600', '0'), +('12', '25', '9', '1649', '1462', '0'), +('12', '25', '9', '4344', '1251', '0'), +('12', '25', '9', '10408', '1202', '0'), +('12', '25', '15', '11686', '3940', '0'), +('12', '25', '15', '10150', '1804', '0'), +('12', '25', '15', '10163', '1500', '0'), +('12', '25', '15', '14651', '1424', '0'), +('12', '25', '20', '11666', '5329', '0'), +('12', '25', '20', '2742', '3127', '0'), +('12', '25', '20', '1217', '1108', '0'), +('12', '25', '20', '1647', '934', '0'), +('12', '25', '12', '1229', '2500', '0'), +('12', '25', '12', '20655', '2176', '0'), +('12', '25', '12', '2923', '2074', '0'), +('12', '25', '12', '2336', '1518', '0'), +('12', '25', '18', '1651', '1279', '0'), +('12', '25', '18', '4410', '742', '0'), +('12', '25', '18', '1230', '502', '0'), +('12', '25', '18', '1221', '454', '0'), +('12', '25', '19', '68239', '1867', '0'), +('12', '25', '19', '4407', '1691', '0'), +('12', '25', '19', '1652', '1234', '0'), +('12', '25', '19', '1368', '1216', '0'), +('12', '25', '13', '14337', '4913', '0'), +('12', '25', '13', '20656', '4536', '0'), +('12', '25', '13', '9690', '2700', '0'), +('12', '25', '13', '6359', '2665', '0'), +('12', '25', '14', '20656', '4536', '0'), +('12', '25', '14', '10219', '3681', '0'), +('12', '25', '14', '9690', '2700', '0'), +('12', '25', '14', '6359', '2665', '0'), +('12', '25', '11', '9246', '1824', '0'), +('12', '25', '11', '13353', '1500', '0'), +('12', '25', '11', '14762', '1404', '0'), +('12', '25', '11', '20677', '450', '0'), +('12', '26', '22', '10323', '0', '0'), +('12', '26', '22', '9246', '0', '0'), +('12', '26', '22', '21509', '0', '0'), +('12', '26', '22', '8007', '0', '0'), +('12', '26', '1', '14702', '2350', '0'), +('12', '26', '1', '30361', '2040', '0'), +('12', '26', '1', '14701', '1862', '0'), +('12', '26', '1', '10082', '1227', '0'), +('12', '26', '2', '1271', '3750', '0'), +('12', '26', '2', '10143', '3368', '0'), +('12', '26', '2', '30363', '2700', '0'), +('12', '26', '2', '1225', '2381', '0'), +('12', '26', '3', '11052', '2827', '0'), +('12', '26', '3', '1272', '2280', '0'), +('12', '26', '3', '4505', '1349', '0'), +('12', '26', '3', '1212', '1107', '0'), +('12', '26', '5', '27710', '3972', '0'), +('12', '26', '5', '14703', '3850', '0'), +('12', '26', '5', '14556', '3018', '0'), +('12', '26', '5', '30362', '2340', '0'), +('12', '26', '8', '11603', '7006', '0'), +('12', '26', '8', '2349', '2154', '0'), +('12', '26', '8', '1057', '1141', '0'), +('12', '26', '8', '1216', '1120', '0'), +('12', '26', '6', '1557', '5310', '0'), +('12', '26', '6', '1542', '3867', '0'), +('12', '26', '6', '1905', '3062', '0'), +('12', '26', '6', '1273', '2322', '0'), +('12', '26', '17', '11641', '6408', '0'), +('12', '26', '17', '1253', '6111', '0'), +('12', '26', '17', '1644', '6109', '0'), +('12', '26', '17', '1214', '4703', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '26', '7', '1227', '1843', '0'), +('12', '26', '7', '1218', '1763', '0'), +('12', '26', '7', '1362', '1624', '0'), +('12', '26', '7', '1648', '1566', '0'), +('12', '26', '9', '12803', '2564', '0'), +('12', '26', '9', '1649', '1483', '0'), +('12', '26', '9', '4344', '1251', '0'), +('12', '26', '9', '10408', '1202', '0'), +('12', '26', '15', '11686', '3976', '0'), +('12', '26', '15', '10150', '1804', '0'), +('12', '26', '15', '10163', '1500', '0'), +('12', '26', '15', '14651', '1424', '0'), +('12', '26', '20', '11666', '5331', '0'), +('12', '26', '20', '2742', '3129', '0'), +('12', '26', '20', '1217', '1115', '0'), +('12', '26', '20', '1647', '934', '0'), +('12', '26', '12', '1229', '2551', '0'), +('12', '26', '12', '20655', '2191', '0'), +('12', '26', '12', '2923', '2074', '0'), +('12', '26', '12', '2336', '1554', '0'), +('12', '26', '18', '1651', '1300', '0'), +('12', '26', '18', '4410', '742', '0'), +('12', '26', '18', '1230', '503', '0'), +('12', '26', '18', '1221', '454', '0'), +('12', '26', '19', '68239', '1889', '0'), +('12', '26', '19', '4407', '1756', '0'), +('12', '26', '19', '1652', '1234', '0'), +('12', '26', '19', '1368', '1216', '0'), +('12', '26', '13', '14337', '4986', '0'), +('12', '26', '13', '20656', '4572', '0'), +('12', '26', '13', '6359', '2738', '0'), +('12', '26', '13', '9690', '2700', '0'), +('12', '26', '14', '20656', '4572', '0'), +('12', '26', '14', '10219', '3681', '0'), +('12', '26', '14', '6359', '2738', '0'), +('12', '26', '14', '9690', '2700', '0'), +('12', '26', '11', '9246', '1897', '0'), +('12', '26', '11', '13353', '1500', '0'), +('12', '26', '11', '14762', '1404', '0'), +('12', '26', '11', '20677', '450', '0'), +('12', '27', '22', '10323', '0', '0'), +('12', '27', '22', '9246', '0', '0'), +('12', '27', '22', '21509', '0', '0'), +('12', '27', '22', '8007', '0', '0'), +('12', '27', '1', '14702', '2350', '0'), +('12', '27', '1', '30361', '2040', '0'), +('12', '27', '1', '14701', '1862', '0'), +('12', '27', '1', '10082', '1270', '0'), +('12', '27', '2', '1271', '3808', '0'), +('12', '27', '2', '10143', '3368', '0'), +('12', '27', '2', '30363', '2700', '0'), +('12', '27', '2', '1225', '2433', '0'), +('12', '27', '3', '11052', '2935', '0'), +('12', '27', '3', '1272', '2345', '0'), +('12', '27', '3', '4505', '1400', '0'), +('12', '27', '3', '1212', '1114', '0'), +('12', '27', '5', '27710', '4009', '0'), +('12', '27', '5', '14703', '3850', '0'), +('12', '27', '5', '14556', '3018', '0'), +('12', '27', '5', '30362', '2340', '0'), +('12', '27', '8', '11603', '7072', '0'), +('12', '27', '8', '2349', '2154', '0'), +('12', '27', '8', '1057', '1177', '0'), +('12', '27', '8', '1216', '1127', '0'), +('12', '27', '6', '1557', '5310', '0'), +('12', '27', '6', '1542', '3933', '0'), +('12', '27', '6', '1905', '3063', '0'), +('12', '27', '6', '1273', '2359', '0'), +('12', '27', '17', '11641', '6517', '0'), +('12', '27', '17', '1644', '6145', '0'), +('12', '27', '17', '1253', '6114', '0'), +('12', '27', '17', '1214', '4801', '0'), +('12', '27', '7', '1227', '1894', '0'), +('12', '27', '7', '1218', '1814', '0'), +('12', '27', '7', '1362', '1624', '0'), +('12', '27', '7', '1648', '1603', '0'), +('12', '27', '9', '12803', '2528', '0'), +('12', '27', '9', '1649', '1505', '0'), +('12', '27', '9', '4344', '1251', '0'), +('12', '27', '9', '10408', '1202', '0'), +('12', '27', '15', '11686', '4012', '0'), +('12', '27', '15', '10150', '1804', '0'), +('12', '27', '15', '10163', '1500', '0'), +('12', '27', '15', '14651', '1424', '0'), +('12', '27', '20', '11666', '5333', '0'), +('12', '27', '20', '2742', '3132', '0'), +('12', '27', '20', '1217', '1122', '0'), +('12', '27', '20', '1647', '934', '0'), +('12', '27', '12', '1229', '2601', '0'), +('12', '27', '12', '20655', '2206', '0'), +('12', '27', '12', '2923', '2074', '0'), +('12', '27', '12', '2336', '1591', '0'), +('12', '27', '18', '1651', '1322', '0'), +('12', '27', '18', '4410', '742', '0'), +('12', '27', '18', '1230', '503', '0'), +('12', '27', '18', '1221', '454', '0'), +('12', '27', '19', '68239', '1911', '0'), +('12', '27', '19', '4407', '1821', '0'), +('12', '27', '19', '1652', '1234', '0'), +('12', '27', '19', '1368', '1216', '0'), +('12', '27', '13', '14337', '5058', '0'), +('12', '27', '13', '20656', '4609', '0'), +('12', '27', '13', '6359', '2810', '0'), +('12', '27', '13', '9690', '2700', '0'), +('12', '27', '14', '20656', '4609', '0'), +('12', '27', '14', '10219', '3681', '0'), +('12', '27', '14', '6359', '2810', '0'), +('12', '27', '14', '9690', '2700', '0'), +('12', '27', '11', '9246', '1969', '0'), +('12', '27', '11', '13353', '1500', '0'), +('12', '27', '11', '14762', '1404', '0'), +('12', '27', '11', '20677', '450', '0'), +('12', '28', '22', '10323', '0', '0'), +('12', '28', '22', '9246', '0', '0'), +('12', '28', '22', '21509', '0', '0'), +('12', '28', '22', '8007', '0', '0'), +('12', '28', '1', '14702', '2350', '0'), +('12', '28', '1', '30361', '2040', '0'), +('12', '28', '1', '14701', '1862', '0'), +('12', '28', '1', '10082', '1314', '0'), +('12', '28', '2', '1271', '3866', '0'), +('12', '28', '2', '10143', '3368', '0'), +('12', '28', '2', '30363', '2700', '0'), +('12', '28', '2', '1225', '2485', '0'), +('12', '28', '3', '11052', '3044', '0'), +('12', '28', '3', '1272', '2410', '0'), +('12', '28', '3', '4505', '1451', '0'), +('12', '28', '3', '1212', '1121', '0'), +('12', '28', '5', '27710', '4045', '0'), +('12', '28', '5', '14703', '3850', '0'), +('12', '28', '5', '14556', '3018', '0'), +('12', '28', '5', '30362', '2340', '0'), +('12', '28', '8', '11603', '7137', '0'), +('12', '28', '8', '2349', '2154', '0'), +('12', '28', '8', '1057', '1213', '0'), +('12', '28', '8', '1216', '1134', '0'), +('12', '28', '6', '1557', '5310', '0'), +('12', '28', '6', '1542', '3998', '0'), +('12', '28', '6', '1905', '3064', '0'), +('12', '28', '6', '1273', '2395', '0'), +('12', '28', '17', '11641', '6626', '0'), +('12', '28', '17', '1644', '6181', '0'), +('12', '28', '17', '1253', '6116', '0'), +('12', '28', '17', '1214', '4898', '0'), +('12', '28', '7', '1227', '1945', '0'), +('12', '28', '7', '1218', '1865', '0'), +('12', '28', '7', '1648', '1639', '0'), +('12', '28', '7', '1362', '1624', '0'), +('12', '28', '9', '12803', '2491', '0'), +('12', '28', '9', '1649', '1527', '0'), +('12', '28', '9', '4344', '1251', '0'), +('12', '28', '9', '10408', '1202', '0'), +('12', '28', '15', '11686', '4049', '0'), +('12', '28', '15', '10150', '1804', '0'), +('12', '28', '15', '10163', '1500', '0'), +('12', '28', '15', '14651', '1424', '0'), +('12', '28', '20', '11666', '5334', '0'), +('12', '28', '20', '2742', '3134', '0'), +('12', '28', '20', '1217', '1130', '0'), +('12', '28', '20', '1647', '934', '0'), +('12', '28', '12', '1229', '2652', '0'), +('12', '28', '12', '20655', '2221', '0'), +('12', '28', '12', '2923', '2074', '0'), +('12', '28', '12', '2336', '1627', '0'), +('12', '28', '18', '1651', '1344', '0'), +('12', '28', '18', '4410', '742', '0'), +('12', '28', '18', '1230', '504', '0'), +('12', '28', '18', '1221', '454', '0'), +('12', '28', '19', '68239', '1932', '0'), +('12', '28', '19', '4407', '1887', '0'), +('12', '28', '19', '1652', '1234', '0'), +('12', '28', '19', '1368', '1216', '0'), +('12', '28', '13', '14337', '5131', '0'), +('12', '28', '13', '20656', '4645', '0'), +('12', '28', '13', '6359', '2882', '0'), +('12', '28', '13', '14360', '2730', '0'), +('12', '28', '14', '20656', '4645', '0'), +('12', '28', '14', '10219', '3681', '0'), +('12', '28', '14', '6359', '2882', '0'), +('12', '28', '14', '9690', '2700', '0'), +('12', '28', '11', '9246', '2042', '0'), +('12', '28', '11', '13353', '1500', '0'), +('12', '28', '11', '14762', '1404', '0'), +('12', '28', '11', '20677', '450', '0'), +('12', '29', '22', '10323', '0', '0'), +('12', '29', '22', '9246', '0', '0'), +('12', '29', '22', '21509', '0', '0'), +('12', '29', '22', '8007', '0', '0'), +('12', '29', '1', '14702', '2350', '0'), +('12', '29', '1', '30361', '2040', '0'), +('12', '29', '1', '14701', '1862', '0'), +('12', '29', '1', '10082', '1357', '0'), +('12', '29', '2', '1271', '3924', '0'), +('12', '29', '2', '10143', '3368', '0'), +('12', '29', '2', '30363', '2700', '0'), +('12', '29', '2', '1225', '2537', '0'), +('12', '29', '3', '11052', '3153', '0'), +('12', '29', '3', '1272', '2475', '0'), +('12', '29', '3', '4505', '1502', '0'), +('12', '29', '3', '1212', '1128', '0'), +('12', '29', '5', '27710', '4081', '0'), +('12', '29', '5', '14703', '3850', '0'), +('12', '29', '5', '14556', '3018', '0'), +('12', '29', '5', '30362', '2340', '0'), +('12', '29', '8', '11603', '7202', '0'), +('12', '29', '8', '2349', '2154', '0'), +('12', '29', '8', '1057', '1249', '0'), +('12', '29', '8', '1216', '1142', '0'), +('12', '29', '6', '1557', '5310', '0'), +('12', '29', '6', '1542', '4063', '0'), +('12', '29', '6', '1905', '3065', '0'), +('12', '29', '6', '1273', '2431', '0'), +('12', '29', '17', '11641', '6734', '0'), +('12', '29', '17', '1644', '6217', '0'), +('12', '29', '17', '1253', '6118', '0'), +('12', '29', '17', '1214', '4995', '0'), +('12', '29', '7', '1227', '1996', '0'), +('12', '29', '7', '1218', '1916', '0'), +('12', '29', '7', '1648', '1675', '0'), +('12', '29', '7', '1362', '1624', '0'), +('12', '29', '9', '12803', '2455', '0'), +('12', '29', '9', '1649', '1549', '0'), +('12', '29', '9', '4344', '1251', '0'), +('12', '29', '9', '10408', '1202', '0'), +('12', '29', '15', '11686', '4085', '0'), +('12', '29', '15', '10150', '1804', '0'), +('12', '29', '15', '10163', '1500', '0'), +('12', '29', '15', '14651', '1424', '0'), +('12', '29', '20', '11666', '5336', '0'), +('12', '29', '20', '2742', '3137', '0'), +('12', '29', '20', '1217', '1137', '0'), +('12', '29', '20', '1647', '934', '0'), +('12', '29', '12', '1229', '2703', '0'), +('12', '29', '12', '20655', '2236', '0'), +('12', '29', '12', '2923', '2074', '0'), +('12', '29', '12', '2336', '1663', '0'), +('12', '29', '18', '1651', '1366', '0'), +('12', '29', '18', '4410', '742', '0'), +('12', '29', '18', '1230', '505', '0'), +('12', '29', '18', '1221', '454', '0'), +('12', '29', '19', '68239', '1954', '0'), +('12', '29', '19', '4407', '1952', '0'), +('12', '29', '19', '1652', '1234', '0'), +('12', '29', '19', '1368', '1216', '0'), +('12', '29', '13', '14337', '5203', '0'), +('12', '29', '13', '20656', '4681', '0'), +('12', '29', '13', '6359', '2955', '0'), +('12', '29', '13', '14360', '2802', '0'), +('12', '29', '14', '20656', '4681', '0'), +('12', '29', '14', '10219', '3681', '0'), +('12', '29', '14', '6359', '2955', '0'), +('12', '29', '14', '9690', '2700', '0'), +('12', '29', '11', '9246', '2114', '0'), +('12', '29', '11', '13353', '1500', '0'), +('12', '29', '11', '14762', '1404', '0'), +('12', '29', '11', '20677', '450', '0'), +('12', '30', '22', '10323', '0', '0'), +('12', '30', '22', '9246', '0', '0'), +('12', '30', '22', '21509', '0', '0'), +('12', '30', '22', '8007', '0', '0'), +('12', '30', '1', '14702', '2350', '0'), +('12', '30', '1', '30361', '2040', '0'), +('12', '30', '1', '14701', '1862', '0'), +('12', '30', '1', '10082', '1401', '0'), +('12', '30', '2', '1271', '3982', '0'), +('12', '30', '2', '10143', '3368', '0'), +('12', '30', '2', '30363', '2700', '0'), +('12', '30', '2', '1225', '2589', '0'), +('12', '30', '3', '11052', '3262', '0'), +('12', '30', '3', '1272', '2540', '0'), +('12', '30', '3', '4505', '1552', '0'), +('12', '30', '3', '1212', '1136', '0'), +('12', '30', '5', '27710', '4117', '0'), +('12', '30', '5', '14703', '3850', '0'), +('12', '30', '5', '14556', '3018', '0'), +('12', '30', '5', '30362', '2340', '0'), +('12', '30', '8', '11603', '7267', '0'), +('12', '30', '8', '2349', '2154', '0'), +('12', '30', '8', '1057', '1286', '0'), +('12', '30', '8', '1216', '1149', '0'), +('12', '30', '6', '1557', '5310', '0'), +('12', '30', '6', '1542', '4128', '0'), +('12', '30', '6', '1905', '3066', '0'), +('12', '30', '6', '1273', '2467', '0'), +('12', '30', '17', '11641', '6843', '0'), +('12', '30', '17', '1644', '6254', '0'), +('12', '30', '17', '1253', '6121', '0'), +('12', '30', '17', '1214', '5093', '0'), +('12', '30', '7', '1227', '2046', '0'), +('12', '30', '7', '1218', '1966', '0'), +('12', '30', '7', '1648', '1711', '0'), +('12', '30', '7', '1362', '1624', '0'), +('12', '30', '9', '12803', '2419', '0'), +('12', '30', '9', '1649', '1570', '0'), +('12', '30', '9', '4344', '1251', '0'), +('12', '30', '9', '10408', '1202', '0'), +('12', '30', '15', '11686', '4121', '0'), +('12', '30', '15', '10150', '1804', '0'), +('12', '30', '15', '10163', '1500', '0'), +('12', '30', '15', '14651', '1424', '0'), +('12', '30', '20', '11666', '5338', '0'), +('12', '30', '20', '2742', '3139', '0'), +('12', '30', '20', '1217', '1144', '0'), +('12', '30', '20', '1364', '962', '0'), +('12', '30', '12', '1229', '2753', '0'), +('12', '30', '12', '20655', '2251', '0'), +('12', '30', '12', '2923', '2074', '0'), +('12', '30', '12', '2336', '1699', '0'), +('12', '30', '18', '1651', '1387', '0'), +('12', '30', '18', '4410', '742', '0'), +('12', '30', '18', '1230', '506', '0'), +('12', '30', '18', '1221', '454', '0'), +('12', '30', '19', '4407', '2017', '0'), +('12', '30', '19', '68239', '1976', '0'), +('12', '30', '19', '1652', '1234', '0'), +('12', '30', '19', '1368', '1216', '0'), +('12', '30', '13', '14337', '5276', '0'), +('12', '30', '13', '20656', '4717', '0'), +('12', '30', '13', '6359', '3027', '0'), +('12', '30', '13', '14360', '2875', '0'), +('12', '30', '14', '20656', '4717', '0'), +('12', '30', '14', '10219', '3681', '0'), +('12', '30', '14', '6359', '3027', '0'), +('12', '30', '14', '9690', '2700', '0'), +('12', '30', '11', '9246', '2186', '0'), +('12', '30', '11', '13353', '1500', '0'), +('12', '30', '11', '14762', '1404', '0'), +('12', '30', '11', '20677', '450', '0'), +('12', '31', '22', '10323', '0', '0'), +('12', '31', '22', '9246', '0', '0'), +('12', '31', '22', '21509', '0', '0'), +('12', '31', '22', '8007', '0', '0'), +('12', '31', '1', '14702', '2350', '0'), +('12', '31', '1', '30361', '2040', '0'), +('12', '31', '1', '14701', '1862', '0'), +('12', '31', '1', '10082', '1444', '0'), +('12', '31', '2', '1271', '4040', '0'), +('12', '31', '2', '10143', '3368', '0'), +('12', '31', '2', '30363', '2700', '0'), +('12', '31', '2', '1225', '2640', '0'), +('12', '31', '3', '11052', '3370', '0'), +('12', '31', '3', '1272', '2606', '0'), +('12', '31', '3', '4505', '1603', '0'), +('12', '31', '3', '2366', '1148', '0'), +('12', '31', '5', '27710', '4154', '0'), +('12', '31', '5', '14703', '3850', '0'), +('12', '31', '5', '14556', '3018', '0'), +('12', '31', '5', '30362', '2340', '0'), +('12', '31', '8', '11603', '7333', '0'), +('12', '31', '8', '2349', '2154', '0'), +('12', '31', '8', '1057', '1322', '0'), +('12', '31', '8', '1216', '1156', '0'), +('12', '31', '6', '1557', '5310', '0'), +('12', '31', '6', '1542', '4193', '0'), +('12', '31', '6', '1905', '3068', '0'), +('12', '31', '6', '1273', '2504', '0'), +('12', '31', '17', '11641', '6952', '0'), +('12', '31', '17', '1644', '6290', '0'), +('12', '31', '17', '1253', '6123', '0'), +('12', '31', '17', '1214', '5190', '0'), +('12', '31', '7', '1227', '2097', '0'), +('12', '31', '7', '1218', '2017', '0'), +('12', '31', '7', '1648', '1748', '0'), +('12', '31', '7', '1362', '1624', '0'), +('12', '31', '9', '12803', '2383', '0'), +('12', '31', '9', '1649', '1592', '0'), +('12', '31', '9', '4344', '1251', '0'), +('12', '31', '9', '10408', '1202', '0'), +('12', '31', '15', '11686', '4157', '0'), +('12', '31', '15', '10150', '1804', '0'), +('12', '31', '15', '10163', '1500', '0'), +('12', '31', '15', '14651', '1424', '0'), +('12', '31', '20', '11666', '5339', '0'), +('12', '31', '20', '2742', '3141', '0'), +('12', '31', '20', '1217', '1151', '0'), +('12', '31', '20', '1364', '991', '0'), +('12', '31', '12', '1229', '2804', '0'), +('12', '31', '12', '20655', '2266', '0'), +('12', '31', '12', '2923', '2074', '0'), +('12', '31', '12', '2336', '1736', '0'), +('12', '31', '18', '1651', '1409', '0'), +('12', '31', '18', '4410', '742', '0'), +('12', '31', '18', '1230', '506', '0'), +('12', '31', '18', '1221', '454', '0'), +('12', '31', '19', '4407', '2082', '0'), +('12', '31', '19', '68239', '1997', '0'), +('12', '31', '19', '1652', '1234', '0'), +('12', '31', '19', '1368', '1216', '0'), +('12', '31', '13', '14337', '5348', '0'), +('12', '31', '13', '20656', '4754', '0'), +('12', '31', '13', '6359', '3100', '0'), +('12', '31', '13', '14360', '2947', '0'), +('12', '31', '14', '20656', '4754', '0'), +('12', '31', '14', '10219', '3681', '0'), +('12', '31', '14', '6359', '3100', '0'), +('12', '31', '14', '9690', '2700', '0'), +('12', '31', '11', '9246', '2259', '0'), +('12', '31', '11', '13353', '1500', '0'), +('12', '31', '11', '14762', '1404', '0'), +('12', '31', '11', '20677', '450', '0'), +('12', '32', '22', '10323', '0', '0'), +('12', '32', '22', '9246', '0', '0'), +('12', '32', '22', '21509', '0', '0'), +('12', '32', '22', '8007', '0', '0'), +('12', '32', '1', '14702', '2350', '0'), +('12', '32', '1', '30361', '2040', '0'), +('12', '32', '1', '14701', '1862', '0'), +('12', '32', '1', '10082', '1488', '0'), +('12', '32', '2', '1271', '4098', '0'), +('12', '32', '2', '10143', '3368', '0'), +('12', '32', '2', '30363', '2700', '0'), +('12', '32', '2', '1225', '2692', '0'), +('12', '32', '3', '11052', '3479', '0'), +('12', '32', '3', '1272', '2671', '0'), +('12', '32', '3', '4505', '1654', '0'), +('12', '32', '3', '2366', '1184', '0'), +('12', '32', '5', '27710', '4190', '0'), +('12', '32', '5', '14703', '3850', '0'), +('12', '32', '5', '14556', '3018', '0'), +('12', '32', '5', '30362', '2340', '0'), +('12', '32', '8', '11603', '7398', '0'), +('12', '32', '8', '2349', '2154', '0'), +('12', '32', '8', '1057', '1358', '0'), +('12', '32', '8', '1216', '1163', '0'), +('12', '32', '6', '1557', '5310', '0'), +('12', '32', '6', '1542', '4259', '0'), +('12', '32', '6', '1905', '3069', '0'), +('12', '32', '6', '1273', '2540', '0'), +('12', '32', '17', '11641', '7061', '0'), +('12', '32', '17', '1644', '6326', '0'), +('12', '32', '17', '1253', '6126', '0'), +('12', '32', '17', '1214', '5288', '0'), +('12', '32', '7', '1227', '2148', '0'), +('12', '32', '7', '1218', '2068', '0'), +('12', '32', '7', '1648', '1784', '0'), +('12', '32', '7', '1362', '1624', '0'), +('12', '32', '9', '12803', '2346', '0'), +('12', '32', '9', '1649', '1614', '0'), +('12', '32', '9', '4344', '1251', '0'), +('12', '32', '9', '10408', '1202', '0'), +('12', '32', '15', '11686', '4194', '0'), +('12', '32', '15', '10150', '1804', '0'), +('12', '32', '15', '10163', '1500', '0'), +('12', '32', '15', '14651', '1424', '0'), +('12', '32', '20', '11666', '5341', '0'), +('12', '32', '20', '2742', '3144', '0'), +('12', '32', '20', '1217', '1159', '0'), +('12', '32', '20', '1364', '1020', '0'), +('12', '32', '12', '1229', '2855', '0'), +('12', '32', '12', '20655', '2281', '0'), +('12', '32', '12', '2923', '2074', '0'), +('12', '32', '12', '2336', '1772', '0'), +('12', '32', '18', '1651', '1431', '0'), +('12', '32', '18', '4410', '742', '0'), +('12', '32', '18', '1230', '507', '0'), +('12', '32', '18', '1221', '454', '0'), +('12', '32', '19', '4407', '2148', '0'), +('12', '32', '19', '68239', '2019', '0'), +('12', '32', '19', '1652', '1234', '0'), +('12', '32', '19', '1368', '1216', '0'), +('12', '32', '13', '14337', '5421', '0'), +('12', '32', '13', '20656', '4790', '0'), +('12', '32', '13', '6359', '3172', '0'), +('12', '32', '13', '14360', '3020', '0'), +('12', '32', '14', '20656', '4790', '0'), +('12', '32', '14', '10219', '3681', '0'), +('12', '32', '14', '6359', '3172', '0'), +('12', '32', '14', '9690', '2700', '0'), +('12', '32', '11', '9246', '2331', '0'), +('12', '32', '11', '13353', '1500', '0'), +('12', '32', '11', '14762', '1404', '0'), +('12', '32', '11', '20677', '450', '0'), +('12', '33', '22', '10323', '0', '0'), +('12', '33', '22', '9246', '0', '0'), +('12', '33', '22', '21509', '0', '0'), +('12', '33', '22', '8007', '0', '0'), +('12', '33', '1', '14702', '2350', '0'), +('12', '33', '1', '30361', '2040', '0'), +('12', '33', '1', '14701', '1862', '0'), +('12', '33', '1', '10082', '1531', '0'), +('12', '33', '2', '1271', '4156', '0'), +('12', '33', '2', '10143', '3368', '0'), +('12', '33', '2', '1225', '2744', '0'), +('12', '33', '2', '30363', '2700', '0'), +('12', '33', '3', '11052', '3588', '0'), +('12', '33', '3', '1272', '2736', '0'), +('12', '33', '3', '4505', '1704', '0'), +('12', '33', '3', '2366', '1220', '0'), +('12', '33', '5', '27710', '4226', '0'), +('12', '33', '5', '14703', '3850', '0'), +('12', '33', '5', '14556', '3018', '0'), +('12', '33', '5', '11646', '2409', '0'), +('12', '33', '8', '11603', '7463', '0'), +('12', '33', '8', '2349', '2154', '0'), +('12', '33', '8', '1057', '1394', '0'), +('12', '33', '8', '1216', '1171', '0'), +('12', '33', '6', '1557', '5310', '0'), +('12', '33', '6', '1542', '4324', '0'), +('12', '33', '6', '1905', '3070', '0'), +('12', '33', '6', '1273', '2576', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '33', '17', '11641', '7169', '0'), +('12', '33', '17', '1644', '6362', '0'), +('12', '33', '17', '1253', '6128', '0'), +('12', '33', '17', '1214', '5385', '0'), +('12', '33', '7', '1227', '2198', '0'), +('12', '33', '7', '1218', '2118', '0'), +('12', '33', '7', '1648', '1820', '0'), +('12', '33', '7', '1362', '1624', '0'), +('12', '33', '9', '12803', '2310', '0'), +('12', '33', '9', '1649', '1636', '0'), +('12', '33', '9', '4344', '1251', '0'), +('12', '33', '9', '4408', '1229', '0'), +('12', '33', '15', '11686', '4230', '0'), +('12', '33', '15', '10150', '1804', '0'), +('12', '33', '15', '10163', '1500', '0'), +('12', '33', '15', '14651', '1424', '0'), +('12', '33', '20', '11666', '5343', '0'), +('12', '33', '20', '2742', '3146', '0'), +('12', '33', '20', '1217', '1166', '0'), +('12', '33', '20', '1364', '1049', '0'), +('12', '33', '12', '1229', '2906', '0'), +('12', '33', '12', '20655', '2296', '0'), +('12', '33', '12', '2923', '2074', '0'), +('12', '33', '12', '2336', '1808', '0'), +('12', '33', '18', '1651', '1453', '0'), +('12', '33', '18', '4410', '742', '0'), +('12', '33', '18', '1230', '508', '0'), +('12', '33', '18', '1221', '454', '0'), +('12', '33', '19', '4407', '2213', '0'), +('12', '33', '19', '68239', '2041', '0'), +('12', '33', '19', '1652', '1234', '0'), +('12', '33', '19', '1368', '1216', '0'), +('12', '33', '13', '14337', '5493', '0'), +('12', '33', '13', '20656', '4826', '0'), +('12', '33', '13', '6359', '3245', '0'), +('12', '33', '13', '14360', '3092', '0'), +('12', '33', '14', '20656', '4826', '0'), +('12', '33', '14', '10219', '3681', '0'), +('12', '33', '14', '6359', '3245', '0'), +('12', '33', '14', '9690', '2700', '0'), +('12', '33', '11', '9246', '2404', '0'), +('12', '33', '11', '13353', '1500', '0'), +('12', '33', '11', '14762', '1404', '0'), +('12', '33', '11', '20677', '450', '0'), +('12', '34', '22', '10323', '0', '0'), +('12', '34', '22', '9246', '0', '0'), +('12', '34', '22', '21509', '0', '0'), +('12', '34', '22', '8007', '0', '0'), +('12', '34', '1', '14702', '2350', '0'), +('12', '34', '1', '30361', '2040', '0'), +('12', '34', '1', '14701', '1862', '0'), +('12', '34', '1', '10082', '1575', '0'), +('12', '34', '2', '1271', '4214', '0'), +('12', '34', '2', '10143', '3368', '0'), +('12', '34', '2', '1225', '2796', '0'), +('12', '34', '2', '1211', '2725', '0'), +('12', '34', '3', '11052', '3696', '0'), +('12', '34', '3', '1272', '2801', '0'), +('12', '34', '3', '4505', '1755', '0'), +('12', '34', '3', '2366', '1256', '0'), +('12', '34', '5', '27710', '4262', '0'), +('12', '34', '5', '14703', '3850', '0'), +('12', '34', '5', '14556', '3018', '0'), +('12', '34', '5', '11646', '2504', '0'), +('12', '34', '8', '11603', '7528', '0'), +('12', '34', '8', '2349', '2154', '0'), +('12', '34', '8', '1057', '1430', '0'), +('12', '34', '8', '1216', '1178', '0'), +('12', '34', '6', '1557', '5310', '0'), +('12', '34', '6', '1542', '4389', '0'), +('12', '34', '6', '1905', '3071', '0'), +('12', '34', '6', '1273', '2612', '0'), +('12', '34', '17', '11641', '7278', '0'), +('12', '34', '17', '1644', '6399', '0'), +('12', '34', '17', '1253', '6130', '0'), +('12', '34', '17', '1214', '5482', '0'), +('12', '34', '7', '1227', '2249', '0'), +('12', '34', '7', '1218', '2169', '0'), +('12', '34', '7', '1648', '1856', '0'), +('12', '34', '7', '1362', '1624', '0'), +('12', '34', '9', '12803', '2274', '0'), +('12', '34', '9', '1649', '1657', '0'), +('12', '34', '9', '4408', '1265', '0'), +('12', '34', '9', '4344', '1251', '0'), +('12', '34', '15', '11686', '4266', '0'), +('12', '34', '15', '10150', '1804', '0'), +('12', '34', '15', '10163', '1500', '0'), +('12', '34', '15', '14651', '1424', '0'), +('12', '34', '20', '11666', '5344', '0'), +('12', '34', '20', '2742', '3149', '0'), +('12', '34', '20', '1217', '1173', '0'), +('12', '34', '20', '1364', '1078', '0'), +('12', '34', '12', '1229', '2956', '0'), +('12', '34', '12', '20655', '2311', '0'), +('12', '34', '12', '2923', '2074', '0'), +('12', '34', '12', '2336', '1844', '0'), +('12', '34', '18', '1651', '1474', '0'), +('12', '34', '18', '4410', '742', '0'), +('12', '34', '18', '1230', '508', '0'), +('12', '34', '18', '1221', '454', '0'), +('12', '34', '19', '4407', '2278', '0'), +('12', '34', '19', '68239', '2063', '0'), +('12', '34', '19', '1652', '1234', '0'), +('12', '34', '19', '1368', '1216', '0'), +('12', '34', '13', '14337', '5566', '0'), +('12', '34', '13', '20656', '4862', '0'), +('12', '34', '13', '6359', '3317', '0'), +('12', '34', '13', '14360', '3165', '0'), +('12', '34', '14', '20656', '4862', '0'), +('12', '34', '14', '10219', '3681', '0'), +('12', '34', '14', '6359', '3317', '0'), +('12', '34', '14', '9690', '2700', '0'), +('12', '34', '11', '9246', '2476', '0'), +('12', '34', '11', '13353', '1500', '0'), +('12', '34', '11', '14762', '1404', '0'), +('12', '34', '11', '20677', '450', '0'), +('12', '35', '22', '10323', '0', '0'), +('12', '35', '22', '9246', '0', '0'), +('12', '35', '22', '21509', '0', '0'), +('12', '35', '22', '8007', '0', '0'), +('12', '35', '1', '14702', '2350', '0'), +('12', '35', '1', '30361', '2040', '0'), +('12', '35', '1', '14701', '1862', '0'), +('12', '35', '1', '10082', '1618', '0'), +('12', '35', '2', '1271', '4272', '0'), +('12', '35', '2', '10143', '3368', '0'), +('12', '35', '2', '1225', '2848', '0'), +('12', '35', '2', '1211', '2776', '0'), +('12', '35', '3', '11052', '3805', '0'), +('12', '35', '3', '1272', '2867', '0'), +('12', '35', '3', '4505', '1806', '0'), +('12', '35', '3', '2366', '1293', '0'), +('12', '35', '5', '27710', '4299', '0'), +('12', '35', '5', '14703', '3850', '0'), +('12', '35', '5', '14556', '3018', '0'), +('12', '35', '5', '11646', '2598', '0'), +('12', '35', '8', '11603', '7594', '0'), +('12', '35', '8', '2349', '2154', '0'), +('12', '35', '8', '1057', '1467', '0'), +('12', '35', '8', '1216', '1185', '0'), +('12', '35', '6', '1557', '5310', '0'), +('12', '35', '6', '1542', '4454', '0'), +('12', '35', '6', '1905', '3072', '0'), +('12', '35', '6', '1273', '2649', '0'), +('12', '35', '17', '11641', '7387', '0'), +('12', '35', '17', '1644', '6435', '0'), +('12', '35', '17', '1253', '6133', '0'), +('12', '35', '17', '1214', '5580', '0'), +('12', '35', '7', '1227', '2300', '0'), +('12', '35', '7', '1218', '2220', '0'), +('12', '35', '7', '1648', '1893', '0'), +('12', '35', '7', '1362', '1624', '0'), +('12', '35', '9', '12803', '2238', '0'), +('12', '35', '9', '1649', '1679', '0'), +('12', '35', '9', '4408', '1302', '0'), +('12', '35', '9', '4344', '1251', '0'), +('12', '35', '15', '11686', '4302', '0'), +('12', '35', '15', '10150', '1804', '0'), +('12', '35', '15', '10163', '1500', '0'), +('12', '35', '15', '14651', '1424', '0'), +('12', '35', '20', '11666', '5346', '0'), +('12', '35', '20', '2742', '3151', '0'), +('12', '35', '20', '1217', '1180', '0'), +('12', '35', '20', '1364', '1107', '0'), +('12', '35', '12', '1229', '3007', '0'), +('12', '35', '12', '20655', '2326', '0'), +('12', '35', '12', '2923', '2074', '0'), +('12', '35', '12', '2336', '1880', '0'), +('12', '35', '18', '1651', '1496', '0'), +('12', '35', '18', '4410', '742', '0'), +('12', '35', '18', '1230', '509', '0'), +('12', '35', '18', '1221', '454', '0'), +('12', '35', '19', '4407', '2343', '0'), +('12', '35', '19', '68239', '2084', '0'), +('12', '35', '19', '1652', '1234', '0'), +('12', '35', '19', '1368', '1216', '0'), +('12', '35', '13', '14337', '5638', '0'), +('12', '35', '13', '20656', '4899', '0'), +('12', '35', '13', '6359', '3390', '0'), +('12', '35', '13', '14360', '3237', '0'), +('12', '35', '14', '20656', '4899', '0'), +('12', '35', '14', '10219', '3681', '0'), +('12', '35', '14', '6359', '3390', '0'), +('12', '35', '14', '9690', '2700', '0'), +('12', '35', '11', '9246', '2549', '0'), +('12', '35', '11', '13353', '1500', '0'), +('12', '35', '11', '14762', '1404', '0'), +('12', '35', '11', '20677', '450', '0'), +('12', '36', '22', '10323', '0', '0'), +('12', '36', '22', '9246', '0', '0'), +('12', '36', '22', '21509', '0', '0'), +('12', '36', '22', '8007', '0', '0'), +('12', '36', '1', '14702', '2350', '0'), +('12', '36', '1', '30361', '2040', '0'), +('12', '36', '1', '14701', '1862', '0'), +('12', '36', '1', '10082', '1662', '0'), +('12', '36', '2', '1271', '4330', '0'), +('12', '36', '2', '10143', '3368', '0'), +('12', '36', '2', '1225', '2900', '0'), +('12', '36', '2', '1211', '2827', '0'), +('12', '36', '3', '11052', '3914', '0'), +('12', '36', '3', '1272', '2932', '0'), +('12', '36', '3', '4505', '1857', '0'), +('12', '36', '3', '2366', '1329', '0'), +('12', '36', '5', '27710', '4335', '0'), +('12', '36', '5', '14703', '3850', '0'), +('12', '36', '5', '14556', '3018', '0'), +('12', '36', '5', '11646', '2692', '0'), +('12', '36', '8', '11603', '7659', '0'), +('12', '36', '8', '2349', '2154', '0'), +('12', '36', '8', '1057', '1503', '0'), +('12', '36', '8', '1216', '1192', '0'), +('12', '36', '6', '1557', '5310', '0'), +('12', '36', '6', '1542', '4520', '0'), +('12', '36', '6', '1905', '3074', '0'), +('12', '36', '6', '1273', '2685', '0'), +('12', '36', '17', '11641', '7495', '0'), +('12', '36', '17', '1644', '6471', '0'), +('12', '36', '17', '1253', '6135', '0'), +('12', '36', '17', '1214', '5677', '0'), +('12', '36', '7', '1227', '2351', '0'), +('12', '36', '7', '1218', '2271', '0'), +('12', '36', '7', '1648', '1929', '0'), +('12', '36', '7', '1362', '1624', '0'), +('12', '36', '9', '12803', '2201', '0'), +('12', '36', '9', '1649', '1701', '0'), +('12', '36', '9', '4408', '1338', '0'), +('12', '36', '9', '4344', '1251', '0'), +('12', '36', '15', '11686', '4338', '0'), +('12', '36', '15', '10150', '1804', '0'), +('12', '36', '15', '10163', '1500', '0'), +('12', '36', '15', '14651', '1424', '0'), +('12', '36', '20', '11666', '5348', '0'), +('12', '36', '20', '2742', '3153', '0'), +('12', '36', '20', '1217', '1188', '0'), +('12', '36', '20', '1364', '1136', '0'), +('12', '36', '12', '1229', '3058', '0'), +('12', '36', '12', '20655', '2341', '0'), +('12', '36', '12', '2923', '2074', '0'), +('12', '36', '12', '2336', '1917', '0'), +('12', '36', '18', '1651', '1518', '0'), +('12', '36', '18', '4410', '742', '0'), +('12', '36', '18', '1230', '510', '0'), +('12', '36', '18', '1221', '454', '0'), +('12', '36', '19', '4407', '2409', '0'), +('12', '36', '19', '68239', '2106', '0'), +('12', '36', '19', '1652', '1234', '0'), +('12', '36', '19', '1368', '1216', '0'), +('12', '36', '13', '14337', '5710', '0'), +('12', '36', '13', '20656', '4935', '0'), +('12', '36', '13', '6359', '3462', '0'), +('12', '36', '13', '14360', '3310', '0'), +('12', '36', '14', '20656', '4935', '0'), +('12', '36', '14', '10219', '3681', '0'), +('12', '36', '14', '6359', '3462', '0'), +('12', '36', '14', '13987', '2705', '0'), +('12', '36', '11', '9246', '2621', '0'), +('12', '36', '11', '13353', '1500', '0'), +('12', '36', '11', '14762', '1404', '0'), +('12', '36', '11', '20677', '450', '0'), +('12', '37', '22', '10323', '0', '0'), +('12', '37', '22', '9246', '0', '0'), +('12', '37', '22', '21509', '0', '0'), +('12', '37', '22', '8007', '0', '0'), +('12', '37', '1', '14702', '2350', '0'), +('12', '37', '1', '30361', '2040', '0'), +('12', '37', '1', '14701', '1862', '0'), +('12', '37', '1', '10082', '1705', '0'), +('12', '37', '2', '1271', '4388', '0'), +('12', '37', '2', '10143', '3368', '0'), +('12', '37', '2', '1225', '2952', '0'), +('12', '37', '2', '1211', '2877', '0'), +('12', '37', '3', '11052', '4023', '0'), +('12', '37', '3', '1272', '2997', '0'), +('12', '37', '3', '4505', '1907', '0'), +('12', '37', '3', '2366', '1365', '0'), +('12', '37', '5', '27710', '4371', '0'), +('12', '37', '5', '14703', '3850', '0'), +('12', '37', '5', '14556', '3018', '0'), +('12', '37', '5', '11646', '2786', '0'), +('12', '37', '8', '11603', '7724', '0'), +('12', '37', '8', '2349', '2154', '0'), +('12', '37', '8', '1057', '1539', '0'), +('12', '37', '8', '1216', '1200', '0'), +('12', '37', '6', '1557', '5310', '0'), +('12', '37', '6', '1542', '4585', '0'), +('12', '37', '6', '1905', '3075', '0'), +('12', '37', '6', '1273', '2721', '0'), +('12', '37', '17', '11641', '7604', '0'), +('12', '37', '17', '1644', '6507', '0'), +('12', '37', '17', '1253', '6138', '0'), +('12', '37', '17', '1214', '5774', '0'), +('12', '37', '7', '1227', '2401', '0'), +('12', '37', '7', '1218', '2321', '0'), +('12', '37', '7', '1648', '1965', '0'), +('12', '37', '7', '1362', '1624', '0'), +('12', '37', '9', '12803', '2165', '0'), +('12', '37', '9', '1649', '1723', '0'), +('12', '37', '9', '4408', '1374', '0'), +('12', '37', '9', '4344', '1251', '0'), +('12', '37', '15', '11686', '4375', '0'), +('12', '37', '15', '10150', '1804', '0'), +('12', '37', '15', '10163', '1500', '0'), +('12', '37', '15', '14651', '1424', '0'), +('12', '37', '20', '11666', '5349', '0'), +('12', '37', '20', '2742', '3156', '0'), +('12', '37', '20', '1217', '1195', '0'), +('12', '37', '20', '1364', '1165', '0'), +('12', '37', '12', '1229', '3109', '0'), +('12', '37', '12', '20655', '2356', '0'), +('12', '37', '12', '2923', '2074', '0'), +('12', '37', '12', '2336', '1953', '0'), +('12', '37', '18', '1651', '1540', '0'), +('12', '37', '18', '4410', '742', '0'), +('12', '37', '18', '1230', '511', '0'), +('12', '37', '18', '1221', '454', '0'), +('12', '37', '19', '4407', '2474', '0'), +('12', '37', '19', '68239', '2128', '0'), +('12', '37', '19', '1652', '1234', '0'), +('12', '37', '19', '1368', '1216', '0'), +('12', '37', '13', '14337', '5783', '0'), +('12', '37', '13', '20656', '4971', '0'), +('12', '37', '13', '6359', '3535', '0'), +('12', '37', '13', '14360', '3382', '0'), +('12', '37', '14', '20656', '4971', '0'), +('12', '37', '14', '10219', '3681', '0'), +('12', '37', '14', '6359', '3535', '0'), +('12', '37', '14', '13987', '2741', '0'), +('12', '37', '11', '9246', '2694', '0'), +('12', '37', '11', '13353', '1500', '0'), +('12', '37', '11', '14762', '1404', '0'), +('12', '37', '11', '20677', '450', '0'), +('12', '38', '22', '10323', '0', '0'), +('12', '38', '22', '9246', '0', '0'), +('12', '38', '22', '21509', '0', '0'), +('12', '38', '22', '8007', '0', '0'), +('12', '38', '1', '14702', '2350', '0'), +('12', '38', '1', '30361', '2040', '0'), +('12', '38', '1', '14701', '1862', '0'), +('12', '38', '1', '10082', '1749', '0'), +('12', '38', '2', '1271', '4446', '0'), +('12', '38', '2', '10143', '3368', '0'), +('12', '38', '2', '1225', '3004', '0'), +('12', '38', '2', '1211', '2928', '0'), +('12', '38', '3', '11052', '4131', '0'), +('12', '38', '3', '1272', '3062', '0'), +('12', '38', '3', '4505', '1958', '0'), +('12', '38', '3', '2366', '1401', '0'), +('12', '38', '5', '27710', '4407', '0'), +('12', '38', '5', '14703', '3850', '0'), +('12', '38', '5', '14556', '3018', '0'), +('12', '38', '5', '11646', '2881', '0'), +('12', '38', '8', '11603', '7789', '0'), +('12', '38', '8', '2349', '2154', '0'), +('12', '38', '8', '1057', '1575', '0'), +('12', '38', '8', '1216', '1207', '0'), +('12', '38', '6', '1557', '5310', '0'), +('12', '38', '6', '1542', '4650', '0'), +('12', '38', '6', '1905', '3076', '0'), +('12', '38', '6', '1273', '2757', '0'), +('12', '38', '17', '11641', '7713', '0'), +('12', '38', '17', '1644', '6544', '0'), +('12', '38', '17', '1253', '6140', '0'), +('12', '38', '17', '1214', '5872', '0'), +('12', '38', '7', '1227', '2452', '0'), +('12', '38', '7', '1218', '2372', '0'), +('12', '38', '7', '1648', '2001', '0'), +('12', '38', '7', '1362', '1624', '0'), +('12', '38', '9', '12803', '2129', '0'), +('12', '38', '9', '1649', '1744', '0'), +('12', '38', '9', '4408', '1410', '0'), +('12', '38', '9', '4344', '1251', '0'), +('12', '38', '15', '11686', '4411', '0'), +('12', '38', '15', '10150', '1804', '0'), +('12', '38', '15', '10163', '1500', '0'), +('12', '38', '15', '14651', '1424', '0'), +('12', '38', '20', '11666', '5351', '0'), +('12', '38', '20', '2742', '3158', '0'), +('12', '38', '20', '1217', '1202', '0'), +('12', '38', '20', '1364', '1194', '0'), +('12', '38', '12', '1229', '3159', '0'), +('12', '38', '12', '20655', '2371', '0'), +('12', '38', '12', '2923', '2074', '0'), +('12', '38', '12', '2336', '1989', '0'), +('12', '38', '18', '1651', '1561', '0'), +('12', '38', '18', '4410', '742', '0'), +('12', '38', '18', '1230', '511', '0'), +('12', '38', '18', '1221', '454', '0'), +('12', '38', '19', '4407', '2539', '0'), +('12', '38', '19', '68239', '2150', '0'), +('12', '38', '19', '1652', '1234', '0'), +('12', '38', '19', '1368', '1216', '0'), +('12', '38', '13', '14337', '5855', '0'), +('12', '38', '13', '20656', '5007', '0'), +('12', '38', '13', '6359', '3607', '0'), +('12', '38', '13', '14360', '3455', '0'), +('12', '38', '14', '20656', '5007', '0'), +('12', '38', '14', '10219', '3681', '0'), +('12', '38', '14', '6359', '3607', '0'), +('12', '38', '14', '10404', '2779', '0'), +('12', '38', '11', '9246', '2766', '0'), +('12', '38', '11', '13353', '1500', '0'), +('12', '38', '11', '14762', '1404', '0'), +('12', '38', '11', '20677', '450', '0'), +('12', '39', '22', '10323', '0', '0'), +('12', '39', '22', '9246', '0', '0'), +('12', '39', '22', '21509', '0', '0'), +('12', '39', '22', '8007', '0', '0'), +('12', '39', '1', '14702', '2350', '0'), +('12', '39', '1', '30361', '2040', '0'), +('12', '39', '1', '14701', '1862', '0'), +('12', '39', '1', '10082', '1792', '0'), +('12', '39', '2', '1271', '4504', '0'), +('12', '39', '2', '10143', '3368', '0'), +('12', '39', '2', '1225', '3056', '0'), +('12', '39', '2', '1211', '2979', '0'), +('12', '39', '3', '11052', '4240', '0'), +('12', '39', '3', '1272', '3128', '0'), +('12', '39', '3', '4505', '2009', '0'), +('12', '39', '3', '2366', '1438', '0'), +('12', '39', '5', '27710', '4444', '0'), +('12', '39', '5', '14703', '3850', '0'), +('12', '39', '5', '14556', '3018', '0'), +('12', '39', '5', '11646', '2975', '0'), +('12', '39', '8', '11603', '7854', '0'), +('12', '39', '8', '2349', '2154', '0'), +('12', '39', '8', '1057', '1612', '0'), +('12', '39', '8', '1216', '1214', '0'), +('12', '39', '6', '1557', '5310', '0'), +('12', '39', '6', '1542', '4715', '0'), +('12', '39', '6', '1905', '3077', '0'), +('12', '39', '6', '1273', '2794', '0'), +('12', '39', '17', '11641', '7822', '0'), +('12', '39', '17', '1644', '6580', '0'), +('12', '39', '17', '1253', '6143', '0'), +('12', '39', '17', '1214', '5969', '0'), +('12', '39', '7', '1227', '2503', '0'), +('12', '39', '7', '1218', '2423', '0'), +('12', '39', '7', '1648', '2038', '0'), +('12', '39', '7', '1362', '1624', '0'), +('12', '39', '9', '12803', '2093', '0'), +('12', '39', '9', '1649', '1766', '0'), +('12', '39', '9', '4408', '1447', '0'), +('12', '39', '9', '4344', '1251', '0'), +('12', '39', '15', '11686', '4447', '0'), +('12', '39', '15', '10150', '1804', '0'), +('12', '39', '15', '10163', '1500', '0'), +('12', '39', '15', '14651', '1424', '0'), +('12', '39', '20', '11666', '5353', '0'), +('12', '39', '20', '2742', '3161', '0'), +('12', '39', '20', '1364', '1223', '0'), +('12', '39', '20', '1217', '1209', '0'), +('12', '39', '12', '1229', '3210', '0'), +('12', '39', '12', '20655', '2386', '0'), +('12', '39', '12', '2923', '2074', '0'), +('12', '39', '12', '2336', '2025', '0'), +('12', '39', '18', '1651', '1583', '0'), +('12', '39', '18', '4410', '742', '0'), +('12', '39', '18', '1230', '512', '0'), +('12', '39', '18', '1221', '454', '0'), +('12', '39', '19', '4407', '2604', '0'), +('12', '39', '19', '68239', '2171', '0'), +('12', '39', '19', '1652', '1234', '0'), +('12', '39', '19', '1368', '1216', '0'), +('12', '39', '13', '14337', '5928', '0'), +('12', '39', '13', '20656', '5044', '0'), +('12', '39', '13', '6359', '3680', '0'), +('12', '39', '13', '14360', '3527', '0'), +('12', '39', '14', '20656', '5044', '0'), +('12', '39', '14', '10219', '3681', '0'), +('12', '39', '14', '6359', '3680', '0'), +('12', '39', '14', '10404', '2844', '0'), +('12', '39', '11', '9246', '2839', '0'), +('12', '39', '11', '13353', '1500', '0'), +('12', '39', '11', '14762', '1404', '0'), +('12', '39', '11', '20677', '450', '0'), +('12', '40', '22', '10323', '0', '0'), +('12', '40', '22', '9246', '0', '0'), +('12', '40', '22', '21509', '0', '0'), +('12', '40', '22', '8007', '0', '0'), +('12', '40', '1', '14702', '2350', '0'), +('12', '40', '1', '30361', '2040', '0'), +('12', '40', '1', '14701', '1862', '0'), +('12', '40', '1', '10082', '1836', '0'), +('12', '40', '2', '1271', '4562', '0'), +('12', '40', '2', '10143', '3368', '0'), +('12', '40', '2', '1225', '3108', '0'), +('12', '40', '2', '1211', '3030', '0'), +('12', '40', '3', '11052', '4349', '0'), +('12', '40', '3', '1272', '3193', '0'), +('12', '40', '3', '4505', '2060', '0'), +('12', '40', '3', '2366', '1474', '0'), +('12', '40', '5', '27710', '4480', '0'), +('12', '40', '5', '14703', '3850', '0'), +('12', '40', '5', '11646', '3069', '0'), +('12', '40', '5', '14556', '3018', '0'), +('12', '40', '8', '11603', '7920', '0'), +('12', '40', '8', '2349', '2154', '0'), +('12', '40', '8', '1057', '1648', '0'), +('12', '40', '8', '1216', '1221', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '40', '6', '1557', '5310', '0'), +('12', '40', '6', '1542', '4781', '0'), +('12', '40', '6', '1905', '3079', '0'), +('12', '40', '6', '1273', '2830', '0'), +('12', '40', '17', '11641', '7930', '0'), +('12', '40', '17', '1644', '6616', '0'), +('12', '40', '17', '1253', '6145', '0'), +('12', '40', '17', '1214', '6066', '0'), +('12', '40', '7', '1227', '2554', '0'), +('12', '40', '7', '1218', '2474', '0'), +('12', '40', '7', '1648', '2074', '0'), +('12', '40', '7', '1362', '1624', '0'), +('12', '40', '9', '12803', '2056', '0'), +('12', '40', '9', '1649', '1788', '0'), +('12', '40', '9', '4408', '1483', '0'), +('12', '40', '9', '4344', '1251', '0'), +('12', '40', '15', '11686', '4483', '0'), +('12', '40', '15', '10150', '1804', '0'), +('12', '40', '15', '10163', '1500', '0'), +('12', '40', '15', '14651', '1424', '0'), +('12', '40', '20', '11666', '5354', '0'), +('12', '40', '20', '2742', '3163', '0'), +('12', '40', '20', '1364', '1252', '0'), +('12', '40', '20', '1217', '1216', '0'), +('12', '40', '12', '1229', '3261', '0'), +('12', '40', '12', '20655', '2401', '0'), +('12', '40', '12', '2923', '2074', '0'), +('12', '40', '12', '2336', '2062', '0'), +('12', '40', '18', '1651', '1605', '0'), +('12', '40', '18', '4410', '742', '0'), +('12', '40', '18', '1230', '513', '0'), +('12', '40', '18', '1221', '454', '0'), +('12', '40', '19', '4407', '2669', '0'), +('12', '40', '19', '68239', '2193', '0'), +('12', '40', '19', '1652', '1234', '0'), +('12', '40', '19', '1368', '1216', '0'), +('12', '40', '13', '14337', '6000', '0'), +('12', '40', '13', '20656', '5080', '0'), +('12', '40', '13', '6359', '3752', '0'), +('12', '40', '13', '14360', '3600', '0'), +('12', '40', '14', '20656', '5080', '0'), +('12', '40', '14', '6359', '3752', '0'), +('12', '40', '14', '10219', '3681', '0'), +('12', '40', '14', '9246', '2911', '0'), +('12', '40', '11', '9246', '2911', '0'), +('12', '40', '11', '13353', '1500', '0'), +('12', '40', '11', '14762', '1404', '0'), +('12', '40', '11', '20677', '450', '0'), +('12', '41', '22', '10323', '0', '0'), +('12', '41', '22', '9246', '0', '0'), +('12', '41', '22', '21509', '0', '0'), +('12', '41', '22', '8007', '0', '0'), +('12', '41', '1', '14702', '2350', '0'), +('12', '41', '1', '30361', '2040', '0'), +('12', '41', '1', '10082', '1879', '0'), +('12', '41', '1', '14701', '1862', '0'), +('12', '41', '2', '1271', '4620', '0'), +('12', '41', '2', '10143', '3368', '0'), +('12', '41', '2', '1225', '3160', '0'), +('12', '41', '2', '1211', '3080', '0'), +('12', '41', '3', '11052', '4458', '0'), +('12', '41', '3', '1272', '3258', '0'), +('12', '41', '3', '4505', '2110', '0'), +('12', '41', '3', '2366', '1510', '0'), +('12', '41', '5', '27710', '4516', '0'), +('12', '41', '5', '14703', '3850', '0'), +('12', '41', '5', '11646', '3163', '0'), +('12', '41', '5', '14556', '3018', '0'), +('12', '41', '8', '11603', '7985', '0'), +('12', '41', '8', '2349', '2154', '0'), +('12', '41', '8', '1057', '1684', '0'), +('12', '41', '8', '1216', '1229', '0'), +('12', '41', '6', '1557', '5310', '0'), +('12', '41', '6', '1542', '4846', '0'), +('12', '41', '6', '1905', '3080', '0'), +('12', '41', '6', '1273', '2866', '0'), +('12', '41', '17', '11641', '8039', '0'), +('12', '41', '17', '1644', '6652', '0'), +('12', '41', '17', '1226', '6170', '0'), +('12', '41', '17', '1214', '6164', '0'), +('12', '41', '7', '1227', '2604', '0'), +('12', '41', '7', '1218', '2524', '0'), +('12', '41', '7', '1648', '2110', '0'), +('12', '41', '7', '1362', '1624', '0'), +('12', '41', '9', '12803', '2020', '0'), +('12', '41', '9', '1649', '1810', '0'), +('12', '41', '9', '4408', '1519', '0'), +('12', '41', '9', '4344', '1251', '0'), +('12', '41', '15', '11686', '4520', '0'), +('12', '41', '15', '10150', '1804', '0'), +('12', '41', '15', '10163', '1500', '0'), +('12', '41', '15', '14651', '1424', '0'), +('12', '41', '20', '11666', '5356', '0'), +('12', '41', '20', '2742', '3165', '0'), +('12', '41', '20', '1364', '1281', '0'), +('12', '41', '20', '1217', '1224', '0'), +('12', '41', '12', '1229', '3312', '0'), +('12', '41', '12', '20655', '2416', '0'), +('12', '41', '12', '2336', '2098', '0'), +('12', '41', '12', '2923', '2074', '0'), +('12', '41', '18', '1651', '1627', '0'), +('12', '41', '18', '4410', '742', '0'), +('12', '41', '18', '1230', '514', '0'), +('12', '41', '18', '1221', '454', '0'), +('12', '41', '19', '4407', '2735', '0'), +('12', '41', '19', '68239', '2215', '0'), +('12', '41', '19', '1652', '1234', '0'), +('12', '41', '19', '1368', '1216', '0'), +('12', '41', '13', '14337', '6073', '0'), +('12', '41', '13', '20656', '5116', '0'), +('12', '41', '13', '6359', '3825', '0'), +('12', '41', '13', '14360', '3672', '0'), +('12', '41', '14', '20656', '5116', '0'), +('12', '41', '14', '6359', '3825', '0'), +('12', '41', '14', '10219', '3681', '0'), +('12', '41', '14', '9246', '2984', '0'), +('12', '41', '11', '9246', '2984', '0'), +('12', '41', '11', '13353', '1500', '0'), +('12', '41', '11', '14762', '1404', '0'), +('12', '41', '11', '20677', '450', '0'), +('12', '42', '22', '10323', '0', '0'), +('12', '42', '22', '9246', '0', '0'), +('12', '42', '22', '21509', '0', '0'), +('12', '42', '22', '8007', '0', '0'), +('12', '42', '1', '14702', '2350', '0'), +('12', '42', '1', '30361', '2040', '0'), +('12', '42', '1', '10082', '1923', '0'), +('12', '42', '1', '14701', '1862', '0'), +('12', '42', '2', '1271', '4678', '0'), +('12', '42', '2', '10143', '3368', '0'), +('12', '42', '2', '1225', '3212', '0'), +('12', '42', '2', '1211', '3131', '0'), +('12', '42', '3', '11052', '4566', '0'), +('12', '42', '3', '1272', '3323', '0'), +('12', '42', '3', '4505', '2161', '0'), +('12', '42', '3', '2366', '1546', '0'), +('12', '42', '5', '27710', '4552', '0'), +('12', '42', '5', '14703', '3850', '0'), +('12', '42', '5', '11646', '3257', '0'), +('12', '42', '5', '14556', '3018', '0'), +('12', '42', '8', '11603', '8050', '0'), +('12', '42', '8', '2349', '2154', '0'), +('12', '42', '8', '1057', '1720', '0'), +('12', '42', '8', '2364', '1245', '0'), +('12', '42', '6', '1557', '5310', '0'), +('12', '42', '6', '1542', '4911', '0'), +('12', '42', '6', '1905', '3081', '0'), +('12', '42', '6', '1273', '2902', '0'), +('12', '42', '17', '11641', '8148', '0'), +('12', '42', '17', '1644', '6689', '0'), +('12', '42', '17', '1226', '6275', '0'), +('12', '42', '17', '1214', '6261', '0'), +('12', '42', '7', '1227', '2655', '0'), +('12', '42', '7', '1218', '2575', '0'), +('12', '42', '7', '1648', '2146', '0'), +('12', '42', '7', '1362', '1624', '0'), +('12', '42', '9', '12803', '1984', '0'), +('12', '42', '9', '1649', '1831', '0'), +('12', '42', '9', '4408', '1555', '0'), +('12', '42', '9', '4344', '1251', '0'), +('12', '42', '15', '11686', '4556', '0'), +('12', '42', '15', '10150', '1804', '0'), +('12', '42', '15', '10163', '1500', '0'), +('12', '42', '15', '14651', '1424', '0'), +('12', '42', '20', '11666', '5358', '0'), +('12', '42', '20', '2742', '3168', '0'), +('12', '42', '20', '1364', '1310', '0'), +('12', '42', '20', '1217', '1231', '0'), +('12', '42', '12', '1229', '3362', '0'), +('12', '42', '12', '20655', '2431', '0'), +('12', '42', '12', '2336', '2134', '0'), +('12', '42', '12', '2923', '2074', '0'), +('12', '42', '18', '1651', '1648', '0'), +('12', '42', '18', '4410', '742', '0'), +('12', '42', '18', '1230', '514', '0'), +('12', '42', '18', '1221', '454', '0'), +('12', '42', '19', '4407', '2800', '0'), +('12', '42', '19', '68239', '2237', '0'), +('12', '42', '19', '1652', '1234', '0'), +('12', '42', '19', '1368', '1216', '0'), +('12', '42', '13', '14337', '6145', '0'), +('12', '42', '13', '20656', '5152', '0'), +('12', '42', '13', '6359', '3897', '0'), +('12', '42', '13', '14360', '3745', '0'), +('12', '42', '14', '20656', '5152', '0'), +('12', '42', '14', '6359', '3897', '0'), +('12', '42', '14', '10219', '3681', '0'), +('12', '42', '14', '9246', '3056', '0'), +('12', '42', '11', '9246', '3056', '0'), +('12', '42', '11', '13353', '1500', '0'), +('12', '42', '11', '14762', '1404', '0'), +('12', '42', '11', '20677', '450', '0'), +('12', '43', '22', '10323', '0', '0'), +('12', '43', '22', '9246', '0', '0'), +('12', '43', '22', '21509', '0', '0'), +('12', '43', '22', '8007', '0', '0'), +('12', '43', '1', '14702', '2350', '0'), +('12', '43', '1', '30361', '2040', '0'), +('12', '43', '1', '10082', '1966', '0'), +('12', '43', '1', '14701', '1862', '0'), +('12', '43', '2', '1271', '4736', '0'), +('12', '43', '2', '10143', '3368', '0'), +('12', '43', '2', '1225', '3264', '0'), +('12', '43', '2', '1211', '3182', '0'), +('12', '43', '3', '11052', '4675', '0'), +('12', '43', '3', '1272', '3388', '0'), +('12', '43', '3', '4505', '2212', '0'), +('12', '43', '3', '2366', '1582', '0'), +('12', '43', '5', '27710', '4589', '0'), +('12', '43', '5', '14703', '3850', '0'), +('12', '43', '5', '11646', '3352', '0'), +('12', '43', '5', '14556', '3018', '0'), +('12', '43', '8', '11603', '8115', '0'), +('12', '43', '8', '2349', '2154', '0'), +('12', '43', '8', '1057', '1757', '0'), +('12', '43', '8', '2340', '1271', '0'), +('12', '43', '6', '1557', '5310', '0'), +('12', '43', '6', '1542', '4976', '0'), +('12', '43', '6', '1905', '3082', '0'), +('12', '43', '6', '1273', '2939', '0'), +('12', '43', '17', '11641', '8257', '0'), +('12', '43', '17', '1644', '6725', '0'), +('12', '43', '17', '1226', '6379', '0'), +('12', '43', '17', '1214', '6359', '0'), +('12', '43', '7', '1227', '2706', '0'), +('12', '43', '7', '1218', '2626', '0'), +('12', '43', '7', '1648', '2182', '0'), +('12', '43', '7', '1362', '1624', '0'), +('12', '43', '9', '12803', '1948', '0'), +('12', '43', '9', '1649', '1853', '0'), +('12', '43', '9', '4408', '1592', '0'), +('12', '43', '9', '4344', '1251', '0'), +('12', '43', '15', '11686', '4592', '0'), +('12', '43', '15', '10150', '1804', '0'), +('12', '43', '15', '10163', '1500', '0'), +('12', '43', '15', '14651', '1424', '0'), +('12', '43', '20', '11666', '5360', '0'), +('12', '43', '20', '2742', '3170', '0'), +('12', '43', '20', '1364', '1339', '0'), +('12', '43', '20', '1217', '1238', '0'), +('12', '43', '12', '1229', '3413', '0'), +('12', '43', '12', '20655', '2446', '0'), +('12', '43', '12', '2336', '2170', '0'), +('12', '43', '12', '2923', '2074', '0'), +('12', '43', '18', '1651', '1670', '0'), +('12', '43', '18', '4410', '742', '0'), +('12', '43', '18', '1230', '515', '0'), +('12', '43', '18', '1221', '454', '0'), +('12', '43', '19', '4407', '2865', '0'), +('12', '43', '19', '68239', '2258', '0'), +('12', '43', '19', '1652', '1234', '0'), +('12', '43', '19', '1368', '1216', '0'), +('12', '43', '13', '14337', '6218', '0'), +('12', '43', '13', '20656', '5189', '0'), +('12', '43', '13', '6359', '3970', '0'), +('12', '43', '13', '14360', '3817', '0'), +('12', '43', '14', '20656', '5189', '0'), +('12', '43', '14', '6359', '3970', '0'), +('12', '43', '14', '10219', '3681', '0'), +('12', '43', '14', '9246', '3129', '0'), +('12', '43', '11', '9246', '3129', '0'), +('12', '43', '11', '13353', '1500', '0'), +('12', '43', '11', '14762', '1404', '0'), +('12', '43', '11', '20677', '450', '0'), +('12', '44', '22', '10323', '0', '0'), +('12', '44', '22', '9246', '0', '0'), +('12', '44', '22', '21509', '0', '0'), +('12', '44', '22', '8007', '0', '0'), +('12', '44', '1', '14702', '2350', '0'), +('12', '44', '1', '30361', '2040', '0'), +('12', '44', '1', '10082', '2010', '0'), +('12', '44', '1', '14701', '1862', '0'), +('12', '44', '2', '1271', '4794', '0'), +('12', '44', '2', '10143', '3368', '0'), +('12', '44', '2', '1225', '3316', '0'), +('12', '44', '2', '1211', '3233', '0'), +('12', '44', '3', '11052', '4784', '0'), +('12', '44', '3', '1272', '3454', '0'), +('12', '44', '3', '4505', '2263', '0'), +('12', '44', '3', '2366', '1619', '0'), +('12', '44', '5', '27710', '4625', '0'), +('12', '44', '5', '14703', '3850', '0'), +('12', '44', '5', '11646', '3446', '0'), +('12', '44', '5', '14556', '3018', '0'), +('12', '44', '8', '11603', '8181', '0'), +('12', '44', '8', '2349', '2154', '0'), +('12', '44', '8', '1057', '1793', '0'), +('12', '44', '8', '2340', '1300', '0'), +('12', '44', '6', '1557', '5310', '0'), +('12', '44', '6', '1542', '5041', '0'), +('12', '44', '6', '1905', '3083', '0'), +('12', '44', '6', '1273', '2975', '0'), +('12', '44', '17', '11641', '8365', '0'), +('12', '44', '17', '1644', '6761', '0'), +('12', '44', '17', '1226', '6484', '0'), +('12', '44', '17', '1214', '6456', '0'), +('12', '44', '7', '1227', '2757', '0'), +('12', '44', '7', '1218', '2677', '0'), +('12', '44', '7', '1648', '2219', '0'), +('12', '44', '7', '1362', '1624', '0'), +('12', '44', '9', '12803', '1911', '0'), +('12', '44', '9', '1649', '1875', '0'), +('12', '44', '9', '4408', '1628', '0'), +('12', '44', '9', '4344', '1251', '0'), +('12', '44', '15', '11686', '4628', '0'), +('12', '44', '15', '10150', '1804', '0'), +('12', '44', '15', '10163', '1500', '0'), +('12', '44', '15', '14651', '1424', '0'), +('12', '44', '20', '11666', '5361', '0'), +('12', '44', '20', '2742', '3173', '0'), +('12', '44', '20', '1364', '1368', '0'), +('12', '44', '20', '1217', '1245', '0'), +('12', '44', '12', '1229', '3464', '0'), +('12', '44', '12', '20655', '2461', '0'), +('12', '44', '12', '2336', '2207', '0'), +('12', '44', '12', '2923', '2074', '0'), +('12', '44', '18', '1651', '1692', '0'), +('12', '44', '18', '4410', '742', '0'), +('12', '44', '18', '1230', '516', '0'), +('12', '44', '18', '1221', '454', '0'), +('12', '44', '19', '4407', '2930', '0'), +('12', '44', '19', '68239', '2280', '0'), +('12', '44', '19', '1652', '1234', '0'), +('12', '44', '19', '1368', '1216', '0'), +('12', '44', '13', '14337', '6290', '0'), +('12', '44', '13', '20656', '5225', '0'), +('12', '44', '13', '6359', '4042', '0'), +('12', '44', '13', '14360', '3890', '0'), +('12', '44', '14', '20656', '5225', '0'), +('12', '44', '14', '6359', '4042', '0'), +('12', '44', '14', '10219', '3681', '0'), +('12', '44', '14', '9246', '3201', '0'), +('12', '44', '11', '9246', '3201', '0'), +('12', '44', '11', '13353', '1500', '0'), +('12', '44', '11', '14762', '1404', '0'), +('12', '44', '11', '20677', '450', '0'), +('12', '45', '22', '10323', '0', '0'), +('12', '45', '22', '9246', '0', '0'), +('12', '45', '22', '21509', '0', '0'), +('12', '45', '22', '8007', '0', '0'), +('12', '45', '1', '14702', '2350', '0'), +('12', '45', '1', '10082', '2053', '0'), +('12', '45', '1', '30361', '2040', '0'), +('12', '45', '1', '14701', '1862', '0'), +('12', '45', '2', '1271', '4852', '0'), +('12', '45', '2', '10143', '3368', '0'), +('12', '45', '2', '1225', '3368', '0'), +('12', '45', '2', '1211', '3283', '0'), +('12', '45', '3', '11052', '4892', '0'), +('12', '45', '3', '1272', '3519', '0'), +('12', '45', '3', '4505', '2313', '0'), +('12', '45', '3', '2366', '1655', '0'), +('12', '45', '5', '27710', '4661', '0'), +('12', '45', '5', '14703', '3850', '0'), +('12', '45', '5', '11646', '3540', '0'), +('12', '45', '5', '14556', '3018', '0'), +('12', '45', '8', '11603', '8246', '0'), +('12', '45', '8', '2349', '2154', '0'), +('12', '45', '8', '1057', '1829', '0'), +('12', '45', '8', '2340', '1329', '0'), +('12', '45', '6', '1557', '5310', '0'), +('12', '45', '6', '1542', '5107', '0'), +('12', '45', '6', '1905', '3085', '0'), +('12', '45', '6', '1273', '3011', '0'), +('12', '45', '17', '11641', '8474', '0'), +('12', '45', '17', '1644', '6797', '0'), +('12', '45', '17', '1226', '6589', '0'), +('12', '45', '17', '1214', '6553', '0'), +('12', '45', '7', '1227', '2807', '0'), +('12', '45', '7', '1218', '2727', '0'), +('12', '45', '7', '1648', '2255', '0'), +('12', '45', '7', '1362', '1624', '0'), +('12', '45', '9', '1649', '1897', '0'), +('12', '45', '9', '12803', '1875', '0'), +('12', '45', '9', '4408', '1664', '0'), +('12', '45', '9', '4344', '1251', '0'), +('12', '45', '15', '11686', '4665', '0'), +('12', '45', '15', '10150', '1804', '0'), +('12', '45', '15', '10163', '1500', '0'), +('12', '45', '15', '14651', '1424', '0'), +('12', '45', '20', '11666', '5363', '0'), +('12', '45', '20', '2742', '3175', '0'), +('12', '45', '20', '1364', '1397', '0'), +('12', '45', '20', '1217', '1253', '0'), +('12', '45', '12', '1229', '3515', '0'), +('12', '45', '12', '20655', '2476', '0'), +('12', '45', '12', '2336', '2243', '0'), +('12', '45', '12', '2923', '2074', '0'), +('12', '45', '18', '1651', '1714', '0'), +('12', '45', '18', '4410', '742', '0'), +('12', '45', '18', '1230', '516', '0'), +('12', '45', '18', '1221', '454', '0'), +('12', '45', '19', '4407', '2996', '0'), +('12', '45', '19', '68239', '2302', '0'), +('12', '45', '19', '1652', '1234', '0'), +('12', '45', '19', '1368', '1216', '0'), +('12', '45', '13', '14337', '6363', '0'), +('12', '45', '13', '20656', '5261', '0'), +('12', '45', '13', '6359', '4115', '0'), +('12', '45', '13', '14360', '3962', '0'), +('12', '45', '14', '20656', '5261', '0'), +('12', '45', '14', '6359', '4115', '0'), +('12', '45', '14', '10219', '3681', '0'), +('12', '45', '14', '9246', '3274', '0'), +('12', '45', '11', '9246', '3274', '0'), +('12', '45', '11', '13353', '1500', '0'), +('12', '45', '11', '14762', '1404', '0'), +('12', '45', '11', '20677', '450', '0'), +('12', '46', '22', '10323', '0', '0'), +('12', '46', '22', '9246', '0', '0'), +('12', '46', '22', '21509', '0', '0'), +('12', '46', '22', '8007', '0', '0'), +('12', '46', '1', '14702', '2350', '0'), +('12', '46', '1', '10082', '2097', '0'), +('12', '46', '1', '30361', '2040', '0'), +('12', '46', '1', '14701', '1862', '0'), +('12', '46', '2', '1271', '4910', '0'), +('12', '46', '2', '1225', '3420', '0'), +('12', '46', '2', '10143', '3368', '0'), +('12', '46', '2', '1211', '3334', '0'), +('12', '46', '3', '11052', '5001', '0'), +('12', '46', '3', '1272', '3584', '0'), +('12', '46', '3', '4505', '2364', '0'), +('12', '46', '3', '2366', '1691', '0'), +('12', '46', '5', '27710', '4697', '0'), +('12', '46', '5', '14703', '3850', '0'), +('12', '46', '5', '11646', '3634', '0'), +('12', '46', '5', '14556', '3018', '0'), +('12', '46', '8', '11603', '8311', '0'), +('12', '46', '8', '2349', '2154', '0'), +('12', '46', '8', '1057', '1865', '0'), +('12', '46', '8', '2340', '1358', '0'), +('12', '46', '6', '1557', '5310', '0'), +('12', '46', '6', '1542', '5172', '0'), +('12', '46', '6', '1905', '3086', '0'), +('12', '46', '6', '1273', '3047', '0'), +('12', '46', '17', '11641', '8583', '0'), +('12', '46', '17', '1644', '6833', '0'), +('12', '46', '17', '1226', '6694', '0'), +('12', '46', '17', '1214', '6651', '0'), +('12', '46', '7', '1227', '2858', '0'), +('12', '46', '7', '1218', '2778', '0'), +('12', '46', '7', '1648', '2291', '0'), +('12', '46', '7', '1362', '1624', '0'), +('12', '46', '9', '1649', '1918', '0'), +('12', '46', '9', '12803', '1839', '0'), +('12', '46', '9', '4408', '1700', '0'), +('12', '46', '9', '4344', '1251', '0'), +('12', '46', '15', '11686', '4701', '0'), +('12', '46', '15', '10150', '1804', '0'), +('12', '46', '15', '10163', '1500', '0'), +('12', '46', '15', '14651', '1424', '0'), +('12', '46', '20', '11666', '5365', '0'), +('12', '46', '20', '2742', '3178', '0'), +('12', '46', '20', '1364', '1426', '0'), +('12', '46', '20', '1217', '1260', '0'), +('12', '46', '12', '1229', '3565', '0'), +('12', '46', '12', '20655', '2491', '0'), +('12', '46', '12', '2336', '2279', '0'), +('12', '46', '12', '2923', '2074', '0'), +('12', '46', '18', '1651', '1735', '0'), +('12', '46', '18', '4410', '742', '0'), +('12', '46', '18', '1230', '517', '0'), +('12', '46', '18', '1221', '454', '0'), +('12', '46', '19', '4407', '3061', '0'), +('12', '46', '19', '68239', '2324', '0'), +('12', '46', '19', '1652', '1234', '0'), +('12', '46', '19', '1368', '1216', '0'), +('12', '46', '13', '14337', '6435', '0'), +('12', '46', '13', '20656', '5297', '0'), +('12', '46', '13', '6359', '4187', '0'), +('12', '46', '13', '14360', '4034', '0'), +('12', '46', '14', '20656', '5297', '0'), +('12', '46', '14', '6359', '4187', '0'), +('12', '46', '14', '10219', '3681', '0'), +('12', '46', '14', '9246', '3346', '0'), +('12', '46', '11', '9246', '3346', '0'), +('12', '46', '11', '13353', '1500', '0'), +('12', '46', '11', '14762', '1404', '0'), +('12', '46', '11', '20677', '450', '0'), +('12', '47', '22', '10323', '0', '0'), +('12', '47', '22', '9246', '0', '0'), +('12', '47', '22', '21509', '0', '0'), +('12', '47', '22', '8007', '0', '0'), +('12', '47', '1', '14702', '2350', '0'), +('12', '47', '1', '10082', '2140', '0'), +('12', '47', '1', '30361', '2040', '0'), +('12', '47', '1', '14701', '1862', '0'), +('12', '47', '2', '1271', '4968', '0'), +('12', '47', '2', '1225', '3472', '0'), +('12', '47', '2', '1211', '3385', '0'), +('12', '47', '2', '10143', '3368', '0'), +('12', '47', '3', '11052', '5110', '0'), +('12', '47', '3', '1272', '3649', '0'), +('12', '47', '3', '4505', '2415', '0'), +('12', '47', '3', '2366', '1727', '0'), +('12', '47', '5', '27710', '4733', '0'), +('12', '47', '5', '14703', '3850', '0'), +('12', '47', '5', '11646', '3729', '0'), +('12', '47', '5', '14556', '3018', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '47', '8', '11603', '8376', '0'), +('12', '47', '8', '2349', '2154', '0'), +('12', '47', '8', '1057', '1902', '0'), +('12', '47', '8', '2340', '1387', '0'), +('12', '47', '6', '1557', '5310', '0'), +('12', '47', '6', '1542', '5237', '0'), +('12', '47', '6', '1905', '3087', '0'), +('12', '47', '6', '1273', '3083', '0'), +('12', '47', '17', '11641', '8691', '0'), +('12', '47', '17', '1644', '6870', '0'), +('12', '47', '17', '1226', '6799', '0'), +('12', '47', '17', '1214', '6748', '0'), +('12', '47', '7', '1227', '2909', '0'), +('12', '47', '7', '1218', '2829', '0'), +('12', '47', '7', '1648', '2327', '0'), +('12', '47', '7', '1362', '1624', '0'), +('12', '47', '9', '1649', '1940', '0'), +('12', '47', '9', '12803', '1803', '0'), +('12', '47', '9', '4408', '1737', '0'), +('12', '47', '9', '4344', '1251', '0'), +('12', '47', '15', '11686', '4737', '0'), +('12', '47', '15', '10150', '1804', '0'), +('12', '47', '15', '10163', '1500', '0'), +('12', '47', '15', '14651', '1424', '0'), +('12', '47', '20', '11666', '5366', '0'), +('12', '47', '20', '2742', '3180', '0'), +('12', '47', '20', '1364', '1455', '0'), +('12', '47', '20', '1217', '1267', '0'), +('12', '47', '12', '1229', '3616', '0'), +('12', '47', '12', '20655', '2505', '0'), +('12', '47', '12', '2336', '2315', '0'), +('12', '47', '12', '1650', '2092', '0'), +('12', '47', '18', '1651', '1757', '0'), +('12', '47', '18', '4410', '742', '0'), +('12', '47', '18', '1230', '518', '0'), +('12', '47', '18', '1221', '454', '0'), +('12', '47', '19', '4407', '3126', '0'), +('12', '47', '19', '68239', '2345', '0'), +('12', '47', '19', '1652', '1234', '0'), +('12', '47', '19', '1368', '1216', '0'), +('12', '47', '13', '14337', '6508', '0'), +('12', '47', '13', '20656', '5333', '0'), +('12', '47', '13', '6359', '4260', '0'), +('12', '47', '13', '14360', '4107', '0'), +('12', '47', '14', '20656', '5333', '0'), +('12', '47', '14', '6359', '4260', '0'), +('12', '47', '14', '10219', '3681', '0'), +('12', '47', '14', '9246', '3419', '0'), +('12', '47', '11', '9246', '3419', '0'), +('12', '47', '11', '13353', '1500', '0'), +('12', '47', '11', '14762', '1404', '0'), +('12', '47', '11', '20677', '450', '0'), +('12', '48', '22', '10323', '0', '0'), +('12', '48', '22', '9246', '0', '0'), +('12', '48', '22', '21509', '0', '0'), +('12', '48', '22', '8007', '0', '0'), +('12', '48', '1', '14702', '2350', '0'), +('12', '48', '1', '10082', '2184', '0'), +('12', '48', '1', '30361', '2040', '0'), +('12', '48', '1', '14701', '1862', '0'), +('12', '48', '2', '1271', '5026', '0'), +('12', '48', '2', '1225', '3524', '0'), +('12', '48', '2', '1211', '3436', '0'), +('12', '48', '2', '10143', '3368', '0'), +('12', '48', '3', '11052', '5219', '0'), +('12', '48', '3', '1272', '3715', '0'), +('12', '48', '3', '4505', '2466', '0'), +('12', '48', '3', '2366', '1764', '0'), +('12', '48', '5', '27710', '4770', '0'), +('12', '48', '5', '14703', '3850', '0'), +('12', '48', '5', '11646', '3823', '0'), +('12', '48', '5', '14556', '3018', '0'), +('12', '48', '8', '11603', '8442', '0'), +('12', '48', '8', '2349', '2154', '0'), +('12', '48', '8', '1057', '1938', '0'), +('12', '48', '8', '2340', '1416', '0'), +('12', '48', '6', '1557', '5310', '0'), +('12', '48', '6', '1542', '5302', '0'), +('12', '48', '6', '1273', '3120', '0'), +('12', '48', '6', '1905', '3088', '0'), +('12', '48', '17', '11641', '8800', '0'), +('12', '48', '17', '1644', '6906', '0'), +('12', '48', '17', '1226', '6904', '0'), +('12', '48', '17', '1214', '6845', '0'), +('12', '48', '7', '1227', '2959', '0'), +('12', '48', '7', '1218', '2879', '0'), +('12', '48', '7', '1648', '2364', '0'), +('12', '48', '7', '1362', '1624', '0'), +('12', '48', '9', '1649', '1962', '0'), +('12', '48', '9', '4408', '1773', '0'), +('12', '48', '9', '12803', '1767', '0'), +('12', '48', '9', '4344', '1251', '0'), +('12', '48', '15', '11686', '4773', '0'), +('12', '48', '15', '10150', '1804', '0'), +('12', '48', '15', '10163', '1500', '0'), +('12', '48', '15', '14651', '1424', '0'), +('12', '48', '20', '11666', '5368', '0'), +('12', '48', '20', '2742', '3182', '0'), +('12', '48', '20', '1364', '1484', '0'), +('12', '48', '20', '1217', '1274', '0'), +('12', '48', '12', '1229', '3667', '0'), +('12', '48', '12', '20655', '2520', '0'), +('12', '48', '12', '2336', '2352', '0'), +('12', '48', '12', '1650', '2121', '0'), +('12', '48', '18', '1651', '1779', '0'), +('12', '48', '18', '4410', '742', '0'), +('12', '48', '18', '1230', '519', '0'), +('12', '48', '18', '1221', '454', '0'), +('12', '48', '19', '4407', '3191', '0'), +('12', '48', '19', '68239', '2367', '0'), +('12', '48', '19', '1652', '1234', '0'), +('12', '48', '19', '1368', '1216', '0'), +('12', '48', '13', '14337', '6580', '0'), +('12', '48', '13', '20656', '5370', '0'), +('12', '48', '13', '6359', '4332', '0'), +('12', '48', '13', '14360', '4179', '0'), +('12', '48', '14', '20656', '5370', '0'), +('12', '48', '14', '6359', '4332', '0'), +('12', '48', '14', '10219', '3681', '0'), +('12', '48', '14', '9246', '3491', '0'), +('12', '48', '11', '9246', '3491', '0'), +('12', '48', '11', '13353', '1500', '0'), +('12', '48', '11', '14762', '1404', '0'), +('12', '48', '11', '20677', '450', '0'), +('12', '49', '22', '10323', '0', '0'), +('12', '49', '22', '9246', '0', '0'), +('12', '49', '22', '21509', '0', '0'), +('12', '49', '22', '8007', '0', '0'), +('12', '49', '1', '14702', '2350', '0'), +('12', '49', '1', '10082', '2227', '0'), +('12', '49', '1', '30361', '2040', '0'), +('12', '49', '1', '14701', '1862', '0'), +('12', '49', '2', '1271', '5083', '0'), +('12', '49', '2', '1225', '3575', '0'), +('12', '49', '2', '1211', '3486', '0'), +('12', '49', '2', '10143', '3368', '0'), +('12', '49', '3', '11052', '5327', '0'), +('12', '49', '3', '1272', '3780', '0'), +('12', '49', '3', '4505', '2516', '0'), +('12', '49', '3', '2366', '1800', '0'), +('12', '49', '5', '27710', '4806', '0'), +('12', '49', '5', '11646', '3917', '0'), +('12', '49', '5', '14703', '3850', '0'), +('12', '49', '5', '14556', '3018', '0'), +('12', '49', '8', '11603', '8507', '0'), +('12', '49', '8', '2349', '2154', '0'), +('12', '49', '8', '1057', '1974', '0'), +('12', '49', '8', '2340', '1445', '0'), +('12', '49', '6', '1542', '5368', '0'), +('12', '49', '6', '1557', '5310', '0'), +('12', '49', '6', '1273', '3156', '0'), +('12', '49', '6', '1905', '3089', '0'), +('12', '49', '17', '11641', '8909', '0'), +('12', '49', '17', '1226', '7009', '0'), +('12', '49', '17', '1214', '6943', '0'), +('12', '49', '17', '1644', '6942', '0'), +('12', '49', '7', '1227', '3010', '0'), +('12', '49', '7', '1218', '2930', '0'), +('12', '49', '7', '1648', '2400', '0'), +('12', '49', '7', '1362', '1624', '0'), +('12', '49', '9', '1649', '1984', '0'), +('12', '49', '9', '4408', '1809', '0'), +('12', '49', '9', '12803', '1730', '0'), +('12', '49', '9', '4344', '1251', '0'), +('12', '49', '15', '11686', '4810', '0'), +('12', '49', '15', '10150', '1804', '0'), +('12', '49', '15', '10163', '1500', '0'), +('12', '49', '15', '14651', '1424', '0'), +('12', '49', '20', '11666', '5370', '0'), +('12', '49', '20', '2742', '3185', '0'), +('12', '49', '20', '1364', '1513', '0'), +('12', '49', '20', '1217', '1282', '0'), +('12', '49', '12', '1229', '3717', '0'), +('12', '49', '12', '20655', '2535', '0'), +('12', '49', '12', '2336', '2388', '0'), +('12', '49', '12', '1650', '2150', '0'), +('12', '49', '18', '1651', '1800', '0'), +('12', '49', '18', '4410', '742', '0'), +('12', '49', '18', '1230', '519', '0'), +('12', '49', '18', '1221', '454', '0'), +('12', '49', '19', '4407', '3257', '0'), +('12', '49', '19', '68239', '2389', '0'), +('12', '49', '19', '1652', '1234', '0'), +('12', '49', '19', '1368', '1216', '0'), +('12', '49', '13', '14337', '6653', '0'), +('12', '49', '13', '20656', '5406', '0'), +('12', '49', '13', '6359', '4405', '0'), +('12', '49', '13', '14360', '4252', '0'), +('12', '49', '14', '20656', '5406', '0'), +('12', '49', '14', '6359', '4405', '0'), +('12', '49', '14', '10219', '3681', '0'), +('12', '49', '14', '9246', '3564', '0'), +('12', '49', '11', '9246', '3564', '0'), +('12', '49', '11', '13353', '1500', '0'), +('12', '49', '11', '14762', '1404', '0'), +('12', '49', '11', '20677', '450', '0'), +('12', '50', '22', '10323', '0', '0'), +('12', '50', '22', '9246', '0', '0'), +('12', '50', '22', '21509', '0', '0'), +('12', '50', '22', '8007', '0', '0'), +('12', '50', '1', '14702', '2350', '0'), +('12', '50', '1', '10082', '2271', '0'), +('12', '50', '1', '30361', '2040', '0'), +('12', '50', '1', '14701', '1862', '0'), +('12', '50', '2', '1271', '5141', '0'), +('12', '50', '2', '1225', '3627', '0'), +('12', '50', '2', '1211', '3537', '0'), +('12', '50', '2', '10143', '3368', '0'), +('12', '50', '3', '11052', '5436', '0'), +('12', '50', '3', '1272', '3845', '0'), +('12', '50', '3', '4505', '2567', '0'), +('12', '50', '3', '2366', '1836', '0'), +('12', '50', '5', '27710', '4842', '0'), +('12', '50', '5', '11646', '4011', '0'), +('12', '50', '5', '14703', '3850', '0'), +('12', '50', '5', '14556', '3018', '0'), +('12', '50', '8', '11603', '8572', '0'), +('12', '50', '8', '2349', '2154', '0'), +('12', '50', '8', '1057', '2010', '0'), +('12', '50', '8', '2340', '1474', '0'), +('12', '50', '6', '1542', '5433', '0'), +('12', '50', '6', '1557', '5310', '0'), +('12', '50', '6', '1273', '3192', '0'), +('12', '50', '6', '1905', '3091', '0'), +('12', '50', '17', '11641', '9018', '0'), +('12', '50', '17', '1226', '7113', '0'), +('12', '50', '17', '1214', '7040', '0'), +('12', '50', '17', '1644', '6978', '0'), +('12', '50', '7', '1227', '3061', '0'), +('12', '50', '7', '1218', '2981', '0'), +('12', '50', '7', '1648', '2436', '0'), +('12', '50', '7', '2458', '1636', '0'), +('12', '50', '9', '1649', '2005', '0'), +('12', '50', '9', '4408', '1845', '0'), +('12', '50', '9', '12803', '1694', '0'), +('12', '50', '9', '4344', '1251', '0'), +('12', '50', '15', '11686', '4846', '0'), +('12', '50', '15', '10150', '1804', '0'), +('12', '50', '15', '10163', '1500', '0'), +('12', '50', '15', '14639', '1450', '0'), +('12', '50', '20', '11666', '5371', '0'), +('12', '50', '20', '2742', '3187', '0'), +('12', '50', '20', '1364', '1542', '0'), +('12', '50', '20', '1217', '1289', '0'), +('12', '50', '12', '1229', '3768', '0'), +('12', '50', '12', '20655', '2550', '0'), +('12', '50', '12', '2336', '2424', '0'), +('12', '50', '12', '4345', '2184', '0'), +('12', '50', '18', '1651', '1822', '0'), +('12', '50', '18', '4410', '742', '0'), +('12', '50', '18', '1230', '520', '0'), +('12', '50', '18', '1221', '454', '0'), +('12', '50', '19', '4407', '3322', '0'), +('12', '50', '19', '68239', '2411', '0'), +('12', '50', '19', '1652', '1234', '0'), +('12', '50', '19', '1368', '1216', '0'), +('12', '50', '13', '14337', '6725', '0'), +('12', '50', '13', '20656', '5442', '0'), +('12', '50', '13', '6359', '4477', '0'), +('12', '50', '13', '14360', '4324', '0'), +('12', '50', '14', '20656', '5442', '0'), +('12', '50', '14', '6359', '4477', '0'), +('12', '50', '14', '10219', '3681', '0'), +('12', '50', '14', '9246', '3636', '0'), +('12', '50', '11', '9246', '3636', '0'), +('12', '50', '11', '13353', '1500', '0'), +('12', '50', '11', '14762', '1404', '0'), +('12', '50', '11', '20677', '450', '0'), +('12', '51', '22', '10323', '0', '0'), +('12', '51', '22', '9246', '0', '0'), +('12', '51', '22', '21509', '0', '0'), +('12', '51', '22', '8007', '0', '0'), +('12', '51', '1', '14702', '2350', '0'), +('12', '51', '1', '10082', '2314', '0'), +('12', '51', '1', '30361', '2040', '0'), +('12', '51', '1', '14701', '1862', '0'), +('12', '51', '2', '1271', '5199', '0'), +('12', '51', '2', '1225', '3679', '0'), +('12', '51', '2', '1211', '3588', '0'), +('12', '51', '2', '10143', '3368', '0'), +('12', '51', '3', '11052', '5545', '0'), +('12', '51', '3', '1272', '3910', '0'), +('12', '51', '3', '4505', '2618', '0'), +('12', '51', '3', '2366', '1872', '0'), +('12', '51', '5', '27710', '4878', '0'), +('12', '51', '5', '11646', '4105', '0'), +('12', '51', '5', '14703', '3850', '0'), +('12', '51', '5', '14556', '3018', '0'), +('12', '51', '8', '11603', '8637', '0'), +('12', '51', '8', '2349', '2154', '0'), +('12', '51', '8', '1057', '2047', '0'), +('12', '51', '8', '2340', '1503', '0'), +('12', '51', '6', '1542', '5498', '0'), +('12', '51', '6', '1557', '5310', '0'), +('12', '51', '6', '1273', '3228', '0'), +('12', '51', '6', '1905', '3092', '0'), +('12', '51', '17', '11641', '9126', '0'), +('12', '51', '17', '1226', '7218', '0'), +('12', '51', '17', '1214', '7137', '0'), +('12', '51', '17', '1644', '7015', '0'), +('12', '51', '7', '1227', '3112', '0'), +('12', '51', '7', '1218', '3032', '0'), +('12', '51', '7', '1648', '2472', '0'), +('12', '51', '7', '2458', '1665', '0'), +('12', '51', '9', '1649', '2027', '0'), +('12', '51', '9', '4408', '1881', '0'), +('12', '51', '9', '12803', '1658', '0'), +('12', '51', '9', '4344', '1251', '0'), +('12', '51', '15', '11686', '4882', '0'), +('12', '51', '15', '10150', '1804', '0'), +('12', '51', '15', '10163', '1500', '0'), +('12', '51', '15', '14639', '1479', '0'), +('12', '51', '20', '11666', '5373', '0'), +('12', '51', '20', '2742', '3190', '0'), +('12', '51', '20', '1364', '1571', '0'), +('12', '51', '20', '1217', '1296', '0'), +('12', '51', '12', '1229', '3819', '0'), +('12', '51', '12', '20655', '2565', '0'), +('12', '51', '12', '2336', '2460', '0'), +('12', '51', '12', '4345', '2221', '0'), +('12', '51', '18', '1651', '1844', '0'), +('12', '51', '18', '4410', '742', '0'), +('12', '51', '18', '1230', '521', '0'), +('12', '51', '18', '1221', '454', '0'), +('12', '51', '19', '4407', '3387', '0'), +('12', '51', '19', '68239', '2432', '0'), +('12', '51', '19', '1652', '1234', '0'), +('12', '51', '19', '1368', '1216', '0'), +('12', '51', '13', '14337', '6798', '0'), +('12', '51', '13', '20656', '5478', '0'), +('12', '51', '13', '6359', '4550', '0'), +('12', '51', '13', '14360', '4397', '0'), +('12', '51', '14', '20656', '5478', '0'), +('12', '51', '14', '6359', '4550', '0'), +('12', '51', '14', '9246', '3709', '0'), +('12', '51', '14', '10219', '3681', '0'), +('12', '51', '11', '9246', '3709', '0'), +('12', '51', '11', '13353', '1500', '0'), +('12', '51', '11', '14762', '1404', '0'), +('12', '51', '11', '20677', '450', '0'), +('12', '52', '22', '10323', '0', '0'), +('12', '52', '22', '9246', '0', '0'), +('12', '52', '22', '21509', '0', '0'), +('12', '52', '22', '8007', '0', '0'), +('12', '52', '1', '10082', '2358', '0'), +('12', '52', '1', '14702', '2350', '0'), +('12', '52', '1', '30361', '2040', '0'), +('12', '52', '1', '10107', '1884', '0'), +('12', '52', '2', '1271', '5257', '0'), +('12', '52', '2', '1225', '3731', '0'), +('12', '52', '2', '1211', '3638', '0'), +('12', '52', '2', '10141', '3404', '0'), +('12', '52', '3', '11052', '5653', '0'), +('12', '52', '3', '1272', '3976', '0'), +('12', '52', '3', '4505', '2668', '0'), +('12', '52', '3', '2366', '1909', '0'), +('12', '52', '5', '27710', '4915', '0'), +('12', '52', '5', '11646', '4200', '0'), +('12', '52', '5', '14703', '3850', '0'), +('12', '52', '5', '14556', '3018', '0'), +('12', '52', '8', '11603', '8702', '0'), +('12', '52', '8', '2349', '2154', '0'), +('12', '52', '8', '1057', '2083', '0'), +('12', '52', '8', '2340', '1532', '0'), +('12', '52', '6', '1542', '5563', '0'), +('12', '52', '6', '1557', '5310', '0'), +('12', '52', '6', '1273', '3265', '0'), +('12', '52', '6', '1905', '3093', '0'), +('12', '52', '17', '11641', '9235', '0'), +('12', '52', '17', '1226', '7323', '0'), +('12', '52', '17', '1214', '7235', '0'), +('12', '52', '17', '1644', '7051', '0'), +('12', '52', '7', '1227', '3162', '0'), +('12', '52', '7', '1218', '3082', '0'), +('12', '52', '7', '1648', '2509', '0'), +('12', '52', '7', '2458', '1694', '0'), +('12', '52', '9', '1649', '2049', '0'), +('12', '52', '9', '4408', '1918', '0'), +('12', '52', '9', '12803', '1622', '0'), +('12', '52', '9', '10360', '1257', '0'), +('12', '52', '15', '11686', '4918', '0'), +('12', '52', '15', '10150', '1804', '0'), +('12', '52', '15', '14639', '1508', '0'), +('12', '52', '15', '10163', '1500', '0'), +('12', '52', '20', '11666', '5375', '0'), +('12', '52', '20', '2742', '3192', '0'), +('12', '52', '20', '1364', '1600', '0'), +('12', '52', '20', '1217', '1303', '0'), +('12', '52', '12', '1229', '3870', '0'), +('12', '52', '12', '20655', '2580', '0'), +('12', '52', '12', '2336', '2497', '0'), +('12', '52', '12', '4345', '2257', '0'), +('12', '52', '18', '1651', '1866', '0'), +('12', '52', '18', '4410', '742', '0'), +('12', '52', '18', '1230', '522', '0'), +('12', '52', '18', '1221', '454', '0'), +('12', '52', '19', '4407', '3452', '0'), +('12', '52', '19', '68239', '2454', '0'), +('12', '52', '19', '1652', '1234', '0'), +('12', '52', '19', '1368', '1216', '0'), +('12', '52', '13', '14337', '6870', '0'), +('12', '52', '13', '20656', '5515', '0'), +('12', '52', '13', '6359', '4622', '0'), +('12', '52', '13', '14360', '4469', '0'), +('12', '52', '14', '20656', '5515', '0'), +('12', '52', '14', '6359', '4622', '0'), +('12', '52', '14', '9246', '3781', '0'), +('12', '52', '14', '10404', '3692', '0'), +('12', '52', '11', '9246', '3781', '0'), +('12', '52', '11', '13353', '1500', '0'), +('12', '52', '11', '14762', '1404', '0'), +('12', '52', '11', '20677', '450', '0'), +('12', '53', '22', '10323', '0', '0'), +('12', '53', '22', '9246', '0', '0'), +('12', '53', '22', '21509', '0', '0'), +('12', '53', '22', '8007', '0', '0'), +('12', '53', '1', '10082', '2401', '0'), +('12', '53', '1', '14702', '2350', '0'), +('12', '53', '1', '30361', '2040', '0'), +('12', '53', '1', '10107', '1921', '0'), +('12', '53', '2', '1271', '5315', '0'), +('12', '53', '2', '1225', '3783', '0'), +('12', '53', '2', '1211', '3689', '0'), +('12', '53', '2', '10141', '3469', '0'), +('12', '53', '3', '11052', '5762', '0'), +('12', '53', '3', '1272', '4041', '0'), +('12', '53', '3', '4505', '2719', '0'), +('12', '53', '3', '2366', '1945', '0'), +('12', '53', '5', '27710', '4951', '0'), +('12', '53', '5', '11646', '4294', '0'), +('12', '53', '5', '14703', '3850', '0'), +('12', '53', '5', '14556', '3018', '0'), +('12', '53', '8', '11603', '8768', '0'), +('12', '53', '8', '2349', '2154', '0'), +('12', '53', '8', '1057', '2119', '0'), +('12', '53', '8', '2340', '1561', '0'), +('12', '53', '6', '1542', '5629', '0'), +('12', '53', '6', '1557', '5310', '0'), +('12', '53', '6', '1273', '3301', '0'), +('12', '53', '6', '1905', '3094', '0'), +('12', '53', '17', '11641', '9344', '0'), +('12', '53', '17', '1226', '7428', '0'), +('12', '53', '17', '1214', '7332', '0'), +('12', '53', '17', '1644', '7087', '0'), +('12', '53', '7', '1227', '3213', '0'), +('12', '53', '7', '1218', '3133', '0'), +('12', '53', '7', '1648', '2545', '0'), +('12', '53', '7', '2458', '1723', '0'), +('12', '53', '9', '1649', '2071', '0'), +('12', '53', '9', '4408', '1954', '0'), +('12', '53', '9', '12803', '1585', '0'), +('12', '53', '9', '10360', '1278', '0'), +('12', '53', '15', '11686', '4955', '0'), +('12', '53', '15', '10150', '1804', '0'), +('12', '53', '15', '14639', '1537', '0'), +('12', '53', '15', '10163', '1500', '0'), +('12', '53', '20', '11666', '5376', '0'), +('12', '53', '20', '2742', '3194', '0'), +('12', '53', '20', '1364', '1629', '0'), +('12', '53', '20', '1217', '1311', '0'), +('12', '53', '12', '1229', '3920', '0'), +('12', '53', '12', '20655', '2595', '0'), +('12', '53', '12', '2336', '2533', '0'), +('12', '53', '12', '4345', '2293', '0'), +('12', '53', '18', '1651', '1887', '0'), +('12', '53', '18', '4410', '742', '0'), +('12', '53', '18', '1230', '522', '0'), +('12', '53', '18', '1221', '454', '0'), +('12', '53', '19', '4407', '3517', '0'), +('12', '53', '19', '68239', '2476', '0'), +('12', '53', '19', '1652', '1234', '0'), +('12', '53', '19', '1368', '1216', '0'), +('12', '53', '13', '14337', '6943', '0'), +('12', '53', '13', '20656', '5551', '0'), +('12', '53', '13', '6359', '4694', '0'), +('12', '53', '13', '14360', '4542', '0'), +('12', '53', '14', '20656', '5551', '0'), +('12', '53', '14', '6359', '4694', '0'), +('12', '53', '14', '9246', '3854', '0'), +('12', '53', '14', '10404', '3757', '0'), +('12', '53', '11', '9246', '3854', '0'), +('12', '53', '11', '13353', '1500', '0'), +('12', '53', '11', '14762', '1404', '0'), +('12', '53', '11', '20677', '450', '0'), +('12', '54', '22', '10323', '0', '0'), +('12', '54', '22', '9246', '0', '0'), +('12', '54', '22', '21509', '0', '0'), +('12', '54', '22', '8007', '0', '0'), +('12', '54', '1', '10082', '2445', '0'), +('12', '54', '1', '14702', '2350', '0'), +('12', '54', '1', '30361', '2040', '0'), +('12', '54', '1', '10107', '1957', '0'), +('12', '54', '2', '1271', '5373', '0'), +('12', '54', '2', '1225', '3835', '0'), +('12', '54', '2', '1211', '3740', '0'), +('12', '54', '2', '10141', '3535', '0'), +('12', '54', '3', '11052', '5871', '0'), +('12', '54', '3', '1272', '4106', '0'), +('12', '54', '3', '4505', '2770', '0'), +('12', '54', '3', '2366', '1981', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '54', '5', '27710', '4987', '0'), +('12', '54', '5', '11646', '4388', '0'), +('12', '54', '5', '14703', '3850', '0'), +('12', '54', '5', '14556', '3018', '0'), +('12', '54', '8', '11603', '8833', '0'), +('12', '54', '8', '1057', '2155', '0'), +('12', '54', '8', '2349', '2154', '0'), +('12', '54', '8', '2340', '1590', '0'), +('12', '54', '6', '1542', '5694', '0'), +('12', '54', '6', '1557', '5310', '0'), +('12', '54', '6', '1273', '3337', '0'), +('12', '54', '6', '1905', '3095', '0'), +('12', '54', '17', '11641', '9452', '0'), +('12', '54', '17', '1226', '7533', '0'), +('12', '54', '17', '1214', '7430', '0'), +('12', '54', '17', '1644', '7123', '0'), +('12', '54', '7', '1227', '3264', '0'), +('12', '54', '7', '1218', '3184', '0'), +('12', '54', '7', '1648', '2581', '0'), +('12', '54', '7', '2458', '1752', '0'), +('12', '54', '9', '1649', '2092', '0'), +('12', '54', '9', '4408', '1990', '0'), +('12', '54', '9', '12803', '1549', '0'), +('12', '54', '9', '10360', '1300', '0'), +('12', '54', '15', '11686', '4991', '0'), +('12', '54', '15', '10150', '1804', '0'), +('12', '54', '15', '14639', '1566', '0'), +('12', '54', '15', '10163', '1500', '0'), +('12', '54', '20', '11666', '5378', '0'), +('12', '54', '20', '2742', '3197', '0'), +('12', '54', '20', '1364', '1658', '0'), +('12', '54', '20', '1217', '1318', '0'), +('12', '54', '12', '1229', '3971', '0'), +('12', '54', '12', '20655', '2610', '0'), +('12', '54', '12', '2336', '2569', '0'), +('12', '54', '12', '4345', '2329', '0'), +('12', '54', '18', '1651', '1909', '0'), +('12', '54', '18', '4410', '742', '0'), +('12', '54', '18', '1230', '523', '0'), +('12', '54', '18', '1221', '454', '0'), +('12', '54', '19', '4407', '3583', '0'), +('12', '54', '19', '68239', '2498', '0'), +('12', '54', '19', '1652', '1234', '0'), +('12', '54', '19', '1368', '1216', '0'), +('12', '54', '13', '14337', '7015', '0'), +('12', '54', '13', '20656', '5587', '0'), +('12', '54', '13', '6359', '4767', '0'), +('12', '54', '13', '14360', '4614', '0'), +('12', '54', '14', '20656', '5587', '0'), +('12', '54', '14', '6359', '4767', '0'), +('12', '54', '14', '9246', '3926', '0'), +('12', '54', '14', '10404', '3823', '0'), +('12', '54', '11', '9246', '3926', '0'), +('12', '54', '11', '13353', '1500', '0'), +('12', '54', '11', '14762', '1404', '0'), +('12', '54', '11', '20677', '450', '0'), +('12', '55', '22', '10323', '0', '0'), +('12', '55', '22', '9246', '0', '0'), +('12', '55', '22', '21509', '0', '0'), +('12', '55', '22', '8007', '0', '0'), +('12', '55', '1', '10082', '2488', '0'), +('12', '55', '1', '14702', '2350', '0'), +('12', '55', '1', '30361', '2040', '0'), +('12', '55', '1', '10107', '1993', '0'), +('12', '55', '2', '1271', '5431', '0'), +('12', '55', '2', '1225', '3887', '0'), +('12', '55', '2', '1211', '3791', '0'), +('12', '55', '2', '10141', '3600', '0'), +('12', '55', '3', '11052', '5980', '0'), +('12', '55', '3', '1272', '4171', '0'), +('12', '55', '3', '4505', '2821', '0'), +('12', '55', '3', '2366', '2017', '0'), +('12', '55', '5', '27710', '5023', '0'), +('12', '55', '5', '11646', '4482', '0'), +('12', '55', '5', '14703', '3850', '0'), +('12', '55', '5', '14556', '3018', '0'), +('12', '55', '8', '11603', '8898', '0'), +('12', '55', '8', '1057', '2192', '0'), +('12', '55', '8', '2349', '2154', '0'), +('12', '55', '8', '2340', '1619', '0'), +('12', '55', '6', '1542', '5759', '0'), +('12', '55', '6', '1557', '5310', '0'), +('12', '55', '6', '1273', '3373', '0'), +('12', '55', '6', '1905', '3097', '0'), +('12', '55', '17', '11641', '9561', '0'), +('12', '55', '17', '1226', '7638', '0'), +('12', '55', '17', '1214', '7527', '0'), +('12', '55', '17', '1644', '7160', '0'), +('12', '55', '7', '1227', '3315', '0'), +('12', '55', '7', '1218', '3235', '0'), +('12', '55', '7', '1648', '2617', '0'), +('12', '55', '7', '2458', '1781', '0'), +('12', '55', '9', '1649', '2114', '0'), +('12', '55', '9', '4408', '2026', '0'), +('12', '55', '9', '12803', '1513', '0'), +('12', '55', '9', '10360', '1322', '0'), +('12', '55', '15', '11686', '5027', '0'), +('12', '55', '15', '10150', '1804', '0'), +('12', '55', '15', '14639', '1595', '0'), +('12', '55', '15', '10163', '1500', '0'), +('12', '55', '20', '11666', '5380', '0'), +('12', '55', '20', '2742', '3199', '0'), +('12', '55', '20', '1364', '1687', '0'), +('12', '55', '20', '1217', '1325', '0'), +('12', '55', '12', '1229', '4022', '0'), +('12', '55', '12', '20655', '2625', '0'), +('12', '55', '12', '2336', '2605', '0'), +('12', '55', '12', '4345', '2366', '0'), +('12', '55', '18', '1651', '1931', '0'), +('12', '55', '18', '4410', '742', '0'), +('12', '55', '18', '1230', '524', '0'), +('12', '55', '18', '1221', '454', '0'), +('12', '55', '19', '4407', '3648', '0'), +('12', '55', '19', '68239', '2519', '0'), +('12', '55', '19', '1652', '1234', '0'), +('12', '55', '19', '1368', '1216', '0'), +('12', '55', '13', '14337', '7088', '0'), +('12', '55', '13', '20656', '5623', '0'), +('12', '55', '13', '6359', '4839', '0'), +('12', '55', '13', '14360', '4687', '0'), +('12', '55', '14', '20656', '5623', '0'), +('12', '55', '14', '6359', '4839', '0'), +('12', '55', '14', '9246', '3998', '0'), +('12', '55', '14', '10404', '3888', '0'), +('12', '55', '11', '9246', '3998', '0'), +('12', '55', '11', '13353', '1500', '0'), +('12', '55', '11', '14762', '1404', '0'), +('12', '55', '11', '20677', '450', '0'), +('12', '56', '22', '10323', '0', '0'), +('12', '56', '22', '9246', '0', '0'), +('12', '56', '22', '21509', '0', '0'), +('12', '56', '22', '8007', '0', '0'), +('12', '56', '1', '10082', '2532', '0'), +('12', '56', '1', '14702', '2350', '0'), +('12', '56', '1', '30361', '2040', '0'), +('12', '56', '1', '10107', '2029', '0'), +('12', '56', '2', '1271', '5489', '0'), +('12', '56', '2', '1225', '3939', '0'), +('12', '56', '2', '1211', '3841', '0'), +('12', '56', '2', '10141', '3665', '0'), +('12', '56', '3', '11052', '6088', '0'), +('12', '56', '3', '1272', '4236', '0'), +('12', '56', '3', '4505', '2871', '0'), +('12', '56', '3', '2366', '2054', '0'), +('12', '56', '5', '27710', '5060', '0'), +('12', '56', '5', '11646', '4577', '0'), +('12', '56', '5', '14703', '3850', '0'), +('12', '56', '5', '14556', '3018', '0'), +('12', '56', '8', '11603', '8963', '0'), +('12', '56', '8', '1057', '2228', '0'), +('12', '56', '8', '2349', '2154', '0'), +('12', '56', '8', '2340', '1648', '0'), +('12', '56', '6', '1542', '5824', '0'), +('12', '56', '6', '1557', '5310', '0'), +('12', '56', '6', '1273', '3410', '0'), +('12', '56', '6', '1905', '3098', '0'), +('12', '56', '17', '11641', '9670', '0'), +('12', '56', '17', '1226', '7743', '0'), +('12', '56', '17', '1214', '7624', '0'), +('12', '56', '17', '1644', '7196', '0'), +('12', '56', '7', '1227', '3365', '0'), +('12', '56', '7', '1218', '3285', '0'), +('12', '56', '7', '1648', '2654', '0'), +('12', '56', '7', '2458', '1810', '0'), +('12', '56', '9', '1649', '2136', '0'), +('12', '56', '9', '4408', '2063', '0'), +('12', '56', '9', '12803', '1477', '0'), +('12', '56', '9', '10360', '1344', '0'), +('12', '56', '15', '11686', '5063', '0'), +('12', '56', '15', '10150', '1804', '0'), +('12', '56', '15', '14639', '1624', '0'), +('12', '56', '15', '10163', '1500', '0'), +('12', '56', '20', '11666', '5382', '0'), +('12', '56', '20', '2742', '3202', '0'), +('12', '56', '20', '1364', '1716', '0'), +('12', '56', '20', '1217', '1332', '0'), +('12', '56', '12', '1229', '4073', '0'), +('12', '56', '12', '2336', '2642', '0'), +('12', '56', '12', '20655', '2640', '0'), +('12', '56', '12', '4345', '2402', '0'), +('12', '56', '18', '1651', '1953', '0'), +('12', '56', '18', '4410', '742', '0'), +('12', '56', '18', '1230', '524', '0'), +('12', '56', '18', '1221', '454', '0'), +('12', '56', '19', '4407', '3713', '0'), +('12', '56', '19', '68239', '2541', '0'), +('12', '56', '19', '1652', '1234', '0'), +('12', '56', '19', '1368', '1216', '0'), +('12', '56', '13', '14337', '7160', '0'), +('12', '56', '13', '20656', '5660', '0'), +('12', '56', '13', '6359', '4912', '0'), +('12', '56', '13', '14360', '4759', '0'), +('12', '56', '14', '20656', '5660', '0'), +('12', '56', '14', '6359', '4912', '0'), +('12', '56', '14', '9246', '4071', '0'), +('12', '56', '14', '10404', '3953', '0'), +('12', '56', '11', '9246', '4071', '0'), +('12', '56', '11', '13353', '1500', '0'), +('12', '56', '11', '14762', '1404', '0'), +('12', '56', '11', '20677', '450', '0'), +('12', '57', '22', '10323', '0', '0'), +('12', '57', '22', '9246', '0', '0'), +('12', '57', '22', '21509', '0', '0'), +('12', '57', '22', '8007', '0', '0'), +('12', '57', '1', '10082', '2575', '0'), +('12', '57', '1', '14702', '2350', '0'), +('12', '57', '1', '10107', '2066', '0'), +('12', '57', '1', '30361', '2040', '0'), +('12', '57', '2', '1271', '5547', '0'), +('12', '57', '2', '1225', '3991', '0'), +('12', '57', '2', '1211', '3892', '0'), +('12', '57', '2', '10141', '3730', '0'), +('12', '57', '3', '11052', '6197', '0'), +('12', '57', '3', '1272', '4302', '0'), +('12', '57', '3', '4505', '2922', '0'), +('12', '57', '3', '2366', '2090', '0'), +('12', '57', '5', '27710', '5096', '0'), +('12', '57', '5', '11646', '4671', '0'), +('12', '57', '5', '14703', '3850', '0'), +('12', '57', '5', '14556', '3018', '0'), +('12', '57', '8', '11603', '9029', '0'), +('12', '57', '8', '1057', '2264', '0'), +('12', '57', '8', '2349', '2154', '0'), +('12', '57', '8', '2340', '1677', '0'), +('12', '57', '6', '1542', '5889', '0'), +('12', '57', '6', '1557', '5310', '0'), +('12', '57', '6', '1273', '3446', '0'), +('12', '57', '6', '1905', '3099', '0'), +('12', '57', '17', '11641', '9779', '0'), +('12', '57', '17', '1226', '7847', '0'), +('12', '57', '17', '1214', '7722', '0'), +('12', '57', '17', '1644', '7232', '0'), +('12', '57', '7', '1227', '3416', '0'), +('12', '57', '7', '1218', '3336', '0'), +('12', '57', '7', '1648', '2690', '0'), +('12', '57', '7', '2458', '1839', '0'), +('12', '57', '9', '1649', '2158', '0'), +('12', '57', '9', '4408', '2099', '0'), +('12', '57', '9', '12803', '1440', '0'), +('12', '57', '9', '10360', '1365', '0'), +('12', '57', '15', '11686', '5100', '0'), +('12', '57', '15', '10150', '1804', '0'), +('12', '57', '15', '14639', '1653', '0'), +('12', '57', '15', '10163', '1500', '0'), +('12', '57', '20', '11666', '5383', '0'), +('12', '57', '20', '2742', '3204', '0'), +('12', '57', '20', '1364', '1745', '0'), +('12', '57', '20', '1217', '1340', '0'), +('12', '57', '12', '1229', '4123', '0'), +('12', '57', '12', '2336', '2678', '0'), +('12', '57', '12', '20655', '2655', '0'), +('12', '57', '12', '4345', '2438', '0'), +('12', '57', '18', '1651', '1974', '0'), +('12', '57', '18', '4410', '742', '0'), +('12', '57', '18', '1230', '525', '0'), +('12', '57', '18', '1221', '454', '0'), +('12', '57', '19', '4407', '3778', '0'), +('12', '57', '19', '68239', '2563', '0'), +('12', '57', '19', '1652', '1234', '0'), +('12', '57', '19', '1368', '1216', '0'), +('12', '57', '13', '14337', '7233', '0'), +('12', '57', '13', '20656', '5696', '0'), +('12', '57', '13', '6359', '4984', '0'), +('12', '57', '13', '14360', '4832', '0'), +('12', '57', '14', '20656', '5696', '0'), +('12', '57', '14', '6359', '4984', '0'), +('12', '57', '14', '9246', '4143', '0'), +('12', '57', '14', '10404', '4018', '0'), +('12', '57', '11', '9246', '4143', '0'), +('12', '57', '11', '13353', '1500', '0'), +('12', '57', '11', '14762', '1404', '0'), +('12', '57', '11', '20677', '450', '0'), +('12', '58', '22', '10323', '0', '0'), +('12', '58', '22', '9246', '0', '0'), +('12', '58', '22', '21509', '0', '0'), +('12', '58', '22', '8007', '0', '0'), +('12', '58', '1', '10082', '2619', '0'), +('12', '58', '1', '14702', '2350', '0'), +('12', '58', '1', '10107', '2102', '0'), +('12', '58', '1', '30361', '2040', '0'), +('12', '58', '2', '1271', '5605', '0'), +('12', '58', '2', '1225', '4043', '0'), +('12', '58', '2', '1211', '3943', '0'), +('12', '58', '2', '10141', '3796', '0'), +('12', '58', '3', '11052', '6306', '0'), +('12', '58', '3', '1272', '4367', '0'), +('12', '58', '3', '4505', '2973', '0'), +('12', '58', '3', '2366', '2126', '0'), +('12', '58', '5', '27710', '5132', '0'), +('12', '58', '5', '11646', '4765', '0'), +('12', '58', '5', '14703', '3850', '0'), +('12', '58', '5', '14556', '3018', '0'), +('12', '58', '8', '11603', '9094', '0'), +('12', '58', '8', '1057', '2300', '0'), +('12', '58', '8', '2349', '2154', '0'), +('12', '58', '8', '2340', '1706', '0'), +('12', '58', '6', '1542', '5955', '0'), +('12', '58', '6', '1557', '5310', '0'), +('12', '58', '6', '1273', '3482', '0'), +('12', '58', '6', '1905', '3100', '0'), +('12', '58', '17', '11641', '9887', '0'), +('12', '58', '17', '1226', '7952', '0'), +('12', '58', '17', '1214', '7819', '0'), +('12', '58', '17', '1644', '7268', '0'), +('12', '58', '7', '1227', '3467', '0'), +('12', '58', '7', '1218', '3387', '0'), +('12', '58', '7', '1648', '2726', '0'), +('12', '58', '7', '2458', '1868', '0'), +('12', '58', '9', '1649', '2179', '0'), +('12', '58', '9', '4408', '2135', '0'), +('12', '58', '9', '12803', '1404', '0'), +('12', '58', '9', '10360', '1387', '0'), +('12', '58', '15', '11686', '5136', '0'), +('12', '58', '15', '10150', '1804', '0'), +('12', '58', '15', '14639', '1682', '0'), +('12', '58', '15', '10163', '1500', '0'), +('12', '58', '20', '11666', '5385', '0'), +('12', '58', '20', '2742', '3207', '0'), +('12', '58', '20', '1364', '1774', '0'), +('12', '58', '20', '1217', '1347', '0'), +('12', '58', '12', '1229', '4174', '0'), +('12', '58', '12', '2336', '2714', '0'), +('12', '58', '12', '20655', '2670', '0'), +('12', '58', '12', '4345', '2474', '0'), +('12', '58', '18', '1651', '1996', '0'), +('12', '58', '18', '4410', '742', '0'), +('12', '58', '18', '1230', '526', '0'), +('12', '58', '18', '1221', '454', '0'), +('12', '58', '19', '4407', '3844', '0'), +('12', '58', '19', '68239', '2585', '0'), +('12', '58', '19', '1652', '1234', '0'), +('12', '58', '19', '1368', '1216', '0'), +('12', '58', '13', '14337', '7305', '0'), +('12', '58', '13', '20656', '5732', '0'), +('12', '58', '13', '6359', '5057', '0'), +('12', '58', '13', '14360', '4904', '0'), +('12', '58', '14', '20656', '5732', '0'), +('12', '58', '14', '6359', '5057', '0'), +('12', '58', '14', '9246', '4216', '0'), +('12', '58', '14', '10404', '4083', '0'), +('12', '58', '11', '9246', '4216', '0'), +('12', '58', '11', '13353', '1500', '0'), +('12', '58', '11', '14762', '1404', '0'), +('12', '58', '11', '20677', '450', '0'), +('12', '59', '22', '10323', '0', '0'), +('12', '59', '22', '9246', '0', '0'), +('12', '59', '22', '21509', '0', '0'), +('12', '59', '22', '8007', '0', '0'), +('12', '59', '1', '10082', '2662', '0'), +('12', '59', '1', '14702', '2350', '0'), +('12', '59', '1', '10107', '2138', '0'), +('12', '59', '1', '30361', '2040', '0'), +('12', '59', '2', '1271', '5663', '0'), +('12', '59', '2', '1225', '4095', '0'), +('12', '59', '2', '1211', '3994', '0'), +('12', '59', '2', '10141', '3861', '0'), +('12', '59', '3', '11052', '6414', '0'), +('12', '59', '3', '1272', '4432', '0'), +('12', '59', '3', '4505', '3024', '0'), +('12', '59', '3', '2366', '2162', '0'), +('12', '59', '5', '27710', '5168', '0'), +('12', '59', '5', '11646', '4859', '0'), +('12', '59', '5', '14703', '3850', '0'), +('12', '59', '5', '10216', '3050', '0'), +('12', '59', '8', '11603', '9159', '0'), +('12', '59', '8', '1057', '2336', '0'), +('12', '59', '8', '2349', '2154', '0'), +('12', '59', '8', '2340', '1735', '0'), +('12', '59', '6', '1542', '6020', '0'), +('12', '59', '6', '1557', '5310', '0'), +('12', '59', '6', '1273', '3518', '0'), +('12', '59', '6', '1905', '3101', '0'), +('12', '59', '17', '11641', '9996', '0'), +('12', '59', '17', '1226', '8057', '0'), +('12', '59', '17', '1214', '7916', '0'), +('12', '59', '17', '1644', '7305', '0'), +('12', '59', '7', '1227', '3518', '0'), +('12', '59', '7', '1218', '3438', '0'), +('12', '59', '7', '1648', '2762', '0'), +('12', '59', '7', '2458', '1897', '0'), +('12', '59', '9', '1649', '2201', '0'), +('12', '59', '9', '4408', '2171', '0'), +('12', '59', '9', '10360', '1409', '0'), +('12', '59', '9', '12803', '1368', '0'), +('12', '59', '15', '11686', '5172', '0'), +('12', '59', '15', '10150', '1804', '0'), +('12', '59', '15', '14639', '1711', '0'), +('12', '59', '15', '10163', '1500', '0'), +('12', '59', '20', '11666', '5387', '0'), +('12', '59', '20', '2742', '3209', '0'), +('12', '59', '20', '1364', '1803', '0'), +('12', '59', '20', '1217', '1354', '0'), +('12', '59', '12', '1229', '4225', '0'), +('12', '59', '12', '2336', '2750', '0'), +('12', '59', '12', '20655', '2685', '0'), +('12', '59', '12', '4345', '2511', '0'), +('12', '59', '18', '1651', '2018', '0'), +('12', '59', '18', '4410', '742', '0'), +('12', '59', '18', '1230', '527', '0'), +('12', '59', '18', '1221', '454', '0'), +('12', '59', '19', '4407', '3909', '0'), +('12', '59', '19', '68239', '2606', '0'), +('12', '59', '19', '1652', '1234', '0'), +('12', '59', '19', '1368', '1216', '0'), +('12', '59', '13', '14337', '7378', '0'), +('12', '59', '13', '20656', '5768', '0'), +('12', '59', '13', '6359', '5129', '0'), +('12', '59', '13', '14360', '4977', '0'), +('12', '59', '14', '20656', '5768', '0'), +('12', '59', '14', '6359', '5129', '0'), +('12', '59', '14', '9246', '4288', '0'), +('12', '59', '14', '10404', '4149', '0'), +('12', '59', '11', '9246', '4288', '0'), +('12', '59', '11', '13353', '1500', '0'), +('12', '59', '11', '14762', '1404', '0'), +('12', '59', '11', '60396', '458', '0'), +('12', '60', '22', '66397', '0', '3'), +('12', '60', '22', '61948', '0', '3'), +('12', '60', '22', '21805', '0', '3'), +('12', '60', '22', '21807', '0', '3'), +('12', '60', '1', '28944', '34873', '3'), +('12', '60', '1', '51230', '29739', '3'), +('12', '60', '1', '28922', '20005', '3'), +('12', '60', '1', '63170', '19563', '3'), +('12', '60', '2', '27880', '24004', '3'), +('12', '60', '2', '51235', '20641', '3'), +('12', '60', '2', '26763', '9514', '3'), +('12', '60', '2', '26605', '8590', '3'), +('12', '60', '3', '5772', '33235', '3'), +('12', '60', '3', '29452', '23595', '3'), +('12', '60', '3', '29319', '20952', '3'), +('12', '60', '3', '31328', '13502', '3'), +('12', '60', '5', '27244', '23046', '3'), +('12', '60', '5', '28901', '22146', '3'), +('12', '60', '5', '51229', '20612', '3'), +('12', '60', '5', '28911', '20148', '3'), +('12', '60', '8', '11603', '25316', '3'), +('12', '60', '8', '30505', '11459', '3'), +('12', '60', '8', '28964', '11163', '3'), +('12', '60', '8', '28992', '11055', '3'), +('12', '60', '6', '4315', '11652', '3'), +('12', '60', '6', '28920', '9396', '3'), +('12', '60', '6', '28902', '9305', '3'), +('12', '60', '6', '28919', '7107', '3'), +('12', '60', '17', '28910', '28129', '3'), +('12', '60', '17', '32933', '18774', '3'), +('12', '60', '17', '26776', '12291', '3'), +('12', '60', '17', '26604', '11291', '3'), +('12', '60', '7', '28924', '10414', '3'), +('12', '60', '7', '7868', '10062', '3'), +('12', '60', '7', '8288', '8504', '3'), +('12', '60', '7', '26555', '7907', '3'), +('12', '60', '9', '23508', '21401', '3'), +('12', '60', '9', '26781', '18739', '3'), +('12', '60', '9', '30552', '15323', '3'), +('12', '60', '9', '28891', '15002', '3'), +('12', '60', '15', '28944', '34873', '3'), +('12', '60', '15', '28905', '33353', '3'), +('12', '60', '15', '63170', '19563', '3'), +('12', '60', '15', '28993', '10326', '3'), +('12', '60', '20', '28916', '11260', '3'), +('12', '60', '20', '30534', '9641', '3'), +('12', '60', '20', '26549', '8952', '3'), +('12', '60', '20', '28938', '8452', '3'), +('12', '60', '12', '30534', '9641', '3'), +('12', '60', '12', '28967', '8603', '3'), +('12', '60', '12', '28972', '7160', '3'), +('12', '60', '12', '28949', '6726', '3'), +('12', '60', '18', '26777', '39474', '3'), +('12', '60', '18', '28932', '8279', '3'), +('12', '60', '18', '8289', '8275', '3'), +('12', '60', '18', '27316', '7189', '3'), +('12', '60', '19', '28881', '38910', '3'), +('12', '60', '19', '28934', '32903', '3'), +('12', '60', '19', '30570', '10561', '3'), +('12', '60', '19', '30818', '10501', '3'), +('12', '60', '13', '28981', '35392', '3'), +('12', '60', '13', '26778', '26226', '3'), +('12', '60', '13', '28998', '10863', '3'), +('12', '60', '13', '31360', '10806', '3'), +('12', '60', '14', '28981', '35392', '3'), +('12', '60', '14', '26778', '26226', '3'), +('12', '60', '14', '28915', '18998', '3'), +('12', '60', '14', '26780', '11529', '3'), +('12', '60', '11', '26778', '26226', '3'), +('12', '60', '11', '51223', '17887', '3'), +('12', '60', '11', '2698', '15002', '3'), +('12', '60', '11', '28998', '10863', '3'), +('12', '60', '22', '10323', '0', '2'), +('12', '60', '22', '9248', '0', '2'), +('12', '60', '22', '12425', '0', '2'), +('12', '60', '22', '30014', '0', '2'), +('12', '60', '1', '31228', '8104', '2'), +('12', '60', '1', '10912', '4979', '2'), +('12', '60', '1', '62234', '4288', '2'), +('12', '60', '1', '31370', '3784', '2'), +('12', '60', '2', '10913', '8341', '2'), +('12', '60', '2', '29648', '6759', '2'), +('12', '60', '2', '1867', '5858', '2'), +('12', '60', '2', '31322', '5677', '2'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '60', '3', '31233', '9048', '2'), +('12', '60', '3', '1547', '7722', '2'), +('12', '60', '3', '31244', '7668', '2'), +('12', '60', '3', '31463', '6800', '2'), +('12', '60', '5', '31460', '8280', '2'), +('12', '60', '5', '31318', '7173', '2'), +('12', '60', '5', '29459', '6423', '2'), +('12', '60', '5', '27259', '6066', '2'), +('12', '60', '8', '1628', '8133', '2'), +('12', '60', '8', '5779', '6161', '2'), +('12', '60', '8', '11603', '5967', '2'), +('12', '60', '8', '1622', '5587', '2'), +('12', '60', '6', '29468', '6004', '2'), +('12', '60', '6', '1557', '5261', '2'), +('12', '60', '6', '29472', '4211', '2'), +('12', '60', '6', '1114', '4127', '2'), +('12', '60', '17', '31239', '11500', '2'), +('12', '60', '17', '10845', '10689', '2'), +('12', '60', '17', '1552', '9891', '2'), +('12', '60', '17', '6858', '9496', '2'), +('12', '60', '7', '31342', '5442', '2'), +('12', '60', '7', '29485', '5143', '2'), +('12', '60', '7', '31237', '4719', '2'), +('12', '60', '7', '31156', '3071', '2'), +('12', '60', '9', '31460', '8280', '2'), +('12', '60', '9', '31246', '5521', '2'), +('12', '60', '9', '1559', '4949', '2'), +('12', '60', '9', '31314', '3862', '2'), +('12', '60', '15', '31231', '8533', '2'), +('12', '60', '15', '25211', '8334', '2'), +('12', '60', '15', '25198', '6346', '2'), +('12', '60', '15', '62373', '5029', '2'), +('12', '60', '20', '25858', '8952', '2'), +('12', '60', '20', '2510', '8414', '2'), +('12', '60', '20', '1556', '7794', '2'), +('12', '60', '20', '6835', '5445', '2'), +('12', '60', '12', '25857', '7341', '2'), +('12', '60', '12', '31340', '6608', '2'), +('12', '60', '12', '31306', '5988', '2'), +('12', '60', '12', '25409', '3513', '2'), +('12', '60', '18', '31339', '6494', '2'), +('12', '60', '18', '31159', '3364', '2'), +('12', '60', '18', '31371', '3043', '2'), +('12', '60', '18', '5819', '2423', '2'), +('12', '60', '19', '29645', '10251', '2'), +('12', '60', '19', '31245', '9657', '2'), +('12', '60', '19', '31355', '5962', '2'), +('12', '60', '19', '31327', '5345', '2'), +('12', '60', '13', '1156', '9489', '2'), +('12', '60', '13', '14341', '9194', '2'), +('12', '60', '13', '31326', '9068', '2'), +('12', '60', '13', '1117', '8141', '2'), +('12', '60', '14', '2498', '9040', '2'), +('12', '60', '14', '31462', '7904', '2'), +('12', '60', '14', '29449', '7194', '2'), +('12', '60', '14', '1113', '6669', '2'), +('12', '60', '11', '31466', '9583', '2'), +('12', '60', '11', '1554', '9374', '2'), +('12', '60', '11', '2698', '7516', '2'), +('12', '60', '11', '1113', '6669', '2'), +('12', '60', '22', '10323', '0', '1'), +('12', '60', '22', '12425', '0', '1'), +('12', '60', '22', '9246', '0', '1'), +('12', '60', '22', '21509', '0', '1'), +('12', '60', '1', '10912', '7657', '1'), +('12', '60', '1', '62234', '5395', '1'), +('12', '60', '1', '14702', '2350', '1'), +('12', '60', '1', '30361', '2040', '1'), +('12', '60', '2', '10913', '11955', '1'), +('12', '60', '2', '1271', '4278', '1'), +('12', '60', '2', '1414', '3468', '1'), +('12', '60', '2', '10143', '3361', '1'), +('12', '60', '3', '5780', '4511', '1'), +('12', '60', '3', '11052', '3850', '1'), +('12', '60', '3', '46184', '3453', '1'), +('12', '60', '3', '1625', '2938', '1'), +('12', '60', '5', '27710', '4301', '1'), +('12', '60', '5', '14703', '3850', '1'), +('12', '60', '5', '14556', '3011', '1'), +('12', '60', '5', '14709', '2801', '1'), +('12', '60', '8', '1628', '10363', '1'), +('12', '60', '8', '11603', '7596', '1'), +('12', '60', '8', '1622', '6352', '1'), +('12', '60', '8', '5779', '6186', '1'), +('12', '60', '6', '29468', '8283', '1'), +('12', '60', '6', '1557', '5286', '1'), +('12', '60', '6', '1542', '4452', '1'), +('12', '60', '6', '1905', '3061', '1'), +('12', '60', '17', '10845', '14298', '1'), +('12', '60', '17', '24627', '7942', '1'), +('12', '60', '17', '11641', '7398', '1'), +('12', '60', '17', '1644', '6423', '1'), +('12', '60', '7', '1227', '2311', '1'), +('12', '60', '7', '1218', '2231', '1'), +('12', '60', '7', '1648', '1898', '1'), +('12', '60', '7', '1362', '1614', '1'), +('12', '60', '9', '1618', '3094', '1'), +('12', '60', '9', '12803', '2220', '1'), +('12', '60', '9', '4780', '1820', '1'), +('12', '60', '9', '1649', '1681', '1'), +('12', '60', '15', '5727', '4424', '1'), +('12', '60', '15', '11686', '4303', '1'), +('12', '60', '15', '5728', '3614', '1'), +('12', '60', '15', '14738', '3397', '1'), +('12', '60', '20', '1556', '9595', '1'), +('12', '60', '20', '11666', '5332', '1'), +('12', '60', '20', '5765', '4818', '1'), +('12', '60', '20', '2742', '3125', '1'), +('12', '60', '12', '4582', '6000', '1'), +('12', '60', '12', '1229', '3015', '1'), +('12', '60', '12', '20655', '2290', '1'), +('12', '60', '12', '2923', '2064', '1'), +('12', '60', '18', '5819', '2996', '1'), +('12', '60', '18', '24765', '2071', '1'), +('12', '60', '18', '1651', '1491', '1'), +('12', '60', '18', '4410', '725', '1'), +('12', '60', '19', '5749', '2803', '1'), +('12', '60', '19', '4407', '2358', '1'), +('12', '60', '19', '68239', '2067', '1'), +('12', '60', '19', '1652', '1220', '1'), +('12', '60', '13', '14341', '13714', '1'), +('12', '60', '13', '14338', '8052', '1'), +('12', '60', '13', '24629', '7880', '1'), +('12', '60', '13', '24609', '7310', '1'), +('12', '60', '14', '24629', '7880', '1'), +('12', '60', '14', '24609', '7310', '1'), +('12', '60', '14', '14745', '5053', '1'), +('12', '60', '14', '20656', '4901', '1'), +('12', '60', '11', '46178', '4705', '1'), +('12', '60', '11', '5763', '4601', '1'), +('12', '60', '11', '5805', '3300', '1'), +('12', '60', '11', '5738', '3167', '1'), +('12', '61', '22', '66397', '0', '3'), +('12', '61', '22', '61948', '0', '3'), +('12', '61', '22', '21805', '0', '3'), +('12', '61', '22', '21807', '0', '3'), +('12', '61', '1', '28944', '33834', '3'), +('12', '61', '1', '51230', '28819', '3'), +('12', '61', '1', '28922', '19505', '3'), +('12', '61', '1', '63170', '19064', '3'), +('12', '61', '2', '27880', '23005', '3'), +('12', '61', '2', '51235', '20143', '3'), +('12', '61', '2', '26763', '9516', '3'), +('12', '61', '2', '26605', '8592', '3'), +('12', '61', '3', '5772', '32338', '3'), +('12', '61', '3', '29452', '22597', '3'), +('12', '61', '3', '29319', '19952', '3'), +('12', '61', '3', '31328', '13002', '3'), +('12', '61', '5', '27244', '22046', '3'), +('12', '61', '5', '28901', '21648', '3'), +('12', '61', '5', '51229', '20113', '3'), +('12', '61', '5', '28911', '19649', '3'), +('12', '61', '8', '11603', '24317', '3'), +('12', '61', '8', '28964', '11165', '3'), +('12', '61', '8', '30505', '11085', '3'), +('12', '61', '8', '28992', '11055', '3'), +('12', '61', '6', '4315', '11152', '3'), +('12', '61', '6', '28920', '9398', '3'), +('12', '61', '6', '28902', '9305', '3'), +('12', '61', '6', '28919', '7107', '3'), +('12', '61', '17', '28910', '27380', '3'), +('12', '61', '17', '32933', '18275', '3'), +('12', '61', '17', '26776', '12294', '3'), +('12', '61', '17', '26604', '11294', '3'), +('12', '61', '7', '28924', '10416', '3'), +('12', '61', '7', '7868', '10063', '3'), +('12', '61', '7', '8288', '8504', '3'), +('12', '61', '7', '26555', '7907', '3'), +('12', '61', '9', '23508', '20401', '3'), +('12', '61', '9', '26781', '18366', '3'), +('12', '61', '9', '30552', '15024', '3'), +('12', '61', '9', '28891', '14702', '3'), +('12', '61', '15', '28944', '33834', '3'), +('12', '61', '15', '28905', '32313', '3'), +('12', '61', '15', '63170', '19064', '3'), +('12', '61', '15', '28993', '10327', '3'), +('12', '61', '20', '28916', '11261', '3'), +('12', '61', '20', '30534', '9642', '3'), +('12', '61', '20', '26549', '8955', '3'), +('12', '61', '20', '28938', '8453', '3'), +('12', '61', '12', '30534', '9642', '3'), +('12', '61', '12', '28967', '8603', '3'), +('12', '61', '12', '28972', '7161', '3'), +('12', '61', '12', '28949', '6728', '3'), +('12', '61', '18', '26777', '38325', '3'), +('12', '61', '18', '28932', '8280', '3'), +('12', '61', '18', '8289', '8276', '3'), +('12', '61', '18', '27316', '7189', '3'), +('12', '61', '19', '28881', '37612', '3'), +('12', '61', '19', '28934', '31903', '3'), +('12', '61', '19', '30570', '10562', '3'), +('12', '61', '19', '30818', '10002', '3'), +('12', '61', '13', '28981', '34393', '3'), +('12', '61', '13', '26778', '25630', '3'), +('12', '61', '13', '28998', '10865', '3'), +('12', '61', '13', '31360', '10306', '3'), +('12', '61', '14', '28981', '34393', '3'), +('12', '61', '14', '26778', '25630', '3'), +('12', '61', '14', '28915', '18625', '3'), +('12', '61', '14', '26780', '11530', '3'), +('12', '61', '11', '26778', '25630', '3'), +('12', '61', '11', '51223', '17514', '3'), +('12', '61', '11', '2698', '14627', '3'), +('12', '61', '11', '28998', '10865', '3'), +('12', '62', '22', '66397', '0', '3'), +('12', '62', '22', '61948', '0', '3'), +('12', '62', '22', '21805', '0', '3'), +('12', '62', '22', '21807', '0', '3'), +('12', '62', '1', '28944', '32796', '3'), +('12', '62', '1', '51230', '27900', '3'), +('12', '62', '1', '28922', '19005', '3'), +('12', '62', '1', '63170', '18565', '3'), +('12', '62', '2', '27880', '22006', '3'), +('12', '62', '2', '51235', '19644', '3'), +('12', '62', '2', '26763', '9518', '3'), +('12', '62', '2', '26605', '8593', '3'), +('12', '62', '3', '5772', '31441', '3'), +('12', '62', '3', '29452', '21598', '3'), +('12', '62', '3', '29319', '18952', '3'), +('12', '62', '3', '31328', '12502', '3'), +('12', '62', '5', '28901', '21151', '3'), +('12', '62', '5', '27244', '21047', '3'), +('12', '62', '5', '51229', '19614', '3'), +('12', '62', '5', '28911', '19150', '3'), +('12', '62', '8', '11603', '23318', '3'), +('12', '62', '8', '28964', '11167', '3'), +('12', '62', '8', '28992', '11055', '3'), +('12', '62', '8', '28918', '10751', '3'), +('12', '62', '6', '4315', '10652', '3'), +('12', '62', '6', '28920', '9401', '3'), +('12', '62', '6', '28902', '9305', '3'), +('12', '62', '6', '28919', '7107', '3'), +('12', '62', '17', '28910', '26632', '3'), +('12', '62', '17', '32933', '17776', '3'), +('12', '62', '17', '26776', '12297', '3'), +('12', '62', '17', '26604', '11297', '3'), +('12', '62', '7', '28924', '10418', '3'), +('12', '62', '7', '7868', '10064', '3'), +('12', '62', '7', '8288', '8504', '3'), +('12', '62', '7', '26555', '7907', '3'), +('12', '62', '9', '23508', '19401', '3'), +('12', '62', '9', '26781', '17993', '3'), +('12', '62', '9', '30552', '14726', '3'), +('12', '62', '9', '28891', '14402', '3'), +('12', '62', '15', '28944', '32796', '3'), +('12', '62', '15', '28905', '31273', '3'), +('12', '62', '15', '63170', '18565', '3'), +('12', '62', '15', '28993', '10329', '3'), +('12', '62', '20', '28916', '11262', '3'), +('12', '62', '20', '30534', '9643', '3'), +('12', '62', '20', '26549', '8957', '3'), +('12', '62', '20', '28938', '8454', '3'), +('12', '62', '12', '30534', '9643', '3'), +('12', '62', '12', '28967', '8603', '3'), +('12', '62', '12', '28972', '7163', '3'), +('12', '62', '12', '28949', '6729', '3'), +('12', '62', '18', '26777', '37176', '3'), +('12', '62', '18', '28932', '8281', '3'), +('12', '62', '18', '8289', '8277', '3'), +('12', '62', '18', '27316', '7190', '3'), +('12', '62', '19', '28881', '36314', '3'), +('12', '62', '19', '28934', '30903', '3'), +('12', '62', '19', '30570', '10563', '3'), +('12', '62', '19', '28148', '9664', '3'), +('12', '62', '13', '28981', '33395', '3'), +('12', '62', '13', '26778', '25034', '3'), +('12', '62', '13', '28998', '10867', '3'), +('12', '62', '13', '31360', '9806', '3'), +('12', '62', '14', '28981', '33395', '3'), +('12', '62', '14', '26778', '25034', '3'), +('12', '62', '14', '28915', '18252', '3'), +('12', '62', '14', '26780', '11532', '3'), +('12', '62', '11', '26778', '25034', '3'), +('12', '62', '11', '51223', '17141', '3'), +('12', '62', '11', '2698', '14252', '3'), +('12', '62', '11', '28998', '10867', '3'), +('12', '63', '22', '66397', '0', '3'), +('12', '63', '22', '61948', '0', '3'), +('12', '63', '22', '21805', '0', '3'), +('12', '63', '22', '21807', '0', '3'), +('12', '63', '1', '28944', '31757', '3'), +('12', '63', '1', '51230', '26980', '3'), +('12', '63', '1', '28922', '18505', '3'), +('12', '63', '1', '63170', '18066', '3'), +('12', '63', '2', '27880', '21006', '3'), +('12', '63', '2', '51235', '19146', '3'), +('12', '63', '2', '26763', '9520', '3'), +('12', '63', '2', '26605', '8595', '3'), +('12', '63', '3', '5772', '30545', '3'), +('12', '63', '3', '29452', '20599', '3'), +('12', '63', '3', '29319', '17952', '3'), +('12', '63', '3', '31328', '12002', '3'), +('12', '63', '5', '28901', '20653', '3'), +('12', '63', '5', '27244', '20048', '3'), +('12', '63', '5', '51229', '19115', '3'), +('12', '63', '5', '28911', '18652', '3'), +('12', '63', '8', '11603', '22319', '3'), +('12', '63', '8', '28964', '11169', '3'), +('12', '63', '8', '28992', '11055', '3'), +('12', '63', '8', '28918', '10751', '3'), +('12', '63', '6', '4315', '10152', '3'), +('12', '63', '6', '28920', '9403', '3'), +('12', '63', '6', '28902', '9305', '3'), +('12', '63', '6', '28919', '7107', '3'), +('12', '63', '17', '28910', '25883', '3'), +('12', '63', '17', '32933', '17276', '3'), +('12', '63', '17', '26776', '12300', '3'), +('12', '63', '17', '26604', '11300', '3'), +('12', '63', '7', '28924', '10420', '3'), +('12', '63', '7', '7868', '10065', '3'), +('12', '63', '7', '8288', '8504', '3'), +('12', '63', '7', '26555', '7907', '3'), +('12', '63', '9', '23508', '18401', '3'), +('12', '63', '9', '26781', '17620', '3'), +('12', '63', '9', '30552', '14427', '3'), +('12', '63', '9', '28891', '14102', '3'), +('12', '63', '15', '28944', '31757', '3'), +('12', '63', '15', '28905', '30233', '3'), +('12', '63', '15', '63170', '18066', '3'), +('12', '63', '15', '28993', '10330', '3'), +('12', '63', '20', '28916', '11262', '3'), +('12', '63', '20', '30534', '9645', '3'), +('12', '63', '20', '26549', '8960', '3'), +('12', '63', '20', '28938', '8454', '3'), +('12', '63', '12', '30534', '9645', '3'), +('12', '63', '12', '28967', '8603', '3'), +('12', '63', '12', '28972', '7165', '3'), +('12', '63', '12', '28949', '6730', '3'), +('12', '63', '18', '26777', '36028', '3'), +('12', '63', '18', '28932', '8283', '3'), +('12', '63', '18', '8289', '8278', '3'), +('12', '63', '18', '27316', '7191', '3'), +('12', '63', '19', '28881', '35015', '3'), +('12', '63', '19', '28934', '29903', '3'), +('12', '63', '19', '30570', '10564', '3'), +('12', '63', '19', '28148', '9665', '3'), +('12', '63', '13', '28981', '32396', '3'), +('12', '63', '13', '26778', '24437', '3'), +('12', '63', '13', '28998', '10869', '3'), +('12', '63', '13', '28917', '9804', '3'), +('12', '63', '14', '28981', '32396', '3'), +('12', '63', '14', '26778', '24437', '3'), +('12', '63', '14', '28915', '17878', '3'), +('12', '63', '14', '26780', '11534', '3'), +('12', '63', '11', '26778', '24437', '3'), +('12', '63', '11', '51223', '16768', '3'), +('12', '63', '11', '2698', '13877', '3'), +('12', '63', '11', '28998', '10869', '3'), +('12', '64', '22', '66397', '0', '3'), +('12', '64', '22', '61948', '0', '3'), +('12', '64', '22', '21805', '0', '3'), +('12', '64', '22', '21807', '0', '3'), +('12', '64', '1', '28944', '30718', '3'), +('12', '64', '1', '51230', '26061', '3'), +('12', '64', '1', '28922', '18005', '3'), +('12', '64', '1', '63170', '17567', '3'), +('12', '64', '2', '27880', '20007', '3'), +('12', '64', '2', '51235', '18647', '3'), +('12', '64', '2', '26763', '9522', '3'), +('12', '64', '2', '26605', '8596', '3'), +('12', '64', '3', '5772', '29648', '3'), +('12', '64', '3', '29452', '19600', '3'), +('12', '64', '3', '29319', '16952', '3'), +('12', '64', '3', '31328', '11502', '3'), +('12', '64', '5', '28901', '20156', '3'), +('12', '64', '5', '27244', '19049', '3'), +('12', '64', '5', '51229', '18616', '3'), +('12', '64', '5', '28911', '18153', '3'), +('12', '64', '8', '11603', '21320', '3'), +('12', '64', '8', '28964', '11171', '3'), +('12', '64', '8', '28992', '11055', '3'), +('12', '64', '8', '28918', '10751', '3'), +('12', '64', '6', '4315', '9652', '3'), +('12', '64', '6', '28920', '9406', '3'), +('12', '64', '6', '28902', '9305', '3'), +('12', '64', '6', '28919', '7107', '3'), +('12', '64', '17', '28910', '25134', '3'), +('12', '64', '17', '32933', '16777', '3'), +('12', '64', '17', '26776', '12303', '3'), +('12', '64', '17', '26604', '11303', '3'), +('12', '64', '7', '28924', '10422', '3'), +('12', '64', '7', '7868', '10066', '3'), +('12', '64', '7', '8288', '8504', '3'), +('12', '64', '7', '26555', '7907', '3'), +('12', '64', '9', '23508', '17401', '3'), +('12', '64', '9', '26781', '17247', '3'), +('12', '64', '9', '30552', '14128', '3'), +('12', '64', '9', '28891', '13802', '3'), +('12', '64', '15', '28944', '30718', '3'), +('12', '64', '15', '28905', '29193', '3'), +('12', '64', '15', '63170', '17567', '3'), +('12', '64', '15', '28993', '10331', '3'), +('12', '64', '20', '28916', '11263', '3'), +('12', '64', '20', '30534', '9646', '3'), +('12', '64', '20', '26549', '8962', '3'), +('12', '64', '20', '28938', '8455', '3'), +('12', '64', '12', '30534', '9646', '3'), +('12', '64', '12', '28967', '8603', '3'), +('12', '64', '12', '28972', '7167', '3'), +('12', '64', '12', '28949', '6731', '3'), +('12', '64', '18', '26777', '34879', '3'), +('12', '64', '18', '28932', '8284', '3'), +('12', '64', '18', '8289', '8280', '3'), +('12', '64', '18', '27316', '7191', '3'), +('12', '64', '19', '28881', '33717', '3'), +('12', '64', '19', '28934', '28903', '3'), +('12', '64', '19', '30570', '10565', '3'), +('12', '64', '19', '28148', '9667', '3'), +('12', '64', '13', '28981', '31398', '3'), +('12', '64', '13', '26778', '23841', '3'), +('12', '64', '13', '28998', '10870', '3'), +('12', '64', '13', '28917', '9804', '3'), +('12', '64', '14', '28981', '31398', '3'), +('12', '64', '14', '26778', '23841', '3'), +('12', '64', '14', '28915', '17505', '3'), +('12', '64', '14', '26780', '11536', '3'), +('12', '64', '11', '26778', '23841', '3'), +('12', '64', '11', '51223', '16394', '3'), +('12', '64', '11', '2698', '13502', '3'), +('12', '64', '11', '28998', '10870', '3'), +('12', '65', '22', '66397', '0', '7'), +('12', '65', '22', '62787', '0', '7'), +('12', '65', '22', '61948', '0', '7'), +('12', '65', '22', '21805', '0', '7'), +('12', '65', '1', '69062', '62337', '7'), +('12', '65', '1', '68949', '41605', '7'), +('12', '65', '1', '68807', '35200', '7'), +('12', '65', '1', '68058', '35200', '7'), +('12', '65', '2', '68195', '45251', '7'), +('12', '65', '2', '68807', '35200', '7'), +('12', '65', '2', '68058', '35200', '7'), +('12', '65', '2', '68060', '35200', '7'), +('12', '65', '3', '69074', '61625', '7'), +('12', '65', '3', '68818', '42834', '7'), +('12', '65', '3', '9444', '37462', '7'), +('12', '65', '3', '9436', '37022', '7'), +('12', '65', '5', '69135', '61619', '7'), +('12', '65', '5', '68808', '52252', '7'), +('12', '65', '5', '7769', '39059', '7'), +('12', '65', '5', '67625', '38079', '7'), +('12', '65', '8', '21998', '45559', '7'), +('12', '65', '8', '69164', '41754', '7'), +('12', '65', '8', '21996', '38949', '7'), +('12', '65', '8', '12082', '38465', '7'), +('12', '65', '6', '68788', '52659', '7'), +('12', '65', '6', '68841', '40663', '7'), +('12', '65', '6', '68807', '35200', '7'), +('12', '65', '6', '68057', '35200', '7'), +('12', '65', '17', '68984', '61855', '7'), +('12', '65', '17', '47654', '47895', '7'), +('12', '65', '17', '69153', '46147', '7'), +('12', '65', '17', '68782', '40554', '7'), +('12', '65', '7', '68060', '35200', '7'), +('12', '65', '7', '68807', '35200', '7'), +('12', '65', '7', '68057', '35200', '7'), +('12', '65', '7', '68058', '35200', '7'), +('12', '65', '9', '68606', '37184', '7'), +('12', '65', '9', '68058', '35200', '7'), +('12', '65', '9', '68807', '35200', '7'), +('12', '65', '9', '68060', '35200', '7'), +('12', '65', '15', '68957', '60664', '7'), +('12', '65', '15', '68846', '60015', '7'), +('12', '65', '15', '14818', '46803', '7'), +('12', '65', '15', '69453', '38861', '7'), +('12', '65', '20', '69134', '61805', '7'), +('12', '65', '20', '68726', '41967', '7'), +('12', '65', '20', '67625', '38079', '7'), +('12', '65', '20', '69445', '37073', '7'), +('12', '65', '12', '69255', '63048', '7'), +('12', '65', '12', '68912', '42496', '7'), +('12', '65', '12', '26996', '37103', '7'), +('12', '65', '12', '13627', '36145', '7'), +('12', '65', '18', '68751', '50849', '7'), +('12', '65', '18', '68807', '35200', '7'), +('12', '65', '18', '68058', '35200', '7'), +('12', '65', '18', '68057', '35200', '7'), +('12', '65', '19', '69078', '60615', '7'), +('12', '65', '19', '68913', '58864', '7'), +('12', '65', '19', '68807', '35200', '7'), +('12', '65', '19', '68060', '35200', '7'), +('12', '65', '13', '69046', '59801', '7'), +('12', '65', '13', '68744', '50968', '7'), +('12', '65', '13', '24793', '45170', '7'), +('12', '65', '13', '26788', '39215', '7'), +('12', '65', '14', '69046', '59801', '7'), +('12', '65', '14', '68745', '51396', '7'), +('12', '65', '14', '68744', '50968', '7'), +('12', '65', '14', '27274', '46445', '7'), +('12', '65', '11', '69162', '62496', '7'), +('12', '65', '11', '20496', '50365', '7'), +('12', '65', '11', '26788', '39215', '7'), +('12', '65', '11', '20486', '37072', '7'), +('12', '65', '22', '66397', '0', '6'), +('12', '65', '22', '62787', '0', '6'), +('12', '65', '22', '61948', '0', '6'), +('12', '65', '22', '21805', '0', '6'), +('12', '65', '1', '68807', '35200', '6'), +('12', '65', '1', '68057', '35200', '6'), +('12', '65', '1', '68060', '35200', '6'), +('12', '65', '1', '68058', '35200', '6'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '65', '2', '68195', '45251', '6'), +('12', '65', '2', '68807', '35200', '6'), +('12', '65', '2', '68058', '35200', '6'), +('12', '65', '2', '68057', '35200', '6'), +('12', '65', '3', '9444', '37462', '6'), +('12', '65', '3', '9436', '37022', '6'), +('12', '65', '3', '68057', '35200', '6'), +('12', '65', '3', '68058', '35200', '6'), +('12', '65', '5', '7769', '39059', '6'), +('12', '65', '5', '8774', '37512', '6'), +('12', '65', '5', '29198', '36383', '6'), +('12', '65', '5', '68057', '35200', '6'), +('12', '65', '8', '21998', '45559', '6'), +('12', '65', '8', '21996', '38949', '6'), +('12', '65', '8', '12082', '38465', '6'), +('12', '65', '8', '15815', '36874', '6'), +('12', '65', '6', '68807', '35200', '6'), +('12', '65', '6', '68058', '35200', '6'), +('12', '65', '6', '68060', '35200', '6'), +('12', '65', '6', '68057', '35200', '6'), +('12', '65', '17', '47654', '47895', '6'), +('12', '65', '17', '68057', '35200', '6'), +('12', '65', '17', '68058', '35200', '6'), +('12', '65', '17', '68807', '35200', '6'), +('12', '65', '7', '68060', '35200', '6'), +('12', '65', '7', '68807', '35200', '6'), +('12', '65', '7', '68057', '35200', '6'), +('12', '65', '7', '68058', '35200', '6'), +('12', '65', '9', '68807', '35200', '6'), +('12', '65', '9', '68058', '35200', '6'), +('12', '65', '9', '68060', '35200', '6'), +('12', '65', '9', '68057', '35200', '6'), +('12', '65', '15', '14818', '46803', '6'), +('12', '65', '15', '68807', '35200', '6'), +('12', '65', '15', '68058', '35200', '6'), +('12', '65', '15', '68060', '35200', '6'), +('12', '65', '20', '68057', '35200', '6'), +('12', '65', '20', '68058', '35200', '6'), +('12', '65', '20', '68060', '35200', '6'), +('12', '65', '20', '68807', '35200', '6'), +('12', '65', '12', '26996', '37103', '6'), +('12', '65', '12', '13627', '36145', '6'), +('12', '65', '12', '68060', '35200', '6'), +('12', '65', '12', '68057', '35200', '6'), +('12', '65', '18', '68060', '35200', '6'), +('12', '65', '18', '68057', '35200', '6'), +('12', '65', '18', '68058', '35200', '6'), +('12', '65', '18', '68807', '35200', '6'), +('12', '65', '19', '68060', '35200', '6'), +('12', '65', '19', '68057', '35200', '6'), +('12', '65', '19', '68058', '35200', '6'), +('12', '65', '19', '68807', '35200', '6'), +('12', '65', '13', '24793', '45170', '6'), +('12', '65', '13', '26788', '39215', '6'), +('12', '65', '13', '21875', '38668', '6'), +('12', '65', '13', '68057', '35200', '6'), +('12', '65', '14', '27274', '46445', '6'), +('12', '65', '14', '26788', '39215', '6'), +('12', '65', '14', '27272', '38888', '6'), +('12', '65', '14', '25998', '38643', '6'), +('12', '65', '11', '20496', '50365', '6'), +('12', '65', '11', '26788', '39215', '6'), +('12', '65', '11', '20486', '37072', '6'), +('12', '65', '11', '68057', '35200', '6'), +('12', '65', '22', '66397', '0', '5'), +('12', '65', '22', '62787', '0', '5'), +('12', '65', '22', '61948', '0', '5'), +('12', '65', '22', '21805', '0', '5'), +('12', '65', '1', '28944', '29679', '5'), +('12', '65', '1', '16257', '29405', '5'), +('12', '65', '1', '7130', '29053', '5'), +('12', '65', '1', '51230', '25142', '5'), +('12', '65', '2', '68195', '45251', '5'), +('12', '65', '2', '16158', '21563', '5'), +('12', '65', '2', '27880', '19008', '5'), +('12', '65', '2', '51235', '18149', '5'), +('12', '65', '3', '9444', '37462', '5'), +('12', '65', '3', '9436', '37022', '5'), +('12', '65', '3', '5772', '28751', '5'), +('12', '65', '3', '29452', '18602', '5'), +('12', '65', '5', '7769', '39059', '5'), +('12', '65', '5', '8774', '37512', '5'), +('12', '65', '5', '29198', '36383', '5'), +('12', '65', '5', '8772', '26595', '5'), +('12', '65', '8', '21998', '45559', '5'), +('12', '65', '8', '21996', '38949', '5'), +('12', '65', '8', '12082', '38465', '5'), +('12', '65', '8', '15815', '36874', '5'), +('12', '65', '6', '13654', '18718', '5'), +('12', '65', '6', '28661', '17153', '5'), +('12', '65', '6', '13638', '13153', '5'), +('12', '65', '6', '13634', '12297', '5'), +('12', '65', '17', '47654', '47895', '5'), +('12', '65', '17', '14747', '29006', '5'), +('12', '65', '17', '28910', '24385', '5'), +('12', '65', '17', '32933', '16278', '5'), +('12', '65', '7', '11876', '28211', '5'), +('12', '65', '7', '11323', '17812', '5'), +('12', '65', '7', '11620', '13499', '5'), +('12', '65', '7', '21994', '12998', '5'), +('12', '65', '9', '68198', '26915', '5'), +('12', '65', '9', '28665', '26543', '5'), +('12', '65', '9', '11019', '25346', '5'), +('12', '65', '9', '28668', '20323', '5'), +('12', '65', '15', '14818', '46803', '5'), +('12', '65', '15', '28944', '29679', '5'), +('12', '65', '15', '28905', '28153', '5'), +('12', '65', '15', '10232', '26963', '5'), +('12', '65', '20', '15881', '27203', '5'), +('12', '65', '20', '16158', '21563', '5'), +('12', '65', '20', '15927', '15275', '5'), +('12', '65', '20', '15877', '14886', '5'), +('12', '65', '12', '26996', '37103', '5'), +('12', '65', '12', '13627', '36145', '5'), +('12', '65', '12', '13626', '23849', '5'), +('12', '65', '12', '11878', '19745', '5'), +('12', '65', '18', '26777', '33730', '5'), +('12', '65', '18', '28649', '31255', '5'), +('12', '65', '18', '19027', '12885', '5'), +('12', '65', '18', '28932', '8285', '5'), +('12', '65', '19', '28881', '32419', '5'), +('12', '65', '19', '28934', '27903', '5'), +('12', '65', '19', '19079', '25421', '5'), +('12', '65', '19', '20434', '20012', '5'), +('12', '65', '13', '24793', '45170', '5'), +('12', '65', '13', '26788', '39215', '5'), +('12', '65', '13', '21875', '38668', '5'), +('12', '65', '13', '28981', '30399', '5'), +('12', '65', '14', '27274', '46445', '5'), +('12', '65', '14', '26788', '39215', '5'), +('12', '65', '14', '27272', '38888', '5'), +('12', '65', '14', '25998', '38643', '5'), +('12', '65', '11', '20496', '50365', '5'), +('12', '65', '11', '26788', '39215', '5'), +('12', '65', '11', '20486', '37072', '5'), +('12', '65', '11', '28798', '25124', '5'), +('12', '65', '22', '66397', '0', '4'), +('12', '65', '22', '62787', '0', '4'), +('12', '65', '22', '61948', '0', '4'), +('12', '65', '22', '21805', '0', '4'), +('12', '65', '1', '28944', '29679', '4'), +('12', '65', '1', '16257', '29405', '4'), +('12', '65', '1', '7130', '29053', '4'), +('12', '65', '1', '51230', '25142', '4'), +('12', '65', '2', '68195', '45251', '4'), +('12', '65', '2', '16158', '21563', '4'), +('12', '65', '2', '27880', '19008', '4'), +('12', '65', '2', '51235', '18149', '4'), +('12', '65', '3', '9444', '37462', '4'), +('12', '65', '3', '9436', '37022', '4'), +('12', '65', '3', '5772', '28751', '4'), +('12', '65', '3', '29452', '18602', '4'), +('12', '65', '5', '7769', '39059', '4'), +('12', '65', '5', '8774', '37512', '4'), +('12', '65', '5', '29198', '36383', '4'), +('12', '65', '5', '8772', '26595', '4'), +('12', '65', '8', '21998', '45559', '4'), +('12', '65', '8', '21996', '38949', '4'), +('12', '65', '8', '12082', '38465', '4'), +('12', '65', '8', '15815', '36874', '4'), +('12', '65', '6', '13654', '18718', '4'), +('12', '65', '6', '28661', '17153', '4'), +('12', '65', '6', '13638', '13153', '4'), +('12', '65', '6', '13634', '12297', '4'), +('12', '65', '17', '47654', '47895', '4'), +('12', '65', '17', '14747', '29006', '4'), +('12', '65', '17', '28910', '24385', '4'), +('12', '65', '17', '32933', '16278', '4'), +('12', '65', '7', '11876', '28211', '4'), +('12', '65', '7', '11323', '17812', '4'), +('12', '65', '7', '11620', '13499', '4'), +('12', '65', '7', '21994', '12998', '4'), +('12', '65', '9', '68198', '26915', '4'), +('12', '65', '9', '28665', '26543', '4'), +('12', '65', '9', '11019', '25346', '4'), +('12', '65', '9', '28668', '20323', '4'), +('12', '65', '15', '14818', '46803', '4'), +('12', '65', '15', '28944', '29679', '4'), +('12', '65', '15', '28905', '28153', '4'), +('12', '65', '15', '10232', '26963', '4'), +('12', '65', '20', '15881', '27203', '4'), +('12', '65', '20', '16158', '21563', '4'), +('12', '65', '20', '15927', '15275', '4'), +('12', '65', '20', '15877', '14886', '4'), +('12', '65', '12', '26996', '37103', '4'), +('12', '65', '12', '13627', '36145', '4'), +('12', '65', '12', '13626', '23849', '4'), +('12', '65', '12', '11878', '19745', '4'), +('12', '65', '18', '26777', '33730', '4'), +('12', '65', '18', '28649', '31255', '4'), +('12', '65', '18', '19027', '12885', '4'), +('12', '65', '18', '28932', '8285', '4'), +('12', '65', '19', '28881', '32419', '4'), +('12', '65', '19', '28934', '27903', '4'), +('12', '65', '19', '19079', '25421', '4'), +('12', '65', '19', '20434', '20012', '4'), +('12', '65', '13', '24793', '45170', '4'), +('12', '65', '13', '26788', '39215', '4'), +('12', '65', '13', '21875', '38668', '4'), +('12', '65', '13', '28981', '30399', '4'), +('12', '65', '14', '27274', '46445', '4'), +('12', '65', '14', '26788', '39215', '4'), +('12', '65', '14', '27272', '38888', '4'), +('12', '65', '14', '25998', '38643', '4'), +('12', '65', '11', '20496', '50365', '4'), +('12', '65', '11', '26788', '39215', '4'), +('12', '65', '11', '20486', '37072', '4'), +('12', '65', '11', '28798', '25124', '4'), +('12', '66', '22', '66397', '0', '7'), +('12', '66', '22', '62787', '0', '7'), +('12', '66', '22', '61948', '0', '7'), +('12', '66', '22', '21805', '0', '7'), +('12', '66', '1', '69062', '60541', '7'), +('12', '66', '1', '68949', '40608', '7'), +('12', '66', '1', '68807', '33600', '7'), +('12', '66', '1', '68058', '33600', '7'), +('12', '66', '2', '68195', '43854', '7'), +('12', '66', '2', '68807', '33600', '7'), +('12', '66', '2', '68057', '33600', '7'), +('12', '66', '2', '68060', '33600', '7'), +('12', '66', '3', '69074', '59827', '7'), +('12', '66', '3', '68818', '41435', '7'), +('12', '66', '3', '9444', '36265', '7'), +('12', '66', '3', '9436', '35774', '7'), +('12', '66', '5', '69135', '60021', '7'), +('12', '66', '5', '68808', '50656', '7'), +('12', '66', '5', '7769', '38062', '7'), +('12', '66', '5', '67625', '37507', '7'), +('12', '66', '8', '21998', '44161', '7'), +('12', '66', '8', '69164', '41007', '7'), +('12', '66', '8', '21996', '37751', '7'), +('12', '66', '8', '12082', '37268', '7'), +('12', '66', '6', '68788', '51059', '7'), +('12', '66', '6', '68841', '39666', '7'), +('12', '66', '6', '68807', '33600', '7'), +('12', '66', '6', '68057', '33600', '7'), +('12', '66', '17', '68984', '60058', '7'), +('12', '66', '17', '47654', '46498', '7'), +('12', '66', '17', '69153', '45251', '7'), +('12', '66', '17', '68782', '39557', '7'), +('12', '66', '7', '68060', '33600', '7'), +('12', '66', '7', '68807', '33600', '7'), +('12', '66', '7', '68057', '33600', '7'), +('12', '66', '7', '68058', '33600', '7'), +('12', '66', '9', '68606', '35985', '7'), +('12', '66', '9', '68060', '33600', '7'), +('12', '66', '9', '68807', '33600', '7'), +('12', '66', '9', '68058', '33600', '7'), +('12', '66', '15', '68957', '58867', '7'), +('12', '66', '15', '68846', '58217', '7'), +('12', '66', '15', '14818', '45406', '7'), +('12', '66', '15', '69453', '37663', '7'), +('12', '66', '20', '69134', '60208', '7'), +('12', '66', '20', '68726', '40568', '7'), +('12', '66', '20', '67625', '37507', '7'), +('12', '66', '20', '69445', '35875', '7'), +('12', '66', '12', '69255', '61450', '7'), +('12', '66', '12', '68912', '41248', '7'), +('12', '66', '12', '26996', '36106', '7'), +('12', '66', '12', '13627', '34897', '7'), +('12', '66', '18', '68751', '49352', '7'), +('12', '66', '18', '68807', '33600', '7'), +('12', '66', '18', '68058', '33600', '7'), +('12', '66', '18', '68057', '33600', '7'), +('12', '66', '19', '69078', '58818', '7'), +('12', '66', '19', '68913', '57066', '7'), +('12', '66', '19', '68807', '33600', '7'), +('12', '66', '19', '68060', '33600', '7'), +('12', '66', '13', '69046', '58004', '7'), +('12', '66', '13', '68744', '49370', '7'), +('12', '66', '13', '24793', '43673', '7'), +('12', '66', '13', '26788', '38017', '7'), +('12', '66', '14', '69046', '58004', '7'), +('12', '66', '14', '68745', '49798', '7'), +('12', '66', '14', '68744', '49370', '7'), +('12', '66', '14', '27274', '45048', '7'), +('12', '66', '11', '69162', '60900', '7'), +('12', '66', '11', '20496', '48868', '7'), +('12', '66', '11', '26788', '38017', '7'), +('12', '66', '11', '20486', '35874', '7'), +('12', '67', '22', '66397', '0', '7'), +('12', '67', '22', '62787', '0', '7'), +('12', '67', '22', '61948', '0', '7'), +('12', '67', '22', '21805', '0', '7'), +('12', '67', '1', '69062', '58744', '7'), +('12', '67', '1', '68949', '39611', '7'), +('12', '67', '1', '68807', '32000', '7'), +('12', '67', '1', '68057', '32000', '7'), +('12', '67', '2', '68195', '42457', '7'), +('12', '67', '2', '68807', '32000', '7'), +('12', '67', '2', '68057', '32000', '7'), +('12', '67', '2', '68060', '32000', '7'), +('12', '67', '3', '69074', '58029', '7'), +('12', '67', '3', '68818', '40036', '7'), +('12', '67', '3', '9444', '35067', '7'), +('12', '67', '3', '9436', '34526', '7'), +('12', '67', '5', '69135', '58424', '7'), +('12', '67', '5', '68808', '49059', '7'), +('12', '67', '5', '7769', '37064', '7'), +('12', '67', '5', '67625', '36935', '7'), +('12', '67', '8', '21998', '42764', '7'), +('12', '67', '8', '69164', '40260', '7'), +('12', '67', '8', '21996', '36553', '7'), +('12', '67', '8', '12082', '36070', '7'), +('12', '67', '6', '68788', '49459', '7'), +('12', '67', '6', '68841', '38668', '7'), +('12', '67', '6', '68807', '32000', '7'), +('12', '67', '6', '68057', '32000', '7'), +('12', '67', '17', '68984', '58261', '7'), +('12', '67', '17', '47654', '45102', '7'), +('12', '67', '17', '69153', '44354', '7'), +('12', '67', '17', '68782', '38560', '7'), +('12', '67', '7', '68060', '32000', '7'), +('12', '67', '7', '68807', '32000', '7'), +('12', '67', '7', '68057', '32000', '7'), +('12', '67', '7', '68058', '32000', '7'), +('12', '67', '9', '68606', '34786', '7'), +('12', '67', '9', '69100', '32808', '7'), +('12', '67', '9', '68057', '32000', '7'), +('12', '67', '9', '68058', '32000', '7'), +('12', '67', '15', '68957', '57069', '7'), +('12', '67', '15', '68846', '56420', '7'), +('12', '67', '15', '14818', '44009', '7'), +('12', '67', '15', '69453', '36466', '7'), +('12', '67', '20', '69134', '58611', '7'), +('12', '67', '20', '68726', '39169', '7'), +('12', '67', '20', '67625', '36935', '7'), +('12', '67', '20', '69445', '34677', '7'), +('12', '67', '12', '69255', '59853', '7'), +('12', '67', '12', '68912', '40001', '7'), +('12', '67', '12', '26996', '35109', '7'), +('12', '67', '12', '13627', '33649', '7'), +('12', '67', '18', '68751', '47855', '7'), +('12', '67', '18', '68807', '32000', '7'), +('12', '67', '18', '68058', '32000', '7'), +('12', '67', '18', '68057', '32000', '7'), +('12', '67', '19', '69078', '57020', '7'), +('12', '67', '19', '68913', '55269', '7'), +('12', '67', '19', '68807', '32000', '7'), +('12', '67', '19', '68060', '32000', '7'), +('12', '67', '13', '69046', '56208', '7'), +('12', '67', '13', '68744', '47772', '7'), +('12', '67', '13', '24793', '42175', '7'), +('12', '67', '13', '26788', '36820', '7'), +('12', '67', '14', '69046', '56208', '7'), +('12', '67', '14', '68745', '48199', '7'), +('12', '67', '14', '68744', '47772', '7'), +('12', '67', '14', '27274', '43650', '7'), +('12', '67', '11', '69162', '59303', '7'), +('12', '67', '11', '20496', '47370', '7'), +('12', '67', '11', '26788', '36820', '7'), +('12', '67', '11', '20486', '34675', '7'), +('12', '68', '22', '66397', '0', '7'), +('12', '68', '22', '62787', '0', '7'), +('12', '68', '22', '61948', '0', '7'), +('12', '68', '22', '21805', '0', '7'), +('12', '68', '1', '69062', '56948', '7'), +('12', '68', '1', '68949', '38614', '7'), +('12', '68', '1', '68057', '30400', '7'), +('12', '68', '1', '68058', '30400', '7'), +('12', '68', '2', '68195', '41060', '7'), +('12', '68', '2', '68807', '30400', '7'), +('12', '68', '2', '68057', '30400', '7'), +('12', '68', '2', '68060', '30400', '7'), +('12', '68', '3', '69074', '56231', '7'), +('12', '68', '3', '68818', '38637', '7'), +('12', '68', '3', '9444', '33869', '7'), +('12', '68', '3', '9436', '33278', '7'), +('12', '68', '5', '69135', '56826', '7'), +('12', '68', '5', '68808', '47462', '7'), +('12', '68', '5', '67625', '36363', '7'), +('12', '68', '5', '7769', '36067', '7'), +('12', '68', '8', '21998', '41366', '7'), +('12', '68', '8', '69164', '39513', '7'), +('12', '68', '8', '21996', '35355', '7'), +('12', '68', '8', '12082', '34873', '7'), +('12', '68', '6', '68788', '47859', '7'), +('12', '68', '6', '68841', '37671', '7'), +('12', '68', '6', '68807', '30400', '7'), +('12', '68', '6', '68057', '30400', '7'), +('12', '68', '17', '68984', '56464', '7'), +('12', '68', '17', '47654', '43706', '7'), +('12', '68', '17', '69153', '43458', '7'), +('12', '68', '17', '68782', '37563', '7'), +('12', '68', '7', '69082', '30905', '7'), +('12', '68', '7', '68060', '30400', '7'), +('12', '68', '7', '68057', '30400', '7'), +('12', '68', '7', '68058', '30400', '7'), +('12', '68', '9', '68606', '33587', '7'), +('12', '68', '9', '69100', '32236', '7'), +('12', '68', '9', '68057', '30400', '7'), +('12', '68', '9', '68058', '30400', '7'), +('12', '68', '15', '68957', '55272', '7'), +('12', '68', '15', '68846', '54622', '7'), +('12', '68', '15', '14818', '42612', '7'), +('12', '68', '15', '69453', '35268', '7'), +('12', '68', '20', '69134', '57014', '7'), +('12', '68', '20', '68726', '37770', '7'), +('12', '68', '20', '67625', '36363', '7'), +('12', '68', '20', '69445', '33479', '7'), +('12', '68', '12', '69255', '58255', '7'), +('12', '68', '12', '68912', '38753', '7'), +('12', '68', '12', '26996', '34112', '7'), +('12', '68', '12', '13627', '32401', '7'), +('12', '68', '18', '68751', '46358', '7'), +('12', '68', '18', '68807', '30400', '7'), +('12', '68', '18', '68058', '30400', '7'), +('12', '68', '18', '68057', '30400', '7'), +('12', '68', '19', '69078', '55223', '7'), +('12', '68', '19', '68913', '53471', '7'), +('12', '68', '19', '68807', '30400', '7'), +('12', '68', '19', '68060', '30400', '7'), +('12', '68', '13', '69046', '54411', '7'), +('12', '68', '13', '68744', '46174', '7'), +('12', '68', '13', '24793', '40678', '7'), +('12', '68', '13', '26788', '35622', '7'), +('12', '68', '14', '69046', '54411', '7'), +('12', '68', '14', '68745', '46601', '7'), +('12', '68', '14', '68744', '46174', '7'), +('12', '68', '14', '27274', '42253', '7'), +('12', '68', '11', '69162', '57707', '7'), +('12', '68', '11', '20496', '45873', '7'), +('12', '68', '11', '26788', '35622', '7'), +('12', '68', '11', '20486', '33477', '7'), +('12', '69', '22', '66397', '0', '7'), +('12', '69', '22', '62787', '0', '7'), +('12', '69', '22', '61948', '0', '7'), +('12', '69', '22', '21805', '0', '7'), +('12', '69', '1', '69062', '55151', '7'), +('12', '69', '1', '68949', '37617', '7'), +('12', '69', '1', '68057', '28800', '7'), +('12', '69', '1', '68807', '28800', '7'), +('12', '69', '2', '68195', '39663', '7'), +('12', '69', '2', '68807', '28800', '7'), +('12', '69', '2', '68057', '28800', '7'), +('12', '69', '2', '68058', '28800', '7'), +('12', '69', '3', '69074', '54433', '7'), +('12', '69', '3', '68818', '37239', '7'), +('12', '69', '3', '9444', '32672', '7'), +('12', '69', '3', '9436', '32030', '7'), +('12', '69', '5', '69135', '55229', '7'), +('12', '69', '5', '68808', '45865', '7'), +('12', '69', '5', '67625', '35791', '7'), +('12', '69', '5', '7769', '35069', '7'), +('12', '69', '8', '21998', '39968', '7'), +('12', '69', '8', '69164', '38766', '7'), +('12', '69', '8', '21996', '34158', '7'), +('12', '69', '8', '12082', '33675', '7'), +('12', '69', '6', '68788', '46259', '7'), +('12', '69', '6', '68841', '36673', '7'), +('12', '69', '6', '68060', '28800', '7'), +('12', '69', '6', '68807', '28800', '7'), +('12', '69', '17', '68984', '54667', '7'), +('12', '69', '17', '69153', '42562', '7'), +('12', '69', '17', '47654', '42309', '7'), +('12', '69', '17', '68782', '36566', '7'), +('12', '69', '7', '69082', '30332', '7'), +('12', '69', '7', '68060', '28800', '7'), +('12', '69', '7', '68057', '28800', '7'), +('12', '69', '7', '68058', '28800', '7'), +('12', '69', '9', '68606', '32389', '7'), +('12', '69', '9', '69100', '31664', '7'), +('12', '69', '9', '68060', '28800', '7'), +('12', '69', '9', '68057', '28800', '7'), +('12', '69', '15', '68957', '53474', '7'), +('12', '69', '15', '68846', '52825', '7'), +('12', '69', '15', '14818', '41215', '7'), +('12', '69', '15', '69453', '34071', '7'), +('12', '69', '20', '69134', '55417', '7'), +('12', '69', '20', '68726', '36371', '7'), +('12', '69', '20', '67625', '35791', '7'), +('12', '69', '20', '69445', '32281', '7'), +('12', '69', '12', '69255', '56657', '7'), +('12', '69', '12', '68912', '37505', '7'), +('12', '69', '12', '26996', '33115', '7'), +('12', '69', '12', '13627', '31153', '7'), +('12', '69', '18', '68751', '44861', '7'), +('12', '69', '18', '26777', '29135', '7'), +('12', '69', '18', '28649', '28967', '7'), +('12', '69', '18', '69149', '28819', '7'), +('12', '69', '19', '69078', '53425', '7'), +('12', '69', '19', '68913', '51674', '7'), +('12', '69', '19', '68807', '28800', '7'), +('12', '69', '19', '68060', '28800', '7'), +('12', '69', '13', '69046', '52614', '7'), +('12', '69', '13', '68744', '44576', '7'), +('12', '69', '13', '24793', '39180', '7'), +('12', '69', '13', '26788', '34425', '7'), +('12', '69', '14', '69046', '52614', '7'), +('12', '69', '14', '68745', '45003', '7'), +('12', '69', '14', '68744', '44576', '7'), +('12', '69', '14', '27274', '40856', '7'), +('12', '69', '11', '69162', '56111', '7'), +('12', '69', '11', '20496', '44375', '7'), +('12', '69', '11', '26788', '34425', '7'), +('12', '69', '11', '20486', '32279', '7'), +('12', '70', '22', '21805', '0', '11'), +('12', '70', '22', '61948', '0', '11'), +('12', '70', '22', '21807', '0', '11'), +('12', '70', '22', '12425', '0', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '70', '1', '51705', '80822', '11'), +('12', '70', '1', '47285', '60197', '11'), +('12', '70', '1', '69062', '53355', '11'), +('12', '70', '1', '83435', '40117', '11'), +('12', '70', '2', '39358', '52519', '11'), +('12', '70', '2', '68195', '38266', '11'), +('12', '70', '2', '83563', '27896', '11'), +('12', '70', '2', '39285', '27485', '11'), +('12', '70', '3', '83634', '80712', '11'), +('12', '70', '3', '71655', '63761', '11'), +('12', '70', '3', '83531', '54068', '11'), +('12', '70', '3', '69074', '52635', '11'), +('12', '70', '5', '39328', '81406', '11'), +('12', '70', '5', '69135', '53631', '11'), +('12', '70', '5', '47276', '45478', '11'), +('12', '70', '5', '68808', '44268', '11'), +('12', '70', '8', '39299', '80589', '11'), +('12', '70', '8', '71665', '67038', '11'), +('12', '70', '8', '47247', '50058', '11'), +('12', '70', '8', '47306', '45661', '11'), +('12', '70', '6', '39275', '80581', '11'), +('12', '70', '6', '83635', '80323', '11'), +('12', '70', '6', '39209', '53829', '11'), +('12', '70', '6', '39263', '47722', '11'), +('12', '70', '17', '70935', '84173', '11'), +('12', '70', '17', '70714', '55406', '11'), +('12', '70', '17', '71641', '54502', '11'), +('12', '70', '17', '68984', '52870', '11'), +('12', '70', '7', '71089', '42079', '11'), +('12', '70', '7', '69082', '29759', '11'), +('12', '70', '7', '68911', '27941', '11'), +('12', '70', '7', '83567', '27446', '11'), +('12', '70', '9', '51709', '82530', '11'), +('12', '70', '9', '68606', '31190', '11'), +('12', '70', '9', '39336', '31152', '11'), +('12', '70', '9', '69100', '31092', '11'), +('12', '70', '15', '51702', '79913', '11'), +('12', '70', '15', '39230', '52813', '11'), +('12', '70', '15', '68957', '51677', '11'), +('12', '70', '15', '68846', '51027', '11'), +('12', '70', '20', '39253', '81170', '11'), +('12', '70', '20', '83650', '80822', '11'), +('12', '70', '20', '39235', '78318', '11'), +('12', '70', '20', '69134', '53820', '11'), +('12', '70', '12', '83571', '80046', '11'), +('12', '70', '12', '69255', '55059', '11'), +('12', '70', '12', '71090', '42384', '11'), +('12', '70', '12', '68912', '36257', '11'), +('12', '70', '18', '70936', '63263', '11'), +('12', '70', '18', '68751', '43364', '11'), +('12', '70', '18', '83610', '30356', '11'), +('12', '70', '18', '69149', '28572', '11'), +('12', '70', '19', '69078', '51628', '11'), +('12', '70', '19', '68913', '49876', '11'), +('12', '70', '19', '71091', '42053', '11'), +('12', '70', '19', '47219', '41128', '11'), +('12', '70', '13', '47250', '51012', '11'), +('12', '70', '13', '69046', '50817', '11'), +('12', '70', '13', '70622', '46468', '11'), +('12', '70', '13', '68744', '42977', '11'), +('12', '70', '14', '71669', '66383', '11'), +('12', '70', '14', '47311', '61143', '11'), +('12', '70', '14', '47250', '51012', '11'), +('12', '70', '14', '69046', '50817', '11'), +('12', '70', '11', '83548', '59519', '11'), +('12', '70', '11', '69162', '54514', '11'), +('12', '70', '11', '47243', '49968', '11'), +('12', '70', '11', '71659', '43736', '11'), +('12', '70', '22', '61948', '0', '10'), +('12', '70', '22', '66397', '0', '10'), +('12', '70', '22', '21805', '0', '10'), +('12', '70', '22', '21807', '0', '10'), +('12', '70', '1', '47285', '60197', '10'), +('12', '70', '1', '69062', '53355', '10'), +('12', '70', '1', '83435', '40117', '10'), +('12', '70', '1', '70692', '39051', '10'), +('12', '70', '2', '68195', '38266', '10'), +('12', '70', '2', '83563', '27896', '10'), +('12', '70', '2', '68058', '27200', '10'), +('12', '70', '2', '68057', '27200', '10'), +('12', '70', '3', '83634', '80712', '10'), +('12', '70', '3', '71655', '63761', '10'), +('12', '70', '3', '83531', '54068', '10'), +('12', '70', '3', '69074', '52635', '10'), +('12', '70', '5', '69135', '53631', '10'), +('12', '70', '5', '47276', '45478', '10'), +('12', '70', '5', '68808', '44268', '10'), +('12', '70', '5', '83865', '37167', '10'), +('12', '70', '8', '71665', '67038', '10'), +('12', '70', '8', '47247', '50058', '10'), +('12', '70', '8', '47306', '45661', '10'), +('12', '70', '8', '83638', '39681', '10'), +('12', '70', '6', '83635', '80323', '10'), +('12', '70', '6', '68788', '44659', '10'), +('12', '70', '6', '71590', '40994', '10'), +('12', '70', '6', '68841', '35676', '10'), +('12', '70', '17', '70935', '84173', '10'), +('12', '70', '17', '70714', '55406', '10'), +('12', '70', '17', '71641', '54502', '10'), +('12', '70', '17', '68984', '52870', '10'), +('12', '70', '7', '71089', '42079', '10'), +('12', '70', '7', '69082', '29759', '10'), +('12', '70', '7', '68911', '27941', '10'), +('12', '70', '7', '83567', '27446', '10'), +('12', '70', '9', '68606', '31190', '10'), +('12', '70', '9', '69100', '31092', '10'), +('12', '70', '9', '83655', '29569', '10'), +('12', '70', '9', '68057', '27200', '10'), +('12', '70', '15', '68957', '51677', '10'), +('12', '70', '15', '68846', '51027', '10'), +('12', '70', '15', '83458', '46636', '10'), +('12', '70', '15', '47240', '39952', '10'), +('12', '70', '20', '83650', '80822', '10'), +('12', '70', '20', '69134', '53820', '10'), +('12', '70', '20', '83857', '38768', '10'), +('12', '70', '20', '67625', '35219', '10'), +('12', '70', '12', '83571', '80046', '10'), +('12', '70', '12', '69255', '55059', '10'), +('12', '70', '12', '71090', '42384', '10'), +('12', '70', '12', '68912', '36257', '10'), +('12', '70', '18', '70936', '63263', '10'), +('12', '70', '18', '68751', '43364', '10'), +('12', '70', '18', '83610', '30356', '10'), +('12', '70', '18', '69149', '28572', '10'), +('12', '70', '19', '69078', '51628', '10'), +('12', '70', '19', '68913', '49876', '10'), +('12', '70', '19', '71091', '42053', '10'), +('12', '70', '19', '47219', '41128', '10'), +('12', '70', '13', '47250', '51012', '10'), +('12', '70', '13', '69046', '50817', '10'), +('12', '70', '13', '70622', '46468', '10'), +('12', '70', '13', '68744', '42977', '10'), +('12', '70', '14', '71669', '66383', '10'), +('12', '70', '14', '47311', '61143', '10'), +('12', '70', '14', '47250', '51012', '10'), +('12', '70', '14', '69046', '50817', '10'), +('12', '70', '11', '83548', '59519', '10'), +('12', '70', '11', '69162', '54514', '10'), +('12', '70', '11', '47243', '49968', '10'), +('12', '70', '11', '71659', '43736', '10'), +('12', '70', '22', '66397', '0', '9'), +('12', '70', '22', '62787', '0', '9'), +('12', '70', '22', '61948', '0', '9'), +('12', '70', '22', '21805', '0', '9'), +('12', '70', '1', '47285', '60197', '9'), +('12', '70', '1', '69062', '53355', '9'), +('12', '70', '1', '70692', '39051', '9'), +('12', '70', '1', '68949', '36620', '9'), +('12', '70', '2', '68195', '38266', '9'), +('12', '70', '2', '68807', '27200', '9'), +('12', '70', '2', '68057', '27200', '9'), +('12', '70', '2', '68058', '27200', '9'), +('12', '70', '3', '71655', '63761', '9'), +('12', '70', '3', '69074', '52635', '9'), +('12', '70', '3', '68818', '35840', '9'), +('12', '70', '3', '9444', '31474', '9'), +('12', '70', '5', '69135', '53631', '9'), +('12', '70', '5', '47276', '45478', '9'), +('12', '70', '5', '68808', '44268', '9'), +('12', '70', '5', '67625', '35219', '9'), +('12', '70', '8', '71665', '67038', '9'), +('12', '70', '8', '47247', '50058', '9'), +('12', '70', '8', '47306', '45661', '9'), +('12', '70', '8', '21998', '38571', '9'), +('12', '70', '6', '68788', '44659', '9'), +('12', '70', '6', '71590', '40994', '9'), +('12', '70', '6', '68841', '35676', '9'), +('12', '70', '6', '68057', '27200', '9'), +('12', '70', '17', '70935', '84173', '9'), +('12', '70', '17', '70714', '55406', '9'), +('12', '70', '17', '71641', '54502', '9'), +('12', '70', '17', '68984', '52870', '9'), +('12', '70', '7', '71089', '42079', '9'), +('12', '70', '7', '69082', '29759', '9'), +('12', '70', '7', '68911', '27941', '9'), +('12', '70', '7', '68807', '27200', '9'), +('12', '70', '9', '68606', '31190', '9'), +('12', '70', '9', '69100', '31092', '9'), +('12', '70', '9', '68060', '27200', '9'), +('12', '70', '9', '68057', '27200', '9'), +('12', '70', '15', '68957', '51677', '9'), +('12', '70', '15', '68846', '51027', '9'), +('12', '70', '15', '47240', '39952', '9'), +('12', '70', '15', '14818', '39818', '9'), +('12', '70', '20', '69134', '53820', '9'), +('12', '70', '20', '67625', '35219', '9'), +('12', '70', '20', '68726', '34972', '9'), +('12', '70', '20', '69445', '31083', '9'), +('12', '70', '12', '69255', '55059', '9'), +('12', '70', '12', '71090', '42384', '9'), +('12', '70', '12', '68912', '36257', '9'), +('12', '70', '12', '26996', '32119', '9'), +('12', '70', '18', '70936', '63263', '9'), +('12', '70', '18', '68751', '43364', '9'), +('12', '70', '18', '69149', '28572', '9'), +('12', '70', '18', '28649', '28396', '9'), +('12', '70', '19', '69078', '51628', '9'), +('12', '70', '19', '68913', '49876', '9'), +('12', '70', '19', '71091', '42053', '9'), +('12', '70', '19', '47219', '41128', '9'), +('12', '70', '13', '47250', '51012', '9'), +('12', '70', '13', '69046', '50817', '9'), +('12', '70', '13', '70622', '46468', '9'), +('12', '70', '13', '68744', '42977', '9'), +('12', '70', '14', '71669', '66383', '9'), +('12', '70', '14', '47311', '61143', '9'), +('12', '70', '14', '47250', '51012', '9'), +('12', '70', '14', '69046', '50817', '9'), +('12', '70', '11', '69162', '54514', '9'), +('12', '70', '11', '47243', '49968', '9'), +('12', '70', '11', '71659', '43736', '9'), +('12', '70', '11', '20496', '42878', '9'), +('12', '70', '22', '66397', '0', '8'), +('12', '70', '22', '62787', '0', '8'), +('12', '70', '22', '61948', '0', '8'), +('12', '70', '22', '21805', '0', '8'), +('12', '70', '1', '47285', '60197', '8'), +('12', '70', '1', '69062', '53355', '8'), +('12', '70', '1', '70692', '39051', '8'), +('12', '70', '1', '68949', '36620', '8'), +('12', '70', '2', '68195', '38266', '8'), +('12', '70', '2', '68807', '27200', '8'), +('12', '70', '2', '68057', '27200', '8'), +('12', '70', '2', '68058', '27200', '8'), +('12', '70', '3', '69074', '52635', '8'), +('12', '70', '3', '68818', '35840', '8'), +('12', '70', '3', '9444', '31474', '8'), +('12', '70', '3', '9436', '30782', '8'), +('12', '70', '5', '69135', '53631', '8'), +('12', '70', '5', '47276', '45478', '8'), +('12', '70', '5', '68808', '44268', '8'), +('12', '70', '5', '67625', '35219', '8'), +('12', '70', '8', '47247', '50058', '8'), +('12', '70', '8', '47306', '45661', '8'), +('12', '70', '8', '21998', '38571', '8'), +('12', '70', '8', '69164', '38019', '8'), +('12', '70', '6', '68788', '44659', '8'), +('12', '70', '6', '68841', '35676', '8'), +('12', '70', '6', '68058', '27200', '8'), +('12', '70', '6', '68807', '27200', '8'), +('12', '70', '17', '70935', '84173', '8'), +('12', '70', '17', '70714', '55406', '8'), +('12', '70', '17', '68984', '52870', '8'), +('12', '70', '17', '69153', '41666', '8'), +('12', '70', '7', '71089', '42079', '8'), +('12', '70', '7', '69082', '29759', '8'), +('12', '70', '7', '68911', '27941', '8'), +('12', '70', '7', '68057', '27200', '8'), +('12', '70', '9', '68606', '31190', '8'), +('12', '70', '9', '69100', '31092', '8'), +('12', '70', '9', '68057', '27200', '8'), +('12', '70', '9', '68807', '27200', '8'), +('12', '70', '15', '68957', '51677', '8'), +('12', '70', '15', '68846', '51027', '8'), +('12', '70', '15', '47240', '39952', '8'), +('12', '70', '15', '14818', '39818', '8'), +('12', '70', '20', '69134', '53820', '8'), +('12', '70', '20', '67625', '35219', '8'), +('12', '70', '20', '68726', '34972', '8'), +('12', '70', '20', '69445', '31083', '8'), +('12', '70', '12', '69255', '55059', '8'), +('12', '70', '12', '71090', '42384', '8'), +('12', '70', '12', '68912', '36257', '8'), +('12', '70', '12', '26996', '32119', '8'), +('12', '70', '18', '70936', '63263', '8'), +('12', '70', '18', '68751', '43364', '8'), +('12', '70', '18', '69149', '28572', '8'), +('12', '70', '18', '28649', '28396', '8'), +('12', '70', '19', '69078', '51628', '8'), +('12', '70', '19', '68913', '49876', '8'), +('12', '70', '19', '71091', '42053', '8'), +('12', '70', '19', '47219', '41128', '8'), +('12', '70', '13', '47250', '51012', '8'), +('12', '70', '13', '69046', '50817', '8'), +('12', '70', '13', '70622', '46468', '8'), +('12', '70', '13', '68744', '42977', '8'), +('12', '70', '14', '47311', '61143', '8'), +('12', '70', '14', '47250', '51012', '8'), +('12', '70', '14', '69046', '50817', '8'), +('12', '70', '14', '70622', '46468', '8'), +('12', '70', '11', '69162', '54514', '8'), +('12', '70', '11', '47243', '49968', '8'), +('12', '70', '11', '20496', '42878', '8'), +('12', '70', '11', '26788', '33227', '8'), +('12', '71', '22', '21805', '0', '11'), +('12', '71', '22', '61948', '0', '11'), +('12', '71', '22', '21807', '0', '11'), +('12', '71', '22', '12425', '0', '11'), +('12', '71', '1', '51705', '78425', '11'), +('12', '71', '1', '47285', '58400', '11'), +('12', '71', '1', '69062', '51559', '11'), +('12', '71', '1', '83435', '38919', '11'), +('12', '71', '2', '39358', '51522', '11'), +('12', '71', '2', '68195', '36870', '11'), +('12', '71', '2', '83563', '27901', '11'), +('12', '71', '2', '39285', '27488', '11'), +('12', '71', '3', '83634', '78315', '11'), +('12', '71', '3', '71655', '61764', '11'), +('12', '71', '3', '83531', '52471', '11'), +('12', '71', '3', '69074', '50837', '11'), +('12', '71', '5', '39328', '79010', '11'), +('12', '71', '5', '69135', '52034', '11'), +('12', '71', '5', '47276', '44481', '11'), +('12', '71', '5', '68808', '42671', '11'), +('12', '71', '8', '39299', '78192', '11'), +('12', '71', '8', '71665', '65041', '11'), +('12', '71', '8', '47247', '48659', '11'), +('12', '71', '8', '47306', '44664', '11'), +('12', '71', '6', '39275', '78185', '11'), +('12', '71', '6', '83635', '77926', '11'), +('12', '71', '6', '39209', '52232', '11'), +('12', '71', '6', '39263', '46724', '11'), +('12', '71', '17', '70935', '81426', '11'), +('12', '71', '17', '70714', '53811', '11'), +('12', '71', '17', '71641', '52905', '11'), +('12', '71', '17', '83606', '51661', '11'), +('12', '71', '7', '71089', '40882', '11'), +('12', '71', '7', '69082', '29186', '11'), +('12', '71', '7', '83567', '27451', '11'), +('12', '71', '7', '68911', '27369', '11'), +('12', '71', '9', '51709', '80133', '11'), +('12', '71', '9', '39336', '31157', '11'), +('12', '71', '9', '69100', '30521', '11'), +('12', '71', '9', '68606', '29991', '11'), +('12', '71', '15', '51702', '77517', '11'), +('12', '71', '15', '39230', '51216', '11'), +('12', '71', '15', '68957', '49879', '11'), +('12', '71', '15', '68846', '49229', '11'), +('12', '71', '20', '39253', '78773', '11'), +('12', '71', '20', '83650', '78425', '11'), +('12', '71', '20', '39235', '75921', '11'), +('12', '71', '20', '69134', '52223', '11'), +('12', '71', '12', '83571', '77651', '11'), +('12', '71', '12', '69255', '53461', '11'), +('12', '71', '12', '71090', '41186', '11'), +('12', '71', '12', '68912', '35009', '11'), +('12', '71', '18', '70936', '61463', '11'), +('12', '71', '18', '68751', '41867', '11'), +('12', '71', '18', '83610', '30360', '11'), +('12', '71', '18', '69149', '28325', '11'), +('12', '71', '19', '69078', '49830', '11'), +('12', '71', '19', '68913', '48079', '11'), +('12', '71', '19', '71091', '40853', '11'), +('12', '71', '19', '47219', '40231', '11'), +('12', '71', '13', '47250', '49615', '11'), +('12', '71', '13', '69046', '49020', '11'), +('12', '71', '13', '70622', '45071', '11'), +('12', '71', '13', '68744', '41379', '11'), +('12', '71', '14', '71669', '64385', '11'), +('12', '71', '14', '47311', '59347', '11'), +('12', '71', '14', '47250', '49615', '11'), +('12', '71', '14', '69046', '49020', '11'), +('12', '71', '11', '83548', '57722', '11'), +('12', '71', '11', '69162', '52918', '11'), +('12', '71', '11', '47243', '48571', '11'), +('12', '71', '11', '71659', '42739', '11'), +('12', '72', '22', '21805', '0', '11'), +('12', '72', '22', '61948', '0', '11'), +('12', '72', '22', '21807', '0', '11'), +('12', '72', '22', '12425', '0', '11'), +('12', '72', '1', '51705', '76028', '11'), +('12', '72', '1', '47285', '56603', '11'), +('12', '72', '1', '69062', '49762', '11'), +('12', '72', '1', '83435', '37720', '11'), +('12', '72', '2', '39358', '50526', '11'), +('12', '72', '2', '68195', '35473', '11'), +('12', '72', '2', '83563', '27906', '11'), +('12', '72', '2', '39285', '27491', '11'), +('12', '72', '3', '83634', '75919', '11'), +('12', '72', '3', '71655', '59767', '11'), +('12', '72', '3', '83531', '50874', '11'), +('12', '72', '3', '69074', '49039', '11'), +('12', '72', '5', '39328', '76614', '11'), +('12', '72', '5', '69135', '50436', '11'), +('12', '72', '5', '47276', '43484', '11'), +('12', '72', '5', '68808', '41074', '11'), +('12', '72', '8', '39299', '75795', '11'), +('12', '72', '8', '71665', '63044', '11'), +('12', '72', '8', '47247', '47259', '11'), +('12', '72', '8', '47306', '43667', '11'), +('12', '72', '6', '39275', '75788', '11'), +('12', '72', '6', '83635', '75529', '11'), +('12', '72', '6', '39209', '50634', '11'), +('12', '72', '6', '39263', '45726', '11'), +('12', '72', '17', '70935', '78679', '11'), +('12', '72', '17', '70714', '52215', '11'), +('12', '72', '17', '71641', '51308', '11'), +('12', '72', '17', '83606', '50665', '11'), +('12', '72', '7', '71089', '39684', '11'), +('12', '72', '7', '69082', '28613', '11'), +('12', '72', '7', '83567', '27456', '11'), +('12', '72', '7', '68911', '26797', '11'), +('12', '72', '9', '51709', '77736', '11'), +('12', '72', '9', '39336', '31161', '11'), +('12', '72', '9', '69100', '29949', '11'), +('12', '72', '9', '83655', '29575', '11'), +('12', '72', '15', '51702', '75121', '11'), +('12', '72', '15', '39230', '49619', '11'), +('12', '72', '15', '68957', '48082', '11'), +('12', '72', '15', '68846', '47432', '11'), +('12', '72', '20', '39253', '76376', '11'), +('12', '72', '20', '83650', '76028', '11'), +('12', '72', '20', '39235', '73524', '11'), +('12', '72', '20', '69134', '50626', '11'), +('12', '72', '12', '83571', '75256', '11'), +('12', '72', '12', '69255', '51864', '11'), +('12', '72', '12', '71090', '39988', '11'), +('12', '72', '12', '68912', '33762', '11'), +('12', '72', '18', '70936', '59664', '11'), +('12', '72', '18', '68751', '40370', '11'), +('12', '72', '18', '83610', '30364', '11'), +('12', '72', '18', '69149', '28078', '11'), +('12', '72', '19', '69078', '48033', '11'), +('12', '72', '19', '68913', '46281', '11'), +('12', '72', '19', '71091', '39653', '11'), +('12', '72', '19', '47219', '39333', '11'), +('12', '72', '13', '47250', '48218', '11'), +('12', '72', '13', '69046', '47223', '11'), +('12', '72', '13', '70622', '43674', '11'), +('12', '72', '13', '68744', '39781', '11'), +('12', '72', '14', '71669', '62388', '11'), +('12', '72', '14', '47311', '57550', '11'), +('12', '72', '14', '47250', '48218', '11'), +('12', '72', '14', '69046', '47223', '11'), +('12', '72', '11', '83548', '55925', '11'), +('12', '72', '11', '69162', '51322', '11'), +('12', '72', '11', '47243', '47173', '11'), +('12', '72', '11', '83665', '41774', '11'), +('12', '73', '22', '21805', '0', '11'), +('12', '73', '22', '61948', '0', '11'), +('12', '73', '22', '21807', '0', '11'), +('12', '73', '22', '12425', '0', '11'), +('12', '73', '1', '51705', '73631', '11'), +('12', '73', '1', '47285', '54805', '11'), +('12', '73', '1', '69062', '47966', '11'), +('12', '73', '1', '83435', '36522', '11'), +('12', '73', '2', '39358', '49529', '11'), +('12', '73', '2', '68195', '34076', '11'), +('12', '73', '2', '83563', '27910', '11'), +('12', '73', '2', '39285', '27495', '11'), +('12', '73', '3', '83634', '73523', '11'), +('12', '73', '3', '71655', '57770', '11'), +('12', '73', '3', '83531', '49277', '11'), +('12', '73', '3', '83658', '47658', '11'), +('12', '73', '5', '39328', '74217', '11'), +('12', '73', '5', '69135', '48839', '11'), +('12', '73', '5', '47276', '42487', '11'), +('12', '73', '5', '68808', '39477', '11'), +('12', '73', '8', '39299', '73397', '11'), +('12', '73', '8', '71665', '61048', '11'), +('12', '73', '8', '47247', '45859', '11'), +('12', '73', '8', '47306', '42670', '11'), +('12', '73', '6', '39275', '73391', '11'), +('12', '73', '6', '83635', '73133', '11'), +('12', '73', '6', '39209', '49037', '11'), +('12', '73', '6', '39263', '44729', '11'), +('12', '73', '17', '70935', '75933', '11'), +('12', '73', '17', '70714', '50619', '11'), +('12', '73', '17', '71641', '49710', '11'), +('12', '73', '17', '83606', '49670', '11'), +('12', '73', '7', '71089', '38487', '11'), +('12', '73', '7', '69082', '28040', '11'), +('12', '73', '7', '83567', '27461', '11'), +('12', '73', '7', '68911', '26225', '11'), +('12', '73', '9', '51709', '75339', '11'), +('12', '73', '9', '39336', '31165', '11'), +('12', '73', '9', '83655', '29578', '11'), +('12', '73', '9', '69100', '29377', '11'), +('12', '73', '15', '51702', '72724', '11'), +('12', '73', '15', '39230', '48022', '11'), +('12', '73', '15', '68957', '46284', '11'), +('12', '73', '15', '68846', '45634', '11'), +('12', '73', '20', '39253', '73979', '11'), +('12', '73', '20', '83650', '73631', '11'), +('12', '73', '20', '39235', '71127', '11'), +('12', '73', '20', '69134', '49029', '11'), +('12', '73', '12', '83571', '72861', '11'), +('12', '73', '12', '69255', '50266', '11'), +('12', '73', '12', '71090', '38790', '11'), +('12', '73', '12', '68912', '32514', '11'), +('12', '73', '18', '70936', '57864', '11'), +('12', '73', '18', '68751', '38873', '11'), +('12', '73', '18', '83610', '30369', '11'), +('12', '73', '18', '69149', '27831', '11'), +('12', '73', '19', '69078', '46235', '11'), +('12', '73', '19', '68913', '44484', '11'), +('12', '73', '19', '71091', '38453', '11'), +('12', '73', '19', '47219', '38436', '11'), +('12', '73', '13', '47250', '46821', '11'), +('12', '73', '13', '69046', '45426', '11'), +('12', '73', '13', '70622', '42277', '11'), +('12', '73', '13', '68744', '38183', '11'), +('12', '73', '14', '71669', '60391', '11'), +('12', '73', '14', '47311', '55753', '11'), +('12', '73', '14', '47250', '46821', '11'), +('12', '73', '14', '69046', '45426', '11'), +('12', '73', '11', '83548', '54128', '11'), +('12', '73', '11', '69162', '49726', '11'), +('12', '73', '11', '47243', '45775', '11'), +('12', '73', '11', '83665', '41203', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '74', '22', '21805', '0', '11'), +('12', '74', '22', '61948', '0', '11'), +('12', '74', '22', '21807', '0', '11'), +('12', '74', '22', '12425', '0', '11'), +('12', '74', '1', '51705', '71234', '11'), +('12', '74', '1', '47285', '53008', '11'), +('12', '74', '1', '69062', '46169', '11'), +('12', '74', '1', '83435', '35323', '11'), +('12', '74', '2', '39358', '48532', '11'), +('12', '74', '2', '68195', '32679', '11'), +('12', '74', '2', '83563', '27915', '11'), +('12', '74', '2', '39285', '27498', '11'), +('12', '74', '3', '83634', '71126', '11'), +('12', '74', '3', '71655', '55773', '11'), +('12', '74', '3', '83531', '47680', '11'), +('12', '74', '3', '83658', '46661', '11'), +('12', '74', '5', '39328', '71821', '11'), +('12', '74', '5', '69135', '47241', '11'), +('12', '74', '5', '47276', '41491', '11'), +('12', '74', '5', '68808', '37880', '11'), +('12', '74', '8', '39299', '71000', '11'), +('12', '74', '8', '71665', '59051', '11'), +('12', '74', '8', '47247', '44459', '11'), +('12', '74', '8', '47306', '41673', '11'), +('12', '74', '6', '39275', '70994', '11'), +('12', '74', '6', '83635', '70736', '11'), +('12', '74', '6', '39209', '47439', '11'), +('12', '74', '6', '39263', '43731', '11'), +('12', '74', '17', '70935', '73186', '11'), +('12', '74', '17', '70714', '49024', '11'), +('12', '74', '17', '83606', '48674', '11'), +('12', '74', '17', '71641', '48113', '11'), +('12', '74', '7', '71089', '37289', '11'), +('12', '74', '7', '83567', '27466', '11'), +('12', '74', '7', '69082', '27466', '11'), +('12', '74', '7', '68911', '25653', '11'), +('12', '74', '9', '51709', '72942', '11'), +('12', '74', '9', '39336', '31169', '11'), +('12', '74', '9', '83655', '29581', '11'), +('12', '74', '9', '69100', '28805', '11'), +('12', '74', '15', '51702', '70328', '11'), +('12', '74', '15', '39230', '46425', '11'), +('12', '74', '15', '68957', '44487', '11'), +('12', '74', '15', '68846', '43837', '11'), +('12', '74', '20', '39253', '71582', '11'), +('12', '74', '20', '83650', '71234', '11'), +('12', '74', '20', '39235', '68730', '11'), +('12', '74', '20', '69134', '47432', '11'), +('12', '74', '12', '83571', '70466', '11'), +('12', '74', '12', '69255', '48668', '11'), +('12', '74', '12', '71090', '37592', '11'), +('12', '74', '12', '68912', '31266', '11'), +('12', '74', '18', '70936', '56064', '11'), +('12', '74', '18', '68751', '37376', '11'), +('12', '74', '18', '83610', '30373', '11'), +('12', '74', '18', '69149', '27584', '11'), +('12', '74', '19', '69078', '44438', '11'), +('12', '74', '19', '68913', '42686', '11'), +('12', '74', '19', '47219', '37538', '11'), +('12', '74', '19', '71091', '37253', '11'), +('12', '74', '13', '47250', '45424', '11'), +('12', '74', '13', '69046', '43629', '11'), +('12', '74', '13', '70622', '40881', '11'), +('12', '74', '13', '68744', '36585', '11'), +('12', '74', '14', '71669', '58394', '11'), +('12', '74', '14', '47311', '53956', '11'), +('12', '74', '14', '47250', '45424', '11'), +('12', '74', '14', '69046', '43629', '11'), +('12', '74', '11', '83548', '52331', '11'), +('12', '74', '11', '69162', '48129', '11'), +('12', '74', '11', '47243', '44378', '11'), +('12', '74', '11', '83665', '40633', '11'), +('12', '75', '22', '21807', '0', '13'), +('12', '75', '22', '21805', '0', '13'), +('12', '75', '22', '12425', '0', '13'), +('12', '75', '22', '39342', '0', '13'), +('12', '75', '1', '51705', '68838', '13'), +('12', '75', '1', '47285', '51211', '13'), +('12', '75', '1', '80676', '46621', '13'), +('12', '75', '1', '69062', '44373', '13'), +('12', '75', '2', '39358', '47535', '13'), +('12', '75', '2', '68195', '31282', '13'), +('12', '75', '2', '83563', '27920', '13'), +('12', '75', '2', '39285', '27501', '13'), +('12', '75', '3', '83634', '68730', '13'), +('12', '75', '3', '71655', '53776', '13'), +('12', '75', '3', '83531', '46083', '13'), +('12', '75', '3', '83658', '45664', '13'), +('12', '75', '5', '39328', '69424', '13'), +('12', '75', '5', '69135', '45644', '13'), +('12', '75', '5', '80661', '45102', '13'), +('12', '75', '5', '80615', '41175', '13'), +('12', '75', '8', '39299', '68603', '13'), +('12', '75', '8', '71665', '57054', '13'), +('12', '75', '8', '80679', '46708', '13'), +('12', '75', '8', '47247', '43059', '13'), +('12', '75', '6', '39275', '68598', '13'), +('12', '75', '6', '83635', '68339', '13'), +('12', '75', '6', '39209', '45842', '13'), +('12', '75', '6', '39263', '42734', '13'), +('12', '75', '17', '70935', '70439', '13'), +('12', '75', '17', '83606', '47678', '13'), +('12', '75', '17', '70714', '47428', '13'), +('12', '75', '17', '71641', '46516', '13'), +('12', '75', '7', '71089', '36092', '13'), +('12', '75', '7', '83567', '27471', '13'), +('12', '75', '7', '69082', '26893', '13'), +('12', '75', '7', '70931', '25346', '13'), +('12', '75', '9', '51709', '70545', '13'), +('12', '75', '9', '46938', '40771', '13'), +('12', '75', '9', '53440', '35930', '13'), +('12', '75', '9', '39336', '31174', '13'), +('12', '75', '15', '51702', '67932', '13'), +('12', '75', '15', '79909', '48883', '13'), +('12', '75', '15', '80666', '47007', '13'), +('12', '75', '15', '80686', '46532', '13'), +('12', '75', '20', '39253', '69185', '13'), +('12', '75', '20', '83650', '68837', '13'), +('12', '75', '20', '39235', '66333', '13'), +('12', '75', '20', '80680', '46782', '13'), +('12', '75', '12', '83571', '68071', '13'), +('12', '75', '12', '69255', '47070', '13'), +('12', '75', '12', '71090', '36394', '13'), +('12', '75', '12', '68912', '30018', '13'), +('12', '75', '18', '70936', '54264', '13'), +('12', '75', '18', '68751', '35879', '13'), +('12', '75', '18', '46810', '30484', '13'), +('12', '75', '18', '83610', '30377', '13'), +('12', '75', '19', '69078', '42640', '13'), +('12', '75', '19', '68913', '40889', '13'), +('12', '75', '19', '47219', '36641', '13'), +('12', '75', '19', '71091', '36053', '13'), +('12', '75', '13', '47250', '44027', '13'), +('12', '75', '13', '80633', '42392', '13'), +('12', '75', '13', '69046', '41832', '13'), +('12', '75', '13', '70622', '39484', '13'), +('12', '75', '14', '71669', '56397', '13'), +('12', '75', '14', '47311', '52159', '13'), +('12', '75', '14', '47250', '44027', '13'), +('12', '75', '14', '80665', '42682', '13'), +('12', '75', '11', '83548', '50534', '13'), +('12', '75', '11', '80668', '46631', '13'), +('12', '75', '11', '69162', '46533', '13'), +('12', '75', '11', '47243', '42980', '13'), +('12', '75', '22', '21807', '0', '12'), +('12', '75', '22', '21805', '0', '12'), +('12', '75', '22', '12425', '0', '12'), +('12', '75', '22', '39342', '0', '12'), +('12', '75', '1', '51705', '68838', '12'), +('12', '75', '1', '47285', '51211', '12'), +('12', '75', '1', '69062', '44373', '12'), +('12', '75', '1', '46882', '40606', '12'), +('12', '75', '2', '39358', '47535', '12'), +('12', '75', '2', '68195', '31282', '12'), +('12', '75', '2', '83563', '27920', '12'), +('12', '75', '2', '39285', '27501', '12'), +('12', '75', '3', '83634', '68730', '12'), +('12', '75', '3', '71655', '53776', '12'), +('12', '75', '3', '83531', '46083', '12'), +('12', '75', '3', '83658', '45664', '12'), +('12', '75', '5', '39328', '69424', '12'), +('12', '75', '5', '69135', '45644', '12'), +('12', '75', '5', '47276', '40494', '12'), +('12', '75', '5', '46934', '40383', '12'), +('12', '75', '8', '39299', '68603', '12'), +('12', '75', '8', '71665', '57054', '12'), +('12', '75', '8', '47247', '43059', '12'), +('12', '75', '8', '47306', '40676', '12'), +('12', '75', '6', '39275', '68598', '12'), +('12', '75', '6', '83635', '68339', '12'), +('12', '75', '6', '39209', '45842', '12'), +('12', '75', '6', '39263', '42734', '12'), +('12', '75', '17', '70935', '70439', '12'), +('12', '75', '17', '83606', '47678', '12'), +('12', '75', '17', '70714', '47428', '12'), +('12', '75', '17', '71641', '46516', '12'), +('12', '75', '7', '71089', '36092', '12'), +('12', '75', '7', '83567', '27471', '12'), +('12', '75', '7', '69082', '26893', '12'), +('12', '75', '7', '70931', '25346', '12'), +('12', '75', '9', '51709', '70545', '12'), +('12', '75', '9', '46938', '40771', '12'), +('12', '75', '9', '53440', '35930', '12'), +('12', '75', '9', '39336', '31174', '12'), +('12', '75', '15', '51702', '67932', '12'), +('12', '75', '15', '39230', '44828', '12'), +('12', '75', '15', '68957', '42689', '12'), +('12', '75', '15', '68846', '42039', '12'), +('12', '75', '20', '39253', '69185', '12'), +('12', '75', '20', '83650', '68837', '12'), +('12', '75', '20', '39235', '66333', '12'), +('12', '75', '20', '69134', '45836', '12'), +('12', '75', '12', '83571', '68071', '12'), +('12', '75', '12', '69255', '47070', '12'), +('12', '75', '12', '71090', '36394', '12'), +('12', '75', '12', '68912', '30018', '12'), +('12', '75', '18', '70936', '54264', '12'), +('12', '75', '18', '68751', '35879', '12'), +('12', '75', '18', '46810', '30484', '12'), +('12', '75', '18', '83610', '30377', '12'), +('12', '75', '19', '69078', '42640', '12'), +('12', '75', '19', '68913', '40889', '12'), +('12', '75', '19', '47219', '36641', '12'), +('12', '75', '19', '71091', '36053', '12'), +('12', '75', '13', '47250', '44027', '12'), +('12', '75', '13', '69046', '41832', '12'), +('12', '75', '13', '70622', '39484', '12'), +('12', '75', '13', '71671', '35579', '12'), +('12', '75', '14', '71669', '56397', '12'), +('12', '75', '14', '47311', '52159', '12'), +('12', '75', '14', '47250', '44027', '12'), +('12', '75', '14', '69046', '41832', '12'), +('12', '75', '11', '83548', '50534', '12'), +('12', '75', '11', '69162', '46533', '12'), +('12', '75', '11', '47243', '42980', '12'), +('12', '75', '11', '46939', '40880', '12'), +('12', '76', '22', '21807', '0', '13'), +('12', '76', '22', '21805', '0', '13'), +('12', '76', '22', '12425', '0', '13'), +('12', '76', '22', '39342', '0', '13'), +('12', '76', '1', '51705', '66441', '13'), +('12', '76', '1', '47285', '49414', '13'), +('12', '76', '1', '80676', '46625', '13'), +('12', '76', '1', '69062', '42577', '13'), +('12', '76', '2', '39358', '46538', '13'), +('12', '76', '2', '68195', '29885', '13'), +('12', '76', '2', '83563', '27925', '13'), +('12', '76', '2', '39285', '27505', '13'), +('12', '76', '3', '83634', '66334', '13'), +('12', '76', '3', '71655', '51779', '13'), +('12', '76', '3', '83658', '44666', '13'), +('12', '76', '3', '83531', '44486', '13'), +('12', '76', '5', '39328', '67028', '13'), +('12', '76', '5', '80661', '45106', '13'), +('12', '76', '5', '69135', '44046', '13'), +('12', '76', '5', '80615', '41179', '13'), +('12', '76', '8', '39299', '66205', '13'), +('12', '76', '8', '71665', '55058', '13'), +('12', '76', '8', '80679', '46708', '13'), +('12', '76', '8', '80649', '42448', '13'), +('12', '76', '6', '39275', '66201', '13'), +('12', '76', '6', '83635', '65942', '13'), +('12', '76', '6', '39209', '44244', '13'), +('12', '76', '6', '80646', '42056', '13'), +('12', '76', '17', '70935', '67692', '13'), +('12', '76', '17', '83606', '46682', '13'), +('12', '76', '17', '70714', '45832', '13'), +('12', '76', '17', '71641', '44919', '13'), +('12', '76', '7', '71089', '34894', '13'), +('12', '76', '7', '83567', '27476', '13'), +('12', '76', '7', '69082', '26320', '13'), +('12', '76', '7', '70931', '25348', '13'), +('12', '76', '9', '51709', '68149', '13'), +('12', '76', '9', '46938', '40776', '13'), +('12', '76', '9', '53440', '35933', '13'), +('12', '76', '9', '39336', '31178', '13'), +('12', '76', '15', '51702', '65535', '13'), +('12', '76', '15', '79909', '48886', '13'), +('12', '76', '15', '80666', '47007', '13'), +('12', '76', '15', '80686', '46536', '13'), +('12', '76', '20', '39253', '66788', '13'), +('12', '76', '20', '83650', '66440', '13'), +('12', '76', '20', '39235', '63937', '13'), +('12', '76', '20', '80680', '46786', '13'), +('12', '76', '12', '83571', '65676', '13'), +('12', '76', '12', '69255', '45473', '13'), +('12', '76', '12', '71090', '35195', '13'), +('12', '76', '12', '70933', '29286', '13'), +('12', '76', '18', '70936', '52464', '13'), +('12', '76', '18', '68751', '34382', '13'), +('12', '76', '18', '46810', '30487', '13'), +('12', '76', '18', '83610', '30382', '13'), +('12', '76', '19', '69078', '40843', '13'), +('12', '76', '19', '68913', '39091', '13'), +('12', '76', '19', '47219', '35743', '13'), +('12', '76', '19', '71091', '34853', '13'), +('12', '76', '13', '47250', '42630', '13'), +('12', '76', '13', '80633', '42395', '13'), +('12', '76', '13', '69046', '40035', '13'), +('12', '76', '13', '80624', '39094', '13'), +('12', '76', '14', '71669', '54400', '13'), +('12', '76', '14', '47311', '50362', '13'), +('12', '76', '14', '80665', '42685', '13'), +('12', '76', '14', '47250', '42630', '13'), +('12', '76', '11', '83548', '48737', '13'), +('12', '76', '11', '80668', '46636', '13'), +('12', '76', '11', '69162', '44937', '13'), +('12', '76', '11', '47243', '41582', '13'), +('12', '77', '22', '21807', '0', '13'), +('12', '77', '22', '21805', '0', '13'), +('12', '77', '22', '12425', '0', '13'), +('12', '77', '22', '39342', '0', '13'), +('12', '77', '1', '51705', '64044', '13'), +('12', '77', '1', '47285', '47616', '13'), +('12', '77', '1', '80676', '46629', '13'), +('12', '77', '1', '80639', '42401', '13'), +('12', '77', '2', '39358', '45541', '13'), +('12', '77', '2', '68195', '28488', '13'), +('12', '77', '2', '83563', '27930', '13'), +('12', '77', '2', '39285', '27508', '13'), +('12', '77', '3', '83634', '63937', '13'), +('12', '77', '3', '71655', '49782', '13'), +('12', '77', '3', '83658', '43669', '13'), +('12', '77', '3', '83531', '42889', '13'), +('12', '77', '5', '39328', '64632', '13'), +('12', '77', '5', '80661', '45110', '13'), +('12', '77', '5', '69135', '42449', '13'), +('12', '77', '5', '80615', '41182', '13'), +('12', '77', '8', '39299', '63808', '13'), +('12', '77', '8', '71665', '53061', '13'), +('12', '77', '8', '80679', '46708', '13'), +('12', '77', '8', '80649', '42452', '13'), +('12', '77', '6', '39275', '63804', '13'), +('12', '77', '6', '83635', '63545', '13'), +('12', '77', '6', '39209', '42647', '13'), +('12', '77', '6', '80646', '42056', '13'), +('12', '77', '17', '70935', '64945', '13'), +('12', '77', '17', '83606', '45687', '13'), +('12', '77', '17', '70714', '44237', '13'), +('12', '77', '17', '71641', '43322', '13'), +('12', '77', '7', '71089', '33697', '13'), +('12', '77', '7', '83567', '27481', '13'), +('12', '77', '7', '69082', '25747', '13'), +('12', '77', '7', '70931', '25351', '13'), +('12', '77', '9', '51709', '65752', '13'), +('12', '77', '9', '46938', '40780', '13'), +('12', '77', '9', '53440', '35937', '13'), +('12', '77', '9', '39336', '31182', '13'), +('12', '77', '15', '51702', '63139', '13'), +('12', '77', '15', '79909', '48890', '13'), +('12', '77', '15', '80666', '47007', '13'), +('12', '77', '15', '80686', '46541', '13'), +('12', '77', '20', '39253', '64391', '13'), +('12', '77', '20', '83650', '64043', '13'), +('12', '77', '20', '39235', '61540', '13'), +('12', '77', '20', '80680', '46791', '13'), +('12', '77', '12', '83571', '63281', '13'), +('12', '77', '12', '69255', '43875', '13'), +('12', '77', '12', '71090', '33997', '13'), +('12', '77', '12', '70933', '28990', '13'), +('12', '77', '18', '70936', '50664', '13'), +('12', '77', '18', '68751', '32885', '13'), +('12', '77', '18', '46810', '30490', '13'), +('12', '77', '18', '83610', '30386', '13'), +('12', '77', '19', '69078', '39045', '13'), +('12', '77', '19', '68913', '37294', '13'), +('12', '77', '19', '47219', '34846', '13'), +('12', '77', '19', '71091', '33653', '13'), +('12', '77', '13', '80633', '42398', '13'), +('12', '77', '13', '47250', '41233', '13'), +('12', '77', '13', '80624', '39097', '13'), +('12', '77', '13', '69046', '38238', '13'), +('12', '77', '14', '71669', '52403', '13'), +('12', '77', '14', '47311', '48565', '13'), +('12', '77', '14', '80665', '42688', '13'), +('12', '77', '14', '80635', '41432', '13'), +('12', '77', '11', '83548', '46940', '13'), +('12', '77', '11', '80668', '46640', '13'), +('12', '77', '11', '69162', '43340', '13'), +('12', '77', '11', '46939', '40888', '13'), +('12', '78', '22', '21807', '0', '13'), +('12', '78', '22', '21805', '0', '13'), +('12', '78', '22', '12425', '0', '13'), +('12', '78', '22', '39342', '0', '13'), +('12', '78', '1', '51705', '61647', '13'), +('12', '78', '1', '80676', '46634', '13'), +('12', '78', '1', '47285', '45819', '13'), +('12', '78', '1', '80639', '42405', '13'), +('12', '78', '2', '39358', '44544', '13'), +('12', '78', '2', '83563', '27935', '13'), +('12', '78', '2', '39285', '27511', '13'), +('12', '78', '2', '68195', '27091', '13'), +('12', '78', '3', '83634', '61541', '13'), +('12', '78', '3', '71655', '47785', '13'), +('12', '78', '3', '80647', '42706', '13'), +('12', '78', '3', '83658', '42672', '13'), +('12', '78', '5', '39328', '62235', '13'), +('12', '78', '5', '80661', '45115', '13'), +('12', '78', '5', '80615', '41186', '13'), +('12', '78', '5', '69135', '40851', '13'), +('12', '78', '8', '39299', '61411', '13'), +('12', '78', '8', '71665', '51064', '13'), +('12', '78', '8', '80679', '46708', '13'), +('12', '78', '8', '80649', '42456', '13'), +('12', '78', '6', '39275', '61407', '13'), +('12', '78', '6', '83635', '61148', '13'), +('12', '78', '6', '80646', '42056', '13'), +('12', '78', '6', '39209', '41049', '13'), +('12', '78', '17', '70935', '62198', '13'), +('12', '78', '17', '83606', '44691', '13'), +('12', '78', '17', '70714', '42641', '13'), +('12', '78', '17', '71641', '41725', '13'), +('12', '78', '7', '71089', '32499', '13'), +('12', '78', '7', '83567', '27485', '13'), +('12', '78', '7', '70931', '25353', '13'), +('12', '78', '7', '69082', '25174', '13'), +('12', '78', '9', '51709', '63355', '13'), +('12', '78', '9', '46938', '40785', '13'), +('12', '78', '9', '53440', '35941', '13'), +('12', '78', '9', '39336', '31187', '13'), +('12', '78', '15', '51702', '60743', '13'), +('12', '78', '15', '79909', '48894', '13'), +('12', '78', '15', '80666', '47008', '13'), +('12', '78', '15', '80686', '46545', '13'), +('12', '78', '20', '39253', '61994', '13'), +('12', '78', '20', '83650', '61646', '13'), +('12', '78', '20', '39235', '59143', '13'), +('12', '78', '20', '80680', '46795', '13'), +('12', '78', '12', '83571', '60886', '13'), +('12', '78', '12', '69255', '42277', '13'), +('12', '78', '12', '71090', '32799', '13'), +('12', '78', '12', '70933', '28693', '13'), +('12', '78', '18', '70936', '48864', '13'), +('12', '78', '18', '68751', '31388', '13'), +('12', '78', '18', '46810', '30493', '13'), +('12', '78', '18', '83610', '30390', '13'), +('12', '78', '19', '69078', '37248', '13'), +('12', '78', '19', '68913', '35496', '13'), +('12', '78', '19', '47219', '33948', '13'), +('12', '78', '19', '71091', '32453', '13'), +('12', '78', '13', '80633', '42402', '13'), +('12', '78', '13', '47250', '39836', '13'), +('12', '78', '13', '80624', '39100', '13'), +('12', '78', '13', '69046', '36441', '13'), +('12', '78', '14', '71669', '50405', '13'), +('12', '78', '14', '47311', '46768', '13'), +('12', '78', '14', '80665', '42691', '13'), +('12', '78', '14', '80635', '41435', '13'), +('12', '78', '11', '80668', '46644', '13'), +('12', '78', '11', '83548', '45143', '13'), +('12', '78', '11', '69162', '41744', '13'), +('12', '78', '11', '46939', '40893', '13'), +('12', '79', '22', '21807', '0', '13'), +('12', '79', '22', '21805', '0', '13'), +('12', '79', '22', '12425', '0', '13'), +('12', '79', '22', '39342', '0', '13'), +('12', '79', '1', '51705', '59250', '13'), +('12', '79', '1', '80676', '46638', '13'), +('12', '79', '1', '47285', '44022', '13'), +('12', '79', '1', '80639', '42409', '13'), +('12', '79', '2', '39358', '43547', '13'), +('12', '79', '2', '83563', '27940', '13'), +('12', '79', '2', '39285', '27514', '13'), +('12', '79', '2', '68195', '25694', '13'), +('12', '79', '3', '83634', '59145', '13'), +('12', '79', '3', '71655', '45788', '13'), +('12', '79', '3', '80647', '42710', '13'), +('12', '79', '3', '83658', '41675', '13'), +('12', '79', '5', '39328', '59839', '13'), +('12', '79', '5', '80661', '45119', '13'), +('12', '79', '5', '80615', '41190', '13'), +('12', '79', '5', '46934', '40400', '13'), +('12', '79', '8', '39299', '59013', '13'), +('12', '79', '8', '71665', '49068', '13'), +('12', '79', '8', '80679', '46709', '13'), +('12', '79', '8', '80649', '42460', '13'), +('12', '79', '6', '39275', '59011', '13'), +('12', '79', '6', '83635', '58751', '13'), +('12', '79', '6', '80646', '42056', '13'), +('12', '79', '6', '46883', '40400', '13'), +('12', '79', '17', '70935', '59451', '13'), +('12', '79', '17', '83606', '43695', '13'), +('12', '79', '17', '70714', '41045', '13'), +('12', '79', '17', '71641', '40127', '13'), +('12', '79', '7', '71089', '31302', '13'), +('12', '79', '7', '83567', '27490', '13'), +('12', '79', '7', '70931', '25356', '13'), +('12', '79', '7', '69082', '24601', '13'), +('12', '79', '9', '51709', '60958', '13'), +('12', '79', '9', '46938', '40790', '13'), +('12', '79', '9', '53440', '35944', '13'), +('12', '79', '9', '39336', '31191', '13'), +('12', '79', '15', '51702', '58347', '13'), +('12', '79', '15', '79909', '48898', '13'), +('12', '79', '15', '80666', '47008', '13'), +('12', '79', '15', '80686', '46550', '13'), +('12', '79', '20', '39253', '59597', '13'), +('12', '79', '20', '83650', '59249', '13'), +('12', '79', '20', '39235', '56746', '13'), +('12', '79', '20', '80680', '46800', '13'), +('12', '79', '12', '83571', '58490', '13'), +('12', '79', '12', '69255', '40679', '13'), +('12', '79', '12', '71090', '31601', '13'), +('12', '79', '12', '70933', '28397', '13'), +('12', '79', '18', '70936', '47064', '13'), +('12', '79', '18', '46810', '30496', '13'), +('12', '79', '18', '83610', '30395', '13'), +('12', '79', '18', '68751', '29891', '13'), +('12', '79', '19', '69078', '35450', '13'), +('12', '79', '19', '68913', '33699', '13'), +('12', '79', '19', '47219', '33051', '13'), +('12', '79', '19', '70934', '31357', '13'), +('12', '79', '13', '80633', '42405', '13'), +('12', '79', '13', '80624', '39103', '13'), +('12', '79', '13', '47250', '38439', '13'), +('12', '79', '13', '69046', '34645', '13'), +('12', '79', '14', '71669', '48408', '13'), +('12', '79', '14', '47311', '44971', '13'), +('12', '79', '14', '80665', '42694', '13'), +('12', '79', '14', '80635', '41438', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '79', '11', '80668', '46649', '13'), +('12', '79', '11', '83548', '43346', '13'), +('12', '79', '11', '46939', '40897', '13'), +('12', '79', '11', '80629', '40599', '13'), +('12', '80', '22', '21807', '0', '14'), +('12', '80', '22', '21805', '0', '14'), +('12', '80', '22', '12425', '0', '14'), +('12', '80', '22', '39342', '0', '14'), +('12', '80', '1', '102604', '62031', '14'), +('12', '80', '1', '102640', '60668', '14'), +('12', '80', '1', '102639', '60557', '14'), +('12', '80', '1', '102641', '60446', '14'), +('12', '80', '2', '39358', '42550', '14'), +('12', '80', '2', '102024', '41989', '14'), +('12', '80', '2', '102276', '38058', '14'), +('12', '80', '2', '83563', '27945', '14'), +('12', '80', '3', '102605', '65165', '14'), +('12', '80', '3', '102742', '58299', '14'), +('12', '80', '3', '83634', '56748', '14'), +('12', '80', '3', '102560', '56099', '14'), +('12', '80', '5', '102731', '67360', '14'), +('12', '80', '5', '102606', '64452', '14'), +('12', '80', '5', '102730', '57861', '14'), +('12', '80', '5', '39328', '57442', '14'), +('12', '80', '8', '102728', '66155', '14'), +('12', '80', '8', '102608', '65113', '14'), +('12', '80', '8', '39299', '56616', '14'), +('12', '80', '8', '102728', '55254', '14'), +('12', '80', '6', '102607', '65293', '14'), +('12', '80', '6', '39275', '56614', '14'), +('12', '80', '6', '102561', '56369', '14'), +('12', '80', '6', '83635', '56354', '14'), +('12', '80', '17', '70935', '56704', '14'), +('12', '80', '17', '102027', '44073', '14'), +('12', '80', '17', '83606', '42700', '14'), +('12', '80', '17', '102279', '39897', '14'), +('12', '80', '7', '102025', '42265', '14'), +('12', '80', '7', '102277', '38100', '14'), +('12', '80', '7', '71089', '30104', '14'), +('12', '80', '7', '83567', '27495', '14'), +('12', '80', '9', '67098', '103896', '14'), +('12', '80', '9', '51709', '58561', '14'), +('12', '80', '9', '46938', '40795', '14'), +('12', '80', '9', '53440', '35948', '14'), +('12', '80', '15', '102723', '66554', '14'), +('12', '80', '15', '102609', '62895', '14'), +('12', '80', '15', '102634', '60657', '14'), +('12', '80', '15', '102637', '60623', '14'), +('12', '80', '20', '102610', '65335', '14'), +('12', '80', '20', '39253', '57200', '14'), +('12', '80', '20', '83650', '56852', '14'), +('12', '80', '20', '102563', '56370', '14'), +('12', '80', '12', '83571', '56095', '14'), +('12', '80', '12', '69255', '39082', '14'), +('12', '80', '12', '102274', '36376', '14'), +('12', '80', '12', '71090', '30403', '14'), +('12', '80', '18', '70936', '45265', '14'), +('12', '80', '18', '102026', '42907', '14'), +('12', '80', '18', '102278', '38463', '14'), +('12', '80', '18', '46810', '30499', '14'), +('12', '80', '19', '102275', '36541', '14'), +('12', '80', '19', '69078', '33653', '14'), +('12', '80', '19', '47219', '32153', '14'), +('12', '80', '19', '68913', '31901', '14'), +('12', '80', '13', '102657', '59415', '14'), +('12', '80', '13', '102735', '58156', '14'), +('12', '80', '13', '102734', '53355', '14'), +('12', '80', '13', '102586', '52005', '14'), +('12', '80', '14', '102633', '64003', '14'), +('12', '80', '14', '102632', '63857', '14'), +('12', '80', '14', '102570', '55864', '14'), +('12', '80', '14', '71669', '46411', '14'), +('12', '80', '11', '102643', '62143', '14'), +('12', '80', '11', '80668', '46653', '14'), +('12', '80', '11', '83548', '41549', '14'), +('12', '80', '11', '46939', '40901', '14'), +('12', '81', '22', '21807', '0', '14'), +('12', '81', '22', '21805', '0', '14'), +('12', '81', '22', '12425', '0', '14'), +('12', '81', '22', '39342', '0', '14'), +('12', '81', '1', '102604', '62034', '14'), +('12', '81', '1', '102640', '60674', '14'), +('12', '81', '1', '102639', '60561', '14'), +('12', '81', '1', '102641', '60452', '14'), +('12', '81', '2', '102024', '41993', '14'), +('12', '81', '2', '39358', '41553', '14'), +('12', '81', '2', '102276', '38062', '14'), +('12', '81', '2', '83563', '27950', '14'), +('12', '81', '3', '102605', '65168', '14'), +('12', '81', '3', '102742', '58304', '14'), +('12', '81', '3', '102560', '56103', '14'), +('12', '81', '3', '83634', '54352', '14'), +('12', '81', '5', '102731', '67365', '14'), +('12', '81', '5', '102606', '64454', '14'), +('12', '81', '5', '102730', '57866', '14'), +('12', '81', '5', '102565', '55658', '14'), +('12', '81', '8', '102728', '66159', '14'), +('12', '81', '8', '102608', '65117', '14'), +('12', '81', '8', '102728', '55257', '14'), +('12', '81', '8', '39299', '54218', '14'), +('12', '81', '6', '102607', '65297', '14'), +('12', '81', '6', '102561', '56373', '14'), +('12', '81', '6', '39275', '54217', '14'), +('12', '81', '6', '83635', '53958', '14'), +('12', '81', '17', '70935', '53958', '14'), +('12', '81', '17', '102027', '44076', '14'), +('12', '81', '17', '83606', '41704', '14'), +('12', '81', '17', '102279', '39900', '14'), +('12', '81', '7', '102025', '42269', '14'), +('12', '81', '7', '102277', '38103', '14'), +('12', '81', '7', '71089', '28907', '14'), +('12', '81', '7', '83567', '27500', '14'), +('12', '81', '9', '67098', '105198', '14'), +('12', '81', '9', '51709', '56164', '14'), +('12', '81', '9', '46938', '40800', '14'), +('12', '81', '9', '53440', '35952', '14'), +('12', '81', '15', '102723', '66558', '14'), +('12', '81', '15', '102609', '62899', '14'), +('12', '81', '15', '102634', '60660', '14'), +('12', '81', '15', '102637', '60628', '14'), +('12', '81', '20', '102610', '65340', '14'), +('12', '81', '20', '102563', '56372', '14'), +('12', '81', '20', '39253', '54803', '14'), +('12', '81', '20', '83650', '54455', '14'), +('12', '81', '12', '83571', '53700', '14'), +('12', '81', '12', '69255', '37484', '14'), +('12', '81', '12', '102274', '36380', '14'), +('12', '81', '12', '71090', '29205', '14'), +('12', '81', '18', '70936', '43465', '14'), +('12', '81', '18', '102026', '42909', '14'), +('12', '81', '18', '102278', '38468', '14'), +('12', '81', '18', '46810', '30502', '14'), +('12', '81', '19', '102275', '36542', '14'), +('12', '81', '19', '69078', '31855', '14'), +('12', '81', '19', '47219', '31256', '14'), +('12', '81', '19', '70934', '30217', '14'), +('12', '81', '13', '102657', '59418', '14'), +('12', '81', '13', '102735', '58160', '14'), +('12', '81', '13', '102734', '53359', '14'), +('12', '81', '13', '102586', '52006', '14'), +('12', '81', '14', '102633', '64007', '14'), +('12', '81', '14', '102632', '63861', '14'), +('12', '81', '14', '102570', '55869', '14'), +('12', '81', '14', '71669', '44414', '14'), +('12', '81', '11', '102643', '62146', '14'), +('12', '81', '11', '80668', '46658', '14'), +('12', '81', '11', '46939', '40906', '14'), +('12', '81', '11', '80629', '40606', '14'), +('12', '82', '22', '21807', '0', '14'), +('12', '82', '22', '21805', '0', '14'), +('12', '82', '22', '12425', '0', '14'), +('12', '82', '22', '39342', '0', '14'), +('12', '82', '1', '102604', '62038', '14'), +('12', '82', '1', '102640', '60679', '14'), +('12', '82', '1', '102639', '60565', '14'), +('12', '82', '1', '102641', '60457', '14'), +('12', '82', '2', '102024', '41997', '14'), +('12', '82', '2', '39358', '40556', '14'), +('12', '82', '2', '102276', '38065', '14'), +('12', '82', '2', '83563', '27955', '14'), +('12', '82', '3', '102605', '65170', '14'), +('12', '82', '3', '102742', '58309', '14'), +('12', '82', '3', '102560', '56106', '14'), +('12', '82', '3', '102741', '53408', '14'), +('12', '82', '5', '102731', '67371', '14'), +('12', '82', '5', '102606', '64455', '14'), +('12', '82', '5', '102730', '57870', '14'), +('12', '82', '5', '102565', '55662', '14'), +('12', '82', '8', '102728', '66164', '14'), +('12', '82', '8', '102608', '65122', '14'), +('12', '82', '8', '102728', '55260', '14'), +('12', '82', '8', '39299', '51821', '14'), +('12', '82', '6', '102607', '65302', '14'), +('12', '82', '6', '102561', '56377', '14'), +('12', '82', '6', '39275', '51820', '14'), +('12', '82', '6', '83635', '51561', '14'), +('12', '82', '17', '70935', '51211', '14'), +('12', '82', '17', '102027', '44079', '14'), +('12', '82', '17', '83606', '40708', '14'), +('12', '82', '17', '102279', '39903', '14'), +('12', '82', '7', '102025', '42274', '14'), +('12', '82', '7', '102277', '38106', '14'), +('12', '82', '7', '71089', '27709', '14'), +('12', '82', '7', '83567', '27505', '14'), +('12', '82', '9', '67098', '106499', '14'), +('12', '82', '9', '51709', '53767', '14'), +('12', '82', '9', '46938', '40805', '14'), +('12', '82', '9', '53440', '35956', '14'), +('12', '82', '15', '102723', '66563', '14'), +('12', '82', '15', '102609', '62903', '14'), +('12', '82', '15', '102634', '60663', '14'), +('12', '82', '15', '102637', '60633', '14'), +('12', '82', '20', '102610', '65346', '14'), +('12', '82', '20', '102563', '56373', '14'), +('12', '82', '20', '39253', '52406', '14'), +('12', '82', '20', '83650', '52058', '14'), +('12', '82', '12', '83571', '51305', '14'), +('12', '82', '12', '102274', '36383', '14'), +('12', '82', '12', '69255', '35886', '14'), +('12', '82', '12', '71090', '28007', '14'), +('12', '82', '18', '102026', '42910', '14'), +('12', '82', '18', '70936', '41665', '14'), +('12', '82', '18', '102278', '38474', '14'), +('12', '82', '18', '46810', '30505', '14'), +('12', '82', '19', '102275', '36544', '14'), +('12', '82', '19', '47219', '30358', '14'), +('12', '82', '19', '69078', '30058', '14'), +('12', '82', '19', '70934', '29646', '14'), +('12', '82', '13', '102657', '59420', '14'), +('12', '82', '13', '102735', '58165', '14'), +('12', '82', '13', '102734', '53363', '14'), +('12', '82', '13', '102586', '52008', '14'), +('12', '82', '14', '102633', '64011', '14'), +('12', '82', '14', '102632', '63864', '14'), +('12', '82', '14', '102570', '55874', '14'), +('12', '82', '14', '80665', '42703', '14'), +('12', '82', '11', '102643', '62149', '14'), +('12', '82', '11', '80668', '46662', '14'), +('12', '82', '11', '46939', '40910', '14'), +('12', '82', '11', '80629', '40610', '14'), +('12', '83', '22', '21807', '0', '14'), +('12', '83', '22', '21805', '0', '14'), +('12', '83', '22', '12425', '0', '14'), +('12', '83', '22', '39342', '0', '14'), +('12', '83', '1', '102604', '62041', '14'), +('12', '83', '1', '102640', '60685', '14'), +('12', '83', '1', '102639', '60570', '14'), +('12', '83', '1', '102641', '60463', '14'), +('12', '83', '2', '102024', '42000', '14'), +('12', '83', '2', '39358', '39559', '14'), +('12', '83', '2', '102276', '38068', '14'), +('12', '83', '2', '83563', '27959', '14'), +('12', '83', '3', '102605', '65173', '14'), +('12', '83', '3', '102742', '58314', '14'), +('12', '83', '3', '102560', '56110', '14'), +('12', '83', '3', '102741', '53412', '14'), +('12', '83', '5', '102731', '67377', '14'), +('12', '83', '5', '102606', '64457', '14'), +('12', '83', '5', '102730', '57874', '14'), +('12', '83', '5', '102565', '55666', '14'), +('12', '83', '8', '102728', '66168', '14'), +('12', '83', '8', '102608', '65126', '14'), +('12', '83', '8', '102728', '55263', '14'), +('12', '83', '8', '39299', '49424', '14'), +('12', '83', '6', '102607', '65306', '14'), +('12', '83', '6', '102561', '56381', '14'), +('12', '83', '6', '39275', '49424', '14'), +('12', '83', '6', '83635', '49164', '14'), +('12', '83', '17', '70935', '48464', '14'), +('12', '83', '17', '102027', '44081', '14'), +('12', '83', '17', '102279', '39906', '14'), +('12', '83', '17', '83606', '39713', '14'), +('12', '83', '7', '102025', '42278', '14'), +('12', '83', '7', '102277', '38109', '14'), +('12', '83', '7', '83567', '27510', '14'), +('12', '83', '7', '71089', '26512', '14'), +('12', '83', '9', '67098', '107800', '14'), +('12', '83', '9', '51709', '51370', '14'), +('12', '83', '9', '46938', '40810', '14'), +('12', '83', '9', '53440', '35959', '14'), +('12', '83', '15', '102723', '66567', '14'), +('12', '83', '15', '102609', '62907', '14'), +('12', '83', '15', '102634', '60666', '14'), +('12', '83', '15', '102637', '60638', '14'), +('12', '83', '20', '102610', '65351', '14'), +('12', '83', '20', '102563', '56374', '14'), +('12', '83', '20', '39253', '50010', '14'), +('12', '83', '20', '83650', '49662', '14'), +('12', '83', '12', '83571', '48910', '14'), +('12', '83', '12', '102274', '36387', '14'), +('12', '83', '12', '69255', '34288', '14'), +('12', '83', '12', '70933', '27212', '14'), +('12', '83', '18', '102026', '42911', '14'), +('12', '83', '18', '70936', '39865', '14'), +('12', '83', '18', '102278', '38479', '14'), +('12', '83', '18', '46810', '30508', '14'), +('12', '83', '19', '102275', '36545', '14'), +('12', '83', '19', '47219', '29461', '14'), +('12', '83', '19', '70934', '29076', '14'), +('12', '83', '19', '83575', '28310', '14'), +('12', '83', '13', '102657', '59423', '14'), +('12', '83', '13', '102735', '58169', '14'), +('12', '83', '13', '102734', '53366', '14'), +('12', '83', '13', '102586', '52009', '14'), +('12', '83', '14', '102633', '64014', '14'), +('12', '83', '14', '102632', '63868', '14'), +('12', '83', '14', '102570', '55879', '14'), +('12', '83', '14', '80665', '42706', '14'), +('12', '83', '11', '102643', '62152', '14'), +('12', '83', '11', '80668', '46667', '14'), +('12', '83', '11', '46939', '40914', '14'), +('12', '83', '11', '80629', '40614', '14'), +('12', '84', '22', '21807', '0', '14'), +('12', '84', '22', '21805', '0', '14'), +('12', '84', '22', '12425', '0', '14'), +('12', '84', '22', '39342', '0', '14'), +('12', '84', '1', '102604', '62045', '14'), +('12', '84', '1', '102640', '60691', '14'), +('12', '84', '1', '102639', '60574', '14'), +('12', '84', '1', '102641', '60468', '14'), +('12', '84', '2', '102024', '42004', '14'), +('12', '84', '2', '39358', '38562', '14'), +('12', '84', '2', '102276', '38071', '14'), +('12', '84', '2', '83563', '27964', '14'), +('12', '84', '3', '102605', '65175', '14'), +('12', '84', '3', '102742', '58319', '14'), +('12', '84', '3', '102560', '56114', '14'), +('12', '84', '3', '102741', '53416', '14'), +('12', '84', '5', '102731', '67382', '14'), +('12', '84', '5', '102606', '64459', '14'), +('12', '84', '5', '102730', '57879', '14'), +('12', '84', '5', '102565', '55669', '14'), +('12', '84', '8', '102728', '66172', '14'), +('12', '84', '8', '102608', '65130', '14'), +('12', '84', '8', '102728', '55266', '14'), +('12', '84', '8', '39299', '47026', '14'), +('12', '84', '6', '102607', '65310', '14'), +('12', '84', '6', '102561', '56385', '14'), +('12', '84', '6', '39275', '47027', '14'), +('12', '84', '6', '83635', '46767', '14'), +('12', '84', '17', '70935', '45717', '14'), +('12', '84', '17', '102027', '44084', '14'), +('12', '84', '17', '102279', '39909', '14'), +('12', '84', '17', '83606', '38717', '14'), +('12', '84', '7', '102025', '42283', '14'), +('12', '84', '7', '102277', '38112', '14'), +('12', '84', '7', '83567', '27515', '14'), +('12', '84', '7', '70931', '25369', '14'), +('12', '84', '9', '67098', '109101', '14'), +('12', '84', '9', '51709', '48973', '14'), +('12', '84', '9', '46938', '40815', '14'), +('12', '84', '9', '53440', '35963', '14'), +('12', '84', '15', '102723', '66571', '14'), +('12', '84', '15', '102609', '62911', '14'), +('12', '84', '15', '102634', '60669', '14'), +('12', '84', '15', '102637', '60644', '14'), +('12', '84', '20', '102610', '65357', '14'), +('12', '84', '20', '102563', '56376', '14'), +('12', '84', '20', '39253', '47613', '14'), +('12', '84', '20', '83650', '47265', '14'), +('12', '84', '12', '83571', '46515', '14'), +('12', '84', '12', '102274', '36390', '14'), +('12', '84', '12', '69255', '32691', '14'), +('12', '84', '12', '70933', '26916', '14'), +('12', '84', '18', '102026', '42912', '14'), +('12', '84', '18', '102278', '38484', '14'), +('12', '84', '18', '70936', '38065', '14'), +('12', '84', '18', '46810', '30512', '14'), +('12', '84', '19', '102275', '36546', '14'), +('12', '84', '19', '47219', '28563', '14'), +('12', '84', '19', '70934', '28506', '14'), +('12', '84', '19', '83575', '28315', '14'), +('12', '84', '13', '102657', '59425', '14'), +('12', '84', '13', '102735', '58173', '14'), +('12', '84', '13', '102734', '53370', '14'), +('12', '84', '13', '102586', '52010', '14'), +('12', '84', '14', '102633', '64018', '14'), +('12', '84', '14', '102632', '63872', '14'), +('12', '84', '14', '102570', '55884', '14'), +('12', '84', '14', '80665', '42709', '14'), +('12', '84', '11', '102643', '62154', '14'), +('12', '84', '11', '80668', '46671', '14'), +('12', '84', '11', '46939', '40919', '14'), +('12', '84', '11', '80629', '40618', '14'), +('12', '85', '22', '12425', '0', '16'), +('12', '85', '22', '21807', '0', '16'), +('12', '85', '22', '39342', '0', '16'), +('12', '85', '22', '23597', '0', '16'), +('12', '85', '1', '111307', '115892', '16'), +('12', '85', '1', '111306', '115825', '16'), +('12', '85', '1', '111304', '115692', '16'), +('12', '85', '1', '111300', '114544', '16'), +('12', '85', '2', '62985', '72735', '16'), +('12', '85', '2', '94056', '72656', '16'), +('12', '85', '2', '104424', '63471', '16'), +('12', '85', '2', '54845', '46589', '16'), +('12', '85', '3', '111314', '116209', '16'), +('12', '85', '3', '111316', '114918', '16'), +('12', '85', '3', '111315', '114673', '16'), +('12', '85', '3', '111013', '102159', '16'), +('12', '85', '5', '111319', '115870', '16'), +('12', '85', '5', '111321', '115375', '16'), +('12', '85', '5', '111318', '114106', '16'), +('12', '85', '5', '111018', '101820', '16'), +('12', '85', '8', '111332', '116156', '16'), +('12', '85', '8', '111329', '115631', '16'), +('12', '85', '8', '111331', '113389', '16'), +('12', '85', '8', '111031', '102205', '16'), +('12', '85', '6', '111323', '116099', '16'), +('12', '85', '6', '111325', '115305', '16'), +('12', '85', '6', '111326', '114999', '16'), +('12', '85', '6', '111022', '102048', '16'), +('12', '85', '17', '56043', '77131', '16'), +('12', '85', '17', '56084', '75409', '16'), +('12', '85', '17', '104427', '65830', '16'), +('12', '85', '17', '54854', '49052', '16'), +('12', '85', '7', '56080', '72728', '16'), +('12', '85', '7', '56040', '72232', '16'), +('12', '85', '7', '104425', '63240', '16'), +('12', '85', '7', '49656', '46297', '16'), +('12', '85', '9', '67098', '110402', '16'), +('12', '85', '9', '56070', '70610', '16'), +('12', '85', '9', '62984', '70372', '16'), +('12', '85', '9', '56031', '70308', '16'), +('12', '85', '15', '111349', '117287', '16'), +('12', '85', '15', '111344', '116363', '16'), +('12', '85', '15', '111340', '116014', '16'), +('12', '85', '15', '111346', '115835', '16'), +('12', '85', '20', '111356', '116284', '16'), +('12', '85', '20', '111352', '115368', '16'), +('12', '85', '20', '111351', '114245', '16'), +('12', '85', '20', '111054', '102233', '16'), +('12', '85', '12', '56035', '71687', '16'), +('12', '85', '12', '56074', '70962', '16'), +('12', '85', '12', '104422', '61762', '16'), +('12', '85', '12', '49656', '46297', '16'), +('12', '85', '18', '56041', '75418', '16'), +('12', '85', '18', '62986', '74354', '16'), +('12', '85', '18', '104426', '64114', '16'), +('12', '85', '18', '54851', '46872', '16'), +('12', '85', '19', '62990', '73418', '16'), +('12', '85', '19', '81763', '73320', '16'), +('12', '85', '19', '56037', '72865', '16'), +('12', '85', '19', '56075', '72778', '16'), +('12', '85', '13', '111521', '119232', '16'), +('12', '85', '13', '111524', '113219', '16'), +('12', '85', '13', '111519', '113161', '16'), +('12', '85', '13', '111221', '105954', '16'), +('12', '85', '14', '111537', '116355', '16'), +('12', '85', '14', '111535', '114896', '16'), +('12', '85', '14', '111237', '102304', '16'), +('12', '85', '14', '111235', '100945', '16'), +('12', '85', '11', '111335', '115695', '16'), +('12', '85', '11', '111337', '115456', '16'), +('12', '85', '11', '111338', '113279', '16'), +('12', '85', '11', '111034', '101744', '16'), +('12', '85', '22', '21807', '0', '15'), +('12', '85', '22', '21805', '0', '15'), +('12', '85', '22', '12425', '0', '15'), +('12', '85', '22', '7867', '0', '15'), +('12', '85', '1', '107040', '88036', '15'), +('12', '85', '1', '107039', '86480', '15'), +('12', '85', '1', '107053', '85527', '15'), +('12', '85', '1', '107052', '84604', '15'), +('12', '85', '2', '62985', '72735', '15'), +('12', '85', '2', '94056', '72656', '15'), +('12', '85', '2', '104424', '63471', '15'), +('12', '85', '2', '54845', '46589', '15'), +('12', '85', '3', '107041', '89301', '15'), +('12', '85', '3', '107055', '85585', '15'), +('12', '85', '3', '106828', '83320', '15'), +('12', '85', '3', '106841', '81034', '15'), +('12', '85', '5', '107042', '88363', '15'), +('12', '85', '5', '107056', '84975', '15'), +('12', '85', '5', '106829', '83118', '15'), +('12', '85', '5', '56090', '73473', '15'), +('12', '85', '8', '107044', '89131', '15'), +('12', '85', '8', '107058', '86138', '15'), +('12', '85', '8', '106831', '83377', '15'), +('12', '85', '8', '106844', '80374', '15'), +('12', '85', '6', '107043', '88988', '15'), +('12', '85', '6', '107057', '85949', '15'), +('12', '85', '6', '106830', '83277', '15'), +('12', '85', '6', '106843', '80328', '15'), +('12', '85', '17', '56043', '77131', '15'), +('12', '85', '17', '56084', '75409', '15'), +('12', '85', '17', '104427', '65830', '15'), +('12', '85', '17', '54854', '49052', '15'), +('12', '85', '7', '56080', '72728', '15'), +('12', '85', '7', '56040', '72232', '15'), +('12', '85', '7', '104425', '63240', '15'), +('12', '85', '7', '54848', '46073', '15'), +('12', '85', '9', '67098', '110402', '15'), +('12', '85', '9', '56070', '70610', '15'), +('12', '85', '9', '62984', '70372', '15'), +('12', '85', '9', '56031', '70308', '15'), +('12', '85', '15', '107046', '88219', '15'), +('12', '85', '15', '107047', '87825', '15'), +('12', '85', '15', '107061', '85140', '15'), +('12', '85', '15', '107050', '84320', '15'), +('12', '85', '20', '107048', '89251', '15'), +('12', '85', '20', '107059', '86917', '15'), +('12', '85', '20', '106834', '84027', '15'), +('12', '85', '20', '106845', '81575', '15'), +('12', '85', '12', '56035', '71687', '15'), +('12', '85', '12', '56074', '70962', '15'), +('12', '85', '12', '104422', '61762', '15'), +('12', '85', '12', '83571', '44120', '15'), +('12', '85', '18', '56041', '75418', '15'), +('12', '85', '18', '62986', '74354', '15'), +('12', '85', '18', '104426', '64114', '15'), +('12', '85', '18', '54851', '46872', '15'), +('12', '85', '19', '62990', '73418', '15'), +('12', '85', '19', '81763', '73320', '15'), +('12', '85', '19', '56037', '72865', '15'), +('12', '85', '19', '56075', '72778', '15'), +('12', '85', '13', '106864', '82976', '15'), +('12', '85', '13', '106861', '82135', '15'), +('12', '85', '13', '106764', '74682', '15'), +('12', '85', '13', '62932', '73867', '15'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '85', '14', '107063', '86860', '15'), +('12', '85', '14', '107065', '85666', '15'), +('12', '85', '14', '106850', '82030', '15'), +('12', '85', '14', '106852', '80678', '15'), +('12', '85', '11', '107045', '87880', '15'), +('12', '85', '11', '106832', '81777', '15'), +('12', '85', '11', '106739', '73301', '15'), +('12', '85', '11', '56099', '72095', '15'), +('12', '86', '22', '12425', '0', '16'), +('12', '86', '22', '21807', '0', '16'), +('12', '86', '22', '39342', '0', '16'), +('12', '86', '22', '23597', '0', '16'), +('12', '86', '1', '111307', '115897', '16'), +('12', '86', '1', '111306', '115828', '16'), +('12', '86', '1', '111304', '115695', '16'), +('12', '86', '1', '111300', '114548', '16'), +('12', '86', '2', '62985', '72737', '16'), +('12', '86', '2', '94056', '72658', '16'), +('12', '86', '2', '104424', '63476', '16'), +('12', '86', '2', '54845', '46593', '16'), +('12', '86', '3', '111314', '116213', '16'), +('12', '86', '3', '111316', '114922', '16'), +('12', '86', '3', '111315', '114677', '16'), +('12', '86', '3', '111013', '102163', '16'), +('12', '86', '5', '111319', '115875', '16'), +('12', '86', '5', '111321', '115379', '16'), +('12', '86', '5', '111318', '114110', '16'), +('12', '86', '5', '111018', '101824', '16'), +('12', '86', '8', '111332', '116160', '16'), +('12', '86', '8', '111329', '115635', '16'), +('12', '86', '8', '111331', '113392', '16'), +('12', '86', '8', '111031', '102209', '16'), +('12', '86', '6', '111323', '116102', '16'), +('12', '86', '6', '111325', '115307', '16'), +('12', '86', '6', '111326', '115003', '16'), +('12', '86', '6', '111022', '102052', '16'), +('12', '86', '17', '56043', '77134', '16'), +('12', '86', '17', '56084', '75412', '16'), +('12', '86', '17', '104427', '65834', '16'), +('12', '86', '17', '54854', '49055', '16'), +('12', '86', '7', '56080', '72732', '16'), +('12', '86', '7', '56040', '72238', '16'), +('12', '86', '7', '104425', '63244', '16'), +('12', '86', '7', '49656', '46297', '16'), +('12', '86', '9', '67098', '111704', '16'), +('12', '86', '9', '56070', '70613', '16'), +('12', '86', '9', '62984', '70375', '16'), +('12', '86', '9', '56031', '70314', '16'), +('12', '86', '15', '111349', '117292', '16'), +('12', '86', '15', '111344', '116366', '16'), +('12', '86', '15', '111340', '116017', '16'), +('12', '86', '15', '111346', '115838', '16'), +('12', '86', '20', '111356', '116288', '16'), +('12', '86', '20', '111352', '115371', '16'), +('12', '86', '20', '111351', '114250', '16'), +('12', '86', '20', '111054', '102237', '16'), +('12', '86', '12', '56035', '71693', '16'), +('12', '86', '12', '56074', '70965', '16'), +('12', '86', '12', '104422', '61767', '16'), +('12', '86', '12', '49656', '46297', '16'), +('12', '86', '18', '56041', '75423', '16'), +('12', '86', '18', '62986', '74357', '16'), +('12', '86', '18', '104426', '64116', '16'), +('12', '86', '18', '54851', '46875', '16'), +('12', '86', '19', '62990', '73422', '16'), +('12', '86', '19', '81763', '73326', '16'), +('12', '86', '19', '56037', '72867', '16'), +('12', '86', '19', '56075', '72781', '16'), +('12', '86', '13', '111521', '119235', '16'), +('12', '86', '13', '111524', '113223', '16'), +('12', '86', '13', '111519', '113165', '16'), +('12', '86', '13', '111221', '105958', '16'), +('12', '86', '14', '111537', '116358', '16'), +('12', '86', '14', '111535', '114899', '16'), +('12', '86', '14', '111237', '102307', '16'), +('12', '86', '14', '111235', '100947', '16'), +('12', '86', '11', '111335', '115698', '16'), +('12', '86', '11', '111337', '115459', '16'), +('12', '86', '11', '111338', '113282', '16'), +('12', '86', '11', '111034', '101748', '16'), +('12', '87', '22', '12425', '0', '16'), +('12', '87', '22', '21807', '0', '16'), +('12', '87', '22', '39342', '0', '16'), +('12', '87', '22', '23597', '0', '16'), +('12', '87', '1', '111307', '115902', '16'), +('12', '87', '1', '111306', '115832', '16'), +('12', '87', '1', '111304', '115698', '16'), +('12', '87', '1', '111300', '114552', '16'), +('12', '87', '2', '62985', '72739', '16'), +('12', '87', '2', '94056', '72660', '16'), +('12', '87', '2', '104424', '63481', '16'), +('12', '87', '2', '54845', '46597', '16'), +('12', '87', '3', '111314', '116217', '16'), +('12', '87', '3', '111316', '114925', '16'), +('12', '87', '3', '111315', '114681', '16'), +('12', '87', '3', '111013', '102167', '16'), +('12', '87', '5', '111319', '115879', '16'), +('12', '87', '5', '111321', '115382', '16'), +('12', '87', '5', '111318', '114115', '16'), +('12', '87', '5', '111018', '101829', '16'), +('12', '87', '8', '111332', '116164', '16'), +('12', '87', '8', '111329', '115640', '16'), +('12', '87', '8', '111331', '113395', '16'), +('12', '87', '8', '111031', '102213', '16'), +('12', '87', '6', '111323', '116106', '16'), +('12', '87', '6', '111325', '115310', '16'), +('12', '87', '6', '111326', '115008', '16'), +('12', '87', '6', '111022', '102055', '16'), +('12', '87', '17', '56043', '77138', '16'), +('12', '87', '17', '56084', '75416', '16'), +('12', '87', '17', '104427', '65838', '16'), +('12', '87', '17', '54854', '49058', '16'), +('12', '87', '7', '56080', '72737', '16'), +('12', '87', '7', '56040', '72244', '16'), +('12', '87', '7', '104425', '63247', '16'), +('12', '87', '7', '49656', '46298', '16'), +('12', '87', '9', '67098', '113005', '16'), +('12', '87', '9', '56070', '70617', '16'), +('12', '87', '9', '62984', '70378', '16'), +('12', '87', '9', '56031', '70320', '16'), +('12', '87', '15', '111349', '117297', '16'), +('12', '87', '15', '111344', '116369', '16'), +('12', '87', '15', '111340', '116021', '16'), +('12', '87', '15', '111346', '115842', '16'), +('12', '87', '20', '111356', '116291', '16'), +('12', '87', '20', '111352', '115374', '16'), +('12', '87', '20', '111351', '114254', '16'), +('12', '87', '20', '111054', '102241', '16'), +('12', '87', '12', '56035', '71699', '16'), +('12', '87', '12', '56074', '70969', '16'), +('12', '87', '12', '104422', '61772', '16'), +('12', '87', '12', '49656', '46298', '16'), +('12', '87', '18', '56041', '75428', '16'), +('12', '87', '18', '62986', '74360', '16'), +('12', '87', '18', '104426', '64117', '16'), +('12', '87', '18', '54851', '46877', '16'), +('12', '87', '19', '62990', '73427', '16'), +('12', '87', '19', '81763', '73332', '16'), +('12', '87', '19', '56037', '72868', '16'), +('12', '87', '19', '56075', '72784', '16'), +('12', '87', '13', '111521', '119238', '16'), +('12', '87', '13', '111524', '113227', '16'), +('12', '87', '13', '111519', '113170', '16'), +('12', '87', '13', '111221', '105961', '16'), +('12', '87', '14', '111537', '116361', '16'), +('12', '87', '14', '111535', '114901', '16'), +('12', '87', '14', '111237', '102310', '16'), +('12', '87', '14', '111235', '100950', '16'), +('12', '87', '11', '111335', '115702', '16'), +('12', '87', '11', '111337', '115463', '16'), +('12', '87', '11', '111338', '113286', '16'), +('12', '87', '11', '111034', '101751', '16'), +('12', '88', '22', '12425', '0', '16'), +('12', '88', '22', '21807', '0', '16'), +('12', '88', '22', '39342', '0', '16'), +('12', '88', '22', '23597', '0', '16'), +('12', '88', '1', '111307', '115907', '16'), +('12', '88', '1', '111306', '115835', '16'), +('12', '88', '1', '111304', '115701', '16'), +('12', '88', '1', '111300', '114556', '16'), +('12', '88', '2', '62985', '72742', '16'), +('12', '88', '2', '94056', '72662', '16'), +('12', '88', '2', '104424', '63486', '16'), +('12', '88', '2', '54845', '46600', '16'), +('12', '88', '3', '111314', '116221', '16'), +('12', '88', '3', '111316', '114929', '16'), +('12', '88', '3', '111315', '114684', '16'), +('12', '88', '3', '111013', '102171', '16'), +('12', '88', '5', '111319', '115883', '16'), +('12', '88', '5', '111321', '115385', '16'), +('12', '88', '5', '111318', '114119', '16'), +('12', '88', '5', '111018', '101833', '16'), +('12', '88', '8', '111332', '116168', '16'), +('12', '88', '8', '111329', '115644', '16'), +('12', '88', '8', '111331', '113398', '16'), +('12', '88', '8', '111031', '102217', '16'), +('12', '88', '6', '111323', '116109', '16'), +('12', '88', '6', '111325', '115313', '16'), +('12', '88', '6', '111326', '115013', '16'), +('12', '88', '6', '111022', '102059', '16'), +('12', '88', '17', '56043', '77141', '16'), +('12', '88', '17', '56084', '75420', '16'), +('12', '88', '17', '104427', '65842', '16'), +('12', '88', '17', '54854', '49061', '16'), +('12', '88', '7', '56080', '72741', '16'), +('12', '88', '7', '56040', '72251', '16'), +('12', '88', '7', '104425', '63250', '16'), +('12', '88', '7', '49656', '46298', '16'), +('12', '88', '9', '67098', '114307', '16'), +('12', '88', '9', '56070', '70620', '16'), +('12', '88', '9', '62984', '70381', '16'), +('12', '88', '9', '56031', '70326', '16'), +('12', '88', '15', '111349', '117302', '16'), +('12', '88', '15', '111344', '116372', '16'), +('12', '88', '15', '111340', '116024', '16'), +('12', '88', '15', '111346', '115845', '16'), +('12', '88', '20', '111356', '116295', '16'), +('12', '88', '20', '111352', '115378', '16'), +('12', '88', '20', '111351', '114259', '16'), +('12', '88', '20', '111054', '102244', '16'), +('12', '88', '12', '56035', '71704', '16'), +('12', '88', '12', '56074', '70973', '16'), +('12', '88', '12', '104422', '61777', '16'), +('12', '88', '12', '49656', '46298', '16'), +('12', '88', '18', '56041', '75433', '16'), +('12', '88', '18', '62986', '74363', '16'), +('12', '88', '18', '104426', '64118', '16'), +('12', '88', '18', '54851', '46880', '16'), +('12', '88', '19', '62990', '73431', '16'), +('12', '88', '19', '81763', '73338', '16'), +('12', '88', '19', '56037', '72870', '16'), +('12', '88', '19', '56075', '72787', '16'), +('12', '88', '13', '111521', '119242', '16'), +('12', '88', '13', '111524', '113231', '16'), +('12', '88', '13', '111519', '113174', '16'), +('12', '88', '13', '111221', '105965', '16'), +('12', '88', '14', '111537', '116364', '16'), +('12', '88', '14', '111535', '114904', '16'), +('12', '88', '14', '111237', '102313', '16'), +('12', '88', '14', '111235', '100952', '16'), +('12', '88', '11', '111335', '115705', '16'), +('12', '88', '11', '111337', '115467', '16'), +('12', '88', '11', '111338', '113290', '16'), +('12', '88', '11', '111034', '101755', '16'), +('12', '89', '22', '12425', '0', '16'), +('12', '89', '22', '21807', '0', '16'), +('12', '89', '22', '39342', '0', '16'), +('12', '89', '22', '23597', '0', '16'), +('12', '89', '1', '111307', '115912', '16'), +('12', '89', '1', '111306', '115838', '16'), +('12', '89', '1', '111304', '115704', '16'), +('12', '89', '1', '111300', '114560', '16'), +('12', '89', '2', '62985', '72744', '16'), +('12', '89', '2', '94056', '72664', '16'), +('12', '89', '2', '104424', '63490', '16'), +('12', '89', '2', '54845', '46604', '16'), +('12', '89', '3', '111314', '116225', '16'), +('12', '89', '3', '111316', '114933', '16'), +('12', '89', '3', '111315', '114688', '16'), +('12', '89', '3', '111013', '102175', '16'), +('12', '89', '5', '111319', '115888', '16'), +('12', '89', '5', '111321', '115388', '16'), +('12', '89', '5', '111318', '114124', '16'), +('12', '89', '5', '111018', '101837', '16'), +('12', '89', '8', '111332', '116172', '16'), +('12', '89', '8', '111329', '115649', '16'), +('12', '89', '8', '111331', '113402', '16'), +('12', '89', '8', '111031', '102221', '16'), +('12', '89', '6', '111323', '116113', '16'), +('12', '89', '6', '111325', '115316', '16'), +('12', '89', '6', '111326', '115017', '16'), +('12', '89', '6', '111022', '102062', '16'), +('12', '89', '17', '56043', '77144', '16'), +('12', '89', '17', '56084', '75424', '16'), +('12', '89', '17', '104427', '65845', '16'), +('12', '89', '17', '54854', '49064', '16'), +('12', '89', '7', '56080', '72745', '16'), +('12', '89', '7', '56040', '72257', '16'), +('12', '89', '7', '104425', '63253', '16'), +('12', '89', '7', '49656', '46299', '16'), +('12', '89', '9', '67098', '115608', '16'), +('12', '89', '9', '56070', '70623', '16'), +('12', '89', '9', '62984', '70384', '16'), +('12', '89', '9', '56031', '70333', '16'), +('12', '89', '15', '111349', '117306', '16'), +('12', '89', '15', '111344', '116375', '16'), +('12', '89', '15', '111340', '116027', '16'), +('12', '89', '15', '111346', '115849', '16'), +('12', '89', '20', '111356', '116299', '16'), +('12', '89', '20', '111352', '115381', '16'), +('12', '89', '20', '111351', '114263', '16'), +('12', '89', '20', '111054', '102248', '16'), +('12', '89', '12', '56035', '71710', '16'), +('12', '89', '12', '56074', '70976', '16'), +('12', '89', '12', '104422', '61781', '16'), +('12', '89', '12', '49656', '46299', '16'), +('12', '89', '18', '56041', '75438', '16'), +('12', '89', '18', '62986', '74366', '16'), +('12', '89', '18', '104426', '64119', '16'), +('12', '89', '18', '54851', '46882', '16'), +('12', '89', '19', '62990', '73436', '16'), +('12', '89', '19', '81763', '73344', '16'), +('12', '89', '19', '56037', '72871', '16'), +('12', '89', '19', '56075', '72790', '16'), +('12', '89', '13', '111521', '119245', '16'), +('12', '89', '13', '111524', '113235', '16'), +('12', '89', '13', '111519', '113179', '16'), +('12', '89', '13', '111221', '105969', '16'), +('12', '89', '14', '111537', '116368', '16'), +('12', '89', '14', '111535', '114906', '16'), +('12', '89', '14', '111237', '102316', '16'), +('12', '89', '14', '111235', '100955', '16'), +('12', '89', '11', '111335', '115709', '16'), +('12', '89', '11', '111337', '115470', '16'), +('12', '89', '11', '111338', '113294', '16'), +('12', '89', '11', '111034', '101758', '16'), +('12', '90', '22', '12425', '0', '17'), +('12', '90', '22', '21807', '0', '17'), +('12', '90', '22', '39342', '0', '17'), +('12', '90', '22', '23597', '0', '17'), +('12', '90', '1', '111307', '115917', '17'), +('12', '90', '1', '111306', '115842', '17'), +('12', '90', '1', '111304', '115707', '17'), +('12', '90', '1', '111300', '114564', '17'), +('12', '90', '2', '62985', '72746', '17'), +('12', '90', '2', '94056', '72666', '17'), +('12', '90', '2', '104424', '63495', '17'), +('12', '90', '2', '54845', '46607', '17'), +('12', '90', '3', '111314', '116229', '17'), +('12', '90', '3', '111316', '114937', '17'), +('12', '90', '3', '111315', '114692', '17'), +('12', '90', '3', '111013', '102179', '17'), +('12', '90', '5', '111319', '115892', '17'), +('12', '90', '5', '111321', '115391', '17'), +('12', '90', '5', '111318', '114128', '17'), +('12', '90', '5', '111018', '101842', '17'), +('12', '90', '8', '111332', '116176', '17'), +('12', '90', '8', '111329', '115654', '17'), +('12', '90', '8', '111331', '113405', '17'), +('12', '90', '8', '111031', '102225', '17'), +('12', '90', '6', '111323', '116116', '17'), +('12', '90', '6', '111325', '115319', '17'), +('12', '90', '6', '111326', '115022', '17'), +('12', '90', '6', '111022', '102066', '17'), +('12', '90', '17', '56043', '77148', '17'), +('12', '90', '17', '56084', '75428', '17'), +('12', '90', '17', '104427', '65849', '17'), +('12', '90', '17', '54854', '49066', '17'), +('12', '90', '7', '56080', '72750', '17'), +('12', '90', '7', '56040', '72263', '17'), +('12', '90', '7', '104425', '63257', '17'), +('12', '90', '7', '49656', '46299', '17'), +('12', '90', '9', '67098', '116910', '17'), +('12', '90', '9', '56070', '70626', '17'), +('12', '90', '9', '62984', '70387', '17'), +('12', '90', '9', '56031', '70339', '17'), +('12', '90', '15', '111349', '117311', '17'), +('12', '90', '15', '111344', '116377', '17'), +('12', '90', '15', '111340', '116031', '17'), +('12', '90', '15', '111346', '115853', '17'), +('12', '90', '20', '111356', '116303', '17'), +('12', '90', '20', '111352', '115384', '17'), +('12', '90', '20', '111351', '114268', '17'), +('12', '90', '20', '111054', '102252', '17'), +('12', '90', '12', '56035', '71716', '17'), +('12', '90', '12', '56074', '70980', '17'), +('12', '90', '12', '104422', '61786', '17'), +('12', '90', '12', '49656', '46299', '17'), +('12', '90', '18', '56041', '75443', '17'), +('12', '90', '18', '62986', '74370', '17'), +('12', '90', '18', '104426', '64121', '17'), +('12', '90', '18', '54851', '46885', '17'), +('12', '90', '19', '62990', '73441', '17'), +('12', '90', '19', '81763', '73350', '17'), +('12', '90', '19', '56037', '72873', '17'), +('12', '90', '19', '56075', '72793', '17'), +('12', '90', '13', '111521', '119248', '17'), +('12', '90', '13', '111524', '113239', '17'), +('12', '90', '13', '111519', '113184', '17'), +('12', '90', '13', '111221', '105972', '17'), +('12', '90', '14', '111537', '116371', '17'), +('12', '90', '14', '111535', '114908', '17'), +('12', '90', '14', '111237', '102319', '17'), +('12', '90', '14', '111235', '100957', '17'), +('12', '90', '11', '111335', '115712', '17'), +('12', '90', '11', '111337', '115474', '17'), +('12', '90', '11', '111338', '113297', '17'), +('12', '90', '11', '111034', '101762', '17'), +('12', '91', '22', '12425', '0', '17'), +('12', '91', '22', '21807', '0', '17'), +('12', '91', '22', '39342', '0', '17'), +('12', '91', '22', '23597', '0', '17'), +('12', '91', '1', '111307', '115922', '17'), +('12', '91', '1', '111306', '115845', '17'), +('12', '91', '1', '111304', '115710', '17'), +('12', '91', '1', '111300', '114568', '17'), +('12', '91', '2', '62985', '72749', '17'), +('12', '91', '2', '94056', '72668', '17'), +('12', '91', '2', '104424', '63500', '17'), +('12', '91', '2', '54845', '46611', '17'), +('12', '91', '3', '111314', '116233', '17'), +('12', '91', '3', '111316', '114940', '17'), +('12', '91', '3', '111315', '114696', '17'), +('12', '91', '3', '111013', '102183', '17'), +('12', '91', '5', '111319', '115897', '17'), +('12', '91', '5', '111321', '115394', '17'), +('12', '91', '5', '111318', '114133', '17'), +('12', '91', '5', '111018', '101846', '17'), +('12', '91', '8', '111332', '116180', '17'), +('12', '91', '8', '111329', '115658', '17'), +('12', '91', '8', '111331', '113408', '17'), +('12', '91', '8', '111031', '102229', '17'), +('12', '91', '6', '111323', '116120', '17'), +('12', '91', '6', '111325', '115322', '17'), +('12', '91', '6', '111326', '115027', '17'), +('12', '91', '6', '111022', '102069', '17'), +('12', '91', '17', '56043', '77151', '17'), +('12', '91', '17', '56084', '75431', '17'), +('12', '91', '17', '104427', '65853', '17'), +('12', '91', '17', '54854', '49069', '17'), +('12', '91', '7', '56080', '72754', '17'), +('12', '91', '7', '56040', '72269', '17'), +('12', '91', '7', '104425', '63260', '17'), +('12', '91', '7', '49656', '46300', '17'), +('12', '91', '9', '67098', '116913', '17'), +('12', '91', '9', '56070', '70629', '17'), +('12', '91', '9', '62984', '70390', '17'), +('12', '91', '9', '56031', '70345', '17'), +('12', '91', '15', '111349', '117316', '17'), +('12', '91', '15', '111344', '116380', '17'), +('12', '91', '15', '111340', '116034', '17'), +('12', '91', '15', '111346', '115856', '17'), +('12', '91', '20', '111356', '116306', '17'), +('12', '91', '20', '111352', '115387', '17'), +('12', '91', '20', '111351', '114272', '17'), +('12', '91', '20', '111054', '102256', '17'), +('12', '91', '12', '56035', '71722', '17'), +('12', '91', '12', '56074', '70984', '17'), +('12', '91', '12', '104422', '61791', '17'), +('12', '91', '12', '49656', '46300', '17'), +('12', '91', '18', '56041', '75448', '17'), +('12', '91', '18', '62986', '74373', '17'), +('12', '91', '18', '104426', '64122', '17'), +('12', '91', '18', '54851', '46887', '17'), +('12', '91', '19', '62990', '73445', '17'), +('12', '91', '19', '81763', '73356', '17'), +('12', '91', '19', '56037', '72875', '17'), +('12', '91', '19', '56075', '72795', '17'), +('12', '91', '13', '111521', '119252', '17'), +('12', '91', '13', '111524', '113243', '17'), +('12', '91', '13', '111519', '113188', '17'), +('12', '91', '13', '111221', '105976', '17'), +('12', '91', '14', '111537', '116374', '17'), +('12', '91', '14', '111535', '114911', '17'), +('12', '91', '14', '111237', '102322', '17'), +('12', '91', '14', '111235', '100959', '17'), +('12', '91', '11', '111335', '115716', '17'), +('12', '91', '11', '111337', '115478', '17'), +('12', '91', '11', '111338', '113301', '17'), +('12', '91', '11', '111034', '101766', '17'), +('12', '92', '22', '12425', '0', '17'), +('12', '92', '22', '21807', '0', '17'), +('12', '92', '22', '39342', '0', '17'), +('12', '92', '22', '23597', '0', '17'), +('12', '92', '1', '111307', '115927', '17'), +('12', '92', '1', '111306', '115848', '17'), +('12', '92', '1', '111304', '115713', '17'), +('12', '92', '1', '111300', '114572', '17'), +('12', '92', '2', '62985', '72751', '17'), +('12', '92', '2', '94056', '72670', '17'), +('12', '92', '2', '104424', '63505', '17'), +('12', '92', '2', '54845', '46614', '17'), +('12', '92', '3', '111314', '116237', '17'), +('12', '92', '3', '111316', '114944', '17'), +('12', '92', '3', '111315', '114700', '17'), +('12', '92', '3', '111013', '102187', '17'), +('12', '92', '5', '111319', '115901', '17'), +('12', '92', '5', '111321', '115397', '17'), +('12', '92', '5', '111318', '114137', '17'), +('12', '92', '5', '111018', '101850', '17'), +('12', '92', '8', '111332', '116184', '17'), +('12', '92', '8', '111329', '115663', '17'), +('12', '92', '8', '111331', '113412', '17'), +('12', '92', '8', '111031', '102233', '17'), +('12', '92', '6', '111323', '116123', '17'), +('12', '92', '6', '111325', '115325', '17'), +('12', '92', '6', '111326', '115031', '17'), +('12', '92', '6', '111022', '102073', '17'), +('12', '92', '17', '56043', '77154', '17'), +('12', '92', '17', '56084', '75435', '17'), +('12', '92', '17', '104427', '65857', '17'), +('12', '92', '17', '54854', '49072', '17'), +('12', '92', '7', '56080', '72758', '17'), +('12', '92', '7', '56040', '72275', '17'), +('12', '92', '7', '104425', '63263', '17'), +('12', '92', '7', '49656', '46300', '17'), +('12', '92', '9', '67098', '116915', '17'), +('12', '92', '9', '56070', '70633', '17'), +('12', '92', '9', '62984', '70393', '17'), +('12', '92', '9', '56031', '70351', '17'), +('12', '92', '15', '111349', '117321', '17'), +('12', '92', '15', '111344', '116383', '17'), +('12', '92', '15', '111340', '116037', '17'), +('12', '92', '15', '111346', '115860', '17'), +('12', '92', '20', '111356', '116310', '17'), +('12', '92', '20', '111352', '115390', '17'), +('12', '92', '20', '111351', '114277', '17'), +('12', '92', '20', '111054', '102260', '17'), +('12', '92', '12', '56035', '71727', '17'), +('12', '92', '12', '56074', '70987', '17'), +('12', '92', '12', '104422', '61796', '17'), +('12', '92', '12', '49656', '46300', '17'), +('12', '92', '18', '56041', '75453', '17'), +('12', '92', '18', '62986', '74376', '17'), +('12', '92', '18', '104426', '64123', '17'), +('12', '92', '18', '54851', '46890', '17'), +('12', '92', '19', '62990', '73450', '17'), +('12', '92', '19', '81763', '73362', '17'), +('12', '92', '19', '56037', '72876', '17'), +('12', '92', '19', '56075', '72798', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '92', '13', '111521', '119255', '17'), +('12', '92', '13', '111524', '113248', '17'), +('12', '92', '13', '111519', '113193', '17'), +('12', '92', '13', '111221', '105980', '17'), +('12', '92', '14', '111537', '116377', '17'), +('12', '92', '14', '111535', '114913', '17'), +('12', '92', '14', '111237', '102326', '17'), +('12', '92', '14', '111235', '100962', '17'), +('12', '92', '11', '111335', '115720', '17'), +('12', '92', '11', '111337', '115482', '17'), +('12', '92', '11', '111338', '113305', '17'), +('12', '92', '11', '111034', '101769', '17'), +('12', '93', '22', '12425', '0', '17'), +('12', '93', '22', '21807', '0', '17'), +('12', '93', '22', '39342', '0', '17'), +('12', '93', '22', '23597', '0', '17'), +('12', '93', '1', '111307', '115932', '17'), +('12', '93', '1', '111306', '115852', '17'), +('12', '93', '1', '111304', '115716', '17'), +('12', '93', '1', '111300', '114576', '17'), +('12', '93', '2', '62985', '72753', '17'), +('12', '93', '2', '94056', '72672', '17'), +('12', '93', '2', '104424', '63510', '17'), +('12', '93', '2', '54845', '46618', '17'), +('12', '93', '3', '111314', '116241', '17'), +('12', '93', '3', '111316', '114948', '17'), +('12', '93', '3', '111315', '114703', '17'), +('12', '93', '3', '111013', '102191', '17'), +('12', '93', '5', '111319', '115905', '17'), +('12', '93', '5', '111321', '115400', '17'), +('12', '93', '5', '111318', '114142', '17'), +('12', '93', '5', '111018', '101855', '17'), +('12', '93', '8', '111332', '116188', '17'), +('12', '93', '8', '111329', '115667', '17'), +('12', '93', '8', '111331', '113415', '17'), +('12', '93', '8', '111031', '102238', '17'), +('12', '93', '6', '111323', '116127', '17'), +('12', '93', '6', '111325', '115327', '17'), +('12', '93', '6', '111326', '115036', '17'), +('12', '93', '6', '111022', '102076', '17'), +('12', '93', '17', '56043', '77158', '17'), +('12', '93', '17', '56084', '75439', '17'), +('12', '93', '17', '104427', '65860', '17'), +('12', '93', '17', '54854', '49075', '17'), +('12', '93', '7', '56080', '72763', '17'), +('12', '93', '7', '56040', '72281', '17'), +('12', '93', '7', '104425', '63267', '17'), +('12', '93', '7', '49656', '46301', '17'), +('12', '93', '9', '67098', '116918', '17'), +('12', '93', '9', '56070', '70636', '17'), +('12', '93', '9', '62984', '70396', '17'), +('12', '93', '9', '56031', '70357', '17'), +('12', '93', '15', '111349', '117326', '17'), +('12', '93', '15', '111344', '116386', '17'), +('12', '93', '15', '111340', '116041', '17'), +('12', '93', '15', '111346', '115863', '17'), +('12', '93', '20', '111356', '116314', '17'), +('12', '93', '20', '111352', '115394', '17'), +('12', '93', '20', '111351', '114281', '17'), +('12', '93', '20', '111054', '102263', '17'), +('12', '93', '12', '56035', '71733', '17'), +('12', '93', '12', '56074', '70991', '17'), +('12', '93', '12', '104422', '61800', '17'), +('12', '93', '12', '49656', '46301', '17'), +('12', '93', '18', '56041', '75459', '17'), +('12', '93', '18', '62986', '74379', '17'), +('12', '93', '18', '104426', '64124', '17'), +('12', '93', '18', '54851', '46892', '17'), +('12', '93', '19', '62990', '73454', '17'), +('12', '93', '19', '81763', '73368', '17'), +('12', '93', '19', '56037', '72878', '17'), +('12', '93', '19', '56075', '72801', '17'), +('12', '93', '13', '111521', '119258', '17'), +('12', '93', '13', '111524', '113252', '17'), +('12', '93', '13', '111519', '113197', '17'), +('12', '93', '13', '111221', '105983', '17'), +('12', '93', '14', '111537', '116380', '17'), +('12', '93', '14', '111535', '114916', '17'), +('12', '93', '14', '111237', '102329', '17'), +('12', '93', '14', '111235', '100964', '17'), +('12', '93', '11', '111335', '115723', '17'), +('12', '93', '11', '111337', '115485', '17'), +('12', '93', '11', '111338', '113308', '17'), +('12', '93', '11', '111034', '101773', '17'), +('12', '94', '22', '12425', '0', '17'), +('12', '94', '22', '21807', '0', '17'), +('12', '94', '22', '39342', '0', '17'), +('12', '94', '22', '23597', '0', '17'), +('12', '94', '1', '111307', '115937', '17'), +('12', '94', '1', '111306', '115855', '17'), +('12', '94', '1', '111304', '115719', '17'), +('12', '94', '1', '111300', '114580', '17'), +('12', '94', '2', '62985', '72756', '17'), +('12', '94', '2', '94056', '72674', '17'), +('12', '94', '2', '104424', '63515', '17'), +('12', '94', '2', '54845', '46621', '17'), +('12', '94', '3', '111314', '116245', '17'), +('12', '94', '3', '111316', '114951', '17'), +('12', '94', '3', '111315', '114707', '17'), +('12', '94', '3', '111013', '102195', '17'), +('12', '94', '5', '111319', '115910', '17'), +('12', '94', '5', '111321', '115403', '17'), +('12', '94', '5', '111318', '114147', '17'), +('12', '94', '5', '111018', '101859', '17'), +('12', '94', '8', '111332', '116192', '17'), +('12', '94', '8', '111329', '115672', '17'), +('12', '94', '8', '111331', '113418', '17'), +('12', '94', '8', '111031', '102242', '17'), +('12', '94', '6', '111323', '116130', '17'), +('12', '94', '6', '111325', '115330', '17'), +('12', '94', '6', '111326', '115041', '17'), +('12', '94', '6', '111022', '102080', '17'), +('12', '94', '17', '56043', '77161', '17'), +('12', '94', '17', '56084', '75443', '17'), +('12', '94', '17', '104427', '65864', '17'), +('12', '94', '17', '54854', '49078', '17'), +('12', '94', '7', '56080', '72767', '17'), +('12', '94', '7', '56040', '72287', '17'), +('12', '94', '7', '104425', '63270', '17'), +('12', '94', '7', '49656', '46301', '17'), +('12', '94', '9', '67098', '116920', '17'), +('12', '94', '9', '56070', '70639', '17'), +('12', '94', '9', '62984', '70399', '17'), +('12', '94', '9', '56031', '70363', '17'), +('12', '94', '15', '111349', '117331', '17'), +('12', '94', '15', '111344', '116389', '17'), +('12', '94', '15', '111340', '116044', '17'), +('12', '94', '15', '111346', '115867', '17'), +('12', '94', '20', '111356', '116318', '17'), +('12', '94', '20', '111352', '115397', '17'), +('12', '94', '20', '111351', '114286', '17'), +('12', '94', '20', '111054', '102267', '17'), +('12', '94', '12', '56035', '71739', '17'), +('12', '94', '12', '56074', '70995', '17'), +('12', '94', '12', '104422', '61805', '17'), +('12', '94', '12', '49656', '46301', '17'), +('12', '94', '18', '56041', '75464', '17'), +('12', '94', '18', '62986', '74382', '17'), +('12', '94', '18', '104426', '64126', '17'), +('12', '94', '18', '54851', '46895', '17'), +('12', '94', '19', '62990', '73459', '17'), +('12', '94', '19', '81763', '73374', '17'), +('12', '94', '19', '56037', '72879', '17'), +('12', '94', '19', '56075', '72804', '17'), +('12', '94', '13', '111521', '119262', '17'), +('12', '94', '13', '111524', '113256', '17'), +('12', '94', '13', '111519', '113202', '17'), +('12', '94', '13', '111221', '105987', '17'), +('12', '94', '14', '111537', '116383', '17'), +('12', '94', '14', '111535', '114918', '17'), +('12', '94', '14', '111237', '102332', '17'), +('12', '94', '14', '111235', '100967', '17'), +('12', '94', '11', '111335', '115727', '17'), +('12', '94', '11', '111337', '115489', '17'), +('12', '94', '11', '111338', '113312', '17'), +('12', '94', '11', '111034', '101776', '17'), +('12', '95', '22', '12425', '0', '18'), +('12', '95', '22', '21807', '0', '18'), +('12', '95', '22', '39342', '0', '18'), +('12', '95', '22', '23597', '0', '18'), +('12', '95', '1', '111307', '115942', '18'), +('12', '95', '1', '111306', '115858', '18'), +('12', '95', '1', '111304', '115722', '18'), +('12', '95', '1', '111300', '114584', '18'), +('12', '95', '2', '62985', '72758', '18'), +('12', '95', '2', '94056', '72676', '18'), +('12', '95', '2', '104424', '63520', '18'), +('12', '95', '2', '54845', '46625', '18'), +('12', '95', '3', '111314', '116249', '18'), +('12', '95', '3', '111316', '114955', '18'), +('12', '95', '3', '111315', '114711', '18'), +('12', '95', '3', '111013', '102199', '18'), +('12', '95', '5', '111319', '115914', '18'), +('12', '95', '5', '111321', '115407', '18'), +('12', '95', '5', '111318', '114151', '18'), +('12', '95', '5', '111018', '101863', '18'), +('12', '95', '8', '111332', '116196', '18'), +('12', '95', '8', '111329', '115676', '18'), +('12', '95', '8', '111331', '113421', '18'), +('12', '95', '8', '111031', '102246', '18'), +('12', '95', '6', '111323', '116134', '18'), +('12', '95', '6', '111325', '115333', '18'), +('12', '95', '6', '111326', '115045', '18'), +('12', '95', '6', '111022', '102083', '18'), +('12', '95', '17', '56043', '77165', '18'), +('12', '95', '17', '56084', '75446', '18'), +('12', '95', '17', '104427', '65868', '18'), +('12', '95', '17', '54854', '49081', '18'), +('12', '95', '7', '56080', '72771', '18'), +('12', '95', '7', '56040', '72294', '18'), +('12', '95', '7', '104425', '63273', '18'), +('12', '95', '7', '49656', '46302', '18'), +('12', '95', '9', '67098', '116923', '18'), +('12', '95', '9', '56070', '70642', '18'), +('12', '95', '9', '62984', '70402', '18'), +('12', '95', '9', '56031', '70369', '18'), +('12', '95', '15', '111349', '117336', '18'), +('12', '95', '15', '111344', '116392', '18'), +('12', '95', '15', '111340', '116047', '18'), +('12', '95', '15', '111346', '115871', '18'), +('12', '95', '20', '128733', '147344', '18'), +('12', '95', '20', '111356', '116322', '18'), +('12', '95', '20', '111352', '115400', '18'), +('12', '95', '20', '111351', '114290', '18'), +('12', '95', '12', '56035', '71744', '18'), +('12', '95', '12', '56074', '70998', '18'), +('12', '95', '12', '104422', '61810', '18'), +('12', '95', '12', '49656', '46302', '18'), +('12', '95', '18', '56041', '75469', '18'), +('12', '95', '18', '62986', '74385', '18'), +('12', '95', '18', '104426', '64127', '18'), +('12', '95', '18', '54851', '46897', '18'), +('12', '95', '19', '62990', '73463', '18'), +('12', '95', '19', '81763', '73380', '18'), +('12', '95', '19', '56037', '72881', '18'), +('12', '95', '19', '56075', '72807', '18'), +('12', '95', '13', '111521', '119265', '18'), +('12', '95', '13', '111524', '113260', '18'), +('12', '95', '13', '111519', '113206', '18'), +('12', '95', '13', '111221', '105991', '18'), +('12', '95', '14', '111537', '116386', '18'), +('12', '95', '14', '111535', '114921', '18'), +('12', '95', '14', '111237', '102335', '18'), +('12', '95', '14', '111235', '100969', '18'), +('12', '95', '11', '111335', '115730', '18'), +('12', '95', '11', '111337', '115493', '18'), +('12', '95', '11', '111338', '113316', '18'), +('12', '95', '11', '111034', '101780', '18'), +('12', '96', '22', '12425', '0', '18'), +('12', '96', '22', '21807', '0', '18'), +('12', '96', '22', '39342', '0', '18'), +('12', '96', '22', '23597', '0', '18'), +('12', '96', '1', '111307', '115947', '18'), +('12', '96', '1', '111306', '115862', '18'), +('12', '96', '1', '111304', '115725', '18'), +('12', '96', '1', '111300', '114588', '18'), +('12', '96', '2', '62985', '72760', '18'), +('12', '96', '2', '94056', '72678', '18'), +('12', '96', '2', '104424', '63524', '18'), +('12', '96', '2', '54845', '46629', '18'), +('12', '96', '3', '111314', '116253', '18'), +('12', '96', '3', '111316', '114959', '18'), +('12', '96', '3', '111315', '114715', '18'), +('12', '96', '3', '111013', '102202', '18'), +('12', '96', '5', '111319', '115918', '18'), +('12', '96', '5', '111321', '115410', '18'), +('12', '96', '5', '111318', '114156', '18'), +('12', '96', '5', '111018', '101868', '18'), +('12', '96', '8', '111332', '116200', '18'), +('12', '96', '8', '111329', '115681', '18'), +('12', '96', '8', '111331', '113425', '18'), +('12', '96', '8', '111031', '102250', '18'), +('12', '96', '6', '111323', '116137', '18'), +('12', '96', '6', '111325', '115336', '18'), +('12', '96', '6', '111326', '115050', '18'), +('12', '96', '6', '111022', '102087', '18'), +('12', '96', '17', '56043', '77168', '18'), +('12', '96', '17', '56084', '75450', '18'), +('12', '96', '17', '104427', '65872', '18'), +('12', '96', '17', '54854', '49084', '18'), +('12', '96', '7', '56080', '72776', '18'), +('12', '96', '7', '56040', '72300', '18'), +('12', '96', '7', '104425', '63277', '18'), +('12', '96', '7', '49656', '46302', '18'), +('12', '96', '9', '67098', '116926', '18'), +('12', '96', '9', '56070', '70645', '18'), +('12', '96', '9', '62984', '70405', '18'), +('12', '96', '9', '56031', '70375', '18'), +('12', '96', '15', '111349', '117341', '18'), +('12', '96', '15', '111344', '116395', '18'), +('12', '96', '15', '111340', '116051', '18'), +('12', '96', '15', '111346', '115874', '18'), +('12', '96', '20', '128733', '147347', '18'), +('12', '96', '20', '111356', '116325', '18'), +('12', '96', '20', '111352', '115403', '18'), +('12', '96', '20', '111351', '114295', '18'), +('12', '96', '12', '56035', '71750', '18'), +('12', '96', '12', '56074', '71002', '18'), +('12', '96', '12', '104422', '61815', '18'), +('12', '96', '12', '49656', '46302', '18'), +('12', '96', '18', '56041', '75474', '18'), +('12', '96', '18', '62986', '74388', '18'), +('12', '96', '18', '104426', '64128', '18'), +('12', '96', '18', '54851', '46900', '18'), +('12', '96', '19', '62990', '73468', '18'), +('12', '96', '19', '81763', '73386', '18'), +('12', '96', '19', '56037', '72882', '18'), +('12', '96', '19', '56075', '72810', '18'), +('12', '96', '13', '111521', '119268', '18'), +('12', '96', '13', '111524', '113264', '18'), +('12', '96', '13', '111519', '113211', '18'), +('12', '96', '13', '111221', '105994', '18'), +('12', '96', '14', '111537', '116390', '18'), +('12', '96', '14', '111535', '114923', '18'), +('12', '96', '14', '111237', '102338', '18'), +('12', '96', '14', '111235', '100972', '18'), +('12', '96', '11', '111335', '115734', '18'), +('12', '96', '11', '111337', '115496', '18'), +('12', '96', '11', '111338', '113320', '18'), +('12', '96', '11', '111034', '101783', '18'), +('12', '97', '22', '12425', '0', '18'), +('12', '97', '22', '21807', '0', '18'), +('12', '97', '22', '39342', '0', '18'), +('12', '97', '22', '23597', '0', '18'), +('12', '97', '1', '111307', '115952', '18'), +('12', '97', '1', '111306', '115865', '18'), +('12', '97', '1', '111304', '115728', '18'), +('12', '97', '1', '111300', '114592', '18'), +('12', '97', '2', '62985', '72763', '18'), +('12', '97', '2', '94056', '72680', '18'), +('12', '97', '2', '104424', '63529', '18'), +('12', '97', '2', '54845', '46632', '18'), +('12', '97', '3', '111314', '116257', '18'), +('12', '97', '3', '111316', '114963', '18'), +('12', '97', '3', '111315', '114718', '18'), +('12', '97', '3', '111013', '102206', '18'), +('12', '97', '5', '111319', '115923', '18'), +('12', '97', '5', '111321', '115413', '18'), +('12', '97', '5', '111318', '114160', '18'), +('12', '97', '5', '111018', '101872', '18'), +('12', '97', '8', '111332', '116204', '18'), +('12', '97', '8', '111329', '115686', '18'), +('12', '97', '8', '111331', '113428', '18'), +('12', '97', '8', '111031', '102254', '18'), +('12', '97', '6', '111323', '116141', '18'), +('12', '97', '6', '111325', '115339', '18'), +('12', '97', '6', '111326', '115055', '18'), +('12', '97', '6', '111022', '102090', '18'), +('12', '97', '17', '56043', '77171', '18'), +('12', '97', '17', '56084', '75454', '18'), +('12', '97', '17', '104427', '65875', '18'), +('12', '97', '17', '54854', '49086', '18'), +('12', '97', '7', '56080', '72780', '18'), +('12', '97', '7', '56040', '72306', '18'), +('12', '97', '7', '104425', '63280', '18'), +('12', '97', '7', '49656', '46303', '18'), +('12', '97', '9', '67098', '116928', '18'), +('12', '97', '9', '56070', '70648', '18'), +('12', '97', '9', '62984', '70408', '18'), +('12', '97', '9', '56031', '70381', '18'), +('12', '97', '15', '111349', '117346', '18'), +('12', '97', '15', '111344', '116398', '18'), +('12', '97', '15', '111340', '116054', '18'), +('12', '97', '15', '111346', '115878', '18'), +('12', '97', '20', '128733', '147351', '18'), +('12', '97', '20', '111356', '116329', '18'), +('12', '97', '20', '111352', '115407', '18'), +('12', '97', '20', '111351', '114299', '18'), +('12', '97', '12', '56035', '71756', '18'), +('12', '97', '12', '56074', '71006', '18'), +('12', '97', '12', '104422', '61819', '18'), +('12', '97', '12', '49656', '46303', '18'), +('12', '97', '18', '56041', '75479', '18'), +('12', '97', '18', '62986', '74391', '18'), +('12', '97', '18', '104426', '64129', '18'), +('12', '97', '18', '54851', '46902', '18'), +('12', '97', '19', '62990', '73472', '18'), +('12', '97', '19', '81763', '73392', '18'), +('12', '97', '19', '56037', '72884', '18'), +('12', '97', '19', '56075', '72813', '18'), +('12', '97', '13', '111521', '119272', '18'), +('12', '97', '13', '111524', '113268', '18'), +('12', '97', '13', '111519', '113215', '18'), +('12', '97', '13', '111221', '105998', '18'), +('12', '97', '14', '111537', '116393', '18'), +('12', '97', '14', '111535', '114925', '18'), +('12', '97', '14', '111237', '102341', '18'), +('12', '97', '14', '111235', '100974', '18'), +('12', '97', '11', '111335', '115738', '18'), +('12', '97', '11', '111337', '115500', '18'), +('12', '97', '11', '111338', '113323', '18'), +('12', '97', '11', '111034', '101787', '18'), +('12', '98', '22', '12425', '0', '18'), +('12', '98', '22', '21807', '0', '18'), +('12', '98', '22', '39342', '0', '18'), +('12', '98', '22', '23597', '0', '18'), +('12', '98', '1', '111307', '115957', '18'), +('12', '98', '1', '111306', '115869', '18'), +('12', '98', '1', '111304', '115731', '18'), +('12', '98', '1', '111300', '114596', '18'), +('12', '98', '2', '62985', '72765', '18'), +('12', '98', '2', '94056', '72682', '18'), +('12', '98', '2', '104424', '63534', '18'), +('12', '98', '2', '54845', '46636', '18'), +('12', '98', '3', '111314', '116261', '18'), +('12', '98', '3', '111316', '114966', '18'), +('12', '98', '3', '111315', '114722', '18'), +('12', '98', '3', '111013', '102210', '18'), +('12', '98', '5', '111319', '115927', '18'), +('12', '98', '5', '111321', '115416', '18'), +('12', '98', '5', '111318', '114165', '18'), +('12', '98', '5', '111018', '101877', '18'), +('12', '98', '8', '111332', '116208', '18'), +('12', '98', '8', '111329', '115690', '18'), +('12', '98', '8', '111331', '113431', '18'), +('12', '98', '8', '111031', '102258', '18'), +('12', '98', '6', '111323', '116144', '18'), +('12', '98', '6', '111325', '115342', '18'), +('12', '98', '6', '111326', '115059', '18'), +('12', '98', '6', '111022', '102094', '18'), +('12', '98', '17', '56043', '77175', '18'), +('12', '98', '17', '56084', '75458', '18'), +('12', '98', '17', '104427', '65879', '18'), +('12', '98', '17', '54854', '49089', '18'), +('12', '98', '7', '56080', '72784', '18'), +('12', '98', '7', '56040', '72312', '18'), +('12', '98', '7', '104425', '63283', '18'), +('12', '98', '7', '49656', '46303', '18'), +('12', '98', '9', '67098', '116931', '18'), +('12', '98', '9', '56070', '70652', '18'), +('12', '98', '9', '62984', '70411', '18'), +('12', '98', '9', '56031', '70387', '18'), +('12', '98', '15', '111349', '117351', '18'), +('12', '98', '15', '111344', '116400', '18'), +('12', '98', '15', '111340', '116057', '18'), +('12', '98', '15', '111346', '115881', '18'), +('12', '98', '20', '128733', '147354', '18'), +('12', '98', '20', '111356', '116333', '18'), +('12', '98', '20', '111352', '115410', '18'), +('12', '98', '20', '111351', '114304', '18'), +('12', '98', '12', '56035', '71762', '18'), +('12', '98', '12', '56074', '71009', '18'), +('12', '98', '12', '104422', '61824', '18'), +('12', '98', '12', '49656', '46303', '18'), +('12', '98', '18', '56041', '75484', '18'), +('12', '98', '18', '62986', '74394', '18'), +('12', '98', '18', '104426', '64130', '18'), +('12', '98', '18', '54851', '46905', '18'), +('12', '98', '19', '62990', '73477', '18'), +('12', '98', '19', '81763', '73398', '18'), +('12', '98', '19', '56037', '72885', '18'), +('12', '98', '19', '56075', '72816', '18'), +('12', '98', '13', '111521', '119275', '18'), +('12', '98', '13', '111524', '113272', '18'), +('12', '98', '13', '111519', '113220', '18'), +('12', '98', '13', '111221', '106002', '18'), +('12', '98', '14', '111537', '116396', '18'), +('12', '98', '14', '111535', '114928', '18'), +('12', '98', '14', '111237', '102344', '18'), +('12', '98', '14', '111235', '100976', '18'), +('12', '98', '11', '111335', '115741', '18'), +('12', '98', '11', '111337', '115504', '18'), +('12', '98', '11', '111338', '113327', '18'), +('12', '98', '11', '111034', '101791', '18'), +('12', '99', '22', '12425', '0', '18'), +('12', '99', '22', '21807', '0', '18'), +('12', '99', '22', '39342', '0', '18'), +('12', '99', '22', '23597', '0', '18'), +('12', '99', '1', '111307', '115962', '18'), +('12', '99', '1', '111306', '115872', '18'), +('12', '99', '1', '111304', '115734', '18'), +('12', '99', '1', '111300', '114601', '18'), +('12', '99', '2', '62985', '72768', '18'), +('12', '99', '2', '94056', '72684', '18'), +('12', '99', '2', '104424', '63539', '18'), +('12', '99', '2', '54845', '46639', '18'), +('12', '99', '3', '111314', '116265', '18'), +('12', '99', '3', '111316', '114970', '18'), +('12', '99', '3', '111315', '114726', '18'), +('12', '99', '3', '111013', '102214', '18'), +('12', '99', '5', '111319', '115931', '18'), +('12', '99', '5', '111321', '115419', '18'), +('12', '99', '5', '111318', '114169', '18'), +('12', '99', '5', '111018', '101881', '18'), +('12', '99', '8', '111332', '116212', '18'), +('12', '99', '8', '111329', '115695', '18'), +('12', '99', '8', '111331', '113434', '18'), +('12', '99', '8', '111031', '102262', '18'), +('12', '99', '6', '111323', '116148', '18'), +('12', '99', '6', '111325', '115345', '18'), +('12', '99', '6', '111326', '115064', '18'), +('12', '99', '6', '111022', '102097', '18'), +('12', '99', '17', '56043', '77178', '18'), +('12', '99', '17', '56084', '75461', '18'), +('12', '99', '17', '104427', '65883', '18'), +('12', '99', '17', '54854', '49092', '18'), +('12', '99', '7', '56080', '72789', '18'), +('12', '99', '7', '56040', '72318', '18'), +('12', '99', '7', '104425', '63287', '18'), +('12', '99', '7', '49656', '46304', '18'), +('12', '99', '9', '67098', '116934', '18'), +('12', '99', '9', '56070', '70655', '18'), +('12', '99', '9', '62984', '70413', '18'), +('12', '99', '9', '56031', '70393', '18'), +('12', '99', '15', '111349', '117356', '18'), +('12', '99', '15', '111344', '116403', '18'), +('12', '99', '15', '111340', '116061', '18'), +('12', '99', '15', '111346', '115885', '18'), +('12', '99', '20', '128733', '147358', '18'), +('12', '99', '20', '111356', '116337', '18'), +('12', '99', '20', '111352', '115413', '18'), +('12', '99', '20', '111351', '114308', '18'), +('12', '99', '12', '56035', '71767', '18'), +('12', '99', '12', '56074', '71013', '18'), +('12', '99', '12', '104422', '61829', '18'), +('12', '99', '12', '49656', '46304', '18'), +('12', '99', '18', '56041', '75489', '18'), +('12', '99', '18', '62986', '74397', '18'), +('12', '99', '18', '104426', '64132', '18'), +('12', '99', '18', '54851', '46907', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '99', '19', '62990', '73482', '18'), +('12', '99', '19', '81763', '73404', '18'), +('12', '99', '19', '56037', '72887', '18'), +('12', '99', '19', '56075', '72819', '18'), +('12', '99', '13', '111521', '119278', '18'), +('12', '99', '13', '111524', '113276', '18'), +('12', '99', '13', '111519', '113224', '18'), +('12', '99', '13', '111221', '106005', '18'), +('12', '99', '14', '111537', '116399', '18'), +('12', '99', '14', '111535', '114930', '18'), +('12', '99', '14', '111237', '102347', '18'), +('12', '99', '14', '111235', '100979', '18'), +('12', '99', '11', '111335', '115745', '18'), +('12', '99', '11', '111337', '115507', '18'), +('12', '99', '11', '111338', '113331', '18'), +('12', '99', '11', '111034', '101794', '18'), +('12', '100', '22', '12425', '0', '20'), +('12', '100', '22', '21807', '0', '20'), +('12', '100', '22', '39342', '0', '20'), +('12', '100', '22', '23597', '0', '20'), +('12', '100', '1', '98769', '184284', '20'), +('12', '100', '1', '111307', '115967', '20'), +('12', '100', '1', '111306', '115875', '20'), +('12', '100', '1', '111304', '115737', '20'), +('12', '100', '2', '62985', '72770', '20'), +('12', '100', '2', '94056', '72686', '20'), +('12', '100', '2', '104424', '63544', '20'), +('12', '100', '2', '54845', '46643', '20'), +('12', '100', '3', '111314', '116269', '20'), +('12', '100', '3', '111316', '114974', '20'), +('12', '100', '3', '111315', '114730', '20'), +('12', '100', '3', '111013', '102218', '20'), +('12', '100', '5', '111319', '115936', '20'), +('12', '100', '5', '111321', '115422', '20'), +('12', '100', '5', '111318', '114174', '20'), +('12', '100', '5', '111018', '101885', '20'), +('12', '100', '8', '111332', '116216', '20'), +('12', '100', '8', '111329', '115699', '20'), +('12', '100', '8', '111331', '113438', '20'), +('12', '100', '8', '111031', '102266', '20'), +('12', '100', '6', '111323', '116151', '20'), +('12', '100', '6', '111325', '115347', '20'), +('12', '100', '6', '111326', '115069', '20'), +('12', '100', '6', '111022', '102101', '20'), +('12', '100', '17', '56043', '77182', '20'), +('12', '100', '17', '56084', '75465', '20'), +('12', '100', '17', '104427', '65887', '20'), +('12', '100', '17', '54854', '49095', '20'), +('12', '100', '7', '56080', '72793', '20'), +('12', '100', '7', '56040', '72324', '20'), +('12', '100', '7', '104425', '63290', '20'), +('12', '100', '7', '49656', '46304', '20'), +('12', '100', '9', '67098', '116936', '20'), +('12', '100', '9', '56070', '70658', '20'), +('12', '100', '9', '62984', '70416', '20'), +('12', '100', '9', '56031', '70399', '20'), +('12', '100', '15', '111349', '117361', '20'), +('12', '100', '15', '111344', '116406', '20'), +('12', '100', '15', '111340', '116064', '20'), +('12', '100', '15', '111346', '115889', '20'), +('12', '100', '20', '128733', '147362', '20'), +('12', '100', '20', '111356', '116341', '20'), +('12', '100', '20', '111352', '115416', '20'), +('12', '100', '20', '111351', '114313', '20'), +('12', '100', '12', '56035', '71773', '20'), +('12', '100', '12', '56074', '71017', '20'), +('12', '100', '12', '104422', '61834', '20'), +('12', '100', '12', '49656', '46304', '20'), +('12', '100', '18', '56041', '75494', '20'), +('12', '100', '18', '62986', '74400', '20'), +('12', '100', '18', '104426', '64133', '20'), +('12', '100', '18', '54851', '46910', '20'), +('12', '100', '19', '62990', '73486', '20'), +('12', '100', '19', '81763', '73410', '20'), +('12', '100', '19', '56037', '72889', '20'), +('12', '100', '19', '56075', '72821', '20'), +('12', '100', '13', '111521', '119282', '20'), +('12', '100', '13', '111524', '113281', '20'), +('12', '100', '13', '111519', '113229', '20'), +('12', '100', '13', '111221', '106009', '20'), +('12', '100', '14', '111537', '116402', '20'), +('12', '100', '14', '111535', '114933', '20'), +('12', '100', '14', '111237', '102351', '20'), +('12', '100', '14', '111235', '100981', '20'), +('12', '100', '11', '133816', '148871', '20'), +('12', '100', '11', '111335', '115748', '20'), +('12', '100', '11', '111337', '115511', '20'), +('12', '100', '11', '111338', '113335', '20'), +('12', '100', '22', '12425', '0', '19'), +('12', '100', '22', '21807', '0', '19'), +('12', '100', '22', '39342', '0', '19'), +('12', '100', '22', '23597', '0', '19'), +('12', '100', '1', '98769', '184284', '19'), +('12', '100', '1', '111307', '115967', '19'), +('12', '100', '1', '111306', '115875', '19'), +('12', '100', '1', '111304', '115737', '19'), +('12', '100', '2', '62985', '72770', '19'), +('12', '100', '2', '94056', '72686', '19'), +('12', '100', '2', '104424', '63544', '19'), +('12', '100', '2', '54845', '46643', '19'), +('12', '100', '3', '111314', '116269', '19'), +('12', '100', '3', '111316', '114974', '19'), +('12', '100', '3', '111315', '114730', '19'), +('12', '100', '3', '111013', '102218', '19'), +('12', '100', '5', '111319', '115936', '19'), +('12', '100', '5', '111321', '115422', '19'), +('12', '100', '5', '111318', '114174', '19'), +('12', '100', '5', '111018', '101885', '19'), +('12', '100', '8', '111332', '116216', '19'), +('12', '100', '8', '111329', '115699', '19'), +('12', '100', '8', '111331', '113438', '19'), +('12', '100', '8', '111031', '102266', '19'), +('12', '100', '6', '111323', '116151', '19'), +('12', '100', '6', '111325', '115347', '19'), +('12', '100', '6', '111326', '115069', '19'), +('12', '100', '6', '111022', '102101', '19'), +('12', '100', '17', '56043', '77182', '19'), +('12', '100', '17', '56084', '75465', '19'), +('12', '100', '17', '104427', '65887', '19'), +('12', '100', '17', '54854', '49095', '19'), +('12', '100', '7', '56080', '72793', '19'), +('12', '100', '7', '56040', '72324', '19'), +('12', '100', '7', '104425', '63290', '19'), +('12', '100', '7', '49656', '46304', '19'), +('12', '100', '9', '67098', '116936', '19'), +('12', '100', '9', '56070', '70658', '19'), +('12', '100', '9', '62984', '70416', '19'), +('12', '100', '9', '56031', '70399', '19'), +('12', '100', '15', '111349', '117361', '19'), +('12', '100', '15', '111344', '116406', '19'), +('12', '100', '15', '111340', '116064', '19'), +('12', '100', '15', '111346', '115889', '19'), +('12', '100', '20', '128733', '147362', '19'), +('12', '100', '20', '111356', '116341', '19'), +('12', '100', '20', '111352', '115416', '19'), +('12', '100', '20', '111351', '114313', '19'), +('12', '100', '12', '56035', '71773', '19'), +('12', '100', '12', '56074', '71017', '19'), +('12', '100', '12', '104422', '61834', '19'), +('12', '100', '12', '49656', '46304', '19'), +('12', '100', '18', '56041', '75494', '19'), +('12', '100', '18', '62986', '74400', '19'), +('12', '100', '18', '104426', '64133', '19'), +('12', '100', '18', '54851', '46910', '19'), +('12', '100', '19', '62990', '73486', '19'), +('12', '100', '19', '81763', '73410', '19'), +('12', '100', '19', '56037', '72889', '19'), +('12', '100', '19', '56075', '72821', '19'), +('12', '100', '13', '111521', '119281', '19'), +('12', '100', '13', '111524', '113280', '19'), +('12', '100', '13', '111519', '113229', '19'), +('12', '100', '13', '111221', '106009', '19'), +('12', '100', '14', '111537', '116402', '19'), +('12', '100', '14', '111535', '114933', '19'), +('12', '100', '14', '111237', '102351', '19'), +('12', '100', '14', '111235', '100981', '19'), +('12', '100', '11', '133816', '148871', '19'), +('12', '100', '11', '111335', '115748', '19'), +('12', '100', '11', '111337', '115511', '19'), +('12', '100', '11', '111338', '113335', '19'), +('12', '101', '22', '12425', '0', '20'), +('12', '101', '22', '21807', '0', '20'), +('12', '101', '22', '39342', '0', '20'), +('12', '101', '22', '23597', '0', '20'), +('12', '101', '1', '98769', '184286', '20'), +('12', '101', '1', '111307', '115972', '20'), +('12', '101', '1', '111306', '115879', '20'), +('12', '101', '1', '111304', '115740', '20'), +('12', '101', '2', '62985', '72772', '20'), +('12', '101', '2', '94056', '72688', '20'), +('12', '101', '2', '104424', '63549', '20'), +('12', '101', '2', '54845', '46646', '20'), +('12', '101', '3', '111314', '116273', '20'), +('12', '101', '3', '111316', '114977', '20'), +('12', '101', '3', '111315', '114734', '20'), +('12', '101', '3', '111013', '102222', '20'), +('12', '101', '5', '111319', '115940', '20'), +('12', '101', '5', '111321', '115425', '20'), +('12', '101', '5', '111318', '114178', '20'), +('12', '101', '5', '111018', '101890', '20'), +('12', '101', '8', '111332', '116221', '20'), +('12', '101', '8', '111329', '115704', '20'), +('12', '101', '8', '111331', '113441', '20'), +('12', '101', '8', '111031', '102270', '20'), +('12', '101', '6', '111323', '116155', '20'), +('12', '101', '6', '111325', '115350', '20'), +('12', '101', '6', '111326', '115073', '20'), +('12', '101', '6', '111022', '102104', '20'), +('12', '101', '17', '56043', '77185', '20'), +('12', '101', '17', '56084', '75469', '20'), +('12', '101', '17', '104427', '65890', '20'), +('12', '101', '17', '54854', '49098', '20'), +('12', '101', '7', '56080', '72797', '20'), +('12', '101', '7', '56040', '72330', '20'), +('12', '101', '7', '104425', '63293', '20'), +('12', '101', '7', '49656', '46305', '20'), +('12', '101', '9', '67098', '116939', '20'), +('12', '101', '9', '56070', '70661', '20'), +('12', '101', '9', '62984', '70419', '20'), +('12', '101', '9', '56031', '70405', '20'), +('12', '101', '15', '111349', '117365', '20'), +('12', '101', '15', '111344', '116409', '20'), +('12', '101', '15', '111340', '116068', '20'), +('12', '101', '15', '111346', '115892', '20'), +('12', '101', '20', '128733', '147365', '20'), +('12', '101', '20', '111356', '116344', '20'), +('12', '101', '20', '111352', '115420', '20'), +('12', '101', '20', '111351', '114317', '20'), +('12', '101', '12', '56035', '71779', '20'), +('12', '101', '12', '56074', '71020', '20'), +('12', '101', '12', '104422', '61838', '20'), +('12', '101', '12', '49656', '46305', '20'), +('12', '101', '18', '56041', '75499', '20'), +('12', '101', '18', '62986', '74403', '20'), +('12', '101', '18', '104426', '64134', '20'), +('12', '101', '18', '54851', '46912', '20'), +('12', '101', '19', '62990', '73491', '20'), +('12', '101', '19', '81763', '73416', '20'), +('12', '101', '19', '56037', '72890', '20'), +('12', '101', '19', '56075', '72824', '20'), +('12', '101', '13', '111521', '119285', '20'), +('12', '101', '13', '111524', '113285', '20'), +('12', '101', '13', '111519', '113234', '20'), +('12', '101', '13', '111221', '106013', '20'), +('12', '101', '14', '111537', '116405', '20'), +('12', '101', '14', '111535', '114935', '20'), +('12', '101', '14', '111237', '102354', '20'), +('12', '101', '14', '111235', '100984', '20'), +('12', '101', '11', '133816', '148873', '20'), +('12', '101', '11', '111335', '115752', '20'), +('12', '101', '11', '111337', '115515', '20'), +('12', '101', '11', '111338', '113338', '20'), +('12', '102', '22', '12425', '0', '20'), +('12', '102', '22', '21807', '0', '20'), +('12', '102', '22', '39342', '0', '20'), +('12', '102', '22', '23597', '0', '20'), +('12', '102', '1', '98769', '184289', '20'), +('12', '102', '1', '111307', '115977', '20'), +('12', '102', '1', '111306', '115882', '20'), +('12', '102', '1', '111304', '115743', '20'), +('12', '102', '2', '62985', '72775', '20'), +('12', '102', '2', '94056', '72690', '20'), +('12', '102', '2', '104424', '63554', '20'), +('12', '102', '2', '54845', '46650', '20'), +('12', '102', '3', '111314', '116277', '20'), +('12', '102', '3', '111316', '114981', '20'), +('12', '102', '3', '111315', '114737', '20'), +('12', '102', '3', '111013', '102226', '20'), +('12', '102', '5', '111319', '115944', '20'), +('12', '102', '5', '111321', '115428', '20'), +('12', '102', '5', '111318', '114183', '20'), +('12', '102', '5', '111018', '101894', '20'), +('12', '102', '8', '111332', '116225', '20'), +('12', '102', '8', '111329', '115709', '20'), +('12', '102', '8', '111331', '113444', '20'), +('12', '102', '8', '111031', '102274', '20'), +('12', '102', '6', '111323', '116158', '20'), +('12', '102', '6', '111325', '115353', '20'), +('12', '102', '6', '111326', '115078', '20'), +('12', '102', '6', '111022', '102108', '20'), +('12', '102', '17', '56043', '77188', '20'), +('12', '102', '17', '56084', '75473', '20'), +('12', '102', '17', '104427', '65894', '20'), +('12', '102', '17', '54854', '49101', '20'), +('12', '102', '7', '56080', '72802', '20'), +('12', '102', '7', '56040', '72336', '20'), +('12', '102', '7', '104425', '63297', '20'), +('12', '102', '7', '49656', '46305', '20'), +('12', '102', '9', '67098', '116942', '20'), +('12', '102', '9', '56070', '70664', '20'), +('12', '102', '9', '62984', '70422', '20'), +('12', '102', '9', '56031', '70412', '20'), +('12', '102', '15', '111349', '117370', '20'), +('12', '102', '15', '111344', '116412', '20'), +('12', '102', '15', '111340', '116071', '20'), +('12', '102', '15', '111346', '115896', '20'), +('12', '102', '20', '128733', '147369', '20'), +('12', '102', '20', '111356', '116348', '20'), +('12', '102', '20', '111352', '115423', '20'), +('12', '102', '20', '111351', '114322', '20'), +('12', '102', '12', '56035', '71784', '20'), +('12', '102', '12', '56074', '71024', '20'), +('12', '102', '12', '104422', '61843', '20'), +('12', '102', '12', '49656', '46305', '20'), +('12', '102', '18', '56041', '75504', '20'), +('12', '102', '18', '62986', '74406', '20'), +('12', '102', '18', '104426', '64135', '20'), +('12', '102', '18', '54851', '46915', '20'), +('12', '102', '19', '62990', '73495', '20'), +('12', '102', '19', '81763', '73422', '20'), +('12', '102', '19', '56037', '72892', '20'), +('12', '102', '19', '56075', '72827', '20'), +('12', '102', '13', '111521', '119289', '20'), +('12', '102', '13', '111524', '113289', '20'), +('12', '102', '13', '111519', '113239', '20'), +('12', '102', '13', '111221', '106017', '20'), +('12', '102', '14', '111537', '116408', '20'), +('12', '102', '14', '111535', '114938', '20'), +('12', '102', '14', '111237', '102357', '20'), +('12', '102', '14', '111235', '100986', '20'), +('12', '102', '11', '133816', '148876', '20'), +('12', '102', '11', '111335', '115755', '20'), +('12', '102', '11', '111337', '115519', '20'), +('12', '102', '11', '111338', '113342', '20'), +('12', '103', '22', '12425', '0', '20'), +('12', '103', '22', '21807', '0', '20'), +('12', '103', '22', '39342', '0', '20'), +('12', '103', '22', '23597', '0', '20'), +('12', '103', '1', '98769', '184292', '20'), +('12', '103', '1', '111307', '115982', '20'), +('12', '103', '1', '111306', '115885', '20'), +('12', '103', '1', '111304', '115746', '20'), +('12', '103', '2', '62985', '72777', '20'), +('12', '103', '2', '94056', '72692', '20'), +('12', '103', '2', '104424', '63559', '20'), +('12', '103', '2', '54845', '46653', '20'), +('12', '103', '3', '111314', '116281', '20'), +('12', '103', '3', '111316', '114985', '20'), +('12', '103', '3', '111315', '114741', '20'), +('12', '103', '3', '111013', '102230', '20'), +('12', '103', '5', '111319', '115949', '20'), +('12', '103', '5', '111321', '115432', '20'), +('12', '103', '5', '111318', '114187', '20'), +('12', '103', '5', '111018', '101898', '20'), +('12', '103', '8', '111332', '116229', '20'), +('12', '103', '8', '111329', '115713', '20'), +('12', '103', '8', '111331', '113447', '20'), +('12', '103', '8', '111031', '102278', '20'), +('12', '103', '6', '111323', '116162', '20'), +('12', '103', '6', '111325', '115356', '20'), +('12', '103', '6', '111326', '115083', '20'), +('12', '103', '6', '111022', '102111', '20'), +('12', '103', '17', '56043', '77192', '20'), +('12', '103', '17', '56084', '75477', '20'), +('12', '103', '17', '104427', '65898', '20'), +('12', '103', '17', '54854', '49103', '20'), +('12', '103', '7', '56080', '72806', '20'), +('12', '103', '7', '56040', '72343', '20'), +('12', '103', '7', '104425', '63300', '20'), +('12', '103', '7', '49656', '46306', '20'), +('12', '103', '9', '67098', '116944', '20'), +('12', '103', '9', '56070', '70667', '20'), +('12', '103', '9', '62984', '70425', '20'), +('12', '103', '9', '56031', '70418', '20'), +('12', '103', '15', '111349', '117375', '20'), +('12', '103', '15', '111344', '116415', '20'), +('12', '103', '15', '111340', '116074', '20'), +('12', '103', '15', '111346', '115899', '20'), +('12', '103', '20', '128733', '147372', '20'), +('12', '103', '20', '111356', '116352', '20'), +('12', '103', '20', '111352', '115426', '20'), +('12', '103', '20', '111351', '114327', '20'), +('12', '103', '12', '56035', '71790', '20'), +('12', '103', '12', '56074', '71028', '20'), +('12', '103', '12', '104422', '61848', '20'), +('12', '103', '12', '49656', '46306', '20'), +('12', '103', '18', '56041', '75509', '20'), +('12', '103', '18', '62986', '74409', '20'), +('12', '103', '18', '104426', '64137', '20'), +('12', '103', '18', '54851', '46917', '20'), +('12', '103', '19', '62990', '73500', '20'), +('12', '103', '19', '81763', '73427', '20'), +('12', '103', '19', '56037', '72893', '20'), +('12', '103', '19', '56075', '72830', '20'), +('12', '103', '13', '111521', '119292', '20'), +('12', '103', '13', '111524', '113293', '20'), +('12', '103', '13', '111519', '113243', '20'), +('12', '103', '13', '111221', '106020', '20'), +('12', '103', '14', '111537', '116412', '20'), +('12', '103', '14', '111535', '114940', '20'), +('12', '103', '14', '111237', '102360', '20'), +('12', '103', '14', '111235', '100989', '20'), +('12', '103', '11', '133816', '148878', '20'), +('12', '103', '11', '111335', '115759', '20'), +('12', '103', '11', '111337', '115522', '20'), +('12', '103', '11', '111338', '113346', '20'), +('12', '104', '22', '12425', '0', '20'), +('12', '104', '22', '21807', '0', '20'), +('12', '104', '22', '39342', '0', '20'), +('12', '104', '22', '23597', '0', '20'), +('12', '104', '1', '98769', '184294', '20'), +('12', '104', '1', '111307', '115986', '20'), +('12', '104', '1', '111306', '115889', '20'), +('12', '104', '1', '111304', '115749', '20'), +('12', '104', '2', '62985', '72779', '20'), +('12', '104', '2', '94056', '72694', '20'), +('12', '104', '2', '104424', '63563', '20'), +('12', '104', '2', '54845', '46657', '20'), +('12', '104', '3', '111314', '116285', '20'), +('12', '104', '3', '111316', '114989', '20'), +('12', '104', '3', '111315', '114745', '20'), +('12', '104', '3', '111013', '102234', '20'), +('12', '104', '5', '111319', '115953', '20'), +('12', '104', '5', '111321', '115435', '20'), +('12', '104', '5', '111318', '114192', '20'), +('12', '104', '5', '111018', '101903', '20'), +('12', '104', '8', '111332', '116233', '20'), +('12', '104', '8', '111329', '115718', '20'), +('12', '104', '8', '111331', '113451', '20'), +('12', '104', '8', '111031', '102282', '20'), +('12', '104', '6', '111323', '116165', '20'), +('12', '104', '6', '111325', '115359', '20'), +('12', '104', '6', '111326', '115087', '20'), +('12', '104', '6', '111022', '102115', '20'), +('12', '104', '17', '56043', '77195', '20'), +('12', '104', '17', '56084', '75480', '20'), +('12', '104', '17', '104427', '65902', '20'), +('12', '104', '17', '54854', '49106', '20'), +('12', '104', '7', '56080', '72810', '20'), +('12', '104', '7', '56040', '72349', '20'), +('12', '104', '7', '104425', '63303', '20'), +('12', '104', '7', '49656', '46306', '20'), +('12', '104', '9', '67098', '116947', '20'), +('12', '104', '9', '56070', '70671', '20'), +('12', '104', '9', '62984', '70428', '20'), +('12', '104', '9', '56031', '70424', '20'), +('12', '104', '15', '111349', '117380', '20'), +('12', '104', '15', '111344', '116418', '20'), +('12', '104', '15', '111340', '116078', '20'), +('12', '104', '15', '111346', '115903', '20'), +('12', '104', '20', '128733', '147376', '20'), +('12', '104', '20', '111356', '116356', '20'), +('12', '104', '20', '111352', '115429', '20'), +('12', '104', '20', '111351', '114331', '20'), +('12', '104', '12', '56035', '71796', '20'), +('12', '104', '12', '56074', '71031', '20'), +('12', '104', '12', '104422', '61853', '20'), +('12', '104', '12', '49656', '46306', '20'), +('12', '104', '18', '56041', '75515', '20'), +('12', '104', '18', '62986', '74412', '20'), +('12', '104', '18', '104426', '64138', '20'), +('12', '104', '18', '54851', '46920', '20'), +('12', '104', '19', '62990', '73504', '20'), +('12', '104', '19', '81763', '73433', '20'), +('12', '104', '19', '56037', '72895', '20'), +('12', '104', '19', '56075', '72833', '20'), +('12', '104', '13', '111521', '119295', '20'), +('12', '104', '13', '111524', '113297', '20'), +('12', '104', '13', '111519', '113248', '20'), +('12', '104', '13', '111221', '106024', '20'), +('12', '104', '14', '111537', '116415', '20'), +('12', '104', '14', '111535', '114942', '20'), +('12', '104', '14', '111237', '102363', '20'), +('12', '104', '14', '111235', '100991', '20'), +('12', '104', '11', '133816', '148881', '20'), +('12', '104', '11', '111335', '115763', '20'), +('12', '104', '11', '111337', '115526', '20'), +('12', '104', '11', '111338', '113350', '20'), +('12', '105', '22', '12425', '0', '23'), +('12', '105', '22', '21807', '0', '23'), +('12', '105', '22', '39342', '0', '23'), +('12', '105', '22', '23597', '0', '23'), +('12', '105', '1', '98769', '184297', '23'), +('12', '105', '1', '111307', '115991', '23'), +('12', '105', '1', '111306', '115892', '23'), +('12', '105', '1', '111304', '115752', '23'), +('12', '105', '2', '62985', '72782', '23'), +('12', '105', '2', '94056', '72696', '23'), +('12', '105', '2', '104424', '63568', '23'), +('12', '105', '2', '54845', '46660', '23'), +('12', '105', '3', '111314', '116289', '23'), +('12', '105', '3', '111316', '114992', '23'), +('12', '105', '3', '111315', '114749', '23'), +('12', '105', '3', '111013', '102238', '23'), +('12', '105', '5', '111319', '115958', '23'), +('12', '105', '5', '111321', '115438', '23'), +('12', '105', '5', '111318', '114196', '23'), +('12', '105', '5', '111018', '101907', '23'), +('12', '105', '8', '111332', '116237', '23'), +('12', '105', '8', '111329', '115722', '23'), +('12', '105', '8', '111331', '113454', '23'), +('12', '105', '8', '111031', '102286', '23'), +('12', '105', '6', '111323', '116169', '23'), +('12', '105', '6', '111325', '115362', '23'), +('12', '105', '6', '111326', '115092', '23'), +('12', '105', '6', '111022', '102118', '23'), +('12', '105', '17', '56043', '77198', '23'), +('12', '105', '17', '56084', '75484', '23'), +('12', '105', '17', '104427', '65905', '23'), +('12', '105', '17', '54854', '49109', '23'), +('12', '105', '7', '56080', '72815', '23'), +('12', '105', '7', '56040', '72355', '23'), +('12', '105', '7', '104425', '63307', '23'), +('12', '105', '7', '49656', '46307', '23'), +('12', '105', '9', '67098', '116949', '23'), +('12', '105', '9', '56070', '70674', '23'), +('12', '105', '9', '62984', '70431', '23'), +('12', '105', '9', '56031', '70430', '23'), +('12', '105', '15', '111349', '117385', '23'), +('12', '105', '15', '111344', '116421', '23'), +('12', '105', '15', '111340', '116081', '23'), +('12', '105', '15', '111346', '115907', '23'), +('12', '105', '20', '128733', '147380', '23'), +('12', '105', '20', '111356', '116360', '23'), +('12', '105', '20', '111352', '115433', '23'), +('12', '105', '20', '111351', '114336', '23'), +('12', '105', '12', '56035', '71802', '23'), +('12', '105', '12', '56074', '71035', '23'), +('12', '105', '12', '104422', '61857', '23'), +('12', '105', '12', '49656', '46307', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '105', '18', '56041', '75520', '23'), +('12', '105', '18', '62986', '74415', '23'), +('12', '105', '18', '104426', '64139', '23'), +('12', '105', '18', '54851', '46922', '23'), +('12', '105', '19', '62990', '73509', '23'), +('12', '105', '19', '81763', '73439', '23'), +('12', '105', '19', '56037', '72896', '23'), +('12', '105', '19', '56075', '72836', '23'), +('12', '105', '13', '111521', '119299', '23'), +('12', '105', '13', '111524', '113301', '23'), +('12', '105', '13', '111519', '113252', '23'), +('12', '105', '13', '111221', '106028', '23'), +('12', '105', '14', '111537', '116418', '23'), +('12', '105', '14', '111535', '114945', '23'), +('12', '105', '14', '111237', '102366', '23'), +('12', '105', '14', '111235', '100993', '23'), +('12', '105', '11', '133816', '148883', '23'), +('12', '105', '11', '111335', '115766', '23'), +('12', '105', '11', '111337', '115530', '23'), +('12', '105', '11', '111338', '113353', '23'), +('12', '105', '22', '12425', '0', '22'), +('12', '105', '22', '21807', '0', '22'), +('12', '105', '22', '39342', '0', '22'), +('12', '105', '22', '23597', '0', '22'), +('12', '105', '1', '98769', '184297', '22'), +('12', '105', '1', '111307', '115991', '22'), +('12', '105', '1', '111306', '115892', '22'), +('12', '105', '1', '111304', '115752', '22'), +('12', '105', '2', '62985', '72782', '22'), +('12', '105', '2', '94056', '72696', '22'), +('12', '105', '2', '104424', '63568', '22'), +('12', '105', '2', '54845', '46660', '22'), +('12', '105', '3', '111314', '116289', '22'), +('12', '105', '3', '111316', '114992', '22'), +('12', '105', '3', '111315', '114749', '22'), +('12', '105', '3', '111013', '102238', '22'), +('12', '105', '5', '111319', '115958', '22'), +('12', '105', '5', '111321', '115438', '22'), +('12', '105', '5', '111318', '114196', '22'), +('12', '105', '5', '111018', '101907', '22'), +('12', '105', '8', '111332', '116237', '22'), +('12', '105', '8', '111329', '115722', '22'), +('12', '105', '8', '111331', '113454', '22'), +('12', '105', '8', '111031', '102286', '22'), +('12', '105', '6', '111323', '116169', '22'), +('12', '105', '6', '111325', '115362', '22'), +('12', '105', '6', '111326', '115092', '22'), +('12', '105', '6', '111022', '102118', '22'), +('12', '105', '17', '56043', '77198', '22'), +('12', '105', '17', '56084', '75484', '22'), +('12', '105', '17', '104427', '65905', '22'), +('12', '105', '17', '54854', '49109', '22'), +('12', '105', '7', '56080', '72815', '22'), +('12', '105', '7', '56040', '72355', '22'), +('12', '105', '7', '104425', '63307', '22'), +('12', '105', '7', '49656', '46307', '22'), +('12', '105', '9', '67098', '116949', '22'), +('12', '105', '9', '56070', '70674', '22'), +('12', '105', '9', '62984', '70431', '22'), +('12', '105', '9', '56031', '70430', '22'), +('12', '105', '15', '111349', '117385', '22'), +('12', '105', '15', '111344', '116421', '22'), +('12', '105', '15', '111340', '116081', '22'), +('12', '105', '15', '111346', '115907', '22'), +('12', '105', '20', '128733', '147380', '22'), +('12', '105', '20', '111356', '116360', '22'), +('12', '105', '20', '111352', '115433', '22'), +('12', '105', '20', '111351', '114336', '22'), +('12', '105', '12', '56035', '71802', '22'), +('12', '105', '12', '56074', '71035', '22'), +('12', '105', '12', '104422', '61857', '22'), +('12', '105', '12', '49656', '46307', '22'), +('12', '105', '18', '56041', '75520', '22'), +('12', '105', '18', '62986', '74415', '22'), +('12', '105', '18', '104426', '64139', '22'), +('12', '105', '18', '54851', '46922', '22'), +('12', '105', '19', '62990', '73509', '22'), +('12', '105', '19', '81763', '73439', '22'), +('12', '105', '19', '56037', '72896', '22'), +('12', '105', '19', '56075', '72836', '22'), +('12', '105', '13', '111521', '119299', '22'), +('12', '105', '13', '111524', '113301', '22'), +('12', '105', '13', '111519', '113252', '22'), +('12', '105', '13', '111221', '106028', '22'), +('12', '105', '14', '111537', '116418', '22'), +('12', '105', '14', '111535', '114945', '22'), +('12', '105', '14', '111237', '102366', '22'), +('12', '105', '14', '111235', '100993', '22'), +('12', '105', '11', '133816', '148883', '22'), +('12', '105', '11', '111335', '115766', '22'), +('12', '105', '11', '111337', '115530', '22'), +('12', '105', '11', '111338', '113353', '22'), +('12', '105', '22', '12425', '0', '21'), +('12', '105', '22', '21807', '0', '21'), +('12', '105', '22', '39342', '0', '21'), +('12', '105', '22', '23597', '0', '21'), +('12', '105', '1', '98769', '184297', '21'), +('12', '105', '1', '111307', '115991', '21'), +('12', '105', '1', '111306', '115892', '21'), +('12', '105', '1', '111304', '115752', '21'), +('12', '105', '2', '62985', '72782', '21'), +('12', '105', '2', '94056', '72696', '21'), +('12', '105', '2', '104424', '63568', '21'), +('12', '105', '2', '54845', '46660', '21'), +('12', '105', '3', '111314', '116289', '21'), +('12', '105', '3', '111316', '114992', '21'), +('12', '105', '3', '111315', '114749', '21'), +('12', '105', '3', '111013', '102238', '21'), +('12', '105', '5', '111319', '115958', '21'), +('12', '105', '5', '111321', '115438', '21'), +('12', '105', '5', '111318', '114196', '21'), +('12', '105', '5', '111018', '101907', '21'), +('12', '105', '8', '111332', '116237', '21'), +('12', '105', '8', '111329', '115722', '21'), +('12', '105', '8', '111331', '113454', '21'), +('12', '105', '8', '111031', '102286', '21'), +('12', '105', '6', '111323', '116169', '21'), +('12', '105', '6', '111325', '115362', '21'), +('12', '105', '6', '111326', '115092', '21'), +('12', '105', '6', '111022', '102118', '21'), +('12', '105', '17', '56043', '77198', '21'), +('12', '105', '17', '56084', '75484', '21'), +('12', '105', '17', '104427', '65905', '21'), +('12', '105', '17', '54854', '49109', '21'), +('12', '105', '7', '56080', '72815', '21'), +('12', '105', '7', '56040', '72355', '21'), +('12', '105', '7', '104425', '63307', '21'), +('12', '105', '7', '49656', '46307', '21'), +('12', '105', '9', '67098', '116949', '21'), +('12', '105', '9', '56070', '70674', '21'), +('12', '105', '9', '62984', '70431', '21'), +('12', '105', '9', '56031', '70430', '21'), +('12', '105', '15', '111349', '117385', '21'), +('12', '105', '15', '111344', '116421', '21'), +('12', '105', '15', '111340', '116081', '21'), +('12', '105', '15', '111346', '115907', '21'), +('12', '105', '20', '128733', '147380', '21'), +('12', '105', '20', '111356', '116360', '21'), +('12', '105', '20', '111352', '115433', '21'), +('12', '105', '20', '111351', '114336', '21'), +('12', '105', '12', '56035', '71802', '21'), +('12', '105', '12', '56074', '71035', '21'), +('12', '105', '12', '104422', '61857', '21'), +('12', '105', '12', '49656', '46307', '21'), +('12', '105', '18', '56041', '75520', '21'), +('12', '105', '18', '62986', '74415', '21'), +('12', '105', '18', '104426', '64139', '21'), +('12', '105', '18', '54851', '46922', '21'), +('12', '105', '19', '62990', '73509', '21'), +('12', '105', '19', '81763', '73439', '21'), +('12', '105', '19', '56037', '72896', '21'), +('12', '105', '19', '56075', '72836', '21'), +('12', '105', '13', '111521', '119299', '21'), +('12', '105', '13', '111524', '113301', '21'), +('12', '105', '13', '111519', '113252', '21'), +('12', '105', '13', '111221', '106028', '21'), +('12', '105', '14', '111537', '116418', '21'), +('12', '105', '14', '111535', '114945', '21'), +('12', '105', '14', '111237', '102366', '21'), +('12', '105', '14', '111235', '100993', '21'), +('12', '105', '11', '133816', '148883', '21'), +('12', '105', '11', '111335', '115766', '21'), +('12', '105', '11', '111337', '115530', '21'), +('12', '105', '11', '111338', '113353', '21'), +('12', '106', '22', '12425', '0', '23'), +('12', '106', '22', '21807', '0', '23'), +('12', '106', '22', '39342', '0', '23'), +('12', '106', '22', '23597', '0', '23'), +('12', '106', '1', '98769', '184299', '23'), +('12', '106', '1', '111307', '115996', '23'), +('12', '106', '1', '111306', '115895', '23'), +('12', '106', '1', '111304', '115755', '23'), +('12', '106', '2', '62985', '72784', '23'), +('12', '106', '2', '94056', '72698', '23'), +('12', '106', '2', '104424', '63573', '23'), +('12', '106', '2', '54845', '46664', '23'), +('12', '106', '3', '111314', '116293', '23'), +('12', '106', '3', '111316', '114996', '23'), +('12', '106', '3', '111315', '114752', '23'), +('12', '106', '3', '111013', '102242', '23'), +('12', '106', '5', '111319', '115962', '23'), +('12', '106', '5', '111321', '115441', '23'), +('12', '106', '5', '111318', '114201', '23'), +('12', '106', '5', '111018', '101911', '23'), +('12', '106', '8', '111332', '116241', '23'), +('12', '106', '8', '111329', '115727', '23'), +('12', '106', '8', '111331', '113457', '23'), +('12', '106', '8', '111031', '102290', '23'), +('12', '106', '6', '111323', '116172', '23'), +('12', '106', '6', '111325', '115365', '23'), +('12', '106', '6', '111326', '115097', '23'), +('12', '106', '6', '111022', '102122', '23'), +('12', '106', '17', '56043', '77202', '23'), +('12', '106', '17', '56084', '75488', '23'), +('12', '106', '17', '104427', '65909', '23'), +('12', '106', '17', '54854', '49112', '23'), +('12', '106', '7', '56080', '72819', '23'), +('12', '106', '7', '56040', '72361', '23'), +('12', '106', '7', '104425', '63310', '23'), +('12', '106', '7', '49656', '46307', '23'), +('12', '106', '9', '67098', '116952', '23'), +('12', '106', '9', '56070', '70677', '23'), +('12', '106', '9', '56031', '70436', '23'), +('12', '106', '9', '62984', '70434', '23'), +('12', '106', '15', '111349', '117390', '23'), +('12', '106', '15', '111344', '116423', '23'), +('12', '106', '15', '111340', '116084', '23'), +('12', '106', '15', '111346', '115910', '23'), +('12', '106', '20', '128733', '147383', '23'), +('12', '106', '20', '111356', '116363', '23'), +('12', '106', '20', '111352', '115436', '23'), +('12', '106', '20', '111351', '114340', '23'), +('12', '106', '12', '56035', '71807', '23'), +('12', '106', '12', '56074', '71039', '23'), +('12', '106', '12', '104422', '61862', '23'), +('12', '106', '12', '49656', '46307', '23'), +('12', '106', '18', '56041', '75525', '23'), +('12', '106', '18', '62986', '74418', '23'), +('12', '106', '18', '104426', '64140', '23'), +('12', '106', '18', '54851', '46925', '23'), +('12', '106', '19', '62990', '73513', '23'), +('12', '106', '19', '81763', '73445', '23'), +('12', '106', '19', '56037', '72898', '23'), +('12', '106', '19', '56075', '72839', '23'), +('12', '106', '13', '111521', '119302', '23'), +('12', '106', '13', '111524', '113305', '23'), +('12', '106', '13', '111519', '113257', '23'), +('12', '106', '13', '111221', '106031', '23'), +('12', '106', '14', '111537', '116421', '23'), +('12', '106', '14', '111535', '114947', '23'), +('12', '106', '14', '111237', '102369', '23'), +('12', '106', '14', '111235', '100996', '23'), +('12', '106', '11', '133816', '148886', '23'), +('12', '106', '11', '111335', '115770', '23'), +('12', '106', '11', '111337', '115533', '23'), +('12', '106', '11', '111338', '113357', '23'), +('12', '107', '22', '12425', '0', '23'), +('12', '107', '22', '21807', '0', '23'), +('12', '107', '22', '39342', '0', '23'), +('12', '107', '22', '23597', '0', '23'), +('12', '107', '1', '98769', '184302', '23'), +('12', '107', '1', '111307', '116001', '23'), +('12', '107', '1', '111306', '115899', '23'), +('12', '107', '1', '111304', '115758', '23'), +('12', '107', '2', '62985', '72786', '23'), +('12', '107', '2', '94056', '72700', '23'), +('12', '107', '2', '104424', '63578', '23'), +('12', '107', '2', '54845', '46668', '23'), +('12', '107', '3', '111314', '116297', '23'), +('12', '107', '3', '111316', '115000', '23'), +('12', '107', '3', '111315', '114756', '23'), +('12', '107', '3', '111013', '102246', '23'), +('12', '107', '5', '111319', '115966', '23'), +('12', '107', '5', '111321', '115444', '23'), +('12', '107', '5', '111318', '114205', '23'), +('12', '107', '5', '111018', '101916', '23'), +('12', '107', '8', '111332', '116245', '23'), +('12', '107', '8', '111329', '115731', '23'), +('12', '107', '8', '111331', '113460', '23'), +('12', '107', '8', '111031', '102294', '23'), +('12', '107', '6', '111323', '116176', '23'), +('12', '107', '6', '111325', '115368', '23'), +('12', '107', '6', '111326', '115101', '23'), +('12', '107', '6', '111022', '102125', '23'), +('12', '107', '17', '56043', '77205', '23'), +('12', '107', '17', '56084', '75492', '23'), +('12', '107', '17', '104427', '65913', '23'), +('12', '107', '17', '54854', '49115', '23'), +('12', '107', '7', '56080', '72823', '23'), +('12', '107', '7', '56040', '72367', '23'), +('12', '107', '7', '104425', '63313', '23'), +('12', '107', '7', '49656', '46308', '23'), +('12', '107', '9', '67098', '116955', '23'), +('12', '107', '9', '56070', '70680', '23'), +('12', '107', '9', '56031', '70442', '23'), +('12', '107', '9', '62984', '70437', '23'), +('12', '107', '15', '111349', '117395', '23'), +('12', '107', '15', '111344', '116426', '23'), +('12', '107', '15', '111340', '116088', '23'), +('12', '107', '15', '111346', '115914', '23'), +('12', '107', '20', '128733', '147387', '23'), +('12', '107', '20', '111356', '116367', '23'), +('12', '107', '20', '111352', '115439', '23'), +('12', '107', '20', '111351', '114345', '23'), +('12', '107', '12', '56035', '71813', '23'), +('12', '107', '12', '56074', '71042', '23'), +('12', '107', '12', '104422', '61867', '23'), +('12', '107', '12', '49656', '46308', '23'), +('12', '107', '18', '56041', '75530', '23'), +('12', '107', '18', '62986', '74421', '23'), +('12', '107', '18', '104426', '64142', '23'), +('12', '107', '18', '54851', '46927', '23'), +('12', '107', '19', '62990', '73518', '23'), +('12', '107', '19', '81763', '73451', '23'), +('12', '107', '19', '56037', '72899', '23'), +('12', '107', '19', '56075', '72842', '23'), +('12', '107', '13', '111521', '119305', '23'), +('12', '107', '13', '111524', '113309', '23'), +('12', '107', '13', '111519', '113261', '23'), +('12', '107', '13', '111221', '106035', '23'), +('12', '107', '14', '111537', '116424', '23'), +('12', '107', '14', '111535', '114950', '23'), +('12', '107', '14', '111237', '102373', '23'), +('12', '107', '14', '111235', '100998', '23'), +('12', '107', '11', '133816', '148888', '23'), +('12', '107', '11', '111335', '115773', '23'), +('12', '107', '11', '111337', '115537', '23'), +('12', '107', '11', '111338', '113361', '23'), +('12', '108', '22', '12425', '0', '23'), +('12', '108', '22', '21807', '0', '23'), +('12', '108', '22', '39342', '0', '23'), +('12', '108', '22', '23597', '0', '23'), +('12', '108', '1', '98769', '184305', '23'), +('12', '108', '1', '111307', '116006', '23'), +('12', '108', '1', '111306', '115902', '23'), +('12', '108', '1', '111304', '115761', '23'), +('12', '108', '2', '62985', '72789', '23'), +('12', '108', '2', '94056', '72702', '23'), +('12', '108', '2', '104424', '63583', '23'), +('12', '108', '2', '54845', '46671', '23'), +('12', '108', '3', '111314', '116301', '23'), +('12', '108', '3', '111316', '115003', '23'), +('12', '108', '3', '111315', '114760', '23'), +('12', '108', '3', '111013', '102250', '23'), +('12', '108', '5', '111319', '115971', '23'), +('12', '108', '5', '111321', '115447', '23'), +('12', '108', '5', '111318', '114210', '23'), +('12', '108', '5', '111018', '101920', '23'), +('12', '108', '8', '111332', '116249', '23'), +('12', '108', '8', '111329', '115736', '23'), +('12', '108', '8', '111331', '113464', '23'), +('12', '108', '8', '111031', '102298', '23'), +('12', '108', '6', '111323', '116179', '23'), +('12', '108', '6', '111325', '115370', '23'), +('12', '108', '6', '111326', '115106', '23'), +('12', '108', '6', '111022', '102129', '23'), +('12', '108', '17', '56043', '77209', '23'), +('12', '108', '17', '56084', '75495', '23'), +('12', '108', '17', '104427', '65917', '23'), +('12', '108', '17', '54854', '49118', '23'), +('12', '108', '7', '56080', '72828', '23'), +('12', '108', '7', '56040', '72373', '23'), +('12', '108', '7', '104425', '63317', '23'), +('12', '108', '7', '49656', '46308', '23'), +('12', '108', '9', '67098', '116957', '23'), +('12', '108', '9', '56070', '70683', '23'), +('12', '108', '9', '56031', '70448', '23'), +('12', '108', '9', '62984', '70440', '23'), +('12', '108', '15', '111349', '117400', '23'), +('12', '108', '15', '111344', '116429', '23'), +('12', '108', '15', '111340', '116091', '23'), +('12', '108', '15', '111346', '115917', '23'), +('12', '108', '20', '128733', '147390', '23'), +('12', '108', '20', '111356', '116371', '23'), +('12', '108', '20', '111352', '115442', '23'), +('12', '108', '20', '111351', '114349', '23'), +('12', '108', '12', '56035', '71819', '23'), +('12', '108', '12', '56074', '71046', '23'), +('12', '108', '12', '104422', '61872', '23'), +('12', '108', '12', '49656', '46308', '23'), +('12', '108', '18', '56041', '75535', '23'), +('12', '108', '18', '62986', '74425', '23'), +('12', '108', '18', '104426', '64143', '23'), +('12', '108', '18', '54851', '46930', '23'), +('12', '108', '19', '62990', '73523', '23'), +('12', '108', '19', '81763', '73457', '23'), +('12', '108', '19', '56037', '72901', '23'), +('12', '108', '19', '56075', '72844', '23'), +('12', '108', '13', '111521', '119308', '23'), +('12', '108', '13', '111524', '113313', '23'), +('12', '108', '13', '111519', '113266', '23'), +('12', '108', '13', '111221', '106039', '23'), +('12', '108', '14', '111537', '116427', '23'), +('12', '108', '14', '111535', '114952', '23'), +('12', '108', '14', '111237', '102376', '23'), +('12', '108', '14', '111235', '101001', '23'), +('12', '108', '11', '133816', '148891', '23'), +('12', '108', '11', '111335', '115777', '23'), +('12', '108', '11', '111337', '115541', '23'), +('12', '108', '11', '111338', '113365', '23'), +('12', '109', '22', '12425', '0', '23'), +('12', '109', '22', '21807', '0', '23'), +('12', '109', '22', '39342', '0', '23'), +('12', '109', '22', '23597', '0', '23'), +('12', '109', '1', '98769', '184307', '23'), +('12', '109', '1', '111307', '116011', '23'), +('12', '109', '1', '111306', '115905', '23'), +('12', '109', '1', '111304', '115764', '23'), +('12', '109', '2', '62985', '72791', '23'), +('12', '109', '2', '94056', '72705', '23'), +('12', '109', '2', '104424', '63588', '23'), +('12', '109', '2', '54845', '46675', '23'), +('12', '109', '3', '111314', '116305', '23'), +('12', '109', '3', '111316', '115007', '23'), +('12', '109', '3', '111315', '114764', '23'), +('12', '109', '3', '111013', '102254', '23'), +('12', '109', '5', '111319', '115975', '23'), +('12', '109', '5', '111321', '115450', '23'), +('12', '109', '5', '111318', '114215', '23'), +('12', '109', '5', '111018', '101924', '23'), +('12', '109', '8', '111332', '116253', '23'), +('12', '109', '8', '111329', '115741', '23'), +('12', '109', '8', '111331', '113467', '23'), +('12', '109', '8', '111031', '102302', '23'), +('12', '109', '6', '111323', '116183', '23'), +('12', '109', '6', '111325', '115373', '23'), +('12', '109', '6', '111326', '115111', '23'), +('12', '109', '6', '111022', '102132', '23'), +('12', '109', '17', '56043', '77212', '23'), +('12', '109', '17', '56084', '75499', '23'), +('12', '109', '17', '104427', '65920', '23'), +('12', '109', '17', '54854', '49121', '23'), +('12', '109', '7', '56080', '72832', '23'), +('12', '109', '7', '56040', '72379', '23'), +('12', '109', '7', '104425', '63320', '23'), +('12', '109', '7', '49656', '46309', '23'), +('12', '109', '9', '67098', '116960', '23'), +('12', '109', '9', '56070', '70687', '23'), +('12', '109', '9', '56031', '70454', '23'), +('12', '109', '9', '62984', '70443', '23'), +('12', '109', '15', '111349', '117405', '23'), +('12', '109', '15', '111344', '116432', '23'), +('12', '109', '15', '111340', '116094', '23'), +('12', '109', '15', '111346', '115921', '23'), +('12', '109', '20', '128733', '147394', '23'), +('12', '109', '20', '111356', '116375', '23'), +('12', '109', '20', '111352', '115446', '23'), +('12', '109', '20', '111351', '114354', '23'), +('12', '109', '12', '56035', '71824', '23'), +('12', '109', '12', '56074', '71050', '23'), +('12', '109', '12', '104422', '61877', '23'), +('12', '109', '12', '49656', '46309', '23'), +('12', '109', '18', '56041', '75540', '23'), +('12', '109', '18', '62986', '74428', '23'), +('12', '109', '18', '104426', '64144', '23'), +('12', '109', '18', '54851', '46932', '23'), +('12', '109', '19', '62990', '73527', '23'), +('12', '109', '19', '81763', '73463', '23'), +('12', '109', '19', '56037', '72903', '23'), +('12', '109', '19', '56075', '72847', '23'), +('12', '109', '13', '111521', '119312', '23'), +('12', '109', '13', '111524', '113317', '23'), +('12', '109', '13', '111519', '113270', '23'), +('12', '109', '13', '111221', '106042', '23'), +('12', '109', '14', '111537', '116430', '23'), +('12', '109', '14', '111535', '114955', '23'), +('12', '109', '14', '111237', '102379', '23'), +('12', '109', '14', '111235', '101003', '23'), +('12', '109', '11', '133816', '148893', '23'), +('12', '109', '11', '111335', '115781', '23'), +('12', '109', '11', '111337', '115545', '23'), +('12', '109', '11', '111338', '113368', '23'), +('12', '110', '22', '12425', '0', '25'), +('12', '110', '22', '39342', '0', '25'), +('12', '110', '22', '7867', '0', '25'), +('12', '110', '22', '53550', '0', '25'), +('12', '110', '1', '98769', '184310', '25'), +('12', '110', '1', '111307', '116016', '25'), +('12', '110', '1', '111306', '115909', '25'), +('12', '110', '1', '111304', '115766', '25'), +('12', '110', '2', '62985', '72793', '25'), +('12', '110', '2', '94056', '72707', '25'), +('12', '110', '2', '104424', '63593', '25'), +('12', '110', '2', '54845', '46678', '25'), +('12', '110', '3', '111314', '116309', '25'), +('12', '110', '3', '111316', '115011', '25'), +('12', '110', '3', '111315', '114768', '25'), +('12', '110', '3', '111013', '102258', '25'), +('12', '110', '5', '111319', '115979', '25'), +('12', '110', '5', '111321', '115453', '25'), +('12', '110', '5', '111318', '114219', '25'), +('12', '110', '5', '111018', '101929', '25'), +('12', '110', '8', '111332', '116257', '25'), +('12', '110', '8', '111329', '115745', '25'), +('12', '110', '8', '111331', '113470', '25'), +('12', '110', '8', '111031', '102306', '25'), +('12', '110', '6', '111323', '116186', '25'), +('12', '110', '6', '111325', '115376', '25'), +('12', '110', '6', '111326', '115116', '25'), +('12', '110', '6', '111022', '102136', '25'), +('12', '110', '17', '56043', '77215', '25'), +('12', '110', '17', '56084', '75503', '25'), +('12', '110', '17', '104427', '65924', '25'), +('12', '110', '17', '54854', '49123', '25'), +('12', '110', '7', '56080', '72836', '25'), +('12', '110', '7', '56040', '72386', '25'), +('12', '110', '7', '104425', '63323', '25'), +('12', '110', '7', '49656', '46309', '25'), +('12', '110', '9', '67098', '116963', '25'), +('12', '110', '9', '56070', '70690', '25'), +('12', '110', '9', '56031', '70460', '25'), +('12', '110', '9', '62984', '70446', '25'), +('12', '110', '15', '111349', '117410', '25'), +('12', '110', '15', '111344', '116435', '25'), +('12', '110', '15', '111340', '116098', '25'), +('12', '110', '15', '111346', '115924', '25'), +('12', '110', '20', '128733', '147398', '25'), +('12', '110', '20', '111356', '116379', '25'), +('12', '110', '20', '111352', '115449', '25'), +('12', '110', '20', '111351', '114358', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('12', '110', '12', '56035', '71830', '25'), +('12', '110', '12', '56074', '71053', '25'), +('12', '110', '12', '104422', '61881', '25'), +('12', '110', '12', '49656', '46309', '25'), +('12', '110', '18', '56041', '75545', '25'), +('12', '110', '18', '62986', '74431', '25'), +('12', '110', '18', '104426', '64145', '25'), +('12', '110', '18', '54851', '46935', '25'), +('12', '110', '19', '62990', '73532', '25'), +('12', '110', '19', '81763', '73469', '25'), +('12', '110', '19', '56037', '72904', '25'), +('12', '110', '19', '56075', '72850', '25'), +('12', '110', '13', '111521', '119316', '25'), +('12', '110', '13', '111524', '113322', '25'), +('12', '110', '13', '111519', '113275', '25'), +('12', '110', '13', '111221', '106046', '25'), +('12', '110', '14', '111537', '116433', '25'), +('12', '110', '14', '111535', '114957', '25'), +('12', '110', '14', '111237', '102382', '25'), +('12', '110', '14', '111235', '101006', '25'), +('12', '110', '11', '85213', '166671', '25'), +('12', '110', '11', '133816', '148896', '25'), +('12', '110', '11', '111335', '115784', '25'), +('12', '110', '11', '111337', '115548', '25'), +('12', '110', '22', '12425', '0', '24'), +('12', '110', '22', '39342', '0', '24'), +('12', '110', '22', '7867', '0', '24'), +('12', '110', '22', '53550', '0', '24'), +('12', '110', '1', '98769', '184310', '24'), +('12', '110', '1', '111307', '116016', '24'), +('12', '110', '1', '111306', '115909', '24'), +('12', '110', '1', '111304', '115766', '24'), +('12', '110', '2', '62985', '72793', '24'), +('12', '110', '2', '94056', '72707', '24'), +('12', '110', '2', '104424', '63593', '24'), +('12', '110', '2', '54845', '46678', '24'), +('12', '110', '3', '111314', '116309', '24'), +('12', '110', '3', '111316', '115011', '24'), +('12', '110', '3', '111315', '114768', '24'), +('12', '110', '3', '111013', '102258', '24'), +('12', '110', '5', '111319', '115979', '24'), +('12', '110', '5', '111321', '115453', '24'), +('12', '110', '5', '111318', '114219', '24'), +('12', '110', '5', '111018', '101929', '24'), +('12', '110', '8', '111332', '116257', '24'), +('12', '110', '8', '111329', '115745', '24'), +('12', '110', '8', '111331', '113470', '24'), +('12', '110', '8', '111031', '102306', '24'), +('12', '110', '6', '111323', '116186', '24'), +('12', '110', '6', '111325', '115376', '24'), +('12', '110', '6', '111326', '115116', '24'), +('12', '110', '6', '111022', '102136', '24'), +('12', '110', '17', '56043', '77215', '24'), +('12', '110', '17', '56084', '75503', '24'), +('12', '110', '17', '104427', '65924', '24'), +('12', '110', '17', '54854', '49123', '24'), +('12', '110', '7', '56080', '72836', '24'), +('12', '110', '7', '56040', '72386', '24'), +('12', '110', '7', '104425', '63323', '24'), +('12', '110', '7', '49656', '46309', '24'), +('12', '110', '9', '67098', '116963', '24'), +('12', '110', '9', '56070', '70690', '24'), +('12', '110', '9', '56031', '70460', '24'), +('12', '110', '9', '62984', '70446', '24'), +('12', '110', '15', '111349', '117410', '24'), +('12', '110', '15', '111344', '116435', '24'), +('12', '110', '15', '111340', '116098', '24'), +('12', '110', '15', '111346', '115924', '24'), +('12', '110', '20', '128733', '147398', '24'), +('12', '110', '20', '111356', '116379', '24'), +('12', '110', '20', '111352', '115449', '24'), +('12', '110', '20', '111351', '114358', '24'), +('12', '110', '12', '56035', '71830', '24'), +('12', '110', '12', '56074', '71053', '24'), +('12', '110', '12', '104422', '61881', '24'), +('12', '110', '12', '49656', '46309', '24'), +('12', '110', '18', '56041', '75545', '24'), +('12', '110', '18', '62986', '74431', '24'), +('12', '110', '18', '104426', '64145', '24'), +('12', '110', '18', '54851', '46935', '24'), +('12', '110', '19', '62990', '73532', '24'), +('12', '110', '19', '81763', '73469', '24'), +('12', '110', '19', '56037', '72904', '24'), +('12', '110', '19', '56075', '72850', '24'), +('12', '110', '13', '111521', '119316', '24'), +('12', '110', '13', '111524', '113322', '24'), +('12', '110', '13', '111519', '113275', '24'), +('12', '110', '13', '111221', '106046', '24'), +('12', '110', '14', '111537', '116433', '24'), +('12', '110', '14', '111535', '114957', '24'), +('12', '110', '14', '111237', '102382', '24'), +('12', '110', '14', '111235', '101006', '24'), +('12', '110', '11', '85213', '166671', '24'), +('12', '110', '11', '133816', '148896', '24'), +('12', '110', '11', '111335', '115784', '24'), +('12', '110', '11', '111337', '115548', '24'), +('12', '111', '22', '12425', '0', '25'), +('12', '111', '22', '39342', '0', '25'), +('12', '111', '22', '7867', '0', '25'), +('12', '111', '22', '53550', '0', '25'), +('12', '111', '1', '98769', '184312', '25'), +('12', '111', '1', '111307', '116021', '25'), +('12', '111', '1', '111306', '115912', '25'), +('12', '111', '1', '111304', '115769', '25'), +('12', '111', '2', '62985', '72796', '25'), +('12', '111', '2', '94056', '72709', '25'), +('12', '111', '2', '104424', '63597', '25'), +('12', '111', '2', '54845', '46682', '25'), +('12', '111', '3', '111314', '116313', '25'), +('12', '111', '3', '111316', '115015', '25'), +('12', '111', '3', '111315', '114771', '25'), +('12', '111', '3', '111013', '102262', '25'), +('12', '111', '5', '111319', '115984', '25'), +('12', '111', '5', '111321', '115457', '25'), +('12', '111', '5', '111318', '114224', '25'), +('12', '111', '5', '111018', '101933', '25'), +('12', '111', '8', '111332', '116261', '25'), +('12', '111', '8', '111329', '115750', '25'), +('12', '111', '8', '111331', '113473', '25'), +('12', '111', '8', '111031', '102310', '25'), +('12', '111', '6', '111323', '116190', '25'), +('12', '111', '6', '111325', '115379', '25'), +('12', '111', '6', '111326', '115120', '25'), +('12', '111', '6', '111022', '102139', '25'), +('12', '111', '17', '56043', '77219', '25'), +('12', '111', '17', '56084', '75507', '25'), +('12', '111', '17', '104427', '65928', '25'), +('12', '111', '17', '54854', '49126', '25'), +('12', '111', '7', '56080', '72841', '25'), +('12', '111', '7', '56040', '72392', '25'), +('12', '111', '7', '104425', '63327', '25'), +('12', '111', '7', '49656', '46310', '25'), +('12', '111', '9', '67098', '116965', '25'), +('12', '111', '9', '56070', '70693', '25'), +('12', '111', '9', '56031', '70466', '25'), +('12', '111', '9', '62984', '70449', '25'), +('12', '111', '15', '111349', '117415', '25'), +('12', '111', '15', '111344', '116438', '25'), +('12', '111', '15', '111340', '116101', '25'), +('12', '111', '15', '111346', '115928', '25'), +('12', '111', '20', '128733', '147401', '25'), +('12', '111', '20', '111356', '116382', '25'), +('12', '111', '20', '111352', '115452', '25'), +('12', '111', '20', '111351', '114363', '25'), +('12', '111', '12', '56035', '71836', '25'), +('12', '111', '12', '56074', '71057', '25'), +('12', '111', '12', '104422', '61886', '25'), +('12', '111', '12', '49656', '46310', '25'), +('12', '111', '18', '56041', '75550', '25'), +('12', '111', '18', '62986', '74434', '25'), +('12', '111', '18', '104426', '64147', '25'), +('12', '111', '18', '54851', '46937', '25'), +('12', '111', '19', '62990', '73536', '25'), +('12', '111', '19', '81763', '73475', '25'), +('12', '111', '19', '56037', '72906', '25'), +('12', '111', '19', '56075', '72853', '25'), +('12', '111', '13', '111521', '119319', '25'), +('12', '111', '13', '111524', '113326', '25'), +('12', '111', '13', '111519', '113280', '25'), +('12', '111', '13', '111221', '106050', '25'), +('12', '111', '14', '111537', '116437', '25'), +('12', '111', '14', '111535', '114959', '25'), +('12', '111', '14', '111237', '102385', '25'), +('12', '111', '14', '111235', '101008', '25'), +('12', '111', '11', '85213', '166674', '25'), +('12', '111', '11', '133816', '148898', '25'), +('12', '111', '11', '111335', '115788', '25'), +('12', '111', '11', '111337', '115552', '25'), +('12', '112', '22', '12425', '0', '25'), +('12', '112', '22', '39342', '0', '25'), +('12', '112', '22', '7867', '0', '25'), +('12', '112', '22', '53550', '0', '25'), +('12', '112', '1', '98769', '184315', '25'), +('12', '112', '1', '111307', '116026', '25'), +('12', '112', '1', '111306', '115916', '25'), +('12', '112', '1', '111304', '115772', '25'), +('12', '112', '2', '62985', '72798', '25'), +('12', '112', '2', '94056', '72711', '25'), +('12', '112', '2', '104424', '63602', '25'), +('12', '112', '2', '54845', '46685', '25'), +('12', '112', '3', '111314', '116317', '25'), +('12', '112', '3', '111316', '115018', '25'), +('12', '112', '3', '111315', '114775', '25'), +('12', '112', '3', '111013', '102266', '25'), +('12', '112', '5', '111319', '115988', '25'), +('12', '112', '5', '111321', '115460', '25'), +('12', '112', '5', '111318', '114228', '25'), +('12', '112', '5', '111018', '101938', '25'), +('12', '112', '8', '111332', '116265', '25'), +('12', '112', '8', '111329', '115754', '25'), +('12', '112', '8', '111331', '113477', '25'), +('12', '112', '8', '111031', '102314', '25'), +('12', '112', '6', '111323', '116193', '25'), +('12', '112', '6', '111325', '115382', '25'), +('12', '112', '6', '111326', '115125', '25'), +('12', '112', '6', '111022', '102143', '25'), +('12', '112', '17', '56043', '77222', '25'), +('12', '112', '17', '56084', '75510', '25'), +('12', '112', '17', '104427', '65932', '25'), +('12', '112', '17', '54854', '49129', '25'), +('12', '112', '7', '56080', '72845', '25'), +('12', '112', '7', '56040', '72398', '25'), +('12', '112', '7', '104425', '63330', '25'), +('12', '112', '7', '49656', '46310', '25'), +('12', '112', '9', '67098', '116968', '25'), +('12', '112', '9', '56070', '70696', '25'), +('12', '112', '9', '56031', '70472', '25'), +('12', '112', '9', '62984', '70452', '25'), +('12', '112', '15', '111349', '117420', '25'), +('12', '112', '15', '111344', '116441', '25'), +('12', '112', '15', '111340', '116104', '25'), +('12', '112', '15', '111346', '115932', '25'), +('12', '112', '20', '128733', '147405', '25'), +('12', '112', '20', '111356', '116386', '25'), +('12', '112', '20', '111352', '115455', '25'), +('12', '112', '20', '111351', '114367', '25'), +('12', '112', '12', '56035', '71841', '25'), +('12', '112', '12', '56074', '71061', '25'), +('12', '112', '12', '104422', '61891', '25'), +('12', '112', '12', '49656', '46310', '25'), +('12', '112', '18', '56041', '75555', '25'), +('12', '112', '18', '62986', '74437', '25'), +('12', '112', '18', '104426', '64148', '25'), +('12', '112', '18', '54851', '46940', '25'), +('12', '112', '19', '62990', '73541', '25'), +('12', '112', '19', '81763', '73481', '25'), +('12', '112', '19', '56037', '72907', '25'), +('12', '112', '19', '56075', '72856', '25'), +('12', '112', '13', '111521', '119322', '25'), +('12', '112', '13', '111524', '113330', '25'), +('12', '112', '13', '111519', '113285', '25'), +('12', '112', '13', '111221', '106054', '25'), +('12', '112', '14', '111537', '116440', '25'), +('12', '112', '14', '111535', '114962', '25'), +('12', '112', '14', '111237', '102388', '25'), +('12', '112', '14', '111235', '101010', '25'), +('12', '112', '11', '85213', '166676', '25'), +('12', '112', '11', '133816', '148901', '25'), +('12', '112', '11', '111335', '115791', '25'), +('12', '112', '11', '111337', '115556', '25'), +('12', '113', '22', '12425', '0', '25'), +('12', '113', '22', '39342', '0', '25'), +('12', '113', '22', '7867', '0', '25'), +('12', '113', '22', '53550', '0', '25'), +('12', '113', '1', '98769', '184318', '25'), +('12', '113', '1', '111307', '116031', '25'), +('12', '113', '1', '111306', '115919', '25'), +('12', '113', '1', '111304', '115775', '25'), +('12', '113', '2', '62985', '72800', '25'), +('12', '113', '2', '94056', '72713', '25'), +('12', '113', '2', '104424', '63607', '25'), +('12', '113', '2', '54845', '46689', '25'), +('12', '113', '3', '111314', '116321', '25'), +('12', '113', '3', '111316', '115022', '25'), +('12', '113', '3', '111315', '114779', '25'), +('12', '113', '3', '111013', '102270', '25'), +('12', '113', '5', '111319', '115992', '25'), +('12', '113', '5', '111321', '115463', '25'), +('12', '113', '5', '111318', '114233', '25'), +('12', '113', '5', '111018', '101942', '25'), +('12', '113', '8', '111332', '116269', '25'), +('12', '113', '8', '111329', '115759', '25'), +('12', '113', '8', '111331', '113480', '25'), +('12', '113', '8', '111031', '102318', '25'), +('12', '113', '6', '111323', '116197', '25'), +('12', '113', '6', '111325', '115385', '25'), +('12', '113', '6', '111326', '115130', '25'), +('12', '113', '6', '111022', '102146', '25'), +('12', '113', '17', '56043', '77226', '25'), +('12', '113', '17', '56084', '75514', '25'), +('12', '113', '17', '104427', '65935', '25'), +('12', '113', '17', '54854', '49132', '25'), +('12', '113', '7', '56080', '72849', '25'), +('12', '113', '7', '56040', '72404', '25'), +('12', '113', '7', '104425', '63333', '25'), +('12', '113', '7', '49656', '46311', '25'), +('12', '113', '9', '67098', '116971', '25'), +('12', '113', '9', '56070', '70699', '25'), +('12', '113', '9', '56031', '70478', '25'), +('12', '113', '9', '62984', '70455', '25'), +('12', '113', '15', '111349', '117424', '25'), +('12', '113', '15', '111344', '116443', '25'), +('12', '113', '15', '111340', '116108', '25'), +('12', '113', '15', '111346', '115935', '25'), +('12', '113', '20', '128733', '147408', '25'), +('12', '113', '20', '111356', '116390', '25'), +('12', '113', '20', '111352', '115459', '25'), +('12', '113', '20', '111351', '114372', '25'), +('12', '113', '12', '56035', '71847', '25'), +('12', '113', '12', '56074', '71064', '25'), +('12', '113', '12', '104422', '61896', '25'), +('12', '113', '12', '49656', '46311', '25'), +('12', '113', '18', '56041', '75560', '25'), +('12', '113', '18', '62986', '74440', '25'), +('12', '113', '18', '104426', '64149', '25'), +('12', '113', '18', '54851', '46942', '25'), +('12', '113', '19', '62990', '73545', '25'), +('12', '113', '19', '81763', '73487', '25'), +('12', '113', '19', '56037', '72909', '25'), +('12', '113', '19', '56075', '72859', '25'), +('12', '113', '13', '111521', '119326', '25'), +('12', '113', '13', '111524', '113334', '25'), +('12', '113', '13', '111519', '113289', '25'), +('12', '113', '13', '111221', '106057', '25'), +('12', '113', '14', '111537', '116443', '25'), +('12', '113', '14', '111535', '114964', '25'), +('12', '113', '14', '111237', '102391', '25'), +('12', '113', '14', '111235', '101013', '25'), +('12', '113', '11', '85213', '166679', '25'), +('12', '113', '11', '133816', '148903', '25'), +('12', '113', '11', '111335', '115795', '25'), +('12', '113', '11', '111337', '115559', '25'), +('12', '114', '22', '12425', '0', '25'), +('12', '114', '22', '39342', '0', '25'), +('12', '114', '22', '7867', '0', '25'), +('12', '114', '22', '53550', '0', '25'), +('12', '114', '1', '98769', '184320', '25'), +('12', '114', '1', '111307', '116036', '25'), +('12', '114', '1', '111306', '115922', '25'), +('12', '114', '1', '111304', '115778', '25'), +('12', '114', '2', '62985', '72803', '25'), +('12', '114', '2', '94056', '72715', '25'), +('12', '114', '2', '104424', '63612', '25'), +('12', '114', '2', '54845', '46692', '25'), +('12', '114', '3', '111314', '116325', '25'), +('12', '114', '3', '111316', '115026', '25'), +('12', '114', '3', '111315', '114783', '25'), +('12', '114', '3', '111013', '102274', '25'), +('12', '114', '5', '111319', '115997', '25'), +('12', '114', '5', '111321', '115466', '25'), +('12', '114', '5', '111318', '114237', '25'), +('12', '114', '5', '111018', '101946', '25'), +('12', '114', '8', '111332', '116273', '25'), +('12', '114', '8', '111329', '115764', '25'), +('12', '114', '8', '111331', '113483', '25'), +('12', '114', '8', '111031', '102323', '25'), +('12', '114', '6', '111323', '116200', '25'), +('12', '114', '6', '111325', '115388', '25'), +('12', '114', '6', '111326', '115134', '25'), +('12', '114', '6', '111022', '102150', '25'), +('12', '114', '17', '56043', '77229', '25'), +('12', '114', '17', '56084', '75518', '25'), +('12', '114', '17', '104427', '65939', '25'), +('12', '114', '17', '54854', '49135', '25'), +('12', '114', '7', '56080', '72853', '25'), +('12', '114', '7', '56040', '72410', '25'), +('12', '114', '7', '104425', '63337', '25'), +('12', '114', '7', '49656', '46311', '25'), +('12', '114', '9', '67098', '116973', '25'), +('12', '114', '9', '56070', '70702', '25'), +('12', '114', '9', '56031', '70484', '25'), +('12', '114', '9', '62984', '70458', '25'), +('12', '114', '15', '111349', '117429', '25'), +('12', '114', '15', '111344', '116446', '25'), +('12', '114', '15', '111340', '116111', '25'), +('12', '114', '15', '111346', '115939', '25'), +('12', '114', '20', '128733', '147412', '25'), +('12', '114', '20', '111356', '116394', '25'), +('12', '114', '20', '111352', '115462', '25'), +('12', '114', '20', '111351', '114376', '25'), +('12', '114', '12', '56035', '71853', '25'), +('12', '114', '12', '56074', '71068', '25'), +('12', '114', '12', '104422', '61900', '25'), +('12', '114', '12', '49656', '46311', '25'), +('12', '114', '18', '56041', '75566', '25'), +('12', '114', '18', '62986', '74443', '25'), +('12', '114', '18', '104426', '64150', '25'), +('12', '114', '18', '54851', '46945', '25'), +('12', '114', '19', '62990', '73550', '25'), +('12', '114', '19', '81763', '73493', '25'), +('12', '114', '19', '56037', '72910', '25'), +('12', '114', '19', '56075', '72862', '25'), +('12', '114', '13', '111521', '119329', '25'), +('12', '114', '13', '111524', '113338', '25'), +('12', '114', '13', '111519', '113294', '25'), +('12', '114', '13', '111221', '106061', '25'), +('12', '114', '14', '111537', '116446', '25'), +('12', '114', '14', '111535', '114967', '25'), +('12', '114', '14', '111237', '102395', '25'), +('12', '114', '14', '111235', '101015', '25'), +('12', '114', '11', '85213', '166681', '25'), +('12', '114', '11', '133816', '148906', '25'), +('12', '114', '11', '111335', '115798', '25'), +('12', '114', '11', '111337', '115563', '25'), +('12', '115', '22', '12425', '0', '26'), +('12', '115', '22', '39342', '0', '26'), +('12', '115', '22', '7867', '0', '26'), +('12', '115', '22', '53550', '0', '26'), +('12', '115', '1', '98769', '184323', '26'), +('12', '115', '1', '111307', '116041', '26'), +('12', '115', '1', '111306', '115926', '26'), +('12', '115', '1', '111304', '115781', '26'), +('12', '115', '2', '62985', '72805', '26'), +('12', '115', '2', '94056', '72717', '26'), +('12', '115', '2', '104424', '63617', '26'), +('12', '115', '2', '54845', '46696', '26'), +('12', '115', '3', '111314', '116329', '26'), +('12', '115', '3', '111316', '115030', '26'), +('12', '115', '3', '111315', '114786', '26'), +('12', '115', '3', '111013', '102278', '26'), +('12', '115', '5', '111319', '116001', '26'), +('12', '115', '5', '111321', '115469', '26'), +('12', '115', '5', '111318', '114242', '26'), +('12', '115', '5', '111018', '101951', '26'), +('12', '115', '8', '111332', '116277', '26'), +('12', '115', '8', '111329', '115768', '26'), +('12', '115', '8', '111331', '113486', '26'), +('12', '115', '8', '111031', '102327', '26'), +('12', '115', '6', '111323', '116204', '26'), +('12', '115', '6', '111325', '115390', '26'), +('12', '115', '6', '111326', '115139', '26'), +('12', '115', '6', '111022', '102153', '26'), +('12', '115', '17', '56043', '77232', '26'), +('12', '115', '17', '56084', '75522', '26'), +('12', '115', '17', '104427', '65943', '26'), +('12', '115', '17', '54854', '49138', '26'), +('12', '115', '7', '56080', '72858', '26'), +('12', '115', '7', '56040', '72416', '26'), +('12', '115', '7', '104425', '63340', '26'), +('12', '115', '7', '49656', '46312', '26'), +('12', '115', '9', '67098', '116976', '26'), +('12', '115', '9', '56070', '70706', '26'), +('12', '115', '9', '56031', '70491', '26'), +('12', '115', '9', '62984', '70461', '26'), +('12', '115', '15', '111349', '117434', '26'), +('12', '115', '15', '111344', '116449', '26'), +('12', '115', '15', '111340', '116114', '26'), +('12', '115', '15', '111346', '115942', '26'), +('12', '115', '20', '128733', '147416', '26'), +('12', '115', '20', '111356', '116398', '26'), +('12', '115', '20', '111352', '115465', '26'), +('12', '115', '20', '111351', '114381', '26'), +('12', '115', '12', '56035', '71859', '26'), +('12', '115', '12', '56074', '71072', '26'), +('12', '115', '12', '104422', '61905', '26'), +('12', '115', '12', '49656', '46312', '26'), +('12', '115', '18', '56041', '75571', '26'), +('12', '115', '18', '62986', '74446', '26'), +('12', '115', '18', '104426', '64151', '26'), +('12', '115', '18', '54851', '46947', '26'), +('12', '115', '19', '62990', '73555', '26'), +('12', '115', '19', '81763', '73499', '26'), +('12', '115', '19', '56037', '72912', '26'), +('12', '115', '19', '56075', '72865', '26'), +('12', '115', '13', '111521', '119332', '26'), +('12', '115', '13', '111524', '113342', '26'), +('12', '115', '13', '111519', '113298', '26'), +('12', '115', '13', '111221', '106064', '26'), +('12', '115', '14', '111537', '116449', '26'), +('12', '115', '14', '111535', '114969', '26'), +('12', '115', '14', '111237', '102398', '26'), +('12', '115', '14', '111235', '101018', '26'), +('12', '115', '11', '85213', '166684', '26'), +('12', '115', '11', '133816', '148908', '26'), +('12', '115', '11', '111335', '115802', '26'), +('12', '115', '11', '111337', '115567', '26'), +('13', '1', '22', '10323', '0', '0'), +('13', '1', '22', '9246', '0', '0'), +('13', '1', '22', '21509', '0', '0'), +('13', '1', '22', '8007', '0', '0'), +('13', '1', '1', '14702', '3750', '0'), +('13', '1', '1', '14701', '2862', '0'), +('13', '1', '1', '30361', '2640', '0'), +('13', '1', '1', '10321', '1000', '0'), +('13', '1', '2', '10143', '5368', '0'), +('13', '1', '2', '30363', '3700', '0'), +('13', '1', '2', '1239', '1539', '0'), +('13', '1', '2', '1211', '1485', '0'), +('13', '1', '3', '1212', '1330', '0'), +('13', '1', '3', '14705', '990', '0'), +('13', '1', '3', '14706', '990', '0'), +('13', '1', '3', '1642', '730', '0'), +('13', '1', '5', '14703', '6050', '0'), +('13', '1', '5', '14557', '5072', '0'), +('13', '1', '5', '14700', '3318', '0'), +('13', '1', '5', '30362', '3140', '0'), +('13', '1', '8', '11603', '8419', '0'), +('13', '1', '8', '2349', '3554', '0'), +('13', '1', '8', '1216', '1343', '0'), +('13', '1', '8', '1274', '1145', '0'), +('13', '1', '6', '2708', '5537', '0'), +('13', '1', '6', '1557', '5310', '0'), +('13', '1', '6', '1905', '5031', '0'), +('13', '1', '6', '1542', '3480', '0'), +('13', '1', '17', '1253', '10051', '0'), +('13', '1', '17', '1644', '8427', '0'), +('13', '1', '17', '11641', '5763', '0'), +('13', '1', '17', '1357', '5468', '0'), +('13', '1', '7', '1362', '2624', '0'), +('13', '1', '7', '1321', '1746', '0'), +('13', '1', '7', '1648', '885', '0'), +('13', '1', '7', '1241', '589', '0'), +('13', '1', '9', '12805', '4256', '0'), +('13', '1', '9', '4344', '2051', '0'), +('13', '1', '9', '1242', '2025', '0'), +('13', '1', '9', '10408', '2002', '0'), +('13', '1', '15', '11687', '3085', '0'), +('13', '1', '15', '10150', '3004', '0'), +('13', '1', '15', '10163', '2300', '0'), +('13', '1', '15', '14651', '2224', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '1', '20', '11666', '8289', '0'), +('13', '1', '20', '2742', '5069', '0'), +('13', '1', '20', '1217', '1339', '0'), +('13', '1', '20', '1647', '1334', '0'), +('13', '1', '12', '2923', '3074', '0'), +('13', '1', '12', '20655', '2626', '0'), +('13', '1', '12', '1404', '2512', '0'), +('13', '1', '12', '1243', '1617', '0'), +('13', '1', '18', '4410', '1142', '0'), +('13', '1', '18', '1651', '971', '0'), +('13', '1', '18', '1244', '586', '0'), +('13', '1', '18', '1221', '454', '0'), +('13', '1', '19', '1368', '2016', '0'), +('13', '1', '19', '68239', '1960', '0'), +('13', '1', '19', '1652', '1834', '0'), +('13', '1', '19', '1245', '512', '0'), +('13', '1', '13', '14759', '5262', '0'), +('13', '1', '13', '11650', '4442', '0'), +('13', '1', '13', '11625', '3514', '0'), +('13', '1', '13', '13400', '3048', '0'), +('13', '1', '14', '10219', '5681', '0'), +('13', '1', '14', '14759', '5262', '0'), +('13', '1', '14', '11625', '3514', '0'), +('13', '1', '14', '13987', '2260', '0'), +('13', '1', '11', '14762', '2204', '0'), +('13', '1', '11', '13353', '1500', '0'), +('13', '1', '11', '20677', '450', '0'), +('13', '1', '11', '9246', '133', '0'), +('13', '2', '22', '10323', '0', '0'), +('13', '2', '22', '9246', '0', '0'), +('13', '2', '22', '21509', '0', '0'), +('13', '2', '22', '8007', '0', '0'), +('13', '2', '1', '14702', '3750', '0'), +('13', '2', '1', '14701', '2862', '0'), +('13', '2', '1', '30361', '2640', '0'), +('13', '2', '1', '10321', '1000', '0'), +('13', '2', '2', '10143', '5368', '0'), +('13', '2', '2', '30363', '3700', '0'), +('13', '2', '2', '1239', '1648', '0'), +('13', '2', '2', '1211', '1569', '0'), +('13', '2', '3', '1212', '1342', '0'), +('13', '2', '3', '14705', '990', '0'), +('13', '2', '3', '14706', '990', '0'), +('13', '2', '3', '1642', '742', '0'), +('13', '2', '5', '14703', '6050', '0'), +('13', '2', '5', '14557', '5133', '0'), +('13', '2', '5', '14700', '3318', '0'), +('13', '2', '5', '30362', '3140', '0'), +('13', '2', '8', '11603', '8528', '0'), +('13', '2', '8', '2349', '3554', '0'), +('13', '2', '8', '1216', '1356', '0'), +('13', '2', '8', '1274', '1254', '0'), +('13', '2', '6', '2708', '5539', '0'), +('13', '2', '6', '1557', '5310', '0'), +('13', '2', '6', '1905', '5033', '0'), +('13', '2', '6', '1542', '3589', '0'), +('13', '2', '17', '1253', '10053', '0'), +('13', '2', '17', '1644', '8487', '0'), +('13', '2', '17', '11641', '5944', '0'), +('13', '2', '17', '1357', '5468', '0'), +('13', '2', '7', '1362', '2624', '0'), +('13', '2', '7', '1321', '1746', '0'), +('13', '2', '7', '1648', '945', '0'), +('13', '2', '7', '1241', '673', '0'), +('13', '2', '9', '12805', '4256', '0'), +('13', '2', '9', '4344', '2051', '0'), +('13', '2', '9', '1242', '2025', '0'), +('13', '2', '9', '10408', '2002', '0'), +('13', '2', '15', '11687', '3145', '0'), +('13', '2', '15', '10150', '3004', '0'), +('13', '2', '15', '10163', '2300', '0'), +('13', '2', '15', '14651', '2224', '0'), +('13', '2', '20', '11666', '8290', '0'), +('13', '2', '20', '2742', '5071', '0'), +('13', '2', '20', '1217', '1351', '0'), +('13', '2', '20', '1647', '1334', '0'), +('13', '2', '12', '2923', '3074', '0'), +('13', '2', '12', '20655', '2651', '0'), +('13', '2', '12', '1404', '2512', '0'), +('13', '2', '12', '1243', '1701', '0'), +('13', '2', '18', '4410', '1142', '0'), +('13', '2', '18', '1651', '1008', '0'), +('13', '2', '18', '1244', '586', '0'), +('13', '2', '18', '1221', '454', '0'), +('13', '2', '19', '1368', '2016', '0'), +('13', '2', '19', '68239', '1996', '0'), +('13', '2', '19', '1652', '1834', '0'), +('13', '2', '19', '1245', '512', '0'), +('13', '2', '13', '14759', '5333', '0'), +('13', '2', '13', '11650', '4533', '0'), +('13', '2', '13', '11625', '3516', '0'), +('13', '2', '13', '13400', '3097', '0'), +('13', '2', '14', '10219', '5681', '0'), +('13', '2', '14', '14759', '5333', '0'), +('13', '2', '14', '11625', '3516', '0'), +('13', '2', '14', '13987', '2321', '0'), +('13', '2', '11', '14762', '2204', '0'), +('13', '2', '11', '13353', '1500', '0'), +('13', '2', '11', '20677', '450', '0'), +('13', '2', '11', '9246', '254', '0'), +('13', '3', '22', '10323', '0', '0'), +('13', '3', '22', '9246', '0', '0'), +('13', '3', '22', '21509', '0', '0'), +('13', '3', '22', '8007', '0', '0'), +('13', '3', '1', '14702', '3750', '0'), +('13', '3', '1', '14701', '2862', '0'), +('13', '3', '1', '30361', '2640', '0'), +('13', '3', '1', '10321', '1000', '0'), +('13', '3', '2', '10143', '5368', '0'), +('13', '3', '2', '30363', '3700', '0'), +('13', '3', '2', '1239', '1756', '0'), +('13', '3', '2', '1211', '1654', '0'), +('13', '3', '3', '1212', '1354', '0'), +('13', '3', '3', '14705', '990', '0'), +('13', '3', '3', '14706', '990', '0'), +('13', '3', '3', '1642', '754', '0'), +('13', '3', '5', '14703', '6050', '0'), +('13', '3', '5', '14557', '5193', '0'), +('13', '3', '5', '14700', '3318', '0'), +('13', '3', '5', '30362', '3140', '0'), +('13', '3', '8', '11603', '8637', '0'), +('13', '3', '8', '2349', '3554', '0'), +('13', '3', '8', '1216', '1368', '0'), +('13', '3', '8', '1274', '1362', '0'), +('13', '3', '6', '2708', '5540', '0'), +('13', '3', '6', '1557', '5310', '0'), +('13', '3', '6', '1905', '5034', '0'), +('13', '3', '6', '1542', '3697', '0'), +('13', '3', '17', '1253', '10056', '0'), +('13', '3', '17', '1644', '8548', '0'), +('13', '3', '17', '11641', '6125', '0'), +('13', '3', '17', '1357', '5468', '0'), +('13', '3', '7', '1362', '2624', '0'), +('13', '3', '7', '1321', '1746', '0'), +('13', '3', '7', '1648', '1005', '0'), +('13', '3', '7', '1241', '758', '0'), +('13', '3', '9', '12805', '4256', '0'), +('13', '3', '9', '4344', '2051', '0'), +('13', '3', '9', '1242', '2025', '0'), +('13', '3', '9', '10408', '2002', '0'), +('13', '3', '15', '11687', '3205', '0'), +('13', '3', '15', '10150', '3004', '0'), +('13', '3', '15', '10163', '2300', '0'), +('13', '3', '15', '14651', '2224', '0'), +('13', '3', '20', '11666', '8292', '0'), +('13', '3', '20', '2742', '5074', '0'), +('13', '3', '20', '1217', '1363', '0'), +('13', '3', '20', '1647', '1334', '0'), +('13', '3', '12', '2923', '3074', '0'), +('13', '3', '12', '20655', '2675', '0'), +('13', '3', '12', '1404', '2512', '0'), +('13', '3', '12', '1243', '1786', '0'), +('13', '3', '18', '4410', '1142', '0'), +('13', '3', '18', '1651', '1044', '0'), +('13', '3', '18', '1244', '586', '0'), +('13', '3', '18', '1221', '454', '0'), +('13', '3', '19', '68239', '2032', '0'), +('13', '3', '19', '1368', '2016', '0'), +('13', '3', '19', '1652', '1834', '0'), +('13', '3', '19', '1245', '512', '0'), +('13', '3', '13', '14759', '5405', '0'), +('13', '3', '13', '11650', '4623', '0'), +('13', '3', '13', '11625', '3519', '0'), +('13', '3', '13', '13400', '3145', '0'), +('13', '3', '14', '10219', '5681', '0'), +('13', '3', '14', '14759', '5405', '0'), +('13', '3', '14', '11625', '3519', '0'), +('13', '3', '14', '13987', '2381', '0'), +('13', '3', '11', '14762', '2204', '0'), +('13', '3', '11', '13353', '1500', '0'), +('13', '3', '11', '20677', '450', '0'), +('13', '3', '11', '9246', '374', '0'), +('13', '4', '22', '10323', '0', '0'), +('13', '4', '22', '9246', '0', '0'), +('13', '4', '22', '21509', '0', '0'), +('13', '4', '22', '8007', '0', '0'), +('13', '4', '1', '14702', '3750', '0'), +('13', '4', '1', '14701', '2862', '0'), +('13', '4', '1', '30361', '2640', '0'), +('13', '4', '1', '10321', '1000', '0'), +('13', '4', '2', '10143', '5368', '0'), +('13', '4', '2', '30363', '3700', '0'), +('13', '4', '2', '1239', '1865', '0'), +('13', '4', '2', '1211', '1738', '0'), +('13', '4', '3', '1212', '1366', '0'), +('13', '4', '3', '14705', '990', '0'), +('13', '4', '3', '14706', '990', '0'), +('13', '4', '3', '1642', '766', '0'), +('13', '4', '5', '14703', '6050', '0'), +('13', '4', '5', '14557', '5254', '0'), +('13', '4', '5', '14700', '3318', '0'), +('13', '4', '5', '30362', '3140', '0'), +('13', '4', '8', '11603', '8745', '0'), +('13', '4', '8', '2349', '3554', '0'), +('13', '4', '8', '1274', '1471', '0'), +('13', '4', '8', '1216', '1380', '0'), +('13', '4', '6', '2708', '5541', '0'), +('13', '4', '6', '1557', '5310', '0'), +('13', '4', '6', '1905', '5035', '0'), +('13', '4', '6', '1542', '3806', '0'), +('13', '4', '17', '1253', '10058', '0'), +('13', '4', '17', '1644', '8608', '0'), +('13', '4', '17', '11641', '6306', '0'), +('13', '4', '17', '1357', '5468', '0'), +('13', '4', '7', '1362', '2624', '0'), +('13', '4', '7', '1321', '1746', '0'), +('13', '4', '7', '1648', '1066', '0'), +('13', '4', '7', '1241', '842', '0'), +('13', '4', '9', '12805', '4256', '0'), +('13', '4', '9', '4344', '2051', '0'), +('13', '4', '9', '1242', '2025', '0'), +('13', '4', '9', '10408', '2002', '0'), +('13', '4', '15', '11687', '3266', '0'), +('13', '4', '15', '10150', '3004', '0'), +('13', '4', '15', '10163', '2300', '0'), +('13', '4', '15', '14651', '2224', '0'), +('13', '4', '20', '11666', '8294', '0'), +('13', '4', '20', '2742', '5076', '0'), +('13', '4', '20', '1217', '1375', '0'), +('13', '4', '20', '1647', '1334', '0'), +('13', '4', '12', '2923', '3074', '0'), +('13', '4', '12', '20655', '2700', '0'), +('13', '4', '12', '1404', '2512', '0'), +('13', '4', '12', '1243', '1870', '0'), +('13', '4', '18', '4410', '1142', '0'), +('13', '4', '18', '1651', '1080', '0'), +('13', '4', '18', '1244', '586', '0'), +('13', '4', '18', '1221', '454', '0'), +('13', '4', '19', '68239', '2068', '0'), +('13', '4', '19', '1368', '2016', '0'), +('13', '4', '19', '1652', '1834', '0'), +('13', '4', '19', '1245', '512', '0'), +('13', '4', '13', '14759', '5476', '0'), +('13', '4', '13', '11650', '4714', '0'), +('13', '4', '13', '11625', '3521', '0'), +('13', '4', '13', '13400', '3193', '0'), +('13', '4', '14', '10219', '5681', '0'), +('13', '4', '14', '14759', '5476', '0'), +('13', '4', '14', '11625', '3521', '0'), +('13', '4', '14', '13987', '2442', '0'), +('13', '4', '11', '14762', '2204', '0'), +('13', '4', '11', '13353', '1500', '0'), +('13', '4', '11', '9246', '495', '0'), +('13', '4', '11', '20677', '450', '0'), +('13', '5', '22', '10323', '0', '0'), +('13', '5', '22', '9246', '0', '0'), +('13', '5', '22', '21509', '0', '0'), +('13', '5', '22', '8007', '0', '0'), +('13', '5', '1', '14702', '3750', '0'), +('13', '5', '1', '14701', '2862', '0'), +('13', '5', '1', '30361', '2640', '0'), +('13', '5', '1', '10321', '1000', '0'), +('13', '5', '2', '10143', '5368', '0'), +('13', '5', '2', '30363', '3700', '0'), +('13', '5', '2', '1239', '1974', '0'), +('13', '5', '2', '1211', '1823', '0'), +('13', '5', '3', '1212', '1379', '0'), +('13', '5', '3', '14705', '990', '0'), +('13', '5', '3', '14706', '990', '0'), +('13', '5', '3', '11052', '906', '0'), +('13', '5', '5', '14703', '6050', '0'), +('13', '5', '5', '14557', '5314', '0'), +('13', '5', '5', '14700', '3318', '0'), +('13', '5', '5', '30362', '3140', '0'), +('13', '5', '8', '11603', '8854', '0'), +('13', '5', '8', '2349', '3554', '0'), +('13', '5', '8', '1274', '1580', '0'), +('13', '5', '8', '1216', '1392', '0'), +('13', '5', '6', '2708', '5542', '0'), +('13', '5', '6', '1557', '5310', '0'), +('13', '5', '6', '1905', '5036', '0'), +('13', '5', '6', '1542', '3915', '0'), +('13', '5', '17', '1253', '10060', '0'), +('13', '5', '17', '1644', '8668', '0'), +('13', '5', '17', '11641', '6488', '0'), +('13', '5', '17', '1357', '5468', '0'), +('13', '5', '7', '1362', '2624', '0'), +('13', '5', '7', '1321', '1746', '0'), +('13', '5', '7', '1648', '1126', '0'), +('13', '5', '7', '1241', '927', '0'), +('13', '5', '9', '12805', '4256', '0'), +('13', '5', '9', '4344', '2051', '0'), +('13', '5', '9', '1242', '2025', '0'), +('13', '5', '9', '10408', '2002', '0'), +('13', '5', '15', '11687', '3326', '0'), +('13', '5', '15', '10150', '3004', '0'), +('13', '5', '15', '10163', '2300', '0'), +('13', '5', '15', '14651', '2224', '0'), +('13', '5', '20', '11666', '8295', '0'), +('13', '5', '20', '2742', '5079', '0'), +('13', '5', '20', '1217', '1387', '0'), +('13', '5', '20', '1647', '1334', '0'), +('13', '5', '12', '2923', '3074', '0'), +('13', '5', '12', '20655', '2725', '0'), +('13', '5', '12', '1404', '2512', '0'), +('13', '5', '12', '1243', '1955', '0'), +('13', '5', '18', '4410', '1142', '0'), +('13', '5', '18', '1651', '1116', '0'), +('13', '5', '18', '1244', '586', '0'), +('13', '5', '18', '1221', '454', '0'), +('13', '5', '19', '68239', '2105', '0'), +('13', '5', '19', '1368', '2016', '0'), +('13', '5', '19', '1652', '1834', '0'), +('13', '5', '19', '4407', '604', '0'), +('13', '5', '13', '14759', '5547', '0'), +('13', '5', '13', '11650', '4804', '0'), +('13', '5', '13', '11625', '3523', '0'), +('13', '5', '13', '13400', '3242', '0'), +('13', '5', '14', '10219', '5681', '0'), +('13', '5', '14', '14759', '5547', '0'), +('13', '5', '14', '11625', '3523', '0'), +('13', '5', '14', '13987', '2502', '0'), +('13', '5', '11', '14762', '2204', '0'), +('13', '5', '11', '13353', '1500', '0'), +('13', '5', '11', '9246', '616', '0'), +('13', '5', '11', '20677', '450', '0'), +('13', '6', '22', '10323', '0', '0'), +('13', '6', '22', '9246', '0', '0'), +('13', '6', '22', '21509', '0', '0'), +('13', '6', '22', '8007', '0', '0'), +('13', '6', '1', '14702', '3750', '0'), +('13', '6', '1', '14701', '2862', '0'), +('13', '6', '1', '30361', '2640', '0'), +('13', '6', '1', '10321', '1000', '0'), +('13', '6', '2', '10143', '5368', '0'), +('13', '6', '2', '30363', '3700', '0'), +('13', '6', '2', '1239', '2083', '0'), +('13', '6', '2', '1211', '1908', '0'), +('13', '6', '3', '1212', '1391', '0'), +('13', '6', '3', '11052', '1087', '0'), +('13', '6', '3', '14705', '990', '0'), +('13', '6', '3', '14706', '990', '0'), +('13', '6', '5', '14703', '6050', '0'), +('13', '6', '5', '14557', '5374', '0'), +('13', '6', '5', '14700', '3318', '0'), +('13', '6', '5', '30362', '3140', '0'), +('13', '6', '8', '11603', '8963', '0'), +('13', '6', '8', '2349', '3554', '0'), +('13', '6', '8', '1274', '1689', '0'), +('13', '6', '8', '1216', '1404', '0'), +('13', '6', '6', '2708', '5543', '0'), +('13', '6', '6', '1557', '5310', '0'), +('13', '6', '6', '1905', '5037', '0'), +('13', '6', '6', '1542', '4024', '0'), +('13', '6', '17', '1253', '10063', '0'), +('13', '6', '17', '1644', '8729', '0'), +('13', '6', '17', '11641', '6669', '0'), +('13', '6', '17', '1357', '5468', '0'), +('13', '6', '7', '1362', '2624', '0'), +('13', '6', '7', '1321', '1746', '0'), +('13', '6', '7', '1648', '1187', '0'), +('13', '6', '7', '1241', '1012', '0'), +('13', '6', '9', '12805', '4256', '0'), +('13', '6', '9', '4344', '2051', '0'), +('13', '6', '9', '1242', '2025', '0'), +('13', '6', '9', '10408', '2002', '0'), +('13', '6', '15', '11687', '3387', '0'), +('13', '6', '15', '10150', '3004', '0'), +('13', '6', '15', '10163', '2300', '0'), +('13', '6', '15', '14651', '2224', '0'), +('13', '6', '20', '11666', '8297', '0'), +('13', '6', '20', '2742', '5081', '0'), +('13', '6', '20', '1217', '1399', '0'), +('13', '6', '20', '1647', '1334', '0'), +('13', '6', '12', '2923', '3074', '0'), +('13', '6', '12', '20655', '2749', '0'), +('13', '6', '12', '1404', '2512', '0'), +('13', '6', '12', '1243', '2039', '0'), +('13', '6', '18', '1651', '1152', '0'), +('13', '6', '18', '4410', '1142', '0'), +('13', '6', '18', '1244', '586', '0'), +('13', '6', '18', '1221', '454', '0'), +('13', '6', '19', '68239', '2141', '0'), +('13', '6', '19', '1368', '2016', '0'), +('13', '6', '19', '1652', '1834', '0'), +('13', '6', '19', '4407', '713', '0'), +('13', '6', '13', '14759', '5619', '0'), +('13', '6', '13', '11650', '4895', '0'), +('13', '6', '13', '11625', '3525', '0'), +('13', '6', '13', '13400', '3290', '0'), +('13', '6', '14', '10219', '5681', '0'), +('13', '6', '14', '14759', '5619', '0'), +('13', '6', '14', '11625', '3525', '0'), +('13', '6', '14', '13987', '2562', '0'), +('13', '6', '11', '14762', '2204', '0'), +('13', '6', '11', '13353', '1500', '0'), +('13', '6', '11', '9246', '737', '0'), +('13', '6', '11', '20677', '450', '0'), +('13', '7', '22', '10323', '0', '0'), +('13', '7', '22', '9246', '0', '0'), +('13', '7', '22', '21509', '0', '0'), +('13', '7', '22', '8007', '0', '0'), +('13', '7', '1', '14702', '3750', '0'), +('13', '7', '1', '14701', '2862', '0'), +('13', '7', '1', '30361', '2640', '0'), +('13', '7', '1', '10321', '1000', '0'), +('13', '7', '2', '10143', '5368', '0'), +('13', '7', '2', '30363', '3700', '0'), +('13', '7', '2', '1239', '2191', '0'), +('13', '7', '2', '1211', '1992', '0'), +('13', '7', '3', '1212', '1403', '0'), +('13', '7', '3', '11052', '1268', '0'), +('13', '7', '3', '14705', '990', '0'), +('13', '7', '3', '14706', '990', '0'), +('13', '7', '5', '14703', '6050', '0'), +('13', '7', '5', '14557', '5435', '0'), +('13', '7', '5', '14700', '3318', '0'), +('13', '7', '5', '30362', '3140', '0'), +('13', '7', '8', '11603', '9071', '0'), +('13', '7', '8', '2349', '3554', '0'), +('13', '7', '8', '1274', '1797', '0'), +('13', '7', '8', '1216', '1416', '0'), +('13', '7', '6', '2708', '5545', '0'), +('13', '7', '6', '1557', '5310', '0'), +('13', '7', '6', '1905', '5039', '0'), +('13', '7', '6', '1542', '4132', '0'), +('13', '7', '17', '1253', '10065', '0'), +('13', '7', '17', '1644', '8789', '0'), +('13', '7', '17', '11641', '6850', '0'), +('13', '7', '17', '1357', '5468', '0'), +('13', '7', '7', '1362', '2624', '0'), +('13', '7', '7', '1321', '1746', '0'), +('13', '7', '7', '1648', '1247', '0'), +('13', '7', '7', '1241', '1096', '0'), +('13', '7', '9', '12805', '4256', '0'), +('13', '7', '9', '4344', '2051', '0'), +('13', '7', '9', '1242', '2025', '0'), +('13', '7', '9', '10408', '2002', '0'), +('13', '7', '15', '11687', '3447', '0'), +('13', '7', '15', '10150', '3004', '0'), +('13', '7', '15', '10163', '2300', '0'), +('13', '7', '15', '14651', '2224', '0'), +('13', '7', '20', '11666', '8299', '0'), +('13', '7', '20', '2742', '5083', '0'), +('13', '7', '20', '1217', '1411', '0'), +('13', '7', '20', '1647', '1334', '0'), +('13', '7', '12', '2923', '3074', '0'), +('13', '7', '12', '20655', '2774', '0'), +('13', '7', '12', '1404', '2512', '0'), +('13', '7', '12', '1243', '2124', '0'), +('13', '7', '18', '1651', '1189', '0'), +('13', '7', '18', '4410', '1142', '0'), +('13', '7', '18', '1244', '586', '0'), +('13', '7', '18', '1221', '454', '0'), +('13', '7', '19', '68239', '2177', '0'), +('13', '7', '19', '1368', '2016', '0'), +('13', '7', '19', '1652', '1834', '0'), +('13', '7', '19', '4407', '821', '0'), +('13', '7', '13', '14759', '5690', '0'), +('13', '7', '13', '11650', '4986', '0'), +('13', '7', '13', '11625', '3527', '0'), +('13', '7', '13', '13400', '3338', '0'), +('13', '7', '14', '14759', '5690', '0'), +('13', '7', '14', '10219', '5681', '0'), +('13', '7', '14', '11625', '3527', '0'), +('13', '7', '14', '13987', '2623', '0'), +('13', '7', '11', '14762', '2204', '0'), +('13', '7', '11', '13353', '1500', '0'), +('13', '7', '11', '9246', '858', '0'), +('13', '7', '11', '20677', '450', '0'), +('13', '8', '22', '10323', '0', '0'), +('13', '8', '22', '9246', '0', '0'), +('13', '8', '22', '21509', '0', '0'), +('13', '8', '22', '8007', '0', '0'), +('13', '8', '1', '14702', '3750', '0'), +('13', '8', '1', '14701', '2862', '0'), +('13', '8', '1', '30361', '2640', '0'), +('13', '8', '1', '10321', '1000', '0'), +('13', '8', '2', '10143', '5368', '0'), +('13', '8', '2', '30363', '3700', '0'), +('13', '8', '2', '1239', '2300', '0'), +('13', '8', '2', '1211', '2077', '0'), +('13', '8', '3', '11052', '1450', '0'), +('13', '8', '3', '1212', '1415', '0'), +('13', '8', '3', '14705', '990', '0'), +('13', '8', '3', '14706', '990', '0'), +('13', '8', '5', '14703', '6050', '0'), +('13', '8', '5', '14557', '5495', '0'), +('13', '8', '5', '14700', '3318', '0'), +('13', '8', '5', '30362', '3140', '0'), +('13', '8', '8', '11603', '9180', '0'), +('13', '8', '8', '2349', '3554', '0'), +('13', '8', '8', '1274', '1906', '0'), +('13', '8', '8', '1216', '1428', '0'), +('13', '8', '6', '2708', '5546', '0'), +('13', '8', '6', '1557', '5310', '0'), +('13', '8', '6', '1905', '5040', '0'), +('13', '8', '6', '1542', '4241', '0'), +('13', '8', '17', '1253', '10068', '0'), +('13', '8', '17', '1644', '8850', '0'), +('13', '8', '17', '11641', '7031', '0'), +('13', '8', '17', '1357', '5468', '0'), +('13', '8', '7', '1362', '2624', '0'), +('13', '8', '7', '1321', '1746', '0'), +('13', '8', '7', '1648', '1307', '0'), +('13', '8', '7', '1241', '1181', '0'), +('13', '8', '9', '12805', '4256', '0'), +('13', '8', '9', '4344', '2051', '0'), +('13', '8', '9', '1242', '2025', '0'), +('13', '8', '9', '10408', '2002', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '8', '15', '11687', '3507', '0'), +('13', '8', '15', '10150', '3004', '0'), +('13', '8', '15', '10163', '2300', '0'), +('13', '8', '15', '14651', '2224', '0'), +('13', '8', '20', '11666', '8300', '0'), +('13', '8', '20', '2742', '5086', '0'), +('13', '8', '20', '1217', '1423', '0'), +('13', '8', '20', '1647', '1334', '0'), +('13', '8', '12', '2923', '3074', '0'), +('13', '8', '12', '20655', '2799', '0'), +('13', '8', '12', '1404', '2512', '0'), +('13', '8', '12', '1243', '2208', '0'), +('13', '8', '18', '1651', '1225', '0'), +('13', '8', '18', '4410', '1142', '0'), +('13', '8', '18', '1244', '586', '0'), +('13', '8', '18', '1221', '454', '0'), +('13', '8', '19', '68239', '2213', '0'), +('13', '8', '19', '1368', '2016', '0'), +('13', '8', '19', '1652', '1834', '0'), +('13', '8', '19', '4407', '930', '0'), +('13', '8', '13', '14759', '5761', '0'), +('13', '8', '13', '11650', '5076', '0'), +('13', '8', '13', '11625', '3529', '0'), +('13', '8', '13', '13400', '3387', '0'), +('13', '8', '14', '14759', '5761', '0'), +('13', '8', '14', '10219', '5681', '0'), +('13', '8', '14', '11625', '3529', '0'), +('13', '8', '14', '9690', '2800', '0'), +('13', '8', '11', '14762', '2204', '0'), +('13', '8', '11', '13353', '1500', '0'), +('13', '8', '11', '9246', '978', '0'), +('13', '8', '11', '20677', '450', '0'), +('13', '9', '22', '10323', '0', '0'), +('13', '9', '22', '9246', '0', '0'), +('13', '9', '22', '21509', '0', '0'), +('13', '9', '22', '8007', '0', '0'), +('13', '9', '1', '14702', '3750', '0'), +('13', '9', '1', '14701', '2862', '0'), +('13', '9', '1', '30361', '2640', '0'), +('13', '9', '1', '10321', '1000', '0'), +('13', '9', '2', '10143', '5368', '0'), +('13', '9', '2', '30363', '3700', '0'), +('13', '9', '2', '1239', '2409', '0'), +('13', '9', '2', '1211', '2161', '0'), +('13', '9', '3', '11052', '1631', '0'), +('13', '9', '3', '1212', '1427', '0'), +('13', '9', '3', '14705', '990', '0'), +('13', '9', '3', '14706', '990', '0'), +('13', '9', '5', '14703', '6050', '0'), +('13', '9', '5', '14557', '5556', '0'), +('13', '9', '5', '14700', '3318', '0'), +('13', '9', '5', '30362', '3140', '0'), +('13', '9', '8', '11603', '9289', '0'), +('13', '9', '8', '2349', '3554', '0'), +('13', '9', '8', '1274', '2015', '0'), +('13', '9', '8', '1216', '1440', '0'), +('13', '9', '6', '2708', '5547', '0'), +('13', '9', '6', '1557', '5310', '0'), +('13', '9', '6', '1905', '5041', '0'), +('13', '9', '6', '1542', '4350', '0'), +('13', '9', '17', '1253', '10070', '0'), +('13', '9', '17', '1644', '8910', '0'), +('13', '9', '17', '11641', '7212', '0'), +('13', '9', '17', '1240', '5618', '0'), +('13', '9', '7', '1362', '2624', '0'), +('13', '9', '7', '1321', '1746', '0'), +('13', '9', '7', '1648', '1368', '0'), +('13', '9', '7', '1241', '1265', '0'), +('13', '9', '9', '12805', '4256', '0'), +('13', '9', '9', '4344', '2051', '0'), +('13', '9', '9', '1242', '2025', '0'), +('13', '9', '9', '1274', '2015', '0'), +('13', '9', '15', '11687', '3568', '0'), +('13', '9', '15', '10150', '3004', '0'), +('13', '9', '15', '10163', '2300', '0'), +('13', '9', '15', '14651', '2224', '0'), +('13', '9', '20', '11666', '8302', '0'), +('13', '9', '20', '2742', '5088', '0'), +('13', '9', '20', '1217', '1435', '0'), +('13', '9', '20', '1647', '1334', '0'), +('13', '9', '12', '2923', '3074', '0'), +('13', '9', '12', '20655', '2823', '0'), +('13', '9', '12', '1404', '2512', '0'), +('13', '9', '12', '1243', '2293', '0'), +('13', '9', '18', '1651', '1261', '0'), +('13', '9', '18', '4410', '1142', '0'), +('13', '9', '18', '1244', '586', '0'), +('13', '9', '18', '1221', '454', '0'), +('13', '9', '19', '68239', '2250', '0'), +('13', '9', '19', '1368', '2016', '0'), +('13', '9', '19', '1652', '1834', '0'), +('13', '9', '19', '4407', '1039', '0'), +('13', '9', '13', '14759', '5832', '0'), +('13', '9', '13', '11650', '5167', '0'), +('13', '9', '13', '11625', '3532', '0'), +('13', '9', '13', '13400', '3435', '0'), +('13', '9', '14', '14759', '5832', '0'), +('13', '9', '14', '10219', '5681', '0'), +('13', '9', '14', '11625', '3532', '0'), +('13', '9', '14', '9690', '3150', '0'), +('13', '9', '11', '14762', '2204', '0'), +('13', '9', '11', '13353', '1500', '0'), +('13', '9', '11', '9246', '1099', '0'), +('13', '9', '11', '20677', '450', '0'), +('13', '10', '22', '10323', '0', '0'), +('13', '10', '22', '9246', '0', '0'), +('13', '10', '22', '21509', '0', '0'), +('13', '10', '22', '8007', '0', '0'), +('13', '10', '1', '14702', '3750', '0'), +('13', '10', '1', '14701', '2862', '0'), +('13', '10', '1', '30361', '2640', '0'), +('13', '10', '1', '10321', '1000', '0'), +('13', '10', '2', '10143', '5368', '0'), +('13', '10', '2', '30363', '3700', '0'), +('13', '10', '2', '1239', '2517', '0'), +('13', '10', '2', '1211', '2246', '0'), +('13', '10', '3', '11052', '1812', '0'), +('13', '10', '3', '1212', '1439', '0'), +('13', '10', '3', '14705', '990', '0'), +('13', '10', '3', '14706', '990', '0'), +('13', '10', '5', '14703', '6050', '0'), +('13', '10', '5', '14557', '5616', '0'), +('13', '10', '5', '14700', '3318', '0'), +('13', '10', '5', '30362', '3140', '0'), +('13', '10', '8', '11603', '9398', '0'), +('13', '10', '8', '2349', '3554', '0'), +('13', '10', '8', '1274', '2123', '0'), +('13', '10', '8', '1216', '1452', '0'), +('13', '10', '6', '2708', '5548', '0'), +('13', '10', '6', '1557', '5310', '0'), +('13', '10', '6', '1905', '5042', '0'), +('13', '10', '6', '1542', '4458', '0'), +('13', '10', '17', '1253', '10072', '0'), +('13', '10', '17', '1644', '8970', '0'), +('13', '10', '17', '11641', '7394', '0'), +('13', '10', '17', '1240', '5790', '0'), +('13', '10', '7', '1362', '2624', '0'), +('13', '10', '7', '1321', '1746', '0'), +('13', '10', '7', '1648', '1428', '0'), +('13', '10', '7', '1241', '1350', '0'), +('13', '10', '9', '12805', '4256', '0'), +('13', '10', '9', '1274', '2123', '0'), +('13', '10', '9', '4344', '2051', '0'), +('13', '10', '9', '1242', '2025', '0'), +('13', '10', '15', '11687', '3628', '0'), +('13', '10', '15', '10150', '3004', '0'), +('13', '10', '15', '10163', '2300', '0'), +('13', '10', '15', '14651', '2224', '0'), +('13', '10', '20', '11666', '8304', '0'), +('13', '10', '20', '2742', '5091', '0'), +('13', '10', '20', '1217', '1447', '0'), +('13', '10', '20', '1647', '1334', '0'), +('13', '10', '12', '2923', '3074', '0'), +('13', '10', '12', '20655', '2848', '0'), +('13', '10', '12', '1404', '2512', '0'), +('13', '10', '12', '1243', '2378', '0'), +('13', '10', '18', '1651', '1297', '0'), +('13', '10', '18', '4410', '1142', '0'), +('13', '10', '18', '1244', '586', '0'), +('13', '10', '18', '1221', '454', '0'), +('13', '10', '19', '68239', '2286', '0'), +('13', '10', '19', '1368', '2016', '0'), +('13', '10', '19', '1652', '1834', '0'), +('13', '10', '19', '4407', '1147', '0'), +('13', '10', '13', '14759', '5904', '0'), +('13', '10', '13', '11650', '5257', '0'), +('13', '10', '13', '11625', '3534', '0'), +('13', '10', '13', '9690', '3500', '0'), +('13', '10', '14', '14759', '5904', '0'), +('13', '10', '14', '10219', '5681', '0'), +('13', '10', '14', '11625', '3534', '0'), +('13', '10', '14', '9690', '3500', '0'), +('13', '10', '11', '14762', '2204', '0'), +('13', '10', '11', '13353', '1500', '0'), +('13', '10', '11', '9246', '1220', '0'), +('13', '10', '11', '20677', '450', '0'), +('13', '11', '22', '10323', '0', '0'), +('13', '11', '22', '9246', '0', '0'), +('13', '11', '22', '21509', '0', '0'), +('13', '11', '22', '8007', '0', '0'), +('13', '11', '1', '14702', '3750', '0'), +('13', '11', '1', '14701', '2862', '0'), +('13', '11', '1', '30361', '2640', '0'), +('13', '11', '1', '10321', '1000', '0'), +('13', '11', '2', '10143', '5368', '0'), +('13', '11', '2', '30363', '3700', '0'), +('13', '11', '2', '1239', '2626', '0'), +('13', '11', '2', '1211', '2330', '0'), +('13', '11', '3', '11052', '1993', '0'), +('13', '11', '3', '1212', '1451', '0'), +('13', '11', '3', '14705', '990', '0'), +('13', '11', '3', '14706', '990', '0'), +('13', '11', '5', '14703', '6050', '0'), +('13', '11', '5', '14557', '5676', '0'), +('13', '11', '5', '14700', '3318', '0'), +('13', '11', '5', '30362', '3140', '0'), +('13', '11', '8', '11603', '9506', '0'), +('13', '11', '8', '2349', '3554', '0'), +('13', '11', '8', '1274', '2232', '0'), +('13', '11', '8', '1216', '1464', '0'), +('13', '11', '6', '2708', '5550', '0'), +('13', '11', '6', '1557', '5310', '0'), +('13', '11', '6', '1905', '5043', '0'), +('13', '11', '6', '1542', '4567', '0'), +('13', '11', '17', '1253', '10075', '0'), +('13', '11', '17', '1644', '9031', '0'), +('13', '11', '17', '11641', '7575', '0'), +('13', '11', '17', '1240', '5962', '0'), +('13', '11', '7', '1362', '2624', '0'), +('13', '11', '7', '1321', '1746', '0'), +('13', '11', '7', '1648', '1489', '0'), +('13', '11', '7', '1241', '1434', '0'), +('13', '11', '9', '12805', '4256', '0'), +('13', '11', '9', '1274', '2232', '0'), +('13', '11', '9', '4344', '2051', '0'), +('13', '11', '9', '1242', '2025', '0'), +('13', '11', '15', '11687', '3689', '0'), +('13', '11', '15', '10150', '3004', '0'), +('13', '11', '15', '10163', '2300', '0'), +('13', '11', '15', '14651', '2224', '0'), +('13', '11', '20', '11666', '8305', '0'), +('13', '11', '20', '2742', '5093', '0'), +('13', '11', '20', '1217', '1459', '0'), +('13', '11', '20', '1647', '1334', '0'), +('13', '11', '12', '2923', '3074', '0'), +('13', '11', '12', '20655', '2873', '0'), +('13', '11', '12', '1404', '2512', '0'), +('13', '11', '12', '1243', '2462', '0'), +('13', '11', '18', '1651', '1334', '0'), +('13', '11', '18', '4410', '1142', '0'), +('13', '11', '18', '1244', '586', '0'), +('13', '11', '18', '1221', '454', '0'), +('13', '11', '19', '68239', '2322', '0'), +('13', '11', '19', '1368', '2016', '0'), +('13', '11', '19', '1652', '1834', '0'), +('13', '11', '19', '4407', '1256', '0'), +('13', '11', '13', '14759', '5975', '0'), +('13', '11', '13', '11650', '5348', '0'), +('13', '11', '13', '11625', '3536', '0'), +('13', '11', '13', '13400', '3532', '0'), +('13', '11', '14', '14759', '5975', '0'), +('13', '11', '14', '10219', '5681', '0'), +('13', '11', '14', '11625', '3536', '0'), +('13', '11', '14', '9690', '3500', '0'), +('13', '11', '11', '14762', '2204', '0'), +('13', '11', '11', '13353', '1500', '0'), +('13', '11', '11', '9246', '1341', '0'), +('13', '11', '11', '20677', '450', '0'), +('13', '12', '22', '10323', '0', '0'), +('13', '12', '22', '9246', '0', '0'), +('13', '12', '22', '21509', '0', '0'), +('13', '12', '22', '8007', '0', '0'), +('13', '12', '1', '14702', '3750', '0'), +('13', '12', '1', '14701', '2862', '0'), +('13', '12', '1', '30361', '2640', '0'), +('13', '12', '1', '10321', '1000', '0'), +('13', '12', '2', '10143', '5368', '0'), +('13', '12', '2', '30363', '3700', '0'), +('13', '12', '2', '1239', '2735', '0'), +('13', '12', '2', '1211', '2415', '0'), +('13', '12', '3', '11052', '2174', '0'), +('13', '12', '3', '1212', '1463', '0'), +('13', '12', '3', '2707', '1047', '0'), +('13', '12', '3', '4505', '1045', '0'), +('13', '12', '5', '14703', '6050', '0'), +('13', '12', '5', '14557', '5737', '0'), +('13', '12', '5', '14700', '3318', '0'), +('13', '12', '5', '30362', '3140', '0'), +('13', '12', '8', '11603', '9615', '0'), +('13', '12', '8', '2349', '3554', '0'), +('13', '12', '8', '1274', '2341', '0'), +('13', '12', '8', '1216', '1476', '0'), +('13', '12', '6', '2708', '5551', '0'), +('13', '12', '6', '1557', '5310', '0'), +('13', '12', '6', '1905', '5045', '0'), +('13', '12', '6', '1542', '4676', '0'), +('13', '12', '17', '1253', '10077', '0'), +('13', '12', '17', '1644', '9091', '0'), +('13', '12', '17', '11641', '7756', '0'), +('13', '12', '17', '1240', '6134', '0'), +('13', '12', '7', '1362', '2624', '0'), +('13', '12', '7', '1321', '1746', '0'), +('13', '12', '7', '1648', '1549', '0'), +('13', '12', '7', '1241', '1519', '0'), +('13', '12', '9', '12805', '4256', '0'), +('13', '12', '9', '1274', '2341', '0'), +('13', '12', '9', '4344', '2051', '0'), +('13', '12', '9', '1242', '2025', '0'), +('13', '12', '15', '11687', '3749', '0'), +('13', '12', '15', '10150', '3004', '0'), +('13', '12', '15', '10163', '2300', '0'), +('13', '12', '15', '14651', '2224', '0'), +('13', '12', '20', '11666', '8307', '0'), +('13', '12', '20', '2742', '5095', '0'), +('13', '12', '20', '1217', '1472', '0'), +('13', '12', '20', '1647', '1334', '0'), +('13', '12', '12', '2923', '3074', '0'), +('13', '12', '12', '20655', '2897', '0'), +('13', '12', '12', '1243', '2547', '0'), +('13', '12', '12', '1404', '2512', '0'), +('13', '12', '18', '1651', '1370', '0'), +('13', '12', '18', '4410', '1142', '0'), +('13', '12', '18', '1244', '586', '0'), +('13', '12', '18', '1221', '454', '0'), +('13', '12', '19', '68239', '2358', '0'), +('13', '12', '19', '1368', '2016', '0'), +('13', '12', '19', '1652', '1834', '0'), +('13', '12', '19', '4407', '1365', '0'), +('13', '12', '13', '14759', '6046', '0'), +('13', '12', '13', '11650', '5439', '0'), +('13', '12', '13', '13400', '3580', '0'), +('13', '12', '13', '11625', '3538', '0'), +('13', '12', '14', '14759', '6046', '0'), +('13', '12', '14', '10219', '5681', '0'), +('13', '12', '14', '11625', '3538', '0'), +('13', '12', '14', '9690', '3500', '0'), +('13', '12', '11', '14762', '2204', '0'), +('13', '12', '11', '13353', '1500', '0'), +('13', '12', '11', '9246', '1462', '0'), +('13', '12', '11', '20677', '450', '0'), +('13', '13', '22', '10323', '0', '0'), +('13', '13', '22', '9246', '0', '0'), +('13', '13', '22', '21509', '0', '0'), +('13', '13', '22', '8007', '0', '0'), +('13', '13', '1', '14702', '3750', '0'), +('13', '13', '1', '14701', '2862', '0'), +('13', '13', '1', '30361', '2640', '0'), +('13', '13', '1', '10082', '1038', '0'), +('13', '13', '2', '10143', '5368', '0'), +('13', '13', '2', '30363', '3700', '0'), +('13', '13', '2', '1239', '2844', '0'), +('13', '13', '2', '1211', '2499', '0'), +('13', '13', '3', '11052', '2356', '0'), +('13', '13', '3', '1212', '1475', '0'), +('13', '13', '3', '2707', '1132', '0'), +('13', '13', '3', '4505', '1129', '0'), +('13', '13', '5', '14703', '6050', '0'), +('13', '13', '5', '14557', '5797', '0'), +('13', '13', '5', '14700', '3318', '0'), +('13', '13', '5', '30362', '3140', '0'), +('13', '13', '8', '11603', '9724', '0'), +('13', '13', '8', '2349', '3554', '0'), +('13', '13', '8', '1274', '2450', '0'), +('13', '13', '8', '1216', '1488', '0'), +('13', '13', '6', '2708', '5552', '0'), +('13', '13', '6', '1557', '5310', '0'), +('13', '13', '6', '1905', '5046', '0'), +('13', '13', '6', '1542', '4785', '0'), +('13', '13', '17', '1253', '10080', '0'), +('13', '13', '17', '1644', '9152', '0'), +('13', '13', '17', '11641', '7937', '0'), +('13', '13', '17', '1240', '6306', '0'), +('13', '13', '7', '1362', '2624', '0'), +('13', '13', '7', '1321', '1746', '0'), +('13', '13', '7', '1648', '1609', '0'), +('13', '13', '7', '1241', '1603', '0'), +('13', '13', '9', '12805', '4256', '0'), +('13', '13', '9', '1274', '2450', '0'), +('13', '13', '9', '4344', '2051', '0'), +('13', '13', '9', '1242', '2025', '0'), +('13', '13', '15', '11687', '3809', '0'), +('13', '13', '15', '10150', '3004', '0'), +('13', '13', '15', '10163', '2300', '0'), +('13', '13', '15', '14651', '2224', '0'), +('13', '13', '20', '11666', '8309', '0'), +('13', '13', '20', '2742', '5098', '0'), +('13', '13', '20', '1217', '1484', '0'), +('13', '13', '20', '1647', '1334', '0'), +('13', '13', '12', '2923', '3074', '0'), +('13', '13', '12', '20655', '2922', '0'), +('13', '13', '12', '1243', '2631', '0'), +('13', '13', '12', '1404', '2512', '0'), +('13', '13', '18', '1651', '1406', '0'), +('13', '13', '18', '4410', '1142', '0'), +('13', '13', '18', '1244', '586', '0'), +('13', '13', '18', '1221', '454', '0'), +('13', '13', '19', '68239', '2395', '0'), +('13', '13', '19', '1368', '2016', '0'), +('13', '13', '19', '1652', '1834', '0'), +('13', '13', '19', '4407', '1474', '0'), +('13', '13', '13', '14759', '6117', '0'), +('13', '13', '13', '11650', '5529', '0'), +('13', '13', '13', '13400', '3628', '0'), +('13', '13', '13', '11625', '3540', '0'), +('13', '13', '14', '14759', '6117', '0'), +('13', '13', '14', '10219', '5681', '0'), +('13', '13', '14', '11625', '3540', '0'), +('13', '13', '14', '9690', '3500', '0'), +('13', '13', '11', '14762', '2204', '0'), +('13', '13', '11', '9246', '1582', '0'), +('13', '13', '11', '13353', '1500', '0'), +('13', '13', '11', '20677', '450', '0'), +('13', '14', '22', '10323', '0', '0'), +('13', '14', '22', '9246', '0', '0'), +('13', '14', '22', '21509', '0', '0'), +('13', '14', '22', '8007', '0', '0'), +('13', '14', '1', '14702', '3750', '0'), +('13', '14', '1', '14701', '2862', '0'), +('13', '14', '1', '30361', '2640', '0'), +('13', '14', '1', '10082', '1111', '0'), +('13', '14', '2', '10143', '5368', '0'), +('13', '14', '2', '30363', '3700', '0'), +('13', '14', '2', '1239', '2952', '0'), +('13', '14', '2', '1211', '2584', '0'), +('13', '14', '3', '11052', '2537', '0'), +('13', '14', '3', '1212', '1487', '0'), +('13', '14', '3', '2707', '1216', '0'), +('13', '14', '3', '4505', '1214', '0'), +('13', '14', '5', '14703', '6050', '0'), +('13', '14', '5', '14557', '5858', '0'), +('13', '14', '5', '14700', '3318', '0'), +('13', '14', '5', '30362', '3140', '0'), +('13', '14', '8', '11603', '9832', '0'), +('13', '14', '8', '2349', '3554', '0'), +('13', '14', '8', '1274', '2558', '0'), +('13', '14', '8', '1216', '1501', '0'), +('13', '14', '6', '2708', '5553', '0'), +('13', '14', '6', '1557', '5310', '0'), +('13', '14', '6', '1905', '5047', '0'), +('13', '14', '6', '1542', '4893', '0'), +('13', '14', '17', '1253', '10082', '0'), +('13', '14', '17', '1644', '9212', '0'), +('13', '14', '17', '11641', '8118', '0'), +('13', '14', '17', '1240', '6478', '0'), +('13', '14', '7', '1362', '2624', '0'), +('13', '14', '7', '1321', '1746', '0'), +('13', '14', '7', '1241', '1688', '0'), +('13', '14', '7', '1648', '1670', '0'), +('13', '14', '9', '12805', '4256', '0'), +('13', '14', '9', '1274', '2558', '0'), +('13', '14', '9', '4344', '2051', '0'), +('13', '14', '9', '1242', '2025', '0'), +('13', '14', '15', '11687', '3870', '0'), +('13', '14', '15', '10150', '3004', '0'), +('13', '14', '15', '10163', '2300', '0'), +('13', '14', '15', '14651', '2224', '0'), +('13', '14', '20', '11666', '8311', '0'), +('13', '14', '20', '2742', '5100', '0'), +('13', '14', '20', '1217', '1496', '0'), +('13', '14', '20', '1647', '1334', '0'), +('13', '14', '12', '2923', '3074', '0'), +('13', '14', '12', '20655', '2946', '0'), +('13', '14', '12', '1243', '2716', '0'), +('13', '14', '12', '1404', '2512', '0'), +('13', '14', '18', '1651', '1442', '0'), +('13', '14', '18', '4410', '1142', '0'), +('13', '14', '18', '1244', '586', '0'), +('13', '14', '18', '1221', '454', '0'), +('13', '14', '19', '68239', '2431', '0'), +('13', '14', '19', '1368', '2016', '0'), +('13', '14', '19', '1652', '1834', '0'), +('13', '14', '19', '4407', '1582', '0'), +('13', '14', '13', '14759', '6189', '0'), +('13', '14', '13', '11650', '5620', '0'), +('13', '14', '13', '13400', '3676', '0'), +('13', '14', '13', '11625', '3542', '0'), +('13', '14', '14', '14759', '6189', '0'), +('13', '14', '14', '10219', '5681', '0'), +('13', '14', '14', '11625', '3542', '0'), +('13', '14', '14', '9690', '3500', '0'), +('13', '14', '11', '14762', '2204', '0'), +('13', '14', '11', '9246', '1703', '0'), +('13', '14', '11', '13353', '1500', '0'), +('13', '14', '11', '20677', '450', '0'), +('13', '15', '22', '10323', '0', '0'), +('13', '15', '22', '9246', '0', '0'), +('13', '15', '22', '21509', '0', '0'), +('13', '15', '22', '8007', '0', '0'), +('13', '15', '1', '14702', '3750', '0'), +('13', '15', '1', '14701', '2862', '0'), +('13', '15', '1', '30361', '2640', '0'), +('13', '15', '1', '10082', '1183', '0'), +('13', '15', '2', '10143', '5368', '0'), +('13', '15', '2', '30363', '3700', '0'), +('13', '15', '2', '1239', '3061', '0'), +('13', '15', '2', '1211', '2669', '0'), +('13', '15', '3', '11052', '2718', '0'), +('13', '15', '3', '1212', '1499', '0'), +('13', '15', '3', '2707', '1301', '0'), +('13', '15', '3', '4505', '1299', '0'), +('13', '15', '5', '14703', '6050', '0'), +('13', '15', '5', '14557', '5918', '0'), +('13', '15', '5', '14700', '3318', '0'), +('13', '15', '5', '30362', '3140', '0'), +('13', '15', '8', '11603', '9941', '0'), +('13', '15', '8', '2349', '3554', '0'), +('13', '15', '8', '1274', '2667', '0'), +('13', '15', '8', '1216', '1513', '0'), +('13', '15', '6', '2708', '5554', '0'), +('13', '15', '6', '1557', '5310', '0'), +('13', '15', '6', '1905', '5048', '0'), +('13', '15', '6', '1542', '5002', '0'), +('13', '15', '17', '1253', '10085', '0'), +('13', '15', '17', '1644', '9272', '0'), +('13', '15', '17', '11641', '8300', '0'), +('13', '15', '17', '1240', '6650', '0'), +('13', '15', '7', '1362', '2624', '0'), +('13', '15', '7', '1241', '1773', '0'), +('13', '15', '7', '1321', '1746', '0'), +('13', '15', '7', '1648', '1730', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '15', '9', '12805', '4256', '0'), +('13', '15', '9', '1274', '2667', '0'), +('13', '15', '9', '1649', '2062', '0'), +('13', '15', '9', '4344', '2051', '0'), +('13', '15', '15', '11687', '3930', '0'), +('13', '15', '15', '10150', '3004', '0'), +('13', '15', '15', '10163', '2300', '0'), +('13', '15', '15', '14651', '2224', '0'), +('13', '15', '20', '11666', '8312', '0'), +('13', '15', '20', '2742', '5103', '0'), +('13', '15', '20', '1217', '1508', '0'), +('13', '15', '20', '1647', '1334', '0'), +('13', '15', '12', '2923', '3074', '0'), +('13', '15', '12', '20655', '2971', '0'), +('13', '15', '12', '1243', '2800', '0'), +('13', '15', '12', '1404', '2512', '0'), +('13', '15', '18', '1651', '1479', '0'), +('13', '15', '18', '4410', '1142', '0'), +('13', '15', '18', '1244', '586', '0'), +('13', '15', '18', '1221', '454', '0'), +('13', '15', '19', '68239', '2467', '0'), +('13', '15', '19', '1368', '2016', '0'), +('13', '15', '19', '1652', '1834', '0'), +('13', '15', '19', '4407', '1691', '0'), +('13', '15', '13', '14759', '6260', '0'), +('13', '15', '13', '11650', '5710', '0'), +('13', '15', '13', '13400', '3725', '0'), +('13', '15', '13', '11625', '3545', '0'), +('13', '15', '14', '14759', '6260', '0'), +('13', '15', '14', '10219', '5681', '0'), +('13', '15', '14', '11625', '3545', '0'), +('13', '15', '14', '9690', '3500', '0'), +('13', '15', '11', '14762', '2204', '0'), +('13', '15', '11', '9246', '1824', '0'), +('13', '15', '11', '13353', '1500', '0'), +('13', '15', '11', '20677', '450', '0'), +('13', '16', '22', '10323', '0', '0'), +('13', '16', '22', '9246', '0', '0'), +('13', '16', '22', '21509', '0', '0'), +('13', '16', '22', '8007', '0', '0'), +('13', '16', '1', '14702', '3750', '0'), +('13', '16', '1', '14701', '2862', '0'), +('13', '16', '1', '30361', '2640', '0'), +('13', '16', '1', '10082', '1256', '0'), +('13', '16', '2', '10143', '5368', '0'), +('13', '16', '2', '30363', '3700', '0'), +('13', '16', '2', '1239', '3170', '0'), +('13', '16', '2', '1211', '2753', '0'), +('13', '16', '3', '11052', '2899', '0'), +('13', '16', '3', '1212', '1511', '0'), +('13', '16', '3', '2707', '1386', '0'), +('13', '16', '3', '4505', '1383', '0'), +('13', '16', '5', '14703', '6050', '0'), +('13', '16', '5', '14557', '5978', '0'), +('13', '16', '5', '14700', '3318', '0'), +('13', '16', '5', '30362', '3140', '0'), +('13', '16', '8', '11603', '10050', '0'), +('13', '16', '8', '2349', '3554', '0'), +('13', '16', '8', '1274', '2776', '0'), +('13', '16', '8', '1216', '1525', '0'), +('13', '16', '6', '2708', '5556', '0'), +('13', '16', '6', '1557', '5310', '0'), +('13', '16', '6', '1542', '5111', '0'), +('13', '16', '6', '1905', '5050', '0'), +('13', '16', '17', '1253', '10087', '0'), +('13', '16', '17', '1644', '9333', '0'), +('13', '16', '17', '11641', '8481', '0'), +('13', '16', '17', '1240', '6822', '0'), +('13', '16', '7', '1362', '2624', '0'), +('13', '16', '7', '1241', '1857', '0'), +('13', '16', '7', '1218', '1797', '0'), +('13', '16', '7', '1648', '1791', '0'), +('13', '16', '9', '12805', '4256', '0'), +('13', '16', '9', '1274', '2776', '0'), +('13', '16', '9', '1649', '2098', '0'), +('13', '16', '9', '4344', '2051', '0'), +('13', '16', '15', '11687', '3991', '0'), +('13', '16', '15', '10150', '3004', '0'), +('13', '16', '15', '10163', '2300', '0'), +('13', '16', '15', '14651', '2224', '0'), +('13', '16', '20', '11666', '8314', '0'), +('13', '16', '20', '2742', '5105', '0'), +('13', '16', '20', '1217', '1520', '0'), +('13', '16', '20', '1647', '1334', '0'), +('13', '16', '12', '2923', '3074', '0'), +('13', '16', '12', '20655', '2996', '0'), +('13', '16', '12', '1243', '2885', '0'), +('13', '16', '12', '1404', '2512', '0'), +('13', '16', '18', '1651', '1515', '0'), +('13', '16', '18', '4410', '1142', '0'), +('13', '16', '18', '1244', '586', '0'), +('13', '16', '18', '1221', '454', '0'), +('13', '16', '19', '68239', '2503', '0'), +('13', '16', '19', '1368', '2016', '0'), +('13', '16', '19', '1652', '1834', '0'), +('13', '16', '19', '4407', '1800', '0'), +('13', '16', '13', '14759', '6331', '0'), +('13', '16', '13', '11650', '5801', '0'), +('13', '16', '13', '13400', '3773', '0'), +('13', '16', '13', '11625', '3547', '0'), +('13', '16', '14', '14759', '6331', '0'), +('13', '16', '14', '10219', '5681', '0'), +('13', '16', '14', '11625', '3547', '0'), +('13', '16', '14', '9690', '3500', '0'), +('13', '16', '11', '14762', '2204', '0'), +('13', '16', '11', '9246', '1945', '0'), +('13', '16', '11', '13353', '1500', '0'), +('13', '16', '11', '20677', '450', '0'), +('13', '17', '22', '10323', '0', '0'), +('13', '17', '22', '9246', '0', '0'), +('13', '17', '22', '21509', '0', '0'), +('13', '17', '22', '8007', '0', '0'), +('13', '17', '1', '14702', '3750', '0'), +('13', '17', '1', '14701', '2862', '0'), +('13', '17', '1', '30361', '2640', '0'), +('13', '17', '1', '10082', '1328', '0'), +('13', '17', '2', '10143', '5368', '0'), +('13', '17', '2', '30363', '3700', '0'), +('13', '17', '2', '1239', '3278', '0'), +('13', '17', '2', '1211', '2838', '0'), +('13', '17', '3', '11052', '3080', '0'), +('13', '17', '3', '1212', '1523', '0'), +('13', '17', '3', '2707', '1470', '0'), +('13', '17', '3', '4505', '1468', '0'), +('13', '17', '5', '14703', '6050', '0'), +('13', '17', '5', '14557', '6039', '0'), +('13', '17', '5', '14700', '3318', '0'), +('13', '17', '5', '30362', '3140', '0'), +('13', '17', '8', '11603', '10159', '0'), +('13', '17', '8', '2349', '3554', '0'), +('13', '17', '8', '1274', '2884', '0'), +('13', '17', '8', '1216', '1537', '0'), +('13', '17', '6', '2708', '5557', '0'), +('13', '17', '6', '1557', '5310', '0'), +('13', '17', '6', '1542', '5220', '0'), +('13', '17', '6', '1905', '5051', '0'), +('13', '17', '17', '1253', '10089', '0'), +('13', '17', '17', '1644', '9393', '0'), +('13', '17', '17', '11641', '8662', '0'), +('13', '17', '17', '1240', '6994', '0'), +('13', '17', '7', '1362', '2624', '0'), +('13', '17', '7', '1241', '1942', '0'), +('13', '17', '7', '1218', '1882', '0'), +('13', '17', '7', '1648', '1851', '0'), +('13', '17', '9', '12805', '4256', '0'), +('13', '17', '9', '1274', '2884', '0'), +('13', '17', '9', '1649', '2134', '0'), +('13', '17', '9', '4344', '2051', '0'), +('13', '17', '15', '11687', '4051', '0'), +('13', '17', '15', '10150', '3004', '0'), +('13', '17', '15', '10163', '2300', '0'), +('13', '17', '15', '14651', '2224', '0'), +('13', '17', '20', '11666', '8316', '0'), +('13', '17', '20', '2742', '5108', '0'), +('13', '17', '20', '1217', '1532', '0'), +('13', '17', '20', '1647', '1334', '0'), +('13', '17', '12', '2923', '3074', '0'), +('13', '17', '12', '20655', '3020', '0'), +('13', '17', '12', '1243', '2970', '0'), +('13', '17', '12', '1404', '2512', '0'), +('13', '17', '18', '1651', '1551', '0'), +('13', '17', '18', '4410', '1142', '0'), +('13', '17', '18', '1244', '586', '0'), +('13', '17', '18', '1221', '454', '0'), +('13', '17', '19', '68239', '2540', '0'), +('13', '17', '19', '1368', '2016', '0'), +('13', '17', '19', '4407', '1908', '0'), +('13', '17', '19', '1652', '1834', '0'), +('13', '17', '13', '14759', '6403', '0'), +('13', '17', '13', '11650', '5892', '0'), +('13', '17', '13', '13400', '3821', '0'), +('13', '17', '13', '11625', '3549', '0'), +('13', '17', '14', '14759', '6403', '0'), +('13', '17', '14', '10219', '5681', '0'), +('13', '17', '14', '11625', '3549', '0'), +('13', '17', '14', '9690', '3500', '0'), +('13', '17', '11', '14762', '2204', '0'), +('13', '17', '11', '9246', '2066', '0'), +('13', '17', '11', '13353', '1500', '0'), +('13', '17', '11', '20677', '450', '0'), +('13', '18', '22', '10323', '0', '0'), +('13', '18', '22', '9246', '0', '0'), +('13', '18', '22', '21509', '0', '0'), +('13', '18', '22', '8007', '0', '0'), +('13', '18', '1', '14702', '3750', '0'), +('13', '18', '1', '14701', '2862', '0'), +('13', '18', '1', '30361', '2640', '0'), +('13', '18', '1', '10082', '1401', '0'), +('13', '18', '2', '10143', '5368', '0'), +('13', '18', '2', '30363', '3700', '0'), +('13', '18', '2', '1239', '3387', '0'), +('13', '18', '2', '1211', '2922', '0'), +('13', '18', '3', '11052', '3262', '0'), +('13', '18', '3', '2707', '1555', '0'), +('13', '18', '3', '4505', '1552', '0'), +('13', '18', '3', '1212', '1536', '0'), +('13', '18', '5', '14557', '6099', '0'), +('13', '18', '5', '14703', '6050', '0'), +('13', '18', '5', '14700', '3318', '0'), +('13', '18', '5', '30362', '3140', '0'), +('13', '18', '8', '11603', '10267', '0'), +('13', '18', '8', '2349', '3554', '0'), +('13', '18', '8', '1274', '2993', '0'), +('13', '18', '8', '1216', '1549', '0'), +('13', '18', '6', '2708', '5558', '0'), +('13', '18', '6', '1542', '5328', '0'), +('13', '18', '6', '1557', '5310', '0'), +('13', '18', '6', '1905', '5052', '0'), +('13', '18', '17', '1253', '10092', '0'), +('13', '18', '17', '1644', '9454', '0'), +('13', '18', '17', '11641', '8843', '0'), +('13', '18', '17', '1240', '7166', '0'), +('13', '18', '7', '1362', '2624', '0'), +('13', '18', '7', '1241', '2026', '0'), +('13', '18', '7', '1218', '1966', '0'), +('13', '18', '7', '1648', '1911', '0'), +('13', '18', '9', '12805', '4256', '0'), +('13', '18', '9', '1274', '2993', '0'), +('13', '18', '9', '1649', '2170', '0'), +('13', '18', '9', '4344', '2051', '0'), +('13', '18', '15', '11687', '4111', '0'), +('13', '18', '15', '10150', '3004', '0'), +('13', '18', '15', '10163', '2300', '0'), +('13', '18', '15', '14651', '2224', '0'), +('13', '18', '20', '11666', '8317', '0'), +('13', '18', '20', '2742', '5110', '0'), +('13', '18', '20', '1217', '1544', '0'), +('13', '18', '20', '1647', '1334', '0'), +('13', '18', '12', '2923', '3074', '0'), +('13', '18', '12', '1243', '3054', '0'), +('13', '18', '12', '20655', '3045', '0'), +('13', '18', '12', '1404', '2512', '0'), +('13', '18', '18', '1651', '1587', '0'), +('13', '18', '18', '4410', '1142', '0'), +('13', '18', '18', '1244', '586', '0'), +('13', '18', '18', '1221', '454', '0'), +('13', '18', '19', '68239', '2576', '0'), +('13', '18', '19', '4407', '2017', '0'), +('13', '18', '19', '1368', '2016', '0'), +('13', '18', '19', '1652', '1834', '0'), +('13', '18', '13', '14759', '6474', '0'), +('13', '18', '13', '11650', '5982', '0'), +('13', '18', '13', '13400', '3870', '0'), +('13', '18', '13', '11625', '3551', '0'), +('13', '18', '14', '14759', '6474', '0'), +('13', '18', '14', '10219', '5681', '0'), +('13', '18', '14', '11625', '3551', '0'), +('13', '18', '14', '9690', '3500', '0'), +('13', '18', '11', '14762', '2204', '0'), +('13', '18', '11', '9246', '2186', '0'), +('13', '18', '11', '13353', '1500', '0'), +('13', '18', '11', '20677', '450', '0'), +('13', '19', '22', '10323', '0', '0'), +('13', '19', '22', '9246', '0', '0'), +('13', '19', '22', '21509', '0', '0'), +('13', '19', '22', '8007', '0', '0'), +('13', '19', '1', '14702', '3750', '0'), +('13', '19', '1', '14701', '2862', '0'), +('13', '19', '1', '30361', '2640', '0'), +('13', '19', '1', '10082', '1473', '0'), +('13', '19', '2', '10143', '5368', '0'), +('13', '19', '2', '30363', '3700', '0'), +('13', '19', '2', '1239', '3496', '0'), +('13', '19', '2', '1211', '3007', '0'), +('13', '19', '3', '11052', '3443', '0'), +('13', '19', '3', '2707', '1639', '0'), +('13', '19', '3', '4505', '1637', '0'), +('13', '19', '3', '1212', '1548', '0'), +('13', '19', '5', '14557', '6160', '0'), +('13', '19', '5', '14703', '6050', '0'), +('13', '19', '5', '14700', '3318', '0'), +('13', '19', '5', '30362', '3140', '0'), +('13', '19', '8', '11603', '10376', '0'), +('13', '19', '8', '2349', '3554', '0'), +('13', '19', '8', '1274', '3102', '0'), +('13', '19', '8', '1216', '1561', '0'), +('13', '19', '6', '2708', '5559', '0'), +('13', '19', '6', '1542', '5437', '0'), +('13', '19', '6', '1557', '5310', '0'), +('13', '19', '6', '1905', '5053', '0'), +('13', '19', '17', '1253', '10094', '0'), +('13', '19', '17', '1644', '9514', '0'), +('13', '19', '17', '11641', '9024', '0'), +('13', '19', '17', '1240', '7338', '0'), +('13', '19', '7', '1362', '2624', '0'), +('13', '19', '7', '1241', '2111', '0'), +('13', '19', '7', '1218', '2051', '0'), +('13', '19', '7', '1648', '1972', '0'), +('13', '19', '9', '12805', '4256', '0'), +('13', '19', '9', '1274', '3102', '0'), +('13', '19', '9', '1649', '2207', '0'), +('13', '19', '9', '4344', '2051', '0'), +('13', '19', '15', '11687', '4172', '0'), +('13', '19', '15', '10150', '3004', '0'), +('13', '19', '15', '10163', '2300', '0'), +('13', '19', '15', '14651', '2224', '0'), +('13', '19', '20', '11666', '8319', '0'), +('13', '19', '20', '2742', '5112', '0'), +('13', '19', '20', '1217', '1556', '0'), +('13', '19', '20', '1647', '1334', '0'), +('13', '19', '12', '1243', '3139', '0'), +('13', '19', '12', '2923', '3074', '0'), +('13', '19', '12', '20655', '3070', '0'), +('13', '19', '12', '1404', '2512', '0'), +('13', '19', '18', '1651', '1624', '0'), +('13', '19', '18', '4410', '1142', '0'), +('13', '19', '18', '1244', '586', '0'), +('13', '19', '18', '1221', '454', '0'), +('13', '19', '19', '68239', '2612', '0'), +('13', '19', '19', '4407', '2126', '0'), +('13', '19', '19', '1368', '2016', '0'), +('13', '19', '19', '1652', '1834', '0'), +('13', '19', '13', '14759', '6545', '0'), +('13', '19', '13', '11650', '6073', '0'), +('13', '19', '13', '13400', '3918', '0'), +('13', '19', '13', '11625', '3553', '0'), +('13', '19', '14', '14759', '6545', '0'), +('13', '19', '14', '10219', '5681', '0'), +('13', '19', '14', '11625', '3553', '0'), +('13', '19', '14', '9690', '3500', '0'), +('13', '19', '11', '9246', '2307', '0'), +('13', '19', '11', '14762', '2204', '0'), +('13', '19', '11', '13353', '1500', '0'), +('13', '19', '11', '20677', '450', '0'), +('13', '20', '22', '10323', '0', '0'), +('13', '20', '22', '9246', '0', '0'), +('13', '20', '22', '21509', '0', '0'), +('13', '20', '22', '8007', '0', '0'), +('13', '20', '1', '14702', '3750', '0'), +('13', '20', '1', '14701', '2862', '0'), +('13', '20', '1', '30361', '2640', '0'), +('13', '20', '1', '10082', '1546', '0'), +('13', '20', '2', '10143', '5368', '0'), +('13', '20', '2', '30363', '3700', '0'), +('13', '20', '2', '1239', '3605', '0'), +('13', '20', '2', '1211', '3091', '0'), +('13', '20', '3', '11052', '3624', '0'), +('13', '20', '3', '2707', '1724', '0'), +('13', '20', '3', '4505', '1721', '0'), +('13', '20', '3', '1212', '1560', '0'), +('13', '20', '5', '14557', '6220', '0'), +('13', '20', '5', '14703', '6050', '0'), +('13', '20', '5', '14700', '3318', '0'), +('13', '20', '5', '30362', '3140', '0'), +('13', '20', '8', '11603', '10485', '0'), +('13', '20', '8', '2349', '3554', '0'), +('13', '20', '8', '1274', '3211', '0'), +('13', '20', '8', '1216', '1573', '0'), +('13', '20', '6', '2708', '5560', '0'), +('13', '20', '6', '1542', '5546', '0'), +('13', '20', '6', '1557', '5310', '0'), +('13', '20', '6', '1905', '5054', '0'), +('13', '20', '17', '1253', '10097', '0'), +('13', '20', '17', '1644', '9574', '0'), +('13', '20', '17', '11641', '9206', '0'), +('13', '20', '17', '1240', '7510', '0'), +('13', '20', '7', '1362', '2624', '0'), +('13', '20', '7', '1241', '2195', '0'), +('13', '20', '7', '1218', '2135', '0'), +('13', '20', '7', '1648', '2032', '0'), +('13', '20', '9', '12805', '4256', '0'), +('13', '20', '9', '1274', '3211', '0'), +('13', '20', '9', '1649', '2243', '0'), +('13', '20', '9', '4344', '2051', '0'), +('13', '20', '15', '11687', '4232', '0'), +('13', '20', '15', '10150', '3004', '0'), +('13', '20', '15', '10163', '2300', '0'), +('13', '20', '15', '14651', '2224', '0'), +('13', '20', '20', '11666', '8321', '0'), +('13', '20', '20', '2742', '5115', '0'), +('13', '20', '20', '1217', '1568', '0'), +('13', '20', '20', '1647', '1334', '0'), +('13', '20', '12', '1243', '3223', '0'), +('13', '20', '12', '20655', '3094', '0'), +('13', '20', '12', '2923', '3074', '0'), +('13', '20', '12', '1404', '2512', '0'), +('13', '20', '18', '1651', '1660', '0'), +('13', '20', '18', '4410', '1142', '0'), +('13', '20', '18', '1244', '586', '0'), +('13', '20', '18', '1221', '454', '0'), +('13', '20', '19', '68239', '2648', '0'), +('13', '20', '19', '4407', '2235', '0'), +('13', '20', '19', '1368', '2016', '0'), +('13', '20', '19', '1652', '1834', '0'), +('13', '20', '13', '14759', '6616', '0'), +('13', '20', '13', '11650', '6163', '0'), +('13', '20', '13', '13400', '3966', '0'), +('13', '20', '13', '11625', '3556', '0'), +('13', '20', '14', '14759', '6616', '0'), +('13', '20', '14', '10219', '5681', '0'), +('13', '20', '14', '11625', '3556', '0'), +('13', '20', '14', '9690', '3500', '0'), +('13', '20', '11', '9246', '2428', '0'), +('13', '20', '11', '14762', '2204', '0'), +('13', '20', '11', '13353', '1500', '0'), +('13', '20', '11', '20677', '450', '0'), +('13', '21', '22', '10323', '0', '0'), +('13', '21', '22', '9246', '0', '0'), +('13', '21', '22', '21509', '0', '0'), +('13', '21', '22', '8007', '0', '0'), +('13', '21', '1', '14702', '3750', '0'), +('13', '21', '1', '14701', '2862', '0'), +('13', '21', '1', '30361', '2640', '0'), +('13', '21', '1', '10082', '1618', '0'), +('13', '21', '2', '10143', '5368', '0'), +('13', '21', '2', '1239', '3713', '0'), +('13', '21', '2', '30363', '3700', '0'), +('13', '21', '2', '1211', '3176', '0'), +('13', '21', '3', '11052', '3805', '0'), +('13', '21', '3', '2707', '1808', '0'), +('13', '21', '3', '4505', '1806', '0'), +('13', '21', '3', '1212', '1572', '0'), +('13', '21', '5', '14557', '6280', '0'), +('13', '21', '5', '14703', '6050', '0'), +('13', '21', '5', '14700', '3318', '0'), +('13', '21', '5', '30362', '3140', '0'), +('13', '21', '8', '11603', '10594', '0'), +('13', '21', '8', '2349', '3554', '0'), +('13', '21', '8', '1274', '3319', '0'), +('13', '21', '8', '1216', '1585', '0'), +('13', '21', '6', '1542', '5654', '0'), +('13', '21', '6', '2708', '5562', '0'), +('13', '21', '6', '1557', '5310', '0'), +('13', '21', '6', '1905', '5056', '0'), +('13', '21', '17', '1253', '10099', '0'), +('13', '21', '17', '1644', '9635', '0'), +('13', '21', '17', '11641', '9387', '0'), +('13', '21', '17', '1240', '7682', '0'), +('13', '21', '7', '1362', '2624', '0'), +('13', '21', '7', '1241', '2280', '0'), +('13', '21', '7', '1218', '2220', '0'), +('13', '21', '7', '1648', '2093', '0'), +('13', '21', '9', '12805', '4256', '0'), +('13', '21', '9', '1274', '3319', '0'), +('13', '21', '9', '1649', '2279', '0'), +('13', '21', '9', '4344', '2051', '0'), +('13', '21', '15', '11687', '4293', '0'), +('13', '21', '15', '10150', '3004', '0'), +('13', '21', '15', '10163', '2300', '0'), +('13', '21', '15', '14651', '2224', '0'), +('13', '21', '20', '11666', '8322', '0'), +('13', '21', '20', '2742', '5117', '0'), +('13', '21', '20', '1217', '1580', '0'), +('13', '21', '20', '1647', '1334', '0'), +('13', '21', '12', '1243', '3308', '0'), +('13', '21', '12', '20655', '3119', '0'), +('13', '21', '12', '2923', '3074', '0'), +('13', '21', '12', '1404', '2512', '0'), +('13', '21', '18', '1651', '1696', '0'), +('13', '21', '18', '4410', '1142', '0'), +('13', '21', '18', '1244', '586', '0'), +('13', '21', '18', '1221', '454', '0'), +('13', '21', '19', '68239', '2684', '0'), +('13', '21', '19', '4407', '2343', '0'), +('13', '21', '19', '1368', '2016', '0'), +('13', '21', '19', '1652', '1834', '0'), +('13', '21', '13', '14759', '6688', '0'), +('13', '21', '13', '11650', '6254', '0'), +('13', '21', '13', '13400', '4015', '0'), +('13', '21', '13', '11625', '3558', '0'), +('13', '21', '14', '14759', '6688', '0'), +('13', '21', '14', '10219', '5681', '0'), +('13', '21', '14', '11625', '3558', '0'), +('13', '21', '14', '9690', '3500', '0'), +('13', '21', '11', '9246', '2549', '0'), +('13', '21', '11', '14762', '2204', '0'), +('13', '21', '11', '13353', '1500', '0'), +('13', '21', '11', '20677', '450', '0'), +('13', '22', '22', '10323', '0', '0'), +('13', '22', '22', '9246', '0', '0'), +('13', '22', '22', '21509', '0', '0'), +('13', '22', '22', '8007', '0', '0'), +('13', '22', '1', '14702', '3750', '0'), +('13', '22', '1', '14701', '2862', '0'), +('13', '22', '1', '30361', '2640', '0'), +('13', '22', '1', '10082', '1691', '0'), +('13', '22', '2', '10143', '5368', '0'), +('13', '22', '2', '1239', '3822', '0'), +('13', '22', '2', '30363', '3700', '0'), +('13', '22', '2', '1211', '3261', '0'), +('13', '22', '3', '11052', '3986', '0'), +('13', '22', '3', '2707', '1893', '0'), +('13', '22', '3', '4505', '1891', '0'), +('13', '22', '3', '1212', '1584', '0'), +('13', '22', '5', '14557', '6341', '0'), +('13', '22', '5', '14703', '6050', '0'), +('13', '22', '5', '14700', '3318', '0'), +('13', '22', '5', '30362', '3140', '0'), +('13', '22', '8', '11603', '10702', '0'), +('13', '22', '8', '2349', '3554', '0'), +('13', '22', '8', '1274', '3428', '0'), +('13', '22', '8', '1216', '1597', '0'), +('13', '22', '6', '1542', '5763', '0'), +('13', '22', '6', '2708', '5563', '0'), +('13', '22', '6', '1557', '5310', '0'), +('13', '22', '6', '1905', '5057', '0'), +('13', '22', '17', '1253', '10101', '0'), +('13', '22', '17', '1644', '9695', '0'), +('13', '22', '17', '11641', '9568', '0'), +('13', '22', '17', '1240', '7854', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '22', '7', '1362', '2624', '0'), +('13', '22', '7', '1241', '2364', '0'), +('13', '22', '7', '1218', '2304', '0'), +('13', '22', '7', '1648', '2153', '0'), +('13', '22', '9', '12805', '4256', '0'), +('13', '22', '9', '1274', '3428', '0'), +('13', '22', '9', '1649', '2315', '0'), +('13', '22', '9', '4344', '2051', '0'), +('13', '22', '15', '11687', '4353', '0'), +('13', '22', '15', '10150', '3004', '0'), +('13', '22', '15', '10163', '2300', '0'), +('13', '22', '15', '14651', '2224', '0'), +('13', '22', '20', '11666', '8324', '0'), +('13', '22', '20', '2742', '5120', '0'), +('13', '22', '20', '1217', '1592', '0'), +('13', '22', '20', '1647', '1334', '0'), +('13', '22', '12', '1243', '3392', '0'), +('13', '22', '12', '20655', '3144', '0'), +('13', '22', '12', '2923', '3074', '0'), +('13', '22', '12', '1404', '2512', '0'), +('13', '22', '18', '1651', '1732', '0'), +('13', '22', '18', '4410', '1142', '0'), +('13', '22', '18', '1244', '586', '0'), +('13', '22', '18', '1221', '454', '0'), +('13', '22', '19', '68239', '2721', '0'), +('13', '22', '19', '4407', '2452', '0'), +('13', '22', '19', '1368', '2016', '0'), +('13', '22', '19', '1652', '1834', '0'), +('13', '22', '13', '14759', '6759', '0'), +('13', '22', '13', '11650', '6345', '0'), +('13', '22', '13', '13400', '4063', '0'), +('13', '22', '13', '11625', '3560', '0'), +('13', '22', '14', '14759', '6759', '0'), +('13', '22', '14', '10219', '5681', '0'), +('13', '22', '14', '11625', '3560', '0'), +('13', '22', '14', '13987', '3529', '0'), +('13', '22', '11', '9246', '2670', '0'), +('13', '22', '11', '14762', '2204', '0'), +('13', '22', '11', '13353', '1500', '0'), +('13', '22', '11', '20677', '450', '0'), +('13', '23', '22', '10323', '0', '0'), +('13', '23', '22', '9246', '0', '0'), +('13', '23', '22', '21509', '0', '0'), +('13', '23', '22', '8007', '0', '0'), +('13', '23', '1', '14702', '3750', '0'), +('13', '23', '1', '14701', '2862', '0'), +('13', '23', '1', '30361', '2640', '0'), +('13', '23', '1', '10082', '1763', '0'), +('13', '23', '2', '10143', '5368', '0'), +('13', '23', '2', '1239', '3931', '0'), +('13', '23', '2', '30363', '3700', '0'), +('13', '23', '2', '1211', '3345', '0'), +('13', '23', '3', '11052', '4168', '0'), +('13', '23', '3', '2707', '1977', '0'), +('13', '23', '3', '4505', '1975', '0'), +('13', '23', '3', '1212', '1596', '0'), +('13', '23', '5', '14557', '6401', '0'), +('13', '23', '5', '14703', '6050', '0'), +('13', '23', '5', '14700', '3318', '0'), +('13', '23', '5', '30362', '3140', '0'), +('13', '23', '8', '11603', '10811', '0'), +('13', '23', '8', '2349', '3554', '0'), +('13', '23', '8', '1274', '3537', '0'), +('13', '23', '8', '1216', '1609', '0'), +('13', '23', '6', '1542', '5872', '0'), +('13', '23', '6', '2708', '5564', '0'), +('13', '23', '6', '1557', '5310', '0'), +('13', '23', '6', '1905', '5058', '0'), +('13', '23', '17', '1253', '10104', '0'), +('13', '23', '17', '1644', '9756', '0'), +('13', '23', '17', '11641', '9749', '0'), +('13', '23', '17', '1240', '8026', '0'), +('13', '23', '7', '1362', '2624', '0'), +('13', '23', '7', '1241', '2449', '0'), +('13', '23', '7', '1218', '2389', '0'), +('13', '23', '7', '1648', '2213', '0'), +('13', '23', '9', '12805', '4256', '0'), +('13', '23', '9', '1274', '3537', '0'), +('13', '23', '9', '1649', '2352', '0'), +('13', '23', '9', '4344', '2051', '0'), +('13', '23', '15', '11687', '4413', '0'), +('13', '23', '15', '10150', '3004', '0'), +('13', '23', '15', '10163', '2300', '0'), +('13', '23', '15', '14651', '2224', '0'), +('13', '23', '20', '11666', '8326', '0'), +('13', '23', '20', '2742', '5122', '0'), +('13', '23', '20', '1217', '1604', '0'), +('13', '23', '20', '1647', '1334', '0'), +('13', '23', '12', '1243', '3477', '0'), +('13', '23', '12', '20655', '3168', '0'), +('13', '23', '12', '2923', '3074', '0'), +('13', '23', '12', '1404', '2512', '0'), +('13', '23', '18', '1651', '1769', '0'), +('13', '23', '18', '4410', '1142', '0'), +('13', '23', '18', '1244', '586', '0'), +('13', '23', '18', '1221', '454', '0'), +('13', '23', '19', '68239', '2757', '0'), +('13', '23', '19', '4407', '2561', '0'), +('13', '23', '19', '1368', '2016', '0'), +('13', '23', '19', '1652', '1834', '0'), +('13', '23', '13', '14759', '6830', '0'), +('13', '23', '13', '11650', '6435', '0'), +('13', '23', '13', '13400', '4111', '0'), +('13', '23', '13', '6359', '3631', '0'), +('13', '23', '14', '14759', '6830', '0'), +('13', '23', '14', '10219', '5681', '0'), +('13', '23', '14', '6359', '3631', '0'), +('13', '23', '14', '13987', '3589', '0'), +('13', '23', '11', '9246', '2790', '0'), +('13', '23', '11', '14762', '2204', '0'), +('13', '23', '11', '13353', '1500', '0'), +('13', '23', '11', '20677', '450', '0'), +('13', '24', '22', '10323', '0', '0'), +('13', '24', '22', '9246', '0', '0'), +('13', '24', '22', '21509', '0', '0'), +('13', '24', '22', '8007', '0', '0'), +('13', '24', '1', '14702', '3750', '0'), +('13', '24', '1', '14701', '2862', '0'), +('13', '24', '1', '30361', '2640', '0'), +('13', '24', '1', '10082', '1836', '0'), +('13', '24', '2', '10143', '5368', '0'), +('13', '24', '2', '1239', '4039', '0'), +('13', '24', '2', '30363', '3700', '0'), +('13', '24', '2', '1211', '3430', '0'), +('13', '24', '3', '11052', '4349', '0'), +('13', '24', '3', '2707', '2062', '0'), +('13', '24', '3', '4505', '2060', '0'), +('13', '24', '3', '1212', '1608', '0'), +('13', '24', '5', '14557', '6462', '0'), +('13', '24', '5', '14703', '6050', '0'), +('13', '24', '5', '14700', '3318', '0'), +('13', '24', '5', '30362', '3140', '0'), +('13', '24', '8', '11603', '10920', '0'), +('13', '24', '8', '1274', '3646', '0'), +('13', '24', '8', '2349', '3554', '0'), +('13', '24', '8', '1057', '1648', '0'), +('13', '24', '6', '1542', '5981', '0'), +('13', '24', '6', '2708', '5565', '0'), +('13', '24', '6', '1557', '5310', '0'), +('13', '24', '6', '1905', '5059', '0'), +('13', '24', '17', '1253', '10106', '0'), +('13', '24', '17', '11641', '9930', '0'), +('13', '24', '17', '1644', '9816', '0'), +('13', '24', '17', '1240', '8198', '0'), +('13', '24', '7', '1362', '2624', '0'), +('13', '24', '7', '1241', '2534', '0'), +('13', '24', '7', '1218', '2474', '0'), +('13', '24', '7', '1648', '2274', '0'), +('13', '24', '9', '12805', '4256', '0'), +('13', '24', '9', '1274', '3646', '0'), +('13', '24', '9', '1649', '2388', '0'), +('13', '24', '9', '4344', '2051', '0'), +('13', '24', '15', '11687', '4474', '0'), +('13', '24', '15', '10150', '3004', '0'), +('13', '24', '15', '10163', '2300', '0'), +('13', '24', '15', '14651', '2224', '0'), +('13', '24', '20', '11666', '8327', '0'), +('13', '24', '20', '2742', '5124', '0'), +('13', '24', '20', '1217', '1616', '0'), +('13', '24', '20', '1647', '1334', '0'), +('13', '24', '12', '1243', '3561', '0'), +('13', '24', '12', '20655', '3193', '0'), +('13', '24', '12', '2923', '3074', '0'), +('13', '24', '12', '1404', '2512', '0'), +('13', '24', '18', '1651', '1805', '0'), +('13', '24', '18', '4410', '1142', '0'), +('13', '24', '18', '1244', '586', '0'), +('13', '24', '18', '1221', '454', '0'), +('13', '24', '19', '68239', '2793', '0'), +('13', '24', '19', '4407', '2669', '0'), +('13', '24', '19', '1368', '2016', '0'), +('13', '24', '19', '1652', '1834', '0'), +('13', '24', '13', '14759', '6901', '0'), +('13', '24', '13', '11650', '6526', '0'), +('13', '24', '13', '13400', '4160', '0'), +('13', '24', '13', '6359', '3752', '0'), +('13', '24', '14', '14759', '6901', '0'), +('13', '24', '14', '10219', '5681', '0'), +('13', '24', '14', '6359', '3752', '0'), +('13', '24', '14', '13987', '3650', '0'), +('13', '24', '11', '9246', '2911', '0'), +('13', '24', '11', '14762', '2204', '0'), +('13', '24', '11', '13353', '1500', '0'), +('13', '24', '11', '20677', '450', '0'), +('13', '25', '22', '10323', '0', '0'), +('13', '25', '22', '9246', '0', '0'), +('13', '25', '22', '21509', '0', '0'), +('13', '25', '22', '8007', '0', '0'), +('13', '25', '1', '14702', '3750', '0'), +('13', '25', '1', '14701', '2862', '0'), +('13', '25', '1', '30361', '2640', '0'), +('13', '25', '1', '10082', '1908', '0'), +('13', '25', '2', '10143', '5368', '0'), +('13', '25', '2', '1239', '4148', '0'), +('13', '25', '2', '30363', '3700', '0'), +('13', '25', '2', '1211', '3514', '0'), +('13', '25', '3', '11052', '4530', '0'), +('13', '25', '3', '2707', '2147', '0'), +('13', '25', '3', '4505', '2144', '0'), +('13', '25', '3', '1212', '1620', '0'), +('13', '25', '5', '14557', '6522', '0'), +('13', '25', '5', '14703', '6050', '0'), +('13', '25', '5', '14700', '3318', '0'), +('13', '25', '5', '11646', '3226', '0'), +('13', '25', '8', '11603', '11028', '0'), +('13', '25', '8', '1274', '3754', '0'), +('13', '25', '8', '2349', '3554', '0'), +('13', '25', '8', '1057', '1708', '0'), +('13', '25', '6', '1542', '6089', '0'), +('13', '25', '6', '2708', '5566', '0'), +('13', '25', '6', '1557', '5310', '0'), +('13', '25', '6', '1905', '5060', '0'), +('13', '25', '17', '11641', '10112', '0'), +('13', '25', '17', '1253', '10109', '0'), +('13', '25', '17', '1644', '9876', '0'), +('13', '25', '17', '1240', '8370', '0'), +('13', '25', '7', '1362', '2624', '0'), +('13', '25', '7', '1241', '2618', '0'), +('13', '25', '7', '1218', '2558', '0'), +('13', '25', '7', '1648', '2334', '0'), +('13', '25', '9', '12805', '4256', '0'), +('13', '25', '9', '1274', '3754', '0'), +('13', '25', '9', '1649', '2424', '0'), +('13', '25', '9', '4344', '2051', '0'), +('13', '25', '15', '11687', '4534', '0'), +('13', '25', '15', '10150', '3004', '0'), +('13', '25', '15', '10163', '2300', '0'), +('13', '25', '15', '14651', '2224', '0'), +('13', '25', '20', '11666', '8329', '0'), +('13', '25', '20', '2742', '5127', '0'), +('13', '25', '20', '1217', '1629', '0'), +('13', '25', '20', '1647', '1334', '0'), +('13', '25', '12', '1243', '3646', '0'), +('13', '25', '12', '20655', '3218', '0'), +('13', '25', '12', '2923', '3074', '0'), +('13', '25', '12', '2336', '2522', '0'), +('13', '25', '18', '1651', '1841', '0'), +('13', '25', '18', '4410', '1142', '0'), +('13', '25', '18', '1244', '586', '0'), +('13', '25', '18', '1221', '454', '0'), +('13', '25', '19', '68239', '2829', '0'), +('13', '25', '19', '4407', '2778', '0'), +('13', '25', '19', '1368', '2016', '0'), +('13', '25', '19', '1652', '1834', '0'), +('13', '25', '13', '14759', '6973', '0'), +('13', '25', '13', '11650', '6616', '0'), +('13', '25', '13', '13400', '4208', '0'), +('13', '25', '13', '6359', '3873', '0'), +('13', '25', '14', '14759', '6973', '0'), +('13', '25', '14', '10219', '5681', '0'), +('13', '25', '14', '6359', '3873', '0'), +('13', '25', '14', '13987', '3710', '0'), +('13', '25', '11', '9246', '3032', '0'), +('13', '25', '11', '14762', '2204', '0'), +('13', '25', '11', '13353', '1500', '0'), +('13', '25', '11', '20677', '450', '0'), +('13', '26', '22', '10323', '0', '0'), +('13', '26', '22', '9246', '0', '0'), +('13', '26', '22', '21509', '0', '0'), +('13', '26', '22', '8007', '0', '0'), +('13', '26', '1', '14702', '3750', '0'), +('13', '26', '1', '14701', '2862', '0'), +('13', '26', '1', '30361', '2640', '0'), +('13', '26', '1', '10082', '1981', '0'), +('13', '26', '2', '10143', '5368', '0'), +('13', '26', '2', '1239', '4257', '0'), +('13', '26', '2', '30363', '3700', '0'), +('13', '26', '2', '1211', '3599', '0'), +('13', '26', '3', '11052', '4711', '0'), +('13', '26', '3', '2707', '2231', '0'), +('13', '26', '3', '4505', '2229', '0'), +('13', '26', '3', '1212', '1632', '0'), +('13', '26', '5', '14557', '6582', '0'), +('13', '26', '5', '14703', '6050', '0'), +('13', '26', '5', '11646', '3383', '0'), +('13', '26', '5', '14700', '3318', '0'), +('13', '26', '8', '11603', '11137', '0'), +('13', '26', '8', '1274', '3863', '0'), +('13', '26', '8', '2349', '3554', '0'), +('13', '26', '8', '1057', '1769', '0'), +('13', '26', '6', '1542', '6198', '0'), +('13', '26', '6', '2708', '5568', '0'), +('13', '26', '6', '1557', '5310', '0'), +('13', '26', '6', '1905', '5062', '0'), +('13', '26', '17', '11641', '10293', '0'), +('13', '26', '17', '1253', '10111', '0'), +('13', '26', '17', '1644', '9937', '0'), +('13', '26', '17', '1240', '8542', '0'), +('13', '26', '7', '1241', '2703', '0'), +('13', '26', '7', '1218', '2643', '0'), +('13', '26', '7', '1362', '2624', '0'), +('13', '26', '7', '1648', '2395', '0'), +('13', '26', '9', '12805', '4256', '0'), +('13', '26', '9', '1274', '3863', '0'), +('13', '26', '9', '1649', '2460', '0'), +('13', '26', '9', '4344', '2051', '0'), +('13', '26', '15', '11687', '4595', '0'), +('13', '26', '15', '10150', '3004', '0'), +('13', '26', '15', '10163', '2300', '0'), +('13', '26', '15', '14651', '2224', '0'), +('13', '26', '20', '11666', '8331', '0'), +('13', '26', '20', '2742', '5129', '0'), +('13', '26', '20', '1217', '1641', '0'), +('13', '26', '20', '1364', '1348', '0'), +('13', '26', '12', '1243', '3731', '0'), +('13', '26', '12', '20655', '3242', '0'), +('13', '26', '12', '2923', '3074', '0'), +('13', '26', '12', '2336', '2582', '0'), +('13', '26', '18', '1651', '1877', '0'), +('13', '26', '18', '4410', '1142', '0'), +('13', '26', '18', '1244', '586', '0'), +('13', '26', '18', '1221', '454', '0'), +('13', '26', '19', '4407', '2887', '0'), +('13', '26', '19', '68239', '2866', '0'), +('13', '26', '19', '1368', '2016', '0'), +('13', '26', '19', '1652', '1834', '0'), +('13', '26', '13', '14759', '7044', '0'), +('13', '26', '13', '11650', '6707', '0'), +('13', '26', '13', '13400', '4256', '0'), +('13', '26', '13', '6359', '3994', '0'), +('13', '26', '14', '14759', '7044', '0'), +('13', '26', '14', '10219', '5681', '0'), +('13', '26', '14', '6359', '3994', '0'), +('13', '26', '14', '13987', '3770', '0'), +('13', '26', '11', '9246', '3153', '0'), +('13', '26', '11', '14762', '2204', '0'), +('13', '26', '11', '13353', '1500', '0'), +('13', '26', '11', '20677', '450', '0'), +('13', '27', '22', '10323', '0', '0'), +('13', '27', '22', '9246', '0', '0'), +('13', '27', '22', '21509', '0', '0'), +('13', '27', '22', '8007', '0', '0'), +('13', '27', '1', '14702', '3750', '0'), +('13', '27', '1', '14701', '2862', '0'), +('13', '27', '1', '30361', '2640', '0'), +('13', '27', '1', '10082', '2053', '0'), +('13', '27', '2', '10143', '5368', '0'), +('13', '27', '2', '1239', '4366', '0'), +('13', '27', '2', '30363', '3700', '0'), +('13', '27', '2', '1211', '3683', '0'), +('13', '27', '3', '11052', '4892', '0'), +('13', '27', '3', '2707', '2316', '0'), +('13', '27', '3', '4505', '2313', '0'), +('13', '27', '3', '1212', '1644', '0'), +('13', '27', '5', '14557', '6643', '0'), +('13', '27', '5', '14703', '6050', '0'), +('13', '27', '5', '11646', '3540', '0'), +('13', '27', '5', '14700', '3318', '0'), +('13', '27', '8', '11603', '11246', '0'), +('13', '27', '8', '1274', '3972', '0'), +('13', '27', '8', '2349', '3554', '0'), +('13', '27', '8', '1057', '1829', '0'), +('13', '27', '6', '1542', '6307', '0'), +('13', '27', '6', '2708', '5569', '0'), +('13', '27', '6', '1557', '5310', '0'), +('13', '27', '6', '1905', '5063', '0'), +('13', '27', '17', '11641', '10474', '0'), +('13', '27', '17', '1253', '10114', '0'), +('13', '27', '17', '1644', '9997', '0'), +('13', '27', '17', '1240', '8714', '0'), +('13', '27', '7', '1241', '2787', '0'), +('13', '27', '7', '1218', '2727', '0'), +('13', '27', '7', '1362', '2624', '0'), +('13', '27', '7', '1648', '2455', '0'), +('13', '27', '9', '12805', '4256', '0'), +('13', '27', '9', '1274', '3972', '0'), +('13', '27', '9', '1649', '2497', '0'), +('13', '27', '9', '4344', '2051', '0'), +('13', '27', '15', '11687', '4655', '0'), +('13', '27', '15', '10150', '3004', '0'), +('13', '27', '15', '10163', '2300', '0'), +('13', '27', '15', '14651', '2224', '0'), +('13', '27', '20', '11666', '8333', '0'), +('13', '27', '20', '2742', '5132', '0'), +('13', '27', '20', '1217', '1653', '0'), +('13', '27', '20', '1364', '1397', '0'), +('13', '27', '12', '1243', '3815', '0'), +('13', '27', '12', '20655', '3267', '0'), +('13', '27', '12', '2923', '3074', '0'), +('13', '27', '12', '2336', '2643', '0'), +('13', '27', '18', '1651', '1914', '0'), +('13', '27', '18', '4410', '1142', '0'), +('13', '27', '18', '1244', '586', '0'), +('13', '27', '18', '1221', '454', '0'), +('13', '27', '19', '4407', '2996', '0'), +('13', '27', '19', '68239', '2902', '0'), +('13', '27', '19', '1368', '2016', '0'), +('13', '27', '19', '1652', '1834', '0'), +('13', '27', '13', '14759', '7115', '0'), +('13', '27', '13', '11650', '6798', '0'), +('13', '27', '13', '13400', '4305', '0'), +('13', '27', '13', '6359', '4115', '0'), +('13', '27', '14', '14759', '7115', '0'), +('13', '27', '14', '10219', '5681', '0'), +('13', '27', '14', '6359', '4115', '0'), +('13', '27', '14', '13987', '3831', '0'), +('13', '27', '11', '9246', '3274', '0'), +('13', '27', '11', '14762', '2204', '0'), +('13', '27', '11', '13353', '1500', '0'), +('13', '27', '11', '20677', '450', '0'), +('13', '28', '22', '10323', '0', '0'), +('13', '28', '22', '9246', '0', '0'), +('13', '28', '22', '21509', '0', '0'), +('13', '28', '22', '8007', '0', '0'), +('13', '28', '1', '14702', '3750', '0'), +('13', '28', '1', '14701', '2862', '0'), +('13', '28', '1', '30361', '2640', '0'), +('13', '28', '1', '10082', '2126', '0'), +('13', '28', '2', '10143', '5368', '0'), +('13', '28', '2', '1239', '4474', '0'), +('13', '28', '2', '1211', '3768', '0'), +('13', '28', '2', '30363', '3700', '0'), +('13', '28', '3', '11052', '5074', '0'), +('13', '28', '3', '2707', '2400', '0'), +('13', '28', '3', '4505', '2398', '0'), +('13', '28', '3', '1212', '1656', '0'), +('13', '28', '5', '14557', '6703', '0'), +('13', '28', '5', '14703', '6050', '0'), +('13', '28', '5', '11646', '3697', '0'), +('13', '28', '5', '14700', '3318', '0'), +('13', '28', '8', '11603', '11355', '0'), +('13', '28', '8', '1274', '4080', '0'), +('13', '28', '8', '2349', '3554', '0'), +('13', '28', '8', '1057', '1890', '0'), +('13', '28', '6', '1542', '6415', '0'), +('13', '28', '6', '2708', '5570', '0'), +('13', '28', '6', '1557', '5310', '0'), +('13', '28', '6', '1905', '5064', '0'), +('13', '28', '17', '11641', '10655', '0'), +('13', '28', '17', '1253', '10116', '0'), +('13', '28', '17', '1644', '10058', '0'), +('13', '28', '17', '1240', '8886', '0'), +('13', '28', '7', '1241', '2872', '0'), +('13', '28', '7', '1218', '2812', '0'), +('13', '28', '7', '1362', '2624', '0'), +('13', '28', '7', '1648', '2515', '0'), +('13', '28', '9', '12805', '4256', '0'), +('13', '28', '9', '1274', '4080', '0'), +('13', '28', '9', '1649', '2533', '0'), +('13', '28', '9', '4344', '2051', '0'), +('13', '28', '15', '11687', '4715', '0'), +('13', '28', '15', '10150', '3004', '0'), +('13', '28', '15', '10163', '2300', '0'), +('13', '28', '15', '14651', '2224', '0'), +('13', '28', '20', '11666', '8334', '0'), +('13', '28', '20', '2742', '5134', '0'), +('13', '28', '20', '1217', '1665', '0'), +('13', '28', '20', '1364', '1445', '0'), +('13', '28', '12', '1243', '3900', '0'), +('13', '28', '12', '20655', '3291', '0'), +('13', '28', '12', '2923', '3074', '0'), +('13', '28', '12', '2336', '2703', '0'), +('13', '28', '18', '1651', '1950', '0'), +('13', '28', '18', '4410', '1142', '0'), +('13', '28', '18', '1244', '586', '0'), +('13', '28', '18', '1221', '454', '0'), +('13', '28', '19', '4407', '3104', '0'), +('13', '28', '19', '68239', '2938', '0'), +('13', '28', '19', '1368', '2016', '0'), +('13', '28', '19', '1652', '1834', '0'), +('13', '28', '13', '14759', '7187', '0'), +('13', '28', '13', '11650', '6888', '0'), +('13', '28', '13', '13400', '4353', '0'), +('13', '28', '13', '6359', '4235', '0'), +('13', '28', '14', '14759', '7187', '0'), +('13', '28', '14', '10219', '5681', '0'), +('13', '28', '14', '6359', '4235', '0'), +('13', '28', '14', '13987', '3891', '0'), +('13', '28', '11', '9246', '3394', '0'), +('13', '28', '11', '14762', '2204', '0'), +('13', '28', '11', '13353', '1500', '0'), +('13', '28', '11', '20677', '450', '0'), +('13', '29', '22', '10323', '0', '0'), +('13', '29', '22', '9246', '0', '0'), +('13', '29', '22', '21509', '0', '0'), +('13', '29', '22', '8007', '0', '0'), +('13', '29', '1', '14702', '3750', '0'), +('13', '29', '1', '14701', '2862', '0'), +('13', '29', '1', '30361', '2640', '0'), +('13', '29', '1', '10082', '2198', '0'), +('13', '29', '2', '10143', '5368', '0'), +('13', '29', '2', '1239', '4583', '0'), +('13', '29', '2', '1211', '3852', '0'), +('13', '29', '2', '30363', '3700', '0'), +('13', '29', '3', '11052', '5255', '0'), +('13', '29', '3', '2707', '2485', '0'), +('13', '29', '3', '4505', '2482', '0'), +('13', '29', '3', '1212', '1668', '0'), +('13', '29', '5', '14557', '6764', '0'), +('13', '29', '5', '14703', '6050', '0'), +('13', '29', '5', '11646', '3854', '0'), +('13', '29', '5', '14700', '3318', '0'), +('13', '29', '8', '11603', '11463', '0'), +('13', '29', '8', '1274', '4189', '0'), +('13', '29', '8', '2349', '3554', '0'), +('13', '29', '8', '1057', '1950', '0'), +('13', '29', '6', '1542', '6524', '0'), +('13', '29', '6', '2708', '5571', '0'), +('13', '29', '6', '1557', '5310', '0'), +('13', '29', '6', '1905', '5065', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '29', '17', '11641', '10836', '0'), +('13', '29', '17', '1644', '10118', '0'), +('13', '29', '17', '1253', '10118', '0'), +('13', '29', '17', '1240', '9058', '0'), +('13', '29', '7', '1241', '2956', '0'), +('13', '29', '7', '1218', '2896', '0'), +('13', '29', '7', '1362', '2624', '0'), +('13', '29', '7', '1648', '2576', '0'), +('13', '29', '9', '12805', '4256', '0'), +('13', '29', '9', '1274', '4189', '0'), +('13', '29', '9', '1649', '2569', '0'), +('13', '29', '9', '4344', '2051', '0'), +('13', '29', '15', '11687', '4776', '0'), +('13', '29', '15', '10150', '3004', '0'), +('13', '29', '15', '10163', '2300', '0'), +('13', '29', '15', '14651', '2224', '0'), +('13', '29', '20', '11666', '8336', '0'), +('13', '29', '20', '2742', '5137', '0'), +('13', '29', '20', '1217', '1677', '0'), +('13', '29', '20', '1364', '1493', '0'), +('13', '29', '12', '1243', '3984', '0'), +('13', '29', '12', '20655', '3316', '0'), +('13', '29', '12', '2923', '3074', '0'), +('13', '29', '12', '2336', '2764', '0'), +('13', '29', '18', '1651', '1986', '0'), +('13', '29', '18', '4410', '1142', '0'), +('13', '29', '18', '1244', '586', '0'), +('13', '29', '18', '1221', '454', '0'), +('13', '29', '19', '4407', '3213', '0'), +('13', '29', '19', '68239', '2974', '0'), +('13', '29', '19', '1368', '2016', '0'), +('13', '29', '19', '1652', '1834', '0'), +('13', '29', '13', '14759', '7258', '0'), +('13', '29', '13', '11650', '6979', '0'), +('13', '29', '13', '13400', '4401', '0'), +('13', '29', '13', '6359', '4356', '0'), +('13', '29', '14', '14759', '7258', '0'), +('13', '29', '14', '10219', '5681', '0'), +('13', '29', '14', '6359', '4356', '0'), +('13', '29', '14', '13987', '3952', '0'), +('13', '29', '11', '9246', '3515', '0'), +('13', '29', '11', '14762', '2204', '0'), +('13', '29', '11', '13353', '1500', '0'), +('13', '29', '11', '20677', '450', '0'), +('13', '30', '22', '10323', '0', '0'), +('13', '30', '22', '9246', '0', '0'), +('13', '30', '22', '21509', '0', '0'), +('13', '30', '22', '8007', '0', '0'), +('13', '30', '1', '14702', '3750', '0'), +('13', '30', '1', '14701', '2862', '0'), +('13', '30', '1', '30361', '2640', '0'), +('13', '30', '1', '10082', '2271', '0'), +('13', '30', '2', '10143', '5368', '0'), +('13', '30', '2', '1239', '4692', '0'), +('13', '30', '2', '1211', '3937', '0'), +('13', '30', '2', '30363', '3700', '0'), +('13', '30', '3', '11052', '5436', '0'), +('13', '30', '3', '2707', '2569', '0'), +('13', '30', '3', '4505', '2567', '0'), +('13', '30', '3', '1212', '1681', '0'), +('13', '30', '5', '14557', '6824', '0'), +('13', '30', '5', '14703', '6050', '0'), +('13', '30', '5', '11646', '4011', '0'), +('13', '30', '5', '10216', '3324', '0'), +('13', '30', '8', '11603', '11572', '0'), +('13', '30', '8', '1274', '4298', '0'), +('13', '30', '8', '2349', '3554', '0'), +('13', '30', '8', '1057', '2010', '0'), +('13', '30', '6', '1542', '6633', '0'), +('13', '30', '6', '2708', '5572', '0'), +('13', '30', '6', '1557', '5310', '0'), +('13', '30', '6', '1905', '5066', '0'), +('13', '30', '17', '11641', '11018', '0'), +('13', '30', '17', '1644', '10178', '0'), +('13', '30', '17', '1253', '10121', '0'), +('13', '30', '17', '1240', '9230', '0'), +('13', '30', '7', '1241', '3041', '0'), +('13', '30', '7', '1218', '2981', '0'), +('13', '30', '7', '1648', '2636', '0'), +('13', '30', '7', '1362', '2624', '0'), +('13', '30', '9', '1274', '4298', '0'), +('13', '30', '9', '12805', '4256', '0'), +('13', '30', '9', '1649', '2605', '0'), +('13', '30', '9', '4344', '2051', '0'), +('13', '30', '15', '11687', '4836', '0'), +('13', '30', '15', '10150', '3004', '0'), +('13', '30', '15', '10163', '2300', '0'), +('13', '30', '15', '14651', '2224', '0'), +('13', '30', '20', '11666', '8338', '0'), +('13', '30', '20', '2742', '5139', '0'), +('13', '30', '20', '1217', '1689', '0'), +('13', '30', '20', '1364', '1542', '0'), +('13', '30', '12', '1243', '4069', '0'), +('13', '30', '12', '20655', '3341', '0'), +('13', '30', '12', '2923', '3074', '0'), +('13', '30', '12', '2336', '2824', '0'), +('13', '30', '18', '1651', '2022', '0'), +('13', '30', '18', '4410', '1142', '0'), +('13', '30', '18', '1244', '586', '0'), +('13', '30', '18', '1221', '454', '0'), +('13', '30', '19', '4407', '3322', '0'), +('13', '30', '19', '68239', '3011', '0'), +('13', '30', '19', '1368', '2016', '0'), +('13', '30', '19', '1652', '1834', '0'), +('13', '30', '13', '14759', '7329', '0'), +('13', '30', '13', '11650', '7069', '0'), +('13', '30', '13', '6359', '4477', '0'), +('13', '30', '13', '13400', '4450', '0'), +('13', '30', '14', '14759', '7329', '0'), +('13', '30', '14', '10219', '5681', '0'), +('13', '30', '14', '6359', '4477', '0'), +('13', '30', '14', '13987', '4012', '0'), +('13', '30', '11', '9246', '3636', '0'), +('13', '30', '11', '14762', '2204', '0'), +('13', '30', '11', '13353', '1500', '0'), +('13', '30', '11', '20677', '450', '0'), +('13', '31', '22', '10323', '0', '0'), +('13', '31', '22', '9246', '0', '0'), +('13', '31', '22', '21509', '0', '0'), +('13', '31', '22', '8007', '0', '0'), +('13', '31', '1', '14702', '3750', '0'), +('13', '31', '1', '14701', '2862', '0'), +('13', '31', '1', '30361', '2640', '0'), +('13', '31', '1', '10082', '2343', '0'), +('13', '31', '2', '10143', '5368', '0'), +('13', '31', '2', '1239', '4801', '0'), +('13', '31', '2', '1211', '4022', '0'), +('13', '31', '2', '30363', '3700', '0'), +('13', '31', '3', '11052', '5617', '0'), +('13', '31', '3', '2707', '2654', '0'), +('13', '31', '3', '4505', '2652', '0'), +('13', '31', '3', '1212', '1693', '0'), +('13', '31', '5', '14557', '6884', '0'), +('13', '31', '5', '14703', '6050', '0'), +('13', '31', '5', '11646', '4168', '0'), +('13', '31', '5', '10216', '3384', '0'), +('13', '31', '8', '11603', '11681', '0'), +('13', '31', '8', '1274', '4407', '0'), +('13', '31', '8', '2349', '3554', '0'), +('13', '31', '8', '1057', '2071', '0'), +('13', '31', '6', '1542', '6742', '0'), +('13', '31', '6', '2708', '5574', '0'), +('13', '31', '6', '1557', '5310', '0'), +('13', '31', '6', '1905', '5068', '0'), +('13', '31', '17', '11641', '11199', '0'), +('13', '31', '17', '1644', '10239', '0'), +('13', '31', '17', '1253', '10123', '0'), +('13', '31', '17', '1240', '9402', '0'), +('13', '31', '7', '1241', '3126', '0'), +('13', '31', '7', '1218', '3066', '0'), +('13', '31', '7', '1648', '2697', '0'), +('13', '31', '7', '1362', '2624', '0'), +('13', '31', '9', '1274', '4407', '0'), +('13', '31', '9', '12805', '4256', '0'), +('13', '31', '9', '1649', '2642', '0'), +('13', '31', '9', '4344', '2051', '0'), +('13', '31', '15', '11687', '4897', '0'), +('13', '31', '15', '10150', '3004', '0'), +('13', '31', '15', '10163', '2300', '0'), +('13', '31', '15', '14651', '2224', '0'), +('13', '31', '20', '11666', '8339', '0'), +('13', '31', '20', '2742', '5141', '0'), +('13', '31', '20', '1217', '1701', '0'), +('13', '31', '20', '1364', '1590', '0'), +('13', '31', '12', '1243', '4153', '0'), +('13', '31', '12', '20655', '3365', '0'), +('13', '31', '12', '2923', '3074', '0'), +('13', '31', '12', '2336', '2884', '0'), +('13', '31', '18', '1651', '2058', '0'), +('13', '31', '18', '4410', '1142', '0'), +('13', '31', '18', '1244', '586', '0'), +('13', '31', '18', '1221', '454', '0'), +('13', '31', '19', '4407', '3431', '0'), +('13', '31', '19', '68239', '3047', '0'), +('13', '31', '19', '1368', '2016', '0'), +('13', '31', '19', '1652', '1834', '0'), +('13', '31', '13', '14759', '7400', '0'), +('13', '31', '13', '11650', '7160', '0'), +('13', '31', '13', '6359', '4598', '0'), +('13', '31', '13', '13400', '4498', '0'), +('13', '31', '14', '14759', '7400', '0'), +('13', '31', '14', '10219', '5681', '0'), +('13', '31', '14', '6359', '4598', '0'), +('13', '31', '14', '13987', '4072', '0'), +('13', '31', '11', '9246', '3757', '0'), +('13', '31', '11', '14762', '2204', '0'), +('13', '31', '11', '13353', '1500', '0'), +('13', '31', '11', '20677', '450', '0'), +('13', '32', '22', '10323', '0', '0'), +('13', '32', '22', '9246', '0', '0'), +('13', '32', '22', '21509', '0', '0'), +('13', '32', '22', '8007', '0', '0'), +('13', '32', '1', '14702', '3750', '0'), +('13', '32', '1', '14701', '2862', '0'), +('13', '32', '1', '30361', '2640', '0'), +('13', '32', '1', '10082', '2416', '0'), +('13', '32', '2', '10143', '5368', '0'), +('13', '32', '2', '1239', '4909', '0'), +('13', '32', '2', '1211', '4106', '0'), +('13', '32', '2', '30363', '3700', '0'), +('13', '32', '3', '11052', '5798', '0'), +('13', '32', '3', '2707', '2739', '0'), +('13', '32', '3', '4505', '2736', '0'), +('13', '32', '3', '1212', '1705', '0'), +('13', '32', '5', '14557', '6945', '0'), +('13', '32', '5', '14703', '6050', '0'), +('13', '32', '5', '11646', '4325', '0'), +('13', '32', '5', '10216', '3445', '0'), +('13', '32', '8', '11603', '11789', '0'), +('13', '32', '8', '1274', '4515', '0'), +('13', '32', '8', '2349', '3554', '0'), +('13', '32', '8', '1057', '2131', '0'), +('13', '32', '6', '1542', '6850', '0'), +('13', '32', '6', '2708', '5575', '0'), +('13', '32', '6', '1557', '5310', '0'), +('13', '32', '6', '1905', '5069', '0'), +('13', '32', '17', '11641', '11380', '0'), +('13', '32', '17', '1644', '10299', '0'), +('13', '32', '17', '1253', '10126', '0'), +('13', '32', '17', '1240', '9574', '0'), +('13', '32', '7', '1241', '3210', '0'), +('13', '32', '7', '1218', '3150', '0'), +('13', '32', '7', '1648', '2757', '0'), +('13', '32', '7', '1362', '2624', '0'), +('13', '32', '9', '1274', '4515', '0'), +('13', '32', '9', '12805', '4256', '0'), +('13', '32', '9', '1649', '2678', '0'), +('13', '32', '9', '4344', '2051', '0'), +('13', '32', '15', '11687', '4957', '0'), +('13', '32', '15', '10150', '3004', '0'), +('13', '32', '15', '10163', '2300', '0'), +('13', '32', '15', '14651', '2224', '0'), +('13', '32', '20', '11666', '8341', '0'), +('13', '32', '20', '2742', '5144', '0'), +('13', '32', '20', '1217', '1713', '0'), +('13', '32', '20', '1364', '1638', '0'), +('13', '32', '12', '1243', '4238', '0'), +('13', '32', '12', '20655', '3390', '0'), +('13', '32', '12', '2923', '3074', '0'), +('13', '32', '12', '2336', '2945', '0'), +('13', '32', '18', '1651', '2095', '0'), +('13', '32', '18', '4410', '1142', '0'), +('13', '32', '18', '1244', '586', '0'), +('13', '32', '18', '1221', '454', '0'), +('13', '32', '19', '4407', '3539', '0'), +('13', '32', '19', '68239', '3083', '0'), +('13', '32', '19', '1368', '2016', '0'), +('13', '32', '19', '1652', '1834', '0'), +('13', '32', '13', '14759', '7472', '0'), +('13', '32', '13', '11650', '7251', '0'), +('13', '32', '13', '6359', '4719', '0'), +('13', '32', '13', '13400', '4546', '0'), +('13', '32', '14', '14759', '7472', '0'), +('13', '32', '14', '10219', '5681', '0'), +('13', '32', '14', '6359', '4719', '0'), +('13', '32', '14', '13987', '4133', '0'), +('13', '32', '11', '9246', '3878', '0'), +('13', '32', '11', '14762', '2204', '0'), +('13', '32', '11', '13353', '1500', '0'), +('13', '32', '11', '20677', '450', '0'), +('13', '33', '22', '10323', '0', '0'), +('13', '33', '22', '9246', '0', '0'), +('13', '33', '22', '21509', '0', '0'), +('13', '33', '22', '8007', '0', '0'), +('13', '33', '1', '14702', '3750', '0'), +('13', '33', '1', '14701', '2862', '0'), +('13', '33', '1', '30361', '2640', '0'), +('13', '33', '1', '10082', '2488', '0'), +('13', '33', '2', '10143', '5368', '0'), +('13', '33', '2', '1239', '5018', '0'), +('13', '33', '2', '1211', '4191', '0'), +('13', '33', '2', '30363', '3700', '0'), +('13', '33', '3', '11052', '5980', '0'), +('13', '33', '3', '2707', '2823', '0'), +('13', '33', '3', '4505', '2821', '0'), +('13', '33', '3', '1212', '1717', '0'), +('13', '33', '5', '14557', '7005', '0'), +('13', '33', '5', '14703', '6050', '0'), +('13', '33', '5', '11646', '4482', '0'), +('13', '33', '5', '10216', '3505', '0'), +('13', '33', '8', '11603', '11898', '0'), +('13', '33', '8', '1274', '4624', '0'), +('13', '33', '8', '2349', '3554', '0'), +('13', '33', '8', '1057', '2192', '0'), +('13', '33', '6', '1542', '6959', '0'), +('13', '33', '6', '2708', '5576', '0'), +('13', '33', '6', '1557', '5310', '0'), +('13', '33', '6', '1905', '5070', '0'), +('13', '33', '17', '11641', '11561', '0'), +('13', '33', '17', '1644', '10360', '0'), +('13', '33', '17', '1253', '10128', '0'), +('13', '33', '17', '1240', '9746', '0'), +('13', '33', '7', '1241', '3295', '0'), +('13', '33', '7', '1218', '3235', '0'), +('13', '33', '7', '1648', '2817', '0'), +('13', '33', '7', '1362', '2624', '0'), +('13', '33', '9', '1274', '4624', '0'), +('13', '33', '9', '12805', '4256', '0'), +('13', '33', '9', '1649', '2714', '0'), +('13', '33', '9', '4344', '2051', '0'), +('13', '33', '15', '11687', '5017', '0'), +('13', '33', '15', '10150', '3004', '0'), +('13', '33', '15', '10163', '2300', '0'), +('13', '33', '15', '14651', '2224', '0'), +('13', '33', '20', '11666', '8343', '0'), +('13', '33', '20', '2742', '5146', '0'), +('13', '33', '20', '1217', '1725', '0'), +('13', '33', '20', '1364', '1687', '0'), +('13', '33', '12', '1243', '4322', '0'), +('13', '33', '12', '20655', '3415', '0'), +('13', '33', '12', '2923', '3074', '0'), +('13', '33', '12', '2336', '3005', '0'), +('13', '33', '18', '1651', '2131', '0'), +('13', '33', '18', '4410', '1142', '0'), +('13', '33', '18', '1244', '586', '0'), +('13', '33', '18', '1221', '454', '0'), +('13', '33', '19', '4407', '3648', '0'), +('13', '33', '19', '68239', '3119', '0'), +('13', '33', '19', '1368', '2016', '0'), +('13', '33', '19', '1652', '1834', '0'), +('13', '33', '13', '14759', '7543', '0'), +('13', '33', '13', '11650', '7341', '0'), +('13', '33', '13', '6359', '4839', '0'), +('13', '33', '13', '13400', '4595', '0'), +('13', '33', '14', '14759', '7543', '0'), +('13', '33', '14', '10219', '5681', '0'), +('13', '33', '14', '6359', '4839', '0'), +('13', '33', '14', '13987', '4193', '0'), +('13', '33', '11', '9246', '3998', '0'), +('13', '33', '11', '14762', '2204', '0'), +('13', '33', '11', '13353', '1500', '0'), +('13', '33', '11', '20677', '450', '0'), +('13', '34', '22', '10323', '0', '0'), +('13', '34', '22', '9246', '0', '0'), +('13', '34', '22', '21509', '0', '0'), +('13', '34', '22', '8007', '0', '0'), +('13', '34', '1', '14702', '3750', '0'), +('13', '34', '1', '14701', '2862', '0'), +('13', '34', '1', '30361', '2640', '0'), +('13', '34', '1', '10082', '2561', '0'), +('13', '34', '2', '10143', '5368', '0'), +('13', '34', '2', '1239', '5127', '0'), +('13', '34', '2', '1211', '4275', '0'), +('13', '34', '2', '10141', '3709', '0'), +('13', '34', '3', '11052', '6161', '0'), +('13', '34', '3', '2707', '2908', '0'), +('13', '34', '3', '4505', '2905', '0'), +('13', '34', '3', '1212', '1729', '0'), +('13', '34', '5', '14557', '7066', '0'), +('13', '34', '5', '14703', '6050', '0'), +('13', '34', '5', '11646', '4639', '0'), +('13', '34', '5', '10216', '3566', '0'), +('13', '34', '8', '11603', '12007', '0'), +('13', '34', '8', '1274', '4733', '0'), +('13', '34', '8', '2349', '3554', '0'), +('13', '34', '8', '1057', '2252', '0'), +('13', '34', '6', '1542', '7068', '0'), +('13', '34', '6', '2708', '5577', '0'), +('13', '34', '6', '1557', '5310', '0'), +('13', '34', '6', '1905', '5071', '0'), +('13', '34', '17', '11641', '11742', '0'), +('13', '34', '17', '1644', '10420', '0'), +('13', '34', '17', '1253', '10130', '0'), +('13', '34', '17', '1240', '9918', '0'), +('13', '34', '7', '1241', '3379', '0'), +('13', '34', '7', '1218', '3319', '0'), +('13', '34', '7', '1648', '2878', '0'), +('13', '34', '7', '1362', '2624', '0'), +('13', '34', '9', '1274', '4733', '0'), +('13', '34', '9', '12805', '4256', '0'), +('13', '34', '9', '1649', '2750', '0'), +('13', '34', '9', '4408', '2087', '0'), +('13', '34', '15', '11687', '5078', '0'), +('13', '34', '15', '10150', '3004', '0'), +('13', '34', '15', '10163', '2300', '0'), +('13', '34', '15', '14651', '2224', '0'), +('13', '34', '20', '11666', '8344', '0'), +('13', '34', '20', '2742', '5149', '0'), +('13', '34', '20', '1217', '1737', '0'), +('13', '34', '20', '1364', '1735', '0'), +('13', '34', '12', '1243', '4407', '0'), +('13', '34', '12', '20655', '3439', '0'), +('13', '34', '12', '2923', '3074', '0'), +('13', '34', '12', '2336', '3066', '0'), +('13', '34', '18', '1651', '2167', '0'), +('13', '34', '18', '4410', '1142', '0'), +('13', '34', '18', '1244', '586', '0'), +('13', '34', '18', '1221', '454', '0'), +('13', '34', '19', '4407', '3757', '0'), +('13', '34', '19', '68239', '3156', '0'), +('13', '34', '19', '1368', '2016', '0'), +('13', '34', '19', '1652', '1834', '0'), +('13', '34', '13', '14759', '7614', '0'), +('13', '34', '13', '11650', '7432', '0'), +('13', '34', '13', '6359', '4960', '0'), +('13', '34', '13', '13400', '4643', '0'), +('13', '34', '14', '14759', '7614', '0'), +('13', '34', '14', '10219', '5681', '0'), +('13', '34', '14', '6359', '4960', '0'), +('13', '34', '14', '13987', '4254', '0'), +('13', '34', '11', '9246', '4119', '0'), +('13', '34', '11', '14762', '2204', '0'), +('13', '34', '11', '13353', '1500', '0'), +('13', '34', '11', '20677', '450', '0'), +('13', '35', '22', '10323', '0', '0'), +('13', '35', '22', '9246', '0', '0'), +('13', '35', '22', '21509', '0', '0'), +('13', '35', '22', '8007', '0', '0'), +('13', '35', '1', '14702', '3750', '0'), +('13', '35', '1', '14701', '2862', '0'), +('13', '35', '1', '30361', '2640', '0'), +('13', '35', '1', '10082', '2633', '0'), +('13', '35', '2', '10143', '5368', '0'), +('13', '35', '2', '1239', '5235', '0'), +('13', '35', '2', '1211', '4360', '0'), +('13', '35', '2', '10141', '3817', '0'), +('13', '35', '3', '11052', '6342', '0'), +('13', '35', '3', '2707', '2992', '0'), +('13', '35', '3', '4505', '2990', '0'), +('13', '35', '3', '1212', '1741', '0'), +('13', '35', '5', '14557', '7126', '0'), +('13', '35', '5', '14703', '6050', '0'), +('13', '35', '5', '11646', '4796', '0'), +('13', '35', '5', '10216', '3626', '0'), +('13', '35', '8', '11603', '12116', '0'), +('13', '35', '8', '1274', '4841', '0'), +('13', '35', '8', '2349', '3554', '0'), +('13', '35', '8', '1057', '2312', '0'), +('13', '35', '6', '1542', '7176', '0'), +('13', '35', '6', '2708', '5579', '0'), +('13', '35', '6', '1557', '5310', '0'), +('13', '35', '6', '1905', '5072', '0'), +('13', '35', '17', '11641', '11924', '0'), +('13', '35', '17', '1644', '10480', '0'), +('13', '35', '17', '1253', '10133', '0'), +('13', '35', '17', '1240', '10090', '0'), +('13', '35', '7', '1241', '3464', '0'), +('13', '35', '7', '1218', '3404', '0'), +('13', '35', '7', '1648', '2938', '0'), +('13', '35', '7', '1362', '2624', '0'), +('13', '35', '9', '1274', '4841', '0'), +('13', '35', '9', '12805', '4256', '0'), +('13', '35', '9', '1649', '2787', '0'), +('13', '35', '9', '4408', '2147', '0'), +('13', '35', '15', '11687', '5138', '0'), +('13', '35', '15', '10150', '3004', '0'), +('13', '35', '15', '10163', '2300', '0'), +('13', '35', '15', '14651', '2224', '0'), +('13', '35', '20', '11666', '8346', '0'), +('13', '35', '20', '2742', '5151', '0'), +('13', '35', '20', '1364', '1783', '0'), +('13', '35', '20', '1217', '1749', '0'), +('13', '35', '12', '1243', '4492', '0'), +('13', '35', '12', '20655', '3464', '0'), +('13', '35', '12', '2336', '3126', '0'), +('13', '35', '12', '2923', '3074', '0'), +('13', '35', '18', '1651', '2203', '0'), +('13', '35', '18', '4410', '1142', '0'), +('13', '35', '18', '1244', '586', '0'), +('13', '35', '18', '1221', '454', '0'), +('13', '35', '19', '4407', '3865', '0'), +('13', '35', '19', '68239', '3192', '0'), +('13', '35', '19', '1368', '2016', '0'), +('13', '35', '19', '1652', '1834', '0'), +('13', '35', '13', '14759', '7685', '0'), +('13', '35', '13', '11650', '7522', '0'), +('13', '35', '13', '6359', '5081', '0'), +('13', '35', '13', '13400', '4691', '0'), +('13', '35', '14', '14759', '7685', '0'), +('13', '35', '14', '10219', '5681', '0'), +('13', '35', '14', '6359', '5081', '0'), +('13', '35', '14', '13987', '4314', '0'), +('13', '35', '11', '9246', '4240', '0'), +('13', '35', '11', '14762', '2204', '0'), +('13', '35', '11', '13353', '1500', '0'), +('13', '35', '11', '60396', '453', '0'), +('13', '36', '22', '10323', '0', '0'), +('13', '36', '22', '9246', '0', '0'), +('13', '36', '22', '21509', '0', '0'), +('13', '36', '22', '8007', '0', '0'), +('13', '36', '1', '14702', '3750', '0'), +('13', '36', '1', '14701', '2862', '0'), +('13', '36', '1', '10082', '2706', '0'), +('13', '36', '1', '30361', '2640', '0'), +('13', '36', '2', '10143', '5368', '0'), +('13', '36', '2', '1239', '5344', '0'), +('13', '36', '2', '1211', '4444', '0'), +('13', '36', '2', '10141', '3926', '0'), +('13', '36', '3', '11052', '6523', '0'), +('13', '36', '3', '2707', '3077', '0'), +('13', '36', '3', '4505', '3074', '0'), +('13', '36', '3', '1212', '1753', '0'), +('13', '36', '5', '14557', '7186', '0'), +('13', '36', '5', '14703', '6050', '0'), +('13', '36', '5', '11646', '4953', '0'), +('13', '36', '5', '10216', '3686', '0'), +('13', '36', '8', '11603', '12224', '0'), +('13', '36', '8', '1274', '4950', '0'), +('13', '36', '8', '2349', '3554', '0'), +('13', '36', '8', '1057', '2373', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '36', '6', '1542', '7285', '0'), +('13', '36', '6', '2708', '5580', '0'), +('13', '36', '6', '1557', '5310', '0'), +('13', '36', '6', '1905', '5074', '0'), +('13', '36', '17', '11641', '12105', '0'), +('13', '36', '17', '1644', '10541', '0'), +('13', '36', '17', '1240', '10262', '0'), +('13', '36', '17', '1253', '10135', '0'), +('13', '36', '7', '1241', '3548', '0'), +('13', '36', '7', '1218', '3488', '0'), +('13', '36', '7', '1648', '2999', '0'), +('13', '36', '7', '1362', '2624', '0'), +('13', '36', '9', '1274', '4950', '0'), +('13', '36', '9', '12805', '4256', '0'), +('13', '36', '9', '1649', '2823', '0'), +('13', '36', '9', '4408', '2208', '0'), +('13', '36', '15', '11687', '5199', '0'), +('13', '36', '15', '10150', '3004', '0'), +('13', '36', '15', '10163', '2300', '0'), +('13', '36', '15', '14651', '2224', '0'), +('13', '36', '20', '11666', '8348', '0'), +('13', '36', '20', '2742', '5153', '0'), +('13', '36', '20', '1364', '1832', '0'), +('13', '36', '20', '1217', '1761', '0'), +('13', '36', '12', '1243', '4576', '0'), +('13', '36', '12', '20655', '3489', '0'), +('13', '36', '12', '2336', '3186', '0'), +('13', '36', '12', '2923', '3074', '0'), +('13', '36', '18', '1651', '2240', '0'), +('13', '36', '18', '4410', '1142', '0'), +('13', '36', '18', '1244', '586', '0'), +('13', '36', '18', '1221', '454', '0'), +('13', '36', '19', '4407', '3974', '0'), +('13', '36', '19', '68239', '3228', '0'), +('13', '36', '19', '1368', '2016', '0'), +('13', '36', '19', '1652', '1834', '0'), +('13', '36', '13', '14759', '7757', '0'), +('13', '36', '13', '11650', '7613', '0'), +('13', '36', '13', '6359', '5202', '0'), +('13', '36', '13', '13500', '4787', '0'), +('13', '36', '14', '14759', '7757', '0'), +('13', '36', '14', '10219', '5681', '0'), +('13', '36', '14', '6359', '5202', '0'), +('13', '36', '14', '13987', '4374', '0'), +('13', '36', '11', '9246', '4361', '0'), +('13', '36', '11', '14762', '2204', '0'), +('13', '36', '11', '13353', '1500', '0'), +('13', '36', '11', '60396', '465', '0'), +('13', '37', '22', '10323', '0', '0'), +('13', '37', '22', '9246', '0', '0'), +('13', '37', '22', '21509', '0', '0'), +('13', '37', '22', '8007', '0', '0'), +('13', '37', '1', '14702', '3750', '0'), +('13', '37', '1', '14701', '2862', '0'), +('13', '37', '1', '10082', '2778', '0'), +('13', '37', '1', '30361', '2640', '0'), +('13', '37', '2', '1239', '5453', '0'), +('13', '37', '2', '10143', '5368', '0'), +('13', '37', '2', '1211', '4529', '0'), +('13', '37', '2', '10141', '4035', '0'), +('13', '37', '3', '11052', '6704', '0'), +('13', '37', '3', '2707', '3161', '0'), +('13', '37', '3', '4505', '3159', '0'), +('13', '37', '3', '1212', '1765', '0'), +('13', '37', '5', '14557', '7247', '0'), +('13', '37', '5', '14703', '6050', '0'), +('13', '37', '5', '11646', '5110', '0'), +('13', '37', '5', '10216', '3747', '0'), +('13', '37', '8', '11603', '12333', '0'), +('13', '37', '8', '1274', '5059', '0'), +('13', '37', '8', '2349', '3554', '0'), +('13', '37', '8', '1057', '2433', '0'), +('13', '37', '6', '1542', '7394', '0'), +('13', '37', '6', '2708', '5581', '0'), +('13', '37', '6', '1557', '5310', '0'), +('13', '37', '6', '1905', '5075', '0'), +('13', '37', '17', '11641', '12286', '0'), +('13', '37', '17', '1644', '10601', '0'), +('13', '37', '17', '1240', '10434', '0'), +('13', '37', '17', '1253', '10138', '0'), +('13', '37', '7', '1241', '3633', '0'), +('13', '37', '7', '1218', '3573', '0'), +('13', '37', '7', '1648', '3059', '0'), +('13', '37', '7', '1362', '2624', '0'), +('13', '37', '9', '1274', '5059', '0'), +('13', '37', '9', '12805', '4256', '0'), +('13', '37', '9', '1649', '2859', '0'), +('13', '37', '9', '4408', '2268', '0'), +('13', '37', '15', '11687', '5259', '0'), +('13', '37', '15', '10150', '3004', '0'), +('13', '37', '15', '10163', '2300', '0'), +('13', '37', '15', '14651', '2224', '0'), +('13', '37', '20', '11666', '8349', '0'), +('13', '37', '20', '2742', '5156', '0'), +('13', '37', '20', '1364', '1880', '0'), +('13', '37', '20', '1217', '1774', '0'), +('13', '37', '12', '1243', '4661', '0'), +('13', '37', '12', '20655', '3513', '0'), +('13', '37', '12', '2336', '3247', '0'), +('13', '37', '12', '2923', '3074', '0'), +('13', '37', '18', '1651', '2276', '0'), +('13', '37', '18', '4410', '1142', '0'), +('13', '37', '18', '1244', '586', '0'), +('13', '37', '18', '1221', '454', '0'), +('13', '37', '19', '4407', '4083', '0'), +('13', '37', '19', '68239', '3264', '0'), +('13', '37', '19', '1368', '2016', '0'), +('13', '37', '19', '1652', '1834', '0'), +('13', '37', '13', '14759', '7828', '0'), +('13', '37', '13', '11650', '7704', '0'), +('13', '37', '13', '6359', '5323', '0'), +('13', '37', '13', '13500', '4908', '0'), +('13', '37', '14', '14759', '7828', '0'), +('13', '37', '14', '10219', '5681', '0'), +('13', '37', '14', '6359', '5323', '0'), +('13', '37', '14', '9246', '4482', '0'), +('13', '37', '11', '9246', '4482', '0'), +('13', '37', '11', '14762', '2204', '0'), +('13', '37', '11', '13353', '1500', '0'), +('13', '37', '11', '60396', '477', '0'), +('13', '38', '22', '10323', '0', '0'), +('13', '38', '22', '9246', '0', '0'), +('13', '38', '22', '21509', '0', '0'), +('13', '38', '22', '8007', '0', '0'), +('13', '38', '1', '14702', '3750', '0'), +('13', '38', '1', '14701', '2862', '0'), +('13', '38', '1', '10082', '2850', '0'), +('13', '38', '1', '30361', '2640', '0'), +('13', '38', '2', '1239', '5562', '0'), +('13', '38', '2', '10143', '5368', '0'), +('13', '38', '2', '1211', '4613', '0'), +('13', '38', '2', '10141', '4143', '0'), +('13', '38', '3', '11052', '6886', '0'), +('13', '38', '3', '2707', '3246', '0'), +('13', '38', '3', '4505', '3243', '0'), +('13', '38', '3', '1212', '1777', '0'), +('13', '38', '5', '14557', '7307', '0'), +('13', '38', '5', '14703', '6050', '0'), +('13', '38', '5', '11646', '5268', '0'), +('13', '38', '5', '10216', '3807', '0'), +('13', '38', '8', '11603', '12442', '0'), +('13', '38', '8', '1274', '5168', '0'), +('13', '38', '8', '2349', '3554', '0'), +('13', '38', '8', '1057', '2494', '0'), +('13', '38', '6', '1542', '7503', '0'), +('13', '38', '6', '2708', '5582', '0'), +('13', '38', '6', '1557', '5310', '0'), +('13', '38', '6', '1905', '5076', '0'), +('13', '38', '17', '11641', '12467', '0'), +('13', '38', '17', '1644', '10662', '0'), +('13', '38', '17', '1240', '10606', '0'), +('13', '38', '17', '1253', '10140', '0'), +('13', '38', '7', '1241', '3717', '0'), +('13', '38', '7', '1218', '3657', '0'), +('13', '38', '7', '1648', '3119', '0'), +('13', '38', '7', '1362', '2624', '0'), +('13', '38', '9', '1274', '5168', '0'), +('13', '38', '9', '12805', '4256', '0'), +('13', '38', '9', '1649', '2895', '0'), +('13', '38', '9', '4408', '2328', '0'), +('13', '38', '15', '11687', '5319', '0'), +('13', '38', '15', '10150', '3004', '0'), +('13', '38', '15', '10163', '2300', '0'), +('13', '38', '15', '14651', '2224', '0'), +('13', '38', '20', '11666', '8351', '0'), +('13', '38', '20', '2742', '5158', '0'), +('13', '38', '20', '1364', '1928', '0'), +('13', '38', '20', '1217', '1786', '0'), +('13', '38', '12', '1243', '4745', '0'), +('13', '38', '12', '20655', '3538', '0'), +('13', '38', '12', '2336', '3307', '0'), +('13', '38', '12', '2923', '3074', '0'), +('13', '38', '18', '1651', '2312', '0'), +('13', '38', '18', '4410', '1142', '0'), +('13', '38', '18', '1244', '586', '0'), +('13', '38', '18', '1221', '454', '0'), +('13', '38', '19', '4407', '4192', '0'), +('13', '38', '19', '68239', '3301', '0'), +('13', '38', '19', '1368', '2016', '0'), +('13', '38', '19', '1652', '1834', '0'), +('13', '38', '13', '14759', '7899', '0'), +('13', '38', '13', '11650', '7794', '0'), +('13', '38', '13', '6359', '5443', '0'), +('13', '38', '13', '13500', '5028', '0'), +('13', '38', '14', '14759', '7899', '0'), +('13', '38', '14', '10219', '5681', '0'), +('13', '38', '14', '6359', '5443', '0'), +('13', '38', '14', '9246', '4602', '0'), +('13', '38', '11', '9246', '4602', '0'), +('13', '38', '11', '14762', '2204', '0'), +('13', '38', '11', '13353', '1500', '0'), +('13', '38', '11', '60396', '489', '0'), +('13', '39', '22', '10323', '0', '0'), +('13', '39', '22', '9246', '0', '0'), +('13', '39', '22', '21509', '0', '0'), +('13', '39', '22', '8007', '0', '0'), +('13', '39', '1', '14702', '3750', '0'), +('13', '39', '1', '10082', '2923', '0'), +('13', '39', '1', '14701', '2862', '0'), +('13', '39', '1', '30361', '2640', '0'), +('13', '39', '2', '1239', '5670', '0'), +('13', '39', '2', '10143', '5368', '0'), +('13', '39', '2', '1211', '4698', '0'), +('13', '39', '2', '10141', '4252', '0'), +('13', '39', '3', '11052', '7067', '0'), +('13', '39', '3', '2707', '3330', '0'), +('13', '39', '3', '4505', '3328', '0'), +('13', '39', '3', '1212', '1789', '0'), +('13', '39', '5', '14557', '7368', '0'), +('13', '39', '5', '14703', '6050', '0'), +('13', '39', '5', '11646', '5425', '0'), +('13', '39', '5', '10216', '3868', '0'), +('13', '39', '8', '11603', '12550', '0'), +('13', '39', '8', '1274', '5276', '0'), +('13', '39', '8', '2349', '3554', '0'), +('13', '39', '8', '1057', '2554', '0'), +('13', '39', '6', '1542', '7611', '0'), +('13', '39', '6', '2708', '5583', '0'), +('13', '39', '6', '1557', '5310', '0'), +('13', '39', '6', '1905', '5077', '0'), +('13', '39', '17', '11641', '12648', '0'), +('13', '39', '17', '1240', '10778', '0'), +('13', '39', '17', '1644', '10722', '0'), +('13', '39', '17', '1253', '10143', '0'), +('13', '39', '7', '1241', '3802', '0'), +('13', '39', '7', '1218', '3742', '0'), +('13', '39', '7', '1648', '3180', '0'), +('13', '39', '7', '1362', '2624', '0'), +('13', '39', '9', '1274', '5276', '0'), +('13', '39', '9', '12805', '4256', '0'), +('13', '39', '9', '1649', '2931', '0'), +('13', '39', '9', '4408', '2389', '0'), +('13', '39', '15', '11687', '5380', '0'), +('13', '39', '15', '10150', '3004', '0'), +('13', '39', '15', '10163', '2300', '0'), +('13', '39', '15', '14651', '2224', '0'), +('13', '39', '20', '11666', '8353', '0'), +('13', '39', '20', '2742', '5161', '0'), +('13', '39', '20', '1364', '1977', '0'), +('13', '39', '20', '1217', '1798', '0'), +('13', '39', '12', '1243', '4830', '0'), +('13', '39', '12', '20655', '3563', '0'), +('13', '39', '12', '2336', '3368', '0'), +('13', '39', '12', '2923', '3074', '0'), +('13', '39', '18', '1651', '2348', '0'), +('13', '39', '18', '4410', '1142', '0'), +('13', '39', '18', '1244', '586', '0'), +('13', '39', '18', '1221', '454', '0'), +('13', '39', '19', '4407', '4300', '0'), +('13', '39', '19', '68239', '3337', '0'), +('13', '39', '19', '1368', '2016', '0'), +('13', '39', '19', '1652', '1834', '0'), +('13', '39', '13', '14759', '7971', '0'), +('13', '39', '13', '11650', '7885', '0'), +('13', '39', '13', '6359', '5564', '0'), +('13', '39', '13', '13500', '5149', '0'), +('13', '39', '14', '14759', '7971', '0'), +('13', '39', '14', '10219', '5681', '0'), +('13', '39', '14', '6359', '5564', '0'), +('13', '39', '14', '9246', '4723', '0'), +('13', '39', '11', '9246', '4723', '0'), +('13', '39', '11', '14762', '2204', '0'), +('13', '39', '11', '13353', '1500', '0'), +('13', '39', '11', '60396', '501', '0'), +('13', '40', '22', '10323', '0', '0'), +('13', '40', '22', '9246', '0', '0'), +('13', '40', '22', '21509', '0', '0'), +('13', '40', '22', '8007', '0', '0'), +('13', '40', '1', '14702', '3750', '0'), +('13', '40', '1', '10082', '2995', '0'), +('13', '40', '1', '14701', '2862', '0'), +('13', '40', '1', '30361', '2640', '0'), +('13', '40', '2', '1239', '5779', '0'), +('13', '40', '2', '10143', '5368', '0'), +('13', '40', '2', '1211', '4783', '0'), +('13', '40', '2', '10141', '4361', '0'), +('13', '40', '3', '11052', '7248', '0'), +('13', '40', '3', '2707', '3415', '0'), +('13', '40', '3', '4505', '3413', '0'), +('13', '40', '3', '1212', '1801', '0'), +('13', '40', '5', '14557', '7428', '0'), +('13', '40', '5', '14703', '6050', '0'), +('13', '40', '5', '11646', '5582', '0'), +('13', '40', '5', '10216', '3928', '0'), +('13', '40', '8', '11603', '12659', '0'), +('13', '40', '8', '1274', '5385', '0'), +('13', '40', '8', '2349', '3554', '0'), +('13', '40', '8', '1057', '2614', '0'), +('13', '40', '6', '1542', '7720', '0'), +('13', '40', '6', '2708', '5585', '0'), +('13', '40', '6', '1557', '5310', '0'), +('13', '40', '6', '1905', '5079', '0'), +('13', '40', '17', '11641', '12830', '0'), +('13', '40', '17', '1240', '10950', '0'), +('13', '40', '17', '1644', '10782', '0'), +('13', '40', '17', '1253', '10145', '0'), +('13', '40', '7', '1241', '3887', '0'), +('13', '40', '7', '1218', '3827', '0'), +('13', '40', '7', '1648', '3240', '0'), +('13', '40', '7', '1362', '2624', '0'), +('13', '40', '9', '1274', '5385', '0'), +('13', '40', '9', '12805', '4256', '0'), +('13', '40', '9', '1649', '2968', '0'), +('13', '40', '9', '4408', '2449', '0'), +('13', '40', '15', '11687', '5440', '0'), +('13', '40', '15', '10150', '3004', '0'), +('13', '40', '15', '10163', '2300', '0'), +('13', '40', '15', '14651', '2224', '0'), +('13', '40', '20', '11666', '8354', '0'), +('13', '40', '20', '2742', '5163', '0'), +('13', '40', '20', '1364', '2025', '0'), +('13', '40', '20', '1217', '1810', '0'), +('13', '40', '12', '1243', '4914', '0'), +('13', '40', '12', '20655', '3587', '0'), +('13', '40', '12', '2336', '3428', '0'), +('13', '40', '12', '2923', '3074', '0'), +('13', '40', '18', '1651', '2385', '0'), +('13', '40', '18', '4410', '1142', '0'), +('13', '40', '18', '1244', '586', '0'), +('13', '40', '18', '1221', '454', '0'), +('13', '40', '19', '4407', '4409', '0'), +('13', '40', '19', '68239', '3373', '0'), +('13', '40', '19', '1368', '2016', '0'), +('13', '40', '19', '1652', '1834', '0'), +('13', '40', '13', '14759', '8042', '0'), +('13', '40', '13', '11650', '7975', '0'), +('13', '40', '13', '6359', '5685', '0'), +('13', '40', '13', '13500', '5270', '0'), +('13', '40', '14', '14759', '8042', '0'), +('13', '40', '14', '6359', '5685', '0'), +('13', '40', '14', '10219', '5681', '0'), +('13', '40', '14', '9246', '4844', '0'), +('13', '40', '11', '9246', '4844', '0'), +('13', '40', '11', '14762', '2204', '0'), +('13', '40', '11', '13353', '1500', '0'), +('13', '40', '11', '60396', '513', '0'), +('13', '41', '22', '10323', '0', '0'), +('13', '41', '22', '9246', '0', '0'), +('13', '41', '22', '21509', '0', '0'), +('13', '41', '22', '8007', '0', '0'), +('13', '41', '1', '14702', '3750', '0'), +('13', '41', '1', '10082', '3068', '0'), +('13', '41', '1', '14701', '2862', '0'), +('13', '41', '1', '30361', '2640', '0'), +('13', '41', '2', '1239', '5888', '0'), +('13', '41', '2', '10143', '5368', '0'), +('13', '41', '2', '1211', '4867', '0'), +('13', '41', '2', '10141', '4470', '0'), +('13', '41', '3', '11052', '7429', '0'), +('13', '41', '3', '2707', '3500', '0'), +('13', '41', '3', '4505', '3497', '0'), +('13', '41', '3', '1212', '1813', '0'), +('13', '41', '5', '14557', '7488', '0'), +('13', '41', '5', '14703', '6050', '0'), +('13', '41', '5', '11646', '5739', '0'), +('13', '41', '5', '10216', '3988', '0'), +('13', '41', '8', '11603', '12768', '0'), +('13', '41', '8', '1274', '5494', '0'), +('13', '41', '8', '2349', '3554', '0'), +('13', '41', '8', '1057', '2675', '0'), +('13', '41', '6', '1542', '7829', '0'), +('13', '41', '6', '2708', '5586', '0'), +('13', '41', '6', '1557', '5310', '0'), +('13', '41', '6', '1905', '5080', '0'), +('13', '41', '17', '11641', '13011', '0'), +('13', '41', '17', '1240', '11122', '0'), +('13', '41', '17', '1644', '10843', '0'), +('13', '41', '17', '1253', '10147', '0'), +('13', '41', '7', '1241', '3971', '0'), +('13', '41', '7', '1218', '3911', '0'), +('13', '41', '7', '1648', '3301', '0'), +('13', '41', '7', '1362', '2624', '0'), +('13', '41', '9', '1274', '5494', '0'), +('13', '41', '9', '12805', '4256', '0'), +('13', '41', '9', '1649', '3004', '0'), +('13', '41', '9', '4408', '2510', '0'), +('13', '41', '15', '11687', '5501', '0'), +('13', '41', '15', '10150', '3004', '0'), +('13', '41', '15', '10163', '2300', '0'), +('13', '41', '15', '14651', '2224', '0'), +('13', '41', '20', '11666', '8356', '0'), +('13', '41', '20', '2742', '5165', '0'), +('13', '41', '20', '1364', '2073', '0'), +('13', '41', '20', '1217', '1822', '0'), +('13', '41', '12', '1243', '4999', '0'), +('13', '41', '12', '20655', '3612', '0'), +('13', '41', '12', '2336', '3488', '0'), +('13', '41', '12', '2923', '3074', '0'), +('13', '41', '18', '1651', '2421', '0'), +('13', '41', '18', '4410', '1142', '0'), +('13', '41', '18', '1244', '586', '0'), +('13', '41', '18', '1221', '454', '0'), +('13', '41', '19', '4407', '4518', '0'), +('13', '41', '19', '68239', '3409', '0'), +('13', '41', '19', '1368', '2016', '0'), +('13', '41', '19', '1652', '1834', '0'), +('13', '41', '13', '14759', '8113', '0'), +('13', '41', '13', '11650', '8066', '0'), +('13', '41', '13', '6359', '5806', '0'), +('13', '41', '13', '13500', '5391', '0'), +('13', '41', '14', '14759', '8113', '0'), +('13', '41', '14', '6359', '5806', '0'), +('13', '41', '14', '10219', '5681', '0'), +('13', '41', '14', '9246', '4965', '0'), +('13', '41', '11', '9246', '4965', '0'), +('13', '41', '11', '14762', '2204', '0'), +('13', '41', '11', '13353', '1500', '0'), +('13', '41', '11', '60396', '525', '0'), +('13', '42', '22', '10323', '0', '0'), +('13', '42', '22', '9246', '0', '0'), +('13', '42', '22', '21509', '0', '0'), +('13', '42', '22', '8007', '0', '0'), +('13', '42', '1', '14702', '3750', '0'), +('13', '42', '1', '10082', '3140', '0'), +('13', '42', '1', '14701', '2862', '0'), +('13', '42', '1', '30361', '2640', '0'), +('13', '42', '2', '1239', '5996', '0'), +('13', '42', '2', '10143', '5368', '0'), +('13', '42', '2', '1211', '4952', '0'), +('13', '42', '2', '10141', '4578', '0'), +('13', '42', '3', '11052', '7610', '0'), +('13', '42', '3', '2707', '3584', '0'), +('13', '42', '3', '4505', '3582', '0'), +('13', '42', '3', '1212', '1825', '0'), +('13', '42', '5', '14557', '7549', '0'), +('13', '42', '5', '14703', '6050', '0'), +('13', '42', '5', '11646', '5896', '0'), +('13', '42', '5', '10216', '4049', '0'), +('13', '42', '8', '11603', '12877', '0'), +('13', '42', '8', '1274', '5602', '0'), +('13', '42', '8', '2349', '3554', '0'), +('13', '42', '8', '1057', '2735', '0'), +('13', '42', '6', '1542', '7938', '0'), +('13', '42', '6', '2708', '5587', '0'), +('13', '42', '6', '1557', '5310', '0'), +('13', '42', '6', '1905', '5081', '0'), +('13', '42', '17', '11641', '13192', '0'), +('13', '42', '17', '1240', '11294', '0'), +('13', '42', '17', '1644', '10903', '0'), +('13', '42', '17', '1214', '10299', '0'), +('13', '42', '7', '1241', '4056', '0'), +('13', '42', '7', '1218', '3996', '0'), +('13', '42', '7', '1648', '3361', '0'), +('13', '42', '7', '1362', '2624', '0'), +('13', '42', '9', '1274', '5602', '0'), +('13', '42', '9', '12805', '4256', '0'), +('13', '42', '9', '1649', '3040', '0'), +('13', '42', '9', '4408', '2570', '0'), +('13', '42', '15', '11687', '5561', '0'), +('13', '42', '15', '10150', '3004', '0'), +('13', '42', '15', '10163', '2300', '0'), +('13', '42', '15', '14651', '2224', '0'), +('13', '42', '20', '11666', '8358', '0'), +('13', '42', '20', '2742', '5168', '0'), +('13', '42', '20', '1364', '2122', '0'), +('13', '42', '20', '1217', '1834', '0'), +('13', '42', '12', '1243', '5084', '0'), +('13', '42', '12', '20655', '3636', '0'), +('13', '42', '12', '2336', '3549', '0'), +('13', '42', '12', '2923', '3074', '0'), +('13', '42', '18', '1651', '2457', '0'), +('13', '42', '18', '4410', '1142', '0'), +('13', '42', '18', '1244', '586', '0'), +('13', '42', '18', '1221', '454', '0'), +('13', '42', '19', '4407', '4626', '0'), +('13', '42', '19', '68239', '3446', '0'), +('13', '42', '19', '1368', '2016', '0'), +('13', '42', '19', '1652', '1834', '0'), +('13', '42', '13', '14759', '8184', '0'), +('13', '42', '13', '11650', '8157', '0'), +('13', '42', '13', '6359', '5927', '0'), +('13', '42', '13', '13500', '5512', '0'), +('13', '42', '14', '14759', '8184', '0'), +('13', '42', '14', '6359', '5927', '0'), +('13', '42', '14', '10219', '5681', '0'), +('13', '42', '14', '9246', '5086', '0'), +('13', '42', '11', '9246', '5086', '0'), +('13', '42', '11', '14762', '2204', '0'), +('13', '42', '11', '13353', '1500', '0'), +('13', '42', '11', '60396', '537', '0'), +('13', '43', '22', '10323', '0', '0'), +('13', '43', '22', '9246', '0', '0'), +('13', '43', '22', '21509', '0', '0'), +('13', '43', '22', '8007', '0', '0'), +('13', '43', '1', '14702', '3750', '0'), +('13', '43', '1', '10082', '3213', '0'), +('13', '43', '1', '14701', '2862', '0'), +('13', '43', '1', '30361', '2640', '0'), +('13', '43', '2', '1239', '6105', '0'), +('13', '43', '2', '10143', '5368', '0'), +('13', '43', '2', '1211', '5036', '0'), +('13', '43', '2', '10141', '4687', '0'), +('13', '43', '3', '11052', '7792', '0'), +('13', '43', '3', '2707', '3669', '0'), +('13', '43', '3', '4505', '3666', '0'), +('13', '43', '3', '1212', '1838', '0'), +('13', '43', '5', '14557', '7609', '0'), +('13', '43', '5', '11646', '6053', '0'), +('13', '43', '5', '14703', '6050', '0'), +('13', '43', '5', '10216', '4109', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '43', '8', '11603', '12985', '0'), +('13', '43', '8', '1274', '5711', '0'), +('13', '43', '8', '2349', '3554', '0'), +('13', '43', '8', '1057', '2796', '0'), +('13', '43', '6', '1542', '8046', '0'), +('13', '43', '6', '2708', '5588', '0'), +('13', '43', '6', '1557', '5310', '0'), +('13', '43', '6', '1905', '5082', '0'), +('13', '43', '17', '11641', '13373', '0'), +('13', '43', '17', '1240', '11466', '0'), +('13', '43', '17', '1644', '10964', '0'), +('13', '43', '17', '1214', '10460', '0'), +('13', '43', '7', '1241', '4140', '0'), +('13', '43', '7', '1218', '4080', '0'), +('13', '43', '7', '1648', '3421', '0'), +('13', '43', '7', '1362', '2624', '0'), +('13', '43', '9', '1274', '5711', '0'), +('13', '43', '9', '12805', '4256', '0'), +('13', '43', '9', '1649', '3076', '0'), +('13', '43', '9', '4408', '2630', '0'), +('13', '43', '15', '11687', '5621', '0'), +('13', '43', '15', '10150', '3004', '0'), +('13', '43', '15', '10163', '2300', '0'), +('13', '43', '15', '14651', '2224', '0'), +('13', '43', '20', '11666', '8360', '0'), +('13', '43', '20', '2742', '5170', '0'), +('13', '43', '20', '1364', '2170', '0'), +('13', '43', '20', '1217', '1846', '0'), +('13', '43', '12', '1243', '5168', '0'), +('13', '43', '12', '20655', '3661', '0'), +('13', '43', '12', '2336', '3609', '0'), +('13', '43', '12', '2923', '3074', '0'), +('13', '43', '18', '1651', '2493', '0'), +('13', '43', '18', '4410', '1142', '0'), +('13', '43', '18', '1244', '586', '0'), +('13', '43', '18', '1221', '454', '0'), +('13', '43', '19', '4407', '4735', '0'), +('13', '43', '19', '68239', '3482', '0'), +('13', '43', '19', '1368', '2016', '0'), +('13', '43', '19', '1652', '1834', '0'), +('13', '43', '13', '14759', '8256', '0'), +('13', '43', '13', '11650', '8247', '0'), +('13', '43', '13', '6359', '6047', '0'), +('13', '43', '13', '13500', '5632', '0'), +('13', '43', '14', '14759', '8256', '0'), +('13', '43', '14', '6359', '6047', '0'), +('13', '43', '14', '10219', '5681', '0'), +('13', '43', '14', '9246', '5206', '0'), +('13', '43', '11', '9246', '5206', '0'), +('13', '43', '11', '14762', '2204', '0'), +('13', '43', '11', '13353', '1500', '0'), +('13', '43', '11', '60396', '549', '0'), +('13', '44', '22', '10323', '0', '0'), +('13', '44', '22', '9246', '0', '0'), +('13', '44', '22', '21509', '0', '0'), +('13', '44', '22', '8007', '0', '0'), +('13', '44', '1', '14702', '3750', '0'), +('13', '44', '1', '10082', '3285', '0'), +('13', '44', '1', '14701', '2862', '0'), +('13', '44', '1', '10107', '2658', '0'), +('13', '44', '2', '1239', '6214', '0'), +('13', '44', '2', '10143', '5368', '0'), +('13', '44', '2', '1211', '5121', '0'), +('13', '44', '2', '10141', '4796', '0'), +('13', '44', '3', '11052', '7973', '0'), +('13', '44', '3', '2707', '3753', '0'), +('13', '44', '3', '4505', '3751', '0'), +('13', '44', '3', '1212', '1850', '0'), +('13', '44', '5', '14557', '7670', '0'), +('13', '44', '5', '11646', '6210', '0'), +('13', '44', '5', '14703', '6050', '0'), +('13', '44', '5', '10216', '4170', '0'), +('13', '44', '8', '11603', '13094', '0'), +('13', '44', '8', '1274', '5820', '0'), +('13', '44', '8', '2349', '3554', '0'), +('13', '44', '8', '1057', '2856', '0'), +('13', '44', '6', '1542', '8155', '0'), +('13', '44', '6', '2708', '5589', '0'), +('13', '44', '6', '1557', '5310', '0'), +('13', '44', '6', '1905', '5083', '0'), +('13', '44', '17', '11641', '13554', '0'), +('13', '44', '17', '1240', '11638', '0'), +('13', '44', '17', '1644', '11024', '0'), +('13', '44', '17', '1214', '10620', '0'), +('13', '44', '7', '1241', '4225', '0'), +('13', '44', '7', '1218', '4165', '0'), +('13', '44', '7', '1648', '3482', '0'), +('13', '44', '7', '1362', '2624', '0'), +('13', '44', '9', '1274', '5820', '0'), +('13', '44', '9', '12805', '4256', '0'), +('13', '44', '9', '1649', '3113', '0'), +('13', '44', '9', '4408', '2691', '0'), +('13', '44', '15', '11687', '5682', '0'), +('13', '44', '15', '10150', '3004', '0'), +('13', '44', '15', '10163', '2300', '0'), +('13', '44', '15', '14651', '2224', '0'), +('13', '44', '20', '11666', '8361', '0'), +('13', '44', '20', '2742', '5173', '0'), +('13', '44', '20', '1364', '2218', '0'), +('13', '44', '20', '1217', '1858', '0'), +('13', '44', '12', '1243', '5253', '0'), +('13', '44', '12', '20655', '3686', '0'), +('13', '44', '12', '2336', '3670', '0'), +('13', '44', '12', '2923', '3074', '0'), +('13', '44', '18', '1651', '2530', '0'), +('13', '44', '18', '4410', '1142', '0'), +('13', '44', '18', '1244', '586', '0'), +('13', '44', '18', '1221', '454', '0'), +('13', '44', '19', '4407', '4844', '0'), +('13', '44', '19', '68239', '3518', '0'), +('13', '44', '19', '1368', '2016', '0'), +('13', '44', '19', '1652', '1834', '0'), +('13', '44', '13', '11650', '8338', '0'), +('13', '44', '13', '14759', '8327', '0'), +('13', '44', '13', '6359', '6168', '0'), +('13', '44', '13', '13500', '5753', '0'), +('13', '44', '14', '14759', '8327', '0'), +('13', '44', '14', '6359', '6168', '0'), +('13', '44', '14', '10219', '5681', '0'), +('13', '44', '14', '9246', '5327', '0'), +('13', '44', '11', '9246', '5327', '0'), +('13', '44', '11', '14762', '2204', '0'), +('13', '44', '11', '13353', '1500', '0'), +('13', '44', '11', '60396', '562', '0'), +('13', '45', '22', '10323', '0', '0'), +('13', '45', '22', '9246', '0', '0'), +('13', '45', '22', '21509', '0', '0'), +('13', '45', '22', '8007', '0', '0'), +('13', '45', '1', '14702', '3750', '0'), +('13', '45', '1', '10082', '3358', '0'), +('13', '45', '1', '14701', '2862', '0'), +('13', '45', '1', '10107', '2718', '0'), +('13', '45', '2', '1239', '6323', '0'), +('13', '45', '2', '10143', '5368', '0'), +('13', '45', '2', '1211', '5205', '0'), +('13', '45', '2', '10141', '4904', '0'), +('13', '45', '3', '11052', '8154', '0'), +('13', '45', '3', '2707', '3838', '0'), +('13', '45', '3', '4505', '3835', '0'), +('13', '45', '3', '1212', '1862', '0'), +('13', '45', '5', '14557', '7730', '0'), +('13', '45', '5', '11646', '6367', '0'), +('13', '45', '5', '14703', '6050', '0'), +('13', '45', '5', '10216', '4230', '0'), +('13', '45', '8', '11603', '13203', '0'), +('13', '45', '8', '1274', '5929', '0'), +('13', '45', '8', '2349', '3554', '0'), +('13', '45', '8', '1057', '2916', '0'), +('13', '45', '6', '1542', '8264', '0'), +('13', '45', '6', '2708', '5591', '0'), +('13', '45', '6', '1557', '5310', '0'), +('13', '45', '6', '1905', '5085', '0'), +('13', '45', '17', '11641', '13736', '0'), +('13', '45', '17', '1240', '11810', '0'), +('13', '45', '17', '1644', '11084', '0'), +('13', '45', '17', '1214', '10780', '0'), +('13', '45', '7', '1241', '4309', '0'), +('13', '45', '7', '1218', '4249', '0'), +('13', '45', '7', '1648', '3542', '0'), +('13', '45', '7', '1362', '2624', '0'), +('13', '45', '9', '1274', '5929', '0'), +('13', '45', '9', '12805', '4256', '0'), +('13', '45', '9', '1649', '3149', '0'), +('13', '45', '9', '4408', '2751', '0'), +('13', '45', '15', '11687', '5742', '0'), +('13', '45', '15', '10150', '3004', '0'), +('13', '45', '15', '10163', '2300', '0'), +('13', '45', '15', '14651', '2224', '0'), +('13', '45', '20', '11666', '8363', '0'), +('13', '45', '20', '2742', '5175', '0'), +('13', '45', '20', '1364', '2266', '0'), +('13', '45', '20', '1217', '1870', '0'), +('13', '45', '12', '1243', '5337', '0'), +('13', '45', '12', '2336', '3730', '0'), +('13', '45', '12', '20655', '3710', '0'), +('13', '45', '12', '1650', '3103', '0'), +('13', '45', '18', '1651', '2566', '0'), +('13', '45', '18', '4410', '1142', '0'), +('13', '45', '18', '1244', '586', '0'), +('13', '45', '18', '1221', '454', '0'), +('13', '45', '19', '4407', '4953', '0'), +('13', '45', '19', '68239', '3554', '0'), +('13', '45', '19', '1368', '2016', '0'), +('13', '45', '19', '1652', '1834', '0'), +('13', '45', '13', '11650', '8428', '0'), +('13', '45', '13', '14759', '8398', '0'), +('13', '45', '13', '6359', '6289', '0'), +('13', '45', '13', '13500', '5874', '0'), +('13', '45', '14', '14759', '8398', '0'), +('13', '45', '14', '6359', '6289', '0'), +('13', '45', '14', '10219', '5681', '0'), +('13', '45', '14', '9246', '5448', '0'), +('13', '45', '11', '9246', '5448', '0'), +('13', '45', '11', '14762', '2204', '0'), +('13', '45', '11', '13353', '1500', '0'), +('13', '45', '11', '60396', '574', '0'), +('13', '46', '22', '10323', '0', '0'), +('13', '46', '22', '9246', '0', '0'), +('13', '46', '22', '21509', '0', '0'), +('13', '46', '22', '8007', '0', '0'), +('13', '46', '1', '14702', '3750', '0'), +('13', '46', '1', '10082', '3430', '0'), +('13', '46', '1', '14701', '2862', '0'), +('13', '46', '1', '10107', '2778', '0'), +('13', '46', '2', '1239', '6431', '0'), +('13', '46', '2', '10143', '5368', '0'), +('13', '46', '2', '1211', '5290', '0'), +('13', '46', '2', '10141', '5013', '0'), +('13', '46', '3', '11052', '8335', '0'), +('13', '46', '3', '2707', '3922', '0'), +('13', '46', '3', '4505', '3920', '0'), +('13', '46', '3', '1212', '1874', '0'), +('13', '46', '5', '14557', '7790', '0'), +('13', '46', '5', '11646', '6524', '0'), +('13', '46', '5', '14703', '6050', '0'), +('13', '46', '5', '10216', '4290', '0'), +('13', '46', '8', '11603', '13312', '0'), +('13', '46', '8', '1274', '6037', '0'), +('13', '46', '8', '2349', '3554', '0'), +('13', '46', '8', '1057', '2977', '0'), +('13', '46', '6', '1542', '8372', '0'), +('13', '46', '6', '2708', '5592', '0'), +('13', '46', '6', '1557', '5310', '0'), +('13', '46', '6', '1905', '5086', '0'), +('13', '46', '17', '11641', '13917', '0'), +('13', '46', '17', '1240', '11982', '0'), +('13', '46', '17', '1644', '11145', '0'), +('13', '46', '17', '1214', '10940', '0'), +('13', '46', '7', '1241', '4394', '0'), +('13', '46', '7', '1218', '4334', '0'), +('13', '46', '7', '1648', '3603', '0'), +('13', '46', '7', '1362', '2624', '0'), +('13', '46', '9', '1274', '6037', '0'), +('13', '46', '9', '12805', '4256', '0'), +('13', '46', '9', '1649', '3185', '0'), +('13', '46', '9', '4408', '2812', '0'), +('13', '46', '15', '11687', '5803', '0'), +('13', '46', '15', '10150', '3004', '0'), +('13', '46', '15', '10163', '2300', '0'), +('13', '46', '15', '14651', '2224', '0'), +('13', '46', '20', '11666', '8365', '0'), +('13', '46', '20', '2742', '5178', '0'), +('13', '46', '20', '1364', '2315', '0'), +('13', '46', '20', '1217', '1882', '0'), +('13', '46', '12', '1243', '5422', '0'), +('13', '46', '12', '2336', '3790', '0'), +('13', '46', '12', '20655', '3735', '0'), +('13', '46', '12', '1650', '3152', '0'), +('13', '46', '18', '1651', '2602', '0'), +('13', '46', '18', '4410', '1142', '0'), +('13', '46', '18', '1244', '586', '0'), +('13', '46', '18', '1221', '454', '0'), +('13', '46', '19', '4407', '5061', '0'), +('13', '46', '19', '68239', '3590', '0'), +('13', '46', '19', '1368', '2016', '0'), +('13', '46', '19', '1652', '1834', '0'), +('13', '46', '13', '11650', '8519', '0'), +('13', '46', '13', '14759', '8469', '0'), +('13', '46', '13', '6359', '6410', '0'), +('13', '46', '13', '13500', '5995', '0'), +('13', '46', '14', '14759', '8469', '0'), +('13', '46', '14', '6359', '6410', '0'), +('13', '46', '14', '10219', '5681', '0'), +('13', '46', '14', '9246', '5569', '0'), +('13', '46', '11', '9246', '5569', '0'), +('13', '46', '11', '14762', '2204', '0'), +('13', '46', '11', '13353', '1500', '0'), +('13', '46', '11', '60396', '586', '0'), +('13', '47', '22', '10323', '0', '0'), +('13', '47', '22', '9246', '0', '0'), +('13', '47', '22', '21509', '0', '0'), +('13', '47', '22', '8007', '0', '0'), +('13', '47', '1', '14702', '3750', '0'), +('13', '47', '1', '10082', '3503', '0'), +('13', '47', '1', '14701', '2862', '0'), +('13', '47', '1', '10107', '2839', '0'), +('13', '47', '2', '1239', '6540', '0'), +('13', '47', '2', '1211', '5375', '0'), +('13', '47', '2', '10143', '5368', '0'), +('13', '47', '2', '10141', '5122', '0'), +('13', '47', '3', '11052', '8516', '0'), +('13', '47', '3', '2707', '4007', '0'), +('13', '47', '3', '4505', '4005', '0'), +('13', '47', '3', '1212', '1886', '0'), +('13', '47', '5', '14557', '7851', '0'), +('13', '47', '5', '11646', '6681', '0'), +('13', '47', '5', '14703', '6050', '0'), +('13', '47', '5', '10216', '4351', '0'), +('13', '47', '8', '11603', '13420', '0'), +('13', '47', '8', '1274', '6146', '0'), +('13', '47', '8', '2349', '3554', '0'), +('13', '47', '8', '1057', '3037', '0'), +('13', '47', '6', '1542', '8481', '0'), +('13', '47', '6', '2708', '5593', '0'), +('13', '47', '6', '1557', '5310', '0'), +('13', '47', '6', '1905', '5087', '0'), +('13', '47', '17', '11641', '14098', '0'), +('13', '47', '17', '1240', '12154', '0'), +('13', '47', '17', '1644', '11205', '0'), +('13', '47', '17', '1214', '11100', '0'), +('13', '47', '7', '1241', '4478', '0'), +('13', '47', '7', '1218', '4418', '0'), +('13', '47', '7', '1648', '3663', '0'), +('13', '47', '7', '1362', '2624', '0'), +('13', '47', '9', '1274', '6146', '0'), +('13', '47', '9', '12805', '4256', '0'), +('13', '47', '9', '1649', '3221', '0'), +('13', '47', '9', '4408', '2872', '0'), +('13', '47', '15', '11687', '5863', '0'), +('13', '47', '15', '10150', '3004', '0'), +('13', '47', '15', '10163', '2300', '0'), +('13', '47', '15', '14639', '2271', '0'), +('13', '47', '20', '11666', '8366', '0'), +('13', '47', '20', '2742', '5180', '0'), +('13', '47', '20', '1364', '2363', '0'), +('13', '47', '20', '1217', '1894', '0'), +('13', '47', '12', '1243', '5506', '0'), +('13', '47', '12', '2336', '3851', '0'), +('13', '47', '12', '20655', '3760', '0'), +('13', '47', '12', '4345', '3211', '0'), +('13', '47', '18', '1651', '2638', '0'), +('13', '47', '18', '4410', '1142', '0'), +('13', '47', '18', '1244', '586', '0'), +('13', '47', '18', '1221', '454', '0'), +('13', '47', '19', '4407', '5170', '0'), +('13', '47', '19', '68239', '3627', '0'), +('13', '47', '19', '1368', '2016', '0'), +('13', '47', '19', '1652', '1834', '0'), +('13', '47', '13', '11650', '8610', '0'), +('13', '47', '13', '14759', '8541', '0'), +('13', '47', '13', '6359', '6531', '0'), +('13', '47', '13', '13500', '6116', '0'), +('13', '47', '14', '14759', '8541', '0'), +('13', '47', '14', '6359', '6531', '0'), +('13', '47', '14', '9246', '5690', '0'), +('13', '47', '14', '10219', '5681', '0'), +('13', '47', '11', '9246', '5690', '0'), +('13', '47', '11', '14762', '2204', '0'), +('13', '47', '11', '13353', '1500', '0'), +('13', '47', '11', '60396', '598', '0'), +('13', '48', '22', '10323', '0', '0'), +('13', '48', '22', '9246', '0', '0'), +('13', '48', '22', '21509', '0', '0'), +('13', '48', '22', '8007', '0', '0'), +('13', '48', '1', '14702', '3750', '0'), +('13', '48', '1', '10082', '3575', '0'), +('13', '48', '1', '10107', '2899', '0'), +('13', '48', '1', '14701', '2862', '0'), +('13', '48', '2', '1239', '6649', '0'), +('13', '48', '2', '1211', '5459', '0'), +('13', '48', '2', '10143', '5368', '0'), +('13', '48', '2', '10141', '5231', '0'), +('13', '48', '3', '11052', '8698', '0'), +('13', '48', '3', '2707', '4091', '0'), +('13', '48', '3', '4505', '4089', '0'), +('13', '48', '3', '1212', '1898', '0'), +('13', '48', '5', '14557', '7911', '0'), +('13', '48', '5', '11646', '6838', '0'), +('13', '48', '5', '14703', '6050', '0'), +('13', '48', '5', '10216', '4411', '0'), +('13', '48', '8', '11603', '13529', '0'), +('13', '48', '8', '1274', '6255', '0'), +('13', '48', '8', '2349', '3554', '0'), +('13', '48', '8', '1057', '3098', '0'), +('13', '48', '6', '1542', '8590', '0'), +('13', '48', '6', '2708', '5594', '0'), +('13', '48', '6', '1557', '5310', '0'), +('13', '48', '6', '1905', '5088', '0'), +('13', '48', '17', '11641', '14279', '0'), +('13', '48', '17', '1240', '12326', '0'), +('13', '48', '17', '1644', '11266', '0'), +('13', '48', '17', '1214', '11261', '0'), +('13', '48', '7', '1241', '4563', '0'), +('13', '48', '7', '1218', '4503', '0'), +('13', '48', '7', '1648', '3723', '0'), +('13', '48', '7', '1362', '2624', '0'), +('13', '48', '9', '1274', '6255', '0'), +('13', '48', '9', '12805', '4256', '0'), +('13', '48', '9', '1649', '3258', '0'), +('13', '48', '9', '4408', '2932', '0'), +('13', '48', '15', '11687', '5923', '0'), +('13', '48', '15', '10150', '3004', '0'), +('13', '48', '15', '14639', '2319', '0'), +('13', '48', '15', '10163', '2300', '0'), +('13', '48', '20', '11666', '8368', '0'), +('13', '48', '20', '2742', '5182', '0'), +('13', '48', '20', '1364', '2411', '0'), +('13', '48', '20', '1217', '1906', '0'), +('13', '48', '12', '1243', '5591', '0'), +('13', '48', '12', '2336', '3911', '0'), +('13', '48', '12', '20655', '3784', '0'), +('13', '48', '12', '4345', '3272', '0'), +('13', '48', '18', '1651', '2675', '0'), +('13', '48', '18', '4410', '1142', '0'), +('13', '48', '18', '1244', '586', '0'), +('13', '48', '18', '1221', '454', '0'), +('13', '48', '19', '4407', '5279', '0'), +('13', '48', '19', '68239', '3663', '0'), +('13', '48', '19', '1368', '2016', '0'), +('13', '48', '19', '1652', '1834', '0'), +('13', '48', '13', '11650', '8700', '0'), +('13', '48', '13', '14759', '8612', '0'), +('13', '48', '13', '6359', '6651', '0'), +('13', '48', '13', '13500', '6236', '0'), +('13', '48', '14', '14759', '8612', '0'), +('13', '48', '14', '6359', '6651', '0'), +('13', '48', '14', '9246', '5810', '0'), +('13', '48', '14', '10219', '5681', '0'), +('13', '48', '11', '9246', '5810', '0'), +('13', '48', '11', '14762', '2204', '0'), +('13', '48', '11', '13353', '1500', '0'), +('13', '48', '11', '60396', '610', '0'), +('13', '49', '22', '10323', '0', '0'), +('13', '49', '22', '9246', '0', '0'), +('13', '49', '22', '21509', '0', '0'), +('13', '49', '22', '8007', '0', '0'), +('13', '49', '1', '14702', '3750', '0'), +('13', '49', '1', '10082', '3648', '0'), +('13', '49', '1', '10107', '2960', '0'), +('13', '49', '1', '14701', '2862', '0'), +('13', '49', '2', '1239', '6757', '0'), +('13', '49', '2', '1211', '5544', '0'), +('13', '49', '2', '10143', '5368', '0'), +('13', '49', '2', '10141', '5339', '0'), +('13', '49', '3', '11052', '8879', '0'), +('13', '49', '3', '2707', '4176', '0'), +('13', '49', '3', '4505', '4174', '0'), +('13', '49', '3', '1212', '1910', '0'), +('13', '49', '5', '14557', '7972', '0'), +('13', '49', '5', '11646', '6995', '0'), +('13', '49', '5', '14703', '6050', '0'), +('13', '49', '5', '10216', '4472', '0'), +('13', '49', '8', '11603', '13638', '0'), +('13', '49', '8', '1274', '6364', '0'), +('13', '49', '8', '2349', '3554', '0'), +('13', '49', '8', '1057', '3158', '0'), +('13', '49', '6', '1542', '8699', '0'), +('13', '49', '6', '2708', '5595', '0'), +('13', '49', '6', '1557', '5310', '0'), +('13', '49', '6', '1905', '5089', '0'), +('13', '49', '17', '11641', '14460', '0'), +('13', '49', '17', '1240', '12498', '0'), +('13', '49', '17', '1214', '11421', '0'), +('13', '49', '17', '1644', '11326', '0'), +('13', '49', '7', '1241', '4648', '0'), +('13', '49', '7', '1218', '4588', '0'), +('13', '49', '7', '1648', '3784', '0'), +('13', '49', '7', '1362', '2624', '0'), +('13', '49', '9', '1274', '6364', '0'), +('13', '49', '9', '12805', '4256', '0'), +('13', '49', '9', '1649', '3294', '0'), +('13', '49', '9', '4408', '2993', '0'), +('13', '49', '15', '11687', '5984', '0'), +('13', '49', '15', '10150', '3004', '0'), +('13', '49', '15', '14639', '2368', '0'), +('13', '49', '15', '10163', '2300', '0'), +('13', '49', '20', '11666', '8370', '0'), +('13', '49', '20', '2742', '5185', '0'), +('13', '49', '20', '1364', '2460', '0'), +('13', '49', '20', '1217', '1918', '0'), +('13', '49', '12', '1243', '5675', '0'), +('13', '49', '12', '2336', '3972', '0'), +('13', '49', '12', '20655', '3809', '0'), +('13', '49', '12', '4345', '3332', '0'), +('13', '49', '18', '1651', '2711', '0'), +('13', '49', '18', '4410', '1142', '0'), +('13', '49', '18', '1244', '586', '0'), +('13', '49', '18', '1221', '454', '0'), +('13', '49', '19', '4407', '5387', '0'), +('13', '49', '19', '68239', '3699', '0'), +('13', '49', '19', '1368', '2016', '0'), +('13', '49', '19', '1652', '1834', '0'), +('13', '49', '13', '11650', '8791', '0'), +('13', '49', '13', '14759', '8683', '0'), +('13', '49', '13', '6359', '6772', '0'), +('13', '49', '13', '13500', '6357', '0'), +('13', '49', '14', '14759', '8683', '0'), +('13', '49', '14', '6359', '6772', '0'), +('13', '49', '14', '9246', '5931', '0'), +('13', '49', '14', '10219', '5681', '0'), +('13', '49', '11', '9246', '5931', '0'), +('13', '49', '11', '14762', '2204', '0'), +('13', '49', '11', '13353', '1500', '0'), +('13', '49', '11', '60396', '622', '0'), +('13', '50', '22', '10323', '0', '0'), +('13', '50', '22', '9246', '0', '0'), +('13', '50', '22', '21509', '0', '0'), +('13', '50', '22', '8007', '0', '0'), +('13', '50', '1', '14702', '3750', '0'), +('13', '50', '1', '10082', '3720', '0'), +('13', '50', '1', '10107', '3020', '0'), +('13', '50', '1', '14701', '2862', '0'), +('13', '50', '2', '1239', '6866', '0'), +('13', '50', '2', '1211', '5628', '0'), +('13', '50', '2', '10141', '5448', '0'), +('13', '50', '2', '10143', '5368', '0'), +('13', '50', '3', '11052', '9060', '0'), +('13', '50', '3', '2707', '4261', '0'), +('13', '50', '3', '4505', '4258', '0'), +('13', '50', '3', '1212', '1922', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '50', '5', '14557', '8032', '0'), +('13', '50', '5', '11646', '7152', '0'), +('13', '50', '5', '14703', '6050', '0'), +('13', '50', '5', '10216', '4532', '0'), +('13', '50', '8', '11603', '13746', '0'), +('13', '50', '8', '1274', '6472', '0'), +('13', '50', '8', '2349', '3554', '0'), +('13', '50', '8', '1057', '3218', '0'), +('13', '50', '6', '1542', '8807', '0'), +('13', '50', '6', '2708', '5597', '0'), +('13', '50', '6', '1557', '5310', '0'), +('13', '50', '6', '1905', '5091', '0'), +('13', '50', '17', '11641', '14642', '0'), +('13', '50', '17', '1240', '12670', '0'), +('13', '50', '17', '1214', '11581', '0'), +('13', '50', '17', '1644', '11386', '0'), +('13', '50', '7', '1241', '4732', '0'), +('13', '50', '7', '1218', '4672', '0'), +('13', '50', '7', '1648', '3844', '0'), +('13', '50', '7', '1362', '2624', '0'), +('13', '50', '9', '1274', '6472', '0'), +('13', '50', '9', '12805', '4256', '0'), +('13', '50', '9', '1649', '3330', '0'), +('13', '50', '9', '4408', '3053', '0'), +('13', '50', '15', '11687', '6044', '0'), +('13', '50', '15', '10150', '3004', '0'), +('13', '50', '15', '14639', '2416', '0'), +('13', '50', '15', '10163', '2300', '0'), +('13', '50', '20', '11666', '8371', '0'), +('13', '50', '20', '2742', '5187', '0'), +('13', '50', '20', '1364', '2508', '0'), +('13', '50', '20', '1217', '1931', '0'), +('13', '50', '12', '1243', '5760', '0'), +('13', '50', '12', '2336', '4032', '0'), +('13', '50', '12', '20655', '3834', '0'), +('13', '50', '12', '4345', '3392', '0'), +('13', '50', '18', '1651', '2747', '0'), +('13', '50', '18', '4410', '1142', '0'), +('13', '50', '18', '1244', '586', '0'), +('13', '50', '18', '1221', '454', '0'), +('13', '50', '19', '4407', '5496', '0'), +('13', '50', '19', '68239', '3735', '0'), +('13', '50', '19', '1368', '2016', '0'), +('13', '50', '19', '1652', '1834', '0'), +('13', '50', '13', '11650', '8881', '0'), +('13', '50', '13', '14759', '8755', '0'), +('13', '50', '13', '6359', '6893', '0'), +('13', '50', '13', '13500', '6478', '0'), +('13', '50', '14', '14759', '8755', '0'), +('13', '50', '14', '6359', '6893', '0'), +('13', '50', '14', '9246', '6052', '0'), +('13', '50', '14', '10404', '5736', '0'), +('13', '50', '11', '9246', '6052', '0'), +('13', '50', '11', '14762', '2204', '0'), +('13', '50', '11', '13353', '1500', '0'), +('13', '50', '11', '60396', '634', '0'), +('13', '51', '22', '10323', '0', '0'), +('13', '51', '22', '9246', '0', '0'), +('13', '51', '22', '21509', '0', '0'), +('13', '51', '22', '8007', '0', '0'), +('13', '51', '1', '10082', '3793', '0'), +('13', '51', '1', '14702', '3750', '0'), +('13', '51', '1', '10107', '3080', '0'), +('13', '51', '1', '14701', '2862', '0'), +('13', '51', '2', '1239', '6975', '0'), +('13', '51', '2', '1211', '5713', '0'), +('13', '51', '2', '10141', '5557', '0'), +('13', '51', '2', '10143', '5368', '0'), +('13', '51', '3', '11052', '9241', '0'), +('13', '51', '3', '2707', '4345', '0'), +('13', '51', '3', '4505', '4343', '0'), +('13', '51', '3', '1212', '1934', '0'), +('13', '51', '5', '14557', '8092', '0'), +('13', '51', '5', '11646', '7309', '0'), +('13', '51', '5', '14703', '6050', '0'), +('13', '51', '5', '10216', '4592', '0'), +('13', '51', '8', '11603', '13855', '0'), +('13', '51', '8', '1274', '6581', '0'), +('13', '51', '8', '2349', '3554', '0'), +('13', '51', '8', '1057', '3279', '0'), +('13', '51', '6', '1542', '8916', '0'), +('13', '51', '6', '2708', '5598', '0'), +('13', '51', '6', '1557', '5310', '0'), +('13', '51', '6', '1905', '5092', '0'), +('13', '51', '17', '11641', '14823', '0'), +('13', '51', '17', '1240', '12842', '0'), +('13', '51', '17', '1214', '11741', '0'), +('13', '51', '17', '1644', '11447', '0'), +('13', '51', '7', '27885', '6055', '0'), +('13', '51', '7', '1241', '4817', '0'), +('13', '51', '7', '1218', '4757', '0'), +('13', '51', '7', '1648', '3905', '0'), +('13', '51', '9', '1274', '6581', '0'), +('13', '51', '9', '12805', '4256', '0'), +('13', '51', '9', '1649', '3366', '0'), +('13', '51', '9', '4408', '3114', '0'), +('13', '51', '15', '11687', '6105', '0'), +('13', '51', '15', '10150', '3004', '0'), +('13', '51', '15', '14639', '2464', '0'), +('13', '51', '15', '10163', '2300', '0'), +('13', '51', '20', '11666', '8373', '0'), +('13', '51', '20', '2742', '5190', '0'), +('13', '51', '20', '1364', '2556', '0'), +('13', '51', '20', '1217', '1943', '0'), +('13', '51', '12', '1243', '5845', '0'), +('13', '51', '12', '2336', '4092', '0'), +('13', '51', '12', '20655', '3858', '0'), +('13', '51', '12', '4345', '3453', '0'), +('13', '51', '18', '1651', '2783', '0'), +('13', '51', '18', '4410', '1142', '0'), +('13', '51', '18', '1244', '586', '0'), +('13', '51', '18', '1221', '454', '0'), +('13', '51', '19', '4407', '5605', '0'), +('13', '51', '19', '68239', '3772', '0'), +('13', '51', '19', '1368', '2016', '0'), +('13', '51', '19', '1652', '1834', '0'), +('13', '51', '13', '11650', '8972', '0'), +('13', '51', '13', '14759', '8826', '0'), +('13', '51', '13', '6359', '7014', '0'), +('13', '51', '13', '13500', '6599', '0'), +('13', '51', '14', '14759', '8826', '0'), +('13', '51', '14', '6359', '7014', '0'), +('13', '51', '14', '9246', '6173', '0'), +('13', '51', '14', '10404', '5845', '0'), +('13', '51', '11', '9246', '6173', '0'), +('13', '51', '11', '14762', '2204', '0'), +('13', '51', '11', '13353', '1500', '0'), +('13', '51', '11', '60396', '646', '0'), +('13', '52', '22', '10323', '0', '0'), +('13', '52', '22', '9246', '0', '0'), +('13', '52', '22', '21509', '0', '0'), +('13', '52', '22', '8007', '0', '0'), +('13', '52', '1', '10082', '3865', '0'), +('13', '52', '1', '14702', '3750', '0'), +('13', '52', '1', '10107', '3141', '0'), +('13', '52', '1', '14701', '2862', '0'), +('13', '52', '2', '1239', '7084', '0'), +('13', '52', '2', '1211', '5797', '0'), +('13', '52', '2', '10141', '5666', '0'), +('13', '52', '2', '10143', '5368', '0'), +('13', '52', '3', '11052', '9422', '0'), +('13', '52', '3', '2707', '4430', '0'), +('13', '52', '3', '4505', '4427', '0'), +('13', '52', '3', '1212', '1946', '0'), +('13', '52', '5', '14557', '8153', '0'), +('13', '52', '5', '11646', '7466', '0'), +('13', '52', '5', '14703', '6050', '0'), +('13', '52', '5', '10216', '4653', '0'), +('13', '52', '8', '11603', '13964', '0'), +('13', '52', '8', '1274', '6690', '0'), +('13', '52', '8', '2349', '3554', '0'), +('13', '52', '8', '1057', '3339', '0'), +('13', '52', '6', '1542', '9025', '0'), +('13', '52', '6', '2708', '5599', '0'), +('13', '52', '6', '1557', '5310', '0'), +('13', '52', '6', '1905', '5093', '0'), +('13', '52', '17', '11641', '15004', '0'), +('13', '52', '17', '1240', '13014', '0'), +('13', '52', '17', '1214', '11901', '0'), +('13', '52', '17', '1644', '11507', '0'), +('13', '52', '7', '27885', '6103', '0'), +('13', '52', '7', '1241', '4901', '0'), +('13', '52', '7', '1218', '4841', '0'), +('13', '52', '7', '1648', '3965', '0'), +('13', '52', '9', '1274', '6690', '0'), +('13', '52', '9', '12805', '4256', '0'), +('13', '52', '9', '1649', '3403', '0'), +('13', '52', '9', '4408', '3174', '0'), +('13', '52', '15', '11687', '6165', '0'), +('13', '52', '15', '10150', '3004', '0'), +('13', '52', '15', '14639', '2513', '0'), +('13', '52', '15', '10163', '2300', '0'), +('13', '52', '20', '11666', '8375', '0'), +('13', '52', '20', '2742', '5192', '0'), +('13', '52', '20', '1364', '2605', '0'), +('13', '52', '20', '1217', '1955', '0'), +('13', '52', '12', '1243', '5929', '0'), +('13', '52', '12', '2336', '4153', '0'), +('13', '52', '12', '20655', '3883', '0'), +('13', '52', '12', '4345', '3513', '0'), +('13', '52', '18', '1651', '2820', '0'), +('13', '52', '18', '4410', '1142', '0'), +('13', '52', '18', '1244', '586', '0'), +('13', '52', '18', '1221', '454', '0'), +('13', '52', '19', '4407', '5714', '0'), +('13', '52', '19', '68239', '3808', '0'), +('13', '52', '19', '1368', '2016', '0'), +('13', '52', '19', '1652', '1834', '0'), +('13', '52', '13', '11650', '9063', '0'), +('13', '52', '13', '14759', '8897', '0'), +('13', '52', '13', '6359', '7135', '0'), +('13', '52', '13', '13500', '6720', '0'), +('13', '52', '14', '14759', '8897', '0'), +('13', '52', '14', '6359', '7135', '0'), +('13', '52', '14', '9246', '6294', '0'), +('13', '52', '14', '10404', '5953', '0'), +('13', '52', '11', '9246', '6294', '0'), +('13', '52', '11', '14762', '2204', '0'), +('13', '52', '11', '13353', '1500', '0'), +('13', '52', '11', '60396', '658', '0'), +('13', '53', '22', '10323', '0', '0'), +('13', '53', '22', '9246', '0', '0'), +('13', '53', '22', '21509', '0', '0'), +('13', '53', '22', '8007', '0', '0'), +('13', '53', '1', '10082', '3938', '0'), +('13', '53', '1', '14702', '3750', '0'), +('13', '53', '1', '10107', '3201', '0'), +('13', '53', '1', '14701', '2862', '0'), +('13', '53', '2', '1239', '7192', '0'), +('13', '53', '2', '1211', '5882', '0'), +('13', '53', '2', '10141', '5774', '0'), +('13', '53', '2', '10143', '5368', '0'), +('13', '53', '3', '11052', '9604', '0'), +('13', '53', '3', '2707', '4514', '0'), +('13', '53', '3', '4505', '4512', '0'), +('13', '53', '3', '1212', '1958', '0'), +('13', '53', '5', '14557', '8213', '0'), +('13', '53', '5', '11646', '7623', '0'), +('13', '53', '5', '14703', '6050', '0'), +('13', '53', '5', '10216', '4713', '0'), +('13', '53', '8', '11603', '14073', '0'), +('13', '53', '8', '1274', '6798', '0'), +('13', '53', '8', '2349', '3554', '0'), +('13', '53', '8', '1057', '3400', '0'), +('13', '53', '6', '1542', '9133', '0'), +('13', '53', '6', '2708', '5600', '0'), +('13', '53', '6', '1557', '5310', '0'), +('13', '53', '6', '1905', '5094', '0'), +('13', '53', '17', '11641', '15185', '0'), +('13', '53', '17', '1240', '13186', '0'), +('13', '53', '17', '1214', '12061', '0'), +('13', '53', '17', '1644', '11568', '0'), +('13', '53', '7', '27885', '6151', '0'), +('13', '53', '7', '1241', '4986', '0'), +('13', '53', '7', '1218', '4926', '0'), +('13', '53', '7', '1648', '4025', '0'), +('13', '53', '9', '1274', '6798', '0'), +('13', '53', '9', '12805', '4256', '0'), +('13', '53', '9', '1649', '3439', '0'), +('13', '53', '9', '4408', '3234', '0'), +('13', '53', '15', '11687', '6225', '0'), +('13', '53', '15', '10150', '3004', '0'), +('13', '53', '15', '14639', '2561', '0'), +('13', '53', '15', '10163', '2300', '0'), +('13', '53', '20', '11666', '8376', '0'), +('13', '53', '20', '2742', '5194', '0'), +('13', '53', '20', '1364', '2653', '0'), +('13', '53', '20', '1217', '1967', '0'), +('13', '53', '12', '1243', '6014', '0'), +('13', '53', '12', '2336', '4213', '0'), +('13', '53', '12', '20655', '3908', '0'), +('13', '53', '12', '4345', '3574', '0'), +('13', '53', '18', '1651', '2856', '0'), +('13', '53', '18', '4410', '1142', '0'), +('13', '53', '18', '1244', '586', '0'), +('13', '53', '18', '1221', '454', '0'), +('13', '53', '19', '4407', '5822', '0'), +('13', '53', '19', '68239', '3844', '0'), +('13', '53', '19', '1368', '2016', '0'), +('13', '53', '19', '1652', '1834', '0'), +('13', '53', '13', '11650', '9153', '0'), +('13', '53', '13', '14759', '8968', '0'), +('13', '53', '13', '6359', '7255', '0'), +('13', '53', '13', '13500', '6840', '0'), +('13', '53', '14', '14759', '8968', '0'), +('13', '53', '14', '6359', '7255', '0'), +('13', '53', '14', '9246', '6414', '0'), +('13', '53', '14', '10404', '6062', '0'), +('13', '53', '11', '9246', '6414', '0'), +('13', '53', '11', '14762', '2204', '0'), +('13', '53', '11', '13353', '1500', '0'), +('13', '53', '11', '60396', '670', '0'), +('13', '54', '22', '10323', '0', '0'), +('13', '54', '22', '9246', '0', '0'), +('13', '54', '22', '21509', '0', '0'), +('13', '54', '22', '8007', '0', '0'), +('13', '54', '1', '10082', '4010', '0'), +('13', '54', '1', '14702', '3750', '0'), +('13', '54', '1', '10107', '3262', '0'), +('13', '54', '1', '14701', '2862', '0'), +('13', '54', '2', '1239', '7301', '0'), +('13', '54', '2', '1211', '5966', '0'), +('13', '54', '2', '10141', '5883', '0'), +('13', '54', '2', '10143', '5368', '0'), +('13', '54', '3', '11052', '9785', '0'), +('13', '54', '3', '2707', '4599', '0'), +('13', '54', '3', '4505', '4596', '0'), +('13', '54', '3', '10101', '1975', '0'), +('13', '54', '5', '14557', '8274', '0'), +('13', '54', '5', '11646', '7780', '0'), +('13', '54', '5', '14703', '6050', '0'), +('13', '54', '5', '10216', '4774', '0'), +('13', '54', '8', '11603', '14181', '0'), +('13', '54', '8', '1274', '6907', '0'), +('13', '54', '8', '2349', '3554', '0'), +('13', '54', '8', '1057', '3460', '0'), +('13', '54', '6', '1542', '9242', '0'), +('13', '54', '6', '2708', '5601', '0'), +('13', '54', '6', '1557', '5310', '0'), +('13', '54', '6', '1905', '5095', '0'), +('13', '54', '17', '11641', '15366', '0'), +('13', '54', '17', '1240', '13358', '0'), +('13', '54', '17', '1214', '12222', '0'), +('13', '54', '17', '1644', '11628', '0'), +('13', '54', '7', '27885', '6199', '0'), +('13', '54', '7', '1241', '5070', '0'), +('13', '54', '7', '1218', '5010', '0'), +('13', '54', '7', '1648', '4086', '0'), +('13', '54', '9', '1274', '6907', '0'), +('13', '54', '9', '12805', '4256', '0'), +('13', '54', '9', '1649', '3475', '0'), +('13', '54', '9', '4408', '3295', '0'), +('13', '54', '15', '11687', '6286', '0'), +('13', '54', '15', '10150', '3004', '0'), +('13', '54', '15', '14639', '2609', '0'), +('13', '54', '15', '10163', '2300', '0'), +('13', '54', '20', '11666', '8378', '0'), +('13', '54', '20', '2742', '5197', '0'), +('13', '54', '20', '1364', '2701', '0'), +('13', '54', '20', '1217', '1979', '0'), +('13', '54', '12', '1243', '6098', '0'), +('13', '54', '12', '2336', '4274', '0'), +('13', '54', '12', '20655', '3932', '0'), +('13', '54', '12', '4345', '3634', '0'), +('13', '54', '18', '1651', '2892', '0'), +('13', '54', '18', '4410', '1142', '0'), +('13', '54', '18', '1244', '586', '0'), +('13', '54', '18', '1221', '454', '0'), +('13', '54', '19', '4407', '5931', '0'), +('13', '54', '19', '68239', '3880', '0'), +('13', '54', '19', '1368', '2016', '0'), +('13', '54', '19', '1652', '1834', '0'), +('13', '54', '13', '11650', '9244', '0'), +('13', '54', '13', '14759', '9040', '0'), +('13', '54', '13', '6359', '7376', '0'), +('13', '54', '13', '13500', '6961', '0'), +('13', '54', '14', '14759', '9040', '0'), +('13', '54', '14', '6359', '7376', '0'), +('13', '54', '14', '9246', '6535', '0'), +('13', '54', '14', '10404', '6171', '0'), +('13', '54', '11', '9246', '6535', '0'), +('13', '54', '11', '14762', '2204', '0'), +('13', '54', '11', '13353', '1500', '0'), +('13', '54', '11', '60396', '682', '0'), +('13', '55', '22', '10323', '0', '0'), +('13', '55', '22', '9246', '0', '0'), +('13', '55', '22', '21509', '0', '0'), +('13', '55', '22', '8007', '0', '0'), +('13', '55', '1', '10082', '4083', '0'), +('13', '55', '1', '14702', '3750', '0'), +('13', '55', '1', '10107', '3322', '0'), +('13', '55', '1', '14701', '2862', '0'), +('13', '55', '2', '1239', '7410', '0'), +('13', '55', '2', '1211', '6051', '0'), +('13', '55', '2', '10141', '5992', '0'), +('13', '55', '2', '10143', '5368', '0'), +('13', '55', '3', '11052', '9966', '0'), +('13', '55', '3', '2707', '4683', '0'), +('13', '55', '3', '4505', '4681', '0'), +('13', '55', '3', '10101', '2011', '0'), +('13', '55', '5', '14557', '8334', '0'), +('13', '55', '5', '11646', '7937', '0'), +('13', '55', '5', '14703', '6050', '0'), +('13', '55', '5', '10216', '4834', '0'), +('13', '55', '8', '11603', '14290', '0'), +('13', '55', '8', '1274', '7016', '0'), +('13', '55', '8', '2349', '3554', '0'), +('13', '55', '8', '1057', '3520', '0'), +('13', '55', '6', '1542', '9351', '0'), +('13', '55', '6', '2708', '5603', '0'), +('13', '55', '6', '1557', '5310', '0'), +('13', '55', '6', '1905', '5097', '0'), +('13', '55', '17', '11641', '15548', '0'), +('13', '55', '17', '1240', '13531', '0'), +('13', '55', '17', '1214', '12382', '0'), +('13', '55', '17', '1644', '11688', '0'), +('13', '55', '7', '27885', '6248', '0'), +('13', '55', '7', '1241', '5155', '0'), +('13', '55', '7', '1218', '5095', '0'), +('13', '55', '7', '1648', '4146', '0'), +('13', '55', '9', '1274', '7016', '0'), +('13', '55', '9', '12805', '4256', '0'), +('13', '55', '9', '1649', '3511', '0'), +('13', '55', '9', '4408', '3355', '0'), +('13', '55', '15', '11687', '6346', '0'), +('13', '55', '15', '10150', '3004', '0'), +('13', '55', '15', '14639', '2658', '0'), +('13', '55', '15', '10163', '2300', '0'), +('13', '55', '20', '11666', '8380', '0'), +('13', '55', '20', '2742', '5199', '0'), +('13', '55', '20', '1364', '2750', '0'), +('13', '55', '20', '1217', '1991', '0'), +('13', '55', '12', '1243', '6183', '0'), +('13', '55', '12', '2336', '4334', '0'), +('13', '55', '12', '20655', '3957', '0'), +('13', '55', '12', '4345', '3694', '0'), +('13', '55', '18', '1651', '2928', '0'), +('13', '55', '18', '4410', '1142', '0'), +('13', '55', '18', '1244', '586', '0'), +('13', '55', '18', '1221', '454', '0'), +('13', '55', '19', '4407', '6040', '0'), +('13', '55', '19', '68239', '3917', '0'), +('13', '55', '19', '1368', '2016', '0'), +('13', '55', '19', '1652', '1834', '0'), +('13', '55', '13', '11650', '9334', '0'), +('13', '55', '13', '14759', '9111', '0'), +('13', '55', '13', '6359', '7497', '0'), +('13', '55', '13', '13500', '7082', '0'), +('13', '55', '14', '14759', '9111', '0'), +('13', '55', '14', '6359', '7497', '0'), +('13', '55', '14', '9246', '6656', '0'), +('13', '55', '14', '10404', '6280', '0'), +('13', '55', '11', '9246', '6656', '0'), +('13', '55', '11', '14762', '2204', '0'), +('13', '55', '11', '13353', '1500', '0'), +('13', '55', '11', '60396', '694', '0'), +('13', '56', '22', '10323', '0', '0'), +('13', '56', '22', '9246', '0', '0'), +('13', '56', '22', '21509', '0', '0'), +('13', '56', '22', '8007', '0', '0'), +('13', '56', '1', '10082', '4155', '0'), +('13', '56', '1', '14702', '3750', '0'), +('13', '56', '1', '10107', '3382', '0'), +('13', '56', '1', '14701', '2862', '0'), +('13', '56', '2', '1239', '7519', '0'), +('13', '56', '2', '1211', '6136', '0'), +('13', '56', '2', '10141', '6100', '0'), +('13', '56', '2', '10143', '5368', '0'), +('13', '56', '3', '11052', '10147', '0'), +('13', '56', '3', '2707', '4768', '0'), +('13', '56', '3', '4505', '4766', '0'), +('13', '56', '3', '10101', '2048', '0'), +('13', '56', '5', '14557', '8394', '0'), +('13', '56', '5', '11646', '8094', '0'), +('13', '56', '5', '14703', '6050', '0'), +('13', '56', '5', '10216', '4894', '0'), +('13', '56', '8', '11603', '14399', '0'), +('13', '56', '8', '1274', '7125', '0'), +('13', '56', '8', '1057', '3581', '0'), +('13', '56', '8', '2349', '3554', '0'), +('13', '56', '6', '1542', '9460', '0'), +('13', '56', '6', '2708', '5604', '0'), +('13', '56', '6', '1557', '5310', '0'), +('13', '56', '6', '1905', '5098', '0'), +('13', '56', '17', '11641', '15729', '0'), +('13', '56', '17', '1240', '13703', '0'), +('13', '56', '17', '1214', '12542', '0'), +('13', '56', '17', '1644', '11749', '0'), +('13', '56', '7', '27885', '6296', '0'), +('13', '56', '7', '1241', '5240', '0'), +('13', '56', '7', '1218', '5180', '0'), +('13', '56', '7', '1648', '4207', '0'), +('13', '56', '9', '1274', '7125', '0'), +('13', '56', '9', '12805', '4256', '0'), +('13', '56', '9', '1649', '3548', '0'), +('13', '56', '9', '4408', '3416', '0'), +('13', '56', '15', '11687', '6407', '0'), +('13', '56', '15', '10150', '3004', '0'), +('13', '56', '15', '14639', '2706', '0'), +('13', '56', '15', '10163', '2300', '0'), +('13', '56', '20', '11666', '8382', '0'), +('13', '56', '20', '2742', '5202', '0'), +('13', '56', '20', '1364', '2798', '0'), +('13', '56', '20', '1217', '2003', '0'), +('13', '56', '12', '1243', '6267', '0'), +('13', '56', '12', '2336', '4394', '0'), +('13', '56', '12', '20655', '3981', '0'), +('13', '56', '12', '4345', '3755', '0'), +('13', '56', '18', '1651', '2964', '0'), +('13', '56', '18', '4410', '1142', '0'), +('13', '56', '18', '1244', '586', '0'), +('13', '56', '18', '1221', '454', '0'), +('13', '56', '19', '4407', '6149', '0'), +('13', '56', '19', '68239', '3953', '0'), +('13', '56', '19', '1368', '2016', '0'), +('13', '56', '19', '1652', '1834', '0'), +('13', '56', '13', '11650', '9425', '0'), +('13', '56', '13', '14759', '9182', '0'), +('13', '56', '13', '6359', '7618', '0'), +('13', '56', '13', '13500', '7203', '0'), +('13', '56', '14', '14759', '9182', '0'), +('13', '56', '14', '6359', '7618', '0'), +('13', '56', '14', '9246', '6777', '0'), +('13', '56', '14', '10404', '6388', '0'), +('13', '56', '11', '9246', '6777', '0'), +('13', '56', '11', '14762', '2204', '0'), +('13', '56', '11', '13353', '1500', '0'), +('13', '56', '11', '60396', '706', '0'), +('13', '57', '22', '10323', '0', '0'), +('13', '57', '22', '9246', '0', '0'), +('13', '57', '22', '21509', '0', '0'), +('13', '57', '22', '8007', '0', '0'), +('13', '57', '1', '10082', '4228', '0'), +('13', '57', '1', '14702', '3750', '0'), +('13', '57', '1', '10107', '3443', '0'), +('13', '57', '1', '14701', '2862', '0'), +('13', '57', '2', '1239', '7627', '0'), +('13', '57', '2', '1211', '6220', '0'), +('13', '57', '2', '10141', '6209', '0'), +('13', '57', '2', '10143', '5368', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '57', '3', '11052', '10328', '0'), +('13', '57', '3', '2707', '4853', '0'), +('13', '57', '3', '4505', '4850', '0'), +('13', '57', '3', '10101', '2084', '0'), +('13', '57', '5', '14557', '8455', '0'), +('13', '57', '5', '11646', '8251', '0'), +('13', '57', '5', '14703', '6050', '0'), +('13', '57', '5', '10216', '4955', '0'), +('13', '57', '8', '11603', '14507', '0'), +('13', '57', '8', '1274', '7233', '0'), +('13', '57', '8', '1057', '3641', '0'), +('13', '57', '8', '2349', '3554', '0'), +('13', '57', '6', '1542', '9568', '0'), +('13', '57', '6', '2708', '5605', '0'), +('13', '57', '6', '1557', '5310', '0'), +('13', '57', '6', '1905', '5099', '0'), +('13', '57', '17', '11641', '15910', '0'), +('13', '57', '17', '1240', '13875', '0'), +('13', '57', '17', '1214', '12702', '0'), +('13', '57', '17', '1644', '11809', '0'), +('13', '57', '7', '27885', '6344', '0'), +('13', '57', '7', '1241', '5324', '0'), +('13', '57', '7', '1218', '5264', '0'), +('13', '57', '7', '1648', '4267', '0'), +('13', '57', '9', '1274', '7233', '0'), +('13', '57', '9', '12805', '4256', '0'), +('13', '57', '9', '1649', '3584', '0'), +('13', '57', '9', '4408', '3476', '0'), +('13', '57', '15', '11687', '6467', '0'), +('13', '57', '15', '10150', '3004', '0'), +('13', '57', '15', '14639', '2754', '0'), +('13', '57', '15', '10163', '2300', '0'), +('13', '57', '20', '11666', '8383', '0'), +('13', '57', '20', '2742', '5204', '0'), +('13', '57', '20', '1364', '2846', '0'), +('13', '57', '20', '1217', '2015', '0'), +('13', '57', '12', '1243', '6352', '0'), +('13', '57', '12', '2336', '4455', '0'), +('13', '57', '12', '20655', '4006', '0'), +('13', '57', '12', '4345', '3815', '0'), +('13', '57', '18', '1651', '3001', '0'), +('13', '57', '18', '4410', '1142', '0'), +('13', '57', '18', '1244', '586', '0'), +('13', '57', '18', '1221', '454', '0'), +('13', '57', '19', '4407', '6257', '0'), +('13', '57', '19', '68239', '3989', '0'), +('13', '57', '19', '1368', '2016', '0'), +('13', '57', '19', '1652', '1834', '0'), +('13', '57', '13', '11650', '9516', '0'), +('13', '57', '13', '14759', '9253', '0'), +('13', '57', '13', '6359', '7739', '0'), +('13', '57', '13', '13500', '7324', '0'), +('13', '57', '14', '14759', '9253', '0'), +('13', '57', '14', '6359', '7739', '0'), +('13', '57', '14', '9246', '6898', '0'), +('13', '57', '14', '10404', '6497', '0'), +('13', '57', '11', '9246', '6898', '0'), +('13', '57', '11', '14762', '2204', '0'), +('13', '57', '11', '13353', '1500', '0'), +('13', '57', '11', '60396', '719', '0'), +('13', '58', '22', '10323', '0', '0'), +('13', '58', '22', '9246', '0', '0'), +('13', '58', '22', '21509', '0', '0'), +('13', '58', '22', '8007', '0', '0'), +('13', '58', '1', '10082', '4300', '0'), +('13', '58', '1', '14702', '3750', '0'), +('13', '58', '1', '10107', '3503', '0'), +('13', '58', '1', '14701', '2862', '0'), +('13', '58', '2', '1239', '7736', '0'), +('13', '58', '2', '10141', '6318', '0'), +('13', '58', '2', '1211', '6305', '0'), +('13', '58', '2', '10143', '5368', '0'), +('13', '58', '3', '11052', '10510', '0'), +('13', '58', '3', '2707', '4937', '0'), +('13', '58', '3', '4505', '4935', '0'), +('13', '58', '3', '10101', '2120', '0'), +('13', '58', '5', '14557', '8515', '0'), +('13', '58', '5', '11646', '8408', '0'), +('13', '58', '5', '14703', '6050', '0'), +('13', '58', '5', '10216', '5015', '0'), +('13', '58', '8', '11603', '14616', '0'), +('13', '58', '8', '1274', '7342', '0'), +('13', '58', '8', '1057', '3702', '0'), +('13', '58', '8', '2349', '3554', '0'), +('13', '58', '6', '1542', '9677', '0'), +('13', '58', '6', '2708', '5606', '0'), +('13', '58', '6', '1557', '5310', '0'), +('13', '58', '6', '1905', '5100', '0'), +('13', '58', '17', '11641', '16091', '0'), +('13', '58', '17', '1240', '14047', '0'), +('13', '58', '17', '1214', '12862', '0'), +('13', '58', '17', '1644', '11870', '0'), +('13', '58', '7', '27885', '6393', '0'), +('13', '58', '7', '1241', '5409', '0'), +('13', '58', '7', '1218', '5349', '0'), +('13', '58', '7', '1648', '4327', '0'), +('13', '58', '9', '1274', '7342', '0'), +('13', '58', '9', '12805', '4256', '0'), +('13', '58', '9', '1649', '3620', '0'), +('13', '58', '9', '4408', '3536', '0'), +('13', '58', '15', '11687', '6527', '0'), +('13', '58', '15', '10150', '3004', '0'), +('13', '58', '15', '14639', '2803', '0'), +('13', '58', '15', '10163', '2300', '0'), +('13', '58', '20', '11666', '8385', '0'), +('13', '58', '20', '2742', '5207', '0'), +('13', '58', '20', '1364', '2895', '0'), +('13', '58', '20', '1217', '2027', '0'), +('13', '58', '12', '1243', '6436', '0'), +('13', '58', '12', '2336', '4515', '0'), +('13', '58', '12', '20655', '4031', '0'), +('13', '58', '12', '4345', '3876', '0'), +('13', '58', '18', '1651', '3037', '0'), +('13', '58', '18', '4410', '1142', '0'), +('13', '58', '18', '1244', '586', '0'), +('13', '58', '18', '1221', '454', '0'), +('13', '58', '19', '4407', '6366', '0'), +('13', '58', '19', '68239', '4025', '0'), +('13', '58', '19', '1368', '2016', '0'), +('13', '58', '19', '1652', '1834', '0'), +('13', '58', '13', '11650', '9606', '0'), +('13', '58', '13', '14759', '9325', '0'), +('13', '58', '13', '6359', '7859', '0'), +('13', '58', '13', '13500', '7444', '0'), +('13', '58', '14', '14759', '9325', '0'), +('13', '58', '14', '6359', '7859', '0'), +('13', '58', '14', '9246', '7018', '0'), +('13', '58', '14', '10404', '6606', '0'), +('13', '58', '11', '9246', '7018', '0'), +('13', '58', '11', '14762', '2204', '0'), +('13', '58', '11', '13353', '1500', '0'), +('13', '58', '11', '60396', '731', '0'), +('13', '59', '22', '10323', '0', '0'), +('13', '59', '22', '9246', '0', '0'), +('13', '59', '22', '21509', '0', '0'), +('13', '59', '22', '8007', '0', '0'), +('13', '59', '1', '10082', '4373', '0'), +('13', '59', '1', '14702', '3750', '0'), +('13', '59', '1', '10107', '3564', '0'), +('13', '59', '1', '14701', '2862', '0'), +('13', '59', '2', '1239', '7845', '0'), +('13', '59', '2', '10141', '6427', '0'), +('13', '59', '2', '1211', '6389', '0'), +('13', '59', '2', '10143', '5368', '0'), +('13', '59', '3', '11052', '10691', '0'), +('13', '59', '3', '2707', '5022', '0'), +('13', '59', '3', '4505', '5019', '0'), +('13', '59', '3', '10101', '2156', '0'), +('13', '59', '5', '14557', '8576', '0'), +('13', '59', '5', '11646', '8565', '0'), +('13', '59', '5', '14703', '6050', '0'), +('13', '59', '5', '10216', '5076', '0'), +('13', '59', '8', '11603', '14725', '0'), +('13', '59', '8', '1274', '7451', '0'), +('13', '59', '8', '1057', '3762', '0'), +('13', '59', '8', '2349', '3554', '0'), +('13', '59', '6', '1542', '9786', '0'), +('13', '59', '6', '2708', '5608', '0'), +('13', '59', '6', '1557', '5310', '0'), +('13', '59', '6', '1905', '5101', '0'), +('13', '59', '17', '11641', '16272', '0'), +('13', '59', '17', '1240', '14219', '0'), +('13', '59', '17', '1214', '13023', '0'), +('13', '59', '17', '1644', '11930', '0'), +('13', '59', '7', '27885', '6441', '0'), +('13', '59', '7', '1241', '5493', '0'), +('13', '59', '7', '1218', '5433', '0'), +('13', '59', '7', '1648', '4388', '0'), +('13', '59', '9', '1274', '7451', '0'), +('13', '59', '9', '12805', '4256', '0'), +('13', '59', '9', '1649', '3656', '0'), +('13', '59', '9', '4408', '3597', '0'), +('13', '59', '15', '11687', '6588', '0'), +('13', '59', '15', '10150', '3004', '0'), +('13', '59', '15', '14639', '2851', '0'), +('13', '59', '15', '10163', '2300', '0'), +('13', '59', '20', '11666', '8387', '0'), +('13', '59', '20', '2742', '5209', '0'), +('13', '59', '20', '1364', '2943', '0'), +('13', '59', '20', '1217', '2039', '0'), +('13', '59', '12', '1243', '6521', '0'), +('13', '59', '12', '2336', '4576', '0'), +('13', '59', '12', '20655', '4055', '0'), +('13', '59', '12', '4345', '3936', '0'), +('13', '59', '18', '1651', '3073', '0'), +('13', '59', '18', '4410', '1142', '0'), +('13', '59', '18', '1244', '586', '0'), +('13', '59', '18', '1221', '454', '0'), +('13', '59', '19', '4407', '6475', '0'), +('13', '59', '19', '68239', '4062', '0'), +('13', '59', '19', '1368', '2016', '0'), +('13', '59', '19', '1652', '1834', '0'), +('13', '59', '13', '11650', '9697', '0'), +('13', '59', '13', '14759', '9396', '0'), +('13', '59', '13', '6359', '7980', '0'), +('13', '59', '13', '13500', '7565', '0'), +('13', '59', '14', '14759', '9396', '0'), +('13', '59', '14', '6359', '7980', '0'), +('13', '59', '14', '9246', '7139', '0'), +('13', '59', '14', '10404', '6714', '0'), +('13', '59', '11', '9246', '7139', '0'), +('13', '59', '11', '14762', '2204', '0'), +('13', '59', '11', '13353', '1500', '0'), +('13', '59', '11', '60396', '743', '0'), +('13', '60', '22', '66397', '0', '3'), +('13', '60', '22', '61948', '0', '3'), +('13', '60', '22', '21805', '0', '3'), +('13', '60', '22', '21807', '0', '3'), +('13', '60', '1', '28944', '39921', '3'), +('13', '60', '1', '51230', '33363', '3'), +('13', '60', '1', '28922', '24005', '3'), +('13', '60', '1', '63170', '22601', '3'), +('13', '60', '2', '51235', '24699', '3'), +('13', '60', '2', '26763', '13586', '3'), +('13', '60', '2', '26762', '13232', '3'), +('13', '60', '2', '26605', '12648', '3'), +('13', '60', '3', '5772', '38355', '3'), +('13', '60', '3', '29452', '25243', '3'), +('13', '60', '3', '29319', '20952', '3'), +('13', '60', '3', '31328', '15502', '3'), +('13', '60', '5', '28901', '27242', '3'), +('13', '60', '5', '51229', '24650', '3'), +('13', '60', '5', '27244', '24274', '3'), +('13', '60', '5', '28911', '23596', '3'), +('13', '60', '8', '11603', '28359', '3'), +('13', '60', '8', '28964', '16235', '3'), +('13', '60', '8', '28992', '16055', '3'), +('13', '60', '8', '28918', '14751', '3'), +('13', '60', '6', '28920', '14492', '3'), +('13', '60', '6', '28902', '12905', '3'), +('13', '60', '6', '4315', '12652', '3'), +('13', '60', '6', '28919', '10507', '3'), +('13', '60', '17', '28910', '32177', '3'), +('13', '60', '17', '32933', '22007', '3'), +('13', '60', '17', '26776', '17411', '3'), +('13', '60', '17', '26604', '16211', '3'), +('13', '60', '7', '28924', '15286', '3'), +('13', '60', '7', '7868', '14101', '3'), +('13', '60', '7', '8288', '12504', '3'), +('13', '60', '7', '26555', '11907', '3'), +('13', '60', '9', '26781', '22811', '3'), +('13', '60', '9', '23508', '22201', '3'), +('13', '60', '9', '30552', '19371', '3'), +('13', '60', '9', '28891', '18002', '3'), +('13', '60', '15', '28944', '39921', '3'), +('13', '60', '15', '28905', '36953', '3'), +('13', '60', '15', '63170', '22601', '3'), +('13', '60', '15', '28993', '15374', '3'), +('13', '60', '20', '28916', '16298', '3'), +('13', '60', '20', '30534', '13698', '3'), +('13', '60', '20', '26549', '13048', '3'), +('13', '60', '20', '28938', '12486', '3'), +('13', '60', '12', '28144', '50605', '3'), +('13', '60', '12', '30534', '13698', '3'), +('13', '60', '12', '28967', '12003', '3'), +('13', '60', '12', '28972', '10232', '3'), +('13', '60', '18', '26777', '43522', '3'), +('13', '60', '18', '28932', '12327', '3'), +('13', '60', '18', '8289', '12323', '3'), +('13', '60', '18', '27316', '10613', '3'), +('13', '60', '19', '28881', '41982', '3'), +('13', '60', '19', '28934', '36903', '3'), +('13', '60', '19', '30570', '15600', '3'), +('13', '60', '19', '28148', '14332', '3'), +('13', '60', '13', '28981', '40449', '3'), +('13', '60', '13', '26778', '31370', '3'), +('13', '60', '13', '28917', '14804', '3'), +('13', '60', '13', '28978', '13538', '3'), +('13', '60', '14', '28981', '40449', '3'), +('13', '60', '14', '26778', '31370', '3'), +('13', '60', '14', '28915', '24070', '3'), +('13', '60', '14', '26780', '16401', '3'), +('13', '60', '11', '26778', '31370', '3'), +('13', '60', '11', '51223', '21959', '3'), +('13', '60', '11', '2698', '18002', '3'), +('13', '60', '11', '30562', '13584', '3'), +('13', '60', '22', '10323', '0', '2'), +('13', '60', '22', '9248', '0', '2'), +('13', '60', '22', '12425', '0', '2'), +('13', '60', '22', '30014', '0', '2'), +('13', '60', '1', '31228', '12489', '2'), +('13', '60', '1', '10912', '7764', '2'), +('13', '60', '1', '62234', '6602', '2'), +('13', '60', '1', '1720', '5655', '2'), +('13', '60', '2', '10913', '12388', '2'), +('13', '60', '2', '29648', '9159', '2'), +('13', '60', '2', '1867', '9119', '2'), +('13', '60', '2', '31322', '8477', '2'), +('13', '60', '3', '31233', '13571', '2'), +('13', '60', '3', '1547', '11983', '2'), +('13', '60', '3', '31244', '11452', '2'), +('13', '60', '3', '31463', '10628', '2'), +('13', '60', '5', '31460', '12280', '2'), +('13', '60', '5', '31318', '10435', '2'), +('13', '60', '5', '29459', '9685', '2'), +('13', '60', '5', '27259', '9128', '2'), +('13', '60', '8', '1628', '13160', '2'), +('13', '60', '8', '11603', '9438', '2'), +('13', '60', '8', '5779', '9161', '2'), +('13', '60', '8', '1622', '8796', '2'), +('13', '60', '6', '29468', '10684', '2'), +('13', '60', '6', '29472', '6368', '2'), +('13', '60', '6', '1114', '5851', '2'), +('13', '60', '6', '2708', '5520', '2'), +('13', '60', '17', '31239', '16808', '2'), +('13', '60', '17', '10845', '15736', '2'), +('13', '60', '17', '1552', '14938', '2'), +('13', '60', '17', '6865', '13027', '2'), +('13', '60', '7', '31342', '8713', '2'), +('13', '60', '7', '29485', '7509', '2'), +('13', '60', '7', '31237', '7104', '2'), +('13', '60', '7', '31371', '4209', '2'), +('13', '60', '9', '31460', '12280', '2'), +('13', '60', '9', '31246', '8306', '2'), +('13', '60', '9', '1559', '7811', '2'), +('13', '60', '9', '31314', '5785', '2'), +('13', '60', '15', '25211', '12700', '2'), +('13', '60', '15', '31231', '12533', '2'), +('13', '60', '15', '25198', '9869', '2'), +('13', '60', '15', '62373', '7596', '2'), +('13', '60', '20', '25858', '13737', '2'), +('13', '60', '20', '2510', '12414', '2'), +('13', '60', '20', '1556', '12317', '2'), +('13', '60', '20', '6835', '8298', '2'), +('13', '60', '12', '25857', '10812', '2'), +('13', '60', '12', '31340', '10679', '2'), +('13', '60', '12', '31306', '8988', '2'), +('13', '60', '12', '6869', '6594', '2'), +('13', '60', '18', '31339', '10479', '2'), +('13', '60', '18', '31173', '6283', '2'), +('13', '60', '18', '6870', '4296', '2'), +('13', '60', '18', '31371', '4209', '2'), +('13', '60', '19', '29645', '15540', '2'), +('13', '60', '19', '31245', '14390', '2'), +('13', '60', '19', '31355', '9547', '2'), +('13', '60', '19', '31327', '8711', '2'), +('13', '60', '13', '1156', '14797', '2'), +('13', '60', '13', '28034', '14149', '2'), +('13', '60', '13', '31326', '13591', '2'), +('13', '60', '13', '1117', '12559', '2'), +('13', '60', '14', '2498', '13825', '2'), +('13', '60', '14', '31462', '11532', '2'), +('13', '60', '14', '29449', '10978', '2'), +('13', '60', '14', '31302', '10130', '2'), +('13', '60', '11', '31466', '14368', '2'), +('13', '60', '11', '1554', '13897', '2'), +('13', '60', '11', '2698', '10516', '2'), +('13', '60', '11', '31302', '10130', '2'), +('13', '60', '22', '10323', '0', '1'), +('13', '60', '22', '12425', '0', '1'), +('13', '60', '22', '9246', '0', '1'), +('13', '60', '22', '21509', '0', '1'), +('13', '60', '1', '10912', '12224', '1'), +('13', '60', '1', '62234', '8422', '1'), +('13', '60', '1', '5746', '3857', '1'), +('13', '60', '1', '14702', '3750', '1'), +('13', '60', '2', '10913', '18377', '1'), +('13', '60', '2', '1414', '5666', '1'), +('13', '60', '2', '10143', '5361', '1'), +('13', '60', '2', '1239', '5268', '1'), +('13', '60', '3', '5780', '7309', '1'), +('13', '60', '3', '11052', '6417', '1'), +('13', '60', '3', '46184', '5253', '1'), +('13', '60', '3', '1625', '4481', '1'), +('13', '60', '5', '14557', '7146', '1'), +('13', '60', '5', '14703', '6050', '1'), +('13', '60', '5', '11646', '4861', '1'), +('13', '60', '5', '8285', '4483', '1'), +('13', '60', '8', '1628', '16817', '1'), +('13', '60', '8', '11603', '12136', '1'), +('13', '60', '8', '1622', '10037', '1'), +('13', '60', '8', '5779', '9186', '1'), +('13', '60', '6', '29468', '14508', '1'), +('13', '60', '6', '1542', '7192', '1'), +('13', '60', '6', '2708', '5564', '1'), +('13', '60', '6', '1557', '5286', '1'), +('13', '60', '17', '10845', '21720', '1'), +('13', '60', '17', '11641', '11965', '1'), +('13', '60', '17', '1644', '10478', '1'), +('13', '60', '17', '24610', '10275', '1'), +('13', '60', '7', '27885', '5289', '1'), +('13', '60', '7', '1241', '3489', '1'), +('13', '60', '7', '1218', '3429', '1'), +('13', '60', '7', '1648', '2953', '1'), +('13', '60', '9', '1618', '4950', '1'), +('13', '60', '9', '1274', '4872', '1'), +('13', '60', '9', '12805', '4254', '1'), +('13', '60', '9', '4780', '3017', '1'), +('13', '60', '15', '5727', '6766', '1'), +('13', '60', '15', '5728', '5585', '1'), +('13', '60', '15', '14738', '5482', '1'), +('13', '60', '15', '5807', '5271', '1'), +('13', '60', '20', '1556', '15307', '1'), +('13', '60', '20', '11666', '8332', '1'), +('13', '60', '20', '5765', '8016', '1'), +('13', '60', '20', '2742', '5125', '1'), +('13', '60', '12', '4582', '9422', '1'), +('13', '60', '12', '1243', '4513', '1'), +('13', '60', '12', '20655', '3433', '1'), +('13', '60', '12', '2336', '3146', '1'), +('13', '60', '18', '5819', '4510', '1'), +('13', '60', '18', '24765', '3127', '1'), +('13', '60', '18', '1651', '2204', '1'), +('13', '60', '18', '4410', '1125', '1'), +('13', '60', '19', '5749', '4659', '1'), +('13', '60', '19', '4407', '3898', '1'), +('13', '60', '19', '68239', '3181', '1'), +('13', '60', '19', '1368', '2010', '1'), +('13', '60', '13', '28034', '20157', '1'), +('13', '60', '13', '24629', '13134', '1'), +('13', '60', '13', '24609', '11679', '1'), +('13', '60', '13', '24628', '8684', '1'), +('13', '60', '14', '24629', '13134', '1'), +('13', '60', '14', '24609', '11679', '1'), +('13', '60', '14', '14745', '8222', '1'), +('13', '60', '14', '14759', '7719', '1'), +('13', '60', '11', '46178', '7361', '1'), +('13', '60', '11', '5763', '7257', '1'), +('13', '60', '11', '5805', '5300', '1'), +('13', '60', '11', '5759', '5159', '1'), +('13', '61', '22', '66397', '0', '3'), +('13', '61', '22', '61948', '0', '3'), +('13', '61', '22', '21805', '0', '3'), +('13', '61', '22', '21807', '0', '3'), +('13', '61', '1', '28944', '38883', '3'), +('13', '61', '1', '51230', '32444', '3'), +('13', '61', '1', '28922', '23505', '3'), +('13', '61', '1', '63170', '22103', '3'), +('13', '61', '2', '51235', '24201', '3'), +('13', '61', '2', '26763', '13589', '3'), +('13', '61', '2', '26762', '13234', '3'), +('13', '61', '2', '26605', '12650', '3'), +('13', '61', '3', '5772', '37460', '3'), +('13', '61', '3', '29452', '24245', '3'), +('13', '61', '3', '29319', '19952', '3'), +('13', '61', '3', '31328', '15002', '3'), +('13', '61', '5', '28901', '26746', '3'), +('13', '61', '5', '51229', '24152', '3'), +('13', '61', '5', '27244', '23276', '3'), +('13', '61', '5', '28911', '23098', '3'), +('13', '61', '8', '11603', '27361', '3'), +('13', '61', '8', '28964', '16238', '3'), +('13', '61', '8', '28992', '16055', '3'), +('13', '61', '8', '28918', '14751', '3'), +('13', '61', '6', '28920', '14496', '3'), +('13', '61', '6', '28902', '12905', '3'), +('13', '61', '6', '4315', '12152', '3'), +('13', '61', '6', '28919', '10507', '3'), +('13', '61', '17', '28910', '31429', '3'), +('13', '61', '17', '32933', '21509', '3'), +('13', '61', '17', '26776', '17416', '3'), +('13', '61', '17', '26604', '16216', '3'), +('13', '61', '7', '28924', '15289', '3'), +('13', '61', '7', '7868', '14102', '3'), +('13', '61', '7', '8288', '12504', '3'), +('13', '61', '7', '26555', '11907', '3'), +('13', '61', '9', '26781', '22439', '3'), +('13', '61', '9', '23508', '21201', '3'), +('13', '61', '9', '30552', '19073', '3'), +('13', '61', '9', '28891', '17702', '3'), +('13', '61', '15', '28944', '38883', '3'), +('13', '61', '15', '28905', '35913', '3'), +('13', '61', '15', '63170', '22103', '3'), +('13', '61', '15', '28993', '15376', '3'), +('13', '61', '20', '28916', '16300', '3'), +('13', '61', '20', '30534', '13701', '3'), +('13', '61', '20', '26549', '13052', '3'), +('13', '61', '20', '28938', '12487', '3'), +('13', '61', '12', '28144', '49610', '3'), +('13', '61', '12', '30534', '13701', '3'), +('13', '61', '12', '28967', '12003', '3'), +('13', '61', '12', '28972', '10235', '3'), +('13', '61', '18', '26777', '42374', '3'), +('13', '61', '18', '28932', '12329', '3'), +('13', '61', '18', '8289', '12325', '3'), +('13', '61', '18', '27316', '10614', '3'), +('13', '61', '19', '28881', '40685', '3'), +('13', '61', '19', '28934', '35903', '3'), +('13', '61', '19', '30570', '15601', '3'), +('13', '61', '19', '28148', '14335', '3'), +('13', '61', '13', '28981', '39452', '3'), +('13', '61', '13', '26778', '30776', '3'), +('13', '61', '13', '28917', '14804', '3'), +('13', '61', '13', '28978', '13540', '3'), +('13', '61', '14', '28981', '39452', '3'), +('13', '61', '14', '26778', '30776', '3'), +('13', '61', '14', '28915', '23698', '3'), +('13', '61', '14', '26780', '16404', '3'), +('13', '61', '11', '26778', '30776', '3'), +('13', '61', '11', '51223', '21587', '3'), +('13', '61', '11', '2698', '17627', '3'), +('13', '61', '11', '30562', '13586', '3'), +('13', '62', '22', '66397', '0', '3'), +('13', '62', '22', '61948', '0', '3'), +('13', '62', '22', '21805', '0', '3'), +('13', '62', '22', '21807', '0', '3'), +('13', '62', '1', '28944', '37845', '3'), +('13', '62', '1', '51230', '31525', '3'), +('13', '62', '1', '28922', '23005', '3'), +('13', '62', '1', '63170', '21604', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '62', '2', '51235', '23704', '3'), +('13', '62', '2', '26763', '13592', '3'), +('13', '62', '2', '26762', '13236', '3'), +('13', '62', '2', '26605', '12653', '3'), +('13', '62', '3', '5772', '36565', '3'), +('13', '62', '3', '29452', '23247', '3'), +('13', '62', '3', '29319', '18952', '3'), +('13', '62', '3', '31328', '14502', '3'), +('13', '62', '5', '28901', '26250', '3'), +('13', '62', '5', '51229', '23654', '3'), +('13', '62', '5', '28911', '22600', '3'), +('13', '62', '5', '27244', '22277', '3'), +('13', '62', '8', '11603', '26363', '3'), +('13', '62', '8', '28964', '16241', '3'), +('13', '62', '8', '28992', '16055', '3'), +('13', '62', '8', '28918', '14751', '3'), +('13', '62', '6', '28920', '14500', '3'), +('13', '62', '6', '28902', '12905', '3'), +('13', '62', '6', '4315', '11652', '3'), +('13', '62', '6', '28919', '10507', '3'), +('13', '62', '17', '28910', '30681', '3'), +('13', '62', '17', '32933', '21010', '3'), +('13', '62', '17', '26776', '17421', '3'), +('13', '62', '17', '26604', '16221', '3'), +('13', '62', '7', '28924', '15292', '3'), +('13', '62', '7', '7868', '14104', '3'), +('13', '62', '7', '8288', '12504', '3'), +('13', '62', '7', '26555', '11907', '3'), +('13', '62', '9', '26781', '22067', '3'), +('13', '62', '9', '23508', '20201', '3'), +('13', '62', '9', '30552', '18775', '3'), +('13', '62', '9', '28891', '17402', '3'), +('13', '62', '15', '28944', '37845', '3'), +('13', '62', '15', '28905', '34873', '3'), +('13', '62', '15', '63170', '21604', '3'), +('13', '62', '15', '28993', '15378', '3'), +('13', '62', '20', '28916', '16301', '3'), +('13', '62', '20', '30534', '13703', '3'), +('13', '62', '20', '26549', '13056', '3'), +('13', '62', '20', '28938', '12488', '3'), +('13', '62', '12', '28144', '48615', '3'), +('13', '62', '12', '30534', '13703', '3'), +('13', '62', '12', '28967', '12003', '3'), +('13', '62', '12', '28972', '10238', '3'), +('13', '62', '18', '26777', '41226', '3'), +('13', '62', '18', '28932', '12331', '3'), +('13', '62', '18', '8289', '12327', '3'), +('13', '62', '18', '27316', '10615', '3'), +('13', '62', '19', '28881', '39388', '3'), +('13', '62', '19', '28934', '34903', '3'), +('13', '62', '19', '30570', '15603', '3'), +('13', '62', '19', '28148', '14338', '3'), +('13', '62', '13', '28981', '38454', '3'), +('13', '62', '13', '26778', '30182', '3'), +('13', '62', '13', '28917', '14804', '3'), +('13', '62', '13', '28978', '13541', '3'), +('13', '62', '14', '28981', '38454', '3'), +('13', '62', '14', '26778', '30182', '3'), +('13', '62', '14', '28915', '23326', '3'), +('13', '62', '14', '26780', '16407', '3'), +('13', '62', '11', '26778', '30182', '3'), +('13', '62', '11', '51223', '21215', '3'), +('13', '62', '11', '2698', '17252', '3'), +('13', '62', '11', '30562', '13588', '3'), +('13', '63', '22', '66397', '0', '3'), +('13', '63', '22', '61948', '0', '3'), +('13', '63', '22', '21805', '0', '3'), +('13', '63', '22', '21807', '0', '3'), +('13', '63', '1', '28944', '36807', '3'), +('13', '63', '1', '51230', '30606', '3'), +('13', '63', '1', '28922', '22505', '3'), +('13', '63', '1', '63170', '21106', '3'), +('13', '63', '2', '51235', '23206', '3'), +('13', '63', '2', '26763', '13595', '3'), +('13', '63', '2', '26762', '13238', '3'), +('13', '63', '2', '26605', '12655', '3'), +('13', '63', '3', '5772', '35671', '3'), +('13', '63', '3', '29452', '22250', '3'), +('13', '63', '3', '29319', '17952', '3'), +('13', '63', '3', '31328', '14002', '3'), +('13', '63', '5', '28901', '25754', '3'), +('13', '63', '5', '51229', '23155', '3'), +('13', '63', '5', '28911', '22102', '3'), +('13', '63', '5', '27244', '21278', '3'), +('13', '63', '8', '11603', '25364', '3'), +('13', '63', '8', '28964', '16244', '3'), +('13', '63', '8', '28992', '16055', '3'), +('13', '63', '8', '28918', '14751', '3'), +('13', '63', '6', '28920', '14504', '3'), +('13', '63', '6', '28902', '12905', '3'), +('13', '63', '6', '4315', '11152', '3'), +('13', '63', '6', '28919', '10507', '3'), +('13', '63', '17', '28910', '29933', '3'), +('13', '63', '17', '32933', '20512', '3'), +('13', '63', '17', '26776', '17426', '3'), +('13', '63', '17', '26604', '16226', '3'), +('13', '63', '7', '28924', '15295', '3'), +('13', '63', '7', '7868', '14105', '3'), +('13', '63', '7', '8288', '12504', '3'), +('13', '63', '7', '26555', '11907', '3'), +('13', '63', '9', '26781', '21695', '3'), +('13', '63', '9', '23508', '19201', '3'), +('13', '63', '9', '30552', '18477', '3'), +('13', '63', '9', '28891', '17102', '3'), +('13', '63', '15', '28944', '36807', '3'), +('13', '63', '15', '28905', '33833', '3'), +('13', '63', '15', '63170', '21106', '3'), +('13', '63', '15', '28993', '15380', '3'), +('13', '63', '20', '28916', '16303', '3'), +('13', '63', '20', '30534', '13705', '3'), +('13', '63', '20', '26549', '13061', '3'), +('13', '63', '20', '28938', '12490', '3'), +('13', '63', '12', '28144', '47621', '3'), +('13', '63', '12', '30534', '13705', '3'), +('13', '63', '12', '28967', '12003', '3'), +('13', '63', '12', '28972', '10241', '3'), +('13', '63', '18', '26777', '40078', '3'), +('13', '63', '18', '28932', '12333', '3'), +('13', '63', '18', '8289', '12329', '3'), +('13', '63', '18', '27316', '10616', '3'), +('13', '63', '19', '28881', '38091', '3'), +('13', '63', '19', '28934', '33903', '3'), +('13', '63', '19', '30570', '15604', '3'), +('13', '63', '19', '28148', '14341', '3'), +('13', '63', '13', '28981', '37456', '3'), +('13', '63', '13', '26778', '29589', '3'), +('13', '63', '13', '28917', '14804', '3'), +('13', '63', '13', '28978', '13543', '3'), +('13', '63', '14', '28981', '37456', '3'), +('13', '63', '14', '26778', '29589', '3'), +('13', '63', '14', '28915', '22954', '3'), +('13', '63', '14', '26780', '16410', '3'), +('13', '63', '11', '26778', '29589', '3'), +('13', '63', '11', '51223', '20843', '3'), +('13', '63', '11', '2698', '16877', '3'), +('13', '63', '11', '30562', '13590', '3'), +('13', '64', '22', '66397', '0', '3'), +('13', '64', '22', '61948', '0', '3'), +('13', '64', '22', '21805', '0', '3'), +('13', '64', '22', '21807', '0', '3'), +('13', '64', '1', '28944', '35769', '3'), +('13', '64', '1', '51230', '29687', '3'), +('13', '64', '1', '28922', '22005', '3'), +('13', '64', '1', '63170', '20608', '3'), +('13', '64', '2', '51235', '22709', '3'), +('13', '64', '2', '26763', '13598', '3'), +('13', '64', '2', '26762', '13240', '3'), +('13', '64', '2', '26605', '12657', '3'), +('13', '64', '3', '5772', '34776', '3'), +('13', '64', '3', '29452', '21252', '3'), +('13', '64', '3', '29319', '16952', '3'), +('13', '64', '3', '31328', '13502', '3'), +('13', '64', '5', '28901', '25258', '3'), +('13', '64', '5', '51229', '22657', '3'), +('13', '64', '5', '28911', '21604', '3'), +('13', '64', '5', '27244', '20279', '3'), +('13', '64', '8', '11603', '24366', '3'), +('13', '64', '8', '28964', '16247', '3'), +('13', '64', '8', '28992', '16055', '3'), +('13', '64', '8', '28918', '14751', '3'), +('13', '64', '6', '28920', '14508', '3'), +('13', '64', '6', '28902', '12905', '3'), +('13', '64', '6', '4315', '10652', '3'), +('13', '64', '6', '28919', '10507', '3'), +('13', '64', '17', '28910', '29185', '3'), +('13', '64', '17', '32933', '20013', '3'), +('13', '64', '17', '26776', '17431', '3'), +('13', '64', '17', '26604', '16231', '3'), +('13', '64', '7', '28924', '15299', '3'), +('13', '64', '7', '7868', '14107', '3'), +('13', '64', '7', '8288', '12504', '3'), +('13', '64', '7', '26555', '11907', '3'), +('13', '64', '9', '26781', '21323', '3'), +('13', '64', '9', '23508', '18201', '3'), +('13', '64', '9', '30552', '18179', '3'), +('13', '64', '9', '28891', '16802', '3'), +('13', '64', '15', '28944', '35769', '3'), +('13', '64', '15', '28905', '32793', '3'), +('13', '64', '15', '63170', '20608', '3'), +('13', '64', '15', '28993', '15382', '3'), +('13', '64', '20', '28916', '16304', '3'), +('13', '64', '20', '30534', '13708', '3'), +('13', '64', '20', '26549', '13065', '3'), +('13', '64', '20', '28938', '12491', '3'), +('13', '64', '12', '28144', '46626', '3'), +('13', '64', '12', '30534', '13708', '3'), +('13', '64', '12', '28967', '12003', '3'), +('13', '64', '12', '28972', '10244', '3'), +('13', '64', '18', '26777', '38930', '3'), +('13', '64', '18', '28932', '12335', '3'), +('13', '64', '18', '8289', '12331', '3'), +('13', '64', '18', '27316', '10617', '3'), +('13', '64', '19', '28881', '36794', '3'), +('13', '64', '19', '28934', '32903', '3'), +('13', '64', '19', '30570', '15606', '3'), +('13', '64', '19', '28148', '14344', '3'), +('13', '64', '13', '28981', '36459', '3'), +('13', '64', '13', '26778', '28995', '3'), +('13', '64', '13', '28917', '14804', '3'), +('13', '64', '13', '28978', '13544', '3'), +('13', '64', '14', '28981', '36459', '3'), +('13', '64', '14', '26778', '28995', '3'), +('13', '64', '14', '28915', '22582', '3'), +('13', '64', '14', '26780', '16413', '3'), +('13', '64', '11', '26778', '28995', '3'), +('13', '64', '11', '51223', '20471', '3'), +('13', '64', '11', '2698', '16502', '3'), +('13', '64', '11', '30562', '13592', '3'), +('13', '65', '22', '66397', '0', '7'), +('13', '65', '22', '62787', '0', '7'), +('13', '65', '22', '61948', '0', '7'), +('13', '65', '22', '21805', '0', '7'), +('13', '65', '1', '69106', '101747', '7'), +('13', '65', '1', '69062', '72693', '7'), +('13', '65', '1', '68949', '51135', '7'), +('13', '65', '1', '7130', '37983', '7'), +('13', '65', '2', '68195', '52581', '7'), +('13', '65', '2', '68057', '35200', '7'), +('13', '65', '2', '68058', '35200', '7'), +('13', '65', '2', '68807', '35200', '7'), +('13', '65', '3', '69074', '71303', '7'), +('13', '65', '3', '68818', '48886', '7'), +('13', '65', '3', '9444', '43166', '7'), +('13', '65', '3', '9436', '41700', '7'), +('13', '65', '5', '69135', '72323', '7'), +('13', '65', '5', '68808', '60382', '7'), +('13', '65', '5', '67625', '49609', '7'), +('13', '65', '5', '7769', '47163', '7'), +('13', '65', '8', '69164', '53284', '7'), +('13', '65', '8', '21998', '52663', '7'), +('13', '65', '8', '21996', '44842', '7'), +('13', '65', '8', '15815', '44352', '7'), +('13', '65', '6', '68788', '61459', '7'), +('13', '65', '6', '68841', '49967', '7'), +('13', '65', '6', '68789', '38652', '7'), +('13', '65', '6', '68060', '35200', '7'), +('13', '65', '17', '68986', '71985', '7'), +('13', '65', '17', '69153', '57903', '7'), +('13', '65', '17', '47655', '56552', '7'), +('13', '65', '17', '68782', '49684', '7'), +('13', '65', '7', '69082', '42303', '7'), +('13', '65', '7', '68916', '39581', '7'), +('13', '65', '7', '68060', '35200', '7'), +('13', '65', '7', '68057', '35200', '7'), +('13', '65', '9', '69100', '44482', '7'), +('13', '65', '9', '68606', '42636', '7'), +('13', '65', '9', '68060', '35200', '7'), +('13', '65', '9', '68807', '35200', '7'), +('13', '65', '15', '68957', '70168', '7'), +('13', '65', '15', '68846', '69519', '7'), +('13', '65', '15', '68672', '59600', '7'), +('13', '65', '15', '14818', '54933', '7'), +('13', '65', '20', '69134', '72535', '7'), +('13', '65', '20', '67625', '49609', '7'), +('13', '65', '20', '68726', '47409', '7'), +('13', '65', '20', '69445', '42351', '7'), +('13', '65', '12', '69255', '74342', '7'), +('13', '65', '12', '28144', '45631', '7'), +('13', '65', '12', '26996', '44633', '7'), +('13', '65', '12', '13619', '42090', '7'), +('13', '65', '18', '68751', '59579', '7'), +('13', '65', '18', '69149', '41336', '7'), +('13', '65', '18', '28649', '40385', '7'), +('13', '65', '18', '26777', '37782', '7'), +('13', '65', '19', '69078', '70119', '7'), +('13', '65', '19', '68918', '50318', '7'), +('13', '65', '19', '28881', '35497', '7'), +('13', '65', '19', '68058', '35200', '7'), +('13', '65', '13', '69046', '69131', '7'), +('13', '65', '13', '68744', '59046', '7'), +('13', '65', '13', '24793', '51274', '7'), +('13', '65', '13', '69159', '46001', '7'), +('13', '65', '14', '69046', '69131', '7'), +('13', '65', '14', '68745', '59274', '7'), +('13', '65', '14', '68744', '59046', '7'), +('13', '65', '14', '27274', '54159', '7'), +('13', '65', '11', '69162', '73652', '7'), +('13', '65', '11', '20508', '60559', '7'), +('13', '65', '11', '20496', '58869', '7'), +('13', '65', '11', '26788', '45519', '7'), +('13', '65', '22', '66397', '0', '6'), +('13', '65', '22', '62787', '0', '6'), +('13', '65', '22', '61948', '0', '6'), +('13', '65', '22', '21805', '0', '6'), +('13', '65', '1', '7130', '37983', '6'), +('13', '65', '1', '16257', '35535', '6'), +('13', '65', '1', '68807', '35200', '6'), +('13', '65', '1', '68060', '35200', '6'), +('13', '65', '2', '68195', '52581', '6'), +('13', '65', '2', '68058', '35200', '6'), +('13', '65', '2', '68057', '35200', '6'), +('13', '65', '2', '68807', '35200', '6'), +('13', '65', '3', '9444', '43166', '6'), +('13', '65', '3', '9436', '41700', '6'), +('13', '65', '3', '68807', '35200', '6'), +('13', '65', '3', '68057', '35200', '6'), +('13', '65', '5', '7769', '47163', '6'), +('13', '65', '5', '8774', '45016', '6'), +('13', '65', '5', '29198', '41235', '6'), +('13', '65', '5', '68057', '35200', '6'), +('13', '65', '8', '21998', '52663', '6'), +('13', '65', '8', '21996', '44842', '6'), +('13', '65', '8', '15815', '44352', '6'), +('13', '65', '8', '12082', '44169', '6'), +('13', '65', '6', '68807', '35200', '6'), +('13', '65', '6', '68057', '35200', '6'), +('13', '65', '6', '68060', '35200', '6'), +('13', '65', '6', '68058', '35200', '6'), +('13', '65', '17', '47655', '56552', '6'), +('13', '65', '17', '68058', '35200', '6'), +('13', '65', '17', '68057', '35200', '6'), +('13', '65', '17', '68807', '35200', '6'), +('13', '65', '7', '68807', '35200', '6'), +('13', '65', '7', '68057', '35200', '6'), +('13', '65', '7', '68060', '35200', '6'), +('13', '65', '7', '68058', '35200', '6'), +('13', '65', '9', '68057', '35200', '6'), +('13', '65', '9', '68058', '35200', '6'), +('13', '65', '9', '68060', '35200', '6'), +('13', '65', '9', '68807', '35200', '6'), +('13', '65', '15', '14818', '54933', '6'), +('13', '65', '15', '68060', '35200', '6'), +('13', '65', '15', '68807', '35200', '6'), +('13', '65', '15', '68057', '35200', '6'), +('13', '65', '20', '68057', '35200', '6'), +('13', '65', '20', '68058', '35200', '6'), +('13', '65', '20', '68060', '35200', '6'), +('13', '65', '20', '68807', '35200', '6'), +('13', '65', '12', '28144', '45631', '6'), +('13', '65', '12', '26996', '44633', '6'), +('13', '65', '12', '13619', '42090', '6'), +('13', '65', '12', '68807', '35200', '6'), +('13', '65', '18', '28649', '40385', '6'), +('13', '65', '18', '26777', '37782', '6'), +('13', '65', '18', '68057', '35200', '6'), +('13', '65', '18', '68058', '35200', '6'), +('13', '65', '19', '28881', '35497', '6'), +('13', '65', '19', '68058', '35200', '6'), +('13', '65', '19', '68057', '35200', '6'), +('13', '65', '19', '68807', '35200', '6'), +('13', '65', '13', '24793', '51274', '6'), +('13', '65', '13', '26788', '45519', '6'), +('13', '65', '13', '21875', '44372', '6'), +('13', '65', '13', '28981', '35461', '6'), +('13', '65', '14', '27274', '54159', '6'), +('13', '65', '14', '26788', '45519', '6'), +('13', '65', '14', '25998', '44747', '6'), +('13', '65', '14', '27272', '44566', '6'), +('13', '65', '11', '20508', '60559', '6'), +('13', '65', '11', '20496', '58869', '6'), +('13', '65', '11', '26788', '45519', '6'), +('13', '65', '11', '20486', '42550', '6'), +('13', '65', '22', '66397', '0', '5'), +('13', '65', '22', '62787', '0', '5'), +('13', '65', '22', '61948', '0', '5'), +('13', '65', '22', '21805', '0', '5'), +('13', '65', '1', '7130', '37983', '5'), +('13', '65', '1', '16257', '35535', '5'), +('13', '65', '1', '28944', '34731', '5'), +('13', '65', '1', '16679', '30244', '5'), +('13', '65', '2', '68195', '52581', '5'), +('13', '65', '2', '16158', '27467', '5'), +('13', '65', '2', '51235', '22211', '5'), +('13', '65', '2', '28653', '18102', '5'), +('13', '65', '3', '9444', '43166', '5'), +('13', '65', '3', '9436', '41700', '5'), +('13', '65', '3', '5772', '33881', '5'), +('13', '65', '3', '9435', '22838', '5'), +('13', '65', '5', '7769', '47163', '5'), +('13', '65', '5', '8774', '45016', '5'), +('13', '65', '5', '29198', '41235', '5'), +('13', '65', '5', '8772', '31689', '5'), +('13', '65', '8', '21998', '52663', '5'), +('13', '65', '8', '21996', '44842', '5'), +('13', '65', '8', '15815', '44352', '5'), +('13', '65', '8', '12082', '44169', '5'), +('13', '65', '6', '28661', '25683', '5'), +('13', '65', '6', '13654', '23196', '5'), +('13', '65', '6', '13638', '19857', '5'), +('13', '65', '6', '13634', '18791', '5'), +('13', '65', '17', '47655', '56552', '5'), +('13', '65', '17', '14747', '35136', '5'), +('13', '65', '17', '28910', '28437', '5'), +('13', '65', '17', '32933', '19515', '5'), +('13', '65', '7', '11598', '33915', '5'), +('13', '65', '7', '11323', '23316', '5'), +('13', '65', '7', '21994', '19491', '5'), +('13', '65', '7', '11324', '17303', '5'), +('13', '65', '9', '28665', '34437', '5'), +('13', '65', '9', '68198', '34239', '5'), +('13', '65', '9', '11019', '28808', '5'), +('13', '65', '9', '28668', '26001', '5'), +('13', '65', '15', '14818', '54933', '5'), +('13', '65', '15', '28944', '34731', '5'), +('13', '65', '15', '28905', '31753', '5'), +('13', '65', '15', '10232', '31630', '5'), +('13', '65', '20', '15881', '34733', '5'), +('13', '65', '20', '16158', '27467', '5'), +('13', '65', '20', '15927', '22753', '5'), +('13', '65', '20', '15877', '22374', '5'), +('13', '65', '12', '28144', '45631', '5'), +('13', '65', '12', '26996', '44633', '5'), +('13', '65', '12', '13619', '42090', '5'), +('13', '65', '12', '13618', '25880', '5'), +('13', '65', '18', '28649', '40385', '5'), +('13', '65', '18', '26777', '37782', '5'), +('13', '65', '18', '19021', '19006', '5'), +('13', '65', '18', '28932', '12337', '5'), +('13', '65', '19', '28881', '35497', '5'), +('13', '65', '19', '28934', '31903', '5'), +('13', '65', '19', '19079', '30099', '5'), +('13', '65', '19', '20428', '25965', '5'), +('13', '65', '13', '24793', '51274', '5'), +('13', '65', '13', '26788', '45519', '5'), +('13', '65', '13', '21875', '44372', '5'), +('13', '65', '13', '28981', '35461', '5'), +('13', '65', '14', '27274', '54159', '5'), +('13', '65', '14', '26788', '45519', '5'), +('13', '65', '14', '25998', '44747', '5'), +('13', '65', '14', '27272', '44566', '5'), +('13', '65', '11', '20508', '60559', '5'), +('13', '65', '11', '20496', '58869', '5'), +('13', '65', '11', '26788', '45519', '5'), +('13', '65', '11', '20486', '42550', '5'), +('13', '65', '22', '66397', '0', '4'), +('13', '65', '22', '62787', '0', '4'), +('13', '65', '22', '61948', '0', '4'), +('13', '65', '22', '21805', '0', '4'), +('13', '65', '1', '7130', '37983', '4'), +('13', '65', '1', '16257', '35535', '4'), +('13', '65', '1', '28944', '34731', '4'), +('13', '65', '1', '16679', '30244', '4'), +('13', '65', '2', '68195', '52581', '4'), +('13', '65', '2', '16158', '27467', '4'), +('13', '65', '2', '51235', '22211', '4'), +('13', '65', '2', '28653', '18102', '4'), +('13', '65', '3', '9444', '43166', '4'), +('13', '65', '3', '9436', '41700', '4'), +('13', '65', '3', '5772', '33881', '4'), +('13', '65', '3', '9435', '22838', '4'), +('13', '65', '5', '7769', '47163', '4'), +('13', '65', '5', '8774', '45016', '4'), +('13', '65', '5', '29198', '41235', '4'), +('13', '65', '5', '8772', '31689', '4'), +('13', '65', '8', '21998', '52663', '4'), +('13', '65', '8', '21996', '44842', '4'), +('13', '65', '8', '15815', '44352', '4'), +('13', '65', '8', '12082', '44169', '4'), +('13', '65', '6', '28661', '25683', '4'), +('13', '65', '6', '13654', '23196', '4'), +('13', '65', '6', '13638', '19857', '4'), +('13', '65', '6', '13634', '18791', '4'), +('13', '65', '17', '47655', '56552', '4'), +('13', '65', '17', '14747', '35136', '4'), +('13', '65', '17', '28910', '28437', '4'), +('13', '65', '17', '32933', '19515', '4'), +('13', '65', '7', '11598', '33915', '4'), +('13', '65', '7', '11323', '23316', '4'), +('13', '65', '7', '21994', '19491', '4'), +('13', '65', '7', '11324', '17303', '4'), +('13', '65', '9', '28665', '34437', '4'), +('13', '65', '9', '68198', '34239', '4'), +('13', '65', '9', '11019', '28808', '4'), +('13', '65', '9', '28668', '26001', '4'), +('13', '65', '15', '14818', '54933', '4'), +('13', '65', '15', '28944', '34731', '4'), +('13', '65', '15', '28905', '31753', '4'), +('13', '65', '15', '10232', '31630', '4'), +('13', '65', '20', '15881', '34733', '4'), +('13', '65', '20', '16158', '27467', '4'), +('13', '65', '20', '15927', '22753', '4'), +('13', '65', '20', '15877', '22374', '4'), +('13', '65', '12', '28144', '45631', '4'), +('13', '65', '12', '26996', '44633', '4'), +('13', '65', '12', '13619', '42090', '4'), +('13', '65', '12', '13618', '25880', '4'), +('13', '65', '18', '28649', '40385', '4'), +('13', '65', '18', '26777', '37782', '4'), +('13', '65', '18', '19021', '19006', '4'), +('13', '65', '18', '28932', '12337', '4'), +('13', '65', '19', '28881', '35497', '4'), +('13', '65', '19', '28934', '31903', '4'), +('13', '65', '19', '19079', '30099', '4'), +('13', '65', '19', '20428', '25965', '4'), +('13', '65', '13', '24793', '51274', '4'), +('13', '65', '13', '26788', '45519', '4'), +('13', '65', '13', '21875', '44372', '4'), +('13', '65', '13', '28981', '35461', '4'), +('13', '65', '14', '27274', '54159', '4'), +('13', '65', '14', '26788', '45519', '4'), +('13', '65', '14', '25998', '44747', '4'), +('13', '65', '14', '27272', '44566', '4'), +('13', '65', '11', '20508', '60559', '4'), +('13', '65', '11', '20496', '58869', '4'), +('13', '65', '11', '26788', '45519', '4'), +('13', '65', '11', '20486', '42550', '4'), +('13', '66', '22', '66397', '0', '7'), +('13', '66', '22', '62787', '0', '7'), +('13', '66', '22', '61948', '0', '7'), +('13', '66', '22', '21805', '0', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '66', '1', '69106', '100003', '7'), +('13', '66', '1', '69062', '70899', '7'), +('13', '66', '1', '68949', '50140', '7'), +('13', '66', '1', '7130', '37488', '7'), +('13', '66', '2', '68195', '51186', '7'), +('13', '66', '2', '68057', '33600', '7'), +('13', '66', '2', '68058', '33600', '7'), +('13', '66', '2', '68060', '33600', '7'), +('13', '66', '3', '69074', '69506', '7'), +('13', '66', '3', '68818', '47488', '7'), +('13', '66', '3', '9444', '41970', '7'), +('13', '66', '3', '9436', '40453', '7'), +('13', '66', '5', '69135', '70727', '7'), +('13', '66', '5', '68808', '58788', '7'), +('13', '66', '5', '67625', '49039', '7'), +('13', '66', '5', '7769', '46167', '7'), +('13', '66', '8', '69164', '52539', '7'), +('13', '66', '8', '21998', '51267', '7'), +('13', '66', '8', '21996', '43646', '7'), +('13', '66', '8', '15815', '43355', '7'), +('13', '66', '6', '68788', '59859', '7'), +('13', '66', '6', '68841', '48972', '7'), +('13', '66', '6', '68789', '38080', '7'), +('13', '66', '6', '69163', '33889', '7'), +('13', '66', '17', '68986', '70190', '7'), +('13', '66', '17', '69153', '57009', '7'), +('13', '66', '17', '47655', '55158', '7'), +('13', '66', '17', '68782', '48689', '7'), +('13', '66', '7', '69082', '41731', '7'), +('13', '66', '7', '68916', '39011', '7'), +('13', '66', '7', '68807', '33600', '7'), +('13', '66', '7', '68057', '33600', '7'), +('13', '66', '9', '69100', '43912', '7'), +('13', '66', '9', '68606', '41438', '7'), +('13', '66', '9', '28665', '33940', '7'), +('13', '66', '9', '68198', '33669', '7'), +('13', '66', '15', '68957', '68372', '7'), +('13', '66', '15', '68846', '67723', '7'), +('13', '66', '15', '68672', '58353', '7'), +('13', '66', '15', '14818', '53538', '7'), +('13', '66', '20', '69134', '70940', '7'), +('13', '66', '20', '67625', '49039', '7'), +('13', '66', '20', '68726', '46011', '7'), +('13', '66', '20', '69445', '41155', '7'), +('13', '66', '12', '69255', '72745', '7'), +('13', '66', '12', '28144', '44636', '7'), +('13', '66', '12', '26996', '43638', '7'), +('13', '66', '12', '13619', '40844', '7'), +('13', '66', '18', '68751', '58084', '7'), +('13', '66', '18', '69149', '41091', '7'), +('13', '66', '18', '28649', '39815', '7'), +('13', '66', '18', '26777', '36634', '7'), +('13', '66', '19', '69078', '68323', '7'), +('13', '66', '19', '68918', '48822', '7'), +('13', '66', '19', '28881', '34200', '7'), +('13', '66', '19', '69251', '34088', '7'), +('13', '66', '13', '69046', '67336', '7'), +('13', '66', '13', '68744', '57449', '7'), +('13', '66', '13', '24793', '49778', '7'), +('13', '66', '13', '69159', '45432', '7'), +('13', '66', '14', '69046', '67336', '7'), +('13', '66', '14', '68745', '57677', '7'), +('13', '66', '14', '68744', '57449', '7'), +('13', '66', '14', '27274', '52764', '7'), +('13', '66', '11', '69162', '72058', '7'), +('13', '66', '11', '20508', '59309', '7'), +('13', '66', '11', '20496', '57374', '7'), +('13', '66', '11', '26788', '44323', '7'), +('13', '67', '22', '66397', '0', '7'), +('13', '67', '22', '62787', '0', '7'), +('13', '67', '22', '61948', '0', '7'), +('13', '67', '22', '21805', '0', '7'), +('13', '67', '1', '69106', '98259', '7'), +('13', '67', '1', '69062', '69105', '7'), +('13', '67', '1', '68949', '49145', '7'), +('13', '67', '1', '7130', '36993', '7'), +('13', '67', '2', '68195', '49791', '7'), +('13', '67', '2', '68807', '32000', '7'), +('13', '67', '2', '68057', '32000', '7'), +('13', '67', '2', '68058', '32000', '7'), +('13', '67', '3', '69074', '67710', '7'), +('13', '67', '3', '68818', '46090', '7'), +('13', '67', '3', '9444', '40774', '7'), +('13', '67', '3', '9436', '39207', '7'), +('13', '67', '5', '69135', '69131', '7'), +('13', '67', '5', '68808', '57193', '7'), +('13', '67', '5', '67625', '48469', '7'), +('13', '67', '5', '7769', '45171', '7'), +('13', '67', '8', '69164', '51794', '7'), +('13', '67', '8', '21998', '49871', '7'), +('13', '67', '8', '21996', '42450', '7'), +('13', '67', '8', '15815', '42359', '7'), +('13', '67', '6', '68788', '58259', '7'), +('13', '67', '6', '68841', '47976', '7'), +('13', '67', '6', '68789', '37508', '7'), +('13', '67', '6', '69163', '33894', '7'), +('13', '67', '17', '68986', '68395', '7'), +('13', '67', '17', '69153', '56115', '7'), +('13', '67', '17', '47655', '53764', '7'), +('13', '67', '17', '68782', '47694', '7'), +('13', '67', '7', '69082', '41159', '7'), +('13', '67', '7', '68916', '38441', '7'), +('13', '67', '7', '69176', '32576', '7'), +('13', '67', '7', '11598', '32423', '7'), +('13', '67', '9', '69100', '43342', '7'), +('13', '67', '9', '68606', '40240', '7'), +('13', '67', '9', '28665', '33444', '7'), +('13', '67', '9', '69129', '33311', '7'), +('13', '67', '15', '68957', '66577', '7'), +('13', '67', '15', '68846', '65927', '7'), +('13', '67', '15', '68672', '57106', '7'), +('13', '67', '15', '14818', '52143', '7'), +('13', '67', '20', '69134', '69345', '7'), +('13', '67', '20', '67625', '48469', '7'), +('13', '67', '20', '68726', '44612', '7'), +('13', '67', '20', '69445', '39958', '7'), +('13', '67', '12', '69255', '71149', '7'), +('13', '67', '12', '28144', '43641', '7'), +('13', '67', '12', '26996', '42643', '7'), +('13', '67', '12', '13619', '39597', '7'), +('13', '67', '18', '68751', '56589', '7'), +('13', '67', '18', '69149', '40847', '7'), +('13', '67', '18', '28649', '39245', '7'), +('13', '67', '18', '26777', '35486', '7'), +('13', '67', '19', '69078', '66527', '7'), +('13', '67', '19', '68918', '47326', '7'), +('13', '67', '19', '69251', '34093', '7'), +('13', '67', '19', '28881', '32903', '7'), +('13', '67', '13', '69046', '65542', '7'), +('13', '67', '13', '68744', '55852', '7'), +('13', '67', '13', '24793', '48282', '7'), +('13', '67', '13', '69159', '44863', '7'), +('13', '67', '14', '69046', '65542', '7'), +('13', '67', '14', '68745', '56080', '7'), +('13', '67', '14', '68744', '55852', '7'), +('13', '67', '14', '27274', '51368', '7'), +('13', '67', '11', '69162', '70464', '7'), +('13', '67', '11', '20508', '58059', '7'), +('13', '67', '11', '20496', '55878', '7'), +('13', '67', '11', '26788', '43127', '7'), +('13', '68', '22', '66397', '0', '7'), +('13', '68', '22', '62787', '0', '7'), +('13', '68', '22', '61948', '0', '7'), +('13', '68', '22', '21805', '0', '7'), +('13', '68', '1', '69106', '96515', '7'), +('13', '68', '1', '69062', '67311', '7'), +('13', '68', '1', '68949', '48150', '7'), +('13', '68', '1', '7130', '36498', '7'), +('13', '68', '2', '68195', '48396', '7'), +('13', '68', '2', '68807', '30400', '7'), +('13', '68', '2', '68057', '30400', '7'), +('13', '68', '2', '68058', '30400', '7'), +('13', '68', '3', '69074', '65913', '7'), +('13', '68', '3', '68818', '44692', '7'), +('13', '68', '3', '9444', '39578', '7'), +('13', '68', '3', '9436', '37960', '7'), +('13', '68', '5', '69135', '67535', '7'), +('13', '68', '5', '68808', '55598', '7'), +('13', '68', '5', '67625', '47899', '7'), +('13', '68', '5', '7769', '44175', '7'), +('13', '68', '8', '69164', '51049', '7'), +('13', '68', '8', '21998', '48475', '7'), +('13', '68', '8', '15815', '41362', '7'), +('13', '68', '8', '21996', '41253', '7'), +('13', '68', '6', '68788', '56659', '7'), +('13', '68', '6', '68841', '46980', '7'), +('13', '68', '6', '68789', '36936', '7'), +('13', '68', '6', '69163', '33899', '7'), +('13', '68', '17', '68986', '66600', '7'), +('13', '68', '17', '69153', '55221', '7'), +('13', '68', '17', '47655', '52370', '7'), +('13', '68', '17', '68782', '46699', '7'), +('13', '68', '7', '69082', '40587', '7'), +('13', '68', '7', '68916', '37871', '7'), +('13', '68', '7', '69176', '32580', '7'), +('13', '68', '7', '11598', '31677', '7'), +('13', '68', '9', '69100', '42772', '7'), +('13', '68', '9', '68606', '39042', '7'), +('13', '68', '9', '69129', '33314', '7'), +('13', '68', '9', '28665', '32947', '7'), +('13', '68', '15', '68957', '64781', '7'), +('13', '68', '15', '68846', '64131', '7'), +('13', '68', '15', '68672', '55859', '7'), +('13', '68', '15', '14818', '50748', '7'), +('13', '68', '20', '69134', '67750', '7'), +('13', '68', '20', '67625', '47899', '7'), +('13', '68', '20', '68726', '43214', '7'), +('13', '68', '20', '69445', '38761', '7'), +('13', '68', '12', '69255', '69553', '7'), +('13', '68', '12', '28144', '42646', '7'), +('13', '68', '12', '26996', '41648', '7'), +('13', '68', '12', '13619', '38351', '7'), +('13', '68', '18', '68751', '55094', '7'), +('13', '68', '18', '69149', '40602', '7'), +('13', '68', '18', '28649', '38675', '7'), +('13', '68', '18', '26777', '34338', '7'), +('13', '68', '19', '69078', '64732', '7'), +('13', '68', '19', '68918', '45830', '7'), +('13', '68', '19', '69251', '34098', '7'), +('13', '68', '19', '28881', '31606', '7'), +('13', '68', '13', '69046', '63747', '7'), +('13', '68', '13', '68744', '54255', '7'), +('13', '68', '13', '24793', '46786', '7'), +('13', '68', '13', '69159', '44294', '7'), +('13', '68', '14', '69046', '63747', '7'), +('13', '68', '14', '68745', '54483', '7'), +('13', '68', '14', '68744', '54255', '7'), +('13', '68', '14', '27274', '49973', '7'), +('13', '68', '11', '69162', '68870', '7'), +('13', '68', '11', '20508', '56809', '7'), +('13', '68', '11', '20496', '54382', '7'), +('13', '68', '11', '26788', '41931', '7'), +('13', '69', '22', '66397', '0', '7'), +('13', '69', '22', '62787', '0', '7'), +('13', '69', '22', '61948', '0', '7'), +('13', '69', '22', '21805', '0', '7'), +('13', '69', '1', '69106', '94771', '7'), +('13', '69', '1', '69062', '65517', '7'), +('13', '69', '1', '68949', '47155', '7'), +('13', '69', '1', '7130', '36003', '7'), +('13', '69', '2', '68195', '47001', '7'), +('13', '69', '2', '46141', '29587', '7'), +('13', '69', '2', '68057', '28800', '7'), +('13', '69', '2', '68058', '28800', '7'), +('13', '69', '3', '69074', '64116', '7'), +('13', '69', '3', '68818', '43294', '7'), +('13', '69', '3', '9444', '38382', '7'), +('13', '69', '3', '9436', '36713', '7'), +('13', '69', '5', '69135', '65939', '7'), +('13', '69', '5', '68808', '54003', '7'), +('13', '69', '5', '67625', '47329', '7'), +('13', '69', '5', '7769', '43179', '7'), +('13', '69', '8', '69164', '50304', '7'), +('13', '69', '8', '21998', '47079', '7'), +('13', '69', '8', '15815', '40365', '7'), +('13', '69', '8', '21996', '40057', '7'), +('13', '69', '6', '68788', '55059', '7'), +('13', '69', '6', '68841', '45984', '7'), +('13', '69', '6', '68789', '36364', '7'), +('13', '69', '6', '69163', '33904', '7'), +('13', '69', '17', '68986', '64805', '7'), +('13', '69', '17', '69153', '54327', '7'), +('13', '69', '17', '47655', '50977', '7'), +('13', '69', '17', '68782', '45704', '7'), +('13', '69', '7', '69082', '40015', '7'), +('13', '69', '7', '68916', '37301', '7'), +('13', '69', '7', '69176', '32584', '7'), +('13', '69', '7', '11598', '30931', '7'), +('13', '69', '9', '69100', '42202', '7'), +('13', '69', '9', '68606', '37844', '7'), +('13', '69', '9', '69129', '33317', '7'), +('13', '69', '9', '28665', '32451', '7'), +('13', '69', '15', '68957', '62985', '7'), +('13', '69', '15', '68846', '62335', '7'), +('13', '69', '15', '68672', '54612', '7'), +('13', '69', '15', '14818', '49353', '7'), +('13', '69', '20', '69134', '66155', '7'), +('13', '69', '20', '67625', '47329', '7'), +('13', '69', '20', '68726', '41816', '7'), +('13', '69', '20', '69445', '37564', '7'), +('13', '69', '12', '69255', '67956', '7'), +('13', '69', '12', '28144', '41651', '7'), +('13', '69', '12', '26996', '40653', '7'), +('13', '69', '12', '13619', '37105', '7'), +('13', '69', '18', '68751', '53599', '7'), +('13', '69', '18', '69149', '40357', '7'), +('13', '69', '18', '28649', '38105', '7'), +('13', '69', '18', '68987', '33587', '7'), +('13', '69', '19', '69078', '62936', '7'), +('13', '69', '19', '68918', '44334', '7'), +('13', '69', '19', '69251', '34103', '7'), +('13', '69', '19', '28881', '30309', '7'), +('13', '69', '13', '69046', '61952', '7'), +('13', '69', '13', '68744', '52658', '7'), +('13', '69', '13', '24793', '45290', '7'), +('13', '69', '13', '69159', '43725', '7'), +('13', '69', '14', '69046', '61952', '7'), +('13', '69', '14', '68745', '52886', '7'), +('13', '69', '14', '68744', '52658', '7'), +('13', '69', '14', '27274', '48577', '7'), +('13', '69', '11', '69162', '67276', '7'), +('13', '69', '11', '20508', '55559', '7'), +('13', '69', '11', '20496', '52886', '7'), +('13', '69', '11', '26788', '40735', '7'), +('13', '70', '22', '21805', '0', '11'), +('13', '70', '22', '61948', '0', '11'), +('13', '70', '22', '21807', '0', '11'), +('13', '70', '22', '12425', '0', '11'), +('13', '70', '1', '51705', '94962', '11'), +('13', '70', '1', '69106', '93028', '11'), +('13', '70', '1', '47285', '72326', '11'), +('13', '70', '1', '69062', '63723', '11'), +('13', '70', '2', '39358', '67859', '11'), +('13', '70', '2', '68195', '45606', '11'), +('13', '70', '2', '83563', '41920', '11'), +('13', '70', '2', '39285', '41436', '11'), +('13', '70', '3', '83634', '95080', '11'), +('13', '70', '3', '71655', '75895', '11'), +('13', '70', '3', '83531', '65208', '11'), +('13', '70', '3', '83658', '64973', '11'), +('13', '70', '5', '39328', '96174', '11'), +('13', '70', '5', '69135', '64343', '11'), +('13', '70', '5', '47276', '58823', '11'), +('13', '70', '5', '68808', '52408', '11'), +('13', '70', '8', '70704', '95024', '11'), +('13', '70', '8', '39299', '94713', '11'), +('13', '70', '8', '71665', '80589', '11'), +('13', '70', '8', '47247', '61258', '11'), +('13', '70', '6', '39275', '94733', '11'), +('13', '70', '6', '83635', '94263', '11'), +('13', '70', '6', '39209', '64941', '11'), +('13', '70', '6', '39263', '61828', '11'), +('13', '70', '17', '83606', '67853', '11'), +('13', '70', '17', '70714', '67002', '11'), +('13', '70', '17', '71641', '66031', '11'), +('13', '70', '17', '68986', '63010', '11'), +('13', '70', '7', '71089', '51191', '11'), +('13', '70', '7', '83567', '41070', '11'), +('13', '70', '7', '69082', '39443', '11'), +('13', '70', '7', '70938', '37645', '11'), +('13', '70', '9', '51709', '97270', '11'), +('13', '70', '9', '39336', '46948', '11'), +('13', '70', '9', '83655', '44309', '11'), +('13', '70', '9', '69100', '41632', '11'), +('13', '70', '15', '51702', '93481', '11'), +('13', '70', '15', '39230', '63347', '11'), +('13', '70', '15', '68957', '61189', '11'), +('13', '70', '15', '68846', '60539', '11'), +('13', '70', '20', '39253', '95510', '11'), +('13', '70', '20', '83650', '94962', '11'), +('13', '70', '20', '39235', '91258', '11'), +('13', '70', '20', '69134', '64560', '11'), +('13', '70', '12', '83571', '93270', '11'), +('13', '70', '12', '69255', '66360', '11'), +('13', '70', '12', '71090', '51668', '11'), +('13', '70', '12', '70940', '49132', '11'), +('13', '70', '18', '70943', '76613', '11'), +('13', '70', '18', '68751', '52104', '11'), +('13', '70', '18', '83610', '45152', '11'), +('13', '70', '18', '69149', '40112', '11'), +('13', '70', '19', '70941', '69613', '11'), +('13', '70', '19', '69078', '61140', '11'), +('13', '70', '19', '47219', '53040', '11'), +('13', '70', '19', '71091', '51053', '11'), +('13', '70', '13', '47250', '62952', '11'), +('13', '70', '13', '69046', '60157', '11'), +('13', '70', '13', '70622', '55808', '11'), +('13', '70', '13', '71671', '51989', '11'), +('13', '70', '14', '71669', '79911', '11'), +('13', '70', '14', '47311', '73883', '11'), +('13', '70', '14', '47250', '62952', '11'), +('13', '70', '14', '69046', '60157', '11'), +('13', '70', '11', '83548', '71659', '11'), +('13', '70', '11', '69162', '65682', '11'), +('13', '70', '11', '47243', '61075', '11'), +('13', '70', '11', '83665', '58116', '11'), +('13', '70', '22', '61948', '0', '10'), +('13', '70', '22', '66397', '0', '10'), +('13', '70', '22', '21805', '0', '10'), +('13', '70', '22', '21807', '0', '10'), +('13', '70', '1', '69106', '93028', '10'), +('13', '70', '1', '47285', '72326', '10'), +('13', '70', '1', '69062', '63723', '10'), +('13', '70', '1', '70983', '52450', '10'), +('13', '70', '2', '68195', '45606', '10'), +('13', '70', '2', '83563', '41920', '10'), +('13', '70', '2', '70937', '38273', '10'), +('13', '70', '2', '47211', '35038', '10'), +('13', '70', '3', '83634', '95080', '10'), +('13', '70', '3', '71655', '75895', '10'), +('13', '70', '3', '83531', '65208', '10'), +('13', '70', '3', '83658', '64973', '10'), +('13', '70', '5', '69135', '64343', '10'), +('13', '70', '5', '47276', '58823', '10'), +('13', '70', '5', '68808', '52408', '10'), +('13', '70', '5', '67625', '46759', '10'), +('13', '70', '8', '70704', '95024', '10'), +('13', '70', '8', '71665', '80589', '10'), +('13', '70', '8', '47247', '61258', '10'), +('13', '70', '8', '47306', '58996', '10'), +('13', '70', '6', '83635', '94263', '10'), +('13', '70', '6', '83407', '53588', '10'), +('13', '70', '6', '68788', '53459', '10'), +('13', '70', '6', '71590', '49683', '10'), +('13', '70', '17', '83606', '67853', '10'), +('13', '70', '17', '70714', '67002', '10'), +('13', '70', '17', '71641', '66031', '10'), +('13', '70', '17', '68986', '63010', '10'), +('13', '70', '7', '71089', '51191', '10'), +('13', '70', '7', '83567', '41070', '10'), +('13', '70', '7', '69082', '39443', '10'), +('13', '70', '7', '70938', '37645', '10'), +('13', '70', '9', '83655', '44309', '10'), +('13', '70', '9', '69100', '41632', '10'), +('13', '70', '9', '70939', '36734', '10'), +('13', '70', '9', '68606', '36646', '10'), +('13', '70', '15', '68957', '61189', '10'), +('13', '70', '15', '68846', '60539', '10'), +('13', '70', '15', '83458', '56120', '10'), +('13', '70', '15', '68672', '53365', '10'), +('13', '70', '20', '83650', '94962', '10'), +('13', '70', '20', '69134', '64560', '10'), +('13', '70', '20', '71609', '49505', '10'), +('13', '70', '20', '67625', '46759', '10'), +('13', '70', '12', '83571', '93270', '10'), +('13', '70', '12', '69255', '66360', '10'), +('13', '70', '12', '71090', '51668', '10'), +('13', '70', '12', '70940', '49132', '10'), +('13', '70', '18', '70943', '76613', '10'), +('13', '70', '18', '68751', '52104', '10'), +('13', '70', '18', '83610', '45152', '10'), +('13', '70', '18', '69149', '40112', '10'), +('13', '70', '19', '70941', '69613', '10'), +('13', '70', '19', '69078', '61140', '10'), +('13', '70', '19', '47219', '53040', '10'), +('13', '70', '19', '71091', '51053', '10'), +('13', '70', '13', '47250', '62952', '10'), +('13', '70', '13', '69046', '60157', '10'), +('13', '70', '13', '70622', '55808', '10'), +('13', '70', '13', '71671', '51989', '10'), +('13', '70', '14', '71669', '79911', '10'), +('13', '70', '14', '47311', '73883', '10'), +('13', '70', '14', '47250', '62952', '10'), +('13', '70', '14', '69046', '60157', '10'), +('13', '70', '11', '83548', '71659', '10'), +('13', '70', '11', '69162', '65682', '10'), +('13', '70', '11', '47243', '61075', '10'), +('13', '70', '11', '83665', '58116', '10'), +('13', '70', '22', '66397', '0', '9'), +('13', '70', '22', '62787', '0', '9'), +('13', '70', '22', '61948', '0', '9'), +('13', '70', '22', '21805', '0', '9'), +('13', '70', '1', '69106', '93028', '9'), +('13', '70', '1', '47285', '72326', '9'), +('13', '70', '1', '69062', '63723', '9'), +('13', '70', '1', '70983', '52450', '9'), +('13', '70', '2', '68195', '45606', '9'), +('13', '70', '2', '70937', '38273', '9'), +('13', '70', '2', '47211', '35038', '9'), +('13', '70', '2', '70724', '33579', '9'), +('13', '70', '3', '71655', '75895', '9'), +('13', '70', '3', '69074', '62319', '9'), +('13', '70', '3', '47299', '43061', '9'), +('13', '70', '3', '68818', '41896', '9'), +('13', '70', '5', '69135', '64343', '9'), +('13', '70', '5', '47276', '58823', '9'), +('13', '70', '5', '68808', '52408', '9'), +('13', '70', '5', '67625', '46759', '9'), +('13', '70', '8', '70704', '95024', '9'), +('13', '70', '8', '71665', '80589', '9'), +('13', '70', '8', '47247', '61258', '9'), +('13', '70', '8', '47306', '58996', '9'), +('13', '70', '6', '68788', '53459', '9'), +('13', '70', '6', '71590', '49683', '9'), +('13', '70', '6', '68841', '44988', '9'), +('13', '70', '6', '47280', '38827', '9'), +('13', '70', '17', '70714', '67002', '9'), +('13', '70', '17', '71641', '66031', '9'), +('13', '70', '17', '68986', '63010', '9'), +('13', '70', '17', '69153', '53434', '9'), +('13', '70', '7', '71089', '51191', '9'), +('13', '70', '7', '69082', '39443', '9'), +('13', '70', '7', '70938', '37645', '9'), +('13', '70', '7', '68916', '36731', '9'), +('13', '70', '9', '69100', '41632', '9'), +('13', '70', '9', '70939', '36734', '9'), +('13', '70', '9', '68606', '36646', '9'), +('13', '70', '9', '47223', '35153', '9'), +('13', '70', '15', '68957', '61189', '9'), +('13', '70', '15', '68846', '60539', '9'), +('13', '70', '15', '68672', '53365', '9'), +('13', '70', '15', '47240', '51047', '9'), +('13', '70', '20', '69134', '64560', '9'), +('13', '70', '20', '71609', '49505', '9'), +('13', '70', '20', '67625', '46759', '9'), +('13', '70', '20', '68726', '40417', '9'), +('13', '70', '12', '69255', '66360', '9'), +('13', '70', '12', '71090', '51668', '9'), +('13', '70', '12', '70940', '49132', '9'), +('13', '70', '12', '28144', '40656', '9'), +('13', '70', '18', '70943', '76613', '9'), +('13', '70', '18', '68751', '52104', '9'), +('13', '70', '18', '69149', '40112', '9'), +('13', '70', '18', '71649', '38081', '9'), +('13', '70', '19', '70941', '69613', '9'), +('13', '70', '19', '69078', '61140', '9'), +('13', '70', '19', '47219', '53040', '9'), +('13', '70', '19', '71091', '51053', '9'), +('13', '70', '13', '47250', '62952', '9'), +('13', '70', '13', '69046', '60157', '9'), +('13', '70', '13', '70622', '55808', '9'), +('13', '70', '13', '71671', '51989', '9'), +('13', '70', '14', '71669', '79911', '9'), +('13', '70', '14', '47311', '73883', '9'), +('13', '70', '14', '47250', '62952', '9'), +('13', '70', '14', '69046', '60157', '9'), +('13', '70', '11', '69162', '65682', '9'), +('13', '70', '11', '47243', '61075', '9'), +('13', '70', '11', '71659', '55654', '9'), +('13', '70', '11', '20508', '54310', '9'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '70', '22', '66397', '0', '8'), +('13', '70', '22', '62787', '0', '8'), +('13', '70', '22', '61948', '0', '8'), +('13', '70', '22', '21805', '0', '8'), +('13', '70', '1', '69106', '93028', '8'), +('13', '70', '1', '47285', '72326', '8'), +('13', '70', '1', '69062', '63723', '8'), +('13', '70', '1', '70692', '46546', '8'), +('13', '70', '2', '68195', '45606', '8'), +('13', '70', '2', '70937', '38273', '8'), +('13', '70', '2', '47211', '35038', '8'), +('13', '70', '2', '70724', '33579', '8'), +('13', '70', '3', '69074', '62319', '8'), +('13', '70', '3', '47299', '43061', '8'), +('13', '70', '3', '68818', '41896', '8'), +('13', '70', '3', '47302', '37353', '8'), +('13', '70', '5', '69135', '64343', '8'), +('13', '70', '5', '47276', '58823', '8'), +('13', '70', '5', '68808', '52408', '8'), +('13', '70', '5', '67625', '46759', '8'), +('13', '70', '8', '70704', '95024', '8'), +('13', '70', '8', '47247', '61258', '8'), +('13', '70', '8', '47306', '58996', '8'), +('13', '70', '8', '69164', '49559', '8'), +('13', '70', '6', '68788', '53459', '8'), +('13', '70', '6', '68841', '44988', '8'), +('13', '70', '6', '47280', '38827', '8'), +('13', '70', '6', '68789', '35792', '8'), +('13', '70', '17', '70714', '67002', '8'), +('13', '70', '17', '68986', '63010', '8'), +('13', '70', '17', '69153', '53434', '8'), +('13', '70', '17', '47655', '49583', '8'), +('13', '70', '7', '71089', '51191', '8'), +('13', '70', '7', '69082', '39443', '8'), +('13', '70', '7', '70938', '37645', '8'), +('13', '70', '7', '68916', '36731', '8'), +('13', '70', '9', '69100', '41632', '8'), +('13', '70', '9', '70939', '36734', '8'), +('13', '70', '9', '68606', '36646', '8'), +('13', '70', '9', '47223', '35153', '8'), +('13', '70', '15', '68957', '61189', '8'), +('13', '70', '15', '68846', '60539', '8'), +('13', '70', '15', '68672', '53365', '8'), +('13', '70', '15', '47240', '51047', '8'), +('13', '70', '20', '69134', '64560', '8'), +('13', '70', '20', '67625', '46759', '8'), +('13', '70', '20', '68726', '40417', '8'), +('13', '70', '20', '47284', '37518', '8'), +('13', '70', '12', '69255', '66360', '8'), +('13', '70', '12', '71090', '51668', '8'), +('13', '70', '12', '70940', '49132', '8'), +('13', '70', '12', '28144', '40656', '8'), +('13', '70', '18', '70943', '76613', '8'), +('13', '70', '18', '68751', '52104', '8'), +('13', '70', '18', '69149', '40112', '8'), +('13', '70', '18', '28649', '37536', '8'), +('13', '70', '19', '70941', '69613', '8'), +('13', '70', '19', '69078', '61140', '8'), +('13', '70', '19', '47219', '53040', '8'), +('13', '70', '19', '71091', '51053', '8'), +('13', '70', '13', '47250', '62952', '8'), +('13', '70', '13', '69046', '60157', '8'), +('13', '70', '13', '70622', '55808', '8'), +('13', '70', '13', '68744', '51061', '8'), +('13', '70', '14', '47311', '73883', '8'), +('13', '70', '14', '47250', '62952', '8'), +('13', '70', '14', '69046', '60157', '8'), +('13', '70', '14', '70622', '55808', '8'), +('13', '70', '11', '69162', '65682', '8'), +('13', '70', '11', '47243', '61075', '8'), +('13', '70', '11', '20508', '54310', '8'), +('13', '70', '11', '20496', '51390', '8'), +('13', '71', '22', '21805', '0', '11'), +('13', '71', '22', '61948', '0', '11'), +('13', '71', '22', '21807', '0', '11'), +('13', '71', '22', '12425', '0', '11'), +('13', '71', '1', '51705', '92567', '11'), +('13', '71', '1', '69106', '91284', '11'), +('13', '71', '1', '47285', '70530', '11'), +('13', '71', '1', '69062', '61929', '11'), +('13', '71', '2', '39358', '66864', '11'), +('13', '71', '2', '68195', '44212', '11'), +('13', '71', '2', '83563', '41928', '11'), +('13', '71', '2', '39285', '41441', '11'), +('13', '71', '3', '83634', '92686', '11'), +('13', '71', '3', '71655', '73900', '11'), +('13', '71', '3', '83658', '63978', '11'), +('13', '71', '3', '83531', '63613', '11'), +('13', '71', '5', '39328', '93780', '11'), +('13', '71', '5', '69135', '62747', '11'), +('13', '71', '5', '47276', '57829', '11'), +('13', '71', '5', '68808', '50813', '11'), +('13', '71', '8', '70704', '93280', '11'), +('13', '71', '8', '39299', '92317', '11'), +('13', '71', '8', '71665', '78594', '11'), +('13', '71', '8', '47247', '59859', '11'), +('13', '71', '6', '39275', '92338', '11'), +('13', '71', '6', '83635', '91868', '11'), +('13', '71', '6', '39209', '63345', '11'), +('13', '71', '6', '39263', '60832', '11'), +('13', '71', '17', '83606', '66860', '11'), +('13', '71', '17', '70714', '65410', '11'), +('13', '71', '17', '71641', '64435', '11'), +('13', '71', '17', '68986', '61215', '11'), +('13', '71', '7', '71089', '49995', '11'), +('13', '71', '7', '83567', '41078', '11'), +('13', '71', '7', '69082', '38871', '11'), +('13', '71', '7', '70938', '37649', '11'), +('13', '71', '9', '51709', '94875', '11'), +('13', '71', '9', '39336', '46955', '11'), +('13', '71', '9', '83655', '44314', '11'), +('13', '71', '9', '39297', '41458', '11'), +('13', '71', '15', '51702', '91087', '11'), +('13', '71', '15', '39230', '61752', '11'), +('13', '71', '15', '68957', '59393', '11'), +('13', '71', '15', '68846', '58743', '11'), +('13', '71', '20', '39253', '93115', '11'), +('13', '71', '20', '83650', '92567', '11'), +('13', '71', '20', '39235', '88863', '11'), +('13', '71', '20', '69134', '62965', '11'), +('13', '71', '12', '83571', '90878', '11'), +('13', '71', '12', '69255', '64764', '11'), +('13', '71', '12', '71090', '50471', '11'), +('13', '71', '12', '70940', '48563', '11'), +('13', '71', '18', '70943', '74818', '11'), +('13', '71', '18', '68751', '50609', '11'), +('13', '71', '18', '83610', '45159', '11'), +('13', '71', '18', '69149', '39867', '11'), +('13', '71', '19', '70941', '67621', '11'), +('13', '71', '19', '69078', '59344', '11'), +('13', '71', '19', '47219', '52144', '11'), +('13', '71', '19', '71091', '49853', '11'), +('13', '71', '13', '47250', '61557', '11'), +('13', '71', '13', '69046', '58362', '11'), +('13', '71', '13', '70622', '54413', '11'), +('13', '71', '13', '71671', '51419', '11'), +('13', '71', '14', '71669', '77916', '11'), +('13', '71', '14', '47311', '72089', '11'), +('13', '71', '14', '47250', '61557', '11'), +('13', '71', '14', '69046', '58362', '11'), +('13', '71', '11', '83548', '69864', '11'), +('13', '71', '11', '69162', '64089', '11'), +('13', '71', '11', '47243', '59679', '11'), +('13', '71', '11', '83665', '57549', '11'), +('13', '72', '22', '21805', '0', '11'), +('13', '72', '22', '61948', '0', '11'), +('13', '72', '22', '21807', '0', '11'), +('13', '72', '22', '12425', '0', '11'), +('13', '72', '1', '51705', '90172', '11'), +('13', '72', '1', '69106', '89540', '11'), +('13', '72', '1', '47285', '68735', '11'), +('13', '72', '1', '69062', '60135', '11'), +('13', '72', '2', '39358', '65870', '11'), +('13', '72', '2', '68195', '42817', '11'), +('13', '72', '2', '83563', '41936', '11'), +('13', '72', '2', '39285', '41447', '11'), +('13', '72', '3', '83634', '90292', '11'), +('13', '72', '3', '71655', '71905', '11'), +('13', '72', '3', '83658', '62982', '11'), +('13', '72', '3', '83531', '62018', '11'), +('13', '72', '5', '39328', '91386', '11'), +('13', '72', '5', '69135', '61151', '11'), +('13', '72', '5', '47276', '56834', '11'), +('13', '72', '5', '51701', '49921', '11'), +('13', '72', '8', '70704', '91536', '11'), +('13', '72', '8', '39299', '89921', '11'), +('13', '72', '8', '71665', '76600', '11'), +('13', '72', '8', '47247', '58459', '11'), +('13', '72', '6', '39275', '89943', '11'), +('13', '72', '6', '83635', '89473', '11'), +('13', '72', '6', '39209', '61749', '11'), +('13', '72', '6', '39263', '59836', '11'), +('13', '72', '17', '83606', '65867', '11'), +('13', '72', '17', '70714', '63817', '11'), +('13', '72', '17', '71641', '62840', '11'), +('13', '72', '17', '68986', '59420', '11'), +('13', '72', '7', '71089', '48799', '11'), +('13', '72', '7', '83567', '41086', '11'), +('13', '72', '7', '69082', '38299', '11'), +('13', '72', '7', '70938', '37653', '11'), +('13', '72', '9', '51709', '92480', '11'), +('13', '72', '9', '39336', '46962', '11'), +('13', '72', '9', '83655', '44319', '11'), +('13', '72', '9', '39297', '41463', '11'), +('13', '72', '15', '51702', '88693', '11'), +('13', '72', '15', '39230', '60157', '11'), +('13', '72', '15', '68957', '57597', '11'), +('13', '72', '15', '68846', '56947', '11'), +('13', '72', '20', '39253', '90720', '11'), +('13', '72', '20', '83650', '90172', '11'), +('13', '72', '20', '39235', '86468', '11'), +('13', '72', '20', '69134', '61370', '11'), +('13', '72', '12', '83571', '88487', '11'), +('13', '72', '12', '69255', '63167', '11'), +('13', '72', '12', '71090', '49274', '11'), +('13', '72', '12', '70940', '47994', '11'), +('13', '72', '18', '70943', '73024', '11'), +('13', '72', '18', '68751', '49114', '11'), +('13', '72', '18', '83610', '45166', '11'), +('13', '72', '18', '69149', '39622', '11'), +('13', '72', '19', '70941', '65629', '11'), +('13', '72', '19', '69078', '57548', '11'), +('13', '72', '19', '47219', '51248', '11'), +('13', '72', '19', '71091', '48653', '11'), +('13', '72', '13', '47250', '60162', '11'), +('13', '72', '13', '69046', '56567', '11'), +('13', '72', '13', '70622', '53018', '11'), +('13', '72', '13', '71671', '50850', '11'), +('13', '72', '14', '71669', '75921', '11'), +('13', '72', '14', '47311', '70294', '11'), +('13', '72', '14', '47250', '60162', '11'), +('13', '72', '14', '69046', '56567', '11'), +('13', '72', '11', '83548', '68069', '11'), +('13', '72', '11', '69162', '62495', '11'), +('13', '72', '11', '47243', '58282', '11'), +('13', '72', '11', '83665', '56981', '11'), +('13', '73', '22', '21805', '0', '11'), +('13', '73', '22', '61948', '0', '11'), +('13', '73', '22', '21807', '0', '11'), +('13', '73', '22', '12425', '0', '11'), +('13', '73', '1', '69106', '87796', '11'), +('13', '73', '1', '51705', '87777', '11'), +('13', '73', '1', '47285', '66940', '11'), +('13', '73', '1', '69062', '58341', '11'), +('13', '73', '2', '39358', '64875', '11'), +('13', '73', '2', '83563', '41944', '11'), +('13', '73', '2', '39285', '41452', '11'), +('13', '73', '2', '68195', '41422', '11'), +('13', '73', '3', '83634', '87898', '11'), +('13', '73', '3', '71655', '69910', '11'), +('13', '73', '3', '83658', '61987', '11'), +('13', '73', '3', '83531', '60423', '11'), +('13', '73', '5', '39328', '88992', '11'), +('13', '73', '5', '69135', '59555', '11'), +('13', '73', '5', '47276', '55839', '11'), +('13', '73', '5', '51701', '49576', '11'), +('13', '73', '8', '70704', '89792', '11'), +('13', '73', '8', '39299', '87526', '11'), +('13', '73', '8', '71665', '74605', '11'), +('13', '73', '8', '47247', '57059', '11'), +('13', '73', '6', '39275', '87549', '11'), +('13', '73', '6', '83635', '87079', '11'), +('13', '73', '6', '39209', '60154', '11'), +('13', '73', '6', '39263', '58840', '11'), +('13', '73', '17', '83606', '64874', '11'), +('13', '73', '17', '70714', '62224', '11'), +('13', '73', '17', '71641', '61245', '11'), +('13', '73', '17', '68986', '57625', '11'), +('13', '73', '7', '71089', '47603', '11'), +('13', '73', '7', '83567', '41095', '11'), +('13', '73', '7', '69082', '37727', '11'), +('13', '73', '7', '70938', '37657', '11'), +('13', '73', '9', '51709', '90085', '11'), +('13', '73', '9', '39336', '46970', '11'), +('13', '73', '9', '83655', '44324', '11'), +('13', '73', '9', '39297', '41468', '11'), +('13', '73', '15', '51702', '86300', '11'), +('13', '73', '15', '39230', '58562', '11'), +('13', '73', '15', '68957', '55801', '11'), +('13', '73', '15', '68846', '55151', '11'), +('13', '73', '20', '39253', '88325', '11'), +('13', '73', '20', '83650', '87777', '11'), +('13', '73', '20', '39235', '84073', '11'), +('13', '73', '20', '69134', '59775', '11'), +('13', '73', '12', '83571', '86095', '11'), +('13', '73', '12', '69255', '61571', '11'), +('13', '73', '12', '71090', '48077', '11'), +('13', '73', '12', '70940', '47425', '11'), +('13', '73', '18', '70943', '71229', '11'), +('13', '73', '18', '68751', '47619', '11'), +('13', '73', '18', '83610', '45173', '11'), +('13', '73', '18', '69149', '39377', '11'), +('13', '73', '19', '70941', '63637', '11'), +('13', '73', '19', '69078', '55752', '11'), +('13', '73', '19', '47219', '50352', '11'), +('13', '73', '19', '71091', '47453', '11'), +('13', '73', '13', '47250', '58767', '11'), +('13', '73', '13', '69046', '54772', '11'), +('13', '73', '13', '70622', '51623', '11'), +('13', '73', '13', '71671', '50280', '11'), +('13', '73', '14', '71669', '73925', '11'), +('13', '73', '14', '47311', '68499', '11'), +('13', '73', '14', '47250', '58767', '11'), +('13', '73', '14', '69046', '54772', '11'), +('13', '73', '11', '83548', '66274', '11'), +('13', '73', '11', '69162', '60901', '11'), +('13', '73', '11', '47243', '56886', '11'), +('13', '73', '11', '83665', '56413', '11'), +('13', '74', '22', '21805', '0', '11'), +('13', '74', '22', '61948', '0', '11'), +('13', '74', '22', '21807', '0', '11'), +('13', '74', '22', '12425', '0', '11'), +('13', '74', '1', '69106', '86052', '11'), +('13', '74', '1', '51705', '85382', '11'), +('13', '74', '1', '47285', '65144', '11'), +('13', '74', '1', '69062', '56547', '11'), +('13', '74', '2', '39358', '63880', '11'), +('13', '74', '2', '83563', '41952', '11'), +('13', '74', '2', '39285', '41458', '11'), +('13', '74', '2', '68195', '40027', '11'), +('13', '74', '3', '83634', '85504', '11'), +('13', '74', '3', '71655', '67915', '11'), +('13', '74', '3', '83658', '60991', '11'), +('13', '74', '3', '83531', '58828', '11'), +('13', '74', '5', '39328', '86598', '11'), +('13', '74', '5', '69135', '57960', '11'), +('13', '74', '5', '47276', '54844', '11'), +('13', '74', '5', '51701', '49231', '11'), +('13', '74', '8', '70704', '88048', '11'), +('13', '74', '8', '39299', '85130', '11'), +('13', '74', '8', '71665', '72611', '11'), +('13', '74', '8', '47247', '55659', '11'), +('13', '74', '6', '39275', '85154', '11'), +('13', '74', '6', '83635', '84684', '11'), +('13', '74', '6', '39209', '58558', '11'), +('13', '74', '6', '39263', '57844', '11'), +('13', '74', '17', '83606', '63881', '11'), +('13', '74', '17', '70714', '60631', '11'), +('13', '74', '17', '71641', '59649', '11'), +('13', '74', '17', '68986', '55830', '11'), +('13', '74', '7', '71089', '46407', '11'), +('13', '74', '7', '83567', '41103', '11'), +('13', '74', '7', '70938', '37661', '11'), +('13', '74', '7', '69082', '37155', '11'), +('13', '74', '9', '51709', '87690', '11'), +('13', '74', '9', '39336', '46977', '11'), +('13', '74', '9', '83655', '44329', '11'), +('13', '74', '9', '39297', '41473', '11'), +('13', '74', '15', '51702', '83906', '11'), +('13', '74', '15', '39230', '56967', '11'), +('13', '74', '15', '68957', '54005', '11'), +('13', '74', '15', '68846', '53355', '11'), +('13', '74', '20', '39253', '85930', '11'), +('13', '74', '20', '83650', '85382', '11'), +('13', '74', '20', '39235', '81678', '11'), +('13', '74', '20', '69134', '58180', '11'), +('13', '74', '12', '83571', '83703', '11'), +('13', '74', '12', '69255', '59975', '11'), +('13', '74', '12', '71090', '46880', '11'), +('13', '74', '12', '70940', '46856', '11'), +('13', '74', '18', '70943', '69434', '11'), +('13', '74', '18', '68751', '46124', '11'), +('13', '74', '18', '83610', '45180', '11'), +('13', '74', '18', '69149', '39132', '11'), +('13', '74', '19', '70941', '61645', '11'), +('13', '74', '19', '69078', '53956', '11'), +('13', '74', '19', '47219', '49457', '11'), +('13', '74', '19', '71091', '46253', '11'), +('13', '74', '13', '47250', '57372', '11'), +('13', '74', '13', '69046', '52977', '11'), +('13', '74', '13', '70622', '50229', '11'), +('13', '74', '13', '71671', '49711', '11'), +('13', '74', '14', '71669', '71930', '11'), +('13', '74', '14', '47311', '66704', '11'), +('13', '74', '14', '47250', '57372', '11'), +('13', '74', '14', '69046', '52977', '11'), +('13', '74', '11', '83548', '64479', '11'), +('13', '74', '11', '69162', '59307', '11'), +('13', '74', '11', '83665', '55846', '11'), +('13', '74', '11', '47243', '55490', '11'), +('13', '75', '22', '21807', '0', '13'), +('13', '75', '22', '21805', '0', '13'), +('13', '75', '22', '12425', '0', '13'), +('13', '75', '22', '39342', '0', '13'), +('13', '75', '1', '69106', '84308', '13'), +('13', '75', '1', '51705', '82988', '13'), +('13', '75', '1', '80676', '69837', '13'), +('13', '75', '1', '80639', '63585', '13'), +('13', '75', '2', '39358', '62885', '13'), +('13', '75', '2', '83563', '41960', '13'), +('13', '75', '2', '39285', '41463', '13'), +('13', '75', '2', '68195', '38632', '13'), +('13', '75', '3', '83634', '83110', '13'), +('13', '75', '3', '71655', '65920', '13'), +('13', '75', '3', '80647', '63886', '13'), +('13', '75', '3', '83658', '59996', '13'), +('13', '75', '5', '39328', '84204', '13'), +('13', '75', '5', '80661', '67706', '13'), +('13', '75', '5', '80615', '61755', '13'), +('13', '75', '5', '46934', '60593', '13'), +('13', '75', '8', '70704', '86304', '13'), +('13', '75', '8', '39299', '82735', '13'), +('13', '75', '8', '71665', '70616', '13'), +('13', '75', '8', '80679', '70108', '13'), +('13', '75', '6', '39275', '82760', '13'), +('13', '75', '6', '83635', '82289', '13'), +('13', '75', '6', '80646', '63256', '13'), +('13', '75', '6', '46883', '60592', '13'), +('13', '75', '17', '83606', '62888', '13'), +('13', '75', '17', '70714', '59038', '13'), +('13', '75', '17', '71641', '58054', '13'), +('13', '75', '17', '68986', '54035', '13'), +('13', '75', '7', '71089', '45212', '13'), +('13', '75', '7', '83567', '41111', '13'), +('13', '75', '7', '70938', '37666', '13'), +('13', '75', '7', '69082', '36583', '13'), +('13', '75', '9', '51709', '85295', '13'), +('13', '75', '9', '46938', '61211', '13'), +('13', '75', '9', '39336', '46984', '13'), +('13', '75', '9', '83655', '44334', '13'), +('13', '75', '15', '51702', '81512', '13'), +('13', '75', '15', '79909', '73463', '13'), +('13', '75', '15', '80666', '70407', '13'), +('13', '75', '15', '80686', '69748', '13'), +('13', '75', '20', '39253', '83535', '13'), +('13', '75', '20', '83650', '82987', '13'), +('13', '75', '20', '39235', '79283', '13'), +('13', '75', '20', '80680', '69998', '13'), +('13', '75', '12', '83571', '81311', '13'), +('13', '75', '12', '69255', '58378', '13'), +('13', '75', '12', '70940', '46287', '13'), +('13', '75', '12', '71090', '45684', '13'), +('13', '75', '18', '70943', '67639', '13'), +('13', '75', '18', '46810', '46034', '13'), +('13', '75', '18', '83610', '45187', '13'), +('13', '75', '18', '68751', '44629', '13'), +('13', '75', '19', '70941', '59653', '13'), +('13', '75', '19', '69078', '52160', '13'), +('13', '75', '19', '47219', '48561', '13'), +('13', '75', '19', '71091', '45053', '13'), +('13', '75', '13', '80633', '64542', '13'), +('13', '75', '13', '80624', '59241', '13'), +('13', '75', '13', '47250', '55977', '13'), +('13', '75', '13', '69046', '51182', '13'), +('13', '75', '14', '71669', '69935', '13'), +('13', '75', '14', '47311', '64909', '13'), +('13', '75', '14', '80665', '64832', '13'), +('13', '75', '14', '80635', '63176', '13'), +('13', '75', '11', '80668', '69847', '13'), +('13', '75', '11', '83548', '62684', '13'), +('13', '75', '11', '46939', '61490', '13'), +('13', '75', '11', '80629', '61164', '13'), +('13', '75', '22', '21807', '0', '12'), +('13', '75', '22', '21805', '0', '12'), +('13', '75', '22', '12425', '0', '12'), +('13', '75', '22', '39342', '0', '12'), +('13', '75', '1', '69106', '84308', '12'), +('13', '75', '1', '51705', '82988', '12'), +('13', '75', '1', '47285', '63349', '12'), +('13', '75', '1', '46882', '61234', '12'), +('13', '75', '2', '39358', '62885', '12'), +('13', '75', '2', '83563', '41960', '12'), +('13', '75', '2', '39285', '41463', '12'), +('13', '75', '2', '68195', '38632', '12'), +('13', '75', '3', '83634', '83110', '12'), +('13', '75', '3', '71655', '65920', '12'), +('13', '75', '3', '83658', '59996', '12'), +('13', '75', '3', '83531', '57233', '12'), +('13', '75', '5', '39328', '84204', '12'), +('13', '75', '5', '46934', '60593', '12'), +('13', '75', '5', '46868', '56791', '12'), +('13', '75', '5', '69135', '56364', '12'), +('13', '75', '8', '70704', '86304', '12'), +('13', '75', '8', '39299', '82735', '12'), +('13', '75', '8', '71665', '70616', '12'), +('13', '75', '8', '46936', '60834', '12'), +('13', '75', '6', '39275', '82760', '12'), +('13', '75', '6', '83635', '82289', '12'), +('13', '75', '6', '46883', '60592', '12'), +('13', '75', '6', '46933', '60239', '12'), +('13', '75', '17', '83606', '62888', '12'), +('13', '75', '17', '70714', '59038', '12'), +('13', '75', '17', '71641', '58054', '12'), +('13', '75', '17', '68986', '54035', '12'), +('13', '75', '7', '71089', '45212', '12'), +('13', '75', '7', '83567', '41111', '12'), +('13', '75', '7', '70938', '37666', '12'), +('13', '75', '7', '69082', '36583', '12'), +('13', '75', '9', '51709', '85295', '12'), +('13', '75', '9', '46938', '61211', '12'), +('13', '75', '9', '39336', '46984', '12'), +('13', '75', '9', '83655', '44334', '12'), +('13', '75', '15', '51702', '81512', '12'), +('13', '75', '15', '46932', '61314', '12'), +('13', '75', '15', '46864', '57244', '12'), +('13', '75', '15', '39230', '55372', '12'), +('13', '75', '20', '39253', '83535', '12'), +('13', '75', '20', '83650', '82987', '12'), +('13', '75', '20', '39235', '79283', '12'), +('13', '75', '20', '46886', '61166', '12'), +('13', '75', '12', '83571', '81311', '12'), +('13', '75', '12', '69255', '58378', '12'), +('13', '75', '12', '70940', '46287', '12'), +('13', '75', '12', '71090', '45684', '12'), +('13', '75', '18', '70943', '67639', '12'), +('13', '75', '18', '46810', '46034', '12'), +('13', '75', '18', '83610', '45187', '12'), +('13', '75', '18', '68751', '44629', '12'), +('13', '75', '19', '70941', '59653', '12'), +('13', '75', '19', '69078', '52160', '12'), +('13', '75', '19', '47219', '48561', '12'), +('13', '75', '19', '71091', '45053', '12'), +('13', '75', '13', '47250', '55977', '12'), +('13', '75', '13', '69046', '51182', '12'), +('13', '75', '13', '46906', '49911', '12'), +('13', '75', '13', '71671', '49141', '12'), +('13', '75', '14', '71669', '69935', '12'), +('13', '75', '14', '47311', '64909', '12'), +('13', '75', '14', '46925', '56305', '12'), +('13', '75', '14', '47250', '55977', '12'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '75', '11', '83548', '62684', '12'), +('13', '75', '11', '46939', '61490', '12'), +('13', '75', '11', '46889', '59391', '12'), +('13', '75', '11', '69162', '57713', '12'), +('13', '76', '22', '21807', '0', '13'), +('13', '76', '22', '21805', '0', '13'), +('13', '76', '22', '12425', '0', '13'), +('13', '76', '22', '39342', '0', '13'), +('13', '76', '1', '69106', '82564', '13'), +('13', '76', '1', '51705', '80593', '13'), +('13', '76', '1', '80676', '69844', '13'), +('13', '76', '1', '80639', '63592', '13'), +('13', '76', '2', '39358', '61890', '13'), +('13', '76', '2', '83563', '41968', '13'), +('13', '76', '2', '39285', '41469', '13'), +('13', '76', '2', '70937', '38309', '13'), +('13', '76', '3', '83634', '80716', '13'), +('13', '76', '3', '71655', '63925', '13'), +('13', '76', '3', '80647', '63893', '13'), +('13', '76', '3', '83658', '59000', '13'), +('13', '76', '5', '39328', '81810', '13'), +('13', '76', '5', '80661', '67713', '13'), +('13', '76', '5', '80615', '61761', '13'), +('13', '76', '5', '46934', '60600', '13'), +('13', '76', '8', '70704', '84560', '13'), +('13', '76', '8', '39299', '80339', '13'), +('13', '76', '8', '80679', '70108', '13'), +('13', '76', '8', '71665', '68622', '13'), +('13', '76', '6', '39275', '80365', '13'), +('13', '76', '6', '83635', '79894', '13'), +('13', '76', '6', '80646', '63256', '13'), +('13', '76', '6', '46883', '60599', '13'), +('13', '76', '17', '83606', '61895', '13'), +('13', '76', '17', '70714', '57445', '13'), +('13', '76', '17', '71641', '56459', '13'), +('13', '76', '17', '68986', '52241', '13'), +('13', '76', '7', '71089', '44016', '13'), +('13', '76', '7', '83567', '41119', '13'), +('13', '76', '7', '70938', '37670', '13'), +('13', '76', '7', '69082', '36011', '13'), +('13', '76', '9', '51709', '82901', '13'), +('13', '76', '9', '46938', '61219', '13'), +('13', '76', '9', '39336', '46991', '13'), +('13', '76', '9', '83655', '44339', '13'), +('13', '76', '15', '51702', '79118', '13'), +('13', '76', '15', '79909', '73469', '13'), +('13', '76', '15', '80666', '70407', '13'), +('13', '76', '15', '80686', '69755', '13'), +('13', '76', '20', '39253', '81140', '13'), +('13', '76', '20', '83650', '80592', '13'), +('13', '76', '20', '39235', '76889', '13'), +('13', '76', '20', '80680', '70005', '13'), +('13', '76', '12', '83571', '78919', '13'), +('13', '76', '12', '69255', '56782', '13'), +('13', '76', '12', '70940', '45718', '13'), +('13', '76', '12', '71090', '44487', '13'), +('13', '76', '18', '70943', '65844', '13'), +('13', '76', '18', '46810', '46039', '13'), +('13', '76', '18', '83610', '45194', '13'), +('13', '76', '18', '68751', '43134', '13'), +('13', '76', '19', '70941', '57661', '13'), +('13', '76', '19', '69078', '50364', '13'), +('13', '76', '19', '47219', '47665', '13'), +('13', '76', '19', '71091', '43853', '13'), +('13', '76', '13', '80633', '64547', '13'), +('13', '76', '13', '80624', '59246', '13'), +('13', '76', '13', '47250', '54582', '13'), +('13', '76', '13', '46906', '49919', '13'), +('13', '76', '14', '71669', '67940', '13'), +('13', '76', '14', '80665', '64837', '13'), +('13', '76', '14', '80635', '63181', '13'), +('13', '76', '14', '47311', '63114', '13'), +('13', '76', '11', '80668', '69854', '13'), +('13', '76', '11', '46939', '61497', '13'), +('13', '76', '11', '80629', '61170', '13'), +('13', '76', '11', '83548', '60889', '13'), +('13', '77', '22', '21807', '0', '13'), +('13', '77', '22', '21805', '0', '13'), +('13', '77', '22', '12425', '0', '13'), +('13', '77', '22', '39342', '0', '13'), +('13', '77', '1', '69106', '80820', '13'), +('13', '77', '1', '51705', '78198', '13'), +('13', '77', '1', '80676', '69851', '13'), +('13', '77', '1', '80639', '63598', '13'), +('13', '77', '2', '39358', '60895', '13'), +('13', '77', '2', '83563', '41976', '13'), +('13', '77', '2', '39285', '41474', '13'), +('13', '77', '2', '70937', '38315', '13'), +('13', '77', '3', '83634', '78322', '13'), +('13', '77', '3', '80647', '63899', '13'), +('13', '77', '3', '71655', '61930', '13'), +('13', '77', '3', '83658', '58005', '13'), +('13', '77', '5', '39328', '79416', '13'), +('13', '77', '5', '80661', '67720', '13'), +('13', '77', '5', '80615', '61767', '13'), +('13', '77', '5', '46934', '60607', '13'), +('13', '77', '8', '70704', '82816', '13'), +('13', '77', '8', '39299', '77943', '13'), +('13', '77', '8', '80679', '70108', '13'), +('13', '77', '8', '71665', '66627', '13'), +('13', '77', '6', '39275', '77970', '13'), +('13', '77', '6', '83635', '77499', '13'), +('13', '77', '6', '80646', '63256', '13'), +('13', '77', '6', '46883', '60606', '13'), +('13', '77', '17', '83606', '60902', '13'), +('13', '77', '17', '70714', '55852', '13'), +('13', '77', '17', '71641', '54863', '13'), +('13', '77', '17', '68986', '50446', '13'), +('13', '77', '7', '71089', '42820', '13'), +('13', '77', '7', '83567', '41127', '13'), +('13', '77', '7', '70938', '37674', '13'), +('13', '77', '7', '47207', '35968', '13'), +('13', '77', '9', '51709', '80506', '13'), +('13', '77', '9', '46938', '61227', '13'), +('13', '77', '9', '39336', '46998', '13'), +('13', '77', '9', '83655', '44344', '13'), +('13', '77', '15', '51702', '76724', '13'), +('13', '77', '15', '79909', '73475', '13'), +('13', '77', '15', '80666', '70407', '13'), +('13', '77', '15', '80686', '69762', '13'), +('13', '77', '20', '39253', '78745', '13'), +('13', '77', '20', '83650', '78197', '13'), +('13', '77', '20', '39235', '74494', '13'), +('13', '77', '20', '80680', '70012', '13'), +('13', '77', '12', '83571', '76527', '13'), +('13', '77', '12', '69255', '55186', '13'), +('13', '77', '12', '70940', '45149', '13'), +('13', '77', '12', '71090', '43290', '13'), +('13', '77', '18', '70943', '64049', '13'), +('13', '77', '18', '46810', '46044', '13'), +('13', '77', '18', '83610', '45202', '13'), +('13', '77', '18', '68751', '41639', '13'), +('13', '77', '19', '70941', '55669', '13'), +('13', '77', '19', '69078', '48568', '13'), +('13', '77', '19', '47219', '46769', '13'), +('13', '77', '19', '71091', '42653', '13'), +('13', '77', '13', '80633', '64552', '13'), +('13', '77', '13', '80624', '59251', '13'), +('13', '77', '13', '47250', '53187', '13'), +('13', '77', '13', '46906', '49926', '13'), +('13', '77', '14', '71669', '65944', '13'), +('13', '77', '14', '80665', '64842', '13'), +('13', '77', '14', '80635', '63186', '13'), +('13', '77', '14', '47311', '61319', '13'), +('13', '77', '11', '80668', '69862', '13'), +('13', '77', '11', '46939', '61504', '13'), +('13', '77', '11', '80629', '61176', '13'), +('13', '77', '11', '46889', '59406', '13'), +('13', '78', '22', '21807', '0', '13'), +('13', '78', '22', '21805', '0', '13'), +('13', '78', '22', '12425', '0', '13'), +('13', '78', '22', '39342', '0', '13'), +('13', '78', '1', '69106', '79076', '13'), +('13', '78', '1', '51705', '75803', '13'), +('13', '78', '1', '80676', '69858', '13'), +('13', '78', '1', '80639', '63605', '13'), +('13', '78', '2', '39358', '59900', '13'), +('13', '78', '2', '83563', '41985', '13'), +('13', '78', '2', '39285', '41480', '13'), +('13', '78', '2', '70937', '38321', '13'), +('13', '78', '3', '83634', '75928', '13'), +('13', '78', '3', '80647', '63906', '13'), +('13', '78', '3', '71655', '59934', '13'), +('13', '78', '3', '83658', '57009', '13'), +('13', '78', '5', '39328', '77022', '13'), +('13', '78', '5', '80661', '67727', '13'), +('13', '78', '5', '80615', '61773', '13'), +('13', '78', '5', '46934', '60614', '13'), +('13', '78', '8', '70704', '81072', '13'), +('13', '78', '8', '39299', '75548', '13'), +('13', '78', '8', '80679', '70108', '13'), +('13', '78', '8', '71665', '64633', '13'), +('13', '78', '6', '39275', '75576', '13'), +('13', '78', '6', '83635', '75104', '13'), +('13', '78', '6', '80646', '63256', '13'), +('13', '78', '6', '46883', '60614', '13'), +('13', '78', '17', '83606', '59909', '13'), +('13', '78', '17', '70714', '54259', '13'), +('13', '78', '17', '71641', '53268', '13'), +('13', '78', '17', '68986', '48651', '13'), +('13', '78', '7', '71089', '41624', '13'), +('13', '78', '7', '83567', '41135', '13'), +('13', '78', '7', '70938', '37678', '13'), +('13', '78', '7', '47207', '35972', '13'), +('13', '78', '9', '51709', '78111', '13'), +('13', '78', '9', '46938', '61235', '13'), +('13', '78', '9', '39336', '47005', '13'), +('13', '78', '9', '83655', '44349', '13'), +('13', '78', '15', '51702', '74330', '13'), +('13', '78', '15', '79909', '73481', '13'), +('13', '78', '15', '80666', '70408', '13'), +('13', '78', '15', '80686', '69770', '13'), +('13', '78', '20', '39253', '76350', '13'), +('13', '78', '20', '83650', '75802', '13'), +('13', '78', '20', '39235', '72099', '13'), +('13', '78', '20', '80680', '70020', '13'), +('13', '78', '12', '83571', '74135', '13'), +('13', '78', '12', '69255', '53589', '13'), +('13', '78', '12', '70940', '44581', '13'), +('13', '78', '12', '71090', '42093', '13'), +('13', '78', '18', '70943', '62254', '13'), +('13', '78', '18', '46810', '46049', '13'), +('13', '78', '18', '83610', '45209', '13'), +('13', '78', '18', '68751', '40144', '13'), +('13', '78', '19', '70941', '53677', '13'), +('13', '78', '19', '69078', '46773', '13'), +('13', '78', '19', '47219', '45873', '13'), +('13', '78', '19', '83575', '42335', '13'), +('13', '78', '13', '80633', '64558', '13'), +('13', '78', '13', '80624', '59256', '13'), +('13', '78', '13', '47250', '51792', '13'), +('13', '78', '13', '46906', '49933', '13'), +('13', '78', '14', '80665', '64847', '13'), +('13', '78', '14', '71669', '63949', '13'), +('13', '78', '14', '80635', '63191', '13'), +('13', '78', '14', '80625', '59544', '13'), +('13', '78', '11', '80668', '69869', '13'), +('13', '78', '11', '46939', '61511', '13'), +('13', '78', '11', '80629', '61182', '13'), +('13', '78', '11', '46889', '59413', '13'), +('13', '79', '22', '21807', '0', '13'), +('13', '79', '22', '21805', '0', '13'), +('13', '79', '22', '12425', '0', '13'), +('13', '79', '22', '39342', '0', '13'), +('13', '79', '1', '69106', '77332', '13'), +('13', '79', '1', '51705', '73408', '13'), +('13', '79', '1', '80676', '69866', '13'), +('13', '79', '1', '80639', '63611', '13'), +('13', '79', '2', '39358', '58905', '13'), +('13', '79', '2', '83563', '41993', '13'), +('13', '79', '2', '39285', '41485', '13'), +('13', '79', '2', '70937', '38327', '13'), +('13', '79', '3', '83634', '73534', '13'), +('13', '79', '3', '80647', '63912', '13'), +('13', '79', '3', '71655', '57939', '13'), +('13', '79', '3', '46874', '56468', '13'), +('13', '79', '5', '39328', '74628', '13'), +('13', '79', '5', '80661', '67734', '13'), +('13', '79', '5', '80615', '61779', '13'), +('13', '79', '5', '46934', '60621', '13'), +('13', '79', '8', '70704', '79328', '13'), +('13', '79', '8', '39299', '73152', '13'), +('13', '79', '8', '80679', '70109', '13'), +('13', '79', '8', '80649', '63662', '13'), +('13', '79', '6', '39275', '73181', '13'), +('13', '79', '6', '83635', '72709', '13'), +('13', '79', '6', '80646', '63256', '13'), +('13', '79', '6', '46883', '60621', '13'), +('13', '79', '17', '83606', '58917', '13'), +('13', '79', '17', '70714', '52666', '13'), +('13', '79', '17', '71641', '51673', '13'), +('13', '79', '17', '68986', '46856', '13'), +('13', '79', '7', '83567', '41143', '13'), +('13', '79', '7', '71089', '40428', '13'), +('13', '79', '7', '70938', '37682', '13'), +('13', '79', '7', '47207', '35976', '13'), +('13', '79', '9', '51709', '75716', '13'), +('13', '79', '9', '46938', '61243', '13'), +('13', '79', '9', '39336', '47012', '13'), +('13', '79', '9', '83655', '44354', '13'), +('13', '79', '15', '79909', '73487', '13'), +('13', '79', '15', '51702', '71936', '13'), +('13', '79', '15', '80666', '70408', '13'), +('13', '79', '15', '80686', '69777', '13'), +('13', '79', '20', '39253', '73955', '13'), +('13', '79', '20', '83650', '73407', '13'), +('13', '79', '20', '80680', '70027', '13'), +('13', '79', '20', '39235', '69704', '13'), +('13', '79', '12', '83571', '71743', '13'), +('13', '79', '12', '69255', '51993', '13'), +('13', '79', '12', '70940', '44012', '13'), +('13', '79', '12', '71090', '40896', '13'), +('13', '79', '18', '70943', '60459', '13'), +('13', '79', '18', '46810', '46054', '13'), +('13', '79', '18', '83610', '45216', '13'), +('13', '79', '18', '68751', '38649', '13'), +('13', '79', '19', '70941', '51685', '13'), +('13', '79', '19', '69078', '44977', '13'), +('13', '79', '19', '47219', '44977', '13'), +('13', '79', '19', '83575', '42343', '13'), +('13', '79', '13', '80633', '64563', '13'), +('13', '79', '13', '80624', '59261', '13'), +('13', '79', '13', '47250', '50397', '13'), +('13', '79', '13', '46906', '49940', '13'), +('13', '79', '14', '80665', '64852', '13'), +('13', '79', '14', '80635', '63196', '13'), +('13', '79', '14', '71669', '61954', '13'), +('13', '79', '14', '80625', '59549', '13'), +('13', '79', '11', '80668', '69876', '13'), +('13', '79', '11', '46939', '61518', '13'), +('13', '79', '11', '80629', '61189', '13'), +('13', '79', '11', '46889', '59420', '13'), +('13', '80', '22', '21807', '0', '14'), +('13', '80', '22', '21805', '0', '14'), +('13', '80', '22', '12425', '0', '14'), +('13', '80', '22', '39342', '0', '14'), +('13', '80', '1', '102604', '93204', '14'), +('13', '80', '1', '102640', '90969', '14'), +('13', '80', '1', '102639', '90781', '14'), +('13', '80', '1', '102641', '90734', '14'), +('13', '80', '2', '102024', '62969', '14'), +('13', '80', '2', '39358', '57910', '14'), +('13', '80', '2', '102276', '57018', '14'), +('13', '80', '2', '83563', '42001', '14'), +('13', '80', '3', '102605', '98300', '14'), +('13', '80', '3', '102742', '87955', '14'), +('13', '80', '3', '102560', '84491', '14'), +('13', '80', '3', '102741', '81023', '14'), +('13', '80', '5', '102731', '101448', '14'), +('13', '80', '5', '102606', '96941', '14'), +('13', '80', '5', '102730', '87885', '14'), +('13', '80', '5', '102565', '84046', '14'), +('13', '80', '8', '102728', '99779', '14'), +('13', '80', '8', '102608', '98343', '14'), +('13', '80', '8', '102728', '84014', '14'), +('13', '80', '8', '70704', '77584', '14'), +('13', '80', '6', '102607', '98511', '14'), +('13', '80', '6', '102561', '84768', '14'), +('13', '80', '6', '39275', '70787', '14'), +('13', '80', '6', '83635', '70314', '14'), +('13', '80', '17', '102027', '66408', '14'), +('13', '80', '17', '102279', '60051', '14'), +('13', '80', '17', '83606', '57924', '14'), +('13', '80', '17', '70714', '51073', '14'), +('13', '80', '7', '102025', '63501', '14'), +('13', '80', '7', '102277', '57260', '14'), +('13', '80', '7', '83567', '41151', '14'), +('13', '80', '7', '71089', '39232', '14'), +('13', '80', '9', '67098', '159874', '14'), +('13', '80', '9', '51709', '73321', '14'), +('13', '80', '9', '46938', '61251', '14'), +('13', '80', '9', '102291', '53447', '14'), +('13', '80', '15', '102723', '100578', '14'), +('13', '80', '15', '102609', '94512', '14'), +('13', '80', '15', '102637', '91292', '14'), +('13', '80', '15', '102634', '91217', '14'), +('13', '80', '20', '102610', '98617', '14'), +('13', '80', '20', '102563', '84634', '14'), +('13', '80', '20', '39253', '71560', '14'), +('13', '80', '20', '83650', '71012', '14'), +('13', '80', '12', '83571', '69351', '14'), +('13', '80', '12', '102274', '54549', '14'), +('13', '80', '12', '69255', '50397', '14'), +('13', '80', '12', '70940', '43443', '14'), +('13', '80', '18', '102026', '64371', '14'), +('13', '80', '18', '70943', '58665', '14'), +('13', '80', '18', '102278', '57932', '14'), +('13', '80', '18', '46810', '46059', '14'), +('13', '80', '19', '102275', '54793', '14'), +('13', '80', '19', '70941', '49693', '14'), +('13', '80', '19', '47219', '44081', '14'), +('13', '80', '19', '69078', '43181', '14'), +('13', '80', '13', '102657', '89343', '14'), +('13', '80', '13', '102735', '87780', '14'), +('13', '80', '13', '102734', '80947', '14'), +('13', '80', '13', '102586', '78263', '14'), +('13', '80', '14', '102633', '96195', '14'), +('13', '80', '14', '102632', '96049', '14'), +('13', '80', '14', '102570', '84133', '14'), +('13', '80', '14', '80665', '64857', '14'), +('13', '80', '11', '102643', '93296', '14'), +('13', '80', '11', '80668', '69884', '14'), +('13', '80', '11', '46939', '61525', '14'), +('13', '80', '11', '80629', '61195', '14'), +('13', '81', '22', '21807', '0', '14'), +('13', '81', '22', '21805', '0', '14'), +('13', '81', '22', '12425', '0', '14'), +('13', '81', '22', '39342', '0', '14'), +('13', '81', '1', '102604', '93209', '14'), +('13', '81', '1', '102640', '90978', '14'), +('13', '81', '1', '102639', '90788', '14'), +('13', '81', '1', '102641', '90743', '14'), +('13', '81', '2', '102024', '62974', '14'), +('13', '81', '2', '102276', '57024', '14'), +('13', '81', '2', '39358', '56915', '14'), +('13', '81', '2', '83563', '42009', '14'), +('13', '81', '3', '102605', '98304', '14'), +('13', '81', '3', '102742', '87964', '14'), +('13', '81', '3', '102560', '84497', '14'), +('13', '81', '3', '102741', '81030', '14'), +('13', '81', '5', '102731', '101457', '14'), +('13', '81', '5', '102606', '96944', '14'), +('13', '81', '5', '102730', '87892', '14'), +('13', '81', '5', '102565', '84052', '14'), +('13', '81', '8', '102728', '99786', '14'), +('13', '81', '8', '102608', '98350', '14'), +('13', '81', '8', '102728', '84019', '14'), +('13', '81', '8', '70704', '75840', '14'), +('13', '81', '6', '102607', '98518', '14'), +('13', '81', '6', '102561', '84774', '14'), +('13', '81', '6', '39275', '68392', '14'), +('13', '81', '6', '83635', '67920', '14'), +('13', '81', '17', '102027', '66412', '14'), +('13', '81', '17', '102279', '60056', '14'), +('13', '81', '17', '83606', '56931', '14'), +('13', '81', '17', '70714', '49481', '14'), +('13', '81', '7', '102025', '63509', '14'), +('13', '81', '7', '102277', '57265', '14'), +('13', '81', '7', '83567', '41159', '14'), +('13', '81', '7', '71089', '38036', '14'), +('13', '81', '9', '67098', '161876', '14'), +('13', '81', '9', '51709', '70926', '14'), +('13', '81', '9', '46938', '61259', '14'), +('13', '81', '9', '102291', '53452', '14'), +('13', '81', '15', '102723', '100585', '14'), +('13', '81', '15', '102609', '94519', '14'), +('13', '81', '15', '102637', '91300', '14'), +('13', '81', '15', '102634', '91222', '14'), +('13', '81', '20', '102610', '98626', '14'), +('13', '81', '20', '102563', '84636', '14'), +('13', '81', '20', '80680', '70042', '14'), +('13', '81', '20', '39253', '69165', '14'), +('13', '81', '12', '83571', '66959', '14'), +('13', '81', '12', '102274', '54555', '14'), +('13', '81', '12', '69255', '48801', '14'), +('13', '81', '12', '70940', '42874', '14'), +('13', '81', '18', '102026', '64373', '14'), +('13', '81', '18', '102278', '57941', '14'), +('13', '81', '18', '70943', '56870', '14'), +('13', '81', '18', '46810', '46064', '14'), +('13', '81', '19', '102275', '54794', '14'), +('13', '81', '19', '70941', '47701', '14'), +('13', '81', '19', '47219', '43185', '14'), +('13', '81', '19', '83575', '42359', '14'), +('13', '81', '13', '102657', '89347', '14'), +('13', '81', '13', '102735', '87787', '14'), +('13', '81', '13', '102734', '80953', '14'), +('13', '81', '13', '102586', '78265', '14'), +('13', '81', '14', '102633', '96201', '14'), +('13', '81', '14', '102632', '96055', '14'), +('13', '81', '14', '102570', '84141', '14'), +('13', '81', '14', '80665', '64862', '14'), +('13', '81', '11', '102643', '93301', '14'), +('13', '81', '11', '80668', '69891', '14'), +('13', '81', '11', '46939', '61533', '14'), +('13', '81', '11', '80629', '61201', '14'), +('13', '82', '22', '21807', '0', '14'), +('13', '82', '22', '21805', '0', '14'), +('13', '82', '22', '12425', '0', '14'), +('13', '82', '22', '39342', '0', '14'), +('13', '82', '1', '102604', '93215', '14'), +('13', '82', '1', '102640', '90988', '14'), +('13', '82', '1', '102639', '90795', '14'), +('13', '82', '1', '102641', '90753', '14'), +('13', '82', '2', '102024', '62980', '14'), +('13', '82', '2', '102276', '57029', '14'), +('13', '82', '2', '39358', '55920', '14'), +('13', '82', '2', '83563', '42017', '14'), +('13', '82', '3', '102605', '98308', '14'), +('13', '82', '3', '102742', '87972', '14'), +('13', '82', '3', '102560', '84503', '14'), +('13', '82', '3', '102741', '81037', '14'), +('13', '82', '5', '102731', '101466', '14'), +('13', '82', '5', '102606', '96947', '14'), +('13', '82', '5', '102730', '87900', '14'), +('13', '82', '5', '102565', '84059', '14'), +('13', '82', '8', '102728', '99793', '14'), +('13', '82', '8', '102608', '98358', '14'), +('13', '82', '8', '102728', '84024', '14'), +('13', '82', '8', '70704', '74096', '14'), +('13', '82', '6', '102607', '98525', '14'), +('13', '82', '6', '102561', '84781', '14'), +('13', '82', '6', '39275', '65997', '14'), +('13', '82', '6', '83635', '65525', '14'), +('13', '82', '17', '102027', '66416', '14'), +('13', '82', '17', '102279', '60061', '14'), +('13', '82', '17', '83606', '55938', '14'), +('13', '82', '17', '70714', '47888', '14'), +('13', '82', '7', '102025', '63516', '14'), +('13', '82', '7', '102277', '57270', '14'), +('13', '82', '7', '83567', '41167', '14'), +('13', '82', '7', '70938', '37695', '14'), +('13', '82', '9', '67098', '163878', '14'), +('13', '82', '9', '51709', '68531', '14'), +('13', '82', '9', '46938', '61267', '14'), +('13', '82', '9', '102291', '53457', '14'), +('13', '82', '15', '102723', '100592', '14'), +('13', '82', '15', '102609', '94526', '14'), +('13', '82', '15', '102637', '91309', '14'), +('13', '82', '15', '102634', '91227', '14'), +('13', '82', '20', '102610', '98634', '14'), +('13', '82', '20', '102563', '84639', '14'), +('13', '82', '20', '80680', '70049', '14'), +('13', '82', '20', '39253', '66770', '14'), +('13', '82', '12', '83571', '64568', '14'), +('13', '82', '12', '102274', '54560', '14'), +('13', '82', '12', '69255', '47204', '14'), +('13', '82', '12', '70940', '42305', '14'), +('13', '82', '18', '102026', '64375', '14'), +('13', '82', '18', '102278', '57949', '14'), +('13', '82', '18', '70943', '55075', '14'), +('13', '82', '18', '46810', '46069', '14'), +('13', '82', '19', '102275', '54796', '14'), +('13', '82', '19', '70941', '45709', '14'), +('13', '82', '19', '83575', '42368', '14'), +('13', '82', '19', '47219', '42289', '14'), +('13', '82', '13', '102657', '89351', '14'), +('13', '82', '13', '102735', '87794', '14'), +('13', '82', '13', '102734', '80959', '14'), +('13', '82', '13', '102586', '78267', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '82', '14', '102633', '96207', '14'), +('13', '82', '14', '102632', '96061', '14'), +('13', '82', '14', '102570', '84150', '14'), +('13', '82', '14', '80665', '64867', '14'), +('13', '82', '11', '102643', '93306', '14'), +('13', '82', '11', '80668', '69898', '14'), +('13', '82', '11', '46939', '61540', '14'), +('13', '82', '11', '80629', '61207', '14'), +('13', '83', '22', '21807', '0', '14'), +('13', '83', '22', '21805', '0', '14'), +('13', '83', '22', '12425', '0', '14'), +('13', '83', '22', '39342', '0', '14'), +('13', '83', '1', '102604', '93220', '14'), +('13', '83', '1', '102640', '90997', '14'), +('13', '83', '1', '102639', '90802', '14'), +('13', '83', '1', '102641', '90762', '14'), +('13', '83', '2', '102024', '62986', '14'), +('13', '83', '2', '102276', '57034', '14'), +('13', '83', '2', '39358', '54925', '14'), +('13', '83', '2', '83563', '42025', '14'), +('13', '83', '3', '102605', '98312', '14'), +('13', '83', '3', '102742', '87980', '14'), +('13', '83', '3', '102560', '84509', '14'), +('13', '83', '3', '102741', '81045', '14'), +('13', '83', '5', '102731', '101475', '14'), +('13', '83', '5', '102606', '96950', '14'), +('13', '83', '5', '102730', '87907', '14'), +('13', '83', '5', '102565', '84065', '14'), +('13', '83', '8', '102728', '99800', '14'), +('13', '83', '8', '102608', '98365', '14'), +('13', '83', '8', '102728', '84029', '14'), +('13', '83', '8', '70704', '72352', '14'), +('13', '83', '6', '102607', '98532', '14'), +('13', '83', '6', '102561', '84787', '14'), +('13', '83', '6', '39275', '63603', '14'), +('13', '83', '6', '80646', '63257', '14'), +('13', '83', '17', '102027', '66421', '14'), +('13', '83', '17', '102279', '60066', '14'), +('13', '83', '17', '83606', '54945', '14'), +('13', '83', '17', '70714', '46295', '14'), +('13', '83', '7', '102025', '63524', '14'), +('13', '83', '7', '102277', '57275', '14'), +('13', '83', '7', '83567', '41176', '14'), +('13', '83', '7', '70938', '37699', '14'), +('13', '83', '9', '67098', '165881', '14'), +('13', '83', '9', '51709', '66136', '14'), +('13', '83', '9', '46938', '61275', '14'), +('13', '83', '9', '102291', '53462', '14'), +('13', '83', '15', '102723', '100599', '14'), +('13', '83', '15', '102609', '94533', '14'), +('13', '83', '15', '102637', '91317', '14'), +('13', '83', '15', '102634', '91232', '14'), +('13', '83', '20', '102610', '98643', '14'), +('13', '83', '20', '102563', '84641', '14'), +('13', '83', '20', '80680', '70057', '14'), +('13', '83', '20', '39253', '64376', '14'), +('13', '83', '12', '83571', '62176', '14'), +('13', '83', '12', '102274', '54566', '14'), +('13', '83', '12', '69255', '45608', '14'), +('13', '83', '12', '70940', '41736', '14'), +('13', '83', '18', '102026', '64378', '14'), +('13', '83', '18', '102278', '57958', '14'), +('13', '83', '18', '70943', '53280', '14'), +('13', '83', '18', '46810', '46074', '14'), +('13', '83', '19', '102275', '54798', '14'), +('13', '83', '19', '70941', '43717', '14'), +('13', '83', '19', '83575', '42376', '14'), +('13', '83', '19', '47219', '41393', '14'), +('13', '83', '13', '102657', '89355', '14'), +('13', '83', '13', '102735', '87802', '14'), +('13', '83', '13', '102734', '80965', '14'), +('13', '83', '13', '102586', '78268', '14'), +('13', '83', '14', '102633', '96214', '14'), +('13', '83', '14', '102632', '96067', '14'), +('13', '83', '14', '102570', '84158', '14'), +('13', '83', '14', '80665', '64872', '14'), +('13', '83', '11', '102643', '93311', '14'), +('13', '83', '11', '80668', '69906', '14'), +('13', '83', '11', '46939', '61547', '14'), +('13', '83', '11', '80629', '61213', '14'), +('13', '84', '22', '21807', '0', '14'), +('13', '84', '22', '21805', '0', '14'), +('13', '84', '22', '12425', '0', '14'), +('13', '84', '22', '39342', '0', '14'), +('13', '84', '1', '102604', '93226', '14'), +('13', '84', '1', '102640', '91007', '14'), +('13', '84', '1', '102639', '90809', '14'), +('13', '84', '1', '102641', '90771', '14'), +('13', '84', '2', '102024', '62992', '14'), +('13', '84', '2', '102276', '57039', '14'), +('13', '84', '2', '39358', '53930', '14'), +('13', '84', '2', '83563', '42033', '14'), +('13', '84', '3', '102605', '98317', '14'), +('13', '84', '3', '102742', '87988', '14'), +('13', '84', '3', '102560', '84515', '14'), +('13', '84', '3', '102741', '81052', '14'), +('13', '84', '5', '102731', '101484', '14'), +('13', '84', '5', '102606', '96953', '14'), +('13', '84', '5', '102730', '87914', '14'), +('13', '84', '5', '102565', '84071', '14'), +('13', '84', '8', '102728', '99807', '14'), +('13', '84', '8', '102608', '98372', '14'), +('13', '84', '8', '102728', '84034', '14'), +('13', '84', '8', '70704', '70608', '14'), +('13', '84', '6', '102607', '98539', '14'), +('13', '84', '6', '102561', '84793', '14'), +('13', '84', '6', '80646', '63257', '14'), +('13', '84', '6', '39275', '61208', '14'), +('13', '84', '17', '102027', '66425', '14'), +('13', '84', '17', '102279', '60070', '14'), +('13', '84', '17', '83606', '53952', '14'), +('13', '84', '17', '70714', '44702', '14'), +('13', '84', '7', '102025', '63531', '14'), +('13', '84', '7', '102277', '57280', '14'), +('13', '84', '7', '83567', '41184', '14'), +('13', '84', '7', '70938', '37703', '14'), +('13', '84', '9', '67098', '167884', '14'), +('13', '84', '9', '51709', '63741', '14'), +('13', '84', '9', '46938', '61284', '14'), +('13', '84', '9', '102291', '53467', '14'), +('13', '84', '15', '102723', '100606', '14'), +('13', '84', '15', '102609', '94540', '14'), +('13', '84', '15', '102637', '91326', '14'), +('13', '84', '15', '102634', '91237', '14'), +('13', '84', '20', '102610', '98652', '14'), +('13', '84', '20', '102563', '84643', '14'), +('13', '84', '20', '80680', '70064', '14'), +('13', '84', '20', '39253', '61981', '14'), +('13', '84', '12', '83571', '59784', '14'), +('13', '84', '12', '102274', '54571', '14'), +('13', '84', '12', '69255', '44012', '14'), +('13', '84', '12', '70940', '41167', '14'), +('13', '84', '18', '102026', '64380', '14'), +('13', '84', '18', '102278', '57966', '14'), +('13', '84', '18', '70943', '51485', '14'), +('13', '84', '18', '46810', '46080', '14'), +('13', '84', '19', '102275', '54799', '14'), +('13', '84', '19', '83575', '42384', '14'), +('13', '84', '19', '70941', '41725', '14'), +('13', '84', '19', '47219', '40498', '14'), +('13', '84', '13', '102657', '89360', '14'), +('13', '84', '13', '102735', '87809', '14'), +('13', '84', '13', '102734', '80972', '14'), +('13', '84', '13', '102586', '78270', '14'), +('13', '84', '14', '102633', '96220', '14'), +('13', '84', '14', '102632', '96074', '14'), +('13', '84', '14', '102570', '84167', '14'), +('13', '84', '14', '80665', '64877', '14'), +('13', '84', '11', '102643', '93316', '14'), +('13', '84', '11', '80668', '69913', '14'), +('13', '84', '11', '46939', '61554', '14'), +('13', '84', '11', '80629', '61219', '14'), +('13', '85', '22', '12425', '0', '16'), +('13', '85', '22', '21807', '0', '16'), +('13', '85', '22', '39342', '0', '16'), +('13', '85', '22', '23597', '0', '16'), +('13', '85', '1', '111311', '178778', '16'), +('13', '85', '1', '111307', '176604', '16'), +('13', '85', '1', '111306', '176448', '16'), +('13', '85', '1', '111304', '176135', '16'), +('13', '85', '2', '62985', '109824', '16'), +('13', '85', '2', '94056', '109725', '16'), +('13', '85', '2', '104424', '95936', '16'), +('13', '85', '2', '54845', '70987', '16'), +('13', '85', '3', '111314', '177107', '16'), +('13', '85', '3', '111316', '175362', '16'), +('13', '85', '3', '111315', '174477', '16'), +('13', '85', '3', '111013', '155256', '16'), +('13', '85', '5', '111319', '176588', '16'), +('13', '85', '5', '111321', '175825', '16'), +('13', '85', '5', '111318', '173917', '16'), +('13', '85', '5', '111018', '154738', '16'), +('13', '85', '8', '111332', '177220', '16'), +('13', '85', '8', '111329', '176202', '16'), +('13', '85', '8', '111331', '172605', '16'), +('13', '85', '8', '111031', '155470', '16'), +('13', '85', '6', '111323', '177089', '16'), +('13', '85', '6', '111325', '175621', '16'), +('13', '85', '6', '111326', '175617', '16'), +('13', '85', '6', '111022', '155238', '16'), +('13', '85', '17', '56043', '117674', '16'), +('13', '85', '17', '56084', '114053', '16'), +('13', '85', '17', '104427', '99634', '16'), +('13', '85', '17', '54854', '75049', '16'), +('13', '85', '7', '56080', '109926', '16'), +('13', '85', '7', '56040', '109172', '16'), +('13', '85', '7', '104425', '95424', '16'), +('13', '85', '7', '54849', '70172', '16'), +('13', '85', '9', '67098', '169886', '16'), +('13', '85', '9', '56070', '106307', '16'), +('13', '85', '9', '56031', '106168', '16'), +('13', '85', '9', '62984', '106049', '16'), +('13', '85', '15', '111349', '179039', '16'), +('13', '85', '15', '111344', '177360', '16'), +('13', '85', '15', '111340', '176958', '16'), +('13', '85', '15', '111346', '176672', '16'), +('13', '85', '20', '111356', '177208', '16'), +('13', '85', '20', '111352', '176305', '16'), +('13', '85', '20', '111351', '173737', '16'), +('13', '85', '20', '111054', '155357', '16'), +('13', '85', '12', '56035', '108247', '16'), +('13', '85', '12', '56074', '107046', '16'), +('13', '85', '12', '104422', '93227', '16'), +('13', '85', '12', '49656', '70124', '16'), +('13', '85', '18', '56041', '114103', '16'), +('13', '85', '18', '62986', '112197', '16'), +('13', '85', '18', '104426', '96976', '16'), +('13', '85', '18', '54851', '71408', '16'), +('13', '85', '19', '62990', '110629', '16'), +('13', '85', '19', '81763', '110613', '16'), +('13', '85', '19', '56037', '109907', '16'), +('13', '85', '19', '56075', '109895', '16'), +('13', '85', '13', '111521', '183005', '16'), +('13', '85', '13', '111524', '173637', '16'), +('13', '85', '13', '111519', '173606', '16'), +('13', '85', '13', '111221', '162151', '16'), +('13', '85', '14', '111537', '177245', '16'), +('13', '85', '14', '111535', '175026', '16'), +('13', '85', '14', '111237', '155394', '16'), +('13', '85', '14', '111235', '153274', '16'), +('13', '85', '11', '111335', '176252', '16'), +('13', '85', '11', '111337', '176180', '16'), +('13', '85', '11', '111338', '172643', '16'), +('13', '85', '11', '111034', '154501', '16'), +('13', '85', '22', '21807', '0', '15'), +('13', '85', '22', '21805', '0', '15'), +('13', '85', '22', '12425', '0', '15'), +('13', '85', '22', '7867', '0', '15'), +('13', '85', '1', '107040', '133880', '15'), +('13', '85', '1', '107039', '131355', '15'), +('13', '85', '1', '107053', '129399', '15'), +('13', '85', '1', '107052', '127931', '15'), +('13', '85', '2', '62985', '109824', '15'), +('13', '85', '2', '94056', '109725', '15'), +('13', '85', '2', '104424', '95936', '15'), +('13', '85', '2', '54845', '70987', '15'), +('13', '85', '3', '107041', '135284', '15'), +('13', '85', '3', '107055', '128846', '15'), +('13', '85', '3', '106828', '125822', '15'), +('13', '85', '3', '106841', '122174', '15'), +('13', '85', '5', '107042', '134028', '15'), +('13', '85', '5', '107056', '128579', '15'), +('13', '85', '5', '106829', '125688', '15'), +('13', '85', '5', '56090', '111357', '15'), +('13', '85', '8', '107044', '135322', '15'), +('13', '85', '8', '107058', '130226', '15'), +('13', '85', '8', '106831', '126547', '15'), +('13', '85', '8', '106844', '121544', '15'), +('13', '85', '6', '107043', '135135', '15'), +('13', '85', '6', '107057', '130089', '15'), +('13', '85', '6', '106830', '126081', '15'), +('13', '85', '6', '106843', '121732', '15'), +('13', '85', '17', '56043', '117674', '15'), +('13', '85', '17', '56084', '114053', '15'), +('13', '85', '17', '104427', '99634', '15'), +('13', '85', '17', '54854', '75049', '15'), +('13', '85', '7', '56080', '109926', '15'), +('13', '85', '7', '56040', '109172', '15'), +('13', '85', '7', '104425', '95424', '15'), +('13', '85', '7', '54849', '70172', '15'), +('13', '85', '9', '67098', '169886', '15'), +('13', '85', '9', '56070', '106307', '15'), +('13', '85', '9', '56031', '106168', '15'), +('13', '85', '9', '62984', '106049', '15'), +('13', '85', '15', '107046', '133698', '15'), +('13', '85', '15', '107047', '133263', '15'), +('13', '85', '15', '107061', '128490', '15'), +('13', '85', '15', '107050', '127056', '15'), +('13', '85', '20', '107048', '135414', '15'), +('13', '85', '20', '107059', '131349', '15'), +('13', '85', '20', '106834', '127367', '15'), +('13', '85', '20', '106845', '123145', '15'), +('13', '85', '12', '56035', '108247', '15'), +('13', '85', '12', '56074', '107046', '15'), +('13', '85', '12', '104422', '93227', '15'), +('13', '85', '12', '83571', '57392', '15'), +('13', '85', '18', '56041', '114103', '15'), +('13', '85', '18', '62986', '112197', '15'), +('13', '85', '18', '104426', '96976', '15'), +('13', '85', '18', '54851', '71408', '15'), +('13', '85', '19', '62990', '110629', '15'), +('13', '85', '19', '81763', '110613', '15'), +('13', '85', '19', '56037', '109907', '15'), +('13', '85', '19', '56075', '109895', '15'), +('13', '85', '13', '106864', '126180', '15'), +('13', '85', '13', '106861', '124705', '15'), +('13', '85', '13', '106764', '113218', '15'), +('13', '85', '13', '62932', '112150', '15'), +('13', '85', '14', '107063', '131298', '15'), +('13', '85', '14', '107065', '129524', '15'), +('13', '85', '14', '106850', '123834', '15'), +('13', '85', '14', '106852', '122146', '15'), +('13', '85', '11', '107045', '133237', '15'), +('13', '85', '11', '106832', '123679', '15'), +('13', '85', '11', '106739', '110891', '15'), +('13', '85', '11', '56099', '108739', '15'), +('13', '86', '22', '12425', '0', '16'), +('13', '86', '22', '21807', '0', '16'), +('13', '86', '22', '39342', '0', '16'), +('13', '86', '22', '23597', '0', '16'), +('13', '86', '1', '111311', '178782', '16'), +('13', '86', '1', '111307', '176612', '16'), +('13', '86', '1', '111306', '176454', '16'), +('13', '86', '1', '111304', '176140', '16'), +('13', '86', '2', '62985', '109828', '16'), +('13', '86', '2', '94056', '109728', '16'), +('13', '86', '2', '104424', '95944', '16'), +('13', '86', '2', '54845', '70993', '16'), +('13', '86', '3', '111314', '177113', '16'), +('13', '86', '3', '111316', '175368', '16'), +('13', '86', '3', '111315', '174483', '16'), +('13', '86', '3', '111013', '155263', '16'), +('13', '86', '5', '111319', '176596', '16'), +('13', '86', '5', '111321', '175831', '16'), +('13', '86', '5', '111318', '173925', '16'), +('13', '86', '5', '111018', '154745', '16'), +('13', '86', '8', '111332', '177227', '16'), +('13', '86', '8', '111329', '176210', '16'), +('13', '86', '8', '111331', '172611', '16'), +('13', '86', '8', '111031', '155476', '16'), +('13', '86', '6', '111323', '177095', '16'), +('13', '86', '6', '111325', '175626', '16'), +('13', '86', '6', '111326', '175625', '16'), +('13', '86', '6', '111022', '155244', '16'), +('13', '86', '17', '56043', '117680', '16'), +('13', '86', '17', '56084', '114059', '16'), +('13', '86', '17', '104427', '99641', '16'), +('13', '86', '17', '54854', '75053', '16'), +('13', '86', '7', '56080', '109933', '16'), +('13', '86', '7', '56040', '109182', '16'), +('13', '86', '7', '104425', '95429', '16'), +('13', '86', '7', '54849', '70175', '16'), +('13', '86', '9', '67098', '171889', '16'), +('13', '86', '9', '56070', '106312', '16'), +('13', '86', '9', '56031', '106178', '16'), +('13', '86', '9', '62984', '106053', '16'), +('13', '86', '15', '111349', '179047', '16'), +('13', '86', '15', '111344', '177364', '16'), +('13', '86', '15', '111340', '176963', '16'), +('13', '86', '15', '111346', '176678', '16'), +('13', '86', '20', '111356', '177214', '16'), +('13', '86', '20', '111352', '176310', '16'), +('13', '86', '20', '111351', '173744', '16'), +('13', '86', '20', '111054', '155363', '16'), +('13', '86', '12', '56035', '108256', '16'), +('13', '86', '12', '56074', '107052', '16'), +('13', '86', '12', '104422', '93235', '16'), +('13', '86', '12', '49656', '70125', '16'), +('13', '86', '18', '56041', '114112', '16'), +('13', '86', '18', '62986', '112202', '16'), +('13', '86', '18', '104426', '96978', '16'), +('13', '86', '18', '54851', '71412', '16'), +('13', '86', '19', '62990', '110637', '16'), +('13', '86', '19', '81763', '110623', '16'), +('13', '86', '19', '56037', '109909', '16'), +('13', '86', '19', '56075', '109899', '16'), +('13', '86', '13', '111521', '183011', '16'), +('13', '86', '13', '111524', '173643', '16'), +('13', '86', '13', '111519', '173613', '16'), +('13', '86', '13', '111221', '162157', '16'), +('13', '86', '14', '111537', '177250', '16'), +('13', '86', '14', '111535', '175029', '16'), +('13', '86', '14', '111237', '155399', '16'), +('13', '86', '14', '111235', '153278', '16'), +('13', '86', '11', '111335', '176258', '16'), +('13', '86', '11', '111337', '176186', '16'), +('13', '86', '11', '111338', '172649', '16'), +('13', '86', '11', '111034', '154507', '16'), +('13', '87', '22', '12425', '0', '16'), +('13', '87', '22', '21807', '0', '16'), +('13', '87', '22', '39342', '0', '16'), +('13', '87', '22', '23597', '0', '16'), +('13', '87', '1', '111311', '178786', '16'), +('13', '87', '1', '111307', '176620', '16'), +('13', '87', '1', '111306', '176459', '16'), +('13', '87', '1', '111304', '176145', '16'), +('13', '87', '2', '62985', '109832', '16'), +('13', '87', '2', '94056', '109731', '16'), +('13', '87', '2', '104424', '95952', '16'), +('13', '87', '2', '54845', '70998', '16'), +('13', '87', '3', '111314', '177120', '16'), +('13', '87', '3', '111316', '175374', '16'), +('13', '87', '3', '111315', '174489', '16'), +('13', '87', '3', '111013', '155269', '16'), +('13', '87', '5', '111319', '176603', '16'), +('13', '87', '5', '111321', '175836', '16'), +('13', '87', '5', '111318', '173932', '16'), +('13', '87', '5', '111018', '154752', '16'), +('13', '87', '8', '111332', '177234', '16'), +('13', '87', '8', '111329', '176217', '16'), +('13', '87', '8', '111331', '172616', '16'), +('13', '87', '8', '111031', '155483', '16'), +('13', '87', '6', '111323', '177100', '16'), +('13', '87', '6', '111326', '175632', '16'), +('13', '87', '6', '111325', '175630', '16'), +('13', '87', '6', '111022', '155250', '16'), +('13', '87', '17', '56043', '117685', '16'), +('13', '87', '17', '56084', '114065', '16'), +('13', '87', '17', '104427', '99647', '16'), +('13', '87', '17', '54854', '75058', '16'), +('13', '87', '7', '56080', '109940', '16'), +('13', '87', '7', '56040', '109192', '16'), +('13', '87', '7', '104425', '95435', '16'), +('13', '87', '7', '54849', '70179', '16'), +('13', '87', '9', '67098', '173892', '16'), +('13', '87', '9', '56070', '106318', '16'), +('13', '87', '9', '56031', '106188', '16'), +('13', '87', '9', '62984', '106058', '16'), +('13', '87', '15', '111349', '179055', '16'), +('13', '87', '15', '111344', '177369', '16'), +('13', '87', '15', '111340', '176969', '16'), +('13', '87', '15', '111346', '176684', '16'), +('13', '87', '20', '111356', '177220', '16'), +('13', '87', '20', '111352', '176315', '16'), +('13', '87', '20', '111351', '173752', '16'), +('13', '87', '20', '111054', '155370', '16'), +('13', '87', '12', '56035', '108266', '16'), +('13', '87', '12', '56074', '107058', '16'), +('13', '87', '12', '104422', '93243', '16'), +('13', '87', '12', '49656', '70125', '16'), +('13', '87', '18', '56041', '114120', '16'), +('13', '87', '18', '62986', '112207', '16'), +('13', '87', '18', '104426', '96980', '16'), +('13', '87', '18', '54851', '71416', '16'), +('13', '87', '19', '62990', '110644', '16'), +('13', '87', '19', '81763', '110633', '16'), +('13', '87', '19', '56037', '109912', '16'), +('13', '87', '19', '56075', '109904', '16'), +('13', '87', '13', '111521', '183016', '16'), +('13', '87', '13', '111524', '173650', '16'), +('13', '87', '13', '111519', '173620', '16'), +('13', '87', '13', '111221', '162163', '16'), +('13', '87', '14', '111537', '177255', '16'), +('13', '87', '14', '111535', '175033', '16'), +('13', '87', '14', '111237', '155404', '16'), +('13', '87', '14', '111235', '153282', '16'), +('13', '87', '11', '111335', '176264', '16'), +('13', '87', '11', '111337', '176192', '16'), +('13', '87', '11', '111338', '172655', '16'), +('13', '87', '11', '111034', '154513', '16'), +('13', '88', '22', '12425', '0', '16'), +('13', '88', '22', '21807', '0', '16'), +('13', '88', '22', '39342', '0', '16'), +('13', '88', '22', '23597', '0', '16'), +('13', '88', '1', '111311', '178791', '16'), +('13', '88', '1', '111307', '176629', '16'), +('13', '88', '1', '111306', '176465', '16'), +('13', '88', '1', '111304', '176150', '16'), +('13', '88', '2', '62985', '109835', '16'), +('13', '88', '2', '94056', '109735', '16'), +('13', '88', '2', '104424', '95960', '16'), +('13', '88', '2', '54845', '71004', '16'), +('13', '88', '3', '111314', '177127', '16'), +('13', '88', '3', '111316', '175380', '16'), +('13', '88', '3', '111315', '174496', '16'), +('13', '88', '3', '111013', '155276', '16'), +('13', '88', '5', '111319', '176610', '16'), +('13', '88', '5', '111321', '175841', '16'), +('13', '88', '5', '111318', '173940', '16'), +('13', '88', '5', '111018', '154759', '16'), +('13', '88', '8', '111332', '177240', '16'), +('13', '88', '8', '111329', '176225', '16'), +('13', '88', '8', '111331', '172622', '16'), +('13', '88', '8', '111031', '155490', '16'), +('13', '88', '6', '111323', '177106', '16'), +('13', '88', '6', '111326', '175640', '16'), +('13', '88', '6', '111325', '175635', '16'), +('13', '88', '6', '111022', '155256', '16'), +('13', '88', '17', '56043', '117691', '16'), +('13', '88', '17', '56084', '114071', '16'), +('13', '88', '17', '104427', '99653', '16'), +('13', '88', '17', '54854', '75063', '16'), +('13', '88', '7', '56080', '109947', '16'), +('13', '88', '7', '56040', '109203', '16'), +('13', '88', '7', '104425', '95440', '16'), +('13', '88', '7', '54849', '70182', '16'), +('13', '88', '9', '67098', '175895', '16'), +('13', '88', '9', '56070', '106323', '16'), +('13', '88', '9', '56031', '106198', '16'), +('13', '88', '9', '62984', '106063', '16'), +('13', '88', '15', '111349', '179063', '16'), +('13', '88', '15', '111344', '177374', '16'), +('13', '88', '15', '111340', '176974', '16'), +('13', '88', '15', '111346', '176690', '16'), +('13', '88', '20', '111356', '177226', '16'), +('13', '88', '20', '111352', '176321', '16'), +('13', '88', '20', '111351', '173759', '16'), +('13', '88', '20', '111054', '155376', '16'), +('13', '88', '12', '56035', '108275', '16'), +('13', '88', '12', '56074', '107064', '16'), +('13', '88', '12', '104422', '93251', '16'), +('13', '88', '12', '49656', '70126', '16'), +('13', '88', '18', '56041', '114129', '16'), +('13', '88', '18', '62986', '112212', '16'), +('13', '88', '18', '104426', '96981', '16'), +('13', '88', '18', '54851', '71420', '16'), +('13', '88', '19', '62990', '110652', '16'), +('13', '88', '19', '81763', '110643', '16'), +('13', '88', '19', '56037', '109914', '16'), +('13', '88', '19', '56075', '109909', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '88', '13', '111521', '183021', '16'), +('13', '88', '13', '111524', '173657', '16'), +('13', '88', '13', '111519', '173628', '16'), +('13', '88', '13', '111221', '162169', '16'), +('13', '88', '14', '111537', '177260', '16'), +('13', '88', '14', '111535', '175037', '16'), +('13', '88', '14', '111237', '155409', '16'), +('13', '88', '14', '111235', '153286', '16'), +('13', '88', '11', '111335', '176269', '16'), +('13', '88', '11', '111337', '176198', '16'), +('13', '88', '11', '111338', '172661', '16'), +('13', '88', '11', '111034', '154519', '16'), +('13', '89', '22', '12425', '0', '16'), +('13', '89', '22', '21807', '0', '16'), +('13', '89', '22', '39342', '0', '16'), +('13', '89', '22', '23597', '0', '16'), +('13', '89', '1', '111311', '178795', '16'), +('13', '89', '1', '111307', '176637', '16'), +('13', '89', '1', '111306', '176471', '16'), +('13', '89', '1', '111304', '176155', '16'), +('13', '89', '2', '62985', '109839', '16'), +('13', '89', '2', '94056', '109738', '16'), +('13', '89', '2', '104424', '95968', '16'), +('13', '89', '2', '54845', '71010', '16'), +('13', '89', '3', '111314', '177133', '16'), +('13', '89', '3', '111316', '175386', '16'), +('13', '89', '3', '111315', '174502', '16'), +('13', '89', '3', '111013', '155282', '16'), +('13', '89', '5', '111319', '176617', '16'), +('13', '89', '5', '111321', '175846', '16'), +('13', '89', '5', '111318', '173947', '16'), +('13', '89', '5', '111018', '154767', '16'), +('13', '89', '8', '111332', '177247', '16'), +('13', '89', '8', '111329', '176232', '16'), +('13', '89', '8', '111331', '172627', '16'), +('13', '89', '8', '111031', '155496', '16'), +('13', '89', '6', '111323', '177112', '16'), +('13', '89', '6', '111326', '175648', '16'), +('13', '89', '6', '111325', '175640', '16'), +('13', '89', '6', '111022', '155261', '16'), +('13', '89', '17', '56043', '117697', '16'), +('13', '89', '17', '56084', '114077', '16'), +('13', '89', '17', '104427', '99659', '16'), +('13', '89', '17', '54854', '75067', '16'), +('13', '89', '7', '56080', '109955', '16'), +('13', '89', '7', '56040', '109213', '16'), +('13', '89', '7', '104425', '95446', '16'), +('13', '89', '7', '54849', '70185', '16'), +('13', '89', '9', '67098', '177898', '16'), +('13', '89', '9', '56070', '106328', '16'), +('13', '89', '9', '56031', '106209', '16'), +('13', '89', '9', '62984', '106068', '16'), +('13', '89', '15', '111349', '179071', '16'), +('13', '89', '15', '111344', '177378', '16'), +('13', '89', '15', '111340', '176980', '16'), +('13', '89', '15', '111346', '176696', '16'), +('13', '89', '20', '111356', '177232', '16'), +('13', '89', '20', '111352', '176326', '16'), +('13', '89', '20', '111351', '173767', '16'), +('13', '89', '20', '111054', '155382', '16'), +('13', '89', '12', '56035', '108285', '16'), +('13', '89', '12', '56074', '107070', '16'), +('13', '89', '12', '104422', '93259', '16'), +('13', '89', '12', '49656', '70127', '16'), +('13', '89', '18', '56041', '114137', '16'), +('13', '89', '18', '62986', '112217', '16'), +('13', '89', '18', '104426', '96983', '16'), +('13', '89', '18', '54851', '71424', '16'), +('13', '89', '19', '62990', '110659', '16'), +('13', '89', '19', '81763', '110653', '16'), +('13', '89', '19', '56037', '109917', '16'), +('13', '89', '19', '56075', '109913', '16'), +('13', '89', '13', '111521', '183027', '16'), +('13', '89', '13', '111524', '173663', '16'), +('13', '89', '13', '111519', '173635', '16'), +('13', '89', '13', '111221', '162175', '16'), +('13', '89', '14', '111537', '177266', '16'), +('13', '89', '14', '111535', '175041', '16'), +('13', '89', '14', '111237', '155414', '16'), +('13', '89', '14', '111235', '153290', '16'), +('13', '89', '11', '111335', '176275', '16'), +('13', '89', '11', '111337', '176204', '16'), +('13', '89', '11', '111338', '172667', '16'), +('13', '89', '11', '111034', '154525', '16'), +('13', '90', '22', '12425', '0', '17'), +('13', '90', '22', '21807', '0', '17'), +('13', '90', '22', '39342', '0', '17'), +('13', '90', '22', '23597', '0', '17'), +('13', '90', '1', '111311', '178799', '17'), +('13', '90', '1', '111307', '176645', '17'), +('13', '90', '1', '111306', '176476', '17'), +('13', '90', '1', '111304', '176160', '17'), +('13', '90', '2', '62985', '109843', '17'), +('13', '90', '2', '94056', '109741', '17'), +('13', '90', '2', '104424', '95976', '17'), +('13', '90', '2', '54845', '71016', '17'), +('13', '90', '3', '111314', '177140', '17'), +('13', '90', '3', '111316', '175393', '17'), +('13', '90', '3', '111315', '174508', '17'), +('13', '90', '3', '111013', '155289', '17'), +('13', '90', '5', '111319', '176624', '17'), +('13', '90', '5', '111321', '175851', '17'), +('13', '90', '5', '111318', '173955', '17'), +('13', '90', '5', '111018', '154774', '17'), +('13', '90', '8', '111332', '177254', '17'), +('13', '90', '8', '111329', '176240', '17'), +('13', '90', '8', '111331', '172632', '17'), +('13', '90', '8', '111031', '155503', '17'), +('13', '90', '6', '111323', '177118', '17'), +('13', '90', '6', '111326', '175656', '17'), +('13', '90', '6', '111325', '175644', '17'), +('13', '90', '6', '111022', '155267', '17'), +('13', '90', '17', '56043', '117702', '17'), +('13', '90', '17', '56084', '114084', '17'), +('13', '90', '17', '104427', '99665', '17'), +('13', '90', '17', '54854', '75072', '17'), +('13', '90', '7', '56080', '109962', '17'), +('13', '90', '7', '56040', '109223', '17'), +('13', '90', '7', '104425', '95451', '17'), +('13', '90', '7', '54849', '70189', '17'), +('13', '90', '9', '67098', '179901', '17'), +('13', '90', '9', '56070', '106333', '17'), +('13', '90', '9', '56031', '106219', '17'), +('13', '90', '9', '62984', '106073', '17'), +('13', '90', '15', '111349', '179079', '17'), +('13', '90', '15', '111344', '177383', '17'), +('13', '90', '15', '111340', '176985', '17'), +('13', '90', '15', '111346', '176701', '17'), +('13', '90', '20', '111356', '177239', '17'), +('13', '90', '20', '111352', '176331', '17'), +('13', '90', '20', '111351', '173774', '17'), +('13', '90', '20', '111054', '155388', '17'), +('13', '90', '12', '56035', '108294', '17'), +('13', '90', '12', '56074', '107076', '17'), +('13', '90', '12', '104422', '93267', '17'), +('13', '90', '12', '49656', '70128', '17'), +('13', '90', '18', '56041', '114146', '17'), +('13', '90', '18', '62986', '112222', '17'), +('13', '90', '18', '104426', '96985', '17'), +('13', '90', '18', '54851', '71429', '17'), +('13', '90', '19', '62990', '110667', '17'), +('13', '90', '19', '81763', '110663', '17'), +('13', '90', '19', '56037', '109919', '17'), +('13', '90', '19', '56075', '109918', '17'), +('13', '90', '13', '111521', '183032', '17'), +('13', '90', '13', '111524', '173670', '17'), +('13', '90', '13', '111519', '173643', '17'), +('13', '90', '13', '111221', '162181', '17'), +('13', '90', '14', '111537', '177271', '17'), +('13', '90', '14', '111535', '175045', '17'), +('13', '90', '14', '111237', '155419', '17'), +('13', '90', '14', '111235', '153294', '17'), +('13', '90', '11', '111335', '176281', '17'), +('13', '90', '11', '111337', '176210', '17'), +('13', '90', '11', '111338', '172673', '17'), +('13', '90', '11', '111034', '154531', '17'), +('13', '91', '22', '12425', '0', '17'), +('13', '91', '22', '21807', '0', '17'), +('13', '91', '22', '39342', '0', '17'), +('13', '91', '22', '23597', '0', '17'), +('13', '91', '1', '111311', '178803', '17'), +('13', '91', '1', '111307', '176653', '17'), +('13', '91', '1', '111306', '176482', '17'), +('13', '91', '1', '111304', '176165', '17'), +('13', '91', '2', '62985', '109847', '17'), +('13', '91', '2', '94056', '109744', '17'), +('13', '91', '2', '104424', '95984', '17'), +('13', '91', '2', '54845', '71022', '17'), +('13', '91', '3', '111314', '177146', '17'), +('13', '91', '3', '111316', '175399', '17'), +('13', '91', '3', '111315', '174514', '17'), +('13', '91', '3', '111013', '155296', '17'), +('13', '91', '5', '111319', '176631', '17'), +('13', '91', '5', '111321', '175856', '17'), +('13', '91', '5', '111318', '173962', '17'), +('13', '91', '5', '111018', '154781', '17'), +('13', '91', '8', '111332', '177260', '17'), +('13', '91', '8', '111329', '176247', '17'), +('13', '91', '8', '111331', '172638', '17'), +('13', '91', '8', '111031', '155510', '17'), +('13', '91', '6', '111323', '177123', '17'), +('13', '91', '6', '111326', '175663', '17'), +('13', '91', '6', '111325', '175649', '17'), +('13', '91', '6', '111022', '155273', '17'), +('13', '91', '17', '56043', '117708', '17'), +('13', '91', '17', '56084', '114090', '17'), +('13', '91', '17', '104427', '99671', '17'), +('13', '91', '17', '54854', '75077', '17'), +('13', '91', '7', '56080', '109969', '17'), +('13', '91', '7', '56040', '109233', '17'), +('13', '91', '7', '104425', '95457', '17'), +('13', '91', '7', '54849', '70192', '17'), +('13', '91', '9', '67098', '179905', '17'), +('13', '91', '9', '56070', '106339', '17'), +('13', '91', '9', '56031', '106229', '17'), +('13', '91', '9', '62984', '106077', '17'), +('13', '91', '15', '111349', '179087', '17'), +('13', '91', '15', '111344', '177388', '17'), +('13', '91', '15', '111340', '176991', '17'), +('13', '91', '15', '111346', '176707', '17'), +('13', '91', '20', '111356', '177245', '17'), +('13', '91', '20', '111352', '176337', '17'), +('13', '91', '20', '111351', '173782', '17'), +('13', '91', '20', '111054', '155394', '17'), +('13', '91', '12', '56035', '108304', '17'), +('13', '91', '12', '56074', '107082', '17'), +('13', '91', '12', '104422', '93275', '17'), +('13', '91', '12', '49656', '70129', '17'), +('13', '91', '18', '56041', '114154', '17'), +('13', '91', '18', '62986', '112227', '17'), +('13', '91', '18', '104426', '96987', '17'), +('13', '91', '18', '54851', '71433', '17'), +('13', '91', '19', '62990', '110674', '17'), +('13', '91', '19', '81763', '110672', '17'), +('13', '91', '19', '56075', '109923', '17'), +('13', '91', '19', '56037', '109922', '17'), +('13', '91', '13', '111521', '183037', '17'), +('13', '91', '13', '111524', '173676', '17'), +('13', '91', '13', '111519', '173650', '17'), +('13', '91', '13', '111221', '162187', '17'), +('13', '91', '14', '111537', '177276', '17'), +('13', '91', '14', '111535', '175049', '17'), +('13', '91', '14', '111237', '155424', '17'), +('13', '91', '14', '111235', '153298', '17'), +('13', '91', '11', '111335', '176287', '17'), +('13', '91', '11', '111337', '176216', '17'), +('13', '91', '11', '111338', '172679', '17'), +('13', '91', '11', '111034', '154537', '17'), +('13', '92', '22', '12425', '0', '17'), +('13', '92', '22', '21807', '0', '17'), +('13', '92', '22', '39342', '0', '17'), +('13', '92', '22', '23597', '0', '17'), +('13', '92', '1', '111311', '178807', '17'), +('13', '92', '1', '111307', '176661', '17'), +('13', '92', '1', '111306', '176487', '17'), +('13', '92', '1', '111304', '176170', '17'), +('13', '92', '2', '62985', '109851', '17'), +('13', '92', '2', '94056', '109748', '17'), +('13', '92', '2', '104424', '95992', '17'), +('13', '92', '2', '54845', '71028', '17'), +('13', '92', '3', '111314', '177153', '17'), +('13', '92', '3', '111316', '175405', '17'), +('13', '92', '3', '111315', '174520', '17'), +('13', '92', '3', '111013', '155302', '17'), +('13', '92', '5', '111319', '176638', '17'), +('13', '92', '5', '111321', '175861', '17'), +('13', '92', '5', '111318', '173970', '17'), +('13', '92', '5', '111018', '154788', '17'), +('13', '92', '8', '111332', '177267', '17'), +('13', '92', '8', '111329', '176255', '17'), +('13', '92', '8', '111331', '172643', '17'), +('13', '92', '8', '111031', '155516', '17'), +('13', '92', '6', '111323', '177129', '17'), +('13', '92', '6', '111326', '175671', '17'), +('13', '92', '6', '111325', '175654', '17'), +('13', '92', '6', '111022', '155279', '17'), +('13', '92', '17', '56043', '117713', '17'), +('13', '92', '17', '56084', '114096', '17'), +('13', '92', '17', '104427', '99677', '17'), +('13', '92', '17', '54854', '75081', '17'), +('13', '92', '7', '56080', '109976', '17'), +('13', '92', '7', '56040', '109243', '17'), +('13', '92', '7', '104425', '95462', '17'), +('13', '92', '7', '54849', '70195', '17'), +('13', '92', '9', '67098', '179910', '17'), +('13', '92', '9', '56070', '106344', '17'), +('13', '92', '9', '56031', '106239', '17'), +('13', '92', '9', '62984', '106082', '17'), +('13', '92', '15', '111349', '179096', '17'), +('13', '92', '15', '111344', '177393', '17'), +('13', '92', '15', '111340', '176996', '17'), +('13', '92', '15', '111346', '176713', '17'), +('13', '92', '20', '111356', '177251', '17'), +('13', '92', '20', '111352', '176342', '17'), +('13', '92', '20', '111351', '173789', '17'), +('13', '92', '20', '111054', '155400', '17'), +('13', '92', '12', '56035', '108313', '17'), +('13', '92', '12', '56074', '107088', '17'), +('13', '92', '12', '104422', '93283', '17'), +('13', '92', '12', '49656', '70130', '17'), +('13', '92', '18', '56041', '114163', '17'), +('13', '92', '18', '62986', '112232', '17'), +('13', '92', '18', '104426', '96989', '17'), +('13', '92', '18', '54851', '71437', '17'), +('13', '92', '19', '62990', '110682', '17'), +('13', '92', '19', '81763', '110682', '17'), +('13', '92', '19', '56075', '109928', '17'), +('13', '92', '19', '56037', '109924', '17'), +('13', '92', '13', '111521', '183043', '17'), +('13', '92', '13', '111524', '173683', '17'), +('13', '92', '13', '111519', '173658', '17'), +('13', '92', '13', '111221', '162193', '17'), +('13', '92', '14', '111537', '177281', '17'), +('13', '92', '14', '111535', '175053', '17'), +('13', '92', '14', '111237', '155430', '17'), +('13', '92', '14', '111235', '153302', '17'), +('13', '92', '11', '111335', '176293', '17'), +('13', '92', '11', '111337', '176222', '17'), +('13', '92', '11', '111338', '172686', '17'), +('13', '92', '11', '111034', '154543', '17'), +('13', '93', '22', '12425', '0', '17'), +('13', '93', '22', '21807', '0', '17'), +('13', '93', '22', '39342', '0', '17'), +('13', '93', '22', '23597', '0', '17'), +('13', '93', '1', '111311', '178811', '17'), +('13', '93', '1', '111307', '176669', '17'), +('13', '93', '1', '111306', '176493', '17'), +('13', '93', '1', '111304', '176175', '17'), +('13', '93', '2', '62985', '109855', '17'), +('13', '93', '2', '94056', '109751', '17'), +('13', '93', '2', '104424', '96000', '17'), +('13', '93', '2', '54845', '71034', '17'), +('13', '93', '3', '111314', '177159', '17'), +('13', '93', '3', '111316', '175411', '17'), +('13', '93', '3', '111315', '174527', '17'), +('13', '93', '3', '111013', '155309', '17'), +('13', '93', '5', '111319', '176646', '17'), +('13', '93', '5', '111321', '175866', '17'), +('13', '93', '5', '111318', '173977', '17'), +('13', '93', '5', '111018', '154795', '17'), +('13', '93', '8', '111332', '177274', '17'), +('13', '93', '8', '111329', '176263', '17'), +('13', '93', '8', '111331', '172648', '17'), +('13', '93', '8', '111031', '155523', '17'), +('13', '93', '6', '111323', '177135', '17'), +('13', '93', '6', '111326', '175679', '17'), +('13', '93', '6', '111325', '175659', '17'), +('13', '93', '6', '111022', '155284', '17'), +('13', '93', '17', '56043', '117719', '17'), +('13', '93', '17', '56084', '114102', '17'), +('13', '93', '17', '104427', '99684', '17'), +('13', '93', '17', '54854', '75086', '17'), +('13', '93', '7', '56080', '109983', '17'), +('13', '93', '7', '56040', '109253', '17'), +('13', '93', '7', '104425', '95468', '17'), +('13', '93', '7', '54849', '70199', '17'), +('13', '93', '9', '67098', '179914', '17'), +('13', '93', '9', '56070', '106349', '17'), +('13', '93', '9', '56031', '106249', '17'), +('13', '93', '9', '62984', '106087', '17'), +('13', '93', '15', '111349', '179104', '17'), +('13', '93', '15', '111344', '177397', '17'), +('13', '93', '15', '111340', '177002', '17'), +('13', '93', '15', '111346', '176719', '17'), +('13', '93', '20', '111356', '177257', '17'), +('13', '93', '20', '111352', '176347', '17'), +('13', '93', '20', '111351', '173797', '17'), +('13', '93', '20', '111054', '155407', '17'), +('13', '93', '12', '56035', '108323', '17'), +('13', '93', '12', '56074', '107094', '17'), +('13', '93', '12', '104422', '93290', '17'), +('13', '93', '12', '49656', '70130', '17'), +('13', '93', '18', '56041', '114171', '17'), +('13', '93', '18', '62986', '112237', '17'), +('13', '93', '18', '104426', '96991', '17'), +('13', '93', '18', '54851', '71441', '17'), +('13', '93', '19', '81763', '110692', '17'), +('13', '93', '19', '62990', '110689', '17'), +('13', '93', '19', '56075', '109932', '17'), +('13', '93', '19', '56037', '109927', '17'), +('13', '93', '13', '111521', '183048', '17'), +('13', '93', '13', '111524', '173690', '17'), +('13', '93', '13', '111519', '173665', '17'), +('13', '93', '13', '111221', '162199', '17'), +('13', '93', '14', '111537', '177286', '17'), +('13', '93', '14', '111535', '175057', '17'), +('13', '93', '14', '111237', '155435', '17'), +('13', '93', '14', '111235', '153306', '17'), +('13', '93', '11', '111335', '176299', '17'), +('13', '93', '11', '111337', '176228', '17'), +('13', '93', '11', '111338', '172692', '17'), +('13', '93', '11', '111034', '154548', '17'), +('13', '94', '22', '12425', '0', '17'), +('13', '94', '22', '21807', '0', '17'), +('13', '94', '22', '39342', '0', '17'), +('13', '94', '22', '23597', '0', '17'), +('13', '94', '1', '111311', '178815', '17'), +('13', '94', '1', '111307', '176678', '17'), +('13', '94', '1', '111306', '176498', '17'), +('13', '94', '1', '111304', '176179', '17'), +('13', '94', '2', '62985', '109859', '17'), +('13', '94', '2', '94056', '109754', '17'), +('13', '94', '2', '104424', '96008', '17'), +('13', '94', '2', '54845', '71039', '17'), +('13', '94', '3', '111314', '177166', '17'), +('13', '94', '3', '111316', '175417', '17'), +('13', '94', '3', '111315', '174533', '17'), +('13', '94', '3', '111013', '155315', '17'), +('13', '94', '5', '111319', '176653', '17'), +('13', '94', '5', '111321', '175871', '17'), +('13', '94', '5', '111318', '173985', '17'), +('13', '94', '5', '111018', '154802', '17'), +('13', '94', '8', '111332', '177280', '17'), +('13', '94', '8', '111329', '176270', '17'), +('13', '94', '8', '111331', '172654', '17'), +('13', '94', '8', '111031', '155530', '17'), +('13', '94', '6', '111323', '177141', '17'), +('13', '94', '6', '111326', '175686', '17'), +('13', '94', '6', '111325', '175663', '17'), +('13', '94', '6', '111022', '155290', '17'), +('13', '94', '17', '56043', '117724', '17'), +('13', '94', '17', '56084', '114108', '17'), +('13', '94', '17', '104427', '99690', '17'), +('13', '94', '17', '54854', '75091', '17'), +('13', '94', '7', '56080', '109990', '17'), +('13', '94', '7', '56040', '109263', '17'), +('13', '94', '7', '104425', '95473', '17'), +('13', '94', '7', '54849', '70202', '17'), +('13', '94', '9', '67098', '179918', '17'), +('13', '94', '9', '56070', '106354', '17'), +('13', '94', '9', '56031', '106259', '17'), +('13', '94', '9', '62984', '106092', '17'), +('13', '94', '15', '111349', '179112', '17'), +('13', '94', '15', '111344', '177402', '17'), +('13', '94', '15', '111340', '177007', '17'), +('13', '94', '15', '111346', '176725', '17'), +('13', '94', '20', '111356', '177263', '17'), +('13', '94', '20', '111352', '176353', '17'), +('13', '94', '20', '111351', '173804', '17'), +('13', '94', '20', '111054', '155413', '17'), +('13', '94', '12', '56035', '108332', '17'), +('13', '94', '12', '56074', '107100', '17'), +('13', '94', '12', '104422', '93298', '17'), +('13', '94', '12', '49656', '70131', '17'), +('13', '94', '18', '56041', '114180', '17'), +('13', '94', '18', '62986', '112242', '17'), +('13', '94', '18', '104426', '96993', '17'), +('13', '94', '18', '54851', '71445', '17'), +('13', '94', '19', '81763', '110702', '17'), +('13', '94', '19', '62990', '110697', '17'), +('13', '94', '19', '56075', '109937', '17'), +('13', '94', '19', '56037', '109929', '17'), +('13', '94', '13', '111521', '183053', '17'), +('13', '94', '13', '111524', '173696', '17'), +('13', '94', '13', '111519', '173672', '17'), +('13', '94', '13', '111221', '162205', '17'), +('13', '94', '14', '111537', '177291', '17'), +('13', '94', '14', '111535', '175061', '17'), +('13', '94', '14', '111237', '155440', '17'), +('13', '94', '14', '111235', '153310', '17'), +('13', '94', '11', '111335', '176305', '17'), +('13', '94', '11', '111337', '176235', '17'), +('13', '94', '11', '111338', '172698', '17'), +('13', '94', '11', '111034', '154554', '17'), +('13', '95', '22', '12425', '0', '18'), +('13', '95', '22', '21807', '0', '18'), +('13', '95', '22', '39342', '0', '18'), +('13', '95', '22', '23597', '0', '18'), +('13', '95', '1', '128691', '229802', '18'), +('13', '95', '1', '111311', '178819', '18'), +('13', '95', '1', '111307', '176686', '18'), +('13', '95', '1', '111306', '176504', '18'), +('13', '95', '2', '62985', '109863', '18'), +('13', '95', '2', '94056', '109758', '18'), +('13', '95', '2', '104424', '96016', '18'), +('13', '95', '2', '54845', '71045', '18'), +('13', '95', '3', '111314', '177172', '18'), +('13', '95', '3', '111316', '175423', '18'), +('13', '95', '3', '111315', '174539', '18'), +('13', '95', '3', '111013', '155322', '18'), +('13', '95', '5', '111319', '176660', '18'), +('13', '95', '5', '111321', '175877', '18'), +('13', '95', '5', '111318', '173992', '18'), +('13', '95', '5', '111018', '154809', '18'), +('13', '95', '8', '111332', '177287', '18'), +('13', '95', '8', '111329', '176278', '18'), +('13', '95', '8', '111331', '172659', '18'), +('13', '95', '8', '111031', '155536', '18'), +('13', '95', '6', '111323', '177146', '18'), +('13', '95', '6', '111326', '175694', '18'), +('13', '95', '6', '111325', '175668', '18'), +('13', '95', '6', '111022', '155296', '18'), +('13', '95', '17', '56043', '117730', '18'), +('13', '95', '17', '56084', '114114', '18'), +('13', '95', '17', '104427', '99696', '18'), +('13', '95', '17', '54854', '75095', '18'), +('13', '95', '7', '128648', '231884', '18'), +('13', '95', '7', '56080', '109997', '18'), +('13', '95', '7', '56040', '109274', '18'), +('13', '95', '7', '104425', '95479', '18'), +('13', '95', '9', '67098', '179923', '18'), +('13', '95', '9', '56070', '106360', '18'), +('13', '95', '9', '56031', '106269', '18'), +('13', '95', '9', '62984', '106096', '18'), +('13', '95', '15', '111349', '179120', '18'), +('13', '95', '15', '111344', '177407', '18'), +('13', '95', '15', '111340', '177013', '18'), +('13', '95', '15', '111346', '176731', '18'), +('13', '95', '20', '128733', '227164', '18'), +('13', '95', '20', '111356', '177270', '18'), +('13', '95', '20', '111352', '176358', '18'), +('13', '95', '20', '111351', '173812', '18'), +('13', '95', '12', '56035', '108342', '18'), +('13', '95', '12', '56074', '107106', '18'), +('13', '95', '12', '104422', '93306', '18'), +('13', '95', '12', '49656', '70132', '18'), +('13', '95', '18', '56041', '114188', '18'), +('13', '95', '18', '62986', '112247', '18'), +('13', '95', '18', '104426', '96995', '18'), +('13', '95', '18', '54851', '71449', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '95', '19', '81763', '110712', '18'), +('13', '95', '19', '62990', '110705', '18'), +('13', '95', '19', '56075', '109942', '18'), +('13', '95', '19', '56037', '109932', '18'), +('13', '95', '13', '111521', '183059', '18'), +('13', '95', '13', '111524', '173703', '18'), +('13', '95', '13', '111519', '173680', '18'), +('13', '95', '13', '111221', '162211', '18'), +('13', '95', '14', '111537', '177296', '18'), +('13', '95', '14', '111535', '175065', '18'), +('13', '95', '14', '111237', '155445', '18'), +('13', '95', '14', '111235', '153314', '18'), +('13', '95', '11', '111335', '176311', '18'), +('13', '95', '11', '111337', '176241', '18'), +('13', '95', '11', '111338', '172704', '18'), +('13', '95', '11', '111034', '154560', '18'), +('13', '96', '22', '12425', '0', '18'), +('13', '96', '22', '21807', '0', '18'), +('13', '96', '22', '39342', '0', '18'), +('13', '96', '22', '23597', '0', '18'), +('13', '96', '1', '128691', '229808', '18'), +('13', '96', '1', '111311', '178823', '18'), +('13', '96', '1', '111307', '176694', '18'), +('13', '96', '1', '111306', '176509', '18'), +('13', '96', '2', '62985', '109866', '18'), +('13', '96', '2', '94056', '109761', '18'), +('13', '96', '2', '104424', '96024', '18'), +('13', '96', '2', '54845', '71051', '18'), +('13', '96', '3', '111314', '177179', '18'), +('13', '96', '3', '111316', '175429', '18'), +('13', '96', '3', '111315', '174545', '18'), +('13', '96', '3', '111013', '155328', '18'), +('13', '96', '5', '111319', '176667', '18'), +('13', '96', '5', '111321', '175882', '18'), +('13', '96', '5', '111318', '174000', '18'), +('13', '96', '5', '111018', '154817', '18'), +('13', '96', '8', '111332', '177294', '18'), +('13', '96', '8', '111329', '176285', '18'), +('13', '96', '8', '111331', '172664', '18'), +('13', '96', '8', '111031', '155543', '18'), +('13', '96', '6', '111323', '177152', '18'), +('13', '96', '6', '111326', '175702', '18'), +('13', '96', '6', '111325', '175673', '18'), +('13', '96', '6', '111022', '155302', '18'), +('13', '96', '17', '56043', '117735', '18'), +('13', '96', '17', '56084', '114121', '18'), +('13', '96', '17', '104427', '99702', '18'), +('13', '96', '17', '54854', '75100', '18'), +('13', '96', '7', '128648', '231887', '18'), +('13', '96', '7', '56080', '110004', '18'), +('13', '96', '7', '56040', '109284', '18'), +('13', '96', '7', '104425', '95484', '18'), +('13', '96', '9', '67098', '179927', '18'), +('13', '96', '9', '56070', '106365', '18'), +('13', '96', '9', '56031', '106279', '18'), +('13', '96', '9', '62984', '106101', '18'), +('13', '96', '15', '111349', '179128', '18'), +('13', '96', '15', '111344', '177411', '18'), +('13', '96', '15', '111340', '177018', '18'), +('13', '96', '15', '111346', '176737', '18'), +('13', '96', '20', '128733', '227170', '18'), +('13', '96', '20', '111356', '177276', '18'), +('13', '96', '20', '111352', '176363', '18'), +('13', '96', '20', '111351', '173819', '18'), +('13', '96', '12', '56035', '108351', '18'), +('13', '96', '12', '56074', '107113', '18'), +('13', '96', '12', '104422', '93314', '18'), +('13', '96', '12', '49656', '70133', '18'), +('13', '96', '18', '56041', '114196', '18'), +('13', '96', '18', '62986', '112252', '18'), +('13', '96', '18', '104426', '96997', '18'), +('13', '96', '18', '54851', '71453', '18'), +('13', '96', '19', '81763', '110722', '18'), +('13', '96', '19', '62990', '110712', '18'), +('13', '96', '19', '56075', '109947', '18'), +('13', '96', '19', '56037', '109934', '18'), +('13', '96', '13', '111521', '183064', '18'), +('13', '96', '13', '111524', '173710', '18'), +('13', '96', '13', '111519', '173687', '18'), +('13', '96', '13', '111221', '162217', '18'), +('13', '96', '14', '111537', '177302', '18'), +('13', '96', '14', '111535', '175069', '18'), +('13', '96', '14', '111237', '155450', '18'), +('13', '96', '14', '111235', '153317', '18'), +('13', '96', '11', '111335', '176317', '18'), +('13', '96', '11', '111337', '176247', '18'), +('13', '96', '11', '111338', '172710', '18'), +('13', '96', '11', '111034', '154566', '18'), +('13', '97', '22', '12425', '0', '18'), +('13', '97', '22', '21807', '0', '18'), +('13', '97', '22', '39342', '0', '18'), +('13', '97', '22', '23597', '0', '18'), +('13', '97', '1', '128691', '229815', '18'), +('13', '97', '1', '111311', '178827', '18'), +('13', '97', '1', '111307', '176702', '18'), +('13', '97', '1', '111306', '176515', '18'), +('13', '97', '2', '62985', '109870', '18'), +('13', '97', '2', '94056', '109764', '18'), +('13', '97', '2', '104424', '96032', '18'), +('13', '97', '2', '54845', '71057', '18'), +('13', '97', '3', '111314', '177185', '18'), +('13', '97', '3', '111316', '175435', '18'), +('13', '97', '3', '111315', '174551', '18'), +('13', '97', '3', '111013', '155335', '18'), +('13', '97', '5', '111319', '176674', '18'), +('13', '97', '5', '111321', '175887', '18'), +('13', '97', '5', '111318', '174007', '18'), +('13', '97', '5', '111018', '154824', '18'), +('13', '97', '8', '111332', '177300', '18'), +('13', '97', '8', '111329', '176293', '18'), +('13', '97', '8', '111331', '172670', '18'), +('13', '97', '8', '111031', '155550', '18'), +('13', '97', '6', '111323', '177158', '18'), +('13', '97', '6', '111326', '175710', '18'), +('13', '97', '6', '111325', '175677', '18'), +('13', '97', '6', '111022', '155307', '18'), +('13', '97', '17', '56043', '117741', '18'), +('13', '97', '17', '56084', '114127', '18'), +('13', '97', '17', '104427', '99708', '18'), +('13', '97', '17', '54854', '75105', '18'), +('13', '97', '7', '128648', '231891', '18'), +('13', '97', '7', '56080', '110012', '18'), +('13', '97', '7', '56040', '109294', '18'), +('13', '97', '7', '104425', '95490', '18'), +('13', '97', '9', '67098', '179931', '18'), +('13', '97', '9', '56070', '106370', '18'), +('13', '97', '9', '56031', '106289', '18'), +('13', '97', '9', '62984', '106106', '18'), +('13', '97', '15', '111349', '179136', '18'), +('13', '97', '15', '111344', '177416', '18'), +('13', '97', '15', '111340', '177024', '18'), +('13', '97', '15', '111346', '176743', '18'), +('13', '97', '20', '128733', '227176', '18'), +('13', '97', '20', '111356', '177282', '18'), +('13', '97', '20', '111352', '176368', '18'), +('13', '97', '20', '111351', '173827', '18'), +('13', '97', '12', '56035', '108361', '18'), +('13', '97', '12', '56074', '107119', '18'), +('13', '97', '12', '104422', '93322', '18'), +('13', '97', '12', '49656', '70134', '18'), +('13', '97', '18', '56041', '114205', '18'), +('13', '97', '18', '62986', '112257', '18'), +('13', '97', '18', '104426', '96999', '18'), +('13', '97', '18', '54851', '71457', '18'), +('13', '97', '19', '81763', '110732', '18'), +('13', '97', '19', '62990', '110720', '18'), +('13', '97', '19', '56075', '109951', '18'), +('13', '97', '19', '56037', '109937', '18'), +('13', '97', '13', '111521', '183069', '18'), +('13', '97', '13', '111524', '173716', '18'), +('13', '97', '13', '111519', '173695', '18'), +('13', '97', '13', '111221', '162223', '18'), +('13', '97', '14', '111537', '177307', '18'), +('13', '97', '14', '111535', '175073', '18'), +('13', '97', '14', '111237', '155455', '18'), +('13', '97', '14', '111235', '153321', '18'), +('13', '97', '11', '111335', '176323', '18'), +('13', '97', '11', '111337', '176253', '18'), +('13', '97', '11', '111338', '172716', '18'), +('13', '97', '11', '111034', '154572', '18'), +('13', '98', '22', '12425', '0', '18'), +('13', '98', '22', '21807', '0', '18'), +('13', '98', '22', '39342', '0', '18'), +('13', '98', '22', '23597', '0', '18'), +('13', '98', '1', '128691', '229821', '18'), +('13', '98', '1', '111311', '178832', '18'), +('13', '98', '1', '111307', '176710', '18'), +('13', '98', '1', '111306', '176520', '18'), +('13', '98', '2', '62985', '109874', '18'), +('13', '98', '2', '94056', '109768', '18'), +('13', '98', '2', '104424', '96040', '18'), +('13', '98', '2', '54845', '71063', '18'), +('13', '98', '3', '111314', '177192', '18'), +('13', '98', '3', '111316', '175441', '18'), +('13', '98', '3', '111315', '174557', '18'), +('13', '98', '3', '111013', '155341', '18'), +('13', '98', '5', '111319', '176681', '18'), +('13', '98', '5', '111321', '175892', '18'), +('13', '98', '5', '111318', '174015', '18'), +('13', '98', '5', '111018', '154831', '18'), +('13', '98', '8', '111332', '177307', '18'), +('13', '98', '8', '111329', '176300', '18'), +('13', '98', '8', '111331', '172675', '18'), +('13', '98', '8', '111031', '155556', '18'), +('13', '98', '6', '111323', '177164', '18'), +('13', '98', '6', '111326', '175717', '18'), +('13', '98', '6', '111325', '175682', '18'), +('13', '98', '6', '111022', '155313', '18'), +('13', '98', '17', '56043', '117746', '18'), +('13', '98', '17', '56084', '114133', '18'), +('13', '98', '17', '104427', '99714', '18'), +('13', '98', '17', '54854', '75110', '18'), +('13', '98', '7', '128648', '231895', '18'), +('13', '98', '7', '56080', '110019', '18'), +('13', '98', '7', '56040', '109304', '18'), +('13', '98', '7', '104425', '95495', '18'), +('13', '98', '9', '67098', '179936', '18'), +('13', '98', '9', '56070', '106375', '18'), +('13', '98', '9', '56031', '106299', '18'), +('13', '98', '9', '62984', '106111', '18'), +('13', '98', '15', '111349', '179144', '18'), +('13', '98', '15', '111344', '177421', '18'), +('13', '98', '15', '111340', '177029', '18'), +('13', '98', '15', '111346', '176749', '18'), +('13', '98', '20', '128733', '227182', '18'), +('13', '98', '20', '111356', '177288', '18'), +('13', '98', '20', '111352', '176374', '18'), +('13', '98', '20', '111351', '173834', '18'), +('13', '98', '12', '56035', '108370', '18'), +('13', '98', '12', '56074', '107125', '18'), +('13', '98', '12', '104422', '93330', '18'), +('13', '98', '12', '49656', '70134', '18'), +('13', '98', '18', '56041', '114213', '18'), +('13', '98', '18', '62986', '112262', '18'), +('13', '98', '18', '104426', '97001', '18'), +('13', '98', '18', '54851', '71461', '18'), +('13', '98', '19', '81763', '110742', '18'), +('13', '98', '19', '62990', '110727', '18'), +('13', '98', '19', '56075', '109956', '18'), +('13', '98', '19', '56037', '109940', '18'), +('13', '98', '13', '111521', '183075', '18'), +('13', '98', '13', '111524', '173723', '18'), +('13', '98', '13', '111519', '173702', '18'), +('13', '98', '13', '111221', '162229', '18'), +('13', '98', '14', '111537', '177312', '18'), +('13', '98', '14', '111535', '175077', '18'), +('13', '98', '14', '111237', '155460', '18'), +('13', '98', '14', '111235', '153325', '18'), +('13', '98', '11', '111335', '176329', '18'), +('13', '98', '11', '111337', '176259', '18'), +('13', '98', '11', '111338', '172722', '18'), +('13', '98', '11', '111034', '154578', '18'), +('13', '99', '22', '12425', '0', '18'), +('13', '99', '22', '21807', '0', '18'), +('13', '99', '22', '39342', '0', '18'), +('13', '99', '22', '23597', '0', '18'), +('13', '99', '1', '128691', '229828', '18'), +('13', '99', '1', '111311', '178836', '18'), +('13', '99', '1', '111307', '176718', '18'), +('13', '99', '1', '111306', '176526', '18'), +('13', '99', '2', '62985', '109878', '18'), +('13', '99', '2', '94056', '109771', '18'), +('13', '99', '2', '104424', '96048', '18'), +('13', '99', '2', '54845', '71069', '18'), +('13', '99', '3', '111314', '177198', '18'), +('13', '99', '3', '111316', '175448', '18'), +('13', '99', '3', '111315', '174564', '18'), +('13', '99', '3', '111013', '155348', '18'), +('13', '99', '5', '111319', '176689', '18'), +('13', '99', '5', '111321', '175897', '18'), +('13', '99', '5', '111318', '174022', '18'), +('13', '99', '5', '111018', '154838', '18'), +('13', '99', '8', '111332', '177314', '18'), +('13', '99', '8', '111329', '176308', '18'), +('13', '99', '8', '111331', '172680', '18'), +('13', '99', '8', '111031', '155563', '18'), +('13', '99', '6', '111323', '177169', '18'), +('13', '99', '6', '111326', '175725', '18'), +('13', '99', '6', '111325', '175687', '18'), +('13', '99', '6', '111022', '155319', '18'), +('13', '99', '17', '56043', '117752', '18'), +('13', '99', '17', '56084', '114139', '18'), +('13', '99', '17', '104427', '99720', '18'), +('13', '99', '17', '54854', '75114', '18'), +('13', '99', '7', '128648', '231899', '18'), +('13', '99', '7', '56080', '110026', '18'), +('13', '99', '7', '56040', '109314', '18'), +('13', '99', '7', '104425', '95501', '18'), +('13', '99', '9', '67098', '179940', '18'), +('13', '99', '9', '56070', '106381', '18'), +('13', '99', '9', '56031', '106309', '18'), +('13', '99', '9', '62984', '106116', '18'), +('13', '99', '15', '111349', '179152', '18'), +('13', '99', '15', '111344', '177425', '18'), +('13', '99', '15', '111340', '177035', '18'), +('13', '99', '15', '111346', '176755', '18'), +('13', '99', '20', '128733', '227188', '18'), +('13', '99', '20', '111356', '177294', '18'), +('13', '99', '20', '111352', '176379', '18'), +('13', '99', '20', '111351', '173841', '18'), +('13', '99', '12', '56035', '108379', '18'), +('13', '99', '12', '56074', '107131', '18'), +('13', '99', '12', '104422', '93338', '18'), +('13', '99', '12', '49656', '70135', '18'), +('13', '99', '18', '56041', '114222', '18'), +('13', '99', '18', '62986', '112267', '18'), +('13', '99', '18', '104426', '97003', '18'), +('13', '99', '18', '54851', '71465', '18'), +('13', '99', '19', '81763', '110752', '18'), +('13', '99', '19', '62990', '110735', '18'), +('13', '99', '19', '56075', '109961', '18'), +('13', '99', '19', '56037', '109942', '18'), +('13', '99', '13', '111521', '183080', '18'), +('13', '99', '13', '111524', '173729', '18'), +('13', '99', '13', '111519', '173710', '18'), +('13', '99', '13', '111221', '162235', '18'), +('13', '99', '14', '111537', '177317', '18'), +('13', '99', '14', '111535', '175081', '18'), +('13', '99', '14', '111237', '155465', '18'), +('13', '99', '14', '111235', '153329', '18'), +('13', '99', '11', '111335', '176334', '18'), +('13', '99', '11', '111337', '176265', '18'), +('13', '99', '11', '111338', '172729', '18'), +('13', '99', '11', '111034', '154584', '18'), +('13', '100', '22', '12425', '0', '20'), +('13', '100', '22', '21807', '0', '20'), +('13', '100', '22', '39342', '0', '20'), +('13', '100', '22', '23597', '0', '20'), +('13', '100', '1', '98769', '284332', '20'), +('13', '100', '1', '128691', '229834', '20'), +('13', '100', '1', '111311', '178840', '20'), +('13', '100', '1', '111307', '176727', '20'), +('13', '100', '2', '62985', '109882', '20'), +('13', '100', '2', '94056', '109774', '20'), +('13', '100', '2', '104424', '96056', '20'), +('13', '100', '2', '54845', '71075', '20'), +('13', '100', '3', '111314', '177205', '20'), +('13', '100', '3', '111316', '175454', '20'), +('13', '100', '3', '111315', '174570', '20'), +('13', '100', '3', '111013', '155354', '20'), +('13', '100', '5', '111319', '176696', '20'), +('13', '100', '5', '111321', '175902', '20'), +('13', '100', '5', '111318', '174030', '20'), +('13', '100', '5', '111018', '154845', '20'), +('13', '100', '8', '111332', '177320', '20'), +('13', '100', '8', '111329', '176315', '20'), +('13', '100', '8', '111331', '172686', '20'), +('13', '100', '8', '111031', '155570', '20'), +('13', '100', '6', '111323', '177175', '20'), +('13', '100', '6', '111326', '175733', '20'), +('13', '100', '6', '111325', '175691', '20'), +('13', '100', '6', '111022', '155325', '20'), +('13', '100', '17', '94535', '312834', '20'), +('13', '100', '17', '56043', '117758', '20'), +('13', '100', '17', '56084', '114145', '20'), +('13', '100', '17', '104427', '99727', '20'), +('13', '100', '7', '128648', '231902', '20'), +('13', '100', '7', '56080', '110033', '20'), +('13', '100', '7', '56040', '109324', '20'), +('13', '100', '7', '104425', '95506', '20'), +('13', '100', '9', '67098', '179944', '20'), +('13', '100', '9', '56070', '106386', '20'), +('13', '100', '9', '56031', '106319', '20'), +('13', '100', '9', '62984', '106120', '20'), +('13', '100', '15', '111349', '179161', '20'), +('13', '100', '15', '111344', '177430', '20'), +('13', '100', '15', '111340', '177040', '20'), +('13', '100', '15', '111346', '176761', '20'), +('13', '100', '20', '128733', '227194', '20'), +('13', '100', '20', '111356', '177301', '20'), +('13', '100', '20', '111352', '176384', '20'), +('13', '100', '20', '111351', '173849', '20'), +('13', '100', '12', '56035', '108389', '20'), +('13', '100', '12', '56074', '107137', '20'), +('13', '100', '12', '104422', '93346', '20'), +('13', '100', '12', '49656', '70136', '20'), +('13', '100', '18', '56041', '114230', '20'), +('13', '100', '18', '62986', '112272', '20'), +('13', '100', '18', '104426', '97005', '20'), +('13', '100', '18', '54851', '71470', '20'), +('13', '100', '19', '81763', '110762', '20'), +('13', '100', '19', '62990', '110742', '20'), +('13', '100', '19', '56075', '109965', '20'), +('13', '100', '19', '56037', '109945', '20'), +('13', '100', '13', '111521', '183086', '20'), +('13', '100', '13', '111524', '173737', '20'), +('13', '100', '13', '111519', '173717', '20'), +('13', '100', '13', '111221', '162241', '20'), +('13', '100', '14', '111537', '177322', '20'), +('13', '100', '14', '111535', '175085', '20'), +('13', '100', '14', '111237', '155471', '20'), +('13', '100', '14', '111235', '153333', '20'), +('13', '100', '11', '133816', '229751', '20'), +('13', '100', '11', '111335', '176340', '20'), +('13', '100', '11', '111337', '176271', '20'), +('13', '100', '11', '111338', '172735', '20'), +('13', '100', '22', '12425', '0', '19'), +('13', '100', '22', '21807', '0', '19'), +('13', '100', '22', '39342', '0', '19'), +('13', '100', '22', '23597', '0', '19'), +('13', '100', '1', '98769', '284332', '19'), +('13', '100', '1', '128691', '229834', '19'), +('13', '100', '1', '111311', '178840', '19'), +('13', '100', '1', '111307', '176727', '19'), +('13', '100', '2', '62985', '109882', '19'), +('13', '100', '2', '94056', '109774', '19'), +('13', '100', '2', '104424', '96056', '19'), +('13', '100', '2', '54845', '71075', '19'), +('13', '100', '3', '111314', '177205', '19'), +('13', '100', '3', '111316', '175454', '19'), +('13', '100', '3', '111315', '174570', '19'), +('13', '100', '3', '111013', '155354', '19'), +('13', '100', '5', '111319', '176696', '19'), +('13', '100', '5', '111321', '175902', '19'), +('13', '100', '5', '111318', '174030', '19'), +('13', '100', '5', '111018', '154845', '19'), +('13', '100', '8', '111332', '177320', '19'), +('13', '100', '8', '111329', '176315', '19'), +('13', '100', '8', '111331', '172686', '19'), +('13', '100', '8', '111031', '155570', '19'), +('13', '100', '6', '111323', '177175', '19'), +('13', '100', '6', '111326', '175733', '19'), +('13', '100', '6', '111325', '175691', '19'), +('13', '100', '6', '111022', '155325', '19'), +('13', '100', '17', '56043', '117758', '19'), +('13', '100', '17', '56084', '114145', '19'), +('13', '100', '17', '104427', '99727', '19'), +('13', '100', '17', '54854', '75119', '19'), +('13', '100', '7', '128648', '231902', '19'), +('13', '100', '7', '56080', '110033', '19'), +('13', '100', '7', '56040', '109324', '19'), +('13', '100', '7', '104425', '95506', '19'), +('13', '100', '9', '67098', '179944', '19'), +('13', '100', '9', '56070', '106386', '19'), +('13', '100', '9', '56031', '106319', '19'), +('13', '100', '9', '62984', '106120', '19'), +('13', '100', '15', '111349', '179161', '19'), +('13', '100', '15', '111344', '177430', '19'), +('13', '100', '15', '111340', '177040', '19'), +('13', '100', '15', '111346', '176761', '19'), +('13', '100', '20', '128733', '227194', '19'), +('13', '100', '20', '111356', '177301', '19'), +('13', '100', '20', '111352', '176384', '19'), +('13', '100', '20', '111351', '173849', '19'), +('13', '100', '12', '56035', '108389', '19'), +('13', '100', '12', '56074', '107137', '19'), +('13', '100', '12', '104422', '93346', '19'), +('13', '100', '12', '49656', '70136', '19'), +('13', '100', '18', '56041', '114230', '19'), +('13', '100', '18', '62986', '112272', '19'), +('13', '100', '18', '104426', '97005', '19'), +('13', '100', '18', '54851', '71470', '19'), +('13', '100', '19', '81763', '110762', '19'), +('13', '100', '19', '62990', '110742', '19'), +('13', '100', '19', '56075', '109965', '19'), +('13', '100', '19', '56037', '109945', '19'), +('13', '100', '13', '111521', '183085', '19'), +('13', '100', '13', '111524', '173736', '19'), +('13', '100', '13', '111519', '173717', '19'), +('13', '100', '13', '111221', '162241', '19'), +('13', '100', '14', '111537', '177322', '19'), +('13', '100', '14', '111535', '175085', '19'), +('13', '100', '14', '111237', '155471', '19'), +('13', '100', '14', '111235', '153333', '19'), +('13', '100', '11', '133816', '229751', '19'), +('13', '100', '11', '111335', '176340', '19'), +('13', '100', '11', '111337', '176271', '19'), +('13', '100', '11', '111338', '172735', '19'), +('13', '101', '22', '12425', '0', '20'), +('13', '101', '22', '21807', '0', '20'), +('13', '101', '22', '39342', '0', '20'), +('13', '101', '22', '23597', '0', '20'), +('13', '101', '1', '98769', '284336', '20'), +('13', '101', '1', '128691', '229840', '20'), +('13', '101', '1', '111311', '178844', '20'), +('13', '101', '1', '111307', '176735', '20'), +('13', '101', '2', '62985', '109886', '20'), +('13', '101', '2', '94056', '109778', '20'), +('13', '101', '2', '104424', '96064', '20'), +('13', '101', '2', '54845', '71081', '20'), +('13', '101', '3', '111314', '177212', '20'), +('13', '101', '3', '111316', '175460', '20'), +('13', '101', '3', '111315', '174576', '20'), +('13', '101', '3', '111013', '155361', '20'), +('13', '101', '5', '111319', '176703', '20'), +('13', '101', '5', '111321', '175907', '20'), +('13', '101', '5', '111318', '174037', '20'), +('13', '101', '5', '111018', '154852', '20'), +('13', '101', '8', '111332', '177327', '20'), +('13', '101', '8', '111329', '176323', '20'), +('13', '101', '8', '111331', '172691', '20'), +('13', '101', '8', '111031', '155577', '20'), +('13', '101', '6', '111323', '177181', '20'), +('13', '101', '6', '111326', '175740', '20'), +('13', '101', '6', '111325', '175696', '20'), +('13', '101', '6', '111022', '155330', '20'), +('13', '101', '17', '94535', '312843', '20'), +('13', '101', '17', '56043', '117763', '20'), +('13', '101', '17', '56084', '114151', '20'), +('13', '101', '17', '104427', '99733', '20'), +('13', '101', '7', '128648', '231906', '20'), +('13', '101', '7', '56080', '110040', '20'), +('13', '101', '7', '56040', '109334', '20'), +('13', '101', '7', '104425', '95512', '20'), +('13', '101', '9', '67098', '179949', '20'), +('13', '101', '9', '56070', '106391', '20'), +('13', '101', '9', '56031', '106329', '20'), +('13', '101', '9', '62984', '106125', '20'), +('13', '101', '15', '111349', '179169', '20'), +('13', '101', '15', '111344', '177435', '20'), +('13', '101', '15', '111340', '177046', '20'), +('13', '101', '15', '111346', '176766', '20'), +('13', '101', '20', '128733', '227199', '20'), +('13', '101', '20', '111356', '177307', '20'), +('13', '101', '20', '111352', '176390', '20'), +('13', '101', '20', '111351', '173856', '20'), +('13', '101', '12', '56035', '108398', '20'), +('13', '101', '12', '56074', '107143', '20'), +('13', '101', '12', '104422', '93354', '20'), +('13', '101', '12', '49656', '70137', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '101', '18', '56041', '114239', '20'), +('13', '101', '18', '62986', '112277', '20'), +('13', '101', '18', '104426', '97007', '20'), +('13', '101', '18', '54851', '71474', '20'), +('13', '101', '19', '81763', '110771', '20'), +('13', '101', '19', '62990', '110750', '20'), +('13', '101', '19', '56075', '109970', '20'), +('13', '101', '19', '56037', '109947', '20'), +('13', '101', '13', '111521', '183091', '20'), +('13', '101', '13', '111524', '173743', '20'), +('13', '101', '13', '111519', '173725', '20'), +('13', '101', '13', '111221', '162247', '20'), +('13', '101', '14', '111537', '177327', '20'), +('13', '101', '14', '111535', '175089', '20'), +('13', '101', '14', '111237', '155476', '20'), +('13', '101', '14', '111235', '153337', '20'), +('13', '101', '11', '133816', '229755', '20'), +('13', '101', '11', '111335', '176346', '20'), +('13', '101', '11', '111337', '176277', '20'), +('13', '101', '11', '111338', '172741', '20'), +('13', '102', '22', '12425', '0', '20'), +('13', '102', '22', '21807', '0', '20'), +('13', '102', '22', '39342', '0', '20'), +('13', '102', '22', '23597', '0', '20'), +('13', '102', '1', '98769', '284340', '20'), +('13', '102', '1', '128691', '229847', '20'), +('13', '102', '1', '111311', '178848', '20'), +('13', '102', '1', '111307', '176743', '20'), +('13', '102', '2', '62985', '109890', '20'), +('13', '102', '2', '94056', '109781', '20'), +('13', '102', '2', '104424', '96072', '20'), +('13', '102', '2', '54845', '71086', '20'), +('13', '102', '3', '111314', '177218', '20'), +('13', '102', '3', '111316', '175466', '20'), +('13', '102', '3', '111315', '174582', '20'), +('13', '102', '3', '111013', '155367', '20'), +('13', '102', '5', '111319', '176710', '20'), +('13', '102', '5', '111321', '175912', '20'), +('13', '102', '5', '111318', '174045', '20'), +('13', '102', '5', '111018', '154860', '20'), +('13', '102', '8', '111332', '177334', '20'), +('13', '102', '8', '111329', '176330', '20'), +('13', '102', '8', '111331', '172696', '20'), +('13', '102', '8', '111031', '155583', '20'), +('13', '102', '6', '111323', '177187', '20'), +('13', '102', '6', '111326', '175748', '20'), +('13', '102', '6', '111325', '175701', '20'), +('13', '102', '6', '111022', '155336', '20'), +('13', '102', '17', '94535', '312851', '20'), +('13', '102', '17', '56043', '117769', '20'), +('13', '102', '17', '56084', '114158', '20'), +('13', '102', '17', '104427', '99739', '20'), +('13', '102', '7', '128648', '231910', '20'), +('13', '102', '7', '56080', '110047', '20'), +('13', '102', '7', '56040', '109344', '20'), +('13', '102', '7', '104425', '95517', '20'), +('13', '102', '9', '67098', '179953', '20'), +('13', '102', '9', '56070', '106396', '20'), +('13', '102', '9', '56031', '106340', '20'), +('13', '102', '9', '62984', '106130', '20'), +('13', '102', '15', '111349', '179177', '20'), +('13', '102', '15', '111344', '177440', '20'), +('13', '102', '15', '111340', '177051', '20'), +('13', '102', '15', '111346', '176772', '20'), +('13', '102', '20', '128733', '227205', '20'), +('13', '102', '20', '111356', '177313', '20'), +('13', '102', '20', '111352', '176395', '20'), +('13', '102', '20', '111351', '173864', '20'), +('13', '102', '12', '56035', '108408', '20'), +('13', '102', '12', '56074', '107149', '20'), +('13', '102', '12', '104422', '93361', '20'), +('13', '102', '12', '49656', '70138', '20'), +('13', '102', '18', '56041', '114247', '20'), +('13', '102', '18', '62986', '112282', '20'), +('13', '102', '18', '104426', '97009', '20'), +('13', '102', '18', '54851', '71478', '20'), +('13', '102', '19', '81763', '110781', '20'), +('13', '102', '19', '62990', '110757', '20'), +('13', '102', '19', '56075', '109975', '20'), +('13', '102', '19', '56037', '109950', '20'), +('13', '102', '13', '111521', '183097', '20'), +('13', '102', '13', '111524', '173750', '20'), +('13', '102', '13', '111519', '173732', '20'), +('13', '102', '13', '111221', '162253', '20'), +('13', '102', '14', '111537', '177332', '20'), +('13', '102', '14', '111535', '175093', '20'), +('13', '102', '14', '111237', '155481', '20'), +('13', '102', '14', '111235', '153341', '20'), +('13', '102', '11', '133816', '229759', '20'), +('13', '102', '11', '111335', '176352', '20'), +('13', '102', '11', '111337', '176283', '20'), +('13', '102', '11', '111338', '172747', '20'), +('13', '103', '22', '12425', '0', '20'), +('13', '103', '22', '21807', '0', '20'), +('13', '103', '22', '39342', '0', '20'), +('13', '103', '22', '23597', '0', '20'), +('13', '103', '1', '98769', '284345', '20'), +('13', '103', '1', '128691', '229853', '20'), +('13', '103', '1', '111311', '178852', '20'), +('13', '103', '1', '111307', '176751', '20'), +('13', '103', '2', '62985', '109894', '20'), +('13', '103', '2', '94056', '109784', '20'), +('13', '103', '2', '104424', '96080', '20'), +('13', '103', '2', '54845', '71092', '20'), +('13', '103', '3', '111314', '177225', '20'), +('13', '103', '3', '111316', '175472', '20'), +('13', '103', '3', '111315', '174588', '20'), +('13', '103', '3', '111013', '155374', '20'), +('13', '103', '5', '111319', '176717', '20'), +('13', '103', '5', '111321', '175918', '20'), +('13', '103', '5', '111318', '174052', '20'), +('13', '103', '5', '111018', '154867', '20'), +('13', '103', '8', '111332', '177341', '20'), +('13', '103', '8', '111329', '176338', '20'), +('13', '103', '8', '111331', '172702', '20'), +('13', '103', '8', '111031', '155590', '20'), +('13', '103', '6', '111323', '177192', '20'), +('13', '103', '6', '111326', '175756', '20'), +('13', '103', '6', '111325', '175706', '20'), +('13', '103', '6', '111022', '155342', '20'), +('13', '103', '17', '94535', '312859', '20'), +('13', '103', '17', '56043', '117774', '20'), +('13', '103', '17', '56084', '114164', '20'), +('13', '103', '17', '104427', '99745', '20'), +('13', '103', '7', '128648', '231914', '20'), +('13', '103', '7', '56080', '110054', '20'), +('13', '103', '7', '56040', '109355', '20'), +('13', '103', '7', '104425', '95523', '20'), +('13', '103', '9', '67098', '179957', '20'), +('13', '103', '9', '56070', '106402', '20'), +('13', '103', '9', '56031', '106350', '20'), +('13', '103', '9', '62984', '106135', '20'), +('13', '103', '15', '111349', '179185', '20'), +('13', '103', '15', '111344', '177444', '20'), +('13', '103', '15', '111340', '177057', '20'), +('13', '103', '15', '111346', '176778', '20'), +('13', '103', '20', '128733', '227211', '20'), +('13', '103', '20', '111356', '177319', '20'), +('13', '103', '20', '111352', '176400', '20'), +('13', '103', '20', '111351', '173871', '20'), +('13', '103', '12', '56035', '108417', '20'), +('13', '103', '12', '56074', '107155', '20'), +('13', '103', '12', '104422', '93369', '20'), +('13', '103', '12', '49656', '70139', '20'), +('13', '103', '18', '56041', '114256', '20'), +('13', '103', '18', '62986', '112287', '20'), +('13', '103', '18', '104426', '97011', '20'), +('13', '103', '18', '54851', '71482', '20'), +('13', '103', '19', '81763', '110791', '20'), +('13', '103', '19', '62990', '110765', '20'), +('13', '103', '19', '56075', '109980', '20'), +('13', '103', '19', '56037', '109952', '20'), +('13', '103', '13', '111521', '183102', '20'), +('13', '103', '13', '111524', '173756', '20'), +('13', '103', '13', '111519', '173740', '20'), +('13', '103', '13', '111221', '162259', '20'), +('13', '103', '14', '111537', '177338', '20'), +('13', '103', '14', '111535', '175097', '20'), +('13', '103', '14', '111237', '155486', '20'), +('13', '103', '14', '111235', '153345', '20'), +('13', '103', '11', '133816', '229763', '20'), +('13', '103', '11', '111335', '176358', '20'), +('13', '103', '11', '111337', '176290', '20'), +('13', '103', '11', '111338', '172753', '20'), +('13', '104', '22', '12425', '0', '20'), +('13', '104', '22', '21807', '0', '20'), +('13', '104', '22', '39342', '0', '20'), +('13', '104', '22', '23597', '0', '20'), +('13', '104', '1', '98769', '284349', '20'), +('13', '104', '1', '128691', '229860', '20'), +('13', '104', '1', '111311', '178856', '20'), +('13', '104', '1', '111307', '176759', '20'), +('13', '104', '2', '62985', '109897', '20'), +('13', '104', '2', '94056', '109788', '20'), +('13', '104', '2', '104424', '96088', '20'), +('13', '104', '2', '54845', '71098', '20'), +('13', '104', '3', '111314', '177231', '20'), +('13', '104', '3', '111316', '175478', '20'), +('13', '104', '3', '111315', '174594', '20'), +('13', '104', '3', '111013', '155381', '20'), +('13', '104', '5', '111319', '176724', '20'), +('13', '104', '5', '111321', '175923', '20'), +('13', '104', '5', '111318', '174060', '20'), +('13', '104', '5', '111018', '154874', '20'), +('13', '104', '8', '111332', '177347', '20'), +('13', '104', '8', '111329', '176346', '20'), +('13', '104', '8', '111331', '172707', '20'), +('13', '104', '8', '111031', '155597', '20'), +('13', '104', '6', '111323', '177198', '20'), +('13', '104', '6', '111326', '175764', '20'), +('13', '104', '6', '111325', '175710', '20'), +('13', '104', '6', '111022', '155348', '20'), +('13', '104', '17', '94535', '312867', '20'), +('13', '104', '17', '56043', '117780', '20'), +('13', '104', '17', '56084', '114170', '20'), +('13', '104', '17', '104427', '99751', '20'), +('13', '104', '7', '128648', '231917', '20'), +('13', '104', '7', '56080', '110061', '20'), +('13', '104', '7', '56040', '109365', '20'), +('13', '104', '7', '104425', '95528', '20'), +('13', '104', '9', '67098', '179962', '20'), +('13', '104', '9', '56070', '106407', '20'), +('13', '104', '9', '56031', '106360', '20'), +('13', '104', '9', '62984', '106140', '20'), +('13', '104', '15', '111349', '179193', '20'), +('13', '104', '15', '111344', '177449', '20'), +('13', '104', '15', '111340', '177062', '20'), +('13', '104', '15', '111346', '176784', '20'), +('13', '104', '20', '128733', '227217', '20'), +('13', '104', '20', '111356', '177325', '20'), +('13', '104', '20', '111352', '176406', '20'), +('13', '104', '20', '111351', '173879', '20'), +('13', '104', '12', '56035', '108427', '20'), +('13', '104', '12', '56074', '107161', '20'), +('13', '104', '12', '104422', '93377', '20'), +('13', '104', '12', '49656', '70139', '20'), +('13', '104', '18', '56041', '114264', '20'), +('13', '104', '18', '62986', '112292', '20'), +('13', '104', '18', '104426', '97013', '20'), +('13', '104', '18', '54851', '71486', '20'), +('13', '104', '19', '81763', '110801', '20'), +('13', '104', '19', '62990', '110772', '20'), +('13', '104', '19', '56075', '109984', '20'), +('13', '104', '19', '56037', '109955', '20'), +('13', '104', '13', '111521', '183107', '20'), +('13', '104', '13', '111524', '173763', '20'), +('13', '104', '13', '111519', '173747', '20'), +('13', '104', '13', '111221', '162265', '20'), +('13', '104', '14', '111537', '177343', '20'), +('13', '104', '14', '111535', '175101', '20'), +('13', '104', '14', '111237', '155491', '20'), +('13', '104', '14', '111235', '153349', '20'), +('13', '104', '11', '133816', '229767', '20'), +('13', '104', '11', '111335', '176364', '20'), +('13', '104', '11', '111337', '176296', '20'), +('13', '104', '11', '111338', '172759', '20'), +('13', '105', '22', '12425', '0', '23'), +('13', '105', '22', '21807', '0', '23'), +('13', '105', '22', '39342', '0', '23'), +('13', '105', '22', '23597', '0', '23'), +('13', '105', '1', '98769', '284353', '23'), +('13', '105', '1', '128691', '229866', '23'), +('13', '105', '1', '111311', '178860', '23'), +('13', '105', '1', '111307', '176767', '23'), +('13', '105', '2', '62985', '109901', '23'), +('13', '105', '2', '94056', '109791', '23'), +('13', '105', '2', '104424', '96096', '23'), +('13', '105', '2', '54845', '71104', '23'), +('13', '105', '3', '111314', '177238', '23'), +('13', '105', '3', '111316', '175484', '23'), +('13', '105', '3', '111315', '174601', '23'), +('13', '105', '3', '111013', '155387', '23'), +('13', '105', '5', '111319', '176732', '23'), +('13', '105', '5', '111321', '175928', '23'), +('13', '105', '5', '111318', '174067', '23'), +('13', '105', '5', '111018', '154881', '23'), +('13', '105', '8', '111332', '177354', '23'), +('13', '105', '8', '111329', '176353', '23'), +('13', '105', '8', '111331', '172712', '23'), +('13', '105', '8', '111031', '155603', '23'), +('13', '105', '6', '111323', '177204', '23'), +('13', '105', '6', '111326', '175771', '23'), +('13', '105', '6', '111325', '175715', '23'), +('13', '105', '6', '111022', '155353', '23'), +('13', '105', '17', '94535', '312875', '23'), +('13', '105', '17', '56043', '117785', '23'), +('13', '105', '17', '56084', '114176', '23'), +('13', '105', '17', '104427', '99757', '23'), +('13', '105', '7', '128648', '231921', '23'), +('13', '105', '7', '56080', '110069', '23'), +('13', '105', '7', '56040', '109375', '23'), +('13', '105', '7', '104425', '95533', '23'), +('13', '105', '9', '67098', '179966', '23'), +('13', '105', '9', '56070', '106412', '23'), +('13', '105', '9', '56031', '106370', '23'), +('13', '105', '9', '62984', '106144', '23'), +('13', '105', '15', '111349', '179201', '23'), +('13', '105', '15', '111344', '177454', '23'), +('13', '105', '15', '111340', '177068', '23'), +('13', '105', '15', '111346', '176790', '23'), +('13', '105', '20', '128733', '227223', '23'), +('13', '105', '20', '111356', '177332', '23'), +('13', '105', '20', '111352', '176411', '23'), +('13', '105', '20', '111351', '173886', '23'), +('13', '105', '12', '56035', '108436', '23'), +('13', '105', '12', '56074', '107167', '23'), +('13', '105', '12', '104422', '93385', '23'), +('13', '105', '12', '49656', '70140', '23'), +('13', '105', '18', '56041', '114272', '23'), +('13', '105', '18', '62986', '112297', '23'), +('13', '105', '18', '104426', '97015', '23'), +('13', '105', '18', '54851', '71490', '23'), +('13', '105', '19', '81763', '110811', '23'), +('13', '105', '19', '62990', '110780', '23'), +('13', '105', '19', '56075', '109989', '23'), +('13', '105', '19', '56037', '109957', '23'), +('13', '105', '13', '111521', '183113', '23'), +('13', '105', '13', '111524', '173770', '23'), +('13', '105', '13', '111519', '173755', '23'), +('13', '105', '13', '111221', '162271', '23'), +('13', '105', '14', '111537', '177348', '23'), +('13', '105', '14', '111535', '175104', '23'), +('13', '105', '14', '111237', '155496', '23'), +('13', '105', '14', '111235', '153353', '23'), +('13', '105', '11', '133816', '229771', '23'), +('13', '105', '11', '111335', '176370', '23'), +('13', '105', '11', '111337', '176302', '23'), +('13', '105', '11', '111338', '172765', '23'), +('13', '105', '22', '12425', '0', '22'), +('13', '105', '22', '21807', '0', '22'), +('13', '105', '22', '39342', '0', '22'), +('13', '105', '22', '23597', '0', '22'), +('13', '105', '1', '98769', '284353', '22'), +('13', '105', '1', '128691', '229866', '22'), +('13', '105', '1', '111311', '178860', '22'), +('13', '105', '1', '111307', '176767', '22'), +('13', '105', '2', '62985', '109901', '22'), +('13', '105', '2', '94056', '109791', '22'), +('13', '105', '2', '104424', '96096', '22'), +('13', '105', '2', '54845', '71104', '22'), +('13', '105', '3', '111314', '177238', '22'), +('13', '105', '3', '111316', '175484', '22'), +('13', '105', '3', '111315', '174601', '22'), +('13', '105', '3', '111013', '155387', '22'), +('13', '105', '5', '111319', '176732', '22'), +('13', '105', '5', '111321', '175928', '22'), +('13', '105', '5', '111318', '174067', '22'), +('13', '105', '5', '111018', '154881', '22'), +('13', '105', '8', '111332', '177354', '22'), +('13', '105', '8', '111329', '176353', '22'), +('13', '105', '8', '111331', '172712', '22'), +('13', '105', '8', '111031', '155603', '22'), +('13', '105', '6', '111323', '177204', '22'), +('13', '105', '6', '111326', '175771', '22'), +('13', '105', '6', '111325', '175715', '22'), +('13', '105', '6', '111022', '155353', '22'), +('13', '105', '17', '94535', '312875', '22'), +('13', '105', '17', '56043', '117785', '22'), +('13', '105', '17', '56084', '114176', '22'), +('13', '105', '17', '104427', '99757', '22'), +('13', '105', '7', '128648', '231921', '22'), +('13', '105', '7', '56080', '110069', '22'), +('13', '105', '7', '56040', '109375', '22'), +('13', '105', '7', '104425', '95533', '22'), +('13', '105', '9', '67098', '179966', '22'), +('13', '105', '9', '56070', '106412', '22'), +('13', '105', '9', '56031', '106370', '22'), +('13', '105', '9', '62984', '106144', '22'), +('13', '105', '15', '111349', '179201', '22'), +('13', '105', '15', '111344', '177454', '22'), +('13', '105', '15', '111340', '177068', '22'), +('13', '105', '15', '111346', '176790', '22'), +('13', '105', '20', '128733', '227223', '22'), +('13', '105', '20', '111356', '177332', '22'), +('13', '105', '20', '111352', '176411', '22'), +('13', '105', '20', '111351', '173886', '22'), +('13', '105', '12', '56035', '108436', '22'), +('13', '105', '12', '56074', '107167', '22'), +('13', '105', '12', '104422', '93385', '22'), +('13', '105', '12', '49656', '70140', '22'), +('13', '105', '18', '56041', '114272', '22'), +('13', '105', '18', '62986', '112297', '22'), +('13', '105', '18', '104426', '97015', '22'), +('13', '105', '18', '54851', '71490', '22'), +('13', '105', '19', '81763', '110811', '22'), +('13', '105', '19', '62990', '110780', '22'), +('13', '105', '19', '56075', '109989', '22'), +('13', '105', '19', '56037', '109957', '22'), +('13', '105', '13', '111521', '183113', '22'), +('13', '105', '13', '111524', '173770', '22'), +('13', '105', '13', '111519', '173755', '22'), +('13', '105', '13', '111221', '162271', '22'), +('13', '105', '14', '111537', '177348', '22'), +('13', '105', '14', '111535', '175104', '22'), +('13', '105', '14', '111237', '155496', '22'), +('13', '105', '14', '111235', '153353', '22'), +('13', '105', '11', '133816', '229771', '22'), +('13', '105', '11', '111335', '176370', '22'), +('13', '105', '11', '111337', '176302', '22'), +('13', '105', '11', '111338', '172765', '22'), +('13', '105', '22', '12425', '0', '21'), +('13', '105', '22', '21807', '0', '21'), +('13', '105', '22', '39342', '0', '21'), +('13', '105', '22', '23597', '0', '21'), +('13', '105', '1', '98769', '284353', '21'), +('13', '105', '1', '128691', '229866', '21'), +('13', '105', '1', '111311', '178860', '21'), +('13', '105', '1', '111307', '176767', '21'), +('13', '105', '2', '62985', '109901', '21'), +('13', '105', '2', '94056', '109791', '21'), +('13', '105', '2', '104424', '96096', '21'), +('13', '105', '2', '54845', '71104', '21'), +('13', '105', '3', '111314', '177238', '21'), +('13', '105', '3', '111316', '175484', '21'), +('13', '105', '3', '111315', '174601', '21'), +('13', '105', '3', '111013', '155387', '21'), +('13', '105', '5', '111319', '176732', '21'), +('13', '105', '5', '111321', '175928', '21'), +('13', '105', '5', '111318', '174067', '21'), +('13', '105', '5', '111018', '154881', '21'), +('13', '105', '8', '111332', '177354', '21'), +('13', '105', '8', '111329', '176353', '21'), +('13', '105', '8', '111331', '172712', '21'), +('13', '105', '8', '111031', '155603', '21'), +('13', '105', '6', '111323', '177204', '21'), +('13', '105', '6', '111326', '175771', '21'), +('13', '105', '6', '111325', '175715', '21'), +('13', '105', '6', '111022', '155353', '21'), +('13', '105', '17', '94535', '312875', '21'), +('13', '105', '17', '56043', '117785', '21'), +('13', '105', '17', '56084', '114176', '21'), +('13', '105', '17', '104427', '99757', '21'), +('13', '105', '7', '128648', '231921', '21'), +('13', '105', '7', '56080', '110069', '21'), +('13', '105', '7', '56040', '109375', '21'), +('13', '105', '7', '104425', '95533', '21'), +('13', '105', '9', '67098', '179966', '21'), +('13', '105', '9', '56070', '106412', '21'), +('13', '105', '9', '56031', '106370', '21'), +('13', '105', '9', '62984', '106144', '21'), +('13', '105', '15', '111349', '179201', '21'), +('13', '105', '15', '111344', '177454', '21'), +('13', '105', '15', '111340', '177068', '21'), +('13', '105', '15', '111346', '176790', '21'), +('13', '105', '20', '128733', '227223', '21'), +('13', '105', '20', '111356', '177332', '21'), +('13', '105', '20', '111352', '176411', '21'), +('13', '105', '20', '111351', '173886', '21'), +('13', '105', '12', '56035', '108436', '21'), +('13', '105', '12', '56074', '107167', '21'), +('13', '105', '12', '104422', '93385', '21'), +('13', '105', '12', '49656', '70140', '21'), +('13', '105', '18', '56041', '114272', '21'), +('13', '105', '18', '62986', '112297', '21'), +('13', '105', '18', '104426', '97015', '21'), +('13', '105', '18', '54851', '71490', '21'), +('13', '105', '19', '81763', '110811', '21'), +('13', '105', '19', '62990', '110780', '21'), +('13', '105', '19', '56075', '109989', '21'), +('13', '105', '19', '56037', '109957', '21'), +('13', '105', '13', '111521', '183113', '21'), +('13', '105', '13', '111524', '173770', '21'), +('13', '105', '13', '111519', '173755', '21'), +('13', '105', '13', '111221', '162271', '21'), +('13', '105', '14', '111537', '177348', '21'), +('13', '105', '14', '111535', '175104', '21'), +('13', '105', '14', '111237', '155496', '21'), +('13', '105', '14', '111235', '153353', '21'), +('13', '105', '11', '133816', '229771', '21'), +('13', '105', '11', '111335', '176370', '21'), +('13', '105', '11', '111337', '176302', '21'), +('13', '105', '11', '111338', '172765', '21'), +('13', '106', '22', '12425', '0', '23'), +('13', '106', '22', '21807', '0', '23'), +('13', '106', '22', '39342', '0', '23'), +('13', '106', '22', '23597', '0', '23'), +('13', '106', '1', '98769', '284357', '23'), +('13', '106', '1', '128691', '229873', '23'), +('13', '106', '1', '111311', '178864', '23'), +('13', '106', '1', '111307', '176776', '23'), +('13', '106', '2', '62985', '109905', '23'), +('13', '106', '2', '94056', '109794', '23'), +('13', '106', '2', '104424', '96104', '23'), +('13', '106', '2', '54845', '71110', '23'), +('13', '106', '3', '111314', '177244', '23'), +('13', '106', '3', '111316', '175490', '23'), +('13', '106', '3', '111315', '174607', '23'), +('13', '106', '3', '111013', '155394', '23'), +('13', '106', '5', '111319', '176739', '23'), +('13', '106', '5', '111321', '175933', '23'), +('13', '106', '5', '111318', '174075', '23'), +('13', '106', '5', '111018', '154888', '23'), +('13', '106', '8', '111332', '177361', '23'), +('13', '106', '8', '111329', '176361', '23'), +('13', '106', '8', '111331', '172718', '23'), +('13', '106', '8', '111031', '155610', '23'), +('13', '106', '6', '111323', '177210', '23'), +('13', '106', '6', '111326', '175779', '23'), +('13', '106', '6', '111325', '175720', '23'), +('13', '106', '6', '111022', '155359', '23'), +('13', '106', '17', '94535', '312883', '23'), +('13', '106', '17', '56043', '117791', '23'), +('13', '106', '17', '56084', '114182', '23'), +('13', '106', '17', '104427', '99764', '23'), +('13', '106', '7', '128648', '231925', '23'), +('13', '106', '7', '56080', '110076', '23'), +('13', '106', '7', '56040', '109385', '23'), +('13', '106', '7', '104425', '95539', '23'), +('13', '106', '9', '67098', '179970', '23'), +('13', '106', '9', '56070', '106417', '23'), +('13', '106', '9', '56031', '106380', '23'), +('13', '106', '9', '62984', '106149', '23'), +('13', '106', '15', '111349', '179209', '23'), +('13', '106', '15', '111344', '177458', '23'), +('13', '106', '15', '111340', '177073', '23'), +('13', '106', '15', '111346', '176796', '23'), +('13', '106', '20', '128733', '227229', '23'), +('13', '106', '20', '111356', '177338', '23'), +('13', '106', '20', '111352', '176416', '23'), +('13', '106', '20', '111351', '173894', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '106', '12', '56035', '108446', '23'), +('13', '106', '12', '56074', '107173', '23'), +('13', '106', '12', '104422', '93393', '23'), +('13', '106', '12', '49656', '70141', '23'), +('13', '106', '18', '56041', '114281', '23'), +('13', '106', '18', '62986', '112302', '23'), +('13', '106', '18', '104426', '97017', '23'), +('13', '106', '18', '54851', '71494', '23'), +('13', '106', '19', '81763', '110821', '23'), +('13', '106', '19', '62990', '110787', '23'), +('13', '106', '19', '56075', '109994', '23'), +('13', '106', '19', '56037', '109960', '23'), +('13', '106', '13', '111521', '183118', '23'), +('13', '106', '13', '111524', '173776', '23'), +('13', '106', '13', '111519', '173762', '23'), +('13', '106', '13', '111221', '162277', '23'), +('13', '106', '14', '111537', '177353', '23'), +('13', '106', '14', '111535', '175108', '23'), +('13', '106', '14', '111237', '155501', '23'), +('13', '106', '14', '111235', '153357', '23'), +('13', '106', '11', '133816', '229775', '23'), +('13', '106', '11', '111335', '176376', '23'), +('13', '106', '11', '111337', '176308', '23'), +('13', '106', '11', '111338', '172772', '23'), +('13', '107', '22', '12425', '0', '23'), +('13', '107', '22', '21807', '0', '23'), +('13', '107', '22', '39342', '0', '23'), +('13', '107', '22', '23597', '0', '23'), +('13', '107', '1', '98769', '284362', '23'), +('13', '107', '1', '128691', '229879', '23'), +('13', '107', '1', '111311', '178869', '23'), +('13', '107', '1', '111307', '176784', '23'), +('13', '107', '2', '62985', '109909', '23'), +('13', '107', '2', '94056', '109797', '23'), +('13', '107', '2', '104424', '96112', '23'), +('13', '107', '2', '54845', '71116', '23'), +('13', '107', '3', '111314', '177251', '23'), +('13', '107', '3', '111316', '175497', '23'), +('13', '107', '3', '111315', '174613', '23'), +('13', '107', '3', '111013', '155400', '23'), +('13', '107', '5', '111319', '176746', '23'), +('13', '107', '5', '111321', '175938', '23'), +('13', '107', '5', '111318', '174082', '23'), +('13', '107', '5', '111018', '154895', '23'), +('13', '107', '8', '111332', '177367', '23'), +('13', '107', '8', '111329', '176368', '23'), +('13', '107', '8', '111331', '172723', '23'), +('13', '107', '8', '111031', '155617', '23'), +('13', '107', '6', '111323', '177215', '23'), +('13', '107', '6', '111326', '175787', '23'), +('13', '107', '6', '111325', '175724', '23'), +('13', '107', '6', '111022', '155365', '23'), +('13', '107', '17', '94535', '312891', '23'), +('13', '107', '17', '56043', '117796', '23'), +('13', '107', '17', '56084', '114188', '23'), +('13', '107', '17', '104427', '99770', '23'), +('13', '107', '7', '128648', '231928', '23'), +('13', '107', '7', '56080', '110083', '23'), +('13', '107', '7', '56040', '109395', '23'), +('13', '107', '7', '104425', '95544', '23'), +('13', '107', '9', '67098', '179974', '23'), +('13', '107', '9', '56070', '106423', '23'), +('13', '107', '9', '56031', '106390', '23'), +('13', '107', '9', '62984', '106154', '23'), +('13', '107', '15', '111349', '179217', '23'), +('13', '107', '15', '111344', '177463', '23'), +('13', '107', '15', '111340', '177079', '23'), +('13', '107', '15', '111346', '176802', '23'), +('13', '107', '20', '128733', '227235', '23'), +('13', '107', '20', '111356', '177344', '23'), +('13', '107', '20', '111352', '176422', '23'), +('13', '107', '20', '111351', '173901', '23'), +('13', '107', '12', '56035', '108455', '23'), +('13', '107', '12', '56074', '107179', '23'), +('13', '107', '12', '104422', '93401', '23'), +('13', '107', '12', '49656', '70142', '23'), +('13', '107', '18', '56041', '114289', '23'), +('13', '107', '18', '62986', '112307', '23'), +('13', '107', '18', '104426', '97019', '23'), +('13', '107', '18', '54851', '71498', '23'), +('13', '107', '19', '81763', '110831', '23'), +('13', '107', '19', '62990', '110795', '23'), +('13', '107', '19', '56075', '109998', '23'), +('13', '107', '19', '56037', '109962', '23'), +('13', '107', '13', '111521', '183123', '23'), +('13', '107', '13', '111524', '173783', '23'), +('13', '107', '13', '111519', '173769', '23'), +('13', '107', '13', '111221', '162283', '23'), +('13', '107', '14', '111537', '177358', '23'), +('13', '107', '14', '111535', '175112', '23'), +('13', '107', '14', '111237', '155507', '23'), +('13', '107', '14', '111235', '153361', '23'), +('13', '107', '11', '133816', '229779', '23'), +('13', '107', '11', '111335', '176382', '23'), +('13', '107', '11', '111337', '176314', '23'), +('13', '107', '11', '111338', '172778', '23'), +('13', '108', '22', '12425', '0', '23'), +('13', '108', '22', '21807', '0', '23'), +('13', '108', '22', '39342', '0', '23'), +('13', '108', '22', '23597', '0', '23'), +('13', '108', '1', '98769', '284366', '23'), +('13', '108', '1', '128691', '229886', '23'), +('13', '108', '1', '111311', '178873', '23'), +('13', '108', '1', '111307', '176792', '23'), +('13', '108', '2', '62985', '109913', '23'), +('13', '108', '2', '94056', '109801', '23'), +('13', '108', '2', '104424', '96120', '23'), +('13', '108', '2', '54845', '71122', '23'), +('13', '108', '3', '111314', '177257', '23'), +('13', '108', '3', '111316', '175503', '23'), +('13', '108', '3', '111315', '174619', '23'), +('13', '108', '3', '111013', '155407', '23'), +('13', '108', '5', '111319', '176753', '23'), +('13', '108', '5', '111321', '175943', '23'), +('13', '108', '5', '111318', '174090', '23'), +('13', '108', '5', '111018', '154902', '23'), +('13', '108', '8', '111332', '177374', '23'), +('13', '108', '8', '111329', '176376', '23'), +('13', '108', '8', '111331', '172728', '23'), +('13', '108', '8', '111031', '155623', '23'), +('13', '108', '6', '111323', '177221', '23'), +('13', '108', '6', '111326', '175794', '23'), +('13', '108', '6', '111325', '175729', '23'), +('13', '108', '6', '111022', '155371', '23'), +('13', '108', '17', '94535', '312900', '23'), +('13', '108', '17', '56043', '117802', '23'), +('13', '108', '17', '56084', '114195', '23'), +('13', '108', '17', '104427', '99776', '23'), +('13', '108', '7', '128648', '231932', '23'), +('13', '108', '7', '56080', '110090', '23'), +('13', '108', '7', '56040', '109405', '23'), +('13', '108', '7', '104425', '95550', '23'), +('13', '108', '9', '67098', '179979', '23'), +('13', '108', '9', '56070', '106428', '23'), +('13', '108', '9', '56031', '106400', '23'), +('13', '108', '9', '62984', '106159', '23'), +('13', '108', '15', '111349', '179225', '23'), +('13', '108', '15', '111344', '177468', '23'), +('13', '108', '15', '111340', '177084', '23'), +('13', '108', '15', '111346', '176808', '23'), +('13', '108', '20', '128733', '227241', '23'), +('13', '108', '20', '111356', '177350', '23'), +('13', '108', '20', '111352', '176427', '23'), +('13', '108', '20', '111351', '173909', '23'), +('13', '108', '12', '56035', '108465', '23'), +('13', '108', '12', '56074', '107185', '23'), +('13', '108', '12', '104422', '93409', '23'), +('13', '108', '12', '49656', '70143', '23'), +('13', '108', '18', '56041', '114298', '23'), +('13', '108', '18', '62986', '112312', '23'), +('13', '108', '18', '104426', '97021', '23'), +('13', '108', '18', '54851', '71502', '23'), +('13', '108', '19', '81763', '110841', '23'), +('13', '108', '19', '62990', '110802', '23'), +('13', '108', '19', '56075', '110003', '23'), +('13', '108', '19', '56037', '109965', '23'), +('13', '108', '13', '111521', '183129', '23'), +('13', '108', '13', '111524', '173790', '23'), +('13', '108', '13', '111519', '173777', '23'), +('13', '108', '13', '111221', '162289', '23'), +('13', '108', '14', '111537', '177363', '23'), +('13', '108', '14', '111535', '175116', '23'), +('13', '108', '14', '111237', '155512', '23'), +('13', '108', '14', '111235', '153365', '23'), +('13', '108', '11', '133816', '229783', '23'), +('13', '108', '11', '111335', '176388', '23'), +('13', '108', '11', '111337', '176320', '23'), +('13', '108', '11', '111338', '172784', '23'), +('13', '109', '22', '12425', '0', '23'), +('13', '109', '22', '21807', '0', '23'), +('13', '109', '22', '39342', '0', '23'), +('13', '109', '22', '23597', '0', '23'), +('13', '109', '1', '98769', '284370', '23'), +('13', '109', '1', '128691', '229892', '23'), +('13', '109', '1', '111311', '178877', '23'), +('13', '109', '1', '111307', '176800', '23'), +('13', '109', '2', '62985', '109917', '23'), +('13', '109', '2', '94056', '109804', '23'), +('13', '109', '2', '104424', '96128', '23'), +('13', '109', '2', '54845', '71128', '23'), +('13', '109', '3', '111314', '177264', '23'), +('13', '109', '3', '111316', '175509', '23'), +('13', '109', '3', '111315', '174625', '23'), +('13', '109', '3', '111013', '155413', '23'), +('13', '109', '5', '111319', '176760', '23'), +('13', '109', '5', '111321', '175948', '23'), +('13', '109', '5', '111318', '174097', '23'), +('13', '109', '5', '111018', '154910', '23'), +('13', '109', '8', '111332', '177381', '23'), +('13', '109', '8', '111329', '176383', '23'), +('13', '109', '8', '111331', '172734', '23'), +('13', '109', '8', '111031', '155630', '23'), +('13', '109', '6', '111323', '177227', '23'), +('13', '109', '6', '111326', '175802', '23'), +('13', '109', '6', '111325', '175734', '23'), +('13', '109', '6', '111022', '155376', '23'), +('13', '109', '17', '94535', '312908', '23'), +('13', '109', '17', '56043', '117807', '23'), +('13', '109', '17', '56084', '114201', '23'), +('13', '109', '17', '104427', '99782', '23'), +('13', '109', '7', '128648', '231936', '23'), +('13', '109', '7', '56080', '110097', '23'), +('13', '109', '7', '56040', '109415', '23'), +('13', '109', '7', '104425', '95555', '23'), +('13', '109', '9', '67098', '179983', '23'), +('13', '109', '9', '56070', '106433', '23'), +('13', '109', '9', '56031', '106410', '23'), +('13', '109', '9', '62984', '106163', '23'), +('13', '109', '15', '111349', '179234', '23'), +('13', '109', '15', '111344', '177473', '23'), +('13', '109', '15', '111340', '177090', '23'), +('13', '109', '15', '111346', '176814', '23'), +('13', '109', '20', '128733', '227247', '23'), +('13', '109', '20', '111356', '177356', '23'), +('13', '109', '20', '111352', '176432', '23'), +('13', '109', '20', '111351', '173916', '23'), +('13', '109', '12', '56035', '108474', '23'), +('13', '109', '12', '56074', '107191', '23'), +('13', '109', '12', '104422', '93417', '23'), +('13', '109', '12', '49656', '70143', '23'), +('13', '109', '18', '56041', '114306', '23'), +('13', '109', '18', '62986', '112317', '23'), +('13', '109', '18', '104426', '97023', '23'), +('13', '109', '18', '54851', '71507', '23'), +('13', '109', '19', '81763', '110851', '23'), +('13', '109', '19', '62990', '110810', '23'), +('13', '109', '19', '56075', '110008', '23'), +('13', '109', '19', '56037', '109967', '23'), +('13', '109', '13', '111521', '183134', '23'), +('13', '109', '13', '111524', '173796', '23'), +('13', '109', '13', '111519', '173784', '23'), +('13', '109', '13', '111221', '162295', '23'), +('13', '109', '14', '111537', '177368', '23'), +('13', '109', '14', '111535', '175120', '23'), +('13', '109', '14', '111237', '155517', '23'), +('13', '109', '14', '111235', '153369', '23'), +('13', '109', '11', '133816', '229787', '23'), +('13', '109', '11', '111335', '176393', '23'), +('13', '109', '11', '111337', '176326', '23'), +('13', '109', '11', '111338', '172790', '23'), +('13', '110', '22', '12425', '0', '25'), +('13', '110', '22', '39342', '0', '25'), +('13', '110', '22', '7867', '0', '25'), +('13', '110', '22', '53550', '0', '25'), +('13', '110', '1', '98769', '284375', '25'), +('13', '110', '1', '128691', '229898', '25'), +('13', '110', '1', '111311', '178881', '25'), +('13', '110', '1', '111307', '176808', '25'), +('13', '110', '2', '62985', '109921', '25'), +('13', '110', '2', '94056', '109807', '25'), +('13', '110', '2', '104424', '96136', '25'), +('13', '110', '2', '54845', '71133', '25'), +('13', '110', '3', '111314', '177270', '25'), +('13', '110', '3', '111316', '175515', '25'), +('13', '110', '3', '111315', '174632', '25'), +('13', '110', '3', '111013', '155420', '25'), +('13', '110', '5', '111319', '176767', '25'), +('13', '110', '5', '111321', '175953', '25'), +('13', '110', '5', '111318', '174105', '25'), +('13', '110', '5', '111018', '154917', '25'), +('13', '110', '8', '111332', '177387', '25'), +('13', '110', '8', '111329', '176391', '25'), +('13', '110', '8', '111331', '172739', '25'), +('13', '110', '8', '111031', '155637', '25'), +('13', '110', '6', '111323', '177233', '25'), +('13', '110', '6', '111326', '175810', '25'), +('13', '110', '6', '111325', '175739', '25'), +('13', '110', '6', '111022', '155382', '25'), +('13', '110', '17', '94535', '312916', '25'), +('13', '110', '17', '56043', '117813', '25'), +('13', '110', '17', '56084', '114207', '25'), +('13', '110', '17', '104427', '99788', '25'), +('13', '110', '7', '128648', '231940', '25'), +('13', '110', '7', '56080', '110104', '25'), +('13', '110', '7', '56040', '109426', '25'), +('13', '110', '7', '104425', '95561', '25'), +('13', '110', '9', '67098', '179987', '25'), +('13', '110', '9', '56070', '106439', '25'), +('13', '110', '9', '56031', '106420', '25'), +('13', '110', '9', '62984', '106168', '25'), +('13', '110', '15', '111349', '179242', '25'), +('13', '110', '15', '111344', '177477', '25'), +('13', '110', '15', '111340', '177095', '25'), +('13', '110', '15', '111346', '176820', '25'), +('13', '110', '20', '128733', '227253', '25'), +('13', '110', '20', '111356', '177363', '25'), +('13', '110', '20', '111352', '176438', '25'), +('13', '110', '20', '111351', '173924', '25'), +('13', '110', '12', '56035', '108484', '25'), +('13', '110', '12', '56074', '107197', '25'), +('13', '110', '12', '104422', '93425', '25'), +('13', '110', '12', '49656', '70144', '25'), +('13', '110', '18', '56041', '114315', '25'), +('13', '110', '18', '62986', '112322', '25'), +('13', '110', '18', '104426', '97025', '25'), +('13', '110', '18', '54851', '71511', '25'), +('13', '110', '19', '81763', '110861', '25'), +('13', '110', '19', '62990', '110817', '25'), +('13', '110', '19', '56075', '110013', '25'), +('13', '110', '19', '56037', '109970', '25'), +('13', '110', '13', '111521', '183140', '25'), +('13', '110', '13', '111524', '173803', '25'), +('13', '110', '13', '111519', '173792', '25'), +('13', '110', '13', '111221', '162301', '25'), +('13', '110', '14', '111537', '177373', '25'), +('13', '110', '14', '111535', '175124', '25'), +('13', '110', '14', '111237', '155522', '25'), +('13', '110', '14', '111235', '153373', '25'), +('13', '110', '11', '85213', '257047', '25'), +('13', '110', '11', '133816', '229792', '25'), +('13', '110', '11', '111335', '176399', '25'), +('13', '110', '11', '111337', '176332', '25'), +('13', '110', '22', '12425', '0', '24'), +('13', '110', '22', '39342', '0', '24'), +('13', '110', '22', '7867', '0', '24'), +('13', '110', '22', '53550', '0', '24'), +('13', '110', '1', '98769', '284375', '24'), +('13', '110', '1', '128691', '229898', '24'), +('13', '110', '1', '111311', '178881', '24'), +('13', '110', '1', '111307', '176808', '24'), +('13', '110', '2', '62985', '109921', '24'), +('13', '110', '2', '94056', '109807', '24'), +('13', '110', '2', '104424', '96136', '24'), +('13', '110', '2', '54845', '71133', '24'), +('13', '110', '3', '111314', '177270', '24'), +('13', '110', '3', '111316', '175515', '24'), +('13', '110', '3', '111315', '174632', '24'), +('13', '110', '3', '111013', '155420', '24'), +('13', '110', '5', '111319', '176767', '24'), +('13', '110', '5', '111321', '175953', '24'), +('13', '110', '5', '111318', '174105', '24'), +('13', '110', '5', '111018', '154917', '24'), +('13', '110', '8', '111332', '177387', '24'), +('13', '110', '8', '111329', '176391', '24'), +('13', '110', '8', '111331', '172739', '24'), +('13', '110', '8', '111031', '155637', '24'), +('13', '110', '6', '111323', '177233', '24'), +('13', '110', '6', '111326', '175810', '24'), +('13', '110', '6', '111325', '175739', '24'), +('13', '110', '6', '111022', '155382', '24'), +('13', '110', '17', '94535', '312916', '24'), +('13', '110', '17', '56043', '117813', '24'), +('13', '110', '17', '56084', '114207', '24'), +('13', '110', '17', '104427', '99788', '24'), +('13', '110', '7', '128648', '231940', '24'), +('13', '110', '7', '56080', '110104', '24'), +('13', '110', '7', '56040', '109426', '24'), +('13', '110', '7', '104425', '95561', '24'), +('13', '110', '9', '67098', '179987', '24'), +('13', '110', '9', '56070', '106439', '24'), +('13', '110', '9', '56031', '106420', '24'), +('13', '110', '9', '62984', '106168', '24'), +('13', '110', '15', '111349', '179242', '24'), +('13', '110', '15', '111344', '177477', '24'), +('13', '110', '15', '111340', '177095', '24'), +('13', '110', '15', '111346', '176820', '24'), +('13', '110', '20', '128733', '227253', '24'), +('13', '110', '20', '111356', '177363', '24'), +('13', '110', '20', '111352', '176438', '24'), +('13', '110', '20', '111351', '173924', '24'), +('13', '110', '12', '56035', '108484', '24'), +('13', '110', '12', '56074', '107197', '24'), +('13', '110', '12', '104422', '93425', '24'), +('13', '110', '12', '49656', '70144', '24'), +('13', '110', '18', '56041', '114315', '24'), +('13', '110', '18', '62986', '112322', '24'), +('13', '110', '18', '104426', '97025', '24'), +('13', '110', '18', '54851', '71511', '24'), +('13', '110', '19', '81763', '110861', '24'), +('13', '110', '19', '62990', '110817', '24'), +('13', '110', '19', '56075', '110013', '24'), +('13', '110', '19', '56037', '109970', '24'), +('13', '110', '13', '111521', '183140', '24'), +('13', '110', '13', '111524', '173803', '24'), +('13', '110', '13', '111519', '173792', '24'), +('13', '110', '13', '111221', '162301', '24'), +('13', '110', '14', '111537', '177373', '24'), +('13', '110', '14', '111535', '175124', '24'), +('13', '110', '14', '111237', '155522', '24'), +('13', '110', '14', '111235', '153373', '24'), +('13', '110', '11', '85213', '257047', '24'), +('13', '110', '11', '133816', '229792', '24'), +('13', '110', '11', '111335', '176399', '24'), +('13', '110', '11', '111337', '176332', '24'), +('13', '111', '22', '12425', '0', '25'), +('13', '111', '22', '39342', '0', '25'), +('13', '111', '22', '7867', '0', '25'), +('13', '111', '22', '53550', '0', '25'), +('13', '111', '1', '98769', '284379', '25'), +('13', '111', '1', '128691', '229905', '25'), +('13', '111', '1', '111311', '178885', '25'), +('13', '111', '1', '111307', '176816', '25'), +('13', '111', '2', '62985', '109924', '25'), +('13', '111', '2', '94056', '109811', '25'), +('13', '111', '2', '104424', '96144', '25'), +('13', '111', '2', '54845', '71139', '25'), +('13', '111', '3', '111314', '177277', '25'), +('13', '111', '3', '111316', '175521', '25'), +('13', '111', '3', '111315', '174638', '25'), +('13', '111', '3', '111013', '155426', '25'), +('13', '111', '5', '111319', '176774', '25'), +('13', '111', '5', '111321', '175959', '25'), +('13', '111', '5', '111318', '174112', '25'), +('13', '111', '5', '111018', '154924', '25'), +('13', '111', '8', '111332', '177394', '25'), +('13', '111', '8', '111329', '176398', '25'), +('13', '111', '8', '111331', '172744', '25'), +('13', '111', '8', '111031', '155643', '25'), +('13', '111', '6', '111323', '177238', '25'), +('13', '111', '6', '111326', '175818', '25'), +('13', '111', '6', '111325', '175743', '25'), +('13', '111', '6', '111022', '155388', '25'), +('13', '111', '17', '94535', '312924', '25'), +('13', '111', '17', '56043', '117819', '25'), +('13', '111', '17', '56084', '114213', '25'), +('13', '111', '17', '104427', '99794', '25'), +('13', '111', '7', '128648', '231943', '25'), +('13', '111', '7', '56080', '110111', '25'), +('13', '111', '7', '56040', '109436', '25'), +('13', '111', '7', '104425', '95566', '25'), +('13', '111', '9', '67098', '179992', '25'), +('13', '111', '9', '56070', '106444', '25'), +('13', '111', '9', '56031', '106430', '25'), +('13', '111', '9', '62984', '106173', '25'), +('13', '111', '15', '111349', '179250', '25'), +('13', '111', '15', '111344', '177482', '25'), +('13', '111', '15', '111340', '177101', '25'), +('13', '111', '15', '111346', '176826', '25'), +('13', '111', '20', '128733', '227259', '25'), +('13', '111', '20', '111356', '177369', '25'), +('13', '111', '20', '111352', '176443', '25'), +('13', '111', '20', '111351', '173931', '25'), +('13', '111', '12', '56035', '108493', '25'), +('13', '111', '12', '56074', '107204', '25'), +('13', '111', '12', '104422', '93432', '25'), +('13', '111', '12', '49656', '70145', '25'), +('13', '111', '18', '56041', '114323', '25'), +('13', '111', '18', '62986', '112327', '25'), +('13', '111', '18', '104426', '97026', '25'), +('13', '111', '18', '54851', '71515', '25'), +('13', '111', '19', '81763', '110870', '25'), +('13', '111', '19', '62990', '110825', '25'), +('13', '111', '19', '56075', '110017', '25'), +('13', '111', '19', '56037', '109972', '25'), +('13', '111', '13', '111521', '183145', '25'), +('13', '111', '13', '111524', '173810', '25'), +('13', '111', '13', '111519', '173800', '25'), +('13', '111', '13', '111221', '162307', '25'), +('13', '111', '14', '111537', '177379', '25'), +('13', '111', '14', '111535', '175128', '25'), +('13', '111', '14', '111237', '155527', '25'), +('13', '111', '14', '111235', '153377', '25'), +('13', '111', '11', '85213', '257052', '25'), +('13', '111', '11', '133816', '229796', '25'), +('13', '111', '11', '111335', '176405', '25'), +('13', '111', '11', '111337', '176338', '25'), +('13', '112', '22', '12425', '0', '25'), +('13', '112', '22', '39342', '0', '25'), +('13', '112', '22', '7867', '0', '25'), +('13', '112', '22', '53550', '0', '25'), +('13', '112', '1', '98769', '284383', '25'), +('13', '112', '1', '128691', '229911', '25'), +('13', '112', '1', '111311', '178889', '25'), +('13', '112', '1', '111307', '176825', '25'), +('13', '112', '2', '62985', '109928', '25'), +('13', '112', '2', '94056', '109814', '25'), +('13', '112', '2', '104424', '96152', '25'), +('13', '112', '2', '54845', '71145', '25'), +('13', '112', '3', '111314', '177283', '25'), +('13', '112', '3', '111316', '175527', '25'), +('13', '112', '3', '111315', '174644', '25'), +('13', '112', '3', '111013', '155433', '25'), +('13', '112', '5', '111319', '176782', '25'), +('13', '112', '5', '111321', '175964', '25'), +('13', '112', '5', '111318', '174120', '25'), +('13', '112', '5', '111018', '154931', '25'), +('13', '112', '8', '111332', '177401', '25'), +('13', '112', '8', '111329', '176406', '25'), +('13', '112', '8', '111331', '172750', '25'), +('13', '112', '8', '111031', '155650', '25'), +('13', '112', '6', '111323', '177244', '25'), +('13', '112', '6', '111326', '175825', '25'), +('13', '112', '6', '111325', '175748', '25'), +('13', '112', '6', '111022', '155393', '25'), +('13', '112', '17', '94535', '312932', '25'), +('13', '112', '17', '56043', '117824', '25'), +('13', '112', '17', '56084', '114219', '25'), +('13', '112', '17', '104427', '99800', '25'), +('13', '112', '7', '128648', '231947', '25'), +('13', '112', '7', '56080', '110118', '25'), +('13', '112', '7', '56040', '109446', '25'), +('13', '112', '7', '104425', '95572', '25'), +('13', '112', '9', '67098', '179996', '25'), +('13', '112', '9', '56070', '106449', '25'), +('13', '112', '9', '56031', '106440', '25'), +('13', '112', '9', '62984', '106178', '25'), +('13', '112', '15', '111349', '179258', '25'), +('13', '112', '15', '111344', '177487', '25'), +('13', '112', '15', '111340', '177106', '25'), +('13', '112', '15', '111346', '176832', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('13', '112', '20', '128733', '227265', '25'), +('13', '112', '20', '111356', '177375', '25'), +('13', '112', '20', '111352', '176448', '25'), +('13', '112', '20', '111351', '173939', '25'), +('13', '112', '12', '56035', '108503', '25'), +('13', '112', '12', '56074', '107210', '25'), +('13', '112', '12', '104422', '93440', '25'), +('13', '112', '12', '49656', '70146', '25'), +('13', '112', '18', '56041', '114332', '25'), +('13', '112', '18', '62986', '112332', '25'), +('13', '112', '18', '104426', '97028', '25'), +('13', '112', '18', '54851', '71519', '25'), +('13', '112', '19', '81763', '110880', '25'), +('13', '112', '19', '62990', '110832', '25'), +('13', '112', '19', '56075', '110022', '25'), +('13', '112', '19', '56037', '109975', '25'), +('13', '112', '13', '111521', '183151', '25'), +('13', '112', '13', '111524', '173817', '25'), +('13', '112', '13', '111519', '173807', '25'), +('13', '112', '13', '111221', '162313', '25'), +('13', '112', '14', '111537', '177384', '25'), +('13', '112', '14', '111535', '175132', '25'), +('13', '112', '14', '111237', '155532', '25'), +('13', '112', '14', '111235', '153381', '25'), +('13', '112', '11', '85213', '257056', '25'), +('13', '112', '11', '133816', '229800', '25'), +('13', '112', '11', '111335', '176411', '25'), +('13', '112', '11', '111337', '176345', '25'), +('13', '113', '22', '12425', '0', '25'), +('13', '113', '22', '39342', '0', '25'), +('13', '113', '22', '7867', '0', '25'), +('13', '113', '22', '53550', '0', '25'), +('13', '113', '1', '98769', '284387', '25'), +('13', '113', '1', '128691', '229918', '25'), +('13', '113', '1', '111311', '178893', '25'), +('13', '113', '1', '111307', '176833', '25'), +('13', '113', '2', '62985', '109932', '25'), +('13', '113', '2', '94056', '109817', '25'), +('13', '113', '2', '104424', '96160', '25'), +('13', '113', '2', '54845', '71151', '25'), +('13', '113', '3', '111314', '177290', '25'), +('13', '113', '3', '111316', '175533', '25'), +('13', '113', '3', '111315', '174650', '25'), +('13', '113', '3', '111013', '155439', '25'), +('13', '113', '5', '111319', '176789', '25'), +('13', '113', '5', '111321', '175969', '25'), +('13', '113', '5', '111318', '174127', '25'), +('13', '113', '5', '111018', '154938', '25'), +('13', '113', '8', '111332', '177407', '25'), +('13', '113', '8', '111329', '176413', '25'), +('13', '113', '8', '111331', '172755', '25'), +('13', '113', '8', '111031', '155657', '25'), +('13', '113', '6', '111323', '177250', '25'), +('13', '113', '6', '111326', '175833', '25'), +('13', '113', '6', '111325', '175753', '25'), +('13', '113', '6', '111022', '155399', '25'), +('13', '113', '17', '94535', '312940', '25'), +('13', '113', '17', '56043', '117830', '25'), +('13', '113', '17', '56084', '114225', '25'), +('13', '113', '17', '104427', '99807', '25'), +('13', '113', '7', '128648', '231951', '25'), +('13', '113', '7', '56080', '110126', '25'), +('13', '113', '7', '56040', '109456', '25'), +('13', '113', '7', '104425', '95577', '25'), +('13', '113', '9', '67098', '180000', '25'), +('13', '113', '9', '56070', '106454', '25'), +('13', '113', '9', '56031', '106450', '25'), +('13', '113', '9', '62984', '106183', '25'), +('13', '113', '15', '111349', '179266', '25'), +('13', '113', '15', '111344', '177491', '25'), +('13', '113', '15', '111340', '177112', '25'), +('13', '113', '15', '111346', '176837', '25'), +('13', '113', '20', '128733', '227270', '25'), +('13', '113', '20', '111356', '177381', '25'), +('13', '113', '20', '111352', '176454', '25'), +('13', '113', '20', '111351', '173946', '25'), +('13', '113', '12', '56035', '108512', '25'), +('13', '113', '12', '56074', '107216', '25'), +('13', '113', '12', '104422', '93448', '25'), +('13', '113', '12', '49656', '70147', '25'), +('13', '113', '18', '56041', '114340', '25'), +('13', '113', '18', '62986', '112337', '25'), +('13', '113', '18', '104426', '97030', '25'), +('13', '113', '18', '54851', '71523', '25'), +('13', '113', '19', '81763', '110890', '25'), +('13', '113', '19', '62990', '110840', '25'), +('13', '113', '19', '56075', '110027', '25'), +('13', '113', '19', '56037', '109977', '25'), +('13', '113', '13', '111521', '183156', '25'), +('13', '113', '13', '111524', '173823', '25'), +('13', '113', '13', '111519', '173815', '25'), +('13', '113', '13', '111221', '162319', '25'), +('13', '113', '14', '111537', '177389', '25'), +('13', '113', '14', '111535', '175136', '25'), +('13', '113', '14', '111237', '155537', '25'), +('13', '113', '14', '111235', '153385', '25'), +('13', '113', '11', '85213', '257060', '25'), +('13', '113', '11', '133816', '229804', '25'), +('13', '113', '11', '111335', '176417', '25'), +('13', '113', '11', '111337', '176351', '25'), +('13', '114', '22', '12425', '0', '25'), +('13', '114', '22', '39342', '0', '25'), +('13', '114', '22', '7867', '0', '25'), +('13', '114', '22', '53550', '0', '25'), +('13', '114', '1', '98769', '284392', '25'), +('13', '114', '1', '128691', '229924', '25'), +('13', '114', '1', '111311', '178897', '25'), +('13', '114', '1', '111307', '176841', '25'), +('13', '114', '2', '62985', '109936', '25'), +('13', '114', '2', '94056', '109821', '25'), +('13', '114', '2', '104424', '96168', '25'), +('13', '114', '2', '54845', '71157', '25'), +('13', '114', '3', '111314', '177296', '25'), +('13', '114', '3', '111316', '175539', '25'), +('13', '114', '3', '111315', '174656', '25'), +('13', '114', '3', '111013', '155446', '25'), +('13', '114', '5', '111319', '176796', '25'), +('13', '114', '5', '111321', '175974', '25'), +('13', '114', '5', '111318', '174135', '25'), +('13', '114', '5', '111018', '154945', '25'), +('13', '114', '8', '111332', '177414', '25'), +('13', '114', '8', '111329', '176421', '25'), +('13', '114', '8', '111331', '172760', '25'), +('13', '114', '8', '111031', '155664', '25'), +('13', '114', '6', '111323', '177255', '25'), +('13', '114', '6', '111326', '175841', '25'), +('13', '114', '6', '111325', '175757', '25'), +('13', '114', '6', '111022', '155405', '25'), +('13', '114', '17', '94535', '312949', '25'), +('13', '114', '17', '56043', '117835', '25'), +('13', '114', '17', '56084', '114232', '25'), +('13', '114', '17', '104427', '99813', '25'), +('13', '114', '7', '128648', '231955', '25'), +('13', '114', '7', '56080', '110133', '25'), +('13', '114', '7', '56040', '109466', '25'), +('13', '114', '7', '104425', '95583', '25'), +('13', '114', '9', '67098', '180005', '25'), +('13', '114', '9', '56070', '106460', '25'), +('13', '114', '9', '56031', '106460', '25'), +('13', '114', '9', '62984', '106187', '25'), +('13', '114', '15', '111349', '179274', '25'), +('13', '114', '15', '111344', '177496', '25'), +('13', '114', '15', '111340', '177117', '25'), +('13', '114', '15', '111346', '176843', '25'), +('13', '114', '20', '128733', '227276', '25'), +('13', '114', '20', '111356', '177387', '25'), +('13', '114', '20', '111352', '176459', '25'), +('13', '114', '20', '111351', '173954', '25'), +('13', '114', '12', '56035', '108522', '25'), +('13', '114', '12', '56074', '107222', '25'), +('13', '114', '12', '104422', '93456', '25'), +('13', '114', '12', '49656', '70147', '25'), +('13', '114', '18', '56041', '114349', '25'), +('13', '114', '18', '62986', '112342', '25'), +('13', '114', '18', '104426', '97032', '25'), +('13', '114', '18', '54851', '71527', '25'), +('13', '114', '19', '81763', '110900', '25'), +('13', '114', '19', '62990', '110847', '25'), +('13', '114', '19', '56075', '110031', '25'), +('13', '114', '19', '56037', '109980', '25'), +('13', '114', '13', '111521', '183162', '25'), +('13', '114', '13', '111524', '173830', '25'), +('13', '114', '13', '111519', '173822', '25'), +('13', '114', '13', '111221', '162325', '25'), +('13', '114', '14', '111537', '177394', '25'), +('13', '114', '14', '111535', '175140', '25'), +('13', '114', '14', '111237', '155543', '25'), +('13', '114', '14', '111235', '153389', '25'), +('13', '114', '11', '85213', '257064', '25'), +('13', '114', '11', '133816', '229808', '25'), +('13', '114', '11', '111335', '176423', '25'), +('13', '114', '11', '111337', '176357', '25'), +('13', '115', '22', '12425', '0', '26'), +('13', '115', '22', '39342', '0', '26'), +('13', '115', '22', '7867', '0', '26'), +('13', '115', '22', '53550', '0', '26'), +('13', '115', '1', '98769', '284396', '26'), +('13', '115', '1', '128691', '229931', '26'), +('13', '115', '1', '111311', '178901', '26'), +('13', '115', '1', '111307', '176849', '26'), +('13', '115', '2', '62985', '109940', '26'), +('13', '115', '2', '94056', '109824', '26'), +('13', '115', '2', '104424', '96176', '26'), +('13', '115', '2', '54845', '71163', '26'), +('13', '115', '3', '111314', '177303', '26'), +('13', '115', '3', '111316', '175546', '26'), +('13', '115', '3', '111315', '174662', '26'), +('13', '115', '3', '111013', '155452', '26'), +('13', '115', '5', '111319', '176803', '26'), +('13', '115', '5', '111321', '175979', '26'), +('13', '115', '5', '111318', '174142', '26'), +('13', '115', '5', '111018', '154953', '26'), +('13', '115', '8', '111332', '177421', '26'), +('13', '115', '8', '111329', '176429', '26'), +('13', '115', '8', '111331', '172766', '26'), +('13', '115', '8', '111031', '155670', '26'), +('13', '115', '6', '111323', '177261', '26'), +('13', '115', '6', '111326', '175848', '26'), +('13', '115', '6', '111325', '175762', '26'), +('13', '115', '6', '111022', '155411', '26'), +('13', '115', '17', '94535', '312957', '26'), +('13', '115', '17', '56043', '117841', '26'), +('13', '115', '17', '56084', '114238', '26'), +('13', '115', '17', '104427', '99819', '26'), +('13', '115', '7', '128648', '231958', '26'), +('13', '115', '7', '56080', '110140', '26'), +('13', '115', '7', '56040', '109476', '26'), +('13', '115', '7', '104425', '95588', '26'), +('13', '115', '9', '67098', '180009', '26'), +('13', '115', '9', '56031', '106471', '26'), +('13', '115', '9', '56070', '106465', '26'), +('13', '115', '9', '62984', '106192', '26'), +('13', '115', '15', '111349', '179282', '26'), +('13', '115', '15', '111344', '177501', '26'), +('13', '115', '15', '111340', '177123', '26'), +('13', '115', '15', '111346', '176849', '26'), +('13', '115', '20', '128733', '227282', '26'), +('13', '115', '20', '111356', '177394', '26'), +('13', '115', '20', '111352', '176464', '26'), +('13', '115', '20', '111351', '173961', '26'), +('13', '115', '12', '56035', '108531', '26'), +('13', '115', '12', '56074', '107228', '26'), +('13', '115', '12', '104422', '93464', '26'), +('13', '115', '12', '49656', '70148', '26'), +('13', '115', '18', '56041', '114357', '26'), +('13', '115', '18', '62986', '112347', '26'), +('13', '115', '18', '104426', '97034', '26'), +('13', '115', '18', '54851', '71531', '26'), +('13', '115', '19', '81763', '110910', '26'), +('13', '115', '19', '62990', '110855', '26'), +('13', '115', '19', '56075', '110036', '26'), +('13', '115', '19', '56037', '109982', '26'), +('13', '115', '13', '111521', '183167', '26'), +('13', '115', '13', '111524', '173836', '26'), +('13', '115', '13', '111519', '173829', '26'), +('13', '115', '13', '111221', '162331', '26'), +('13', '115', '14', '111537', '177399', '26'), +('13', '115', '14', '111535', '175144', '26'), +('13', '115', '14', '111237', '155548', '26'), +('13', '115', '14', '111235', '153392', '26'), +('13', '115', '11', '85213', '257068', '26'), +('13', '115', '11', '133816', '229812', '26'), +('13', '115', '11', '111335', '176429', '26'), +('13', '115', '11', '111337', '176363', '26'), +('14', '1', '22', '10323', '0', '0'), +('14', '1', '22', '9246', '0', '0'), +('14', '1', '22', '21509', '0', '0'), +('14', '1', '22', '8007', '0', '0'), +('14', '1', '1', '14702', '5000', '0'), +('14', '1', '1', '14701', '4624', '0'), +('14', '1', '1', '14559', '2693', '0'), +('14', '1', '1', '30361', '2640', '0'), +('14', '1', '2', '10143', '7136', '0'), +('14', '1', '2', '30363', '3700', '0'), +('14', '1', '2', '1246', '2407', '0'), +('14', '1', '2', '1211', '2251', '0'), +('14', '1', '3', '1275', '3254', '0'), +('14', '1', '3', '1642', '1803', '0'), +('14', '1', '3', '1212', '1385', '0'), +('14', '1', '3', '14705', '990', '0'), +('14', '1', '5', '14703', '8800', '0'), +('14', '1', '5', '14700', '4836', '0'), +('14', '1', '5', '10055', '4060', '0'), +('14', '1', '5', '14558', '3797', '0'), +('14', '1', '8', '11603', '8480', '0'), +('14', '1', '8', '2349', '3651', '0'), +('14', '1', '8', '11621', '3631', '0'), +('14', '1', '8', '1409', '2827', '0'), +('14', '1', '6', '1557', '5371', '0'), +('14', '1', '6', '1542', '5203', '0'), +('14', '1', '6', '1905', '5068', '0'), +('14', '1', '6', '1276', '3275', '0'), +('14', '1', '17', '1253', '10111', '0'), +('14', '1', '17', '1644', '8536', '0'), +('14', '1', '17', '11641', '8335', '0'), +('14', '1', '17', '1357', '5607', '0'), +('14', '1', '7', '1362', '3148', '0'), +('14', '1', '7', '1321', '1782', '0'), +('14', '1', '7', '1218', '1303', '0'), +('14', '1', '7', '1248', '1087', '0'), +('14', '1', '9', '14650', '2424', '0'), +('14', '1', '9', '12806', '2211', '0'), +('14', '1', '9', '4344', '2127', '0'), +('14', '1', '9', '10408', '2018', '0'), +('14', '1', '15', '10366', '4854', '0'), +('14', '1', '15', '10151', '4200', '0'), +('14', '1', '15', '10163', '3709', '0'), +('14', '1', '15', '14679', '3360', '0'), +('14', '1', '20', '11666', '12071', '0'), +('14', '1', '20', '2742', '5114', '0'), +('14', '1', '20', '2345', '1624', '0'), +('14', '1', '20', '1217', '1363', '0'), +('14', '1', '12', '2923', '4348', '0'), +('14', '1', '12', '20655', '3772', '0'), +('14', '1', '12', '1404', '2524', '0'), +('14', '1', '12', '1650', '1501', '0'), +('14', '1', '18', '4410', '1685', '0'), +('14', '1', '18', '1651', '1545', '0'), +('14', '1', '18', '1251', '1318', '0'), +('14', '1', '18', '1221', '1234', '0'), +('14', '1', '19', '68239', '2770', '0'), +('14', '1', '19', '1368', '2066', '0'), +('14', '1', '19', '1652', '2046', '0'), +('14', '1', '19', '1252', '1363', '0'), +('14', '1', '13', '14759', '7303', '0'), +('14', '1', '13', '27711', '4040', '0'), +('14', '1', '13', '11625', '3525', '0'), +('14', '1', '13', '13987', '3260', '0'), +('14', '1', '14', '10219', '8362', '0'), +('14', '1', '14', '14759', '7303', '0'), +('14', '1', '14', '11625', '3525', '0'), +('14', '1', '14', '13987', '3260', '0'), +('14', '1', '11', '14762', '3204', '0'), +('14', '1', '11', '13353', '1500', '0'), +('14', '1', '11', '20677', '1200', '0'), +('14', '1', '11', '9246', '1039', '0'), +('14', '2', '22', '10323', '0', '0'), +('14', '2', '22', '9246', '0', '0'), +('14', '2', '22', '21509', '0', '0'), +('14', '2', '22', '8007', '0', '0'), +('14', '2', '1', '14702', '5000', '0'), +('14', '2', '1', '14701', '4624', '0'), +('14', '2', '1', '14559', '2742', '0'), +('14', '2', '1', '30361', '2640', '0'), +('14', '2', '2', '10143', '7136', '0'), +('14', '2', '2', '30363', '3700', '0'), +('14', '2', '2', '1246', '2492', '0'), +('14', '2', '2', '1211', '2335', '0'), +('14', '2', '3', '1275', '3326', '0'), +('14', '2', '3', '1642', '1815', '0'), +('14', '2', '3', '1212', '1397', '0'), +('14', '2', '3', '14705', '990', '0'), +('14', '2', '5', '14703', '8800', '0'), +('14', '2', '5', '14700', '4836', '0'), +('14', '2', '5', '10055', '4060', '0'), +('14', '2', '5', '14558', '3865', '0'), +('14', '2', '8', '11603', '8588', '0'), +('14', '2', '8', '2349', '3651', '0'), +('14', '2', '8', '11621', '3631', '0'), +('14', '2', '8', '1409', '2827', '0'), +('14', '2', '6', '1557', '5371', '0'), +('14', '2', '6', '1542', '5312', '0'), +('14', '2', '6', '1905', '5075', '0'), +('14', '2', '6', '1276', '3275', '0'), +('14', '2', '17', '1253', '10126', '0'), +('14', '2', '17', '1644', '8596', '0'), +('14', '2', '17', '11641', '8516', '0'), +('14', '2', '17', '1357', '5607', '0'), +('14', '2', '7', '1362', '3148', '0'), +('14', '2', '7', '1321', '1782', '0'), +('14', '2', '7', '1218', '1387', '0'), +('14', '2', '7', '1248', '1172', '0'), +('14', '2', '9', '14650', '2424', '0'), +('14', '2', '9', '12806', '2296', '0'), +('14', '2', '9', '4344', '2127', '0'), +('14', '2', '9', '10408', '2018', '0'), +('14', '2', '15', '10366', '4854', '0'), +('14', '2', '15', '10151', '4200', '0'), +('14', '2', '15', '10163', '3709', '0'), +('14', '2', '15', '14679', '3360', '0'), +('14', '2', '20', '11666', '12081', '0'), +('14', '2', '20', '2742', '5129', '0'), +('14', '2', '20', '2345', '1624', '0'), +('14', '2', '20', '1217', '1375', '0'), +('14', '2', '12', '2923', '4348', '0'), +('14', '2', '12', '20655', '3799', '0'), +('14', '2', '12', '1404', '2524', '0'), +('14', '2', '12', '1650', '1550', '0'), +('14', '2', '18', '4410', '1685', '0'), +('14', '2', '18', '1651', '1581', '0'), +('14', '2', '18', '1251', '1318', '0'), +('14', '2', '18', '1221', '1234', '0'), +('14', '2', '19', '68239', '2806', '0'), +('14', '2', '19', '1368', '2066', '0'), +('14', '2', '19', '1652', '2046', '0'), +('14', '2', '19', '1252', '1363', '0'), +('14', '2', '13', '14759', '7368', '0'), +('14', '2', '13', '27711', '4131', '0'), +('14', '2', '13', '11625', '3538', '0'), +('14', '2', '13', '13987', '3321', '0'), +('14', '2', '14', '10219', '8362', '0'), +('14', '2', '14', '14759', '7368', '0'), +('14', '2', '14', '11625', '3538', '0'), +('14', '2', '14', '13987', '3321', '0'), +('14', '2', '11', '14762', '3204', '0'), +('14', '2', '11', '13353', '1500', '0'), +('14', '2', '11', '20677', '1200', '0'), +('14', '2', '11', '9246', '1160', '0'), +('14', '3', '22', '10323', '0', '0'), +('14', '3', '22', '9246', '0', '0'), +('14', '3', '22', '21509', '0', '0'), +('14', '3', '22', '8007', '0', '0'), +('14', '3', '1', '14702', '5000', '0'), +('14', '3', '1', '14701', '4624', '0'), +('14', '3', '1', '14559', '2790', '0'), +('14', '3', '1', '30361', '2640', '0'), +('14', '3', '2', '10143', '7136', '0'), +('14', '3', '2', '30363', '3700', '0'), +('14', '3', '2', '1246', '2576', '0'), +('14', '3', '2', '1211', '2420', '0'), +('14', '3', '3', '1275', '3399', '0'), +('14', '3', '3', '1642', '1827', '0'), +('14', '3', '3', '1212', '1409', '0'), +('14', '3', '3', '14705', '990', '0'), +('14', '3', '5', '14703', '8800', '0'), +('14', '3', '5', '14700', '4836', '0'), +('14', '3', '5', '10055', '4060', '0'), +('14', '3', '5', '14558', '3932', '0'), +('14', '3', '8', '11603', '8697', '0'), +('14', '3', '8', '2349', '3651', '0'), +('14', '3', '8', '11621', '3631', '0'), +('14', '3', '8', '1409', '2827', '0'), +('14', '3', '6', '1542', '5421', '0'), +('14', '3', '6', '1557', '5371', '0'), +('14', '3', '6', '1905', '5082', '0'), +('14', '3', '6', '1276', '3275', '0'), +('14', '3', '17', '1253', '10140', '0'), +('14', '3', '17', '11641', '8698', '0'), +('14', '3', '17', '1644', '8656', '0'), +('14', '3', '17', '1357', '5607', '0'), +('14', '3', '7', '1362', '3148', '0'), +('14', '3', '7', '1321', '1782', '0'), +('14', '3', '7', '1218', '1472', '0'), +('14', '3', '7', '1248', '1256', '0'), +('14', '3', '9', '14650', '2424', '0'), +('14', '3', '9', '12806', '2381', '0'), +('14', '3', '9', '4344', '2127', '0'), +('14', '3', '9', '10408', '2018', '0'), +('14', '3', '15', '10366', '4854', '0'), +('14', '3', '15', '10151', '4200', '0'), +('14', '3', '15', '10163', '3709', '0'), +('14', '3', '15', '14679', '3360', '0'), +('14', '3', '20', '11666', '12091', '0'), +('14', '3', '20', '2742', '5143', '0'), +('14', '3', '20', '2345', '1624', '0'), +('14', '3', '20', '1217', '1387', '0'), +('14', '3', '12', '2923', '4348', '0'), +('14', '3', '12', '20655', '3826', '0'), +('14', '3', '12', '1404', '2524', '0'), +('14', '3', '12', '1650', '1598', '0'), +('14', '3', '18', '4410', '1685', '0'), +('14', '3', '18', '1651', '1617', '0'), +('14', '3', '18', '1251', '1318', '0'), +('14', '3', '18', '1221', '1234', '0'), +('14', '3', '19', '68239', '2843', '0'), +('14', '3', '19', '1368', '2066', '0'), +('14', '3', '19', '1652', '2046', '0'), +('14', '3', '19', '1252', '1363', '0'), +('14', '3', '13', '14759', '7434', '0'), +('14', '3', '13', '27711', '4221', '0'), +('14', '3', '13', '11625', '3551', '0'), +('14', '3', '13', '13987', '3381', '0'), +('14', '3', '14', '10219', '8362', '0'), +('14', '3', '14', '14759', '7434', '0'), +('14', '3', '14', '11625', '3551', '0'), +('14', '3', '14', '13987', '3381', '0'), +('14', '3', '11', '14762', '3204', '0'), +('14', '3', '11', '13353', '1500', '0'), +('14', '3', '11', '9246', '1280', '0'), +('14', '3', '11', '20677', '1200', '0'), +('14', '4', '22', '10323', '0', '0'), +('14', '4', '22', '9246', '0', '0'), +('14', '4', '22', '21509', '0', '0'), +('14', '4', '22', '8007', '0', '0'), +('14', '4', '1', '14702', '5000', '0'), +('14', '4', '1', '14701', '4624', '0'), +('14', '4', '1', '14559', '2838', '0'), +('14', '4', '1', '30361', '2640', '0'), +('14', '4', '2', '10143', '7136', '0'), +('14', '4', '2', '30363', '3700', '0'), +('14', '4', '2', '1246', '2661', '0'), +('14', '4', '2', '1211', '2504', '0'), +('14', '4', '3', '1275', '3471', '0'), +('14', '4', '3', '1642', '1839', '0'), +('14', '4', '3', '1212', '1421', '0'), +('14', '4', '3', '14705', '990', '0'), +('14', '4', '5', '14703', '8800', '0'), +('14', '4', '5', '14700', '4836', '0'), +('14', '4', '5', '10055', '4060', '0'), +('14', '4', '5', '14558', '4000', '0'), +('14', '4', '8', '11603', '8806', '0'), +('14', '4', '8', '2349', '3651', '0'), +('14', '4', '8', '11621', '3631', '0'), +('14', '4', '8', '1409', '2827', '0'), +('14', '4', '6', '1542', '5530', '0'), +('14', '4', '6', '1557', '5371', '0'), +('14', '4', '6', '1905', '5089', '0'), +('14', '4', '6', '1276', '3275', '0'), +('14', '4', '17', '1253', '10155', '0'), +('14', '4', '17', '11641', '8879', '0'), +('14', '4', '17', '1644', '8717', '0'), +('14', '4', '17', '1357', '5607', '0'), +('14', '4', '7', '1362', '3148', '0'), +('14', '4', '7', '1321', '1782', '0'), +('14', '4', '7', '1218', '1557', '0'), +('14', '4', '7', '1248', '1341', '0'), +('14', '4', '9', '12806', '2465', '0'), +('14', '4', '9', '14650', '2424', '0'), +('14', '4', '9', '4344', '2127', '0'), +('14', '4', '9', '10408', '2018', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '4', '15', '10366', '4854', '0'), +('14', '4', '15', '10151', '4200', '0'), +('14', '4', '15', '10163', '3709', '0'), +('14', '4', '15', '14679', '3360', '0'), +('14', '4', '20', '11666', '12102', '0'), +('14', '4', '20', '2742', '5158', '0'), +('14', '4', '20', '2345', '1624', '0'), +('14', '4', '20', '1217', '1399', '0'), +('14', '4', '12', '2923', '4348', '0'), +('14', '4', '12', '20655', '3853', '0'), +('14', '4', '12', '1404', '2524', '0'), +('14', '4', '12', '1650', '1646', '0'), +('14', '4', '18', '4410', '1685', '0'), +('14', '4', '18', '1651', '1654', '0'), +('14', '4', '18', '1251', '1318', '0'), +('14', '4', '18', '1221', '1234', '0'), +('14', '4', '19', '68239', '2879', '0'), +('14', '4', '19', '1368', '2066', '0'), +('14', '4', '19', '1652', '2046', '0'), +('14', '4', '19', '1252', '1363', '0'), +('14', '4', '13', '14759', '7499', '0'), +('14', '4', '13', '27711', '4312', '0'), +('14', '4', '13', '11625', '3564', '0'), +('14', '4', '13', '13987', '3442', '0'), +('14', '4', '14', '10219', '8362', '0'), +('14', '4', '14', '14759', '7499', '0'), +('14', '4', '14', '11625', '3564', '0'), +('14', '4', '14', '13987', '3442', '0'), +('14', '4', '11', '14762', '3204', '0'), +('14', '4', '11', '13353', '1500', '0'), +('14', '4', '11', '9246', '1401', '0'), +('14', '4', '11', '20677', '1200', '0'), +('14', '5', '22', '10323', '0', '0'), +('14', '5', '22', '9246', '0', '0'), +('14', '5', '22', '21509', '0', '0'), +('14', '5', '22', '8007', '0', '0'), +('14', '5', '1', '14702', '5000', '0'), +('14', '5', '1', '14701', '4624', '0'), +('14', '5', '1', '14559', '2887', '0'), +('14', '5', '1', '30361', '2640', '0'), +('14', '5', '2', '10143', '7136', '0'), +('14', '5', '2', '30363', '3700', '0'), +('14', '5', '2', '1246', '2746', '0'), +('14', '5', '2', '1211', '2589', '0'), +('14', '5', '3', '1275', '3544', '0'), +('14', '5', '3', '1642', '1851', '0'), +('14', '5', '3', '1212', '1433', '0'), +('14', '5', '3', '14705', '990', '0'), +('14', '5', '5', '14703', '8800', '0'), +('14', '5', '5', '14700', '4836', '0'), +('14', '5', '5', '14558', '4068', '0'), +('14', '5', '5', '10055', '4060', '0'), +('14', '5', '8', '11603', '8914', '0'), +('14', '5', '8', '2349', '3651', '0'), +('14', '5', '8', '11621', '3631', '0'), +('14', '5', '8', '1409', '2827', '0'), +('14', '5', '6', '1542', '5638', '0'), +('14', '5', '6', '1557', '5371', '0'), +('14', '5', '6', '1905', '5097', '0'), +('14', '5', '6', '1276', '3275', '0'), +('14', '5', '17', '1253', '10169', '0'), +('14', '5', '17', '11641', '9060', '0'), +('14', '5', '17', '1644', '8777', '0'), +('14', '5', '17', '1357', '5607', '0'), +('14', '5', '7', '1362', '3148', '0'), +('14', '5', '7', '1321', '1782', '0'), +('14', '5', '7', '1218', '1641', '0'), +('14', '5', '7', '1248', '1425', '0'), +('14', '5', '9', '12806', '2550', '0'), +('14', '5', '9', '14650', '2424', '0'), +('14', '5', '9', '4344', '2127', '0'), +('14', '5', '9', '10408', '2018', '0'), +('14', '5', '15', '10366', '4854', '0'), +('14', '5', '15', '10151', '4200', '0'), +('14', '5', '15', '10163', '3709', '0'), +('14', '5', '15', '14679', '3360', '0'), +('14', '5', '20', '11666', '12112', '0'), +('14', '5', '20', '2742', '5172', '0'), +('14', '5', '20', '2345', '1624', '0'), +('14', '5', '20', '1217', '1411', '0'), +('14', '5', '12', '2923', '4348', '0'), +('14', '5', '12', '20655', '3881', '0'), +('14', '5', '12', '1404', '2524', '0'), +('14', '5', '12', '1650', '1695', '0'), +('14', '5', '18', '1651', '1690', '0'), +('14', '5', '18', '4410', '1685', '0'), +('14', '5', '18', '1251', '1318', '0'), +('14', '5', '18', '1221', '1234', '0'), +('14', '5', '19', '68239', '2915', '0'), +('14', '5', '19', '1368', '2066', '0'), +('14', '5', '19', '1652', '2046', '0'), +('14', '5', '19', '1252', '1363', '0'), +('14', '5', '13', '14759', '7564', '0'), +('14', '5', '13', '27711', '4403', '0'), +('14', '5', '13', '11625', '3577', '0'), +('14', '5', '13', '13987', '3502', '0'), +('14', '5', '14', '10219', '8362', '0'), +('14', '5', '14', '14759', '7564', '0'), +('14', '5', '14', '11625', '3577', '0'), +('14', '5', '14', '13987', '3502', '0'), +('14', '5', '11', '14762', '3204', '0'), +('14', '5', '11', '9246', '1522', '0'), +('14', '5', '11', '13353', '1500', '0'), +('14', '5', '11', '20677', '1200', '0'), +('14', '6', '22', '10323', '0', '0'), +('14', '6', '22', '9246', '0', '0'), +('14', '6', '22', '21509', '0', '0'), +('14', '6', '22', '8007', '0', '0'), +('14', '6', '1', '14702', '5000', '0'), +('14', '6', '1', '14701', '4624', '0'), +('14', '6', '1', '14559', '2935', '0'), +('14', '6', '1', '30361', '2640', '0'), +('14', '6', '2', '10143', '7136', '0'), +('14', '6', '2', '30363', '3700', '0'), +('14', '6', '2', '1246', '2830', '0'), +('14', '6', '2', '1211', '2673', '0'), +('14', '6', '3', '1275', '3616', '0'), +('14', '6', '3', '1642', '1863', '0'), +('14', '6', '3', '1212', '1445', '0'), +('14', '6', '3', '11052', '1087', '0'), +('14', '6', '5', '14703', '8800', '0'), +('14', '6', '5', '14700', '4836', '0'), +('14', '6', '5', '14558', '4135', '0'), +('14', '6', '5', '10055', '4060', '0'), +('14', '6', '8', '11603', '9023', '0'), +('14', '6', '8', '2349', '3651', '0'), +('14', '6', '8', '11621', '3631', '0'), +('14', '6', '8', '1409', '2827', '0'), +('14', '6', '6', '1542', '5747', '0'), +('14', '6', '6', '1557', '5371', '0'), +('14', '6', '6', '1905', '5104', '0'), +('14', '6', '6', '1276', '3275', '0'), +('14', '6', '17', '1253', '10184', '0'), +('14', '6', '17', '11641', '9241', '0'), +('14', '6', '17', '1644', '8838', '0'), +('14', '6', '17', '1357', '5607', '0'), +('14', '6', '7', '1362', '3148', '0'), +('14', '6', '7', '1321', '1782', '0'), +('14', '6', '7', '1218', '1726', '0'), +('14', '6', '7', '1248', '1510', '0'), +('14', '6', '9', '12806', '2634', '0'), +('14', '6', '9', '14650', '2424', '0'), +('14', '6', '9', '4344', '2127', '0'), +('14', '6', '9', '10408', '2018', '0'), +('14', '6', '15', '10366', '4854', '0'), +('14', '6', '15', '10151', '4200', '0'), +('14', '6', '15', '10163', '3709', '0'), +('14', '6', '15', '14679', '3360', '0'), +('14', '6', '20', '11666', '12122', '0'), +('14', '6', '20', '2742', '5187', '0'), +('14', '6', '20', '2345', '1624', '0'), +('14', '6', '20', '1217', '1423', '0'), +('14', '6', '12', '2923', '4348', '0'), +('14', '6', '12', '20655', '3908', '0'), +('14', '6', '12', '1404', '2524', '0'), +('14', '6', '12', '1650', '1743', '0'), +('14', '6', '18', '1651', '1726', '0'), +('14', '6', '18', '4410', '1685', '0'), +('14', '6', '18', '1251', '1318', '0'), +('14', '6', '18', '1221', '1234', '0'), +('14', '6', '19', '68239', '2951', '0'), +('14', '6', '19', '1368', '2066', '0'), +('14', '6', '19', '1652', '2046', '0'), +('14', '6', '19', '1252', '1363', '0'), +('14', '6', '13', '14759', '7629', '0'), +('14', '6', '13', '27711', '4493', '0'), +('14', '6', '13', '11625', '3590', '0'), +('14', '6', '13', '13987', '3562', '0'), +('14', '6', '14', '10219', '8362', '0'), +('14', '6', '14', '14759', '7629', '0'), +('14', '6', '14', '11625', '3590', '0'), +('14', '6', '14', '13987', '3562', '0'), +('14', '6', '11', '14762', '3204', '0'), +('14', '6', '11', '9246', '1643', '0'), +('14', '6', '11', '13353', '1500', '0'), +('14', '6', '11', '20677', '1200', '0'), +('14', '7', '22', '10323', '0', '0'), +('14', '7', '22', '9246', '0', '0'), +('14', '7', '22', '21509', '0', '0'), +('14', '7', '22', '8007', '0', '0'), +('14', '7', '1', '14702', '5000', '0'), +('14', '7', '1', '14701', '4624', '0'), +('14', '7', '1', '14559', '2983', '0'), +('14', '7', '1', '30361', '2640', '0'), +('14', '7', '2', '10143', '7136', '0'), +('14', '7', '2', '30363', '3700', '0'), +('14', '7', '2', '1246', '2915', '0'), +('14', '7', '2', '1211', '2758', '0'), +('14', '7', '3', '1275', '3689', '0'), +('14', '7', '3', '1642', '1875', '0'), +('14', '7', '3', '1212', '1457', '0'), +('14', '7', '3', '11052', '1268', '0'), +('14', '7', '5', '14703', '8800', '0'), +('14', '7', '5', '14700', '4836', '0'), +('14', '7', '5', '14558', '4203', '0'), +('14', '7', '5', '10055', '4060', '0'), +('14', '7', '8', '11603', '9132', '0'), +('14', '7', '8', '2349', '3651', '0'), +('14', '7', '8', '11621', '3631', '0'), +('14', '7', '8', '1409', '2827', '0'), +('14', '7', '6', '1542', '5856', '0'), +('14', '7', '6', '1557', '5371', '0'), +('14', '7', '6', '1905', '5111', '0'), +('14', '7', '6', '1276', '3275', '0'), +('14', '7', '17', '1253', '10198', '0'), +('14', '7', '17', '11641', '9422', '0'), +('14', '7', '17', '1644', '8898', '0'), +('14', '7', '17', '1357', '5607', '0'), +('14', '7', '7', '1362', '3148', '0'), +('14', '7', '7', '1218', '1810', '0'), +('14', '7', '7', '1321', '1782', '0'), +('14', '7', '7', '1248', '1595', '0'), +('14', '7', '9', '12806', '2719', '0'), +('14', '7', '9', '14650', '2424', '0'), +('14', '7', '9', '4344', '2127', '0'), +('14', '7', '9', '10408', '2018', '0'), +('14', '7', '15', '10366', '4854', '0'), +('14', '7', '15', '10151', '4200', '0'), +('14', '7', '15', '10163', '3709', '0'), +('14', '7', '15', '14679', '3360', '0'), +('14', '7', '20', '11666', '12132', '0'), +('14', '7', '20', '2742', '5201', '0'), +('14', '7', '20', '2345', '1624', '0'), +('14', '7', '20', '1277', '1462', '0'), +('14', '7', '12', '2923', '4348', '0'), +('14', '7', '12', '20655', '3935', '0'), +('14', '7', '12', '1404', '2524', '0'), +('14', '7', '12', '1650', '1791', '0'), +('14', '7', '18', '1651', '1762', '0'), +('14', '7', '18', '4410', '1685', '0'), +('14', '7', '18', '1251', '1318', '0'), +('14', '7', '18', '1221', '1234', '0'), +('14', '7', '19', '68239', '2988', '0'), +('14', '7', '19', '1368', '2066', '0'), +('14', '7', '19', '1652', '2046', '0'), +('14', '7', '19', '1252', '1363', '0'), +('14', '7', '13', '14759', '7695', '0'), +('14', '7', '13', '27711', '4584', '0'), +('14', '7', '13', '13987', '3623', '0'), +('14', '7', '13', '11625', '3603', '0'), +('14', '7', '14', '10219', '8362', '0'), +('14', '7', '14', '14759', '7695', '0'), +('14', '7', '14', '13987', '3623', '0'), +('14', '7', '14', '11625', '3603', '0'), +('14', '7', '11', '14762', '3204', '0'), +('14', '7', '11', '9246', '1764', '0'), +('14', '7', '11', '13353', '1500', '0'), +('14', '7', '11', '20677', '1200', '0'), +('14', '8', '22', '10323', '0', '0'), +('14', '8', '22', '9246', '0', '0'), +('14', '8', '22', '21509', '0', '0'), +('14', '8', '22', '8007', '0', '0'), +('14', '8', '1', '14702', '5000', '0'), +('14', '8', '1', '14701', '4624', '0'), +('14', '8', '1', '14559', '3032', '0'), +('14', '8', '1', '30361', '2640', '0'), +('14', '8', '2', '10143', '7136', '0'), +('14', '8', '2', '30363', '3700', '0'), +('14', '8', '2', '1246', '2999', '0'), +('14', '8', '2', '1211', '2842', '0'), +('14', '8', '3', '1275', '3761', '0'), +('14', '8', '3', '1642', '1887', '0'), +('14', '8', '3', '1212', '1469', '0'), +('14', '8', '3', '11052', '1450', '0'), +('14', '8', '5', '14703', '8800', '0'), +('14', '8', '5', '14700', '4836', '0'), +('14', '8', '5', '14558', '4271', '0'), +('14', '8', '5', '10055', '4060', '0'), +('14', '8', '8', '11603', '9241', '0'), +('14', '8', '8', '2349', '3651', '0'), +('14', '8', '8', '11621', '3631', '0'), +('14', '8', '8', '1409', '2827', '0'), +('14', '8', '6', '1542', '5965', '0'), +('14', '8', '6', '1557', '5371', '0'), +('14', '8', '6', '1905', '5118', '0'), +('14', '8', '6', '1276', '3275', '0'), +('14', '8', '17', '1253', '10213', '0'), +('14', '8', '17', '11641', '9604', '0'), +('14', '8', '17', '1644', '8958', '0'), +('14', '8', '17', '1357', '5607', '0'), +('14', '8', '7', '1362', '3148', '0'), +('14', '8', '7', '1218', '1895', '0'), +('14', '8', '7', '1321', '1782', '0'), +('14', '8', '7', '1248', '1679', '0'), +('14', '8', '9', '12806', '2803', '0'), +('14', '8', '9', '14650', '2424', '0'), +('14', '8', '9', '4344', '2127', '0'), +('14', '8', '9', '10408', '2018', '0'), +('14', '8', '15', '10366', '4854', '0'), +('14', '8', '15', '10151', '4200', '0'), +('14', '8', '15', '10163', '3709', '0'), +('14', '8', '15', '14679', '3360', '0'), +('14', '8', '20', '11666', '12142', '0'), +('14', '8', '20', '2742', '5216', '0'), +('14', '8', '20', '2345', '1624', '0'), +('14', '8', '20', '1277', '1522', '0'), +('14', '8', '12', '2923', '4348', '0'), +('14', '8', '12', '20655', '3962', '0'), +('14', '8', '12', '1404', '2524', '0'), +('14', '8', '12', '1650', '1840', '0'), +('14', '8', '18', '1651', '1799', '0'), +('14', '8', '18', '4410', '1685', '0'), +('14', '8', '18', '1251', '1318', '0'), +('14', '8', '18', '1221', '1234', '0'), +('14', '8', '19', '68239', '3024', '0'), +('14', '8', '19', '1368', '2066', '0'), +('14', '8', '19', '1652', '2046', '0'), +('14', '8', '19', '1252', '1363', '0'), +('14', '8', '13', '14759', '7760', '0'), +('14', '8', '13', '27711', '4674', '0'), +('14', '8', '13', '13987', '3683', '0'), +('14', '8', '13', '11625', '3616', '0'), +('14', '8', '14', '10219', '8362', '0'), +('14', '8', '14', '14759', '7760', '0'), +('14', '8', '14', '13987', '3683', '0'), +('14', '8', '14', '11625', '3616', '0'), +('14', '8', '11', '14762', '3204', '0'), +('14', '8', '11', '9246', '1884', '0'), +('14', '8', '11', '13353', '1500', '0'), +('14', '8', '11', '20677', '1200', '0'), +('14', '9', '22', '10323', '0', '0'), +('14', '9', '22', '9246', '0', '0'), +('14', '9', '22', '21509', '0', '0'), +('14', '9', '22', '8007', '0', '0'), +('14', '9', '1', '14702', '5000', '0'), +('14', '9', '1', '14701', '4624', '0'), +('14', '9', '1', '14559', '3080', '0'), +('14', '9', '1', '30361', '2640', '0'), +('14', '9', '2', '10143', '7136', '0'), +('14', '9', '2', '30363', '3700', '0'), +('14', '9', '2', '1246', '3084', '0'), +('14', '9', '2', '1211', '2927', '0'), +('14', '9', '3', '1275', '3834', '0'), +('14', '9', '3', '1642', '1899', '0'), +('14', '9', '3', '11052', '1631', '0'), +('14', '9', '3', '1212', '1481', '0'), +('14', '9', '5', '14703', '8800', '0'), +('14', '9', '5', '14700', '4836', '0'), +('14', '9', '5', '14558', '4338', '0'), +('14', '9', '5', '10055', '4060', '0'), +('14', '9', '8', '11603', '9349', '0'), +('14', '9', '8', '2349', '3651', '0'), +('14', '9', '8', '11621', '3631', '0'), +('14', '9', '8', '1409', '2827', '0'), +('14', '9', '6', '1542', '6073', '0'), +('14', '9', '6', '1557', '5371', '0'), +('14', '9', '6', '1905', '5126', '0'), +('14', '9', '6', '1276', '3275', '0'), +('14', '9', '17', '1253', '10227', '0'), +('14', '9', '17', '11641', '9785', '0'), +('14', '9', '17', '1644', '9019', '0'), +('14', '9', '17', '1357', '5607', '0'), +('14', '9', '7', '1362', '3148', '0'), +('14', '9', '7', '1218', '1979', '0'), +('14', '9', '7', '1321', '1782', '0'), +('14', '9', '7', '1248', '1764', '0'), +('14', '9', '9', '12806', '2888', '0'), +('14', '9', '9', '14650', '2424', '0'), +('14', '9', '9', '4344', '2127', '0'), +('14', '9', '9', '10408', '2018', '0'), +('14', '9', '15', '10366', '4854', '0'), +('14', '9', '15', '10151', '4200', '0'), +('14', '9', '15', '10163', '3709', '0'), +('14', '9', '15', '14679', '3360', '0'), +('14', '9', '20', '11666', '12152', '0'), +('14', '9', '20', '2742', '5230', '0'), +('14', '9', '20', '2345', '1624', '0'), +('14', '9', '20', '1277', '1583', '0'), +('14', '9', '12', '2923', '4348', '0'), +('14', '9', '12', '20655', '3989', '0'), +('14', '9', '12', '1404', '2524', '0'), +('14', '9', '12', '1650', '1888', '0'), +('14', '9', '18', '1651', '1835', '0'), +('14', '9', '18', '4410', '1685', '0'), +('14', '9', '18', '1251', '1318', '0'), +('14', '9', '18', '1221', '1234', '0'), +('14', '9', '19', '68239', '3060', '0'), +('14', '9', '19', '1368', '2066', '0'), +('14', '9', '19', '1652', '2046', '0'), +('14', '9', '19', '1252', '1363', '0'), +('14', '9', '13', '14759', '7825', '0'), +('14', '9', '13', '27711', '4765', '0'), +('14', '9', '13', '13987', '3744', '0'), +('14', '9', '13', '11625', '3629', '0'), +('14', '9', '14', '10219', '8362', '0'), +('14', '9', '14', '14759', '7825', '0'), +('14', '9', '14', '13987', '3744', '0'), +('14', '9', '14', '11625', '3629', '0'), +('14', '9', '11', '14762', '3204', '0'), +('14', '9', '11', '9246', '2005', '0'), +('14', '9', '11', '13353', '1500', '0'), +('14', '9', '11', '20677', '1200', '0'), +('14', '10', '22', '10323', '0', '0'), +('14', '10', '22', '9246', '0', '0'), +('14', '10', '22', '21509', '0', '0'), +('14', '10', '22', '8007', '0', '0'), +('14', '10', '1', '14702', '5000', '0'), +('14', '10', '1', '14701', '4624', '0'), +('14', '10', '1', '14559', '3128', '0'), +('14', '10', '1', '30361', '2640', '0'), +('14', '10', '2', '10143', '7136', '0'), +('14', '10', '2', '30363', '3700', '0'), +('14', '10', '2', '1246', '3168', '0'), +('14', '10', '2', '1211', '3012', '0'), +('14', '10', '3', '1275', '3906', '0'), +('14', '10', '3', '1642', '1911', '0'), +('14', '10', '3', '11052', '1812', '0'), +('14', '10', '3', '1212', '1493', '0'), +('14', '10', '5', '14703', '8800', '0'), +('14', '10', '5', '14700', '4836', '0'), +('14', '10', '5', '14558', '4406', '0'), +('14', '10', '5', '10055', '4060', '0'), +('14', '10', '8', '11603', '9458', '0'), +('14', '10', '8', '2349', '3651', '0'), +('14', '10', '8', '11621', '3631', '0'), +('14', '10', '8', '1409', '2827', '0'), +('14', '10', '6', '1542', '6182', '0'), +('14', '10', '6', '1557', '5371', '0'), +('14', '10', '6', '1905', '5133', '0'), +('14', '10', '6', '1276', '3275', '0'), +('14', '10', '17', '1253', '10242', '0'), +('14', '10', '17', '11641', '9966', '0'), +('14', '10', '17', '1644', '9079', '0'), +('14', '10', '17', '1357', '5607', '0'), +('14', '10', '7', '1362', '3148', '0'), +('14', '10', '7', '1218', '2064', '0'), +('14', '10', '7', '1248', '1848', '0'), +('14', '10', '7', '1321', '1782', '0'), +('14', '10', '9', '12806', '2972', '0'), +('14', '10', '9', '14650', '2424', '0'), +('14', '10', '9', '4344', '2127', '0'), +('14', '10', '9', '10408', '2018', '0'), +('14', '10', '15', '10366', '4854', '0'), +('14', '10', '15', '10151', '4200', '0'), +('14', '10', '15', '10163', '3709', '0'), +('14', '10', '15', '14679', '3360', '0'), +('14', '10', '20', '11666', '12162', '0'), +('14', '10', '20', '2742', '5245', '0'), +('14', '10', '20', '1277', '1643', '0'), +('14', '10', '20', '2345', '1624', '0'), +('14', '10', '12', '2923', '4348', '0'), +('14', '10', '12', '20655', '4016', '0'), +('14', '10', '12', '1404', '2524', '0'), +('14', '10', '12', '1650', '1936', '0'), +('14', '10', '18', '1651', '1871', '0'), +('14', '10', '18', '4410', '1685', '0'), +('14', '10', '18', '1251', '1318', '0'), +('14', '10', '18', '1221', '1234', '0'), +('14', '10', '19', '68239', '3096', '0'), +('14', '10', '19', '1368', '2066', '0'), +('14', '10', '19', '1652', '2046', '0'), +('14', '10', '19', '1252', '1363', '0'), +('14', '10', '13', '14759', '7890', '0'), +('14', '10', '13', '27711', '4856', '0'), +('14', '10', '13', '13987', '3804', '0'), +('14', '10', '13', '11625', '3642', '0'), +('14', '10', '14', '10219', '8362', '0'), +('14', '10', '14', '14759', '7890', '0'), +('14', '10', '14', '13987', '3804', '0'), +('14', '10', '14', '11625', '3642', '0'), +('14', '10', '11', '14762', '3204', '0'), +('14', '10', '11', '9246', '2126', '0'), +('14', '10', '11', '13353', '1500', '0'), +('14', '10', '11', '20677', '1200', '0'), +('14', '11', '22', '10323', '0', '0'), +('14', '11', '22', '9246', '0', '0'), +('14', '11', '22', '21509', '0', '0'), +('14', '11', '22', '8007', '0', '0'), +('14', '11', '1', '14702', '5000', '0'), +('14', '11', '1', '14701', '4624', '0'), +('14', '11', '1', '14559', '3176', '0'), +('14', '11', '1', '30361', '2640', '0'), +('14', '11', '2', '10143', '7136', '0'), +('14', '11', '2', '30363', '3700', '0'), +('14', '11', '2', '1246', '3253', '0'), +('14', '11', '2', '1211', '3096', '0'), +('14', '11', '3', '1275', '3978', '0'), +('14', '11', '3', '11052', '1993', '0'), +('14', '11', '3', '1642', '1923', '0'), +('14', '11', '3', '1212', '1505', '0'), +('14', '11', '5', '14703', '8800', '0'), +('14', '11', '5', '14700', '4836', '0'), +('14', '11', '5', '14558', '4474', '0'), +('14', '11', '5', '10055', '4060', '0'), +('14', '11', '8', '11603', '9567', '0'), +('14', '11', '8', '2349', '3651', '0'), +('14', '11', '8', '11621', '3631', '0'), +('14', '11', '8', '1409', '2827', '0'), +('14', '11', '6', '1542', '6291', '0'), +('14', '11', '6', '1557', '5371', '0'), +('14', '11', '6', '1905', '5140', '0'), +('14', '11', '6', '1276', '3275', '0'), +('14', '11', '17', '1253', '10256', '0'), +('14', '11', '17', '11641', '10147', '0'), +('14', '11', '17', '1644', '9140', '0'), +('14', '11', '17', '1357', '5607', '0'), +('14', '11', '7', '1362', '3148', '0'), +('14', '11', '7', '1218', '2148', '0'), +('14', '11', '7', '1248', '1933', '0'), +('14', '11', '7', '1321', '1782', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '11', '9', '12806', '3057', '0'), +('14', '11', '9', '14650', '2424', '0'), +('14', '11', '9', '4344', '2127', '0'), +('14', '11', '9', '10408', '2018', '0'), +('14', '11', '15', '10366', '4854', '0'), +('14', '11', '15', '10151', '4200', '0'), +('14', '11', '15', '10163', '3709', '0'), +('14', '11', '15', '14679', '3360', '0'), +('14', '11', '20', '11666', '12173', '0'), +('14', '11', '20', '2742', '5259', '0'), +('14', '11', '20', '1277', '1703', '0'), +('14', '11', '20', '2345', '1624', '0'), +('14', '11', '12', '2923', '4348', '0'), +('14', '11', '12', '20655', '4043', '0'), +('14', '11', '12', '1404', '2524', '0'), +('14', '11', '12', '1650', '1985', '0'), +('14', '11', '18', '1651', '1907', '0'), +('14', '11', '18', '4410', '1685', '0'), +('14', '11', '18', '1251', '1318', '0'), +('14', '11', '18', '1221', '1234', '0'), +('14', '11', '19', '68239', '3132', '0'), +('14', '11', '19', '1368', '2066', '0'), +('14', '11', '19', '1652', '2046', '0'), +('14', '11', '19', '1252', '1363', '0'), +('14', '11', '13', '14759', '7955', '0'), +('14', '11', '13', '27711', '4946', '0'), +('14', '11', '13', '13987', '3864', '0'), +('14', '11', '13', '11625', '3656', '0'), +('14', '11', '14', '10219', '8362', '0'), +('14', '11', '14', '14759', '7955', '0'), +('14', '11', '14', '13987', '3864', '0'), +('14', '11', '14', '11625', '3656', '0'), +('14', '11', '11', '14762', '3204', '0'), +('14', '11', '11', '9246', '2247', '0'), +('14', '11', '11', '13353', '1500', '0'), +('14', '11', '11', '20677', '1200', '0'), +('14', '12', '22', '10323', '0', '0'), +('14', '12', '22', '9246', '0', '0'), +('14', '12', '22', '21509', '0', '0'), +('14', '12', '22', '8007', '0', '0'), +('14', '12', '1', '14702', '5000', '0'), +('14', '12', '1', '14701', '4624', '0'), +('14', '12', '1', '14559', '3225', '0'), +('14', '12', '1', '30361', '2640', '0'), +('14', '12', '2', '10143', '7136', '0'), +('14', '12', '2', '30363', '3700', '0'), +('14', '12', '2', '1246', '3338', '0'), +('14', '12', '2', '1211', '3181', '0'), +('14', '12', '3', '1275', '4051', '0'), +('14', '12', '3', '11052', '2174', '0'), +('14', '12', '3', '1642', '1936', '0'), +('14', '12', '3', '1212', '1517', '0'), +('14', '12', '5', '14703', '8800', '0'), +('14', '12', '5', '14700', '4836', '0'), +('14', '12', '5', '14558', '4541', '0'), +('14', '12', '5', '10055', '4060', '0'), +('14', '12', '8', '11603', '9675', '0'), +('14', '12', '8', '2349', '3651', '0'), +('14', '12', '8', '11621', '3631', '0'), +('14', '12', '8', '1409', '2827', '0'), +('14', '12', '6', '1542', '6399', '0'), +('14', '12', '6', '1557', '5371', '0'), +('14', '12', '6', '1905', '5147', '0'), +('14', '12', '6', '1276', '3275', '0'), +('14', '12', '17', '11641', '10328', '0'), +('14', '12', '17', '1253', '10271', '0'), +('14', '12', '17', '1644', '9200', '0'), +('14', '12', '17', '1247', '5751', '0'), +('14', '12', '7', '1362', '3148', '0'), +('14', '12', '7', '1218', '2233', '0'), +('14', '12', '7', '1248', '2017', '0'), +('14', '12', '7', '1321', '1782', '0'), +('14', '12', '9', '12806', '3142', '0'), +('14', '12', '9', '14650', '2424', '0'), +('14', '12', '9', '4344', '2127', '0'), +('14', '12', '9', '1649', '2025', '0'), +('14', '12', '15', '10366', '4854', '0'), +('14', '12', '15', '10151', '4200', '0'), +('14', '12', '15', '10163', '3709', '0'), +('14', '12', '15', '14679', '3360', '0'), +('14', '12', '20', '11666', '12183', '0'), +('14', '12', '20', '2742', '5274', '0'), +('14', '12', '20', '1277', '1764', '0'), +('14', '12', '20', '2345', '1624', '0'), +('14', '12', '12', '2923', '4348', '0'), +('14', '12', '12', '20655', '4070', '0'), +('14', '12', '12', '1404', '2524', '0'), +('14', '12', '12', '1250', '2050', '0'), +('14', '12', '18', '1651', '1944', '0'), +('14', '12', '18', '4410', '1685', '0'), +('14', '12', '18', '1251', '1318', '0'), +('14', '12', '18', '1221', '1234', '0'), +('14', '12', '19', '68239', '3169', '0'), +('14', '12', '19', '1368', '2066', '0'), +('14', '12', '19', '1652', '2046', '0'), +('14', '12', '19', '4407', '1395', '0'), +('14', '12', '13', '14759', '8021', '0'), +('14', '12', '13', '27711', '5037', '0'), +('14', '12', '13', '13987', '3925', '0'), +('14', '12', '13', '11625', '3669', '0'), +('14', '12', '14', '10219', '8362', '0'), +('14', '12', '14', '14759', '8021', '0'), +('14', '12', '14', '13987', '3925', '0'), +('14', '12', '14', '11625', '3669', '0'), +('14', '12', '11', '14762', '3204', '0'), +('14', '12', '11', '9246', '2368', '0'), +('14', '12', '11', '13353', '1500', '0'), +('14', '12', '11', '20677', '1200', '0'), +('14', '13', '22', '10323', '0', '0'), +('14', '13', '22', '9246', '0', '0'), +('14', '13', '22', '21509', '0', '0'), +('14', '13', '22', '8007', '0', '0'), +('14', '13', '1', '14702', '5000', '0'), +('14', '13', '1', '14701', '4624', '0'), +('14', '13', '1', '14559', '3273', '0'), +('14', '13', '1', '30361', '2640', '0'), +('14', '13', '2', '10143', '7136', '0'), +('14', '13', '2', '30363', '3700', '0'), +('14', '13', '2', '1246', '3422', '0'), +('14', '13', '2', '1211', '3265', '0'), +('14', '13', '3', '1275', '4123', '0'), +('14', '13', '3', '11052', '2356', '0'), +('14', '13', '3', '1642', '1948', '0'), +('14', '13', '3', '1212', '1530', '0'), +('14', '13', '5', '14703', '8800', '0'), +('14', '13', '5', '14700', '4836', '0'), +('14', '13', '5', '14558', '4609', '0'), +('14', '13', '5', '10055', '4060', '0'), +('14', '13', '8', '11603', '9784', '0'), +('14', '13', '8', '2349', '3651', '0'), +('14', '13', '8', '11621', '3631', '0'), +('14', '13', '8', '1409', '2827', '0'), +('14', '13', '6', '1542', '6508', '0'), +('14', '13', '6', '1557', '5371', '0'), +('14', '13', '6', '1905', '5155', '0'), +('14', '13', '6', '1276', '3275', '0'), +('14', '13', '17', '11641', '10510', '0'), +('14', '13', '17', '1253', '10285', '0'), +('14', '13', '17', '1644', '9260', '0'), +('14', '13', '17', '1214', '5925', '0'), +('14', '13', '7', '1362', '3148', '0'), +('14', '13', '7', '1218', '2318', '0'), +('14', '13', '7', '1248', '2102', '0'), +('14', '13', '7', '1321', '1782', '0'), +('14', '13', '9', '12806', '3226', '0'), +('14', '13', '9', '14650', '2424', '0'), +('14', '13', '9', '4344', '2127', '0'), +('14', '13', '9', '1649', '2062', '0'), +('14', '13', '15', '10366', '4854', '0'), +('14', '13', '15', '10151', '4200', '0'), +('14', '13', '15', '10163', '3709', '0'), +('14', '13', '15', '14679', '3360', '0'), +('14', '13', '20', '11666', '12193', '0'), +('14', '13', '20', '2742', '5288', '0'), +('14', '13', '20', '1277', '1824', '0'), +('14', '13', '20', '2345', '1624', '0'), +('14', '13', '12', '2923', '4348', '0'), +('14', '13', '12', '20655', '4097', '0'), +('14', '13', '12', '1404', '2524', '0'), +('14', '13', '12', '1250', '2147', '0'), +('14', '13', '18', '1651', '1980', '0'), +('14', '13', '18', '4410', '1685', '0'), +('14', '13', '18', '1251', '1318', '0'), +('14', '13', '18', '1221', '1234', '0'), +('14', '13', '19', '68239', '3205', '0'), +('14', '13', '19', '1368', '2066', '0'), +('14', '13', '19', '1652', '2046', '0'), +('14', '13', '19', '4407', '1504', '0'), +('14', '13', '13', '14759', '8086', '0'), +('14', '13', '13', '27711', '5127', '0'), +('14', '13', '13', '13987', '3985', '0'), +('14', '13', '13', '11625', '3682', '0'), +('14', '13', '14', '10219', '8362', '0'), +('14', '13', '14', '14759', '8086', '0'), +('14', '13', '14', '13987', '3985', '0'), +('14', '13', '14', '11625', '3682', '0'), +('14', '13', '11', '14762', '3204', '0'), +('14', '13', '11', '9246', '2488', '0'), +('14', '13', '11', '13353', '1500', '0'), +('14', '13', '11', '20677', '1200', '0'), +('14', '14', '22', '10323', '0', '0'), +('14', '14', '22', '9246', '0', '0'), +('14', '14', '22', '21509', '0', '0'), +('14', '14', '22', '8007', '0', '0'), +('14', '14', '1', '14702', '5000', '0'), +('14', '14', '1', '14701', '4624', '0'), +('14', '14', '1', '14559', '3321', '0'), +('14', '14', '1', '30361', '2640', '0'), +('14', '14', '2', '10143', '7136', '0'), +('14', '14', '2', '30363', '3700', '0'), +('14', '14', '2', '1246', '3507', '0'), +('14', '14', '2', '1211', '3350', '0'), +('14', '14', '3', '1275', '4196', '0'), +('14', '14', '3', '11052', '2537', '0'), +('14', '14', '3', '1642', '1960', '0'), +('14', '14', '3', '1212', '1542', '0'), +('14', '14', '5', '14703', '8800', '0'), +('14', '14', '5', '14700', '4836', '0'), +('14', '14', '5', '14558', '4677', '0'), +('14', '14', '5', '10055', '4060', '0'), +('14', '14', '8', '11603', '9893', '0'), +('14', '14', '8', '2349', '3651', '0'), +('14', '14', '8', '11621', '3631', '0'), +('14', '14', '8', '1409', '2827', '0'), +('14', '14', '6', '1542', '6617', '0'), +('14', '14', '6', '1557', '5371', '0'), +('14', '14', '6', '1905', '5162', '0'), +('14', '14', '6', '1276', '3275', '0'), +('14', '14', '17', '11641', '10691', '0'), +('14', '14', '17', '1253', '10300', '0'), +('14', '14', '17', '1644', '9321', '0'), +('14', '14', '17', '1214', '6101', '0'), +('14', '14', '7', '1362', '3148', '0'), +('14', '14', '7', '1218', '2402', '0'), +('14', '14', '7', '1248', '2187', '0'), +('14', '14', '7', '1321', '1782', '0'), +('14', '14', '9', '12806', '3311', '0'), +('14', '14', '9', '14650', '2424', '0'), +('14', '14', '9', '4344', '2127', '0'), +('14', '14', '9', '1649', '2098', '0'), +('14', '14', '15', '10366', '4854', '0'), +('14', '14', '15', '10151', '4200', '0'), +('14', '14', '15', '10163', '3709', '0'), +('14', '14', '15', '14679', '3360', '0'), +('14', '14', '20', '11666', '12203', '0'), +('14', '14', '20', '2742', '5303', '0'), +('14', '14', '20', '1277', '1885', '0'), +('14', '14', '20', '2345', '1624', '0'), +('14', '14', '12', '2923', '4348', '0'), +('14', '14', '12', '20655', '4124', '0'), +('14', '14', '12', '1404', '2524', '0'), +('14', '14', '12', '1250', '2244', '0'), +('14', '14', '18', '1651', '2016', '0'), +('14', '14', '18', '4410', '1685', '0'), +('14', '14', '18', '1251', '1318', '0'), +('14', '14', '18', '1221', '1234', '0'), +('14', '14', '19', '68239', '3241', '0'), +('14', '14', '19', '1368', '2066', '0'), +('14', '14', '19', '1652', '2046', '0'), +('14', '14', '19', '4407', '1612', '0'), +('14', '14', '13', '14759', '8151', '0'), +('14', '14', '13', '27711', '5218', '0'), +('14', '14', '13', '13987', '4046', '0'), +('14', '14', '13', '11625', '3695', '0'), +('14', '14', '14', '10219', '8362', '0'), +('14', '14', '14', '14759', '8151', '0'), +('14', '14', '14', '13987', '4046', '0'), +('14', '14', '14', '11625', '3695', '0'), +('14', '14', '11', '14762', '3204', '0'), +('14', '14', '11', '9246', '2609', '0'), +('14', '14', '11', '13353', '1500', '0'), +('14', '14', '11', '20677', '1200', '0'), +('14', '15', '22', '10323', '0', '0'), +('14', '15', '22', '9246', '0', '0'), +('14', '15', '22', '21509', '0', '0'), +('14', '15', '22', '8007', '0', '0'), +('14', '15', '1', '14702', '5000', '0'), +('14', '15', '1', '14701', '4624', '0'), +('14', '15', '1', '14559', '3370', '0'), +('14', '15', '1', '30361', '2640', '0'), +('14', '15', '2', '10143', '7136', '0'), +('14', '15', '2', '30363', '3700', '0'), +('14', '15', '2', '1246', '3591', '0'), +('14', '15', '2', '1211', '3434', '0'), +('14', '15', '3', '1275', '4268', '0'), +('14', '15', '3', '11052', '2718', '0'), +('14', '15', '3', '1642', '1972', '0'), +('14', '15', '3', '1212', '1554', '0'), +('14', '15', '5', '14703', '8800', '0'), +('14', '15', '5', '14700', '4836', '0'), +('14', '15', '5', '14558', '4744', '0'), +('14', '15', '5', '10055', '4060', '0'), +('14', '15', '8', '11603', '10002', '0'), +('14', '15', '8', '2349', '3651', '0'), +('14', '15', '8', '11621', '3631', '0'), +('14', '15', '8', '1409', '2827', '0'), +('14', '15', '6', '1542', '6726', '0'), +('14', '15', '6', '1557', '5371', '0'), +('14', '15', '6', '1905', '5169', '0'), +('14', '15', '6', '1276', '3275', '0'), +('14', '15', '17', '11641', '10872', '0'), +('14', '15', '17', '1253', '10314', '0'), +('14', '15', '17', '1644', '9381', '0'), +('14', '15', '17', '1214', '6277', '0'), +('14', '15', '7', '1362', '3148', '0'), +('14', '15', '7', '1218', '2487', '0'), +('14', '15', '7', '1248', '2271', '0'), +('14', '15', '7', '1321', '1782', '0'), +('14', '15', '9', '12806', '3395', '0'), +('14', '15', '9', '14650', '2424', '0'), +('14', '15', '9', '1649', '2134', '0'), +('14', '15', '9', '4344', '2127', '0'), +('14', '15', '15', '10366', '4854', '0'), +('14', '15', '15', '10151', '4200', '0'), +('14', '15', '15', '10163', '3709', '0'), +('14', '15', '15', '14679', '3360', '0'), +('14', '15', '20', '11666', '12213', '0'), +('14', '15', '20', '2742', '5317', '0'), +('14', '15', '20', '1277', '1945', '0'), +('14', '15', '20', '2345', '1624', '0'), +('14', '15', '12', '2923', '4348', '0'), +('14', '15', '12', '20655', '4151', '0'), +('14', '15', '12', '1404', '2524', '0'), +('14', '15', '12', '1250', '2340', '0'), +('14', '15', '18', '1651', '2052', '0'), +('14', '15', '18', '4410', '1685', '0'), +('14', '15', '18', '1251', '1318', '0'), +('14', '15', '18', '1221', '1234', '0'), +('14', '15', '19', '68239', '3277', '0'), +('14', '15', '19', '1368', '2066', '0'), +('14', '15', '19', '1652', '2046', '0'), +('14', '15', '19', '4407', '1721', '0'), +('14', '15', '13', '14759', '8216', '0'), +('14', '15', '13', '27711', '5309', '0'), +('14', '15', '13', '13987', '4106', '0'), +('14', '15', '13', '13400', '3725', '0'), +('14', '15', '14', '10219', '8362', '0'), +('14', '15', '14', '14759', '8216', '0'), +('14', '15', '14', '13987', '4106', '0'), +('14', '15', '14', '9401', '3735', '0'), +('14', '15', '11', '14762', '3204', '0'), +('14', '15', '11', '9246', '2730', '0'), +('14', '15', '11', '13353', '1500', '0'), +('14', '15', '11', '20677', '1200', '0'), +('14', '16', '22', '10323', '0', '0'), +('14', '16', '22', '9246', '0', '0'), +('14', '16', '22', '21509', '0', '0'), +('14', '16', '22', '8007', '0', '0'), +('14', '16', '1', '14702', '5000', '0'), +('14', '16', '1', '14701', '4624', '0'), +('14', '16', '1', '14559', '3418', '0'), +('14', '16', '1', '30361', '2640', '0'), +('14', '16', '2', '10143', '7136', '0'), +('14', '16', '2', '30363', '3700', '0'), +('14', '16', '2', '1246', '3676', '0'), +('14', '16', '2', '1211', '3519', '0'), +('14', '16', '3', '1275', '4341', '0'), +('14', '16', '3', '11052', '2899', '0'), +('14', '16', '3', '1642', '1984', '0'), +('14', '16', '3', '1212', '1566', '0'), +('14', '16', '5', '14703', '8800', '0'), +('14', '16', '5', '14700', '4836', '0'), +('14', '16', '5', '14558', '4812', '0'), +('14', '16', '5', '10055', '4060', '0'), +('14', '16', '8', '11603', '10110', '0'), +('14', '16', '8', '2349', '3651', '0'), +('14', '16', '8', '11621', '3631', '0'), +('14', '16', '8', '1409', '2827', '0'), +('14', '16', '6', '1542', '6834', '0'), +('14', '16', '6', '1557', '5371', '0'), +('14', '16', '6', '1905', '5176', '0'), +('14', '16', '6', '1276', '3275', '0'), +('14', '16', '17', '11641', '11053', '0'), +('14', '16', '17', '1253', '10329', '0'), +('14', '16', '17', '1644', '9442', '0'), +('14', '16', '17', '1214', '6452', '0'), +('14', '16', '7', '1362', '3148', '0'), +('14', '16', '7', '1218', '2571', '0'), +('14', '16', '7', '1248', '2356', '0'), +('14', '16', '7', '1648', '1815', '0'), +('14', '16', '9', '12806', '3480', '0'), +('14', '16', '9', '14650', '2424', '0'), +('14', '16', '9', '1649', '2170', '0'), +('14', '16', '9', '4344', '2127', '0'), +('14', '16', '15', '10366', '4854', '0'), +('14', '16', '15', '10151', '4200', '0'), +('14', '16', '15', '10163', '3709', '0'), +('14', '16', '15', '14679', '3360', '0'), +('14', '16', '20', '11666', '12223', '0'), +('14', '16', '20', '2742', '5332', '0'), +('14', '16', '20', '1277', '2005', '0'), +('14', '16', '20', '2345', '1624', '0'), +('14', '16', '12', '2923', '4348', '0'), +('14', '16', '12', '20655', '4178', '0'), +('14', '16', '12', '1404', '2524', '0'), +('14', '16', '12', '1250', '2437', '0'), +('14', '16', '18', '1651', '2089', '0'), +('14', '16', '18', '4410', '1685', '0'), +('14', '16', '18', '1251', '1318', '0'), +('14', '16', '18', '1221', '1234', '0'), +('14', '16', '19', '68239', '3314', '0'), +('14', '16', '19', '1368', '2066', '0'), +('14', '16', '19', '1652', '2046', '0'), +('14', '16', '19', '4407', '1830', '0'), +('14', '16', '13', '14759', '8282', '0'), +('14', '16', '13', '27711', '5399', '0'), +('14', '16', '13', '13987', '4166', '0'), +('14', '16', '13', '13400', '3773', '0'), +('14', '16', '14', '10219', '8362', '0'), +('14', '16', '14', '14759', '8282', '0'), +('14', '16', '14', '13987', '4166', '0'), +('14', '16', '14', '9401', '3820', '0'), +('14', '16', '11', '14762', '3204', '0'), +('14', '16', '11', '9246', '2851', '0'), +('14', '16', '11', '13353', '1500', '0'), +('14', '16', '11', '20677', '1200', '0'), +('14', '17', '22', '10323', '0', '0'), +('14', '17', '22', '9246', '0', '0'), +('14', '17', '22', '21509', '0', '0'), +('14', '17', '22', '8007', '0', '0'), +('14', '17', '1', '14702', '5000', '0'), +('14', '17', '1', '14701', '4624', '0'), +('14', '17', '1', '14559', '3466', '0'), +('14', '17', '1', '30361', '2640', '0'), +('14', '17', '2', '10143', '7136', '0'), +('14', '17', '2', '1246', '3760', '0'), +('14', '17', '2', '30363', '3700', '0'), +('14', '17', '2', '1211', '3603', '0'), +('14', '17', '3', '1275', '4413', '0'), +('14', '17', '3', '11052', '3080', '0'), +('14', '17', '3', '1642', '1996', '0'), +('14', '17', '3', '1212', '1578', '0'), +('14', '17', '5', '14703', '8800', '0'), +('14', '17', '5', '14558', '4880', '0'), +('14', '17', '5', '14700', '4836', '0'), +('14', '17', '5', '10055', '4060', '0'), +('14', '17', '8', '11603', '10219', '0'), +('14', '17', '8', '2349', '3651', '0'), +('14', '17', '8', '11621', '3631', '0'), +('14', '17', '8', '1409', '2827', '0'), +('14', '17', '6', '1542', '6943', '0'), +('14', '17', '6', '1557', '5371', '0'), +('14', '17', '6', '1905', '5184', '0'), +('14', '17', '6', '1276', '3275', '0'), +('14', '17', '17', '11641', '11234', '0'), +('14', '17', '17', '1253', '10343', '0'), +('14', '17', '17', '1644', '9502', '0'), +('14', '17', '17', '1214', '6628', '0'), +('14', '17', '7', '1362', '3148', '0'), +('14', '17', '7', '1218', '2656', '0'), +('14', '17', '7', '1248', '2440', '0'), +('14', '17', '7', '1648', '1875', '0'), +('14', '17', '9', '12806', '3564', '0'), +('14', '17', '9', '14650', '2424', '0'), +('14', '17', '9', '1649', '2207', '0'), +('14', '17', '9', '4344', '2127', '0'), +('14', '17', '15', '10366', '4854', '0'), +('14', '17', '15', '10151', '4200', '0'), +('14', '17', '15', '10163', '3709', '0'), +('14', '17', '15', '14679', '3360', '0'), +('14', '17', '20', '11666', '12234', '0'), +('14', '17', '20', '2742', '5346', '0'), +('14', '17', '20', '1277', '2066', '0'), +('14', '17', '20', '2345', '1624', '0'), +('14', '17', '12', '2923', '4348', '0'), +('14', '17', '12', '20655', '4205', '0'), +('14', '17', '12', '1250', '2533', '0'), +('14', '17', '12', '1404', '2524', '0'), +('14', '17', '18', '1651', '2125', '0'), +('14', '17', '18', '4410', '1685', '0'), +('14', '17', '18', '1251', '1318', '0'), +('14', '17', '18', '1221', '1234', '0'), +('14', '17', '19', '68239', '3350', '0'), +('14', '17', '19', '1368', '2066', '0'), +('14', '17', '19', '1652', '2046', '0'), +('14', '17', '19', '4407', '1939', '0'), +('14', '17', '13', '14759', '8347', '0'), +('14', '17', '13', '27711', '5490', '0'), +('14', '17', '13', '13987', '4227', '0'), +('14', '17', '13', '13400', '3821', '0'), +('14', '17', '14', '10219', '8362', '0'), +('14', '17', '14', '14759', '8347', '0'), +('14', '17', '14', '13987', '4227', '0'), +('14', '17', '14', '9401', '3904', '0'), +('14', '17', '11', '14762', '3204', '0'), +('14', '17', '11', '9246', '2972', '0'), +('14', '17', '11', '13353', '1500', '0'), +('14', '17', '11', '20677', '1200', '0'), +('14', '18', '22', '10323', '0', '0'), +('14', '18', '22', '9246', '0', '0'), +('14', '18', '22', '21509', '0', '0'), +('14', '18', '22', '8007', '0', '0'), +('14', '18', '1', '14702', '5000', '0'), +('14', '18', '1', '14701', '4624', '0'), +('14', '18', '1', '14559', '3515', '0'), +('14', '18', '1', '30361', '2640', '0'), +('14', '18', '2', '10143', '7136', '0'), +('14', '18', '2', '1246', '3845', '0'), +('14', '18', '2', '30363', '3700', '0'), +('14', '18', '2', '1211', '3688', '0'), +('14', '18', '3', '1275', '4486', '0'), +('14', '18', '3', '11052', '3262', '0'), +('14', '18', '3', '1642', '2008', '0'), +('14', '18', '3', '1212', '1590', '0'), +('14', '18', '5', '14703', '8800', '0'), +('14', '18', '5', '14558', '4947', '0'), +('14', '18', '5', '14700', '4836', '0'), +('14', '18', '5', '10055', '4060', '0'), +('14', '18', '8', '11603', '10328', '0'), +('14', '18', '8', '2349', '3651', '0'), +('14', '18', '8', '11621', '3631', '0'), +('14', '18', '8', '1409', '2827', '0'), +('14', '18', '6', '1542', '7052', '0'), +('14', '18', '6', '1557', '5371', '0'), +('14', '18', '6', '1905', '5191', '0'), +('14', '18', '6', '1276', '3275', '0'), +('14', '18', '17', '11641', '11416', '0'), +('14', '18', '17', '1253', '10358', '0'), +('14', '18', '17', '1644', '9562', '0'), +('14', '18', '17', '1214', '6804', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '18', '7', '1362', '3148', '0'), +('14', '18', '7', '1218', '2740', '0'), +('14', '18', '7', '1248', '2525', '0'), +('14', '18', '7', '1648', '1936', '0'), +('14', '18', '9', '12806', '3649', '0'), +('14', '18', '9', '14650', '2424', '0'), +('14', '18', '9', '1649', '2243', '0'), +('14', '18', '9', '4344', '2127', '0'), +('14', '18', '15', '10366', '4854', '0'), +('14', '18', '15', '10151', '4200', '0'), +('14', '18', '15', '10163', '3709', '0'), +('14', '18', '15', '14679', '3360', '0'), +('14', '18', '20', '11666', '12244', '0'), +('14', '18', '20', '2742', '5361', '0'), +('14', '18', '20', '1277', '2126', '0'), +('14', '18', '20', '2345', '1624', '0'), +('14', '18', '12', '2923', '4348', '0'), +('14', '18', '12', '20655', '4232', '0'), +('14', '18', '12', '1250', '2630', '0'), +('14', '18', '12', '1404', '2524', '0'), +('14', '18', '18', '1651', '2161', '0'), +('14', '18', '18', '4410', '1685', '0'), +('14', '18', '18', '1251', '1318', '0'), +('14', '18', '18', '1221', '1234', '0'), +('14', '18', '19', '68239', '3386', '0'), +('14', '18', '19', '1368', '2066', '0'), +('14', '18', '19', '4407', '2047', '0'), +('14', '18', '19', '1652', '2046', '0'), +('14', '18', '13', '14759', '8412', '0'), +('14', '18', '13', '27711', '5580', '0'), +('14', '18', '13', '13987', '4287', '0'), +('14', '18', '13', '13400', '3870', '0'), +('14', '18', '14', '14759', '8412', '0'), +('14', '18', '14', '10219', '8362', '0'), +('14', '18', '14', '13987', '4287', '0'), +('14', '18', '14', '9401', '3989', '0'), +('14', '18', '11', '14762', '3204', '0'), +('14', '18', '11', '9246', '3092', '0'), +('14', '18', '11', '13353', '1500', '0'), +('14', '18', '11', '20677', '1200', '0'), +('14', '19', '22', '10323', '0', '0'), +('14', '19', '22', '9246', '0', '0'), +('14', '19', '22', '21509', '0', '0'), +('14', '19', '22', '8007', '0', '0'), +('14', '19', '1', '14702', '5000', '0'), +('14', '19', '1', '14701', '4624', '0'), +('14', '19', '1', '14559', '3563', '0'), +('14', '19', '1', '30361', '2640', '0'), +('14', '19', '2', '10143', '7136', '0'), +('14', '19', '2', '1246', '3929', '0'), +('14', '19', '2', '1211', '3773', '0'), +('14', '19', '2', '30363', '3700', '0'), +('14', '19', '3', '1275', '4558', '0'), +('14', '19', '3', '11052', '3443', '0'), +('14', '19', '3', '1642', '2020', '0'), +('14', '19', '3', '4505', '1667', '0'), +('14', '19', '5', '14703', '8800', '0'), +('14', '19', '5', '14558', '5015', '0'), +('14', '19', '5', '14700', '4836', '0'), +('14', '19', '5', '10055', '4060', '0'), +('14', '19', '8', '11603', '10436', '0'), +('14', '19', '8', '2349', '3651', '0'), +('14', '19', '8', '11621', '3631', '0'), +('14', '19', '8', '1409', '2827', '0'), +('14', '19', '6', '1542', '7160', '0'), +('14', '19', '6', '1557', '5371', '0'), +('14', '19', '6', '1905', '5198', '0'), +('14', '19', '6', '1276', '3275', '0'), +('14', '19', '17', '11641', '11597', '0'), +('14', '19', '17', '1253', '10372', '0'), +('14', '19', '17', '1644', '9623', '0'), +('14', '19', '17', '1214', '6980', '0'), +('14', '19', '7', '1362', '3148', '0'), +('14', '19', '7', '1218', '2825', '0'), +('14', '19', '7', '1248', '2609', '0'), +('14', '19', '7', '1648', '1996', '0'), +('14', '19', '9', '12806', '3733', '0'), +('14', '19', '9', '14650', '2424', '0'), +('14', '19', '9', '1649', '2279', '0'), +('14', '19', '9', '4344', '2127', '0'), +('14', '19', '15', '10366', '4854', '0'), +('14', '19', '15', '10151', '4200', '0'), +('14', '19', '15', '10163', '3709', '0'), +('14', '19', '15', '14679', '3360', '0'), +('14', '19', '20', '11666', '12254', '0'), +('14', '19', '20', '2742', '5375', '0'), +('14', '19', '20', '1277', '2187', '0'), +('14', '19', '20', '2345', '1624', '0'), +('14', '19', '12', '2923', '4348', '0'), +('14', '19', '12', '20655', '4259', '0'), +('14', '19', '12', '1250', '2727', '0'), +('14', '19', '12', '1404', '2524', '0'), +('14', '19', '18', '1651', '2197', '0'), +('14', '19', '18', '4410', '1685', '0'), +('14', '19', '18', '1251', '1318', '0'), +('14', '19', '18', '1221', '1234', '0'), +('14', '19', '19', '68239', '3422', '0'), +('14', '19', '19', '4407', '2156', '0'), +('14', '19', '19', '1368', '2066', '0'), +('14', '19', '19', '1652', '2046', '0'), +('14', '19', '13', '14759', '8477', '0'), +('14', '19', '13', '27711', '5671', '0'), +('14', '19', '13', '13987', '4348', '0'), +('14', '19', '13', '13400', '3918', '0'), +('14', '19', '14', '14759', '8477', '0'), +('14', '19', '14', '10219', '8362', '0'), +('14', '19', '14', '13987', '4348', '0'), +('14', '19', '14', '9401', '4073', '0'), +('14', '19', '11', '9246', '3213', '0'), +('14', '19', '11', '14762', '3204', '0'), +('14', '19', '11', '13353', '1500', '0'), +('14', '19', '11', '20677', '1200', '0'), +('14', '20', '22', '10323', '0', '0'), +('14', '20', '22', '9246', '0', '0'), +('14', '20', '22', '21509', '0', '0'), +('14', '20', '22', '8007', '0', '0'), +('14', '20', '1', '14702', '5000', '0'), +('14', '20', '1', '14701', '4624', '0'), +('14', '20', '1', '14559', '3611', '0'), +('14', '20', '1', '30361', '2640', '0'), +('14', '20', '2', '10143', '7136', '0'), +('14', '20', '2', '1246', '4014', '0'), +('14', '20', '2', '1211', '3857', '0'), +('14', '20', '2', '30363', '3700', '0'), +('14', '20', '3', '1275', '4631', '0'), +('14', '20', '3', '11052', '3624', '0'), +('14', '20', '3', '1642', '2032', '0'), +('14', '20', '3', '4505', '1752', '0'), +('14', '20', '5', '14703', '8800', '0'), +('14', '20', '5', '14558', '5082', '0'), +('14', '20', '5', '14700', '4836', '0'), +('14', '20', '5', '10055', '4060', '0'), +('14', '20', '8', '11603', '10545', '0'), +('14', '20', '8', '2349', '3651', '0'), +('14', '20', '8', '11621', '3631', '0'), +('14', '20', '8', '1409', '2827', '0'), +('14', '20', '6', '1542', '7269', '0'), +('14', '20', '6', '1557', '5371', '0'), +('14', '20', '6', '1905', '5205', '0'), +('14', '20', '6', '1276', '3275', '0'), +('14', '20', '17', '11641', '11778', '0'), +('14', '20', '17', '1253', '10387', '0'), +('14', '20', '17', '1644', '9683', '0'), +('14', '20', '17', '1214', '7156', '0'), +('14', '20', '7', '1362', '3148', '0'), +('14', '20', '7', '1218', '2910', '0'), +('14', '20', '7', '1248', '2694', '0'), +('14', '20', '7', '1648', '2056', '0'), +('14', '20', '9', '12806', '3818', '0'), +('14', '20', '9', '14650', '2424', '0'), +('14', '20', '9', '1649', '2315', '0'), +('14', '20', '9', '4344', '2127', '0'), +('14', '20', '15', '10366', '4854', '0'), +('14', '20', '15', '10151', '4200', '0'), +('14', '20', '15', '10163', '3709', '0'), +('14', '20', '15', '14679', '3360', '0'), +('14', '20', '20', '11666', '12264', '0'), +('14', '20', '20', '2742', '5390', '0'), +('14', '20', '20', '1277', '2247', '0'), +('14', '20', '20', '2345', '1624', '0'), +('14', '20', '12', '2923', '4348', '0'), +('14', '20', '12', '20655', '4286', '0'), +('14', '20', '12', '1250', '2823', '0'), +('14', '20', '12', '1404', '2524', '0'), +('14', '20', '18', '1651', '2234', '0'), +('14', '20', '18', '4410', '1685', '0'), +('14', '20', '18', '1251', '1318', '0'), +('14', '20', '18', '1221', '1234', '0'), +('14', '20', '19', '68239', '3459', '0'), +('14', '20', '19', '4407', '2265', '0'), +('14', '20', '19', '1368', '2066', '0'), +('14', '20', '19', '1652', '2046', '0'), +('14', '20', '13', '14759', '8543', '0'), +('14', '20', '13', '27711', '5762', '0'), +('14', '20', '13', '13987', '4408', '0'), +('14', '20', '13', '13400', '3966', '0'), +('14', '20', '14', '14759', '8543', '0'), +('14', '20', '14', '10219', '8362', '0'), +('14', '20', '14', '13987', '4408', '0'), +('14', '20', '14', '9401', '4158', '0'), +('14', '20', '11', '9246', '3334', '0'), +('14', '20', '11', '14762', '3204', '0'), +('14', '20', '11', '13353', '1500', '0'), +('14', '20', '11', '20677', '1200', '0'), +('14', '21', '22', '10323', '0', '0'), +('14', '21', '22', '9246', '0', '0'), +('14', '21', '22', '21509', '0', '0'), +('14', '21', '22', '8007', '0', '0'), +('14', '21', '1', '14702', '5000', '0'), +('14', '21', '1', '14701', '4624', '0'), +('14', '21', '1', '14559', '3660', '0'), +('14', '21', '1', '30361', '2640', '0'), +('14', '21', '2', '10143', '7136', '0'), +('14', '21', '2', '1246', '4099', '0'), +('14', '21', '2', '1211', '3942', '0'), +('14', '21', '2', '30363', '3700', '0'), +('14', '21', '3', '1275', '4703', '0'), +('14', '21', '3', '11052', '3805', '0'), +('14', '21', '3', '1642', '2044', '0'), +('14', '21', '3', '4505', '1836', '0'), +('14', '21', '5', '14703', '8800', '0'), +('14', '21', '5', '14558', '5150', '0'), +('14', '21', '5', '14700', '4836', '0'), +('14', '21', '5', '10055', '4060', '0'), +('14', '21', '8', '11603', '10654', '0'), +('14', '21', '8', '2349', '3651', '0'), +('14', '21', '8', '11621', '3631', '0'), +('14', '21', '8', '1409', '2827', '0'), +('14', '21', '6', '1542', '7378', '0'), +('14', '21', '6', '1557', '5371', '0'), +('14', '21', '6', '1905', '5213', '0'), +('14', '21', '6', '1276', '3275', '0'), +('14', '21', '17', '11641', '11959', '0'), +('14', '21', '17', '1253', '10401', '0'), +('14', '21', '17', '1644', '9744', '0'), +('14', '21', '17', '1214', '7332', '0'), +('14', '21', '7', '1362', '3148', '0'), +('14', '21', '7', '1218', '2994', '0'), +('14', '21', '7', '1248', '2778', '0'), +('14', '21', '7', '1648', '2117', '0'), +('14', '21', '9', '12806', '3903', '0'), +('14', '21', '9', '14650', '2424', '0'), +('14', '21', '9', '1649', '2352', '0'), +('14', '21', '9', '4344', '2127', '0'), +('14', '21', '15', '10366', '4854', '0'), +('14', '21', '15', '10151', '4200', '0'), +('14', '21', '15', '10163', '3709', '0'), +('14', '21', '15', '14679', '3360', '0'), +('14', '21', '20', '11666', '12274', '0'), +('14', '21', '20', '2742', '5404', '0'), +('14', '21', '20', '1277', '2307', '0'), +('14', '21', '20', '2345', '1624', '0'), +('14', '21', '12', '2923', '4348', '0'), +('14', '21', '12', '20655', '4313', '0'), +('14', '21', '12', '1250', '2920', '0'), +('14', '21', '12', '1404', '2524', '0'), +('14', '21', '18', '1651', '2270', '0'), +('14', '21', '18', '4410', '1685', '0'), +('14', '21', '18', '1251', '1318', '0'), +('14', '21', '18', '1221', '1234', '0'), +('14', '21', '19', '68239', '3495', '0'), +('14', '21', '19', '4407', '2374', '0'), +('14', '21', '19', '1368', '2066', '0'), +('14', '21', '19', '1652', '2046', '0'), +('14', '21', '13', '14759', '8608', '0'), +('14', '21', '13', '27711', '5852', '0'), +('14', '21', '13', '13987', '4468', '0'), +('14', '21', '13', '13400', '4015', '0'), +('14', '21', '14', '14759', '8608', '0'), +('14', '21', '14', '10219', '8362', '0'), +('14', '21', '14', '13987', '4468', '0'), +('14', '21', '14', '9401', '4242', '0'), +('14', '21', '11', '9246', '3455', '0'), +('14', '21', '11', '14762', '3204', '0'), +('14', '21', '11', '13353', '1500', '0'), +('14', '21', '11', '20677', '1200', '0'), +('14', '22', '22', '10323', '0', '0'), +('14', '22', '22', '9246', '0', '0'), +('14', '22', '22', '21509', '0', '0'), +('14', '22', '22', '8007', '0', '0'), +('14', '22', '1', '14702', '5000', '0'), +('14', '22', '1', '14701', '4624', '0'), +('14', '22', '1', '14559', '3708', '0'), +('14', '22', '1', '30361', '2640', '0'), +('14', '22', '2', '10143', '7136', '0'), +('14', '22', '2', '1246', '4183', '0'), +('14', '22', '2', '1211', '4026', '0'), +('14', '22', '2', '30363', '3700', '0'), +('14', '22', '3', '1275', '4776', '0'), +('14', '22', '3', '11052', '3986', '0'), +('14', '22', '3', '1642', '2056', '0'), +('14', '22', '3', '4505', '1921', '0'), +('14', '22', '5', '14703', '8800', '0'), +('14', '22', '5', '14558', '5218', '0'), +('14', '22', '5', '14700', '4836', '0'), +('14', '22', '5', '10055', '4060', '0'), +('14', '22', '8', '11603', '10763', '0'), +('14', '22', '8', '2349', '3651', '0'), +('14', '22', '8', '11621', '3631', '0'), +('14', '22', '8', '1409', '2827', '0'), +('14', '22', '6', '1542', '7487', '0'), +('14', '22', '6', '1557', '5371', '0'), +('14', '22', '6', '1905', '5220', '0'), +('14', '22', '6', '1276', '3275', '0'), +('14', '22', '17', '11641', '12140', '0'), +('14', '22', '17', '1253', '10416', '0'), +('14', '22', '17', '1644', '9804', '0'), +('14', '22', '17', '1214', '7508', '0'), +('14', '22', '7', '1362', '3148', '0'), +('14', '22', '7', '1218', '3079', '0'), +('14', '22', '7', '1248', '2863', '0'), +('14', '22', '7', '1648', '2177', '0'), +('14', '22', '9', '12806', '3987', '0'), +('14', '22', '9', '14650', '2424', '0'), +('14', '22', '9', '1649', '2388', '0'), +('14', '22', '9', '4344', '2127', '0'), +('14', '22', '15', '10366', '4854', '0'), +('14', '22', '15', '10151', '4200', '0'), +('14', '22', '15', '10163', '3709', '0'), +('14', '22', '15', '14679', '3360', '0'), +('14', '22', '20', '11666', '12284', '0'), +('14', '22', '20', '2742', '5419', '0'), +('14', '22', '20', '1277', '2368', '0'), +('14', '22', '20', '2345', '1624', '0'), +('14', '22', '12', '2923', '4348', '0'), +('14', '22', '12', '20655', '4341', '0'), +('14', '22', '12', '1250', '3017', '0'), +('14', '22', '12', '1404', '2524', '0'), +('14', '22', '18', '1651', '2306', '0'), +('14', '22', '18', '4410', '1685', '0'), +('14', '22', '18', '1251', '1318', '0'), +('14', '22', '18', '1221', '1234', '0'), +('14', '22', '19', '68239', '3531', '0'), +('14', '22', '19', '4407', '2482', '0'), +('14', '22', '19', '1368', '2066', '0'), +('14', '22', '19', '1652', '2046', '0'), +('14', '22', '13', '14759', '8673', '0'), +('14', '22', '13', '27711', '5943', '0'), +('14', '22', '13', '13987', '4529', '0'), +('14', '22', '13', '13400', '4063', '0'), +('14', '22', '14', '14759', '8673', '0'), +('14', '22', '14', '10219', '8362', '0'), +('14', '22', '14', '13987', '4529', '0'), +('14', '22', '14', '9401', '4327', '0'), +('14', '22', '11', '9246', '3576', '0'), +('14', '22', '11', '14762', '3204', '0'), +('14', '22', '11', '13353', '1500', '0'), +('14', '22', '11', '20677', '1200', '0'), +('14', '23', '22', '10323', '0', '0'), +('14', '23', '22', '9246', '0', '0'), +('14', '23', '22', '21509', '0', '0'), +('14', '23', '22', '8007', '0', '0'), +('14', '23', '1', '14702', '5000', '0'), +('14', '23', '1', '14701', '4624', '0'), +('14', '23', '1', '14559', '3756', '0'), +('14', '23', '1', '30361', '2640', '0'), +('14', '23', '2', '10143', '7136', '0'), +('14', '23', '2', '1246', '4268', '0'), +('14', '23', '2', '1211', '4111', '0'), +('14', '23', '2', '30363', '3700', '0'), +('14', '23', '3', '1275', '4848', '0'), +('14', '23', '3', '11052', '4168', '0'), +('14', '23', '3', '1642', '2068', '0'), +('14', '23', '3', '4505', '2005', '0'), +('14', '23', '5', '14703', '8800', '0'), +('14', '23', '5', '14558', '5285', '0'), +('14', '23', '5', '14700', '4836', '0'), +('14', '23', '5', '10055', '4060', '0'), +('14', '23', '8', '11603', '10871', '0'), +('14', '23', '8', '2349', '3651', '0'), +('14', '23', '8', '11621', '3631', '0'), +('14', '23', '8', '1409', '2827', '0'), +('14', '23', '6', '1542', '7595', '0'), +('14', '23', '6', '1557', '5371', '0'), +('14', '23', '6', '1905', '5227', '0'), +('14', '23', '6', '1276', '3275', '0'), +('14', '23', '17', '11641', '12322', '0'), +('14', '23', '17', '1253', '10430', '0'), +('14', '23', '17', '1644', '9864', '0'), +('14', '23', '17', '1214', '7684', '0'), +('14', '23', '7', '1218', '3163', '0'), +('14', '23', '7', '1362', '3148', '0'), +('14', '23', '7', '1248', '2948', '0'), +('14', '23', '7', '1648', '2238', '0'), +('14', '23', '9', '12806', '4072', '0'), +('14', '23', '9', '1649', '2424', '0'), +('14', '23', '9', '14650', '2424', '0'), +('14', '23', '9', '4344', '2127', '0'), +('14', '23', '15', '10366', '4854', '0'), +('14', '23', '15', '10151', '4200', '0'), +('14', '23', '15', '10163', '3709', '0'), +('14', '23', '15', '14679', '3360', '0'), +('14', '23', '20', '11666', '12294', '0'), +('14', '23', '20', '2742', '5433', '0'), +('14', '23', '20', '1277', '2428', '0'), +('14', '23', '20', '1217', '1629', '0'), +('14', '23', '12', '20655', '4368', '0'), +('14', '23', '12', '2923', '4348', '0'), +('14', '23', '12', '1250', '3113', '0'), +('14', '23', '12', '1650', '2565', '0'), +('14', '23', '18', '1651', '2342', '0'), +('14', '23', '18', '4410', '1685', '0'), +('14', '23', '18', '1251', '1318', '0'), +('14', '23', '18', '1221', '1234', '0'), +('14', '23', '19', '68239', '3567', '0'), +('14', '23', '19', '4407', '2591', '0'), +('14', '23', '19', '1368', '2066', '0'), +('14', '23', '19', '1652', '2046', '0'), +('14', '23', '13', '14759', '8738', '0'), +('14', '23', '13', '27711', '6033', '0'), +('14', '23', '13', '13987', '4589', '0'), +('14', '23', '13', '6359', '4131', '0'), +('14', '23', '14', '14759', '8738', '0'), +('14', '23', '14', '10219', '8362', '0'), +('14', '23', '14', '13987', '4589', '0'), +('14', '23', '14', '9401', '4412', '0'), +('14', '23', '11', '9246', '3696', '0'), +('14', '23', '11', '14762', '3204', '0'), +('14', '23', '11', '13353', '1500', '0'), +('14', '23', '11', '20677', '1200', '0'), +('14', '24', '22', '10323', '0', '0'), +('14', '24', '22', '9246', '0', '0'), +('14', '24', '22', '21509', '0', '0'), +('14', '24', '22', '8007', '0', '0'), +('14', '24', '1', '14702', '5000', '0'), +('14', '24', '1', '14701', '4624', '0'), +('14', '24', '1', '14559', '3805', '0'), +('14', '24', '1', '30361', '2640', '0'), +('14', '24', '2', '10143', '7136', '0'), +('14', '24', '2', '1246', '4352', '0'), +('14', '24', '2', '1211', '4195', '0'), +('14', '24', '2', '30363', '3700', '0'), +('14', '24', '3', '1275', '4921', '0'), +('14', '24', '3', '11052', '4349', '0'), +('14', '24', '3', '4505', '2090', '0'), +('14', '24', '3', '1642', '2081', '0'), +('14', '24', '5', '14703', '8800', '0'), +('14', '24', '5', '14558', '5353', '0'), +('14', '24', '5', '14700', '4836', '0'), +('14', '24', '5', '10055', '4060', '0'), +('14', '24', '8', '11603', '10980', '0'), +('14', '24', '8', '2349', '3651', '0'), +('14', '24', '8', '11621', '3631', '0'), +('14', '24', '8', '1409', '2827', '0'), +('14', '24', '6', '1542', '7704', '0'), +('14', '24', '6', '1557', '5371', '0'), +('14', '24', '6', '1905', '5234', '0'), +('14', '24', '6', '1276', '3275', '0'), +('14', '24', '17', '11641', '12503', '0'), +('14', '24', '17', '1253', '10445', '0'), +('14', '24', '17', '1644', '9925', '0'), +('14', '24', '17', '1214', '7860', '0'), +('14', '24', '7', '1218', '3248', '0'), +('14', '24', '7', '1362', '3148', '0'), +('14', '24', '7', '1248', '3032', '0'), +('14', '24', '7', '1648', '2298', '0'), +('14', '24', '9', '12806', '4156', '0'), +('14', '24', '9', '1649', '2460', '0'), +('14', '24', '9', '14650', '2424', '0'), +('14', '24', '9', '4344', '2127', '0'), +('14', '24', '15', '10366', '4854', '0'), +('14', '24', '15', '10151', '4200', '0'), +('14', '24', '15', '10163', '3709', '0'), +('14', '24', '15', '14679', '3360', '0'), +('14', '24', '20', '11666', '12305', '0'), +('14', '24', '20', '2742', '5448', '0'), +('14', '24', '20', '1277', '2489', '0'), +('14', '24', '20', '1364', '1664', '0'), +('14', '24', '12', '20655', '4395', '0'), +('14', '24', '12', '2923', '4348', '0'), +('14', '24', '12', '1250', '3210', '0'), +('14', '24', '12', '1650', '2613', '0'), +('14', '24', '18', '1651', '2378', '0'), +('14', '24', '18', '4410', '1685', '0'), +('14', '24', '18', '1251', '1318', '0'), +('14', '24', '18', '1221', '1234', '0'), +('14', '24', '19', '68239', '3604', '0'), +('14', '24', '19', '4407', '2700', '0'), +('14', '24', '19', '1368', '2066', '0'), +('14', '24', '19', '1652', '2046', '0'), +('14', '24', '13', '14759', '8804', '0'), +('14', '24', '13', '27711', '6124', '0'), +('14', '24', '13', '13987', '4650', '0'), +('14', '24', '13', '6359', '4252', '0'), +('14', '24', '14', '14759', '8804', '0'), +('14', '24', '14', '10219', '8362', '0'), +('14', '24', '14', '13987', '4650', '0'), +('14', '24', '14', '9401', '4496', '0'), +('14', '24', '11', '9246', '3817', '0'), +('14', '24', '11', '14762', '3204', '0'), +('14', '24', '11', '13353', '1500', '0'), +('14', '24', '11', '20677', '1200', '0'), +('14', '25', '22', '10323', '0', '0'), +('14', '25', '22', '9246', '0', '0'), +('14', '25', '22', '21509', '0', '0'), +('14', '25', '22', '8007', '0', '0'), +('14', '25', '1', '14702', '5000', '0'), +('14', '25', '1', '14701', '4624', '0'), +('14', '25', '1', '14559', '3853', '0'), +('14', '25', '1', '30361', '2640', '0'), +('14', '25', '2', '10143', '7136', '0'), +('14', '25', '2', '1246', '4437', '0'), +('14', '25', '2', '1211', '4280', '0'), +('14', '25', '2', '30363', '3700', '0'), +('14', '25', '3', '1275', '4993', '0'), +('14', '25', '3', '11052', '4530', '0'), +('14', '25', '3', '4505', '2174', '0'), +('14', '25', '3', '1642', '2093', '0'), +('14', '25', '5', '14703', '8800', '0'), +('14', '25', '5', '14558', '5421', '0'), +('14', '25', '5', '14700', '4836', '0'), +('14', '25', '5', '10055', '4060', '0'), +('14', '25', '8', '11603', '11089', '0'), +('14', '25', '8', '2349', '3651', '0'), +('14', '25', '8', '11621', '3631', '0'), +('14', '25', '8', '1409', '2827', '0'), +('14', '25', '6', '1542', '7813', '0'), +('14', '25', '6', '1557', '5371', '0'), +('14', '25', '6', '1905', '5242', '0'), +('14', '25', '6', '1276', '3275', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '25', '17', '11641', '12684', '0'), +('14', '25', '17', '1253', '10459', '0'), +('14', '25', '17', '1644', '9985', '0'), +('14', '25', '17', '1214', '8035', '0'), +('14', '25', '7', '1218', '3332', '0'), +('14', '25', '7', '1362', '3148', '0'), +('14', '25', '7', '1248', '3117', '0'), +('14', '25', '7', '1648', '2358', '0'), +('14', '25', '9', '12806', '4241', '0'), +('14', '25', '9', '1649', '2497', '0'), +('14', '25', '9', '14650', '2424', '0'), +('14', '25', '9', '4344', '2127', '0'), +('14', '25', '15', '10366', '4854', '0'), +('14', '25', '15', '10151', '4200', '0'), +('14', '25', '15', '10163', '3709', '0'), +('14', '25', '15', '14679', '3360', '0'), +('14', '25', '20', '11666', '12315', '0'), +('14', '25', '20', '2742', '5462', '0'), +('14', '25', '20', '1277', '2549', '0'), +('14', '25', '20', '1364', '1712', '0'), +('14', '25', '12', '20655', '4422', '0'), +('14', '25', '12', '2923', '4348', '0'), +('14', '25', '12', '1250', '3307', '0'), +('14', '25', '12', '1650', '2661', '0'), +('14', '25', '18', '1651', '2415', '0'), +('14', '25', '18', '4410', '1685', '0'), +('14', '25', '18', '1251', '1318', '0'), +('14', '25', '18', '1221', '1234', '0'), +('14', '25', '19', '68239', '3640', '0'), +('14', '25', '19', '4407', '2808', '0'), +('14', '25', '19', '1368', '2066', '0'), +('14', '25', '19', '1652', '2046', '0'), +('14', '25', '13', '14759', '8869', '0'), +('14', '25', '13', '27711', '6215', '0'), +('14', '25', '13', '13987', '4710', '0'), +('14', '25', '13', '6359', '4373', '0'), +('14', '25', '14', '14759', '8869', '0'), +('14', '25', '14', '10219', '8362', '0'), +('14', '25', '14', '13987', '4710', '0'), +('14', '25', '14', '9401', '4581', '0'), +('14', '25', '11', '9246', '3938', '0'), +('14', '25', '11', '14762', '3204', '0'), +('14', '25', '11', '13353', '1500', '0'), +('14', '25', '11', '20677', '1200', '0'), +('14', '26', '22', '10323', '0', '0'), +('14', '26', '22', '9246', '0', '0'), +('14', '26', '22', '21509', '0', '0'), +('14', '26', '22', '8007', '0', '0'), +('14', '26', '1', '14702', '5000', '0'), +('14', '26', '1', '14701', '4624', '0'), +('14', '26', '1', '14559', '3901', '0'), +('14', '26', '1', '30361', '2640', '0'), +('14', '26', '2', '10143', '7136', '0'), +('14', '26', '2', '1246', '4521', '0'), +('14', '26', '2', '1211', '4365', '0'), +('14', '26', '2', '30363', '3700', '0'), +('14', '26', '3', '1275', '5066', '0'), +('14', '26', '3', '11052', '4711', '0'), +('14', '26', '3', '4505', '2259', '0'), +('14', '26', '3', '1642', '2105', '0'), +('14', '26', '5', '14703', '8800', '0'), +('14', '26', '5', '14558', '5488', '0'), +('14', '26', '5', '14700', '4836', '0'), +('14', '26', '5', '10055', '4060', '0'), +('14', '26', '8', '11603', '11198', '0'), +('14', '26', '8', '2349', '3651', '0'), +('14', '26', '8', '11621', '3631', '0'), +('14', '26', '8', '1409', '2827', '0'), +('14', '26', '6', '1542', '7921', '0'), +('14', '26', '6', '1557', '5371', '0'), +('14', '26', '6', '1905', '5249', '0'), +('14', '26', '6', '1276', '3275', '0'), +('14', '26', '17', '11641', '12865', '0'), +('14', '26', '17', '1253', '10474', '0'), +('14', '26', '17', '1644', '10046', '0'), +('14', '26', '17', '1214', '8211', '0'), +('14', '26', '7', '1218', '3417', '0'), +('14', '26', '7', '1248', '3201', '0'), +('14', '26', '7', '1362', '3148', '0'), +('14', '26', '7', '1648', '2419', '0'), +('14', '26', '9', '12806', '4325', '0'), +('14', '26', '9', '1649', '2533', '0'), +('14', '26', '9', '14650', '2424', '0'), +('14', '26', '9', '4344', '2127', '0'), +('14', '26', '15', '10366', '4854', '0'), +('14', '26', '15', '10151', '4200', '0'), +('14', '26', '15', '10163', '3709', '0'), +('14', '26', '15', '14679', '3360', '0'), +('14', '26', '20', '11666', '12325', '0'), +('14', '26', '20', '2742', '5477', '0'), +('14', '26', '20', '1277', '2609', '0'), +('14', '26', '20', '1364', '1760', '0'), +('14', '26', '12', '20655', '4449', '0'), +('14', '26', '12', '2923', '4348', '0'), +('14', '26', '12', '1250', '3403', '0'), +('14', '26', '12', '1650', '2709', '0'), +('14', '26', '18', '1651', '2451', '0'), +('14', '26', '18', '4410', '1685', '0'), +('14', '26', '18', '1251', '1318', '0'), +('14', '26', '18', '1221', '1234', '0'), +('14', '26', '19', '68239', '3676', '0'), +('14', '26', '19', '4407', '2917', '0'), +('14', '26', '19', '1368', '2066', '0'), +('14', '26', '19', '1652', '2046', '0'), +('14', '26', '13', '14759', '8934', '0'), +('14', '26', '13', '27711', '6305', '0'), +('14', '26', '13', '13987', '4770', '0'), +('14', '26', '13', '6359', '4494', '0'), +('14', '26', '14', '14759', '8934', '0'), +('14', '26', '14', '10219', '8362', '0'), +('14', '26', '14', '13987', '4770', '0'), +('14', '26', '14', '9401', '4665', '0'), +('14', '26', '11', '9246', '4059', '0'), +('14', '26', '11', '14762', '3204', '0'), +('14', '26', '11', '13353', '1500', '0'), +('14', '26', '11', '20677', '1200', '0'), +('14', '27', '22', '10323', '0', '0'), +('14', '27', '22', '9246', '0', '0'), +('14', '27', '22', '21509', '0', '0'), +('14', '27', '22', '8007', '0', '0'), +('14', '27', '1', '14702', '5000', '0'), +('14', '27', '1', '14701', '4624', '0'), +('14', '27', '1', '14559', '3950', '0'), +('14', '27', '1', '30361', '2640', '0'), +('14', '27', '2', '10143', '7136', '0'), +('14', '27', '2', '1246', '4606', '0'), +('14', '27', '2', '1211', '4449', '0'), +('14', '27', '2', '30363', '3700', '0'), +('14', '27', '3', '1275', '5138', '0'), +('14', '27', '3', '11052', '4892', '0'), +('14', '27', '3', '4505', '2344', '0'), +('14', '27', '3', '1642', '2117', '0'), +('14', '27', '5', '14703', '8800', '0'), +('14', '27', '5', '14558', '5556', '0'), +('14', '27', '5', '14700', '4836', '0'), +('14', '27', '5', '10055', '4060', '0'), +('14', '27', '8', '11603', '11306', '0'), +('14', '27', '8', '2349', '3651', '0'), +('14', '27', '8', '11621', '3631', '0'), +('14', '27', '8', '1409', '2827', '0'), +('14', '27', '6', '1542', '8030', '0'), +('14', '27', '6', '1557', '5371', '0'), +('14', '27', '6', '1905', '5256', '0'), +('14', '27', '6', '1276', '3275', '0'), +('14', '27', '17', '11641', '13046', '0'), +('14', '27', '17', '1253', '10488', '0'), +('14', '27', '17', '1644', '10106', '0'), +('14', '27', '17', '1214', '8387', '0'), +('14', '27', '7', '1218', '3501', '0'), +('14', '27', '7', '1248', '3286', '0'), +('14', '27', '7', '1362', '3148', '0'), +('14', '27', '7', '1648', '2479', '0'), +('14', '27', '9', '12806', '4410', '0'), +('14', '27', '9', '1649', '2569', '0'), +('14', '27', '9', '14650', '2424', '0'), +('14', '27', '9', '4344', '2127', '0'), +('14', '27', '15', '10366', '4854', '0'), +('14', '27', '15', '10151', '4200', '0'), +('14', '27', '15', '10163', '3709', '0'), +('14', '27', '15', '14679', '3360', '0'), +('14', '27', '20', '11666', '12335', '0'), +('14', '27', '20', '2742', '5491', '0'), +('14', '27', '20', '1277', '2670', '0'), +('14', '27', '20', '1364', '1809', '0'), +('14', '27', '12', '20655', '4476', '0'), +('14', '27', '12', '2923', '4348', '0'), +('14', '27', '12', '1250', '3500', '0'), +('14', '27', '12', '1650', '2758', '0'), +('14', '27', '18', '1651', '2487', '0'), +('14', '27', '18', '4410', '1685', '0'), +('14', '27', '18', '1251', '1318', '0'), +('14', '27', '18', '1221', '1234', '0'), +('14', '27', '19', '68239', '3712', '0'), +('14', '27', '19', '4407', '3026', '0'), +('14', '27', '19', '1368', '2066', '0'), +('14', '27', '19', '1652', '2046', '0'), +('14', '27', '13', '14759', '8999', '0'), +('14', '27', '13', '27711', '6396', '0'), +('14', '27', '13', '13987', '4831', '0'), +('14', '27', '13', '6359', '4615', '0'), +('14', '27', '14', '14759', '8999', '0'), +('14', '27', '14', '10219', '8362', '0'), +('14', '27', '14', '13987', '4831', '0'), +('14', '27', '14', '9401', '4750', '0'), +('14', '27', '11', '9246', '4180', '0'), +('14', '27', '11', '14762', '3204', '0'), +('14', '27', '11', '13353', '1500', '0'), +('14', '27', '11', '20677', '1200', '0'), +('14', '28', '22', '10323', '0', '0'), +('14', '28', '22', '9246', '0', '0'), +('14', '28', '22', '21509', '0', '0'), +('14', '28', '22', '8007', '0', '0'), +('14', '28', '1', '14702', '5000', '0'), +('14', '28', '1', '14701', '4624', '0'), +('14', '28', '1', '14559', '3998', '0'), +('14', '28', '1', '30361', '2640', '0'), +('14', '28', '2', '10143', '7136', '0'), +('14', '28', '2', '1246', '4690', '0'), +('14', '28', '2', '1211', '4534', '0'), +('14', '28', '2', '30363', '3700', '0'), +('14', '28', '3', '1275', '5211', '0'), +('14', '28', '3', '11052', '5074', '0'), +('14', '28', '3', '4505', '2428', '0'), +('14', '28', '3', '1642', '2129', '0'), +('14', '28', '5', '14703', '8800', '0'), +('14', '28', '5', '14558', '5624', '0'), +('14', '28', '5', '14700', '4836', '0'), +('14', '28', '5', '10055', '4060', '0'), +('14', '28', '8', '11603', '11415', '0'), +('14', '28', '8', '2349', '3651', '0'), +('14', '28', '8', '11621', '3631', '0'), +('14', '28', '8', '1409', '2827', '0'), +('14', '28', '6', '1542', '8139', '0'), +('14', '28', '6', '1557', '5371', '0'), +('14', '28', '6', '1905', '5263', '0'), +('14', '28', '6', '1276', '3275', '0'), +('14', '28', '17', '11641', '13228', '0'), +('14', '28', '17', '1253', '10503', '0'), +('14', '28', '17', '1644', '10166', '0'), +('14', '28', '17', '1214', '8563', '0'), +('14', '28', '7', '1218', '3586', '0'), +('14', '28', '7', '1248', '3370', '0'), +('14', '28', '7', '1362', '3148', '0'), +('14', '28', '7', '1648', '2540', '0'), +('14', '28', '9', '12806', '4495', '0'), +('14', '28', '9', '1649', '2605', '0'), +('14', '28', '9', '14650', '2424', '0'), +('14', '28', '9', '4344', '2127', '0'), +('14', '28', '15', '10366', '4854', '0'), +('14', '28', '15', '10151', '4200', '0'), +('14', '28', '15', '10163', '3709', '0'), +('14', '28', '15', '14679', '3360', '0'), +('14', '28', '20', '11666', '12345', '0'), +('14', '28', '20', '2742', '5506', '0'), +('14', '28', '20', '1277', '2730', '0'), +('14', '28', '20', '1364', '1857', '0'), +('14', '28', '12', '20655', '4503', '0'), +('14', '28', '12', '2923', '4348', '0'), +('14', '28', '12', '1250', '3597', '0'), +('14', '28', '12', '1650', '2806', '0'), +('14', '28', '18', '1651', '2523', '0'), +('14', '28', '18', '4410', '1685', '0'), +('14', '28', '18', '1251', '1318', '0'), +('14', '28', '18', '1221', '1234', '0'), +('14', '28', '19', '68239', '3749', '0'), +('14', '28', '19', '4407', '3135', '0'), +('14', '28', '19', '1368', '2066', '0'), +('14', '28', '19', '1652', '2046', '0'), +('14', '28', '13', '14759', '9064', '0'), +('14', '28', '13', '27711', '6486', '0'), +('14', '28', '13', '13987', '4891', '0'), +('14', '28', '13', '6359', '4735', '0'), +('14', '28', '14', '14759', '9064', '0'), +('14', '28', '14', '10219', '8362', '0'), +('14', '28', '14', '13987', '4891', '0'), +('14', '28', '14', '9401', '4834', '0'), +('14', '28', '11', '9246', '4300', '0'), +('14', '28', '11', '14762', '3204', '0'), +('14', '28', '11', '13353', '1500', '0'), +('14', '28', '11', '20677', '1200', '0'), +('14', '29', '22', '10323', '0', '0'), +('14', '29', '22', '9246', '0', '0'), +('14', '29', '22', '21509', '0', '0'), +('14', '29', '22', '8007', '0', '0'), +('14', '29', '1', '14702', '5000', '0'), +('14', '29', '1', '14701', '4624', '0'), +('14', '29', '1', '14559', '4046', '0'), +('14', '29', '1', '30361', '2640', '0'), +('14', '29', '2', '10143', '7136', '0'), +('14', '29', '2', '1246', '4775', '0'), +('14', '29', '2', '1211', '4618', '0'), +('14', '29', '2', '30363', '3700', '0'), +('14', '29', '3', '1275', '5283', '0'), +('14', '29', '3', '11052', '5255', '0'), +('14', '29', '3', '4505', '2513', '0'), +('14', '29', '3', '1642', '2141', '0'), +('14', '29', '5', '14703', '8800', '0'), +('14', '29', '5', '14558', '5691', '0'), +('14', '29', '5', '14700', '4836', '0'), +('14', '29', '5', '10055', '4060', '0'), +('14', '29', '8', '11603', '11524', '0'), +('14', '29', '8', '2349', '3651', '0'), +('14', '29', '8', '11621', '3631', '0'), +('14', '29', '8', '1409', '2827', '0'), +('14', '29', '6', '1542', '8248', '0'), +('14', '29', '6', '1557', '5371', '0'), +('14', '29', '6', '1905', '5271', '0'), +('14', '29', '6', '1276', '3275', '0'), +('14', '29', '17', '11641', '13409', '0'), +('14', '29', '17', '1253', '10517', '0'), +('14', '29', '17', '1644', '10227', '0'), +('14', '29', '17', '1214', '8739', '0'), +('14', '29', '7', '1218', '3671', '0'), +('14', '29', '7', '1248', '3455', '0'), +('14', '29', '7', '1362', '3148', '0'), +('14', '29', '7', '1648', '2600', '0'), +('14', '29', '9', '12806', '4579', '0'), +('14', '29', '9', '1649', '2642', '0'), +('14', '29', '9', '14650', '2424', '0'), +('14', '29', '9', '4344', '2127', '0'), +('14', '29', '15', '10366', '4854', '0'), +('14', '29', '15', '10151', '4200', '0'), +('14', '29', '15', '10163', '3709', '0'), +('14', '29', '15', '14679', '3360', '0'), +('14', '29', '20', '11666', '12355', '0'), +('14', '29', '20', '2742', '5520', '0'), +('14', '29', '20', '1277', '2791', '0'), +('14', '29', '20', '1364', '1905', '0'), +('14', '29', '12', '20655', '4530', '0'), +('14', '29', '12', '2923', '4348', '0'), +('14', '29', '12', '1250', '3693', '0'), +('14', '29', '12', '1650', '2854', '0'), +('14', '29', '18', '1651', '2560', '0'), +('14', '29', '18', '4410', '1685', '0'), +('14', '29', '18', '1251', '1318', '0'), +('14', '29', '18', '1221', '1234', '0'), +('14', '29', '19', '68239', '3785', '0'), +('14', '29', '19', '4407', '3243', '0'), +('14', '29', '19', '1368', '2066', '0'), +('14', '29', '19', '1652', '2046', '0'), +('14', '29', '13', '14759', '9130', '0'), +('14', '29', '13', '27711', '6577', '0'), +('14', '29', '13', '13987', '4952', '0'), +('14', '29', '13', '6359', '4856', '0'), +('14', '29', '14', '14759', '9130', '0'), +('14', '29', '14', '10219', '8362', '0'), +('14', '29', '14', '13987', '4952', '0'), +('14', '29', '14', '9401', '4919', '0'), +('14', '29', '11', '9246', '4421', '0'), +('14', '29', '11', '14762', '3204', '0'), +('14', '29', '11', '13353', '1500', '0'), +('14', '29', '11', '20677', '1200', '0'), +('14', '30', '22', '10323', '0', '0'), +('14', '30', '22', '9246', '0', '0'), +('14', '30', '22', '21509', '0', '0'), +('14', '30', '22', '8007', '0', '0'), +('14', '30', '1', '14702', '5000', '0'), +('14', '30', '1', '14701', '4624', '0'), +('14', '30', '1', '14559', '4095', '0'), +('14', '30', '1', '30361', '2640', '0'), +('14', '30', '2', '10143', '7136', '0'), +('14', '30', '2', '1246', '4860', '0'), +('14', '30', '2', '1211', '4703', '0'), +('14', '30', '2', '30363', '3700', '0'), +('14', '30', '3', '11052', '5436', '0'), +('14', '30', '3', '1275', '5356', '0'), +('14', '30', '3', '4505', '2597', '0'), +('14', '30', '3', '1642', '2153', '0'), +('14', '30', '5', '14703', '8800', '0'), +('14', '30', '5', '14558', '5759', '0'), +('14', '30', '5', '14700', '4836', '0'), +('14', '30', '5', '68291', '4093', '0'), +('14', '30', '8', '11603', '11632', '0'), +('14', '30', '8', '2349', '3651', '0'), +('14', '30', '8', '11621', '3631', '0'), +('14', '30', '8', '1409', '2827', '0'), +('14', '30', '6', '1542', '8356', '0'), +('14', '30', '6', '1557', '5371', '0'), +('14', '30', '6', '1905', '5278', '0'), +('14', '30', '6', '1276', '3275', '0'), +('14', '30', '17', '11641', '13590', '0'), +('14', '30', '17', '1253', '10532', '0'), +('14', '30', '17', '1644', '10287', '0'), +('14', '30', '17', '1214', '8915', '0'), +('14', '30', '7', '1218', '3755', '0'), +('14', '30', '7', '1248', '3539', '0'), +('14', '30', '7', '1362', '3148', '0'), +('14', '30', '7', '1648', '2660', '0'), +('14', '30', '9', '12806', '4664', '0'), +('14', '30', '9', '1649', '2678', '0'), +('14', '30', '9', '14650', '2424', '0'), +('14', '30', '9', '4344', '2127', '0'), +('14', '30', '15', '10366', '4854', '0'), +('14', '30', '15', '10151', '4200', '0'), +('14', '30', '15', '10163', '3709', '0'), +('14', '30', '15', '14679', '3360', '0'), +('14', '30', '20', '11666', '12365', '0'), +('14', '30', '20', '2742', '5535', '0'), +('14', '30', '20', '1277', '2851', '0'), +('14', '30', '20', '1364', '1954', '0'), +('14', '30', '12', '20655', '4557', '0'), +('14', '30', '12', '2923', '4348', '0'), +('14', '30', '12', '1250', '3790', '0'), +('14', '30', '12', '1650', '2903', '0'), +('14', '30', '18', '1651', '2596', '0'), +('14', '30', '18', '4410', '1685', '0'), +('14', '30', '18', '1251', '1318', '0'), +('14', '30', '18', '1221', '1234', '0'), +('14', '30', '19', '68239', '3821', '0'), +('14', '30', '19', '4407', '3352', '0'), +('14', '30', '19', '1368', '2066', '0'), +('14', '30', '19', '1652', '2046', '0'), +('14', '30', '13', '14759', '9195', '0'), +('14', '30', '13', '27711', '6668', '0'), +('14', '30', '13', '13987', '5012', '0'), +('14', '30', '13', '6359', '4977', '0'), +('14', '30', '14', '14759', '9195', '0'), +('14', '30', '14', '10219', '8362', '0'), +('14', '30', '14', '13987', '5012', '0'), +('14', '30', '14', '9401', '5003', '0'), +('14', '30', '11', '9246', '4542', '0'), +('14', '30', '11', '14762', '3204', '0'), +('14', '30', '11', '13353', '1500', '0'), +('14', '30', '11', '20677', '1200', '0'), +('14', '31', '22', '10323', '0', '0'), +('14', '31', '22', '9246', '0', '0'), +('14', '31', '22', '21509', '0', '0'), +('14', '31', '22', '8007', '0', '0'), +('14', '31', '1', '14702', '5000', '0'), +('14', '31', '1', '14701', '4624', '0'), +('14', '31', '1', '14559', '4143', '0'), +('14', '31', '1', '10082', '2679', '0'), +('14', '31', '2', '10143', '7136', '0'), +('14', '31', '2', '1246', '4944', '0'), +('14', '31', '2', '1211', '4787', '0'), +('14', '31', '2', '30363', '3700', '0'), +('14', '31', '3', '11052', '5617', '0'), +('14', '31', '3', '1275', '5428', '0'), +('14', '31', '3', '4505', '2682', '0'), +('14', '31', '3', '1642', '2165', '0'), +('14', '31', '5', '14703', '8800', '0'), +('14', '31', '5', '14558', '5827', '0'), +('14', '31', '5', '14700', '4836', '0'), +('14', '31', '5', '68291', '4142', '0'), +('14', '31', '8', '11603', '11741', '0'), +('14', '31', '8', '2349', '3651', '0'), +('14', '31', '8', '11621', '3631', '0'), +('14', '31', '8', '1409', '2827', '0'), +('14', '31', '6', '1542', '8465', '0'), +('14', '31', '6', '1557', '5371', '0'), +('14', '31', '6', '1905', '5285', '0'), +('14', '31', '6', '1276', '3275', '0'), +('14', '31', '17', '11641', '13771', '0'), +('14', '31', '17', '1253', '10546', '0'), +('14', '31', '17', '1644', '10348', '0'), +('14', '31', '17', '1214', '9091', '0'), +('14', '31', '7', '1218', '3840', '0'), +('14', '31', '7', '1248', '3624', '0'), +('14', '31', '7', '1362', '3148', '0'), +('14', '31', '7', '1648', '2721', '0'), +('14', '31', '9', '12806', '4748', '0'), +('14', '31', '9', '1649', '2714', '0'), +('14', '31', '9', '14650', '2424', '0'), +('14', '31', '9', '4344', '2127', '0'), +('14', '31', '15', '10366', '4854', '0'), +('14', '31', '15', '10151', '4200', '0'), +('14', '31', '15', '10163', '3709', '0'), +('14', '31', '15', '14679', '3360', '0'), +('14', '31', '20', '11666', '12376', '0'), +('14', '31', '20', '2742', '5549', '0'), +('14', '31', '20', '1277', '2911', '0'), +('14', '31', '20', '1364', '2002', '0'), +('14', '31', '12', '20655', '4584', '0'), +('14', '31', '12', '2923', '4348', '0'), +('14', '31', '12', '1250', '3886', '0'), +('14', '31', '12', '1650', '2951', '0'), +('14', '31', '18', '1651', '2632', '0'), +('14', '31', '18', '4410', '1685', '0'), +('14', '31', '18', '1251', '1318', '0'), +('14', '31', '18', '1221', '1234', '0'), +('14', '31', '19', '68239', '3857', '0'), +('14', '31', '19', '4407', '3461', '0'), +('14', '31', '19', '1368', '2066', '0'), +('14', '31', '19', '1652', '2046', '0'), +('14', '31', '13', '14759', '9260', '0'), +('14', '31', '13', '27711', '6758', '0'), +('14', '31', '13', '6359', '5098', '0'), +('14', '31', '13', '13987', '5072', '0'), +('14', '31', '14', '14759', '9260', '0'), +('14', '31', '14', '10219', '8362', '0'), +('14', '31', '14', '6359', '5098', '0'), +('14', '31', '14', '9401', '5088', '0'), +('14', '31', '11', '9246', '4663', '0'), +('14', '31', '11', '14762', '3204', '0'), +('14', '31', '11', '13353', '1500', '0'), +('14', '31', '11', '20677', '1200', '0'), +('14', '32', '22', '10323', '0', '0'), +('14', '32', '22', '9246', '0', '0'), +('14', '32', '22', '21509', '0', '0'), +('14', '32', '22', '8007', '0', '0'), +('14', '32', '1', '14702', '5000', '0'), +('14', '32', '1', '14701', '4624', '0'), +('14', '32', '1', '14559', '4191', '0'), +('14', '32', '1', '10082', '2752', '0'), +('14', '32', '2', '10143', '7136', '0'), +('14', '32', '2', '1246', '5029', '0'), +('14', '32', '2', '1211', '4872', '0'), +('14', '32', '2', '30363', '3700', '0'), +('14', '32', '3', '11052', '5798', '0'), +('14', '32', '3', '1275', '5501', '0'), +('14', '32', '3', '4505', '2766', '0'), +('14', '32', '3', '1642', '2177', '0'), +('14', '32', '5', '14703', '8800', '0'), +('14', '32', '5', '14558', '5894', '0'), +('14', '32', '5', '14700', '4836', '0'), +('14', '32', '5', '68291', '4190', '0'), +('14', '32', '8', '11603', '11850', '0'), +('14', '32', '8', '2349', '3651', '0'), +('14', '32', '8', '11621', '3631', '0'), +('14', '32', '8', '1409', '2827', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '32', '6', '1542', '8574', '0'), +('14', '32', '6', '1557', '5371', '0'), +('14', '32', '6', '1905', '5292', '0'), +('14', '32', '6', '1276', '3275', '0'), +('14', '32', '17', '11641', '13952', '0'), +('14', '32', '17', '1253', '10561', '0'), +('14', '32', '17', '1644', '10408', '0'), +('14', '32', '17', '1214', '9267', '0'), +('14', '32', '7', '1218', '3924', '0'), +('14', '32', '7', '1248', '3709', '0'), +('14', '32', '7', '1362', '3148', '0'), +('14', '32', '7', '1648', '2781', '0'), +('14', '32', '9', '12806', '4833', '0'), +('14', '32', '9', '1649', '2750', '0'), +('14', '32', '9', '14650', '2424', '0'), +('14', '32', '9', '4344', '2127', '0'), +('14', '32', '15', '10366', '4854', '0'), +('14', '32', '15', '10151', '4200', '0'), +('14', '32', '15', '10163', '3709', '0'), +('14', '32', '15', '14679', '3360', '0'), +('14', '32', '20', '11666', '12386', '0'), +('14', '32', '20', '2742', '5564', '0'), +('14', '32', '20', '1277', '2972', '0'), +('14', '32', '20', '1364', '2050', '0'), +('14', '32', '12', '20655', '4611', '0'), +('14', '32', '12', '2923', '4348', '0'), +('14', '32', '12', '1250', '3983', '0'), +('14', '32', '12', '1650', '2999', '0'), +('14', '32', '18', '1651', '2668', '0'), +('14', '32', '18', '4410', '1685', '0'), +('14', '32', '18', '1251', '1318', '0'), +('14', '32', '18', '1221', '1234', '0'), +('14', '32', '19', '68239', '3894', '0'), +('14', '32', '19', '4407', '3569', '0'), +('14', '32', '19', '1368', '2066', '0'), +('14', '32', '19', '1652', '2046', '0'), +('14', '32', '13', '14759', '9325', '0'), +('14', '32', '13', '27711', '6849', '0'), +('14', '32', '13', '6359', '5219', '0'), +('14', '32', '13', '13987', '5133', '0'), +('14', '32', '14', '14759', '9325', '0'), +('14', '32', '14', '10219', '8362', '0'), +('14', '32', '14', '6359', '5219', '0'), +('14', '32', '14', '9401', '5173', '0'), +('14', '32', '11', '9246', '4784', '0'), +('14', '32', '11', '14762', '3204', '0'), +('14', '32', '11', '13353', '1500', '0'), +('14', '32', '11', '20677', '1200', '0'), +('14', '33', '22', '10323', '0', '0'), +('14', '33', '22', '9246', '0', '0'), +('14', '33', '22', '21509', '0', '0'), +('14', '33', '22', '8007', '0', '0'), +('14', '33', '1', '14702', '5000', '0'), +('14', '33', '1', '14701', '4624', '0'), +('14', '33', '1', '14559', '4240', '0'), +('14', '33', '1', '10082', '2824', '0'), +('14', '33', '2', '10143', '7136', '0'), +('14', '33', '2', '1246', '5113', '0'), +('14', '33', '2', '1211', '4956', '0'), +('14', '33', '2', '30363', '3700', '0'), +('14', '33', '3', '11052', '5980', '0'), +('14', '33', '3', '1275', '5573', '0'), +('14', '33', '3', '4505', '2851', '0'), +('14', '33', '3', '1642', '2189', '0'), +('14', '33', '5', '14703', '8800', '0'), +('14', '33', '5', '14558', '5962', '0'), +('14', '33', '5', '14700', '4836', '0'), +('14', '33', '5', '68291', '4238', '0'), +('14', '33', '8', '11603', '11959', '0'), +('14', '33', '8', '2349', '3651', '0'), +('14', '33', '8', '11621', '3631', '0'), +('14', '33', '8', '1409', '2827', '0'), +('14', '33', '6', '1542', '8683', '0'), +('14', '33', '6', '1557', '5371', '0'), +('14', '33', '6', '1905', '5300', '0'), +('14', '33', '6', '1276', '3275', '0'), +('14', '33', '17', '11641', '14134', '0'), +('14', '33', '17', '1253', '10575', '0'), +('14', '33', '17', '1644', '10468', '0'), +('14', '33', '17', '1214', '9443', '0'), +('14', '33', '7', '1218', '4009', '0'), +('14', '33', '7', '1248', '3793', '0'), +('14', '33', '7', '1362', '3148', '0'), +('14', '33', '7', '1648', '2842', '0'), +('14', '33', '9', '12806', '4917', '0'), +('14', '33', '9', '1649', '2787', '0'), +('14', '33', '9', '14650', '2424', '0'), +('14', '33', '9', '4344', '2127', '0'), +('14', '33', '15', '10366', '4854', '0'), +('14', '33', '15', '10151', '4200', '0'), +('14', '33', '15', '10163', '3709', '0'), +('14', '33', '15', '14679', '3360', '0'), +('14', '33', '20', '11666', '12396', '0'), +('14', '33', '20', '2742', '5578', '0'), +('14', '33', '20', '1277', '3032', '0'), +('14', '33', '20', '1364', '2099', '0'), +('14', '33', '12', '20655', '4638', '0'), +('14', '33', '12', '2923', '4348', '0'), +('14', '33', '12', '1250', '4080', '0'), +('14', '33', '12', '1650', '3048', '0'), +('14', '33', '18', '1651', '2705', '0'), +('14', '33', '18', '4410', '1685', '0'), +('14', '33', '18', '1251', '1318', '0'), +('14', '33', '18', '1221', '1234', '0'), +('14', '33', '19', '68239', '3930', '0'), +('14', '33', '19', '4407', '3678', '0'), +('14', '33', '19', '1368', '2066', '0'), +('14', '33', '19', '1652', '2046', '0'), +('14', '33', '13', '14759', '9391', '0'), +('14', '33', '13', '27711', '6939', '0'), +('14', '33', '13', '6359', '5339', '0'), +('14', '33', '13', '13987', '5193', '0'), +('14', '33', '14', '14759', '9391', '0'), +('14', '33', '14', '10219', '8362', '0'), +('14', '33', '14', '6359', '5339', '0'), +('14', '33', '14', '9401', '5257', '0'), +('14', '33', '11', '9246', '4904', '0'), +('14', '33', '11', '14762', '3204', '0'), +('14', '33', '11', '13353', '1500', '0'), +('14', '33', '11', '20677', '1200', '0'), +('14', '34', '22', '10323', '0', '0'), +('14', '34', '22', '9246', '0', '0'), +('14', '34', '22', '21509', '0', '0'), +('14', '34', '22', '8007', '0', '0'), +('14', '34', '1', '14702', '5000', '0'), +('14', '34', '1', '14701', '4624', '0'), +('14', '34', '1', '14559', '4288', '0'), +('14', '34', '1', '10082', '2897', '0'), +('14', '34', '2', '10143', '7136', '0'), +('14', '34', '2', '1246', '5198', '0'), +('14', '34', '2', '1211', '5041', '0'), +('14', '34', '2', '10141', '3721', '0'), +('14', '34', '3', '11052', '6161', '0'), +('14', '34', '3', '1275', '5646', '0'), +('14', '34', '3', '4505', '2935', '0'), +('14', '34', '3', '2350', '2217', '0'), +('14', '34', '5', '14703', '8800', '0'), +('14', '34', '5', '14558', '6030', '0'), +('14', '34', '5', '14700', '4836', '0'), +('14', '34', '5', '68291', '4287', '0'), +('14', '34', '8', '11603', '12067', '0'), +('14', '34', '8', '2349', '3651', '0'), +('14', '34', '8', '11621', '3631', '0'), +('14', '34', '8', '1409', '2827', '0'), +('14', '34', '6', '1542', '8791', '0'), +('14', '34', '6', '1557', '5371', '0'), +('14', '34', '6', '1905', '5307', '0'), +('14', '34', '6', '1276', '3275', '0'), +('14', '34', '17', '11641', '14315', '0'), +('14', '34', '17', '1253', '10590', '0'), +('14', '34', '17', '1644', '10529', '0'), +('14', '34', '17', '1214', '9618', '0'), +('14', '34', '7', '1218', '4093', '0'), +('14', '34', '7', '1248', '3878', '0'), +('14', '34', '7', '1362', '3148', '0'), +('14', '34', '7', '1648', '2902', '0'), +('14', '34', '9', '12806', '5002', '0'), +('14', '34', '9', '1649', '2823', '0'), +('14', '34', '9', '14650', '2424', '0'), +('14', '34', '9', '4408', '2144', '0'), +('14', '34', '15', '10366', '4854', '0'), +('14', '34', '15', '10151', '4200', '0'), +('14', '34', '15', '10163', '3709', '0'), +('14', '34', '15', '14679', '3360', '0'), +('14', '34', '20', '11666', '12406', '0'), +('14', '34', '20', '2742', '5593', '0'), +('14', '34', '20', '1277', '3093', '0'), +('14', '34', '20', '1364', '2147', '0'), +('14', '34', '12', '20655', '4665', '0'), +('14', '34', '12', '2923', '4348', '0'), +('14', '34', '12', '1250', '4176', '0'), +('14', '34', '12', '1650', '3096', '0'), +('14', '34', '18', '1651', '2741', '0'), +('14', '34', '18', '4410', '1685', '0'), +('14', '34', '18', '1251', '1318', '0'), +('14', '34', '18', '1221', '1234', '0'), +('14', '34', '19', '68239', '3966', '0'), +('14', '34', '19', '4407', '3787', '0'), +('14', '34', '19', '1368', '2066', '0'), +('14', '34', '19', '1652', '2046', '0'), +('14', '34', '13', '14759', '9456', '0'), +('14', '34', '13', '27711', '7030', '0'), +('14', '34', '13', '6359', '5460', '0'), +('14', '34', '13', '13500', '5295', '0'), +('14', '34', '14', '14759', '9456', '0'), +('14', '34', '14', '10219', '8362', '0'), +('14', '34', '14', '6359', '5460', '0'), +('14', '34', '14', '9401', '5342', '0'), +('14', '34', '11', '9246', '5025', '0'), +('14', '34', '11', '14762', '3204', '0'), +('14', '34', '11', '13353', '1500', '0'), +('14', '34', '11', '20677', '1200', '0'), +('14', '35', '22', '10323', '0', '0'), +('14', '35', '22', '9246', '0', '0'), +('14', '35', '22', '21509', '0', '0'), +('14', '35', '22', '8007', '0', '0'), +('14', '35', '1', '14702', '5000', '0'), +('14', '35', '1', '14701', '4624', '0'), +('14', '35', '1', '14559', '4336', '0'), +('14', '35', '1', '10082', '2969', '0'), +('14', '35', '2', '10143', '7136', '0'), +('14', '35', '2', '1246', '5282', '0'), +('14', '35', '2', '1211', '5126', '0'), +('14', '35', '2', '10141', '3829', '0'), +('14', '35', '3', '11052', '6342', '0'), +('14', '35', '3', '1275', '5718', '0'), +('14', '35', '3', '4505', '3020', '0'), +('14', '35', '3', '2350', '2277', '0'), +('14', '35', '5', '14703', '8800', '0'), +('14', '35', '5', '14558', '6097', '0'), +('14', '35', '5', '14700', '4836', '0'), +('14', '35', '5', '68291', '4335', '0'), +('14', '35', '8', '11603', '12176', '0'), +('14', '35', '8', '2349', '3651', '0'), +('14', '35', '8', '11621', '3631', '0'), +('14', '35', '8', '1409', '2827', '0'), +('14', '35', '6', '1542', '8900', '0'), +('14', '35', '6', '1557', '5371', '0'), +('14', '35', '6', '1905', '5314', '0'), +('14', '35', '6', '1276', '3275', '0'), +('14', '35', '17', '11641', '14496', '0'), +('14', '35', '17', '1253', '10604', '0'), +('14', '35', '17', '1644', '10589', '0'), +('14', '35', '17', '1214', '9794', '0'), +('14', '35', '7', '1218', '4178', '0'), +('14', '35', '7', '1248', '3962', '0'), +('14', '35', '7', '1362', '3148', '0'), +('14', '35', '7', '1648', '2962', '0'), +('14', '35', '9', '12806', '5086', '0'), +('14', '35', '9', '1649', '2859', '0'), +('14', '35', '9', '14650', '2424', '0'), +('14', '35', '9', '4408', '2205', '0'), +('14', '35', '15', '10366', '4854', '0'), +('14', '35', '15', '10151', '4200', '0'), +('14', '35', '15', '10163', '3709', '0'), +('14', '35', '15', '14679', '3360', '0'), +('14', '35', '20', '11666', '12416', '0'), +('14', '35', '20', '2742', '5607', '0'), +('14', '35', '20', '1277', '3153', '0'), +('14', '35', '20', '1364', '2195', '0'), +('14', '35', '12', '20655', '4692', '0'), +('14', '35', '12', '2923', '4348', '0'), +('14', '35', '12', '1250', '4273', '0'), +('14', '35', '12', '1650', '3144', '0'), +('14', '35', '18', '1651', '2777', '0'), +('14', '35', '18', '4410', '1685', '0'), +('14', '35', '18', '1251', '1318', '0'), +('14', '35', '18', '1221', '1234', '0'), +('14', '35', '19', '68239', '4002', '0'), +('14', '35', '19', '4407', '3896', '0'), +('14', '35', '19', '1368', '2066', '0'), +('14', '35', '19', '1652', '2046', '0'), +('14', '35', '13', '14759', '9521', '0'), +('14', '35', '13', '27711', '7121', '0'), +('14', '35', '13', '6359', '5581', '0'), +('14', '35', '13', '13500', '5416', '0'), +('14', '35', '14', '14759', '9521', '0'), +('14', '35', '14', '10219', '8362', '0'), +('14', '35', '14', '6359', '5581', '0'), +('14', '35', '14', '9401', '5426', '0'), +('14', '35', '11', '9246', '5146', '0'), +('14', '35', '11', '14762', '3204', '0'), +('14', '35', '11', '13353', '1500', '0'), +('14', '35', '11', '20677', '1200', '0'), +('14', '36', '22', '10323', '0', '0'), +('14', '36', '22', '9246', '0', '0'), +('14', '36', '22', '21509', '0', '0'), +('14', '36', '22', '8007', '0', '0'), +('14', '36', '1', '14702', '5000', '0'), +('14', '36', '1', '14701', '4624', '0'), +('14', '36', '1', '14559', '4384', '0'), +('14', '36', '1', '10082', '3042', '0'), +('14', '36', '2', '10143', '7136', '0'), +('14', '36', '2', '1246', '5367', '0'), +('14', '36', '2', '1211', '5210', '0'), +('14', '36', '2', '10141', '3938', '0'), +('14', '36', '3', '11052', '6523', '0'), +('14', '36', '3', '1275', '5790', '0'), +('14', '36', '3', '4505', '3105', '0'), +('14', '36', '3', '2350', '2337', '0'), +('14', '36', '5', '14703', '8800', '0'), +('14', '36', '5', '14558', '6165', '0'), +('14', '36', '5', '14700', '4836', '0'), +('14', '36', '5', '68291', '4383', '0'), +('14', '36', '8', '11603', '12285', '0'), +('14', '36', '8', '2349', '3651', '0'), +('14', '36', '8', '11621', '3631', '0'), +('14', '36', '8', '1409', '2827', '0'), +('14', '36', '6', '1542', '9009', '0'), +('14', '36', '6', '1557', '5371', '0'), +('14', '36', '6', '1905', '5321', '0'), +('14', '36', '6', '1276', '3275', '0'), +('14', '36', '17', '11641', '14677', '0'), +('14', '36', '17', '1644', '10650', '0'), +('14', '36', '17', '1253', '10618', '0'), +('14', '36', '17', '1214', '9970', '0'), +('14', '36', '7', '1218', '4262', '0'), +('14', '36', '7', '1248', '4047', '0'), +('14', '36', '7', '1362', '3148', '0'), +('14', '36', '7', '1648', '3023', '0'), +('14', '36', '9', '12806', '5171', '0'), +('14', '36', '9', '1649', '2895', '0'), +('14', '36', '9', '14650', '2424', '0'), +('14', '36', '9', '4408', '2265', '0'), +('14', '36', '15', '10366', '4854', '0'), +('14', '36', '15', '10151', '4200', '0'), +('14', '36', '15', '10163', '3709', '0'), +('14', '36', '15', '14679', '3360', '0'), +('14', '36', '20', '11666', '12426', '0'), +('14', '36', '20', '2742', '5622', '0'), +('14', '36', '20', '1277', '3213', '0'), +('14', '36', '20', '1364', '2244', '0'), +('14', '36', '12', '20655', '4719', '0'), +('14', '36', '12', '1250', '4370', '0'), +('14', '36', '12', '2923', '4348', '0'), +('14', '36', '12', '2336', '3199', '0'), +('14', '36', '18', '1651', '2813', '0'), +('14', '36', '18', '4410', '1685', '0'), +('14', '36', '18', '1251', '1318', '0'), +('14', '36', '18', '1221', '1234', '0'), +('14', '36', '19', '68239', '4038', '0'), +('14', '36', '19', '4407', '4004', '0'), +('14', '36', '19', '1368', '2066', '0'), +('14', '36', '19', '1652', '2046', '0'), +('14', '36', '13', '14759', '9586', '0'), +('14', '36', '13', '27711', '7211', '0'), +('14', '36', '13', '6359', '5702', '0'), +('14', '36', '13', '13500', '5537', '0'), +('14', '36', '14', '14759', '9586', '0'), +('14', '36', '14', '10219', '8362', '0'), +('14', '36', '14', '6359', '5702', '0'), +('14', '36', '14', '9401', '5511', '0'), +('14', '36', '11', '9246', '5267', '0'), +('14', '36', '11', '14762', '3204', '0'), +('14', '36', '11', '13353', '1500', '0'), +('14', '36', '11', '20677', '1200', '0'), +('14', '37', '22', '10323', '0', '0'), +('14', '37', '22', '9246', '0', '0'), +('14', '37', '22', '21509', '0', '0'), +('14', '37', '22', '8007', '0', '0'), +('14', '37', '1', '14702', '5000', '0'), +('14', '37', '1', '14701', '4624', '0'), +('14', '37', '1', '14559', '4433', '0'), +('14', '37', '1', '10082', '3114', '0'), +('14', '37', '2', '10143', '7136', '0'), +('14', '37', '2', '1246', '5452', '0'), +('14', '37', '2', '1211', '5295', '0'), +('14', '37', '2', '10141', '4047', '0'), +('14', '37', '3', '11052', '6704', '0'), +('14', '37', '3', '1275', '5863', '0'), +('14', '37', '3', '4505', '3189', '0'), +('14', '37', '3', '2350', '2398', '0'), +('14', '37', '5', '14703', '8800', '0'), +('14', '37', '5', '14558', '6232', '0'), +('14', '37', '5', '14700', '4836', '0'), +('14', '37', '5', '68291', '4431', '0'), +('14', '37', '8', '11603', '12393', '0'), +('14', '37', '8', '2349', '3651', '0'), +('14', '37', '8', '11621', '3631', '0'), +('14', '37', '8', '1409', '2827', '0'), +('14', '37', '6', '1542', '9117', '0'), +('14', '37', '6', '1557', '5371', '0'), +('14', '37', '6', '1905', '5329', '0'), +('14', '37', '6', '1276', '3275', '0'), +('14', '37', '17', '11641', '14858', '0'), +('14', '37', '17', '1644', '10710', '0'), +('14', '37', '17', '1253', '10633', '0'), +('14', '37', '17', '1214', '10146', '0'), +('14', '37', '7', '1218', '4347', '0'), +('14', '37', '7', '1248', '4131', '0'), +('14', '37', '7', '1362', '3148', '0'), +('14', '37', '7', '1648', '3083', '0'), +('14', '37', '9', '12806', '5256', '0'), +('14', '37', '9', '1649', '2931', '0'), +('14', '37', '9', '14650', '2424', '0'), +('14', '37', '9', '4408', '2325', '0'), +('14', '37', '15', '10366', '4854', '0'), +('14', '37', '15', '10151', '4200', '0'), +('14', '37', '15', '10163', '3709', '0'), +('14', '37', '15', '14679', '3360', '0'), +('14', '37', '20', '11666', '12436', '0'), +('14', '37', '20', '2742', '5636', '0'), +('14', '37', '20', '1277', '3274', '0'), +('14', '37', '20', '1364', '2292', '0'), +('14', '37', '12', '20655', '4746', '0'), +('14', '37', '12', '1250', '4466', '0'), +('14', '37', '12', '2923', '4348', '0'), +('14', '37', '12', '2336', '3259', '0'), +('14', '37', '18', '1651', '2850', '0'), +('14', '37', '18', '4410', '1685', '0'), +('14', '37', '18', '1251', '1318', '0'), +('14', '37', '18', '1221', '1234', '0'), +('14', '37', '19', '4407', '4113', '0'), +('14', '37', '19', '68239', '4075', '0'), +('14', '37', '19', '1368', '2066', '0'), +('14', '37', '19', '1652', '2046', '0'), +('14', '37', '13', '14759', '9652', '0'), +('14', '37', '13', '27711', '7302', '0'), +('14', '37', '13', '6359', '5823', '0'), +('14', '37', '13', '13500', '5658', '0'), +('14', '37', '14', '14759', '9652', '0'), +('14', '37', '14', '10219', '8362', '0'), +('14', '37', '14', '6359', '5823', '0'), +('14', '37', '14', '9401', '5595', '0'), +('14', '37', '11', '9246', '5388', '0'), +('14', '37', '11', '14762', '3204', '0'), +('14', '37', '11', '13353', '1500', '0'), +('14', '37', '11', '20677', '1200', '0'), +('14', '38', '22', '10323', '0', '0'), +('14', '38', '22', '9246', '0', '0'), +('14', '38', '22', '21509', '0', '0'), +('14', '38', '22', '8007', '0', '0'), +('14', '38', '1', '14702', '5000', '0'), +('14', '38', '1', '14701', '4624', '0'), +('14', '38', '1', '14559', '4481', '0'), +('14', '38', '1', '10082', '3187', '0'), +('14', '38', '2', '10143', '7136', '0'), +('14', '38', '2', '1246', '5536', '0'), +('14', '38', '2', '1211', '5379', '0'), +('14', '38', '2', '10141', '4156', '0'), +('14', '38', '3', '11052', '6886', '0'), +('14', '38', '3', '1275', '5935', '0'), +('14', '38', '3', '4505', '3274', '0'), +('14', '38', '3', '2350', '2458', '0'), +('14', '38', '5', '14703', '8800', '0'), +('14', '38', '5', '14558', '6300', '0'), +('14', '38', '5', '14700', '4836', '0'), +('14', '38', '5', '68291', '4480', '0'), +('14', '38', '8', '11603', '12502', '0'), +('14', '38', '8', '2349', '3651', '0'), +('14', '38', '8', '11621', '3631', '0'), +('14', '38', '8', '1409', '2827', '0'), +('14', '38', '6', '1542', '9226', '0'), +('14', '38', '6', '1557', '5371', '0'), +('14', '38', '6', '1905', '5336', '0'), +('14', '38', '6', '1276', '3275', '0'), +('14', '38', '17', '11641', '15040', '0'), +('14', '38', '17', '1644', '10770', '0'), +('14', '38', '17', '1253', '10647', '0'), +('14', '38', '17', '1214', '10322', '0'), +('14', '38', '7', '1218', '4432', '0'), +('14', '38', '7', '1248', '4216', '0'), +('14', '38', '7', '1362', '3148', '0'), +('14', '38', '7', '1648', '3144', '0'), +('14', '38', '9', '12806', '5340', '0'), +('14', '38', '9', '1649', '2968', '0'), +('14', '38', '9', '14650', '2424', '0'), +('14', '38', '9', '4408', '2386', '0'), +('14', '38', '15', '10366', '4854', '0'), +('14', '38', '15', '10151', '4200', '0'), +('14', '38', '15', '10163', '3709', '0'), +('14', '38', '15', '14679', '3360', '0'), +('14', '38', '20', '11666', '12447', '0'), +('14', '38', '20', '2742', '5651', '0'), +('14', '38', '20', '1277', '3334', '0'), +('14', '38', '20', '1364', '2340', '0'), +('14', '38', '12', '20655', '4773', '0'), +('14', '38', '12', '1250', '4563', '0'), +('14', '38', '12', '2923', '4348', '0'), +('14', '38', '12', '2336', '3319', '0'), +('14', '38', '18', '1651', '2886', '0'), +('14', '38', '18', '4410', '1685', '0'), +('14', '38', '18', '1251', '1318', '0'), +('14', '38', '18', '1221', '1234', '0'), +('14', '38', '19', '4407', '4222', '0'), +('14', '38', '19', '68239', '4111', '0'), +('14', '38', '19', '1368', '2066', '0'), +('14', '38', '19', '1652', '2046', '0'), +('14', '38', '13', '14759', '9717', '0'), +('14', '38', '13', '27711', '7392', '0'), +('14', '38', '13', '6359', '5943', '0'), +('14', '38', '13', '13500', '5778', '0'), +('14', '38', '14', '14759', '9717', '0'), +('14', '38', '14', '10219', '8362', '0'), +('14', '38', '14', '6359', '5943', '0'), +('14', '38', '14', '9401', '5680', '0'), +('14', '38', '11', '9246', '5508', '0'), +('14', '38', '11', '14762', '3204', '0'), +('14', '38', '11', '13353', '1500', '0'), +('14', '38', '11', '20677', '1200', '0'), +('14', '39', '22', '10323', '0', '0'), +('14', '39', '22', '9246', '0', '0'), +('14', '39', '22', '21509', '0', '0'), +('14', '39', '22', '8007', '0', '0'), +('14', '39', '1', '14702', '5000', '0'), +('14', '39', '1', '14701', '4624', '0'), +('14', '39', '1', '14559', '4529', '0'), +('14', '39', '1', '10082', '3259', '0'), +('14', '39', '2', '10143', '7136', '0'), +('14', '39', '2', '1246', '5621', '0'), +('14', '39', '2', '1211', '5464', '0'), +('14', '39', '2', '10141', '4264', '0'), +('14', '39', '3', '11052', '7067', '0'), +('14', '39', '3', '1275', '6008', '0'), +('14', '39', '3', '4505', '3358', '0'), +('14', '39', '3', '2350', '2519', '0'), +('14', '39', '5', '14703', '8800', '0'), +('14', '39', '5', '14558', '6368', '0'), +('14', '39', '5', '14700', '4836', '0'), +('14', '39', '5', '68291', '4528', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '39', '8', '11603', '12611', '0'), +('14', '39', '8', '2349', '3651', '0'), +('14', '39', '8', '11621', '3631', '0'), +('14', '39', '8', '1409', '2827', '0'), +('14', '39', '6', '1542', '9335', '0'), +('14', '39', '6', '1557', '5371', '0'), +('14', '39', '6', '1905', '5343', '0'), +('14', '39', '6', '1276', '3275', '0'), +('14', '39', '17', '11641', '15221', '0'), +('14', '39', '17', '1644', '10831', '0'), +('14', '39', '17', '1253', '10662', '0'), +('14', '39', '17', '1214', '10498', '0'), +('14', '39', '7', '1218', '4516', '0'), +('14', '39', '7', '1248', '4301', '0'), +('14', '39', '7', '1648', '3204', '0'), +('14', '39', '7', '1362', '3148', '0'), +('14', '39', '9', '12806', '5425', '0'), +('14', '39', '9', '1649', '3004', '0'), +('14', '39', '9', '4408', '2446', '0'), +('14', '39', '9', '14650', '2424', '0'), +('14', '39', '15', '10366', '4854', '0'), +('14', '39', '15', '10151', '4200', '0'), +('14', '39', '15', '10163', '3709', '0'), +('14', '39', '15', '14679', '3360', '0'), +('14', '39', '20', '11666', '12457', '0'), +('14', '39', '20', '2742', '5665', '0'), +('14', '39', '20', '1277', '3395', '0'), +('14', '39', '20', '1364', '2389', '0'), +('14', '39', '12', '20655', '4801', '0'), +('14', '39', '12', '1250', '4660', '0'), +('14', '39', '12', '2923', '4348', '0'), +('14', '39', '12', '2336', '3380', '0'), +('14', '39', '18', '1651', '2922', '0'), +('14', '39', '18', '4410', '1685', '0'), +('14', '39', '18', '1251', '1318', '0'), +('14', '39', '18', '1221', '1234', '0'), +('14', '39', '19', '4407', '4330', '0'), +('14', '39', '19', '68239', '4147', '0'), +('14', '39', '19', '1368', '2066', '0'), +('14', '39', '19', '1652', '2046', '0'), +('14', '39', '13', '14759', '9782', '0'), +('14', '39', '13', '27711', '7483', '0'), +('14', '39', '13', '6359', '6064', '0'), +('14', '39', '13', '13500', '5899', '0'), +('14', '39', '14', '14759', '9782', '0'), +('14', '39', '14', '10219', '8362', '0'), +('14', '39', '14', '6359', '6064', '0'), +('14', '39', '14', '9401', '5764', '0'), +('14', '39', '11', '9246', '5629', '0'), +('14', '39', '11', '14762', '3204', '0'), +('14', '39', '11', '13353', '1500', '0'), +('14', '39', '11', '20677', '1200', '0'), +('14', '40', '22', '10323', '0', '0'), +('14', '40', '22', '9246', '0', '0'), +('14', '40', '22', '21509', '0', '0'), +('14', '40', '22', '8007', '0', '0'), +('14', '40', '1', '14702', '5000', '0'), +('14', '40', '1', '14701', '4624', '0'), +('14', '40', '1', '14559', '4578', '0'), +('14', '40', '1', '10082', '3332', '0'), +('14', '40', '2', '10143', '7136', '0'), +('14', '40', '2', '1246', '5705', '0'), +('14', '40', '2', '1211', '5548', '0'), +('14', '40', '2', '10141', '4373', '0'), +('14', '40', '3', '11052', '7248', '0'), +('14', '40', '3', '1275', '6080', '0'), +('14', '40', '3', '4505', '3443', '0'), +('14', '40', '3', '2350', '2579', '0'), +('14', '40', '5', '14703', '8800', '0'), +('14', '40', '5', '14558', '6435', '0'), +('14', '40', '5', '14700', '4836', '0'), +('14', '40', '5', '68291', '4576', '0'), +('14', '40', '8', '11603', '12720', '0'), +('14', '40', '8', '2349', '3651', '0'), +('14', '40', '8', '11621', '3631', '0'), +('14', '40', '8', '1409', '2827', '0'), +('14', '40', '6', '1542', '9444', '0'), +('14', '40', '6', '1557', '5371', '0'), +('14', '40', '6', '1905', '5350', '0'), +('14', '40', '6', '1276', '3275', '0'), +('14', '40', '17', '11641', '15402', '0'), +('14', '40', '17', '1644', '10891', '0'), +('14', '40', '17', '1253', '10676', '0'), +('14', '40', '17', '1214', '10674', '0'), +('14', '40', '7', '1218', '4601', '0'), +('14', '40', '7', '1248', '4385', '0'), +('14', '40', '7', '1648', '3264', '0'), +('14', '40', '7', '1362', '3148', '0'), +('14', '40', '9', '12806', '5509', '0'), +('14', '40', '9', '1649', '3040', '0'), +('14', '40', '9', '4408', '2507', '0'), +('14', '40', '9', '14650', '2424', '0'), +('14', '40', '15', '10366', '4854', '0'), +('14', '40', '15', '10151', '4200', '0'), +('14', '40', '15', '10163', '3709', '0'), +('14', '40', '15', '14679', '3360', '0'), +('14', '40', '20', '11666', '12467', '0'), +('14', '40', '20', '2742', '5680', '0'), +('14', '40', '20', '1277', '3455', '0'), +('14', '40', '20', '1364', '2437', '0'), +('14', '40', '12', '20655', '4828', '0'), +('14', '40', '12', '1250', '4756', '0'), +('14', '40', '12', '2923', '4348', '0'), +('14', '40', '12', '2336', '3440', '0'), +('14', '40', '18', '1651', '2958', '0'), +('14', '40', '18', '4410', '1685', '0'), +('14', '40', '18', '1251', '1318', '0'), +('14', '40', '18', '1221', '1234', '0'), +('14', '40', '19', '4407', '4439', '0'), +('14', '40', '19', '68239', '4183', '0'), +('14', '40', '19', '1368', '2066', '0'), +('14', '40', '19', '1652', '2046', '0'), +('14', '40', '13', '14759', '9847', '0'), +('14', '40', '13', '27711', '7574', '0'), +('14', '40', '13', '6359', '6185', '0'), +('14', '40', '13', '13500', '6020', '0'), +('14', '40', '14', '14759', '9847', '0'), +('14', '40', '14', '10219', '8362', '0'), +('14', '40', '14', '6359', '6185', '0'), +('14', '40', '14', '9401', '5849', '0'), +('14', '40', '11', '9246', '5750', '0'), +('14', '40', '11', '14762', '3204', '0'), +('14', '40', '11', '13353', '1500', '0'), +('14', '40', '11', '20677', '1200', '0'), +('14', '41', '22', '10323', '0', '0'), +('14', '41', '22', '9246', '0', '0'), +('14', '41', '22', '21509', '0', '0'), +('14', '41', '22', '8007', '0', '0'), +('14', '41', '1', '14702', '5000', '0'), +('14', '41', '1', '14559', '4626', '0'), +('14', '41', '1', '14701', '4624', '0'), +('14', '41', '1', '10082', '3404', '0'), +('14', '41', '2', '10143', '7136', '0'), +('14', '41', '2', '1246', '5790', '0'), +('14', '41', '2', '1211', '5633', '0'), +('14', '41', '2', '10141', '4482', '0'), +('14', '41', '3', '11052', '7429', '0'), +('14', '41', '3', '1275', '6153', '0'), +('14', '41', '3', '4505', '3527', '0'), +('14', '41', '3', '2350', '2639', '0'), +('14', '41', '5', '14703', '8800', '0'), +('14', '41', '5', '14558', '6503', '0'), +('14', '41', '5', '14700', '4836', '0'), +('14', '41', '5', '68291', '4625', '0'), +('14', '41', '8', '11603', '12828', '0'), +('14', '41', '8', '2349', '3651', '0'), +('14', '41', '8', '11621', '3631', '0'), +('14', '41', '8', '1409', '2827', '0'), +('14', '41', '6', '1542', '9552', '0'), +('14', '41', '6', '1557', '5371', '0'), +('14', '41', '6', '1905', '5358', '0'), +('14', '41', '6', '1276', '3275', '0'), +('14', '41', '17', '11641', '15583', '0'), +('14', '41', '17', '1644', '10952', '0'), +('14', '41', '17', '1214', '10850', '0'), +('14', '41', '17', '1247', '10725', '0'), +('14', '41', '7', '1218', '4685', '0'), +('14', '41', '7', '1248', '4470', '0'), +('14', '41', '7', '1648', '3325', '0'), +('14', '41', '7', '1362', '3148', '0'), +('14', '41', '9', '12806', '5594', '0'), +('14', '41', '9', '1649', '3076', '0'), +('14', '41', '9', '4408', '2567', '0'), +('14', '41', '9', '14650', '2424', '0'), +('14', '41', '15', '10366', '4854', '0'), +('14', '41', '15', '10151', '4200', '0'), +('14', '41', '15', '10163', '3709', '0'), +('14', '41', '15', '14679', '3360', '0'), +('14', '41', '20', '11666', '12477', '0'), +('14', '41', '20', '2742', '5694', '0'), +('14', '41', '20', '1277', '3515', '0'), +('14', '41', '20', '1364', '2485', '0'), +('14', '41', '12', '20655', '4855', '0'), +('14', '41', '12', '1250', '4853', '0'), +('14', '41', '12', '2923', '4348', '0'), +('14', '41', '12', '2336', '3501', '0'), +('14', '41', '18', '1651', '2995', '0'), +('14', '41', '18', '4410', '1685', '0'), +('14', '41', '18', '1251', '1318', '0'), +('14', '41', '18', '1221', '1234', '0'), +('14', '41', '19', '4407', '4548', '0'), +('14', '41', '19', '68239', '4220', '0'), +('14', '41', '19', '1368', '2066', '0'), +('14', '41', '19', '1652', '2046', '0'), +('14', '41', '13', '14759', '9912', '0'), +('14', '41', '13', '27711', '7664', '0'), +('14', '41', '13', '6359', '6306', '0'), +('14', '41', '13', '13500', '6141', '0'), +('14', '41', '14', '14759', '9912', '0'), +('14', '41', '14', '10219', '8362', '0'), +('14', '41', '14', '6359', '6306', '0'), +('14', '41', '14', '9401', '5934', '0'), +('14', '41', '11', '9246', '5871', '0'), +('14', '41', '11', '14762', '3204', '0'), +('14', '41', '11', '13353', '1500', '0'), +('14', '41', '11', '20677', '1200', '0'), +('14', '42', '22', '10323', '0', '0'), +('14', '42', '22', '9246', '0', '0'), +('14', '42', '22', '21509', '0', '0'), +('14', '42', '22', '8007', '0', '0'), +('14', '42', '1', '14702', '5000', '0'), +('14', '42', '1', '14559', '4674', '0'), +('14', '42', '1', '14701', '4624', '0'), +('14', '42', '1', '10082', '3477', '0'), +('14', '42', '2', '10143', '7136', '0'), +('14', '42', '2', '1246', '5874', '0'), +('14', '42', '2', '1211', '5717', '0'), +('14', '42', '2', '10141', '4590', '0'), +('14', '42', '3', '11052', '7610', '0'), +('14', '42', '3', '1275', '6225', '0'), +('14', '42', '3', '4505', '3612', '0'), +('14', '42', '3', '2350', '2700', '0'), +('14', '42', '5', '14703', '8800', '0'), +('14', '42', '5', '14558', '6571', '0'), +('14', '42', '5', '14700', '4836', '0'), +('14', '42', '5', '68291', '4673', '0'), +('14', '42', '8', '11603', '12937', '0'), +('14', '42', '8', '2349', '3651', '0'), +('14', '42', '8', '11621', '3631', '0'), +('14', '42', '8', '1409', '2827', '0'), +('14', '42', '6', '1542', '9661', '0'), +('14', '42', '6', '1557', '5371', '0'), +('14', '42', '6', '1905', '5365', '0'), +('14', '42', '6', '1276', '3275', '0'), +('14', '42', '17', '11641', '15764', '0'), +('14', '42', '17', '1214', '11025', '0'), +('14', '42', '17', '1644', '11012', '0'), +('14', '42', '17', '1247', '10897', '0'), +('14', '42', '7', '1218', '4770', '0'), +('14', '42', '7', '1248', '4554', '0'), +('14', '42', '7', '1648', '3385', '0'), +('14', '42', '7', '1362', '3148', '0'), +('14', '42', '9', '12806', '5678', '0'), +('14', '42', '9', '1649', '3113', '0'), +('14', '42', '9', '4408', '2627', '0'), +('14', '42', '9', '14650', '2424', '0'), +('14', '42', '15', '10366', '4854', '0'), +('14', '42', '15', '10151', '4200', '0'), +('14', '42', '15', '10163', '3709', '0'), +('14', '42', '15', '14679', '3360', '0'), +('14', '42', '20', '11666', '12487', '0'), +('14', '42', '20', '2742', '5708', '0'), +('14', '42', '20', '1277', '3576', '0'), +('14', '42', '20', '1364', '2534', '0'), +('14', '42', '12', '1250', '4949', '0'), +('14', '42', '12', '20655', '4882', '0'), +('14', '42', '12', '2923', '4348', '0'), +('14', '42', '12', '2336', '3561', '0'), +('14', '42', '18', '1651', '3031', '0'), +('14', '42', '18', '4410', '1685', '0'), +('14', '42', '18', '1251', '1318', '0'), +('14', '42', '18', '1221', '1234', '0'), +('14', '42', '19', '4407', '4657', '0'), +('14', '42', '19', '68239', '4256', '0'), +('14', '42', '19', '1368', '2066', '0'), +('14', '42', '19', '1652', '2046', '0'), +('14', '42', '13', '14759', '9978', '0'), +('14', '42', '13', '27711', '7755', '0'), +('14', '42', '13', '6359', '6427', '0'), +('14', '42', '13', '13500', '6262', '0'), +('14', '42', '14', '14759', '9978', '0'), +('14', '42', '14', '10219', '8362', '0'), +('14', '42', '14', '6359', '6427', '0'), +('14', '42', '14', '9401', '6018', '0'), +('14', '42', '11', '9246', '5992', '0'), +('14', '42', '11', '14762', '3204', '0'), +('14', '42', '11', '13353', '1500', '0'), +('14', '42', '11', '20677', '1200', '0'), +('14', '43', '22', '10323', '0', '0'), +('14', '43', '22', '9246', '0', '0'), +('14', '43', '22', '21509', '0', '0'), +('14', '43', '22', '8007', '0', '0'), +('14', '43', '1', '14702', '5000', '0'), +('14', '43', '1', '14559', '4723', '0'), +('14', '43', '1', '14701', '4624', '0'), +('14', '43', '1', '10082', '3549', '0'), +('14', '43', '2', '10143', '7136', '0'), +('14', '43', '2', '1246', '5959', '0'), +('14', '43', '2', '1211', '5802', '0'), +('14', '43', '2', '10141', '4699', '0'), +('14', '43', '3', '11052', '7792', '0'), +('14', '43', '3', '1275', '6298', '0'), +('14', '43', '3', '4505', '3696', '0'), +('14', '43', '3', '2350', '2760', '0'), +('14', '43', '5', '14703', '8800', '0'), +('14', '43', '5', '14558', '6638', '0'), +('14', '43', '5', '14700', '4836', '0'), +('14', '43', '5', '68291', '4721', '0'), +('14', '43', '8', '11603', '13046', '0'), +('14', '43', '8', '2349', '3651', '0'), +('14', '43', '8', '11621', '3631', '0'), +('14', '43', '8', '1057', '2844', '0'), +('14', '43', '6', '1542', '9770', '0'), +('14', '43', '6', '1905', '5372', '0'), +('14', '43', '6', '1557', '5371', '0'), +('14', '43', '6', '1276', '3275', '0'), +('14', '43', '17', '11641', '15946', '0'), +('14', '43', '17', '1214', '11201', '0'), +('14', '43', '17', '1644', '11072', '0'), +('14', '43', '17', '1247', '11068', '0'), +('14', '43', '7', '1218', '4854', '0'), +('14', '43', '7', '1248', '4639', '0'), +('14', '43', '7', '1648', '3446', '0'), +('14', '43', '7', '1362', '3148', '0'), +('14', '43', '9', '12806', '5763', '0'), +('14', '43', '9', '1649', '3149', '0'), +('14', '43', '9', '4408', '2688', '0'), +('14', '43', '9', '14650', '2424', '0'), +('14', '43', '15', '10366', '4854', '0'), +('14', '43', '15', '10151', '4200', '0'), +('14', '43', '15', '10163', '3709', '0'), +('14', '43', '15', '14679', '3360', '0'), +('14', '43', '20', '11666', '12497', '0'), +('14', '43', '20', '2742', '5723', '0'), +('14', '43', '20', '1277', '3636', '0'), +('14', '43', '20', '1364', '2582', '0'), +('14', '43', '12', '1250', '5046', '0'), +('14', '43', '12', '20655', '4909', '0'), +('14', '43', '12', '2923', '4348', '0'), +('14', '43', '12', '2336', '3621', '0'), +('14', '43', '18', '1651', '3067', '0'), +('14', '43', '18', '4410', '1685', '0'), +('14', '43', '18', '1251', '1318', '0'), +('14', '43', '18', '1221', '1234', '0'), +('14', '43', '19', '4407', '4765', '0'), +('14', '43', '19', '68239', '4292', '0'), +('14', '43', '19', '1368', '2066', '0'), +('14', '43', '19', '1652', '2046', '0'), +('14', '43', '13', '14759', '10043', '0'), +('14', '43', '13', '27711', '7845', '0'), +('14', '43', '13', '6359', '6547', '0'), +('14', '43', '13', '13500', '6382', '0'), +('14', '43', '14', '14759', '10043', '0'), +('14', '43', '14', '10219', '8362', '0'), +('14', '43', '14', '6359', '6547', '0'), +('14', '43', '14', '9246', '6112', '0'), +('14', '43', '11', '9246', '6112', '0'), +('14', '43', '11', '14762', '3204', '0'), +('14', '43', '11', '13353', '1500', '0'), +('14', '43', '11', '20677', '1200', '0'), +('14', '44', '22', '10323', '0', '0'), +('14', '44', '22', '9246', '0', '0'), +('14', '44', '22', '21509', '0', '0'), +('14', '44', '22', '8007', '0', '0'), +('14', '44', '1', '14702', '5000', '0'), +('14', '44', '1', '14559', '4771', '0'), +('14', '44', '1', '14701', '4624', '0'), +('14', '44', '1', '10082', '3622', '0'), +('14', '44', '2', '10143', '7136', '0'), +('14', '44', '2', '1246', '6043', '0'), +('14', '44', '2', '1211', '5887', '0'), +('14', '44', '2', '10141', '4808', '0'), +('14', '44', '3', '11052', '7973', '0'), +('14', '44', '3', '1275', '6370', '0'), +('14', '44', '3', '4505', '3781', '0'), +('14', '44', '3', '2350', '2821', '0'), +('14', '44', '5', '14703', '8800', '0'), +('14', '44', '5', '14558', '6706', '0'), +('14', '44', '5', '14700', '4836', '0'), +('14', '44', '5', '68291', '4770', '0'), +('14', '44', '8', '11603', '13154', '0'), +('14', '44', '8', '2349', '3651', '0'), +('14', '44', '8', '11621', '3631', '0'), +('14', '44', '8', '1057', '2904', '0'), +('14', '44', '6', '1542', '9878', '0'), +('14', '44', '6', '1905', '5379', '0'), +('14', '44', '6', '1557', '5371', '0'), +('14', '44', '6', '1276', '3275', '0'), +('14', '44', '17', '11641', '16127', '0'), +('14', '44', '17', '1214', '11377', '0'), +('14', '44', '17', '1247', '11240', '0'), +('14', '44', '17', '1644', '11133', '0'), +('14', '44', '7', '1218', '4939', '0'), +('14', '44', '7', '1248', '4723', '0'), +('14', '44', '7', '1648', '3506', '0'), +('14', '44', '7', '1362', '3148', '0'), +('14', '44', '9', '12806', '5847', '0'), +('14', '44', '9', '1649', '3185', '0'), +('14', '44', '9', '4408', '2748', '0'), +('14', '44', '9', '14650', '2424', '0'), +('14', '44', '15', '10366', '4854', '0'), +('14', '44', '15', '10151', '4200', '0'), +('14', '44', '15', '10163', '3709', '0'), +('14', '44', '15', '14679', '3360', '0'), +('14', '44', '20', '11666', '12507', '0'), +('14', '44', '20', '2742', '5737', '0'), +('14', '44', '20', '1277', '3697', '0'), +('14', '44', '20', '1364', '2630', '0'), +('14', '44', '12', '1250', '5143', '0'), +('14', '44', '12', '20655', '4936', '0'), +('14', '44', '12', '2923', '4348', '0'), +('14', '44', '12', '2336', '3682', '0'), +('14', '44', '18', '1651', '3103', '0'), +('14', '44', '18', '4410', '1685', '0'), +('14', '44', '18', '1251', '1318', '0'), +('14', '44', '18', '1221', '1234', '0'), +('14', '44', '19', '4407', '4874', '0'), +('14', '44', '19', '68239', '4328', '0'), +('14', '44', '19', '1368', '2066', '0'), +('14', '44', '19', '1652', '2046', '0'), +('14', '44', '13', '14759', '10108', '0'), +('14', '44', '13', '27711', '7936', '0'), +('14', '44', '13', '6359', '6668', '0'), +('14', '44', '13', '13500', '6503', '0'), +('14', '44', '14', '14759', '10108', '0'), +('14', '44', '14', '10219', '8362', '0'), +('14', '44', '14', '6359', '6668', '0'), +('14', '44', '14', '9246', '6233', '0'), +('14', '44', '11', '9246', '6233', '0'), +('14', '44', '11', '14762', '3204', '0'), +('14', '44', '11', '13353', '1500', '0'), +('14', '44', '11', '20677', '1200', '0'), +('14', '45', '22', '10323', '0', '0'), +('14', '45', '22', '9246', '0', '0'), +('14', '45', '22', '21509', '0', '0'), +('14', '45', '22', '8007', '0', '0'), +('14', '45', '1', '14702', '5000', '0'), +('14', '45', '1', '14559', '4819', '0'), +('14', '45', '1', '14701', '4624', '0'), +('14', '45', '1', '10082', '3694', '0'), +('14', '45', '2', '10143', '7136', '0'), +('14', '45', '2', '1246', '6128', '0'), +('14', '45', '2', '1211', '5971', '0'), +('14', '45', '2', '10141', '4917', '0'), +('14', '45', '3', '11052', '8154', '0'), +('14', '45', '3', '1275', '6443', '0'), +('14', '45', '3', '4505', '3866', '0'), +('14', '45', '3', '2350', '2881', '0'), +('14', '45', '5', '14703', '8800', '0'), +('14', '45', '5', '14558', '6774', '0'), +('14', '45', '5', '14700', '4836', '0'), +('14', '45', '5', '68291', '4818', '0'), +('14', '45', '8', '11603', '13263', '0'), +('14', '45', '8', '2349', '3651', '0'), +('14', '45', '8', '11621', '3631', '0'), +('14', '45', '8', '1057', '2965', '0'), +('14', '45', '6', '1542', '9987', '0'), +('14', '45', '6', '1905', '5387', '0'), +('14', '45', '6', '1557', '5371', '0'), +('14', '45', '6', '1276', '3275', '0'), +('14', '45', '17', '11641', '16308', '0'), +('14', '45', '17', '1214', '11553', '0'), +('14', '45', '17', '1247', '11411', '0'), +('14', '45', '17', '1644', '11193', '0'), +('14', '45', '7', '1218', '5024', '0'), +('14', '45', '7', '1248', '4808', '0'), +('14', '45', '7', '1648', '3566', '0'), +('14', '45', '7', '1362', '3148', '0'), +('14', '45', '9', '12806', '5932', '0'), +('14', '45', '9', '1649', '3221', '0'), +('14', '45', '9', '4408', '2809', '0'), +('14', '45', '9', '14650', '2424', '0'), +('14', '45', '15', '10366', '4854', '0'), +('14', '45', '15', '10151', '4200', '0'), +('14', '45', '15', '10163', '3709', '0'), +('14', '45', '15', '14679', '3360', '0'), +('14', '45', '20', '11666', '12518', '0'), +('14', '45', '20', '2742', '5752', '0'), +('14', '45', '20', '1277', '3757', '0'), +('14', '45', '20', '1364', '2679', '0'), +('14', '45', '12', '1250', '5239', '0'), +('14', '45', '12', '20655', '4963', '0'), +('14', '45', '12', '2923', '4348', '0'), +('14', '45', '12', '2336', '3742', '0'), +('14', '45', '18', '1651', '3140', '0'), +('14', '45', '18', '4410', '1685', '0'), +('14', '45', '18', '1251', '1318', '0'), +('14', '45', '18', '1221', '1234', '0'), +('14', '45', '19', '4407', '4983', '0'), +('14', '45', '19', '68239', '4365', '0'), +('14', '45', '19', '1368', '2066', '0'), +('14', '45', '19', '1652', '2046', '0'), +('14', '45', '13', '14759', '10173', '0'), +('14', '45', '13', '27711', '8027', '0'), +('14', '45', '13', '6359', '6789', '0'), +('14', '45', '13', '13500', '6624', '0'), +('14', '45', '14', '14759', '10173', '0'), +('14', '45', '14', '10219', '8362', '0'), +('14', '45', '14', '6359', '6789', '0'), +('14', '45', '14', '9246', '6354', '0'), +('14', '45', '11', '9246', '6354', '0'), +('14', '45', '11', '14762', '3204', '0'), +('14', '45', '11', '13353', '1500', '0'), +('14', '45', '11', '20677', '1200', '0'), +('14', '46', '22', '10323', '0', '0'), +('14', '46', '22', '9246', '0', '0'), +('14', '46', '22', '21509', '0', '0'), +('14', '46', '22', '8007', '0', '0'), +('14', '46', '1', '14702', '5000', '0'), +('14', '46', '1', '14559', '4868', '0'), +('14', '46', '1', '14701', '4624', '0'), +('14', '46', '1', '10082', '3767', '0'), +('14', '46', '2', '10143', '7136', '0'), +('14', '46', '2', '1246', '6213', '0'), +('14', '46', '2', '1211', '6056', '0'), +('14', '46', '2', '10141', '5025', '0'), +('14', '46', '3', '11052', '8335', '0'), +('14', '46', '3', '1275', '6515', '0'), +('14', '46', '3', '4505', '3950', '0'), +('14', '46', '3', '2350', '2941', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '46', '5', '14703', '8800', '0'), +('14', '46', '5', '14558', '6841', '0'), +('14', '46', '5', '68291', '4866', '0'), +('14', '46', '5', '14700', '4836', '0'), +('14', '46', '8', '11603', '13372', '0'), +('14', '46', '8', '2349', '3651', '0'), +('14', '46', '8', '11621', '3631', '0'), +('14', '46', '8', '1057', '3025', '0'), +('14', '46', '6', '1542', '10096', '0'), +('14', '46', '6', '1905', '5394', '0'), +('14', '46', '6', '1557', '5371', '0'), +('14', '46', '6', '1276', '3275', '0'), +('14', '46', '17', '11641', '16489', '0'), +('14', '46', '17', '1214', '11729', '0'), +('14', '46', '17', '1247', '11583', '0'), +('14', '46', '17', '1644', '11254', '0'), +('14', '46', '7', '1218', '5108', '0'), +('14', '46', '7', '1248', '4892', '0'), +('14', '46', '7', '1648', '3627', '0'), +('14', '46', '7', '2458', '3195', '0'), +('14', '46', '9', '12806', '6017', '0'), +('14', '46', '9', '1649', '3258', '0'), +('14', '46', '9', '4408', '2869', '0'), +('14', '46', '9', '14650', '2424', '0'), +('14', '46', '15', '10366', '4854', '0'), +('14', '46', '15', '10151', '4200', '0'), +('14', '46', '15', '10163', '3709', '0'), +('14', '46', '15', '14679', '3360', '0'), +('14', '46', '20', '11666', '12528', '0'), +('14', '46', '20', '2742', '5766', '0'), +('14', '46', '20', '1277', '3817', '0'), +('14', '46', '20', '1364', '2727', '0'), +('14', '46', '12', '1250', '5336', '0'), +('14', '46', '12', '20655', '4990', '0'), +('14', '46', '12', '2923', '4348', '0'), +('14', '46', '12', '2336', '3803', '0'), +('14', '46', '18', '1651', '3176', '0'), +('14', '46', '18', '4410', '1685', '0'), +('14', '46', '18', '1251', '1318', '0'), +('14', '46', '18', '1221', '1234', '0'), +('14', '46', '19', '4407', '5092', '0'), +('14', '46', '19', '68239', '4401', '0'), +('14', '46', '19', '1368', '2066', '0'), +('14', '46', '19', '1652', '2046', '0'), +('14', '46', '13', '14759', '10239', '0'), +('14', '46', '13', '27711', '8117', '0'), +('14', '46', '13', '6359', '6910', '0'), +('14', '46', '13', '13500', '6745', '0'), +('14', '46', '14', '14759', '10239', '0'), +('14', '46', '14', '10219', '8362', '0'), +('14', '46', '14', '6359', '6910', '0'), +('14', '46', '14', '9246', '6475', '0'), +('14', '46', '11', '9246', '6475', '0'), +('14', '46', '11', '14762', '3204', '0'), +('14', '46', '11', '13353', '1500', '0'), +('14', '46', '11', '20677', '1200', '0'), +('14', '47', '22', '10323', '0', '0'), +('14', '47', '22', '9246', '0', '0'), +('14', '47', '22', '21509', '0', '0'), +('14', '47', '22', '8007', '0', '0'), +('14', '47', '1', '14702', '5000', '0'), +('14', '47', '1', '14559', '4916', '0'), +('14', '47', '1', '14701', '4624', '0'), +('14', '47', '1', '10082', '3839', '0'), +('14', '47', '2', '10143', '7136', '0'), +('14', '47', '2', '1246', '6297', '0'), +('14', '47', '2', '1211', '6140', '0'), +('14', '47', '2', '10141', '5134', '0'), +('14', '47', '3', '11052', '8516', '0'), +('14', '47', '3', '1275', '6588', '0'), +('14', '47', '3', '4505', '4035', '0'), +('14', '47', '3', '2350', '3002', '0'), +('14', '47', '5', '14703', '8800', '0'), +('14', '47', '5', '14558', '6909', '0'), +('14', '47', '5', '68291', '4915', '0'), +('14', '47', '5', '14700', '4836', '0'), +('14', '47', '8', '11603', '13481', '0'), +('14', '47', '8', '2349', '3651', '0'), +('14', '47', '8', '11621', '3631', '0'), +('14', '47', '8', '1057', '3085', '0'), +('14', '47', '6', '1542', '10205', '0'), +('14', '47', '6', '1905', '5401', '0'), +('14', '47', '6', '1557', '5371', '0'), +('14', '47', '6', '1276', '3275', '0'), +('14', '47', '17', '11641', '16670', '0'), +('14', '47', '17', '1214', '11905', '0'), +('14', '47', '17', '1247', '11754', '0'), +('14', '47', '17', '1644', '11314', '0'), +('14', '47', '7', '1218', '5193', '0'), +('14', '47', '7', '1248', '4977', '0'), +('14', '47', '7', '1648', '3687', '0'), +('14', '47', '7', '2458', '3244', '0'), +('14', '47', '9', '12806', '6101', '0'), +('14', '47', '9', '1649', '3294', '0'), +('14', '47', '9', '4408', '2929', '0'), +('14', '47', '9', '10360', '2435', '0'), +('14', '47', '15', '10366', '4854', '0'), +('14', '47', '15', '10151', '4200', '0'), +('14', '47', '15', '10163', '3709', '0'), +('14', '47', '15', '14679', '3360', '0'), +('14', '47', '20', '11666', '12538', '0'), +('14', '47', '20', '2742', '5781', '0'), +('14', '47', '20', '1277', '3878', '0'), +('14', '47', '20', '1364', '2775', '0'), +('14', '47', '12', '1250', '5433', '0'), +('14', '47', '12', '20655', '5017', '0'), +('14', '47', '12', '2923', '4348', '0'), +('14', '47', '12', '2336', '3863', '0'), +('14', '47', '18', '1651', '3212', '0'), +('14', '47', '18', '4410', '1685', '0'), +('14', '47', '18', '1251', '1318', '0'), +('14', '47', '18', '1221', '1234', '0'), +('14', '47', '19', '4407', '5200', '0'), +('14', '47', '19', '68239', '4437', '0'), +('14', '47', '19', '1368', '2066', '0'), +('14', '47', '19', '1652', '2046', '0'), +('14', '47', '13', '14759', '10304', '0'), +('14', '47', '13', '27711', '8208', '0'), +('14', '47', '13', '6359', '7031', '0'), +('14', '47', '13', '13500', '6866', '0'), +('14', '47', '14', '14759', '10304', '0'), +('14', '47', '14', '10219', '8362', '0'), +('14', '47', '14', '6359', '7031', '0'), +('14', '47', '14', '9246', '6596', '0'), +('14', '47', '11', '9246', '6596', '0'), +('14', '47', '11', '14762', '3204', '0'), +('14', '47', '11', '13353', '1500', '0'), +('14', '47', '11', '20677', '1200', '0'), +('14', '48', '22', '10323', '0', '0'), +('14', '48', '22', '9246', '0', '0'), +('14', '48', '22', '21509', '0', '0'), +('14', '48', '22', '8007', '0', '0'), +('14', '48', '1', '14702', '5000', '0'), +('14', '48', '1', '14559', '4964', '0'), +('14', '48', '1', '14701', '4624', '0'), +('14', '48', '1', '10082', '3912', '0'), +('14', '48', '2', '10143', '7136', '0'), +('14', '48', '2', '1246', '6382', '0'), +('14', '48', '2', '1211', '6225', '0'), +('14', '48', '2', '10141', '5243', '0'), +('14', '48', '3', '11052', '8698', '0'), +('14', '48', '3', '1275', '6660', '0'), +('14', '48', '3', '4505', '4119', '0'), +('14', '48', '3', '2350', '3062', '0'), +('14', '48', '5', '14703', '8800', '0'), +('14', '48', '5', '14558', '6977', '0'), +('14', '48', '5', '68291', '4963', '0'), +('14', '48', '5', '14700', '4836', '0'), +('14', '48', '8', '11603', '13589', '0'), +('14', '48', '8', '2349', '3651', '0'), +('14', '48', '8', '11621', '3631', '0'), +('14', '48', '8', '1057', '3146', '0'), +('14', '48', '6', '1542', '10313', '0'), +('14', '48', '6', '1905', '5408', '0'), +('14', '48', '6', '1557', '5371', '0'), +('14', '48', '6', '1276', '3275', '0'), +('14', '48', '17', '11641', '16852', '0'), +('14', '48', '17', '1214', '12081', '0'), +('14', '48', '17', '1247', '11926', '0'), +('14', '48', '17', '1644', '11374', '0'), +('14', '48', '7', '1218', '5277', '0'), +('14', '48', '7', '1248', '5062', '0'), +('14', '48', '7', '1648', '3748', '0'), +('14', '48', '7', '2458', '3292', '0'), +('14', '48', '9', '12806', '6186', '0'), +('14', '48', '9', '1649', '3330', '0'), +('14', '48', '9', '4408', '2990', '0'), +('14', '48', '9', '10360', '2472', '0'), +('14', '48', '15', '10366', '4854', '0'), +('14', '48', '15', '10151', '4200', '0'), +('14', '48', '15', '10163', '3709', '0'), +('14', '48', '15', '14679', '3360', '0'), +('14', '48', '20', '11666', '12548', '0'), +('14', '48', '20', '2742', '5795', '0'), +('14', '48', '20', '1277', '3938', '0'), +('14', '48', '20', '1364', '2824', '0'), +('14', '48', '12', '1250', '5529', '0'), +('14', '48', '12', '20655', '5044', '0'), +('14', '48', '12', '2923', '4348', '0'), +('14', '48', '12', '2336', '3923', '0'), +('14', '48', '18', '1651', '3248', '0'), +('14', '48', '18', '4410', '1685', '0'), +('14', '48', '18', '1251', '1318', '0'), +('14', '48', '18', '1221', '1234', '0'), +('14', '48', '19', '4407', '5309', '0'), +('14', '48', '19', '68239', '4473', '0'), +('14', '48', '19', '1368', '2066', '0'), +('14', '48', '19', '1652', '2046', '0'), +('14', '48', '13', '14759', '10369', '0'), +('14', '48', '13', '27711', '8298', '0'), +('14', '48', '13', '6359', '7151', '0'), +('14', '48', '13', '13500', '6986', '0'), +('14', '48', '14', '14759', '10369', '0'), +('14', '48', '14', '10219', '8362', '0'), +('14', '48', '14', '6359', '7151', '0'), +('14', '48', '14', '9246', '6716', '0'), +('14', '48', '11', '9246', '6716', '0'), +('14', '48', '11', '14762', '3204', '0'), +('14', '48', '11', '13353', '1500', '0'), +('14', '48', '11', '20677', '1200', '0'), +('14', '49', '22', '10323', '0', '0'), +('14', '49', '22', '9246', '0', '0'), +('14', '49', '22', '21509', '0', '0'), +('14', '49', '22', '8007', '0', '0'), +('14', '49', '1', '14559', '5013', '0'), +('14', '49', '1', '14702', '5000', '0'), +('14', '49', '1', '14701', '4624', '0'), +('14', '49', '1', '10082', '3984', '0'), +('14', '49', '2', '10143', '7136', '0'), +('14', '49', '2', '1246', '6466', '0'), +('14', '49', '2', '1211', '6309', '0'), +('14', '49', '2', '10141', '5351', '0'), +('14', '49', '3', '11052', '8879', '0'), +('14', '49', '3', '1275', '6733', '0'), +('14', '49', '3', '4505', '4204', '0'), +('14', '49', '3', '2350', '3123', '0'), +('14', '49', '5', '14703', '8800', '0'), +('14', '49', '5', '14558', '7044', '0'), +('14', '49', '5', '68291', '5011', '0'), +('14', '49', '5', '14700', '4836', '0'), +('14', '49', '8', '11603', '13698', '0'), +('14', '49', '8', '2349', '3651', '0'), +('14', '49', '8', '11621', '3631', '0'), +('14', '49', '8', '1057', '3206', '0'), +('14', '49', '6', '1542', '10422', '0'), +('14', '49', '6', '1905', '5416', '0'), +('14', '49', '6', '1557', '5371', '0'), +('14', '49', '6', '1276', '3275', '0'), +('14', '49', '17', '11641', '17033', '0'), +('14', '49', '17', '1214', '12257', '0'), +('14', '49', '17', '1247', '12097', '0'), +('14', '49', '17', '1644', '11435', '0'), +('14', '49', '7', '1218', '5362', '0'), +('14', '49', '7', '1248', '5146', '0'), +('14', '49', '7', '1648', '3808', '0'), +('14', '49', '7', '2458', '3340', '0'), +('14', '49', '9', '12806', '6270', '0'), +('14', '49', '9', '1649', '3366', '0'), +('14', '49', '9', '4408', '3050', '0'), +('14', '49', '9', '10360', '2508', '0'), +('14', '49', '15', '10366', '4854', '0'), +('14', '49', '15', '10151', '4200', '0'), +('14', '49', '15', '10163', '3709', '0'), +('14', '49', '15', '14679', '3360', '0'), +('14', '49', '20', '11666', '12558', '0'), +('14', '49', '20', '2742', '5810', '0'), +('14', '49', '20', '1277', '3999', '0'), +('14', '49', '20', '1364', '2872', '0'), +('14', '49', '12', '1250', '5626', '0'), +('14', '49', '12', '20655', '5071', '0'), +('14', '49', '12', '2923', '4348', '0'), +('14', '49', '12', '2336', '3984', '0'), +('14', '49', '18', '1651', '3284', '0'), +('14', '49', '18', '4410', '1685', '0'), +('14', '49', '18', '1251', '1318', '0'), +('14', '49', '18', '1221', '1234', '0'), +('14', '49', '19', '4407', '5418', '0'), +('14', '49', '19', '68239', '4510', '0'), +('14', '49', '19', '1368', '2066', '0'), +('14', '49', '19', '1652', '2046', '0'), +('14', '49', '13', '14759', '10434', '0'), +('14', '49', '13', '27711', '8389', '0'), +('14', '49', '13', '6359', '7272', '0'), +('14', '49', '13', '13500', '7107', '0'), +('14', '49', '14', '14759', '10434', '0'), +('14', '49', '14', '10219', '8362', '0'), +('14', '49', '14', '6359', '7272', '0'), +('14', '49', '14', '9246', '6837', '0'), +('14', '49', '11', '9246', '6837', '0'), +('14', '49', '11', '14762', '3204', '0'), +('14', '49', '11', '13353', '1500', '0'), +('14', '49', '11', '20677', '1200', '0'), +('14', '50', '22', '10323', '0', '0'), +('14', '50', '22', '9246', '0', '0'), +('14', '50', '22', '21509', '0', '0'), +('14', '50', '22', '8007', '0', '0'), +('14', '50', '1', '14559', '5061', '0'), +('14', '50', '1', '14702', '5000', '0'), +('14', '50', '1', '14701', '4624', '0'), +('14', '50', '1', '10082', '4056', '0'), +('14', '50', '2', '10143', '7136', '0'), +('14', '50', '2', '1246', '6551', '0'), +('14', '50', '2', '1211', '6394', '0'), +('14', '50', '2', '10141', '5460', '0'), +('14', '50', '3', '11052', '9060', '0'), +('14', '50', '3', '1275', '6805', '0'), +('14', '50', '3', '4505', '4288', '0'), +('14', '50', '3', '2350', '3183', '0'), +('14', '50', '5', '14703', '8800', '0'), +('14', '50', '5', '14558', '7112', '0'), +('14', '50', '5', '68291', '5060', '0'), +('14', '50', '5', '14700', '4836', '0'), +('14', '50', '8', '11603', '13807', '0'), +('14', '50', '8', '2349', '3651', '0'), +('14', '50', '8', '11621', '3631', '0'), +('14', '50', '8', '1057', '3267', '0'), +('14', '50', '6', '1542', '10531', '0'), +('14', '50', '6', '1905', '5423', '0'), +('14', '50', '6', '1557', '5371', '0'), +('14', '50', '6', '1276', '3275', '0'), +('14', '50', '17', '11641', '17214', '0'), +('14', '50', '17', '1214', '12433', '0'), +('14', '50', '17', '1247', '12269', '0'), +('14', '50', '17', '1644', '11495', '0'), +('14', '50', '7', '1218', '5446', '0'), +('14', '50', '7', '1248', '5231', '0'), +('14', '50', '7', '1648', '3868', '0'), +('14', '50', '7', '2458', '3388', '0'), +('14', '50', '9', '12806', '6355', '0'), +('14', '50', '9', '1649', '3403', '0'), +('14', '50', '9', '4408', '3111', '0'), +('14', '50', '9', '10360', '2544', '0'), +('14', '50', '15', '10366', '4854', '0'), +('14', '50', '15', '10151', '4200', '0'), +('14', '50', '15', '10163', '3709', '0'), +('14', '50', '15', '14679', '3360', '0'), +('14', '50', '20', '11666', '12568', '0'), +('14', '50', '20', '2742', '5824', '0'), +('14', '50', '20', '1277', '4059', '0'), +('14', '50', '20', '1364', '2920', '0'), +('14', '50', '12', '1250', '5723', '0'), +('14', '50', '12', '20655', '5098', '0'), +('14', '50', '12', '2923', '4348', '0'), +('14', '50', '12', '2336', '4044', '0'), +('14', '50', '18', '1651', '3321', '0'), +('14', '50', '18', '4410', '1685', '0'), +('14', '50', '18', '1251', '1318', '0'), +('14', '50', '18', '1221', '1234', '0'), +('14', '50', '19', '4407', '5526', '0'), +('14', '50', '19', '68239', '4546', '0'), +('14', '50', '19', '1368', '2066', '0'), +('14', '50', '19', '1652', '2046', '0'), +('14', '50', '13', '14759', '10500', '0'), +('14', '50', '13', '27711', '8480', '0'), +('14', '50', '13', '6359', '7393', '0'), +('14', '50', '13', '13500', '7228', '0'), +('14', '50', '14', '14759', '10500', '0'), +('14', '50', '14', '10219', '8362', '0'), +('14', '50', '14', '6359', '7393', '0'), +('14', '50', '14', '9246', '6958', '0'), +('14', '50', '11', '9246', '6958', '0'), +('14', '50', '11', '14762', '3204', '0'), +('14', '50', '11', '13353', '1500', '0'), +('14', '50', '11', '20677', '1200', '0'), +('14', '51', '22', '10323', '0', '0'), +('14', '51', '22', '9246', '0', '0'), +('14', '51', '22', '21509', '0', '0'), +('14', '51', '22', '8007', '0', '0'), +('14', '51', '1', '14559', '5109', '0'), +('14', '51', '1', '14702', '5000', '0'), +('14', '51', '1', '14701', '4624', '0'), +('14', '51', '1', '10082', '4129', '0'), +('14', '51', '2', '10143', '7136', '0'), +('14', '51', '2', '1246', '6635', '0'), +('14', '51', '2', '1211', '6479', '0'), +('14', '51', '2', '10141', '5569', '0'), +('14', '51', '3', '11052', '9241', '0'), +('14', '51', '3', '1275', '6878', '0'), +('14', '51', '3', '4505', '4373', '0'), +('14', '51', '3', '2350', '3243', '0'), +('14', '51', '5', '14703', '8800', '0'), +('14', '51', '5', '14558', '7180', '0'), +('14', '51', '5', '68291', '5108', '0'), +('14', '51', '5', '14700', '4836', '0'), +('14', '51', '8', '11603', '13916', '0'), +('14', '51', '8', '2349', '3651', '0'), +('14', '51', '8', '11621', '3631', '0'), +('14', '51', '8', '1057', '3327', '0'), +('14', '51', '6', '1542', '10639', '0'), +('14', '51', '6', '1905', '5430', '0'), +('14', '51', '6', '1557', '5371', '0'), +('14', '51', '6', '1276', '3275', '0'), +('14', '51', '17', '11641', '17395', '0'), +('14', '51', '17', '1214', '12608', '0'), +('14', '51', '17', '1247', '12440', '0'), +('14', '51', '17', '1644', '11556', '0'), +('14', '51', '7', '1218', '5531', '0'), +('14', '51', '7', '1248', '5315', '0'), +('14', '51', '7', '1648', '3929', '0'), +('14', '51', '7', '2458', '3437', '0'), +('14', '51', '9', '12806', '6439', '0'), +('14', '51', '9', '1649', '3439', '0'), +('14', '51', '9', '4408', '3171', '0'), +('14', '51', '9', '10360', '2580', '0'), +('14', '51', '15', '10366', '4854', '0'), +('14', '51', '15', '10151', '4200', '0'), +('14', '51', '15', '10163', '3709', '0'), +('14', '51', '15', '14679', '3360', '0'), +('14', '51', '20', '11666', '12579', '0'), +('14', '51', '20', '2742', '5839', '0'), +('14', '51', '20', '1277', '4119', '0'), +('14', '51', '20', '1364', '2968', '0'), +('14', '51', '12', '1250', '5819', '0'), +('14', '51', '12', '20655', '5125', '0'), +('14', '51', '12', '2923', '4348', '0'), +('14', '51', '12', '2336', '4105', '0'), +('14', '51', '18', '1651', '3357', '0'), +('14', '51', '18', '4410', '1685', '0'), +('14', '51', '18', '1251', '1318', '0'), +('14', '51', '18', '1221', '1234', '0'), +('14', '51', '19', '4407', '5635', '0'), +('14', '51', '19', '68239', '4582', '0'), +('14', '51', '19', '1368', '2066', '0'), +('14', '51', '19', '1652', '2046', '0'), +('14', '51', '13', '14759', '10565', '0'), +('14', '51', '13', '27711', '8570', '0'), +('14', '51', '13', '6359', '7514', '0'), +('14', '51', '13', '13500', '7349', '0'), +('14', '51', '14', '14759', '10565', '0'), +('14', '51', '14', '10219', '8362', '0'), +('14', '51', '14', '6359', '7514', '0'), +('14', '51', '14', '9246', '7079', '0'), +('14', '51', '11', '9246', '7079', '0'), +('14', '51', '11', '14762', '3204', '0'), +('14', '51', '11', '13353', '1500', '0'), +('14', '51', '11', '20677', '1200', '0'), +('14', '52', '22', '10323', '0', '0'), +('14', '52', '22', '9246', '0', '0'), +('14', '52', '22', '21509', '0', '0'), +('14', '52', '22', '8007', '0', '0'), +('14', '52', '1', '14559', '5158', '0'), +('14', '52', '1', '14702', '5000', '0'), +('14', '52', '1', '14701', '4624', '0'), +('14', '52', '1', '10082', '4201', '0'), +('14', '52', '2', '10143', '7136', '0'), +('14', '52', '2', '1246', '6720', '0'), +('14', '52', '2', '1211', '6563', '0'), +('14', '52', '2', '10141', '5678', '0'), +('14', '52', '3', '11052', '9422', '0'), +('14', '52', '3', '1275', '6950', '0'), +('14', '52', '3', '4505', '4458', '0'), +('14', '52', '3', '2350', '3304', '0'), +('14', '52', '5', '14703', '8800', '0'), +('14', '52', '5', '14558', '7247', '0'), +('14', '52', '5', '68291', '5156', '0'), +('14', '52', '5', '14700', '4836', '0'), +('14', '52', '8', '11603', '14024', '0'), +('14', '52', '8', '2349', '3651', '0'), +('14', '52', '8', '11621', '3631', '0'), +('14', '52', '8', '1057', '3387', '0'), +('14', '52', '6', '1542', '10748', '0'), +('14', '52', '6', '1905', '5437', '0'), +('14', '52', '6', '1557', '5371', '0'), +('14', '52', '6', '1645', '3281', '0'), +('14', '52', '17', '11641', '17576', '0'), +('14', '52', '17', '1214', '12784', '0'), +('14', '52', '17', '1247', '12612', '0'), +('14', '52', '17', '1644', '11616', '0'), +('14', '52', '7', '1218', '5615', '0'), +('14', '52', '7', '1248', '5400', '0'), +('14', '52', '7', '1648', '3989', '0'), +('14', '52', '7', '2458', '3485', '0'), +('14', '52', '9', '12806', '6524', '0'), +('14', '52', '9', '1649', '3475', '0'), +('14', '52', '9', '4408', '3231', '0'), +('14', '52', '9', '10360', '2617', '0'), +('14', '52', '15', '10366', '4854', '0'), +('14', '52', '15', '10151', '4200', '0'), +('14', '52', '15', '10163', '3709', '0'), +('14', '52', '15', '14679', '3360', '0'), +('14', '52', '20', '11666', '12589', '0'), +('14', '52', '20', '2742', '5853', '0'), +('14', '52', '20', '1277', '4180', '0'), +('14', '52', '20', '1364', '3017', '0'), +('14', '52', '12', '1250', '5916', '0'), +('14', '52', '12', '20655', '5152', '0'), +('14', '52', '12', '2923', '4348', '0'), +('14', '52', '12', '2336', '4165', '0'), +('14', '52', '18', '1651', '3393', '0'), +('14', '52', '18', '4410', '1685', '0'), +('14', '52', '18', '1251', '1318', '0'), +('14', '52', '18', '1221', '1234', '0'), +('14', '52', '19', '4407', '5744', '0'), +('14', '52', '19', '68239', '4618', '0'), +('14', '52', '19', '1368', '2066', '0'), +('14', '52', '19', '1652', '2046', '0'), +('14', '52', '13', '14759', '10630', '0'), +('14', '52', '13', '27711', '8661', '0'), +('14', '52', '13', '6359', '7635', '0'), +('14', '52', '13', '13500', '7470', '0'), +('14', '52', '14', '14759', '10630', '0'), +('14', '52', '14', '10219', '8362', '0'), +('14', '52', '14', '6359', '7635', '0'), +('14', '52', '14', '9246', '7200', '0'), +('14', '52', '11', '9246', '7200', '0'), +('14', '52', '11', '14762', '3204', '0'), +('14', '52', '11', '13353', '1500', '0'), +('14', '52', '11', '20677', '1200', '0'), +('14', '53', '22', '10323', '0', '0'), +('14', '53', '22', '9246', '0', '0'), +('14', '53', '22', '21509', '0', '0'), +('14', '53', '22', '8007', '0', '0'), +('14', '53', '1', '14559', '5206', '0'), +('14', '53', '1', '14702', '5000', '0'), +('14', '53', '1', '14701', '4624', '0'), +('14', '53', '1', '10082', '4274', '0'), +('14', '53', '2', '10143', '7136', '0'), +('14', '53', '2', '1246', '6804', '0'), +('14', '53', '2', '1211', '6648', '0'), +('14', '53', '2', '10141', '5786', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '53', '3', '11052', '9604', '0'), +('14', '53', '3', '1275', '7023', '0'), +('14', '53', '3', '4505', '4542', '0'), +('14', '53', '3', '2350', '3364', '0'), +('14', '53', '5', '14703', '8800', '0'), +('14', '53', '5', '14558', '7315', '0'), +('14', '53', '5', '68291', '5205', '0'), +('14', '53', '5', '14700', '4836', '0'), +('14', '53', '8', '11603', '14133', '0'), +('14', '53', '8', '2349', '3651', '0'), +('14', '53', '8', '11621', '3631', '0'), +('14', '53', '8', '1057', '3448', '0'), +('14', '53', '6', '1542', '10857', '0'), +('14', '53', '6', '1905', '5445', '0'), +('14', '53', '6', '1557', '5371', '0'), +('14', '53', '6', '1645', '3317', '0'), +('14', '53', '17', '11641', '17758', '0'), +('14', '53', '17', '1214', '12960', '0'), +('14', '53', '17', '1247', '12783', '0'), +('14', '53', '17', '1644', '11676', '0'), +('14', '53', '7', '1218', '5700', '0'), +('14', '53', '7', '1248', '5484', '0'), +('14', '53', '7', '1648', '4050', '0'), +('14', '53', '7', '2458', '3533', '0'), +('14', '53', '9', '12806', '6609', '0'), +('14', '53', '9', '1649', '3511', '0'), +('14', '53', '9', '4408', '3292', '0'), +('14', '53', '9', '10360', '2653', '0'), +('14', '53', '15', '10366', '4854', '0'), +('14', '53', '15', '10151', '4200', '0'), +('14', '53', '15', '10163', '3709', '0'), +('14', '53', '15', '14679', '3360', '0'), +('14', '53', '20', '11666', '12599', '0'), +('14', '53', '20', '2742', '5868', '0'), +('14', '53', '20', '1277', '4240', '0'), +('14', '53', '20', '1364', '3065', '0'), +('14', '53', '12', '1250', '6013', '0'), +('14', '53', '12', '20655', '5179', '0'), +('14', '53', '12', '2923', '4348', '0'), +('14', '53', '12', '2336', '4225', '0'), +('14', '53', '18', '1651', '3429', '0'), +('14', '53', '18', '4410', '1685', '0'), +('14', '53', '18', '1251', '1318', '0'), +('14', '53', '18', '1221', '1234', '0'), +('14', '53', '19', '4407', '5853', '0'), +('14', '53', '19', '68239', '4655', '0'), +('14', '53', '19', '1368', '2066', '0'), +('14', '53', '19', '1652', '2046', '0'), +('14', '53', '13', '14759', '10695', '0'), +('14', '53', '13', '27711', '8751', '0'), +('14', '53', '13', '6359', '7755', '0'), +('14', '53', '13', '13500', '7590', '0'), +('14', '53', '14', '14759', '10695', '0'), +('14', '53', '14', '10219', '8362', '0'), +('14', '53', '14', '6359', '7755', '0'), +('14', '53', '14', '9246', '7320', '0'), +('14', '53', '11', '9246', '7320', '0'), +('14', '53', '11', '14762', '3204', '0'), +('14', '53', '11', '13353', '1500', '0'), +('14', '53', '11', '20677', '1200', '0'), +('14', '54', '22', '10323', '0', '0'), +('14', '54', '22', '9246', '0', '0'), +('14', '54', '22', '21509', '0', '0'), +('14', '54', '22', '8007', '0', '0'), +('14', '54', '1', '14559', '5254', '0'), +('14', '54', '1', '14702', '5000', '0'), +('14', '54', '1', '14701', '4624', '0'), +('14', '54', '1', '10082', '4346', '0'), +('14', '54', '2', '10143', '7136', '0'), +('14', '54', '2', '1246', '6889', '0'), +('14', '54', '2', '1211', '6732', '0'), +('14', '54', '2', '10141', '5895', '0'), +('14', '54', '3', '11052', '9785', '0'), +('14', '54', '3', '1275', '7095', '0'), +('14', '54', '3', '4505', '4627', '0'), +('14', '54', '3', '2350', '3425', '0'), +('14', '54', '5', '14703', '8800', '0'), +('14', '54', '5', '14558', '7383', '0'), +('14', '54', '5', '68291', '5253', '0'), +('14', '54', '5', '14700', '4836', '0'), +('14', '54', '8', '11603', '14242', '0'), +('14', '54', '8', '2349', '3651', '0'), +('14', '54', '8', '11621', '3631', '0'), +('14', '54', '8', '1057', '3508', '0'), +('14', '54', '6', '1542', '10966', '0'), +('14', '54', '6', '1905', '5452', '0'), +('14', '54', '6', '1557', '5371', '0'), +('14', '54', '6', '1645', '3354', '0'), +('14', '54', '17', '11641', '17939', '0'), +('14', '54', '17', '1214', '13136', '0'), +('14', '54', '17', '1247', '12955', '0'), +('14', '54', '17', '1644', '11737', '0'), +('14', '54', '7', '1218', '5785', '0'), +('14', '54', '7', '1248', '5569', '0'), +('14', '54', '7', '1648', '4110', '0'), +('14', '54', '7', '2458', '3582', '0'), +('14', '54', '9', '12806', '6693', '0'), +('14', '54', '9', '1649', '3548', '0'), +('14', '54', '9', '4408', '3352', '0'), +('14', '54', '9', '10360', '2689', '0'), +('14', '54', '15', '10366', '4854', '0'), +('14', '54', '15', '10151', '4200', '0'), +('14', '54', '15', '10163', '3709', '0'), +('14', '54', '15', '14679', '3360', '0'), +('14', '54', '20', '11666', '12609', '0'), +('14', '54', '20', '2742', '5882', '0'), +('14', '54', '20', '1277', '4301', '0'), +('14', '54', '20', '1364', '3113', '0'), +('14', '54', '12', '1250', '6109', '0'), +('14', '54', '12', '20655', '5206', '0'), +('14', '54', '12', '2923', '4348', '0'), +('14', '54', '12', '2336', '4286', '0'), +('14', '54', '18', '1651', '3466', '0'), +('14', '54', '18', '4410', '1685', '0'), +('14', '54', '18', '1251', '1318', '0'), +('14', '54', '18', '1221', '1234', '0'), +('14', '54', '19', '4407', '5961', '0'), +('14', '54', '19', '68239', '4691', '0'), +('14', '54', '19', '1368', '2066', '0'), +('14', '54', '19', '1652', '2046', '0'), +('14', '54', '13', '14759', '10760', '0'), +('14', '54', '13', '27711', '8842', '0'), +('14', '54', '13', '6359', '7876', '0'), +('14', '54', '13', '13500', '7711', '0'), +('14', '54', '14', '14759', '10760', '0'), +('14', '54', '14', '10219', '8362', '0'), +('14', '54', '14', '6359', '7876', '0'), +('14', '54', '14', '9246', '7441', '0'), +('14', '54', '11', '9246', '7441', '0'), +('14', '54', '11', '14762', '3204', '0'), +('14', '54', '11', '13353', '1500', '0'), +('14', '54', '11', '20677', '1200', '0'), +('14', '55', '22', '10323', '0', '0'), +('14', '55', '22', '9246', '0', '0'), +('14', '55', '22', '21509', '0', '0'), +('14', '55', '22', '8007', '0', '0'), +('14', '55', '1', '14559', '5303', '0'), +('14', '55', '1', '14702', '5000', '0'), +('14', '55', '1', '14701', '4624', '0'), +('14', '55', '1', '10082', '4419', '0'), +('14', '55', '2', '10143', '7136', '0'), +('14', '55', '2', '1246', '6974', '0'), +('14', '55', '2', '1211', '6817', '0'), +('14', '55', '2', '10141', '6004', '0'), +('14', '55', '3', '11052', '9966', '0'), +('14', '55', '3', '1275', '7168', '0'), +('14', '55', '3', '4505', '4711', '0'), +('14', '55', '3', '2350', '3485', '0'), +('14', '55', '5', '14703', '8800', '0'), +('14', '55', '5', '14558', '7450', '0'), +('14', '55', '5', '68291', '5301', '0'), +('14', '55', '5', '10216', '4846', '0'), +('14', '55', '8', '11603', '14350', '0'), +('14', '55', '8', '2349', '3651', '0'), +('14', '55', '8', '11621', '3631', '0'), +('14', '55', '8', '1057', '3569', '0'), +('14', '55', '6', '1542', '11074', '0'), +('14', '55', '6', '1905', '5459', '0'), +('14', '55', '6', '1557', '5371', '0'), +('14', '55', '6', '1645', '3390', '0'), +('14', '55', '17', '11641', '18120', '0'), +('14', '55', '17', '1214', '13312', '0'), +('14', '55', '17', '1247', '13127', '0'), +('14', '55', '17', '1644', '11797', '0'), +('14', '55', '7', '1218', '5869', '0'), +('14', '55', '7', '1248', '5653', '0'), +('14', '55', '7', '1648', '4170', '0'), +('14', '55', '7', '2458', '3630', '0'), +('14', '55', '9', '12806', '6778', '0'), +('14', '55', '9', '1649', '3584', '0'), +('14', '55', '9', '4408', '3413', '0'), +('14', '55', '9', '10360', '2725', '0'), +('14', '55', '15', '10366', '4854', '0'), +('14', '55', '15', '10151', '4200', '0'), +('14', '55', '15', '10163', '3709', '0'), +('14', '55', '15', '14679', '3360', '0'), +('14', '55', '20', '11666', '12619', '0'), +('14', '55', '20', '2742', '5897', '0'), +('14', '55', '20', '1277', '4361', '0'), +('14', '55', '20', '1364', '3162', '0'), +('14', '55', '12', '1250', '6206', '0'), +('14', '55', '12', '20655', '5233', '0'), +('14', '55', '12', '2923', '4348', '0'), +('14', '55', '12', '2336', '4346', '0'), +('14', '55', '18', '1651', '3502', '0'), +('14', '55', '18', '4410', '1685', '0'), +('14', '55', '18', '1251', '1318', '0'), +('14', '55', '18', '1221', '1234', '0'), +('14', '55', '19', '4407', '6070', '0'), +('14', '55', '19', '68239', '4727', '0'), +('14', '55', '19', '1368', '2066', '0'), +('14', '55', '19', '1652', '2046', '0'), +('14', '55', '13', '14759', '10826', '0'), +('14', '55', '13', '27711', '8933', '0'), +('14', '55', '13', '6359', '7997', '0'), +('14', '55', '13', '13500', '7832', '0'), +('14', '55', '14', '14759', '10826', '0'), +('14', '55', '14', '10219', '8362', '0'), +('14', '55', '14', '6359', '7997', '0'), +('14', '55', '14', '9246', '7562', '0'), +('14', '55', '11', '9246', '7562', '0'), +('14', '55', '11', '14762', '3204', '0'), +('14', '55', '11', '13353', '1500', '0'), +('14', '55', '11', '20677', '1200', '0'), +('14', '56', '22', '10323', '0', '0'), +('14', '56', '22', '9246', '0', '0'), +('14', '56', '22', '21509', '0', '0'), +('14', '56', '22', '8007', '0', '0'), +('14', '56', '1', '14559', '5351', '0'), +('14', '56', '1', '14702', '5000', '0'), +('14', '56', '1', '14701', '4624', '0'), +('14', '56', '1', '10082', '4491', '0'), +('14', '56', '2', '10143', '7136', '0'), +('14', '56', '2', '1246', '7058', '0'), +('14', '56', '2', '1211', '6901', '0'), +('14', '56', '2', '10141', '6112', '0'), +('14', '56', '3', '11052', '10147', '0'), +('14', '56', '3', '1275', '7240', '0'), +('14', '56', '3', '4505', '4796', '0'), +('14', '56', '3', '2350', '3545', '0'), +('14', '56', '5', '14703', '8800', '0'), +('14', '56', '5', '14558', '7518', '0'), +('14', '56', '5', '68291', '5350', '0'), +('14', '56', '5', '10216', '4907', '0'), +('14', '56', '8', '11603', '14459', '0'), +('14', '56', '8', '2349', '3651', '0'), +('14', '56', '8', '11621', '3631', '0'), +('14', '56', '8', '1057', '3629', '0'), +('14', '56', '6', '1542', '11183', '0'), +('14', '56', '6', '1905', '5466', '0'), +('14', '56', '6', '1557', '5371', '0'), +('14', '56', '6', '1645', '3426', '0'), +('14', '56', '17', '11641', '18301', '0'), +('14', '56', '17', '1214', '13488', '0'), +('14', '56', '17', '1247', '13298', '0'), +('14', '56', '17', '1644', '11858', '0'), +('14', '56', '7', '1218', '5954', '0'), +('14', '56', '7', '1248', '5738', '0'), +('14', '56', '7', '1648', '4231', '0'), +('14', '56', '7', '2458', '3678', '0'), +('14', '56', '9', '12806', '6862', '0'), +('14', '56', '9', '1649', '3620', '0'), +('14', '56', '9', '4408', '3473', '0'), +('14', '56', '9', '10360', '2762', '0'), +('14', '56', '15', '10366', '4854', '0'), +('14', '56', '15', '10151', '4200', '0'), +('14', '56', '15', '10163', '3709', '0'), +('14', '56', '15', '14679', '3360', '0'), +('14', '56', '20', '11666', '12629', '0'), +('14', '56', '20', '2742', '5911', '0'), +('14', '56', '20', '1277', '4421', '0'), +('14', '56', '20', '1364', '3210', '0'), +('14', '56', '12', '1250', '6302', '0'), +('14', '56', '12', '20655', '5261', '0'), +('14', '56', '12', '2336', '4407', '0'), +('14', '56', '12', '2923', '4348', '0'), +('14', '56', '18', '1651', '3538', '0'), +('14', '56', '18', '4410', '1685', '0'), +('14', '56', '18', '1251', '1318', '0'), +('14', '56', '18', '1221', '1234', '0'), +('14', '56', '19', '4407', '6179', '0'), +('14', '56', '19', '68239', '4763', '0'), +('14', '56', '19', '1368', '2066', '0'), +('14', '56', '19', '1652', '2046', '0'), +('14', '56', '13', '14759', '10891', '0'), +('14', '56', '13', '27711', '9023', '0'), +('14', '56', '13', '6359', '8118', '0'), +('14', '56', '13', '13500', '7953', '0'), +('14', '56', '14', '14759', '10891', '0'), +('14', '56', '14', '10219', '8362', '0'), +('14', '56', '14', '6359', '8118', '0'), +('14', '56', '14', '9246', '7683', '0'), +('14', '56', '11', '9246', '7683', '0'), +('14', '56', '11', '14762', '3204', '0'), +('14', '56', '11', '13353', '1500', '0'), +('14', '56', '11', '20677', '1200', '0'), +('14', '57', '22', '10323', '0', '0'), +('14', '57', '22', '9246', '0', '0'), +('14', '57', '22', '21509', '0', '0'), +('14', '57', '22', '8007', '0', '0'), +('14', '57', '1', '14559', '5399', '0'), +('14', '57', '1', '14702', '5000', '0'), +('14', '57', '1', '14701', '4624', '0'), +('14', '57', '1', '10082', '4564', '0'), +('14', '57', '2', '1246', '7143', '0'), +('14', '57', '2', '10143', '7136', '0'), +('14', '57', '2', '1211', '6986', '0'), +('14', '57', '2', '10141', '6221', '0'), +('14', '57', '3', '11052', '10328', '0'), +('14', '57', '3', '1275', '7313', '0'), +('14', '57', '3', '4505', '4880', '0'), +('14', '57', '3', '2350', '3606', '0'), +('14', '57', '5', '14703', '8800', '0'), +('14', '57', '5', '14558', '7585', '0'), +('14', '57', '5', '68291', '5398', '0'), +('14', '57', '5', '10216', '4967', '0'), +('14', '57', '8', '11603', '14568', '0'), +('14', '57', '8', '1057', '3689', '0'), +('14', '57', '8', '2349', '3651', '0'), +('14', '57', '8', '11621', '3631', '0'), +('14', '57', '6', '1542', '11292', '0'), +('14', '57', '6', '1905', '5474', '0'), +('14', '57', '6', '1557', '5371', '0'), +('14', '57', '6', '1645', '3462', '0'), +('14', '57', '17', '11641', '18482', '0'), +('14', '57', '17', '1214', '13664', '0'), +('14', '57', '17', '1247', '13470', '0'), +('14', '57', '17', '1644', '11918', '0'), +('14', '57', '7', '1218', '6038', '0'), +('14', '57', '7', '1248', '5823', '0'), +('14', '57', '7', '1648', '4291', '0'), +('14', '57', '7', '2458', '3727', '0'), +('14', '57', '9', '12806', '6947', '0'), +('14', '57', '9', '1649', '3656', '0'), +('14', '57', '9', '4408', '3533', '0'), +('14', '57', '9', '10360', '2798', '0'), +('14', '57', '15', '10366', '4854', '0'), +('14', '57', '15', '10151', '4200', '0'), +('14', '57', '15', '10163', '3709', '0'), +('14', '57', '15', '14679', '3360', '0'), +('14', '57', '20', '11666', '12639', '0'), +('14', '57', '20', '2742', '5926', '0'), +('14', '57', '20', '1277', '4482', '0'), +('14', '57', '20', '1364', '3258', '0'), +('14', '57', '12', '1250', '6399', '0'), +('14', '57', '12', '20655', '5288', '0'), +('14', '57', '12', '2336', '4467', '0'), +('14', '57', '12', '2923', '4348', '0'), +('14', '57', '18', '1651', '3574', '0'), +('14', '57', '18', '4410', '1685', '0'), +('14', '57', '18', '1251', '1318', '0'), +('14', '57', '18', '1221', '1234', '0'), +('14', '57', '19', '4407', '6287', '0'), +('14', '57', '19', '68239', '4800', '0'), +('14', '57', '19', '1368', '2066', '0'), +('14', '57', '19', '1652', '2046', '0'), +('14', '57', '13', '14759', '10956', '0'), +('14', '57', '13', '27711', '9114', '0'), +('14', '57', '13', '6359', '8239', '0'), +('14', '57', '13', '13500', '8074', '0'), +('14', '57', '14', '14759', '10956', '0'), +('14', '57', '14', '10219', '8362', '0'), +('14', '57', '14', '6359', '8239', '0'), +('14', '57', '14', '9246', '7804', '0'), +('14', '57', '11', '9246', '7804', '0'), +('14', '57', '11', '14762', '3204', '0'), +('14', '57', '11', '13353', '1500', '0'), +('14', '57', '11', '20677', '1200', '0'), +('14', '58', '22', '10323', '0', '0'), +('14', '58', '22', '9246', '0', '0'), +('14', '58', '22', '21509', '0', '0'), +('14', '58', '22', '8007', '0', '0'), +('14', '58', '1', '14559', '5448', '0'), +('14', '58', '1', '14702', '5000', '0'), +('14', '58', '1', '10082', '4636', '0'), +('14', '58', '1', '14701', '4624', '0'), +('14', '58', '2', '1246', '7227', '0'), +('14', '58', '2', '10143', '7136', '0'), +('14', '58', '2', '1211', '7070', '0'), +('14', '58', '2', '10141', '6330', '0'), +('14', '58', '3', '11052', '10510', '0'), +('14', '58', '3', '1275', '7385', '0'), +('14', '58', '3', '4505', '4965', '0'), +('14', '58', '3', '2350', '3666', '0'), +('14', '58', '5', '14703', '8800', '0'), +('14', '58', '5', '14558', '7653', '0'), +('14', '58', '5', '68291', '5446', '0'), +('14', '58', '5', '10216', '5027', '0'), +('14', '58', '8', '11603', '14677', '0'), +('14', '58', '8', '1057', '3750', '0'), +('14', '58', '8', '2349', '3651', '0'), +('14', '58', '8', '11621', '3631', '0'), +('14', '58', '6', '1542', '11401', '0'), +('14', '58', '6', '1905', '5481', '0'), +('14', '58', '6', '1557', '5371', '0'), +('14', '58', '6', '1645', '3499', '0'), +('14', '58', '17', '11641', '18664', '0'), +('14', '58', '17', '1214', '13840', '0'), +('14', '58', '17', '1247', '13641', '0'), +('14', '58', '17', '1644', '11978', '0'), +('14', '58', '7', '1218', '6123', '0'), +('14', '58', '7', '1248', '5907', '0'), +('14', '58', '7', '1648', '4352', '0'), +('14', '58', '7', '2458', '3775', '0'), +('14', '58', '9', '12806', '7031', '0'), +('14', '58', '9', '1649', '3693', '0'), +('14', '58', '9', '4408', '3594', '0'), +('14', '58', '9', '10360', '2834', '0'), +('14', '58', '15', '10366', '4854', '0'), +('14', '58', '15', '10151', '4200', '0'), +('14', '58', '15', '10163', '3709', '0'), +('14', '58', '15', '14679', '3360', '0'), +('14', '58', '20', '11666', '12650', '0'), +('14', '58', '20', '2742', '5940', '0'), +('14', '58', '20', '1277', '4542', '0'), +('14', '58', '20', '1364', '3307', '0'), +('14', '58', '12', '1250', '6496', '0'), +('14', '58', '12', '20655', '5315', '0'), +('14', '58', '12', '2336', '4527', '0'), +('14', '58', '12', '2923', '4348', '0'), +('14', '58', '18', '1651', '3611', '0'), +('14', '58', '18', '4410', '1685', '0'), +('14', '58', '18', '1251', '1318', '0'), +('14', '58', '18', '1221', '1234', '0'), +('14', '58', '19', '4407', '6396', '0'), +('14', '58', '19', '68239', '4836', '0'), +('14', '58', '19', '1368', '2066', '0'), +('14', '58', '19', '1652', '2046', '0'), +('14', '58', '13', '14759', '11021', '0'), +('14', '58', '13', '27711', '9204', '0'), +('14', '58', '13', '6359', '8359', '0'), +('14', '58', '13', '13500', '8194', '0'), +('14', '58', '14', '14759', '11021', '0'), +('14', '58', '14', '10219', '8362', '0'), +('14', '58', '14', '6359', '8359', '0'), +('14', '58', '14', '9246', '7924', '0'), +('14', '58', '11', '9246', '7924', '0'), +('14', '58', '11', '14762', '3204', '0'), +('14', '58', '11', '13353', '1500', '0'), +('14', '58', '11', '20677', '1200', '0'), +('14', '59', '22', '10323', '0', '0'), +('14', '59', '22', '9246', '0', '0'), +('14', '59', '22', '21509', '0', '0'), +('14', '59', '22', '8007', '0', '0'), +('14', '59', '1', '14559', '5496', '0'), +('14', '59', '1', '14702', '5000', '0'), +('14', '59', '1', '10082', '4709', '0'), +('14', '59', '1', '14701', '4624', '0'), +('14', '59', '2', '1246', '7312', '0'), +('14', '59', '2', '1211', '7155', '0'), +('14', '59', '2', '10143', '7136', '0'), +('14', '59', '2', '10141', '6439', '0'), +('14', '59', '3', '11052', '10691', '0'), +('14', '59', '3', '1275', '7458', '0'), +('14', '59', '3', '4505', '5049', '0'), +('14', '59', '3', '2350', '3727', '0'), +('14', '59', '5', '14703', '8800', '0'), +('14', '59', '5', '14558', '7721', '0'), +('14', '59', '5', '68291', '5495', '0'), +('14', '59', '5', '10216', '5088', '0'), +('14', '59', '8', '11603', '14785', '0'), +('14', '59', '8', '1057', '3810', '0'), +('14', '59', '8', '2349', '3651', '0'), +('14', '59', '8', '11621', '3631', '0'), +('14', '59', '6', '1542', '11509', '0'), +('14', '59', '6', '1905', '5488', '0'), +('14', '59', '6', '1557', '5371', '0'), +('14', '59', '6', '1645', '3535', '0'), +('14', '59', '17', '11641', '18845', '0'), +('14', '59', '17', '1214', '14016', '0'), +('14', '59', '17', '1247', '13813', '0'), +('14', '59', '17', '1644', '12039', '0'), +('14', '59', '7', '1218', '6207', '0'), +('14', '59', '7', '1248', '5992', '0'), +('14', '59', '7', '1648', '4412', '0'), +('14', '59', '7', '2458', '3823', '0'), +('14', '59', '9', '12806', '7116', '0'), +('14', '59', '9', '1649', '3729', '0'), +('14', '59', '9', '4408', '3654', '0'), +('14', '59', '9', '10360', '2870', '0'), +('14', '59', '15', '10366', '4854', '0'), +('14', '59', '15', '10151', '4200', '0'), +('14', '59', '15', '10163', '3709', '0'), +('14', '59', '15', '14679', '3360', '0'), +('14', '59', '20', '11666', '12660', '0'), +('14', '59', '20', '2742', '5955', '0'), +('14', '59', '20', '1277', '4603', '0'), +('14', '59', '20', '1364', '3355', '0'), +('14', '59', '12', '1250', '6592', '0'), +('14', '59', '12', '20655', '5342', '0'), +('14', '59', '12', '2336', '4588', '0'), +('14', '59', '12', '2923', '4348', '0'), +('14', '59', '18', '1651', '3647', '0'), +('14', '59', '18', '4410', '1685', '0'), +('14', '59', '18', '1251', '1318', '0'), +('14', '59', '18', '1221', '1234', '0'), +('14', '59', '19', '4407', '6505', '0'), +('14', '59', '19', '68239', '4872', '0'), +('14', '59', '19', '1368', '2066', '0'), +('14', '59', '19', '1652', '2046', '0'), +('14', '59', '13', '14759', '11087', '0'), +('14', '59', '13', '27711', '9295', '0'), +('14', '59', '13', '6359', '8480', '0'), +('14', '59', '13', '13500', '8315', '0'), +('14', '59', '14', '14759', '11087', '0'), +('14', '59', '14', '6359', '8480', '0'), +('14', '59', '14', '10219', '8362', '0'), +('14', '59', '14', '9246', '8045', '0'), +('14', '59', '11', '9246', '8045', '0'), +('14', '59', '11', '14762', '3204', '0'), +('14', '59', '11', '13353', '1500', '0'), +('14', '59', '11', '20677', '1200', '0'), +('14', '60', '22', '66397', '0', '3'), +('14', '60', '22', '61948', '0', '3'), +('14', '60', '22', '21805', '0', '3'), +('14', '60', '22', '21807', '0', '3'), +('14', '60', '1', '63170', '27617', '3'), +('14', '60', '1', '30552', '24372', '3'), +('14', '60', '1', '29861', '17842', '3'), +('14', '60', '1', '28944', '16422', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '60', '2', '26763', '37357', '3'), +('14', '60', '2', '26605', '17663', '3'), +('14', '60', '2', '26762', '17527', '3'), +('14', '60', '2', '28909', '17329', '3'), +('14', '60', '3', '5772', '44628', '3'), +('14', '60', '3', '1157', '23168', '3'), +('14', '60', '3', '30553', '18163', '3'), +('14', '60', '3', '31328', '18004', '3'), +('14', '60', '5', '51229', '29665', '3'), +('14', '60', '5', '28911', '27868', '3'), +('14', '60', '5', '8364', '23615', '3'), +('14', '60', '5', '31234', '23259', '3'), +('14', '60', '8', '28964', '22505', '3'), +('14', '60', '8', '28992', '22325', '3'), +('14', '60', '8', '30505', '21001', '3'), +('14', '60', '8', '8359', '19758', '3'), +('14', '60', '6', '1200', '34462', '3'), +('14', '60', '6', '28920', '19494', '3'), +('14', '60', '6', '28902', '17426', '3'), +('14', '60', '6', '28919', '16783', '3'), +('14', '60', '17', '32933', '25018', '3'), +('14', '60', '17', '26776', '23703', '3'), +('14', '60', '17', '26604', '22253', '3'), +('14', '60', '17', '55296', '20470', '3'), +('14', '60', '7', '28924', '19561', '3'), +('14', '60', '7', '7868', '19113', '3'), +('14', '60', '7', '8288', '17509', '3'), +('14', '60', '7', '26555', '14683', '3'), +('14', '60', '9', '26781', '37211', '3'), +('14', '60', '9', '30552', '24372', '3'), +('14', '60', '9', '28891', '21753', '3'), +('14', '60', '9', '7868', '19113', '3'), +('14', '60', '15', '51242', '30931', '3'), +('14', '60', '15', '63170', '27617', '3'), +('14', '60', '15', '28993', '21638', '3'), +('14', '60', '15', '23511', '18201', '3'), +('14', '60', '20', '28916', '22550', '3'), +('14', '60', '20', '30534', '18710', '3'), +('14', '60', '20', '26549', '18079', '3'), +('14', '60', '20', '2510', '17377', '3'), +('14', '60', '12', '30534', '18710', '3'), +('14', '60', '12', '28967', '18255', '3'), +('14', '60', '12', '28949', '13988', '3'), +('14', '60', '12', '28972', '13985', '3'), +('14', '60', '18', '26755', '21009', '3'), +('14', '60', '18', '26777', '18524', '3'), +('14', '60', '18', '28932', '17353', '3'), +('14', '60', '18', '8289', '17326', '3'), +('14', '60', '19', '28148', '26086', '3'), +('14', '60', '19', '30570', '20613', '3'), +('14', '60', '19', '29645', '17757', '3'), +('14', '60', '19', '31245', '17692', '3'), +('14', '60', '13', '26778', '37655', '3'), +('14', '60', '13', '28917', '21054', '3'), +('14', '60', '13', '28981', '20469', '3'), +('14', '60', '13', '28980', '19469', '3'), +('14', '60', '14', '28915', '39710', '3'), +('14', '60', '14', '26778', '37655', '3'), +('14', '60', '14', '10219', '23006', '3'), +('14', '60', '14', '26780', '22436', '3'), +('14', '60', '11', '26778', '37655', '3'), +('14', '60', '11', '2698', '29253', '3'), +('14', '60', '11', '31321', '21070', '3'), +('14', '60', '11', '30562', '18585', '3'), +('14', '60', '22', '10323', '0', '2'), +('14', '60', '22', '9248', '0', '2'), +('14', '60', '22', '12425', '0', '2'), +('14', '60', '22', '30014', '0', '2'), +('14', '60', '1', '31228', '17017', '2'), +('14', '60', '1', '10912', '9516', '2'), +('14', '60', '1', '62234', '9159', '2'), +('14', '60', '1', '62348', '8045', '2'), +('14', '60', '2', '10913', '16155', '2'), +('14', '60', '2', '29648', '14340', '2'), +('14', '60', '2', '31322', '12005', '2'), +('14', '60', '2', '1867', '11632', '2'), +('14', '60', '3', '31233', '18777', '2'), +('14', '60', '3', '31244', '15240', '2'), +('14', '60', '3', '1547', '14483', '2'), +('14', '60', '3', '31463', '11812', '2'), +('14', '60', '5', '31460', '17514', '2'), +('14', '60', '5', '31318', '14266', '2'), +('14', '60', '5', '29459', '13516', '2'), +('14', '60', '5', '27259', '12723', '2'), +('14', '60', '8', '1628', '16065', '2'), +('14', '60', '8', '5779', '12922', '2'), +('14', '60', '8', '1622', '12627', '2'), +('14', '60', '8', '11603', '9449', '2'), +('14', '60', '6', '29472', '8936', '2'), +('14', '60', '6', '1114', '7498', '2'), +('14', '60', '6', '24070', '6936', '2'), +('14', '60', '6', '5723', '6555', '2'), +('14', '60', '17', '31239', '22307', '2'), +('14', '60', '17', '10845', '20005', '2'), +('14', '60', '17', '31176', '15910', '2'), +('14', '60', '17', '1552', '14960', '2'), +('14', '60', '7', '29485', '10152', '2'), +('14', '60', '7', '31342', '8925', '2'), +('14', '60', '7', '31237', '7398', '2'), +('14', '60', '7', '5723', '6555', '2'), +('14', '60', '9', '31460', '17514', '2'), +('14', '60', '9', '31246', '11105', '2'), +('14', '60', '9', '1559', '11067', '2'), +('14', '60', '9', '31461', '8300', '2'), +('14', '60', '15', '25211', '17733', '2'), +('14', '60', '15', '31231', '17565', '2'), +('14', '60', '15', '25198', '13630', '2'), +('14', '60', '15', '62373', '10465', '2'), +('14', '60', '20', '25858', '18759', '2'), +('14', '60', '20', '2510', '17647', '2'), +('14', '60', '20', '1556', '17325', '2'), +('14', '60', '20', '11666', '12121', '2'), +('14', '60', '12', '25857', '14595', '2'), +('14', '60', '12', '31306', '14026', '2'), +('14', '60', '12', '31340', '10701', '2'), +('14', '60', '12', '31179', '8080', '2'), +('14', '60', '18', '31339', '10621', '2'), +('14', '60', '18', '31180', '6838', '2'), +('14', '60', '18', '31371', '5352', '2'), +('14', '60', '18', '5819', '4891', '2'), +('14', '60', '19', '29645', '19806', '2'), +('14', '60', '19', '31245', '19595', '2'), +('14', '60', '19', '31355', '11634', '2'), +('14', '60', '19', '31327', '10080', '2'), +('14', '60', '13', '31326', '17472', '2'), +('14', '60', '13', '1156', '14928', '2'), +('14', '60', '13', '31396', '14865', '2'), +('14', '60', '13', '24609', '13050', '2'), +('14', '60', '14', '2498', '16406', '2'), +('14', '60', '14', '31462', '15516', '2'), +('14', '60', '14', '24609', '13050', '2'), +('14', '60', '14', '25098', '12883', '2'), +('14', '60', '11', '1554', '18957', '2'), +('14', '60', '11', '31466', '17080', '2'), +('14', '60', '11', '2698', '14283', '2'), +('14', '60', '11', '31302', '11402', '2'), +('14', '60', '22', '10323', '0', '1'), +('14', '60', '22', '12425', '0', '1'), +('14', '60', '22', '9246', '0', '1'), +('14', '60', '22', '21509', '0', '1'), +('14', '60', '1', '10912', '13981', '1'), +('14', '60', '1', '62234', '11111', '1'), +('14', '60', '1', '5713', '5646', '1'), +('14', '60', '1', '5702', '5636', '1'), +('14', '60', '2', '10913', '22184', '1'), +('14', '60', '2', '10143', '7121', '1'), +('14', '60', '2', '62138', '5593', '1'), +('14', '60', '2', '1414', '5527', '1'), +('14', '60', '3', '46184', '7753', '1'), +('14', '60', '3', '5780', '7323', '1'), +('14', '60', '3', '11052', '6417', '1'), +('14', '60', '3', '1625', '6006', '1'), +('14', '60', '5', '14703', '8800', '1'), +('14', '60', '5', '14558', '6031', '1'), +('14', '60', '5', '8285', '5764', '1'), +('14', '60', '5', '14709', '4858', '1'), +('14', '60', '8', '1628', '20074', '1'), +('14', '60', '8', '1622', '14049', '1'), +('14', '60', '8', '5779', '12971', '1'), +('14', '60', '8', '11603', '12172', '1'), +('14', '60', '6', '29468', '8854', '1'), +('14', '60', '6', '1542', '8824', '1'), +('14', '60', '6', '5723', '6792', '1'), +('14', '60', '6', '1557', '5321', '1'), +('14', '60', '17', '10845', '26034', '1'), +('14', '60', '17', '11641', '14508', '1'), +('14', '60', '17', '24604', '12175', '1'), +('14', '60', '17', '1253', '10570', '1'), +('14', '60', '7', '5723', '6792', '1'), +('14', '60', '7', '1218', '4193', '1'), +('14', '60', '7', '1248', '3955', '1'), +('14', '60', '7', '1362', '3129', '1'), +('14', '60', '9', '5723', '6792', '1'), +('14', '60', '9', '12806', '5069', '1'), +('14', '60', '9', '1618', '4960', '1'), +('14', '60', '9', '4780', '3035', '1'), +('14', '60', '15', '5727', '11269', '1'), +('14', '60', '15', '5728', '8853', '1'), +('14', '60', '15', '14738', '6750', '1'), +('14', '60', '15', '5807', '6543', '1'), +('14', '60', '20', '1556', '20335', '1'), +('14', '60', '20', '11666', '12395', '1'), +('14', '60', '20', '5765', '8112', '1'), +('14', '60', '20', '2742', '5572', '1'), +('14', '60', '12', '4582', '9903', '1'), +('14', '60', '12', '20655', '4603', '1'), +('14', '60', '12', '2923', '4329', '1'), +('14', '60', '12', '1250', '4276', '1'), +('14', '60', '18', '5819', '5959', '1'), +('14', '60', '18', '24765', '4209', '1'), +('14', '60', '18', '1651', '2748', '1'), +('14', '60', '18', '4410', '1650', '1'), +('14', '60', '19', '5749', '4730', '1'), +('14', '60', '19', '68239', '3966', '1'), +('14', '60', '19', '4407', '3916', '1'), +('14', '60', '19', '24616', '2220', '1'), +('14', '60', '13', '10650', '19135', '1'), +('14', '60', '13', '24609', '15429', '1'), +('14', '60', '13', '24629', '13134', '1'), +('14', '60', '13', '24637', '10793', '1'), +('14', '60', '14', '24609', '15429', '1'), +('14', '60', '14', '24629', '13134', '1'), +('14', '60', '14', '14759', '9737', '1'), +('14', '60', '14', '14745', '8222', '1'), +('14', '60', '11', '46178', '9656', '1'), +('14', '60', '11', '5763', '7275', '1'), +('14', '60', '11', '79631', '5897', '1'), +('14', '60', '11', '5805', '5300', '1'), +('14', '61', '22', '66397', '0', '3'), +('14', '61', '22', '61948', '0', '3'), +('14', '61', '22', '21805', '0', '3'), +('14', '61', '22', '21807', '0', '3'), +('14', '61', '1', '63170', '27119', '3'), +('14', '61', '1', '30552', '24074', '3'), +('14', '61', '1', '29861', '17847', '3'), +('14', '61', '1', '28944', '16424', '3'), +('14', '61', '2', '26763', '36610', '3'), +('14', '61', '2', '26605', '17666', '3'), +('14', '61', '2', '26762', '17529', '3'), +('14', '61', '2', '28909', '17331', '3'), +('14', '61', '3', '5772', '43733', '3'), +('14', '61', '3', '1157', '22421', '3'), +('14', '61', '3', '30553', '18166', '3'), +('14', '61', '3', '31328', '17504', '3'), +('14', '61', '5', '51229', '29167', '3'), +('14', '61', '5', '28911', '27370', '3'), +('14', '61', '5', '8364', '23618', '3'), +('14', '61', '5', '31234', '22509', '3'), +('14', '61', '8', '28964', '22508', '3'), +('14', '61', '8', '28992', '22325', '3'), +('14', '61', '8', '30505', '20253', '3'), +('14', '61', '8', '8359', '19760', '3'), +('14', '61', '6', '1200', '33463', '3'), +('14', '61', '6', '28920', '19498', '3'), +('14', '61', '6', '28902', '17426', '3'), +('14', '61', '6', '28919', '16783', '3'), +('14', '61', '17', '32933', '24520', '3'), +('14', '61', '17', '26776', '23708', '3'), +('14', '61', '17', '26604', '22259', '3'), +('14', '61', '17', '55296', '20474', '3'), +('14', '61', '7', '28924', '19565', '3'), +('14', '61', '7', '7868', '19114', '3'), +('14', '61', '7', '8288', '17509', '3'), +('14', '61', '7', '26555', '14683', '3'), +('14', '61', '9', '26781', '36464', '3'), +('14', '61', '9', '30552', '24074', '3'), +('14', '61', '9', '28891', '21453', '3'), +('14', '61', '9', '7868', '19114', '3'), +('14', '61', '15', '51242', '30182', '3'), +('14', '61', '15', '63170', '27119', '3'), +('14', '61', '15', '28993', '21640', '3'), +('14', '61', '15', '7870', '17878', '3'), +('14', '61', '20', '28916', '22552', '3'), +('14', '61', '20', '30534', '18712', '3'), +('14', '61', '20', '26549', '18083', '3'), +('14', '61', '20', '2510', '17378', '3'), +('14', '61', '12', '30534', '18712', '3'), +('14', '61', '12', '28967', '18255', '3'), +('14', '61', '12', '28949', '13990', '3'), +('14', '61', '12', '28972', '13988', '3'), +('14', '61', '18', '26755', '20709', '3'), +('14', '61', '18', '26777', '18526', '3'), +('14', '61', '18', '28932', '17355', '3'), +('14', '61', '18', '8289', '17328', '3'), +('14', '61', '19', '28148', '25789', '3'), +('14', '61', '19', '30570', '20615', '3'), +('14', '61', '19', '29645', '17760', '3'), +('14', '61', '19', '31245', '17695', '3'), +('14', '61', '13', '26778', '37062', '3'), +('14', '61', '13', '28917', '21054', '3'), +('14', '61', '13', '28981', '20471', '3'), +('14', '61', '13', '28980', '19471', '3'), +('14', '61', '14', '28915', '38963', '3'), +('14', '61', '14', '26778', '37062', '3'), +('14', '61', '14', '26780', '22439', '3'), +('14', '61', '14', '10219', '22256', '3'), +('14', '61', '11', '26778', '37062', '3'), +('14', '61', '11', '2698', '28503', '3'), +('14', '61', '11', '31321', '20320', '3'), +('14', '61', '11', '30562', '18587', '3'), +('14', '62', '22', '66397', '0', '3'), +('14', '62', '22', '61948', '0', '3'), +('14', '62', '22', '21805', '0', '3'), +('14', '62', '22', '21807', '0', '3'), +('14', '62', '1', '63170', '26621', '3'), +('14', '62', '1', '30552', '23776', '3'), +('14', '62', '1', '29861', '17853', '3'), +('14', '62', '1', '28944', '16426', '3'), +('14', '62', '2', '26763', '35863', '3'), +('14', '62', '2', '26605', '17668', '3'), +('14', '62', '2', '26762', '17532', '3'), +('14', '62', '2', '28909', '17333', '3'), +('14', '62', '3', '5772', '42838', '3'), +('14', '62', '3', '1157', '21673', '3'), +('14', '62', '3', '30553', '18168', '3'), +('14', '62', '3', '31233', '17349', '3'), +('14', '62', '5', '51229', '28669', '3'), +('14', '62', '5', '28911', '26872', '3'), +('14', '62', '5', '8364', '23622', '3'), +('14', '62', '5', '31234', '21759', '3'), +('14', '62', '8', '28964', '22511', '3'), +('14', '62', '8', '28992', '22325', '3'), +('14', '62', '8', '8359', '19763', '3'), +('14', '62', '8', '28918', '19752', '3'), +('14', '62', '6', '1200', '32465', '3'), +('14', '62', '6', '28920', '19502', '3'), +('14', '62', '6', '28902', '17426', '3'), +('14', '62', '6', '28919', '16784', '3'), +('14', '62', '17', '32933', '24021', '3'), +('14', '62', '17', '26776', '23714', '3'), +('14', '62', '17', '26604', '22265', '3'), +('14', '62', '17', '55296', '20479', '3'), +('14', '62', '7', '28924', '19568', '3'), +('14', '62', '7', '7868', '19116', '3'), +('14', '62', '7', '8288', '17509', '3'), +('14', '62', '7', '26555', '14683', '3'), +('14', '62', '9', '26781', '35717', '3'), +('14', '62', '9', '30552', '23776', '3'), +('14', '62', '9', '28891', '21153', '3'), +('14', '62', '9', '7868', '19116', '3'), +('14', '62', '15', '51242', '29433', '3'), +('14', '62', '15', '63170', '26621', '3'), +('14', '62', '15', '28993', '21642', '3'), +('14', '62', '15', '7870', '17880', '3'), +('14', '62', '20', '28916', '22553', '3'), +('14', '62', '20', '30534', '18715', '3'), +('14', '62', '20', '26549', '18088', '3'), +('14', '62', '20', '2510', '17378', '3'), +('14', '62', '12', '30534', '18715', '3'), +('14', '62', '12', '28967', '18255', '3'), +('14', '62', '12', '28949', '13992', '3'), +('14', '62', '12', '28972', '13991', '3'), +('14', '62', '18', '26755', '20409', '3'), +('14', '62', '18', '26777', '18528', '3'), +('14', '62', '18', '28932', '17358', '3'), +('14', '62', '18', '8289', '17330', '3'), +('14', '62', '19', '28148', '25492', '3'), +('14', '62', '19', '30570', '20617', '3'), +('14', '62', '19', '29645', '17764', '3'), +('14', '62', '19', '31245', '17698', '3'), +('14', '62', '13', '26778', '36468', '3'), +('14', '62', '13', '28917', '21054', '3'), +('14', '62', '13', '28981', '20474', '3'), +('14', '62', '13', '28980', '19474', '3'), +('14', '62', '14', '28915', '38216', '3'), +('14', '62', '14', '26778', '36468', '3'), +('14', '62', '14', '26780', '22442', '3'), +('14', '62', '14', '10219', '21506', '3'), +('14', '62', '11', '26778', '36468', '3'), +('14', '62', '11', '2698', '27753', '3'), +('14', '62', '11', '31321', '19570', '3'), +('14', '62', '11', '30562', '18589', '3'), +('14', '63', '22', '66397', '0', '3'), +('14', '63', '22', '61948', '0', '3'), +('14', '63', '22', '21805', '0', '3'), +('14', '63', '22', '21807', '0', '3'), +('14', '63', '1', '63170', '26123', '3'), +('14', '63', '1', '30552', '23478', '3'), +('14', '63', '1', '29861', '17858', '3'), +('14', '63', '1', '28944', '16428', '3'), +('14', '63', '2', '26763', '35117', '3'), +('14', '63', '2', '26605', '17671', '3'), +('14', '63', '2', '26762', '17535', '3'), +('14', '63', '2', '28909', '17335', '3'), +('14', '63', '3', '5772', '41944', '3'), +('14', '63', '3', '1157', '20926', '3'), +('14', '63', '3', '30553', '18171', '3'), +('14', '63', '3', '31233', '17351', '3'), +('14', '63', '5', '51229', '28171', '3'), +('14', '63', '5', '28911', '26375', '3'), +('14', '63', '5', '8364', '23625', '3'), +('14', '63', '5', '31234', '21009', '3'), +('14', '63', '8', '28964', '22515', '3'), +('14', '63', '8', '28992', '22326', '3'), +('14', '63', '8', '8359', '19766', '3'), +('14', '63', '8', '28918', '19752', '3'), +('14', '63', '6', '1200', '31467', '3'), +('14', '63', '6', '28920', '19506', '3'), +('14', '63', '6', '28902', '17427', '3'), +('14', '63', '6', '28919', '16784', '3'), +('14', '63', '17', '26776', '23719', '3'), +('14', '63', '17', '32933', '23523', '3'), +('14', '63', '17', '26604', '22270', '3'), +('14', '63', '17', '55296', '20483', '3'), +('14', '63', '7', '28924', '19572', '3'), +('14', '63', '7', '7868', '19118', '3'), +('14', '63', '7', '8288', '17509', '3'), +('14', '63', '7', '26555', '14684', '3'), +('14', '63', '9', '26781', '34971', '3'), +('14', '63', '9', '30552', '23478', '3'), +('14', '63', '9', '28891', '20853', '3'), +('14', '63', '9', '7868', '19118', '3'), +('14', '63', '15', '51242', '28685', '3'), +('14', '63', '15', '63170', '26123', '3'), +('14', '63', '15', '28993', '21644', '3'), +('14', '63', '15', '7870', '17882', '3'), +('14', '63', '20', '28916', '22555', '3'), +('14', '63', '20', '30534', '18717', '3'), +('14', '63', '20', '26549', '18092', '3'), +('14', '63', '20', '2510', '17378', '3'), +('14', '63', '12', '30534', '18717', '3'), +('14', '63', '12', '28967', '18255', '3'), +('14', '63', '12', '28949', '13995', '3'), +('14', '63', '12', '28972', '13994', '3'), +('14', '63', '18', '26755', '20109', '3'), +('14', '63', '18', '26777', '18530', '3'), +('14', '63', '18', '28932', '17360', '3'), +('14', '63', '18', '8289', '17332', '3'), +('14', '63', '19', '28148', '25195', '3'), +('14', '63', '19', '30570', '20618', '3'), +('14', '63', '19', '29645', '17767', '3'), +('14', '63', '19', '31245', '17702', '3'), +('14', '63', '13', '26778', '35875', '3'), +('14', '63', '13', '28917', '21054', '3'), +('14', '63', '13', '28981', '20477', '3'), +('14', '63', '13', '28980', '19477', '3'), +('14', '63', '14', '28915', '37469', '3'), +('14', '63', '14', '26778', '35875', '3'), +('14', '63', '14', '26780', '22446', '3'), +('14', '63', '14', '10219', '20756', '3'), +('14', '63', '11', '26778', '35875', '3'), +('14', '63', '11', '2698', '27003', '3'), +('14', '63', '11', '31321', '18820', '3'), +('14', '63', '11', '30562', '18592', '3'), +('14', '64', '22', '66397', '0', '3'), +('14', '64', '22', '61948', '0', '3'), +('14', '64', '22', '21805', '0', '3'), +('14', '64', '22', '21807', '0', '3'), +('14', '64', '1', '63170', '25625', '3'), +('14', '64', '1', '30552', '23180', '3'), +('14', '64', '1', '29861', '17864', '3'), +('14', '64', '1', '28944', '16430', '3'), +('14', '64', '2', '26763', '34370', '3'), +('14', '64', '2', '26605', '17674', '3'), +('14', '64', '2', '26762', '17538', '3'), +('14', '64', '2', '28909', '17337', '3'), +('14', '64', '3', '5772', '41049', '3'), +('14', '64', '3', '1157', '20178', '3'), +('14', '64', '3', '30553', '18174', '3'), +('14', '64', '3', '31233', '17354', '3'), +('14', '64', '5', '51229', '27673', '3'), +('14', '64', '5', '28911', '25877', '3'), +('14', '64', '5', '8364', '23628', '3'), +('14', '64', '5', '31234', '20259', '3'), +('14', '64', '8', '28964', '22518', '3'), +('14', '64', '8', '28992', '22326', '3'), +('14', '64', '8', '8359', '19768', '3'), +('14', '64', '8', '28918', '19752', '3'), +('14', '64', '6', '1200', '30469', '3'), +('14', '64', '6', '28920', '19510', '3'), +('14', '64', '6', '28902', '17427', '3'), +('14', '64', '6', '28919', '16785', '3'), +('14', '64', '17', '26776', '23725', '3'), +('14', '64', '17', '32933', '23024', '3'), +('14', '64', '17', '26604', '22276', '3'), +('14', '64', '17', '55296', '20488', '3'), +('14', '64', '7', '28924', '19575', '3'), +('14', '64', '7', '7868', '19120', '3'), +('14', '64', '7', '8288', '17509', '3'), +('14', '64', '7', '26555', '14684', '3'), +('14', '64', '9', '26781', '34224', '3'), +('14', '64', '9', '30552', '23180', '3'), +('14', '64', '9', '28891', '20553', '3'), +('14', '64', '9', '7868', '19120', '3'), +('14', '64', '15', '51242', '27936', '3'), +('14', '64', '15', '63170', '25625', '3'), +('14', '64', '15', '28993', '21647', '3'), +('14', '64', '15', '7870', '17884', '3'), +('14', '64', '20', '28916', '22556', '3'), +('14', '64', '20', '30534', '18720', '3'), +('14', '64', '20', '26549', '18097', '3'), +('14', '64', '20', '2510', '17379', '3'), +('14', '64', '12', '30534', '18720', '3'), +('14', '64', '12', '28967', '18255', '3'), +('14', '64', '12', '28972', '13997', '3'), +('14', '64', '12', '28949', '13997', '3'), +('14', '64', '18', '26755', '19809', '3'), +('14', '64', '18', '26777', '18532', '3'), +('14', '64', '18', '28932', '17363', '3'), +('14', '64', '18', '8289', '17334', '3'), +('14', '64', '19', '28148', '24898', '3'), +('14', '64', '19', '30570', '20620', '3'), +('14', '64', '19', '29645', '17771', '3'), +('14', '64', '19', '31245', '17705', '3'), +('14', '64', '13', '26778', '35282', '3'), +('14', '64', '13', '28917', '21054', '3'), +('14', '64', '13', '28981', '20480', '3'), +('14', '64', '13', '28980', '19480', '3'), +('14', '64', '14', '28915', '36722', '3'), +('14', '64', '14', '26778', '35282', '3'), +('14', '64', '14', '26780', '22449', '3'), +('14', '64', '14', '28981', '20480', '3'), +('14', '64', '11', '26778', '35282', '3'), +('14', '64', '11', '2698', '26253', '3'), +('14', '64', '11', '30562', '18594', '3'), +('14', '64', '11', '31321', '18070', '3'), +('14', '65', '22', '66397', '0', '7'), +('14', '65', '22', '62787', '0', '7'), +('14', '65', '22', '61948', '0', '7'), +('14', '65', '22', '21805', '0', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '65', '1', '68949', '63426', '7'), +('14', '65', '1', '69166', '54375', '7'), +('14', '65', '1', '52121', '49183', '7'), +('14', '65', '1', '7130', '48520', '7'), +('14', '65', '2', '16158', '44647', '7'), +('14', '65', '2', '46141', '40614', '7'), +('14', '65', '2', '67734', '36758', '7'), +('14', '65', '2', '15929', '33974', '7'), +('14', '65', '3', '69132', '79541', '7'), +('14', '65', '3', '69157', '45907', '7'), +('14', '65', '3', '68783', '44922', '7'), +('14', '65', '3', '69074', '41934', '7'), +('14', '65', '5', '7769', '58174', '7'), +('14', '65', '5', '67625', '49514', '7'), +('14', '65', '5', '69135', '46618', '7'), +('14', '65', '5', '16158', '44647', '7'), +('14', '65', '8', '69164', '47571', '7'), +('14', '65', '8', '69064', '43556', '7'), +('14', '65', '8', '69065', '42683', '7'), +('14', '65', '8', '69072', '42505', '7'), +('14', '65', '6', '69066', '74189', '7'), +('14', '65', '6', '68841', '60247', '7'), +('14', '65', '6', '69163', '47171', '7'), +('14', '65', '6', '69073', '41738', '7'), +('14', '65', '17', '68782', '59970', '7'), +('14', '65', '17', '69153', '48446', '7'), +('14', '65', '17', '14747', '42678', '7'), +('14', '65', '17', '47656', '35046', '7'), +('14', '65', '7', '68926', '62250', '7'), +('14', '65', '7', '69176', '45353', '7'), +('14', '65', '7', '69082', '40691', '7'), +('14', '65', '7', '11578', '40495', '7'), +('14', '65', '9', '69100', '68662', '7'), +('14', '65', '9', '69129', '45841', '7'), +('14', '65', '9', '28665', '43196', '7'), +('14', '65', '9', '68929', '34672', '7'), +('14', '65', '15', '69070', '74540', '7'), +('14', '65', '15', '26993', '59012', '7'), +('14', '65', '15', '68664', '50571', '7'), +('14', '65', '15', '52121', '49183', '7'), +('14', '65', '20', '67625', '49514', '7'), +('14', '65', '20', '69134', '46816', '7'), +('14', '65', '20', '68821', '46250', '7'), +('14', '65', '20', '69386', '45986', '7'), +('14', '65', '12', '26996', '52669', '7'), +('14', '65', '12', '69255', '47628', '7'), +('14', '65', '12', '69086', '47413', '7'), +('14', '65', '12', '68927', '36612', '7'), +('14', '65', '18', '28649', '64075', '7'), +('14', '65', '18', '69149', '54879', '7'), +('14', '65', '18', '68989', '44815', '7'), +('14', '65', '18', '68751', '36340', '7'), +('14', '65', '19', '69251', '47119', '7'), +('14', '65', '19', '20425', '41737', '7'), +('14', '65', '19', '69078', '40016', '7'), +('14', '65', '19', '68928', '36600', '7'), +('14', '65', '13', '69098', '72382', '7'), +('14', '65', '13', '69159', '46148', '7'), +('14', '65', '13', '69125', '43618', '7'), +('14', '65', '13', '69051', '42322', '7'), +('14', '65', '14', '69098', '72382', '7'), +('14', '65', '14', '69155', '46388', '7'), +('14', '65', '14', '69159', '46148', '7'), +('14', '65', '14', '69048', '42934', '7'), +('14', '65', '11', '67606', '45155', '7'), +('14', '65', '11', '68952', '42251', '7'), +('14', '65', '11', '68848', '40481', '7'), +('14', '65', '11', '69055', '38071', '7'), +('14', '65', '22', '66397', '0', '6'), +('14', '65', '22', '62787', '0', '6'), +('14', '65', '22', '61948', '0', '6'), +('14', '65', '22', '21805', '0', '6'), +('14', '65', '1', '7130', '48520', '6'), +('14', '65', '1', '10242', '47788', '6'), +('14', '65', '1', '16257', '42072', '6'), +('14', '65', '1', '26980', '39271', '6'), +('14', '65', '2', '16158', '44647', '6'), +('14', '65', '2', '15929', '33974', '6'), +('14', '65', '2', '26763', '33624', '6'), +('14', '65', '2', '68195', '30055', '6'), +('14', '65', '3', '5772', '40154', '6'), +('14', '65', '3', '9435', '32093', '6'), +('14', '65', '3', '9444', '23293', '6'), +('14', '65', '3', '62463', '23212', '6'), +('14', '65', '5', '7769', '58174', '6'), +('14', '65', '5', '16158', '44647', '6'), +('14', '65', '5', '8774', '31042', '6'), +('14', '65', '5', '7768', '28833', '6'), +('14', '65', '8', '15805', '36621', '6'), +('14', '65', '8', '15804', '36403', '6'), +('14', '65', '8', '15847', '31974', '6'), +('14', '65', '8', '21998', '30370', '6'), +('14', '65', '6', '28661', '36220', '6'), +('14', '65', '6', '1200', '29470', '6'), +('14', '65', '6', '13654', '28702', '6'), +('14', '65', '6', '13638', '27385', '6'), +('14', '65', '17', '14747', '42678', '6'), +('14', '65', '17', '47656', '35046', '6'), +('14', '65', '17', '69403', '34936', '6'), +('14', '65', '17', '68075', '26235', '6'), +('14', '65', '7', '11578', '40495', '6'), +('14', '65', '7', '11323', '35842', '6'), +('14', '65', '7', '21994', '26770', '6'), +('14', '65', '7', '11324', '24085', '6'), +('14', '65', '9', '28665', '43196', '6'), +('14', '65', '9', '26781', '33477', '6'), +('14', '65', '9', '28668', '32767', '6'), +('14', '65', '9', '68198', '29872', '6'), +('14', '65', '15', '26993', '59012', '6'), +('14', '65', '15', '32109', '36160', '6'), +('14', '65', '15', '14818', '32668', '6'), +('14', '65', '15', '26990', '31664', '6'), +('14', '65', '20', '15871', '45515', '6'), +('14', '65', '20', '16158', '44647', '6'), +('14', '65', '20', '15929', '33974', '6'), +('14', '65', '20', '15927', '32032', '6'), +('14', '65', '12', '26996', '52669', '6'), +('14', '65', '12', '13614', '24807', '6'), +('14', '65', '12', '11878', '19961', '6'), +('14', '65', '12', '30534', '18723', '6'), +('14', '65', '18', '28649', '64075', '6'), +('14', '65', '18', '16931', '26289', '6'), +('14', '65', '18', '26755', '19509', '6'), +('14', '65', '18', '26777', '18534', '6'), +('14', '65', '19', '20425', '41737', '6'), +('14', '65', '19', '68196', '32480', '6'), +('14', '65', '19', '28148', '24601', '6'), +('14', '65', '19', '62445', '23151', '6'), +('14', '65', '13', '26778', '34688', '6'), +('14', '65', '13', '22959', '30021', '6'), +('14', '65', '13', '21876', '29826', '6'), +('14', '65', '13', '26788', '26905', '6'), +('14', '65', '14', '28915', '35975', '6'), +('14', '65', '14', '26778', '34688', '6'), +('14', '65', '14', '27274', '32409', '6'), +('14', '65', '14', '28656', '29780', '6'), +('14', '65', '11', '68116', '37560', '6'), +('14', '65', '11', '20496', '36412', '6'), +('14', '65', '11', '26778', '34688', '6'), +('14', '65', '11', '54039', '33099', '6'), +('14', '65', '22', '66397', '0', '5'), +('14', '65', '22', '62787', '0', '5'), +('14', '65', '22', '61948', '0', '5'), +('14', '65', '22', '21805', '0', '5'), +('14', '65', '1', '7130', '48520', '5'), +('14', '65', '1', '10242', '47788', '5'), +('14', '65', '1', '16257', '42072', '5'), +('14', '65', '1', '26980', '39271', '5'), +('14', '65', '2', '16158', '44647', '5'), +('14', '65', '2', '15929', '33974', '5'), +('14', '65', '2', '26763', '33624', '5'), +('14', '65', '2', '68195', '30055', '5'), +('14', '65', '3', '5772', '40154', '5'), +('14', '65', '3', '9435', '32093', '5'), +('14', '65', '3', '9444', '23293', '5'), +('14', '65', '3', '9468', '21173', '5'), +('14', '65', '5', '7769', '58174', '5'), +('14', '65', '5', '16158', '44647', '5'), +('14', '65', '5', '8774', '31042', '5'), +('14', '65', '5', '7768', '28833', '5'), +('14', '65', '8', '15805', '36621', '5'), +('14', '65', '8', '15804', '36403', '5'), +('14', '65', '8', '15847', '31974', '5'), +('14', '65', '8', '21998', '30370', '5'), +('14', '65', '6', '28661', '36220', '5'), +('14', '65', '6', '1200', '29470', '5'), +('14', '65', '6', '13654', '28702', '5'), +('14', '65', '6', '13638', '27385', '5'), +('14', '65', '17', '14747', '42678', '5'), +('14', '65', '17', '47656', '35046', '5'), +('14', '65', '17', '26776', '23731', '5'), +('14', '65', '17', '32933', '22526', '5'), +('14', '65', '7', '11578', '40495', '5'), +('14', '65', '7', '11323', '35842', '5'), +('14', '65', '7', '21994', '26770', '5'), +('14', '65', '7', '11324', '24085', '5'), +('14', '65', '9', '28665', '43196', '5'), +('14', '65', '9', '26781', '33477', '5'), +('14', '65', '9', '28668', '32767', '5'), +('14', '65', '9', '68198', '29872', '5'), +('14', '65', '15', '26993', '59012', '5'), +('14', '65', '15', '32109', '36160', '5'), +('14', '65', '15', '14818', '32668', '5'), +('14', '65', '15', '26990', '31664', '5'), +('14', '65', '20', '15871', '45515', '5'), +('14', '65', '20', '16158', '44647', '5'), +('14', '65', '20', '15929', '33974', '5'), +('14', '65', '20', '15927', '32032', '5'), +('14', '65', '12', '26996', '52669', '5'), +('14', '65', '12', '13614', '24807', '5'), +('14', '65', '12', '11878', '19961', '5'), +('14', '65', '12', '30534', '18723', '5'), +('14', '65', '18', '28649', '64075', '5'), +('14', '65', '18', '16931', '26289', '5'), +('14', '65', '18', '26755', '19509', '5'), +('14', '65', '18', '26777', '18534', '5'), +('14', '65', '19', '20425', '41737', '5'), +('14', '65', '19', '68196', '32480', '5'), +('14', '65', '19', '28148', '24601', '5'), +('14', '65', '19', '20424', '21757', '5'), +('14', '65', '13', '26778', '34688', '5'), +('14', '65', '13', '22959', '30021', '5'), +('14', '65', '13', '21876', '29826', '5'), +('14', '65', '13', '26788', '26905', '5'), +('14', '65', '14', '28915', '35975', '5'), +('14', '65', '14', '26778', '34688', '5'), +('14', '65', '14', '27274', '32409', '5'), +('14', '65', '14', '28656', '29780', '5'), +('14', '65', '11', '20496', '36412', '5'), +('14', '65', '11', '26778', '34688', '5'), +('14', '65', '11', '54039', '33099', '5'), +('14', '65', '11', '9574', '31607', '5'), +('14', '65', '22', '66397', '0', '4'), +('14', '65', '22', '62787', '0', '4'), +('14', '65', '22', '61948', '0', '4'), +('14', '65', '22', '21805', '0', '4'), +('14', '65', '1', '7130', '48520', '4'), +('14', '65', '1', '10242', '47788', '4'), +('14', '65', '1', '16257', '42072', '4'), +('14', '65', '1', '26980', '39271', '4'), +('14', '65', '2', '16158', '44647', '4'), +('14', '65', '2', '15929', '33974', '4'), +('14', '65', '2', '26763', '33624', '4'), +('14', '65', '2', '68195', '30055', '4'), +('14', '65', '3', '5772', '40154', '4'), +('14', '65', '3', '9435', '32093', '4'), +('14', '65', '3', '9444', '23293', '4'), +('14', '65', '3', '9468', '21173', '4'), +('14', '65', '5', '7769', '58174', '4'), +('14', '65', '5', '16158', '44647', '4'), +('14', '65', '5', '8774', '31042', '4'), +('14', '65', '5', '7768', '28833', '4'), +('14', '65', '8', '15805', '36621', '4'), +('14', '65', '8', '15804', '36403', '4'), +('14', '65', '8', '15847', '31974', '4'), +('14', '65', '8', '21998', '30370', '4'), +('14', '65', '6', '28661', '36220', '4'), +('14', '65', '6', '1200', '29470', '4'), +('14', '65', '6', '13654', '28702', '4'), +('14', '65', '6', '13638', '27385', '4'), +('14', '65', '17', '14747', '42678', '4'), +('14', '65', '17', '47656', '35046', '4'), +('14', '65', '17', '26776', '23731', '4'), +('14', '65', '17', '32933', '22526', '4'), +('14', '65', '7', '11578', '40495', '4'), +('14', '65', '7', '11323', '35842', '4'), +('14', '65', '7', '21994', '26770', '4'), +('14', '65', '7', '11324', '24085', '4'), +('14', '65', '9', '28665', '43196', '4'), +('14', '65', '9', '26781', '33477', '4'), +('14', '65', '9', '28668', '32767', '4'), +('14', '65', '9', '68198', '29872', '4'), +('14', '65', '15', '26993', '59012', '4'), +('14', '65', '15', '32109', '36160', '4'), +('14', '65', '15', '14818', '32668', '4'), +('14', '65', '15', '26990', '31664', '4'), +('14', '65', '20', '15871', '45515', '4'), +('14', '65', '20', '16158', '44647', '4'), +('14', '65', '20', '15929', '33974', '4'), +('14', '65', '20', '15927', '32032', '4'), +('14', '65', '12', '26996', '52669', '4'), +('14', '65', '12', '13614', '24807', '4'), +('14', '65', '12', '11878', '19961', '4'), +('14', '65', '12', '30534', '18723', '4'), +('14', '65', '18', '28649', '64075', '4'), +('14', '65', '18', '16931', '26289', '4'), +('14', '65', '18', '26755', '19509', '4'), +('14', '65', '18', '26777', '18534', '4'), +('14', '65', '19', '20425', '41737', '4'), +('14', '65', '19', '68196', '32480', '4'), +('14', '65', '19', '28148', '24601', '4'), +('14', '65', '19', '20424', '21757', '4'), +('14', '65', '13', '26778', '34688', '4'), +('14', '65', '13', '22959', '30021', '4'), +('14', '65', '13', '21876', '29826', '4'), +('14', '65', '13', '26788', '26905', '4'), +('14', '65', '14', '28915', '35975', '4'), +('14', '65', '14', '26778', '34688', '4'), +('14', '65', '14', '27274', '32409', '4'), +('14', '65', '14', '28656', '29780', '4'), +('14', '65', '11', '20496', '36412', '4'), +('14', '65', '11', '26778', '34688', '4'), +('14', '65', '11', '9574', '31607', '4'), +('14', '65', '11', '20896', '30762', '4'), +('14', '66', '22', '66397', '0', '7'), +('14', '66', '22', '62787', '0', '7'), +('14', '66', '22', '61948', '0', '7'), +('14', '66', '22', '21805', '0', '7'), +('14', '66', '1', '68949', '62431', '7'), +('14', '66', '1', '69166', '54079', '7'), +('14', '66', '1', '52121', '48686', '7'), +('14', '66', '1', '7130', '48025', '7'), +('14', '66', '2', '16158', '43752', '7'), +('14', '66', '2', '46141', '40619', '7'), +('14', '66', '2', '67734', '36764', '7'), +('14', '66', '2', '15929', '33227', '7'), +('14', '66', '3', '69132', '78296', '7'), +('14', '66', '3', '69157', '45912', '7'), +('14', '66', '3', '68783', '44426', '7'), +('14', '66', '3', '69074', '41938', '7'), +('14', '66', '5', '7769', '57178', '7'), +('14', '66', '5', '67625', '49520', '7'), +('14', '66', '5', '69135', '46623', '7'), +('14', '66', '5', '16158', '43752', '7'), +('14', '66', '8', '69164', '47577', '7'), +('14', '66', '8', '69064', '43562', '7'), +('14', '66', '8', '69065', '42685', '7'), +('14', '66', '8', '69072', '42510', '7'), +('14', '66', '6', '69066', '72942', '7'), +('14', '66', '6', '68841', '59251', '7'), +('14', '66', '6', '69163', '47177', '7'), +('14', '66', '6', '69073', '41743', '7'), +('14', '66', '17', '68782', '58975', '7'), +('14', '66', '17', '69153', '48453', '7'), +('14', '66', '17', '14747', '41934', '7'), +('14', '66', '17', '47656', '35052', '7'), +('14', '66', '7', '68926', '61105', '7'), +('14', '66', '7', '69176', '45358', '7'), +('14', '66', '7', '69082', '40695', '7'), +('14', '66', '7', '11578', '39750', '7'), +('14', '66', '9', '69100', '67517', '7'), +('14', '66', '9', '69129', '45844', '7'), +('14', '66', '9', '28665', '42699', '7'), +('14', '66', '9', '68929', '34677', '7'), +('14', '66', '15', '69070', '73294', '7'), +('14', '66', '15', '26993', '57762', '7'), +('14', '66', '15', '68664', '49575', '7'), +('14', '66', '15', '52121', '48686', '7'), +('14', '66', '20', '67625', '49520', '7'), +('14', '66', '20', '69134', '46822', '7'), +('14', '66', '20', '68821', '45253', '7'), +('14', '66', '20', '69386', '44989', '7'), +('14', '66', '12', '26996', '51674', '7'), +('14', '66', '12', '69255', '47632', '7'), +('14', '66', '12', '69086', '47118', '7'), +('14', '66', '12', '68927', '36616', '7'), +('14', '66', '18', '28649', '62931', '7'), +('14', '66', '18', '69149', '54634', '7'), +('14', '66', '18', '68989', '44520', '7'), +('14', '66', '18', '68751', '36345', '7'), +('14', '66', '19', '69251', '47125', '7'), +('14', '66', '19', '20425', '40841', '7'), +('14', '66', '19', '69078', '40020', '7'), +('14', '66', '19', '68928', '36605', '7'), +('14', '66', '13', '69098', '70889', '7'), +('14', '66', '13', '69159', '46155', '7'), +('14', '66', '13', '69125', '43624', '7'), +('14', '66', '13', '69051', '42328', '7'), +('14', '66', '14', '69098', '70889', '7'), +('14', '66', '14', '69155', '46388', '7'), +('14', '66', '14', '69159', '46155', '7'), +('14', '66', '14', '69048', '42938', '7'), +('14', '66', '11', '67606', '45160', '7'), +('14', '66', '11', '68952', '42255', '7'), +('14', '66', '11', '68848', '40484', '7'), +('14', '66', '11', '69055', '38076', '7'), +('14', '67', '22', '66397', '0', '7'), +('14', '67', '22', '62787', '0', '7'), +('14', '67', '22', '61948', '0', '7'), +('14', '67', '22', '21805', '0', '7'), +('14', '67', '1', '68949', '61437', '7'), +('14', '67', '1', '69166', '53783', '7'), +('14', '67', '1', '52121', '48190', '7'), +('14', '67', '1', '7130', '47531', '7'), +('14', '67', '2', '16158', '42856', '7'), +('14', '67', '2', '46141', '40623', '7'), +('14', '67', '2', '67734', '36769', '7'), +('14', '67', '2', '15929', '32479', '7'), +('14', '67', '3', '69132', '77051', '7'), +('14', '67', '3', '69157', '45916', '7'), +('14', '67', '3', '68783', '43930', '7'), +('14', '67', '3', '69074', '41941', '7'), +('14', '67', '5', '7769', '56182', '7'), +('14', '67', '5', '67625', '49525', '7'), +('14', '67', '5', '69135', '46628', '7'), +('14', '67', '5', '16158', '42856', '7'), +('14', '67', '8', '69164', '47582', '7'), +('14', '67', '8', '69064', '43567', '7'), +('14', '67', '8', '69065', '42688', '7'), +('14', '67', '8', '69072', '42514', '7'), +('14', '67', '6', '69066', '71696', '7'), +('14', '67', '6', '68841', '58255', '7'), +('14', '67', '6', '69163', '47182', '7'), +('14', '67', '6', '69073', '41748', '7'), +('14', '67', '17', '68782', '57981', '7'), +('14', '67', '17', '69153', '48460', '7'), +('14', '67', '17', '14747', '41189', '7'), +('14', '67', '17', '47656', '35059', '7'), +('14', '67', '7', '68926', '59960', '7'), +('14', '67', '7', '69176', '45362', '7'), +('14', '67', '7', '69082', '40698', '7'), +('14', '67', '7', '11578', '39004', '7'), +('14', '67', '9', '69100', '66373', '7'), +('14', '67', '9', '69129', '45848', '7'), +('14', '67', '9', '28665', '42203', '7'), +('14', '67', '9', '68929', '34681', '7'), +('14', '67', '15', '69070', '72049', '7'), +('14', '67', '15', '26993', '56512', '7'), +('14', '67', '15', '68664', '48578', '7'), +('14', '67', '15', '52121', '48190', '7'), +('14', '67', '20', '67625', '49525', '7'), +('14', '67', '20', '69134', '46827', '7'), +('14', '67', '20', '68821', '44256', '7'), +('14', '67', '20', '69386', '43993', '7'), +('14', '67', '12', '26996', '50680', '7'), +('14', '67', '12', '69255', '47636', '7'), +('14', '67', '12', '69086', '46824', '7'), +('14', '67', '12', '68927', '36620', '7'), +('14', '67', '18', '28649', '61786', '7'), +('14', '67', '18', '69149', '54390', '7'), +('14', '67', '18', '68989', '44225', '7'), +('14', '67', '18', '68751', '36350', '7'), +('14', '67', '19', '69251', '47130', '7'), +('14', '67', '19', '69078', '40025', '7'), +('14', '67', '19', '20425', '39945', '7'), +('14', '67', '19', '68928', '36609', '7'), +('14', '67', '13', '69098', '69395', '7'), +('14', '67', '13', '69159', '46162', '7'), +('14', '67', '13', '69125', '43629', '7'), +('14', '67', '13', '69051', '42333', '7'), +('14', '67', '14', '69098', '69395', '7'), +('14', '67', '14', '69155', '46389', '7'), +('14', '67', '14', '69159', '46162', '7'), +('14', '67', '14', '69048', '42941', '7'), +('14', '67', '11', '67606', '45164', '7'), +('14', '67', '11', '68952', '42260', '7'), +('14', '67', '11', '68848', '40488', '7'), +('14', '67', '11', '69055', '38082', '7'), +('14', '68', '22', '66397', '0', '7'), +('14', '68', '22', '62787', '0', '7'), +('14', '68', '22', '61948', '0', '7'), +('14', '68', '22', '21805', '0', '7'), +('14', '68', '1', '68949', '60442', '7'), +('14', '68', '1', '69166', '53487', '7'), +('14', '68', '1', '52121', '47693', '7'), +('14', '68', '1', '7130', '47036', '7'), +('14', '68', '2', '16158', '41961', '7'), +('14', '68', '2', '46141', '40628', '7'), +('14', '68', '2', '67734', '36775', '7'), +('14', '68', '2', '15929', '31732', '7'), +('14', '68', '3', '69132', '75806', '7'), +('14', '68', '3', '69157', '45921', '7'), +('14', '68', '3', '68783', '43434', '7'), +('14', '68', '3', '69074', '41945', '7'), +('14', '68', '5', '7769', '55186', '7'), +('14', '68', '5', '67625', '49530', '7'), +('14', '68', '5', '69135', '46632', '7'), +('14', '68', '5', '69097', '42736', '7'), +('14', '68', '8', '69164', '47588', '7'), +('14', '68', '8', '69064', '43572', '7'), +('14', '68', '8', '69065', '42691', '7'), +('14', '68', '8', '69072', '42519', '7'), +('14', '68', '6', '69066', '70449', '7'), +('14', '68', '6', '68841', '57260', '7'), +('14', '68', '6', '69163', '47188', '7'), +('14', '68', '6', '69073', '41753', '7'), +('14', '68', '17', '68782', '56986', '7'), +('14', '68', '17', '69153', '48466', '7'), +('14', '68', '17', '14747', '40445', '7'), +('14', '68', '17', '47656', '35066', '7'), +('14', '68', '7', '68926', '58816', '7'), +('14', '68', '7', '69176', '45367', '7'), +('14', '68', '7', '69082', '40702', '7'), +('14', '68', '7', '11578', '38259', '7'), +('14', '68', '9', '69100', '65228', '7'), +('14', '68', '9', '69129', '45851', '7'), +('14', '68', '9', '28665', '41707', '7'), +('14', '68', '9', '68929', '34685', '7'), +('14', '68', '15', '69070', '70803', '7'), +('14', '68', '15', '26993', '55262', '7'), +('14', '68', '15', '52121', '47693', '7'), +('14', '68', '15', '68664', '47581', '7'), +('14', '68', '20', '67625', '49530', '7'), +('14', '68', '20', '69134', '46833', '7'), +('14', '68', '20', '68821', '43259', '7'), +('14', '68', '20', '69386', '42996', '7'), +('14', '68', '12', '26996', '49685', '7'), +('14', '68', '12', '69255', '47640', '7'), +('14', '68', '12', '69086', '46529', '7'), +('14', '68', '12', '68927', '36624', '7'), +('14', '68', '18', '28649', '60642', '7'), +('14', '68', '18', '69149', '54146', '7'), +('14', '68', '18', '68989', '43929', '7'), +('14', '68', '18', '68751', '36355', '7'), +('14', '68', '19', '69251', '47136', '7'), +('14', '68', '19', '69078', '40029', '7'), +('14', '68', '19', '20425', '39050', '7'), +('14', '68', '19', '68928', '36614', '7'), +('14', '68', '13', '69098', '67902', '7'), +('14', '68', '13', '69159', '46168', '7'), +('14', '68', '13', '69125', '43635', '7'), +('14', '68', '13', '69051', '42339', '7'), +('14', '68', '14', '69098', '67902', '7'), +('14', '68', '14', '69155', '46389', '7'), +('14', '68', '14', '69159', '46168', '7'), +('14', '68', '14', '69048', '42945', '7'), +('14', '68', '11', '67606', '45169', '7'), +('14', '68', '11', '68952', '42264', '7'), +('14', '68', '11', '68848', '40491', '7'), +('14', '68', '11', '69055', '38087', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '69', '22', '66397', '0', '7'), +('14', '69', '22', '62787', '0', '7'), +('14', '69', '22', '61948', '0', '7'), +('14', '69', '22', '21805', '0', '7'), +('14', '69', '1', '68949', '59448', '7'), +('14', '69', '1', '69166', '53191', '7'), +('14', '69', '1', '52121', '47197', '7'), +('14', '69', '1', '7130', '46542', '7'), +('14', '69', '2', '16158', '41065', '7'), +('14', '69', '2', '46141', '40633', '7'), +('14', '69', '2', '67734', '36780', '7'), +('14', '69', '2', '15929', '30985', '7'), +('14', '69', '3', '69132', '74561', '7'), +('14', '69', '3', '69157', '45925', '7'), +('14', '69', '3', '68783', '42938', '7'), +('14', '69', '3', '69074', '41948', '7'), +('14', '69', '5', '7769', '54190', '7'), +('14', '69', '5', '67625', '49536', '7'), +('14', '69', '5', '69135', '46637', '7'), +('14', '69', '5', '69097', '42741', '7'), +('14', '69', '8', '69164', '47593', '7'), +('14', '69', '8', '69064', '43578', '7'), +('14', '69', '8', '69065', '42693', '7'), +('14', '69', '8', '69072', '42523', '7'), +('14', '69', '6', '69066', '69203', '7'), +('14', '69', '6', '68841', '56264', '7'), +('14', '69', '6', '69163', '47193', '7'), +('14', '69', '6', '69073', '41758', '7'), +('14', '69', '17', '68782', '55992', '7'), +('14', '69', '17', '69153', '48473', '7'), +('14', '69', '17', '14747', '39700', '7'), +('14', '69', '17', '47656', '35072', '7'), +('14', '69', '7', '68926', '57671', '7'), +('14', '69', '7', '69176', '45371', '7'), +('14', '69', '7', '69082', '40705', '7'), +('14', '69', '7', '11578', '37513', '7'), +('14', '69', '9', '69100', '64083', '7'), +('14', '69', '9', '69129', '45855', '7'), +('14', '69', '9', '28665', '41210', '7'), +('14', '69', '9', '68929', '34689', '7'), +('14', '69', '15', '69070', '69557', '7'), +('14', '69', '15', '26993', '54012', '7'), +('14', '69', '15', '52121', '47197', '7'), +('14', '69', '15', '68664', '46585', '7'), +('14', '69', '20', '67625', '49536', '7'), +('14', '69', '20', '69134', '46838', '7'), +('14', '69', '20', '68821', '42262', '7'), +('14', '69', '20', '69386', '42000', '7'), +('14', '69', '12', '26996', '48691', '7'), +('14', '69', '12', '69255', '47644', '7'), +('14', '69', '12', '69086', '46235', '7'), +('14', '69', '12', '68927', '36628', '7'), +('14', '69', '18', '28649', '59498', '7'), +('14', '69', '18', '69149', '53901', '7'), +('14', '69', '18', '68989', '43634', '7'), +('14', '69', '18', '68751', '36360', '7'), +('14', '69', '19', '69251', '47141', '7'), +('14', '69', '19', '69078', '40034', '7'), +('14', '69', '19', '20425', '38154', '7'), +('14', '69', '19', '68928', '36618', '7'), +('14', '69', '13', '69098', '66409', '7'), +('14', '69', '13', '69159', '46175', '7'), +('14', '69', '13', '69125', '43640', '7'), +('14', '69', '13', '69051', '42344', '7'), +('14', '69', '14', '69098', '66409', '7'), +('14', '69', '14', '69155', '46390', '7'), +('14', '69', '14', '69159', '46175', '7'), +('14', '69', '14', '69048', '42948', '7'), +('14', '69', '11', '67606', '45173', '7'), +('14', '69', '11', '68952', '42268', '7'), +('14', '69', '11', '68848', '40494', '7'), +('14', '69', '11', '69055', '38093', '7'), +('14', '70', '22', '21805', '0', '11'), +('14', '70', '22', '61948', '0', '11'), +('14', '70', '22', '21807', '0', '11'), +('14', '70', '22', '12425', '0', '11'), +('14', '70', '1', '39353', '64290', '11'), +('14', '70', '1', '83662', '62617', '11'), +('14', '70', '1', '39329', '60062', '11'), +('14', '70', '1', '39271', '59408', '11'), +('14', '70', '2', '39358', '64393', '11'), +('14', '70', '2', '39285', '58718', '11'), +('14', '70', '2', '83563', '58216', '11'), +('14', '70', '2', '70944', '52668', '11'), +('14', '70', '3', '69132', '73316', '11'), +('14', '70', '3', '39368', '71086', '11'), +('14', '70', '3', '83658', '61785', '11'), +('14', '70', '3', '39312', '61079', '11'), +('14', '70', '5', '70705', '76109', '11'), +('14', '70', '5', '51701', '68399', '11'), +('14', '70', '5', '39340', '64643', '11'), +('14', '70', '5', '39328', '60628', '11'), +('14', '70', '8', '39352', '62561', '11'), +('14', '70', '8', '83659', '62307', '11'), +('14', '70', '8', '39330', '61080', '11'), +('14', '70', '8', '39299', '58925', '11'), +('14', '70', '6', '83660', '100563', '11'), +('14', '70', '6', '47280', '83583', '11'), +('14', '70', '6', '47229', '72292', '11'), +('14', '70', '6', '69066', '67956', '11'), +('14', '70', '17', '83606', '64655', '11'), +('14', '70', '17', '70949', '59317', '11'), +('14', '70', '17', '68782', '54997', '11'), +('14', '70', '17', '70714', '48544', '11'), +('14', '70', '7', '83567', '57866', '11'), +('14', '70', '7', '68926', '56526', '11'), +('14', '70', '7', '70945', '52201', '11'), +('14', '70', '7', '83543', '50297', '11'), +('14', '70', '9', '39336', '64988', '11'), +('14', '70', '9', '69100', '62939', '11'), +('14', '70', '9', '51709', '62759', '11'), +('14', '70', '9', '83655', '62591', '11'), +('14', '70', '15', '39259', '71440', '11'), +('14', '70', '15', '39376', '69935', '11'), +('14', '70', '15', '69070', '68312', '11'), +('14', '70', '15', '83595', '64553', '11'), +('14', '70', '20', '39350', '64605', '11'), +('14', '70', '20', '39322', '61056', '11'), +('14', '70', '20', '83650', '59703', '11'), +('14', '70', '20', '39253', '59499', '11'), +('14', '70', '12', '83571', '57761', '11'), +('14', '70', '12', '83553', '56192', '11'), +('14', '70', '12', '70947', '52518', '11'), +('14', '70', '12', '47215', '47948', '11'), +('14', '70', '18', '83610', '63443', '11'), +('14', '70', '18', '28649', '58353', '11'), +('14', '70', '18', '70950', '55162', '11'), +('14', '70', '18', '69149', '53657', '11'), +('14', '70', '19', '83575', '58560', '11'), +('14', '70', '19', '83497', '54686', '11'), +('14', '70', '19', '39223', '53296', '11'), +('14', '70', '19', '70948', '51568', '11'), +('14', '70', '13', '39295', '66640', '11'), +('14', '70', '13', '69098', '64915', '11'), +('14', '70', '13', '39351', '63701', '11'), +('14', '70', '13', '39324', '60599', '11'), +('14', '70', '14', '39372', '70963', '11'), +('14', '70', '14', '83641', '68326', '11'), +('14', '70', '14', '39295', '66640', '11'), +('14', '70', '14', '69098', '64915', '11'), +('14', '70', '11', '39371', '70904', '11'), +('14', '70', '11', '39320', '68281', '11'), +('14', '70', '11', '83665', '63268', '11'), +('14', '70', '11', '83657', '61724', '11'), +('14', '70', '22', '61948', '0', '10'), +('14', '70', '22', '66397', '0', '10'), +('14', '70', '22', '21805', '0', '10'), +('14', '70', '22', '21807', '0', '10'), +('14', '70', '1', '83662', '62617', '10'), +('14', '70', '1', '83630', '58545', '10'), +('14', '70', '1', '68949', '58454', '10'), +('14', '70', '1', '83594', '57255', '10'), +('14', '70', '2', '83563', '58216', '10'), +('14', '70', '2', '70944', '52668', '10'), +('14', '70', '2', '83505', '48482', '10'), +('14', '70', '2', '47211', '47817', '10'), +('14', '70', '3', '69132', '73316', '10'), +('14', '70', '3', '83658', '61785', '10'), +('14', '70', '3', '83634', '59070', '10'), +('14', '70', '3', '83636', '59015', '10'), +('14', '70', '5', '70705', '76109', '10'), +('14', '70', '5', '83651', '59788', '10'), +('14', '70', '5', '83612', '59071', '10'), +('14', '70', '5', '70984', '57243', '10'), +('14', '70', '8', '83659', '62307', '10'), +('14', '70', '8', '83638', '58347', '10'), +('14', '70', '8', '83589', '58319', '10'), +('14', '70', '8', '83598', '57456', '10'), +('14', '70', '6', '83660', '100563', '10'), +('14', '70', '6', '47280', '83583', '10'), +('14', '70', '6', '47229', '72292', '10'), +('14', '70', '6', '69066', '67956', '10'), +('14', '70', '17', '83606', '64655', '10'), +('14', '70', '17', '70949', '59317', '10'), +('14', '70', '17', '68782', '54997', '10'), +('14', '70', '17', '70714', '48544', '10'), +('14', '70', '7', '83567', '57866', '10'), +('14', '70', '7', '68926', '56526', '10'), +('14', '70', '7', '70945', '52201', '10'), +('14', '70', '7', '83543', '50297', '10'), +('14', '70', '9', '69100', '62939', '10'), +('14', '70', '9', '83655', '62591', '10'), +('14', '70', '9', '70946', '51123', '10'), +('14', '70', '9', '83467', '48490', '10'), +('14', '70', '15', '69070', '68312', '10'), +('14', '70', '15', '83595', '64553', '10'), +('14', '70', '15', '83628', '59590', '10'), +('14', '70', '15', '83629', '58664', '10'), +('14', '70', '20', '83650', '59703', '10'), +('14', '70', '20', '83600', '57215', '10'), +('14', '70', '20', '47282', '54026', '10'), +('14', '70', '20', '47284', '51799', '10'), +('14', '70', '12', '83571', '57761', '10'), +('14', '70', '12', '83553', '56192', '10'), +('14', '70', '12', '70947', '52518', '10'), +('14', '70', '12', '47215', '47948', '10'), +('14', '70', '18', '83610', '63443', '10'), +('14', '70', '18', '28649', '58353', '10'), +('14', '70', '18', '70950', '55162', '10'), +('14', '70', '18', '69149', '53657', '10'), +('14', '70', '19', '83575', '58560', '10'), +('14', '70', '19', '83497', '54686', '10'), +('14', '70', '19', '70948', '51568', '10'), +('14', '70', '19', '47219', '47839', '10'), +('14', '70', '13', '69098', '64915', '10'), +('14', '70', '13', '52962', '57631', '10'), +('14', '70', '13', '83632', '57453', '10'), +('14', '70', '13', '71671', '56787', '10'), +('14', '70', '14', '83641', '68326', '10'), +('14', '70', '14', '69098', '64915', '10'), +('14', '70', '14', '83656', '63540', '10'), +('14', '70', '14', '39315', '61131', '10'), +('14', '70', '11', '83665', '63268', '10'), +('14', '70', '11', '83657', '61724', '10'), +('14', '70', '11', '83642', '58942', '10'), +('14', '70', '11', '47298', '51333', '10'), +('14', '70', '22', '66397', '0', '9'), +('14', '70', '22', '62787', '0', '9'), +('14', '70', '22', '61948', '0', '9'), +('14', '70', '22', '21805', '0', '9'), +('14', '70', '1', '68949', '58454', '9'), +('14', '70', '1', '71668', '55927', '9'), +('14', '70', '1', '47288', '54955', '9'), +('14', '70', '1', '69166', '52895', '9'), +('14', '70', '2', '70944', '52668', '9'), +('14', '70', '2', '47211', '47817', '9'), +('14', '70', '2', '70724', '46621', '9'), +('14', '70', '2', '46141', '40637', '9'), +('14', '70', '3', '69132', '73316', '9'), +('14', '70', '3', '47299', '58592', '9'), +('14', '70', '3', '47302', '51641', '9'), +('14', '70', '3', '71655', '50437', '9'), +('14', '70', '5', '70705', '76109', '9'), +('14', '70', '5', '70984', '57243', '9'), +('14', '70', '5', '47276', '53363', '9'), +('14', '70', '5', '7769', '53194', '9'), +('14', '70', '8', '71665', '56886', '9'), +('14', '70', '8', '47306', '54531', '9'), +('14', '70', '8', '47304', '50730', '9'), +('14', '70', '8', '69164', '47598', '9'), +('14', '70', '6', '47280', '83583', '9'), +('14', '70', '6', '47229', '72292', '9'), +('14', '70', '6', '69066', '67956', '9'), +('14', '70', '6', '68841', '55269', '9'), +('14', '70', '17', '70949', '59317', '9'), +('14', '70', '17', '68782', '54997', '9'), +('14', '70', '17', '70714', '48544', '9'), +('14', '70', '17', '69153', '48480', '9'), +('14', '70', '7', '68926', '56526', '9'), +('14', '70', '7', '70945', '52201', '9'), +('14', '70', '7', '47207', '48472', '9'), +('14', '70', '7', '69176', '45376', '9'), +('14', '70', '9', '69100', '62939', '9'), +('14', '70', '9', '70946', '51123', '9'), +('14', '70', '9', '47223', '47661', '9'), +('14', '70', '9', '69129', '45859', '9'), +('14', '70', '15', '69070', '68312', '9'), +('14', '70', '15', '47290', '54401', '9'), +('14', '70', '15', '26993', '52762', '9'), +('14', '70', '15', '47291', '52418', '9'), +('14', '70', '20', '47282', '54026', '9'), +('14', '70', '20', '47284', '51799', '9'), +('14', '70', '20', '47281', '51544', '9'), +('14', '70', '20', '67625', '49541', '9'), +('14', '70', '12', '70947', '52518', '9'), +('14', '70', '12', '47215', '47948', '9'), +('14', '70', '12', '26996', '47696', '9'), +('14', '70', '12', '69255', '47648', '9'), +('14', '70', '18', '28649', '58353', '9'), +('14', '70', '18', '70950', '55162', '9'), +('14', '70', '18', '69149', '53657', '9'), +('14', '70', '18', '71649', '51112', '9'), +('14', '70', '19', '70948', '51568', '9'), +('14', '70', '19', '47219', '47839', '9'), +('14', '70', '19', '69251', '47146', '9'), +('14', '70', '19', '69078', '40039', '9'), +('14', '70', '13', '69098', '64915', '9'), +('14', '70', '13', '52962', '57631', '9'), +('14', '70', '13', '71671', '56787', '9'), +('14', '70', '13', '47308', '52255', '9'), +('14', '70', '14', '69098', '64915', '9'), +('14', '70', '14', '39315', '61131', '9'), +('14', '70', '14', '71661', '56840', '9'), +('14', '70', '14', '71671', '56787', '9'), +('14', '70', '11', '47298', '51333', '9'), +('14', '70', '11', '47296', '50827', '9'), +('14', '70', '11', '71659', '50447', '9'), +('14', '70', '11', '71627', '49664', '9'), +('14', '70', '22', '66397', '0', '8'), +('14', '70', '22', '62787', '0', '8'), +('14', '70', '22', '61948', '0', '8'), +('14', '70', '22', '21805', '0', '8'), +('14', '70', '1', '68949', '58454', '8'), +('14', '70', '1', '47288', '54955', '8'), +('14', '70', '1', '69166', '52895', '8'), +('14', '70', '1', '47234', '51996', '8'), +('14', '70', '2', '70944', '52668', '8'), +('14', '70', '2', '47211', '47817', '8'), +('14', '70', '2', '70724', '46621', '8'), +('14', '70', '2', '46141', '40637', '8'), +('14', '70', '3', '69132', '73316', '8'), +('14', '70', '3', '47299', '58592', '8'), +('14', '70', '3', '47302', '51641', '8'), +('14', '70', '3', '56017', '48952', '8'), +('14', '70', '5', '70705', '76109', '8'), +('14', '70', '5', '47276', '53363', '8'), +('14', '70', '5', '7769', '53194', '8'), +('14', '70', '5', '67625', '49541', '8'), +('14', '70', '8', '47306', '54531', '8'), +('14', '70', '8', '47304', '50730', '8'), +('14', '70', '8', '69164', '47598', '8'), +('14', '70', '8', '47247', '46791', '8'), +('14', '70', '6', '47280', '83583', '8'), +('14', '70', '6', '47229', '72292', '8'), +('14', '70', '6', '69066', '67956', '8'), +('14', '70', '6', '68841', '55269', '8'), +('14', '70', '17', '70949', '59317', '8'), +('14', '70', '17', '68782', '54997', '8'), +('14', '70', '17', '70714', '48544', '8'), +('14', '70', '17', '69153', '48480', '8'), +('14', '70', '7', '68926', '56526', '8'), +('14', '70', '7', '70945', '52201', '8'), +('14', '70', '7', '47207', '48472', '8'), +('14', '70', '7', '69176', '45376', '8'), +('14', '70', '9', '69100', '62939', '8'), +('14', '70', '9', '70946', '51123', '8'), +('14', '70', '9', '47223', '47661', '8'), +('14', '70', '9', '69129', '45859', '8'), +('14', '70', '15', '69070', '68312', '8'), +('14', '70', '15', '47290', '54401', '8'), +('14', '70', '15', '26993', '52762', '8'), +('14', '70', '15', '47291', '52418', '8'), +('14', '70', '20', '47282', '54026', '8'), +('14', '70', '20', '47284', '51799', '8'), +('14', '70', '20', '47281', '51544', '8'), +('14', '70', '20', '67625', '49541', '8'), +('14', '70', '12', '70947', '52518', '8'), +('14', '70', '12', '47215', '47948', '8'), +('14', '70', '12', '26996', '47696', '8'), +('14', '70', '12', '69255', '47648', '8'), +('14', '70', '18', '28649', '58353', '8'), +('14', '70', '18', '70950', '55162', '8'), +('14', '70', '18', '69149', '53657', '8'), +('14', '70', '18', '47203', '48640', '8'), +('14', '70', '19', '70948', '51568', '8'), +('14', '70', '19', '47219', '47839', '8'), +('14', '70', '19', '69251', '47146', '8'), +('14', '70', '19', '69078', '40039', '8'), +('14', '70', '13', '69098', '64915', '8'), +('14', '70', '13', '52962', '57631', '8'), +('14', '70', '13', '47308', '52255', '8'), +('14', '70', '13', '47307', '51399', '8'), +('14', '70', '14', '69098', '64915', '8'), +('14', '70', '14', '39315', '61131', '8'), +('14', '70', '14', '47308', '52255', '8'), +('14', '70', '14', '47311', '52189', '8'), +('14', '70', '11', '47298', '51333', '8'), +('14', '70', '11', '47296', '50827', '8'), +('14', '70', '11', '47241', '47681', '8'), +('14', '70', '11', '70706', '47629', '8'), +('14', '71', '22', '21805', '0', '11'), +('14', '71', '22', '61948', '0', '11'), +('14', '71', '22', '21807', '0', '11'), +('14', '71', '22', '12425', '0', '11'), +('14', '71', '1', '39353', '64298', '11'), +('14', '71', '1', '83662', '62624', '11'), +('14', '71', '1', '39329', '60067', '11'), +('14', '71', '1', '39271', '59413', '11'), +('14', '71', '2', '39358', '64399', '11'), +('14', '71', '2', '39285', '58724', '11'), +('14', '71', '2', '83563', '58225', '11'), +('14', '71', '2', '70944', '52668', '11'), +('14', '71', '3', '69132', '72071', '11'), +('14', '71', '3', '39368', '71093', '11'), +('14', '71', '3', '83658', '61790', '11'), +('14', '71', '3', '39312', '61086', '11'), +('14', '71', '5', '70705', '74615', '11'), +('14', '71', '5', '51701', '68055', '11'), +('14', '71', '5', '39340', '64650', '11'), +('14', '71', '5', '39328', '60634', '11'), +('14', '71', '8', '39352', '62561', '11'), +('14', '71', '8', '83659', '62308', '11'), +('14', '71', '8', '39330', '61086', '11'), +('14', '71', '8', '39299', '58930', '11'), +('14', '71', '6', '83660', '98814', '11'), +('14', '71', '6', '47280', '82088', '11'), +('14', '71', '6', '47229', '71047', '11'), +('14', '71', '6', '69066', '66710', '11'), +('14', '71', '17', '83606', '64663', '11'), +('14', '71', '17', '70949', '59322', '11'), +('14', '71', '17', '68782', '54002', '11'), +('14', '71', '17', '70714', '48552', '11'), +('14', '71', '7', '83567', '57874', '11'), +('14', '71', '7', '68926', '55381', '11'), +('14', '71', '7', '70945', '52210', '11'), +('14', '71', '7', '83543', '50303', '11'), +('14', '71', '9', '39336', '64995', '11'), +('14', '71', '9', '51709', '62764', '11'), +('14', '71', '9', '83655', '62596', '11'), +('14', '71', '9', '69100', '61794', '11'), +('14', '71', '15', '39259', '70195', '11'), +('14', '71', '15', '39376', '69943', '11'), +('14', '71', '15', '69070', '67066', '11'), +('14', '71', '15', '83595', '64209', '11'), +('14', '71', '20', '39350', '64610', '11'), +('14', '71', '20', '39322', '61061', '11'), +('14', '71', '20', '83650', '59708', '11'), +('14', '71', '20', '39253', '59504', '11'), +('14', '71', '12', '83571', '57769', '11'), +('14', '71', '12', '83553', '55897', '11'), +('14', '71', '12', '70947', '52468', '11'), +('14', '71', '12', '47215', '47953', '11'), +('14', '71', '18', '83610', '63450', '11'), +('14', '71', '18', '28649', '57209', '11'), +('14', '71', '18', '70950', '55167', '11'), +('14', '71', '18', '69149', '53412', '11'), +('14', '71', '19', '83575', '58569', '11'), +('14', '71', '19', '83497', '54391', '11'), +('14', '71', '19', '39223', '53301', '11'), +('14', '71', '19', '70948', '51568', '11'), +('14', '71', '13', '39295', '66295', '11'), +('14', '71', '13', '39351', '63707', '11'), +('14', '71', '13', '69098', '63422', '11'), +('14', '71', '13', '39324', '60607', '11'), +('14', '71', '14', '39372', '70970', '11'), +('14', '71', '14', '83641', '67982', '11'), +('14', '71', '14', '39295', '66295', '11'), +('14', '71', '14', '39351', '63707', '11'), +('14', '71', '11', '39371', '70908', '11'), +('14', '71', '11', '39320', '67938', '11'), +('14', '71', '11', '83665', '63276', '11'), +('14', '71', '11', '83657', '61729', '11'), +('14', '72', '22', '21805', '0', '11'), +('14', '72', '22', '61948', '0', '11'), +('14', '72', '22', '21807', '0', '11'), +('14', '72', '22', '12425', '0', '11'), +('14', '72', '1', '39353', '64305', '11'), +('14', '72', '1', '83662', '62631', '11'), +('14', '72', '1', '39329', '60072', '11'), +('14', '72', '1', '39271', '59419', '11'), +('14', '72', '2', '39358', '64404', '11'), +('14', '72', '2', '39285', '58730', '11'), +('14', '72', '2', '83563', '58233', '11'), +('14', '72', '2', '70944', '52669', '11'), +('14', '72', '3', '39368', '71101', '11'), +('14', '72', '3', '69132', '70826', '11'), +('14', '72', '3', '83658', '61795', '11'), +('14', '72', '3', '39312', '61092', '11'), +('14', '72', '5', '70705', '73120', '11'), +('14', '72', '5', '51701', '67710', '11'), +('14', '72', '5', '39340', '64658', '11'), +('14', '72', '5', '39328', '60640', '11'), +('14', '72', '8', '39352', '62562', '11'), +('14', '72', '8', '83659', '62309', '11'), +('14', '72', '8', '39330', '61092', '11'), +('14', '72', '8', '39299', '58934', '11'), +('14', '72', '6', '83660', '97065', '11'), +('14', '72', '6', '47280', '80592', '11'), +('14', '72', '6', '47229', '69802', '11'), +('14', '72', '6', '69066', '65463', '11'), +('14', '72', '17', '83606', '64671', '11'), +('14', '72', '17', '70949', '59328', '11'), +('14', '72', '17', '68782', '53008', '11'), +('14', '72', '17', '70714', '48560', '11'), +('14', '72', '7', '83567', '57883', '11'), +('14', '72', '7', '68926', '54237', '11'), +('14', '72', '7', '70945', '52218', '11'), +('14', '72', '7', '83543', '50308', '11'), +('14', '72', '9', '39336', '65003', '11'), +('14', '72', '9', '51709', '62770', '11'), +('14', '72', '9', '83655', '62602', '11'), +('14', '72', '9', '69100', '60649', '11'), +('14', '72', '15', '39376', '69950', '11'), +('14', '72', '15', '39259', '68949', '11'), +('14', '72', '15', '69070', '65820', '11'), +('14', '72', '15', '83595', '63864', '11'), +('14', '72', '20', '39350', '64615', '11'), +('14', '72', '20', '39322', '61066', '11'), +('14', '72', '20', '83650', '59714', '11'), +('14', '72', '20', '39253', '59510', '11'), +('14', '72', '12', '83571', '57778', '11'), +('14', '72', '12', '83553', '55602', '11'), +('14', '72', '12', '70947', '52419', '11'), +('14', '72', '12', '47215', '47958', '11'), +('14', '72', '18', '83610', '63458', '11'), +('14', '72', '18', '28649', '56064', '11'), +('14', '72', '18', '70950', '55173', '11'), +('14', '72', '18', '69149', '53168', '11'), +('14', '72', '19', '83575', '58577', '11'), +('14', '72', '19', '83497', '54097', '11'), +('14', '72', '19', '39223', '53307', '11'), +('14', '72', '19', '70948', '51568', '11'), +('14', '72', '13', '39295', '65951', '11'), +('14', '72', '13', '39351', '63712', '11'), +('14', '72', '13', '69098', '61928', '11'), +('14', '72', '13', '39324', '60615', '11'), +('14', '72', '14', '39372', '70977', '11'), +('14', '72', '14', '83641', '67639', '11'), +('14', '72', '14', '39295', '65951', '11'), +('14', '72', '14', '39351', '63712', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '72', '11', '39371', '70913', '11'), +('14', '72', '11', '39320', '67595', '11'), +('14', '72', '11', '83665', '63284', '11'), +('14', '72', '11', '83657', '61735', '11'), +('14', '73', '22', '21805', '0', '11'), +('14', '73', '22', '61948', '0', '11'), +('14', '73', '22', '21807', '0', '11'), +('14', '73', '22', '12425', '0', '11'), +('14', '73', '1', '39353', '64313', '11'), +('14', '73', '1', '83662', '62638', '11'), +('14', '73', '1', '39329', '60077', '11'), +('14', '73', '1', '39271', '59425', '11'), +('14', '73', '2', '39358', '64410', '11'), +('14', '73', '2', '39285', '58735', '11'), +('14', '73', '2', '83563', '58242', '11'), +('14', '73', '2', '70944', '52670', '11'), +('14', '73', '3', '39368', '71108', '11'), +('14', '73', '3', '69132', '69581', '11'), +('14', '73', '3', '83658', '61800', '11'), +('14', '73', '3', '39312', '61099', '11'), +('14', '73', '5', '70705', '71626', '11'), +('14', '73', '5', '51701', '67366', '11'), +('14', '73', '5', '39340', '64665', '11'), +('14', '73', '5', '39328', '60646', '11'), +('14', '73', '8', '39352', '62562', '11'), +('14', '73', '8', '83659', '62309', '11'), +('14', '73', '8', '39330', '61098', '11'), +('14', '73', '8', '39299', '58939', '11'), +('14', '73', '6', '83660', '95316', '11'), +('14', '73', '6', '47280', '79097', '11'), +('14', '73', '6', '47229', '68557', '11'), +('14', '73', '6', '39362', '64764', '11'), +('14', '73', '17', '83606', '64678', '11'), +('14', '73', '17', '70949', '59334', '11'), +('14', '73', '17', '68782', '52013', '11'), +('14', '73', '17', '70714', '48567', '11'), +('14', '73', '7', '83567', '57891', '11'), +('14', '73', '7', '68926', '53092', '11'), +('14', '73', '7', '70945', '52227', '11'), +('14', '73', '7', '83543', '50314', '11'), +('14', '73', '9', '39336', '65010', '11'), +('14', '73', '9', '51709', '62776', '11'), +('14', '73', '9', '83655', '62607', '11'), +('14', '73', '9', '69100', '59505', '11'), +('14', '73', '15', '39376', '69958', '11'), +('14', '73', '15', '39259', '67704', '11'), +('14', '73', '15', '69070', '64575', '11'), +('14', '73', '15', '83595', '63520', '11'), +('14', '73', '20', '39350', '64621', '11'), +('14', '73', '20', '39322', '61071', '11'), +('14', '73', '20', '83650', '59719', '11'), +('14', '73', '20', '39253', '59515', '11'), +('14', '73', '12', '83571', '57786', '11'), +('14', '73', '12', '83553', '55308', '11'), +('14', '73', '12', '70947', '52370', '11'), +('14', '73', '12', '47215', '47964', '11'), +('14', '73', '18', '83610', '63466', '11'), +('14', '73', '18', '70950', '55178', '11'), +('14', '73', '18', '28649', '54920', '11'), +('14', '73', '18', '69149', '52924', '11'), +('14', '73', '19', '83575', '58586', '11'), +('14', '73', '19', '83497', '53802', '11'), +('14', '73', '19', '39223', '53312', '11'), +('14', '73', '19', '70948', '51568', '11'), +('14', '73', '13', '39295', '65606', '11'), +('14', '73', '13', '39351', '63718', '11'), +('14', '73', '13', '39324', '60622', '11'), +('14', '73', '13', '69098', '60435', '11'), +('14', '73', '14', '39372', '70984', '11'), +('14', '73', '14', '83641', '67295', '11'), +('14', '73', '14', '39295', '65606', '11'), +('14', '73', '14', '39351', '63718', '11'), +('14', '73', '11', '39371', '70918', '11'), +('14', '73', '11', '39320', '67251', '11'), +('14', '73', '11', '83665', '63292', '11'), +('14', '73', '11', '83657', '61741', '11'), +('14', '74', '22', '21805', '0', '11'), +('14', '74', '22', '61948', '0', '11'), +('14', '74', '22', '21807', '0', '11'), +('14', '74', '22', '12425', '0', '11'), +('14', '74', '1', '39353', '64320', '11'), +('14', '74', '1', '83662', '62645', '11'), +('14', '74', '1', '39329', '60082', '11'), +('14', '74', '1', '39271', '59430', '11'), +('14', '74', '2', '39358', '64415', '11'), +('14', '74', '2', '39285', '58741', '11'), +('14', '74', '2', '83563', '58251', '11'), +('14', '74', '2', '70944', '52670', '11'), +('14', '74', '3', '39368', '71116', '11'), +('14', '74', '3', '69132', '68336', '11'), +('14', '74', '3', '83658', '61805', '11'), +('14', '74', '3', '39312', '61106', '11'), +('14', '74', '5', '70705', '70131', '11'), +('14', '74', '5', '51701', '67021', '11'), +('14', '74', '5', '39340', '64673', '11'), +('14', '74', '5', '39328', '60652', '11'), +('14', '74', '8', '39352', '62563', '11'), +('14', '74', '8', '83659', '62310', '11'), +('14', '74', '8', '39330', '61104', '11'), +('14', '74', '8', '39299', '58943', '11'), +('14', '74', '6', '83660', '93567', '11'), +('14', '74', '6', '47280', '77601', '11'), +('14', '74', '6', '47229', '67312', '11'), +('14', '74', '6', '39362', '64771', '11'), +('14', '74', '17', '83606', '64686', '11'), +('14', '74', '17', '70949', '59340', '11'), +('14', '74', '17', '68782', '51019', '11'), +('14', '74', '17', '70714', '48575', '11'), +('14', '74', '7', '83567', '57900', '11'), +('14', '74', '7', '70945', '52235', '11'), +('14', '74', '7', '68926', '51947', '11'), +('14', '74', '7', '83543', '50319', '11'), +('14', '74', '9', '39336', '65018', '11'), +('14', '74', '9', '51709', '62781', '11'), +('14', '74', '9', '83655', '62613', '11'), +('14', '74', '9', '39297', '58732', '11'), +('14', '74', '15', '39376', '69965', '11'), +('14', '74', '15', '39259', '66459', '11'), +('14', '74', '15', '69070', '63329', '11'), +('14', '74', '15', '83595', '63176', '11'), +('14', '74', '20', '39350', '64626', '11'), +('14', '74', '20', '39322', '61076', '11'), +('14', '74', '20', '83650', '59725', '11'), +('14', '74', '20', '39253', '59521', '11'), +('14', '74', '12', '83571', '57795', '11'), +('14', '74', '12', '83553', '55013', '11'), +('14', '74', '12', '70947', '52320', '11'), +('14', '74', '12', '47215', '47969', '11'), +('14', '74', '18', '83610', '63473', '11'), +('14', '74', '18', '70950', '55184', '11'), +('14', '74', '18', '28649', '53776', '11'), +('14', '74', '18', '69149', '52679', '11'), +('14', '74', '19', '83575', '58595', '11'), +('14', '74', '19', '83497', '53507', '11'), +('14', '74', '19', '39223', '53318', '11'), +('14', '74', '19', '70948', '51568', '11'), +('14', '74', '13', '39295', '65262', '11'), +('14', '74', '13', '39351', '63723', '11'), +('14', '74', '13', '39324', '60630', '11'), +('14', '74', '13', '69098', '58942', '11'), +('14', '74', '14', '39372', '70991', '11'), +('14', '74', '14', '83641', '66952', '11'), +('14', '74', '14', '39295', '65262', '11'), +('14', '74', '14', '39351', '63723', '11'), +('14', '74', '11', '39371', '70922', '11'), +('14', '74', '11', '39320', '66908', '11'), +('14', '74', '11', '83665', '63300', '11'), +('14', '74', '11', '83657', '61747', '11'), +('14', '75', '22', '21807', '0', '13'), +('14', '75', '22', '21805', '0', '13'), +('14', '75', '22', '12425', '0', '13'), +('14', '75', '22', '39342', '0', '13'), +('14', '75', '1', '80676', '98606', '13'), +('14', '75', '1', '80639', '89901', '13'), +('14', '75', '1', '80628', '86025', '13'), +('14', '75', '1', '46882', '85782', '13'), +('14', '75', '2', '53452', '77188', '13'), +('14', '75', '2', '39358', '64421', '13'), +('14', '75', '2', '39285', '58747', '13'), +('14', '75', '2', '83563', '58259', '13'), +('14', '75', '3', '80647', '90202', '13'), +('14', '75', '3', '46874', '79246', '13'), +('14', '75', '3', '46852', '72043', '13'), +('14', '75', '3', '46902', '71335', '13'), +('14', '75', '5', '80661', '95275', '13'), +('14', '75', '5', '80615', '86271', '13'), +('14', '75', '5', '46934', '85668', '13'), +('14', '75', '5', '46868', '79351', '13'), +('14', '75', '8', '80679', '98432', '13'), +('14', '75', '8', '80649', '89952', '13'), +('14', '75', '8', '46936', '85630', '13'), +('14', '75', '8', '46847', '72142', '13'), +('14', '75', '6', '83660', '91817', '13'), +('14', '75', '6', '80646', '89322', '13'), +('14', '75', '6', '46883', '85667', '13'), +('14', '75', '6', '46933', '85534', '13'), +('14', '75', '17', '53457', '79485', '13'), +('14', '75', '17', '83606', '64693', '13'), +('14', '75', '17', '70949', '59345', '13'), +('14', '75', '17', '68782', '50024', '13'), +('14', '75', '7', '53453', '76817', '13'), +('14', '75', '7', '83567', '57909', '13'), +('14', '75', '7', '70945', '52244', '13'), +('14', '75', '7', '68926', '50802', '13'), +('14', '75', '9', '46938', '86012', '13'), +('14', '75', '9', '53454', '76679', '13'), +('14', '75', '9', '39336', '65025', '13'), +('14', '75', '9', '51709', '62787', '13'), +('14', '75', '15', '79909', '102272', '13'), +('14', '75', '15', '80666', '98730', '13'), +('14', '75', '15', '80686', '98568', '13'), +('14', '75', '15', '79908', '93587', '13'), +('14', '75', '20', '80680', '98822', '13'), +('14', '75', '20', '46886', '85725', '13'), +('14', '75', '20', '80620', '85029', '13'), +('14', '75', '20', '46911', '79493', '13'), +('14', '75', '12', '53455', '76768', '13'), +('14', '75', '12', '83571', '57804', '13'), +('14', '75', '12', '83553', '54719', '13'), +('14', '75', '12', '70947', '52271', '13'), +('14', '75', '18', '53458', '78947', '13'), +('14', '75', '18', '46810', '63820', '13'), +('14', '75', '18', '83610', '63481', '13'), +('14', '75', '18', '70950', '55190', '13'), +('14', '75', '19', '53456', '76865', '13'), +('14', '75', '19', '83575', '58603', '13'), +('14', '75', '19', '39223', '53323', '13'), +('14', '75', '19', '83497', '53213', '13'), +('14', '75', '13', '80633', '89592', '13'), +('14', '75', '13', '80624', '83291', '13'), +('14', '75', '13', '46906', '69470', '13'), +('14', '75', '13', '39295', '64917', '13'), +('14', '75', '14', '80665', '92427', '13'), +('14', '75', '14', '80635', '88265', '13'), +('14', '75', '14', '80625', '84621', '13'), +('14', '75', '14', '46925', '79162', '13'), +('14', '75', '11', '80668', '98667', '13'), +('14', '75', '11', '46939', '86051', '13'), +('14', '75', '11', '80629', '85716', '13'), +('14', '75', '11', '46889', '84960', '13'), +('14', '75', '22', '21807', '0', '12'), +('14', '75', '22', '21805', '0', '12'), +('14', '75', '22', '12425', '0', '12'), +('14', '75', '22', '39342', '0', '12'), +('14', '75', '1', '46882', '85782', '12'), +('14', '75', '1', '46914', '78952', '12'), +('14', '75', '1', '46844', '71931', '12'), +('14', '75', '1', '46894', '71490', '12'), +('14', '75', '2', '53452', '77188', '12'), +('14', '75', '2', '39358', '64421', '12'), +('14', '75', '2', '39285', '58747', '12'), +('14', '75', '2', '83563', '58259', '12'), +('14', '75', '3', '46874', '79246', '12'), +('14', '75', '3', '46852', '72043', '12'), +('14', '75', '3', '46902', '71335', '12'), +('14', '75', '3', '39368', '71123', '12'), +('14', '75', '5', '46934', '85668', '12'), +('14', '75', '5', '46868', '79351', '12'), +('14', '75', '5', '70705', '68637', '12'), +('14', '75', '5', '51701', '66677', '12'), +('14', '75', '8', '46936', '85630', '12'), +('14', '75', '8', '46847', '72142', '12'), +('14', '75', '8', '39352', '62564', '12'), +('14', '75', '8', '83659', '62311', '12'), +('14', '75', '6', '83660', '91817', '12'), +('14', '75', '6', '46883', '85667', '12'), +('14', '75', '6', '46933', '85534', '12'), +('14', '75', '6', '46884', '85093', '12'), +('14', '75', '17', '53457', '79485', '12'), +('14', '75', '17', '83606', '64693', '12'), +('14', '75', '17', '70949', '59345', '12'), +('14', '75', '17', '68782', '50024', '12'), +('14', '75', '7', '53453', '76817', '12'), +('14', '75', '7', '83567', '57909', '12'), +('14', '75', '7', '70945', '52244', '12'), +('14', '75', '7', '68926', '50802', '12'), +('14', '75', '9', '46938', '86012', '12'), +('14', '75', '9', '53454', '76679', '12'), +('14', '75', '9', '39336', '65025', '12'), +('14', '75', '9', '51709', '62787', '12'), +('14', '75', '15', '46932', '85873', '12'), +('14', '75', '15', '46864', '79556', '12'), +('14', '75', '15', '46843', '72383', '12'), +('14', '75', '15', '46893', '71538', '12'), +('14', '75', '20', '46886', '85725', '12'), +('14', '75', '20', '46911', '79493', '12'), +('14', '75', '20', '46920', '79025', '12'), +('14', '75', '20', '39350', '64632', '12'), +('14', '75', '12', '53455', '76768', '12'), +('14', '75', '12', '83571', '57804', '12'), +('14', '75', '12', '83553', '54719', '12'), +('14', '75', '12', '70947', '52271', '12'), +('14', '75', '18', '53458', '78947', '12'), +('14', '75', '18', '46810', '63820', '12'), +('14', '75', '18', '83610', '63481', '12'), +('14', '75', '18', '70950', '55190', '12'), +('14', '75', '19', '53456', '76865', '12'), +('14', '75', '19', '83575', '58603', '12'), +('14', '75', '19', '39223', '53323', '12'), +('14', '75', '19', '83497', '53213', '12'), +('14', '75', '13', '46906', '69470', '12'), +('14', '75', '13', '39295', '64917', '12'), +('14', '75', '13', '39351', '63729', '12'), +('14', '75', '13', '39324', '60638', '12'), +('14', '75', '14', '46925', '79162', '12'), +('14', '75', '14', '46875', '78439', '12'), +('14', '75', '14', '46903', '72399', '12'), +('14', '75', '14', '39372', '70998', '12'), +('14', '75', '11', '46939', '86051', '12'), +('14', '75', '11', '46889', '84960', '12'), +('14', '75', '11', '39371', '70927', '12'), +('14', '75', '11', '46880', '68304', '12'), +('14', '76', '22', '21807', '0', '13'), +('14', '76', '22', '21805', '0', '13'), +('14', '76', '22', '12425', '0', '13'), +('14', '76', '22', '39342', '0', '13'), +('14', '76', '1', '80676', '98613', '13'), +('14', '76', '1', '80639', '89908', '13'), +('14', '76', '1', '80628', '86031', '13'), +('14', '76', '1', '46882', '85790', '13'), +('14', '76', '2', '53452', '77195', '13'), +('14', '76', '2', '39358', '64426', '13'), +('14', '76', '2', '39285', '58753', '13'), +('14', '76', '2', '83563', '58268', '13'), +('14', '76', '3', '80647', '90209', '13'), +('14', '76', '3', '46874', '79253', '13'), +('14', '76', '3', '46852', '72050', '13'), +('14', '76', '3', '46902', '71341', '13'), +('14', '76', '5', '80661', '95283', '13'), +('14', '76', '5', '80615', '86277', '13'), +('14', '76', '5', '46934', '85676', '13'), +('14', '76', '5', '46868', '79359', '13'), +('14', '76', '8', '80679', '98433', '13'), +('14', '76', '8', '80649', '89960', '13'), +('14', '76', '8', '46936', '85638', '13'), +('14', '76', '8', '46847', '72148', '13'), +('14', '76', '6', '83660', '90068', '13'), +('14', '76', '6', '80646', '89322', '13'), +('14', '76', '6', '46883', '85675', '13'), +('14', '76', '6', '46933', '85542', '13'), +('14', '76', '17', '53457', '79492', '13'), +('14', '76', '17', '83606', '64701', '13'), +('14', '76', '17', '70949', '59351', '13'), +('14', '76', '17', '68782', '49030', '13'), +('14', '76', '7', '53453', '76823', '13'), +('14', '76', '7', '83567', '57917', '13'), +('14', '76', '7', '70945', '52252', '13'), +('14', '76', '7', '83543', '50330', '13'), +('14', '76', '9', '46938', '86021', '13'), +('14', '76', '9', '53454', '76686', '13'), +('14', '76', '9', '39336', '65033', '13'), +('14', '76', '9', '51709', '62792', '13'), +('14', '76', '15', '79909', '102279', '13'), +('14', '76', '15', '80666', '98731', '13'), +('14', '76', '15', '80686', '98576', '13'), +('14', '76', '15', '79908', '93594', '13'), +('14', '76', '20', '80680', '98830', '13'), +('14', '76', '20', '46886', '85734', '13'), +('14', '76', '20', '80620', '85030', '13'), +('14', '76', '20', '46911', '79501', '13'), +('14', '76', '12', '53455', '76772', '13'), +('14', '76', '12', '83571', '57812', '13'), +('14', '76', '12', '83553', '54424', '13'), +('14', '76', '12', '70947', '52222', '13'), +('14', '76', '18', '53458', '78955', '13'), +('14', '76', '18', '46810', '63825', '13'), +('14', '76', '18', '83610', '63488', '13'), +('14', '76', '18', '70950', '55195', '13'), +('14', '76', '19', '53456', '76866', '13'), +('14', '76', '19', '83575', '58612', '13'), +('14', '76', '19', '39223', '53329', '13'), +('14', '76', '19', '83497', '52918', '13'), +('14', '76', '13', '80633', '89598', '13'), +('14', '76', '13', '80624', '83296', '13'), +('14', '76', '13', '46906', '69478', '13'), +('14', '76', '13', '39295', '64573', '13'), +('14', '76', '14', '80665', '92432', '13'), +('14', '76', '14', '80635', '88270', '13'), +('14', '76', '14', '80625', '84626', '13'), +('14', '76', '14', '46925', '79169', '13'), +('14', '76', '11', '80668', '98675', '13'), +('14', '76', '11', '46939', '86059', '13'), +('14', '76', '11', '80629', '85722', '13'), +('14', '76', '11', '46889', '84968', '13'), +('14', '77', '22', '21807', '0', '13'), +('14', '77', '22', '21805', '0', '13'), +('14', '77', '22', '12425', '0', '13'), +('14', '77', '22', '39342', '0', '13'), +('14', '77', '1', '80676', '98621', '13'), +('14', '77', '1', '80639', '89915', '13'), +('14', '77', '1', '80628', '86038', '13'), +('14', '77', '1', '46882', '85798', '13'), +('14', '77', '2', '53452', '77203', '13'), +('14', '77', '2', '39358', '64432', '13'), +('14', '77', '2', '39285', '58759', '13'), +('14', '77', '2', '83563', '58276', '13'), +('14', '77', '3', '80647', '90217', '13'), +('14', '77', '3', '46874', '79261', '13'), +('14', '77', '3', '46852', '72058', '13'), +('14', '77', '3', '46902', '71347', '13'), +('14', '77', '5', '80661', '95291', '13'), +('14', '77', '5', '80615', '86283', '13'), +('14', '77', '5', '46934', '85684', '13'), +('14', '77', '5', '46868', '79367', '13'), +('14', '77', '8', '80679', '98434', '13'), +('14', '77', '8', '80649', '89967', '13'), +('14', '77', '8', '46936', '85646', '13'), +('14', '77', '8', '46847', '72155', '13'), +('14', '77', '6', '80646', '89323', '13'), +('14', '77', '6', '83660', '88319', '13'), +('14', '77', '6', '46883', '85683', '13'), +('14', '77', '6', '46933', '85550', '13'), +('14', '77', '17', '53457', '79500', '13'), +('14', '77', '17', '83606', '64709', '13'), +('14', '77', '17', '70949', '59357', '13'), +('14', '77', '17', '70714', '48598', '13'), +('14', '77', '7', '53453', '76829', '13'), +('14', '77', '7', '83567', '57926', '13'), +('14', '77', '7', '70945', '52261', '13'), +('14', '77', '7', '83543', '50335', '13'), +('14', '77', '9', '46938', '86030', '13'), +('14', '77', '9', '53454', '76693', '13'), +('14', '77', '9', '39336', '65040', '13'), +('14', '77', '9', '51709', '62798', '13'), +('14', '77', '15', '79909', '102285', '13'), +('14', '77', '15', '80666', '98732', '13'), +('14', '77', '15', '80686', '98584', '13'), +('14', '77', '15', '79908', '93600', '13'), +('14', '77', '20', '80680', '98838', '13'), +('14', '77', '20', '46886', '85743', '13'), +('14', '77', '20', '80620', '85030', '13'), +('14', '77', '20', '46911', '79508', '13'), +('14', '77', '12', '53455', '76776', '13'), +('14', '77', '12', '83571', '57821', '13'), +('14', '77', '12', '83553', '54130', '13'), +('14', '77', '12', '70947', '52173', '13'), +('14', '77', '18', '53458', '78962', '13'), +('14', '77', '18', '46810', '63830', '13'), +('14', '77', '18', '83610', '63496', '13'), +('14', '77', '18', '70950', '55201', '13'), +('14', '77', '19', '53456', '76866', '13'), +('14', '77', '19', '83575', '58620', '13'), +('14', '77', '19', '39223', '53334', '13'), +('14', '77', '19', '83497', '52624', '13'), +('14', '77', '13', '80633', '89603', '13'), +('14', '77', '13', '80624', '83302', '13'), +('14', '77', '13', '46906', '69486', '13'), +('14', '77', '13', '39295', '64228', '13'), +('14', '77', '14', '80665', '92438', '13'), +('14', '77', '14', '80635', '88276', '13'), +('14', '77', '14', '80625', '84632', '13'), +('14', '77', '14', '46925', '79176', '13'), +('14', '77', '11', '80668', '98683', '13'), +('14', '77', '11', '46939', '86067', '13'), +('14', '77', '11', '80629', '85729', '13'), +('14', '77', '11', '46889', '84976', '13'), +('14', '78', '22', '21807', '0', '13'), +('14', '78', '22', '21805', '0', '13'), +('14', '78', '22', '12425', '0', '13'), +('14', '78', '22', '39342', '0', '13'), +('14', '78', '1', '80676', '98628', '13'), +('14', '78', '1', '80639', '89922', '13'), +('14', '78', '1', '80628', '86045', '13'), +('14', '78', '1', '46882', '85806', '13'), +('14', '78', '2', '53452', '77210', '13'), +('14', '78', '2', '39358', '64437', '13'), +('14', '78', '2', '39285', '58764', '13'), +('14', '78', '2', '83563', '58285', '13'), +('14', '78', '3', '80647', '90224', '13'), +('14', '78', '3', '46874', '79269', '13'), +('14', '78', '3', '46852', '72065', '13'), +('14', '78', '3', '46902', '71353', '13'), +('14', '78', '5', '80661', '95298', '13'), +('14', '78', '5', '80615', '86289', '13'), +('14', '78', '5', '46934', '85692', '13'), +('14', '78', '5', '46868', '79375', '13'), +('14', '78', '8', '80679', '98434', '13'), +('14', '78', '8', '80649', '89974', '13'), +('14', '78', '8', '46936', '85654', '13'), +('14', '78', '8', '46847', '72161', '13'), +('14', '78', '6', '80646', '89324', '13'), +('14', '78', '6', '83660', '86570', '13'), +('14', '78', '6', '46883', '85691', '13'), +('14', '78', '6', '46933', '85557', '13'), +('14', '78', '17', '53457', '79507', '13'), +('14', '78', '17', '83606', '64716', '13'), +('14', '78', '17', '70949', '59362', '13'), +('14', '78', '17', '70714', '48605', '13'), +('14', '78', '7', '53453', '76835', '13'), +('14', '78', '7', '83567', '57934', '13'), +('14', '78', '7', '70945', '52269', '13'), +('14', '78', '7', '83543', '50341', '13'), +('14', '78', '9', '46938', '86038', '13'), +('14', '78', '9', '53454', '76700', '13'), +('14', '78', '9', '39336', '65048', '13'), +('14', '78', '9', '51709', '62804', '13'), +('14', '78', '15', '79909', '102292', '13'), +('14', '78', '15', '80666', '98733', '13'), +('14', '78', '15', '80686', '98592', '13'), +('14', '78', '15', '79908', '93606', '13'), +('14', '78', '20', '80680', '98846', '13'), +('14', '78', '20', '46886', '85752', '13'), +('14', '78', '20', '80620', '85031', '13'), +('14', '78', '20', '46911', '79516', '13'), +('14', '78', '12', '53455', '76780', '13'), +('14', '78', '12', '83571', '57829', '13'), +('14', '78', '12', '83553', '53835', '13'), +('14', '78', '12', '70947', '52123', '13'), +('14', '78', '18', '53458', '78970', '13'), +('14', '78', '18', '46810', '63836', '13'), +('14', '78', '18', '83610', '63504', '13'), +('14', '78', '18', '70950', '55206', '13'), +('14', '78', '19', '53456', '76867', '13'), +('14', '78', '19', '83575', '58629', '13'), +('14', '78', '19', '39223', '53340', '13'), +('14', '78', '19', '83497', '52329', '13'), +('14', '78', '13', '80633', '89609', '13'), +('14', '78', '13', '80624', '83308', '13'), +('14', '78', '13', '46906', '69494', '13'), +('14', '78', '13', '39295', '63883', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '78', '14', '80665', '92444', '13'), +('14', '78', '14', '80635', '88282', '13'), +('14', '78', '14', '80625', '84638', '13'), +('14', '78', '14', '46925', '79183', '13'), +('14', '78', '11', '80668', '98691', '13'), +('14', '78', '11', '46939', '86074', '13'), +('14', '78', '11', '80629', '85736', '13'), +('14', '78', '11', '46889', '84984', '13'), +('14', '79', '22', '21807', '0', '13'), +('14', '79', '22', '21805', '0', '13'), +('14', '79', '22', '12425', '0', '13'), +('14', '79', '22', '39342', '0', '13'), +('14', '79', '1', '80676', '98635', '13'), +('14', '79', '1', '80639', '89930', '13'), +('14', '79', '1', '80628', '86052', '13'), +('14', '79', '1', '46882', '85815', '13'), +('14', '79', '2', '53452', '77218', '13'), +('14', '79', '2', '39358', '64443', '13'), +('14', '79', '2', '39285', '58770', '13'), +('14', '79', '2', '83563', '58294', '13'), +('14', '79', '3', '80647', '90231', '13'), +('14', '79', '3', '46874', '79276', '13'), +('14', '79', '3', '46852', '72073', '13'), +('14', '79', '3', '46902', '71359', '13'), +('14', '79', '5', '80661', '95306', '13'), +('14', '79', '5', '80615', '86295', '13'), +('14', '79', '5', '46934', '85700', '13'), +('14', '79', '5', '46868', '79382', '13'), +('14', '79', '8', '80679', '98435', '13'), +('14', '79', '8', '80649', '89981', '13'), +('14', '79', '8', '46936', '85663', '13'), +('14', '79', '8', '46847', '72167', '13'), +('14', '79', '6', '80646', '89325', '13'), +('14', '79', '6', '46883', '85699', '13'), +('14', '79', '6', '46933', '85565', '13'), +('14', '79', '6', '46884', '85121', '13'), +('14', '79', '17', '53457', '79515', '13'), +('14', '79', '17', '83606', '64724', '13'), +('14', '79', '17', '70949', '59368', '13'), +('14', '79', '17', '70714', '48613', '13'), +('14', '79', '7', '53453', '76841', '13'), +('14', '79', '7', '83567', '57943', '13'), +('14', '79', '7', '70945', '52278', '13'), +('14', '79', '7', '83543', '50346', '13'), +('14', '79', '9', '46938', '86047', '13'), +('14', '79', '9', '53454', '76707', '13'), +('14', '79', '9', '39336', '65055', '13'), +('14', '79', '9', '51709', '62809', '13'), +('14', '79', '15', '79909', '102299', '13'), +('14', '79', '15', '80666', '98734', '13'), +('14', '79', '15', '80686', '98601', '13'), +('14', '79', '15', '79908', '93613', '13'), +('14', '79', '20', '80680', '98854', '13'), +('14', '79', '20', '46886', '85760', '13'), +('14', '79', '20', '80620', '85032', '13'), +('14', '79', '20', '46911', '79524', '13'), +('14', '79', '12', '53455', '76784', '13'), +('14', '79', '12', '83571', '57838', '13'), +('14', '79', '12', '83553', '53541', '13'), +('14', '79', '12', '70947', '52074', '13'), +('14', '79', '18', '53458', '78978', '13'), +('14', '79', '18', '46810', '63841', '13'), +('14', '79', '18', '83610', '63511', '13'), +('14', '79', '18', '70950', '55212', '13'), +('14', '79', '19', '53456', '76867', '13'), +('14', '79', '19', '83575', '58638', '13'), +('14', '79', '19', '39223', '53345', '13'), +('14', '79', '19', '83497', '52034', '13'), +('14', '79', '13', '80633', '89615', '13'), +('14', '79', '13', '80624', '83313', '13'), +('14', '79', '13', '46906', '69502', '13'), +('14', '79', '13', '39351', '63751', '13'), +('14', '79', '14', '80665', '92449', '13'), +('14', '79', '14', '80635', '88287', '13'), +('14', '79', '14', '80625', '84643', '13'), +('14', '79', '14', '46925', '79189', '13'), +('14', '79', '11', '80668', '98699', '13'), +('14', '79', '11', '46939', '86082', '13'), +('14', '79', '11', '80629', '85743', '13'), +('14', '79', '11', '46889', '84992', '13'), +('14', '80', '22', '21807', '0', '14'), +('14', '80', '22', '21805', '0', '14'), +('14', '80', '22', '12425', '0', '14'), +('14', '80', '22', '39342', '0', '14'), +('14', '80', '1', '102604', '130101', '14'), +('14', '80', '1', '102639', '128970', '14'), +('14', '80', '1', '102641', '128894', '14'), +('14', '80', '1', '102640', '128534', '14'), +('14', '80', '2', '102024', '87857', '14'), +('14', '80', '2', '102276', '79095', '14'), +('14', '80', '2', '53452', '77226', '14'), +('14', '80', '2', '39358', '64448', '14'), +('14', '80', '3', '102605', '138300', '14'), +('14', '80', '3', '102742', '124266', '14'), +('14', '80', '3', '102560', '119677', '14'), +('14', '80', '3', '102741', '114724', '14'), +('14', '80', '5', '102731', '142572', '14'), +('14', '80', '5', '102606', '135611', '14'), +('14', '80', '5', '102730', '123899', '14'), +('14', '80', '5', '102565', '117865', '14'), +('14', '80', '8', '102728', '141505', '14'), +('14', '80', '8', '102608', '137764', '14'), +('14', '80', '8', '102728', '119519', '14'), +('14', '80', '8', '80679', '98436', '14'), +('14', '80', '6', '102607', '138522', '14'), +('14', '80', '6', '102561', '119611', '14'), +('14', '80', '6', '80646', '89325', '14'), +('14', '80', '6', '102529', '86229', '14'), +('14', '80', '17', '102027', '93139', '14'), +('14', '80', '17', '102279', '84355', '14'), +('14', '80', '17', '53457', '79523', '14'), +('14', '80', '17', '83606', '64731', '14'), +('14', '80', '7', '102025', '88686', '14'), +('14', '80', '7', '102277', '80047', '14'), +('14', '80', '7', '53453', '76847', '14'), +('14', '80', '7', '83567', '57952', '14'), +('14', '80', '9', '67098', '231311', '14'), +('14', '80', '9', '46938', '86055', '14'), +('14', '80', '9', '53454', '76713', '14'), +('14', '80', '9', '102291', '74257', '14'), +('14', '80', '15', '102723', '141203', '14'), +('14', '80', '15', '102609', '132534', '14'), +('14', '80', '15', '102637', '129976', '14'), +('14', '80', '15', '102635', '129566', '14'), +('14', '80', '20', '102610', '138010', '14'), +('14', '80', '20', '102563', '119484', '14'), +('14', '80', '20', '80680', '98862', '14'), +('14', '80', '20', '46886', '85769', '14'), +('14', '80', '12', '53455', '76788', '14'), +('14', '80', '12', '102274', '75868', '14'), +('14', '80', '12', '83571', '57847', '14'), +('14', '80', '12', '83553', '53246', '14'), +('14', '80', '18', '102026', '89656', '14'), +('14', '80', '18', '102278', '80718', '14'), +('14', '80', '18', '53458', '78985', '14'), +('14', '80', '18', '46810', '63846', '14'), +('14', '80', '19', '53456', '76868', '14'), +('14', '80', '19', '102275', '76347', '14'), +('14', '80', '19', '83575', '58646', '14'), +('14', '80', '19', '39223', '53351', '14'), +('14', '80', '13', '102657', '124411', '14'), +('14', '80', '13', '102735', '123073', '14'), +('14', '80', '13', '102734', '113730', '14'), +('14', '80', '13', '102586', '108814', '14'), +('14', '80', '14', '102633', '136300', '14'), +('14', '80', '14', '102632', '136177', '14'), +('14', '80', '14', '102570', '119237', '14'), +('14', '80', '14', '80665', '92455', '14'), +('14', '80', '11', '102643', '132693', '14'), +('14', '80', '11', '80668', '98707', '14'), +('14', '80', '11', '46939', '86090', '14'), +('14', '80', '11', '80629', '85749', '14'), +('14', '81', '22', '21807', '0', '14'), +('14', '81', '22', '21805', '0', '14'), +('14', '81', '22', '12425', '0', '14'), +('14', '81', '22', '39342', '0', '14'), +('14', '81', '1', '102604', '130107', '14'), +('14', '81', '1', '102639', '128978', '14'), +('14', '81', '1', '102641', '128903', '14'), +('14', '81', '1', '102640', '128544', '14'), +('14', '81', '2', '102024', '87864', '14'), +('14', '81', '2', '102276', '79101', '14'), +('14', '81', '2', '53452', '77233', '14'), +('14', '81', '2', '39358', '64454', '14'), +('14', '81', '3', '102605', '138305', '14'), +('14', '81', '3', '102742', '124275', '14'), +('14', '81', '3', '102560', '119683', '14'), +('14', '81', '3', '102741', '114731', '14'), +('14', '81', '5', '102731', '142582', '14'), +('14', '81', '5', '102606', '135614', '14'), +('14', '81', '5', '102730', '123907', '14'), +('14', '81', '5', '102565', '117871', '14'), +('14', '81', '8', '102728', '141513', '14'), +('14', '81', '8', '102608', '137772', '14'), +('14', '81', '8', '102728', '119525', '14'), +('14', '81', '8', '80679', '98437', '14'), +('14', '81', '6', '102607', '138530', '14'), +('14', '81', '6', '102561', '119618', '14'), +('14', '81', '6', '80646', '89326', '14'), +('14', '81', '6', '102529', '86235', '14'), +('14', '81', '17', '102027', '93144', '14'), +('14', '81', '17', '102279', '84361', '14'), +('14', '81', '17', '53457', '79530', '14'), +('14', '81', '17', '83606', '64739', '14'), +('14', '81', '7', '102025', '88694', '14'), +('14', '81', '7', '102277', '80052', '14'), +('14', '81', '7', '53453', '76853', '14'), +('14', '81', '7', '83567', '57960', '14'), +('14', '81', '9', '67098', '234207', '14'), +('14', '81', '9', '46938', '86064', '14'), +('14', '81', '9', '53454', '76720', '14'), +('14', '81', '9', '102291', '74263', '14'), +('14', '81', '15', '102723', '141211', '14'), +('14', '81', '15', '102609', '132542', '14'), +('14', '81', '15', '102637', '129985', '14'), +('14', '81', '15', '102635', '129569', '14'), +('14', '81', '20', '102610', '138019', '14'), +('14', '81', '20', '102563', '119487', '14'), +('14', '81', '20', '80680', '98870', '14'), +('14', '81', '20', '46886', '85778', '14'), +('14', '81', '12', '53455', '76792', '14'), +('14', '81', '12', '102274', '75875', '14'), +('14', '81', '12', '83571', '57855', '14'), +('14', '81', '12', '83553', '52952', '14'), +('14', '81', '18', '102026', '89658', '14'), +('14', '81', '18', '102278', '80727', '14'), +('14', '81', '18', '53458', '78993', '14'), +('14', '81', '18', '46810', '63852', '14'), +('14', '81', '19', '53456', '76869', '14'), +('14', '81', '19', '102275', '76350', '14'), +('14', '81', '19', '83575', '58655', '14'), +('14', '81', '19', '39223', '53356', '14'), +('14', '81', '13', '102657', '124416', '14'), +('14', '81', '13', '102735', '123081', '14'), +('14', '81', '13', '102734', '113736', '14'), +('14', '81', '13', '102586', '108816', '14'), +('14', '81', '14', '102633', '136307', '14'), +('14', '81', '14', '102632', '136184', '14'), +('14', '81', '14', '102570', '119246', '14'), +('14', '81', '14', '80665', '92460', '14'), +('14', '81', '11', '102643', '132698', '14'), +('14', '81', '11', '80668', '98715', '14'), +('14', '81', '11', '46939', '86098', '14'), +('14', '81', '11', '80629', '85756', '14'), +('14', '82', '22', '21807', '0', '14'), +('14', '82', '22', '21805', '0', '14'), +('14', '82', '22', '12425', '0', '14'), +('14', '82', '22', '39342', '0', '14'), +('14', '82', '1', '102604', '130114', '14'), +('14', '82', '1', '102639', '128986', '14'), +('14', '82', '1', '102641', '128913', '14'), +('14', '82', '1', '102640', '128555', '14'), +('14', '82', '2', '102024', '87871', '14'), +('14', '82', '2', '102276', '79107', '14'), +('14', '82', '2', '53452', '77241', '14'), +('14', '82', '2', '39358', '64459', '14'), +('14', '82', '3', '102605', '138309', '14'), +('14', '82', '3', '102742', '124283', '14'), +('14', '82', '3', '102560', '119690', '14'), +('14', '82', '3', '102741', '114739', '14'), +('14', '82', '5', '102731', '142592', '14'), +('14', '82', '5', '102606', '135618', '14'), +('14', '82', '5', '102730', '123914', '14'), +('14', '82', '5', '102565', '117878', '14'), +('14', '82', '8', '102728', '141521', '14'), +('14', '82', '8', '102608', '137780', '14'), +('14', '82', '8', '102728', '119530', '14'), +('14', '82', '8', '80679', '98438', '14'), +('14', '82', '6', '102607', '138538', '14'), +('14', '82', '6', '102561', '119625', '14'), +('14', '82', '6', '80646', '89327', '14'), +('14', '82', '6', '102529', '86242', '14'), +('14', '82', '17', '102027', '93149', '14'), +('14', '82', '17', '102279', '84366', '14'), +('14', '82', '17', '53457', '79538', '14'), +('14', '82', '17', '83606', '64747', '14'), +('14', '82', '7', '102025', '88702', '14'), +('14', '82', '7', '102277', '80057', '14'), +('14', '82', '7', '53453', '76859', '14'), +('14', '82', '7', '83567', '57969', '14'), +('14', '82', '9', '67098', '237102', '14'), +('14', '82', '9', '46938', '86073', '14'), +('14', '82', '9', '53454', '76727', '14'), +('14', '82', '9', '102291', '74268', '14'), +('14', '82', '15', '102723', '141219', '14'), +('14', '82', '15', '102609', '132550', '14'), +('14', '82', '15', '102637', '129995', '14'), +('14', '82', '15', '102635', '129573', '14'), +('14', '82', '20', '102610', '138029', '14'), +('14', '82', '20', '102563', '119490', '14'), +('14', '82', '20', '80680', '98878', '14'), +('14', '82', '20', '46886', '85786', '14'), +('14', '82', '12', '53455', '76796', '14'), +('14', '82', '12', '102274', '75881', '14'), +('14', '82', '12', '83571', '57864', '14'), +('14', '82', '12', '83553', '52657', '14'), +('14', '82', '18', '102026', '89660', '14'), +('14', '82', '18', '102278', '80735', '14'), +('14', '82', '18', '53458', '79001', '14'), +('14', '82', '18', '46810', '63857', '14'), +('14', '82', '19', '53456', '76869', '14'), +('14', '82', '19', '102275', '76352', '14'), +('14', '82', '19', '83575', '58663', '14'), +('14', '82', '19', '39223', '53362', '14'), +('14', '82', '13', '102657', '124420', '14'), +('14', '82', '13', '102735', '123088', '14'), +('14', '82', '13', '102734', '113743', '14'), +('14', '82', '13', '102586', '108819', '14'), +('14', '82', '14', '102633', '136313', '14'), +('14', '82', '14', '102632', '136191', '14'), +('14', '82', '14', '102570', '119255', '14'), +('14', '82', '14', '80665', '92466', '14'), +('14', '82', '11', '102643', '132703', '14'), +('14', '82', '11', '80668', '98724', '14'), +('14', '82', '11', '46939', '86105', '14'), +('14', '82', '11', '80629', '85763', '14'), +('14', '83', '22', '21807', '0', '14'), +('14', '83', '22', '21805', '0', '14'), +('14', '83', '22', '12425', '0', '14'), +('14', '83', '22', '39342', '0', '14'), +('14', '83', '1', '102604', '130121', '14'), +('14', '83', '1', '102639', '128994', '14'), +('14', '83', '1', '102641', '128923', '14'), +('14', '83', '1', '102640', '128565', '14'), +('14', '83', '2', '102024', '87877', '14'), +('14', '83', '2', '102276', '79113', '14'), +('14', '83', '2', '53452', '77248', '14'), +('14', '83', '2', '39358', '64465', '14'), +('14', '83', '3', '102605', '138314', '14'), +('14', '83', '3', '102742', '124292', '14'), +('14', '83', '3', '102560', '119696', '14'), +('14', '83', '3', '102741', '114746', '14'), +('14', '83', '5', '102731', '142602', '14'), +('14', '83', '5', '102606', '135622', '14'), +('14', '83', '5', '102730', '123922', '14'), +('14', '83', '5', '102565', '117885', '14'), +('14', '83', '8', '102728', '141529', '14'), +('14', '83', '8', '102608', '137788', '14'), +('14', '83', '8', '102728', '119536', '14'), +('14', '83', '8', '80679', '98439', '14'), +('14', '83', '6', '102607', '138545', '14'), +('14', '83', '6', '102561', '119633', '14'), +('14', '83', '6', '80646', '89328', '14'), +('14', '83', '6', '102529', '86248', '14'), +('14', '83', '17', '102027', '93154', '14'), +('14', '83', '17', '102279', '84371', '14'), +('14', '83', '17', '53457', '79545', '14'), +('14', '83', '17', '83606', '64754', '14'), +('14', '83', '7', '102025', '88709', '14'), +('14', '83', '7', '102277', '80063', '14'), +('14', '83', '7', '53453', '76865', '14'), +('14', '83', '7', '83567', '57977', '14'), +('14', '83', '9', '67098', '239998', '14'), +('14', '83', '9', '46938', '86081', '14'), +('14', '83', '9', '53454', '76734', '14'), +('14', '83', '9', '102291', '74274', '14'), +('14', '83', '15', '102723', '141227', '14'), +('14', '83', '15', '102609', '132557', '14'), +('14', '83', '15', '102637', '130004', '14'), +('14', '83', '15', '102635', '129577', '14'), +('14', '83', '20', '102610', '138038', '14'), +('14', '83', '20', '102563', '119494', '14'), +('14', '83', '20', '80680', '98886', '14'), +('14', '83', '20', '46886', '85795', '14'), +('14', '83', '12', '53455', '76800', '14'), +('14', '83', '12', '102274', '75887', '14'), +('14', '83', '12', '83571', '57872', '14'), +('14', '83', '12', '83553', '52363', '14'), +('14', '83', '18', '102026', '89663', '14'), +('14', '83', '18', '102278', '80744', '14'), +('14', '83', '18', '53458', '79009', '14'), +('14', '83', '18', '46810', '63862', '14'), +('14', '83', '19', '53456', '76870', '14'), +('14', '83', '19', '102275', '76354', '14'), +('14', '83', '19', '83575', '58672', '14'), +('14', '83', '19', '39223', '53367', '14'), +('14', '83', '13', '102657', '124425', '14'), +('14', '83', '13', '102735', '123096', '14'), +('14', '83', '13', '102734', '113749', '14'), +('14', '83', '13', '102586', '108821', '14'), +('14', '83', '14', '102633', '136320', '14'), +('14', '83', '14', '102632', '136198', '14'), +('14', '83', '14', '102570', '119264', '14'), +('14', '83', '14', '80665', '92472', '14'), +('14', '83', '11', '102643', '132708', '14'), +('14', '83', '11', '80668', '98732', '14'), +('14', '83', '11', '46939', '86113', '14'), +('14', '83', '11', '80629', '85769', '14'), +('14', '84', '22', '21807', '0', '14'), +('14', '84', '22', '21805', '0', '14'), +('14', '84', '22', '12425', '0', '14'), +('14', '84', '22', '39342', '0', '14'), +('14', '84', '1', '102604', '130127', '14'), +('14', '84', '1', '102639', '129002', '14'), +('14', '84', '1', '102641', '128932', '14'), +('14', '84', '1', '102640', '128575', '14'), +('14', '84', '2', '102024', '87884', '14'), +('14', '84', '2', '102276', '79118', '14'), +('14', '84', '2', '53452', '77256', '14'), +('14', '84', '2', '39358', '64470', '14'), +('14', '84', '3', '102605', '138318', '14'), +('14', '84', '3', '102742', '124301', '14'), +('14', '84', '3', '102560', '119702', '14'), +('14', '84', '3', '102741', '114754', '14'), +('14', '84', '5', '102731', '142612', '14'), +('14', '84', '5', '102606', '135625', '14'), +('14', '84', '5', '102730', '123930', '14'), +('14', '84', '5', '102565', '117891', '14'), +('14', '84', '8', '102728', '141537', '14'), +('14', '84', '8', '102608', '137796', '14'), +('14', '84', '8', '102728', '119542', '14'), +('14', '84', '8', '80679', '98440', '14'), +('14', '84', '6', '102607', '138553', '14'), +('14', '84', '6', '102561', '119640', '14'), +('14', '84', '6', '80646', '89328', '14'), +('14', '84', '6', '102529', '86254', '14'), +('14', '84', '17', '102027', '93159', '14'), +('14', '84', '17', '102279', '84377', '14'), +('14', '84', '17', '53457', '79553', '14'), +('14', '84', '17', '83606', '64762', '14'), +('14', '84', '7', '102025', '88717', '14'), +('14', '84', '7', '102277', '80068', '14'), +('14', '84', '7', '53453', '76871', '14'), +('14', '84', '7', '83567', '57986', '14'), +('14', '84', '9', '67098', '242895', '14'), +('14', '84', '9', '46938', '86090', '14'), +('14', '84', '9', '53454', '76741', '14'), +('14', '84', '9', '102291', '74279', '14'), +('14', '84', '15', '102723', '141235', '14'), +('14', '84', '15', '102609', '132565', '14'), +('14', '84', '15', '102637', '130014', '14'), +('14', '84', '15', '102635', '129580', '14'), +('14', '84', '20', '102610', '138047', '14'), +('14', '84', '20', '102563', '119497', '14'), +('14', '84', '20', '80680', '98894', '14'), +('14', '84', '20', '46886', '85804', '14'), +('14', '84', '12', '53455', '76804', '14'), +('14', '84', '12', '102274', '75893', '14'), +('14', '84', '12', '83571', '57881', '14'), +('14', '84', '12', '83553', '52068', '14'), +('14', '84', '18', '102026', '89665', '14'), +('14', '84', '18', '102278', '80753', '14'), +('14', '84', '18', '53458', '79016', '14'), +('14', '84', '18', '46810', '63868', '14'), +('14', '84', '19', '53456', '76870', '14'), +('14', '84', '19', '102275', '76356', '14'), +('14', '84', '19', '83575', '58681', '14'), +('14', '84', '19', '39223', '53372', '14'), +('14', '84', '13', '102657', '124430', '14'), +('14', '84', '13', '102735', '123103', '14'), +('14', '84', '13', '102734', '113755', '14'), +('14', '84', '13', '102586', '108823', '14'), +('14', '84', '14', '102633', '136326', '14'), +('14', '84', '14', '102632', '136205', '14'), +('14', '84', '14', '102570', '119273', '14'), +('14', '84', '14', '80665', '92477', '14'), +('14', '84', '11', '102643', '132713', '14'), +('14', '84', '11', '80668', '98740', '14'), +('14', '84', '11', '46939', '86121', '14'), +('14', '84', '11', '80629', '85776', '14'), +('14', '85', '22', '12425', '0', '16'), +('14', '85', '22', '21807', '0', '16'), +('14', '85', '22', '39342', '0', '16'), +('14', '85', '22', '23597', '0', '16'), +('14', '85', '1', '111306', '251923', '16'), +('14', '85', '1', '111304', '251395', '16'), +('14', '85', '1', '111307', '251345', '16'), +('14', '85', '1', '111300', '250921', '16'), +('14', '85', '2', '94056', '157353', '16'), +('14', '85', '2', '62985', '156928', '16'), +('14', '85', '2', '104424', '133932', '16'), +('14', '85', '2', '54846', '100961', '16'), +('14', '85', '3', '111314', '252137', '16'), +('14', '85', '3', '111316', '250836', '16'), +('14', '85', '3', '111315', '250371', '16'), +('14', '85', '3', '111013', '220436', '16'), +('14', '85', '5', '111319', '252125', '16'), +('14', '85', '5', '111321', '250897', '16'), +('14', '85', '5', '111318', '250527', '16'), +('14', '85', '5', '111018', '220424', '16'), +('14', '85', '8', '111332', '252327', '16'), +('14', '85', '8', '111329', '251886', '16'), +('14', '85', '8', '111330', '250665', '16'), +('14', '85', '8', '111331', '249886', '16'), +('14', '85', '6', '111323', '252222', '16'), +('14', '85', '6', '111326', '251133', '16'), +('14', '85', '6', '111325', '250939', '16'), +('14', '85', '6', '111022', '220621', '16'), +('14', '85', '17', '56043', '163506', '16'), +('14', '85', '17', '56084', '162700', '16'), +('14', '85', '17', '104427', '139517', '16'), +('14', '85', '17', '54854', '105109', '16'), +('14', '85', '7', '56080', '155399', '16'), +('14', '85', '7', '56040', '155397', '16'), +('14', '85', '7', '104425', '133277', '16'), +('14', '85', '7', '54848', '100480', '16'), +('14', '85', '9', '67098', '245791', '16'), +('14', '85', '9', '56070', '152005', '16'), +('14', '85', '9', '56031', '151972', '16'), +('14', '85', '9', '62984', '151792', '16'), +('14', '85', '15', '111349', '253356', '16'), +('14', '85', '15', '111340', '252525', '16'), +('14', '85', '15', '111344', '252172', '16'), +('14', '85', '15', '111346', '251440', '16'), +('14', '85', '20', '111356', '252315', '16'), +('14', '85', '20', '111352', '251329', '16'), +('14', '85', '20', '111351', '251042', '16'), +('14', '85', '20', '111054', '220614', '16'), +('14', '85', '12', '56035', '153097', '16'), +('14', '85', '12', '56074', '152350', '16'), +('14', '85', '12', '104422', '130531', '16'), +('14', '85', '12', '49656', '100386', '16'), +('14', '85', '18', '56041', '162855', '16'), +('14', '85', '18', '62986', '160447', '16'), +('14', '85', '18', '104426', '136219', '16'), +('14', '85', '18', '54851', '102073', '16'), +('14', '85', '19', '81763', '158222', '16'), +('14', '85', '19', '62990', '157948', '16'), +('14', '85', '19', '56075', '157823', '16'), +('14', '85', '19', '56037', '157535', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '85', '13', '111521', '255821', '16'), +('14', '85', '13', '111524', '243454', '16'), +('14', '85', '13', '111519', '243175', '16'), +('14', '85', '13', '111221', '225968', '16'), +('14', '85', '14', '111537', '252935', '16'), +('14', '85', '14', '111535', '252018', '16'), +('14', '85', '14', '111237', '221232', '16'), +('14', '85', '14', '111235', '220415', '16'), +('14', '85', '11', '111335', '251666', '16'), +('14', '85', '11', '111337', '251147', '16'), +('14', '85', '11', '111338', '249275', '16'), +('14', '85', '11', '111034', '220065', '16'), +('14', '85', '22', '21807', '0', '15'), +('14', '85', '22', '21805', '0', '15'), +('14', '85', '22', '12425', '0', '15'), +('14', '85', '22', '7867', '0', '15'), +('14', '85', '1', '107040', '184254', '15'), +('14', '85', '1', '107053', '184123', '15'), +('14', '85', '1', '107052', '183382', '15'), +('14', '85', '1', '107054', '183075', '15'), +('14', '85', '2', '94056', '157353', '15'), +('14', '85', '2', '62985', '156928', '15'), +('14', '85', '2', '104424', '133932', '15'), +('14', '85', '2', '54846', '100961', '15'), +('14', '85', '3', '107041', '187081', '15'), +('14', '85', '3', '107055', '185487', '15'), +('14', '85', '3', '106828', '175990', '15'), +('14', '85', '3', '106841', '174468', '15'), +('14', '85', '5', '107042', '185085', '15'), +('14', '85', '5', '107056', '184849', '15'), +('14', '85', '5', '106829', '175132', '15'), +('14', '85', '5', '106747', '155473', '15'), +('14', '85', '8', '107044', '188169', '15'), +('14', '85', '8', '107058', '187974', '15'), +('14', '85', '8', '106831', '177082', '15'), +('14', '85', '8', '106844', '175118', '15'), +('14', '85', '6', '107043', '187148', '15'), +('14', '85', '6', '107057', '186163', '15'), +('14', '85', '6', '106830', '176363', '15'), +('14', '85', '6', '106843', '173569', '15'), +('14', '85', '17', '56043', '163506', '15'), +('14', '85', '17', '56084', '162700', '15'), +('14', '85', '17', '104427', '139517', '15'), +('14', '85', '17', '54854', '105109', '15'), +('14', '85', '7', '56080', '155399', '15'), +('14', '85', '7', '56040', '155397', '15'), +('14', '85', '7', '104425', '133277', '15'), +('14', '85', '7', '54848', '100480', '15'), +('14', '85', '9', '67098', '245791', '15'), +('14', '85', '9', '56070', '152005', '15'), +('14', '85', '9', '56031', '151972', '15'), +('14', '85', '9', '62984', '151792', '15'), +('14', '85', '15', '107046', '185637', '15'), +('14', '85', '15', '107047', '184933', '15'), +('14', '85', '15', '107051', '182432', '15'), +('14', '85', '15', '107050', '181812', '15'), +('14', '85', '20', '107059', '188872', '15'), +('14', '85', '20', '107048', '188619', '15'), +('14', '85', '20', '106834', '178433', '15'), +('14', '85', '20', '106845', '176314', '15'), +('14', '85', '12', '56035', '153097', '15'), +('14', '85', '12', '56074', '152350', '15'), +('14', '85', '12', '104422', '130531', '15'), +('14', '85', '12', '53455', '76808', '15'), +('14', '85', '18', '56041', '162855', '15'), +('14', '85', '18', '62986', '160447', '15'), +('14', '85', '18', '104426', '136219', '15'), +('14', '85', '18', '54851', '102073', '15'), +('14', '85', '19', '81763', '158222', '15'), +('14', '85', '19', '62990', '157948', '15'), +('14', '85', '19', '56075', '157823', '15'), +('14', '85', '19', '56037', '157535', '15'), +('14', '85', '13', '106864', '176222', '15'), +('14', '85', '13', '106861', '175548', '15'), +('14', '85', '13', '106764', '158050', '15'), +('14', '85', '13', '62932', '156794', '15'), +('14', '85', '14', '107065', '186464', '15'), +('14', '85', '14', '107063', '185904', '15'), +('14', '85', '14', '106850', '175454', '15'), +('14', '85', '14', '106852', '175174', '15'), +('14', '85', '11', '107045', '186039', '15'), +('14', '85', '11', '106832', '174173', '15'), +('14', '85', '11', '56099', '156312', '15'), +('14', '85', '11', '106739', '155289', '15'), +('14', '86', '22', '12425', '0', '16'), +('14', '86', '22', '21807', '0', '16'), +('14', '86', '22', '39342', '0', '16'), +('14', '86', '22', '23597', '0', '16'), +('14', '86', '1', '111306', '251929', '16'), +('14', '86', '1', '111304', '251400', '16'), +('14', '86', '1', '111307', '251354', '16'), +('14', '86', '1', '111300', '250928', '16'), +('14', '86', '2', '94056', '157356', '16'), +('14', '86', '2', '62985', '156932', '16'), +('14', '86', '2', '104424', '133940', '16'), +('14', '86', '2', '54846', '100966', '16'), +('14', '86', '3', '111314', '252144', '16'), +('14', '86', '3', '111316', '250842', '16'), +('14', '86', '3', '111315', '250378', '16'), +('14', '86', '3', '111013', '220443', '16'), +('14', '86', '5', '111319', '252133', '16'), +('14', '86', '5', '111321', '250903', '16'), +('14', '86', '5', '111318', '250535', '16'), +('14', '86', '5', '111018', '220432', '16'), +('14', '86', '8', '111332', '252334', '16'), +('14', '86', '8', '111329', '251894', '16'), +('14', '86', '8', '111330', '250671', '16'), +('14', '86', '8', '111331', '249892', '16'), +('14', '86', '6', '111323', '252229', '16'), +('14', '86', '6', '111326', '251141', '16'), +('14', '86', '6', '111325', '250945', '16'), +('14', '86', '6', '111022', '220628', '16'), +('14', '86', '17', '56043', '163512', '16'), +('14', '86', '17', '56084', '162707', '16'), +('14', '86', '17', '104427', '139524', '16'), +('14', '86', '17', '54854', '105114', '16'), +('14', '86', '7', '56040', '155408', '16'), +('14', '86', '7', '56080', '155407', '16'), +('14', '86', '7', '104425', '133283', '16'), +('14', '86', '7', '54848', '100487', '16'), +('14', '86', '9', '67098', '248687', '16'), +('14', '86', '9', '56070', '152010', '16'), +('14', '86', '9', '56031', '151982', '16'), +('14', '86', '9', '62984', '151798', '16'), +('14', '86', '15', '111349', '253365', '16'), +('14', '86', '15', '111340', '252531', '16'), +('14', '86', '15', '111344', '252177', '16'), +('14', '86', '15', '111346', '251447', '16'), +('14', '86', '20', '111356', '252322', '16'), +('14', '86', '20', '111352', '251335', '16'), +('14', '86', '20', '111351', '251050', '16'), +('14', '86', '20', '111054', '220621', '16'), +('14', '86', '12', '56035', '153107', '16'), +('14', '86', '12', '56074', '152357', '16'), +('14', '86', '12', '104422', '130540', '16'), +('14', '86', '12', '49656', '100387', '16'), +('14', '86', '18', '56041', '162864', '16'), +('14', '86', '18', '62986', '160453', '16'), +('14', '86', '18', '104426', '136222', '16'), +('14', '86', '18', '54851', '102077', '16'), +('14', '86', '19', '81763', '158233', '16'), +('14', '86', '19', '62990', '157956', '16'), +('14', '86', '19', '56075', '157828', '16'), +('14', '86', '19', '56037', '157539', '16'), +('14', '86', '13', '111521', '255827', '16'), +('14', '86', '13', '111524', '243461', '16'), +('14', '86', '13', '111519', '243183', '16'), +('14', '86', '13', '111221', '225974', '16'), +('14', '86', '14', '111537', '252941', '16'), +('14', '86', '14', '111535', '252023', '16'), +('14', '86', '14', '111237', '221238', '16'), +('14', '86', '14', '111235', '220420', '16'), +('14', '86', '11', '111335', '251673', '16'), +('14', '86', '11', '111337', '251154', '16'), +('14', '86', '11', '111338', '249281', '16'), +('14', '86', '11', '111034', '220072', '16'), +('14', '87', '22', '12425', '0', '16'), +('14', '87', '22', '21807', '0', '16'), +('14', '87', '22', '39342', '0', '16'), +('14', '87', '22', '23597', '0', '16'), +('14', '87', '1', '111306', '251935', '16'), +('14', '87', '1', '111304', '251405', '16'), +('14', '87', '1', '111307', '251363', '16'), +('14', '87', '1', '111300', '250935', '16'), +('14', '87', '2', '94056', '157360', '16'), +('14', '87', '2', '62985', '156937', '16'), +('14', '87', '2', '104424', '133949', '16'), +('14', '87', '2', '54846', '100971', '16'), +('14', '87', '3', '111314', '252152', '16'), +('14', '87', '3', '111316', '250849', '16'), +('14', '87', '3', '111315', '250385', '16'), +('14', '87', '3', '111013', '220450', '16'), +('14', '87', '5', '111319', '252141', '16'), +('14', '87', '5', '111321', '250909', '16'), +('14', '87', '5', '111318', '250543', '16'), +('14', '87', '5', '111018', '220440', '16'), +('14', '87', '8', '111332', '252341', '16'), +('14', '87', '8', '111329', '251902', '16'), +('14', '87', '8', '111330', '250677', '16'), +('14', '87', '8', '111331', '249898', '16'), +('14', '87', '6', '111323', '252235', '16'), +('14', '87', '6', '111326', '251149', '16'), +('14', '87', '6', '111325', '250950', '16'), +('14', '87', '6', '111022', '220634', '16'), +('14', '87', '17', '56043', '163518', '16'), +('14', '87', '17', '56084', '162714', '16'), +('14', '87', '17', '104427', '139531', '16'), +('14', '87', '17', '54854', '105119', '16'), +('14', '87', '7', '56040', '155418', '16'), +('14', '87', '7', '56080', '155415', '16'), +('14', '87', '7', '104425', '133289', '16'), +('14', '87', '7', '54848', '100494', '16'), +('14', '87', '9', '67098', '251584', '16'), +('14', '87', '9', '56070', '152016', '16'), +('14', '87', '9', '56031', '151993', '16'), +('14', '87', '9', '62984', '151804', '16'), +('14', '87', '15', '111349', '253374', '16'), +('14', '87', '15', '111340', '252538', '16'), +('14', '87', '15', '111344', '252182', '16'), +('14', '87', '15', '111346', '251453', '16'), +('14', '87', '20', '111356', '252329', '16'), +('14', '87', '20', '111352', '251341', '16'), +('14', '87', '20', '111351', '251057', '16'), +('14', '87', '20', '111054', '220628', '16'), +('14', '87', '12', '56035', '153117', '16'), +('14', '87', '12', '56074', '152363', '16'), +('14', '87', '12', '104422', '130548', '16'), +('14', '87', '12', '49656', '100388', '16'), +('14', '87', '18', '56041', '162873', '16'), +('14', '87', '18', '62986', '160459', '16'), +('14', '87', '18', '104426', '136225', '16'), +('14', '87', '18', '54851', '102082', '16'), +('14', '87', '19', '81763', '158243', '16'), +('14', '87', '19', '62990', '157964', '16'), +('14', '87', '19', '56075', '157833', '16'), +('14', '87', '19', '56037', '157542', '16'), +('14', '87', '13', '111521', '255833', '16'), +('14', '87', '13', '111524', '243469', '16'), +('14', '87', '13', '111519', '243191', '16'), +('14', '87', '13', '111221', '225981', '16'), +('14', '87', '14', '111537', '252946', '16'), +('14', '87', '14', '111535', '252028', '16'), +('14', '87', '14', '111237', '221243', '16'), +('14', '87', '14', '111235', '220425', '16'), +('14', '87', '11', '111335', '251679', '16'), +('14', '87', '11', '111337', '251161', '16'), +('14', '87', '11', '111338', '249288', '16'), +('14', '87', '11', '111034', '220078', '16'), +('14', '88', '22', '12425', '0', '16'), +('14', '88', '22', '21807', '0', '16'), +('14', '88', '22', '39342', '0', '16'), +('14', '88', '22', '23597', '0', '16'), +('14', '88', '1', '111306', '251941', '16'), +('14', '88', '1', '111304', '251411', '16'), +('14', '88', '1', '111307', '251372', '16'), +('14', '88', '1', '111300', '250942', '16'), +('14', '88', '2', '94056', '157364', '16'), +('14', '88', '2', '62985', '156941', '16'), +('14', '88', '2', '104424', '133958', '16'), +('14', '88', '2', '54846', '100976', '16'), +('14', '88', '3', '111314', '252159', '16'), +('14', '88', '3', '111316', '250856', '16'), +('14', '88', '3', '111315', '250392', '16'), +('14', '88', '3', '111013', '220458', '16'), +('14', '88', '5', '111319', '252149', '16'), +('14', '88', '5', '111321', '250914', '16'), +('14', '88', '5', '111318', '250551', '16'), +('14', '88', '5', '111018', '220448', '16'), +('14', '88', '8', '111332', '252349', '16'), +('14', '88', '8', '111329', '251910', '16'), +('14', '88', '8', '111330', '250683', '16'), +('14', '88', '8', '111331', '249904', '16'), +('14', '88', '6', '111323', '252242', '16'), +('14', '88', '6', '111326', '251157', '16'), +('14', '88', '6', '111325', '250955', '16'), +('14', '88', '6', '111022', '220641', '16'), +('14', '88', '17', '56043', '163525', '16'), +('14', '88', '17', '56084', '162721', '16'), +('14', '88', '17', '104427', '139538', '16'), +('14', '88', '17', '54854', '105124', '16'), +('14', '88', '7', '56040', '155429', '16'), +('14', '88', '7', '56080', '155423', '16'), +('14', '88', '7', '104425', '133295', '16'), +('14', '88', '7', '54848', '100500', '16'), +('14', '88', '9', '67098', '254480', '16'), +('14', '88', '9', '56070', '152021', '16'), +('14', '88', '9', '56031', '152003', '16'), +('14', '88', '9', '62984', '151809', '16'), +('14', '88', '15', '111349', '253383', '16'), +('14', '88', '15', '111340', '252544', '16'), +('14', '88', '15', '111344', '252188', '16'), +('14', '88', '15', '111346', '251460', '16'), +('14', '88', '20', '111356', '252336', '16'), +('14', '88', '20', '111352', '251347', '16'), +('14', '88', '20', '111351', '251065', '16'), +('14', '88', '20', '111054', '220635', '16'), +('14', '88', '12', '56035', '153127', '16'), +('14', '88', '12', '56074', '152369', '16'), +('14', '88', '12', '104422', '130556', '16'), +('14', '88', '12', '49656', '100389', '16'), +('14', '88', '18', '56041', '162882', '16'), +('14', '88', '18', '62986', '160464', '16'), +('14', '88', '18', '104426', '136227', '16'), +('14', '88', '18', '54851', '102087', '16'), +('14', '88', '19', '81763', '158254', '16'), +('14', '88', '19', '62990', '157972', '16'), +('14', '88', '19', '56075', '157839', '16'), +('14', '88', '19', '56037', '157545', '16'), +('14', '88', '13', '111521', '255839', '16'), +('14', '88', '13', '111524', '243476', '16'), +('14', '88', '13', '111519', '243199', '16'), +('14', '88', '13', '111221', '225987', '16'), +('14', '88', '14', '111537', '252952', '16'), +('14', '88', '14', '111535', '252032', '16'), +('14', '88', '14', '111237', '221249', '16'), +('14', '88', '14', '111235', '220429', '16'), +('14', '88', '11', '111335', '251686', '16'), +('14', '88', '11', '111337', '251167', '16'), +('14', '88', '11', '111338', '249295', '16'), +('14', '88', '11', '111034', '220085', '16'), +('14', '89', '22', '12425', '0', '16'), +('14', '89', '22', '21807', '0', '16'), +('14', '89', '22', '39342', '0', '16'), +('14', '89', '22', '23597', '0', '16'), +('14', '89', '1', '111306', '251947', '16'), +('14', '89', '1', '111304', '251416', '16'), +('14', '89', '1', '111307', '251381', '16'), +('14', '89', '1', '111300', '250949', '16'), +('14', '89', '2', '94056', '157368', '16'), +('14', '89', '2', '62985', '156945', '16'), +('14', '89', '2', '104424', '133967', '16'), +('14', '89', '2', '54846', '100981', '16'), +('14', '89', '3', '111314', '252166', '16'), +('14', '89', '3', '111316', '250862', '16'), +('14', '89', '3', '111315', '250399', '16'), +('14', '89', '3', '111013', '220465', '16'), +('14', '89', '5', '111319', '252157', '16'), +('14', '89', '5', '111321', '250920', '16'), +('14', '89', '5', '111318', '250559', '16'), +('14', '89', '5', '111018', '220456', '16'), +('14', '89', '8', '111332', '252356', '16'), +('14', '89', '8', '111329', '251919', '16'), +('14', '89', '8', '111330', '250689', '16'), +('14', '89', '8', '111331', '249910', '16'), +('14', '89', '6', '111323', '252248', '16'), +('14', '89', '6', '111326', '251166', '16'), +('14', '89', '6', '111325', '250960', '16'), +('14', '89', '6', '111022', '220647', '16'), +('14', '89', '17', '56043', '163531', '16'), +('14', '89', '17', '56084', '162728', '16'), +('14', '89', '17', '104427', '139544', '16'), +('14', '89', '17', '54854', '105130', '16'), +('14', '89', '7', '56040', '155440', '16'), +('14', '89', '7', '56080', '155430', '16'), +('14', '89', '7', '104425', '133301', '16'), +('14', '89', '7', '54848', '100507', '16'), +('14', '89', '9', '67098', '257377', '16'), +('14', '89', '9', '56070', '152027', '16'), +('14', '89', '9', '56031', '152013', '16'), +('14', '89', '9', '62984', '151815', '16'), +('14', '89', '15', '111349', '253391', '16'), +('14', '89', '15', '111340', '252550', '16'), +('14', '89', '15', '111344', '252193', '16'), +('14', '89', '15', '111346', '251466', '16'), +('14', '89', '20', '111356', '252343', '16'), +('14', '89', '20', '111352', '251353', '16'), +('14', '89', '20', '111351', '251073', '16'), +('14', '89', '20', '111054', '220642', '16'), +('14', '89', '12', '56035', '153137', '16'), +('14', '89', '12', '56074', '152376', '16'), +('14', '89', '12', '104422', '130564', '16'), +('14', '89', '12', '49656', '100390', '16'), +('14', '89', '18', '56041', '162890', '16'), +('14', '89', '18', '62986', '160470', '16'), +('14', '89', '18', '104426', '136230', '16'), +('14', '89', '18', '54851', '102091', '16'), +('14', '89', '19', '81763', '158264', '16'), +('14', '89', '19', '62990', '157980', '16'), +('14', '89', '19', '56075', '157844', '16'), +('14', '89', '19', '56037', '157548', '16'), +('14', '89', '13', '111521', '255845', '16'), +('14', '89', '13', '111524', '243483', '16'), +('14', '89', '13', '111519', '243207', '16'), +('14', '89', '13', '111221', '225994', '16'), +('14', '89', '14', '111537', '252958', '16'), +('14', '89', '14', '111535', '252037', '16'), +('14', '89', '14', '111237', '221255', '16'), +('14', '89', '14', '111235', '220434', '16'), +('14', '89', '11', '111335', '251692', '16'), +('14', '89', '11', '111337', '251174', '16'), +('14', '89', '11', '111338', '249302', '16'), +('14', '89', '11', '111034', '220091', '16'), +('14', '90', '22', '12425', '0', '17'), +('14', '90', '22', '21807', '0', '17'), +('14', '90', '22', '39342', '0', '17'), +('14', '90', '22', '23597', '0', '17'), +('14', '90', '1', '111306', '251953', '17'), +('14', '90', '1', '111304', '251421', '17'), +('14', '90', '1', '111307', '251390', '17'), +('14', '90', '1', '111300', '250957', '17'), +('14', '90', '2', '94056', '157372', '17'), +('14', '90', '2', '62985', '156949', '17'), +('14', '90', '2', '104424', '133976', '17'), +('14', '90', '2', '54846', '100986', '17'), +('14', '90', '3', '111314', '252173', '17'), +('14', '90', '3', '111316', '250869', '17'), +('14', '90', '3', '111315', '250406', '17'), +('14', '90', '3', '111013', '220472', '17'), +('14', '90', '5', '111319', '252165', '17'), +('14', '90', '5', '111321', '250926', '17'), +('14', '90', '5', '111318', '250567', '17'), +('14', '90', '5', '111018', '220464', '17'), +('14', '90', '8', '111332', '252363', '17'), +('14', '90', '8', '111329', '251927', '17'), +('14', '90', '8', '111330', '250695', '17'), +('14', '90', '8', '111331', '249916', '17'), +('14', '90', '6', '111323', '252255', '17'), +('14', '90', '6', '111326', '251174', '17'), +('14', '90', '6', '111325', '250965', '17'), +('14', '90', '6', '111022', '220654', '17'), +('14', '90', '17', '56043', '163537', '17'), +('14', '90', '17', '56084', '162735', '17'), +('14', '90', '17', '104427', '139551', '17'), +('14', '90', '17', '54854', '105135', '17'), +('14', '90', '7', '56040', '155451', '17'), +('14', '90', '7', '56080', '155438', '17'), +('14', '90', '7', '104425', '133307', '17'), +('14', '90', '7', '54848', '100513', '17'), +('14', '90', '9', '67098', '260274', '17'), +('14', '90', '9', '56070', '152032', '17'), +('14', '90', '9', '56031', '152024', '17'), +('14', '90', '9', '62984', '151821', '17'), +('14', '90', '15', '111349', '253400', '17'), +('14', '90', '15', '111340', '252556', '17'), +('14', '90', '15', '111344', '252198', '17'), +('14', '90', '15', '111346', '251473', '17'), +('14', '90', '20', '111356', '252351', '17'), +('14', '90', '20', '111352', '251359', '17'), +('14', '90', '20', '111351', '251081', '17'), +('14', '90', '20', '111054', '220649', '17'), +('14', '90', '12', '56035', '153147', '17'), +('14', '90', '12', '56074', '152382', '17'), +('14', '90', '12', '104422', '130573', '17'), +('14', '90', '12', '49656', '100391', '17'), +('14', '90', '18', '56041', '162899', '17'), +('14', '90', '18', '62986', '160476', '17'), +('14', '90', '18', '104426', '136233', '17'), +('14', '90', '18', '54851', '102096', '17'), +('14', '90', '19', '81763', '158274', '17'), +('14', '90', '19', '62990', '157988', '17'), +('14', '90', '19', '56075', '157849', '17'), +('14', '90', '19', '56037', '157551', '17'), +('14', '90', '13', '111521', '255851', '17'), +('14', '90', '13', '111524', '243490', '17'), +('14', '90', '13', '111519', '243215', '17'), +('14', '90', '13', '111221', '226000', '17'), +('14', '90', '14', '111537', '252964', '17'), +('14', '90', '14', '111535', '252042', '17'), +('14', '90', '14', '111237', '221261', '17'), +('14', '90', '14', '111235', '220439', '17'), +('14', '90', '11', '111335', '251698', '17'), +('14', '90', '11', '111337', '251181', '17'), +('14', '90', '11', '111338', '249309', '17'), +('14', '90', '11', '111034', '220097', '17'), +('14', '91', '22', '12425', '0', '17'), +('14', '91', '22', '21807', '0', '17'), +('14', '91', '22', '39342', '0', '17'), +('14', '91', '22', '23597', '0', '17'), +('14', '91', '1', '111306', '251960', '17'), +('14', '91', '1', '111304', '251427', '17'), +('14', '91', '1', '111307', '251399', '17'), +('14', '91', '1', '111300', '250964', '17'), +('14', '91', '2', '94056', '157376', '17'), +('14', '91', '2', '62985', '156954', '17'), +('14', '91', '2', '104424', '133985', '17'), +('14', '91', '2', '54846', '100992', '17'), +('14', '91', '3', '111314', '252180', '17'), +('14', '91', '3', '111316', '250876', '17'), +('14', '91', '3', '111315', '250413', '17'), +('14', '91', '3', '111013', '220479', '17'), +('14', '91', '5', '111319', '252173', '17'), +('14', '91', '5', '111321', '250931', '17'), +('14', '91', '5', '111318', '250575', '17'), +('14', '91', '5', '111018', '220472', '17'), +('14', '91', '8', '111332', '252370', '17'), +('14', '91', '8', '111329', '251935', '17'), +('14', '91', '8', '111330', '250701', '17'), +('14', '91', '8', '111331', '249922', '17'), +('14', '91', '6', '111323', '252261', '17'), +('14', '91', '6', '111326', '251182', '17'), +('14', '91', '6', '111325', '250971', '17'), +('14', '91', '6', '111022', '220660', '17'), +('14', '91', '17', '56043', '163543', '17'), +('14', '91', '17', '56084', '162742', '17'), +('14', '91', '17', '104427', '139558', '17'), +('14', '91', '17', '54854', '105140', '17'), +('14', '91', '7', '56040', '155462', '17'), +('14', '91', '7', '56080', '155446', '17'), +('14', '91', '7', '104425', '133313', '17'), +('14', '91', '7', '54848', '100520', '17'), +('14', '91', '9', '67098', '260278', '17'), +('14', '91', '9', '56070', '152038', '17'), +('14', '91', '9', '56031', '152034', '17'), +('14', '91', '9', '62984', '151827', '17'), +('14', '91', '15', '111349', '253409', '17'), +('14', '91', '15', '111340', '252562', '17'), +('14', '91', '15', '111344', '252203', '17'), +('14', '91', '15', '111346', '251479', '17'), +('14', '91', '20', '111356', '252358', '17'), +('14', '91', '20', '111352', '251365', '17'), +('14', '91', '20', '111351', '251089', '17'), +('14', '91', '20', '111054', '220657', '17'), +('14', '91', '12', '56035', '153156', '17'), +('14', '91', '12', '56074', '152389', '17'), +('14', '91', '12', '104422', '130581', '17'), +('14', '91', '12', '49656', '100392', '17'), +('14', '91', '18', '56041', '162908', '17'), +('14', '91', '18', '62986', '160482', '17'), +('14', '91', '18', '104426', '136236', '17'), +('14', '91', '18', '54851', '102100', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '91', '19', '81763', '158285', '17'), +('14', '91', '19', '62990', '157996', '17'), +('14', '91', '19', '56075', '157855', '17'), +('14', '91', '19', '56037', '157554', '17'), +('14', '91', '13', '111521', '255857', '17'), +('14', '91', '13', '111524', '243498', '17'), +('14', '91', '13', '111519', '243223', '17'), +('14', '91', '13', '111221', '226007', '17'), +('14', '91', '14', '111537', '252970', '17'), +('14', '91', '14', '111535', '252047', '17'), +('14', '91', '14', '111237', '221267', '17'), +('14', '91', '14', '111235', '220444', '17'), +('14', '91', '11', '111335', '251705', '17'), +('14', '91', '11', '111337', '251187', '17'), +('14', '91', '11', '111338', '249316', '17'), +('14', '91', '11', '111034', '220104', '17'), +('14', '92', '22', '12425', '0', '17'), +('14', '92', '22', '21807', '0', '17'), +('14', '92', '22', '39342', '0', '17'), +('14', '92', '22', '23597', '0', '17'), +('14', '92', '1', '111306', '251966', '17'), +('14', '92', '1', '111304', '251432', '17'), +('14', '92', '1', '111307', '251408', '17'), +('14', '92', '1', '111300', '250971', '17'), +('14', '92', '2', '94056', '157380', '17'), +('14', '92', '2', '62985', '156958', '17'), +('14', '92', '2', '104424', '133994', '17'), +('14', '92', '2', '54846', '100997', '17'), +('14', '92', '3', '111314', '252188', '17'), +('14', '92', '3', '111316', '250883', '17'), +('14', '92', '3', '111315', '250421', '17'), +('14', '92', '3', '111013', '220486', '17'), +('14', '92', '5', '111319', '252181', '17'), +('14', '92', '5', '111321', '250937', '17'), +('14', '92', '5', '111318', '250583', '17'), +('14', '92', '5', '111018', '220480', '17'), +('14', '92', '8', '111332', '252377', '17'), +('14', '92', '8', '111329', '251943', '17'), +('14', '92', '8', '111330', '250707', '17'), +('14', '92', '8', '111331', '249928', '17'), +('14', '92', '6', '111323', '252268', '17'), +('14', '92', '6', '111326', '251191', '17'), +('14', '92', '6', '111325', '250976', '17'), +('14', '92', '6', '111022', '220667', '17'), +('14', '92', '17', '56043', '163550', '17'), +('14', '92', '17', '56084', '162749', '17'), +('14', '92', '17', '104427', '139565', '17'), +('14', '92', '17', '54854', '105145', '17'), +('14', '92', '7', '56040', '155472', '17'), +('14', '92', '7', '56080', '155454', '17'), +('14', '92', '7', '104425', '133319', '17'), +('14', '92', '7', '54848', '100526', '17'), +('14', '92', '9', '67098', '260283', '17'), +('14', '92', '9', '56031', '152045', '17'), +('14', '92', '9', '56070', '152043', '17'), +('14', '92', '9', '62984', '151832', '17'), +('14', '92', '15', '111349', '253417', '17'), +('14', '92', '15', '111340', '252568', '17'), +('14', '92', '15', '111344', '252209', '17'), +('14', '92', '15', '111346', '251486', '17'), +('14', '92', '20', '111356', '252365', '17'), +('14', '92', '20', '111352', '251371', '17'), +('14', '92', '20', '111351', '251097', '17'), +('14', '92', '20', '111054', '220664', '17'), +('14', '92', '12', '56035', '153166', '17'), +('14', '92', '12', '56074', '152395', '17'), +('14', '92', '12', '104422', '130589', '17'), +('14', '92', '12', '49656', '100393', '17'), +('14', '92', '18', '56041', '162916', '17'), +('14', '92', '18', '62986', '160488', '17'), +('14', '92', '18', '104426', '136238', '17'), +('14', '92', '18', '54851', '102105', '17'), +('14', '92', '19', '81763', '158295', '17'), +('14', '92', '19', '62990', '158004', '17'), +('14', '92', '19', '56075', '157860', '17'), +('14', '92', '19', '56037', '157557', '17'), +('14', '92', '13', '111521', '255863', '17'), +('14', '92', '13', '111524', '243505', '17'), +('14', '92', '13', '111519', '243231', '17'), +('14', '92', '13', '111221', '226013', '17'), +('14', '92', '14', '111537', '252975', '17'), +('14', '92', '14', '111535', '252051', '17'), +('14', '92', '14', '111237', '221272', '17'), +('14', '92', '14', '111235', '220448', '17'), +('14', '92', '11', '111335', '251711', '17'), +('14', '92', '11', '111337', '251194', '17'), +('14', '92', '11', '111338', '249323', '17'), +('14', '92', '11', '111034', '220110', '17'), +('14', '93', '22', '12425', '0', '17'), +('14', '93', '22', '21807', '0', '17'), +('14', '93', '22', '39342', '0', '17'), +('14', '93', '22', '23597', '0', '17'), +('14', '93', '1', '111306', '251972', '17'), +('14', '93', '1', '111304', '251437', '17'), +('14', '93', '1', '111307', '251417', '17'), +('14', '93', '1', '111300', '250978', '17'), +('14', '93', '2', '94056', '157383', '17'), +('14', '93', '2', '62985', '156962', '17'), +('14', '93', '2', '104424', '134003', '17'), +('14', '93', '2', '54846', '101002', '17'), +('14', '93', '3', '111314', '252195', '17'), +('14', '93', '3', '111316', '250889', '17'), +('14', '93', '3', '111315', '250428', '17'), +('14', '93', '3', '111013', '220494', '17'), +('14', '93', '5', '111319', '252189', '17'), +('14', '93', '5', '111321', '250943', '17'), +('14', '93', '5', '111318', '250591', '17'), +('14', '93', '5', '111018', '220488', '17'), +('14', '93', '8', '111332', '252384', '17'), +('14', '93', '8', '111329', '251952', '17'), +('14', '93', '8', '111330', '250713', '17'), +('14', '93', '8', '111331', '249934', '17'), +('14', '93', '6', '111323', '252274', '17'), +('14', '93', '6', '111326', '251199', '17'), +('14', '93', '6', '111325', '250981', '17'), +('14', '93', '6', '111022', '220673', '17'), +('14', '93', '17', '56043', '163556', '17'), +('14', '93', '17', '56084', '162756', '17'), +('14', '93', '17', '104427', '139572', '17'), +('14', '93', '17', '54854', '105150', '17'), +('14', '93', '7', '56040', '155483', '17'), +('14', '93', '7', '56080', '155461', '17'), +('14', '93', '7', '104425', '133324', '17'), +('14', '93', '7', '54848', '100533', '17'), +('14', '93', '9', '67098', '260288', '17'), +('14', '93', '9', '56031', '152055', '17'), +('14', '93', '9', '56070', '152049', '17'), +('14', '93', '9', '62984', '151838', '17'), +('14', '93', '15', '111349', '253426', '17'), +('14', '93', '15', '111340', '252574', '17'), +('14', '93', '15', '111344', '252214', '17'), +('14', '93', '15', '111346', '251492', '17'), +('14', '93', '20', '111356', '252372', '17'), +('14', '93', '20', '111352', '251377', '17'), +('14', '93', '20', '111351', '251105', '17'), +('14', '93', '20', '111054', '220671', '17'), +('14', '93', '12', '56035', '153176', '17'), +('14', '93', '12', '56074', '152401', '17'), +('14', '93', '12', '104422', '130598', '17'), +('14', '93', '12', '49656', '100394', '17'), +('14', '93', '18', '56041', '162925', '17'), +('14', '93', '18', '62986', '160494', '17'), +('14', '93', '18', '104426', '136241', '17'), +('14', '93', '18', '54851', '102110', '17'), +('14', '93', '19', '81763', '158305', '17'), +('14', '93', '19', '62990', '158013', '17'), +('14', '93', '19', '56075', '157865', '17'), +('14', '93', '19', '56037', '157560', '17'), +('14', '93', '13', '111521', '255869', '17'), +('14', '93', '13', '111524', '243512', '17'), +('14', '93', '13', '111519', '243239', '17'), +('14', '93', '13', '111221', '226020', '17'), +('14', '93', '14', '111537', '252981', '17'), +('14', '93', '14', '111535', '252056', '17'), +('14', '93', '14', '111237', '221278', '17'), +('14', '93', '14', '111235', '220453', '17'), +('14', '93', '11', '111335', '251718', '17'), +('14', '93', '11', '111337', '251201', '17'), +('14', '93', '11', '111338', '249329', '17'), +('14', '93', '11', '111034', '220117', '17'), +('14', '94', '22', '12425', '0', '17'), +('14', '94', '22', '21807', '0', '17'), +('14', '94', '22', '39342', '0', '17'), +('14', '94', '22', '23597', '0', '17'), +('14', '94', '1', '111306', '251978', '17'), +('14', '94', '1', '111304', '251443', '17'), +('14', '94', '1', '111307', '251426', '17'), +('14', '94', '1', '111300', '250985', '17'), +('14', '94', '2', '94056', '157387', '17'), +('14', '94', '2', '62985', '156966', '17'), +('14', '94', '2', '104424', '134011', '17'), +('14', '94', '2', '54846', '101007', '17'), +('14', '94', '3', '111314', '252202', '17'), +('14', '94', '3', '111316', '250896', '17'), +('14', '94', '3', '111315', '250435', '17'), +('14', '94', '3', '111013', '220501', '17'), +('14', '94', '5', '111319', '252197', '17'), +('14', '94', '5', '111321', '250949', '17'), +('14', '94', '5', '111318', '250599', '17'), +('14', '94', '5', '111018', '220496', '17'), +('14', '94', '8', '111332', '252391', '17'), +('14', '94', '8', '111329', '251960', '17'), +('14', '94', '8', '111330', '250719', '17'), +('14', '94', '8', '111331', '249940', '17'), +('14', '94', '6', '111323', '252281', '17'), +('14', '94', '6', '111326', '251207', '17'), +('14', '94', '6', '111325', '250986', '17'), +('14', '94', '6', '111022', '220680', '17'), +('14', '94', '17', '56043', '163562', '17'), +('14', '94', '17', '56084', '162763', '17'), +('14', '94', '17', '104427', '139579', '17'), +('14', '94', '17', '54854', '105155', '17'), +('14', '94', '7', '56040', '155494', '17'), +('14', '94', '7', '56080', '155469', '17'), +('14', '94', '7', '104425', '133330', '17'), +('14', '94', '7', '54848', '100539', '17'), +('14', '94', '9', '67098', '260293', '17'), +('14', '94', '9', '56031', '152066', '17'), +('14', '94', '9', '56070', '152054', '17'), +('14', '94', '9', '62984', '151844', '17'), +('14', '94', '15', '111349', '253435', '17'), +('14', '94', '15', '111340', '252580', '17'), +('14', '94', '15', '111344', '252219', '17'), +('14', '94', '15', '111346', '251498', '17'), +('14', '94', '20', '111356', '252379', '17'), +('14', '94', '20', '111352', '251383', '17'), +('14', '94', '20', '111351', '251112', '17'), +('14', '94', '20', '111054', '220678', '17'), +('14', '94', '12', '56035', '153186', '17'), +('14', '94', '12', '56074', '152408', '17'), +('14', '94', '12', '104422', '130606', '17'), +('14', '94', '12', '49656', '100395', '17'), +('14', '94', '18', '56041', '162934', '17'), +('14', '94', '18', '62986', '160500', '17'), +('14', '94', '18', '104426', '136244', '17'), +('14', '94', '18', '54851', '102114', '17'), +('14', '94', '19', '81763', '158316', '17'), +('14', '94', '19', '62990', '158021', '17'), +('14', '94', '19', '56075', '157871', '17'), +('14', '94', '19', '56037', '157563', '17'), +('14', '94', '13', '111521', '255874', '17'), +('14', '94', '13', '111524', '243519', '17'), +('14', '94', '13', '111519', '243247', '17'), +('14', '94', '13', '111221', '226027', '17'), +('14', '94', '14', '111537', '252987', '17'), +('14', '94', '14', '111535', '252061', '17'), +('14', '94', '14', '111237', '221284', '17'), +('14', '94', '14', '111235', '220458', '17'), +('14', '94', '11', '111335', '251724', '17'), +('14', '94', '11', '111337', '251207', '17'), +('14', '94', '11', '111338', '249336', '17'), +('14', '94', '11', '111034', '220123', '17'), +('14', '95', '22', '12425', '0', '18'), +('14', '95', '22', '21807', '0', '18'), +('14', '95', '22', '39342', '0', '18'), +('14', '95', '22', '23597', '0', '18'), +('14', '95', '1', '111306', '251984', '18'), +('14', '95', '1', '111304', '251448', '18'), +('14', '95', '1', '111307', '251435', '18'), +('14', '95', '1', '111300', '250992', '18'), +('14', '95', '2', '94056', '157391', '18'), +('14', '95', '2', '62985', '156971', '18'), +('14', '95', '2', '104424', '134020', '18'), +('14', '95', '2', '54846', '101012', '18'), +('14', '95', '3', '111314', '252209', '18'), +('14', '95', '3', '111316', '250903', '18'), +('14', '95', '3', '111315', '250442', '18'), +('14', '95', '3', '111013', '220508', '18'), +('14', '95', '5', '111319', '252205', '18'), +('14', '95', '5', '111321', '250954', '18'), +('14', '95', '5', '111318', '250607', '18'), +('14', '95', '5', '111018', '220504', '18'), +('14', '95', '8', '111332', '252398', '18'), +('14', '95', '8', '111329', '251968', '18'), +('14', '95', '8', '111330', '250725', '18'), +('14', '95', '8', '111331', '249947', '18'), +('14', '95', '6', '111323', '252287', '18'), +('14', '95', '6', '111326', '251216', '18'), +('14', '95', '6', '111325', '250992', '18'), +('14', '95', '6', '111022', '220686', '18'), +('14', '95', '17', '56043', '163569', '18'), +('14', '95', '17', '56084', '162770', '18'), +('14', '95', '17', '104427', '139586', '18'), +('14', '95', '17', '54854', '105160', '18'), +('14', '95', '7', '56040', '155505', '18'), +('14', '95', '7', '56080', '155477', '18'), +('14', '95', '7', '104425', '133336', '18'), +('14', '95', '7', '54848', '100546', '18'), +('14', '95', '9', '67098', '260298', '18'), +('14', '95', '9', '56031', '152076', '18'), +('14', '95', '9', '56070', '152060', '18'), +('14', '95', '9', '62984', '151849', '18'), +('14', '95', '15', '111349', '253443', '18'), +('14', '95', '15', '111340', '252586', '18'), +('14', '95', '15', '111344', '252224', '18'), +('14', '95', '15', '111346', '251505', '18'), +('14', '95', '20', '128733', '325991', '18'), +('14', '95', '20', '111356', '252386', '18'), +('14', '95', '20', '111352', '251389', '18'), +('14', '95', '20', '111351', '251120', '18'), +('14', '95', '12', '56035', '153196', '18'), +('14', '95', '12', '56074', '152414', '18'), +('14', '95', '12', '104422', '130614', '18'), +('14', '95', '12', '49656', '100395', '18'), +('14', '95', '18', '56041', '162943', '18'), +('14', '95', '18', '62986', '160505', '18'), +('14', '95', '18', '104426', '136247', '18'), +('14', '95', '18', '54851', '102119', '18'), +('14', '95', '19', '81763', '158326', '18'), +('14', '95', '19', '62990', '158029', '18'), +('14', '95', '19', '56075', '157876', '18'), +('14', '95', '19', '56037', '157567', '18'), +('14', '95', '13', '111521', '255880', '18'), +('14', '95', '13', '111524', '243526', '18'), +('14', '95', '13', '111519', '243255', '18'), +('14', '95', '13', '111221', '226033', '18'), +('14', '95', '14', '111537', '252993', '18'), +('14', '95', '14', '111535', '252065', '18'), +('14', '95', '14', '111237', '221290', '18'), +('14', '95', '14', '111235', '220462', '18'), +('14', '95', '11', '111335', '251730', '18'), +('14', '95', '11', '111337', '251214', '18'), +('14', '95', '11', '111338', '249343', '18'), +('14', '95', '11', '111034', '220129', '18'), +('14', '96', '22', '12425', '0', '18'), +('14', '96', '22', '21807', '0', '18'), +('14', '96', '22', '39342', '0', '18'), +('14', '96', '22', '23597', '0', '18'), +('14', '96', '1', '111306', '251990', '18'), +('14', '96', '1', '111304', '251453', '18'), +('14', '96', '1', '111307', '251444', '18'), +('14', '96', '1', '111300', '251000', '18'), +('14', '96', '2', '94056', '157395', '18'), +('14', '96', '2', '62985', '156975', '18'), +('14', '96', '2', '104424', '134029', '18'), +('14', '96', '2', '54846', '101017', '18'), +('14', '96', '3', '111314', '252216', '18'), +('14', '96', '3', '111316', '250909', '18'), +('14', '96', '3', '111315', '250449', '18'), +('14', '96', '3', '111013', '220515', '18'), +('14', '96', '5', '111319', '252212', '18'), +('14', '96', '5', '111321', '250960', '18'), +('14', '96', '5', '111318', '250615', '18'), +('14', '96', '5', '111018', '220511', '18'), +('14', '96', '8', '111332', '252406', '18'), +('14', '96', '8', '111329', '251976', '18'), +('14', '96', '8', '111330', '250731', '18'), +('14', '96', '8', '111331', '249953', '18'), +('14', '96', '6', '111323', '252293', '18'), +('14', '96', '6', '111326', '251224', '18'), +('14', '96', '6', '111325', '250997', '18'), +('14', '96', '6', '111022', '220692', '18'), +('14', '96', '17', '56043', '163575', '18'), +('14', '96', '17', '56084', '162777', '18'), +('14', '96', '17', '104427', '139592', '18'), +('14', '96', '17', '54854', '105165', '18'), +('14', '96', '7', '56040', '155516', '18'), +('14', '96', '7', '56080', '155485', '18'), +('14', '96', '7', '104425', '133342', '18'), +('14', '96', '7', '54848', '100553', '18'), +('14', '96', '9', '67098', '260303', '18'), +('14', '96', '9', '56031', '152087', '18'), +('14', '96', '9', '56070', '152065', '18'), +('14', '96', '9', '62984', '151855', '18'), +('14', '96', '15', '111349', '253452', '18'), +('14', '96', '15', '111340', '252592', '18'), +('14', '96', '15', '111344', '252230', '18'), +('14', '96', '15', '111346', '251511', '18'), +('14', '96', '20', '128733', '325998', '18'), +('14', '96', '20', '111356', '252394', '18'), +('14', '96', '20', '111352', '251395', '18'), +('14', '96', '20', '111351', '251128', '18'), +('14', '96', '12', '56035', '153206', '18'), +('14', '96', '12', '56074', '152421', '18'), +('14', '96', '12', '104422', '130623', '18'), +('14', '96', '12', '49656', '100396', '18'), +('14', '96', '18', '56041', '162951', '18'), +('14', '96', '18', '62986', '160511', '18'), +('14', '96', '18', '104426', '136249', '18'), +('14', '96', '18', '54851', '102124', '18'), +('14', '96', '19', '81763', '158337', '18'), +('14', '96', '19', '62990', '158037', '18'), +('14', '96', '19', '56075', '157881', '18'), +('14', '96', '19', '56037', '157570', '18'), +('14', '96', '13', '111521', '255886', '18'), +('14', '96', '13', '111524', '243534', '18'), +('14', '96', '13', '111519', '243263', '18'), +('14', '96', '13', '111221', '226040', '18'), +('14', '96', '14', '111537', '252999', '18'), +('14', '96', '14', '111535', '252070', '18'), +('14', '96', '14', '111237', '221296', '18'), +('14', '96', '14', '111235', '220467', '18'), +('14', '96', '11', '111335', '251737', '18'), +('14', '96', '11', '111337', '251221', '18'), +('14', '96', '11', '111338', '249350', '18'), +('14', '96', '11', '111034', '220136', '18'), +('14', '97', '22', '12425', '0', '18'), +('14', '97', '22', '21807', '0', '18'), +('14', '97', '22', '39342', '0', '18'), +('14', '97', '22', '23597', '0', '18'), +('14', '97', '1', '111306', '251996', '18'), +('14', '97', '1', '111304', '251459', '18'), +('14', '97', '1', '111307', '251453', '18'), +('14', '97', '1', '111300', '251007', '18'), +('14', '97', '2', '94056', '157399', '18'), +('14', '97', '2', '62985', '156979', '18'), +('14', '97', '2', '104424', '134038', '18'), +('14', '97', '2', '54846', '101023', '18'), +('14', '97', '3', '111314', '252224', '18'), +('14', '97', '3', '111316', '250916', '18'), +('14', '97', '3', '111315', '250456', '18'), +('14', '97', '3', '111013', '220522', '18'), +('14', '97', '5', '111319', '252220', '18'), +('14', '97', '5', '111321', '250966', '18'), +('14', '97', '5', '111318', '250623', '18'), +('14', '97', '5', '111018', '220519', '18'), +('14', '97', '8', '111332', '252413', '18'), +('14', '97', '8', '111329', '251985', '18'), +('14', '97', '8', '111330', '250737', '18'), +('14', '97', '8', '111331', '249959', '18'), +('14', '97', '6', '111323', '252300', '18'), +('14', '97', '6', '111326', '251232', '18'), +('14', '97', '6', '111325', '251002', '18'), +('14', '97', '6', '111022', '220699', '18'), +('14', '97', '17', '56043', '163581', '18'), +('14', '97', '17', '56084', '162784', '18'), +('14', '97', '17', '104427', '139599', '18'), +('14', '97', '17', '54854', '105171', '18'), +('14', '97', '7', '56040', '155527', '18'), +('14', '97', '7', '56080', '155492', '18'), +('14', '97', '7', '104425', '133348', '18'), +('14', '97', '7', '54848', '100559', '18'), +('14', '97', '9', '67098', '260308', '18'), +('14', '97', '9', '56031', '152097', '18'), +('14', '97', '9', '56070', '152071', '18'), +('14', '97', '9', '62984', '151861', '18'), +('14', '97', '15', '111349', '253461', '18'), +('14', '97', '15', '111340', '252598', '18'), +('14', '97', '15', '111344', '252235', '18'), +('14', '97', '15', '111346', '251518', '18'), +('14', '97', '20', '128733', '326004', '18'), +('14', '97', '20', '111356', '252401', '18'), +('14', '97', '20', '111352', '251401', '18'), +('14', '97', '20', '111351', '251136', '18'), +('14', '97', '12', '56035', '153215', '18'), +('14', '97', '12', '56074', '152427', '18'), +('14', '97', '12', '104422', '130631', '18'), +('14', '97', '12', '49656', '100397', '18'), +('14', '97', '18', '56041', '162960', '18'), +('14', '97', '18', '62986', '160517', '18'), +('14', '97', '18', '104426', '136252', '18'), +('14', '97', '18', '54851', '102128', '18'), +('14', '97', '19', '81763', '158347', '18'), +('14', '97', '19', '62990', '158045', '18'), +('14', '97', '19', '56075', '157887', '18'), +('14', '97', '19', '56037', '157573', '18'), +('14', '97', '13', '111521', '255892', '18'), +('14', '97', '13', '111524', '243541', '18'), +('14', '97', '13', '111519', '243271', '18'), +('14', '97', '13', '111221', '226046', '18'), +('14', '97', '14', '111537', '253004', '18'), +('14', '97', '14', '111535', '252075', '18'), +('14', '97', '14', '111237', '221301', '18'), +('14', '97', '14', '111235', '220472', '18'), +('14', '97', '11', '111335', '251743', '18'), +('14', '97', '11', '111337', '251227', '18'), +('14', '97', '11', '111338', '249357', '18'), +('14', '97', '11', '111034', '220142', '18'), +('14', '98', '22', '12425', '0', '18'), +('14', '98', '22', '21807', '0', '18'), +('14', '98', '22', '39342', '0', '18'), +('14', '98', '22', '23597', '0', '18'), +('14', '98', '1', '111306', '252002', '18'), +('14', '98', '1', '111304', '251464', '18'), +('14', '98', '1', '111307', '251462', '18'), +('14', '98', '1', '111300', '251014', '18'), +('14', '98', '2', '94056', '157403', '18'), +('14', '98', '2', '62985', '156983', '18'), +('14', '98', '2', '104424', '134047', '18'), +('14', '98', '2', '54846', '101028', '18'), +('14', '98', '3', '111314', '252231', '18'), +('14', '98', '3', '111316', '250923', '18'), +('14', '98', '3', '111315', '250463', '18'), +('14', '98', '3', '111013', '220530', '18'), +('14', '98', '5', '111319', '252228', '18'), +('14', '98', '5', '111321', '250971', '18'), +('14', '98', '5', '111318', '250630', '18'), +('14', '98', '5', '111018', '220527', '18'), +('14', '98', '8', '111332', '252420', '18'), +('14', '98', '8', '111329', '251993', '18'), +('14', '98', '8', '111330', '250743', '18'), +('14', '98', '8', '111331', '249965', '18'), +('14', '98', '6', '111323', '252306', '18'), +('14', '98', '6', '111326', '251240', '18'), +('14', '98', '6', '111325', '251007', '18'), +('14', '98', '6', '111022', '220705', '18'), +('14', '98', '17', '56043', '163587', '18'), +('14', '98', '17', '56084', '162791', '18'), +('14', '98', '17', '104427', '139606', '18'), +('14', '98', '17', '54854', '105176', '18'), +('14', '98', '7', '56040', '155537', '18'), +('14', '98', '7', '56080', '155500', '18'), +('14', '98', '7', '104425', '133354', '18'), +('14', '98', '7', '54848', '100566', '18'), +('14', '98', '9', '67098', '260313', '18'), +('14', '98', '9', '56031', '152108', '18'), +('14', '98', '9', '56070', '152077', '18'), +('14', '98', '9', '62984', '151866', '18'), +('14', '98', '15', '111349', '253469', '18'), +('14', '98', '15', '111340', '252604', '18'), +('14', '98', '15', '111344', '252240', '18'), +('14', '98', '15', '111346', '251524', '18'), +('14', '98', '20', '128733', '326011', '18'), +('14', '98', '20', '111356', '252408', '18'), +('14', '98', '20', '111352', '251407', '18'), +('14', '98', '20', '111351', '251144', '18'), +('14', '98', '12', '56035', '153225', '18'), +('14', '98', '12', '56074', '152433', '18'), +('14', '98', '12', '104422', '130639', '18'), +('14', '98', '12', '49656', '100398', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '98', '18', '56041', '162969', '18'), +('14', '98', '18', '62986', '160523', '18'), +('14', '98', '18', '104426', '136255', '18'), +('14', '98', '18', '54851', '102133', '18'), +('14', '98', '19', '81763', '158357', '18'), +('14', '98', '19', '62990', '158053', '18'), +('14', '98', '19', '56075', '157892', '18'), +('14', '98', '19', '56037', '157576', '18'), +('14', '98', '13', '111521', '255898', '18'), +('14', '98', '13', '111524', '243548', '18'), +('14', '98', '13', '111519', '243279', '18'), +('14', '98', '13', '111221', '226053', '18'), +('14', '98', '14', '111537', '253010', '18'), +('14', '98', '14', '111535', '252079', '18'), +('14', '98', '14', '111237', '221307', '18'), +('14', '98', '14', '111235', '220476', '18'), +('14', '98', '11', '111335', '251750', '18'), +('14', '98', '11', '111337', '251234', '18'), +('14', '98', '11', '111338', '249364', '18'), +('14', '98', '11', '111034', '220149', '18'), +('14', '99', '22', '12425', '0', '18'), +('14', '99', '22', '21807', '0', '18'), +('14', '99', '22', '39342', '0', '18'), +('14', '99', '22', '23597', '0', '18'), +('14', '99', '1', '111306', '252009', '18'), +('14', '99', '1', '111307', '251471', '18'), +('14', '99', '1', '111304', '251469', '18'), +('14', '99', '1', '111300', '251021', '18'), +('14', '99', '2', '94056', '157406', '18'), +('14', '99', '2', '62985', '156987', '18'), +('14', '99', '2', '104424', '134056', '18'), +('14', '99', '2', '54846', '101033', '18'), +('14', '99', '3', '111314', '252238', '18'), +('14', '99', '3', '111316', '250930', '18'), +('14', '99', '3', '111315', '250470', '18'), +('14', '99', '3', '111013', '220537', '18'), +('14', '99', '5', '111319', '252236', '18'), +('14', '99', '5', '111321', '250977', '18'), +('14', '99', '5', '111318', '250638', '18'), +('14', '99', '5', '111018', '220535', '18'), +('14', '99', '8', '111332', '252427', '18'), +('14', '99', '8', '111329', '252001', '18'), +('14', '99', '8', '111330', '250749', '18'), +('14', '99', '8', '111331', '249971', '18'), +('14', '99', '6', '111323', '252313', '18'), +('14', '99', '6', '111326', '251249', '18'), +('14', '99', '6', '111325', '251012', '18'), +('14', '99', '6', '111022', '220712', '18'), +('14', '99', '17', '56043', '163594', '18'), +('14', '99', '17', '56084', '162798', '18'), +('14', '99', '17', '104427', '139613', '18'), +('14', '99', '17', '54854', '105181', '18'), +('14', '99', '7', '56040', '155548', '18'), +('14', '99', '7', '56080', '155508', '18'), +('14', '99', '7', '104425', '133360', '18'), +('14', '99', '7', '54848', '100572', '18'), +('14', '99', '9', '67098', '260318', '18'), +('14', '99', '9', '56031', '152118', '18'), +('14', '99', '9', '56070', '152082', '18'), +('14', '99', '9', '62984', '151872', '18'), +('14', '99', '15', '111349', '253478', '18'), +('14', '99', '15', '111340', '252610', '18'), +('14', '99', '15', '111344', '252245', '18'), +('14', '99', '15', '111346', '251531', '18'), +('14', '99', '20', '128733', '326017', '18'), +('14', '99', '20', '111356', '252415', '18'), +('14', '99', '20', '111352', '251413', '18'), +('14', '99', '20', '111351', '251152', '18'), +('14', '99', '12', '56035', '153235', '18'), +('14', '99', '12', '56074', '152440', '18'), +('14', '99', '12', '104422', '130647', '18'), +('14', '99', '12', '49656', '100399', '18'), +('14', '99', '18', '56041', '162977', '18'), +('14', '99', '18', '62986', '160529', '18'), +('14', '99', '18', '104426', '136258', '18'), +('14', '99', '18', '54851', '102137', '18'), +('14', '99', '19', '81763', '158368', '18'), +('14', '99', '19', '62990', '158061', '18'), +('14', '99', '19', '56075', '157897', '18'), +('14', '99', '19', '56037', '157579', '18'), +('14', '99', '13', '111521', '255904', '18'), +('14', '99', '13', '111524', '243555', '18'), +('14', '99', '13', '111519', '243287', '18'), +('14', '99', '13', '111221', '226059', '18'), +('14', '99', '14', '111537', '253016', '18'), +('14', '99', '14', '111535', '252084', '18'), +('14', '99', '14', '111237', '221313', '18'), +('14', '99', '14', '111235', '220481', '18'), +('14', '99', '11', '111335', '251756', '18'), +('14', '99', '11', '111337', '251241', '18'), +('14', '99', '11', '111338', '249371', '18'), +('14', '99', '11', '111034', '220155', '18'), +('14', '100', '22', '12425', '0', '20'), +('14', '100', '22', '21807', '0', '20'), +('14', '100', '22', '39342', '0', '20'), +('14', '100', '22', '23597', '0', '20'), +('14', '100', '1', '98769', '417998', '20'), +('14', '100', '1', '111306', '252015', '20'), +('14', '100', '1', '111307', '251480', '20'), +('14', '100', '1', '111304', '251475', '20'), +('14', '100', '2', '94056', '157410', '20'), +('14', '100', '2', '62985', '156992', '20'), +('14', '100', '2', '104424', '134065', '20'), +('14', '100', '2', '54846', '101038', '20'), +('14', '100', '3', '111314', '252245', '20'), +('14', '100', '3', '111316', '250936', '20'), +('14', '100', '3', '111315', '250477', '20'), +('14', '100', '3', '111013', '220544', '20'), +('14', '100', '5', '111319', '252244', '20'), +('14', '100', '5', '111321', '250983', '20'), +('14', '100', '5', '111318', '250646', '20'), +('14', '100', '5', '111018', '220543', '20'), +('14', '100', '8', '111332', '252434', '20'), +('14', '100', '8', '111329', '252010', '20'), +('14', '100', '8', '111330', '250755', '20'), +('14', '100', '8', '111331', '249977', '20'), +('14', '100', '6', '111323', '252319', '20'), +('14', '100', '6', '111326', '251257', '20'), +('14', '100', '6', '111325', '251018', '20'), +('14', '100', '6', '111022', '220718', '20'), +('14', '100', '17', '56043', '163600', '20'), +('14', '100', '17', '56084', '162805', '20'), +('14', '100', '17', '104427', '139620', '20'), +('14', '100', '17', '54854', '105186', '20'), +('14', '100', '7', '56040', '155559', '20'), +('14', '100', '7', '56080', '155516', '20'), +('14', '100', '7', '104425', '133366', '20'), +('14', '100', '7', '54848', '100579', '20'), +('14', '100', '9', '67098', '260323', '20'), +('14', '100', '9', '56031', '152128', '20'), +('14', '100', '9', '56070', '152088', '20'), +('14', '100', '9', '62984', '151878', '20'), +('14', '100', '15', '111349', '253487', '20'), +('14', '100', '15', '111340', '252616', '20'), +('14', '100', '15', '111344', '252251', '20'), +('14', '100', '15', '111346', '251537', '20'), +('14', '100', '20', '128733', '326024', '20'), +('14', '100', '20', '111356', '252422', '20'), +('14', '100', '20', '111352', '251419', '20'), +('14', '100', '20', '111351', '251160', '20'), +('14', '100', '12', '56035', '153245', '20'), +('14', '100', '12', '56074', '152446', '20'), +('14', '100', '12', '104422', '130656', '20'), +('14', '100', '12', '49656', '100400', '20'), +('14', '100', '18', '56041', '162986', '20'), +('14', '100', '18', '62986', '160535', '20'), +('14', '100', '18', '104426', '136260', '20'), +('14', '100', '18', '54851', '102142', '20'), +('14', '100', '19', '81763', '158378', '20'), +('14', '100', '19', '62990', '158069', '20'), +('14', '100', '19', '56075', '157903', '20'), +('14', '100', '19', '56037', '157582', '20'), +('14', '100', '13', '111521', '255911', '20'), +('14', '100', '13', '111524', '243563', '20'), +('14', '100', '13', '111519', '243296', '20'), +('14', '100', '13', '111221', '226066', '20'), +('14', '100', '14', '111537', '253022', '20'), +('14', '100', '14', '111535', '252089', '20'), +('14', '100', '14', '111237', '221319', '20'), +('14', '100', '14', '111235', '220486', '20'), +('14', '100', '11', '133816', '330821', '20'), +('14', '100', '11', '111335', '251763', '20'), +('14', '100', '11', '111337', '251248', '20'), +('14', '100', '11', '111338', '249378', '20'), +('14', '100', '22', '12425', '0', '19'), +('14', '100', '22', '21807', '0', '19'), +('14', '100', '22', '39342', '0', '19'), +('14', '100', '22', '23597', '0', '19'), +('14', '100', '1', '98769', '417998', '19'), +('14', '100', '1', '111306', '252015', '19'), +('14', '100', '1', '111307', '251480', '19'), +('14', '100', '1', '111304', '251475', '19'), +('14', '100', '2', '94056', '157410', '19'), +('14', '100', '2', '62985', '156992', '19'), +('14', '100', '2', '104424', '134065', '19'), +('14', '100', '2', '54846', '101038', '19'), +('14', '100', '3', '111314', '252245', '19'), +('14', '100', '3', '111316', '250936', '19'), +('14', '100', '3', '111315', '250477', '19'), +('14', '100', '3', '111013', '220544', '19'), +('14', '100', '5', '111319', '252244', '19'), +('14', '100', '5', '111321', '250983', '19'), +('14', '100', '5', '111318', '250646', '19'), +('14', '100', '5', '111018', '220543', '19'), +('14', '100', '8', '111332', '252434', '19'), +('14', '100', '8', '111329', '252010', '19'), +('14', '100', '8', '111330', '250755', '19'), +('14', '100', '8', '111331', '249977', '19'), +('14', '100', '6', '111323', '252319', '19'), +('14', '100', '6', '111326', '251257', '19'), +('14', '100', '6', '111325', '251018', '19'), +('14', '100', '6', '111022', '220718', '19'), +('14', '100', '17', '56043', '163600', '19'), +('14', '100', '17', '56084', '162805', '19'), +('14', '100', '17', '104427', '139620', '19'), +('14', '100', '17', '54854', '105186', '19'), +('14', '100', '7', '56040', '155559', '19'), +('14', '100', '7', '56080', '155516', '19'), +('14', '100', '7', '104425', '133366', '19'), +('14', '100', '7', '54848', '100579', '19'), +('14', '100', '9', '67098', '260323', '19'), +('14', '100', '9', '56031', '152128', '19'), +('14', '100', '9', '56070', '152088', '19'), +('14', '100', '9', '62984', '151878', '19'), +('14', '100', '15', '111349', '253487', '19'), +('14', '100', '15', '111340', '252616', '19'), +('14', '100', '15', '111344', '252251', '19'), +('14', '100', '15', '111346', '251537', '19'), +('14', '100', '20', '128733', '326024', '19'), +('14', '100', '20', '111356', '252422', '19'), +('14', '100', '20', '111352', '251419', '19'), +('14', '100', '20', '111351', '251160', '19'), +('14', '100', '12', '56035', '153245', '19'), +('14', '100', '12', '56074', '152446', '19'), +('14', '100', '12', '104422', '130656', '19'), +('14', '100', '12', '49656', '100400', '19'), +('14', '100', '18', '56041', '162986', '19'), +('14', '100', '18', '62986', '160535', '19'), +('14', '100', '18', '104426', '136260', '19'), +('14', '100', '18', '54851', '102142', '19'), +('14', '100', '19', '81763', '158378', '19'), +('14', '100', '19', '62990', '158069', '19'), +('14', '100', '19', '56075', '157903', '19'), +('14', '100', '19', '56037', '157582', '19'), +('14', '100', '13', '111521', '255910', '19'), +('14', '100', '13', '111524', '243563', '19'), +('14', '100', '13', '111519', '243295', '19'), +('14', '100', '13', '111221', '226066', '19'), +('14', '100', '14', '111537', '253022', '19'), +('14', '100', '14', '111535', '252089', '19'), +('14', '100', '14', '111237', '221319', '19'), +('14', '100', '14', '111235', '220486', '19'), +('14', '100', '11', '133816', '330821', '19'), +('14', '100', '11', '111335', '251763', '19'), +('14', '100', '11', '111337', '251248', '19'), +('14', '100', '11', '111338', '249378', '19'), +('14', '101', '22', '12425', '0', '20'), +('14', '101', '22', '21807', '0', '20'), +('14', '101', '22', '39342', '0', '20'), +('14', '101', '22', '23597', '0', '20'), +('14', '101', '1', '98769', '418003', '20'), +('14', '101', '1', '111306', '252021', '20'), +('14', '101', '1', '111307', '251489', '20'), +('14', '101', '1', '111304', '251480', '20'), +('14', '101', '2', '94056', '157414', '20'), +('14', '101', '2', '62985', '156996', '20'), +('14', '101', '2', '104424', '134074', '20'), +('14', '101', '2', '54846', '101043', '20'), +('14', '101', '3', '111314', '252253', '20'), +('14', '101', '3', '111316', '250943', '20'), +('14', '101', '3', '111315', '250484', '20'), +('14', '101', '3', '111013', '220551', '20'), +('14', '101', '5', '111319', '252252', '20'), +('14', '101', '5', '111321', '250989', '20'), +('14', '101', '5', '111318', '250654', '20'), +('14', '101', '5', '111018', '220551', '20'), +('14', '101', '8', '111332', '252441', '20'), +('14', '101', '8', '111329', '252018', '20'), +('14', '101', '8', '111330', '250761', '20'), +('14', '101', '8', '111331', '249983', '20'), +('14', '101', '6', '111323', '252326', '20'), +('14', '101', '6', '111326', '251265', '20'), +('14', '101', '6', '111325', '251023', '20'), +('14', '101', '6', '111022', '220725', '20'), +('14', '101', '17', '56043', '163606', '20'), +('14', '101', '17', '56084', '162812', '20'), +('14', '101', '17', '104427', '139627', '20'), +('14', '101', '17', '54854', '105191', '20'), +('14', '101', '7', '56040', '155570', '20'), +('14', '101', '7', '56080', '155523', '20'), +('14', '101', '7', '104425', '133372', '20'), +('14', '101', '7', '54848', '100585', '20'), +('14', '101', '9', '67098', '260327', '20'), +('14', '101', '9', '56031', '152139', '20'), +('14', '101', '9', '56070', '152093', '20'), +('14', '101', '9', '62984', '151884', '20'), +('14', '101', '15', '111349', '253496', '20'), +('14', '101', '15', '111340', '252622', '20'), +('14', '101', '15', '111344', '252256', '20'), +('14', '101', '15', '111346', '251544', '20'), +('14', '101', '20', '128733', '326031', '20'), +('14', '101', '20', '111356', '252430', '20'), +('14', '101', '20', '111352', '251425', '20'), +('14', '101', '20', '111351', '251167', '20'), +('14', '101', '12', '56035', '153255', '20'), +('14', '101', '12', '56074', '152453', '20'), +('14', '101', '12', '104422', '130664', '20'), +('14', '101', '12', '49656', '100401', '20'), +('14', '101', '18', '56041', '162995', '20'), +('14', '101', '18', '62986', '160541', '20'), +('14', '101', '18', '104426', '136263', '20'), +('14', '101', '18', '54851', '102147', '20'), +('14', '101', '19', '81763', '158388', '20'), +('14', '101', '19', '62990', '158078', '20'), +('14', '101', '19', '56075', '157908', '20'), +('14', '101', '19', '56037', '157585', '20'), +('14', '101', '13', '111521', '255917', '20'), +('14', '101', '13', '111524', '243570', '20'), +('14', '101', '13', '111519', '243304', '20'), +('14', '101', '13', '111221', '226073', '20'), +('14', '101', '14', '111537', '253028', '20'), +('14', '101', '14', '111535', '252093', '20'), +('14', '101', '14', '111237', '221325', '20'), +('14', '101', '14', '111235', '220490', '20'), +('14', '101', '11', '133816', '330825', '20'), +('14', '101', '11', '111335', '251769', '20'), +('14', '101', '11', '111337', '251254', '20'), +('14', '101', '11', '111338', '249384', '20'), +('14', '102', '22', '12425', '0', '20'), +('14', '102', '22', '21807', '0', '20'), +('14', '102', '22', '39342', '0', '20'), +('14', '102', '22', '23597', '0', '20'), +('14', '102', '1', '98769', '418008', '20'), +('14', '102', '1', '111306', '252027', '20'), +('14', '102', '1', '111307', '251498', '20'), +('14', '102', '1', '111304', '251486', '20'), +('14', '102', '2', '94056', '157418', '20'), +('14', '102', '2', '62985', '157000', '20'), +('14', '102', '2', '104424', '134082', '20'), +('14', '102', '2', '54846', '101048', '20'), +('14', '102', '3', '111314', '252260', '20'), +('14', '102', '3', '111316', '250950', '20'), +('14', '102', '3', '111315', '250491', '20'), +('14', '102', '3', '111013', '220559', '20'), +('14', '102', '5', '111319', '252260', '20'), +('14', '102', '5', '111321', '250994', '20'), +('14', '102', '5', '111318', '250662', '20'), +('14', '102', '5', '111018', '220559', '20'), +('14', '102', '8', '111332', '252448', '20'), +('14', '102', '8', '111329', '252026', '20'), +('14', '102', '8', '111330', '250767', '20'), +('14', '102', '8', '111331', '249989', '20'), +('14', '102', '6', '111323', '252332', '20'), +('14', '102', '6', '111326', '251274', '20'), +('14', '102', '6', '111325', '251028', '20'), +('14', '102', '6', '111022', '220731', '20'), +('14', '102', '17', '56043', '163612', '20'), +('14', '102', '17', '56084', '162819', '20'), +('14', '102', '17', '104427', '139634', '20'), +('14', '102', '17', '54854', '105196', '20'), +('14', '102', '7', '56040', '155581', '20'), +('14', '102', '7', '56080', '155531', '20'), +('14', '102', '7', '104425', '133378', '20'), +('14', '102', '7', '54848', '100592', '20'), +('14', '102', '9', '67098', '260332', '20'), +('14', '102', '9', '56031', '152149', '20'), +('14', '102', '9', '56070', '152099', '20'), +('14', '102', '9', '62984', '151889', '20'), +('14', '102', '15', '111349', '253504', '20'), +('14', '102', '15', '111340', '252628', '20'), +('14', '102', '15', '111344', '252261', '20'), +('14', '102', '15', '111346', '251550', '20'), +('14', '102', '20', '128733', '326037', '20'), +('14', '102', '20', '111356', '252437', '20'), +('14', '102', '20', '111352', '251431', '20'), +('14', '102', '20', '111351', '251175', '20'), +('14', '102', '12', '56035', '153265', '20'), +('14', '102', '12', '56074', '152459', '20'), +('14', '102', '12', '104422', '130672', '20'), +('14', '102', '12', '49656', '100402', '20'), +('14', '102', '18', '56041', '163004', '20'), +('14', '102', '18', '62986', '160546', '20'), +('14', '102', '18', '104426', '136266', '20'), +('14', '102', '18', '54851', '102151', '20'), +('14', '102', '19', '81763', '158399', '20'), +('14', '102', '19', '62990', '158086', '20'), +('14', '102', '19', '56075', '157913', '20'), +('14', '102', '19', '56037', '157588', '20'), +('14', '102', '13', '111521', '255922', '20'), +('14', '102', '13', '111524', '243578', '20'), +('14', '102', '13', '111519', '243312', '20'), +('14', '102', '13', '111221', '226079', '20'), +('14', '102', '14', '111537', '253034', '20'), +('14', '102', '14', '111535', '252098', '20'), +('14', '102', '14', '111237', '221331', '20'), +('14', '102', '14', '111235', '220495', '20'), +('14', '102', '11', '133816', '330830', '20'), +('14', '102', '11', '111335', '251775', '20'), +('14', '102', '11', '111337', '251261', '20'), +('14', '102', '11', '111338', '249391', '20'), +('14', '103', '22', '12425', '0', '20'), +('14', '103', '22', '21807', '0', '20'), +('14', '103', '22', '39342', '0', '20'), +('14', '103', '22', '23597', '0', '20'), +('14', '103', '1', '98769', '418013', '20'), +('14', '103', '1', '111306', '252033', '20'), +('14', '103', '1', '111307', '251507', '20'), +('14', '103', '1', '111304', '251491', '20'), +('14', '103', '2', '94056', '157422', '20'), +('14', '103', '2', '62985', '157004', '20'), +('14', '103', '2', '104424', '134091', '20'), +('14', '103', '2', '54846', '101053', '20'), +('14', '103', '3', '111314', '252267', '20'), +('14', '103', '3', '111316', '250956', '20'), +('14', '103', '3', '111315', '250498', '20'), +('14', '103', '3', '111013', '220566', '20'), +('14', '103', '5', '111319', '252268', '20'), +('14', '103', '5', '111321', '251000', '20'), +('14', '103', '5', '111318', '250670', '20'), +('14', '103', '5', '111018', '220567', '20'), +('14', '103', '8', '111332', '252456', '20'), +('14', '103', '8', '111329', '252034', '20'), +('14', '103', '8', '111330', '250773', '20'), +('14', '103', '8', '111331', '249995', '20'), +('14', '103', '6', '111323', '252339', '20'), +('14', '103', '6', '111326', '251282', '20'), +('14', '103', '6', '111325', '251033', '20'), +('14', '103', '6', '111022', '220738', '20'), +('14', '103', '17', '56043', '163619', '20'), +('14', '103', '17', '56084', '162826', '20'), +('14', '103', '17', '104427', '139641', '20'), +('14', '103', '17', '54854', '105201', '20'), +('14', '103', '7', '56040', '155591', '20'), +('14', '103', '7', '56080', '155539', '20'), +('14', '103', '7', '104425', '133383', '20'), +('14', '103', '7', '54848', '100598', '20'), +('14', '103', '9', '67098', '260337', '20'), +('14', '103', '9', '56031', '152160', '20'), +('14', '103', '9', '56070', '152104', '20'), +('14', '103', '9', '62984', '151895', '20'), +('14', '103', '15', '111349', '253513', '20'), +('14', '103', '15', '111340', '252634', '20'), +('14', '103', '15', '111344', '252266', '20'), +('14', '103', '15', '111346', '251557', '20'), +('14', '103', '20', '128733', '326044', '20'), +('14', '103', '20', '111356', '252444', '20'), +('14', '103', '20', '111352', '251437', '20'), +('14', '103', '20', '111351', '251183', '20'), +('14', '103', '12', '56035', '153274', '20'), +('14', '103', '12', '56074', '152466', '20'), +('14', '103', '12', '104422', '130681', '20'), +('14', '103', '12', '49656', '100403', '20'), +('14', '103', '18', '56041', '163012', '20'), +('14', '103', '18', '62986', '160552', '20'), +('14', '103', '18', '104426', '136269', '20'), +('14', '103', '18', '54851', '102156', '20'), +('14', '103', '19', '81763', '158409', '20'), +('14', '103', '19', '62990', '158094', '20'), +('14', '103', '19', '56075', '157919', '20'), +('14', '103', '19', '56037', '157592', '20'), +('14', '103', '13', '111521', '255928', '20'), +('14', '103', '13', '111524', '243585', '20'), +('14', '103', '13', '111519', '243320', '20'), +('14', '103', '13', '111221', '226086', '20'), +('14', '103', '14', '111537', '253039', '20'), +('14', '103', '14', '111535', '252103', '20'), +('14', '103', '14', '111237', '221336', '20'), +('14', '103', '14', '111235', '220500', '20'), +('14', '103', '11', '133816', '330835', '20'), +('14', '103', '11', '111335', '251782', '20'), +('14', '103', '11', '111337', '251268', '20'), +('14', '103', '11', '111338', '249398', '20'), +('14', '104', '22', '12425', '0', '20'), +('14', '104', '22', '21807', '0', '20'), +('14', '104', '22', '39342', '0', '20'), +('14', '104', '22', '23597', '0', '20'), +('14', '104', '1', '98769', '418017', '20'), +('14', '104', '1', '111306', '252039', '20'), +('14', '104', '1', '111307', '251516', '20'), +('14', '104', '1', '111304', '251496', '20'), +('14', '104', '2', '94056', '157426', '20'), +('14', '104', '2', '62985', '157009', '20'), +('14', '104', '2', '104424', '134100', '20'), +('14', '104', '2', '54846', '101059', '20'), +('14', '104', '3', '111314', '252274', '20'), +('14', '104', '3', '111316', '250963', '20'), +('14', '104', '3', '111315', '250505', '20'), +('14', '104', '3', '111013', '220573', '20'), +('14', '104', '5', '111319', '252276', '20'), +('14', '104', '5', '111321', '251006', '20'), +('14', '104', '5', '111318', '250678', '20'), +('14', '104', '5', '111018', '220575', '20'), +('14', '104', '8', '111332', '252463', '20'), +('14', '104', '8', '111329', '252043', '20'), +('14', '104', '8', '111330', '250779', '20'), +('14', '104', '8', '111331', '250001', '20'), +('14', '104', '6', '111323', '252345', '20'), +('14', '104', '6', '111326', '251290', '20'), +('14', '104', '6', '111325', '251039', '20'), +('14', '104', '6', '111022', '220744', '20'), +('14', '104', '17', '56043', '163625', '20'), +('14', '104', '17', '56084', '162833', '20'), +('14', '104', '17', '104427', '139647', '20'), +('14', '104', '17', '54854', '105206', '20'), +('14', '104', '7', '56040', '155602', '20'), +('14', '104', '7', '56080', '155547', '20'), +('14', '104', '7', '104425', '133389', '20'), +('14', '104', '7', '54848', '100605', '20'), +('14', '104', '9', '67098', '260342', '20'), +('14', '104', '9', '56031', '152170', '20'), +('14', '104', '9', '56070', '152110', '20'), +('14', '104', '9', '62984', '151901', '20'), +('14', '104', '15', '111349', '253522', '20'), +('14', '104', '15', '111340', '252640', '20'), +('14', '104', '15', '111344', '252272', '20'), +('14', '104', '15', '111346', '251563', '20'), +('14', '104', '20', '128733', '326050', '20'), +('14', '104', '20', '111356', '252451', '20'), +('14', '104', '20', '111352', '251443', '20'), +('14', '104', '20', '111351', '251191', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '104', '12', '56035', '153284', '20'), +('14', '104', '12', '56074', '152472', '20'), +('14', '104', '12', '104422', '130689', '20'), +('14', '104', '12', '49656', '100404', '20'), +('14', '104', '18', '56041', '163021', '20'), +('14', '104', '18', '62986', '160558', '20'), +('14', '104', '18', '104426', '136271', '20'), +('14', '104', '18', '54851', '102161', '20'), +('14', '104', '19', '81763', '158420', '20'), +('14', '104', '19', '62990', '158102', '20'), +('14', '104', '19', '56075', '157924', '20'), +('14', '104', '19', '56037', '157595', '20'), +('14', '104', '13', '111521', '255934', '20'), +('14', '104', '13', '111524', '243592', '20'), +('14', '104', '13', '111519', '243328', '20'), +('14', '104', '13', '111221', '226093', '20'), +('14', '104', '14', '111537', '253045', '20'), +('14', '104', '14', '111535', '252107', '20'), +('14', '104', '14', '111237', '221342', '20'), +('14', '104', '14', '111235', '220504', '20'), +('14', '104', '11', '133816', '330839', '20'), +('14', '104', '11', '111335', '251788', '20'), +('14', '104', '11', '111337', '251274', '20'), +('14', '104', '11', '111338', '249405', '20'), +('14', '105', '22', '12425', '0', '23'), +('14', '105', '22', '21807', '0', '23'), +('14', '105', '22', '39342', '0', '23'), +('14', '105', '22', '23597', '0', '23'), +('14', '105', '1', '98769', '418022', '23'), +('14', '105', '1', '111306', '252045', '23'), +('14', '105', '1', '111307', '251525', '23'), +('14', '105', '1', '111304', '251502', '23'), +('14', '105', '2', '94056', '157430', '23'), +('14', '105', '2', '62985', '157013', '23'), +('14', '105', '2', '104424', '134109', '23'), +('14', '105', '2', '54846', '101064', '23'), +('14', '105', '3', '111314', '252281', '23'), +('14', '105', '3', '111316', '250970', '23'), +('14', '105', '3', '111315', '250513', '23'), +('14', '105', '3', '111013', '220580', '23'), +('14', '105', '5', '111319', '252284', '23'), +('14', '105', '5', '111321', '251012', '23'), +('14', '105', '5', '111318', '250686', '23'), +('14', '105', '5', '111018', '220583', '23'), +('14', '105', '8', '111332', '252470', '23'), +('14', '105', '8', '111329', '252051', '23'), +('14', '105', '8', '111330', '250785', '23'), +('14', '105', '8', '111331', '250007', '23'), +('14', '105', '6', '111323', '252352', '23'), +('14', '105', '6', '111326', '251299', '23'), +('14', '105', '6', '111325', '251044', '23'), +('14', '105', '6', '111022', '220751', '23'), +('14', '105', '17', '56043', '163631', '23'), +('14', '105', '17', '56084', '162840', '23'), +('14', '105', '17', '104427', '139654', '23'), +('14', '105', '17', '54854', '105212', '23'), +('14', '105', '7', '56040', '155613', '23'), +('14', '105', '7', '56080', '155554', '23'), +('14', '105', '7', '104425', '133395', '23'), +('14', '105', '7', '54848', '100612', '23'), +('14', '105', '9', '67098', '260347', '23'), +('14', '105', '9', '56031', '152181', '23'), +('14', '105', '9', '56070', '152115', '23'), +('14', '105', '9', '62984', '151906', '23'), +('14', '105', '15', '111349', '253530', '23'), +('14', '105', '15', '111340', '252646', '23'), +('14', '105', '15', '111344', '252277', '23'), +('14', '105', '15', '111346', '251570', '23'), +('14', '105', '20', '128733', '326057', '23'), +('14', '105', '20', '111356', '252458', '23'), +('14', '105', '20', '111352', '251449', '23'), +('14', '105', '20', '111351', '251199', '23'), +('14', '105', '12', '56035', '153294', '23'), +('14', '105', '12', '56074', '152478', '23'), +('14', '105', '12', '104422', '130697', '23'), +('14', '105', '12', '49656', '100404', '23'), +('14', '105', '18', '56041', '163030', '23'), +('14', '105', '18', '62986', '160564', '23'), +('14', '105', '18', '104426', '136274', '23'), +('14', '105', '18', '54851', '102165', '23'), +('14', '105', '19', '81763', '158430', '23'), +('14', '105', '19', '62990', '158110', '23'), +('14', '105', '19', '56075', '157929', '23'), +('14', '105', '19', '56037', '157598', '23'), +('14', '105', '13', '111521', '255940', '23'), +('14', '105', '13', '111524', '243599', '23'), +('14', '105', '13', '111519', '243336', '23'), +('14', '105', '13', '111221', '226099', '23'), +('14', '105', '14', '111537', '253051', '23'), +('14', '105', '14', '111535', '252112', '23'), +('14', '105', '14', '111237', '221348', '23'), +('14', '105', '14', '111235', '220509', '23'), +('14', '105', '11', '133816', '330844', '23'), +('14', '105', '11', '111335', '251795', '23'), +('14', '105', '11', '111337', '251281', '23'), +('14', '105', '11', '111338', '249412', '23'), +('14', '105', '22', '12425', '0', '22'), +('14', '105', '22', '21807', '0', '22'), +('14', '105', '22', '39342', '0', '22'), +('14', '105', '22', '23597', '0', '22'), +('14', '105', '1', '98769', '418022', '22'), +('14', '105', '1', '111306', '252045', '22'), +('14', '105', '1', '111307', '251525', '22'), +('14', '105', '1', '111304', '251502', '22'), +('14', '105', '2', '94056', '157430', '22'), +('14', '105', '2', '62985', '157013', '22'), +('14', '105', '2', '104424', '134109', '22'), +('14', '105', '2', '54846', '101064', '22'), +('14', '105', '3', '111314', '252281', '22'), +('14', '105', '3', '111316', '250970', '22'), +('14', '105', '3', '111315', '250513', '22'), +('14', '105', '3', '111013', '220580', '22'), +('14', '105', '5', '111319', '252284', '22'), +('14', '105', '5', '111321', '251012', '22'), +('14', '105', '5', '111318', '250686', '22'), +('14', '105', '5', '111018', '220583', '22'), +('14', '105', '8', '111332', '252470', '22'), +('14', '105', '8', '111329', '252051', '22'), +('14', '105', '8', '111330', '250785', '22'), +('14', '105', '8', '111331', '250007', '22'), +('14', '105', '6', '111323', '252352', '22'), +('14', '105', '6', '111326', '251299', '22'), +('14', '105', '6', '111325', '251044', '22'), +('14', '105', '6', '111022', '220751', '22'), +('14', '105', '17', '56043', '163631', '22'), +('14', '105', '17', '56084', '162840', '22'), +('14', '105', '17', '104427', '139654', '22'), +('14', '105', '17', '54854', '105212', '22'), +('14', '105', '7', '56040', '155613', '22'), +('14', '105', '7', '56080', '155554', '22'), +('14', '105', '7', '104425', '133395', '22'), +('14', '105', '7', '54848', '100612', '22'), +('14', '105', '9', '67098', '260347', '22'), +('14', '105', '9', '56031', '152181', '22'), +('14', '105', '9', '56070', '152115', '22'), +('14', '105', '9', '62984', '151906', '22'), +('14', '105', '15', '111349', '253530', '22'), +('14', '105', '15', '111340', '252646', '22'), +('14', '105', '15', '111344', '252277', '22'), +('14', '105', '15', '111346', '251570', '22'), +('14', '105', '20', '128733', '326057', '22'), +('14', '105', '20', '111356', '252458', '22'), +('14', '105', '20', '111352', '251449', '22'), +('14', '105', '20', '111351', '251199', '22'), +('14', '105', '12', '56035', '153294', '22'), +('14', '105', '12', '56074', '152478', '22'), +('14', '105', '12', '104422', '130697', '22'), +('14', '105', '12', '49656', '100404', '22'), +('14', '105', '18', '56041', '163030', '22'), +('14', '105', '18', '62986', '160564', '22'), +('14', '105', '18', '104426', '136274', '22'), +('14', '105', '18', '54851', '102165', '22'), +('14', '105', '19', '81763', '158430', '22'), +('14', '105', '19', '62990', '158110', '22'), +('14', '105', '19', '56075', '157929', '22'), +('14', '105', '19', '56037', '157598', '22'), +('14', '105', '13', '111521', '255940', '22'), +('14', '105', '13', '111524', '243599', '22'), +('14', '105', '13', '111519', '243336', '22'), +('14', '105', '13', '111221', '226099', '22'), +('14', '105', '14', '111537', '253051', '22'), +('14', '105', '14', '111535', '252112', '22'), +('14', '105', '14', '111237', '221348', '22'), +('14', '105', '14', '111235', '220509', '22'), +('14', '105', '11', '133816', '330844', '22'), +('14', '105', '11', '111335', '251795', '22'), +('14', '105', '11', '111337', '251281', '22'), +('14', '105', '11', '111338', '249412', '22'), +('14', '105', '22', '12425', '0', '21'), +('14', '105', '22', '21807', '0', '21'), +('14', '105', '22', '39342', '0', '21'), +('14', '105', '22', '23597', '0', '21'), +('14', '105', '1', '98769', '418022', '21'), +('14', '105', '1', '111306', '252045', '21'), +('14', '105', '1', '111307', '251525', '21'), +('14', '105', '1', '111304', '251502', '21'), +('14', '105', '2', '94056', '157430', '21'), +('14', '105', '2', '62985', '157013', '21'), +('14', '105', '2', '104424', '134109', '21'), +('14', '105', '2', '54846', '101064', '21'), +('14', '105', '3', '111314', '252281', '21'), +('14', '105', '3', '111316', '250970', '21'), +('14', '105', '3', '111315', '250513', '21'), +('14', '105', '3', '111013', '220580', '21'), +('14', '105', '5', '111319', '252284', '21'), +('14', '105', '5', '111321', '251012', '21'), +('14', '105', '5', '111318', '250686', '21'), +('14', '105', '5', '111018', '220583', '21'), +('14', '105', '8', '111332', '252470', '21'), +('14', '105', '8', '111329', '252051', '21'), +('14', '105', '8', '111330', '250785', '21'), +('14', '105', '8', '111331', '250007', '21'), +('14', '105', '6', '111323', '252352', '21'), +('14', '105', '6', '111326', '251299', '21'), +('14', '105', '6', '111325', '251044', '21'), +('14', '105', '6', '111022', '220751', '21'), +('14', '105', '17', '56043', '163631', '21'), +('14', '105', '17', '56084', '162840', '21'), +('14', '105', '17', '104427', '139654', '21'), +('14', '105', '17', '54854', '105212', '21'), +('14', '105', '7', '56040', '155613', '21'), +('14', '105', '7', '56080', '155554', '21'), +('14', '105', '7', '104425', '133395', '21'), +('14', '105', '7', '54848', '100612', '21'), +('14', '105', '9', '67098', '260347', '21'), +('14', '105', '9', '56031', '152181', '21'), +('14', '105', '9', '56070', '152115', '21'), +('14', '105', '9', '62984', '151906', '21'), +('14', '105', '15', '111349', '253530', '21'), +('14', '105', '15', '111340', '252646', '21'), +('14', '105', '15', '111344', '252277', '21'), +('14', '105', '15', '111346', '251570', '21'), +('14', '105', '20', '128733', '326057', '21'), +('14', '105', '20', '111356', '252458', '21'), +('14', '105', '20', '111352', '251449', '21'), +('14', '105', '20', '111351', '251199', '21'), +('14', '105', '12', '56035', '153294', '21'), +('14', '105', '12', '56074', '152478', '21'), +('14', '105', '12', '104422', '130697', '21'), +('14', '105', '12', '49656', '100404', '21'), +('14', '105', '18', '56041', '163030', '21'), +('14', '105', '18', '62986', '160564', '21'), +('14', '105', '18', '104426', '136274', '21'), +('14', '105', '18', '54851', '102165', '21'), +('14', '105', '19', '81763', '158430', '21'), +('14', '105', '19', '62990', '158110', '21'), +('14', '105', '19', '56075', '157929', '21'), +('14', '105', '19', '56037', '157598', '21'), +('14', '105', '13', '111521', '255940', '21'), +('14', '105', '13', '111524', '243599', '21'), +('14', '105', '13', '111519', '243336', '21'), +('14', '105', '13', '111221', '226099', '21'), +('14', '105', '14', '111537', '253051', '21'), +('14', '105', '14', '111535', '252112', '21'), +('14', '105', '14', '111237', '221348', '21'), +('14', '105', '14', '111235', '220509', '21'), +('14', '105', '11', '133816', '330844', '21'), +('14', '105', '11', '111335', '251795', '21'), +('14', '105', '11', '111337', '251281', '21'), +('14', '105', '11', '111338', '249412', '21'), +('14', '106', '22', '12425', '0', '23'), +('14', '106', '22', '21807', '0', '23'), +('14', '106', '22', '39342', '0', '23'), +('14', '106', '22', '23597', '0', '23'), +('14', '106', '1', '98769', '418027', '23'), +('14', '106', '1', '111306', '252051', '23'), +('14', '106', '1', '111307', '251534', '23'), +('14', '106', '1', '111304', '251507', '23'), +('14', '106', '2', '94056', '157433', '23'), +('14', '106', '2', '62985', '157017', '23'), +('14', '106', '2', '104424', '134118', '23'), +('14', '106', '2', '54846', '101069', '23'), +('14', '106', '3', '111314', '252289', '23'), +('14', '106', '3', '111316', '250977', '23'), +('14', '106', '3', '111315', '250520', '23'), +('14', '106', '3', '111013', '220587', '23'), +('14', '106', '5', '111319', '252292', '23'), +('14', '106', '5', '111321', '251017', '23'), +('14', '106', '5', '111318', '250694', '23'), +('14', '106', '5', '111018', '220591', '23'), +('14', '106', '8', '111332', '252477', '23'), +('14', '106', '8', '111329', '252059', '23'), +('14', '106', '8', '111330', '250791', '23'), +('14', '106', '8', '111331', '250013', '23'), +('14', '106', '6', '111323', '252358', '23'), +('14', '106', '6', '111326', '251307', '23'), +('14', '106', '6', '111325', '251049', '23'), +('14', '106', '6', '111022', '220757', '23'), +('14', '106', '17', '56043', '163637', '23'), +('14', '106', '17', '56084', '162847', '23'), +('14', '106', '17', '104427', '139661', '23'), +('14', '106', '17', '54854', '105217', '23'), +('14', '106', '7', '56040', '155624', '23'), +('14', '106', '7', '56080', '155562', '23'), +('14', '106', '7', '104425', '133401', '23'), +('14', '106', '7', '54848', '100618', '23'), +('14', '106', '9', '67098', '260352', '23'), +('14', '106', '9', '56031', '152191', '23'), +('14', '106', '9', '56070', '152121', '23'), +('14', '106', '9', '62984', '151912', '23'), +('14', '106', '15', '111349', '253539', '23'), +('14', '106', '15', '111340', '252652', '23'), +('14', '106', '15', '111344', '252282', '23'), +('14', '106', '15', '111346', '251576', '23'), +('14', '106', '20', '128733', '326063', '23'), +('14', '106', '20', '111356', '252465', '23'), +('14', '106', '20', '111352', '251455', '23'), +('14', '106', '20', '111351', '251207', '23'), +('14', '106', '12', '56035', '153304', '23'), +('14', '106', '12', '56074', '152485', '23'), +('14', '106', '12', '104422', '130706', '23'), +('14', '106', '12', '49656', '100405', '23'), +('14', '106', '18', '56041', '163038', '23'), +('14', '106', '18', '62986', '160570', '23'), +('14', '106', '18', '104426', '136277', '23'), +('14', '106', '18', '54851', '102170', '23'), +('14', '106', '19', '81763', '158440', '23'), +('14', '106', '19', '62990', '158118', '23'), +('14', '106', '19', '56075', '157935', '23'), +('14', '106', '19', '56037', '157601', '23'), +('14', '106', '13', '111521', '255946', '23'), +('14', '106', '13', '111524', '243606', '23'), +('14', '106', '13', '111519', '243344', '23'), +('14', '106', '13', '111221', '226106', '23'), +('14', '106', '14', '111537', '253057', '23'), +('14', '106', '14', '111535', '252117', '23'), +('14', '106', '14', '111237', '221354', '23'), +('14', '106', '14', '111235', '220514', '23'), +('14', '106', '11', '133816', '330849', '23'), +('14', '106', '11', '111335', '251801', '23'), +('14', '106', '11', '111337', '251288', '23'), +('14', '106', '11', '111338', '249419', '23'), +('14', '107', '22', '12425', '0', '23'), +('14', '107', '22', '21807', '0', '23'), +('14', '107', '22', '39342', '0', '23'), +('14', '107', '22', '23597', '0', '23'), +('14', '107', '1', '98769', '418032', '23'), +('14', '107', '1', '111306', '252057', '23'), +('14', '107', '1', '111307', '251543', '23'), +('14', '107', '1', '111304', '251512', '23'), +('14', '107', '2', '94056', '157437', '23'), +('14', '107', '2', '62985', '157021', '23'), +('14', '107', '2', '104424', '134127', '23'), +('14', '107', '2', '54846', '101074', '23'), +('14', '107', '3', '111314', '252296', '23'), +('14', '107', '3', '111316', '250983', '23'), +('14', '107', '3', '111315', '250527', '23'), +('14', '107', '3', '111013', '220595', '23'), +('14', '107', '5', '111319', '252300', '23'), +('14', '107', '5', '111321', '251023', '23'), +('14', '107', '5', '111318', '250702', '23'), +('14', '107', '5', '111018', '220599', '23'), +('14', '107', '8', '111332', '252484', '23'), +('14', '107', '8', '111329', '252067', '23'), +('14', '107', '8', '111330', '250797', '23'), +('14', '107', '8', '111331', '250019', '23'), +('14', '107', '6', '111323', '252365', '23'), +('14', '107', '6', '111326', '251315', '23'), +('14', '107', '6', '111325', '251054', '23'), +('14', '107', '6', '111022', '220764', '23'), +('14', '107', '17', '56043', '163644', '23'), +('14', '107', '17', '56084', '162854', '23'), +('14', '107', '17', '104427', '139668', '23'), +('14', '107', '17', '54854', '105222', '23'), +('14', '107', '7', '56040', '155635', '23'), +('14', '107', '7', '56080', '155570', '23'), +('14', '107', '7', '104425', '133407', '23'), +('14', '107', '7', '54848', '100625', '23'), +('14', '107', '9', '67098', '260357', '23'), +('14', '107', '9', '56031', '152202', '23'), +('14', '107', '9', '56070', '152126', '23'), +('14', '107', '9', '62984', '151918', '23'), +('14', '107', '15', '111349', '253548', '23'), +('14', '107', '15', '111340', '252659', '23'), +('14', '107', '15', '111344', '252287', '23'), +('14', '107', '15', '111346', '251583', '23'), +('14', '107', '20', '128733', '326070', '23'), +('14', '107', '20', '111356', '252473', '23'), +('14', '107', '20', '111352', '251461', '23'), +('14', '107', '20', '111351', '251215', '23'), +('14', '107', '12', '56035', '153314', '23'), +('14', '107', '12', '56074', '152491', '23'), +('14', '107', '12', '104422', '130714', '23'), +('14', '107', '12', '49656', '100406', '23'), +('14', '107', '18', '56041', '163047', '23'), +('14', '107', '18', '62986', '160576', '23'), +('14', '107', '18', '104426', '136279', '23'), +('14', '107', '18', '54851', '102174', '23'), +('14', '107', '19', '81763', '158451', '23'), +('14', '107', '19', '62990', '158126', '23'), +('14', '107', '19', '56075', '157940', '23'), +('14', '107', '19', '56037', '157604', '23'), +('14', '107', '13', '111521', '255952', '23'), +('14', '107', '13', '111524', '243614', '23'), +('14', '107', '13', '111519', '243352', '23'), +('14', '107', '13', '111221', '226112', '23'), +('14', '107', '14', '111537', '253063', '23'), +('14', '107', '14', '111535', '252122', '23'), +('14', '107', '14', '111237', '221360', '23'), +('14', '107', '14', '111235', '220519', '23'), +('14', '107', '11', '133816', '330853', '23'), +('14', '107', '11', '111335', '251808', '23'), +('14', '107', '11', '111337', '251294', '23'), +('14', '107', '11', '111338', '249426', '23'), +('14', '108', '22', '12425', '0', '23'), +('14', '108', '22', '21807', '0', '23'), +('14', '108', '22', '39342', '0', '23'), +('14', '108', '22', '23597', '0', '23'), +('14', '108', '1', '98769', '418036', '23'), +('14', '108', '1', '111306', '252064', '23'), +('14', '108', '1', '111307', '251552', '23'), +('14', '108', '1', '111304', '251518', '23'), +('14', '108', '2', '94056', '157441', '23'), +('14', '108', '2', '62985', '157026', '23'), +('14', '108', '2', '104424', '134136', '23'), +('14', '108', '2', '54846', '101079', '23'), +('14', '108', '3', '111314', '252303', '23'), +('14', '108', '3', '111316', '250990', '23'), +('14', '108', '3', '111315', '250534', '23'), +('14', '108', '3', '111013', '220602', '23'), +('14', '108', '5', '111319', '252308', '23'), +('14', '108', '5', '111321', '251029', '23'), +('14', '108', '5', '111318', '250710', '23'), +('14', '108', '5', '111018', '220607', '23'), +('14', '108', '8', '111332', '252491', '23'), +('14', '108', '8', '111329', '252076', '23'), +('14', '108', '8', '111330', '250803', '23'), +('14', '108', '8', '111331', '250025', '23'), +('14', '108', '6', '111323', '252371', '23'), +('14', '108', '6', '111326', '251323', '23'), +('14', '108', '6', '111325', '251060', '23'), +('14', '108', '6', '111022', '220770', '23'), +('14', '108', '17', '56043', '163650', '23'), +('14', '108', '17', '56084', '162861', '23'), +('14', '108', '17', '104427', '139675', '23'), +('14', '108', '17', '54854', '105227', '23'), +('14', '108', '7', '56040', '155645', '23'), +('14', '108', '7', '56080', '155578', '23'), +('14', '108', '7', '104425', '133413', '23'), +('14', '108', '7', '54848', '100631', '23'), +('14', '108', '9', '67098', '260362', '23'), +('14', '108', '9', '56031', '152212', '23'), +('14', '108', '9', '56070', '152132', '23'), +('14', '108', '9', '62984', '151923', '23'), +('14', '108', '15', '111349', '253556', '23'), +('14', '108', '15', '111340', '252665', '23'), +('14', '108', '15', '111344', '252293', '23'), +('14', '108', '15', '111346', '251589', '23'), +('14', '108', '20', '128733', '326076', '23'), +('14', '108', '20', '111356', '252480', '23'), +('14', '108', '20', '111352', '251467', '23'), +('14', '108', '20', '111351', '251222', '23'), +('14', '108', '12', '56035', '153323', '23'), +('14', '108', '12', '56074', '152498', '23'), +('14', '108', '12', '104422', '130722', '23'), +('14', '108', '12', '49656', '100407', '23'), +('14', '108', '18', '56041', '163056', '23'), +('14', '108', '18', '62986', '160582', '23'), +('14', '108', '18', '104426', '136282', '23'), +('14', '108', '18', '54851', '102179', '23'), +('14', '108', '19', '81763', '158461', '23'), +('14', '108', '19', '62990', '158134', '23'), +('14', '108', '19', '56075', '157945', '23'), +('14', '108', '19', '56037', '157607', '23'), +('14', '108', '13', '111521', '255958', '23'), +('14', '108', '13', '111524', '243621', '23'), +('14', '108', '13', '111519', '243360', '23'), +('14', '108', '13', '111221', '226119', '23'), +('14', '108', '14', '111537', '253068', '23'), +('14', '108', '14', '111535', '252126', '23'), +('14', '108', '14', '111237', '221365', '23'), +('14', '108', '14', '111235', '220523', '23'), +('14', '108', '11', '133816', '330858', '23'), +('14', '108', '11', '111335', '251814', '23'), +('14', '108', '11', '111337', '251301', '23'), +('14', '108', '11', '111338', '249432', '23'), +('14', '109', '22', '12425', '0', '23'), +('14', '109', '22', '21807', '0', '23'), +('14', '109', '22', '39342', '0', '23'), +('14', '109', '22', '23597', '0', '23'), +('14', '109', '1', '98769', '418041', '23'), +('14', '109', '1', '111306', '252070', '23'), +('14', '109', '1', '111307', '251561', '23'), +('14', '109', '1', '111304', '251523', '23'), +('14', '109', '2', '94056', '157445', '23'), +('14', '109', '2', '62985', '157030', '23'), +('14', '109', '2', '104424', '134145', '23'), +('14', '109', '2', '54846', '101084', '23'), +('14', '109', '3', '111314', '252310', '23'), +('14', '109', '3', '111316', '250997', '23'), +('14', '109', '3', '111315', '250541', '23'), +('14', '109', '3', '111013', '220609', '23'), +('14', '109', '5', '111319', '252316', '23'), +('14', '109', '5', '111321', '251034', '23'), +('14', '109', '5', '111318', '250718', '23'), +('14', '109', '5', '111018', '220615', '23'), +('14', '109', '8', '111332', '252498', '23'), +('14', '109', '8', '111329', '252084', '23'), +('14', '109', '8', '111330', '250809', '23'), +('14', '109', '8', '111331', '250031', '23'), +('14', '109', '6', '111323', '252377', '23'), +('14', '109', '6', '111326', '251332', '23'), +('14', '109', '6', '111325', '251065', '23'), +('14', '109', '6', '111022', '220776', '23'), +('14', '109', '17', '56043', '163656', '23'), +('14', '109', '17', '56084', '162868', '23'), +('14', '109', '17', '104427', '139682', '23'), +('14', '109', '17', '54854', '105232', '23'), +('14', '109', '7', '56040', '155656', '23'), +('14', '109', '7', '56080', '155585', '23'), +('14', '109', '7', '104425', '133419', '23'), +('14', '109', '7', '54848', '100638', '23'), +('14', '109', '9', '67098', '260367', '23'), +('14', '109', '9', '56031', '152223', '23'), +('14', '109', '9', '56070', '152137', '23'), +('14', '109', '9', '62984', '151929', '23'), +('14', '109', '15', '111349', '253565', '23'), +('14', '109', '15', '111340', '252671', '23'), +('14', '109', '15', '111344', '252298', '23'), +('14', '109', '15', '111346', '251596', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '109', '20', '128733', '326083', '23'), +('14', '109', '20', '111356', '252487', '23'), +('14', '109', '20', '111352', '251473', '23'), +('14', '109', '20', '111351', '251230', '23'), +('14', '109', '12', '56035', '153333', '23'), +('14', '109', '12', '56074', '152504', '23'), +('14', '109', '12', '104422', '130731', '23'), +('14', '109', '12', '49656', '100408', '23'), +('14', '109', '18', '56041', '163064', '23'), +('14', '109', '18', '62986', '160587', '23'), +('14', '109', '18', '104426', '136285', '23'), +('14', '109', '18', '54851', '102184', '23'), +('14', '109', '19', '81763', '158472', '23'), +('14', '109', '19', '62990', '158143', '23'), +('14', '109', '19', '56075', '157950', '23'), +('14', '109', '19', '56037', '157610', '23'), +('14', '109', '13', '111521', '255964', '23'), +('14', '109', '13', '111524', '243628', '23'), +('14', '109', '13', '111519', '243368', '23'), +('14', '109', '13', '111221', '226125', '23'), +('14', '109', '14', '111537', '253074', '23'), +('14', '109', '14', '111535', '252131', '23'), +('14', '109', '14', '111237', '221371', '23'), +('14', '109', '14', '111235', '220528', '23'), +('14', '109', '11', '133816', '330862', '23'), +('14', '109', '11', '111335', '251820', '23'), +('14', '109', '11', '111337', '251308', '23'), +('14', '109', '11', '111338', '249439', '23'), +('14', '110', '22', '12425', '0', '25'), +('14', '110', '22', '39342', '0', '25'), +('14', '110', '22', '7867', '0', '25'), +('14', '110', '22', '53550', '0', '25'), +('14', '110', '1', '98769', '418046', '25'), +('14', '110', '1', '111306', '252076', '25'), +('14', '110', '1', '111307', '251571', '25'), +('14', '110', '1', '111304', '251528', '25'), +('14', '110', '2', '94056', '157449', '25'), +('14', '110', '2', '62985', '157034', '25'), +('14', '110', '2', '104424', '134154', '25'), +('14', '110', '2', '54846', '101089', '25'), +('14', '110', '3', '111314', '252318', '25'), +('14', '110', '3', '111316', '251004', '25'), +('14', '110', '3', '111315', '250548', '25'), +('14', '110', '3', '111013', '220616', '25'), +('14', '110', '5', '111319', '252324', '25'), +('14', '110', '5', '111321', '251040', '25'), +('14', '110', '5', '111318', '250726', '25'), +('14', '110', '5', '111018', '220623', '25'), +('14', '110', '8', '111332', '252505', '25'), +('14', '110', '8', '111329', '252092', '25'), +('14', '110', '8', '111330', '250815', '25'), +('14', '110', '8', '111331', '250037', '25'), +('14', '110', '6', '111323', '252384', '25'), +('14', '110', '6', '111326', '251340', '25'), +('14', '110', '6', '111325', '251070', '25'), +('14', '110', '6', '111022', '220783', '25'), +('14', '110', '17', '56043', '163663', '25'), +('14', '110', '17', '56084', '162875', '25'), +('14', '110', '17', '104427', '139689', '25'), +('14', '110', '17', '54854', '105237', '25'), +('14', '110', '7', '56040', '155667', '25'), +('14', '110', '7', '56080', '155593', '25'), +('14', '110', '7', '104425', '133425', '25'), +('14', '110', '7', '54848', '100644', '25'), +('14', '110', '9', '67098', '260371', '25'), +('14', '110', '9', '56031', '152233', '25'), +('14', '110', '9', '56070', '152143', '25'), +('14', '110', '9', '62984', '151935', '25'), +('14', '110', '15', '111349', '253574', '25'), +('14', '110', '15', '111340', '252677', '25'), +('14', '110', '15', '111344', '252303', '25'), +('14', '110', '15', '111346', '251602', '25'), +('14', '110', '20', '128733', '326089', '25'), +('14', '110', '20', '111356', '252494', '25'), +('14', '110', '20', '111352', '251479', '25'), +('14', '110', '20', '111351', '251238', '25'), +('14', '110', '12', '56035', '153343', '25'), +('14', '110', '12', '56074', '152510', '25'), +('14', '110', '12', '104422', '130739', '25'), +('14', '110', '12', '49656', '100409', '25'), +('14', '110', '18', '56041', '163073', '25'), +('14', '110', '18', '62986', '160593', '25'), +('14', '110', '18', '104426', '136288', '25'), +('14', '110', '18', '54851', '102188', '25'), +('14', '110', '19', '81763', '158482', '25'), +('14', '110', '19', '62990', '158151', '25'), +('14', '110', '19', '56075', '157956', '25'), +('14', '110', '19', '56037', '157613', '25'), +('14', '110', '13', '111521', '255971', '25'), +('14', '110', '13', '111524', '243636', '25'), +('14', '110', '13', '111519', '243377', '25'), +('14', '110', '13', '111221', '226132', '25'), +('14', '110', '14', '111537', '253080', '25'), +('14', '110', '14', '111535', '252136', '25'), +('14', '110', '14', '111237', '221377', '25'), +('14', '110', '14', '111235', '220533', '25'), +('14', '110', '11', '85213', '375613', '25'), +('14', '110', '11', '133816', '330867', '25'), +('14', '110', '11', '111335', '251827', '25'), +('14', '110', '11', '111337', '251314', '25'), +('14', '110', '22', '12425', '0', '24'), +('14', '110', '22', '39342', '0', '24'), +('14', '110', '22', '7867', '0', '24'), +('14', '110', '22', '53550', '0', '24'), +('14', '110', '1', '98769', '418046', '24'), +('14', '110', '1', '111306', '252076', '24'), +('14', '110', '1', '111307', '251571', '24'), +('14', '110', '1', '111304', '251528', '24'), +('14', '110', '2', '94056', '157449', '24'), +('14', '110', '2', '62985', '157034', '24'), +('14', '110', '2', '104424', '134154', '24'), +('14', '110', '2', '54846', '101089', '24'), +('14', '110', '3', '111314', '252318', '24'), +('14', '110', '3', '111316', '251004', '24'), +('14', '110', '3', '111315', '250548', '24'), +('14', '110', '3', '111013', '220616', '24'), +('14', '110', '5', '111319', '252324', '24'), +('14', '110', '5', '111321', '251040', '24'), +('14', '110', '5', '111318', '250726', '24'), +('14', '110', '5', '111018', '220623', '24'), +('14', '110', '8', '111332', '252505', '24'), +('14', '110', '8', '111329', '252092', '24'), +('14', '110', '8', '111330', '250815', '24'), +('14', '110', '8', '111331', '250037', '24'), +('14', '110', '6', '111323', '252384', '24'), +('14', '110', '6', '111326', '251340', '24'), +('14', '110', '6', '111325', '251070', '24'), +('14', '110', '6', '111022', '220783', '24'), +('14', '110', '17', '56043', '163663', '24'), +('14', '110', '17', '56084', '162875', '24'), +('14', '110', '17', '104427', '139689', '24'), +('14', '110', '17', '54854', '105237', '24'), +('14', '110', '7', '56040', '155667', '24'), +('14', '110', '7', '56080', '155593', '24'), +('14', '110', '7', '104425', '133425', '24'), +('14', '110', '7', '54848', '100644', '24'), +('14', '110', '9', '67098', '260371', '24'), +('14', '110', '9', '56031', '152233', '24'), +('14', '110', '9', '56070', '152143', '24'), +('14', '110', '9', '62984', '151935', '24'), +('14', '110', '15', '111349', '253574', '24'), +('14', '110', '15', '111340', '252677', '24'), +('14', '110', '15', '111344', '252303', '24'), +('14', '110', '15', '111346', '251602', '24'), +('14', '110', '20', '128733', '326089', '24'), +('14', '110', '20', '111356', '252494', '24'), +('14', '110', '20', '111352', '251479', '24'), +('14', '110', '20', '111351', '251238', '24'), +('14', '110', '12', '56035', '153343', '24'), +('14', '110', '12', '56074', '152510', '24'), +('14', '110', '12', '104422', '130739', '24'), +('14', '110', '12', '49656', '100409', '24'), +('14', '110', '18', '56041', '163073', '24'), +('14', '110', '18', '62986', '160593', '24'), +('14', '110', '18', '104426', '136288', '24'), +('14', '110', '18', '54851', '102188', '24'), +('14', '110', '19', '81763', '158482', '24'), +('14', '110', '19', '62990', '158151', '24'), +('14', '110', '19', '56075', '157956', '24'), +('14', '110', '19', '56037', '157613', '24'), +('14', '110', '13', '111521', '255971', '24'), +('14', '110', '13', '111524', '243636', '24'), +('14', '110', '13', '111519', '243377', '24'), +('14', '110', '13', '111221', '226132', '24'), +('14', '110', '14', '111537', '253080', '24'), +('14', '110', '14', '111535', '252136', '24'), +('14', '110', '14', '111237', '221377', '24'), +('14', '110', '14', '111235', '220533', '24'), +('14', '110', '11', '85213', '375613', '24'), +('14', '110', '11', '133816', '330867', '24'), +('14', '110', '11', '111335', '251827', '24'), +('14', '110', '11', '111337', '251314', '24'), +('14', '111', '22', '12425', '0', '25'), +('14', '111', '22', '39342', '0', '25'), +('14', '111', '22', '7867', '0', '25'), +('14', '111', '22', '53550', '0', '25'), +('14', '111', '1', '98769', '418051', '25'), +('14', '111', '1', '111306', '252082', '25'), +('14', '111', '1', '111307', '251580', '25'), +('14', '111', '1', '111304', '251534', '25'), +('14', '111', '2', '94056', '157453', '25'), +('14', '111', '2', '62985', '157038', '25'), +('14', '111', '2', '104424', '134162', '25'), +('14', '111', '2', '54846', '101095', '25'), +('14', '111', '3', '111314', '252325', '25'), +('14', '111', '3', '111316', '251010', '25'), +('14', '111', '3', '111315', '250555', '25'), +('14', '111', '3', '111013', '220624', '25'), +('14', '111', '5', '111319', '252331', '25'), +('14', '111', '5', '111321', '251046', '25'), +('14', '111', '5', '111318', '250734', '25'), +('14', '111', '5', '111018', '220630', '25'), +('14', '111', '8', '111332', '252513', '25'), +('14', '111', '8', '111329', '252100', '25'), +('14', '111', '8', '111330', '250821', '25'), +('14', '111', '8', '111331', '250043', '25'), +('14', '111', '6', '111323', '252390', '25'), +('14', '111', '6', '111326', '251348', '25'), +('14', '111', '6', '111325', '251075', '25'), +('14', '111', '6', '111022', '220789', '25'), +('14', '111', '17', '56043', '163669', '25'), +('14', '111', '17', '56084', '162882', '25'), +('14', '111', '17', '104427', '139695', '25'), +('14', '111', '17', '54854', '105242', '25'), +('14', '111', '7', '56040', '155678', '25'), +('14', '111', '7', '56080', '155601', '25'), +('14', '111', '7', '104425', '133431', '25'), +('14', '111', '7', '54848', '100651', '25'), +('14', '111', '9', '67098', '260376', '25'), +('14', '111', '9', '56031', '152243', '25'), +('14', '111', '9', '56070', '152148', '25'), +('14', '111', '9', '62984', '151941', '25'), +('14', '111', '15', '111349', '253583', '25'), +('14', '111', '15', '111340', '252683', '25'), +('14', '111', '15', '111344', '252308', '25'), +('14', '111', '15', '111346', '251609', '25'), +('14', '111', '20', '128733', '326096', '25'), +('14', '111', '20', '111356', '252501', '25'), +('14', '111', '20', '111352', '251485', '25'), +('14', '111', '20', '111351', '251246', '25'), +('14', '111', '12', '56035', '153353', '25'), +('14', '111', '12', '56074', '152517', '25'), +('14', '111', '12', '104422', '130747', '25'), +('14', '111', '12', '49656', '100410', '25'), +('14', '111', '18', '56041', '163082', '25'), +('14', '111', '18', '62986', '160599', '25'), +('14', '111', '18', '104426', '136290', '25'), +('14', '111', '18', '54851', '102193', '25'), +('14', '111', '19', '81763', '158492', '25'), +('14', '111', '19', '62990', '158159', '25'), +('14', '111', '19', '56075', '157961', '25'), +('14', '111', '19', '56037', '157617', '25'), +('14', '111', '13', '111521', '255976', '25'), +('14', '111', '13', '111524', '243643', '25'), +('14', '111', '13', '111519', '243385', '25'), +('14', '111', '13', '111221', '226139', '25'), +('14', '111', '14', '111537', '253086', '25'), +('14', '111', '14', '111535', '252140', '25'), +('14', '111', '14', '111237', '221383', '25'), +('14', '111', '14', '111235', '220537', '25'), +('14', '111', '11', '85213', '375618', '25'), +('14', '111', '11', '133816', '330872', '25'), +('14', '111', '11', '111335', '251833', '25'), +('14', '111', '11', '111337', '251321', '25'), +('14', '112', '22', '12425', '0', '25'), +('14', '112', '22', '39342', '0', '25'), +('14', '112', '22', '7867', '0', '25'), +('14', '112', '22', '53550', '0', '25'), +('14', '112', '1', '98769', '418055', '25'), +('14', '112', '1', '111306', '252088', '25'), +('14', '112', '1', '111307', '251589', '25'), +('14', '112', '1', '111304', '251539', '25'), +('14', '112', '2', '94056', '157457', '25'), +('14', '112', '2', '62985', '157042', '25'), +('14', '112', '2', '104424', '134171', '25'), +('14', '112', '2', '54846', '101100', '25'), +('14', '112', '3', '111314', '252332', '25'), +('14', '112', '3', '111316', '251017', '25'), +('14', '112', '3', '111315', '250562', '25'), +('14', '112', '3', '111013', '220631', '25'), +('14', '112', '5', '111319', '252339', '25'), +('14', '112', '5', '111321', '251052', '25'), +('14', '112', '5', '111318', '250742', '25'), +('14', '112', '5', '111018', '220638', '25'), +('14', '112', '8', '111332', '252520', '25'), +('14', '112', '8', '111329', '252109', '25'), +('14', '112', '8', '111330', '250827', '25'), +('14', '112', '8', '111331', '250049', '25'), +('14', '112', '6', '111323', '252397', '25'), +('14', '112', '6', '111326', '251357', '25'), +('14', '112', '6', '111325', '251080', '25'), +('14', '112', '6', '111022', '220796', '25'), +('14', '112', '17', '56043', '163675', '25'), +('14', '112', '17', '56084', '162889', '25'), +('14', '112', '17', '104427', '139702', '25'), +('14', '112', '17', '54854', '105247', '25'), +('14', '112', '7', '56040', '155689', '25'), +('14', '112', '7', '56080', '155609', '25'), +('14', '112', '7', '104425', '133437', '25'), +('14', '112', '7', '54848', '100657', '25'), +('14', '112', '9', '67098', '260381', '25'), +('14', '112', '9', '56031', '152254', '25'), +('14', '112', '9', '56070', '152154', '25'), +('14', '112', '9', '62984', '151946', '25'), +('14', '112', '15', '111349', '253591', '25'), +('14', '112', '15', '111340', '252689', '25'), +('14', '112', '15', '111344', '252314', '25'), +('14', '112', '15', '111346', '251615', '25'), +('14', '112', '20', '128733', '326102', '25'), +('14', '112', '20', '111356', '252508', '25'), +('14', '112', '20', '111352', '251491', '25'), +('14', '112', '20', '111351', '251254', '25'), +('14', '112', '12', '56035', '153363', '25'), +('14', '112', '12', '56074', '152523', '25'), +('14', '112', '12', '104422', '130755', '25'), +('14', '112', '12', '49656', '100411', '25'), +('14', '112', '18', '56041', '163091', '25'), +('14', '112', '18', '62986', '160605', '25'), +('14', '112', '18', '104426', '136293', '25'), +('14', '112', '18', '54851', '102198', '25'), +('14', '112', '19', '81763', '158503', '25'), +('14', '112', '19', '62990', '158167', '25'), +('14', '112', '19', '56075', '157966', '25'), +('14', '112', '19', '56037', '157620', '25'), +('14', '112', '13', '111521', '255982', '25'), +('14', '112', '13', '111524', '243650', '25'), +('14', '112', '13', '111519', '243393', '25'), +('14', '112', '13', '111221', '226145', '25'), +('14', '112', '14', '111537', '253092', '25'), +('14', '112', '14', '111535', '252145', '25'), +('14', '112', '14', '111237', '221389', '25'), +('14', '112', '14', '111235', '220542', '25'), +('14', '112', '11', '85213', '375623', '25'), +('14', '112', '11', '133816', '330876', '25'), +('14', '112', '11', '111335', '251840', '25'), +('14', '112', '11', '111337', '251328', '25'), +('14', '113', '22', '12425', '0', '25'), +('14', '113', '22', '39342', '0', '25'), +('14', '113', '22', '7867', '0', '25'), +('14', '113', '22', '53550', '0', '25'), +('14', '113', '1', '98769', '418060', '25'), +('14', '113', '1', '111306', '252094', '25'), +('14', '113', '1', '111307', '251598', '25'), +('14', '113', '1', '111304', '251544', '25'), +('14', '113', '2', '94056', '157460', '25'), +('14', '113', '2', '62985', '157047', '25'), +('14', '113', '2', '104424', '134180', '25'), +('14', '113', '2', '54846', '101105', '25'), +('14', '113', '3', '111314', '252339', '25'), +('14', '113', '3', '111316', '251024', '25'), +('14', '113', '3', '111315', '250569', '25'), +('14', '113', '3', '111013', '220638', '25'), +('14', '113', '5', '111319', '252347', '25'), +('14', '113', '5', '111321', '251057', '25'), +('14', '113', '5', '111318', '250750', '25'), +('14', '113', '5', '111018', '220646', '25'), +('14', '113', '8', '111332', '252527', '25'), +('14', '113', '8', '111329', '252117', '25'), +('14', '113', '8', '111330', '250833', '25'), +('14', '113', '8', '111331', '250055', '25'), +('14', '113', '6', '111323', '252403', '25'), +('14', '113', '6', '111326', '251365', '25'), +('14', '113', '6', '111325', '251086', '25'), +('14', '113', '6', '111022', '220802', '25'), +('14', '113', '17', '56043', '163681', '25'), +('14', '113', '17', '56084', '162896', '25'), +('14', '113', '17', '104427', '139709', '25'), +('14', '113', '17', '54854', '105253', '25'), +('14', '113', '7', '56040', '155700', '25'), +('14', '113', '7', '56080', '155616', '25'), +('14', '113', '7', '104425', '133442', '25'), +('14', '113', '7', '54848', '100664', '25'), +('14', '113', '9', '67098', '260386', '25'), +('14', '113', '9', '56031', '152264', '25'), +('14', '113', '9', '56070', '152160', '25'), +('14', '113', '9', '62984', '151952', '25'), +('14', '113', '15', '111349', '253600', '25'), +('14', '113', '15', '111340', '252695', '25'), +('14', '113', '15', '111344', '252319', '25'), +('14', '113', '15', '111346', '251621', '25'), +('14', '113', '20', '128733', '326109', '25'), +('14', '113', '20', '111356', '252516', '25'), +('14', '113', '20', '111352', '251497', '25'), +('14', '113', '20', '111351', '251262', '25'), +('14', '113', '12', '56035', '153373', '25'), +('14', '113', '12', '56074', '152530', '25'), +('14', '113', '12', '104422', '130764', '25'), +('14', '113', '12', '49656', '100412', '25'), +('14', '113', '18', '56041', '163099', '25'), +('14', '113', '18', '62986', '160611', '25'), +('14', '113', '18', '104426', '136296', '25'), +('14', '113', '18', '54851', '102202', '25'), +('14', '113', '19', '81763', '158513', '25'), +('14', '113', '19', '62990', '158175', '25'), +('14', '113', '19', '56075', '157972', '25'), +('14', '113', '19', '56037', '157623', '25'), +('14', '113', '13', '111521', '255988', '25'), +('14', '113', '13', '111524', '243658', '25'), +('14', '113', '13', '111519', '243401', '25'), +('14', '113', '13', '111221', '226152', '25'), +('14', '113', '14', '111537', '253098', '25'), +('14', '113', '14', '111535', '252150', '25'), +('14', '113', '14', '111237', '221395', '25'), +('14', '113', '14', '111235', '220547', '25'), +('14', '113', '11', '85213', '375627', '25'), +('14', '113', '11', '133816', '330881', '25'), +('14', '113', '11', '111335', '251846', '25'), +('14', '113', '11', '111337', '251334', '25'), +('14', '114', '22', '12425', '0', '25'), +('14', '114', '22', '39342', '0', '25'), +('14', '114', '22', '7867', '0', '25'), +('14', '114', '22', '53550', '0', '25'), +('14', '114', '1', '98769', '418065', '25'), +('14', '114', '1', '111306', '252100', '25'), +('14', '114', '1', '111307', '251607', '25'), +('14', '114', '1', '111304', '251550', '25'), +('14', '114', '2', '94056', '157464', '25'), +('14', '114', '2', '62985', '157051', '25'), +('14', '114', '2', '104424', '134189', '25'), +('14', '114', '2', '54846', '101110', '25'), +('14', '114', '3', '111314', '252346', '25'), +('14', '114', '3', '111316', '251030', '25'), +('14', '114', '3', '111315', '250576', '25'), +('14', '114', '3', '111013', '220645', '25'), +('14', '114', '5', '111319', '252355', '25'), +('14', '114', '5', '111321', '251063', '25'), +('14', '114', '5', '111318', '250758', '25'), +('14', '114', '5', '111018', '220654', '25'), +('14', '114', '8', '111332', '252534', '25'), +('14', '114', '8', '111329', '252125', '25'), +('14', '114', '8', '111330', '250839', '25'), +('14', '114', '8', '111331', '250061', '25'), +('14', '114', '6', '111323', '252410', '25'), +('14', '114', '6', '111326', '251373', '25'), +('14', '114', '6', '111325', '251091', '25'), +('14', '114', '6', '111022', '220809', '25'), +('14', '114', '17', '56043', '163688', '25'), +('14', '114', '17', '56084', '162903', '25'), +('14', '114', '17', '104427', '139716', '25'), +('14', '114', '17', '54854', '105258', '25'), +('14', '114', '7', '56040', '155710', '25'), +('14', '114', '7', '56080', '155624', '25'), +('14', '114', '7', '104425', '133448', '25'), +('14', '114', '7', '54848', '100670', '25'), +('14', '114', '9', '67098', '260391', '25'), +('14', '114', '9', '56031', '152275', '25'), +('14', '114', '9', '56070', '152165', '25'), +('14', '114', '9', '62984', '151958', '25'), +('14', '114', '15', '111349', '253609', '25'), +('14', '114', '15', '111340', '252701', '25'), +('14', '114', '15', '111344', '252324', '25'), +('14', '114', '15', '111346', '251628', '25'), +('14', '114', '20', '128733', '326115', '25'), +('14', '114', '20', '111356', '252523', '25'), +('14', '114', '20', '111352', '251503', '25'), +('14', '114', '20', '111351', '251270', '25'), +('14', '114', '12', '56035', '153382', '25'), +('14', '114', '12', '56074', '152536', '25'), +('14', '114', '12', '104422', '130772', '25'), +('14', '114', '12', '49656', '100412', '25'), +('14', '114', '18', '56041', '163108', '25'), +('14', '114', '18', '62986', '160617', '25'), +('14', '114', '18', '104426', '136299', '25'), +('14', '114', '18', '54851', '102207', '25'), +('14', '114', '19', '81763', '158523', '25'), +('14', '114', '19', '62990', '158183', '25'), +('14', '114', '19', '56075', '157977', '25'), +('14', '114', '19', '56037', '157626', '25'), +('14', '114', '13', '111521', '255994', '25'), +('14', '114', '13', '111524', '243665', '25'), +('14', '114', '13', '111519', '243409', '25'), +('14', '114', '13', '111221', '226158', '25'), +('14', '114', '14', '111537', '253103', '25'), +('14', '114', '14', '111535', '252154', '25'), +('14', '114', '14', '111237', '221400', '25'), +('14', '114', '14', '111235', '220551', '25'), +('14', '114', '11', '85213', '375632', '25'), +('14', '114', '11', '133816', '330886', '25'), +('14', '114', '11', '111335', '251853', '25'), +('14', '114', '11', '111337', '251341', '25'), +('14', '115', '22', '12425', '0', '26'), +('14', '115', '22', '39342', '0', '26'), +('14', '115', '22', '7867', '0', '26'), +('14', '115', '22', '53550', '0', '26'), +('14', '115', '1', '98769', '418070', '26'), +('14', '115', '1', '111306', '252106', '26'), +('14', '115', '1', '111307', '251616', '26'), +('14', '115', '1', '111304', '251555', '26'), +('14', '115', '2', '94056', '157468', '26'), +('14', '115', '2', '62985', '157055', '26'), +('14', '115', '2', '104424', '134198', '26'), +('14', '115', '2', '54846', '101115', '26'), +('14', '115', '3', '111314', '252354', '26'), +('14', '115', '3', '111316', '251037', '26'), +('14', '115', '3', '111315', '250583', '26'), +('14', '115', '3', '111013', '220652', '26'), +('14', '115', '5', '111319', '252363', '26'), +('14', '115', '5', '111321', '251069', '26'), +('14', '115', '5', '111318', '250766', '26'), +('14', '115', '5', '111018', '220662', '26'), +('14', '115', '8', '111332', '252541', '26'), +('14', '115', '8', '111329', '252134', '26'), +('14', '115', '8', '111330', '250845', '26'), +('14', '115', '8', '111331', '250067', '26'), +('14', '115', '6', '111323', '252416', '26'), +('14', '115', '6', '111326', '251381', '26'), +('14', '115', '6', '111325', '251096', '26'), +('14', '115', '6', '111022', '220815', '26'), +('14', '115', '17', '56043', '163694', '26'), +('14', '115', '17', '56084', '162910', '26'), +('14', '115', '17', '104427', '139723', '26'), +('14', '115', '17', '54854', '105263', '26'), +('14', '115', '7', '56040', '155721', '26'), +('14', '115', '7', '56080', '155632', '26'), +('14', '115', '7', '104425', '133454', '26'), +('14', '115', '7', '54848', '100677', '26'), +('14', '115', '9', '67098', '260396', '26'), +('14', '115', '9', '56031', '152285', '26'), +('14', '115', '9', '56070', '152171', '26'), +('14', '115', '9', '62984', '151963', '26'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('14', '115', '15', '111349', '253617', '26'), +('14', '115', '15', '111340', '252707', '26'), +('14', '115', '15', '111344', '252329', '26'), +('14', '115', '15', '111346', '251634', '26'), +('14', '115', '20', '128733', '326122', '26'), +('14', '115', '20', '111356', '252530', '26'), +('14', '115', '20', '111352', '251509', '26'), +('14', '115', '20', '111351', '251277', '26'), +('14', '115', '12', '56035', '153392', '26'), +('14', '115', '12', '56074', '152542', '26'), +('14', '115', '12', '104422', '130780', '26'), +('14', '115', '12', '49656', '100413', '26'), +('14', '115', '18', '56041', '163117', '26'), +('14', '115', '18', '62986', '160623', '26'), +('14', '115', '18', '104426', '136301', '26'), +('14', '115', '18', '54851', '102211', '26'), +('14', '115', '19', '81763', '158534', '26'), +('14', '115', '19', '62990', '158191', '26'), +('14', '115', '19', '56075', '157982', '26'), +('14', '115', '19', '56037', '157629', '26'), +('14', '115', '13', '111521', '256000', '26'), +('14', '115', '13', '111524', '243672', '26'), +('14', '115', '13', '111519', '243417', '26'), +('14', '115', '13', '111221', '226165', '26'), +('14', '115', '14', '111537', '253109', '26'), +('14', '115', '14', '111535', '252159', '26'), +('14', '115', '14', '111237', '221406', '26'), +('14', '115', '14', '111235', '220556', '26'), +('14', '115', '11', '85213', '375636', '26'), +('14', '115', '11', '133816', '330890', '26'), +('14', '115', '11', '111335', '251859', '26'), +('14', '115', '11', '111337', '251348', '26'), +('15', '1', '22', '10323', '0', '0'), +('15', '1', '22', '10664', '0', '0'), +('15', '1', '22', '9246', '0', '0'), +('15', '1', '22', '21509', '0', '0'), +('15', '1', '1', '14701', '5052', '0'), +('15', '1', '1', '14702', '4250', '0'), +('15', '1', '1', '30361', '1890', '0'), +('15', '1', '1', '10165', '1683', '0'), +('15', '1', '2', '1519', '3207', '0'), +('15', '1', '2', '10142', '3012', '0'), +('15', '1', '2', '4341', '2712', '0'), +('15', '1', '2', '4504', '2563', '0'), +('15', '1', '3', '10144', '1304', '0'), +('15', '1', '3', '14705', '990', '0'), +('15', '1', '3', '14706', '990', '0'), +('15', '1', '3', '2295', '965', '0'), +('15', '1', '5', '14703', '8250', '0'), +('15', '1', '5', '14700', '4953', '0'), +('15', '1', '5', '10055', '4505', '0'), +('15', '1', '5', '2583', '3055', '0'), +('15', '1', '8', '11621', '14220', '0'), +('15', '1', '8', '1546', '10429', '0'), +('15', '1', '8', '1409', '6312', '0'), +('15', '1', '8', '11603', '6064', '0'), +('15', '1', '6', '1557', '6760', '0'), +('15', '1', '6', '2286', '2124', '0'), +('15', '1', '6', '25062', '1833', '0'), +('15', '1', '6', '2463', '948', '0'), +('15', '1', '17', '2285', '6485', '0'), +('15', '1', '17', '4342', '3382', '0'), +('15', '1', '17', '3305', '2867', '0'), +('15', '1', '17', '2348', '1860', '0'), +('15', '1', '7', '2458', '2406', '0'), +('15', '1', '7', '4343', '1884', '0'), +('15', '1', '7', '1361', '1812', '0'), +('15', '1', '7', '2342', '1615', '0'), +('15', '1', '9', '14650', '2552', '0'), +('15', '1', '9', '10149', '2273', '0'), +('15', '1', '9', '12189', '2263', '0'), +('15', '1', '9', '4344', '2211', '0'), +('15', '1', '15', '10366', '8005', '0'), +('15', '1', '15', '10151', '7200', '0'), +('15', '1', '15', '14679', '6255', '0'), +('15', '1', '15', '14678', '5104', '0'), +('15', '1', '20', '11601', '7656', '0'), +('15', '1', '20', '2742', '4617', '0'), +('15', '1', '20', '1365', '4200', '0'), +('15', '1', '20', '2288', '3235', '0'), +('15', '1', '12', '20655', '5869', '0'), +('15', '1', '12', '2923', '4654', '0'), +('15', '1', '12', '2291', '2805', '0'), +('15', '1', '12', '11624', '2420', '0'), +('15', '1', '18', '2461', '2581', '0'), +('15', '1', '18', '4410', '2557', '0'), +('15', '1', '18', '4346', '2331', '0'), +('15', '1', '18', '2292', '1485', '0'), +('15', '1', '19', '2293', '5371', '0'), +('15', '1', '19', '68239', '4018', '0'), +('15', '1', '19', '2337', '1757', '0'), +('15', '1', '19', '3312', '1419', '0'), +('15', '1', '13', '7257', '14151', '0'), +('15', '1', '13', '6692', '13290', '0'), +('15', '1', '13', '11610', '12687', '0'), +('15', '1', '13', '6691', '11768', '0'), +('15', '1', '14', '7257', '14151', '0'), +('15', '1', '14', '6692', '13290', '0'), +('15', '1', '14', '11551', '12679', '0'), +('15', '1', '14', '6691', '11768', '0'), +('15', '1', '11', '14762', '3181', '0'), +('15', '1', '11', '20677', '1800', '0'), +('15', '1', '11', '13353', '1500', '0'), +('15', '1', '11', '9246', '664', '0'), +('15', '2', '22', '10323', '0', '0'), +('15', '2', '22', '10664', '0', '0'), +('15', '2', '22', '9246', '0', '0'), +('15', '2', '22', '21509', '0', '0'), +('15', '2', '1', '14701', '5052', '0'), +('15', '2', '1', '14702', '4250', '0'), +('15', '2', '1', '30361', '1890', '0'), +('15', '2', '1', '10165', '1683', '0'), +('15', '2', '2', '1519', '3207', '0'), +('15', '2', '2', '10142', '3012', '0'), +('15', '2', '2', '4341', '2712', '0'), +('15', '2', '2', '4504', '2563', '0'), +('15', '2', '3', '10144', '1304', '0'), +('15', '2', '3', '14705', '990', '0'), +('15', '2', '3', '14706', '990', '0'), +('15', '2', '3', '2295', '977', '0'), +('15', '2', '5', '14703', '8250', '0'), +('15', '2', '5', '14700', '4953', '0'), +('15', '2', '5', '10055', '4505', '0'), +('15', '2', '5', '2583', '3073', '0'), +('15', '2', '8', '11621', '14220', '0'), +('15', '2', '8', '1546', '10490', '0'), +('15', '2', '8', '1409', '6312', '0'), +('15', '2', '8', '11603', '6119', '0'), +('15', '2', '6', '1557', '6760', '0'), +('15', '2', '6', '2286', '2142', '0'), +('15', '2', '6', '25062', '1833', '0'), +('15', '2', '6', '2463', '948', '0'), +('15', '2', '17', '2285', '6509', '0'), +('15', '2', '17', '4342', '3443', '0'), +('15', '2', '17', '3305', '2867', '0'), +('15', '2', '17', '2348', '1878', '0'), +('15', '2', '7', '2458', '2406', '0'), +('15', '2', '7', '4343', '1921', '0'), +('15', '2', '7', '1361', '1812', '0'), +('15', '2', '7', '2342', '1626', '0'), +('15', '2', '9', '14650', '2552', '0'), +('15', '2', '9', '10149', '2291', '0'), +('15', '2', '9', '12189', '2263', '0'), +('15', '2', '9', '4344', '2211', '0'), +('15', '2', '15', '10366', '8005', '0'), +('15', '2', '15', '10151', '7200', '0'), +('15', '2', '15', '14679', '6255', '0'), +('15', '2', '15', '14678', '5104', '0'), +('15', '2', '20', '11601', '7692', '0'), +('15', '2', '20', '2742', '4653', '0'), +('15', '2', '20', '1365', '4200', '0'), +('15', '2', '20', '2288', '3235', '0'), +('15', '2', '12', '20655', '5889', '0'), +('15', '2', '12', '2923', '4654', '0'), +('15', '2', '12', '2291', '2805', '0'), +('15', '2', '12', '11624', '2446', '0'), +('15', '2', '18', '2461', '2605', '0'), +('15', '2', '18', '4410', '2557', '0'), +('15', '2', '18', '4346', '2331', '0'), +('15', '2', '18', '2292', '1509', '0'), +('15', '2', '19', '2293', '5390', '0'), +('15', '2', '19', '68239', '4036', '0'), +('15', '2', '19', '2337', '1757', '0'), +('15', '2', '19', '3312', '1419', '0'), +('15', '2', '13', '7257', '14151', '0'), +('15', '2', '13', '6692', '13290', '0'), +('15', '2', '13', '11610', '12687', '0'), +('15', '2', '13', '6691', '11768', '0'), +('15', '2', '14', '7257', '14151', '0'), +('15', '2', '14', '6692', '13290', '0'), +('15', '2', '14', '11551', '12679', '0'), +('15', '2', '14', '6691', '11768', '0'), +('15', '2', '11', '14762', '3181', '0'), +('15', '2', '11', '20677', '1800', '0'), +('15', '2', '11', '13353', '1500', '0'), +('15', '2', '11', '9246', '725', '0'), +('15', '3', '22', '10323', '0', '0'), +('15', '3', '22', '10664', '0', '0'), +('15', '3', '22', '9246', '0', '0'), +('15', '3', '22', '21509', '0', '0'), +('15', '3', '1', '14701', '5052', '0'), +('15', '3', '1', '14702', '4250', '0'), +('15', '3', '1', '30361', '1890', '0'), +('15', '3', '1', '10165', '1683', '0'), +('15', '3', '2', '1519', '3207', '0'), +('15', '3', '2', '10142', '3012', '0'), +('15', '3', '2', '4341', '2712', '0'), +('15', '3', '2', '4504', '2563', '0'), +('15', '3', '3', '10144', '1304', '0'), +('15', '3', '3', '14705', '990', '0'), +('15', '3', '3', '14706', '990', '0'), +('15', '3', '3', '2295', '989', '0'), +('15', '3', '5', '14703', '8250', '0'), +('15', '3', '5', '14700', '4953', '0'), +('15', '3', '5', '10055', '4505', '0'), +('15', '3', '5', '2583', '3091', '0'), +('15', '3', '8', '11621', '14220', '0'), +('15', '3', '8', '1546', '10550', '0'), +('15', '3', '8', '1409', '6312', '0'), +('15', '3', '8', '11603', '6173', '0'), +('15', '3', '6', '1557', '6760', '0'), +('15', '3', '6', '2286', '2160', '0'), +('15', '3', '6', '25062', '1833', '0'), +('15', '3', '6', '2463', '948', '0'), +('15', '3', '17', '2285', '6533', '0'), +('15', '3', '17', '4342', '3503', '0'), +('15', '3', '17', '3305', '2867', '0'), +('15', '3', '17', '2348', '1897', '0'), +('15', '3', '7', '2458', '2406', '0'), +('15', '3', '7', '4343', '1957', '0'), +('15', '3', '7', '1361', '1812', '0'), +('15', '3', '7', '2342', '1637', '0'), +('15', '3', '9', '14650', '2552', '0'), +('15', '3', '9', '10149', '2309', '0'), +('15', '3', '9', '12189', '2263', '0'), +('15', '3', '9', '4344', '2211', '0'), +('15', '3', '15', '10366', '8005', '0'), +('15', '3', '15', '10151', '7200', '0'), +('15', '3', '15', '14679', '6255', '0'), +('15', '3', '15', '14678', '5104', '0'), +('15', '3', '20', '11601', '7728', '0'), +('15', '3', '20', '2742', '4690', '0'), +('15', '3', '20', '1365', '4200', '0'), +('15', '3', '20', '2288', '3235', '0'), +('15', '3', '12', '20655', '5908', '0'), +('15', '3', '12', '2923', '4654', '0'), +('15', '3', '12', '2291', '2805', '0'), +('15', '3', '12', '11624', '2471', '0'), +('15', '3', '18', '2461', '2629', '0'), +('15', '3', '18', '4410', '2557', '0'), +('15', '3', '18', '4346', '2331', '0'), +('15', '3', '18', '2292', '1533', '0'), +('15', '3', '19', '2293', '5408', '0'), +('15', '3', '19', '68239', '4055', '0'), +('15', '3', '19', '2337', '1757', '0'), +('15', '3', '19', '3312', '1419', '0'), +('15', '3', '13', '7257', '14151', '0'), +('15', '3', '13', '6692', '13290', '0'), +('15', '3', '13', '11610', '12687', '0'), +('15', '3', '13', '6691', '11768', '0'), +('15', '3', '14', '7257', '14151', '0'), +('15', '3', '14', '6692', '13290', '0'), +('15', '3', '14', '11551', '12679', '0'), +('15', '3', '14', '6691', '11768', '0'), +('15', '3', '11', '14762', '3181', '0'), +('15', '3', '11', '20677', '1800', '0'), +('15', '3', '11', '13353', '1500', '0'), +('15', '3', '11', '9246', '785', '0'), +('15', '4', '22', '10323', '0', '0'), +('15', '4', '22', '10664', '0', '0'), +('15', '4', '22', '9246', '0', '0'), +('15', '4', '22', '21509', '0', '0'), +('15', '4', '1', '14701', '5052', '0'), +('15', '4', '1', '14702', '4250', '0'), +('15', '4', '1', '30361', '1890', '0'), +('15', '4', '1', '10165', '1683', '0'), +('15', '4', '2', '1519', '3207', '0'), +('15', '4', '2', '10142', '3012', '0'), +('15', '4', '2', '4341', '2712', '0'), +('15', '4', '2', '4504', '2563', '0'), +('15', '4', '3', '10144', '1304', '0'), +('15', '4', '3', '2295', '1001', '0'), +('15', '4', '3', '14705', '990', '0'), +('15', '4', '3', '14706', '990', '0'), +('15', '4', '5', '14703', '8250', '0'), +('15', '4', '5', '14700', '4953', '0'), +('15', '4', '5', '10055', '4505', '0'), +('15', '4', '5', '2583', '3109', '0'), +('15', '4', '8', '11621', '14220', '0'), +('15', '4', '8', '1546', '10611', '0'), +('15', '4', '8', '1409', '6312', '0'), +('15', '4', '8', '11603', '6227', '0'), +('15', '4', '6', '1557', '6760', '0'), +('15', '4', '6', '2286', '2178', '0'), +('15', '4', '6', '25062', '1833', '0'), +('15', '4', '6', '2463', '948', '0'), +('15', '4', '17', '2285', '6558', '0'), +('15', '4', '17', '4342', '3564', '0'), +('15', '4', '17', '3305', '2867', '0'), +('15', '4', '17', '2348', '1915', '0'), +('15', '4', '7', '2458', '2406', '0'), +('15', '4', '7', '4343', '1993', '0'), +('15', '4', '7', '1361', '1812', '0'), +('15', '4', '7', '2289', '1652', '0'), +('15', '4', '9', '14650', '2552', '0'), +('15', '4', '9', '10149', '2327', '0'), +('15', '4', '9', '12189', '2263', '0'), +('15', '4', '9', '4344', '2211', '0'), +('15', '4', '15', '10366', '8005', '0'), +('15', '4', '15', '10151', '7200', '0'), +('15', '4', '15', '14679', '6255', '0'), +('15', '4', '15', '14678', '5104', '0'), +('15', '4', '20', '11601', '7764', '0'), +('15', '4', '20', '2742', '4726', '0'), +('15', '4', '20', '1365', '4200', '0'), +('15', '4', '20', '2288', '3235', '0'), +('15', '4', '12', '20655', '5927', '0'), +('15', '4', '12', '2923', '4654', '0'), +('15', '4', '12', '2291', '2805', '0'), +('15', '4', '12', '11624', '2497', '0'), +('15', '4', '18', '2461', '2654', '0'), +('15', '4', '18', '4410', '2557', '0'), +('15', '4', '18', '4346', '2331', '0'), +('15', '4', '18', '2292', '1557', '0'), +('15', '4', '19', '2293', '5426', '0'), +('15', '4', '19', '68239', '4073', '0'), +('15', '4', '19', '2337', '1757', '0'), +('15', '4', '19', '3312', '1419', '0'), +('15', '4', '13', '7257', '14151', '0'), +('15', '4', '13', '6692', '13290', '0'), +('15', '4', '13', '11610', '12687', '0'), +('15', '4', '13', '6691', '11768', '0'), +('15', '4', '14', '7257', '14151', '0'), +('15', '4', '14', '6692', '13290', '0'), +('15', '4', '14', '11551', '12679', '0'), +('15', '4', '14', '6691', '11768', '0'), +('15', '4', '11', '14762', '3181', '0'), +('15', '4', '11', '20677', '1800', '0'), +('15', '4', '11', '13353', '1500', '0'), +('15', '4', '11', '9246', '846', '0'), +('15', '5', '22', '10323', '0', '0'), +('15', '5', '22', '10664', '0', '0'), +('15', '5', '22', '9246', '0', '0'), +('15', '5', '22', '21509', '0', '0'), +('15', '5', '1', '14701', '5052', '0'), +('15', '5', '1', '14702', '4250', '0'), +('15', '5', '1', '30361', '1890', '0'), +('15', '5', '1', '10165', '1683', '0'), +('15', '5', '2', '1519', '3207', '0'), +('15', '5', '2', '10142', '3012', '0'), +('15', '5', '2', '4341', '2712', '0'), +('15', '5', '2', '4504', '2563', '0'), +('15', '5', '3', '10144', '1304', '0'), +('15', '5', '3', '2295', '1013', '0'), +('15', '5', '3', '14705', '990', '0'), +('15', '5', '3', '14706', '990', '0'), +('15', '5', '5', '14703', '8250', '0'), +('15', '5', '5', '14700', '4953', '0'), +('15', '5', '5', '10055', '4505', '0'), +('15', '5', '5', '2583', '3128', '0'), +('15', '5', '8', '11621', '14220', '0'), +('15', '5', '8', '1546', '10671', '0'), +('15', '5', '8', '1409', '6312', '0'), +('15', '5', '8', '11603', '6282', '0'), +('15', '5', '6', '1557', '6760', '0'), +('15', '5', '6', '2286', '2197', '0'), +('15', '5', '6', '25062', '1833', '0'), +('15', '5', '6', '2463', '948', '0'), +('15', '5', '17', '2285', '6582', '0'), +('15', '5', '17', '4342', '3624', '0'), +('15', '5', '17', '3305', '2867', '0'), +('15', '5', '17', '2348', '1933', '0'), +('15', '5', '7', '2458', '2406', '0'), +('15', '5', '7', '4343', '2029', '0'), +('15', '5', '7', '1361', '1812', '0'), +('15', '5', '7', '2289', '1676', '0'), +('15', '5', '9', '14650', '2552', '0'), +('15', '5', '9', '10149', '2346', '0'), +('15', '5', '9', '12189', '2263', '0'), +('15', '5', '9', '4344', '2211', '0'), +('15', '5', '15', '10366', '8005', '0'), +('15', '5', '15', '10151', '7200', '0'), +('15', '5', '15', '14679', '6255', '0'), +('15', '5', '15', '14678', '5104', '0'), +('15', '5', '20', '11601', '7801', '0'), +('15', '5', '20', '2742', '4762', '0'), +('15', '5', '20', '1365', '4200', '0'), +('15', '5', '20', '2288', '3235', '0'), +('15', '5', '12', '20655', '5947', '0'), +('15', '5', '12', '2923', '4654', '0'), +('15', '5', '12', '2291', '2805', '0'), +('15', '5', '12', '11624', '2522', '0'), +('15', '5', '18', '2461', '2678', '0'), +('15', '5', '18', '4410', '2557', '0'), +('15', '5', '18', '4346', '2331', '0'), +('15', '5', '18', '2292', '1582', '0'), +('15', '5', '19', '2293', '5444', '0'), +('15', '5', '19', '68239', '4091', '0'), +('15', '5', '19', '2337', '1757', '0'), +('15', '5', '19', '3312', '1419', '0'), +('15', '5', '13', '7257', '14151', '0'), +('15', '5', '13', '6692', '13290', '0'), +('15', '5', '13', '11610', '12687', '0'), +('15', '5', '13', '6691', '11768', '0'), +('15', '5', '14', '7257', '14151', '0'), +('15', '5', '14', '6692', '13290', '0'), +('15', '5', '14', '11551', '12679', '0'), +('15', '5', '14', '6691', '11768', '0'), +('15', '5', '11', '14762', '3181', '0'), +('15', '5', '11', '20677', '1800', '0'), +('15', '5', '11', '13353', '1500', '0'), +('15', '5', '11', '9246', '906', '0'), +('15', '6', '22', '10323', '0', '0'), +('15', '6', '22', '10664', '0', '0'), +('15', '6', '22', '9246', '0', '0'), +('15', '6', '22', '21509', '0', '0'), +('15', '6', '1', '14701', '5052', '0'), +('15', '6', '1', '14702', '4250', '0'), +('15', '6', '1', '30361', '1890', '0'), +('15', '6', '1', '10165', '1683', '0'), +('15', '6', '2', '1519', '3207', '0'), +('15', '6', '2', '10142', '3012', '0'), +('15', '6', '2', '4341', '2712', '0'), +('15', '6', '2', '4504', '2563', '0'), +('15', '6', '3', '10144', '1304', '0'), +('15', '6', '3', '2295', '1025', '0'), +('15', '6', '3', '4505', '1009', '0'), +('15', '6', '3', '14705', '990', '0'), +('15', '6', '5', '14703', '8250', '0'), +('15', '6', '5', '14700', '4953', '0'), +('15', '6', '5', '10055', '4505', '0'), +('15', '6', '5', '2583', '3146', '0'), +('15', '6', '8', '11621', '14220', '0'), +('15', '6', '8', '1546', '10731', '0'), +('15', '6', '8', '11603', '6336', '0'), +('15', '6', '8', '1409', '6312', '0'), +('15', '6', '6', '1557', '6760', '0'), +('15', '6', '6', '2286', '2215', '0'), +('15', '6', '6', '25062', '1833', '0'), +('15', '6', '6', '2463', '948', '0'), +('15', '6', '17', '2285', '6606', '0'), +('15', '6', '17', '4342', '3684', '0'), +('15', '6', '17', '3305', '2867', '0'), +('15', '6', '17', '2348', '1951', '0'), +('15', '6', '7', '2458', '2406', '0'), +('15', '6', '7', '4343', '2066', '0'), +('15', '6', '7', '1361', '1812', '0'), +('15', '6', '7', '2289', '1700', '0'), +('15', '6', '9', '14650', '2552', '0'), +('15', '6', '9', '10149', '2364', '0'), +('15', '6', '9', '12189', '2263', '0'), +('15', '6', '9', '4344', '2211', '0'), +('15', '6', '15', '10366', '8005', '0'), +('15', '6', '15', '10151', '7200', '0'), +('15', '6', '15', '14679', '6255', '0'), +('15', '6', '15', '14678', '5104', '0'), +('15', '6', '20', '11601', '7837', '0'), +('15', '6', '20', '2742', '4798', '0'), +('15', '6', '20', '1365', '4200', '0'), +('15', '6', '20', '1543', '3293', '0'), +('15', '6', '12', '20655', '5966', '0'), +('15', '6', '12', '2923', '4654', '0'), +('15', '6', '12', '2291', '2805', '0'), +('15', '6', '12', '11624', '2547', '0'), +('15', '6', '18', '2461', '2702', '0'), +('15', '6', '18', '4410', '2557', '0'), +('15', '6', '18', '4346', '2331', '0'), +('15', '6', '18', '2292', '1606', '0'), +('15', '6', '19', '2293', '5462', '0'), +('15', '6', '19', '68239', '4109', '0'), +('15', '6', '19', '2337', '1757', '0'), +('15', '6', '19', '3312', '1419', '0'), +('15', '6', '13', '7257', '14151', '0'), +('15', '6', '13', '6692', '13290', '0'), +('15', '6', '13', '11610', '12687', '0'), +('15', '6', '13', '6691', '11768', '0'), +('15', '6', '14', '7257', '14151', '0'), +('15', '6', '14', '6692', '13290', '0'), +('15', '6', '14', '11551', '12679', '0'), +('15', '6', '14', '6691', '11768', '0'), +('15', '6', '11', '14762', '3181', '0'), +('15', '6', '11', '20677', '1800', '0'), +('15', '6', '11', '13353', '1500', '0'), +('15', '6', '11', '9246', '966', '0'), +('15', '7', '22', '10323', '0', '0'), +('15', '7', '22', '10664', '0', '0'), +('15', '7', '22', '9246', '0', '0'), +('15', '7', '22', '21509', '0', '0'), +('15', '7', '1', '14701', '5052', '0'), +('15', '7', '1', '14702', '4250', '0'), +('15', '7', '1', '30361', '1890', '0'), +('15', '7', '1', '10165', '1683', '0'), +('15', '7', '2', '1519', '3207', '0'), +('15', '7', '2', '10142', '3012', '0'), +('15', '7', '2', '4341', '2712', '0'), +('15', '7', '2', '4504', '2563', '0'), +('15', '7', '3', '10144', '1304', '0'), +('15', '7', '3', '4505', '1051', '0'), +('15', '7', '3', '2295', '1038', '0'), +('15', '7', '3', '14705', '990', '0'), +('15', '7', '5', '14703', '8250', '0'), +('15', '7', '5', '14700', '4953', '0'), +('15', '7', '5', '10055', '4505', '0'), +('15', '7', '5', '2583', '3164', '0'), +('15', '7', '8', '11621', '14220', '0'), +('15', '7', '8', '1546', '10792', '0'), +('15', '7', '8', '11603', '6391', '0'), +('15', '7', '8', '1409', '6312', '0'), +('15', '7', '6', '1557', '6760', '0'), +('15', '7', '6', '2286', '2236', '0'), +('15', '7', '6', '25062', '1833', '0'), +('15', '7', '6', '2463', '948', '0'), +('15', '7', '17', '2285', '6630', '0'), +('15', '7', '17', '4342', '3745', '0'), +('15', '7', '17', '3305', '2867', '0'), +('15', '7', '17', '2348', '1972', '0'), +('15', '7', '7', '2458', '2406', '0'), +('15', '7', '7', '4343', '2108', '0'), +('15', '7', '7', '1361', '1812', '0'), +('15', '7', '7', '2289', '1724', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '7', '9', '14650', '2552', '0'), +('15', '7', '9', '10149', '2382', '0'), +('15', '7', '9', '12189', '2263', '0'), +('15', '7', '9', '4344', '2211', '0'), +('15', '7', '15', '10366', '8005', '0'), +('15', '7', '15', '10151', '7200', '0'), +('15', '7', '15', '14679', '6255', '0'), +('15', '7', '15', '14678', '5104', '0'), +('15', '7', '20', '11601', '7879', '0'), +('15', '7', '20', '2742', '4841', '0'), +('15', '7', '20', '1365', '4200', '0'), +('15', '7', '20', '1543', '3353', '0'), +('15', '7', '12', '20655', '5987', '0'), +('15', '7', '12', '2923', '4654', '0'), +('15', '7', '12', '2291', '2805', '0'), +('15', '7', '12', '11624', '2577', '0'), +('15', '7', '18', '2461', '2726', '0'), +('15', '7', '18', '4410', '2557', '0'), +('15', '7', '18', '4346', '2331', '0'), +('15', '7', '18', '2292', '1630', '0'), +('15', '7', '19', '2293', '5480', '0'), +('15', '7', '19', '68239', '4127', '0'), +('15', '7', '19', '2337', '1757', '0'), +('15', '7', '19', '3312', '1419', '0'), +('15', '7', '13', '7257', '14151', '0'), +('15', '7', '13', '6692', '13290', '0'), +('15', '7', '13', '11610', '12687', '0'), +('15', '7', '13', '6691', '11768', '0'), +('15', '7', '14', '7257', '14151', '0'), +('15', '7', '14', '6692', '13290', '0'), +('15', '7', '14', '11551', '12679', '0'), +('15', '7', '14', '6691', '11768', '0'), +('15', '7', '11', '14762', '3181', '0'), +('15', '7', '11', '20677', '1800', '0'), +('15', '7', '11', '13353', '1500', '0'), +('15', '7', '11', '9246', '1027', '0'), +('15', '8', '22', '10323', '0', '0'), +('15', '8', '22', '10664', '0', '0'), +('15', '8', '22', '9246', '0', '0'), +('15', '8', '22', '21509', '0', '0'), +('15', '8', '1', '14701', '5052', '0'), +('15', '8', '1', '14702', '4250', '0'), +('15', '8', '1', '30361', '1890', '0'), +('15', '8', '1', '10165', '1683', '0'), +('15', '8', '2', '1519', '3207', '0'), +('15', '8', '2', '10142', '3012', '0'), +('15', '8', '2', '4341', '2712', '0'), +('15', '8', '2', '4504', '2563', '0'), +('15', '8', '3', '10144', '1304', '0'), +('15', '8', '3', '4505', '1093', '0'), +('15', '8', '3', '2295', '1050', '0'), +('15', '8', '3', '14705', '990', '0'), +('15', '8', '5', '14703', '8250', '0'), +('15', '8', '5', '14700', '4953', '0'), +('15', '8', '5', '10055', '4505', '0'), +('15', '8', '5', '2583', '3182', '0'), +('15', '8', '8', '11621', '14220', '0'), +('15', '8', '8', '1546', '10852', '0'), +('15', '8', '8', '11603', '6445', '0'), +('15', '8', '8', '1409', '6312', '0'), +('15', '8', '6', '1557', '6760', '0'), +('15', '8', '6', '2286', '2254', '0'), +('15', '8', '6', '25062', '1833', '0'), +('15', '8', '6', '2463', '948', '0'), +('15', '8', '17', '2285', '6654', '0'), +('15', '8', '17', '4342', '3805', '0'), +('15', '8', '17', '3305', '2867', '0'), +('15', '8', '17', '2348', '1990', '0'), +('15', '8', '7', '2458', '2406', '0'), +('15', '8', '7', '4343', '2144', '0'), +('15', '8', '7', '1361', '1812', '0'), +('15', '8', '7', '2289', '1748', '0'), +('15', '8', '9', '14650', '2552', '0'), +('15', '8', '9', '10149', '2400', '0'), +('15', '8', '9', '12189', '2263', '0'), +('15', '8', '9', '4344', '2211', '0'), +('15', '8', '15', '10366', '8005', '0'), +('15', '8', '15', '10151', '7200', '0'), +('15', '8', '15', '14679', '6255', '0'), +('15', '8', '15', '14678', '5104', '0'), +('15', '8', '20', '11601', '7915', '0'), +('15', '8', '20', '2742', '4877', '0'), +('15', '8', '20', '1365', '4200', '0'), +('15', '8', '20', '1543', '3414', '0'), +('15', '8', '12', '20655', '6006', '0'), +('15', '8', '12', '2923', '4654', '0'), +('15', '8', '12', '2291', '2805', '0'), +('15', '8', '12', '11624', '2602', '0'), +('15', '8', '18', '2461', '2750', '0'), +('15', '8', '18', '4410', '2557', '0'), +('15', '8', '18', '4346', '2331', '0'), +('15', '8', '18', '2292', '1654', '0'), +('15', '8', '19', '2293', '5498', '0'), +('15', '8', '19', '68239', '4145', '0'), +('15', '8', '19', '2337', '1757', '0'), +('15', '8', '19', '3312', '1419', '0'), +('15', '8', '13', '7257', '14151', '0'), +('15', '8', '13', '6692', '13290', '0'), +('15', '8', '13', '11610', '12687', '0'), +('15', '8', '13', '6691', '11768', '0'), +('15', '8', '14', '7257', '14151', '0'), +('15', '8', '14', '6692', '13290', '0'), +('15', '8', '14', '11551', '12679', '0'), +('15', '8', '14', '6691', '11768', '0'), +('15', '8', '11', '14762', '3181', '0'), +('15', '8', '11', '20677', '1800', '0'), +('15', '8', '11', '13353', '1500', '0'), +('15', '8', '11', '9246', '1087', '0'), +('15', '9', '22', '10323', '0', '0'), +('15', '9', '22', '10664', '0', '0'), +('15', '9', '22', '9246', '0', '0'), +('15', '9', '22', '21509', '0', '0'), +('15', '9', '1', '14701', '5052', '0'), +('15', '9', '1', '14702', '4250', '0'), +('15', '9', '1', '30361', '1890', '0'), +('15', '9', '1', '10165', '1683', '0'), +('15', '9', '2', '1519', '3207', '0'), +('15', '9', '2', '10142', '3012', '0'), +('15', '9', '2', '4341', '2712', '0'), +('15', '9', '2', '4504', '2563', '0'), +('15', '9', '3', '10144', '1304', '0'), +('15', '9', '3', '4505', '1136', '0'), +('15', '9', '3', '2295', '1062', '0'), +('15', '9', '3', '14705', '990', '0'), +('15', '9', '5', '14703', '8250', '0'), +('15', '9', '5', '14700', '4953', '0'), +('15', '9', '5', '10055', '4505', '0'), +('15', '9', '5', '2583', '3200', '0'), +('15', '9', '8', '11621', '14220', '0'), +('15', '9', '8', '1546', '10913', '0'), +('15', '9', '8', '11603', '6499', '0'), +('15', '9', '8', '1409', '6312', '0'), +('15', '9', '6', '1557', '6760', '0'), +('15', '9', '6', '2286', '2272', '0'), +('15', '9', '6', '25062', '1833', '0'), +('15', '9', '6', '2463', '948', '0'), +('15', '9', '17', '2285', '6678', '0'), +('15', '9', '17', '4342', '3866', '0'), +('15', '9', '17', '3305', '2867', '0'), +('15', '9', '17', '2348', '2008', '0'), +('15', '9', '7', '2458', '2406', '0'), +('15', '9', '7', '4343', '2180', '0'), +('15', '9', '7', '1361', '1812', '0'), +('15', '9', '7', '2289', '1772', '0'), +('15', '9', '9', '14650', '2552', '0'), +('15', '9', '9', '10149', '2418', '0'), +('15', '9', '9', '12189', '2263', '0'), +('15', '9', '9', '4344', '2211', '0'), +('15', '9', '15', '10366', '8005', '0'), +('15', '9', '15', '10151', '7200', '0'), +('15', '9', '15', '14679', '6255', '0'), +('15', '9', '15', '14678', '5104', '0'), +('15', '9', '20', '11601', '7952', '0'), +('15', '9', '20', '2742', '4913', '0'), +('15', '9', '20', '1365', '4200', '0'), +('15', '9', '20', '1543', '3474', '0'), +('15', '9', '12', '20655', '6025', '0'), +('15', '9', '12', '2923', '4654', '0'), +('15', '9', '12', '2291', '2805', '0'), +('15', '9', '12', '11624', '2628', '0'), +('15', '9', '18', '2461', '2774', '0'), +('15', '9', '18', '4410', '2557', '0'), +('15', '9', '18', '4346', '2331', '0'), +('15', '9', '18', '2292', '1678', '0'), +('15', '9', '19', '2293', '5516', '0'), +('15', '9', '19', '68239', '4163', '0'), +('15', '9', '19', '2337', '1757', '0'), +('15', '9', '19', '3312', '1419', '0'), +('15', '9', '13', '7257', '14151', '0'), +('15', '9', '13', '6692', '13290', '0'), +('15', '9', '13', '11610', '12687', '0'), +('15', '9', '13', '6691', '11768', '0'), +('15', '9', '14', '7257', '14151', '0'), +('15', '9', '14', '6692', '13290', '0'), +('15', '9', '14', '11551', '12679', '0'), +('15', '9', '14', '6691', '11768', '0'), +('15', '9', '11', '14762', '3181', '0'), +('15', '9', '11', '20677', '1800', '0'), +('15', '9', '11', '13353', '1500', '0'), +('15', '9', '11', '9246', '1148', '0'), +('15', '10', '22', '10323', '0', '0'), +('15', '10', '22', '10664', '0', '0'), +('15', '10', '22', '9246', '0', '0'), +('15', '10', '22', '21509', '0', '0'), +('15', '10', '1', '14701', '5052', '0'), +('15', '10', '1', '14702', '4250', '0'), +('15', '10', '1', '30361', '1890', '0'), +('15', '10', '1', '10165', '1683', '0'), +('15', '10', '2', '1519', '3207', '0'), +('15', '10', '2', '10142', '3012', '0'), +('15', '10', '2', '4341', '2712', '0'), +('15', '10', '2', '4504', '2563', '0'), +('15', '10', '3', '10144', '1304', '0'), +('15', '10', '3', '4505', '1178', '0'), +('15', '10', '3', '2295', '1074', '0'), +('15', '10', '3', '14705', '990', '0'), +('15', '10', '5', '14703', '8250', '0'), +('15', '10', '5', '14700', '4953', '0'), +('15', '10', '5', '10055', '4505', '0'), +('15', '10', '5', '2583', '3218', '0'), +('15', '10', '8', '11621', '14220', '0'), +('15', '10', '8', '1546', '10973', '0'), +('15', '10', '8', '11603', '6554', '0'), +('15', '10', '8', '1409', '6312', '0'), +('15', '10', '6', '1557', '6760', '0'), +('15', '10', '6', '2286', '2290', '0'), +('15', '10', '6', '25062', '1833', '0'), +('15', '10', '6', '2463', '948', '0'), +('15', '10', '17', '2285', '6703', '0'), +('15', '10', '17', '4342', '3926', '0'), +('15', '10', '17', '3305', '2867', '0'), +('15', '10', '17', '2348', '2026', '0'), +('15', '10', '7', '2458', '2406', '0'), +('15', '10', '7', '4343', '2217', '0'), +('15', '10', '7', '1361', '1812', '0'), +('15', '10', '7', '2289', '1797', '0'), +('15', '10', '9', '14650', '2552', '0'), +('15', '10', '9', '10149', '2436', '0'), +('15', '10', '9', '12189', '2263', '0'), +('15', '10', '9', '4344', '2211', '0'), +('15', '10', '15', '10366', '8005', '0'), +('15', '10', '15', '10151', '7200', '0'), +('15', '10', '15', '14679', '6255', '0'), +('15', '10', '15', '14678', '5104', '0'), +('15', '10', '20', '11601', '7988', '0'), +('15', '10', '20', '2742', '4949', '0'), +('15', '10', '20', '1365', '4200', '0'), +('15', '10', '20', '1543', '3534', '0'), +('15', '10', '12', '20655', '6045', '0'), +('15', '10', '12', '2923', '4654', '0'), +('15', '10', '12', '2291', '2805', '0'), +('15', '10', '12', '11624', '2653', '0'), +('15', '10', '18', '2461', '2799', '0'), +('15', '10', '18', '4410', '2557', '0'), +('15', '10', '18', '4346', '2331', '0'), +('15', '10', '18', '2292', '1702', '0'), +('15', '10', '19', '2293', '5535', '0'), +('15', '10', '19', '68239', '4181', '0'), +('15', '10', '19', '2337', '1757', '0'), +('15', '10', '19', '3312', '1419', '0'), +('15', '10', '13', '7257', '14151', '0'), +('15', '10', '13', '6692', '13290', '0'), +('15', '10', '13', '11610', '12687', '0'), +('15', '10', '13', '6691', '11768', '0'), +('15', '10', '14', '7257', '14151', '0'), +('15', '10', '14', '6692', '13290', '0'), +('15', '10', '14', '11551', '12679', '0'), +('15', '10', '14', '6691', '11768', '0'), +('15', '10', '11', '14762', '3181', '0'), +('15', '10', '11', '20677', '1800', '0'), +('15', '10', '11', '13353', '1500', '0'), +('15', '10', '11', '9246', '1208', '0'), +('15', '11', '22', '10323', '0', '0'), +('15', '11', '22', '10664', '0', '0'), +('15', '11', '22', '9246', '0', '0'), +('15', '11', '22', '21509', '0', '0'), +('15', '11', '1', '14701', '5052', '0'), +('15', '11', '1', '14702', '4250', '0'), +('15', '11', '1', '30361', '1890', '0'), +('15', '11', '1', '10165', '1683', '0'), +('15', '11', '2', '1519', '3207', '0'), +('15', '11', '2', '10142', '3012', '0'), +('15', '11', '2', '4341', '2712', '0'), +('15', '11', '2', '4504', '2563', '0'), +('15', '11', '3', '10144', '1304', '0'), +('15', '11', '3', '4505', '1220', '0'), +('15', '11', '3', '2295', '1086', '0'), +('15', '11', '3', '11052', '997', '0'), +('15', '11', '5', '14703', '8250', '0'), +('15', '11', '5', '14700', '4953', '0'), +('15', '11', '5', '10055', '4505', '0'), +('15', '11', '5', '2583', '3236', '0'), +('15', '11', '8', '11621', '14220', '0'), +('15', '11', '8', '1546', '11033', '0'), +('15', '11', '8', '11603', '6608', '0'), +('15', '11', '8', '1409', '6312', '0'), +('15', '11', '6', '1557', '6760', '0'), +('15', '11', '6', '2286', '2311', '0'), +('15', '11', '6', '25062', '1833', '0'), +('15', '11', '6', '2331', '954', '0'), +('15', '11', '17', '2285', '6727', '0'), +('15', '11', '17', '4342', '3986', '0'), +('15', '11', '17', '3305', '2867', '0'), +('15', '11', '17', '2348', '2048', '0'), +('15', '11', '7', '2458', '2406', '0'), +('15', '11', '7', '4343', '2259', '0'), +('15', '11', '7', '2289', '1821', '0'), +('15', '11', '7', '1361', '1812', '0'), +('15', '11', '9', '14650', '2552', '0'), +('15', '11', '9', '10149', '2454', '0'), +('15', '11', '9', '12189', '2263', '0'), +('15', '11', '9', '4344', '2211', '0'), +('15', '11', '15', '10366', '8005', '0'), +('15', '11', '15', '10151', '7200', '0'), +('15', '11', '15', '14679', '6255', '0'), +('15', '11', '15', '14678', '5104', '0'), +('15', '11', '20', '11601', '8030', '0'), +('15', '11', '20', '2742', '4992', '0'), +('15', '11', '20', '1365', '4200', '0'), +('15', '11', '20', '1543', '3595', '0'), +('15', '11', '12', '20655', '6065', '0'), +('15', '11', '12', '2923', '4654', '0'), +('15', '11', '12', '2291', '2805', '0'), +('15', '11', '12', '11624', '2683', '0'), +('15', '11', '18', '2461', '2823', '0'), +('15', '11', '18', '4410', '2557', '0'), +('15', '11', '18', '4346', '2331', '0'), +('15', '11', '18', '2292', '1727', '0'), +('15', '11', '19', '2293', '5553', '0'), +('15', '11', '19', '68239', '4200', '0'), +('15', '11', '19', '2337', '1757', '0'), +('15', '11', '19', '3312', '1419', '0'), +('15', '11', '13', '7257', '14151', '0'), +('15', '11', '13', '6692', '13290', '0'), +('15', '11', '13', '11610', '12687', '0'), +('15', '11', '13', '6691', '11768', '0'), +('15', '11', '14', '7257', '14151', '0'), +('15', '11', '14', '6692', '13290', '0'), +('15', '11', '14', '11551', '12679', '0'), +('15', '11', '14', '6691', '11768', '0'), +('15', '11', '11', '14762', '3181', '0'), +('15', '11', '11', '20677', '1800', '0'), +('15', '11', '11', '13353', '1500', '0'), +('15', '11', '11', '9246', '1268', '0'), +('15', '12', '22', '10323', '0', '0'), +('15', '12', '22', '10664', '0', '0'), +('15', '12', '22', '9246', '0', '0'), +('15', '12', '22', '21509', '0', '0'), +('15', '12', '1', '14701', '5052', '0'), +('15', '12', '1', '14702', '4250', '0'), +('15', '12', '1', '30361', '1890', '0'), +('15', '12', '1', '10165', '1683', '0'), +('15', '12', '2', '1519', '3207', '0'), +('15', '12', '2', '10142', '3012', '0'), +('15', '12', '2', '4341', '2712', '0'), +('15', '12', '2', '4504', '2563', '0'), +('15', '12', '3', '10144', '1304', '0'), +('15', '12', '3', '4505', '1262', '0'), +('15', '12', '3', '2295', '1098', '0'), +('15', '12', '3', '11052', '1087', '0'), +('15', '12', '5', '14703', '8250', '0'), +('15', '12', '5', '14700', '4953', '0'), +('15', '12', '5', '10055', '4505', '0'), +('15', '12', '5', '2583', '3254', '0'), +('15', '12', '8', '11621', '14220', '0'), +('15', '12', '8', '1546', '11094', '0'), +('15', '12', '8', '11603', '6662', '0'), +('15', '12', '8', '1409', '6312', '0'), +('15', '12', '6', '1557', '6760', '0'), +('15', '12', '6', '2286', '2329', '0'), +('15', '12', '6', '25062', '1833', '0'), +('15', '12', '6', '2331', '972', '0'), +('15', '12', '17', '2285', '6751', '0'), +('15', '12', '17', '4342', '4047', '0'), +('15', '12', '17', '3305', '2867', '0'), +('15', '12', '17', '2348', '2066', '0'), +('15', '12', '7', '2458', '2406', '0'), +('15', '12', '7', '4343', '2295', '0'), +('15', '12', '7', '2289', '1845', '0'), +('15', '12', '7', '1361', '1812', '0'), +('15', '12', '9', '14650', '2552', '0'), +('15', '12', '9', '10149', '2472', '0'), +('15', '12', '9', '12189', '2263', '0'), +('15', '12', '9', '4344', '2211', '0'), +('15', '12', '15', '10366', '8005', '0'), +('15', '12', '15', '10151', '7200', '0'), +('15', '12', '15', '14679', '6255', '0'), +('15', '12', '15', '14678', '5104', '0'), +('15', '12', '20', '11601', '8066', '0'), +('15', '12', '20', '2742', '5028', '0'), +('15', '12', '20', '1365', '4200', '0'), +('15', '12', '20', '1543', '3655', '0'), +('15', '12', '12', '20655', '6084', '0'), +('15', '12', '12', '2923', '4654', '0'), +('15', '12', '12', '2291', '2805', '0'), +('15', '12', '12', '11624', '2708', '0'), +('15', '12', '18', '2461', '2847', '0'), +('15', '12', '18', '4410', '2557', '0'), +('15', '12', '18', '4346', '2331', '0'), +('15', '12', '18', '2292', '1751', '0'), +('15', '12', '19', '2293', '5571', '0'), +('15', '12', '19', '68239', '4218', '0'), +('15', '12', '19', '2337', '1757', '0'), +('15', '12', '19', '4407', '1437', '0'), +('15', '12', '13', '7257', '14151', '0'), +('15', '12', '13', '6692', '13290', '0'), +('15', '12', '13', '11610', '12687', '0'), +('15', '12', '13', '6691', '11768', '0'), +('15', '12', '14', '7257', '14151', '0'), +('15', '12', '14', '6692', '13290', '0'), +('15', '12', '14', '11551', '12679', '0'), +('15', '12', '14', '6691', '11768', '0'), +('15', '12', '11', '14762', '3181', '0'), +('15', '12', '11', '20677', '1800', '0'), +('15', '12', '11', '13353', '1500', '0'), +('15', '12', '11', '9246', '1329', '0'), +('15', '13', '22', '10323', '0', '0'), +('15', '13', '22', '10664', '0', '0'), +('15', '13', '22', '9246', '0', '0'), +('15', '13', '22', '21509', '0', '0'), +('15', '13', '1', '14701', '5052', '0'), +('15', '13', '1', '14702', '4250', '0'), +('15', '13', '1', '30361', '1890', '0'), +('15', '13', '1', '10165', '1683', '0'), +('15', '13', '2', '1519', '3207', '0'), +('15', '13', '2', '10142', '3012', '0'), +('15', '13', '2', '4341', '2712', '0'), +('15', '13', '2', '4504', '2563', '0'), +('15', '13', '3', '4505', '1305', '0'), +('15', '13', '3', '10144', '1304', '0'), +('15', '13', '3', '11052', '1178', '0'), +('15', '13', '3', '2295', '1110', '0'), +('15', '13', '5', '14703', '8250', '0'), +('15', '13', '5', '14700', '4953', '0'), +('15', '13', '5', '10055', '4505', '0'), +('15', '13', '5', '2583', '3273', '0'), +('15', '13', '8', '11621', '14220', '0'), +('15', '13', '8', '1546', '11154', '0'), +('15', '13', '8', '11603', '6717', '0'), +('15', '13', '8', '1409', '6312', '0'), +('15', '13', '6', '1557', '6760', '0'), +('15', '13', '6', '2286', '2348', '0'), +('15', '13', '6', '25062', '1833', '0'), +('15', '13', '6', '2331', '991', '0'), +('15', '13', '17', '2285', '6775', '0'), +('15', '13', '17', '4342', '4107', '0'), +('15', '13', '17', '3305', '2867', '0'), +('15', '13', '17', '2348', '2084', '0'), +('15', '13', '7', '2458', '2406', '0'), +('15', '13', '7', '4343', '2331', '0'), +('15', '13', '7', '2289', '1869', '0'), +('15', '13', '7', '1361', '1812', '0'), +('15', '13', '9', '14650', '2552', '0'), +('15', '13', '9', '10149', '2491', '0'), +('15', '13', '9', '12189', '2263', '0'), +('15', '13', '9', '4344', '2211', '0'), +('15', '13', '15', '10366', '8005', '0'), +('15', '13', '15', '10151', '7200', '0'), +('15', '13', '15', '14679', '6255', '0'), +('15', '13', '15', '14678', '5104', '0'), +('15', '13', '20', '11601', '8103', '0'), +('15', '13', '20', '2742', '5064', '0'), +('15', '13', '20', '1365', '4200', '0'), +('15', '13', '20', '1543', '3716', '0'), +('15', '13', '12', '20655', '6104', '0'), +('15', '13', '12', '2923', '4654', '0'), +('15', '13', '12', '2291', '2805', '0'), +('15', '13', '12', '11624', '2733', '0'), +('15', '13', '18', '2461', '2871', '0'), +('15', '13', '18', '4410', '2557', '0'), +('15', '13', '18', '4346', '2331', '0'), +('15', '13', '18', '2292', '1775', '0'), +('15', '13', '19', '2293', '5589', '0'), +('15', '13', '19', '68239', '4236', '0'), +('15', '13', '19', '2337', '1757', '0'), +('15', '13', '19', '4407', '1492', '0'), +('15', '13', '13', '7257', '14151', '0'), +('15', '13', '13', '6692', '13290', '0'), +('15', '13', '13', '11610', '12687', '0'), +('15', '13', '13', '6691', '11768', '0'), +('15', '13', '14', '7257', '14151', '0'), +('15', '13', '14', '6692', '13290', '0'), +('15', '13', '14', '11551', '12679', '0'), +('15', '13', '14', '6691', '11768', '0'), +('15', '13', '11', '14762', '3181', '0'), +('15', '13', '11', '20677', '1800', '0'), +('15', '13', '11', '13353', '1500', '0'), +('15', '13', '11', '9246', '1389', '0'), +('15', '14', '22', '10323', '0', '0'), +('15', '14', '22', '10664', '0', '0'), +('15', '14', '22', '9246', '0', '0'), +('15', '14', '22', '21509', '0', '0'), +('15', '14', '1', '14701', '5052', '0'), +('15', '14', '1', '14702', '4250', '0'), +('15', '14', '1', '30361', '1890', '0'), +('15', '14', '1', '10165', '1683', '0'), +('15', '14', '2', '1519', '3207', '0'), +('15', '14', '2', '10142', '3012', '0'), +('15', '14', '2', '4341', '2712', '0'), +('15', '14', '2', '4504', '2563', '0'), +('15', '14', '3', '4505', '1347', '0'), +('15', '14', '3', '10144', '1304', '0'), +('15', '14', '3', '11052', '1268', '0'), +('15', '14', '3', '2295', '1122', '0'), +('15', '14', '5', '14703', '8250', '0'), +('15', '14', '5', '14700', '4953', '0'), +('15', '14', '5', '10055', '4505', '0'), +('15', '14', '5', '2583', '3291', '0'), +('15', '14', '8', '11621', '14220', '0'), +('15', '14', '8', '1546', '11215', '0'), +('15', '14', '8', '11603', '6771', '0'), +('15', '14', '8', '1409', '6312', '0'), +('15', '14', '6', '1557', '6760', '0'), +('15', '14', '6', '2286', '2369', '0'), +('15', '14', '6', '25062', '1833', '0'), +('15', '14', '6', '2331', '1009', '0'), +('15', '14', '17', '2285', '6799', '0'), +('15', '14', '17', '4342', '4168', '0'), +('15', '14', '17', '3305', '2867', '0'), +('15', '14', '17', '2348', '2105', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '14', '7', '2458', '2406', '0'), +('15', '14', '7', '4343', '2374', '0'), +('15', '14', '7', '2289', '1893', '0'), +('15', '14', '7', '1361', '1812', '0'), +('15', '14', '9', '14650', '2552', '0'), +('15', '14', '9', '10149', '2509', '0'), +('15', '14', '9', '12189', '2263', '0'), +('15', '14', '9', '4344', '2211', '0'), +('15', '14', '15', '10366', '8005', '0'), +('15', '14', '15', '10151', '7200', '0'), +('15', '14', '15', '14679', '6255', '0'), +('15', '14', '15', '14678', '5104', '0'), +('15', '14', '20', '11601', '8145', '0'), +('15', '14', '20', '2742', '5106', '0'), +('15', '14', '20', '1365', '4200', '0'), +('15', '14', '20', '1543', '3776', '0'), +('15', '14', '12', '20655', '6124', '0'), +('15', '14', '12', '2923', '4654', '0'), +('15', '14', '12', '2291', '2805', '0'), +('15', '14', '12', '11624', '2763', '0'), +('15', '14', '18', '2461', '2895', '0'), +('15', '14', '18', '4410', '2557', '0'), +('15', '14', '18', '4346', '2331', '0'), +('15', '14', '18', '2292', '1799', '0'), +('15', '14', '19', '2293', '5607', '0'), +('15', '14', '19', '68239', '4254', '0'), +('15', '14', '19', '2337', '1757', '0'), +('15', '14', '19', '4407', '1546', '0'), +('15', '14', '13', '7257', '14151', '0'), +('15', '14', '13', '6692', '13290', '0'), +('15', '14', '13', '11610', '12687', '0'), +('15', '14', '13', '6691', '11768', '0'), +('15', '14', '14', '7257', '14151', '0'), +('15', '14', '14', '6692', '13290', '0'), +('15', '14', '14', '11551', '12679', '0'), +('15', '14', '14', '6691', '11768', '0'), +('15', '14', '11', '14762', '3181', '0'), +('15', '14', '11', '20677', '1800', '0'), +('15', '14', '11', '13353', '1500', '0'), +('15', '14', '11', '9246', '1450', '0'), +('15', '15', '22', '10323', '0', '0'), +('15', '15', '22', '10664', '0', '0'), +('15', '15', '22', '9246', '0', '0'), +('15', '15', '22', '21509', '0', '0'), +('15', '15', '1', '14701', '5052', '0'), +('15', '15', '1', '14702', '4250', '0'), +('15', '15', '1', '30361', '1890', '0'), +('15', '15', '1', '10165', '1683', '0'), +('15', '15', '2', '1519', '3207', '0'), +('15', '15', '2', '10142', '3012', '0'), +('15', '15', '2', '4341', '2712', '0'), +('15', '15', '2', '4504', '2563', '0'), +('15', '15', '3', '4505', '1389', '0'), +('15', '15', '3', '11052', '1359', '0'), +('15', '15', '3', '10144', '1304', '0'), +('15', '15', '3', '2295', '1134', '0'), +('15', '15', '5', '14703', '8250', '0'), +('15', '15', '5', '14700', '4953', '0'), +('15', '15', '5', '10055', '4505', '0'), +('15', '15', '5', '2583', '3309', '0'), +('15', '15', '8', '11621', '14220', '0'), +('15', '15', '8', '1546', '11275', '0'), +('15', '15', '8', '11603', '6825', '0'), +('15', '15', '8', '1409', '6312', '0'), +('15', '15', '6', '1557', '6760', '0'), +('15', '15', '6', '2286', '2387', '0'), +('15', '15', '6', '25062', '1833', '0'), +('15', '15', '6', '2331', '1027', '0'), +('15', '15', '17', '2285', '6823', '0'), +('15', '15', '17', '4342', '4228', '0'), +('15', '15', '17', '3305', '2867', '0'), +('15', '15', '17', '2405', '2132', '0'), +('15', '15', '7', '4343', '2410', '0'), +('15', '15', '7', '2458', '2406', '0'), +('15', '15', '7', '2289', '1917', '0'), +('15', '15', '7', '1361', '1812', '0'), +('15', '15', '9', '14650', '2552', '0'), +('15', '15', '9', '10149', '2527', '0'), +('15', '15', '9', '12189', '2263', '0'), +('15', '15', '9', '4344', '2211', '0'), +('15', '15', '15', '10366', '8005', '0'), +('15', '15', '15', '10151', '7200', '0'), +('15', '15', '15', '14679', '6255', '0'), +('15', '15', '15', '14678', '5104', '0'), +('15', '15', '20', '11601', '8181', '0'), +('15', '15', '20', '2742', '5143', '0'), +('15', '15', '20', '1365', '4200', '0'), +('15', '15', '20', '1543', '3836', '0'), +('15', '15', '12', '20655', '6144', '0'), +('15', '15', '12', '2923', '4654', '0'), +('15', '15', '12', '2291', '2805', '0'), +('15', '15', '12', '11624', '2788', '0'), +('15', '15', '18', '2461', '2919', '0'), +('15', '15', '18', '4410', '2557', '0'), +('15', '15', '18', '4346', '2331', '0'), +('15', '15', '18', '2292', '1823', '0'), +('15', '15', '19', '2293', '5625', '0'), +('15', '15', '19', '68239', '4272', '0'), +('15', '15', '19', '2337', '1757', '0'), +('15', '15', '19', '4407', '1600', '0'), +('15', '15', '13', '7257', '14151', '0'), +('15', '15', '13', '6692', '13290', '0'), +('15', '15', '13', '11610', '12687', '0'), +('15', '15', '13', '6691', '11768', '0'), +('15', '15', '14', '7257', '14151', '0'), +('15', '15', '14', '6692', '13290', '0'), +('15', '15', '14', '11551', '12679', '0'), +('15', '15', '14', '6691', '11768', '0'), +('15', '15', '11', '14762', '3181', '0'), +('15', '15', '11', '20677', '1800', '0'), +('15', '15', '11', '9246', '1510', '0'), +('15', '15', '11', '13353', '1500', '0'), +('15', '16', '22', '10323', '0', '0'), +('15', '16', '22', '10664', '0', '0'), +('15', '16', '22', '9246', '0', '0'), +('15', '16', '22', '21509', '0', '0'), +('15', '16', '1', '14701', '5052', '0'), +('15', '16', '1', '14702', '4250', '0'), +('15', '16', '1', '30361', '1890', '0'), +('15', '16', '1', '10165', '1683', '0'), +('15', '16', '2', '1519', '3207', '0'), +('15', '16', '2', '10142', '3012', '0'), +('15', '16', '2', '4341', '2712', '0'), +('15', '16', '2', '4504', '2563', '0'), +('15', '16', '3', '11052', '1450', '0'), +('15', '16', '3', '4505', '1431', '0'), +('15', '16', '3', '10144', '1304', '0'), +('15', '16', '3', '2295', '1146', '0'), +('15', '16', '5', '14703', '8250', '0'), +('15', '16', '5', '14700', '4953', '0'), +('15', '16', '5', '10055', '4505', '0'), +('15', '16', '5', '2583', '3327', '0'), +('15', '16', '8', '11621', '14220', '0'), +('15', '16', '8', '1546', '11335', '0'), +('15', '16', '8', '11603', '6880', '0'), +('15', '16', '8', '1409', '6312', '0'), +('15', '16', '6', '1557', '6760', '0'), +('15', '16', '6', '2286', '2405', '0'), +('15', '16', '6', '25062', '1833', '0'), +('15', '16', '6', '2331', '1045', '0'), +('15', '16', '17', '2285', '6848', '0'), +('15', '16', '17', '4342', '4288', '0'), +('15', '16', '17', '3305', '2867', '0'), +('15', '16', '17', '2405', '2173', '0'), +('15', '16', '7', '4343', '2446', '0'), +('15', '16', '7', '2458', '2406', '0'), +('15', '16', '7', '2289', '1942', '0'), +('15', '16', '7', '1361', '1812', '0'), +('15', '16', '9', '14650', '2552', '0'), +('15', '16', '9', '10149', '2545', '0'), +('15', '16', '9', '12189', '2263', '0'), +('15', '16', '9', '4344', '2211', '0'), +('15', '16', '15', '10366', '8005', '0'), +('15', '16', '15', '10151', '7200', '0'), +('15', '16', '15', '14679', '6255', '0'), +('15', '16', '15', '14678', '5104', '0'), +('15', '16', '20', '11601', '8217', '0'), +('15', '16', '20', '2742', '5179', '0'), +('15', '16', '20', '1365', '4200', '0'), +('15', '16', '20', '1543', '3897', '0'), +('15', '16', '12', '20655', '6163', '0'), +('15', '16', '12', '2923', '4654', '0'), +('15', '16', '12', '11624', '2814', '0'), +('15', '16', '12', '2291', '2805', '0'), +('15', '16', '18', '2461', '2944', '0'), +('15', '16', '18', '4410', '2557', '0'), +('15', '16', '18', '4346', '2331', '0'), +('15', '16', '18', '2292', '1847', '0'), +('15', '16', '19', '2293', '5643', '0'), +('15', '16', '19', '68239', '4290', '0'), +('15', '16', '19', '2337', '1757', '0'), +('15', '16', '19', '4407', '1655', '0'), +('15', '16', '13', '7257', '14151', '0'), +('15', '16', '13', '6692', '13290', '0'), +('15', '16', '13', '11610', '12687', '0'), +('15', '16', '13', '6691', '11768', '0'), +('15', '16', '14', '7257', '14151', '0'), +('15', '16', '14', '6692', '13290', '0'), +('15', '16', '14', '11551', '12679', '0'), +('15', '16', '14', '6691', '11768', '0'), +('15', '16', '11', '14762', '3181', '0'), +('15', '16', '11', '20677', '1800', '0'), +('15', '16', '11', '9246', '1570', '0'), +('15', '16', '11', '13353', '1500', '0'), +('15', '17', '22', '10323', '0', '0'), +('15', '17', '22', '10664', '0', '0'), +('15', '17', '22', '9246', '0', '0'), +('15', '17', '22', '21509', '0', '0'), +('15', '17', '1', '14701', '5052', '0'), +('15', '17', '1', '14702', '4250', '0'), +('15', '17', '1', '30361', '1890', '0'), +('15', '17', '1', '10165', '1683', '0'), +('15', '17', '2', '1519', '3207', '0'), +('15', '17', '2', '10142', '3012', '0'), +('15', '17', '2', '4341', '2712', '0'), +('15', '17', '2', '4504', '2563', '0'), +('15', '17', '3', '11052', '1540', '0'), +('15', '17', '3', '4505', '1474', '0'), +('15', '17', '3', '10144', '1304', '0'), +('15', '17', '3', '2295', '1158', '0'), +('15', '17', '5', '14703', '8250', '0'), +('15', '17', '5', '14700', '4953', '0'), +('15', '17', '5', '10055', '4505', '0'), +('15', '17', '5', '2583', '3345', '0'), +('15', '17', '8', '11621', '14220', '0'), +('15', '17', '8', '1546', '11396', '0'), +('15', '17', '8', '11603', '6934', '0'), +('15', '17', '8', '1409', '6312', '0'), +('15', '17', '6', '1557', '6760', '0'), +('15', '17', '6', '2286', '2426', '0'), +('15', '17', '6', '25062', '1833', '0'), +('15', '17', '6', '2331', '1063', '0'), +('15', '17', '17', '2285', '6872', '0'), +('15', '17', '17', '4342', '4349', '0'), +('15', '17', '17', '3305', '2867', '0'), +('15', '17', '17', '2405', '2215', '0'), +('15', '17', '7', '4343', '2488', '0'), +('15', '17', '7', '2458', '2406', '0'), +('15', '17', '7', '2289', '1966', '0'), +('15', '17', '7', '1361', '1812', '0'), +('15', '17', '9', '10149', '2563', '0'), +('15', '17', '9', '14650', '2552', '0'), +('15', '17', '9', '12189', '2263', '0'), +('15', '17', '9', '4344', '2211', '0'), +('15', '17', '15', '10366', '8005', '0'), +('15', '17', '15', '10151', '7200', '0'), +('15', '17', '15', '14679', '6255', '0'), +('15', '17', '15', '14678', '5104', '0'), +('15', '17', '20', '11601', '8260', '0'), +('15', '17', '20', '2742', '5221', '0'), +('15', '17', '20', '1365', '4200', '0'), +('15', '17', '20', '1543', '3957', '0'), +('15', '17', '12', '20655', '6183', '0'), +('15', '17', '12', '2923', '4654', '0'), +('15', '17', '12', '11624', '2843', '0'), +('15', '17', '12', '2291', '2805', '0'), +('15', '17', '18', '2461', '2968', '0'), +('15', '17', '18', '4410', '2557', '0'), +('15', '17', '18', '4346', '2331', '0'), +('15', '17', '18', '2292', '1872', '0'), +('15', '17', '19', '2293', '5661', '0'), +('15', '17', '19', '68239', '4308', '0'), +('15', '17', '19', '2337', '1757', '0'), +('15', '17', '19', '4407', '1709', '0'), +('15', '17', '13', '7257', '14151', '0'), +('15', '17', '13', '6692', '13290', '0'), +('15', '17', '13', '11610', '12687', '0'), +('15', '17', '13', '6691', '11768', '0'), +('15', '17', '14', '7257', '14151', '0'), +('15', '17', '14', '6692', '13290', '0'), +('15', '17', '14', '11551', '12679', '0'), +('15', '17', '14', '6691', '11768', '0'), +('15', '17', '11', '14762', '3181', '0'), +('15', '17', '11', '20677', '1800', '0'), +('15', '17', '11', '9246', '1631', '0'), +('15', '17', '11', '13353', '1500', '0'), +('15', '18', '22', '10323', '0', '0'), +('15', '18', '22', '10664', '0', '0'), +('15', '18', '22', '9246', '0', '0'), +('15', '18', '22', '21509', '0', '0'), +('15', '18', '1', '14701', '5052', '0'), +('15', '18', '1', '14702', '4250', '0'), +('15', '18', '1', '30361', '1890', '0'), +('15', '18', '1', '10165', '1683', '0'), +('15', '18', '2', '1519', '3207', '0'), +('15', '18', '2', '10142', '3012', '0'), +('15', '18', '2', '4341', '2712', '0'), +('15', '18', '2', '4504', '2563', '0'), +('15', '18', '3', '11052', '1631', '0'), +('15', '18', '3', '4505', '1516', '0'), +('15', '18', '3', '10144', '1304', '0'), +('15', '18', '3', '14695', '1184', '0'), +('15', '18', '5', '14703', '8250', '0'), +('15', '18', '5', '14700', '4953', '0'), +('15', '18', '5', '10055', '4505', '0'), +('15', '18', '5', '2583', '3363', '0'), +('15', '18', '8', '11621', '14220', '0'), +('15', '18', '8', '1546', '11456', '0'), +('15', '18', '8', '11603', '6988', '0'), +('15', '18', '8', '1409', '6312', '0'), +('15', '18', '6', '1557', '6760', '0'), +('15', '18', '6', '2286', '2444', '0'), +('15', '18', '6', '25062', '1833', '0'), +('15', '18', '6', '2331', '1081', '0'), +('15', '18', '17', '2285', '6896', '0'), +('15', '18', '17', '4342', '4409', '0'), +('15', '18', '17', '3305', '2867', '0'), +('15', '18', '17', '2405', '2257', '0'), +('15', '18', '7', '4343', '2525', '0'), +('15', '18', '7', '2458', '2406', '0'), +('15', '18', '7', '2289', '1990', '0'), +('15', '18', '7', '1361', '1812', '0'), +('15', '18', '9', '10149', '2581', '0'), +('15', '18', '9', '14650', '2552', '0'), +('15', '18', '9', '12189', '2263', '0'), +('15', '18', '9', '4344', '2211', '0'), +('15', '18', '15', '10366', '8005', '0'), +('15', '18', '15', '10151', '7200', '0'), +('15', '18', '15', '14679', '6255', '0'), +('15', '18', '15', '14678', '5104', '0'), +('15', '18', '20', '11601', '8296', '0'), +('15', '18', '20', '2742', '5257', '0'), +('15', '18', '20', '1365', '4200', '0'), +('15', '18', '20', '1543', '4018', '0'), +('15', '18', '12', '20655', '6203', '0'), +('15', '18', '12', '2923', '4654', '0'), +('15', '18', '12', '11624', '2869', '0'), +('15', '18', '12', '2291', '2805', '0'), +('15', '18', '18', '2461', '2992', '0'), +('15', '18', '18', '4410', '2557', '0'), +('15', '18', '18', '4346', '2331', '0'), +('15', '18', '18', '2292', '1896', '0'), +('15', '18', '19', '2293', '5679', '0'), +('15', '18', '19', '68239', '4326', '0'), +('15', '18', '19', '4407', '1763', '0'), +('15', '18', '19', '2337', '1757', '0'), +('15', '18', '13', '7257', '14151', '0'), +('15', '18', '13', '6692', '13290', '0'), +('15', '18', '13', '11610', '12687', '0'), +('15', '18', '13', '6691', '11768', '0'), +('15', '18', '14', '7257', '14151', '0'), +('15', '18', '14', '6692', '13290', '0'), +('15', '18', '14', '11551', '12679', '0'), +('15', '18', '14', '6691', '11768', '0'), +('15', '18', '11', '14762', '3181', '0'), +('15', '18', '11', '20677', '1800', '0'), +('15', '18', '11', '9246', '1691', '0'), +('15', '18', '11', '13353', '1500', '0'), +('15', '19', '22', '10323', '0', '0'), +('15', '19', '22', '10664', '0', '0'), +('15', '19', '22', '9246', '0', '0'), +('15', '19', '22', '21509', '0', '0'), +('15', '19', '1', '14701', '5052', '0'), +('15', '19', '1', '14702', '4250', '0'), +('15', '19', '1', '30361', '1890', '0'), +('15', '19', '1', '10165', '1683', '0'), +('15', '19', '2', '1519', '3207', '0'), +('15', '19', '2', '10142', '3012', '0'), +('15', '19', '2', '4341', '2712', '0'), +('15', '19', '2', '2191', '2565', '0'), +('15', '19', '3', '11052', '1721', '0'), +('15', '19', '3', '4505', '1558', '0'), +('15', '19', '3', '10144', '1304', '0'), +('15', '19', '3', '14695', '1226', '0'), +('15', '19', '5', '14703', '8250', '0'), +('15', '19', '5', '14700', '4953', '0'), +('15', '19', '5', '10055', '4505', '0'), +('15', '19', '5', '2583', '3381', '0'), +('15', '19', '8', '11621', '14220', '0'), +('15', '19', '8', '1546', '11517', '0'), +('15', '19', '8', '11603', '7043', '0'), +('15', '19', '8', '1409', '6312', '0'), +('15', '19', '6', '1557', '6760', '0'), +('15', '19', '6', '2286', '2465', '0'), +('15', '19', '6', '25062', '1833', '0'), +('15', '19', '6', '2331', '1099', '0'), +('15', '19', '17', '2285', '6920', '0'), +('15', '19', '17', '4342', '4470', '0'), +('15', '19', '17', '3305', '2867', '0'), +('15', '19', '17', '2405', '2299', '0'), +('15', '19', '7', '4343', '2567', '0'), +('15', '19', '7', '2458', '2406', '0'), +('15', '19', '7', '2289', '2014', '0'), +('15', '19', '7', '2342', '1820', '0'), +('15', '19', '9', '10149', '2599', '0'), +('15', '19', '9', '14650', '2552', '0'), +('15', '19', '9', '12189', '2263', '0'), +('15', '19', '9', '4344', '2211', '0'), +('15', '19', '15', '10366', '8005', '0'), +('15', '19', '15', '10151', '7200', '0'), +('15', '19', '15', '14679', '6255', '0'), +('15', '19', '15', '14678', '5104', '0'), +('15', '19', '20', '11601', '8338', '0'), +('15', '19', '20', '2742', '5300', '0'), +('15', '19', '20', '1365', '4200', '0'), +('15', '19', '20', '1543', '4078', '0'), +('15', '19', '12', '20655', '6223', '0'), +('15', '19', '12', '2923', '4654', '0'), +('15', '19', '12', '11624', '2898', '0'), +('15', '19', '12', '2291', '2805', '0'), +('15', '19', '18', '2461', '3016', '0'), +('15', '19', '18', '4410', '2557', '0'), +('15', '19', '18', '4346', '2331', '0'), +('15', '19', '18', '2292', '1920', '0'), +('15', '19', '19', '2293', '5698', '0'), +('15', '19', '19', '68239', '4344', '0'), +('15', '19', '19', '4407', '1818', '0'), +('15', '19', '19', '2337', '1757', '0'), +('15', '19', '13', '7257', '14151', '0'), +('15', '19', '13', '6692', '13290', '0'), +('15', '19', '13', '11610', '12687', '0'), +('15', '19', '13', '6691', '11768', '0'), +('15', '19', '14', '7257', '14151', '0'), +('15', '19', '14', '6692', '13290', '0'), +('15', '19', '14', '11551', '12679', '0'), +('15', '19', '14', '6691', '11768', '0'), +('15', '19', '11', '14762', '3181', '0'), +('15', '19', '11', '20677', '1800', '0'), +('15', '19', '11', '9246', '1752', '0'), +('15', '19', '11', '13353', '1500', '0'), +('15', '20', '22', '10323', '0', '0'), +('15', '20', '22', '10664', '0', '0'), +('15', '20', '22', '9246', '0', '0'), +('15', '20', '22', '21509', '0', '0'), +('15', '20', '1', '14701', '5052', '0'), +('15', '20', '1', '14702', '4250', '0'), +('15', '20', '1', '30361', '1890', '0'), +('15', '20', '1', '10165', '1683', '0'), +('15', '20', '2', '1519', '3207', '0'), +('15', '20', '2', '10142', '3012', '0'), +('15', '20', '2', '4341', '2712', '0'), +('15', '20', '2', '2191', '2601', '0'), +('15', '20', '3', '11052', '1812', '0'), +('15', '20', '3', '4505', '1601', '0'), +('15', '20', '3', '10144', '1304', '0'), +('15', '20', '3', '14695', '1268', '0'), +('15', '20', '5', '14703', '8250', '0'), +('15', '20', '5', '14700', '4953', '0'), +('15', '20', '5', '10055', '4505', '0'), +('15', '20', '5', '2583', '3399', '0'), +('15', '20', '8', '11621', '14220', '0'), +('15', '20', '8', '1546', '11577', '0'), +('15', '20', '8', '11603', '7097', '0'), +('15', '20', '8', '1409', '6312', '0'), +('15', '20', '6', '1557', '6760', '0'), +('15', '20', '6', '2286', '2484', '0'), +('15', '20', '6', '25062', '1833', '0'), +('15', '20', '6', '2331', '1117', '0'), +('15', '20', '17', '2285', '6944', '0'), +('15', '20', '17', '4342', '4530', '0'), +('15', '20', '17', '3305', '2867', '0'), +('15', '20', '17', '2405', '2341', '0'), +('15', '20', '7', '4343', '2603', '0'), +('15', '20', '7', '2458', '2406', '0'), +('15', '20', '7', '2289', '2038', '0'), +('15', '20', '7', '2342', '1831', '0'), +('15', '20', '9', '10149', '2617', '0'), +('15', '20', '9', '14650', '2552', '0'), +('15', '20', '9', '12189', '2263', '0'), +('15', '20', '9', '4344', '2211', '0'), +('15', '20', '15', '10366', '8005', '0'), +('15', '20', '15', '10151', '7200', '0'), +('15', '20', '15', '14679', '6255', '0'), +('15', '20', '15', '14678', '5104', '0'), +('15', '20', '20', '11601', '8374', '0'), +('15', '20', '20', '2742', '5336', '0'), +('15', '20', '20', '1365', '4200', '0'), +('15', '20', '20', '1543', '4138', '0'), +('15', '20', '12', '20655', '6243', '0'), +('15', '20', '12', '2923', '4654', '0'), +('15', '20', '12', '11624', '2924', '0'), +('15', '20', '12', '2291', '2805', '0'), +('15', '20', '18', '2461', '3040', '0'), +('15', '20', '18', '4410', '2557', '0'), +('15', '20', '18', '4346', '2331', '0'), +('15', '20', '18', '2292', '1944', '0'), +('15', '20', '19', '2293', '5716', '0'), +('15', '20', '19', '68239', '4363', '0'), +('15', '20', '19', '4407', '1872', '0'), +('15', '20', '19', '2337', '1757', '0'), +('15', '20', '13', '7257', '14151', '0'), +('15', '20', '13', '6692', '13290', '0'), +('15', '20', '13', '11610', '12687', '0'), +('15', '20', '13', '6691', '11768', '0'), +('15', '20', '14', '7257', '14151', '0'), +('15', '20', '14', '6692', '13290', '0'), +('15', '20', '14', '11551', '12679', '0'), +('15', '20', '14', '6691', '11768', '0'), +('15', '20', '11', '14762', '3181', '0'), +('15', '20', '11', '9246', '1812', '0'), +('15', '20', '11', '20677', '1800', '0'), +('15', '20', '11', '13353', '1500', '0'), +('15', '21', '22', '10323', '0', '0'), +('15', '21', '22', '10664', '0', '0'), +('15', '21', '22', '9246', '0', '0'), +('15', '21', '22', '21509', '0', '0'), +('15', '21', '1', '14701', '5052', '0'), +('15', '21', '1', '14702', '4250', '0'), +('15', '21', '1', '30361', '1890', '0'), +('15', '21', '1', '10165', '1683', '0'), +('15', '21', '2', '1519', '3207', '0'), +('15', '21', '2', '10142', '3012', '0'), +('15', '21', '2', '4341', '2712', '0'), +('15', '21', '2', '2191', '2637', '0'), +('15', '21', '3', '11052', '1903', '0'), +('15', '21', '3', '4505', '1643', '0'), +('15', '21', '3', '14695', '1311', '0'), +('15', '21', '3', '10144', '1304', '0'), +('15', '21', '5', '14703', '8250', '0'), +('15', '21', '5', '14700', '4953', '0'), +('15', '21', '5', '10055', '4505', '0'), +('15', '21', '5', '2583', '3418', '0'), +('15', '21', '8', '11621', '14220', '0'), +('15', '21', '8', '1546', '11637', '0'), +('15', '21', '8', '11603', '7152', '0'), +('15', '21', '8', '1409', '6312', '0'), +('15', '21', '6', '1557', '6760', '0'), +('15', '21', '6', '2286', '2505', '0'), +('15', '21', '6', '25062', '1833', '0'), +('15', '21', '6', '2331', '1136', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '21', '17', '2285', '6968', '0'), +('15', '21', '17', '4342', '4590', '0'), +('15', '21', '17', '3305', '2867', '0'), +('15', '21', '17', '2405', '2383', '0'), +('15', '21', '7', '4343', '2646', '0'), +('15', '21', '7', '2458', '2406', '0'), +('15', '21', '7', '2289', '2062', '0'), +('15', '21', '7', '2342', '1843', '0'), +('15', '21', '9', '10149', '2636', '0'), +('15', '21', '9', '14650', '2552', '0'), +('15', '21', '9', '12189', '2263', '0'), +('15', '21', '9', '4344', '2211', '0'), +('15', '21', '15', '10366', '8005', '0'), +('15', '21', '15', '10151', '7200', '0'), +('15', '21', '15', '14679', '6255', '0'), +('15', '21', '15', '14678', '5104', '0'), +('15', '21', '20', '11601', '8417', '0'), +('15', '21', '20', '2742', '5378', '0'), +('15', '21', '20', '1365', '4200', '0'), +('15', '21', '20', '1543', '4199', '0'), +('15', '21', '12', '20655', '6263', '0'), +('15', '21', '12', '2923', '4654', '0'), +('15', '21', '12', '11624', '2953', '0'), +('15', '21', '12', '2291', '2805', '0'), +('15', '21', '18', '2461', '3064', '0'), +('15', '21', '18', '4410', '2557', '0'), +('15', '21', '18', '4346', '2331', '0'), +('15', '21', '18', '2292', '1968', '0'), +('15', '21', '19', '2293', '5734', '0'), +('15', '21', '19', '68239', '4381', '0'), +('15', '21', '19', '4407', '1927', '0'), +('15', '21', '19', '2337', '1757', '0'), +('15', '21', '13', '7257', '14151', '0'), +('15', '21', '13', '6692', '13290', '0'), +('15', '21', '13', '11610', '12687', '0'), +('15', '21', '13', '6691', '11768', '0'), +('15', '21', '14', '7257', '14151', '0'), +('15', '21', '14', '6692', '13290', '0'), +('15', '21', '14', '11551', '12679', '0'), +('15', '21', '14', '6691', '11768', '0'), +('15', '21', '11', '14762', '3181', '0'), +('15', '21', '11', '9246', '1872', '0'), +('15', '21', '11', '20677', '1800', '0'), +('15', '21', '11', '13353', '1500', '0'), +('15', '22', '22', '10323', '0', '0'), +('15', '22', '22', '10664', '0', '0'), +('15', '22', '22', '9246', '0', '0'), +('15', '22', '22', '21509', '0', '0'), +('15', '22', '1', '14701', '5052', '0'), +('15', '22', '1', '14702', '4250', '0'), +('15', '22', '1', '30361', '1890', '0'), +('15', '22', '1', '10165', '1683', '0'), +('15', '22', '2', '1519', '3207', '0'), +('15', '22', '2', '10142', '3012', '0'), +('15', '22', '2', '4341', '2712', '0'), +('15', '22', '2', '2191', '2673', '0'), +('15', '22', '3', '11052', '1993', '0'), +('15', '22', '3', '4505', '1685', '0'), +('15', '22', '3', '14695', '1353', '0'), +('15', '22', '3', '10144', '1304', '0'), +('15', '22', '5', '14703', '8250', '0'), +('15', '22', '5', '14700', '4953', '0'), +('15', '22', '5', '10055', '4505', '0'), +('15', '22', '5', '2583', '3436', '0'), +('15', '22', '8', '11621', '14220', '0'), +('15', '22', '8', '1546', '11698', '0'), +('15', '22', '8', '11603', '7206', '0'), +('15', '22', '8', '1409', '6312', '0'), +('15', '22', '6', '1557', '6760', '0'), +('15', '22', '6', '2286', '2523', '0'), +('15', '22', '6', '25062', '1833', '0'), +('15', '22', '6', '2331', '1154', '0'), +('15', '22', '17', '2285', '6993', '0'), +('15', '22', '17', '4342', '4651', '0'), +('15', '22', '17', '3305', '2867', '0'), +('15', '22', '17', '2405', '2424', '0'), +('15', '22', '7', '4343', '2682', '0'), +('15', '22', '7', '2458', '2406', '0'), +('15', '22', '7', '2289', '2087', '0'), +('15', '22', '7', '2342', '1854', '0'), +('15', '22', '9', '10149', '2654', '0'), +('15', '22', '9', '14650', '2552', '0'), +('15', '22', '9', '12189', '2263', '0'), +('15', '22', '9', '4344', '2211', '0'), +('15', '22', '15', '10366', '8005', '0'), +('15', '22', '15', '10151', '7200', '0'), +('15', '22', '15', '14679', '6255', '0'), +('15', '22', '15', '14678', '5104', '0'), +('15', '22', '20', '11601', '8453', '0'), +('15', '22', '20', '2742', '5414', '0'), +('15', '22', '20', '1543', '4259', '0'), +('15', '22', '20', '1365', '4200', '0'), +('15', '22', '12', '20655', '6283', '0'), +('15', '22', '12', '2923', '4654', '0'), +('15', '22', '12', '11624', '2979', '0'), +('15', '22', '12', '2291', '2805', '0'), +('15', '22', '18', '2461', '3089', '0'), +('15', '22', '18', '4410', '2557', '0'), +('15', '22', '18', '4346', '2331', '0'), +('15', '22', '18', '2292', '1992', '0'), +('15', '22', '19', '2293', '5752', '0'), +('15', '22', '19', '68239', '4399', '0'), +('15', '22', '19', '4407', '1981', '0'), +('15', '22', '19', '2337', '1757', '0'), +('15', '22', '13', '7257', '14151', '0'), +('15', '22', '13', '6692', '13290', '0'), +('15', '22', '13', '11610', '12687', '0'), +('15', '22', '13', '6691', '11768', '0'), +('15', '22', '14', '7257', '14151', '0'), +('15', '22', '14', '6692', '13290', '0'), +('15', '22', '14', '11551', '12679', '0'), +('15', '22', '14', '6691', '11768', '0'), +('15', '22', '11', '14762', '3181', '0'), +('15', '22', '11', '9246', '1933', '0'), +('15', '22', '11', '20677', '1800', '0'), +('15', '22', '11', '13353', '1500', '0'), +('15', '23', '22', '10323', '0', '0'), +('15', '23', '22', '10664', '0', '0'), +('15', '23', '22', '9246', '0', '0'), +('15', '23', '22', '21509', '0', '0'), +('15', '23', '1', '14701', '5052', '0'), +('15', '23', '1', '14702', '4250', '0'), +('15', '23', '1', '30361', '1890', '0'), +('15', '23', '1', '10165', '1683', '0'), +('15', '23', '2', '1519', '3207', '0'), +('15', '23', '2', '10142', '3012', '0'), +('15', '23', '2', '4341', '2712', '0'), +('15', '23', '2', '2191', '2710', '0'), +('15', '23', '3', '11052', '2084', '0'), +('15', '23', '3', '4505', '1727', '0'), +('15', '23', '3', '14695', '1395', '0'), +('15', '23', '3', '10144', '1304', '0'), +('15', '23', '5', '14703', '8250', '0'), +('15', '23', '5', '14700', '4953', '0'), +('15', '23', '5', '10055', '4505', '0'), +('15', '23', '5', '2583', '3454', '0'), +('15', '23', '8', '11621', '14220', '0'), +('15', '23', '8', '1546', '11758', '0'), +('15', '23', '8', '11603', '7260', '0'), +('15', '23', '8', '1409', '6312', '0'), +('15', '23', '6', '1557', '6760', '0'), +('15', '23', '6', '2286', '2544', '0'), +('15', '23', '6', '25062', '1833', '0'), +('15', '23', '6', '2331', '1172', '0'), +('15', '23', '17', '2285', '7017', '0'), +('15', '23', '17', '4342', '4711', '0'), +('15', '23', '17', '3305', '2867', '0'), +('15', '23', '17', '2405', '2467', '0'), +('15', '23', '7', '4343', '2724', '0'), +('15', '23', '7', '2458', '2406', '0'), +('15', '23', '7', '2289', '2111', '0'), +('15', '23', '7', '2342', '1867', '0'), +('15', '23', '9', '10149', '2672', '0'), +('15', '23', '9', '14650', '2552', '0'), +('15', '23', '9', '12189', '2263', '0'), +('15', '23', '9', '4344', '2211', '0'), +('15', '23', '15', '10366', '8005', '0'), +('15', '23', '15', '10151', '7200', '0'), +('15', '23', '15', '14679', '6255', '0'), +('15', '23', '15', '14678', '5104', '0'), +('15', '23', '20', '11601', '8495', '0'), +('15', '23', '20', '2742', '5457', '0'), +('15', '23', '20', '1543', '4320', '0'), +('15', '23', '20', '1365', '4200', '0'), +('15', '23', '12', '20655', '6303', '0'), +('15', '23', '12', '2923', '4654', '0'), +('15', '23', '12', '11624', '3008', '0'), +('15', '23', '12', '4345', '2807', '0'), +('15', '23', '18', '2461', '3113', '0'), +('15', '23', '18', '4410', '2557', '0'), +('15', '23', '18', '4346', '2331', '0'), +('15', '23', '18', '2292', '2017', '0'), +('15', '23', '19', '2293', '5770', '0'), +('15', '23', '19', '68239', '4417', '0'), +('15', '23', '19', '4407', '2035', '0'), +('15', '23', '19', '2337', '1757', '0'), +('15', '23', '13', '7257', '14151', '0'), +('15', '23', '13', '6692', '13290', '0'), +('15', '23', '13', '11610', '12687', '0'), +('15', '23', '13', '6691', '11768', '0'), +('15', '23', '14', '7257', '14151', '0'), +('15', '23', '14', '6692', '13290', '0'), +('15', '23', '14', '11551', '12679', '0'), +('15', '23', '14', '6691', '11768', '0'), +('15', '23', '11', '14762', '3181', '0'), +('15', '23', '11', '9246', '1993', '0'), +('15', '23', '11', '20677', '1800', '0'), +('15', '23', '11', '13353', '1500', '0'), +('15', '24', '22', '10323', '0', '0'), +('15', '24', '22', '10664', '0', '0'), +('15', '24', '22', '9246', '0', '0'), +('15', '24', '22', '21509', '0', '0'), +('15', '24', '1', '14701', '5052', '0'), +('15', '24', '1', '14702', '4250', '0'), +('15', '24', '1', '30361', '1890', '0'), +('15', '24', '1', '10165', '1683', '0'), +('15', '24', '2', '1519', '3207', '0'), +('15', '24', '2', '10142', '3012', '0'), +('15', '24', '2', '2191', '2746', '0'), +('15', '24', '2', '4341', '2712', '0'), +('15', '24', '3', '11052', '2174', '0'), +('15', '24', '3', '4505', '1770', '0'), +('15', '24', '3', '14695', '1438', '0'), +('15', '24', '3', '10144', '1304', '0'), +('15', '24', '5', '14703', '8250', '0'), +('15', '24', '5', '14700', '4953', '0'), +('15', '24', '5', '10055', '4505', '0'), +('15', '24', '5', '68291', '3617', '0'), +('15', '24', '8', '11621', '14220', '0'), +('15', '24', '8', '1546', '11819', '0'), +('15', '24', '8', '11603', '7315', '0'), +('15', '24', '8', '1409', '6312', '0'), +('15', '24', '6', '1557', '6760', '0'), +('15', '24', '6', '2286', '2565', '0'), +('15', '24', '6', '25062', '1833', '0'), +('15', '24', '6', '2331', '1190', '0'), +('15', '24', '17', '2285', '7041', '0'), +('15', '24', '17', '4342', '4772', '0'), +('15', '24', '17', '3305', '2867', '0'), +('15', '24', '17', '2405', '2510', '0'), +('15', '24', '7', '4343', '2766', '0'), +('15', '24', '7', '2458', '2406', '0'), +('15', '24', '7', '2289', '2135', '0'), +('15', '24', '7', '2342', '1879', '0'), +('15', '24', '9', '10149', '2690', '0'), +('15', '24', '9', '14650', '2552', '0'), +('15', '24', '9', '12189', '2263', '0'), +('15', '24', '9', '4344', '2211', '0'), +('15', '24', '15', '10366', '8005', '0'), +('15', '24', '15', '10151', '7200', '0'), +('15', '24', '15', '14679', '6255', '0'), +('15', '24', '15', '14678', '5104', '0'), +('15', '24', '20', '11601', '8537', '0'), +('15', '24', '20', '2742', '5499', '0'), +('15', '24', '20', '1543', '4380', '0'), +('15', '24', '20', '1365', '4200', '0'), +('15', '24', '12', '20655', '6324', '0'), +('15', '24', '12', '2923', '4654', '0'), +('15', '24', '12', '11624', '3038', '0'), +('15', '24', '12', '4345', '2837', '0'), +('15', '24', '18', '2461', '3137', '0'), +('15', '24', '18', '4410', '2557', '0'), +('15', '24', '18', '4346', '2331', '0'), +('15', '24', '18', '2292', '2041', '0'), +('15', '24', '19', '2293', '5788', '0'), +('15', '24', '19', '68239', '4435', '0'), +('15', '24', '19', '4407', '2090', '0'), +('15', '24', '19', '2337', '1757', '0'), +('15', '24', '13', '7257', '14151', '0'), +('15', '24', '13', '6692', '13290', '0'), +('15', '24', '13', '11610', '12687', '0'), +('15', '24', '13', '6691', '11768', '0'), +('15', '24', '14', '7257', '14151', '0'), +('15', '24', '14', '6692', '13290', '0'), +('15', '24', '14', '11551', '12679', '0'), +('15', '24', '14', '6691', '11768', '0'), +('15', '24', '11', '14762', '3181', '0'), +('15', '24', '11', '9246', '2054', '0'), +('15', '24', '11', '20677', '1800', '0'), +('15', '24', '11', '13353', '1500', '0'), +('15', '25', '22', '10323', '0', '0'), +('15', '25', '22', '10664', '0', '0'), +('15', '25', '22', '9246', '0', '0'), +('15', '25', '22', '21509', '0', '0'), +('15', '25', '1', '14701', '5052', '0'), +('15', '25', '1', '14702', '4250', '0'), +('15', '25', '1', '30361', '1890', '0'), +('15', '25', '1', '10165', '1683', '0'), +('15', '25', '2', '1519', '3207', '0'), +('15', '25', '2', '10142', '3012', '0'), +('15', '25', '2', '2191', '2782', '0'), +('15', '25', '2', '4341', '2712', '0'), +('15', '25', '3', '11052', '2265', '0'), +('15', '25', '3', '4505', '1812', '0'), +('15', '25', '3', '14695', '1480', '0'), +('15', '25', '3', '10144', '1304', '0'), +('15', '25', '5', '14703', '8250', '0'), +('15', '25', '5', '14700', '4953', '0'), +('15', '25', '5', '10055', '4505', '0'), +('15', '25', '5', '68291', '3792', '0'), +('15', '25', '8', '11621', '14220', '0'), +('15', '25', '8', '1546', '11879', '0'), +('15', '25', '8', '11603', '7369', '0'), +('15', '25', '8', '1409', '6312', '0'), +('15', '25', '6', '1557', '6760', '0'), +('15', '25', '6', '2286', '2583', '0'), +('15', '25', '6', '25062', '1833', '0'), +('15', '25', '6', '2331', '1208', '0'), +('15', '25', '17', '2285', '7065', '0'), +('15', '25', '17', '4342', '4832', '0'), +('15', '25', '17', '3305', '2867', '0'), +('15', '25', '17', '2405', '2551', '0'), +('15', '25', '7', '4343', '2803', '0'), +('15', '25', '7', '2458', '2406', '0'), +('15', '25', '7', '2289', '2159', '0'), +('15', '25', '7', '2342', '1890', '0'), +('15', '25', '9', '10149', '2708', '0'), +('15', '25', '9', '14650', '2552', '0'), +('15', '25', '9', '12189', '2263', '0'), +('15', '25', '9', '4344', '2211', '0'), +('15', '25', '15', '10366', '8005', '0'), +('15', '25', '15', '10151', '7200', '0'), +('15', '25', '15', '14679', '6255', '0'), +('15', '25', '15', '14678', '5104', '0'), +('15', '25', '20', '11601', '8574', '0'), +('15', '25', '20', '2742', '5535', '0'), +('15', '25', '20', '1543', '4440', '0'), +('15', '25', '20', '1365', '4200', '0'), +('15', '25', '12', '20655', '6343', '0'), +('15', '25', '12', '2923', '4654', '0'), +('15', '25', '12', '11624', '3063', '0'), +('15', '25', '12', '4345', '2867', '0'), +('15', '25', '18', '2461', '3161', '0'), +('15', '25', '18', '4410', '2557', '0'), +('15', '25', '18', '4346', '2331', '0'), +('15', '25', '18', '2292', '2065', '0'), +('15', '25', '19', '2293', '5806', '0'), +('15', '25', '19', '68239', '4453', '0'), +('15', '25', '19', '4407', '2144', '0'), +('15', '25', '19', '2337', '1757', '0'), +('15', '25', '13', '7257', '14151', '0'), +('15', '25', '13', '6692', '13290', '0'), +('15', '25', '13', '11610', '12687', '0'), +('15', '25', '13', '6691', '11768', '0'), +('15', '25', '14', '7257', '14151', '0'), +('15', '25', '14', '6692', '13290', '0'), +('15', '25', '14', '11551', '12679', '0'), +('15', '25', '14', '6691', '11768', '0'), +('15', '25', '11', '14762', '3181', '0'), +('15', '25', '11', '9246', '2114', '0'), +('15', '25', '11', '20677', '1800', '0'), +('15', '25', '11', '13353', '1500', '0'), +('15', '26', '22', '10323', '0', '0'), +('15', '26', '22', '10664', '0', '0'), +('15', '26', '22', '9246', '0', '0'), +('15', '26', '22', '21509', '0', '0'), +('15', '26', '1', '14701', '5052', '0'), +('15', '26', '1', '14702', '4250', '0'), +('15', '26', '1', '30361', '1890', '0'), +('15', '26', '1', '10165', '1683', '0'), +('15', '26', '2', '1519', '3207', '0'), +('15', '26', '2', '10142', '3012', '0'), +('15', '26', '2', '2191', '2818', '0'), +('15', '26', '2', '4341', '2712', '0'), +('15', '26', '3', '11052', '2356', '0'), +('15', '26', '3', '4505', '1854', '0'), +('15', '26', '3', '14695', '1522', '0'), +('15', '26', '3', '10144', '1304', '0'), +('15', '26', '5', '14703', '8250', '0'), +('15', '26', '5', '14700', '4953', '0'), +('15', '26', '5', '10055', '4505', '0'), +('15', '26', '5', '68291', '3816', '0'), +('15', '26', '8', '11621', '14220', '0'), +('15', '26', '8', '1546', '11939', '0'), +('15', '26', '8', '11603', '7423', '0'), +('15', '26', '8', '1409', '6312', '0'), +('15', '26', '6', '1557', '6760', '0'), +('15', '26', '6', '2286', '2604', '0'), +('15', '26', '6', '25062', '1833', '0'), +('15', '26', '6', '2331', '1226', '0'), +('15', '26', '17', '2285', '7089', '0'), +('15', '26', '17', '4342', '4892', '0'), +('15', '26', '17', '3305', '2867', '0'), +('15', '26', '17', '2405', '2594', '0'), +('15', '26', '7', '4343', '2845', '0'), +('15', '26', '7', '2458', '2406', '0'), +('15', '26', '7', '2289', '2183', '0'), +('15', '26', '7', '2342', '1903', '0'), +('15', '26', '9', '10149', '2726', '0'), +('15', '26', '9', '14650', '2552', '0'), +('15', '26', '9', '12189', '2263', '0'), +('15', '26', '9', '4344', '2211', '0'), +('15', '26', '15', '10366', '8005', '0'), +('15', '26', '15', '10151', '7200', '0'), +('15', '26', '15', '14679', '6255', '0'), +('15', '26', '15', '14678', '5104', '0'), +('15', '26', '20', '11601', '8616', '0'), +('15', '26', '20', '2742', '5577', '0'), +('15', '26', '20', '1543', '4501', '0'), +('15', '26', '20', '1365', '4200', '0'), +('15', '26', '12', '20655', '6363', '0'), +('15', '26', '12', '2923', '4654', '0'), +('15', '26', '12', '11624', '3093', '0'), +('15', '26', '12', '4345', '2897', '0'), +('15', '26', '18', '2461', '3185', '0'), +('15', '26', '18', '4410', '2557', '0'), +('15', '26', '18', '4346', '2331', '0'), +('15', '26', '18', '2292', '2089', '0'), +('15', '26', '19', '2293', '5824', '0'), +('15', '26', '19', '68239', '4471', '0'), +('15', '26', '19', '4407', '2198', '0'), +('15', '26', '19', '2337', '1757', '0'), +('15', '26', '13', '7257', '14151', '0'), +('15', '26', '13', '6692', '13290', '0'), +('15', '26', '13', '11610', '12687', '0'), +('15', '26', '13', '6691', '11768', '0'), +('15', '26', '14', '7257', '14151', '0'), +('15', '26', '14', '6692', '13290', '0'), +('15', '26', '14', '11551', '12679', '0'), +('15', '26', '14', '6691', '11768', '0'), +('15', '26', '11', '14762', '3181', '0'), +('15', '26', '11', '9246', '2174', '0'), +('15', '26', '11', '20677', '1800', '0'), +('15', '26', '11', '13353', '1500', '0'), +('15', '27', '22', '10323', '0', '0'), +('15', '27', '22', '10664', '0', '0'), +('15', '27', '22', '9246', '0', '0'), +('15', '27', '22', '21509', '0', '0'), +('15', '27', '1', '14701', '5052', '0'), +('15', '27', '1', '14702', '4250', '0'), +('15', '27', '1', '30361', '1890', '0'), +('15', '27', '1', '10165', '1683', '0'), +('15', '27', '2', '1519', '3207', '0'), +('15', '27', '2', '10142', '3012', '0'), +('15', '27', '2', '2191', '2855', '0'), +('15', '27', '2', '4341', '2712', '0'), +('15', '27', '3', '11052', '2446', '0'), +('15', '27', '3', '4505', '1897', '0'), +('15', '27', '3', '14695', '1564', '0'), +('15', '27', '3', '10144', '1304', '0'), +('15', '27', '5', '14703', '8250', '0'), +('15', '27', '5', '14700', '4953', '0'), +('15', '27', '5', '10055', '4505', '0'), +('15', '27', '5', '68291', '3841', '0'), +('15', '27', '8', '11621', '14220', '0'), +('15', '27', '8', '1546', '12000', '0'), +('15', '27', '8', '11603', '7478', '0'), +('15', '27', '8', '1409', '6312', '0'), +('15', '27', '6', '1557', '6760', '0'), +('15', '27', '6', '2286', '2625', '0'), +('15', '27', '6', '25062', '1833', '0'), +('15', '27', '6', '2331', '1244', '0'), +('15', '27', '17', '2285', '7113', '0'), +('15', '27', '17', '4342', '4953', '0'), +('15', '27', '17', '3305', '2867', '0'), +('15', '27', '17', '2405', '2637', '0'), +('15', '27', '7', '4343', '2887', '0'), +('15', '27', '7', '2458', '2406', '0'), +('15', '27', '7', '2289', '2207', '0'), +('15', '27', '7', '2342', '1916', '0'), +('15', '27', '9', '10149', '2744', '0'), +('15', '27', '9', '14650', '2552', '0'), +('15', '27', '9', '12189', '2263', '0'), +('15', '27', '9', '4344', '2211', '0'), +('15', '27', '15', '10366', '8005', '0'), +('15', '27', '15', '10151', '7200', '0'), +('15', '27', '15', '14679', '6255', '0'), +('15', '27', '15', '14678', '5104', '0'), +('15', '27', '20', '11601', '8658', '0'), +('15', '27', '20', '2742', '5620', '0'), +('15', '27', '20', '1543', '4561', '0'), +('15', '27', '20', '1365', '4200', '0'), +('15', '27', '12', '20655', '6384', '0'), +('15', '27', '12', '2923', '4654', '0'), +('15', '27', '12', '11624', '3122', '0'), +('15', '27', '12', '4345', '2927', '0'), +('15', '27', '18', '2461', '3209', '0'), +('15', '27', '18', '4410', '2557', '0'), +('15', '27', '18', '4346', '2331', '0'), +('15', '27', '18', '2292', '2113', '0'), +('15', '27', '19', '2293', '5843', '0'), +('15', '27', '19', '68239', '4489', '0'), +('15', '27', '19', '4407', '2253', '0'), +('15', '27', '19', '2337', '1757', '0'), +('15', '27', '13', '7257', '14151', '0'), +('15', '27', '13', '6692', '13290', '0'), +('15', '27', '13', '11610', '12687', '0'), +('15', '27', '13', '6691', '11768', '0'), +('15', '27', '14', '7257', '14151', '0'), +('15', '27', '14', '6692', '13290', '0'), +('15', '27', '14', '11551', '12679', '0'), +('15', '27', '14', '6691', '11768', '0'), +('15', '27', '11', '14762', '3181', '0'), +('15', '27', '11', '9246', '2235', '0'), +('15', '27', '11', '20677', '1800', '0'), +('15', '27', '11', '13353', '1500', '0'), +('15', '28', '22', '10323', '0', '0'), +('15', '28', '22', '10664', '0', '0'), +('15', '28', '22', '9246', '0', '0'), +('15', '28', '22', '21509', '0', '0'), +('15', '28', '1', '14701', '5052', '0'), +('15', '28', '1', '14702', '4250', '0'), +('15', '28', '1', '30361', '1890', '0'), +('15', '28', '1', '10165', '1683', '0'), +('15', '28', '2', '1519', '3207', '0'), +('15', '28', '2', '10142', '3012', '0'), +('15', '28', '2', '2191', '2891', '0'), +('15', '28', '2', '4341', '2712', '0'), +('15', '28', '3', '11052', '2537', '0'), +('15', '28', '3', '4505', '1939', '0'), +('15', '28', '3', '14695', '1607', '0'), +('15', '28', '3', '10144', '1304', '0'), +('15', '28', '5', '14703', '8250', '0'), +('15', '28', '5', '14700', '4953', '0'), +('15', '28', '5', '10055', '4505', '0'), +('15', '28', '5', '68291', '3865', '0'), +('15', '28', '8', '11621', '14220', '0'), +('15', '28', '8', '1546', '12060', '0'), +('15', '28', '8', '11603', '7532', '0'), +('15', '28', '8', '1409', '6312', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '28', '6', '1557', '6760', '0'), +('15', '28', '6', '2286', '2644', '0'), +('15', '28', '6', '25062', '1833', '0'), +('15', '28', '6', '2331', '1262', '0'), +('15', '28', '17', '2285', '7137', '0'), +('15', '28', '17', '4342', '5013', '0'), +('15', '28', '17', '3305', '2867', '0'), +('15', '28', '17', '2405', '2678', '0'), +('15', '28', '7', '4343', '2923', '0'), +('15', '28', '7', '2458', '2406', '0'), +('15', '28', '7', '2289', '2231', '0'), +('15', '28', '7', '2342', '1927', '0'), +('15', '28', '9', '10149', '2762', '0'), +('15', '28', '9', '14650', '2552', '0'), +('15', '28', '9', '12189', '2263', '0'), +('15', '28', '9', '4344', '2211', '0'), +('15', '28', '15', '10366', '8005', '0'), +('15', '28', '15', '10151', '7200', '0'), +('15', '28', '15', '14679', '6255', '0'), +('15', '28', '15', '14678', '5104', '0'), +('15', '28', '20', '11601', '8695', '0'), +('15', '28', '20', '2742', '5656', '0'), +('15', '28', '20', '1543', '4622', '0'), +('15', '28', '20', '1365', '4200', '0'), +('15', '28', '12', '20655', '6403', '0'), +('15', '28', '12', '2923', '4654', '0'), +('15', '28', '12', '11624', '3148', '0'), +('15', '28', '12', '4345', '2958', '0'), +('15', '28', '18', '2461', '3233', '0'), +('15', '28', '18', '4410', '2557', '0'), +('15', '28', '18', '4346', '2331', '0'), +('15', '28', '18', '2292', '2137', '0'), +('15', '28', '19', '2293', '5861', '0'), +('15', '28', '19', '68239', '4508', '0'), +('15', '28', '19', '4407', '2307', '0'), +('15', '28', '19', '2337', '1757', '0'), +('15', '28', '13', '7257', '14151', '0'), +('15', '28', '13', '6692', '13290', '0'), +('15', '28', '13', '11610', '12687', '0'), +('15', '28', '13', '6691', '11768', '0'), +('15', '28', '14', '7257', '14151', '0'), +('15', '28', '14', '6692', '13290', '0'), +('15', '28', '14', '11551', '12679', '0'), +('15', '28', '14', '6691', '11768', '0'), +('15', '28', '11', '14762', '3181', '0'), +('15', '28', '11', '9246', '2295', '0'), +('15', '28', '11', '20677', '1800', '0'), +('15', '28', '11', '13353', '1500', '0'), +('15', '29', '22', '10323', '0', '0'), +('15', '29', '22', '10664', '0', '0'), +('15', '29', '22', '9246', '0', '0'), +('15', '29', '22', '21509', '0', '0'), +('15', '29', '1', '14701', '5052', '0'), +('15', '29', '1', '14702', '4250', '0'), +('15', '29', '1', '30361', '1890', '0'), +('15', '29', '1', '10165', '1683', '0'), +('15', '29', '2', '1519', '3207', '0'), +('15', '29', '2', '10142', '3012', '0'), +('15', '29', '2', '2191', '2927', '0'), +('15', '29', '2', '4341', '2712', '0'), +('15', '29', '3', '11052', '2627', '0'), +('15', '29', '3', '4505', '1981', '0'), +('15', '29', '3', '14695', '1649', '0'), +('15', '29', '3', '10144', '1304', '0'), +('15', '29', '5', '14703', '8250', '0'), +('15', '29', '5', '14700', '4953', '0'), +('15', '29', '5', '10055', '4505', '0'), +('15', '29', '5', '68291', '3889', '0'), +('15', '29', '8', '11621', '14220', '0'), +('15', '29', '8', '1546', '12121', '0'), +('15', '29', '8', '11603', '7586', '0'), +('15', '29', '8', '1409', '6312', '0'), +('15', '29', '6', '1557', '6760', '0'), +('15', '29', '6', '2286', '2665', '0'), +('15', '29', '6', '25062', '1833', '0'), +('15', '29', '6', '2331', '1280', '0'), +('15', '29', '17', '2285', '7162', '0'), +('15', '29', '17', '4342', '5074', '0'), +('15', '29', '17', '3305', '2867', '0'), +('15', '29', '17', '2405', '2721', '0'), +('15', '29', '7', '4343', '2966', '0'), +('15', '29', '7', '2458', '2406', '0'), +('15', '29', '7', '2289', '2256', '0'), +('15', '29', '7', '2342', '1939', '0'), +('15', '29', '9', '10149', '2780', '0'), +('15', '29', '9', '14650', '2552', '0'), +('15', '29', '9', '12189', '2263', '0'), +('15', '29', '9', '4344', '2211', '0'), +('15', '29', '15', '10366', '8005', '0'), +('15', '29', '15', '10151', '7200', '0'), +('15', '29', '15', '14679', '6255', '0'), +('15', '29', '15', '14678', '5104', '0'), +('15', '29', '20', '11601', '8737', '0'), +('15', '29', '20', '2742', '5698', '0'), +('15', '29', '20', '1543', '4682', '0'), +('15', '29', '20', '1365', '4200', '0'), +('15', '29', '12', '20655', '6424', '0'), +('15', '29', '12', '2923', '4654', '0'), +('15', '29', '12', '11624', '3177', '0'), +('15', '29', '12', '4345', '2988', '0'), +('15', '29', '18', '2461', '3258', '0'), +('15', '29', '18', '4410', '2557', '0'), +('15', '29', '18', '4346', '2331', '0'), +('15', '29', '18', '2292', '2161', '0'), +('15', '29', '19', '2293', '5879', '0'), +('15', '29', '19', '68239', '4526', '0'), +('15', '29', '19', '4407', '2361', '0'), +('15', '29', '19', '2337', '1757', '0'), +('15', '29', '13', '7257', '14151', '0'), +('15', '29', '13', '6692', '13290', '0'), +('15', '29', '13', '11610', '12687', '0'), +('15', '29', '13', '6691', '11768', '0'), +('15', '29', '14', '7257', '14151', '0'), +('15', '29', '14', '6692', '13290', '0'), +('15', '29', '14', '11551', '12679', '0'), +('15', '29', '14', '6691', '11768', '0'), +('15', '29', '11', '14762', '3181', '0'), +('15', '29', '11', '9246', '2356', '0'), +('15', '29', '11', '20677', '1800', '0'), +('15', '29', '11', '13353', '1500', '0'), +('15', '30', '22', '10323', '0', '0'), +('15', '30', '22', '10664', '0', '0'), +('15', '30', '22', '9246', '0', '0'), +('15', '30', '22', '21509', '0', '0'), +('15', '30', '1', '14701', '5052', '0'), +('15', '30', '1', '14702', '4250', '0'), +('15', '30', '1', '30361', '1890', '0'), +('15', '30', '1', '10165', '1683', '0'), +('15', '30', '2', '1519', '3207', '0'), +('15', '30', '2', '10142', '3012', '0'), +('15', '30', '2', '2191', '2963', '0'), +('15', '30', '2', '4341', '2712', '0'), +('15', '30', '3', '11052', '2718', '0'), +('15', '30', '3', '4505', '2023', '0'), +('15', '30', '3', '14695', '1691', '0'), +('15', '30', '3', '2295', '1315', '0'), +('15', '30', '5', '14703', '8250', '0'), +('15', '30', '5', '14700', '4953', '0'), +('15', '30', '5', '10055', '4505', '0'), +('15', '30', '5', '68291', '3913', '0'), +('15', '30', '8', '11621', '14220', '0'), +('15', '30', '8', '1546', '12181', '0'), +('15', '30', '8', '11603', '7641', '0'), +('15', '30', '8', '1409', '6312', '0'), +('15', '30', '6', '1557', '6760', '0'), +('15', '30', '6', '2286', '2686', '0'), +('15', '30', '6', '25062', '1833', '0'), +('15', '30', '6', '2331', '1299', '0'), +('15', '30', '17', '2285', '7186', '0'), +('15', '30', '17', '4342', '5134', '0'), +('15', '30', '17', '3305', '2867', '0'), +('15', '30', '17', '2405', '2764', '0'), +('15', '30', '7', '4343', '3008', '0'), +('15', '30', '7', '2458', '2406', '0'), +('15', '30', '7', '2289', '2280', '0'), +('15', '30', '7', '2342', '1952', '0'), +('15', '30', '9', '10149', '2799', '0'), +('15', '30', '9', '14650', '2552', '0'), +('15', '30', '9', '12189', '2263', '0'), +('15', '30', '9', '4344', '2211', '0'), +('15', '30', '15', '10366', '8005', '0'), +('15', '30', '15', '10151', '7200', '0'), +('15', '30', '15', '14679', '6255', '0'), +('15', '30', '15', '14678', '5104', '0'), +('15', '30', '20', '11601', '8779', '0'), +('15', '30', '20', '2742', '5740', '0'), +('15', '30', '20', '1543', '4742', '0'), +('15', '30', '20', '1365', '4200', '0'), +('15', '30', '12', '20655', '6444', '0'), +('15', '30', '12', '2923', '4654', '0'), +('15', '30', '12', '11624', '3207', '0'), +('15', '30', '12', '4345', '3018', '0'), +('15', '30', '18', '2461', '3282', '0'), +('15', '30', '18', '4410', '2557', '0'), +('15', '30', '18', '4346', '2331', '0'), +('15', '30', '18', '2292', '2186', '0'), +('15', '30', '19', '2293', '5897', '0'), +('15', '30', '19', '68239', '4544', '0'), +('15', '30', '19', '4407', '2416', '0'), +('15', '30', '19', '2337', '1757', '0'), +('15', '30', '13', '7257', '14151', '0'), +('15', '30', '13', '6692', '13290', '0'), +('15', '30', '13', '11610', '12687', '0'), +('15', '30', '13', '6691', '11768', '0'), +('15', '30', '14', '7257', '14151', '0'), +('15', '30', '14', '6692', '13290', '0'), +('15', '30', '14', '11551', '12679', '0'), +('15', '30', '14', '6691', '11768', '0'), +('15', '30', '11', '14762', '3181', '0'), +('15', '30', '11', '9246', '2416', '0'), +('15', '30', '11', '20677', '1800', '0'), +('15', '30', '11', '13353', '1500', '0'), +('15', '31', '22', '10323', '0', '0'), +('15', '31', '22', '10664', '0', '0'), +('15', '31', '22', '9246', '0', '0'), +('15', '31', '22', '21509', '0', '0'), +('15', '31', '1', '14701', '5052', '0'), +('15', '31', '1', '14702', '4250', '0'), +('15', '31', '1', '30361', '1890', '0'), +('15', '31', '1', '10165', '1683', '0'), +('15', '31', '2', '1519', '3207', '0'), +('15', '31', '2', '10142', '3012', '0'), +('15', '31', '2', '2191', '2999', '0'), +('15', '31', '2', '4341', '2712', '0'), +('15', '31', '3', '11052', '2809', '0'), +('15', '31', '3', '4505', '2066', '0'), +('15', '31', '3', '14695', '1733', '0'), +('15', '31', '3', '2295', '1327', '0'), +('15', '31', '5', '14703', '8250', '0'), +('15', '31', '5', '14700', '4953', '0'), +('15', '31', '5', '10055', '4505', '0'), +('15', '31', '5', '68291', '3937', '0'), +('15', '31', '8', '11621', '14220', '0'), +('15', '31', '8', '1546', '12241', '0'), +('15', '31', '8', '11603', '7695', '0'), +('15', '31', '8', '1409', '6312', '0'), +('15', '31', '6', '1557', '6760', '0'), +('15', '31', '6', '2286', '2707', '0'), +('15', '31', '6', '25062', '1833', '0'), +('15', '31', '6', '2331', '1317', '0'), +('15', '31', '17', '2285', '7210', '0'), +('15', '31', '17', '4342', '5194', '0'), +('15', '31', '17', '3305', '2867', '0'), +('15', '31', '17', '2405', '2807', '0'), +('15', '31', '7', '4343', '3050', '0'), +('15', '31', '7', '2458', '2406', '0'), +('15', '31', '7', '2289', '2304', '0'), +('15', '31', '7', '2342', '1965', '0'), +('15', '31', '9', '10149', '2817', '0'), +('15', '31', '9', '14650', '2552', '0'), +('15', '31', '9', '12189', '2263', '0'), +('15', '31', '9', '4344', '2211', '0'), +('15', '31', '15', '10366', '8005', '0'), +('15', '31', '15', '10151', '7200', '0'), +('15', '31', '15', '14679', '6255', '0'), +('15', '31', '15', '14678', '5104', '0'), +('15', '31', '20', '11601', '8821', '0'), +('15', '31', '20', '2742', '5783', '0'), +('15', '31', '20', '1543', '4803', '0'), +('15', '31', '20', '1365', '4200', '0'), +('15', '31', '12', '20655', '6465', '0'), +('15', '31', '12', '2923', '4654', '0'), +('15', '31', '12', '11624', '3236', '0'), +('15', '31', '12', '4345', '3048', '0'), +('15', '31', '18', '2461', '3306', '0'), +('15', '31', '18', '4410', '2557', '0'), +('15', '31', '18', '4346', '2331', '0'), +('15', '31', '18', '2292', '2210', '0'), +('15', '31', '19', '2293', '5915', '0'), +('15', '31', '19', '68239', '4562', '0'), +('15', '31', '19', '4407', '2470', '0'), +('15', '31', '19', '2337', '1757', '0'), +('15', '31', '13', '7257', '14151', '0'), +('15', '31', '13', '6692', '13290', '0'), +('15', '31', '13', '11610', '12687', '0'), +('15', '31', '13', '6691', '11768', '0'), +('15', '31', '14', '7257', '14151', '0'), +('15', '31', '14', '6692', '13290', '0'), +('15', '31', '14', '11551', '12679', '0'), +('15', '31', '14', '6691', '11768', '0'), +('15', '31', '11', '14762', '3181', '0'), +('15', '31', '11', '9246', '2476', '0'), +('15', '31', '11', '20677', '1800', '0'), +('15', '31', '11', '13353', '1500', '0'), +('15', '32', '22', '10323', '0', '0'), +('15', '32', '22', '10664', '0', '0'), +('15', '32', '22', '9246', '0', '0'), +('15', '32', '22', '21509', '0', '0'), +('15', '32', '1', '14701', '5052', '0'), +('15', '32', '1', '14702', '4250', '0'), +('15', '32', '1', '30361', '1890', '0'), +('15', '32', '1', '10165', '1683', '0'), +('15', '32', '2', '1519', '3207', '0'), +('15', '32', '2', '2191', '3036', '0'), +('15', '32', '2', '10142', '3012', '0'), +('15', '32', '2', '4341', '2712', '0'), +('15', '32', '3', '11052', '2899', '0'), +('15', '32', '3', '4505', '2108', '0'), +('15', '32', '3', '14695', '1776', '0'), +('15', '32', '3', '2295', '1340', '0'), +('15', '32', '5', '14703', '8250', '0'), +('15', '32', '5', '14700', '4953', '0'), +('15', '32', '5', '10055', '4505', '0'), +('15', '32', '5', '68291', '3961', '0'), +('15', '32', '8', '11621', '14220', '0'), +('15', '32', '8', '1546', '12302', '0'), +('15', '32', '8', '11603', '7750', '0'), +('15', '32', '8', '1409', '6312', '0'), +('15', '32', '6', '1557', '6760', '0'), +('15', '32', '6', '2286', '2728', '0'), +('15', '32', '6', '25062', '1833', '0'), +('15', '32', '6', '2331', '1335', '0'), +('15', '32', '17', '2285', '7234', '0'), +('15', '32', '17', '4342', '5255', '0'), +('15', '32', '17', '3305', '2867', '0'), +('15', '32', '17', '2405', '2850', '0'), +('15', '32', '7', '4343', '3092', '0'), +('15', '32', '7', '2458', '2406', '0'), +('15', '32', '7', '2289', '2328', '0'), +('15', '32', '7', '2342', '1977', '0'), +('15', '32', '9', '10149', '2835', '0'), +('15', '32', '9', '14650', '2552', '0'), +('15', '32', '9', '12189', '2263', '0'), +('15', '32', '9', '4344', '2211', '0'), +('15', '32', '15', '10366', '8005', '0'), +('15', '32', '15', '10151', '7200', '0'), +('15', '32', '15', '14679', '6255', '0'), +('15', '32', '15', '14678', '5104', '0'), +('15', '32', '20', '11601', '8864', '0'), +('15', '32', '20', '2742', '5825', '0'), +('15', '32', '20', '1543', '4863', '0'), +('15', '32', '20', '1365', '4200', '0'), +('15', '32', '12', '20655', '6485', '0'), +('15', '32', '12', '2923', '4654', '0'), +('15', '32', '12', '11624', '3266', '0'), +('15', '32', '12', '4345', '3078', '0'), +('15', '32', '18', '2461', '3330', '0'), +('15', '32', '18', '4410', '2557', '0'), +('15', '32', '18', '4346', '2331', '0'), +('15', '32', '18', '2292', '2234', '0'), +('15', '32', '19', '2293', '5933', '0'), +('15', '32', '19', '68239', '4580', '0'), +('15', '32', '19', '4407', '2525', '0'), +('15', '32', '19', '2337', '1757', '0'), +('15', '32', '13', '7257', '14151', '0'), +('15', '32', '13', '6692', '13290', '0'), +('15', '32', '13', '11610', '12687', '0'), +('15', '32', '13', '6691', '11768', '0'), +('15', '32', '14', '7257', '14151', '0'), +('15', '32', '14', '6692', '13290', '0'), +('15', '32', '14', '11551', '12679', '0'), +('15', '32', '14', '6691', '11768', '0'), +('15', '32', '11', '14762', '3181', '0'), +('15', '32', '11', '9246', '2537', '0'), +('15', '32', '11', '20677', '1800', '0'), +('15', '32', '11', '13353', '1500', '0'), +('15', '33', '22', '10323', '0', '0'), +('15', '33', '22', '10664', '0', '0'), +('15', '33', '22', '9246', '0', '0'), +('15', '33', '22', '21509', '0', '0'), +('15', '33', '1', '14701', '5052', '0'), +('15', '33', '1', '14702', '4250', '0'), +('15', '33', '1', '30361', '1890', '0'), +('15', '33', '1', '10165', '1683', '0'), +('15', '33', '2', '1519', '3207', '0'), +('15', '33', '2', '2191', '3072', '0'), +('15', '33', '2', '10142', '3012', '0'), +('15', '33', '2', '4341', '2712', '0'), +('15', '33', '3', '11052', '2990', '0'), +('15', '33', '3', '4505', '2150', '0'), +('15', '33', '3', '14695', '1818', '0'), +('15', '33', '3', '2295', '1352', '0'), +('15', '33', '5', '14703', '8250', '0'), +('15', '33', '5', '14700', '4953', '0'), +('15', '33', '5', '10055', '4505', '0'), +('15', '33', '5', '68291', '3986', '0'), +('15', '33', '8', '11621', '14220', '0'), +('15', '33', '8', '1546', '12362', '0'), +('15', '33', '8', '11603', '7804', '0'), +('15', '33', '8', '1409', '6312', '0'), +('15', '33', '6', '1557', '6760', '0'), +('15', '33', '6', '2286', '2749', '0'), +('15', '33', '6', '25062', '1833', '0'), +('15', '33', '6', '2331', '1353', '0'), +('15', '33', '17', '2285', '7258', '0'), +('15', '33', '17', '4342', '5315', '0'), +('15', '33', '17', '2405', '2893', '0'), +('15', '33', '17', '3305', '2867', '0'), +('15', '33', '7', '4343', '3135', '0'), +('15', '33', '7', '2458', '2406', '0'), +('15', '33', '7', '2289', '2352', '0'), +('15', '33', '7', '2342', '1990', '0'), +('15', '33', '9', '10149', '2853', '0'), +('15', '33', '9', '14650', '2552', '0'), +('15', '33', '9', '12189', '2263', '0'), +('15', '33', '9', '4344', '2211', '0'), +('15', '33', '15', '10366', '8005', '0'), +('15', '33', '15', '10151', '7200', '0'), +('15', '33', '15', '14679', '6255', '0'), +('15', '33', '15', '14678', '5104', '0'), +('15', '33', '20', '11601', '8906', '0'), +('15', '33', '20', '2742', '5867', '0'), +('15', '33', '20', '1543', '4924', '0'), +('15', '33', '20', '1365', '4200', '0'), +('15', '33', '12', '20655', '6506', '0'), +('15', '33', '12', '2923', '4654', '0'), +('15', '33', '12', '11624', '3296', '0'), +('15', '33', '12', '4345', '3109', '0'), +('15', '33', '18', '2461', '3354', '0'), +('15', '33', '18', '4410', '2557', '0'), +('15', '33', '18', '4346', '2331', '0'), +('15', '33', '18', '2292', '2258', '0'), +('15', '33', '19', '2293', '5951', '0'), +('15', '33', '19', '68239', '4598', '0'), +('15', '33', '19', '4407', '2579', '0'), +('15', '33', '19', '2337', '1757', '0'), +('15', '33', '13', '7257', '14151', '0'), +('15', '33', '13', '6692', '13290', '0'), +('15', '33', '13', '11610', '12687', '0'), +('15', '33', '13', '6691', '11768', '0'), +('15', '33', '14', '7257', '14151', '0'), +('15', '33', '14', '6692', '13290', '0'), +('15', '33', '14', '11551', '12679', '0'), +('15', '33', '14', '6691', '11768', '0'), +('15', '33', '11', '14762', '3181', '0'), +('15', '33', '11', '9246', '2597', '0'), +('15', '33', '11', '20677', '1800', '0'), +('15', '33', '11', '13353', '1500', '0'), +('15', '34', '22', '10323', '0', '0'), +('15', '34', '22', '10664', '0', '0'), +('15', '34', '22', '9246', '0', '0'), +('15', '34', '22', '21509', '0', '0'), +('15', '34', '1', '14701', '5052', '0'), +('15', '34', '1', '14702', '4250', '0'), +('15', '34', '1', '30361', '1890', '0'), +('15', '34', '1', '10165', '1683', '0'), +('15', '34', '2', '1519', '3207', '0'), +('15', '34', '2', '2191', '3108', '0'), +('15', '34', '2', '10142', '3012', '0'), +('15', '34', '2', '4341', '2712', '0'), +('15', '34', '3', '11052', '3080', '0'), +('15', '34', '3', '4505', '2193', '0'), +('15', '34', '3', '14695', '1860', '0'), +('15', '34', '3', '2295', '1364', '0'), +('15', '34', '5', '14703', '8250', '0'), +('15', '34', '5', '14700', '4953', '0'), +('15', '34', '5', '10055', '4505', '0'), +('15', '34', '5', '68291', '4010', '0'), +('15', '34', '8', '11621', '14220', '0'), +('15', '34', '8', '1546', '12423', '0'), +('15', '34', '8', '11603', '7858', '0'), +('15', '34', '8', '1409', '6312', '0'), +('15', '34', '6', '1557', '6760', '0'), +('15', '34', '6', '2286', '2767', '0'), +('15', '34', '6', '25062', '1833', '0'), +('15', '34', '6', '2331', '1371', '0'), +('15', '34', '17', '2285', '7282', '0'), +('15', '34', '17', '4342', '5376', '0'), +('15', '34', '17', '2405', '2934', '0'), +('15', '34', '17', '3305', '2867', '0'), +('15', '34', '7', '4343', '3171', '0'), +('15', '34', '7', '2458', '2406', '0'), +('15', '34', '7', '2289', '2376', '0'), +('15', '34', '7', '2342', '2001', '0'), +('15', '34', '9', '10149', '2871', '0'), +('15', '34', '9', '14650', '2552', '0'), +('15', '34', '9', '12189', '2263', '0'), +('15', '34', '9', '4344', '2211', '0'), +('15', '34', '15', '10366', '8005', '0'), +('15', '34', '15', '10151', '7200', '0'), +('15', '34', '15', '14679', '6255', '0'), +('15', '34', '15', '14678', '5104', '0'), +('15', '34', '20', '11601', '8942', '0'), +('15', '34', '20', '2742', '5904', '0'), +('15', '34', '20', '1543', '4984', '0'), +('15', '34', '20', '1365', '4200', '0'), +('15', '34', '12', '20655', '6525', '0'), +('15', '34', '12', '2923', '4654', '0'), +('15', '34', '12', '11624', '3321', '0'), +('15', '34', '12', '4345', '3139', '0'), +('15', '34', '18', '2461', '3378', '0'), +('15', '34', '18', '4410', '2557', '0'), +('15', '34', '18', '4346', '2331', '0'), +('15', '34', '18', '2292', '2282', '0'), +('15', '34', '19', '2293', '5969', '0'), +('15', '34', '19', '68239', '4616', '0'), +('15', '34', '19', '4407', '2633', '0'), +('15', '34', '19', '2337', '1757', '0'), +('15', '34', '13', '7257', '14151', '0'), +('15', '34', '13', '6692', '13290', '0'), +('15', '34', '13', '11610', '12687', '0'), +('15', '34', '13', '6691', '11768', '0'), +('15', '34', '14', '7257', '14151', '0'), +('15', '34', '14', '6692', '13290', '0'), +('15', '34', '14', '11551', '12679', '0'), +('15', '34', '14', '6691', '11768', '0'), +('15', '34', '11', '14762', '3181', '0'), +('15', '34', '11', '9246', '2658', '0'), +('15', '34', '11', '20677', '1800', '0'), +('15', '34', '11', '13353', '1500', '0'), +('15', '35', '22', '10323', '0', '0'), +('15', '35', '22', '10664', '0', '0'), +('15', '35', '22', '9246', '0', '0'), +('15', '35', '22', '21509', '0', '0'), +('15', '35', '1', '14701', '5052', '0'), +('15', '35', '1', '14702', '4250', '0'), +('15', '35', '1', '30361', '1890', '0'), +('15', '35', '1', '10165', '1683', '0'), +('15', '35', '2', '1519', '3207', '0'), +('15', '35', '2', '2191', '3144', '0'), +('15', '35', '2', '10142', '3012', '0'), +('15', '35', '2', '4341', '2712', '0'), +('15', '35', '3', '11052', '3171', '0'), +('15', '35', '3', '4505', '2235', '0'), +('15', '35', '3', '14695', '1903', '0'), +('15', '35', '3', '2295', '1376', '0'), +('15', '35', '5', '14703', '8250', '0'), +('15', '35', '5', '14700', '4953', '0'), +('15', '35', '5', '10055', '4505', '0'), +('15', '35', '5', '68291', '4034', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '35', '8', '11621', '14220', '0'), +('15', '35', '8', '1546', '12483', '0'), +('15', '35', '8', '11603', '7913', '0'), +('15', '35', '8', '1409', '6312', '0'), +('15', '35', '6', '1557', '6760', '0'), +('15', '35', '6', '2286', '2789', '0'), +('15', '35', '6', '25062', '1833', '0'), +('15', '35', '6', '2331', '1389', '0'), +('15', '35', '17', '2285', '7307', '0'), +('15', '35', '17', '4342', '5436', '0'), +('15', '35', '17', '2405', '2977', '0'), +('15', '35', '17', '3305', '2867', '0'), +('15', '35', '7', '4343', '3213', '0'), +('15', '35', '7', '2458', '2406', '0'), +('15', '35', '7', '2289', '2401', '0'), +('15', '35', '7', '2342', '2014', '0'), +('15', '35', '9', '10149', '2889', '0'), +('15', '35', '9', '14650', '2552', '0'), +('15', '35', '9', '12189', '2263', '0'), +('15', '35', '9', '2290', '2214', '0'), +('15', '35', '15', '10366', '8005', '0'), +('15', '35', '15', '10151', '7200', '0'), +('15', '35', '15', '14679', '6255', '0'), +('15', '35', '15', '14678', '5104', '0'), +('15', '35', '20', '11601', '8984', '0'), +('15', '35', '20', '2742', '5946', '0'), +('15', '35', '20', '1543', '5044', '0'), +('15', '35', '20', '1365', '4200', '0'), +('15', '35', '12', '20655', '6546', '0'), +('15', '35', '12', '2923', '4654', '0'), +('15', '35', '12', '11624', '3351', '0'), +('15', '35', '12', '4345', '3169', '0'), +('15', '35', '18', '2461', '3403', '0'), +('15', '35', '18', '4410', '2557', '0'), +('15', '35', '18', '4346', '2331', '0'), +('15', '35', '18', '2292', '2306', '0'), +('15', '35', '19', '2293', '5988', '0'), +('15', '35', '19', '68239', '4634', '0'), +('15', '35', '19', '4407', '2688', '0'), +('15', '35', '19', '2337', '1757', '0'), +('15', '35', '13', '7257', '14151', '0'), +('15', '35', '13', '6692', '13290', '0'), +('15', '35', '13', '11610', '12687', '0'), +('15', '35', '13', '6691', '11768', '0'), +('15', '35', '14', '7257', '14151', '0'), +('15', '35', '14', '6692', '13290', '0'), +('15', '35', '14', '11551', '12679', '0'), +('15', '35', '14', '6691', '11768', '0'), +('15', '35', '11', '14762', '3181', '0'), +('15', '35', '11', '9246', '2718', '0'), +('15', '35', '11', '20677', '1800', '0'), +('15', '35', '11', '13353', '1500', '0'), +('15', '36', '22', '10323', '0', '0'), +('15', '36', '22', '10664', '0', '0'), +('15', '36', '22', '9246', '0', '0'), +('15', '36', '22', '21509', '0', '0'), +('15', '36', '1', '14701', '5052', '0'), +('15', '36', '1', '14702', '4250', '0'), +('15', '36', '1', '30361', '1890', '0'), +('15', '36', '1', '10165', '1683', '0'), +('15', '36', '2', '1519', '3207', '0'), +('15', '36', '2', '2191', '3181', '0'), +('15', '36', '2', '10142', '3012', '0'), +('15', '36', '2', '4341', '2712', '0'), +('15', '36', '3', '11052', '3262', '0'), +('15', '36', '3', '4505', '2277', '0'), +('15', '36', '3', '14695', '1945', '0'), +('15', '36', '3', '2295', '1388', '0'), +('15', '36', '5', '14703', '8250', '0'), +('15', '36', '5', '14700', '4953', '0'), +('15', '36', '5', '10055', '4505', '0'), +('15', '36', '5', '68291', '4058', '0'), +('15', '36', '8', '11621', '14220', '0'), +('15', '36', '8', '1546', '12543', '0'), +('15', '36', '8', '11603', '7967', '0'), +('15', '36', '8', '1409', '6312', '0'), +('15', '36', '6', '1557', '6760', '0'), +('15', '36', '6', '2286', '2810', '0'), +('15', '36', '6', '25062', '1833', '0'), +('15', '36', '6', '2331', '1407', '0'), +('15', '36', '17', '2285', '7331', '0'), +('15', '36', '17', '4342', '5496', '0'), +('15', '36', '17', '2405', '3019', '0'), +('15', '36', '17', '3305', '2867', '0'), +('15', '36', '7', '4343', '3256', '0'), +('15', '36', '7', '2289', '2425', '0'), +('15', '36', '7', '2458', '2406', '0'), +('15', '36', '7', '2342', '2026', '0'), +('15', '36', '9', '10149', '2907', '0'), +('15', '36', '9', '14650', '2552', '0'), +('15', '36', '9', '12189', '2263', '0'), +('15', '36', '9', '2290', '2253', '0'), +('15', '36', '15', '10366', '8005', '0'), +('15', '36', '15', '10151', '7200', '0'), +('15', '36', '15', '14679', '6255', '0'), +('15', '36', '15', '14678', '5104', '0'), +('15', '36', '20', '11601', '9027', '0'), +('15', '36', '20', '2742', '5988', '0'), +('15', '36', '20', '1543', '5105', '0'), +('15', '36', '20', '1365', '4200', '0'), +('15', '36', '12', '20655', '6566', '0'), +('15', '36', '12', '2923', '4654', '0'), +('15', '36', '12', '11624', '3380', '0'), +('15', '36', '12', '4345', '3199', '0'), +('15', '36', '18', '2461', '3427', '0'), +('15', '36', '18', '4410', '2557', '0'), +('15', '36', '18', '4346', '2331', '0'), +('15', '36', '18', '2292', '2331', '0'), +('15', '36', '19', '2293', '6006', '0'), +('15', '36', '19', '68239', '4653', '0'), +('15', '36', '19', '4407', '2742', '0'), +('15', '36', '19', '2337', '1757', '0'), +('15', '36', '13', '7257', '14151', '0'), +('15', '36', '13', '6692', '13290', '0'), +('15', '36', '13', '11610', '12687', '0'), +('15', '36', '13', '6691', '11768', '0'), +('15', '36', '14', '7257', '14151', '0'), +('15', '36', '14', '6692', '13290', '0'), +('15', '36', '14', '11551', '12679', '0'), +('15', '36', '14', '6691', '11768', '0'), +('15', '36', '11', '14762', '3181', '0'), +('15', '36', '11', '9246', '2778', '0'), +('15', '36', '11', '20677', '1800', '0'), +('15', '36', '11', '13353', '1500', '0'), +('15', '37', '22', '10323', '0', '0'), +('15', '37', '22', '10664', '0', '0'), +('15', '37', '22', '9246', '0', '0'), +('15', '37', '22', '21509', '0', '0'), +('15', '37', '1', '14701', '5052', '0'), +('15', '37', '1', '14702', '4250', '0'), +('15', '37', '1', '30361', '1890', '0'), +('15', '37', '1', '10165', '1683', '0'), +('15', '37', '2', '2191', '3217', '0'), +('15', '37', '2', '1519', '3207', '0'), +('15', '37', '2', '10142', '3012', '0'), +('15', '37', '2', '4341', '2712', '0'), +('15', '37', '3', '11052', '3352', '0'), +('15', '37', '3', '4505', '2319', '0'), +('15', '37', '3', '14695', '1987', '0'), +('15', '37', '3', '2295', '1400', '0'), +('15', '37', '5', '14703', '8250', '0'), +('15', '37', '5', '14700', '4953', '0'), +('15', '37', '5', '10055', '4505', '0'), +('15', '37', '5', '68291', '4082', '0'), +('15', '37', '8', '11621', '14220', '0'), +('15', '37', '8', '1546', '12604', '0'), +('15', '37', '8', '11603', '8021', '0'), +('15', '37', '8', '1409', '6312', '0'), +('15', '37', '6', '1557', '6760', '0'), +('15', '37', '6', '2286', '2831', '0'), +('15', '37', '6', '25062', '1833', '0'), +('15', '37', '6', '2331', '1425', '0'), +('15', '37', '17', '2285', '7355', '0'), +('15', '37', '17', '4342', '5557', '0'), +('15', '37', '17', '2405', '3062', '0'), +('15', '37', '17', '3305', '2867', '0'), +('15', '37', '7', '4343', '3298', '0'), +('15', '37', '7', '2289', '2449', '0'), +('15', '37', '7', '2458', '2406', '0'), +('15', '37', '7', '2342', '2039', '0'), +('15', '37', '9', '10149', '2925', '0'), +('15', '37', '9', '14650', '2552', '0'), +('15', '37', '9', '2290', '2292', '0'), +('15', '37', '9', '12189', '2263', '0'), +('15', '37', '15', '10366', '8005', '0'), +('15', '37', '15', '10151', '7200', '0'), +('15', '37', '15', '14679', '6255', '0'), +('15', '37', '15', '14678', '5104', '0'), +('15', '37', '20', '11601', '9069', '0'), +('15', '37', '20', '2742', '6030', '0'), +('15', '37', '20', '1543', '5165', '0'), +('15', '37', '20', '1365', '4200', '0'), +('15', '37', '12', '20655', '6587', '0'), +('15', '37', '12', '2923', '4654', '0'), +('15', '37', '12', '11624', '3410', '0'), +('15', '37', '12', '4345', '3229', '0'), +('15', '37', '18', '2461', '3451', '0'), +('15', '37', '18', '4410', '2557', '0'), +('15', '37', '18', '2292', '2355', '0'), +('15', '37', '18', '4346', '2331', '0'), +('15', '37', '19', '2293', '6024', '0'), +('15', '37', '19', '68239', '4671', '0'), +('15', '37', '19', '4407', '2796', '0'), +('15', '37', '19', '2337', '1757', '0'), +('15', '37', '13', '7257', '14151', '0'), +('15', '37', '13', '6692', '13290', '0'), +('15', '37', '13', '11610', '12687', '0'), +('15', '37', '13', '6691', '11768', '0'), +('15', '37', '14', '7257', '14151', '0'), +('15', '37', '14', '6692', '13290', '0'), +('15', '37', '14', '11551', '12679', '0'), +('15', '37', '14', '6691', '11768', '0'), +('15', '37', '11', '14762', '3181', '0'), +('15', '37', '11', '9246', '2839', '0'), +('15', '37', '11', '20677', '1800', '0'), +('15', '37', '11', '13353', '1500', '0'), +('15', '38', '22', '10323', '0', '0'), +('15', '38', '22', '10664', '0', '0'), +('15', '38', '22', '9246', '0', '0'), +('15', '38', '22', '21509', '0', '0'), +('15', '38', '1', '14701', '5052', '0'), +('15', '38', '1', '14702', '4250', '0'), +('15', '38', '1', '30361', '1890', '0'), +('15', '38', '1', '10165', '1683', '0'), +('15', '38', '2', '2191', '3253', '0'), +('15', '38', '2', '1519', '3207', '0'), +('15', '38', '2', '10142', '3012', '0'), +('15', '38', '2', '4341', '2712', '0'), +('15', '38', '3', '11052', '3443', '0'), +('15', '38', '3', '4505', '2362', '0'), +('15', '38', '3', '14695', '2029', '0'), +('15', '38', '3', '2295', '1412', '0'), +('15', '38', '5', '14703', '8250', '0'), +('15', '38', '5', '14700', '4953', '0'), +('15', '38', '5', '10055', '4505', '0'), +('15', '38', '5', '68291', '4106', '0'), +('15', '38', '8', '11621', '14220', '0'), +('15', '38', '8', '1546', '12664', '0'), +('15', '38', '8', '11603', '8076', '0'), +('15', '38', '8', '1409', '6312', '0'), +('15', '38', '6', '1557', '6760', '0'), +('15', '38', '6', '2286', '2852', '0'), +('15', '38', '6', '25062', '1833', '0'), +('15', '38', '6', '2331', '1444', '0'), +('15', '38', '17', '2285', '7379', '0'), +('15', '38', '17', '4342', '5617', '0'), +('15', '38', '17', '2405', '3105', '0'), +('15', '38', '17', '3305', '2867', '0'), +('15', '38', '7', '4343', '3340', '0'), +('15', '38', '7', '2289', '2473', '0'), +('15', '38', '7', '2458', '2406', '0'), +('15', '38', '7', '2342', '2052', '0'), +('15', '38', '9', '10149', '2944', '0'), +('15', '38', '9', '14650', '2552', '0'), +('15', '38', '9', '2290', '2330', '0'), +('15', '38', '9', '12189', '2263', '0'), +('15', '38', '15', '10366', '8005', '0'), +('15', '38', '15', '10151', '7200', '0'), +('15', '38', '15', '14679', '6255', '0'), +('15', '38', '15', '14678', '5104', '0'), +('15', '38', '20', '11601', '9111', '0'), +('15', '38', '20', '2742', '6073', '0'), +('15', '38', '20', '1543', '5226', '0'), +('15', '38', '20', '1365', '4200', '0'), +('15', '38', '12', '20655', '6608', '0'), +('15', '38', '12', '2923', '4654', '0'), +('15', '38', '12', '11624', '3439', '0'), +('15', '38', '12', '4345', '3260', '0'), +('15', '38', '18', '2461', '3475', '0'), +('15', '38', '18', '4410', '2557', '0'), +('15', '38', '18', '2292', '2379', '0'), +('15', '38', '18', '4346', '2331', '0'), +('15', '38', '19', '2293', '6042', '0'), +('15', '38', '19', '68239', '4689', '0'), +('15', '38', '19', '4407', '2851', '0'), +('15', '38', '19', '2337', '1757', '0'), +('15', '38', '13', '7257', '14151', '0'), +('15', '38', '13', '6692', '13290', '0'), +('15', '38', '13', '11610', '12687', '0'), +('15', '38', '13', '6691', '11768', '0'), +('15', '38', '14', '7257', '14151', '0'), +('15', '38', '14', '6692', '13290', '0'), +('15', '38', '14', '11551', '12679', '0'), +('15', '38', '14', '6691', '11768', '0'), +('15', '38', '11', '14762', '3181', '0'), +('15', '38', '11', '9246', '2899', '0'), +('15', '38', '11', '20677', '1800', '0'), +('15', '38', '11', '13353', '1500', '0'), +('15', '39', '22', '10323', '0', '0'), +('15', '39', '22', '10664', '0', '0'), +('15', '39', '22', '9246', '0', '0'), +('15', '39', '22', '21509', '0', '0'), +('15', '39', '1', '14701', '5052', '0'), +('15', '39', '1', '14702', '4250', '0'), +('15', '39', '1', '30361', '1890', '0'), +('15', '39', '1', '10165', '1683', '0'), +('15', '39', '2', '2191', '3289', '0'), +('15', '39', '2', '1519', '3207', '0'), +('15', '39', '2', '10142', '3012', '0'), +('15', '39', '2', '4341', '2712', '0'), +('15', '39', '3', '11052', '3533', '0'), +('15', '39', '3', '4505', '2404', '0'), +('15', '39', '3', '14695', '2072', '0'), +('15', '39', '3', '2295', '1424', '0'), +('15', '39', '5', '14703', '8250', '0'), +('15', '39', '5', '14700', '4953', '0'), +('15', '39', '5', '10055', '4505', '0'), +('15', '39', '5', '68291', '4130', '0'), +('15', '39', '8', '11621', '14220', '0'), +('15', '39', '8', '1546', '12725', '0'), +('15', '39', '8', '11603', '8130', '0'), +('15', '39', '8', '1409', '6312', '0'), +('15', '39', '6', '1557', '6760', '0'), +('15', '39', '6', '2286', '2873', '0'), +('15', '39', '6', '25062', '1833', '0'), +('15', '39', '6', '2331', '1462', '0'), +('15', '39', '17', '2285', '7403', '0'), +('15', '39', '17', '4342', '5678', '0'), +('15', '39', '17', '2405', '3148', '0'), +('15', '39', '17', '3305', '2867', '0'), +('15', '39', '7', '4343', '3382', '0'), +('15', '39', '7', '2289', '2497', '0'), +('15', '39', '7', '2458', '2406', '0'), +('15', '39', '7', '2342', '2064', '0'), +('15', '39', '9', '10149', '2962', '0'), +('15', '39', '9', '14650', '2552', '0'), +('15', '39', '9', '2290', '2369', '0'), +('15', '39', '9', '12189', '2263', '0'), +('15', '39', '15', '10366', '8005', '0'), +('15', '39', '15', '10151', '7200', '0'), +('15', '39', '15', '14679', '6255', '0'), +('15', '39', '15', '14678', '5104', '0'), +('15', '39', '20', '11601', '9154', '0'), +('15', '39', '20', '2742', '6115', '0'), +('15', '39', '20', '1543', '5286', '0'), +('15', '39', '20', '1365', '4200', '0'), +('15', '39', '12', '20655', '6628', '0'), +('15', '39', '12', '2923', '4654', '0'), +('15', '39', '12', '11624', '3469', '0'), +('15', '39', '12', '4345', '3290', '0'), +('15', '39', '18', '2461', '3499', '0'), +('15', '39', '18', '4410', '2557', '0'), +('15', '39', '18', '2292', '2403', '0'), +('15', '39', '18', '4346', '2331', '0'), +('15', '39', '19', '2293', '6060', '0'), +('15', '39', '19', '68239', '4707', '0'), +('15', '39', '19', '4407', '2905', '0'), +('15', '39', '19', '2337', '1757', '0'), +('15', '39', '13', '7257', '14151', '0'), +('15', '39', '13', '6692', '13290', '0'), +('15', '39', '13', '11610', '12687', '0'), +('15', '39', '13', '6691', '11768', '0'), +('15', '39', '14', '7257', '14151', '0'), +('15', '39', '14', '6692', '13290', '0'), +('15', '39', '14', '11551', '12679', '0'), +('15', '39', '14', '6691', '11768', '0'), +('15', '39', '11', '14762', '3181', '0'), +('15', '39', '11', '9246', '2960', '0'), +('15', '39', '11', '20677', '1800', '0'), +('15', '39', '11', '13353', '1500', '0'), +('15', '40', '22', '10323', '0', '0'), +('15', '40', '22', '10664', '0', '0'), +('15', '40', '22', '9246', '0', '0'), +('15', '40', '22', '21509', '0', '0'), +('15', '40', '1', '14701', '5052', '0'), +('15', '40', '1', '14702', '4250', '0'), +('15', '40', '1', '30361', '1890', '0'), +('15', '40', '1', '10165', '1683', '0'), +('15', '40', '2', '2191', '3326', '0'), +('15', '40', '2', '1519', '3207', '0'), +('15', '40', '2', '10142', '3012', '0'), +('15', '40', '2', '4341', '2712', '0'), +('15', '40', '3', '11052', '3624', '0'), +('15', '40', '3', '4505', '2446', '0'), +('15', '40', '3', '14695', '2114', '0'), +('15', '40', '3', '2295', '1436', '0'), +('15', '40', '5', '14703', '8250', '0'), +('15', '40', '5', '14700', '4953', '0'), +('15', '40', '5', '10055', '4505', '0'), +('15', '40', '5', '4501', '4198', '0'), +('15', '40', '8', '11621', '14220', '0'), +('15', '40', '8', '1546', '12785', '0'), +('15', '40', '8', '11603', '8184', '0'), +('15', '40', '8', '1409', '6312', '0'), +('15', '40', '6', '1557', '6760', '0'), +('15', '40', '6', '2286', '2894', '0'), +('15', '40', '6', '25062', '1833', '0'), +('15', '40', '6', '2331', '1480', '0'), +('15', '40', '17', '2285', '7427', '0'), +('15', '40', '17', '4342', '5738', '0'), +('15', '40', '17', '2405', '3191', '0'), +('15', '40', '17', '3305', '2867', '0'), +('15', '40', '7', '4343', '3425', '0'), +('15', '40', '7', '2289', '2521', '0'), +('15', '40', '7', '2458', '2406', '0'), +('15', '40', '7', '2342', '2077', '0'), +('15', '40', '9', '10149', '2980', '0'), +('15', '40', '9', '14650', '2552', '0'), +('15', '40', '9', '2290', '2407', '0'), +('15', '40', '9', '12189', '2263', '0'), +('15', '40', '15', '10366', '8005', '0'), +('15', '40', '15', '10151', '7200', '0'), +('15', '40', '15', '14679', '6255', '0'), +('15', '40', '15', '14678', '5104', '0'), +('15', '40', '20', '11601', '9196', '0'), +('15', '40', '20', '2742', '6157', '0'), +('15', '40', '20', '1543', '5346', '0'), +('15', '40', '20', '1365', '4200', '0'), +('15', '40', '12', '20655', '6649', '0'), +('15', '40', '12', '2923', '4654', '0'), +('15', '40', '12', '11624', '3499', '0'), +('15', '40', '12', '4345', '3320', '0'), +('15', '40', '18', '2461', '3523', '0'), +('15', '40', '18', '4410', '2557', '0'), +('15', '40', '18', '2292', '2427', '0'), +('15', '40', '18', '4346', '2331', '0'), +('15', '40', '19', '2293', '6078', '0'), +('15', '40', '19', '68239', '4725', '0'), +('15', '40', '19', '4407', '2959', '0'), +('15', '40', '19', '2337', '1757', '0'), +('15', '40', '13', '7257', '14151', '0'), +('15', '40', '13', '6692', '13290', '0'), +('15', '40', '13', '11610', '12687', '0'), +('15', '40', '13', '6691', '11768', '0'), +('15', '40', '14', '7257', '14151', '0'), +('15', '40', '14', '6692', '13290', '0'), +('15', '40', '14', '11551', '12679', '0'), +('15', '40', '14', '6691', '11768', '0'), +('15', '40', '11', '14762', '3181', '0'), +('15', '40', '11', '9246', '3020', '0'), +('15', '40', '11', '20677', '1800', '0'), +('15', '40', '11', '13353', '1500', '0'), +('15', '41', '22', '10323', '0', '0'), +('15', '41', '22', '10664', '0', '0'), +('15', '41', '22', '9246', '0', '0'), +('15', '41', '22', '21509', '0', '0'), +('15', '41', '1', '14701', '5052', '0'), +('15', '41', '1', '14702', '4250', '0'), +('15', '41', '1', '30361', '1890', '0'), +('15', '41', '1', '10165', '1683', '0'), +('15', '41', '2', '2191', '3362', '0'), +('15', '41', '2', '1519', '3207', '0'), +('15', '41', '2', '10142', '3012', '0'), +('15', '41', '2', '4341', '2712', '0'), +('15', '41', '3', '11052', '3715', '0'), +('15', '41', '3', '4505', '2488', '0'), +('15', '41', '3', '14695', '2156', '0'), +('15', '41', '3', '2295', '1448', '0'), +('15', '41', '5', '14703', '8250', '0'), +('15', '41', '5', '14700', '4953', '0'), +('15', '41', '5', '10055', '4505', '0'), +('15', '41', '5', '4501', '4276', '0'), +('15', '41', '8', '11621', '14220', '0'), +('15', '41', '8', '1546', '12845', '0'), +('15', '41', '8', '11603', '8239', '0'), +('15', '41', '8', '1409', '6312', '0'), +('15', '41', '6', '1557', '6760', '0'), +('15', '41', '6', '2286', '2915', '0'), +('15', '41', '6', '25062', '1833', '0'), +('15', '41', '6', '2331', '1498', '0'), +('15', '41', '17', '2285', '7452', '0'), +('15', '41', '17', '4342', '5798', '0'), +('15', '41', '17', '2405', '3234', '0'), +('15', '41', '17', '3305', '2867', '0'), +('15', '41', '7', '4343', '3467', '0'), +('15', '41', '7', '2289', '2546', '0'), +('15', '41', '7', '2458', '2406', '0'), +('15', '41', '7', '2342', '2090', '0'), +('15', '41', '9', '10149', '2998', '0'), +('15', '41', '9', '14650', '2552', '0'), +('15', '41', '9', '2290', '2446', '0'), +('15', '41', '9', '12189', '2263', '0'), +('15', '41', '15', '10366', '8005', '0'), +('15', '41', '15', '10151', '7200', '0'), +('15', '41', '15', '14679', '6255', '0'), +('15', '41', '15', '14678', '5104', '0'), +('15', '41', '20', '11601', '9238', '0'), +('15', '41', '20', '2742', '6200', '0'), +('15', '41', '20', '1543', '5407', '0'), +('15', '41', '20', '1365', '4200', '0'), +('15', '41', '12', '20655', '6669', '0'), +('15', '41', '12', '2923', '4654', '0'), +('15', '41', '12', '11624', '3528', '0'), +('15', '41', '12', '4345', '3350', '0'), +('15', '41', '18', '2461', '3548', '0'), +('15', '41', '18', '4410', '2557', '0'), +('15', '41', '18', '2292', '2451', '0'), +('15', '41', '18', '4346', '2331', '0'), +('15', '41', '19', '2293', '6096', '0'), +('15', '41', '19', '68239', '4743', '0'), +('15', '41', '19', '4407', '3014', '0'), +('15', '41', '19', '2337', '1757', '0'), +('15', '41', '13', '7257', '14151', '0'), +('15', '41', '13', '6692', '13290', '0'), +('15', '41', '13', '11610', '12687', '0'), +('15', '41', '13', '6691', '11768', '0'), +('15', '41', '14', '7257', '14151', '0'), +('15', '41', '14', '6692', '13290', '0'), +('15', '41', '14', '11551', '12679', '0'), +('15', '41', '14', '6691', '11768', '0'), +('15', '41', '11', '14762', '3181', '0'), +('15', '41', '11', '9246', '3080', '0'), +('15', '41', '11', '20677', '1800', '0'), +('15', '41', '11', '13353', '1500', '0'), +('15', '42', '22', '10323', '0', '0'), +('15', '42', '22', '10664', '0', '0'), +('15', '42', '22', '9246', '0', '0'), +('15', '42', '22', '21509', '0', '0'), +('15', '42', '1', '14701', '5052', '0'), +('15', '42', '1', '14702', '4250', '0'), +('15', '42', '1', '30361', '1890', '0'), +('15', '42', '1', '10165', '1683', '0'), +('15', '42', '2', '2191', '3398', '0'), +('15', '42', '2', '1519', '3207', '0'), +('15', '42', '2', '10142', '3012', '0'), +('15', '42', '2', '4341', '2712', '0'), +('15', '42', '3', '11052', '3805', '0'), +('15', '42', '3', '4505', '2531', '0'), +('15', '42', '3', '14695', '2199', '0'), +('15', '42', '3', '2295', '1460', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '42', '5', '14703', '8250', '0'), +('15', '42', '5', '14700', '4953', '0'), +('15', '42', '5', '10055', '4505', '0'), +('15', '42', '5', '4501', '4355', '0'), +('15', '42', '8', '11621', '14220', '0'), +('15', '42', '8', '1546', '12906', '0'), +('15', '42', '8', '11603', '8293', '0'), +('15', '42', '8', '1409', '6312', '0'), +('15', '42', '6', '1557', '6760', '0'), +('15', '42', '6', '2286', '2940', '0'), +('15', '42', '6', '25062', '1833', '0'), +('15', '42', '6', '2331', '1516', '0'), +('15', '42', '17', '2285', '7476', '0'), +('15', '42', '17', '4342', '5859', '0'), +('15', '42', '17', '2405', '3279', '0'), +('15', '42', '17', '3305', '2867', '0'), +('15', '42', '7', '4343', '3515', '0'), +('15', '42', '7', '2289', '2570', '0'), +('15', '42', '7', '2458', '2406', '0'), +('15', '42', '7', '2342', '2104', '0'), +('15', '42', '9', '10149', '3016', '0'), +('15', '42', '9', '14650', '2552', '0'), +('15', '42', '9', '2290', '2486', '0'), +('15', '42', '9', '12189', '2263', '0'), +('15', '42', '15', '10366', '8005', '0'), +('15', '42', '15', '10151', '7200', '0'), +('15', '42', '15', '14679', '6255', '0'), +('15', '42', '15', '14678', '5104', '0'), +('15', '42', '20', '11601', '9286', '0'), +('15', '42', '20', '2742', '6248', '0'), +('15', '42', '20', '1543', '5467', '0'), +('15', '42', '20', '1365', '4200', '0'), +('15', '42', '12', '20655', '6691', '0'), +('15', '42', '12', '2923', '4654', '0'), +('15', '42', '12', '11624', '3562', '0'), +('15', '42', '12', '4345', '3380', '0'), +('15', '42', '18', '2461', '3572', '0'), +('15', '42', '18', '4410', '2557', '0'), +('15', '42', '18', '2292', '2476', '0'), +('15', '42', '18', '4346', '2331', '0'), +('15', '42', '19', '2293', '6114', '0'), +('15', '42', '19', '68239', '4761', '0'), +('15', '42', '19', '4407', '3068', '0'), +('15', '42', '19', '2337', '1757', '0'), +('15', '42', '13', '7257', '14151', '0'), +('15', '42', '13', '6692', '13290', '0'), +('15', '42', '13', '11610', '12687', '0'), +('15', '42', '13', '6691', '11768', '0'), +('15', '42', '14', '7257', '14151', '0'), +('15', '42', '14', '6692', '13290', '0'), +('15', '42', '14', '11551', '12679', '0'), +('15', '42', '14', '6691', '11768', '0'), +('15', '42', '11', '14762', '3181', '0'), +('15', '42', '11', '9246', '3141', '0'), +('15', '42', '11', '20677', '1800', '0'), +('15', '42', '11', '13353', '1500', '0'), +('15', '43', '22', '10323', '0', '0'), +('15', '43', '22', '10664', '0', '0'), +('15', '43', '22', '9246', '0', '0'), +('15', '43', '22', '21509', '0', '0'), +('15', '43', '1', '14701', '5052', '0'), +('15', '43', '1', '14702', '4250', '0'), +('15', '43', '1', '30361', '1890', '0'), +('15', '43', '1', '10165', '1683', '0'), +('15', '43', '2', '2191', '3434', '0'), +('15', '43', '2', '1519', '3207', '0'), +('15', '43', '2', '10142', '3012', '0'), +('15', '43', '2', '4341', '2712', '0'), +('15', '43', '3', '11052', '3896', '0'), +('15', '43', '3', '4505', '2573', '0'), +('15', '43', '3', '14695', '2241', '0'), +('15', '43', '3', '2295', '1472', '0'), +('15', '43', '5', '14703', '8250', '0'), +('15', '43', '5', '14700', '4953', '0'), +('15', '43', '5', '10055', '4505', '0'), +('15', '43', '5', '4501', '4433', '0'), +('15', '43', '8', '11621', '14220', '0'), +('15', '43', '8', '1546', '12966', '0'), +('15', '43', '8', '11603', '8347', '0'), +('15', '43', '8', '1409', '6312', '0'), +('15', '43', '6', '1557', '6760', '0'), +('15', '43', '6', '2286', '2961', '0'), +('15', '43', '6', '25062', '1833', '0'), +('15', '43', '6', '2331', '1534', '0'), +('15', '43', '17', '2285', '7500', '0'), +('15', '43', '17', '4342', '5919', '0'), +('15', '43', '17', '2405', '3321', '0'), +('15', '43', '17', '3305', '2867', '0'), +('15', '43', '7', '4343', '3558', '0'), +('15', '43', '7', '2289', '2594', '0'), +('15', '43', '7', '2458', '2406', '0'), +('15', '43', '7', '2342', '2117', '0'), +('15', '43', '9', '10149', '3034', '0'), +('15', '43', '9', '14650', '2552', '0'), +('15', '43', '9', '2290', '2525', '0'), +('15', '43', '9', '12189', '2263', '0'), +('15', '43', '15', '10366', '8005', '0'), +('15', '43', '15', '10151', '7200', '0'), +('15', '43', '15', '14679', '6255', '0'), +('15', '43', '15', '14678', '5104', '0'), +('15', '43', '20', '11601', '9329', '0'), +('15', '43', '20', '2742', '6290', '0'), +('15', '43', '20', '1543', '5528', '0'), +('15', '43', '20', '1365', '4200', '0'), +('15', '43', '12', '20655', '6711', '0'), +('15', '43', '12', '2923', '4654', '0'), +('15', '43', '12', '11624', '3592', '0'), +('15', '43', '12', '4345', '3411', '0'), +('15', '43', '18', '2461', '3596', '0'), +('15', '43', '18', '4410', '2557', '0'), +('15', '43', '18', '2292', '2500', '0'), +('15', '43', '18', '4346', '2331', '0'), +('15', '43', '19', '2293', '6132', '0'), +('15', '43', '19', '68239', '4779', '0'), +('15', '43', '19', '4407', '3122', '0'), +('15', '43', '19', '2337', '1757', '0'), +('15', '43', '13', '7257', '14151', '0'), +('15', '43', '13', '6692', '13290', '0'), +('15', '43', '13', '11610', '12687', '0'), +('15', '43', '13', '6691', '11768', '0'), +('15', '43', '14', '7257', '14151', '0'), +('15', '43', '14', '6692', '13290', '0'), +('15', '43', '14', '11551', '12679', '0'), +('15', '43', '14', '6691', '11768', '0'), +('15', '43', '11', '9246', '3201', '0'), +('15', '43', '11', '14762', '3181', '0'), +('15', '43', '11', '20677', '1800', '0'), +('15', '43', '11', '13353', '1500', '0'), +('15', '44', '22', '10323', '0', '0'), +('15', '44', '22', '10664', '0', '0'), +('15', '44', '22', '9246', '0', '0'), +('15', '44', '22', '21509', '0', '0'), +('15', '44', '1', '14701', '5052', '0'), +('15', '44', '1', '14702', '4250', '0'), +('15', '44', '1', '30361', '1890', '0'), +('15', '44', '1', '10165', '1683', '0'), +('15', '44', '2', '2191', '3471', '0'), +('15', '44', '2', '1519', '3207', '0'), +('15', '44', '2', '10142', '3012', '0'), +('15', '44', '2', '4341', '2712', '0'), +('15', '44', '3', '11052', '3986', '0'), +('15', '44', '3', '4505', '2615', '0'), +('15', '44', '3', '14695', '2283', '0'), +('15', '44', '3', '2295', '1485', '0'), +('15', '44', '5', '14703', '8250', '0'), +('15', '44', '5', '14700', '4953', '0'), +('15', '44', '5', '4501', '4512', '0'), +('15', '44', '5', '10055', '4505', '0'), +('15', '44', '8', '11621', '14220', '0'), +('15', '44', '8', '1546', '13027', '0'), +('15', '44', '8', '11603', '8402', '0'), +('15', '44', '8', '1409', '6312', '0'), +('15', '44', '6', '1557', '6760', '0'), +('15', '44', '6', '2286', '2982', '0'), +('15', '44', '6', '25062', '1833', '0'), +('15', '44', '6', '2331', '1552', '0'), +('15', '44', '17', '2285', '7524', '0'), +('15', '44', '17', '4342', '5980', '0'), +('15', '44', '17', '2405', '3364', '0'), +('15', '44', '17', '3305', '2867', '0'), +('15', '44', '7', '4343', '3600', '0'), +('15', '44', '7', '2289', '2618', '0'), +('15', '44', '7', '2458', '2406', '0'), +('15', '44', '7', '2342', '2129', '0'), +('15', '44', '9', '10149', '3052', '0'), +('15', '44', '9', '2290', '2563', '0'), +('15', '44', '9', '14650', '2552', '0'), +('15', '44', '9', '12189', '2263', '0'), +('15', '44', '15', '10366', '8005', '0'), +('15', '44', '15', '10151', '7200', '0'), +('15', '44', '15', '14679', '6255', '0'), +('15', '44', '15', '14678', '5104', '0'), +('15', '44', '20', '11601', '9371', '0'), +('15', '44', '20', '2742', '6332', '0'), +('15', '44', '20', '1543', '5588', '0'), +('15', '44', '20', '1365', '4200', '0'), +('15', '44', '12', '20655', '6732', '0'), +('15', '44', '12', '2923', '4654', '0'), +('15', '44', '12', '11624', '3621', '0'), +('15', '44', '12', '4345', '3441', '0'), +('15', '44', '18', '2461', '3620', '0'), +('15', '44', '18', '4410', '2557', '0'), +('15', '44', '18', '2292', '2524', '0'), +('15', '44', '18', '4346', '2331', '0'), +('15', '44', '19', '2293', '6151', '0'), +('15', '44', '19', '68239', '4797', '0'), +('15', '44', '19', '4407', '3177', '0'), +('15', '44', '19', '2337', '1757', '0'), +('15', '44', '13', '7257', '14151', '0'), +('15', '44', '13', '6692', '13290', '0'), +('15', '44', '13', '11610', '12687', '0'), +('15', '44', '13', '6691', '11768', '0'), +('15', '44', '14', '7257', '14151', '0'), +('15', '44', '14', '6692', '13290', '0'), +('15', '44', '14', '11551', '12679', '0'), +('15', '44', '14', '6691', '11768', '0'), +('15', '44', '11', '9246', '3262', '0'), +('15', '44', '11', '14762', '3181', '0'), +('15', '44', '11', '20677', '1800', '0'), +('15', '44', '11', '13353', '1500', '0'), +('15', '45', '22', '10323', '0', '0'), +('15', '45', '22', '10664', '0', '0'), +('15', '45', '22', '9246', '0', '0'), +('15', '45', '22', '21509', '0', '0'), +('15', '45', '1', '14701', '5052', '0'), +('15', '45', '1', '14702', '4250', '0'), +('15', '45', '1', '30361', '1890', '0'), +('15', '45', '1', '10165', '1683', '0'), +('15', '45', '2', '2191', '3507', '0'), +('15', '45', '2', '1519', '3207', '0'), +('15', '45', '2', '10142', '3012', '0'), +('15', '45', '2', '4341', '2712', '0'), +('15', '45', '3', '11052', '4077', '0'), +('15', '45', '3', '4505', '2658', '0'), +('15', '45', '3', '14695', '2325', '0'), +('15', '45', '3', '2295', '1497', '0'), +('15', '45', '5', '14703', '8250', '0'), +('15', '45', '5', '14700', '4953', '0'), +('15', '45', '5', '4501', '4590', '0'), +('15', '45', '5', '10055', '4505', '0'), +('15', '45', '8', '11621', '14220', '0'), +('15', '45', '8', '1546', '13087', '0'), +('15', '45', '8', '11603', '8456', '0'), +('15', '45', '8', '1409', '6312', '0'), +('15', '45', '6', '1557', '6760', '0'), +('15', '45', '6', '2286', '3003', '0'), +('15', '45', '6', '25062', '1833', '0'), +('15', '45', '6', '2331', '1570', '0'), +('15', '45', '17', '2285', '7548', '0'), +('15', '45', '17', '4342', '6040', '0'), +('15', '45', '17', '2405', '3407', '0'), +('15', '45', '17', '3305', '2867', '0'), +('15', '45', '7', '4343', '3642', '0'), +('15', '45', '7', '2289', '2642', '0'), +('15', '45', '7', '2458', '2406', '0'), +('15', '45', '7', '2342', '2142', '0'), +('15', '45', '9', '10149', '3070', '0'), +('15', '45', '9', '2290', '2602', '0'), +('15', '45', '9', '14650', '2552', '0'), +('15', '45', '9', '12189', '2263', '0'), +('15', '45', '15', '10366', '8005', '0'), +('15', '45', '15', '10151', '7200', '0'), +('15', '45', '15', '14679', '6255', '0'), +('15', '45', '15', '14678', '5104', '0'), +('15', '45', '20', '11601', '9413', '0'), +('15', '45', '20', '2742', '6375', '0'), +('15', '45', '20', '1543', '5648', '0'), +('15', '45', '20', '1365', '4200', '0'), +('15', '45', '12', '20655', '6752', '0'), +('15', '45', '12', '2923', '4654', '0'), +('15', '45', '12', '11624', '3651', '0'), +('15', '45', '12', '4345', '3471', '0'), +('15', '45', '18', '2461', '3644', '0'), +('15', '45', '18', '4410', '2557', '0'), +('15', '45', '18', '2292', '2548', '0'), +('15', '45', '18', '4346', '2331', '0'), +('15', '45', '19', '2293', '6169', '0'), +('15', '45', '19', '68239', '4816', '0'), +('15', '45', '19', '4407', '3231', '0'), +('15', '45', '19', '2337', '1757', '0'), +('15', '45', '13', '7257', '14151', '0'), +('15', '45', '13', '6692', '13290', '0'), +('15', '45', '13', '11610', '12687', '0'), +('15', '45', '13', '6691', '11768', '0'), +('15', '45', '14', '7257', '14151', '0'), +('15', '45', '14', '6692', '13290', '0'), +('15', '45', '14', '11551', '12679', '0'), +('15', '45', '14', '6691', '11768', '0'), +('15', '45', '11', '9246', '3322', '0'), +('15', '45', '11', '14762', '3181', '0'), +('15', '45', '11', '20677', '1800', '0'), +('15', '45', '11', '13353', '1500', '0'), +('15', '46', '22', '10323', '0', '0'), +('15', '46', '22', '10664', '0', '0'), +('15', '46', '22', '9246', '0', '0'), +('15', '46', '22', '21509', '0', '0'), +('15', '46', '1', '14701', '5052', '0'), +('15', '46', '1', '14702', '4250', '0'), +('15', '46', '1', '30361', '1890', '0'), +('15', '46', '1', '10165', '1683', '0'), +('15', '46', '2', '2191', '3543', '0'), +('15', '46', '2', '1519', '3207', '0'), +('15', '46', '2', '10142', '3012', '0'), +('15', '46', '2', '4341', '2712', '0'), +('15', '46', '3', '11052', '4168', '0'), +('15', '46', '3', '4505', '2700', '0'), +('15', '46', '3', '14695', '2368', '0'), +('15', '46', '3', '2295', '1509', '0'), +('15', '46', '5', '14703', '8250', '0'), +('15', '46', '5', '14700', '4953', '0'), +('15', '46', '5', '4501', '4669', '0'), +('15', '46', '5', '10055', '4505', '0'), +('15', '46', '8', '11621', '14220', '0'), +('15', '46', '8', '1546', '13147', '0'), +('15', '46', '8', '11603', '8511', '0'), +('15', '46', '8', '1409', '6312', '0'), +('15', '46', '6', '1557', '6760', '0'), +('15', '46', '6', '2286', '3024', '0'), +('15', '46', '6', '25062', '1833', '0'), +('15', '46', '6', '2331', '1589', '0'), +('15', '46', '17', '2285', '7572', '0'), +('15', '46', '17', '4342', '6100', '0'), +('15', '46', '17', '2405', '3450', '0'), +('15', '46', '17', '3305', '2867', '0'), +('15', '46', '7', '4343', '3684', '0'), +('15', '46', '7', '2289', '2666', '0'), +('15', '46', '7', '2458', '2406', '0'), +('15', '46', '7', '2342', '2155', '0'), +('15', '46', '9', '10149', '3089', '0'), +('15', '46', '9', '2290', '2641', '0'), +('15', '46', '9', '14650', '2552', '0'), +('15', '46', '9', '4311', '2282', '0'), +('15', '46', '15', '10366', '8005', '0'), +('15', '46', '15', '10151', '7200', '0'), +('15', '46', '15', '14679', '6255', '0'), +('15', '46', '15', '14678', '5104', '0'), +('15', '46', '20', '11601', '9456', '0'), +('15', '46', '20', '2742', '6417', '0'), +('15', '46', '20', '1543', '5709', '0'), +('15', '46', '20', '1365', '4200', '0'), +('15', '46', '12', '20655', '6773', '0'), +('15', '46', '12', '2923', '4654', '0'), +('15', '46', '12', '11624', '3680', '0'), +('15', '46', '12', '4345', '3501', '0'), +('15', '46', '18', '2461', '3668', '0'), +('15', '46', '18', '2292', '2572', '0'), +('15', '46', '18', '4410', '2557', '0'), +('15', '46', '18', '4346', '2331', '0'), +('15', '46', '19', '2293', '6187', '0'), +('15', '46', '19', '68239', '4834', '0'), +('15', '46', '19', '4407', '3286', '0'), +('15', '46', '19', '2337', '1757', '0'), +('15', '46', '13', '7257', '14151', '0'), +('15', '46', '13', '6692', '13290', '0'), +('15', '46', '13', '11610', '12687', '0'), +('15', '46', '13', '6691', '11768', '0'), +('15', '46', '14', '7257', '14151', '0'), +('15', '46', '14', '6692', '13290', '0'), +('15', '46', '14', '11551', '12679', '0'), +('15', '46', '14', '6691', '11768', '0'), +('15', '46', '11', '9246', '3382', '0'), +('15', '46', '11', '14762', '3181', '0'), +('15', '46', '11', '20677', '1800', '0'), +('15', '46', '11', '13353', '1500', '0'), +('15', '47', '22', '10323', '0', '0'), +('15', '47', '22', '10664', '0', '0'), +('15', '47', '22', '9246', '0', '0'), +('15', '47', '22', '21509', '0', '0'), +('15', '47', '1', '14701', '5052', '0'), +('15', '47', '1', '14702', '4250', '0'), +('15', '47', '1', '30361', '1890', '0'), +('15', '47', '1', '10165', '1683', '0'), +('15', '47', '2', '2191', '3579', '0'), +('15', '47', '2', '1519', '3207', '0'), +('15', '47', '2', '10142', '3012', '0'), +('15', '47', '2', '4341', '2712', '0'), +('15', '47', '3', '11052', '4258', '0'), +('15', '47', '3', '4505', '2742', '0'), +('15', '47', '3', '14695', '2410', '0'), +('15', '47', '3', '2295', '1521', '0'), +('15', '47', '5', '14703', '8250', '0'), +('15', '47', '5', '14700', '4953', '0'), +('15', '47', '5', '4501', '4747', '0'), +('15', '47', '5', '10055', '4505', '0'), +('15', '47', '8', '11621', '14220', '0'), +('15', '47', '8', '1546', '13208', '0'), +('15', '47', '8', '11603', '8565', '0'), +('15', '47', '8', '1409', '6312', '0'), +('15', '47', '6', '1557', '6760', '0'), +('15', '47', '6', '2286', '3045', '0'), +('15', '47', '6', '25062', '1833', '0'), +('15', '47', '6', '2331', '1607', '0'), +('15', '47', '17', '2285', '7597', '0'), +('15', '47', '17', '4342', '6161', '0'), +('15', '47', '17', '2405', '3493', '0'), +('15', '47', '17', '3305', '2867', '0'), +('15', '47', '7', '4343', '3727', '0'), +('15', '47', '7', '2289', '2691', '0'), +('15', '47', '7', '2458', '2406', '0'), +('15', '47', '7', '2342', '2168', '0'), +('15', '47', '9', '10149', '3107', '0'), +('15', '47', '9', '2290', '2679', '0'), +('15', '47', '9', '14650', '2552', '0'), +('15', '47', '9', '4311', '2312', '0'), +('15', '47', '15', '10366', '8005', '0'), +('15', '47', '15', '10151', '7200', '0'), +('15', '47', '15', '14679', '6255', '0'), +('15', '47', '15', '14678', '5104', '0'), +('15', '47', '20', '11601', '9498', '0'), +('15', '47', '20', '2742', '6459', '0'), +('15', '47', '20', '1543', '5769', '0'), +('15', '47', '20', '1365', '4200', '0'), +('15', '47', '12', '20655', '6794', '0'), +('15', '47', '12', '2923', '4654', '0'), +('15', '47', '12', '11624', '3710', '0'), +('15', '47', '12', '4345', '3531', '0'), +('15', '47', '18', '2461', '3693', '0'), +('15', '47', '18', '2292', '2596', '0'), +('15', '47', '18', '4410', '2557', '0'), +('15', '47', '18', '4346', '2331', '0'), +('15', '47', '19', '2293', '6205', '0'), +('15', '47', '19', '68239', '4852', '0'), +('15', '47', '19', '4407', '3340', '0'), +('15', '47', '19', '2337', '1757', '0'), +('15', '47', '13', '7257', '14151', '0'), +('15', '47', '13', '6692', '13290', '0'), +('15', '47', '13', '11610', '12687', '0'), +('15', '47', '13', '6691', '11768', '0'), +('15', '47', '14', '7257', '14151', '0'), +('15', '47', '14', '6692', '13290', '0'), +('15', '47', '14', '11551', '12679', '0'), +('15', '47', '14', '6691', '11768', '0'), +('15', '47', '11', '9246', '3443', '0'), +('15', '47', '11', '14762', '3181', '0'), +('15', '47', '11', '20677', '1800', '0'), +('15', '47', '11', '13353', '1500', '0'), +('15', '48', '22', '10323', '0', '0'), +('15', '48', '22', '10664', '0', '0'), +('15', '48', '22', '9246', '0', '0'), +('15', '48', '22', '21509', '0', '0'), +('15', '48', '1', '14701', '5052', '0'), +('15', '48', '1', '14702', '4250', '0'), +('15', '48', '1', '30361', '1890', '0'), +('15', '48', '1', '10165', '1683', '0'), +('15', '48', '2', '2191', '3616', '0'), +('15', '48', '2', '1519', '3207', '0'), +('15', '48', '2', '10142', '3012', '0'), +('15', '48', '2', '4341', '2712', '0'), +('15', '48', '3', '11052', '4349', '0'), +('15', '48', '3', '4505', '2784', '0'), +('15', '48', '3', '14695', '2452', '0'), +('15', '48', '3', '2295', '1533', '0'), +('15', '48', '5', '14703', '8250', '0'), +('15', '48', '5', '14700', '4953', '0'), +('15', '48', '5', '4501', '4826', '0'), +('15', '48', '5', '10055', '4505', '0'), +('15', '48', '8', '11621', '14220', '0'), +('15', '48', '8', '1546', '13268', '0'), +('15', '48', '8', '11603', '8619', '0'), +('15', '48', '8', '1409', '6312', '0'), +('15', '48', '6', '1557', '6760', '0'), +('15', '48', '6', '2286', '3069', '0'), +('15', '48', '6', '25062', '1833', '0'), +('15', '48', '6', '2331', '1625', '0'), +('15', '48', '17', '2285', '7621', '0'), +('15', '48', '17', '4342', '6221', '0'), +('15', '48', '17', '2405', '3538', '0'), +('15', '48', '17', '3305', '2867', '0'), +('15', '48', '7', '4343', '3775', '0'), +('15', '48', '7', '2289', '2715', '0'), +('15', '48', '7', '2458', '2406', '0'), +('15', '48', '7', '2342', '2182', '0'), +('15', '48', '9', '10149', '3125', '0'), +('15', '48', '9', '2290', '2719', '0'), +('15', '48', '9', '14650', '2552', '0'), +('15', '48', '9', '4311', '2345', '0'), +('15', '48', '15', '10366', '8005', '0'), +('15', '48', '15', '10151', '7200', '0'), +('15', '48', '15', '14679', '6255', '0'), +('15', '48', '15', '14678', '5104', '0'), +('15', '48', '20', '11601', '9546', '0'), +('15', '48', '20', '2742', '6508', '0'), +('15', '48', '20', '1543', '5830', '0'), +('15', '48', '20', '1365', '4200', '0'), +('15', '48', '12', '20655', '6815', '0'), +('15', '48', '12', '2923', '4654', '0'), +('15', '48', '12', '11624', '3744', '0'), +('15', '48', '12', '4345', '3562', '0'), +('15', '48', '18', '2461', '3717', '0'), +('15', '48', '18', '2292', '2621', '0'), +('15', '48', '18', '4410', '2557', '0'), +('15', '48', '18', '4346', '2331', '0'), +('15', '48', '19', '2293', '6223', '0'), +('15', '48', '19', '68239', '4870', '0'), +('15', '48', '19', '4407', '3394', '0'), +('15', '48', '19', '2337', '1757', '0'), +('15', '48', '13', '7257', '14151', '0'), +('15', '48', '13', '6692', '13290', '0'), +('15', '48', '13', '11610', '12687', '0'), +('15', '48', '13', '6691', '11768', '0'), +('15', '48', '14', '7257', '14151', '0'), +('15', '48', '14', '6692', '13290', '0'), +('15', '48', '14', '11551', '12679', '0'), +('15', '48', '14', '6691', '11768', '0'), +('15', '48', '11', '9246', '3503', '0'), +('15', '48', '11', '14762', '3181', '0'), +('15', '48', '11', '20677', '1800', '0'), +('15', '48', '11', '13353', '1500', '0'), +('15', '49', '22', '10323', '0', '0'), +('15', '49', '22', '10664', '0', '0'), +('15', '49', '22', '9246', '0', '0'), +('15', '49', '22', '21509', '0', '0'), +('15', '49', '1', '14701', '5052', '0'), +('15', '49', '1', '14702', '4250', '0'), +('15', '49', '1', '30361', '1890', '0'), +('15', '49', '1', '10165', '1683', '0'), +('15', '49', '2', '2191', '3652', '0'), +('15', '49', '2', '1519', '3207', '0'), +('15', '49', '2', '10142', '3012', '0'), +('15', '49', '2', '4341', '2712', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '49', '3', '11052', '4439', '0'), +('15', '49', '3', '4505', '2827', '0'), +('15', '49', '3', '14695', '2495', '0'), +('15', '49', '3', '2295', '1545', '0'), +('15', '49', '5', '14703', '8250', '0'), +('15', '49', '5', '14700', '4953', '0'), +('15', '49', '5', '4501', '4904', '0'), +('15', '49', '5', '10055', '4505', '0'), +('15', '49', '8', '11621', '14220', '0'), +('15', '49', '8', '1546', '13329', '0'), +('15', '49', '8', '11603', '8674', '0'), +('15', '49', '8', '1409', '6312', '0'), +('15', '49', '6', '1557', '6760', '0'), +('15', '49', '6', '2286', '3091', '0'), +('15', '49', '6', '25062', '1833', '0'), +('15', '49', '6', '2331', '1643', '0'), +('15', '49', '17', '2285', '7645', '0'), +('15', '49', '17', '4342', '6282', '0'), +('15', '49', '17', '2405', '3581', '0'), +('15', '49', '17', '3305', '2867', '0'), +('15', '49', '7', '4343', '3817', '0'), +('15', '49', '7', '2289', '2739', '0'), +('15', '49', '7', '2458', '2406', '0'), +('15', '49', '7', '2342', '2195', '0'), +('15', '49', '9', '10149', '3143', '0'), +('15', '49', '9', '2290', '2758', '0'), +('15', '49', '9', '14650', '2552', '0'), +('15', '49', '9', '4311', '2375', '0'), +('15', '49', '15', '10366', '8005', '0'), +('15', '49', '15', '10151', '7200', '0'), +('15', '49', '15', '14679', '6255', '0'), +('15', '49', '15', '14678', '5104', '0'), +('15', '49', '20', '11601', '9588', '0'), +('15', '49', '20', '2742', '6550', '0'), +('15', '49', '20', '1543', '5890', '0'), +('15', '49', '20', '1365', '4200', '0'), +('15', '49', '12', '20655', '6836', '0'), +('15', '49', '12', '2923', '4654', '0'), +('15', '49', '12', '11624', '3773', '0'), +('15', '49', '12', '4345', '3592', '0'), +('15', '49', '18', '2461', '3741', '0'), +('15', '49', '18', '2292', '2645', '0'), +('15', '49', '18', '4410', '2557', '0'), +('15', '49', '18', '4346', '2331', '0'), +('15', '49', '19', '2293', '6241', '0'), +('15', '49', '19', '68239', '4888', '0'), +('15', '49', '19', '4407', '3449', '0'), +('15', '49', '19', '2337', '1757', '0'), +('15', '49', '13', '7257', '14151', '0'), +('15', '49', '13', '6692', '13290', '0'), +('15', '49', '13', '11610', '12687', '0'), +('15', '49', '13', '6691', '11768', '0'), +('15', '49', '14', '7257', '14151', '0'), +('15', '49', '14', '6692', '13290', '0'), +('15', '49', '14', '11551', '12679', '0'), +('15', '49', '14', '6691', '11768', '0'), +('15', '49', '11', '9246', '3564', '0'), +('15', '49', '11', '14762', '3181', '0'), +('15', '49', '11', '20677', '1800', '0'), +('15', '49', '11', '13353', '1500', '0'), +('15', '50', '22', '10323', '0', '0'), +('15', '50', '22', '10664', '0', '0'), +('15', '50', '22', '9246', '0', '0'), +('15', '50', '22', '21509', '0', '0'), +('15', '50', '1', '14701', '5052', '0'), +('15', '50', '1', '14702', '4250', '0'), +('15', '50', '1', '30361', '1890', '0'), +('15', '50', '1', '10165', '1683', '0'), +('15', '50', '2', '2191', '3688', '0'), +('15', '50', '2', '1519', '3207', '0'), +('15', '50', '2', '10142', '3012', '0'), +('15', '50', '2', '4341', '2712', '0'), +('15', '50', '3', '11052', '4530', '0'), +('15', '50', '3', '4505', '2869', '0'), +('15', '50', '3', '14695', '2537', '0'), +('15', '50', '3', '2295', '1557', '0'), +('15', '50', '5', '14703', '8250', '0'), +('15', '50', '5', '4501', '4983', '0'), +('15', '50', '5', '14700', '4953', '0'), +('15', '50', '5', '10055', '4505', '0'), +('15', '50', '8', '11621', '14220', '0'), +('15', '50', '8', '1546', '13389', '0'), +('15', '50', '8', '11603', '8728', '0'), +('15', '50', '8', '1409', '6312', '0'), +('15', '50', '6', '1557', '6760', '0'), +('15', '50', '6', '2286', '3112', '0'), +('15', '50', '6', '25062', '1833', '0'), +('15', '50', '6', '2331', '1661', '0'), +('15', '50', '17', '2285', '7669', '0'), +('15', '50', '17', '4342', '6342', '0'), +('15', '50', '17', '2405', '3623', '0'), +('15', '50', '17', '3305', '2867', '0'), +('15', '50', '7', '4343', '3860', '0'), +('15', '50', '7', '2289', '2763', '0'), +('15', '50', '7', '2458', '2406', '0'), +('15', '50', '7', '2342', '2207', '0'), +('15', '50', '9', '10149', '3161', '0'), +('15', '50', '9', '2290', '2796', '0'), +('15', '50', '9', '14650', '2552', '0'), +('15', '50', '9', '4311', '2405', '0'), +('15', '50', '15', '10366', '8005', '0'), +('15', '50', '15', '10151', '7200', '0'), +('15', '50', '15', '14679', '6255', '0'), +('15', '50', '15', '14678', '5104', '0'), +('15', '50', '20', '11601', '9631', '0'), +('15', '50', '20', '2742', '6592', '0'), +('15', '50', '20', '1543', '5950', '0'), +('15', '50', '20', '1365', '4200', '0'), +('15', '50', '12', '20655', '6856', '0'), +('15', '50', '12', '2923', '4654', '0'), +('15', '50', '12', '11624', '3803', '0'), +('15', '50', '12', '4345', '3622', '0'), +('15', '50', '18', '2461', '3765', '0'), +('15', '50', '18', '2292', '2669', '0'), +('15', '50', '18', '4410', '2557', '0'), +('15', '50', '18', '4346', '2331', '0'), +('15', '50', '19', '2293', '6259', '0'), +('15', '50', '19', '68239', '4906', '0'), +('15', '50', '19', '4407', '3503', '0'), +('15', '50', '19', '2337', '1757', '0'), +('15', '50', '13', '7257', '14151', '0'), +('15', '50', '13', '6692', '13290', '0'), +('15', '50', '13', '11610', '12687', '0'), +('15', '50', '13', '6691', '11768', '0'), +('15', '50', '14', '7257', '14151', '0'), +('15', '50', '14', '6692', '13290', '0'), +('15', '50', '14', '11551', '12679', '0'), +('15', '50', '14', '6691', '11768', '0'), +('15', '50', '11', '9246', '3624', '0'), +('15', '50', '11', '14762', '3181', '0'), +('15', '50', '11', '20677', '1800', '0'), +('15', '50', '11', '13353', '1500', '0'), +('15', '51', '22', '10323', '0', '0'), +('15', '51', '22', '10664', '0', '0'), +('15', '51', '22', '9246', '0', '0'), +('15', '51', '22', '21509', '0', '0'), +('15', '51', '1', '14701', '5052', '0'), +('15', '51', '1', '14702', '4250', '0'), +('15', '51', '1', '30361', '1890', '0'), +('15', '51', '1', '10165', '1683', '0'), +('15', '51', '2', '2191', '3724', '0'), +('15', '51', '2', '1519', '3207', '0'), +('15', '51', '2', '10142', '3012', '0'), +('15', '51', '2', '4341', '2712', '0'), +('15', '51', '3', '11052', '4621', '0'), +('15', '51', '3', '4505', '2911', '0'), +('15', '51', '3', '14695', '2579', '0'), +('15', '51', '3', '2295', '1569', '0'), +('15', '51', '5', '14703', '8250', '0'), +('15', '51', '5', '4501', '5062', '0'), +('15', '51', '5', '14700', '4953', '0'), +('15', '51', '5', '10055', '4505', '0'), +('15', '51', '8', '11621', '14220', '0'), +('15', '51', '8', '1546', '13449', '0'), +('15', '51', '8', '11603', '8782', '0'), +('15', '51', '8', '1409', '6312', '0'), +('15', '51', '6', '1557', '6760', '0'), +('15', '51', '6', '2286', '3136', '0'), +('15', '51', '6', '25062', '1833', '0'), +('15', '51', '6', '2331', '1679', '0'), +('15', '51', '17', '2285', '7693', '0'), +('15', '51', '17', '4342', '6402', '0'), +('15', '51', '17', '2405', '3668', '0'), +('15', '51', '17', '2348', '2872', '0'), +('15', '51', '7', '4343', '3908', '0'), +('15', '51', '7', '2289', '2787', '0'), +('15', '51', '7', '2458', '2406', '0'), +('15', '51', '7', '2342', '2222', '0'), +('15', '51', '9', '10149', '3179', '0'), +('15', '51', '9', '2290', '2836', '0'), +('15', '51', '9', '14650', '2552', '0'), +('15', '51', '9', '4311', '2438', '0'), +('15', '51', '15', '10366', '8005', '0'), +('15', '51', '15', '10151', '7200', '0'), +('15', '51', '15', '14679', '6255', '0'), +('15', '51', '15', '14678', '5104', '0'), +('15', '51', '20', '11601', '9679', '0'), +('15', '51', '20', '2742', '6640', '0'), +('15', '51', '20', '1543', '6011', '0'), +('15', '51', '20', '1365', '4200', '0'), +('15', '51', '12', '20655', '6878', '0'), +('15', '51', '12', '2923', '4654', '0'), +('15', '51', '12', '11624', '3837', '0'), +('15', '51', '12', '4345', '3652', '0'), +('15', '51', '18', '2461', '3789', '0'), +('15', '51', '18', '2292', '2693', '0'), +('15', '51', '18', '4410', '2557', '0'), +('15', '51', '18', '4346', '2331', '0'), +('15', '51', '19', '2293', '6277', '0'), +('15', '51', '19', '68239', '4924', '0'), +('15', '51', '19', '4407', '3557', '0'), +('15', '51', '19', '2337', '1757', '0'), +('15', '51', '13', '7257', '14151', '0'), +('15', '51', '13', '6692', '13290', '0'), +('15', '51', '13', '11610', '12687', '0'), +('15', '51', '13', '6691', '11768', '0'), +('15', '51', '14', '7257', '14151', '0'), +('15', '51', '14', '6692', '13290', '0'), +('15', '51', '14', '11551', '12679', '0'), +('15', '51', '14', '6691', '11768', '0'), +('15', '51', '11', '9246', '3684', '0'), +('15', '51', '11', '14762', '3181', '0'), +('15', '51', '11', '20677', '1800', '0'), +('15', '51', '11', '13353', '1500', '0'), +('15', '52', '22', '10323', '0', '0'), +('15', '52', '22', '10664', '0', '0'), +('15', '52', '22', '9246', '0', '0'), +('15', '52', '22', '21509', '0', '0'), +('15', '52', '1', '14701', '5052', '0'), +('15', '52', '1', '14702', '4250', '0'), +('15', '52', '1', '30361', '1890', '0'), +('15', '52', '1', '10165', '1683', '0'), +('15', '52', '2', '2191', '3761', '0'), +('15', '52', '2', '1519', '3207', '0'), +('15', '52', '2', '10142', '3012', '0'), +('15', '52', '2', '2294', '2715', '0'), +('15', '52', '3', '11052', '4711', '0'), +('15', '52', '3', '4505', '2954', '0'), +('15', '52', '3', '14695', '2621', '0'), +('15', '52', '3', '2295', '1581', '0'), +('15', '52', '5', '14703', '8250', '0'), +('15', '52', '5', '4501', '5140', '0'), +('15', '52', '5', '14700', '4953', '0'), +('15', '52', '5', '10055', '4505', '0'), +('15', '52', '8', '11621', '14220', '0'), +('15', '52', '8', '1546', '13510', '0'), +('15', '52', '8', '11603', '8837', '0'), +('15', '52', '8', '1409', '6312', '0'), +('15', '52', '6', '1557', '6760', '0'), +('15', '52', '6', '2286', '3157', '0'), +('15', '52', '6', '25062', '1833', '0'), +('15', '52', '6', '2331', '1697', '0'), +('15', '52', '17', '2285', '7717', '0'), +('15', '52', '17', '4342', '6463', '0'), +('15', '52', '17', '2405', '3711', '0'), +('15', '52', '17', '2348', '2893', '0'), +('15', '52', '7', '4343', '3950', '0'), +('15', '52', '7', '2289', '2811', '0'), +('15', '52', '7', '2458', '2406', '0'), +('15', '52', '7', '2342', '2235', '0'), +('15', '52', '9', '10149', '3197', '0'), +('15', '52', '9', '2290', '2875', '0'), +('15', '52', '9', '14650', '2552', '0'), +('15', '52', '9', '4311', '2468', '0'), +('15', '52', '15', '10366', '8005', '0'), +('15', '52', '15', '10151', '7200', '0'), +('15', '52', '15', '14679', '6255', '0'), +('15', '52', '15', '14678', '5104', '0'), +('15', '52', '20', '11601', '9721', '0'), +('15', '52', '20', '2742', '6683', '0'), +('15', '52', '20', '1543', '6071', '0'), +('15', '52', '20', '1365', '4200', '0'), +('15', '52', '12', '20655', '6899', '0'), +('15', '52', '12', '2923', '4654', '0'), +('15', '52', '12', '11624', '3866', '0'), +('15', '52', '12', '4345', '3682', '0'), +('15', '52', '18', '2461', '3813', '0'), +('15', '52', '18', '2292', '2717', '0'), +('15', '52', '18', '4410', '2557', '0'), +('15', '52', '18', '4346', '2331', '0'), +('15', '52', '19', '2293', '6296', '0'), +('15', '52', '19', '68239', '4942', '0'), +('15', '52', '19', '4407', '3612', '0'), +('15', '52', '19', '2337', '1757', '0'), +('15', '52', '13', '7257', '14151', '0'), +('15', '52', '13', '6692', '13290', '0'), +('15', '52', '13', '11610', '12687', '0'), +('15', '52', '13', '6691', '11768', '0'), +('15', '52', '14', '7257', '14151', '0'), +('15', '52', '14', '6692', '13290', '0'), +('15', '52', '14', '11551', '12679', '0'), +('15', '52', '14', '6691', '11768', '0'), +('15', '52', '11', '9246', '3745', '0'), +('15', '52', '11', '14762', '3181', '0'), +('15', '52', '11', '20677', '1800', '0'), +('15', '52', '11', '13353', '1500', '0'), +('15', '53', '22', '10323', '0', '0'), +('15', '53', '22', '10664', '0', '0'), +('15', '53', '22', '9246', '0', '0'), +('15', '53', '22', '21509', '0', '0'), +('15', '53', '1', '14701', '5052', '0'), +('15', '53', '1', '14702', '4250', '0'), +('15', '53', '1', '30361', '1890', '0'), +('15', '53', '1', '10165', '1683', '0'), +('15', '53', '2', '2191', '3797', '0'), +('15', '53', '2', '1519', '3207', '0'), +('15', '53', '2', '10142', '3012', '0'), +('15', '53', '2', '2294', '2727', '0'), +('15', '53', '3', '11052', '4802', '0'), +('15', '53', '3', '4505', '2996', '0'), +('15', '53', '3', '14695', '2664', '0'), +('15', '53', '3', '2295', '1593', '0'), +('15', '53', '5', '14703', '8250', '0'), +('15', '53', '5', '4501', '5219', '0'), +('15', '53', '5', '14700', '4953', '0'), +('15', '53', '5', '10055', '4505', '0'), +('15', '53', '8', '11621', '14220', '0'), +('15', '53', '8', '1546', '13570', '0'), +('15', '53', '8', '11603', '8891', '0'), +('15', '53', '8', '1409', '6312', '0'), +('15', '53', '6', '1557', '6760', '0'), +('15', '53', '6', '2286', '3178', '0'), +('15', '53', '6', '25062', '1833', '0'), +('15', '53', '6', '2331', '1715', '0'), +('15', '53', '17', '2285', '7741', '0'), +('15', '53', '17', '4342', '6523', '0'), +('15', '53', '17', '2405', '3754', '0'), +('15', '53', '17', '2348', '2914', '0'), +('15', '53', '7', '4343', '3992', '0'), +('15', '53', '7', '2289', '2835', '0'), +('15', '53', '7', '2458', '2406', '0'), +('15', '53', '7', '2342', '2247', '0'), +('15', '53', '9', '10149', '3215', '0'), +('15', '53', '9', '2290', '2914', '0'), +('15', '53', '9', '14650', '2552', '0'), +('15', '53', '9', '4311', '2498', '0'), +('15', '53', '15', '10366', '8005', '0'), +('15', '53', '15', '10151', '7200', '0'), +('15', '53', '15', '14679', '6255', '0'), +('15', '53', '15', '14678', '5104', '0'), +('15', '53', '20', '11601', '9764', '0'), +('15', '53', '20', '2742', '6725', '0'), +('15', '53', '20', '1543', '6132', '0'), +('15', '53', '20', '1365', '4200', '0'), +('15', '53', '12', '20655', '6919', '0'), +('15', '53', '12', '2923', '4654', '0'), +('15', '53', '12', '11624', '3896', '0'), +('15', '53', '12', '4345', '3713', '0'), +('15', '53', '18', '2461', '3837', '0'), +('15', '53', '18', '2292', '2741', '0'), +('15', '53', '18', '4410', '2557', '0'), +('15', '53', '18', '4346', '2331', '0'), +('15', '53', '19', '2293', '6314', '0'), +('15', '53', '19', '68239', '4961', '0'), +('15', '53', '19', '4407', '3666', '0'), +('15', '53', '19', '2337', '1757', '0'), +('15', '53', '13', '7257', '14151', '0'), +('15', '53', '13', '6692', '13290', '0'), +('15', '53', '13', '11610', '12687', '0'), +('15', '53', '13', '6691', '11768', '0'), +('15', '53', '14', '7257', '14151', '0'), +('15', '53', '14', '6692', '13290', '0'), +('15', '53', '14', '11551', '12679', '0'), +('15', '53', '14', '6691', '11768', '0'), +('15', '53', '11', '9246', '3805', '0'), +('15', '53', '11', '14762', '3181', '0'), +('15', '53', '11', '20677', '1800', '0'), +('15', '53', '11', '13353', '1500', '0'), +('15', '54', '22', '10323', '0', '0'), +('15', '54', '22', '10664', '0', '0'), +('15', '54', '22', '9246', '0', '0'), +('15', '54', '22', '21509', '0', '0'), +('15', '54', '1', '14701', '5052', '0'), +('15', '54', '1', '14702', '4250', '0'), +('15', '54', '1', '30361', '1890', '0'), +('15', '54', '1', '10165', '1683', '0'), +('15', '54', '2', '2191', '3833', '0'), +('15', '54', '2', '1519', '3207', '0'), +('15', '54', '2', '10142', '3012', '0'), +('15', '54', '2', '2294', '2740', '0'), +('15', '54', '3', '11052', '4892', '0'), +('15', '54', '3', '4505', '3038', '0'), +('15', '54', '3', '14695', '2706', '0'), +('15', '54', '3', '2295', '1605', '0'), +('15', '54', '5', '14703', '8250', '0'), +('15', '54', '5', '4501', '5297', '0'), +('15', '54', '5', '14700', '4953', '0'), +('15', '54', '5', '10055', '4505', '0'), +('15', '54', '8', '11621', '14220', '0'), +('15', '54', '8', '1546', '13631', '0'), +('15', '54', '8', '11603', '8945', '0'), +('15', '54', '8', '1409', '6312', '0'), +('15', '54', '6', '1557', '6760', '0'), +('15', '54', '6', '2286', '3202', '0'), +('15', '54', '6', '25062', '1833', '0'), +('15', '54', '6', '2331', '1733', '0'), +('15', '54', '17', '2285', '7766', '0'), +('15', '54', '17', '4342', '6584', '0'), +('15', '54', '17', '2405', '3799', '0'), +('15', '54', '17', '2348', '2938', '0'), +('15', '54', '7', '4343', '4041', '0'), +('15', '54', '7', '2289', '2860', '0'), +('15', '54', '7', '2458', '2406', '0'), +('15', '54', '7', '2342', '2262', '0'), +('15', '54', '9', '10149', '3233', '0'), +('15', '54', '9', '2290', '2954', '0'), +('15', '54', '9', '14650', '2552', '0'), +('15', '54', '9', '4311', '2531', '0'), +('15', '54', '15', '10366', '8005', '0'), +('15', '54', '15', '10151', '7200', '0'), +('15', '54', '15', '14679', '6255', '0'), +('15', '54', '15', '14678', '5104', '0'), +('15', '54', '20', '11601', '9812', '0'), +('15', '54', '20', '2742', '6773', '0'), +('15', '54', '20', '1543', '6192', '0'), +('15', '54', '20', '1365', '4200', '0'), +('15', '54', '12', '20655', '6941', '0'), +('15', '54', '12', '2923', '4654', '0'), +('15', '54', '12', '11624', '3930', '0'), +('15', '54', '12', '4345', '3743', '0'), +('15', '54', '18', '2461', '3862', '0'), +('15', '54', '18', '2292', '2765', '0'), +('15', '54', '18', '4410', '2557', '0'), +('15', '54', '18', '4346', '2331', '0'), +('15', '54', '19', '2293', '6332', '0'), +('15', '54', '19', '68239', '4979', '0'), +('15', '54', '19', '4407', '3720', '0'), +('15', '54', '19', '2337', '1757', '0'), +('15', '54', '13', '7257', '14151', '0'), +('15', '54', '13', '6692', '13290', '0'), +('15', '54', '13', '11610', '12687', '0'), +('15', '54', '13', '6691', '11768', '0'), +('15', '54', '14', '7257', '14151', '0'), +('15', '54', '14', '6692', '13290', '0'), +('15', '54', '14', '11551', '12679', '0'), +('15', '54', '14', '6691', '11768', '0'), +('15', '54', '11', '9246', '3866', '0'), +('15', '54', '11', '14762', '3181', '0'), +('15', '54', '11', '20677', '1800', '0'), +('15', '54', '11', '13353', '1500', '0'), +('15', '55', '22', '10323', '0', '0'), +('15', '55', '22', '10664', '0', '0'), +('15', '55', '22', '9246', '0', '0'), +('15', '55', '22', '21509', '0', '0'), +('15', '55', '1', '14701', '5052', '0'), +('15', '55', '1', '14702', '4250', '0'), +('15', '55', '1', '30361', '1890', '0'), +('15', '55', '1', '10165', '1683', '0'), +('15', '55', '2', '2191', '3869', '0'), +('15', '55', '2', '1519', '3207', '0'), +('15', '55', '2', '10142', '3012', '0'), +('15', '55', '2', '2294', '2752', '0'), +('15', '55', '3', '11052', '4983', '0'), +('15', '55', '3', '4505', '3080', '0'), +('15', '55', '3', '14695', '2748', '0'), +('15', '55', '3', '2295', '1617', '0'), +('15', '55', '5', '14703', '8250', '0'), +('15', '55', '5', '4501', '5376', '0'), +('15', '55', '5', '14700', '4953', '0'), +('15', '55', '5', '68291', '4517', '0'), +('15', '55', '8', '11621', '14220', '0'), +('15', '55', '8', '1546', '13691', '0'), +('15', '55', '8', '11603', '9000', '0'), +('15', '55', '8', '1409', '6312', '0'), +('15', '55', '6', '1557', '6760', '0'), +('15', '55', '6', '2286', '3223', '0'), +('15', '55', '6', '25062', '1833', '0'), +('15', '55', '6', '2331', '1752', '0'), +('15', '55', '17', '2285', '7790', '0'), +('15', '55', '17', '4342', '6644', '0'), +('15', '55', '17', '2405', '3841', '0'), +('15', '55', '17', '2348', '2960', '0'), +('15', '55', '7', '4343', '4083', '0'), +('15', '55', '7', '2289', '2884', '0'), +('15', '55', '7', '2458', '2406', '0'), +('15', '55', '7', '2342', '2274', '0'), +('15', '55', '9', '10149', '3252', '0'), +('15', '55', '9', '2290', '2992', '0'), +('15', '55', '9', '4311', '2561', '0'), +('15', '55', '9', '14650', '2552', '0'), +('15', '55', '15', '10366', '8005', '0'), +('15', '55', '15', '10151', '7200', '0'), +('15', '55', '15', '14679', '6255', '0'), +('15', '55', '15', '14678', '5104', '0'), +('15', '55', '20', '11601', '9854', '0'), +('15', '55', '20', '2742', '6816', '0'), +('15', '55', '20', '1543', '6252', '0'), +('15', '55', '20', '1365', '4200', '0'), +('15', '55', '12', '20655', '6961', '0'), +('15', '55', '12', '2923', '4654', '0'), +('15', '55', '12', '11624', '3959', '0'), +('15', '55', '12', '4345', '3773', '0'), +('15', '55', '18', '2461', '3886', '0'), +('15', '55', '18', '2292', '2790', '0'), +('15', '55', '18', '4410', '2557', '0'), +('15', '55', '18', '4346', '2331', '0'), +('15', '55', '19', '2293', '6350', '0'), +('15', '55', '19', '68239', '4997', '0'), +('15', '55', '19', '4407', '3775', '0'), +('15', '55', '19', '2337', '1757', '0'), +('15', '55', '13', '7257', '14151', '0'), +('15', '55', '13', '6692', '13290', '0'), +('15', '55', '13', '11610', '12687', '0'), +('15', '55', '13', '6691', '11768', '0'), +('15', '55', '14', '7257', '14151', '0'), +('15', '55', '14', '6692', '13290', '0'), +('15', '55', '14', '11551', '12679', '0'), +('15', '55', '14', '6691', '11768', '0'), +('15', '55', '11', '9246', '3926', '0'), +('15', '55', '11', '14762', '3181', '0'), +('15', '55', '11', '20677', '1800', '0'), +('15', '55', '11', '13353', '1500', '0'), +('15', '56', '22', '10323', '0', '0'), +('15', '56', '22', '10664', '0', '0'), +('15', '56', '22', '9246', '0', '0'), +('15', '56', '22', '21509', '0', '0'), +('15', '56', '1', '14701', '5052', '0'), +('15', '56', '1', '14702', '4250', '0'), +('15', '56', '1', '30361', '1890', '0'), +('15', '56', '1', '10165', '1683', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '56', '2', '2191', '3905', '0'), +('15', '56', '2', '1519', '3207', '0'), +('15', '56', '2', '10142', '3012', '0'), +('15', '56', '2', '2294', '2764', '0'), +('15', '56', '3', '11052', '5074', '0'), +('15', '56', '3', '4505', '3123', '0'), +('15', '56', '3', '14695', '2790', '0'), +('15', '56', '3', '2295', '1629', '0'), +('15', '56', '5', '14703', '8250', '0'), +('15', '56', '5', '4501', '5454', '0'), +('15', '56', '5', '14700', '4953', '0'), +('15', '56', '5', '68291', '4541', '0'), +('15', '56', '8', '11621', '14220', '0'), +('15', '56', '8', '1546', '13751', '0'), +('15', '56', '8', '11603', '9054', '0'), +('15', '56', '8', '1409', '6312', '0'), +('15', '56', '6', '1557', '6760', '0'), +('15', '56', '6', '2286', '3248', '0'), +('15', '56', '6', '25062', '1833', '0'), +('15', '56', '6', '2331', '1770', '0'), +('15', '56', '17', '2285', '7814', '0'), +('15', '56', '17', '4342', '6704', '0'), +('15', '56', '17', '2405', '3886', '0'), +('15', '56', '17', '2348', '2984', '0'), +('15', '56', '7', '4343', '4131', '0'), +('15', '56', '7', '2289', '2908', '0'), +('15', '56', '7', '2458', '2406', '0'), +('15', '56', '7', '2342', '2289', '0'), +('15', '56', '9', '10149', '3270', '0'), +('15', '56', '9', '2290', '3032', '0'), +('15', '56', '9', '4311', '2595', '0'), +('15', '56', '9', '14650', '2552', '0'), +('15', '56', '15', '10366', '8005', '0'), +('15', '56', '15', '10151', '7200', '0'), +('15', '56', '15', '14679', '6255', '0'), +('15', '56', '15', '14678', '5104', '0'), +('15', '56', '20', '11601', '9903', '0'), +('15', '56', '20', '2742', '6864', '0'), +('15', '56', '20', '1543', '6313', '0'), +('15', '56', '20', '1365', '4200', '0'), +('15', '56', '12', '20655', '6983', '0'), +('15', '56', '12', '2923', '4654', '0'), +('15', '56', '12', '11624', '3993', '0'), +('15', '56', '12', '4345', '3803', '0'), +('15', '56', '18', '2461', '3910', '0'), +('15', '56', '18', '2292', '2814', '0'), +('15', '56', '18', '4410', '2557', '0'), +('15', '56', '18', '4346', '2331', '0'), +('15', '56', '19', '2293', '6368', '0'), +('15', '56', '19', '68239', '5015', '0'), +('15', '56', '19', '4407', '3829', '0'), +('15', '56', '19', '2337', '1757', '0'), +('15', '56', '13', '7257', '14151', '0'), +('15', '56', '13', '6692', '13290', '0'), +('15', '56', '13', '11610', '12687', '0'), +('15', '56', '13', '6691', '11768', '0'), +('15', '56', '14', '7257', '14151', '0'), +('15', '56', '14', '6692', '13290', '0'), +('15', '56', '14', '11551', '12679', '0'), +('15', '56', '14', '6691', '11768', '0'), +('15', '56', '11', '9246', '3986', '0'), +('15', '56', '11', '14762', '3181', '0'), +('15', '56', '11', '20677', '1800', '0'), +('15', '56', '11', '13353', '1500', '0'), +('15', '57', '22', '10323', '0', '0'), +('15', '57', '22', '10664', '0', '0'), +('15', '57', '22', '9246', '0', '0'), +('15', '57', '22', '21509', '0', '0'), +('15', '57', '1', '14701', '5052', '0'), +('15', '57', '1', '14702', '4250', '0'), +('15', '57', '1', '30361', '1890', '0'), +('15', '57', '1', '10165', '1683', '0'), +('15', '57', '2', '2191', '3942', '0'), +('15', '57', '2', '1519', '3207', '0'), +('15', '57', '2', '10142', '3012', '0'), +('15', '57', '2', '2294', '2776', '0'), +('15', '57', '3', '11052', '5164', '0'), +('15', '57', '3', '4505', '3165', '0'), +('15', '57', '3', '14695', '2833', '0'), +('15', '57', '3', '2295', '1642', '0'), +('15', '57', '5', '14703', '8250', '0'), +('15', '57', '5', '4501', '5533', '0'), +('15', '57', '5', '14700', '4953', '0'), +('15', '57', '5', '68291', '4565', '0'), +('15', '57', '8', '11621', '14220', '0'), +('15', '57', '8', '1546', '13812', '0'), +('15', '57', '8', '11603', '9109', '0'), +('15', '57', '8', '1409', '6312', '0'), +('15', '57', '6', '1557', '6760', '0'), +('15', '57', '6', '2286', '3269', '0'), +('15', '57', '6', '25062', '1833', '0'), +('15', '57', '6', '2331', '1788', '0'), +('15', '57', '17', '2285', '7838', '0'), +('15', '57', '17', '4342', '6765', '0'), +('15', '57', '17', '2405', '3929', '0'), +('15', '57', '17', '2348', '3005', '0'), +('15', '57', '7', '4343', '4174', '0'), +('15', '57', '7', '2289', '2932', '0'), +('15', '57', '7', '2458', '2406', '0'), +('15', '57', '7', '2342', '2302', '0'), +('15', '57', '9', '10149', '3288', '0'), +('15', '57', '9', '2290', '3071', '0'), +('15', '57', '9', '4311', '2624', '0'), +('15', '57', '9', '14650', '2552', '0'), +('15', '57', '15', '10366', '8005', '0'), +('15', '57', '15', '10151', '7200', '0'), +('15', '57', '15', '14679', '6255', '0'), +('15', '57', '15', '14678', '5104', '0'), +('15', '57', '20', '11601', '9945', '0'), +('15', '57', '20', '2742', '6906', '0'), +('15', '57', '20', '1543', '6373', '0'), +('15', '57', '20', '1365', '4200', '0'), +('15', '57', '12', '20655', '7004', '0'), +('15', '57', '12', '2923', '4654', '0'), +('15', '57', '12', '11624', '4023', '0'), +('15', '57', '12', '4345', '3833', '0'), +('15', '57', '18', '2461', '3934', '0'), +('15', '57', '18', '2292', '2838', '0'), +('15', '57', '18', '4410', '2557', '0'), +('15', '57', '18', '4346', '2331', '0'), +('15', '57', '19', '2293', '6386', '0'), +('15', '57', '19', '68239', '5033', '0'), +('15', '57', '19', '4407', '3884', '0'), +('15', '57', '19', '2337', '1757', '0'), +('15', '57', '13', '7257', '14151', '0'), +('15', '57', '13', '6692', '13290', '0'), +('15', '57', '13', '11610', '12687', '0'), +('15', '57', '13', '6691', '11768', '0'), +('15', '57', '14', '7257', '14151', '0'), +('15', '57', '14', '6692', '13290', '0'), +('15', '57', '14', '11551', '12679', '0'), +('15', '57', '14', '6691', '11768', '0'), +('15', '57', '11', '9246', '4047', '0'), +('15', '57', '11', '14762', '3181', '0'), +('15', '57', '11', '20677', '1800', '0'), +('15', '57', '11', '13353', '1500', '0'), +('15', '58', '22', '10323', '0', '0'), +('15', '58', '22', '10664', '0', '0'), +('15', '58', '22', '9246', '0', '0'), +('15', '58', '22', '21509', '0', '0'), +('15', '58', '1', '14701', '5052', '0'), +('15', '58', '1', '14702', '4250', '0'), +('15', '58', '1', '30361', '1890', '0'), +('15', '58', '1', '10165', '1683', '0'), +('15', '58', '2', '2191', '3978', '0'), +('15', '58', '2', '1519', '3207', '0'), +('15', '58', '2', '10142', '3012', '0'), +('15', '58', '2', '2294', '2788', '0'), +('15', '58', '3', '11052', '5255', '0'), +('15', '58', '3', '4505', '3207', '0'), +('15', '58', '3', '14695', '2875', '0'), +('15', '58', '3', '2295', '1654', '0'), +('15', '58', '5', '14703', '8250', '0'), +('15', '58', '5', '4501', '5611', '0'), +('15', '58', '5', '14700', '4953', '0'), +('15', '58', '5', '68291', '4590', '0'), +('15', '58', '8', '11621', '14220', '0'), +('15', '58', '8', '1546', '13872', '0'), +('15', '58', '8', '11603', '9163', '0'), +('15', '58', '8', '1409', '6312', '0'), +('15', '58', '6', '1557', '6760', '0'), +('15', '58', '6', '2286', '3293', '0'), +('15', '58', '6', '25062', '1833', '0'), +('15', '58', '6', '2331', '1806', '0'), +('15', '58', '17', '2285', '7862', '0'), +('15', '58', '17', '4342', '6825', '0'), +('15', '58', '17', '2405', '3974', '0'), +('15', '58', '17', '2348', '3029', '0'), +('15', '58', '7', '4343', '4222', '0'), +('15', '58', '7', '2289', '2956', '0'), +('15', '58', '7', '2458', '2406', '0'), +('15', '58', '7', '2342', '2316', '0'), +('15', '58', '9', '10149', '3306', '0'), +('15', '58', '9', '2290', '3111', '0'), +('15', '58', '9', '4311', '2658', '0'), +('15', '58', '9', '14650', '2552', '0'), +('15', '58', '15', '10366', '8005', '0'), +('15', '58', '15', '10151', '7200', '0'), +('15', '58', '15', '14679', '6255', '0'), +('15', '58', '15', '14678', '5104', '0'), +('15', '58', '20', '11601', '9993', '0'), +('15', '58', '20', '2742', '6955', '0'), +('15', '58', '20', '1543', '6434', '0'), +('15', '58', '20', '1365', '4200', '0'), +('15', '58', '12', '20655', '7025', '0'), +('15', '58', '12', '2923', '4654', '0'), +('15', '58', '12', '11624', '4057', '0'), +('15', '58', '12', '4345', '3864', '0'), +('15', '58', '18', '2461', '3958', '0'), +('15', '58', '18', '2292', '2862', '0'), +('15', '58', '18', '4410', '2557', '0'), +('15', '58', '18', '4346', '2331', '0'), +('15', '58', '19', '2293', '6404', '0'), +('15', '58', '19', '68239', '5051', '0'), +('15', '58', '19', '4407', '3938', '0'), +('15', '58', '19', '2337', '1757', '0'), +('15', '58', '13', '7257', '14151', '0'), +('15', '58', '13', '6692', '13290', '0'), +('15', '58', '13', '11610', '12687', '0'), +('15', '58', '13', '6691', '11768', '0'), +('15', '58', '14', '7257', '14151', '0'), +('15', '58', '14', '6692', '13290', '0'), +('15', '58', '14', '11551', '12679', '0'), +('15', '58', '14', '6691', '11768', '0'), +('15', '58', '11', '9246', '4107', '0'), +('15', '58', '11', '14762', '3181', '0'), +('15', '58', '11', '20677', '1800', '0'), +('15', '58', '11', '13353', '1500', '0'), +('15', '59', '22', '10323', '0', '0'), +('15', '59', '22', '10664', '0', '0'), +('15', '59', '22', '9246', '0', '0'), +('15', '59', '22', '21509', '0', '0'), +('15', '59', '1', '14701', '5052', '0'), +('15', '59', '1', '14702', '4250', '0'), +('15', '59', '1', '30361', '1890', '0'), +('15', '59', '1', '10165', '1683', '0'), +('15', '59', '2', '2191', '4014', '0'), +('15', '59', '2', '1519', '3207', '0'), +('15', '59', '2', '10142', '3012', '0'), +('15', '59', '2', '2294', '2800', '0'), +('15', '59', '3', '11052', '5345', '0'), +('15', '59', '3', '4505', '3250', '0'), +('15', '59', '3', '14695', '2917', '0'), +('15', '59', '3', '14692', '1667', '0'), +('15', '59', '5', '14703', '8250', '0'), +('15', '59', '5', '4501', '5690', '0'), +('15', '59', '5', '14700', '4953', '0'), +('15', '59', '5', '68291', '4614', '0'), +('15', '59', '8', '11621', '14220', '0'), +('15', '59', '8', '1546', '13933', '0'), +('15', '59', '8', '11603', '9217', '0'), +('15', '59', '8', '1409', '6312', '0'), +('15', '59', '6', '1557', '6760', '0'), +('15', '59', '6', '2286', '3314', '0'), +('15', '59', '6', '25062', '1833', '0'), +('15', '59', '6', '2331', '1824', '0'), +('15', '59', '17', '2285', '7886', '0'), +('15', '59', '17', '4342', '6886', '0'), +('15', '59', '17', '2405', '4017', '0'), +('15', '59', '17', '2348', '3050', '0'), +('15', '59', '7', '4343', '4264', '0'), +('15', '59', '7', '2289', '2980', '0'), +('15', '59', '7', '2458', '2406', '0'), +('15', '59', '7', '2342', '2329', '0'), +('15', '59', '9', '10149', '3324', '0'), +('15', '59', '9', '2290', '3149', '0'), +('15', '59', '9', '4311', '2688', '0'), +('15', '59', '9', '4406', '2567', '0'), +('15', '59', '15', '10366', '8005', '0'), +('15', '59', '15', '10151', '7200', '0'), +('15', '59', '15', '14679', '6255', '0'), +('15', '59', '15', '14678', '5104', '0'), +('15', '59', '20', '11601', '10035', '0'), +('15', '59', '20', '2742', '6997', '0'), +('15', '59', '20', '1543', '6494', '0'), +('15', '59', '20', '1365', '4200', '0'), +('15', '59', '12', '20655', '7046', '0'), +('15', '59', '12', '2923', '4654', '0'), +('15', '59', '12', '11624', '4086', '0'), +('15', '59', '12', '4345', '3894', '0'), +('15', '59', '18', '2461', '3982', '0'), +('15', '59', '18', '2292', '2886', '0'), +('15', '59', '18', '4410', '2557', '0'), +('15', '59', '18', '4346', '2331', '0'), +('15', '59', '19', '2293', '6422', '0'), +('15', '59', '19', '68239', '5069', '0'), +('15', '59', '19', '4407', '3992', '0'), +('15', '59', '19', '2337', '1757', '0'), +('15', '59', '13', '7257', '14151', '0'), +('15', '59', '13', '6692', '13290', '0'), +('15', '59', '13', '11610', '12687', '0'), +('15', '59', '13', '6691', '11768', '0'), +('15', '59', '14', '7257', '14151', '0'), +('15', '59', '14', '6692', '13290', '0'), +('15', '59', '14', '11551', '12679', '0'), +('15', '59', '14', '6691', '11768', '0'), +('15', '59', '11', '9246', '4168', '0'), +('15', '59', '11', '14762', '3181', '0'), +('15', '59', '11', '20677', '1800', '0'), +('15', '59', '11', '13353', '1500', '0'), +('15', '60', '22', '66397', '0', '3'), +('15', '60', '22', '62787', '0', '3'), +('15', '60', '22', '61948', '0', '3'), +('15', '60', '22', '21805', '0', '3'), +('15', '60', '1', '26775', '18886', '3'), +('15', '60', '1', '28962', '17654', '3'), +('15', '60', '1', '29861', '16840', '3'), +('15', '60', '1', '28945', '16338', '3'), +('15', '60', '2', '26759', '18138', '3'), +('15', '60', '2', '28909', '16358', '3'), +('15', '60', '2', '7385', '15980', '3'), +('15', '60', '2', '26581', '15935', '3'), +('15', '60', '3', '26773', '21704', '3'), +('15', '60', '3', '31233', '16387', '3'), +('15', '60', '3', '26756', '16018', '3'), +('15', '60', '3', '7387', '15949', '3'), +('15', '60', '5', '8364', '24555', '3'), +('15', '60', '5', '7868', '18151', '3'), +('15', '60', '5', '26584', '17421', '3'), +('15', '60', '5', '31460', '16359', '3'), +('15', '60', '8', '26766', '24905', '3'), +('15', '60', '8', '31471', '19188', '3'), +('15', '60', '8', '28918', '18775', '3'), +('15', '60', '8', '28959', '17364', '3'), +('15', '60', '6', '28902', '24799', '3'), +('15', '60', '6', '30551', '18125', '3'), +('15', '60', '6', '28919', '17632', '3'), +('15', '60', '6', '26753', '16577', '3'), +('15', '60', '17', '59949', '19671', '3'), +('15', '60', '17', '29456', '19671', '3'), +('15', '60', '17', '28951', '16938', '3'), +('15', '60', '17', '10845', '15915', '3'), +('15', '60', '7', '28926', '18610', '3'), +('15', '60', '7', '7868', '18151', '3'), +('15', '60', '7', '26584', '17421', '3'), +('15', '60', '7', '8288', '16590', '3'), +('15', '60', '9', '31461', '19156', '3'), +('15', '60', '9', '7868', '18151', '3'), +('15', '60', '9', '26584', '17421', '3'), +('15', '60', '9', '31460', '16359', '3'), +('15', '60', '15', '26749', '21201', '3'), +('15', '60', '15', '7870', '16711', '3'), +('15', '60', '15', '31231', '16575', '3'), +('15', '60', '15', '25211', '15874', '3'), +('15', '60', '20', '28890', '21789', '3'), +('15', '60', '20', '28957', '20630', '3'), +('15', '60', '20', '26551', '18789', '3'), +('15', '60', '20', '31235', '18384', '3'), +('15', '60', '12', '25857', '20938', '3'), +('15', '60', '12', '28967', '19063', '3'), +('15', '60', '12', '26774', '17414', '3'), +('15', '60', '12', '31227', '16773', '3'), +('15', '60', '18', '26772', '21658', '3'), +('15', '60', '18', '28965', '18192', '3'), +('15', '60', '18', '28932', '16393', '3'), +('15', '60', '18', '8289', '16324', '3'), +('15', '60', '19', '30569', '24964', '3'), +('15', '60', '19', '28888', '18853', '3'), +('15', '60', '19', '7871', '16405', '3'), +('15', '60', '19', '28934', '15967', '3'), +('15', '60', '13', '27315', '50044', '3'), +('15', '60', '13', '26809', '49899', '3'), +('15', '60', '13', '26861', '47762', '3'), +('15', '60', '13', '26849', '45161', '3'), +('15', '60', '14', '27315', '50044', '3'), +('15', '60', '14', '26809', '49899', '3'), +('15', '60', '14', '26861', '47762', '3'), +('15', '60', '14', '26859', '46473', '3'), +('15', '60', '11', '30562', '17454', '3'), +('15', '60', '11', '28948', '16701', '3'), +('15', '60', '11', '1554', '16661', '3'), +('15', '60', '11', '26563', '16419', '3'), +('15', '60', '22', '9248', '0', '2'), +('15', '60', '22', '12425', '0', '2'), +('15', '60', '22', '30014', '0', '2'), +('15', '60', '22', '10664', '0', '2'), +('15', '60', '1', '2065', '10590', '2'), +('15', '60', '1', '30391', '10420', '2'), +('15', '60', '1', '2748', '8649', '2'), +('15', '60', '1', '62234', '8550', '2'), +('15', '60', '2', '29648', '16359', '2'), +('15', '60', '2', '10913', '14712', '2'), +('15', '60', '2', '25194', '13667', '2'), +('15', '60', '2', '26025', '13488', '2'), +('15', '60', '3', '31233', '18237', '2'), +('15', '60', '3', '31244', '14494', '2'), +('15', '60', '3', '1547', '11733', '2'), +('15', '60', '3', '31328', '8575', '2'), +('15', '60', '5', '31460', '17930', '2'), +('15', '60', '5', '27266', '16322', '2'), +('15', '60', '5', '31318', '13763', '2'), +('15', '60', '5', '31234', '13385', '2'), +('15', '60', '8', '31471', '20553', '2'), +('15', '60', '8', '27261', '13526', '2'), +('15', '60', '8', '11621', '12933', '2'), +('15', '60', '8', '1628', '12646', '2'), +('15', '60', '6', '31472', '14621', '2'), +('15', '60', '6', '5723', '12049', '2'), +('15', '60', '6', '24070', '11472', '2'), +('15', '60', '6', '31240', '10944', '2'), +('15', '60', '17', '59949', '20375', '2'), +('15', '60', '17', '29456', '20375', '2'), +('15', '60', '17', '10845', '17549', '2'), +('15', '60', '17', '5447', '14860', '2'), +('15', '60', '7', '5723', '12049', '2'), +('15', '60', '7', '29485', '9949', '2'), +('15', '60', '7', '5448', '6135', '2'), +('15', '60', '7', '31371', '5449', '2'), +('15', '60', '9', '31461', '21193', '2'), +('15', '60', '9', '31460', '17930', '2'), +('15', '60', '9', '5723', '12049', '2'), +('15', '60', '9', '31354', '11431', '2'), +('15', '60', '15', '31231', '17318', '2'), +('15', '60', '15', '25211', '17102', '2'), +('15', '60', '15', '5727', '11489', '2'), +('15', '60', '15', '30385', '11126', '2'), +('15', '60', '20', '31235', '20209', '2'), +('15', '60', '20', '25858', '18490', '2'), +('15', '60', '20', '31334', '17921', '2'), +('15', '60', '20', '2510', '17580', '2'), +('15', '60', '12', '25857', '22304', '2'), +('15', '60', '12', '31227', '19474', '2'), +('15', '60', '12', '31306', '15154', '2'), +('15', '60', '12', '31402', '10041', '2'), +('15', '60', '18', '5451', '8197', '2'), +('15', '60', '18', '31332', '7148', '2'), +('15', '60', '18', '31386', '6856', '2'), +('15', '60', '18', '5465', '6551', '2'), +('15', '60', '19', '24616', '11715', '2'), +('15', '60', '19', '31327', '7700', '2'), +('15', '60', '19', '2293', '4891', '2'), +('15', '60', '19', '5452', '4874', '2'), +('15', '60', '13', '1154', '45584', '2'), +('15', '60', '13', '7207', '44321', '2'), +('15', '60', '13', '5776', '37604', '2'), +('15', '60', '13', '31241', '37376', '2'), +('15', '60', '14', '1154', '45584', '2'), +('15', '60', '14', '7207', '44321', '2'), +('15', '60', '14', '5776', '37604', '2'), +('15', '60', '14', '31241', '37376', '2'), +('15', '60', '11', '1554', '18005', '2'), +('15', '60', '11', '2698', '13909', '2'), +('15', '60', '11', '31469', '11274', '2'), +('15', '60', '11', '31303', '10999', '2'), +('15', '60', '22', '10323', '0', '1'), +('15', '60', '22', '12425', '0', '1'), +('15', '60', '22', '10664', '0', '1'), +('15', '60', '22', '9246', '0', '1'), +('15', '60', '1', '62234', '10253', '1'), +('15', '60', '1', '10912', '9837', '1'), +('15', '60', '1', '5716', '7477', '1'), +('15', '60', '1', '5715', '5433', '1'), +('15', '60', '2', '10913', '19167', '1'), +('15', '60', '2', '5799', '4889', '1'), +('15', '60', '2', '1630', '3846', '1'), +('15', '60', '2', '1519', '2774', '1'), +('15', '60', '3', '46184', '8410', '1'), +('15', '60', '3', '1625', '5852', '1'), +('15', '60', '3', '5712', '3835', '1'), +('15', '60', '3', '11052', '3209', '1'), +('15', '60', '5', '14703', '8250', '1'), +('15', '60', '5', '8285', '5195', '1'), +('15', '60', '5', '14700', '4767', '1'), +('15', '60', '5', '14709', '4690', '1'), +('15', '60', '8', '1628', '16384', '1'), +('15', '60', '8', '1622', '13737', '1'), +('15', '60', '8', '11621', '13577', '1'), +('15', '60', '8', '5779', '13041', '1'), +('15', '60', '6', '5723', '13297', '1'), +('15', '60', '6', '5706', '7771', '1'), +('15', '60', '6', '1557', '6141', '1'), +('15', '60', '6', '4315', '3767', '1'), +('15', '60', '17', '10845', '21632', '1'), +('15', '60', '17', '5461', '11534', '1'), +('15', '60', '17', '2285', '6636', '1'), +('15', '60', '17', '4342', '4100', '1'), +('15', '60', '7', '5723', '13297', '1'), +('15', '60', '7', '62046', '5918', '1'), +('15', '60', '7', '4343', '2545', '1'), +('15', '60', '7', '2289', '2101', '1'), +('15', '60', '9', '5723', '13297', '1'), +('15', '60', '9', '5794', '2620', '1'), +('15', '60', '9', '10149', '2587', '1'), +('15', '60', '9', '14650', '2428', '1'), +('15', '60', '15', '5727', '12601', '1'), +('15', '60', '15', '5728', '9142', '1'), +('15', '60', '15', '10366', '8003', '1'), +('15', '60', '15', '10151', '7200', '1'), +('15', '60', '20', '1620', '11251', '1'), +('15', '60', '20', '11601', '8492', '1'), +('15', '60', '20', '2742', '5183', '1'), +('15', '60', '20', '1623', '4978', '1'), +('15', '60', '12', '20655', '5524', '1'), +('15', '60', '12', '2923', '4407', '1'), +('15', '60', '12', '11624', '2604', '1'), +('15', '60', '12', '2291', '2496', '1'), +('15', '60', '18', '5465', '8938', '1'), +('15', '60', '18', '2461', '2979', '1'), +('15', '60', '18', '4410', '2124', '1'), +('15', '60', '18', '5781', '2047', '1'), +('15', '60', '19', '24616', '12658', '1'), +('15', '60', '19', '2293', '5666', '1'), +('15', '60', '19', '68239', '4011', '1'), +('15', '60', '19', '4318', '3571', '1'), +('15', '60', '13', '7207', '44321', '1'), +('15', '60', '13', '24609', '28115', '1'), +('15', '60', '13', '5748', '24182', '1'), +('15', '60', '13', '7205', '22029', '1'), +('15', '60', '14', '7207', '44321', '1'), +('15', '60', '14', '24609', '28115', '1'), +('15', '60', '14', '5748', '24182', '1'), +('15', '60', '14', '5722', '20327', '1'), +('15', '60', '11', '46178', '8792', '1'), +('15', '60', '11', '79631', '6673', '1'), +('15', '60', '11', '5803', '5727', '1'), +('15', '60', '11', '7205', '5602', '1'), +('15', '61', '22', '66397', '0', '3'), +('15', '61', '22', '62787', '0', '3'), +('15', '61', '22', '61948', '0', '3'), +('15', '61', '22', '21805', '0', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '61', '1', '26775', '18888', '3'), +('15', '61', '1', '28962', '17655', '3'), +('15', '61', '1', '29861', '16844', '3'), +('15', '61', '1', '28945', '16339', '3'), +('15', '61', '2', '26759', '18138', '3'), +('15', '61', '2', '28909', '16359', '3'), +('15', '61', '2', '7385', '15983', '3'), +('15', '61', '2', '26581', '15936', '3'), +('15', '61', '3', '26773', '21707', '3'), +('15', '61', '3', '31233', '16389', '3'), +('15', '61', '3', '26756', '16019', '3'), +('15', '61', '3', '7387', '15950', '3'), +('15', '61', '5', '8364', '24558', '3'), +('15', '61', '5', '7868', '18153', '3'), +('15', '61', '5', '26584', '17424', '3'), +('15', '61', '5', '31460', '16360', '3'), +('15', '61', '8', '26766', '24908', '3'), +('15', '61', '8', '31471', '19189', '3'), +('15', '61', '8', '28918', '18775', '3'), +('15', '61', '8', '28959', '17364', '3'), +('15', '61', '6', '28902', '24800', '3'), +('15', '61', '6', '30551', '18126', '3'), +('15', '61', '6', '28919', '17633', '3'), +('15', '61', '6', '26753', '16577', '3'), +('15', '61', '17', '59949', '19671', '3'), +('15', '61', '17', '29456', '19671', '3'), +('15', '61', '17', '28951', '16938', '3'), +('15', '61', '17', '10845', '15917', '3'), +('15', '61', '7', '28926', '18611', '3'), +('15', '61', '7', '7868', '18153', '3'), +('15', '61', '7', '26584', '17424', '3'), +('15', '61', '7', '8288', '16590', '3'), +('15', '61', '9', '31461', '19158', '3'), +('15', '61', '9', '7868', '18153', '3'), +('15', '61', '9', '26584', '17424', '3'), +('15', '61', '9', '31460', '16360', '3'), +('15', '61', '15', '26749', '21204', '3'), +('15', '61', '15', '7870', '16712', '3'), +('15', '61', '15', '31231', '16575', '3'), +('15', '61', '15', '25211', '15875', '3'), +('15', '61', '20', '28890', '21789', '3'), +('15', '61', '20', '28957', '20630', '3'), +('15', '61', '20', '26551', '18790', '3'), +('15', '61', '20', '31235', '18386', '3'), +('15', '61', '12', '25857', '20939', '3'), +('15', '61', '12', '28967', '19063', '3'), +('15', '61', '12', '26774', '17415', '3'), +('15', '61', '12', '31227', '16776', '3'), +('15', '61', '18', '26772', '21660', '3'), +('15', '61', '18', '28965', '18194', '3'), +('15', '61', '18', '28932', '16395', '3'), +('15', '61', '18', '8289', '16325', '3'), +('15', '61', '19', '30569', '24965', '3'), +('15', '61', '19', '28888', '18855', '3'), +('15', '61', '19', '7871', '16407', '3'), +('15', '61', '19', '28934', '15967', '3'), +('15', '61', '13', '27315', '50184', '3'), +('15', '61', '13', '26809', '50039', '3'), +('15', '61', '13', '26861', '47900', '3'), +('15', '61', '13', '1154', '45324', '3'), +('15', '61', '14', '27315', '50184', '3'), +('15', '61', '14', '26809', '50039', '3'), +('15', '61', '14', '26861', '47900', '3'), +('15', '61', '14', '26859', '46612', '3'), +('15', '61', '11', '30562', '17455', '3'), +('15', '61', '11', '28948', '16701', '3'), +('15', '61', '11', '1554', '16663', '3'), +('15', '61', '11', '26563', '16420', '3'), +('15', '62', '22', '66397', '0', '3'), +('15', '62', '22', '62787', '0', '3'), +('15', '62', '22', '61948', '0', '3'), +('15', '62', '22', '21805', '0', '3'), +('15', '62', '1', '26775', '18889', '3'), +('15', '62', '1', '28962', '17657', '3'), +('15', '62', '1', '29861', '16848', '3'), +('15', '62', '1', '28945', '16340', '3'), +('15', '62', '2', '26759', '18138', '3'), +('15', '62', '2', '28909', '16360', '3'), +('15', '62', '2', '7385', '15986', '3'), +('15', '62', '2', '26581', '15937', '3'), +('15', '62', '3', '26773', '21709', '3'), +('15', '62', '3', '31233', '16390', '3'), +('15', '62', '3', '26756', '16020', '3'), +('15', '62', '3', '7387', '15951', '3'), +('15', '62', '5', '8364', '24561', '3'), +('15', '62', '5', '7868', '18154', '3'), +('15', '62', '5', '26584', '17426', '3'), +('15', '62', '5', '31460', '16361', '3'), +('15', '62', '8', '26766', '24911', '3'), +('15', '62', '8', '31471', '19190', '3'), +('15', '62', '8', '28918', '18775', '3'), +('15', '62', '8', '28959', '17364', '3'), +('15', '62', '6', '28902', '24801', '3'), +('15', '62', '6', '30551', '18127', '3'), +('15', '62', '6', '28919', '17635', '3'), +('15', '62', '6', '26753', '16577', '3'), +('15', '62', '17', '59949', '19671', '3'), +('15', '62', '17', '29456', '19671', '3'), +('15', '62', '17', '28951', '16938', '3'), +('15', '62', '17', '10845', '15919', '3'), +('15', '62', '7', '28926', '18611', '3'), +('15', '62', '7', '7868', '18154', '3'), +('15', '62', '7', '26584', '17426', '3'), +('15', '62', '7', '8288', '16590', '3'), +('15', '62', '9', '31461', '19159', '3'), +('15', '62', '9', '7868', '18154', '3'), +('15', '62', '9', '26584', '17426', '3'), +('15', '62', '9', '31460', '16361', '3'), +('15', '62', '15', '26749', '21206', '3'), +('15', '62', '15', '7870', '16713', '3'), +('15', '62', '15', '31231', '16575', '3'), +('15', '62', '15', '25211', '15875', '3'), +('15', '62', '20', '28890', '21789', '3'), +('15', '62', '20', '28957', '20630', '3'), +('15', '62', '20', '26551', '18792', '3'), +('15', '62', '20', '31235', '18387', '3'), +('15', '62', '12', '25857', '20940', '3'), +('15', '62', '12', '28967', '19063', '3'), +('15', '62', '12', '26774', '17416', '3'), +('15', '62', '12', '31227', '16778', '3'), +('15', '62', '18', '26772', '21662', '3'), +('15', '62', '18', '28965', '18195', '3'), +('15', '62', '18', '28932', '16398', '3'), +('15', '62', '18', '8289', '16326', '3'), +('15', '62', '19', '30569', '24966', '3'), +('15', '62', '19', '28888', '18856', '3'), +('15', '62', '19', '7871', '16409', '3'), +('15', '62', '19', '28934', '15967', '3'), +('15', '62', '13', '27315', '50324', '3'), +('15', '62', '13', '26809', '50179', '3'), +('15', '62', '13', '26861', '48037', '3'), +('15', '62', '13', '1154', '45577', '3'), +('15', '62', '14', '27315', '50324', '3'), +('15', '62', '14', '26809', '50179', '3'), +('15', '62', '14', '26861', '48037', '3'), +('15', '62', '14', '26859', '46751', '3'), +('15', '62', '11', '30562', '17456', '3'), +('15', '62', '11', '28948', '16701', '3'), +('15', '62', '11', '1554', '16664', '3'), +('15', '62', '11', '26563', '16421', '3'), +('15', '63', '22', '66397', '0', '3'), +('15', '63', '22', '62787', '0', '3'), +('15', '63', '22', '61948', '0', '3'), +('15', '63', '22', '21805', '0', '3'), +('15', '63', '1', '26775', '18890', '3'), +('15', '63', '1', '28962', '17659', '3'), +('15', '63', '1', '29861', '16853', '3'), +('15', '63', '1', '28945', '16341', '3'), +('15', '63', '2', '26759', '18138', '3'), +('15', '63', '2', '28909', '16361', '3'), +('15', '63', '2', '7385', '15988', '3'), +('15', '63', '2', '26581', '15938', '3'), +('15', '63', '3', '26773', '21712', '3'), +('15', '63', '3', '31233', '16392', '3'), +('15', '63', '3', '26756', '16021', '3'), +('15', '63', '3', '7387', '15952', '3'), +('15', '63', '5', '8364', '24563', '3'), +('15', '63', '5', '7868', '18155', '3'), +('15', '63', '5', '26584', '17428', '3'), +('15', '63', '5', '31460', '16362', '3'), +('15', '63', '8', '26766', '24913', '3'), +('15', '63', '8', '31471', '19191', '3'), +('15', '63', '8', '28918', '18775', '3'), +('15', '63', '8', '28959', '17364', '3'), +('15', '63', '6', '28902', '24802', '3'), +('15', '63', '6', '30551', '18128', '3'), +('15', '63', '6', '28919', '17636', '3'), +('15', '63', '6', '26753', '16577', '3'), +('15', '63', '17', '59949', '19671', '3'), +('15', '63', '17', '29456', '19671', '3'), +('15', '63', '17', '28951', '16938', '3'), +('15', '63', '17', '10845', '15921', '3'), +('15', '63', '7', '28926', '18612', '3'), +('15', '63', '7', '7868', '18155', '3'), +('15', '63', '7', '26584', '17428', '3'), +('15', '63', '7', '8288', '16590', '3'), +('15', '63', '9', '31461', '19161', '3'), +('15', '63', '9', '7868', '18155', '3'), +('15', '63', '9', '26584', '17428', '3'), +('15', '63', '9', '31460', '16362', '3'), +('15', '63', '15', '26749', '21209', '3'), +('15', '63', '15', '7870', '16714', '3'), +('15', '63', '15', '31231', '16575', '3'), +('15', '63', '15', '25211', '15876', '3'), +('15', '63', '20', '28890', '21789', '3'), +('15', '63', '20', '28957', '20630', '3'), +('15', '63', '20', '26551', '18793', '3'), +('15', '63', '20', '31235', '18389', '3'), +('15', '63', '12', '25857', '20941', '3'), +('15', '63', '12', '28967', '19063', '3'), +('15', '63', '12', '26774', '17417', '3'), +('15', '63', '12', '31227', '16781', '3'), +('15', '63', '18', '26772', '21663', '3'), +('15', '63', '18', '28965', '18197', '3'), +('15', '63', '18', '28932', '16400', '3'), +('15', '63', '18', '8289', '16327', '3'), +('15', '63', '19', '30569', '24967', '3'), +('15', '63', '19', '28888', '18857', '3'), +('15', '63', '19', '7871', '16412', '3'), +('15', '63', '19', '28934', '15967', '3'), +('15', '63', '13', '27315', '50464', '3'), +('15', '63', '13', '26809', '50319', '3'), +('15', '63', '13', '26861', '48175', '3'), +('15', '63', '13', '7207', '46040', '3'), +('15', '63', '14', '27315', '50464', '3'), +('15', '63', '14', '26809', '50319', '3'), +('15', '63', '14', '26861', '48175', '3'), +('15', '63', '14', '26859', '46890', '3'), +('15', '63', '11', '30562', '17457', '3'), +('15', '63', '11', '28948', '16701', '3'), +('15', '63', '11', '1554', '16666', '3'), +('15', '63', '11', '26563', '16422', '3'), +('15', '64', '22', '66397', '0', '3'), +('15', '64', '22', '62787', '0', '3'), +('15', '64', '22', '61948', '0', '3'), +('15', '64', '22', '21805', '0', '3'), +('15', '64', '1', '26775', '18891', '3'), +('15', '64', '1', '28962', '17660', '3'), +('15', '64', '1', '29861', '16857', '3'), +('15', '64', '1', '28945', '16342', '3'), +('15', '64', '2', '26759', '18138', '3'), +('15', '64', '2', '28909', '16362', '3'), +('15', '64', '2', '7385', '15991', '3'), +('15', '64', '2', '26581', '15939', '3'), +('15', '64', '3', '26773', '21715', '3'), +('15', '64', '3', '31233', '16394', '3'), +('15', '64', '3', '26756', '16023', '3'), +('15', '64', '3', '7387', '15954', '3'), +('15', '64', '5', '8364', '24566', '3'), +('15', '64', '5', '7868', '18157', '3'), +('15', '64', '5', '26584', '17430', '3'), +('15', '64', '5', '31460', '16363', '3'), +('15', '64', '8', '26766', '24916', '3'), +('15', '64', '8', '31471', '19193', '3'), +('15', '64', '8', '28918', '18775', '3'), +('15', '64', '8', '28959', '17364', '3'), +('15', '64', '6', '28902', '24803', '3'), +('15', '64', '6', '30551', '18129', '3'), +('15', '64', '6', '28919', '17638', '3'), +('15', '64', '6', '26753', '16577', '3'), +('15', '64', '17', '59949', '19671', '3'), +('15', '64', '17', '29456', '19671', '3'), +('15', '64', '17', '28951', '16938', '3'), +('15', '64', '17', '10845', '15923', '3'), +('15', '64', '7', '28926', '18613', '3'), +('15', '64', '7', '7868', '18157', '3'), +('15', '64', '7', '26584', '17430', '3'), +('15', '64', '7', '8288', '16590', '3'), +('15', '64', '9', '31461', '19163', '3'), +('15', '64', '9', '7868', '18157', '3'), +('15', '64', '9', '26584', '17430', '3'), +('15', '64', '9', '31460', '16363', '3'), +('15', '64', '15', '26749', '21212', '3'), +('15', '64', '15', '7870', '16715', '3'), +('15', '64', '15', '31231', '16575', '3'), +('15', '64', '15', '25211', '15877', '3'), +('15', '64', '20', '28890', '21789', '3'), +('15', '64', '20', '28957', '20630', '3'), +('15', '64', '20', '26551', '18795', '3'), +('15', '64', '20', '31235', '18391', '3'), +('15', '64', '12', '25857', '20942', '3'), +('15', '64', '12', '28967', '19063', '3'), +('15', '64', '12', '26774', '17419', '3'), +('15', '64', '12', '31227', '16784', '3'), +('15', '64', '18', '26772', '21665', '3'), +('15', '64', '18', '28965', '18199', '3'), +('15', '64', '18', '28932', '16403', '3'), +('15', '64', '18', '8289', '16328', '3'), +('15', '64', '19', '30569', '24968', '3'), +('15', '64', '19', '28888', '18858', '3'), +('15', '64', '19', '7871', '16414', '3'), +('15', '64', '19', '28934', '15967', '3'), +('15', '64', '13', '27315', '50603', '3'), +('15', '64', '13', '26809', '50458', '3'), +('15', '64', '13', '26861', '48312', '3'), +('15', '64', '13', '7207', '46613', '3'), +('15', '64', '14', '27315', '50603', '3'), +('15', '64', '14', '26809', '50458', '3'), +('15', '64', '14', '26861', '48312', '3'), +('15', '64', '14', '26859', '47029', '3'), +('15', '64', '11', '30562', '17458', '3'), +('15', '64', '11', '28948', '16701', '3'), +('15', '64', '11', '1554', '16668', '3'), +('15', '64', '11', '26563', '16422', '3'), +('15', '65', '22', '62787', '0', '7'), +('15', '65', '22', '21810', '0', '7'), +('15', '65', '22', '66397', '0', '7'), +('15', '65', '22', '61948', '0', '7'), +('15', '65', '1', '68949', '49493', '7'), +('15', '65', '1', '69166', '49113', '7'), +('15', '65', '1', '69106', '42396', '7'), +('15', '65', '1', '69062', '41185', '7'), +('15', '65', '2', '69089', '38399', '7'), +('15', '65', '2', '28648', '38000', '7'), +('15', '65', '2', '67730', '34456', '7'), +('15', '65', '2', '68703', '27869', '7'), +('15', '65', '3', '69157', '45694', '7'), +('15', '65', '3', '69069', '41259', '7'), +('15', '65', '3', '69074', '39536', '7'), +('15', '65', '3', '69068', '39125', '7'), +('15', '65', '5', '67625', '48852', '7'), +('15', '65', '5', '69135', '44934', '7'), +('15', '65', '5', '68808', '41325', '7'), +('15', '65', '5', '69097', '40584', '7'), +('15', '65', '8', '69165', '56987', '7'), +('15', '65', '8', '69064', '53421', '7'), +('15', '65', '8', '69072', '49303', '7'), +('15', '65', '8', '69065', '41146', '7'), +('15', '65', '6', '68757', '45814', '7'), +('15', '65', '6', '69130', '45416', '7'), +('15', '65', '6', '69073', '42824', '7'), +('15', '65', '6', '69066', '42132', '7'), +('15', '65', '17', '69152', '51332', '7'), +('15', '65', '17', '68982', '39134', '7'), +('15', '65', '17', '68750', '37854', '7'), +('15', '65', '17', '47652', '33249', '7'), +('15', '65', '7', '69175', '42684', '7'), +('15', '65', '7', '69081', '40144', '7'), +('15', '65', '7', '68906', '37274', '7'), +('15', '65', '7', '16097', '31531', '7'), +('15', '65', '9', '69128', '45788', '7'), +('15', '65', '9', '69099', '41064', '7'), +('15', '65', '9', '32110', '34054', '7'), +('15', '65', '9', '68909', '34037', '7'), +('15', '65', '15', '69160', '46551', '7'), +('15', '65', '15', '69131', '44217', '7'), +('15', '65', '15', '69070', '43694', '7'), +('15', '65', '15', '69061', '41071', '7'), +('15', '65', '20', '69134', '50314', '7'), +('15', '65', '20', '67625', '48852', '7'), +('15', '65', '20', '16156', '46726', '7'), +('15', '65', '20', '68951', '40936', '7'), +('15', '65', '12', '69254', '44951', '7'), +('15', '65', '12', '69085', '38141', '7'), +('15', '65', '12', '68907', '36481', '7'), +('15', '65', '12', '68643', '36124', '7'), +('15', '65', '18', '69148', '49684', '7'), +('15', '65', '18', '68983', '37757', '7'), +('15', '65', '18', '68781', '36914', '7'), +('15', '65', '18', '28652', '33987', '7'), +('15', '65', '19', '69179', '44154', '7'), +('15', '65', '19', '69077', '40387', '7'), +('15', '65', '19', '68908', '34655', '7'), +('15', '65', '19', '68711', '31709', '7'), +('15', '65', '13', '69052', '120934', '7'), +('15', '65', '13', '22998', '94189', '7'), +('15', '65', '13', '69121', '93723', '7'), +('15', '65', '13', '69156', '82274', '7'), +('15', '65', '14', '69052', '120934', '7'), +('15', '65', '14', '22998', '94189', '7'), +('15', '65', '14', '69121', '93723', '7'), +('15', '65', '14', '69156', '82274', '7'), +('15', '65', '11', '67606', '47533', '7'), +('15', '65', '11', '69158', '45541', '7'), +('15', '65', '11', '68952', '44890', '7'), +('15', '65', '11', '69162', '42724', '7'), +('15', '65', '22', '62787', '0', '6'), +('15', '65', '22', '21810', '0', '6'), +('15', '65', '22', '66397', '0', '6'), +('15', '65', '22', '61948', '0', '6'), +('15', '65', '1', '7125', '38238', '6'), +('15', '65', '1', '7123', '35022', '6'), +('15', '65', '1', '32106', '33739', '6'), +('15', '65', '1', '4119', '30187', '6'), +('15', '65', '2', '28648', '38000', '6'), +('15', '65', '2', '28653', '23942', '6'), +('15', '65', '2', '9824', '22713', '6'), +('15', '65', '2', '68122', '20357', '6'), +('15', '65', '3', '9435', '30219', '6'), +('15', '65', '3', '29174', '28878', '6'), +('15', '65', '3', '12592', '26963', '6'), +('15', '65', '3', '9481', '23824', '6'), +('15', '65', '5', '7769', '40032', '6'), +('15', '65', '5', '8977', '33774', '6'), +('15', '65', '5', '28654', '31632', '6'), +('15', '65', '5', '8774', '28027', '6'), +('15', '65', '8', '15805', '35369', '6'), +('15', '65', '8', '15842', '30324', '6'), +('15', '65', '8', '15847', '30074', '6'), +('15', '65', '8', '21998', '28195', '6'), +('15', '65', '6', '13674', '39137', '6'), +('15', '65', '6', '28658', '30037', '6'), +('15', '65', '6', '13673', '29524', '6'), +('15', '65', '6', '19144', '29382', '6'), +('15', '65', '17', '47652', '33249', '6'), +('15', '65', '17', '14943', '28191', '6'), +('15', '65', '17', '69403', '26704', '6'), +('15', '65', '17', '68078', '24664', '6'), +('15', '65', '7', '16097', '31531', '6'), +('15', '65', '7', '21994', '27169', '6'), +('15', '65', '7', '11450', '25553', '6'), +('15', '65', '7', '27648', '21461', '6'), +('15', '65', '9', '32110', '34054', '6'), +('15', '65', '9', '16097', '31531', '6'), +('15', '65', '9', '28667', '30213', '6'), +('15', '65', '9', '11054', '29917', '6'), +('15', '65', '15', '26989', '34769', '6'), +('15', '65', '15', '10948', '30539', '6'), +('15', '65', '15', '26993', '30249', '6'), +('15', '65', '15', '9959', '30243', '6'), +('15', '65', '20', '16156', '46726', '6'), +('15', '65', '20', '16097', '31531', '6'), +('15', '65', '20', '28663', '30929', '6'), +('15', '65', '20', '15927', '30212', '6'), +('15', '65', '12', '27000', '32655', '6'), +('15', '65', '12', '13553', '25782', '6'), +('15', '65', '12', '62469', '21944', '6'), +('15', '65', '12', '25857', '20943', '6'), +('15', '65', '18', '28652', '33987', '6'), +('15', '65', '18', '16787', '29109', '6'), +('15', '65', '18', '16605', '22992', '6'), +('15', '65', '18', '26772', '21667', '6'), +('15', '65', '19', '19094', '29861', '6'), +('15', '65', '19', '26986', '28134', '6'), +('15', '65', '19', '30569', '24968', '6'), +('15', '65', '19', '20032', '24591', '6'), +('15', '65', '13', '22998', '94189', '6'), +('15', '65', '13', '22894', '65426', '6'), +('15', '65', '13', '26737', '61905', '6'), +('15', '65', '13', '26740', '61075', '6'), +('15', '65', '14', '22998', '94189', '6'), +('15', '65', '14', '22894', '65426', '6'), +('15', '65', '14', '26737', '61905', '6'), +('15', '65', '14', '26740', '61075', '6'), +('15', '65', '11', '26987', '39202', '6'), +('15', '65', '11', '20496', '36687', '6'), +('15', '65', '11', '20625', '30274', '6'), +('15', '65', '11', '9574', '29741', '6'), +('15', '65', '22', '62787', '0', '5'), +('15', '65', '22', '21810', '0', '5'), +('15', '65', '22', '66397', '0', '5'), +('15', '65', '22', '61948', '0', '5'), +('15', '65', '1', '7125', '38238', '5'), +('15', '65', '1', '7123', '35022', '5'), +('15', '65', '1', '32106', '33739', '5'), +('15', '65', '1', '4119', '30187', '5'), +('15', '65', '2', '28648', '38000', '5'), +('15', '65', '2', '28653', '23942', '5'), +('15', '65', '2', '9824', '22713', '5'), +('15', '65', '2', '9586', '18627', '5'), +('15', '65', '3', '9435', '30219', '5'), +('15', '65', '3', '29174', '28878', '5'), +('15', '65', '3', '12592', '26963', '5'), +('15', '65', '3', '9481', '23824', '5'), +('15', '65', '5', '7769', '40032', '5'), +('15', '65', '5', '8977', '33774', '5'), +('15', '65', '5', '28654', '31632', '5'), +('15', '65', '5', '8774', '28027', '5'), +('15', '65', '8', '15805', '35369', '5'), +('15', '65', '8', '15842', '30324', '5'), +('15', '65', '8', '15847', '30074', '5'), +('15', '65', '8', '21998', '28195', '5'), +('15', '65', '6', '13674', '39137', '5'), +('15', '65', '6', '28658', '30037', '5'), +('15', '65', '6', '13673', '29524', '5'), +('15', '65', '6', '19144', '29382', '5'), +('15', '65', '17', '47652', '33249', '5'), +('15', '65', '17', '14943', '28191', '5'), +('15', '65', '17', '29456', '19671', '5'), +('15', '65', '17', '59949', '19671', '5'), +('15', '65', '7', '16097', '31531', '5'), +('15', '65', '7', '21994', '27169', '5'), +('15', '65', '7', '11450', '25553', '5'), +('15', '65', '7', '27648', '21461', '5'), +('15', '65', '9', '32110', '34054', '5'), +('15', '65', '9', '16097', '31531', '5'), +('15', '65', '9', '28667', '30213', '5'), +('15', '65', '9', '11054', '29917', '5'), +('15', '65', '15', '26989', '34769', '5'), +('15', '65', '15', '10948', '30539', '5'), +('15', '65', '15', '26993', '30249', '5'), +('15', '65', '15', '9959', '30243', '5'), +('15', '65', '20', '16156', '46726', '5'), +('15', '65', '20', '16097', '31531', '5'), +('15', '65', '20', '28663', '30929', '5'), +('15', '65', '20', '15927', '30212', '5'), +('15', '65', '12', '27000', '32655', '5'), +('15', '65', '12', '13553', '25782', '5'), +('15', '65', '12', '25857', '20943', '5'), +('15', '65', '12', '11879', '19376', '5'), +('15', '65', '18', '28652', '33987', '5'), +('15', '65', '18', '16787', '29109', '5'), +('15', '65', '18', '16605', '22992', '5'), +('15', '65', '18', '26772', '21667', '5'), +('15', '65', '19', '19094', '29861', '5'), +('15', '65', '19', '26986', '28134', '5'), +('15', '65', '19', '30569', '24968', '5'), +('15', '65', '19', '20032', '24591', '5'), +('15', '65', '13', '22998', '94189', '5'), +('15', '65', '13', '22894', '65426', '5'), +('15', '65', '13', '26737', '61905', '5'), +('15', '65', '13', '26740', '61075', '5'), +('15', '65', '14', '22998', '94189', '5'), +('15', '65', '14', '22894', '65426', '5'), +('15', '65', '14', '26737', '61905', '5'), +('15', '65', '14', '26740', '61075', '5'), +('15', '65', '11', '26987', '39202', '5'), +('15', '65', '11', '20496', '36687', '5'), +('15', '65', '11', '20625', '30274', '5'), +('15', '65', '11', '9574', '29741', '5'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '65', '22', '62787', '0', '4'), +('15', '65', '22', '21810', '0', '4'), +('15', '65', '22', '66397', '0', '4'), +('15', '65', '22', '61948', '0', '4'), +('15', '65', '1', '7125', '38238', '4'), +('15', '65', '1', '7123', '35022', '4'), +('15', '65', '1', '32106', '33739', '4'), +('15', '65', '1', '4119', '30187', '4'), +('15', '65', '2', '28648', '38000', '4'), +('15', '65', '2', '28653', '23942', '4'), +('15', '65', '2', '9824', '22713', '4'), +('15', '65', '2', '9586', '18627', '4'), +('15', '65', '3', '9435', '30219', '4'), +('15', '65', '3', '29174', '28878', '4'), +('15', '65', '3', '12592', '26963', '4'), +('15', '65', '3', '9481', '23824', '4'), +('15', '65', '5', '7769', '40032', '4'), +('15', '65', '5', '8977', '33774', '4'), +('15', '65', '5', '28654', '31632', '4'), +('15', '65', '5', '8774', '28027', '4'), +('15', '65', '8', '15805', '35369', '4'), +('15', '65', '8', '15842', '30324', '4'), +('15', '65', '8', '15847', '30074', '4'), +('15', '65', '8', '21998', '28195', '4'), +('15', '65', '6', '13674', '39137', '4'), +('15', '65', '6', '28658', '30037', '4'), +('15', '65', '6', '13673', '29524', '4'), +('15', '65', '6', '19144', '29382', '4'), +('15', '65', '17', '47652', '33249', '4'), +('15', '65', '17', '14943', '28191', '4'), +('15', '65', '17', '29456', '19671', '4'), +('15', '65', '17', '59949', '19671', '4'), +('15', '65', '7', '16097', '31531', '4'), +('15', '65', '7', '21994', '27169', '4'), +('15', '65', '7', '11450', '25553', '4'), +('15', '65', '7', '27648', '21461', '4'), +('15', '65', '9', '32110', '34054', '4'), +('15', '65', '9', '16097', '31531', '4'), +('15', '65', '9', '28667', '30213', '4'), +('15', '65', '9', '11054', '29917', '4'), +('15', '65', '15', '26989', '34769', '4'), +('15', '65', '15', '10948', '30539', '4'), +('15', '65', '15', '26993', '30249', '4'), +('15', '65', '15', '9959', '30243', '4'), +('15', '65', '20', '16156', '46726', '4'), +('15', '65', '20', '16097', '31531', '4'), +('15', '65', '20', '28663', '30929', '4'), +('15', '65', '20', '15927', '30212', '4'), +('15', '65', '12', '27000', '32655', '4'), +('15', '65', '12', '13553', '25782', '4'), +('15', '65', '12', '25857', '20943', '4'), +('15', '65', '12', '11879', '19376', '4'), +('15', '65', '18', '28652', '33987', '4'), +('15', '65', '18', '16787', '29109', '4'), +('15', '65', '18', '16605', '22992', '4'), +('15', '65', '18', '26772', '21667', '4'), +('15', '65', '19', '19094', '29861', '4'), +('15', '65', '19', '26986', '28134', '4'), +('15', '65', '19', '30569', '24968', '4'), +('15', '65', '19', '20032', '24591', '4'), +('15', '65', '13', '22998', '94189', '4'), +('15', '65', '13', '22894', '65426', '4'), +('15', '65', '13', '26737', '61905', '4'), +('15', '65', '13', '26740', '61075', '4'), +('15', '65', '14', '22998', '94189', '4'), +('15', '65', '14', '22894', '65426', '4'), +('15', '65', '14', '26737', '61905', '4'), +('15', '65', '14', '26740', '61075', '4'), +('15', '65', '11', '26987', '39202', '4'), +('15', '65', '11', '20496', '36687', '4'), +('15', '65', '11', '20625', '30274', '4'), +('15', '65', '11', '9574', '29741', '4'), +('15', '66', '22', '62787', '0', '7'), +('15', '66', '22', '21810', '0', '7'), +('15', '66', '22', '66397', '0', '7'), +('15', '66', '22', '61948', '0', '7'), +('15', '66', '1', '68949', '49498', '7'), +('15', '66', '1', '69166', '49117', '7'), +('15', '66', '1', '69106', '42400', '7'), +('15', '66', '1', '69062', '41188', '7'), +('15', '66', '2', '69089', '38402', '7'), +('15', '66', '2', '28648', '38002', '7'), +('15', '66', '2', '67730', '34459', '7'), +('15', '66', '2', '68703', '27872', '7'), +('15', '66', '3', '69157', '45698', '7'), +('15', '66', '3', '69069', '41262', '7'), +('15', '66', '3', '69074', '39540', '7'), +('15', '66', '3', '69068', '39129', '7'), +('15', '66', '5', '67625', '48856', '7'), +('15', '66', '5', '69135', '44939', '7'), +('15', '66', '5', '68808', '41328', '7'), +('15', '66', '5', '69097', '40588', '7'), +('15', '66', '8', '69165', '56991', '7'), +('15', '66', '8', '69064', '53425', '7'), +('15', '66', '8', '69072', '49307', '7'), +('15', '66', '8', '69065', '41149', '7'), +('15', '66', '6', '68757', '45817', '7'), +('15', '66', '6', '69130', '45418', '7'), +('15', '66', '6', '69073', '42827', '7'), +('15', '66', '6', '69066', '42135', '7'), +('15', '66', '17', '69152', '51336', '7'), +('15', '66', '17', '68982', '39138', '7'), +('15', '66', '17', '68750', '37858', '7'), +('15', '66', '17', '47652', '33253', '7'), +('15', '66', '7', '69175', '42688', '7'), +('15', '66', '7', '69081', '40147', '7'), +('15', '66', '7', '68906', '37278', '7'), +('15', '66', '7', '16097', '31535', '7'), +('15', '66', '9', '69128', '45791', '7'), +('15', '66', '9', '69099', '41066', '7'), +('15', '66', '9', '32110', '34057', '7'), +('15', '66', '9', '68909', '34040', '7'), +('15', '66', '15', '69160', '46553', '7'), +('15', '66', '15', '69131', '44220', '7'), +('15', '66', '15', '69070', '43697', '7'), +('15', '66', '15', '69061', '41075', '7'), +('15', '66', '20', '69134', '50318', '7'), +('15', '66', '20', '67625', '48856', '7'), +('15', '66', '20', '16156', '46730', '7'), +('15', '66', '20', '68951', '40940', '7'), +('15', '66', '12', '69254', '44955', '7'), +('15', '66', '12', '69085', '38143', '7'), +('15', '66', '12', '68907', '36484', '7'), +('15', '66', '12', '68643', '36126', '7'), +('15', '66', '18', '69148', '49687', '7'), +('15', '66', '18', '68983', '37760', '7'), +('15', '66', '18', '68781', '36918', '7'), +('15', '66', '18', '28652', '33989', '7'), +('15', '66', '19', '69179', '44158', '7'), +('15', '66', '19', '69077', '40391', '7'), +('15', '66', '19', '68908', '34658', '7'), +('15', '66', '19', '68711', '31712', '7'), +('15', '66', '13', '69052', '121623', '7'), +('15', '66', '13', '22998', '94775', '7'), +('15', '66', '13', '69121', '93863', '7'), +('15', '66', '13', '69156', '82276', '7'), +('15', '66', '14', '69052', '121623', '7'), +('15', '66', '14', '22998', '94775', '7'), +('15', '66', '14', '69121', '93863', '7'), +('15', '66', '14', '69156', '82276', '7'), +('15', '66', '11', '67606', '47537', '7'), +('15', '66', '11', '69158', '45545', '7'), +('15', '66', '11', '68952', '44894', '7'), +('15', '66', '11', '69162', '42729', '7'), +('15', '67', '22', '62787', '0', '7'), +('15', '67', '22', '21810', '0', '7'), +('15', '67', '22', '66397', '0', '7'), +('15', '67', '22', '61948', '0', '7'), +('15', '67', '1', '68949', '49502', '7'), +('15', '67', '1', '69166', '49120', '7'), +('15', '67', '1', '69106', '42404', '7'), +('15', '67', '1', '69062', '41191', '7'), +('15', '67', '2', '69089', '38406', '7'), +('15', '67', '2', '28648', '38004', '7'), +('15', '67', '2', '67730', '34463', '7'), +('15', '67', '2', '68703', '27875', '7'), +('15', '67', '3', '69157', '45701', '7'), +('15', '67', '3', '69069', '41264', '7'), +('15', '67', '3', '69074', '39543', '7'), +('15', '67', '3', '69068', '39133', '7'), +('15', '67', '5', '67625', '48860', '7'), +('15', '67', '5', '69135', '44943', '7'), +('15', '67', '5', '68808', '41332', '7'), +('15', '67', '5', '69097', '40592', '7'), +('15', '67', '8', '69165', '56995', '7'), +('15', '67', '8', '69064', '53428', '7'), +('15', '67', '8', '69072', '49311', '7'), +('15', '67', '8', '69065', '41152', '7'), +('15', '67', '6', '68757', '45820', '7'), +('15', '67', '6', '69130', '45419', '7'), +('15', '67', '6', '69073', '42829', '7'), +('15', '67', '6', '69066', '42138', '7'), +('15', '67', '17', '69152', '51340', '7'), +('15', '67', '17', '68982', '39142', '7'), +('15', '67', '17', '68750', '37861', '7'), +('15', '67', '17', '47652', '33258', '7'), +('15', '67', '7', '69175', '42691', '7'), +('15', '67', '7', '69081', '40151', '7'), +('15', '67', '7', '68906', '37282', '7'), +('15', '67', '7', '16097', '31538', '7'), +('15', '67', '9', '69128', '45794', '7'), +('15', '67', '9', '69099', '41069', '7'), +('15', '67', '9', '32110', '34060', '7'), +('15', '67', '9', '68909', '34042', '7'), +('15', '67', '15', '69160', '46555', '7'), +('15', '67', '15', '69131', '44222', '7'), +('15', '67', '15', '69070', '43700', '7'), +('15', '67', '15', '69061', '41079', '7'), +('15', '67', '20', '69134', '50322', '7'), +('15', '67', '20', '67625', '48860', '7'), +('15', '67', '20', '16156', '46733', '7'), +('15', '67', '20', '68951', '40944', '7'), +('15', '67', '12', '69254', '44958', '7'), +('15', '67', '12', '69085', '38146', '7'), +('15', '67', '12', '68907', '36487', '7'), +('15', '67', '12', '68643', '36129', '7'), +('15', '67', '18', '69148', '49691', '7'), +('15', '67', '18', '68983', '37764', '7'), +('15', '67', '18', '68781', '36922', '7'), +('15', '67', '18', '28652', '33992', '7'), +('15', '67', '19', '69179', '44162', '7'), +('15', '67', '19', '69077', '40394', '7'), +('15', '67', '19', '68908', '34662', '7'), +('15', '67', '19', '68711', '31714', '7'), +('15', '67', '13', '69052', '122312', '7'), +('15', '67', '13', '22998', '95361', '7'), +('15', '67', '13', '69121', '94003', '7'), +('15', '67', '13', '69156', '82277', '7'), +('15', '67', '14', '69052', '122312', '7'), +('15', '67', '14', '22998', '95361', '7'), +('15', '67', '14', '69121', '94003', '7'), +('15', '67', '14', '69156', '82277', '7'), +('15', '67', '11', '67606', '47541', '7'), +('15', '67', '11', '69158', '45548', '7'), +('15', '67', '11', '68952', '44897', '7'), +('15', '67', '11', '69162', '42735', '7'), +('15', '68', '22', '62787', '0', '7'), +('15', '68', '22', '21810', '0', '7'), +('15', '68', '22', '66397', '0', '7'), +('15', '68', '22', '61948', '0', '7'), +('15', '68', '1', '68949', '49507', '7'), +('15', '68', '1', '69166', '49124', '7'), +('15', '68', '1', '69106', '42408', '7'), +('15', '68', '1', '69062', '41194', '7'), +('15', '68', '2', '69089', '38409', '7'), +('15', '68', '2', '28648', '38006', '7'), +('15', '68', '2', '67730', '34467', '7'), +('15', '68', '2', '68703', '27878', '7'), +('15', '68', '3', '69157', '45705', '7'), +('15', '68', '3', '69069', '41267', '7'), +('15', '68', '3', '69074', '39546', '7'), +('15', '68', '3', '69068', '39137', '7'), +('15', '68', '5', '67625', '48863', '7'), +('15', '68', '5', '69135', '44947', '7'), +('15', '68', '5', '68808', '41336', '7'), +('15', '68', '5', '69097', '40597', '7'), +('15', '68', '8', '69165', '56998', '7'), +('15', '68', '8', '69064', '53432', '7'), +('15', '68', '8', '69072', '49314', '7'), +('15', '68', '8', '69065', '41155', '7'), +('15', '68', '6', '68757', '45823', '7'), +('15', '68', '6', '69130', '45421', '7'), +('15', '68', '6', '69073', '42832', '7'), +('15', '68', '6', '69066', '42141', '7'), +('15', '68', '17', '69152', '51345', '7'), +('15', '68', '17', '68982', '39145', '7'), +('15', '68', '17', '68750', '37865', '7'), +('15', '68', '17', '47652', '33262', '7'), +('15', '68', '7', '69175', '42695', '7'), +('15', '68', '7', '69081', '40154', '7'), +('15', '68', '7', '68906', '37286', '7'), +('15', '68', '7', '16097', '31542', '7'), +('15', '68', '9', '69128', '45798', '7'), +('15', '68', '9', '69099', '41072', '7'), +('15', '68', '9', '32110', '34063', '7'), +('15', '68', '9', '68909', '34045', '7'), +('15', '68', '15', '69160', '46556', '7'), +('15', '68', '15', '69131', '44225', '7'), +('15', '68', '15', '69070', '43703', '7'), +('15', '68', '15', '69061', '41083', '7'), +('15', '68', '20', '69134', '50326', '7'), +('15', '68', '20', '67625', '48863', '7'), +('15', '68', '20', '16156', '46737', '7'), +('15', '68', '20', '68951', '40948', '7'), +('15', '68', '12', '69254', '44962', '7'), +('15', '68', '12', '69085', '38148', '7'), +('15', '68', '12', '68907', '36489', '7'), +('15', '68', '12', '68643', '36132', '7'), +('15', '68', '18', '69148', '49695', '7'), +('15', '68', '18', '68983', '37767', '7'), +('15', '68', '18', '68781', '36926', '7'), +('15', '68', '18', '28652', '33995', '7'), +('15', '68', '19', '69179', '44166', '7'), +('15', '68', '19', '69077', '40398', '7'), +('15', '68', '19', '68908', '34665', '7'), +('15', '68', '19', '68711', '31717', '7'), +('15', '68', '13', '69052', '123001', '7'), +('15', '68', '13', '22998', '95947', '7'), +('15', '68', '13', '69121', '94143', '7'), +('15', '68', '13', '69156', '82279', '7'), +('15', '68', '14', '69052', '123001', '7'), +('15', '68', '14', '22998', '95947', '7'), +('15', '68', '14', '69121', '94143', '7'), +('15', '68', '14', '69156', '82279', '7'), +('15', '68', '11', '67606', '47544', '7'), +('15', '68', '11', '69158', '45552', '7'), +('15', '68', '11', '68952', '44901', '7'), +('15', '68', '11', '69162', '42740', '7'), +('15', '69', '22', '62787', '0', '7'), +('15', '69', '22', '21810', '0', '7'), +('15', '69', '22', '66397', '0', '7'), +('15', '69', '22', '61948', '0', '7'), +('15', '69', '1', '68949', '49511', '7'), +('15', '69', '1', '69166', '49127', '7'), +('15', '69', '1', '69106', '42412', '7'), +('15', '69', '1', '69062', '41197', '7'), +('15', '69', '2', '69089', '38412', '7'), +('15', '69', '2', '28648', '38008', '7'), +('15', '69', '2', '67730', '34470', '7'), +('15', '69', '2', '68703', '27880', '7'), +('15', '69', '3', '69157', '45708', '7'), +('15', '69', '3', '69069', '41269', '7'), +('15', '69', '3', '69074', '39549', '7'), +('15', '69', '3', '69068', '39141', '7'), +('15', '69', '5', '67625', '48867', '7'), +('15', '69', '5', '69135', '44951', '7'), +('15', '69', '5', '68808', '41339', '7'), +('15', '69', '5', '69097', '40600', '7'), +('15', '69', '8', '69165', '57002', '7'), +('15', '69', '8', '69064', '53436', '7'), +('15', '69', '8', '69072', '49318', '7'), +('15', '69', '8', '69065', '41158', '7'), +('15', '69', '6', '68757', '45826', '7'), +('15', '69', '6', '69130', '45422', '7'), +('15', '69', '6', '69073', '42834', '7'), +('15', '69', '6', '69066', '42144', '7'), +('15', '69', '17', '69152', '51348', '7'), +('15', '69', '17', '68982', '39149', '7'), +('15', '69', '17', '68750', '37868', '7'), +('15', '69', '17', '47652', '33267', '7'), +('15', '69', '7', '69175', '42698', '7'), +('15', '69', '7', '69081', '40157', '7'), +('15', '69', '7', '68906', '37290', '7'), +('15', '69', '7', '16097', '31545', '7'), +('15', '69', '9', '69128', '45800', '7'), +('15', '69', '9', '69099', '41074', '7'), +('15', '69', '9', '32110', '34066', '7'), +('15', '69', '9', '68909', '34047', '7'), +('15', '69', '15', '69160', '46558', '7'), +('15', '69', '15', '69131', '44227', '7'), +('15', '69', '15', '69070', '43706', '7'), +('15', '69', '15', '69061', '41086', '7'), +('15', '69', '20', '69134', '50330', '7'), +('15', '69', '20', '67625', '48867', '7'), +('15', '69', '20', '16156', '46740', '7'), +('15', '69', '20', '68951', '40952', '7'), +('15', '69', '12', '69254', '44965', '7'), +('15', '69', '12', '69085', '38151', '7'), +('15', '69', '12', '68907', '36492', '7'), +('15', '69', '12', '68643', '36134', '7'), +('15', '69', '18', '69148', '49698', '7'), +('15', '69', '18', '68983', '37770', '7'), +('15', '69', '18', '68781', '36929', '7'), +('15', '69', '18', '28652', '33997', '7'), +('15', '69', '19', '69179', '44170', '7'), +('15', '69', '19', '69077', '40401', '7'), +('15', '69', '19', '68908', '34669', '7'), +('15', '69', '19', '68711', '31719', '7'), +('15', '69', '13', '69052', '123690', '7'), +('15', '69', '13', '22998', '96533', '7'), +('15', '69', '13', '69121', '94283', '7'), +('15', '69', '13', '69156', '82280', '7'), +('15', '69', '14', '69052', '123690', '7'), +('15', '69', '14', '22998', '96533', '7'), +('15', '69', '14', '69121', '94283', '7'), +('15', '69', '14', '69156', '82280', '7'), +('15', '69', '11', '67606', '47548', '7'), +('15', '69', '11', '69158', '45555', '7'), +('15', '69', '11', '68952', '44904', '7'), +('15', '69', '11', '69162', '42745', '7'), +('15', '70', '22', '66397', '0', '11'), +('15', '70', '22', '62787', '0', '11'), +('15', '70', '22', '61948', '0', '11'), +('15', '70', '22', '21805', '0', '11'), +('15', '70', '1', '39276', '66835', '11'), +('15', '70', '1', '83594', '65687', '11'), +('15', '70', '1', '39343', '60860', '11'), +('15', '70', '1', '51705', '59006', '11'), +('15', '70', '2', '70951', '61306', '11'), +('15', '70', '2', '83562', '57868', '11'), +('15', '70', '2', '83542', '49350', '11'), +('15', '70', '2', '47210', '44700', '11'), +('15', '70', '3', '39368', '66170', '11'), +('15', '70', '3', '39361', '63998', '11'), +('15', '70', '3', '83658', '60879', '11'), +('15', '70', '3', '39338', '60201', '11'), +('15', '70', '5', '39349', '69895', '11'), +('15', '70', '5', '39366', '66444', '11'), +('15', '70', '5', '39340', '59664', '11'), +('15', '70', '5', '39262', '58982', '11'), +('15', '70', '8', '39330', '65765', '11'), +('15', '70', '8', '83659', '61532', '11'), +('15', '70', '8', '39286', '59932', '11'), +('15', '70', '8', '39352', '59828', '11'), +('15', '70', '6', '39367', '69871', '11'), +('15', '70', '6', '83660', '60585', '11'), +('15', '70', '6', '39348', '60064', '11'), +('15', '70', '6', '39362', '59894', '11'), +('15', '70', '17', '70956', '114948', '11'), +('15', '70', '17', '83605', '74345', '11'), +('15', '70', '17', '69152', '51353', '11'), +('15', '70', '17', '70702', '49099', '11'), +('15', '70', '7', '39357', '62731', '11'), +('15', '70', '7', '83566', '57963', '11'), +('15', '70', '7', '70952', '51791', '11'), +('15', '70', '7', '39220', '50458', '11'), +('15', '70', '9', '39346', '63844', '11'), +('15', '70', '9', '51708', '61398', '11'), +('15', '70', '9', '83654', '60662', '11'), +('15', '70', '9', '39297', '58674', '11'), +('15', '70', '15', '39374', '70205', '11'), +('15', '70', '15', '51703', '59671', '11'), +('15', '70', '15', '83661', '59316', '11'), +('15', '70', '15', '39321', '57675', '11'), +('15', '70', '20', '39339', '64623', '11'), +('15', '70', '20', '39360', '60401', '11'), +('15', '70', '20', '39350', '59817', '11'), +('15', '70', '20', '83650', '59237', '11'), +('15', '70', '12', '83570', '54292', '11'), +('15', '70', '12', '47214', '52416', '11'), +('15', '70', '12', '70954', '49381', '11'), +('15', '70', '12', '83496', '47202', '11'), +('15', '70', '18', '83609', '64090', '11'), +('15', '70', '18', '70957', '57193', '11'), +('15', '70', '18', '69148', '49702', '11'), +('15', '70', '18', '83134', '48708', '11'), +('15', '70', '19', '39279', '57322', '11'), +('15', '70', '19', '83574', '56916', '11'), +('15', '70', '19', '70955', '51618', '11'), +('15', '70', '19', '83504', '46990', '11'), +('15', '70', '13', '83639', '160756', '11'), +('15', '70', '13', '69052', '129192', '11'), +('15', '70', '13', '39323', '120188', '11'), +('15', '70', '13', '83580', '117630', '11'), +('15', '70', '14', '83639', '160756', '11'), +('15', '70', '14', '69052', '129192', '11'), +('15', '70', '14', '39323', '120188', '11'), +('15', '70', '14', '83580', '117630', '11'), +('15', '70', '11', '39371', '69938', '11'), +('15', '70', '11', '39311', '66801', '11'), +('15', '70', '11', '83657', '63654', '11'), +('15', '70', '11', '83665', '58545', '11'), +('15', '70', '22', '62787', '0', '10'), +('15', '70', '22', '21810', '0', '10'), +('15', '70', '22', '66397', '0', '10'), +('15', '70', '22', '61948', '0', '10'), +('15', '70', '1', '83594', '65687', '10'), +('15', '70', '1', '83630', '58521', '10'), +('15', '70', '1', '83627', '56053', '10'), +('15', '70', '1', '47287', '53971', '10'), +('15', '70', '2', '70951', '61306', '10'), +('15', '70', '2', '83562', '57868', '10'), +('15', '70', '2', '83542', '49350', '10'), +('15', '70', '2', '47210', '44700', '10'), +('15', '70', '3', '83658', '60879', '10'), +('15', '70', '3', '83636', '58674', '10'), +('15', '70', '3', '89512', '55675', '10'), +('15', '70', '3', '83601', '54514', '10'), +('15', '70', '5', '70985', '56870', '10'), +('15', '70', '5', '83651', '56301', '10'), +('15', '70', '5', '83599', '55826', '10'), +('15', '70', '5', '47275', '54177', '10'), +('15', '70', '8', '83659', '61532', '10'), +('15', '70', '8', '83637', '58692', '10'), +('15', '70', '8', '69165', '57005', '10'), +('15', '70', '8', '83598', '53954', '10'), +('15', '70', '6', '83660', '60585', '10'), +('15', '70', '6', '83635', '55676', '10'), +('15', '70', '6', '70717', '55452', '10'), +('15', '70', '6', '83530', '53937', '10'), +('15', '70', '17', '70956', '114948', '10'), +('15', '70', '17', '83605', '74345', '10'), +('15', '70', '17', '69152', '51353', '10'), +('15', '70', '17', '70702', '49099', '10'), +('15', '70', '7', '83566', '57963', '10'), +('15', '70', '7', '70952', '51791', '10'), +('15', '70', '7', '83552', '49006', '10'), +('15', '70', '7', '47206', '46445', '10'), +('15', '70', '9', '83654', '60662', '10'), +('15', '70', '9', '70953', '50427', '10'), +('15', '70', '9', '83463', '47749', '10'), +('15', '70', '9', '47222', '46094', '10'), +('15', '70', '15', '83661', '59316', '10'), +('15', '70', '15', '83629', '55400', '10'), +('15', '70', '15', '83592', '55013', '10'), +('15', '70', '15', '83595', '54089', '10'), +('15', '70', '20', '83650', '59237', '10'), +('15', '70', '20', '83611', '57978', '10'), +('15', '70', '20', '47283', '57735', '10'), +('15', '70', '20', '83591', '53826', '10'), +('15', '70', '12', '83570', '54292', '10'), +('15', '70', '12', '47214', '52416', '10'), +('15', '70', '12', '70954', '49381', '10'), +('15', '70', '12', '83496', '47202', '10'), +('15', '70', '18', '83609', '64090', '10'), +('15', '70', '18', '70957', '57193', '10'), +('15', '70', '18', '69148', '49702', '10'), +('15', '70', '18', '83134', '48708', '10'), +('15', '70', '19', '83574', '56916', '10'), +('15', '70', '19', '70955', '51618', '10'), +('15', '70', '19', '83504', '46990', '10'), +('15', '70', '19', '70712', '45698', '10'), +('15', '70', '13', '83639', '160756', '10'), +('15', '70', '13', '69052', '129192', '10'), +('15', '70', '13', '83580', '117630', '10'), +('15', '70', '13', '47314', '117466', '10'), +('15', '70', '14', '83639', '160756', '10'), +('15', '70', '14', '69052', '129192', '10'), +('15', '70', '14', '83580', '117630', '10'), +('15', '70', '14', '47314', '117466', '10'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '70', '11', '83657', '63654', '10'), +('15', '70', '11', '83665', '58545', '10'), +('15', '70', '11', '83590', '56929', '10'), +('15', '70', '11', '83666', '56300', '10'), +('15', '70', '22', '62787', '0', '9'), +('15', '70', '22', '21810', '0', '9'), +('15', '70', '22', '66397', '0', '9'), +('15', '70', '22', '61948', '0', '9'), +('15', '70', '1', '47287', '53971', '9'), +('15', '70', '1', '71668', '52912', '9'), +('15', '70', '1', '71624', '52493', '9'), +('15', '70', '1', '47289', '51303', '9'), +('15', '70', '2', '70951', '61306', '9'), +('15', '70', '2', '47210', '44700', '9'), +('15', '70', '2', '69089', '38415', '9'), +('15', '70', '2', '28648', '38010', '9'), +('15', '70', '3', '47245', '53577', '9'), +('15', '70', '3', '47299', '51719', '9'), +('15', '70', '3', '47301', '48179', '9'), +('15', '70', '3', '56017', '47968', '9'), +('15', '70', '5', '70985', '56870', '9'), +('15', '70', '5', '47275', '54177', '9'), +('15', '70', '5', '47273', '53232', '9'), +('15', '70', '5', '67625', '48871', '9'), +('15', '70', '8', '69165', '57005', '9'), +('15', '70', '8', '69064', '53439', '9'), +('15', '70', '8', '71665', '52922', '9'), +('15', '70', '8', '47305', '52646', '9'), +('15', '70', '6', '70717', '55452', '9'), +('15', '70', '6', '71666', '52698', '9'), +('15', '70', '6', '47279', '50171', '9'), +('15', '70', '6', '71654', '49628', '9'), +('15', '70', '17', '70956', '114948', '9'), +('15', '70', '17', '69152', '51353', '9'), +('15', '70', '17', '70702', '49099', '9'), +('15', '70', '17', '71640', '44955', '9'), +('15', '70', '7', '70952', '51791', '9'), +('15', '70', '7', '47206', '46445', '9'), +('15', '70', '7', '69175', '42702', '9'), +('15', '70', '7', '69081', '40161', '9'), +('15', '70', '9', '70953', '50427', '9'), +('15', '70', '9', '47222', '46094', '9'), +('15', '70', '9', '69128', '45804', '9'), +('15', '70', '9', '69099', '41077', '9'), +('15', '70', '15', '47290', '51077', '9'), +('15', '70', '15', '47291', '50291', '9'), +('15', '70', '15', '47294', '50141', '9'), +('15', '70', '15', '47292', '48130', '9'), +('15', '70', '20', '47283', '57735', '9'), +('15', '70', '20', '71664', '53161', '9'), +('15', '70', '20', '47282', '51834', '9'), +('15', '70', '20', '69134', '50334', '9'), +('15', '70', '12', '47214', '52416', '9'), +('15', '70', '12', '70954', '49381', '9'), +('15', '70', '12', '71085', '46066', '9'), +('15', '70', '12', '69254', '44968', '9'), +('15', '70', '18', '70957', '57193', '9'), +('15', '70', '18', '69148', '49702', '9'), +('15', '70', '18', '83134', '48708', '9'), +('15', '70', '18', '47202', '48025', '9'), +('15', '70', '19', '70955', '51618', '9'), +('15', '70', '19', '70712', '45698', '9'), +('15', '70', '19', '47218', '44545', '9'), +('15', '70', '19', '69179', '44174', '9'), +('15', '70', '13', '69052', '129192', '9'), +('15', '70', '13', '47314', '117466', '9'), +('15', '70', '13', '47318', '111795', '9'), +('15', '70', '13', '57054', '104575', '9'), +('15', '70', '14', '69052', '129192', '9'), +('15', '70', '14', '47314', '117466', '9'), +('15', '70', '14', '47318', '111795', '9'), +('15', '70', '14', '57054', '104575', '9'), +('15', '70', '11', '47295', '51523', '9'), +('15', '70', '11', '47297', '51093', '9'), +('15', '70', '11', '71659', '49336', '9'), +('15', '70', '11', '47296', '48772', '9'), +('15', '70', '22', '62787', '0', '8'), +('15', '70', '22', '21810', '0', '8'), +('15', '70', '22', '66397', '0', '8'), +('15', '70', '22', '61948', '0', '8'), +('15', '70', '1', '47287', '53971', '8'), +('15', '70', '1', '47289', '51303', '8'), +('15', '70', '1', '68949', '49515', '8'), +('15', '70', '1', '69166', '49130', '8'), +('15', '70', '2', '70951', '61306', '8'), +('15', '70', '2', '47210', '44700', '8'), +('15', '70', '2', '69089', '38415', '8'), +('15', '70', '2', '28648', '38010', '8'), +('15', '70', '3', '47245', '53577', '8'), +('15', '70', '3', '47299', '51719', '8'), +('15', '70', '3', '47301', '48179', '8'), +('15', '70', '3', '56017', '47968', '8'), +('15', '70', '5', '47275', '54177', '8'), +('15', '70', '5', '47273', '53232', '8'), +('15', '70', '5', '67625', '48871', '8'), +('15', '70', '5', '47274', '48486', '8'), +('15', '70', '8', '69165', '57005', '8'), +('15', '70', '8', '69064', '53439', '8'), +('15', '70', '8', '47305', '52646', '8'), +('15', '70', '8', '47303', '50908', '8'), +('15', '70', '6', '70717', '55452', '8'), +('15', '70', '6', '47279', '50171', '8'), +('15', '70', '6', '47277', '48573', '8'), +('15', '70', '6', '47228', '46051', '8'), +('15', '70', '17', '70956', '114948', '8'), +('15', '70', '17', '69152', '51353', '8'), +('15', '70', '17', '70702', '49099', '8'), +('15', '70', '17', '68982', '39152', '8'), +('15', '70', '7', '70952', '51791', '8'), +('15', '70', '7', '47206', '46445', '8'), +('15', '70', '7', '69175', '42702', '8'), +('15', '70', '7', '69081', '40161', '8'), +('15', '70', '9', '70953', '50427', '8'), +('15', '70', '9', '47222', '46094', '8'), +('15', '70', '9', '69128', '45804', '8'), +('15', '70', '9', '69099', '41077', '8'), +('15', '70', '15', '47290', '51077', '8'), +('15', '70', '15', '47291', '50291', '8'), +('15', '70', '15', '47294', '50141', '8'), +('15', '70', '15', '47292', '48130', '8'), +('15', '70', '20', '47283', '57735', '8'), +('15', '70', '20', '47282', '51834', '8'), +('15', '70', '20', '69134', '50334', '8'), +('15', '70', '20', '67625', '48871', '8'), +('15', '70', '12', '47214', '52416', '8'), +('15', '70', '12', '70954', '49381', '8'), +('15', '70', '12', '71085', '46066', '8'), +('15', '70', '12', '69254', '44968', '8'), +('15', '70', '18', '70957', '57193', '8'), +('15', '70', '18', '69148', '49702', '8'), +('15', '70', '18', '47202', '48025', '8'), +('15', '70', '18', '71098', '42246', '8'), +('15', '70', '19', '70955', '51618', '8'), +('15', '70', '19', '70712', '45698', '8'), +('15', '70', '19', '47218', '44545', '8'), +('15', '70', '19', '69179', '44174', '8'), +('15', '70', '13', '69052', '127817', '8'), +('15', '70', '13', '47314', '117053', '8'), +('15', '70', '13', '47318', '111428', '8'), +('15', '70', '13', '57054', '104575', '8'), +('15', '70', '14', '69052', '127817', '8'), +('15', '70', '14', '47314', '117053', '8'), +('15', '70', '14', '47318', '111428', '8'), +('15', '70', '14', '57054', '104575', '8'), +('15', '70', '11', '47295', '51523', '8'), +('15', '70', '11', '47297', '51093', '8'), +('15', '70', '11', '47296', '48772', '8'), +('15', '70', '11', '67606', '47551', '8'), +('15', '71', '22', '66397', '0', '11'), +('15', '71', '22', '62787', '0', '11'), +('15', '71', '22', '61948', '0', '11'), +('15', '71', '22', '21805', '0', '11'), +('15', '71', '1', '39276', '66839', '11'), +('15', '71', '1', '83594', '65691', '11'), +('15', '71', '1', '39343', '60865', '11'), +('15', '71', '1', '51705', '59011', '11'), +('15', '71', '2', '70951', '61308', '11'), +('15', '71', '2', '83562', '57874', '11'), +('15', '71', '2', '83542', '49352', '11'), +('15', '71', '2', '47210', '44704', '11'), +('15', '71', '3', '39368', '66175', '11'), +('15', '71', '3', '39361', '64002', '11'), +('15', '71', '3', '83658', '60884', '11'), +('15', '71', '3', '39338', '60206', '11'), +('15', '71', '5', '39349', '69899', '11'), +('15', '71', '5', '39366', '66449', '11'), +('15', '71', '5', '39340', '59669', '11'), +('15', '71', '5', '39262', '58985', '11'), +('15', '71', '8', '39330', '65768', '11'), +('15', '71', '8', '83659', '61534', '11'), +('15', '71', '8', '39286', '59936', '11'), +('15', '71', '8', '39352', '59830', '11'), +('15', '71', '6', '39367', '69873', '11'), +('15', '71', '6', '83660', '60588', '11'), +('15', '71', '6', '39348', '60069', '11'), +('15', '71', '6', '39362', '59899', '11'), +('15', '71', '17', '70956', '112203', '11'), +('15', '71', '17', '83605', '74350', '11'), +('15', '71', '17', '69152', '51357', '11'), +('15', '71', '17', '70702', '49104', '11'), +('15', '71', '7', '39357', '62735', '11'), +('15', '71', '7', '83566', '57969', '11'), +('15', '71', '7', '70952', '51795', '11'), +('15', '71', '7', '39220', '50462', '11'), +('15', '71', '9', '39346', '63849', '11'), +('15', '71', '9', '51708', '61403', '11'), +('15', '71', '9', '83654', '60666', '11'), +('15', '71', '9', '39297', '58677', '11'), +('15', '71', '15', '39374', '70210', '11'), +('15', '71', '15', '51703', '59676', '11'), +('15', '71', '15', '83661', '59321', '11'), +('15', '71', '15', '39321', '57680', '11'), +('15', '71', '20', '39339', '64627', '11'), +('15', '71', '20', '39360', '60406', '11'), +('15', '71', '20', '39350', '59821', '11'), +('15', '71', '20', '83650', '59241', '11'), +('15', '71', '12', '83570', '54297', '11'), +('15', '71', '12', '47214', '52418', '11'), +('15', '71', '12', '70954', '49386', '11'), +('15', '71', '12', '83496', '47206', '11'), +('15', '71', '18', '83609', '64095', '11'), +('15', '71', '18', '70957', '57198', '11'), +('15', '71', '18', '69148', '49706', '11'), +('15', '71', '18', '83134', '48710', '11'), +('15', '71', '19', '39279', '57325', '11'), +('15', '71', '19', '83574', '56921', '11'), +('15', '71', '19', '70955', '51618', '11'), +('15', '71', '19', '83504', '46993', '11'), +('15', '71', '13', '83639', '161567', '11'), +('15', '71', '13', '69052', '129881', '11'), +('15', '71', '13', '39323', '120397', '11'), +('15', '71', '13', '83580', '117817', '11'), +('15', '71', '14', '83639', '161567', '11'), +('15', '71', '14', '69052', '129881', '11'), +('15', '71', '14', '39323', '120397', '11'), +('15', '71', '14', '83580', '117817', '11'), +('15', '71', '11', '39371', '69942', '11'), +('15', '71', '11', '39311', '66806', '11'), +('15', '71', '11', '83657', '63659', '11'), +('15', '71', '11', '83665', '58551', '11'), +('15', '72', '22', '66397', '0', '11'), +('15', '72', '22', '62787', '0', '11'), +('15', '72', '22', '61948', '0', '11'), +('15', '72', '22', '21805', '0', '11'), +('15', '72', '1', '39276', '66842', '11'), +('15', '72', '1', '83594', '65696', '11'), +('15', '72', '1', '39343', '60870', '11'), +('15', '72', '1', '51705', '59016', '11'), +('15', '72', '2', '70951', '61311', '11'), +('15', '72', '2', '83562', '57879', '11'), +('15', '72', '2', '83542', '49354', '11'), +('15', '72', '2', '47210', '44707', '11'), +('15', '72', '3', '39368', '66180', '11'), +('15', '72', '3', '39361', '64005', '11'), +('15', '72', '3', '83658', '60889', '11'), +('15', '72', '3', '39338', '60212', '11'), +('15', '72', '5', '39349', '69903', '11'), +('15', '72', '5', '39366', '66455', '11'), +('15', '72', '5', '39340', '59674', '11'), +('15', '72', '5', '39262', '58989', '11'), +('15', '72', '8', '39330', '65771', '11'), +('15', '72', '8', '83659', '61536', '11'), +('15', '72', '8', '39286', '59939', '11'), +('15', '72', '8', '39352', '59832', '11'), +('15', '72', '6', '39367', '69876', '11'), +('15', '72', '6', '83660', '60590', '11'), +('15', '72', '6', '39348', '60074', '11'), +('15', '72', '6', '39362', '59904', '11'), +('15', '72', '17', '70956', '109458', '11'), +('15', '72', '17', '83605', '74355', '11'), +('15', '72', '17', '69152', '51361', '11'), +('15', '72', '17', '70702', '49109', '11'), +('15', '72', '7', '39357', '62739', '11'), +('15', '72', '7', '83566', '57974', '11'), +('15', '72', '7', '70952', '51798', '11'), +('15', '72', '7', '39220', '50465', '11'), +('15', '72', '9', '39346', '63854', '11'), +('15', '72', '9', '51708', '61407', '11'), +('15', '72', '9', '83654', '60670', '11'), +('15', '72', '9', '39297', '58679', '11'), +('15', '72', '15', '39374', '70215', '11'), +('15', '72', '15', '51703', '59681', '11'), +('15', '72', '15', '83661', '59326', '11'), +('15', '72', '15', '39321', '57685', '11'), +('15', '72', '20', '39339', '64630', '11'), +('15', '72', '20', '39360', '60412', '11'), +('15', '72', '20', '39350', '59825', '11'), +('15', '72', '20', '83650', '59245', '11'), +('15', '72', '12', '83570', '54303', '11'), +('15', '72', '12', '47214', '52421', '11'), +('15', '72', '12', '70954', '49392', '11'), +('15', '72', '12', '83496', '47209', '11'), +('15', '72', '18', '83609', '64101', '11'), +('15', '72', '18', '70957', '57203', '11'), +('15', '72', '18', '69148', '49709', '11'), +('15', '72', '18', '83134', '48713', '11'), +('15', '72', '19', '39279', '57328', '11'), +('15', '72', '19', '83574', '56926', '11'), +('15', '72', '19', '70955', '51618', '11'), +('15', '72', '19', '83504', '46997', '11'), +('15', '72', '13', '83639', '162378', '11'), +('15', '72', '13', '69052', '130570', '11'), +('15', '72', '13', '39323', '120605', '11'), +('15', '72', '13', '83580', '118004', '11'), +('15', '72', '14', '83639', '162378', '11'), +('15', '72', '14', '69052', '130570', '11'), +('15', '72', '14', '39323', '120605', '11'), +('15', '72', '14', '83580', '118004', '11'), +('15', '72', '11', '39371', '69947', '11'), +('15', '72', '11', '39311', '66811', '11'), +('15', '72', '11', '83657', '63665', '11'), +('15', '72', '11', '83665', '58557', '11'), +('15', '73', '22', '66397', '0', '11'), +('15', '73', '22', '62787', '0', '11'), +('15', '73', '22', '61948', '0', '11'), +('15', '73', '22', '21805', '0', '11'), +('15', '73', '1', '39276', '66846', '11'), +('15', '73', '1', '83594', '65700', '11'), +('15', '73', '1', '39343', '60874', '11'), +('15', '73', '1', '51705', '59021', '11'), +('15', '73', '2', '70951', '61313', '11'), +('15', '73', '2', '83562', '57885', '11'), +('15', '73', '2', '83542', '49356', '11'), +('15', '73', '2', '47210', '44710', '11'), +('15', '73', '3', '39368', '66185', '11'), +('15', '73', '3', '39361', '64009', '11'), +('15', '73', '3', '83658', '60894', '11'), +('15', '73', '3', '39338', '60217', '11'), +('15', '73', '5', '39349', '69907', '11'), +('15', '73', '5', '39366', '66460', '11'), +('15', '73', '5', '39340', '59680', '11'), +('15', '73', '5', '39262', '58993', '11'), +('15', '73', '8', '39330', '65774', '11'), +('15', '73', '8', '83659', '61538', '11'), +('15', '73', '8', '39286', '59943', '11'), +('15', '73', '8', '39352', '59834', '11'), +('15', '73', '6', '39367', '69878', '11'), +('15', '73', '6', '83660', '60593', '11'), +('15', '73', '6', '39348', '60080', '11'), +('15', '73', '6', '39362', '59910', '11'), +('15', '73', '17', '70956', '106713', '11'), +('15', '73', '17', '83605', '74361', '11'), +('15', '73', '17', '69152', '51365', '11'), +('15', '73', '17', '70702', '49114', '11'), +('15', '73', '7', '39357', '62743', '11'), +('15', '73', '7', '83566', '57979', '11'), +('15', '73', '7', '70952', '51802', '11'), +('15', '73', '7', '39220', '50469', '11'), +('15', '73', '9', '39346', '63859', '11'), +('15', '73', '9', '51708', '61412', '11'), +('15', '73', '9', '83654', '60674', '11'), +('15', '73', '9', '39297', '58682', '11'), +('15', '73', '15', '39374', '70220', '11'), +('15', '73', '15', '51703', '59686', '11'), +('15', '73', '15', '83661', '59331', '11'), +('15', '73', '15', '39321', '57690', '11'), +('15', '73', '20', '39339', '64634', '11'), +('15', '73', '20', '39360', '60417', '11'), +('15', '73', '20', '39350', '59829', '11'), +('15', '73', '20', '83650', '59249', '11'), +('15', '73', '12', '83570', '54308', '11'), +('15', '73', '12', '47214', '52423', '11'), +('15', '73', '12', '70954', '49397', '11'), +('15', '73', '12', '83496', '47213', '11'), +('15', '73', '18', '83609', '64106', '11'), +('15', '73', '18', '70957', '57208', '11'), +('15', '73', '18', '69148', '49713', '11'), +('15', '73', '18', '83134', '48715', '11'), +('15', '73', '19', '39279', '57331', '11'), +('15', '73', '19', '83574', '56932', '11'), +('15', '73', '19', '70955', '51618', '11'), +('15', '73', '19', '83504', '47000', '11'), +('15', '73', '13', '83639', '163188', '11'), +('15', '73', '13', '69052', '131259', '11'), +('15', '73', '13', '39323', '120813', '11'), +('15', '73', '13', '83580', '118191', '11'), +('15', '73', '14', '83639', '163188', '11'), +('15', '73', '14', '69052', '131259', '11'), +('15', '73', '14', '39323', '120813', '11'), +('15', '73', '14', '83580', '118191', '11'), +('15', '73', '11', '39371', '69951', '11'), +('15', '73', '11', '39311', '66815', '11'), +('15', '73', '11', '83657', '63670', '11'), +('15', '73', '11', '83665', '58563', '11'), +('15', '74', '22', '66397', '0', '11'), +('15', '74', '22', '62787', '0', '11'), +('15', '74', '22', '61948', '0', '11'), +('15', '74', '22', '21805', '0', '11'), +('15', '74', '1', '39276', '66850', '11'), +('15', '74', '1', '83594', '65705', '11'), +('15', '74', '1', '39343', '60879', '11'), +('15', '74', '1', '51705', '59026', '11'), +('15', '74', '2', '70951', '61315', '11'), +('15', '74', '2', '83562', '57890', '11'), +('15', '74', '2', '83542', '49358', '11'), +('15', '74', '2', '47210', '44713', '11'), +('15', '74', '3', '39368', '66190', '11'), +('15', '74', '3', '39361', '64013', '11'), +('15', '74', '3', '83658', '60899', '11'), +('15', '74', '3', '39338', '60223', '11'), +('15', '74', '5', '39349', '69911', '11'), +('15', '74', '5', '39366', '66466', '11'), +('15', '74', '5', '39340', '59685', '11'), +('15', '74', '5', '39262', '58996', '11'), +('15', '74', '8', '39330', '65777', '11'), +('15', '74', '8', '83659', '61540', '11'), +('15', '74', '8', '39286', '59947', '11'), +('15', '74', '8', '39352', '59836', '11'), +('15', '74', '6', '39367', '69880', '11'), +('15', '74', '6', '83660', '60596', '11'), +('15', '74', '6', '39348', '60085', '11'), +('15', '74', '6', '39362', '59915', '11'), +('15', '74', '17', '70956', '103968', '11'), +('15', '74', '17', '83605', '74366', '11'), +('15', '74', '17', '69152', '51369', '11'), +('15', '74', '17', '70702', '49120', '11'), +('15', '74', '7', '39357', '62747', '11'), +('15', '74', '7', '83566', '57985', '11'), +('15', '74', '7', '70952', '51805', '11'), +('15', '74', '7', '39220', '50473', '11'), +('15', '74', '9', '39346', '63864', '11'), +('15', '74', '9', '51708', '61416', '11'), +('15', '74', '9', '83654', '60678', '11'), +('15', '74', '9', '39297', '58684', '11'), +('15', '74', '15', '39374', '70226', '11'), +('15', '74', '15', '51703', '59690', '11'), +('15', '74', '15', '83661', '59336', '11'), +('15', '74', '15', '39321', '57695', '11'), +('15', '74', '20', '39339', '64638', '11'), +('15', '74', '20', '39360', '60423', '11'), +('15', '74', '20', '39350', '59833', '11'), +('15', '74', '20', '83650', '59253', '11'), +('15', '74', '12', '83570', '54314', '11'), +('15', '74', '12', '47214', '52426', '11'), +('15', '74', '12', '70954', '49402', '11'), +('15', '74', '12', '83496', '47217', '11'), +('15', '74', '18', '83609', '64111', '11'), +('15', '74', '18', '70957', '57213', '11'), +('15', '74', '18', '69148', '49717', '11'), +('15', '74', '18', '83134', '48718', '11'), +('15', '74', '19', '39279', '57334', '11'), +('15', '74', '19', '83574', '56937', '11'), +('15', '74', '19', '70955', '51618', '11'), +('15', '74', '19', '83504', '47004', '11'), +('15', '74', '13', '83639', '163999', '11'), +('15', '74', '13', '69052', '131948', '11'), +('15', '74', '13', '39323', '121021', '11'), +('15', '74', '13', '83580', '118377', '11'), +('15', '74', '14', '83639', '163999', '11'), +('15', '74', '14', '69052', '131948', '11'), +('15', '74', '14', '39323', '121021', '11'), +('15', '74', '14', '83580', '118377', '11'), +('15', '74', '11', '39371', '69955', '11'), +('15', '74', '11', '39311', '66820', '11'), +('15', '74', '11', '83657', '63675', '11'), +('15', '74', '11', '83665', '58569', '11'), +('15', '75', '22', '61948', '0', '13'), +('15', '75', '22', '66397', '0', '13'), +('15', '75', '22', '21805', '0', '13'), +('15', '75', '22', '21807', '0', '13'), +('15', '75', '1', '80676', '92760', '13'), +('15', '75', '1', '80660', '88731', '13'), +('15', '75', '1', '80648', '88332', '13'), +('15', '75', '1', '80639', '84679', '13'), +('15', '75', '2', '53459', '75428', '13'), +('15', '75', '2', '70951', '61318', '13'), +('15', '75', '2', '83562', '57895', '13'), +('15', '75', '2', '83542', '49360', '13'), +('15', '75', '3', '80637', '88397', '13'), +('15', '75', '3', '46924', '74565', '13'), +('15', '75', '3', '46923', '74016', '13'), +('15', '75', '3', '46874', '74013', '13'), +('15', '75', '5', '80670', '93345', '13'), +('15', '75', '5', '46918', '85467', '13'), +('15', '75', '5', '80616', '84278', '13'), +('15', '75', '5', '46934', '80750', '13'), +('15', '75', '8', '80677', '96783', '13'), +('15', '75', '8', '46885', '93622', '13'), +('15', '75', '8', '80649', '84723', '13'), +('15', '75', '8', '46848', '68607', '13'), +('15', '75', '6', '80638', '97429', '13'), +('15', '75', '6', '46933', '82700', '13'), +('15', '75', '6', '46884', '82519', '13'), +('15', '75', '6', '46883', '80714', '13'), +('15', '75', '17', '70956', '101223', '13'), +('15', '75', '17', '53464', '79676', '13'), +('15', '75', '17', '83605', '74371', '13'), +('15', '75', '17', '46817', '63443', '13'), +('15', '75', '7', '53460', '76187', '13'), +('15', '75', '7', '39357', '62751', '13'), +('15', '75', '7', '83566', '57990', '13'), +('15', '75', '7', '70952', '51809', '13'), +('15', '75', '9', '46888', '82949', '13'), +('15', '75', '9', '53461', '75992', '13'), +('15', '75', '9', '39346', '63868', '13'), +('15', '75', '9', '51708', '61421', '13'), +('15', '75', '15', '79909', '98778', '13'), +('15', '75', '15', '80667', '96318', '13'), +('15', '75', '15', '80686', '93259', '13'), +('15', '75', '15', '79908', '89401', '13'), +('15', '75', '20', '80678', '105824', '13'), +('15', '75', '20', '46935', '85393', '13'), +('15', '75', '20', '80620', '80766', '13'), +('15', '75', '20', '46870', '74628', '13'), +('15', '75', '12', '53462', '84059', '13'), +('15', '75', '12', '83570', '54319', '13'), +('15', '75', '12', '47214', '52428', '13'), +('15', '75', '12', '70954', '49408', '13'), +('15', '75', '18', '53465', '78419', '13'), +('15', '75', '18', '83609', '64117', '13'), +('15', '75', '18', '70957', '57218', '13'), +('15', '75', '18', '69148', '49720', '13'), +('15', '75', '19', '53463', '76446', '13'), +('15', '75', '19', '39279', '57338', '13'), +('15', '75', '19', '83574', '56943', '13'), +('15', '75', '19', '70955', '51618', '13'), +('15', '75', '13', '46856', '190246', '13'), +('15', '75', '13', '46854', '188926', '13'), +('15', '75', '13', '83639', '168853', '13'), +('15', '75', '13', '80684', '161301', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '75', '14', '46856', '190246', '13'), +('15', '75', '14', '46854', '188926', '13'), +('15', '75', '14', '83639', '168853', '13'), +('15', '75', '14', '80684', '161301', '13'), +('15', '75', '11', '80668', '92944', '13'), +('15', '75', '11', '80618', '84258', '13'), +('15', '75', '11', '46889', '83299', '13'), +('15', '75', '11', '46850', '81075', '13'), +('15', '75', '22', '61948', '0', '12'), +('15', '75', '22', '66397', '0', '12'), +('15', '75', '22', '21805', '0', '12'), +('15', '75', '22', '21807', '0', '12'), +('15', '75', '1', '46931', '81175', '12'), +('15', '75', '1', '46866', '74992', '12'), +('15', '75', '1', '46914', '73794', '12'), +('15', '75', '1', '46865', '73749', '12'), +('15', '75', '2', '53459', '75428', '12'), +('15', '75', '2', '70951', '61318', '12'), +('15', '75', '2', '83562', '57895', '12'), +('15', '75', '2', '83542', '49360', '12'), +('15', '75', '3', '46924', '74565', '12'), +('15', '75', '3', '46923', '74016', '12'), +('15', '75', '3', '46874', '74013', '12'), +('15', '75', '3', '46902', '68486', '12'), +('15', '75', '5', '46918', '85467', '12'), +('15', '75', '5', '46934', '80750', '12'), +('15', '75', '5', '46917', '73754', '12'), +('15', '75', '5', '46868', '73717', '12'), +('15', '75', '8', '46885', '93622', '12'), +('15', '75', '8', '46848', '68607', '12'), +('15', '75', '8', '46847', '67832', '12'), +('15', '75', '8', '46898', '67354', '12'), +('15', '75', '6', '46933', '82700', '12'), +('15', '75', '6', '46884', '82519', '12'), +('15', '75', '6', '46883', '80714', '12'), +('15', '75', '6', '46896', '71072', '12'), +('15', '75', '17', '70956', '101223', '12'), +('15', '75', '17', '53464', '79676', '12'), +('15', '75', '17', '83605', '74371', '12'), +('15', '75', '17', '46817', '63443', '12'), +('15', '75', '7', '53460', '76187', '12'), +('15', '75', '7', '39357', '62751', '12'), +('15', '75', '7', '83566', '57990', '12'), +('15', '75', '7', '70952', '51809', '12'), +('15', '75', '9', '46888', '82949', '12'), +('15', '75', '9', '53461', '75992', '12'), +('15', '75', '9', '39346', '63868', '12'), +('15', '75', '9', '51708', '61421', '12'), +('15', '75', '15', '46881', '83809', '12'), +('15', '75', '15', '46912', '76366', '12'), +('15', '75', '15', '46916', '74317', '12'), +('15', '75', '15', '46915', '73821', '12'), +('15', '75', '20', '46935', '85393', '12'), +('15', '75', '20', '46870', '74628', '12'), +('15', '75', '20', '46869', '74019', '12'), +('15', '75', '20', '46920', '73455', '12'), +('15', '75', '12', '53462', '84059', '12'), +('15', '75', '12', '83570', '54319', '12'), +('15', '75', '12', '47214', '52428', '12'), +('15', '75', '12', '70954', '49408', '12'), +('15', '75', '18', '53465', '78419', '12'), +('15', '75', '18', '83609', '64117', '12'), +('15', '75', '18', '70957', '57218', '12'), +('15', '75', '18', '69148', '49720', '12'), +('15', '75', '19', '53463', '76446', '12'), +('15', '75', '19', '39279', '57338', '12'), +('15', '75', '19', '83574', '56943', '12'), +('15', '75', '19', '70955', '51618', '12'), +('15', '75', '13', '46856', '190246', '12'), +('15', '75', '13', '46854', '188926', '12'), +('15', '75', '13', '83639', '168853', '12'), +('15', '75', '13', '46878', '148007', '12'), +('15', '75', '14', '46856', '190246', '12'), +('15', '75', '14', '46854', '188926', '12'), +('15', '75', '14', '83639', '168853', '12'), +('15', '75', '14', '46878', '148007', '12'), +('15', '75', '11', '46889', '83299', '12'), +('15', '75', '11', '46850', '81075', '12'), +('15', '75', '11', '46939', '80204', '12'), +('15', '75', '11', '39371', '69960', '12'), +('15', '76', '22', '61948', '0', '13'), +('15', '76', '22', '66397', '0', '13'), +('15', '76', '22', '21805', '0', '13'), +('15', '76', '22', '21807', '0', '13'), +('15', '76', '1', '80676', '92764', '13'), +('15', '76', '1', '80660', '88737', '13'), +('15', '76', '1', '80648', '88337', '13'), +('15', '76', '1', '80639', '84685', '13'), +('15', '76', '2', '53459', '75431', '13'), +('15', '76', '2', '70951', '61320', '13'), +('15', '76', '2', '83562', '57901', '13'), +('15', '76', '2', '83542', '49362', '13'), +('15', '76', '3', '80637', '88402', '13'), +('15', '76', '3', '46924', '74570', '13'), +('15', '76', '3', '46923', '74021', '13'), +('15', '76', '3', '46874', '74018', '13'), +('15', '76', '5', '80670', '93352', '13'), +('15', '76', '5', '46918', '85472', '13'), +('15', '76', '5', '80616', '84281', '13'), +('15', '76', '5', '46934', '80756', '13'), +('15', '76', '8', '80677', '96789', '13'), +('15', '76', '8', '46885', '93629', '13'), +('15', '76', '8', '80649', '84729', '13'), +('15', '76', '8', '46848', '68612', '13'), +('15', '76', '6', '80638', '97434', '13'), +('15', '76', '6', '46933', '82705', '13'), +('15', '76', '6', '46884', '82525', '13'), +('15', '76', '6', '46883', '80721', '13'), +('15', '76', '17', '70956', '98477', '13'), +('15', '76', '17', '53464', '79678', '13'), +('15', '76', '17', '83605', '74377', '13'), +('15', '76', '17', '46817', '63447', '13'), +('15', '76', '7', '53460', '76193', '13'), +('15', '76', '7', '39357', '62755', '13'), +('15', '76', '7', '83566', '57996', '13'), +('15', '76', '7', '70952', '51813', '13'), +('15', '76', '9', '46888', '82956', '13'), +('15', '76', '9', '53461', '75997', '13'), +('15', '76', '9', '39346', '63873', '13'), +('15', '76', '9', '51708', '61425', '13'), +('15', '76', '15', '79909', '98784', '13'), +('15', '76', '15', '80667', '96324', '13'), +('15', '76', '15', '80686', '93265', '13'), +('15', '76', '15', '79908', '89406', '13'), +('15', '76', '20', '80678', '105830', '13'), +('15', '76', '20', '46935', '85399', '13'), +('15', '76', '20', '80620', '80768', '13'), +('15', '76', '20', '46870', '74632', '13'), +('15', '76', '12', '53462', '84063', '13'), +('15', '76', '12', '83570', '54324', '13'), +('15', '76', '12', '47214', '52431', '13'), +('15', '76', '12', '70954', '49413', '13'), +('15', '76', '18', '53465', '78424', '13'), +('15', '76', '18', '83609', '64122', '13'), +('15', '76', '18', '70957', '57223', '13'), +('15', '76', '18', '69148', '49724', '13'), +('15', '76', '19', '53463', '76449', '13'), +('15', '76', '19', '39279', '57341', '13'), +('15', '76', '19', '83574', '56948', '13'), +('15', '76', '19', '70955', '51618', '13'), +('15', '76', '13', '46856', '191059', '13'), +('15', '76', '13', '46854', '189739', '13'), +('15', '76', '13', '83639', '169664', '13'), +('15', '76', '13', '80684', '161305', '13'), +('15', '76', '14', '46856', '191059', '13'), +('15', '76', '14', '46854', '189739', '13'), +('15', '76', '14', '83639', '169664', '13'), +('15', '76', '14', '80684', '161305', '13'), +('15', '76', '11', '80668', '92950', '13'), +('15', '76', '11', '80618', '84264', '13'), +('15', '76', '11', '46889', '83305', '13'), +('15', '76', '11', '46850', '81080', '13'), +('15', '77', '22', '61948', '0', '13'), +('15', '77', '22', '66397', '0', '13'), +('15', '77', '22', '21805', '0', '13'), +('15', '77', '22', '21807', '0', '13'), +('15', '77', '1', '80676', '92767', '13'), +('15', '77', '1', '80660', '88743', '13'), +('15', '77', '1', '80648', '88343', '13'), +('15', '77', '1', '80639', '84691', '13'), +('15', '77', '2', '53459', '75434', '13'), +('15', '77', '2', '70951', '61323', '13'), +('15', '77', '2', '83562', '57906', '13'), +('15', '77', '2', '83542', '49364', '13'), +('15', '77', '3', '80637', '88408', '13'), +('15', '77', '3', '46924', '74575', '13'), +('15', '77', '3', '46923', '74026', '13'), +('15', '77', '3', '46874', '74024', '13'), +('15', '77', '5', '80670', '93358', '13'), +('15', '77', '5', '46918', '85477', '13'), +('15', '77', '5', '80616', '84284', '13'), +('15', '77', '5', '46934', '80763', '13'), +('15', '77', '8', '80677', '96796', '13'), +('15', '77', '8', '46885', '93635', '13'), +('15', '77', '8', '80649', '84734', '13'), +('15', '77', '8', '46848', '68618', '13'), +('15', '77', '6', '80638', '97440', '13'), +('15', '77', '6', '46933', '82711', '13'), +('15', '77', '6', '46884', '82531', '13'), +('15', '77', '6', '46883', '80727', '13'), +('15', '77', '17', '70956', '95732', '13'), +('15', '77', '17', '53464', '79681', '13'), +('15', '77', '17', '83605', '74382', '13'), +('15', '77', '17', '46817', '63451', '13'), +('15', '77', '7', '53460', '76198', '13'), +('15', '77', '7', '39357', '62759', '13'), +('15', '77', '7', '83566', '58001', '13'), +('15', '77', '7', '70952', '51816', '13'), +('15', '77', '9', '46888', '82962', '13'), +('15', '77', '9', '53461', '76002', '13'), +('15', '77', '9', '39346', '63878', '13'), +('15', '77', '9', '51708', '61430', '13'), +('15', '77', '15', '79909', '98789', '13'), +('15', '77', '15', '80667', '96331', '13'), +('15', '77', '15', '80686', '93272', '13'), +('15', '77', '15', '79908', '89411', '13'), +('15', '77', '20', '80678', '105837', '13'), +('15', '77', '20', '46935', '85405', '13'), +('15', '77', '20', '80620', '80771', '13'), +('15', '77', '20', '46870', '74637', '13'), +('15', '77', '12', '53462', '84068', '13'), +('15', '77', '12', '83570', '54330', '13'), +('15', '77', '12', '47214', '52433', '13'), +('15', '77', '12', '70954', '49419', '13'), +('15', '77', '18', '53465', '78429', '13'), +('15', '77', '18', '83609', '64127', '13'), +('15', '77', '18', '70957', '57228', '13'), +('15', '77', '18', '69148', '49728', '13'), +('15', '77', '19', '53463', '76452', '13'), +('15', '77', '19', '39279', '57344', '13'), +('15', '77', '19', '83574', '56953', '13'), +('15', '77', '19', '70955', '51618', '13'), +('15', '77', '13', '46856', '191872', '13'), +('15', '77', '13', '46854', '190552', '13'), +('15', '77', '13', '83639', '170475', '13'), +('15', '77', '13', '80684', '161310', '13'), +('15', '77', '14', '46856', '191872', '13'), +('15', '77', '14', '46854', '190552', '13'), +('15', '77', '14', '83639', '170475', '13'), +('15', '77', '14', '80684', '161310', '13'), +('15', '77', '11', '80668', '92957', '13'), +('15', '77', '11', '80618', '84269', '13'), +('15', '77', '11', '46889', '83312', '13'), +('15', '77', '11', '46850', '81085', '13'), +('15', '78', '22', '61948', '0', '13'), +('15', '78', '22', '66397', '0', '13'), +('15', '78', '22', '21805', '0', '13'), +('15', '78', '22', '21807', '0', '13'), +('15', '78', '1', '80676', '92771', '13'), +('15', '78', '1', '80660', '88750', '13'), +('15', '78', '1', '80648', '88349', '13'), +('15', '78', '1', '80639', '84696', '13'), +('15', '78', '2', '53459', '75437', '13'), +('15', '78', '2', '70951', '61325', '13'), +('15', '78', '2', '83562', '57912', '13'), +('15', '78', '2', '83542', '49366', '13'), +('15', '78', '3', '80637', '88414', '13'), +('15', '78', '3', '46924', '74581', '13'), +('15', '78', '3', '46923', '74032', '13'), +('15', '78', '3', '46874', '74030', '13'), +('15', '78', '5', '80670', '93365', '13'), +('15', '78', '5', '46918', '85482', '13'), +('15', '78', '5', '80616', '84287', '13'), +('15', '78', '5', '46934', '80769', '13'), +('15', '78', '8', '80677', '96802', '13'), +('15', '78', '8', '46885', '93642', '13'), +('15', '78', '8', '80649', '84740', '13'), +('15', '78', '8', '46848', '68623', '13'), +('15', '78', '6', '80638', '97446', '13'), +('15', '78', '6', '46933', '82716', '13'), +('15', '78', '6', '46884', '82537', '13'), +('15', '78', '6', '46883', '80734', '13'), +('15', '78', '17', '70956', '92987', '13'), +('15', '78', '17', '53464', '79683', '13'), +('15', '78', '17', '83605', '74387', '13'), +('15', '78', '17', '46817', '63455', '13'), +('15', '78', '7', '53460', '76203', '13'), +('15', '78', '7', '39357', '62763', '13'), +('15', '78', '7', '83566', '58006', '13'), +('15', '78', '7', '70952', '51820', '13'), +('15', '78', '9', '46888', '82969', '13'), +('15', '78', '9', '53461', '76007', '13'), +('15', '78', '9', '39346', '63883', '13'), +('15', '78', '9', '51708', '61434', '13'), +('15', '78', '15', '79909', '98795', '13'), +('15', '78', '15', '80667', '96337', '13'), +('15', '78', '15', '80686', '93278', '13'), +('15', '78', '15', '79908', '89416', '13'), +('15', '78', '20', '80678', '105843', '13'), +('15', '78', '20', '46935', '85411', '13'), +('15', '78', '20', '80620', '80773', '13'), +('15', '78', '20', '46870', '74642', '13'), +('15', '78', '12', '53462', '84072', '13'), +('15', '78', '12', '83570', '54335', '13'), +('15', '78', '12', '47214', '52436', '13'), +('15', '78', '12', '70954', '49424', '13'), +('15', '78', '18', '53465', '78433', '13'), +('15', '78', '18', '83609', '64133', '13'), +('15', '78', '18', '70957', '57232', '13'), +('15', '78', '18', '69148', '49732', '13'), +('15', '78', '19', '53463', '76455', '13'), +('15', '78', '19', '39279', '57347', '13'), +('15', '78', '19', '83574', '56959', '13'), +('15', '78', '19', '70955', '51618', '13'), +('15', '78', '13', '46856', '192685', '13'), +('15', '78', '13', '46854', '191365', '13'), +('15', '78', '13', '83639', '171285', '13'), +('15', '78', '13', '80684', '161314', '13'), +('15', '78', '14', '46856', '192685', '13'), +('15', '78', '14', '46854', '191365', '13'), +('15', '78', '14', '83639', '171285', '13'), +('15', '78', '14', '80684', '161314', '13'), +('15', '78', '11', '80668', '92963', '13'), +('15', '78', '11', '80618', '84275', '13'), +('15', '78', '11', '46889', '83318', '13'), +('15', '78', '11', '46850', '81090', '13'), +('15', '79', '22', '61948', '0', '13'), +('15', '79', '22', '66397', '0', '13'), +('15', '79', '22', '21805', '0', '13'), +('15', '79', '22', '21807', '0', '13'), +('15', '79', '1', '80676', '92774', '13'), +('15', '79', '1', '80660', '88756', '13'), +('15', '79', '1', '80648', '88355', '13'), +('15', '79', '1', '80639', '84702', '13'), +('15', '79', '2', '53459', '75440', '13'), +('15', '79', '2', '70951', '61327', '13'), +('15', '79', '2', '83562', '57917', '13'), +('15', '79', '2', '83542', '49368', '13'), +('15', '79', '3', '80637', '88420', '13'), +('15', '79', '3', '46924', '74586', '13'), +('15', '79', '3', '46923', '74037', '13'), +('15', '79', '3', '46874', '74035', '13'), +('15', '79', '5', '80670', '93371', '13'), +('15', '79', '5', '46918', '85487', '13'), +('15', '79', '5', '80616', '84290', '13'), +('15', '79', '5', '46934', '80776', '13'), +('15', '79', '8', '80677', '96809', '13'), +('15', '79', '8', '46885', '93648', '13'), +('15', '79', '8', '80649', '84746', '13'), +('15', '79', '8', '46848', '68629', '13'), +('15', '79', '6', '80638', '97452', '13'), +('15', '79', '6', '46933', '82722', '13'), +('15', '79', '6', '46884', '82544', '13'), +('15', '79', '6', '46883', '80740', '13'), +('15', '79', '17', '70956', '90242', '13'), +('15', '79', '17', '53464', '79685', '13'), +('15', '79', '17', '83605', '74392', '13'), +('15', '79', '17', '46817', '63459', '13'), +('15', '79', '7', '53460', '76209', '13'), +('15', '79', '7', '39357', '62767', '13'), +('15', '79', '7', '83566', '58012', '13'), +('15', '79', '7', '70952', '51823', '13'), +('15', '79', '9', '46888', '82975', '13'), +('15', '79', '9', '53461', '76012', '13'), +('15', '79', '9', '39346', '63888', '13'), +('15', '79', '9', '51708', '61439', '13'), +('15', '79', '15', '79909', '98800', '13'), +('15', '79', '15', '80667', '96344', '13'), +('15', '79', '15', '80686', '93285', '13'), +('15', '79', '15', '79908', '89421', '13'), +('15', '79', '20', '80678', '105850', '13'), +('15', '79', '20', '46935', '85418', '13'), +('15', '79', '20', '80620', '80775', '13'), +('15', '79', '20', '46870', '74646', '13'), +('15', '79', '12', '53462', '84076', '13'), +('15', '79', '12', '83570', '54341', '13'), +('15', '79', '12', '47214', '52438', '13'), +('15', '79', '12', '70954', '49429', '13'), +('15', '79', '18', '53465', '78438', '13'), +('15', '79', '18', '83609', '64138', '13'), +('15', '79', '18', '70957', '57237', '13'), +('15', '79', '18', '69148', '49735', '13'), +('15', '79', '19', '53463', '76458', '13'), +('15', '79', '19', '39279', '57351', '13'), +('15', '79', '19', '83574', '56964', '13'), +('15', '79', '19', '70955', '51618', '13'), +('15', '79', '13', '46856', '193498', '13'), +('15', '79', '13', '46854', '192178', '13'), +('15', '79', '13', '83639', '172096', '13'), +('15', '79', '13', '80684', '161319', '13'), +('15', '79', '14', '46856', '193498', '13'), +('15', '79', '14', '46854', '192178', '13'), +('15', '79', '14', '83639', '172096', '13'), +('15', '79', '14', '80684', '161319', '13'), +('15', '79', '11', '80668', '92970', '13'), +('15', '79', '11', '80618', '84280', '13'), +('15', '79', '11', '46889', '83324', '13'), +('15', '79', '11', '46850', '81094', '13'), +('15', '80', '22', '61948', '0', '14'), +('15', '80', '22', '66397', '0', '14'), +('15', '80', '22', '21805', '0', '14'), +('15', '80', '22', '21807', '0', '14'), +('15', '80', '1', '102641', '125457', '14'), +('15', '80', '1', '102597', '124985', '14'), +('15', '80', '1', '102625', '124910', '14'), +('15', '80', '1', '102639', '124152', '14'), +('15', '80', '2', '102017', '85508', '14'), +('15', '80', '2', '102269', '76933', '14'), +('15', '80', '2', '53459', '75443', '14'), +('15', '80', '2', '70951', '61330', '14'), +('15', '80', '3', '102726', '136576', '14'), +('15', '80', '3', '102598', '133249', '14'), +('15', '80', '3', '102626', '132727', '14'), +('15', '80', '3', '102725', '118727', '14'), +('15', '80', '5', '102599', '131750', '14'), +('15', '80', '5', '102627', '129002', '14'), +('15', '80', '5', '102745', '120637', '14'), +('15', '80', '5', '102551', '114987', '14'), +('15', '80', '8', '102601', '142504', '14'), +('15', '80', '8', '102629', '132728', '14'), +('15', '80', '8', '102552', '125243', '14'), +('15', '80', '8', '80677', '96815', '14'), +('15', '80', '6', '102600', '132572', '14'), +('15', '80', '6', '102628', '132167', '14'), +('15', '80', '6', '102558', '116464', '14'), +('15', '80', '6', '80638', '97457', '14'), +('15', '80', '17', '102020', '90888', '14'), +('15', '80', '17', '70956', '87497', '14'), +('15', '80', '17', '102272', '82519', '14'), +('15', '80', '17', '53464', '79688', '14'), +('15', '80', '7', '102018', '86507', '14'), +('15', '80', '7', '102270', '78330', '14'), +('15', '80', '7', '53460', '76214', '14'), +('15', '80', '7', '39357', '62771', '14'), +('15', '80', '9', '67098', '220895', '14'), +('15', '80', '9', '46888', '82982', '14'), +('15', '80', '9', '53461', '76017', '14'), +('15', '80', '9', '102289', '70995', '14'), +('15', '80', '15', '102630', '127636', '14'), +('15', '80', '15', '102636', '127375', '14'), +('15', '80', '15', '102602', '126993', '14'), +('15', '80', '15', '102637', '126328', '14'), +('15', '80', '20', '102631', '142644', '14'), +('15', '80', '20', '102603', '141905', '14'), +('15', '80', '20', '102553', '124368', '14'), +('15', '80', '20', '80678', '105856', '14'), +('15', '80', '12', '53462', '84081', '14'), +('15', '80', '12', '102267', '73413', '14'), +('15', '80', '12', '83570', '54346', '14'), +('15', '80', '12', '47214', '52441', '14'), +('15', '80', '18', '102019', '88257', '14'), +('15', '80', '18', '102271', '79912', '14'), +('15', '80', '18', '53465', '78443', '14'), +('15', '80', '18', '83609', '64143', '14'), +('15', '80', '19', '76131', '79556', '14'), +('15', '80', '19', '53463', '76461', '14'), +('15', '80', '19', '102268', '74352', '14'), +('15', '80', '19', '39279', '57354', '14'), +('15', '80', '13', '102720', '226975', '14'), +('15', '80', '13', '102665', '224617', '14'), +('15', '80', '13', '102660', '220041', '14'), +('15', '80', '13', '102655', '219639', '14'), +('15', '80', '14', '102720', '226975', '14'), +('15', '80', '14', '102665', '224617', '14'), +('15', '80', '14', '102660', '220041', '14'), +('15', '80', '14', '102661', '219881', '14'), +('15', '80', '11', '102643', '127796', '14'), +('15', '80', '11', '102747', '118353', '14'), +('15', '80', '11', '80668', '92976', '14'), +('15', '80', '11', '102747', '90306', '14'), +('15', '81', '22', '61948', '0', '14'), +('15', '81', '22', '66397', '0', '14'), +('15', '81', '22', '21805', '0', '14'), +('15', '81', '22', '21807', '0', '14'), +('15', '81', '1', '102641', '125462', '14'), +('15', '81', '1', '102597', '124991', '14'), +('15', '81', '1', '102625', '124917', '14'), +('15', '81', '1', '102639', '124157', '14'), +('15', '81', '2', '102017', '85513', '14'), +('15', '81', '2', '102269', '76937', '14'), +('15', '81', '2', '53459', '75446', '14'), +('15', '81', '2', '70951', '61332', '14'), +('15', '81', '3', '102726', '136582', '14'), +('15', '81', '3', '102598', '133254', '14'), +('15', '81', '3', '102626', '132733', '14'), +('15', '81', '3', '102725', '118731', '14'), +('15', '81', '5', '102599', '131755', '14'), +('15', '81', '5', '102627', '129006', '14'), +('15', '81', '5', '102745', '120642', '14'), +('15', '81', '5', '102551', '114990', '14'), +('15', '81', '8', '102601', '142511', '14'), +('15', '81', '8', '102629', '132732', '14'), +('15', '81', '8', '102552', '125248', '14'), +('15', '81', '8', '80677', '96822', '14'), +('15', '81', '6', '102600', '132578', '14'), +('15', '81', '6', '102628', '132172', '14'), +('15', '81', '6', '102558', '116470', '14'), +('15', '81', '6', '80638', '97463', '14'), +('15', '81', '17', '102020', '90892', '14'), +('15', '81', '17', '70956', '84752', '14'), +('15', '81', '17', '102272', '82525', '14'), +('15', '81', '17', '53464', '79690', '14'), +('15', '81', '7', '102018', '86513', '14'), +('15', '81', '7', '102270', '78335', '14'), +('15', '81', '7', '53460', '76220', '14'), +('15', '81', '7', '39357', '62775', '14'), +('15', '81', '9', '67098', '223661', '14'), +('15', '81', '9', '46888', '82988', '14'), +('15', '81', '9', '53461', '76022', '14'), +('15', '81', '9', '102289', '70998', '14'), +('15', '81', '15', '102630', '127641', '14'), +('15', '81', '15', '102636', '127381', '14'), +('15', '81', '15', '102602', '126999', '14'), +('15', '81', '15', '102637', '126333', '14'), +('15', '81', '20', '102631', '142651', '14'), +('15', '81', '20', '102603', '141911', '14'), +('15', '81', '20', '102553', '124373', '14'), +('15', '81', '20', '80678', '105862', '14'), +('15', '81', '12', '53462', '84085', '14'), +('15', '81', '12', '102267', '73417', '14'), +('15', '81', '12', '83570', '54351', '14'), +('15', '81', '12', '47214', '52443', '14'), +('15', '81', '18', '102019', '88262', '14'), +('15', '81', '18', '102271', '79918', '14'), +('15', '81', '18', '53465', '78448', '14'), +('15', '81', '18', '83609', '64148', '14'), +('15', '81', '19', '76131', '79557', '14'), +('15', '81', '19', '53463', '76464', '14'), +('15', '81', '19', '102268', '74356', '14'), +('15', '81', '19', '39279', '57357', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '81', '13', '102720', '227117', '14'), +('15', '81', '13', '102665', '224783', '14'), +('15', '81', '13', '102660', '220205', '14'), +('15', '81', '13', '102655', '219805', '14'), +('15', '81', '14', '102720', '227117', '14'), +('15', '81', '14', '102665', '224783', '14'), +('15', '81', '14', '102660', '220205', '14'), +('15', '81', '14', '102661', '220046', '14'), +('15', '81', '11', '102643', '127799', '14'), +('15', '81', '11', '102747', '118357', '14'), +('15', '81', '11', '80668', '92982', '14'), +('15', '81', '11', '102747', '90308', '14'), +('15', '82', '22', '61948', '0', '14'), +('15', '82', '22', '66397', '0', '14'), +('15', '82', '22', '21805', '0', '14'), +('15', '82', '22', '21807', '0', '14'), +('15', '82', '1', '102641', '125467', '14'), +('15', '82', '1', '102597', '124997', '14'), +('15', '82', '1', '102625', '124923', '14'), +('15', '82', '1', '102639', '124164', '14'), +('15', '82', '2', '102017', '85518', '14'), +('15', '82', '2', '102269', '76941', '14'), +('15', '82', '2', '53459', '75449', '14'), +('15', '82', '2', '70951', '61335', '14'), +('15', '82', '3', '102726', '136588', '14'), +('15', '82', '3', '102598', '133259', '14'), +('15', '82', '3', '102626', '132739', '14'), +('15', '82', '3', '102725', '118736', '14'), +('15', '82', '5', '102599', '131761', '14'), +('15', '82', '5', '102627', '129010', '14'), +('15', '82', '5', '102745', '120648', '14'), +('15', '82', '5', '102551', '114995', '14'), +('15', '82', '8', '102601', '142517', '14'), +('15', '82', '8', '102629', '132736', '14'), +('15', '82', '8', '102552', '125254', '14'), +('15', '82', '8', '80677', '96829', '14'), +('15', '82', '6', '102600', '132584', '14'), +('15', '82', '6', '102628', '132178', '14'), +('15', '82', '6', '102558', '116477', '14'), +('15', '82', '6', '80638', '97469', '14'), +('15', '82', '17', '102020', '90896', '14'), +('15', '82', '17', '102272', '82531', '14'), +('15', '82', '17', '70956', '82007', '14'), +('15', '82', '17', '53464', '79693', '14'), +('15', '82', '7', '102018', '86520', '14'), +('15', '82', '7', '102270', '78339', '14'), +('15', '82', '7', '53460', '76225', '14'), +('15', '82', '7', '39357', '62779', '14'), +('15', '82', '9', '67098', '226427', '14'), +('15', '82', '9', '46888', '82995', '14'), +('15', '82', '9', '53461', '76027', '14'), +('15', '82', '9', '102289', '71002', '14'), +('15', '82', '15', '102630', '127646', '14'), +('15', '82', '15', '102636', '127387', '14'), +('15', '82', '15', '102602', '127004', '14'), +('15', '82', '15', '102637', '126338', '14'), +('15', '82', '20', '102631', '142660', '14'), +('15', '82', '20', '102603', '141916', '14'), +('15', '82', '20', '102553', '124379', '14'), +('15', '82', '20', '80678', '105869', '14'), +('15', '82', '12', '53462', '84090', '14'), +('15', '82', '12', '102267', '73421', '14'), +('15', '82', '12', '83570', '54357', '14'), +('15', '82', '12', '47214', '52446', '14'), +('15', '82', '18', '102019', '88268', '14'), +('15', '82', '18', '102271', '79924', '14'), +('15', '82', '18', '53465', '78453', '14'), +('15', '82', '18', '83609', '64154', '14'), +('15', '82', '19', '76131', '79559', '14'), +('15', '82', '19', '53463', '76467', '14'), +('15', '82', '19', '102268', '74360', '14'), +('15', '82', '19', '39279', '57360', '14'), +('15', '82', '13', '102720', '227259', '14'), +('15', '82', '13', '102665', '224950', '14'), +('15', '82', '13', '102660', '220369', '14'), +('15', '82', '13', '102655', '219972', '14'), +('15', '82', '14', '102720', '227259', '14'), +('15', '82', '14', '102665', '224950', '14'), +('15', '82', '14', '102660', '220369', '14'), +('15', '82', '14', '102661', '220211', '14'), +('15', '82', '11', '102643', '127802', '14'), +('15', '82', '11', '102747', '118362', '14'), +('15', '82', '11', '80668', '92989', '14'), +('15', '82', '11', '102747', '90310', '14'), +('15', '83', '22', '61948', '0', '14'), +('15', '83', '22', '66397', '0', '14'), +('15', '83', '22', '21805', '0', '14'), +('15', '83', '22', '21807', '0', '14'), +('15', '83', '1', '102641', '125472', '14'), +('15', '83', '1', '102597', '125002', '14'), +('15', '83', '1', '102625', '124930', '14'), +('15', '83', '1', '102639', '124169', '14'), +('15', '83', '2', '102017', '85522', '14'), +('15', '83', '2', '102269', '76944', '14'), +('15', '83', '2', '53459', '75452', '14'), +('15', '83', '2', '70951', '61337', '14'), +('15', '83', '3', '102726', '136594', '14'), +('15', '83', '3', '102598', '133263', '14'), +('15', '83', '3', '102626', '132745', '14'), +('15', '83', '3', '102725', '118740', '14'), +('15', '83', '5', '102599', '131766', '14'), +('15', '83', '5', '102627', '129013', '14'), +('15', '83', '5', '102745', '120653', '14'), +('15', '83', '5', '102551', '114999', '14'), +('15', '83', '8', '102601', '142524', '14'), +('15', '83', '8', '102629', '132741', '14'), +('15', '83', '8', '102552', '125259', '14'), +('15', '83', '8', '80677', '96835', '14'), +('15', '83', '6', '102600', '132589', '14'), +('15', '83', '6', '102628', '132184', '14'), +('15', '83', '6', '102558', '116483', '14'), +('15', '83', '6', '80638', '97475', '14'), +('15', '83', '17', '102020', '90899', '14'), +('15', '83', '17', '102272', '82536', '14'), +('15', '83', '17', '53464', '79695', '14'), +('15', '83', '17', '70956', '79262', '14'), +('15', '83', '7', '102018', '86526', '14'), +('15', '83', '7', '102270', '78344', '14'), +('15', '83', '7', '53460', '76231', '14'), +('15', '83', '7', '39357', '62783', '14'), +('15', '83', '9', '67098', '229193', '14'), +('15', '83', '9', '46888', '83002', '14'), +('15', '83', '9', '53461', '76032', '14'), +('15', '83', '9', '102289', '71005', '14'), +('15', '83', '15', '102630', '127651', '14'), +('15', '83', '15', '102636', '127393', '14'), +('15', '83', '15', '102602', '127009', '14'), +('15', '83', '15', '102637', '126342', '14'), +('15', '83', '20', '102631', '142667', '14'), +('15', '83', '20', '102603', '141922', '14'), +('15', '83', '20', '102553', '124384', '14'), +('15', '83', '20', '80678', '105876', '14'), +('15', '83', '12', '53462', '84094', '14'), +('15', '83', '12', '102267', '73424', '14'), +('15', '83', '12', '83570', '54363', '14'), +('15', '83', '12', '47214', '52448', '14'), +('15', '83', '18', '102019', '88273', '14'), +('15', '83', '18', '102271', '79930', '14'), +('15', '83', '18', '53465', '78458', '14'), +('15', '83', '18', '83609', '64159', '14'), +('15', '83', '19', '76131', '79560', '14'), +('15', '83', '19', '53463', '76470', '14'), +('15', '83', '19', '102268', '74364', '14'), +('15', '83', '19', '39279', '57364', '14'), +('15', '83', '13', '102720', '227401', '14'), +('15', '83', '13', '102665', '225116', '14'), +('15', '83', '13', '102660', '220533', '14'), +('15', '83', '13', '102655', '220138', '14'), +('15', '83', '14', '102720', '227401', '14'), +('15', '83', '14', '102665', '225116', '14'), +('15', '83', '14', '102660', '220533', '14'), +('15', '83', '14', '102661', '220376', '14'), +('15', '83', '11', '102643', '127805', '14'), +('15', '83', '11', '102747', '118366', '14'), +('15', '83', '11', '80668', '92996', '14'), +('15', '83', '11', '102747', '90312', '14'), +('15', '84', '22', '61948', '0', '14'), +('15', '84', '22', '66397', '0', '14'), +('15', '84', '22', '21805', '0', '14'), +('15', '84', '22', '21807', '0', '14'), +('15', '84', '1', '102641', '125477', '14'), +('15', '84', '1', '102597', '125008', '14'), +('15', '84', '1', '102625', '124936', '14'), +('15', '84', '1', '102639', '124175', '14'), +('15', '84', '2', '102017', '85527', '14'), +('15', '84', '2', '102269', '76948', '14'), +('15', '84', '2', '53459', '75455', '14'), +('15', '84', '2', '70951', '61340', '14'), +('15', '84', '3', '102726', '136599', '14'), +('15', '84', '3', '102598', '133268', '14'), +('15', '84', '3', '102626', '132751', '14'), +('15', '84', '3', '102725', '118745', '14'), +('15', '84', '5', '102599', '131771', '14'), +('15', '84', '5', '102627', '129017', '14'), +('15', '84', '5', '102745', '120658', '14'), +('15', '84', '5', '102551', '115002', '14'), +('15', '84', '8', '102601', '142530', '14'), +('15', '84', '8', '102629', '132745', '14'), +('15', '84', '8', '102552', '125265', '14'), +('15', '84', '8', '80677', '96842', '14'), +('15', '84', '6', '102600', '132595', '14'), +('15', '84', '6', '102628', '132189', '14'), +('15', '84', '6', '102558', '116490', '14'), +('15', '84', '6', '80638', '97481', '14'), +('15', '84', '17', '102020', '90903', '14'), +('15', '84', '17', '102272', '82542', '14'), +('15', '84', '17', '53464', '79698', '14'), +('15', '84', '17', '70956', '76517', '14'), +('15', '84', '7', '102018', '86533', '14'), +('15', '84', '7', '102270', '78348', '14'), +('15', '84', '7', '53460', '76236', '14'), +('15', '84', '7', '39357', '62787', '14'), +('15', '84', '9', '67098', '231959', '14'), +('15', '84', '9', '46888', '83008', '14'), +('15', '84', '9', '53461', '76037', '14'), +('15', '84', '9', '102289', '71009', '14'), +('15', '84', '15', '102630', '127655', '14'), +('15', '84', '15', '102636', '127399', '14'), +('15', '84', '15', '102602', '127015', '14'), +('15', '84', '15', '102637', '126346', '14'), +('15', '84', '20', '102631', '142675', '14'), +('15', '84', '20', '102603', '141927', '14'), +('15', '84', '20', '102553', '124389', '14'), +('15', '84', '20', '80678', '105882', '14'), +('15', '84', '12', '53462', '84099', '14'), +('15', '84', '12', '102267', '73428', '14'), +('15', '84', '12', '83570', '54368', '14'), +('15', '84', '12', '47214', '52451', '14'), +('15', '84', '18', '102019', '88278', '14'), +('15', '84', '18', '102271', '79936', '14'), +('15', '84', '18', '53465', '78463', '14'), +('15', '84', '18', '83609', '64165', '14'), +('15', '84', '19', '76131', '79562', '14'), +('15', '84', '19', '53463', '76473', '14'), +('15', '84', '19', '102268', '74369', '14'), +('15', '84', '19', '39279', '57367', '14'), +('15', '84', '13', '102720', '227543', '14'), +('15', '84', '13', '102665', '225282', '14'), +('15', '84', '13', '102660', '220697', '14'), +('15', '84', '13', '102655', '220305', '14'), +('15', '84', '14', '102720', '227543', '14'), +('15', '84', '14', '102665', '225282', '14'), +('15', '84', '14', '102660', '220697', '14'), +('15', '84', '14', '102661', '220542', '14'), +('15', '84', '11', '102643', '127808', '14'), +('15', '84', '11', '102747', '118371', '14'), +('15', '84', '11', '80668', '93002', '14'), +('15', '84', '11', '102747', '90313', '14'), +('15', '85', '22', '21805', '0', '16'), +('15', '85', '22', '61948', '0', '16'), +('15', '85', '22', '21807', '0', '16'), +('15', '85', '22', '12425', '0', '16'), +('15', '85', '1', '111303', '240925', '16'), +('15', '85', '1', '111300', '240860', '16'), +('15', '85', '1', '111302', '240136', '16'), +('15', '85', '1', '111306', '239600', '16'), +('15', '85', '2', '94056', '153426', '16'), +('15', '85', '2', '62985', '152029', '16'), +('15', '85', '2', '104417', '128829', '16'), +('15', '85', '2', '54846', '97719', '16'), +('15', '85', '3', '111315', '241154', '16'), +('15', '85', '3', '111313', '240628', '16'), +('15', '85', '3', '111316', '238455', '16'), +('15', '85', '3', '111014', '211439', '16'), +('15', '85', '5', '111317', '241545', '16'), +('15', '85', '5', '111321', '240563', '16'), +('15', '85', '5', '111318', '240098', '16'), +('15', '85', '5', '111319', '238012', '16'), +('15', '85', '8', '111331', '242474', '16'), +('15', '85', '8', '111332', '239554', '16'), +('15', '85', '8', '111329', '238350', '16'), +('15', '85', '8', '111030', '212834', '16'), +('15', '85', '6', '111325', '241310', '16'), +('15', '85', '6', '111322', '240446', '16'), +('15', '85', '6', '111326', '237833', '16'), +('15', '85', '6', '111024', '211595', '16'), +('15', '85', '17', '56084', '157186', '16'), +('15', '85', '17', '56045', '154340', '16'), +('15', '85', '17', '104420', '132997', '16'), +('15', '85', '17', '54855', '100961', '16'), +('15', '85', '7', '56079', '152158', '16'), +('15', '85', '7', '56040', '150601', '16'), +('15', '85', '7', '104418', '127297', '16'), +('15', '85', '7', '54850', '97009', '16'), +('15', '85', '9', '67098', '234725', '16'), +('15', '85', '9', '56033', '148478', '16'), +('15', '85', '9', '56070', '148373', '16'), +('15', '85', '9', '56031', '148309', '16'), +('15', '85', '15', '111348', '242413', '16'), +('15', '85', '15', '111343', '241561', '16'), +('15', '85', '15', '111342', '241544', '16'), +('15', '85', '15', '111346', '239800', '16'), +('15', '85', '20', '111355', '250318', '16'), +('15', '85', '20', '111351', '248913', '16'), +('15', '85', '20', '111352', '248609', '16'), +('15', '85', '20', '111053', '220678', '16'), +('15', '85', '12', '81795', '148574', '16'), +('15', '85', '12', '56074', '146978', '16'), +('15', '85', '12', '104415', '126482', '16'), +('15', '85', '12', '49656', '95970', '16'), +('15', '85', '18', '62986', '155981', '16'), +('15', '85', '18', '56041', '155783', '16'), +('15', '85', '18', '104419', '133247', '16'), +('15', '85', '18', '54851', '98130', '16'), +('15', '85', '19', '62990', '154642', '16'), +('15', '85', '19', '56037', '153483', '16'), +('15', '85', '19', '56075', '151626', '16'), +('15', '85', '19', '81763', '150694', '16'), +('15', '85', '13', '111871', '397916', '16'), +('15', '85', '13', '111815', '393898', '16'), +('15', '85', '13', '111527', '381952', '16'), +('15', '85', '13', '111515', '374960', '16'), +('15', '85', '14', '111871', '397916', '16'), +('15', '85', '14', '111815', '393898', '16'), +('15', '85', '14', '111527', '381952', '16'), +('15', '85', '14', '111515', '374960', '16'), +('15', '85', '11', '111338', '241158', '16'), +('15', '85', '11', '111335', '239784', '16'), +('15', '85', '11', '111333', '239758', '16'), +('15', '85', '11', '111337', '238959', '16'), +('15', '85', '22', '21805', '0', '15'), +('15', '85', '22', '61948', '0', '15'), +('15', '85', '22', '21807', '0', '15'), +('15', '85', '22', '12425', '0', '15'), +('15', '85', '1', '107054', '178585', '15'), +('15', '85', '1', '107053', '176289', '15'), +('15', '85', '1', '107019', '174609', '15'), +('15', '85', '1', '107052', '172954', '15'), +('15', '85', '2', '94056', '153426', '15'), +('15', '85', '2', '62985', '152029', '15'), +('15', '85', '2', '104417', '128829', '15'), +('15', '85', '2', '54846', '97719', '15'), +('15', '85', '3', '107020', '179695', '15'), +('15', '85', '3', '107055', '179333', '15'), +('15', '85', '3', '106810', '166949', '15'), +('15', '85', '3', '106841', '166853', '15'), +('15', '85', '5', '107021', '177978', '15'), +('15', '85', '5', '107056', '176990', '15'), +('15', '85', '5', '106811', '165563', '15'), +('15', '85', '5', '106725', '150769', '15'), +('15', '85', '8', '107023', '183459', '15'), +('15', '85', '8', '107058', '182090', '15'), +('15', '85', '8', '106813', '170941', '15'), +('15', '85', '8', '106844', '168682', '15'), +('15', '85', '6', '107022', '181265', '15'), +('15', '85', '6', '107057', '179154', '15'), +('15', '85', '6', '106812', '178581', '15'), +('15', '85', '6', '106843', '175985', '15'), +('15', '85', '17', '56084', '157186', '15'), +('15', '85', '17', '56045', '154340', '15'), +('15', '85', '17', '104420', '132997', '15'), +('15', '85', '17', '54855', '100961', '15'), +('15', '85', '7', '56079', '152158', '15'), +('15', '85', '7', '56040', '150601', '15'), +('15', '85', '7', '104418', '127297', '15'), +('15', '85', '7', '54850', '97009', '15'), +('15', '85', '9', '67098', '234725', '15'), +('15', '85', '9', '56033', '148478', '15'), +('15', '85', '9', '56070', '148373', '15'), +('15', '85', '9', '56031', '148309', '15'), +('15', '85', '15', '107025', '181076', '15'), +('15', '85', '15', '107062', '176624', '15'), +('15', '85', '15', '107051', '175689', '15'), +('15', '85', '15', '107050', '172881', '15'), +('15', '85', '20', '107026', '191035', '15'), +('15', '85', '20', '107059', '190321', '15'), +('15', '85', '20', '106816', '178799', '15'), +('15', '85', '20', '106845', '177321', '15'), +('15', '85', '12', '81795', '148574', '15'), +('15', '85', '12', '56074', '146978', '15'), +('15', '85', '12', '104415', '126482', '15'), +('15', '85', '12', '53462', '84103', '15'), +('15', '85', '18', '62986', '155981', '15'), +('15', '85', '18', '56041', '155783', '15'), +('15', '85', '18', '104419', '133247', '15'), +('15', '85', '18', '54851', '98130', '15'), +('15', '85', '19', '62990', '154642', '15'), +('15', '85', '19', '56037', '153483', '15'), +('15', '85', '19', '56075', '151626', '15'), +('15', '85', '19', '81763', '150694', '15'), +('15', '85', '13', '106761', '314162', '15'), +('15', '85', '13', '106868', '283874', '15'), +('15', '85', '13', '106867', '283530', '15'), +('15', '85', '13', '106858', '282175', '15'), +('15', '85', '14', '106761', '314162', '15'), +('15', '85', '14', '106868', '283874', '15'), +('15', '85', '14', '106867', '283530', '15'), +('15', '85', '14', '106858', '282175', '15'), +('15', '85', '11', '107024', '183060', '15'), +('15', '85', '11', '106814', '170241', '15'), +('15', '85', '11', '62965', '153470', '15'), +('15', '85', '11', '56099', '148697', '15'), +('15', '86', '22', '21805', '0', '16'), +('15', '86', '22', '61948', '0', '16'), +('15', '86', '22', '21807', '0', '16'), +('15', '86', '22', '12425', '0', '16'), +('15', '86', '1', '111303', '240930', '16'), +('15', '86', '1', '111300', '240865', '16'), +('15', '86', '1', '111302', '240142', '16'), +('15', '86', '1', '111306', '239606', '16'), +('15', '86', '2', '94056', '153431', '16'), +('15', '86', '2', '62985', '152034', '16'), +('15', '86', '2', '104417', '128833', '16'), +('15', '86', '2', '54846', '97724', '16'), +('15', '86', '3', '111315', '241161', '16'), +('15', '86', '3', '111313', '240634', '16'), +('15', '86', '3', '111316', '238460', '16'), +('15', '86', '3', '111014', '211446', '16'), +('15', '86', '5', '111317', '241552', '16'), +('15', '86', '5', '111321', '240569', '16'), +('15', '86', '5', '111318', '240103', '16'), +('15', '86', '5', '111319', '238018', '16'), +('15', '86', '8', '111331', '242481', '16'), +('15', '86', '8', '111332', '239560', '16'), +('15', '86', '8', '111329', '238355', '16'), +('15', '86', '8', '111030', '212841', '16'), +('15', '86', '6', '111325', '241315', '16'), +('15', '86', '6', '111322', '240450', '16'), +('15', '86', '6', '111326', '237840', '16'), +('15', '86', '6', '111024', '211600', '16'), +('15', '86', '17', '56084', '157195', '16'), +('15', '86', '17', '56045', '154345', '16'), +('15', '86', '17', '104420', '133004', '16'), +('15', '86', '17', '54855', '100966', '16'), +('15', '86', '7', '56079', '152164', '16'), +('15', '86', '7', '56040', '150607', '16'), +('15', '86', '7', '104418', '127302', '16'), +('15', '86', '7', '54850', '97013', '16'), +('15', '86', '9', '67098', '237491', '16'), +('15', '86', '9', '56033', '148482', '16'), +('15', '86', '9', '56070', '148378', '16'), +('15', '86', '9', '56031', '148313', '16'), +('15', '86', '15', '111348', '242420', '16'), +('15', '86', '15', '111343', '241566', '16'), +('15', '86', '15', '111342', '241551', '16'), +('15', '86', '15', '111346', '239804', '16'), +('15', '86', '20', '111355', '250322', '16'), +('15', '86', '20', '111351', '248918', '16'), +('15', '86', '20', '111352', '248615', '16'), +('15', '86', '20', '111053', '220682', '16'), +('15', '86', '12', '81795', '148579', '16'), +('15', '86', '12', '56074', '146982', '16'), +('15', '86', '12', '104415', '126487', '16'), +('15', '86', '12', '49656', '95971', '16'), +('15', '86', '18', '62986', '155988', '16'), +('15', '86', '18', '56041', '155788', '16'), +('15', '86', '18', '104419', '133254', '16'), +('15', '86', '18', '54851', '98136', '16'), +('15', '86', '19', '62990', '154647', '16'), +('15', '86', '19', '56037', '153489', '16'), +('15', '86', '19', '56075', '151632', '16'), +('15', '86', '19', '81763', '150701', '16'), +('15', '86', '13', '111871', '398215', '16'), +('15', '86', '13', '111815', '394197', '16'), +('15', '86', '13', '111527', '382251', '16'), +('15', '86', '13', '111515', '375258', '16'), +('15', '86', '14', '111871', '398215', '16'), +('15', '86', '14', '111815', '394197', '16'), +('15', '86', '14', '111527', '382251', '16'), +('15', '86', '14', '111515', '375258', '16'), +('15', '86', '11', '111338', '241164', '16'), +('15', '86', '11', '111335', '239790', '16'), +('15', '86', '11', '111333', '239762', '16'), +('15', '86', '11', '111337', '238966', '16'), +('15', '87', '22', '21805', '0', '16'), +('15', '87', '22', '61948', '0', '16'), +('15', '87', '22', '21807', '0', '16'), +('15', '87', '22', '12425', '0', '16'), +('15', '87', '1', '111303', '240936', '16'), +('15', '87', '1', '111300', '240870', '16'), +('15', '87', '1', '111302', '240149', '16'), +('15', '87', '1', '111306', '239613', '16'), +('15', '87', '2', '94056', '153436', '16'), +('15', '87', '2', '62985', '152040', '16'), +('15', '87', '2', '104417', '128837', '16'), +('15', '87', '2', '54846', '97729', '16'), +('15', '87', '3', '111315', '241168', '16'), +('15', '87', '3', '111313', '240639', '16'), +('15', '87', '3', '111316', '238466', '16'), +('15', '87', '3', '111014', '211453', '16'), +('15', '87', '5', '111317', '241558', '16'), +('15', '87', '5', '111321', '240575', '16'), +('15', '87', '5', '111318', '240107', '16'), +('15', '87', '5', '111319', '238024', '16'), +('15', '87', '8', '111331', '242488', '16'), +('15', '87', '8', '111332', '239565', '16'), +('15', '87', '8', '111329', '238360', '16'), +('15', '87', '8', '111030', '212848', '16'), +('15', '87', '6', '111325', '241320', '16'), +('15', '87', '6', '111322', '240453', '16'), +('15', '87', '6', '111326', '237847', '16'), +('15', '87', '6', '111024', '211605', '16'), +('15', '87', '17', '56084', '157202', '16'), +('15', '87', '17', '56045', '154349', '16'), +('15', '87', '17', '104420', '133010', '16'), +('15', '87', '17', '54855', '100970', '16'), +('15', '87', '7', '56079', '152169', '16'), +('15', '87', '7', '56040', '150613', '16'), +('15', '87', '7', '104418', '127308', '16'), +('15', '87', '7', '54850', '97016', '16'), +('15', '87', '9', '67098', '240257', '16'), +('15', '87', '9', '56033', '148486', '16'), +('15', '87', '9', '56070', '148382', '16'), +('15', '87', '9', '56031', '148317', '16'), +('15', '87', '15', '111348', '242426', '16'), +('15', '87', '15', '111343', '241571', '16'), +('15', '87', '15', '111342', '241557', '16'), +('15', '87', '15', '111346', '239809', '16'), +('15', '87', '20', '111355', '250326', '16'), +('15', '87', '20', '111351', '248923', '16'), +('15', '87', '20', '111352', '248621', '16'), +('15', '87', '20', '111053', '220686', '16'), +('15', '87', '12', '81795', '148584', '16'), +('15', '87', '12', '56074', '146987', '16'), +('15', '87', '12', '104415', '126491', '16'), +('15', '87', '12', '49656', '95972', '16'), +('15', '87', '18', '62986', '155995', '16'), +('15', '87', '18', '56041', '155792', '16'), +('15', '87', '18', '104419', '133262', '16'), +('15', '87', '18', '54851', '98141', '16'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '87', '19', '62990', '154651', '16'), +('15', '87', '19', '56037', '153495', '16'), +('15', '87', '19', '56075', '151638', '16'), +('15', '87', '19', '81763', '150708', '16'), +('15', '87', '13', '111871', '398514', '16'), +('15', '87', '13', '111815', '394496', '16'), +('15', '87', '13', '111527', '382549', '16'), +('15', '87', '13', '111515', '375557', '16'), +('15', '87', '14', '111871', '398514', '16'), +('15', '87', '14', '111815', '394496', '16'), +('15', '87', '14', '111527', '382549', '16'), +('15', '87', '14', '111515', '375557', '16'), +('15', '87', '11', '111338', '241169', '16'), +('15', '87', '11', '111335', '239796', '16'), +('15', '87', '11', '111333', '239765', '16'), +('15', '87', '11', '111337', '238972', '16'), +('15', '88', '22', '21805', '0', '16'), +('15', '88', '22', '61948', '0', '16'), +('15', '88', '22', '21807', '0', '16'), +('15', '88', '22', '12425', '0', '16'), +('15', '88', '1', '111303', '240941', '16'), +('15', '88', '1', '111300', '240874', '16'), +('15', '88', '1', '111302', '240155', '16'), +('15', '88', '1', '111306', '239619', '16'), +('15', '88', '2', '94056', '153441', '16'), +('15', '88', '2', '62985', '152045', '16'), +('15', '88', '2', '104417', '128841', '16'), +('15', '88', '2', '54846', '97734', '16'), +('15', '88', '3', '111315', '241174', '16'), +('15', '88', '3', '111313', '240644', '16'), +('15', '88', '3', '111316', '238471', '16'), +('15', '88', '3', '111014', '211459', '16'), +('15', '88', '5', '111317', '241563', '16'), +('15', '88', '5', '111321', '240581', '16'), +('15', '88', '5', '111318', '240111', '16'), +('15', '88', '5', '111319', '238030', '16'), +('15', '88', '8', '111331', '242494', '16'), +('15', '88', '8', '111332', '239570', '16'), +('15', '88', '8', '111329', '238365', '16'), +('15', '88', '8', '111030', '212854', '16'), +('15', '88', '6', '111325', '241325', '16'), +('15', '88', '6', '111322', '240457', '16'), +('15', '88', '6', '111326', '237854', '16'), +('15', '88', '6', '111024', '211610', '16'), +('15', '88', '17', '56084', '157210', '16'), +('15', '88', '17', '56045', '154354', '16'), +('15', '88', '17', '104420', '133017', '16'), +('15', '88', '17', '54855', '100974', '16'), +('15', '88', '7', '56079', '152175', '16'), +('15', '88', '7', '56040', '150618', '16'), +('15', '88', '7', '104418', '127313', '16'), +('15', '88', '7', '54850', '97019', '16'), +('15', '88', '9', '67098', '243024', '16'), +('15', '88', '9', '56033', '148490', '16'), +('15', '88', '9', '56070', '148386', '16'), +('15', '88', '9', '56031', '148322', '16'), +('15', '88', '15', '111348', '242432', '16'), +('15', '88', '15', '111343', '241576', '16'), +('15', '88', '15', '111342', '241563', '16'), +('15', '88', '15', '111346', '239814', '16'), +('15', '88', '20', '111355', '250330', '16'), +('15', '88', '20', '111351', '248928', '16'), +('15', '88', '20', '111352', '248627', '16'), +('15', '88', '20', '111053', '220690', '16'), +('15', '88', '12', '81795', '148589', '16'), +('15', '88', '12', '56074', '146991', '16'), +('15', '88', '12', '104415', '126496', '16'), +('15', '88', '12', '49656', '95972', '16'), +('15', '88', '18', '62986', '156002', '16'), +('15', '88', '18', '56041', '155796', '16'), +('15', '88', '18', '104419', '133269', '16'), +('15', '88', '18', '54851', '98147', '16'), +('15', '88', '19', '62990', '154656', '16'), +('15', '88', '19', '56037', '153501', '16'), +('15', '88', '19', '56075', '151645', '16'), +('15', '88', '19', '81763', '150715', '16'), +('15', '88', '13', '111871', '398813', '16'), +('15', '88', '13', '111815', '394795', '16'), +('15', '88', '13', '111527', '382848', '16'), +('15', '88', '13', '111515', '375855', '16'), +('15', '88', '14', '111871', '398813', '16'), +('15', '88', '14', '111815', '394795', '16'), +('15', '88', '14', '111527', '382848', '16'), +('15', '88', '14', '111515', '375855', '16'), +('15', '88', '11', '111338', '241174', '16'), +('15', '88', '11', '111335', '239802', '16'), +('15', '88', '11', '111333', '239769', '16'), +('15', '88', '11', '111337', '238979', '16'), +('15', '89', '22', '21805', '0', '16'), +('15', '89', '22', '61948', '0', '16'), +('15', '89', '22', '21807', '0', '16'), +('15', '89', '22', '12425', '0', '16'), +('15', '89', '1', '111303', '240947', '16'), +('15', '89', '1', '111300', '240879', '16'), +('15', '89', '1', '111302', '240162', '16'), +('15', '89', '1', '111306', '239626', '16'), +('15', '89', '2', '94056', '153446', '16'), +('15', '89', '2', '62985', '152051', '16'), +('15', '89', '2', '104417', '128845', '16'), +('15', '89', '2', '54846', '97739', '16'), +('15', '89', '3', '111315', '241181', '16'), +('15', '89', '3', '111313', '240650', '16'), +('15', '89', '3', '111316', '238477', '16'), +('15', '89', '3', '111014', '211466', '16'), +('15', '89', '5', '111317', '241570', '16'), +('15', '89', '5', '111321', '240587', '16'), +('15', '89', '5', '111318', '240116', '16'), +('15', '89', '5', '111319', '238036', '16'), +('15', '89', '8', '111331', '242501', '16'), +('15', '89', '8', '111332', '239576', '16'), +('15', '89', '8', '111329', '238370', '16'), +('15', '89', '8', '111030', '212861', '16'), +('15', '89', '6', '111325', '241330', '16'), +('15', '89', '6', '111322', '240461', '16'), +('15', '89', '6', '111326', '237861', '16'), +('15', '89', '6', '111024', '211615', '16'), +('15', '89', '17', '56084', '157218', '16'), +('15', '89', '17', '56045', '154358', '16'), +('15', '89', '17', '104420', '133024', '16'), +('15', '89', '17', '54855', '100979', '16'), +('15', '89', '7', '56079', '152181', '16'), +('15', '89', '7', '56040', '150624', '16'), +('15', '89', '7', '104418', '127318', '16'), +('15', '89', '7', '54850', '97022', '16'), +('15', '89', '9', '67098', '245791', '16'), +('15', '89', '9', '56033', '148495', '16'), +('15', '89', '9', '56070', '148390', '16'), +('15', '89', '9', '56031', '148326', '16'), +('15', '89', '15', '111348', '242439', '16'), +('15', '89', '15', '111343', '241581', '16'), +('15', '89', '15', '111342', '241570', '16'), +('15', '89', '15', '111346', '239818', '16'), +('15', '89', '20', '111355', '250334', '16'), +('15', '89', '20', '111351', '248933', '16'), +('15', '89', '20', '111352', '248633', '16'), +('15', '89', '20', '111053', '220694', '16'), +('15', '89', '12', '81795', '148595', '16'), +('15', '89', '12', '56074', '146996', '16'), +('15', '89', '12', '104415', '126501', '16'), +('15', '89', '12', '49656', '95973', '16'), +('15', '89', '18', '62986', '156010', '16'), +('15', '89', '18', '56041', '155800', '16'), +('15', '89', '18', '104419', '133276', '16'), +('15', '89', '18', '54851', '98153', '16'), +('15', '89', '19', '62990', '154661', '16'), +('15', '89', '19', '56037', '153507', '16'), +('15', '89', '19', '56075', '151651', '16'), +('15', '89', '19', '81763', '150722', '16'), +('15', '89', '13', '111871', '399112', '16'), +('15', '89', '13', '111815', '395094', '16'), +('15', '89', '13', '111527', '383147', '16'), +('15', '89', '13', '111515', '376154', '16'), +('15', '89', '14', '111871', '399112', '16'), +('15', '89', '14', '111815', '395094', '16'), +('15', '89', '14', '111527', '383147', '16'), +('15', '89', '14', '111515', '376154', '16'), +('15', '89', '11', '111338', '241180', '16'), +('15', '89', '11', '111335', '239808', '16'), +('15', '89', '11', '111333', '239773', '16'), +('15', '89', '11', '111337', '238986', '16'), +('15', '90', '22', '21805', '0', '17'), +('15', '90', '22', '61948', '0', '17'), +('15', '90', '22', '21807', '0', '17'), +('15', '90', '22', '12425', '0', '17'), +('15', '90', '1', '111303', '240952', '17'), +('15', '90', '1', '111300', '240883', '17'), +('15', '90', '1', '111302', '240168', '17'), +('15', '90', '1', '111306', '239632', '17'), +('15', '90', '2', '94056', '153451', '17'), +('15', '90', '2', '62985', '152057', '17'), +('15', '90', '2', '104417', '128849', '17'), +('15', '90', '2', '54846', '97744', '17'), +('15', '90', '3', '111315', '241188', '17'), +('15', '90', '3', '111313', '240655', '17'), +('15', '90', '3', '111316', '238482', '17'), +('15', '90', '3', '111014', '211473', '17'), +('15', '90', '5', '111317', '241576', '17'), +('15', '90', '5', '111321', '240593', '17'), +('15', '90', '5', '111318', '240120', '17'), +('15', '90', '5', '111319', '238041', '17'), +('15', '90', '8', '111331', '242507', '17'), +('15', '90', '8', '111332', '239581', '17'), +('15', '90', '8', '111329', '238375', '17'), +('15', '90', '8', '111030', '212867', '17'), +('15', '90', '6', '111325', '241334', '17'), +('15', '90', '6', '111322', '240465', '17'), +('15', '90', '6', '111326', '237867', '17'), +('15', '90', '6', '111024', '211619', '17'), +('15', '90', '17', '56084', '157226', '17'), +('15', '90', '17', '56045', '154363', '17'), +('15', '90', '17', '104420', '133031', '17'), +('15', '90', '17', '54855', '100983', '17'), +('15', '90', '7', '56079', '152186', '17'), +('15', '90', '7', '56040', '150630', '17'), +('15', '90', '7', '104418', '127324', '17'), +('15', '90', '7', '54850', '97025', '17'), +('15', '90', '9', '67098', '248557', '17'), +('15', '90', '9', '56033', '148499', '17'), +('15', '90', '9', '56070', '148394', '17'), +('15', '90', '9', '56031', '148330', '17'), +('15', '90', '15', '111348', '242446', '17'), +('15', '90', '15', '111343', '241586', '17'), +('15', '90', '15', '111342', '241576', '17'), +('15', '90', '15', '111346', '239823', '17'), +('15', '90', '20', '111355', '250338', '17'), +('15', '90', '20', '111351', '248938', '17'), +('15', '90', '20', '111352', '248639', '17'), +('15', '90', '20', '111053', '220698', '17'), +('15', '90', '12', '81795', '148600', '17'), +('15', '90', '12', '56074', '147000', '17'), +('15', '90', '12', '104415', '126505', '17'), +('15', '90', '12', '49656', '95974', '17'), +('15', '90', '18', '62986', '156017', '17'), +('15', '90', '18', '56041', '155804', '17'), +('15', '90', '18', '104419', '133284', '17'), +('15', '90', '18', '54851', '98159', '17'), +('15', '90', '19', '62990', '154665', '17'), +('15', '90', '19', '56037', '153513', '17'), +('15', '90', '19', '56075', '151658', '17'), +('15', '90', '19', '81763', '150729', '17'), +('15', '90', '13', '111871', '399411', '17'), +('15', '90', '13', '111815', '395393', '17'), +('15', '90', '13', '111527', '383446', '17'), +('15', '90', '13', '111515', '376452', '17'), +('15', '90', '14', '111871', '399411', '17'), +('15', '90', '14', '111815', '395393', '17'), +('15', '90', '14', '111527', '383446', '17'), +('15', '90', '14', '111515', '376452', '17'), +('15', '90', '11', '111338', '241185', '17'), +('15', '90', '11', '111335', '239814', '17'), +('15', '90', '11', '111333', '239777', '17'), +('15', '90', '11', '111337', '238993', '17'), +('15', '91', '22', '21805', '0', '17'), +('15', '91', '22', '61948', '0', '17'), +('15', '91', '22', '21807', '0', '17'), +('15', '91', '22', '12425', '0', '17'), +('15', '91', '1', '111303', '240957', '17'), +('15', '91', '1', '111300', '240888', '17'), +('15', '91', '1', '111302', '240175', '17'), +('15', '91', '1', '111306', '239639', '17'), +('15', '91', '2', '94056', '153456', '17'), +('15', '91', '2', '62985', '152062', '17'), +('15', '91', '2', '104417', '128853', '17'), +('15', '91', '2', '54846', '97749', '17'), +('15', '91', '3', '111315', '241195', '17'), +('15', '91', '3', '111313', '240660', '17'), +('15', '91', '3', '111316', '238488', '17'), +('15', '91', '3', '111014', '211480', '17'), +('15', '91', '5', '111317', '241582', '17'), +('15', '91', '5', '111321', '240599', '17'), +('15', '91', '5', '111318', '240125', '17'), +('15', '91', '5', '111319', '238047', '17'), +('15', '91', '8', '111331', '242514', '17'), +('15', '91', '8', '111332', '239586', '17'), +('15', '91', '8', '111329', '238380', '17'), +('15', '91', '8', '111030', '212874', '17'), +('15', '91', '6', '111325', '241339', '17'), +('15', '91', '6', '111322', '240469', '17'), +('15', '91', '6', '111326', '237874', '17'), +('15', '91', '6', '111024', '211624', '17'), +('15', '91', '17', '56084', '157234', '17'), +('15', '91', '17', '56045', '154367', '17'), +('15', '91', '17', '104420', '133037', '17'), +('15', '91', '17', '54855', '100987', '17'), +('15', '91', '7', '56079', '152192', '17'), +('15', '91', '7', '56040', '150636', '17'), +('15', '91', '7', '104418', '127329', '17'), +('15', '91', '7', '54850', '97028', '17'), +('15', '91', '9', '67098', '248562', '17'), +('15', '91', '9', '56033', '148503', '17'), +('15', '91', '9', '56070', '148398', '17'), +('15', '91', '9', '56031', '148334', '17'), +('15', '91', '15', '111348', '242452', '17'), +('15', '91', '15', '111343', '241591', '17'), +('15', '91', '15', '111342', '241582', '17'), +('15', '91', '15', '111346', '239827', '17'), +('15', '91', '20', '111355', '250342', '17'), +('15', '91', '20', '111351', '248943', '17'), +('15', '91', '20', '111352', '248644', '17'), +('15', '91', '20', '111053', '220702', '17'), +('15', '91', '12', '81795', '148605', '17'), +('15', '91', '12', '56074', '147004', '17'), +('15', '91', '12', '104415', '126510', '17'), +('15', '91', '12', '49656', '95975', '17'), +('15', '91', '18', '62986', '156024', '17'), +('15', '91', '18', '56041', '155808', '17'), +('15', '91', '18', '104419', '133291', '17'), +('15', '91', '18', '54851', '98165', '17'), +('15', '91', '19', '62990', '154670', '17'), +('15', '91', '19', '56037', '153519', '17'), +('15', '91', '19', '56075', '151664', '17'), +('15', '91', '19', '81763', '150736', '17'), +('15', '91', '13', '111871', '399710', '17'), +('15', '91', '13', '111815', '395691', '17'), +('15', '91', '13', '111527', '383744', '17'), +('15', '91', '13', '111515', '376751', '17'), +('15', '91', '14', '111871', '399710', '17'), +('15', '91', '14', '111815', '395691', '17'), +('15', '91', '14', '111527', '383744', '17'), +('15', '91', '14', '111515', '376751', '17'), +('15', '91', '11', '111338', '241190', '17'), +('15', '91', '11', '111335', '239819', '17'), +('15', '91', '11', '111333', '239780', '17'), +('15', '91', '11', '111337', '239000', '17'), +('15', '92', '22', '21805', '0', '17'), +('15', '92', '22', '61948', '0', '17'), +('15', '92', '22', '21807', '0', '17'), +('15', '92', '22', '12425', '0', '17'), +('15', '92', '1', '111303', '240963', '17'), +('15', '92', '1', '111300', '240893', '17'), +('15', '92', '1', '111302', '240181', '17'), +('15', '92', '1', '111306', '239645', '17'), +('15', '92', '2', '94056', '153461', '17'), +('15', '92', '2', '62985', '152068', '17'), +('15', '92', '2', '104417', '128857', '17'), +('15', '92', '2', '54846', '97755', '17'), +('15', '92', '3', '111315', '241202', '17'), +('15', '92', '3', '111313', '240666', '17'), +('15', '92', '3', '111316', '238493', '17'), +('15', '92', '3', '111014', '211487', '17'), +('15', '92', '5', '111317', '241588', '17'), +('15', '92', '5', '111321', '240605', '17'), +('15', '92', '5', '111318', '240129', '17'), +('15', '92', '5', '111319', '238053', '17'), +('15', '92', '8', '111331', '242521', '17'), +('15', '92', '8', '111332', '239592', '17'), +('15', '92', '8', '111329', '238385', '17'), +('15', '92', '8', '111030', '212881', '17'), +('15', '92', '6', '111325', '241344', '17'), +('15', '92', '6', '111322', '240473', '17'), +('15', '92', '6', '111326', '237881', '17'), +('15', '92', '6', '111024', '211629', '17'), +('15', '92', '17', '56084', '157242', '17'), +('15', '92', '17', '56045', '154372', '17'), +('15', '92', '17', '104420', '133044', '17'), +('15', '92', '17', '54855', '100992', '17'), +('15', '92', '7', '56079', '152198', '17'), +('15', '92', '7', '56040', '150642', '17'), +('15', '92', '7', '104418', '127334', '17'), +('15', '92', '7', '54850', '97031', '17'), +('15', '92', '9', '67098', '248567', '17'), +('15', '92', '9', '56033', '148507', '17'), +('15', '92', '9', '56070', '148403', '17'), +('15', '92', '9', '56031', '148339', '17'), +('15', '92', '15', '111348', '242459', '17'), +('15', '92', '15', '111343', '241596', '17'), +('15', '92', '15', '111342', '241589', '17'), +('15', '92', '15', '111346', '239832', '17'), +('15', '92', '20', '111355', '250346', '17'), +('15', '92', '20', '111351', '248948', '17'), +('15', '92', '20', '111352', '248650', '17'), +('15', '92', '20', '111053', '220706', '17'), +('15', '92', '12', '81795', '148610', '17'), +('15', '92', '12', '56074', '147009', '17'), +('15', '92', '12', '104415', '126515', '17'), +('15', '92', '12', '49656', '95975', '17'), +('15', '92', '18', '62986', '156032', '17'), +('15', '92', '18', '56041', '155812', '17'), +('15', '92', '18', '104419', '133298', '17'), +('15', '92', '18', '54851', '98171', '17'), +('15', '92', '19', '62990', '154675', '17'), +('15', '92', '19', '56037', '153525', '17'), +('15', '92', '19', '56075', '151671', '17'), +('15', '92', '19', '81763', '150743', '17'), +('15', '92', '13', '111871', '400009', '17'), +('15', '92', '13', '111815', '395991', '17'), +('15', '92', '13', '111527', '384043', '17'), +('15', '92', '13', '111515', '377049', '17'), +('15', '92', '14', '111871', '400009', '17'), +('15', '92', '14', '111815', '395991', '17'), +('15', '92', '14', '111527', '384043', '17'), +('15', '92', '14', '111515', '377049', '17'), +('15', '92', '11', '111338', '241196', '17'), +('15', '92', '11', '111335', '239826', '17'), +('15', '92', '11', '111333', '239784', '17'), +('15', '92', '11', '111337', '239007', '17'), +('15', '93', '22', '21805', '0', '17'), +('15', '93', '22', '61948', '0', '17'), +('15', '93', '22', '21807', '0', '17'), +('15', '93', '22', '12425', '0', '17'), +('15', '93', '1', '111303', '240968', '17'), +('15', '93', '1', '111300', '240897', '17'), +('15', '93', '1', '111302', '240188', '17'), +('15', '93', '1', '111306', '239652', '17'), +('15', '93', '2', '94056', '153465', '17'), +('15', '93', '2', '62985', '152073', '17'), +('15', '93', '2', '104417', '128861', '17'), +('15', '93', '2', '54846', '97759', '17'), +('15', '93', '3', '111315', '241208', '17'), +('15', '93', '3', '111313', '240671', '17'), +('15', '93', '3', '111316', '238499', '17'), +('15', '93', '3', '111014', '211493', '17'), +('15', '93', '5', '111317', '241594', '17'), +('15', '93', '5', '111321', '240611', '17'), +('15', '93', '5', '111318', '240134', '17'), +('15', '93', '5', '111319', '238059', '17'), +('15', '93', '8', '111331', '242527', '17'), +('15', '93', '8', '111332', '239597', '17'), +('15', '93', '8', '111329', '238389', '17'), +('15', '93', '8', '111030', '212887', '17'), +('15', '93', '6', '111325', '241349', '17'), +('15', '93', '6', '111322', '240477', '17'), +('15', '93', '6', '111326', '237888', '17'), +('15', '93', '6', '111024', '211634', '17'), +('15', '93', '17', '56084', '157250', '17'), +('15', '93', '17', '56045', '154376', '17'), +('15', '93', '17', '104420', '133051', '17'), +('15', '93', '17', '54855', '100996', '17'), +('15', '93', '7', '56079', '152203', '17'), +('15', '93', '7', '56040', '150648', '17'), +('15', '93', '7', '104418', '127340', '17'), +('15', '93', '7', '54850', '97034', '17'), +('15', '93', '9', '67098', '248572', '17'), +('15', '93', '9', '56033', '148511', '17'), +('15', '93', '9', '56070', '148407', '17'), +('15', '93', '9', '56031', '148343', '17'), +('15', '93', '15', '111348', '242465', '17'), +('15', '93', '15', '111343', '241601', '17'), +('15', '93', '15', '111342', '241595', '17'), +('15', '93', '15', '111346', '239837', '17'), +('15', '93', '20', '111355', '250350', '17'), +('15', '93', '20', '111351', '248953', '17'), +('15', '93', '20', '111352', '248656', '17'), +('15', '93', '20', '111053', '220710', '17'), +('15', '93', '12', '81795', '148615', '17'), +('15', '93', '12', '56074', '147013', '17'), +('15', '93', '12', '104415', '126520', '17'), +('15', '93', '12', '49656', '95976', '17'), +('15', '93', '18', '62986', '156039', '17'), +('15', '93', '18', '56041', '155816', '17'), +('15', '93', '18', '104419', '133305', '17'), +('15', '93', '18', '54851', '98177', '17'), +('15', '93', '19', '62990', '154679', '17'), +('15', '93', '19', '56037', '153531', '17'), +('15', '93', '19', '56075', '151677', '17'), +('15', '93', '19', '81763', '150750', '17'), +('15', '93', '13', '111871', '400308', '17'), +('15', '93', '13', '111815', '396289', '17'), +('15', '93', '13', '111527', '384342', '17'), +('15', '93', '13', '111515', '377348', '17'), +('15', '93', '14', '111871', '400308', '17'), +('15', '93', '14', '111815', '396289', '17'), +('15', '93', '14', '111527', '384342', '17'), +('15', '93', '14', '111515', '377348', '17'), +('15', '93', '11', '111338', '241201', '17'), +('15', '93', '11', '111335', '239832', '17'), +('15', '93', '11', '111333', '239788', '17'), +('15', '93', '11', '111337', '239013', '17'), +('15', '94', '22', '21805', '0', '17'), +('15', '94', '22', '61948', '0', '17'), +('15', '94', '22', '21807', '0', '17'), +('15', '94', '22', '12425', '0', '17'), +('15', '94', '1', '111303', '240974', '17'), +('15', '94', '1', '111300', '240902', '17'), +('15', '94', '1', '111302', '240194', '17'), +('15', '94', '1', '111306', '239658', '17'), +('15', '94', '2', '94056', '153470', '17'), +('15', '94', '2', '62985', '152079', '17'), +('15', '94', '2', '104417', '128866', '17'), +('15', '94', '2', '54846', '97765', '17'), +('15', '94', '3', '111315', '241215', '17'), +('15', '94', '3', '111313', '240676', '17'), +('15', '94', '3', '111316', '238504', '17'), +('15', '94', '3', '111014', '211500', '17'), +('15', '94', '5', '111317', '241600', '17'), +('15', '94', '5', '111321', '240617', '17'), +('15', '94', '5', '111318', '240138', '17'), +('15', '94', '5', '111319', '238065', '17'), +('15', '94', '8', '111331', '242534', '17'), +('15', '94', '8', '111332', '239603', '17'), +('15', '94', '8', '111329', '238395', '17'), +('15', '94', '8', '111030', '212894', '17'), +('15', '94', '6', '111325', '241353', '17'), +('15', '94', '6', '111322', '240481', '17'), +('15', '94', '6', '111326', '237895', '17'), +('15', '94', '6', '111024', '211638', '17'), +('15', '94', '17', '56084', '157258', '17'), +('15', '94', '17', '56045', '154380', '17'), +('15', '94', '17', '104420', '133058', '17'), +('15', '94', '17', '54855', '101000', '17'), +('15', '94', '7', '56079', '152209', '17'), +('15', '94', '7', '56040', '150654', '17'), +('15', '94', '7', '104418', '127345', '17'), +('15', '94', '7', '54850', '97037', '17'), +('15', '94', '9', '67098', '248577', '17'), +('15', '94', '9', '56033', '148516', '17'), +('15', '94', '9', '56070', '148411', '17'), +('15', '94', '9', '56031', '148347', '17'), +('15', '94', '15', '111348', '242472', '17'), +('15', '94', '15', '111343', '241606', '17'), +('15', '94', '15', '111342', '241601', '17'), +('15', '94', '15', '111346', '239842', '17'), +('15', '94', '20', '111355', '250354', '17'), +('15', '94', '20', '111351', '248958', '17'), +('15', '94', '20', '111352', '248662', '17'), +('15', '94', '20', '111053', '220714', '17'), +('15', '94', '12', '81795', '148621', '17'), +('15', '94', '12', '56074', '147018', '17'), +('15', '94', '12', '104415', '126525', '17'), +('15', '94', '12', '49656', '95977', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '94', '18', '62986', '156046', '17'), +('15', '94', '18', '56041', '155820', '17'), +('15', '94', '18', '104419', '133313', '17'), +('15', '94', '18', '54851', '98183', '17'), +('15', '94', '19', '62990', '154684', '17'), +('15', '94', '19', '56037', '153537', '17'), +('15', '94', '19', '56075', '151683', '17'), +('15', '94', '19', '81763', '150757', '17'), +('15', '94', '13', '111871', '400607', '17'), +('15', '94', '13', '111815', '396588', '17'), +('15', '94', '13', '111527', '384641', '17'), +('15', '94', '13', '111515', '377646', '17'), +('15', '94', '14', '111871', '400607', '17'), +('15', '94', '14', '111815', '396588', '17'), +('15', '94', '14', '111527', '384641', '17'), +('15', '94', '14', '111515', '377646', '17'), +('15', '94', '11', '111338', '241207', '17'), +('15', '94', '11', '111335', '239838', '17'), +('15', '94', '11', '111333', '239792', '17'), +('15', '94', '11', '111337', '239020', '17'), +('15', '95', '22', '21807', '0', '18'), +('15', '95', '22', '21805', '0', '18'), +('15', '95', '22', '12425', '0', '18'), +('15', '95', '22', '7867', '0', '18'), +('15', '95', '1', '128691', '300345', '18'), +('15', '95', '1', '111303', '240979', '18'), +('15', '95', '1', '111300', '240907', '18'), +('15', '95', '1', '111302', '240201', '18'), +('15', '95', '2', '94056', '153475', '18'), +('15', '95', '2', '62985', '152085', '18'), +('15', '95', '2', '104417', '128869', '18'), +('15', '95', '2', '54846', '97770', '18'), +('15', '95', '3', '111315', '241222', '18'), +('15', '95', '3', '111313', '240682', '18'), +('15', '95', '3', '111316', '238510', '18'), +('15', '95', '3', '111014', '211507', '18'), +('15', '95', '5', '111317', '241606', '18'), +('15', '95', '5', '111321', '240623', '18'), +('15', '95', '5', '111318', '240142', '18'), +('15', '95', '5', '111319', '238071', '18'), +('15', '95', '8', '111331', '242541', '18'), +('15', '95', '8', '111332', '239608', '18'), +('15', '95', '8', '111329', '238399', '18'), +('15', '95', '8', '111030', '212901', '18'), +('15', '95', '6', '111325', '241358', '18'), +('15', '95', '6', '111322', '240484', '18'), +('15', '95', '6', '111326', '237902', '18'), +('15', '95', '6', '111024', '211643', '18'), +('15', '95', '17', '56084', '157266', '18'), +('15', '95', '17', '56045', '154385', '18'), +('15', '95', '17', '104420', '133065', '18'), +('15', '95', '17', '54855', '101005', '18'), +('15', '95', '7', '56079', '152214', '18'), +('15', '95', '7', '56040', '150659', '18'), +('15', '95', '7', '104418', '127350', '18'), +('15', '95', '7', '54850', '97040', '18'), +('15', '95', '9', '67098', '248582', '18'), +('15', '95', '9', '56033', '148520', '18'), +('15', '95', '9', '56070', '148415', '18'), +('15', '95', '9', '56031', '148352', '18'), +('15', '95', '15', '111348', '242479', '18'), +('15', '95', '15', '111343', '241611', '18'), +('15', '95', '15', '111342', '241608', '18'), +('15', '95', '15', '111346', '239846', '18'), +('15', '95', '20', '111355', '250357', '18'), +('15', '95', '20', '111351', '248963', '18'), +('15', '95', '20', '111352', '248668', '18'), +('15', '95', '20', '111053', '220717', '18'), +('15', '95', '12', '81795', '148626', '18'), +('15', '95', '12', '56074', '147022', '18'), +('15', '95', '12', '104415', '126529', '18'), +('15', '95', '12', '49656', '95978', '18'), +('15', '95', '18', '62986', '156054', '18'), +('15', '95', '18', '56041', '155824', '18'), +('15', '95', '18', '104419', '133320', '18'), +('15', '95', '18', '54851', '98188', '18'), +('15', '95', '19', '62990', '154688', '18'), +('15', '95', '19', '56037', '153543', '18'), +('15', '95', '19', '56075', '151690', '18'), +('15', '95', '19', '81763', '150764', '18'), +('15', '95', '13', '111871', '400906', '18'), +('15', '95', '13', '111815', '396887', '18'), +('15', '95', '13', '111527', '384940', '18'), +('15', '95', '13', '111515', '377945', '18'), +('15', '95', '14', '111871', '400906', '18'), +('15', '95', '14', '111815', '396887', '18'), +('15', '95', '14', '111527', '384940', '18'), +('15', '95', '14', '111515', '377945', '18'), +('15', '95', '11', '111338', '241212', '18'), +('15', '95', '11', '111335', '239844', '18'), +('15', '95', '11', '111333', '239796', '18'), +('15', '95', '11', '111337', '239027', '18'), +('15', '96', '22', '21807', '0', '18'), +('15', '96', '22', '21805', '0', '18'), +('15', '96', '22', '12425', '0', '18'), +('15', '96', '22', '7867', '0', '18'), +('15', '96', '1', '128691', '300349', '18'), +('15', '96', '1', '111303', '240985', '18'), +('15', '96', '1', '111300', '240911', '18'), +('15', '96', '1', '111302', '240207', '18'), +('15', '96', '2', '94056', '153480', '18'), +('15', '96', '2', '62985', '152090', '18'), +('15', '96', '2', '104417', '128874', '18'), +('15', '96', '2', '54846', '97775', '18'), +('15', '96', '3', '111315', '241229', '18'), +('15', '96', '3', '111313', '240687', '18'), +('15', '96', '3', '111316', '238516', '18'), +('15', '96', '3', '111014', '211514', '18'), +('15', '96', '5', '111317', '241613', '18'), +('15', '96', '5', '111321', '240629', '18'), +('15', '96', '5', '111318', '240147', '18'), +('15', '96', '5', '111319', '238077', '18'), +('15', '96', '8', '111331', '242547', '18'), +('15', '96', '8', '111332', '239613', '18'), +('15', '96', '8', '111329', '238405', '18'), +('15', '96', '8', '111030', '212907', '18'), +('15', '96', '6', '111325', '241363', '18'), +('15', '96', '6', '111322', '240489', '18'), +('15', '96', '6', '111326', '237909', '18'), +('15', '96', '6', '111024', '211648', '18'), +('15', '96', '17', '56084', '157274', '18'), +('15', '96', '17', '56045', '154389', '18'), +('15', '96', '17', '104420', '133072', '18'), +('15', '96', '17', '54855', '101009', '18'), +('15', '96', '7', '56079', '152220', '18'), +('15', '96', '7', '56040', '150665', '18'), +('15', '96', '7', '104418', '127356', '18'), +('15', '96', '7', '54850', '97043', '18'), +('15', '96', '9', '67098', '248588', '18'), +('15', '96', '9', '56033', '148524', '18'), +('15', '96', '9', '56070', '148419', '18'), +('15', '96', '9', '56031', '148356', '18'), +('15', '96', '15', '111348', '242485', '18'), +('15', '96', '15', '111343', '241616', '18'), +('15', '96', '15', '111342', '241614', '18'), +('15', '96', '15', '111346', '239851', '18'), +('15', '96', '20', '111355', '250362', '18'), +('15', '96', '20', '111351', '248968', '18'), +('15', '96', '20', '111352', '248674', '18'), +('15', '96', '20', '111053', '220722', '18'), +('15', '96', '12', '81795', '148631', '18'), +('15', '96', '12', '56074', '147027', '18'), +('15', '96', '12', '104415', '126534', '18'), +('15', '96', '12', '49656', '95978', '18'), +('15', '96', '18', '62986', '156061', '18'), +('15', '96', '18', '56041', '155829', '18'), +('15', '96', '18', '104419', '133328', '18'), +('15', '96', '18', '54851', '98194', '18'), +('15', '96', '19', '62990', '154693', '18'), +('15', '96', '19', '56037', '153549', '18'), +('15', '96', '19', '56075', '151696', '18'), +('15', '96', '19', '81763', '150771', '18'), +('15', '96', '13', '111871', '401205', '18'), +('15', '96', '13', '111815', '397186', '18'), +('15', '96', '13', '111527', '385239', '18'), +('15', '96', '13', '111515', '378243', '18'), +('15', '96', '14', '111871', '401205', '18'), +('15', '96', '14', '111815', '397186', '18'), +('15', '96', '14', '111527', '385239', '18'), +('15', '96', '14', '111515', '378243', '18'), +('15', '96', '11', '111338', '241218', '18'), +('15', '96', '11', '111335', '239850', '18'), +('15', '96', '11', '111333', '239800', '18'), +('15', '96', '11', '111337', '239034', '18'), +('15', '97', '22', '21807', '0', '18'), +('15', '97', '22', '21805', '0', '18'), +('15', '97', '22', '12425', '0', '18'), +('15', '97', '22', '7867', '0', '18'), +('15', '97', '1', '128691', '300353', '18'), +('15', '97', '1', '111303', '240990', '18'), +('15', '97', '1', '111300', '240916', '18'), +('15', '97', '1', '111302', '240214', '18'), +('15', '97', '2', '94056', '153485', '18'), +('15', '97', '2', '62985', '152096', '18'), +('15', '97', '2', '104417', '128878', '18'), +('15', '97', '2', '54846', '97780', '18'), +('15', '97', '3', '111315', '241235', '18'), +('15', '97', '3', '111313', '240692', '18'), +('15', '97', '3', '111316', '238521', '18'), +('15', '97', '3', '111014', '211520', '18'), +('15', '97', '5', '111317', '241618', '18'), +('15', '97', '5', '111321', '240635', '18'), +('15', '97', '5', '111318', '240151', '18'), +('15', '97', '5', '111319', '238083', '18'), +('15', '97', '8', '111331', '242554', '18'), +('15', '97', '8', '111332', '239619', '18'), +('15', '97', '8', '111329', '238409', '18'), +('15', '97', '8', '111030', '212914', '18'), +('15', '97', '6', '111325', '241368', '18'), +('15', '97', '6', '111322', '240492', '18'), +('15', '97', '6', '111326', '237915', '18'), +('15', '97', '6', '111024', '211653', '18'), +('15', '97', '17', '56084', '157282', '18'), +('15', '97', '17', '56045', '154394', '18'), +('15', '97', '17', '104420', '133078', '18'), +('15', '97', '17', '54855', '101013', '18'), +('15', '97', '7', '56079', '152226', '18'), +('15', '97', '7', '56040', '150671', '18'), +('15', '97', '7', '104418', '127361', '18'), +('15', '97', '7', '54850', '97046', '18'), +('15', '97', '9', '67098', '248592', '18'), +('15', '97', '9', '56033', '148528', '18'), +('15', '97', '9', '56070', '148423', '18'), +('15', '97', '9', '56031', '148360', '18'), +('15', '97', '15', '111348', '242492', '18'), +('15', '97', '15', '111343', '241621', '18'), +('15', '97', '15', '111342', '241620', '18'), +('15', '97', '15', '111346', '239856', '18'), +('15', '97', '20', '111355', '250365', '18'), +('15', '97', '20', '111351', '248973', '18'), +('15', '97', '20', '111352', '248680', '18'), +('15', '97', '20', '111053', '220725', '18'), +('15', '97', '12', '81795', '148636', '18'), +('15', '97', '12', '56074', '147031', '18'), +('15', '97', '12', '104415', '126539', '18'), +('15', '97', '12', '49656', '95979', '18'), +('15', '97', '18', '62986', '156068', '18'), +('15', '97', '18', '56041', '155833', '18'), +('15', '97', '18', '104419', '133335', '18'), +('15', '97', '18', '54851', '98200', '18'), +('15', '97', '19', '62990', '154698', '18'), +('15', '97', '19', '56037', '153555', '18'), +('15', '97', '19', '56075', '151703', '18'), +('15', '97', '19', '81763', '150777', '18'), +('15', '97', '13', '111871', '401504', '18'), +('15', '97', '13', '111815', '397485', '18'), +('15', '97', '13', '111527', '385537', '18'), +('15', '97', '13', '111515', '378542', '18'), +('15', '97', '14', '111871', '401504', '18'), +('15', '97', '14', '111815', '397485', '18'), +('15', '97', '14', '111527', '385537', '18'), +('15', '97', '14', '111515', '378542', '18'), +('15', '97', '11', '111338', '241223', '18'), +('15', '97', '11', '111335', '239856', '18'), +('15', '97', '11', '111333', '239803', '18'), +('15', '97', '11', '111337', '239041', '18'), +('15', '98', '22', '21807', '0', '18'), +('15', '98', '22', '21805', '0', '18'), +('15', '98', '22', '12425', '0', '18'), +('15', '98', '22', '7867', '0', '18'), +('15', '98', '1', '128691', '300357', '18'), +('15', '98', '1', '111303', '240996', '18'), +('15', '98', '1', '111300', '240921', '18'), +('15', '98', '1', '111302', '240221', '18'), +('15', '98', '2', '94056', '153490', '18'), +('15', '98', '2', '62985', '152102', '18'), +('15', '98', '2', '104417', '128882', '18'), +('15', '98', '2', '54846', '97785', '18'), +('15', '98', '3', '111315', '241243', '18'), +('15', '98', '3', '111313', '240698', '18'), +('15', '98', '3', '111316', '238527', '18'), +('15', '98', '3', '111014', '211528', '18'), +('15', '98', '5', '111317', '241625', '18'), +('15', '98', '5', '111321', '240641', '18'), +('15', '98', '5', '111318', '240156', '18'), +('15', '98', '5', '111319', '238089', '18'), +('15', '98', '8', '111331', '242561', '18'), +('15', '98', '8', '111332', '239624', '18'), +('15', '98', '8', '111329', '238414', '18'), +('15', '98', '8', '111030', '212921', '18'), +('15', '98', '6', '111325', '241373', '18'), +('15', '98', '6', '111322', '240496', '18'), +('15', '98', '6', '111326', '237922', '18'), +('15', '98', '6', '111024', '211658', '18'), +('15', '98', '17', '56084', '157290', '18'), +('15', '98', '17', '56045', '154398', '18'), +('15', '98', '17', '104420', '133085', '18'), +('15', '98', '17', '54855', '101018', '18'), +('15', '98', '7', '56079', '152232', '18'), +('15', '98', '7', '56040', '150677', '18'), +('15', '98', '7', '104418', '127367', '18'), +('15', '98', '7', '54850', '97049', '18'), +('15', '98', '9', '67098', '248598', '18'), +('15', '98', '9', '56033', '148533', '18'), +('15', '98', '9', '56070', '148428', '18'), +('15', '98', '9', '56031', '148365', '18'), +('15', '98', '15', '111348', '242499', '18'), +('15', '98', '15', '111342', '241627', '18'), +('15', '98', '15', '111343', '241626', '18'), +('15', '98', '15', '111346', '239860', '18'), +('15', '98', '20', '111355', '250370', '18'), +('15', '98', '20', '111351', '248978', '18'), +('15', '98', '20', '111352', '248686', '18'), +('15', '98', '20', '111053', '220730', '18'), +('15', '98', '12', '81795', '148642', '18'), +('15', '98', '12', '56074', '147036', '18'), +('15', '98', '12', '104415', '126544', '18'), +('15', '98', '12', '49656', '95980', '18'), +('15', '98', '18', '62986', '156076', '18'), +('15', '98', '18', '56041', '155837', '18'), +('15', '98', '18', '104419', '133342', '18'), +('15', '98', '18', '54851', '98206', '18'), +('15', '98', '19', '62990', '154702', '18'), +('15', '98', '19', '56037', '153561', '18'), +('15', '98', '19', '56075', '151709', '18'), +('15', '98', '19', '81763', '150784', '18'), +('15', '98', '13', '111871', '401803', '18'), +('15', '98', '13', '111815', '397784', '18'), +('15', '98', '13', '111527', '385836', '18'), +('15', '98', '13', '111515', '378840', '18'), +('15', '98', '14', '111871', '401803', '18'), +('15', '98', '14', '111815', '397784', '18'), +('15', '98', '14', '111527', '385836', '18'), +('15', '98', '14', '111515', '378840', '18'), +('15', '98', '11', '111338', '241229', '18'), +('15', '98', '11', '111335', '239862', '18'), +('15', '98', '11', '111333', '239807', '18'), +('15', '98', '11', '111337', '239048', '18'), +('15', '99', '22', '21807', '0', '18'), +('15', '99', '22', '21805', '0', '18'), +('15', '99', '22', '12425', '0', '18'), +('15', '99', '22', '7867', '0', '18'), +('15', '99', '1', '128691', '300362', '18'), +('15', '99', '1', '111303', '241002', '18'), +('15', '99', '1', '111300', '240925', '18'), +('15', '99', '1', '111302', '240227', '18'), +('15', '99', '2', '94056', '153495', '18'), +('15', '99', '2', '62985', '152107', '18'), +('15', '99', '2', '104417', '128886', '18'), +('15', '99', '2', '54846', '97790', '18'), +('15', '99', '3', '111315', '241250', '18'), +('15', '99', '3', '111313', '240703', '18'), +('15', '99', '3', '111316', '238532', '18'), +('15', '99', '3', '111014', '211535', '18'), +('15', '99', '5', '111317', '241631', '18'), +('15', '99', '5', '111321', '240647', '18'), +('15', '99', '5', '111318', '240161', '18'), +('15', '99', '5', '111319', '238095', '18'), +('15', '99', '8', '111331', '242568', '18'), +('15', '99', '8', '111332', '239630', '18'), +('15', '99', '8', '111329', '238420', '18'), +('15', '99', '8', '111030', '212928', '18'), +('15', '99', '6', '111325', '241378', '18'), +('15', '99', '6', '111322', '240500', '18'), +('15', '99', '6', '111326', '237929', '18'), +('15', '99', '6', '111024', '211663', '18'), +('15', '99', '17', '56084', '157298', '18'), +('15', '99', '17', '56045', '154403', '18'), +('15', '99', '17', '104420', '133092', '18'), +('15', '99', '17', '54855', '101022', '18'), +('15', '99', '7', '56079', '152237', '18'), +('15', '99', '7', '56040', '150683', '18'), +('15', '99', '7', '104418', '127372', '18'), +('15', '99', '7', '54850', '97052', '18'), +('15', '99', '9', '67098', '248603', '18'), +('15', '99', '9', '56033', '148537', '18'), +('15', '99', '9', '56070', '148432', '18'), +('15', '99', '9', '56031', '148369', '18'), +('15', '99', '15', '111348', '242506', '18'), +('15', '99', '15', '111342', '241634', '18'), +('15', '99', '15', '111343', '241632', '18'), +('15', '99', '15', '111346', '239865', '18'), +('15', '99', '20', '111355', '250374', '18'), +('15', '99', '20', '111351', '248983', '18'), +('15', '99', '20', '111352', '248692', '18'), +('15', '99', '20', '111053', '220734', '18'), +('15', '99', '12', '81795', '148647', '18'), +('15', '99', '12', '56074', '147040', '18'), +('15', '99', '12', '104415', '126549', '18'), +('15', '99', '12', '49656', '95981', '18'), +('15', '99', '18', '62986', '156083', '18'), +('15', '99', '18', '56041', '155841', '18'), +('15', '99', '18', '104419', '133350', '18'), +('15', '99', '18', '54851', '98212', '18'), +('15', '99', '19', '62990', '154707', '18'), +('15', '99', '19', '56037', '153568', '18'), +('15', '99', '19', '56075', '151716', '18'), +('15', '99', '19', '81763', '150792', '18'), +('15', '99', '13', '111871', '402103', '18'), +('15', '99', '13', '111815', '398083', '18'), +('15', '99', '13', '111527', '386135', '18'), +('15', '99', '13', '111515', '379139', '18'), +('15', '99', '14', '111871', '402103', '18'), +('15', '99', '14', '111815', '398083', '18'), +('15', '99', '14', '111527', '386135', '18'), +('15', '99', '14', '111515', '379139', '18'), +('15', '99', '11', '111338', '241234', '18'), +('15', '99', '11', '111335', '239868', '18'), +('15', '99', '11', '111333', '239811', '18'), +('15', '99', '11', '111337', '239055', '18'), +('15', '100', '22', '21807', '0', '20'), +('15', '100', '22', '21805', '0', '20'), +('15', '100', '22', '12425', '0', '20'), +('15', '100', '22', '7867', '0', '20'), +('15', '100', '1', '98769', '402283', '20'), +('15', '100', '1', '128691', '300366', '20'), +('15', '100', '1', '111303', '241007', '20'), +('15', '100', '1', '111300', '240930', '20'), +('15', '100', '2', '94056', '153500', '20'), +('15', '100', '2', '62985', '152113', '20'), +('15', '100', '2', '104417', '128890', '20'), +('15', '100', '2', '54846', '97795', '20'), +('15', '100', '3', '111315', '241256', '20'), +('15', '100', '3', '111313', '240709', '20'), +('15', '100', '3', '111316', '238538', '20'), +('15', '100', '3', '111014', '211541', '20'), +('15', '100', '5', '111317', '241637', '20'), +('15', '100', '5', '111321', '240653', '20'), +('15', '100', '5', '111318', '240165', '20'), +('15', '100', '5', '111319', '238101', '20'), +('15', '100', '8', '111331', '242574', '20'), +('15', '100', '8', '111332', '239635', '20'), +('15', '100', '8', '111329', '238424', '20'), +('15', '100', '8', '111030', '212934', '20'), +('15', '100', '6', '111325', '241382', '20'), +('15', '100', '6', '111322', '240504', '20'), +('15', '100', '6', '111326', '237936', '20'), +('15', '100', '6', '111024', '211667', '20'), +('15', '100', '17', '56084', '157306', '20'), +('15', '100', '17', '56045', '154407', '20'), +('15', '100', '17', '104420', '133099', '20'), +('15', '100', '17', '54855', '101026', '20'), +('15', '100', '7', '56079', '152243', '20'), +('15', '100', '7', '56040', '150689', '20'), +('15', '100', '7', '104418', '127377', '20'), +('15', '100', '7', '54850', '97055', '20'), +('15', '100', '9', '67098', '248608', '20'), +('15', '100', '9', '56033', '148541', '20'), +('15', '100', '9', '56070', '148436', '20'), +('15', '100', '9', '56031', '148373', '20'), +('15', '100', '15', '111348', '242512', '20'), +('15', '100', '15', '111342', '241640', '20'), +('15', '100', '15', '111343', '241637', '20'), +('15', '100', '15', '111346', '239870', '20'), +('15', '100', '20', '111355', '250378', '20'), +('15', '100', '20', '111351', '248988', '20'), +('15', '100', '20', '111352', '248698', '20'), +('15', '100', '20', '111053', '220738', '20'), +('15', '100', '12', '81795', '148652', '20'), +('15', '100', '12', '56074', '147045', '20'), +('15', '100', '12', '104415', '126554', '20'), +('15', '100', '12', '49656', '95981', '20'), +('15', '100', '18', '62986', '156091', '20'), +('15', '100', '18', '56041', '155845', '20'), +('15', '100', '18', '104419', '133357', '20'), +('15', '100', '18', '54851', '98218', '20'), +('15', '100', '19', '62990', '154712', '20'), +('15', '100', '19', '56037', '153573', '20'), +('15', '100', '19', '56075', '151722', '20'), +('15', '100', '19', '81763', '150798', '20'), +('15', '100', '13', '111871', '403868', '20'), +('15', '100', '13', '111815', '399849', '20'), +('15', '100', '13', '111527', '387901', '20'), +('15', '100', '13', '111515', '380904', '20'), +('15', '100', '14', '111871', '403868', '20'), +('15', '100', '14', '111815', '399849', '20'), +('15', '100', '14', '111527', '387901', '20'), +('15', '100', '14', '111515', '380904', '20'), +('15', '100', '11', '133816', '312712', '20'), +('15', '100', '11', '111338', '241240', '20'), +('15', '100', '11', '111335', '239874', '20'), +('15', '100', '11', '111333', '239815', '20'), +('15', '100', '22', '21807', '0', '19'), +('15', '100', '22', '21805', '0', '19'), +('15', '100', '22', '12425', '0', '19'), +('15', '100', '22', '7867', '0', '19'), +('15', '100', '1', '98769', '402283', '19'), +('15', '100', '1', '128691', '300366', '19'), +('15', '100', '1', '111303', '241007', '19'), +('15', '100', '1', '111300', '240930', '19'), +('15', '100', '2', '94056', '153500', '19'), +('15', '100', '2', '62985', '152113', '19'), +('15', '100', '2', '104417', '128890', '19'), +('15', '100', '2', '54846', '97795', '19'), +('15', '100', '3', '111315', '241256', '19'), +('15', '100', '3', '111313', '240709', '19'), +('15', '100', '3', '111316', '238538', '19'), +('15', '100', '3', '111014', '211541', '19'), +('15', '100', '5', '111317', '241637', '19'), +('15', '100', '5', '111321', '240653', '19'), +('15', '100', '5', '111318', '240165', '19'), +('15', '100', '5', '111319', '238101', '19'), +('15', '100', '8', '111331', '242574', '19'), +('15', '100', '8', '111332', '239635', '19'), +('15', '100', '8', '111329', '238424', '19'), +('15', '100', '8', '111030', '212934', '19'), +('15', '100', '6', '111325', '241382', '19'), +('15', '100', '6', '111322', '240504', '19'), +('15', '100', '6', '111326', '237936', '19'), +('15', '100', '6', '111024', '211667', '19'), +('15', '100', '17', '56084', '157306', '19'), +('15', '100', '17', '56045', '154407', '19'), +('15', '100', '17', '104420', '133099', '19'), +('15', '100', '17', '54855', '101026', '19'), +('15', '100', '7', '56079', '152243', '19'), +('15', '100', '7', '56040', '150689', '19'), +('15', '100', '7', '104418', '127377', '19'), +('15', '100', '7', '54850', '97055', '19'), +('15', '100', '9', '67098', '248608', '19'), +('15', '100', '9', '56033', '148541', '19'), +('15', '100', '9', '56070', '148436', '19'), +('15', '100', '9', '56031', '148373', '19'), +('15', '100', '15', '111348', '242512', '19'), +('15', '100', '15', '111342', '241640', '19'), +('15', '100', '15', '111343', '241637', '19'), +('15', '100', '15', '111346', '239870', '19'), +('15', '100', '20', '111355', '250378', '19'), +('15', '100', '20', '111351', '248988', '19'), +('15', '100', '20', '111352', '248698', '19'), +('15', '100', '20', '111053', '220738', '19'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '100', '12', '81795', '148652', '19'), +('15', '100', '12', '56074', '147045', '19'), +('15', '100', '12', '104415', '126554', '19'), +('15', '100', '12', '49656', '95981', '19'), +('15', '100', '18', '62986', '156091', '19'), +('15', '100', '18', '56041', '155845', '19'), +('15', '100', '18', '104419', '133357', '19'), +('15', '100', '18', '54851', '98218', '19'), +('15', '100', '19', '62990', '154712', '19'), +('15', '100', '19', '56037', '153573', '19'), +('15', '100', '19', '56075', '151722', '19'), +('15', '100', '19', '81763', '150798', '19'), +('15', '100', '13', '111871', '402401', '19'), +('15', '100', '13', '111815', '398382', '19'), +('15', '100', '13', '111527', '386434', '19'), +('15', '100', '13', '111515', '379437', '19'), +('15', '100', '14', '111871', '402401', '19'), +('15', '100', '14', '111815', '398382', '19'), +('15', '100', '14', '111527', '386434', '19'), +('15', '100', '14', '111515', '379437', '19'), +('15', '100', '11', '133816', '312712', '19'), +('15', '100', '11', '111338', '241240', '19'), +('15', '100', '11', '111335', '239874', '19'), +('15', '100', '11', '111333', '239815', '19'), +('15', '101', '22', '21807', '0', '20'), +('15', '101', '22', '21805', '0', '20'), +('15', '101', '22', '12425', '0', '20'), +('15', '101', '22', '7867', '0', '20'), +('15', '101', '1', '98769', '402287', '20'), +('15', '101', '1', '128691', '300370', '20'), +('15', '101', '1', '111303', '241013', '20'), +('15', '101', '1', '111300', '240935', '20'), +('15', '101', '2', '94056', '153505', '20'), +('15', '101', '2', '62985', '152119', '20'), +('15', '101', '2', '104417', '128894', '20'), +('15', '101', '2', '54846', '97800', '20'), +('15', '101', '3', '111315', '241263', '20'), +('15', '101', '3', '111313', '240714', '20'), +('15', '101', '3', '111316', '238543', '20'), +('15', '101', '3', '111014', '211548', '20'), +('15', '101', '5', '111317', '241643', '20'), +('15', '101', '5', '111321', '240659', '20'), +('15', '101', '5', '111318', '240169', '20'), +('15', '101', '5', '111319', '238107', '20'), +('15', '101', '8', '111331', '242581', '20'), +('15', '101', '8', '111332', '239640', '20'), +('15', '101', '8', '111329', '238430', '20'), +('15', '101', '8', '111030', '212941', '20'), +('15', '101', '6', '111325', '241387', '20'), +('15', '101', '6', '111322', '240508', '20'), +('15', '101', '6', '111326', '237943', '20'), +('15', '101', '6', '111024', '211672', '20'), +('15', '101', '17', '56084', '157314', '20'), +('15', '101', '17', '56045', '154412', '20'), +('15', '101', '17', '104420', '133106', '20'), +('15', '101', '17', '54855', '101031', '20'), +('15', '101', '7', '56079', '152249', '20'), +('15', '101', '7', '56040', '150695', '20'), +('15', '101', '7', '104418', '127383', '20'), +('15', '101', '7', '54850', '97059', '20'), +('15', '101', '9', '67098', '248613', '20'), +('15', '101', '9', '56033', '148546', '20'), +('15', '101', '9', '56070', '148440', '20'), +('15', '101', '9', '56031', '148378', '20'), +('15', '101', '15', '111348', '242519', '20'), +('15', '101', '15', '111342', '241646', '20'), +('15', '101', '15', '111343', '241642', '20'), +('15', '101', '15', '111346', '239875', '20'), +('15', '101', '20', '111355', '250382', '20'), +('15', '101', '20', '111351', '248993', '20'), +('15', '101', '20', '111352', '248704', '20'), +('15', '101', '20', '111053', '220742', '20'), +('15', '101', '12', '81795', '148658', '20'), +('15', '101', '12', '56074', '147049', '20'), +('15', '101', '12', '104415', '126559', '20'), +('15', '101', '12', '49656', '95982', '20'), +('15', '101', '18', '62986', '156098', '20'), +('15', '101', '18', '56041', '155849', '20'), +('15', '101', '18', '104419', '133365', '20'), +('15', '101', '18', '54851', '98224', '20'), +('15', '101', '19', '62990', '154717', '20'), +('15', '101', '19', '56037', '153580', '20'), +('15', '101', '19', '56075', '151729', '20'), +('15', '101', '19', '81763', '150805', '20'), +('15', '101', '13', '111871', '404167', '20'), +('15', '101', '13', '111815', '400148', '20'), +('15', '101', '13', '111527', '388200', '20'), +('15', '101', '13', '111515', '381203', '20'), +('15', '101', '14', '111871', '404167', '20'), +('15', '101', '14', '111815', '400148', '20'), +('15', '101', '14', '111527', '388200', '20'), +('15', '101', '14', '111515', '381203', '20'), +('15', '101', '11', '133816', '312716', '20'), +('15', '101', '11', '111338', '241245', '20'), +('15', '101', '11', '111335', '239880', '20'), +('15', '101', '11', '111333', '239819', '20'), +('15', '102', '22', '21807', '0', '20'), +('15', '102', '22', '21805', '0', '20'), +('15', '102', '22', '12425', '0', '20'), +('15', '102', '22', '7867', '0', '20'), +('15', '102', '1', '98769', '402291', '20'), +('15', '102', '1', '128691', '300374', '20'), +('15', '102', '1', '111303', '241018', '20'), +('15', '102', '1', '111300', '240939', '20'), +('15', '102', '2', '94056', '153510', '20'), +('15', '102', '2', '62985', '152124', '20'), +('15', '102', '2', '104417', '128898', '20'), +('15', '102', '2', '54846', '97805', '20'), +('15', '102', '3', '111315', '241270', '20'), +('15', '102', '3', '111313', '240720', '20'), +('15', '102', '3', '111316', '238549', '20'), +('15', '102', '3', '111014', '211555', '20'), +('15', '102', '5', '111317', '241650', '20'), +('15', '102', '5', '111321', '240666', '20'), +('15', '102', '5', '111318', '240174', '20'), +('15', '102', '5', '111319', '238113', '20'), +('15', '102', '8', '111331', '242588', '20'), +('15', '102', '8', '111332', '239646', '20'), +('15', '102', '8', '111329', '238435', '20'), +('15', '102', '8', '111030', '212948', '20'), +('15', '102', '6', '111325', '241392', '20'), +('15', '102', '6', '111322', '240512', '20'), +('15', '102', '6', '111326', '237950', '20'), +('15', '102', '6', '111024', '211677', '20'), +('15', '102', '17', '56084', '157322', '20'), +('15', '102', '17', '56045', '154416', '20'), +('15', '102', '17', '104420', '133113', '20'), +('15', '102', '17', '54855', '101035', '20'), +('15', '102', '7', '56079', '152255', '20'), +('15', '102', '7', '56040', '150701', '20'), +('15', '102', '7', '104418', '127388', '20'), +('15', '102', '7', '54850', '97062', '20'), +('15', '102', '9', '67098', '248618', '20'), +('15', '102', '9', '56033', '148550', '20'), +('15', '102', '9', '56070', '148445', '20'), +('15', '102', '9', '56031', '148382', '20'), +('15', '102', '15', '111348', '242526', '20'), +('15', '102', '15', '111342', '241653', '20'), +('15', '102', '15', '111343', '241647', '20'), +('15', '102', '15', '111346', '239879', '20'), +('15', '102', '20', '111355', '250386', '20'), +('15', '102', '20', '111351', '248998', '20'), +('15', '102', '20', '111352', '248710', '20'), +('15', '102', '20', '111053', '220746', '20'), +('15', '102', '12', '81795', '148663', '20'), +('15', '102', '12', '56074', '147054', '20'), +('15', '102', '12', '104415', '126564', '20'), +('15', '102', '12', '49656', '95983', '20'), +('15', '102', '18', '62986', '156106', '20'), +('15', '102', '18', '56041', '155853', '20'), +('15', '102', '18', '104419', '133372', '20'), +('15', '102', '18', '54851', '98230', '20'), +('15', '102', '19', '62990', '154721', '20'), +('15', '102', '19', '56037', '153586', '20'), +('15', '102', '19', '56075', '151735', '20'), +('15', '102', '19', '81763', '150812', '20'), +('15', '102', '13', '111871', '404466', '20'), +('15', '102', '13', '111815', '400447', '20'), +('15', '102', '13', '111527', '388499', '20'), +('15', '102', '13', '111515', '381501', '20'), +('15', '102', '14', '111871', '404466', '20'), +('15', '102', '14', '111815', '400447', '20'), +('15', '102', '14', '111527', '388499', '20'), +('15', '102', '14', '111515', '381501', '20'), +('15', '102', '11', '133816', '312721', '20'), +('15', '102', '11', '111338', '241251', '20'), +('15', '102', '11', '111335', '239886', '20'), +('15', '102', '11', '111333', '239823', '20'), +('15', '103', '22', '21807', '0', '20'), +('15', '103', '22', '21805', '0', '20'), +('15', '103', '22', '12425', '0', '20'), +('15', '103', '22', '7867', '0', '20'), +('15', '103', '1', '98769', '402295', '20'), +('15', '103', '1', '128691', '300378', '20'), +('15', '103', '1', '111303', '241024', '20'), +('15', '103', '1', '111300', '240944', '20'), +('15', '103', '2', '94056', '153515', '20'), +('15', '103', '2', '62985', '152130', '20'), +('15', '103', '2', '104417', '128902', '20'), +('15', '103', '2', '54846', '97810', '20'), +('15', '103', '3', '111315', '241277', '20'), +('15', '103', '3', '111313', '240725', '20'), +('15', '103', '3', '111316', '238555', '20'), +('15', '103', '3', '111014', '211562', '20'), +('15', '103', '5', '111317', '241656', '20'), +('15', '103', '5', '111321', '240672', '20'), +('15', '103', '5', '111318', '240178', '20'), +('15', '103', '5', '111319', '238119', '20'), +('15', '103', '8', '111331', '242594', '20'), +('15', '103', '8', '111332', '239651', '20'), +('15', '103', '8', '111329', '238439', '20'), +('15', '103', '8', '111030', '212954', '20'), +('15', '103', '6', '111325', '241397', '20'), +('15', '103', '6', '111322', '240516', '20'), +('15', '103', '6', '111326', '237957', '20'), +('15', '103', '6', '111024', '211682', '20'), +('15', '103', '17', '56084', '157330', '20'), +('15', '103', '17', '56045', '154421', '20'), +('15', '103', '17', '104420', '133120', '20'), +('15', '103', '17', '54855', '101040', '20'), +('15', '103', '7', '56079', '152260', '20'), +('15', '103', '7', '56040', '150707', '20'), +('15', '103', '7', '104418', '127394', '20'), +('15', '103', '7', '54850', '97065', '20'), +('15', '103', '9', '67098', '248623', '20'), +('15', '103', '9', '56033', '148554', '20'), +('15', '103', '9', '56070', '148449', '20'), +('15', '103', '9', '56031', '148386', '20'), +('15', '103', '15', '111348', '242532', '20'), +('15', '103', '15', '111342', '241659', '20'), +('15', '103', '15', '111343', '241652', '20'), +('15', '103', '15', '111346', '239884', '20'), +('15', '103', '20', '111355', '250390', '20'), +('15', '103', '20', '111351', '249003', '20'), +('15', '103', '20', '111352', '248716', '20'), +('15', '103', '20', '111053', '220750', '20'), +('15', '103', '12', '81795', '148668', '20'), +('15', '103', '12', '56074', '147058', '20'), +('15', '103', '12', '104415', '126568', '20'), +('15', '103', '12', '49656', '95984', '20'), +('15', '103', '18', '62986', '156113', '20'), +('15', '103', '18', '56041', '155857', '20'), +('15', '103', '18', '104419', '133379', '20'), +('15', '103', '18', '54851', '98236', '20'), +('15', '103', '19', '62990', '154726', '20'), +('15', '103', '19', '56037', '153592', '20'), +('15', '103', '19', '56075', '151742', '20'), +('15', '103', '19', '81763', '150819', '20'), +('15', '103', '13', '111871', '404765', '20'), +('15', '103', '13', '111815', '400746', '20'), +('15', '103', '13', '111527', '388797', '20'), +('15', '103', '13', '111515', '381800', '20'), +('15', '103', '14', '111871', '404765', '20'), +('15', '103', '14', '111815', '400746', '20'), +('15', '103', '14', '111527', '388797', '20'), +('15', '103', '14', '111515', '381800', '20'), +('15', '103', '11', '133816', '312726', '20'), +('15', '103', '11', '111338', '241256', '20'), +('15', '103', '11', '111335', '239892', '20'), +('15', '103', '11', '111333', '239827', '20'), +('15', '104', '22', '21807', '0', '20'), +('15', '104', '22', '21805', '0', '20'), +('15', '104', '22', '12425', '0', '20'), +('15', '104', '22', '7867', '0', '20'), +('15', '104', '1', '98769', '402299', '20'), +('15', '104', '1', '128691', '300382', '20'), +('15', '104', '1', '111303', '241029', '20'), +('15', '104', '1', '111300', '240949', '20'), +('15', '104', '2', '94056', '153520', '20'), +('15', '104', '2', '62985', '152136', '20'), +('15', '104', '2', '104417', '128906', '20'), +('15', '104', '2', '54846', '97815', '20'), +('15', '104', '3', '111315', '241284', '20'), +('15', '104', '3', '111313', '240730', '20'), +('15', '104', '3', '111316', '238560', '20'), +('15', '104', '3', '111014', '211569', '20'), +('15', '104', '5', '111317', '241662', '20'), +('15', '104', '5', '111321', '240678', '20'), +('15', '104', '5', '111318', '240183', '20'), +('15', '104', '5', '111319', '238125', '20'), +('15', '104', '8', '111331', '242601', '20'), +('15', '104', '8', '111332', '239657', '20'), +('15', '104', '8', '111329', '238445', '20'), +('15', '104', '8', '111030', '212961', '20'), +('15', '104', '6', '111325', '241402', '20'), +('15', '104', '6', '111322', '240520', '20'), +('15', '104', '6', '111326', '237964', '20'), +('15', '104', '6', '111024', '211687', '20'), +('15', '104', '17', '56084', '157338', '20'), +('15', '104', '17', '56045', '154425', '20'), +('15', '104', '17', '104420', '133127', '20'), +('15', '104', '17', '54855', '101044', '20'), +('15', '104', '7', '56079', '152266', '20'), +('15', '104', '7', '56040', '150713', '20'), +('15', '104', '7', '104418', '127399', '20'), +('15', '104', '7', '54850', '97068', '20'), +('15', '104', '9', '67098', '248628', '20'), +('15', '104', '9', '56033', '148558', '20'), +('15', '104', '9', '56070', '148453', '20'), +('15', '104', '9', '56031', '148391', '20'), +('15', '104', '15', '111348', '242539', '20'), +('15', '104', '15', '111342', '241666', '20'), +('15', '104', '15', '111343', '241657', '20'), +('15', '104', '15', '111346', '239889', '20'), +('15', '104', '20', '111355', '250394', '20'), +('15', '104', '20', '111351', '249009', '20'), +('15', '104', '20', '111352', '248722', '20'), +('15', '104', '20', '111053', '220754', '20'), +('15', '104', '12', '81795', '148673', '20'), +('15', '104', '12', '56074', '147062', '20'), +('15', '104', '12', '104415', '126573', '20'), +('15', '104', '12', '49656', '95984', '20'), +('15', '104', '18', '62986', '156120', '20'), +('15', '104', '18', '56041', '155861', '20'), +('15', '104', '18', '104419', '133387', '20'), +('15', '104', '18', '54851', '98242', '20'), +('15', '104', '19', '62990', '154731', '20'), +('15', '104', '19', '56037', '153598', '20'), +('15', '104', '19', '56075', '151748', '20'), +('15', '104', '19', '81763', '150826', '20'), +('15', '104', '13', '111871', '405064', '20'), +('15', '104', '13', '111815', '401045', '20'), +('15', '104', '13', '111527', '389096', '20'), +('15', '104', '13', '111515', '382098', '20'), +('15', '104', '14', '111871', '405064', '20'), +('15', '104', '14', '111815', '401045', '20'), +('15', '104', '14', '111527', '389096', '20'), +('15', '104', '14', '111515', '382098', '20'), +('15', '104', '11', '133816', '312730', '20'), +('15', '104', '11', '111338', '241262', '20'), +('15', '104', '11', '111335', '239898', '20'), +('15', '104', '11', '111333', '239831', '20'), +('15', '105', '22', '21807', '0', '23'), +('15', '105', '22', '21805', '0', '23'), +('15', '105', '22', '12425', '0', '23'), +('15', '105', '22', '7867', '0', '23'), +('15', '105', '1', '98769', '402303', '23'), +('15', '105', '1', '128691', '300386', '23'), +('15', '105', '1', '111303', '241035', '23'), +('15', '105', '1', '111300', '240954', '23'), +('15', '105', '2', '94056', '153525', '23'), +('15', '105', '2', '62985', '152141', '23'), +('15', '105', '2', '104417', '128911', '23'), +('15', '105', '2', '54846', '97821', '23'), +('15', '105', '3', '111315', '241291', '23'), +('15', '105', '3', '111313', '240736', '23'), +('15', '105', '3', '111316', '238566', '23'), +('15', '105', '3', '111014', '211576', '23'), +('15', '105', '5', '111317', '241668', '23'), +('15', '105', '5', '111321', '240684', '23'), +('15', '105', '5', '111318', '240187', '23'), +('15', '105', '5', '111319', '238131', '23'), +('15', '105', '8', '111331', '242608', '23'), +('15', '105', '8', '111332', '239662', '23'), +('15', '105', '8', '111329', '238450', '23'), +('15', '105', '8', '111030', '212968', '23'), +('15', '105', '6', '111325', '241407', '23'), +('15', '105', '6', '111322', '240524', '23'), +('15', '105', '6', '111326', '237971', '23'), +('15', '105', '6', '111024', '211692', '23'), +('15', '105', '17', '56084', '157346', '23'), +('15', '105', '17', '56045', '154430', '23'), +('15', '105', '17', '104420', '133134', '23'), +('15', '105', '17', '54855', '101048', '23'), +('15', '105', '7', '56079', '152272', '23'), +('15', '105', '7', '56040', '150719', '23'), +('15', '105', '7', '104418', '127405', '23'), +('15', '105', '7', '54850', '97071', '23'), +('15', '105', '9', '67098', '248634', '23'), +('15', '105', '9', '56033', '148563', '23'), +('15', '105', '9', '56070', '148457', '23'), +('15', '105', '9', '56031', '148395', '23'), +('15', '105', '15', '111348', '242546', '23'), +('15', '105', '15', '111342', '241672', '23'), +('15', '105', '15', '111343', '241662', '23'), +('15', '105', '15', '111346', '239894', '23'), +('15', '105', '20', '111355', '250398', '23'), +('15', '105', '20', '111351', '249014', '23'), +('15', '105', '20', '111352', '248728', '23'), +('15', '105', '20', '111053', '220758', '23'), +('15', '105', '12', '81795', '148679', '23'), +('15', '105', '12', '56074', '147067', '23'), +('15', '105', '12', '104415', '126578', '23'), +('15', '105', '12', '49656', '95985', '23'), +('15', '105', '18', '62986', '156128', '23'), +('15', '105', '18', '56041', '155866', '23'), +('15', '105', '18', '104419', '133394', '23'), +('15', '105', '18', '54851', '98248', '23'), +('15', '105', '19', '62990', '154735', '23'), +('15', '105', '19', '56037', '153604', '23'), +('15', '105', '19', '56075', '151755', '23'), +('15', '105', '19', '81763', '150833', '23'), +('15', '105', '13', '111871', '405364', '23'), +('15', '105', '13', '111815', '401344', '23'), +('15', '105', '13', '111527', '389395', '23'), +('15', '105', '13', '111515', '382397', '23'), +('15', '105', '14', '111871', '405364', '23'), +('15', '105', '14', '111815', '401344', '23'), +('15', '105', '14', '111527', '389395', '23'), +('15', '105', '14', '111515', '382397', '23'), +('15', '105', '11', '133816', '312735', '23'), +('15', '105', '11', '111338', '241268', '23'), +('15', '105', '11', '111335', '239904', '23'), +('15', '105', '11', '111333', '239835', '23'), +('15', '105', '22', '21807', '0', '22'), +('15', '105', '22', '21805', '0', '22'), +('15', '105', '22', '12425', '0', '22'), +('15', '105', '22', '7867', '0', '22'), +('15', '105', '1', '98769', '402303', '22'), +('15', '105', '1', '128691', '300386', '22'), +('15', '105', '1', '111303', '241035', '22'), +('15', '105', '1', '111300', '240954', '22'), +('15', '105', '2', '94056', '153525', '22'), +('15', '105', '2', '62985', '152141', '22'), +('15', '105', '2', '104417', '128911', '22'), +('15', '105', '2', '54846', '97821', '22'), +('15', '105', '3', '111315', '241291', '22'), +('15', '105', '3', '111313', '240736', '22'), +('15', '105', '3', '111316', '238566', '22'), +('15', '105', '3', '111014', '211576', '22'), +('15', '105', '5', '111317', '241668', '22'), +('15', '105', '5', '111321', '240684', '22'), +('15', '105', '5', '111318', '240187', '22'), +('15', '105', '5', '111319', '238131', '22'), +('15', '105', '8', '111331', '242608', '22'), +('15', '105', '8', '111332', '239662', '22'), +('15', '105', '8', '111329', '238450', '22'), +('15', '105', '8', '111030', '212968', '22'), +('15', '105', '6', '111325', '241407', '22'), +('15', '105', '6', '111322', '240524', '22'), +('15', '105', '6', '111326', '237971', '22'), +('15', '105', '6', '111024', '211692', '22'), +('15', '105', '17', '56084', '157346', '22'), +('15', '105', '17', '56045', '154430', '22'), +('15', '105', '17', '104420', '133134', '22'), +('15', '105', '17', '54855', '101048', '22'), +('15', '105', '7', '56079', '152272', '22'), +('15', '105', '7', '56040', '150719', '22'), +('15', '105', '7', '104418', '127405', '22'), +('15', '105', '7', '54850', '97071', '22'), +('15', '105', '9', '67098', '248634', '22'), +('15', '105', '9', '56033', '148563', '22'), +('15', '105', '9', '56070', '148457', '22'), +('15', '105', '9', '56031', '148395', '22'), +('15', '105', '15', '111348', '242546', '22'), +('15', '105', '15', '111342', '241672', '22'), +('15', '105', '15', '111343', '241662', '22'), +('15', '105', '15', '111346', '239894', '22'), +('15', '105', '20', '111355', '250398', '22'), +('15', '105', '20', '111351', '249014', '22'), +('15', '105', '20', '111352', '248728', '22'), +('15', '105', '20', '111053', '220758', '22'), +('15', '105', '12', '81795', '148679', '22'), +('15', '105', '12', '56074', '147067', '22'), +('15', '105', '12', '104415', '126578', '22'), +('15', '105', '12', '49656', '95985', '22'), +('15', '105', '18', '62986', '156128', '22'), +('15', '105', '18', '56041', '155866', '22'), +('15', '105', '18', '104419', '133394', '22'), +('15', '105', '18', '54851', '98248', '22'), +('15', '105', '19', '62990', '154735', '22'), +('15', '105', '19', '56037', '153604', '22'), +('15', '105', '19', '56075', '151755', '22'), +('15', '105', '19', '81763', '150833', '22'), +('15', '105', '13', '111871', '405364', '22'), +('15', '105', '13', '111815', '401344', '22'), +('15', '105', '13', '111527', '389395', '22'), +('15', '105', '13', '111515', '382397', '22'), +('15', '105', '14', '111871', '405364', '22'), +('15', '105', '14', '111815', '401344', '22'), +('15', '105', '14', '111527', '389395', '22'), +('15', '105', '14', '111515', '382397', '22'), +('15', '105', '11', '133816', '312735', '22'), +('15', '105', '11', '111338', '241268', '22'), +('15', '105', '11', '111335', '239904', '22'), +('15', '105', '11', '111333', '239835', '22'), +('15', '105', '22', '21807', '0', '21'), +('15', '105', '22', '21805', '0', '21'), +('15', '105', '22', '12425', '0', '21'), +('15', '105', '22', '7867', '0', '21'), +('15', '105', '1', '98769', '402303', '21'), +('15', '105', '1', '128691', '300386', '21'), +('15', '105', '1', '111303', '241035', '21'), +('15', '105', '1', '111300', '240954', '21'), +('15', '105', '2', '94056', '153525', '21'), +('15', '105', '2', '62985', '152141', '21'), +('15', '105', '2', '104417', '128911', '21'), +('15', '105', '2', '54846', '97821', '21'), +('15', '105', '3', '111315', '241291', '21'), +('15', '105', '3', '111313', '240736', '21'), +('15', '105', '3', '111316', '238566', '21'), +('15', '105', '3', '111014', '211576', '21'), +('15', '105', '5', '111317', '241668', '21'), +('15', '105', '5', '111321', '240684', '21'), +('15', '105', '5', '111318', '240187', '21'), +('15', '105', '5', '111319', '238131', '21'), +('15', '105', '8', '111331', '242608', '21'), +('15', '105', '8', '111332', '239662', '21'), +('15', '105', '8', '111329', '238450', '21'), +('15', '105', '8', '111030', '212968', '21'), +('15', '105', '6', '111325', '241407', '21'), +('15', '105', '6', '111322', '240524', '21'), +('15', '105', '6', '111326', '237971', '21'), +('15', '105', '6', '111024', '211692', '21'), +('15', '105', '17', '56084', '157346', '21'), +('15', '105', '17', '56045', '154430', '21'), +('15', '105', '17', '104420', '133134', '21'), +('15', '105', '17', '54855', '101048', '21'), +('15', '105', '7', '56079', '152272', '21'), +('15', '105', '7', '56040', '150719', '21'), +('15', '105', '7', '104418', '127405', '21'), +('15', '105', '7', '54850', '97071', '21'), +('15', '105', '9', '67098', '248634', '21'), +('15', '105', '9', '56033', '148563', '21'), +('15', '105', '9', '56070', '148457', '21'), +('15', '105', '9', '56031', '148395', '21'), +('15', '105', '15', '111348', '242546', '21'), +('15', '105', '15', '111342', '241672', '21'), +('15', '105', '15', '111343', '241662', '21'), +('15', '105', '15', '111346', '239894', '21'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '105', '20', '111355', '250398', '21'), +('15', '105', '20', '111351', '249014', '21'), +('15', '105', '20', '111352', '248728', '21'), +('15', '105', '20', '111053', '220758', '21'), +('15', '105', '12', '81795', '148679', '21'), +('15', '105', '12', '56074', '147067', '21'), +('15', '105', '12', '104415', '126578', '21'), +('15', '105', '12', '49656', '95985', '21'), +('15', '105', '18', '62986', '156128', '21'), +('15', '105', '18', '56041', '155866', '21'), +('15', '105', '18', '104419', '133394', '21'), +('15', '105', '18', '54851', '98248', '21'), +('15', '105', '19', '62990', '154735', '21'), +('15', '105', '19', '56037', '153604', '21'), +('15', '105', '19', '56075', '151755', '21'), +('15', '105', '19', '81763', '150833', '21'), +('15', '105', '13', '111871', '405364', '21'), +('15', '105', '13', '111815', '401344', '21'), +('15', '105', '13', '111527', '389395', '21'), +('15', '105', '13', '111515', '382397', '21'), +('15', '105', '14', '111871', '405364', '21'), +('15', '105', '14', '111815', '401344', '21'), +('15', '105', '14', '111527', '389395', '21'), +('15', '105', '14', '111515', '382397', '21'), +('15', '105', '11', '133816', '312735', '21'), +('15', '105', '11', '111338', '241268', '21'), +('15', '105', '11', '111335', '239904', '21'), +('15', '105', '11', '111333', '239835', '21'), +('15', '106', '22', '21807', '0', '23'), +('15', '106', '22', '21805', '0', '23'), +('15', '106', '22', '12425', '0', '23'), +('15', '106', '22', '7867', '0', '23'), +('15', '106', '1', '98769', '402307', '23'), +('15', '106', '1', '128691', '300391', '23'), +('15', '106', '1', '111303', '241041', '23'), +('15', '106', '1', '111300', '240958', '23'), +('15', '106', '2', '94056', '153530', '23'), +('15', '106', '2', '62985', '152147', '23'), +('15', '106', '2', '104417', '128915', '23'), +('15', '106', '2', '54846', '97826', '23'), +('15', '106', '3', '111315', '241298', '23'), +('15', '106', '3', '111313', '240741', '23'), +('15', '106', '3', '111316', '238572', '23'), +('15', '106', '3', '111014', '211583', '23'), +('15', '106', '5', '111317', '241675', '23'), +('15', '106', '5', '111321', '240690', '23'), +('15', '106', '5', '111318', '240192', '23'), +('15', '106', '5', '111319', '238137', '23'), +('15', '106', '8', '111331', '242615', '23'), +('15', '106', '8', '111332', '239667', '23'), +('15', '106', '8', '111329', '238455', '23'), +('15', '106', '8', '111030', '212975', '23'), +('15', '106', '6', '111325', '241412', '23'), +('15', '106', '6', '111322', '240528', '23'), +('15', '106', '6', '111326', '237978', '23'), +('15', '106', '6', '111024', '211697', '23'), +('15', '106', '17', '56084', '157354', '23'), +('15', '106', '17', '56045', '154435', '23'), +('15', '106', '17', '104420', '133141', '23'), +('15', '106', '17', '54855', '101053', '23'), +('15', '106', '7', '56079', '152278', '23'), +('15', '106', '7', '56040', '150725', '23'), +('15', '106', '7', '104418', '127410', '23'), +('15', '106', '7', '54850', '97074', '23'), +('15', '106', '9', '67098', '248639', '23'), +('15', '106', '9', '56033', '148567', '23'), +('15', '106', '9', '56070', '148462', '23'), +('15', '106', '9', '56031', '148400', '23'), +('15', '106', '15', '111348', '242553', '23'), +('15', '106', '15', '111342', '241679', '23'), +('15', '106', '15', '111343', '241667', '23'), +('15', '106', '15', '111346', '239898', '23'), +('15', '106', '20', '111355', '250402', '23'), +('15', '106', '20', '111351', '249019', '23'), +('15', '106', '20', '111352', '248734', '23'), +('15', '106', '20', '111053', '220762', '23'), +('15', '106', '12', '81795', '148684', '23'), +('15', '106', '12', '56074', '147072', '23'), +('15', '106', '12', '104415', '126583', '23'), +('15', '106', '12', '49656', '95986', '23'), +('15', '106', '18', '62986', '156135', '23'), +('15', '106', '18', '56041', '155870', '23'), +('15', '106', '18', '104419', '133402', '23'), +('15', '106', '18', '54851', '98254', '23'), +('15', '106', '19', '62990', '154740', '23'), +('15', '106', '19', '56037', '153610', '23'), +('15', '106', '19', '56075', '151761', '23'), +('15', '106', '19', '81763', '150840', '23'), +('15', '106', '13', '111871', '405663', '23'), +('15', '106', '13', '111815', '401643', '23'), +('15', '106', '13', '111527', '389694', '23'), +('15', '106', '13', '111515', '382696', '23'), +('15', '106', '14', '111871', '405663', '23'), +('15', '106', '14', '111815', '401643', '23'), +('15', '106', '14', '111527', '389694', '23'), +('15', '106', '14', '111515', '382696', '23'), +('15', '106', '11', '133816', '312740', '23'), +('15', '106', '11', '111338', '241273', '23'), +('15', '106', '11', '111335', '239910', '23'), +('15', '106', '11', '111333', '239839', '23'), +('15', '107', '22', '21807', '0', '23'), +('15', '107', '22', '21805', '0', '23'), +('15', '107', '22', '12425', '0', '23'), +('15', '107', '22', '7867', '0', '23'), +('15', '107', '1', '98769', '402311', '23'), +('15', '107', '1', '128691', '300395', '23'), +('15', '107', '1', '111303', '241046', '23'), +('15', '107', '1', '111300', '240963', '23'), +('15', '107', '2', '94056', '153535', '23'), +('15', '107', '2', '62985', '152153', '23'), +('15', '107', '2', '104417', '128919', '23'), +('15', '107', '2', '54846', '97831', '23'), +('15', '107', '3', '111315', '241305', '23'), +('15', '107', '3', '111313', '240747', '23'), +('15', '107', '3', '111316', '238577', '23'), +('15', '107', '3', '111014', '211590', '23'), +('15', '107', '5', '111317', '241681', '23'), +('15', '107', '5', '111321', '240696', '23'), +('15', '107', '5', '111318', '240197', '23'), +('15', '107', '5', '111319', '238143', '23'), +('15', '107', '8', '111331', '242622', '23'), +('15', '107', '8', '111332', '239673', '23'), +('15', '107', '8', '111329', '238460', '23'), +('15', '107', '8', '111030', '212982', '23'), +('15', '107', '6', '111325', '241417', '23'), +('15', '107', '6', '111322', '240532', '23'), +('15', '107', '6', '111326', '237985', '23'), +('15', '107', '6', '111024', '211702', '23'), +('15', '107', '17', '56084', '157363', '23'), +('15', '107', '17', '56045', '154439', '23'), +('15', '107', '17', '104420', '133148', '23'), +('15', '107', '17', '54855', '101057', '23'), +('15', '107', '7', '56079', '152284', '23'), +('15', '107', '7', '56040', '150731', '23'), +('15', '107', '7', '104418', '127416', '23'), +('15', '107', '7', '54850', '97077', '23'), +('15', '107', '9', '67098', '248644', '23'), +('15', '107', '9', '56033', '148571', '23'), +('15', '107', '9', '56070', '148466', '23'), +('15', '107', '9', '56031', '148404', '23'), +('15', '107', '15', '111348', '242559', '23'), +('15', '107', '15', '111342', '241685', '23'), +('15', '107', '15', '111343', '241673', '23'), +('15', '107', '15', '111346', '239903', '23'), +('15', '107', '20', '111355', '250406', '23'), +('15', '107', '20', '111351', '249024', '23'), +('15', '107', '20', '111352', '248740', '23'), +('15', '107', '20', '111053', '220766', '23'), +('15', '107', '12', '81795', '148690', '23'), +('15', '107', '12', '56074', '147076', '23'), +('15', '107', '12', '104415', '126588', '23'), +('15', '107', '12', '49656', '95987', '23'), +('15', '107', '18', '62986', '156143', '23'), +('15', '107', '18', '56041', '155874', '23'), +('15', '107', '18', '104419', '133409', '23'), +('15', '107', '18', '54851', '98260', '23'), +('15', '107', '19', '62990', '154745', '23'), +('15', '107', '19', '56037', '153617', '23'), +('15', '107', '19', '56075', '151768', '23'), +('15', '107', '19', '81763', '150848', '23'), +('15', '107', '13', '111871', '405962', '23'), +('15', '107', '13', '111815', '401942', '23'), +('15', '107', '13', '111527', '389993', '23'), +('15', '107', '13', '111515', '382994', '23'), +('15', '107', '14', '111871', '405962', '23'), +('15', '107', '14', '111815', '401942', '23'), +('15', '107', '14', '111527', '389993', '23'), +('15', '107', '14', '111515', '382994', '23'), +('15', '107', '11', '133816', '312745', '23'), +('15', '107', '11', '111338', '241279', '23'), +('15', '107', '11', '111335', '239916', '23'), +('15', '107', '11', '111333', '239843', '23'), +('15', '108', '22', '21807', '0', '23'), +('15', '108', '22', '21805', '0', '23'), +('15', '108', '22', '12425', '0', '23'), +('15', '108', '22', '7867', '0', '23'), +('15', '108', '1', '98769', '402315', '23'), +('15', '108', '1', '128691', '300399', '23'), +('15', '108', '1', '111303', '241052', '23'), +('15', '108', '1', '111300', '240968', '23'), +('15', '108', '2', '94056', '153540', '23'), +('15', '108', '2', '62985', '152159', '23'), +('15', '108', '2', '104417', '128923', '23'), +('15', '108', '2', '54846', '97836', '23'), +('15', '108', '3', '111315', '241312', '23'), +('15', '108', '3', '111313', '240752', '23'), +('15', '108', '3', '111316', '238583', '23'), +('15', '108', '3', '111014', '211597', '23'), +('15', '108', '5', '111317', '241687', '23'), +('15', '108', '5', '111321', '240703', '23'), +('15', '108', '5', '111318', '240201', '23'), +('15', '108', '5', '111319', '238149', '23'), +('15', '108', '8', '111331', '242629', '23'), +('15', '108', '8', '111332', '239678', '23'), +('15', '108', '8', '111329', '238465', '23'), +('15', '108', '8', '111030', '212989', '23'), +('15', '108', '6', '111325', '241422', '23'), +('15', '108', '6', '111322', '240536', '23'), +('15', '108', '6', '111326', '237992', '23'), +('15', '108', '6', '111024', '211707', '23'), +('15', '108', '17', '56084', '157371', '23'), +('15', '108', '17', '56045', '154444', '23'), +('15', '108', '17', '104420', '133155', '23'), +('15', '108', '17', '54855', '101061', '23'), +('15', '108', '7', '56079', '152289', '23'), +('15', '108', '7', '56040', '150737', '23'), +('15', '108', '7', '104418', '127421', '23'), +('15', '108', '7', '54850', '97080', '23'), +('15', '108', '9', '67098', '248649', '23'), +('15', '108', '9', '56033', '148576', '23'), +('15', '108', '9', '56070', '148470', '23'), +('15', '108', '9', '56031', '148408', '23'), +('15', '108', '15', '111348', '242566', '23'), +('15', '108', '15', '111342', '241692', '23'), +('15', '108', '15', '111343', '241678', '23'), +('15', '108', '15', '111346', '239908', '23'), +('15', '108', '20', '111355', '250410', '23'), +('15', '108', '20', '111351', '249029', '23'), +('15', '108', '20', '111352', '248746', '23'), +('15', '108', '20', '111053', '220770', '23'), +('15', '108', '12', '81795', '148695', '23'), +('15', '108', '12', '56074', '147081', '23'), +('15', '108', '12', '104415', '126593', '23'), +('15', '108', '12', '49656', '95987', '23'), +('15', '108', '18', '62986', '156151', '23'), +('15', '108', '18', '56041', '155878', '23'), +('15', '108', '18', '104419', '133417', '23'), +('15', '108', '18', '54851', '98266', '23'), +('15', '108', '19', '62990', '154750', '23'), +('15', '108', '19', '56037', '153623', '23'), +('15', '108', '19', '56075', '151775', '23'), +('15', '108', '19', '81763', '150855', '23'), +('15', '108', '13', '111871', '406261', '23'), +('15', '108', '13', '111815', '402241', '23'), +('15', '108', '13', '111527', '390292', '23'), +('15', '108', '13', '111515', '383293', '23'), +('15', '108', '14', '111871', '406261', '23'), +('15', '108', '14', '111815', '402241', '23'), +('15', '108', '14', '111527', '390292', '23'), +('15', '108', '14', '111515', '383293', '23'), +('15', '108', '11', '133816', '312749', '23'), +('15', '108', '11', '111338', '241284', '23'), +('15', '108', '11', '111335', '239923', '23'), +('15', '108', '11', '111333', '239846', '23'), +('15', '109', '22', '21807', '0', '23'), +('15', '109', '22', '21805', '0', '23'), +('15', '109', '22', '12425', '0', '23'), +('15', '109', '22', '7867', '0', '23'), +('15', '109', '1', '98769', '402319', '23'), +('15', '109', '1', '128691', '300403', '23'), +('15', '109', '1', '111303', '241057', '23'), +('15', '109', '1', '111300', '240972', '23'), +('15', '109', '2', '94056', '153544', '23'), +('15', '109', '2', '62985', '152164', '23'), +('15', '109', '2', '104417', '128927', '23'), +('15', '109', '2', '54846', '97841', '23'), +('15', '109', '3', '111315', '241319', '23'), +('15', '109', '3', '111313', '240757', '23'), +('15', '109', '3', '111316', '238588', '23'), +('15', '109', '3', '111014', '211604', '23'), +('15', '109', '5', '111317', '241693', '23'), +('15', '109', '5', '111321', '240708', '23'), +('15', '109', '5', '111318', '240206', '23'), +('15', '109', '5', '111319', '238155', '23'), +('15', '109', '8', '111331', '242635', '23'), +('15', '109', '8', '111332', '239684', '23'), +('15', '109', '8', '111329', '238470', '23'), +('15', '109', '8', '111030', '212995', '23'), +('15', '109', '6', '111325', '241426', '23'), +('15', '109', '6', '111322', '240540', '23'), +('15', '109', '6', '111326', '237999', '23'), +('15', '109', '6', '111024', '211711', '23'), +('15', '109', '17', '56084', '157378', '23'), +('15', '109', '17', '56045', '154448', '23'), +('15', '109', '17', '104420', '133161', '23'), +('15', '109', '17', '54855', '101066', '23'), +('15', '109', '7', '56079', '152295', '23'), +('15', '109', '7', '56040', '150743', '23'), +('15', '109', '7', '104418', '127426', '23'), +('15', '109', '7', '54850', '97083', '23'), +('15', '109', '9', '67098', '248654', '23'), +('15', '109', '9', '56033', '148580', '23'), +('15', '109', '9', '56070', '148474', '23'), +('15', '109', '9', '56031', '148413', '23'), +('15', '109', '15', '111348', '242573', '23'), +('15', '109', '15', '111342', '241698', '23'), +('15', '109', '15', '111343', '241683', '23'), +('15', '109', '15', '111346', '239913', '23'), +('15', '109', '20', '111355', '250414', '23'), +('15', '109', '20', '111351', '249034', '23'), +('15', '109', '20', '111352', '248752', '23'), +('15', '109', '20', '111053', '220774', '23'), +('15', '109', '12', '81795', '148700', '23'), +('15', '109', '12', '56074', '147085', '23'), +('15', '109', '12', '104415', '126598', '23'), +('15', '109', '12', '49656', '95988', '23'), +('15', '109', '18', '62986', '156158', '23'), +('15', '109', '18', '56041', '155882', '23'), +('15', '109', '18', '104419', '133424', '23'), +('15', '109', '18', '54851', '98272', '23'), +('15', '109', '19', '62990', '154754', '23'), +('15', '109', '19', '56037', '153629', '23'), +('15', '109', '19', '56075', '151781', '23'), +('15', '109', '19', '81763', '150861', '23'), +('15', '109', '13', '111871', '406560', '23'), +('15', '109', '13', '111815', '402540', '23'), +('15', '109', '13', '111527', '390591', '23'), +('15', '109', '13', '111515', '383591', '23'), +('15', '109', '14', '111871', '406560', '23'), +('15', '109', '14', '111815', '402540', '23'), +('15', '109', '14', '111527', '390591', '23'), +('15', '109', '14', '111515', '383591', '23'), +('15', '109', '11', '133816', '312754', '23'), +('15', '109', '11', '111338', '241290', '23'), +('15', '109', '11', '111335', '239928', '23'), +('15', '109', '11', '111333', '239850', '23'), +('15', '110', '22', '12425', '0', '25'), +('15', '110', '22', '21807', '0', '25'), +('15', '110', '22', '21805', '0', '25'), +('15', '110', '22', '39342', '0', '25'), +('15', '110', '1', '98769', '402323', '25'), +('15', '110', '1', '128691', '300407', '25'), +('15', '110', '1', '111303', '241063', '25'), +('15', '110', '1', '111300', '240977', '25'), +('15', '110', '2', '94056', '153550', '25'), +('15', '110', '2', '62985', '152170', '25'), +('15', '110', '2', '104417', '128931', '25'), +('15', '110', '2', '54846', '97846', '25'), +('15', '110', '3', '111315', '241326', '25'), +('15', '110', '3', '111313', '240763', '25'), +('15', '110', '3', '111316', '238594', '25'), +('15', '110', '3', '111014', '211611', '25'), +('15', '110', '5', '111317', '241699', '25'), +('15', '110', '5', '111321', '240715', '25'), +('15', '110', '5', '111318', '240210', '25'), +('15', '110', '5', '111319', '238161', '25'), +('15', '110', '8', '111331', '242642', '25'), +('15', '110', '8', '111332', '239689', '25'), +('15', '110', '8', '111329', '238475', '25'), +('15', '110', '8', '111030', '213002', '25'), +('15', '110', '6', '111325', '241431', '25'), +('15', '110', '6', '111322', '240544', '25'), +('15', '110', '6', '111326', '238006', '25'), +('15', '110', '6', '111024', '211716', '25'), +('15', '110', '17', '56084', '157387', '25'), +('15', '110', '17', '56045', '154453', '25'), +('15', '110', '17', '104420', '133169', '25'), +('15', '110', '17', '54855', '101070', '25'), +('15', '110', '7', '56079', '152301', '25'), +('15', '110', '7', '56040', '150749', '25'), +('15', '110', '7', '104418', '127432', '25'), +('15', '110', '7', '54850', '97086', '25'), +('15', '110', '9', '67098', '248659', '25'), +('15', '110', '9', '56033', '148584', '25'), +('15', '110', '9', '56070', '148478', '25'), +('15', '110', '9', '56031', '148417', '25'), +('15', '110', '15', '111348', '242579', '25'), +('15', '110', '15', '111342', '241705', '25'), +('15', '110', '15', '111343', '241688', '25'), +('15', '110', '15', '111346', '239917', '25'), +('15', '110', '20', '111355', '250418', '25'), +('15', '110', '20', '111351', '249039', '25'), +('15', '110', '20', '111352', '248758', '25'), +('15', '110', '20', '111053', '220778', '25'), +('15', '110', '12', '81795', '148706', '25'), +('15', '110', '12', '56074', '147089', '25'), +('15', '110', '12', '104415', '126603', '25'), +('15', '110', '12', '49656', '95989', '25'), +('15', '110', '18', '62986', '156165', '25'), +('15', '110', '18', '56041', '155886', '25'), +('15', '110', '18', '104419', '133431', '25'), +('15', '110', '18', '54851', '98278', '25'), +('15', '110', '19', '62990', '154759', '25'), +('15', '110', '19', '56037', '153635', '25'), +('15', '110', '19', '56075', '151788', '25'), +('15', '110', '19', '81763', '150868', '25'), +('15', '110', '13', '111871', '408326', '25'), +('15', '110', '13', '111815', '404306', '25'), +('15', '110', '13', '111527', '392357', '25'), +('15', '110', '13', '111515', '385357', '25'), +('15', '110', '14', '111871', '408326', '25'), +('15', '110', '14', '111815', '404306', '25'), +('15', '110', '14', '111527', '392357', '25'), +('15', '110', '14', '111515', '385357', '25'), +('15', '110', '11', '85213', '359921', '25'), +('15', '110', '11', '133816', '312759', '25'), +('15', '110', '11', '111338', '241295', '25'), +('15', '110', '11', '111335', '239935', '25'), +('15', '110', '22', '12425', '0', '24'), +('15', '110', '22', '21807', '0', '24'), +('15', '110', '22', '21805', '0', '24'), +('15', '110', '22', '39342', '0', '24'), +('15', '110', '1', '98769', '402323', '24'), +('15', '110', '1', '128691', '300407', '24'), +('15', '110', '1', '111303', '241063', '24'), +('15', '110', '1', '111300', '240977', '24'), +('15', '110', '2', '94056', '153550', '24'), +('15', '110', '2', '62985', '152170', '24'), +('15', '110', '2', '104417', '128931', '24'), +('15', '110', '2', '54846', '97846', '24'), +('15', '110', '3', '111315', '241326', '24'), +('15', '110', '3', '111313', '240763', '24'), +('15', '110', '3', '111316', '238594', '24'), +('15', '110', '3', '111014', '211611', '24'), +('15', '110', '5', '111317', '241699', '24'), +('15', '110', '5', '111321', '240715', '24'), +('15', '110', '5', '111318', '240210', '24'), +('15', '110', '5', '111319', '238161', '24'), +('15', '110', '8', '111331', '242642', '24'), +('15', '110', '8', '111332', '239689', '24'), +('15', '110', '8', '111329', '238475', '24'), +('15', '110', '8', '111030', '213002', '24'), +('15', '110', '6', '111325', '241431', '24'), +('15', '110', '6', '111322', '240544', '24'), +('15', '110', '6', '111326', '238006', '24'), +('15', '110', '6', '111024', '211716', '24'), +('15', '110', '17', '56084', '157387', '24'), +('15', '110', '17', '56045', '154453', '24'), +('15', '110', '17', '104420', '133169', '24'), +('15', '110', '17', '54855', '101070', '24'), +('15', '110', '7', '56079', '152301', '24'), +('15', '110', '7', '56040', '150749', '24'), +('15', '110', '7', '104418', '127432', '24'), +('15', '110', '7', '54850', '97086', '24'), +('15', '110', '9', '67098', '248659', '24'), +('15', '110', '9', '56033', '148584', '24'), +('15', '110', '9', '56070', '148478', '24'), +('15', '110', '9', '56031', '148417', '24'), +('15', '110', '15', '111348', '242579', '24'), +('15', '110', '15', '111342', '241705', '24'), +('15', '110', '15', '111343', '241688', '24'), +('15', '110', '15', '111346', '239917', '24'), +('15', '110', '20', '111355', '250418', '24'), +('15', '110', '20', '111351', '249039', '24'), +('15', '110', '20', '111352', '248758', '24'), +('15', '110', '20', '111053', '220778', '24'), +('15', '110', '12', '81795', '148706', '24'), +('15', '110', '12', '56074', '147089', '24'), +('15', '110', '12', '104415', '126603', '24'), +('15', '110', '12', '49656', '95989', '24'), +('15', '110', '18', '62986', '156165', '24'), +('15', '110', '18', '56041', '155886', '24'), +('15', '110', '18', '104419', '133431', '24'), +('15', '110', '18', '54851', '98278', '24'), +('15', '110', '19', '62990', '154759', '24'), +('15', '110', '19', '56037', '153635', '24'), +('15', '110', '19', '56075', '151788', '24'), +('15', '110', '19', '81763', '150868', '24'), +('15', '110', '13', '111871', '408326', '24'), +('15', '110', '13', '111815', '404306', '24'), +('15', '110', '13', '111527', '392357', '24'), +('15', '110', '13', '111515', '385357', '24'), +('15', '110', '14', '111871', '408326', '24'), +('15', '110', '14', '111815', '404306', '24'), +('15', '110', '14', '111527', '392357', '24'), +('15', '110', '14', '111515', '385357', '24'), +('15', '110', '11', '85213', '359921', '24'), +('15', '110', '11', '133816', '312759', '24'), +('15', '110', '11', '111338', '241295', '24'), +('15', '110', '11', '111335', '239935', '24'), +('15', '111', '22', '12425', '0', '25'), +('15', '111', '22', '21807', '0', '25'), +('15', '111', '22', '21805', '0', '25'), +('15', '111', '22', '39342', '0', '25'), +('15', '111', '1', '98769', '402327', '25'), +('15', '111', '1', '128691', '300411', '25'), +('15', '111', '1', '111303', '241069', '25'), +('15', '111', '1', '111300', '240982', '25'), +('15', '111', '2', '94056', '153555', '25'), +('15', '111', '2', '62985', '152176', '25'), +('15', '111', '2', '104417', '128935', '25'), +('15', '111', '2', '54846', '97851', '25'), +('15', '111', '3', '111315', '241333', '25'), +('15', '111', '3', '111313', '240768', '25'), +('15', '111', '3', '111316', '238600', '25'), +('15', '111', '3', '111014', '211618', '25'), +('15', '111', '5', '111317', '241706', '25'), +('15', '111', '5', '111321', '240721', '25'), +('15', '111', '5', '111318', '240215', '25'), +('15', '111', '5', '111319', '238167', '25'), +('15', '111', '8', '111331', '242649', '25'), +('15', '111', '8', '111332', '239695', '25'), +('15', '111', '8', '111329', '238480', '25'), +('15', '111', '8', '111030', '213009', '25'), +('15', '111', '6', '111325', '241436', '25'), +('15', '111', '6', '111322', '240548', '25'), +('15', '111', '6', '111326', '238013', '25'), +('15', '111', '6', '111024', '211721', '25'), +('15', '111', '17', '56084', '157395', '25'), +('15', '111', '17', '56045', '154457', '25'), +('15', '111', '17', '104420', '133176', '25'), +('15', '111', '17', '54855', '101075', '25'), +('15', '111', '7', '56079', '152307', '25'), +('15', '111', '7', '56040', '150755', '25'), +('15', '111', '7', '104418', '127437', '25'), +('15', '111', '7', '54850', '97089', '25'), +('15', '111', '9', '67098', '248665', '25'), +('15', '111', '9', '56033', '148589', '25'), +('15', '111', '9', '56070', '148483', '25'), +('15', '111', '9', '56031', '148422', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('15', '111', '15', '111348', '242586', '25'), +('15', '111', '15', '111342', '241711', '25'), +('15', '111', '15', '111343', '241693', '25'), +('15', '111', '15', '111346', '239922', '25'), +('15', '111', '20', '111355', '250422', '25'), +('15', '111', '20', '111351', '249044', '25'), +('15', '111', '20', '111352', '248764', '25'), +('15', '111', '20', '111053', '220782', '25'), +('15', '111', '12', '81795', '148711', '25'), +('15', '111', '12', '56074', '147094', '25'), +('15', '111', '12', '104415', '126608', '25'), +('15', '111', '12', '49656', '95990', '25'), +('15', '111', '18', '62986', '156173', '25'), +('15', '111', '18', '56041', '155891', '25'), +('15', '111', '18', '104419', '133439', '25'), +('15', '111', '18', '54851', '98284', '25'), +('15', '111', '19', '62990', '154764', '25'), +('15', '111', '19', '56037', '153641', '25'), +('15', '111', '19', '56075', '151794', '25'), +('15', '111', '19', '81763', '150876', '25'), +('15', '111', '13', '111871', '408625', '25'), +('15', '111', '13', '111815', '404605', '25'), +('15', '111', '13', '111527', '392656', '25'), +('15', '111', '13', '111515', '385655', '25'), +('15', '111', '14', '111871', '408625', '25'), +('15', '111', '14', '111815', '404605', '25'), +('15', '111', '14', '111527', '392656', '25'), +('15', '111', '14', '111515', '385655', '25'), +('15', '111', '11', '85213', '359925', '25'), +('15', '111', '11', '133816', '312763', '25'), +('15', '111', '11', '111338', '241301', '25'), +('15', '111', '11', '111335', '239941', '25'), +('15', '112', '22', '12425', '0', '25'), +('15', '112', '22', '21807', '0', '25'), +('15', '112', '22', '21805', '0', '25'), +('15', '112', '22', '39342', '0', '25'), +('15', '112', '1', '98769', '402331', '25'), +('15', '112', '1', '128691', '300416', '25'), +('15', '112', '1', '111303', '241074', '25'), +('15', '112', '1', '111300', '240987', '25'), +('15', '112', '2', '94056', '153560', '25'), +('15', '112', '2', '62985', '152181', '25'), +('15', '112', '2', '104417', '128940', '25'), +('15', '112', '2', '54846', '97857', '25'), +('15', '112', '3', '111315', '241340', '25'), +('15', '112', '3', '111313', '240774', '25'), +('15', '112', '3', '111316', '238606', '25'), +('15', '112', '3', '111014', '211625', '25'), +('15', '112', '5', '111317', '241712', '25'), +('15', '112', '5', '111321', '240727', '25'), +('15', '112', '5', '111318', '240219', '25'), +('15', '112', '5', '111319', '238173', '25'), +('15', '112', '8', '111331', '242656', '25'), +('15', '112', '8', '111332', '239700', '25'), +('15', '112', '8', '111329', '238485', '25'), +('15', '112', '8', '111030', '213016', '25'), +('15', '112', '6', '111325', '241441', '25'), +('15', '112', '6', '111322', '240552', '25'), +('15', '112', '6', '111326', '238020', '25'), +('15', '112', '6', '111024', '211726', '25'), +('15', '112', '17', '56084', '157403', '25'), +('15', '112', '17', '56045', '154462', '25'), +('15', '112', '17', '104420', '133183', '25'), +('15', '112', '17', '54855', '101079', '25'), +('15', '112', '7', '56079', '152312', '25'), +('15', '112', '7', '56040', '150761', '25'), +('15', '112', '7', '104418', '127443', '25'), +('15', '112', '7', '54850', '97093', '25'), +('15', '112', '9', '67098', '248670', '25'), +('15', '112', '9', '56033', '148593', '25'), +('15', '112', '9', '56070', '148487', '25'), +('15', '112', '9', '56031', '148426', '25'), +('15', '112', '15', '111348', '242593', '25'), +('15', '112', '15', '111342', '241718', '25'), +('15', '112', '15', '111343', '241698', '25'), +('15', '112', '15', '111346', '239927', '25'), +('15', '112', '20', '111355', '250426', '25'), +('15', '112', '20', '111351', '249049', '25'), +('15', '112', '20', '111352', '248770', '25'), +('15', '112', '20', '111053', '220786', '25'), +('15', '112', '12', '81795', '148717', '25'), +('15', '112', '12', '56074', '147099', '25'), +('15', '112', '12', '104415', '126613', '25'), +('15', '112', '12', '49656', '95990', '25'), +('15', '112', '18', '62986', '156180', '25'), +('15', '112', '18', '56041', '155895', '25'), +('15', '112', '18', '104419', '133446', '25'), +('15', '112', '18', '54851', '98290', '25'), +('15', '112', '19', '62990', '154769', '25'), +('15', '112', '19', '56037', '153647', '25'), +('15', '112', '19', '56075', '151801', '25'), +('15', '112', '19', '81763', '150883', '25'), +('15', '112', '13', '111871', '408924', '25'), +('15', '112', '13', '111815', '404904', '25'), +('15', '112', '13', '111527', '392955', '25'), +('15', '112', '13', '111515', '385954', '25'), +('15', '112', '14', '111871', '408924', '25'), +('15', '112', '14', '111815', '404904', '25'), +('15', '112', '14', '111527', '392955', '25'), +('15', '112', '14', '111515', '385954', '25'), +('15', '112', '11', '85213', '359929', '25'), +('15', '112', '11', '133816', '312768', '25'), +('15', '112', '11', '111338', '241307', '25'), +('15', '112', '11', '111335', '239947', '25'), +('15', '113', '22', '12425', '0', '25'), +('15', '113', '22', '21807', '0', '25'), +('15', '113', '22', '21805', '0', '25'), +('15', '113', '22', '39342', '0', '25'), +('15', '113', '1', '98769', '402335', '25'), +('15', '113', '1', '128691', '300420', '25'), +('15', '113', '1', '111303', '241080', '25'), +('15', '113', '1', '111300', '240991', '25'), +('15', '113', '2', '94056', '153565', '25'), +('15', '113', '2', '62985', '152187', '25'), +('15', '113', '2', '104417', '128944', '25'), +('15', '113', '2', '54846', '97862', '25'), +('15', '113', '3', '111315', '241347', '25'), +('15', '113', '3', '111313', '240779', '25'), +('15', '113', '3', '111316', '238611', '25'), +('15', '113', '3', '111014', '211632', '25'), +('15', '113', '5', '111317', '241718', '25'), +('15', '113', '5', '111321', '240733', '25'), +('15', '113', '5', '111318', '240224', '25'), +('15', '113', '5', '111319', '238179', '25'), +('15', '113', '8', '111331', '242662', '25'), +('15', '113', '8', '111332', '239706', '25'), +('15', '113', '8', '111329', '238490', '25'), +('15', '113', '8', '111030', '213022', '25'), +('15', '113', '6', '111325', '241446', '25'), +('15', '113', '6', '111322', '240556', '25'), +('15', '113', '6', '111326', '238027', '25'), +('15', '113', '6', '111024', '211731', '25'), +('15', '113', '17', '56084', '157411', '25'), +('15', '113', '17', '56045', '154467', '25'), +('15', '113', '17', '104420', '133190', '25'), +('15', '113', '17', '54855', '101083', '25'), +('15', '113', '7', '56079', '152318', '25'), +('15', '113', '7', '56040', '150767', '25'), +('15', '113', '7', '104418', '127448', '25'), +('15', '113', '7', '54850', '97096', '25'), +('15', '113', '9', '67098', '248675', '25'), +('15', '113', '9', '56033', '148597', '25'), +('15', '113', '9', '56070', '148491', '25'), +('15', '113', '9', '56031', '148430', '25'), +('15', '113', '15', '111348', '242600', '25'), +('15', '113', '15', '111342', '241724', '25'), +('15', '113', '15', '111343', '241703', '25'), +('15', '113', '15', '111346', '239932', '25'), +('15', '113', '20', '111355', '250430', '25'), +('15', '113', '20', '111351', '249054', '25'), +('15', '113', '20', '111352', '248776', '25'), +('15', '113', '20', '111053', '220790', '25'), +('15', '113', '12', '81795', '148722', '25'), +('15', '113', '12', '56074', '147103', '25'), +('15', '113', '12', '104415', '126618', '25'), +('15', '113', '12', '49656', '95991', '25'), +('15', '113', '18', '62986', '156188', '25'), +('15', '113', '18', '56041', '155899', '25'), +('15', '113', '18', '104419', '133454', '25'), +('15', '113', '18', '54851', '98296', '25'), +('15', '113', '19', '62990', '154774', '25'), +('15', '113', '19', '56037', '153653', '25'), +('15', '113', '19', '56075', '151807', '25'), +('15', '113', '19', '81763', '150890', '25'), +('15', '113', '13', '111871', '409224', '25'), +('15', '113', '13', '111815', '405203', '25'), +('15', '113', '13', '111527', '393254', '25'), +('15', '113', '13', '111515', '386253', '25'), +('15', '113', '14', '111871', '409224', '25'), +('15', '113', '14', '111815', '405203', '25'), +('15', '113', '14', '111527', '393254', '25'), +('15', '113', '14', '111515', '386253', '25'), +('15', '113', '11', '85213', '359933', '25'), +('15', '113', '11', '133816', '312773', '25'), +('15', '113', '11', '111338', '241312', '25'), +('15', '113', '11', '111335', '239953', '25'), +('15', '114', '22', '12425', '0', '25'), +('15', '114', '22', '21807', '0', '25'), +('15', '114', '22', '21805', '0', '25'), +('15', '114', '22', '39342', '0', '25'), +('15', '114', '1', '98769', '402339', '25'), +('15', '114', '1', '128691', '300424', '25'), +('15', '114', '1', '111303', '241086', '25'), +('15', '114', '1', '111300', '240996', '25'), +('15', '114', '2', '94056', '153570', '25'), +('15', '114', '2', '62985', '152193', '25'), +('15', '114', '2', '104417', '128948', '25'), +('15', '114', '2', '54846', '97867', '25'), +('15', '114', '3', '111315', '241354', '25'), +('15', '114', '3', '111313', '240785', '25'), +('15', '114', '3', '111316', '238617', '25'), +('15', '114', '3', '111014', '211639', '25'), +('15', '114', '5', '111317', '241725', '25'), +('15', '114', '5', '111321', '240739', '25'), +('15', '114', '5', '111318', '240228', '25'), +('15', '114', '5', '111319', '238185', '25'), +('15', '114', '8', '111331', '242669', '25'), +('15', '114', '8', '111332', '239711', '25'), +('15', '114', '8', '111329', '238496', '25'), +('15', '114', '8', '111030', '213029', '25'), +('15', '114', '6', '111325', '241451', '25'), +('15', '114', '6', '111322', '240560', '25'), +('15', '114', '6', '111326', '238034', '25'), +('15', '114', '6', '111024', '211736', '25'), +('15', '114', '17', '56084', '157419', '25'), +('15', '114', '17', '56045', '154471', '25'), +('15', '114', '17', '104420', '133197', '25'), +('15', '114', '17', '54855', '101088', '25'), +('15', '114', '7', '56079', '152324', '25'), +('15', '114', '7', '56040', '150773', '25'), +('15', '114', '7', '104418', '127454', '25'), +('15', '114', '7', '54850', '97099', '25'), +('15', '114', '9', '67098', '248680', '25'), +('15', '114', '9', '56033', '148602', '25'), +('15', '114', '9', '56070', '148495', '25'), +('15', '114', '9', '56031', '148435', '25'), +('15', '114', '15', '111348', '242607', '25'), +('15', '114', '15', '111342', '241731', '25'), +('15', '114', '15', '111343', '241709', '25'), +('15', '114', '15', '111346', '239937', '25'), +('15', '114', '20', '111355', '250434', '25'), +('15', '114', '20', '111351', '249059', '25'), +('15', '114', '20', '111352', '248782', '25'), +('15', '114', '20', '111053', '220794', '25'), +('15', '114', '12', '81795', '148727', '25'), +('15', '114', '12', '56074', '147108', '25'), +('15', '114', '12', '104415', '126623', '25'), +('15', '114', '12', '49656', '95992', '25'), +('15', '114', '18', '62986', '156195', '25'), +('15', '114', '18', '56041', '155903', '25'), +('15', '114', '18', '104419', '133461', '25'), +('15', '114', '18', '54851', '98302', '25'), +('15', '114', '19', '62990', '154778', '25'), +('15', '114', '19', '56037', '153660', '25'), +('15', '114', '19', '56075', '151814', '25'), +('15', '114', '19', '81763', '150897', '25'), +('15', '114', '13', '111871', '409523', '25'), +('15', '114', '13', '111815', '405502', '25'), +('15', '114', '13', '111527', '393552', '25'), +('15', '114', '13', '111515', '386551', '25'), +('15', '114', '14', '111871', '409523', '25'), +('15', '114', '14', '111815', '405502', '25'), +('15', '114', '14', '111527', '393552', '25'), +('15', '114', '14', '111515', '386551', '25'), +('15', '114', '11', '85213', '359937', '25'), +('15', '114', '11', '133816', '312777', '25'), +('15', '114', '11', '111338', '241318', '25'), +('15', '114', '11', '111335', '239959', '25'), +('15', '115', '22', '12425', '0', '26'), +('15', '115', '22', '21807', '0', '26'), +('15', '115', '22', '21805', '0', '26'), +('15', '115', '22', '39342', '0', '26'), +('15', '115', '1', '98769', '402343', '26'), +('15', '115', '1', '128691', '300428', '26'), +('15', '115', '1', '111303', '241092', '26'), +('15', '115', '1', '111300', '241001', '26'), +('15', '115', '2', '94056', '153575', '26'), +('15', '115', '2', '62985', '152198', '26'), +('15', '115', '2', '104417', '128952', '26'), +('15', '115', '2', '54846', '97872', '26'), +('15', '115', '3', '111315', '241361', '26'), +('15', '115', '3', '111313', '240790', '26'), +('15', '115', '3', '111316', '238623', '26'), +('15', '115', '3', '111014', '211646', '26'), +('15', '115', '5', '111317', '241731', '26'), +('15', '115', '5', '111321', '240746', '26'), +('15', '115', '5', '111318', '240233', '26'), +('15', '115', '5', '111319', '238192', '26'), +('15', '115', '8', '111331', '242676', '26'), +('15', '115', '8', '111332', '239717', '26'), +('15', '115', '8', '111329', '238501', '26'), +('15', '115', '8', '111030', '213036', '26'), +('15', '115', '6', '111325', '241456', '26'), +('15', '115', '6', '111322', '240564', '26'), +('15', '115', '6', '111326', '238041', '26'), +('15', '115', '6', '111024', '211741', '26'), +('15', '115', '17', '56084', '157428', '26'), +('15', '115', '17', '56045', '154476', '26'), +('15', '115', '17', '104420', '133204', '26'), +('15', '115', '17', '54855', '101092', '26'), +('15', '115', '7', '56079', '152330', '26'), +('15', '115', '7', '56040', '150779', '26'), +('15', '115', '7', '104418', '127459', '26'), +('15', '115', '7', '54850', '97102', '26'), +('15', '115', '9', '67098', '248685', '26'), +('15', '115', '9', '56033', '148606', '26'), +('15', '115', '9', '56070', '148500', '26'), +('15', '115', '9', '56031', '148439', '26'), +('15', '115', '15', '111348', '242614', '26'), +('15', '115', '15', '111342', '241737', '26'), +('15', '115', '15', '111343', '241714', '26'), +('15', '115', '15', '111346', '239941', '26'), +('15', '115', '20', '111355', '250438', '26'), +('15', '115', '20', '111351', '249065', '26'), +('15', '115', '20', '111352', '248788', '26'), +('15', '115', '20', '111053', '220798', '26'), +('15', '115', '12', '81795', '148733', '26'), +('15', '115', '12', '56074', '147112', '26'), +('15', '115', '12', '104415', '126628', '26'), +('15', '115', '12', '49656', '95993', '26'), +('15', '115', '18', '62986', '156203', '26'), +('15', '115', '18', '56041', '155907', '26'), +('15', '115', '18', '104419', '133469', '26'), +('15', '115', '18', '54851', '98308', '26'), +('15', '115', '19', '62990', '154783', '26'), +('15', '115', '19', '56037', '153666', '26'), +('15', '115', '19', '56075', '151821', '26'), +('15', '115', '19', '81763', '150904', '26'), +('15', '115', '13', '111871', '409822', '26'), +('15', '115', '13', '111815', '405802', '26'), +('15', '115', '13', '111527', '393851', '26'), +('15', '115', '13', '111515', '386850', '26'), +('15', '115', '14', '111871', '409822', '26'), +('15', '115', '14', '111815', '405802', '26'), +('15', '115', '14', '111527', '393851', '26'), +('15', '115', '14', '111515', '386850', '26'), +('15', '115', '11', '85213', '359941', '26'), +('15', '115', '11', '133816', '312782', '26'), +('15', '115', '11', '111338', '241324', '26'), +('15', '115', '11', '111335', '239965', '26'), +('16', '1', '22', '10323', '0', '0'), +('16', '1', '22', '10664', '0', '0'), +('16', '1', '22', '9246', '0', '0'), +('16', '1', '22', '21509', '0', '0'), +('16', '1', '1', '14701', '3802', '0'), +('16', '1', '1', '14702', '2500', '0'), +('16', '1', '1', '10165', '1683', '0'), +('16', '1', '1', '30361', '1140', '0'), +('16', '1', '2', '1519', '3207', '0'), +('16', '1', '2', '4831', '3020', '0'), +('16', '1', '2', '10142', '3012', '0'), +('16', '1', '2', '4341', '2712', '0'), +('16', '1', '3', '10144', '1304', '0'), +('16', '1', '3', '14706', '990', '0'), +('16', '1', '3', '14705', '990', '0'), +('16', '1', '3', '3314', '785', '0'), +('16', '1', '5', '14703', '5500', '0'), +('16', '1', '5', '14700', '3453', '0'), +('16', '1', '5', '10055', '3255', '0'), +('16', '1', '5', '2583', '2287', '0'), +('16', '1', '8', '11621', '14171', '0'), +('16', '1', '8', '1409', '6312', '0'), +('16', '1', '8', '11551', '5129', '0'), +('16', '1', '8', '2400', '2808', '0'), +('16', '1', '6', '1557', '6760', '0'), +('16', '1', '6', '25062', '1817', '0'), +('16', '1', '6', '4165', '1812', '0'), +('16', '1', '6', '4302', '1686', '0'), +('16', '1', '17', '4832', '6263', '0'), +('16', '1', '17', '4309', '5576', '0'), +('16', '1', '17', '11623', '4979', '0'), +('16', '1', '17', '4342', '3322', '0'), +('16', '1', '7', '4833', '3567', '0'), +('16', '1', '7', '71303', '2689', '0'), +('16', '1', '7', '2458', '2406', '0'), +('16', '1', '7', '4411', '2083', '0'), +('16', '1', '9', '4834', '2625', '0'), +('16', '1', '9', '12189', '2263', '0'), +('16', '1', '9', '10149', '2255', '0'), +('16', '1', '9', '14650', '1802', '0'), +('16', '1', '15', '10366', '8005', '0'), +('16', '1', '15', '10151', '7200', '0'), +('16', '1', '15', '14679', '6255', '0'), +('16', '1', '15', '14678', '5104', '0'), +('16', '1', '20', '11601', '7607', '0'), +('16', '1', '20', '1365', '4200', '0'), +('16', '1', '20', '2471', '3804', '0'), +('16', '1', '20', '1543', '2876', '0'), +('16', '1', '12', '4835', '7440', '0'), +('16', '1', '12', '20655', '4848', '0'), +('16', '1', '12', '2923', '3404', '0'), +('16', '1', '12', '11624', '2387', '0'), +('16', '1', '18', '4836', '3346', '0'), +('16', '1', '18', '2461', '2557', '0'), +('16', '1', '18', '4346', '2276', '0'), +('16', '1', '18', '4412', '2083', '0'), +('16', '1', '19', '4837', '3923', '0'), +('16', '1', '19', '68239', '3223', '0'), +('16', '1', '19', '2337', '1757', '0'), +('16', '1', '19', '3312', '1392', '0'), +('16', '1', '13', '5622', '28028', '0'), +('16', '1', '13', '11609', '27927', '0'), +('16', '1', '13', '5412', '25806', '0'), +('16', '1', '13', '5401', '24664', '0'), +('16', '1', '14', '11551', '12679', '0'), +('16', '1', '14', '14762', '2181', '0'), +('16', '1', '14', '6359', '1753', '0'), +('16', '1', '14', '10323', '755', '0'), +('16', '1', '11', '14762', '2181', '0'), +('16', '1', '11', '20677', '1800', '0'), +('16', '1', '11', '9246', '604', '0'), +('16', '1', '11', '13748', '454', '0'), +('16', '2', '22', '10323', '0', '0'), +('16', '2', '22', '10664', '0', '0'), +('16', '2', '22', '9246', '0', '0'), +('16', '2', '22', '21509', '0', '0'), +('16', '2', '1', '14701', '3802', '0'), +('16', '2', '1', '14702', '2500', '0'), +('16', '2', '1', '10165', '1683', '0'), +('16', '2', '1', '30361', '1140', '0'), +('16', '2', '2', '1519', '3207', '0'), +('16', '2', '2', '4831', '3020', '0'), +('16', '2', '2', '10142', '3012', '0'), +('16', '2', '2', '4341', '2712', '0'), +('16', '2', '3', '10144', '1304', '0'), +('16', '2', '3', '14706', '990', '0'), +('16', '2', '3', '14705', '990', '0'), +('16', '2', '3', '3314', '785', '0'), +('16', '2', '5', '14703', '5500', '0'), +('16', '2', '5', '14700', '3453', '0'), +('16', '2', '5', '10055', '3255', '0'), +('16', '2', '5', '2583', '2287', '0'), +('16', '2', '8', '11621', '14171', '0'), +('16', '2', '8', '1409', '6312', '0'), +('16', '2', '8', '11551', '5129', '0'), +('16', '2', '8', '2400', '2808', '0'), +('16', '2', '6', '1557', '6760', '0'), +('16', '2', '6', '25062', '1817', '0'), +('16', '2', '6', '4165', '1812', '0'), +('16', '2', '6', '4302', '1712', '0'), +('16', '2', '17', '4832', '6327', '0'), +('16', '2', '17', '4309', '5576', '0'), +('16', '2', '17', '11623', '4979', '0'), +('16', '2', '17', '4342', '3322', '0'), +('16', '2', '7', '4833', '3567', '0'), +('16', '2', '7', '71303', '2689', '0'), +('16', '2', '7', '2458', '2406', '0'), +('16', '2', '7', '4411', '2083', '0'), +('16', '2', '9', '4834', '2625', '0'), +('16', '2', '9', '12189', '2263', '0'), +('16', '2', '9', '10149', '2255', '0'), +('16', '2', '9', '14650', '1802', '0'), +('16', '2', '15', '10366', '8005', '0'), +('16', '2', '15', '10151', '7200', '0'), +('16', '2', '15', '14679', '6255', '0'), +('16', '2', '15', '14678', '5104', '0'), +('16', '2', '20', '11601', '7650', '0'), +('16', '2', '20', '1365', '4200', '0'), +('16', '2', '20', '2471', '3804', '0'), +('16', '2', '20', '1543', '2876', '0'), +('16', '2', '12', '4835', '7461', '0'), +('16', '2', '12', '20655', '4856', '0'), +('16', '2', '12', '2923', '3404', '0'), +('16', '2', '12', '11624', '2416', '0'), +('16', '2', '18', '4836', '3367', '0'), +('16', '2', '18', '2461', '2557', '0'), +('16', '2', '18', '4346', '2276', '0'), +('16', '2', '18', '4412', '2083', '0'), +('16', '2', '19', '4837', '3923', '0'), +('16', '2', '19', '68239', '3223', '0'), +('16', '2', '19', '2337', '1757', '0'), +('16', '2', '19', '3312', '1392', '0'), +('16', '2', '13', '5622', '28028', '0'), +('16', '2', '13', '11609', '27927', '0'), +('16', '2', '13', '5412', '25806', '0'), +('16', '2', '13', '5401', '24664', '0'), +('16', '2', '14', '11551', '12679', '0'), +('16', '2', '14', '14762', '2181', '0'), +('16', '2', '14', '6359', '1753', '0'), +('16', '2', '14', '10323', '755', '0'), +('16', '2', '11', '14762', '2181', '0'), +('16', '2', '11', '20677', '1800', '0'), +('16', '2', '11', '9246', '604', '0'), +('16', '2', '11', '13748', '454', '0'), +('16', '3', '22', '10323', '0', '0'), +('16', '3', '22', '10664', '0', '0'), +('16', '3', '22', '9246', '0', '0'), +('16', '3', '22', '21509', '0', '0'), +('16', '3', '1', '14701', '3802', '0'), +('16', '3', '1', '14702', '2500', '0'), +('16', '3', '1', '10165', '1683', '0'), +('16', '3', '1', '30361', '1140', '0'), +('16', '3', '2', '1519', '3207', '0'), +('16', '3', '2', '4831', '3020', '0'), +('16', '3', '2', '10142', '3012', '0'), +('16', '3', '2', '4341', '2712', '0'), +('16', '3', '3', '10144', '1304', '0'), +('16', '3', '3', '14706', '990', '0'), +('16', '3', '3', '14705', '990', '0'), +('16', '3', '3', '3314', '785', '0'), +('16', '3', '5', '14703', '5500', '0'), +('16', '3', '5', '14700', '3453', '0'), +('16', '3', '5', '10055', '3255', '0'), +('16', '3', '5', '2583', '2287', '0'), +('16', '3', '8', '11621', '14171', '0'), +('16', '3', '8', '1409', '6312', '0'), +('16', '3', '8', '11551', '5129', '0'), +('16', '3', '8', '2400', '2808', '0'), +('16', '3', '6', '1557', '6760', '0'), +('16', '3', '6', '25062', '1817', '0'), +('16', '3', '6', '4165', '1812', '0'), +('16', '3', '6', '4302', '1737', '0'), +('16', '3', '17', '4832', '6390', '0'), +('16', '3', '17', '4309', '5576', '0'), +('16', '3', '17', '11623', '4979', '0'), +('16', '3', '17', '4342', '3322', '0'), +('16', '3', '7', '4833', '3567', '0'), +('16', '3', '7', '71303', '2689', '0'), +('16', '3', '7', '2458', '2406', '0'), +('16', '3', '7', '4411', '2083', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '3', '9', '4834', '2625', '0'), +('16', '3', '9', '12189', '2263', '0'), +('16', '3', '9', '10149', '2255', '0'), +('16', '3', '9', '14650', '1802', '0'), +('16', '3', '15', '10366', '8005', '0'), +('16', '3', '15', '10151', '7200', '0'), +('16', '3', '15', '14679', '6255', '0'), +('16', '3', '15', '14678', '5104', '0'), +('16', '3', '20', '11601', '7692', '0'), +('16', '3', '20', '1365', '4200', '0'), +('16', '3', '20', '2471', '3804', '0'), +('16', '3', '20', '1543', '2876', '0'), +('16', '3', '12', '4835', '7482', '0'), +('16', '3', '12', '20655', '4865', '0'), +('16', '3', '12', '2923', '3404', '0'), +('16', '3', '12', '11624', '2446', '0'), +('16', '3', '18', '4836', '3388', '0'), +('16', '3', '18', '2461', '2557', '0'), +('16', '3', '18', '4346', '2276', '0'), +('16', '3', '18', '4412', '2083', '0'), +('16', '3', '19', '4837', '3923', '0'), +('16', '3', '19', '68239', '3223', '0'), +('16', '3', '19', '2337', '1757', '0'), +('16', '3', '19', '3312', '1392', '0'), +('16', '3', '13', '5622', '28028', '0'), +('16', '3', '13', '11609', '27927', '0'), +('16', '3', '13', '5412', '25806', '0'), +('16', '3', '13', '5401', '24664', '0'), +('16', '3', '14', '11551', '12679', '0'), +('16', '3', '14', '14762', '2181', '0'), +('16', '3', '14', '6359', '1753', '0'), +('16', '3', '14', '10323', '755', '0'), +('16', '3', '11', '14762', '2181', '0'), +('16', '3', '11', '20677', '1800', '0'), +('16', '3', '11', '9246', '604', '0'), +('16', '3', '11', '13748', '454', '0'), +('16', '4', '22', '10323', '0', '0'), +('16', '4', '22', '10664', '0', '0'), +('16', '4', '22', '9246', '0', '0'), +('16', '4', '22', '21509', '0', '0'), +('16', '4', '1', '14701', '3802', '0'), +('16', '4', '1', '14702', '2500', '0'), +('16', '4', '1', '10165', '1683', '0'), +('16', '4', '1', '30361', '1140', '0'), +('16', '4', '2', '1519', '3207', '0'), +('16', '4', '2', '4831', '3020', '0'), +('16', '4', '2', '10142', '3012', '0'), +('16', '4', '2', '4341', '2712', '0'), +('16', '4', '3', '10144', '1304', '0'), +('16', '4', '3', '14706', '990', '0'), +('16', '4', '3', '14705', '990', '0'), +('16', '4', '3', '3314', '785', '0'), +('16', '4', '5', '14703', '5500', '0'), +('16', '4', '5', '14700', '3453', '0'), +('16', '4', '5', '10055', '3255', '0'), +('16', '4', '5', '2583', '2287', '0'), +('16', '4', '8', '11621', '14171', '0'), +('16', '4', '8', '1409', '6312', '0'), +('16', '4', '8', '11551', '5129', '0'), +('16', '4', '8', '2400', '2808', '0'), +('16', '4', '6', '1557', '6760', '0'), +('16', '4', '6', '25062', '1817', '0'), +('16', '4', '6', '4165', '1812', '0'), +('16', '4', '6', '4302', '1762', '0'), +('16', '4', '17', '4832', '6454', '0'), +('16', '4', '17', '4309', '5576', '0'), +('16', '4', '17', '11623', '4979', '0'), +('16', '4', '17', '4342', '3322', '0'), +('16', '4', '7', '4833', '3567', '0'), +('16', '4', '7', '71303', '2689', '0'), +('16', '4', '7', '2458', '2406', '0'), +('16', '4', '7', '4411', '2083', '0'), +('16', '4', '9', '4834', '2625', '0'), +('16', '4', '9', '12189', '2263', '0'), +('16', '4', '9', '10149', '2255', '0'), +('16', '4', '9', '14650', '1802', '0'), +('16', '4', '15', '10366', '8005', '0'), +('16', '4', '15', '10151', '7200', '0'), +('16', '4', '15', '14679', '6255', '0'), +('16', '4', '15', '14678', '5104', '0'), +('16', '4', '20', '11601', '7734', '0'), +('16', '4', '20', '1365', '4200', '0'), +('16', '4', '20', '2471', '3804', '0'), +('16', '4', '20', '1543', '2876', '0'), +('16', '4', '12', '4835', '7504', '0'), +('16', '4', '12', '20655', '4873', '0'), +('16', '4', '12', '2923', '3404', '0'), +('16', '4', '12', '11624', '2475', '0'), +('16', '4', '18', '4836', '3410', '0'), +('16', '4', '18', '2461', '2557', '0'), +('16', '4', '18', '4346', '2276', '0'), +('16', '4', '18', '4412', '2083', '0'), +('16', '4', '19', '4837', '3923', '0'), +('16', '4', '19', '68239', '3223', '0'), +('16', '4', '19', '2337', '1757', '0'), +('16', '4', '19', '3312', '1392', '0'), +('16', '4', '13', '5622', '28028', '0'), +('16', '4', '13', '11609', '27927', '0'), +('16', '4', '13', '5412', '25806', '0'), +('16', '4', '13', '5401', '24664', '0'), +('16', '4', '14', '11551', '12679', '0'), +('16', '4', '14', '14762', '2181', '0'), +('16', '4', '14', '6359', '1753', '0'), +('16', '4', '14', '10323', '755', '0'), +('16', '4', '11', '14762', '2181', '0'), +('16', '4', '11', '20677', '1800', '0'), +('16', '4', '11', '9246', '604', '0'), +('16', '4', '11', '13748', '454', '0'), +('16', '5', '22', '10323', '0', '0'), +('16', '5', '22', '10664', '0', '0'), +('16', '5', '22', '9246', '0', '0'), +('16', '5', '22', '21509', '0', '0'), +('16', '5', '1', '14701', '3802', '0'), +('16', '5', '1', '14702', '2500', '0'), +('16', '5', '1', '10165', '1683', '0'), +('16', '5', '1', '30361', '1140', '0'), +('16', '5', '2', '1519', '3207', '0'), +('16', '5', '2', '4831', '3020', '0'), +('16', '5', '2', '10142', '3012', '0'), +('16', '5', '2', '4341', '2712', '0'), +('16', '5', '3', '10144', '1304', '0'), +('16', '5', '3', '14706', '990', '0'), +('16', '5', '3', '14705', '990', '0'), +('16', '5', '3', '3314', '785', '0'), +('16', '5', '5', '14703', '5500', '0'), +('16', '5', '5', '14700', '3453', '0'), +('16', '5', '5', '10055', '3255', '0'), +('16', '5', '5', '2583', '2287', '0'), +('16', '5', '8', '11621', '14171', '0'), +('16', '5', '8', '1409', '6312', '0'), +('16', '5', '8', '11551', '5129', '0'), +('16', '5', '8', '2400', '2808', '0'), +('16', '5', '6', '1557', '6760', '0'), +('16', '5', '6', '25062', '1817', '0'), +('16', '5', '6', '4165', '1812', '0'), +('16', '5', '6', '4302', '1791', '0'), +('16', '5', '17', '4832', '6526', '0'), +('16', '5', '17', '4309', '5576', '0'), +('16', '5', '17', '11623', '4979', '0'), +('16', '5', '17', '4342', '3322', '0'), +('16', '5', '7', '4833', '3567', '0'), +('16', '5', '7', '71303', '2689', '0'), +('16', '5', '7', '2458', '2406', '0'), +('16', '5', '7', '4411', '2083', '0'), +('16', '5', '9', '4834', '2625', '0'), +('16', '5', '9', '12189', '2263', '0'), +('16', '5', '9', '10149', '2255', '0'), +('16', '5', '9', '14650', '1802', '0'), +('16', '5', '15', '10366', '8005', '0'), +('16', '5', '15', '10151', '7200', '0'), +('16', '5', '15', '14679', '6255', '0'), +('16', '5', '15', '14678', '5104', '0'), +('16', '5', '20', '11601', '7782', '0'), +('16', '5', '20', '1365', '4200', '0'), +('16', '5', '20', '2471', '3804', '0'), +('16', '5', '20', '1543', '2876', '0'), +('16', '5', '12', '4835', '7528', '0'), +('16', '5', '12', '20655', '4883', '0'), +('16', '5', '12', '2923', '3404', '0'), +('16', '5', '12', '11624', '2509', '0'), +('16', '5', '18', '4836', '3434', '0'), +('16', '5', '18', '2461', '2557', '0'), +('16', '5', '18', '4346', '2276', '0'), +('16', '5', '18', '4412', '2083', '0'), +('16', '5', '19', '4837', '3923', '0'), +('16', '5', '19', '68239', '3223', '0'), +('16', '5', '19', '2337', '1757', '0'), +('16', '5', '19', '3312', '1392', '0'), +('16', '5', '13', '5622', '28028', '0'), +('16', '5', '13', '11609', '27927', '0'), +('16', '5', '13', '5412', '25806', '0'), +('16', '5', '13', '5401', '24664', '0'), +('16', '5', '14', '11551', '12679', '0'), +('16', '5', '14', '14762', '2181', '0'), +('16', '5', '14', '6359', '1753', '0'), +('16', '5', '14', '10323', '755', '0'), +('16', '5', '11', '14762', '2181', '0'), +('16', '5', '11', '20677', '1800', '0'), +('16', '5', '11', '9246', '604', '0'), +('16', '5', '11', '13748', '454', '0'), +('16', '6', '22', '10323', '0', '0'), +('16', '6', '22', '10664', '0', '0'), +('16', '6', '22', '9246', '0', '0'), +('16', '6', '22', '21509', '0', '0'), +('16', '6', '1', '14701', '3802', '0'), +('16', '6', '1', '14702', '2500', '0'), +('16', '6', '1', '10165', '1683', '0'), +('16', '6', '1', '30361', '1140', '0'), +('16', '6', '2', '1519', '3207', '0'), +('16', '6', '2', '4831', '3020', '0'), +('16', '6', '2', '10142', '3012', '0'), +('16', '6', '2', '4341', '2712', '0'), +('16', '6', '3', '10144', '1304', '0'), +('16', '6', '3', '14706', '990', '0'), +('16', '6', '3', '14705', '990', '0'), +('16', '6', '3', '3314', '785', '0'), +('16', '6', '5', '14703', '5500', '0'), +('16', '6', '5', '14700', '3453', '0'), +('16', '6', '5', '10055', '3255', '0'), +('16', '6', '5', '2583', '2287', '0'), +('16', '6', '8', '11621', '14171', '0'), +('16', '6', '8', '1409', '6312', '0'), +('16', '6', '8', '11551', '5129', '0'), +('16', '6', '8', '2400', '2808', '0'), +('16', '6', '6', '1557', '6760', '0'), +('16', '6', '6', '4302', '1817', '0'), +('16', '6', '6', '25062', '1817', '0'), +('16', '6', '6', '4165', '1812', '0'), +('16', '6', '17', '4832', '6590', '0'), +('16', '6', '17', '4309', '5576', '0'), +('16', '6', '17', '11623', '4979', '0'), +('16', '6', '17', '4342', '3322', '0'), +('16', '6', '7', '4833', '3567', '0'), +('16', '6', '7', '71303', '2689', '0'), +('16', '6', '7', '2458', '2406', '0'), +('16', '6', '7', '4411', '2083', '0'), +('16', '6', '9', '4834', '2625', '0'), +('16', '6', '9', '12189', '2263', '0'), +('16', '6', '9', '10149', '2255', '0'), +('16', '6', '9', '14650', '1802', '0'), +('16', '6', '15', '10366', '8005', '0'), +('16', '6', '15', '10151', '7200', '0'), +('16', '6', '15', '14679', '6255', '0'), +('16', '6', '15', '14678', '5104', '0'), +('16', '6', '20', '11601', '7825', '0'), +('16', '6', '20', '1365', '4200', '0'), +('16', '6', '20', '2471', '3804', '0'), +('16', '6', '20', '1543', '2876', '0'), +('16', '6', '12', '4835', '7549', '0'), +('16', '6', '12', '20655', '4891', '0'), +('16', '6', '12', '2923', '3404', '0'), +('16', '6', '12', '11624', '2539', '0'), +('16', '6', '18', '4836', '3455', '0'), +('16', '6', '18', '2461', '2557', '0'), +('16', '6', '18', '4346', '2276', '0'), +('16', '6', '18', '4412', '2083', '0'), +('16', '6', '19', '4837', '3923', '0'), +('16', '6', '19', '68239', '3223', '0'), +('16', '6', '19', '2337', '1757', '0'), +('16', '6', '19', '3312', '1392', '0'), +('16', '6', '13', '5622', '28028', '0'), +('16', '6', '13', '11609', '27927', '0'), +('16', '6', '13', '5412', '25806', '0'), +('16', '6', '13', '5401', '24664', '0'), +('16', '6', '14', '11551', '12679', '0'), +('16', '6', '14', '14762', '2181', '0'), +('16', '6', '14', '6359', '1753', '0'), +('16', '6', '14', '9690', '900', '0'), +('16', '6', '11', '14762', '2181', '0'), +('16', '6', '11', '20677', '1800', '0'), +('16', '6', '11', '9246', '604', '0'), +('16', '6', '11', '13748', '454', '0'), +('16', '7', '22', '10323', '0', '0'), +('16', '7', '22', '10664', '0', '0'), +('16', '7', '22', '9246', '0', '0'), +('16', '7', '22', '21509', '0', '0'), +('16', '7', '1', '14701', '3802', '0'), +('16', '7', '1', '14702', '2500', '0'), +('16', '7', '1', '10165', '1683', '0'), +('16', '7', '1', '30361', '1140', '0'), +('16', '7', '2', '1519', '3207', '0'), +('16', '7', '2', '4831', '3020', '0'), +('16', '7', '2', '10142', '3012', '0'), +('16', '7', '2', '4341', '2712', '0'), +('16', '7', '3', '10144', '1304', '0'), +('16', '7', '3', '14706', '990', '0'), +('16', '7', '3', '14705', '990', '0'), +('16', '7', '3', '3314', '785', '0'), +('16', '7', '5', '14703', '5500', '0'), +('16', '7', '5', '14700', '3453', '0'), +('16', '7', '5', '10055', '3255', '0'), +('16', '7', '5', '2583', '2287', '0'), +('16', '7', '8', '11621', '14171', '0'), +('16', '7', '8', '1409', '6312', '0'), +('16', '7', '8', '11551', '5129', '0'), +('16', '7', '8', '2400', '2808', '0'), +('16', '7', '6', '1557', '6760', '0'), +('16', '7', '6', '4302', '1842', '0'), +('16', '7', '6', '25062', '1817', '0'), +('16', '7', '6', '4165', '1812', '0'), +('16', '7', '17', '4832', '6653', '0'), +('16', '7', '17', '4309', '5576', '0'), +('16', '7', '17', '11623', '4979', '0'), +('16', '7', '17', '4342', '3322', '0'), +('16', '7', '7', '4833', '3567', '0'), +('16', '7', '7', '71303', '2689', '0'), +('16', '7', '7', '2458', '2406', '0'), +('16', '7', '7', '4343', '2118', '0'), +('16', '7', '9', '4834', '2625', '0'), +('16', '7', '9', '12189', '2263', '0'), +('16', '7', '9', '10149', '2255', '0'), +('16', '7', '9', '14650', '1802', '0'), +('16', '7', '15', '10366', '8005', '0'), +('16', '7', '15', '10151', '7200', '0'), +('16', '7', '15', '14679', '6255', '0'), +('16', '7', '15', '14678', '5104', '0'), +('16', '7', '20', '11601', '7867', '0'), +('16', '7', '20', '1365', '4200', '0'), +('16', '7', '20', '2471', '3804', '0'), +('16', '7', '20', '1543', '2876', '0'), +('16', '7', '12', '4835', '7570', '0'), +('16', '7', '12', '20655', '4900', '0'), +('16', '7', '12', '2923', '3404', '0'), +('16', '7', '12', '11624', '2568', '0'), +('16', '7', '18', '4836', '3476', '0'), +('16', '7', '18', '2461', '2557', '0'), +('16', '7', '18', '4346', '2276', '0'), +('16', '7', '18', '4412', '2083', '0'), +('16', '7', '19', '4837', '3923', '0'), +('16', '7', '19', '68239', '3223', '0'), +('16', '7', '19', '2337', '1757', '0'), +('16', '7', '19', '3312', '1392', '0'), +('16', '7', '13', '5622', '28028', '0'), +('16', '7', '13', '11609', '27927', '0'), +('16', '7', '13', '5412', '25806', '0'), +('16', '7', '13', '5401', '24664', '0'), +('16', '7', '14', '11551', '12679', '0'), +('16', '7', '14', '14762', '2181', '0'), +('16', '7', '14', '6359', '1753', '0'), +('16', '7', '14', '9690', '1050', '0'), +('16', '7', '11', '14762', '2181', '0'), +('16', '7', '11', '20677', '1800', '0'), +('16', '7', '11', '9246', '604', '0'), +('16', '7', '11', '13748', '454', '0'), +('16', '8', '22', '10323', '0', '0'), +('16', '8', '22', '10664', '0', '0'), +('16', '8', '22', '9246', '0', '0'), +('16', '8', '22', '21509', '0', '0'), +('16', '8', '1', '14701', '3802', '0'), +('16', '8', '1', '14702', '2500', '0'), +('16', '8', '1', '10165', '1683', '0'), +('16', '8', '1', '30361', '1140', '0'), +('16', '8', '2', '1519', '3207', '0'), +('16', '8', '2', '4831', '3020', '0'), +('16', '8', '2', '10142', '3012', '0'), +('16', '8', '2', '4341', '2712', '0'), +('16', '8', '3', '10144', '1304', '0'), +('16', '8', '3', '14706', '990', '0'), +('16', '8', '3', '14705', '990', '0'), +('16', '8', '3', '3314', '785', '0'), +('16', '8', '5', '14703', '5500', '0'), +('16', '8', '5', '14700', '3453', '0'), +('16', '8', '5', '10055', '3255', '0'), +('16', '8', '5', '2583', '2287', '0'), +('16', '8', '8', '11621', '14171', '0'), +('16', '8', '8', '1409', '6312', '0'), +('16', '8', '8', '11551', '5129', '0'), +('16', '8', '8', '2400', '2808', '0'), +('16', '8', '6', '1557', '6760', '0'), +('16', '8', '6', '4302', '1871', '0'), +('16', '8', '6', '25062', '1817', '0'), +('16', '8', '6', '4165', '1812', '0'), +('16', '8', '17', '4832', '6726', '0'), +('16', '8', '17', '4309', '5576', '0'), +('16', '8', '17', '11623', '4979', '0'), +('16', '8', '17', '4342', '3322', '0'), +('16', '8', '7', '4833', '3567', '0'), +('16', '8', '7', '71303', '2689', '0'), +('16', '8', '7', '2458', '2406', '0'), +('16', '8', '7', '4343', '2166', '0'), +('16', '8', '9', '4834', '2625', '0'), +('16', '8', '9', '12189', '2263', '0'), +('16', '8', '9', '10149', '2255', '0'), +('16', '8', '9', '14650', '1802', '0'), +('16', '8', '15', '10366', '8005', '0'), +('16', '8', '15', '10151', '7200', '0'), +('16', '8', '15', '14679', '6255', '0'), +('16', '8', '15', '14678', '5104', '0'), +('16', '8', '20', '11601', '7915', '0'), +('16', '8', '20', '1365', '4200', '0'), +('16', '8', '20', '2471', '3804', '0'), +('16', '8', '20', '1543', '2876', '0'), +('16', '8', '12', '4835', '7594', '0'), +('16', '8', '12', '20655', '4909', '0'), +('16', '8', '12', '2923', '3404', '0'), +('16', '8', '12', '11624', '2602', '0'), +('16', '8', '18', '4836', '3500', '0'), +('16', '8', '18', '2461', '2557', '0'), +('16', '8', '18', '4346', '2276', '0'), +('16', '8', '18', '4412', '2083', '0'), +('16', '8', '19', '4837', '3923', '0'), +('16', '8', '19', '68239', '3223', '0'), +('16', '8', '19', '2337', '1757', '0'), +('16', '8', '19', '3312', '1392', '0'), +('16', '8', '13', '5622', '28028', '0'), +('16', '8', '13', '11609', '27927', '0'), +('16', '8', '13', '5412', '25806', '0'), +('16', '8', '13', '5401', '24664', '0'), +('16', '8', '14', '11551', '12679', '0'), +('16', '8', '14', '14762', '2181', '0'), +('16', '8', '14', '6359', '1753', '0'), +('16', '8', '14', '9690', '1200', '0'), +('16', '8', '11', '14762', '2181', '0'), +('16', '8', '11', '20677', '1800', '0'), +('16', '8', '11', '9246', '604', '0'), +('16', '8', '11', '13748', '454', '0'), +('16', '9', '22', '10323', '0', '0'), +('16', '9', '22', '10664', '0', '0'), +('16', '9', '22', '9246', '0', '0'), +('16', '9', '22', '21509', '0', '0'), +('16', '9', '1', '14701', '3802', '0'), +('16', '9', '1', '14702', '2500', '0'), +('16', '9', '1', '10165', '1683', '0'), +('16', '9', '1', '30361', '1140', '0'), +('16', '9', '2', '1519', '3207', '0'), +('16', '9', '2', '4831', '3020', '0'), +('16', '9', '2', '10142', '3012', '0'), +('16', '9', '2', '4341', '2712', '0'), +('16', '9', '3', '10144', '1304', '0'), +('16', '9', '3', '14706', '990', '0'), +('16', '9', '3', '14705', '990', '0'), +('16', '9', '3', '3314', '785', '0'), +('16', '9', '5', '14703', '5500', '0'), +('16', '9', '5', '14700', '3453', '0'), +('16', '9', '5', '10055', '3255', '0'), +('16', '9', '5', '2583', '2287', '0'), +('16', '9', '8', '11621', '14171', '0'), +('16', '9', '8', '1409', '6312', '0'), +('16', '9', '8', '11551', '5129', '0'), +('16', '9', '8', '2400', '2808', '0'), +('16', '9', '6', '1557', '6760', '0'), +('16', '9', '6', '4302', '1897', '0'), +('16', '9', '6', '25062', '1817', '0'), +('16', '9', '6', '4165', '1812', '0'), +('16', '9', '17', '4832', '6789', '0'), +('16', '9', '17', '4309', '5576', '0'), +('16', '9', '17', '11623', '4979', '0'), +('16', '9', '17', '4342', '3322', '0'), +('16', '9', '7', '4833', '3567', '0'), +('16', '9', '7', '71303', '2689', '0'), +('16', '9', '7', '2458', '2406', '0'), +('16', '9', '7', '4343', '2208', '0'), +('16', '9', '9', '4834', '2625', '0'), +('16', '9', '9', '12189', '2263', '0'), +('16', '9', '9', '10149', '2255', '0'), +('16', '9', '9', '14650', '1802', '0'), +('16', '9', '15', '10366', '8005', '0'), +('16', '9', '15', '10151', '7200', '0'), +('16', '9', '15', '14679', '6255', '0'), +('16', '9', '15', '14678', '5104', '0'), +('16', '9', '20', '11601', '7958', '0'), +('16', '9', '20', '1365', '4200', '0'), +('16', '9', '20', '2471', '3804', '0'), +('16', '9', '20', '1543', '2876', '0'), +('16', '9', '12', '4835', '7615', '0'), +('16', '9', '12', '20655', '4918', '0'), +('16', '9', '12', '2923', '3404', '0'), +('16', '9', '12', '11624', '2632', '0'), +('16', '9', '18', '4836', '3521', '0'), +('16', '9', '18', '2461', '2557', '0'), +('16', '9', '18', '4346', '2276', '0'), +('16', '9', '18', '4412', '2083', '0'), +('16', '9', '19', '4837', '3923', '0'), +('16', '9', '19', '68239', '3223', '0'), +('16', '9', '19', '2337', '1757', '0'), +('16', '9', '19', '3312', '1392', '0'), +('16', '9', '13', '5622', '28028', '0'), +('16', '9', '13', '11609', '27927', '0'), +('16', '9', '13', '5412', '25806', '0'), +('16', '9', '13', '5401', '24664', '0'), +('16', '9', '14', '11551', '12679', '0'), +('16', '9', '14', '14762', '2181', '0'), +('16', '9', '14', '6359', '1753', '0'), +('16', '9', '14', '9690', '1350', '0'), +('16', '9', '11', '14762', '2181', '0'), +('16', '9', '11', '20677', '1800', '0'), +('16', '9', '11', '9246', '604', '0'), +('16', '9', '11', '13748', '454', '0'), +('16', '10', '22', '10323', '0', '0'), +('16', '10', '22', '10664', '0', '0'), +('16', '10', '22', '9246', '0', '0'), +('16', '10', '22', '21509', '0', '0'), +('16', '10', '1', '14701', '3802', '0'), +('16', '10', '1', '14702', '2500', '0'), +('16', '10', '1', '10165', '1683', '0'), +('16', '10', '1', '30361', '1140', '0'), +('16', '10', '2', '1519', '3207', '0'), +('16', '10', '2', '4831', '3020', '0'), +('16', '10', '2', '10142', '3012', '0'), +('16', '10', '2', '4341', '2712', '0'), +('16', '10', '3', '10144', '1304', '0'), +('16', '10', '3', '14706', '990', '0'), +('16', '10', '3', '14705', '990', '0'), +('16', '10', '3', '3314', '785', '0'), +('16', '10', '5', '14703', '5500', '0'), +('16', '10', '5', '14700', '3453', '0'), +('16', '10', '5', '10055', '3255', '0'), +('16', '10', '5', '2583', '2287', '0'), +('16', '10', '8', '11621', '14171', '0'), +('16', '10', '8', '1409', '6312', '0'), +('16', '10', '8', '11551', '5129', '0'), +('16', '10', '8', '2400', '2808', '0'), +('16', '10', '6', '1557', '6760', '0'), +('16', '10', '6', '4302', '1926', '0'), +('16', '10', '6', '25062', '1817', '0'), +('16', '10', '6', '4165', '1812', '0'), +('16', '10', '17', '4832', '6861', '0'), +('16', '10', '17', '4309', '5576', '0'), +('16', '10', '17', '11623', '4979', '0'), +('16', '10', '17', '4342', '3322', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '10', '7', '4833', '3567', '0'), +('16', '10', '7', '71303', '2689', '0'), +('16', '10', '7', '2458', '2406', '0'), +('16', '10', '7', '4343', '2257', '0'), +('16', '10', '9', '4834', '2625', '0'), +('16', '10', '9', '12189', '2263', '0'), +('16', '10', '9', '10149', '2255', '0'), +('16', '10', '9', '14650', '1802', '0'), +('16', '10', '15', '10366', '8005', '0'), +('16', '10', '15', '10151', '7200', '0'), +('16', '10', '15', '14679', '6255', '0'), +('16', '10', '15', '14678', '5104', '0'), +('16', '10', '20', '11601', '8006', '0'), +('16', '10', '20', '1365', '4200', '0'), +('16', '10', '20', '2471', '3804', '0'), +('16', '10', '20', '1543', '2876', '0'), +('16', '10', '12', '4835', '7639', '0'), +('16', '10', '12', '20655', '4927', '0'), +('16', '10', '12', '2923', '3404', '0'), +('16', '10', '12', '11624', '2666', '0'), +('16', '10', '18', '4836', '3545', '0'), +('16', '10', '18', '2461', '2557', '0'), +('16', '10', '18', '4346', '2276', '0'), +('16', '10', '18', '4412', '2083', '0'), +('16', '10', '19', '4837', '3923', '0'), +('16', '10', '19', '68239', '3223', '0'), +('16', '10', '19', '2337', '1757', '0'), +('16', '10', '19', '3312', '1392', '0'), +('16', '10', '13', '5622', '28028', '0'), +('16', '10', '13', '11609', '27927', '0'), +('16', '10', '13', '5412', '25806', '0'), +('16', '10', '13', '5401', '24664', '0'), +('16', '10', '14', '11551', '12679', '0'), +('16', '10', '14', '14762', '2181', '0'), +('16', '10', '14', '6359', '1753', '0'), +('16', '10', '14', '9690', '1500', '0'), +('16', '10', '11', '14762', '2181', '0'), +('16', '10', '11', '20677', '1800', '0'), +('16', '10', '11', '9246', '604', '0'), +('16', '10', '11', '13748', '454', '0'), +('16', '11', '22', '10323', '0', '0'), +('16', '11', '22', '10664', '0', '0'), +('16', '11', '22', '9246', '0', '0'), +('16', '11', '22', '21509', '0', '0'), +('16', '11', '1', '14701', '3802', '0'), +('16', '11', '1', '14702', '2500', '0'), +('16', '11', '1', '10165', '1683', '0'), +('16', '11', '1', '30361', '1140', '0'), +('16', '11', '2', '1519', '3207', '0'), +('16', '11', '2', '4831', '3020', '0'), +('16', '11', '2', '10142', '3012', '0'), +('16', '11', '2', '4620', '2724', '0'), +('16', '11', '3', '10144', '1304', '0'), +('16', '11', '3', '14706', '990', '0'), +('16', '11', '3', '14705', '990', '0'), +('16', '11', '3', '3314', '785', '0'), +('16', '11', '5', '14703', '5500', '0'), +('16', '11', '5', '14700', '3453', '0'), +('16', '11', '5', '10055', '3255', '0'), +('16', '11', '5', '2583', '2287', '0'), +('16', '11', '8', '11621', '14171', '0'), +('16', '11', '8', '1409', '6312', '0'), +('16', '11', '8', '11551', '5129', '0'), +('16', '11', '8', '2400', '2808', '0'), +('16', '11', '6', '1557', '6760', '0'), +('16', '11', '6', '4302', '1951', '0'), +('16', '11', '6', '25062', '1817', '0'), +('16', '11', '6', '4165', '1812', '0'), +('16', '11', '17', '4832', '6925', '0'), +('16', '11', '17', '4309', '5576', '0'), +('16', '11', '17', '11623', '4979', '0'), +('16', '11', '17', '4342', '3322', '0'), +('16', '11', '7', '4833', '3567', '0'), +('16', '11', '7', '71303', '2689', '0'), +('16', '11', '7', '2458', '2406', '0'), +('16', '11', '7', '4343', '2299', '0'), +('16', '11', '9', '4834', '2625', '0'), +('16', '11', '9', '12189', '2263', '0'), +('16', '11', '9', '10149', '2255', '0'), +('16', '11', '9', '14650', '1802', '0'), +('16', '11', '15', '10366', '8005', '0'), +('16', '11', '15', '10151', '7200', '0'), +('16', '11', '15', '14679', '6255', '0'), +('16', '11', '15', '14678', '5104', '0'), +('16', '11', '20', '11601', '8048', '0'), +('16', '11', '20', '1365', '4200', '0'), +('16', '11', '20', '2471', '3804', '0'), +('16', '11', '20', '1543', '2876', '0'), +('16', '11', '12', '4835', '7661', '0'), +('16', '11', '12', '20655', '4936', '0'), +('16', '11', '12', '2923', '3404', '0'), +('16', '11', '12', '11624', '2695', '0'), +('16', '11', '18', '4836', '3567', '0'), +('16', '11', '18', '2461', '2557', '0'), +('16', '11', '18', '4346', '2276', '0'), +('16', '11', '18', '4412', '2083', '0'), +('16', '11', '19', '4837', '3923', '0'), +('16', '11', '19', '68239', '3223', '0'), +('16', '11', '19', '2337', '1757', '0'), +('16', '11', '19', '3312', '1392', '0'), +('16', '11', '13', '5622', '28028', '0'), +('16', '11', '13', '11609', '27927', '0'), +('16', '11', '13', '5412', '25806', '0'), +('16', '11', '13', '5401', '24664', '0'), +('16', '11', '14', '11551', '12679', '0'), +('16', '11', '14', '14762', '2181', '0'), +('16', '11', '14', '6359', '1753', '0'), +('16', '11', '14', '9690', '1500', '0'), +('16', '11', '11', '14762', '2181', '0'), +('16', '11', '11', '20677', '1800', '0'), +('16', '11', '11', '9246', '604', '0'), +('16', '11', '11', '13748', '454', '0'), +('16', '12', '22', '10323', '0', '0'), +('16', '12', '22', '10664', '0', '0'), +('16', '12', '22', '9246', '0', '0'), +('16', '12', '22', '21509', '0', '0'), +('16', '12', '1', '14701', '3802', '0'), +('16', '12', '1', '14702', '2500', '0'), +('16', '12', '1', '10165', '1683', '0'), +('16', '12', '1', '30361', '1140', '0'), +('16', '12', '2', '1519', '3207', '0'), +('16', '12', '2', '4831', '3020', '0'), +('16', '12', '2', '10142', '3012', '0'), +('16', '12', '2', '4620', '2758', '0'), +('16', '12', '3', '10144', '1304', '0'), +('16', '12', '3', '14706', '990', '0'), +('16', '12', '3', '14705', '990', '0'), +('16', '12', '3', '3314', '785', '0'), +('16', '12', '5', '14703', '5500', '0'), +('16', '12', '5', '14700', '3453', '0'), +('16', '12', '5', '10055', '3255', '0'), +('16', '12', '5', '2583', '2287', '0'), +('16', '12', '8', '11621', '14171', '0'), +('16', '12', '8', '1409', '6312', '0'), +('16', '12', '8', '11551', '5129', '0'), +('16', '12', '8', '2400', '2808', '0'), +('16', '12', '6', '1557', '6760', '0'), +('16', '12', '6', '4302', '1980', '0'), +('16', '12', '6', '25062', '1817', '0'), +('16', '12', '6', '4165', '1812', '0'), +('16', '12', '17', '4832', '6997', '0'), +('16', '12', '17', '4309', '5576', '0'), +('16', '12', '17', '11623', '4979', '0'), +('16', '12', '17', '4342', '3322', '0'), +('16', '12', '7', '4833', '3567', '0'), +('16', '12', '7', '71303', '2689', '0'), +('16', '12', '7', '2458', '2406', '0'), +('16', '12', '7', '4343', '2347', '0'), +('16', '12', '9', '4834', '2625', '0'), +('16', '12', '9', '12189', '2263', '0'), +('16', '12', '9', '10149', '2255', '0'), +('16', '12', '9', '14650', '1802', '0'), +('16', '12', '15', '10366', '8005', '0'), +('16', '12', '15', '10151', '7200', '0'), +('16', '12', '15', '14679', '6255', '0'), +('16', '12', '15', '14678', '5104', '0'), +('16', '12', '20', '11601', '8097', '0'), +('16', '12', '20', '1365', '4200', '0'), +('16', '12', '20', '2471', '3804', '0'), +('16', '12', '20', '1543', '2876', '0'), +('16', '12', '12', '4835', '7685', '0'), +('16', '12', '12', '20655', '4946', '0'), +('16', '12', '12', '2923', '3404', '0'), +('16', '12', '12', '11624', '2729', '0'), +('16', '12', '18', '4836', '3591', '0'), +('16', '12', '18', '2461', '2557', '0'), +('16', '12', '18', '4346', '2276', '0'), +('16', '12', '18', '4412', '2083', '0'), +('16', '12', '19', '4837', '3923', '0'), +('16', '12', '19', '68239', '3223', '0'), +('16', '12', '19', '2337', '1757', '0'), +('16', '12', '19', '3312', '1392', '0'), +('16', '12', '13', '5622', '28028', '0'), +('16', '12', '13', '11609', '27927', '0'), +('16', '12', '13', '5412', '25806', '0'), +('16', '12', '13', '5401', '24664', '0'), +('16', '12', '14', '11551', '12679', '0'), +('16', '12', '14', '14762', '2181', '0'), +('16', '12', '14', '6359', '1753', '0'), +('16', '12', '14', '9690', '1500', '0'), +('16', '12', '11', '14762', '2181', '0'), +('16', '12', '11', '20677', '1800', '0'), +('16', '12', '11', '9246', '604', '0'), +('16', '12', '11', '13748', '454', '0'), +('16', '13', '22', '10323', '0', '0'), +('16', '13', '22', '10664', '0', '0'), +('16', '13', '22', '9246', '0', '0'), +('16', '13', '22', '21509', '0', '0'), +('16', '13', '1', '14701', '3802', '0'), +('16', '13', '1', '14702', '2500', '0'), +('16', '13', '1', '10165', '1683', '0'), +('16', '13', '1', '30361', '1140', '0'), +('16', '13', '2', '1519', '3207', '0'), +('16', '13', '2', '4831', '3020', '0'), +('16', '13', '2', '10142', '3012', '0'), +('16', '13', '2', '4620', '2792', '0'), +('16', '13', '3', '10144', '1304', '0'), +('16', '13', '3', '14706', '990', '0'), +('16', '13', '3', '14705', '990', '0'), +('16', '13', '3', '3314', '785', '0'), +('16', '13', '5', '14703', '5500', '0'), +('16', '13', '5', '14700', '3453', '0'), +('16', '13', '5', '10055', '3255', '0'), +('16', '13', '5', '2583', '2287', '0'), +('16', '13', '8', '11621', '14171', '0'), +('16', '13', '8', '1409', '6312', '0'), +('16', '13', '8', '11551', '5129', '0'), +('16', '13', '8', '2400', '2808', '0'), +('16', '13', '6', '1557', '6760', '0'), +('16', '13', '6', '4302', '2009', '0'), +('16', '13', '6', '25062', '1817', '0'), +('16', '13', '6', '4165', '1812', '0'), +('16', '13', '17', '4832', '7070', '0'), +('16', '13', '17', '4309', '5576', '0'), +('16', '13', '17', '11623', '4979', '0'), +('16', '13', '17', '4342', '3322', '0'), +('16', '13', '7', '4833', '3567', '0'), +('16', '13', '7', '71303', '2689', '0'), +('16', '13', '7', '2458', '2406', '0'), +('16', '13', '7', '4343', '2395', '0'), +('16', '13', '9', '4834', '2625', '0'), +('16', '13', '9', '12189', '2263', '0'), +('16', '13', '9', '10149', '2255', '0'), +('16', '13', '9', '14650', '1802', '0'), +('16', '13', '15', '10366', '8005', '0'), +('16', '13', '15', '10151', '7200', '0'), +('16', '13', '15', '14679', '6255', '0'), +('16', '13', '15', '14678', '5104', '0'), +('16', '13', '20', '11601', '8145', '0'), +('16', '13', '20', '1365', '4200', '0'), +('16', '13', '20', '2471', '3804', '0'), +('16', '13', '20', '1543', '2876', '0'), +('16', '13', '12', '4835', '7709', '0'), +('16', '13', '12', '20655', '4955', '0'), +('16', '13', '12', '2923', '3404', '0'), +('16', '13', '12', '11624', '2763', '0'), +('16', '13', '18', '4836', '3615', '0'), +('16', '13', '18', '2461', '2557', '0'), +('16', '13', '18', '4346', '2276', '0'), +('16', '13', '18', '4412', '2083', '0'), +('16', '13', '19', '4837', '3923', '0'), +('16', '13', '19', '68239', '3223', '0'), +('16', '13', '19', '2337', '1757', '0'), +('16', '13', '19', '3312', '1392', '0'), +('16', '13', '13', '5622', '28028', '0'), +('16', '13', '13', '11609', '27927', '0'), +('16', '13', '13', '5412', '25806', '0'), +('16', '13', '13', '5401', '24664', '0'), +('16', '13', '14', '11551', '12679', '0'), +('16', '13', '14', '14762', '2181', '0'), +('16', '13', '14', '6359', '1753', '0'), +('16', '13', '14', '9690', '1500', '0'), +('16', '13', '11', '14762', '2181', '0'), +('16', '13', '11', '20677', '1800', '0'), +('16', '13', '11', '9246', '604', '0'), +('16', '13', '11', '13748', '454', '0'), +('16', '14', '22', '10323', '0', '0'), +('16', '14', '22', '10664', '0', '0'), +('16', '14', '22', '9246', '0', '0'), +('16', '14', '22', '21509', '0', '0'), +('16', '14', '1', '14701', '3802', '0'), +('16', '14', '1', '14702', '2500', '0'), +('16', '14', '1', '10165', '1683', '0'), +('16', '14', '1', '30361', '1140', '0'), +('16', '14', '2', '1519', '3207', '0'), +('16', '14', '2', '4831', '3020', '0'), +('16', '14', '2', '10142', '3012', '0'), +('16', '14', '2', '4620', '2821', '0'), +('16', '14', '3', '10144', '1304', '0'), +('16', '14', '3', '14706', '990', '0'), +('16', '14', '3', '14705', '990', '0'), +('16', '14', '3', '3314', '785', '0'), +('16', '14', '5', '14703', '5500', '0'), +('16', '14', '5', '14700', '3453', '0'), +('16', '14', '5', '10055', '3255', '0'), +('16', '14', '5', '2583', '2287', '0'), +('16', '14', '8', '11621', '14171', '0'), +('16', '14', '8', '1409', '6312', '0'), +('16', '14', '8', '11551', '5129', '0'), +('16', '14', '8', '2400', '2808', '0'), +('16', '14', '6', '1557', '6760', '0'), +('16', '14', '6', '4302', '2034', '0'), +('16', '14', '6', '25062', '1817', '0'), +('16', '14', '6', '4165', '1812', '0'), +('16', '14', '17', '4832', '7133', '0'), +('16', '14', '17', '4309', '5576', '0'), +('16', '14', '17', '11623', '4979', '0'), +('16', '14', '17', '4342', '3322', '0'), +('16', '14', '7', '4833', '3567', '0'), +('16', '14', '7', '71303', '2689', '0'), +('16', '14', '7', '4343', '2438', '0'), +('16', '14', '7', '2458', '2406', '0'), +('16', '14', '9', '4834', '2625', '0'), +('16', '14', '9', '12189', '2263', '0'), +('16', '14', '9', '10149', '2255', '0'), +('16', '14', '9', '14650', '1802', '0'), +('16', '14', '15', '10366', '8005', '0'), +('16', '14', '15', '10151', '7200', '0'), +('16', '14', '15', '14679', '6255', '0'), +('16', '14', '15', '14678', '5104', '0'), +('16', '14', '20', '11601', '8187', '0'), +('16', '14', '20', '1365', '4200', '0'), +('16', '14', '20', '2471', '3804', '0'), +('16', '14', '20', '1543', '2876', '0'), +('16', '14', '12', '4835', '7730', '0'), +('16', '14', '12', '20655', '4964', '0'), +('16', '14', '12', '2923', '3404', '0'), +('16', '14', '12', '11624', '2793', '0'), +('16', '14', '18', '4836', '3636', '0'), +('16', '14', '18', '2461', '2557', '0'), +('16', '14', '18', '4346', '2276', '0'), +('16', '14', '18', '4412', '2083', '0'), +('16', '14', '19', '4837', '3923', '0'), +('16', '14', '19', '68239', '3223', '0'), +('16', '14', '19', '2337', '1757', '0'), +('16', '14', '19', '3312', '1392', '0'), +('16', '14', '13', '5622', '28028', '0'), +('16', '14', '13', '11609', '27927', '0'), +('16', '14', '13', '5412', '25806', '0'), +('16', '14', '13', '5401', '24664', '0'), +('16', '14', '14', '11551', '12679', '0'), +('16', '14', '14', '14762', '2181', '0'), +('16', '14', '14', '6359', '1753', '0'), +('16', '14', '14', '9690', '1500', '0'), +('16', '14', '11', '14762', '2181', '0'), +('16', '14', '11', '20677', '1800', '0'), +('16', '14', '11', '9246', '604', '0'), +('16', '14', '11', '13748', '454', '0'), +('16', '15', '22', '10323', '0', '0'), +('16', '15', '22', '10664', '0', '0'), +('16', '15', '22', '9246', '0', '0'), +('16', '15', '22', '21509', '0', '0'), +('16', '15', '1', '14701', '3802', '0'), +('16', '15', '1', '14702', '2500', '0'), +('16', '15', '1', '10165', '1683', '0'), +('16', '15', '1', '30361', '1140', '0'), +('16', '15', '2', '1519', '3207', '0'), +('16', '15', '2', '4831', '3020', '0'), +('16', '15', '2', '10142', '3012', '0'), +('16', '15', '2', '4620', '2855', '0'), +('16', '15', '3', '10144', '1304', '0'), +('16', '15', '3', '14706', '990', '0'), +('16', '15', '3', '14705', '990', '0'), +('16', '15', '3', '3314', '785', '0'), +('16', '15', '5', '14703', '5500', '0'), +('16', '15', '5', '14700', '3453', '0'), +('16', '15', '5', '10055', '3255', '0'), +('16', '15', '5', '2583', '2287', '0'), +('16', '15', '8', '11621', '14171', '0'), +('16', '15', '8', '1409', '6312', '0'), +('16', '15', '8', '11551', '5129', '0'), +('16', '15', '8', '2400', '2808', '0'), +('16', '15', '6', '1557', '6760', '0'), +('16', '15', '6', '4302', '2063', '0'), +('16', '15', '6', '25062', '1817', '0'), +('16', '15', '6', '4165', '1812', '0'), +('16', '15', '17', '4832', '7206', '0'), +('16', '15', '17', '4309', '5576', '0'), +('16', '15', '17', '11623', '4979', '0'), +('16', '15', '17', '4342', '3322', '0'), +('16', '15', '7', '4833', '3567', '0'), +('16', '15', '7', '71303', '2689', '0'), +('16', '15', '7', '4343', '2486', '0'), +('16', '15', '7', '2458', '2406', '0'), +('16', '15', '9', '4834', '2625', '0'), +('16', '15', '9', '12189', '2263', '0'), +('16', '15', '9', '10149', '2255', '0'), +('16', '15', '9', '14650', '1802', '0'), +('16', '15', '15', '10366', '8005', '0'), +('16', '15', '15', '10151', '7200', '0'), +('16', '15', '15', '14679', '6255', '0'), +('16', '15', '15', '14678', '5104', '0'), +('16', '15', '20', '11601', '8235', '0'), +('16', '15', '20', '1365', '4200', '0'), +('16', '15', '20', '2471', '3804', '0'), +('16', '15', '20', '1543', '2876', '0'), +('16', '15', '12', '4835', '7754', '0'), +('16', '15', '12', '20655', '4973', '0'), +('16', '15', '12', '2923', '3404', '0'), +('16', '15', '12', '11624', '2826', '0'), +('16', '15', '18', '4836', '3660', '0'), +('16', '15', '18', '2461', '2557', '0'), +('16', '15', '18', '4346', '2276', '0'), +('16', '15', '18', '4412', '2083', '0'), +('16', '15', '19', '4837', '3923', '0'), +('16', '15', '19', '68239', '3223', '0'), +('16', '15', '19', '2337', '1757', '0'), +('16', '15', '19', '3312', '1392', '0'), +('16', '15', '13', '5622', '28028', '0'), +('16', '15', '13', '11609', '27927', '0'), +('16', '15', '13', '5412', '25806', '0'), +('16', '15', '13', '5401', '24664', '0'), +('16', '15', '14', '11551', '12679', '0'), +('16', '15', '14', '14762', '2181', '0'), +('16', '15', '14', '6359', '1753', '0'), +('16', '15', '14', '9690', '1500', '0'), +('16', '15', '11', '14762', '2181', '0'), +('16', '15', '11', '20677', '1800', '0'), +('16', '15', '11', '9246', '604', '0'), +('16', '15', '11', '13748', '454', '0'), +('16', '16', '22', '10323', '0', '0'), +('16', '16', '22', '10664', '0', '0'), +('16', '16', '22', '9246', '0', '0'), +('16', '16', '22', '21509', '0', '0'), +('16', '16', '1', '14701', '3802', '0'), +('16', '16', '1', '14702', '2500', '0'), +('16', '16', '1', '10165', '1683', '0'), +('16', '16', '1', '30361', '1140', '0'), +('16', '16', '2', '1519', '3207', '0'), +('16', '16', '2', '4831', '3020', '0'), +('16', '16', '2', '10142', '3012', '0'), +('16', '16', '2', '4620', '2889', '0'), +('16', '16', '3', '10144', '1304', '0'), +('16', '16', '3', '14706', '990', '0'), +('16', '16', '3', '14705', '990', '0'), +('16', '16', '3', '3314', '785', '0'), +('16', '16', '5', '14703', '5500', '0'), +('16', '16', '5', '14700', '3453', '0'), +('16', '16', '5', '10055', '3255', '0'), +('16', '16', '5', '2583', '2287', '0'), +('16', '16', '8', '11621', '14171', '0'), +('16', '16', '8', '1409', '6312', '0'), +('16', '16', '8', '11551', '5129', '0'), +('16', '16', '8', '2400', '2808', '0'), +('16', '16', '6', '1557', '6760', '0'), +('16', '16', '6', '4302', '2092', '0'), +('16', '16', '6', '25062', '1817', '0'), +('16', '16', '6', '4165', '1812', '0'), +('16', '16', '17', '4832', '7278', '0'), +('16', '16', '17', '4309', '5576', '0'), +('16', '16', '17', '11623', '4979', '0'), +('16', '16', '17', '4342', '3322', '0'), +('16', '16', '7', '4833', '3567', '0'), +('16', '16', '7', '71303', '2689', '0'), +('16', '16', '7', '4343', '2534', '0'), +('16', '16', '7', '2458', '2406', '0'), +('16', '16', '9', '4834', '2625', '0'), +('16', '16', '9', '12189', '2263', '0'), +('16', '16', '9', '10149', '2255', '0'), +('16', '16', '9', '14650', '1802', '0'), +('16', '16', '15', '10366', '8005', '0'), +('16', '16', '15', '10151', '7200', '0'), +('16', '16', '15', '14679', '6255', '0'), +('16', '16', '15', '14678', '5104', '0'), +('16', '16', '20', '11601', '8284', '0'), +('16', '16', '20', '1365', '4200', '0'), +('16', '16', '20', '2471', '3804', '0'), +('16', '16', '20', '1543', '2876', '0'), +('16', '16', '12', '4835', '7778', '0'), +('16', '16', '12', '20655', '4983', '0'), +('16', '16', '12', '2923', '3404', '0'), +('16', '16', '12', '11624', '2860', '0'), +('16', '16', '18', '4836', '3684', '0'), +('16', '16', '18', '2461', '2557', '0'), +('16', '16', '18', '4346', '2276', '0'), +('16', '16', '18', '4412', '2083', '0'), +('16', '16', '19', '4837', '3923', '0'), +('16', '16', '19', '68239', '3223', '0'), +('16', '16', '19', '2337', '1757', '0'), +('16', '16', '19', '3312', '1392', '0'), +('16', '16', '13', '5622', '28028', '0'), +('16', '16', '13', '11609', '27927', '0'), +('16', '16', '13', '5412', '25806', '0'), +('16', '16', '13', '5401', '24664', '0'), +('16', '16', '14', '11551', '12679', '0'), +('16', '16', '14', '14762', '2181', '0'), +('16', '16', '14', '6359', '1753', '0'), +('16', '16', '14', '9690', '1500', '0'), +('16', '16', '11', '14762', '2181', '0'), +('16', '16', '11', '20677', '1800', '0'), +('16', '16', '11', '9246', '604', '0'), +('16', '16', '11', '13748', '454', '0'), +('16', '17', '22', '10323', '0', '0'), +('16', '17', '22', '10664', '0', '0'), +('16', '17', '22', '9246', '0', '0'), +('16', '17', '22', '21509', '0', '0'), +('16', '17', '1', '14701', '3802', '0'), +('16', '17', '1', '14702', '2500', '0'), +('16', '17', '1', '10165', '1683', '0'), +('16', '17', '1', '30361', '1140', '0'), +('16', '17', '2', '1519', '3207', '0'), +('16', '17', '2', '4831', '3020', '0'), +('16', '17', '2', '10142', '3012', '0'), +('16', '17', '2', '4620', '2923', '0'), +('16', '17', '3', '10144', '1304', '0'), +('16', '17', '3', '14706', '990', '0'), +('16', '17', '3', '14705', '990', '0'), +('16', '17', '3', '3314', '785', '0'), +('16', '17', '5', '14703', '5500', '0'), +('16', '17', '5', '14700', '3453', '0'), +('16', '17', '5', '10055', '3255', '0'), +('16', '17', '5', '2583', '2287', '0'), +('16', '17', '8', '11621', '14171', '0'), +('16', '17', '8', '1409', '6312', '0'), +('16', '17', '8', '11551', '5129', '0'), +('16', '17', '8', '2400', '2808', '0'), +('16', '17', '6', '1557', '6760', '0'), +('16', '17', '6', '4302', '2121', '0'), +('16', '17', '6', '25062', '1817', '0'), +('16', '17', '6', '4165', '1812', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '17', '17', '4832', '7351', '0'), +('16', '17', '17', '4309', '5576', '0'), +('16', '17', '17', '11623', '4979', '0'), +('16', '17', '17', '4342', '3322', '0'), +('16', '17', '7', '4833', '3567', '0'), +('16', '17', '7', '71303', '2689', '0'), +('16', '17', '7', '4343', '2583', '0'), +('16', '17', '7', '2458', '2406', '0'), +('16', '17', '9', '4834', '2625', '0'), +('16', '17', '9', '12189', '2263', '0'), +('16', '17', '9', '10149', '2255', '0'), +('16', '17', '9', '14650', '1802', '0'), +('16', '17', '15', '10366', '8005', '0'), +('16', '17', '15', '10151', '7200', '0'), +('16', '17', '15', '14679', '6255', '0'), +('16', '17', '15', '14678', '5104', '0'), +('16', '17', '20', '11601', '8332', '0'), +('16', '17', '20', '1365', '4200', '0'), +('16', '17', '20', '2471', '3804', '0'), +('16', '17', '20', '1543', '2876', '0'), +('16', '17', '12', '4835', '7803', '0'), +('16', '17', '12', '20655', '4993', '0'), +('16', '17', '12', '2923', '3404', '0'), +('16', '17', '12', '11624', '2894', '0'), +('16', '17', '18', '4836', '3709', '0'), +('16', '17', '18', '2461', '2557', '0'), +('16', '17', '18', '4346', '2276', '0'), +('16', '17', '18', '4412', '2083', '0'), +('16', '17', '19', '4837', '3923', '0'), +('16', '17', '19', '68239', '3223', '0'), +('16', '17', '19', '2337', '1757', '0'), +('16', '17', '19', '3312', '1392', '0'), +('16', '17', '13', '5622', '28028', '0'), +('16', '17', '13', '11609', '27927', '0'), +('16', '17', '13', '5412', '25806', '0'), +('16', '17', '13', '5401', '24664', '0'), +('16', '17', '14', '11551', '12679', '0'), +('16', '17', '14', '14762', '2181', '0'), +('16', '17', '14', '6359', '1753', '0'), +('16', '17', '14', '9690', '1500', '0'), +('16', '17', '11', '14762', '2181', '0'), +('16', '17', '11', '20677', '1800', '0'), +('16', '17', '11', '9246', '604', '0'), +('16', '17', '11', '13748', '454', '0'), +('16', '18', '22', '10323', '0', '0'), +('16', '18', '22', '10664', '0', '0'), +('16', '18', '22', '9246', '0', '0'), +('16', '18', '22', '21509', '0', '0'), +('16', '18', '1', '14701', '3802', '0'), +('16', '18', '1', '14702', '2500', '0'), +('16', '18', '1', '10165', '1683', '0'), +('16', '18', '1', '30361', '1140', '0'), +('16', '18', '2', '1519', '3207', '0'), +('16', '18', '2', '4831', '3020', '0'), +('16', '18', '2', '10142', '3012', '0'), +('16', '18', '2', '4620', '2957', '0'), +('16', '18', '3', '10144', '1304', '0'), +('16', '18', '3', '14706', '990', '0'), +('16', '18', '3', '14705', '990', '0'), +('16', '18', '3', '3314', '785', '0'), +('16', '18', '5', '14703', '5500', '0'), +('16', '18', '5', '14700', '3453', '0'), +('16', '18', '5', '10055', '3255', '0'), +('16', '18', '5', '2583', '2287', '0'), +('16', '18', '8', '11621', '14171', '0'), +('16', '18', '8', '1409', '6312', '0'), +('16', '18', '8', '11551', '5129', '0'), +('16', '18', '8', '2400', '2808', '0'), +('16', '18', '6', '1557', '6760', '0'), +('16', '18', '6', '4302', '2150', '0'), +('16', '18', '6', '25062', '1817', '0'), +('16', '18', '6', '4165', '1812', '0'), +('16', '18', '17', '4832', '7423', '0'), +('16', '18', '17', '4309', '5576', '0'), +('16', '18', '17', '11623', '4979', '0'), +('16', '18', '17', '4342', '3322', '0'), +('16', '18', '7', '4833', '3567', '0'), +('16', '18', '7', '71303', '2689', '0'), +('16', '18', '7', '4343', '2631', '0'), +('16', '18', '7', '2458', '2406', '0'), +('16', '18', '9', '4834', '2625', '0'), +('16', '18', '9', '12189', '2263', '0'), +('16', '18', '9', '10149', '2255', '0'), +('16', '18', '9', '14650', '1802', '0'), +('16', '18', '15', '10366', '8005', '0'), +('16', '18', '15', '10151', '7200', '0'), +('16', '18', '15', '14679', '6255', '0'), +('16', '18', '15', '14678', '5104', '0'), +('16', '18', '20', '11601', '8380', '0'), +('16', '18', '20', '1365', '4200', '0'), +('16', '18', '20', '2471', '3804', '0'), +('16', '18', '20', '2742', '2923', '0'), +('16', '18', '12', '4835', '7827', '0'), +('16', '18', '12', '20655', '5002', '0'), +('16', '18', '12', '2923', '3404', '0'), +('16', '18', '12', '11624', '2928', '0'), +('16', '18', '18', '4836', '3733', '0'), +('16', '18', '18', '2461', '2557', '0'), +('16', '18', '18', '4346', '2276', '0'), +('16', '18', '18', '4412', '2083', '0'), +('16', '18', '19', '4837', '3923', '0'), +('16', '18', '19', '68239', '3223', '0'), +('16', '18', '19', '2337', '1757', '0'), +('16', '18', '19', '3312', '1392', '0'), +('16', '18', '13', '5622', '28028', '0'), +('16', '18', '13', '11609', '27927', '0'), +('16', '18', '13', '5412', '25806', '0'), +('16', '18', '13', '5401', '24664', '0'), +('16', '18', '14', '11551', '12679', '0'), +('16', '18', '14', '14762', '2181', '0'), +('16', '18', '14', '6359', '1753', '0'), +('16', '18', '14', '9690', '1500', '0'), +('16', '18', '11', '14762', '2181', '0'), +('16', '18', '11', '20677', '1800', '0'), +('16', '18', '11', '9246', '604', '0'), +('16', '18', '11', '13748', '454', '0'), +('16', '19', '22', '10323', '0', '0'), +('16', '19', '22', '10664', '0', '0'), +('16', '19', '22', '9246', '0', '0'), +('16', '19', '22', '21509', '0', '0'), +('16', '19', '1', '14701', '3802', '0'), +('16', '19', '1', '14702', '2500', '0'), +('16', '19', '1', '10165', '1683', '0'), +('16', '19', '1', '30361', '1140', '0'), +('16', '19', '2', '1519', '3207', '0'), +('16', '19', '2', '4831', '3020', '0'), +('16', '19', '2', '10142', '3012', '0'), +('16', '19', '2', '4620', '2990', '0'), +('16', '19', '3', '10144', '1304', '0'), +('16', '19', '3', '14706', '990', '0'), +('16', '19', '3', '14705', '990', '0'), +('16', '19', '3', '3314', '785', '0'), +('16', '19', '5', '14703', '5500', '0'), +('16', '19', '5', '14700', '3453', '0'), +('16', '19', '5', '10055', '3255', '0'), +('16', '19', '5', '2583', '2287', '0'), +('16', '19', '8', '11621', '14171', '0'), +('16', '19', '8', '1409', '6312', '0'), +('16', '19', '8', '11551', '5129', '0'), +('16', '19', '8', '2400', '2808', '0'), +('16', '19', '6', '1557', '6760', '0'), +('16', '19', '6', '4302', '2179', '0'), +('16', '19', '6', '25062', '1817', '0'), +('16', '19', '6', '4165', '1812', '0'), +('16', '19', '17', '4832', '7496', '0'), +('16', '19', '17', '4309', '5576', '0'), +('16', '19', '17', '11623', '4979', '0'), +('16', '19', '17', '3307', '3335', '0'), +('16', '19', '7', '4833', '3567', '0'), +('16', '19', '7', '71303', '2689', '0'), +('16', '19', '7', '4343', '2679', '0'), +('16', '19', '7', '2458', '2406', '0'), +('16', '19', '9', '4834', '2625', '0'), +('16', '19', '9', '12189', '2263', '0'), +('16', '19', '9', '10149', '2255', '0'), +('16', '19', '9', '14650', '1802', '0'), +('16', '19', '15', '10366', '8005', '0'), +('16', '19', '15', '10151', '7200', '0'), +('16', '19', '15', '14679', '6255', '0'), +('16', '19', '15', '14678', '5104', '0'), +('16', '19', '20', '11601', '8429', '0'), +('16', '19', '20', '1365', '4200', '0'), +('16', '19', '20', '2471', '3804', '0'), +('16', '19', '20', '2742', '2972', '0'), +('16', '19', '12', '4835', '7851', '0'), +('16', '19', '12', '20655', '5012', '0'), +('16', '19', '12', '2923', '3404', '0'), +('16', '19', '12', '11624', '2962', '0'), +('16', '19', '18', '4836', '3757', '0'), +('16', '19', '18', '2461', '2557', '0'), +('16', '19', '18', '4346', '2276', '0'), +('16', '19', '18', '4412', '2083', '0'), +('16', '19', '19', '4837', '3923', '0'), +('16', '19', '19', '68239', '3223', '0'), +('16', '19', '19', '2337', '1757', '0'), +('16', '19', '19', '3312', '1392', '0'), +('16', '19', '13', '5622', '28028', '0'), +('16', '19', '13', '11609', '27927', '0'), +('16', '19', '13', '5412', '25806', '0'), +('16', '19', '13', '5401', '24664', '0'), +('16', '19', '14', '11551', '12679', '0'), +('16', '19', '14', '14762', '2181', '0'), +('16', '19', '14', '6359', '1753', '0'), +('16', '19', '14', '9690', '1500', '0'), +('16', '19', '11', '14762', '2181', '0'), +('16', '19', '11', '20677', '1800', '0'), +('16', '19', '11', '9246', '604', '0'), +('16', '19', '11', '13748', '454', '0'), +('16', '20', '22', '10323', '0', '0'), +('16', '20', '22', '10664', '0', '0'), +('16', '20', '22', '9246', '0', '0'), +('16', '20', '22', '21509', '0', '0'), +('16', '20', '1', '14701', '3802', '0'), +('16', '20', '1', '14702', '2500', '0'), +('16', '20', '1', '10165', '1683', '0'), +('16', '20', '1', '30361', '1140', '0'), +('16', '20', '2', '1519', '3207', '0'), +('16', '20', '2', '4620', '3024', '0'), +('16', '20', '2', '4831', '3020', '0'), +('16', '20', '2', '10142', '3012', '0'), +('16', '20', '3', '10144', '1304', '0'), +('16', '20', '3', '14706', '990', '0'), +('16', '20', '3', '14705', '990', '0'), +('16', '20', '3', '3314', '785', '0'), +('16', '20', '5', '14703', '5500', '0'), +('16', '20', '5', '14700', '3453', '0'), +('16', '20', '5', '10055', '3255', '0'), +('16', '20', '5', '2583', '2287', '0'), +('16', '20', '8', '11621', '14171', '0'), +('16', '20', '8', '1409', '6312', '0'), +('16', '20', '8', '11551', '5129', '0'), +('16', '20', '8', '2400', '2808', '0'), +('16', '20', '6', '1557', '6760', '0'), +('16', '20', '6', '4302', '2208', '0'), +('16', '20', '6', '25062', '1817', '0'), +('16', '20', '6', '4165', '1812', '0'), +('16', '20', '17', '4832', '7568', '0'), +('16', '20', '17', '4309', '5576', '0'), +('16', '20', '17', '11623', '4979', '0'), +('16', '20', '17', '3307', '3355', '0'), +('16', '20', '7', '4833', '3567', '0'), +('16', '20', '7', '4343', '2728', '0'), +('16', '20', '7', '71303', '2689', '0'), +('16', '20', '7', '2458', '2406', '0'), +('16', '20', '9', '4834', '2625', '0'), +('16', '20', '9', '12189', '2263', '0'), +('16', '20', '9', '10149', '2255', '0'), +('16', '20', '9', '14650', '1802', '0'), +('16', '20', '15', '10366', '8005', '0'), +('16', '20', '15', '10151', '7200', '0'), +('16', '20', '15', '14679', '6255', '0'), +('16', '20', '15', '14678', '5104', '0'), +('16', '20', '20', '11601', '8477', '0'), +('16', '20', '20', '1365', '4200', '0'), +('16', '20', '20', '2471', '3804', '0'), +('16', '20', '20', '2742', '3020', '0'), +('16', '20', '12', '4835', '7875', '0'), +('16', '20', '12', '20655', '5022', '0'), +('16', '20', '12', '2923', '3404', '0'), +('16', '20', '12', '11624', '2995', '0'), +('16', '20', '18', '4836', '3781', '0'), +('16', '20', '18', '2461', '2557', '0'), +('16', '20', '18', '4346', '2276', '0'), +('16', '20', '18', '4412', '2083', '0'), +('16', '20', '19', '4837', '3923', '0'), +('16', '20', '19', '68239', '3223', '0'), +('16', '20', '19', '2337', '1757', '0'), +('16', '20', '19', '3312', '1392', '0'), +('16', '20', '13', '5622', '29139', '0'), +('16', '20', '13', '11609', '29038', '0'), +('16', '20', '13', '5412', '26816', '0'), +('16', '20', '13', '5401', '25522', '0'), +('16', '20', '14', '11551', '12679', '0'), +('16', '20', '14', '14762', '2181', '0'), +('16', '20', '14', '6359', '1753', '0'), +('16', '20', '14', '9690', '1500', '0'), +('16', '20', '11', '14762', '2181', '0'), +('16', '20', '11', '20677', '1800', '0'), +('16', '20', '11', '9246', '604', '0'), +('16', '20', '11', '13748', '454', '0'), +('16', '21', '22', '10323', '0', '0'), +('16', '21', '22', '10664', '0', '0'), +('16', '21', '22', '9246', '0', '0'), +('16', '21', '22', '21509', '0', '0'), +('16', '21', '1', '14701', '3802', '0'), +('16', '21', '1', '14702', '2500', '0'), +('16', '21', '1', '10165', '1683', '0'), +('16', '21', '1', '30361', '1140', '0'), +('16', '21', '2', '1519', '3207', '0'), +('16', '21', '2', '4620', '3058', '0'), +('16', '21', '2', '4831', '3020', '0'), +('16', '21', '2', '10142', '3012', '0'), +('16', '21', '3', '10144', '1304', '0'), +('16', '21', '3', '14706', '990', '0'), +('16', '21', '3', '14705', '990', '0'), +('16', '21', '3', '3314', '785', '0'), +('16', '21', '5', '14703', '5500', '0'), +('16', '21', '5', '14700', '3453', '0'), +('16', '21', '5', '10055', '3255', '0'), +('16', '21', '5', '2583', '2287', '0'), +('16', '21', '8', '11621', '14171', '0'), +('16', '21', '8', '1409', '6312', '0'), +('16', '21', '8', '11551', '5129', '0'), +('16', '21', '8', '2400', '2808', '0'), +('16', '21', '6', '1557', '6760', '0'), +('16', '21', '6', '4302', '2237', '0'), +('16', '21', '6', '25062', '1817', '0'), +('16', '21', '6', '4165', '1812', '0'), +('16', '21', '17', '4832', '7641', '0'), +('16', '21', '17', '4309', '5576', '0'), +('16', '21', '17', '11623', '4979', '0'), +('16', '21', '17', '3307', '3374', '0'), +('16', '21', '7', '4833', '3567', '0'), +('16', '21', '7', '4343', '2776', '0'), +('16', '21', '7', '71303', '2689', '0'), +('16', '21', '7', '2458', '2406', '0'), +('16', '21', '9', '4834', '2625', '0'), +('16', '21', '9', '12189', '2263', '0'), +('16', '21', '9', '10149', '2255', '0'), +('16', '21', '9', '14650', '1802', '0'), +('16', '21', '15', '10366', '8005', '0'), +('16', '21', '15', '10151', '7200', '0'), +('16', '21', '15', '14679', '6255', '0'), +('16', '21', '15', '14678', '5104', '0'), +('16', '21', '20', '11601', '8525', '0'), +('16', '21', '20', '1365', '4200', '0'), +('16', '21', '20', '2471', '3804', '0'), +('16', '21', '20', '2742', '3068', '0'), +('16', '21', '12', '4835', '7899', '0'), +('16', '21', '12', '20655', '5031', '0'), +('16', '21', '12', '2923', '3404', '0'), +('16', '21', '12', '11624', '3029', '0'), +('16', '21', '18', '4836', '3805', '0'), +('16', '21', '18', '2461', '2557', '0'), +('16', '21', '18', '4346', '2276', '0'), +('16', '21', '18', '4412', '2083', '0'), +('16', '21', '19', '4837', '3923', '0'), +('16', '21', '19', '68239', '3223', '0'), +('16', '21', '19', '2337', '1757', '0'), +('16', '21', '19', '3312', '1392', '0'), +('16', '21', '13', '5622', '29492', '0'), +('16', '21', '13', '11609', '29391', '0'), +('16', '21', '13', '5412', '27169', '0'), +('16', '21', '13', '5401', '25775', '0'), +('16', '21', '14', '11551', '12679', '0'), +('16', '21', '14', '14762', '2181', '0'), +('16', '21', '14', '6359', '1753', '0'), +('16', '21', '14', '9690', '1500', '0'), +('16', '21', '11', '14762', '2181', '0'), +('16', '21', '11', '20677', '1800', '0'), +('16', '21', '11', '9246', '604', '0'), +('16', '21', '11', '13748', '454', '0'), +('16', '22', '22', '10323', '0', '0'), +('16', '22', '22', '10664', '0', '0'), +('16', '22', '22', '9246', '0', '0'), +('16', '22', '22', '21509', '0', '0'), +('16', '22', '1', '14701', '3802', '0'), +('16', '22', '1', '14702', '2500', '0'), +('16', '22', '1', '10165', '1683', '0'), +('16', '22', '1', '30361', '1140', '0'), +('16', '22', '2', '1519', '3207', '0'), +('16', '22', '2', '4620', '3092', '0'), +('16', '22', '2', '4831', '3020', '0'), +('16', '22', '2', '10142', '3012', '0'), +('16', '22', '3', '10144', '1304', '0'), +('16', '22', '3', '14706', '990', '0'), +('16', '22', '3', '14705', '990', '0'), +('16', '22', '3', '3314', '785', '0'), +('16', '22', '5', '14703', '5500', '0'), +('16', '22', '5', '14700', '3453', '0'), +('16', '22', '5', '10055', '3255', '0'), +('16', '22', '5', '2583', '2287', '0'), +('16', '22', '8', '11621', '14171', '0'), +('16', '22', '8', '1409', '6312', '0'), +('16', '22', '8', '11551', '5129', '0'), +('16', '22', '8', '2400', '2808', '0'), +('16', '22', '6', '1557', '6760', '0'), +('16', '22', '6', '4302', '2266', '0'), +('16', '22', '6', '25062', '1817', '0'), +('16', '22', '6', '4165', '1812', '0'), +('16', '22', '17', '4832', '7713', '0'), +('16', '22', '17', '4309', '5576', '0'), +('16', '22', '17', '11623', '4979', '0'), +('16', '22', '17', '3307', '3393', '0'), +('16', '22', '7', '4833', '3567', '0'), +('16', '22', '7', '4343', '2824', '0'), +('16', '22', '7', '71303', '2689', '0'), +('16', '22', '7', '2458', '2406', '0'), +('16', '22', '9', '4834', '2625', '0'), +('16', '22', '9', '12189', '2263', '0'), +('16', '22', '9', '10149', '2255', '0'), +('16', '22', '9', '14650', '1802', '0'), +('16', '22', '15', '10366', '8005', '0'), +('16', '22', '15', '10151', '7200', '0'), +('16', '22', '15', '14679', '6255', '0'), +('16', '22', '15', '14678', '5104', '0'), +('16', '22', '20', '11601', '8574', '0'), +('16', '22', '20', '1365', '4200', '0'), +('16', '22', '20', '2471', '3804', '0'), +('16', '22', '20', '2742', '3117', '0'), +('16', '22', '12', '4835', '7923', '0'), +('16', '22', '12', '20655', '5041', '0'), +('16', '22', '12', '2923', '3404', '0'), +('16', '22', '12', '11624', '3063', '0'), +('16', '22', '18', '4836', '3829', '0'), +('16', '22', '18', '2461', '2557', '0'), +('16', '22', '18', '4346', '2276', '0'), +('16', '22', '18', '4412', '2083', '0'), +('16', '22', '19', '4837', '3923', '0'), +('16', '22', '19', '68239', '3223', '0'), +('16', '22', '19', '2337', '1757', '0'), +('16', '22', '19', '3312', '1392', '0'), +('16', '22', '13', '5622', '29795', '0'), +('16', '22', '13', '11609', '29694', '0'), +('16', '22', '13', '5412', '27472', '0'), +('16', '22', '13', '5401', '26027', '0'), +('16', '22', '14', '11551', '12679', '0'), +('16', '22', '14', '14762', '2181', '0'), +('16', '22', '14', '6359', '1753', '0'), +('16', '22', '14', '9690', '1500', '0'), +('16', '22', '11', '14762', '2181', '0'), +('16', '22', '11', '20677', '1800', '0'), +('16', '22', '11', '9246', '604', '0'), +('16', '22', '11', '13748', '454', '0'), +('16', '23', '22', '10323', '0', '0'), +('16', '23', '22', '10664', '0', '0'), +('16', '23', '22', '9246', '0', '0'), +('16', '23', '22', '21509', '0', '0'), +('16', '23', '1', '14701', '3802', '0'), +('16', '23', '1', '14702', '2500', '0'), +('16', '23', '1', '10165', '1683', '0'), +('16', '23', '1', '30361', '1140', '0'), +('16', '23', '2', '1519', '3207', '0'), +('16', '23', '2', '4620', '3126', '0'), +('16', '23', '2', '4831', '3020', '0'), +('16', '23', '2', '10142', '3012', '0'), +('16', '23', '3', '10144', '1304', '0'), +('16', '23', '3', '14706', '990', '0'), +('16', '23', '3', '14705', '990', '0'), +('16', '23', '3', '3314', '785', '0'), +('16', '23', '5', '14703', '5500', '0'), +('16', '23', '5', '14700', '3453', '0'), +('16', '23', '5', '10055', '3255', '0'), +('16', '23', '5', '2583', '2287', '0'), +('16', '23', '8', '11621', '14171', '0'), +('16', '23', '8', '1409', '6312', '0'), +('16', '23', '8', '11551', '5129', '0'), +('16', '23', '8', '2400', '2808', '0'), +('16', '23', '6', '1557', '6760', '0'), +('16', '23', '6', '4302', '2295', '0'), +('16', '23', '6', '25062', '1817', '0'), +('16', '23', '6', '4165', '1812', '0'), +('16', '23', '17', '4832', '7786', '0'), +('16', '23', '17', '4309', '5576', '0'), +('16', '23', '17', '11623', '4979', '0'), +('16', '23', '17', '3307', '3413', '0'), +('16', '23', '7', '4833', '3567', '0'), +('16', '23', '7', '4343', '2873', '0'), +('16', '23', '7', '71303', '2689', '0'), +('16', '23', '7', '2458', '2406', '0'), +('16', '23', '9', '4834', '2625', '0'), +('16', '23', '9', '12189', '2263', '0'), +('16', '23', '9', '10149', '2255', '0'), +('16', '23', '9', '14650', '1802', '0'), +('16', '23', '15', '10366', '8005', '0'), +('16', '23', '15', '10151', '7200', '0'), +('16', '23', '15', '14679', '6255', '0'), +('16', '23', '15', '14678', '5104', '0'), +('16', '23', '20', '11601', '8622', '0'), +('16', '23', '20', '1365', '4200', '0'), +('16', '23', '20', '2471', '3804', '0'), +('16', '23', '20', '2742', '3165', '0'), +('16', '23', '12', '4835', '7948', '0'), +('16', '23', '12', '20655', '5051', '0'), +('16', '23', '12', '2923', '3404', '0'), +('16', '23', '12', '11624', '3097', '0'), +('16', '23', '18', '4836', '3854', '0'), +('16', '23', '18', '2461', '2557', '0'), +('16', '23', '18', '4346', '2276', '0'), +('16', '23', '18', '4412', '2083', '0'), +('16', '23', '19', '4837', '3923', '0'), +('16', '23', '19', '68239', '3223', '0'), +('16', '23', '19', '2337', '1757', '0'), +('16', '23', '19', '3312', '1392', '0'), +('16', '23', '13', '5622', '30149', '0'), +('16', '23', '13', '11609', '30048', '0'), +('16', '23', '13', '5412', '27775', '0'), +('16', '23', '13', '5401', '26280', '0'), +('16', '23', '14', '11551', '12679', '0'), +('16', '23', '14', '14762', '2181', '0'), +('16', '23', '14', '6359', '1753', '0'), +('16', '23', '14', '9690', '1500', '0'), +('16', '23', '11', '14762', '2181', '0'), +('16', '23', '11', '20677', '1800', '0'), +('16', '23', '11', '9246', '604', '0'), +('16', '23', '11', '13748', '454', '0'), +('16', '24', '22', '10323', '0', '0'), +('16', '24', '22', '10664', '0', '0'), +('16', '24', '22', '9246', '0', '0'), +('16', '24', '22', '21509', '0', '0'), +('16', '24', '1', '14701', '3802', '0'), +('16', '24', '1', '14702', '2500', '0'), +('16', '24', '1', '10165', '1683', '0'), +('16', '24', '1', '30361', '1140', '0'), +('16', '24', '2', '1519', '3207', '0'), +('16', '24', '2', '4620', '3160', '0'), +('16', '24', '2', '4831', '3020', '0'), +('16', '24', '2', '10142', '3012', '0'), +('16', '24', '3', '10144', '1304', '0'), +('16', '24', '3', '14706', '990', '0'), +('16', '24', '3', '14705', '990', '0'), +('16', '24', '3', '3314', '785', '0'), +('16', '24', '5', '14703', '5500', '0'), +('16', '24', '5', '14700', '3453', '0'), +('16', '24', '5', '10055', '3255', '0'), +('16', '24', '5', '68291', '2315', '0'), +('16', '24', '8', '11621', '14171', '0'), +('16', '24', '8', '1409', '6312', '0'), +('16', '24', '8', '11551', '5129', '0'), +('16', '24', '8', '2400', '2808', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '24', '6', '1557', '6760', '0'), +('16', '24', '6', '4302', '2324', '0'), +('16', '24', '6', '25062', '1817', '0'), +('16', '24', '6', '4165', '1812', '0'), +('16', '24', '17', '4832', '7858', '0'), +('16', '24', '17', '4309', '5576', '0'), +('16', '24', '17', '11623', '4979', '0'), +('16', '24', '17', '3307', '3432', '0'), +('16', '24', '7', '4833', '3567', '0'), +('16', '24', '7', '4343', '2921', '0'), +('16', '24', '7', '71303', '2689', '0'), +('16', '24', '7', '2458', '2406', '0'), +('16', '24', '9', '4834', '2625', '0'), +('16', '24', '9', '12189', '2263', '0'), +('16', '24', '9', '10149', '2255', '0'), +('16', '24', '9', '14650', '1802', '0'), +('16', '24', '15', '10366', '8005', '0'), +('16', '24', '15', '10151', '7200', '0'), +('16', '24', '15', '14679', '6255', '0'), +('16', '24', '15', '14678', '5104', '0'), +('16', '24', '20', '11601', '8670', '0'), +('16', '24', '20', '1365', '4200', '0'), +('16', '24', '20', '2471', '3804', '0'), +('16', '24', '20', '2742', '3213', '0'), +('16', '24', '12', '4835', '7972', '0'), +('16', '24', '12', '20655', '5060', '0'), +('16', '24', '12', '2923', '3404', '0'), +('16', '24', '12', '11624', '3131', '0'), +('16', '24', '18', '4836', '3878', '0'), +('16', '24', '18', '2461', '2557', '0'), +('16', '24', '18', '4346', '2276', '0'), +('16', '24', '18', '4412', '2083', '0'), +('16', '24', '19', '4837', '3923', '0'), +('16', '24', '19', '68239', '3223', '0'), +('16', '24', '19', '2337', '1757', '0'), +('16', '24', '19', '3312', '1392', '0'), +('16', '24', '13', '5622', '30502', '0'), +('16', '24', '13', '11609', '30401', '0'), +('16', '24', '13', '5412', '28078', '0'), +('16', '24', '13', '5401', '26532', '0'), +('16', '24', '14', '11551', '12679', '0'), +('16', '24', '14', '14762', '2181', '0'), +('16', '24', '14', '6359', '1753', '0'), +('16', '24', '14', '9690', '1500', '0'), +('16', '24', '11', '14762', '2181', '0'), +('16', '24', '11', '20677', '1800', '0'), +('16', '24', '11', '9246', '604', '0'), +('16', '24', '11', '13748', '454', '0'), +('16', '25', '22', '10323', '0', '0'), +('16', '25', '22', '10664', '0', '0'), +('16', '25', '22', '9246', '0', '0'), +('16', '25', '22', '21509', '0', '0'), +('16', '25', '1', '14701', '3802', '0'), +('16', '25', '1', '14702', '2500', '0'), +('16', '25', '1', '10165', '1683', '0'), +('16', '25', '1', '30361', '1140', '0'), +('16', '25', '2', '1519', '3207', '0'), +('16', '25', '2', '4620', '3198', '0'), +('16', '25', '2', '4831', '3020', '0'), +('16', '25', '2', '10142', '3012', '0'), +('16', '25', '3', '10144', '1304', '0'), +('16', '25', '3', '14706', '990', '0'), +('16', '25', '3', '14705', '990', '0'), +('16', '25', '3', '3314', '785', '0'), +('16', '25', '5', '14703', '5500', '0'), +('16', '25', '5', '14700', '3453', '0'), +('16', '25', '5', '10055', '3255', '0'), +('16', '25', '5', '68291', '2411', '0'), +('16', '25', '8', '11621', '14171', '0'), +('16', '25', '8', '1409', '6312', '0'), +('16', '25', '8', '11551', '5129', '0'), +('16', '25', '8', '2400', '2808', '0'), +('16', '25', '6', '1557', '6760', '0'), +('16', '25', '6', '4302', '2357', '0'), +('16', '25', '6', '25062', '1817', '0'), +('16', '25', '6', '4165', '1812', '0'), +('16', '25', '17', '4832', '7940', '0'), +('16', '25', '17', '4309', '5576', '0'), +('16', '25', '17', '11623', '4979', '0'), +('16', '25', '17', '3307', '3454', '0'), +('16', '25', '7', '4833', '3567', '0'), +('16', '25', '7', '4343', '2975', '0'), +('16', '25', '7', '71303', '2689', '0'), +('16', '25', '7', '2458', '2406', '0'), +('16', '25', '9', '4834', '2625', '0'), +('16', '25', '9', '12189', '2263', '0'), +('16', '25', '9', '10149', '2255', '0'), +('16', '25', '9', '4311', '1808', '0'), +('16', '25', '15', '10366', '8005', '0'), +('16', '25', '15', '10151', '7200', '0'), +('16', '25', '15', '14679', '6255', '0'), +('16', '25', '15', '14678', '5104', '0'), +('16', '25', '20', '11601', '8725', '0'), +('16', '25', '20', '1365', '4200', '0'), +('16', '25', '20', '2471', '3804', '0'), +('16', '25', '20', '2742', '3268', '0'), +('16', '25', '12', '4835', '7999', '0'), +('16', '25', '12', '20655', '5071', '0'), +('16', '25', '12', '2923', '3404', '0'), +('16', '25', '12', '11624', '3169', '0'), +('16', '25', '18', '4836', '3905', '0'), +('16', '25', '18', '2461', '2557', '0'), +('16', '25', '18', '4346', '2276', '0'), +('16', '25', '18', '4412', '2083', '0'), +('16', '25', '19', '4837', '3923', '0'), +('16', '25', '19', '68239', '3223', '0'), +('16', '25', '19', '2337', '1757', '0'), +('16', '25', '19', '3312', '1392', '0'), +('16', '25', '13', '5622', '30805', '0'), +('16', '25', '13', '11609', '30704', '0'), +('16', '25', '13', '5412', '28381', '0'), +('16', '25', '13', '5401', '26785', '0'), +('16', '25', '14', '11551', '12679', '0'), +('16', '25', '14', '14762', '2181', '0'), +('16', '25', '14', '6359', '1753', '0'), +('16', '25', '14', '9690', '1500', '0'), +('16', '25', '11', '14762', '2181', '0'), +('16', '25', '11', '20677', '1800', '0'), +('16', '25', '11', '9246', '604', '0'), +('16', '25', '11', '13748', '454', '0'), +('16', '26', '22', '10323', '0', '0'), +('16', '26', '22', '10664', '0', '0'), +('16', '26', '22', '9246', '0', '0'), +('16', '26', '22', '21509', '0', '0'), +('16', '26', '1', '14701', '3802', '0'), +('16', '26', '1', '14702', '2500', '0'), +('16', '26', '1', '10165', '1683', '0'), +('16', '26', '1', '30361', '1140', '0'), +('16', '26', '2', '4620', '3231', '0'), +('16', '26', '2', '1519', '3207', '0'), +('16', '26', '2', '4831', '3020', '0'), +('16', '26', '2', '10142', '3012', '0'), +('16', '26', '3', '10144', '1304', '0'), +('16', '26', '3', '14706', '990', '0'), +('16', '26', '3', '14705', '990', '0'), +('16', '26', '3', '3314', '785', '0'), +('16', '26', '5', '14703', '5500', '0'), +('16', '26', '5', '14700', '3453', '0'), +('16', '26', '5', '10055', '3255', '0'), +('16', '26', '5', '68291', '2411', '0'), +('16', '26', '8', '11621', '14171', '0'), +('16', '26', '8', '1409', '6312', '0'), +('16', '26', '8', '11551', '5129', '0'), +('16', '26', '8', '2400', '2808', '0'), +('16', '26', '6', '1557', '6760', '0'), +('16', '26', '6', '4302', '2386', '0'), +('16', '26', '6', '25062', '1817', '0'), +('16', '26', '6', '4165', '1812', '0'), +('16', '26', '17', '4832', '8012', '0'), +('16', '26', '17', '4309', '5576', '0'), +('16', '26', '17', '11623', '4979', '0'), +('16', '26', '17', '3307', '3473', '0'), +('16', '26', '7', '4833', '3567', '0'), +('16', '26', '7', '4343', '3024', '0'), +('16', '26', '7', '71303', '2689', '0'), +('16', '26', '7', '2458', '2406', '0'), +('16', '26', '9', '4834', '2625', '0'), +('16', '26', '9', '12189', '2263', '0'), +('16', '26', '9', '10149', '2255', '0'), +('16', '26', '9', '4311', '1842', '0'), +('16', '26', '15', '10366', '8005', '0'), +('16', '26', '15', '10151', '7200', '0'), +('16', '26', '15', '14679', '6255', '0'), +('16', '26', '15', '14678', '5104', '0'), +('16', '26', '20', '11601', '8773', '0'), +('16', '26', '20', '1365', '4200', '0'), +('16', '26', '20', '2471', '3804', '0'), +('16', '26', '20', '2742', '3316', '0'), +('16', '26', '12', '4835', '8023', '0'), +('16', '26', '12', '20655', '5081', '0'), +('16', '26', '12', '2923', '3404', '0'), +('16', '26', '12', '11624', '3203', '0'), +('16', '26', '18', '4836', '3929', '0'), +('16', '26', '18', '2461', '2557', '0'), +('16', '26', '18', '4346', '2276', '0'), +('16', '26', '18', '4412', '2083', '0'), +('16', '26', '19', '4837', '3923', '0'), +('16', '26', '19', '68239', '3223', '0'), +('16', '26', '19', '2337', '1757', '0'), +('16', '26', '19', '3312', '1392', '0'), +('16', '26', '13', '5622', '31159', '0'), +('16', '26', '13', '11609', '31058', '0'), +('16', '26', '13', '5412', '28684', '0'), +('16', '26', '13', '5401', '27037', '0'), +('16', '26', '14', '11551', '12679', '0'), +('16', '26', '14', '14762', '2181', '0'), +('16', '26', '14', '6359', '1753', '0'), +('16', '26', '14', '9690', '1500', '0'), +('16', '26', '11', '14762', '2181', '0'), +('16', '26', '11', '20677', '1800', '0'), +('16', '26', '11', '9246', '604', '0'), +('16', '26', '11', '13748', '454', '0'), +('16', '27', '22', '10323', '0', '0'), +('16', '27', '22', '10664', '0', '0'), +('16', '27', '22', '9246', '0', '0'), +('16', '27', '22', '21509', '0', '0'), +('16', '27', '1', '14701', '3802', '0'), +('16', '27', '1', '14702', '2500', '0'), +('16', '27', '1', '10165', '1683', '0'), +('16', '27', '1', '30361', '1140', '0'), +('16', '27', '2', '4620', '3265', '0'), +('16', '27', '2', '1519', '3207', '0'), +('16', '27', '2', '4831', '3020', '0'), +('16', '27', '2', '10142', '3012', '0'), +('16', '27', '3', '10144', '1304', '0'), +('16', '27', '3', '14706', '990', '0'), +('16', '27', '3', '14705', '990', '0'), +('16', '27', '3', '3314', '785', '0'), +('16', '27', '5', '14703', '5500', '0'), +('16', '27', '5', '14700', '3453', '0'), +('16', '27', '5', '10055', '3255', '0'), +('16', '27', '5', '68291', '2411', '0'), +('16', '27', '8', '11621', '14171', '0'), +('16', '27', '8', '1409', '6312', '0'), +('16', '27', '8', '11551', '5129', '0'), +('16', '27', '8', '2400', '2808', '0'), +('16', '27', '6', '1557', '6760', '0'), +('16', '27', '6', '4302', '2415', '0'), +('16', '27', '6', '25062', '1817', '0'), +('16', '27', '6', '4165', '1812', '0'), +('16', '27', '17', '4832', '8085', '0'), +('16', '27', '17', '4309', '5576', '0'), +('16', '27', '17', '11623', '4979', '0'), +('16', '27', '17', '3307', '3492', '0'), +('16', '27', '7', '4833', '3567', '0'), +('16', '27', '7', '4343', '3072', '0'), +('16', '27', '7', '71303', '2689', '0'), +('16', '27', '7', '2458', '2406', '0'), +('16', '27', '9', '4834', '2625', '0'), +('16', '27', '9', '12189', '2263', '0'), +('16', '27', '9', '10149', '2255', '0'), +('16', '27', '9', '4311', '1876', '0'), +('16', '27', '15', '10366', '8005', '0'), +('16', '27', '15', '10151', '7200', '0'), +('16', '27', '15', '14679', '6255', '0'), +('16', '27', '15', '14678', '5104', '0'), +('16', '27', '20', '11601', '8821', '0'), +('16', '27', '20', '1365', '4200', '0'), +('16', '27', '20', '2471', '3804', '0'), +('16', '27', '20', '2742', '3364', '0'), +('16', '27', '12', '4835', '8047', '0'), +('16', '27', '12', '20655', '5090', '0'), +('16', '27', '12', '2923', '3404', '0'), +('16', '27', '12', '11624', '3236', '0'), +('16', '27', '18', '4836', '3953', '0'), +('16', '27', '18', '2461', '2557', '0'), +('16', '27', '18', '4346', '2276', '0'), +('16', '27', '18', '4412', '2083', '0'), +('16', '27', '19', '4837', '3923', '0'), +('16', '27', '19', '68239', '3223', '0'), +('16', '27', '19', '2337', '1757', '0'), +('16', '27', '19', '3312', '1392', '0'), +('16', '27', '13', '5622', '31512', '0'), +('16', '27', '13', '11609', '31411', '0'), +('16', '27', '13', '5412', '28987', '0'), +('16', '27', '13', '5401', '27290', '0'), +('16', '27', '14', '11551', '12679', '0'), +('16', '27', '14', '14762', '2181', '0'), +('16', '27', '14', '6359', '1753', '0'), +('16', '27', '14', '9690', '1500', '0'), +('16', '27', '11', '14762', '2181', '0'), +('16', '27', '11', '20677', '1800', '0'), +('16', '27', '11', '9246', '604', '0'), +('16', '27', '11', '13748', '454', '0'), +('16', '28', '22', '10323', '0', '0'), +('16', '28', '22', '10664', '0', '0'), +('16', '28', '22', '9246', '0', '0'), +('16', '28', '22', '21509', '0', '0'), +('16', '28', '1', '14701', '3802', '0'), +('16', '28', '1', '14702', '2500', '0'), +('16', '28', '1', '10165', '1683', '0'), +('16', '28', '1', '30361', '1140', '0'), +('16', '28', '2', '4620', '3303', '0'), +('16', '28', '2', '1519', '3207', '0'), +('16', '28', '2', '4831', '3020', '0'), +('16', '28', '2', '10142', '3012', '0'), +('16', '28', '3', '10144', '1304', '0'), +('16', '28', '3', '14706', '990', '0'), +('16', '28', '3', '14705', '990', '0'), +('16', '28', '3', '3314', '785', '0'), +('16', '28', '5', '14703', '5500', '0'), +('16', '28', '5', '14700', '3453', '0'), +('16', '28', '5', '10055', '3255', '0'), +('16', '28', '5', '68291', '2411', '0'), +('16', '28', '8', '11621', '14171', '0'), +('16', '28', '8', '1409', '6312', '0'), +('16', '28', '8', '11551', '5129', '0'), +('16', '28', '8', '2400', '2808', '0'), +('16', '28', '6', '1557', '6760', '0'), +('16', '28', '6', '4302', '2447', '0'), +('16', '28', '6', '25062', '1817', '0'), +('16', '28', '6', '4165', '1812', '0'), +('16', '28', '17', '4832', '8166', '0'), +('16', '28', '17', '4309', '5576', '0'), +('16', '28', '17', '11623', '4979', '0'), +('16', '28', '17', '3307', '3514', '0'), +('16', '28', '7', '4833', '3567', '0'), +('16', '28', '7', '4343', '3126', '0'), +('16', '28', '7', '71303', '2689', '0'), +('16', '28', '7', '2458', '2406', '0'), +('16', '28', '9', '4834', '2625', '0'), +('16', '28', '9', '12189', '2263', '0'), +('16', '28', '9', '10149', '2255', '0'), +('16', '28', '9', '4311', '1914', '0'), +('16', '28', '15', '10366', '8005', '0'), +('16', '28', '15', '10151', '7200', '0'), +('16', '28', '15', '14679', '6255', '0'), +('16', '28', '15', '14678', '5104', '0'), +('16', '28', '20', '11601', '8876', '0'), +('16', '28', '20', '1365', '4200', '0'), +('16', '28', '20', '2471', '3804', '0'), +('16', '28', '20', '2742', '3419', '0'), +('16', '28', '12', '4835', '8074', '0'), +('16', '28', '12', '20655', '5101', '0'), +('16', '28', '12', '2923', '3404', '0'), +('16', '28', '12', '11624', '3275', '0'), +('16', '28', '18', '4836', '3980', '0'), +('16', '28', '18', '2461', '2557', '0'), +('16', '28', '18', '4346', '2276', '0'), +('16', '28', '18', '4412', '2083', '0'), +('16', '28', '19', '4837', '3923', '0'), +('16', '28', '19', '68239', '3223', '0'), +('16', '28', '19', '2337', '1757', '0'), +('16', '28', '19', '3312', '1392', '0'), +('16', '28', '13', '5622', '31815', '0'), +('16', '28', '13', '11609', '31714', '0'), +('16', '28', '13', '5412', '29341', '0'), +('16', '28', '13', '5401', '27593', '0'), +('16', '28', '14', '11551', '12679', '0'), +('16', '28', '14', '14762', '2181', '0'), +('16', '28', '14', '6359', '1753', '0'), +('16', '28', '14', '9690', '1500', '0'), +('16', '28', '11', '14762', '2181', '0'), +('16', '28', '11', '20677', '1800', '0'), +('16', '28', '11', '9246', '604', '0'), +('16', '28', '11', '13748', '454', '0'), +('16', '29', '22', '10323', '0', '0'), +('16', '29', '22', '10664', '0', '0'), +('16', '29', '22', '9246', '0', '0'), +('16', '29', '22', '21509', '0', '0'), +('16', '29', '1', '14701', '3802', '0'), +('16', '29', '1', '14702', '2500', '0'), +('16', '29', '1', '10165', '1683', '0'), +('16', '29', '1', '30361', '1140', '0'), +('16', '29', '2', '4620', '3337', '0'), +('16', '29', '2', '1519', '3207', '0'), +('16', '29', '2', '4831', '3020', '0'), +('16', '29', '2', '10142', '3012', '0'), +('16', '29', '3', '10144', '1304', '0'), +('16', '29', '3', '14706', '990', '0'), +('16', '29', '3', '14705', '990', '0'), +('16', '29', '3', '3314', '785', '0'), +('16', '29', '5', '14703', '5500', '0'), +('16', '29', '5', '14700', '3453', '0'), +('16', '29', '5', '10055', '3255', '0'), +('16', '29', '5', '68291', '2411', '0'), +('16', '29', '8', '11621', '14171', '0'), +('16', '29', '8', '1409', '6312', '0'), +('16', '29', '8', '11551', '5129', '0'), +('16', '29', '8', '2400', '2808', '0'), +('16', '29', '6', '1557', '6760', '0'), +('16', '29', '6', '4302', '2476', '0'), +('16', '29', '6', '25062', '1817', '0'), +('16', '29', '6', '4165', '1812', '0'), +('16', '29', '17', '4832', '8239', '0'), +('16', '29', '17', '4309', '5576', '0'), +('16', '29', '17', '11623', '4979', '0'), +('16', '29', '17', '3307', '3533', '0'), +('16', '29', '7', '4833', '3567', '0'), +('16', '29', '7', '4343', '3175', '0'), +('16', '29', '7', '71303', '2689', '0'), +('16', '29', '7', '2458', '2406', '0'), +('16', '29', '9', '4834', '2625', '0'), +('16', '29', '9', '12189', '2263', '0'), +('16', '29', '9', '10149', '2255', '0'), +('16', '29', '9', '4311', '1948', '0'), +('16', '29', '15', '10366', '8005', '0'), +('16', '29', '15', '10151', '7200', '0'), +('16', '29', '15', '14679', '6255', '0'), +('16', '29', '15', '14678', '5104', '0'), +('16', '29', '20', '11601', '8924', '0'), +('16', '29', '20', '1365', '4200', '0'), +('16', '29', '20', '2471', '3804', '0'), +('16', '29', '20', '2742', '3467', '0'), +('16', '29', '12', '4835', '8099', '0'), +('16', '29', '12', '20655', '5111', '0'), +('16', '29', '12', '2923', '3404', '0'), +('16', '29', '12', '11624', '3308', '0'), +('16', '29', '18', '4836', '4005', '0'), +('16', '29', '18', '2461', '2557', '0'), +('16', '29', '18', '4346', '2276', '0'), +('16', '29', '18', '4412', '2083', '0'), +('16', '29', '19', '4837', '3923', '0'), +('16', '29', '19', '68239', '3223', '0'), +('16', '29', '19', '2337', '1757', '0'), +('16', '29', '19', '3312', '1392', '0'), +('16', '29', '13', '5622', '32169', '0'), +('16', '29', '13', '11609', '32068', '0'), +('16', '29', '13', '5412', '29644', '0'), +('16', '29', '13', '5401', '27845', '0'), +('16', '29', '14', '11551', '12679', '0'), +('16', '29', '14', '14762', '2181', '0'), +('16', '29', '14', '6359', '1753', '0'), +('16', '29', '14', '9690', '1500', '0'), +('16', '29', '11', '14762', '2181', '0'), +('16', '29', '11', '20677', '1800', '0'), +('16', '29', '11', '9246', '604', '0'), +('16', '29', '11', '13748', '454', '0'), +('16', '30', '22', '10323', '0', '0'), +('16', '30', '22', '10664', '0', '0'), +('16', '30', '22', '9246', '0', '0'), +('16', '30', '22', '21509', '0', '0'), +('16', '30', '1', '14701', '3802', '0'), +('16', '30', '1', '14702', '2500', '0'), +('16', '30', '1', '10165', '1683', '0'), +('16', '30', '1', '30361', '1140', '0'), +('16', '30', '2', '4620', '3375', '0'), +('16', '30', '2', '1519', '3207', '0'), +('16', '30', '2', '4831', '3020', '0'), +('16', '30', '2', '10142', '3012', '0'), +('16', '30', '3', '10144', '1304', '0'), +('16', '30', '3', '14706', '990', '0'), +('16', '30', '3', '14705', '990', '0'), +('16', '30', '3', '3314', '785', '0'), +('16', '30', '5', '14703', '5500', '0'), +('16', '30', '5', '14700', '3453', '0'), +('16', '30', '5', '10055', '3255', '0'), +('16', '30', '5', '68291', '2411', '0'), +('16', '30', '8', '11621', '14171', '0'), +('16', '30', '8', '1409', '6312', '0'), +('16', '30', '8', '11551', '5129', '0'), +('16', '30', '8', '2400', '2808', '0'), +('16', '30', '6', '1557', '6760', '0'), +('16', '30', '6', '4302', '2509', '0'), +('16', '30', '6', '25062', '1817', '0'), +('16', '30', '6', '4165', '1812', '0'), +('16', '30', '17', '4832', '8320', '0'), +('16', '30', '17', '4309', '5576', '0'), +('16', '30', '17', '11623', '4979', '0'), +('16', '30', '17', '3307', '3555', '0'), +('16', '30', '7', '4833', '3567', '0'), +('16', '30', '7', '4343', '3229', '0'), +('16', '30', '7', '71303', '2689', '0'), +('16', '30', '7', '2458', '2406', '0'), +('16', '30', '9', '4834', '2625', '0'), +('16', '30', '9', '12189', '2263', '0'), +('16', '30', '9', '10149', '2255', '0'), +('16', '30', '9', '4311', '1986', '0'), +('16', '30', '15', '10366', '8005', '0'), +('16', '30', '15', '10151', '7200', '0'), +('16', '30', '15', '14679', '6255', '0'), +('16', '30', '15', '14678', '5104', '0'), +('16', '30', '20', '11601', '8978', '0'), +('16', '30', '20', '1365', '4200', '0'), +('16', '30', '20', '2471', '3804', '0'), +('16', '30', '20', '2742', '3521', '0'), +('16', '30', '12', '4835', '8126', '0'), +('16', '30', '12', '20655', '5122', '0'), +('16', '30', '12', '2923', '3404', '0'), +('16', '30', '12', '11624', '3346', '0'), +('16', '30', '18', '4836', '4032', '0'), +('16', '30', '18', '2461', '2557', '0'), +('16', '30', '18', '4346', '2276', '0'), +('16', '30', '18', '4412', '2083', '0'), +('16', '30', '19', '4837', '3923', '0'), +('16', '30', '19', '68239', '3223', '0'), +('16', '30', '19', '2337', '1757', '0'), +('16', '30', '19', '3312', '1392', '0'), +('16', '30', '13', '5622', '32522', '0'), +('16', '30', '13', '11609', '32421', '0'), +('16', '30', '13', '5412', '29947', '0'), +('16', '30', '13', '5401', '28098', '0'), +('16', '30', '14', '11551', '12679', '0'), +('16', '30', '14', '14762', '2181', '0'), +('16', '30', '14', '6359', '1753', '0'), +('16', '30', '14', '9690', '1500', '0'), +('16', '30', '11', '14762', '2181', '0'), +('16', '30', '11', '20677', '1800', '0'), +('16', '30', '11', '9246', '604', '0'), +('16', '30', '11', '13748', '454', '0'), +('16', '31', '22', '10323', '0', '0'), +('16', '31', '22', '10664', '0', '0'), +('16', '31', '22', '9246', '0', '0'), +('16', '31', '22', '21509', '0', '0'), +('16', '31', '1', '14701', '3802', '0'), +('16', '31', '1', '14702', '2500', '0'), +('16', '31', '1', '10165', '1683', '0'), +('16', '31', '1', '30361', '1140', '0'), +('16', '31', '2', '4620', '3413', '0'), +('16', '31', '2', '1519', '3207', '0'), +('16', '31', '2', '4831', '3020', '0'), +('16', '31', '2', '10142', '3012', '0'), +('16', '31', '3', '10144', '1304', '0'), +('16', '31', '3', '14706', '990', '0'), +('16', '31', '3', '14705', '990', '0'), +('16', '31', '3', '3314', '785', '0'), +('16', '31', '5', '14703', '5500', '0'), +('16', '31', '5', '14700', '3453', '0'), +('16', '31', '5', '10055', '3255', '0'), +('16', '31', '5', '68291', '2411', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '31', '8', '11621', '14171', '0'), +('16', '31', '8', '1409', '6312', '0'), +('16', '31', '8', '11551', '5129', '0'), +('16', '31', '8', '2400', '2808', '0'), +('16', '31', '6', '1557', '6760', '0'), +('16', '31', '6', '4302', '2542', '0'), +('16', '31', '6', '25062', '1817', '0'), +('16', '31', '6', '4165', '1812', '0'), +('16', '31', '17', '4832', '8402', '0'), +('16', '31', '17', '4309', '5576', '0'), +('16', '31', '17', '11623', '4979', '0'), +('16', '31', '17', '3307', '3577', '0'), +('16', '31', '7', '4833', '3567', '0'), +('16', '31', '7', '4343', '3283', '0'), +('16', '31', '7', '71303', '2689', '0'), +('16', '31', '7', '2458', '2406', '0'), +('16', '31', '9', '4834', '2625', '0'), +('16', '31', '9', '12189', '2263', '0'), +('16', '31', '9', '10149', '2255', '0'), +('16', '31', '9', '4311', '2024', '0'), +('16', '31', '15', '10366', '8005', '0'), +('16', '31', '15', '10151', '7200', '0'), +('16', '31', '15', '14679', '6255', '0'), +('16', '31', '15', '14678', '5104', '0'), +('16', '31', '20', '11601', '9033', '0'), +('16', '31', '20', '1365', '4200', '0'), +('16', '31', '20', '2471', '3804', '0'), +('16', '31', '20', '2742', '3576', '0'), +('16', '31', '12', '4835', '8153', '0'), +('16', '31', '12', '20655', '5133', '0'), +('16', '31', '12', '2923', '3404', '0'), +('16', '31', '12', '11624', '3384', '0'), +('16', '31', '18', '4836', '4059', '0'), +('16', '31', '18', '2461', '2557', '0'), +('16', '31', '18', '4346', '2276', '0'), +('16', '31', '18', '4412', '2083', '0'), +('16', '31', '19', '4837', '3923', '0'), +('16', '31', '19', '68239', '3223', '0'), +('16', '31', '19', '2337', '1757', '0'), +('16', '31', '19', '3312', '1392', '0'), +('16', '31', '13', '5622', '32825', '0'), +('16', '31', '13', '11609', '32724', '0'), +('16', '31', '13', '5412', '30250', '0'), +('16', '31', '13', '5401', '28350', '0'), +('16', '31', '14', '11551', '12679', '0'), +('16', '31', '14', '14762', '2181', '0'), +('16', '31', '14', '6359', '1753', '0'), +('16', '31', '14', '9690', '1500', '0'), +('16', '31', '11', '14762', '2181', '0'), +('16', '31', '11', '20677', '1800', '0'), +('16', '31', '11', '9246', '604', '0'), +('16', '31', '11', '13748', '454', '0'), +('16', '32', '22', '10323', '0', '0'), +('16', '32', '22', '10664', '0', '0'), +('16', '32', '22', '9246', '0', '0'), +('16', '32', '22', '21509', '0', '0'), +('16', '32', '1', '14701', '3802', '0'), +('16', '32', '1', '14702', '2500', '0'), +('16', '32', '1', '10165', '1683', '0'), +('16', '32', '1', '30361', '1140', '0'), +('16', '32', '2', '4620', '3447', '0'), +('16', '32', '2', '1519', '3207', '0'), +('16', '32', '2', '4831', '3020', '0'), +('16', '32', '2', '10142', '3012', '0'), +('16', '32', '3', '10144', '1304', '0'), +('16', '32', '3', '14706', '990', '0'), +('16', '32', '3', '14705', '990', '0'), +('16', '32', '3', '3314', '785', '0'), +('16', '32', '5', '14703', '5500', '0'), +('16', '32', '5', '14700', '3453', '0'), +('16', '32', '5', '10055', '3255', '0'), +('16', '32', '5', '68291', '2411', '0'), +('16', '32', '8', '11621', '14171', '0'), +('16', '32', '8', '1409', '6312', '0'), +('16', '32', '8', '11551', '5129', '0'), +('16', '32', '8', '2400', '2808', '0'), +('16', '32', '6', '1557', '6760', '0'), +('16', '32', '6', '4302', '2571', '0'), +('16', '32', '6', '25062', '1817', '0'), +('16', '32', '6', '4165', '1812', '0'), +('16', '32', '17', '4832', '8474', '0'), +('16', '32', '17', '4309', '5576', '0'), +('16', '32', '17', '11623', '4979', '0'), +('16', '32', '17', '3307', '3596', '0'), +('16', '32', '7', '4833', '3567', '0'), +('16', '32', '7', '4343', '3332', '0'), +('16', '32', '7', '71303', '2689', '0'), +('16', '32', '7', '2458', '2406', '0'), +('16', '32', '9', '4834', '2625', '0'), +('16', '32', '9', '12189', '2263', '0'), +('16', '32', '9', '10149', '2255', '0'), +('16', '32', '9', '4311', '2058', '0'), +('16', '32', '15', '10366', '8005', '0'), +('16', '32', '15', '10151', '7200', '0'), +('16', '32', '15', '14679', '6255', '0'), +('16', '32', '15', '14678', '5104', '0'), +('16', '32', '20', '11601', '9081', '0'), +('16', '32', '20', '1365', '4200', '0'), +('16', '32', '20', '2471', '3804', '0'), +('16', '32', '20', '2742', '3624', '0'), +('16', '32', '12', '4835', '8177', '0'), +('16', '32', '12', '20655', '5142', '0'), +('16', '32', '12', '11624', '3418', '0'), +('16', '32', '12', '2923', '3404', '0'), +('16', '32', '18', '4836', '4083', '0'), +('16', '32', '18', '2461', '2557', '0'), +('16', '32', '18', '4346', '2276', '0'), +('16', '32', '18', '4412', '2083', '0'), +('16', '32', '19', '4837', '3923', '0'), +('16', '32', '19', '68239', '3223', '0'), +('16', '32', '19', '2337', '1757', '0'), +('16', '32', '19', '3312', '1392', '0'), +('16', '32', '13', '5622', '33179', '0'), +('16', '32', '13', '11609', '33078', '0'), +('16', '32', '13', '5412', '30553', '0'), +('16', '32', '13', '5401', '28603', '0'), +('16', '32', '14', '11551', '12679', '0'), +('16', '32', '14', '14762', '2181', '0'), +('16', '32', '14', '6359', '1753', '0'), +('16', '32', '14', '13355', '1516', '0'), +('16', '32', '11', '14762', '2181', '0'), +('16', '32', '11', '20677', '1800', '0'), +('16', '32', '11', '9246', '604', '0'), +('16', '32', '11', '13748', '454', '0'), +('16', '33', '22', '10323', '0', '0'), +('16', '33', '22', '10664', '0', '0'), +('16', '33', '22', '9246', '0', '0'), +('16', '33', '22', '21509', '0', '0'), +('16', '33', '1', '14701', '3802', '0'), +('16', '33', '1', '14702', '2500', '0'), +('16', '33', '1', '10165', '1683', '0'), +('16', '33', '1', '30361', '1140', '0'), +('16', '33', '2', '4620', '3485', '0'), +('16', '33', '2', '1519', '3207', '0'), +('16', '33', '2', '4831', '3020', '0'), +('16', '33', '2', '10142', '3012', '0'), +('16', '33', '3', '10144', '1304', '0'), +('16', '33', '3', '14706', '990', '0'), +('16', '33', '3', '14705', '990', '0'), +('16', '33', '3', '3314', '785', '0'), +('16', '33', '5', '14703', '5500', '0'), +('16', '33', '5', '14700', '3453', '0'), +('16', '33', '5', '10055', '3255', '0'), +('16', '33', '5', '68291', '2411', '0'), +('16', '33', '8', '11621', '14171', '0'), +('16', '33', '8', '1409', '6312', '0'), +('16', '33', '8', '11551', '5129', '0'), +('16', '33', '8', '2400', '2808', '0'), +('16', '33', '6', '1557', '6760', '0'), +('16', '33', '6', '4302', '2603', '0'), +('16', '33', '6', '25062', '1817', '0'), +('16', '33', '6', '4165', '1812', '0'), +('16', '33', '17', '4832', '8556', '0'), +('16', '33', '17', '4309', '5576', '0'), +('16', '33', '17', '11623', '4979', '0'), +('16', '33', '17', '3307', '3618', '0'), +('16', '33', '7', '4833', '3567', '0'), +('16', '33', '7', '4343', '3386', '0'), +('16', '33', '7', '71303', '2689', '0'), +('16', '33', '7', '2458', '2406', '0'), +('16', '33', '9', '4834', '2625', '0'), +('16', '33', '9', '12189', '2263', '0'), +('16', '33', '9', '10149', '2255', '0'), +('16', '33', '9', '4311', '2096', '0'), +('16', '33', '15', '10366', '8005', '0'), +('16', '33', '15', '10151', '7200', '0'), +('16', '33', '15', '14679', '6255', '0'), +('16', '33', '15', '14678', '5104', '0'), +('16', '33', '20', '11601', '9135', '0'), +('16', '33', '20', '1365', '4200', '0'), +('16', '33', '20', '2471', '3804', '0'), +('16', '33', '20', '2742', '3678', '0'), +('16', '33', '12', '4835', '8204', '0'), +('16', '33', '12', '20655', '5153', '0'), +('16', '33', '12', '11624', '3456', '0'), +('16', '33', '12', '2923', '3404', '0'), +('16', '33', '18', '4836', '4110', '0'), +('16', '33', '18', '2461', '2557', '0'), +('16', '33', '18', '4346', '2276', '0'), +('16', '33', '18', '4412', '2083', '0'), +('16', '33', '19', '4837', '3923', '0'), +('16', '33', '19', '68239', '3223', '0'), +('16', '33', '19', '2337', '1757', '0'), +('16', '33', '19', '3312', '1392', '0'), +('16', '33', '13', '5622', '33532', '0'), +('16', '33', '13', '11609', '33381', '0'), +('16', '33', '13', '5412', '30856', '0'), +('16', '33', '13', '5401', '28855', '0'), +('16', '33', '14', '11551', '12679', '0'), +('16', '33', '14', '14762', '2181', '0'), +('16', '33', '14', '6359', '1753', '0'), +('16', '33', '14', '13355', '1570', '0'), +('16', '33', '11', '14762', '2181', '0'), +('16', '33', '11', '20677', '1800', '0'), +('16', '33', '11', '9246', '604', '0'), +('16', '33', '11', '13748', '454', '0'), +('16', '34', '22', '10323', '0', '0'), +('16', '34', '22', '10664', '0', '0'), +('16', '34', '22', '9246', '0', '0'), +('16', '34', '22', '21509', '0', '0'), +('16', '34', '1', '14701', '3802', '0'), +('16', '34', '1', '14702', '2500', '0'), +('16', '34', '1', '10165', '1683', '0'), +('16', '34', '1', '30361', '1140', '0'), +('16', '34', '2', '4620', '3523', '0'), +('16', '34', '2', '1519', '3207', '0'), +('16', '34', '2', '4831', '3020', '0'), +('16', '34', '2', '10142', '3012', '0'), +('16', '34', '3', '10144', '1304', '0'), +('16', '34', '3', '14706', '990', '0'), +('16', '34', '3', '14705', '990', '0'), +('16', '34', '3', '3314', '785', '0'), +('16', '34', '5', '14703', '5500', '0'), +('16', '34', '5', '14700', '3453', '0'), +('16', '34', '5', '10055', '3255', '0'), +('16', '34', '5', '68291', '2411', '0'), +('16', '34', '8', '11621', '14171', '0'), +('16', '34', '8', '1409', '6312', '0'), +('16', '34', '8', '11551', '5129', '0'), +('16', '34', '8', '2400', '2808', '0'), +('16', '34', '6', '1557', '6760', '0'), +('16', '34', '6', '4302', '2636', '0'), +('16', '34', '6', '25062', '1817', '0'), +('16', '34', '6', '4165', '1812', '0'), +('16', '34', '17', '4832', '8637', '0'), +('16', '34', '17', '4309', '5576', '0'), +('16', '34', '17', '11623', '4979', '0'), +('16', '34', '17', '3307', '3640', '0'), +('16', '34', '7', '4833', '3567', '0'), +('16', '34', '7', '4343', '3440', '0'), +('16', '34', '7', '71303', '2689', '0'), +('16', '34', '7', '2458', '2406', '0'), +('16', '34', '9', '4834', '2625', '0'), +('16', '34', '9', '12189', '2263', '0'), +('16', '34', '9', '10149', '2255', '0'), +('16', '34', '9', '4311', '2134', '0'), +('16', '34', '15', '10366', '8005', '0'), +('16', '34', '15', '10151', '7200', '0'), +('16', '34', '15', '14679', '6255', '0'), +('16', '34', '15', '14678', '5104', '0'), +('16', '34', '20', '11601', '9190', '0'), +('16', '34', '20', '1365', '4200', '0'), +('16', '34', '20', '2471', '3804', '0'), +('16', '34', '20', '2742', '3733', '0'), +('16', '34', '12', '4835', '8231', '0'), +('16', '34', '12', '20655', '5164', '0'), +('16', '34', '12', '11624', '3494', '0'), +('16', '34', '12', '2923', '3404', '0'), +('16', '34', '18', '4836', '4137', '0'), +('16', '34', '18', '2461', '2557', '0'), +('16', '34', '18', '4346', '2276', '0'), +('16', '34', '18', '4412', '2083', '0'), +('16', '34', '19', '4837', '3923', '0'), +('16', '34', '19', '68239', '3223', '0'), +('16', '34', '19', '2337', '1757', '0'), +('16', '34', '19', '3312', '1392', '0'), +('16', '34', '13', '5622', '33835', '0'), +('16', '34', '13', '11609', '33734', '0'), +('16', '34', '13', '5412', '31159', '0'), +('16', '34', '13', '45120', '29327', '0'), +('16', '34', '14', '11551', '12679', '0'), +('16', '34', '14', '14762', '2181', '0'), +('16', '34', '14', '6359', '1753', '0'), +('16', '34', '14', '13355', '1625', '0'), +('16', '34', '11', '14762', '2181', '0'), +('16', '34', '11', '20677', '1800', '0'), +('16', '34', '11', '9246', '604', '0'), +('16', '34', '11', '13748', '454', '0'), +('16', '35', '22', '10323', '0', '0'), +('16', '35', '22', '10664', '0', '0'), +('16', '35', '22', '9246', '0', '0'), +('16', '35', '22', '21509', '0', '0'), +('16', '35', '1', '14701', '3802', '0'), +('16', '35', '1', '14702', '2500', '0'), +('16', '35', '1', '10165', '1683', '0'), +('16', '35', '1', '30361', '1140', '0'), +('16', '35', '2', '4620', '3561', '0'), +('16', '35', '2', '1519', '3207', '0'), +('16', '35', '2', '4831', '3020', '0'), +('16', '35', '2', '10142', '3012', '0'), +('16', '35', '3', '10144', '1304', '0'), +('16', '35', '3', '14706', '990', '0'), +('16', '35', '3', '14705', '990', '0'), +('16', '35', '3', '3314', '785', '0'), +('16', '35', '5', '14703', '5500', '0'), +('16', '35', '5', '14700', '3453', '0'), +('16', '35', '5', '10055', '3255', '0'), +('16', '35', '5', '68291', '2411', '0'), +('16', '35', '8', '11621', '14171', '0'), +('16', '35', '8', '1409', '6312', '0'), +('16', '35', '8', '11551', '5129', '0'), +('16', '35', '8', '2400', '2808', '0'), +('16', '35', '6', '1557', '6760', '0'), +('16', '35', '6', '4302', '2668', '0'), +('16', '35', '6', '25062', '1817', '0'), +('16', '35', '6', '4165', '1812', '0'), +('16', '35', '17', '4832', '8719', '0'), +('16', '35', '17', '4309', '5576', '0'), +('16', '35', '17', '11623', '4979', '0'), +('16', '35', '17', '3307', '3661', '0'), +('16', '35', '7', '4833', '3567', '0'), +('16', '35', '7', '4343', '3495', '0'), +('16', '35', '7', '71303', '2689', '0'), +('16', '35', '7', '2458', '2406', '0'), +('16', '35', '9', '4834', '2625', '0'), +('16', '35', '9', '12189', '2263', '0'), +('16', '35', '9', '10149', '2255', '0'), +('16', '35', '9', '4311', '2172', '0'), +('16', '35', '15', '10366', '8005', '0'), +('16', '35', '15', '10151', '7200', '0'), +('16', '35', '15', '14679', '6255', '0'), +('16', '35', '15', '14678', '5104', '0'), +('16', '35', '20', '11601', '9244', '0'), +('16', '35', '20', '1365', '4200', '0'), +('16', '35', '20', '2471', '3804', '0'), +('16', '35', '20', '2742', '3787', '0'), +('16', '35', '12', '4835', '8259', '0'), +('16', '35', '12', '20655', '5175', '0'), +('16', '35', '12', '11624', '3532', '0'), +('16', '35', '12', '2923', '3404', '0'), +('16', '35', '18', '4836', '4165', '0'), +('16', '35', '18', '2461', '2557', '0'), +('16', '35', '18', '4346', '2276', '0'), +('16', '35', '18', '4412', '2083', '0'), +('16', '35', '19', '4837', '3923', '0'), +('16', '35', '19', '68239', '3223', '0'), +('16', '35', '19', '2337', '1757', '0'), +('16', '35', '19', '3312', '1392', '0'), +('16', '35', '13', '5622', '34189', '0'), +('16', '35', '13', '11609', '34088', '0'), +('16', '35', '13', '5412', '31462', '0'), +('16', '35', '13', '45120', '30593', '0'), +('16', '35', '14', '11551', '12679', '0'), +('16', '35', '14', '14762', '2181', '0'), +('16', '35', '14', '6359', '1753', '0'), +('16', '35', '14', '13355', '1679', '0'), +('16', '35', '11', '14762', '2181', '0'), +('16', '35', '11', '20677', '1800', '0'), +('16', '35', '11', '9246', '604', '0'), +('16', '35', '11', '13748', '454', '0'), +('16', '36', '22', '10323', '0', '0'), +('16', '36', '22', '10664', '0', '0'), +('16', '36', '22', '9246', '0', '0'), +('16', '36', '22', '21509', '0', '0'), +('16', '36', '1', '14701', '3802', '0'), +('16', '36', '1', '14702', '2500', '0'), +('16', '36', '1', '10165', '1683', '0'), +('16', '36', '1', '30361', '1140', '0'), +('16', '36', '2', '4620', '3599', '0'), +('16', '36', '2', '1519', '3207', '0'), +('16', '36', '2', '4831', '3020', '0'), +('16', '36', '2', '10142', '3012', '0'), +('16', '36', '3', '10144', '1304', '0'), +('16', '36', '3', '14706', '990', '0'), +('16', '36', '3', '14705', '990', '0'), +('16', '36', '3', '3314', '785', '0'), +('16', '36', '5', '14703', '5500', '0'), +('16', '36', '5', '14700', '3453', '0'), +('16', '36', '5', '10055', '3255', '0'), +('16', '36', '5', '68291', '2411', '0'), +('16', '36', '8', '11621', '14171', '0'), +('16', '36', '8', '1409', '6312', '0'), +('16', '36', '8', '11551', '5129', '0'), +('16', '36', '8', '2400', '2808', '0'), +('16', '36', '6', '1557', '6760', '0'), +('16', '36', '6', '4302', '2701', '0'), +('16', '36', '6', '25062', '1817', '0'), +('16', '36', '6', '4165', '1812', '0'), +('16', '36', '17', '4832', '8800', '0'), +('16', '36', '17', '4309', '5576', '0'), +('16', '36', '17', '11623', '4979', '0'), +('16', '36', '17', '3307', '3683', '0'), +('16', '36', '7', '4833', '3567', '0'), +('16', '36', '7', '4343', '3549', '0'), +('16', '36', '7', '71303', '2689', '0'), +('16', '36', '7', '2458', '2406', '0'), +('16', '36', '9', '4834', '2625', '0'), +('16', '36', '9', '12189', '2263', '0'), +('16', '36', '9', '10149', '2255', '0'), +('16', '36', '9', '4311', '2210', '0'), +('16', '36', '15', '10366', '8005', '0'), +('16', '36', '15', '10151', '7200', '0'), +('16', '36', '15', '14679', '6255', '0'), +('16', '36', '15', '14678', '5104', '0'), +('16', '36', '20', '11601', '9299', '0'), +('16', '36', '20', '1365', '4200', '0'), +('16', '36', '20', '2742', '3841', '0'), +('16', '36', '20', '2471', '3804', '0'), +('16', '36', '12', '4835', '8286', '0'), +('16', '36', '12', '20655', '5186', '0'), +('16', '36', '12', '11624', '3570', '0'), +('16', '36', '12', '2923', '3404', '0'), +('16', '36', '18', '4836', '4192', '0'), +('16', '36', '18', '2461', '2557', '0'), +('16', '36', '18', '4346', '2276', '0'), +('16', '36', '18', '4412', '2083', '0'), +('16', '36', '19', '4837', '3923', '0'), +('16', '36', '19', '68239', '3223', '0'), +('16', '36', '19', '2337', '1757', '0'), +('16', '36', '19', '3312', '1392', '0'), +('16', '36', '13', '5622', '34542', '0'), +('16', '36', '13', '11609', '34391', '0'), +('16', '36', '13', '5412', '31815', '0'), +('16', '36', '13', '45120', '31608', '0'), +('16', '36', '14', '11551', '12679', '0'), +('16', '36', '14', '14762', '2181', '0'), +('16', '36', '14', '6359', '1753', '0'), +('16', '36', '14', '13355', '1733', '0'), +('16', '36', '11', '14762', '2181', '0'), +('16', '36', '11', '20677', '1800', '0'), +('16', '36', '11', '9246', '604', '0'), +('16', '36', '11', '13748', '454', '0'), +('16', '37', '22', '10323', '0', '0'), +('16', '37', '22', '10664', '0', '0'), +('16', '37', '22', '9246', '0', '0'), +('16', '37', '22', '21509', '0', '0'), +('16', '37', '1', '14701', '3802', '0'), +('16', '37', '1', '14702', '2500', '0'), +('16', '37', '1', '10165', '1683', '0'), +('16', '37', '1', '30361', '1140', '0'), +('16', '37', '2', '4620', '3637', '0'), +('16', '37', '2', '1519', '3207', '0'), +('16', '37', '2', '4831', '3020', '0'), +('16', '37', '2', '10142', '3012', '0'), +('16', '37', '3', '10144', '1304', '0'), +('16', '37', '3', '14706', '990', '0'), +('16', '37', '3', '14705', '990', '0'), +('16', '37', '3', '3314', '785', '0'), +('16', '37', '5', '14703', '5500', '0'), +('16', '37', '5', '14700', '3453', '0'), +('16', '37', '5', '10055', '3255', '0'), +('16', '37', '5', '68291', '2411', '0'), +('16', '37', '8', '11621', '14171', '0'), +('16', '37', '8', '1409', '6312', '0'), +('16', '37', '8', '11551', '5129', '0'), +('16', '37', '8', '2400', '2808', '0'), +('16', '37', '6', '1557', '6760', '0'), +('16', '37', '6', '4302', '2734', '0'), +('16', '37', '6', '25062', '1817', '0'), +('16', '37', '6', '4165', '1812', '0'), +('16', '37', '17', '4832', '8882', '0'), +('16', '37', '17', '4309', '5576', '0'), +('16', '37', '17', '11623', '4979', '0'), +('16', '37', '17', '3307', '3705', '0'), +('16', '37', '7', '4343', '3603', '0'), +('16', '37', '7', '4833', '3567', '0'), +('16', '37', '7', '71303', '2689', '0'), +('16', '37', '7', '2458', '2406', '0'), +('16', '37', '9', '4834', '2625', '0'), +('16', '37', '9', '12189', '2263', '0'), +('16', '37', '9', '10149', '2255', '0'), +('16', '37', '9', '4311', '2248', '0'), +('16', '37', '15', '10366', '8005', '0'), +('16', '37', '15', '10151', '7200', '0'), +('16', '37', '15', '14679', '6255', '0'), +('16', '37', '15', '14678', '5104', '0'), +('16', '37', '20', '11601', '9353', '0'), +('16', '37', '20', '1365', '4200', '0'), +('16', '37', '20', '2742', '3896', '0'), +('16', '37', '20', '2471', '3804', '0'), +('16', '37', '12', '4835', '8313', '0'), +('16', '37', '12', '20655', '5197', '0'), +('16', '37', '12', '11624', '3609', '0'), +('16', '37', '12', '2923', '3404', '0'), +('16', '37', '18', '4836', '4219', '0'), +('16', '37', '18', '2461', '2557', '0'), +('16', '37', '18', '4346', '2276', '0'), +('16', '37', '18', '4412', '2083', '0'), +('16', '37', '19', '4837', '3923', '0'), +('16', '37', '19', '68239', '3223', '0'), +('16', '37', '19', '2337', '1757', '0'), +('16', '37', '19', '3312', '1392', '0'), +('16', '37', '13', '5622', '34845', '0'), +('16', '37', '13', '11609', '34744', '0'), +('16', '37', '13', '45120', '33027', '0'), +('16', '37', '13', '5412', '32118', '0'), +('16', '37', '14', '11551', '12679', '0'), +('16', '37', '14', '14762', '2181', '0'), +('16', '37', '14', '13355', '1788', '0'), +('16', '37', '14', '6359', '1753', '0'), +('16', '37', '11', '14762', '2181', '0'), +('16', '37', '11', '20677', '1800', '0'), +('16', '37', '11', '9246', '604', '0'), +('16', '37', '11', '13748', '454', '0'), +('16', '38', '22', '10323', '0', '0'), +('16', '38', '22', '10664', '0', '0'), +('16', '38', '22', '9246', '0', '0'), +('16', '38', '22', '21509', '0', '0'), +('16', '38', '1', '14701', '3802', '0'), +('16', '38', '1', '14702', '2500', '0'), +('16', '38', '1', '10165', '1683', '0'), +('16', '38', '1', '30361', '1140', '0'), +('16', '38', '2', '4620', '3675', '0'), +('16', '38', '2', '1519', '3207', '0'), +('16', '38', '2', '4831', '3020', '0'), +('16', '38', '2', '10142', '3012', '0'), +('16', '38', '3', '10144', '1304', '0'), +('16', '38', '3', '14706', '990', '0'), +('16', '38', '3', '14705', '990', '0'), +('16', '38', '3', '3314', '785', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '38', '5', '14703', '5500', '0'), +('16', '38', '5', '14700', '3453', '0'), +('16', '38', '5', '10055', '3255', '0'), +('16', '38', '5', '68291', '2411', '0'), +('16', '38', '8', '11621', '14171', '0'), +('16', '38', '8', '1409', '6312', '0'), +('16', '38', '8', '11551', '5129', '0'), +('16', '38', '8', '2400', '2808', '0'), +('16', '38', '6', '1557', '6760', '0'), +('16', '38', '6', '4302', '2766', '0'), +('16', '38', '6', '25062', '1817', '0'), +('16', '38', '6', '4165', '1812', '0'), +('16', '38', '17', '4832', '8963', '0'), +('16', '38', '17', '4309', '5576', '0'), +('16', '38', '17', '11623', '4979', '0'), +('16', '38', '17', '3307', '3727', '0'), +('16', '38', '7', '4343', '3658', '0'), +('16', '38', '7', '4833', '3567', '0'), +('16', '38', '7', '71303', '2689', '0'), +('16', '38', '7', '2458', '2406', '0'), +('16', '38', '9', '4834', '2625', '0'), +('16', '38', '9', '4311', '2286', '0'), +('16', '38', '9', '12189', '2263', '0'), +('16', '38', '9', '10149', '2255', '0'), +('16', '38', '15', '10366', '8005', '0'), +('16', '38', '15', '10151', '7200', '0'), +('16', '38', '15', '14679', '6255', '0'), +('16', '38', '15', '14678', '5104', '0'), +('16', '38', '20', '11601', '9407', '0'), +('16', '38', '20', '1365', '4200', '0'), +('16', '38', '20', '2742', '3950', '0'), +('16', '38', '20', '2471', '3804', '0'), +('16', '38', '12', '4835', '8340', '0'), +('16', '38', '12', '20655', '5208', '0'), +('16', '38', '12', '11624', '3647', '0'), +('16', '38', '12', '2923', '3404', '0'), +('16', '38', '18', '4836', '4246', '0'), +('16', '38', '18', '2461', '2557', '0'), +('16', '38', '18', '4346', '2276', '0'), +('16', '38', '18', '4412', '2083', '0'), +('16', '38', '19', '4837', '3923', '0'), +('16', '38', '19', '68239', '3223', '0'), +('16', '38', '19', '2337', '1757', '0'), +('16', '38', '19', '3312', '1392', '0'), +('16', '38', '13', '5622', '35199', '0'), +('16', '38', '13', '11609', '35098', '0'), +('16', '38', '13', '45120', '34397', '0'), +('16', '38', '13', '5412', '32421', '0'), +('16', '38', '14', '11551', '12679', '0'), +('16', '38', '14', '14762', '2181', '0'), +('16', '38', '14', '13355', '1842', '0'), +('16', '38', '14', '6359', '1753', '0'), +('16', '38', '11', '14762', '2181', '0'), +('16', '38', '11', '20677', '1800', '0'), +('16', '38', '11', '9246', '604', '0'), +('16', '38', '11', '13748', '454', '0'), +('16', '39', '22', '10323', '0', '0'), +('16', '39', '22', '10664', '0', '0'), +('16', '39', '22', '9246', '0', '0'), +('16', '39', '22', '21509', '0', '0'), +('16', '39', '1', '14701', '3802', '0'), +('16', '39', '1', '14702', '2500', '0'), +('16', '39', '1', '10165', '1683', '0'), +('16', '39', '1', '30361', '1140', '0'), +('16', '39', '2', '4620', '3713', '0'), +('16', '39', '2', '1519', '3207', '0'), +('16', '39', '2', '4831', '3020', '0'), +('16', '39', '2', '10142', '3012', '0'), +('16', '39', '3', '10144', '1304', '0'), +('16', '39', '3', '14706', '990', '0'), +('16', '39', '3', '14705', '990', '0'), +('16', '39', '3', '3314', '785', '0'), +('16', '39', '5', '14703', '5500', '0'), +('16', '39', '5', '14700', '3453', '0'), +('16', '39', '5', '10055', '3255', '0'), +('16', '39', '5', '68291', '2411', '0'), +('16', '39', '8', '11621', '14171', '0'), +('16', '39', '8', '1409', '6312', '0'), +('16', '39', '8', '11551', '5129', '0'), +('16', '39', '8', '2400', '2808', '0'), +('16', '39', '6', '1557', '6760', '0'), +('16', '39', '6', '4302', '2799', '0'), +('16', '39', '6', '25062', '1817', '0'), +('16', '39', '6', '4165', '1812', '0'), +('16', '39', '17', '4832', '9045', '0'), +('16', '39', '17', '4309', '5576', '0'), +('16', '39', '17', '11623', '4979', '0'), +('16', '39', '17', '3307', '3748', '0'), +('16', '39', '7', '4343', '3712', '0'), +('16', '39', '7', '4833', '3567', '0'), +('16', '39', '7', '71303', '2689', '0'), +('16', '39', '7', '2458', '2406', '0'), +('16', '39', '9', '4834', '2625', '0'), +('16', '39', '9', '4311', '2324', '0'), +('16', '39', '9', '12189', '2263', '0'), +('16', '39', '9', '10149', '2255', '0'), +('16', '39', '15', '10366', '8005', '0'), +('16', '39', '15', '10151', '7200', '0'), +('16', '39', '15', '14679', '6255', '0'), +('16', '39', '15', '14678', '5104', '0'), +('16', '39', '20', '11601', '9462', '0'), +('16', '39', '20', '1365', '4200', '0'), +('16', '39', '20', '2742', '4005', '0'), +('16', '39', '20', '2471', '3804', '0'), +('16', '39', '12', '4835', '8367', '0'), +('16', '39', '12', '20655', '5219', '0'), +('16', '39', '12', '11624', '3685', '0'), +('16', '39', '12', '2923', '3404', '0'), +('16', '39', '18', '4836', '4273', '0'), +('16', '39', '18', '2461', '2557', '0'), +('16', '39', '18', '4346', '2276', '0'), +('16', '39', '18', '4412', '2083', '0'), +('16', '39', '19', '4837', '3923', '0'), +('16', '39', '19', '68239', '3223', '0'), +('16', '39', '19', '2337', '1757', '0'), +('16', '39', '19', '3312', '1392', '0'), +('16', '39', '13', '5622', '35552', '0'), +('16', '39', '13', '45120', '35465', '0'), +('16', '39', '13', '11609', '35401', '0'), +('16', '39', '13', '5412', '32724', '0'), +('16', '39', '14', '11551', '12679', '0'), +('16', '39', '14', '14762', '2181', '0'), +('16', '39', '14', '13355', '1897', '0'), +('16', '39', '14', '6359', '1753', '0'), +('16', '39', '11', '14762', '2181', '0'), +('16', '39', '11', '20677', '1800', '0'), +('16', '39', '11', '9246', '604', '0'), +('16', '39', '11', '13748', '454', '0'), +('16', '40', '22', '10323', '0', '0'), +('16', '40', '22', '10664', '0', '0'), +('16', '40', '22', '9246', '0', '0'), +('16', '40', '22', '21509', '0', '0'), +('16', '40', '1', '14701', '3802', '0'), +('16', '40', '1', '14702', '2500', '0'), +('16', '40', '1', '10165', '1683', '0'), +('16', '40', '1', '14623', '1171', '0'), +('16', '40', '2', '4620', '3751', '0'), +('16', '40', '2', '1519', '3207', '0'), +('16', '40', '2', '4831', '3020', '0'), +('16', '40', '2', '10142', '3012', '0'), +('16', '40', '3', '10144', '1304', '0'), +('16', '40', '3', '14706', '990', '0'), +('16', '40', '3', '14705', '990', '0'), +('16', '40', '3', '3314', '785', '0'), +('16', '40', '5', '14703', '5500', '0'), +('16', '40', '5', '14700', '3453', '0'), +('16', '40', '5', '10055', '3255', '0'), +('16', '40', '5', '68291', '2411', '0'), +('16', '40', '8', '11621', '14171', '0'), +('16', '40', '8', '1409', '6312', '0'), +('16', '40', '8', '11551', '5129', '0'), +('16', '40', '8', '2400', '2808', '0'), +('16', '40', '6', '1557', '6760', '0'), +('16', '40', '6', '4302', '2832', '0'), +('16', '40', '6', '25062', '1817', '0'), +('16', '40', '6', '4165', '1812', '0'), +('16', '40', '17', '4832', '9126', '0'), +('16', '40', '17', '4309', '5576', '0'), +('16', '40', '17', '11623', '4979', '0'), +('16', '40', '17', '3307', '3770', '0'), +('16', '40', '7', '4343', '3767', '0'), +('16', '40', '7', '4833', '3567', '0'), +('16', '40', '7', '71303', '2689', '0'), +('16', '40', '7', '2458', '2406', '0'), +('16', '40', '9', '4834', '2625', '0'), +('16', '40', '9', '4311', '2362', '0'), +('16', '40', '9', '12189', '2263', '0'), +('16', '40', '9', '10149', '2255', '0'), +('16', '40', '15', '10366', '8005', '0'), +('16', '40', '15', '10151', '7200', '0'), +('16', '40', '15', '14679', '6255', '0'), +('16', '40', '15', '14678', '5104', '0'), +('16', '40', '20', '11601', '9516', '0'), +('16', '40', '20', '1365', '4200', '0'), +('16', '40', '20', '2742', '4059', '0'), +('16', '40', '20', '2471', '3804', '0'), +('16', '40', '12', '4835', '8394', '0'), +('16', '40', '12', '20655', '5229', '0'), +('16', '40', '12', '11624', '3723', '0'), +('16', '40', '12', '2923', '3404', '0'), +('16', '40', '18', '4836', '4300', '0'), +('16', '40', '18', '2461', '2557', '0'), +('16', '40', '18', '4346', '2276', '0'), +('16', '40', '18', '4412', '2083', '0'), +('16', '40', '19', '4837', '3923', '0'), +('16', '40', '19', '68239', '3223', '0'), +('16', '40', '19', '2337', '1757', '0'), +('16', '40', '19', '3312', '1392', '0'), +('16', '40', '13', '45120', '36837', '0'), +('16', '40', '13', '5622', '35855', '0'), +('16', '40', '13', '11609', '35754', '0'), +('16', '40', '13', '5412', '33027', '0'), +('16', '40', '14', '11551', '12679', '0'), +('16', '40', '14', '14762', '2181', '0'), +('16', '40', '14', '13355', '1951', '0'), +('16', '40', '14', '6359', '1753', '0'), +('16', '40', '11', '14762', '2181', '0'), +('16', '40', '11', '20677', '1800', '0'), +('16', '40', '11', '9246', '604', '0'), +('16', '40', '11', '13748', '454', '0'), +('16', '41', '22', '10323', '0', '0'), +('16', '41', '22', '10664', '0', '0'), +('16', '41', '22', '9246', '0', '0'), +('16', '41', '22', '21509', '0', '0'), +('16', '41', '1', '14701', '3802', '0'), +('16', '41', '1', '14702', '2500', '0'), +('16', '41', '1', '10165', '1683', '0'), +('16', '41', '1', '14623', '1203', '0'), +('16', '41', '2', '4620', '3789', '0'), +('16', '41', '2', '1519', '3207', '0'), +('16', '41', '2', '4831', '3020', '0'), +('16', '41', '2', '10142', '3012', '0'), +('16', '41', '3', '10144', '1304', '0'), +('16', '41', '3', '14706', '990', '0'), +('16', '41', '3', '14705', '990', '0'), +('16', '41', '3', '3314', '785', '0'), +('16', '41', '5', '14703', '5500', '0'), +('16', '41', '5', '14700', '3453', '0'), +('16', '41', '5', '10055', '3255', '0'), +('16', '41', '5', '68291', '2411', '0'), +('16', '41', '8', '11621', '14171', '0'), +('16', '41', '8', '1409', '6312', '0'), +('16', '41', '8', '11551', '5129', '0'), +('16', '41', '8', '2400', '2808', '0'), +('16', '41', '6', '1557', '6760', '0'), +('16', '41', '6', '4302', '2864', '0'), +('16', '41', '6', '25062', '1817', '0'), +('16', '41', '6', '4165', '1812', '0'), +('16', '41', '17', '4832', '9208', '0'), +('16', '41', '17', '4309', '5576', '0'), +('16', '41', '17', '11623', '4979', '0'), +('16', '41', '17', '3307', '3792', '0'), +('16', '41', '7', '4343', '3821', '0'), +('16', '41', '7', '4833', '3567', '0'), +('16', '41', '7', '71303', '2689', '0'), +('16', '41', '7', '2458', '2406', '0'), +('16', '41', '9', '4834', '2625', '0'), +('16', '41', '9', '4311', '2400', '0'), +('16', '41', '9', '12189', '2263', '0'), +('16', '41', '9', '10149', '2255', '0'), +('16', '41', '15', '10366', '8005', '0'), +('16', '41', '15', '10151', '7200', '0'), +('16', '41', '15', '14679', '6255', '0'), +('16', '41', '15', '14678', '5104', '0'), +('16', '41', '20', '11601', '9570', '0'), +('16', '41', '20', '1365', '4200', '0'), +('16', '41', '20', '2742', '4113', '0'), +('16', '41', '20', '2471', '3804', '0'), +('16', '41', '12', '4835', '8422', '0'), +('16', '41', '12', '20655', '5240', '0'), +('16', '41', '12', '11624', '3761', '0'), +('16', '41', '12', '2923', '3404', '0'), +('16', '41', '18', '4836', '4328', '0'), +('16', '41', '18', '2461', '2557', '0'), +('16', '41', '18', '4346', '2276', '0'), +('16', '41', '18', '4412', '2083', '0'), +('16', '41', '19', '4837', '3923', '0'), +('16', '41', '19', '68239', '3223', '0'), +('16', '41', '19', '2337', '1757', '0'), +('16', '41', '19', '3312', '1392', '0'), +('16', '41', '13', '45120', '37907', '0'), +('16', '41', '13', '5622', '36209', '0'), +('16', '41', '13', '11609', '36108', '0'), +('16', '41', '13', '5412', '33330', '0'), +('16', '41', '14', '11551', '12679', '0'), +('16', '41', '14', '14762', '2181', '0'), +('16', '41', '14', '13355', '2005', '0'), +('16', '41', '14', '6359', '1753', '0'), +('16', '41', '11', '14762', '2181', '0'), +('16', '41', '11', '20677', '1800', '0'), +('16', '41', '11', '9246', '604', '0'), +('16', '41', '11', '13748', '454', '0'), +('16', '42', '22', '10323', '0', '0'), +('16', '42', '22', '10664', '0', '0'), +('16', '42', '22', '9246', '0', '0'), +('16', '42', '22', '21509', '0', '0'), +('16', '42', '1', '14701', '3802', '0'), +('16', '42', '1', '14702', '2500', '0'), +('16', '42', '1', '10165', '1683', '0'), +('16', '42', '1', '14623', '1236', '0'), +('16', '42', '2', '4620', '3828', '0'), +('16', '42', '2', '1519', '3207', '0'), +('16', '42', '2', '4831', '3020', '0'), +('16', '42', '2', '10142', '3012', '0'), +('16', '42', '3', '10144', '1304', '0'), +('16', '42', '3', '14706', '990', '0'), +('16', '42', '3', '14705', '990', '0'), +('16', '42', '3', '3314', '785', '0'), +('16', '42', '5', '14703', '5500', '0'), +('16', '42', '5', '14700', '3453', '0'), +('16', '42', '5', '10055', '3255', '0'), +('16', '42', '5', '68291', '2411', '0'), +('16', '42', '8', '11621', '14171', '0'), +('16', '42', '8', '1409', '6312', '0'), +('16', '42', '8', '11551', '5129', '0'), +('16', '42', '8', '2400', '2808', '0'), +('16', '42', '6', '1557', '6760', '0'), +('16', '42', '6', '4302', '2897', '0'), +('16', '42', '6', '25062', '1817', '0'), +('16', '42', '6', '4165', '1812', '0'), +('16', '42', '17', '4832', '9290', '0'), +('16', '42', '17', '4309', '5576', '0'), +('16', '42', '17', '11623', '4979', '0'), +('16', '42', '17', '3307', '3814', '0'), +('16', '42', '7', '4343', '3875', '0'), +('16', '42', '7', '4833', '3567', '0'), +('16', '42', '7', '71303', '2689', '0'), +('16', '42', '7', '2458', '2406', '0'), +('16', '42', '9', '4834', '2625', '0'), +('16', '42', '9', '4311', '2438', '0'), +('16', '42', '9', '12189', '2263', '0'), +('16', '42', '9', '10149', '2255', '0'), +('16', '42', '15', '10366', '8005', '0'), +('16', '42', '15', '10151', '7200', '0'), +('16', '42', '15', '14679', '6255', '0'), +('16', '42', '15', '14678', '5104', '0'), +('16', '42', '20', '11601', '9625', '0'), +('16', '42', '20', '1365', '4200', '0'), +('16', '42', '20', '2742', '4168', '0'), +('16', '42', '20', '2471', '3804', '0'), +('16', '42', '12', '4835', '8449', '0'), +('16', '42', '12', '20655', '5251', '0'), +('16', '42', '12', '11624', '3799', '0'), +('16', '42', '12', '2923', '3404', '0'), +('16', '42', '18', '4836', '4355', '0'), +('16', '42', '18', '2461', '2557', '0'), +('16', '42', '18', '4346', '2276', '0'), +('16', '42', '18', '4412', '2083', '0'), +('16', '42', '19', '4837', '3923', '0'), +('16', '42', '19', '68239', '3223', '0'), +('16', '42', '19', '2337', '1757', '0'), +('16', '42', '19', '3312', '1392', '0'), +('16', '42', '13', '45120', '39331', '0'), +('16', '42', '13', '5622', '36562', '0'), +('16', '42', '13', '11609', '36411', '0'), +('16', '42', '13', '5412', '33633', '0'), +('16', '42', '14', '11551', '12679', '0'), +('16', '42', '14', '14762', '2181', '0'), +('16', '42', '14', '13355', '2060', '0'), +('16', '42', '14', '6359', '1753', '0'), +('16', '42', '11', '14762', '2181', '0'), +('16', '42', '11', '20677', '1800', '0'), +('16', '42', '11', '9246', '604', '0'), +('16', '42', '11', '13748', '454', '0'), +('16', '43', '22', '10323', '0', '0'), +('16', '43', '22', '10664', '0', '0'), +('16', '43', '22', '9246', '0', '0'), +('16', '43', '22', '21509', '0', '0'), +('16', '43', '1', '14701', '3802', '0'), +('16', '43', '1', '14702', '2500', '0'), +('16', '43', '1', '10165', '1683', '0'), +('16', '43', '1', '14623', '1268', '0'), +('16', '43', '2', '4620', '3866', '0'), +('16', '43', '2', '1519', '3207', '0'), +('16', '43', '2', '4831', '3020', '0'), +('16', '43', '2', '10142', '3012', '0'), +('16', '43', '3', '10144', '1304', '0'), +('16', '43', '3', '14706', '990', '0'), +('16', '43', '3', '14705', '990', '0'), +('16', '43', '3', '3314', '785', '0'), +('16', '43', '5', '14703', '5500', '0'), +('16', '43', '5', '14700', '3453', '0'), +('16', '43', '5', '10055', '3255', '0'), +('16', '43', '5', '68291', '2411', '0'), +('16', '43', '8', '11621', '14171', '0'), +('16', '43', '8', '1409', '6312', '0'), +('16', '43', '8', '11551', '5129', '0'), +('16', '43', '8', '2400', '2808', '0'), +('16', '43', '6', '1557', '6760', '0'), +('16', '43', '6', '4302', '2929', '0'), +('16', '43', '6', '25062', '1817', '0'), +('16', '43', '6', '4165', '1812', '0'), +('16', '43', '17', '4832', '9371', '0'), +('16', '43', '17', '4309', '5576', '0'), +('16', '43', '17', '11623', '4979', '0'), +('16', '43', '17', '3307', '3835', '0'), +('16', '43', '7', '4343', '3930', '0'), +('16', '43', '7', '4833', '3567', '0'), +('16', '43', '7', '71303', '2689', '0'), +('16', '43', '7', '2458', '2406', '0'), +('16', '43', '9', '4834', '2625', '0'), +('16', '43', '9', '4311', '2476', '0'), +('16', '43', '9', '12189', '2263', '0'), +('16', '43', '9', '10149', '2255', '0'), +('16', '43', '15', '10366', '8005', '0'), +('16', '43', '15', '10151', '7200', '0'), +('16', '43', '15', '14679', '6255', '0'), +('16', '43', '15', '14678', '5104', '0'), +('16', '43', '20', '11601', '9679', '0'), +('16', '43', '20', '2742', '4222', '0'), +('16', '43', '20', '1365', '4200', '0'), +('16', '43', '20', '2471', '3804', '0'), +('16', '43', '12', '4835', '8476', '0'), +('16', '43', '12', '20655', '5262', '0'), +('16', '43', '12', '11624', '3837', '0'), +('16', '43', '12', '2923', '3404', '0'), +('16', '43', '18', '4836', '4382', '0'), +('16', '43', '18', '2461', '2557', '0'), +('16', '43', '18', '4346', '2276', '0'), +('16', '43', '18', '2462', '2084', '0'), +('16', '43', '19', '4837', '3923', '0'), +('16', '43', '19', '68239', '3223', '0'), +('16', '43', '19', '2337', '1757', '0'), +('16', '43', '19', '3312', '1392', '0'), +('16', '43', '13', '45120', '40454', '0'), +('16', '43', '13', '5622', '36865', '0'), +('16', '43', '13', '11609', '36764', '0'), +('16', '43', '13', '5412', '33987', '0'), +('16', '43', '14', '11551', '12679', '0'), +('16', '43', '14', '14762', '2181', '0'), +('16', '43', '14', '13355', '2114', '0'), +('16', '43', '14', '6359', '1753', '0'), +('16', '43', '11', '14762', '2181', '0'), +('16', '43', '11', '20677', '1800', '0'), +('16', '43', '11', '9246', '604', '0'), +('16', '43', '11', '13748', '454', '0'), +('16', '44', '22', '10323', '0', '0'), +('16', '44', '22', '10664', '0', '0'), +('16', '44', '22', '9246', '0', '0'), +('16', '44', '22', '21509', '0', '0'), +('16', '44', '1', '14701', '3802', '0'), +('16', '44', '1', '14702', '2500', '0'), +('16', '44', '1', '10165', '1683', '0'), +('16', '44', '1', '14623', '1305', '0'), +('16', '44', '2', '4620', '3908', '0'), +('16', '44', '2', '1519', '3207', '0'), +('16', '44', '2', '4831', '3020', '0'), +('16', '44', '2', '10142', '3012', '0'), +('16', '44', '3', '10144', '1304', '0'), +('16', '44', '3', '14706', '990', '0'), +('16', '44', '3', '14705', '990', '0'), +('16', '44', '3', '3314', '785', '0'), +('16', '44', '5', '14703', '5500', '0'), +('16', '44', '5', '14700', '3453', '0'), +('16', '44', '5', '10055', '3255', '0'), +('16', '44', '5', '68291', '2411', '0'), +('16', '44', '8', '11621', '14171', '0'), +('16', '44', '8', '1409', '6312', '0'), +('16', '44', '8', '11551', '5129', '0'), +('16', '44', '8', '2400', '2808', '0'), +('16', '44', '6', '1557', '6760', '0'), +('16', '44', '6', '4302', '2966', '0'), +('16', '44', '6', '25062', '1817', '0'), +('16', '44', '6', '4165', '1812', '0'), +('16', '44', '17', '4832', '9462', '0'), +('16', '44', '17', '4309', '5576', '0'), +('16', '44', '17', '11623', '4979', '0'), +('16', '44', '17', '3307', '3860', '0'), +('16', '44', '7', '4343', '3990', '0'), +('16', '44', '7', '4833', '3567', '0'), +('16', '44', '7', '71303', '2689', '0'), +('16', '44', '7', '2458', '2406', '0'), +('16', '44', '9', '4834', '2625', '0'), +('16', '44', '9', '4311', '2519', '0'), +('16', '44', '9', '12189', '2263', '0'), +('16', '44', '9', '10149', '2255', '0'), +('16', '44', '15', '10366', '8005', '0'), +('16', '44', '15', '10151', '7200', '0'), +('16', '44', '15', '14679', '6255', '0'), +('16', '44', '15', '14678', '5104', '0'), +('16', '44', '20', '11601', '9739', '0'), +('16', '44', '20', '2742', '4282', '0'), +('16', '44', '20', '1365', '4200', '0'), +('16', '44', '20', '2471', '3804', '0'), +('16', '44', '12', '4835', '8506', '0'), +('16', '44', '12', '20655', '5274', '0'), +('16', '44', '12', '11624', '3879', '0'), +('16', '44', '12', '2923', '3404', '0'), +('16', '44', '18', '4836', '4412', '0'), +('16', '44', '18', '2461', '2557', '0'), +('16', '44', '18', '4346', '2276', '0'), +('16', '44', '18', '2462', '2126', '0'), +('16', '44', '19', '4837', '3923', '0'), +('16', '44', '19', '68239', '3223', '0'), +('16', '44', '19', '2337', '1757', '0'), +('16', '44', '19', '3312', '1392', '0'), +('16', '44', '13', '45120', '41883', '0'), +('16', '44', '13', '5622', '37219', '0'), +('16', '44', '13', '11609', '37118', '0'), +('16', '44', '13', '5412', '34290', '0'), +('16', '44', '14', '11551', '12679', '0'), +('16', '44', '14', '14762', '2181', '0'), +('16', '44', '14', '13355', '2174', '0'), +('16', '44', '14', '6359', '1753', '0'), +('16', '44', '11', '14762', '2181', '0'), +('16', '44', '11', '20677', '1800', '0'), +('16', '44', '11', '9246', '604', '0'), +('16', '44', '11', '13748', '454', '0'), +('16', '45', '22', '10323', '0', '0'), +('16', '45', '22', '10664', '0', '0'), +('16', '45', '22', '9246', '0', '0'), +('16', '45', '22', '21509', '0', '0'), +('16', '45', '1', '14701', '3802', '0'), +('16', '45', '1', '14702', '2500', '0'), +('16', '45', '1', '10165', '1683', '0'), +('16', '45', '1', '14623', '1337', '0'), +('16', '45', '2', '4620', '3946', '0'), +('16', '45', '2', '1519', '3207', '0'), +('16', '45', '2', '4831', '3020', '0'), +('16', '45', '2', '10142', '3012', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '45', '3', '10144', '1304', '0'), +('16', '45', '3', '14706', '990', '0'), +('16', '45', '3', '14705', '990', '0'), +('16', '45', '3', '3314', '785', '0'), +('16', '45', '5', '14703', '5500', '0'), +('16', '45', '5', '14700', '3453', '0'), +('16', '45', '5', '10055', '3255', '0'), +('16', '45', '5', '68291', '2411', '0'), +('16', '45', '8', '11621', '14171', '0'), +('16', '45', '8', '1409', '6312', '0'), +('16', '45', '8', '11551', '5129', '0'), +('16', '45', '8', '2400', '2808', '0'), +('16', '45', '6', '1557', '6760', '0'), +('16', '45', '6', '4302', '2998', '0'), +('16', '45', '6', '25062', '1817', '0'), +('16', '45', '6', '4165', '1812', '0'), +('16', '45', '17', '4832', '9543', '0'), +('16', '45', '17', '4309', '5576', '0'), +('16', '45', '17', '11623', '4979', '0'), +('16', '45', '17', '3307', '3881', '0'), +('16', '45', '7', '4343', '4044', '0'), +('16', '45', '7', '4833', '3567', '0'), +('16', '45', '7', '71303', '2689', '0'), +('16', '45', '7', '2458', '2406', '0'), +('16', '45', '9', '4834', '2625', '0'), +('16', '45', '9', '4311', '2557', '0'), +('16', '45', '9', '12189', '2263', '0'), +('16', '45', '9', '10149', '2255', '0'), +('16', '45', '15', '10366', '8005', '0'), +('16', '45', '15', '10151', '7200', '0'), +('16', '45', '15', '14679', '6255', '0'), +('16', '45', '15', '14678', '5104', '0'), +('16', '45', '20', '11601', '9794', '0'), +('16', '45', '20', '2742', '4337', '0'), +('16', '45', '20', '1365', '4200', '0'), +('16', '45', '20', '2471', '3804', '0'), +('16', '45', '12', '4835', '8533', '0'), +('16', '45', '12', '20655', '5285', '0'), +('16', '45', '12', '11624', '3917', '0'), +('16', '45', '12', '2923', '3404', '0'), +('16', '45', '18', '4836', '4439', '0'), +('16', '45', '18', '2461', '2557', '0'), +('16', '45', '18', '4346', '2276', '0'), +('16', '45', '18', '2462', '2164', '0'), +('16', '45', '19', '4837', '3923', '0'), +('16', '45', '19', '68239', '3223', '0'), +('16', '45', '19', '2337', '1757', '0'), +('16', '45', '19', '3312', '1392', '0'), +('16', '45', '13', '45120', '43058', '0'), +('16', '45', '13', '5622', '37572', '0'), +('16', '45', '13', '11609', '37421', '0'), +('16', '45', '13', '5412', '34593', '0'), +('16', '45', '14', '11551', '12679', '0'), +('16', '45', '14', '13355', '2229', '0'), +('16', '45', '14', '14762', '2181', '0'), +('16', '45', '14', '6359', '1753', '0'), +('16', '45', '11', '14762', '2181', '0'), +('16', '45', '11', '20677', '1800', '0'), +('16', '45', '11', '9246', '604', '0'), +('16', '45', '11', '13748', '454', '0'), +('16', '46', '22', '10323', '0', '0'), +('16', '46', '22', '10664', '0', '0'), +('16', '46', '22', '9246', '0', '0'), +('16', '46', '22', '21509', '0', '0'), +('16', '46', '1', '14701', '3802', '0'), +('16', '46', '1', '14702', '2500', '0'), +('16', '46', '1', '10165', '1683', '0'), +('16', '46', '1', '14623', '1370', '0'), +('16', '46', '2', '4620', '3984', '0'), +('16', '46', '2', '1519', '3207', '0'), +('16', '46', '2', '4831', '3020', '0'), +('16', '46', '2', '10142', '3012', '0'), +('16', '46', '3', '10144', '1304', '0'), +('16', '46', '3', '14706', '990', '0'), +('16', '46', '3', '14705', '990', '0'), +('16', '46', '3', '3314', '785', '0'), +('16', '46', '5', '14703', '5500', '0'), +('16', '46', '5', '14700', '3453', '0'), +('16', '46', '5', '10055', '3255', '0'), +('16', '46', '5', '68291', '2411', '0'), +('16', '46', '8', '11621', '14171', '0'), +('16', '46', '8', '1409', '6312', '0'), +('16', '46', '8', '11551', '5129', '0'), +('16', '46', '8', '2400', '2808', '0'), +('16', '46', '6', '1557', '6760', '0'), +('16', '46', '6', '4302', '3031', '0'), +('16', '46', '6', '25062', '1817', '0'), +('16', '46', '6', '4165', '1812', '0'), +('16', '46', '17', '4832', '9625', '0'), +('16', '46', '17', '4309', '5576', '0'), +('16', '46', '17', '11623', '4979', '0'), +('16', '46', '17', '3307', '3903', '0'), +('16', '46', '7', '4343', '4099', '0'), +('16', '46', '7', '4833', '3567', '0'), +('16', '46', '7', '71303', '2689', '0'), +('16', '46', '7', '2458', '2406', '0'), +('16', '46', '9', '4834', '2625', '0'), +('16', '46', '9', '4311', '2595', '0'), +('16', '46', '9', '12189', '2263', '0'), +('16', '46', '9', '10149', '2255', '0'), +('16', '46', '15', '10366', '8005', '0'), +('16', '46', '15', '10151', '7200', '0'), +('16', '46', '15', '14679', '6255', '0'), +('16', '46', '15', '14678', '5104', '0'), +('16', '46', '20', '11601', '9848', '0'), +('16', '46', '20', '2742', '4391', '0'), +('16', '46', '20', '1365', '4200', '0'), +('16', '46', '20', '2471', '3804', '0'), +('16', '46', '12', '4835', '8561', '0'), +('16', '46', '12', '20655', '5296', '0'), +('16', '46', '12', '11624', '3955', '0'), +('16', '46', '12', '2923', '3404', '0'), +('16', '46', '18', '4836', '4467', '0'), +('16', '46', '18', '2461', '2557', '0'), +('16', '46', '18', '4346', '2276', '0'), +('16', '46', '18', '2462', '2202', '0'), +('16', '46', '19', '4837', '3923', '0'), +('16', '46', '19', '68239', '3223', '0'), +('16', '46', '19', '2337', '1757', '0'), +('16', '46', '19', '3312', '1392', '0'), +('16', '46', '13', '45120', '47769', '0'), +('16', '46', '13', '5622', '40501', '0'), +('16', '46', '13', '11609', '40350', '0'), +('16', '46', '13', '5412', '37269', '0'), +('16', '46', '14', '11551', '12679', '0'), +('16', '46', '14', '13355', '2283', '0'), +('16', '46', '14', '14762', '2181', '0'), +('16', '46', '14', '6359', '1753', '0'), +('16', '46', '11', '14762', '2181', '0'), +('16', '46', '11', '20677', '1800', '0'), +('16', '46', '11', '9246', '604', '0'), +('16', '46', '11', '13748', '454', '0'), +('16', '47', '22', '10323', '0', '0'), +('16', '47', '22', '10664', '0', '0'), +('16', '47', '22', '9246', '0', '0'), +('16', '47', '22', '21509', '0', '0'), +('16', '47', '1', '14701', '3802', '0'), +('16', '47', '1', '14702', '2500', '0'), +('16', '47', '1', '10165', '1683', '0'), +('16', '47', '1', '14623', '1406', '0'), +('16', '47', '2', '4620', '4026', '0'), +('16', '47', '2', '1519', '3207', '0'), +('16', '47', '2', '4831', '3020', '0'), +('16', '47', '2', '10142', '3012', '0'), +('16', '47', '3', '10144', '1304', '0'), +('16', '47', '3', '14706', '990', '0'), +('16', '47', '3', '14705', '990', '0'), +('16', '47', '3', '3314', '785', '0'), +('16', '47', '5', '14703', '5500', '0'), +('16', '47', '5', '14700', '3453', '0'), +('16', '47', '5', '10055', '3255', '0'), +('16', '47', '5', '68291', '2411', '0'), +('16', '47', '8', '11621', '14171', '0'), +('16', '47', '8', '1409', '6312', '0'), +('16', '47', '8', '11551', '5129', '0'), +('16', '47', '8', '2400', '2808', '0'), +('16', '47', '6', '1557', '6760', '0'), +('16', '47', '6', '4302', '3067', '0'), +('16', '47', '6', '25062', '1817', '0'), +('16', '47', '6', '4165', '1812', '0'), +('16', '47', '17', '4832', '9715', '0'), +('16', '47', '17', '4309', '5576', '0'), +('16', '47', '17', '11623', '4979', '0'), +('16', '47', '17', '3307', '3927', '0'), +('16', '47', '7', '4343', '4159', '0'), +('16', '47', '7', '4833', '3567', '0'), +('16', '47', '7', '71303', '2689', '0'), +('16', '47', '7', '2458', '2406', '0'), +('16', '47', '9', '4311', '2637', '0'), +('16', '47', '9', '4834', '2625', '0'), +('16', '47', '9', '12189', '2263', '0'), +('16', '47', '9', '10149', '2255', '0'), +('16', '47', '15', '10366', '8005', '0'), +('16', '47', '15', '10151', '7200', '0'), +('16', '47', '15', '14679', '6255', '0'), +('16', '47', '15', '14678', '5104', '0'), +('16', '47', '20', '11601', '9909', '0'), +('16', '47', '20', '2742', '4451', '0'), +('16', '47', '20', '1365', '4200', '0'), +('16', '47', '20', '2471', '3804', '0'), +('16', '47', '12', '4835', '8591', '0'), +('16', '47', '12', '20655', '5308', '0'), +('16', '47', '12', '11624', '3997', '0'), +('16', '47', '12', '2923', '3404', '0'), +('16', '47', '18', '4836', '4497', '0'), +('16', '47', '18', '2461', '2557', '0'), +('16', '47', '18', '4346', '2276', '0'), +('16', '47', '18', '2462', '2244', '0'), +('16', '47', '19', '4837', '3923', '0'), +('16', '47', '19', '68239', '3223', '0'), +('16', '47', '19', '2337', '1757', '0'), +('16', '47', '19', '3312', '1392', '0'), +('16', '47', '13', '45120', '50009', '0'), +('16', '47', '13', '5622', '41663', '0'), +('16', '47', '13', '11609', '41511', '0'), +('16', '47', '13', '5412', '38380', '0'), +('16', '47', '14', '11551', '12679', '0'), +('16', '47', '14', '13355', '2344', '0'), +('16', '47', '14', '14762', '2181', '0'), +('16', '47', '14', '6359', '1753', '0'), +('16', '47', '11', '14762', '2181', '0'), +('16', '47', '11', '20677', '1800', '0'), +('16', '47', '11', '9246', '604', '0'), +('16', '47', '11', '13748', '454', '0'), +('16', '48', '22', '10323', '0', '0'), +('16', '48', '22', '10664', '0', '0'), +('16', '48', '22', '9246', '0', '0'), +('16', '48', '22', '21509', '0', '0'), +('16', '48', '1', '14701', '3802', '0'), +('16', '48', '1', '14702', '2500', '0'), +('16', '48', '1', '10165', '1683', '0'), +('16', '48', '1', '14623', '1439', '0'), +('16', '48', '2', '4620', '4064', '0'), +('16', '48', '2', '1519', '3207', '0'), +('16', '48', '2', '4831', '3020', '0'), +('16', '48', '2', '10142', '3012', '0'), +('16', '48', '3', '10144', '1304', '0'), +('16', '48', '3', '14706', '990', '0'), +('16', '48', '3', '14705', '990', '0'), +('16', '48', '3', '3314', '785', '0'), +('16', '48', '5', '14703', '5500', '0'), +('16', '48', '5', '14700', '3453', '0'), +('16', '48', '5', '10055', '3255', '0'), +('16', '48', '5', '68291', '2411', '0'), +('16', '48', '8', '11621', '14171', '0'), +('16', '48', '8', '1409', '6312', '0'), +('16', '48', '8', '11551', '5129', '0'), +('16', '48', '8', '2400', '2808', '0'), +('16', '48', '6', '1557', '6760', '0'), +('16', '48', '6', '4302', '3100', '0'), +('16', '48', '6', '25062', '1817', '0'), +('16', '48', '6', '4165', '1812', '0'), +('16', '48', '17', '4832', '9797', '0'), +('16', '48', '17', '4309', '5576', '0'), +('16', '48', '17', '11623', '4979', '0'), +('16', '48', '17', '3307', '3949', '0'), +('16', '48', '7', '4343', '4214', '0'), +('16', '48', '7', '4833', '3567', '0'), +('16', '48', '7', '71303', '2689', '0'), +('16', '48', '7', '2458', '2406', '0'), +('16', '48', '9', '4311', '2675', '0'), +('16', '48', '9', '4834', '2625', '0'), +('16', '48', '9', '12189', '2263', '0'), +('16', '48', '9', '10149', '2255', '0'), +('16', '48', '15', '10366', '8005', '0'), +('16', '48', '15', '10151', '7200', '0'), +('16', '48', '15', '14679', '6255', '0'), +('16', '48', '15', '14678', '5104', '0'), +('16', '48', '20', '11601', '9963', '0'), +('16', '48', '20', '2742', '4506', '0'), +('16', '48', '20', '1365', '4200', '0'), +('16', '48', '20', '2471', '3804', '0'), +('16', '48', '12', '4835', '8618', '0'), +('16', '48', '12', '20655', '5319', '0'), +('16', '48', '12', '11624', '4036', '0'), +('16', '48', '12', '2923', '3404', '0'), +('16', '48', '18', '4836', '4524', '0'), +('16', '48', '18', '2461', '2557', '0'), +('16', '48', '18', '2462', '2283', '0'), +('16', '48', '18', '4346', '2276', '0'), +('16', '48', '19', '4837', '3923', '0'), +('16', '48', '19', '68239', '3223', '0'), +('16', '48', '19', '2337', '1757', '0'), +('16', '48', '19', '3312', '1392', '0'), +('16', '48', '13', '45120', '52601', '0'), +('16', '48', '13', '5622', '42875', '0'), +('16', '48', '13', '11609', '42723', '0'), +('16', '48', '13', '5412', '39491', '0'), +('16', '48', '14', '11551', '12679', '0'), +('16', '48', '14', '13355', '2398', '0'), +('16', '48', '14', '14762', '2181', '0'), +('16', '48', '14', '6359', '1753', '0'), +('16', '48', '11', '14762', '2181', '0'), +('16', '48', '11', '20677', '1800', '0'), +('16', '48', '11', '9246', '604', '0'), +('16', '48', '11', '13748', '454', '0'), +('16', '49', '22', '10323', '0', '0'), +('16', '49', '22', '10664', '0', '0'), +('16', '49', '22', '9246', '0', '0'), +('16', '49', '22', '21509', '0', '0'), +('16', '49', '1', '14701', '3802', '0'), +('16', '49', '1', '14702', '2500', '0'), +('16', '49', '1', '10165', '1683', '0'), +('16', '49', '1', '14623', '1475', '0'), +('16', '49', '2', '4620', '4107', '0'), +('16', '49', '2', '1519', '3207', '0'), +('16', '49', '2', '4831', '3020', '0'), +('16', '49', '2', '10142', '3012', '0'), +('16', '49', '3', '10144', '1304', '0'), +('16', '49', '3', '14705', '990', '0'), +('16', '49', '3', '14706', '990', '0'), +('16', '49', '3', '1411', '794', '0'), +('16', '49', '5', '14703', '5500', '0'), +('16', '49', '5', '14700', '3453', '0'), +('16', '49', '5', '10055', '3255', '0'), +('16', '49', '5', '68291', '2411', '0'), +('16', '49', '8', '11621', '14171', '0'), +('16', '49', '8', '1409', '6312', '0'), +('16', '49', '8', '11551', '5129', '0'), +('16', '49', '8', '2400', '2808', '0'), +('16', '49', '6', '1557', '6760', '0'), +('16', '49', '6', '4302', '3136', '0'), +('16', '49', '6', '25062', '1817', '0'), +('16', '49', '6', '4165', '1812', '0'), +('16', '49', '17', '4832', '9887', '0'), +('16', '49', '17', '4309', '5576', '0'), +('16', '49', '17', '11623', '4979', '0'), +('16', '49', '17', '3307', '3973', '0'), +('16', '49', '7', '4343', '4274', '0'), +('16', '49', '7', '4833', '3567', '0'), +('16', '49', '7', '71303', '2689', '0'), +('16', '49', '7', '2458', '2406', '0'), +('16', '49', '9', '4311', '2717', '0'), +('16', '49', '9', '4834', '2625', '0'), +('16', '49', '9', '12189', '2263', '0'), +('16', '49', '9', '10149', '2255', '0'), +('16', '49', '15', '10366', '8005', '0'), +('16', '49', '15', '10151', '7200', '0'), +('16', '49', '15', '14679', '6255', '0'), +('16', '49', '15', '14678', '5104', '0'), +('16', '49', '20', '11601', '10023', '0'), +('16', '49', '20', '2742', '4566', '0'), +('16', '49', '20', '1365', '4200', '0'), +('16', '49', '20', '2471', '3804', '0'), +('16', '49', '12', '4835', '8648', '0'), +('16', '49', '12', '20655', '5331', '0'), +('16', '49', '12', '11624', '4078', '0'), +('16', '49', '12', '2923', '3404', '0'), +('16', '49', '18', '4836', '4554', '0'), +('16', '49', '18', '2461', '2557', '0'), +('16', '49', '18', '2462', '2325', '0'), +('16', '49', '18', '4346', '2276', '0'), +('16', '49', '19', '4837', '3923', '0'), +('16', '49', '19', '68239', '3223', '0'), +('16', '49', '19', '2337', '1757', '0'), +('16', '49', '19', '3312', '1392', '0'), +('16', '49', '13', '45120', '54944', '0'), +('16', '49', '13', '5622', '44036', '0'), +('16', '49', '13', '11609', '43885', '0'), +('16', '49', '13', '5412', '40552', '0'), +('16', '49', '14', '11551', '12679', '0'), +('16', '49', '14', '13355', '2458', '0'), +('16', '49', '14', '14762', '2181', '0'), +('16', '49', '14', '6359', '1753', '0'), +('16', '49', '11', '14762', '2181', '0'), +('16', '49', '11', '20677', '1800', '0'), +('16', '49', '11', '9246', '604', '0'), +('16', '49', '11', '13748', '454', '0'), +('16', '50', '22', '10323', '0', '0'), +('16', '50', '22', '10664', '0', '0'), +('16', '50', '22', '9246', '0', '0'), +('16', '50', '22', '21509', '0', '0'), +('16', '50', '1', '14701', '3802', '0'), +('16', '50', '1', '14702', '2500', '0'), +('16', '50', '1', '10165', '1683', '0'), +('16', '50', '1', '14623', '1511', '0'), +('16', '50', '2', '4620', '4149', '0'), +('16', '50', '2', '1519', '3207', '0'), +('16', '50', '2', '4831', '3020', '0'), +('16', '50', '2', '10142', '3012', '0'), +('16', '50', '3', '10144', '1304', '0'), +('16', '50', '3', '14705', '990', '0'), +('16', '50', '3', '14706', '990', '0'), +('16', '50', '3', '1411', '806', '0'), +('16', '50', '5', '14703', '5500', '0'), +('16', '50', '5', '14700', '3453', '0'), +('16', '50', '5', '10055', '3255', '0'), +('16', '50', '5', '68291', '2411', '0'), +('16', '50', '8', '11621', '14171', '0'), +('16', '50', '8', '1409', '6312', '0'), +('16', '50', '8', '11551', '5129', '0'), +('16', '50', '8', '2400', '2808', '0'), +('16', '50', '6', '1557', '6760', '0'), +('16', '50', '6', '4302', '3172', '0'), +('16', '50', '6', '25062', '1817', '0'), +('16', '50', '6', '4165', '1812', '0'), +('16', '50', '17', '4832', '9978', '0'), +('16', '50', '17', '4309', '5576', '0'), +('16', '50', '17', '11623', '4979', '0'), +('16', '50', '17', '3307', '3997', '0'), +('16', '50', '7', '4343', '4334', '0'), +('16', '50', '7', '4833', '3567', '0'), +('16', '50', '7', '71303', '2689', '0'), +('16', '50', '7', '2458', '2406', '0'), +('16', '50', '9', '4311', '2760', '0'), +('16', '50', '9', '4834', '2625', '0'), +('16', '50', '9', '12189', '2263', '0'), +('16', '50', '9', '10149', '2255', '0'), +('16', '50', '15', '10366', '8005', '0'), +('16', '50', '15', '10151', '7200', '0'), +('16', '50', '15', '14679', '6255', '0'), +('16', '50', '15', '14678', '5104', '0'), +('16', '50', '20', '11601', '10084', '0'), +('16', '50', '20', '2742', '4627', '0'), +('16', '50', '20', '1365', '4200', '0'), +('16', '50', '20', '2471', '3804', '0'), +('16', '50', '12', '4835', '8678', '0'), +('16', '50', '12', '20655', '5343', '0'), +('16', '50', '12', '11624', '4120', '0'), +('16', '50', '12', '2923', '3404', '0'), +('16', '50', '18', '4836', '4584', '0'), +('16', '50', '18', '2461', '2557', '0'), +('16', '50', '18', '2462', '2367', '0'), +('16', '50', '18', '4346', '2276', '0'), +('16', '50', '19', '4837', '3923', '0'), +('16', '50', '19', '68239', '3223', '0'), +('16', '50', '19', '2337', '1757', '0'), +('16', '50', '19', '3312', '1392', '0'), +('16', '50', '13', '45120', '57692', '0'), +('16', '50', '13', '5622', '45248', '0'), +('16', '50', '13', '11609', '45097', '0'), +('16', '50', '13', '5412', '41663', '0'), +('16', '50', '14', '11551', '12679', '0'), +('16', '50', '14', '13355', '2519', '0'), +('16', '50', '14', '14762', '2181', '0'), +('16', '50', '14', '6359', '1753', '0'), +('16', '50', '11', '14762', '2181', '0'), +('16', '50', '11', '20677', '1800', '0'), +('16', '50', '11', '9246', '604', '0'), +('16', '50', '11', '13748', '454', '0'), +('16', '51', '22', '10323', '0', '0'), +('16', '51', '22', '10664', '0', '0'), +('16', '51', '22', '9246', '0', '0'), +('16', '51', '22', '21509', '0', '0'), +('16', '51', '1', '27822', '4565', '0'), +('16', '51', '1', '14701', '3802', '0'), +('16', '51', '1', '14702', '2500', '0'), +('16', '51', '1', '10165', '1683', '0'), +('16', '51', '2', '4620', '4187', '0'), +('16', '51', '2', '1519', '3207', '0'), +('16', '51', '2', '4831', '3020', '0'), +('16', '51', '2', '10142', '3012', '0'), +('16', '51', '3', '10144', '1304', '0'), +('16', '51', '3', '14705', '990', '0'), +('16', '51', '3', '14706', '990', '0'), +('16', '51', '3', '1411', '817', '0'), +('16', '51', '5', '14703', '5500', '0'), +('16', '51', '5', '14700', '3453', '0'), +('16', '51', '5', '10055', '3255', '0'), +('16', '51', '5', '68291', '2411', '0'), +('16', '51', '8', '11621', '14171', '0'), +('16', '51', '8', '1409', '6312', '0'), +('16', '51', '8', '11551', '5129', '0'), +('16', '51', '8', '2400', '2808', '0'), +('16', '51', '6', '1557', '6760', '0'), +('16', '51', '6', '4302', '3205', '0'), +('16', '51', '6', '25062', '1817', '0'), +('16', '51', '6', '4165', '1812', '0'), +('16', '51', '17', '4832', '10060', '0'), +('16', '51', '17', '4309', '5576', '0'), +('16', '51', '17', '11623', '4979', '0'), +('16', '51', '17', '3307', '4019', '0'), +('16', '51', '7', '4343', '4389', '0'), +('16', '51', '7', '4833', '3567', '0'), +('16', '51', '7', '71303', '2689', '0'), +('16', '51', '7', '2458', '2406', '0'), +('16', '51', '9', '4311', '2798', '0'), +('16', '51', '9', '4834', '2625', '0'), +('16', '51', '9', '12189', '2263', '0'), +('16', '51', '9', '10149', '2255', '0'), +('16', '51', '15', '10366', '8005', '0'), +('16', '51', '15', '10151', '7200', '0'), +('16', '51', '15', '14679', '6255', '0'), +('16', '51', '15', '14678', '5104', '0'), +('16', '51', '20', '11601', '10138', '0'), +('16', '51', '20', '2742', '4681', '0'), +('16', '51', '20', '1365', '4200', '0'), +('16', '51', '20', '2471', '3804', '0'), +('16', '51', '12', '4835', '8706', '0'), +('16', '51', '12', '20655', '5354', '0'), +('16', '51', '12', '11624', '4158', '0'), +('16', '51', '12', '2923', '3404', '0'), +('16', '51', '18', '4836', '4612', '0'), +('16', '51', '18', '2461', '2557', '0'), +('16', '51', '18', '2462', '2405', '0'), +('16', '51', '18', '4346', '2276', '0'), +('16', '51', '19', '4837', '3923', '0'), +('16', '51', '19', '68239', '3223', '0'), +('16', '51', '19', '2337', '1757', '0'), +('16', '51', '19', '3312', '1392', '0'), +('16', '51', '13', '27961', '80449', '0'), +('16', '51', '13', '45120', '60136', '0'), +('16', '51', '13', '5622', '46460', '0'), +('16', '51', '13', '11609', '46309', '0'), +('16', '51', '14', '11551', '12679', '0'), +('16', '51', '14', '13355', '2573', '0'), +('16', '51', '14', '14762', '2181', '0'), +('16', '51', '14', '6359', '1753', '0'), +('16', '51', '11', '14762', '2181', '0'), +('16', '51', '11', '20677', '1800', '0'), +('16', '51', '11', '9246', '604', '0'), +('16', '51', '11', '13748', '454', '0'), +('16', '52', '22', '10323', '0', '0'), +('16', '52', '22', '10664', '0', '0'), +('16', '52', '22', '9246', '0', '0'), +('16', '52', '22', '21509', '0', '0'), +('16', '52', '1', '27822', '4565', '0'), +('16', '52', '1', '14701', '3802', '0'), +('16', '52', '1', '14702', '2500', '0'), +('16', '52', '1', '10165', '1683', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '52', '2', '4620', '4229', '0'), +('16', '52', '2', '1519', '3207', '0'), +('16', '52', '2', '4831', '3020', '0'), +('16', '52', '2', '10142', '3012', '0'), +('16', '52', '3', '10144', '1304', '0'), +('16', '52', '3', '14705', '990', '0'), +('16', '52', '3', '14706', '990', '0'), +('16', '52', '3', '1411', '829', '0'), +('16', '52', '5', '14703', '5500', '0'), +('16', '52', '5', '14700', '3453', '0'), +('16', '52', '5', '10055', '3255', '0'), +('16', '52', '5', '68291', '2411', '0'), +('16', '52', '8', '11621', '14171', '0'), +('16', '52', '8', '1409', '6312', '0'), +('16', '52', '8', '11551', '5129', '0'), +('16', '52', '8', '2400', '2808', '0'), +('16', '52', '6', '1557', '6760', '0'), +('16', '52', '6', '4302', '3241', '0'), +('16', '52', '6', '25062', '1817', '0'), +('16', '52', '6', '4165', '1812', '0'), +('16', '52', '17', '4832', '10150', '0'), +('16', '52', '17', '4309', '5576', '0'), +('16', '52', '17', '11623', '4979', '0'), +('16', '52', '17', '3307', '4043', '0'), +('16', '52', '7', '4343', '4449', '0'), +('16', '52', '7', '4833', '3567', '0'), +('16', '52', '7', '71303', '2689', '0'), +('16', '52', '7', '2458', '2406', '0'), +('16', '52', '9', '4311', '2840', '0'), +('16', '52', '9', '4834', '2625', '0'), +('16', '52', '9', '12189', '2263', '0'), +('16', '52', '9', '10149', '2255', '0'), +('16', '52', '15', '10366', '8005', '0'), +('16', '52', '15', '10151', '7200', '0'), +('16', '52', '15', '14679', '6255', '0'), +('16', '52', '15', '14678', '5104', '0'), +('16', '52', '20', '11601', '10198', '0'), +('16', '52', '20', '2742', '4741', '0'), +('16', '52', '20', '1365', '4200', '0'), +('16', '52', '20', '2471', '3804', '0'), +('16', '52', '12', '4835', '8736', '0'), +('16', '52', '12', '20655', '5366', '0'), +('16', '52', '12', '11624', '4200', '0'), +('16', '52', '12', '2923', '3404', '0'), +('16', '52', '18', '4836', '4642', '0'), +('16', '52', '18', '2461', '2557', '0'), +('16', '52', '18', '2462', '2447', '0'), +('16', '52', '18', '4346', '2276', '0'), +('16', '52', '19', '4837', '3923', '0'), +('16', '52', '19', '68239', '3223', '0'), +('16', '52', '19', '2337', '1757', '0'), +('16', '52', '19', '3312', '1392', '0'), +('16', '52', '13', '27961', '82499', '0'), +('16', '52', '13', '45120', '63038', '0'), +('16', '52', '13', '5622', '47622', '0'), +('16', '52', '13', '11609', '47470', '0'), +('16', '52', '14', '11551', '12679', '0'), +('16', '52', '14', '13355', '2633', '0'), +('16', '52', '14', '14762', '2181', '0'), +('16', '52', '14', '6359', '1753', '0'), +('16', '52', '11', '14762', '2181', '0'), +('16', '52', '11', '20677', '1800', '0'), +('16', '52', '11', '9246', '604', '0'), +('16', '52', '11', '13748', '454', '0'), +('16', '53', '22', '10323', '0', '0'), +('16', '53', '22', '10664', '0', '0'), +('16', '53', '22', '9246', '0', '0'), +('16', '53', '22', '21509', '0', '0'), +('16', '53', '1', '27822', '4565', '0'), +('16', '53', '1', '14701', '3802', '0'), +('16', '53', '1', '14702', '2500', '0'), +('16', '53', '1', '10165', '1683', '0'), +('16', '53', '2', '4620', '4271', '0'), +('16', '53', '2', '1519', '3207', '0'), +('16', '53', '2', '4831', '3020', '0'), +('16', '53', '2', '10142', '3012', '0'), +('16', '53', '3', '10144', '1304', '0'), +('16', '53', '3', '14705', '990', '0'), +('16', '53', '3', '14706', '990', '0'), +('16', '53', '3', '1411', '841', '0'), +('16', '53', '5', '14703', '5500', '0'), +('16', '53', '5', '14700', '3453', '0'), +('16', '53', '5', '10055', '3255', '0'), +('16', '53', '5', '14670', '2428', '0'), +('16', '53', '8', '11621', '14171', '0'), +('16', '53', '8', '1409', '6312', '0'), +('16', '53', '8', '11551', '5129', '0'), +('16', '53', '8', '2400', '2808', '0'), +('16', '53', '6', '1557', '6760', '0'), +('16', '53', '6', '4302', '3277', '0'), +('16', '53', '6', '25062', '1817', '0'), +('16', '53', '6', '4165', '1812', '0'), +('16', '53', '17', '4832', '10241', '0'), +('16', '53', '17', '4309', '5576', '0'), +('16', '53', '17', '11623', '4979', '0'), +('16', '53', '17', '3307', '4067', '0'), +('16', '53', '7', '4343', '4509', '0'), +('16', '53', '7', '4833', '3567', '0'), +('16', '53', '7', '71303', '2689', '0'), +('16', '53', '7', '2342', '2412', '0'), +('16', '53', '9', '4311', '2882', '0'), +('16', '53', '9', '4834', '2625', '0'), +('16', '53', '9', '12189', '2263', '0'), +('16', '53', '9', '10149', '2255', '0'), +('16', '53', '15', '10366', '8005', '0'), +('16', '53', '15', '10151', '7200', '0'), +('16', '53', '15', '14679', '6255', '0'), +('16', '53', '15', '14678', '5104', '0'), +('16', '53', '20', '11601', '10259', '0'), +('16', '53', '20', '2742', '4802', '0'), +('16', '53', '20', '1365', '4200', '0'), +('16', '53', '20', '2471', '3804', '0'), +('16', '53', '12', '4835', '8766', '0'), +('16', '53', '12', '20655', '5378', '0'), +('16', '53', '12', '11624', '4243', '0'), +('16', '53', '12', '2923', '3404', '0'), +('16', '53', '18', '4836', '4672', '0'), +('16', '53', '18', '2461', '2557', '0'), +('16', '53', '18', '2462', '2490', '0'), +('16', '53', '18', '4346', '2276', '0'), +('16', '53', '19', '4837', '3923', '0'), +('16', '53', '19', '68239', '3223', '0'), +('16', '53', '19', '2337', '1757', '0'), +('16', '53', '19', '3312', '1392', '0'), +('16', '53', '13', '27961', '84549', '0'), +('16', '53', '13', '45120', '65587', '0'), +('16', '53', '13', '5622', '48834', '0'), +('16', '53', '13', '11609', '48682', '0'), +('16', '53', '14', '11551', '12679', '0'), +('16', '53', '14', '13355', '2694', '0'), +('16', '53', '14', '14762', '2181', '0'), +('16', '53', '14', '6359', '1753', '0'), +('16', '53', '11', '14762', '2181', '0'), +('16', '53', '11', '20677', '1800', '0'), +('16', '53', '11', '9246', '604', '0'), +('16', '53', '11', '13748', '454', '0'), +('16', '54', '22', '10323', '0', '0'), +('16', '54', '22', '10664', '0', '0'), +('16', '54', '22', '9246', '0', '0'), +('16', '54', '22', '21509', '0', '0'), +('16', '54', '1', '27822', '4565', '0'), +('16', '54', '1', '14701', '3802', '0'), +('16', '54', '1', '14702', '2500', '0'), +('16', '54', '1', '10165', '1683', '0'), +('16', '54', '2', '4620', '4314', '0'), +('16', '54', '2', '1519', '3207', '0'), +('16', '54', '2', '4831', '3020', '0'), +('16', '54', '2', '10142', '3012', '0'), +('16', '54', '3', '10144', '1304', '0'), +('16', '54', '3', '14705', '990', '0'), +('16', '54', '3', '14706', '990', '0'), +('16', '54', '3', '1411', '853', '0'), +('16', '54', '5', '14703', '5500', '0'), +('16', '54', '5', '14700', '3453', '0'), +('16', '54', '5', '10055', '3255', '0'), +('16', '54', '5', '14670', '2482', '0'), +('16', '54', '8', '11621', '14171', '0'), +('16', '54', '8', '1409', '6312', '0'), +('16', '54', '8', '11551', '5129', '0'), +('16', '54', '8', '2400', '2808', '0'), +('16', '54', '6', '1557', '6760', '0'), +('16', '54', '6', '4302', '3314', '0'), +('16', '54', '6', '25062', '1817', '0'), +('16', '54', '6', '4165', '1812', '0'), +('16', '54', '17', '4832', '10331', '0'), +('16', '54', '17', '4309', '5576', '0'), +('16', '54', '17', '11623', '4979', '0'), +('16', '54', '17', '3307', '4091', '0'), +('16', '54', '7', '4343', '4570', '0'), +('16', '54', '7', '4833', '3567', '0'), +('16', '54', '7', '71303', '2689', '0'), +('16', '54', '7', '2342', '2430', '0'), +('16', '54', '9', '4311', '2925', '0'), +('16', '54', '9', '4834', '2625', '0'), +('16', '54', '9', '12189', '2263', '0'), +('16', '54', '9', '10149', '2255', '0'), +('16', '54', '15', '10366', '8005', '0'), +('16', '54', '15', '10151', '7200', '0'), +('16', '54', '15', '14679', '6255', '0'), +('16', '54', '15', '14678', '5104', '0'), +('16', '54', '20', '11601', '10319', '0'), +('16', '54', '20', '2742', '4862', '0'), +('16', '54', '20', '1365', '4200', '0'), +('16', '54', '20', '2471', '3804', '0'), +('16', '54', '12', '4835', '8796', '0'), +('16', '54', '12', '20655', '5390', '0'), +('16', '54', '12', '11624', '4285', '0'), +('16', '54', '12', '2923', '3404', '0'), +('16', '54', '18', '4836', '4702', '0'), +('16', '54', '18', '2461', '2557', '0'), +('16', '54', '18', '2462', '2532', '0'), +('16', '54', '18', '4346', '2276', '0'), +('16', '54', '19', '4837', '3923', '0'), +('16', '54', '19', '68239', '3223', '0'), +('16', '54', '19', '2337', '1757', '0'), +('16', '54', '19', '3312', '1392', '0'), +('16', '54', '13', '27961', '86600', '0'), +('16', '54', '13', '45120', '68592', '0'), +('16', '54', '13', '5622', '50046', '0'), +('16', '54', '13', '11609', '49844', '0'), +('16', '54', '14', '11551', '12679', '0'), +('16', '54', '14', '13355', '2754', '0'), +('16', '54', '14', '14762', '2181', '0'), +('16', '54', '14', '6359', '1753', '0'), +('16', '54', '11', '14762', '2181', '0'), +('16', '54', '11', '20677', '1800', '0'), +('16', '54', '11', '9246', '604', '0'), +('16', '54', '11', '13748', '454', '0'), +('16', '55', '22', '10323', '0', '0'), +('16', '55', '22', '10664', '0', '0'), +('16', '55', '22', '9246', '0', '0'), +('16', '55', '22', '21509', '0', '0'), +('16', '55', '1', '27822', '4565', '0'), +('16', '55', '1', '14701', '3802', '0'), +('16', '55', '1', '14702', '2500', '0'), +('16', '55', '1', '14623', '1689', '0'), +('16', '55', '2', '4620', '4356', '0'), +('16', '55', '2', '1519', '3207', '0'), +('16', '55', '2', '4831', '3020', '0'), +('16', '55', '2', '10142', '3012', '0'), +('16', '55', '3', '10144', '1304', '0'), +('16', '55', '3', '14705', '990', '0'), +('16', '55', '3', '14706', '990', '0'), +('16', '55', '3', '1411', '865', '0'), +('16', '55', '5', '14703', '5500', '0'), +('16', '55', '5', '14700', '3453', '0'), +('16', '55', '5', '10055', '3255', '0'), +('16', '55', '5', '14670', '2537', '0'), +('16', '55', '8', '11621', '14171', '0'), +('16', '55', '8', '1409', '6312', '0'), +('16', '55', '8', '11551', '5129', '0'), +('16', '55', '8', '2400', '2808', '0'), +('16', '55', '6', '1557', '6760', '0'), +('16', '55', '6', '4302', '3350', '0'), +('16', '55', '6', '25062', '1817', '0'), +('16', '55', '6', '4165', '1812', '0'), +('16', '55', '17', '4832', '10422', '0'), +('16', '55', '17', '4309', '5576', '0'), +('16', '55', '17', '11623', '4979', '0'), +('16', '55', '17', '3307', '4116', '0'), +('16', '55', '7', '4343', '4630', '0'), +('16', '55', '7', '4833', '3567', '0'), +('16', '55', '7', '71303', '2689', '0'), +('16', '55', '7', '2342', '2448', '0'), +('16', '55', '9', '4311', '2967', '0'), +('16', '55', '9', '4834', '2625', '0'), +('16', '55', '9', '12189', '2263', '0'), +('16', '55', '9', '10149', '2255', '0'), +('16', '55', '15', '10366', '8005', '0'), +('16', '55', '15', '10151', '7200', '0'), +('16', '55', '15', '14679', '6255', '0'), +('16', '55', '15', '14678', '5104', '0'), +('16', '55', '20', '11601', '10380', '0'), +('16', '55', '20', '2742', '4923', '0'), +('16', '55', '20', '1365', '4200', '0'), +('16', '55', '20', '2471', '3804', '0'), +('16', '55', '12', '4835', '8826', '0'), +('16', '55', '12', '20655', '5402', '0'), +('16', '55', '12', '11624', '4327', '0'), +('16', '55', '12', '2923', '3404', '0'), +('16', '55', '18', '4836', '4732', '0'), +('16', '55', '18', '2462', '2574', '0'), +('16', '55', '18', '2461', '2557', '0'), +('16', '55', '18', '4346', '2276', '0'), +('16', '55', '19', '4837', '3923', '0'), +('16', '55', '19', '68239', '3223', '0'), +('16', '55', '19', '2337', '1757', '0'), +('16', '55', '19', '3312', '1392', '0'), +('16', '55', '13', '27961', '88650', '0'), +('16', '55', '13', '45120', '71851', '0'), +('16', '55', '13', '5622', '51207', '0'), +('16', '55', '13', '11609', '51056', '0'), +('16', '55', '14', '11551', '12679', '0'), +('16', '55', '14', '13355', '2815', '0'), +('16', '55', '14', '14762', '2181', '0'), +('16', '55', '14', '6359', '1753', '0'), +('16', '55', '11', '14762', '2181', '0'), +('16', '55', '11', '20677', '1800', '0'), +('16', '55', '11', '9246', '604', '0'), +('16', '55', '11', '13748', '454', '0'), +('16', '56', '22', '10323', '0', '0'), +('16', '56', '22', '10664', '0', '0'), +('16', '56', '22', '9246', '0', '0'), +('16', '56', '22', '21509', '0', '0'), +('16', '56', '1', '27822', '4565', '0'), +('16', '56', '1', '14701', '3802', '0'), +('16', '56', '1', '14702', '2500', '0'), +('16', '56', '1', '14623', '1725', '0'), +('16', '56', '2', '4620', '4398', '0'), +('16', '56', '2', '1519', '3207', '0'), +('16', '56', '2', '4831', '3020', '0'), +('16', '56', '2', '10142', '3012', '0'), +('16', '56', '3', '10144', '1304', '0'), +('16', '56', '3', '14705', '990', '0'), +('16', '56', '3', '14706', '990', '0'), +('16', '56', '3', '1411', '877', '0'), +('16', '56', '5', '14703', '5500', '0'), +('16', '56', '5', '14700', '3453', '0'), +('16', '56', '5', '10055', '3255', '0'), +('16', '56', '5', '14670', '2591', '0'), +('16', '56', '8', '11621', '14171', '0'), +('16', '56', '8', '1409', '6312', '0'), +('16', '56', '8', '11551', '5129', '0'), +('16', '56', '8', '2400', '2808', '0'), +('16', '56', '6', '1557', '6760', '0'), +('16', '56', '6', '4302', '3386', '0'), +('16', '56', '6', '25062', '1817', '0'), +('16', '56', '6', '4165', '1812', '0'), +('16', '56', '17', '4832', '10513', '0'), +('16', '56', '17', '4309', '5576', '0'), +('16', '56', '17', '11623', '4979', '0'), +('16', '56', '17', '3307', '4140', '0'), +('16', '56', '7', '4343', '4691', '0'), +('16', '56', '7', '4833', '3567', '0'), +('16', '56', '7', '71303', '2689', '0'), +('16', '56', '7', '2342', '2467', '0'), +('16', '56', '9', '4311', '3009', '0'), +('16', '56', '9', '4834', '2625', '0'), +('16', '56', '9', '12189', '2263', '0'), +('16', '56', '9', '10149', '2255', '0'), +('16', '56', '15', '10366', '8005', '0'), +('16', '56', '15', '10151', '7200', '0'), +('16', '56', '15', '14679', '6255', '0'), +('16', '56', '15', '14678', '5104', '0'), +('16', '56', '20', '11601', '10440', '0'), +('16', '56', '20', '2742', '4983', '0'), +('16', '56', '20', '1365', '4200', '0'), +('16', '56', '20', '2471', '3804', '0'), +('16', '56', '12', '4835', '8857', '0'), +('16', '56', '12', '20655', '5414', '0'), +('16', '56', '12', '11624', '4370', '0'), +('16', '56', '12', '2923', '3404', '0'), +('16', '56', '18', '4836', '4763', '0'), +('16', '56', '18', '2462', '2617', '0'), +('16', '56', '18', '2461', '2557', '0'), +('16', '56', '18', '4346', '2276', '0'), +('16', '56', '19', '4837', '3923', '0'), +('16', '56', '19', '68239', '3223', '0'), +('16', '56', '19', '2337', '1757', '0'), +('16', '56', '19', '3312', '1392', '0'), +('16', '56', '13', '27961', '90700', '0'), +('16', '56', '13', '45120', '73497', '0'), +('16', '56', '13', '5622', '52419', '0'), +('16', '56', '13', '11609', '52217', '0'), +('16', '56', '14', '11551', '12679', '0'), +('16', '56', '14', '13355', '2875', '0'), +('16', '56', '14', '14762', '2181', '0'), +('16', '56', '14', '6359', '1753', '0'), +('16', '56', '11', '14762', '2181', '0'), +('16', '56', '11', '20677', '1800', '0'), +('16', '56', '11', '9246', '604', '0'), +('16', '56', '11', '13748', '454', '0'), +('16', '57', '22', '10323', '0', '0'), +('16', '57', '22', '10664', '0', '0'), +('16', '57', '22', '9246', '0', '0'), +('16', '57', '22', '21509', '0', '0'), +('16', '57', '1', '27822', '4565', '0'), +('16', '57', '1', '14701', '3802', '0'), +('16', '57', '1', '14702', '2500', '0'), +('16', '57', '1', '14623', '1761', '0'), +('16', '57', '2', '4620', '4441', '0'), +('16', '57', '2', '1519', '3207', '0'), +('16', '57', '2', '4831', '3020', '0'), +('16', '57', '2', '10142', '3012', '0'), +('16', '57', '3', '10144', '1304', '0'), +('16', '57', '3', '14705', '990', '0'), +('16', '57', '3', '14706', '990', '0'), +('16', '57', '3', '1411', '889', '0'), +('16', '57', '5', '14703', '5500', '0'), +('16', '57', '5', '14700', '3453', '0'), +('16', '57', '5', '10055', '3255', '0'), +('16', '57', '5', '14670', '2646', '0'), +('16', '57', '8', '11621', '14171', '0'), +('16', '57', '8', '1409', '6312', '0'), +('16', '57', '8', '11551', '5129', '0'), +('16', '57', '8', '2400', '2808', '0'), +('16', '57', '6', '1557', '6760', '0'), +('16', '57', '6', '4302', '3422', '0'), +('16', '57', '6', '25062', '1817', '0'), +('16', '57', '6', '4165', '1812', '0'), +('16', '57', '17', '4832', '10603', '0'), +('16', '57', '17', '4309', '5576', '0'), +('16', '57', '17', '11623', '4979', '0'), +('16', '57', '17', '3307', '4164', '0'), +('16', '57', '7', '4343', '4751', '0'), +('16', '57', '7', '4833', '3567', '0'), +('16', '57', '7', '71303', '2689', '0'), +('16', '57', '7', '2342', '2485', '0'), +('16', '57', '9', '4311', '3051', '0'), +('16', '57', '9', '4834', '2625', '0'), +('16', '57', '9', '12189', '2263', '0'), +('16', '57', '9', '10149', '2255', '0'), +('16', '57', '15', '10366', '8005', '0'), +('16', '57', '15', '10151', '7200', '0'), +('16', '57', '15', '14679', '6255', '0'), +('16', '57', '15', '14678', '5104', '0'), +('16', '57', '20', '11601', '10500', '0'), +('16', '57', '20', '2742', '5043', '0'), +('16', '57', '20', '1365', '4200', '0'), +('16', '57', '20', '2471', '3804', '0'), +('16', '57', '12', '4835', '8887', '0'), +('16', '57', '12', '20655', '5426', '0'), +('16', '57', '12', '11624', '4412', '0'), +('16', '57', '12', '2923', '3404', '0'), +('16', '57', '18', '4836', '4793', '0'), +('16', '57', '18', '2462', '2659', '0'), +('16', '57', '18', '2461', '2557', '0'), +('16', '57', '18', '4346', '2276', '0'), +('16', '57', '19', '4837', '3923', '0'), +('16', '57', '19', '68239', '3223', '0'), +('16', '57', '19', '2337', '1757', '0'), +('16', '57', '19', '3312', '1392', '0'), +('16', '57', '13', '27961', '92750', '0'), +('16', '57', '13', '45120', '75143', '0'), +('16', '57', '13', '5622', '53631', '0'), +('16', '57', '13', '11609', '53429', '0'), +('16', '57', '14', '11551', '12679', '0'), +('16', '57', '14', '13355', '2935', '0'), +('16', '57', '14', '14762', '2181', '0'), +('16', '57', '14', '6359', '1753', '0'), +('16', '57', '11', '14762', '2181', '0'), +('16', '57', '11', '20677', '1800', '0'), +('16', '57', '11', '9246', '604', '0'), +('16', '57', '11', '13748', '454', '0'), +('16', '58', '22', '10323', '0', '0'), +('16', '58', '22', '10664', '0', '0'), +('16', '58', '22', '9246', '0', '0'), +('16', '58', '22', '21509', '0', '0'), +('16', '58', '1', '27822', '4565', '0'), +('16', '58', '1', '14701', '3802', '0'), +('16', '58', '1', '14702', '2500', '0'), +('16', '58', '1', '14623', '1798', '0'), +('16', '58', '2', '4620', '4483', '0'), +('16', '58', '2', '1519', '3207', '0'), +('16', '58', '2', '4831', '3020', '0'), +('16', '58', '2', '10142', '3012', '0'), +('16', '58', '3', '10144', '1304', '0'), +('16', '58', '3', '14705', '990', '0'), +('16', '58', '3', '14706', '990', '0'), +('16', '58', '3', '1411', '901', '0'), +('16', '58', '5', '14703', '5500', '0'), +('16', '58', '5', '14700', '3453', '0'), +('16', '58', '5', '10055', '3255', '0'), +('16', '58', '5', '14670', '2700', '0'), +('16', '58', '8', '11621', '14171', '0'), +('16', '58', '8', '1409', '6312', '0'), +('16', '58', '8', '11551', '5129', '0'), +('16', '58', '8', '2400', '2808', '0'), +('16', '58', '6', '1557', '6760', '0'), +('16', '58', '6', '4302', '3459', '0'), +('16', '58', '6', '25062', '1817', '0'), +('16', '58', '6', '4165', '1812', '0'), +('16', '58', '17', '4832', '10694', '0'), +('16', '58', '17', '4309', '5576', '0'), +('16', '58', '17', '11623', '4979', '0'), +('16', '58', '17', '3307', '4188', '0'), +('16', '58', '7', '4343', '4811', '0'), +('16', '58', '7', '4833', '3567', '0'), +('16', '58', '7', '71303', '2689', '0'), +('16', '58', '7', '2342', '2503', '0'), +('16', '58', '9', '4311', '3094', '0'), +('16', '58', '9', '4834', '2625', '0'), +('16', '58', '9', '12189', '2263', '0'), +('16', '58', '9', '10149', '2255', '0'), +('16', '58', '15', '10366', '8005', '0'), +('16', '58', '15', '10151', '7200', '0'), +('16', '58', '15', '14679', '6255', '0'), +('16', '58', '15', '14678', '5104', '0'), +('16', '58', '20', '11601', '10561', '0'), +('16', '58', '20', '2742', '5104', '0'), +('16', '58', '20', '1365', '4200', '0'), +('16', '58', '20', '2471', '3804', '0'), +('16', '58', '12', '4835', '8917', '0'), +('16', '58', '12', '20655', '5438', '0'), +('16', '58', '12', '11624', '4454', '0'), +('16', '58', '12', '2923', '3404', '0'), +('16', '58', '18', '4836', '4823', '0'), +('16', '58', '18', '2462', '2701', '0'), +('16', '58', '18', '2461', '2557', '0'), +('16', '58', '18', '4346', '2276', '0'), +('16', '58', '19', '4837', '3923', '0'), +('16', '58', '19', '68239', '3223', '0'), +('16', '58', '19', '2337', '1757', '0'), +('16', '58', '19', '3312', '1392', '0'), +('16', '58', '13', '27961', '94800', '0'), +('16', '58', '13', '45120', '76789', '0'), +('16', '58', '13', '5622', '54793', '0'), +('16', '58', '13', '11609', '54641', '0'), +('16', '58', '14', '11551', '12679', '0'), +('16', '58', '14', '13355', '2996', '0'), +('16', '58', '14', '14762', '2181', '0'), +('16', '58', '14', '6359', '1753', '0'), +('16', '58', '11', '14762', '2181', '0'), +('16', '58', '11', '20677', '1800', '0'), +('16', '58', '11', '9246', '604', '0'), +('16', '58', '11', '13748', '454', '0'), +('16', '59', '22', '10323', '0', '0'), +('16', '59', '22', '10664', '0', '0'), +('16', '59', '22', '9246', '0', '0'), +('16', '59', '22', '21509', '0', '0'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '59', '1', '27822', '4565', '0'), +('16', '59', '1', '14701', '3802', '0'), +('16', '59', '1', '14702', '2500', '0'), +('16', '59', '1', '14623', '1834', '0'), +('16', '59', '2', '4620', '4525', '0'), +('16', '59', '2', '1519', '3207', '0'), +('16', '59', '2', '4831', '3020', '0'), +('16', '59', '2', '10142', '3012', '0'), +('16', '59', '3', '10144', '1304', '0'), +('16', '59', '3', '14705', '990', '0'), +('16', '59', '3', '14706', '990', '0'), +('16', '59', '3', '1411', '913', '0'), +('16', '59', '5', '14703', '5500', '0'), +('16', '59', '5', '14700', '3453', '0'), +('16', '59', '5', '10055', '3255', '0'), +('16', '59', '5', '14670', '2754', '0'), +('16', '59', '8', '11621', '14171', '0'), +('16', '59', '8', '1409', '6312', '0'), +('16', '59', '8', '11551', '5129', '0'), +('16', '59', '8', '2400', '2808', '0'), +('16', '59', '6', '1557', '6760', '0'), +('16', '59', '6', '4302', '3495', '0'), +('16', '59', '6', '25062', '1817', '0'), +('16', '59', '6', '4165', '1812', '0'), +('16', '59', '17', '4832', '10784', '0'), +('16', '59', '17', '4309', '5576', '0'), +('16', '59', '17', '11623', '4979', '0'), +('16', '59', '17', '3307', '4212', '0'), +('16', '59', '7', '4343', '4872', '0'), +('16', '59', '7', '4833', '3567', '0'), +('16', '59', '7', '71303', '2689', '0'), +('16', '59', '7', '2342', '2521', '0'), +('16', '59', '9', '4311', '3136', '0'), +('16', '59', '9', '4834', '2625', '0'), +('16', '59', '9', '12189', '2263', '0'), +('16', '59', '9', '10149', '2255', '0'), +('16', '59', '15', '10366', '8005', '0'), +('16', '59', '15', '10151', '7200', '0'), +('16', '59', '15', '14679', '6255', '0'), +('16', '59', '15', '14678', '5104', '0'), +('16', '59', '20', '11601', '10621', '0'), +('16', '59', '20', '2742', '5164', '0'), +('16', '59', '20', '1365', '4200', '0'), +('16', '59', '20', '2471', '3804', '0'), +('16', '59', '12', '4835', '8947', '0'), +('16', '59', '12', '20655', '5450', '0'), +('16', '59', '12', '11624', '4496', '0'), +('16', '59', '12', '2923', '3404', '0'), +('16', '59', '18', '4836', '4853', '0'), +('16', '59', '18', '2462', '2743', '0'), +('16', '59', '18', '2461', '2557', '0'), +('16', '59', '18', '4346', '2276', '0'), +('16', '59', '19', '4837', '3923', '0'), +('16', '59', '19', '68239', '3223', '0'), +('16', '59', '19', '2337', '1757', '0'), +('16', '59', '19', '3312', '1392', '0'), +('16', '59', '13', '27961', '96851', '0'), +('16', '59', '13', '45120', '78436', '0'), +('16', '59', '13', '5622', '56005', '0'), +('16', '59', '13', '11609', '55803', '0'), +('16', '59', '14', '11551', '12679', '0'), +('16', '59', '14', '13355', '3056', '0'), +('16', '59', '14', '14762', '2181', '0'), +('16', '59', '14', '6359', '1753', '0'), +('16', '59', '11', '14762', '2181', '0'), +('16', '59', '11', '20677', '1800', '0'), +('16', '59', '11', '9246', '604', '0'), +('16', '59', '11', '13748', '454', '0'), +('16', '60', '22', '66397', '0', '3'), +('16', '60', '22', '62787', '0', '3'), +('16', '60', '22', '61948', '0', '3'), +('16', '60', '22', '21805', '0', '3'), +('16', '60', '1', '26775', '16400', '3'), +('16', '60', '1', '28962', '15117', '3'), +('16', '60', '1', '28945', '12563', '3'), +('16', '60', '1', '29861', '11717', '3'), +('16', '60', '2', '26759', '14388', '3'), +('16', '60', '2', '2612', '12737', '3'), +('16', '60', '2', '26025', '12737', '3'), +('16', '60', '2', '29648', '12227', '3'), +('16', '60', '3', '26773', '16669', '3'), +('16', '60', '3', '28942', '13377', '3'), +('16', '60', '3', '28963', '11889', '3'), +('16', '60', '3', '31233', '11337', '3'), +('16', '60', '5', '8364', '18230', '3'), +('16', '60', '5', '28885', '17512', '3'), +('16', '60', '5', '27266', '13313', '3'), +('16', '60', '5', '7868', '13112', '3'), +('16', '60', '8', '26765', '20093', '3'), +('16', '60', '8', '26766', '19830', '3'), +('16', '60', '8', '31471', '19203', '3'), +('16', '60', '8', '28918', '13775', '3'), +('16', '60', '6', '28902', '20315', '3'), +('16', '60', '6', '28919', '13403', '3'), +('16', '60', '6', '31472', '13165', '3'), +('16', '60', '6', '30551', '13137', '3'), +('16', '60', '17', '28951', '12313', '3'), +('16', '60', '17', '30564', '11445', '3'), +('16', '60', '17', '10845', '10795', '3'), +('16', '60', '17', '27159', '10181', '3'), +('16', '60', '7', '26771', '16637', '3'), +('16', '60', '7', '28926', '14823', '3'), +('16', '60', '7', '7868', '13112', '3'), +('16', '60', '7', '26584', '12378', '3'), +('16', '60', '9', '31461', '19107', '3'), +('16', '60', '9', '7868', '13112', '3'), +('16', '60', '9', '26584', '12378', '3'), +('16', '60', '9', '5723', '11606', '3'), +('16', '60', '15', '26749', '14877', '3'), +('16', '60', '15', '27950', '11682', '3'), +('16', '60', '15', '26757', '11644', '3'), +('16', '60', '15', '63170', '11615', '3'), +('16', '60', '20', '31235', '18404', '3'), +('16', '60', '20', '28890', '17538', '3'), +('16', '60', '20', '31334', '16223', '3'), +('16', '60', '20', '26551', '15059', '3'), +('16', '60', '12', '25857', '17134', '3'), +('16', '60', '12', '28967', '14813', '3'), +('16', '60', '12', '28958', '12692', '3'), +('16', '60', '12', '26774', '12430', '3'), +('16', '60', '18', '28965', '14415', '3'), +('16', '60', '18', '26755', '11577', '3'), +('16', '60', '18', '28932', '11353', '3'), +('16', '60', '18', '8289', '11263', '3'), +('16', '60', '19', '30569', '19974', '3'), +('16', '60', '19', '51226', '17424', '3'), +('16', '60', '19', '28888', '15568', '3'), +('16', '60', '19', '7871', '11437', '3'), +('16', '60', '13', '28824', '124341', '3'), +('16', '60', '13', '31242', '116716', '3'), +('16', '60', '13', '30530', '116636', '3'), +('16', '60', '13', '2580', '114377', '3'), +('16', '60', '14', '26758', '11065', '3'), +('16', '60', '14', '27960', '5553', '3'), +('16', '60', '14', '27929', '3162', '3'), +('16', '60', '14', '14762', '2003', '3'), +('16', '60', '11', '26563', '16429', '3'), +('16', '60', '11', '30565', '12937', '3'), +('16', '60', '11', '1554', '11587', '3'), +('16', '60', '11', '26758', '11065', '3'), +('16', '60', '22', '9248', '0', '2'), +('16', '60', '22', '10323', '0', '2'), +('16', '60', '22', '12425', '0', '2'), +('16', '60', '22', '30014', '0', '2'), +('16', '60', '1', '2748', '8112', '2'), +('16', '60', '1', '5716', '7691', '2'), +('16', '60', '1', '31236', '7270', '2'), +('16', '60', '1', '62234', '5705', '2'), +('16', '60', '2', '26025', '13594', '2'), +('16', '60', '2', '2612', '13594', '2'), +('16', '60', '2', '29648', '13485', '2'), +('16', '60', '2', '25194', '13013', '2'), +('16', '60', '3', '31233', '12691', '2'), +('16', '60', '3', '31464', '11638', '2'), +('16', '60', '3', '31244', '9763', '2'), +('16', '60', '3', '1547', '6440', '2'), +('16', '60', '5', '27266', '13940', '2'), +('16', '60', '5', '31234', '13371', '2'), +('16', '60', '5', '31460', '13106', '2'), +('16', '60', '5', '1550', '11695', '2'), +('16', '60', '8', '31471', '20714', '2'), +('16', '60', '8', '11621', '12924', '2'), +('16', '60', '8', '1551', '11416', '2'), +('16', '60', '8', '25207', '11245', '2'), +('16', '60', '6', '31472', '14797', '2'), +('16', '60', '6', '5723', '12158', '2'), +('16', '60', '6', '24070', '11472', '2'), +('16', '60', '6', '31240', '11061', '2'), +('16', '60', '17', '27159', '11475', '2'), +('16', '60', '17', '10845', '11241', '2'), +('16', '60', '17', '27261', '10531', '2'), +('16', '60', '17', '27148', '10231', '2'), +('16', '60', '7', '5723', '12158', '2'), +('16', '60', '7', '29485', '7067', '2'), +('16', '60', '7', '31381', '6205', '2'), +('16', '60', '7', '31371', '4067', '2'), +('16', '60', '9', '31461', '20657', '2'), +('16', '60', '9', '31460', '13106', '2'), +('16', '60', '9', '5723', '12158', '2'), +('16', '60', '9', '31246', '7992', '2'), +('16', '60', '15', '31231', '12318', '2'), +('16', '60', '15', '25211', '11644', '2'), +('16', '60', '15', '30385', '11244', '2'), +('16', '60', '15', '31377', '9835', '2'), +('16', '60', '20', '31235', '20420', '2'), +('16', '60', '20', '31334', '16940', '2'), +('16', '60', '20', '2510', '12742', '2'), +('16', '60', '20', '25858', '12559', '2'), +('16', '60', '12', '25857', '17966', '2'), +('16', '60', '12', '31227', '13655', '2'), +('16', '60', '12', '31306', '11404', '2'), +('16', '60', '12', '31402', '10124', '2'), +('16', '60', '18', '31332', '7266', '2'), +('16', '60', '18', '31386', '7032', '2'), +('16', '60', '18', '31371', '4067', '2'), +('16', '60', '18', '26017', '3009', '2'), +('16', '60', '19', '24616', '11715', '2'), +('16', '60', '19', '29455', '8183', '2'), +('16', '60', '19', '1099', '7166', '2'), +('16', '60', '19', '31336', '4216', '2'), +('16', '60', '13', '31242', '117175', '2'), +('16', '60', '13', '2580', '115634', '2'), +('16', '60', '13', '31232', '111005', '2'), +('16', '60', '13', '31317', '105674', '2'), +('16', '60', '14', '11551', '2903', '2'), +('16', '60', '14', '14762', '2033', '2'), +('16', '60', '14', '6359', '1751', '2'), +('16', '60', '14', '9690', '1500', '2'), +('16', '60', '11', '1554', '12444', '2'), +('16', '60', '11', '2698', '10159', '2'), +('16', '60', '11', '31321', '7295', '2'), +('16', '60', '11', '29462', '6883', '2'), +('16', '60', '22', '10323', '0', '1'), +('16', '60', '22', '12425', '0', '1'), +('16', '60', '22', '10664', '0', '1'), +('16', '60', '22', '9246', '0', '1'), +('16', '60', '1', '5716', '7785', '1'), +('16', '60', '1', '62234', '6624', '1'), +('16', '60', '1', '5704', '5818', '1'), +('16', '60', '1', '5715', '5818', '1'), +('16', '60', '2', '10913', '11139', '1'), +('16', '60', '2', '62236', '4165', '1'), +('16', '60', '2', '1630', '3846', '1'), +('16', '60', '2', '3213', '3400', '1'), +('16', '60', '3', '46184', '6314', '1'), +('16', '60', '3', '1625', '3924', '1'), +('16', '60', '3', '5712', '2835', '1'), +('16', '60', '3', '11477', '2232', '1'), +('16', '60', '5', '14703', '5500', '1'), +('16', '60', '5', '14709', '3297', '1'), +('16', '60', '5', '14700', '3267', '1'), +('16', '60', '5', '8285', '3090', '1'), +('16', '60', '8', '11621', '13548', '1'), +('16', '60', '8', '1619', '12985', '1'), +('16', '60', '8', '5779', '9291', '1'), +('16', '60', '8', '1622', '9273', '1'), +('16', '60', '6', '5723', '13539', '1'), +('16', '60', '6', '5706', '8348', '1'), +('16', '60', '6', '1557', '6141', '1'), +('16', '60', '6', '11975', '3370', '1'), +('16', '60', '17', '10845', '12354', '1'), +('16', '60', '17', '55495', '11408', '1'), +('16', '60', '17', '4832', '6419', '1'), +('16', '60', '17', '4309', '4520', '1'), +('16', '60', '7', '5723', '13539', '1'), +('16', '60', '7', '62046', '4312', '1'), +('16', '60', '7', '4295', '3801', '1'), +('16', '60', '7', '4343', '2911', '1'), +('16', '60', '9', '5723', '13539', '1'), +('16', '60', '9', '5794', '2967', '1'), +('16', '60', '9', '4294', '2801', '1'), +('16', '60', '9', '10149', '1946', '1'), +('16', '60', '15', '5727', '9865', '1'), +('16', '60', '15', '10366', '8003', '1'), +('16', '60', '15', '10151', '7200', '1'), +('16', '60', '15', '5728', '6678', '1'), +('16', '60', '20', '1620', '10284', '1'), +('16', '60', '20', '11601', '8845', '1'), +('16', '60', '20', '1623', '4978', '1'), +('16', '60', '20', '1365', '4200', '1'), +('16', '60', '12', '4835', '7348', '1'), +('16', '60', '12', '20655', '4167', '1'), +('16', '60', '12', '2923', '3157', '1'), +('16', '60', '12', '3255', '2891', '1'), +('16', '60', '18', '4836', '2882', '1'), +('16', '60', '18', '2461', '2124', '1'), +('16', '60', '18', '1065', '2050', '1'), +('16', '60', '18', '4317', '1904', '1'), +('16', '60', '19', '24616', '12658', '1'), +('16', '60', '19', '4318', '3571', '1'), +('16', '60', '19', '4920', '2850', '1'), +('16', '60', '19', '4837', '2684', '1'), +('16', '60', '13', '27961', '97981', '1'), +('16', '60', '13', '5603', '86792', '1'), +('16', '60', '13', '24624', '81647', '1'), +('16', '60', '13', '45120', '79133', '1'), +('16', '60', '14', '11551', '7791', '1'), +('16', '60', '14', '14754', '2607', '1'), +('16', '60', '14', '14762', '2107', '1'), +('16', '60', '14', '13355', '1840', '1'), +('16', '60', '11', '5803', '5920', '1'), +('16', '60', '11', '46178', '5457', '1'), +('16', '60', '11', '62242', '4971', '1'), +('16', '60', '11', '79631', '4887', '1'), +('16', '61', '22', '66397', '0', '3'), +('16', '61', '22', '62787', '0', '3'), +('16', '61', '22', '61948', '0', '3'), +('16', '61', '22', '21805', '0', '3'), +('16', '61', '1', '26775', '16402', '3'), +('16', '61', '1', '28962', '15118', '3'), +('16', '61', '1', '28945', '12564', '3'), +('16', '61', '1', '29861', '11719', '3'), +('16', '61', '2', '26759', '14388', '3'), +('16', '61', '2', '2612', '12737', '3'), +('16', '61', '2', '26025', '12737', '3'), +('16', '61', '2', '29648', '12228', '3'), +('16', '61', '3', '26773', '16672', '3'), +('16', '61', '3', '28942', '13379', '3'), +('16', '61', '3', '28963', '11890', '3'), +('16', '61', '3', '31233', '11338', '3'), +('16', '61', '5', '8364', '18232', '3'), +('16', '61', '5', '28885', '17513', '3'), +('16', '61', '5', '27266', '13314', '3'), +('16', '61', '5', '7868', '13113', '3'), +('16', '61', '8', '26765', '20094', '3'), +('16', '61', '8', '26766', '19832', '3'), +('16', '61', '8', '31471', '19204', '3'), +('16', '61', '8', '28918', '13775', '3'), +('16', '61', '6', '28902', '20317', '3'), +('16', '61', '6', '28919', '13405', '3'), +('16', '61', '6', '31472', '13166', '3'), +('16', '61', '6', '30551', '13138', '3'), +('16', '61', '17', '28951', '12313', '3'), +('16', '61', '17', '30564', '11447', '3'), +('16', '61', '17', '10845', '10795', '3'), +('16', '61', '17', '27159', '10181', '3'), +('16', '61', '7', '26771', '16638', '3'), +('16', '61', '7', '28926', '14823', '3'), +('16', '61', '7', '7868', '13113', '3'), +('16', '61', '7', '26584', '12379', '3'), +('16', '61', '9', '31461', '19108', '3'), +('16', '61', '9', '7868', '13113', '3'), +('16', '61', '9', '26584', '12379', '3'), +('16', '61', '9', '5723', '11606', '3'), +('16', '61', '15', '26749', '14879', '3'), +('16', '61', '15', '27950', '11683', '3'), +('16', '61', '15', '26757', '11644', '3'), +('16', '61', '15', '63170', '11616', '3'), +('16', '61', '20', '31235', '18406', '3'), +('16', '61', '20', '28890', '17538', '3'), +('16', '61', '20', '31334', '16223', '3'), +('16', '61', '20', '26551', '15061', '3'), +('16', '61', '12', '25857', '17134', '3'), +('16', '61', '12', '28967', '14813', '3'), +('16', '61', '12', '28958', '12693', '3'), +('16', '61', '12', '26774', '12432', '3'), +('16', '61', '18', '28965', '14417', '3'), +('16', '61', '18', '26755', '11577', '3'), +('16', '61', '18', '28932', '11355', '3'), +('16', '61', '18', '8289', '11263', '3'), +('16', '61', '19', '30569', '19975', '3'), +('16', '61', '19', '51226', '17424', '3'), +('16', '61', '19', '28888', '15569', '3'), +('16', '61', '19', '7871', '11440', '3'), +('16', '61', '13', '28824', '124796', '3'), +('16', '61', '13', '31242', '116969', '3'), +('16', '61', '13', '30530', '116839', '3'), +('16', '61', '13', '2580', '114580', '3'), +('16', '61', '14', '26758', '11066', '3'), +('16', '61', '14', '27960', '5554', '3'), +('16', '61', '14', '27929', '3163', '3'), +('16', '61', '14', '14762', '2003', '3'), +('16', '61', '11', '26563', '16430', '3'), +('16', '61', '11', '30565', '12938', '3'), +('16', '61', '11', '1554', '11588', '3'), +('16', '61', '11', '26758', '11066', '3'), +('16', '62', '22', '66397', '0', '3'), +('16', '62', '22', '62787', '0', '3'), +('16', '62', '22', '61948', '0', '3'), +('16', '62', '22', '21805', '0', '3'), +('16', '62', '1', '26775', '16403', '3'), +('16', '62', '1', '28962', '15119', '3'), +('16', '62', '1', '28945', '12564', '3'), +('16', '62', '1', '29861', '11722', '3'), +('16', '62', '2', '26759', '14388', '3'), +('16', '62', '2', '2612', '12738', '3'), +('16', '62', '2', '26025', '12738', '3'), +('16', '62', '2', '29648', '12230', '3'), +('16', '62', '3', '26773', '16674', '3'), +('16', '62', '3', '28942', '13381', '3'), +('16', '62', '3', '28963', '11891', '3'), +('16', '62', '3', '31233', '11339', '3'), +('16', '62', '5', '8364', '18233', '3'), +('16', '62', '5', '28885', '17514', '3'), +('16', '62', '5', '27266', '13315', '3'), +('16', '62', '5', '7868', '13113', '3'), +('16', '62', '8', '26765', '20094', '3'), +('16', '62', '8', '26766', '19833', '3'), +('16', '62', '8', '31471', '19206', '3'), +('16', '62', '8', '28918', '13775', '3'), +('16', '62', '6', '28902', '20318', '3'), +('16', '62', '6', '28919', '13407', '3'), +('16', '62', '6', '31472', '13168', '3'), +('16', '62', '6', '30551', '13139', '3'), +('16', '62', '17', '28951', '12313', '3'), +('16', '62', '17', '30564', '11450', '3'), +('16', '62', '17', '10845', '10795', '3'), +('16', '62', '17', '27159', '10182', '3'), +('16', '62', '7', '26771', '16639', '3'), +('16', '62', '7', '28926', '14823', '3'), +('16', '62', '7', '7868', '13113', '3'), +('16', '62', '7', '26584', '12381', '3'), +('16', '62', '9', '31461', '19109', '3'), +('16', '62', '9', '7868', '13113', '3'), +('16', '62', '9', '26584', '12381', '3'), +('16', '62', '9', '5723', '11607', '3'), +('16', '62', '15', '26749', '14881', '3'), +('16', '62', '15', '27950', '11684', '3'), +('16', '62', '15', '26757', '11644', '3'), +('16', '62', '15', '63170', '11618', '3'), +('16', '62', '20', '31235', '18408', '3'), +('16', '62', '20', '28890', '17538', '3'), +('16', '62', '20', '31334', '16223', '3'), +('16', '62', '20', '26551', '15063', '3'), +('16', '62', '12', '25857', '17134', '3'), +('16', '62', '12', '28967', '14813', '3'), +('16', '62', '12', '28958', '12694', '3'), +('16', '62', '12', '26774', '12433', '3'), +('16', '62', '18', '28965', '14418', '3'), +('16', '62', '18', '26755', '11577', '3'), +('16', '62', '18', '28932', '11358', '3'), +('16', '62', '18', '8289', '11263', '3'), +('16', '62', '19', '30569', '19976', '3'), +('16', '62', '19', '51226', '17425', '3'), +('16', '62', '19', '28888', '15570', '3'), +('16', '62', '19', '7871', '11444', '3'), +('16', '62', '13', '28824', '125251', '3'), +('16', '62', '13', '31242', '117172', '3'), +('16', '62', '13', '30530', '117093', '3'), +('16', '62', '13', '2580', '114834', '3'), +('16', '62', '14', '26758', '11068', '3'), +('16', '62', '14', '27960', '5556', '3'), +('16', '62', '14', '27929', '3164', '3'), +('16', '62', '14', '14762', '2003', '3'), +('16', '62', '11', '26563', '16431', '3'), +('16', '62', '11', '30565', '12939', '3'), +('16', '62', '11', '1554', '11589', '3'), +('16', '62', '11', '26758', '11068', '3'), +('16', '63', '22', '66397', '0', '3'), +('16', '63', '22', '62787', '0', '3'), +('16', '63', '22', '61948', '0', '3'), +('16', '63', '22', '21805', '0', '3'), +('16', '63', '1', '26775', '16405', '3'), +('16', '63', '1', '28962', '15120', '3'), +('16', '63', '1', '28945', '12565', '3'), +('16', '63', '1', '29861', '11724', '3'), +('16', '63', '2', '26759', '14388', '3'), +('16', '63', '2', '2612', '12739', '3'), +('16', '63', '2', '26025', '12739', '3'), +('16', '63', '2', '29648', '12231', '3'), +('16', '63', '3', '26773', '16677', '3'), +('16', '63', '3', '28942', '13382', '3'), +('16', '63', '3', '28963', '11892', '3'), +('16', '63', '3', '31233', '11340', '3'), +('16', '63', '5', '8364', '18235', '3'), +('16', '63', '5', '28885', '17514', '3'), +('16', '63', '5', '27266', '13315', '3'), +('16', '63', '5', '7868', '13114', '3'), +('16', '63', '8', '26765', '20095', '3'), +('16', '63', '8', '26766', '19835', '3'), +('16', '63', '8', '31471', '19207', '3'), +('16', '63', '8', '28918', '13775', '3'), +('16', '63', '6', '28902', '20320', '3'), +('16', '63', '6', '28919', '13409', '3'), +('16', '63', '6', '31472', '13170', '3'), +('16', '63', '6', '30551', '13140', '3'), +('16', '63', '17', '28951', '12313', '3'), +('16', '63', '17', '30564', '11453', '3'), +('16', '63', '17', '10845', '10795', '3'), +('16', '63', '17', '27159', '10183', '3'), +('16', '63', '7', '26771', '16640', '3'), +('16', '63', '7', '28926', '14823', '3'), +('16', '63', '7', '7868', '13114', '3'), +('16', '63', '7', '26584', '12382', '3'), +('16', '63', '9', '31461', '19110', '3'), +('16', '63', '9', '7868', '13114', '3'), +('16', '63', '9', '26584', '12382', '3'), +('16', '63', '9', '5723', '11607', '3'), +('16', '63', '15', '26749', '14882', '3'), +('16', '63', '15', '27950', '11685', '3'), +('16', '63', '15', '26757', '11644', '3'), +('16', '63', '15', '63170', '11619', '3'), +('16', '63', '20', '31235', '18410', '3'), +('16', '63', '20', '28890', '17538', '3'), +('16', '63', '20', '31334', '16223', '3'), +('16', '63', '20', '26551', '15065', '3'), +('16', '63', '12', '25857', '17134', '3'), +('16', '63', '12', '28967', '14813', '3'), +('16', '63', '12', '28958', '12695', '3'), +('16', '63', '12', '26774', '12435', '3'), +('16', '63', '18', '28965', '14420', '3'), +('16', '63', '18', '26755', '11577', '3'), +('16', '63', '18', '28932', '11360', '3'), +('16', '63', '18', '8289', '11263', '3'), +('16', '63', '19', '30569', '19977', '3'), +('16', '63', '19', '51226', '17426', '3'), +('16', '63', '19', '28888', '15570', '3'), +('16', '63', '19', '7871', '11447', '3'), +('16', '63', '13', '28824', '125706', '3'), +('16', '63', '13', '31242', '117375', '3'), +('16', '63', '13', '30530', '117296', '3'), +('16', '63', '13', '2580', '115037', '3'), +('16', '63', '14', '26758', '11070', '3'), +('16', '63', '14', '27960', '5557', '3'), +('16', '63', '14', '27929', '3166', '3'), +('16', '63', '14', '14762', '2003', '3'), +('16', '63', '11', '26563', '16432', '3'), +('16', '63', '11', '30565', '12940', '3'), +('16', '63', '11', '1554', '11590', '3'), +('16', '63', '11', '26758', '11070', '3'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '64', '22', '66397', '0', '3'), +('16', '64', '22', '62787', '0', '3'), +('16', '64', '22', '61948', '0', '3'), +('16', '64', '22', '21805', '0', '3'), +('16', '64', '1', '26775', '16406', '3'), +('16', '64', '1', '28962', '15121', '3'), +('16', '64', '1', '28945', '12565', '3'), +('16', '64', '1', '29861', '11727', '3'), +('16', '64', '2', '26759', '14388', '3'), +('16', '64', '2', '2612', '12740', '3'), +('16', '64', '2', '26025', '12740', '3'), +('16', '64', '2', '29648', '12232', '3'), +('16', '64', '3', '26773', '16679', '3'), +('16', '64', '3', '28942', '13384', '3'), +('16', '64', '3', '28963', '11893', '3'), +('16', '64', '3', '31233', '11341', '3'), +('16', '64', '5', '8364', '18236', '3'), +('16', '64', '5', '28885', '17515', '3'), +('16', '64', '5', '27266', '13316', '3'), +('16', '64', '5', '7868', '13115', '3'), +('16', '64', '8', '26765', '20095', '3'), +('16', '64', '8', '26766', '19836', '3'), +('16', '64', '8', '31471', '19209', '3'), +('16', '64', '8', '28918', '13775', '3'), +('16', '64', '6', '28902', '20321', '3'), +('16', '64', '6', '28919', '13411', '3'), +('16', '64', '6', '31472', '13171', '3'), +('16', '64', '6', '30551', '13142', '3'), +('16', '64', '17', '28951', '12313', '3'), +('16', '64', '17', '30564', '11455', '3'), +('16', '64', '17', '10845', '10795', '3'), +('16', '64', '17', '27159', '10184', '3'), +('16', '64', '7', '26771', '16641', '3'), +('16', '64', '7', '28926', '14823', '3'), +('16', '64', '7', '7868', '13115', '3'), +('16', '64', '7', '26584', '12384', '3'), +('16', '64', '9', '31461', '19111', '3'), +('16', '64', '9', '7868', '13115', '3'), +('16', '64', '9', '26584', '12384', '3'), +('16', '64', '9', '5723', '11608', '3'), +('16', '64', '15', '26749', '14884', '3'), +('16', '64', '15', '27950', '11686', '3'), +('16', '64', '15', '26757', '11645', '3'), +('16', '64', '15', '63170', '11620', '3'), +('16', '64', '20', '31235', '18412', '3'), +('16', '64', '20', '28890', '17538', '3'), +('16', '64', '20', '31334', '16223', '3'), +('16', '64', '20', '26551', '15067', '3'), +('16', '64', '12', '25857', '17134', '3'), +('16', '64', '12', '28967', '14813', '3'), +('16', '64', '12', '28958', '12696', '3'), +('16', '64', '12', '26774', '12436', '3'), +('16', '64', '18', '28965', '14421', '3'), +('16', '64', '18', '26755', '11577', '3'), +('16', '64', '18', '28932', '11362', '3'), +('16', '64', '18', '8289', '11263', '3'), +('16', '64', '19', '30569', '19978', '3'), +('16', '64', '19', '51226', '17426', '3'), +('16', '64', '19', '28888', '15571', '3'), +('16', '64', '19', '7871', '11450', '3'), +('16', '64', '13', '28824', '126160', '3'), +('16', '64', '13', '31242', '117628', '3'), +('16', '64', '13', '30530', '117499', '3'), +('16', '64', '13', '28825', '115301', '3'), +('16', '64', '14', '26758', '11071', '3'), +('16', '64', '14', '27960', '5559', '3'), +('16', '64', '14', '27929', '3167', '3'), +('16', '64', '14', '14762', '2003', '3'), +('16', '64', '11', '26563', '16433', '3'), +('16', '64', '11', '30565', '12941', '3'), +('16', '64', '11', '1554', '11591', '3'), +('16', '64', '11', '26758', '11071', '3'), +('16', '65', '22', '62787', '0', '7'), +('16', '65', '22', '21810', '0', '7'), +('16', '65', '22', '66397', '0', '7'), +('16', '65', '22', '61948', '0', '7'), +('16', '65', '1', '68949', '37460', '7'), +('16', '65', '1', '69166', '35119', '7'), +('16', '65', '1', '7125', '29920', '7'), +('16', '65', '1', '69063', '28861', '7'), +('16', '65', '2', '28605', '29479', '7'), +('16', '65', '2', '28648', '29368', '7'), +('16', '65', '2', '69088', '27242', '7'), +('16', '65', '2', '67727', '24697', '7'), +('16', '65', '3', '69157', '32087', '7'), +('16', '65', '3', '69069', '29593', '7'), +('16', '65', '3', '69074', '27437', '7'), +('16', '65', '3', '69068', '27059', '7'), +('16', '65', '5', '67625', '34381', '7'), +('16', '65', '5', '69135', '31691', '7'), +('16', '65', '5', '68808', '31530', '7'), +('16', '65', '5', '7769', '30025', '7'), +('16', '65', '8', '69165', '43655', '7'), +('16', '65', '8', '69064', '40676', '7'), +('16', '65', '8', '69072', '36996', '7'), +('16', '65', '8', '69065', '29110', '7'), +('16', '65', '6', '68757', '35989', '7'), +('16', '65', '6', '69130', '31439', '7'), +('16', '65', '6', '69073', '30710', '7'), +('16', '65', '6', '13674', '30096', '7'), +('16', '65', '17', '69151', '38322', '7'), +('16', '65', '17', '68976', '28230', '7'), +('16', '65', '17', '68780', '28017', '7'), +('16', '65', '17', '55511', '24615', '7'), +('16', '65', '7', '69169', '29684', '7'), +('16', '65', '7', '69080', '29139', '7'), +('16', '65', '7', '68706', '29096', '7'), +('16', '65', '7', '68891', '27297', '7'), +('16', '65', '9', '69127', '33381', '7'), +('16', '65', '9', '69099', '29433', '7'), +('16', '65', '9', '68766', '26731', '7'), +('16', '65', '9', '68894', '25038', '7'), +('16', '65', '15', '69160', '32924', '7'), +('16', '65', '15', '69070', '31206', '7'), +('16', '65', '15', '69131', '30803', '7'), +('16', '65', '15', '69061', '29058', '7'), +('16', '65', '20', '69134', '37274', '7'), +('16', '65', '20', '16156', '37134', '7'), +('16', '65', '20', '67625', '34381', '7'), +('16', '65', '20', '68951', '29271', '7'), +('16', '65', '12', '69253', '31417', '7'), +('16', '65', '12', '69084', '26695', '7'), +('16', '65', '12', '28246', '25259', '7'), +('16', '65', '12', '68892', '23933', '7'), +('16', '65', '18', '69147', '36201', '7'), +('16', '65', '18', '68977', '30373', '7'), +('16', '65', '18', '68749', '27319', '7'), +('16', '65', '18', '28651', '24851', '7'), +('16', '65', '19', '69178', '30743', '7'), +('16', '65', '19', '69076', '28568', '7'), +('16', '65', '19', '68893', '27127', '7'), +('16', '65', '19', '19094', '23046', '7'), +('16', '65', '13', '69117', '208898', '7'), +('16', '65', '13', '69043', '191301', '7'), +('16', '65', '13', '68741', '186265', '7'), +('16', '65', '13', '69096', '186166', '7'), +('16', '65', '14', '69155', '30509', '7'), +('16', '65', '14', '28656', '20306', '7'), +('16', '65', '14', '69428', '18218', '7'), +('16', '65', '14', '26788', '17498', '7'), +('16', '65', '11', '68809', '42065', '7'), +('16', '65', '11', '67606', '34151', '7'), +('16', '65', '11', '69158', '32734', '7'), +('16', '65', '11', '68952', '32605', '7'), +('16', '65', '22', '62787', '0', '6'), +('16', '65', '22', '21810', '0', '6'), +('16', '65', '22', '66397', '0', '6'), +('16', '65', '22', '61948', '0', '6'), +('16', '65', '1', '7125', '29920', '6'), +('16', '65', '1', '32106', '25884', '6'), +('16', '65', '1', '7123', '25405', '6'), +('16', '65', '1', '4119', '20820', '6'), +('16', '65', '2', '28605', '29479', '6'), +('16', '65', '2', '28648', '29368', '6'), +('16', '65', '2', '28653', '16613', '6'), +('16', '65', '2', '55513', '16198', '6'), +('16', '65', '3', '26982', '25509', '6'), +('16', '65', '3', '29174', '21302', '6'), +('16', '65', '3', '9435', '20850', '6'), +('16', '65', '3', '12592', '19956', '6'), +('16', '65', '5', '7769', '30025', '6'), +('16', '65', '5', '8977', '24493', '6'), +('16', '65', '5', '28654', '23125', '6'), +('16', '65', '5', '8774', '18795', '6'), +('16', '65', '8', '15805', '25001', '6'), +('16', '65', '8', '15824', '22989', '6'), +('16', '65', '8', '15842', '21478', '6'), +('16', '65', '8', '15847', '20692', '6'), +('16', '65', '6', '13674', '30096', '6'), +('16', '65', '6', '19144', '23076', '6'), +('16', '65', '6', '28658', '21438', '6'), +('16', '65', '6', '28902', '20323', '6'), +('16', '65', '17', '55511', '24615', '6'), +('16', '65', '17', '14961', '20601', '6'), +('16', '65', '17', '69403', '19129', '6'), +('16', '65', '17', '68076', '17068', '6'), +('16', '65', '7', '16097', '24212', '6'), +('16', '65', '7', '68197', '22537', '6'), +('16', '65', '7', '55508', '19690', '6'), +('16', '65', '7', '26771', '16642', '6'), +('16', '65', '9', '16097', '24212', '6'), +('16', '65', '9', '21993', '24120', '6'), +('16', '65', '9', '11096', '23632', '6'), +('16', '65', '9', '28666', '23388', '6'), +('16', '65', '15', '26989', '23917', '6'), +('16', '65', '15', '68111', '23150', '6'), +('16', '65', '15', '9959', '23008', '6'), +('16', '65', '15', '10948', '21702', '6'), +('16', '65', '20', '16156', '37134', '6'), +('16', '65', '20', '22880', '24374', '6'), +('16', '65', '20', '16097', '24212', '6'), +('16', '65', '20', '15873', '22035', '6'), +('16', '65', '12', '28246', '25259', '6'), +('16', '65', '12', '27000', '23650', '6'), +('16', '65', '12', '55514', '19319', '6'), +('16', '65', '12', '25857', '17134', '6'), +('16', '65', '18', '28651', '24851', '6'), +('16', '65', '18', '55512', '22177', '6'), +('16', '65', '18', '28965', '14423', '6'), +('16', '65', '18', '26755', '11577', '6'), +('16', '65', '19', '19094', '23046', '6'), +('16', '65', '19', '30569', '19980', '6'), +('16', '65', '19', '26988', '19785', '6'), +('16', '65', '19', '55509', '18151', '6'), +('16', '65', '13', '26092', '174705', '6'), +('16', '65', '13', '24879', '156197', '6'), +('16', '65', '13', '29172', '149436', '6'), +('16', '65', '13', '68199', '143505', '6'), +('16', '65', '14', '28656', '20306', '6'), +('16', '65', '14', '26788', '17498', '6'), +('16', '65', '14', '28798', '13251', '6'), +('16', '65', '14', '26758', '11073', '6'), +('16', '65', '11', '26987', '29853', '6'), +('16', '65', '11', '20496', '25962', '6'), +('16', '65', '11', '14733', '23338', '6'), +('16', '65', '11', '20625', '21437', '6'), +('16', '65', '22', '62787', '0', '5'), +('16', '65', '22', '21810', '0', '5'), +('16', '65', '22', '66397', '0', '5'), +('16', '65', '22', '61948', '0', '5'), +('16', '65', '1', '7125', '29920', '5'), +('16', '65', '1', '32106', '25884', '5'), +('16', '65', '1', '7123', '25405', '5'), +('16', '65', '1', '4119', '20820', '5'), +('16', '65', '2', '28605', '29479', '5'), +('16', '65', '2', '28648', '29368', '5'), +('16', '65', '2', '28653', '16613', '5'), +('16', '65', '2', '55513', '16198', '5'), +('16', '65', '3', '26982', '25509', '5'), +('16', '65', '3', '29174', '21302', '5'), +('16', '65', '3', '9435', '20850', '5'), +('16', '65', '3', '12592', '19956', '5'), +('16', '65', '5', '7769', '30025', '5'), +('16', '65', '5', '8977', '24493', '5'), +('16', '65', '5', '28654', '23125', '5'), +('16', '65', '5', '8774', '18795', '5'), +('16', '65', '8', '15805', '25001', '5'), +('16', '65', '8', '15824', '22989', '5'), +('16', '65', '8', '15842', '21478', '5'), +('16', '65', '8', '15847', '20692', '5'), +('16', '65', '6', '13674', '30096', '5'), +('16', '65', '6', '19144', '23076', '5'), +('16', '65', '6', '28658', '21438', '5'), +('16', '65', '6', '28902', '20323', '5'), +('16', '65', '17', '55511', '24615', '5'), +('16', '65', '17', '14961', '20601', '5'), +('16', '65', '17', '30923', '13088', '5'), +('16', '65', '17', '14962', '12451', '5'), +('16', '65', '7', '16097', '24212', '5'), +('16', '65', '7', '68197', '22537', '5'), +('16', '65', '7', '55508', '19690', '5'), +('16', '65', '7', '26771', '16642', '5'), +('16', '65', '9', '16097', '24212', '5'), +('16', '65', '9', '21993', '24120', '5'), +('16', '65', '9', '11096', '23632', '5'), +('16', '65', '9', '28666', '23388', '5'), +('16', '65', '15', '26989', '23917', '5'), +('16', '65', '15', '9959', '23008', '5'), +('16', '65', '15', '10948', '21702', '5'), +('16', '65', '15', '26993', '21030', '5'), +('16', '65', '20', '16156', '37134', '5'), +('16', '65', '20', '22880', '24374', '5'), +('16', '65', '20', '16097', '24212', '5'), +('16', '65', '20', '15873', '22035', '5'), +('16', '65', '12', '28246', '25259', '5'), +('16', '65', '12', '27000', '23650', '5'), +('16', '65', '12', '55514', '19319', '5'), +('16', '65', '12', '25857', '17134', '5'), +('16', '65', '18', '28651', '24851', '5'), +('16', '65', '18', '55512', '22177', '5'), +('16', '65', '18', '28965', '14423', '5'), +('16', '65', '18', '26755', '11577', '5'), +('16', '65', '19', '19094', '23046', '5'), +('16', '65', '19', '30569', '19980', '5'), +('16', '65', '19', '26988', '19785', '5'), +('16', '65', '19', '55509', '18151', '5'), +('16', '65', '13', '26092', '174705', '5'), +('16', '65', '13', '24879', '156197', '5'), +('16', '65', '13', '29172', '149436', '5'), +('16', '65', '13', '68199', '143505', '5'), +('16', '65', '14', '28656', '20306', '5'), +('16', '65', '14', '26788', '17498', '5'), +('16', '65', '14', '28798', '13251', '5'), +('16', '65', '14', '26758', '11073', '5'), +('16', '65', '11', '26987', '29853', '5'), +('16', '65', '11', '20496', '25962', '5'), +('16', '65', '11', '14733', '23338', '5'), +('16', '65', '11', '20625', '21437', '5'), +('16', '65', '22', '62787', '0', '4'), +('16', '65', '22', '21810', '0', '4'), +('16', '65', '22', '66397', '0', '4'), +('16', '65', '22', '61948', '0', '4'), +('16', '65', '1', '7125', '29920', '4'), +('16', '65', '1', '32106', '25884', '4'), +('16', '65', '1', '7123', '25405', '4'), +('16', '65', '1', '4119', '20820', '4'), +('16', '65', '2', '28605', '29479', '4'), +('16', '65', '2', '28648', '29368', '4'), +('16', '65', '2', '28653', '16613', '4'), +('16', '65', '2', '55513', '16198', '4'), +('16', '65', '3', '26982', '25509', '4'), +('16', '65', '3', '29174', '21302', '4'), +('16', '65', '3', '9435', '20850', '4'), +('16', '65', '3', '12592', '19956', '4'), +('16', '65', '5', '7769', '30025', '4'), +('16', '65', '5', '8977', '24493', '4'), +('16', '65', '5', '28654', '23125', '4'), +('16', '65', '5', '8774', '18795', '4'), +('16', '65', '8', '15805', '25001', '4'), +('16', '65', '8', '15824', '22989', '4'), +('16', '65', '8', '15842', '21478', '4'), +('16', '65', '8', '15847', '20692', '4'), +('16', '65', '6', '13674', '30096', '4'), +('16', '65', '6', '19144', '23076', '4'), +('16', '65', '6', '28658', '21438', '4'), +('16', '65', '6', '28902', '20323', '4'), +('16', '65', '17', '55511', '24615', '4'), +('16', '65', '17', '14961', '20601', '4'), +('16', '65', '17', '30923', '13088', '4'), +('16', '65', '17', '14962', '12451', '4'), +('16', '65', '7', '16097', '24212', '4'), +('16', '65', '7', '68197', '22537', '4'), +('16', '65', '7', '55508', '19690', '4'), +('16', '65', '7', '26771', '16642', '4'), +('16', '65', '9', '16097', '24212', '4'), +('16', '65', '9', '21993', '24120', '4'), +('16', '65', '9', '11096', '23632', '4'), +('16', '65', '9', '28666', '23388', '4'), +('16', '65', '15', '26989', '23917', '4'), +('16', '65', '15', '9959', '23008', '4'), +('16', '65', '15', '10948', '21702', '4'), +('16', '65', '15', '26993', '21030', '4'), +('16', '65', '20', '16156', '37134', '4'), +('16', '65', '20', '22880', '24374', '4'), +('16', '65', '20', '16097', '24212', '4'), +('16', '65', '20', '15873', '22035', '4'), +('16', '65', '12', '28246', '25259', '4'), +('16', '65', '12', '27000', '23650', '4'), +('16', '65', '12', '55514', '19319', '4'), +('16', '65', '12', '25857', '17134', '4'), +('16', '65', '18', '28651', '24851', '4'), +('16', '65', '18', '55512', '22177', '4'), +('16', '65', '18', '28965', '14423', '4'), +('16', '65', '18', '26755', '11577', '4'), +('16', '65', '19', '19094', '23046', '4'), +('16', '65', '19', '30569', '19980', '4'), +('16', '65', '19', '26988', '19785', '4'), +('16', '65', '19', '55509', '18151', '4'), +('16', '65', '13', '26092', '174705', '4'), +('16', '65', '13', '24879', '156197', '4'), +('16', '65', '13', '29172', '149436', '4'), +('16', '65', '13', '68199', '143505', '4'), +('16', '65', '14', '28656', '20306', '4'), +('16', '65', '14', '26788', '17498', '4'), +('16', '65', '14', '28798', '13251', '4'), +('16', '65', '14', '26758', '11073', '4'), +('16', '65', '11', '26987', '29853', '4'), +('16', '65', '11', '20496', '25962', '4'), +('16', '65', '11', '14733', '23338', '4'), +('16', '65', '11', '20625', '21437', '4'), +('16', '66', '22', '62787', '0', '7'), +('16', '66', '22', '21810', '0', '7'), +('16', '66', '22', '66397', '0', '7'), +('16', '66', '22', '61948', '0', '7'), +('16', '66', '1', '68949', '37462', '7'), +('16', '66', '1', '69166', '35121', '7'), +('16', '66', '1', '7125', '29921', '7'), +('16', '66', '1', '69063', '28863', '7'), +('16', '66', '2', '28605', '29480', '7'), +('16', '66', '2', '28648', '29368', '7'), +('16', '66', '2', '69088', '27244', '7'), +('16', '66', '2', '67727', '24700', '7'), +('16', '66', '3', '69157', '32089', '7'), +('16', '66', '3', '69069', '29596', '7'), +('16', '66', '3', '69074', '27439', '7'), +('16', '66', '3', '69068', '27061', '7'), +('16', '66', '5', '67625', '34382', '7'), +('16', '66', '5', '69135', '31694', '7'), +('16', '66', '5', '68808', '31532', '7'), +('16', '66', '5', '7769', '30025', '7'), +('16', '66', '8', '69165', '43658', '7'), +('16', '66', '8', '69064', '40677', '7'), +('16', '66', '8', '69072', '36998', '7'), +('16', '66', '8', '69065', '29112', '7'), +('16', '66', '6', '68757', '35991', '7'), +('16', '66', '6', '69130', '31441', '7'), +('16', '66', '6', '69073', '30710', '7'), +('16', '66', '6', '13674', '30098', '7'), +('16', '66', '17', '69151', '38325', '7'), +('16', '66', '17', '68976', '28232', '7'), +('16', '66', '17', '68780', '28020', '7'), +('16', '66', '17', '55511', '24618', '7'), +('16', '66', '7', '69169', '29686', '7'), +('16', '66', '7', '69080', '29141', '7'), +('16', '66', '7', '68706', '29097', '7'), +('16', '66', '7', '68891', '27300', '7'), +('16', '66', '9', '69127', '33382', '7'), +('16', '66', '9', '69099', '29435', '7'), +('16', '66', '9', '68766', '26733', '7'), +('16', '66', '9', '68894', '25040', '7'), +('16', '66', '15', '69160', '32926', '7'), +('16', '66', '15', '69070', '31207', '7'), +('16', '66', '15', '69131', '30803', '7'), +('16', '66', '15', '69061', '29061', '7'), +('16', '66', '20', '69134', '37276', '7'), +('16', '66', '20', '16156', '37136', '7'), +('16', '66', '20', '67625', '34382', '7'), +('16', '66', '20', '68951', '29273', '7'), +('16', '66', '12', '69253', '31420', '7'), +('16', '66', '12', '69084', '26695', '7'), +('16', '66', '12', '28246', '25260', '7'), +('16', '66', '12', '68892', '23935', '7'), +('16', '66', '18', '69147', '36203', '7'), +('16', '66', '18', '68977', '30375', '7'), +('16', '66', '18', '68749', '27321', '7'), +('16', '66', '18', '28651', '24854', '7'), +('16', '66', '19', '69178', '30745', '7'), +('16', '66', '19', '69076', '28570', '7'), +('16', '66', '19', '68893', '27128', '7'), +('16', '66', '19', '19094', '23047', '7'), +('16', '66', '13', '69117', '209424', '7'), +('16', '66', '13', '69043', '191795', '7'), +('16', '66', '13', '68741', '186771', '7'), +('16', '66', '13', '69096', '186659', '7'), +('16', '66', '14', '69155', '30511', '7'), +('16', '66', '14', '28656', '20306', '7'), +('16', '66', '14', '69428', '18219', '7'), +('16', '66', '14', '26788', '17500', '7'), +('16', '66', '11', '68809', '42318', '7'), +('16', '66', '11', '67606', '34153', '7'), +('16', '66', '11', '69158', '32736', '7'), +('16', '66', '11', '68952', '32607', '7'), +('16', '67', '22', '62787', '0', '7'), +('16', '67', '22', '21810', '0', '7'), +('16', '67', '22', '66397', '0', '7'), +('16', '67', '22', '61948', '0', '7'), +('16', '67', '1', '68949', '37465', '7'), +('16', '67', '1', '69166', '35123', '7'), +('16', '67', '1', '7125', '29922', '7'), +('16', '67', '1', '69063', '28866', '7'), +('16', '67', '2', '28605', '29482', '7'), +('16', '67', '2', '28648', '29368', '7'), +('16', '67', '2', '69088', '27246', '7'), +('16', '67', '2', '67727', '24703', '7'), +('16', '67', '3', '69157', '32091', '7'), +('16', '67', '3', '69069', '29600', '7'), +('16', '67', '3', '69074', '27441', '7'), +('16', '67', '3', '69068', '27063', '7'), +('16', '67', '5', '67625', '34384', '7'), +('16', '67', '5', '69135', '31697', '7'), +('16', '67', '5', '68808', '31534', '7'), +('16', '67', '5', '7769', '30025', '7'), +('16', '67', '8', '69165', '43661', '7'), +('16', '67', '8', '69064', '40679', '7'), +('16', '67', '8', '69072', '37001', '7'), +('16', '67', '8', '69065', '29115', '7'), +('16', '67', '6', '68757', '35993', '7'), +('16', '67', '6', '69130', '31443', '7'), +('16', '67', '6', '69073', '30710', '7'), +('16', '67', '6', '13674', '30100', '7'), +('16', '67', '17', '69151', '38327', '7'), +('16', '67', '17', '68976', '28235', '7'), +('16', '67', '17', '68780', '28023', '7'), +('16', '67', '17', '55511', '24620', '7'), +('16', '67', '7', '69169', '29688', '7'), +('16', '67', '7', '69080', '29143', '7'), +('16', '67', '7', '68706', '29099', '7'), +('16', '67', '7', '68891', '27303', '7'), +('16', '67', '9', '69127', '33384', '7'), +('16', '67', '9', '69099', '29436', '7'), +('16', '67', '9', '68766', '26735', '7'), +('16', '67', '9', '68894', '25041', '7'), +('16', '67', '15', '69160', '32928', '7'), +('16', '67', '15', '69070', '31209', '7'), +('16', '67', '15', '69131', '30803', '7'), +('16', '67', '15', '69061', '29065', '7'), +('16', '67', '20', '69134', '37278', '7'), +('16', '67', '20', '16156', '37138', '7'), +('16', '67', '20', '67625', '34384', '7'), +('16', '67', '20', '68951', '29276', '7'), +('16', '67', '12', '69253', '31423', '7'), +('16', '67', '12', '69084', '26695', '7'), +('16', '67', '12', '28246', '25262', '7'), +('16', '67', '12', '68892', '23937', '7'), +('16', '67', '18', '69147', '36206', '7'), +('16', '67', '18', '68977', '30376', '7'), +('16', '67', '18', '68749', '27323', '7'), +('16', '67', '18', '28651', '24857', '7'), +('16', '67', '19', '69178', '30748', '7'), +('16', '67', '19', '69076', '28571', '7'), +('16', '67', '19', '68893', '27129', '7'), +('16', '67', '19', '19094', '23049', '7'), +('16', '67', '13', '69117', '210000', '7'), +('16', '67', '13', '69043', '192290', '7'), +('16', '67', '13', '68741', '187328', '7'), +('16', '67', '13', '69096', '187152', '7'), +('16', '67', '14', '69155', '30513', '7'), +('16', '67', '14', '28656', '20306', '7'), +('16', '67', '14', '69428', '18220', '7'), +('16', '67', '14', '26788', '17503', '7'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '67', '11', '68809', '42570', '7'), +('16', '67', '11', '67606', '34156', '7'), +('16', '67', '11', '69158', '32738', '7'), +('16', '67', '11', '68952', '32609', '7'), +('16', '68', '22', '62787', '0', '7'), +('16', '68', '22', '21810', '0', '7'), +('16', '68', '22', '66397', '0', '7'), +('16', '68', '22', '61948', '0', '7'), +('16', '68', '1', '68949', '37468', '7'), +('16', '68', '1', '69166', '35125', '7'), +('16', '68', '1', '7125', '29923', '7'), +('16', '68', '1', '69063', '28868', '7'), +('16', '68', '2', '28605', '29483', '7'), +('16', '68', '2', '28648', '29368', '7'), +('16', '68', '2', '69088', '27248', '7'), +('16', '68', '2', '67727', '24705', '7'), +('16', '68', '3', '69157', '32093', '7'), +('16', '68', '3', '69069', '29603', '7'), +('16', '68', '3', '69074', '27443', '7'), +('16', '68', '3', '69068', '27065', '7'), +('16', '68', '5', '67625', '34385', '7'), +('16', '68', '5', '69135', '31700', '7'), +('16', '68', '5', '68808', '31535', '7'), +('16', '68', '5', '7769', '30025', '7'), +('16', '68', '8', '69165', '43663', '7'), +('16', '68', '8', '69064', '40680', '7'), +('16', '68', '8', '69072', '37003', '7'), +('16', '68', '8', '69065', '29117', '7'), +('16', '68', '6', '68757', '35995', '7'), +('16', '68', '6', '69130', '31445', '7'), +('16', '68', '6', '69073', '30710', '7'), +('16', '68', '6', '13674', '30102', '7'), +('16', '68', '17', '69151', '38330', '7'), +('16', '68', '17', '68976', '28238', '7'), +('16', '68', '17', '68780', '28025', '7'), +('16', '68', '17', '55511', '24623', '7'), +('16', '68', '7', '69169', '29690', '7'), +('16', '68', '7', '69080', '29145', '7'), +('16', '68', '7', '68706', '29100', '7'), +('16', '68', '7', '68891', '27306', '7'), +('16', '68', '9', '69127', '33385', '7'), +('16', '68', '9', '69099', '29438', '7'), +('16', '68', '9', '68766', '26737', '7'), +('16', '68', '9', '68894', '25043', '7'), +('16', '68', '15', '69160', '32930', '7'), +('16', '68', '15', '69070', '31210', '7'), +('16', '68', '15', '69131', '30803', '7'), +('16', '68', '15', '69061', '29068', '7'), +('16', '68', '20', '69134', '37280', '7'), +('16', '68', '20', '16156', '37140', '7'), +('16', '68', '20', '67625', '34385', '7'), +('16', '68', '20', '68951', '29278', '7'), +('16', '68', '12', '69253', '31425', '7'), +('16', '68', '12', '69084', '26695', '7'), +('16', '68', '12', '28246', '25263', '7'), +('16', '68', '12', '68892', '23940', '7'), +('16', '68', '18', '69147', '36208', '7'), +('16', '68', '18', '68977', '30378', '7'), +('16', '68', '18', '68749', '27325', '7'), +('16', '68', '18', '28651', '24860', '7'), +('16', '68', '19', '69178', '30750', '7'), +('16', '68', '19', '69076', '28573', '7'), +('16', '68', '19', '68893', '27130', '7'), +('16', '68', '19', '19094', '23050', '7'), +('16', '68', '13', '69117', '210525', '7'), +('16', '68', '13', '69043', '192784', '7'), +('16', '68', '13', '68741', '187884', '7'), +('16', '68', '13', '69096', '187645', '7'), +('16', '68', '14', '69155', '30515', '7'), +('16', '68', '14', '28656', '20306', '7'), +('16', '68', '14', '69428', '18222', '7'), +('16', '68', '14', '26788', '17506', '7'), +('16', '68', '11', '68809', '42823', '7'), +('16', '68', '11', '67606', '34158', '7'), +('16', '68', '11', '69158', '32740', '7'), +('16', '68', '11', '68952', '32611', '7'), +('16', '69', '22', '62787', '0', '7'), +('16', '69', '22', '21810', '0', '7'), +('16', '69', '22', '66397', '0', '7'), +('16', '69', '22', '61948', '0', '7'), +('16', '69', '1', '68949', '37470', '7'), +('16', '69', '1', '69166', '35127', '7'), +('16', '69', '1', '7125', '29924', '7'), +('16', '69', '1', '69063', '28870', '7'), +('16', '69', '2', '28605', '29484', '7'), +('16', '69', '2', '28648', '29368', '7'), +('16', '69', '2', '69088', '27250', '7'), +('16', '69', '2', '67727', '24708', '7'), +('16', '69', '3', '69157', '32095', '7'), +('16', '69', '3', '69069', '29606', '7'), +('16', '69', '3', '69074', '27445', '7'), +('16', '69', '3', '69068', '27067', '7'), +('16', '69', '5', '67625', '34387', '7'), +('16', '69', '5', '69135', '31703', '7'), +('16', '69', '5', '68808', '31537', '7'), +('16', '69', '5', '7769', '30025', '7'), +('16', '69', '8', '69165', '43666', '7'), +('16', '69', '8', '69064', '40682', '7'), +('16', '69', '8', '69072', '37005', '7'), +('16', '69', '8', '69065', '29120', '7'), +('16', '69', '6', '68757', '35997', '7'), +('16', '69', '6', '69130', '31447', '7'), +('16', '69', '6', '69073', '30710', '7'), +('16', '69', '6', '13674', '30105', '7'), +('16', '69', '17', '69151', '38333', '7'), +('16', '69', '17', '68976', '28240', '7'), +('16', '69', '17', '68780', '28028', '7'), +('16', '69', '17', '55511', '24626', '7'), +('16', '69', '7', '69169', '29692', '7'), +('16', '69', '7', '69080', '29147', '7'), +('16', '69', '7', '68706', '29102', '7'), +('16', '69', '7', '68891', '27309', '7'), +('16', '69', '9', '69127', '33387', '7'), +('16', '69', '9', '69099', '29439', '7'), +('16', '69', '9', '68766', '26740', '7'), +('16', '69', '9', '68894', '25044', '7'), +('16', '69', '15', '69160', '32932', '7'), +('16', '69', '15', '69070', '31212', '7'), +('16', '69', '15', '69131', '30803', '7'), +('16', '69', '15', '69061', '29071', '7'), +('16', '69', '20', '69134', '37282', '7'), +('16', '69', '20', '16156', '37142', '7'), +('16', '69', '20', '67625', '34387', '7'), +('16', '69', '20', '68951', '29280', '7'), +('16', '69', '12', '69253', '31428', '7'), +('16', '69', '12', '69084', '26695', '7'), +('16', '69', '12', '28246', '25264', '7'), +('16', '69', '12', '68892', '23942', '7'), +('16', '69', '18', '69147', '36210', '7'), +('16', '69', '18', '68977', '30379', '7'), +('16', '69', '18', '68749', '27327', '7'), +('16', '69', '18', '28651', '24863', '7'), +('16', '69', '19', '69178', '30752', '7'), +('16', '69', '19', '69076', '28574', '7'), +('16', '69', '19', '68893', '27132', '7'), +('16', '69', '19', '19094', '23051', '7'), +('16', '69', '13', '69117', '211101', '7'), +('16', '69', '13', '69043', '193278', '7'), +('16', '69', '13', '68741', '188441', '7'), +('16', '69', '13', '69096', '188138', '7'), +('16', '69', '14', '69155', '30517', '7'), +('16', '69', '14', '28656', '20306', '7'), +('16', '69', '14', '69428', '18223', '7'), +('16', '69', '14', '26788', '17508', '7'), +('16', '69', '11', '68809', '43075', '7'), +('16', '69', '11', '67606', '34160', '7'), +('16', '69', '11', '69158', '32742', '7'), +('16', '69', '11', '68952', '32613', '7'), +('16', '70', '22', '61948', '0', '11'), +('16', '70', '22', '66397', '0', '11'), +('16', '70', '22', '62787', '0', '11'), +('16', '70', '22', '21805', '0', '11'), +('16', '70', '1', '39276', '49730', '11'), +('16', '70', '1', '83594', '48593', '11'), +('16', '70', '1', '39363', '42338', '11'), +('16', '70', '1', '39329', '41290', '11'), +('16', '70', '2', '70958', '46662', '11'), +('16', '70', '2', '83561', '41034', '11'), +('16', '70', '2', '83551', '33811', '11'), +('16', '70', '2', '47209', '31280', '11'), +('16', '70', '3', '39361', '45182', '11'), +('16', '70', '3', '39218', '44569', '11'), +('16', '70', '3', '83658', '43118', '11'), +('16', '70', '3', '39319', '41424', '11'), +('16', '70', '5', '39349', '51386', '11'), +('16', '70', '5', '39262', '41849', '11'), +('16', '70', '5', '39274', '41284', '11'), +('16', '70', '5', '39313', '39734', '11'), +('16', '70', '8', '39330', '47328', '11'), +('16', '70', '8', '69165', '43669', '11'), +('16', '70', '8', '39286', '43099', '11'), +('16', '70', '8', '83659', '42815', '11'), +('16', '70', '6', '39367', '49284', '11'), +('16', '70', '6', '83660', '42355', '11'), +('16', '70', '6', '39327', '42340', '11'), +('16', '70', '6', '70717', '42093', '11'), +('16', '70', '17', '83604', '55735', '11'), +('16', '70', '17', '70963', '47942', '11'), +('16', '70', '17', '69151', '38335', '11'), +('16', '70', '17', '70713', '35629', '11'), +('16', '70', '7', '83565', '41124', '11'), +('16', '70', '7', '39273', '40206', '11'), +('16', '70', '7', '70959', '37391', '11'), +('16', '70', '7', '83495', '33172', '11'), +('16', '70', '9', '39345', '45820', '11'), +('16', '70', '9', '51707', '43101', '11'), +('16', '70', '9', '83653', '42653', '11'), +('16', '70', '9', '39291', '41498', '11'), +('16', '70', '15', '39373', '50145', '11'), +('16', '70', '15', '51703', '42062', '11'), +('16', '70', '15', '83661', '41482', '11'), +('16', '70', '15', '39321', '40357', '11'), +('16', '70', '20', '39339', '46007', '11'), +('16', '70', '20', '47283', '43005', '11'), +('16', '70', '20', '83650', '41612', '11'), +('16', '70', '20', '83611', '41129', '11'), +('16', '70', '12', '39356', '44228', '11'), +('16', '70', '12', '47213', '38760', '11'), +('16', '70', '12', '83569', '36909', '11'), +('16', '70', '12', '71080', '35482', '11'), +('16', '70', '18', '83608', '45700', '11'), +('16', '70', '18', '70964', '42654', '11'), +('16', '70', '18', '69147', '36212', '11'), +('16', '70', '18', '47201', '34305', '11'), +('16', '70', '19', '83573', '40434', '11'), +('16', '70', '19', '70962', '37175', '11'), +('16', '70', '19', '83541', '34745', '11'), +('16', '70', '19', '39231', '31071', '11'), +('16', '70', '13', '39294', '274769', '11'), +('16', '70', '13', '39254', '274699', '11'), +('16', '70', '13', '18609', '260276', '11'), +('16', '70', '13', '83579', '258536', '11'), +('16', '70', '14', '83640', '40192', '11'), +('16', '70', '14', '47309', '35631', '11'), +('16', '70', '14', '70708', '31864', '11'), +('16', '70', '14', '69155', '30520', '11'), +('16', '70', '11', '39311', '49417', '11'), +('16', '70', '11', '39371', '48812', '11'), +('16', '70', '11', '83657', '45978', '11'), +('16', '70', '11', '68809', '45095', '11'), +('16', '70', '22', '62787', '0', '10'), +('16', '70', '22', '21810', '0', '10'), +('16', '70', '22', '66397', '0', '10'), +('16', '70', '22', '61948', '0', '10'), +('16', '70', '1', '83594', '48593', '10'), +('16', '70', '1', '83630', '41169', '10'), +('16', '70', '1', '71624', '39651', '10'), +('16', '70', '1', '83627', '39317', '10'), +('16', '70', '2', '70958', '46662', '10'), +('16', '70', '2', '83561', '41034', '10'), +('16', '70', '2', '83551', '33811', '10'), +('16', '70', '2', '47209', '31280', '10'), +('16', '70', '3', '83658', '43118', '10'), +('16', '70', '3', '83636', '41087', '10'), +('16', '70', '3', '47245', '40100', '10'), +('16', '70', '3', '89512', '39099', '10'), +('16', '70', '5', '83599', '39724', '10'), +('16', '70', '5', '83651', '38643', '10'), +('16', '70', '5', '47273', '38215', '10'), +('16', '70', '5', '47275', '38031', '10'), +('16', '70', '8', '69165', '43669', '10'), +('16', '70', '8', '83659', '42815', '10'), +('16', '70', '8', '83637', '40760', '10'), +('16', '70', '8', '70986', '40716', '10'), +('16', '70', '6', '83660', '42355', '10'), +('16', '70', '6', '70717', '42093', '10'), +('16', '70', '6', '83530', '40206', '10'), +('16', '70', '6', '83622', '40061', '10'), +('16', '70', '17', '83604', '55735', '10'), +('16', '70', '17', '70963', '47942', '10'), +('16', '70', '17', '69151', '38335', '10'), +('16', '70', '17', '70713', '35629', '10'), +('16', '70', '7', '83565', '41124', '10'), +('16', '70', '7', '70959', '37391', '10'), +('16', '70', '7', '83495', '33172', '10'), +('16', '70', '7', '47205', '32744', '10'), +('16', '70', '9', '83653', '42653', '10'), +('16', '70', '9', '70960', '37041', '10'), +('16', '70', '9', '83466', '33443', '10'), +('16', '70', '9', '69127', '33389', '10'), +('16', '70', '15', '83661', '41482', '10'), +('16', '70', '15', '83592', '38864', '10'), +('16', '70', '15', '83629', '38017', '10'), +('16', '70', '15', '83595', '37348', '10'), +('16', '70', '20', '47283', '43005', '10'), +('16', '70', '20', '83650', '41612', '10'), +('16', '70', '20', '83611', '41129', '10'), +('16', '70', '20', '69134', '37285', '10'), +('16', '70', '12', '47213', '38760', '10'), +('16', '70', '12', '83569', '36909', '10'), +('16', '70', '12', '71080', '35482', '10'), +('16', '70', '12', '70961', '34852', '10'), +('16', '70', '18', '83608', '45700', '10'), +('16', '70', '18', '70964', '42654', '10'), +('16', '70', '18', '69147', '36212', '10'), +('16', '70', '18', '47201', '34305', '10'), +('16', '70', '19', '83573', '40434', '10'), +('16', '70', '19', '70962', '37175', '10'), +('16', '70', '19', '83541', '34745', '10'), +('16', '70', '19', '69178', '30754', '10'), +('16', '70', '13', '18609', '260276', '10'), +('16', '70', '13', '83579', '258536', '10'), +('16', '70', '13', '47320', '253347', '10'), +('16', '70', '13', '83664', '252421', '10'), +('16', '70', '14', '83640', '40192', '10'), +('16', '70', '14', '47309', '35631', '10'), +('16', '70', '14', '70708', '31864', '10'), +('16', '70', '14', '69155', '30520', '10'), +('16', '70', '11', '83657', '45978', '10'), +('16', '70', '11', '68809', '45095', '10'), +('16', '70', '11', '83666', '40325', '10'), +('16', '70', '11', '83633', '40325', '10'), +('16', '70', '22', '62787', '0', '9'), +('16', '70', '22', '21810', '0', '9'), +('16', '70', '22', '66397', '0', '9'), +('16', '70', '22', '61948', '0', '9'), +('16', '70', '1', '71624', '39651', '9'), +('16', '70', '1', '47287', '38500', '9'), +('16', '70', '1', '68949', '37473', '9'), +('16', '70', '1', '71668', '36430', '9'), +('16', '70', '2', '70958', '46662', '9'), +('16', '70', '2', '47209', '31280', '9'), +('16', '70', '2', '28605', '29485', '9'), +('16', '70', '2', '28648', '29368', '9'), +('16', '70', '3', '47245', '40100', '9'), +('16', '70', '3', '47299', '36113', '9'), +('16', '70', '3', '56017', '33376', '9'), +('16', '70', '3', '47301', '33199', '9'), +('16', '70', '5', '47273', '38215', '9'), +('16', '70', '5', '47275', '38031', '9'), +('16', '70', '5', '67625', '34389', '9'), +('16', '70', '5', '47274', '34230', '9'), +('16', '70', '8', '69165', '43669', '9'), +('16', '70', '8', '70986', '40716', '9'), +('16', '70', '8', '69064', '40683', '9'), +('16', '70', '8', '69072', '37007', '9'), +('16', '70', '6', '70717', '42093', '9'), +('16', '70', '6', '68757', '36000', '9'), +('16', '70', '6', '47279', '35439', '9'), +('16', '70', '6', '71654', '35156', '9'), +('16', '70', '17', '70963', '47942', '9'), +('16', '70', '17', '69151', '38335', '9'), +('16', '70', '17', '70713', '35629', '9'), +('16', '70', '17', '71639', '31431', '9'), +('16', '70', '7', '70959', '37391', '9'), +('16', '70', '7', '47205', '32744', '9'), +('16', '70', '7', '70711', '32618', '9'), +('16', '70', '7', '69169', '29694', '9'), +('16', '70', '9', '70960', '37041', '9'), +('16', '70', '9', '69127', '33389', '9'), +('16', '70', '9', '47221', '31966', '9'), +('16', '70', '9', '69099', '29441', '9'), +('16', '70', '15', '47291', '35125', '9'), +('16', '70', '15', '47294', '34978', '9'), +('16', '70', '15', '71117', '34573', '9'), +('16', '70', '15', '70621', '33957', '9'), +('16', '70', '20', '47283', '43005', '9'), +('16', '70', '20', '69134', '37285', '9'), +('16', '70', '20', '16156', '37144', '9'), +('16', '70', '20', '71664', '36942', '9'), +('16', '70', '12', '47213', '38760', '9'), +('16', '70', '12', '71080', '35482', '9'), +('16', '70', '12', '70961', '34852', '9'), +('16', '70', '12', '69253', '31431', '9'), +('16', '70', '18', '70964', '42654', '9'), +('16', '70', '18', '69147', '36212', '9'), +('16', '70', '18', '47201', '34305', '9'), +('16', '70', '18', '71647', '32762', '9'), +('16', '70', '19', '70962', '37175', '9'), +('16', '70', '19', '69178', '30754', '9'), +('16', '70', '19', '47217', '30459', '9'), +('16', '70', '19', '69076', '28576', '9'), +('16', '70', '13', '18609', '260276', '9'), +('16', '70', '13', '47320', '253347', '9'), +('16', '70', '13', '47324', '251251', '9'), +('16', '70', '13', '71663', '248995', '9'), +('16', '70', '14', '47309', '35631', '9'), +('16', '70', '14', '70708', '31864', '9'), +('16', '70', '14', '69155', '30520', '9'), +('16', '70', '14', '28656', '20306', '9'), +('16', '70', '11', '68809', '45095', '9'), +('16', '70', '11', '47297', '35963', '9'), +('16', '70', '11', '47295', '35404', '9'), +('16', '70', '11', '71659', '34319', '9'), +('16', '70', '22', '62787', '0', '8'), +('16', '70', '22', '21810', '0', '8'), +('16', '70', '22', '66397', '0', '8'), +('16', '70', '22', '61948', '0', '8'), +('16', '70', '1', '47287', '38500', '8'), +('16', '70', '1', '68949', '37473', '8'), +('16', '70', '1', '47289', '36206', '8'), +('16', '70', '1', '69166', '35129', '8'), +('16', '70', '2', '70958', '46662', '8'), +('16', '70', '2', '47209', '31280', '8'), +('16', '70', '2', '28605', '29485', '8'), +('16', '70', '2', '28648', '29368', '8'), +('16', '70', '3', '47245', '40100', '8'), +('16', '70', '3', '47299', '36113', '8'), +('16', '70', '3', '56017', '33376', '8'), +('16', '70', '3', '47301', '33199', '8'), +('16', '70', '5', '47273', '38215', '8'), +('16', '70', '5', '47275', '38031', '8'), +('16', '70', '5', '67625', '34389', '8'), +('16', '70', '5', '47274', '34230', '8'), +('16', '70', '8', '69165', '43669', '8'), +('16', '70', '8', '69064', '40683', '8'), +('16', '70', '8', '69072', '37007', '8'), +('16', '70', '8', '47305', '36974', '8'), +('16', '70', '6', '70717', '42093', '8'), +('16', '70', '6', '68757', '36000', '8'), +('16', '70', '6', '47279', '35439', '8'), +('16', '70', '6', '47277', '33488', '8'), +('16', '70', '17', '70963', '47942', '8'), +('16', '70', '17', '69151', '38335', '8'), +('16', '70', '17', '70713', '35629', '8'), +('16', '70', '17', '68976', '28243', '8'), +('16', '70', '7', '70959', '37391', '8'), +('16', '70', '7', '47205', '32744', '8'), +('16', '70', '7', '70711', '32618', '8'), +('16', '70', '7', '69169', '29694', '8'), +('16', '70', '9', '70960', '37041', '8'), +('16', '70', '9', '69127', '33389', '8'), +('16', '70', '9', '47221', '31966', '8'), +('16', '70', '9', '69099', '29441', '8'), +('16', '70', '15', '47291', '35125', '8'), +('16', '70', '15', '47294', '34978', '8'), +('16', '70', '15', '71117', '34573', '8'), +('16', '70', '15', '70621', '33957', '8'), +('16', '70', '20', '47283', '43005', '8'), +('16', '70', '20', '69134', '37285', '8'), +('16', '70', '20', '16156', '37144', '8'), +('16', '70', '20', '47282', '36252', '8'), +('16', '70', '12', '47213', '38760', '8'), +('16', '70', '12', '71080', '35482', '8'), +('16', '70', '12', '70961', '34852', '8'), +('16', '70', '12', '69253', '31431', '8'), +('16', '70', '18', '70964', '42654', '8'), +('16', '70', '18', '69147', '36212', '8'), +('16', '70', '18', '47201', '34305', '8'), +('16', '70', '18', '71096', '30951', '8'), +('16', '70', '19', '70962', '37175', '8'), +('16', '70', '19', '69178', '30754', '8'), +('16', '70', '19', '47217', '30459', '8'), +('16', '70', '19', '69076', '28576', '8'), +('16', '70', '13', '18609', '260276', '8'), +('16', '70', '13', '47320', '252589', '8'), +('16', '70', '13', '47324', '250494', '8'), +('16', '70', '13', '47321', '233694', '8'), +('16', '70', '14', '47309', '35631', '8'), +('16', '70', '14', '70708', '31864', '8'), +('16', '70', '14', '69155', '30520', '8'), +('16', '70', '14', '28656', '20306', '8'), +('16', '70', '11', '68809', '44590', '8'), +('16', '70', '11', '47297', '35963', '8'), +('16', '70', '11', '47295', '35404', '8'), +('16', '70', '11', '67606', '34162', '8'), +('16', '71', '22', '61948', '0', '11'), +('16', '71', '22', '66397', '0', '11'), +('16', '71', '22', '62787', '0', '11'), +('16', '71', '22', '21805', '0', '11'), +('16', '71', '1', '39276', '49732', '11'), +('16', '71', '1', '83594', '48596', '11'), +('16', '71', '1', '39363', '42341', '11'), +('16', '71', '1', '39329', '41290', '11'), +('16', '71', '2', '70958', '46665', '11'), +('16', '71', '2', '83561', '41037', '11'), +('16', '71', '2', '83551', '33813', '11'), +('16', '71', '2', '47209', '31282', '11'), +('16', '71', '3', '39361', '45184', '11'), +('16', '71', '3', '39218', '44570', '11'), +('16', '71', '3', '83658', '43121', '11'), +('16', '71', '3', '39319', '41427', '11'), +('16', '71', '5', '39349', '51388', '11'), +('16', '71', '5', '39262', '41850', '11'), +('16', '71', '5', '39274', '41287', '11'), +('16', '71', '5', '39313', '39737', '11'), +('16', '71', '8', '39330', '47328', '11'), +('16', '71', '8', '69165', '43671', '11'), +('16', '71', '8', '39286', '43102', '11'), +('16', '71', '8', '83659', '42818', '11'), +('16', '71', '6', '39367', '49287', '11'), +('16', '71', '6', '83660', '42358', '11'), +('16', '71', '6', '39327', '42340', '11'), +('16', '71', '6', '70717', '42096', '11'), +('16', '71', '17', '83604', '55739', '11'), +('16', '71', '17', '70963', '47945', '11'), +('16', '71', '17', '69151', '38338', '11'), +('16', '71', '17', '70713', '35631', '11'), +('16', '71', '7', '83565', '41127', '11'), +('16', '71', '7', '39273', '40208', '11'), +('16', '71', '7', '70959', '37395', '11'), +('16', '71', '7', '83495', '33174', '11'), +('16', '71', '9', '39345', '45824', '11'), +('16', '71', '9', '51707', '43103', '11'), +('16', '71', '9', '83653', '42656', '11'), +('16', '71', '9', '39291', '41500', '11'), +('16', '71', '15', '39373', '50149', '11'), +('16', '71', '15', '51703', '42065', '11'), +('16', '71', '15', '83661', '41486', '11'), +('16', '71', '15', '39321', '40359', '11'), +('16', '71', '20', '39339', '46009', '11'), +('16', '71', '20', '47283', '43007', '11'), +('16', '71', '20', '83650', '41614', '11'), +('16', '71', '20', '83611', '41132', '11'), +('16', '71', '12', '39356', '44231', '11'), +('16', '71', '12', '47213', '38760', '11'), +('16', '71', '12', '83569', '36912', '11'), +('16', '71', '12', '71080', '35484', '11'), +('16', '71', '18', '83608', '45704', '11'), +('16', '71', '18', '70964', '42657', '11'), +('16', '71', '18', '69147', '36214', '11'), +('16', '71', '18', '47201', '34307', '11'), +('16', '71', '19', '83573', '40437', '11'), +('16', '71', '19', '70962', '37175', '11'), +('16', '71', '19', '83541', '34745', '11'), +('16', '71', '19', '39231', '31073', '11'), +('16', '71', '13', '39294', '275553', '11'), +('16', '71', '13', '39254', '275484', '11'), +('16', '71', '13', '18609', '260682', '11'), +('16', '71', '13', '83579', '259270', '11'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '71', '14', '83640', '40195', '11'), +('16', '71', '14', '47309', '35631', '11'), +('16', '71', '14', '70708', '31866', '11'), +('16', '71', '14', '69155', '30522', '11'), +('16', '71', '11', '39311', '49420', '11'), +('16', '71', '11', '39371', '48815', '11'), +('16', '71', '11', '83657', '45981', '11'), +('16', '71', '11', '68809', '45348', '11'), +('16', '72', '22', '61948', '0', '11'), +('16', '72', '22', '66397', '0', '11'), +('16', '72', '22', '62787', '0', '11'), +('16', '72', '22', '21805', '0', '11'), +('16', '72', '1', '39276', '49734', '11'), +('16', '72', '1', '83594', '48598', '11'), +('16', '72', '1', '39363', '42343', '11'), +('16', '72', '1', '39329', '41290', '11'), +('16', '72', '2', '70958', '46668', '11'), +('16', '72', '2', '83561', '41040', '11'), +('16', '72', '2', '83551', '33816', '11'), +('16', '72', '2', '47209', '31284', '11'), +('16', '72', '3', '39361', '45187', '11'), +('16', '72', '3', '39218', '44572', '11'), +('16', '72', '3', '83658', '43125', '11'), +('16', '72', '3', '39319', '41430', '11'), +('16', '72', '5', '39349', '51391', '11'), +('16', '72', '5', '39262', '41852', '11'), +('16', '72', '5', '39274', '41290', '11'), +('16', '72', '5', '39313', '39740', '11'), +('16', '72', '8', '39330', '47328', '11'), +('16', '72', '8', '69165', '43674', '11'), +('16', '72', '8', '39286', '43105', '11'), +('16', '72', '8', '83659', '42821', '11'), +('16', '72', '6', '39367', '49291', '11'), +('16', '72', '6', '83660', '42362', '11'), +('16', '72', '6', '39327', '42340', '11'), +('16', '72', '6', '70717', '42099', '11'), +('16', '72', '17', '83604', '55743', '11'), +('16', '72', '17', '70963', '47948', '11'), +('16', '72', '17', '69151', '38341', '11'), +('16', '72', '17', '70713', '35634', '11'), +('16', '72', '7', '83565', '41131', '11'), +('16', '72', '7', '39273', '40211', '11'), +('16', '72', '7', '70959', '37400', '11'), +('16', '72', '7', '83495', '33176', '11'), +('16', '72', '9', '39345', '45828', '11'), +('16', '72', '9', '51707', '43106', '11'), +('16', '72', '9', '83653', '42658', '11'), +('16', '72', '9', '39291', '41502', '11'), +('16', '72', '15', '39373', '50153', '11'), +('16', '72', '15', '51703', '42068', '11'), +('16', '72', '15', '83661', '41489', '11'), +('16', '72', '15', '39321', '40361', '11'), +('16', '72', '20', '39339', '46012', '11'), +('16', '72', '20', '47283', '43009', '11'), +('16', '72', '20', '83650', '41616', '11'), +('16', '72', '20', '83611', '41135', '11'), +('16', '72', '12', '39356', '44233', '11'), +('16', '72', '12', '47213', '38760', '11'), +('16', '72', '12', '83569', '36915', '11'), +('16', '72', '12', '71080', '35486', '11'), +('16', '72', '18', '83608', '45708', '11'), +('16', '72', '18', '70964', '42661', '11'), +('16', '72', '18', '69147', '36216', '11'), +('16', '72', '18', '47201', '34309', '11'), +('16', '72', '19', '83573', '40441', '11'), +('16', '72', '19', '70962', '37175', '11'), +('16', '72', '19', '83541', '34745', '11'), +('16', '72', '19', '39231', '31076', '11'), +('16', '72', '13', '39294', '276337', '11'), +('16', '72', '13', '39254', '276268', '11'), +('16', '72', '13', '18609', '261139', '11'), +('16', '72', '13', '83579', '260055', '11'), +('16', '72', '14', '83640', '40198', '11'), +('16', '72', '14', '47309', '35631', '11'), +('16', '72', '14', '70708', '31869', '11'), +('16', '72', '14', '69155', '30524', '11'), +('16', '72', '11', '39311', '49423', '11'), +('16', '72', '11', '39371', '48818', '11'), +('16', '72', '11', '83657', '45985', '11'), +('16', '72', '11', '68809', '45600', '11'), +('16', '73', '22', '61948', '0', '11'), +('16', '73', '22', '66397', '0', '11'), +('16', '73', '22', '62787', '0', '11'), +('16', '73', '22', '21805', '0', '11'), +('16', '73', '1', '39276', '49737', '11'), +('16', '73', '1', '83594', '48601', '11'), +('16', '73', '1', '39363', '42346', '11'), +('16', '73', '1', '39329', '41290', '11'), +('16', '73', '2', '70958', '46671', '11'), +('16', '73', '2', '83561', '41044', '11'), +('16', '73', '2', '83551', '33819', '11'), +('16', '73', '2', '47209', '31286', '11'), +('16', '73', '3', '39361', '45189', '11'), +('16', '73', '3', '39218', '44573', '11'), +('16', '73', '3', '83658', '43128', '11'), +('16', '73', '3', '39319', '41434', '11'), +('16', '73', '5', '39349', '51394', '11'), +('16', '73', '5', '39262', '41854', '11'), +('16', '73', '5', '39274', '41293', '11'), +('16', '73', '5', '39313', '39744', '11'), +('16', '73', '8', '39330', '47328', '11'), +('16', '73', '8', '69165', '43677', '11'), +('16', '73', '8', '39286', '43108', '11'), +('16', '73', '8', '83659', '42824', '11'), +('16', '73', '6', '39367', '49294', '11'), +('16', '73', '6', '83660', '42365', '11'), +('16', '73', '6', '39327', '42340', '11'), +('16', '73', '6', '70717', '42101', '11'), +('16', '73', '17', '83604', '55747', '11'), +('16', '73', '17', '70963', '47951', '11'), +('16', '73', '17', '69151', '38343', '11'), +('16', '73', '17', '70713', '35636', '11'), +('16', '73', '7', '83565', '41134', '11'), +('16', '73', '7', '39273', '40214', '11'), +('16', '73', '7', '70959', '37404', '11'), +('16', '73', '7', '83495', '33178', '11'), +('16', '73', '9', '39345', '45831', '11'), +('16', '73', '9', '51707', '43109', '11'), +('16', '73', '9', '83653', '42661', '11'), +('16', '73', '9', '39291', '41504', '11'), +('16', '73', '15', '39373', '50157', '11'), +('16', '73', '15', '51703', '42071', '11'), +('16', '73', '15', '83661', '41493', '11'), +('16', '73', '15', '39321', '40363', '11'), +('16', '73', '20', '39339', '46014', '11'), +('16', '73', '20', '47283', '43010', '11'), +('16', '73', '20', '83650', '41619', '11'), +('16', '73', '20', '83611', '41139', '11'), +('16', '73', '12', '39356', '44236', '11'), +('16', '73', '12', '47213', '38760', '11'), +('16', '73', '12', '83569', '36919', '11'), +('16', '73', '12', '71080', '35488', '11'), +('16', '73', '18', '83608', '45712', '11'), +('16', '73', '18', '70964', '42664', '11'), +('16', '73', '18', '69147', '36218', '11'), +('16', '73', '18', '47201', '34311', '11'), +('16', '73', '19', '83573', '40444', '11'), +('16', '73', '19', '70962', '37175', '11'), +('16', '73', '19', '83541', '34745', '11'), +('16', '73', '19', '39231', '31078', '11'), +('16', '73', '13', '39294', '277122', '11'), +('16', '73', '13', '39254', '277053', '11'), +('16', '73', '13', '18609', '261595', '11'), +('16', '73', '13', '83579', '260839', '11'), +('16', '73', '14', '83640', '40201', '11'), +('16', '73', '14', '47309', '35631', '11'), +('16', '73', '14', '70708', '31871', '11'), +('16', '73', '14', '69155', '30526', '11'), +('16', '73', '11', '39311', '49426', '11'), +('16', '73', '11', '39371', '48821', '11'), +('16', '73', '11', '83657', '45989', '11'), +('16', '73', '11', '68809', '45853', '11'), +('16', '74', '22', '61948', '0', '11'), +('16', '74', '22', '66397', '0', '11'), +('16', '74', '22', '62787', '0', '11'), +('16', '74', '22', '21805', '0', '11'), +('16', '74', '1', '39276', '49739', '11'), +('16', '74', '1', '83594', '48604', '11'), +('16', '74', '1', '39363', '42349', '11'), +('16', '74', '1', '39329', '41290', '11'), +('16', '74', '2', '70958', '46675', '11'), +('16', '74', '2', '83561', '41047', '11'), +('16', '74', '2', '83551', '33821', '11'), +('16', '74', '2', '47209', '31288', '11'), +('16', '74', '3', '39361', '45191', '11'), +('16', '74', '3', '39218', '44575', '11'), +('16', '74', '3', '83658', '43132', '11'), +('16', '74', '3', '39319', '41437', '11'), +('16', '74', '5', '39349', '51397', '11'), +('16', '74', '5', '39262', '41856', '11'), +('16', '74', '5', '39274', '41296', '11'), +('16', '74', '5', '39313', '39747', '11'), +('16', '74', '8', '39330', '47328', '11'), +('16', '74', '8', '69165', '43679', '11'), +('16', '74', '8', '39286', '43111', '11'), +('16', '74', '8', '83659', '42827', '11'), +('16', '74', '6', '39367', '49297', '11'), +('16', '74', '6', '83660', '42369', '11'), +('16', '74', '6', '39327', '42340', '11'), +('16', '74', '6', '70717', '42104', '11'), +('16', '74', '17', '83604', '55750', '11'), +('16', '74', '17', '70963', '47955', '11'), +('16', '74', '17', '69151', '38346', '11'), +('16', '74', '17', '70713', '35638', '11'), +('16', '74', '7', '83565', '41137', '11'), +('16', '74', '7', '39273', '40217', '11'), +('16', '74', '7', '70959', '37409', '11'), +('16', '74', '7', '83495', '33181', '11'), +('16', '74', '9', '39345', '45835', '11'), +('16', '74', '9', '51707', '43111', '11'), +('16', '74', '9', '83653', '42664', '11'), +('16', '74', '9', '39291', '41506', '11'), +('16', '74', '15', '39373', '50160', '11'), +('16', '74', '15', '51703', '42075', '11'), +('16', '74', '15', '83661', '41496', '11'), +('16', '74', '15', '39321', '40366', '11'), +('16', '74', '20', '39339', '46016', '11'), +('16', '74', '20', '47283', '43012', '11'), +('16', '74', '20', '83650', '41621', '11'), +('16', '74', '20', '83611', '41142', '11'), +('16', '74', '12', '39356', '44239', '11'), +('16', '74', '12', '47213', '38760', '11'), +('16', '74', '12', '83569', '36922', '11'), +('16', '74', '12', '71080', '35491', '11'), +('16', '74', '18', '83608', '45715', '11'), +('16', '74', '18', '70964', '42667', '11'), +('16', '74', '18', '69147', '36221', '11'), +('16', '74', '18', '47201', '34313', '11'), +('16', '74', '19', '83573', '40447', '11'), +('16', '74', '19', '70962', '37175', '11'), +('16', '74', '19', '83541', '34745', '11'), +('16', '74', '19', '39231', '31081', '11'), +('16', '74', '13', '39294', '277957', '11'), +('16', '74', '13', '39254', '277888', '11'), +('16', '74', '13', '18609', '262051', '11'), +('16', '74', '13', '83579', '261573', '11'), +('16', '74', '14', '83640', '40204', '11'), +('16', '74', '14', '47309', '35631', '11'), +('16', '74', '14', '70708', '31873', '11'), +('16', '74', '14', '69155', '30528', '11'), +('16', '74', '11', '39311', '49429', '11'), +('16', '74', '11', '39371', '48825', '11'), +('16', '74', '11', '68809', '46105', '11'), +('16', '74', '11', '83657', '45993', '11'), +('16', '75', '22', '21805', '0', '13'), +('16', '75', '22', '61948', '0', '13'), +('16', '75', '22', '66397', '0', '13'), +('16', '75', '22', '21807', '0', '13'), +('16', '75', '1', '80676', '63637', '13'), +('16', '75', '1', '80648', '61987', '13'), +('16', '75', '1', '80639', '58284', '13'), +('16', '75', '1', '46931', '56617', '13'), +('16', '75', '2', '53988', '49653', '13'), +('16', '75', '2', '70958', '46678', '13'), +('16', '75', '2', '83561', '41050', '13'), +('16', '75', '2', '83551', '33824', '13'), +('16', '75', '3', '80636', '62168', '13'), +('16', '75', '3', '46924', '51677', '13'), +('16', '75', '3', '46902', '47828', '13'), +('16', '75', '3', '46852', '46469', '13'), +('16', '75', '5', '80669', '66780', '13'), +('16', '75', '5', '46918', '62952', '13'), +('16', '75', '5', '80616', '59626', '13'), +('16', '75', '5', '46934', '55494', '13'), +('16', '75', '8', '80687', '68874', '13'), +('16', '75', '8', '46885', '68715', '13'), +('16', '75', '8', '80649', '58206', '13'), +('16', '75', '8', '46814', '50444', '13'), +('16', '75', '6', '80638', '71334', '13'), +('16', '75', '6', '46884', '57551', '13'), +('16', '75', '6', '46933', '57471', '13'), +('16', '75', '6', '46883', '55559', '13'), +('16', '75', '17', '83604', '55754', '13'), +('16', '75', '17', '53993', '51811', '13'), +('16', '75', '17', '70963', '47958', '13'), +('16', '75', '17', '46825', '45907', '13'), +('16', '75', '7', '53467', '53998', '13'), +('16', '75', '7', '83565', '41140', '13'), +('16', '75', '7', '39273', '40220', '13'), +('16', '75', '7', '70959', '37413', '13'), +('16', '75', '9', '46937', '57944', '13'), +('16', '75', '9', '39345', '45839', '13'), +('16', '75', '9', '51707', '43114', '13'), +('16', '75', '9', '83653', '42667', '13'), +('16', '75', '15', '79909', '69296', '13'), +('16', '75', '15', '80686', '64264', '13'), +('16', '75', '15', '80657', '64025', '13'), +('16', '75', '15', '79908', '62430', '13'), +('16', '75', '20', '80688', '77079', '13'), +('16', '75', '20', '46935', '60626', '13'), +('16', '75', '20', '80620', '55908', '13'), +('16', '75', '20', '46870', '51728', '13'), +('16', '75', '12', '53469', '61614', '13'), +('16', '75', '12', '53991', '49614', '13'), +('16', '75', '12', '39356', '44242', '13'), +('16', '75', '12', '47213', '38760', '13'), +('16', '75', '18', '53994', '51136', '13'), +('16', '75', '18', '83608', '45719', '13'), +('16', '75', '18', '70964', '42671', '13'), +('16', '75', '18', '46818', '41113', '13'), +('16', '75', '19', '53470', '54448', '13'), +('16', '75', '19', '53992', '50148', '13'), +('16', '75', '19', '83573', '40450', '13'), +('16', '75', '19', '70962', '37175', '13'), +('16', '75', '13', '80685', '349059', '13'), +('16', '75', '13', '46929', '343218', '13'), +('16', '75', '13', '80673', '340998', '13'), +('16', '75', '13', '80632', '319992', '13'), +('16', '75', '14', '46875', '52542', '13'), +('16', '75', '14', '46925', '51524', '13'), +('16', '75', '14', '83640', '40208', '13'), +('16', '75', '14', '47309', '35631', '13'), +('16', '75', '11', '80668', '63924', '13'), +('16', '75', '11', '46850', '60321', '13'), +('16', '75', '11', '80630', '58778', '13'), +('16', '75', '11', '46889', '58637', '13'), +('16', '75', '22', '21805', '0', '12'), +('16', '75', '22', '61948', '0', '12'), +('16', '75', '22', '66397', '0', '12'), +('16', '75', '22', '21807', '0', '12'), +('16', '75', '1', '46931', '56617', '12'), +('16', '75', '1', '46866', '52604', '12'), +('16', '75', '1', '39276', '49741', '12'), +('16', '75', '1', '83594', '48607', '12'), +('16', '75', '2', '53988', '49653', '12'), +('16', '75', '2', '70958', '46678', '12'), +('16', '75', '2', '83561', '41050', '12'), +('16', '75', '2', '83551', '33824', '12'), +('16', '75', '3', '46924', '51677', '12'), +('16', '75', '3', '46902', '47828', '12'), +('16', '75', '3', '46852', '46469', '12'), +('16', '75', '3', '39361', '45193', '12'), +('16', '75', '5', '46918', '62952', '12'), +('16', '75', '5', '46934', '55494', '12'), +('16', '75', '5', '46862', '55013', '12'), +('16', '75', '5', '39349', '51399', '12'), +('16', '75', '8', '46885', '68715', '12'), +('16', '75', '8', '46814', '50444', '12'), +('16', '75', '8', '46848', '47946', '12'), +('16', '75', '8', '39330', '47328', '12'), +('16', '75', '6', '46884', '57551', '12'), +('16', '75', '6', '46933', '57471', '12'), +('16', '75', '6', '46883', '55559', '12'), +('16', '75', '6', '46896', '50072', '12'), +('16', '75', '17', '83604', '55754', '12'), +('16', '75', '17', '53993', '51811', '12'), +('16', '75', '17', '70963', '47958', '12'), +('16', '75', '17', '46825', '45907', '12'), +('16', '75', '7', '53467', '53998', '12'), +('16', '75', '7', '83565', '41140', '12'), +('16', '75', '7', '39273', '40220', '12'), +('16', '75', '7', '70959', '37413', '12'), +('16', '75', '9', '46937', '57944', '12'), +('16', '75', '9', '39345', '45839', '12'), +('16', '75', '9', '51707', '43114', '12'), +('16', '75', '9', '83653', '42667', '12'), +('16', '75', '15', '46881', '59141', '12'), +('16', '75', '15', '46893', '52344', '12'), +('16', '75', '15', '46916', '51529', '12'), +('16', '75', '15', '39373', '50164', '12'), +('16', '75', '20', '46935', '60626', '12'), +('16', '75', '20', '46870', '51728', '12'), +('16', '75', '20', '39339', '46018', '12'), +('16', '75', '20', '47283', '43014', '12'), +('16', '75', '12', '53469', '61614', '12'), +('16', '75', '12', '53991', '49614', '12'), +('16', '75', '12', '39356', '44242', '12'), +('16', '75', '12', '47213', '38760', '12'), +('16', '75', '18', '53994', '51136', '12'), +('16', '75', '18', '83608', '45719', '12'), +('16', '75', '18', '70964', '42671', '12'), +('16', '75', '18', '46818', '41113', '12'), +('16', '75', '19', '53470', '54448', '12'), +('16', '75', '19', '53992', '50148', '12'), +('16', '75', '19', '83573', '40450', '12'), +('16', '75', '19', '70962', '37175', '12'), +('16', '75', '13', '46929', '343218', '12'), +('16', '75', '13', '46879', '315439', '12'), +('16', '75', '13', '46890', '290820', '12'), +('16', '75', '13', '39294', '280635', '12'), +('16', '75', '14', '46875', '52542', '12'), +('16', '75', '14', '46925', '51524', '12'), +('16', '75', '14', '83640', '40208', '12'), +('16', '75', '14', '47309', '35631', '12'), +('16', '75', '11', '46850', '60321', '12'), +('16', '75', '11', '46889', '58637', '12'), +('16', '75', '11', '46939', '54483', '12'), +('16', '75', '11', '39311', '49433', '12'), +('16', '76', '22', '21805', '0', '13'), +('16', '76', '22', '61948', '0', '13'), +('16', '76', '22', '66397', '0', '13'), +('16', '76', '22', '21807', '0', '13'), +('16', '76', '1', '80676', '63637', '13'), +('16', '76', '1', '80648', '61990', '13'), +('16', '76', '1', '80639', '58288', '13'), +('16', '76', '1', '46931', '56621', '13'), +('16', '76', '2', '53988', '49656', '13'), +('16', '76', '2', '70958', '46681', '13'), +('16', '76', '2', '83561', '41054', '13'), +('16', '76', '2', '83551', '33827', '13'), +('16', '76', '3', '80636', '62168', '13'), +('16', '76', '3', '46924', '51681', '13'), +('16', '76', '3', '46902', '47832', '13'), +('16', '76', '3', '46852', '46471', '13'), +('16', '76', '5', '80669', '66784', '13'), +('16', '76', '5', '46918', '62956', '13'), +('16', '76', '5', '80616', '59626', '13'), +('16', '76', '5', '46934', '55498', '13'), +('16', '76', '8', '80687', '68878', '13'), +('16', '76', '8', '46885', '68719', '13'), +('16', '76', '8', '80649', '58209', '13'), +('16', '76', '8', '46814', '50446', '13'), +('16', '76', '6', '80638', '71337', '13'), +('16', '76', '6', '46884', '57555', '13'), +('16', '76', '6', '46933', '57474', '13'), +('16', '76', '6', '46883', '55563', '13'), +('16', '76', '17', '83604', '55758', '13'), +('16', '76', '17', '53993', '51814', '13'), +('16', '76', '17', '70963', '47961', '13'), +('16', '76', '17', '46825', '45910', '13'), +('16', '76', '7', '53467', '54000', '13'), +('16', '76', '7', '83565', '41144', '13'), +('16', '76', '7', '39273', '40223', '13'), +('16', '76', '7', '70959', '37417', '13'), +('16', '76', '9', '46937', '57948', '13'), +('16', '76', '9', '39345', '45843', '13'), +('16', '76', '9', '51707', '43117', '13'), +('16', '76', '9', '83653', '42669', '13'), +('16', '76', '15', '79909', '69299', '13'), +('16', '76', '15', '80686', '64268', '13'), +('16', '76', '15', '80657', '64025', '13'), +('16', '76', '15', '79908', '62433', '13'), +('16', '76', '20', '80688', '77083', '13'), +('16', '76', '20', '46935', '60630', '13'), +('16', '76', '20', '80620', '55911', '13'), +('16', '76', '20', '46870', '51731', '13'), +('16', '76', '12', '53469', '61617', '13'), +('16', '76', '12', '53991', '49617', '13'), +('16', '76', '12', '39356', '44244', '13'), +('16', '76', '12', '47213', '38760', '13'), +('16', '76', '18', '53994', '51138', '13'), +('16', '76', '18', '83608', '45723', '13'), +('16', '76', '18', '70964', '42674', '13'), +('16', '76', '18', '46818', '41115', '13'), +('16', '76', '19', '53470', '54451', '13'), +('16', '76', '19', '53992', '50151', '13'), +('16', '76', '19', '83573', '40454', '13'), +('16', '76', '19', '70962', '37175', '13'), +('16', '76', '13', '80685', '349667', '13'), +('16', '76', '13', '46929', '344498', '13'), +('16', '76', '13', '80673', '341555', '13'), +('16', '76', '13', '80632', '320499', '13'), +('16', '76', '14', '46875', '52545', '13'), +('16', '76', '14', '46925', '51528', '13'), +('16', '76', '14', '83640', '40211', '13'), +('16', '76', '14', '47309', '35631', '13'), +('16', '76', '11', '80668', '63928', '13'), +('16', '76', '11', '46850', '60324', '13'), +('16', '76', '11', '80630', '58781', '13'), +('16', '76', '11', '46889', '58640', '13'), +('16', '77', '22', '21805', '0', '13'), +('16', '77', '22', '61948', '0', '13'), +('16', '77', '22', '66397', '0', '13'), +('16', '77', '22', '21807', '0', '13'), +('16', '77', '1', '80676', '63637', '13'), +('16', '77', '1', '80648', '61994', '13'), +('16', '77', '1', '80639', '58291', '13'), +('16', '77', '1', '46931', '56625', '13'), +('16', '77', '2', '53988', '49660', '13'), +('16', '77', '2', '70958', '46684', '13'), +('16', '77', '2', '83561', '41057', '13'), +('16', '77', '2', '83551', '33830', '13'), +('16', '77', '3', '80636', '62168', '13'), +('16', '77', '3', '46924', '51685', '13'), +('16', '77', '3', '46902', '47835', '13'), +('16', '77', '3', '46852', '46474', '13'), +('16', '77', '5', '80669', '66788', '13'), +('16', '77', '5', '46918', '62960', '13'), +('16', '77', '5', '80616', '59626', '13'), +('16', '77', '5', '46934', '55503', '13'), +('16', '77', '8', '80687', '68882', '13'), +('16', '77', '8', '46885', '68723', '13'), +('16', '77', '8', '80649', '58213', '13'), +('16', '77', '8', '46814', '50448', '13'), +('16', '77', '6', '80638', '71341', '13'), +('16', '77', '6', '46884', '57559', '13'), +('16', '77', '6', '46933', '57477', '13'), +('16', '77', '6', '46883', '55567', '13'), +('16', '77', '17', '83604', '55762', '13'), +('16', '77', '17', '53993', '51817', '13'), +('16', '77', '17', '70963', '47965', '13'), +('16', '77', '17', '46825', '45912', '13'), +('16', '77', '7', '53467', '54002', '13'), +('16', '77', '7', '83565', '41147', '13'), +('16', '77', '7', '39273', '40226', '13'), +('16', '77', '7', '70959', '37422', '13'), +('16', '77', '9', '46937', '57952', '13'), +('16', '77', '9', '39345', '45847', '13'), +('16', '77', '9', '51707', '43120', '13'), +('16', '77', '9', '83653', '42672', '13'), +('16', '77', '15', '79909', '69302', '13'), +('16', '77', '15', '80686', '64272', '13'), +('16', '77', '15', '80657', '64025', '13'), +('16', '77', '15', '79908', '62436', '13'), +('16', '77', '20', '80688', '77087', '13'), +('16', '77', '20', '46935', '60634', '13'), +('16', '77', '20', '80620', '55915', '13'), +('16', '77', '20', '46870', '51734', '13'), +('16', '77', '12', '53469', '61620', '13'), +('16', '77', '12', '53991', '49620', '13'), +('16', '77', '12', '39356', '44247', '13'), +('16', '77', '12', '47213', '38760', '13'), +('16', '77', '18', '53994', '51140', '13'), +('16', '77', '18', '83608', '45727', '13'), +('16', '77', '18', '70964', '42677', '13'), +('16', '77', '18', '46818', '41117', '13'), +('16', '77', '19', '53470', '54455', '13'), +('16', '77', '19', '53992', '50155', '13'), +('16', '77', '19', '83573', '40457', '13'), +('16', '77', '19', '70962', '37175', '13'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '77', '13', '80685', '350275', '13'), +('16', '77', '13', '46929', '345778', '13'), +('16', '77', '13', '80673', '342163', '13'), +('16', '77', '13', '80632', '321057', '13'), +('16', '77', '14', '46875', '52549', '13'), +('16', '77', '14', '46925', '51532', '13'), +('16', '77', '14', '83640', '40214', '13'), +('16', '77', '14', '47309', '35631', '13'), +('16', '77', '11', '80668', '63932', '13'), +('16', '77', '11', '46850', '60327', '13'), +('16', '77', '11', '80630', '58784', '13'), +('16', '77', '11', '46889', '58644', '13'), +('16', '78', '22', '21805', '0', '13'), +('16', '78', '22', '61948', '0', '13'), +('16', '78', '22', '66397', '0', '13'), +('16', '78', '22', '21807', '0', '13'), +('16', '78', '1', '80676', '63637', '13'), +('16', '78', '1', '80648', '61997', '13'), +('16', '78', '1', '80639', '58295', '13'), +('16', '78', '1', '46931', '56630', '13'), +('16', '78', '2', '53988', '49663', '13'), +('16', '78', '2', '70958', '46688', '13'), +('16', '78', '2', '83561', '41060', '13'), +('16', '78', '2', '83551', '33832', '13'), +('16', '78', '3', '80636', '62168', '13'), +('16', '78', '3', '46924', '51688', '13'), +('16', '78', '3', '46902', '47838', '13'), +('16', '78', '3', '46852', '46477', '13'), +('16', '78', '5', '80669', '66792', '13'), +('16', '78', '5', '46918', '62963', '13'), +('16', '78', '5', '80616', '59626', '13'), +('16', '78', '5', '46934', '55507', '13'), +('16', '78', '8', '80687', '68886', '13'), +('16', '78', '8', '46885', '68727', '13'), +('16', '78', '8', '80649', '58216', '13'), +('16', '78', '8', '46814', '50449', '13'), +('16', '78', '6', '80638', '71344', '13'), +('16', '78', '6', '46884', '57564', '13'), +('16', '78', '6', '46933', '57480', '13'), +('16', '78', '6', '46883', '55571', '13'), +('16', '78', '17', '83604', '55766', '13'), +('16', '78', '17', '53993', '51820', '13'), +('16', '78', '17', '70963', '47968', '13'), +('16', '78', '17', '46825', '45915', '13'), +('16', '78', '7', '53467', '54005', '13'), +('16', '78', '7', '83565', '41150', '13'), +('16', '78', '7', '39273', '40229', '13'), +('16', '78', '7', '70959', '37426', '13'), +('16', '78', '9', '46937', '57956', '13'), +('16', '78', '9', '39345', '45851', '13'), +('16', '78', '9', '51707', '43122', '13'), +('16', '78', '9', '83653', '42675', '13'), +('16', '78', '15', '79909', '69306', '13'), +('16', '78', '15', '80686', '64276', '13'), +('16', '78', '15', '80657', '64025', '13'), +('16', '78', '15', '79908', '62439', '13'), +('16', '78', '20', '80688', '77091', '13'), +('16', '78', '20', '46935', '60639', '13'), +('16', '78', '20', '80620', '55918', '13'), +('16', '78', '20', '46870', '51737', '13'), +('16', '78', '12', '53469', '61623', '13'), +('16', '78', '12', '53991', '49623', '13'), +('16', '78', '12', '39356', '44250', '13'), +('16', '78', '12', '47213', '38760', '13'), +('16', '78', '18', '53994', '51142', '13'), +('16', '78', '18', '83608', '45731', '13'), +('16', '78', '18', '70964', '42680', '13'), +('16', '78', '18', '46818', '41120', '13'), +('16', '78', '19', '53470', '54458', '13'), +('16', '78', '19', '53992', '50158', '13'), +('16', '78', '19', '83573', '40460', '13'), +('16', '78', '19', '70962', '37175', '13'), +('16', '78', '13', '80685', '350833', '13'), +('16', '78', '13', '46929', '347109', '13'), +('16', '78', '13', '80673', '342721', '13'), +('16', '78', '13', '80632', '321614', '13'), +('16', '78', '14', '46875', '52553', '13'), +('16', '78', '14', '46925', '51536', '13'), +('16', '78', '14', '83640', '40218', '13'), +('16', '78', '14', '47309', '35631', '13'), +('16', '78', '11', '80668', '63936', '13'), +('16', '78', '11', '46850', '60330', '13'), +('16', '78', '11', '80630', '58788', '13'), +('16', '78', '11', '46889', '58648', '13'), +('16', '79', '22', '21805', '0', '13'), +('16', '79', '22', '61948', '0', '13'), +('16', '79', '22', '66397', '0', '13'), +('16', '79', '22', '21807', '0', '13'), +('16', '79', '1', '80676', '63637', '13'), +('16', '79', '1', '80648', '62001', '13'), +('16', '79', '1', '80639', '58298', '13'), +('16', '79', '1', '46931', '56634', '13'), +('16', '79', '2', '53988', '49666', '13'), +('16', '79', '2', '70958', '46691', '13'), +('16', '79', '2', '83561', '41063', '13'), +('16', '79', '2', '83551', '33835', '13'), +('16', '79', '3', '80636', '62168', '13'), +('16', '79', '3', '46924', '51692', '13'), +('16', '79', '3', '46902', '47841', '13'), +('16', '79', '3', '46852', '46480', '13'), +('16', '79', '5', '80669', '66796', '13'), +('16', '79', '5', '46918', '62967', '13'), +('16', '79', '5', '80616', '59626', '13'), +('16', '79', '5', '46934', '55511', '13'), +('16', '79', '8', '80687', '68890', '13'), +('16', '79', '8', '46885', '68731', '13'), +('16', '79', '8', '80649', '58220', '13'), +('16', '79', '8', '46814', '50451', '13'), +('16', '79', '6', '80638', '71348', '13'), +('16', '79', '6', '46884', '57568', '13'), +('16', '79', '6', '46933', '57482', '13'), +('16', '79', '6', '46883', '55575', '13'), +('16', '79', '17', '83604', '55770', '13'), +('16', '79', '17', '53993', '51824', '13'), +('16', '79', '17', '70963', '47971', '13'), +('16', '79', '17', '46825', '45918', '13'), +('16', '79', '7', '53467', '54007', '13'), +('16', '79', '7', '83565', '41154', '13'), +('16', '79', '7', '39273', '40232', '13'), +('16', '79', '7', '70959', '37431', '13'), +('16', '79', '9', '46937', '57960', '13'), +('16', '79', '9', '39345', '45855', '13'), +('16', '79', '9', '51707', '43125', '13'), +('16', '79', '9', '83653', '42678', '13'), +('16', '79', '15', '79909', '69309', '13'), +('16', '79', '15', '80686', '64280', '13'), +('16', '79', '15', '80657', '64025', '13'), +('16', '79', '15', '79908', '62442', '13'), +('16', '79', '20', '80688', '77095', '13'), +('16', '79', '20', '46935', '60643', '13'), +('16', '79', '20', '80620', '55921', '13'), +('16', '79', '20', '46870', '51740', '13'), +('16', '79', '12', '53469', '61625', '13'), +('16', '79', '12', '53991', '49625', '13'), +('16', '79', '12', '39356', '44253', '13'), +('16', '79', '12', '47213', '38760', '13'), +('16', '79', '18', '53994', '51144', '13'), +('16', '79', '18', '83608', '45735', '13'), +('16', '79', '18', '70964', '42684', '13'), +('16', '79', '18', '46818', '41122', '13'), +('16', '79', '19', '53470', '54461', '13'), +('16', '79', '19', '53992', '50161', '13'), +('16', '79', '19', '83573', '40464', '13'), +('16', '79', '19', '70962', '37175', '13'), +('16', '79', '13', '80685', '351441', '13'), +('16', '79', '13', '46929', '348389', '13'), +('16', '79', '13', '80673', '343278', '13'), +('16', '79', '13', '80632', '322121', '13'), +('16', '79', '14', '46875', '52557', '13'), +('16', '79', '14', '46925', '51540', '13'), +('16', '79', '14', '83640', '40221', '13'), +('16', '79', '14', '47309', '35631', '13'), +('16', '79', '11', '80668', '63940', '13'), +('16', '79', '11', '46850', '60334', '13'), +('16', '79', '11', '80630', '58791', '13'), +('16', '79', '11', '46889', '58652', '13'), +('16', '80', '22', '21805', '0', '14'), +('16', '80', '22', '61948', '0', '14'), +('16', '80', '22', '66397', '0', '14'), +('16', '80', '22', '21807', '0', '14'), +('16', '80', '1', '102590', '87751', '14'), +('16', '80', '1', '102641', '87605', '14'), +('16', '80', '1', '102639', '86371', '14'), +('16', '80', '1', '102642', '86075', '14'), +('16', '80', '2', '102010', '60330', '14'), +('16', '80', '2', '102262', '54071', '14'), +('16', '80', '2', '53988', '49670', '14'), +('16', '80', '2', '70958', '46695', '14'), +('16', '80', '3', '102726', '96415', '14'), +('16', '80', '3', '102591', '93381', '14'), +('16', '80', '3', '102725', '83515', '14'), +('16', '80', '3', '102554', '82499', '14'), +('16', '80', '5', '102592', '91776', '14'), +('16', '80', '5', '102745', '84317', '14'), +('16', '80', '5', '102551', '80663', '14'), +('16', '80', '5', '80669', '66800', '14'), +('16', '80', '8', '102594', '92901', '14'), +('16', '80', '8', '102552', '90425', '14'), +('16', '80', '8', '102527', '69811', '14'), +('16', '80', '8', '80687', '68895', '14'), +('16', '80', '6', '102593', '93155', '14'), +('16', '80', '6', '102555', '81415', '14'), +('16', '80', '6', '80638', '71352', '14'), +('16', '80', '6', '46884', '57573', '14'), +('16', '80', '17', '102013', '63733', '14'), +('16', '80', '17', '102265', '58405', '14'), +('16', '80', '17', '83604', '55774', '14'), +('16', '80', '17', '53993', '51827', '14'), +('16', '80', '7', '102011', '60918', '14'), +('16', '80', '7', '102263', '55497', '14'), +('16', '80', '7', '53467', '54009', '14'), +('16', '80', '7', '83565', '41157', '14'), +('16', '80', '9', '67098', '150840', '14'), +('16', '80', '9', '46937', '57965', '14'), +('16', '80', '9', '102288', '49807', '14'), +('16', '80', '9', '39345', '45859', '14'), +('16', '80', '15', '102595', '90284', '14'), +('16', '80', '15', '102636', '88922', '14'), +('16', '80', '15', '102637', '88472', '14'), +('16', '80', '15', '102635', '87608', '14'), +('16', '80', '20', '102596', '101773', '14'), +('16', '80', '20', '102553', '89560', '14'), +('16', '80', '20', '80688', '77100', '14'), +('16', '80', '20', '46935', '60648', '14'), +('16', '80', '12', '53469', '61628', '14'), +('16', '80', '12', '102260', '51935', '14'), +('16', '80', '12', '53991', '49628', '14'), +('16', '80', '12', '39356', '44256', '14'), +('16', '80', '18', '102012', '62457', '14'), +('16', '80', '18', '102264', '56508', '14'), +('16', '80', '18', '53994', '51147', '14'), +('16', '80', '18', '83608', '45739', '14'), +('16', '80', '19', '76131', '57650', '14'), +('16', '80', '19', '53470', '54465', '14'), +('16', '80', '19', '102261', '52087', '14'), +('16', '80', '19', '53992', '50165', '14'), +('16', '80', '13', '102663', '451492', '14'), +('16', '80', '13', '102653', '427152', '14'), +('16', '80', '13', '102658', '422613', '14'), +('16', '80', '13', '102580', '420364', '14'), +('16', '80', '14', '46875', '52561', '14'), +('16', '80', '14', '46925', '51544', '14'), +('16', '80', '14', '83640', '40225', '14'), +('16', '80', '14', '47309', '35631', '14'), +('16', '80', '11', '102643', '89021', '14'), +('16', '80', '11', '102747', '82941', '14'), +('16', '80', '11', '80668', '63945', '14'), +('16', '80', '11', '102747', '62466', '14'), +('16', '81', '22', '21805', '0', '14'), +('16', '81', '22', '61948', '0', '14'), +('16', '81', '22', '66397', '0', '14'), +('16', '81', '22', '21807', '0', '14'), +('16', '81', '1', '102590', '87756', '14'), +('16', '81', '1', '102641', '87608', '14'), +('16', '81', '1', '102639', '86376', '14'), +('16', '81', '1', '102642', '86076', '14'), +('16', '81', '2', '102010', '60334', '14'), +('16', '81', '2', '102262', '54074', '14'), +('16', '81', '2', '53988', '49673', '14'), +('16', '81', '2', '70958', '46698', '14'), +('16', '81', '3', '102726', '96420', '14'), +('16', '81', '3', '102591', '93384', '14'), +('16', '81', '3', '102725', '83518', '14'), +('16', '81', '3', '102554', '82503', '14'), +('16', '81', '5', '102592', '91779', '14'), +('16', '81', '5', '102745', '84320', '14'), +('16', '81', '5', '102551', '80664', '14'), +('16', '81', '5', '80669', '66804', '14'), +('16', '81', '8', '102594', '92902', '14'), +('16', '81', '8', '102552', '90428', '14'), +('16', '81', '8', '102527', '69816', '14'), +('16', '81', '8', '80687', '68898', '14'), +('16', '81', '6', '102593', '93160', '14'), +('16', '81', '6', '102555', '81419', '14'), +('16', '81', '6', '80638', '71355', '14'), +('16', '81', '6', '46884', '57577', '14'), +('16', '81', '17', '102013', '63735', '14'), +('16', '81', '17', '102265', '58409', '14'), +('16', '81', '17', '83604', '55778', '14'), +('16', '81', '17', '53993', '51831', '14'), +('16', '81', '7', '102011', '60921', '14'), +('16', '81', '7', '102263', '55499', '14'), +('16', '81', '7', '53467', '54011', '14'), +('16', '81', '7', '83565', '41161', '14'), +('16', '81', '9', '67098', '152728', '14'), +('16', '81', '9', '46937', '57969', '14'), +('16', '81', '9', '102288', '49810', '14'), +('16', '81', '9', '39345', '45863', '14'), +('16', '81', '15', '102595', '90288', '14'), +('16', '81', '15', '102636', '88925', '14'), +('16', '81', '15', '102637', '88476', '14'), +('16', '81', '15', '102635', '87610', '14'), +('16', '81', '20', '102596', '101776', '14'), +('16', '81', '20', '102553', '89565', '14'), +('16', '81', '20', '80688', '77103', '14'), +('16', '81', '20', '46935', '60652', '14'), +('16', '81', '12', '53469', '61631', '14'), +('16', '81', '12', '102260', '51937', '14'), +('16', '81', '12', '53991', '49631', '14'), +('16', '81', '12', '39356', '44258', '14'), +('16', '81', '18', '102012', '62462', '14'), +('16', '81', '18', '102264', '56512', '14'), +('16', '81', '18', '53994', '51149', '14'), +('16', '81', '18', '83608', '45743', '14'), +('16', '81', '19', '76131', '57650', '14'), +('16', '81', '19', '53470', '54468', '14'), +('16', '81', '19', '102261', '52089', '14'), +('16', '81', '19', '53992', '50168', '14'), +('16', '81', '13', '102663', '452403', '14'), +('16', '81', '13', '102653', '427861', '14'), +('16', '81', '13', '102658', '423323', '14'), +('16', '81', '13', '102580', '421193', '14'), +('16', '81', '14', '46875', '52565', '14'), +('16', '81', '14', '46925', '51548', '14'), +('16', '81', '14', '83640', '40228', '14'), +('16', '81', '14', '47309', '35631', '14'), +('16', '81', '11', '102643', '89022', '14'), +('16', '81', '11', '102747', '82943', '14'), +('16', '81', '11', '80668', '63948', '14'), +('16', '81', '11', '102747', '62467', '14'), +('16', '82', '22', '21805', '0', '14'), +('16', '82', '22', '61948', '0', '14'), +('16', '82', '22', '66397', '0', '14'), +('16', '82', '22', '21807', '0', '14'), +('16', '82', '1', '102590', '87760', '14'), +('16', '82', '1', '102641', '87610', '14'), +('16', '82', '1', '102639', '86381', '14'), +('16', '82', '1', '102642', '86077', '14'), +('16', '82', '2', '102010', '60339', '14'), +('16', '82', '2', '102262', '54076', '14'), +('16', '82', '2', '53988', '49677', '14'), +('16', '82', '2', '70958', '46701', '14'), +('16', '82', '3', '102726', '96424', '14'), +('16', '82', '3', '102591', '93387', '14'), +('16', '82', '3', '102725', '83521', '14'), +('16', '82', '3', '102554', '82506', '14'), +('16', '82', '5', '102592', '91782', '14'), +('16', '82', '5', '102745', '84324', '14'), +('16', '82', '5', '102551', '80666', '14'), +('16', '82', '5', '80669', '66808', '14'), +('16', '82', '8', '102594', '92903', '14'), +('16', '82', '8', '102552', '90431', '14'), +('16', '82', '8', '102527', '69821', '14'), +('16', '82', '8', '80687', '68902', '14'), +('16', '82', '6', '102593', '93166', '14'), +('16', '82', '6', '102555', '81422', '14'), +('16', '82', '6', '80638', '71359', '14'), +('16', '82', '6', '46884', '57582', '14'), +('16', '82', '17', '102013', '63736', '14'), +('16', '82', '17', '102265', '58413', '14'), +('16', '82', '17', '83604', '55782', '14'), +('16', '82', '17', '53993', '51834', '14'), +('16', '82', '7', '102011', '60924', '14'), +('16', '82', '7', '102263', '55501', '14'), +('16', '82', '7', '53467', '54014', '14'), +('16', '82', '7', '83565', '41164', '14'), +('16', '82', '9', '67098', '154616', '14'), +('16', '82', '9', '46937', '57973', '14'), +('16', '82', '9', '102288', '49814', '14'), +('16', '82', '9', '39345', '45866', '14'), +('16', '82', '15', '102595', '90292', '14'), +('16', '82', '15', '102636', '88928', '14'), +('16', '82', '15', '102637', '88481', '14'), +('16', '82', '15', '102635', '87612', '14'), +('16', '82', '20', '102596', '101778', '14'), +('16', '82', '20', '102553', '89570', '14'), +('16', '82', '20', '80688', '77107', '14'), +('16', '82', '20', '46935', '60657', '14'), +('16', '82', '12', '53469', '61634', '14'), +('16', '82', '12', '102260', '51939', '14'), +('16', '82', '12', '53991', '49634', '14'), +('16', '82', '12', '39356', '44261', '14'), +('16', '82', '18', '102012', '62466', '14'), +('16', '82', '18', '102264', '56515', '14'), +('16', '82', '18', '53994', '51151', '14'), +('16', '82', '18', '83608', '45747', '14'), +('16', '82', '19', '76131', '57650', '14'), +('16', '82', '19', '53470', '54471', '14'), +('16', '82', '19', '102261', '52091', '14'), +('16', '82', '19', '53992', '50171', '14'), +('16', '82', '13', '102663', '453314', '14'), +('16', '82', '13', '102653', '428519', '14'), +('16', '82', '13', '102658', '423981', '14'), +('16', '82', '13', '102580', '422074', '14'), +('16', '82', '14', '46875', '52569', '14'), +('16', '82', '14', '46925', '51552', '14'), +('16', '82', '14', '83640', '40231', '14'), +('16', '82', '14', '47309', '35631', '14'), +('16', '82', '11', '102643', '89024', '14'), +('16', '82', '11', '102747', '82946', '14'), +('16', '82', '11', '80668', '63952', '14'), +('16', '82', '11', '102747', '62468', '14'), +('16', '83', '22', '21805', '0', '14'), +('16', '83', '22', '61948', '0', '14'), +('16', '83', '22', '66397', '0', '14'), +('16', '83', '22', '21807', '0', '14'), +('16', '83', '1', '102590', '87765', '14'), +('16', '83', '1', '102641', '87613', '14'), +('16', '83', '1', '102639', '86386', '14'), +('16', '83', '1', '102642', '86079', '14'), +('16', '83', '2', '102010', '60345', '14'), +('16', '83', '2', '102262', '54078', '14'), +('16', '83', '2', '53988', '49680', '14'), +('16', '83', '2', '70958', '46705', '14'), +('16', '83', '3', '102726', '96429', '14'), +('16', '83', '3', '102591', '93391', '14'), +('16', '83', '3', '102725', '83525', '14'), +('16', '83', '3', '102554', '82509', '14'), +('16', '83', '5', '102592', '91785', '14'), +('16', '83', '5', '102745', '84329', '14'), +('16', '83', '5', '102551', '80667', '14'), +('16', '83', '5', '80669', '66812', '14'), +('16', '83', '8', '102594', '92904', '14'), +('16', '83', '8', '102552', '90435', '14'), +('16', '83', '8', '102527', '69827', '14'), +('16', '83', '8', '80687', '68907', '14'), +('16', '83', '6', '102593', '93172', '14'), +('16', '83', '6', '102555', '81426', '14'), +('16', '83', '6', '80638', '71362', '14'), +('16', '83', '6', '46884', '57587', '14'), +('16', '83', '17', '102013', '63737', '14'), +('16', '83', '17', '102265', '58418', '14'), +('16', '83', '17', '83604', '55786', '14'), +('16', '83', '17', '53993', '51838', '14'), +('16', '83', '7', '102011', '60928', '14'), +('16', '83', '7', '102263', '55502', '14'), +('16', '83', '7', '53467', '54016', '14'), +('16', '83', '7', '83565', '41167', '14'), +('16', '83', '9', '67098', '156505', '14'), +('16', '83', '9', '46937', '57978', '14'), +('16', '83', '9', '102288', '49817', '14'), +('16', '83', '9', '39345', '45871', '14'), +('16', '83', '15', '102595', '90295', '14'), +('16', '83', '15', '102636', '88931', '14'), +('16', '83', '15', '102637', '88485', '14'), +('16', '83', '15', '102635', '87614', '14'), +('16', '83', '20', '102596', '101781', '14'), +('16', '83', '20', '102553', '89575', '14'), +('16', '83', '20', '80688', '77112', '14'), +('16', '83', '20', '46935', '60662', '14'), +('16', '83', '12', '53469', '61637', '14'), +('16', '83', '12', '102260', '51941', '14'), +('16', '83', '12', '53991', '49637', '14'), +('16', '83', '12', '39356', '44264', '14'), +('16', '83', '18', '102012', '62471', '14'), +('16', '83', '18', '102264', '56519', '14'), +('16', '83', '18', '53994', '51154', '14'), +('16', '83', '18', '83608', '45751', '14'), +('16', '83', '19', '76131', '57650', '14'), +('16', '83', '19', '53470', '54475', '14'), +('16', '83', '19', '102261', '52094', '14'), +('16', '83', '19', '53992', '50175', '14'), +('16', '83', '13', '102663', '454276', '14'), +('16', '83', '13', '102653', '429177', '14'), +('16', '83', '13', '102658', '424641', '14'), +('16', '83', '13', '102580', '422904', '14'), +('16', '83', '14', '46875', '52573', '14'), +('16', '83', '14', '46925', '51556', '14'), +('16', '83', '14', '83640', '40235', '14'), +('16', '83', '14', '47309', '35631', '14'), +('16', '83', '11', '102643', '89025', '14'), +('16', '83', '11', '102747', '82949', '14'), +('16', '83', '11', '80668', '63957', '14'), +('16', '83', '11', '102747', '62469', '14'), +('16', '84', '22', '21805', '0', '14'), +('16', '84', '22', '61948', '0', '14'), +('16', '84', '22', '66397', '0', '14'), +('16', '84', '22', '21807', '0', '14'), +('16', '84', '1', '102590', '87770', '14'), +('16', '84', '1', '102641', '87616', '14'), +('16', '84', '1', '102639', '86391', '14'), +('16', '84', '1', '102642', '86080', '14'), +('16', '84', '2', '102010', '60349', '14'), +('16', '84', '2', '102262', '54081', '14'), +('16', '84', '2', '53988', '49683', '14'), +('16', '84', '2', '70958', '46708', '14'), +('16', '84', '3', '102726', '96433', '14'), +('16', '84', '3', '102591', '93394', '14'), +('16', '84', '3', '102725', '83528', '14'), +('16', '84', '3', '102554', '82513', '14'), +('16', '84', '5', '102592', '91788', '14'), +('16', '84', '5', '102745', '84332', '14'), +('16', '84', '5', '102551', '80668', '14'), +('16', '84', '5', '80669', '66816', '14'), +('16', '84', '8', '102594', '92906', '14'), +('16', '84', '8', '102552', '90438', '14'), +('16', '84', '8', '102527', '69832', '14'), +('16', '84', '8', '80687', '68911', '14'), +('16', '84', '6', '102593', '93177', '14'), +('16', '84', '6', '102555', '81429', '14'), +('16', '84', '6', '80638', '71366', '14'), +('16', '84', '6', '46884', '57591', '14'), +('16', '84', '17', '102013', '63738', '14'), +('16', '84', '17', '102265', '58422', '14'), +('16', '84', '17', '83604', '55790', '14'), +('16', '84', '17', '53993', '51841', '14'), +('16', '84', '7', '102011', '60931', '14'), +('16', '84', '7', '102263', '55504', '14'), +('16', '84', '7', '53467', '54018', '14'), +('16', '84', '7', '83565', '41171', '14'), +('16', '84', '9', '67098', '158394', '14'), +('16', '84', '9', '46937', '57982', '14'), +('16', '84', '9', '102288', '49821', '14'), +('16', '84', '9', '39345', '45875', '14'), +('16', '84', '15', '102595', '90299', '14'), +('16', '84', '15', '102636', '88934', '14'), +('16', '84', '15', '102637', '88490', '14'), +('16', '84', '15', '102635', '87616', '14'), +('16', '84', '20', '102596', '101783', '14'), +('16', '84', '20', '102553', '89580', '14'), +('16', '84', '20', '80688', '77116', '14'), +('16', '84', '20', '46935', '60666', '14'), +('16', '84', '12', '53469', '61640', '14'), +('16', '84', '12', '102260', '51943', '14'), +('16', '84', '12', '53991', '49640', '14'), +('16', '84', '12', '39356', '44267', '14'), +('16', '84', '18', '102012', '62475', '14'), +('16', '84', '18', '102264', '56523', '14'), +('16', '84', '18', '53994', '51156', '14'), +('16', '84', '18', '83608', '45755', '14'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '84', '19', '76131', '57650', '14'), +('16', '84', '19', '53470', '54478', '14'), +('16', '84', '19', '102261', '52096', '14'), +('16', '84', '19', '53992', '50178', '14'), +('16', '84', '13', '102663', '455187', '14'), +('16', '84', '13', '102653', '429886', '14'), +('16', '84', '13', '102658', '425299', '14'), +('16', '84', '13', '102580', '423784', '14'), +('16', '84', '14', '46875', '52577', '14'), +('16', '84', '14', '46925', '51560', '14'), +('16', '84', '14', '83640', '40238', '14'), +('16', '84', '14', '47309', '35631', '14'), +('16', '84', '11', '102643', '89027', '14'), +('16', '84', '11', '102747', '82952', '14'), +('16', '84', '11', '80668', '63961', '14'), +('16', '84', '11', '102747', '62470', '14'), +('16', '85', '22', '21807', '0', '16'), +('16', '85', '22', '21805', '0', '16'), +('16', '85', '22', '61948', '0', '16'), +('16', '85', '22', '12425', '0', '16'), +('16', '85', '1', '111303', '167165', '16'), +('16', '85', '1', '111308', '166809', '16'), +('16', '85', '1', '111300', '165794', '16'), +('16', '85', '1', '111305', '165543', '16'), +('16', '85', '2', '94056', '107028', '16'), +('16', '85', '2', '62985', '105434', '16'), +('16', '85', '2', '104410', '87143', '16'), +('16', '85', '2', '54846', '67394', '16'), +('16', '85', '3', '111315', '166004', '16'), +('16', '85', '3', '111313', '165804', '16'), +('16', '85', '3', '111316', '162801', '16'), +('16', '85', '3', '111014', '146089', '16'), +('16', '85', '5', '111318', '165325', '16'), +('16', '85', '5', '111320', '164898', '16'), +('16', '85', '5', '111319', '161834', '16'), +('16', '85', '5', '111017', '145487', '16'), +('16', '85', '8', '111331', '168396', '16'), +('16', '85', '8', '111328', '167064', '16'), +('16', '85', '8', '111332', '162869', '16'), +('16', '85', '8', '111030', '148531', '16'), +('16', '85', '6', '111322', '165970', '16'), +('16', '85', '6', '111324', '165761', '16'), +('16', '85', '6', '111326', '161934', '16'), +('16', '85', '6', '111021', '146105', '16'), +('16', '85', '17', '56046', '112028', '16'), +('16', '85', '17', '81765', '110229', '16'), +('16', '85', '17', '56083', '110039', '16'), +('16', '85', '17', '104413', '93175', '16'), +('16', '85', '7', '94053', '108121', '16'), +('16', '85', '7', '56079', '106639', '16'), +('16', '85', '7', '104411', '91691', '16'), +('16', '85', '7', '54850', '67327', '16'), +('16', '85', '9', '67098', '160283', '16'), +('16', '85', '9', '56033', '103793', '16'), +('16', '85', '9', '56031', '103786', '16'), +('16', '85', '9', '56070', '103516', '16'), +('16', '85', '15', '111343', '167627', '16'), +('16', '85', '15', '111347', '166692', '16'), +('16', '85', '15', '111345', '164820', '16'), +('16', '85', '15', '111339', '163818', '16'), +('16', '85', '20', '111354', '179415', '16'), +('16', '85', '20', '111355', '176140', '16'), +('16', '85', '20', '111351', '174231', '16'), +('16', '85', '20', '111352', '172393', '16'), +('16', '85', '12', '81795', '104134', '16'), +('16', '85', '12', '56073', '103973', '16'), +('16', '85', '12', '104408', '87880', '16'), +('16', '85', '12', '49656', '66068', '16'), +('16', '85', '18', '62986', '108477', '16'), +('16', '85', '18', '56041', '107400', '16'), +('16', '85', '18', '94054', '105753', '16'), +('16', '85', '18', '104412', '93534', '16'), +('16', '85', '19', '62990', '107966', '16'), +('16', '85', '19', '56037', '106912', '16'), +('16', '85', '19', '56075', '105221', '16'), +('16', '85', '19', '81763', '104045', '16'), +('16', '85', '13', '111514', '683315', '16'), +('16', '85', '13', '111520', '674236', '16'), +('16', '85', '13', '111525', '670156', '16'), +('16', '85', '13', '111220', '633144', '16'), +('16', '85', '14', '62980', '111148', '16'), +('16', '85', '14', '54901', '68208', '16'), +('16', '85', '14', '46875', '52581', '16'), +('16', '85', '14', '46925', '51564', '16'), +('16', '85', '11', '111338', '167217', '16'), +('16', '85', '11', '111333', '165770', '16'), +('16', '85', '11', '111337', '162626', '16'), +('16', '85', '11', '111334', '162009', '16'), +('16', '85', '22', '21805', '0', '15'), +('16', '85', '22', '61948', '0', '15'), +('16', '85', '22', '66397', '0', '15'), +('16', '85', '22', '21807', '0', '15'), +('16', '85', '1', '107054', '125048', '15'), +('16', '85', '1', '107010', '122802', '15'), +('16', '85', '1', '107053', '121343', '15'), +('16', '85', '1', '107052', '118798', '15'), +('16', '85', '2', '94056', '107028', '15'), +('16', '85', '2', '62985', '105434', '15'), +('16', '85', '2', '104410', '87143', '15'), +('16', '85', '2', '54846', '67394', '15'), +('16', '85', '3', '107011', '125484', '15'), +('16', '85', '3', '107055', '124910', '15'), +('16', '85', '3', '106801', '117448', '15'), +('16', '85', '3', '106841', '115670', '15'), +('16', '85', '5', '107012', '122572', '15'), +('16', '85', '5', '107056', '122548', '15'), +('16', '85', '5', '106802', '117067', '15'), +('16', '85', '5', '106714', '105449', '15'), +('16', '85', '8', '106804', '127477', '15'), +('16', '85', '8', '107058', '126786', '15'), +('16', '85', '8', '107014', '125983', '15'), +('16', '85', '8', '106844', '117197', '15'), +('16', '85', '6', '106803', '125334', '15'), +('16', '85', '6', '107013', '124186', '15'), +('16', '85', '6', '107057', '124048', '15'), +('16', '85', '6', '106843', '124041', '15'), +('16', '85', '17', '56046', '112028', '15'), +('16', '85', '17', '81765', '110229', '15'), +('16', '85', '17', '56083', '110039', '15'), +('16', '85', '17', '104413', '93175', '15'), +('16', '85', '7', '94053', '108121', '15'), +('16', '85', '7', '56079', '106639', '15'), +('16', '85', '7', '104411', '91691', '15'), +('16', '85', '7', '54850', '67327', '15'), +('16', '85', '9', '67098', '160283', '15'), +('16', '85', '9', '56033', '103793', '15'), +('16', '85', '9', '56031', '103786', '15'), +('16', '85', '9', '56070', '103516', '15'), +('16', '85', '15', '107062', '123196', '15'), +('16', '85', '15', '107051', '121539', '15'), +('16', '85', '15', '107016', '121106', '15'), +('16', '85', '15', '107050', '119372', '15'), +('16', '85', '20', '107059', '134648', '15'), +('16', '85', '20', '107017', '132069', '15'), +('16', '85', '20', '106845', '125324', '15'), +('16', '85', '20', '106807', '116548', '15'), +('16', '85', '12', '81795', '104134', '15'), +('16', '85', '12', '56073', '103973', '15'), +('16', '85', '12', '104408', '87880', '15'), +('16', '85', '12', '53469', '61643', '15'), +('16', '85', '18', '62986', '108477', '15'), +('16', '85', '18', '56041', '107400', '15'), +('16', '85', '18', '94054', '105753', '15'), +('16', '85', '18', '104412', '93534', '15'), +('16', '85', '19', '62990', '107966', '15'), +('16', '85', '19', '56037', '106912', '15'), +('16', '85', '19', '56075', '105221', '15'), +('16', '85', '19', '81763', '104045', '15'), +('16', '85', '13', '106857', '519896', '15'), +('16', '85', '13', '106862', '516803', '15'), +('16', '85', '13', '106865', '509733', '15'), +('16', '85', '13', '106762', '489743', '15'), +('16', '85', '14', '62980', '111148', '15'), +('16', '85', '14', '54901', '68208', '15'), +('16', '85', '14', '46875', '52581', '15'), +('16', '85', '14', '46925', '51564', '15'), +('16', '85', '11', '107015', '121720', '15'), +('16', '85', '11', '106805', '115353', '15'), +('16', '85', '11', '62965', '107690', '15'), +('16', '85', '11', '106717', '104523', '15'), +('16', '86', '22', '21807', '0', '16'), +('16', '86', '22', '21805', '0', '16'), +('16', '86', '22', '61948', '0', '16'), +('16', '86', '22', '12425', '0', '16'), +('16', '86', '1', '111303', '167169', '16'), +('16', '86', '1', '111308', '166813', '16'), +('16', '86', '1', '111300', '165797', '16'), +('16', '86', '1', '111305', '165546', '16'), +('16', '86', '2', '94056', '107031', '16'), +('16', '86', '2', '62985', '105436', '16'), +('16', '86', '2', '104410', '87146', '16'), +('16', '86', '2', '54846', '67397', '16'), +('16', '86', '3', '111315', '166009', '16'), +('16', '86', '3', '111313', '165807', '16'), +('16', '86', '3', '111316', '162804', '16'), +('16', '86', '3', '111014', '146094', '16'), +('16', '86', '5', '111318', '165327', '16'), +('16', '86', '5', '111320', '164902', '16'), +('16', '86', '5', '111319', '161839', '16'), +('16', '86', '5', '111017', '145490', '16'), +('16', '86', '8', '111331', '168400', '16'), +('16', '86', '8', '111328', '167068', '16'), +('16', '86', '8', '111332', '162872', '16'), +('16', '86', '8', '111030', '148535', '16'), +('16', '86', '6', '111322', '165973', '16'), +('16', '86', '6', '111324', '165765', '16'), +('16', '86', '6', '111326', '161937', '16'), +('16', '86', '6', '111021', '146108', '16'), +('16', '86', '17', '56046', '112033', '16'), +('16', '86', '17', '81765', '110232', '16'), +('16', '86', '17', '56083', '110041', '16'), +('16', '86', '17', '104413', '93178', '16'), +('16', '86', '7', '94053', '108124', '16'), +('16', '86', '7', '56079', '106643', '16'), +('16', '86', '7', '104411', '91694', '16'), +('16', '86', '7', '54850', '67328', '16'), +('16', '86', '9', '67098', '162171', '16'), +('16', '86', '9', '56033', '103795', '16'), +('16', '86', '9', '56031', '103789', '16'), +('16', '86', '9', '56070', '103518', '16'), +('16', '86', '15', '111343', '167629', '16'), +('16', '86', '15', '111347', '166696', '16'), +('16', '86', '15', '111345', '164822', '16'), +('16', '86', '15', '111339', '163820', '16'), +('16', '86', '20', '111354', '179418', '16'), +('16', '86', '20', '111355', '176142', '16'), +('16', '86', '20', '111351', '174233', '16'), +('16', '86', '20', '111352', '172396', '16'), +('16', '86', '12', '81795', '104138', '16'), +('16', '86', '12', '56073', '103978', '16'), +('16', '86', '12', '104408', '87883', '16'), +('16', '86', '12', '49656', '66069', '16'), +('16', '86', '18', '62986', '108482', '16'), +('16', '86', '18', '56041', '107402', '16'), +('16', '86', '18', '94054', '105757', '16'), +('16', '86', '18', '104412', '93535', '16'), +('16', '86', '19', '62990', '107969', '16'), +('16', '86', '19', '56037', '106915', '16'), +('16', '86', '19', '56075', '105224', '16'), +('16', '86', '19', '81763', '104047', '16'), +('16', '86', '13', '111514', '684682', '16'), +('16', '86', '13', '111520', '675602', '16'), +('16', '86', '13', '111525', '671523', '16'), +('16', '86', '13', '111220', '634459', '16'), +('16', '86', '14', '62980', '111150', '16'), +('16', '86', '14', '54901', '68210', '16'), +('16', '86', '14', '46875', '52585', '16'), +('16', '86', '14', '46925', '51568', '16'), +('16', '86', '11', '111338', '167221', '16'), +('16', '86', '11', '111333', '165772', '16'), +('16', '86', '11', '111337', '162629', '16'), +('16', '86', '11', '111334', '162012', '16'), +('16', '87', '22', '21807', '0', '16'), +('16', '87', '22', '21805', '0', '16'), +('16', '87', '22', '61948', '0', '16'), +('16', '87', '22', '12425', '0', '16'), +('16', '87', '1', '111303', '167174', '16'), +('16', '87', '1', '111308', '166816', '16'), +('16', '87', '1', '111300', '165800', '16'), +('16', '87', '1', '111305', '165550', '16'), +('16', '87', '2', '94056', '107034', '16'), +('16', '87', '2', '62985', '105438', '16'), +('16', '87', '2', '104410', '87149', '16'), +('16', '87', '2', '54846', '67400', '16'), +('16', '87', '3', '111315', '166014', '16'), +('16', '87', '3', '111313', '165810', '16'), +('16', '87', '3', '111316', '162808', '16'), +('16', '87', '3', '111014', '146099', '16'), +('16', '87', '5', '111318', '165330', '16'), +('16', '87', '5', '111320', '164906', '16'), +('16', '87', '5', '111319', '161843', '16'), +('16', '87', '5', '111017', '145493', '16'), +('16', '87', '8', '111331', '168404', '16'), +('16', '87', '8', '111328', '167072', '16'), +('16', '87', '8', '111332', '162875', '16'), +('16', '87', '8', '111030', '148539', '16'), +('16', '87', '6', '111322', '165976', '16'), +('16', '87', '6', '111324', '165769', '16'), +('16', '87', '6', '111326', '161941', '16'), +('16', '87', '6', '111021', '146111', '16'), +('16', '87', '17', '56046', '112038', '16'), +('16', '87', '17', '81765', '110235', '16'), +('16', '87', '17', '56083', '110043', '16'), +('16', '87', '17', '104413', '93182', '16'), +('16', '87', '7', '94053', '108128', '16'), +('16', '87', '7', '56079', '106647', '16'), +('16', '87', '7', '104411', '91697', '16'), +('16', '87', '7', '54850', '67329', '16'), +('16', '87', '9', '67098', '164061', '16'), +('16', '87', '9', '56033', '103797', '16'), +('16', '87', '9', '56031', '103791', '16'), +('16', '87', '9', '56070', '103519', '16'), +('16', '87', '15', '111343', '167632', '16'), +('16', '87', '15', '111347', '166700', '16'), +('16', '87', '15', '111345', '164825', '16'), +('16', '87', '15', '111339', '163823', '16'), +('16', '87', '20', '111354', '179422', '16'), +('16', '87', '20', '111355', '176145', '16'), +('16', '87', '20', '111351', '174236', '16'), +('16', '87', '20', '111352', '172400', '16'), +('16', '87', '12', '81795', '104143', '16'), +('16', '87', '12', '56073', '103983', '16'), +('16', '87', '12', '104408', '87886', '16'), +('16', '87', '12', '49656', '66069', '16'), +('16', '87', '18', '62986', '108487', '16'), +('16', '87', '18', '56041', '107403', '16'), +('16', '87', '18', '94054', '105761', '16'), +('16', '87', '18', '104412', '93537', '16'), +('16', '87', '19', '62990', '107972', '16'), +('16', '87', '19', '56037', '106919', '16'), +('16', '87', '19', '56075', '105228', '16'), +('16', '87', '19', '81763', '104050', '16'), +('16', '87', '13', '111514', '686099', '16'), +('16', '87', '13', '111520', '676968', '16'), +('16', '87', '13', '111525', '672889', '16'), +('16', '87', '13', '111220', '635775', '16'), +('16', '87', '14', '62980', '111153', '16'), +('16', '87', '14', '54901', '68213', '16'), +('16', '87', '14', '46875', '52589', '16'), +('16', '87', '14', '46925', '51572', '16'), +('16', '87', '11', '111338', '167225', '16'), +('16', '87', '11', '111333', '165775', '16'), +('16', '87', '11', '111337', '162632', '16'), +('16', '87', '11', '111334', '162016', '16'), +('16', '88', '22', '21807', '0', '16'), +('16', '88', '22', '21805', '0', '16'), +('16', '88', '22', '61948', '0', '16'), +('16', '88', '22', '12425', '0', '16'), +('16', '88', '1', '111303', '167179', '16'), +('16', '88', '1', '111308', '166820', '16'), +('16', '88', '1', '111300', '165802', '16'), +('16', '88', '1', '111305', '165553', '16'), +('16', '88', '2', '94056', '107037', '16'), +('16', '88', '2', '62985', '105440', '16'), +('16', '88', '2', '104410', '87152', '16'), +('16', '88', '2', '54846', '67402', '16'), +('16', '88', '3', '111315', '166019', '16'), +('16', '88', '3', '111313', '165812', '16'), +('16', '88', '3', '111316', '162812', '16'), +('16', '88', '3', '111014', '146104', '16'), +('16', '88', '5', '111318', '165333', '16'), +('16', '88', '5', '111320', '164910', '16'), +('16', '88', '5', '111319', '161848', '16'), +('16', '88', '5', '111017', '145495', '16'), +('16', '88', '8', '111331', '168409', '16'), +('16', '88', '8', '111328', '167077', '16'), +('16', '88', '8', '111332', '162877', '16'), +('16', '88', '8', '111030', '148544', '16'), +('16', '88', '6', '111322', '165979', '16'), +('16', '88', '6', '111324', '165773', '16'), +('16', '88', '6', '111326', '161944', '16'), +('16', '88', '6', '111021', '146114', '16'), +('16', '88', '17', '56046', '112043', '16'), +('16', '88', '17', '81765', '110238', '16'), +('16', '88', '17', '56083', '110045', '16'), +('16', '88', '17', '104413', '93186', '16'), +('16', '88', '7', '94053', '108132', '16'), +('16', '88', '7', '56079', '106652', '16'), +('16', '88', '7', '104411', '91700', '16'), +('16', '88', '7', '54850', '67330', '16'), +('16', '88', '9', '67098', '165950', '16'), +('16', '88', '9', '56033', '103799', '16'), +('16', '88', '9', '56031', '103793', '16'), +('16', '88', '9', '56070', '103521', '16'), +('16', '88', '15', '111343', '167634', '16'), +('16', '88', '15', '111347', '166704', '16'), +('16', '88', '15', '111345', '164828', '16'), +('16', '88', '15', '111339', '163826', '16'), +('16', '88', '20', '111354', '179425', '16'), +('16', '88', '20', '111355', '176147', '16'), +('16', '88', '20', '111351', '174238', '16'), +('16', '88', '20', '111352', '172404', '16'), +('16', '88', '12', '81795', '104147', '16'), +('16', '88', '12', '56073', '103988', '16'), +('16', '88', '12', '104408', '87890', '16'), +('16', '88', '12', '49656', '66070', '16'), +('16', '88', '18', '62986', '108492', '16'), +('16', '88', '18', '56041', '107405', '16'), +('16', '88', '18', '94054', '105765', '16'), +('16', '88', '18', '104412', '93539', '16'), +('16', '88', '19', '62990', '107976', '16'), +('16', '88', '19', '56037', '106922', '16'), +('16', '88', '19', '56075', '105231', '16'), +('16', '88', '19', '81763', '104053', '16'), +('16', '88', '13', '111514', '687465', '16'), +('16', '88', '13', '111520', '678334', '16'), +('16', '88', '13', '111525', '674256', '16'), +('16', '88', '13', '111220', '637091', '16'), +('16', '88', '14', '62980', '111155', '16'), +('16', '88', '14', '54901', '68216', '16'), +('16', '88', '14', '46875', '52593', '16'), +('16', '88', '14', '46925', '51576', '16'), +('16', '88', '11', '111338', '167229', '16'), +('16', '88', '11', '111333', '165778', '16'), +('16', '88', '11', '111337', '162635', '16'), +('16', '88', '11', '111334', '162020', '16'), +('16', '89', '22', '21807', '0', '16'), +('16', '89', '22', '21805', '0', '16'), +('16', '89', '22', '61948', '0', '16'), +('16', '89', '22', '12425', '0', '16'), +('16', '89', '1', '111303', '167183', '16'), +('16', '89', '1', '111308', '166823', '16'), +('16', '89', '1', '111300', '165805', '16'), +('16', '89', '1', '111305', '165557', '16'), +('16', '89', '2', '94056', '107040', '16'), +('16', '89', '2', '62985', '105442', '16'), +('16', '89', '2', '104410', '87155', '16'), +('16', '89', '2', '54846', '67405', '16'), +('16', '89', '3', '111315', '166024', '16'), +('16', '89', '3', '111313', '165815', '16'), +('16', '89', '3', '111316', '162815', '16'), +('16', '89', '3', '111014', '146109', '16'), +('16', '89', '5', '111318', '165335', '16'), +('16', '89', '5', '111320', '164913', '16'), +('16', '89', '5', '111319', '161852', '16'), +('16', '89', '5', '111017', '145498', '16'), +('16', '89', '8', '111331', '168412', '16'), +('16', '89', '8', '111328', '167081', '16'), +('16', '89', '8', '111332', '162880', '16'), +('16', '89', '8', '111030', '148547', '16'), +('16', '89', '6', '111322', '165982', '16'), +('16', '89', '6', '111324', '165777', '16'), +('16', '89', '6', '111326', '161947', '16'), +('16', '89', '6', '111021', '146117', '16'), +('16', '89', '17', '56046', '112048', '16'), +('16', '89', '17', '81765', '110241', '16'), +('16', '89', '17', '56083', '110047', '16'), +('16', '89', '17', '104413', '93190', '16'), +('16', '89', '7', '94053', '108135', '16'), +('16', '89', '7', '56079', '106656', '16'), +('16', '89', '7', '104411', '91703', '16'), +('16', '89', '7', '54850', '67331', '16'), +('16', '89', '9', '67098', '167839', '16'), +('16', '89', '9', '56033', '103801', '16'), +('16', '89', '9', '56031', '103795', '16'), +('16', '89', '9', '56070', '103523', '16'), +('16', '89', '15', '111343', '167637', '16'), +('16', '89', '15', '111347', '166708', '16'), +('16', '89', '15', '111345', '164830', '16'), +('16', '89', '15', '111339', '163829', '16'), +('16', '89', '20', '111354', '179428', '16'), +('16', '89', '20', '111355', '176149', '16'), +('16', '89', '20', '111351', '174240', '16'), +('16', '89', '20', '111352', '172408', '16'), +('16', '89', '12', '81795', '104151', '16'), +('16', '89', '12', '56073', '103993', '16'), +('16', '89', '12', '104408', '87893', '16'), +('16', '89', '12', '49656', '66070', '16'), +('16', '89', '18', '62986', '108497', '16'), +('16', '89', '18', '56041', '107406', '16'), +('16', '89', '18', '94054', '105768', '16'), +('16', '89', '18', '104412', '93541', '16'), +('16', '89', '19', '62990', '107979', '16'), +('16', '89', '19', '56037', '106926', '16'), +('16', '89', '19', '56075', '105235', '16'), +('16', '89', '19', '81763', '104056', '16'), +('16', '89', '13', '111514', '688832', '16'), +('16', '89', '13', '111520', '679700', '16'), +('16', '89', '13', '111525', '675622', '16'), +('16', '89', '13', '111220', '638357', '16'), +('16', '89', '14', '62980', '111158', '16'), +('16', '89', '14', '54901', '68218', '16'), +('16', '89', '14', '46875', '52597', '16'), +('16', '89', '14', '46925', '51580', '16'), +('16', '89', '11', '111338', '167233', '16'), +('16', '89', '11', '111333', '165781', '16'), +('16', '89', '11', '111337', '162638', '16'), +('16', '89', '11', '111334', '162023', '16'), +('16', '90', '22', '21807', '0', '17'), +('16', '90', '22', '21805', '0', '17'), +('16', '90', '22', '61948', '0', '17'), +('16', '90', '22', '12425', '0', '17'), +('16', '90', '1', '111303', '167188', '17'), +('16', '90', '1', '111308', '166827', '17'), +('16', '90', '1', '111300', '165808', '17'), +('16', '90', '1', '111305', '165560', '17'), +('16', '90', '2', '94056', '107043', '17'), +('16', '90', '2', '62985', '105445', '17'), +('16', '90', '2', '104410', '87158', '17'), +('16', '90', '2', '54846', '67408', '17'), +('16', '90', '3', '111315', '166030', '17'), +('16', '90', '3', '111313', '165818', '17'), +('16', '90', '3', '111316', '162818', '17'), +('16', '90', '3', '111014', '146115', '17'), +('16', '90', '5', '111318', '165338', '17'), +('16', '90', '5', '111320', '164917', '17'), +('16', '90', '5', '111319', '161857', '17'), +('16', '90', '5', '111017', '145501', '17'), +('16', '90', '8', '111331', '168417', '17'), +('16', '90', '8', '111328', '167085', '17'), +('16', '90', '8', '111332', '162882', '17'), +('16', '90', '8', '111030', '148552', '17'), +('16', '90', '6', '111322', '165985', '17'), +('16', '90', '6', '111324', '165781', '17'), +('16', '90', '6', '111326', '161951', '17'), +('16', '90', '6', '111021', '146120', '17'), +('16', '90', '17', '56046', '112053', '17'), +('16', '90', '17', '81765', '110244', '17'), +('16', '90', '17', '56083', '110049', '17'), +('16', '90', '17', '104413', '93194', '17'), +('16', '90', '7', '94053', '108139', '17'), +('16', '90', '7', '56079', '106660', '17'), +('16', '90', '7', '104411', '91706', '17'), +('16', '90', '7', '54850', '67332', '17'), +('16', '90', '9', '67098', '169728', '17'), +('16', '90', '9', '56033', '103803', '17'), +('16', '90', '9', '56031', '103798', '17'), +('16', '90', '9', '56070', '103524', '17'), +('16', '90', '15', '111343', '167639', '17'), +('16', '90', '15', '111347', '166713', '17'), +('16', '90', '15', '111345', '164833', '17'), +('16', '90', '15', '111339', '163832', '17'), +('16', '90', '20', '111354', '179432', '17'), +('16', '90', '20', '111355', '176152', '17'), +('16', '90', '20', '111351', '174242', '17'), +('16', '90', '20', '111352', '172411', '17'), +('16', '90', '12', '81795', '104156', '17'), +('16', '90', '12', '56073', '103998', '17'), +('16', '90', '12', '104408', '87897', '17'), +('16', '90', '12', '49656', '66070', '17'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '90', '18', '62986', '108502', '17'), +('16', '90', '18', '56041', '107408', '17'), +('16', '90', '18', '94054', '105772', '17'), +('16', '90', '18', '104412', '93543', '17'), +('16', '90', '19', '62990', '107983', '17'), +('16', '90', '19', '56037', '106929', '17'), +('16', '90', '19', '56075', '105238', '17'), +('16', '90', '19', '81763', '104059', '17'), +('16', '90', '13', '111514', '690249', '17'), +('16', '90', '13', '111520', '681066', '17'), +('16', '90', '13', '111525', '676989', '17'), +('16', '90', '13', '111220', '639673', '17'), +('16', '90', '14', '62980', '111160', '17'), +('16', '90', '14', '54901', '68221', '17'), +('16', '90', '14', '46875', '52601', '17'), +('16', '90', '14', '46925', '51584', '17'), +('16', '90', '11', '111338', '167238', '17'), +('16', '90', '11', '111333', '165784', '17'), +('16', '90', '11', '111337', '162642', '17'), +('16', '90', '11', '111334', '162026', '17'), +('16', '91', '22', '21807', '0', '17'), +('16', '91', '22', '21805', '0', '17'), +('16', '91', '22', '61948', '0', '17'), +('16', '91', '22', '12425', '0', '17'), +('16', '91', '1', '111303', '167193', '17'), +('16', '91', '1', '111308', '166831', '17'), +('16', '91', '1', '111300', '165810', '17'), +('16', '91', '1', '111305', '165564', '17'), +('16', '91', '2', '94056', '107047', '17'), +('16', '91', '2', '62985', '105447', '17'), +('16', '91', '2', '104410', '87161', '17'), +('16', '91', '2', '54846', '67410', '17'), +('16', '91', '3', '111315', '166035', '17'), +('16', '91', '3', '111313', '165820', '17'), +('16', '91', '3', '111316', '162822', '17'), +('16', '91', '3', '111014', '146120', '17'), +('16', '91', '5', '111318', '165341', '17'), +('16', '91', '5', '111320', '164921', '17'), +('16', '91', '5', '111319', '161862', '17'), +('16', '91', '5', '111017', '145503', '17'), +('16', '91', '8', '111331', '168421', '17'), +('16', '91', '8', '111328', '167089', '17'), +('16', '91', '8', '111332', '162885', '17'), +('16', '91', '8', '111030', '148556', '17'), +('16', '91', '6', '111322', '165988', '17'), +('16', '91', '6', '111324', '165785', '17'), +('16', '91', '6', '111326', '161954', '17'), +('16', '91', '6', '111021', '146123', '17'), +('16', '91', '17', '56046', '112058', '17'), +('16', '91', '17', '81765', '110247', '17'), +('16', '91', '17', '56083', '110052', '17'), +('16', '91', '17', '104413', '93198', '17'), +('16', '91', '7', '94053', '108143', '17'), +('16', '91', '7', '56079', '106664', '17'), +('16', '91', '7', '104411', '91710', '17'), +('16', '91', '7', '54850', '67333', '17'), +('16', '91', '9', '67098', '169731', '17'), +('16', '91', '9', '56033', '103805', '17'), +('16', '91', '9', '56031', '103800', '17'), +('16', '91', '9', '56070', '103526', '17'), +('16', '91', '15', '111343', '167642', '17'), +('16', '91', '15', '111347', '166717', '17'), +('16', '91', '15', '111345', '164836', '17'), +('16', '91', '15', '111339', '163835', '17'), +('16', '91', '20', '111354', '179435', '17'), +('16', '91', '20', '111355', '176154', '17'), +('16', '91', '20', '111351', '174245', '17'), +('16', '91', '20', '111352', '172415', '17'), +('16', '91', '12', '81795', '104160', '17'), +('16', '91', '12', '56073', '104003', '17'), +('16', '91', '12', '104408', '87901', '17'), +('16', '91', '12', '49656', '66071', '17'), +('16', '91', '18', '62986', '108508', '17'), +('16', '91', '18', '56041', '107410', '17'), +('16', '91', '18', '94054', '105776', '17'), +('16', '91', '18', '104412', '93544', '17'), +('16', '91', '19', '62990', '107987', '17'), +('16', '91', '19', '56037', '106933', '17'), +('16', '91', '19', '56075', '105242', '17'), +('16', '91', '19', '81763', '104061', '17'), +('16', '91', '13', '111514', '691616', '17'), +('16', '91', '13', '111520', '682432', '17'), +('16', '91', '13', '111525', '678305', '17'), +('16', '91', '13', '111220', '640989', '17'), +('16', '91', '14', '62980', '111163', '17'), +('16', '91', '14', '54901', '68224', '17'), +('16', '91', '14', '46875', '52606', '17'), +('16', '91', '14', '46925', '51588', '17'), +('16', '91', '11', '111338', '167242', '17'), +('16', '91', '11', '111333', '165787', '17'), +('16', '91', '11', '111337', '162645', '17'), +('16', '91', '11', '111334', '162030', '17'), +('16', '92', '22', '21807', '0', '17'), +('16', '92', '22', '21805', '0', '17'), +('16', '92', '22', '61948', '0', '17'), +('16', '92', '22', '12425', '0', '17'), +('16', '92', '1', '111303', '167198', '17'), +('16', '92', '1', '111308', '166835', '17'), +('16', '92', '1', '111300', '165813', '17'), +('16', '92', '1', '111305', '165568', '17'), +('16', '92', '2', '94056', '107050', '17'), +('16', '92', '2', '62985', '105449', '17'), +('16', '92', '2', '104410', '87165', '17'), +('16', '92', '2', '54846', '67413', '17'), +('16', '92', '3', '111315', '166041', '17'), +('16', '92', '3', '111313', '165823', '17'), +('16', '92', '3', '111316', '162826', '17'), +('16', '92', '3', '111014', '146126', '17'), +('16', '92', '5', '111318', '165344', '17'), +('16', '92', '5', '111320', '164925', '17'), +('16', '92', '5', '111319', '161866', '17'), +('16', '92', '5', '111017', '145506', '17'), +('16', '92', '8', '111331', '168425', '17'), +('16', '92', '8', '111328', '167093', '17'), +('16', '92', '8', '111332', '162888', '17'), +('16', '92', '8', '111030', '148560', '17'), +('16', '92', '6', '111322', '165991', '17'), +('16', '92', '6', '111324', '165789', '17'), +('16', '92', '6', '111326', '161958', '17'), +('16', '92', '6', '111021', '146126', '17'), +('16', '92', '17', '56046', '112063', '17'), +('16', '92', '17', '81765', '110250', '17'), +('16', '92', '17', '56083', '110054', '17'), +('16', '92', '17', '104413', '93202', '17'), +('16', '92', '7', '94053', '108147', '17'), +('16', '92', '7', '56079', '106668', '17'), +('16', '92', '7', '104411', '91713', '17'), +('16', '92', '7', '54850', '67334', '17'), +('16', '92', '9', '67098', '169735', '17'), +('16', '92', '9', '56033', '103807', '17'), +('16', '92', '9', '56031', '103802', '17'), +('16', '92', '9', '56070', '103528', '17'), +('16', '92', '15', '111343', '167645', '17'), +('16', '92', '15', '111347', '166721', '17'), +('16', '92', '15', '111345', '164838', '17'), +('16', '92', '15', '111339', '163838', '17'), +('16', '92', '20', '111354', '179438', '17'), +('16', '92', '20', '111355', '176157', '17'), +('16', '92', '20', '111351', '174247', '17'), +('16', '92', '20', '111352', '172419', '17'), +('16', '92', '12', '81795', '104164', '17'), +('16', '92', '12', '56073', '104008', '17'), +('16', '92', '12', '104408', '87904', '17'), +('16', '92', '12', '49656', '66071', '17'), +('16', '92', '18', '62986', '108513', '17'), +('16', '92', '18', '56041', '107411', '17'), +('16', '92', '18', '94054', '105780', '17'), +('16', '92', '18', '104412', '93546', '17'), +('16', '92', '19', '62990', '107990', '17'), +('16', '92', '19', '56037', '106936', '17'), +('16', '92', '19', '56075', '105246', '17'), +('16', '92', '19', '81763', '104064', '17'), +('16', '92', '13', '111514', '692982', '17'), +('16', '92', '13', '111520', '683747', '17'), +('16', '92', '13', '111525', '679672', '17'), +('16', '92', '13', '111220', '642305', '17'), +('16', '92', '14', '62980', '111165', '17'), +('16', '92', '14', '54901', '68227', '17'), +('16', '92', '14', '46875', '52610', '17'), +('16', '92', '14', '46925', '51593', '17'), +('16', '92', '11', '111338', '167246', '17'), +('16', '92', '11', '111333', '165789', '17'), +('16', '92', '11', '111337', '162649', '17'), +('16', '92', '11', '111334', '162034', '17'), +('16', '93', '22', '21807', '0', '17'), +('16', '93', '22', '21805', '0', '17'), +('16', '93', '22', '61948', '0', '17'), +('16', '93', '22', '12425', '0', '17'), +('16', '93', '1', '111303', '167203', '17'), +('16', '93', '1', '111308', '166838', '17'), +('16', '93', '1', '111300', '165816', '17'), +('16', '93', '1', '111305', '165571', '17'), +('16', '93', '2', '94056', '107053', '17'), +('16', '93', '2', '62985', '105451', '17'), +('16', '93', '2', '104410', '87168', '17'), +('16', '93', '2', '54846', '67416', '17'), +('16', '93', '3', '111315', '166046', '17'), +('16', '93', '3', '111313', '165826', '17'), +('16', '93', '3', '111316', '162829', '17'), +('16', '93', '3', '111014', '146131', '17'), +('16', '93', '5', '111318', '165346', '17'), +('16', '93', '5', '111320', '164928', '17'), +('16', '93', '5', '111319', '161871', '17'), +('16', '93', '5', '111017', '145509', '17'), +('16', '93', '8', '111331', '168429', '17'), +('16', '93', '8', '111328', '167097', '17'), +('16', '93', '8', '111332', '162890', '17'), +('16', '93', '8', '111030', '148564', '17'), +('16', '93', '6', '111322', '165995', '17'), +('16', '93', '6', '111324', '165793', '17'), +('16', '93', '6', '111326', '161961', '17'), +('16', '93', '6', '111021', '146130', '17'), +('16', '93', '17', '56046', '112068', '17'), +('16', '93', '17', '81765', '110253', '17'), +('16', '93', '17', '56083', '110056', '17'), +('16', '93', '17', '104413', '93206', '17'), +('16', '93', '7', '94053', '108151', '17'), +('16', '93', '7', '56079', '106672', '17'), +('16', '93', '7', '104411', '91716', '17'), +('16', '93', '7', '54850', '67335', '17'), +('16', '93', '9', '67098', '169738', '17'), +('16', '93', '9', '56033', '103809', '17'), +('16', '93', '9', '56031', '103804', '17'), +('16', '93', '9', '56070', '103529', '17'), +('16', '93', '15', '111343', '167647', '17'), +('16', '93', '15', '111347', '166726', '17'), +('16', '93', '15', '111345', '164841', '17'), +('16', '93', '15', '111339', '163841', '17'), +('16', '93', '20', '111354', '179442', '17'), +('16', '93', '20', '111355', '176159', '17'), +('16', '93', '20', '111351', '174249', '17'), +('16', '93', '20', '111352', '172423', '17'), +('16', '93', '12', '81795', '104169', '17'), +('16', '93', '12', '56073', '104013', '17'), +('16', '93', '12', '104408', '87908', '17'), +('16', '93', '12', '49656', '66072', '17'), +('16', '93', '18', '62986', '108518', '17'), +('16', '93', '18', '56041', '107413', '17'), +('16', '93', '18', '94054', '105784', '17'), +('16', '93', '18', '104412', '93548', '17'), +('16', '93', '19', '62990', '107994', '17'), +('16', '93', '19', '56037', '106940', '17'), +('16', '93', '19', '56075', '105249', '17'), +('16', '93', '19', '81763', '104067', '17'), +('16', '93', '13', '111514', '694400', '17'), +('16', '93', '13', '111520', '685113', '17'), +('16', '93', '13', '111525', '681039', '17'), +('16', '93', '13', '111220', '643621', '17'), +('16', '93', '14', '62980', '111168', '17'), +('16', '93', '14', '54901', '68229', '17'), +('16', '93', '14', '46875', '52614', '17'), +('16', '93', '14', '46925', '51597', '17'), +('16', '93', '11', '111338', '167251', '17'), +('16', '93', '11', '111333', '165792', '17'), +('16', '93', '11', '111337', '162652', '17'), +('16', '93', '11', '111334', '162037', '17'), +('16', '94', '22', '21807', '0', '17'), +('16', '94', '22', '21805', '0', '17'), +('16', '94', '22', '61948', '0', '17'), +('16', '94', '22', '12425', '0', '17'), +('16', '94', '1', '111303', '167207', '17'), +('16', '94', '1', '111308', '166842', '17'), +('16', '94', '1', '111300', '165819', '17'), +('16', '94', '1', '111305', '165575', '17'), +('16', '94', '2', '94056', '107056', '17'), +('16', '94', '2', '62985', '105453', '17'), +('16', '94', '2', '104410', '87171', '17'), +('16', '94', '2', '54846', '67419', '17'), +('16', '94', '3', '111315', '166051', '17'), +('16', '94', '3', '111313', '165829', '17'), +('16', '94', '3', '111316', '162833', '17'), +('16', '94', '3', '111014', '146136', '17'), +('16', '94', '5', '111318', '165349', '17'), +('16', '94', '5', '111320', '164932', '17'), +('16', '94', '5', '111319', '161876', '17'), +('16', '94', '5', '111017', '145512', '17'), +('16', '94', '8', '111331', '168433', '17'), +('16', '94', '8', '111328', '167102', '17'), +('16', '94', '8', '111332', '162893', '17'), +('16', '94', '8', '111030', '148568', '17'), +('16', '94', '6', '111322', '165998', '17'), +('16', '94', '6', '111324', '165797', '17'), +('16', '94', '6', '111326', '161965', '17'), +('16', '94', '6', '111021', '146133', '17'), +('16', '94', '17', '56046', '112073', '17'), +('16', '94', '17', '81765', '110256', '17'), +('16', '94', '17', '56083', '110058', '17'), +('16', '94', '17', '104413', '93210', '17'), +('16', '94', '7', '94053', '108155', '17'), +('16', '94', '7', '56079', '106677', '17'), +('16', '94', '7', '104411', '91719', '17'), +('16', '94', '7', '54850', '67337', '17'), +('16', '94', '9', '67098', '169742', '17'), +('16', '94', '9', '56033', '103811', '17'), +('16', '94', '9', '56031', '103807', '17'), +('16', '94', '9', '56070', '103531', '17'), +('16', '94', '15', '111343', '167650', '17'), +('16', '94', '15', '111347', '166730', '17'), +('16', '94', '15', '111345', '164844', '17'), +('16', '94', '15', '111339', '163844', '17'), +('16', '94', '20', '111354', '179445', '17'), +('16', '94', '20', '111355', '176162', '17'), +('16', '94', '20', '111351', '174252', '17'), +('16', '94', '20', '111352', '172427', '17'), +('16', '94', '12', '81795', '104173', '17'), +('16', '94', '12', '56073', '104018', '17'), +('16', '94', '12', '104408', '87911', '17'), +('16', '94', '12', '49656', '66072', '17'), +('16', '94', '18', '62986', '108523', '17'), +('16', '94', '18', '56041', '107414', '17'), +('16', '94', '18', '94054', '105788', '17'), +('16', '94', '18', '104412', '93550', '17'), +('16', '94', '19', '62990', '107997', '17'), +('16', '94', '19', '56037', '106944', '17'), +('16', '94', '19', '56075', '105253', '17'), +('16', '94', '19', '81763', '104070', '17'), +('16', '94', '13', '111514', '695766', '17'), +('16', '94', '13', '111520', '686479', '17'), +('16', '94', '13', '111525', '682405', '17'), +('16', '94', '13', '111220', '644937', '17'), +('16', '94', '14', '62980', '111170', '17'), +('16', '94', '14', '54901', '68232', '17'), +('16', '94', '14', '46875', '52618', '17'), +('16', '94', '14', '46925', '51601', '17'), +('16', '94', '11', '111338', '167255', '17'), +('16', '94', '11', '111333', '165795', '17'), +('16', '94', '11', '111337', '162655', '17'), +('16', '94', '11', '111334', '162041', '17'), +('16', '95', '22', '12425', '0', '18'), +('16', '95', '22', '21807', '0', '18'), +('16', '95', '22', '21805', '0', '18'), +('16', '95', '22', '39342', '0', '18'), +('16', '95', '1', '111303', '167212', '18'), +('16', '95', '1', '111308', '166846', '18'), +('16', '95', '1', '111300', '165821', '18'), +('16', '95', '1', '111305', '165578', '18'), +('16', '95', '2', '94056', '107060', '18'), +('16', '95', '2', '62985', '105455', '18'), +('16', '95', '2', '104410', '87174', '18'), +('16', '95', '2', '54846', '67422', '18'), +('16', '95', '3', '111315', '166057', '18'), +('16', '95', '3', '111313', '165831', '18'), +('16', '95', '3', '111316', '162836', '18'), +('16', '95', '3', '111014', '146142', '18'), +('16', '95', '5', '111318', '165352', '18'), +('16', '95', '5', '111320', '164936', '18'), +('16', '95', '5', '111319', '161880', '18'), +('16', '95', '5', '111017', '145514', '18'), +('16', '95', '8', '111331', '168438', '18'), +('16', '95', '8', '111328', '167106', '18'), +('16', '95', '8', '111332', '162895', '18'), +('16', '95', '8', '111030', '148573', '18'), +('16', '95', '6', '111322', '166001', '18'), +('16', '95', '6', '111324', '165802', '18'), +('16', '95', '6', '111326', '161968', '18'), +('16', '95', '6', '111021', '146136', '18'), +('16', '95', '17', '56046', '112079', '18'), +('16', '95', '17', '81765', '110259', '18'), +('16', '95', '17', '56083', '110060', '18'), +('16', '95', '17', '104413', '93214', '18'), +('16', '95', '7', '94053', '108158', '18'), +('16', '95', '7', '56079', '106681', '18'), +('16', '95', '7', '104411', '91722', '18'), +('16', '95', '7', '54850', '67338', '18'), +('16', '95', '9', '67098', '169745', '18'), +('16', '95', '9', '56033', '103813', '18'), +('16', '95', '9', '56031', '103809', '18'), +('16', '95', '9', '56070', '103533', '18'), +('16', '95', '15', '111343', '167652', '18'), +('16', '95', '15', '111347', '166734', '18'), +('16', '95', '15', '111345', '164847', '18'), +('16', '95', '15', '111339', '163847', '18'), +('16', '95', '20', '111354', '179448', '18'), +('16', '95', '20', '111355', '176165', '18'), +('16', '95', '20', '111351', '174254', '18'), +('16', '95', '20', '111352', '172431', '18'), +('16', '95', '12', '81795', '104178', '18'), +('16', '95', '12', '56073', '104024', '18'), +('16', '95', '12', '104408', '87915', '18'), +('16', '95', '12', '49656', '66073', '18'), +('16', '95', '18', '62986', '108529', '18'), +('16', '95', '18', '56041', '107416', '18'), +('16', '95', '18', '94054', '105792', '18'), +('16', '95', '18', '104412', '93552', '18'), +('16', '95', '19', '62990', '108001', '18'), +('16', '95', '19', '56037', '106947', '18'), +('16', '95', '19', '56075', '105256', '18'), +('16', '95', '19', '81763', '104073', '18'), +('16', '95', '13', '111514', '697133', '18'), +('16', '95', '13', '111520', '687845', '18'), +('16', '95', '13', '111525', '683772', '18'), +('16', '95', '13', '111220', '646253', '18'), +('16', '95', '14', '62980', '111173', '18'), +('16', '95', '14', '54901', '68235', '18'), +('16', '95', '14', '46875', '52622', '18'), +('16', '95', '14', '46925', '51605', '18'), +('16', '95', '11', '111338', '167259', '18'), +('16', '95', '11', '111333', '165798', '18'), +('16', '95', '11', '111337', '162659', '18'), +('16', '95', '11', '111334', '162044', '18'), +('16', '96', '22', '12425', '0', '18'), +('16', '96', '22', '21807', '0', '18'), +('16', '96', '22', '21805', '0', '18'), +('16', '96', '22', '39342', '0', '18'), +('16', '96', '1', '111303', '167217', '18'), +('16', '96', '1', '111308', '166849', '18'), +('16', '96', '1', '111300', '165824', '18'), +('16', '96', '1', '111305', '165582', '18'), +('16', '96', '2', '94056', '107063', '18'), +('16', '96', '2', '62985', '105457', '18'), +('16', '96', '2', '104410', '87178', '18'), +('16', '96', '2', '54846', '67424', '18'), +('16', '96', '3', '111315', '166062', '18'), +('16', '96', '3', '111313', '165834', '18'), +('16', '96', '3', '111316', '162840', '18'), +('16', '96', '3', '111014', '146147', '18'), +('16', '96', '5', '111318', '165355', '18'), +('16', '96', '5', '111320', '164940', '18'), +('16', '96', '5', '111319', '161885', '18'), +('16', '96', '5', '111017', '145517', '18'), +('16', '96', '8', '111331', '168442', '18'), +('16', '96', '8', '111328', '167110', '18'), +('16', '96', '8', '111332', '162898', '18'), +('16', '96', '8', '111030', '148577', '18'), +('16', '96', '6', '111322', '166004', '18'), +('16', '96', '6', '111324', '165806', '18'), +('16', '96', '6', '111326', '161972', '18'), +('16', '96', '6', '111021', '146139', '18'), +('16', '96', '17', '56046', '112084', '18'), +('16', '96', '17', '81765', '110262', '18'), +('16', '96', '17', '56083', '110062', '18'), +('16', '96', '17', '104413', '93218', '18'), +('16', '96', '7', '94053', '108162', '18'), +('16', '96', '7', '56079', '106685', '18'), +('16', '96', '7', '104411', '91726', '18'), +('16', '96', '7', '54850', '67339', '18'), +('16', '96', '9', '67098', '169749', '18'), +('16', '96', '9', '56033', '103815', '18'), +('16', '96', '9', '56031', '103811', '18'), +('16', '96', '9', '56070', '103534', '18'), +('16', '96', '15', '111343', '167655', '18'), +('16', '96', '15', '111347', '166739', '18'), +('16', '96', '15', '111345', '164849', '18'), +('16', '96', '15', '111339', '163850', '18'), +('16', '96', '20', '111354', '179452', '18'), +('16', '96', '20', '111355', '176167', '18'), +('16', '96', '20', '111351', '174256', '18'), +('16', '96', '20', '111352', '172434', '18'), +('16', '96', '12', '81795', '104182', '18'), +('16', '96', '12', '56073', '104029', '18'), +('16', '96', '12', '104408', '87919', '18'), +('16', '96', '12', '49656', '66073', '18'), +('16', '96', '18', '62986', '108534', '18'), +('16', '96', '18', '56041', '107417', '18'), +('16', '96', '18', '94054', '105796', '18'), +('16', '96', '18', '104412', '93553', '18'), +('16', '96', '19', '62990', '108005', '18'), +('16', '96', '19', '56037', '106951', '18'), +('16', '96', '19', '56075', '105260', '18'), +('16', '96', '19', '81763', '104076', '18'), +('16', '96', '13', '111514', '698500', '18'), +('16', '96', '13', '111520', '689211', '18'), +('16', '96', '13', '111525', '685139', '18'), +('16', '96', '13', '111220', '647569', '18'), +('16', '96', '14', '62980', '111175', '18'), +('16', '96', '14', '54901', '68238', '18'), +('16', '96', '14', '46875', '52627', '18'), +('16', '96', '14', '46925', '51609', '18'), +('16', '96', '11', '111338', '167264', '18'), +('16', '96', '11', '111333', '165801', '18'), +('16', '96', '11', '111337', '162662', '18'), +('16', '96', '11', '111334', '162048', '18'), +('16', '97', '22', '12425', '0', '18'), +('16', '97', '22', '21807', '0', '18'), +('16', '97', '22', '21805', '0', '18'), +('16', '97', '22', '39342', '0', '18'), +('16', '97', '1', '111303', '167222', '18'), +('16', '97', '1', '111308', '166853', '18'), +('16', '97', '1', '111300', '165827', '18'), +('16', '97', '1', '111305', '165586', '18'), +('16', '97', '2', '94056', '107066', '18'), +('16', '97', '2', '62985', '105460', '18'), +('16', '97', '2', '104410', '87181', '18'), +('16', '97', '2', '54846', '67427', '18'), +('16', '97', '3', '111315', '166068', '18'), +('16', '97', '3', '111313', '165837', '18'), +('16', '97', '3', '111316', '162844', '18'), +('16', '97', '3', '111014', '146153', '18'), +('16', '97', '5', '111318', '165357', '18'), +('16', '97', '5', '111320', '164944', '18'), +('16', '97', '5', '111319', '161890', '18'), +('16', '97', '5', '111017', '145520', '18'), +('16', '97', '8', '111331', '168446', '18'), +('16', '97', '8', '111328', '167114', '18'), +('16', '97', '8', '111332', '162901', '18'), +('16', '97', '8', '111030', '148581', '18'), +('16', '97', '6', '111322', '166007', '18'), +('16', '97', '6', '111324', '165810', '18'), +('16', '97', '6', '111326', '161975', '18'), +('16', '97', '6', '111021', '146142', '18'), +('16', '97', '17', '56046', '112089', '18'), +('16', '97', '17', '81765', '110266', '18'), +('16', '97', '17', '56083', '110065', '18'), +('16', '97', '17', '104413', '93221', '18'), +('16', '97', '7', '94053', '108166', '18'), +('16', '97', '7', '56079', '106689', '18'), +('16', '97', '7', '104411', '91729', '18'), +('16', '97', '7', '54850', '67340', '18'), +('16', '97', '9', '67098', '169752', '18'), +('16', '97', '9', '56033', '103817', '18'), +('16', '97', '9', '56031', '103813', '18'), +('16', '97', '9', '56070', '103536', '18'), +('16', '97', '15', '111343', '167658', '18'), +('16', '97', '15', '111347', '166743', '18'), +('16', '97', '15', '111345', '164852', '18'), +('16', '97', '15', '111339', '163853', '18'), +('16', '97', '20', '111354', '179455', '18'), +('16', '97', '20', '111355', '176170', '18'), +('16', '97', '20', '111351', '174258', '18'), +('16', '97', '20', '111352', '172438', '18'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '97', '12', '81795', '104187', '18'), +('16', '97', '12', '56073', '104034', '18'), +('16', '97', '12', '104408', '87922', '18'), +('16', '97', '12', '49656', '66074', '18'), +('16', '97', '18', '62986', '108539', '18'), +('16', '97', '18', '56041', '107419', '18'), +('16', '97', '18', '94054', '105800', '18'), +('16', '97', '18', '104412', '93555', '18'), +('16', '97', '19', '62990', '108008', '18'), +('16', '97', '19', '56037', '106954', '18'), +('16', '97', '19', '56075', '105264', '18'), +('16', '97', '19', '81763', '104079', '18'), +('16', '97', '13', '111514', '699917', '18'), +('16', '97', '13', '111520', '690578', '18'), +('16', '97', '13', '111525', '686455', '18'), +('16', '97', '13', '111220', '648885', '18'), +('16', '97', '14', '62980', '111178', '18'), +('16', '97', '14', '54901', '68240', '18'), +('16', '97', '14', '46875', '52631', '18'), +('16', '97', '14', '46925', '51614', '18'), +('16', '97', '11', '111338', '167268', '18'), +('16', '97', '11', '111333', '165804', '18'), +('16', '97', '11', '111337', '162665', '18'), +('16', '97', '11', '111334', '162052', '18'), +('16', '98', '22', '12425', '0', '18'), +('16', '98', '22', '21807', '0', '18'), +('16', '98', '22', '21805', '0', '18'), +('16', '98', '22', '39342', '0', '18'), +('16', '98', '1', '111303', '167227', '18'), +('16', '98', '1', '111308', '166857', '18'), +('16', '98', '1', '111300', '165830', '18'), +('16', '98', '1', '111305', '165589', '18'), +('16', '98', '2', '94056', '107069', '18'), +('16', '98', '2', '62985', '105462', '18'), +('16', '98', '2', '104410', '87184', '18'), +('16', '98', '2', '54846', '67430', '18'), +('16', '98', '3', '111315', '166073', '18'), +('16', '98', '3', '111313', '165840', '18'), +('16', '98', '3', '111316', '162847', '18'), +('16', '98', '3', '111014', '146158', '18'), +('16', '98', '5', '111318', '165360', '18'), +('16', '98', '5', '111320', '164948', '18'), +('16', '98', '5', '111319', '161894', '18'), +('16', '98', '5', '111017', '145523', '18'), +('16', '98', '8', '111331', '168450', '18'), +('16', '98', '8', '111328', '167118', '18'), +('16', '98', '8', '111332', '162903', '18'), +('16', '98', '8', '111030', '148585', '18'), +('16', '98', '6', '111322', '166010', '18'), +('16', '98', '6', '111324', '165814', '18'), +('16', '98', '6', '111326', '161979', '18'), +('16', '98', '6', '111021', '146145', '18'), +('16', '98', '17', '56046', '112094', '18'), +('16', '98', '17', '81765', '110269', '18'), +('16', '98', '17', '56083', '110067', '18'), +('16', '98', '17', '104413', '93225', '18'), +('16', '98', '7', '94053', '108170', '18'), +('16', '98', '7', '56079', '106693', '18'), +('16', '98', '7', '104411', '91732', '18'), +('16', '98', '7', '54850', '67341', '18'), +('16', '98', '9', '67098', '169756', '18'), +('16', '98', '9', '56033', '103819', '18'), +('16', '98', '9', '56031', '103816', '18'), +('16', '98', '9', '56070', '103538', '18'), +('16', '98', '15', '111343', '167660', '18'), +('16', '98', '15', '111347', '166747', '18'), +('16', '98', '15', '111345', '164855', '18'), +('16', '98', '15', '111339', '163856', '18'), +('16', '98', '20', '111354', '179458', '18'), +('16', '98', '20', '111355', '176172', '18'), +('16', '98', '20', '111351', '174261', '18'), +('16', '98', '20', '111352', '172442', '18'), +('16', '98', '12', '81795', '104191', '18'), +('16', '98', '12', '56073', '104039', '18'), +('16', '98', '12', '104408', '87926', '18'), +('16', '98', '12', '49656', '66074', '18'), +('16', '98', '18', '62986', '108545', '18'), +('16', '98', '18', '56041', '107420', '18'), +('16', '98', '18', '94054', '105804', '18'), +('16', '98', '18', '104412', '93557', '18'), +('16', '98', '19', '62990', '108012', '18'), +('16', '98', '19', '56037', '106958', '18'), +('16', '98', '19', '56075', '105267', '18'), +('16', '98', '19', '81763', '104082', '18'), +('16', '98', '13', '111514', '701283', '18'), +('16', '98', '13', '111520', '691944', '18'), +('16', '98', '13', '111525', '687821', '18'), +('16', '98', '13', '111220', '650201', '18'), +('16', '98', '14', '62980', '111180', '18'), +('16', '98', '14', '54901', '68243', '18'), +('16', '98', '14', '46875', '52635', '18'), +('16', '98', '14', '46925', '51618', '18'), +('16', '98', '11', '111338', '167272', '18'), +('16', '98', '11', '111333', '165807', '18'), +('16', '98', '11', '111337', '162669', '18'), +('16', '98', '11', '111334', '162055', '18'), +('16', '99', '22', '12425', '0', '18'), +('16', '99', '22', '21807', '0', '18'), +('16', '99', '22', '21805', '0', '18'), +('16', '99', '22', '39342', '0', '18'), +('16', '99', '1', '111303', '167231', '18'), +('16', '99', '1', '111308', '166861', '18'), +('16', '99', '1', '111300', '165832', '18'), +('16', '99', '1', '111305', '165593', '18'), +('16', '99', '2', '94056', '107073', '18'), +('16', '99', '2', '62985', '105464', '18'), +('16', '99', '2', '104410', '87187', '18'), +('16', '99', '2', '54846', '67433', '18'), +('16', '99', '3', '111315', '166078', '18'), +('16', '99', '3', '111313', '165842', '18'), +('16', '99', '3', '111316', '162851', '18'), +('16', '99', '3', '111014', '146163', '18'), +('16', '99', '5', '111318', '165363', '18'), +('16', '99', '5', '111320', '164951', '18'), +('16', '99', '5', '111319', '161899', '18'), +('16', '99', '5', '111017', '145525', '18'), +('16', '99', '8', '111331', '168454', '18'), +('16', '99', '8', '111328', '167123', '18'), +('16', '99', '8', '111332', '162906', '18'), +('16', '99', '8', '111030', '148589', '18'), +('16', '99', '6', '111322', '166013', '18'), +('16', '99', '6', '111324', '165818', '18'), +('16', '99', '6', '111326', '161982', '18'), +('16', '99', '6', '111021', '146148', '18'), +('16', '99', '17', '56046', '112099', '18'), +('16', '99', '17', '81765', '110272', '18'), +('16', '99', '17', '56083', '110069', '18'), +('16', '99', '17', '104413', '93229', '18'), +('16', '99', '7', '94053', '108174', '18'), +('16', '99', '7', '56079', '106698', '18'), +('16', '99', '7', '104411', '91735', '18'), +('16', '99', '7', '54850', '67342', '18'), +('16', '99', '9', '67098', '169759', '18'), +('16', '99', '9', '56033', '103821', '18'), +('16', '99', '9', '56031', '103818', '18'), +('16', '99', '9', '56070', '103539', '18'), +('16', '99', '15', '111343', '167663', '18'), +('16', '99', '15', '111347', '166752', '18'), +('16', '99', '15', '111345', '164858', '18'), +('16', '99', '15', '111339', '163859', '18'), +('16', '99', '20', '111354', '179462', '18'), +('16', '99', '20', '111355', '176175', '18'), +('16', '99', '20', '111351', '174263', '18'), +('16', '99', '20', '111352', '172446', '18'), +('16', '99', '12', '81795', '104196', '18'), +('16', '99', '12', '56073', '104044', '18'), +('16', '99', '12', '104408', '87929', '18'), +('16', '99', '12', '49656', '66075', '18'), +('16', '99', '18', '62986', '108550', '18'), +('16', '99', '18', '56041', '107422', '18'), +('16', '99', '18', '94054', '105808', '18'), +('16', '99', '18', '104412', '93559', '18'), +('16', '99', '19', '62990', '108015', '18'), +('16', '99', '19', '56037', '106962', '18'), +('16', '99', '19', '56075', '105271', '18'), +('16', '99', '19', '81763', '104084', '18'), +('16', '99', '13', '111514', '702650', '18'), +('16', '99', '13', '111520', '693310', '18'), +('16', '99', '13', '111525', '689188', '18'), +('16', '99', '13', '111220', '651466', '18'), +('16', '99', '14', '62980', '111183', '18'), +('16', '99', '14', '54901', '68246', '18'), +('16', '99', '14', '46875', '52639', '18'), +('16', '99', '14', '46925', '51622', '18'), +('16', '99', '11', '111338', '167277', '18'), +('16', '99', '11', '111333', '165810', '18'), +('16', '99', '11', '111337', '162672', '18'), +('16', '99', '11', '111334', '162059', '18'), +('16', '100', '22', '12425', '0', '20'), +('16', '100', '22', '21807', '0', '20'), +('16', '100', '22', '21805', '0', '20'), +('16', '100', '22', '39342', '0', '20'), +('16', '100', '1', '98769', '277159', '20'), +('16', '100', '1', '111303', '167237', '20'), +('16', '100', '1', '111308', '166865', '20'), +('16', '100', '1', '111300', '165835', '20'), +('16', '100', '2', '94056', '107076', '20'), +('16', '100', '2', '62985', '105466', '20'), +('16', '100', '2', '104410', '87191', '20'), +('16', '100', '2', '54846', '67436', '20'), +('16', '100', '3', '111315', '166084', '20'), +('16', '100', '3', '111313', '165845', '20'), +('16', '100', '3', '111316', '162855', '20'), +('16', '100', '3', '111014', '146169', '20'), +('16', '100', '5', '111318', '165366', '20'), +('16', '100', '5', '111320', '164956', '20'), +('16', '100', '5', '111319', '161904', '20'), +('16', '100', '5', '111017', '145528', '20'), +('16', '100', '8', '111331', '168459', '20'), +('16', '100', '8', '111328', '167127', '20'), +('16', '100', '8', '111332', '162909', '20'), +('16', '100', '8', '111030', '148594', '20'), +('16', '100', '6', '111322', '166017', '20'), +('16', '100', '6', '111324', '165822', '20'), +('16', '100', '6', '111326', '161986', '20'), +('16', '100', '6', '111021', '146152', '20'), +('16', '100', '17', '56046', '112105', '20'), +('16', '100', '17', '81765', '110275', '20'), +('16', '100', '17', '56083', '110071', '20'), +('16', '100', '17', '104413', '93234', '20'), +('16', '100', '7', '94053', '108178', '20'), +('16', '100', '7', '56079', '106702', '20'), +('16', '100', '7', '104411', '91739', '20'), +('16', '100', '7', '54850', '67343', '20'), +('16', '100', '9', '67098', '169763', '20'), +('16', '100', '9', '56033', '103823', '20'), +('16', '100', '9', '56031', '103820', '20'), +('16', '100', '9', '56070', '103541', '20'), +('16', '100', '15', '111343', '167666', '20'), +('16', '100', '15', '111347', '166756', '20'), +('16', '100', '15', '111345', '164861', '20'), +('16', '100', '15', '111339', '163862', '20'), +('16', '100', '20', '111354', '179465', '20'), +('16', '100', '20', '111355', '176177', '20'), +('16', '100', '20', '111351', '174265', '20'), +('16', '100', '20', '111352', '172450', '20'), +('16', '100', '12', '81795', '104200', '20'), +('16', '100', '12', '56073', '104050', '20'), +('16', '100', '12', '104408', '87933', '20'), +('16', '100', '12', '49656', '66075', '20'), +('16', '100', '18', '62986', '108556', '20'), +('16', '100', '18', '56041', '107424', '20'), +('16', '100', '18', '94054', '105812', '20'), +('16', '100', '18', '104412', '93561', '20'), +('16', '100', '19', '62990', '108019', '20'), +('16', '100', '19', '56037', '106965', '20'), +('16', '100', '19', '56075', '105275', '20'), +('16', '100', '19', '81763', '104088', '20'), +('16', '100', '13', '111514', '706340', '20'), +('16', '100', '13', '111520', '696948', '20'), +('16', '100', '13', '111525', '692828', '20'), +('16', '100', '13', '111220', '655055', '20'), +('16', '100', '14', '62980', '111186', '20'), +('16', '100', '14', '54901', '68249', '20'), +('16', '100', '14', '46875', '52644', '20'), +('16', '100', '14', '46925', '51626', '20'), +('16', '100', '11', '133816', '211505', '20'), +('16', '100', '11', '111338', '167281', '20'), +('16', '100', '11', '111333', '165813', '20'), +('16', '100', '11', '111337', '162676', '20'), +('16', '100', '22', '12425', '0', '19'), +('16', '100', '22', '21807', '0', '19'), +('16', '100', '22', '21805', '0', '19'), +('16', '100', '22', '39342', '0', '19'), +('16', '100', '1', '98769', '277159', '19'), +('16', '100', '1', '111303', '167237', '19'), +('16', '100', '1', '111308', '166865', '19'), +('16', '100', '1', '111300', '165835', '19'), +('16', '100', '2', '94056', '107076', '19'), +('16', '100', '2', '62985', '105466', '19'), +('16', '100', '2', '104410', '87191', '19'), +('16', '100', '2', '54846', '67436', '19'), +('16', '100', '3', '111315', '166084', '19'), +('16', '100', '3', '111313', '165845', '19'), +('16', '100', '3', '111316', '162855', '19'), +('16', '100', '3', '111014', '146169', '19'), +('16', '100', '5', '111318', '165366', '19'), +('16', '100', '5', '111320', '164956', '19'), +('16', '100', '5', '111319', '161904', '19'), +('16', '100', '5', '111017', '145528', '19'), +('16', '100', '8', '111331', '168459', '19'), +('16', '100', '8', '111328', '167127', '19'), +('16', '100', '8', '111332', '162909', '19'), +('16', '100', '8', '111030', '148594', '19'), +('16', '100', '6', '111322', '166017', '19'), +('16', '100', '6', '111324', '165822', '19'), +('16', '100', '6', '111326', '161986', '19'), +('16', '100', '6', '111021', '146152', '19'), +('16', '100', '17', '56046', '112105', '19'), +('16', '100', '17', '81765', '110275', '19'), +('16', '100', '17', '56083', '110071', '19'), +('16', '100', '17', '104413', '93234', '19'), +('16', '100', '7', '94053', '108178', '19'), +('16', '100', '7', '56079', '106702', '19'), +('16', '100', '7', '104411', '91739', '19'), +('16', '100', '7', '54850', '67343', '19'), +('16', '100', '9', '67098', '169763', '19'), +('16', '100', '9', '56033', '103823', '19'), +('16', '100', '9', '56031', '103820', '19'), +('16', '100', '9', '56070', '103541', '19'), +('16', '100', '15', '111343', '167666', '19'), +('16', '100', '15', '111347', '166756', '19'), +('16', '100', '15', '111345', '164861', '19'), +('16', '100', '15', '111339', '163862', '19'), +('16', '100', '20', '111354', '179465', '19'), +('16', '100', '20', '111355', '176177', '19'), +('16', '100', '20', '111351', '174265', '19'), +('16', '100', '20', '111352', '172450', '19'), +('16', '100', '12', '81795', '104200', '19'), +('16', '100', '12', '56073', '104050', '19'), +('16', '100', '12', '104408', '87933', '19'), +('16', '100', '12', '49656', '66075', '19'), +('16', '100', '18', '62986', '108556', '19'), +('16', '100', '18', '56041', '107424', '19'), +('16', '100', '18', '94054', '105812', '19'), +('16', '100', '18', '104412', '93561', '19'), +('16', '100', '19', '62990', '108019', '19'), +('16', '100', '19', '56037', '106965', '19'), +('16', '100', '19', '56075', '105275', '19'), +('16', '100', '19', '81763', '104088', '19'), +('16', '100', '13', '111514', '704068', '19'), +('16', '100', '13', '111520', '694676', '19'), +('16', '100', '13', '111525', '690555', '19'), +('16', '100', '13', '111220', '652782', '19'), +('16', '100', '14', '62980', '111186', '19'), +('16', '100', '14', '54901', '68249', '19'), +('16', '100', '14', '46875', '52644', '19'), +('16', '100', '14', '46925', '51626', '19'), +('16', '100', '11', '133816', '211505', '19'), +('16', '100', '11', '111338', '167281', '19'), +('16', '100', '11', '111333', '165813', '19'), +('16', '100', '11', '111337', '162676', '19'), +('16', '101', '22', '12425', '0', '20'), +('16', '101', '22', '21807', '0', '20'), +('16', '101', '22', '21805', '0', '20'), +('16', '101', '22', '39342', '0', '20'), +('16', '101', '1', '98769', '277162', '20'), +('16', '101', '1', '111303', '167241', '20'), +('16', '101', '1', '111308', '166868', '20'), +('16', '101', '1', '111300', '165838', '20'), +('16', '101', '2', '94056', '107079', '20'), +('16', '101', '2', '62985', '105468', '20'), +('16', '101', '2', '104410', '87194', '20'), +('16', '101', '2', '54846', '67438', '20'), +('16', '101', '3', '111315', '166090', '20'), +('16', '101', '3', '111313', '165848', '20'), +('16', '101', '3', '111316', '162858', '20'), +('16', '101', '3', '111014', '146175', '20'), +('16', '101', '5', '111318', '165369', '20'), +('16', '101', '5', '111320', '164959', '20'), +('16', '101', '5', '111319', '161909', '20'), +('16', '101', '5', '111017', '145531', '20'), +('16', '101', '8', '111331', '168463', '20'), +('16', '101', '8', '111328', '167131', '20'), +('16', '101', '8', '111332', '162911', '20'), +('16', '101', '8', '111030', '148598', '20'), +('16', '101', '6', '111322', '166020', '20'), +('16', '101', '6', '111324', '165826', '20'), +('16', '101', '6', '111326', '161989', '20'), +('16', '101', '6', '111021', '146155', '20'), +('16', '101', '17', '56046', '112110', '20'), +('16', '101', '17', '81765', '110278', '20'), +('16', '101', '17', '56083', '110073', '20'), +('16', '101', '17', '104413', '93238', '20'), +('16', '101', '7', '94053', '108182', '20'), +('16', '101', '7', '56079', '106706', '20'), +('16', '101', '7', '104411', '91742', '20'), +('16', '101', '7', '54850', '67344', '20'), +('16', '101', '9', '67098', '169767', '20'), +('16', '101', '9', '56033', '103825', '20'), +('16', '101', '9', '56031', '103823', '20'), +('16', '101', '9', '56070', '103543', '20'), +('16', '101', '15', '111343', '167669', '20'), +('16', '101', '15', '111347', '166761', '20'), +('16', '101', '15', '111345', '164863', '20'), +('16', '101', '15', '111339', '163865', '20'), +('16', '101', '20', '111354', '179469', '20'), +('16', '101', '20', '111355', '176180', '20'), +('16', '101', '20', '111351', '174268', '20'), +('16', '101', '20', '111352', '172454', '20'), +('16', '101', '12', '81795', '104205', '20'), +('16', '101', '12', '56073', '104055', '20'), +('16', '101', '12', '104408', '87937', '20'), +('16', '101', '12', '49656', '66076', '20'), +('16', '101', '18', '62986', '108561', '20'), +('16', '101', '18', '56041', '107425', '20'), +('16', '101', '18', '94054', '105816', '20'), +('16', '101', '18', '104412', '93562', '20'), +('16', '101', '19', '62990', '108023', '20'), +('16', '101', '19', '56037', '106969', '20'), +('16', '101', '19', '56075', '105278', '20'), +('16', '101', '19', '81763', '104090', '20'), +('16', '101', '13', '111514', '707707', '20'), +('16', '101', '13', '111520', '698314', '20'), +('16', '101', '13', '111525', '694194', '20'), +('16', '101', '13', '111220', '656371', '20'), +('16', '101', '14', '62980', '111188', '20'), +('16', '101', '14', '54901', '68252', '20'), +('16', '101', '14', '46875', '52648', '20'), +('16', '101', '14', '46925', '51631', '20'), +('16', '101', '11', '133816', '211509', '20'), +('16', '101', '11', '111338', '167286', '20'), +('16', '101', '11', '111333', '165816', '20'), +('16', '101', '11', '111337', '162679', '20'), +('16', '102', '22', '12425', '0', '20'), +('16', '102', '22', '21807', '0', '20'), +('16', '102', '22', '21805', '0', '20'), +('16', '102', '22', '39342', '0', '20'), +('16', '102', '1', '98769', '277165', '20'), +('16', '102', '1', '111303', '167246', '20'), +('16', '102', '1', '111308', '166872', '20'), +('16', '102', '1', '111300', '165841', '20'), +('16', '102', '2', '94056', '107083', '20'), +('16', '102', '2', '62985', '105471', '20'), +('16', '102', '2', '104410', '87197', '20'), +('16', '102', '2', '54846', '67441', '20'), +('16', '102', '3', '111315', '166095', '20'), +('16', '102', '3', '111313', '165851', '20'), +('16', '102', '3', '111316', '162862', '20'), +('16', '102', '3', '111014', '146180', '20'), +('16', '102', '5', '111318', '165372', '20'), +('16', '102', '5', '111320', '164963', '20'), +('16', '102', '5', '111319', '161914', '20'), +('16', '102', '5', '111017', '145534', '20'), +('16', '102', '8', '111331', '168467', '20'), +('16', '102', '8', '111328', '167135', '20'), +('16', '102', '8', '111332', '162914', '20'), +('16', '102', '8', '111030', '148602', '20'), +('16', '102', '6', '111322', '166023', '20'), +('16', '102', '6', '111324', '165830', '20'), +('16', '102', '6', '111326', '161993', '20'), +('16', '102', '6', '111021', '146158', '20'), +('16', '102', '17', '56046', '112115', '20'), +('16', '102', '17', '81765', '110281', '20'), +('16', '102', '17', '56083', '110075', '20'), +('16', '102', '17', '104413', '93242', '20'), +('16', '102', '7', '94053', '108186', '20'), +('16', '102', '7', '56079', '106710', '20'), +('16', '102', '7', '104411', '91745', '20'), +('16', '102', '7', '54850', '67345', '20'), +('16', '102', '9', '67098', '169770', '20'), +('16', '102', '9', '56033', '103827', '20'), +('16', '102', '9', '56031', '103825', '20'), +('16', '102', '9', '56070', '103545', '20'), +('16', '102', '15', '111343', '167671', '20'), +('16', '102', '15', '111347', '166765', '20'), +('16', '102', '15', '111345', '164866', '20'), +('16', '102', '15', '111339', '163868', '20'), +('16', '102', '20', '111354', '179472', '20'), +('16', '102', '20', '111355', '176182', '20'), +('16', '102', '20', '111351', '174270', '20'), +('16', '102', '20', '111352', '172458', '20'), +('16', '102', '12', '81795', '104209', '20'), +('16', '102', '12', '56073', '104060', '20'), +('16', '102', '12', '104408', '87940', '20'), +('16', '102', '12', '49656', '66076', '20'), +('16', '102', '18', '62986', '108566', '20'), +('16', '102', '18', '56041', '107427', '20'), +('16', '102', '18', '94054', '105820', '20'), +('16', '102', '18', '104412', '93564', '20'), +('16', '102', '19', '62990', '108026', '20'), +('16', '102', '19', '56037', '106973', '20'), +('16', '102', '19', '56075', '105282', '20'), +('16', '102', '19', '81763', '104093', '20'), +('16', '102', '13', '111514', '709073', '20'), +('16', '102', '13', '111520', '699680', '20'), +('16', '102', '13', '111525', '695561', '20'), +('16', '102', '13', '111220', '657687', '20'), +('16', '102', '14', '62980', '111191', '20'), +('16', '102', '14', '54901', '68254', '20'), +('16', '102', '14', '46875', '52652', '20'), +('16', '102', '14', '46925', '51635', '20'), +('16', '102', '11', '133816', '211512', '20'), +('16', '102', '11', '111338', '167290', '20'), +('16', '102', '11', '111333', '165819', '20'), +('16', '102', '11', '111337', '162682', '20'), +('16', '103', '22', '12425', '0', '20'), +('16', '103', '22', '21807', '0', '20'), +('16', '103', '22', '21805', '0', '20'), +('16', '103', '22', '39342', '0', '20'), +('16', '103', '1', '98769', '277167', '20'), +('16', '103', '1', '111303', '167251', '20'), +('16', '103', '1', '111308', '166876', '20'), +('16', '103', '1', '111300', '165844', '20'), +('16', '103', '2', '94056', '107086', '20'), +('16', '103', '2', '62985', '105473', '20'), +('16', '103', '2', '104410', '87201', '20'), +('16', '103', '2', '54846', '67444', '20'), +('16', '103', '3', '111315', '166101', '20'), +('16', '103', '3', '111313', '165854', '20'), +('16', '103', '3', '111316', '162866', '20'), +('16', '103', '3', '111014', '146186', '20'), +('16', '103', '5', '111318', '165374', '20'), +('16', '103', '5', '111320', '164967', '20'), +('16', '103', '5', '111319', '161919', '20'), +('16', '103', '5', '111017', '145537', '20'), +('16', '103', '8', '111331', '168472', '20'), +('16', '103', '8', '111328', '167140', '20'), +('16', '103', '8', '111332', '162917', '20'), +('16', '103', '8', '111030', '148607', '20'), +('16', '103', '6', '111322', '166026', '20'), +('16', '103', '6', '111324', '165835', '20'), +('16', '103', '6', '111326', '161997', '20'), +('16', '103', '6', '111021', '146161', '20'), +('16', '103', '17', '56046', '112121', '20'), +('16', '103', '17', '81765', '110285', '20'), +('16', '103', '17', '56083', '110078', '20'), +('16', '103', '17', '104413', '93246', '20'), +('16', '103', '7', '94053', '108190', '20'), +('16', '103', '7', '56079', '106715', '20'), +('16', '103', '7', '104411', '91749', '20'), +('16', '103', '7', '54850', '67346', '20'), +('16', '103', '9', '67098', '169774', '20'), +('16', '103', '9', '56033', '103829', '20'), +('16', '103', '9', '56031', '103828', '20'), +('16', '103', '9', '56070', '103546', '20'), +('16', '103', '15', '111343', '167674', '20'), +('16', '103', '15', '111347', '166770', '20'), +('16', '103', '15', '111345', '164869', '20'), +('16', '103', '15', '111339', '163872', '20'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '103', '20', '111354', '179476', '20'), +('16', '103', '20', '111355', '176185', '20'), +('16', '103', '20', '111351', '174272', '20'), +('16', '103', '20', '111352', '172462', '20'), +('16', '103', '12', '81795', '104214', '20'), +('16', '103', '12', '56073', '104066', '20'), +('16', '103', '12', '104408', '87944', '20'), +('16', '103', '12', '49656', '66077', '20'), +('16', '103', '18', '62986', '108572', '20'), +('16', '103', '18', '56041', '107429', '20'), +('16', '103', '18', '94054', '105824', '20'), +('16', '103', '18', '104412', '93566', '20'), +('16', '103', '19', '62990', '108030', '20'), +('16', '103', '19', '56037', '106977', '20'), +('16', '103', '19', '56075', '105286', '20'), +('16', '103', '19', '81763', '104096', '20'), +('16', '103', '13', '111514', '710491', '20'), +('16', '103', '13', '111520', '701047', '20'), +('16', '103', '13', '111525', '696877', '20'), +('16', '103', '13', '111220', '659003', '20'), +('16', '103', '14', '62980', '111194', '20'), +('16', '103', '14', '54901', '68257', '20'), +('16', '103', '14', '46875', '52657', '20'), +('16', '103', '14', '46925', '51639', '20'), +('16', '103', '11', '133816', '211515', '20'), +('16', '103', '11', '111338', '167295', '20'), +('16', '103', '11', '111333', '165822', '20'), +('16', '103', '11', '111337', '162686', '20'), +('16', '104', '22', '12425', '0', '20'), +('16', '104', '22', '21807', '0', '20'), +('16', '104', '22', '21805', '0', '20'), +('16', '104', '22', '39342', '0', '20'), +('16', '104', '1', '98769', '277170', '20'), +('16', '104', '1', '111303', '167256', '20'), +('16', '104', '1', '111308', '166880', '20'), +('16', '104', '1', '111300', '165847', '20'), +('16', '104', '2', '94056', '107089', '20'), +('16', '104', '2', '62985', '105475', '20'), +('16', '104', '2', '104410', '87204', '20'), +('16', '104', '2', '54846', '67447', '20'), +('16', '104', '3', '111315', '166106', '20'), +('16', '104', '3', '111313', '165857', '20'), +('16', '104', '3', '111316', '162869', '20'), +('16', '104', '3', '111014', '146191', '20'), +('16', '104', '5', '111318', '165377', '20'), +('16', '104', '5', '111320', '164971', '20'), +('16', '104', '5', '111319', '161923', '20'), +('16', '104', '5', '111017', '145540', '20'), +('16', '104', '8', '111331', '168476', '20'), +('16', '104', '8', '111328', '167144', '20'), +('16', '104', '8', '111332', '162920', '20'), +('16', '104', '8', '111030', '148611', '20'), +('16', '104', '6', '111322', '166029', '20'), +('16', '104', '6', '111324', '165839', '20'), +('16', '104', '6', '111326', '162000', '20'), +('16', '104', '6', '111021', '146164', '20'), +('16', '104', '17', '56046', '112126', '20'), +('16', '104', '17', '81765', '110288', '20'), +('16', '104', '17', '56083', '110080', '20'), +('16', '104', '17', '104413', '93250', '20'), +('16', '104', '7', '94053', '108194', '20'), +('16', '104', '7', '56079', '106719', '20'), +('16', '104', '7', '104411', '91752', '20'), +('16', '104', '7', '54850', '67348', '20'), +('16', '104', '9', '67098', '169777', '20'), +('16', '104', '9', '56033', '103831', '20'), +('16', '104', '9', '56031', '103830', '20'), +('16', '104', '9', '56070', '103548', '20'), +('16', '104', '15', '111343', '167677', '20'), +('16', '104', '15', '111347', '166774', '20'), +('16', '104', '15', '111345', '164872', '20'), +('16', '104', '15', '111339', '163875', '20'), +('16', '104', '20', '111354', '179479', '20'), +('16', '104', '20', '111355', '176188', '20'), +('16', '104', '20', '111351', '174275', '20'), +('16', '104', '20', '111352', '172466', '20'), +('16', '104', '12', '81795', '104218', '20'), +('16', '104', '12', '56073', '104071', '20'), +('16', '104', '12', '104408', '87948', '20'), +('16', '104', '12', '49656', '66077', '20'), +('16', '104', '18', '62986', '108577', '20'), +('16', '104', '18', '56041', '107430', '20'), +('16', '104', '18', '94054', '105828', '20'), +('16', '104', '18', '104412', '93568', '20'), +('16', '104', '19', '62990', '108034', '20'), +('16', '104', '19', '56037', '106980', '20'), +('16', '104', '19', '56075', '105289', '20'), +('16', '104', '19', '81763', '104099', '20'), +('16', '104', '13', '111514', '711858', '20'), +('16', '104', '13', '111520', '702413', '20'), +('16', '104', '13', '111525', '698244', '20'), +('16', '104', '13', '111220', '660319', '20'), +('16', '104', '14', '62980', '111196', '20'), +('16', '104', '14', '54901', '68260', '20'), +('16', '104', '14', '46875', '52661', '20'), +('16', '104', '14', '46925', '51644', '20'), +('16', '104', '11', '133816', '211518', '20'), +('16', '104', '11', '111338', '167299', '20'), +('16', '104', '11', '111333', '165825', '20'), +('16', '104', '11', '111337', '162689', '20'), +('16', '105', '22', '12425', '0', '23'), +('16', '105', '22', '21807', '0', '23'), +('16', '105', '22', '21805', '0', '23'), +('16', '105', '22', '39342', '0', '23'), +('16', '105', '1', '98769', '277173', '23'), +('16', '105', '1', '111303', '167261', '23'), +('16', '105', '1', '111308', '166884', '23'), +('16', '105', '1', '111300', '165850', '23'), +('16', '105', '2', '94056', '107093', '23'), +('16', '105', '2', '62985', '105477', '23'), +('16', '105', '2', '104410', '87208', '23'), +('16', '105', '2', '54846', '67450', '23'), +('16', '105', '3', '111315', '166112', '23'), +('16', '105', '3', '111313', '165860', '23'), +('16', '105', '3', '111316', '162873', '23'), +('16', '105', '3', '111014', '146197', '23'), +('16', '105', '5', '111318', '165380', '23'), +('16', '105', '5', '111320', '164975', '23'), +('16', '105', '5', '111319', '161928', '23'), +('16', '105', '5', '111017', '145543', '23'), +('16', '105', '8', '111331', '168481', '23'), +('16', '105', '8', '111328', '167149', '23'), +('16', '105', '8', '111332', '162922', '23'), +('16', '105', '8', '111030', '148616', '23'), +('16', '105', '6', '111322', '166033', '23'), +('16', '105', '6', '111324', '165843', '23'), +('16', '105', '6', '111326', '162004', '23'), +('16', '105', '6', '111021', '146168', '23'), +('16', '105', '17', '56046', '112131', '23'), +('16', '105', '17', '81765', '110291', '23'), +('16', '105', '17', '56083', '110082', '23'), +('16', '105', '17', '104413', '93254', '23'), +('16', '105', '7', '94053', '108198', '23'), +('16', '105', '7', '56079', '106724', '23'), +('16', '105', '7', '104411', '91756', '23'), +('16', '105', '7', '54850', '67349', '23'), +('16', '105', '9', '67098', '169781', '23'), +('16', '105', '9', '56033', '103834', '23'), +('16', '105', '9', '56031', '103832', '23'), +('16', '105', '9', '56070', '103550', '23'), +('16', '105', '15', '111343', '167680', '23'), +('16', '105', '15', '111347', '166779', '23'), +('16', '105', '15', '111345', '164875', '23'), +('16', '105', '15', '111339', '163878', '23'), +('16', '105', '20', '111354', '179483', '23'), +('16', '105', '20', '111355', '176190', '23'), +('16', '105', '20', '111351', '174277', '23'), +('16', '105', '20', '111352', '172470', '23'), +('16', '105', '12', '81795', '104223', '23'), +('16', '105', '12', '56073', '104076', '23'), +('16', '105', '12', '104408', '87952', '23'), +('16', '105', '12', '49656', '66078', '23'), +('16', '105', '18', '62986', '108583', '23'), +('16', '105', '18', '56041', '107432', '23'), +('16', '105', '18', '94054', '105833', '23'), +('16', '105', '18', '104412', '93570', '23'), +('16', '105', '19', '62990', '108038', '23'), +('16', '105', '19', '56037', '106984', '23'), +('16', '105', '19', '56075', '105293', '23'), +('16', '105', '19', '81763', '104102', '23'), +('16', '105', '13', '111514', '713224', '23'), +('16', '105', '13', '111520', '703779', '23'), +('16', '105', '13', '111525', '699611', '23'), +('16', '105', '13', '111220', '661635', '23'), +('16', '105', '14', '62980', '111199', '23'), +('16', '105', '14', '54901', '68263', '23'), +('16', '105', '14', '46875', '52665', '23'), +('16', '105', '14', '46925', '51648', '23'), +('16', '105', '11', '133816', '211522', '23'), +('16', '105', '11', '111338', '167304', '23'), +('16', '105', '11', '111333', '165828', '23'), +('16', '105', '11', '111337', '162693', '23'), +('16', '105', '22', '12425', '0', '22'), +('16', '105', '22', '21807', '0', '22'), +('16', '105', '22', '21805', '0', '22'), +('16', '105', '22', '39342', '0', '22'), +('16', '105', '1', '98769', '277173', '22'), +('16', '105', '1', '111303', '167261', '22'), +('16', '105', '1', '111308', '166884', '22'), +('16', '105', '1', '111300', '165850', '22'), +('16', '105', '2', '94056', '107093', '22'), +('16', '105', '2', '62985', '105477', '22'), +('16', '105', '2', '104410', '87208', '22'), +('16', '105', '2', '54846', '67450', '22'), +('16', '105', '3', '111315', '166112', '22'), +('16', '105', '3', '111313', '165860', '22'), +('16', '105', '3', '111316', '162873', '22'), +('16', '105', '3', '111014', '146197', '22'), +('16', '105', '5', '111318', '165380', '22'), +('16', '105', '5', '111320', '164975', '22'), +('16', '105', '5', '111319', '161928', '22'), +('16', '105', '5', '111017', '145543', '22'), +('16', '105', '8', '111331', '168481', '22'), +('16', '105', '8', '111328', '167149', '22'), +('16', '105', '8', '111332', '162922', '22'), +('16', '105', '8', '111030', '148616', '22'), +('16', '105', '6', '111322', '166033', '22'), +('16', '105', '6', '111324', '165843', '22'), +('16', '105', '6', '111326', '162004', '22'), +('16', '105', '6', '111021', '146168', '22'), +('16', '105', '17', '56046', '112131', '22'), +('16', '105', '17', '81765', '110291', '22'), +('16', '105', '17', '56083', '110082', '22'), +('16', '105', '17', '104413', '93254', '22'), +('16', '105', '7', '94053', '108198', '22'), +('16', '105', '7', '56079', '106724', '22'), +('16', '105', '7', '104411', '91756', '22'), +('16', '105', '7', '54850', '67349', '22'), +('16', '105', '9', '67098', '169781', '22'), +('16', '105', '9', '56033', '103834', '22'), +('16', '105', '9', '56031', '103832', '22'), +('16', '105', '9', '56070', '103550', '22'), +('16', '105', '15', '111343', '167680', '22'), +('16', '105', '15', '111347', '166779', '22'), +('16', '105', '15', '111345', '164875', '22'), +('16', '105', '15', '111339', '163878', '22'), +('16', '105', '20', '111354', '179483', '22'), +('16', '105', '20', '111355', '176190', '22'), +('16', '105', '20', '111351', '174277', '22'), +('16', '105', '20', '111352', '172470', '22'), +('16', '105', '12', '81795', '104223', '22'), +('16', '105', '12', '56073', '104076', '22'), +('16', '105', '12', '104408', '87952', '22'), +('16', '105', '12', '49656', '66078', '22'), +('16', '105', '18', '62986', '108583', '22'), +('16', '105', '18', '56041', '107432', '22'), +('16', '105', '18', '94054', '105833', '22'), +('16', '105', '18', '104412', '93570', '22'), +('16', '105', '19', '62990', '108038', '22'), +('16', '105', '19', '56037', '106984', '22'), +('16', '105', '19', '56075', '105293', '22'), +('16', '105', '19', '81763', '104102', '22'), +('16', '105', '13', '111514', '713224', '22'), +('16', '105', '13', '111520', '703779', '22'), +('16', '105', '13', '111525', '699611', '22'), +('16', '105', '13', '111220', '661635', '22'), +('16', '105', '14', '62980', '111199', '22'), +('16', '105', '14', '54901', '68263', '22'), +('16', '105', '14', '46875', '52665', '22'), +('16', '105', '14', '46925', '51648', '22'), +('16', '105', '11', '133816', '211522', '22'), +('16', '105', '11', '111338', '167304', '22'), +('16', '105', '11', '111333', '165828', '22'), +('16', '105', '11', '111337', '162693', '22'), +('16', '105', '22', '12425', '0', '21'), +('16', '105', '22', '21807', '0', '21'), +('16', '105', '22', '21805', '0', '21'), +('16', '105', '22', '39342', '0', '21'), +('16', '105', '1', '98769', '277173', '21'), +('16', '105', '1', '111303', '167261', '21'), +('16', '105', '1', '111308', '166884', '21'), +('16', '105', '1', '111300', '165850', '21'), +('16', '105', '2', '94056', '107093', '21'), +('16', '105', '2', '62985', '105477', '21'), +('16', '105', '2', '104410', '87208', '21'), +('16', '105', '2', '54846', '67450', '21'), +('16', '105', '3', '111315', '166112', '21'), +('16', '105', '3', '111313', '165860', '21'), +('16', '105', '3', '111316', '162873', '21'), +('16', '105', '3', '111014', '146197', '21'), +('16', '105', '5', '111318', '165380', '21'), +('16', '105', '5', '111320', '164975', '21'), +('16', '105', '5', '111319', '161928', '21'), +('16', '105', '5', '111017', '145543', '21'), +('16', '105', '8', '111331', '168481', '21'), +('16', '105', '8', '111328', '167149', '21'), +('16', '105', '8', '111332', '162922', '21'), +('16', '105', '8', '111030', '148616', '21'), +('16', '105', '6', '111322', '166033', '21'), +('16', '105', '6', '111324', '165843', '21'), +('16', '105', '6', '111326', '162004', '21'), +('16', '105', '6', '111021', '146168', '21'), +('16', '105', '17', '56046', '112131', '21'), +('16', '105', '17', '81765', '110291', '21'), +('16', '105', '17', '56083', '110082', '21'), +('16', '105', '17', '104413', '93254', '21'), +('16', '105', '7', '94053', '108198', '21'), +('16', '105', '7', '56079', '106724', '21'), +('16', '105', '7', '104411', '91756', '21'), +('16', '105', '7', '54850', '67349', '21'), +('16', '105', '9', '67098', '169781', '21'), +('16', '105', '9', '56033', '103834', '21'), +('16', '105', '9', '56031', '103832', '21'), +('16', '105', '9', '56070', '103550', '21'), +('16', '105', '15', '111343', '167680', '21'), +('16', '105', '15', '111347', '166779', '21'), +('16', '105', '15', '111345', '164875', '21'), +('16', '105', '15', '111339', '163878', '21'), +('16', '105', '20', '111354', '179483', '21'), +('16', '105', '20', '111355', '176190', '21'), +('16', '105', '20', '111351', '174277', '21'), +('16', '105', '20', '111352', '172470', '21'), +('16', '105', '12', '81795', '104223', '21'), +('16', '105', '12', '56073', '104076', '21'), +('16', '105', '12', '104408', '87952', '21'), +('16', '105', '12', '49656', '66078', '21'), +('16', '105', '18', '62986', '108583', '21'), +('16', '105', '18', '56041', '107432', '21'), +('16', '105', '18', '94054', '105833', '21'), +('16', '105', '18', '104412', '93570', '21'), +('16', '105', '19', '62990', '108038', '21'), +('16', '105', '19', '56037', '106984', '21'), +('16', '105', '19', '56075', '105293', '21'), +('16', '105', '19', '81763', '104102', '21'), +('16', '105', '13', '111514', '713224', '21'), +('16', '105', '13', '111520', '703779', '21'), +('16', '105', '13', '111525', '699611', '21'), +('16', '105', '13', '111220', '661635', '21'), +('16', '105', '14', '62980', '111199', '21'), +('16', '105', '14', '54901', '68263', '21'), +('16', '105', '14', '46875', '52665', '21'), +('16', '105', '14', '46925', '51648', '21'), +('16', '105', '11', '133816', '211522', '21'), +('16', '105', '11', '111338', '167304', '21'), +('16', '105', '11', '111333', '165828', '21'), +('16', '105', '11', '111337', '162693', '21'), +('16', '106', '22', '12425', '0', '23'), +('16', '106', '22', '21807', '0', '23'), +('16', '106', '22', '21805', '0', '23'), +('16', '106', '22', '39342', '0', '23'), +('16', '106', '1', '98769', '277176', '23'), +('16', '106', '1', '111303', '167267', '23'), +('16', '106', '1', '111308', '166888', '23'), +('16', '106', '1', '111300', '165853', '23'), +('16', '106', '2', '94056', '107096', '23'), +('16', '106', '2', '62985', '105480', '23'), +('16', '106', '2', '104410', '87211', '23'), +('16', '106', '2', '54846', '67453', '23'), +('16', '106', '3', '111315', '166118', '23'), +('16', '106', '3', '111313', '165863', '23'), +('16', '106', '3', '111316', '162877', '23'), +('16', '106', '3', '111014', '146203', '23'), +('16', '106', '5', '111318', '165383', '23'), +('16', '106', '5', '111320', '164980', '23'), +('16', '106', '5', '111319', '161933', '23'), +('16', '106', '5', '111017', '145546', '23'), +('16', '106', '8', '111331', '168485', '23'), +('16', '106', '8', '111328', '167153', '23'), +('16', '106', '8', '111332', '162925', '23'), +('16', '106', '8', '111030', '148620', '23'), +('16', '106', '6', '111322', '166036', '23'), +('16', '106', '6', '111324', '165848', '23'), +('16', '106', '6', '111326', '162008', '23'), +('16', '106', '6', '111021', '146171', '23'), +('16', '106', '17', '56046', '112137', '23'), +('16', '106', '17', '81765', '110295', '23'), +('16', '106', '17', '56083', '110085', '23'), +('16', '106', '17', '104413', '93258', '23'), +('16', '106', '7', '94053', '108202', '23'), +('16', '106', '7', '56079', '106728', '23'), +('16', '106', '7', '104411', '91759', '23'), +('16', '106', '7', '54850', '67350', '23'), +('16', '106', '9', '67098', '169785', '23'), +('16', '106', '9', '56033', '103836', '23'), +('16', '106', '9', '56031', '103835', '23'), +('16', '106', '9', '56070', '103552', '23'), +('16', '106', '15', '111343', '167682', '23'), +('16', '106', '15', '111347', '166783', '23'), +('16', '106', '15', '111345', '164878', '23'), +('16', '106', '15', '111339', '163881', '23'), +('16', '106', '20', '111354', '179486', '23'), +('16', '106', '20', '111355', '176193', '23'), +('16', '106', '20', '111351', '174280', '23'), +('16', '106', '20', '111352', '172474', '23'), +('16', '106', '12', '81795', '104228', '23'), +('16', '106', '12', '56073', '104082', '23'), +('16', '106', '12', '104408', '87956', '23'), +('16', '106', '12', '49656', '66078', '23'), +('16', '106', '18', '62986', '108589', '23'), +('16', '106', '18', '56041', '107433', '23'), +('16', '106', '18', '94054', '105837', '23'), +('16', '106', '18', '104412', '93572', '23'), +('16', '106', '19', '62990', '108042', '23'), +('16', '106', '19', '56037', '106988', '23'), +('16', '106', '19', '56075', '105297', '23'), +('16', '106', '19', '81763', '104106', '23'), +('16', '106', '13', '111514', '714642', '23'), +('16', '106', '13', '111520', '705145', '23'), +('16', '106', '13', '111525', '700978', '23'), +('16', '106', '13', '111220', '662952', '23'), +('16', '106', '14', '62980', '111201', '23'), +('16', '106', '14', '54901', '68266', '23'), +('16', '106', '14', '46875', '52670', '23'), +('16', '106', '14', '46925', '51653', '23'), +('16', '106', '11', '133816', '211525', '23'), +('16', '106', '11', '111338', '167308', '23'), +('16', '106', '11', '111333', '165831', '23'), +('16', '106', '11', '111337', '162697', '23'), +('16', '107', '22', '12425', '0', '23'), +('16', '107', '22', '21807', '0', '23'), +('16', '107', '22', '21805', '0', '23'), +('16', '107', '22', '39342', '0', '23'), +('16', '107', '1', '98769', '277179', '23'), +('16', '107', '1', '111303', '167271', '23'), +('16', '107', '1', '111308', '166892', '23'), +('16', '107', '1', '111300', '165855', '23'), +('16', '107', '2', '94056', '107100', '23'), +('16', '107', '2', '62985', '105482', '23'), +('16', '107', '2', '104410', '87214', '23'), +('16', '107', '2', '54846', '67456', '23'), +('16', '107', '3', '111315', '166123', '23'), +('16', '107', '3', '111313', '165865', '23'), +('16', '107', '3', '111316', '162881', '23'), +('16', '107', '3', '111014', '146208', '23'), +('16', '107', '5', '111318', '165386', '23'), +('16', '107', '5', '111320', '164983', '23'), +('16', '107', '5', '111319', '161938', '23'), +('16', '107', '5', '111017', '145548', '23'), +('16', '107', '8', '111331', '168489', '23'), +('16', '107', '8', '111328', '167158', '23'), +('16', '107', '8', '111332', '162928', '23'), +('16', '107', '8', '111030', '148624', '23'), +('16', '107', '6', '111322', '166039', '23'), +('16', '107', '6', '111324', '165852', '23'), +('16', '107', '6', '111326', '162011', '23'), +('16', '107', '6', '111021', '146174', '23'), +('16', '107', '17', '56046', '112142', '23'), +('16', '107', '17', '81765', '110298', '23'), +('16', '107', '17', '56083', '110087', '23'), +('16', '107', '17', '104413', '93262', '23'), +('16', '107', '7', '94053', '108206', '23'), +('16', '107', '7', '56079', '106733', '23'), +('16', '107', '7', '104411', '91762', '23'), +('16', '107', '7', '54850', '67351', '23'), +('16', '107', '9', '67098', '169788', '23'), +('16', '107', '9', '56033', '103838', '23'), +('16', '107', '9', '56031', '103837', '23'), +('16', '107', '9', '56070', '103553', '23'), +('16', '107', '15', '111343', '167685', '23'), +('16', '107', '15', '111347', '166788', '23'), +('16', '107', '15', '111345', '164881', '23'), +('16', '107', '15', '111339', '163884', '23'), +('16', '107', '20', '111354', '179490', '23'), +('16', '107', '20', '111355', '176196', '23'), +('16', '107', '20', '111351', '174282', '23'), +('16', '107', '20', '111352', '172478', '23'), +('16', '107', '12', '81795', '104233', '23'), +('16', '107', '12', '56073', '104087', '23'), +('16', '107', '12', '104408', '87959', '23'), +('16', '107', '12', '49656', '66079', '23'), +('16', '107', '18', '62986', '108594', '23'), +('16', '107', '18', '56041', '107435', '23'), +('16', '107', '18', '94054', '105841', '23'), +('16', '107', '18', '104412', '93574', '23'), +('16', '107', '19', '62990', '108045', '23'), +('16', '107', '19', '56037', '106992', '23'), +('16', '107', '19', '56075', '105301', '23'), +('16', '107', '19', '81763', '104108', '23'), +('16', '107', '13', '111514', '716009', '23'), +('16', '107', '13', '111520', '706511', '23'), +('16', '107', '13', '111525', '702345', '23'), +('16', '107', '13', '111220', '664268', '23'), +('16', '107', '14', '62980', '111204', '23'), +('16', '107', '14', '54901', '68269', '23'), +('16', '107', '14', '46875', '52674', '23'), +('16', '107', '14', '46925', '51657', '23'), +('16', '107', '11', '133816', '211528', '23'), +('16', '107', '11', '111338', '167313', '23'), +('16', '107', '11', '111333', '165834', '23'), +('16', '107', '11', '111337', '162700', '23'), +('16', '108', '22', '12425', '0', '23'), +('16', '108', '22', '21807', '0', '23'), +('16', '108', '22', '21805', '0', '23'), +('16', '108', '22', '39342', '0', '23'), +('16', '108', '1', '98769', '277182', '23'), +('16', '108', '1', '111303', '167277', '23'), +('16', '108', '1', '111308', '166896', '23'), +('16', '108', '1', '111300', '165858', '23'), +('16', '108', '2', '94056', '107103', '23'), +('16', '108', '2', '62985', '105484', '23'), +('16', '108', '2', '104410', '87218', '23'), +('16', '108', '2', '54846', '67459', '23'), +('16', '108', '3', '111315', '166129', '23'), +('16', '108', '3', '111313', '165868', '23'), +('16', '108', '3', '111316', '162885', '23'), +('16', '108', '3', '111014', '146214', '23'), +('16', '108', '5', '111318', '165389', '23'), +('16', '108', '5', '111320', '164988', '23'), +('16', '108', '5', '111319', '161943', '23'), +('16', '108', '5', '111017', '145551', '23'), +('16', '108', '8', '111331', '168494', '23'), +('16', '108', '8', '111328', '167162', '23'), +('16', '108', '8', '111332', '162931', '23'), +('16', '108', '8', '111030', '148629', '23'), +('16', '108', '6', '111322', '166043', '23'), +('16', '108', '6', '111324', '165856', '23'), +('16', '108', '6', '111326', '162015', '23'), +('16', '108', '6', '111021', '146178', '23'), +('16', '108', '17', '56046', '112148', '23'), +('16', '108', '17', '81765', '110301', '23'), +('16', '108', '17', '56083', '110089', '23'), +('16', '108', '17', '104413', '93267', '23'), +('16', '108', '7', '94053', '108210', '23'), +('16', '108', '7', '56079', '106737', '23'), +('16', '108', '7', '104411', '91766', '23'), +('16', '108', '7', '54850', '67352', '23'), +('16', '108', '9', '67098', '169792', '23'), +('16', '108', '9', '56033', '103840', '23'), +('16', '108', '9', '56031', '103839', '23'), +('16', '108', '9', '56070', '103555', '23'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '108', '15', '111343', '167688', '23'), +('16', '108', '15', '111347', '166792', '23'), +('16', '108', '15', '111345', '164884', '23'), +('16', '108', '15', '111339', '163887', '23'), +('16', '108', '20', '111354', '179493', '23'), +('16', '108', '20', '111355', '176198', '23'), +('16', '108', '20', '111351', '174284', '23'), +('16', '108', '20', '111352', '172482', '23'), +('16', '108', '12', '81795', '104237', '23'), +('16', '108', '12', '56073', '104093', '23'), +('16', '108', '12', '104408', '87963', '23'), +('16', '108', '12', '49656', '66079', '23'), +('16', '108', '18', '62986', '108600', '23'), +('16', '108', '18', '56041', '107437', '23'), +('16', '108', '18', '94054', '105845', '23'), +('16', '108', '18', '104412', '93576', '23'), +('16', '108', '19', '62990', '108049', '23'), +('16', '108', '19', '56037', '106995', '23'), +('16', '108', '19', '56075', '105305', '23'), +('16', '108', '19', '81763', '104112', '23'), +('16', '108', '13', '111514', '717376', '23'), +('16', '108', '13', '111520', '707877', '23'), +('16', '108', '13', '111525', '703712', '23'), +('16', '108', '13', '111220', '665584', '23'), +('16', '108', '14', '62980', '111207', '23'), +('16', '108', '14', '54901', '68272', '23'), +('16', '108', '14', '46875', '52679', '23'), +('16', '108', '14', '46925', '51661', '23'), +('16', '108', '11', '133816', '211531', '23'), +('16', '108', '11', '111338', '167317', '23'), +('16', '108', '11', '111333', '165837', '23'), +('16', '108', '11', '111337', '162704', '23'), +('16', '109', '22', '12425', '0', '23'), +('16', '109', '22', '21807', '0', '23'), +('16', '109', '22', '21805', '0', '23'), +('16', '109', '22', '39342', '0', '23'), +('16', '109', '1', '98769', '277185', '23'), +('16', '109', '1', '111303', '167282', '23'), +('16', '109', '1', '111308', '166900', '23'), +('16', '109', '1', '111300', '165861', '23'), +('16', '109', '2', '94056', '107107', '23'), +('16', '109', '2', '62985', '105487', '23'), +('16', '109', '2', '104410', '87221', '23'), +('16', '109', '2', '54846', '67462', '23'), +('16', '109', '3', '111315', '166135', '23'), +('16', '109', '3', '111313', '165871', '23'), +('16', '109', '3', '111316', '162889', '23'), +('16', '109', '3', '111014', '146220', '23'), +('16', '109', '5', '111318', '165392', '23'), +('16', '109', '5', '111320', '164992', '23'), +('16', '109', '5', '111319', '161948', '23'), +('16', '109', '5', '111017', '145554', '23'), +('16', '109', '8', '111331', '168498', '23'), +('16', '109', '8', '111328', '167167', '23'), +('16', '109', '8', '111332', '162934', '23'), +('16', '109', '8', '111030', '148633', '23'), +('16', '109', '6', '111322', '166046', '23'), +('16', '109', '6', '111324', '165861', '23'), +('16', '109', '6', '111326', '162019', '23'), +('16', '109', '6', '111021', '146181', '23'), +('16', '109', '17', '56046', '112153', '23'), +('16', '109', '17', '81765', '110305', '23'), +('16', '109', '17', '56083', '110092', '23'), +('16', '109', '17', '104413', '93271', '23'), +('16', '109', '7', '94053', '108214', '23'), +('16', '109', '7', '56079', '106742', '23'), +('16', '109', '7', '104411', '91769', '23'), +('16', '109', '7', '54850', '67353', '23'), +('16', '109', '9', '67098', '169796', '23'), +('16', '109', '9', '56033', '103842', '23'), +('16', '109', '9', '56031', '103842', '23'), +('16', '109', '9', '56070', '103557', '23'), +('16', '109', '15', '111343', '167691', '23'), +('16', '109', '15', '111347', '166797', '23'), +('16', '109', '15', '111345', '164887', '23'), +('16', '109', '15', '111339', '163891', '23'), +('16', '109', '20', '111354', '179497', '23'), +('16', '109', '20', '111355', '176201', '23'), +('16', '109', '20', '111351', '174287', '23'), +('16', '109', '20', '111352', '172486', '23'), +('16', '109', '12', '81795', '104242', '23'), +('16', '109', '12', '56073', '104098', '23'), +('16', '109', '12', '104408', '87967', '23'), +('16', '109', '12', '49656', '66080', '23'), +('16', '109', '18', '62986', '108605', '23'), +('16', '109', '18', '56041', '107438', '23'), +('16', '109', '18', '94054', '105849', '23'), +('16', '109', '18', '104412', '93578', '23'), +('16', '109', '19', '62990', '108053', '23'), +('16', '109', '19', '56037', '106999', '23'), +('16', '109', '19', '56075', '105309', '23'), +('16', '109', '19', '81763', '104115', '23'), +('16', '109', '13', '111514', '718793', '23'), +('16', '109', '13', '111520', '709244', '23'), +('16', '109', '13', '111525', '705028', '23'), +('16', '109', '13', '111220', '666850', '23'), +('16', '109', '14', '62980', '111209', '23'), +('16', '109', '14', '54901', '68275', '23'), +('16', '109', '14', '46875', '52683', '23'), +('16', '109', '14', '46925', '51666', '23'), +('16', '109', '11', '133816', '211535', '23'), +('16', '109', '11', '111338', '167322', '23'), +('16', '109', '11', '111333', '165840', '23'), +('16', '109', '11', '111337', '162707', '23'), +('16', '110', '22', '12425', '0', '25'), +('16', '110', '22', '21807', '0', '25'), +('16', '110', '22', '39342', '0', '25'), +('16', '110', '22', '7867', '0', '25'), +('16', '110', '1', '98769', '277188', '25'), +('16', '110', '1', '111303', '167287', '25'), +('16', '110', '1', '111308', '166904', '25'), +('16', '110', '1', '111300', '165864', '25'), +('16', '110', '2', '94056', '107110', '25'), +('16', '110', '2', '62985', '105489', '25'), +('16', '110', '2', '104410', '87225', '25'), +('16', '110', '2', '54846', '67465', '25'), +('16', '110', '3', '111315', '166141', '25'), +('16', '110', '3', '111313', '165874', '25'), +('16', '110', '3', '111316', '162893', '25'), +('16', '110', '3', '111014', '146226', '25'), +('16', '110', '5', '111318', '165395', '25'), +('16', '110', '5', '111320', '164996', '25'), +('16', '110', '5', '111319', '161953', '25'), +('16', '110', '5', '111017', '145557', '25'), +('16', '110', '8', '111331', '168503', '25'), +('16', '110', '8', '111328', '167171', '25'), +('16', '110', '8', '111332', '162937', '25'), +('16', '110', '8', '111030', '148638', '25'), +('16', '110', '6', '111322', '166049', '25'), +('16', '110', '6', '111324', '165865', '25'), +('16', '110', '6', '111326', '162023', '25'), +('16', '110', '6', '111021', '146184', '25'), +('16', '110', '17', '56046', '112159', '25'), +('16', '110', '17', '81765', '110308', '25'), +('16', '110', '17', '56083', '110094', '25'), +('16', '110', '17', '104413', '93275', '25'), +('16', '110', '7', '94053', '108218', '25'), +('16', '110', '7', '56079', '106746', '25'), +('16', '110', '7', '104411', '91773', '25'), +('16', '110', '7', '54850', '67354', '25'), +('16', '110', '9', '67098', '169800', '25'), +('16', '110', '9', '56033', '103845', '25'), +('16', '110', '9', '56031', '103844', '25'), +('16', '110', '9', '56070', '103559', '25'), +('16', '110', '15', '111343', '167694', '25'), +('16', '110', '15', '111347', '166802', '25'), +('16', '110', '15', '111345', '164890', '25'), +('16', '110', '15', '111339', '163894', '25'), +('16', '110', '20', '111354', '179501', '25'), +('16', '110', '20', '111355', '176204', '25'), +('16', '110', '20', '111351', '174289', '25'), +('16', '110', '20', '111352', '172490', '25'), +('16', '110', '12', '81795', '104247', '25'), +('16', '110', '12', '56073', '104104', '25'), +('16', '110', '12', '104408', '87971', '25'), +('16', '110', '12', '49656', '66080', '25'), +('16', '110', '18', '62986', '108611', '25'), +('16', '110', '18', '56041', '107440', '25'), +('16', '110', '18', '94054', '105854', '25'), +('16', '110', '18', '104412', '93580', '25'), +('16', '110', '19', '62904', '144191', '25'), +('16', '110', '19', '62990', '108057', '25'), +('16', '110', '19', '56037', '107003', '25'), +('16', '110', '19', '56075', '105312', '25'), +('16', '110', '13', '111514', '722432', '25'), +('16', '110', '13', '111520', '712882', '25'), +('16', '110', '13', '111525', '708667', '25'), +('16', '110', '13', '111220', '670438', '25'), +('16', '110', '14', '62980', '111212', '25'), +('16', '110', '14', '54901', '68278', '25'), +('16', '110', '14', '46875', '52688', '25'), +('16', '110', '14', '46925', '51671', '25'), +('16', '110', '11', '85213', '246861', '25'), +('16', '110', '11', '133816', '211538', '25'), +('16', '110', '11', '111338', '167327', '25'), +('16', '110', '11', '111333', '165843', '25'), +('16', '110', '22', '12425', '0', '24'), +('16', '110', '22', '21807', '0', '24'), +('16', '110', '22', '39342', '0', '24'), +('16', '110', '22', '7867', '0', '24'), +('16', '110', '1', '98769', '277188', '24'), +('16', '110', '1', '111303', '167287', '24'), +('16', '110', '1', '111308', '166904', '24'), +('16', '110', '1', '111300', '165864', '24'), +('16', '110', '2', '94056', '107110', '24'), +('16', '110', '2', '62985', '105489', '24'), +('16', '110', '2', '104410', '87225', '24'), +('16', '110', '2', '54846', '67465', '24'), +('16', '110', '3', '111315', '166141', '24'), +('16', '110', '3', '111313', '165874', '24'), +('16', '110', '3', '111316', '162893', '24'), +('16', '110', '3', '111014', '146226', '24'), +('16', '110', '5', '111318', '165395', '24'), +('16', '110', '5', '111320', '164996', '24'), +('16', '110', '5', '111319', '161953', '24'), +('16', '110', '5', '111017', '145557', '24'), +('16', '110', '8', '111331', '168503', '24'), +('16', '110', '8', '111328', '167171', '24'), +('16', '110', '8', '111332', '162937', '24'), +('16', '110', '8', '111030', '148638', '24'), +('16', '110', '6', '111322', '166049', '24'), +('16', '110', '6', '111324', '165865', '24'), +('16', '110', '6', '111326', '162023', '24'), +('16', '110', '6', '111021', '146184', '24'), +('16', '110', '17', '56046', '112159', '24'), +('16', '110', '17', '81765', '110308', '24'), +('16', '110', '17', '56083', '110094', '24'), +('16', '110', '17', '104413', '93275', '24'), +('16', '110', '7', '94053', '108218', '24'), +('16', '110', '7', '56079', '106746', '24'), +('16', '110', '7', '104411', '91773', '24'), +('16', '110', '7', '54850', '67354', '24'), +('16', '110', '9', '67098', '169800', '24'), +('16', '110', '9', '56033', '103845', '24'), +('16', '110', '9', '56031', '103844', '24'), +('16', '110', '9', '56070', '103559', '24'), +('16', '110', '15', '111343', '167694', '24'), +('16', '110', '15', '111347', '166802', '24'), +('16', '110', '15', '111345', '164890', '24'), +('16', '110', '15', '111339', '163894', '24'), +('16', '110', '20', '111354', '179501', '24'), +('16', '110', '20', '111355', '176204', '24'), +('16', '110', '20', '111351', '174289', '24'), +('16', '110', '20', '111352', '172490', '24'), +('16', '110', '12', '81795', '104247', '24'), +('16', '110', '12', '56073', '104104', '24'), +('16', '110', '12', '104408', '87971', '24'), +('16', '110', '12', '49656', '66080', '24'), +('16', '110', '18', '62986', '108611', '24'), +('16', '110', '18', '56041', '107440', '24'), +('16', '110', '18', '94054', '105854', '24'), +('16', '110', '18', '104412', '93580', '24'), +('16', '110', '19', '62990', '108057', '24'), +('16', '110', '19', '56037', '107003', '24'), +('16', '110', '19', '56075', '105312', '24'), +('16', '110', '19', '81763', '104118', '24'), +('16', '110', '13', '111514', '722432', '24'), +('16', '110', '13', '111520', '712882', '24'), +('16', '110', '13', '111525', '708667', '24'), +('16', '110', '13', '111220', '670438', '24'), +('16', '110', '14', '62980', '111212', '24'), +('16', '110', '14', '54901', '68278', '24'), +('16', '110', '14', '46875', '52688', '24'), +('16', '110', '14', '46925', '51671', '24'), +('16', '110', '11', '85213', '246861', '24'), +('16', '110', '11', '133816', '211538', '24'), +('16', '110', '11', '111338', '167327', '24'), +('16', '110', '11', '111333', '165843', '24'), +('16', '111', '22', '12425', '0', '25'), +('16', '111', '22', '21807', '0', '25'), +('16', '111', '22', '39342', '0', '25'), +('16', '111', '22', '7867', '0', '25'), +('16', '111', '1', '98769', '277191', '25'), +('16', '111', '1', '111303', '167292', '25'), +('16', '111', '1', '111308', '166908', '25'), +('16', '111', '1', '111300', '165867', '25'), +('16', '111', '2', '94056', '107114', '25'), +('16', '111', '2', '62985', '105491', '25'), +('16', '111', '2', '104410', '87228', '25'), +('16', '111', '2', '54846', '67468', '25'), +('16', '111', '3', '111315', '166147', '25'), +('16', '111', '3', '111313', '165877', '25'), +('16', '111', '3', '111316', '162896', '25'), +('16', '111', '3', '111014', '146232', '25'), +('16', '111', '5', '111318', '165398', '25'), +('16', '111', '5', '111320', '165000', '25'), +('16', '111', '5', '111319', '161958', '25'), +('16', '111', '5', '111017', '145560', '25'), +('16', '111', '8', '111331', '168508', '25'), +('16', '111', '8', '111328', '167176', '25'), +('16', '111', '8', '111332', '162939', '25'), +('16', '111', '8', '111030', '148643', '25'), +('16', '111', '6', '111322', '166053', '25'), +('16', '111', '6', '111324', '165870', '25'), +('16', '111', '6', '111326', '162026', '25'), +('16', '111', '6', '111021', '146188', '25'), +('16', '111', '17', '56046', '112165', '25'), +('16', '111', '17', '81765', '110311', '25'), +('16', '111', '17', '56083', '110096', '25'), +('16', '111', '17', '104413', '93280', '25'), +('16', '111', '7', '94053', '108222', '25'), +('16', '111', '7', '56079', '106751', '25'), +('16', '111', '7', '104411', '91776', '25'), +('16', '111', '7', '54850', '67356', '25'), +('16', '111', '9', '67098', '169803', '25'), +('16', '111', '9', '56031', '103847', '25'), +('16', '111', '9', '56033', '103847', '25'), +('16', '111', '9', '56070', '103561', '25'), +('16', '111', '15', '111343', '167696', '25'), +('16', '111', '15', '111347', '166806', '25'), +('16', '111', '15', '111345', '164893', '25'), +('16', '111', '15', '111339', '163897', '25'), +('16', '111', '20', '111354', '179504', '25'), +('16', '111', '20', '111355', '176207', '25'), +('16', '111', '20', '111351', '174292', '25'), +('16', '111', '20', '111352', '172495', '25'), +('16', '111', '12', '81795', '104252', '25'), +('16', '111', '12', '56073', '104110', '25'), +('16', '111', '12', '104408', '87975', '25'), +('16', '111', '12', '49656', '66081', '25'), +('16', '111', '18', '62986', '108617', '25'), +('16', '111', '18', '56041', '107442', '25'), +('16', '111', '18', '94054', '105858', '25'), +('16', '111', '18', '104412', '93582', '25'), +('16', '111', '19', '62904', '144196', '25'), +('16', '111', '19', '62990', '108061', '25'), +('16', '111', '19', '56037', '107007', '25'), +('16', '111', '19', '56075', '105316', '25'), +('16', '111', '13', '111514', '723799', '25'), +('16', '111', '13', '111520', '714248', '25'), +('16', '111', '13', '111525', '710034', '25'), +('16', '111', '13', '111220', '671755', '25'), +('16', '111', '14', '62980', '111215', '25'), +('16', '111', '14', '54901', '68281', '25'), +('16', '111', '14', '46875', '52692', '25'), +('16', '111', '14', '46925', '51675', '25'), +('16', '111', '11', '85213', '246864', '25'), +('16', '111', '11', '133816', '211542', '25'), +('16', '111', '11', '111338', '167331', '25'), +('16', '111', '11', '111333', '165846', '25'), +('16', '112', '22', '12425', '0', '25'), +('16', '112', '22', '21807', '0', '25'), +('16', '112', '22', '39342', '0', '25'), +('16', '112', '22', '7867', '0', '25'), +('16', '112', '1', '98769', '277194', '25'), +('16', '112', '1', '111303', '167297', '25'), +('16', '112', '1', '111308', '166912', '25'), +('16', '112', '1', '111300', '165870', '25'), +('16', '112', '2', '94056', '107117', '25'), +('16', '112', '2', '62985', '105494', '25'), +('16', '112', '2', '104410', '87232', '25'), +('16', '112', '2', '54846', '67471', '25'), +('16', '112', '3', '111315', '166153', '25'), +('16', '112', '3', '111313', '165880', '25'), +('16', '112', '3', '111316', '162900', '25'), +('16', '112', '3', '111014', '146238', '25'), +('16', '112', '5', '111318', '165401', '25'), +('16', '112', '5', '111320', '165004', '25'), +('16', '112', '5', '111319', '161963', '25'), +('16', '112', '5', '111017', '145563', '25'), +('16', '112', '8', '111331', '168512', '25'), +('16', '112', '8', '111328', '167180', '25'), +('16', '112', '8', '111332', '162942', '25'), +('16', '112', '8', '111030', '148647', '25'), +('16', '112', '6', '111322', '166056', '25'), +('16', '112', '6', '111324', '165874', '25'), +('16', '112', '6', '111326', '162030', '25'), +('16', '112', '6', '111021', '146191', '25'), +('16', '112', '17', '56046', '112170', '25'), +('16', '112', '17', '81765', '110315', '25'), +('16', '112', '17', '56083', '110099', '25'), +('16', '112', '17', '104413', '93284', '25'), +('16', '112', '7', '94053', '108227', '25'), +('16', '112', '7', '56079', '106755', '25'), +('16', '112', '7', '104411', '91780', '25'), +('16', '112', '7', '54850', '67357', '25'), +('16', '112', '9', '67098', '169807', '25'), +('16', '112', '9', '56031', '103849', '25'), +('16', '112', '9', '56033', '103849', '25'), +('16', '112', '9', '56070', '103562', '25'), +('16', '112', '15', '111343', '167699', '25'), +('16', '112', '15', '111347', '166811', '25'), +('16', '112', '15', '111345', '164896', '25'), +('16', '112', '15', '111339', '163900', '25'), +('16', '112', '20', '111354', '179508', '25'), +('16', '112', '20', '111355', '176209', '25'), +('16', '112', '20', '111351', '174294', '25'), +('16', '112', '20', '111352', '172499', '25'), +('16', '112', '12', '81795', '104257', '25'), +('16', '112', '12', '56073', '104115', '25'), +('16', '112', '12', '104408', '87979', '25'), +('16', '112', '12', '49656', '66081', '25'), +('16', '112', '18', '62986', '108622', '25'), +('16', '112', '18', '56041', '107443', '25'), +('16', '112', '18', '94054', '105862', '25'), +('16', '112', '18', '104412', '93583', '25'), +('16', '112', '19', '62904', '144200', '25'), +('16', '112', '19', '62990', '108065', '25'), +('16', '112', '19', '56037', '107011', '25'), +('16', '112', '19', '56075', '105320', '25'), +('16', '112', '13', '111514', '725217', '25'), +('16', '112', '13', '111520', '715615', '25'), +('16', '112', '13', '111525', '711401', '25'), +('16', '112', '13', '111220', '673071', '25'), +('16', '112', '14', '62980', '111218', '25'), +('16', '112', '14', '54901', '68284', '25'), +('16', '112', '14', '46875', '52697', '25'), +('16', '112', '14', '46925', '51680', '25'), +('16', '112', '11', '85213', '246867', '25'), +('16', '112', '11', '133816', '211545', '25'), +('16', '112', '11', '111338', '167336', '25'), +('16', '112', '11', '111333', '165849', '25'), +('16', '113', '22', '12425', '0', '25'), +('16', '113', '22', '21807', '0', '25'), +('16', '113', '22', '39342', '0', '25'), +('16', '113', '22', '7867', '0', '25'), +('16', '113', '1', '98769', '277197', '25'), +('16', '113', '1', '111303', '167303', '25'), +('16', '113', '1', '111308', '166916', '25'), +('16', '113', '1', '111300', '165873', '25'), +('16', '113', '2', '94056', '107121', '25'), +('16', '113', '2', '62985', '105496', '25'), +('16', '113', '2', '104410', '87235', '25'), +('16', '113', '2', '54846', '67473', '25'), +('16', '113', '3', '111315', '166158', '25'), +('16', '113', '3', '111313', '165883', '25'), +('16', '113', '3', '111316', '162904', '25'), +('16', '113', '3', '111014', '146243', '25'), +('16', '113', '5', '111318', '165404', '25'), +('16', '113', '5', '111320', '165008', '25'), +('16', '113', '5', '111319', '161969', '25'), +('16', '113', '5', '111017', '145566', '25'), +('16', '113', '8', '111331', '168517', '25'), +('16', '113', '8', '111328', '167185', '25'), +('16', '113', '8', '111332', '162945', '25'), +('16', '113', '8', '111030', '148652', '25'), +('16', '113', '6', '111322', '166060', '25'), +('16', '113', '6', '111324', '165878', '25'), +('16', '113', '6', '111326', '162034', '25'), +('16', '113', '6', '111021', '146195', '25'), +('16', '113', '17', '56046', '112176', '25'), +('16', '113', '17', '81765', '110318', '25'), +('16', '113', '17', '56083', '110101', '25'), +('16', '113', '17', '104413', '93288', '25'), +('16', '113', '7', '94053', '108231', '25'), +('16', '113', '7', '56079', '106760', '25'), +('16', '113', '7', '104411', '91784', '25'), +('16', '113', '7', '54850', '67358', '25'), +('16', '113', '9', '67098', '169811', '25'), +('16', '113', '9', '56031', '103852', '25'), +('16', '113', '9', '56033', '103851', '25'), +('16', '113', '9', '56070', '103564', '25'), +('16', '113', '15', '111343', '167702', '25'), +('16', '113', '15', '111347', '166816', '25'), +('16', '113', '15', '111345', '164899', '25'), +('16', '113', '15', '111339', '163904', '25'), +('16', '113', '20', '111354', '179512', '25'), +('16', '113', '20', '111355', '176212', '25'), +('16', '113', '20', '111351', '174297', '25'), +('16', '113', '20', '111352', '172503', '25'), +('16', '113', '12', '81795', '104261', '25'), +('16', '113', '12', '56073', '104121', '25'), +('16', '113', '12', '104408', '87983', '25'), +('16', '113', '12', '49656', '66082', '25'), +('16', '113', '18', '62986', '108628', '25'), +('16', '113', '18', '56041', '107445', '25'), +('16', '113', '18', '94054', '105867', '25'), +('16', '113', '18', '104412', '93585', '25'), +('16', '113', '19', '62904', '144205', '25'), +('16', '113', '19', '62990', '108069', '25'), +('16', '113', '19', '56037', '107015', '25'), +('16', '113', '19', '56075', '105324', '25'), +('16', '113', '13', '111514', '726584', '25'), +('16', '113', '13', '111520', '716981', '25'), +('16', '113', '13', '111525', '712768', '25'), +('16', '113', '13', '111220', '674387', '25'), +('16', '113', '14', '62980', '111220', '25'), +('16', '113', '14', '54901', '68287', '25'), +('16', '113', '14', '46875', '52701', '25'), +('16', '113', '14', '46925', '51684', '25'), +('16', '113', '11', '85213', '246870', '25'), +('16', '113', '11', '133816', '211548', '25'), +('16', '113', '11', '111338', '167341', '25'), +('16', '113', '11', '111333', '165852', '25'), +('16', '114', '22', '12425', '0', '25'), +('16', '114', '22', '21807', '0', '25'), +('16', '114', '22', '39342', '0', '25'), +('16', '114', '22', '7867', '0', '25'), +('16', '114', '1', '98769', '277200', '25'), +('16', '114', '1', '111303', '167308', '25'), +('16', '114', '1', '111308', '166920', '25'), +('16', '114', '1', '111300', '165876', '25'), +('16', '114', '2', '94056', '107124', '25'), +('16', '114', '2', '62985', '105498', '25'), +('16', '114', '2', '104410', '87239', '25'), +('16', '114', '2', '54846', '67476', '25'), +('16', '114', '3', '111315', '166164', '25'), +('16', '114', '3', '111313', '165886', '25'), +('16', '114', '3', '111316', '162908', '25'), +('16', '114', '3', '111014', '146249', '25'), +('16', '114', '5', '111318', '165407', '25'), +('16', '114', '5', '111320', '165013', '25'), +('16', '114', '5', '111319', '161974', '25'), +('16', '114', '5', '111017', '145569', '25'), +('16', '114', '8', '111331', '168521', '25'), +('16', '114', '8', '111328', '167189', '25'), +('16', '114', '8', '111332', '162948', '25'), +('16', '114', '8', '111030', '148656', '25'), +('16', '114', '6', '111322', '166063', '25'), +('16', '114', '6', '111324', '165883', '25'), +('16', '114', '6', '111326', '162038', '25'), +('16', '114', '6', '111021', '146198', '25'), +('16', '114', '17', '56046', '112181', '25'), +('16', '114', '17', '81765', '110322', '25'), +('16', '114', '17', '56083', '110103', '25'), +('16', '114', '17', '104413', '93292', '25'), +('16', '114', '7', '94053', '108235', '25'), +('16', '114', '7', '56079', '106764', '25'), +('16', '114', '7', '104411', '91787', '25'), +('16', '114', '7', '54850', '67359', '25'); +INSERT INTO `tool_gearup_armor_sets` (`class`, `level`, `slot`, `item_id`, `score`, `expansion`) VALUES +('16', '114', '9', '67098', '169815', '25'), +('16', '114', '9', '56031', '103854', '25'), +('16', '114', '9', '56033', '103853', '25'), +('16', '114', '9', '56070', '103566', '25'), +('16', '114', '15', '111343', '167705', '25'), +('16', '114', '15', '111347', '166820', '25'), +('16', '114', '15', '111345', '164902', '25'), +('16', '114', '15', '111339', '163907', '25'), +('16', '114', '20', '111354', '179515', '25'), +('16', '114', '20', '111355', '176215', '25'), +('16', '114', '20', '111351', '174299', '25'), +('16', '114', '20', '111352', '172507', '25'), +('16', '114', '12', '81795', '104266', '25'), +('16', '114', '12', '56073', '104126', '25'), +('16', '114', '12', '104408', '87987', '25'), +('16', '114', '12', '49656', '66082', '25'), +('16', '114', '18', '62986', '108634', '25'), +('16', '114', '18', '56041', '107447', '25'), +('16', '114', '18', '94054', '105871', '25'), +('16', '114', '18', '104412', '93587', '25'), +('16', '114', '19', '62904', '144210', '25'), +('16', '114', '19', '62990', '108073', '25'), +('16', '114', '19', '56037', '107019', '25'), +('16', '114', '19', '56075', '105328', '25'), +('16', '114', '13', '111514', '727951', '25'), +('16', '114', '13', '111520', '718347', '25'), +('16', '114', '13', '111525', '714135', '25'), +('16', '114', '13', '111220', '675703', '25'), +('16', '114', '14', '62980', '111223', '25'), +('16', '114', '14', '54901', '68290', '25'), +('16', '114', '14', '46875', '52706', '25'), +('16', '114', '14', '46925', '51689', '25'), +('16', '114', '11', '85213', '246873', '25'), +('16', '114', '11', '133816', '211552', '25'), +('16', '114', '11', '111338', '167345', '25'), +('16', '114', '11', '111333', '165855', '25'), +('16', '115', '22', '12425', '0', '26'), +('16', '115', '22', '21807', '0', '26'), +('16', '115', '22', '39342', '0', '26'), +('16', '115', '22', '7867', '0', '26'), +('16', '115', '1', '98769', '277203', '26'), +('16', '115', '1', '111303', '167313', '26'), +('16', '115', '1', '111308', '166924', '26'), +('16', '115', '1', '111300', '165879', '26'), +('16', '115', '2', '94056', '107128', '26'), +('16', '115', '2', '62985', '105501', '26'), +('16', '115', '2', '104410', '87242', '26'), +('16', '115', '2', '54846', '67479', '26'), +('16', '115', '3', '111315', '166170', '26'), +('16', '115', '3', '111313', '165889', '26'), +('16', '115', '3', '111316', '162912', '26'), +('16', '115', '3', '111014', '146255', '26'), +('16', '115', '5', '111318', '165410', '26'), +('16', '115', '5', '111320', '165017', '26'), +('16', '115', '5', '111319', '161979', '26'), +('16', '115', '5', '111017', '145572', '26'), +('16', '115', '8', '111331', '168526', '26'), +('16', '115', '8', '111328', '167194', '26'), +('16', '115', '8', '111332', '162951', '26'), +('16', '115', '8', '111030', '148661', '26'), +('16', '115', '6', '111322', '166066', '26'), +('16', '115', '6', '111324', '165887', '26'), +('16', '115', '6', '111326', '162041', '26'), +('16', '115', '6', '111021', '146201', '26'), +('16', '115', '17', '56046', '112187', '26'), +('16', '115', '17', '81765', '110325', '26'), +('16', '115', '17', '56083', '110106', '26'), +('16', '115', '17', '104413', '93297', '26'), +('16', '115', '7', '94053', '108239', '26'), +('16', '115', '7', '56079', '106769', '26'), +('16', '115', '7', '104411', '91791', '26'), +('16', '115', '7', '54850', '67360', '26'), +('16', '115', '9', '67098', '169818', '26'), +('16', '115', '9', '56031', '103857', '26'), +('16', '115', '9', '56033', '103856', '26'), +('16', '115', '9', '56070', '103568', '26'), +('16', '115', '15', '111343', '167708', '26'), +('16', '115', '15', '111347', '166825', '26'), +('16', '115', '15', '111345', '164905', '26'), +('16', '115', '15', '111339', '163910', '26'), +('16', '115', '20', '111354', '179519', '26'), +('16', '115', '20', '111355', '176217', '26'), +('16', '115', '20', '111351', '174302', '26'), +('16', '115', '20', '111352', '172511', '26'), +('16', '115', '12', '81795', '104271', '26'), +('16', '115', '12', '56073', '104132', '26'), +('16', '115', '12', '104408', '87991', '26'), +('16', '115', '12', '49656', '66083', '26'), +('16', '115', '18', '62986', '108640', '26'), +('16', '115', '18', '56041', '107449', '26'), +('16', '115', '18', '94054', '105875', '26'), +('16', '115', '18', '104412', '93589', '26'), +('16', '115', '19', '62904', '144214', '26'), +('16', '115', '19', '62990', '108077', '26'), +('16', '115', '19', '56037', '107023', '26'), +('16', '115', '19', '56075', '105332', '26'), +('16', '115', '13', '111514', '729318', '26'), +('16', '115', '13', '111520', '719713', '26'), +('16', '115', '13', '111525', '715452', '26'), +('16', '115', '13', '111220', '677020', '26'), +('16', '115', '14', '62980', '111226', '26'), +('16', '115', '14', '54901', '68293', '26'), +('16', '115', '14', '46875', '52711', '26'), +('16', '115', '14', '46925', '51693', '26'), +('16', '115', '11', '85213', '246876', '26'), +('16', '115', '11', '133816', '211555', '26'), +('16', '115', '11', '111338', '167350', '26'), +('16', '115', '11', '111333', '165859', '26'); diff --git a/utils/sql/git/optional/drakkin_guktan_faction_data.sql b/utils/sql/git/optional/drakkin_guktan_faction_data.sql new file mode 100644 index 000000000..7e6417653 --- /dev/null +++ b/utils/sql/git/optional/drakkin_guktan_faction_data.sql @@ -0,0 +1,33 @@ +-- MySQL dump 10.13 Distrib 5.7.30, for Linux (x86_64) +-- +-- Host: 192.168.0.3 Database: peqdb +-- ------------------------------------------------------ +-- Server version 5.7.30-0ubuntu0.16.04.1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +LOCK TABLES `faction_list_mod` WRITE; +/*!40000 ALTER TABLE `faction_list_mod` DISABLE KEYS */; +REPLACE INTO `faction_list_mod` VALUES (null,1021,-100,'d396','Agnostic'),(null,1023,-100,'d396','Agnostic'),(null,65,-600,'r330','Guktan'),(null,65,-600,'r522','Drakkin'),(null,106,-50,'r330','Guktan'),(null,106,-50,'r522','Drakkin'),(null,217,-500,'r330','Guktan'),(null,217,-500,'r522','Drakkin'),(null,218,-1000,'r330','Guktan'),(null,218,-1000,'r522','Drakkin'),(null,220,50,'r330','Guktan'),(null,220,50,'r522','Drakkin'),(null,221,50,'r330','Guktan'),(null,221,50,'r522','Drakkin'),(null,222,-750,'r330','Guktan'),(null,222,-750,'r522','Drakkin'),(null,223,50,'r330','Guktan'),(null,223,50,'r522','Drakkin'),(null,225,-875,'r330','Guktan'),(null,225,-875,'r522','Drakkin'),(null,227,-10,'r330','Guktan'),(null,227,-10,'r522','Drakkin'),(null,228,-750,'r330','Guktan'),(null,228,-750,'r522','Drakkin'),(null,230,50,'r330','Guktan'),(null,230,50,'r522','Drakkin'),(null,231,-100,'r330','Guktan'),(null,231,-100,'r522','Drakkin'),(null,232,-501,'r330','Guktan'),(null,232,-501,'r522','Drakkin'),(null,233,-100,'r330','Guktan'),(null,233,-100,'r522','Drakkin'),(null,234,-750,'r330','Guktan'),(null,234,-750,'r522','Drakkin'),(null,235,-1000,'r330','Guktan'),(null,235,-1000,'r522','Drakkin'),(null,236,-50,'r330','Guktan'),(null,236,-50,'r522','Drakkin'),(null,237,-500,'r330','Guktan'),(null,237,-500,'r522','Drakkin'),(null,238,-25,'r330','Guktan'),(null,238,-25,'r522','Drakkin'),(null,239,-50,'r330','Guktan'),(null,239,-50,'r522','Drakkin'),(null,240,-50,'r330','Guktan'),(null,240,-50,'r522','Drakkin'),(null,241,-50,'r330','Guktan'),(null,241,-50,'r522','Drakkin'),(null,242,-150,'r330','Guktan'),(null,242,-150,'r522','Drakkin'),(null,244,-200,'r330','Guktan'),(null,244,-200,'r522','Drakkin'),(null,245,-25,'r330','Guktan'),(null,245,-25,'r522','Drakkin'),(null,246,-10,'r330','Guktan'),(null,246,-10,'r522','Drakkin'),(null,247,-1000,'r330','Guktan'),(null,247,-1000,'r522','Drakkin'),(null,248,-25,'r330','Guktan'),(null,248,-25,'r522','Drakkin'),(null,249,-2000,'r330','Guktan'),(null,249,-2000,'r522','Drakkin'),(null,250,-1000,'r330','Guktan'),(null,250,-1000,'r522','Drakkin'),(null,251,-499,'r330','Guktan'),(null,251,-499,'r522','Drakkin'),(null,252,-1000,'r330','Guktan'),(null,252,-1000,'r522','Drakkin'),(null,253,-1000,'r330','Guktan'),(null,253,-1000,'r522','Drakkin'),(null,254,-50,'r330','Guktan'),(null,254,-50,'r522','Drakkin'),(null,255,-50,'r330','Guktan'),(null,255,-50,'r522','Drakkin'),(null,256,-1000,'r330','Guktan'),(null,256,-1000,'r522','Drakkin'),(null,257,-1000,'r330','Guktan'),(null,257,-1000,'r522','Drakkin'),(null,258,-1000,'r330','Guktan'),(null,258,-1000,'r522','Drakkin'),(null,259,-1000,'r330','Guktan'),(null,259,-1000,'r522','Drakkin'),(null,261,-750,'r330','Guktan'),(null,261,-750,'r522','Drakkin'),(null,263,-15,'r330','Guktan'),(null,263,-15,'r522','Drakkin'),(null,264,-50,'r330','Guktan'),(null,264,-50,'r522','Drakkin'),(null,265,-500,'r330','Guktan'),(null,265,-500,'r522','Drakkin'),(null,266,-1,'r330','Guktan'),(null,266,-1,'r522','Drakkin'),(null,267,-25,'r330','Guktan'),(null,267,-25,'r522','Drakkin'),(null,270,-500,'r330','Guktan'),(null,270,-500,'r522','Drakkin'),(null,271,50,'r330','Guktan'),(null,271,50,'r522','Drakkin'),(null,272,50,'r330','Guktan'),(null,272,50,'r522','Drakkin'),(null,274,-10,'r330','Guktan'),(null,274,-10,'r522','Drakkin'),(null,275,-10,'r330','Guktan'),(null,275,-10,'r522','Drakkin'),(null,276,-50,'r330','Guktan'),(null,276,-50,'r522','Drakkin'),(null,277,-450,'r330','Guktan'),(null,277,-450,'r522','Drakkin'),(null,278,-500,'r330','Guktan'),(null,278,-500,'r522','Drakkin'),(null,279,-1,'r330','Guktan'),(null,279,-1,'r522','Drakkin'),(null,280,50,'r330','Guktan'),(null,280,50,'r522','Drakkin'),(null,282,-1000,'r330','Guktan'),(null,282,-1000,'r522','Drakkin'),(null,283,-1000,'r330','Guktan'),(null,283,-1000,'r522','Drakkin'),(null,284,50,'r330','Guktan'),(null,284,50,'r522','Drakkin'),(null,285,-2000,'r330','Guktan'),(null,285,-2000,'r522','Drakkin'),(null,287,-1000,'r330','Guktan'),(null,287,-1000,'r522','Drakkin'),(null,288,-50,'r330','Guktan'),(null,288,-50,'r522','Drakkin'),(null,289,-50,'r330','Guktan'),(null,289,-50,'r522','Drakkin'),(null,290,-50,'r330','Guktan'),(null,290,-50,'r522','Drakkin'),(null,291,50,'r330','Guktan'),(null,291,50,'r522','Drakkin'),(null,292,-25,'r330','Guktan'),(null,292,-25,'r522','Drakkin'),(null,293,-1,'r330','Guktan'),(null,293,-1,'r522','Drakkin'),(null,295,-1000,'r330','Guktan'),(null,295,-1000,'r522','Drakkin'),(null,297,-1,'r330','Guktan'),(null,297,-1,'r522','Drakkin'),(null,299,-1000,'r330','Guktan'),(null,299,-1000,'r522','Drakkin'),(null,302,50,'r330','Guktan'),(null,302,50,'r522','Drakkin'),(null,304,-75,'r330','Guktan'),(null,304,-75,'r522','Drakkin'),(null,305,-99,'r330','Guktan'),(null,305,-99,'r522','Drakkin'),(null,306,-1000,'r330','Guktan'),(null,306,-1000,'r522','Drakkin'),(null,307,-1000,'r330','Guktan'),(null,307,-1000,'r522','Drakkin'),(null,308,-750,'r330','Guktan'),(null,308,-750,'r522','Drakkin'),(null,309,50,'r330','Guktan'),(null,309,50,'r522','Drakkin'),(null,310,-25,'r330','Guktan'),(null,310,-25,'r522','Drakkin'),(null,311,50,'r330','Guktan'),(null,311,50,'r522','Drakkin'),(null,312,-75,'r330','Guktan'),(null,312,-75,'r522','Drakkin'),(null,313,-1000,'r330','Guktan'),(null,313,-1000,'r522','Drakkin'),(null,315,-1000,'r330','Guktan'),(null,315,-1000,'r522','Drakkin'),(null,316,-1,'r330','Guktan'),(null,316,-1,'r522','Drakkin'),(null,317,-1000,'r330','Guktan'),(null,317,-1000,'r522','Drakkin'),(null,318,-75,'r330','Guktan'),(null,318,-75,'r522','Drakkin'),(null,319,-1000,'r330','Guktan'),(null,319,-1000,'r522','Drakkin'),(null,320,-50,'r330','Guktan'),(null,320,-50,'r522','Drakkin'),(null,321,-875,'r330','Guktan'),(null,321,-875,'r522','Drakkin'),(null,323,-75,'r330','Guktan'),(null,323,-75,'r522','Drakkin'),(null,325,-30,'r330','Guktan'),(null,325,-30,'r522','Drakkin'),(null,326,-50,'r330','Guktan'),(null,326,-50,'r522','Drakkin'),(null,327,-25,'r330','Guktan'),(null,327,-25,'r522','Drakkin'),(null,328,-50,'r330','Guktan'),(null,328,-50,'r522','Drakkin'),(null,333,-10,'r330','Guktan'),(null,333,-10,'r522','Drakkin'),(null,334,-500,'r330','Guktan'),(null,334,-500,'r522','Drakkin'),(null,336,50,'r330','Guktan'),(null,336,50,'r522','Drakkin'),(null,337,-875,'r330','Guktan'),(null,337,-875,'r522','Drakkin'),(null,338,-750,'r330','Guktan'),(null,338,-750,'r522','Drakkin'),(null,340,-250,'r330','Guktan'),(null,340,-250,'r522','Drakkin'),(null,342,50,'r330','Guktan'),(null,342,50,'r522','Drakkin'),(null,343,-600,'r330','Guktan'),(null,343,-600,'r522','Drakkin'),(null,346,50,'r330','Guktan'),(null,346,50,'r522','Drakkin'),(null,362,50,'r330','Guktan'),(null,362,50,'r522','Drakkin'),(null,363,-250,'r330','Guktan'),(null,363,-250,'r522','Drakkin'),(null,364,-1000,'r330','Guktan'),(null,364,-1000,'r522','Drakkin'),(null,370,-200,'r330','Guktan'),(null,370,-200,'r522','Drakkin'),(null,371,-875,'r330','Guktan'),(null,371,-875,'r522','Drakkin'),(null,372,-875,'r330','Guktan'),(null,372,-875,'r522','Drakkin'),(null,373,-750,'r330','Guktan'),(null,373,-750,'r522','Drakkin'),(null,375,-1000,'r330','Guktan'),(null,375,-1000,'r522','Drakkin'),(null,377,-875,'r330','Guktan'),(null,377,-875,'r522','Drakkin'),(null,378,-1600,'r330','Guktan'),(null,378,-1600,'r522','Drakkin'),(null,379,-550,'r330','Guktan'),(null,379,-550,'r522','Drakkin'),(null,382,-50,'r330','Guktan'),(null,382,-50,'r522','Drakkin'),(null,387,-1000,'r330','Guktan'),(null,387,-1000,'r522','Drakkin'),(null,390,-100,'r330','Guktan'),(null,390,-100,'r522','Drakkin'),(null,391,-100,'r330','Guktan'),(null,391,-100,'r522','Drakkin'),(null,394,-500,'r330','Guktan'),(null,394,-500,'r522','Drakkin'),(null,398,-1000,'r330','Guktan'),(null,398,-1000,'r522','Drakkin'),(null,401,-25,'r330','Guktan'),(null,401,-25,'r522','Drakkin'),(null,405,-200,'r330','Guktan'),(null,405,-200,'r522','Drakkin'),(null,406,-100,'r330','Guktan'),(null,406,-100,'r522','Drakkin'),(null,407,-800,'r330','Guktan'),(null,407,-800,'r522','Drakkin'),(null,409,-625,'r330','Guktan'),(null,409,-625,'r522','Drakkin'),(null,412,-475,'r330','Guktan'),(null,412,-475,'r522','Drakkin'),(null,415,50,'r330','Guktan'),(null,415,50,'r522','Drakkin'),(null,416,-400,'r330','Guktan'),(null,416,-400,'r522','Drakkin'),(null,418,-750,'r330','Guktan'),(null,418,-750,'r522','Drakkin'),(null,419,-550,'r330','Guktan'),(null,419,-550,'r522','Drakkin'),(null,420,-1000,'r330','Guktan'),(null,420,-1000,'r522','Drakkin'),(null,421,-600,'r330','Guktan'),(null,421,-600,'r522','Drakkin'),(null,423,-1000,'r330','Guktan'),(null,423,-1000,'r522','Drakkin'),(null,425,-1000,'r330','Guktan'),(null,425,-1000,'r522','Drakkin'),(null,426,-1000,'r330','Guktan'),(null,426,-1000,'r522','Drakkin'),(null,427,-400,'r330','Guktan'),(null,427,-400,'r522','Drakkin'),(null,428,-600,'r330','Guktan'),(null,428,-600,'r522','Drakkin'),(null,429,-800,'r330','Guktan'),(null,429,-800,'r522','Drakkin'),(null,430,-800,'r330','Guktan'),(null,430,-800,'r522','Drakkin'),(null,431,-800,'r330','Guktan'),(null,431,-800,'r522','Drakkin'),(null,434,-1000,'r330','Guktan'),(null,434,-1000,'r522','Drakkin'),(null,435,-1000,'r330','Guktan'),(null,435,-1000,'r522','Drakkin'),(null,436,-800,'r330','Guktan'),(null,436,-800,'r522','Drakkin'),(null,440,-1000,'r330','Guktan'),(null,440,-1000,'r522','Drakkin'),(null,441,-1000,'r330','Guktan'),(null,441,-1000,'r522','Drakkin'),(null,442,-1000,'r330','Guktan'),(null,442,-1000,'r522','Drakkin'),(null,443,-1000,'r330','Guktan'),(null,443,-1000,'r522','Drakkin'),(null,444,-1000,'r330','Guktan'),(null,444,-1000,'r522','Drakkin'),(null,445,-1000,'r330','Guktan'),(null,445,-1000,'r522','Drakkin'),(null,446,-1000,'r330','Guktan'),(null,446,-1000,'r522','Drakkin'),(null,447,200,'r330','Guktan'),(null,447,200,'r522','Drakkin'),(null,448,-550,'r330','Guktan'),(null,448,-550,'r522','Drakkin'),(null,450,-1000,'r330','Guktan'),(null,450,-1000,'r522','Drakkin'),(null,451,-800,'r330','Guktan'),(null,451,-800,'r522','Drakkin'),(null,452,-600,'r330','Guktan'),(null,452,-600,'r522','Drakkin'),(null,454,-1000,'r330','Guktan'),(null,454,-1000,'r522','Drakkin'),(null,455,-1000,'r330','Guktan'),(null,455,-1000,'r522','Drakkin'),(null,457,-800,'r330','Guktan'),(null,457,-800,'r522','Drakkin'),(null,460,-200,'r330','Guktan'),(null,460,-200,'r522','Drakkin'),(null,461,-1000,'r330','Guktan'),(null,461,-1000,'r522','Drakkin'),(null,462,-800,'r330','Guktan'),(null,462,-800,'r522','Drakkin'),(null,463,-200,'r330','Guktan'),(null,463,-200,'r522','Drakkin'),(null,467,-1000,'r330','Guktan'),(null,467,-1000,'r522','Drakkin'),(null,468,-1000,'r330','Guktan'),(null,468,-1000,'r522','Drakkin'),(null,471,-800,'r330','Guktan'),(null,471,-800,'r522','Drakkin'),(null,472,-1000,'r330','Guktan'),(null,472,-1000,'r522','Drakkin'),(null,474,-99,'r330','Guktan'),(null,474,-99,'r522','Drakkin'),(null,475,-875,'r330','Guktan'),(null,475,-875,'r522','Drakkin'),(null,548,-1000,'r330','Guktan'),(null,548,-1000,'r522','Drakkin'),(null,680,-100,'r330','Guktan'),(null,680,-100,'r522','Drakkin'),(null,711,-750,'r330','Guktan'),(null,711,-750,'r522','Drakkin'),(null,712,-750,'r330','Guktan'),(null,712,-750,'r522','Drakkin'),(null,713,-1000,'r330','Guktan'),(null,713,-1000,'r522','Drakkin'),(null,714,-1000,'r330','Guktan'),(null,714,-1000,'r522','Drakkin'),(null,715,-1000,'r330','Guktan'),(null,715,-1000,'r522','Drakkin'),(null,716,-1000,'r330','Guktan'),(null,716,-1000,'r522','Drakkin'),(null,720,375,'r330','Guktan'),(null,720,375,'r522','Drakkin'),(null,721,375,'r330','Guktan'),(null,721,375,'r522','Drakkin'),(null,1007,-2000,'r330','Guktan'),(null,1007,-2000,'r522','Drakkin'),(null,1010,-2000,'r330','Guktan'),(null,1010,-2000,'r522','Drakkin'),(null,1013,-2000,'r330','Guktan'),(null,1013,-2000,'r522','Drakkin'),(null,1016,-800,'r330','Guktan'),(null,1016,-800,'r522','Drakkin'),(null,1024,-2000,'r330','Guktan'),(null,1024,-2000,'r522','Drakkin'),(null,1025,-2000,'r330','Guktan'),(null,1025,-2000,'r522','Drakkin'),(null,1026,-2000,'r330','Guktan'),(null,1026,-2000,'r522','Drakkin'),(null,1027,-2000,'r330','Guktan'),(null,1027,-2000,'r522','Drakkin'),(null,1028,-2000,'r330','Guktan'),(null,1028,-2000,'r522','Drakkin'),(null,1029,-2000,'r330','Guktan'),(null,1029,-2000,'r522','Drakkin'),(null,1030,-2000,'r330','Guktan'),(null,1030,-2000,'r522','Drakkin'),(null,1031,-2000,'r330','Guktan'),(null,1031,-2000,'r522','Drakkin'),(null,1032,-2000,'r330','Guktan'),(null,1032,-2000,'r522','Drakkin'),(null,1033,-2000,'r330','Guktan'),(null,1033,-2000,'r522','Drakkin'),(null,1034,-2000,'r330','Guktan'),(null,1034,-2000,'r522','Drakkin'),(null,1035,-2000,'r330','Guktan'),(null,1035,-2000,'r522','Drakkin'),(null,1049,-2000,'r330','Guktan'),(null,1049,-2000,'r522','Drakkin'),(null,1051,-2000,'r330','Guktan'),(null,1051,-2000,'r522','Drakkin'),(null,1052,-2000,'r330','Guktan'),(null,1052,-2000,'r522','Drakkin'),(null,1053,-2000,'r330','Guktan'),(null,1053,-2000,'r522','Drakkin'),(null,1054,-2000,'r330','Guktan'),(null,1054,-2000,'r522','Drakkin'),(null,1055,-500,'r330','Guktan'),(null,1055,-500,'r522','Drakkin'),(null,1056,-2000,'r330','Guktan'),(null,1056,-2000,'r522','Drakkin'),(null,1058,-2000,'r330','Guktan'),(null,1058,-2000,'r522','Drakkin'),(null,1059,-1000,'r330','Guktan'),(null,1059,-1000,'r522','Drakkin'),(null,1062,-500,'r330','Guktan'),(null,1062,-500,'r522','Drakkin'),(null,1066,-1000,'r330','Guktan'),(null,1066,-1000,'r522','Drakkin'),(null,1068,-1000,'r330','Guktan'),(null,1068,-1000,'r522','Drakkin'),(null,1069,-1000,'r330','Guktan'),(null,1069,-1000,'r522','Drakkin'),(null,1070,-1000,'r330','Guktan'),(null,1070,-1000,'r522','Drakkin'),(null,1071,-1000,'r330','Guktan'),(null,1071,-1000,'r522','Drakkin'),(null,1072,-1000,'r330','Guktan'),(null,1072,-1000,'r522','Drakkin'),(null,1073,-1000,'r330','Guktan'),(null,1073,-1000,'r522','Drakkin'),(null,1074,-1000,'r330','Guktan'),(null,1074,-1000,'r522','Drakkin'),(null,1075,-1000,'r330','Guktan'),(null,1075,-1000,'r522','Drakkin'),(null,1076,-1000,'r330','Guktan'),(null,1076,-1000,'r522','Drakkin'),(null,1077,-1000,'r330','Guktan'),(null,1077,-1000,'r522','Drakkin'),(null,1078,-1000,'r330','Guktan'),(null,1078,-1000,'r522','Drakkin'),(null,1079,-1000,'r330','Guktan'),(null,1079,-1000,'r522','Drakkin'),(null,1080,-1000,'r330','Guktan'),(null,1080,-1000,'r522','Drakkin'),(null,1086,-2000,'r330','Guktan'),(null,1086,-2000,'r522','Drakkin'),(null,1088,-1000,'r330','Guktan'),(null,1088,-1000,'r522','Drakkin'),(null,1089,-1000,'r330','Guktan'),(null,1089,-1000,'r522','Drakkin'),(null,1090,-1000,'r330','Guktan'),(null,1090,-1000,'r522','Drakkin'),(null,1091,-1000,'r330','Guktan'),(null,1091,-1000,'r522','Drakkin'),(null,1092,-1000,'r330','Guktan'),(null,1092,-1000,'r522','Drakkin'),(null,1093,-1000,'r330','Guktan'),(null,1093,-1000,'r522','Drakkin'),(null,1094,-1000,'r330','Guktan'),(null,1094,-1000,'r522','Drakkin'),(null,1100,-1000,'r330','Guktan'),(null,1100,-1000,'r522','Drakkin'),(null,1101,-1000,'r330','Guktan'),(null,1101,-1000,'r522','Drakkin'),(null,1103,-1000,'r330','Guktan'),(null,1103,-1000,'r522','Drakkin'),(null,1104,-500,'r330','Guktan'),(null,1104,-500,'r522','Drakkin'),(null,1105,-200,'r330','Guktan'),(null,1105,-200,'r522','Drakkin'),(null,1107,-700,'r330','Guktan'),(null,1107,-700,'r522','Drakkin'),(null,1111,-1000,'r330','Guktan'),(null,1111,-1000,'r522','Drakkin'),(null,1112,-1000,'r330','Guktan'),(null,1112,-1000,'r522','Drakkin'),(null,1113,-1000,'r330','Guktan'),(null,1113,-1000,'r522','Drakkin'),(null,1114,-1000,'r330','Guktan'),(null,1114,-1000,'r522','Drakkin'),(null,1115,-1000,'r330','Guktan'),(null,1115,-1000,'r522','Drakkin'),(null,1120,-1000,'r330','Guktan'),(null,1120,-1000,'r522','Drakkin'),(null,1121,-1000,'r330','Guktan'),(null,1121,-1000,'r522','Drakkin'),(null,1123,-100,'r330','Guktan'),(null,1123,-100,'r522','Drakkin'),(null,1124,-1000,'r330','Guktan'),(null,1124,-1000,'r522','Drakkin'),(null,1125,-1000,'r330','Guktan'),(null,1125,-1000,'r522','Drakkin'),(null,1134,-50,'r330','Guktan'),(null,1134,-50,'r522','Drakkin'),(null,1135,-150,'r330','Guktan'),(null,1135,-150,'r522','Drakkin'),(null,1137,100,'r522','Drakkin'),(null,1140,-1000,'r330','Guktan'),(null,1140,-1000,'r522','Drakkin'),(null,1141,-1000,'r330','Guktan'),(null,1141,-1000,'r522','Drakkin'),(null,1142,-1000,'r330','Guktan'),(null,1142,-1000,'r522','Drakkin'),(null,1143,-500,'r330','Guktan'),(null,1143,-500,'r522','Drakkin'),(null,1144,-250,'r330','Guktan'),(null,1144,-250,'r522','Drakkin'),(null,1145,-500,'r330','Guktan'),(null,1145,-500,'r522','Drakkin'),(null,1146,-800,'r330','Guktan'),(null,1146,-800,'r522','Drakkin'),(null,1147,-800,'r330','Guktan'),(null,1147,-800,'r522','Drakkin'),(null,1148,-800,'r330','Guktan'),(null,1148,-800,'r522','Drakkin'),(null,1149,-800,'r330','Guktan'),(null,1149,-800,'r522','Drakkin'),(null,1166,-1000,'r330','Guktan'),(null,1166,-1000,'r522','Drakkin'),(null,1169,-100,'r330','Guktan'),(null,1169,-100,'r522','Drakkin'),(null,1170,-100,'r330','Guktan'),(null,1170,-100,'r522','Drakkin'),(null,1175,-1000,'r330','Guktan'),(null,1175,-1000,'r522','Drakkin'),(null,1176,-1000,'r330','Guktan'),(null,1176,-1000,'r522','Drakkin'),(null,1181,-1000,'r330','Guktan'),(null,1181,-1000,'r522','Drakkin'),(null,1182,-1000,'r330','Guktan'),(null,1182,-1000,'r522','Drakkin'),(null,1183,-500,'r330','Guktan'),(null,1183,-500,'r522','Drakkin'),(null,1184,-500,'r330','Guktan'),(null,1184,-500,'r522','Drakkin'),(null,1185,-500,'r330','Guktan'),(null,1185,-500,'r522','Drakkin'),(null,1186,-1000,'r330','Guktan'),(null,1186,-1000,'r522','Drakkin'),(null,1188,-500,'r330','Guktan'),(null,1188,-500,'r522','Drakkin'),(null,1189,-500,'r330','Guktan'),(null,1189,-500,'r522','Drakkin'),(null,1190,-500,'r330','Guktan'),(null,1190,-500,'r522','Drakkin'),(null,1191,-500,'r330','Guktan'),(null,1191,-500,'r522','Drakkin'),(null,1192,-1000,'r330','Guktan'),(null,1192,-1000,'r522','Drakkin'),(null,1193,-1000,'r330','Guktan'),(null,1193,-1000,'r522','Drakkin'),(null,1194,-1000,'r330','Guktan'),(null,1194,-1000,'r522','Drakkin'),(null,1195,-1000,'r330','Guktan'),(null,1195,-1000,'r522','Drakkin'),(null,1196,-1000,'r330','Guktan'),(null,1196,-1000,'r522','Drakkin'),(null,1197,-1000,'r330','Guktan'),(null,1197,-1000,'r522','Drakkin'),(null,1198,-1000,'r330','Guktan'),(null,1198,-1000,'r522','Drakkin'),(null,1199,-100,'r330','Guktan'),(null,1199,-100,'r522','Drakkin'),(null,1200,-100,'r330','Guktan'),(null,1200,-100,'r522','Drakkin'),(null,1201,-1000,'r330','Guktan'),(null,1201,-1000,'r522','Drakkin'),(null,1202,-1000,'r330','Guktan'),(null,1202,-1000,'r522','Drakkin'),(null,1203,-300,'r330','Guktan'),(null,1203,-300,'r522','Drakkin'),(null,1204,-300,'r330','Guktan'),(null,1204,-300,'r522','Drakkin'),(null,1205,-300,'r330','Guktan'),(null,1205,-300,'r522','Drakkin'),(null,1209,-500,'r330','Guktan'),(null,1209,-500,'r522','Drakkin'),(null,1210,-1000,'r330','Guktan'),(null,1210,-1000,'r522','Drakkin'),(null,1211,100,'r330','Guktan'),(null,1211,100,'r522','Drakkin'),(null,1212,-100,'r330','Guktan'),(null,1212,-100,'r522','Drakkin'),(null,1213,-1000,'r330','Guktan'),(null,1213,-1000,'r522','Drakkin'),(null,1216,-1000,'r330','Guktan'),(null,1216,-1000,'r522','Drakkin'),(null,1220,-1000,'r330','Guktan'),(null,1220,-1000,'r522','Drakkin'),(null,1222,-500,'r330','Guktan'),(null,1222,-500,'r522','Drakkin'),(null,1223,-500,'r330','Guktan'),(null,1223,-500,'r522','Drakkin'),(null,1224,-500,'r330','Guktan'),(null,1224,-500,'r522','Drakkin'),(null,1225,-500,'r330','Guktan'),(null,1225,-500,'r522','Drakkin'),(null,1226,-500,'r330','Guktan'),(null,1226,-500,'r522','Drakkin'),(null,1227,-500,'r330','Guktan'),(null,1227,-500,'r522','Drakkin'),(null,1229,-1000,'r330','Guktan'),(null,1229,-1000,'r522','Drakkin'),(null,1230,-1000,'r330','Guktan'),(null,1230,-1000,'r522','Drakkin'),(null,1232,1,'r330','Guktan'),(null,1232,1,'r522','Drakkin'),(null,1233,-1000,'r330','Guktan'),(null,1233,-1000,'r522','Drakkin'),(null,1234,1,'r330','Guktan'),(null,1234,1,'r522','Drakkin'),(null,1235,-2000,'r330','Guktan'),(null,1235,-2000,'r522','Drakkin'),(null,1237,-2000,'r330','Guktan'),(null,1237,-2000,'r522','Drakkin'),(null,1238,-100,'r330','Guktan'),(null,1238,-100,'r522','Drakkin'),(null,1241,-750,'r330','Guktan'),(null,1241,-750,'r522','Drakkin'),(null,1242,-500,'r330','Guktan'),(null,1242,-500,'r522','Drakkin'),(null,1243,-2000,'r330','Guktan'),(null,1243,-2000,'r522','Drakkin'),(null,1244,-50,'r330','Guktan'),(null,1244,-50,'r522','Drakkin'),(null,1483,-1000,'r330','Guktan'),(null,1483,-1000,'r522','Drakkin'),(null,1485,-400,'r330','Guktan'),(null,1485,-400,'r522','Drakkin'),(null,1486,-250,'r330','Guktan'),(null,1486,-250,'r522','Drakkin'),(null,1490,-1000,'r330','Guktan'),(null,1490,-1000,'r522','Drakkin'),(null,1491,-1000,'r330','Guktan'),(null,1491,-1000,'r522','Drakkin'),(null,1500,-250,'r330','Guktan'),(null,1500,-250,'r522','Drakkin'),(null,1501,-550,'r330','Guktan'),(null,1501,-550,'r522','Drakkin'),(null,1508,-50,'r330','Guktan'),(null,1508,-50,'r522','Drakkin'),(null,1509,-50,'r330','Guktan'),(null,1509,-50,'r522','Drakkin'),(null,1510,-99,'r330','Guktan'),(null,1510,-99,'r522','Drakkin'),(null,1511,-200,'r330','Guktan'),(null,1511,-200,'r522','Drakkin'),(null,1512,-200,'r330','Guktan'),(null,1512,-200,'r522','Drakkin'),(null,1516,-1000,'r330','Guktan'),(null,1516,-1000,'r522','Drakkin'),(null,1519,-1000,'r330','Guktan'),(null,1519,-1000,'r522','Drakkin'),(null,1520,-100,'r330','Guktan'),(null,1520,-100,'r522','Drakkin'),(null,1521,-2000,'r330','Guktan'),(null,1521,-2000,'r522','Drakkin'),(null,1522,-50,'r330','Guktan'),(null,1522,-50,'r522','Drakkin'),(null,1527,-1000,'r330','Guktan'),(null,1527,-1000,'r522','Drakkin'),(null,1528,-1000,'r330','Guktan'),(null,1528,-1000,'r522','Drakkin'),(null,1535,-1000,'r330','Guktan'),(null,1535,-1000,'r522','Drakkin'),(null,1537,-1,'r330','Guktan'),(null,1537,-1,'r522','Drakkin'),(null,1542,-350,'r330','Guktan'),(null,1542,-350,'r522','Drakkin'),(null,1547,-250,'r330','Guktan'),(null,1547,-250,'r522','Drakkin'),(null,1555,-550,'r330','Guktan'),(null,1555,-550,'r522','Drakkin'),(null,1556,-400,'r330','Guktan'),(null,1556,-400,'r522','Drakkin'),(null,1562,-1000,'r330','Guktan'),(null,1562,-1000,'r522','Drakkin'),(null,1563,-99,'r330','Guktan'),(null,1563,-99,'r522','Drakkin'),(null,1564,-1000,'r330','Guktan'),(null,1564,-1000,'r522','Drakkin'),(null,1565,-99,'r330','Guktan'),(null,1565,-99,'r522','Drakkin'),(null,1568,-1000,'r330','Guktan'),(null,1568,-1000,'r522','Drakkin'),(null,1570,-800,'r330','Guktan'),(null,1570,-800,'r522','Drakkin'),(null,1571,-1000,'r330','Guktan'),(null,1571,-1000,'r522','Drakkin'),(null,1573,-250,'r330','Guktan'),(null,1573,-250,'r522','Drakkin'),(null,1574,-800,'r330','Guktan'),(null,1574,-800,'r522','Drakkin'),(null,1583,-800,'r330','Guktan'),(null,1583,-800,'r522','Drakkin'),(null,1587,-1000,'r330','Guktan'),(null,1587,-1000,'r522','Drakkin'),(null,1598,-50,'r330','Guktan'),(null,1598,-50,'r522','Drakkin'),(null,1599,-1000,'r330','Guktan'),(null,1599,-1000,'r522','Drakkin'),(null,1600,-1000,'r330','Guktan'),(null,1600,-1000,'r522','Drakkin'),(null,1601,-475,'r330','Guktan'),(null,1601,-475,'r522','Drakkin'),(null,1603,-75,'r330','Guktan'),(null,1603,-75,'r522','Drakkin'),(null,1605,50,'r330','Guktan'),(null,1605,50,'r522','Drakkin'),(null,1607,-1000,'r330','Guktan'),(null,1607,-1000,'r522','Drakkin'),(null,1610,-1000,'r330','Guktan'),(null,1610,-1000,'r522','Drakkin'),(null,1611,-1000,'r330','Guktan'),(null,1611,-1000,'r522','Drakkin'),(null,1612,-1000,'r330','Guktan'),(null,1612,-1000,'r522','Drakkin'),(null,1613,-1000,'r330','Guktan'),(null,1613,-1000,'r522','Drakkin'),(null,1618,-1000,'r330','Guktan'),(null,1618,-1000,'r522','Drakkin'),(null,1620,-250,'r330','Guktan'),(null,1620,-250,'r522','Drakkin'),(null,1621,-1000,'r330','Guktan'),(null,1621,-1000,'r522','Drakkin'),(null,1622,-480,'r330','Guktan'),(null,1622,-480,'r522','Drakkin'),(null,1623,-1000,'r330','Guktan'),(null,1623,-1000,'r522','Drakkin'),(null,1624,-1000,'r330','Guktan'),(null,1624,-1000,'r522','Drakkin'),(null,1627,-95,'r330','Guktan'),(null,1627,-95,'r522','Drakkin'),(null,1628,-700,'r330','Guktan'),(null,1628,-700,'r522','Drakkin'),(null,1629,-1000,'r330','Guktan'),(null,1629,-1000,'r522','Drakkin'),(null,1633,-1000,'r330','Guktan'),(null,1633,-1000,'r522','Drakkin'),(null,1643,-1000,'r330','Guktan'),(null,1643,-1000,'r522','Drakkin'),(null,1659,-1000,'r330','Guktan'),(null,1659,-1000,'r522','Drakkin'),(null,1660,-1000,'r330','Guktan'),(null,1660,-1000,'r522','Drakkin'),(null,1665,-1000,'r330','Guktan'),(null,1665,-1000,'r522','Drakkin'),(null,1671,-400,'r330','Guktan'),(null,1671,-400,'r522','Drakkin'),(null,1674,-1000,'r330','Guktan'),(null,1674,-1000,'r522','Drakkin'),(null,1675,-1000,'r330','Guktan'),(null,1675,-1000,'r522','Drakkin'),(null,1676,-1000,'r330','Guktan'),(null,1676,-1000,'r522','Drakkin'),(null,1677,-100,'r330','Guktan'),(null,1677,-100,'r522','Drakkin'),(null,1679,-100,'r330','Guktan'),(null,1679,-100,'r522','Drakkin'),(null,1680,-300,'r330','Guktan'),(null,1680,-300,'r522','Drakkin'),(null,1681,-300,'r330','Guktan'),(null,1681,-300,'r522','Drakkin'),(null,1701,-1000,'r330','Guktan'),(null,1701,-1000,'r522','Drakkin'),(null,1703,-1000,'r330','Guktan'),(null,1703,-1000,'r522','Drakkin'),(null,1716,100,'r330','Guktan'),(null,1717,100,'r330','Guktan'),(null,1718,100,'r330','Guktan'),(null,1720,100,'r330','Guktan'),(null,1722,-1000,'r330','Guktan'),(null,1722,-1000,'r522','Drakkin'),(null,1728,-1000,'r330','Guktan'),(null,1728,-1000,'r522','Drakkin'),(null,1729,-1000,'r330','Guktan'),(null,1729,-1000,'r522','Drakkin'),(null,1732,-1000,'r330','Guktan'),(null,1732,-1000,'r522','Drakkin'),(null,1733,-1000,'r330','Guktan'),(null,1733,-1000,'r522','Drakkin'),(null,1734,-1000,'r330','Guktan'),(null,1734,-1000,'r522','Drakkin'),(null,1735,-1000,'r330','Guktan'),(null,1735,-1000,'r522','Drakkin'),(null,1736,-1000,'r330','Guktan'),(null,1736,-1000,'r522','Drakkin'),(null,1737,-1000,'r330','Guktan'),(null,1737,-1000,'r522','Drakkin'),(null,1738,-1000,'r330','Guktan'),(null,1738,-1000,'r522','Drakkin'),(null,1741,-1000,'r330','Guktan'),(null,1741,-1000,'r522','Drakkin'),(null,1742,-1000,'r330','Guktan'),(null,1742,-1000,'r522','Drakkin'),(null,1743,-1000,'r330','Guktan'),(null,1743,-1000,'r522','Drakkin'),(null,1744,-1000,'r330','Guktan'),(null,1744,-1000,'r522','Drakkin'),(null,1745,-1000,'r330','Guktan'),(null,1745,-1000,'r522','Drakkin'),(null,1746,-1000,'r330','Guktan'),(null,1746,-1000,'r522','Drakkin'),(null,1747,-1000,'r330','Guktan'),(null,1747,-1000,'r522','Drakkin'),(null,1748,-1000,'r330','Guktan'),(null,1748,-1000,'r522','Drakkin'),(null,1749,-1000,'r330','Guktan'),(null,1749,-1000,'r522','Drakkin'),(null,1750,-1000,'r330','Guktan'),(null,1750,-1000,'r522','Drakkin'),(null,1755,-1000,'r330','Guktan'),(null,1755,-1000,'r522','Drakkin'),(null,1758,100,'r330','Guktan'),(null,1758,100,'r522','Drakkin'),(null,1759,-100,'r330','Guktan'),(null,1759,-100,'r522','Drakkin'),(null,1761,-100,'r330','Guktan'),(null,1761,-100,'r522','Drakkin'),(null,1762,-1000,'r330','Guktan'),(null,1762,-1000,'r522','Drakkin'),(null,1763,-1001,'r330','Guktan'),(null,1763,-1001,'r522','Drakkin'),(null,1764,-1000,'r330','Guktan'),(null,1764,-1000,'r522','Drakkin'),(null,1765,-1000,'r330','Guktan'),(null,1765,-1000,'r522','Drakkin'),(null,1766,-1000,'r330','Guktan'),(null,1766,-1000,'r522','Drakkin'),(null,1767,-1000,'r330','Guktan'),(null,1767,-1000,'r522','Drakkin'),(null,1768,-1000,'r330','Guktan'),(null,1768,-1000,'r522','Drakkin'),(null,1770,-400,'r330','Guktan'),(null,1770,-400,'r522','Drakkin'),(null,1771,-750,'r330','Guktan'),(null,1771,-750,'r522','Drakkin'),(null,1775,50,'r330','Guktan'),(null,1775,50,'r522','Drakkin'),(null,1777,-2000,'r330','Guktan'),(null,1777,-2000,'r522','Drakkin'),(null,1778,10,'r330','Guktan'),(null,1778,10,'r522','Drakkin'),(null,1779,30,'r330','Guktan'),(null,1779,30,'r522','Drakkin'),(null,1780,90,'r330','Guktan'),(null,1780,90,'r522','Drakkin'),(null,1781,90,'r330','Guktan'),(null,1781,90,'r522','Drakkin'),(null,1783,10,'r330','Guktan'),(null,1783,10,'r522','Drakkin'),(null,1784,-1000,'r330','Guktan'),(null,1784,-1000,'r522','Drakkin'),(null,1785,90,'r330','Guktan'),(null,1785,90,'r522','Drakkin'),(null,1786,10,'r330','Guktan'),(null,1786,10,'r522','Drakkin'),(null,1787,-2000,'r330','Guktan'),(null,1787,-2000,'r522','Drakkin'),(null,1788,-2000,'r330','Guktan'),(null,1788,-2000,'r522','Drakkin'),(null,1789,-110,'r330','Guktan'),(null,1789,-110,'r522','Drakkin'),(null,1790,-1000,'r330','Guktan'),(null,1790,-1000,'r522','Drakkin'),(null,1791,-110,'r330','Guktan'),(null,1791,-110,'r522','Drakkin'),(null,1792,-1000,'r330','Guktan'),(null,1792,-1000,'r522','Drakkin'),(null,1793,-110,'r330','Guktan'),(null,1793,-110,'r522','Drakkin'),(null,1794,-1000,'r330','Guktan'),(null,1794,-1000,'r522','Drakkin'),(null,1795,-110,'r330','Guktan'),(null,1795,-110,'r522','Drakkin'),(null,1796,-1000,'r330','Guktan'),(null,1796,-1000,'r522','Drakkin'),(null,1798,-110,'r330','Guktan'),(null,1798,-110,'r522','Drakkin'),(null,1799,-1000,'r330','Guktan'),(null,1799,-1000,'r522','Drakkin'),(null,1801,0,'r330','Guktan'),(null,1801,0,'r522','Drakkin'),(null,1802,-1000,'r330','Guktan'),(null,1802,-1000,'r522','Drakkin'),(null,1817,-500,'r330','Guktan'),(null,1817,-500,'r522','Drakkin'),(null,1818,-1000,'r330','Guktan'),(null,1818,-1000,'r522','Drakkin'),(null,1819,-100,'r330','Guktan'),(null,1819,-100,'r522','Drakkin'),(null,1820,100,'r330','Guktan'),(null,1820,100,'r522','Drakkin'),(null,1821,-101,'r330','Guktan'),(null,1821,-101,'r522','Drakkin'),(null,1823,-1000,'r330','Guktan'),(null,1823,-1000,'r522','Drakkin'),(null,1824,-1000,'r330','Guktan'),(null,1824,-1000,'r522','Drakkin'),(null,1828,-1000,'r330','Guktan'),(null,1828,-1000,'r522','Drakkin'),(null,1829,-1000,'r330','Guktan'),(null,1829,-1000,'r522','Drakkin'),(null,1830,-800,'r330','Guktan'),(null,1830,-800,'r522','Drakkin'),(null,1831,-800,'r330','Guktan'),(null,1831,-800,'r522','Drakkin'),(null,1846,-2000,'r330','Guktan'),(null,1846,-2000,'r522','Drakkin'),(null,1847,-2000,'r330','Guktan'),(null,1847,-2000,'r522','Drakkin'),(null,1852,-2000,'r330','Guktan'),(null,1852,-2000,'r522','Drakkin'),(null,1853,-1000,'r330','Guktan'),(null,1853,-1000,'r522','Drakkin'),(null,1854,-1000,'r330','Guktan'),(null,1854,-1000,'r522','Drakkin'),(null,1855,-800,'r330','Guktan'),(null,1855,-800,'r522','Drakkin'),(null,1856,-75,'r330','Guktan'),(null,1856,-75,'r522','Drakkin'),(null,1857,-1000,'r330','Guktan'),(null,1857,-1000,'r522','Drakkin'),(null,1858,-1000,'r330','Guktan'),(null,1858,-1000,'r522','Drakkin'),(null,1859,250,'r330','Guktan'),(null,1859,-250,'r522','Drakkin'),(null,1860,-250,'r330','Guktan'),(null,1860,250,'r522','Drakkin'),(null,1862,-75,'r330','Guktan'),(null,1862,-75,'r522','Drakkin'),(null,1863,-600,'r330','Guktan'),(null,1863,-600,'r522','Drakkin'),(null,1864,-600,'r330','Guktan'),(null,1864,-600,'r522','Drakkin'),(null,1865,-600,'r330','Guktan'),(null,1865,-600,'r522','Drakkin'),(null,1866,-600,'r330','Guktan'),(null,1866,-600,'r522','Drakkin'),(null,1867,1,'r330','Guktan'),(null,1867,1,'r522','Drakkin'),(null,1868,1,'r330','Guktan'),(null,1868,1,'r522','Drakkin'),(null,1869,1,'r330','Guktan'),(null,1869,1,'r522','Drakkin'),(null,1870,1,'r330','Guktan'),(null,1870,1,'r522','Drakkin'),(null,1872,1,'r330','Guktan'),(null,1872,1,'r522','Drakkin'); +/*!40000 ALTER TABLE `faction_list_mod` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2020-05-25 16:13:42 diff --git a/utils/sql/git/required/2020_03_09_convert_myisam_to_innodb.sql b/utils/sql/git/required/2020_03_09_convert_myisam_to_innodb.sql index ec9f6607b..31ccf1094 100644 --- a/utils/sql/git/required/2020_03_09_convert_myisam_to_innodb.sql +++ b/utils/sql/git/required/2020_03_09_convert_myisam_to_innodb.sql @@ -1,7 +1,3 @@ -ALTER TABLE `aa_actions` ENGINE=InnoDB; -ALTER TABLE `aa_effects` ENGINE=InnoDB; -ALTER TABLE `aa_required_level_cost` ENGINE=InnoDB; -ALTER TABLE `aa_timers` ENGINE=InnoDB; ALTER TABLE `account_flags` ENGINE=InnoDB; ALTER TABLE `account_ip` ENGINE=InnoDB; ALTER TABLE `account` ENGINE=InnoDB; diff --git a/utils/sql/git/required/2020_04_11_expansions_content_filters.sql b/utils/sql/git/required/2020_04_11_expansions_content_filters.sql new file mode 100644 index 000000000..3c3171ff2 --- /dev/null +++ b/utils/sql/git/required/2020_04_11_expansions_content_filters.sql @@ -0,0 +1,104 @@ +-- zone +ALTER TABLE `zone` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `zone` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `zone` ADD `content_flags` varchar(100) NULL; + +-- doors +ALTER TABLE `doors` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `doors` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `doors` ADD `content_flags` varchar(100) NULL; + +-- object +ALTER TABLE `object` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `object` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `object` ADD `content_flags` varchar(100) NULL; + +-- spawn2 +ALTER TABLE `spawn2` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `spawn2` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `spawn2` ADD `content_flags` varchar(100) NULL; + +-- tradeskill_recipe +ALTER TABLE `tradeskill_recipe` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `tradeskill_recipe` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `tradeskill_recipe` ADD `content_flags` varchar(100) NULL; + +-- merchantlist +ALTER TABLE `merchantlist` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `merchantlist` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `merchantlist` ADD `content_flags` varchar(100) NULL; + +-- global_loot +ALTER TABLE `global_loot` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `global_loot` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `global_loot` ADD `content_flags` varchar(100) NULL; + +-- fishing +ALTER TABLE `fishing` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `fishing` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `fishing` ADD `content_flags` varchar(100) NULL; + +-- forage +ALTER TABLE `forage` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `forage` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `forage` ADD `content_flags` varchar(100) NULL; + +-- ground_spawns +ALTER TABLE `ground_spawns` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `ground_spawns` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `ground_spawns` ADD `content_flags` varchar(100) NULL; + +-- loottable +ALTER TABLE `loottable` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `loottable` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `loottable` ADD `content_flags` varchar(100) NULL; + +-- lootdrop +ALTER TABLE `lootdrop` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `lootdrop` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `lootdrop` ADD `content_flags` varchar(100) NULL; + +-- starting_items +ALTER TABLE `starting_items` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `starting_items` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `starting_items` ADD `content_flags` varchar(100) NULL; + +-- start_zones +ALTER TABLE `start_zones` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `start_zones` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `start_zones` ADD `content_flags` varchar(100) NULL; + +-- traps +ALTER TABLE `traps` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `traps` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `traps` ADD `content_flags` varchar(100) NULL; + +-- zone_points +ALTER TABLE `zone_points` ADD `min_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `zone_points` ADD `max_expansion` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `zone_points` ADD `content_flags` varchar(100) NULL; + +-- pok books +update doors set min_expansion = 4 where name like '%POKTELE%'; + +-- content flags +CREATE TABLE `content_flags` (`id` int AUTO_INCREMENT,`flag_name` varchar(75),`enabled` tinyint,`notes` text, PRIMARY KEY (id)); + +-- content flags disabled + +ALTER TABLE `doors` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `fishing` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `forage` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `global_loot` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `ground_spawns` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `lootdrop` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `loottable` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `merchantlist` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `object` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `spawn2` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `start_zones` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `starting_items` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `tradeskill_recipe` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `traps` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `zone` ADD `content_flags_disabled` varchar(100) NULL; +ALTER TABLE `zone_points` ADD `content_flags_disabled` varchar(100) NULL; \ No newline at end of file diff --git a/utils/sql/git/required/2020_05_09_items_subtype.sql b/utils/sql/git/required/2020_05_09_items_subtype.sql new file mode 100644 index 000000000..43b38d14f --- /dev/null +++ b/utils/sql/git/required/2020_05_09_items_subtype.sql @@ -0,0 +1 @@ +ALTER TABLE `items` CHANGE `UNK219` `subtype` int(11) not null default '0'; diff --git a/utils/sql/git/required/2020_08_15_lootdrop_level_filtering.sql b/utils/sql/git/required/2020_08_15_lootdrop_level_filtering.sql new file mode 100644 index 000000000..00084a59f --- /dev/null +++ b/utils/sql/git/required/2020_08_15_lootdrop_level_filtering.sql @@ -0,0 +1,7 @@ +ALTER TABLE `lootdrop_entries` CHANGE `minlevel` `trivial_min_level` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT ''; +ALTER TABLE `lootdrop_entries` CHANGE `maxlevel` `trivial_max_level` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT ''; +ALTER TABLE `lootdrop_entries` ADD COLUMN `npc_min_level` smallint unsigned NOT NULL DEFAULT '0' COMMENT ''; +ALTER TABLE `lootdrop_entries` ADD COLUMN `npc_max_level` smallint unsigned NOT NULL DEFAULT '0' COMMENT ''; +ALTER TABLE `lootdrop_entries` CHANGE `trivial_min_level` `trivial_min_level` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT ''; +ALTER TABLE `lootdrop_entries` CHANGE `trivial_max_level` `trivial_max_level` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT ''; +UPDATE `lootdrop_entries` SET `trivial_max_level` = 0 WHERE `trivial_max_level` = 127; \ No newline at end of file diff --git a/utils/sql/git/required/2020_08_16_virtual_zonepoints.sql b/utils/sql/git/required/2020_08_16_virtual_zonepoints.sql new file mode 100644 index 000000000..3fb21cd0a --- /dev/null +++ b/utils/sql/git/required/2020_08_16_virtual_zonepoints.sql @@ -0,0 +1,3 @@ +ALTER TABLE `zone_points` ADD COLUMN `is_virtual` tinyint NOT NULL DEFAULT '0' COMMENT '' AFTER `content_flags_disabled`; +ALTER TABLE `zone_points` ADD COLUMN `height` int NOT NULL DEFAULT '0' COMMENT ''; +ALTER TABLE `zone_points` ADD COLUMN `width` int NOT NULL DEFAULT '0' COMMENT ''; \ No newline at end of file diff --git a/utils/sql/git/required/2020_09_02_pet_taunting.sql b/utils/sql/git/required/2020_09_02_pet_taunting.sql new file mode 100644 index 000000000..f4de1138f --- /dev/null +++ b/utils/sql/git/required/2020_09_02_pet_taunting.sql @@ -0,0 +1 @@ +ALTER TABLE `character_pet_info` ADD COLUMN `taunting` tinyint(1) NOT NULL DEFAULT '1' COMMENT ''; diff --git a/utils/sql/git/required/2020_12_09_underworld.sql b/utils/sql/git/required/2020_12_09_underworld.sql new file mode 100644 index 000000000..f2f2ba032 --- /dev/null +++ b/utils/sql/git/required/2020_12_09_underworld.sql @@ -0,0 +1,6 @@ +ALTER TABLE `zone` ADD COLUMN `underworld_teleport_index` INT(4) NOT NULL DEFAULT '0'; +UPDATE `zone` SET `underworld` = '-2030' WHERE `zoneidnumber` = '71'; +UPDATE `zone` SET `underworld_teleport_index` = '11' WHERE `zoneidnumber` = '71'; +UPDATE `zone` SET `underworld_teleport_index` = '-1' WHERE `zoneidnumber` = '75'; +UPDATE `zone` SET `underworld_teleport_index` = '-1' WHERE `zoneidnumber` = '150'; + diff --git a/utils/sql/git/required/2020_12_22_expedition_system.sql b/utils/sql/git/required/2020_12_22_expedition_system.sql new file mode 100644 index 000000000..820940500 --- /dev/null +++ b/utils/sql/git/required/2020_12_22_expedition_system.sql @@ -0,0 +1,82 @@ +CREATE TABLE `expeditions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `uuid` VARCHAR(36) NOT NULL, + `dynamic_zone_id` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `expedition_name` VARCHAR(128) NOT NULL, + `leader_id` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `min_players` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + `max_players` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + `add_replay_on_join` TINYINT(3) UNSIGNED NOT NULL DEFAULT 1, + `is_locked` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE INDEX `dynamic_zone_id` (`dynamic_zone_id`) +) +COLLATE='latin1_swedish_ci' +ENGINE=InnoDB +; + +CREATE TABLE `expedition_lockouts` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `expedition_id` INT(10) UNSIGNED NOT NULL, + `event_name` VARCHAR(256) NOT NULL, + `expire_time` DATETIME NOT NULL DEFAULT current_timestamp(), + `duration` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `from_expedition_uuid` VARCHAR(36) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `expedition_id_event_name` (`expedition_id`, `event_name`) +) +COLLATE='latin1_swedish_ci' +ENGINE=InnoDB +; + +CREATE TABLE `expedition_members` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `expedition_id` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `character_id` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `is_current_member` TINYINT(3) UNSIGNED NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + UNIQUE INDEX `expedition_id_character_id` (`expedition_id`, `character_id`) +) +COLLATE='latin1_swedish_ci' +ENGINE=InnoDB +; + +CREATE TABLE `character_expedition_lockouts` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `character_id` INT(10) UNSIGNED NOT NULL, + `expedition_name` VARCHAR(128) NOT NULL, + `event_name` VARCHAR(256) NOT NULL, + `expire_time` DATETIME NOT NULL DEFAULT current_timestamp(), + `duration` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `from_expedition_uuid` VARCHAR(36) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `character_id_expedition_name_event_name` (`character_id`, `expedition_name`, `event_name`) +) +COLLATE='latin1_swedish_ci' +ENGINE=InnoDB +; + +CREATE TABLE `dynamic_zones` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `instance_id` INT(10) NOT NULL DEFAULT 0, + `type` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + `compass_zone_id` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `compass_x` FLOAT NOT NULL DEFAULT 0, + `compass_y` FLOAT NOT NULL DEFAULT 0, + `compass_z` FLOAT NOT NULL DEFAULT 0, + `safe_return_zone_id` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `safe_return_x` FLOAT NOT NULL DEFAULT 0, + `safe_return_y` FLOAT NOT NULL DEFAULT 0, + `safe_return_z` FLOAT NOT NULL DEFAULT 0, + `safe_return_heading` FLOAT NOT NULL DEFAULT 0, + `zone_in_x` FLOAT NOT NULL DEFAULT 0, + `zone_in_y` FLOAT NOT NULL DEFAULT 0, + `zone_in_z` FLOAT NOT NULL DEFAULT 0, + `zone_in_heading` FLOAT NOT NULL DEFAULT 0, + `has_zone_in` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE INDEX `instance_id` (`instance_id`) +) +COLLATE='utf8mb4_general_ci' +ENGINE=InnoDB +; diff --git a/utils/sql/git/required/2021_02_14_npc_exp_mod.sql b/utils/sql/git/required/2021_02_14_npc_exp_mod.sql new file mode 100644 index 000000000..8cd8372e2 --- /dev/null +++ b/utils/sql/git/required/2021_02_14_npc_exp_mod.sql @@ -0,0 +1 @@ +ALTER TABLE `npc_types` ADD COLUMN `exp_mod` INT NOT NULL DEFAULT '100' AFTER `always_aggro`; diff --git a/utils/sql/git/required/2021_02_15_npc_spell_entries_unsigned.sql b/utils/sql/git/required/2021_02_15_npc_spell_entries_unsigned.sql new file mode 100644 index 000000000..cc03b8daa --- /dev/null +++ b/utils/sql/git/required/2021_02_15_npc_spell_entries_unsigned.sql @@ -0,0 +1 @@ +ALTER TABLE `npc_spells_entries` MODIFY `spellid` SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0; diff --git a/utils/sql/git/required/2021_02_17_server_scheduled_events.sql b/utils/sql/git/required/2021_02_17_server_scheduled_events.sql new file mode 100644 index 000000000..deb69423f --- /dev/null +++ b/utils/sql/git/required/2021_02_17_server_scheduled_events.sql @@ -0,0 +1,21 @@ +CREATE TABLE `server_scheduled_events` +( + `id` int(11) NOT NULL AUTO_INCREMENT, + `description` varchar(255) DEFAULT NULL, + `event_type` varchar(100) DEFAULT NULL, + `event_data` text DEFAULT NULL, + `minute_start` int(11) DEFAULT 0, + `hour_start` int(11) DEFAULT 0, + `day_start` int(11) DEFAULT 0, + `month_start` int(11) DEFAULT 0, + `year_start` int(11) DEFAULT 0, + `minute_end` int(11) DEFAULT 0, + `hour_end` int(11) DEFAULT 0, + `day_end` int(11) DEFAULT 0, + `month_end` int(11) DEFAULT 0, + `year_end` int(11) DEFAULT 0, + `cron_expression` varchar(100) DEFAULT NULL, + `created_at` datetime DEFAULT NULL, + `deleted_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; diff --git a/utils/sql/git/required/2021_04_17_zone_safe_heading_changes.sql b/utils/sql/git/required/2021_04_17_zone_safe_heading_changes.sql new file mode 100644 index 000000000..c10a5c6ff --- /dev/null +++ b/utils/sql/git/required/2021_04_17_zone_safe_heading_changes.sql @@ -0,0 +1 @@ +ALTER TABLE zone ADD COLUMN safe_heading float NOT NULL DEFAULT 0 AFTER safe_z; diff --git a/utils/sql/git/required/2021_04_23_character_exp_modifiers.sql b/utils/sql/git/required/2021_04_23_character_exp_modifiers.sql new file mode 100644 index 000000000..4a1bcb5de --- /dev/null +++ b/utils/sql/git/required/2021_04_23_character_exp_modifiers.sql @@ -0,0 +1,7 @@ +CREATE TABLE `character_exp_modifiers` ( + `character_id` int NOT NULL, + `zone_id` int NOT NULL, + `aa_modifier` float NOT NULL, + `exp_modifier` float NOT NULL, + PRIMARY KEY (`character_id`, `zone_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; diff --git a/utils/sql/git/required/2021_04_28_idle_pathing.sql b/utils/sql/git/required/2021_04_28_idle_pathing.sql new file mode 100644 index 000000000..2249163fc --- /dev/null +++ b/utils/sql/git/required/2021_04_28_idle_pathing.sql @@ -0,0 +1,13 @@ +-- Add new path_when_zone_idle flag to allow some spawns to path in empty zones +ALTER TABLE spawn2 ADD COLUMN path_when_zone_idle tinyint(1) NOT NULL DEFAULT 0 AFTER pathgrid; + +-- Update spawns that used to path in empty zones because of their grid type +-- to behave the same using the new mechanism. The code that checked path grid +-- types has been removed as it was coincidentally coupled to idle movement. +-- The new flag path_when_zone_idle is the new mechanism, and allows any moving +-- mob, not just those on grids, to path while the zone is idle. +UPDATE spawn2 s +LEFT JOIN zone z ON z.short_name = s.zone +LEFT JOIN grid g ON g.id = s.pathgrid AND g.zoneid = z.zoneidnumber +SET path_when_zone_idle = 1 +WHERE pathgrid != 0 AND g.type IN (4, 6); diff --git a/utils/sql/peq-dump/peq-dump.sh b/utils/sql/peq-dump/peq-dump.sh index ccb7b8949..7eaffdc6a 100755 --- a/utils/sql/peq-dump/peq-dump.sh +++ b/utils/sql/peq-dump/peq-dump.sh @@ -44,6 +44,7 @@ echo "Generating [create_*] table exports..." bash -c "${world_bin} database:dump --login-tables --table-structure-only --dump-output-to-console | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > ${dump_path}create_tables_login.sql" bash -c "${world_bin} database:dump --player-tables --table-structure-only --dump-output-to-console | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > ${dump_path}create_tables_player.sql" bash -c "${world_bin} database:dump --state-tables --table-structure-only --dump-output-to-console | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > ${dump_path}create_tables_state.sql" +echo 'REPLACE INTO `instance_list` VALUES (1,25,1,1,0,0,1),(2,25,2,1,0,0,1),(3,151,1,1,0,0,1),(4,114,1,1,0,0,1),(5,344,1,1,0,0,1),(6,202,0,1,0,0,1);' >> "${dump_path}create_tables_state.sql" bash -c "${world_bin} database:dump --query-serv-tables --table-structure-only --dump-output-to-console | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > ${dump_path}create_tables_queryserv.sql" # with content @@ -67,4 +68,4 @@ bash -c "cd /tmp/ && rm -rf peq-latest.zip && zip peq-latest.zip peq-dump/* && m echo "Cleaning up..." rm -rf ${dump_path} -echo "Dump located [/tmp/peq-latest.zip]" \ No newline at end of file +echo "Dump located [/tmp/peq-latest.zip]" diff --git a/world/CMakeLists.txt b/world/CMakeLists.txt index 9906b0cfc..9a7ef5750 100644 --- a/world/CMakeLists.txt +++ b/world/CMakeLists.txt @@ -7,8 +7,13 @@ SET(world_sources cliententry.cpp clientlist.cpp console.cpp + dynamic_zone.cpp eql_config.cpp eqemu_api_world_data_service.cpp + expedition.cpp + expedition_database.cpp + expedition_message.cpp + expedition_state.cpp launcher_link.cpp launcher_list.cpp lfplist.cpp @@ -20,10 +25,12 @@ SET(world_sources web_interface.cpp web_interface_eqw.cpp wguild_mgr.cpp + world_event_scheduler.cpp world_config.cpp world_console_connection.cpp world_server_command_handler.cpp worlddb.cpp + world_store.cpp zonelist.cpp zoneserver.cpp ) @@ -36,8 +43,13 @@ SET(world_headers cliententry.h clientlist.h console.h + dynamic_zone.h eql_config.h eqemu_api_world_data_service.h + expedition.h + expedition_database.h + expedition_message.h + expedition_state.h launcher_link.h launcher_list.h lfplist.h @@ -54,6 +66,8 @@ SET(world_headers world_tcp_connection.h world_server_command_handler.h worlddb.h + world_event_scheduler.h + world_store.h zonelist.h zoneserver.h ) diff --git a/world/adventure.cpp b/world/adventure.cpp index 2a61baf65..d2b316b3c 100644 --- a/world/adventure.cpp +++ b/world/adventure.cpp @@ -11,11 +11,12 @@ #include "zonelist.h" #include "clientlist.h" #include "cliententry.h" +#include "world_store.h" extern ZSList zoneserver_list; extern ClientList client_list; extern AdventureManager adventure_manager; -extern EQEmu::Random emu_random; +extern EQ::Random emu_random; Adventure::Adventure(AdventureTemplate *t) { @@ -143,7 +144,7 @@ bool Adventure::Process() bool Adventure::CreateInstance() { - uint32 zone_id = content_db.GetZoneID(adventure_template->zone); + uint32 zone_id = ZoneID(adventure_template->zone); if(!zone_id) { return false; @@ -362,7 +363,7 @@ void Adventure::Finished(AdventureWinStatus ws) afe.points = 0; } adventure_manager.AddFinishedEvent(afe); - + database.UpdateAdventureStatsEntry(database.GetCharacterID((*iter).c_str()), GetTemplate()->theme, (ws != AWS_Lose) ? true : false); } ++iter; diff --git a/world/adventure_manager.cpp b/world/adventure_manager.cpp index 21ad8a8e4..06ea03bb0 100644 --- a/world/adventure_manager.cpp +++ b/world/adventure_manager.cpp @@ -10,12 +10,13 @@ #include "zonelist.h" #include "clientlist.h" #include "cliententry.h" +#include "world_store.h" #include #include extern ZSList zoneserver_list; extern ClientList client_list; -extern EQEmu::Random emu_random; +extern EQ::Random emu_random; AdventureManager::AdventureManager() { @@ -771,7 +772,7 @@ void AdventureManager::PlayerClickedDoor(const char *player, int zone_id, int do sizeof(ServerPlayerClickedAdventureDoorReply_Struct)); ServerPlayerClickedAdventureDoorReply_Struct *sr = (ServerPlayerClickedAdventureDoorReply_Struct*)pack->pBuffer; strcpy(sr->player, player); - sr->zone_id = content_db.GetZoneID(t->zone); + sr->zone_id = ZoneID(t->zone); sr->instance_id = (*iter)->GetInstanceID(); sr->x = t->dest_x; sr->y = t->dest_y; diff --git a/world/client.cpp b/world/client.cpp index ebc01e03e..03c6195e8 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -46,6 +46,7 @@ #include "clientlist.h" #include "wguild_mgr.h" #include "sof_char_create_data.h" +#include "world_store.h" #include #include @@ -64,7 +65,7 @@ #include #include #else - + #ifdef FREEBSD //Timothy Whitman - January 7, 2003 #include #endif @@ -81,11 +82,22 @@ std::vector character_create_race_class_combos; extern ZSList zoneserver_list; extern LoginServerList loginserverlist; extern ClientList client_list; -extern EQEmu::Random emu_random; +extern EQ::Random emu_random; extern uint32 numclients; extern volatile bool RunLoops; extern volatile bool UCSServerAvailable_; +// unused ATM, but here for reference, should match RoF2 +enum class NameApprovalResponse : int { + NotValid = -1, // string ID 1576 + Rejected = 0, // string ID 1581 + Approved = 1, + CharacterLimit = 2, // string ID 1591 older clients mention 1 char on server + ThreeDeity = 3, // string ID 5502. 3 toons same deity team limit + HeadStartPreOoW = 4, // string ID 6862, head start failed due to OoW not being unlocked + HeadStartNoOoW = 5, // string ID 6863, head start failed due to not owning OoW +}; + Client::Client(EQStreamInterface* ieqs) : autobootup_timeout(RuleI(World, ZoneAutobootTimeoutMS)), connect(1000), @@ -108,7 +120,7 @@ Client::Client(EQStreamInterface* ieqs) StartInTutorial = false; m_ClientVersion = eqs->ClientVersion(); - m_ClientVersionBit = EQEmu::versions::ConvertClientVersionToClientVersionBit(m_ClientVersion); + m_ClientVersionBit = EQ::versions::ConvertClientVersionToClientVersionBit(m_ClientVersion); numclients++; } @@ -171,12 +183,12 @@ void Client::SendEnterWorld(std::string name) void Client::SendExpansionInfo() { auto outapp = new EQApplicationPacket(OP_ExpansionInfo, sizeof(ExpansionInfo_Struct)); ExpansionInfo_Struct *eis = (ExpansionInfo_Struct*)outapp->pBuffer; - + if (RuleB(World, UseClientBasedExpansionSettings)) { - eis->Expansions = EQEmu::expansions::ConvertClientVersionToExpansionsMask(eqs->ClientVersion()); + eis->Expansions = EQ::expansions::ConvertClientVersionToExpansionsMask(eqs->ClientVersion()); } else { - eis->Expansions = (RuleI(World, ExpansionSettings) & EQEmu::expansions::ConvertClientVersionToExpansionsMask(eqs->ClientVersion())); + eis->Expansions = (RuleI(World, ExpansionSettings) & EQ::expansions::ConvertClientVersionToExpansionsMask(eqs->ClientVersion())); } QueuePacket(outapp); @@ -188,7 +200,7 @@ void Client::SendCharInfo() { cle->SetOnline(CLE_Status::CharSelect); } - if (m_ClientVersionBit & EQEmu::versions::maskRoFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskRoFAndLater) { SendMaxCharCreate(); SendMembership(); SendMembershipSettings(); @@ -213,9 +225,9 @@ void Client::SendMaxCharCreate() { auto outapp = new EQApplicationPacket(OP_SendMaxCharacters, sizeof(MaxCharacters_Struct)); MaxCharacters_Struct* mc = (MaxCharacters_Struct*)outapp->pBuffer; - mc->max_chars = EQEmu::constants::StaticLookup(m_ClientVersion)->CharacterCreationLimit; - if (mc->max_chars > EQEmu::constants::CHARACTER_CREATION_LIMIT) - mc->max_chars = EQEmu::constants::CHARACTER_CREATION_LIMIT; + mc->max_chars = EQ::constants::StaticLookup(m_ClientVersion)->CharacterCreationLimit; + if (mc->max_chars > EQ::constants::CHARACTER_CREATION_LIMIT) + mc->max_chars = EQ::constants::CHARACTER_CREATION_LIMIT; QueuePacket(outapp); safe_delete(outapp); @@ -430,7 +442,7 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) if (!is_player_zoning) { // Track who is in and who is out of the game char *inout= (char *) ""; - + if (cle->GetOnline() == CLE_Status::Never){ // Desktop -> Char Select inout = (char *) "In"; @@ -439,21 +451,21 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) // Game -> Char Select inout=(char *) "Out"; } - + // Always at Char select at this point. // Either from a fresh client launch or coming back from the game. // Exiting the game entirely does not come through here. // Could use a Logging Out Completely message somewhere. cle->SetOnline(CLE_Status::CharSelect); - + LogInfo("Account ({}) Logging({}) to character select :: LSID [{}] ", cle->AccountName(), inout, cle->LSID()); } else { cle->SetOnline(); } - + const WorldConfig *Config=WorldConfig::get(); - + if(Config->UpdateStats) { auto pack = new ServerPacket; pack->opcode = ServerOP_LSPlayerJoinWorld; @@ -466,10 +478,10 @@ bool Client::HandleSendLoginInfoPacket(const EQApplicationPacket *app) loginserverlist.SendPacket(pack); safe_delete(pack); } - + if (!is_player_zoning) SendGuildList(); - + SendLogServer(); SendApproveWorld(); SendEnterWorld(cle->name()); @@ -496,7 +508,7 @@ bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app) return false; } - snprintf(char_name, 64, "%s", (char*)app->pBuffer); + auto length = snprintf(char_name, 64, "%s", (char*)app->pBuffer); uchar race = app->pBuffer[64]; uchar clas = app->pBuffer[68]; @@ -508,22 +520,39 @@ bool Client::HandleNameApprovalPacket(const EQApplicationPacket *app) outapp->pBuffer = new uchar[1]; outapp->size = 1; - bool valid = false; - if(!database.CheckNameFilter(char_name)) { - valid = false; + bool valid = true; + /* Name must be between 4 and 15 characters long, packet forged if this is true */ + if (length < 4 || length > 15) { + valid = false; } - /* Name must begin with an upper-case letter. */ - else if (islower(char_name[0])) { - valid = false; - } - else if (database.ReserveName(GetAccountID(), char_name)) { - valid = true; + /* Name must begin with an upper-case letter, can be sent with some tricking of the client */ + else if (islower(char_name[0])) { + valid = false; } - else { - valid = false; + /* Name must not have any spaces, packet forged if this is true */ + else if (strstr(char_name, " ")) { + valid = false; + } + /* I would like to do this later, since it's likely more expensive, but oh well */ + else if (!database.CheckNameFilter(char_name)) { + valid = false; + } + else { + /* Name must not not contain any uppercase letters, can be sent with some tricking of the client */ + for (int i = 1; i < length; ++i) { + if (isupper(char_name[i])) { + valid = false; + break; + } + } } - outapp->pBuffer[0] = valid? 1 : 0; + /* Still not invalid, let's see if it's taken */ + if (valid) { + valid = database.ReserveName(GetAccountID(), char_name); + } + + outapp->pBuffer[0] = valid ? 1 : 0; QueuePacket(outapp); safe_delete(outapp); @@ -682,7 +711,7 @@ bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) { } else { - if (m_ClientVersionBit & EQEmu::versions::maskTitaniumAndEarlier) + if (m_ClientVersionBit & EQ::versions::maskTitaniumAndEarlier) StartInTutorial = true; SendCharInfo(); } @@ -690,7 +719,7 @@ bool Client::HandleCharacterCreatePacket(const EQApplicationPacket *app) { return true; } -bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { +bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { if (GetAccountID() == 0) { LogInfo("Enter world with no logged in account"); eqs->Close(); @@ -714,7 +743,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { EQApplicationPacket *outapp; uint32 tmpaccid = 0; charid = database.GetCharacterInfo(char_name, &tmpaccid, &zone_id, &instance_id); - if (charid == 0 || tmpaccid != GetAccountID()) { + if (charid == 0) { LogInfo("Could not get CharInfo for [{}]", char_name); eqs->Close(); return true; @@ -730,9 +759,9 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { // This can probably be moved outside and have another method return requested info (don't forget to remove the #include "../common/shareddb.h" above) // (This is a literal translation of the original process..I don't see why it can't be changed to a single-target query over account iteration) if (!is_player_zoning) { - size_t character_limit = EQEmu::constants::StaticLookup(eqs->ClientVersion())->CharacterCreationLimit; - if (character_limit > EQEmu::constants::CHARACTER_CREATION_LIMIT) { character_limit = EQEmu::constants::CHARACTER_CREATION_LIMIT; } - if (eqs->ClientVersion() == EQEmu::versions::ClientVersion::Titanium) { character_limit = Titanium::constants::CHARACTER_CREATION_LIMIT; } + size_t character_limit = EQ::constants::StaticLookup(eqs->ClientVersion())->CharacterCreationLimit; + if (character_limit > EQ::constants::CHARACTER_CREATION_LIMIT) { character_limit = EQ::constants::CHARACTER_CREATION_LIMIT; } + if (eqs->ClientVersion() == EQ::versions::ClientVersion::Titanium) { character_limit = Titanium::constants::CHARACTER_CREATION_LIMIT; } std::string tgh_query = StringFormat( "SELECT " @@ -785,7 +814,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { if (tutorial_enabled) { zone_id = RuleI(World, TutorialZoneID); - database.MoveCharacterToZone(charid, content_db.GetZoneName(zone_id)); + database.MoveCharacterToZone(charid, zone_id); } else { LogInfo("[{}] is trying to go to tutorial but are not allowed", char_name); @@ -796,9 +825,9 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { } } - if (zone_id == 0 || !content_db.GetZoneName(zone_id)) { + if (zone_id == 0 || !ZoneName(zone_id)) { // This is to save people in an invalid zone, once it's removed from the DB - database.MoveCharacterToZone(charid, "arena"); + database.MoveCharacterToZone(charid, ZoneID("arena")); LogInfo("Zone not found in database zone_id=[{}], moveing char to arena character:[{}]", zone_id, char_name); } @@ -856,7 +885,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { } QueuePacket(outapp); safe_delete(outapp); - + // set mailkey - used for duration of character session int MailKey = emu_random.Int(1, INT_MAX); @@ -865,30 +894,30 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { const WorldConfig *Config = WorldConfig::get(); std::string buffer; - EQEmu::versions::UCSVersion ConnectionType = EQEmu::versions::ucsUnknown; + EQ::versions::UCSVersion ConnectionType = EQ::versions::ucsUnknown; // chat server packet switch (GetClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: - ConnectionType = EQEmu::versions::ucsTitaniumChat; + case EQ::versions::ClientVersion::Titanium: + ConnectionType = EQ::versions::ucsTitaniumChat; break; - case EQEmu::versions::ClientVersion::SoF: - ConnectionType = EQEmu::versions::ucsSoFCombined; + case EQ::versions::ClientVersion::SoF: + ConnectionType = EQ::versions::ucsSoFCombined; break; - case EQEmu::versions::ClientVersion::SoD: - ConnectionType = EQEmu::versions::ucsSoDCombined; + case EQ::versions::ClientVersion::SoD: + ConnectionType = EQ::versions::ucsSoDCombined; break; - case EQEmu::versions::ClientVersion::UF: - ConnectionType = EQEmu::versions::ucsUFCombined; + case EQ::versions::ClientVersion::UF: + ConnectionType = EQ::versions::ucsUFCombined; break; - case EQEmu::versions::ClientVersion::RoF: - ConnectionType = EQEmu::versions::ucsRoFCombined; + case EQ::versions::ClientVersion::RoF: + ConnectionType = EQ::versions::ucsRoFCombined; break; - case EQEmu::versions::ClientVersion::RoF2: - ConnectionType = EQEmu::versions::ucsRoF2Combined; + case EQ::versions::ClientVersion::RoF2: + ConnectionType = EQ::versions::ucsRoF2Combined; break; default: - ConnectionType = EQEmu::versions::ucsUnknown; + ConnectionType = EQ::versions::ucsUnknown; break; } @@ -910,8 +939,8 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) { // mail server packet switch (GetClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: - ConnectionType = EQEmu::versions::ucsTitaniumMail; + case EQ::versions::ClientVersion::Titanium: + ConnectionType = EQ::versions::ucsTitaniumMail; break; default: // retain value from previous switch @@ -954,7 +983,7 @@ bool Client::HandleDeleteCharacterPacket(const EQApplicationPacket *app) { bool Client::HandleZoneChangePacket(const EQApplicationPacket *app) { // HoT sends this to world while zoning and wants it echoed back. - if (m_ClientVersionBit & EQEmu::versions::maskRoFAndLater) + if (m_ClientVersionBit & EQ::versions::maskRoFAndLater) { QueuePacket(app); } @@ -1154,7 +1183,7 @@ void Client::EnterWorld(bool TryBootup) { else zone_server = zoneserver_list.FindByZoneID(zone_id); - const char *zone_name = content_db.GetZoneName(zone_id, true); + const char *zone_name = ZoneName(zone_id, true); if (zone_server) { if (false == enter_world_triggered) { //Drop any clients we own in other zones. @@ -1204,9 +1233,9 @@ void Client::EnterWorld(bool TryBootup) { LogInfo( "({}) [{}] [{}] (Zone ID [{}]: Instance ID: [{}]) ", char_name, - (seen_character_select ? "Zoning from character select" : "Zoning to"), - zone_name, - zone_id, + (seen_character_select ? "Zoning from character select" : "Zoning to"), + zone_name, + zone_id, instance_id ); @@ -1267,7 +1296,7 @@ void Client::Clearance(int8 response) return; } - const char* zonename = content_db.GetZoneName(zone_id); + const char* zonename = ZoneName(zone_id); if (zonename == 0) { LogInfo("zonename is nullptr in Client::Clearance!!"); TellClientZoneUnavailable(); @@ -1278,23 +1307,23 @@ void Client::Clearance(int8 response) outapp = new EQApplicationPacket(OP_ZoneServerInfo, sizeof(ZoneServerInfo_Struct)); ZoneServerInfo_Struct* zsi = (ZoneServerInfo_Struct*)outapp->pBuffer; - const char *zs_addr = nullptr; + std::string zs_addr; if(cle && cle->IsLocalClient()) { const char *local_addr = zs->GetCLocalAddress(); if(local_addr[0]) { zs_addr = local_addr; } else { - zs_addr = zs->GetIP().c_str(); + zs_addr = zs->GetIP(); - if (!zs_addr[0]) { - zs_addr = WorldConfig::get()->LocalAddress.c_str(); + if (zs_addr.empty()) { + zs_addr = WorldConfig::get()->LocalAddress; } - if(strcmp(zs_addr, "127.0.0.1") == 0) + if(zs_addr == "127.0.0.1") { LogInfo("Local zone address was [{}], setting local address to: [{}]", zs_addr, WorldConfig::get()->LocalAddress.c_str()); - zs_addr = WorldConfig::get()->LocalAddress.c_str(); + zs_addr = WorldConfig::get()->LocalAddress; } else { LogInfo("Local zone address [{}]", zs_addr); } @@ -1305,11 +1334,11 @@ void Client::Clearance(int8 response) if(addr[0]) { zs_addr = addr; } else { - zs_addr = WorldConfig::get()->WorldAddress.c_str(); + zs_addr = WorldConfig::get()->WorldAddress; } } - strcpy(zsi->ip, zs_addr); + strcpy(zsi->ip, zs_addr.c_str()); zsi->port =zs->GetCPort(); LogInfo("Sending client to zone [{}] ([{}]:[{}]) at [{}]:[{}]", zonename, zone_id, instance_id, zsi->ip, zsi->port); QueuePacket(outapp); @@ -1322,7 +1351,7 @@ void Client::Clearance(int8 response) void Client::TellClientZoneUnavailable() { auto outapp = new EQApplicationPacket(OP_ZoneUnavail, sizeof(ZoneUnavail_Struct)); ZoneUnavail_Struct* ua = (ZoneUnavail_Struct*)outapp->pBuffer; - const char* zonename = content_db.GetZoneName(zone_id); + const char* zonename = ZoneName(zone_id); if (zonename) strcpy(ua->zonename, zonename); QueuePacket(outapp); @@ -1416,10 +1445,10 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) { PlayerProfile_Struct pp; ExtendedProfile_Struct ext; - EQEmu::InventoryProfile inv; + EQ::InventoryProfile inv; - pp.SetPlayerProfileVersion(EQEmu::versions::ConvertClientVersionToMobVersion(EQEmu::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit))); - inv.SetInventoryVersion(EQEmu::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit)); + pp.SetPlayerProfileVersion(EQ::versions::ConvertClientVersionToMobVersion(EQ::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit))); + inv.SetInventoryVersion(EQ::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit)); inv.SetGMInventory(false); // character cannot have gm flag at this point time_t bday = time(nullptr); @@ -1444,7 +1473,7 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) LogInfo("Beard: [{}] Beardcolor: [{}]", cc->beard, cc->beardcolor); /* Validate the char creation struct */ - if (m_ClientVersionBit & EQEmu::versions::maskSoFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskSoFAndLater) { if (!CheckCharCreateInfoSoF(cc)) { LogInfo("CheckCharCreateInfo did not validate the request (bad race/class/stats)"); return false; @@ -1496,14 +1525,13 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) SetClassStartingSkills(&pp); SetClassLanguages(&pp); - pp.skills[EQEmu::skills::SkillSwimming] = RuleI(Skills, SwimmingStartValue); - pp.skills[EQEmu::skills::SkillSenseHeading] = RuleI(Skills, SenseHeadingStartValue); + pp.skills[EQ::skills::SkillSwimming] = RuleI(Skills, SwimmingStartValue); + pp.skills[EQ::skills::SkillSenseHeading] = RuleI(Skills, SenseHeadingStartValue); // strcpy(pp.servername, WorldConfig::get()->ShortName.c_str()); - memset(pp.spell_book, 0xFF, (sizeof(uint32) * EQEmu::spells::SPELLBOOK_SIZE)); - - memset(pp.mem_spells, 0xFF, (sizeof(uint32) * EQEmu::spells::SPELL_GEM_COUNT)); + memset(pp.spell_book, 0xFF, (sizeof(uint32) * EQ::spells::SPELLBOOK_SIZE)); + memset(pp.mem_spells, 0xFF, (sizeof(uint32) * EQ::spells::SPELL_GEM_COUNT)); for(i = 0; i < BUFF_COUNT; i++) pp.buffs[i].spellid = 0xFFFF; @@ -1512,7 +1540,7 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) pp.pvp = database.GetServerType() == 1 ? 1 : 0; /* If it is an SoF Client and the SoF Start Zone rule is set, send new chars there */ - if (m_ClientVersionBit & EQEmu::versions::maskSoFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskSoFAndLater) { LogInfo("Found 'SoFStartZoneID' rule setting: [{}]", RuleI(World, SoFStartZoneID)); if (RuleI(World, SoFStartZoneID) > 0) { pp.zone_id = RuleI(World, SoFStartZoneID); @@ -1522,13 +1550,13 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) else { LogInfo("Found 'TitaniumStartZoneID' rule setting: [{}]", RuleI(World, TitaniumStartZoneID)); if (RuleI(World, TitaniumStartZoneID) > 0) { /* if there's a startzone variable put them in there */ - + pp.zone_id = RuleI(World, TitaniumStartZoneID); cc->start_zone = pp.zone_id; } - } + } /* use normal starting zone logic to either get defaults, or if startzone was set, load that from the db table.*/ - bool ValidStartZone = content_db.GetStartZone(&pp, cc, m_ClientVersionBit & EQEmu::versions::maskTitaniumAndEarlier); + bool ValidStartZone = content_db.GetStartZone(&pp, cc, m_ClientVersionBit & EQ::versions::maskTitaniumAndEarlier); if (!ValidStartZone){ return false; @@ -1541,25 +1569,25 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) } /* Set Home Binds -- yep, all of them */ - pp.binds[1].zoneId = pp.zone_id; + pp.binds[1].zone_id = pp.zone_id; pp.binds[1].x = pp.x; pp.binds[1].y = pp.y; pp.binds[1].z = pp.z; pp.binds[1].heading = pp.heading; - pp.binds[2].zoneId = pp.zone_id; + pp.binds[2].zone_id = pp.zone_id; pp.binds[2].x = pp.x; pp.binds[2].y = pp.y; pp.binds[2].z = pp.z; pp.binds[2].heading = pp.heading; - pp.binds[3].zoneId = pp.zone_id; + pp.binds[3].zone_id = pp.zone_id; pp.binds[3].x = pp.x; pp.binds[3].y = pp.y; pp.binds[3].z = pp.z; pp.binds[3].heading = pp.heading; - pp.binds[4].zoneId = pp.zone_id; + pp.binds[4].zone_id = pp.zone_id; pp.binds[4].x = pp.x; pp.binds[4].y = pp.y; pp.binds[4].z = pp.z; @@ -1568,12 +1596,12 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) /* Overrides if we have the tutorial flag set! */ if (cc->tutorial && RuleB(World, EnableTutorialButton)) { pp.zone_id = RuleI(World, TutorialZoneID); - content_db.GetSafePoints(pp.zone_id, 0, &pp.x, &pp.y, &pp.z); + content_db.GetSafePoints(ZoneName(pp.zone_id), 0, &pp.x, &pp.y, &pp.z); } /* Will either be the same as home or tutorial if enabled. */ if(RuleB(World, StartZoneSameAsBindOnCreation)) { - pp.binds[0].zoneId = pp.zone_id; + pp.binds[0].zone_id = pp.zone_id; pp.binds[0].x = pp.x; pp.binds[0].y = pp.y; pp.binds[0].z = pp.z; @@ -1581,11 +1609,11 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) } Log(Logs::Detail, Logs::WorldServer, "Current location: %s (%d) %0.2f, %0.2f, %0.2f, %0.2f", - content_db.GetZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading); + ZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading); Log(Logs::Detail, Logs::WorldServer, "Bind location: %s (%d) %0.2f, %0.2f, %0.2f", - content_db.GetZoneName(pp.binds[0].zoneId), pp.binds[0].zoneId, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z); + ZoneName(pp.binds[0].zone_id), pp.binds[0].zone_id, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z); Log(Logs::Detail, Logs::WorldServer, "Home location: %s (%d) %0.2f, %0.2f, %0.2f", - content_db.GetZoneName(pp.binds[4].zoneId), pp.binds[4].zoneId, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z); + ZoneName(pp.binds[4].zone_id), pp.binds[4].zone_id, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z); /* Starting Items inventory */ content_db.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin()); @@ -1870,21 +1898,21 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc) void Client::SetClassStartingSkills(PlayerProfile_Struct *pp) { - for (uint32 i = 0; i <= EQEmu::skills::HIGHEST_SKILL; ++i) { + for (uint32 i = 0; i <= EQ::skills::HIGHEST_SKILL; ++i) { if (pp->skills[i] == 0) { // Skip specialized, tradeskills (fishing excluded), Alcohol Tolerance, and Bind Wound - if (EQEmu::skills::IsSpecializedSkill((EQEmu::skills::SkillType)i) || - (EQEmu::skills::IsTradeskill((EQEmu::skills::SkillType)i) && i != EQEmu::skills::SkillFishing) || - i == EQEmu::skills::SkillAlcoholTolerance || i == EQEmu::skills::SkillBindWound) + if (EQ::skills::IsSpecializedSkill((EQ::skills::SkillType)i) || + (EQ::skills::IsTradeskill((EQ::skills::SkillType)i) && i != EQ::skills::SkillFishing) || + i == EQ::skills::SkillAlcoholTolerance || i == EQ::skills::SkillBindWound) continue; - pp->skills[i] = database.GetSkillCap(pp->class_, (EQEmu::skills::SkillType)i, 1); + pp->skills[i] = content_db.GetSkillCap(pp->class_, (EQ::skills::SkillType)i, 1); } } - if (cle->GetClientVersion() < static_cast(EQEmu::versions::ClientVersion::RoF2) && pp->class_ == BERSERKER) { - pp->skills[EQEmu::skills::Skill1HPiercing] = pp->skills[EQEmu::skills::Skill2HPiercing]; - pp->skills[EQEmu::skills::Skill2HPiercing] = 0; + if (cle->GetClientVersion() < static_cast(EQ::versions::ClientVersion::RoF2) && pp->class_ == BERSERKER) { + pp->skills[EQ::skills::Skill1HPiercing] = pp->skills[EQ::skills::Skill2HPiercing]; + pp->skills[EQ::skills::Skill2HPiercing] = 0; } } @@ -1907,41 +1935,41 @@ void Client::SetRaceStartingSkills( PlayerProfile_Struct *pp ) } case DARK_ELF: { - pp->skills[EQEmu::skills::SkillHide] = 50; + pp->skills[EQ::skills::SkillHide] = 50; break; } case FROGLOK: { - pp->skills[EQEmu::skills::SkillSwimming] = 125; + pp->skills[EQ::skills::SkillSwimming] = 125; break; } case GNOME: { - pp->skills[EQEmu::skills::SkillTinkering] = 50; + pp->skills[EQ::skills::SkillTinkering] = 50; break; } case HALFLING: { - pp->skills[EQEmu::skills::SkillHide] = 50; - pp->skills[EQEmu::skills::SkillSneak] = 50; + pp->skills[EQ::skills::SkillHide] = 50; + pp->skills[EQ::skills::SkillSneak] = 50; break; } case IKSAR: { - pp->skills[EQEmu::skills::SkillForage] = 50; - pp->skills[EQEmu::skills::SkillSwimming] = 100; + pp->skills[EQ::skills::SkillForage] = 50; + pp->skills[EQ::skills::SkillSwimming] = 100; break; } case WOOD_ELF: { - pp->skills[EQEmu::skills::SkillForage] = 50; - pp->skills[EQEmu::skills::SkillHide] = 50; + pp->skills[EQ::skills::SkillForage] = 50; + pp->skills[EQ::skills::SkillHide] = 50; break; } case VAHSHIR: { - pp->skills[EQEmu::skills::SkillSafeFall] = 50; - pp->skills[EQEmu::skills::SkillSneak] = 50; + pp->skills[EQ::skills::SkillSafeFall] = 50; + pp->skills[EQ::skills::SkillSneak] = 50; break; } } @@ -2078,7 +2106,7 @@ void Client::SetClassLanguages(PlayerProfile_Struct *pp) bool Client::StoreCharacter( uint32 account_id, PlayerProfile_Struct *p_player_profile_struct, - EQEmu::InventoryProfile *p_inventory_profile + EQ::InventoryProfile *p_inventory_profile ) { uint32 character_id = 0; @@ -2090,7 +2118,7 @@ bool Client::StoreCharacter( return false; } - const char *zone_name = content_db.GetZoneName(p_player_profile_struct->zone_id); + const char *zone_name = ZoneName(p_player_profile_struct->zone_id); if (zone_name == nullptr) { /* Zone not in the DB, something to prevent crash... */ strn0cpy(zone, "qeynos", 49); @@ -2103,8 +2131,8 @@ bool Client::StoreCharacter( database.SaveCharacterCreate(character_id, account_id, p_player_profile_struct); std::string invquery; - for (int16 i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invbag::BANK_BAGS_END;) { - const EQEmu::ItemInstance *new_inventory_item = p_inventory_profile->GetItem(i); + for (int16 i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invbag::BANK_BAGS_END;) { + const EQ::ItemInstance *new_inventory_item = p_inventory_profile->GetItem(i); if (new_inventory_item) { invquery = StringFormat( "INSERT INTO `inventory` (charid, slotid, itemid, charges, color) VALUES (%u, %i, %u, %i, %u)", @@ -2118,20 +2146,20 @@ bool Client::StoreCharacter( auto results = database.QueryDatabase(invquery); } - if (i == EQEmu::invslot::slotCursor) { - i = EQEmu::invbag::GENERAL_BAGS_BEGIN; + if (i == EQ::invslot::slotCursor) { + i = EQ::invbag::GENERAL_BAGS_BEGIN; continue; } - else if (i == EQEmu::invbag::CURSOR_BAG_END) { - i = EQEmu::invslot::BANK_BEGIN; + else if (i == EQ::invbag::CURSOR_BAG_END) { + i = EQ::invslot::BANK_BEGIN; continue; } - else if (i == EQEmu::invslot::BANK_END) { - i = EQEmu::invbag::BANK_BAGS_BEGIN; + else if (i == EQ::invslot::BANK_END) { + i = EQ::invbag::BANK_BAGS_BEGIN; continue; } i++; } return true; -} \ No newline at end of file +} diff --git a/world/client.h b/world/client.h index 2bea3adf6..3631cf129 100644 --- a/world/client.h +++ b/world/client.h @@ -1,5 +1,5 @@ -/* EQEMu: Everquest Server Emulator - Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org) +/* EQ Everquest Server Emulator + Copyright (C) 2001-2002 EQ:: Development Team (http://EQ::.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 @@ -69,13 +69,13 @@ public: inline const char* GetLSKey() { if (cle) { return cle->GetLSKey(); } return "NOKEY"; } inline uint32 GetCharID() { return charid; } inline const char* GetCharName() { return char_name; } - inline EQEmu::versions::ClientVersion GetClientVersion() { return m_ClientVersion; } + inline EQ::versions::ClientVersion GetClientVersion() { return m_ClientVersion; } inline ClientListEntry* GetCLE() { return cle; } inline void SetCLE(ClientListEntry* iCLE) { cle = iCLE; } bool StoreCharacter( uint32 account_id, PlayerProfile_Struct *p_player_profile_struct, - EQEmu::InventoryProfile *p_inventory_profile + EQ::InventoryProfile *p_inventory_profile ); private: @@ -92,7 +92,7 @@ private: bool enter_world_triggered; bool StartInTutorial; - EQEmu::versions::ClientVersion m_ClientVersion; + EQ::versions::ClientVersion m_ClientVersion; uint32 m_ClientVersionBit; bool OPCharCreate(char *name, CharCreate_Struct *cc); diff --git a/world/cliententry.h b/world/cliententry.h index b4d449c58..769700403 100644 --- a/world/cliententry.h +++ b/world/cliententry.h @@ -127,6 +127,9 @@ public: inline void PushToTellQueue(ServerChannelMessage_Struct *scm) { tell_queue.push_back(scm); } void ProcessTellQueue(); + void SetPendingExpeditionInvite(ServerPacket* pack) { p_pending_expedition_invite.reset(pack->Copy()); }; + std::unique_ptr GetPendingExpeditionInvite() { return std::move(p_pending_expedition_invite); } + private: void ClearVars(bool iAll = false); @@ -171,6 +174,8 @@ private: // Tell Queue -- really a vector :D std::vector tell_queue; + + std::unique_ptr p_pending_expedition_invite = nullptr; }; #endif /*CLIENTENTRY_H_*/ diff --git a/world/clientlist.cpp b/world/clientlist.cpp index b29af5a6b..0f216c0ee 100644 --- a/world/clientlist.cpp +++ b/world/clientlist.cpp @@ -33,6 +33,7 @@ #include "../common/event_sub.h" #include "web_interface.h" #include "wguild_mgr.h" +#include "world_store.h" #include extern WebInterfaceList web_interface; @@ -45,7 +46,7 @@ ClientList::ClientList() { NextCLEID = 1; - m_tick.reset(new EQ::Timer(5000, true, std::bind(&ClientList::OnTick, this, std::placeholders::_1))); + m_tick = std::make_unique(5000, true, std::bind(&ClientList::OnTick, this, std::placeholders::_1)); } ClientList::~ClientList() { @@ -107,7 +108,7 @@ void ClientList::GetCLEIP(uint32 iIP) { iterator.Reset(); while(iterator.MoreElements()) { - countCLEIPs = iterator.GetData(); + countCLEIPs = iterator.GetData(); if ((countCLEIPs->GetIP() == iIP) && ((countCLEIPs->Admin() < (RuleI(World, ExemptMaxClientsStatus))) || (RuleI(World, ExemptMaxClientsStatus) < 0))) { // If the IP matches, and the connection admin status is below the exempt status, or exempt status is less than 0 (no-one is exempt) IPInstances++; // Increment the occurences of this IP address LogClientLogin("Account ID: [{}] Account Name: [{}] IP: [{}]", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str()); @@ -129,7 +130,7 @@ void ClientList::GetCLEIP(uint32 iIP) { if (IPInstances > (RuleI(World, MaxClientsPerIP))) { // If the number of connections exceeds the lower limit if (RuleB(World, MaxClientsSetByStatus)) { // If MaxClientsSetByStatus is set to True, override other IP Limit Rules LogClientLogin("Account ID: [{}] Account Name: [{}] IP: [{}] IP Instances: [{}] Max IP Instances: [{}]", countCLEIPs->LSID(), countCLEIPs->LSName(), long2ip(countCLEIPs->GetIP()).c_str(), IPInstances, countCLEIPs->Admin()); - if (IPInstances > countCLEIPs->Admin()) { // The IP Limit is set by the status of the account if status > MaxClientsPerIP + if (IPInstances > countCLEIPs->Admin()) { // The IP Limit is set by the status of the account if status > MaxClientsPerIP if(RuleB(World, IPLimitDisconnectAll)) { LogClientLogin("Disconnect: All accounts on IP [{}]", long2ip(countCLEIPs->GetIP()).c_str()); DisconnectByIP(iIP); @@ -142,7 +143,7 @@ void ClientList::GetCLEIP(uint32 iIP) { } } } else if ((countCLEIPs->Admin() < RuleI(World, AddMaxClientsStatus)) || (RuleI(World, AddMaxClientsStatus) < 0)) { // Else if the Admin status of the connection is not eligible for the higher limit, or there is no higher limit (AddMaxClientStatus < 0) - if(RuleB(World, IPLimitDisconnectAll)) { + if(RuleB(World, IPLimitDisconnectAll)) { LogClientLogin("Disconnect: All accounts on IP [{}]", long2ip(countCLEIPs->GetIP()).c_str()); DisconnectByIP(iIP); return; @@ -152,7 +153,7 @@ void ClientList::GetCLEIP(uint32 iIP) { iterator.RemoveCurrent(); continue; } - } else if (IPInstances > RuleI(World, AddMaxClientsPerIP)) { // else they are eligible for the higher limit, but if they exceed that + } else if (IPInstances > RuleI(World, AddMaxClientsPerIP)) { // else they are eligible for the higher limit, but if they exceed that if(RuleB(World, IPLimitDisconnectAll)) { LogClientLogin("Disconnect: All accounts on IP [{}]", long2ip(countCLEIPs->GetIP()).c_str()); DisconnectByIP(iIP); @@ -268,8 +269,6 @@ ClientListEntry* ClientList::FindCLEByLSID(uint32 iLSID) { void ClientList::SendCLEList(const int16& admin, const char* to, WorldTCPConnection* connection, const char* iName) { LinkedListIterator iterator(clientlist); - char* output = 0; - uint32 outsize = 0, outlen = 0; int x = 0, y = 0; int namestrlen = iName == 0 ? 0 : strlen(iName); bool addnewline = false; @@ -278,6 +277,7 @@ void ClientList::SendCLEList(const int16& admin, const char* to, WorldTCPConnect strcpy(newline, "\r\n"); else strcpy(newline, "^"); + fmt::memory_buffer out; iterator.Reset(); while(iterator.MoreElements()) { @@ -286,31 +286,30 @@ void ClientList::SendCLEList(const int16& admin, const char* to, WorldTCPConnect struct in_addr in; in.s_addr = cle->GetIP(); if (addnewline) { - AppendAnyLenString(&output, &outsize, &outlen, newline); + fmt::format_to(out, newline); } - AppendAnyLenString(&output, &outsize, &outlen, "ID: %i Acc# %i AccName: %s IP: %s", cle->GetID(), cle->AccountID(), cle->AccountName(), inet_ntoa(in)); - AppendAnyLenString(&output, &outsize, &outlen, "%s Stale: %i Online: %i Admin: %i", newline, cle->GetStaleCounter(), cle->Online(), cle->Admin()); + fmt::format_to(out, "ID: {} Acc# {} AccName: {} IP: {}", cle->GetID(), cle->AccountID(), cle->AccountName(), inet_ntoa(in)); + fmt::format_to(out, "{} Stale: {} Online: {} Admin: {}", newline, cle->GetStaleCounter(), cle->Online(), cle->Admin()); if (cle->LSID()) - AppendAnyLenString(&output, &outsize, &outlen, "%s LSID: %i LSName: %s WorldAdmin: %i", newline, cle->LSID(), cle->LSName(), cle->WorldAdmin()); + fmt::format_to(out, "{} LSID: {} LSName: {} WorldAdmin: {}", newline, cle->LSID(), cle->LSName(), cle->WorldAdmin()); if (cle->CharID()) - AppendAnyLenString(&output, &outsize, &outlen, "%s CharID: %i CharName: %s Zone: %s (%i)", newline, cle->CharID(), cle->name(), content_db.GetZoneName(cle->zone()), cle->zone()); - if (outlen >= 3072) { - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - safe_delete(output); - outsize = 0; - outlen = 0; + fmt:format_to(out, "{} CharID: {} CharName: {} Zone: {} ({})", newline, cle->CharID(), cle->name(), ZoneName(cle->zone()), cle->zone()); + if (out.size() >= 3072) { + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); addnewline = false; - } - else + out.clear(); + } else { addnewline = true; + } y++; } iterator.Advance(); x++; } - AppendAnyLenString(&output, &outsize, &outlen, "%s%i CLEs in memory. %i CLEs listed. numplayers = %i.", newline, x, y, numplayers); - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - safe_delete(output); + fmt::format_to(out, "{}{} CLEs in memory. {} CLEs listed. numplayers = {}.", newline, x, y, numplayers); + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); } @@ -488,19 +487,12 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S whom->wrace = FROGLOK; // This is what EQEmu uses for the Froglok Race number. } - char* output = 0; - uint32 outsize = 0, outlen = 0; uint32 totalusers=0; uint32 totallength=0; - AppendAnyLenString(&output, &outsize, &outlen, "Players on server:"); - if (connection->IsConsole()) - AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); - else - AppendAnyLenString(&output, &outsize, &outlen, "\n"); countclients.Reset(); while(countclients.MoreElements()){ countcle = countclients.GetData(); - const char* tmpZone = content_db.GetZoneName(countcle->zone()); + const char* tmpZone = ZoneName(countcle->zone()); if ( (countcle->Online() >= CLE_Status::Zoning) && (!countcle->GetGM() || countcle->Anon() != 1 || admin >= countcle->Admin()) && @@ -580,7 +572,7 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S while(iterator.MoreElements()) { cle = iterator.GetData(); - const char* tmpZone = content_db.GetZoneName(cle->zone()); + const char* tmpZone = ZoneName(cle->zone()); if ( (cle->Online() >= CLE_Status::Zoning) && (!cle->GetGM() || cle->Anon() != 1 || admin >= cle->Admin()) && @@ -721,7 +713,6 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S //zoneserver_list.SendPacket(pack2); // NO NO NO WHY WOULD YOU SEND IT TO EVERY ZONE SERVER?!? SendPacket(to,pack2); safe_delete(pack2); - safe_delete_array(output); } catch(...){ LogInfo("Unknown error in world's SendWhoAll (probably mem error), ignoring"); @@ -955,17 +946,16 @@ void ClientList::ConsoleSendWhoAll(const char* to, int16 admin, Who_All_Struct* if (whom) whomlen = strlen(whom->whom); - char* output = 0; - uint32 outsize = 0, outlen = 0; - AppendAnyLenString(&output, &outsize, &outlen, "Players on server:"); + fmt::memory_buffer out; + fmt::format_to(out, "Players on server:"); if (connection->IsConsole()) - AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); + fmt::format_to(out, "\r\n"); else - AppendAnyLenString(&output, &outsize, &outlen, "\n"); + fmt::format_to(out, "\n"); iterator.Reset(); while (iterator.MoreElements()) { cle = iterator.GetData(); - const char* tmpZone = content_db.GetZoneName(cle->zone()); + const char* tmpZone = ZoneName(cle->zone()); if ( (cle->Online() >= CLE_Status::Zoning) && (whom == 0 || ( @@ -1057,18 +1047,17 @@ void ClientList::ConsoleSendWhoAll(const char* to, int16 admin, Who_All_Struct* else sprintf(line, " %s[%i %s] %s (%s)%s zone: %s%s%s", tmpgm, cle->level(), GetClassIDName(cle->class_(), cle->level()), cle->name(), GetRaceIDName(cle->race()), tmpguild, tmpZone, LFG, accinfo); - AppendAnyLenString(&output, &outsize, &outlen, line); - if (outlen >= 3584) { - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - safe_delete(output); - outsize = 0; - outlen = 0; + fmt::format_to(out, line); + if (out.size() >= 3584) { + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); + out.clear(); } else { if (connection->IsConsole()) - AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); + fmt::format_to(out, "\r\n"); else - AppendAnyLenString(&output, &outsize, &outlen, "\n"); + fmt::format_to(out, "\n"); } x++; if (x >= 20 && admin < 80) @@ -1078,20 +1067,19 @@ void ClientList::ConsoleSendWhoAll(const char* to, int16 admin, Who_All_Struct* } if (x >= 20 && admin < 80) - AppendAnyLenString(&output, &outsize, &outlen, "too many results...20 players shown"); + fmt::format_to(out, "too many results...20 players shown"); else - AppendAnyLenString(&output, &outsize, &outlen, "%i players online", x); + fmt::format_to(out, "{} players online", x); if (admin >= 150 && (whom == 0 || whom->gmlookup != 0xFFFF)) { if (connection->IsConsole()) - AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); + fmt::format_to(out, "\r\n"); else - AppendAnyLenString(&output, &outsize, &outlen, "\n"); - + fmt::format_to(out, "\n"); + //console_list.SendConsoleWho(connection, to, admin, &output, &outsize, &outlen); } - if (output) - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - safe_delete(output); + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); } void ClientList::Add(Client* client) { @@ -1256,7 +1244,7 @@ void ClientList::RemoveCLEByLSID(uint32 iLSID) bool ClientList::IsAccountInGame(uint32 iLSID) { LinkedListIterator iterator(clientlist); - + iterator.Reset(); while (iterator.MoreElements()) { if (iterator.GetData()->LSID() == iLSID && iterator.GetData()->Online() == CLE_Status::InZone) { return true; @@ -1282,7 +1270,7 @@ void ClientList::GetClients(const char *zone_name, std::vectorzone() == zoneid) @@ -1358,7 +1346,7 @@ void ClientList::SendClientVersionSummary(const char *Name) } zoneserver_list.SendEmoteMessage(Name, 0, 0, 13, "There are %i Titanium, %i SoF, %i SoD, %i UF, %i RoF, %i RoF2 clients currently connected.", - ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount, ClientRoF2Count); + ClientTitaniumCount, ClientSoFCount, ClientSoDCount, ClientUnderfootCount, ClientRoFCount, ClientRoF2Count); } void ClientList::OnTick(EQ::Timer *t) @@ -1378,7 +1366,7 @@ void ClientList::OnTick(EQ::Timer *t) while (Iterator.MoreElements()) { ClientListEntry* cle = Iterator.GetData(); - + Json::Value outclient; outclient["Online"] = cle->Online(); diff --git a/world/console.cpp b/world/console.cpp index aa67751e7..6a4ffeff4 100644 --- a/world/console.cpp +++ b/world/console.cpp @@ -30,6 +30,7 @@ #include "../common/string_util.h" #include "../common/md5.h" #include "eqemu_api_world_data_service.h" +#include "world_store.h" #include extern ClientList client_list; @@ -541,7 +542,7 @@ void ConsoleZoneShutdown( s->ZoneServerID = atoi(args[0].c_str()); } else { - s->zoneid = content_db.GetZoneID(args[0].c_str()); + s->zoneid = ZoneID(args[0].c_str()); } ZoneServer *zs = 0; @@ -549,7 +550,7 @@ void ConsoleZoneShutdown( zs = zoneserver_list.FindByID(s->ZoneServerID); } else if (s->zoneid != 0) { - zs = zoneserver_list.FindByName(content_db.GetZoneName(s->zoneid)); + zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); } else { connection->SendLine("Error: ZoneShutdown: neither ID nor name specified"); @@ -633,10 +634,10 @@ void ConsoleZoneLock( return; } - uint16 tmp = content_db.GetZoneID(args[1].c_str()); + uint16 tmp = ZoneID(args[1].c_str()); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, true)) { - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", ZoneName(tmp)); } else { connection->SendLine("Failed to change lock"); @@ -651,10 +652,10 @@ void ConsoleZoneLock( return; } - uint16 tmp = content_db.GetZoneID(args[1].c_str()); + uint16 tmp = ZoneID(args[1].c_str()); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, false)) { - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", ZoneName(tmp)); } else { connection->SendLine("Failed to change lock"); @@ -830,8 +831,8 @@ void ConsoleSignalCharByName( sizeof(CZClientSignalByName_Struct) + message_len ); CZClientSignalByName_Struct *CZSC = (CZClientSignalByName_Struct *) pack->pBuffer; - strn0cpy(CZSC->Name, (char *) args[0].c_str(), 64); - CZSC->data = atoi(args[1].c_str()); + strn0cpy(CZSC->character_name, (char *) args[0].c_str(), 64); + CZSC->signal = atoi(args[1].c_str()); zoneserver_list.SendPacket(pack); safe_delete(pack); } @@ -936,4 +937,4 @@ void RegisterConsoleFunctions(std::unique_ptr& console) console->RegisterCall("zonestatus", 50, "zonestatus", std::bind(ConsoleZoneStatus, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));console->RegisterCall("ping", 50, "ping", std::bind(ConsoleNull, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("quit", 50, "quit", std::bind(ConsoleQuit, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); console->RegisterCall("exit", 50, "exit", std::bind(ConsoleQuit, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); -} \ No newline at end of file +} diff --git a/world/console.old.cpp b/world/console.old.cpp index e3b530dd3..d7589d6eb 100644 --- a/world/console.old.cpp +++ b/world/console.old.cpp @@ -230,7 +230,7 @@ bool Console::Process() { std::string connecting_ip = inet_ntoa(in); SendMessage(2, StringFormat("Establishing connection from IP: %s Port: %d", inet_ntoa(in), GetPort()).c_str()); - + if (connecting_ip.find("127.0.0.1") != std::string::npos) { SendMessage(2, StringFormat("Connecting established from local host, auto assuming admin").c_str()); state = CONSOLE_STATE_CONNECTED; @@ -244,7 +244,7 @@ bool Console::Process() { } prompt_timer.Disable(); - + } if (timeout_timer.Check()) { @@ -269,7 +269,7 @@ bool Console::Process() { LogInfo("New launcher from [{}]:[{}]", inet_ntoa(in), GetPort()); launcher_list.Add(tcpc); tcpc = 0; - } + } else if(tcpc->GetPacketMode() == EmuTCPConnection::packetModeUCS) { LogInfo("New UCS Connection from [{}]:[{}]", inet_ntoa(in), GetPort()); @@ -281,7 +281,7 @@ bool Console::Process() { LogInfo("New QS Connection from [{}]:[{}]", inet_ntoa(in), GetPort()); QSLink.SetConnection(tcpc); tcpc = 0; - } + } else { LogInfo("Unsupported packet mode from [{}]:[{}]", inet_ntoa(in), GetPort()); } @@ -616,7 +616,7 @@ void Console::ProcessCommand(const char* command) { if(sep.arg[1][0]==0 || sep.arg[2][0] == 0) SendMessage(1, "Usage: movechar [charactername] [zonename]"); else { - if (!content_db.GetZoneID(sep.arg[2])) + if (!ZoneID(sep.arg[2])) SendMessage(1, "Error: Zone '%s' not found", sep.arg[2]); else if (!database.CheckUsedName((char*) sep.arg[1])) { if (!database.MoveCharacterToZone((char*) sep.arg[1], (char*) sep.arg[2])) @@ -711,13 +711,13 @@ void Console::ProcessCommand(const char* command) { if (sep.arg[1][0] >= '0' && sep.arg[1][0] <= '9') s->ZoneServerID = atoi(sep.arg[1]); else - s->zoneid = content_db.GetZoneID(sep.arg[1]); + s->zoneid = ZoneID(sep.arg[1]); ZoneServer* zs = 0; if (s->ZoneServerID != 0) zs = zoneserver_list.FindByID(s->ZoneServerID); else if (s->zoneid != 0) - zs = zoneserver_list.FindByName(content_db.GetZoneName(s->zoneid)); + zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); else SendMessage(1, "Error: ZoneShutdown: neither ID nor name specified"); @@ -828,10 +828,10 @@ void Console::ProcessCommand(const char* command) { zoneserver_list.ListLockedZones(0, this); } else if (strcasecmp(sep.arg[1], "lock") == 0 && admin >= 101) { - uint16 tmp = content_db.GetZoneID(sep.arg[2]); + uint16 tmp = ZoneID(sep.arg[2]); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, true)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", ZoneName(tmp)); else SendMessage(1, "Failed to change lock"); } @@ -839,10 +839,10 @@ void Console::ProcessCommand(const char* command) { SendMessage(1, "Usage: #zonelock lock [zonename]"); } else if (strcasecmp(sep.arg[1], "unlock") == 0 && admin >= 101) { - uint16 tmp = content_db.GetZoneID(sep.arg[2]); + uint16 tmp = ZoneID(sep.arg[2]); if (tmp) { if (zoneserver_list.SetLockedZone(tmp, false)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", content_db.GetZoneName(tmp)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", ZoneName(tmp)); else SendMessage(1, "Failed to change lock"); } diff --git a/world/dynamic_zone.cpp b/world/dynamic_zone.cpp new file mode 100644 index 000000000..dad35db82 --- /dev/null +++ b/world/dynamic_zone.cpp @@ -0,0 +1,160 @@ +#include "dynamic_zone.h" +#include "expedition.h" +#include "expedition_state.h" +#include "worlddb.h" +#include "zonelist.h" +#include "zoneserver.h" +#include "../common/eqemu_logsys.h" +#include "../common/repositories/instance_list_repository.h" + +extern ZSList zoneserver_list; + +Database& DynamicZone::GetDatabase() +{ + return database; +} + +DynamicZone* DynamicZone::FindDynamicZoneByID(uint32_t dz_id) +{ + auto expedition = expedition_state.GetExpeditionByDynamicZoneID(dz_id); + if (expedition) + { + return &expedition->GetDynamicZone(); + } + // todo: other system caches + return nullptr; +} + +DynamicZoneStatus DynamicZone::Process(bool force_expire) +{ + DynamicZoneStatus status = DynamicZoneStatus::Normal; + + if (force_expire || IsExpired()) + { + status = DynamicZoneStatus::Expired; + + auto dz_zoneserver = zoneserver_list.FindByInstanceID(GetInstanceID()); + if (!dz_zoneserver || dz_zoneserver->NumPlayers() == 0) // no clients inside dz + { + status = DynamicZoneStatus::ExpiredEmpty; + + if (force_expire && !m_is_pending_early_shutdown && RuleB(DynamicZone, EmptyShutdownEnabled)) + { + SetSecondsRemaining(RuleI(DynamicZone, EmptyShutdownDelaySeconds)); + m_is_pending_early_shutdown = true; + } + } + } + + return status; +} + +void DynamicZone::SetSecondsRemaining(uint32_t seconds_remaining) +{ + auto now = std::chrono::system_clock::now(); + auto new_remaining = std::chrono::seconds(seconds_remaining); + + auto current_remaining = m_expire_time - now; + if (current_remaining > new_remaining) // reduce only + { + LogDynamicZonesDetail("Updating dynamic zone [{}] instance [{}] seconds remaining to [{}]s", + GetID(), GetInstanceID(), seconds_remaining); + + // preserve original start time and adjust duration instead + m_expire_time = now + new_remaining; + m_duration = std::chrono::duration_cast(m_expire_time - m_start_time); + + InstanceListRepository::UpdateDuration(database, + GetInstanceID(), static_cast(m_duration.count())); + + SendZonesDurationUpdate(); // update zone caches and actual instance's timer + } +} + +void DynamicZone::SendZonesDurationUpdate() +{ + constexpr uint32_t packsize = sizeof(ServerDzSetDuration_Struct); + auto pack = std::make_unique(ServerOP_DzDurationUpdate, packsize); + auto packbuf = reinterpret_cast(pack->pBuffer); + packbuf->dz_id = GetID(); + packbuf->seconds = static_cast(m_duration.count()); + zoneserver_list.SendPacket(pack.get()); +} + +void DynamicZone::HandleZoneMessage(ServerPacket* pack) +{ + switch (pack->opcode) + { + case ServerOP_DzSetCompass: + case ServerOP_DzSetSafeReturn: + case ServerOP_DzSetZoneIn: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto dz = DynamicZone::FindDynamicZoneByID(buf->dz_id); + if (dz) + { + if (pack->opcode == ServerOP_DzSetCompass) + { + dz->SetCompass(buf->zone_id, buf->x, buf->y, buf->z, false); + } + else if (pack->opcode == ServerOP_DzSetSafeReturn) + { + dz->SetSafeReturn(buf->zone_id, buf->x, buf->y, buf->z, buf->heading, false); + } + else if (pack->opcode == ServerOP_DzSetZoneIn) + { + dz->SetZoneInLocation(buf->x, buf->y, buf->z, buf->heading, false); + } + } + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_DzAddRemoveCharacter: + case ServerOP_DzRemoveAllCharacters: + { + auto buf = reinterpret_cast(pack->pBuffer); + ZoneServer* instance_zs = zoneserver_list.FindByInstanceID(buf->instance_id); + if (instance_zs) + { + instance_zs->SendPacket(pack); + } + break; + } + case ServerOP_DzSetSecondsRemaining: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto dz = DynamicZone::FindDynamicZoneByID(buf->dz_id); + if (dz) + { + dz->SetSecondsRemaining(buf->seconds); + } + break; + } + }; +} + +void DynamicZone::SendInstanceAddRemoveCharacter(uint32_t character_id, bool remove) +{ + ZoneServer* instance_zs = zoneserver_list.FindByInstanceID(GetInstanceID()); + if (instance_zs) + { + auto pack = CreateServerAddRemoveCharacterPacket(character_id, remove); + instance_zs->SendPacket(pack.get()); + } +} + +void DynamicZone::SendInstanceRemoveAllCharacters() +{ + ZoneServer* instance_zs = zoneserver_list.FindByInstanceID(GetInstanceID()); + if (instance_zs) + { + auto pack = CreateServerRemoveAllCharactersPacket(); + instance_zs->SendPacket(pack.get()); + } +} + +void DynamicZone::SendGlobalLocationChange(uint16_t server_opcode, const DynamicZoneLocation& location) +{ + auto pack = CreateServerDzLocationPacket(server_opcode, location); + zoneserver_list.SendPacket(pack.get()); +} diff --git a/world/dynamic_zone.h b/world/dynamic_zone.h new file mode 100644 index 000000000..60eb5b65a --- /dev/null +++ b/world/dynamic_zone.h @@ -0,0 +1,41 @@ +#ifndef WORLD_DYNAMIC_ZONE_H +#define WORLD_DYNAMIC_ZONE_H + +#include "../common/dynamic_zone_base.h" + +class Database; +class ServerPacket; + +enum class DynamicZoneStatus +{ + Unknown = 0, + Normal, + Expired, + ExpiredEmpty, +}; + +class DynamicZone : public DynamicZoneBase +{ +public: + using DynamicZoneBase::DynamicZoneBase; // inherit base constructors + + static DynamicZone* FindDynamicZoneByID(uint32_t dz_id); + static void HandleZoneMessage(ServerPacket* pack); + + void SetSecondsRemaining(uint32_t seconds_remaining) override; + + DynamicZoneStatus Process(bool force_expire); + +protected: + Database& GetDatabase() override; + void SendInstanceAddRemoveCharacter(uint32_t character_id, bool remove) override; + void SendInstanceRemoveAllCharacters() override; + void SendGlobalLocationChange(uint16_t server_opcode, const DynamicZoneLocation& location) override; + +private: + void SendZonesDurationUpdate(); + + bool m_is_pending_early_shutdown = false; +}; + +#endif diff --git a/world/eqemu_api_world_data_service.cpp b/world/eqemu_api_world_data_service.cpp index 99cbcebe1..10bf6dab0 100644 --- a/world/eqemu_api_world_data_service.cpp +++ b/world/eqemu_api_world_data_service.cpp @@ -23,6 +23,7 @@ #include "eqemu_api_world_data_service.h" #include "zoneserver.h" #include "zonelist.h" +#include "../common/database_schema.h" extern ZSList zoneserver_list; extern ClientList client_list; @@ -60,6 +61,63 @@ void callGetZoneList(Json::Value &response) } } +void callGetDatabaseSchema(Json::Value &response) +{ + Json::Value player_tables_json; + std::vector player_tables = DatabaseSchema::GetPlayerTables(); + for (const auto &table : player_tables) { + player_tables_json.append(table); + } + + Json::Value content_tables_json; + std::vector content_tables = DatabaseSchema::GetContentTables(); + for (const auto &table : content_tables) { + content_tables_json.append(table); + } + + Json::Value server_tables_json; + std::vector server_tables = DatabaseSchema::GetServerTables(); + for (const auto &table : server_tables) { + server_tables_json.append(table); + } + + Json::Value login_tables_json; + std::vector login_tables = DatabaseSchema::GetLoginTables(); + for (const auto &table : login_tables) { + login_tables_json.append(table); + } + + Json::Value state_tables_json; + std::vector state_tables = DatabaseSchema::GetStateTables(); + for (const auto &table : state_tables) { + state_tables_json.append(table); + } + + Json::Value version_tables_json; + std::vector version_tables = DatabaseSchema::GetVersionTables(); + for (const auto &table : version_tables) { + version_tables_json.append(table); + } + + Json::Value character_table_columns_json; + std::map character_table = DatabaseSchema::GetCharacterTables(); + for (const auto &ctc : character_table) { + character_table_columns_json[ctc.first] = ctc.second; + } + + Json::Value schema; + + schema["character_table_columns"] = character_table_columns_json; + schema["content_tables"] = content_tables_json; + schema["login_tables"] = login_tables_json; + schema["player_tables"] = player_tables_json; + schema["server_tables"] = server_tables_json; + schema["state_tables"] = state_tables_json; + schema["version_tables"] = version_tables_json; + + response.append(schema); +} + void callGetClientList(Json::Value &response) { client_list.GetClientList(response); @@ -72,6 +130,9 @@ void EQEmuApiWorldDataService::get(Json::Value &response, const std::vector #include @@ -156,7 +157,7 @@ void EQLConfig::StartZone(Const_char *zone_ref) { bool EQLConfig::BootStaticZone(Const_char *short_name, uint16 port) { //make sure the short name is valid. - if(content_db.GetZoneID(short_name) == 0) + if(ZoneID(short_name) == 0) return false; //database update @@ -191,7 +192,7 @@ bool EQLConfig::BootStaticZone(Const_char *short_name, uint16 port) { bool EQLConfig::ChangeStaticZone(Const_char *short_name, uint16 port) { //make sure the short name is valid. - if(content_db.GetZoneID(short_name) == 0) + if(ZoneID(short_name) == 0) return false; //check internal state diff --git a/world/eqw.cpp b/world/eqw.cpp index a0c10fead..8d997edca 100644 --- a/world/eqw.cpp +++ b/world/eqw.cpp @@ -188,7 +188,7 @@ std::map EQW::GetPlayerDetails(Const_char *char_name) { res["character"] = cle->name(); res["account"] = cle->AccountName(); res["account_id"] = itoa(cle->AccountID()); - res["location_short"] = cle->zone()?content_db.GetZoneName(cle->zone()):"No Zone"; + res["location_short"] = cle->zone()?ZoneName(cle->zone()):"No Zone"; res["location_long"] = res["location_short"]; res["location_id"] = itoa(cle->zone()); res["ip"] = long2ip(cle->GetIP()); diff --git a/world/expedition.cpp b/world/expedition.cpp new file mode 100644 index 000000000..a68ddd093 --- /dev/null +++ b/world/expedition.cpp @@ -0,0 +1,230 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition.h" +#include "expedition_database.h" +#include "cliententry.h" +#include "clientlist.h" +#include "zonelist.h" +#include "zoneserver.h" +#include "../common/eqemu_logsys.h" +#include "../common/rulesys.h" + +extern ClientList client_list; +extern ZSList zoneserver_list; + +Expedition::Expedition() : + m_choose_leader_cooldown_timer{ static_cast(RuleI(Expedition, ChooseLeaderCooldownTime)) } +{ + m_warning_cooldown_timer.Enable(); +} + +void Expedition::SetDynamicZone(DynamicZone&& dz) +{ + dz.SetName(GetName()); + dz.SetLeaderName(GetLeaderName()); + + m_dynamic_zone = std::move(dz); +} + +void Expedition::RemoveMember(uint32_t character_id) +{ + RemoveInternalMember(character_id); + + if (character_id == m_leader.id) + { + ChooseNewLeader(); + } +} + +void Expedition::ChooseNewLeader() +{ + if (m_members.empty() || !m_choose_leader_cooldown_timer.Check()) + { + m_choose_leader_needed = true; + return; + } + + auto it = std::find_if(m_members.begin(), m_members.end(), [&](const DynamicZoneMember& member) { + if (member.id != m_leader.id && member.IsOnline()) { + auto member_cle = client_list.FindCLEByCharacterID(member.id); + return (member_cle && member_cle->GetOnline() == CLE_Status::InZone); + } + return false; + }); + + if (it == m_members.end()) + { + // no online members found, fallback to choosing any member + it = std::find_if(m_members.begin(), m_members.end(), + [&](const DynamicZoneMember& member) { return (member.id != m_leader.id); }); + } + + if (it != m_members.end() && SetNewLeader(*it)) + { + m_choose_leader_needed = false; + } +} + +bool Expedition::SetNewLeader(const DynamicZoneMember& member) +{ + if (!HasMember(member.id)) + { + return false; + } + + LogExpeditionsModerate("Replacing [{}] leader [{}] with [{}]", m_id, m_leader.name, member.name); + ExpeditionDatabase::UpdateLeaderID(m_id, member.id); + m_leader = member; + m_dynamic_zone.SetLeaderName(m_leader.name); + SendZonesLeaderChanged(); + return true; +} + +void Expedition::SendZonesExpeditionDeleted() +{ + uint32_t pack_size = sizeof(ServerExpeditionID_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionDeleted, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + zoneserver_list.SendPacket(pack.get()); +} + +void Expedition::SendZonesExpireWarning(uint32_t minutes_remaining) +{ + uint32_t pack_size = sizeof(ServerExpeditionExpireWarning_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionExpireWarning, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->minutes_remaining = minutes_remaining; + zoneserver_list.SendPacket(pack.get()); +} + +void Expedition::SendZonesLeaderChanged() +{ + uint32_t pack_size = sizeof(ServerExpeditionLeaderID_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionLeaderChanged, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->leader_id = m_leader.id; + zoneserver_list.SendPacket(pack.get()); +} + +void Expedition::CheckExpireWarning() +{ + if (m_warning_cooldown_timer.Check(false)) + { + using namespace std::chrono_literals; + auto remaining = GetDynamicZone().GetDurationRemaining(); + if ((remaining > 14min && remaining < 15min) || + (remaining > 4min && remaining < 5min) || + (remaining > 0min && remaining < 1min)) + { + int minutes = std::chrono::duration_cast(remaining).count() + 1; + SendZonesExpireWarning(minutes); + m_warning_cooldown_timer.Start(70000); // 1 minute 10 seconds + } + } +} + +void Expedition::CheckLeader() +{ + if (m_choose_leader_needed) + { + ChooseNewLeader(); + } +} + +bool Expedition::Process() +{ + // returns true if expedition needs to be deleted from world cache and db + // expedition is not deleted until its dz has no clients to prevent exploits + auto status = m_dynamic_zone.Process(IsEmpty()); // force expire if no members + if (status == DynamicZoneStatus::ExpiredEmpty) + { + LogExpeditions("Expedition [{}] expired or empty, notifying zones and deleting", GetID()); + SendZonesExpeditionDeleted(); + return true; + } + + CheckExpireWarning(); + CheckLeader(); + + return false; +} + +void Expedition::UpdateMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status) +{ + SetInternalMemberStatus(character_id, status); + + // any member status update will trigger a leader fix if leader was offline + if (m_leader.status == DynamicZoneMemberStatus::Offline) + { + ChooseNewLeader(); + } +} + +void Expedition::SendZoneMemberStatuses(uint16_t zone_id, uint16_t instance_id) +{ + const auto& members = GetMembers(); + + uint32_t members_count = static_cast(members.size()); + uint32_t entries_size = sizeof(ServerExpeditionMemberStatusEntry_Struct) * members_count; + uint32_t pack_size = sizeof(ServerExpeditionMemberStatuses_Struct) + entries_size; + auto pack = std::make_unique(ServerOP_ExpeditionGetMemberStatuses, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->count = members_count; + + for (int i = 0; i < members.size(); ++i) + { + buf->entries[i].character_id = members[i].id; + buf->entries[i].online_status = static_cast(members[i].status); + } + + zoneserver_list.SendPacket(zone_id, instance_id, pack.get()); +} + +void Expedition::CacheMemberStatuses() +{ + // called when a new expedition is cached to fill member statuses + std::string zone_name{}; + std::vector all_clients; + all_clients.reserve(client_list.GetClientCount()); + client_list.GetClients(zone_name.c_str(), all_clients); + + for (const auto& member : m_members) + { + auto it = std::find_if(all_clients.begin(), all_clients.end(), + [&](const ClientListEntry* cle) { return (cle && cle->CharID() == member.id); }); + + auto status = DynamicZoneMemberStatus::Offline; + if (it != all_clients.end()) + { + status = DynamicZoneMemberStatus::Online; + if (GetDynamicZone().IsSameDz((*it)->zone(), (*it)->instance())) + { + status = DynamicZoneMemberStatus::InDynamicZone; + } + } + + SetInternalMemberStatus(member.id, status); + } +} diff --git a/world/expedition.h b/world/expedition.h new file mode 100644 index 000000000..119f78685 --- /dev/null +++ b/world/expedition.h @@ -0,0 +1,57 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef WORLD_EXPEDITION_H +#define WORLD_EXPEDITION_H + +#include "dynamic_zone.h" +#include "../common/expedition_base.h" +#include "../common/timer.h" +#include + +class Expedition : public ExpeditionBase +{ +public: + Expedition(); + + void RemoveMember(uint32_t character_id); + void CacheMemberStatuses(); + void CheckExpireWarning(); + void CheckLeader(); + void ChooseNewLeader(); + DynamicZone& GetDynamicZone() { return m_dynamic_zone; } + bool Process(); + void SendZoneMemberStatuses(uint16_t zone_id, uint16_t instance_id); + void SendZonesExpeditionDeleted(); + void SendZonesExpireWarning(uint32_t minutes_remaining); + void SetDynamicZone(DynamicZone&& dz); + bool SetNewLeader(const DynamicZoneMember& member); + void UpdateMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status); + +private: + void SendZonesLeaderChanged(); + + bool m_choose_leader_needed = false; + Timer m_choose_leader_cooldown_timer; + Timer m_warning_cooldown_timer; + DynamicZone m_dynamic_zone; +}; + +#endif diff --git a/world/expedition_database.cpp b/world/expedition_database.cpp new file mode 100644 index 000000000..c3738901a --- /dev/null +++ b/world/expedition_database.cpp @@ -0,0 +1,128 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition_database.h" +#include "expedition.h" +#include "worlddb.h" + +void ExpeditionDatabase::PurgeExpiredExpeditions() +{ + std::string query = SQL( + SELECT + expeditions.id + FROM expeditions + LEFT JOIN dynamic_zones ON expeditions.dynamic_zone_id = dynamic_zones.id + LEFT JOIN instance_list ON dynamic_zones.instance_id = instance_list.id + LEFT JOIN + ( + SELECT expedition_id, COUNT(IF(is_current_member = TRUE, 1, NULL)) member_count + FROM expedition_members + GROUP BY expedition_id + ) expedition_members + ON expedition_members.expedition_id = expeditions.id + WHERE + instance_list.id IS NULL + OR expedition_members.member_count IS NULL + OR expedition_members.member_count = 0 + OR (instance_list.start_time + instance_list.duration) <= UNIX_TIMESTAMP(); + ); + + auto results = database.QueryDatabase(query); + if (results.Success()) + { + std::vector expedition_ids; + for (auto row = results.begin(); row != results.end(); ++row) + { + expedition_ids.emplace_back(static_cast(strtoul(row[0], nullptr, 10))); + } + + if (!expedition_ids.empty()) + { + ExpeditionDatabase::MoveMembersToSafeReturn(expedition_ids); + ExpeditionDatabase::DeleteExpeditions(expedition_ids); + } + } +} + +void ExpeditionDatabase::PurgeExpiredCharacterLockouts() +{ + std::string query = SQL( + DELETE FROM character_expedition_lockouts + WHERE expire_time <= NOW(); + ); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::DeleteExpeditions(const std::vector& expedition_ids) +{ + LogExpeditionsDetail("Deleting [{}] expedition(s)", expedition_ids.size()); + + std::string expedition_ids_query = fmt::format("{}", fmt::join(expedition_ids, ",")); + + if (!expedition_ids_query.empty()) + { + auto query = fmt::format("DELETE FROM expeditions WHERE id IN ({});", expedition_ids_query); + database.QueryDatabase(query); + + query = fmt::format("DELETE FROM expedition_members WHERE expedition_id IN ({});", expedition_ids_query); + database.QueryDatabase(query); + + query = fmt::format("DELETE FROM expedition_lockouts WHERE expedition_id IN ({});", expedition_ids_query); + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::UpdateLeaderID(uint32_t expedition_id, uint32_t leader_id) +{ + LogExpeditionsDetail("Updating leader [{}] for expedition [{}]", leader_id, expedition_id); + + auto query = fmt::format(SQL( + UPDATE expeditions SET leader_id = {} WHERE id = {}; + ), leader_id, expedition_id); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::MoveMembersToSafeReturn(const std::vector& expedition_ids) +{ + LogExpeditionsDetail("Moving members from [{}] expedition(s) to safereturn", expedition_ids.size()); + + // only offline members still in expired dz zones should be updated here + std::string query = fmt::format(SQL( + UPDATE character_data + INNER JOIN expedition_members ON character_data.id = expedition_members.character_id + INNER JOIN expeditions ON expedition_members.expedition_id = expeditions.id + INNER JOIN dynamic_zones ON expeditions.dynamic_zone_id = dynamic_zones.id + INNER JOIN instance_list ON dynamic_zones.instance_id = instance_list.id + AND character_data.zone_instance = instance_list.id + AND character_data.zone_id = instance_list.zone + SET + zone_id = IF(safe_return_zone_id > 0, safe_return_zone_id, zone_id), + zone_instance = IF(safe_return_zone_id > 0, 0, zone_instance), + x = IF(safe_return_zone_id > 0, safe_return_x, x), + y = IF(safe_return_zone_id > 0, safe_return_y, y), + z = IF(safe_return_zone_id > 0, safe_return_z, z), + heading = IF(safe_return_zone_id > 0, safe_return_heading, heading) + WHERE expeditions.id IN ({}); + ), fmt::join(expedition_ids, ",")); + + database.QueryDatabase(query); +} diff --git a/world/expedition_database.h b/world/expedition_database.h new file mode 100644 index 000000000..b86fd8b5d --- /dev/null +++ b/world/expedition_database.h @@ -0,0 +1,38 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef WORLD_EXPEDITION_DATABASE_H +#define WORLD_EXPEDITION_DATABASE_H + +#include +#include + +class Expedition; + +namespace ExpeditionDatabase +{ + void DeleteExpeditions(const std::vector& expedition_ids); + void MoveMembersToSafeReturn(const std::vector& expedition_ids); + void PurgeExpiredExpeditions(); + void PurgeExpiredCharacterLockouts(); + void UpdateLeaderID(uint32_t expedition_id, uint32_t leader_id); +}; + +#endif diff --git a/world/expedition_message.cpp b/world/expedition_message.cpp new file mode 100644 index 000000000..36eee5ceb --- /dev/null +++ b/world/expedition_message.cpp @@ -0,0 +1,203 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition.h" +#include "expedition_message.h" +#include "expedition_state.h" +#include "cliententry.h" +#include "clientlist.h" +#include "zonelist.h" +#include "zoneserver.h" +#include "../common/servertalk.h" +#include + +extern ClientList client_list; +extern ZSList zoneserver_list; + +void ExpeditionMessage::HandleZoneMessage(ServerPacket* pack) +{ + switch (pack->opcode) + { + case ServerOP_ExpeditionCreate: + { + auto buf = reinterpret_cast(pack->pBuffer); + expedition_state.CacheFromDatabase(buf->expedition_id); + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_ExpeditionMemberChange: + { + auto buf = reinterpret_cast(pack->pBuffer); + expedition_state.MemberChange(buf->expedition_id, { buf->char_id, buf->char_name }, buf->removed); + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_ExpeditionMemberSwap: + { + auto buf = reinterpret_cast(pack->pBuffer); + expedition_state.MemberChange(buf->expedition_id, { buf->add_char_id, buf->add_char_name }, false); + expedition_state.MemberChange(buf->expedition_id, { buf->remove_char_id, buf->remove_char_name }, true); + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_ExpeditionMembersRemoved: + { + auto buf = reinterpret_cast(pack->pBuffer); + expedition_state.RemoveAllMembers(buf->expedition_id); + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_ExpeditionMemberStatus: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = expedition_state.GetExpedition(buf->expedition_id); + if (expedition) + { + auto status = static_cast(buf->status); + expedition->UpdateMemberStatus(buf->character_id, status); + } + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_ExpeditionGetMemberStatuses: + { + ExpeditionMessage::GetMemberStatuses(pack); + break; + } + case ServerOP_ExpeditionDzAddPlayer: + { + ExpeditionMessage::AddPlayer(pack); + break; + } + case ServerOP_ExpeditionDzMakeLeader: + { + ExpeditionMessage::MakeLeader(pack); + break; + } + case ServerOP_ExpeditionCharacterLockout: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto cle = client_list.FindCLEByCharacterID(buf->character_id); + if (cle && cle->Server()) + { + cle->Server()->SendPacket(pack); + } + break; + } + case ServerOP_ExpeditionSaveInvite: + { + ExpeditionMessage::SaveInvite(pack); + break; + } + case ServerOP_ExpeditionRequestInvite: + { + ExpeditionMessage::RequestInvite(pack); + break; + } + } +} + +void ExpeditionMessage::AddPlayer(ServerPacket* pack) +{ + auto buf = reinterpret_cast(pack->pBuffer); + + ClientListEntry* invited_cle = client_list.FindCharacter(buf->target_name); + if (invited_cle && invited_cle->Server()) + { + // continue in the add target's zone + buf->is_char_online = true; + invited_cle->Server()->SendPacket(pack); + } + else + { + // add target not online, return to inviter + ClientListEntry* inviter_cle = client_list.FindCharacter(buf->requester_name); + if (inviter_cle && inviter_cle->Server()) + { + inviter_cle->Server()->SendPacket(pack); + } + } +} + +void ExpeditionMessage::MakeLeader(ServerPacket* pack) +{ + auto buf = reinterpret_cast(pack->pBuffer); + + // notify requester (old leader) and new leader of the result + ZoneServer* new_leader_zs = nullptr; + ClientListEntry* new_leader_cle = client_list.FindCharacter(buf->new_leader_name); + if (new_leader_cle && new_leader_cle->Server()) + { + auto expedition = expedition_state.GetExpedition(buf->expedition_id); + if (expedition) + { + buf->is_success = expedition->SetNewLeader({ new_leader_cle->CharID(), new_leader_cle->name() }); + } + + buf->is_online = true; + new_leader_zs = new_leader_cle->Server(); + new_leader_zs->SendPacket(pack); + } + + // if old and new leader are in the same zone only send one message + ClientListEntry* requester_cle = client_list.FindCLEByCharacterID(buf->requester_id); + if (requester_cle && requester_cle->Server() && requester_cle->Server() != new_leader_zs) + { + requester_cle->Server()->SendPacket(pack); + } +} + +void ExpeditionMessage::GetMemberStatuses(ServerPacket* pack) +{ + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = expedition_state.GetExpedition(buf->expedition_id); + if (expedition) + { + expedition->SendZoneMemberStatuses(buf->sender_zone_id, buf->sender_instance_id); + } +} + +void ExpeditionMessage::SaveInvite(ServerPacket* pack) +{ + auto buf = reinterpret_cast(pack->pBuffer); + + ClientListEntry* invited_cle = client_list.FindCharacter(buf->target_name); + if (invited_cle) + { + // store packet on cle and re-send it when client requests it + buf->is_char_online = true; + pack->opcode = ServerOP_ExpeditionDzAddPlayer; + invited_cle->SetPendingExpeditionInvite(pack); + } +} + +void ExpeditionMessage::RequestInvite(ServerPacket* pack) +{ + auto buf = reinterpret_cast(pack->pBuffer); + ClientListEntry* cle = client_list.FindCLEByCharacterID(buf->character_id); + if (cle) + { + auto invite_pack = cle->GetPendingExpeditionInvite(); + if (invite_pack && cle->Server()) + { + cle->Server()->SendPacket(invite_pack.get()); + } + } +} diff --git a/world/expedition_message.h b/world/expedition_message.h new file mode 100644 index 000000000..135ef0cba --- /dev/null +++ b/world/expedition_message.h @@ -0,0 +1,36 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef WORLD_EXPEDITION_MESSAGE_H +#define WORLD_EXPEDITION_MESSAGE_H + +class ServerPacket; + +namespace ExpeditionMessage +{ + void AddPlayer(ServerPacket* pack); + void GetMemberStatuses(ServerPacket* pack); + void HandleZoneMessage(ServerPacket* pack); + void MakeLeader(ServerPacket* pack); + void RequestInvite(ServerPacket* pack); + void SaveInvite(ServerPacket* pack); +}; + +#endif diff --git a/world/expedition_state.cpp b/world/expedition_state.cpp new file mode 100644 index 000000000..8f3b6b423 --- /dev/null +++ b/world/expedition_state.cpp @@ -0,0 +1,170 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition_state.h" +#include "expedition.h" +#include "expedition_database.h" +#include "worlddb.h" +#include "../common/eqemu_logsys.h" +#include "../common/repositories/expedition_members_repository.h" +#include + +ExpeditionState expedition_state; + +Expedition* ExpeditionState::GetExpedition(uint32_t expedition_id) +{ + auto it = std::find_if(m_expeditions.begin(), m_expeditions.end(), + [&](const std::unique_ptr& expedition) { + return expedition->GetID() == expedition_id; + }); + + return (it != m_expeditions.end()) ? it->get() : nullptr; +} + +Expedition* ExpeditionState::GetExpeditionByDynamicZoneID(uint32_t dz_id) +{ + auto it = std::find_if(m_expeditions.begin(), m_expeditions.end(), + [&](const std::unique_ptr& expedition) { + return expedition->GetDynamicZone().GetID() == dz_id; + }); + + return (it != m_expeditions.end()) ? it->get() : nullptr; +} + +void ExpeditionState::CacheFromDatabase(uint32_t expedition_id) +{ + if (expedition_id == 0 || GetExpedition(expedition_id)) + { + return; + } + + auto expedition = ExpeditionsRepository::GetWithLeaderName(database, expedition_id); + CacheExpeditions({ std::move(expedition) }); +} + +void ExpeditionState::CacheAllFromDatabase() +{ + BenchTimer benchmark; + + auto expeditions = ExpeditionsRepository::GetAllWithLeaderName(database); + m_expeditions.clear(); + m_expeditions.reserve(expeditions.size()); + + CacheExpeditions(std::move(expeditions)); + + LogExpeditions("Caching [{}] expedition(s) took [{}s]", m_expeditions.size(), benchmark.elapsed()); +} + +void ExpeditionState::CacheExpeditions( + std::vector&& expedition_entries) +{ + // bulk load expedition dzs and members before caching + std::vector expedition_ids; + std::vector dynamic_zone_ids; + for (const auto& entry : expedition_entries) + { + expedition_ids.emplace_back(entry.id); + dynamic_zone_ids.emplace_back(entry.dynamic_zone_id); + } + + auto dynamic_zones = DynamicZonesRepository::GetWithInstance(database, dynamic_zone_ids); + auto expedition_members = ExpeditionMembersRepository::GetWithNames(database, expedition_ids); + + for (auto& entry : expedition_entries) + { + auto expedition = std::make_unique(); + expedition->LoadRepositoryResult(std::move(entry)); + + auto dz_entry_iter = std::find_if(dynamic_zones.begin(), dynamic_zones.end(), + [&](const DynamicZonesRepository::DynamicZoneInstance& dz_entry) { + return dz_entry.id == entry.dynamic_zone_id; + }); + + if (dz_entry_iter != dynamic_zones.end()) + { + expedition->SetDynamicZone(std::move(*dz_entry_iter)); + } + + for (auto& member : expedition_members) + { + if (member.expedition_id == expedition->GetID()) + { + expedition->AddMemberFromRepositoryResult(std::move(member)); + } + } + + // stored on expedition in db but on dz in memory cache + expedition->GetDynamicZone().SetMinPlayers(entry.min_players); + expedition->GetDynamicZone().SetMaxPlayers(entry.max_players); + + expedition->CacheMemberStatuses(); + + m_expeditions.emplace_back(std::move(expedition)); + } +} + +void ExpeditionState::MemberChange( + uint32_t expedition_id, const DynamicZoneMember& member, bool remove) +{ + auto expedition = GetExpedition(expedition_id); + if (expedition) + { + if (remove) { + expedition->RemoveMember(member.id); + } else { + expedition->AddInternalMember(member); + } + } +} + +void ExpeditionState::RemoveAllMembers(uint32_t expedition_id) +{ + auto expedition = GetExpedition(expedition_id); + if (expedition) + { + expedition->ClearInternalMembers(); + } +} + +void ExpeditionState::Process() +{ + if (!m_process_throttle_timer.Check()) + { + return; + } + + std::vector expedition_ids; + + for (auto it = m_expeditions.begin(); it != m_expeditions.end();) + { + bool is_deleted = (*it)->Process(); + if (is_deleted) + { + expedition_ids.emplace_back((*it)->GetID()); + } + it = is_deleted ? m_expeditions.erase(it) : it + 1; + } + + if (!expedition_ids.empty()) + { + ExpeditionDatabase::MoveMembersToSafeReturn(expedition_ids); + ExpeditionDatabase::DeleteExpeditions(expedition_ids); + } +} diff --git a/world/expedition_state.h b/world/expedition_state.h new file mode 100644 index 000000000..90f4a4293 --- /dev/null +++ b/world/expedition_state.h @@ -0,0 +1,52 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef WORLD_EXPEDITION_STATE_H +#define WORLD_EXPEDITION_STATE_H + +#include "../common/repositories/expeditions_repository.h" +#include "../common/rulesys.h" +#include "../common/timer.h" +#include +#include + +extern class ExpeditionState expedition_state; + +class Expedition; +struct DynamicZoneMember; + +class ExpeditionState +{ +public: + void CacheExpeditions(std::vector&& expedition_entries); + void CacheFromDatabase(uint32_t expedition_id); + void CacheAllFromDatabase(); + Expedition* GetExpedition(uint32_t expedition_id); + Expedition* GetExpeditionByDynamicZoneID(uint32_t dz_id); + void MemberChange(uint32_t expedition_id, const DynamicZoneMember& member, bool remove); + void Process(); + void RemoveAllMembers(uint32_t expedition_id); + +private: + std::vector> m_expeditions; + Timer m_process_throttle_timer{static_cast(RuleI(DynamicZone, WorldProcessRate))}; +}; + +#endif diff --git a/world/launcher_link.cpp b/world/launcher_link.cpp index d60933b41..8f3fa1aaf 100644 --- a/world/launcher_link.cpp +++ b/world/launcher_link.cpp @@ -45,7 +45,7 @@ LauncherLink::LauncherLink(int id, std::shared_ptrOnMessage(std::bind(&LauncherLink::ProcessMessage, this, std::placeholders::_1, std::placeholders::_2)); - m_process_timer.reset(new EQ::Timer(100, true, std::bind(&LauncherLink::Process, this, std::placeholders::_1))); + m_process_timer = std::make_unique(100, true, std::bind(&LauncherLink::Process, this, std::placeholders::_1)); } LauncherLink::~LauncherLink() { @@ -296,4 +296,4 @@ void LauncherLink::Shutdown() { auto pack = new ServerPacket(ServerOP_ShutdownAll); SendPacket(pack); delete pack; -} \ No newline at end of file +} diff --git a/world/login_server.cpp b/world/login_server.cpp index 2533a9bad..da649495e 100644 --- a/world/login_server.cpp +++ b/world/login_server.cpp @@ -92,7 +92,7 @@ void LoginServer::ProcessUsertoWorldReqLeg(uint16_t opcode, EQ::Net::Packet &p) utwrs->response = UserToWorldStatusSuccess; if (Config->Locked) { - if (status < 100) { + if (status < (RuleI(GM, MinStatusToBypassLockedServer))) { LogDebug("[ProcessUsertoWorldReqLeg] Server locked and status is not high enough for account_id [{0}]", utwr->lsaccountid); utwrs->response = UserToWorldStatusWorldUnavail; SendPacket(&outpack); @@ -101,7 +101,7 @@ void LoginServer::ProcessUsertoWorldReqLeg(uint16_t opcode, EQ::Net::Packet &p) } int32 x = Config->MaxClients; - if ((int32) numplayers >= x && x != -1 && x != 255 && status < 80) { + if ((int32) numplayers >= x && x != -1 && x != 255 && status < (RuleI(GM, MinStatusToBypassLockedServer))) { LogDebug("[ProcessUsertoWorldReqLeg] World at capacity account_id [{0}]", utwr->lsaccountid); utwrs->response = UserToWorldStatusWorldAtCapacity; SendPacket(&outpack); @@ -170,7 +170,7 @@ void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) utwrs->response = UserToWorldStatusSuccess; if (Config->Locked == true) { - if (status < 100) { + if (status < (RuleI(GM, MinStatusToBypassLockedServer))) { LogDebug("[ProcessUsertoWorldReq] Server locked and status is not high enough for account_id [{0}]", utwr->lsaccountid); utwrs->response = UserToWorldStatusWorldUnavail; SendPacket(&outpack); @@ -179,7 +179,7 @@ void LoginServer::ProcessUsertoWorldReq(uint16_t opcode, EQ::Net::Packet &p) } int32 x = Config->MaxClients; - if ((int32) numplayers >= x && x != -1 && x != 255 && status < 80) { + if ((int32) numplayers >= x && x != -1 && x != 255 && status < (RuleI(GM, MinStatusToBypassLockedServer))) { LogDebug("[ProcessUsertoWorldReq] World at capacity account_id [{0}]", utwr->lsaccountid); utwrs->response = UserToWorldStatusWorldAtCapacity; SendPacket(&outpack); @@ -342,7 +342,7 @@ bool LoginServer::Connect() } if (IsLegacy) { - legacy_client.reset(new EQ::Net::ServertalkLegacyClient(LoginServerAddress, LoginServerPort, false)); + legacy_client = std::make_unique(LoginServerAddress, LoginServerPort, false); legacy_client->OnConnect( [this](EQ::Net::ServertalkLegacyClient *client) { if (client) { @@ -356,12 +356,12 @@ bool LoginServer::Connect() SendStatus(); zoneserver_list.SendLSZones(); - statusupdate_timer.reset( - new EQ::Timer( + statusupdate_timer = std::make_unique( + LoginServer_StatusUpdateInterval, true, [this](EQ::Timer *t) { SendStatus(); } - ) + ); } else { @@ -448,7 +448,7 @@ bool LoginServer::Connect() ); } else { - client.reset(new EQ::Net::ServertalkClient(LoginServerAddress, LoginServerPort, false, "World", "")); + client = std::make_unique(LoginServerAddress, LoginServerPort, false, "World", ""); client->OnConnect( [this](EQ::Net::ServertalkClient *client) { if (client) { @@ -461,12 +461,12 @@ bool LoginServer::Connect() SendStatus(); zoneserver_list.SendLSZones(); - statusupdate_timer.reset( - new EQ::Timer( + statusupdate_timer = std::make_unique( + LoginServer_StatusUpdateInterval, true, [this](EQ::Timer *t) { SendStatus(); } - )); + ); } else { LogInfo( @@ -552,7 +552,7 @@ bool LoginServer::Connect() ); } - m_keepalive.reset(new EQ::Timer(5000, true, std::bind(&LoginServer::OnKeepAlive, this, std::placeholders::_1))); + m_keepalive = std::make_unique(5000, true, std::bind(&LoginServer::OnKeepAlive, this, std::placeholders::_1)); return true; } @@ -649,4 +649,4 @@ void LoginServer::OnKeepAlive(EQ::Timer *t) { ServerPacket pack(ServerOP_KeepAlive, 0); SendPacket(&pack); -} \ No newline at end of file +} diff --git a/world/main.cpp b/world/main.cpp index 03a39ea79..f150db0e4 100644 --- a/world/main.cpp +++ b/world/main.cpp @@ -18,6 +18,8 @@ * */ +#define PLATFORM_WORLD 1 + #include "../common/global_define.h" #include @@ -86,11 +88,18 @@ union semun { #include "queryserv.h" #include "web_interface.h" #include "console.h" +#include "expedition_database.h" +#include "expedition_state.h" #include "../common/net/servertalk_server.h" #include "../zone/data_bucket.h" #include "world_server_command_handler.h" +#include "../common/content/world_content_service.h" +#include "../common/repositories/merchantlist_temp_repository.h" +#include "world_store.h" +#include "world_event_scheduler.h" +WorldStore world_store; ClientList client_list; GroupLFPList LFPGroupList; ZSList zoneserver_list; @@ -99,13 +108,15 @@ UCSConnection UCSLink; QueryServConnection QSLink; LauncherList launcher_list; AdventureManager adventure_manager; -EQEmu::Random emu_random; +WorldEventScheduler event_scheduler; +EQ::Random emu_random; volatile bool RunLoops = true; uint32 numclients = 0; uint32 numzones = 0; bool holdzones = false; const WorldConfig *Config; EQEmuLogSys LogSys; +WorldContentService content_service; WebInterfaceList web_interface; void CatchSignal(int sig_num); @@ -147,7 +158,8 @@ void LoadDatabaseConnections() Config->ContentDbUsername.c_str(), Config->ContentDbPassword.c_str(), Config->ContentDbName.c_str(), - Config->ContentDbPort + Config->ContentDbPort, + "content" )) { LogError("Cannot continue without a content database connection"); std::exit(1); @@ -219,7 +231,7 @@ void RegisterLoginservers() /** * World process entrypoint - * + * * @param argc * @param argv * @return @@ -323,7 +335,9 @@ int main(int argc, char** argv) { database.PurgeAllDeletedDataBuckets(); LogInfo("Loading zones"); - content_db.LoadZoneNames(); + + world_store.LoadZones(); + LogInfo("Clearing groups"); database.ClearGroup(); LogInfo("Clearing raids"); @@ -379,7 +393,7 @@ int main(int argc, char** argv) { } } - EQEmu::InitializeDynamicLookups(); + EQ::InitializeDynamicLookups(); LogInfo("Initialized dynamic dictionary entries"); if (RuleB(World, ClearTempMerchantlist)) { @@ -413,25 +427,35 @@ int main(int argc, char** argv) { adventure_manager.LoadLeaderboardInfo(); + LogInfo("Purging expired expeditions"); + ExpeditionDatabase::PurgeExpiredExpeditions(); + ExpeditionDatabase::PurgeExpiredCharacterLockouts(); + LogInfo("Purging expired instances"); database.PurgeExpiredInstances(); Timer PurgeInstanceTimer(450000); PurgeInstanceTimer.Start(450000); + LogInfo("Loading active expeditions"); + expedition_state.CacheAllFromDatabase(); + LogInfo("Loading char create info"); content_db.LoadCharacterCreateAllocations(); content_db.LoadCharacterCreateCombos(); + event_scheduler.SetDatabase(&database)->LoadScheduledEvents(); + std::unique_ptr console; if (Config->TelnetEnabled) { LogInfo("Console (TCP) listener started"); - console.reset(new EQ::Net::ConsoleServer(Config->TelnetIP, Config->TelnetTCPPort)); + console = std::make_unique(Config->TelnetIP, Config->TelnetTCPPort); RegisterConsoleFunctions(console); } + zoneserver_list.Init(); std::unique_ptr server_connection; - server_connection.reset(new EQ::Net::ServertalkServer()); + server_connection = std::make_unique(); EQ::Net::ServertalkServerOptions server_opts; server_opts.port = Config->WorldTCPPort; @@ -495,14 +519,19 @@ int main(int argc, char** argv) { zoneserver_list.UpdateUCSServerAvailable(); }); - server_connection->OnConnectionRemoved("UCS", [](std::shared_ptr connection) { - LogInfo("Removed UCS Server connection from [{0}]", - connection->GetUUID()); + server_connection->OnConnectionRemoved( + "UCS", [](std::shared_ptr connection) { + LogInfo("Connection lost from UCS Server [{0}]", connection->GetUUID()); - UCSLink.SetConnection(nullptr); + auto ucs_connection = UCSLink.GetConnection(); - zoneserver_list.UpdateUCSServerAvailable(false); - }); + if (ucs_connection->GetUUID() == connection->GetUUID()) { + LogInfo("Removing currently active UCS connection"); + UCSLink.SetConnection(nullptr); + zoneserver_list.UpdateUCSServerAvailable(false); + } + } + ); server_connection->OnConnectionIdentified("WebInterface", [](std::shared_ptr connection) { LogInfo("New WebInterface Server connection from [{2}] at [{0}:{1}]", @@ -578,11 +607,14 @@ int main(int argc, char** argv) { } } + event_scheduler.Process(&zoneserver_list); + client_list.Process(); if (PurgeInstanceTimer.Check()) { database.PurgeExpiredInstances(); database.PurgeAllDeletedDataBuckets(); + ExpeditionDatabase::PurgeExpiredCharacterLockouts(); } if (EQTimeTimer.Check()) { @@ -598,6 +630,7 @@ int main(int argc, char** argv) { launcher_list.Process(); LFPGroupList.Process(); adventure_manager.Process(); + expedition_state.Process(); if (InterserverTimer.Check()) { InterserverTimer.Start(); diff --git a/world/ucs.cpp b/world/ucs.cpp index f5910da80..0af363051 100644 --- a/world/ucs.cpp +++ b/world/ucs.cpp @@ -6,29 +6,43 @@ #include "../common/misc_functions.h" #include "../common/md5.h" #include "../common/packet_dump.h" +#include "../common/event/timer.h" UCSConnection::UCSConnection() { - Stream = 0; + connection = 0; } void UCSConnection::SetConnection(std::shared_ptr inStream) { - if (Stream && Stream->Handle()) - { + if (inStream && connection && connection->Handle()) { LogInfo("Incoming UCS Connection while we were already connected to a UCS"); - Stream->Handle()->Disconnect(); + connection->Handle()->Disconnect(); } - Stream = inStream; - if (Stream) { - Stream->OnMessage(std::bind(&UCSConnection::ProcessPacket, this, std::placeholders::_1, std::placeholders::_2)); + connection = inStream; + if (connection) { + connection->OnMessage( + std::bind( + &UCSConnection::ProcessPacket, + this, + std::placeholders::_1, + std::placeholders::_2 + ) + ); } + + m_keepalive = std::make_unique(1000, true, std::bind(&UCSConnection::OnKeepAlive, this, std::placeholders::_1)); +} + +const std::shared_ptr &UCSConnection::GetConnection() const +{ + return connection; } void UCSConnection::ProcessPacket(uint16 opcode, EQ::Net::Packet &p) { - if (!Stream) + if (!connection) return; ServerPacket tpack(opcode, p); @@ -60,10 +74,10 @@ void UCSConnection::ProcessPacket(uint16 opcode, EQ::Net::Packet &p) void UCSConnection::SendPacket(ServerPacket* pack) { - if (!Stream) + if (!connection) return; - Stream->SendPacket(pack); + connection->SendPacket(pack); } void UCSConnection::SendMessage(const char *From, const char *Message) @@ -78,3 +92,13 @@ void UCSConnection::SendMessage(const char *From, const char *Message) SendPacket(pack); safe_delete(pack); } + +void UCSConnection::OnKeepAlive(EQ::Timer *t) +{ + if (!connection) { + return; + } + + ServerPacket pack(ServerOP_KeepAlive, 0); + connection->SendPacket(&pack); +} diff --git a/world/ucs.h b/world/ucs.h index d2051c0be..679229736 100644 --- a/world/ucs.h +++ b/world/ucs.h @@ -4,6 +4,7 @@ #include "../common/types.h" #include "../common/net/servertalk_server_connection.h" #include "../common/servertalk.h" +#include "../common/event/timer.h" #include class UCSConnection @@ -13,11 +14,19 @@ public: void SetConnection(std::shared_ptr connection); void ProcessPacket(uint16 opcode, EQ::Net::Packet &p); void SendPacket(ServerPacket* pack); - void Disconnect() { if(Stream && Stream->Handle()) Stream->Handle()->Disconnect(); } + void Disconnect() { if(connection && connection->Handle()) connection->Handle()->Disconnect(); } void SendMessage(const char *From, const char *Message); + const std::shared_ptr &GetConnection() const; + private: - inline std::string GetIP() const { return (Stream && Stream->Handle()) ? Stream->Handle()->RemoteIP() : 0; } - std::shared_ptr Stream; + inline std::string GetIP() const { return (connection && connection->Handle()) ? connection->Handle()->RemoteIP() : 0; } + std::shared_ptr connection; + + /** + * Keepalive + */ + std::unique_ptr m_keepalive; + void OnKeepAlive(EQ::Timer *t); }; #endif /*UCS_H_*/ diff --git a/world/web_interface.cpp b/world/web_interface.cpp index 773e955b6..234031770 100644 --- a/world/web_interface.cpp +++ b/world/web_interface.cpp @@ -146,7 +146,7 @@ WebInterfaceList::~WebInterfaceList() void WebInterfaceList::AddConnection(std::shared_ptr connection) { - m_interfaces.insert(std::make_pair(connection->GetUUID(), std::unique_ptr(new WebInterface(connection)))); + m_interfaces.insert(std::make_pair(connection->GetUUID(), std::make_unique(connection))); } void WebInterfaceList::RemoveConnection(std::shared_ptr connection) diff --git a/world/world_event_scheduler.cpp b/world/world_event_scheduler.cpp new file mode 100644 index 000000000..d32d44758 --- /dev/null +++ b/world/world_event_scheduler.cpp @@ -0,0 +1,65 @@ +#include "world_event_scheduler.h" +#include "../common/servertalk.h" +#include + +void WorldEventScheduler::Process(ZSList *zs_list) +{ + std::time_t time = std::time(nullptr); + std::tm *now = std::localtime(&time); + + // once a minute polling + if (m_last_polled_minute != now->tm_min) { + + // refresh; world polls and tells zones if they should update if there is a change + if (CheckIfEventsChanged()) { + LogSchedulerDetail("Event changes detected, forcing zones to refresh their schedules..."); + auto pack = new ServerPacket(ServerOP_UpdateSchedulerEvents, 0); + zs_list->SendPacket(pack); + safe_delete(pack); + } + + int month = (now->tm_mon + 1); + int year = (now->tm_year + 1900); + + LogSchedulerDetail( + "Polling year [{}] month [{}] day [{}] hour [{}] minute [{}]", + year, + month, + now->tm_mday, + now->tm_hour, + now->tm_min + ); + + for (auto &e: m_events) { + + // discard uninteresting events as its less work to calculate time on events we don't care about + // different processes are interested in different events + if ( + e.event_type != ServerEvents::EVENT_TYPE_BROADCAST && + e.event_type != ServerEvents::EVENT_TYPE_RELOAD_WORLD + ) { + continue; + } + + // validate event is ready to activate and run it + if (ValidateEventReadyToActivate(e)) { + if (e.event_type == ServerEvents::EVENT_TYPE_BROADCAST) { + LogScheduler("Sending broadcast [{}]", e.event_data.c_str()); + zs_list->SendEmoteMessage(nullptr, 0, 0, 15, e.event_data.c_str()); + } + + if (e.event_type == ServerEvents::EVENT_TYPE_RELOAD_WORLD) { + LogScheduler("Sending reload world event [{}]", e.event_data.c_str()); + + auto pack = new ServerPacket(ServerOP_ReloadWorld, sizeof(ReloadWorld_Struct)); + auto *reload_world = (ReloadWorld_Struct *) pack->pBuffer; + reload_world->Option = 1; + zs_list->SendPacket(pack); + safe_delete(pack); + } + } + } + + m_last_polled_minute = now->tm_min; + } +} diff --git a/world/world_event_scheduler.h b/world/world_event_scheduler.h new file mode 100644 index 000000000..b2a6725df --- /dev/null +++ b/world/world_event_scheduler.h @@ -0,0 +1,12 @@ +#ifndef EQEMU_EVENT_SCHEDULER_H +#define EQEMU_EVENT_SCHEDULER_H + +#include "../common/server_event_scheduler.h" +#include "zonelist.h" + +class WorldEventScheduler : public ServerEventScheduler { +public: + void Process(ZSList *zs_list); +}; + +#endif //EQEMU_EVENT_SCHEDULER_H diff --git a/world/world_server_command_handler.cpp b/world/world_server_command_handler.cpp index 9bad28541..b5d226664 100644 --- a/world/world_server_command_handler.cpp +++ b/world/world_server_command_handler.cpp @@ -25,6 +25,11 @@ #include "worlddb.h" #include "../common/database_schema.h" #include "../common/database/database_dump_service.h" +#include "../common/content/world_content_service.h" +#include "../common/repositories/criteria/content_filter_criteria.h" +#include "../common/rulesys.h" +#include "../common/repositories/instance_list_repository.h" +#include "../common/repositories/zone_repository.h" namespace WorldserverCommandHandler { @@ -49,10 +54,15 @@ namespace WorldserverCommandHandler { * Register commands */ function_map["world:version"] = &WorldserverCommandHandler::Version; + function_map["character:copy-character"] = &WorldserverCommandHandler::CopyCharacter; function_map["database:version"] = &WorldserverCommandHandler::DatabaseVersion; function_map["database:set-account-status"] = &WorldserverCommandHandler::DatabaseSetAccountStatus; function_map["database:schema"] = &WorldserverCommandHandler::DatabaseGetSchema; function_map["database:dump"] = &WorldserverCommandHandler::DatabaseDump; + function_map["test:test"] = &WorldserverCommandHandler::TestCommand; + function_map["test:expansion"] = &WorldserverCommandHandler::ExpansionTestCommand; + function_map["test:repository"] = &WorldserverCommandHandler::TestRepository; + function_map["test:repository2"] = &WorldserverCommandHandler::TestRepository2; EQEmuCommand::HandleMenu(function_map, cmd, argc, argv); } @@ -214,10 +224,6 @@ namespace WorldserverCommandHandler { { description = "Dumps server database tables"; - if (cmd[{"-h", "--help"}]) { - return; - } - std::vector arguments = {}; std::vector options = { "--all", @@ -235,12 +241,12 @@ namespace WorldserverCommandHandler { "--compress" }; - - if (argc < 3) { - EQEmuCommand::ValidateCmdInput(arguments, options, cmd, argc, argv); + if (cmd[{"-h", "--help"}]) { return; } + EQEmuCommand::ValidateCmdInput(arguments, options, cmd, argc, argv); + auto database_dump_service = new DatabaseDumpService(); bool dump_all = cmd[{"-a", "--all"}]; @@ -271,4 +277,222 @@ namespace WorldserverCommandHandler { database_dump_service->Dump(); } -} \ No newline at end of file + /** + * @param argc + * @param argv + * @param cmd + * @param description + */ + void TestCommand(int argc, char **argv, argh::parser &cmd, std::string &description) + { + description = "Test command"; + + if (cmd[{"-h", "--help"}]) { + return; + } + + } + + /** + * @param argc + * @param argv + * @param cmd + * @param description + */ + void ExpansionTestCommand(int argc, char **argv, argh::parser &cmd, std::string &description) + { + description = "Expansion test command"; + + if (cmd[{"-h", "--help"}]) { + return; + } + + if (!RuleManager::Instance()->LoadRules(&database, "default", false)) { + LogInfo("No rule set configured, using default rules"); + } + + content_service.SetCurrentExpansion(RuleI(Expansion, CurrentExpansion)); + + std::vector flags = { + "hateplane_enabled", + "patch_nerf_7077", + }; + + content_service.SetContentFlags(flags); + + LogInfo( + "Current expansion is [{}] ({}) is Velious Enabled [{}] Criteria [{}]", + content_service.GetCurrentExpansion(), + content_service.GetCurrentExpansionName(), + content_service.IsTheScarsOfVeliousEnabled() ? "true" : "false", + ContentFilterCriteria::apply() + ); + } + + /** + * @param argc + * @param argv + * @param cmd + * @param description + */ + void TestRepository(int argc, char **argv, argh::parser &cmd, std::string &description) + { + description = "Test command"; + + if (cmd[{"-h", "--help"}]) { + return; + } + + /** + * Insert one + */ + auto instance_list_entry = InstanceListRepository::NewEntity(); + + instance_list_entry.zone = 999; + instance_list_entry.version = 1; + instance_list_entry.is_global = 1; + instance_list_entry.start_time = 0; + instance_list_entry.duration = 0; + instance_list_entry.never_expires = 1; + + auto instance_list_inserted = InstanceListRepository::InsertOne(database, instance_list_entry); + + LogInfo("Inserted ID is [{}] zone [{}]", instance_list_inserted.id, instance_list_inserted.zone); + + /** + * Find one + */ + auto found_instance_list = InstanceListRepository::FindOne(database, instance_list_inserted.id); + + LogInfo("Found ID is [{}] zone [{}]", found_instance_list.id, found_instance_list.zone); + + /** + * Update one + */ + LogInfo("Updating instance id [{}] zone [{}]", found_instance_list.id, found_instance_list.zone); + + int update_instance_list_count = InstanceListRepository::UpdateOne(database, found_instance_list); + + found_instance_list.zone = 777; + + LogInfo( + "Updated instance id [{}] zone [{}] affected [{}]", + found_instance_list.id, + found_instance_list.zone, + update_instance_list_count + ); + + + /** + * Delete one + */ + int deleted = InstanceListRepository::DeleteOne(database, found_instance_list.id); + + LogInfo("Deleting one instance [{}] deleted count [{}]", found_instance_list.id, deleted); + + /** + * Insert many + */ + std::vector instance_lists; + + auto instance_list_entry_bulk = InstanceListRepository::NewEntity(); + + instance_list_entry_bulk.zone = 999; + instance_list_entry_bulk.version = 1; + instance_list_entry_bulk.is_global = 1; + instance_list_entry_bulk.start_time = 0; + instance_list_entry_bulk.duration = 0; + instance_list_entry_bulk.never_expires = 1; + + for (int i = 0; i < 10; i++) { + instance_lists.push_back(instance_list_entry_bulk); + } + + /** + * Fetch all + */ + int inserted_count = InstanceListRepository::InsertMany(database, instance_lists); + + LogInfo("Bulk insertion test, inserted [{}]", inserted_count); + + for (auto &entry: InstanceListRepository::GetWhere(database, fmt::format("zone = {}", 999))) { + LogInfo("Iterating through entry id [{}] zone [{}]", entry.id, entry.zone); + } + + /** + * Delete where + */ + int deleted_count = InstanceListRepository::DeleteWhere(database, fmt::format("zone = {}", 999)); + + LogInfo("Bulk deletion test, deleted [{}]", deleted_count); + + } + + /** + * @param argc + * @param argv + * @param cmd + * @param description + */ + void TestRepository2(int argc, char **argv, argh::parser &cmd, std::string &description) + { + description = "Test command"; + + if (cmd[{"-h", "--help"}]) { + return; + } + + auto zones = ZoneRepository::GetWhere(content_db, "short_name = 'anguish'"); + + for (auto &zone: zones) { + LogInfo( + "Zone [{}] long_name [{}] id [{}]", + zone.short_name, + zone.long_name, + zone.id + ); + } + } + + /** + * @param argc + * @param argv + * @param cmd + * @param description + */ + void CopyCharacter(int argc, char **argv, argh::parser &cmd, std::string &description) + { + description = "Copies a character into a destination account"; + + std::vector arguments = { + "source_character_name", + "destination_character_name", + "destination_account_name" + }; + std::vector options = { }; + + if (cmd[{"-h", "--help"}]) { + return; + } + + EQEmuCommand::ValidateCmdInput(arguments, options, cmd, argc, argv); + + std::string source_character_name = cmd(2).str(); + std::string destination_character_name = cmd(3).str(); + std::string destination_account_name = cmd(4).str(); + + LogInfo( + "Attempting to copy character [{}] to [{}] via account [{}]", + source_character_name, + destination_character_name, + destination_account_name + ); + + database.CopyCharacter( + source_character_name, + destination_character_name, + destination_account_name + ); + } + +} diff --git a/world/world_server_command_handler.h b/world/world_server_command_handler.h index a32a78f0f..2d7c59f8e 100644 --- a/world/world_server_command_handler.h +++ b/world/world_server_command_handler.h @@ -27,10 +27,15 @@ namespace WorldserverCommandHandler { void CommandHandler(int argc, char **argv); void Version(int argc, char **argv, argh::parser &cmd, std::string &description); + void CopyCharacter(int argc, char **argv, argh::parser &cmd, std::string &description); void DatabaseVersion(int argc, char **argv, argh::parser &cmd, std::string &description); void DatabaseSetAccountStatus(int argc, char **argv, argh::parser &cmd, std::string &description); void DatabaseGetSchema(int argc, char **argv, argh::parser &cmd, std::string &description); void DatabaseDump(int argc, char **argv, argh::parser &cmd, std::string &description); + void TestCommand(int argc, char **argv, argh::parser &cmd, std::string &description); + void ExpansionTestCommand(int argc, char **argv, argh::parser &cmd, std::string &description); + void TestRepository(int argc, char **argv, argh::parser &cmd, std::string &description); + void TestRepository2(int argc, char **argv, argh::parser &cmd, std::string &description); }; diff --git a/world/world_store.cpp b/world/world_store.cpp new file mode 100644 index 000000000..5a8201124 --- /dev/null +++ b/world/world_store.cpp @@ -0,0 +1,132 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "world_store.h" + +WorldStore::WorldStore() = default; +WorldStore::~WorldStore() = default; + +void WorldStore::LoadZones() +{ + zones = ZoneRepository::All(content_db); +} + +uint32 WorldStore::GetZoneID(const char *in_zone_name) +{ + if (in_zone_name == nullptr) { + return 0; + } + + std::string zone_name = str_tolower(in_zone_name); + + return GetZoneID(zone_name); +} + +uint32 WorldStore::GetZoneID(std::string zone_name) +{ + for (auto &z: zones) { + if (z.short_name == zone_name) { + return z.zoneidnumber; + } + } + + return 0; +} + +/** + * @param zone_id + * @param error_unknown + * @return + */ +const char *WorldStore::GetZoneName(uint32 zone_id, bool error_unknown) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.short_name.c_str(); + } + } + + if (error_unknown) { + return "UNKNOWN"; + } + + return nullptr; +} + +/** + * @param zone_id + * @return + */ +std::string WorldStore::GetZoneName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.short_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @return + */ +std::string WorldStore::GetZoneLongName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.long_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @param version + * @return + */ +ZoneRepository::Zone WorldStore::GetZone(uint32 zone_id, int version) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id && z.version == version) { + return z; + } + } + + return ZoneRepository::Zone(); +} + +/** + * @param in_zone_name + * @return + */ +ZoneRepository::Zone WorldStore::GetZone(const char *in_zone_name) +{ + for (auto &z: zones) { + if (z.short_name == in_zone_name) { + return z; + } + } + + return ZoneRepository::Zone(); +} diff --git a/world/world_store.h b/world/world_store.h new file mode 100644 index 000000000..985419ff0 --- /dev/null +++ b/world/world_store.h @@ -0,0 +1,64 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_WORLD_STORE_H +#define EQEMU_WORLD_STORE_H + +#include "worlddb.h" +#include "../common/repositories/zone_repository.h" + +class WorldStore { +public: + WorldStore(); + virtual ~WorldStore(); + + std::vector zones{}; + + void LoadZones(); + + ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0); + ZoneRepository::Zone GetZone(const char *in_zone_name); + uint32 GetZoneID(const char *in_zone_name); + uint32 GetZoneID(std::string zone_name); + std::string GetZoneName(uint32 zone_id); + std::string GetZoneLongName(uint32 zone_id); + const char *GetZoneName(uint32 zone_id, bool error_unknown = false); + +}; + +extern WorldStore world_store; + +/** + * Global helpers + */ +inline uint32 ZoneID(const char *in_zone_name) { return world_store.GetZoneID(in_zone_name); } +inline uint32 ZoneID(std::string zone_name) { return world_store.GetZoneID(zone_name); } +inline const char *ZoneName(uint32 zone_id, bool error_unknown = false) +{ + return world_store.GetZoneName( + zone_id, + error_unknown + ); +} +inline const char *ZoneLongName(uint32 zone_id) { return world_store.GetZoneLongName(zone_id).c_str(); } +inline ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0) { return world_store.GetZone(zone_id, version); }; +inline ZoneRepository::Zone GetZone(const char *in_zone_name) { return world_store.GetZone(in_zone_name); }; + +#endif //EQEMU_WORLD_STORE_H diff --git a/world/worlddb.cpp b/world/worlddb.cpp index b7bec5459..14decb79d 100644 --- a/world/worlddb.cpp +++ b/world/worlddb.cpp @@ -25,6 +25,8 @@ #include #include #include "sof_char_create_data.h" +#include "../common/repositories/criteria/content_filter_criteria.h" +#include "world_store.h" WorldDatabase database; WorldDatabase content_db; @@ -39,55 +41,61 @@ extern std::vector character_create_race_class_combos; */ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **out_app, uint32 client_version_bit) { - EQEmu::versions::ClientVersion - client_version = EQEmu::versions::ConvertClientVersionBitToClientVersion(client_version_bit); - size_t character_limit = EQEmu::constants::StaticLookup(client_version)->CharacterCreationLimit; + EQ::versions::ClientVersion + client_version = EQ::versions::ConvertClientVersionBitToClientVersion(client_version_bit); + size_t character_limit = EQ::constants::StaticLookup(client_version)->CharacterCreationLimit; - if (character_limit > EQEmu::constants::CHARACTER_CREATION_LIMIT) { - character_limit = EQEmu::constants::CHARACTER_CREATION_LIMIT; + if (character_limit > EQ::constants::CHARACTER_CREATION_LIMIT) { + character_limit = EQ::constants::CHARACTER_CREATION_LIMIT; } // Force Titanium clients to use '8' - if (client_version == EQEmu::versions::ClientVersion::Titanium) { + if (client_version == EQ::versions::ClientVersion::Titanium) { character_limit = 8; } - std::string character_list_query = StringFormat( - "SELECT " - "`id`, " // 0 - "name, " // 1 - "gender, " // 2 - "race, " // 3 - "class, " // 4 - "`level`, " // 5 - "deity, " // 6 - "last_login, " // 7 - "time_played, " // 8 - "hair_color, " // 9 - "beard_color, " // 10 - "eye_color_1, " // 11 - "eye_color_2, " // 12 - "hair_style, " // 13 - "beard, " // 14 - "face, " // 15 - "drakkin_heritage, " // 16 - "drakkin_tattoo, " // 17 - "drakkin_details, " // 18 - "zone_id " // 19 - "FROM " - "character_data " - "WHERE `account_id` = %i AND deleted_at IS NULL ORDER BY `name` LIMIT %u", + std::string character_list_query = fmt::format( + SQL( + SELECT + `id`, + `name`, + `gender`, + `race`, + `class`, + `level`, + `deity`, + `last_login`, + `time_played`, + `hair_color`, + `beard_color`, + `eye_color_1`, + `eye_color_2`, + `hair_style`, + `beard`, + `face`, + `drakkin_heritage`, + `drakkin_tattoo`, + `drakkin_details`, + `zone_id` + FROM + `character_data` + WHERE + `account_id` = {} + AND + `deleted_at` IS NULL + ORDER BY `name` + LIMIT {} + ), account_id, character_limit ); auto results = database.QueryDatabase(character_list_query); - size_t character_count = results.RowCount(); if (character_count == 0) { - *out_app = new EQApplicationPacket(OP_SendCharInfo, sizeof(CharacterSelect_Struct)); + *out_app = new EQApplicationPacket(OP_SendCharInfo, sizeof(CharacterSelect_Struct)); CharacterSelect_Struct *cs = (CharacterSelect_Struct *) (*out_app)->pBuffer; - cs->CharCount = 0; + cs->CharCount = 0; cs->TotalChars = character_limit; return; } @@ -95,140 +103,181 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o size_t packet_size = sizeof(CharacterSelect_Struct) + (sizeof(CharacterSelectEntry_Struct) * character_count); *out_app = new EQApplicationPacket(OP_SendCharInfo, packet_size); - unsigned char *buff_ptr = (*out_app)->pBuffer; - CharacterSelect_Struct *cs = (CharacterSelect_Struct *) buff_ptr; + unsigned char *buff_ptr = (*out_app)->pBuffer; + CharacterSelect_Struct *cs = (CharacterSelect_Struct *) buff_ptr; - cs->CharCount = character_count; + cs->CharCount = character_count; cs->TotalChars = character_limit; buff_ptr += sizeof(CharacterSelect_Struct); for (auto row = results.begin(); row != results.end(); ++row) { CharacterSelectEntry_Struct *p_character_select_entry_struct = (CharacterSelectEntry_Struct *) buff_ptr; - PlayerProfile_Struct player_profile_struct; - EQEmu::InventoryProfile inventory_profile; + PlayerProfile_Struct player_profile_struct; + EQ::InventoryProfile inventory_profile; - player_profile_struct.SetPlayerProfileVersion(EQEmu::versions::ConvertClientVersionToMobVersion(client_version)); + player_profile_struct.SetPlayerProfileVersion(EQ::versions::ConvertClientVersionToMobVersion(client_version)); inventory_profile.SetInventoryVersion(client_version); inventory_profile.SetGMInventory(true); // charsel can not interact with items..but, no harm in setting to full expansion support uint32 character_id = (uint32) atoi(row[0]); - uint8 has_home = 0; - uint8 has_bind = 0; + uint8 has_home = 0; + uint8 has_bind = 0; memset(&player_profile_struct, 0, sizeof(PlayerProfile_Struct)); - memset(p_character_select_entry_struct->Name, 0, sizeof(p_character_select_entry_struct->Name)); strcpy(p_character_select_entry_struct->Name, row[1]); - p_character_select_entry_struct->Class = (uint8) atoi(row[4]); - p_character_select_entry_struct->Race = (uint32) atoi(row[3]); - p_character_select_entry_struct->Level = (uint8) atoi(row[5]); + p_character_select_entry_struct->Class = (uint8) atoi(row[4]); + p_character_select_entry_struct->Race = (uint32) atoi(row[3]); + p_character_select_entry_struct->Level = (uint8) atoi(row[5]); p_character_select_entry_struct->ShroudClass = p_character_select_entry_struct->Class; - p_character_select_entry_struct->ShroudRace = p_character_select_entry_struct->Race; - p_character_select_entry_struct->Zone = (uint16) atoi(row[19]); - p_character_select_entry_struct->Instance = 0; - p_character_select_entry_struct->Gender = (uint8) atoi(row[2]); - p_character_select_entry_struct->Face = (uint8) atoi(row[15]); + p_character_select_entry_struct->ShroudRace = p_character_select_entry_struct->Race; + p_character_select_entry_struct->Zone = (uint16) atoi(row[19]); + p_character_select_entry_struct->Instance = 0; + p_character_select_entry_struct->Gender = (uint8) atoi(row[2]); + p_character_select_entry_struct->Face = (uint8) atoi(row[15]); - for (uint32 material_slot = 0; material_slot < EQEmu::textures::materialCount; material_slot++) { - p_character_select_entry_struct->Equip[material_slot].Material = 0; - p_character_select_entry_struct->Equip[material_slot].Unknown1 = 0; - p_character_select_entry_struct->Equip[material_slot].EliteModel = 0; + for (uint32 material_slot = 0; material_slot < EQ::textures::materialCount; material_slot++) { + p_character_select_entry_struct->Equip[material_slot].Material = 0; + p_character_select_entry_struct->Equip[material_slot].Unknown1 = 0; + p_character_select_entry_struct->Equip[material_slot].EliteModel = 0; p_character_select_entry_struct->Equip[material_slot].HerosForgeModel = 0; - p_character_select_entry_struct->Equip[material_slot].Unknown2 = 0; - p_character_select_entry_struct->Equip[material_slot].Color = 0; + p_character_select_entry_struct->Equip[material_slot].Unknown2 = 0; + p_character_select_entry_struct->Equip[material_slot].Color = 0; } - p_character_select_entry_struct->Unknown15 = 0xFF; - p_character_select_entry_struct->Unknown19 = 0xFF; - p_character_select_entry_struct->DrakkinTattoo = (uint32) atoi(row[17]); - p_character_select_entry_struct->DrakkinDetails = (uint32) atoi(row[18]); - p_character_select_entry_struct->Deity = (uint32) atoi(row[6]); - p_character_select_entry_struct->PrimaryIDFile = 0; // Processed Below + p_character_select_entry_struct->Unknown15 = 0xFF; + p_character_select_entry_struct->Unknown19 = 0xFF; + p_character_select_entry_struct->DrakkinTattoo = (uint32) atoi(row[17]); + p_character_select_entry_struct->DrakkinDetails = (uint32) atoi(row[18]); + p_character_select_entry_struct->Deity = (uint32) atoi(row[6]); + p_character_select_entry_struct->PrimaryIDFile = 0; // Processed Below p_character_select_entry_struct->SecondaryIDFile = 0; // Processed Below - p_character_select_entry_struct->HairColor = (uint8) atoi(row[9]); - p_character_select_entry_struct->BeardColor = (uint8) atoi(row[10]); - p_character_select_entry_struct->EyeColor1 = (uint8) atoi(row[11]); - p_character_select_entry_struct->EyeColor2 = (uint8) atoi(row[12]); - p_character_select_entry_struct->HairStyle = (uint8) atoi(row[13]); - p_character_select_entry_struct->Beard = (uint8) atoi(row[14]); - p_character_select_entry_struct->GoHome = 0; // Processed Below - p_character_select_entry_struct->Tutorial = 0; // Processed Below + p_character_select_entry_struct->HairColor = (uint8) atoi(row[9]); + p_character_select_entry_struct->BeardColor = (uint8) atoi(row[10]); + p_character_select_entry_struct->EyeColor1 = (uint8) atoi(row[11]); + p_character_select_entry_struct->EyeColor2 = (uint8) atoi(row[12]); + p_character_select_entry_struct->HairStyle = (uint8) atoi(row[13]); + p_character_select_entry_struct->Beard = (uint8) atoi(row[14]); + p_character_select_entry_struct->GoHome = 0; // Processed Below + p_character_select_entry_struct->Tutorial = 0; // Processed Below p_character_select_entry_struct->DrakkinHeritage = (uint32) atoi(row[16]); - p_character_select_entry_struct->Unknown1 = 0; - p_character_select_entry_struct->Enabled = 1; - p_character_select_entry_struct->LastLogin = (uint32) atoi(row[7]); // RoF2 value: 1212696584 - p_character_select_entry_struct->Unknown2 = 0; + p_character_select_entry_struct->Unknown1 = 0; + p_character_select_entry_struct->Enabled = 1; + p_character_select_entry_struct->LastLogin = (uint32) atoi(row[7]); // RoF2 value: 1212696584 + p_character_select_entry_struct->Unknown2 = 0; if (RuleB(World, EnableReturnHomeButton)) { int now = time(nullptr); - if ((now - atoi(row[7])) >= RuleI(World, MinOfflineTimeToReturnHome)) { + if ((now - atoi(row[7])) >= RuleI(World, MinOfflineTimeToReturnHome)) p_character_select_entry_struct->GoHome = 1; - } } - if (RuleB(World, EnableTutorialButton) && (p_character_select_entry_struct->Level <= RuleI(World, MaxLevelForTutorial))) { + if (RuleB(World, EnableTutorialButton) && (p_character_select_entry_struct->Level <= RuleI(World, MaxLevelForTutorial))) p_character_select_entry_struct->Tutorial = 1; - } /** * Bind */ - character_list_query = StringFormat( - "SELECT `zone_id`, `instance_id`, `x`, `y`, `z`, `heading`, `slot` FROM `character_bind` WHERE `id` = %i LIMIT 5", + character_list_query = fmt::format( + SQL( + SELECT + `zone_id`, `instance_id`, `x`, `y`, `z`, `heading`, `slot` + FROM + `character_bind` + WHERE + `id` = {} + LIMIT 5 + ), character_id ); - auto results_bind = database.QueryDatabase(character_list_query); - auto bind_count = results_bind.RowCount(); - for (auto row_b = results_bind.begin(); row_b != results_bind.end(); ++row_b) { + auto results_bind = database.QueryDatabase(character_list_query); + auto bind_count = results_bind.RowCount(); + for (auto row_b = results_bind.begin(); row_b != results_bind.end(); ++row_b) { if (row_b[6] && atoi(row_b[6]) == 4) { has_home = 1; // If our bind count is less than 5, we need to actually make use of this data so lets parse it if (bind_count < 5) { - player_profile_struct.binds[4].zoneId = atoi(row_b[0]); + player_profile_struct.binds[4].zone_id = atoi(row_b[0]); player_profile_struct.binds[4].instance_id = atoi(row_b[1]); - player_profile_struct.binds[4].x = atof(row_b[2]); - player_profile_struct.binds[4].y = atof(row_b[3]); - player_profile_struct.binds[4].z = atof(row_b[4]); - player_profile_struct.binds[4].heading = atof(row_b[5]); + player_profile_struct.binds[4].x = atof(row_b[2]); + player_profile_struct.binds[4].y = atof(row_b[3]); + player_profile_struct.binds[4].z = atof(row_b[4]); + player_profile_struct.binds[4].heading = atof(row_b[5]); } } - if (row_b[6] && atoi(row_b[6]) == 0) { has_bind = 1; } + + if (row_b[6] && atoi(row_b[6]) == 0) + has_bind = 1; } if (has_home == 0 || has_bind == 0) { - character_list_query = StringFormat( - "SELECT `zone_id`, `bind_id`, `x`, `y`, `z` FROM `start_zones` WHERE `player_class` = %i AND `player_deity` = %i AND `player_race` = %i", + std::string character_list_query = fmt::format( + SQL( + SELECT + `zone_id`, `bind_id`, `x`, `y`, `z`, `heading` + FROM + `start_zones` + WHERE + `player_class` = {} + AND + `player_deity` = {} + AND + `player_race` = {} {} + ), p_character_select_entry_struct->Class, p_character_select_entry_struct->Deity, - p_character_select_entry_struct->Race + p_character_select_entry_struct->Race, + ContentFilterCriteria::apply().c_str() ); - auto results_bind = content_db.QueryDatabase(character_list_query); - for (auto row_d = results_bind.begin(); row_d != results_bind.end(); ++row_d) { + auto results_bind = content_db.QueryDatabase(character_list_query); + for (auto row_d = results_bind.begin(); row_d != results_bind.end(); ++row_d) { /* If a bind_id is specified, make them start there */ if (atoi(row_d[1]) != 0) { - player_profile_struct.binds[4].zoneId = (uint32) atoi(row_d[1]); - GetSafePoints(player_profile_struct.binds[4].zoneId, 0, &player_profile_struct.binds[4].x, &player_profile_struct.binds[4].y, &player_profile_struct.binds[4].z); + player_profile_struct.binds[4].zone_id = (uint32) atoi(row_d[1]); + content_db.GetSafePoints( + ZoneName(player_profile_struct.binds[4].zone_id, true), + 0, + &player_profile_struct.binds[4].x, + &player_profile_struct.binds[4].y, + &player_profile_struct.binds[4].z, + &player_profile_struct.binds[4].heading + ); } /* Otherwise, use the zone and coordinates given */ else { - player_profile_struct.binds[4].zoneId = (uint32) atoi(row_d[0]); + player_profile_struct.binds[4].zone_id = (uint32) atoi(row_d[0]); float x = atof(row_d[2]); float y = atof(row_d[3]); float z = atof(row_d[4]); - if (x == 0 && y == 0 && z == 0) { content_db.GetSafePoints(player_profile_struct.binds[4].zoneId, 0, &x, &y, &z); } + float heading = atof(row_d[5]); + if (x == 0 && y == 0 && z == 0 && heading == 0) { + content_db.GetSafePoints( + ZoneName(player_profile_struct.binds[4].zone_id, true), + 0, + &x, + &y, + &z, + &heading + ); + } player_profile_struct.binds[4].x = x; player_profile_struct.binds[4].y = y; player_profile_struct.binds[4].z = z; + player_profile_struct.binds[4].heading = heading; } } player_profile_struct.binds[0] = player_profile_struct.binds[4]; /* If no home bind set, set it */ if (has_home == 0) { - std::string query = StringFormat( - "REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot)" - " VALUES (%u, %u, %u, %f, %f, %f, %f, %i)", + std::string query = fmt::format( + SQL( + REPLACE INTO + `character_bind` + (`id`, `zone_id`, `instance_id`, `x`, `y`, `z`, `heading`, `slot`) + VALUES ({}, {}, {}, {}, {}, {}, {}, {}) + ), character_id, - player_profile_struct.binds[4].zoneId, + player_profile_struct.binds[4].zone_id, 0, player_profile_struct.binds[4].x, player_profile_struct.binds[4].y, @@ -236,15 +285,19 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o player_profile_struct.binds[4].heading, 4 ); - auto results_bset = QueryDatabase(query); + auto results_bset = QueryDatabase(query); } /* If no regular bind set, set it */ if (has_bind == 0) { - std::string query = StringFormat( - "REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot)" - " VALUES (%u, %u, %u, %f, %f, %f, %f, %i)", + std::string query = fmt::format( + SQL( + REPLACE INTO + `character_bind` + (`id`, `zone_id`, `instance_id`, `x`, `y`, `z`, `heading`, `slot`) + VALUES ({}, {}, {}, {}, {}, {}, {}, {}) + ), character_id, - player_profile_struct.binds[0].zoneId, + player_profile_struct.binds[0].zone_id, 0, player_profile_struct.binds[0].x, player_profile_struct.binds[0].y, @@ -252,7 +305,7 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o player_profile_struct.binds[0].heading, 0 ); - auto results_bset = QueryDatabase(query); + auto results_bset = QueryDatabase(query); } } /* If our bind count is less than 5, then we have null data that needs to be filled in. */ @@ -260,15 +313,18 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o // we know that home and main bind must be valid here, so we don't check those // we also use home to fill in the null data like live does. for (int i = 1; i < 4; i++) { - if (player_profile_struct.binds[i].zoneId != 0) { // we assume 0 is the only invalid one ... + if (player_profile_struct.binds[i].zone_id != 0) // we assume 0 is the only invalid one ... continue; - } - std::string query = StringFormat( - "REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot)" - " VALUES (%u, %u, %u, %f, %f, %f, %f, %i)", + std::string query = fmt::format( + SQL( + REPLACE INTO + `character_bind` + (`id`, `zone_id`, `instance_id`, `x`, `y`, `z`, `heading`, `slot`) + VALUES ({}, {}, {}, {}, {}, {}, {}, {}) + ), character_id, - player_profile_struct.binds[4].zoneId, + player_profile_struct.binds[4].zone_id, 0, player_profile_struct.binds[4].x, player_profile_struct.binds[4].y, @@ -276,95 +332,105 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, EQApplicationPacket **o player_profile_struct.binds[4].heading, i ); - auto results_bset = QueryDatabase(query); + auto results_bset = QueryDatabase(query); } } - character_list_query = StringFormat( - "SELECT slot, red, green, blue, use_tint, color FROM `character_material` WHERE `id` = %u", + character_list_query = fmt::format( + SQL( + SELECT + `slot`, `red`, `green`, `blue`, `use_tint`, `color` + FROM + `character_material` + WHERE + `id` = {} + ), character_id ); - auto results_b = database.QueryDatabase(character_list_query); - uint8 slot = 0; - for (auto row_b = results_b.begin(); row_b != results_b.end(); ++row_b) { + auto results_b = database.QueryDatabase(character_list_query); + uint8 slot = 0; + for (auto row_b = results_b.begin(); row_b != results_b.end(); ++row_b) { slot = atoi(row_b[0]); - player_profile_struct.item_tint.Slot[slot].Red = atoi(row_b[1]); - player_profile_struct.item_tint.Slot[slot].Green = atoi(row_b[2]); - player_profile_struct.item_tint.Slot[slot].Blue = atoi(row_b[3]); + player_profile_struct.item_tint.Slot[slot].Red = atoi(row_b[1]); + player_profile_struct.item_tint.Slot[slot].Green = atoi(row_b[2]); + player_profile_struct.item_tint.Slot[slot].Blue = atoi(row_b[3]); player_profile_struct.item_tint.Slot[slot].UseTint = atoi(row_b[4]); } if (GetCharSelInventory(account_id, p_character_select_entry_struct->Name, &inventory_profile)) { - const EQEmu::ItemData *item = nullptr; - const EQEmu::ItemInstance *inst = nullptr; + const EQ::ItemData *item = nullptr; + const EQ::ItemInstance *inst = nullptr; int16 inventory_slot = 0; - - for (uint32 matslot = EQEmu::textures::textureBegin; matslot < EQEmu::textures::materialCount; matslot++) { - inventory_slot = EQEmu::InventoryProfile::CalcSlotFromMaterial(matslot); + for (uint32 matslot = EQ::textures::textureBegin; matslot < EQ::textures::materialCount; matslot++) { + inventory_slot = EQ::InventoryProfile::CalcSlotFromMaterial(matslot); if (inventory_slot == INVALID_INDEX) { continue; } inst = inventory_profile.GetItem(inventory_slot); - if (inst == nullptr) { + if (inst == nullptr) continue; - } + item = inst->GetItem(); - if (item == nullptr) { + if (item == nullptr) continue; - } if (matslot > 6) { uint32 item_id_file = 0; - // Weapon Models + // Weapon Models if (inst->GetOrnamentationIDFile() != 0) { item_id_file = inst->GetOrnamentationIDFile(); p_character_select_entry_struct->Equip[matslot].Material = item_id_file; - } - else { + } else { if (strlen(item->IDFile) > 2) { item_id_file = atoi(&item->IDFile[2]); p_character_select_entry_struct->Equip[matslot].Material = item_id_file; } } - if (matslot == EQEmu::textures::weaponPrimary) { + + if (matslot == EQ::textures::weaponPrimary) { p_character_select_entry_struct->PrimaryIDFile = item_id_file; - } - else { + } else { p_character_select_entry_struct->SecondaryIDFile = item_id_file; } - } - else { - uint32 color = 0; - if (player_profile_struct.item_tint.Slot[matslot].UseTint) { - color = player_profile_struct.item_tint.Slot[matslot].Color; - } - else { - color = inst->GetColor(); - } - + } else { // Armor Materials/Models - p_character_select_entry_struct->Equip[matslot].Material = item->Material; - p_character_select_entry_struct->Equip[matslot].EliteModel = item->EliteMaterial; + uint32 color = ( + player_profile_struct.item_tint.Slot[matslot].UseTint ? + player_profile_struct.item_tint.Slot[matslot].Color : + inst->GetColor() + ); + p_character_select_entry_struct->Equip[matslot].Material = item->Material; + p_character_select_entry_struct->Equip[matslot].EliteModel = item->EliteMaterial; p_character_select_entry_struct->Equip[matslot].HerosForgeModel = inst->GetOrnamentHeroModel(matslot); - p_character_select_entry_struct->Equip[matslot].Color = color; + p_character_select_entry_struct->Equip[matslot].Color = color; } } - } - else { + } else { printf("Error loading inventory for %s\n", p_character_select_entry_struct->Name); } - buff_ptr += sizeof(CharacterSelectEntry_Struct); } } -int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) +int WorldDatabase::MoveCharacterToBind(int character_id, uint8 bind_number) { /* if an invalid bind point is specified, use the primary bind */ - if (bindnum > 4) - { - bindnum = 0; - } + if (bind_number > 4) + bind_number = 0; - std::string query = StringFormat("SELECT zone_id, instance_id, x, y, z FROM character_bind WHERE id = %u AND slot = %u LIMIT 1", CharID, bindnum); + std::string query = fmt::format( + SQL( + SELECT + zone_id, instance_id, x, y, z, heading + FROM + character_bind + WHERE + id = {} + AND + slot = {} + LIMIT 1 + ), + character_id, + bind_number + ); auto results = database.QueryDatabase(query); if(!results.Success() || results.RowCount() == 0) { return 0; @@ -381,8 +447,27 @@ int WorldDatabase::MoveCharacterToBind(int CharID, uint8 bindnum) heading = atof(row[5]); } - query = StringFormat("UPDATE character_data SET zone_id = '%d', zone_instance = '%d', x = '%f', y = '%f', z = '%f', heading = '%f' WHERE id = %u", - zone_id, instance_id, x, y, z, heading, CharID); + query = fmt::format( + SQL( + UPDATE + `character_data` + SET + `zone_id` = {}, + `zone_instance` = {}, + `x` = {}, + `y` = {}, + `z` = {}, + `heading` = {} + WHERE `id` = {} + ), + zone_id, + instance_id, + x, + y, + z, + heading, + character_id + ); results = database.QueryDatabase(query); if(!results.Success()) { @@ -417,21 +502,40 @@ bool WorldDatabase::GetStartZone( p_player_profile_struct->binds[0].x = 0; p_player_profile_struct->binds[0].y = 0; p_player_profile_struct->binds[0].z = 0; - p_player_profile_struct->binds[0].zoneId = 0; + p_player_profile_struct->binds[0].zone_id = 0; p_player_profile_struct->binds[0].instance_id = 0; // see if we have an entry for start_zone. We can support both titanium & SOF+ by having two entries per class/race/deity combo with different zone_ids - std::string query = StringFormat( - "SELECT x, y, z, heading, start_zone, bind_id, bind_x, bind_y, bind_z FROM start_zones WHERE zone_id = %i " - "AND player_class = %i AND player_deity = %i AND player_race = %i", - p_char_create_struct->start_zone, - p_char_create_struct->class_, - p_char_create_struct->deity, - p_char_create_struct->race - ); + std::string query; - auto results = QueryDatabase(query); - if (!results.Success()) { + if (is_titanium) { + // Titanium sends player choice (starting city) instead of a zone id + query = StringFormat( + "SELECT x, y, z, heading, start_zone, bind_id, bind_x, bind_y, bind_z FROM start_zones WHERE player_choice = %i " + "AND player_class = %i AND player_deity = %i AND player_race = %i %s", + p_char_create_struct->start_zone, + p_char_create_struct->class_, + p_char_create_struct->deity, + p_char_create_struct->race, + ContentFilterCriteria::apply().c_str() + ); + LogInfo("Titanium Start zone query: [{}]\n", query.c_str()); + } + else { + query = StringFormat( + "SELECT x, y, z, heading, start_zone, bind_id, bind_x, bind_y, bind_z FROM start_zones WHERE zone_id = %i " + "AND player_class = %i AND player_deity = %i AND player_race = %i %s", + p_char_create_struct->start_zone, + p_char_create_struct->class_, + p_char_create_struct->deity, + p_char_create_struct->race, + ContentFilterCriteria::apply().c_str() + ); + LogInfo("SoF Start zone query: [{}]\n", query.c_str()); + } + + auto results = QueryDatabase(query); + if(!results.Success()) { return false; } @@ -444,23 +548,48 @@ bool WorldDatabase::GetStartZone( else { LogInfo("Found starting location in start_zones"); auto row = results.begin(); - p_player_profile_struct->x = atof(row[0]); - p_player_profile_struct->y = atof(row[1]); - p_player_profile_struct->z = atof(row[2]); - p_player_profile_struct->heading = atof(row[3]); - p_player_profile_struct->zone_id = atoi(row[4]); - p_player_profile_struct->binds[0].zoneId = atoi(row[5]); - p_player_profile_struct->binds[0].x = atof(row[6]); - p_player_profile_struct->binds[0].y = atof(row[7]); - p_player_profile_struct->binds[0].z = atof(row[8]); + p_player_profile_struct->x = atof(row[0]); + p_player_profile_struct->y = atof(row[1]); + p_player_profile_struct->z = atof(row[2]); + p_player_profile_struct->heading = atof(row[3]); + p_player_profile_struct->zone_id = atoi(row[4]); + p_player_profile_struct->binds[0].zone_id = atoi(row[5]); + p_player_profile_struct->binds[0].x = atof(row[6]); + p_player_profile_struct->binds[0].y = atof(row[7]); + p_player_profile_struct->binds[0].z = atof(row[8]); + p_player_profile_struct->binds[0].heading = atof(row[3]); } - if (p_player_profile_struct->x == 0 && p_player_profile_struct->y == 0 && p_player_profile_struct->z == 0) { - content_db.GetSafePoints(p_player_profile_struct->zone_id, 0, &p_player_profile_struct->x, &p_player_profile_struct->y, &p_player_profile_struct->z); + if ( + p_player_profile_struct->x == 0 && + p_player_profile_struct->y == 0 && + p_player_profile_struct->z == 0 && + p_player_profile_struct->heading == 0 + ) { + content_db.GetSafePoints( + ZoneName(p_player_profile_struct->zone_id, true), + 0, + &p_player_profile_struct->x, + &p_player_profile_struct->y, + &p_player_profile_struct->z, + &p_player_profile_struct->heading + ); } - if (p_player_profile_struct->binds[0].x == 0 && p_player_profile_struct->binds[0].y == 0 && p_player_profile_struct->binds[0].z == 0) { - content_db.GetSafePoints(p_player_profile_struct->binds[0].zoneId, 0, &p_player_profile_struct->binds[0].x, &p_player_profile_struct->binds[0].y, &p_player_profile_struct->binds[0].z); + if ( + p_player_profile_struct->binds[0].x == 0 && + p_player_profile_struct->binds[0].y == 0 && + p_player_profile_struct->binds[0].z == 0 && + p_player_profile_struct->binds[0].heading == 0 + ) { + content_db.GetSafePoints( + ZoneName(p_player_profile_struct->binds[0].zone_id, true), + 0, + &p_player_profile_struct->binds[0].x, + &p_player_profile_struct->binds[0].y, + &p_player_profile_struct->binds[0].z, + &p_player_profile_struct->binds[0].heading + ); } return true; @@ -469,12 +598,13 @@ bool WorldDatabase::GetStartZone( void WorldDatabase::SetSoFDefaultStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc){ if (in_cc->start_zone == RuleI(World, TutorialZoneID)) { in_pp->zone_id = in_cc->start_zone; - } + } else { - in_pp->x = in_pp->binds[0].x = -51; - in_pp->y = in_pp->binds[0].y = -20; - in_pp->z = in_pp->binds[0].z = 0.79; - in_pp->zone_id = in_pp->binds[0].zoneId = 394; // Crescent Reach. + in_pp->x = in_pp->binds[0].x = -51.0f; + in_pp->y = in_pp->binds[0].y = -20.0f; + in_pp->z = in_pp->binds[0].z = 0.79f; + in_pp->heading = in_pp->binds[0].heading = 0.0f; + in_pp->zone_id = in_pp->binds[0].zone_id = 394; // Crescent Reach. } } @@ -487,91 +617,91 @@ void WorldDatabase::SetTitaniumDefaultStartZone(PlayerProfile_Struct* in_pp, Cha if (in_cc->deity == 203) // Cazic-Thule Erudites go to Paineel { in_pp->zone_id = 75; // paineel - in_pp->binds[0].zoneId = 75; + in_pp->binds[0].zone_id = 75; } else { in_pp->zone_id = 24; // erudnext - in_pp->binds[0].zoneId = 38; // tox + in_pp->binds[0].zone_id = 38; // tox } break; } case 1: { in_pp->zone_id = 2; // qeynos2 - in_pp->binds[0].zoneId = 2; // qeynos2 + in_pp->binds[0].zone_id = 2; // qeynos2 break; } case 2: { in_pp->zone_id = 29; // halas - in_pp->binds[0].zoneId = 30; // everfrost + in_pp->binds[0].zone_id = 30; // everfrost break; } case 3: { in_pp->zone_id = 19; // rivervale - in_pp->binds[0].zoneId = 20; // kithicor + in_pp->binds[0].zone_id = 20; // kithicor break; } case 4: { in_pp->zone_id = 9; // freportw - in_pp->binds[0].zoneId = 9; // freportw + in_pp->binds[0].zone_id = 9; // freportw break; } case 5: { in_pp->zone_id = 40; // neriaka - in_pp->binds[0].zoneId = 25; // nektulos + in_pp->binds[0].zone_id = 25; // nektulos break; } case 6: { in_pp->zone_id = 52; // gukta - in_pp->binds[0].zoneId = 46; // innothule + in_pp->binds[0].zone_id = 46; // innothule break; } case 7: { in_pp->zone_id = 49; // oggok - in_pp->binds[0].zoneId = 47; // feerrott + in_pp->binds[0].zone_id = 47; // feerrott break; } case 8: { in_pp->zone_id = 60; // kaladima - in_pp->binds[0].zoneId = 68; // butcher + in_pp->binds[0].zone_id = 68; // butcher break; } case 9: { in_pp->zone_id = 54; // gfaydark - in_pp->binds[0].zoneId = 54; // gfaydark + in_pp->binds[0].zone_id = 54; // gfaydark break; } case 10: { in_pp->zone_id = 61; // felwithea - in_pp->binds[0].zoneId = 54; // gfaydark + in_pp->binds[0].zone_id = 54; // gfaydark break; } case 11: { in_pp->zone_id = 55; // akanon - in_pp->binds[0].zoneId = 56; // steamfont + in_pp->binds[0].zone_id = 56; // steamfont break; } case 12: { in_pp->zone_id = 82; // cabwest - in_pp->binds[0].zoneId = 78; // fieldofbone + in_pp->binds[0].zone_id = 78; // fieldofbone break; } case 13: { in_pp->zone_id = 155; // sharvahl - in_pp->binds[0].zoneId = 155; // sharvahl + in_pp->binds[0].zone_id = 155; // sharvahl break; } } @@ -668,7 +798,7 @@ bool WorldDatabase::LoadCharacterCreateCombos() } // this is a slightly modified version of SharedDatabase::GetInventory(...) for character select use-only -bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::InventoryProfile *inv) +bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQ::InventoryProfile *inv) { if (!account_id || !name || !inv) return false; @@ -706,8 +836,8 @@ bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::In " slotid <= %i", name, account_id, - EQEmu::invslot::slotHead, - EQEmu::invslot::slotFeet + EQ::invslot::slotHead, + EQ::invslot::slotFeet ); auto results = QueryDatabase(query); if (!results.Success()) @@ -717,13 +847,13 @@ bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::In int16 slot_id = atoi(row[0]); switch (slot_id) { - case EQEmu::invslot::slotFace: - case EQEmu::invslot::slotEar2: - case EQEmu::invslot::slotNeck: - case EQEmu::invslot::slotShoulders: - case EQEmu::invslot::slotBack: - case EQEmu::invslot::slotFinger1: - case EQEmu::invslot::slotFinger2: + case EQ::invslot::slotFace: + case EQ::invslot::slotEar2: + case EQ::invslot::slotNeck: + case EQ::invslot::slotShoulders: + case EQ::invslot::slotBack: + case EQ::invslot::slotFinger1: + case EQ::invslot::slotFinger2: continue; default: break; @@ -733,7 +863,7 @@ bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::In int8 charges = atoi(row[2]); uint32 color = atoul(row[3]); - uint32 aug[EQEmu::invaug::SOCKET_COUNT]; + uint32 aug[EQ::invaug::SOCKET_COUNT]; aug[0] = (uint32)atoi(row[4]); aug[1] = (uint32)atoi(row[5]); aug[2] = (uint32)atoi(row[6]); @@ -746,11 +876,11 @@ bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::In uint32 ornament_idfile = (uint32)atoul(row[13]); uint32 ornament_hero_model = (uint32)atoul(row[14]); - const EQEmu::ItemData *item = content_db.GetItem(item_id); + const EQ::ItemData *item = content_db.GetItem(item_id); if (!item) continue; - EQEmu::ItemInstance *inst = content_db.CreateBaseItem(item, charges); + EQ::ItemInstance *inst = content_db.CreateBaseItem(item, charges); if (inst == nullptr) continue; @@ -793,7 +923,7 @@ bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::In inst->SetCharges(charges); if (item->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if (aug[i]) inst->PutAugment(this, i, aug[i]); } @@ -805,4 +935,4 @@ bool WorldDatabase::GetCharSelInventory(uint32 account_id, char *name, EQEmu::In } return true; -} \ No newline at end of file +} diff --git a/world/worlddb.h b/world/worlddb.h index 6f08b6fa5..6431f175e 100644 --- a/world/worlddb.h +++ b/world/worlddb.h @@ -31,7 +31,7 @@ class WorldDatabase : public SharedDatabase { public: bool GetStartZone(PlayerProfile_Struct* p_player_profile_struct, CharCreate_Struct* p_char_create_struct, bool is_titanium); void GetCharSelectInfo(uint32 account_id, EQApplicationPacket **out_app, uint32 client_version_bit); - int MoveCharacterToBind(int CharID, uint8 bindnum = 0); + int MoveCharacterToBind(int character_id, uint8 bind_number = 0); void GetLauncherList(std::vector &result); bool GetCharacterLevel(const char *name, int &level); @@ -42,14 +42,14 @@ public: bool StoreCharacter( uint32 account_id, PlayerProfile_Struct *p_player_profile_struct, - EQEmu::InventoryProfile *p_inventory_profile + EQ::InventoryProfile *p_inventory_profile ); private: void SetTitaniumDefaultStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc); void SetSoFDefaultStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc); - bool GetCharSelInventory(uint32 account_id, char* name, EQEmu::InventoryProfile* inv); + bool GetCharSelInventory(uint32 account_id, char* name, EQ::InventoryProfile* inv); }; extern WorldDatabase database; diff --git a/world/zonelist.cpp b/world/zonelist.cpp index 53ac1f2ae..51acd0c01 100644 --- a/world/zonelist.cpp +++ b/world/zonelist.cpp @@ -27,10 +27,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/json/json.h" #include "../common/event_sub.h" #include "web_interface.h" +#include "world_store.h" extern uint32 numzones; extern bool holdzones; -extern EQEmu::Random emu_random; +extern EQ::Random emu_random; extern WebInterfaceList web_interface; volatile bool UCSServerAvailable_ = false; void CatchSignal(int sig_num); @@ -39,11 +40,10 @@ ZSList::ZSList() { NextID = 1; CurGroupID = 1; - LastAllocatedPort = 0; memset(pLockedZones, 0, sizeof(pLockedZones)); - m_tick.reset(new EQ::Timer(5000, true, std::bind(&ZSList::OnTick, this, std::placeholders::_1))); - m_keepalive.reset(new EQ::Timer(2500, true, std::bind(&ZSList::OnKeepAlive, this, std::placeholders::_1))); + m_tick = std::make_unique(5000, true, std::bind(&ZSList::OnTick, this, std::placeholders::_1)); + m_keepalive = std::make_unique(2500, true, std::bind(&ZSList::OnKeepAlive, this, std::placeholders::_1)); } ZSList::~ZSList() { @@ -76,7 +76,12 @@ void ZSList::Remove(const std::string &uuid) auto iter = zone_server_list.begin(); while (iter != zone_server_list.end()) { if ((*iter)->GetUUID().compare(uuid) == 0) { + auto port = (*iter)->GetCPort(); zone_server_list.erase(iter); + + if (port != 0) { + m_ports_free.push_back(port); + } return; } iter++; @@ -239,6 +244,14 @@ bool ZSList::SetLockedZone(uint16 iZoneID, bool iLock) { return false; } +void ZSList::Init() +{ + const WorldConfig* Config = WorldConfig::get(); + for (uint16 i = Config->ZonePortLow; i <= Config->ZonePortHigh; ++i) { + m_ports_free.push_back(i); + } +} + bool ZSList::IsZoneLocked(uint16 iZoneID) { for (auto &zone : pLockedZones) { if (zone == iZoneID) @@ -251,7 +264,7 @@ void ZSList::ListLockedZones(const char* to, WorldTCPConnection* connection) { int x = 0; for (auto &zone : pLockedZones) { if (zone) { - connection->SendEmoteMessageRaw(to, 0, 0, 0, content_db.GetZoneName(zone, true)); + connection->SendEmoteMessageRaw(to, 0, 0, 0, ZoneName(zone, true)); x++; } } @@ -267,20 +280,19 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con strcpy(locked, "No"); } - char* output = 0; - uint32 outsize = 0, outlen = 0; + fmt::memory_buffer out; if (connection->IsConsole()) { - AppendAnyLenString(&output, &outsize, &outlen, "World Locked: %s\r\n", locked); + fmt::format_to(out, "World Locked: {}\r\n", locked); } else { - AppendAnyLenString(&output, &outsize, &outlen, "World Locked: %s^", locked); + fmt::format_to(out, "World Locked: {}^", locked); } if (connection->IsConsole()) { - AppendAnyLenString(&output, &outsize, &outlen, "Zoneservers online:\r\n"); + fmt::format_to(out, "Zoneservers online:\r\n"); } else { - AppendAnyLenString(&output, &outsize, &outlen, "Zoneservers online:^"); + fmt::format_to(out, "Zoneservers online:^"); } int v = 0, w = 0, x = 0, y = 0, z = 0; @@ -320,8 +332,8 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con zone_data_string[0] = 0; } - AppendAnyLenString(&output, &outsize, &outlen, - "#%-3i :: %s :: %15s:%-5i :: %2i :: %s:%i :: %s :: (%u)", + fmt::format_to(out, + "#{:<3} :: {} :: {}:{:<5} :: {:2} :: {}:{} :: {} :: ({})", zone_server_data->GetID(), is_static_string, addr.c_str(), @@ -333,17 +345,16 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con zone_server_data->GetZoneOSProcessID() ); - if (outlen >= 3584) { - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - safe_delete(output); - outsize = 0; - outlen = 0; + if (out.size() >= 3584) { + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); + out.clear(); } else { if (connection->IsConsole()) - AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); + fmt::format_to(out, "\r\n"); else - AppendAnyLenString(&output, &outsize, &outlen, "^"); + fmt::format_to(out, "^"); } x++; } @@ -352,19 +363,18 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con strcpy(zone_data_string, zone_server_data->GetZoneName()); else zone_data_string[0] = 0; - AppendAnyLenString(&output, &outsize, &outlen, " #%i %s %s", zone_server_data->GetID(), is_static_string, zone_data_string); - if (outlen >= 3584) { - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - safe_delete(output); - outsize = 0; - outlen = 0; + fmt::format_to(out, " #{} {} {}", zone_server_data->GetID(), is_static_string, zone_data_string); + if (out.size() >= 3584) { + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); + out.clear(); } else { if (connection->IsConsole()) { - AppendAnyLenString(&output, &outsize, &outlen, "\r\n"); + fmt::format_to(out, "\r\n"); } else { - AppendAnyLenString(&output, &outsize, &outlen, "^"); + fmt::format_to(out, "^"); } } x++; @@ -374,19 +384,16 @@ void ZSList::SendZoneStatus(const char* to, int16 admin, WorldTCPConnection* con } if (connection->IsConsole()) { - AppendAnyLenString(&output, &outsize, &outlen, "%i servers listed. %i servers online.\r\n", x, y); + fmt::format_to(out, "{} servers listed. {} servers online.\r\n", x, y); } else { - AppendAnyLenString(&output, &outsize, &outlen, "%i servers listed. %i servers online.^", x, y); + fmt::format_to(out, "{} servers listed. {} servers online.^", x, y); } - AppendAnyLenString(&output, &outsize, &outlen, "%i zones are static zones, %i zones are booted zones, %i zones available.", z, w, v); + fmt::format_to(out, "{} zones are static zones, {} zones are booted zones, {} zones available.", z, w, v); - if (output) { - connection->SendEmoteMessageRaw(to, 0, 0, 10, output); - } - - safe_delete(output); + auto output = fmt::to_string(out); + connection->SendEmoteMessageRaw(to, 0, 0, 10, output.c_str()); } void ZSList::SendChannelMessage(const char* from, const char* to, uint8 chan_num, uint8 language, const char* message, ...) { @@ -517,7 +524,7 @@ void ZSList::SOPZoneBootup(const char* adminname, uint32 ZoneServerID, const cha ZoneServer* zs = 0; ZoneServer* zs2 = 0; uint32 zoneid; - if (!(zoneid = content_db.GetZoneID(zonename))) + if (!(zoneid = ZoneID(zonename))) SendEmoteMessage(adminname, 0, 0, 0, "Error: SOP_ZoneBootup: zone '%s' not found in 'zone' table. Typo protection=ON.", zonename); else { if (ZoneServerID != 0) @@ -577,30 +584,15 @@ void ZSList::RebootZone(const char* ip1, uint16 port, const char* ip2, uint32 sk safe_delete_array(tmp); } -uint16 ZSList::GetAvailableZonePort() +uint16 ZSList::GetAvailableZonePort() { - const WorldConfig *Config = WorldConfig::get(); - int i; - uint16 port = 0; - - if (LastAllocatedPort == 0) - i = Config->ZonePortLow; - else - i = LastAllocatedPort + 1; - - while (i != LastAllocatedPort && port == 0) { - if (i>Config->ZonePortHigh) - i = Config->ZonePortLow; - - if (!FindByPort(i)) { - port = i; - break; - } - i++; + if (m_ports_free.empty()) { + return 0; } - LastAllocatedPort = port; - return port; + auto first = m_ports_free.front(); + m_ports_free.pop_front(); + return first; } uint32 ZSList::TriggerBootup(uint32 iZoneID, uint32 iInstanceID) { diff --git a/world/zonelist.h b/world/zonelist.h index 8b8525f57..5066d4e6d 100644 --- a/world/zonelist.h +++ b/world/zonelist.h @@ -7,6 +7,7 @@ #include "../common/event/timer.h" #include #include +#include class WorldTCPConnection; class ServerPacket; @@ -22,6 +23,7 @@ public: ZSList(); ~ZSList(); + void Init(); bool IsZoneLocked(uint16 iZoneID); bool SendPacket(ServerPacket *pack); bool SendPacket(uint32 zoneid, ServerPacket *pack); @@ -73,8 +75,7 @@ private: uint32 NextID; uint16 pLockedZones[MaxLockedZones]; uint32 CurGroupID; - uint16 LastAllocatedPort; - + std::deque m_ports_free; std::unique_ptr m_tick; std::unique_ptr m_keepalive; diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 45b7f93c7..4e37b1d7e 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -35,6 +35,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "adventure_manager.h" #include "ucs.h" #include "queryserv.h" +#include "world_store.h" +#include "dynamic_zone.h" +#include "expedition_message.h" extern ClientList client_list; extern GroupLFPList LFPGroupList; @@ -68,12 +71,12 @@ ZoneServer::ZoneServer(std::shared_ptr conn tcpc->OnMessage(std::bind(&ZoneServer::HandleMessage, this, std::placeholders::_1, std::placeholders::_2)); - boot_timer_obj.reset(new EQ::Timer(100, true, [this](EQ::Timer *obj) { + boot_timer_obj = std::make_unique(100, true, [this](EQ::Timer *obj) { if (zone_boot_timer.Check()) { LSBootUpdate(GetZoneID(), true); zone_boot_timer.Disable(); } - })); + }); this->console = console; } @@ -86,7 +89,7 @@ ZoneServer::~ZoneServer() { bool ZoneServer::SetZone(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { is_booting_up = false; - const char* zn = MakeLowerString(content_db.GetZoneName(iZoneID)); + const char* zn = MakeLowerString(ZoneName(iZoneID)); char* longname; if (iZoneID) @@ -566,7 +569,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { SetZone_Struct* szs = (SetZone_Struct*)pack->pBuffer; if (szs->zoneid != 0) { - if (content_db.GetZoneName(szs->zoneid)) + if (ZoneName(szs->zoneid)) SetZone(szs->zoneid, szs->instanceid, szs->staticzone); else SetZone(0); @@ -648,7 +651,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { if (s->ZoneServerID != 0) zs = zoneserver_list.FindByID(s->ZoneServerID); else if (s->zoneid != 0) - zs = zoneserver_list.FindByName(content_db.GetZoneName(s->zoneid)); + zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); else zoneserver_list.SendEmoteMessage(s->adminname, 0, 0, 0, "Error: SOP_ZoneShutdown: neither ID nor name specified"); @@ -660,7 +663,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { } case ServerOP_ZoneBootup: { ServerZoneStateChange_struct* s = (ServerZoneStateChange_struct *)pack->pBuffer; - zoneserver_list.SOPZoneBootup(s->adminname, s->ZoneServerID, content_db.GetZoneName(s->zoneid), s->makestatic); + zoneserver_list.SOPZoneBootup(s->adminname, s->ZoneServerID, ZoneName(s->zoneid), s->makestatic); break; } case ServerOP_ZoneStatus: { @@ -1018,13 +1021,13 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { break; case 1: if (zoneserver_list.SetLockedZone(s->zoneID, true)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", content_db.GetZoneName(s->zoneID)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone locked: %s", ZoneName(s->zoneID)); else this->SendEmoteMessageRaw(s->adminname, 0, 0, 0, "Failed to change lock"); break; case 2: if (zoneserver_list.SetLockedZone(s->zoneID, false)) - zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", content_db.GetZoneName(s->zoneID)); + zoneserver_list.SendEmoteMessage(0, 0, 80, 15, "Zone unlocked: %s", ZoneName(s->zoneID)); else this->SendEmoteMessageRaw(s->adminname, 0, 0, 0, "Failed to change lock"); break; @@ -1078,7 +1081,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { LogInfo("Unable to locate zone record for zone id [{}] or instance id [{}] in zoneserver list for ServerOP_Consent_Response operation", s->zone_id, s->instance_id); } - if (s->consent_type == EQEmu::consent::Normal) { + if (s->consent_type == EQ::consent::Normal) { // send the message to the client being granted or denied permission ClientListEntry* cle = client_list.FindCharacter(s->grantname); if (cle) { @@ -1236,13 +1239,86 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { QSLink.SendPacket(pack); break; } - case ServerOP_CZSignalClientByName: + case ServerOP_CZCastSpellPlayer: + case ServerOP_CZCastSpellGroup: + case ServerOP_CZCastSpellRaid: + case ServerOP_CZCastSpellGuild: + case ServerOP_CZMarqueePlayer: + case ServerOP_CZMarqueeGroup: + case ServerOP_CZMarqueeRaid: + case ServerOP_CZMarqueeGuild: case ServerOP_CZMessagePlayer: - case ServerOP_CZSignalNPC: - case ServerOP_CZSetEntityVariableByNPCTypeID: - case ServerOP_CZSignalClient: + case ServerOP_CZMessageGroup: + case ServerOP_CZMessageRaid: + case ServerOP_CZMessageGuild: + case ServerOP_CZMovePlayer: + case ServerOP_CZMoveGroup: + case ServerOP_CZMoveRaid: + case ServerOP_CZMoveGuild: + case ServerOP_CZMoveInstancePlayer: + case ServerOP_CZMoveInstanceGroup: + case ServerOP_CZMoveInstanceRaid: + case ServerOP_CZMoveInstanceGuild: + case ServerOP_CZRemoveSpellPlayer: + case ServerOP_CZRemoveSpellGroup: + case ServerOP_CZRemoveSpellRaid: + case ServerOP_CZRemoveSpellGuild: case ServerOP_CZSetEntityVariableByClientName: + case ServerOP_CZSetEntityVariableByNPCTypeID: + case ServerOP_CZSetEntityVariableByGroupID: + case ServerOP_CZSetEntityVariableByRaidID: + case ServerOP_CZSetEntityVariableByGuildID: + case ServerOP_CZSignalNPC: + case ServerOP_CZSignalClient: + case ServerOP_CZSignalClientByName: + case ServerOP_CZSignalGroup: + case ServerOP_CZSignalRaid: + case ServerOP_CZSignalGuild: + case ServerOP_CZTaskActivityResetPlayer: + case ServerOP_CZTaskActivityResetGroup: + case ServerOP_CZTaskActivityResetRaid: + case ServerOP_CZTaskActivityResetGuild: + case ServerOP_CZTaskActivityUpdatePlayer: + case ServerOP_CZTaskActivityUpdateGroup: + case ServerOP_CZTaskActivityUpdateRaid: + case ServerOP_CZTaskActivityUpdateGuild: + case ServerOP_CZTaskAssignPlayer: + case ServerOP_CZTaskAssignGroup: + case ServerOP_CZTaskAssignRaid: + case ServerOP_CZTaskAssignGuild: + case ServerOP_CZTaskDisablePlayer: + case ServerOP_CZTaskDisableGroup: + case ServerOP_CZTaskDisableRaid: + case ServerOP_CZTaskDisableGuild: + case ServerOP_CZTaskEnablePlayer: + case ServerOP_CZTaskEnableGroup: + case ServerOP_CZTaskEnableRaid: + case ServerOP_CZTaskEnableGuild: + case ServerOP_CZTaskFailPlayer: + case ServerOP_CZTaskFailGroup: + case ServerOP_CZTaskFailRaid: + case ServerOP_CZTaskFailGuild: + case ServerOP_CZTaskRemovePlayer: + case ServerOP_CZTaskRemoveGroup: + case ServerOP_CZTaskRemoveRaid: + case ServerOP_CZTaskRemoveGuild: + case ServerOP_WWAssignTask: + case ServerOP_WWCastSpell: + case ServerOP_WWDisableTask: + case ServerOP_WWEnableTask: + case ServerOP_WWFailTask: case ServerOP_WWMarquee: + case ServerOP_WWMessage: + case ServerOP_WWMove: + case ServerOP_WWMoveInstance: + case ServerOP_WWRemoveSpell: + case ServerOP_WWRemoveTask: + case ServerOP_WWResetActivity: + case ServerOP_WWSetEntityVariableClient: + case ServerOP_WWSetEntityVariableNPC: + case ServerOP_WWSignalClient: + case ServerOP_WWSignalNPC: + case ServerOP_WWUpdateActivity: case ServerOP_DepopAllPlayersCorpses: case ServerOP_DepopPlayerCorpse: case ServerOP_ReloadTitles: @@ -1263,7 +1339,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { } LogInfo("Loading skill caps"); - if (!database.LoadSkillCaps(hotfix_name)) { + if (!content_db.LoadSkillCaps(hotfix_name)) { LogInfo("Error: Could not load skill cap data. But ignoring"); } @@ -1281,6 +1357,46 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { cle->ProcessTellQueue(); break; } + case ServerOP_CZClientMessageString: + { + auto buf = reinterpret_cast(pack->pBuffer); + client_list.SendPacket(buf->character_name, pack); + break; + } + case ServerOP_ExpeditionLockout: + case ServerOP_ExpeditionLockoutDuration: + case ServerOP_ExpeditionLockState: + case ServerOP_ExpeditionReplayOnJoin: + case ServerOP_ExpeditionExpireWarning: + { + zoneserver_list.SendPacket(pack); + break; + } + case ServerOP_ExpeditionCreate: + case ServerOP_ExpeditionGetMemberStatuses: + case ServerOP_ExpeditionMemberChange: + case ServerOP_ExpeditionMemberStatus: + case ServerOP_ExpeditionMemberSwap: + case ServerOP_ExpeditionMembersRemoved: + case ServerOP_ExpeditionDzAddPlayer: + case ServerOP_ExpeditionDzMakeLeader: + case ServerOP_ExpeditionCharacterLockout: + case ServerOP_ExpeditionSaveInvite: + case ServerOP_ExpeditionRequestInvite: + { + ExpeditionMessage::HandleZoneMessage(pack); + break; + } + case ServerOP_DzAddRemoveCharacter: + case ServerOP_DzRemoveAllCharacters: + case ServerOP_DzSetSecondsRemaining: + case ServerOP_DzSetCompass: + case ServerOP_DzSetSafeReturn: + case ServerOP_DzSetZoneIn: + { + DynamicZone::HandleZoneMessage(pack); + break; + } default: { LogInfo("Unknown ServerOPcode from zone {:#04x}, size [{}]", pack->opcode, pack->size); diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 80415f6ff..0430274f9 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -22,6 +22,7 @@ SET(zone_sources corpse.cpp data_bucket.cpp doors.cpp + dynamic_zone.cpp effects.cpp embparser.cpp embparser_api.cpp @@ -30,6 +31,9 @@ SET(zone_sources encounter.cpp entity.cpp exp.cpp + expedition.cpp + expedition_database.cpp + expedition_request.cpp fastmath.cpp fearpath.cpp forage.cpp @@ -48,6 +52,7 @@ SET(zone_sources lua_encounter.cpp lua_entity.cpp lua_entity_list.cpp + lua_expedition.cpp lua_general.cpp lua_group.cpp lua_hate_list.cpp @@ -100,8 +105,10 @@ SET(zone_sources perl_client.cpp perl_doors.cpp perl_entity.cpp + perl_expedition.cpp perl_groups.cpp perl_hateentry.cpp + perl_inventory.cpp perl_mob.cpp perl_npc.cpp perl_object.cpp @@ -125,6 +132,10 @@ SET(zone_sources special_attacks.cpp spell_effects.cpp spells.cpp + task_client_state.cpp + task_goal_list_manager.cpp + task_manager.cpp + task_proximity_manager.cpp tasks.cpp titles.cpp tradeskills.cpp @@ -141,9 +152,10 @@ SET(zone_sources zone.cpp zone_config.cpp zonedb.cpp + zone_event_scheduler.cpp zone_reload.cpp - zoning.cpp -) + zone_store.cpp + zoning.cpp) SET(zone_headers aa.h @@ -164,6 +176,7 @@ SET(zone_headers corpse.h data_bucket.h doors.h + dynamic_zone.h embparser.h embperl.h embxs.h @@ -171,6 +184,9 @@ SET(zone_headers entity.h errmsg.h event_codes.h + expedition.h + expedition_database.h + expedition_request.h fastmath.h forage.h global_loot_manager.h @@ -186,6 +202,7 @@ SET(zone_headers lua_encounter.h lua_entity.h lua_entity_list.h + lua_expedition.h lua_general.h lua_group.h lua_hate_list.h @@ -229,7 +246,6 @@ SET(zone_headers quest_interface.h questmgr.h quest_parser_collection.h - raid.h raids.h raycast_mesh.h skills.h @@ -237,6 +253,10 @@ SET(zone_headers spawn2.h spawngroup.h string_ids.h + task_client_state.h + task_goal_list_manager.h + task_manager.h + task_proximity_manager.h tasks.h titles.h trap.h @@ -246,10 +266,12 @@ SET(zone_headers worldserver.h xtargetautohaters.h zone.h + zone_event_scheduler.h zone_config.h zonedb.h zonedump.h - zone_reload.h ) + zone_reload.h + zone_store.h) ADD_EXECUTABLE(zone ${zone_sources} ${zone_headers}) @@ -257,6 +279,6 @@ INSTALL(TARGETS zone RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) ADD_DEFINITIONS(-DZONE) -TARGET_LINK_LIBRARIES(zone ${SERVER_LIBS}) +TARGET_LINK_LIBRARIES(zone ${ZONE_LIBS}) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) diff --git a/zone/aa.cpp b/zone/aa.cpp index 45ad357a2..0b19065bf 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -33,6 +33,7 @@ Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net) #include "string_ids.h" #include "titles.h" #include "zonedb.h" +#include "zone_store.h" extern QueryServ* QServ; @@ -441,13 +442,13 @@ void Mob::WakeTheDead(uint16 spell_id, Mob *target, uint32 duration) //gear stuff, need to make sure there's //no situation where this stuff can be duped - for (int x = EQEmu::invslot::EQUIPMENT_BEGIN; x <= EQEmu::invslot::EQUIPMENT_END; x++) + for (int x = EQ::invslot::EQUIPMENT_BEGIN; x <= EQ::invslot::EQUIPMENT_END; x++) { uint32 sitem = 0; sitem = CorpseToUse->GetWornItem(x); if(sitem){ - const EQEmu::ItemData * itm = database.GetItem(sitem); - npca->AddLootDrop(itm, &npca->itemlist, 1, 1, 255, true, true); + const EQ::ItemData * itm = database.GetItem(sitem); + npca->AddLootDrop(itm, &npca->itemlist, NPC::NewLootDropEntry(), true); } } @@ -493,9 +494,6 @@ void Client::ResetAA() { m_pp.raid_leadership_exp = 0; database.DeleteCharacterLeadershipAAs(CharacterID()); - // undefined for these clients - if (ClientVersionBit() & EQEmu::versions::maskTitaniumAndEarlier) - Kick("AA Reset on client that doesn't support it"); } void Client::SendClearAA() @@ -1245,12 +1243,12 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { // Bards can cast instant cast AAs while they are casting another song if(spells[rank->spell].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { - if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), EQEmu::spells::CastingSlot::AltAbility, spells[rank->spell].mana, -1, spells[rank->spell].ResistDiff, false)) { + if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), EQ::spells::CastingSlot::AltAbility, spells[rank->spell].mana, -1, spells[rank->spell].ResistDiff, false)) { return; } ExpendAlternateAdvancementCharge(ability->id); } else { - if(!CastSpell(rank->spell, target_id, EQEmu::spells::CastingSlot::AltAbility, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) { + if(!CastSpell(rank->spell, target_id, EQ::spells::CastingSlot::AltAbility, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) { return; } } @@ -1479,7 +1477,7 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { //the one titanium hack i will allow //just to make sure we dont crash the client with newer aas //we'll exclude any expendable ones - if(IsClient() && CastToClient()->ClientVersionBit() & EQEmu::versions::maskTitaniumAndEarlier) { + if(IsClient() && CastToClient()->ClientVersionBit() & EQ::versions::maskTitaniumAndEarlier) { if(ability->charges > 0) { return false; } diff --git a/zone/aggro.cpp b/zone/aggro.cpp index 24dd90e7d..33221b63a 100644 --- a/zone/aggro.cpp +++ b/zone/aggro.cpp @@ -32,6 +32,7 @@ #endif #include "map.h" +#include "water_map.h" extern Zone* zone; //#define LOSDEBUG 6 @@ -237,6 +238,11 @@ bool Mob::CheckWillAggro(Mob *mob) { if (!mob->CastToClient()->ClientFinishedLoading() || mob->CastToClient()->IsHoveringForRespawn() || mob->CastToClient()->bZoning) return false; } + + // We don't want to aggro clients outside of water if we're water only. + if (mob->IsClient() && mob->CastToClient()->GetLastRegion() != RegionTypeWater && IsUnderwaterOnly()) { + return false; + } /** * Pets shouldn't scan for aggro @@ -462,6 +468,12 @@ bool Mob::IsAttackAllowed(Mob *target, bool isSpellAttack) return false; } + if (target->GetSpecialAbility(IMMUNE_DAMAGE_CLIENT) && IsClient()) + return false; + + if (target->GetSpecialAbility(IMMUNE_DAMAGE_NPC) && IsNPC()) + return false; + // can't damage own pet (applies to everthing) Mob *target_owner = target->GetOwner(); Mob *our_owner = GetOwner(); @@ -794,7 +806,7 @@ bool Mob::IsBeneficialAllowed(Mob *target) return false; } -bool Mob::CombatRange(Mob* other) +bool Mob::CombatRange(Mob* other, float fixed_size_mod, bool aeRampage) { if(!other) return(false); @@ -819,13 +831,25 @@ bool Mob::CombatRange(Mob* other) // this could still use some work, but for now it's an improvement.... - if (size_mod > 29) + if (size_mod > 29) { size_mod *= size_mod; - else if (size_mod > 19) + } else if (size_mod > 19) { size_mod *= size_mod * 2; - else + } else { size_mod *= size_mod * 4; + } + if (other->GetRace() == 184) // Lord Vyemm and other velious dragons + { + size_mod *= 1.75; + } + if (other->GetRace() == 122) // Dracoliche in Fear. Skeletal Dragon + { + size_mod *= 2.25; + } + + size_mod *= RuleR(Combat,HitBoxMod); // used for testing sizemods on different races. + size_mod *= fixed_size_mod; // used to extend the size_mod // prevention of ridiculously sized hit boxes if (size_mod > 10000) @@ -859,6 +883,15 @@ bool Mob::CombatRange(Mob* other) else SetPseudoRoot(false); } + if(aeRampage) { + float multiplyer = GetSize() * RuleR(Combat, AERampageSafeZone); + float ramp_range = (size_mod * multiplyer); + if (_DistNoRoot <= ramp_range) { + return true; + } else { + return false; + } + } if (_DistNoRoot <= size_mod) { @@ -866,13 +899,11 @@ bool Mob::CombatRange(Mob* other) if (flymode != GravityBehavior::Flying && _zDist > 500 && !CheckLastLosState()) { return false; } - return true; } return false; } -//Father Nitwit's LOS code bool Mob::CheckLosFN(Mob *other) { bool Result = false; @@ -1119,7 +1150,9 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib for (int o = 0; o < EFFECT_COUNT; o++) { switch (spells[spell_id].effectid[o]) { - case SE_CurrentHP: { + case SE_CurrentHP: + case SE_PercentalHeal: + { if (heal_possible == 0) { AggroAmount += 1; break; diff --git a/zone/api_service.cpp b/zone/api_service.cpp index b038da1a6..f97c451b1 100644 --- a/zone/api_service.cpp +++ b/zone/api_service.cpp @@ -22,6 +22,7 @@ #include "../common/net/websocket_server.h" #include "../common/eqemu_logsys.h" #include "zonedb.h" +#include "zone_store.h" #include "client.h" #include "entity.h" #include "corpse.h" diff --git a/zone/attack.cpp b/zone/attack.cpp index 6c72fbe6a..2f85dbaaf 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -59,74 +59,74 @@ extern FastMath g_Math; extern EntityList entity_list; extern Zone* zone; -EQEmu::skills::SkillType Mob::AttackAnimation(int Hand, const EQEmu::ItemInstance* weapon, EQEmu::skills::SkillType skillinuse) +EQ::skills::SkillType Mob::AttackAnimation(int Hand, const EQ::ItemInstance* weapon, EQ::skills::SkillType skillinuse) { // Determine animation int type = 0; if (weapon && weapon->IsClassCommon()) { - const EQEmu::ItemData* item = weapon->GetItem(); + const EQ::ItemData* item = weapon->GetItem(); Log(Logs::Detail, Logs::Attack, "Weapon skill : %i", item->ItemType); switch (item->ItemType) { - case EQEmu::item::ItemType1HSlash: // 1H Slashing - skillinuse = EQEmu::skills::Skill1HSlashing; + case EQ::item::ItemType1HSlash: // 1H Slashing + skillinuse = EQ::skills::Skill1HSlashing; type = anim1HWeapon; break; - case EQEmu::item::ItemType2HSlash: // 2H Slashing - skillinuse = EQEmu::skills::Skill2HSlashing; + case EQ::item::ItemType2HSlash: // 2H Slashing + skillinuse = EQ::skills::Skill2HSlashing; type = anim2HSlashing; break; - case EQEmu::item::ItemType1HPiercing: // Piercing - skillinuse = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType1HPiercing: // Piercing + skillinuse = EQ::skills::Skill1HPiercing; type = anim1HPiercing; break; - case EQEmu::item::ItemType1HBlunt: // 1H Blunt - skillinuse = EQEmu::skills::Skill1HBlunt; + case EQ::item::ItemType1HBlunt: // 1H Blunt + skillinuse = EQ::skills::Skill1HBlunt; type = anim1HWeapon; break; - case EQEmu::item::ItemType2HBlunt: // 2H Blunt - skillinuse = EQEmu::skills::Skill2HBlunt; + case EQ::item::ItemType2HBlunt: // 2H Blunt + skillinuse = EQ::skills::Skill2HBlunt; type = anim2HSlashing; //anim2HWeapon break; - case EQEmu::item::ItemType2HPiercing: // 2H Piercing - if (IsClient() && CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::RoF2) - skillinuse = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType2HPiercing: // 2H Piercing + if (IsClient() && CastToClient()->ClientVersion() < EQ::versions::ClientVersion::RoF2) + skillinuse = EQ::skills::Skill1HPiercing; else - skillinuse = EQEmu::skills::Skill2HPiercing; + skillinuse = EQ::skills::Skill2HPiercing; type = anim2HWeapon; break; - case EQEmu::item::ItemTypeMartial: - skillinuse = EQEmu::skills::SkillHandtoHand; + case EQ::item::ItemTypeMartial: + skillinuse = EQ::skills::SkillHandtoHand; type = animHand2Hand; break; default: - skillinuse = EQEmu::skills::SkillHandtoHand; + skillinuse = EQ::skills::SkillHandtoHand; type = animHand2Hand; break; }// switch } else if (IsNPC()) { switch (skillinuse) { - case EQEmu::skills::Skill1HSlashing: // 1H Slashing + case EQ::skills::Skill1HSlashing: // 1H Slashing type = anim1HWeapon; break; - case EQEmu::skills::Skill2HSlashing: // 2H Slashing + case EQ::skills::Skill2HSlashing: // 2H Slashing type = anim2HSlashing; break; - case EQEmu::skills::Skill1HPiercing: // Piercing + case EQ::skills::Skill1HPiercing: // Piercing type = anim1HPiercing; break; - case EQEmu::skills::Skill1HBlunt: // 1H Blunt + case EQ::skills::Skill1HBlunt: // 1H Blunt type = anim1HWeapon; break; - case EQEmu::skills::Skill2HBlunt: // 2H Blunt + case EQ::skills::Skill2HBlunt: // 2H Blunt type = anim2HSlashing; //anim2HWeapon break; - case EQEmu::skills::Skill2HPiercing: // 2H Piercing + case EQ::skills::Skill2HPiercing: // 2H Piercing type = anim2HWeapon; break; - case EQEmu::skills::SkillHandtoHand: + case EQ::skills::SkillHandtoHand: type = animHand2Hand; break; default: @@ -135,12 +135,12 @@ EQEmu::skills::SkillType Mob::AttackAnimation(int Hand, const EQEmu::ItemInstanc }// switch } else { - skillinuse = EQEmu::skills::SkillHandtoHand; + skillinuse = EQ::skills::SkillHandtoHand; type = animHand2Hand; } // If we're attacking with the secondary hand, play the dual wield anim - if (Hand == EQEmu::invslot::slotSecondary) // DW anim + if (Hand == EQ::invslot::slotSecondary) // DW anim type = animDualWield; DoAnim(type, 0, false); @@ -148,9 +148,9 @@ EQEmu::skills::SkillType Mob::AttackAnimation(int Hand, const EQEmu::ItemInstanc return skillinuse; } -int Mob::compute_tohit(EQEmu::skills::SkillType skillinuse) +int Mob::compute_tohit(EQ::skills::SkillType skillinuse) { - int tohit = GetSkill(EQEmu::skills::SkillOffense) + 7; + int tohit = GetSkill(EQ::skills::SkillOffense) + 7; tohit += GetSkill(skillinuse); if (IsNPC()) tohit += CastToNPC()->GetAccuracyRating(); @@ -168,7 +168,7 @@ int Mob::compute_tohit(EQEmu::skills::SkillType skillinuse) } // return -1 in cases that always hit -int Mob::GetTotalToHit(EQEmu::skills::SkillType skill, int chance_mod) +int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod) { if (chance_mod >= 10000) // override for stuff like SE_SkillAttack return -1; @@ -185,13 +185,13 @@ int Mob::GetTotalToHit(EQEmu::skills::SkillType skill, int chance_mod) // unsure on the stacking order of these effects, rather hard to parse // item mod2 accuracy isn't applied to range? Theory crafting and parses back it up I guess // mod2 accuracy -- flat bonus - if (skill != EQEmu::skills::SkillArchery && skill != EQEmu::skills::SkillThrowing) + if (skill != EQ::skills::SkillArchery && skill != EQ::skills::SkillThrowing) accuracy += itembonuses.HitChance; // 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus - accuracy += itembonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] + - aabonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] + - spellbonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] + + accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] + + aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] + + spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.Accuracy[skill] + aabonuses.Accuracy[skill] + spellbonuses.Accuracy[skill]; @@ -200,13 +200,13 @@ int Mob::GetTotalToHit(EQEmu::skills::SkillType skill, int chance_mod) if (spellbonuses.HitChanceEffect[skill] >= 10000 || aabonuses.HitChanceEffect[skill] >= 10000) return -1; - if (spellbonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] >= 10000) + if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000) return -1; // 184 Accuracy % aka SE_HitChance -- percentage increase - auto hit_bonus = itembonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] + - aabonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] + - spellbonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] + + auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] + + aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] + + spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.HitChanceEffect[skill] + aabonuses.HitChanceEffect[skill] + spellbonuses.HitChanceEffect[skill]; @@ -228,7 +228,7 @@ int Mob::GetTotalToHit(EQEmu::skills::SkillType skill, int chance_mod) // the AGI bonus has actually drastically changed from classic int Mob::compute_defense() { - int defense = GetSkill(EQEmu::skills::SkillDefense) * 400 / 225; + int defense = GetSkill(EQ::skills::SkillDefense) * 400 / 225; defense += (8000 * (GetAGI() - 40)) / 36000; if (IsClient()) defense += CastToClient()->GetHeroicAGI() / 10; @@ -283,7 +283,7 @@ bool Mob::CheckHitChance(Mob* other, DamageHitInfo &hit) bool lua_ret = false; bool ignoreDefault = false; lua_ret = LuaParser::Instance()->CheckHitChance(this, other, hit, ignoreDefault); - + if(ignoreDefault) { return lua_ret; } @@ -323,7 +323,7 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) bool lua_ret = false; bool ignoreDefault = false; lua_ret = LuaParser::Instance()->AvoidDamage(this, other, hit, ignoreDefault); - + if (ignoreDefault) { return lua_ret; } @@ -390,20 +390,20 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) // riposte -- it may seem crazy, but if the attacker has SPA 173 on them, they are immune to Ripo bool ImmuneRipo = attacker->aabonuses.RiposteChance || attacker->spellbonuses.RiposteChance || attacker->itembonuses.RiposteChance || attacker->IsEnraged(); // Need to check if we have something in MainHand to actually attack with (or fists) - if (hit.hand != EQEmu::invslot::slotRange && (CanThisClassRiposte() || IsEnraged()) && InFront && !ImmuneRipo) { + if (hit.hand != EQ::invslot::slotRange && (CanThisClassRiposte() || IsEnraged()) && InFront && !ImmuneRipo) { if (IsEnraged()) { hit.damage_done = DMG_RIPOSTED; LogCombat("I am enraged, riposting frontal attack"); return true; } if (IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillRiposte, other, -10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillRiposte, other, -10); // check auto discs ... I guess aa/items too :P if (spellbonuses.RiposteChance == 10000 || aabonuses.RiposteChance == 10000 || itembonuses.RiposteChance == 10000) { hit.damage_done = DMG_RIPOSTED; return true; } - int chance = GetSkill(EQEmu::skills::SkillRiposte) + 100; + int chance = GetSkill(EQ::skills::SkillRiposte) + 100; chance += (chance * (aabonuses.RiposteChance + spellbonuses.RiposteChance + itembonuses.RiposteChance)) / 100; chance /= 50; chance += itembonuses.HeroicDEX / 25; // live has "heroic strickthrough" here to counter @@ -412,7 +412,7 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) chance -= chance * counter; } // AA Slippery Attacks - if (hit.hand == EQEmu::invslot::slotSecondary) { + if (hit.hand == EQ::invslot::slotSecondary) { int slip = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail; chance += chance * slip / 100; } @@ -435,14 +435,14 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) if (CanThisClassBlock() && (InFront || bBlockFromRear)) { if (IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillBlock, other, -10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillBlock, other, -10); // check auto discs ... I guess aa/items too :P if (spellbonuses.IncreaseBlockChance == 10000 || aabonuses.IncreaseBlockChance == 10000 || itembonuses.IncreaseBlockChance == 10000) { hit.damage_done = DMG_BLOCKED; return true; } - int chance = GetSkill(EQEmu::skills::SkillBlock) + 100; + int chance = GetSkill(EQ::skills::SkillBlock) + 100; chance += (chance * (aabonuses.IncreaseBlockChance + spellbonuses.IncreaseBlockChance + itembonuses.IncreaseBlockChance)) / 100; chance /= 25; chance += itembonuses.HeroicDEX / 25; // live has "heroic strickthrough" here to counter @@ -457,15 +457,15 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) } // parry - if (CanThisClassParry() && InFront && hit.hand != EQEmu::invslot::slotRange) { + if (CanThisClassParry() && InFront && hit.hand != EQ::invslot::slotRange) { if (IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillParry, other, -10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillParry, other, -10); // check auto discs ... I guess aa/items too :P if (spellbonuses.ParryChance == 10000 || aabonuses.ParryChance == 10000 || itembonuses.ParryChance == 10000) { hit.damage_done = DMG_PARRIED; return true; } - int chance = GetSkill(EQEmu::skills::SkillParry) + 100; + int chance = GetSkill(EQ::skills::SkillParry) + 100; chance += (chance * (aabonuses.ParryChance + spellbonuses.ParryChance + itembonuses.ParryChance)) / 100; chance /= 45; chance += itembonuses.HeroicDEX / 25; // live has "heroic strickthrough" here to counter @@ -482,13 +482,13 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit) // dodge if (CanThisClassDodge() && (InFront || GetClass() == MONK)) { if (IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillDodge, other, -10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillDodge, other, -10); // check auto discs ... I guess aa/items too :P if (spellbonuses.DodgeChance == 10000 || aabonuses.DodgeChance == 10000 || itembonuses.DodgeChance == 10000) { hit.damage_done = DMG_DODGED; return true; } - int chance = GetSkill(EQEmu::skills::SkillDodge) + 100; + int chance = GetSkill(EQ::skills::SkillDodge) + 100; chance += (chance * (aabonuses.DodgeChance + spellbonuses.DodgeChance + itembonuses.DodgeChance)) / 100; chance /= 45; chance += itembonuses.HeroicAGI / 25; // live has "heroic strickthrough" here to counter @@ -775,19 +775,19 @@ int Mob::GetClassRaceACBonus() } if (GetRace() == IKSAR) - ac_bonus += EQEmu::Clamp(static_cast(level), 10, 35); + ac_bonus += EQ::Clamp(static_cast(level), 10, 35); return ac_bonus; } -int Mob::ACSum() +int Mob::ACSum(bool skip_caps) { int ac = 0; // this should be base AC whenever shrouds come around ac += itembonuses.AC; // items + food + tribute int shield_ac = 0; if (HasShieldEquiped() && IsClient()) { auto client = CastToClient(); - auto inst = client->GetInv().GetItem(EQEmu::invslot::slotSecondary); + auto inst = client->GetInv().GetItem(EQ::invslot::slotSecondary); if (inst) { if (inst->GetItemRecommendedLevel(true) <= GetLevel()) shield_ac = inst->GetItemArmorClass(true); @@ -799,7 +799,7 @@ int Mob::ACSum() // EQ math ac = (ac * 4) / 3; // anti-twink - if (IsClient() && GetLevel() < RuleI(Combat, LevelToStopACTwinkControl)) + if (!skip_caps && IsClient() && GetLevel() < RuleI(Combat, LevelToStopACTwinkControl)) ac = std::min(ac, 25 + 6 * GetLevel()); ac = std::max(0, ac + GetClassRaceACBonus()); if (IsNPC()) { @@ -816,18 +816,18 @@ int Mob::ACSum() if (owner) ac += owner->aabonuses.PetAvoidance + owner->spellbonuses.PetAvoidance + owner->itembonuses.PetAvoidance; auto spell_aa_ac = aabonuses.AC + spellbonuses.AC; - ac += GetSkill(EQEmu::skills::SkillDefense) / 5; - if (EQEmu::ValueWithin(static_cast(GetClass()), NECROMANCER, ENCHANTER)) + ac += GetSkill(EQ::skills::SkillDefense) / 5; + if (EQ::ValueWithin(static_cast(GetClass()), NECROMANCER, ENCHANTER)) ac += spell_aa_ac / 3; else ac += spell_aa_ac / 4; } else { // TODO: so we can't set NPC skills ... so the skill bonus ends up being HUGE so lets nerf them a bit auto spell_aa_ac = aabonuses.AC + spellbonuses.AC; - if (EQEmu::ValueWithin(static_cast(GetClass()), NECROMANCER, ENCHANTER)) - ac += GetSkill(EQEmu::skills::SkillDefense) / 2 + spell_aa_ac / 3; + if (EQ::ValueWithin(static_cast(GetClass()), NECROMANCER, ENCHANTER)) + ac += GetSkill(EQ::skills::SkillDefense) / 2 + spell_aa_ac / 3; else - ac += GetSkill(EQEmu::skills::SkillDefense) / 3 + spell_aa_ac / 4; + ac += GetSkill(EQ::skills::SkillDefense) / 3 + spell_aa_ac / 4; } if (GetAGI() > 70) @@ -835,11 +835,11 @@ int Mob::ACSum() if (ac < 0) ac = 0; - if (IsClient() + if (!skip_caps && (IsClient() #ifdef BOTS || IsBot() #endif - ) { + )) { auto softcap = GetACSoftcap(); auto returns = GetSoftcapReturns(); int total_aclimitmod = aabonuses.CombatStability + itembonuses.CombatStability + spellbonuses.CombatStability; @@ -862,37 +862,38 @@ int Mob::ACSum() int Mob::GetBestMeleeSkill() { int bestSkill=0; - EQEmu::skills::SkillType meleeSkills[]= - { EQEmu::skills::Skill1HBlunt, - EQEmu::skills::Skill1HSlashing, - EQEmu::skills::Skill2HBlunt, - EQEmu::skills::Skill2HSlashing, - EQEmu::skills::SkillHandtoHand, - EQEmu::skills::Skill1HPiercing, - EQEmu::skills::Skill2HPiercing, - EQEmu::skills::SkillCount + + EQ::skills::SkillType meleeSkills[]= + { EQ::skills::Skill1HBlunt, + EQ::skills::Skill1HSlashing, + EQ::skills::Skill2HBlunt, + EQ::skills::Skill2HSlashing, + EQ::skills::SkillHandtoHand, + EQ::skills::Skill1HPiercing, + EQ::skills::Skill2HPiercing, + EQ::skills::SkillCount }; int i; - for (i=0; meleeSkills[i] != EQEmu::skills::SkillCount; ++i) { + for (i=0; meleeSkills[i] != EQ::skills::SkillCount; ++i) { int value; value = GetSkill(meleeSkills[i]); bestSkill = std::max(value, bestSkill); } - + return bestSkill; } -int Mob::offense(EQEmu::skills::SkillType skill) +int Mob::offense(EQ::skills::SkillType skill) { int offense = GetSkill(skill); int stat_bonus = GetSTR(); switch (skill) { - case EQEmu::skills::SkillArchery: - case EQEmu::skills::SkillThrowing: + case EQ::skills::SkillArchery: + case EQ::skills::SkillThrowing: stat_bonus = GetDEX(); - break; + break; // Mobs with no weapons default to H2H. // Since H2H is capped at 100 for many many classes, @@ -901,7 +902,7 @@ int Mob::offense(EQEmu::skills::SkillType skill) // // Maybe we tweak this if Disarm is actually implemented. - case EQEmu::skills::SkillHandtoHand: + case EQ::skills::SkillHandtoHand: offense = GetBestMeleeSkill(); break; } @@ -933,7 +934,7 @@ double Mob::RollD20(int offense, int mitigation) int avg = (offense + mitigation + 10) / 2; int index = std::max(0, (atk_roll - def_roll) + (avg / 2)); - index = EQEmu::Clamp((index * 20) / avg, 0, 19); + index = EQ::Clamp((index * 20) / avg, 0, 19); return mods[index]; } @@ -943,7 +944,7 @@ void Mob::MeleeMitigation(Mob *attacker, DamageHitInfo &hit, ExtraAttackOptions #ifdef LUA_EQEMU bool ignoreDefault = false; LuaParser::Instance()->MeleeMitigation(this, attacker, hit, opts, ignoreDefault); - + if (ignoreDefault) { return; } @@ -973,9 +974,9 @@ void Mob::MeleeMitigation(Mob *attacker, DamageHitInfo &hit, ExtraAttackOptions //Returns the weapon damage against the input mob //if we cannot hit the mob with the current weapon we will get a value less than or equal to zero //Else we know we can hit. -//GetWeaponDamage(mob*, const EQEmu::ItemData*) is intended to be used for mobs or any other situation where we do not have a client inventory item -//GetWeaponDamage(mob*, const EQEmu::ItemInstance*) is intended to be used for situations where we have a client inventory item -int Mob::GetWeaponDamage(Mob *against, const EQEmu::ItemData *weapon_item) { +//GetWeaponDamage(mob*, const EQ::ItemData*) is intended to be used for mobs or any other situation where we do not have a client inventory item +//GetWeaponDamage(mob*, const EQ::ItemInstance*) is intended to be used for situations where we have a client inventory item +int Mob::GetWeaponDamage(Mob *against, const EQ::ItemData *weapon_item) { int dmg = 0; int banedmg = 0; @@ -1075,7 +1076,7 @@ int Mob::GetWeaponDamage(Mob *against, const EQEmu::ItemData *weapon_item) { return dmg; } -int Mob::GetWeaponDamage(Mob *against, const EQEmu::ItemInstance *weapon_item, uint32 *hate) +int Mob::GetWeaponDamage(Mob *against, const EQ::ItemInstance *weapon_item, uint32 *hate) { int dmg = 0; int banedmg = 0; @@ -1116,7 +1117,7 @@ int Mob::GetWeaponDamage(Mob *against, const EQEmu::ItemInstance *weapon_item, u else { bool MagicGloves = false; if (IsClient()) { - const EQEmu::ItemInstance *gloves = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotHands); + const EQ::ItemInstance *gloves = CastToClient()->GetInv().GetItem(EQ::invslot::slotHands); if (gloves) MagicGloves = gloves->GetItemMagical(true); } @@ -1401,13 +1402,13 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b if (GetFeigned()) return false; // Rogean: How can you attack while feigned? Moved up from Aggro Code. - EQEmu::ItemInstance* weapon = nullptr; - if (Hand == EQEmu::invslot::slotSecondary) { // Kaiyodo - Pick weapon from the attacking hand - weapon = GetInv().GetItem(EQEmu::invslot::slotSecondary); + EQ::ItemInstance* weapon = nullptr; + if (Hand == EQ::invslot::slotSecondary) { // Kaiyodo - Pick weapon from the attacking hand + weapon = GetInv().GetItem(EQ::invslot::slotSecondary); OffHandAtk(true); } else { - weapon = GetInv().GetItem(EQEmu::invslot::slotPrimary); + weapon = GetInv().GetItem(EQ::invslot::slotPrimary); OffHandAtk(false); } @@ -1445,16 +1446,16 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b if (my_hit.base_damage > 0) { // if we revamp this function be more general, we will have to make sure this isn't // executed for anything BUT normal melee damage weapons from auto attack - if (Hand == EQEmu::invslot::slotPrimary || Hand == EQEmu::invslot::slotSecondary) + if (Hand == EQ::invslot::slotPrimary || Hand == EQ::invslot::slotSecondary) my_hit.base_damage = DoDamageCaps(my_hit.base_damage); auto shield_inc = spellbonuses.ShieldEquipDmgMod + itembonuses.ShieldEquipDmgMod + aabonuses.ShieldEquipDmgMod; - if (shield_inc > 0 && HasShieldEquiped() && Hand == EQEmu::invslot::slotPrimary) { + if (shield_inc > 0 && HasShieldEquiped() && Hand == EQ::invslot::slotPrimary) { my_hit.base_damage = my_hit.base_damage * (100 + shield_inc) / 100; hate = hate * (100 + shield_inc) / 100; } CheckIncreaseSkill(my_hit.skill, other, -15); - CheckIncreaseSkill(EQEmu::skills::SkillOffense, other, -15); + CheckIncreaseSkill(EQ::skills::SkillOffense, other, -15); // *************************************************************** // *** Calculate the damage bonus, if applicable, for this hit *** @@ -1470,22 +1471,22 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b int ucDamageBonus = 0; - if (Hand == EQEmu::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass()) + if (Hand == EQ::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass()) { // Damage bonuses apply only to hits from the main hand (Hand == MainPrimary) by characters level 28 and above // who belong to a melee class. If we're here, then all of these conditions apply. - ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr); + ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQ::ItemData*) nullptr); my_hit.min_damage = ucDamageBonus; hate += ucDamageBonus; } #endif //Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon. - if (Hand == EQEmu::invslot::slotSecondary) { + if (Hand == EQ::invslot::slotSecondary) { if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc) { - ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr, true); + ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQ::ItemData*) nullptr, true); my_hit.min_damage = ucDamageBonus; hate += ucDamageBonus; @@ -1528,7 +1529,7 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b IsValidSpell(aabonuses.SkillAttackProc[2])) { float chance = aabonuses.SkillAttackProc[0] / 1000.0f; if (zone->random.Roll(chance)) - SpellFinished(aabonuses.SkillAttackProc[2], other, EQEmu::spells::CastingSlot::Item, 0, -1, + SpellFinished(aabonuses.SkillAttackProc[2], other, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SkillAttackProc[2]].ResistDiff); } other->Damage(this, my_hit.damage_done, SPELL_UNKNOWN, my_hit.skill, true, -1, false, m_specialattacks); @@ -1559,7 +1560,7 @@ void Mob::Heal() SendHPUpdate(); } -void Client::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) +void Client::Damage(Mob* other, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) { if (dead || IsCorpse()) return; @@ -1574,7 +1575,7 @@ void Client::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::Sk //patch notes on PVP reductions only mention archery/throwing ... not normal dmg if (other && other->IsClient() && (other != this) && damage > 0) { int PvPMitigation = 100; - if (attack_skill == EQEmu::skills::SkillArchery || attack_skill == EQEmu::skills::SkillThrowing) + if (attack_skill == EQ::skills::SkillArchery || attack_skill == EQ::skills::SkillThrowing) PvPMitigation = 80; else PvPMitigation = 67; @@ -1590,11 +1591,11 @@ void Client::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::Sk if (damage > 0) { if (spell_id == SPELL_UNKNOWN) - CheckIncreaseSkill(EQEmu::skills::SkillDefense, other, -15); + CheckIncreaseSkill(EQ::skills::SkillDefense, other, -15); } } -bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::SkillType attack_skill) +bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQ::skills::SkillType attack_skill) { if (!ClientFinishedLoading()) return false; @@ -1654,7 +1655,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk d->spawn_id = GetID(); d->killer_id = killerMob ? killerMob->GetID() : 0; d->corpseid = GetID(); - d->bindzoneid = m_pp.binds[0].zoneId; + d->bindzoneid = m_pp.binds[0].zone_id; d->spell_id = spell == SPELL_UNKNOWN ? 0xffffffff : spell; d->attack_skill = spell != SPELL_UNKNOWN ? 0xe7 : attack_skill; d->damage = damage; @@ -1735,7 +1736,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk if (!RuleB(Character, UseDeathExpLossMult)) { exploss = (int)(GetLevel() * (GetLevel() / 18.0) * 12000); } - + if (RuleB(Zone, LevelBasedEXPMods)) { // Death in levels with xp_mod (such as hell levels) was resulting // in losing more that appropriate since the loss was the same but @@ -1796,7 +1797,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk //this generates a lot of 'updates' to the client that the client does not need BuffFadeNonPersistDeath(); if (RuleB(Character, UnmemSpellsOnDeath)) { - if ((ClientVersionBit() & EQEmu::versions::maskSoFAndLater) && RuleB(Character, RespawnFromHover)) + if ((ClientVersionBit() & EQ::versions::maskSoFAndLater) && RuleB(Character, RespawnFromHover)) UnmemSpellAll(true); else UnmemSpellAll(false); @@ -1870,7 +1871,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk from these and overwrite what we set in pp anyway */ - if (LeftCorpse && (ClientVersionBit() & EQEmu::versions::maskSoFAndLater) && RuleB(Character, RespawnFromHover)) + if (LeftCorpse && (ClientVersionBit() & EQ::versions::maskSoFAndLater) && RuleB(Character, RespawnFromHover)) { ClearDraggedCorpses(); RespawnFromHoverTimer.Start(RuleI(Character, RespawnFromHoverTimer) * 1000); @@ -1891,9 +1892,9 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk r->MemberZoned(this); dead_timer.Start(5000, true); - m_pp.zone_id = m_pp.binds[0].zoneId; + m_pp.zone_id = m_pp.binds[0].zone_id; m_pp.zoneInstance = m_pp.binds[0].instance_id; - database.MoveCharacterToZone(this->CharacterID(), content_db.GetZoneName(m_pp.zone_id)); + database.MoveCharacterToZone(this->CharacterID(), m_pp.zone_id); Save(); GoToDeath(); } @@ -1940,63 +1941,63 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool FaceTarget(GetTarget()); DamageHitInfo my_hit; - my_hit.skill = EQEmu::skills::SkillHandtoHand; + my_hit.skill = EQ::skills::SkillHandtoHand; my_hit.hand = Hand; my_hit.damage_done = 1; - if (Hand == EQEmu::invslot::slotPrimary) { - my_hit.skill = static_cast(GetPrimSkill()); + if (Hand == EQ::invslot::slotPrimary) { + my_hit.skill = static_cast(GetPrimSkill()); OffHandAtk(false); } - if (Hand == EQEmu::invslot::slotSecondary) { - my_hit.skill = static_cast(GetSecSkill()); + if (Hand == EQ::invslot::slotSecondary) { + my_hit.skill = static_cast(GetSecSkill()); OffHandAtk(true); } //figure out what weapon they are using, if any - const EQEmu::ItemData* weapon = nullptr; - if (Hand == EQEmu::invslot::slotPrimary && equipment[EQEmu::invslot::slotPrimary] > 0) - weapon = database.GetItem(equipment[EQEmu::invslot::slotPrimary]); - else if (equipment[EQEmu::invslot::slotSecondary]) - weapon = database.GetItem(equipment[EQEmu::invslot::slotSecondary]); + const EQ::ItemData* weapon = nullptr; + if (Hand == EQ::invslot::slotPrimary && equipment[EQ::invslot::slotPrimary] > 0) + weapon = database.GetItem(equipment[EQ::invslot::slotPrimary]); + else if (equipment[EQ::invslot::slotSecondary]) + weapon = database.GetItem(equipment[EQ::invslot::slotSecondary]); //We dont factor much from the weapon into the attack. //Just the skill type so it doesn't look silly using punching animations and stuff while wielding weapons if (weapon) { LogCombat("Attacking with weapon: [{}] ([{}]) (too bad im not using it for much)", weapon->Name, weapon->ID); - if (Hand == EQEmu::invslot::slotSecondary && !weapon->IsType1HWeapon()) { + if (Hand == EQ::invslot::slotSecondary && !weapon->IsType1HWeapon()) { LogCombat("Attack with non-weapon cancelled"); return false; } switch (weapon->ItemType) { - case EQEmu::item::ItemType1HSlash: - my_hit.skill = EQEmu::skills::Skill1HSlashing; + case EQ::item::ItemType1HSlash: + my_hit.skill = EQ::skills::Skill1HSlashing; break; - case EQEmu::item::ItemType2HSlash: - my_hit.skill = EQEmu::skills::Skill2HSlashing; + case EQ::item::ItemType2HSlash: + my_hit.skill = EQ::skills::Skill2HSlashing; break; - case EQEmu::item::ItemType1HPiercing: - my_hit.skill = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType1HPiercing: + my_hit.skill = EQ::skills::Skill1HPiercing; break; - case EQEmu::item::ItemType2HPiercing: - my_hit.skill = EQEmu::skills::Skill2HPiercing; + case EQ::item::ItemType2HPiercing: + my_hit.skill = EQ::skills::Skill2HPiercing; break; - case EQEmu::item::ItemType1HBlunt: - my_hit.skill = EQEmu::skills::Skill1HBlunt; + case EQ::item::ItemType1HBlunt: + my_hit.skill = EQ::skills::Skill1HBlunt; break; - case EQEmu::item::ItemType2HBlunt: - my_hit.skill = EQEmu::skills::Skill2HBlunt; + case EQ::item::ItemType2HBlunt: + my_hit.skill = EQ::skills::Skill2HBlunt; break; - case EQEmu::item::ItemTypeBow: - my_hit.skill = EQEmu::skills::SkillArchery; + case EQ::item::ItemTypeBow: + my_hit.skill = EQ::skills::SkillArchery; break; - case EQEmu::item::ItemTypeLargeThrowing: - case EQEmu::item::ItemTypeSmallThrowing: - my_hit.skill = EQEmu::skills::SkillThrowing; + case EQ::item::ItemTypeLargeThrowing: + case EQ::item::ItemTypeSmallThrowing: + my_hit.skill = EQ::skills::SkillThrowing; break; default: - my_hit.skill = EQEmu::skills::SkillHandtoHand; + my_hit.skill = EQ::skills::SkillHandtoHand; break; } } @@ -2005,7 +2006,7 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool //do attack animation regardless of whether or not we can hit below int16 charges = 0; - EQEmu::ItemInstance weapon_inst(weapon, charges); + EQ::ItemInstance weapon_inst(weapon, charges); my_hit.skill = AttackAnimation(Hand, &weapon_inst, my_hit.skill); //basically "if not immune" then do the attack @@ -2117,7 +2118,7 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool return false; } -void NPC::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) { +void NPC::Damage(Mob* other, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) { if (spell_id == 0) spell_id = SPELL_UNKNOWN; @@ -2143,7 +2144,7 @@ void NPC::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::Skill if (IsLDoNTrapped()) { MessageString(Chat::Red, LDON_ACCIDENT_SETOFF2); - SpellFinished(GetLDoNTrapSpellID(), other, EQEmu::spells::CastingSlot::Item, 0, -1, spells[GetLDoNTrapSpellID()].ResistDiff, false); + SpellFinished(GetLDoNTrapSpellID(), other, EQ::spells::CastingSlot::Item, 0, -1, spells[GetLDoNTrapSpellID()].ResistDiff, false); SetLDoNTrapSpellID(0); SetLDoNTrapped(false); SetLDoNTrapDetected(false); @@ -2160,7 +2161,7 @@ void NPC::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::Skill } } -bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQEmu::skills::SkillType attack_skill) +bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQ::skills::SkillType attack_skill) { LogCombat("Fatal blow dealt by [{}] with [{}] damage, spell [{}], skill [{}]", ((killer_mob) ? (killer_mob->GetName()) : ("[nullptr]")), damage, spell, attack_skill); @@ -2246,7 +2247,7 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQEmu::skills::Skil d->spawn_id = GetID(); d->killer_id = killer_mob ? killer_mob->GetID() : 0; d->bindzoneid = 0; - d->spell_id = spell == SPELL_UNKNOWN ? 0xffffffff : spell; + d->spell_id = 0xffffffff; // Sending spell was causing extra DoT land msg d->attack_skill = SkillDamageTypes[attack_skill]; d->damage = damage; app->priority = 6; @@ -2452,7 +2453,7 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQEmu::skills::Skil bool allow_merchant_corpse = RuleB(Merchant, AllowCorpse); bool is_merchant = (class_ == MERCHANT || class_ == ADVENTUREMERCHANT || MerchantType != 0); - + if (!HasOwner() && !IsMerc() && !GetSwarmInfo() && (!is_merchant || allow_merchant_corpse) && ((killer && (killer->IsClient() || (killer->HasOwner() && killer->GetUltimateOwner()->IsClient()) || (killer->IsNPC() && killer->CastToNPC()->GetSwarmInfo() && killer->CastToNPC()->GetSwarmInfo()->GetOwner() && killer->CastToNPC()->GetSwarmInfo()->GetOwner()->IsClient()))) @@ -2463,7 +2464,7 @@ bool NPC::Death(Mob* killer_mob, int32 damage, uint16 spell, EQEmu::skills::Skil killer = killer->GetOwner(); if (killer->IsClient() && !killer->CastToClient()->GetGM()) - this->CheckMinMaxLevel(killer); + this->CheckTrivialMinMaxLevelDrop(killer); } entity_list.RemoveFromAutoXTargets(this); @@ -2666,6 +2667,12 @@ void Mob::AddToHateList(Mob* other, uint32 hate /*= 0*/, int32 damage /*= 0*/, b if (IsFamiliar() || GetSpecialAbility(IMMUNE_AGGRO)) return; + if (GetSpecialAbility(IMMUNE_AGGRO_NPC) && other->IsNPC()) + return; + + if (GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && other->IsClient()) + return; + if (spell_id != SPELL_UNKNOWN && NoDetrimentalSpellAggro(spell_id)) return; @@ -2757,8 +2764,11 @@ void Mob::AddToHateList(Mob* other, uint32 hate /*= 0*/, int32 damage /*= 0*/, b else { // cb:2007-08-17 // owner must get on list, but he's not actually gained any hate yet - if (!owner->GetSpecialAbility(IMMUNE_AGGRO)) - { + if ( + !owner->GetSpecialAbility(IMMUNE_AGGRO) && + !(this->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && owner->IsClient()) && + !(this->GetSpecialAbility(IMMUNE_AGGRO_NPC) && owner->IsNPC()) + ) { if (owner->IsClient() && !CheckAggro(owner)) owner->CastToClient()->AddAutoXTarget(this); hate_list.AddEntToHateList(owner, 0, 0, false, !iBuffTic); @@ -2767,12 +2777,24 @@ void Mob::AddToHateList(Mob* other, uint32 hate /*= 0*/, int32 damage /*= 0*/, b } if (mypet && !mypet->IsHeld() && !mypet->IsPetStop()) { // I have a pet, add other to it - if (!mypet->IsFamiliar() && !mypet->GetSpecialAbility(IMMUNE_AGGRO)) + if ( + !mypet->IsFamiliar() && + !mypet->GetSpecialAbility(IMMUNE_AGGRO) && + !(mypet->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && this->IsClient()) && + !(mypet->GetSpecialAbility(IMMUNE_AGGRO_NPC) && this->IsNPC()) + ) { mypet->hate_list.AddEntToHateList(other, 0, 0, bFrenzy); + } } else if (myowner) { // I am a pet, add other to owner if it's NPC/LD - if (myowner->IsAIControlled() && !myowner->GetSpecialAbility(IMMUNE_AGGRO)) + if ( + myowner->IsAIControlled() && + !myowner->GetSpecialAbility(IMMUNE_AGGRO) && + !(this->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && myowner->IsClient()) && + !(this->GetSpecialAbility(IMMUNE_AGGRO_NPC) && myowner->IsNPC()) + ) { myowner->hate_list.AddEntToHateList(other, 0, 0, bFrenzy); + } } if (other->GetTempPetCount()) @@ -2839,7 +2861,7 @@ void Mob::DamageShield(Mob* attacker, bool spell_ds) { } DS -= DS * attacker->itembonuses.DSMitigation / 100; } - attacker->Damage(this, -DS, spellid, EQEmu::skills::SkillAbjuration/*hackish*/, false); + attacker->Damage(this, -DS, spellid, EQ::skills::SkillAbjuration/*hackish*/, false); //we can assume there is a spell now auto outapp = new EQApplicationPacket(OP_Damage, sizeof(CombatDamage_Struct)); CombatDamage_Struct* cds = (CombatDamage_Struct*)outapp->pBuffer; @@ -2867,12 +2889,12 @@ void Mob::DamageShield(Mob* attacker, bool spell_ds) { if (rev_ds < 0) { LogCombat("Applying Reverse Damage Shield of value [{}] to [{}]", rev_ds, attacker->GetName()); - attacker->Damage(this, -rev_ds, rev_ds_spell_id, EQEmu::skills::SkillAbjuration/*hackish*/, false); //"this" (us) will get the hate, etc. not sure how this works on Live, but it'll works for now, and tanks will love us for this + attacker->Damage(this, -rev_ds, rev_ds_spell_id, EQ::skills::SkillAbjuration/*hackish*/, false); //"this" (us) will get the hate, etc. not sure how this works on Live, but it'll works for now, and tanks will love us for this //do we need to send a damage packet here also? } } -uint8 Mob::GetWeaponDamageBonus(const EQEmu::ItemData *weapon, bool offhand) +uint8 Mob::GetWeaponDamageBonus(const EQ::ItemData *weapon, bool offhand) { // dev quote with old and new formulas // https://forums.daybreakgames.com/eq/index.php?threads/test-update-09-17-15.226618/page-5#post-3326194 @@ -2884,7 +2906,7 @@ uint8 Mob::GetWeaponDamageBonus(const EQEmu::ItemData *weapon, bool offhand) return 1 + ((level - 28) / 3); // how does weaponless scale? auto delay = weapon->Delay; - if (weapon->IsType1HWeapon() || weapon->ItemType == EQEmu::item::ItemTypeMartial) { + if (weapon->IsType1HWeapon() || weapon->ItemType == EQ::item::ItemTypeMartial) { // we assume sinister strikes is checked before calling here if (!offhand) { if (delay <= 39) @@ -2943,7 +2965,7 @@ int Mob::GetHandToHandDamage(void) { if (RuleB(Combat, UseRevampHandToHand)) { // everyone uses this in the revamp! - int skill = GetSkill(EQEmu::skills::SkillHandtoHand); + int skill = GetSkill(EQ::skills::SkillHandtoHand); int epic = 0; if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 46) epic = 280; @@ -2985,7 +3007,7 @@ int Mob::GetHandToHandDelay(void) { if (RuleB(Combat, UseRevampHandToHand)) { // everyone uses this in the revamp! - int skill = GetSkill(EQEmu::skills::SkillHandtoHand); + int skill = GetSkill(EQ::skills::SkillHandtoHand); int epic = 0; int iksar = 0; if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 46) @@ -3323,7 +3345,7 @@ bool Mob::HasRangedProcs() const bool Client::CheckDoubleAttack() { int chance = 0; - int skill = GetSkill(EQEmu::skills::SkillDoubleAttack); + int skill = GetSkill(EQ::skills::SkillDoubleAttack); //Check for bonuses that give you a double attack chance regardless of skill (ie Bestial Frenzy/Harmonious Attack AA) int bonusGiveDA = aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack; if (skill > 0) @@ -3344,7 +3366,7 @@ bool Client::CheckDoubleAttack() // with varying triple attack skill (1-3% error at least) bool Client::CheckTripleAttack() { - int chance = GetSkill(EQEmu::skills::SkillTripleAttack); + int chance = GetSkill(EQ::skills::SkillTripleAttack); if (chance < 1) return false; @@ -3368,7 +3390,7 @@ bool Mob::CheckDoubleAttack() { // Not 100% certain pets follow this or if it's just from pets not always // having the same skills as most mobs - int chance = GetSkill(EQEmu::skills::SkillDoubleAttack); + int chance = GetSkill(EQ::skills::SkillDoubleAttack); if (GetLevel() > 35) chance += GetLevel(); @@ -3379,9 +3401,9 @@ bool Mob::CheckDoubleAttack() return zone->random.Int(1, 500) <= chance; } -void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const EQEmu::skills::SkillType skill_used, bool &avoidable, const int8 buffslot, const bool iBuffTic, eSpecialAttacks special) { +void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const EQ::skills::SkillType skill_used, bool &avoidable, const int8 buffslot, const bool iBuffTic, eSpecialAttacks special) { // This method is called with skill_used=ABJURE for Damage Shield damage. - bool FromDamageShield = (skill_used == EQEmu::skills::SkillAbjuration); + bool FromDamageShield = (skill_used == EQ::skills::SkillAbjuration); bool ignore_invul = false; if (IsValidSpell(spell_id)) ignore_invul = spell_id == 982 || spells[spell_id].cast_not_standing; // cazic touch @@ -3392,7 +3414,7 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const } // this should actually happen MUCH sooner, need to investigate though -- good enough for now - if ((skill_used == EQEmu::skills::SkillArchery || skill_used == EQEmu::skills::SkillThrowing) && GetSpecialAbility(IMMUNE_RANGED_ATTACKS)) { + if ((skill_used == EQ::skills::SkillArchery || skill_used == EQ::skills::SkillThrowing) && GetSpecialAbility(IMMUNE_RANGED_ATTACKS)) { LogCombat("Avoiding [{}] damage due to IMMUNE_RANGED_ATTACKS", damage); damage = DMG_INVULNERABLE; } @@ -3402,7 +3424,7 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const // only apply DS if physical damage (no spell damage) // damage shield calls this function with spell_id set, so its unavoidable - if (attacker && damage > 0 && spell_id == SPELL_UNKNOWN && skill_used != EQEmu::skills::SkillArchery && skill_used != EQEmu::skills::SkillThrowing) { + if (attacker && damage > 0 && spell_id == SPELL_UNKNOWN && skill_used != EQ::skills::SkillArchery && skill_used != EQ::skills::SkillThrowing) { DamageShield(attacker); } @@ -3444,16 +3466,55 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const // emote goes with every one ... even npcs entity_list.MessageClose(this, true, RuleI(Range, SpellMessages), Chat::Emote, "%s beams a smile at %s", attacker->GetCleanName(), this->GetCleanName()); } + + // If a client pet is damaged while sitting, stand, fix sit button, + // and remove sitting regen. Removes bug where client clicks sit + // during battle and gains pet hp-regen and bugs the sit button. + if (IsPet()) { + Mob *owner = this->GetOwner(); + if (owner && owner->IsClient()) { + if (GetPetOrder() == SPO_Sit) { + SetPetOrder(SPO_Follow); + } + // fix GUI sit button to be unpressed and stop sitting regen + owner->CastToClient()->SetPetCommandState(PET_BUTTON_SIT, 0); + SetAppearance(eaStanding); + } + } + } //end `if there is some damage being done and theres anattacker person involved` Mob *pet = GetPet(); // pets that have GHold will never automatically add NPCs // pets that have Hold and no Focus will add NPCs if they're engaged // pets that have Hold and Focus will not add NPCs - if (pet && !pet->IsFamiliar() && !pet->GetSpecialAbility(IMMUNE_AGGRO) && !pet->IsEngaged() && attacker && attacker != this && !attacker->IsCorpse() && !pet->IsGHeld() && !attacker->IsTrap()) - { + if ( + pet && + !pet->IsFamiliar() && + !pet->GetSpecialAbility(IMMUNE_AGGRO) && + !pet->IsEngaged() && + attacker && + !(pet->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && attacker->IsClient()) && + !(pet->GetSpecialAbility(IMMUNE_AGGRO_NPC) && attacker->IsNPC()) && + attacker != this && + !attacker->IsCorpse() && + !pet->IsGHeld() && + !attacker->IsTrap() + ) { if (!pet->IsHeld()) { LogAggro("Sending pet [{}] into battle due to attack", pet->GetName()); + if (IsClient()) { + // if pet was sitting his new mode is follow + // following after the battle (live verified) + if (pet->GetPetOrder() == SPO_Sit) { + pet->SetPetOrder(SPO_Follow); + } + + // fix GUI sit button to be unpressed and stop sitting regen + this->CastToClient()->SetPetCommandState(PET_BUTTON_SIT, 0); + pet->SetAppearance(eaStanding); + } + pet->AddToHateList(attacker, 1, 0, true, false, false, spell_id); pet->SetTarget(attacker); MessageString(Chat::NPCQuestSay, PET_ATTACKING, pet->GetCleanName(), attacker->GetCleanName()); @@ -3543,14 +3604,14 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const bool can_stun = false; int stunbash_chance = 0; // bonus if (attacker) { - if (skill_used == EQEmu::skills::SkillBash) { + if (skill_used == EQ::skills::SkillBash) { can_stun = true; if (attacker->IsClient()) stunbash_chance = attacker->spellbonuses.StunBashChance + attacker->itembonuses.StunBashChance + attacker->aabonuses.StunBashChance; } - else if (skill_used == EQEmu::skills::SkillKick && + else if (skill_used == EQ::skills::SkillKick && (attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == WARRIOR) { can_stun = true; } @@ -3593,7 +3654,7 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const else { // main stun failed -- extra interrupt roll if (IsCasting() && - !EQEmu::ValueWithin(casting_spell_id, 859, 1023)) // these spells are excluded + !EQ::ValueWithin(casting_spell_id, 859, 1023)) // these spells are excluded // 90% chance >< -- stun immune won't reach this branch though :( if (zone->random.Int(0, 9) > 1) InterruptSpell(); @@ -3642,7 +3703,7 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const a->hit_heading = attacker ? attacker->GetHeading() : 0.0f; if (RuleB(Combat, MeleePush) && damage > 0 && !IsRooted() && (IsClient() || zone->random.Roll(RuleI(Combat, MeleePushChance)))) { - a->force = EQEmu::skills::GetSkillMeleePushForce(skill_used); + a->force = EQ::skills::GetSkillMeleePushForce(skill_used); if (IsNPC()) { if (attacker->IsNPC()) a->force = 0.0f; // 2013 change that disabled NPC vs NPC push @@ -3808,7 +3869,7 @@ void Mob::HealDamage(uint32 amount, Mob *caster, uint16 spell_id) if (IsBuffSpell(spell_id)) { // hots // message to caster if (caster->IsClient() && caster == this) { - if (caster->CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoFAndLater) + if (caster->CastToClient()->ClientVersionBit() & EQ::versions::maskSoFAndLater) FilteredMessageString(caster, Chat::NonMelee, FilterHealOverTime, HOT_HEAL_SELF, itoa(acthealed), spells[spell_id].name); else @@ -3816,7 +3877,7 @@ void Mob::HealDamage(uint32 amount, Mob *caster, uint16 spell_id) YOU_HEALED, GetCleanName(), itoa(acthealed)); } else if (caster->IsClient() && caster != this) { - if (caster->CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoFAndLater) + if (caster->CastToClient()->ClientVersionBit() & EQ::versions::maskSoFAndLater) caster->FilteredMessageString(caster, Chat::NonMelee, FilterHealOverTime, HOT_HEAL_OTHER, GetCleanName(), itoa(acthealed), spells[spell_id].name); @@ -3826,7 +3887,7 @@ void Mob::HealDamage(uint32 amount, Mob *caster, uint16 spell_id) } // message to target if (IsClient() && caster != this) { - if (CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoFAndLater) + if (CastToClient()->ClientVersionBit() & EQ::versions::maskSoFAndLater) FilteredMessageString(this, Chat::NonMelee, FilterHealOverTime, HOT_HEALED_OTHER, caster->GetCleanName(), itoa(acthealed), spells[spell_id].name); @@ -3919,7 +3980,7 @@ void Mob::TryDefensiveProc(Mob *on, uint16 hand) { float ProcChance, ProcBonus; on->GetDefensiveProcChances(ProcBonus, ProcChance, hand, this); - if (hand != EQEmu::invslot::slotPrimary) + if (hand != EQ::invslot::slotPrimary) ProcChance /= 2; int level_penalty = 0; @@ -3944,7 +4005,7 @@ void Mob::TryDefensiveProc(Mob *on, uint16 hand) { } } -void Mob::TryWeaponProc(const EQEmu::ItemInstance* weapon_g, Mob *on, uint16 hand) { +void Mob::TryWeaponProc(const EQ::ItemInstance* weapon_g, Mob *on, uint16 hand) { if (!on) { SetTarget(nullptr); LogError("A null Mob object was passed to Mob::TryWeaponProc for evaluation!"); @@ -3962,12 +4023,12 @@ void Mob::TryWeaponProc(const EQEmu::ItemInstance* weapon_g, Mob *on, uint16 han } if (!weapon_g) { - TrySpellProc(nullptr, (const EQEmu::ItemData*)nullptr, on); + TrySpellProc(nullptr, (const EQ::ItemData*)nullptr, on); return; } if (!weapon_g->IsClassCommon()) { - TrySpellProc(nullptr, (const EQEmu::ItemData*)nullptr, on); + TrySpellProc(nullptr, (const EQ::ItemData*)nullptr, on); return; } @@ -3980,7 +4041,7 @@ void Mob::TryWeaponProc(const EQEmu::ItemInstance* weapon_g, Mob *on, uint16 han return; } -void Mob::TryWeaponProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *weapon, Mob *on, uint16 hand) +void Mob::TryWeaponProc(const EQ::ItemInstance *inst, const EQ::ItemData *weapon, Mob *on, uint16 hand) { if (!weapon) @@ -3992,14 +4053,14 @@ void Mob::TryWeaponProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData * ProcBonus += static_cast(itembonuses.ProcChance) / 10.0f; // Combat Effects float ProcChance = GetProcChances(ProcBonus, hand); - if (hand != EQEmu::invslot::slotPrimary) //Is Archery intened to proc at 50% rate? + if (hand != EQ::invslot::slotPrimary) //Is Archery intened to proc at 50% rate? ProcChance /= 2; // Try innate proc on weapon // We can proc once here, either weapon or one aug bool proced = false; // silly bool to prevent augs from going if weapon does skillinuse = GetSkillByItemType(weapon->ItemType); - if (weapon->Proc.Type == EQEmu::item::ItemEffectCombatProc && IsValidSpell(weapon->Proc.Effect)) { + if (weapon->Proc.Type == EQ::item::ItemEffectCombatProc && IsValidSpell(weapon->Proc.Effect)) { float WPC = ProcChance * (100.0f + // Proc chance for this weapon static_cast(weapon->ProcRate)) / 100.0f; if (zone->random.Roll(WPC)) { // 255 dex = 0.084 chance of proc. No idea what this number should be really. @@ -4028,15 +4089,15 @@ void Mob::TryWeaponProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData * proced = false; if (!proced && inst) { - for (int r = EQEmu::invaug::SOCKET_BEGIN; r <= EQEmu::invaug::SOCKET_END; r++) { - const EQEmu::ItemInstance *aug_i = inst->GetAugment(r); + for (int r = EQ::invaug::SOCKET_BEGIN; r <= EQ::invaug::SOCKET_END; r++) { + const EQ::ItemInstance *aug_i = inst->GetAugment(r); if (!aug_i) // no aug, try next slot! continue; - const EQEmu::ItemData *aug = aug_i->GetItem(); + const EQ::ItemData *aug = aug_i->GetItem(); if (!aug) continue; - if (aug->Proc.Type == EQEmu::item::ItemEffectCombatProc && IsValidSpell(aug->Proc.Effect)) { + if (aug->Proc.Type == EQ::item::ItemEffectCombatProc && IsValidSpell(aug->Proc.Effect)) { float APC = ProcChance * (100.0f + // Proc chance for this aug static_cast(aug->ProcRate)) / 100.0f; if (zone->random.Roll(APC)) { @@ -4064,37 +4125,37 @@ void Mob::TryWeaponProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData * return; } -void Mob::TrySpellProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *weapon, Mob *on, uint16 hand) +void Mob::TrySpellProc(const EQ::ItemInstance *inst, const EQ::ItemData *weapon, Mob *on, uint16 hand) { float ProcBonus = static_cast(spellbonuses.SpellProcChance + itembonuses.SpellProcChance + aabonuses.SpellProcChance); float ProcChance = 0.0f; ProcChance = GetProcChances(ProcBonus, hand); - if (hand != EQEmu::invslot::slotPrimary) //Is Archery intened to proc at 50% rate? + if (hand != EQ::invslot::slotPrimary) //Is Archery intened to proc at 50% rate? ProcChance /= 2; bool rangedattk = false; - if (weapon && hand == EQEmu::invslot::slotRange) { - if (weapon->ItemType == EQEmu::item::ItemTypeArrow || - weapon->ItemType == EQEmu::item::ItemTypeLargeThrowing || - weapon->ItemType == EQEmu::item::ItemTypeSmallThrowing || - weapon->ItemType == EQEmu::item::ItemTypeBow) { + if (weapon && hand == EQ::invslot::slotRange) { + if (weapon->ItemType == EQ::item::ItemTypeArrow || + weapon->ItemType == EQ::item::ItemTypeLargeThrowing || + weapon->ItemType == EQ::item::ItemTypeSmallThrowing || + weapon->ItemType == EQ::item::ItemTypeBow) { rangedattk = true; } } - if (!weapon && hand == EQEmu::invslot::slotRange && GetSpecialAbility(SPECATK_RANGED_ATK)) + if (!weapon && hand == EQ::invslot::slotRange && GetSpecialAbility(SPECATK_RANGED_ATK)) rangedattk = true; int16 poison_slot=-1; for (uint32 i = 0; i < MAX_PROCS; i++) { - if (IsPet() && hand != EQEmu::invslot::slotPrimary) //Pets can only proc spell procs from their primay hand (ie; beastlord pets) + if (IsPet() && hand != EQ::invslot::slotPrimary) //Pets can only proc spell procs from their primay hand (ie; beastlord pets) continue; // If pets ever can proc from off hand, this will need to change - if (SpellProcs[i].base_spellID == POISON_PROC && - (!weapon || weapon->ItemType != EQEmu::item::ItemType1HPiercing)) + if (SpellProcs[i].base_spellID == POISON_PROC && + (!weapon || weapon->ItemType != EQ::item::ItemType1HPiercing)) continue; // Old school poison will only proc with 1HP equipped. // Not ranged @@ -4113,7 +4174,7 @@ void Mob::TrySpellProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *w // Spell procs (buffs) if (SpellProcs[i].spellID != SPELL_UNKNOWN) { if (SpellProcs[i].base_spellID == POISON_PROC) { - poison_slot=i; + poison_slot=i; continue; // Process the poison proc last per @mackal } @@ -4160,9 +4221,9 @@ void Mob::TrySpellProc(const EQEmu::ItemInstance *inst, const EQEmu::ItemData *w RemoveProcFromWeapon(spell_id); } } - } + } - if (HasSkillProcs() && hand != EQEmu::invslot::slotRange) { //We check ranged skill procs within the attack functions. + if (HasSkillProcs() && hand != EQ::invslot::slotRange) { //We check ranged skill procs within the attack functions. uint16 skillinuse = 28; if (weapon) skillinuse = GetSkillByItemType(weapon->ItemType); @@ -4308,17 +4369,17 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions * int crit_chance = GetCriticalChanceBonus(hit.skill); if ((GetClass() == WARRIOR || GetClass() == BERSERKER) && GetLevel() >= 12) innate_crit = true; - else if (GetClass() == RANGER && GetLevel() >= 12 && hit.skill == EQEmu::skills::SkillArchery) + else if (GetClass() == RANGER && GetLevel() >= 12 && hit.skill == EQ::skills::SkillArchery) innate_crit = true; - else if (GetClass() == ROGUE && GetLevel() >= 12 && hit.skill == EQEmu::skills::SkillThrowing) + else if (GetClass() == ROGUE && GetLevel() >= 12 && hit.skill == EQ::skills::SkillThrowing) innate_crit = true; // we have a chance to crit! if (innate_crit || crit_chance) { int difficulty = 0; - if (hit.skill == EQEmu::skills::SkillArchery) + if (hit.skill == EQ::skills::SkillArchery) difficulty = RuleI(Combat, ArcheryCritDifficulty); - else if (hit.skill == EQEmu::skills::SkillThrowing) + else if (hit.skill == EQ::skills::SkillThrowing) difficulty = RuleI(Combat, ThrowingCritDifficulty); else difficulty = RuleI(Combat, MeleeCritDifficulty); @@ -4330,7 +4391,7 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions * dex_bonus += 45; // chances did not match live without a small boost // so if we have an innate crit we have a better chance, except for ber throwing - if (!innate_crit || (GetClass() == BERSERKER && hit.skill == EQEmu::skills::SkillThrowing)) + if (!innate_crit || (GetClass() == BERSERKER && hit.skill == EQ::skills::SkillThrowing)) dex_bonus = dex_bonus * 3 / 5; if (crit_chance) @@ -4354,7 +4415,7 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions * LogCombat("Crit success roll [{}] dex chance [{}] og dmg [{}] crit_mod [{}] new dmg [{}]", roll, dex_bonus, og_damage, crit_mod, hit.damage_done); // step 3: check deadly strike - if (GetClass() == ROGUE && hit.skill == EQEmu::skills::SkillThrowing) { + if (GetClass() == ROGUE && hit.skill == EQ::skills::SkillThrowing) { if (BehindMob(defender, GetX(), GetY())) { int chance = GetLevel() * 12; if (zone->random.Int(1, 1000) < chance) { @@ -4483,7 +4544,7 @@ void Mob::DoRiposte(Mob *defender) return; } - defender->Attack(this, EQEmu::invslot::slotPrimary, true); + defender->Attack(this, EQ::invslot::slotPrimary, true); if (HasDied()) return; @@ -4493,7 +4554,7 @@ void Mob::DoRiposte(Mob *defender) if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) { LogCombat("Preforming a double riposted from SE_DoubleRiposte ([{}] percent chance)", DoubleRipChance); - defender->Attack(this, EQEmu::invslot::slotPrimary, true); + defender->Attack(this, EQ::invslot::slotPrimary, true); if (HasDied()) return; } @@ -4504,7 +4565,7 @@ void Mob::DoRiposte(Mob *defender) // Live AA - Double Riposte if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) { LogCombat("Preforming a double riposted from SE_GiveDoubleRiposte base1 == 0 ([{}] percent chance)", DoubleRipChance); - defender->Attack(this, EQEmu::invslot::slotPrimary, true); + defender->Attack(this, EQ::invslot::slotPrimary, true); if (HasDied()) return; } @@ -4696,7 +4757,7 @@ void Mob::ApplyDamageTable(DamageHitInfo &hit) #ifdef LUA_EQEMU bool ignoreDefault = false; LuaParser::Instance()->ApplyDamageTable(this, hit, ignoreDefault); - + if (ignoreDefault) { return; } @@ -4782,7 +4843,7 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui ProcMod = static_cast(spells[base_spell_id].base2[i]); } - else if (spells[base_spell_id].effectid[i] == SE_LimitToSkill && spells[base_spell_id].base[i] <= EQEmu::skills::HIGHEST_SKILL) { + else if (spells[base_spell_id].effectid[i] == SE_LimitToSkill && spells[base_spell_id].base[i] <= EQ::skills::HIGHEST_SKILL) { if (CanProc && spells[base_spell_id].base[i] == skill && IsValidSpell(proc_spell_id)) { float final_chance = chance * (ProcMod / 100.0f); @@ -4826,7 +4887,7 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui ProcMod = static_cast(spells[base_spell_id].base2[i]); } - else if (spells[base_spell_id].effectid[i] == SE_LimitToSkill && spells[base_spell_id].base[i] <= EQEmu::skills::HIGHEST_SKILL) { + else if (spells[base_spell_id].effectid[i] == SE_LimitToSkill && spells[base_spell_id].base[i] <= EQ::skills::HIGHEST_SKILL) { if (CanProc && spells[base_spell_id].base[i] == skill && IsValidSpell(proc_spell_id)) { float final_chance = chance * (ProcMod / 100.0f); @@ -4887,7 +4948,7 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui proc_spell_id = base1; ProcMod = static_cast(base2); } - else if (effect_id == SE_LimitToSkill && base1 <= EQEmu::skills::HIGHEST_SKILL) { + else if (effect_id == SE_LimitToSkill && base1 <= EQ::skills::HIGHEST_SKILL) { if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { float final_chance = chance * (ProcMod / 100.0f); @@ -4918,7 +4979,7 @@ float Mob::GetSkillProcChances(uint16 ReuseTime, uint16 hand) { if (!ReuseTime && hand) { weapon_speed = GetWeaponSpeedbyHand(hand); ProcChance = static_cast(weapon_speed) * (RuleR(Combat, AvgProcsPerMinute) / 60000.0f); - if (hand != EQEmu::invslot::slotPrimary) + if (hand != EQ::invslot::slotPrimary) ProcChance /= 2; } @@ -5047,14 +5108,14 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac #endif // BER weren't parsing the halving - if (hit.skill == EQEmu::skills::SkillArchery || - (hit.skill == EQEmu::skills::SkillThrowing && GetClass() != BERSERKER)) + if (hit.skill == EQ::skills::SkillArchery || + (hit.skill == EQ::skills::SkillThrowing && GetClass() != BERSERKER)) hit.damage_done /= 2; if (hit.damage_done < 1) hit.damage_done = 1; - if (hit.skill == EQEmu::skills::SkillArchery) { + if (hit.skill == EQ::skills::SkillArchery) { int bonus = aabonuses.ArcheryDamageModifier + itembonuses.ArcheryDamageModifier + spellbonuses.ArcheryDamageModifier; hit.damage_done += hit.damage_done * bonus / 100; int headshot = TryHeadShot(defender, hit.skill); @@ -5071,7 +5132,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac int extra_mincap = 0; int min_mod = hit.base_damage * GetMeleeMinDamageMod_SE(hit.skill) / 100; - if (hit.skill == EQEmu::skills::SkillBackstab) { + if (hit.skill == EQ::skills::SkillBackstab) { extra_mincap = GetLevel() < 7 ? 7 : GetLevel(); if (GetLevel() >= 60) extra_mincap = GetLevel() * 2; @@ -5086,7 +5147,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac hit.damage_done = ass; } } - else if (hit.skill == EQEmu::skills::SkillFrenzy && GetClass() == BERSERKER && GetLevel() > 50) { + else if (hit.skill == EQ::skills::SkillFrenzy && GetClass() == BERSERKER && GetLevel() > 50) { extra_mincap = 4 * GetLevel() / 5; } @@ -5111,8 +5172,8 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac if (IsClient()) { int extra = 0; switch (hit.skill) { - case EQEmu::skills::SkillThrowing: - case EQEmu::skills::SkillArchery: + case EQ::skills::SkillThrowing: + case EQ::skills::SkillArchery: extra = CastToClient()->GetHeroicDEX() / 10; break; default: @@ -5212,26 +5273,26 @@ void Client::SetAttackTimer() Timer *TimerToUse = nullptr; - for (int i = EQEmu::invslot::slotRange; i <= EQEmu::invslot::slotSecondary; i++) { + for (int i = EQ::invslot::slotRange; i <= EQ::invslot::slotSecondary; i++) { //pick a timer - if (i == EQEmu::invslot::slotPrimary) + if (i == EQ::invslot::slotPrimary) TimerToUse = &attack_timer; - else if (i == EQEmu::invslot::slotRange) + else if (i == EQ::invslot::slotRange) TimerToUse = &ranged_timer; - else if (i == EQEmu::invslot::slotSecondary) + else if (i == EQ::invslot::slotSecondary) TimerToUse = &attack_dw_timer; else //invalid slot (hands will always hit this) continue; - const EQEmu::ItemData *ItemToUse = nullptr; + const EQ::ItemData *ItemToUse = nullptr; //find our item - EQEmu::ItemInstance *ci = GetInv().GetItem(i); + EQ::ItemInstance *ci = GetInv().GetItem(i); if (ci) ItemToUse = ci->GetItem(); //special offhand stuff - if (i == EQEmu::invslot::slotSecondary) { + if (i == EQ::invslot::slotSecondary) { //if we cant dual wield, skip it if (!CanThisClassDualWield() || HasTwoHanderEquipped()) { attack_dw_timer.Disable(); @@ -5249,9 +5310,9 @@ void Client::SetAttackTimer() ItemToUse = nullptr; } // Check to see if skill is valid - else if ((ItemToUse->ItemType > EQEmu::item::ItemTypeLargeThrowing) && - (ItemToUse->ItemType != EQEmu::item::ItemTypeMartial) && - (ItemToUse->ItemType != EQEmu::item::ItemType2HPiercing)) { + else if ((ItemToUse->ItemType > EQ::item::ItemTypeLargeThrowing) && + (ItemToUse->ItemType != EQ::item::ItemTypeMartial) && + (ItemToUse->ItemType != EQ::item::ItemType2HPiercing)) { //no weapon ItemToUse = nullptr; } @@ -5270,7 +5331,7 @@ void Client::SetAttackTimer() speed = delay / haste_mod; - if (ItemToUse && ItemToUse->ItemType == EQEmu::item::ItemTypeBow) { + if (ItemToUse && ItemToUse->ItemType == EQ::item::ItemTypeBow) { // Live actually had a bug here where they would return the non-modified attack speed // rather than the cap ... speed = std::max(speed - GetQuiverHaste(speed), RuleI(Combat, QuiverHasteCap)); @@ -5306,19 +5367,19 @@ void NPC::SetAttackTimer() else speed = static_cast((attack_delay / haste_mod) + ((hhe / 100.0f) * attack_delay)); - for (int i = EQEmu::invslot::slotRange; i <= EQEmu::invslot::slotSecondary; i++) { + for (int i = EQ::invslot::slotRange; i <= EQ::invslot::slotSecondary; i++) { //pick a timer - if (i == EQEmu::invslot::slotPrimary) + if (i == EQ::invslot::slotPrimary) TimerToUse = &attack_timer; - else if (i == EQEmu::invslot::slotRange) + else if (i == EQ::invslot::slotRange) TimerToUse = &ranged_timer; - else if (i == EQEmu::invslot::slotSecondary) + else if (i == EQ::invslot::slotSecondary) TimerToUse = &attack_dw_timer; else //invalid slot (hands will always hit this) continue; //special offhand stuff - if (i == EQEmu::invslot::slotSecondary) { + if (i == EQ::invslot::slotSecondary) { // SPECATK_QUAD is uncheesable if (!CanThisClassDualWield() || (HasTwoHanderEquipped() && !GetSpecialAbility(SPECATK_QUAD))) { attack_dw_timer.Disable(); @@ -5340,18 +5401,18 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) bool candouble = CanThisClassDoubleAttack(); // extra off hand non-sense, can only double with skill of 150 or above // or you have any amount of GiveDoubleAttack - if (candouble && hand == EQEmu::invslot::slotSecondary) + if (candouble && hand == EQ::invslot::slotSecondary) candouble = - GetSkill(EQEmu::skills::SkillDoubleAttack) > 149 || + GetSkill(EQ::skills::SkillDoubleAttack) > 149 || (aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack) > 0; if (candouble) { - CheckIncreaseSkill(EQEmu::skills::SkillDoubleAttack, target, -10); + CheckIncreaseSkill(EQ::skills::SkillDoubleAttack, target, -10); if (CheckDoubleAttack()) { Attack(target, hand, false, false, IsFromSpell); // Modern AA description: Increases your chance of ... performing one additional hit with a 2-handed weapon when double attacking by 2%. - if (hand == EQEmu::invslot::slotPrimary) { + if (hand == EQ::invslot::slotPrimary) { auto extraattackchance = aabonuses.ExtraAttackChance + spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance; if (extraattackchance && HasTwoHanderEquipped() && zone->random.Roll(extraattackchance)) @@ -5359,8 +5420,8 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) } // you can only triple from the main hand - if (hand == EQEmu::invslot::slotPrimary && CanThisClassTripleAttack()) { - CheckIncreaseSkill(EQEmu::skills::SkillTripleAttack, target, -10); + if (hand == EQ::invslot::slotPrimary && CanThisClassTripleAttack()) { + CheckIncreaseSkill(EQ::skills::SkillTripleAttack, target, -10); if (CheckTripleAttack()) { Attack(target, hand, false, false, IsFromSpell); auto flurrychance = aabonuses.FlurryChance + spellbonuses.FlurryChance + @@ -5381,7 +5442,7 @@ bool Mob::CheckDualWield() { // Pets /might/ follow a slightly different progression // although it could all be from pets having different skills than most mobs - int chance = GetSkill(EQEmu::skills::SkillDualWield); + int chance = GetSkill(EQ::skills::SkillDualWield); if (GetLevel() > 35) chance += GetLevel(); @@ -5395,7 +5456,7 @@ bool Mob::CheckDualWield() bool Client::CheckDualWield() { - int chance = GetSkill(EQEmu::skills::SkillDualWield) + GetLevel(); + int chance = GetSkill(EQ::skills::SkillDualWield) + GetLevel(); chance += aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity; int per_inc = spellbonuses.DualWieldChance + aabonuses.DualWieldChance + itembonuses.DualWieldChance; @@ -5413,9 +5474,9 @@ void Mob::DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts) if (RuleB(Combat, UseLiveCombatRounds)) { // A "quad" on live really is just a successful dual wield where both double attack // The mobs that could triple lost the ability to when the triple attack skill was added in - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); if (CanThisClassDoubleAttack() && CheckDoubleAttack()) { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); if ((IsPet() || IsTempPet()) && IsPetOwnerClient()) { int chance = spellbonuses.PC_Pet_Flurry + itembonuses.PC_Pet_Flurry + aabonuses.PC_Pet_Flurry; if (chance && zone->random.Roll(chance)) @@ -5428,16 +5489,16 @@ void Mob::DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts) if (IsNPC()) { int16 n_atk = CastToNPC()->GetNumberOfAttacks(); if (n_atk <= 1) { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); } else { for (int i = 0; i < n_atk; ++i) { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); } } } else { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); } // we use this random value in three comparisons with different @@ -5448,15 +5509,15 @@ void Mob::DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts) // check double attack, this is NOT the same rules that clients use... && RandRoll < (GetLevel() + NPCDualAttackModifier)) { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); // lets see if we can do a triple attack with the main hand // pets are excluded from triple and quads... if ((GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) && !IsPet() && RandRoll < (GetLevel() + NPCTripleAttackModifier)) { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); // now lets check the quad attack if (GetSpecialAbility(SPECATK_QUAD) && RandRoll < (GetLevel() + NPCQuadAttackModifier)) { - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); } } } @@ -5470,11 +5531,11 @@ void Mob::DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts) // For now, SPECATK_QUAD means innate DW when Combat:UseLiveCombatRounds is true if ((GetSpecialAbility(SPECATK_INNATE_DW) || (RuleB(Combat, UseLiveCombatRounds) && GetSpecialAbility(SPECATK_QUAD))) || - GetEquippedItemFromTextureSlot(EQEmu::textures::weaponSecondary) != 0) { + GetEquippedItemFromTextureSlot(EQ::textures::weaponSecondary) != 0) { if (CheckDualWield()) { - Attack(target, EQEmu::invslot::slotSecondary, false, false, false, opts); + Attack(target, EQ::invslot::slotSecondary, false, false, false, opts); if (CanThisClassDoubleAttack() && GetLevel() > 35 && CheckDoubleAttack()) { - Attack(target, EQEmu::invslot::slotSecondary, false, false, false, opts); + Attack(target, EQ::invslot::slotSecondary, false, false, false, opts); if ((IsPet() || IsTempPet()) && IsPetOwnerClient()) { int chance = spellbonuses.PC_Pet_Flurry + itembonuses.PC_Pet_Flurry + aabonuses.PC_Pet_Flurry; diff --git a/zone/beacon.cpp b/zone/beacon.cpp index ac4beaacc..11b0de0fd 100644 --- a/zone/beacon.cpp +++ b/zone/beacon.cpp @@ -56,7 +56,7 @@ Beacon::Beacon(Mob *at_mob, int lifetime) :Mob ( nullptr, nullptr, 0, 0, 0, INVISIBLE_MAN, 0, BT_NoTarget, 0, 0, 0, 0, 0, at_mob->GetPosition(), 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EQEmu::TintProfile(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EQ::TintProfile(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false ), remove_timer(lifetime), spell_timer(0) diff --git a/zone/beacon.h b/zone/beacon.h index 3e8f6edcc..e5880c981 100644 --- a/zone/beacon.h +++ b/zone/beacon.h @@ -34,9 +34,9 @@ public: ~Beacon(); //abstract virtual function implementations requird by base abstract class - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill) { return true; } - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) { return; } - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill) { return true; } + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) { return; } + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) { return false; } virtual bool HasRaid() { return false; } virtual bool HasGroup() { return false; } diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index ad314d214..fc513577d 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -157,36 +157,36 @@ void Client::CalcItemBonuses(StatBonuses* newbon) { unsigned int i; // Update: MainAmmo should only calc skill mods (TODO: Check for other cases) - for (i = EQEmu::invslot::BONUS_BEGIN; i <= EQEmu::invslot::BONUS_SKILL_END; i++) { - const EQEmu::ItemInstance* inst = m_inv[i]; + for (i = EQ::invslot::BONUS_BEGIN; i <= EQ::invslot::BONUS_SKILL_END; i++) { + const EQ::ItemInstance* inst = m_inv[i]; if(inst == 0) continue; - AddItemBonuses(inst, newbon, false, false, 0, (i == EQEmu::invslot::slotAmmo)); + AddItemBonuses(inst, newbon, false, false, 0, (i == EQ::invslot::slotAmmo)); //These are given special flags due to how often they are checked for various spell effects. - const EQEmu::ItemData *item = inst->GetItem(); - if (i == EQEmu::invslot::slotSecondary && (item && item->ItemType == EQEmu::item::ItemTypeShield)) + const EQ::ItemData *item = inst->GetItem(); + if (i == EQ::invslot::slotSecondary && (item && item->ItemType == EQ::item::ItemTypeShield)) SetShieldEquiped(true); - else if (i == EQEmu::invslot::slotPrimary && (item && item->ItemType == EQEmu::item::ItemType2HBlunt)) { + else if (i == EQ::invslot::slotPrimary && (item && item->ItemType == EQ::item::ItemType2HBlunt)) { SetTwoHandBluntEquiped(true); SetTwoHanderEquipped(true); } - else if (i == EQEmu::invslot::slotPrimary && (item && (item->ItemType == EQEmu::item::ItemType2HSlash || item->ItemType == EQEmu::item::ItemType2HPiercing))) + else if (i == EQ::invslot::slotPrimary && (item && (item->ItemType == EQ::item::ItemType2HSlash || item->ItemType == EQ::item::ItemType2HPiercing))) SetTwoHanderEquipped(true); } //tribute items - for (i = EQEmu::invslot::TRIBUTE_BEGIN; i <= EQEmu::invslot::TRIBUTE_END; i++) { - const EQEmu::ItemInstance* inst = m_inv[i]; + for (i = EQ::invslot::TRIBUTE_BEGIN; i <= EQ::invslot::TRIBUTE_END; i++) { + const EQ::ItemInstance* inst = m_inv[i]; if(inst == 0) continue; AddItemBonuses(inst, newbon, false, true); } //Optional ability to have worn effects calculate as an addititive bonus instead of highest value - if (RuleI(Spells, AdditiveBonusWornType) && RuleI(Spells, AdditiveBonusWornType) != EQEmu::item::ItemEffectWorn){ - for (i = EQEmu::invslot::BONUS_BEGIN; i <= EQEmu::invslot::BONUS_STAT_END; i++) { - const EQEmu::ItemInstance* inst = m_inv[i]; + if (RuleI(Spells, AdditiveBonusWornType) && RuleI(Spells, AdditiveBonusWornType) != EQ::item::ItemEffectWorn){ + for (i = EQ::invslot::BONUS_BEGIN; i <= EQ::invslot::BONUS_STAT_END; i++) { + const EQ::ItemInstance* inst = m_inv[i]; if(inst == 0) continue; AdditiveWornBonuses(inst, newbon); @@ -212,7 +212,7 @@ void Client::ProcessItemCaps() itembonuses.ATK = std::min(itembonuses.ATK, CalcItemATKCap()); } -void Client::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses *newbon, bool isAug, bool isTribute, int rec_override, bool ammo_slot_item) +void Client::AddItemBonuses(const EQ::ItemInstance *inst, StatBonuses *newbon, bool isAug, bool isTribute, int rec_override, bool ammo_slot_item) { if (!inst || !inst->IsClassCommon()) { return; @@ -222,10 +222,10 @@ void Client::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses *newbon return; } - const EQEmu::ItemData *item = inst->GetItem(); + const EQ::ItemData *item = inst->GetItem(); if (!isTribute && !inst->IsEquipable(GetBaseRace(), GetClass())) { - if (item->ItemType != EQEmu::item::ItemTypeFood && item->ItemType != EQEmu::item::ItemTypeDrink) + if (item->ItemType != EQ::item::ItemTypeFood && item->ItemType != EQ::item::ItemTypeDrink) return; } @@ -434,11 +434,11 @@ void Client::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses *newbon else newbon->DSMitigation += item->DSMitigation; } - if (item->Worn.Effect > 0 && item->Worn.Type == EQEmu::item::ItemEffectWorn) { // latent effects + if (item->Worn.Effect > 0 && item->Worn.Type == EQ::item::ItemEffectWorn) { // latent effects ApplySpellsBonuses(item->Worn.Effect, item->Worn.Level, newbon, 0, item->Worn.Type); } - if (item->Focus.Effect > 0 && (item->Focus.Type == EQEmu::item::ItemEffectFocus)) { // focus effects + if (item->Focus.Effect > 0 && (item->Focus.Type == EQ::item::ItemEffectFocus)) { // focus effects ApplySpellsBonuses(item->Focus.Effect, item->Focus.Level, newbon, 0); } @@ -511,7 +511,7 @@ void Client::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses *newbon } } - if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= EQEmu::skills::HIGHEST_SKILL) { + if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= EQ::skills::HIGHEST_SKILL) { if ((newbon->SkillDamageAmount[item->ExtraDmgSkill] + item->ExtraDmgAmt) > RuleI(Character, ItemExtraDmgCap)) newbon->SkillDamageAmount[item->ExtraDmgSkill] = RuleI(Character, ItemExtraDmgCap); @@ -521,7 +521,7 @@ void Client::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses *newbon } // Process when ammo_slot_item = true or false - if (item->SkillModValue != 0 && item->SkillModType <= EQEmu::skills::HIGHEST_SKILL) { + if (item->SkillModValue != 0 && item->SkillModType <= EQ::skills::HIGHEST_SKILL) { if ((item->SkillModValue > 0 && newbon->skillmod[item->SkillModType] < item->SkillModValue) || (item->SkillModValue < 0 && newbon->skillmod[item->SkillModType] > item->SkillModValue)) { @@ -531,12 +531,12 @@ void Client::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses *newbon } if (!isAug) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) AddItemBonuses(inst->GetAugment(i), newbon, true, false, rec_level, ammo_slot_item); } } -void Client::AdditiveWornBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, bool isAug) { +void Client::AdditiveWornBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug) { /* Powerful Non-live like option allows developers to add worn effects on items that @@ -554,7 +554,7 @@ void Client::AdditiveWornBonuses(const EQEmu::ItemInstance *inst, StatBonuses* n if(inst->GetAugmentType()==0 && isAug == true) return; - const EQEmu::ItemData *item = inst->GetItem(); + const EQ::ItemData *item = inst->GetItem(); if(!inst->IsEquipable(GetBaseRace(),GetClass())) return; @@ -569,7 +569,7 @@ void Client::AdditiveWornBonuses(const EQEmu::ItemInstance *inst, StatBonuses* n if (!isAug) { int i; - for (i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { AdditiveWornBonuses(inst->GetAugment(i),newbon,true); } } @@ -580,32 +580,32 @@ void Client::CalcEdibleBonuses(StatBonuses* newbon) { bool food = false; bool drink = false; - for (i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++) + for (i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { if (food && drink) break; - const EQEmu::ItemInstance* inst = GetInv().GetItem(i); + const EQ::ItemInstance* inst = GetInv().GetItem(i); if (inst && inst->GetItem() && inst->IsClassCommon()) { - const EQEmu::ItemData *item = inst->GetItem(); - if (!food && item->ItemType == EQEmu::item::ItemTypeFood) + const EQ::ItemData *item = inst->GetItem(); + if (!food && item->ItemType == EQ::item::ItemTypeFood) food = true; - else if (!drink && item->ItemType == EQEmu::item::ItemTypeDrink) + else if (!drink && item->ItemType == EQ::item::ItemTypeDrink) drink = true; else continue; AddItemBonuses(inst, newbon); } } - for (i = EQEmu::invbag::GENERAL_BAGS_BEGIN; i <= EQEmu::invbag::GENERAL_BAGS_END; i++) + for (i = EQ::invbag::GENERAL_BAGS_BEGIN; i <= EQ::invbag::GENERAL_BAGS_END; i++) { if (food && drink) break; - const EQEmu::ItemInstance* inst = GetInv().GetItem(i); + const EQ::ItemInstance* inst = GetInv().GetItem(i); if (inst && inst->GetItem() && inst->IsClassCommon()) { - const EQEmu::ItemData *item = inst->GetItem(); - if (!food && item->ItemType == EQEmu::item::ItemTypeFood) + const EQ::ItemData *item = inst->GetItem(); + if (!food && item->ItemType == EQ::item::ItemTypeFood) food = true; - else if (!drink && item->ItemType == EQEmu::item::ItemTypeDrink) + else if (!drink && item->ItemType == EQ::item::ItemTypeDrink) drink = true; else continue; @@ -680,10 +680,10 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) // Note: AA effects that use accuracy are skill limited, while spell effect is not. case SE_Accuracy: // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - if ((base2 == ALL_SKILLS) && (newbon->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] < base1)) - newbon->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] = base1; + if ((base2 == ALL_SKILLS) && (newbon->Accuracy[EQ::skills::HIGHEST_SKILL + 1] < base1)) + newbon->Accuracy[EQ::skills::HIGHEST_SKILL + 1] = base1; else if (newbon->Accuracy[base2] < base1) newbon->Accuracy[base2] += base1; break; @@ -919,19 +919,19 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; case SE_AddSingingMod: switch (base2) { - case EQEmu::item::ItemTypeWindInstrument: + case EQ::item::ItemTypeWindInstrument: newbon->windMod += base1; break; - case EQEmu::item::ItemTypeStringedInstrument: + case EQ::item::ItemTypeStringedInstrument: newbon->stringedMod += base1; break; - case EQEmu::item::ItemTypeBrassInstrument: + case EQ::item::ItemTypeBrassInstrument: newbon->brassMod += base1; break; - case EQEmu::item::ItemTypePercussionInstrument: + case EQ::item::ItemTypePercussionInstrument: newbon->percussionMod += base1; break; - case EQEmu::item::ItemTypeSinging: + case EQ::item::ItemTypeSinging: newbon->singingMod += base1; break; } @@ -1028,10 +1028,10 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_HitChance: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (base2 == ALL_SKILLS) - newbon->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] += base1; + newbon->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] += base1; else newbon->HitChanceEffect[base2] += base1; } @@ -1082,21 +1082,21 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_CriticalHitChance: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (base2 == ALL_SKILLS) - newbon->CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] += base1; + newbon->CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] += base1; else newbon->CriticalHitChance[base2] += base1; } break; case SE_CriticalDamageMob: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; // base1 = effect value, base2 = skill restrictions(-1 for all) if (base2 == ALL_SKILLS) - newbon->CritDmgMod[EQEmu::skills::HIGHEST_SKILL + 1] += base1; + newbon->CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] += base1; else newbon->CritDmgMod[base2] += base1; break; @@ -1122,10 +1122,10 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_SkillDamageAmount: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (base2 == ALL_SKILLS) - newbon->SkillDamageAmount[EQEmu::skills::HIGHEST_SKILL + 1] += base1; + newbon->SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 1] += base1; else newbon->SkillDamageAmount[base2] += base1; break; @@ -1141,10 +1141,10 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_DamageModifier: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (base2 == ALL_SKILLS) - newbon->DamageModifier[EQEmu::skills::HIGHEST_SKILL + 1] += base1; + newbon->DamageModifier[EQ::skills::HIGHEST_SKILL + 1] += base1; else newbon->DamageModifier[base2] += base1; break; @@ -1152,10 +1152,10 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_DamageModifier2: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (base2 == ALL_SKILLS) - newbon->DamageModifier2[EQEmu::skills::HIGHEST_SKILL + 1] += base1; + newbon->DamageModifier2[EQ::skills::HIGHEST_SKILL + 1] += base1; else newbon->DamageModifier2[base2] += base1; break; @@ -1191,7 +1191,7 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) // Physically raises skill cap ie if 55/55 it will raise to 55/60 case SE_RaiseSkillCap: { - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (newbon->RaiseSkillCap[base2] < base1) @@ -1370,9 +1370,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_LimitToSkill: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - if (base1 <= EQEmu::skills::HIGHEST_SKILL) + if (base1 <= EQ::skills::HIGHEST_SKILL) newbon->LimitToSkill[base1] = true; break; } @@ -1436,7 +1436,7 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_ReduceTradeskillFail:{ - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; newbon->ReduceTradeskillFail[base2] += base1; @@ -1482,8 +1482,8 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) // I'd rather not do this here, but whatever, probably fine if (IsClient()) { auto client = CastToClient(); - if (client->GetRawSkill(EQEmu::skills::SkillType::SkillForage) == 0) - client->SetSkill(EQEmu::skills::SkillType::SkillForage, 1); + if (client->GetRawSkill(EQ::skills::SkillType::SkillForage) == 0) + client->SetSkill(EQ::skills::SkillType::SkillForage, 1); } break; @@ -1983,26 +1983,26 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_CriticalHitChance: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (AdditiveWornBonus) { if(base2 == ALL_SKILLS) - new_bonus->CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] += effect_value; + new_bonus->CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] += effect_value; else new_bonus->CriticalHitChance[base2] += effect_value; } else if(effect_value < 0) { - if (base2 == ALL_SKILLS && new_bonus->CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] > effect_value) - new_bonus->CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + if (base2 == ALL_SKILLS && new_bonus->CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] > effect_value) + new_bonus->CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] = effect_value; else if(base2 != ALL_SKILLS && new_bonus->CriticalHitChance[base2] > effect_value) new_bonus->CriticalHitChance[base2] = effect_value; } - else if (base2 == ALL_SKILLS && new_bonus->CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] < effect_value) - new_bonus->CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + else if (base2 == ALL_SKILLS && new_bonus->CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] < effect_value) + new_bonus->CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] = effect_value; else if(base2 != ALL_SKILLS && new_bonus->CriticalHitChance[base2] < effect_value) new_bonus->CriticalHitChance[base2] = effect_value; @@ -2189,24 +2189,24 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_HitChance: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (AdditiveWornBonus){ if(base2 == ALL_SKILLS) - new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] += effect_value; + new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] += effect_value; else new_bonus->HitChanceEffect[base2] += effect_value; } else if(base2 == ALL_SKILLS){ - if ((effect_value < 0) && (new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] > effect_value)) - new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + if ((effect_value < 0) && (new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] > effect_value)) + new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] = effect_value; - else if (!new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] || - ((new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] > 0) && (new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] < effect_value))) - new_bonus->HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + else if (!new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] || + ((new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] > 0) && (new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] < effect_value))) + new_bonus->HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] = effect_value; } else { @@ -2226,9 +2226,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_DamageModifier: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - int skill = base2 == ALL_SKILLS ? EQEmu::skills::HIGHEST_SKILL + 1 : base2; + int skill = base2 == ALL_SKILLS ? EQ::skills::HIGHEST_SKILL + 1 : base2; if (effect_value < 0 && new_bonus->DamageModifier[skill] > effect_value) new_bonus->DamageModifier[skill] = effect_value; else if (effect_value > 0 && new_bonus->DamageModifier[skill] < effect_value) @@ -2239,9 +2239,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_DamageModifier2: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - int skill = base2 == ALL_SKILLS ? EQEmu::skills::HIGHEST_SKILL + 1 : base2; + int skill = base2 == ALL_SKILLS ? EQ::skills::HIGHEST_SKILL + 1 : base2; if (effect_value < 0 && new_bonus->DamageModifier2[skill] > effect_value) new_bonus->DamageModifier2[skill] = effect_value; else if (effect_value > 0 && new_bonus->DamageModifier2[skill] < effect_value) @@ -2252,9 +2252,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_MinDamageModifier: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - int skill = base2 == ALL_SKILLS ? EQEmu::skills::HIGHEST_SKILL + 1 : base2; + int skill = base2 == ALL_SKILLS ? EQ::skills::HIGHEST_SKILL + 1 : base2; if (effect_value < 0 && new_bonus->MinDamageModifier[skill] > effect_value) new_bonus->MinDamageModifier[skill] = effect_value; else if (effect_value > 0 && new_bonus->MinDamageModifier[skill] < effect_value) @@ -2329,14 +2329,14 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_Accuracy: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - if ((effect_value < 0) && (new_bonus->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] > effect_value)) - new_bonus->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + if ((effect_value < 0) && (new_bonus->Accuracy[EQ::skills::HIGHEST_SKILL + 1] > effect_value)) + new_bonus->Accuracy[EQ::skills::HIGHEST_SKILL + 1] = effect_value; - else if (!new_bonus->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] || - ((new_bonus->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] > 0) && (new_bonus->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] < effect_value))) - new_bonus->Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + else if (!new_bonus->Accuracy[EQ::skills::HIGHEST_SKILL + 1] || + ((new_bonus->Accuracy[EQ::skills::HIGHEST_SKILL + 1] > 0) && (new_bonus->Accuracy[EQ::skills::HIGHEST_SKILL + 1] < effect_value))) + new_bonus->Accuracy[EQ::skills::HIGHEST_SKILL + 1] = effect_value; break; } @@ -2355,19 +2355,19 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_SkillDamageTaken: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; //When using npc_spells_effects if MAX value set, use stackable quest based modifier. if (IsAISpellEffect && max){ if(base2 == ALL_SKILLS) - SkillDmgTaken_Mod[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + SkillDmgTaken_Mod[EQ::skills::HIGHEST_SKILL + 1] = effect_value; else SkillDmgTaken_Mod[base2] = effect_value; } else { if(base2 == ALL_SKILLS) - new_bonus->SkillDmgTaken[EQEmu::skills::HIGHEST_SKILL + 1] += effect_value; + new_bonus->SkillDmgTaken[EQ::skills::HIGHEST_SKILL + 1] += effect_value; else new_bonus->SkillDmgTaken[base2] += effect_value; @@ -2476,10 +2476,10 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_CriticalDamageMob: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if(base2 == ALL_SKILLS) - new_bonus->CritDmgMod[EQEmu::skills::HIGHEST_SKILL + 1] += effect_value; + new_bonus->CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] += effect_value; else new_bonus->CritDmgMod[base2] += effect_value; break; @@ -2495,10 +2495,10 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_SkillDamageAmount: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if(base2 == ALL_SKILLS) - new_bonus->SkillDamageAmount[EQEmu::skills::HIGHEST_SKILL + 1] += effect_value; + new_bonus->SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 1] += effect_value; else new_bonus->SkillDamageAmount[base2] += effect_value; break; @@ -2614,10 +2614,10 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_SkillDamageAmount2: { // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if(base2 == ALL_SKILLS) - new_bonus->SkillDamageAmount2[EQEmu::skills::HIGHEST_SKILL + 1] += effect_value; + new_bonus->SkillDamageAmount2[EQ::skills::HIGHEST_SKILL + 1] += effect_value; else new_bonus->SkillDamageAmount2[base2] += effect_value; break; @@ -2805,19 +2805,19 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_AddSingingMod: switch (base2) { - case EQEmu::item::ItemTypeWindInstrument: + case EQ::item::ItemTypeWindInstrument: new_bonus->windMod += effect_value; break; - case EQEmu::item::ItemTypeStringedInstrument: + case EQ::item::ItemTypeStringedInstrument: new_bonus->stringedMod += effect_value; break; - case EQEmu::item::ItemTypeBrassInstrument: + case EQ::item::ItemTypeBrassInstrument: new_bonus->brassMod += effect_value; break; - case EQEmu::item::ItemTypePercussionInstrument: + case EQ::item::ItemTypePercussionInstrument: new_bonus->percussionMod += effect_value; break; - case EQEmu::item::ItemTypeSinging: + case EQ::item::ItemTypeSinging: new_bonus->singingMod += effect_value; break; default: @@ -3151,9 +3151,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_LimitToSkill:{ // Bad data or unsupported new skill - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; - if (effect_value <= EQEmu::skills::HIGHEST_SKILL){ + if (effect_value <= EQ::skills::HIGHEST_SKILL){ new_bonus->LimitToSkill[effect_value] = true; } break; @@ -3210,7 +3210,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_ReduceTradeskillFail:{ - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; new_bonus->ReduceTradeskillFail[base2] += effect_value; @@ -3223,7 +3223,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne break; case SE_RaiseSkillCap: { - if (base2 > EQEmu::skills::HIGHEST_SKILL) + if (base2 > EQ::skills::HIGHEST_SKILL) break; if (new_bonus->RaiseSkillCap[base2] < effect_value) @@ -3267,8 +3267,8 @@ void NPC::CalcItemBonuses(StatBonuses *newbon) { if(newbon){ - for (int i = EQEmu::invslot::BONUS_BEGIN; i <= EQEmu::invslot::BONUS_STAT_END; i++){ - const EQEmu::ItemData *cur = database.GetItem(equipment[i]); + for (int i = EQ::invslot::BONUS_BEGIN; i <= EQ::invslot::BONUS_STAT_END; i++){ + const EQ::ItemData *cur = database.GetItem(equipment[i]); if(cur){ //basic stats newbon->AC += cur->AC; @@ -3323,12 +3323,12 @@ void NPC::CalcItemBonuses(StatBonuses *newbon) if(cur->CombatEffects > 0) { newbon->ProcChance += cur->CombatEffects; } - if (cur->Worn.Effect>0 && (cur->Worn.Type == EQEmu::item::ItemEffectWorn)) { // latent effects + if (cur->Worn.Effect>0 && (cur->Worn.Type == EQ::item::ItemEffectWorn)) { // latent effects ApplySpellsBonuses(cur->Worn.Effect, cur->Worn.Level, newbon, 0, cur->Worn.Type); } if (RuleB(Spells, NPC_UseFocusFromItems)){ - if (cur->Focus.Effect>0 && (cur->Focus.Type == EQEmu::item::ItemEffectFocus)){ // focus effects + if (cur->Focus.Effect>0 && (cur->Focus.Type == EQ::item::ItemEffectFocus)){ // focus effects ApplySpellsBonuses(cur->Focus.Effect, cur->Focus.Level, newbon); } } @@ -3345,18 +3345,18 @@ void Client::CalcItemScale() { bool changed = false; // MainAmmo excluded in helper function below - if (CalcItemScale(EQEmu::invslot::EQUIPMENT_BEGIN, EQEmu::invslot::EQUIPMENT_END)) // original coding excluded MainAmmo (< 21) + if (CalcItemScale(EQ::invslot::EQUIPMENT_BEGIN, EQ::invslot::EQUIPMENT_END)) // original coding excluded MainAmmo (< 21) changed = true; - if (CalcItemScale(EQEmu::invslot::GENERAL_BEGIN, EQEmu::invslot::GENERAL_END)) // original coding excluded MainCursor (< 30) + if (CalcItemScale(EQ::invslot::GENERAL_BEGIN, EQ::invslot::GENERAL_END)) // original coding excluded MainCursor (< 30) changed = true; // I excluded cursor bag slots here because cursor was excluded above..if this is incorrect, change 'slot_y' here to CURSOR_BAG_END // and 'slot_y' above to CURSOR from GENERAL_END above - or however it is supposed to be... - if (CalcItemScale(EQEmu::invbag::GENERAL_BAGS_BEGIN, EQEmu::invbag::GENERAL_BAGS_END)) // (< 341) + if (CalcItemScale(EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END)) // (< 341) changed = true; - if (CalcItemScale(EQEmu::invslot::TRIBUTE_BEGIN, EQEmu::invslot::TRIBUTE_END)) // (< 405) + if (CalcItemScale(EQ::invslot::TRIBUTE_BEGIN, EQ::invslot::TRIBUTE_END)) // (< 405) changed = true; if(changed) @@ -3370,18 +3370,18 @@ bool Client::CalcItemScale(uint32 slot_x, uint32 slot_y) { bool changed = false; uint32 i; for (i = slot_x; i <= slot_y; i++) { - if (i == EQEmu::invslot::slotAmmo) // moved here from calling procedure to facilitate future range changes where MainAmmo may not be the last slot + if (i == EQ::invslot::slotAmmo) // moved here from calling procedure to facilitate future range changes where MainAmmo may not be the last slot continue; - EQEmu::ItemInstance* inst = m_inv.GetItem(i); + EQ::ItemInstance* inst = m_inv.GetItem(i); if(inst == nullptr) continue; // TEST CODE: test for bazaar trader crashing with charm items if (Trader) - if (i >= EQEmu::invbag::GENERAL_BAGS_BEGIN && i <= EQEmu::invbag::GENERAL_BAGS_END) { - EQEmu::ItemInstance* parent_item = m_inv.GetItem(EQEmu::InventoryProfile::CalcSlotId(i)); + if (i >= EQ::invbag::GENERAL_BAGS_BEGIN && i <= EQ::invbag::GENERAL_BAGS_END) { + EQ::ItemInstance* parent_item = m_inv.GetItem(EQ::InventoryProfile::CalcSlotId(i)); if (parent_item && parent_item->GetItem()->ID == 17899) // trader satchel continue; } @@ -3400,9 +3400,9 @@ bool Client::CalcItemScale(uint32 slot_x, uint32 slot_y) { } //iterate all augments - for (int x = EQEmu::invaug::SOCKET_BEGIN; x <= EQEmu::invaug::SOCKET_END; ++x) + for (int x = EQ::invaug::SOCKET_BEGIN; x <= EQ::invaug::SOCKET_END; ++x) { - EQEmu::ItemInstance * a_inst = inst->GetAugment(x); + EQ::ItemInstance * a_inst = inst->GetAugment(x); if(!a_inst) continue; @@ -3432,18 +3432,18 @@ void Client::DoItemEnterZone() { bool changed = false; // MainAmmo excluded in helper function below - if (DoItemEnterZone(EQEmu::invslot::EQUIPMENT_BEGIN, EQEmu::invslot::EQUIPMENT_END)) // original coding excluded MainAmmo (< 21) + if (DoItemEnterZone(EQ::invslot::EQUIPMENT_BEGIN, EQ::invslot::EQUIPMENT_END)) // original coding excluded MainAmmo (< 21) changed = true; - if (DoItemEnterZone(EQEmu::invslot::GENERAL_BEGIN, EQEmu::invslot::GENERAL_END)) // original coding excluded MainCursor (< 30) + if (DoItemEnterZone(EQ::invslot::GENERAL_BEGIN, EQ::invslot::GENERAL_END)) // original coding excluded MainCursor (< 30) changed = true; // I excluded cursor bag slots here because cursor was excluded above..if this is incorrect, change 'slot_y' here to CURSOR_BAG_END // and 'slot_y' above to CURSOR from GENERAL_END above - or however it is supposed to be... - if (DoItemEnterZone(EQEmu::invbag::GENERAL_BAGS_BEGIN, EQEmu::invbag::GENERAL_BAGS_END)) // (< 341) + if (DoItemEnterZone(EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END)) // (< 341) changed = true; - if (DoItemEnterZone(EQEmu::invslot::TRIBUTE_BEGIN, EQEmu::invslot::TRIBUTE_END)) // (< 405) + if (DoItemEnterZone(EQ::invslot::TRIBUTE_BEGIN, EQ::invslot::TRIBUTE_END)) // (< 405) changed = true; if(changed) @@ -3456,18 +3456,18 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) { // behavior change: 'slot_y' is now [RANGE]_END and not [RANGE]_END + 1 bool changed = false; for(uint32 i = slot_x; i <= slot_y; i++) { - if (i == EQEmu::invslot::slotAmmo) // moved here from calling procedure to facilitate future range changes where MainAmmo may not be the last slot + if (i == EQ::invslot::slotAmmo) // moved here from calling procedure to facilitate future range changes where MainAmmo may not be the last slot continue; - EQEmu::ItemInstance* inst = m_inv.GetItem(i); + EQ::ItemInstance* inst = m_inv.GetItem(i); if(!inst) continue; // TEST CODE: test for bazaar trader crashing with charm items if (Trader) - if (i >= EQEmu::invbag::GENERAL_BAGS_BEGIN && i <= EQEmu::invbag::GENERAL_BAGS_END) { - EQEmu::ItemInstance* parent_item = m_inv.GetItem(EQEmu::InventoryProfile::CalcSlotId(i)); + if (i >= EQ::invbag::GENERAL_BAGS_BEGIN && i <= EQ::invbag::GENERAL_BAGS_END) { + EQ::ItemInstance* parent_item = m_inv.GetItem(EQ::InventoryProfile::CalcSlotId(i)); if (parent_item && parent_item->GetItem()->ID == 17899) // trader satchel continue; } @@ -3478,7 +3478,7 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) { uint16 oldexp = inst->GetExp(); parse->EventItem(EVENT_ITEM_ENTER_ZONE, this, inst, nullptr, "", 0); - if (i <= EQEmu::invslot::EQUIPMENT_END) { + if (i <= EQ::invslot::EQUIPMENT_END) { parse->EventItem(EVENT_EQUIP_ITEM, this, inst, nullptr, "", i); } @@ -3488,7 +3488,7 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) { update_slot = true; } } else { - if (i <= EQEmu::invslot::EQUIPMENT_END) { + if (i <= EQ::invslot::EQUIPMENT_END) { parse->EventItem(EVENT_EQUIP_ITEM, this, inst, nullptr, "", i); } @@ -3496,9 +3496,9 @@ bool Client::DoItemEnterZone(uint32 slot_x, uint32 slot_y) { } //iterate all augments - for (int x = EQEmu::invaug::SOCKET_BEGIN; x <= EQEmu::invaug::SOCKET_END; ++x) + for (int x = EQ::invaug::SOCKET_BEGIN; x <= EQ::invaug::SOCKET_END; ++x) { - EQEmu::ItemInstance *a_inst = inst->GetAugment(x); + EQ::ItemInstance *a_inst = inst->GetAugment(x); if(!a_inst) continue; @@ -3922,7 +3922,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_CriticalHitChance: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.CriticalHitChance[e] = effect_value; aabonuses.CriticalHitChance[e] = effect_value; @@ -4040,7 +4040,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_HitChance: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.HitChanceEffect[e] = effect_value; aabonuses.HitChanceEffect[e] = effect_value; @@ -4051,7 +4051,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_DamageModifier: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.DamageModifier[e] = effect_value; aabonuses.DamageModifier[e] = effect_value; @@ -4062,7 +4062,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_DamageModifier2: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.DamageModifier2[e] = effect_value; aabonuses.DamageModifier2[e] = effect_value; @@ -4073,7 +4073,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_MinDamageModifier: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.MinDamageModifier[e] = effect_value; aabonuses.MinDamageModifier[e] = effect_value; @@ -4114,10 +4114,10 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_Accuracy: { - spellbonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; - itembonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] = effect_value; + spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] = effect_value; + itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] = effect_value; - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { aabonuses.Accuracy[e] = effect_value; } @@ -4144,7 +4144,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_SkillDamageTaken: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.SkillDmgTaken[e] = effect_value; aabonuses.SkillDmgTaken[e] = effect_value; @@ -4249,7 +4249,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_CriticalDamageMob: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.CritDmgMod[e] = effect_value; aabonuses.CritDmgMod[e] = effect_value; @@ -4260,7 +4260,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_SkillDamageAmount: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.SkillDamageAmount[e] = effect_value; aabonuses.SkillDamageAmount[e] = effect_value; @@ -4311,7 +4311,7 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) case SE_SkillDamageAmount2: { - for (int e = 0; e < EQEmu::skills::HIGHEST_SKILL + 1; e++) + for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++) { spellbonuses.SkillDamageAmount2[e] = effect_value; aabonuses.SkillDamageAmount2[e] = effect_value; diff --git a/zone/bot.cpp b/zone/bot.cpp index 6d14ce740..59bdf9788 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -40,7 +40,7 @@ Bot::Bot(NPCType *npcTypeData, Client* botOwner) : NPC(npcTypeData, nullptr, glm this->_botOwnerCharacterID = 0; } - m_inv.SetInventoryVersion(EQEmu::versions::MobVersion::Bot); + m_inv.SetInventoryVersion(EQ::versions::MobVersion::Bot); m_inv.SetGMInventory(false); // bot expansions are not currently implemented (defaults to static) _guildRank = 0; @@ -132,7 +132,7 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to auto bot_owner = GetBotOwner(); - m_inv.SetInventoryVersion(EQEmu::versions::MobVersion::Bot); + m_inv.SetInventoryVersion(EQ::versions::MobVersion::Bot); m_inv.SetGMInventory(false); // bot expansions are not currently implemented (defaults to static) _guildRank = 0; @@ -177,7 +177,7 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to if (!stance_flag && bot_owner) bot_owner->Message(Chat::Red, "Could not locate stance for '%s'", GetCleanName()); - SetTaunting((GetClass() == WARRIOR || GetClass() == PALADIN || GetClass() == SHADOWKNIGHT) && (GetBotStance() == EQEmu::constants::stanceAggressive)); + SetTaunting((GetClass() == WARRIOR || GetClass() == PALADIN || GetClass() == SHADOWKNIGHT) && (GetBotStance() == EQ::constants::stanceAggressive)); SetPauseAI(false); m_alt_combat_hate_timer.Start(250); @@ -491,14 +491,14 @@ void Bot::SetSuffix(std::string bot_suffix) { } uint32 Bot::GetBotArcheryRange() { - const EQEmu::ItemInstance *range_inst = GetBotItem(EQEmu::invslot::slotRange); - const EQEmu::ItemInstance *ammo_inst = GetBotItem(EQEmu::invslot::slotAmmo); + const EQ::ItemInstance *range_inst = GetBotItem(EQ::invslot::slotRange); + const EQ::ItemInstance *ammo_inst = GetBotItem(EQ::invslot::slotAmmo); if (!range_inst || !ammo_inst) return 0; - const EQEmu::ItemData *range_item = range_inst->GetItem(); - const EQEmu::ItemData *ammo_item = ammo_inst->GetItem(); - if (!range_item || !ammo_item || range_item->ItemType != EQEmu::item::ItemTypeBow || ammo_item->ItemType != EQEmu::item::ItemTypeArrow) + const EQ::ItemData *range_item = range_inst->GetItem(); + const EQ::ItemData *ammo_item = ammo_inst->GetItem(); + if (!range_item || !ammo_item || range_item->ItemType != EQ::item::ItemTypeBow || ammo_item->ItemType != EQ::item::ItemTypeArrow) return 0; // everything is good! @@ -508,15 +508,15 @@ uint32 Bot::GetBotArcheryRange() { void Bot::ChangeBotArcherWeapons(bool isArcher) { if((GetClass()==WARRIOR) || (GetClass()==PALADIN) || (GetClass()==RANGER) || (GetClass()==SHADOWKNIGHT) || (GetClass()==ROGUE)) { if(!isArcher) { - BotAddEquipItem(EQEmu::invslot::slotPrimary, GetBotItemBySlot(EQEmu::invslot::slotPrimary)); - BotAddEquipItem(EQEmu::invslot::slotSecondary, GetBotItemBySlot(EQEmu::invslot::slotSecondary)); + BotAddEquipItem(EQ::invslot::slotPrimary, GetBotItemBySlot(EQ::invslot::slotPrimary)); + BotAddEquipItem(EQ::invslot::slotSecondary, GetBotItemBySlot(EQ::invslot::slotSecondary)); SetAttackTimer(); BotGroupSay(this, "My blade is ready"); } else { - BotRemoveEquipItem(EQEmu::invslot::slotPrimary); - BotRemoveEquipItem(EQEmu::invslot::slotSecondary); - BotAddEquipItem(EQEmu::invslot::slotAmmo, GetBotItemBySlot(EQEmu::invslot::slotAmmo)); - BotAddEquipItem(EQEmu::invslot::slotSecondary, GetBotItemBySlot(EQEmu::invslot::slotRange)); + BotRemoveEquipItem(EQ::invslot::slotPrimary); + BotRemoveEquipItem(EQ::invslot::slotSecondary); + BotAddEquipItem(EQ::invslot::slotAmmo, GetBotItemBySlot(EQ::invslot::slotAmmo)); + BotAddEquipItem(EQ::invslot::slotSecondary, GetBotItemBySlot(EQ::invslot::slotRange)); SetAttackTimer(); BotGroupSay(this, "My bow is true and ready"); } @@ -574,7 +574,7 @@ NPCType *Bot::FillNPCTypeStruct(uint32 botSpellsID, std::string botName, std::st bot_npc_type->race = botRace; bot_npc_type->class_ = botClass; bot_npc_type->bodytype = 1; - bot_npc_type->deity = EQEmu::deity::DeityAgnostic; + bot_npc_type->deity = EQ::deity::DeityAgnostic; bot_npc_type->level = botLevel; //bot_npc_type->npc_id = 0; //bot_npc_type->texture = 0; @@ -699,7 +699,7 @@ NPCType *Bot::CreateDefaultNPCTypeStructForBot(std::string botName, std::string bot_npc_type->race = botRace; bot_npc_type->class_ = botClass; bot_npc_type->bodytype = 1; - bot_npc_type->deity = EQEmu::deity::DeityAgnostic; + bot_npc_type->deity = EQ::deity::DeityAgnostic; bot_npc_type->level = botLevel; //bot_npc_type->npc_id = 0; //bot_npc_type->texture = 0; @@ -1553,36 +1553,36 @@ int32 Bot::acmod() { } uint16 Bot::GetPrimarySkillValue() { - EQEmu::skills::SkillType skill = EQEmu::skills::HIGHEST_SKILL; //because nullptr == 0, which is 1H Slashing, & we want it to return 0 from GetSkill - bool equiped = m_inv.GetItem(EQEmu::invslot::slotPrimary); + EQ::skills::SkillType skill = EQ::skills::HIGHEST_SKILL; //because nullptr == 0, which is 1H Slashing, & we want it to return 0 from GetSkill + bool equiped = m_inv.GetItem(EQ::invslot::slotPrimary); if(!equiped) - skill = EQEmu::skills::SkillHandtoHand; + skill = EQ::skills::SkillHandtoHand; else { - uint8 type = m_inv.GetItem(EQEmu::invslot::slotPrimary)->GetItem()->ItemType; //is this the best way to do this? + uint8 type = m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->ItemType; //is this the best way to do this? switch(type) { - case EQEmu::item::ItemType1HSlash: - skill = EQEmu::skills::Skill1HSlashing; + case EQ::item::ItemType1HSlash: + skill = EQ::skills::Skill1HSlashing; break; - case EQEmu::item::ItemType2HSlash: - skill = EQEmu::skills::Skill2HSlashing; + case EQ::item::ItemType2HSlash: + skill = EQ::skills::Skill2HSlashing; break; - case EQEmu::item::ItemType1HPiercing: - skill = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType1HPiercing: + skill = EQ::skills::Skill1HPiercing; break; - case EQEmu::item::ItemType1HBlunt: - skill = EQEmu::skills::Skill1HBlunt; + case EQ::item::ItemType1HBlunt: + skill = EQ::skills::Skill1HBlunt; break; - case EQEmu::item::ItemType2HBlunt: - skill = EQEmu::skills::Skill2HBlunt; + case EQ::item::ItemType2HBlunt: + skill = EQ::skills::Skill2HBlunt; break; - case EQEmu::item::ItemType2HPiercing: - skill = EQEmu::skills::Skill2HPiercing; + case EQ::item::ItemType2HPiercing: + skill = EQ::skills::Skill2HPiercing; break; - case EQEmu::item::ItemTypeMartial: - skill = EQEmu::skills::SkillHandtoHand; + case EQ::item::ItemTypeMartial: + skill = EQ::skills::SkillHandtoHand; break; default: - skill = EQEmu::skills::SkillHandtoHand; + skill = EQ::skills::SkillHandtoHand; break; } } @@ -1590,15 +1590,15 @@ uint16 Bot::GetPrimarySkillValue() { return GetSkill(skill); } -uint16 Bot::MaxSkill(EQEmu::skills::SkillType skillid, uint16 class_, uint16 level) const { - return(database.GetSkillCap(class_, skillid, level)); +uint16 Bot::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { + return(content_db.GetSkillCap(class_, skillid, level)); } uint32 Bot::GetTotalATK() { uint32 AttackRating = 0; uint32 WornCap = itembonuses.ATK; if(IsBot()) { - AttackRating = ((WornCap * 1.342) + (GetSkill(EQEmu::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69)); + AttackRating = ((WornCap * 1.342) + (GetSkill(EQ::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69)); AttackRating += aabonuses.ATK + GroupLeadershipAAOffenseEnhancement(); if (AttackRating < 10) AttackRating = 10; @@ -1613,7 +1613,7 @@ uint32 Bot::GetTotalATK() { uint32 Bot::GetATKRating() { uint32 AttackRating = 0; if(IsBot()) { - AttackRating = (GetSkill(EQEmu::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69); + AttackRating = (GetSkill(EQ::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69); if (AttackRating < 10) AttackRating = 10; } @@ -1626,7 +1626,7 @@ int32 Bot::GenerateBaseHitPoints() { uint32 lm = GetClassLevelFactor(); int32 Post255; int32 NormalSTA = GetSTA(); - if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { float SoDPost255; if(((NormalSTA - 255) / 2) > 0) SoDPost255 = ((NormalSTA - 255) / 2); @@ -2106,8 +2106,8 @@ bool Bot::LoadPet() if (!database.botdb.LoadPetBuffs(GetBotID(), pet_buffs)) bot_owner->Message(Chat::Red, "%s for %s's pet", BotDatabase::fail::LoadPetBuffs(), GetCleanName()); - uint32 pet_items[EQEmu::invslot::EQUIPMENT_COUNT]; - memset(pet_items, 0, (sizeof(uint32) * EQEmu::invslot::EQUIPMENT_COUNT)); + uint32 pet_items[EQ::invslot::EQUIPMENT_COUNT]; + memset(pet_items, 0, (sizeof(uint32) * EQ::invslot::EQUIPMENT_COUNT)); if (!database.botdb.LoadPetItems(GetBotID(), pet_items)) bot_owner->Message(Chat::Red, "%s for %s's pet", BotDatabase::fail::LoadPetItems(), GetCleanName()); @@ -2134,11 +2134,11 @@ bool Bot::SavePet() char* pet_name = new char[64]; SpellBuff_Struct pet_buffs[PET_BUFF_COUNT]; - uint32 pet_items[EQEmu::invslot::EQUIPMENT_COUNT]; + uint32 pet_items[EQ::invslot::EQUIPMENT_COUNT]; memset(pet_name, 0, 64); memset(pet_buffs, 0, (sizeof(SpellBuff_Struct) * PET_BUFF_COUNT)); - memset(pet_items, 0, (sizeof(uint32) * EQEmu::invslot::EQUIPMENT_COUNT)); + memset(pet_items, 0, (sizeof(uint32) * EQ::invslot::EQUIPMENT_COUNT)); pet_inst->GetPetState(pet_buffs, pet_items, pet_name); @@ -2211,12 +2211,12 @@ bool Bot::Process() return false; } - if (mob_scan_close.Check()) { + if (mob_close_scan_timer.Check()) { LogAIScanClose( "is_moving [{}] bot [{}] timer [{}]", moving ? "true" : "false", GetCleanName(), - mob_scan_close.GetDuration() + mob_close_scan_timer.GetDuration() ); entity_list.ScanCloseClientMobs(close_mobs, this); @@ -2344,13 +2344,13 @@ void Bot::BotRangedAttack(Mob* other) { return; } - EQEmu::ItemInstance* rangedItem = GetBotItem(EQEmu::invslot::slotRange); - const EQEmu::ItemData* RangeWeapon = nullptr; + EQ::ItemInstance* rangedItem = GetBotItem(EQ::invslot::slotRange); + const EQ::ItemData* RangeWeapon = nullptr; if(rangedItem) RangeWeapon = rangedItem->GetItem(); - EQEmu::ItemInstance* ammoItem = GetBotItem(EQEmu::invslot::slotAmmo); - const EQEmu::ItemData* Ammo = nullptr; + EQ::ItemInstance* ammoItem = GetBotItem(EQ::invslot::slotAmmo); + const EQ::ItemData* Ammo = nullptr; if(ammoItem) Ammo = ammoItem->GetItem(); @@ -2361,7 +2361,7 @@ void Bot::BotRangedAttack(Mob* other) { if(!IsAttackAllowed(other) || IsCasting() || DivineAura() || IsStunned() || IsMezzed() || (GetAppearance() == eaDead)) return; - SendItemAnimation(other, Ammo, EQEmu::skills::SkillArchery); + SendItemAnimation(other, Ammo, EQ::skills::SkillArchery); //DoArcheryAttackDmg(GetTarget(), rangedItem, ammoItem); DoArcheryAttackDmg(other, rangedItem, ammoItem); // watch @@ -2406,12 +2406,12 @@ bool Bot::CheckBotDoubleAttack(bool tripleAttack) { //Check for bonuses that give you a double attack chance regardless of skill (ie Bestial Frenzy/Harmonious Attack AA) uint32 bonusGiveDA = (aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack); // If you don't have the double attack skill, return - if (!GetSkill(EQEmu::skills::SkillDoubleAttack) && !(GetClass() == BARD || GetClass() == BEASTLORD)) + if (!GetSkill(EQ::skills::SkillDoubleAttack) && !(GetClass() == BARD || GetClass() == BEASTLORD)) return false; // You start with no chance of double attacking float chance = 0.0f; - uint16 skill = GetSkill(EQEmu::skills::SkillDoubleAttack); + uint16 skill = GetSkill(EQ::skills::SkillDoubleAttack); int32 bonusDA = (aabonuses.DoubleAttackChance + spellbonuses.DoubleAttackChance + itembonuses.DoubleAttackChance); //Use skill calculations otherwise, if you only have AA applied GiveDoubleAttack chance then use that value as the base. if (skill) @@ -2436,28 +2436,28 @@ bool Bot::CheckBotDoubleAttack(bool tripleAttack) { return false; } -void Bot::ApplySpecialAttackMod(EQEmu::skills::SkillType skill, int32 &dmg, int32 &mindmg) { +void Bot::ApplySpecialAttackMod(EQ::skills::SkillType skill, int32 &dmg, int32 &mindmg) { int item_slot = -1; //1: Apply bonus from AC (BOOT/SHIELD/HANDS) est. 40AC=6dmg switch (skill) { - case EQEmu::skills::SkillFlyingKick: - case EQEmu::skills::SkillRoundKick: - case EQEmu::skills::SkillKick: - item_slot = EQEmu::invslot::slotFeet; + case EQ::skills::SkillFlyingKick: + case EQ::skills::SkillRoundKick: + case EQ::skills::SkillKick: + item_slot = EQ::invslot::slotFeet; break; - case EQEmu::skills::SkillBash: - item_slot = EQEmu::invslot::slotSecondary; + case EQ::skills::SkillBash: + item_slot = EQ::invslot::slotSecondary; break; - case EQEmu::skills::SkillDragonPunch: - case EQEmu::skills::SkillEagleStrike: - case EQEmu::skills::SkillTigerClaw: - item_slot = EQEmu::invslot::slotHands; + case EQ::skills::SkillDragonPunch: + case EQ::skills::SkillEagleStrike: + case EQ::skills::SkillTigerClaw: + item_slot = EQ::invslot::slotHands; break; } - if (item_slot >= EQEmu::invslot::EQUIPMENT_BEGIN){ - const EQEmu::ItemInstance* inst = GetBotItem(item_slot); - const EQEmu::ItemData* botweapon = nullptr; + if (item_slot >= EQ::invslot::EQUIPMENT_BEGIN){ + const EQ::ItemInstance* inst = GetBotItem(item_slot); + const EQ::ItemData* botweapon = nullptr; if(inst) botweapon = inst->GetItem(); @@ -2532,8 +2532,8 @@ void Bot::AI_Process() #define NOT_GUARDING (!GetGuardFlag()) #define HOLDING (GetHoldFlag()) #define NOT_HOLDING (!GetHoldFlag()) -#define PASSIVE (GetBotStance() == EQEmu::constants::stancePassive) -#define NOT_PASSIVE (GetBotStance() != EQEmu::constants::stancePassive) +#define PASSIVE (GetBotStance() == EQ::constants::stancePassive) +#define NOT_PASSIVE (GetBotStance() != EQ::constants::stancePassive) Client* bot_owner = (GetBotOwner() && GetBotOwner()->IsClient() ? GetBotOwner()->CastToClient() : nullptr); Group* bot_group = GetGroup(); @@ -3068,8 +3068,8 @@ void Bot::AI_Process() bool atCombatRange = false; - const auto* p_item = GetBotItem(EQEmu::invslot::slotPrimary); - const auto* s_item = GetBotItem(EQEmu::invslot::slotSecondary); + const auto* p_item = GetBotItem(EQ::invslot::slotPrimary); + const auto* s_item = GetBotItem(EQ::invslot::slotSecondary); bool behind_mob = false; bool backstab_weapon = false; @@ -3257,13 +3257,13 @@ void Bot::AI_Process() if (m_evade_timer.Check(false)) { // Attempt to evade - int timer_duration = (HideReuseTime - GetSkillReuseTime(EQEmu::skills::SkillHide)) * 1000; + int timer_duration = (HideReuseTime - GetSkillReuseTime(EQ::skills::SkillHide)) * 1000; if (timer_duration < 0) { timer_duration = 0; } m_evade_timer.Start(timer_duration); - if (zone->random.Int(0, 260) < (int)GetSkill(EQEmu::skills::SkillHide)) { + if (zone->random.Int(0, 260) < (int)GetSkill(EQ::skills::SkillHide)) { RogueEvade(tar); } @@ -3417,13 +3417,13 @@ void Bot::AI_Process() TEST_COMBATANTS(); if (attack_timer.Check()) { // Process primary weapon attacks - Attack(tar, EQEmu::invslot::slotPrimary); + Attack(tar, EQ::invslot::slotPrimary); TEST_COMBATANTS(); - TriggerDefensiveProcs(tar, EQEmu::invslot::slotPrimary, false); + TriggerDefensiveProcs(tar, EQ::invslot::slotPrimary, false); TEST_COMBATANTS(); - TryWeaponProc(p_item, tar, EQEmu::invslot::slotPrimary); + TryWeaponProc(p_item, tar, EQ::invslot::slotPrimary); // bool tripleSuccess = false; @@ -3431,19 +3431,19 @@ void Bot::AI_Process() if (CanThisClassDoubleAttack()) { if (CheckBotDoubleAttack()) { - Attack(tar, EQEmu::invslot::slotPrimary, true); + Attack(tar, EQ::invslot::slotPrimary, true); } TEST_COMBATANTS(); if (GetSpecialAbility(SPECATK_TRIPLE) && CheckBotDoubleAttack(true)) { // tripleSuccess = true; - Attack(tar, EQEmu::invslot::slotPrimary, true); + Attack(tar, EQ::invslot::slotPrimary, true); } TEST_COMBATANTS(); // quad attack, does this belong here?? if (GetSpecialAbility(SPECATK_QUAD) && CheckBotDoubleAttack(true)) { - Attack(tar, EQEmu::invslot::slotPrimary, true); + Attack(tar, EQ::invslot::slotPrimary, true); } } @@ -3455,10 +3455,10 @@ void Bot::AI_Process() if (zone->random.Int(0, 100) < flurrychance) { MessageString(Chat::NPCFlurry, YOU_FLURRY); - Attack(tar, EQEmu::invslot::slotPrimary, false); + Attack(tar, EQ::invslot::slotPrimary, false); TEST_COMBATANTS(); - Attack(tar, EQEmu::invslot::slotPrimary, false); + Attack(tar, EQ::invslot::slotPrimary, false); } } @@ -3469,7 +3469,7 @@ void Bot::AI_Process() if (p_item && p_item->GetItem()->IsType2HWeapon()) { if (zone->random.Int(0, 100) < ExtraAttackChanceBonus) { - Attack(tar, EQEmu::invslot::slotPrimary, false); + Attack(tar, EQ::invslot::slotPrimary, false); } } } @@ -3478,7 +3478,7 @@ void Bot::AI_Process() TEST_COMBATANTS(); if (attack_dw_timer.Check() && CanThisClassDualWield()) { // Process secondary weapon attacks - const EQEmu::ItemData* s_itemdata = nullptr; + const EQ::ItemData* s_itemdata = nullptr; // Can only dual wield without a weapon if you're a monk if (s_item || (GetClass() == MONK)) { @@ -3499,7 +3499,7 @@ void Bot::AI_Process() float DualWieldProbability = 0.0f; int32 Ambidexterity = (aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity); - DualWieldProbability = ((GetSkill(EQEmu::skills::SkillDualWield) + GetLevel() + Ambidexterity) / 400.0f); // 78.0 max + DualWieldProbability = ((GetSkill(EQ::skills::SkillDualWield) + GetLevel() + Ambidexterity) / 400.0f); // 78.0 max int32 DWBonus = (spellbonuses.DualWieldChance + itembonuses.DualWieldChance); DualWieldProbability += (DualWieldProbability * float(DWBonus) / 100.0f); @@ -3507,16 +3507,16 @@ void Bot::AI_Process() float random = zone->random.Real(0, 1); if (random < DualWieldProbability) { // Max 78% of DW - Attack(tar, EQEmu::invslot::slotSecondary); // Single attack with offhand + Attack(tar, EQ::invslot::slotSecondary); // Single attack with offhand TEST_COMBATANTS(); - TryWeaponProc(s_item, tar, EQEmu::invslot::slotSecondary); + TryWeaponProc(s_item, tar, EQ::invslot::slotSecondary); TEST_COMBATANTS(); if (CanThisClassDoubleAttack() && CheckBotDoubleAttack()) { if (tar->GetHP() > -10) { - Attack(tar, EQEmu::invslot::slotSecondary); // Single attack with offhand + Attack(tar, EQ::invslot::slotSecondary); // Single attack with offhand } } } @@ -3859,12 +3859,12 @@ void Bot::PetAIProcess() { if(!botPet->BehindMob(botPet->GetTarget(), botPet->GetX(), botPet->GetY()) && botPet->GetTarget()->IsEnraged()) return; - if (botPet->Attack(GetTarget(), EQEmu::invslot::slotPrimary)) // try the main hand + if (botPet->Attack(GetTarget(), EQ::invslot::slotPrimary)) // try the main hand if (botPet->GetTarget()) { // We're a pet so we re able to dual attack int32 RandRoll = zone->random.Int(0, 99); if (botPet->CanThisClassDoubleAttack() && (RandRoll < (botPet->GetLevel() + NPCDualAttackModifier))) { - if (botPet->Attack(botPet->GetTarget(), EQEmu::invslot::slotPrimary)) {} + if (botPet->Attack(botPet->GetTarget(), EQ::invslot::slotPrimary)) {} } } @@ -3899,14 +3899,14 @@ void Bot::PetAIProcess() { // Ok now, let's check pet's offhand. if (botPet->GetAttackDWTimer().Check() && botPet->GetOwnerID() && botPet->GetOwner() && ((botPet->GetOwner()->GetClass() == MAGICIAN) || (botPet->GetOwner()->GetClass() == NECROMANCER) || (botPet->GetOwner()->GetClass() == SHADOWKNIGHT) || (botPet->GetOwner()->GetClass() == BEASTLORD))) { if(botPet->GetOwner()->GetLevel() >= 24) { - float DualWieldProbability = ((botPet->GetSkill(EQEmu::skills::SkillDualWield) + botPet->GetLevel()) / 400.0f); + float DualWieldProbability = ((botPet->GetSkill(EQ::skills::SkillDualWield) + botPet->GetLevel()) / 400.0f); DualWieldProbability -= zone->random.Real(0, 1); if(DualWieldProbability < 0) { - botPet->Attack(botPet->GetTarget(), EQEmu::invslot::slotSecondary); + botPet->Attack(botPet->GetTarget(), EQ::invslot::slotSecondary); if (botPet->CanThisClassDoubleAttack()) { int32 RandRoll = zone->random.Int(0, 99); if (RandRoll < (botPet->GetLevel() + 20)) - botPet->Attack(botPet->GetTarget(), EQEmu::invslot::slotSecondary); + botPet->Attack(botPet->GetTarget(), EQ::invslot::slotSecondary); } } } @@ -4030,10 +4030,10 @@ bool Bot::Spawn(Client* botCharacterOwner) { // I re-enabled this until I can sort it out uint32 itemID = 0; uint8 materialFromSlot = 0xFF; - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; ++i) { + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; ++i) { itemID = GetBotItemBySlot(i); if(itemID != 0) { - materialFromSlot = EQEmu::InventoryProfile::CalcMaterialFromSlot(i); + materialFromSlot = EQ::InventoryProfile::CalcMaterialFromSlot(i); if(materialFromSlot != 0xFF) this->SendWearChange(materialFromSlot); } @@ -4059,7 +4059,7 @@ void Bot::RemoveBotItemBySlot(uint32 slotID, std::string *errorMessage) } // Retrieves all the inventory records from the database for this bot. -void Bot::GetBotItems(EQEmu::InventoryProfile &inv, std::string* errorMessage) +void Bot::GetBotItems(EQ::InventoryProfile &inv, std::string* errorMessage) { if(!GetBotID()) return; @@ -4111,18 +4111,18 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { ns->spawn.size = 0; ns->spawn.NPC = 0; // 0=player,1=npc,2=pc corpse,3=npc corpse UpdateActiveLight(); - ns->spawn.light = m_Light.Type[EQEmu::lightsource::LightActive]; + ns->spawn.light = m_Light.Type[EQ::lightsource::LightActive]; ns->spawn.helm = helmtexture; //(GetShowHelm() ? helmtexture : 0); //0xFF; ns->spawn.equip_chest2 = texture; //0xFF; ns->spawn.show_name = true; strcpy(ns->spawn.lastName, GetSurname().c_str()); strcpy(ns->spawn.title, GetTitle().c_str()); strcpy(ns->spawn.suffix, GetSuffix().c_str()); - const EQEmu::ItemData* item = nullptr; - const EQEmu::ItemInstance* inst = nullptr; + const EQ::ItemData* item = nullptr; + const EQ::ItemInstance* inst = nullptr; uint32 spawnedbotid = 0; spawnedbotid = this->GetBotID(); - for (int i = EQEmu::textures::textureBegin; i < EQEmu::textures::weaponPrimary; i++) { + for (int i = EQ::textures::textureBegin; i < EQ::textures::weaponPrimary; i++) { inst = GetBotItem(i); if (inst) { item = inst->GetItem(); @@ -4141,25 +4141,25 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { } } - inst = GetBotItem(EQEmu::invslot::slotPrimary); + inst = GetBotItem(EQ::invslot::slotPrimary); if(inst) { item = inst->GetItem(); if(item) { if(strlen(item->IDFile) > 2) ns->spawn.equipment.Primary.Material = atoi(&item->IDFile[2]); - ns->spawn.equipment_tint.Primary.Color = GetEquipmentColor(EQEmu::textures::weaponPrimary); + ns->spawn.equipment_tint.Primary.Color = GetEquipmentColor(EQ::textures::weaponPrimary); } } - inst = GetBotItem(EQEmu::invslot::slotSecondary); + inst = GetBotItem(EQ::invslot::slotSecondary); if(inst) { item = inst->GetItem(); if(item) { if(strlen(item->IDFile) > 2) ns->spawn.equipment.Secondary.Material = atoi(&item->IDFile[2]); - ns->spawn.equipment_tint.Secondary.Color = GetEquipmentColor(EQEmu::textures::weaponSecondary); + ns->spawn.equipment_tint.Secondary.Color = GetEquipmentColor(EQ::textures::weaponSecondary); } } } @@ -4396,8 +4396,8 @@ void Bot::SendBotArcheryWearChange(uint8 material_slot, uint32 material, uint32 } // Returns the item id that is in the bot inventory collection for the specified slot. -EQEmu::ItemInstance* Bot::GetBotItem(uint32 slotID) { - EQEmu::ItemInstance* item = m_inv.GetItem(slotID); +EQ::ItemInstance* Bot::GetBotItem(uint32 slotID) { + EQ::ItemInstance* item = m_inv.GetItem(slotID); if(item) return item; @@ -4409,9 +4409,9 @@ void Bot::BotAddEquipItem(int slot, uint32 id) { // this is being called before bot is assigned an entity id.. // ..causing packets to be sent out to zone with an id of '0' if(slot > 0 && id > 0) { - uint8 materialFromSlot = EQEmu::InventoryProfile::CalcMaterialFromSlot(slot); + uint8 materialFromSlot = EQ::InventoryProfile::CalcMaterialFromSlot(slot); - if (materialFromSlot != EQEmu::textures::materialInvalid) { + if (materialFromSlot != EQ::textures::materialInvalid) { equipment[slot] = id; // npc has more than just material slots. Valid material should mean valid inventory index if (GetID()) // temp hack fix SendWearChange(materialFromSlot); @@ -4427,13 +4427,13 @@ void Bot::BotAddEquipItem(int slot, uint32 id) { // Erases the specified item from bot the NPC equipment array and from the bot inventory collection. void Bot::BotRemoveEquipItem(int16 slot) { - uint8 material_slot = EQEmu::InventoryProfile::CalcMaterialFromSlot(slot); + uint8 material_slot = EQ::InventoryProfile::CalcMaterialFromSlot(slot); - if (material_slot != EQEmu::textures::materialInvalid) { + if (material_slot != EQ::textures::materialInvalid) { equipment[slot] = 0; // npc has more than just material slots. Valid material should mean valid inventory index SendWearChange(material_slot); - if (material_slot == EQEmu::textures::armorChest) - SendWearChange(EQEmu::textures::armorArms); + if (material_slot == EQ::textures::armorChest) + SendWearChange(EQ::textures::armorArms); } UpdateEquipmentLight(); @@ -4441,7 +4441,7 @@ void Bot::BotRemoveEquipItem(int16 slot) SendAppearancePacket(AT_Light, GetActiveLightType()); } -void Bot::BotTradeSwapItem(Client* client, int16 lootSlot, const EQEmu::ItemInstance* inst, const EQEmu::ItemInstance* inst_swap, uint32 equipableSlots, std::string* errorMessage, bool swap) { +void Bot::BotTradeSwapItem(Client* client, int16 lootSlot, const EQ::ItemInstance* inst, const EQ::ItemInstance* inst_swap, uint32 equipableSlots, std::string* errorMessage, bool swap) { if(!errorMessage->empty()) return; @@ -4464,7 +4464,7 @@ void Bot::BotTradeSwapItem(Client* client, int16 lootSlot, const EQEmu::ItemInst } } -void Bot::BotTradeAddItem(uint32 id, const EQEmu::ItemInstance* inst, int16 charges, uint32 equipableSlots, uint16 lootSlot, std::string* errorMessage, bool addToDb) +void Bot::BotTradeAddItem(uint32 id, const EQ::ItemInstance* inst, int16 charges, uint32 equipableSlots, uint16 lootSlot, std::string* errorMessage, bool addToDb) { if(addToDb) { if (!database.botdb.SaveItemBySlot(this, lootSlot, inst)) { @@ -4537,12 +4537,12 @@ void Bot::FinishTrade(Client* client, BotTradeType tradeType) if (tradeType == BotTradeClientNormal) { // Items being traded are found in the normal trade window used to trade between a Client and a Client or NPC // Items in this mode are found in slot ids 3000 thru 3003 - thought bots used the full 8-slot window..? - PerformTradeWithClient(EQEmu::invslot::TRADE_BEGIN, EQEmu::invslot::TRADE_END, client); // {3000..3007} + PerformTradeWithClient(EQ::invslot::TRADE_BEGIN, EQ::invslot::TRADE_END, client); // {3000..3007} } else if (tradeType == BotTradeClientNoDropNoTrade) { // Items being traded are found on the Client's cursor slot, slot id 30. This item can be either a single item or it can be a bag. // If it is a bag, then we have to search for items in slots 331 thru 340 - PerformTradeWithClient(EQEmu::invslot::slotCursor, EQEmu::invslot::slotCursor, client); + PerformTradeWithClient(EQ::invslot::slotCursor, EQ::invslot::slotCursor, client); // TODO: Add logic here to test if the item in SLOT_CURSOR is a container type, if it is then we need to call the following: // PerformTradeWithClient(331, 340, client); @@ -4552,7 +4552,7 @@ void Bot::FinishTrade(Client* client, BotTradeType tradeType) // Perfoms the actual trade action with a client bot owner void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* client) { - using namespace EQEmu; + using namespace EQ; struct ClientTrade { const ItemInstance* tradeItemInstance; @@ -4692,7 +4692,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli } // find equipment slots - const bool can_dual_wield = (GetSkill(EQEmu::skills::SkillDualWield) > 0); + const bool can_dual_wield = (GetSkill(EQ::skills::SkillDualWield) > 0); bool melee_2h_weapon = false; bool melee_secondary = false; @@ -4904,7 +4904,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli this->BotAddEquipItem(trade_iterator.toBotSlot, (trade_iterator.tradeItemInstance ? trade_iterator.tradeItemInstance->GetID() : 0)); trade_iterator.tradeItemInstance = nullptr; // actual deletion occurs in client delete below - client->DeleteItemInInventory(trade_iterator.fromClientSlot, 0, (trade_iterator.fromClientSlot == EQEmu::invslot::slotCursor)); + client->DeleteItemInInventory(trade_iterator.fromClientSlot, 0, (trade_iterator.fromClientSlot == EQ::invslot::slotCursor)); // database currently has unattuned item saved in inventory..it will be attuned on next bot load // this prevents unattuned item returns in the mean time (TODO: re-work process) @@ -4934,7 +4934,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli CalcBotStats(client->GetBotOption(Client::booStatsUpdate)); } -bool Bot::Death(Mob *killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill) { +bool Bot::Death(Mob *killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill) { if(!NPC::Death(killerMob, damage, spell_id, attack_skill)) return false; @@ -5022,7 +5022,7 @@ bool Bot::Death(Mob *killerMob, int32 damage, uint16 spell_id, EQEmu::skills::Sk return true; } -void Bot::Damage(Mob *from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) { +void Bot::Damage(Mob *from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) { if(spell_id == 0) spell_id = SPELL_UNKNOWN; @@ -5108,14 +5108,14 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b } FaceTarget(GetTarget()); - EQEmu::ItemInstance* weapon = nullptr; - if (Hand == EQEmu::invslot::slotPrimary) { - weapon = GetBotItem(EQEmu::invslot::slotPrimary); + EQ::ItemInstance* weapon = nullptr; + if (Hand == EQ::invslot::slotPrimary) { + weapon = GetBotItem(EQ::invslot::slotPrimary); OffHandAtk(false); } - if (Hand == EQEmu::invslot::slotSecondary) { - weapon = GetBotItem(EQEmu::invslot::slotSecondary); + if (Hand == EQ::invslot::slotSecondary) { + weapon = GetBotItem(EQ::invslot::slotSecondary); OffHandAtk(true); } @@ -5164,18 +5164,18 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b // This is not recommended for normal usage, as the damage bonus represents a non-trivial component of the DPS output // of weapons wielded by higher-level melee characters (especially for two-handed weapons). int ucDamageBonus = 0; - if (Hand == EQEmu::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass()) { + if (Hand == EQ::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass()) { // Damage bonuses apply only to hits from the main hand (Hand == MainPrimary) by characters level 28 and above // who belong to a melee class. If we're here, then all of these conditions apply. - ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr); + ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQ::ItemData*) nullptr); my_hit.min_damage = ucDamageBonus; hate += ucDamageBonus; } #endif //Live AA - Sinister Strikes *Adds weapon damage bonus to offhand weapon. - if (Hand == EQEmu::invslot::slotSecondary) { + if (Hand == EQ::invslot::slotSecondary) { if (aabonuses.SecondaryDmgInc || itembonuses.SecondaryDmgInc || spellbonuses.SecondaryDmgInc){ - ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr); + ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQ::ItemData*) nullptr); my_hit.min_damage = ucDamageBonus; hate += ucDamageBonus; } @@ -5581,18 +5581,18 @@ int32 Bot::GetBotFocusEffect(focusType bottype, uint16 spell_id) { //Check if item focus effect exists for the client. if (itembonuses.FocusEffects[bottype]) { - const EQEmu::ItemData* TempItem = nullptr; - const EQEmu::ItemData* UsedItem = nullptr; - const EQEmu::ItemInstance* TempInst = nullptr; + const EQ::ItemData* TempItem = nullptr; + const EQ::ItemData* UsedItem = nullptr; + const EQ::ItemInstance* TempInst = nullptr; uint16 UsedFocusID = 0; int32 Total = 0; int32 focus_max = 0; int32 focus_max_real = 0; //item focus // are focus effects the same as bonus? (slotAmmo-excluded) - for (int x = EQEmu::invslot::EQUIPMENT_BEGIN; x <= EQEmu::invslot::EQUIPMENT_END; x++) { + for (int x = EQ::invslot::EQUIPMENT_BEGIN; x <= EQ::invslot::EQUIPMENT_END; x++) { TempItem = nullptr; - EQEmu::ItemInstance* ins = GetBotItem(x); + EQ::ItemInstance* ins = GetBotItem(x); if (!ins) continue; @@ -5615,11 +5615,11 @@ int32 Bot::GetBotFocusEffect(focusType bottype, uint16 spell_id) { } } - for (int y = EQEmu::invaug::SOCKET_BEGIN; y <= EQEmu::invaug::SOCKET_END; ++y) { - EQEmu::ItemInstance *aug = nullptr; + for (int y = EQ::invaug::SOCKET_BEGIN; y <= EQ::invaug::SOCKET_END; ++y) { + EQ::ItemInstance *aug = nullptr; aug = ins->GetAugment(y); if(aug) { - const EQEmu::ItemData* TempItemAug = aug->GetItem(); + const EQ::ItemData* TempItemAug = aug->GetItem(); if (TempItemAug && TempItemAug->Focus.Effect > 0 && TempItemAug->Focus.Effect != SPELL_UNKNOWN) { if(rand_effectiveness) { focus_max = CalcBotFocusEffect(bottype, TempItemAug->Focus.Effect, spell_id, true); @@ -6070,13 +6070,13 @@ float Bot::GetProcChances(float ProcBonus, uint16 hand) { float ProcChance = 0.0f; uint32 weapon_speed = 0; switch (hand) { - case EQEmu::invslot::slotPrimary: + case EQ::invslot::slotPrimary: weapon_speed = attack_timer.GetDuration(); break; - case EQEmu::invslot::slotSecondary: + case EQ::invslot::slotSecondary: weapon_speed = attack_dw_timer.GetDuration(); break; - case EQEmu::invslot::slotRange: + case EQ::invslot::slotRange: weapon_speed = ranged_timer.GetDuration(); break; } @@ -6100,9 +6100,9 @@ float Bot::GetProcChances(float ProcBonus, uint16 hand) { int Bot::GetHandToHandDamage(void) { if (RuleB(Combat, UseRevampHandToHand)) { // everyone uses this in the revamp! - int skill = GetSkill(EQEmu::skills::SkillHandtoHand); + int skill = GetSkill(EQ::skills::SkillHandtoHand); int epic = 0; - if (CastToNPC()->GetEquippedItemFromTextureSlot(EQEmu::textures::armorHands) == 10652 && GetLevel() > 46) + if (CastToNPC()->GetEquippedItemFromTextureSlot(EQ::textures::armorHands) == 10652 && GetLevel() > 46) epic = 280; if (epic > skill) skill = epic; @@ -6124,7 +6124,7 @@ int Bot::GetHandToHandDamage(void) { 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40 10, 11, 11, 11, 11, 11, 11, 12, 12}; // 41-49 if (GetClass() == MONK) { - if (CastToNPC()->GetEquippedItemFromTextureSlot(EQEmu::textures::armorHands) == 10652 && GetLevel() > 50) + if (CastToNPC()->GetEquippedItemFromTextureSlot(EQ::textures::armorHands) == 10652 && GetLevel() > 50) return 9; if (level > 62) return 15; @@ -6166,11 +6166,11 @@ void Bot::DoRiposte(Mob* defender) { if (!defender) return; - defender->Attack(this, EQEmu::invslot::slotPrimary, true); + defender->Attack(this, EQ::invslot::slotPrimary, true); int32 DoubleRipChance = (defender->GetAABonuses().GiveDoubleRiposte[0] + defender->GetSpellBonuses().GiveDoubleRiposte[0] + defender->GetItemBonuses().GiveDoubleRiposte[0]); if(DoubleRipChance && (DoubleRipChance >= zone->random.Int(0, 100))) { LogCombat("Preforming a double riposte ([{}] percent chance)", DoubleRipChance); - defender->Attack(this, EQEmu::invslot::slotPrimary, true); + defender->Attack(this, EQ::invslot::slotPrimary, true); } DoubleRipChance = defender->GetAABonuses().GiveDoubleRiposte[1]; @@ -6182,14 +6182,14 @@ void Bot::DoRiposte(Mob* defender) { } } -int Bot::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) +int Bot::GetBaseSkillDamage(EQ::skills::SkillType skill, Mob *target) { - int base = EQEmu::skills::GetBaseDamage(skill); + int base = EQ::skills::GetBaseDamage(skill); auto skill_level = GetSkill(skill); switch (skill) { - case EQEmu::skills::SkillDragonPunch: - case EQEmu::skills::SkillEagleStrike: - case EQEmu::skills::SkillTigerClaw: + case EQ::skills::SkillDragonPunch: + case EQ::skills::SkillEagleStrike: + case EQ::skills::SkillTigerClaw: if (skill_level >= 25) base++; if (skill_level >= 75) @@ -6199,8 +6199,8 @@ int Bot::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) if (skill_level >= 175) base++; return base; - case EQEmu::skills::SkillFrenzy: - if (GetBotItem(EQEmu::invslot::slotPrimary)) { + case EQ::skills::SkillFrenzy: + if (GetBotItem(EQ::invslot::slotPrimary)) { if (GetLevel() > 15) base += GetLevel() - 15; if (base > 23) @@ -6213,44 +6213,44 @@ int Bot::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) base++; } return base; - case EQEmu::skills::SkillFlyingKick: { + case EQ::skills::SkillFlyingKick: { float skill_bonus = skill_level / 9.0f; float ac_bonus = 0.0f; - auto inst = GetBotItem(EQEmu::invslot::slotFeet); + auto inst = GetBotItem(EQ::invslot::slotFeet); if (inst) ac_bonus = inst->GetItemArmorClass(true) / 25.0f; if (ac_bonus > skill_bonus) ac_bonus = skill_bonus; return static_cast(ac_bonus + skill_bonus); } - case EQEmu::skills::SkillKick: { + case EQ::skills::SkillKick: { float skill_bonus = skill_level / 10.0f; float ac_bonus = 0.0f; - auto inst = GetBotItem(EQEmu::invslot::slotFeet); + auto inst = GetBotItem(EQ::invslot::slotFeet); if (inst) ac_bonus = inst->GetItemArmorClass(true) / 25.0f; if (ac_bonus > skill_bonus) ac_bonus = skill_bonus; return static_cast(ac_bonus + skill_bonus); } - case EQEmu::skills::SkillBash: { + case EQ::skills::SkillBash: { float skill_bonus = skill_level / 10.0f; float ac_bonus = 0.0f; - const EQEmu::ItemInstance *inst = nullptr; + const EQ::ItemInstance *inst = nullptr; if (HasShieldEquiped()) - inst = GetBotItem(EQEmu::invslot::slotSecondary); + inst = GetBotItem(EQ::invslot::slotSecondary); else if (HasTwoHanderEquipped()) - inst = GetBotItem(EQEmu::invslot::slotPrimary); + inst = GetBotItem(EQ::invslot::slotPrimary); if (inst) ac_bonus = inst->GetItemArmorClass(true) / 25.0f; if (ac_bonus > skill_bonus) ac_bonus = skill_bonus; return static_cast(ac_bonus + skill_bonus); } - case EQEmu::skills::SkillBackstab: { + case EQ::skills::SkillBackstab: { float skill_bonus = static_cast(skill_level) * 0.02f; - auto inst = GetBotItem(EQEmu::invslot::slotPrimary); - if (inst && inst->GetItem() && inst->GetItem()->ItemType == EQEmu::item::ItemType1HPiercing) { + auto inst = GetBotItem(EQ::invslot::slotPrimary); + if (inst && inst->GetItem() && inst->GetItem()->ItemType == EQ::item::ItemType1HPiercing) { base = inst->GetItemBackstabDamage(true); if (!inst->GetItemBackstabDamage()) base += inst->GetItemWeaponDamage(true); @@ -6268,19 +6268,19 @@ int Bot::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) } } -void Bot::DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int32 max_damage, int32 min_damage, int32 hate_override, int ReuseTime, bool HitChance) { +void Bot::DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int32 max_damage, int32 min_damage, int32 hate_override, int ReuseTime, bool HitChance) { int32 hate = max_damage; if(hate_override > -1) hate = hate_override; - if (skill == EQEmu::skills::SkillBash) { - const EQEmu::ItemInstance* inst = GetBotItem(EQEmu::invslot::slotSecondary); - const EQEmu::ItemData* botweapon = nullptr; + if (skill == EQ::skills::SkillBash) { + const EQ::ItemInstance* inst = GetBotItem(EQ::invslot::slotSecondary); + const EQ::ItemData* botweapon = nullptr; if(inst) botweapon = inst->GetItem(); if(botweapon) { - if (botweapon->ItemType == EQEmu::item::ItemTypeShield) + if (botweapon->ItemType == EQ::item::ItemTypeShield) hate += botweapon->AC; hate = (hate * (100 + GetFuriousBash(botweapon->Focus.Effect)) / 100); @@ -6295,10 +6295,10 @@ void Bot::DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int32 my_hit.skill = skill; my_hit.offense = offense(my_hit.skill); my_hit.tohit = GetTotalToHit(my_hit.skill, 0); - my_hit.hand = EQEmu::invslot::slotPrimary; + my_hit.hand = EQ::invslot::slotPrimary; - if (skill == EQEmu::skills::SkillThrowing || skill == EQEmu::skills::SkillArchery) - my_hit.hand = EQEmu::invslot::slotRange; + if (skill == EQ::skills::SkillThrowing || skill == EQ::skills::SkillArchery) + my_hit.hand = EQ::invslot::slotRange; DoAttack(who, my_hit); @@ -6335,12 +6335,12 @@ void Bot::TryBackstab(Mob *other, int ReuseTime) { bool bIsBehind = false; bool bCanFrontalBS = false; - const EQEmu::ItemInstance* inst = GetBotItem(EQEmu::invslot::slotPrimary); - const EQEmu::ItemData* botpiercer = nullptr; + const EQ::ItemInstance* inst = GetBotItem(EQ::invslot::slotPrimary); + const EQ::ItemData* botpiercer = nullptr; if(inst) botpiercer = inst->GetItem(); - if (!botpiercer || (botpiercer->ItemType != EQEmu::item::ItemType1HPiercing)) { + if (!botpiercer || (botpiercer->ItemType != EQ::item::ItemType1HPiercing)) { BotGroupSay(this, "I can't backstab with this weapon!"); return; } @@ -6362,7 +6362,7 @@ void Bot::TryBackstab(Mob *other, int ReuseTime) { } else { RogueBackstab(other); if (level > 54) { - float DoubleAttackProbability = ((GetSkill(EQEmu::skills::SkillDoubleAttack) + GetLevel()) / 500.0f); + float DoubleAttackProbability = ((GetSkill(EQ::skills::SkillDoubleAttack) + GetLevel()) / 500.0f); if(zone->random.Real(0, 1) < DoubleAttackProbability) { if(other->GetHP() > 0) RogueBackstab(other,false,ReuseTime); @@ -6378,7 +6378,7 @@ void Bot::TryBackstab(Mob *other, int ReuseTime) { m_specialattacks = eSpecialAttacks::None; } else - Attack(other, EQEmu::invslot::slotPrimary); + Attack(other, EQ::invslot::slotPrimary); } void Bot::RogueBackstab(Mob *other, bool min_damage, int ReuseTime) @@ -6386,30 +6386,30 @@ void Bot::RogueBackstab(Mob *other, bool min_damage, int ReuseTime) if (!other) return; - EQEmu::ItemInstance *botweaponInst = GetBotItem(EQEmu::invslot::slotPrimary); + EQ::ItemInstance *botweaponInst = GetBotItem(EQ::invslot::slotPrimary); if (botweaponInst) { if (!GetWeaponDamage(other, botweaponInst)) return; - } else if (!GetWeaponDamage(other, (const EQEmu::ItemData *)nullptr)) { + } else if (!GetWeaponDamage(other, (const EQ::ItemData *)nullptr)) { return; } uint32 hate = 0; - int base_damage = GetBaseSkillDamage(EQEmu::skills::SkillBackstab, other); + int base_damage = GetBaseSkillDamage(EQ::skills::SkillBackstab, other); hate = base_damage; - DoSpecialAttackDamage(other, EQEmu::skills::SkillBackstab, base_damage, 0, hate, ReuseTime); + DoSpecialAttackDamage(other, EQ::skills::SkillBackstab, base_damage, 0, hate, ReuseTime); DoAnim(anim1HPiercing); } void Bot::RogueAssassinate(Mob* other) { - EQEmu::ItemInstance* botweaponInst = GetBotItem(EQEmu::invslot::slotPrimary); + EQ::ItemInstance* botweaponInst = GetBotItem(EQ::invslot::slotPrimary); if(botweaponInst) { if(GetWeaponDamage(other, botweaponInst)) - other->Damage(this, 32000, SPELL_UNKNOWN, EQEmu::skills::SkillBackstab); + other->Damage(this, 32000, SPELL_UNKNOWN, EQ::skills::SkillBackstab); else - other->Damage(this, -5, SPELL_UNKNOWN, EQEmu::skills::SkillBackstab); + other->Damage(this, -5, SPELL_UNKNOWN, EQ::skills::SkillBackstab); } DoAnim(anim1HPiercing); @@ -6428,7 +6428,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { // Bots without this skill shouldn't be 'checking' on this timer..let's just disable it and avoid the extra IsAttackAllowed() checks // Note: this is done here instead of NPC::ctor() because taunt skill can be acquired during level ups (the timer is re-enabled in CalcBotStats()) - if (!GetSkill(EQEmu::skills::SkillTaunt)) { + if (!GetSkill(EQ::skills::SkillTaunt)) { taunt_timer.Disable(); return; @@ -6480,18 +6480,18 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { if (ma_time) { switch (GetClass()) { case MONK: { - int reuse = (MonkSpecialAttack(target, EQEmu::skills::SkillTigerClaw) - 1); + int reuse = (MonkSpecialAttack(target, EQ::skills::SkillTigerClaw) - 1); // Live AA - Technique of Master Wu int wuchance = itembonuses.DoubleSpecialAttack + spellbonuses.DoubleSpecialAttack + aabonuses.DoubleSpecialAttack; if (wuchance) { const int MonkSPA[5] = { - EQEmu::skills::SkillFlyingKick, - EQEmu::skills::SkillDragonPunch, - EQEmu::skills::SkillEagleStrike, - EQEmu::skills::SkillTigerClaw, - EQEmu::skills::SkillRoundKick + EQ::skills::SkillFlyingKick, + EQ::skills::SkillDragonPunch, + EQ::skills::SkillEagleStrike, + EQ::skills::SkillTigerClaw, + EQ::skills::SkillRoundKick }; int extra = 0; // always 1/4 of the double attack chance, 25% at rank 5 (100/4) @@ -6519,7 +6519,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { auto classic = RuleB(Combat, ClassicMasterWu); while (extra) { - MonkSpecialAttack(GetTarget(), (classic ? MonkSPA[zone->random.Int(0, 4)] : EQEmu::skills::SkillTigerClaw)); + MonkSpecialAttack(GetTarget(), (classic ? MonkSPA[zone->random.Int(0, 4)] : EQ::skills::SkillTigerClaw)); --extra; } } @@ -6547,70 +6547,70 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { case WARRIOR: if(level >= RuleI(Combat, NPCBashKickLevel)){ bool canBash = false; - if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQEmu::invslot::slotSecondary) && m_inv.GetItem(EQEmu::invslot::slotSecondary)->GetItem()->ItemType == EQEmu::item::ItemTypeShield) || (m_inv.GetItem(EQEmu::invslot::slotPrimary) && m_inv.GetItem(EQEmu::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1)) + if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQ::invslot::slotSecondary) && m_inv.GetItem(EQ::invslot::slotSecondary)->GetItem()->ItemType == EQ::item::ItemTypeShield) || (m_inv.GetItem(EQ::invslot::slotPrimary) && m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1)) canBash = true; if(!canBash || zone->random.Int(0, 100) > 25) - skill_to_use = EQEmu::skills::SkillKick; + skill_to_use = EQ::skills::SkillKick; else - skill_to_use = EQEmu::skills::SkillBash; + skill_to_use = EQ::skills::SkillBash; } case RANGER: case BEASTLORD: - skill_to_use = EQEmu::skills::SkillKick; + skill_to_use = EQ::skills::SkillKick; break; case BERSERKER: - skill_to_use = EQEmu::skills::SkillFrenzy; + skill_to_use = EQ::skills::SkillFrenzy; break; case CLERIC: case SHADOWKNIGHT: case PALADIN: if(level >= RuleI(Combat, NPCBashKickLevel)){ - if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQEmu::invslot::slotSecondary) && m_inv.GetItem(EQEmu::invslot::slotSecondary)->GetItem()->ItemType == EQEmu::item::ItemTypeShield) || (m_inv.GetItem(EQEmu::invslot::slotPrimary) && m_inv.GetItem(EQEmu::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1)) - skill_to_use = EQEmu::skills::SkillBash; + if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQ::invslot::slotSecondary) && m_inv.GetItem(EQ::invslot::slotSecondary)->GetItem()->ItemType == EQ::item::ItemTypeShield) || (m_inv.GetItem(EQ::invslot::slotPrimary) && m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1)) + skill_to_use = EQ::skills::SkillBash; } break; case MONK: if (GetLevel() >= 30) { - skill_to_use = EQEmu::skills::SkillFlyingKick; + skill_to_use = EQ::skills::SkillFlyingKick; } else if (GetLevel() >= 25) { - skill_to_use = EQEmu::skills::SkillDragonPunch; + skill_to_use = EQ::skills::SkillDragonPunch; } else if (GetLevel() >= 20) { - skill_to_use = EQEmu::skills::SkillEagleStrike; + skill_to_use = EQ::skills::SkillEagleStrike; } else if (GetLevel() >= 5) { - skill_to_use = EQEmu::skills::SkillRoundKick; + skill_to_use = EQ::skills::SkillRoundKick; } else { - skill_to_use = EQEmu::skills::SkillKick; + skill_to_use = EQ::skills::SkillKick; } break; case ROGUE: - skill_to_use = EQEmu::skills::SkillBackstab; + skill_to_use = EQ::skills::SkillBackstab; break; } if(skill_to_use == -1) return; - int dmg = GetBaseSkillDamage(static_cast(skill_to_use), GetTarget()); + int dmg = GetBaseSkillDamage(static_cast(skill_to_use), GetTarget()); - if (skill_to_use == EQEmu::skills::SkillBash) { + if (skill_to_use == EQ::skills::SkillBash) { if (target != this) { DoAnim(animTailRake); - if (GetWeaponDamage(target, GetBotItem(EQEmu::invslot::slotSecondary)) <= 0 && GetWeaponDamage(target, GetBotItem(EQEmu::invslot::slotShoulders)) <= 0) + if (GetWeaponDamage(target, GetBotItem(EQ::invslot::slotSecondary)) <= 0 && GetWeaponDamage(target, GetBotItem(EQ::invslot::slotShoulders)) <= 0) dmg = DMG_INVULNERABLE; reuse = (BashReuseTime * 1000); - DoSpecialAttackDamage(target, EQEmu::skills::SkillBash, dmg, 0, -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillBash, dmg, 0, -1, reuse); did_attack = true; } } - if (skill_to_use == EQEmu::skills::SkillFrenzy) { + if (skill_to_use == EQ::skills::SkillFrenzy) { int AtkRounds = 3; DoAnim(anim2HSlashing); @@ -6618,30 +6618,30 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { did_attack = true; while(AtkRounds > 0) { if (GetTarget() && (AtkRounds == 1 || zone->random.Int(0, 100) < 75)) { - DoSpecialAttackDamage(GetTarget(), EQEmu::skills::SkillFrenzy, dmg, 0, dmg, reuse, true); + DoSpecialAttackDamage(GetTarget(), EQ::skills::SkillFrenzy, dmg, 0, dmg, reuse, true); } AtkRounds--; } } - if (skill_to_use == EQEmu::skills::SkillKick) { + if (skill_to_use == EQ::skills::SkillKick) { if(target != this) { DoAnim(animKick); - if (GetWeaponDamage(target, GetBotItem(EQEmu::invslot::slotFeet)) <= 0) + if (GetWeaponDamage(target, GetBotItem(EQ::invslot::slotFeet)) <= 0) dmg = DMG_INVULNERABLE; reuse = (KickReuseTime * 1000); - DoSpecialAttackDamage(target, EQEmu::skills::SkillKick, dmg, 0, -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillKick, dmg, 0, -1, reuse); did_attack = true; } } if ( - skill_to_use == EQEmu::skills::SkillFlyingKick || - skill_to_use == EQEmu::skills::SkillDragonPunch || - skill_to_use == EQEmu::skills::SkillEagleStrike || - skill_to_use == EQEmu::skills::SkillRoundKick + skill_to_use == EQ::skills::SkillFlyingKick || + skill_to_use == EQ::skills::SkillDragonPunch || + skill_to_use == EQ::skills::SkillEagleStrike || + skill_to_use == EQ::skills::SkillRoundKick ) { reuse = (MonkSpecialAttack(target, skill_to_use) - 1); @@ -6650,11 +6650,11 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { if (wuchance) { const int MonkSPA[5] = { - EQEmu::skills::SkillFlyingKick, - EQEmu::skills::SkillDragonPunch, - EQEmu::skills::SkillEagleStrike, - EQEmu::skills::SkillTigerClaw, - EQEmu::skills::SkillRoundKick + EQ::skills::SkillFlyingKick, + EQ::skills::SkillDragonPunch, + EQ::skills::SkillEagleStrike, + EQ::skills::SkillTigerClaw, + EQ::skills::SkillRoundKick }; int extra = 0; // always 1/4 of the double attack chance, 25% at rank 5 (100/4) @@ -6691,7 +6691,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { did_attack = true; } - if (skill_to_use == EQEmu::skills::SkillBackstab) { + if (skill_to_use == EQ::skills::SkillBackstab) { reuse = (BackstabReuseTime * 1000); did_attack = true; if (IsRiposte) @@ -6799,9 +6799,9 @@ bool Bot::IsBotAttackAllowed(Mob* attacker, Mob* target, bool& hasRuleDefined) { void Bot::EquipBot(std::string* errorMessage) { GetBotItems(m_inv, errorMessage); - const EQEmu::ItemInstance* inst = nullptr; - const EQEmu::ItemData* item = nullptr; - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; ++i) { + const EQ::ItemInstance* inst = nullptr; + const EQ::ItemData* item = nullptr; + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; ++i) { inst = GetBotItem(i); if(inst) { item = inst->GetItem(); @@ -6927,23 +6927,23 @@ void Bot::SetAttackTimer() { float haste_mod = (GetHaste() * 0.01f); attack_timer.SetAtTrigger(4000, true); Timer* TimerToUse = nullptr; - const EQEmu::ItemData* PrimaryWeapon = nullptr; - for (int i = EQEmu::invslot::slotRange; i <= EQEmu::invslot::slotSecondary; i++) { - if (i == EQEmu::invslot::slotPrimary) + const EQ::ItemData* PrimaryWeapon = nullptr; + for (int i = EQ::invslot::slotRange; i <= EQ::invslot::slotSecondary; i++) { + if (i == EQ::invslot::slotPrimary) TimerToUse = &attack_timer; - else if (i == EQEmu::invslot::slotRange) + else if (i == EQ::invslot::slotRange) TimerToUse = &ranged_timer; - else if (i == EQEmu::invslot::slotSecondary) + else if (i == EQ::invslot::slotSecondary) TimerToUse = &attack_dw_timer; else continue; - const EQEmu::ItemData* ItemToUse = nullptr; - EQEmu::ItemInstance* ci = GetBotItem(i); + const EQ::ItemData* ItemToUse = nullptr; + EQ::ItemInstance* ci = GetBotItem(i); if (ci) ItemToUse = ci->GetItem(); - if (i == EQEmu::invslot::slotSecondary) { + if (i == EQ::invslot::slotSecondary) { if (PrimaryWeapon != nullptr) { if (PrimaryWeapon->IsClassCommon() && PrimaryWeapon->IsType2HWeapon()) { attack_dw_timer.Disable(); @@ -6951,14 +6951,14 @@ void Bot::SetAttackTimer() { } } - if (!GetSkill(EQEmu::skills::SkillDualWield)) { + if (!GetSkill(EQ::skills::SkillDualWield)) { attack_dw_timer.Disable(); continue; } } if (ItemToUse != nullptr) { - if (!ItemToUse->IsClassCommon() || ItemToUse->Damage == 0 || ItemToUse->Delay == 0 || ((ItemToUse->ItemType > EQEmu::item::ItemTypeLargeThrowing) && (ItemToUse->ItemType != EQEmu::item::ItemTypeMartial) && (ItemToUse->ItemType != EQEmu::item::ItemType2HPiercing))) + if (!ItemToUse->IsClassCommon() || ItemToUse->Damage == 0 || ItemToUse->Delay == 0 || ((ItemToUse->ItemType > EQ::item::ItemTypeLargeThrowing) && (ItemToUse->ItemType != EQ::item::ItemTypeMartial) && (ItemToUse->ItemType != EQ::item::ItemType2HPiercing))) ItemToUse = nullptr; } @@ -6974,7 +6974,7 @@ void Bot::SetAttackTimer() { speed = (RuleB(Spells, Jun182014HundredHandsRevamp) ? static_cast(((delay / haste_mod) + ((hhe / 1000.0f) * (delay / haste_mod))) * 100) : static_cast(((delay / haste_mod) + ((hhe / 100.0f) * delay)) * 100)); TimerToUse->SetAtTrigger(std::max(RuleI(Combat, MinHastedDelay), speed), true, true); - if (i == EQEmu::invslot::slotPrimary) + if (i == EQ::invslot::slotPrimary) PrimaryWeapon = ItemToUse; } } @@ -7337,7 +7337,7 @@ void Bot::DoBuffTic(const Buffs_Struct &buff, int slot, Mob* caster) { Mob::DoBuffTic(buff, slot, caster); } -bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlot slot, int32 cast_time, int32 mana_cost, +bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, int16 *resist_adjust, uint32 aa_id) { bool Result = false; if(zone && !zone->IsSpellBlocked(spell_id, glm::vec3(GetPosition()))) { @@ -7377,7 +7377,7 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlo return false; } - if(slot < EQEmu::spells::CastingSlot::MaxGems && !CheckFizzle(spell_id)) { + if(slot < EQ::spells::CastingSlot::MaxGems && !CheckFizzle(spell_id)) { int fizzle_msg = IsBardSong(spell_id) ? MISS_NOTE : SPELL_FIZZLE; InterruptSpell(fizzle_msg, 0x121, spell_id); @@ -7391,7 +7391,7 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlo LogSpells("Casting a new spell/song while singing a song. Killing old song [{}]", bardsong); bardsong = 0; bardsong_target_id = 0; - bardsong_slot = EQEmu::spells::CastingSlot::Gem1; + bardsong_slot = EQ::spells::CastingSlot::Gem1; bardsong_timer.Disable(); } @@ -7521,7 +7521,7 @@ bool Bot::IsImmuneToSpell(uint16 spell_id, Mob *caster) { return Result; } -bool Bot::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_center, CastAction_type &CastAction, EQEmu::spells::CastingSlot slot) { +bool Bot::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_center, CastAction_type &CastAction, EQ::spells::CastingSlot slot) { bool Result = false; SpellTargetType targetType = spells[spell_id].targettype; if(targetType == ST_GroupClientAndPet) { @@ -7534,7 +7534,7 @@ bool Bot::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce return Result; } -bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlot slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 aa_id) { +bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 aa_id) { bool Result = false; if(GetClass() == BARD) cast_time = 0; @@ -7558,7 +7558,7 @@ int32 Bot::GenerateBaseManaPoints() { switch(GetCasterClass()) { case 'I': WisInt = INT; - if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { if(WisInt > 100) { ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100); if(WisInt > 201) @@ -7593,7 +7593,7 @@ int32 Bot::GenerateBaseManaPoints() { break; case 'W': WisInt = WIS; - if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { if(WisInt > 100) { ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100); if(WisInt > 201) @@ -7638,7 +7638,7 @@ void Bot::GenerateSpecialAttacks() { SetSpecialAbility(SPECATK_TRIPLE, 1); } -bool Bot::DoFinishedSpellAETarget(uint16 spell_id, Mob* spellTarget, EQEmu::spells::CastingSlot slot, bool& stopLogic) { +bool Bot::DoFinishedSpellAETarget(uint16 spell_id, Mob* spellTarget, EQ::spells::CastingSlot slot, bool& stopLogic) { if(GetClass() == BARD) { if(!ApplyNextBardPulse(bardsong, this, bardsong_slot)) InterruptSpell(SONG_ENDS_ABRUPTLY, 0x121, bardsong); @@ -7648,7 +7648,7 @@ bool Bot::DoFinishedSpellAETarget(uint16 spell_id, Mob* spellTarget, EQEmu::spel return true; } -bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQEmu::spells::CastingSlot slot, bool& stopLogic) { +bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spells::CastingSlot slot, bool& stopLogic) { if(spellTarget) { if(IsGrouped() && (spellTarget->IsBot() || spellTarget->IsClient()) && RuleB(Bots, GroupBuffing)) { bool noGroupSpell = false; @@ -7660,7 +7660,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQEmu:: bool spelltypeequal = ((spelltype == 2) || (spelltype == 16) || (spelltype == 32)); bool spelltypetargetequal = ((spelltype == 8) && (spells[thespell].targettype == ST_Self)); bool spelltypeclassequal = ((spelltype == 1024) && (GetClass() == SHAMAN)); - bool slotequal = (slot == EQEmu::spells::CastingSlot::Item); + bool slotequal = (slot == EQ::spells::CastingSlot::Item); if(spellequal || slotequal) { if((spelltypeequal || spelltypetargetequal) || spelltypeclassequal || slotequal) { if(((spells[thespell].effectid[0] == 0) && (spells[thespell].base[0] < 0)) && @@ -7699,7 +7699,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQEmu:: return true; } -bool Bot::DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQEmu::spells::CastingSlot slot, bool& stopLogic) { +bool Bot::DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQ::spells::CastingSlot slot, bool& stopLogic) { bool isMainGroupMGB = false; if(isMainGroupMGB && (GetClass() != BARD)) { BotGroupSay(this, "MGB %s", spells[spell_id].name); @@ -7777,7 +7777,7 @@ int32 Bot::GetMaxStat() { int32 base = 0; if (level < 61) base = 255; - else if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoF) + else if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoF) base = (255 + 5 * (level - 60)); else if (level < 71) base = (255 + 5 * (level - 60)); @@ -8170,7 +8170,7 @@ int32 Bot::CalcManaRegen() { if (IsSitting()) { BuffFadeBySitModifier(); if(botclass != WARRIOR && botclass != MONK && botclass != ROGUE && botclass != BERSERKER) { - regen = ((((GetSkill(EQEmu::skills::SkillMeditate) / 10) + (level - (level / 4))) / 4) + 4); + regen = ((((GetSkill(EQ::skills::SkillMeditate) / 10) + (level - (level / 4))) / 4) + 4); regen += (spellbonuses.ManaRegen + itembonuses.ManaRegen); } else regen = (2 + spellbonuses.ManaRegen + itembonuses.ManaRegen); @@ -8271,7 +8271,7 @@ int32 Bot::CalcBaseEndurance() { int32 ConvertedStats = 0; int32 sta_end = 0; int Stats = 0; - if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) { int HeroicStats = 0; Stats = ((GetSTR() + GetSTA() + GetDEX() + GetAGI()) / 4); HeroicStats = ((GetHeroicSTR() + GetHeroicSTA() + GetHeroicDEX() + GetHeroicAGI()) / 4); @@ -8605,6 +8605,8 @@ void Bot::ProcessBotGroupInvite(Client* c, std::string botName) { g->SaveGroupLeaderAA(); database.SetGroupID(c->GetName(), g->GetID(), c->CharacterID()); database.SetGroupID(invitedBot->GetCleanName(), g->GetID(), invitedBot->GetBotID()); + } else { + delete g; } } else { AddBotToGroup(invitedBot, c->GetGroup()); @@ -8687,10 +8689,10 @@ void Bot::ProcessBotInspectionRequest(Bot* inspectedBot, Client* client) { insr->TargetID = inspectedBot->GetNPCTypeID(); insr->playerid = inspectedBot->GetID(); - const EQEmu::ItemData* item = nullptr; - const EQEmu::ItemInstance* inst = nullptr; + const EQ::ItemData* item = nullptr; + const EQ::ItemInstance* inst = nullptr; - for (int16 L = EQEmu::invslot::EQUIPMENT_BEGIN; L <= EQEmu::invslot::EQUIPMENT_END; L++) { + for (int16 L = EQ::invslot::EQUIPMENT_BEGIN; L <= EQ::invslot::EQUIPMENT_END; L++) { inst = inspectedBot->GetBotItem(L); if(inst) { @@ -8718,10 +8720,10 @@ void Bot::ProcessBotInspectionRequest(Bot* inspectedBot, Client* client) { void Bot::CalcItemBonuses(StatBonuses* newbon) { - const EQEmu::ItemData* itemtmp = nullptr; + const EQ::ItemData* itemtmp = nullptr; - for (int i = EQEmu::invslot::BONUS_BEGIN; i <= EQEmu::invslot::BONUS_STAT_END; ++i) { - const EQEmu::ItemInstance* item = GetBotItem(i); + for (int i = EQ::invslot::BONUS_BEGIN; i <= EQ::invslot::BONUS_STAT_END; ++i) { + const EQ::ItemInstance* item = GetBotItem(i); if(item) { AddItemBonuses(item, newbon); } @@ -8738,7 +8740,7 @@ void Bot::CalcItemBonuses(StatBonuses* newbon) newbon->EnduranceRegen = CalcEnduranceRegenCap(); } -void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, bool isAug, bool isTribute, int rec_override) { +void Bot::AddItemBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug, bool isTribute, int rec_override) { if (!inst || !inst->IsClassCommon()) { return; @@ -8749,11 +8751,11 @@ void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, b return; } - const EQEmu::ItemData *item = inst->GetItem(); + const EQ::ItemData *item = inst->GetItem(); if(!isTribute && !inst->IsEquipable(GetBaseRace(),GetClass())) { - if (item->ItemType != EQEmu::item::ItemTypeFood && item->ItemType != EQEmu::item::ItemTypeDrink) + if (item->ItemType != EQ::item::ItemTypeFood && item->ItemType != EQ::item::ItemTypeDrink) return; } @@ -8960,17 +8962,17 @@ void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, b else newbon->DSMitigation += item->DSMitigation; } - if (item->Worn.Effect > 0 && item->Worn.Type == EQEmu::item::ItemEffectWorn) {// latent effects + if (item->Worn.Effect > 0 && item->Worn.Type == EQ::item::ItemEffectWorn) {// latent effects ApplySpellsBonuses(item->Worn.Effect, item->Worn.Level, newbon, 0, item->Worn.Type); } - if (item->Focus.Effect>0 && (item->Focus.Type == EQEmu::item::ItemEffectFocus)) { // focus effects + if (item->Focus.Effect>0 && (item->Focus.Type == EQ::item::ItemEffectFocus)) { // focus effects ApplySpellsBonuses(item->Focus.Effect, item->Focus.Level, newbon, 0); } switch(item->BardType) { - case EQEmu::item::ItemTypeAllInstrumentTypes: // (e.g. Singing Short Sword) + case EQ::item::ItemTypeAllInstrumentTypes: // (e.g. Singing Short Sword) { if(item->BardValue > newbon->singingMod) newbon->singingMod = item->BardValue; @@ -8984,31 +8986,31 @@ void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, b newbon->windMod = item->BardValue; break; } - case EQEmu::item::ItemTypeSinging: + case EQ::item::ItemTypeSinging: { if(item->BardValue > newbon->singingMod) newbon->singingMod = item->BardValue; break; } - case EQEmu::item::ItemTypeWindInstrument: + case EQ::item::ItemTypeWindInstrument: { if(item->BardValue > newbon->windMod) newbon->windMod = item->BardValue; break; } - case EQEmu::item::ItemTypeStringedInstrument: + case EQ::item::ItemTypeStringedInstrument: { if(item->BardValue > newbon->stringedMod) newbon->stringedMod = item->BardValue; break; } - case EQEmu::item::ItemTypeBrassInstrument: + case EQ::item::ItemTypeBrassInstrument: { if(item->BardValue > newbon->brassMod) newbon->brassMod = item->BardValue; break; } - case EQEmu::item::ItemTypePercussionInstrument: + case EQ::item::ItemTypePercussionInstrument: { if(item->BardValue > newbon->percussionMod) newbon->percussionMod = item->BardValue; @@ -9016,7 +9018,7 @@ void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, b } } - if (item->SkillModValue != 0 && item->SkillModType <= EQEmu::skills::HIGHEST_SKILL){ + if (item->SkillModValue != 0 && item->SkillModType <= EQ::skills::HIGHEST_SKILL){ if ((item->SkillModValue > 0 && newbon->skillmod[item->SkillModType] < item->SkillModValue) || (item->SkillModValue < 0 && newbon->skillmod[item->SkillModType] > item->SkillModValue)) { @@ -9024,7 +9026,7 @@ void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, b } } - if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= EQEmu::skills::HIGHEST_SKILL) { + if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= EQ::skills::HIGHEST_SKILL) { if((newbon->SkillDamageAmount[item->ExtraDmgSkill] + item->ExtraDmgAmt) > RuleI(Character, ItemExtraDmgCap)) newbon->SkillDamageAmount[item->ExtraDmgSkill] = RuleI(Character, ItemExtraDmgCap); else @@ -9033,7 +9035,7 @@ void Bot::AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, b if (!isAug) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) AddItemBonuses(inst->GetAugment(i),newbon,true, false, rec_level); } @@ -9079,8 +9081,8 @@ void Bot::CalcBotStats(bool showtext) { if(GetBotOwner()->GetLevel() != GetLevel()) SetLevel(GetBotOwner()->GetLevel()); - for (int sindex = 0; sindex <= EQEmu::skills::HIGHEST_SKILL; ++sindex) { - skills[sindex] = database.GetSkillCap(GetClass(), (EQEmu::skills::SkillType)sindex, GetLevel()); + for (int sindex = 0; sindex <= EQ::skills::HIGHEST_SKILL; ++sindex) { + skills[sindex] = content_db.GetSkillCap(GetClass(), (EQ::skills::SkillType)sindex, GetLevel()); } taunt_timer.Start(1000); @@ -9099,7 +9101,7 @@ void Bot::CalcBotStats(bool showtext) { // Test Code if(GetClass() == BARD) GetBotOwner()->Message(Chat::Yellow, "Bard Skills-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i", - GetSkill(EQEmu::skills::SkillBrassInstruments), GetSkill(EQEmu::skills::SkillPercussionInstruments), GetSkill(EQEmu::skills::SkillSinging), GetSkill(EQEmu::skills::SkillStringedInstruments), GetSkill(EQEmu::skills::SkillWindInstruments)); + GetSkill(EQ::skills::SkillBrassInstruments), GetSkill(EQ::skills::SkillPercussionInstruments), GetSkill(EQ::skills::SkillSinging), GetSkill(EQ::skills::SkillStringedInstruments), GetSkill(EQ::skills::SkillWindInstruments)); } //if(this->Save()) @@ -9118,17 +9120,17 @@ void Bot::CalcBotStats(bool showtext) { // Test Code if(GetClass() == BARD) { GetBotOwner()->Message(Chat::Yellow, "Bard Skills-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i", - GetSkill(EQEmu::skills::SkillBrassInstruments) + GetBrassMod(), - GetSkill(EQEmu::skills::SkillPercussionInstruments) + GetPercMod(), - GetSkill(EQEmu::skills::SkillSinging) + GetSingMod(), - GetSkill(EQEmu::skills::SkillStringedInstruments) + GetStringMod(), - GetSkill(EQEmu::skills::SkillWindInstruments) + GetWindMod()); + GetSkill(EQ::skills::SkillBrassInstruments) + GetBrassMod(), + GetSkill(EQ::skills::SkillPercussionInstruments) + GetPercMod(), + GetSkill(EQ::skills::SkillSinging) + GetSingMod(), + GetSkill(EQ::skills::SkillStringedInstruments) + GetStringMod(), + GetSkill(EQ::skills::SkillWindInstruments) + GetWindMod()); GetBotOwner()->Message(Chat::Yellow, "Bard Skill Mods-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i", GetBrassMod(), GetPercMod(), GetSingMod(), GetStringMod(), GetWindMod()); } } } -bool Bot::CheckLoreConflict(const EQEmu::ItemData* item) { +bool Bot::CheckLoreConflict(const EQ::ItemData* item) { if (!item || !(item->LoreFlag)) return false; @@ -9195,16 +9197,16 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl Group *g = caster->GetGroup(); float hpRatioToHeal = 25.0f; switch(caster->GetBotStance()) { - case EQEmu::constants::stanceReactive: - case EQEmu::constants::stanceBalanced: + case EQ::constants::stanceReactive: + case EQ::constants::stanceBalanced: hpRatioToHeal = 50.0f; break; - case EQEmu::constants::stanceBurn: - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurn: + case EQ::constants::stanceBurnAE: hpRatioToHeal = 20.0f; break; - case EQEmu::constants::stanceAggressive: - case EQEmu::constants::stanceEfficient: + case EQ::constants::stanceAggressive: + case EQ::constants::stanceEfficient: default: hpRatioToHeal = 25.0f; break; @@ -9601,12 +9603,12 @@ uint8 Bot::GetNumberNeedingHealedInGroup(uint8 hpr, bool includePets) { int Bot::GetRawACNoShield(int &shield_ac) { int ac = itembonuses.AC + spellbonuses.AC; shield_ac = 0; - EQEmu::ItemInstance* inst = GetBotItem(EQEmu::invslot::slotSecondary); + EQ::ItemInstance* inst = GetBotItem(EQ::invslot::slotSecondary); if(inst) { - if (inst->GetItem()->ItemType == EQEmu::item::ItemTypeShield) { + if (inst->GetItem()->ItemType == EQ::item::ItemTypeShield) { ac -= inst->GetItem()->AC; shield_ac = inst->GetItem()->AC; - for (uint8 i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (uint8 i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if(inst->GetAugment(i)) { ac -= inst->GetAugment(i)->GetItem()->AC; shield_ac += inst->GetAugment(i)->GetItem()->AC; @@ -9618,10 +9620,10 @@ int Bot::GetRawACNoShield(int &shield_ac) { } uint32 Bot::CalcCurrentWeight() { - const EQEmu::ItemData* TempItem = nullptr; - EQEmu::ItemInstance* inst = nullptr; + const EQ::ItemData* TempItem = nullptr; + EQ::ItemInstance* inst = nullptr; uint32 Total = 0; - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; ++i) { + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; ++i) { inst = GetBotItem(i); if(inst) { TempItem = inst->GetItem(); @@ -9794,11 +9796,11 @@ bool Bot::HasOrMayGetAggro() { } void Bot::SetDefaultBotStance() { - EQEmu::constants::StanceType defaultStance = EQEmu::constants::stanceBalanced; + EQ::constants::StanceType defaultStance = EQ::constants::stanceBalanced; if (GetClass() == WARRIOR) - defaultStance = EQEmu::constants::stanceAggressive; + defaultStance = EQ::constants::stanceAggressive; - _baseBotStance = EQEmu::constants::stancePassive; + _baseBotStance = EQ::constants::stancePassive; _botStance = defaultStance; } @@ -9847,7 +9849,7 @@ bool Bot::UseDiscipline(uint32 spell_id, uint32 target) { if(IsCasting()) InterruptSpell(); - CastSpell(spell_id, target, EQEmu::spells::CastingSlot::Discipline); + CastSpell(spell_id, target, EQ::spells::CastingSlot::Discipline); return true; } @@ -10011,9 +10013,9 @@ bool Bot::DyeArmor(int16 slot_id, uint32 rgb, bool all_flag, bool save_flag) if (slot_id != INVALID_INDEX) return false; - for (uint8 i = EQEmu::textures::textureBegin; i < EQEmu::textures::weaponPrimary; ++i) { - uint8 inv_slot = EQEmu::InventoryProfile::CalcSlotFromMaterial(i); - EQEmu::ItemInstance* inst = m_inv.GetItem(inv_slot); + for (uint8 i = EQ::textures::textureBegin; i < EQ::textures::weaponPrimary; ++i) { + uint8 inv_slot = EQ::InventoryProfile::CalcSlotFromMaterial(i); + EQ::ItemInstance* inst = m_inv.GetItem(inv_slot); if (!inst) continue; @@ -10022,11 +10024,11 @@ bool Bot::DyeArmor(int16 slot_id, uint32 rgb, bool all_flag, bool save_flag) } } else { - uint8 mat_slot = EQEmu::InventoryProfile::CalcMaterialFromSlot(slot_id); - if (mat_slot == EQEmu::textures::materialInvalid || mat_slot >= EQEmu::textures::weaponPrimary) + uint8 mat_slot = EQ::InventoryProfile::CalcMaterialFromSlot(slot_id); + if (mat_slot == EQ::textures::materialInvalid || mat_slot >= EQ::textures::weaponPrimary) return false; - EQEmu::ItemInstance* inst = m_inv.GetItem(slot_id); + EQ::ItemInstance* inst = m_inv.GetItem(slot_id); if (!inst) return false; @@ -10061,8 +10063,8 @@ std::string Bot::CreateSayLink(Client* c, const char* message, const char* name) uint32 saylink_id = database.LoadSaylinkID(escaped_string); safe_delete_array(escaped_string); - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemData); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); linker.SetProxyItemID(SAYLINK_ITEM_ID); linker.SetProxyAugment1ID(saylink_id); linker.SetProxyText(name); @@ -10087,6 +10089,6 @@ void Bot::StopMoving(float new_heading) Mob::StopMoving(new_heading); } -uint8 Bot::spell_casting_chances[SPELL_TYPE_COUNT][PLAYER_CLASS_COUNT][EQEmu::constants::STANCE_TYPE_COUNT][cntHSND] = { 0 }; +uint8 Bot::spell_casting_chances[SPELL_TYPE_COUNT][PLAYER_CLASS_COUNT][EQ::constants::STANCE_TYPE_COUNT][cntHSND] = { 0 }; #endif diff --git a/zone/bot.h b/zone/bot.h index b456fd77f..caa556cf9 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -29,6 +29,7 @@ #include "groups.h" #include "corpse.h" #include "zonedb.h" +#include "zone_store.h" #include "string_ids.h" #include "../common/misc_functions.h" #include "../common/global_define.h" @@ -144,9 +145,9 @@ public: Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double totalPlayTime, uint32 lastZoneId, NPCType *npcTypeData); //abstract virtual function implementations requird by base abstract class - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill); - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill); + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr); virtual bool HasRaid() { return (GetRaid() ? true : false); } virtual bool HasGroup() { return (GetGroup() ? true : false); } @@ -180,25 +181,25 @@ public: virtual int GetHandToHandDamage(void); virtual bool TryFinishingBlow(Mob *defender, int &damage); virtual void DoRiposte(Mob* defender); - inline virtual int32 GetATK() const { return ATK + itembonuses.ATK + spellbonuses.ATK + ((GetSTR() + GetSkill(EQEmu::skills::SkillOffense)) * 9 / 10); } + inline virtual int32 GetATK() const { return ATK + itembonuses.ATK + spellbonuses.ATK + ((GetSTR() + GetSkill(EQ::skills::SkillOffense)) * 9 / 10); } inline virtual int32 GetATKBonus() const { return itembonuses.ATK + spellbonuses.ATK; } uint32 GetTotalATK(); uint32 GetATKRating(); uint16 GetPrimarySkillValue(); - uint16 MaxSkill(EQEmu::skills::SkillType skillid, uint16 class_, uint16 level) const; - inline uint16 MaxSkill(EQEmu::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } - virtual int GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target = nullptr); - virtual void DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int32 max_damage, int32 min_damage = 1, int32 hate_override = -1, int ReuseTime = 10, bool HitChance = false); + uint16 MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const; + inline uint16 MaxSkill(EQ::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } + virtual int GetBaseSkillDamage(EQ::skills::SkillType skill, Mob *target = nullptr); + virtual void DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int32 max_damage, int32 min_damage = 1, int32 hate_override = -1, int ReuseTime = 10, bool HitChance = false); virtual void TryBackstab(Mob *other,int ReuseTime = 10); virtual void RogueBackstab(Mob* other, bool min_damage = false, int ReuseTime = 10); virtual void RogueAssassinate(Mob* other); virtual void DoClassAttacks(Mob *target, bool IsRiposte=false); - virtual void ApplySpecialAttackMod(EQEmu::skills::SkillType skill, int32 &dmg, int32 &mindmg); + virtual void ApplySpecialAttackMod(EQ::skills::SkillType skill, int32 &dmg, int32 &mindmg); bool CanDoSpecialAttack(Mob *other); virtual int32 CheckAggroAmount(uint16 spellid); virtual void CalcBonuses(); void CalcItemBonuses(StatBonuses* newbon); - void AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0); + void AddItemBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0); int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat); virtual void MakePet(uint16 spell_id, const char* pettype, const char *petname = nullptr); virtual FACTION_VALUE GetReverseFactionCon(Mob* iOther); @@ -212,9 +213,9 @@ public: virtual void SetAttackTimer(); uint32 GetClassHPFactor(); virtual int32 CalcMaxHP(); - bool DoFinishedSpellAETarget(uint16 spell_id, Mob* spellTarget, EQEmu::spells::CastingSlot slot, bool &stopLogic); - bool DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQEmu::spells::CastingSlot slot, bool &stopLogic); - bool DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQEmu::spells::CastingSlot slot, bool &stopLogic); + bool DoFinishedSpellAETarget(uint16 spell_id, Mob* spellTarget, EQ::spells::CastingSlot slot, bool &stopLogic); + bool DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spells::CastingSlot slot, bool &stopLogic); + bool DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQ::spells::CastingSlot slot, bool &stopLogic); void SendBotArcheryWearChange(uint8 material_slot, uint32 material, uint32 color); void Camp(bool databaseSave = true); virtual void AddToHateList(Mob* other, uint32 hate = 0, int32 damage = 0, bool iYellForHelp = true, bool bFrenzy = false, bool iBuffTic = false, bool pet_command = false); @@ -320,7 +321,7 @@ public: void SetStopMeleeLevel(uint8 level); void SetGuardMode(); void SetHoldMode(); - + // Mob AI Virtual Override Methods virtual void AI_Process(); virtual void AI_Stop(); @@ -336,22 +337,22 @@ public: virtual float GetAOERange(uint16 spell_id); virtual bool SpellEffect(Mob* caster, uint16 spell_id, float partial = 100); virtual void DoBuffTic(const Buffs_Struct &buff, int slot, Mob* caster = nullptr); - virtual bool CastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlot slot = EQEmu::spells::CastingSlot::Item, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, + virtual bool CastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot = EQ::spells::CastingSlot::Item, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, int16 *resist_adjust = nullptr, uint32 aa_id = 0); virtual bool SpellOnTarget(uint16 spell_id, Mob* spelltar); virtual bool IsImmuneToSpell(uint16 spell_id, Mob *caster); - virtual bool DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_center, CastAction_type &CastAction, EQEmu::spells::CastingSlot slot); - virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlot slot = EQEmu::spells::CastingSlot::Item, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, uint32 aa_id = 0); + virtual bool DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_center, CastAction_type &CastAction, EQ::spells::CastingSlot slot); + virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot = EQ::spells::CastingSlot::Item, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, uint32 aa_id = 0); // Bot Equipment & Inventory Class Methods - void BotTradeSwapItem(Client* client, int16 lootSlot, const EQEmu::ItemInstance* inst, const EQEmu::ItemInstance* inst_swap, uint32 equipableSlots, std::string* errorMessage, bool swap = true); - void BotTradeAddItem(uint32 id, const EQEmu::ItemInstance* inst, int16 charges, uint32 equipableSlots, uint16 lootSlot, std::string* errorMessage, bool addToDb = true); + void BotTradeSwapItem(Client* client, int16 lootSlot, const EQ::ItemInstance* inst, const EQ::ItemInstance* inst_swap, uint32 equipableSlots, std::string* errorMessage, bool swap = true); + void BotTradeAddItem(uint32 id, const EQ::ItemInstance* inst, int16 charges, uint32 equipableSlots, uint16 lootSlot, std::string* errorMessage, bool addToDb = true); void EquipBot(std::string* errorMessage); - bool CheckLoreConflict(const EQEmu::ItemData* item); - virtual void UpdateEquipmentLight() { m_Light.Type[EQEmu::lightsource::LightEquipment] = m_inv.FindBrightestLightType(); m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); } - const EQEmu::InventoryProfile& GetBotInv() const { return m_inv; } + bool CheckLoreConflict(const EQ::ItemData* item); + virtual void UpdateEquipmentLight() { m_Light.Type[EQ::lightsource::LightEquipment] = m_inv.FindBrightestLightType(); m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } + const EQ::InventoryProfile& GetBotInv() const { return m_inv; } - // Static Class Methods + // Static Class Methods //static void DestroyBotRaidObjects(Client* client); // Can be removed after bot raids are dumped static Bot* LoadBot(uint32 botID); static uint32 SpawnedBotCount(uint32 botOwnerCharacterID); @@ -405,7 +406,7 @@ public: static BotSpell GetDebuffBotSpell(Bot* botCaster, Mob* target); static BotSpell GetBestBotSpellForCure(Bot* botCaster, Mob* target); static BotSpell GetBestBotSpellForResistDebuff(Bot* botCaster, Mob* target); - + static NPCType *CreateDefaultNPCTypeStructForBot(std::string botName, std::string botLastName, uint8 botLevel, uint16 botRace, uint8 botClass, uint8 gender); // Static Bot Group Methods @@ -419,7 +420,7 @@ public: uint32 GetBotSpellID() { return npc_spells_id; } Mob* GetBotOwner() { return this->_botOwner; } uint32 GetBotArcheryRange(); - EQEmu::ItemInstance* GetBotItem(uint32 slotID); + EQ::ItemInstance* GetBotItem(uint32 slotID); virtual bool GetSpawnStatus() { return _spawnStatus; } uint8 GetPetChooserID() { return _petChooserID; } bool IsPetChooser() { return _petChooser; } @@ -428,7 +429,7 @@ public: virtual bool IsBot() const { return true; } bool GetRangerAutoWeaponSelect() { return _rangerAutoWeaponSelect; } BotRoleType GetBotRole() { return _botRole; } - EQEmu::constants::StanceType GetBotStance() { return _botStance; } + EQ::constants::StanceType GetBotStance() { return _botStance; } uint8 GetChanceToCastBySpellType(uint32 spellType); bool IsGroupHealer() { return m_CastingRoles.GroupHealer; } @@ -451,7 +452,7 @@ public: bool IsBotNonSpellFighter() { return IsNonSpellFighterClass(GetClass()); } bool CanHeal(); int GetRawACNoShield(int &shield_ac); - + // new heal rotation code bool CreateHealRotation(uint32 cycle_duration_ms = 5000, bool fast_heals = false, bool adaptive_targeting = false, bool casting_override = false); bool DestroyHealRotation(); @@ -542,11 +543,11 @@ public: // void SetBotOwnerCharacterID(uint32 botOwnerCharacterID) { _botOwnerCharacterID = botOwnerCharacterID; } void SetRangerAutoWeaponSelect(bool enable) { GetClass() == RANGER ? _rangerAutoWeaponSelect = enable : _rangerAutoWeaponSelect = false; } void SetBotRole(BotRoleType botRole) { _botRole = botRole; } - void SetBotStance(EQEmu::constants::StanceType botStance) { - if (botStance >= EQEmu::constants::stancePassive && botStance <= EQEmu::constants::stanceBurnAE) + void SetBotStance(EQ::constants::StanceType botStance) { + if (botStance >= EQ::constants::stancePassive && botStance <= EQ::constants::stanceBurnAE) _botStance = botStance; else - _botStance = EQEmu::constants::stancePassive; + _botStance = EQ::constants::stancePassive; } void SetSpellRecastTimer(int timer_index, int32 recast_delay); void SetDisciplineRecastTimer(int timer_index, int32 recast_delay); @@ -597,7 +598,7 @@ public: int32 GetBasePR() { return _basePR; } int32 GetBaseDR() { return _baseDR; } int32 GetBaseCorrup() { return _baseCorrup; } - + protected: virtual void PetAIProcess(); virtual void BotMeditate(bool isSitting); @@ -631,7 +632,7 @@ private: bool _petChooser; uint8 _petChooserID; bool berserk; - EQEmu::InventoryProfile m_inv; + EQ::InventoryProfile m_inv; double _lastTotalPlayTime; time_t _startTotalPlayTime; Mob* _previousTarget; @@ -644,8 +645,8 @@ private: uint32 _lastZoneId; bool _rangerAutoWeaponSelect; BotRoleType _botRole; - EQEmu::constants::StanceType _botStance; - EQEmu::constants::StanceType _baseBotStance; + EQ::constants::StanceType _botStance; + EQ::constants::StanceType _baseBotStance; unsigned int RestRegenHP; unsigned int RestRegenMana; unsigned int RestRegenEndurance; @@ -656,7 +657,7 @@ private: int32 max_end; int32 end_regen; uint32 timers[MaxTimer]; - + Timer m_evade_timer; // can be moved to pTimers at some point Timer m_alt_combat_hate_timer; Timer m_auto_defend_timer; @@ -717,7 +718,7 @@ private: void SetReturningFlag(bool flag = true) { m_returning_flag = flag; } // Private "Inventory" Methods - void GetBotItems(EQEmu::InventoryProfile &inv, std::string* errorMessage); + void GetBotItems(EQ::InventoryProfile &inv, std::string* errorMessage); void BotAddEquipItem(int slot, uint32 id); uint32 GetBotItemBySlot(uint32 slotID); @@ -727,7 +728,7 @@ private: bool DeletePet(); public: - static uint8 spell_casting_chances[SPELL_TYPE_COUNT][PLAYER_CLASS_COUNT][EQEmu::constants::STANCE_TYPE_COUNT][cntHSND]; + static uint8 spell_casting_chances[SPELL_TYPE_COUNT][PLAYER_CLASS_COUNT][EQ::constants::STANCE_TYPE_COUNT][cntHSND]; }; #endif // BOTS diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index 3b539d052..10b869d9c 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -24,7 +24,7 @@ 2. Add the function in this file. 3. In the bot_command_init function you must add a call to bot_command_add for your function. - + Notes: If you want an alias for your bot command, add an entry to the `bot_command_settings` table in your database. The access level you set with bot_command_add is the default setting if the bot command isn't @@ -60,6 +60,7 @@ #include "bot_command.h" #include "zonedb.h" +#include "zone_store.h" #include "guild_mgr.h" #include "map.h" #include "doors.h" @@ -75,7 +76,7 @@ extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *taskmanager; +extern TaskManager *task_manager; void CatchSignal(int sig_num); @@ -120,18 +121,18 @@ public: static void Load() { bot_command_spells.clear(); bcst_levels_map bot_levels_map; - + for (int i = BCEnum::SpellTypeFirst; i <= BCEnum::SpellTypeLast; ++i) { bot_command_spells[static_cast(i)]; bot_levels_map[static_cast(i)]; } - + for (int spell_id = 2; spell_id < SPDAT_RECORDS; ++spell_id) { if (spells[spell_id].player_1[0] == '\0') continue; if (spells[spell_id].targettype != ST_Target && spells[spell_id].CastRestriction != 0) // watch continue; - + auto target_type = BCEnum::TT_None; switch (spells[spell_id].targettype) { case ST_GroupTeleport: @@ -196,7 +197,7 @@ public: } if (target_type == BCEnum::TT_None) continue; - + uint8 class_levels[16] = { 0 }; bool player_spell = false; for (int class_type = WARRIOR; class_type <= BERSERKER; ++class_type) { @@ -209,7 +210,7 @@ public: } if (!player_spell) continue; - + STBaseEntry* entry_prototype = nullptr; while (true) { switch (spells[spell_id].effectid[EFFECTIDTOINDEX(1)]) { @@ -310,7 +311,7 @@ public: } if (entry_prototype) break; - + switch (spells[spell_id].effectid[EFFECTIDTOINDEX(2)]) { case SE_Succor: entry_prototype = new STEscapeEntry; @@ -334,15 +335,15 @@ public: } if (entry_prototype) break; - + while (spells[spell_id].typedescnum == 27) { if (!spells[spell_id].goodEffect) break; - if (spells[spell_id].skill != EQEmu::skills::SkillOffense && spells[spell_id].skill != EQEmu::skills::SkillDefense) + if (spells[spell_id].skill != EQ::skills::SkillOffense && spells[spell_id].skill != EQ::skills::SkillDefense) break; entry_prototype = new STStanceEntry(); - if (spells[spell_id].skill == EQEmu::skills::SkillOffense) + if (spells[spell_id].skill == EQ::skills::SkillOffense) entry_prototype->SafeCastToStance()->stance_type = BCEnum::StT_Aggressive; else entry_prototype->SafeCastToStance()->stance_type = BCEnum::StT_Defensive; @@ -351,7 +352,7 @@ public: } if (entry_prototype) break; - + switch (spells[spell_id].SpellAffectIndex) { case 1: { bool valid_spell = false; @@ -453,7 +454,7 @@ public: } if (!entry_prototype) continue; - + if (target_type == BCEnum::TT_Self && (entry_prototype->BCST() != BCEnum::SpT_Stance && entry_prototype->BCST() != BCEnum::SpT_SummonCorpse)) { #ifdef BCSTSPELLDUMP LogError("DELETING entry_prototype (primary clause) - name: [{}], target_type: [{}], BCST: [{}]", @@ -532,12 +533,12 @@ public: spell_entry = new STBaseEntry(entry_prototype); break; } - + assert(spell_entry); spell_entry->caster_class = class_type; spell_entry->spell_level = class_levels[class_index]; - + bot_command_spells[spell_entry->BCST()].push_back(spell_entry); if (bot_levels.find(class_type) == bot_levels.end() || bot_levels[class_type] > class_levels[class_index]) @@ -546,7 +547,7 @@ public: delete(entry_prototype); } - + remove_inactive(); order_all(); load_teleport_zone_names(); @@ -1152,7 +1153,7 @@ private: auto bcst_id = static_cast(i); spell_dump << StringFormat("BCSpells::spell_dump(): - '%s' returned %u spells:\n", BCEnum::SpellTypeEnumToString(bcst_id).c_str(), bot_command_spells[bcst_id].size()); - + bcst_list& map_entry = bot_command_spells[bcst_id]; for (auto list_iter = map_entry.begin(); list_iter != map_entry.end(); ++list_iter) { STBaseEntry* list_entry = *list_iter; @@ -1229,7 +1230,7 @@ private: spell_dump << "\n"; ++entry_count; } - + spell_dump << StringFormat("required_bots_map[%s] = \"%s\"\n", BCEnum::SpellTypeEnumToString(static_cast(i)).c_str(), required_bots_map[static_cast(i)].c_str()); @@ -1477,7 +1478,7 @@ int bot_command_init(void) working_bcl_iter.first.c_str() ); } - + continue; } @@ -1487,7 +1488,7 @@ int bot_command_init(void) working_bcl_iter.first.c_str(), bcs_iter->second.first ); - + if (bcs_iter->second.second.empty()) { continue; } @@ -1522,11 +1523,11 @@ int bot_command_init(void) LogInfo("Failed to process 'Injected Bot Commands' update operation."); } } - + bot_command_dispatch = bot_command_real_dispatch; BCSpells::Load(); - + return bot_command_count; } @@ -1710,10 +1711,10 @@ namespace MyBots auto test_bot = my_bot->CastToBot(); if (!test_bot->GetOwner() || !test_bot->GetOwner()->IsClient() || test_bot->GetOwner()->CastToClient() != bot_owner) return false; - + return true; } - + static bool IsMyBotInTargetsGroup(Client *bot_owner, Mob *grouped_bot) { if (!bot_owner || !grouped_bot || !grouped_bot->GetGroup() || !IsMyBot(bot_owner, grouped_bot)) return false; @@ -1724,7 +1725,7 @@ namespace MyBots if (!target_mob->GetGroup() || (!target_mob->IsClient() && !target_mob->IsBot())) return false; - + return (grouped_bot->GetGroup() == target_mob->GetGroup()); } @@ -1757,7 +1758,7 @@ namespace MyBots sbl.clear(); if (!bot_owner || !name) return; - + auto selectable_bot_list = entity_list.GetBotsByBotOwnerCharacterID(bot_owner->CharacterID()); for (auto bot_iter : selectable_bot_list) { if (!strcasecmp(bot_iter->GetCleanName(), name)) { @@ -1765,7 +1766,7 @@ namespace MyBots return; } } - + if (!clear_list) UniquifySBL(sbl); } @@ -1785,7 +1786,7 @@ namespace MyBots if (IsMyBot(bot_owner, member_iter)) sbl.push_back(member_iter); } - + if (!clear_list) UniquifySBL(sbl); } @@ -1806,7 +1807,7 @@ namespace MyBots if (IsMyBot(bot_owner, member_iter)) sbl.push_back(member_iter); } - + if (!clear_list) UniquifySBL(sbl); } @@ -1835,11 +1836,11 @@ namespace MyBots if (IsMyBot(bot_owner, member_iter)) sbl.push_back(member_iter); } - + if (!clear_list) UniquifySBL(sbl); } - + static void PopulateSBL_ByHealRotation(Client *bot_owner, std::list &sbl, const char* name, bool clear_list = true) { if (clear_list) sbl.clear(); @@ -1890,11 +1891,11 @@ namespace MyBots if (IsMyBot(bot_owner, hrm_iter)) sbl.push_back(hrm_iter); } - + if (!clear_list) UniquifySBL(sbl); } - + static void PopulateSBL_ByHealRotationTargets(Client *bot_owner, std::list &sbl, const char* name, bool clear_list = true) { if (clear_list) sbl.clear(); @@ -1915,7 +1916,7 @@ namespace MyBots if (IsMyBot(bot_owner, hrm_iter)) sbl.push_back(static_cast(hrm_iter)); } - + if (!clear_list) UniquifySBL(sbl); } @@ -2461,8 +2462,8 @@ namespace ActionableBots sbl.remove_if([bot_owner](Bot* l) { return (!MyBots::IsMyBot(bot_owner, l)); }); sbl.remove_if([bot_owner](Bot* l) { return (!l->IsBotArcher()); }); } - - static void Filter_ByHighestSkill(Client* bot_owner, std::list& sbl, EQEmu::skills::SkillType skill_type, float& skill_value) { + + static void Filter_ByHighestSkill(Client* bot_owner, std::list& sbl, EQ::skills::SkillType skill_type, float& skill_value) { sbl.remove_if([bot_owner](Bot* l) { return (!MyBots::IsMyBot(bot_owner, l)); }); skill_value = 0.0f; @@ -2474,8 +2475,8 @@ namespace ActionableBots continue; mod_skill_value = base_skill_value; - for (int16 index = EQEmu::invslot::EQUIPMENT_BEGIN; index <= EQEmu::invslot::EQUIPMENT_END; ++index) { - const EQEmu::ItemInstance* indexed_item = bot_iter->GetBotItem(index); + for (int16 index = EQ::invslot::EQUIPMENT_BEGIN; index <= EQ::invslot::EQUIPMENT_END; ++index) { + const EQ::ItemInstance* indexed_item = bot_iter->GetBotItem(index); if (indexed_item && indexed_item->GetItem()->SkillModType == skill_type) mod_skill_value += (base_skill_value * (((float)indexed_item->GetItem()->SkillModValue) / 100.0f)); } @@ -2499,7 +2500,7 @@ namespace ActionableBots sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() == ROGUE && l->GetLevel() < 5); }); sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() == BARD && l->GetLevel() < 40); }); - ActionableBots::Filter_ByHighestSkill(bot_owner, sbl, EQEmu::skills::SkillPickLock, pick_lock_value); + ActionableBots::Filter_ByHighestSkill(bot_owner, sbl, EQ::skills::SkillPickLock, pick_lock_value); } }; @@ -2610,8 +2611,8 @@ void bot_command_apply_poison(Client *c, const Seperator *sep) c->Message(m_fail, "Your rogue bot must be level 18 before %s can apply poison!", (my_rogue_bot->GetGender() == 1 ? "she" : "he")); return; } - - const auto poison_instance = c->GetInv().GetItem(EQEmu::invslot::slotCursor); + + const auto poison_instance = c->GetInv().GetItem(EQ::invslot::slotCursor); if (!poison_instance) { c->Message(m_fail, "No item found on cursor!"); @@ -2625,7 +2626,7 @@ void bot_command_apply_poison(Client *c, const Seperator *sep) return; } - if (poison_data->ItemType == EQEmu::item::ItemTypePoison) { + if (poison_data->ItemType == EQ::item::ItemTypePoison) { if ((~poison_data->Races) & GetPlayerRaceBit(my_rogue_bot->GetRace())) { @@ -2654,7 +2655,7 @@ void bot_command_apply_poison(Client *c, const Seperator *sep) c->Message(m_fail, "Failed to apply %s to %s's weapon.", poison_data->Name, my_rogue_bot->GetCleanName()); } - c->DeleteItemInInventory(EQEmu::invslot::slotCursor, 1, true); + c->DeleteItemInInventory(EQ::invslot::slotCursor, 1, true); } else { @@ -2687,7 +2688,7 @@ void bot_command_apply_potion(Client* c, const Seperator* sep) return; } - const auto potion_instance = c->GetInv().GetItem(EQEmu::invslot::slotCursor); + const auto potion_instance = c->GetInv().GetItem(EQ::invslot::slotCursor); if (!potion_instance) { c->Message(m_fail, "No item found on cursor!"); @@ -2701,7 +2702,7 @@ void bot_command_apply_potion(Client* c, const Seperator* sep) return; } - if (potion_data->ItemType == EQEmu::item::ItemTypePotion && potion_data->Click.Effect > 0) { + if (potion_data->ItemType == EQ::item::ItemTypePotion && potion_data->Click.Effect > 0) { if (RuleB(Bots, RestrictApplyPotionToRogue) && potion_data->Classes != PLAYER_CLASS_ROGUE_BIT) { @@ -2726,14 +2727,14 @@ void bot_command_apply_potion(Client* c, const Seperator* sep) } // TODO: figure out best way to handle casting time/animation - if (my_bot->SpellFinished(potion_data->Click.Effect, my_bot, EQEmu::spells::CastingSlot::Item, 0)) { + if (my_bot->SpellFinished(potion_data->Click.Effect, my_bot, EQ::spells::CastingSlot::Item, 0)) { c->Message(m_action, "Successfully applied %s to %s's buff effects.", potion_data->Name, my_bot->GetCleanName()); } else { c->Message(m_fail, "Failed to apply %s to %s's buff effects.", potion_data->Name, my_bot->GetCleanName()); } - c->DeleteItemInInventory(EQEmu::invslot::slotCursor, 1, true); + c->DeleteItemInInventory(EQ::invslot::slotCursor, 1, true); } else { @@ -2748,7 +2749,7 @@ void bot_command_attack(Client *c, const Seperator *sep) return; } if (helper_is_help_or_usage(sep->arg[1])) { - + c->Message(m_usage, "usage: %s [actionable: byname | ownergroup | botgroup | namesgroup | healrotation | default: spawned] ([actionable_name])", sep->arg[0]); return; } @@ -2756,7 +2757,7 @@ void bot_command_attack(Client *c, const Seperator *sep) Mob* target_mob = ActionableTarget::AsSingle_ByAttackable(c); if (!target_mob) { - + c->Message(m_fail, "You must an enemy to use this command"); return; } @@ -2765,7 +2766,7 @@ void bot_command_attack(Client *c, const Seperator *sep) if (ab_arg.empty()) { ab_arg = "spawned"; } - + std::list sbl; if (ActionableBots::PopulateSBL(c, ab_arg.c_str(), sbl, ab_mask, sep->arg[2]) == ActionableBots::ABT_None) { return; @@ -2776,7 +2777,7 @@ void bot_command_attack(Client *c, const Seperator *sep) sbl.remove(nullptr); for (auto bot_iter : sbl) { - if (bot_iter->GetAppearance() != eaDead && bot_iter->GetBotStance() != EQEmu::constants::stancePassive) { + if (bot_iter->GetAppearance() != eaDead && bot_iter->GetBotStance() != EQ::constants::stancePassive) { if (!first_attacker) { first_attacker = bot_iter; @@ -2831,7 +2832,7 @@ void bot_command_bind_affinity(Client *c, const Seperator *sep) c->Message(m_fail, "Failed to bind %s to this location", target_mob->GetCleanName()); break; } - + helper_no_available_bots(c, my_bot); } @@ -2866,7 +2867,7 @@ void bot_command_bot(Client *c, const Seperator *sep) "botlist", "botoutofcombat", "botreport", "botspawn", "botstance", "botsummon", "bottogglearcher", "bottogglehelm", "botupdate" }; */ - + if (helper_command_alias_fail(c, "bot_command_bot", sep->arg[0], "bot")) return; @@ -2890,7 +2891,7 @@ void bot_command_botgroup(Client *c, const Seperator *sep) "botgroupaddmember", "botgroupcreate", "botgroupdelete", "botgrouplist", "botgroupload", "botgroupremovemember" }; */ - + if (helper_command_alias_fail(c, "bot_command_botgroup", sep->arg[0], "botgroup")) return; @@ -2946,7 +2947,7 @@ void bot_command_charm(Client *c, const Seperator *sep) break; } - + helper_no_available_bots(c, my_bot); } @@ -3016,7 +3017,7 @@ void bot_command_cure(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3031,7 +3032,7 @@ void bot_command_defensive(Client *c, const Seperator *sep) return; } const int ab_mask = ActionableBots::ABM_Type1; - + std::list sbl; if (ActionableBots::PopulateSBL(c, sep->arg[1], sbl, ab_mask, sep->arg[2]) == ActionableBots::ABT_None) return; @@ -3127,7 +3128,7 @@ void bot_command_depart(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3170,7 +3171,7 @@ void bot_command_escape(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3182,7 +3183,7 @@ void bot_command_find_aliases(Client *c, const Seperator *sep) c->Message(m_usage, "usage: %s [alias | command]", sep->arg[0]); return; } - + auto find_iter = bot_command_aliases.find(sep->arg[1]); if (find_iter == bot_command_aliases.end()) { c->Message(m_fail, "No bot commands or aliases match '%s'", sep->arg[1]); @@ -3248,7 +3249,7 @@ void bot_command_follow(Client *c, const Seperator *sep) std::list sbl; if (ActionableBots::PopulateSBL(c, sep->arg[ab_arg], sbl, ab_mask, sep->arg[name_arg]) == ActionableBots::ABT_None) return; - + sbl.remove(nullptr); for (auto bot_iter : sbl) { bot_iter->WipeHateList(); @@ -3366,7 +3367,7 @@ void bot_command_heal_rotation(Client *c, const Seperator *sep) subcommand_list.push_back("healrotationstart"); subcommand_list.push_back("healrotationstop"); /* VS2012 code - end */ - + /* VS2013 code const std::list subcommand_list = { "healrotationadaptivetargeting", "healrotationaddmember", "healrotationaddtarget", "healrotationadjustcritical", "healrotationadjustsafe", @@ -3375,7 +3376,7 @@ void bot_command_heal_rotation(Client *c, const Seperator *sep) "healrotationresetlimits", "healrotationsethot", "healrotationstart", "healrotationstop" }; */ - + if (helper_command_alias_fail(c, "bot_command_heal_rotation", sep->arg[0], "healrotation")) return; @@ -3401,7 +3402,7 @@ void bot_command_help(Client *c, const Seperator *sep) { if (helper_command_alias_fail(c, "bot_command_help", sep->arg[0], "help")) return; - + c->Message(m_message, "Available EQEMu bot commands:"); int bot_commands_shown = 0; @@ -3505,7 +3506,7 @@ void bot_command_identify(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3581,7 +3582,7 @@ void bot_command_invisibility(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3599,7 +3600,7 @@ void bot_command_item_use(Client* c, const Seperator* sep) empty_only = true; } - const auto item_instance = c->GetInv().GetItem(EQEmu::invslot::slotCursor); + const auto item_instance = c->GetInv().GetItem(EQ::invslot::slotCursor); if (!item_instance) { c->Message(m_fail, "No item found on cursor!"); @@ -3613,14 +3614,14 @@ void bot_command_item_use(Client* c, const Seperator* sep) return; } - if (item_data->ItemClass != EQEmu::item::ItemClassCommon || item_data->Slots == 0) { + if (item_data->ItemClass != EQ::item::ItemClassCommon || item_data->Slots == 0) { c->Message(m_fail, "'%s' is not an equipable item!", item_data->Name); return; } std::list equipable_slot_list; - for (int16 equipable_slot = EQEmu::invslot::EQUIPMENT_BEGIN; equipable_slot <= EQEmu::invslot::EQUIPMENT_END; ++equipable_slot) { + for (int16 equipable_slot = EQ::invslot::EQUIPMENT_BEGIN; equipable_slot <= EQ::invslot::EQUIPMENT_END; ++equipable_slot) { if (item_data->Slots & (1 << equipable_slot)) { equipable_slot_list.push_back(equipable_slot); } @@ -3629,8 +3630,8 @@ void bot_command_item_use(Client* c, const Seperator* sep) std::string msg; std::string text_link; - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemInst); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemInst); std::list sbl; MyBots::PopulateSBL_BySpawnedBots(c, sbl); @@ -3647,11 +3648,11 @@ void bot_command_item_use(Client* c, const Seperator* sep) msg = StringFormat("%cinventorygive byname %s", BOT_COMMAND_CHAR, bot_iter->GetCleanName()); text_link = bot_iter->CreateSayLink(c, msg.c_str(), bot_iter->GetCleanName()); - + for (auto slot_iter : equipable_slot_list) { // needs more failure criteria - this should cover the bulk for now - if (slot_iter == EQEmu::invslot::slotSecondary && item_data->Damage && !bot_iter->CanThisClassDualWield()) { + if (slot_iter == EQ::invslot::slotSecondary && item_data->Damage && !bot_iter->CanThisClassDualWield()) { continue; } @@ -3665,7 +3666,7 @@ void bot_command_item_use(Client* c, const Seperator* sep) Chat::Say, "[%s] says, 'I can use that for my %s! (replaces: [%s])'", text_link.c_str(), - EQEmu::invslot::GetInvPossessionsSlotName(slot_iter), + EQ::invslot::GetInvPossessionsSlotName(slot_iter), linker.GenerateLink().c_str() ); bot_iter->DoAnim(29); @@ -3676,7 +3677,7 @@ void bot_command_item_use(Client* c, const Seperator* sep) Chat::Say, "[%s] says, 'I can use that for my %s!'", text_link.c_str(), - EQEmu::invslot::GetInvPossessionsSlotName(slot_iter) + EQ::invslot::GetInvPossessionsSlotName(slot_iter) ); bot_iter->DoAnim(29); } @@ -3717,7 +3718,7 @@ void bot_command_levitation(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3787,7 +3788,7 @@ void bot_command_mesmerize(Client *c, const Seperator *sep) auto target_mob = actionable_targets.Select(c, local_entry->target_type, ENEMY); if (!target_mob) continue; - + if (spells[local_entry->spell_id].max[EFFECTIDTOINDEX(1)] < target_mob->GetLevel()) continue; @@ -3850,7 +3851,7 @@ void bot_command_movement_speed(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -3859,7 +3860,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) if (helper_is_help_or_usage(sep->arg[1])) { c->Message(m_usage, "usage: %s [option] [argument]", sep->arg[0]); - + std::string window_title = "Bot Owner Options"; std::string window_text = "" @@ -3944,7 +3945,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) "" "" "
show current settings
"; - + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); return; @@ -3964,7 +3965,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) else { c->SetBotOption(Client::booDeathMarquee, !c->GetBotOption(Client::booDeathMarquee)); } - + database.botdb.SaveOwnerOption(c->CharacterID(), Client::booDeathMarquee, c->GetBotOption(Client::booDeathMarquee)); c->Message(m_action, "Bot 'death marquee' is now %s.", (c->GetBotOption(Client::booDeathMarquee) == true ? "enabled" : "disabled")); @@ -4054,7 +4055,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) c->Message(m_action, "Bot 'spawn message' is now %s.", argument.c_str()); } else if (!owner_option.compare("altcombat")) { - + if (RuleB(Bots, AllowOwnerOptionAltCombat)) { if (!argument.compare("enable")) { @@ -4130,7 +4131,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) c->Message(m_action, "Bot 'monk wu message' is now %s.", (c->GetBotOption(Client::booMonkWuMessage) == true ? "enabled" : "disabled")); } else if (!owner_option.compare("current")) { - + std::string window_title = "Current Bot Owner Options Settings"; std::string window_text = fmt::format( "" @@ -4156,7 +4157,7 @@ void bot_command_owner_option(Client *c, const Seperator *sep) (c->GetBotOption(Client::booBuffCounter) ? "enabled" : "disabled"), (c->GetBotOption(Client::booMonkWuMessage) ? "enabled" : "disabled") ); - + c->SendPopupToClient(window_title.c_str(), window_text.c_str()); } else { @@ -4172,7 +4173,7 @@ void bot_command_pet(Client *c, const Seperator *sep) subcommand_list.push_back("petremove"); subcommand_list.push_back("petsettype"); /* VS2012 code - end */ - + /* VS2013 code const std::list subcommand_list = { "petgetlost", "petremove", "petsettype" }; */ @@ -4205,7 +4206,7 @@ void bot_command_pick_lock(Client *c, const Seperator *sep) } Bot* my_bot = sbl.front(); - + my_bot->InterruptSpell(); Bot::BotGroupSay(my_bot, "Attempting to pick the lock.."); @@ -4307,10 +4308,10 @@ void bot_command_pull(Client *c, const Seperator *sep) Bot* bot_puller = nullptr; for (auto bot_iter : sbl) { - if (bot_iter->GetAppearance() == eaDead || bot_iter->GetBotStance() == EQEmu::constants::stancePassive) { + if (bot_iter->GetAppearance() == eaDead || bot_iter->GetBotStance() == EQ::constants::stancePassive) { continue; } - + switch (bot_iter->GetClass()) { case ROGUE: case MONK: @@ -4385,7 +4386,7 @@ void bot_command_pull(Client *c, const Seperator *sep) if (bot_puller) { bot_puller->SetPullFlag(); } - + helper_no_available_bots(c, bot_puller); } @@ -4452,7 +4453,7 @@ void bot_command_resistance(Client *c, const Seperator *sep) return true; if (_l->resist_value[RESISTANCEIDTOINDEX(resistance_type)] == _r->resist_value[RESISTANCEIDTOINDEX(resistance_type)] && spells[_l->spell_id].mana == spells[_r->spell_id].mana && _l->resist_total > _r->resist_total) return true; - + return false; }); @@ -4480,14 +4481,14 @@ void bot_command_resistance(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } void bot_command_resurrect(Client *c, const Seperator *sep) { // Obscure bot spell code prohibits the aoe portion from working correctly... - + bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Resurrect]; if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Resurrect) || helper_command_alias_fail(c, "bot_command_resurrect", sep->arg[0], "resurrect")) return; @@ -4516,7 +4517,7 @@ void bot_command_resurrect(Client *c, const Seperator *sep) // continue; if (local_entry->aoe) continue; - + auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY); //if (!target_mob && !local_entry->aoe) // continue; @@ -4573,14 +4574,14 @@ void bot_command_rune(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } void bot_command_send_home(Client *c, const Seperator *sep) { // Obscure bot spell code prohibits the aoe portion from working correctly... - + bcst_list* local_list = &bot_command_spells[BCEnum::SpT_SendHome]; if (helper_spell_list_fail(c, local_list, BCEnum::SpT_SendHome) || helper_command_alias_fail(c, "bot_command_send_home", sep->arg[0], "sendhome")) return; @@ -4607,7 +4608,7 @@ void bot_command_send_home(Client *c, const Seperator *sep) continue; if (local_entry->group != group) continue; - + auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY); if (!target_mob) continue; @@ -4668,7 +4669,7 @@ void bot_command_size(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -4679,7 +4680,7 @@ void bot_command_summon_corpse(Client *c, const Seperator *sep) // temp c->Message(m_fail, "This command is currently unavailable..."); return; - + bcst_list* local_list = &bot_command_spells[BCEnum::SpT_SummonCorpse]; if (helper_spell_list_fail(c, local_list, BCEnum::SpT_SummonCorpse) || helper_command_alias_fail(c, "bot_command_summon_corpse", sep->arg[0], "summoncorpse")) return; @@ -4698,7 +4699,7 @@ void bot_command_summon_corpse(Client *c, const Seperator *sep) auto local_entry = list_iter; if (helper_spell_check_fail(local_entry)) continue; - + auto target_mob = ActionableTarget::AsSingle_ByPlayer(c); if (!target_mob) continue; @@ -4711,7 +4712,7 @@ void bot_command_summon_corpse(Client *c, const Seperator *sep) continue; cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); - + break; } @@ -4771,12 +4772,12 @@ void bot_command_taunt(Client *c, const Seperator *sep) if (ActionableBots::PopulateSBL(c, sep->arg[ab_arg], sbl, ab_mask, sep->arg[(ab_arg + 1)]) == ActionableBots::ABT_None) return; sbl.remove(nullptr); - + int taunting_count = 0; for (auto bot_iter : sbl) { - if (!bot_iter->GetSkill(EQEmu::skills::SkillTaunt)) + if (!bot_iter->GetSkill(EQ::skills::SkillTaunt)) continue; - + if (toggle_taunt) bot_iter->SetTaunting(!bot_iter->IsTaunting()); else @@ -4814,10 +4815,10 @@ void bot_command_track(Client *c, const Seperator *sep) std::list sbl; MyBots::PopulateSBL_BySpawnedBots(c, sbl); - + uint16 class_mask = (PLAYER_CLASS_RANGER_BIT | PLAYER_CLASS_DRUID_BIT | PLAYER_CLASS_BARD_BIT); ActionableBots::Filter_ByClasses(c, sbl, class_mask); - + Bot* my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 1, RANGER); if (tracking_scope.empty()) { if (!my_bot) @@ -4903,7 +4904,7 @@ void bot_command_water_breathing(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -4926,14 +4927,14 @@ void bot_subcommand_bot_appearance(Client *c, const Seperator *sep) subcommand_list.push_back("bottattoo"); subcommand_list.push_back("botwoad"); /* VS2012 code - end */ - + /* VS2013 code const std::list subcommand_list = { "botbeardcolor", "botbeardstyle", "botdetails", "boteyes", "botface", "bothaircolor", "bothairstyle", "botheritage", "bottattoo", "botwoad" }; */ - + if (helper_command_alias_fail(c, "bot_subcommand_bot_appearance", sep->arg[0], "botappearance")) return; @@ -5094,7 +5095,7 @@ void bot_subcommand_bot_clone(Client *c, const Seperator *sep) return; } - int clone_stance = EQEmu::constants::stancePassive; + int clone_stance = EQ::constants::stancePassive; if (!database.botdb.LoadStance(my_bot->GetBotID(), clone_stance)) c->Message(m_fail, "%s for bot '%s'", BotDatabase::fail::LoadStance(), my_bot->GetCleanName()); if (!database.botdb.SaveStance(clone_id, clone_stance)) @@ -5102,7 +5103,7 @@ void bot_subcommand_bot_clone(Client *c, const Seperator *sep) if (!database.botdb.CreateCloneBotInventory(c->CharacterID(), my_bot->GetBotID(), clone_id)) c->Message(m_fail, "%s for clone '%s'", BotDatabase::fail::CreateCloneBotInventory(), bot_name.c_str()); - + c->Message(m_action, "Bot '%s' was successfully cloned to bot '%s'", my_bot->GetCleanName(), bot_name.c_str()); } @@ -5257,7 +5258,7 @@ void bot_subcommand_bot_delete(Client *c, const Seperator *sep) void bot_subcommand_bot_details(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + if (helper_command_alias_fail(c, "bot_subcommand_bot_details", sep->arg[0], "botdetails")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -5296,9 +5297,9 @@ void bot_subcommand_bot_details(Client *c, const Seperator *sep) void bot_subcommand_bot_dye_armor(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + const std::string msg_matslot = StringFormat("mat_slot: %c(All), %i(Head), %i(Chest), %i(Arms), %i(Wrists), %i(Hands), %i(Legs), %i(Feet)", - '*', EQEmu::textures::armorHead, EQEmu::textures::armorChest, EQEmu::textures::armorArms, EQEmu::textures::armorWrist, EQEmu::textures::armorHands, EQEmu::textures::armorLegs, EQEmu::textures::armorFeet); + '*', EQ::textures::armorHead, EQ::textures::armorChest, EQ::textures::armorArms, EQ::textures::armorWrist, EQ::textures::armorHands, EQ::textures::armorLegs, EQ::textures::armorFeet); if (helper_command_alias_fail(c, "bot_subcommand_bot_dye_armor", sep->arg[0], "botdyearmor")) return; @@ -5309,15 +5310,15 @@ void bot_subcommand_bot_dye_armor(Client *c, const Seperator *sep) } const int ab_mask = ActionableBots::ABM_NoFilter; - uint8 material_slot = EQEmu::textures::materialInvalid; + uint8 material_slot = EQ::textures::materialInvalid; int16 slot_id = INVALID_INDEX; bool dye_all = (sep->arg[1][0] == '*'); if (!dye_all) { material_slot = atoi(sep->arg[1]); - slot_id = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + slot_id = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); - if (!sep->IsNumber(1) || slot_id == INVALID_INDEX || material_slot > EQEmu::textures::LastTintableTexture) { + if (!sep->IsNumber(1) || slot_id == INVALID_INDEX || material_slot > EQ::textures::LastTintableTexture) { c->Message(m_fail, "Valid [mat_slot]s for this command are:"); c->Message(m_fail, msg_matslot.c_str()); return; @@ -5377,7 +5378,7 @@ void bot_subcommand_bot_dye_armor(Client *c, const Seperator *sep) void bot_subcommand_bot_eyes(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + // not sure if left/right bias is allowed in pc-type entities (something is keeping them from being different) if (helper_command_alias_fail(c, "bot_subcommand_bot_eyes", sep->arg[0], "boteyes")) return; @@ -5611,7 +5612,7 @@ void bot_subcommand_bot_hairstyle(Client *c, const Seperator *sep) void bot_subcommand_bot_heritage(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + if (helper_command_alias_fail(c, "bot_subcommand_bot_heritage", sep->arg[0], "botheritage")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -5640,7 +5641,7 @@ void bot_subcommand_bot_heritage(Client *c, const Seperator *sep) fail_type = BCEnum::AFT_Value; else my_bot->SetDrakkinHeritage(uvalue); - + if (helper_bot_appearance_fail(c, my_bot, fail_type, "heritage")) return; @@ -5654,7 +5655,7 @@ void bot_subcommand_bot_inspect_message(Client *c, const Seperator *sep) if (helper_is_help_or_usage(sep->arg[1])) { c->Message(m_usage, "usage: %s [set | clear] ([actionable: target | byname | ownergroup | botgroup | targetgroup | namesgroup | healrotation | spawned] ([actionable_name]))", sep->arg[0]); c->Message(m_note, "Notes:"); - if (c->ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (c->ClientVersion() >= EQ::versions::ClientVersion::SoF) { c->Message(m_message, "- Self-inspect and type your bot's inspect message"); c->Message(m_message, "- Close the self-inspect window to update the server"); c->Message(m_message, "- Type '%s set' to set the bot's inspect message", sep->arg[0]); @@ -5799,7 +5800,7 @@ void bot_subcommand_bot_list(Client *c, const Seperator *sep) Bot * botCheckNotOnline = entity_list.GetBotByBotName(bots_iter.Name); std::string botspawn_saylink = StringFormat("^botspawn %s", bots_iter.Name); c->Message(Chat::White, "[%s] is a level %u %s %s %s who is owned by %s", - ((c->CharacterID() == bots_iter.Owner_ID) && (!botCheckNotOnline) ? (EQEmu::SayLinkEngine::GenerateQuestSaylink(botspawn_saylink, false, bots_iter.Name).c_str()) : (bots_iter.Name)), + ((c->CharacterID() == bots_iter.Owner_ID) && (!botCheckNotOnline) ? (EQ::SayLinkEngine::GenerateQuestSaylink(botspawn_saylink, false, bots_iter.Name).c_str()) : (bots_iter.Name)), bots_iter.Level, Bot::RaceIdToString(bots_iter.Race).c_str(), ((bots_iter.Gender == FEMALE) ? ("Female") : ((bots_iter.Gender == MALE) ? ("Male") : ("Neuter"))), @@ -5856,7 +5857,7 @@ void bot_subcommand_bot_out_of_combat(Client *c, const Seperator *sep) bot_iter->SetAltOutOfCombatBehavior(!bot_iter->GetAltOutOfCombatBehavior()); else bot_iter->SetAltOutOfCombatBehavior(behavior_state); - + helper_bot_out_of_combat(c, bot_iter); } } @@ -6069,7 +6070,7 @@ void bot_subcommand_bot_spawn(Client *c, const Seperator *sep) c->Message(m_fail, "You can't spawn bots while you are engaged."); return; } - + //if (c->IsEngaged()) { // c->Message(m_fail, "You can't spawn bots while you are engaged."); // return; @@ -6127,32 +6128,32 @@ void bot_subcommand_bot_stance(Client *c, const Seperator *sep) if (helper_is_help_or_usage(sep->arg[1])) { c->Message(m_usage, "usage: %s [current | value: 1-9] ([actionable: target | byname] ([actionable_name]))", sep->arg[0]); c->Message(m_note, "value: %u(%s), %u(%s), %u(%s), %u(%s), %u(%s), %u(%s), %u(%s)", - EQEmu::constants::stancePassive, EQEmu::constants::GetStanceName(EQEmu::constants::stancePassive), - EQEmu::constants::stanceBalanced, EQEmu::constants::GetStanceName(EQEmu::constants::stanceBalanced), - EQEmu::constants::stanceEfficient, EQEmu::constants::GetStanceName(EQEmu::constants::stanceEfficient), - EQEmu::constants::stanceReactive, EQEmu::constants::GetStanceName(EQEmu::constants::stanceReactive), - EQEmu::constants::stanceAggressive, EQEmu::constants::GetStanceName(EQEmu::constants::stanceAggressive), - EQEmu::constants::stanceAssist, EQEmu::constants::GetStanceName(EQEmu::constants::stanceAssist), - EQEmu::constants::stanceBurn, EQEmu::constants::GetStanceName(EQEmu::constants::stanceBurn), - EQEmu::constants::stanceEfficient2, EQEmu::constants::GetStanceName(EQEmu::constants::stanceEfficient2), - EQEmu::constants::stanceBurnAE, EQEmu::constants::GetStanceName(EQEmu::constants::stanceBurnAE) + EQ::constants::stancePassive, EQ::constants::GetStanceName(EQ::constants::stancePassive), + EQ::constants::stanceBalanced, EQ::constants::GetStanceName(EQ::constants::stanceBalanced), + EQ::constants::stanceEfficient, EQ::constants::GetStanceName(EQ::constants::stanceEfficient), + EQ::constants::stanceReactive, EQ::constants::GetStanceName(EQ::constants::stanceReactive), + EQ::constants::stanceAggressive, EQ::constants::GetStanceName(EQ::constants::stanceAggressive), + EQ::constants::stanceAssist, EQ::constants::GetStanceName(EQ::constants::stanceAssist), + EQ::constants::stanceBurn, EQ::constants::GetStanceName(EQ::constants::stanceBurn), + EQ::constants::stanceEfficient2, EQ::constants::GetStanceName(EQ::constants::stanceEfficient2), + EQ::constants::stanceBurnAE, EQ::constants::GetStanceName(EQ::constants::stanceBurnAE) ); return; } int ab_mask = (ActionableBots::ABM_Target | ActionableBots::ABM_ByName); bool current_flag = false; - auto bst = EQEmu::constants::stanceUnknown; + auto bst = EQ::constants::stanceUnknown; if (!strcasecmp(sep->arg[1], "current")) current_flag = true; else if (sep->IsNumber(1)) { - bst = (EQEmu::constants::StanceType)atoi(sep->arg[1]); - if (bst < EQEmu::constants::stanceUnknown || bst > EQEmu::constants::stanceBurnAE) - bst = EQEmu::constants::stanceUnknown; + bst = (EQ::constants::StanceType)atoi(sep->arg[1]); + if (bst < EQ::constants::stanceUnknown || bst > EQ::constants::stanceBurnAE) + bst = EQ::constants::stanceUnknown; } - if (!current_flag && bst == EQEmu::constants::stanceUnknown) { + if (!current_flag && bst == EQ::constants::stanceUnknown) { c->Message(m_fail, "A [current] argument or valid numeric [value] is required to use this command"); return; } @@ -6173,7 +6174,7 @@ void bot_subcommand_bot_stance(Client *c, const Seperator *sep) Bot::BotGroupSay( bot_iter, "My current stance is '%s' (%i)", - EQEmu::constants::GetStanceName(bot_iter->GetBotStance()), + EQ::constants::GetStanceName(bot_iter->GetBotStance()), bot_iter->GetBotStance() ); } @@ -6268,7 +6269,7 @@ void bot_subcommand_bot_summon(Client *c, const Seperator *sep) void bot_subcommand_bot_tattoo(Client *c, const Seperator *sep) { // TODO: Trouble-shoot model update issue - + if (helper_command_alias_fail(c, "bot_subcommand_bot_tattoo", sep->arg[0], "bottattoo")) return; if (helper_is_help_or_usage(sep->arg[1])) { @@ -6336,7 +6337,7 @@ void bot_subcommand_bot_toggle_archer(Client *c, const Seperator *sep) for (auto bot_iter : sbl) { if (!bot_iter) continue; - + if (toggle_archer) bot_iter->SetBotArcher(!bot_iter->IsBotArcher()); else @@ -6925,7 +6926,7 @@ void bot_subcommand_botgroup_load(Client *c, const Seperator *sep) safe_delete(botgroup_leader); return; } - + Group* group_inst = new Group(botgroup_leader); entity_list.AddGroup(group_inst); @@ -7052,7 +7053,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -7536,7 +7537,7 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) sep->arg[0], CASTING_CYCLE_DEFAULT_INTERVAL_S, CASTING_CYCLE_MINIMUM_INTERVAL_S, CASTING_CYCLE_MAXIMUM_INTERVAL_S); return; } - + std::string interval_arg; std::string fast_heals_arg; std::string adaptive_targeting_arg; @@ -7594,10 +7595,10 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) hr_fast_heals = true; hr_interval_s = atoi(interval_arg.c_str()); } - + if (hr_interval_s < CASTING_CYCLE_MINIMUM_INTERVAL_S || hr_interval_s > CASTING_CYCLE_MAXIMUM_INTERVAL_S) hr_interval_s = CASTING_CYCLE_DEFAULT_INTERVAL_S; - + hr_interval_s *= 1000; // convert to milliseconds for Bot/HealRotation constructor if (!creator_member->CreateHealRotation(hr_interval_s, hr_fast_heals, hr_adaptive_targeting, hr_casting_override)) { @@ -7613,12 +7614,12 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) if (!database.botdb.LoadHealRotation(creator_member, member_list, target_list, load_flag, member_fail, target_fail)) c->Message(m_fail, "%s", BotDatabase::fail::LoadHealRotation()); - + if (!load_flag) { c->Message(m_action, "Successfully added %s as a current member to a new Heal Rotation", creator_member->GetCleanName()); return; } - + if (!member_fail) { MyBots::PopulateSBL_BySpawnedBots(c, sbl); for (auto member_iter : member_list) { @@ -7663,7 +7664,7 @@ void bot_subcommand_heal_rotation_create(Client *c, const Seperator *sep) else { c->Message(m_fail, "%s", BotDatabase::fail::LoadHealRotationTargets()); } - + c->Message(m_action, "Successfully loaded %s's Heal Rotation", creator_member->GetCleanName()); } @@ -8181,31 +8182,31 @@ void bot_subcommand_inventory_list(Client *c, const Seperator *sep) return; } - const EQEmu::ItemInstance* inst = nullptr; - const EQEmu::ItemData* item = nullptr; + const EQ::ItemInstance* inst = nullptr; + const EQ::ItemData* item = nullptr; bool is2Hweapon = false; - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemInst); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemInst); uint32 inventory_count = 0; - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; ++i) { - if ((i == EQEmu::invslot::slotSecondary) && is2Hweapon) + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; ++i) { + if ((i == EQ::invslot::slotSecondary) && is2Hweapon) continue; inst = my_bot->CastToBot()->GetBotItem(i); if (!inst || !inst->GetItem()) { - c->Message(m_message, "I need something for my %s (slot %i)", EQEmu::invslot::GetInvPossessionsSlotName(i), i); + c->Message(m_message, "I need something for my %s (slot %i)", EQ::invslot::GetInvPossessionsSlotName(i), i); continue; } - + item = inst->GetItem(); - if ((i == EQEmu::invslot::slotPrimary) && item->IsType2HWeapon()) { + if ((i == EQ::invslot::slotPrimary) && item->IsType2HWeapon()) { is2Hweapon = true; } linker.SetItemInst(inst); - c->Message(m_message, "Using %s in my %s (slot %i)", linker.GenerateLink().c_str(), EQEmu::invslot::GetInvPossessionsSlotName(i), i); + c->Message(m_message, "Using %s in my %s (slot %i)", linker.GenerateLink().c_str(), EQ::invslot::GetInvPossessionsSlotName(i), i); ++inventory_count; } @@ -8244,13 +8245,13 @@ void bot_subcommand_inventory_remove(Client *c, const Seperator *sep) } int slotId = atoi(sep->arg[1]); - if (!sep->IsNumber(1) || (slotId > EQEmu::invslot::EQUIPMENT_END || slotId < EQEmu::invslot::EQUIPMENT_BEGIN)) { + if (!sep->IsNumber(1) || (slotId > EQ::invslot::EQUIPMENT_END || slotId < EQ::invslot::EQUIPMENT_BEGIN)) { c->Message(m_fail, "Valid slots are 0-22"); return; } - const EQEmu::ItemData* itm = nullptr; - const EQEmu::ItemInstance* itminst = my_bot->GetBotItem(slotId); + const EQ::ItemData* itm = nullptr; + const EQ::ItemInstance* itminst = my_bot->GetBotItem(slotId); if (itminst) itm = itminst->GetItem(); @@ -8259,11 +8260,11 @@ void bot_subcommand_inventory_remove(Client *c, const Seperator *sep) return; } - for (int m = EQEmu::invaug::SOCKET_BEGIN; m <= EQEmu::invaug::SOCKET_END; ++m) { + for (int m = EQ::invaug::SOCKET_BEGIN; m <= EQ::invaug::SOCKET_END; ++m) { if (!itminst) break; - EQEmu::ItemInstance *itma = itminst->GetAugment(m); + EQ::ItemInstance *itma = itminst->GetAugment(m); if (!itma) continue; if (!c->CheckLoreConflict(itma->GetItem())) @@ -8272,11 +8273,11 @@ void bot_subcommand_inventory_remove(Client *c, const Seperator *sep) c->MessageString(Chat::White, PICK_LORE); return; } - + std::string error_message; if (itm) { c->PushItemOnCursor(*itminst, true); - if ((slotId == EQEmu::invslot::slotRange) || (slotId == EQEmu::invslot::slotAmmo) || (slotId == EQEmu::invslot::slotPrimary) || (slotId == EQEmu::invslot::slotSecondary)) + if ((slotId == EQ::invslot::slotRange) || (slotId == EQ::invslot::slotAmmo) || (slotId == EQ::invslot::slotPrimary) || (slotId == EQ::invslot::slotSecondary)) my_bot->SetBotArcher(false); my_bot->RemoveBotItemBySlot(slotId, &error_message); @@ -8290,32 +8291,32 @@ void bot_subcommand_inventory_remove(Client *c, const Seperator *sep) } switch (slotId) { - case EQEmu::invslot::slotCharm: - case EQEmu::invslot::slotEar1: - case EQEmu::invslot::slotHead: - case EQEmu::invslot::slotFace: - case EQEmu::invslot::slotEar2: - case EQEmu::invslot::slotNeck: - case EQEmu::invslot::slotBack: - case EQEmu::invslot::slotWrist1: - case EQEmu::invslot::slotWrist2: - case EQEmu::invslot::slotRange: - case EQEmu::invslot::slotPrimary: - case EQEmu::invslot::slotSecondary: - case EQEmu::invslot::slotFinger1: - case EQEmu::invslot::slotFinger2: - case EQEmu::invslot::slotChest: - case EQEmu::invslot::slotWaist: - case EQEmu::invslot::slotPowerSource: - case EQEmu::invslot::slotAmmo: - c->Message(m_message, "My %s is %s unequipped", EQEmu::invslot::GetInvPossessionsSlotName(slotId), ((itm) ? ("now") : ("already"))); + case EQ::invslot::slotCharm: + case EQ::invslot::slotEar1: + case EQ::invslot::slotHead: + case EQ::invslot::slotFace: + case EQ::invslot::slotEar2: + case EQ::invslot::slotNeck: + case EQ::invslot::slotBack: + case EQ::invslot::slotWrist1: + case EQ::invslot::slotWrist2: + case EQ::invslot::slotRange: + case EQ::invslot::slotPrimary: + case EQ::invslot::slotSecondary: + case EQ::invslot::slotFinger1: + case EQ::invslot::slotFinger2: + case EQ::invslot::slotChest: + case EQ::invslot::slotWaist: + case EQ::invslot::slotPowerSource: + case EQ::invslot::slotAmmo: + c->Message(m_message, "My %s is %s unequipped", EQ::invslot::GetInvPossessionsSlotName(slotId), ((itm) ? ("now") : ("already"))); break; - case EQEmu::invslot::slotShoulders: - case EQEmu::invslot::slotArms: - case EQEmu::invslot::slotHands: - case EQEmu::invslot::slotLegs: - case EQEmu::invslot::slotFeet: - c->Message(m_message, "My %s are %s unequipped", EQEmu::invslot::GetInvPossessionsSlotName(slotId), ((itm) ? ("now") : ("already"))); + case EQ::invslot::slotShoulders: + case EQ::invslot::slotArms: + case EQ::invslot::slotHands: + case EQ::invslot::slotLegs: + case EQ::invslot::slotFeet: + c->Message(m_message, "My %s are %s unequipped", EQ::invslot::GetInvPossessionsSlotName(slotId), ((itm) ? ("now") : ("already"))); break; default: c->Message(m_fail, "I'm soo confused..."); @@ -8348,17 +8349,17 @@ void bot_subcommand_inventory_window(Client *c, const Seperator *sep) std::string window_text; //std::string item_link; - //EQEmu::SayLinkEngine linker; - //linker.SetLinkType(EQEmu::saylink::SayLinkItemInst); + //EQ::SayLinkEngine linker; + //linker.SetLinkType(EQ::saylink::SayLinkItemInst); - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; ++i) { - const EQEmu::ItemData* item = nullptr; - const EQEmu::ItemInstance* inst = my_bot->CastToBot()->GetBotItem(i); + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; ++i) { + const EQ::ItemData* item = nullptr; + const EQ::ItemInstance* inst = my_bot->CastToBot()->GetBotItem(i); if (inst) item = inst->GetItem(); window_text.append(""); - window_text.append(EQEmu::invslot::GetInvPossessionsSlotName(i)); + window_text.append(EQ::invslot::GetInvPossessionsSlotName(i)); window_text.append(": "); if (item) { //window_text.append(""); @@ -8517,7 +8518,7 @@ void bot_subcommand_pet_set_type(Client *c, const Seperator *sep) c->Message(m_fail, "You have no spawned Magician bots capable of using this pet type: '%s'", pet_arg.c_str()); return; } - + uint16 reclaim_energy_id = 331; for (auto bot_iter : sbl) { if (!bot_iter) @@ -8588,7 +8589,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep) cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id); break; } - + helper_no_available_bots(c, my_bot); } @@ -8840,7 +8841,7 @@ bool helper_cast_standard_spell(Bot* casting_bot, Mob* target_mob, int spell_id, if (annouce_cast) Bot::BotGroupSay(casting_bot, "Attempting to cast '%s' on %s", spells[spell_id].name, target_mob->GetCleanName()); - return casting_bot->CastSpell(spell_id, target_mob->GetID(), EQEmu::spells::CastingSlot::Gem2, -1, -1, dont_root_before); + return casting_bot->CastSpell(spell_id, target_mob->GetID(), EQ::spells::CastingSlot::Gem2, -1, -1, dont_root_before); } bool helper_command_disabled(Client* bot_owner, bool rule_value, const char* command) diff --git a/zone/bot_database.cpp b/zone/bot_database.cpp index 28b5288e0..c419fd355 100644 --- a/zone/bot_database.cpp +++ b/zone/bot_database.cpp @@ -24,6 +24,7 @@ #include "../common/eqemu_logsys.h" #include "zonedb.h" +#include "zone_store.h" #include "bot.h" #include "client.h" @@ -145,7 +146,7 @@ bool BotDatabase::LoadBotSpellCastingChances() continue; --class_index; uint8 stance_index = atoi(row[2]); - if (stance_index >= EQEmu::constants::STANCE_TYPE_COUNT) + if (stance_index >= EQ::constants::STANCE_TYPE_COUNT) continue; for (uint8 conditional_index = nHSND; conditional_index < cntHSND; ++conditional_index) { @@ -192,7 +193,7 @@ bool BotDatabase::QueryBotCount(const uint32 owner_id, uint32& bot_count) return false; if (!results.RowCount()) return true; - + auto row = results.begin(); bot_count = atoi(row[0]); @@ -314,7 +315,7 @@ bool BotDatabase::LoadBotID(const uint32 owner_id, const std::string& bot_name, return false; if (!results.RowCount()) return true; - + auto row = results.begin(); bot_id = atoi(row[0]); @@ -451,7 +452,7 @@ bool BotDatabase::SaveNewBot(Bot* bot_inst, uint32& bot_id) { if (!bot_inst) return false; - + query = StringFormat( "INSERT INTO `bot_data` (" " `owner_id`," @@ -596,7 +597,7 @@ bool BotDatabase::SaveBot(Bot* bot_inst) { if (!bot_inst) return false; - + query = StringFormat( "UPDATE `bot_data`" " SET" @@ -914,7 +915,7 @@ bool BotDatabase::LoadStance(Bot* bot_inst, bool& stance_flag) return true; auto row = results.begin(); - bot_inst->SetBotStance((EQEmu::constants::StanceType)atoi(row[0])); + bot_inst->SetBotStance((EQ::constants::StanceType)atoi(row[0])); stance_flag = true; return true; @@ -1014,7 +1015,7 @@ bool BotDatabase::LoadTimers(Bot* bot_inst) if (timer_id >= 0 && timer_id < MaxTimer && timer_value < (Timer::GetCurrentTime() + max_value)) bot_timers[timer_id] = timer_value; } - + return true; } @@ -1127,7 +1128,7 @@ bool BotDatabase::QueryInventoryCount(const uint32 bot_id, uint32& item_count) { if (!bot_id) return false; - + query = StringFormat("SELECT COUNT(`inventories_index`) FROM `bot_inventories` WHERE `bot_id` = '%u'", bot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1141,7 +1142,7 @@ bool BotDatabase::QueryInventoryCount(const uint32 bot_id, uint32& item_count) return true; } -bool BotDatabase::LoadItems(const uint32 bot_id, EQEmu::InventoryProfile& inventory_inst) +bool BotDatabase::LoadItems(const uint32 bot_id, EQ::InventoryProfile& inventory_inst) { if (!bot_id) return false; @@ -1173,16 +1174,16 @@ bool BotDatabase::LoadItems(const uint32 bot_id, EQEmu::InventoryProfile& invent return false; if (!results.RowCount()) return true; - + for (auto row = results.begin(); row != results.end(); ++row) { int16 slot_id = atoi(row[0]); - if (slot_id < EQEmu::invslot::EQUIPMENT_BEGIN || slot_id > EQEmu::invslot::EQUIPMENT_END) + if (slot_id < EQ::invslot::EQUIPMENT_BEGIN || slot_id > EQ::invslot::EQUIPMENT_END) continue; uint32 item_id = atoi(row[1]); uint16 item_charges = (uint16)atoi(row[2]); - EQEmu::ItemInstance* item_inst = database.CreateItem( + EQ::ItemInstance* item_inst = database.CreateItem( item_id, item_charges, (uint32)atoul(row[9]), @@ -1211,7 +1212,7 @@ bool BotDatabase::LoadItems(const uint32 bot_id, EQEmu::InventoryProfile& invent if (item_inst->GetItem()->Attuneable) { if (atoi(row[4])) item_inst->SetAttuned(true); - else if (slot_id >= EQEmu::invslot::EQUIPMENT_BEGIN && slot_id <= EQEmu::invslot::EQUIPMENT_END) + else if (slot_id >= EQ::invslot::EQUIPMENT_BEGIN && slot_id <= EQ::invslot::EQUIPMENT_END) item_inst->SetAttuned(true); } @@ -1279,9 +1280,9 @@ bool BotDatabase::LoadItemBySlot(Bot* bot_inst) bool BotDatabase::LoadItemBySlot(const uint32 bot_id, const uint32 slot_id, uint32& item_id) { - if (!bot_id || slot_id > EQEmu::invslot::EQUIPMENT_END) + if (!bot_id || slot_id > EQ::invslot::EQUIPMENT_END) return false; - + query = StringFormat("SELECT `item_id` FROM `bot_inventories` WHERE `bot_id` = '%i' AND `slot_id` = '%i' LIMIT 1", bot_id, slot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1295,9 +1296,9 @@ bool BotDatabase::LoadItemBySlot(const uint32 bot_id, const uint32 slot_id, uint return true; } -bool BotDatabase::SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQEmu::ItemInstance* item_inst) +bool BotDatabase::SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQ::ItemInstance* item_inst) { - if (!bot_inst || !bot_inst->GetBotID() || slot_id > EQEmu::invslot::EQUIPMENT_END) + if (!bot_inst || !bot_inst->GetBotID() || slot_id > EQ::invslot::EQUIPMENT_END) return false; if (!DeleteItemBySlot(bot_inst->GetBotID(), slot_id)) @@ -1305,11 +1306,10 @@ bool BotDatabase::SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQEm if (!item_inst || !item_inst->GetID()) return true; - - uint32 augment_id[EQEmu::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; - for (int augment_iter = EQEmu::invaug::SOCKET_BEGIN; augment_iter <= EQEmu::invaug::SOCKET_END; ++augment_iter) + uint32 augment_id[EQ::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; + for (int augment_iter = EQ::invaug::SOCKET_BEGIN; augment_iter <= EQ::invaug::SOCKET_END; ++augment_iter) augment_id[augment_iter] = item_inst->GetAugmentItemID(augment_iter); - + uint16 item_charges = 0; if (item_inst->GetCharges() >= 0) item_charges = item_inst->GetCharges(); @@ -1381,7 +1381,7 @@ bool BotDatabase::SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQEm bool BotDatabase::DeleteItemBySlot(const uint32 bot_id, const uint32 slot_id) { - if (!bot_id || slot_id > EQEmu::invslot::EQUIPMENT_END) + if (!bot_id || slot_id > EQ::invslot::EQUIPMENT_END) return false; query = StringFormat("DELETE FROM `bot_inventories` WHERE `bot_id` = '%u' AND `slot_id` = '%u'", bot_id, slot_id); @@ -1397,10 +1397,10 @@ bool BotDatabase::LoadEquipmentColor(const uint32 bot_id, const uint8 material_s if (!bot_id) return false; - int16 slot_id = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot_id); + int16 slot_id = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot_id); if (slot_id == INVALID_INDEX) return false; - + query = StringFormat("SELECT `inst_color` FROM `bot_inventories` WHERE `bot_id` = '%u' AND `slot_id` = '%u' LIMIT 1", bot_id, slot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1420,12 +1420,12 @@ bool BotDatabase::SaveEquipmentColor(const uint32 bot_id, const int16 slot_id, c return false; bool all_flag = (slot_id == -2); - if ((slot_id < EQEmu::invslot::EQUIPMENT_BEGIN || slot_id > EQEmu::invslot::EQUIPMENT_END) && !all_flag) + if ((slot_id < EQ::invslot::EQUIPMENT_BEGIN || slot_id > EQ::invslot::EQUIPMENT_END) && !all_flag) return false; std::string where_clause; if (all_flag) - where_clause = StringFormat(" AND `slot_id` IN ('%u', '%u', '%u', '%u', '%u', '%u', '%u')", EQEmu::invslot::slotHead, EQEmu::invslot::slotArms, EQEmu::invslot::slotWrist1, EQEmu::invslot::slotHands, EQEmu::invslot::slotChest, EQEmu::invslot::slotLegs, EQEmu::invslot::slotFeet); + where_clause = StringFormat(" AND `slot_id` IN ('%u', '%u', '%u', '%u', '%u', '%u', '%u')", EQ::invslot::slotHead, EQ::invslot::slotArms, EQ::invslot::slotWrist1, EQ::invslot::slotHands, EQ::invslot::slotChest, EQ::invslot::slotLegs, EQ::invslot::slotFeet); else where_clause = StringFormat(" AND `slot_id` = '%u'", slot_id); @@ -1451,7 +1451,7 @@ bool BotDatabase::LoadPetIndex(const uint32 bot_id, uint32& pet_index) { if (!bot_id) return false; - + query = StringFormat("SELECT `pets_index` FROM `bot_pets` WHERE `bot_id` = '%u' LIMIT 1", bot_id); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1461,7 +1461,7 @@ bool BotDatabase::LoadPetIndex(const uint32 bot_id, uint32& pet_index) auto row = results.begin(); pet_index = atoi(row[0]); - + return true; } @@ -1479,7 +1479,7 @@ bool BotDatabase::LoadPetSpellID(const uint32 bot_id, uint32& pet_spell_id) auto row = results.begin(); pet_spell_id = atoi(row[0]); - + return true; } @@ -1506,7 +1506,7 @@ bool BotDatabase::LoadPetStats(const uint32 bot_id, std::string& pet_name, uint3 pet_name = row[1]; pet_mana = atoi(row[2]); pet_hp = atoi(row[3]); - + return true; } @@ -1514,7 +1514,7 @@ bool BotDatabase::SavePetStats(const uint32 bot_id, const std::string& pet_name, { if (!bot_id || pet_name.empty() || !pet_spell_id || pet_spell_id > SPDAT_RECORDS) return false; - + if (!DeletePetItems(bot_id)) return false; if (!DeletePetBuffs(bot_id)) @@ -1607,14 +1607,14 @@ bool BotDatabase::LoadPetBuffs(const uint32 bot_id, SpellBuff_Struct* pet_buffs) ++buff_index; } - + return true; } bool BotDatabase::SavePetBuffs(const uint32 bot_id, const SpellBuff_Struct* pet_buffs, bool delete_flag) { // Only use 'delete_flag' if not invoked after a botdb.SavePetStats() call - + if (!bot_id || !pet_buffs) return false; @@ -1696,19 +1696,19 @@ bool BotDatabase::LoadPetItems(const uint32 bot_id, uint32* pet_items) if (!results.RowCount()) return true; - int item_index = EQEmu::invslot::EQUIPMENT_BEGIN; - for (auto row = results.begin(); row != results.end() && (item_index >= EQEmu::invslot::EQUIPMENT_BEGIN && item_index <= EQEmu::invslot::EQUIPMENT_END); ++row) { + int item_index = EQ::invslot::EQUIPMENT_BEGIN; + for (auto row = results.begin(); row != results.end() && (item_index >= EQ::invslot::EQUIPMENT_BEGIN && item_index <= EQ::invslot::EQUIPMENT_END); ++row) { pet_items[item_index] = atoi(row[0]); ++item_index; } - + return true; } bool BotDatabase::SavePetItems(const uint32 bot_id, const uint32* pet_items, bool delete_flag) { // Only use 'delete_flag' if not invoked after a botdb.SavePetStats() call - + if (!bot_id || !pet_items) return false; @@ -1721,7 +1721,7 @@ bool BotDatabase::SavePetItems(const uint32 bot_id, const uint32* pet_items, boo if (!saved_pet_index) return true; - for (int item_index = EQEmu::invslot::EQUIPMENT_BEGIN; item_index <= EQEmu::invslot::EQUIPMENT_END; ++item_index) { + for (int item_index = EQ::invslot::EQUIPMENT_BEGIN; item_index <= EQ::invslot::EQUIPMENT_END; ++item_index) { if (!pet_items[item_index]) continue; @@ -1777,7 +1777,7 @@ bool BotDatabase::LoadInspectMessage(const uint32 bot_id, InspectMessage_Struct& return true; memcpy(inspect_message.text, bot_message.c_str(), bot_message.size()); - + return true; } @@ -1785,7 +1785,7 @@ bool BotDatabase::SaveInspectMessage(const uint32 bot_id, const InspectMessage_S { if (!bot_id) return false; - + if (!DeleteInspectMessage(bot_id)) return false; @@ -1825,7 +1825,7 @@ bool BotDatabase::SaveAllInspectMessages(const uint32 owner_id, const InspectMes if (!DeleteAllInspectMessages(owner_id)) return false; - + std::string bot_message = inspect_message.text; if (bot_message.size() > 255) bot_message = bot_message.substr(0, 255); @@ -1870,7 +1870,7 @@ bool BotDatabase::SaveAllArmorColorBySlot(const uint32 owner_id, const int16 slo " AND bi.`slot_id` = '%i'", owner_id, rgb_value, - EQEmu::invslot::slotHead, EQEmu::invslot::slotChest, EQEmu::invslot::slotArms, EQEmu::invslot::slotWrist1, EQEmu::invslot::slotWrist2, EQEmu::invslot::slotHands, EQEmu::invslot::slotLegs, EQEmu::invslot::slotFeet, + EQ::invslot::slotHead, EQ::invslot::slotChest, EQ::invslot::slotArms, EQ::invslot::slotWrist1, EQ::invslot::slotWrist2, EQ::invslot::slotHands, EQ::invslot::slotLegs, EQ::invslot::slotFeet, slot_id ); auto results = database.QueryDatabase(query); @@ -1894,7 +1894,7 @@ bool BotDatabase::SaveAllArmorColors(const uint32 owner_id, const uint32 rgb_val " AND bi.`slot_id` IN ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", owner_id, rgb_value, - EQEmu::invslot::slotHead, EQEmu::invslot::slotChest, EQEmu::invslot::slotArms, EQEmu::invslot::slotWrist1, EQEmu::invslot::slotWrist2, EQEmu::invslot::slotHands, EQEmu::invslot::slotLegs, EQEmu::invslot::slotFeet + EQ::invslot::slotHead, EQ::invslot::slotChest, EQ::invslot::slotArms, EQ::invslot::slotWrist1, EQ::invslot::slotWrist2, EQ::invslot::slotHands, EQ::invslot::slotLegs, EQ::invslot::slotFeet ); auto results = database.QueryDatabase(query); if (!results.Success()) @@ -1907,7 +1907,7 @@ bool BotDatabase::SaveHelmAppearance(const uint32 owner_id, const uint32 bot_id, { if (!owner_id || !bot_id) return false; - + query = StringFormat( "UPDATE `bot_data`" " SET `show_helm` = '%u'" @@ -2025,7 +2025,7 @@ bool BotDatabase::CreateCloneBot(const uint32 owner_id, const uint32 bot_id, con { if (!owner_id || !bot_id || clone_name.empty()) return false; - + query = StringFormat( "INSERT INTO `bot_data`" " (" @@ -2198,7 +2198,7 @@ bool BotDatabase::CreateCloneBotInventory(const uint32 owner_id, const uint32 bo DeleteItems(clone_id); return false; } - + return true; } @@ -2237,7 +2237,7 @@ bool BotDatabase::LoadOwnerOptions(Client *owner) } for (auto row : results) { - + owner->SetBotOption(static_cast(atoul(row[0])), (atoul(row[1]) != 0)); } @@ -2369,7 +2369,7 @@ bool BotDatabase::LoadBotGroupIDByLeaderID(const uint32 leader_id, uint32& botgr auto row = results.begin(); botgroup_id = atoi(row[0]); - + return true; } @@ -2387,7 +2387,7 @@ bool BotDatabase::LoadBotGroupIDByMemberID(const uint32 member_id, uint32& botgr auto row = results.begin(); botgroup_id = atoi(row[0]); - + return true; } @@ -2405,7 +2405,7 @@ bool BotDatabase::LoadLeaderIDByBotGroupName(const std::string& group_name, uint auto row = results.begin(); leader_id = atoi(row[0]); - + return true; } @@ -2423,7 +2423,7 @@ bool BotDatabase::LoadLeaderIDByBotGroupID(const uint32 group_id, uint32& leader auto row = results.begin(); leader_id = atoi(row[0]); - + return true; } @@ -2441,7 +2441,7 @@ bool BotDatabase::LoadBotGroupNameByBotGroupID(const uint32 group_id, std::strin auto row = results.begin(); botgroup_name = row[0]; - + return true; } @@ -2459,7 +2459,7 @@ bool BotDatabase::LoadBotGroupNameByLeaderID(const uint32 leader_id, std::string auto row = results.begin(); botgroup_name = row[0]; - + return true; } @@ -2603,7 +2603,7 @@ bool BotDatabase::LoadBotGroup(const std::string& group_name, std::map= PLAYER_CLASS_COUNT) return 0; - if (stance_index >= EQEmu::constants::STANCE_TYPE_COUNT) + if (stance_index >= EQ::constants::STANCE_TYPE_COUNT) return 0; if (conditional_index >= cntHSND) return 0; diff --git a/zone/bot_database.h b/zone/bot_database.h index 82cf68f09..57cf185ce 100644 --- a/zone/bot_database.h +++ b/zone/bot_database.h @@ -32,7 +32,7 @@ class Client; struct BotsAvailableList; struct InspectMessage_Struct; -namespace EQEmu +namespace EQ { class ItemInstance; class InventoryProfile; @@ -85,13 +85,13 @@ public: /* Bot inventory functions */ bool QueryInventoryCount(const uint32 bot_id, uint32& item_count); - bool LoadItems(const uint32 bot_id, EQEmu::InventoryProfile &inventory_inst); + bool LoadItems(const uint32 bot_id, EQ::InventoryProfile &inventory_inst); bool SaveItems(Bot* bot_inst); bool DeleteItems(const uint32 bot_id); bool LoadItemBySlot(Bot* bot_inst); bool LoadItemBySlot(const uint32 bot_id, const uint32 slot_id, uint32& item_id); - bool SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQEmu::ItemInstance* item_inst); + bool SaveItemBySlot(Bot* bot_inst, const uint32 slot_id, const EQ::ItemInstance* item_inst); bool DeleteItemBySlot(const uint32 bot_id, const uint32 slot_id); bool LoadEquipmentColor(const uint32 bot_id, const uint8 material_slot_id, uint32& rgb); diff --git a/zone/botspellsai.cpp b/zone/botspellsai.cpp index 9acc8ac8b..e03c996fd 100644 --- a/zone/botspellsai.cpp +++ b/zone/botspellsai.cpp @@ -193,18 +193,18 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes) { float hpRatioToCast = 0.0f; switch(this->GetBotStance()) { - case EQEmu::constants::stanceEfficient: - case EQEmu::constants::stanceAggressive: + case EQ::constants::stanceEfficient: + case EQ::constants::stanceAggressive: hpRatioToCast = isPrimaryHealer?90.0f:50.0f; break; - case EQEmu::constants::stanceBalanced: + case EQ::constants::stanceBalanced: hpRatioToCast = isPrimaryHealer?95.0f:75.0f; break; - case EQEmu::constants::stanceReactive: + case EQ::constants::stanceReactive: hpRatioToCast = isPrimaryHealer?100.0f:90.0f; break; - case EQEmu::constants::stanceBurn: - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurn: + case EQ::constants::stanceBurnAE: hpRatioToCast = isPrimaryHealer?75.0f:25.0f; break; default: @@ -381,16 +381,16 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes) { float manaRatioToCast = 75.0f; switch(this->GetBotStance()) { - case EQEmu::constants::stanceEfficient: + case EQ::constants::stanceEfficient: manaRatioToCast = 90.0f; break; - case EQEmu::constants::stanceBalanced: - case EQEmu::constants::stanceAggressive: + case EQ::constants::stanceBalanced: + case EQ::constants::stanceAggressive: manaRatioToCast = 75.0f; break; - case EQEmu::constants::stanceReactive: - case EQEmu::constants::stanceBurn: - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceReactive: + case EQ::constants::stanceBurn: + case EQ::constants::stanceBurnAE: manaRatioToCast = 50.0f; break; default: @@ -460,18 +460,18 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes) { float manaRatioToCast = 75.0f; switch(this->GetBotStance()) { - case EQEmu::constants::stanceEfficient: + case EQ::constants::stanceEfficient: manaRatioToCast = 90.0f; break; - case EQEmu::constants::stanceBalanced: + case EQ::constants::stanceBalanced: manaRatioToCast = 75.0f; break; - case EQEmu::constants::stanceReactive: - case EQEmu::constants::stanceAggressive: + case EQ::constants::stanceReactive: + case EQ::constants::stanceAggressive: manaRatioToCast = 50.0f; break; - case EQEmu::constants::stanceBurn: - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurn: + case EQ::constants::stanceBurnAE: manaRatioToCast = 25.0f; break; default: @@ -1310,7 +1310,7 @@ bool Bot::AI_EngagedCastCheck() { AIautocastspell_timer->Disable(); //prevent the timer from going off AGAIN while we are casting. uint8 botClass = GetClass(); - EQEmu::constants::StanceType botStance = GetBotStance(); + EQ::constants::StanceType botStance = GetBotStance(); bool mayGetAggro = HasOrMayGetAggro(); LogAI("Engaged autocast check triggered (BOTS). Trying to cast healing spells then maybe offensive spells"); @@ -2653,11 +2653,11 @@ uint8 Bot::GetChanceToCastBySpellType(uint32 spellType) return 0; --class_index; - EQEmu::constants::StanceType stance_type = GetBotStance(); - if (stance_type < EQEmu::constants::stancePassive || stance_type > EQEmu::constants::stanceBurnAE) + EQ::constants::StanceType stance_type = GetBotStance(); + if (stance_type < EQ::constants::stancePassive || stance_type > EQ::constants::stanceBurnAE) return 0; - uint8 stance_index = EQEmu::constants::ConvertStanceTypeToIndex(stance_type); + uint8 stance_index = EQ::constants::ConvertStanceTypeToIndex(stance_type); uint8 type_index = nHSND; if (HasGroup()) { diff --git a/zone/client.cpp b/zone/client.cpp index 1c0226c40..2d6ad9994 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -40,9 +40,13 @@ extern volatile bool RunLoops; #include "../common/data_verification.h" #include "../common/profanity_manager.h" #include "data_bucket.h" +#include "expedition.h" +#include "expedition_database.h" +#include "expedition_request.h" #include "position.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" #include "petitions.h" #include "command.h" #include "water_map.h" @@ -55,6 +59,8 @@ extern volatile bool RunLoops; #include "quest_parser_collection.h" #include "queryserv.h" #include "mob_movement_manager.h" +#include "../common/content/world_content_service.h" +#include "../common/expedition_lockout_timer.h" extern QueryServ* QServ; extern EntityList entity_list; @@ -105,7 +111,7 @@ Client::Client(EQStreamInterface* ieqs) 0, // Drakkin Heritage 0, // Drakkin Tattoo 0, // Drakkin Details - EQEmu::TintProfile(), // Armor Tint + EQ::TintProfile(), // Armor Tint 0xff, // AA Title 0, // see_invis 0, // see_invis_undead @@ -137,7 +143,7 @@ Client::Client(EQStreamInterface* ieqs) endupkeep_timer(1000), forget_timer(0), autosave_timer(RuleI(Character, AutosaveIntervalS) * 1000), - client_scan_npc_aggro_timer(RuleI(Aggro, ClientAggroCheckInterval) * 1000), + client_scan_npc_aggro_timer(RuleI(Aggro, ClientAggroCheckIdleInterval)), client_zone_wide_full_position_update_timer(5 * 60 * 1000), tribute_timer(Tribute_duration), proximity_timer(ClientProximity_interval), @@ -157,7 +163,7 @@ Client::Client(EQStreamInterface* ieqs) helm_toggle_timer(250), aggro_meter_timer(AGGRO_METER_UPDATE_MS), m_Proximity(FLT_MAX, FLT_MAX, FLT_MAX), //arbitrary large number - m_ZoneSummonLocation(-2.0f,-2.0f,-2.0f), + m_ZoneSummonLocation(-2.0f,-2.0f,-2.0f,-2.0f), m_AutoAttackPosition(0.0f, 0.0f, 0.0f, 0.0f), m_AutoAttackTargetLocation(0.0f, 0.0f, 0.0f), last_region_type(RegionTypeUnsupported), @@ -252,15 +258,17 @@ Client::Client(EQStreamInterface* ieqs) tgb = false; tribute_master_id = 0xFFFFFFFF; tribute_timer.Disable(); - taskstate = nullptr; + task_state = nullptr; TotalSecondsPlayed = 0; keyring.clear(); bind_sight_target = nullptr; + p_raid_instance = nullptr; mercid = 0; mercSlot = 0; InitializeMercInfo(); SetMerc(0); if (RuleI(World, PVPMinLevel) > 0 && level >= RuleI(World, PVPMinLevel) && m_pp.pvp == 0) SetPVP(true, false); + dynamiczone_removal_timer.Disable(); //for good measure: memset(&m_pp, 0, sizeof(m_pp)); @@ -284,7 +292,7 @@ Client::Client(EQStreamInterface* ieqs) GlobalChatLimiterTimer = new Timer(RuleI(Chat, IntervalDurationMS)); AttemptedMessages = 0; TotalKarma = 0; - m_ClientVersion = EQEmu::versions::ClientVersion::Unknown; + m_ClientVersion = EQ::versions::ClientVersion::Unknown; m_ClientVersionBit = 0; AggroCount = 0; ooc_regen = false; @@ -347,8 +355,8 @@ Client::Client(EQStreamInterface* ieqs) /** * GM */ - display_mob_info_window = true; - dev_tools_window_enabled = true; + SetDisplayMobInfoWindow(true); + SetDevToolsEnabled(true); #ifdef BOTS bot_owner_options[booDeathMarquee] = false; @@ -433,7 +441,7 @@ Client::~Client() { if(IsHoveringForRespawn()) { - m_pp.zone_id = m_pp.binds[0].zoneId; + m_pp.zone_id = m_pp.binds[0].zone_id; m_pp.zoneInstance = m_pp.binds[0].instance_id; m_Position.x = m_pp.binds[0].x; m_Position.y = m_pp.binds[0].y; @@ -444,7 +452,7 @@ Client::~Client() { // will need this data right away Save(2); // This fails when database destructor is called first on shutdown - safe_delete(taskstate); + safe_delete(task_state); safe_delete(KarmaUpdateTimer); safe_delete(GlobalChatLimiterTimer); safe_delete(qGlobals); @@ -650,7 +658,7 @@ bool Client::Save(uint8 iCommitNow) { /* Save Current Bind Points */ for (int i = 0; i < 5; i++) - if (m_pp.binds[i].zoneId) + if (m_pp.binds[i].zone_id) database.SaveCharacterBindPoint(CharacterID(), m_pp.binds[i], i); /* Save Character Buffs */ @@ -684,6 +692,7 @@ bool Client::Save(uint8 iCommitNow) { pet->GetPetState(m_petinfo.Buffs, m_petinfo.Items, m_petinfo.Name); m_petinfo.petpower = pet->GetPetPower(); m_petinfo.size = pet->GetSize(); + m_petinfo.taunting = pet->CastToNPC()->IsTaunting(); } else { memset(&m_petinfo, 0, sizeof(struct PetInfo)); } @@ -747,7 +756,7 @@ bool Client::AddPacket(const EQApplicationPacket *pApp, bool bAckreq) { return(false); } - auto c = std::unique_ptr(new CLIENTPACKET); + auto c = std::make_unique(); c->ack_req = bAckreq; c->app = pApp->Copy(); @@ -764,7 +773,7 @@ bool Client::AddPacket(EQApplicationPacket** pApp, bool bAckreq) { //drop the packet because it will never get sent. return(false); } - auto c = std::unique_ptr(new CLIENTPACKET); + auto c = std::make_unique(); c->ack_req = bAckreq; c->app = *pApp; @@ -922,8 +931,8 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s } // Censor the message - if (EQEmu::ProfanityManager::IsCensorshipActive() && (chan_num != ChatChannel_Say)) - EQEmu::ProfanityManager::RedactMessage(message); + if (EQ::ProfanityManager::IsCensorshipActive() && (chan_num != ChatChannel_Say)) + EQ::ProfanityManager::RedactMessage(message); switch(chan_num) { @@ -1155,8 +1164,8 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s } #endif - if (EQEmu::ProfanityManager::IsCensorshipActive()) { - EQEmu::ProfanityManager::RedactMessage(message); + if (EQ::ProfanityManager::IsCensorshipActive()) { + EQ::ProfanityManager::RedactMessage(message); } Mob* sender = this; @@ -1506,8 +1515,8 @@ bool Client::UpdateLDoNPoints(int32 points, uint32 theme) return(false); } -void Client::SetSkill(EQEmu::skills::SkillType skillid, uint16 value) { - if (skillid > EQEmu::skills::HIGHEST_SKILL) +void Client::SetSkill(EQ::skills::SkillType skillid, uint16 value) { + if (skillid > EQ::skills::HIGHEST_SKILL) return; m_pp.skills[skillid] = value; // We need to be able to #setskill 254 and 255 to reset skills @@ -1543,8 +1552,8 @@ void Client::IncreaseLanguageSkill(int skill_id, int value) { MessageString( Chat::Skills, LANG_SKILL_IMPROVED ); //Notify client } -void Client::AddSkill(EQEmu::skills::SkillType skillid, uint16 value) { - if (skillid > EQEmu::skills::HIGHEST_SKILL) +void Client::AddSkill(EQ::skills::SkillType skillid, uint16 value) { + if (skillid > EQ::skills::HIGHEST_SKILL) return; value = GetRawSkill(skillid) + value; uint16 max = GetMaxSkillAfterSpecializationRules(skillid, MaxSkill(skillid)); @@ -1864,7 +1873,7 @@ void Client::CheckManaEndUpdate() { if (last_reported_mana != current_mana || last_reported_endurance != current_endurance) { - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) { SendManaUpdate(); SendEnduranceUpdate(); } @@ -1899,9 +1908,9 @@ void Client::CheckManaEndUpdate() { mana_update->cur_mana = GetMana(); mana_update->max_mana = GetMaxMana(); mana_update->spawn_id = GetID(); - if ((ClientVersionBit() & EQEmu::versions::ClientVersionBitmask::maskSoDAndLater) != 0) + if ((ClientVersionBit() & EQ::versions::ClientVersionBitmask::maskSoDAndLater) != 0) QueuePacket(mana_packet); // do we need this with the OP_ManaChange packet above? - entity_list.QueueClientsByXTarget(this, mana_packet, false, EQEmu::versions::ClientVersionBitmask::maskSoDAndLater); + entity_list.QueueClientsByXTarget(this, mana_packet, false, EQ::versions::ClientVersionBitmask::maskSoDAndLater); safe_delete(mana_packet); last_reported_mana_percent = this->GetManaPercent(); @@ -1918,15 +1927,15 @@ void Client::CheckManaEndUpdate() { else if (group) { group->SendEndurancePacketFrom(this); } - + auto endurance_packet = new EQApplicationPacket(OP_EnduranceUpdate, sizeof(EnduranceUpdate_Struct)); EnduranceUpdate_Struct* endurance_update = (EnduranceUpdate_Struct*)endurance_packet->pBuffer; endurance_update->cur_end = GetEndurance(); endurance_update->max_end = GetMaxEndurance(); endurance_update->spawn_id = GetID(); - if ((ClientVersionBit() & EQEmu::versions::ClientVersionBitmask::maskSoDAndLater) != 0) + if ((ClientVersionBit() & EQ::versions::ClientVersionBitmask::maskSoDAndLater) != 0) QueuePacket(endurance_packet); // do we need this with the OP_ManaChange packet above? - entity_list.QueueClientsByXTarget(this, endurance_packet, false, EQEmu::versions::ClientVersionBitmask::maskSoDAndLater); + entity_list.QueueClientsByXTarget(this, endurance_packet, false, EQ::versions::ClientVersionBitmask::maskSoDAndLater); safe_delete(endurance_packet); last_reported_endurance_percent = this->GetEndurancePercent(); @@ -1997,7 +2006,7 @@ void Client::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) UpdateEquipmentLight(); UpdateActiveLight(); - ns->spawn.light = m_Light.Type[EQEmu::lightsource::LightActive]; + ns->spawn.light = m_Light.Type[EQ::lightsource::LightActive]; } bool Client::GMHideMe(Client* client) { @@ -2106,7 +2115,7 @@ void Client::ReadBook(BookRequest_Struct *book) { out->window = book->window; - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { // Find out what slot the book was read from. // SoF+ need to look up book type for the output message. int16 read_from_slot; @@ -2120,9 +2129,9 @@ void Client::ReadBook(BookRequest_Struct *book) { read_from_slot = book->invslot -1; } - const EQEmu::ItemInstance *inst = nullptr; + const EQ::ItemInstance *inst = nullptr; - if (read_from_slot <= EQEmu::invbag::GENERAL_BAGS_END) + if (read_from_slot <= EQ::invbag::GENERAL_BAGS_END) { inst = m_inv[read_from_slot]; } @@ -2412,25 +2421,29 @@ uint64 Client::GetAllMoney() { (static_cast(m_pp.platinum_shared) * 1000))))); } -bool Client::CheckIncreaseSkill(EQEmu::skills::SkillType skillid, Mob *against_who, int chancemodi) { +bool Client::CheckIncreaseSkill(EQ::skills::SkillType skillid, Mob *against_who, int chancemodi) { if (IsDead() || IsUnconscious()) return false; if (IsAIControlled()) // no skillups while chamred =p return false; - if (skillid > EQEmu::skills::HIGHEST_SKILL) + if (skillid > EQ::skills::HIGHEST_SKILL) return false; int skillval = GetRawSkill(skillid); int maxskill = GetMaxSkillAfterSpecializationRules(skillid, MaxSkill(skillid)); char buffer[24] = { 0 }; snprintf(buffer, 23, "%d %d", skillid, skillval); parse->EventPlayer(EVENT_USE_SKILL, this, buffer, 0); - if(against_who) - { - if(against_who->GetSpecialAbility(IMMUNE_AGGRO) || against_who->IsClient() || - GetLevelCon(against_who->GetLevel()) == CON_GRAY) - { + if (against_who) { + if ( + against_who->GetSpecialAbility(IMMUNE_AGGRO) || + against_who->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) || + against_who->IsClient() || + GetLevelCon(against_who->GetLevel()) == CON_GRAY + ) { //false by default - if( !mod_can_increase_skill(skillid, against_who) ) { return(false); } + if (!mod_can_increase_skill(skillid, against_who)) { + return false; + } } } @@ -2484,34 +2497,34 @@ void Client::CheckLanguageSkillIncrease(uint8 langid, uint8 TeacherSkill) { } } -bool Client::HasSkill(EQEmu::skills::SkillType skill_id) const { +bool Client::HasSkill(EQ::skills::SkillType skill_id) const { return((GetSkill(skill_id) > 0) && CanHaveSkill(skill_id)); } -bool Client::CanHaveSkill(EQEmu::skills::SkillType skill_id) const { - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF2 && class_ == BERSERKER && skill_id == EQEmu::skills::Skill1HPiercing) - skill_id = EQEmu::skills::Skill2HPiercing; +bool Client::CanHaveSkill(EQ::skills::SkillType skill_id) const { + if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == BERSERKER && skill_id == EQ::skills::Skill1HPiercing) + skill_id = EQ::skills::Skill2HPiercing; - return(database.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)) > 0); + return(content_db.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)) > 0); //if you don't have it by max level, then odds are you never will? } -uint16 Client::MaxSkill(EQEmu::skills::SkillType skillid, uint16 class_, uint16 level) const { - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF2 && class_ == BERSERKER && skillid == EQEmu::skills::Skill1HPiercing) - skillid = EQEmu::skills::Skill2HPiercing; +uint16 Client::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { + if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == BERSERKER && skillid == EQ::skills::Skill1HPiercing) + skillid = EQ::skills::Skill2HPiercing; - return(database.GetSkillCap(class_, skillid, level)); + return(content_db.GetSkillCap(class_, skillid, level)); } -uint8 Client::SkillTrainLevel(EQEmu::skills::SkillType skillid, uint16 class_) +uint8 Client::SkillTrainLevel(EQ::skills::SkillType skillid, uint16 class_) { - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF2 && class_ == BERSERKER && skillid == EQEmu::skills::Skill1HPiercing) - skillid = EQEmu::skills::Skill2HPiercing; + if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == BERSERKER && skillid == EQ::skills::Skill1HPiercing) + skillid = EQ::skills::Skill2HPiercing; - return(database.GetTrainLevel(class_, skillid, RuleI(Character, MaxLevel))); + return(content_db.GetTrainLevel(class_, skillid, RuleI(Character, MaxLevel))); } -uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skillid, uint16 maxSkill) +uint16 Client::GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill) { uint16 Result = maxSkill; @@ -2521,13 +2534,13 @@ uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skil uint16 MaxSpecializations = GetAA(aaSecondaryForte) ? 2 : 1; - if (skillid >= EQEmu::skills::SkillSpecializeAbjure && skillid <= EQEmu::skills::SkillSpecializeEvocation) + if (skillid >= EQ::skills::SkillSpecializeAbjure && skillid <= EQ::skills::SkillSpecializeEvocation) { bool HasPrimarySpecSkill = false; int NumberOfPrimarySpecSkills = 0; - for (int i = EQEmu::skills::SkillSpecializeAbjure; i <= EQEmu::skills::SkillSpecializeEvocation; ++i) + for (int i = EQ::skills::SkillSpecializeAbjure; i <= EQ::skills::SkillSpecializeEvocation; ++i) { if(m_pp.skills[i] > 50) { @@ -2584,8 +2597,8 @@ uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skil Message(Chat::Red, "Your spell casting specializations skills have been reset. " "Only %i primary specialization skill is allowed.", MaxSpecializations); - for (int i = EQEmu::skills::SkillSpecializeAbjure; i <= EQEmu::skills::SkillSpecializeEvocation; ++i) - SetSkill((EQEmu::skills::SkillType)i, 1); + for (int i = EQ::skills::SkillSpecializeAbjure; i <= EQ::skills::SkillSpecializeEvocation; ++i) + SetSkill((EQ::skills::SkillType)i, 1); Save(); @@ -2598,7 +2611,7 @@ uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skil Result += spellbonuses.RaiseSkillCap[skillid] + itembonuses.RaiseSkillCap[skillid] + aabonuses.RaiseSkillCap[skillid]; - if (skillid == EQEmu::skills::SkillType::SkillForage) + if (skillid == EQ::skills::SkillType::SkillForage) Result += aabonuses.GrantForage; return Result; @@ -2649,9 +2662,9 @@ bool Client::CheckAccess(int16 iDBLevel, int16 iDefaultLevel) { } void Client::MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing){ - if (slot < 0 || slot >= EQEmu::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize) + if (slot < 0 || slot >= EQ::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize) return; - if ((spellid < 3 || spellid > EQEmu::spells::DynamicLookup(ClientVersion(), GetGM())->SpellIdMax) && spellid != 0xFFFFFFFF) + if ((spellid < 3 || spellid > EQ::spells::DynamicLookup(ClientVersion(), GetGM())->SpellIdMax) && spellid != 0xFFFFFFFF) return; auto outapp = new EQApplicationPacket(OP_MemorizeSpell, sizeof(MemorizeSpell_Struct)); @@ -2680,7 +2693,7 @@ void Client::SetFeigned(bool in_feigned) { feigned=in_feigned; } -void Client::LogMerchant(Client* player, Mob* merchant, uint32 quantity, uint32 price, const EQEmu::ItemData* item, bool buying) +void Client::LogMerchant(Client* player, Mob* merchant, uint32 quantity, uint32 price, const EQ::ItemData* item, bool buying) { if(!player || !merchant || !item) return; @@ -2710,25 +2723,25 @@ void Client::LogMerchant(Client* player, Mob* merchant, uint32 quantity, uint32 } void Client::Disarm(Client* disarmer, int chance) { - int16 slot = EQEmu::invslot::SLOT_INVALID; - const EQEmu::ItemInstance *inst = this->GetInv().GetItem(EQEmu::invslot::slotPrimary); + int16 slot = EQ::invslot::SLOT_INVALID; + const EQ::ItemInstance *inst = this->GetInv().GetItem(EQ::invslot::slotPrimary); if (inst && inst->IsWeapon()) { - slot = EQEmu::invslot::slotPrimary; + slot = EQ::invslot::slotPrimary; } else { - inst = this->GetInv().GetItem(EQEmu::invslot::slotSecondary); + inst = this->GetInv().GetItem(EQ::invslot::slotSecondary); if (inst && inst->IsWeapon()) - slot = EQEmu::invslot::slotSecondary; + slot = EQ::invslot::slotSecondary; } - if (slot != EQEmu::invslot::SLOT_INVALID && inst->IsClassCommon()) { + if (slot != EQ::invslot::SLOT_INVALID && inst->IsClassCommon()) { // We have an item that can be disarmed. if (zone->random.Int(0, 1000) <= chance) { // Find a free inventory slot - int16 slot_id = EQEmu::invslot::SLOT_INVALID; - slot_id = m_inv.FindFreeSlot(false, true, inst->GetItem()->Size, (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow)); - if (slot_id != EQEmu::invslot::SLOT_INVALID) + int16 slot_id = EQ::invslot::SLOT_INVALID; + slot_id = m_inv.FindFreeSlot(false, true, inst->GetItem()->Size, (inst->GetItem()->ItemType == EQ::item::ItemTypeArrow)); + if (slot_id != EQ::invslot::SLOT_INVALID) { - EQEmu::ItemInstance *InvItem = m_inv.PopItem(slot); + EQ::ItemInstance *InvItem = m_inv.PopItem(slot); if (InvItem) { // there should be no way it is not there, but check anyway EQApplicationPacket* outapp = new EQApplicationPacket(OP_MoveItem, sizeof(MoveItem_Struct)); MoveItem_Struct* mi = (MoveItem_Struct*)outapp->pBuffer; @@ -2741,22 +2754,22 @@ void Client::Disarm(Client* disarmer, int chance) { FastQueuePacket(&outapp); // this deletes item from the weapon slot on the client if (PutItemInInventory(slot_id, *InvItem, true)) database.SaveInventory(this->CharacterID(), NULL, slot); - auto matslot = (slot == EQEmu::invslot::slotPrimary ? EQEmu::textures::weaponPrimary : EQEmu::textures::weaponSecondary); - if (matslot != EQEmu::textures::materialInvalid) + auto matslot = (slot == EQ::invslot::slotPrimary ? EQ::textures::weaponPrimary : EQ::textures::weaponSecondary); + if (matslot != EQ::textures::materialInvalid) SendWearChange(matslot); } MessageString(Chat::Skills, DISARMED); if (disarmer != this) disarmer->MessageString(Chat::Skills, DISARM_SUCCESS, this->GetCleanName()); if (chance != 1000) - disarmer->CheckIncreaseSkill(EQEmu::skills::SkillDisarm, nullptr, 4); + disarmer->CheckIncreaseSkill(EQ::skills::SkillDisarm, nullptr, 4); CalcBonuses(); // CalcEnduranceWeightFactor(); return; } disarmer->MessageString(Chat::Skills, DISARM_FAILED); if (chance != 1000) - disarmer->CheckIncreaseSkill(EQEmu::skills::SkillDisarm, nullptr, 2); + disarmer->CheckIncreaseSkill(EQ::skills::SkillDisarm, nullptr, 2); return; } } @@ -2772,7 +2785,7 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) // Start bind if (!bindwound_timer.Enabled()) { // make sure we actually have a bandage... and consume it. - int16 bslot = m_inv.HasItemByUse(EQEmu::item::ItemTypeBandage, 1, invWhereWorn | invWherePersonal); + int16 bslot = m_inv.HasItemByUse(EQ::item::ItemTypeBandage, 1, invWhereWorn | invWherePersonal); if (bslot == INVALID_INDEX) { bind_out->type = 3; QueuePacket(outapp); @@ -2838,7 +2851,7 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) bind_out->type = 1; // Done QueuePacket(outapp); bind_out->type = 0; - CheckIncreaseSkill(EQEmu::skills::SkillBindWound, nullptr, 5); + CheckIncreaseSkill(EQ::skills::SkillBindWound, nullptr, 5); if (RuleB(Character, UseOldBindWound)) { int maxHPBonus = spellbonuses.MaxBindWound + itembonuses.MaxBindWound + @@ -2846,7 +2859,7 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) int max_percent = 50 + maxHPBonus; - if (GetClass() == MONK && GetSkill(EQEmu::skills::SkillBindWound) > 200) { + if (GetClass() == MONK && GetSkill(EQ::skills::SkillBindWound) > 200) { max_percent = 70 + maxHPBonus; } @@ -2859,11 +2872,11 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) // 0.120 per skill point, 0.60 per skill level, minimum 3 max 30 int bindhps = 3; - if (GetSkill(EQEmu::skills::SkillBindWound) > 200) { - bindhps += GetSkill(EQEmu::skills::SkillBindWound) * 4 / 10; + if (GetSkill(EQ::skills::SkillBindWound) > 200) { + bindhps += GetSkill(EQ::skills::SkillBindWound) * 4 / 10; } - else if (GetSkill(EQEmu::skills::SkillBindWound) >= 10) { - bindhps += GetSkill(EQEmu::skills::SkillBindWound) / 4; + else if (GetSkill(EQ::skills::SkillBindWound) >= 10) { + bindhps += GetSkill(EQ::skills::SkillBindWound) / 4; } // Implementation of aaMithanielsBinding is a guess (the multiplier) @@ -2898,7 +2911,7 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) } else { int percent_base = 50; - if (GetRawSkill(EQEmu::skills::SkillBindWound) > 200) { + if (GetRawSkill(EQ::skills::SkillBindWound) > 200) { if ((GetClass() == MONK) || (GetClass() == BEASTLORD)) percent_base = 70; else if ((GetLevel() > 50) && ((GetClass() == WARRIOR) || (GetClass() == ROGUE) || (GetClass() == CLERIC))) @@ -2924,9 +2937,9 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) if (bindmob->GetHP() < bindmob->GetMaxHP() && bindmob->GetHP() < max_hp) { int bindhps = 3; // base bind hp if (percent_base >= 70) - bindhps = (GetSkill(EQEmu::skills::SkillBindWound) * 4) / 10; // 8:5 skill-to-hp ratio - else if (GetSkill(EQEmu::skills::SkillBindWound) >= 12) - bindhps = GetSkill(EQEmu::skills::SkillBindWound) / 4; // 4:1 skill-to-hp ratio + bindhps = (GetSkill(EQ::skills::SkillBindWound) * 4) / 10; // 8:5 skill-to-hp ratio + else if (GetSkill(EQ::skills::SkillBindWound) >= 12) + bindhps = GetSkill(EQ::skills::SkillBindWound) / 4; // 4:1 skill-to-hp ratio int bonus_hp_percent = 0; if (percent_base >= 70) @@ -2982,10 +2995,10 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail) void Client::SetMaterial(int16 in_slot, uint32 item_id) { - const EQEmu::ItemData *item = database.GetItem(item_id); + const EQ::ItemData *item = database.GetItem(item_id); if (item && item->IsClassCommon()) { - uint8 matslot = EQEmu::InventoryProfile::CalcMaterialFromSlot(in_slot); - if (matslot != EQEmu::textures::materialInvalid) { + uint8 matslot = EQ::InventoryProfile::CalcMaterialFromSlot(in_slot); + if (matslot != EQ::textures::materialInvalid) { m_pp.item_material.Slot[matslot].Material = GetEquipmentMaterial(matslot); } } @@ -3069,7 +3082,7 @@ void Client::ServerFilter(SetServerFilter_Struct* filter){ Filter0(FilterMissedMe); Filter1(FilterDamageShields); - if (ClientVersionBit() & EQEmu::versions::maskSoDAndLater) { + if (ClientVersionBit() & EQ::versions::maskSoDAndLater) { if (filter->filters[FilterDOT] == 0) ClientFilters[FilterDOT] = FilterShow; else if (filter->filters[FilterDOT] == 1) @@ -3090,7 +3103,7 @@ void Client::ServerFilter(SetServerFilter_Struct* filter){ Filter1(FilterFocusEffects); Filter1(FilterPetSpells); - if (ClientVersionBit() & EQEmu::versions::maskSoDAndLater) { + if (ClientVersionBit() & EQ::versions::maskSoDAndLater) { if (filter->filters[FilterHealOverTime] == 0) ClientFilters[FilterHealOverTime] = FilterShow; // This is called 'Show Mine Only' in the clients, but functions the same as show @@ -3148,53 +3161,58 @@ void Client::MessageString(uint32 type, uint32 string_id, const char* message1, if (GetFilter(FilterDamageShields) == FilterHide && type == Chat::DamageShield) return; - int i = 0, argcount = 0, length = 0; - char *bufptr = nullptr; - const char *message_arg[9] = {0}; + if (type == Chat::Emote) + type = 4; - if(type==Chat::Emote) - type=4; - - if(!message1) - { + if (!message1) { MessageString(type, string_id); // use the simple message instead return; } - message_arg[i++] = message1; - message_arg[i++] = message2; - message_arg[i++] = message3; - message_arg[i++] = message4; - message_arg[i++] = message5; - message_arg[i++] = message6; - message_arg[i++] = message7; - message_arg[i++] = message8; - message_arg[i++] = message9; + const char *message_arg[] = { + message1, message2, message3, message4, message5, + message6, message7, message8, message9 + }; - for(; message_arg[argcount]; ++argcount) - length += strlen(message_arg[argcount]) + 1; - - length += 1; - - auto outapp = new EQApplicationPacket(OP_FormattedMessage, sizeof(FormattedMessage_Struct) + length); - FormattedMessage_Struct *fm = (FormattedMessage_Struct *)outapp->pBuffer; - fm->string_id = string_id; - fm->type = type; - bufptr = fm->message; - for(i = 0; i < argcount; i++) - { - strcpy(bufptr, message_arg[i]); - bufptr += strlen(message_arg[i]) + 1; + SerializeBuffer buf(20); + buf.WriteInt32(0); // unknown + buf.WriteInt32(string_id); + buf.WriteInt32(type); + for (auto &m : message_arg) { + if (m == nullptr) + break; + buf.WriteString(m); } - // since we're moving the pointer the 0 offset is correct - bufptr[0] = '\0'; + buf.WriteInt8(0); // prevent oob in packet translation, maybe clean that up sometime - if(distance>0) - entity_list.QueueCloseClients(this,outapp,false,distance); + auto outapp = std::make_unique(OP_FormattedMessage, buf); + + if (distance > 0) + entity_list.QueueCloseClients(this, outapp.get(), false, distance); else - QueuePacket(outapp); - safe_delete(outapp); + QueuePacket(outapp.get()); +} + +void Client::MessageString(const CZClientMessageString_Struct* msg) +{ + if (msg) + { + if (msg->args_size == 0) + { + MessageString(msg->chat_type, msg->string_id); + } + else + { + uint32_t outsize = sizeof(FormattedMessage_Struct) + msg->args_size; + auto outapp = std::make_unique(OP_FormattedMessage, outsize); + auto outbuf = reinterpret_cast(outapp->pBuffer); + outbuf->string_id = msg->string_id; + outbuf->type = msg->chat_type; + memcpy(outbuf->message, msg->args, msg->args_size); + QueuePacket(outapp.get()); + } + } } // helper function, returns true if we should see the message @@ -3263,10 +3281,6 @@ void Client::FilteredMessageString(Mob *sender, uint32 type, eqFilterType filter if (!FilteredMessageCheck(sender, filter)) return; - int i = 0, argcount = 0, length = 0; - char *bufptr = nullptr; - const char *message_arg[9] = {0}; - if (type == Chat::Emote) type = 4; @@ -3275,36 +3289,26 @@ void Client::FilteredMessageString(Mob *sender, uint32 type, eqFilterType filter return; } - message_arg[i++] = message1; - message_arg[i++] = message2; - message_arg[i++] = message3; - message_arg[i++] = message4; - message_arg[i++] = message5; - message_arg[i++] = message6; - message_arg[i++] = message7; - message_arg[i++] = message8; - message_arg[i++] = message9; + const char *message_arg[] = { + message1, message2, message3, message4, message5, + message6, message7, message8, message9 + }; - for (; message_arg[argcount]; ++argcount) - length += strlen(message_arg[argcount]) + 1; - - length += 1; - - auto outapp = new EQApplicationPacket(OP_FormattedMessage, sizeof(FormattedMessage_Struct) + length); - FormattedMessage_Struct *fm = (FormattedMessage_Struct *)outapp->pBuffer; - fm->string_id = string_id; - fm->type = type; - bufptr = fm->message; - for (i = 0; i < argcount; i++) { - strcpy(bufptr, message_arg[i]); - bufptr += strlen(message_arg[i]) + 1; + SerializeBuffer buf(20); + buf.WriteInt32(0); // unknown + buf.WriteInt32(string_id); + buf.WriteInt32(type); + for (auto &m : message_arg) { + if (m == nullptr) + break; + buf.WriteString(m); } - // since we're moving the pointer the 0 offset is correct - bufptr[0] = '\0'; + buf.WriteInt8(0); // prevent oob in packet translation, maybe clean that up sometime - QueuePacket(outapp); - safe_delete(outapp); + auto outapp = std::make_unique(OP_FormattedMessage, buf); + + QueuePacket(outapp.get()); } void Client::Tell_StringID(uint32 string_id, const char *who, const char *message) @@ -3316,17 +3320,17 @@ void Client::Tell_StringID(uint32 string_id, const char *who, const char *messag } void Client::SetTint(int16 in_slot, uint32 color) { - EQEmu::textures::Tint_Struct new_color; + EQ::textures::Tint_Struct new_color; new_color.Color = color; SetTint(in_slot, new_color); database.SaveCharacterMaterialColor(this->CharacterID(), in_slot, color); } // Still need to reconcile bracer01 versus bracer02 -void Client::SetTint(int16 in_slot, EQEmu::textures::Tint_Struct& color) { +void Client::SetTint(int16 in_slot, EQ::textures::Tint_Struct& color) { - uint8 matslot = EQEmu::InventoryProfile::CalcMaterialFromSlot(in_slot); - if (matslot != EQEmu::textures::materialInvalid) + uint8 matslot = EQ::InventoryProfile::CalcMaterialFromSlot(in_slot); + if (matslot != EQ::textures::materialInvalid) { m_pp.item_tint.Slot[matslot].Color = color.Color; database.SaveCharacterMaterialColor(this->CharacterID(), in_slot, color.Color); @@ -3393,6 +3397,13 @@ void Client::LinkDead() if(raid){ raid->MemberZoned(this); } + + Expedition* expedition = GetExpedition(); + if (expedition) + { + expedition->SetMemberStatus(this, DynamicZoneMemberStatus::LinkDead); + } + // save_timer.Start(2500); linkdead_timer.Start(RuleI(Zone,ClientLinkdeadMS)); SendAppearancePacket(AT_Linkdead, 1); @@ -3403,28 +3414,28 @@ void Client::LinkDead() uint8 Client::SlotConvert(uint8 slot,bool bracer){ uint8 slot2 = 0; // why are we returning MainCharm instead of INVALID_INDEX? (must be a pre-charm segment...) if(bracer) - return EQEmu::invslot::slotWrist2; + return EQ::invslot::slotWrist2; switch(slot) { - case EQEmu::textures::armorHead: - slot2 = EQEmu::invslot::slotHead; + case EQ::textures::armorHead: + slot2 = EQ::invslot::slotHead; break; - case EQEmu::textures::armorChest: - slot2 = EQEmu::invslot::slotChest; + case EQ::textures::armorChest: + slot2 = EQ::invslot::slotChest; break; - case EQEmu::textures::armorArms: - slot2 = EQEmu::invslot::slotArms; + case EQ::textures::armorArms: + slot2 = EQ::invslot::slotArms; break; - case EQEmu::textures::armorWrist: - slot2 = EQEmu::invslot::slotWrist1; + case EQ::textures::armorWrist: + slot2 = EQ::invslot::slotWrist1; break; - case EQEmu::textures::armorHands: - slot2 = EQEmu::invslot::slotHands; + case EQ::textures::armorHands: + slot2 = EQ::invslot::slotHands; break; - case EQEmu::textures::armorLegs: - slot2 = EQEmu::invslot::slotLegs; + case EQ::textures::armorLegs: + slot2 = EQ::invslot::slotLegs; break; - case EQEmu::textures::armorFeet: - slot2 = EQEmu::invslot::slotFeet; + case EQ::textures::armorFeet: + slot2 = EQ::invslot::slotFeet; break; } return slot2; @@ -3433,26 +3444,26 @@ uint8 Client::SlotConvert(uint8 slot,bool bracer){ uint8 Client::SlotConvert2(uint8 slot){ uint8 slot2 = 0; // same as above... switch(slot){ - case EQEmu::invslot::slotHead: - slot2 = EQEmu::textures::armorHead; + case EQ::invslot::slotHead: + slot2 = EQ::textures::armorHead; break; - case EQEmu::invslot::slotChest: - slot2 = EQEmu::textures::armorChest; + case EQ::invslot::slotChest: + slot2 = EQ::textures::armorChest; break; - case EQEmu::invslot::slotArms: - slot2 = EQEmu::textures::armorArms; + case EQ::invslot::slotArms: + slot2 = EQ::textures::armorArms; break; - case EQEmu::invslot::slotWrist1: - slot2 = EQEmu::textures::armorWrist; + case EQ::invslot::slotWrist1: + slot2 = EQ::textures::armorWrist; break; - case EQEmu::invslot::slotHands: - slot2 = EQEmu::textures::armorHands; + case EQ::invslot::slotHands: + slot2 = EQ::textures::armorHands; break; - case EQEmu::invslot::slotLegs: - slot2 = EQEmu::textures::armorLegs; + case EQ::invslot::slotLegs: + slot2 = EQ::textures::armorLegs; break; - case EQEmu::invslot::slotFeet: - slot2 = EQEmu::textures::armorFeet; + case EQ::invslot::slotFeet: + slot2 = EQ::textures::armorFeet; break; } return slot2; @@ -3948,7 +3959,7 @@ void Client::Sacrifice(Client *caster) Death_Struct *d = (Death_Struct *)app.pBuffer; d->spawn_id = GetID(); d->killer_id = caster ? caster->GetID() : 0; - d->bindzoneid = GetPP().binds[0].zoneId; + d->bindzoneid = GetPP().binds[0].zone_id; d->spell_id = SPELL_UNKNOWN; d->attack_skill = 0xe7; d->damage = 0; @@ -3996,7 +4007,7 @@ void Client::SendOPTranslocateConfirm(Mob *Caster, uint16 SpellID) { PendingTranslocateData.spell_id = ts->SpellID = SpellID; if((SpellID == 1422) || (SpellID == 1334) || (SpellID == 3243)) { - PendingTranslocateData.zone_id = ts->ZoneID = m_pp.binds[0].zoneId; + PendingTranslocateData.zone_id = ts->ZoneID = m_pp.binds[0].zone_id; PendingTranslocateData.instance_id = m_pp.binds[0].instance_id; PendingTranslocateData.x = ts->x = m_pp.binds[0].x; PendingTranslocateData.y = ts->y = m_pp.binds[0].y; @@ -4004,7 +4015,7 @@ void Client::SendOPTranslocateConfirm(Mob *Caster, uint16 SpellID) { PendingTranslocateData.heading = m_pp.binds[0].heading; } else { - PendingTranslocateData.zone_id = ts->ZoneID = content_db.GetZoneID(Spell.teleport_zone); + PendingTranslocateData.zone_id = ts->ZoneID = ZoneID(Spell.teleport_zone); PendingTranslocateData.instance_id = 0; PendingTranslocateData.y = ts->y = Spell.base[0]; PendingTranslocateData.x = ts->x = Spell.base[1]; @@ -4023,13 +4034,13 @@ void Client::SendOPTranslocateConfirm(Mob *Caster, uint16 SpellID) { return; } -void Client::SendPickPocketResponse(Mob *from, uint32 amt, int type, const EQEmu::ItemData* item){ +void Client::SendPickPocketResponse(Mob *from, uint32 amt, int type, const EQ::ItemData* item){ auto outapp = new EQApplicationPacket(OP_PickPocket, sizeof(sPickPocket_Struct)); sPickPocket_Struct *pick_out = (sPickPocket_Struct *)outapp->pBuffer; pick_out->coin = amt; pick_out->from = GetID(); pick_out->to = from->GetID(); - pick_out->myskill = GetSkill(EQEmu::skills::SkillPickPockets); + pick_out->myskill = GetSkill(EQ::skills::SkillPickPockets); if ((type >= PickPocketPlatinum) && (type <= PickPocketCopper) && (amt == 0)) type = PickPocketFailed; @@ -4270,7 +4281,7 @@ bool Client::KeyRingCheck(uint32 item_id) void Client::KeyRingList() { Message(Chat::LightBlue,"Keys on Keyring:"); - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; for (auto iter = keyring.begin(); iter != keyring.end(); ++iter) { if ((item = database.GetItem(*iter))!=nullptr) { Message(Chat::LightBlue,item->Name); @@ -4456,7 +4467,7 @@ bool Client::GroupFollow(Client* inviter) { group->UpdateGroupAAs(); //Invite the inviter into the group first.....dont ask - if (inviter->ClientVersion() < EQEmu::versions::ClientVersion::SoD) + if (inviter->ClientVersion() < EQ::versions::ClientVersion::SoD) { auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); GroupJoin_Struct* outgj = (GroupJoin_Struct*)outapp->pBuffer; @@ -4504,13 +4515,13 @@ bool Client::GroupFollow(Client* inviter) { return false; } - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) { SendGroupJoinAcknowledge(); } // Temporary hack for SoD, as things seem to work quite differently - if (inviter->IsClient() && inviter->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (inviter->IsClient() && inviter->ClientVersion() >= EQ::versions::ClientVersion::SoD) { database.RefreshGroupFromDB(inviter); } @@ -4538,43 +4549,43 @@ bool Client::GroupFollow(Client* inviter) { uint16 Client::GetPrimarySkillValue() { - EQEmu::skills::SkillType skill = EQEmu::skills::HIGHEST_SKILL; //because nullptr == 0, which is 1H Slashing, & we want it to return 0 from GetSkill - bool equiped = m_inv.GetItem(EQEmu::invslot::slotPrimary); + EQ::skills::SkillType skill = EQ::skills::HIGHEST_SKILL; //because nullptr == 0, which is 1H Slashing, & we want it to return 0 from GetSkill + bool equiped = m_inv.GetItem(EQ::invslot::slotPrimary); if (!equiped) - skill = EQEmu::skills::SkillHandtoHand; + skill = EQ::skills::SkillHandtoHand; else { - uint8 type = m_inv.GetItem(EQEmu::invslot::slotPrimary)->GetItem()->ItemType; //is this the best way to do this? + uint8 type = m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->ItemType; //is this the best way to do this? switch (type) { - case EQEmu::item::ItemType1HSlash: // 1H Slashing - skill = EQEmu::skills::Skill1HSlashing; + case EQ::item::ItemType1HSlash: // 1H Slashing + skill = EQ::skills::Skill1HSlashing; break; - case EQEmu::item::ItemType2HSlash: // 2H Slashing - skill = EQEmu::skills::Skill2HSlashing; + case EQ::item::ItemType2HSlash: // 2H Slashing + skill = EQ::skills::Skill2HSlashing; break; - case EQEmu::item::ItemType1HPiercing: // Piercing - skill = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType1HPiercing: // Piercing + skill = EQ::skills::Skill1HPiercing; break; - case EQEmu::item::ItemType1HBlunt: // 1H Blunt - skill = EQEmu::skills::Skill1HBlunt; + case EQ::item::ItemType1HBlunt: // 1H Blunt + skill = EQ::skills::Skill1HBlunt; break; - case EQEmu::item::ItemType2HBlunt: // 2H Blunt - skill = EQEmu::skills::Skill2HBlunt; + case EQ::item::ItemType2HBlunt: // 2H Blunt + skill = EQ::skills::Skill2HBlunt; break; - case EQEmu::item::ItemType2HPiercing: // 2H Piercing - if (IsClient() && CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::RoF2) - skill = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType2HPiercing: // 2H Piercing + if (IsClient() && CastToClient()->ClientVersion() < EQ::versions::ClientVersion::RoF2) + skill = EQ::skills::Skill1HPiercing; else - skill = EQEmu::skills::Skill2HPiercing; + skill = EQ::skills::Skill2HPiercing; break; - case EQEmu::item::ItemTypeMartial: // Hand to Hand - skill = EQEmu::skills::SkillHandtoHand; + case EQ::item::ItemTypeMartial: // Hand to Hand + skill = EQ::skills::SkillHandtoHand; break; default: // All other types default to Hand to Hand - skill = EQEmu::skills::SkillHandtoHand; + skill = EQ::skills::SkillHandtoHand; break; } } @@ -4588,7 +4599,7 @@ uint32 Client::GetTotalATK() uint32 WornCap = itembonuses.ATK; if(IsClient()) { - AttackRating = ((WornCap * 1.342) + (GetSkill(EQEmu::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69)); + AttackRating = ((WornCap * 1.342) + (GetSkill(EQ::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69)); AttackRating += aabonuses.ATK + GroupLeadershipAAOffenseEnhancement(); if (AttackRating < 10) @@ -4606,7 +4617,7 @@ uint32 Client::GetATKRating() { uint32 AttackRating = 0; if(IsClient()) { - AttackRating = (GetSkill(EQEmu::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69); + AttackRating = (GetSkill(EQ::skills::SkillOffense) * 1.345) + ((GetSTR() - 66) * 0.9) + (GetPrimarySkillValue() * 2.69); if (AttackRating < 10) AttackRating = 10; @@ -4721,6 +4732,12 @@ void Client::IncrementAggroCount(bool raid_target) uint32 newtimer = raid_target ? RuleI(Character, RestRegenRaidTimeToActivate) : RuleI(Character, RestRegenTimeToActivate); + // When our aggro count is 1 here, we are exiting rest state. We need to pause our current timer, if we have time remaining + // We should not actually have to do anything to the Timer object since the AggroCount counter blocks it from being checked + // and will have it's timer changed when we exit combat so let's not do any extra work + if (AggroCount == 1 && rest_timer.GetRemainingTime()) // the Client::rest_timer is never disabled, so don't need to check + m_pp.RestTimer = std::max(1u, rest_timer.GetRemainingTime() / 1000); // I guess round up? + // save the new timer if it's higher m_pp.RestTimer = std::max(m_pp.RestTimer, newtimer); @@ -4730,11 +4747,7 @@ void Client::IncrementAggroCount(bool raid_target) if(AggroCount > 1) return; - // Pause the rest timer, it's possible the new timer is a non-raid timer we're currently ticking down on a raid timer - if (AggroCount == 1) - m_pp.RestTimer = std::max(m_pp.RestTimer, rest_timer.GetRemainingTime() / 1000); - - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { auto outapp = new EQApplicationPacket(OP_RestState, 1); char *Buffer = (char *)outapp->pBuffer; VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0x01); @@ -4765,7 +4778,7 @@ void Client::DecrementAggroCount() rest_timer.Start(m_pp.RestTimer * 1000); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { auto outapp = new EQApplicationPacket(OP_RestState, 5); char *Buffer = (char *)outapp->pBuffer; VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0x00); @@ -4793,7 +4806,7 @@ void Client::UpdateRestTimer(uint32 new_timer) } else { // if we're not aggro, we need to check if current timer needs updating if (rest_timer.GetRemainingTime() / 1000 < new_timer) { rest_timer.Start(new_timer * 1000); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { auto outapp = new EQApplicationPacket(OP_RestState, 5); char *Buffer = (char *)outapp->pBuffer; VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0x00); @@ -4879,7 +4892,7 @@ void Client::SendRespawnBinds() BindStruct* b = &m_pp.binds[0]; RespawnOption opt; opt.name = "Bind Location"; - opt.zone_id = b->zoneId; + opt.zone_id = b->zone_id; opt.instance_id = b->instance_id; opt.x = b->x; opt.y = b->y; @@ -4964,7 +4977,7 @@ void Client::HandleLDoNOpen(NPC *target) if(target->GetLDoNTrapSpellID() != 0) { MessageString(Chat::Red, LDON_ACCIDENT_SETOFF2); - target->SpellFinished(target->GetLDoNTrapSpellID(), this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[target->GetLDoNTrapSpellID()].ResistDiff); + target->SpellFinished(target->GetLDoNTrapSpellID(), this, EQ::spells::CastingSlot::Item, 0, -1, spells[target->GetLDoNTrapSpellID()].ResistDiff); target->SetLDoNTrapSpellID(0); target->SetLDoNTrapped(false); target->SetLDoNTrapDetected(false); @@ -5000,7 +5013,7 @@ void Client::HandleLDoNOpen(NPC *target) AddEXP(target->GetLevel()*target->GetLevel()*2625/10, GetLevelCon(target->GetLevel())); } } - target->Death(this, 0, SPELL_UNKNOWN, EQEmu::skills::SkillHandtoHand); + target->Death(this, 0, SPELL_UNKNOWN, EQ::skills::SkillHandtoHand); } } } @@ -5086,7 +5099,7 @@ void Client::HandleLDoNDisarm(NPC *target, uint16 skill, uint8 type) break; case -1: MessageString(Chat::Red, LDON_ACCIDENT_SETOFF2); - target->SpellFinished(target->GetLDoNTrapSpellID(), this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[target->GetLDoNTrapSpellID()].ResistDiff); + target->SpellFinished(target->GetLDoNTrapSpellID(), this, EQ::spells::CastingSlot::Item, 0, -1, spells[target->GetLDoNTrapSpellID()].ResistDiff); target->SetLDoNTrapSpellID(0); target->SetLDoNTrapped(false); target->SetLDoNTrapDetected(false); @@ -5105,7 +5118,7 @@ void Client::HandleLDoNPickLock(NPC *target, uint16 skill, uint8 type) if(target->IsLDoNTrapped()) { MessageString(Chat::Red, LDON_ACCIDENT_SETOFF2); - target->SpellFinished(target->GetLDoNTrapSpellID(), this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[target->GetLDoNTrapSpellID()].ResistDiff); + target->SpellFinished(target->GetLDoNTrapSpellID(), this, EQ::spells::CastingSlot::Item, 0, -1, spells[target->GetLDoNTrapSpellID()].ResistDiff); target->SetLDoNTrapSpellID(0); target->SetLDoNTrapped(false); target->SetLDoNTrapDetected(false); @@ -5276,52 +5289,60 @@ void Client::NotifyNewTitlesAvailable() } -void Client::SetStartZone(uint32 zoneid, float x, float y, float z) +void Client::SetStartZone(uint32 zoneid, float x, float y, float z, float heading) { // setting city to zero allows the player to use /setstartcity to set the city themselves if(zoneid == 0) { - m_pp.binds[4].zoneId = 0; + m_pp.binds[4].zone_id = 0; this->Message(Chat::Yellow,"Your starting city has been reset. Use /setstartcity to choose a new one"); return; } // check to make sure the zone is valid - const char *target_zone_name = content_db.GetZoneName(zoneid); + const char *target_zone_name = ZoneName(zoneid); if(target_zone_name == nullptr) return; - m_pp.binds[4].zoneId = zoneid; + m_pp.binds[4].zone_id = zoneid; if(zone->GetInstanceID() != 0 && zone->IsInstancePersistent()) { m_pp.binds[4].instance_id = zone->GetInstanceID(); } if (x == 0 && y == 0 && z == 0) { - content_db.GetSafePoints(m_pp.binds[4].zoneId, 0, &m_pp.binds[4].x, &m_pp.binds[4].y, &m_pp.binds[4].z); + content_db.GetSafePoints( + ZoneName(m_pp.binds[4].zone_id), + 0, + &m_pp.binds[4].x, + &m_pp.binds[4].y, + &m_pp.binds[4].z, + &m_pp.binds[4].heading + ); } else { m_pp.binds[4].x = x; m_pp.binds[4].y = y; m_pp.binds[4].z = z; + m_pp.binds[4].heading = heading; } } uint32 Client::GetStartZone() { - return m_pp.binds[4].zoneId; + return m_pp.binds[4].zone_id; } void Client::ShowSkillsWindow() { const char *WindowTitle = "Skills"; std::string WindowText; - std::map Skills = EQEmu::skills::GetSkillTypeMap(); + std::map Skills = EQ::skills::GetSkillTypeMap(); - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF2) - Skills[EQEmu::skills::Skill1HPiercing] = "Piercing"; + if (ClientVersion() < EQ::versions::ClientVersion::RoF2) + Skills[EQ::skills::Skill1HPiercing] = "Piercing"; // print out all available skills for (auto skills_iter : Skills) { - if (skills_iter.first == EQEmu::skills::Skill2HPiercing && ClientVersion() < EQEmu::versions::ClientVersion::RoF2) + if (skills_iter.first == EQ::skills::Skill2HPiercing && ClientVersion() < EQ::versions::ClientVersion::RoF2) continue; if (!GetSkill(skills_iter.first) && !MaxSkill(skills_iter.first)) continue; @@ -5407,8 +5428,8 @@ bool Client::TryReward(uint32 claim_id) // save uint32 free_slot = 0xFFFFFFFF; - for (int i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; ++i) { - EQEmu::ItemInstance *item = GetInv().GetItem(i); + for (int i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; ++i) { + EQ::ItemInstance *item = GetInv().GetItem(i); if (!item) { free_slot = i; break; @@ -5454,7 +5475,7 @@ bool Client::TryReward(uint32 claim_id) } auto &ivr = (*iter); - EQEmu::ItemInstance *claim = database.CreateItem(ivr.items[0].item_id, ivr.items[0].charges); + EQ::ItemInstance *claim = database.CreateItem(ivr.items[0].item_id, ivr.items[0].charges); if (!claim) { Save(); return true; @@ -5464,7 +5485,7 @@ bool Client::TryReward(uint32 claim_id) for (int y = 1; y < 8; y++) if (ivr.items[y].item_id && claim->GetItem()->ItemClass == 1) { - EQEmu::ItemInstance *item_temp = database.CreateItem(ivr.items[y].item_id, ivr.items[y].charges); + EQ::ItemInstance *item_temp = database.CreateItem(ivr.items[y].item_id, ivr.items[y].charges); if (item_temp) { if (CheckLoreConflict(item_temp->GetItem())) { lore_conflict = true; @@ -5639,18 +5660,21 @@ void Client::SuspendMinion() CurrentPet->SetMana(m_suspendedminion.Mana); + CurrentPet->SetTaunting(m_suspendedminion.taunting); + MessageString(Chat::Magenta, SUSPEND_MINION_UNSUSPEND, CurrentPet->GetCleanName()); memset(&m_suspendedminion, 0, sizeof(struct PetInfo)); // TODO: These pet command states need to be synced ... // Will just fix them for now - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) { SetPetCommandState(PET_BUTTON_SIT, 0); SetPetCommandState(PET_BUTTON_STOP, 0); SetPetCommandState(PET_BUTTON_REGROUP, 0); SetPetCommandState(PET_BUTTON_FOLLOW, 1); SetPetCommandState(PET_BUTTON_GUARD, 0); - SetPetCommandState(PET_BUTTON_TAUNT, 1); + // Taunt saved on client side for logging on with pet + // In our db for when we zone. SetPetCommandState(PET_BUTTON_HOLD, 0); SetPetCommandState(PET_BUTTON_GHOLD, 0); SetPetCommandState(PET_BUTTON_FOCUS, 0); @@ -5736,6 +5760,18 @@ void Client::AddCrystals(uint32 Radiant, uint32 Ebon) SendCrystalCounts(); } +void Client::SetEbonCrystals(uint32 value) { + m_pp.currentEbonCrystals = value; + SaveCurrency(); + SendCrystalCounts(); +} + +void Client::SetRadiantCrystals(uint32 value) { + m_pp.currentRadCrystals = value; + SaveCurrency(); + SendCrystalCounts(); +} + // Processes a client request to inspect a SoF+ client's equipment. void Client::ProcessInspectRequest(Client* requestee, Client* requester) { if(requestee && requester) { @@ -5744,10 +5780,10 @@ void Client::ProcessInspectRequest(Client* requestee, Client* requester) { insr->TargetID = requester->GetID(); insr->playerid = requestee->GetID(); - const EQEmu::ItemData* item = nullptr; - const EQEmu::ItemInstance* inst = nullptr; + const EQ::ItemData* item = nullptr; + const EQ::ItemInstance* inst = nullptr; int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType); - for(int16 L = EQEmu::invslot::EQUIPMENT_BEGIN; L <= EQEmu::invslot::EQUIPMENT_END; L++) { + for(int16 L = EQ::invslot::EQUIPMENT_BEGIN; L <= EQ::invslot::EQUIPMENT_END; L++) { inst = requestee->GetInv().GetItem(L); if(inst) { @@ -5755,7 +5791,7 @@ void Client::ProcessInspectRequest(Client* requestee, Client* requester) { if(item) { strcpy(insr->itemnames[L], item->Name); - const EQEmu::ItemData *aug_item = nullptr; + const EQ::ItemData *aug_item = nullptr; if (inst->GetOrnamentationAug(ornamentationAugtype)) inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); @@ -6103,35 +6139,26 @@ void Client::CheckEmoteHail(Mob *target, const char* message) void Client::MarkSingleCompassLoc(float in_x, float in_y, float in_z, uint8 count) { + m_has_quest_compass = (count != 0); + m_quest_compass.x = in_x; + m_quest_compass.y = in_y; + m_quest_compass.z = in_z; - auto outapp = new EQApplicationPacket(OP_DzCompass, sizeof(ExpeditionInfo_Struct) + - sizeof(ExpeditionCompassEntry_Struct) * count); - ExpeditionCompass_Struct *ecs = (ExpeditionCompass_Struct*)outapp->pBuffer; - //ecs->clientid = GetID(); - ecs->count = count; - - if (count) { - ecs->entries[0].x = in_x; - ecs->entries[0].y = in_y; - ecs->entries[0].z = in_z; - } - - FastQueuePacket(&outapp); - safe_delete(outapp); + SendDzCompassUpdate(); } void Client::SendZonePoints() { - int count = 0; - LinkedListIterator iterator(zone->zone_point_list); + int count = 0; + LinkedListIterator iterator(zone->zone_point_list); iterator.Reset(); - while(iterator.MoreElements()) - { - ZonePoint* data = iterator.GetData(); - if(ClientVersionBit() & data->client_version_mask) - { + while (iterator.MoreElements()) { + ZonePoint *data = iterator.GetData(); + + if (ClientVersionBit() & data->client_version_mask) { count++; } + iterator.Advance(); } @@ -6145,6 +6172,17 @@ void Client::SendZonePoints() while(iterator.MoreElements()) { ZonePoint* data = iterator.GetData(); + + LogZonePoints( + "Sending zone point to client [{}] mask [{}] x [{}] y [{}] z [{}] number [{}]", + GetCleanName(), + ClientVersionBit() & data->client_version_mask ? "true" : "false", + data->x, + data->y, + data->z, + data->number + ); + if(ClientVersionBit() & data->client_version_mask) { zp->zpe[i].iterator = data->number; @@ -6158,6 +6196,7 @@ void Client::SendZonePoints() } iterator.Advance(); } + FastQueuePacket(&outapp); } @@ -6275,27 +6314,27 @@ void Client::ConsentCorpses(std::string consent_name, bool deny) scs->permission = deny ? 0 : 1; scs->zone_id = zone->GetZoneID(); scs->instance_id = zone->GetInstanceID(); - scs->consent_type = EQEmu::consent::Normal; + scs->consent_type = EQ::consent::Normal; scs->consent_id = 0; if (strcasecmp(scs->grantname, "group") == 0) { if (!deny) { Group* grp = GetGroup(); scs->consent_id = grp ? grp->GetID() : 0; } - scs->consent_type = EQEmu::consent::Group; + scs->consent_type = EQ::consent::Group; } else if (strcasecmp(scs->grantname, "raid") == 0) { if (!deny) { Raid* raid = GetRaid(); scs->consent_id = raid ? raid->GetID() : 0; } - scs->consent_type = EQEmu::consent::Raid; + scs->consent_type = EQ::consent::Raid; } else if (strcasecmp(scs->grantname, "guild") == 0) { if (!deny) { scs->consent_id = GuildID(); } - scs->consent_type = EQEmu::consent::Guild; + scs->consent_type = EQ::consent::Guild; // update all corpses in db so buried/unloaded corpses see new consent id database.UpdateCharacterCorpseConsent(CharacterID(), scs->consent_id); } @@ -6352,8 +6391,8 @@ void Client::Doppelganger(uint16 spell_id, Mob *target, const char *name_overrid made_npc->Corrup = GetCorrup(); made_npc->PhR = GetPhR(); // looks - made_npc->texture = GetEquipmentMaterial(EQEmu::textures::armorChest); - made_npc->helmtexture = GetEquipmentMaterial(EQEmu::textures::armorHead); + made_npc->texture = GetEquipmentMaterial(EQ::textures::armorChest); + made_npc->helmtexture = GetEquipmentMaterial(EQ::textures::armorHead); made_npc->haircolor = GetHairColor(); made_npc->beardcolor = GetBeardColor(); made_npc->eyecolor1 = GetEyeColor1(); @@ -6364,9 +6403,9 @@ void Client::Doppelganger(uint16 spell_id, Mob *target, const char *name_overrid made_npc->drakkin_heritage = GetDrakkinHeritage(); made_npc->drakkin_tattoo = GetDrakkinTattoo(); made_npc->drakkin_details = GetDrakkinDetails(); - made_npc->d_melee_texture1 = GetEquipmentMaterial(EQEmu::textures::weaponPrimary); - made_npc->d_melee_texture2 = GetEquipmentMaterial(EQEmu::textures::weaponSecondary); - for (int i = EQEmu::textures::textureBegin; i <= EQEmu::textures::LastTexture; i++) { + made_npc->d_melee_texture1 = GetEquipmentMaterial(EQ::textures::weaponPrimary); + made_npc->d_melee_texture2 = GetEquipmentMaterial(EQ::textures::weaponSecondary); + for (int i = EQ::textures::textureBegin; i <= EQ::textures::LastTexture; i++) { made_npc->armor_tint.Slot[i].Color = GetEquipmentColor(i); } made_npc->loottable_id = 0; @@ -6828,7 +6867,7 @@ void Client::SendStatsWindow(Client* client, bool use_window) }; std::string skill_mods = ""; - for (int j = 0; j <= EQEmu::skills::HIGHEST_SKILL; j++) { + for (int j = 0; j <= EQ::skills::HIGHEST_SKILL; j++) { if(itembonuses.skillmod[j] > 0) skill_mods += indP + skill_list[j] + " : +" + itoa(itembonuses.skillmod[j]) + "%
"; else if(itembonuses.skillmod[j] < 0) @@ -6836,7 +6875,7 @@ void Client::SendStatsWindow(Client* client, bool use_window) } std::string skill_dmgs = ""; - for (int j = 0; j <= EQEmu::skills::HIGHEST_SKILL; j++) { + for (int j = 0; j <= EQ::skills::HIGHEST_SKILL; j++) { if((itembonuses.SkillDamageAmount[j] + spellbonuses.SkillDamageAmount[j]) > 0) skill_dmgs += indP + skill_list[j] + " : +" + itoa(itembonuses.SkillDamageAmount[j] + spellbonuses.SkillDamageAmount[j]) + "
"; else if((itembonuses.SkillDamageAmount[j] + spellbonuses.SkillDamageAmount[j]) < 0) @@ -6869,30 +6908,30 @@ void Client::SendStatsWindow(Client* client, bool use_window) indP + "Wind: " + itoa(GetWindMod()) + "
"; } - EQEmu::skills::SkillType skill = EQEmu::skills::SkillHandtoHand; - auto *inst = GetInv().GetItem(EQEmu::invslot::slotPrimary); + EQ::skills::SkillType skill = EQ::skills::SkillHandtoHand; + auto *inst = GetInv().GetItem(EQ::invslot::slotPrimary); if (inst && inst->IsClassCommon()) { switch (inst->GetItem()->ItemType) { - case EQEmu::item::ItemType1HSlash: - skill = EQEmu::skills::Skill1HSlashing; + case EQ::item::ItemType1HSlash: + skill = EQ::skills::Skill1HSlashing; break; - case EQEmu::item::ItemType2HSlash: - skill = EQEmu::skills::Skill2HSlashing; + case EQ::item::ItemType2HSlash: + skill = EQ::skills::Skill2HSlashing; break; - case EQEmu::item::ItemType1HPiercing: - skill = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType1HPiercing: + skill = EQ::skills::Skill1HPiercing; break; - case EQEmu::item::ItemType1HBlunt: - skill = EQEmu::skills::Skill1HBlunt; + case EQ::item::ItemType1HBlunt: + skill = EQ::skills::Skill1HBlunt; break; - case EQEmu::item::ItemType2HBlunt: - skill = EQEmu::skills::Skill2HBlunt; + case EQ::item::ItemType2HBlunt: + skill = EQ::skills::Skill2HBlunt; break; - case EQEmu::item::ItemType2HPiercing: - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF2) - skill = EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType2HPiercing: + if (ClientVersion() < EQ::versions::ClientVersion::RoF2) + skill = EQ::skills::Skill1HPiercing; else - skill = EQEmu::skills::Skill2HPiercing; + skill = EQ::skills::Skill2HPiercing; break; default: break; @@ -6934,7 +6973,7 @@ void Client::SendStatsWindow(Client* client, bool use_window) if(use_window) { if(final_stats.size() < 4096) { - uint32 Buttons = (client->ClientVersion() < EQEmu::versions::ClientVersion::SoD) ? 0 : 1; + uint32 Buttons = (client->ClientVersion() < EQ::versions::ClientVersion::SoD) ? 0 : 1; client->SendWindow(0, POPUPID_UPDATE_SHOWSTATSWINDOW, Buttons, "Cancel", "Update", 0, 1, this, "", "%s", final_stats.c_str()); goto Extra_Info; } @@ -6972,7 +7011,7 @@ void Client::SendStatsWindow(Client* client, bool use_window) } void Client::SendAltCurrencies() { - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { uint32 count = zone->AlternateCurrencies.size(); if(count == 0) { return; @@ -6988,7 +7027,7 @@ void Client::SendAltCurrencies() { uint32 i = 0; auto iter = zone->AlternateCurrencies.begin(); while(iter != zone->AlternateCurrencies.end()) { - const EQEmu::ItemData* item = database.GetItem((*iter).item_id); + const EQ::ItemData* item = database.GetItem((*iter).item_id); altc->entries[i].currency_number = (*iter).id; altc->entries[i].unknown00 = 1; altc->entries[i].currency_number2 = (*iter).id; @@ -7597,7 +7636,7 @@ void Client::SendMercPersonalInfo() if(mercData) { - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { if (mercCount > 0) { @@ -7710,13 +7749,13 @@ void Client::SendClearMercInfo() void Client::DuplicateLoreMessage(uint32 ItemID) { - if (!(m_ClientVersionBit & EQEmu::versions::maskRoFAndLater)) + if (!(m_ClientVersionBit & EQ::versions::maskRoFAndLater)) { MessageString(Chat::White, PICK_LORE); return; } - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item) return; @@ -7743,7 +7782,7 @@ void Client::GarbleMessage(char *message, uint8 variance) for (size_t i = 0; i < strlen(message); i++) { // Client expects hex values inside of a text link body if (message[i] == delimiter) { - if (!(delimiter_count & 1)) { i += EQEmu::constants::SAY_LINK_BODY_SIZE; } + if (!(delimiter_count & 1)) { i += EQ::constants::SAY_LINK_BODY_SIZE; } ++delimiter_count; continue; } @@ -8184,12 +8223,12 @@ void Client::TickItemCheck() if(zone->tick_items.empty()) { return; } //Scan equip, general, cursor slots for items - for (i = EQEmu::invslot::POSSESSIONS_BEGIN; i <= EQEmu::invslot::POSSESSIONS_END; i++) + for (i = EQ::invslot::POSSESSIONS_BEGIN; i <= EQ::invslot::POSSESSIONS_END; i++) { TryItemTick(i); } //Scan bags - for (i = EQEmu::invbag::GENERAL_BAGS_BEGIN; i <= EQEmu::invbag::CURSOR_BAG_END; i++) + for (i = EQ::invbag::GENERAL_BAGS_BEGIN; i <= EQ::invbag::CURSOR_BAG_END; i++) { TryItemTick(i); } @@ -8198,26 +8237,26 @@ void Client::TickItemCheck() void Client::TryItemTick(int slot) { int iid = 0; - const EQEmu::ItemInstance* inst = m_inv[slot]; + const EQ::ItemInstance* inst = m_inv[slot]; if(inst == 0) { return; } iid = inst->GetID(); if(zone->tick_items.count(iid) > 0) { - if (GetLevel() >= zone->tick_items[iid].level && zone->random.Int(0, 100) >= (100 - zone->tick_items[iid].chance) && (zone->tick_items[iid].bagslot || slot <= EQEmu::invslot::EQUIPMENT_END)) + if (GetLevel() >= zone->tick_items[iid].level && zone->random.Int(0, 100) >= (100 - zone->tick_items[iid].chance) && (zone->tick_items[iid].bagslot || slot <= EQ::invslot::EQUIPMENT_END)) { - EQEmu::ItemInstance* e_inst = (EQEmu::ItemInstance*)inst; + EQ::ItemInstance* e_inst = (EQ::ItemInstance*)inst; parse->EventItem(EVENT_ITEM_TICK, this, e_inst, nullptr, "", slot); } } //Only look at augs in main inventory - if (slot > EQEmu::invslot::EQUIPMENT_END) { return; } + if (slot > EQ::invslot::EQUIPMENT_END) { return; } - for (int x = EQEmu::invaug::SOCKET_BEGIN; x <= EQEmu::invaug::SOCKET_END; ++x) + for (int x = EQ::invaug::SOCKET_BEGIN; x <= EQ::invaug::SOCKET_END; ++x) { - EQEmu::ItemInstance * a_inst = inst->GetAugment(x); + EQ::ItemInstance * a_inst = inst->GetAugment(x); if(!a_inst) { continue; } iid = a_inst->GetID(); @@ -8226,7 +8265,7 @@ void Client::TryItemTick(int slot) { if( GetLevel() >= zone->tick_items[iid].level && zone->random.Int(0, 100) >= (100 - zone->tick_items[iid].chance) ) { - EQEmu::ItemInstance* e_inst = (EQEmu::ItemInstance*)a_inst; + EQ::ItemInstance* e_inst = (EQ::ItemInstance*)a_inst; parse->EventItem(EVENT_ITEM_TICK, this, e_inst, nullptr, "", slot); } } @@ -8236,11 +8275,11 @@ void Client::TryItemTick(int slot) void Client::ItemTimerCheck() { int i; - for (i = EQEmu::invslot::POSSESSIONS_BEGIN; i <= EQEmu::invslot::POSSESSIONS_END; i++) + for (i = EQ::invslot::POSSESSIONS_BEGIN; i <= EQ::invslot::POSSESSIONS_END; i++) { TryItemTimer(i); } - for (i = EQEmu::invbag::GENERAL_BAGS_BEGIN; i <= EQEmu::invbag::CURSOR_BAG_END; i++) + for (i = EQ::invbag::GENERAL_BAGS_BEGIN; i <= EQ::invbag::CURSOR_BAG_END; i++) { TryItemTimer(i); } @@ -8248,7 +8287,7 @@ void Client::ItemTimerCheck() void Client::TryItemTimer(int slot) { - EQEmu::ItemInstance* inst = m_inv.GetItem(slot); + EQ::ItemInstance* inst = m_inv.GetItem(slot); if(!inst) { return; } @@ -8262,13 +8301,13 @@ void Client::TryItemTimer(int slot) ++it_iter; } - if (slot > EQEmu::invslot::EQUIPMENT_END) { + if (slot > EQ::invslot::EQUIPMENT_END) { return; } - for (int x = EQEmu::invaug::SOCKET_BEGIN; x <= EQEmu::invaug::SOCKET_END; ++x) + for (int x = EQ::invaug::SOCKET_BEGIN; x <= EQ::invaug::SOCKET_END; ++x) { - EQEmu::ItemInstance * a_inst = inst->GetAugment(x); + EQ::ItemInstance * a_inst = inst->GetAugment(x); if(!a_inst) { continue; } @@ -8284,7 +8323,7 @@ void Client::TryItemTimer(int slot) } } -void Client::SendItemScale(EQEmu::ItemInstance *inst) { +void Client::SendItemScale(EQ::ItemInstance *inst) { int slot = m_inv.GetSlotByItemInst(inst); if(slot != -1) { inst->ScaleItem(); @@ -8438,7 +8477,7 @@ void Client::SetConsumption(int32 in_hunger, int32 in_thirst) safe_delete(outapp); } -void Client::Consume(const EQEmu::ItemData *item, uint8 type, int16 slot, bool auto_consume) +void Client::Consume(const EQ::ItemData *item, uint8 type, int16 slot, bool auto_consume) { if (!item) return; @@ -8450,7 +8489,7 @@ void Client::Consume(const EQEmu::ItemData *item, uint8 type, int16 slot, bool a if (increase < 0) // wasn't food? oh well return; - if (type == EQEmu::item::ItemTypeFood) { + if (type == EQ::item::ItemTypeFood) { increase = mod_food_value(item, increase); if (increase < 0) @@ -8552,13 +8591,13 @@ void Client::ShowNumHits() int Client::GetQuiverHaste(int delay) { - const EQEmu::ItemInstance *pi = nullptr; - for (int r = EQEmu::invslot::GENERAL_BEGIN; r <= EQEmu::invslot::GENERAL_END; r++) { + const EQ::ItemInstance *pi = nullptr; + for (int r = EQ::invslot::GENERAL_BEGIN; r <= EQ::invslot::GENERAL_END; r++) { pi = GetInv().GetItem(r); - if (pi && pi->IsClassBag() && pi->GetItem()->BagType == EQEmu::item::BagTypeQuiver && + if (pi && pi->IsClassBag() && pi->GetItem()->BagType == EQ::item::BagTypeQuiver && pi->GetItem()->BagWR > 0) break; - if (r == EQEmu::invslot::GENERAL_END) + if (r == EQ::invslot::GENERAL_END) // we will get here if we don't find a valid quiver return 0; } @@ -8598,7 +8637,7 @@ void Client::QuestReward(Mob* target, uint32 copper, uint32 silver, uint32 gold, AddMoneyToPP(copper, silver, gold, platinum, false); if (itemid > 0) - SummonItem(itemid, 0, 0, 0, 0, 0, 0, false, EQEmu::invslot::slotCursor); + SummonItem(itemid, -1, 0, 0, 0, 0, 0, false, EQ::invslot::slotCursor); if (faction) { @@ -8634,7 +8673,7 @@ void Client::QuestReward(Mob* target, const QuestReward_Struct &reward, bool fac for (int i = 0; i < QUESTREWARD_COUNT; ++i) if (reward.item_id[i] > 0) - SummonItem(reward.item_id[i], 0, 0, 0, 0, 0, 0, false, EQEmu::invslot::slotCursor); + SummonItem(reward.item_id[i], 0, 0, 0, 0, 0, 0, false, EQ::invslot::slotCursor); if (faction) { @@ -8758,6 +8797,11 @@ void Client::CheckRegionTypeChanges() if (last_region_type == new_region) return; + // If we got out of water clear any water aggro for water only npcs + if (last_region_type == RegionTypeWater) { + entity_list.ClearWaterAggro(this); + } + // region type changed last_region_type = new_region; @@ -9145,17 +9189,14 @@ void Client::SetDisplayMobInfoWindow(bool display_mob_info_window) Client::display_mob_info_window = display_mob_info_window; } -bool Client::IsDevToolsWindowEnabled() const +bool Client::IsDevToolsEnabled() const { - return dev_tools_window_enabled; + return dev_tools_enabled && RuleB(World, EnableDevTools); } -/** - * @param in_dev_tools_window_enabled - */ -void Client::SetDevToolsWindowEnabled(bool in_dev_tools_window_enabled) +void Client::SetDevToolsEnabled(bool in_dev_tools_enabled) { - Client::dev_tools_window_enabled = in_dev_tools_window_enabled; + Client::dev_tools_enabled = in_dev_tools_enabled; } /** @@ -9163,19 +9204,19 @@ void Client::SetDevToolsWindowEnabled(bool in_dev_tools_window_enabled) */ void Client::SetPrimaryWeaponOrnamentation(uint32 model_id) { - auto primary_item = m_inv.GetItem(EQEmu::invslot::slotPrimary); + auto primary_item = m_inv.GetItem(EQ::invslot::slotPrimary); if (primary_item) { database.QueryDatabase( StringFormat( "UPDATE `inventory` SET `ornamentidfile` = %i WHERE `charid` = %i AND `slotid` = %i", model_id, character_id, - EQEmu::invslot::slotPrimary + EQ::invslot::slotPrimary )); primary_item->SetOrnamentationIDFile(model_id); - SendItemPacket(EQEmu::invslot::slotPrimary, primary_item, ItemPacketTrade); - WearChange(EQEmu::textures::weaponPrimary, static_cast(model_id), 0); + SendItemPacket(EQ::invslot::slotPrimary, primary_item, ItemPacketTrade); + WearChange(EQ::textures::weaponPrimary, static_cast(model_id), 0); Message(Chat::Yellow, "Your primary weapon appearance has been modified"); } @@ -9186,20 +9227,20 @@ void Client::SetPrimaryWeaponOrnamentation(uint32 model_id) */ void Client::SetSecondaryWeaponOrnamentation(uint32 model_id) { - auto secondary_item = m_inv.GetItem(EQEmu::invslot::slotSecondary); + auto secondary_item = m_inv.GetItem(EQ::invslot::slotSecondary); if (secondary_item) { database.QueryDatabase( StringFormat( "UPDATE `inventory` SET `ornamentidfile` = %i WHERE `charid` = %i AND `slotid` = %i", model_id, character_id, - EQEmu::invslot::slotSecondary + EQ::invslot::slotSecondary )); secondary_item->SetOrnamentationIDFile(model_id); - SendItemPacket(EQEmu::invslot::slotSecondary, secondary_item, ItemPacketTrade); - WearChange(EQEmu::textures::weaponSecondary, static_cast(model_id), 0); - + SendItemPacket(EQ::invslot::slotSecondary, secondary_item, ItemPacketTrade); + WearChange(EQ::textures::weaponSecondary, static_cast(model_id), 0); + Message(Chat::Yellow, "Your secondary weapon appearance has been modified"); } } @@ -9288,3 +9329,813 @@ void Client::SetBotOption(BotOwnerOption boo, bool flag) { } #endif + +void Client::SendToGuildHall() +{ + std::string zone_short_name = "guildhall"; + uint32 zone_id = ZoneID(zone_short_name.c_str()); + if (zone_id == 0) { + return; + } + + uint32 expiration_time = (RuleI(Instances, GuildHallExpirationDays) * 86400); + uint16 instance_id = 0; + std::string guild_hall_instance_key = fmt::format("guild-hall-instance-{}", GuildID()); + std::string instance_data = DataBucket::GetData(guild_hall_instance_key); + if (!instance_data.empty() && std::stoi(instance_data) > 0) { + instance_id = std::stoi(instance_data); + } + + if (instance_id <= 0) { + if (!database.GetUnusedInstanceID(instance_id)) { + Message(Chat::Red, "Server was unable to find a free instance id."); + return; + } + + if (!database.CreateInstance(instance_id, zone_id, 1, expiration_time)) { + Message(Chat::Red, "Server was unable to create a new instance."); + return; + } + + DataBucket::SetData( + guild_hall_instance_key, + std::to_string(instance_id), + std::to_string(expiration_time) + ); + } + + AssignToInstance(instance_id); + MovePC(345, instance_id, -1.00, -1.00, 3.34, 0, 1); +} + +void Client::CheckVirtualZoneLines() +{ + for (auto &virtual_zone_point : zone->virtual_zone_point_list) { + float half_width = ((float) virtual_zone_point.width / 2); + + if ( + GetX() > (virtual_zone_point.x - half_width) && + GetX() < (virtual_zone_point.x + half_width) && + GetY() > (virtual_zone_point.y - half_width) && + GetY() < (virtual_zone_point.y + half_width) && + GetZ() >= (virtual_zone_point.z - 10) && + GetZ() < (virtual_zone_point.z + (float) virtual_zone_point.height) + ) { + + MovePC( + virtual_zone_point.target_zone_id, + virtual_zone_point.target_instance, + virtual_zone_point.target_x, + virtual_zone_point.target_y, + virtual_zone_point.target_z, + virtual_zone_point.target_heading + ); + + LogZonePoints( + "Virtual Zone Box Sending player [{}] to [{}]", + GetCleanName(), + zone_store.GetZoneLongName(virtual_zone_point.target_zone_id) + ); + } + } +} + +void Client::ShowDevToolsMenu() +{ + std::string menu_commands_search; + std::string menu_commands_show; + std::string reload_commands_show; + std::string devtools_toggle; + + /** + * Search entity commands + */ + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#list npcs", false, "NPC") + "] "; + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#list players", false, "Players") + "] "; + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#list corpses", false, "Corpses") + "] "; + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#list doors", false, "Doors") + "] "; + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#list objects", false, "Objects") + "] "; + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#fz", false, "Zones") + "] "; + menu_commands_search += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#fi", false, "Items") + "] "; + + /** + * Show + */ + menu_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#showzonepoints", false, "Zone Points") + "] "; + menu_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#showzonegloballoot", false, "Zone Global Loot") + "] "; + + /** + * Reload + */ + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#rq", false, "Quests") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadmerchants", false, "Merchants") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadallrules", false, "Rules Globally") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadstatic", false, "Ground Spawns") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadstatic", false, "Alternate Currencies") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadstatic", false, "DB Emotes") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadstatic", false, "Doors") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadtraps", false, "Traps") + "] "; + reload_commands_show += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#reloadzps", false, "Zone Points") + "] "; + + /** + * Show window status + */ + devtools_toggle = "Disabled [" + EQ::SayLinkEngine::GenerateQuestSaylink("#devtools enable", false, "Enable") + "] "; + if (IsDevToolsEnabled()) { + devtools_toggle = "Enabled [" + EQ::SayLinkEngine::GenerateQuestSaylink("#devtools disable", false, "Disable") + "] "; + } + + /** + * Print menu + */ + SendChatLineBreak(); + Message( + Chat::White, "| [Devtools] %s Show this menu with %s | Current expansion [%s]", + devtools_toggle.c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink("#dev", false, "#dev").c_str(), + content_service.GetCurrentExpansionName().c_str() + ); + Message(Chat::White, "| [Devtools] Search %s", menu_commands_search.c_str()); + Message(Chat::White, "| [Devtools] Show %s", menu_commands_show.c_str()); + Message(Chat::White, "| [Devtools] Reload %s", reload_commands_show.c_str()); + Message(Chat::White, "| [Devtools] Search commands with #help "); + SendChatLineBreak(); +} + +void Client::SendChatLineBreak(uint16 color) { + Message(color, "------------------------------------------------"); +} + +void Client::SendCrossZoneMessage( + Client* client, const std::string& character_name, uint16_t chat_type, const std::string& message) +{ + // if client is null, falls back to sending a cross zone message by name + if (!client && !character_name.empty()) + { + client = entity_list.GetClientByName(character_name.c_str()); + } + + if (client) + { + client->Message(chat_type, message.c_str()); + } + else if (!character_name.empty() && !message.empty()) + { + uint32_t pack_size = sizeof(CZMessagePlayer_Struct); + auto pack = std::make_unique(ServerOP_CZMessagePlayer, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->type = chat_type; + strn0cpy(buf->character_name, character_name.c_str(), sizeof(buf->character_name)); + strn0cpy(buf->message, message.c_str(), sizeof(buf->message)); + + worldserver.SendPacket(pack.get()); + } +} + +void Client::SendCrossZoneMessageString( + Client* client, const std::string& character_name, uint16_t chat_type, + uint32_t string_id, const std::initializer_list& arguments) +{ + // if client is null, falls back to sending a cross zone message by name + if (!client && !character_name.empty()) // double check client isn't in this zone + { + client = entity_list.GetClientByName(character_name.c_str()); + } + + if (!client && character_name.empty()) + { + return; + } + + SerializeBuffer argument_buffer; + for (const auto& argument : arguments) + { + argument_buffer.WriteString(argument); + } + + uint32_t args_size = static_cast(argument_buffer.size()); + uint32_t pack_size = sizeof(CZClientMessageString_Struct) + args_size; + auto pack = std::make_unique(ServerOP_CZClientMessageString, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->string_id = string_id; + buf->chat_type = chat_type; + strn0cpy(buf->character_name, character_name.c_str(), sizeof(buf->character_name)); + buf->args_size = args_size; + memcpy(buf->args, argument_buffer.buffer(), argument_buffer.size()); + + if (client) + { + client->MessageString(buf); + } + else + { + worldserver.SendPacket(pack.get()); + } +} + +void Client::UpdateExpeditionInfoAndLockouts() +{ + // this is processed by client after entering a zone + SendDzCompassUpdate(); + + m_expedition_lockouts = ExpeditionDatabase::LoadCharacterLockouts(CharacterID()); + + auto expedition = GetExpedition(); + if (expedition) + { + expedition->SendClientExpeditionInfo(this); + + // live synchronizes lockouts obtained during the active expedition to + // members once they zone into the expedition's dynamic zone instance + if (expedition->GetDynamicZone().IsCurrentZoneDzInstance()) + { + expedition->SyncCharacterLockouts(CharacterID(), m_expedition_lockouts); + expedition->SetMemberStatus(this, DynamicZoneMemberStatus::InDynamicZone); + } + else + { + expedition->SetMemberStatus(this, DynamicZoneMemberStatus::Online); + } + } + + SendExpeditionLockoutTimers(); + + // ask world for any pending invite we saved from a previous zone + RequestPendingExpeditionInvite(); +} + +Expedition* Client::CreateExpedition(DynamicZone& dz_instance, ExpeditionRequest& request) +{ + return Expedition::TryCreate(this, dz_instance, request); +} + +Expedition* Client::CreateExpedition( + const std::string& zone_name, uint32 version, uint32 duration, const std::string& expedition_name, + uint32 min_players, uint32 max_players, bool disable_messages) +{ + DynamicZone dz_instance{ ZoneID(zone_name), version, duration, DynamicZoneType::Expedition }; + ExpeditionRequest request{ expedition_name, min_players, max_players, disable_messages }; + return Expedition::TryCreate(this, dz_instance, request); +} + +Expedition* Client::GetExpedition() const +{ + if (zone && m_expedition_id) + { + auto expedition_cache_iter = zone->expedition_cache.find(m_expedition_id); + if (expedition_cache_iter != zone->expedition_cache.end()) + { + return expedition_cache_iter->second.get(); + } + } + return nullptr; +} + +void Client::AddExpeditionLockout(const ExpeditionLockoutTimer& lockout, bool update_db) +{ + // todo: support for account based lockouts like live AoC expeditions + + // if client already has this lockout, we're replacing it with the new one + m_expedition_lockouts.erase(std::remove_if(m_expedition_lockouts.begin(), m_expedition_lockouts.end(), + [&](const ExpeditionLockoutTimer& existing_lockout) { + return existing_lockout.IsSameLockout(lockout); + } + ), m_expedition_lockouts.end()); + + m_expedition_lockouts.emplace_back(lockout); + + if (update_db) // for quest api + { + ExpeditionDatabase::InsertCharacterLockouts(CharacterID(), { lockout }); + } + + SendExpeditionLockoutTimers(); +} + +void Client::AddNewExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, uint32_t seconds, std::string uuid) +{ + auto lockout = ExpeditionLockoutTimer::CreateLockout(expedition_name, event_name, seconds, uuid); + AddExpeditionLockout(lockout, true); +} + +void Client::AddExpeditionLockoutDuration( + const std::string& expedition_name, const std::string& event_name, int seconds, + const std::string& uuid, bool update_db) +{ + auto it = std::find_if(m_expedition_lockouts.begin(), m_expedition_lockouts.end(), + [&](const ExpeditionLockoutTimer& lockout) { + return lockout.IsSameLockout(expedition_name, event_name); + }); + + if (it != m_expedition_lockouts.end()) + { + it->AddLockoutTime(seconds); + + if (!uuid.empty()) + { + it->SetUUID(uuid); + } + + if (update_db) + { + ExpeditionDatabase::InsertCharacterLockouts(CharacterID(), { *it }); + } + + SendExpeditionLockoutTimers(); + } + else if (seconds > 0) // missing lockouts inserted for reductions would be instantly expired + { + auto lockout = ExpeditionLockoutTimer::CreateLockout(expedition_name, event_name, seconds, uuid); + AddExpeditionLockout(lockout, update_db); + } +} + +void Client::RemoveExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, bool update_db) +{ + m_expedition_lockouts.erase(std::remove_if(m_expedition_lockouts.begin(), m_expedition_lockouts.end(), + [&](const ExpeditionLockoutTimer& lockout) { + return lockout.IsSameLockout(expedition_name, event_name); + } + ), m_expedition_lockouts.end()); + + if (update_db) // for quest api + { + ExpeditionDatabase::DeleteCharacterLockout(CharacterID(), expedition_name, event_name); + } + + SendExpeditionLockoutTimers(); +} + +void Client::RemoveAllExpeditionLockouts(const std::string& expedition_name, bool update_db) +{ + if (expedition_name.empty()) + { + if (update_db) + { + ExpeditionDatabase::DeleteAllCharacterLockouts(CharacterID()); + } + m_expedition_lockouts.clear(); + } + else + { + if (update_db) + { + ExpeditionDatabase::DeleteAllCharacterLockouts(CharacterID(), expedition_name); + } + + m_expedition_lockouts.erase(std::remove_if(m_expedition_lockouts.begin(), m_expedition_lockouts.end(), + [&](const ExpeditionLockoutTimer& lockout) { + return lockout.GetExpeditionName() == expedition_name; + } + ), m_expedition_lockouts.end()); + } + + SendExpeditionLockoutTimers(); +} + +const ExpeditionLockoutTimer* Client::GetExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, bool include_expired) const +{ + for (const auto& expedition_lockout : m_expedition_lockouts) + { + if ((include_expired || !expedition_lockout.IsExpired()) && + expedition_lockout.IsSameLockout(expedition_name, event_name)) + { + return &expedition_lockout; + } + } + return nullptr; +} + +std::vector Client::GetExpeditionLockouts( + const std::string& expedition_name, bool include_expired) +{ + std::vector lockouts; + for (const auto& lockout : m_expedition_lockouts) + { + if ((include_expired || !lockout.IsExpired()) && + lockout.GetExpeditionName() == expedition_name) + { + lockouts.emplace_back(lockout); + } + } + return lockouts; +} + +bool Client::HasExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, bool include_expired) +{ + return (GetExpeditionLockout(expedition_name, event_name, include_expired) != nullptr); +} + +void Client::SendExpeditionLockoutTimers() +{ + std::vector lockout_entries; + + // client displays lockouts rounded down to nearest minute, send lockouts + // with 60s offset added to compensate (live does this too) + constexpr uint32_t rounding_seconds = 60; + + // erases expired lockouts while building lockout timer list + for (auto it = m_expedition_lockouts.begin(); it != m_expedition_lockouts.end();) + { + uint32_t seconds_remaining = it->GetSecondsRemaining(); + if (seconds_remaining == 0) + { + it = m_expedition_lockouts.erase(it); + } + else + { + ExpeditionLockoutTimerEntry_Struct lockout; + strn0cpy(lockout.expedition_name, it->GetExpeditionName().c_str(), sizeof(lockout.expedition_name)); + lockout.seconds_remaining = seconds_remaining + rounding_seconds; + lockout.event_type = it->IsReplayTimer() ? Expedition::REPLAY_TIMER_ID : Expedition::EVENT_TIMER_ID; + strn0cpy(lockout.event_name, it->GetEventName().c_str(), sizeof(lockout.event_name)); + + lockout_entries.emplace_back(lockout); + ++it; + } + } + + uint32_t lockout_count = static_cast(lockout_entries.size()); + uint32_t lockout_entries_size = sizeof(ExpeditionLockoutTimerEntry_Struct) * lockout_count; + uint32_t outsize = sizeof(ExpeditionLockoutTimers_Struct) + lockout_entries_size; + auto outapp = std::make_unique(OP_DzExpeditionLockoutTimers, outsize); + auto outbuf = reinterpret_cast(outapp->pBuffer); + outbuf->count = lockout_count; + if (!lockout_entries.empty()) + { + memcpy(outbuf->timers, lockout_entries.data(), lockout_entries_size); + } + QueuePacket(outapp.get()); +} + +void Client::RequestPendingExpeditionInvite() +{ + uint32_t packsize = sizeof(ServerExpeditionCharacterID_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionRequestInvite, packsize); + auto packbuf = reinterpret_cast(pack->pBuffer); + packbuf->character_id = CharacterID(); + worldserver.SendPacket(pack.get()); +} + +void Client::DzListTimers() +{ + // only lists player's current replay timer lockouts, not all event lockouts + bool found = false; + for (const auto& lockout : m_expedition_lockouts) + { + if (lockout.IsReplayTimer()) + { + found = true; + auto time_remaining = lockout.GetDaysHoursMinutesRemaining(); + MessageString( + Chat::Yellow, DZLIST_REPLAY_TIMER, + time_remaining.days.c_str(), + time_remaining.hours.c_str(), + time_remaining.mins.c_str(), + lockout.GetExpeditionName().c_str() + ); + } + } + + if (!found) + { + MessageString(Chat::Yellow, EXPEDITION_NO_TIMERS); + } +} + +void Client::SetDzRemovalTimer(bool enable_timer) +{ + uint32_t timer_ms = RuleI(DynamicZone, ClientRemovalDelayMS); + + LogDynamicZones( + "Character [{}] instance [{}] removal timer enabled: [{}] delay (ms): [{}]", + CharacterID(), zone ? zone->GetInstanceID() : 0, enable_timer, timer_ms + ); + + if (enable_timer) + { + dynamiczone_removal_timer.Start(timer_ms); + } + else + { + dynamiczone_removal_timer.Disable(); + } +} + +void Client::SendDzCompassUpdate() +{ + // client may be associated with multiple dynamic zone compasses in this zone + std::vector compass_entries; + + for (const auto& client_dz : GetDynamicZones()) + { + auto compass = client_dz->GetCompassLocation(); + if (zone && zone->IsZone(compass.zone_id, 0)) + { + DynamicZoneCompassEntry_Struct entry; + entry.dz_zone_id = client_dz->GetZoneID(); + entry.dz_instance_id = client_dz->GetInstanceID(); + entry.dz_type = static_cast(client_dz->GetType()); + entry.x = compass.x; + entry.y = compass.y; + entry.z = compass.z; + + compass_entries.emplace_back(entry); + } + } + + // compass set via MarkSingleCompassLocation() + if (m_has_quest_compass) + { + DynamicZoneCompassEntry_Struct entry; + entry.dz_zone_id = 0; + entry.dz_instance_id = 0; + entry.dz_type = 0; + entry.x = m_quest_compass.x; + entry.y = m_quest_compass.y; + entry.z = m_quest_compass.z; + + compass_entries.emplace_back(entry); + } + + QueuePacket(CreateCompassPacket(compass_entries).get()); +} + +std::unique_ptr Client::CreateCompassPacket( + const std::vector& compass_entries) +{ + uint32 count = static_cast(compass_entries.size()); + uint32 entries_size = sizeof(DynamicZoneCompassEntry_Struct) * count; + uint32 outsize = sizeof(DynamicZoneCompass_Struct) + entries_size; + auto outapp = std::make_unique(OP_DzCompass, outsize); + auto outbuf = reinterpret_cast(outapp->pBuffer); + outbuf->count = count; + memcpy(outbuf->entries, compass_entries.data(), entries_size); + + return outapp; +} + +void Client::GoToDzSafeReturnOrBind(const DynamicZone* dynamic_zone) +{ + if (dynamic_zone) + { + auto safereturn = dynamic_zone->GetSafeReturnLocation(); + if (safereturn.zone_id != 0) + { + LogDynamicZonesDetail("Sending [{}] to safereturn zone [{}]", CharacterID(), safereturn.zone_id); + MovePC(safereturn.zone_id, 0, safereturn.x, safereturn.y, safereturn.z, safereturn.heading); + return; + } + } + + GoToBind(); +} + +std::vector Client::GetDynamicZones(uint32_t zone_id, int zone_version) +{ + std::vector client_dzs; + + // check client systems for any associated dynamic zones optionally filtered by zone + Expedition* expedition = GetExpedition(); + if (expedition && + (zone_id == 0 || expedition->GetDynamicZone().GetZoneID() == zone_id) && + (zone_version < 0 || expedition->GetDynamicZone().GetZoneVersion() == zone_version)) + { + client_dzs.emplace_back(&expedition->GetDynamicZone()); + } + + // todo: tasks, missions (shared tasks), and quests with an associated dz to zone_id + + return client_dzs; +} + +void Client::MovePCDynamicZone(uint32 zone_id, int zone_version, bool msg_if_invalid) +{ + if (zone_id == 0) + { + return; + } + + auto client_dzs = GetDynamicZones(zone_id, zone_version); + + if (client_dzs.empty()) + { + if (msg_if_invalid) + { + MessageString(Chat::Red, DYNAMICZONE_WAY_IS_BLOCKED); // unconfirmed message + } + } + else if (client_dzs.size() == 1) + { + auto dz = client_dzs.front(); + DynamicZoneLocation zonein = dz->GetZoneInLocation(); + ZoneMode zone_mode = dz->HasZoneInLocation() ? ZoneMode::ZoneSolicited : ZoneMode::ZoneToSafeCoords; + MovePC(zone_id, dz->GetInstanceID(), zonein.x, zonein.y, zonein.z, zonein.heading, 0, zone_mode); + } + else + { + LogDynamicZonesDetail("Sending DzSwitchListWnd to [{}] for zone [{}] with [{}] dynamic zone(s)", + CharacterID(), zone_id, client_dzs.size()); + + // client has more than one dz for this zone, send out the switchlist window + QueuePacket(CreateDzSwitchListPacket(client_dzs).get()); + } +} + +std::unique_ptr Client::CreateDzSwitchListPacket( + const std::vector& client_dzs) +{ + uint32 count = static_cast(client_dzs.size()); + uint32 entries_size = sizeof(DynamicZoneChooseZoneEntry_Struct) * count; + uint32 outsize = sizeof(DynamicZoneChooseZone_Struct) + entries_size; + auto outapp = std::make_unique(OP_DzChooseZone, outsize); + auto outbuf = reinterpret_cast(outapp->pBuffer); + outbuf->count = count; + for (int i = 0; i < client_dzs.size(); ++i) + { + outbuf->choices[i].dz_zone_id = client_dzs[i]->GetZoneID(); + outbuf->choices[i].dz_instance_id = client_dzs[i]->GetInstanceID(); + outbuf->choices[i].dz_type = static_cast(client_dzs[i]->GetType()); + strn0cpy(outbuf->choices[i].description, client_dzs[i]->GetName().c_str(), sizeof(outbuf->choices[i].description)); + strn0cpy(outbuf->choices[i].leader_name, client_dzs[i]->GetLeaderName().c_str(), sizeof(outbuf->choices[i].leader_name)); + } + return outapp; +} + +void Client::MovePCDynamicZone(const std::string& zone_name, int zone_version, bool msg_if_invalid) +{ + auto zone_id = ZoneID(zone_name.c_str()); + MovePCDynamicZone(zone_id, zone_version, msg_if_invalid); +} + +void Client::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clipping) { + BuffFadeByEffect(SE_Levitate); + if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) { + auto outapp_fling = new EQApplicationPacket(OP_Fling, sizeof(fling_struct)); + fling_struct* flingTo = (fling_struct*)outapp_fling->pBuffer; + if(clipping) + flingTo->collision = 0; + else + flingTo->collision = -1; + + flingTo->travel_time = -1; + flingTo->unk3 = 1; + flingTo->disable_fall_damage = 1; + flingTo->speed_z = value; + flingTo->new_y = target_y; + flingTo->new_x = target_x; + flingTo->new_z = target_z; + outapp_fling->priority = 6; + FastQueuePacket(&outapp_fling); + } +} + +std::vector Client::GetLearnableDisciplines(uint8 min_level, uint8 max_level) { + bool SpellGlobalRule = RuleB(Spells, EnableSpellGlobals); + bool SpellBucketRule = RuleB(Spells, EnableSpellBuckets); + bool SpellGlobalCheckResult = false; + bool SpellBucketCheckResult = false; + std::vector learnable_disciplines; + for (int spell_id = 0; spell_id < SPDAT_RECORDS; ++spell_id) { + bool learnable = false; + if (!IsValidSpell(spell_id)) + continue; + if (!IsDiscipline(spell_id)) + continue; + if (spells[spell_id].classes[WARRIOR] == 0) + continue; + if (max_level > 0 && spells[spell_id].classes[m_pp.class_ - 1] > max_level) + continue; + if (min_level > 1 && spells[spell_id].classes[m_pp.class_ - 1] < min_level) + continue; + if (spells[spell_id].skill == 52) + continue; + if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effectid[EFFECT_COUNT - 1] == 10) + continue; + if (HasDisciplineLearned(spell_id)) + continue; + + if (SpellGlobalRule) { + SpellGlobalCheckResult = SpellGlobalCheck(spell_id, CharacterID()); + if (SpellGlobalCheckResult) { + learnable = true; + } + } else if (SpellBucketRule) { + SpellBucketCheckResult = SpellBucketCheck(spell_id, CharacterID()); + if (SpellBucketCheckResult) { + learnable = true; + } + } else { + learnable = true; + } + + if (learnable) { + learnable_disciplines.push_back(spell_id); + } + } + return learnable_disciplines; +} + +std::vector Client::GetLearnedDisciplines() { + std::vector learned_disciplines; + for (int index = 0; index < MAX_PP_DISCIPLINES; index++) { + if (IsValidSpell(m_pp.disciplines.values[index])) { + learned_disciplines.push_back(m_pp.disciplines.values[index]); + } + } + return learned_disciplines; +} + +std::vector Client::GetMemmedSpells() { + std::vector memmed_spells; + for (int index = 0; index < EQ::spells::SPELL_GEM_COUNT; index++) { + if (IsValidSpell(m_pp.mem_spells[index])) { + memmed_spells.push_back(m_pp.mem_spells[index]); + } + } + return memmed_spells; +} + +std::vector Client::GetScribeableSpells(uint8 min_level, uint8 max_level) { + bool SpellGlobalRule = RuleB(Spells, EnableSpellGlobals); + bool SpellBucketRule = RuleB(Spells, EnableSpellBuckets); + bool SpellGlobalCheckResult = false; + bool SpellBucketCheckResult = false; + std::vector scribeable_spells; + for (int spell_id = 0; spell_id < SPDAT_RECORDS; ++spell_id) { + bool scribeable = false; + if (!IsValidSpell(spell_id)) + continue; + if (IsDiscipline(spell_id)) + continue; + if (spells[spell_id].classes[WARRIOR] == 0) + continue; + if (max_level > 0 && spells[spell_id].classes[m_pp.class_ - 1] > max_level) + continue; + if (min_level > 1 && spells[spell_id].classes[m_pp.class_ - 1] < min_level) + continue; + if (spells[spell_id].skill == 52) + continue; + if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effectid[EFFECT_COUNT - 1] == 10) + continue; + if (HasSpellScribed(spell_id)) + continue; + + if (SpellGlobalRule) { + SpellGlobalCheckResult = SpellGlobalCheck(spell_id, CharacterID()); + if (SpellGlobalCheckResult) { + scribeable = true; + } + } else if (SpellBucketRule) { + SpellBucketCheckResult = SpellBucketCheck(spell_id, CharacterID()); + if (SpellBucketCheckResult) { + scribeable = true; + } + } else { + scribeable = true; + } + + if (scribeable) { + scribeable_spells.push_back(spell_id); + } + } + return scribeable_spells; +} + +std::vector Client::GetScribedSpells() { + std::vector scribed_spells; + for(int index = 0; index < EQ::spells::SPELLBOOK_SIZE; index++) { + if (IsValidSpell(m_pp.spell_book[index])) { + scribed_spells.push_back(m_pp.spell_book[index]); + } + } + return scribed_spells; +} + +void Client::SetAnon(uint8 anon_flag) { + m_pp.anon = anon_flag; + auto outapp = new EQApplicationPacket(OP_SpawnAppearance, sizeof(SpawnAppearance_Struct)); + SpawnAppearance_Struct* spawn_appearance = (SpawnAppearance_Struct*)outapp->pBuffer; + spawn_appearance->spawn_id = this->GetID(); + spawn_appearance->type = AT_Anon; + spawn_appearance->parameter = anon_flag; + entity_list.QueueClients(this, outapp); + Save(); + UpdateWho(); + safe_delete(outapp); +} + +void Client::SetAFK(uint8 afk_flag) { + AFK = afk_flag; + auto outapp = new EQApplicationPacket(OP_SpawnAppearance, sizeof(SpawnAppearance_Struct)); + SpawnAppearance_Struct* spawn_appearance = (SpawnAppearance_Struct*)outapp->pBuffer; + spawn_appearance->spawn_id = this->GetID(); + spawn_appearance->type = AT_AFK; + spawn_appearance->parameter = afk_flag; + entity_list.QueueClients(this, outapp); + safe_delete(outapp); +} diff --git a/zone/client.h b/zone/client.h index fa863fae7..6e2840217 100644 --- a/zone/client.h +++ b/zone/client.h @@ -21,15 +21,20 @@ class Client; class EQApplicationPacket; class EQStream; +class DynamicZone; +class Expedition; +class ExpeditionLockoutTimer; +class ExpeditionRequest; class Group; class NPC; class Object; class Raid; class Seperator; class ServerPacket; +struct DynamicZoneLocation; enum WaterRegionType : int; -namespace EQEmu +namespace EQ { struct ItemData; } @@ -58,6 +63,9 @@ namespace EQEmu #include "questmgr.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" +#include "task_manager.h" +#include "task_client_state.h" #ifdef _WINDOWS // since windows defines these within windef.h (which windows.h include) @@ -79,7 +87,7 @@ namespace EQEmu #define XTARGET_HARDCAP 20 extern Zone* zone; -extern TaskManager *taskmanager; +extern TaskManager *task_manager; class CLIENTPACKET { @@ -231,18 +239,20 @@ public: void SetDisplayMobInfoWindow(bool display_mob_info_window); bool GetDisplayMobInfoWindow() const; - bool IsDevToolsWindowEnabled() const; - void SetDevToolsWindowEnabled(bool dev_tools_window_enabled); + bool IsDevToolsEnabled() const; + void SetDevToolsEnabled(bool in_dev_tools_enabled); void SetPrimaryWeaponOrnamentation(uint32 model_id); void SetSecondaryWeaponOrnamentation(uint32 model_id); + void SendChatLineBreak(uint16 color = Chat::White); + bool GotoPlayer(std::string player_name); //abstract virtual function implementations required by base abstract class - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill); - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill); + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr); virtual bool HasRaid() { return (GetRaid() ? true : false); } virtual bool HasGroup() { return (GetGroup() ? true : false); } @@ -270,15 +280,17 @@ public: void KeyRingList(); virtual bool IsClient() const { return true; } void CompleteConnect(); - bool TryStacking(EQEmu::ItemInstance* item, uint8 type = ItemPacketTrade, bool try_worn = true, bool try_cursor = true); + bool TryStacking(EQ::ItemInstance* item, uint8 type = ItemPacketTrade, bool try_worn = true, bool try_cursor = true); void SendTraderPacket(Client* trader, uint32 Unknown72 = 51); void SendBuyerPacket(Client* Buyer); GetItems_Struct* GetTraderItems(); void SendBazaarWelcome(); - void DyeArmor(EQEmu::TintProfile* dye); + void DyeArmor(EQ::TintProfile* dye); + void DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue, uint8 use_tint = 0x00); uint8 SlotConvert(uint8 slot,bool bracer=false); void MessageString(uint32 type, uint32 string_id, uint32 distance = 0); void MessageString(uint32 type, uint32 string_id, const char* message,const char* message2=0,const char* message3=0,const char* message4=0,const char* message5=0,const char* message6=0,const char* message7=0,const char* message8=0,const char* message9=0, uint32 distance = 0); + void MessageString(const CZClientMessageString_Struct* msg); bool FilteredMessageCheck(Mob *sender, eqFilterType filter); void FilteredMessageString(Mob *sender, uint32 type, eqFilterType filter, uint32 string_id); void FilteredMessageString(Mob *sender, uint32 type, eqFilterType filter, @@ -293,7 +305,7 @@ public: void SendTraderItem(uint32 item_id,uint16 quantity); uint16 FindTraderItem(int32 SerialNumber,uint16 Quantity); uint32 FindTraderItemSerialNumber(int32 ItemID); - EQEmu::ItemInstance* FindTraderItemBySerialNumber(int32 SerialNumber); + EQ::ItemInstance* FindTraderItemBySerialNumber(int32 SerialNumber); void FindAndNukeTraderItem(int32 item_id,uint16 quantity,Client* customer,uint16 traderslot); void NukeTraderItem(uint16 slot, int16 charges, uint16 quantity, Client* customer, uint16 traderslot, int32 uniqueid, int32 itemid = 0); void ReturnTraderReq(const EQApplicationPacket* app,int16 traderitemcharges, uint32 itemid = 0); @@ -316,7 +328,7 @@ public: bool ShouldISpawnFor(Client *c) { return !GMHideMe(c) && !IsHoveringForRespawn(); } virtual bool Process(); void ProcessPackets(); - void LogMerchant(Client* player, Mob* merchant, uint32 quantity, uint32 price, const EQEmu::ItemData* item, bool buying); + void LogMerchant(Client* player, Mob* merchant, uint32 quantity, uint32 price, const EQ::ItemData* item, bool buying); void QueuePacket(const EQApplicationPacket* app, bool ack_req = true, CLIENT_CONN_STATUS = CLIENT_CONNECTINGALL, eqFilterType filter=FilterNone); void FastQueuePacket(EQApplicationPacket** app, bool ack_req = true, CLIENT_CONN_STATUS = CLIENT_CONNECTINGALL); void ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_skill, const char* orig_message, const char* targetname=nullptr); @@ -325,10 +337,10 @@ public: void FilteredMessage(Mob *sender, uint32 type, eqFilterType filter, const char* message, ...); void VoiceMacroReceived(uint32 Type, char *Target, uint32 MacroNumber); void SendSound(); - void LearnRecipe(uint32 recipe_id); - bool CanIncreaseTradeskill(EQEmu::skills::SkillType tradeskill); + void LearnRecipe(uint32 recipeID); + bool CanIncreaseTradeskill(EQ::skills::SkillType tradeskill); - EQApplicationPacket* ReturnItemPacket(int16 slot_id, const EQEmu::ItemInstance* inst, ItemPacketType packet_type); + EQApplicationPacket* ReturnItemPacket(int16 slot_id, const EQ::ItemInstance* inst, ItemPacketType packet_type); bool GetRevoked() const { return revoked; } void SetRevoked(bool rev) { revoked = rev; } @@ -358,10 +370,13 @@ public: void Kick(const std::string &reason); void WorldKick(); inline uint8 GetAnon() const { return m_pp.anon; } + inline uint8 GetAFK() const { return AFK; } + void SetAnon(uint8 anon_flag); + void SetAFK(uint8 afk_flag); inline PlayerProfile_Struct& GetPP() { return m_pp; } inline ExtendedProfile_Struct& GetEPP() { return m_epp; } - inline EQEmu::InventoryProfile& GetInv() { return m_inv; } - inline const EQEmu::InventoryProfile& GetInv() const { return m_inv; } + inline EQ::InventoryProfile& GetInv() { return m_inv; } + inline const EQ::InventoryProfile& GetInv() const { return m_inv; } inline PetInfo* GetPetInfo(uint16 pet) { return (pet==1)?&m_suspendedminion:&m_petinfo; } inline InspectMessage_Struct& GetInspectMessage() { return m_inspect_message; } inline const InspectMessage_Struct& GetInspectMessage() const { return m_inspect_message; } @@ -411,7 +426,7 @@ public: inline const float GetBindY(uint32 index = 0) const { return m_pp.binds[index].y; } inline const float GetBindZ(uint32 index = 0) const { return m_pp.binds[index].z; } inline const float GetBindHeading(uint32 index = 0) const { return m_pp.binds[index].heading; } - inline uint32 GetBindZoneID(uint32 index = 0) const { return m_pp.binds[index].zoneId; } + inline uint32 GetBindZoneID(uint32 index = 0) const { return m_pp.binds[index].zone_id; } inline uint32 GetBindInstanceID(uint32 index = 0) const { return m_pp.binds[index].instance_id; } int32 CalcMaxMana(); int32 CalcBaseMana(); @@ -435,7 +450,7 @@ public: inline uint8 GetLanguageSkill(uint16 n) const { return m_pp.languages[n]; } - void SendPickPocketResponse(Mob *from, uint32 amt, int type, const EQEmu::ItemData* item = nullptr); + void SendPickPocketResponse(Mob *from, uint32 amt, int type, const EQ::ItemData* item = nullptr); inline const char* GetLastName() const { return lastname; } @@ -444,6 +459,8 @@ public: inline float ProximityZ() const { return m_Proximity.z; } inline void ClearAllProximities() { entity_list.ProcessMove(this, glm::vec3(FLT_MAX, FLT_MAX, FLT_MAX)); m_Proximity = glm::vec3(FLT_MAX,FLT_MAX,FLT_MAX); } + void CheckVirtualZoneLines(); + /* Begin client modifiers */ @@ -539,10 +556,10 @@ public: virtual int GetCurrentBuffSlots() const; virtual int GetCurrentSongSlots() const; virtual int GetCurrentDiscSlots() const { return 1; } - virtual int GetMaxBuffSlots() const { return EQEmu::spells::LONG_BUFFS; } - virtual int GetMaxSongSlots() const { return EQEmu::spells::SHORT_BUFFS; } - virtual int GetMaxDiscSlots() const { return EQEmu::spells::DISC_BUFFS; } - virtual int GetMaxTotalSlots() const { return EQEmu::spells::TOTAL_BUFFS; } + virtual int GetMaxBuffSlots() const { return EQ::spells::LONG_BUFFS; } + virtual int GetMaxSongSlots() const { return EQ::spells::SHORT_BUFFS; } + virtual int GetMaxDiscSlots() const { return EQ::spells::DISC_BUFFS; } + virtual int GetMaxTotalSlots() const { return EQ::spells::TOTAL_BUFFS; } virtual uint32 GetFirstBuffSlot(bool disc, bool song); virtual uint32 GetLastBuffSlot(bool disc, bool song); virtual void InitializeBuffSlots(); @@ -583,14 +600,19 @@ public: inline uint32 GetEXP() const { return m_pp.exp; } + inline double GetAAEXPModifier(uint32 zone_id) const { return database.GetAAEXPModifier(CharacterID(), zone_id); }; + inline double GetEXPModifier(uint32 zone_id) const { return database.GetEXPModifier(CharacterID(), zone_id); }; + inline void SetAAEXPModifier(uint32 zone_id, double aa_modifier) { database.SetAAEXPModifier(CharacterID(), zone_id, aa_modifier); }; + inline void SetEXPModifier(uint32 zone_id, double exp_modifier) { database.SetEXPModifier(CharacterID(), zone_id, exp_modifier); }; + bool UpdateLDoNPoints(int32 points, uint32 theme); void SetPVPPoints(uint32 Points) { m_pp.PVPCurrentPoints = Points; } uint32 GetPVPPoints() { return m_pp.PVPCurrentPoints; } void AddPVPPoints(uint32 Points); uint32 GetRadiantCrystals() { return m_pp.currentRadCrystals; } - void SetRadiantCrystals(uint32 Crystals) { m_pp.currentRadCrystals = Crystals; } + void SetRadiantCrystals(uint32 value); uint32 GetEbonCrystals() { return m_pp.currentEbonCrystals; } - void SetEbonCrystals(uint32 Crystals) { m_pp.currentEbonCrystals = Crystals; } + void SetEbonCrystals(uint32 value); void AddCrystals(uint32 Radiant, uint32 Ebon); void SendCrystalCounts(); @@ -627,16 +649,24 @@ public: void GoToSafeCoords(uint16 zone_id, uint16 instance_id); void Gate(uint8 bindnum = 0); void SetBindPoint(int bind_num = 0, int to_zone = -1, int to_instance = 0, const glm::vec3& location = glm::vec3()); - void SetStartZone(uint32 zoneid, float x = 0.0f, float y =0.0f, float z = 0.0f); + void SetBindPoint2(int bind_num = 0, int to_zone = -1, int to_instance = 0, const glm::vec4& location = glm::vec4()); + void SetStartZone(uint32 zoneid, float x = 0.0f, float y =0.0f, float z = 0.0f, float heading = 0.0f); uint32 GetStartZone(void); void MovePC(const char* zonename, float x, float y, float z, float heading, uint8 ignorerestrictions = 0, ZoneMode zm = ZoneSolicited); void MovePC(uint32 zoneID, float x, float y, float z, float heading, uint8 ignorerestrictions = 0, ZoneMode zm = ZoneSolicited); void MovePC(float x, float y, float z, float heading, uint8 ignorerestrictions = 0, ZoneMode zm = ZoneSolicited); void MovePC(uint32 zoneID, uint32 instanceID, float x, float y, float z, float heading, uint8 ignorerestrictions = 0, ZoneMode zm = ZoneSolicited); + void MoveZone(const char *zone_short_name); + void MoveZoneGroup(const char *zone_short_name); + void MoveZoneRaid(const char *zone_short_name); + void MoveZoneInstance(uint16 instance_id); + void MoveZoneInstanceGroup(uint16 instance_id); + void MoveZoneInstanceRaid(uint16 instance_id); + void SendToGuildHall(); void AssignToInstance(uint16 instance_id); void RemoveFromInstance(uint16 instance_id); void WhoAll(); - bool CheckLoreConflict(const EQEmu::ItemData* item); + bool CheckLoreConflict(const EQ::ItemData* item); void ChangeLastName(const char* in_lastname); void GetGroupAAs(GroupLeadershipAA_Struct *into) const; void GetRaidAAs(RaidLeadershipAA_Struct *into) const; @@ -691,7 +721,7 @@ public: int GetClientMaxLevel() const { return client_max_level; } void SetClientMaxLevel(int max_level) { client_max_level = max_level; } - + void CheckManaEndUpdate(); void SendManaUpdate(); void SendEnduranceUpdate(); @@ -724,31 +754,31 @@ public: uint16 GetSkillPoints() { return m_pp.points;} void SetSkillPoints(int inp) { m_pp.points = inp;} - void IncreaseSkill(int skill_id, int value = 1) { if (skill_id <= EQEmu::skills::HIGHEST_SKILL) { m_pp.skills[skill_id] += value; } } + void IncreaseSkill(int skill_id, int value = 1) { if (skill_id <= EQ::skills::HIGHEST_SKILL) { m_pp.skills[skill_id] += value; } } void IncreaseLanguageSkill(int skill_id, int value = 1); - virtual uint16 GetSkill(EQEmu::skills::SkillType skill_id) const { if (skill_id <= EQEmu::skills::HIGHEST_SKILL) { return(itembonuses.skillmod[skill_id] > 0 ? (itembonuses.skillmodmax[skill_id] > 0 ? std::min(m_pp.skills[skill_id] + itembonuses.skillmodmax[skill_id], m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100) : m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100) : m_pp.skills[skill_id]); } return 0; } - uint32 GetRawSkill(EQEmu::skills::SkillType skill_id) const { if (skill_id <= EQEmu::skills::HIGHEST_SKILL) { return(m_pp.skills[skill_id]); } return 0; } - bool HasSkill(EQEmu::skills::SkillType skill_id) const; - bool CanHaveSkill(EQEmu::skills::SkillType skill_id) const; - void SetSkill(EQEmu::skills::SkillType skill_num, uint16 value); - void AddSkill(EQEmu::skills::SkillType skillid, uint16 value); + virtual uint16 GetSkill(EQ::skills::SkillType skill_id) const { if (skill_id <= EQ::skills::HIGHEST_SKILL) { return(itembonuses.skillmod[skill_id] > 0 ? (itembonuses.skillmodmax[skill_id] > 0 ? std::min(m_pp.skills[skill_id] + itembonuses.skillmodmax[skill_id], m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100) : m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100) : m_pp.skills[skill_id]); } return 0; } + uint32 GetRawSkill(EQ::skills::SkillType skill_id) const { if (skill_id <= EQ::skills::HIGHEST_SKILL) { return(m_pp.skills[skill_id]); } return 0; } + bool HasSkill(EQ::skills::SkillType skill_id) const; + bool CanHaveSkill(EQ::skills::SkillType skill_id) const; + void SetSkill(EQ::skills::SkillType skill_num, uint16 value); + void AddSkill(EQ::skills::SkillType skillid, uint16 value); void CheckSpecializeIncrease(uint16 spell_id); void CheckSongSkillIncrease(uint16 spell_id); - bool CheckIncreaseSkill(EQEmu::skills::SkillType skillid, Mob *against_who, int chancemodi = 0); + bool CheckIncreaseSkill(EQ::skills::SkillType skillid, Mob *against_who, int chancemodi = 0); void CheckLanguageSkillIncrease(uint8 langid, uint8 TeacherSkill); void SetLanguageSkill(int langid, int value); void SetHoTT(uint32 mobid); void ShowSkillsWindow(); void SendStatsWindow(Client* client, bool use_window); - uint16 MaxSkill(EQEmu::skills::SkillType skillid, uint16 class_, uint16 level) const; - inline uint16 MaxSkill(EQEmu::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } - uint8 SkillTrainLevel(EQEmu::skills::SkillType skillid, uint16 class_); + uint16 MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const; + inline uint16 MaxSkill(EQ::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } + uint8 SkillTrainLevel(EQ::skills::SkillType skillid, uint16 class_); void SendTradeskillSearchResults(const std::string &query, unsigned long objtype, unsigned long someid); void SendTradeskillDetails(uint32 recipe_id); bool TradeskillExecute(DBTradeskillRecipe_Struct *spec); - void CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, EQEmu::skills::SkillType tradeskill); + void CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, EQ::skills::SkillType tradeskill); void InitInnates(); void GMKill(); @@ -764,6 +794,11 @@ public: void UnmemSpellAll(bool update_client = true); uint16 FindMemmedSpellBySlot(int slot); int MemmedCount(); + std::vector GetLearnableDisciplines(uint8 min_level = 1, uint8 max_level = 0); + std::vector GetLearnedDisciplines(); + std::vector GetMemmedSpells(); + std::vector GetScribeableSpells(uint8 min_level = 1, uint8 max_level = 0); + std::vector GetScribedSpells(); void ScribeSpell(uint16 spell_id, int slot, bool update_client = true); void UnscribeSpell(int slot, bool update_client = true); void UnscribeSpellAll(bool update_client = true); @@ -774,6 +809,8 @@ public: uint32 GetCharMaxLevelFromQGlobal(); uint32 GetCharMaxLevelFromBucket(); + void Fling(float value, float target_x, float target_y, float target_z, bool ignore_los = false, bool clipping = false); + inline bool IsStanding() const {return (playeraction == 0);} inline bool IsSitting() const {return (playeraction == 1);} inline bool IsCrouching() const {return (playeraction == 2);} @@ -790,7 +827,7 @@ public: #endif uint32 GetEquippedItemFromTextureSlot(uint8 material_slot) const; // returns item id uint32 GetEquipmentColor(uint8 material_slot) const; - virtual void UpdateEquipmentLight() { m_Light.Type[EQEmu::lightsource::LightEquipment] = m_inv.FindBrightestLightType(); m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); } + virtual void UpdateEquipmentLight() { m_Light.Type[EQ::lightsource::LightEquipment] = m_inv.FindBrightestLightType(); m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } inline bool AutoSplitEnabled() { return m_pp.autosplit != 0; } inline bool AutoConsentGroupEnabled() const { return m_pp.groupAutoconsent != 0; } @@ -862,31 +899,31 @@ public: uint32 NukeItem(uint32 itemnum, uint8 where_to_check = (invWhereWorn | invWherePersonal | invWhereBank | invWhereSharedBank | invWhereTrading | invWhereCursor)); void SetTint(int16 slot_id, uint32 color); - void SetTint(int16 slot_id, EQEmu::textures::Tint_Struct& color); + void SetTint(int16 slot_id, EQ::textures::Tint_Struct& color); void SetMaterial(int16 slot_id, uint32 item_id); void Undye(); int32 GetItemIDAt(int16 slot_id); int32 GetAugmentIDAt(int16 slot_id, uint8 augslot); - bool PutItemInInventory(int16 slot_id, const EQEmu::ItemInstance& inst, bool client_update = false); - bool PushItemOnCursor(const EQEmu::ItemInstance& inst, bool client_update = false); + bool PutItemInInventory(int16 slot_id, const EQ::ItemInstance& inst, bool client_update = false); + bool PushItemOnCursor(const EQ::ItemInstance& inst, bool client_update = false); void SendCursorBuffer(); void DeleteItemInInventory(int16 slot_id, int8 quantity = 0, bool client_update = false, bool update_db = true); bool SwapItem(MoveItem_Struct* move_in); void SwapItemResync(MoveItem_Struct* move_slots); void QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call = false); - void PutLootInInventory(int16 slot_id, const EQEmu::ItemInstance &inst, ServerLootItem_Struct** bag_item_data = 0); - bool AutoPutLootInInventory(EQEmu::ItemInstance& inst, bool try_worn = false, bool try_cursor = true, ServerLootItem_Struct** bag_item_data = 0); - bool SummonItem(uint32 item_id, int16 charges = -1, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, bool attuned = false, uint16 to_slot = EQEmu::invslot::slotCursor, uint32 ornament_icon = 0, uint32 ornament_idfile = 0, uint32 ornament_hero_model = 0); + void PutLootInInventory(int16 slot_id, const EQ::ItemInstance &inst, ServerLootItem_Struct** bag_item_data = 0); + bool AutoPutLootInInventory(EQ::ItemInstance& inst, bool try_worn = false, bool try_cursor = true, ServerLootItem_Struct** bag_item_data = 0); + bool SummonItem(uint32 item_id, int16 charges = -1, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0, bool attuned = false, uint16 to_slot = EQ::invslot::slotCursor, uint32 ornament_icon = 0, uint32 ornament_idfile = 0, uint32 ornament_hero_model = 0); void SetStats(uint8 type,int16 set_val); void IncStats(uint8 type,int16 increase_val); void DropItem(int16 slot_id, bool recurse = true); - void DropItemQS(EQEmu::ItemInstance* inst, bool pickup); + void DropItemQS(EQ::ItemInstance* inst, bool pickup); - int GetItemLinkHash(const EQEmu::ItemInstance* inst); // move to ItemData..or make use of the pre-calculated database field + int GetItemLinkHash(const EQ::ItemInstance* inst); // move to ItemData..or make use of the pre-calculated database field - void SendItemLink(const EQEmu::ItemInstance* inst, bool sendtoall=false); - void SendLootItemInPacket(const EQEmu::ItemInstance* inst, int16 slot_id); - void SendItemPacket(int16 slot_id, const EQEmu::ItemInstance* inst, ItemPacketType packet_type); + void SendItemLink(const EQ::ItemInstance* inst, bool sendtoall=false); + void SendLootItemInPacket(const EQ::ItemInstance* inst, int16 slot_id); + void SendItemPacket(int16 slot_id, const EQ::ItemInstance* inst, ItemPacketType packet_type); bool IsValidSlot(uint32 slot); bool IsBankSlot(uint32 slot); @@ -944,13 +981,16 @@ public: //Calculate vendor price modifier based on CHA: (reverse==selling) float CalcPriceMod(Mob* other = 0, bool reverse = false); void ResetTrade(); - void DropInst(const EQEmu::ItemInstance* inst); + void DropInst(const EQ::ItemInstance* inst); bool TrainDiscipline(uint32 itemid); void TrainDiscBySpellID(int32 spell_id); + uint32 GetDisciplineTimer(uint32 timer_id); int GetDiscSlotBySpellID(int32 spellid); + void ResetDisciplineTimer(uint32 timer_id); void SendDisciplineUpdate(); void SendDisciplineTimer(uint32 timer_id, uint32 duration); bool UseDiscipline(uint32 spell_id, uint32 target); + bool HasDisciplineLearned(uint16 spell_id); void SetLinkedSpellReuseTimer(uint32 timer_id, uint32 duration); bool IsLinkedSpellReuseTimerReady(uint32 timer_id); @@ -973,10 +1013,11 @@ public: void ProcessInspectRequest(Client* requestee, Client* requester); bool ClientFinishedLoading() { return (conn_state == ClientConnectFinished); } int FindSpellBookSlotBySpellID(uint16 spellid); + uint32 GetSpellIDByBookSlot(int book_slot); int GetNextAvailableSpellBookSlot(int starting_slot = 0); inline uint32 GetSpellByBookSlot(int book_slot) { return m_pp.spell_book[book_slot]; } - inline bool HasSpellScribed(int spellid) { return (FindSpellBookSlotBySpellID(spellid) != -1 ? true : false); } - uint16 GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skillid, uint16 maxSkill); + inline bool HasSpellScribed(int spellid) { return FindSpellBookSlotBySpellID(spellid) != -1; } + uint16 GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill); void SendPopupToClient(const char *Title, const char *Text, uint32 PopupID = 0, uint32 Buttons = 0, uint32 Duration = 0); void SendFullPopup(const char *Title, const char *Text, uint32 PopupID = 0, uint32 NegativeID = 0, uint32 Buttons = 0, uint32 Duration = 0, const char *ButtonName0 = 0, const char *ButtonName1 = 0, uint32 SoundControls = 0); void SendWindow(uint32 PopupID, uint32 NegativeID, uint32 Buttons, const char *ButtonName0, const char *ButtonName1, uint32 Duration, int title_type, Client* target, const char *Title, const char *Text, ...); @@ -990,51 +1031,245 @@ public: // Task System Methods void LoadClientTaskState(); void RemoveClientTaskState(); - void SendTaskActivityComplete(int TaskID, int ActivityID, int TaskIndex, TaskType type, int TaskIncomplete=1); - void SendTaskFailed(int TaskID, int TaskIndex, TaskType type); - void SendTaskComplete(int TaskIndex); - inline ClientTaskState *GetTaskState() const { return taskstate; } + void SendTaskActivityComplete(int task_id, int activity_id, int task_index, TaskType task_type, int task_incomplete=1); + void SendTaskFailed(int task_id, int task_index, TaskType task_type); + void SendTaskComplete(int task_index); + inline ClientTaskState *GetTaskState() const { return task_state; } + inline void CancelTask(int task_index, TaskType task_type) + { + if (task_state) { + task_state->CancelTask( + this, + task_index, + task_type + ); + } + } + inline bool SaveTaskState() + { + return task_manager != nullptr && task_manager->SaveClientState(this, task_state); + } + inline bool IsTaskStateLoaded() { return task_state != nullptr; } + inline bool IsTaskActive(int task_id) { return task_state != nullptr && task_state->IsTaskActive(task_id); } + inline bool IsTaskActivityActive(int task_id, int activity_id) + { + return task_state != nullptr && + task_state->IsTaskActivityActive( + task_id, + activity_id + ); + } + inline ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id) + { + return (task_state ? task_state->GetTaskActivityState(task_type, index, activity_id) : ActivityHidden); + } + inline void UpdateTaskActivity( + int task_id, + int activity_id, + int count, + bool ignore_quest_update = false + ) + { + if (task_state) { + task_state->UpdateTaskActivity(this, task_id, activity_id, count, ignore_quest_update); + } + } + inline void RemoveTaskByTaskID(uint32 task_id) { + if (task_state) { + task_state->RemoveTaskByTaskID(this, task_id); + } + } + inline void ResetTaskActivity(int task_id, int activity_id) + { + if (task_state) { + task_state->ResetTaskActivity( + this, + task_id, + activity_id + ); + } + } + inline void UpdateTasksOnKill(int npc_type_id) + { + if (task_state) { + task_state->UpdateTasksOnKill( + this, + npc_type_id + ); + } + } + inline void UpdateTasksForItem( + ActivityType activity_type, + int item_id, + int count = 1 + ) + { + if (task_state) { + task_state->UpdateTasksForItem(this, activity_type, item_id, count); + } + } + inline void UpdateTasksOnExplore(int explore_id) + { + if (task_state) { + task_state->UpdateTasksOnExplore( + this, + explore_id + ); + } + } + inline bool UpdateTasksOnSpeakWith(int npc_type_id) + { + if (task_state) { + return task_state->UpdateTasksOnSpeakWith( + this, + npc_type_id + ); + } + else { return false; } + } + inline bool UpdateTasksOnDeliver( + std::list &items, + int cash, + int npc_type_id + ) + { + if (task_state) { + return task_state->UpdateTasksOnDeliver( + this, + items, + cash, + npc_type_id + ); + } + else { return false; } + } + inline void TaskSetSelector(Mob *mob, int task_set_id) + { + if (task_manager) { + task_manager->TaskSetSelector( + this, + task_state, + mob, + task_set_id + ); + } + } + inline void TaskQuestSetSelector(Mob *mob, int count, int *tasks) + { + if (task_manager) { + task_manager->TaskQuestSetSelector( + this, + task_state, + mob, + count, + tasks + ); + } + } + inline void EnableTask(int task_count, int *task_list) + { + if (task_state) { + task_state->EnableTask( + CharacterID(), + task_count, + task_list + ); + } + } + inline void DisableTask(int task_count, int *task_list) + { + if (task_state) { + task_state->DisableTask( + CharacterID(), + task_count, + task_list + ); + } + } + inline bool IsTaskEnabled(int task_id) { + return task_state != nullptr && task_state->IsTaskEnabled(task_id); + } + inline void ProcessTaskProximities(float x, float y, float z) + { + if (task_state) { + task_state->ProcessTaskProximities( + this, + x, + y, + z + ); + } + } + inline void AssignTask( + int task_id, + int npc_id, + bool enforce_level_requirement = false + ) { + if (task_state) { + task_state->AcceptNewTask(this, task_id, npc_id, enforce_level_requirement); + } + } + inline int ActiveSpeakTask(int npc_type_id) + { + if (task_state) { + return task_state->ActiveSpeakTask(npc_type_id); + } + else { + return 0; + } + } + inline int ActiveSpeakActivity(int npc_type_id, int task_id) + { + if (task_state) { + return task_state->ActiveSpeakActivity( + npc_type_id, + task_id + ); + } + else { return 0; } + } + inline void FailTask(int task_id) { if (task_state) { task_state->FailTask(this, task_id); }} + inline int TaskTimeLeft(int task_id) { return (task_state ? task_state->TaskTimeLeft(task_id) : 0); } + inline int EnabledTaskCount(int task_set_id) + { + return (task_state ? task_state->EnabledTaskCount(task_set_id) : -1); + } + inline int IsTaskCompleted(int task_id) { return (task_state ? task_state->IsTaskCompleted(task_id) : -1); } + inline void ShowClientTasks(Client *client) { if (task_state) { task_state->ShowClientTasks(client); }} + inline void CancelAllTasks() { if (task_state) { task_state->CancelAllTasks(this); }} + inline int GetActiveTaskCount() { return (task_state ? task_state->GetActiveTaskCount() : 0); } + inline int GetActiveTaskID(int index) { return (task_state ? task_state->GetActiveTaskID(index) : -1); } + inline int GetTaskStartTime(TaskType task_type, int index) + { + return (task_state ? task_state->GetTaskStartTime( + task_type, + index + ) : -1); + } + inline bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id) + { + return task_state != nullptr && task_state->IsTaskActivityCompleted(task_type, index, activity_id); + } + inline int GetTaskActivityDoneCount(TaskType task_type, int client_task_index, int activity_id) + { + return (task_state ? task_state->GetTaskActivityDoneCount(task_type, client_task_index, activity_id) : 0); + } + inline int GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) + { + return (task_state ? task_state->GetTaskActivityDoneCountFromTaskID(task_id, activity_id) : 0); + } + inline int ActiveTasksInSet(int task_set_id) + { + return (task_state ? task_state->ActiveTasksInSet(task_set_id) : 0); + } + inline int CompletedTasksInSet(int task_set_id) + { + return (task_state ? task_state->CompletedTasksInSet(task_set_id) : 0); + } - inline void CancelTask(int TaskIndex, TaskType type) { if(taskstate) taskstate->CancelTask(this, TaskIndex, type); } - inline bool SaveTaskState() { return (taskmanager ? taskmanager->SaveClientState(this, taskstate) : false); } - inline bool IsTaskStateLoaded() { return taskstate != nullptr; } - inline bool IsTaskActive(int TaskID) { return (taskstate ? taskstate->IsTaskActive(TaskID) : false); } - inline bool IsTaskActivityActive(int TaskID, int ActivityID) { return (taskstate ? taskstate->IsTaskActivityActive(TaskID, ActivityID) : false); } - inline ActivityState GetTaskActivityState(TaskType type, int index, int ActivityID) { return (taskstate ? taskstate->GetTaskActivityState(type, index, ActivityID) : ActivityHidden); } - inline void UpdateTaskActivity(int TaskID, int ActivityID, int Count, bool ignore_quest_update = false) { if (taskstate) taskstate->UpdateTaskActivity(this, TaskID, ActivityID, Count, ignore_quest_update); } - inline void ResetTaskActivity(int TaskID, int ActivityID) { if(taskstate) taskstate->ResetTaskActivity(this, TaskID, ActivityID); } - inline void UpdateTasksOnKill(int NPCTypeID) { if(taskstate) taskstate->UpdateTasksOnKill(this, NPCTypeID); } - inline void UpdateTasksForItem(ActivityType Type, int ItemID, int Count=1) { if(taskstate) taskstate->UpdateTasksForItem(this, Type, ItemID, Count); } - inline void UpdateTasksOnExplore(int ExploreID) { if(taskstate) taskstate->UpdateTasksOnExplore(this, ExploreID); } - inline bool UpdateTasksOnSpeakWith(int NPCTypeID) { if(taskstate) return taskstate->UpdateTasksOnSpeakWith(this, NPCTypeID); else return false; } - inline bool UpdateTasksOnDeliver(std::list& Items, int Cash, int NPCTypeID) { if (taskstate) return taskstate->UpdateTasksOnDeliver(this, Items, Cash, NPCTypeID); else return false; } - inline void TaskSetSelector(Mob *mob, int TaskSetID) { if(taskmanager) taskmanager->TaskSetSelector(this, taskstate, mob, TaskSetID); } - inline void TaskQuestSetSelector(Mob *mob, int count, int *tasks) { if(taskmanager) taskmanager->TaskQuestSetSelector(this, taskstate, mob, count, tasks); } - inline void EnableTask(int TaskCount, int *TaskList) { if(taskstate) taskstate->EnableTask(CharacterID(), TaskCount, TaskList); } - inline void DisableTask(int TaskCount, int *TaskList) { if(taskstate) taskstate->DisableTask(CharacterID(), TaskCount, TaskList); } - inline bool IsTaskEnabled(int TaskID) { return (taskstate ? taskstate->IsTaskEnabled(TaskID) : false); } - inline void ProcessTaskProximities(float X, float Y, float Z) { if(taskstate) taskstate->ProcessTaskProximities(this, X, Y, Z); } - inline void AssignTask(int TaskID, int NPCID, bool enforce_level_requirement = false) { if (taskstate) taskstate->AcceptNewTask(this, TaskID, NPCID, enforce_level_requirement); } - inline int ActiveSpeakTask(int NPCID) { if(taskstate) return taskstate->ActiveSpeakTask(NPCID); else return 0; } - inline int ActiveSpeakActivity(int NPCID, int TaskID) { if(taskstate) return taskstate->ActiveSpeakActivity(NPCID, TaskID); else return 0; } - inline void FailTask(int TaskID) { if(taskstate) taskstate->FailTask(this, TaskID); } - inline int TaskTimeLeft(int TaskID) { return (taskstate ? taskstate->TaskTimeLeft(TaskID) : 0); } - inline int EnabledTaskCount(int TaskSetID) { return (taskstate ? taskstate->EnabledTaskCount(TaskSetID) : -1); } - inline int IsTaskCompleted(int TaskID) { return (taskstate ? taskstate->IsTaskCompleted(TaskID) : -1); } - inline void ShowClientTasks() { if(taskstate) taskstate->ShowClientTasks(this); } - inline void CancelAllTasks() { if(taskstate) taskstate->CancelAllTasks(this); } - inline int GetActiveTaskCount() { return (taskstate ? taskstate->GetActiveTaskCount() : 0); } - inline int GetActiveTaskID(int index) { return (taskstate ? taskstate->GetActiveTaskID(index) : -1); } - inline int GetTaskStartTime(TaskType type, int index) { return (taskstate ? taskstate->GetTaskStartTime(type, index) : -1); } - inline bool IsTaskActivityCompleted(TaskType type, int index, int ActivityID) { return (taskstate ? taskstate->IsTaskActivityCompleted(type, index, ActivityID) : false); } - inline int GetTaskActivityDoneCount(TaskType type, int ClientTaskIndex, int ActivityID) { return (taskstate ? taskstate->GetTaskActivityDoneCount(type, ClientTaskIndex, ActivityID) :0); } - inline int GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID) { return (taskstate ? taskstate->GetTaskActivityDoneCountFromTaskID(TaskID, ActivityID) :0); } - inline int ActiveTasksInSet(int TaskSet) { return (taskstate ? taskstate->ActiveTasksInSet(TaskSet) :0); } - inline int CompletedTasksInSet(int TaskSet) { return (taskstate ? taskstate->CompletedTasksInSet(TaskSet) :0); } - - inline const EQEmu::versions::ClientVersion ClientVersion() const { return m_ClientVersion; } + inline const EQ::versions::ClientVersion ClientVersion() const { return m_ClientVersion; } inline const uint32 ClientVersionBit() const { return m_ClientVersionBit; } - inline void SetClientVersion(EQEmu::versions::ClientVersion client_version) { m_ClientVersion = client_version; } + inline void SetClientVersion(EQ::versions::ClientVersion client_version) { m_ClientVersion = client_version; } /** Adventure Stuff **/ void SendAdventureError(const char *error); @@ -1087,6 +1322,49 @@ public: void MarkSingleCompassLoc(float in_x, float in_y, float in_z, uint8 count=1); + // cross zone client messaging helpers (null client argument will fallback to messaging by name) + static void SendCrossZoneMessage( + Client* client, const std::string& client_name, uint16_t chat_type, const std::string& message); + static void SendCrossZoneMessageString( + Client* client, const std::string& client_name, uint16_t chat_type, + uint32_t string_id, const std::initializer_list& arguments = {}); + + void AddExpeditionLockout(const ExpeditionLockoutTimer& lockout, bool update_db = false); + void AddExpeditionLockoutDuration(const std::string& expedition_name, + const std::string& event_Name, int seconds, const std::string& uuid = {}, bool update_db = false); + void AddNewExpeditionLockout(const std::string& expedition_name, + const std::string& event_name, uint32_t duration, std::string uuid = {}); + Expedition* CreateExpedition(DynamicZone& dz_instance, ExpeditionRequest& request); + Expedition* CreateExpedition( + const std::string& zone_name, uint32 version, uint32 duration, const std::string& expedition_name, + uint32 min_players, uint32 max_players, bool disable_messages = false); + Expedition* GetExpedition() const; + uint32 GetExpeditionID() const { return m_expedition_id; } + const ExpeditionLockoutTimer* GetExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, bool include_expired = false) const; + const std::vector& GetExpeditionLockouts() const { return m_expedition_lockouts; }; + std::vector GetExpeditionLockouts(const std::string& expedition_name, bool include_expired = false); + uint32 GetPendingExpeditionInviteID() const { return m_pending_expedition_invite.expedition_id; } + bool HasExpeditionLockout(const std::string& expedition_name, const std::string& event_name, bool include_expired = false); + bool IsInExpedition() const { return m_expedition_id != 0; } + void RemoveAllExpeditionLockouts(const std::string& expedition_name, bool update_db = false); + void RemoveExpeditionLockout(const std::string& expedition_name, + const std::string& event_name, bool update_db = false); + void RequestPendingExpeditionInvite(); + void SendExpeditionLockoutTimers(); + void SetExpeditionID(uint32 expedition_id) { m_expedition_id = expedition_id; }; + void SetPendingExpeditionInvite(ExpeditionInvite&& invite) { m_pending_expedition_invite = invite; } + void UpdateExpeditionInfoAndLockouts(); + void DzListTimers(); + void SetDzRemovalTimer(bool enable_timer); + void SendDzCompassUpdate(); + void GoToDzSafeReturnOrBind(const DynamicZone* dynamic_zone); + void MovePCDynamicZone(uint32 zone_id, int zone_version = -1, bool msg_if_invalid = true); + void MovePCDynamicZone(const std::string& zone_name, int zone_version = -1, bool msg_if_invalid = true); + std::vector GetDynamicZones(uint32_t zone_id = 0, int zone_version = -1); + std::unique_ptr CreateDzSwitchListPacket(const std::vector& dzs); + std::unique_ptr CreateCompassPacket(const std::vector& entries); + void CalcItemScale(); bool CalcItemScale(uint32 slot_x, uint32 slot_y); // behavior change: 'slot_y' is now [RANGE]_END and not [RANGE]_END + 1 void DoItemEnterZone(); @@ -1123,7 +1401,7 @@ public: inline bool GetPendingGuildInvitation() { return PendingGuildInvitation; } void LocateCorpse(); void SendTargetCommand(uint32 EntityID); - bool MoveItemToInventory(EQEmu::ItemInstance *BInst, bool UpdateClient = false); + bool MoveItemToInventory(EQ::ItemInstance *BInst, bool UpdateClient = false); void HandleRespawnFromHover(uint32 Option); bool IsHoveringForRespawn() { return RespawnFromHoverTimer.Enabled(); } std::list respawn_options; @@ -1152,7 +1430,7 @@ public: void HandleLFGuildResponse(ServerPacket *pack); void SendLFGuildStatus(); void SendGuildLFGuildStatus(); - inline bool XTargettingAvailable() const { return ((m_ClientVersionBit & EQEmu::versions::maskUFAndLater) && RuleB(Character, EnableXTargetting)); } + inline bool XTargettingAvailable() const { return ((m_ClientVersionBit & EQ::versions::maskUFAndLater) && RuleB(Character, EnableXTargetting)); } inline uint8 GetMaxXTargets() const { return MaxXTargets; } void SetMaxXTargets(uint8 NewMax); bool IsXTarget(const Mob *m) const; @@ -1176,7 +1454,7 @@ public: bool GroupFollow(Client* inviter); inline bool GetRunMode() const { return runmode; } - inline bool AggroMeterAvailable() const { return ((m_ClientVersionBit & EQEmu::versions::maskRoF2AndLater)) && RuleB(Character, EnableAggroMeter); } // RoF untested + inline bool AggroMeterAvailable() const { return ((m_ClientVersionBit & EQ::versions::maskRoF2AndLater)) && RuleB(Character, EnableAggroMeter); } // RoF untested inline void SetAggroMeterLock(int in) { m_aggrometer.set_lock_id(in); } void ProcessAggroMeter(); // builds packet and sends @@ -1228,7 +1506,7 @@ public: void TryItemTick(int slot); void ItemTimerCheck(); void TryItemTimer(int slot); - void SendItemScale(EQEmu::ItemInstance *inst); + void SendItemScale(EQ::ItemInstance *inst); int32 GetActSTR() { return( std::min(GetMaxSTR(), GetSTR()) ); } int32 GetActSTA() { return( std::min(GetMaxSTA(), GetSTA()) ); } @@ -1240,13 +1518,13 @@ public: void LoadAccountFlags(); void SetAccountFlag(std::string flag, std::string val); std::string GetAccountFlag(std::string flag); - float GetDamageMultiplier(EQEmu::skills::SkillType how_long_has_this_been_missing); - void Consume(const EQEmu::ItemData *item, uint8 type, int16 slot, bool auto_consume); + float GetDamageMultiplier(EQ::skills::SkillType how_long_has_this_been_missing); + void Consume(const EQ::ItemData *item, uint8 type, int16 slot, bool auto_consume); void PlayMP3(const char* fname); void ExpeditionSay(const char *str, int ExpID); - int mod_client_damage(int damage, EQEmu::skills::SkillType skillinuse, int hand, const EQEmu::ItemInstance* weapon, Mob* other); + int mod_client_damage(int damage, EQ::skills::SkillType skillinuse, int hand, const EQ::ItemInstance* weapon, Mob* other); bool mod_client_message(char* message, uint8 chan_num); - bool mod_can_increase_skill(EQEmu::skills::SkillType skillid, Mob* against_who); + bool mod_can_increase_skill(EQ::skills::SkillType skillid, Mob* against_who); int16 mod_increase_skill_chance(int16 chance, Mob* against_who); int mod_bindwound_percent(int max_percent, Mob* bindmob); int mod_bindwound_hp(int bindhps, Mob* bindmob); @@ -1256,16 +1534,16 @@ public: int16 mod_pet_power(int16 act_power, uint16 spell_id); float mod_tradeskill_chance(float chance, DBTradeskillRecipe_Struct *spec); float mod_tradeskill_skillup(float chance_stage2); - int32 mod_tribute_item_value(int32 pts, const EQEmu::ItemInstance* item); + int32 mod_tribute_item_value(int32 pts, const EQ::ItemInstance* item); void mod_client_death_npc(Mob* killerMob); void mod_client_death_duel(Mob* killerMob); void mod_client_death_env(); int32 mod_client_xp(int32 in_exp, NPC *npc); uint32 mod_client_xp_for_level(uint32 xp, uint16 check_level); int mod_client_haste_cap(int cap); - int mod_consume(EQEmu::ItemData *item, EQEmu::item::ItemType type, int change); - int mod_food_value(const EQEmu::ItemData *item, int change); - int mod_drink_value(const EQEmu::ItemData *item, int change); + int mod_consume(EQ::ItemData *item, EQ::item::ItemType type, int change); + int mod_food_value(const EQ::ItemData *item, int change); + int mod_drink_value(const EQ::ItemData *item, int change); void ShowNumHits(); // work around function for numhits not showing on buffs @@ -1294,6 +1572,8 @@ public: void CheckRegionTypeChanges(); + WaterRegionType GetLastRegion() { return last_region_type; } + int32 CalcATK(); uint32 trapid; //ID of trap player has triggered. This is cleared when the player leaves the trap's radius, or it despawns. @@ -1301,11 +1581,15 @@ public: void SetLastPositionBeforeBulkUpdate(glm::vec4 in_last_position_before_bulk_update); glm::vec4 &GetLastPositionBeforeBulkUpdate(); + Raid *p_raid_instance; + + void ShowDevToolsMenu(); + protected: friend class Mob; void CalcItemBonuses(StatBonuses* newbon); - void AddItemBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0, bool ammo_slot_item = false); - void AdditiveWornBonuses(const EQEmu::ItemInstance *inst, StatBonuses* newbon, bool isAug = false); + void AddItemBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0, bool ammo_slot_item = false); + void AdditiveWornBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug = false); int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat); void CalcEdibleBonuses(StatBonuses* newbon); void ProcessItemCaps(); @@ -1340,13 +1624,14 @@ protected: char *adv_data; private: + eqFilterMode ClientFilters[_FilterCount]; int32 HandlePacket(const EQApplicationPacket *app); void OPTGB(const EQApplicationPacket *app); void OPRezzAnswer(uint32 Action, uint32 SpellID, uint16 ZoneID, uint16 InstanceID, float x, float y, float z); void OPMemorizeSpell(const EQApplicationPacket *app); void OPMoveCoin(const EQApplicationPacket* app); - void MoveItemCharges(EQEmu::ItemInstance &from, int16 to_slot, uint8 type); + void MoveItemCharges(EQ::ItemInstance &from, int16 to_slot, uint8 type); void OPGMTraining(const EQApplicationPacket *app); void OPGMEndTraining(const EQApplicationPacket *app); void OPGMTrainSkill(const EQApplicationPacket *app); @@ -1453,14 +1738,14 @@ private: uint32 tmSitting; // time stamp started sitting, used for HP regen bonus added on MAY 5, 2004 bool display_mob_info_window; - bool dev_tools_window_enabled; + bool dev_tools_enabled; int32 max_end; int32 current_endurance; PlayerProfile_Struct m_pp; ExtendedProfile_Struct m_epp; - EQEmu::InventoryProfile m_inv; + EQ::InventoryProfile m_inv; Object* m_tradeskill_object; PetInfo m_petinfo; // current pet data, used while loading from and saving to DB PetInfo m_suspendedminion; // pet data for our suspended minion. @@ -1486,7 +1771,7 @@ private: void ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z, float heading, uint8 ignorerestrictions, ZoneMode zm); void ProcessMovePC(uint32 zoneID, uint32 instance_id, float x, float y, float z, float heading, uint8 ignorerestrictions = 0, ZoneMode zm = ZoneSolicited); - glm::vec3 m_ZoneSummonLocation; + glm::vec4 m_ZoneSummonLocation; uint16 zonesummon_id; uint8 zonesummon_ignorerestrictions; ZoneMode zone_mode; @@ -1533,6 +1818,7 @@ private: Timer hp_other_update_throttle_timer; /* This is to keep clients from DOSing the server with macros that change client targets constantly */ Timer position_update_timer; /* Timer used when client hasn't updated within a 10 second window */ Timer consent_throttle_timer; + Timer dynamiczone_removal_timer; glm::vec3 m_Proximity; glm::vec4 last_position_before_bulk_update; @@ -1564,7 +1850,7 @@ private: std::set zone_flags; - ClientTaskState *taskstate; + ClientTaskState *task_state; int TotalSecondsPlayed; //Anti Spam Stuff @@ -1574,7 +1860,7 @@ private: Timer *GlobalChatLimiterTimer; //60 seconds uint32 AttemptedMessages; - EQEmu::versions::ClientVersion m_ClientVersion; + EQ::versions::ClientVersion m_ClientVersion; uint32 m_ClientVersionBit; int XPRate; @@ -1629,13 +1915,19 @@ private: bool interrogateinv_flag; // used to minimize log spamming by players - void InterrogateInventory_(bool errorcheck, Client* requester, int16 head, int16 index, const EQEmu::ItemInstance* inst, const EQEmu::ItemInstance* parent, bool log, bool silent, bool &error, int depth); - bool InterrogateInventory_error(int16 head, int16 index, const EQEmu::ItemInstance* inst, const EQEmu::ItemInstance* parent, int depth); + void InterrogateInventory_(bool errorcheck, Client* requester, int16 head, int16 index, const EQ::ItemInstance* inst, const EQ::ItemInstance* parent, bool log, bool silent, bool &error, int depth); + bool InterrogateInventory_error(int16 head, int16 index, const EQ::ItemInstance* inst, const EQ::ItemInstance* parent, int depth); int client_max_level; - + + uint32 m_expedition_id = 0; + ExpeditionInvite m_pending_expedition_invite { 0 }; + std::vector m_expedition_lockouts; + glm::vec3 m_quest_compass; + bool m_has_quest_compass = false; + #ifdef BOTS - + public: enum BotOwnerOption : size_t { booDeathMarquee, @@ -1652,7 +1944,7 @@ public: bool GetBotOption(BotOwnerOption boo) const; void SetBotOption(BotOwnerOption boo, bool flag = true); - + bool GetBotPulling() { return m_bot_pulling; } void SetBotPulling(bool flag = true) { m_bot_pulling = flag; } diff --git a/zone/client_mods.cpp b/zone/client_mods.cpp index 255201090..ec01a00b5 100644 --- a/zone/client_mods.cpp +++ b/zone/client_mods.cpp @@ -44,7 +44,7 @@ int32 Client::GetMaxStat() const if (level < 61) { base = 255; } - else if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + else if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { base = 255 + 5 * (level - 60); } else if (level < 71) { @@ -482,7 +482,7 @@ uint32 Mob::GetClassLevelFactor() int32 Client::CalcBaseHP() { - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { int stats = GetSTA(); if (stats > 255) { stats = (stats - 255) / 2; @@ -558,8 +558,8 @@ int32 Client::GetRawItemAC() { int32 Total = 0; // this skips MainAmmo..add an '=' conditional if that slot is required (original behavior) - for (int16 slot_id = EQEmu::invslot::BONUS_BEGIN; slot_id <= EQEmu::invslot::BONUS_STAT_END; slot_id++) { - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + for (int16 slot_id = EQ::invslot::BONUS_BEGIN; slot_id <= EQ::invslot::BONUS_STAT_END; slot_id++) { + const EQ::ItemInstance* inst = m_inv[slot_id]; if (inst && inst->IsClassCommon()) { Total += inst->GetItem()->AC; } @@ -613,7 +613,7 @@ int32 Client::CalcBaseMana() switch (GetCasterClass()) { case 'I': WisInt = GetINT(); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { ConvertedWisInt = WisInt; int over200 = WisInt; if (WisInt > 100) { @@ -645,7 +645,7 @@ int32 Client::CalcBaseMana() break; case 'W': WisInt = GetWIS(); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { ConvertedWisInt = WisInt; int over200 = WisInt; if (WisInt > 100) { @@ -696,8 +696,8 @@ int32 Client::CalcBaseManaRegen() uint8 clevel = GetLevel(); int32 regen = 0; if (IsSitting() || (GetHorseId() != 0)) { - if (HasSkill(EQEmu::skills::SkillMeditate)) { - regen = (((GetSkill(EQEmu::skills::SkillMeditate) / 10) + (clevel - (clevel / 4))) / 4) + 4; + if (HasSkill(EQ::skills::SkillMeditate)) { + regen = (((GetSkill(EQ::skills::SkillMeditate) / 10) + (clevel - (clevel / 4))) / 4) + 4; } else { regen = 2; @@ -723,7 +723,7 @@ int32 Client::CalcManaRegen(bool bCombat) // kind of weird to do it here w/e // client does some base medding regen for shrouds here if (GetClass() != BARD) { - auto skill = GetSkill(EQEmu::skills::SkillMeditate); + auto skill = GetSkill(EQ::skills::SkillMeditate); if (skill > 0) { regen++; if (skill > 1) @@ -787,11 +787,11 @@ int32 Client::CalcManaRegenCap() uint32 Client::CalcCurrentWeight() { - const EQEmu::ItemData* TempItem = nullptr; - EQEmu::ItemInstance* ins = nullptr; + const EQ::ItemData* TempItem = nullptr; + EQ::ItemInstance* ins = nullptr; uint32 Total = 0; int x; - for (x = EQEmu::invslot::POSSESSIONS_BEGIN; x <= EQEmu::invslot::POSSESSIONS_END; x++) { + for (x = EQ::invslot::POSSESSIONS_BEGIN; x <= EQ::invslot::POSSESSIONS_END; x++) { TempItem = 0; ins = GetInv().GetItem(x); if (ins) { @@ -801,7 +801,7 @@ uint32 Client::CalcCurrentWeight() Total += TempItem->Weight; } } - for (x = EQEmu::invbag::GENERAL_BAGS_BEGIN; x <= EQEmu::invbag::CURSOR_BAG_END; x++) { + for (x = EQ::invbag::GENERAL_BAGS_BEGIN; x <= EQ::invbag::CURSOR_BAG_END; x++) { int TmpWeight = 0; TempItem = 0; ins = GetInv().GetItem(x); @@ -814,14 +814,14 @@ uint32 Client::CalcCurrentWeight() if (TmpWeight > 0) { // this code indicates that weight redux bags can only be in the first general inventory slot to be effective... // is this correct? or can we scan for the highest weight redux and use that? (need client verifications) - int bagslot = EQEmu::invslot::slotGeneral1; + int bagslot = EQ::invslot::slotGeneral1; int reduction = 0; - for (int m = EQEmu::invbag::GENERAL_BAGS_BEGIN + EQEmu::invbag::SLOT_COUNT; m <= EQEmu::invbag::CURSOR_BAG_END; m += EQEmu::invbag::SLOT_COUNT) { + for (int m = EQ::invbag::GENERAL_BAGS_BEGIN + EQ::invbag::SLOT_COUNT; m <= EQ::invbag::CURSOR_BAG_END; m += EQ::invbag::SLOT_COUNT) { if (x >= m) { bagslot += 1; } } - EQEmu::ItemInstance* baginst = GetInv().GetItem(bagslot); + EQ::ItemInstance* baginst = GetInv().GetItem(bagslot); if (baginst && baginst->GetItem() && baginst->IsClassBag()) { reduction = baginst->GetItem()->BagWR; } @@ -840,7 +840,7 @@ uint32 Client::CalcCurrentWeight() This is the ONLY instance I have seen where the client is hard coded to particular Item IDs to set a certain property for an item. It is very odd. */ // SoD+ client has no weight for coin - if (EQEmu::behavior::StaticLookup(EQEmu::versions::ConvertClientVersionToMobVersion(ClientVersion()))->CoinHasWeight) { + if (EQ::behavior::StaticLookup(EQ::versions::ConvertClientVersionToMobVersion(ClientVersion()))->CoinHasWeight) { Total += (m_pp.platinum + m_pp.gold + m_pp.silver + m_pp.copper) / 4; } float Packrat = (float)spellbonuses.Packrat + (float)aabonuses.Packrat + (float)itembonuses.Packrat; @@ -1531,10 +1531,10 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const // clickies (Symphony of Battle) that have a song skill don't get AA bonus for some reason // but clickies that are songs (selo's on Composers Greaves) do get AA mod as well switch (spells[spell_id].skill) { - case EQEmu::skills::SkillPercussionInstruments: + case EQ::skills::SkillPercussionInstruments: if (itembonuses.percussionMod == 0 && spellbonuses.percussionMod == 0) effectmod = 10; - else if (GetSkill(EQEmu::skills::SkillPercussionInstruments) == 0) + else if (GetSkill(EQ::skills::SkillPercussionInstruments) == 0) effectmod = 10; else if (itembonuses.percussionMod > spellbonuses.percussionMod) effectmod = itembonuses.percussionMod; @@ -1543,10 +1543,10 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const if (IsBardSong(spell_id)) effectmod += aabonuses.percussionMod; break; - case EQEmu::skills::SkillStringedInstruments: + case EQ::skills::SkillStringedInstruments: if (itembonuses.stringedMod == 0 && spellbonuses.stringedMod == 0) effectmod = 10; - else if (GetSkill(EQEmu::skills::SkillStringedInstruments) == 0) + else if (GetSkill(EQ::skills::SkillStringedInstruments) == 0) effectmod = 10; else if (itembonuses.stringedMod > spellbonuses.stringedMod) effectmod = itembonuses.stringedMod; @@ -1555,10 +1555,10 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const if (IsBardSong(spell_id)) effectmod += aabonuses.stringedMod; break; - case EQEmu::skills::SkillWindInstruments: + case EQ::skills::SkillWindInstruments: if (itembonuses.windMod == 0 && spellbonuses.windMod == 0) effectmod = 10; - else if (GetSkill(EQEmu::skills::SkillWindInstruments) == 0) + else if (GetSkill(EQ::skills::SkillWindInstruments) == 0) effectmod = 10; else if (itembonuses.windMod > spellbonuses.windMod) effectmod = itembonuses.windMod; @@ -1567,10 +1567,10 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const if (IsBardSong(spell_id)) effectmod += aabonuses.windMod; break; - case EQEmu::skills::SkillBrassInstruments: + case EQ::skills::SkillBrassInstruments: if (itembonuses.brassMod == 0 && spellbonuses.brassMod == 0) effectmod = 10; - else if (GetSkill(EQEmu::skills::SkillBrassInstruments) == 0) + else if (GetSkill(EQ::skills::SkillBrassInstruments) == 0) effectmod = 10; else if (itembonuses.brassMod > spellbonuses.brassMod) effectmod = itembonuses.brassMod; @@ -1579,7 +1579,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const if (IsBardSong(spell_id)) effectmod += aabonuses.brassMod; break; - case EQEmu::skills::SkillSinging: + case EQ::skills::SkillSinging: if (itembonuses.singingMod == 0 && spellbonuses.singingMod == 0) effectmod = 10; else if (itembonuses.singingMod > spellbonuses.singingMod) @@ -1626,7 +1626,7 @@ void Client::CalcMaxEndurance() int32 Client::CalcBaseEndurance() { int32 base_end = 0; - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) { double heroic_stats = (GetHeroicSTR() + GetHeroicSTA() + GetHeroicDEX() + GetHeroicAGI()) / 4.0f; double stats = (GetSTR() + GetSTA() + GetDEX() + GetAGI()) / 4.0f; if (stats > 201.0f) { @@ -1765,12 +1765,12 @@ int Client::GetRawACNoShield(int &shield_ac) const { int ac = itembonuses.AC + spellbonuses.AC + aabonuses.AC; shield_ac = 0; - const EQEmu::ItemInstance *inst = m_inv.GetItem(EQEmu::invslot::slotSecondary); + const EQ::ItemInstance *inst = m_inv.GetItem(EQ::invslot::slotSecondary); if (inst) { - if (inst->GetItem()->ItemType == EQEmu::item::ItemTypeShield) { + if (inst->GetItem()->ItemType == EQ::item::ItemTypeShield) { ac -= inst->GetItem()->AC; shield_ac = inst->GetItem()->AC; - for (uint8 i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (uint8 i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if (inst->GetAugment(i)) { ac -= inst->GetAugment(i)->GetItem()->AC; shield_ac += inst->GetAugment(i)->GetItem()->AC; diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 048a80cc3..0a67550f6 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -49,6 +49,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/zone_numbers.h" #include "data_bucket.h" #include "event_codes.h" +#include "expedition.h" +#include "expedition_database.h" #include "guild_mgr.h" #include "merc.h" #include "petitions.h" @@ -61,6 +63,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "worldserver.h" #include "zone.h" #include "mob_movement_manager.h" +#include "../common/repositories/criteria/content_filter_criteria.h" #ifdef BOTS #include "bot.h" @@ -190,6 +193,15 @@ void MapOpcodes() ConnectedOpcodes[OP_DuelResponse2] = &Client::Handle_OP_DuelResponse2; ConnectedOpcodes[OP_DumpName] = &Client::Handle_OP_DumpName; ConnectedOpcodes[OP_Dye] = &Client::Handle_OP_Dye; + ConnectedOpcodes[OP_DzAddPlayer] = &Client::Handle_OP_DzAddPlayer; + ConnectedOpcodes[OP_DzChooseZoneReply] = &Client::Handle_OP_DzChooseZoneReply; + ConnectedOpcodes[OP_DzExpeditionInviteResponse] = &Client::Handle_OP_DzExpeditionInviteResponse; + ConnectedOpcodes[OP_DzListTimers] = &Client::Handle_OP_DzListTimers; + ConnectedOpcodes[OP_DzMakeLeader] = &Client::Handle_OP_DzMakeLeader; + ConnectedOpcodes[OP_DzPlayerList] = &Client::Handle_OP_DzPlayerList; + ConnectedOpcodes[OP_DzRemovePlayer] = &Client::Handle_OP_DzRemovePlayer; + ConnectedOpcodes[OP_DzSwapPlayer] = &Client::Handle_OP_DzSwapPlayer; + ConnectedOpcodes[OP_DzQuit] = &Client::Handle_OP_DzQuit; ConnectedOpcodes[OP_Emote] = &Client::Handle_OP_Emote; ConnectedOpcodes[OP_EndLootRequest] = &Client::Handle_OP_EndLootRequest; ConnectedOpcodes[OP_EnvDamage] = &Client::Handle_OP_EnvDamage; @@ -265,6 +277,7 @@ void MapOpcodes() ConnectedOpcodes[OP_ItemViewUnknown] = &Client::Handle_OP_Ignore; ConnectedOpcodes[OP_Jump] = &Client::Handle_OP_Jump; ConnectedOpcodes[OP_KeyRing] = &Client::Handle_OP_KeyRing; + ConnectedOpcodes[OP_KickPlayers] = &Client::Handle_OP_KickPlayers; ConnectedOpcodes[OP_LDoNButton] = &Client::Handle_OP_LDoNButton; ConnectedOpcodes[OP_LDoNDisarmTraps] = &Client::Handle_OP_LDoNDisarmTraps; ConnectedOpcodes[OP_LDoNInspect] = &Client::Handle_OP_LDoNInspect; @@ -442,7 +455,7 @@ int Client::HandlePacket(const EQApplicationPacket *app) case CLIENT_CONNECTING: { if (ConnectingOpcodes.count(opcode) != 1) { //Hate const cast but everything in lua needs to be non-const even if i make it non-mutable - std::vector args; + std::vector args; args.push_back(const_cast(app)); parse->EventPlayer(EVENT_UNHANDLED_OPCODE, this, "", 1, &args); @@ -466,7 +479,7 @@ int Client::HandlePacket(const EQApplicationPacket *app) ClientPacketProc p; p = ConnectedOpcodes[opcode]; if (p == nullptr) { - std::vector args; + std::vector args; args.push_back(const_cast(app)); parse->EventPlayer(EVENT_UNHANDLED_OPCODE, this, "", 0, &args); @@ -514,7 +527,7 @@ void Client::CompleteConnect() if (IsInAGuild()) { uint8 rank = GuildRank(); - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { switch (rank) { case 0: { rank = 5; break; } // GUILD_MEMBER 0 @@ -528,9 +541,9 @@ void Client::CompleteConnect() } // moved to dbload and translators since we iterate there also .. keep m_pp values whatever they are when they get here - /*const auto sbs = EQEmu::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize; + /*const auto sbs = EQ::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize; for (uint32 spellInt = 0; spellInt < sbs; ++spellInt) { - if (m_pp.spell_book[spellInt] < 3 || m_pp.spell_book[spellInt] > EQEmu::spells::SPELL_ID_MAX) + if (m_pp.spell_book[spellInt] < 3 || m_pp.spell_book[spellInt] > EQ::spells::SPELL_ID_MAX) m_pp.spell_book[spellInt] = 0xFFFFFFFF; }*/ @@ -548,8 +561,9 @@ void Client::CompleteConnect() entity_list.AddRaid(raid, raidid); raid->LoadLeadership(); // Recreating raid in new zone, get leadership from DB } - else - raid = nullptr; + else { + safe_delete(raid); + } } if (raid) { SetRaidGrouped(true); @@ -753,7 +767,7 @@ void Client::CompleteConnect() entity_list.SendUntargetable(this); int x; - for (x = EQEmu::textures::textureBegin; x <= EQEmu::textures::LastTexture; x++) { + for (x = EQ::textures::textureBegin; x <= EQ::textures::LastTexture; x++) { SendWearChange(x); } // added due to wear change above @@ -762,7 +776,7 @@ void Client::CompleteConnect() Mob *pet = GetPet(); if (pet != nullptr) { - for (x = EQEmu::textures::textureBegin; x <= EQEmu::textures::LastTexture; x++) { + for (x = EQ::textures::textureBegin; x <= EQ::textures::LastTexture; x++) { pet->SendWearChange(x); } // added due to wear change above @@ -789,7 +803,7 @@ void Client::CompleteConnect() //enforce some rules.. if (!CanBeInZone()) { LogDebug("[CLIENT] Kicking char from zone, not allowed here"); - GoToSafeCoords(content_db.GetZoneID("arena"), 0); + GoToSafeCoords(ZoneID("arena"), 0); return; } @@ -818,35 +832,45 @@ void Client::CompleteConnect() database.QueryDatabase( StringFormat( "UPDATE `character_data` SET `last_login` = UNIX_TIMESTAMP() WHERE id = %u", - this->CharacterID() + CharacterID() ) ); } - if (zone) { - if (zone->GetInstanceTimer()) { - uint32 ttime = zone->GetInstanceTimer()->GetRemainingTime(); - uint32 day = (ttime / 86400000); - uint32 hour = (ttime / 3600000) % 24; - uint32 minute = (ttime / 60000) % 60; - uint32 second = (ttime / 1000) % 60; - if (day) { - Message(Chat::Yellow, "%s(%u) will expire in %u days, %u hours, %u minutes, and %u seconds.", - zone->GetLongName(), zone->GetInstanceID(), day, hour, minute, second); - } - else if (hour) { - Message(Chat::Yellow, "%s(%u) will expire in %u hours, %u minutes, and %u seconds.", - zone->GetLongName(), zone->GetInstanceID(), hour, minute, second); - } - else if (minute) { - Message(Chat::Yellow, "%s(%u) will expire in %u minutes, and %u seconds.", - zone->GetLongName(), zone->GetInstanceID(), minute, second); - } - else { - Message(Chat::Yellow, "%s(%u) will expire in in %u seconds.", - zone->GetLongName(), zone->GetInstanceID(), second); - } + if (zone && zone->GetInstanceTimer()) { + + bool is_permanent = false; + uint32 remaining_time_seconds = database.GetTimeRemainingInstance(zone->GetInstanceID(), is_permanent); + uint32 day = (remaining_time_seconds / 86400); + uint32 hour = (remaining_time_seconds / 3600) % 24; + uint32 minute = (remaining_time_seconds / 60) % 60; + uint32 second = (remaining_time_seconds / 1) % 60; + + if (day) { + Message( + Chat::Yellow, "%s (%u) will expire in %u days, %u hours, %u minutes, and %u seconds.", + zone->GetLongName(), zone->GetInstanceID(), day, hour, minute, second + ); } + else if (hour) { + Message( + Chat::Yellow, "%s (%u) will expire in %u hours, %u minutes, and %u seconds.", + zone->GetLongName(), zone->GetInstanceID(), hour, minute, second + ); + } + else if (minute) { + Message( + Chat::Yellow, "%s (%u) will expire in %u minutes, and %u seconds.", + zone->GetLongName(), zone->GetInstanceID(), minute, second + ); + } + else { + Message( + Chat::Yellow, "%s (%u) will expire in in %u seconds.", + zone->GetLongName(), zone->GetInstanceID(), second + ); + } + } SendRewards(); @@ -865,7 +889,7 @@ void Client::CompleteConnect() if (zone->GetZoneID() == RuleI(World, GuildBankZoneID) && GuildBanks) GuildBanks->SendGuildBank(this); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) entity_list.SendFindableNPCList(this); if (IsInAGuild()) { @@ -874,26 +898,29 @@ void Client::CompleteConnect() guild_mgr.RequestOnlineGuildMembers(this->CharacterID(), this->GuildID()); } + UpdateExpeditionInfoAndLockouts(); + /** Request adventure info **/ auto pack = new ServerPacket(ServerOP_AdventureDataRequest, 64); strcpy((char*)pack->pBuffer, GetName()); worldserver.SendPacket(pack); delete pack; - if (IsClient() && CastToClient()->ClientVersionBit() & EQEmu::versions::maskUFAndLater) { + if (IsClient() && CastToClient()->ClientVersionBit() & EQ::versions::maskUFAndLater) { EQApplicationPacket *outapp = MakeBuffsPacket(false); CastToClient()->FastQueuePacket(&outapp); } // TODO: load these states // We at least will set them to the correct state for now - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater && GetPet()) { + if (m_ClientVersionBit & EQ::versions::maskUFAndLater && GetPet()) { SetPetCommandState(PET_BUTTON_SIT, 0); SetPetCommandState(PET_BUTTON_STOP, 0); SetPetCommandState(PET_BUTTON_REGROUP, 0); SetPetCommandState(PET_BUTTON_FOLLOW, 1); SetPetCommandState(PET_BUTTON_GUARD, 0); - SetPetCommandState(PET_BUTTON_TAUNT, 1); + // Taunt saved on client side for logging on with pet + // In our db for when we zone. SetPetCommandState(PET_BUTTON_HOLD, 0); SetPetCommandState(PET_BUTTON_GHOLD, 0); SetPetCommandState(PET_BUTTON_FOCUS, 0); @@ -906,7 +933,12 @@ void Client::CompleteConnect() worldserver.RequestTellQueue(GetName()); - entity_list.ScanCloseMobs(close_mobs, this); + entity_list.ScanCloseMobs(close_mobs, this, true); + + if (GetGM() && IsDevToolsEnabled()) { + ShowDevToolsMenu(); + } + } // connecting opcode handlers @@ -995,7 +1027,7 @@ void Client::Handle_Connect_OP_ReqClientSpawn(const EQApplicationPacket *app) outapp = new EQApplicationPacket(OP_SendExpZonein, 0); FastQueuePacket(&outapp); - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { outapp = new EQApplicationPacket(OP_ClientReady, 0); FastQueuePacket(&outapp); @@ -1059,7 +1091,7 @@ void Client::Handle_Connect_OP_SendExpZonein(const EQApplicationPacket *app) safe_delete(outapp); // SoF+ Gets Zone-In packets after sending OP_WorldObjectsSent - if (ClientVersion() < EQEmu::versions::ClientVersion::SoF) + if (ClientVersion() < EQ::versions::ClientVersion::SoF) { SendZoneInPackets(); } @@ -1156,7 +1188,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) conn_state = ReceivedZoneEntry; SetClientVersion(Connection()->ClientVersion()); - m_ClientVersionBit = EQEmu::versions::ConvertClientVersionToClientVersionBit(Connection()->ClientVersion()); + m_ClientVersionBit = EQ::versions::ConvertClientVersionToClientVersionBit(Connection()->ClientVersion()); m_pp.SetPlayerProfileVersion(m_ClientVersion); m_inv.SetInventoryVersion(m_ClientVersion); @@ -1271,7 +1303,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) } /* Set item material tint */ - for (int i = EQEmu::textures::textureBegin; i <= EQEmu::textures::LastTexture; i++) + for (int i = EQ::textures::textureBegin; i <= EQ::textures::LastTexture; i++) { if (m_pp.item_tint.Slot[i].UseTint == 1 || m_pp.item_tint.Slot[i].UseTint == 255) { @@ -1300,10 +1332,11 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) strcpy(lastname, m_pp.last_name); /* If PP is set to weird coordinates */ if ((m_pp.x == -1 && m_pp.y == -1 && m_pp.z == -1) || (m_pp.x == -2 && m_pp.y == -2 && m_pp.z == -2)) { - auto safePoint = zone->GetSafePoint(); - m_pp.x = safePoint.x; - m_pp.y = safePoint.y; - m_pp.z = safePoint.z; + auto zone_safe_point = zone->GetSafePoint(); + m_pp.x = zone_safe_point.x; + m_pp.y = zone_safe_point.y; + m_pp.z = zone_safe_point.z; + m_pp.heading = zone_safe_point.w; } /* If too far below ground, then fix */ // float ground_z = GetGroundZ(m_pp.x, m_pp.y, m_pp.z); @@ -1360,7 +1393,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) m_pp.guild_id = GuildID(); uint8 rank = guild_mgr.GetDisplayedRank(GuildID(), GuildRank(), CharacterID()); // FIXME: RoF guild rank - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { switch (rank) { case 0: rank = 5; @@ -1414,10 +1447,10 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) if (m_pp.ldon_points_available < 0 || m_pp.ldon_points_available > 2000000000) { m_pp.ldon_points_available = 0; } if (RuleB(World, UseClientBasedExpansionSettings)) { - m_pp.expansions = EQEmu::expansions::ConvertClientVersionToExpansionsMask(ClientVersion()); + m_pp.expansions = EQ::expansions::ConvertClientVersionToExpansionsMask(ClientVersion()); } else { - m_pp.expansions = (RuleI(World, ExpansionSettings) & EQEmu::expansions::ConvertClientVersionToExpansionsMask(ClientVersion())); + m_pp.expansions = (RuleI(World, ExpansionSettings) & EQ::expansions::ConvertClientVersionToExpansionsMask(ClientVersion())); } if (!database.LoadAlternateAdvancement(this)) { @@ -1425,7 +1458,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) } if (SPDAT_RECORDS > 0) { - for (uint32 z = 0; z < EQEmu::spells::SPELL_GEM_COUNT; z++) { + for (uint32 z = 0; z < EQ::spells::SPELL_GEM_COUNT; z++) { if (m_pp.mem_spells[z] >= (uint32)SPDAT_RECORDS) UnmemSpell(z, false); } @@ -1500,7 +1533,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) int mentor_percent; GroupLeadershipAA_Struct GLAA; memset(ln, 0, 64); - strcpy(ln, database.GetGroupLeadershipInfo(group->GetID(), ln, MainTankName, AssistName, PullerName, NPCMarkerName, mentoree_name, &mentor_percent, &GLAA)); + database.GetGroupLeadershipInfo(group->GetID(), ln, MainTankName, AssistName, PullerName, NPCMarkerName, mentoree_name, &mentor_percent, &GLAA); Client *c = entity_list.GetClientByName(ln); if (c) group->SetLeader(c); @@ -1557,7 +1590,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) } /* Load Spell Slot Refresh from Currently Memoried Spells */ - for (unsigned int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) + for (unsigned int i = 0; i < EQ::spells::SPELL_GEM_COUNT; ++i) if (IsValidSpell(m_pp.mem_spells[i])) m_pp.spellSlotRefresh[i] = p_timers.GetRemainingTime(pTimerSpellStart + m_pp.mem_spells[i]) * 1000; @@ -1615,6 +1648,13 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) pet->CalcBonuses(); pet->SetHP(m_petinfo.HP); pet->SetMana(m_petinfo.Mana); + + // Taunt persists when zoning on newer clients, overwrite default. + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) { + if (!firstlogon) { + pet->SetTaunting(m_petinfo.taunting); + } + } } m_petinfo.SpellID = 0; } @@ -1666,8 +1706,8 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) /* First item cursor is sent in bulk inventory packet */ if (iter == m_inv.cursor_cbegin()) continue; - const EQEmu::ItemInstance *inst = *iter; - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketLimbo); + const EQ::ItemInstance *inst = *iter; + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketLimbo); } // this is kinda hackish atm..this process needs to be realigned to allow a contiguous flow @@ -1677,17 +1717,19 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) /* Task Packets */ LoadClientTaskState(); + m_expedition_id = ExpeditionDatabase::GetExpeditionIDFromCharacterID(CharacterID()); + /** * DevTools Load Settings */ - if (Admin() >= EQEmu::DevTools::GM_ACCOUNT_STATUS_LEVEL) { - std::string dev_tools_window_key = StringFormat("%i-dev-tools-window-disabled", AccountID()); + if (Admin() >= EQ::DevTools::GM_ACCOUNT_STATUS_LEVEL) { + std::string dev_tools_window_key = StringFormat("%i-dev-tools-disabled", AccountID()); if (DataBucket::GetData(dev_tools_window_key) == "true") { - dev_tools_window_enabled = false; + dev_tools_enabled = false; } } - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) { outapp = new EQApplicationPacket(OP_XTargetResponse, 8); outapp->WriteUInt32(GetMaxXTargets()); outapp->WriteUInt32(0); @@ -1711,7 +1753,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) QueuePacket(outapp); safe_delete(outapp); - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { Handle_Connect_OP_ReqNewZone(nullptr); } @@ -1781,8 +1823,8 @@ void Client::Handle_OP_AcceptNewTask(const EQApplicationPacket *app) } AcceptNewTask_Struct *ant = (AcceptNewTask_Struct*)app->pBuffer; - if (ant->task_id > 0 && RuleB(TaskSystem, EnableTaskSystem) && taskstate) - taskstate->AcceptNewTask(this, ant->task_id, ant->task_master_id); + if (ant->task_id > 0 && RuleB(TaskSystem, EnableTaskSystem) && task_state) + task_state->AcceptNewTask(this, ant->task_id, ant->task_master_id); } void Client::Handle_OP_AdventureInfoRequest(const EQApplicationPacket *app) @@ -1869,7 +1911,7 @@ void Client::Handle_OP_AdventureMerchantPurchase(const EQApplicationPacket *app) merchantid = tmp->CastToNPC()->MerchantType; - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; bool found = false; std::list merlist = zone->merchanttable[merchantid]; std::list::const_iterator itr; @@ -2001,21 +2043,19 @@ void Client::Handle_OP_AdventureMerchantPurchase(const EQApplicationPacket *app) else if (aps->Type == NorrathsKeepersMerchant) { SetRadiantCrystals(GetRadiantCrystals() - (int32)item->LDoNPrice); - SendCrystalCounts(); } else if (aps->Type == DarkReignMerchant) { SetEbonCrystals(GetEbonCrystals() - (int32)item->LDoNPrice); - SendCrystalCounts(); } int16 charges = 1; if (item->MaxCharges != 0) charges = item->MaxCharges; - EQEmu::ItemInstance *inst = database.CreateItem(item, charges); + EQ::ItemInstance *inst = database.CreateItem(item, charges); if (!AutoPutLootInInventory(*inst, true, true)) { - PutLootInInventory(EQEmu::invslot::slotCursor, *inst); + PutLootInInventory(EQ::invslot::slotCursor, *inst); } Save(1); } @@ -2044,7 +2084,7 @@ void Client::Handle_OP_AdventureMerchantRequest(const EQApplicationPacket *app) merchantid = tmp->CastToNPC()->MerchantType; - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; std::list merlist = zone->merchanttable[merchantid]; std::list::const_iterator itr; for (itr = merlist.begin(); itr != merlist.end() && count<255; ++itr) { @@ -2142,8 +2182,8 @@ void Client::Handle_OP_AdventureMerchantSell(const EQApplicationPacket *app) return; } - const EQEmu::ItemData* item = database.GetItem(itemid); - EQEmu::ItemInstance* inst = GetInv().GetItem(ams_in->slot); + const EQ::ItemData* item = database.GetItem(itemid); + EQ::ItemInstance* inst = GetInv().GetItem(ams_in->slot); if (!item || !inst) { Message(Chat::Red, "You seemed to have misplaced that item..."); return; @@ -2429,7 +2469,7 @@ void Client::Handle_OP_AltCurrencyMerchantRequest(const EQApplicationPacket *app ss << alt_cur_id << "|1|" << alt_cur_id; uint32 count = 0; uint32 merchant_id = tar->MerchantType; - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; std::list merlist = zone->merchanttable[merchant_id]; std::list::const_iterator itr; @@ -2489,7 +2529,7 @@ void Client::Handle_OP_AltCurrencyPurchase(const EQApplicationPacket *app) return; } - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; uint32 cost = 0; uint32 current_currency = GetAlternateCurrencyValue(alt_cur_id); uint32 merchant_id = tar->MerchantType; @@ -2545,10 +2585,10 @@ void Client::Handle_OP_AltCurrencyPurchase(const EQApplicationPacket *app) if (item->MaxCharges != 0) charges = item->MaxCharges; - EQEmu::ItemInstance *inst = database.CreateItem(item, charges); + EQ::ItemInstance *inst = database.CreateItem(item, charges); if (!AutoPutLootInInventory(*inst, true, true)) { - PutLootInInventory(EQEmu::invslot::slotCursor, *inst); + PutLootInInventory(EQ::invslot::slotCursor, *inst); } Save(1); @@ -2598,7 +2638,7 @@ void Client::Handle_OP_AltCurrencyReclaim(const EQApplicationPacket *app) SetAlternateCurrencyValue(reclaim->currency_id, 0); } else { - SummonItem(item_id, reclaim->count, 0, 0, 0, 0, 0, 0, false, EQEmu::invslot::slotCursor); + SummonItem(item_id, reclaim->count, 0, 0, 0, 0, 0, 0, false, EQ::invslot::slotCursor); AddAlternateCurrencyValue(reclaim->currency_id, -((int32)reclaim->count)); } /* QS: PlayerLogAlternateCurrencyTransactions :: Cursor to Item Storage */ @@ -2629,7 +2669,7 @@ void Client::Handle_OP_AltCurrencySell(const EQApplicationPacket *app) return; } - EQEmu::ItemInstance* inst = GetInv().GetItem(sell->slot_id); + EQ::ItemInstance* inst = GetInv().GetItem(sell->slot_id); if (!inst) { return; } @@ -2638,7 +2678,7 @@ void Client::Handle_OP_AltCurrencySell(const EQApplicationPacket *app) return; } - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; uint32 cost = 0; uint32 current_currency = GetAlternateCurrencyValue(alt_cur_id); uint32 merchant_id = tar->MerchantType; @@ -2726,12 +2766,12 @@ void Client::Handle_OP_AltCurrencySellSelection(const EQApplicationPacket *app) return; } - EQEmu::ItemInstance *inst = m_inv.GetItem(select->slot_id); + EQ::ItemInstance *inst = m_inv.GetItem(select->slot_id); if (!inst) { return; } - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; uint32 cost = 0; uint32 current_currency = GetAlternateCurrencyValue(alt_cur_id); uint32 merchant_id = tar->MerchantType; @@ -2811,16 +2851,16 @@ void Client::Handle_OP_ApplyPoison(const EQApplicationPacket *app) uint32 ApplyPoisonSuccessResult = 0; - const EQEmu::ItemInstance* PoisonItemInstance = GetInv().GetItem(ApplyPoisonData->inventorySlot); + const EQ::ItemInstance* PoisonItemInstance = GetInv().GetItem(ApplyPoisonData->inventorySlot); - const EQEmu::ItemData* poison = (PoisonItemInstance ? PoisonItemInstance->GetItem() : nullptr); + const EQ::ItemData* poison = (PoisonItemInstance ? PoisonItemInstance->GetItem() : nullptr); - bool IsPoison = (poison && poison->ItemType == EQEmu::item::ItemTypePoison); + bool IsPoison = (poison && poison->ItemType == EQ::item::ItemTypePoison); if (IsPoison && GetClass() == ROGUE) { // Live always checks for skillup, even when poison is too high - CheckIncreaseSkill(EQEmu::skills::SkillApplyPoison, nullptr, 10); + CheckIncreaseSkill(EQ::skills::SkillApplyPoison, nullptr, 10); if (poison->Proc.Level2 > GetLevel()) { // Poison is too high to apply. @@ -2839,7 +2879,7 @@ void Client::Handle_OP_ApplyPoison(const EQApplicationPacket *app) // Poisons that don't proc until a level higher than the // rogue simply won't apply at all, no skill check done. - uint16 poison_skill = GetSkill(EQEmu::skills::SkillApplyPoison); + uint16 poison_skill = GetSkill(EQ::skills::SkillApplyPoison); if (ChanceRoll < (.75 + poison_skill / 1000)) { ApplyPoisonSuccessResult = 1; @@ -2914,7 +2954,7 @@ void Client::Handle_OP_AugmentInfo(const EQApplicationPacket *app) } AugmentInfo_Struct* AugInfo = (AugmentInfo_Struct*)app->pBuffer; - const EQEmu::ItemData * item = database.GetItem(AugInfo->itemid); + const EQ::ItemData * item = database.GetItem(AugInfo->itemid); if (item) { strn0cpy(AugInfo->augment_info, item->Name, 64); @@ -2933,31 +2973,31 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) AugmentItem_Struct* in_augment = (AugmentItem_Struct*)app->pBuffer; bool deleteItems = false; - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { - if ((in_augment->container_slot < EQEmu::invslot::EQUIPMENT_BEGIN || in_augment->container_slot > EQEmu::invslot::GENERAL_END) && - (in_augment->container_slot < EQEmu::invbag::GENERAL_BAGS_BEGIN || in_augment->container_slot > EQEmu::invbag::GENERAL_BAGS_END)) + if ((in_augment->container_slot < EQ::invslot::EQUIPMENT_BEGIN || in_augment->container_slot > EQ::invslot::GENERAL_END) && + (in_augment->container_slot < EQ::invbag::GENERAL_BAGS_BEGIN || in_augment->container_slot > EQ::invbag::GENERAL_BAGS_END)) { Message(Chat::Red, "The server does not allow augmentation actions from this slot."); - auto cursor_item = m_inv[EQEmu::invslot::slotCursor]; + auto cursor_item = m_inv[EQ::invslot::slotCursor]; auto augmented_item = m_inv[in_augment->container_slot]; - SendItemPacket(EQEmu::invslot::slotCursor, cursor_item, ItemPacketCharInventory); + SendItemPacket(EQ::invslot::slotCursor, cursor_item, ItemPacketCharInventory); // this may crash clients on certain slots SendItemPacket(in_augment->container_slot, augmented_item, ItemPacketCharInventory); return; } - EQEmu::ItemInstance *itemOneToPush = nullptr, *itemTwoToPush = nullptr; + EQ::ItemInstance *itemOneToPush = nullptr, *itemTwoToPush = nullptr; //Log(Logs::DebugLevel::Moderate, Logs::Debug, "cslot: [{}] aslot: [{}] cidx: [{}] aidx: [{}] act: [{}] dest: [{}]", // in_augment->container_slot, in_augment->augment_slot, in_augment->container_index, in_augment->augment_index, in_augment->augment_action, in_augment->dest_inst_id); - EQEmu::ItemInstance *tobe_auged = nullptr, *old_aug = nullptr, *new_aug = nullptr, *aug = nullptr, *solvent = nullptr; - EQEmu::InventoryProfile& user_inv = GetInv(); + EQ::ItemInstance *tobe_auged = nullptr, *old_aug = nullptr, *new_aug = nullptr, *aug = nullptr, *solvent = nullptr; + EQ::InventoryProfile& user_inv = GetInv(); uint16 item_slot = in_augment->container_slot; uint16 solvent_slot = in_augment->augment_slot; - uint8 mat = EQEmu::InventoryProfile::CalcMaterialFromSlot(item_slot); // for when player is augging a piece of equipment while they're wearing it + uint8 mat = EQ::InventoryProfile::CalcMaterialFromSlot(item_slot); // for when player is augging a piece of equipment while they're wearing it if (item_slot == INVALID_INDEX || solvent_slot == INVALID_INDEX) { @@ -2987,7 +3027,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) return; } } - else if (solvent->GetItem()->ItemType == EQEmu::item::ItemTypeAugmentationDistiller) + else if (solvent->GetItem()->ItemType == EQ::item::ItemTypeAugmentationDistiller) { old_aug = tobe_auged->GetAugment(in_augment->augment_index); @@ -3004,7 +3044,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) return; } } - else if (solvent->GetItem()->ItemType != EQEmu::item::ItemTypePerfectedAugmentationDistiller) + else if (solvent->GetItem()->ItemType != EQ::item::ItemTypePerfectedAugmentationDistiller) { LogError("Player tried to safely remove an augment with a non-distiller item"); Message(Chat::Red, "Error: Invalid augmentation distiller for safely removing this augment."); @@ -3016,7 +3056,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) { case 0: // Adding an augment case 2: // Swapping augment - new_aug = user_inv.GetItem(EQEmu::invslot::slotCursor); + new_aug = user_inv.GetItem(EQ::invslot::slotCursor); if (!new_aug) // Shouldn't get the OP code without the augment on the user's cursor, but maybe it's h4x. { @@ -3036,7 +3076,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) CalcBonuses(); - std::vector args; + std::vector args; args.push_back(old_aug); parse->EventItem(EVENT_UNAUGMENT_ITEM, this, tobe_auged, nullptr, "", in_augment->augment_index, &args); @@ -3051,7 +3091,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) aug = tobe_auged->GetAugment(in_augment->augment_index); if (aug) { - std::vector args; + std::vector args; args.push_back(aug); parse->EventItem(EVENT_AUGMENT_ITEM, this, tobe_auged, nullptr, "", in_augment->augment_index, &args); @@ -3074,7 +3114,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) if (itemOneToPush) { DeleteItemInInventory(item_slot, 0, true); - DeleteItemInInventory(EQEmu::invslot::slotCursor, new_aug->IsStackable() ? 1 : 0, true); + DeleteItemInInventory(EQ::invslot::slotCursor, new_aug->IsStackable() ? 1 : 0, true); if (solvent) { @@ -3085,7 +3125,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) if (itemTwoToPush) { // This is a swap. Return the old aug to the player's cursor. - if (!PutItemInInventory(EQEmu::invslot::slotCursor, *itemTwoToPush, true)) + if (!PutItemInInventory(EQ::invslot::slotCursor, *itemTwoToPush, true)) { LogError("Problem returning old augment to player's cursor after augmentation swap"); Message(Chat::Yellow, "Error: Failed to retrieve old augment after augmentation swap!"); @@ -3098,7 +3138,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) CalcBonuses(); - if (mat != EQEmu::textures::materialInvalid) + if (mat != EQ::textures::materialInvalid) { SendWearChange(mat); // Visible item augged while equipped. Send WC in case ornamentation changed. } @@ -3123,7 +3163,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) aug = tobe_auged->GetAugment(in_augment->augment_index); if (aug) { - std::vector args; + std::vector args; args.push_back(aug); parse->EventItem(EVENT_UNAUGMENT_ITEM, this, tobe_auged, nullptr, "", in_augment->augment_index, &args); @@ -3164,13 +3204,13 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) CalcBonuses(); - if (mat != EQEmu::textures::materialInvalid) + if (mat != EQ::textures::materialInvalid) { SendWearChange(mat); // Visible item augged while equipped. Send WC in case ornamentation changed. } // Drop the removed augment on the player's cursor - if (!PutItemInInventory(EQEmu::invslot::slotCursor, *itemTwoToPush, true)) + if (!PutItemInInventory(EQ::invslot::slotCursor, *itemTwoToPush, true)) { LogError("Problem returning augment to player's cursor after safe removal"); Message(Chat::Yellow, "Error: Failed to return augment after removal from item!"); @@ -3186,7 +3226,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) aug = tobe_auged->GetAugment(in_augment->augment_index); if (aug) { - std::vector args; + std::vector args; args.push_back(aug); parse->EventItem(EVENT_UNAUGMENT_ITEM, this, tobe_auged, nullptr, "", in_augment->augment_index, &args); @@ -3219,7 +3259,7 @@ void Client::Handle_OP_AugmentItem(const EQApplicationPacket *app) CalcBonuses(); - if (mat != EQEmu::textures::materialInvalid) + if (mat != EQ::textures::materialInvalid) { SendWearChange(mat); } @@ -3344,11 +3384,10 @@ void Client::Handle_OP_BankerChange(const EQApplicationPacket *app) if (!banker || distance > USE_NPC_RANGE2) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "Player tried to make use of a banker(money) but %s is non-existant or too far away (%u units).", - banker ? banker->GetName() : "UNKNOWN NPC", distance); + auto hacked_string = fmt::format( + "Player tried to make use of a banker(money) but {} is non-existant or too far away ({} units).", + banker ? banker->GetName() : "UNKNOWN NPC", distance); database.SetMQDetectionFlag(AccountName(), GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); return; } @@ -3509,13 +3548,13 @@ void Client::Handle_OP_Barter(const EQApplicationPacket *app) { BarterItemSearchLinkRequest_Struct* bislr = (BarterItemSearchLinkRequest_Struct*)app->pBuffer; - const EQEmu::ItemData* item = database.GetItem(bislr->ItemID); + const EQ::ItemData* item = database.GetItem(bislr->ItemID); if (!item) Message(Chat::Red, "Error: This item does not exist!"); else { - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if (inst) { SendItemPacket(0, inst, ItemPacketViewLink); @@ -3542,13 +3581,13 @@ void Client::Handle_OP_Barter(const EQApplicationPacket *app) { BuyerItemSearchLinkRequest_Struct* bislr = (BuyerItemSearchLinkRequest_Struct*)app->pBuffer; - const EQEmu::ItemData* item = database.GetItem(bislr->ItemID); + const EQ::ItemData* item = database.GetItem(bislr->ItemID); if (!item) Message(Chat::Red, "Error: This item does not exist!"); else { - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if (inst) { SendItemPacket(0, inst, ItemPacketViewLink); @@ -3581,14 +3620,14 @@ void Client::Handle_OP_BazaarInspect(const EQApplicationPacket *app) BazaarInspect_Struct* bis = (BazaarInspect_Struct*)app->pBuffer; - const EQEmu::ItemData* item = database.GetItem(bis->ItemID); + const EQ::ItemData* item = database.GetItem(bis->ItemID); if (!item) { Message(Chat::Red, "Error: This item does not exist!"); return; } - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if (inst) { SendItemPacket(0, inst, ItemPacketViewLink); @@ -3621,7 +3660,7 @@ void Client::Handle_OP_BazaarSearch(const EQApplicationPacket *app) Client *c = entity_list.GetClientByName(nbis->Name); if (c) { - EQEmu::ItemInstance* inst = c->FindTraderItemBySerialNumber(nbis->SerialNumber); + EQ::ItemInstance* inst = c->FindTraderItemBySerialNumber(nbis->SerialNumber); if (inst) SendItemPacket(0, inst, ItemPacketViewLink); } @@ -3648,7 +3687,7 @@ void Client::Handle_OP_Begging(const EQApplicationPacket *app) return; } - if (!HasSkill(EQEmu::skills::SkillBegging) || !GetTarget()) + if (!HasSkill(EQ::skills::SkillBegging) || !GetTarget()) return; if (GetTarget()->GetClass() == LDON_TREASURE) @@ -3686,7 +3725,7 @@ void Client::Handle_OP_Begging(const EQApplicationPacket *app) return; } - uint16 CurrentSkill = GetSkill(EQEmu::skills::SkillBegging); + uint16 CurrentSkill = GetSkill(EQ::skills::SkillBegging); float ChanceToBeg = ((float)(CurrentSkill / 700.0f) + 0.15f) * 100; @@ -3708,7 +3747,7 @@ void Client::Handle_OP_Begging(const EQApplicationPacket *app) } QueuePacket(outapp); safe_delete(outapp); - CheckIncreaseSkill(EQEmu::skills::SkillBegging, nullptr, -10); + CheckIncreaseSkill(EQ::skills::SkillBegging, nullptr, -10); } void Client::Handle_OP_Bind_Wound(const EQApplicationPacket *app) @@ -3966,8 +4005,8 @@ void Client::Handle_OP_CancelTask(const EQApplicationPacket *app) } CancelTask_Struct *cts = (CancelTask_Struct*)app->pBuffer; - if (RuleB(TaskSystem, EnableTaskSystem) && taskstate) - taskstate->CancelTask(this, cts->SequenceNumber, static_cast(cts->type)); + if (RuleB(TaskSystem, EnableTaskSystem) && task_state) + task_state->CancelTask(this, cts->SequenceNumber, static_cast(cts->type)); } void Client::Handle_OP_CancelTrade(const EQApplicationPacket *app) @@ -4007,7 +4046,7 @@ void Client::Handle_OP_CancelTrade(const EQApplicationPacket *app) void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) { - using EQEmu::spells::CastingSlot; + using EQ::spells::CastingSlot; if (app->size != sizeof(CastSpell_Struct)) { std::cout << "Wrong size: OP_CastSpell, size=" << app->size << ", expected " << sizeof(CastSpell_Struct) << std::endl; return; @@ -4018,6 +4057,14 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) return; } + // Hack for broken RoF2 which allows casting after a zoned IVU/IVA + if (invisible_undead || invisible_animals) { + BuffFadeByEffect(SE_InvisVsAnimals); + BuffFadeByEffect(SE_InvisVsUndead); + BuffFadeByEffect(SE_InvisVsUndead2); + BuffFadeByEffect(SE_Invisibility); // Included per JJ for completeness - client handles this one atm + } + CastSpell_Struct* castspell = (CastSpell_Struct*)app->pBuffer; m_TargetRing = glm::vec3(castspell->x_pos, castspell->y_pos, castspell->z_pos); @@ -4028,14 +4075,14 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) /* Memorized Spell */ if (m_pp.mem_spells[castspell->slot] && m_pp.mem_spells[castspell->slot] == castspell->spell_id) { uint16 spell_to_cast = 0; - if (castspell->slot < EQEmu::spells::SPELL_GEM_COUNT) { + if (castspell->slot < EQ::spells::SPELL_GEM_COUNT) { spell_to_cast = m_pp.mem_spells[castspell->slot]; if (spell_to_cast != castspell->spell_id) { InterruptSpell(castspell->spell_id); //CHEATER!!! return; } } - else if (castspell->slot >= EQEmu::spells::SPELL_GEM_COUNT) { + else if (castspell->slot >= EQ::spells::SPELL_GEM_COUNT) { InterruptSpell(); return; } @@ -4048,11 +4095,11 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) if (m_inv.SupportsClickCasting(castspell->inventoryslot) || slot == CastingSlot::PotionBelt) // sanity check { // packet field types will be reviewed as packet transistions occur - const EQEmu::ItemInstance* inst = m_inv[castspell->inventoryslot]; //slot values are int16, need to check packet on this field + const EQ::ItemInstance* inst = m_inv[castspell->inventoryslot]; //slot values are int16, need to check packet on this field //bool cancast = true; if (inst && inst->IsClassCommon()) { - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if (item->Click.Effect != (uint32)castspell->spell_id) { database.SetMQDetectionFlag(account_name, name, "OP_CastSpell with item, tried to cast a different spell.", zone->GetShortName()); @@ -4060,13 +4107,13 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) return; } - if ((item->Click.Type == EQEmu::item::ItemEffectClick) || (item->Click.Type == EQEmu::item::ItemEffectExpendable) || (item->Click.Type == EQEmu::item::ItemEffectEquipClick) || (item->Click.Type == EQEmu::item::ItemEffectClick2)) + if ((item->Click.Type == EQ::item::ItemEffectClick) || (item->Click.Type == EQ::item::ItemEffectExpendable) || (item->Click.Type == EQ::item::ItemEffectEquipClick) || (item->Click.Type == EQ::item::ItemEffectClick2)) { if (item->Click.Level2 > 0) { if (GetLevel() >= item->Click.Level2) { - EQEmu::ItemInstance* p_inst = (EQEmu::ItemInstance*)inst; + EQ::ItemInstance* p_inst = (EQ::ItemInstance*)inst; int i = parse->EventItem(EVENT_ITEM_CLICK_CAST, this, p_inst, nullptr, "", castspell->inventoryslot); if (i == 0) { @@ -4086,7 +4133,7 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) } else { - EQEmu::ItemInstance* p_inst = (EQEmu::ItemInstance*)inst; + EQ::ItemInstance* p_inst = (EQ::ItemInstance*)inst; int i = parse->EventItem(EVENT_ITEM_CLICK_CAST, this, p_inst, nullptr, "", castspell->inventoryslot); if (i == 0) { @@ -4111,7 +4158,7 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) } else { - Message(0, "Error: castspell->inventoryslot >= %i (0x%04x)", EQEmu::invslot::slotCursor, castspell->inventoryslot); + Message(0, "Error: castspell->inventoryslot >= %i (0x%04x)", EQ::invslot::slotCursor, castspell->inventoryslot); InterruptSpell(castspell->spell_id); } } @@ -4245,7 +4292,7 @@ void Client::Handle_OP_ClickDoor(const EQApplicationPacket *app) char buf[20]; snprintf(buf, 19, "%u", cd->doorid); buf[19] = '\0'; - std::vector args; + std::vector args; args.push_back(currentdoor); parse->EventPlayer(EVENT_CLICK_DOOR, this, buf, 0, &args); @@ -4268,7 +4315,7 @@ void Client::Handle_OP_ClickObject(const EQApplicationPacket *app) object->HandleClick(this, click_object); - std::vector args; + std::vector args; args.push_back(object); char buf[10]; @@ -4295,7 +4342,7 @@ void Client::Handle_OP_ClickObjectAction(const EQApplicationPacket *app) QueuePacket(&end_trade2); // RoF sends a 0 sized packet for closing objects - if (GetTradeskillObject() && ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (GetTradeskillObject() && ClientVersion() >= EQ::versions::ClientVersion::RoF) GetTradeskillObject()->CastToObject()->Close(); return; @@ -4365,27 +4412,27 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { PlayerPositionUpdateClient_Struct *ppu = (PlayerPositionUpdateClient_Struct *) app->pBuffer; - /* Boat handling */ - if (ppu->spawn_id != GetID()) { - /* If player is controlling boat */ - if (ppu->spawn_id && ppu->spawn_id == controlling_boat_id) { - Mob *boat = entity_list.GetMob(controlling_boat_id); - if (boat == 0) { - controlling_boat_id = 0; - return; - } + /* Non PC handling like boats and eye of zomm */ + if (ppu->spawn_id && ppu->spawn_id != GetID()) { + Mob *cmob = entity_list.GetMob(ppu->spawn_id); + if (!cmob) { + return; + } + + if (cmob->IsControllableBoat()) { + // Controllable boats auto boat_delta = glm::vec4(ppu->delta_x, ppu->delta_y, ppu->delta_z, EQ10toFloat(ppu->delta_heading)); - boat->SetDelta(boat_delta); + cmob->SetDelta(boat_delta); auto outapp = new EQApplicationPacket(OP_ClientUpdate, sizeof(PlayerPositionUpdateServer_Struct)); PlayerPositionUpdateServer_Struct *ppus = (PlayerPositionUpdateServer_Struct *) outapp->pBuffer; - boat->MakeSpawnUpdate(ppus); - entity_list.QueueCloseClients(boat, outapp, true, 300, this, false); + cmob->MakeSpawnUpdate(ppus); + entity_list.QueueCloseClients(cmob, outapp, true, 300, this, false); safe_delete(outapp); /* Update the boat's position on the server, without sending an update */ - boat->GMMove(ppu->x_pos, ppu->y_pos, ppu->z_pos, EQ12toFloat(ppu->heading), false); + cmob->GMMove(ppu->x_pos, ppu->y_pos, ppu->z_pos, EQ12toFloat(ppu->heading), false); return; } else { @@ -4393,16 +4440,13 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { // so that other clients see it. I could add a check here for eye of zomm // race, to limit this code, but this should handle any client controlled // mob that gets updates from OP_ClientUpdate - if (ppu->spawn_id == controlled_mob_id) { - Mob *cmob = entity_list.GetMob(ppu->spawn_id); - if (cmob != nullptr) { - cmob->SetPosition(ppu->x_pos, ppu->y_pos, ppu->z_pos); - cmob->SetHeading(EQ12toFloat(ppu->heading)); - mMovementManager->SendCommandToClients(cmob, 0.0, 0.0, 0.0, - 0.0, 0, ClientRangeAny, nullptr, this); - cmob->CastToNPC()->SaveGuardSpot(glm::vec4(ppu->x_pos, - ppu->y_pos, ppu->z_pos, EQ12toFloat(ppu->heading))); - } + if (!cmob->IsControllableBoat() && ppu->spawn_id == controlled_mob_id) { + cmob->SetPosition(ppu->x_pos, ppu->y_pos, ppu->z_pos); + cmob->SetHeading(EQ12toFloat(ppu->heading)); + mMovementManager->SendCommandToClients(cmob, 0.0, 0.0, 0.0, + 0.0, 0, ClientRangeAny, nullptr, this); + cmob->CastToNPC()->SaveGuardSpot(glm::vec4(ppu->x_pos, + ppu->y_pos, ppu->z_pos, EQ12toFloat(ppu->heading))); } } return; @@ -4430,9 +4474,25 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { LogError("Can't find boat for client position offset."); } else { - cx += boat->GetX(); - cy += boat->GetY(); + if (boat->turning) return; + + // Calculate angle from boat heading to EQ heading + double theta = std::fmod(((boat->GetHeading() * 360.0) / 512.0),360.0); + double thetar = (theta * M_PI) / 180.0; + + // Boat cx is inverted (positive to left) + // Boat cy is normal (positive toward heading) + double cosine = std::cos(thetar); + double sine = std::sin(thetar); + + double normalizedx, normalizedy; + normalizedx = cx * cosine - -cy * sine; + normalizedy = -cx * sine + cy * cosine; + + cx = boat->GetX() + normalizedx; + cy = boat->GetY() + normalizedy; cz += boat->GetZ(); + new_heading += boat->GetHeading(); } } @@ -4479,7 +4539,7 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { if (IsTracking() && ((m_Position.x != cx) || (m_Position.y != cy))) { if (zone->random.Real(0, 100) < 70)//should be good - CheckIncreaseSkill(EQEmu::skills::SkillTracking, nullptr, -20); + CheckIncreaseSkill(EQ::skills::SkillTracking, nullptr, -20); } /* Break Hide if moving without sneaking and set rewind timer if moved */ @@ -4501,23 +4561,63 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { rewind_timer.Start(30000, true); } - /* Handle client aggro scanning timers NPCs */ - is_client_moving = (cy == m_Position.y && cx == m_Position.x) ? false : true; + + is_client_moving = !(cy == m_Position.y && cx == m_Position.x); + + + /** + * Client aggro scanning + */ + const uint16 client_scan_npc_aggro_timer_idle = RuleI(Aggro, ClientAggroCheckIdleInterval); + const uint16 client_scan_npc_aggro_timer_moving = RuleI(Aggro, ClientAggroCheckMovingInterval); + + LogAggroDetail( + "ClientUpdate [{}] {}moving, scan timer [{}]", + GetCleanName(), + is_client_moving ? "" : "NOT ", + client_scan_npc_aggro_timer.GetRemainingTime() + ); if (is_client_moving) { - LogDebug("ClientUpdate: Client is moving - scan timer is: [{}]", client_scan_npc_aggro_timer.GetDuration()); - if (client_scan_npc_aggro_timer.GetDuration() > 1000) { + if (client_scan_npc_aggro_timer.GetRemainingTime() > client_scan_npc_aggro_timer_moving) { + LogAggroDetail("Client [{}] Restarting with moving timer", GetCleanName()); client_scan_npc_aggro_timer.Disable(); - client_scan_npc_aggro_timer.Start(500); + client_scan_npc_aggro_timer.Start(client_scan_npc_aggro_timer_moving); + client_scan_npc_aggro_timer.Trigger(); } } - else { - LogDebug("ClientUpdate: Client is NOT moving - scan timer is: [{}]", client_scan_npc_aggro_timer.GetDuration()); - if (client_scan_npc_aggro_timer.GetDuration() < 1000) { - client_scan_npc_aggro_timer.Disable(); - client_scan_npc_aggro_timer.Start(3000); + else if (client_scan_npc_aggro_timer.GetDuration() == client_scan_npc_aggro_timer_moving) { + LogAggroDetail("Client [{}] Restarting with idle timer", GetCleanName()); + client_scan_npc_aggro_timer.Disable(); + client_scan_npc_aggro_timer.Start(client_scan_npc_aggro_timer_idle); + } + + /** + * Client mob close list cache scan timer + */ + const uint16 client_mob_close_scan_timer_moving = 6000; + const uint16 client_mob_close_scan_timer_idle = 60000; + + LogAIScanCloseDetail( + "Client [{}] {}moving, scan timer [{}]", + GetCleanName(), + is_client_moving ? "" : "NOT ", + mob_close_scan_timer.GetRemainingTime() + ); + + if (is_client_moving) { + if (mob_close_scan_timer.GetRemainingTime() > client_mob_close_scan_timer_moving) { + LogAIScanCloseDetail("Client [{}] Restarting with moving timer", GetCleanName()); + mob_close_scan_timer.Disable(); + mob_close_scan_timer.Start(client_mob_close_scan_timer_moving); + mob_close_scan_timer.Trigger(); } } + else if (mob_close_scan_timer.GetDuration() == client_mob_close_scan_timer_moving) { + LogAIScanCloseDetail("Client [{}] Restarting with idle timer", GetCleanName()); + mob_close_scan_timer.Disable(); + mob_close_scan_timer.Start(client_mob_close_scan_timer_idle); + } /** * On a normal basis we limit mob movement updates based on distance @@ -4611,7 +4711,7 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { if (zone->watermap) { if (zone->watermap->InLiquid(glm::vec3(m_Position))) { - CheckIncreaseSkill(EQEmu::skills::SkillSwimming, nullptr, -17); + CheckIncreaseSkill(EQ::skills::SkillSwimming, nullptr, -17); // Dismount horses when entering water if (GetHorseId() && RuleB(Character, DismountWater)) { @@ -4621,6 +4721,9 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) { } CheckRegionTypeChanges(); } + + CheckVirtualZoneLines(); + } void Client::Handle_OP_CombatAbility(const EQApplicationPacket *app) @@ -4683,7 +4786,7 @@ void Client::Handle_OP_Consider(const EQApplicationPacket *app) con->faction = 1; con->level = GetLevelCon(tmob->GetLevel()); - if (ClientVersion() <= EQEmu::versions::ClientVersion::Titanium) { + if (ClientVersion() <= EQ::versions::ClientVersion::Titanium) { if (con->level == CON_GRAY) { con->level = CON_GREEN; } @@ -4758,7 +4861,7 @@ void Client::Handle_OP_Consider(const EQApplicationPacket *app) break; } - if (ClientVersion() <= EQEmu::versions::ClientVersion::Titanium) { + if (ClientVersion() <= EQ::versions::ClientVersion::Titanium) { if (color == 6) { color = 2; } @@ -4879,18 +4982,18 @@ void Client::Handle_OP_Consume(const EQApplicationPacket *app) } } - EQEmu::ItemInstance *myitem = GetInv().GetItem(pcs->slot); + EQ::ItemInstance *myitem = GetInv().GetItem(pcs->slot); if (myitem == nullptr) { LogError("Consuming from empty slot [{}]", pcs->slot); return; } - const EQEmu::ItemData* eat_item = myitem->GetItem(); + const EQ::ItemData* eat_item = myitem->GetItem(); if (pcs->type == 0x01) { - Consume(eat_item, EQEmu::item::ItemTypeFood, pcs->slot, (pcs->auto_consumed == 0xffffffff)); + Consume(eat_item, EQ::item::ItemTypeFood, pcs->slot, (pcs->auto_consumed == 0xffffffff)); } else if (pcs->type == 0x02) { - Consume(eat_item, EQEmu::item::ItemTypeDrink, pcs->slot, (pcs->auto_consumed == 0xffffffff)); + Consume(eat_item, EQ::item::ItemTypeDrink, pcs->slot, (pcs->auto_consumed == 0xffffffff)); } else { LogError("OP_Consume: unknown type, type:[{}]", (int)pcs->type); @@ -4928,10 +5031,8 @@ void Client::Handle_OP_ControlBoat(const EQApplicationPacket *app) if (!boat->IsNPC() || !boat->IsControllableBoat()) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "OP_Control Boat was sent against %s which is of race %u", boat->GetName(), boat->GetRace()); + auto hacked_string = fmt::format("OP_Control Boat was sent against {} which is of race {}", boat->GetName(), boat->GetRace()); database.SetMQDetectionFlag(this->AccountName(), this->GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); return; } @@ -5026,7 +5127,7 @@ void Client::Handle_OP_CreateObject(const EQApplicationPacket *app) if (LogSys.log_settings[Logs::Inventory].is_category_enabled) LogInventory("Handle_OP_CreateObject() [psize: [{}]] [{}]", app->size, DumpPacketToString(app).c_str()); - DropItem(EQEmu::invslot::slotCursor); + DropItem(EQ::invslot::slotCursor); return; } @@ -5056,7 +5157,7 @@ void Client::Handle_OP_CrystalCreate(const EQApplicationPacket *app) } // Prevent the client from creating more than they have. - const uint32 amount = EQEmu::ClampUpper(requestQty, currentQty); + const uint32 amount = EQ::ClampUpper(requestQty, currentQty); const uint32 itemID = isRadiant ? RuleI(Zone, RadiantCrystalItemID) : RuleI(Zone, EbonCrystalItemID); // Summon crystals for player. @@ -5112,7 +5213,7 @@ void Client::Handle_OP_Death(const EQApplicationPacket *app) Death_Struct* ds = (Death_Struct*)app->pBuffer; //I think this attack_skill value is really a value from SkillDamageTypes... - if (ds->attack_skill > EQEmu::skills::HIGHEST_SKILL) { + if (ds->attack_skill > EQ::skills::HIGHEST_SKILL) { return; } @@ -5120,7 +5221,7 @@ void Client::Handle_OP_Death(const EQApplicationPacket *app) return; Mob* killer = entity_list.GetMob(ds->killer_id); - Death(killer, ds->damage, ds->spell_id, (EQEmu::skills::SkillType)ds->attack_skill); + Death(killer, ds->damage, ds->spell_id, (EQ::skills::SkillType)ds->attack_skill); return; } @@ -5177,15 +5278,15 @@ void Client::Handle_OP_DeleteItem(const EQApplicationPacket *app) } DeleteItem_Struct* alc = (DeleteItem_Struct*)app->pBuffer; - const EQEmu::ItemInstance *inst = GetInv().GetItem(alc->from_slot); - if (inst && inst->GetItem()->ItemType == EQEmu::item::ItemTypeAlcohol) { + const EQ::ItemInstance *inst = GetInv().GetItem(alc->from_slot); + if (inst && inst->GetItem()->ItemType == EQ::item::ItemTypeAlcohol) { entity_list.MessageCloseString(this, true, 50, 0, DRINKING_MESSAGE, GetName(), inst->GetItem()->Name); - CheckIncreaseSkill(EQEmu::skills::SkillAlcoholTolerance, nullptr, 25); + CheckIncreaseSkill(EQ::skills::SkillAlcoholTolerance, nullptr, 25); - int16 AlcoholTolerance = GetSkill(EQEmu::skills::SkillAlcoholTolerance); + int16 AlcoholTolerance = GetSkill(EQ::skills::SkillAlcoholTolerance); int16 IntoxicationIncrease; - if (ClientVersion() < EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() < EQ::versions::ClientVersion::SoD) IntoxicationIncrease = (200 - AlcoholTolerance) * 30 / 200 + 10; else IntoxicationIncrease = (270 - AlcoholTolerance) * 0.111111108 + 10; @@ -5227,7 +5328,7 @@ void Client::Handle_OP_DeleteSpawn(const EQApplicationPacket *app) void Client::Handle_OP_Disarm(const EQApplicationPacket *app) { if (dead || bZoning) return; - if (!HasSkill(EQEmu::skills::SkillDisarm)) + if (!HasSkill(EQ::skills::SkillDisarm)) return; if (app->size != sizeof(Disarm_Struct)) { @@ -5251,10 +5352,8 @@ void Client::Handle_OP_Disarm(const EQApplicationPacket *app) { return; if (pmob->GetID() != GetID()) { // Client sent a disarm request with an originator ID not matching their own ID. - char *hack_str = NULL; - MakeAnyLenString(&hack_str, "Player %s (%d) sent OP_Disarm with source ID of: %d", GetCleanName(), GetID(), pmob->GetID()); + auto hack_str = fmt::format("Player {} ({}) sent OP_Disarm with source ID of: {}", GetCleanName(), GetID(), pmob->GetID()); database.SetMQDetectionFlag(this->account_name, this->name, hack_str, zone->GetShortName()); - safe_delete_array(hack_str); return; } // No disarm on corpses @@ -5281,7 +5380,7 @@ void Client::Handle_OP_Disarm(const EQApplicationPacket *app) { if (tmob->IsClient() && tmob->CastToClient()->GetFeigned()) return; if (GetTarget() == tmob && pmob == this->CastToMob() && - disarm->skill == GetSkill(EQEmu::skills::SkillDisarm) && IsAttackAllowed(tmob)) { + disarm->skill == GetSkill(EQ::skills::SkillDisarm) && IsAttackAllowed(tmob)) { int p_level = pmob->GetLevel() ? pmob->GetLevel() : 1; int t_level = tmob->GetLevel() ? tmob->GetLevel() : 1; // We have a disarmable target - sucess or fail, we always aggro the mob @@ -5294,7 +5393,7 @@ void Client::Handle_OP_Disarm(const EQApplicationPacket *app) { tmob->AddToHateList(pmob, p_level / 3); } } - int chance = GetSkill(EQEmu::skills::SkillDisarm); // (1% @ 0 skill) (11% @ 200 skill) - against even con + int chance = GetSkill(EQ::skills::SkillDisarm); // (1% @ 0 skill) (11% @ 200 skill) - against even con chance /= 2; chance += 10; // Modify chance based on level difference @@ -5324,7 +5423,7 @@ void Client::Handle_OP_DeleteSpell(const EQApplicationPacket *app) EQApplicationPacket* outapp = app->Copy(); DeleteSpell_Struct* dss = (DeleteSpell_Struct*)outapp->pBuffer; - if (dss->spell_slot < 0 || dss->spell_slot >= EQEmu::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize) + if (dss->spell_slot < 0 || dss->spell_slot >= EQ::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize) return; if (m_pp.spell_book[dss->spell_slot] != SPELLBOOK_UNKNOWN) { @@ -5341,7 +5440,7 @@ void Client::Handle_OP_DeleteSpell(const EQApplicationPacket *app) void Client::Handle_OP_DisarmTraps(const EQApplicationPacket *app) { - if (!HasSkill(EQEmu::skills::SkillDisarmTraps)) + if (!HasSkill(EQ::skills::SkillDisarmTraps)) return; if (!p_timers.Expired(&database, pTimerDisarmTraps, false)) { @@ -5349,7 +5448,7 @@ void Client::Handle_OP_DisarmTraps(const EQApplicationPacket *app) return; } - int reuse = DisarmTrapsReuseTime - GetSkillReuseTime(EQEmu::skills::SkillDisarmTraps); + int reuse = DisarmTrapsReuseTime - GetSkillReuseTime(EQ::skills::SkillDisarmTraps); if (reuse < 1) reuse = 1; @@ -5365,7 +5464,7 @@ void Client::Handle_OP_DisarmTraps(const EQApplicationPacket *app) Log(Logs::General, Logs::Traps, "%s is attempting to disarm trap %d. Curdist is %0.2f maxdist is %0.2f", GetName(), trap->trap_id, curdist, max_radius); if (curdist <= max_radius) { - int uskill = GetSkill(EQEmu::skills::SkillDisarmTraps); + int uskill = GetSkill(EQ::skills::SkillDisarmTraps); if ((zone->random.Int(0, 49) + uskill) >= (zone->random.Int(0, 49) + trap->skill)) { success = SKILLUP_SUCCESS; @@ -5381,7 +5480,7 @@ void Client::Handle_OP_DisarmTraps(const EQApplicationPacket *app) trap->Trigger(this); } } - CheckIncreaseSkill(EQEmu::skills::SkillDisarmTraps, nullptr); + CheckIncreaseSkill(EQ::skills::SkillDisarmTraps, nullptr); return; } else @@ -5522,15 +5621,121 @@ void Client::Handle_OP_DumpName(const EQApplicationPacket *app) void Client::Handle_OP_Dye(const EQApplicationPacket *app) { - if (app->size != sizeof(EQEmu::TintProfile)) - printf("Wrong size of DyeStruct, Got: %i, Expected: %zu\n", app->size, sizeof(EQEmu::TintProfile)); + if (app->size != sizeof(EQ::TintProfile)) + printf("Wrong size of DyeStruct, Got: %i, Expected: %zu\n", app->size, sizeof(EQ::TintProfile)); else { - EQEmu::TintProfile* dye = (EQEmu::TintProfile*)app->pBuffer; + EQ::TintProfile* dye = (EQ::TintProfile*)app->pBuffer; DyeArmor(dye); } return; } +void Client::Handle_OP_DzAddPlayer(const EQApplicationPacket *app) +{ + auto expedition = GetExpedition(); + if (expedition) + { + auto dzcmd = reinterpret_cast(app->pBuffer); + expedition->DzAddPlayer(this, dzcmd->name); + } + else + { + // the only /dz command that sends an error message if no active expedition + Message(Chat::System, DZ_YOU_NOT_ASSIGNED); + } +} + +void Client::Handle_OP_DzChooseZoneReply(const EQApplicationPacket *app) +{ + auto dzmsg = reinterpret_cast(app->pBuffer); + + LogDynamicZones("Character [{}] chose DynamicZone [{}]:[{}] type: [{}] with system id: [{}]", + CharacterID(), dzmsg->dz_zone_id, dzmsg->dz_instance_id, dzmsg->dz_type, dzmsg->unknown_id2); + + if (!dzmsg->dz_instance_id || !database.VerifyInstanceAlive(dzmsg->dz_instance_id, CharacterID())) + { + // live just no-ops this without a message + LogDynamicZones("Character [{}] chose invalid DynamicZone [{}]:[{}] or is no longer a member", + CharacterID(), dzmsg->dz_zone_id, dzmsg->dz_instance_id); + return; + } + + auto client_dzs = GetDynamicZones(); + auto it = std::find_if(client_dzs.begin(), client_dzs.end(), [&](const DynamicZone* dz) { + return dz->IsSameDz(dzmsg->dz_zone_id, dzmsg->dz_instance_id); }); + + if (it != client_dzs.end()) + { + DynamicZoneLocation loc = (*it)->GetZoneInLocation(); + ZoneMode zone_mode = (*it)->HasZoneInLocation() ? ZoneMode::ZoneSolicited : ZoneMode::ZoneToSafeCoords; + MovePC(dzmsg->dz_zone_id, dzmsg->dz_instance_id, loc.x, loc.y, loc.z, loc.heading, 0, zone_mode); + } +} + +void Client::Handle_OP_DzExpeditionInviteResponse(const EQApplicationPacket *app) +{ + auto expedition = Expedition::FindCachedExpeditionByID(m_pending_expedition_invite.expedition_id); + std::string swap_remove_name = m_pending_expedition_invite.swap_remove_name; + m_pending_expedition_invite = { 0 }; // clear before re-validating + + if (expedition) + { + auto dzmsg = reinterpret_cast(app->pBuffer); + expedition->DzInviteResponse(this, dzmsg->accepted, swap_remove_name); + } +} + +void Client::Handle_OP_DzListTimers(const EQApplicationPacket *app) +{ + DzListTimers(); +} + +void Client::Handle_OP_DzMakeLeader(const EQApplicationPacket *app) +{ + auto expedition = GetExpedition(); + if (expedition) + { + auto dzcmd = reinterpret_cast(app->pBuffer); + expedition->DzMakeLeader(this, dzcmd->name); + } +} + +void Client::Handle_OP_DzPlayerList(const EQApplicationPacket *app) +{ + auto expedition = GetExpedition(); + if (expedition) { + expedition->DzPlayerList(this); + } +} + +void Client::Handle_OP_DzRemovePlayer(const EQApplicationPacket *app) +{ + auto expedition = GetExpedition(); + if (expedition) + { + auto dzcmd = reinterpret_cast(app->pBuffer); + expedition->DzRemovePlayer(this, dzcmd->name); + } +} + +void Client::Handle_OP_DzSwapPlayer(const EQApplicationPacket *app) +{ + auto expedition = GetExpedition(); + if (expedition) + { + auto dzcmd = reinterpret_cast(app->pBuffer); + expedition->DzSwapPlayer(this, dzcmd->rem_player_name, dzcmd->add_player_name); + } +} + +void Client::Handle_OP_DzQuit(const EQApplicationPacket *app) +{ + auto expedition = GetExpedition(); + if (expedition) { + expedition->DzQuit(this); + } +} + void Client::Handle_OP_Emote(const EQApplicationPacket *app) { if (app->size != sizeof(Emote_Struct)) { @@ -5597,7 +5802,7 @@ void Client::Handle_OP_EndLootRequest(const EQApplicationPacket *app) Entity* entity = entity_list.GetID(*((uint16*)app->pBuffer)); if (entity == 0) { Message(Chat::Red, "Error: OP_EndLootRequest: Corpse not found (ent = 0)"); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) Corpse::SendEndLootErrorPacket(this); else Corpse::SendLootReqErrorPacket(this); @@ -5667,7 +5872,7 @@ void Client::Handle_OP_EnvDamage(const EQApplicationPacket *app) if (GetHP() <= 0) { mod_client_death_env(); - Death(0, 32000, SPELL_UNKNOWN, EQEmu::skills::SkillHandtoHand); + Death(0, 32000, SPELL_UNKNOWN, EQ::skills::SkillHandtoHand); } SendHPUpdate(); return; @@ -5711,7 +5916,7 @@ void Client::Handle_OP_FeignDeath(const EQApplicationPacket *app) } int reuse = FeignDeathReuseTime; - reuse -= GetSkillReuseTime(EQEmu::skills::SkillFeignDeath); + reuse -= GetSkillReuseTime(EQ::skills::SkillFeignDeath); if (reuse < 1) reuse = 1; @@ -5720,8 +5925,8 @@ void Client::Handle_OP_FeignDeath(const EQApplicationPacket *app) //BreakInvis(); - uint16 primfeign = GetSkill(EQEmu::skills::SkillFeignDeath); - uint16 secfeign = GetSkill(EQEmu::skills::SkillFeignDeath); + uint16 primfeign = GetSkill(EQ::skills::SkillFeignDeath); + uint16 secfeign = GetSkill(EQ::skills::SkillFeignDeath); if (primfeign > 100) { primfeign = 100; secfeign = secfeign - 100; @@ -5739,7 +5944,7 @@ void Client::Handle_OP_FeignDeath(const EQApplicationPacket *app) SetFeigned(true); } - CheckIncreaseSkill(EQEmu::skills::SkillFeignDeath, nullptr, 5); + CheckIncreaseSkill(EQ::skills::SkillFeignDeath, nullptr, 5); return; } @@ -6392,34 +6597,45 @@ void Client::Handle_OP_GMZoneRequest(const EQApplicationPacket *app) } GMZoneRequest_Struct* gmzr = (GMZoneRequest_Struct*)app->pBuffer; - float tarx = -1, tary = -1, tarz = -1; + float target_x = -1, target_y = -1, target_z = -1, target_heading; - int16 minstatus = 0; - uint8 minlevel = 0; - char tarzone[32]; - uint16 zid = gmzr->zone_id; + int16 min_status = 0; + uint8 min_level = 0; + char target_zone[32]; + uint16 zone_id = gmzr->zone_id; if (gmzr->zone_id == 0) - zid = zonesummon_id; - const char * zname = content_db.GetZoneName(zid); - if (zname == nullptr) - tarzone[0] = 0; + zone_id = zonesummon_id; + + const char* zone_short_name = ZoneName(zone_id); + if (zone_short_name == nullptr) + target_zone[0] = 0; else - strcpy(tarzone, zname); + strcpy(target_zone, zone_short_name); // this both loads the safe points and does a sanity check on zone name - if (!content_db.GetSafePoints(tarzone, 0, &tarx, &tary, &tarz, &minstatus, &minlevel)) { - tarzone[0] = 0; + if (!content_db.GetSafePoints( + target_zone, + 0, + &target_x, + &target_y, + &target_z, + &target_heading, + &min_status, + &min_level + )) { + target_zone[0] = 0; } auto outapp = new EQApplicationPacket(OP_GMZoneRequest, sizeof(GMZoneRequest_Struct)); GMZoneRequest_Struct* gmzr2 = (GMZoneRequest_Struct*)outapp->pBuffer; strcpy(gmzr2->charname, this->GetName()); gmzr2->zone_id = gmzr->zone_id; - gmzr2->x = tarx; - gmzr2->y = tary; - gmzr2->z = tarz; + gmzr2->x = target_x; + gmzr2->y = target_y; + gmzr2->z = target_z; + gmzr2->heading = target_heading; // Next line stolen from ZoneChange as well... - This gives us a nicer message than the normal "zone is down" message... - if (tarzone[0] != 0 && admin >= minstatus && GetLevel() >= minlevel) + if (target_zone[0] != 0 && admin >= min_status && GetLevel() >= min_level) gmzr2->success = 1; else { std::cout << "GetZoneSafeCoords failed. zoneid = " << gmzr->zone_id << "; czone = " << zone->GetZoneID() << std::endl; @@ -6991,7 +7207,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) if (Slot >= 0) { - EQEmu::ItemInstance* inst = GuildBanks->GetItem(GuildID(), GuildBankMainArea, Slot, 1); + EQ::ItemInstance* inst = GuildBanks->GetItem(GuildID(), GuildBankMainArea, Slot, 1); if (inst) { @@ -7011,7 +7227,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) { GuildBankViewItem_Struct *gbvis = (GuildBankViewItem_Struct*)app->pBuffer; - EQEmu::ItemInstance* inst = GuildBanks->GetItem(GuildID(), gbvis->Area, gbvis->SlotID, 1); + EQ::ItemInstance* inst = GuildBanks->GetItem(GuildID(), gbvis->Area, gbvis->SlotID, 1); if (!inst) break; @@ -7034,7 +7250,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) return; } - EQEmu::ItemInstance *CursorItemInst = GetInv().GetItem(EQEmu::invslot::slotCursor); + EQ::ItemInstance *CursorItemInst = GetInv().GetItem(EQ::invslot::slotCursor); bool Allowed = true; @@ -7047,7 +7263,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) return; } - const EQEmu::ItemData* CursorItem = CursorItemInst->GetItem(); + const EQ::ItemData* CursorItem = CursorItemInst->GetItem(); if (!CursorItem->NoDrop || CursorItemInst->IsAttuned()) { @@ -7082,7 +7298,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) { GuildBankDepositAck(false, sentAction); - DeleteItemInInventory(EQEmu::invslot::slotCursor, 0, false); + DeleteItemInInventory(EQ::invslot::slotCursor, 0, false); } break; @@ -7103,7 +7319,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) case GuildBankWithdraw: { - if (GetInv()[EQEmu::invslot::slotCursor]) + if (GetInv()[EQ::invslot::slotCursor]) { MessageString(Chat::Red, GUILD_BANK_EMPTY_HANDS); @@ -7114,7 +7330,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) GuildBankWithdrawItem_Struct *gbwis = (GuildBankWithdrawItem_Struct*)app->pBuffer; - EQEmu::ItemInstance* inst = GuildBanks->GetItem(GuildID(), gbwis->Area, gbwis->SlotID, gbwis->Quantity); + EQ::ItemInstance* inst = GuildBanks->GetItem(GuildID(), gbwis->Area, gbwis->SlotID, gbwis->Quantity); if (!inst) { @@ -7149,7 +7365,7 @@ void Client::Handle_OP_GuildBank(const EQApplicationPacket *app) { PushItemOnCursor(*inst); - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketLimbo); + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketLimbo); GuildBanks->DeleteItem(GuildID(), gbwis->Area, gbwis->SlotID, gbwis->Quantity); } @@ -7462,11 +7678,11 @@ void Client::Handle_OP_GuildInvite(const EQApplicationPacket *app) gc->guildeqid = GuildID(); // Convert Membership Level between RoF and previous clients. - if (client->ClientVersion() < EQEmu::versions::ClientVersion::RoF && ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (client->ClientVersion() < EQ::versions::ClientVersion::RoF && ClientVersion() >= EQ::versions::ClientVersion::RoF) { gc->officer = 0; } - if (client->ClientVersion() >= EQEmu::versions::ClientVersion::RoF && ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF && ClientVersion() < EQ::versions::ClientVersion::RoF) { gc->officer = 8; } @@ -7507,7 +7723,7 @@ void Client::Handle_OP_GuildInviteAccept(const EQApplicationPacket *app) uint32 guildrank = gj->response; - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { if (gj->response > 9) { @@ -7542,11 +7758,11 @@ void Client::Handle_OP_GuildInviteAccept(const EQApplicationPacket *app) { Client* client = inviter->CastToClient(); // Convert Membership Level between RoF and previous clients. - if (client->ClientVersion() < EQEmu::versions::ClientVersion::RoF && ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (client->ClientVersion() < EQ::versions::ClientVersion::RoF && ClientVersion() >= EQ::versions::ClientVersion::RoF) { guildrank = 0; } - if (client->ClientVersion() >= EQEmu::versions::ClientVersion::RoF && ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF && ClientVersion() < EQ::versions::ClientVersion::RoF) { guildrank = 8; } @@ -7583,7 +7799,7 @@ void Client::Handle_OP_GuildInviteAccept(const EQApplicationPacket *app) guildrank = gj->response; - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { if (gj->response == 8) { @@ -7990,7 +8206,7 @@ void Client::Handle_OP_Hide(const EQApplicationPacket *app) return; } - if (!HasSkill(EQEmu::skills::SkillHide) && GetSkill(EQEmu::skills::SkillHide) == 0) + if (!HasSkill(EQ::skills::SkillHide) && GetSkill(EQ::skills::SkillHide) == 0) { //Can not be able to train hide but still have it from racial though return; //You cannot hide if you do not have hide @@ -8000,16 +8216,16 @@ void Client::Handle_OP_Hide(const EQApplicationPacket *app) Message(Chat::Red, "Ability recovery time not yet met."); return; } - int reuse = HideReuseTime - GetSkillReuseTime(EQEmu::skills::SkillHide); + int reuse = HideReuseTime - GetSkillReuseTime(EQ::skills::SkillHide); if (reuse < 1) reuse = 1; p_timers.Start(pTimerHide, reuse - 1); - float hidechance = ((GetSkill(EQEmu::skills::SkillHide) / 250.0f) + .25) * 100; + float hidechance = ((GetSkill(EQ::skills::SkillHide) / 250.0f) + .25) * 100; float random = zone->random.Real(0, 100); - CheckIncreaseSkill(EQEmu::skills::SkillHide, nullptr, 5); + CheckIncreaseSkill(EQ::skills::SkillHide, nullptr, 5); if (random < hidechance) { auto outapp = new EQApplicationPacket(OP_SpawnAppearance, sizeof(SpawnAppearance_Struct)); SpawnAppearance_Struct* sa_out = (SpawnAppearance_Struct*)outapp->pBuffer; @@ -8033,7 +8249,7 @@ void Client::Handle_OP_Hide(const EQApplicationPacket *app) Mob *evadetar = GetTarget(); if (!auto_attack && (evadetar && evadetar->CheckAggro(this) && evadetar->IsNPC())) { - if (zone->random.Int(0, 260) < (int)GetSkill(EQEmu::skills::SkillHide)) { + if (zone->random.Int(0, 260) < (int)GetSkill(EQ::skills::SkillHide)) { msg->string_id = EVADE_SUCCESS; RogueEvade(evadetar); } @@ -8125,17 +8341,17 @@ void Client::Handle_OP_InspectAnswer(const EQApplicationPacket *app) EQApplicationPacket* outapp = app->Copy(); InspectResponse_Struct* insr = (InspectResponse_Struct*)outapp->pBuffer; Mob* tmp = entity_list.GetMob(insr->TargetID); - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; int ornamentationAugtype = RuleI(Character, OrnamentationAugmentType); - for (int16 L = EQEmu::invslot::EQUIPMENT_BEGIN; L <= EQEmu::invslot::EQUIPMENT_END; L++) { - const EQEmu::ItemInstance* inst = GetInv().GetItem(L); + for (int16 L = EQ::invslot::EQUIPMENT_BEGIN; L <= EQ::invslot::EQUIPMENT_END; L++) { + const EQ::ItemInstance* inst = GetInv().GetItem(L); item = inst ? inst->GetItem() : nullptr; if (item) { strcpy(insr->itemnames[L], item->Name); if (inst && inst->GetOrnamentationAug(ornamentationAugtype)) { - const EQEmu::ItemData *aug_item = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); + const EQ::ItemData *aug_item = inst->GetOrnamentationAug(ornamentationAugtype)->GetItem(); insr->itemicons[L] = aug_item->Icon; } else if (inst->GetOrnamentationIcon()) { @@ -8184,7 +8400,7 @@ void Client::Handle_OP_InspectRequest(const EQApplicationPacket *app) Mob* tmp = entity_list.GetMob(ins->TargetID); if (tmp != 0 && tmp->IsClient()) { - if (tmp->CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoF) { tmp->CastToClient()->QueuePacket(app); } // Send request to target + if (tmp->CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoF) { tmp->CastToClient()->QueuePacket(app); } // Send request to target // Inspecting an SoF or later client will make the server handle the request else { ProcessInspectRequest(tmp->CastToClient(), this); } } @@ -8224,7 +8440,7 @@ void Client::Handle_OP_ItemLinkClick(const EQApplicationPacket *app) // todo: verify ivrs->link_hash based on a rule, in case we don't care about people being able to sniff data // from the item DB - const EQEmu::ItemData *item = database.GetItem(ivrs->item_id); + const EQ::ItemData *item = database.GetItem(ivrs->item_id); if (!item) { if (ivrs->item_id != SAYLINK_ITEM_ID) { Message(Chat::Red, "Error: The item for the link you have clicked on does not exist!"); @@ -8307,7 +8523,7 @@ void Client::Handle_OP_ItemLinkClick(const EQApplicationPacket *app) } } - EQEmu::ItemInstance *inst = + EQ::ItemInstance *inst = database.CreateItem(item, item->MaxCharges, ivrs->augments[0], ivrs->augments[1], ivrs->augments[2], ivrs->augments[3], ivrs->augments[4], ivrs->augments[5]); if (inst) { @@ -8324,7 +8540,7 @@ void Client::Handle_OP_ItemLinkResponse(const EQApplicationPacket *app) return; } LDONItemViewRequest_Struct* item = (LDONItemViewRequest_Struct*)app->pBuffer; - EQEmu::ItemInstance* inst = database.CreateItem(item->item_id); + EQ::ItemInstance* inst = database.CreateItem(item->item_id); if (inst) { SendItemPacket(0, inst, ItemPacketViewLink); safe_delete(inst); @@ -8340,7 +8556,7 @@ void Client::Handle_OP_ItemName(const EQApplicationPacket *app) return; } ItemNamePacket_Struct *p = (ItemNamePacket_Struct*)app->pBuffer; - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; if ((item = database.GetItem(p->item_id)) != nullptr) { auto outapp = new EQApplicationPacket(OP_ItemName, sizeof(ItemNamePacket_Struct)); p = (ItemNamePacket_Struct*)outapp->pBuffer; @@ -8356,7 +8572,7 @@ void Client::Handle_OP_ItemPreview(const EQApplicationPacket *app) VERIFY_PACKET_LENGTH(OP_ItemPreview, app, ItemPreview_Struct); ItemPreview_Struct *ips = (ItemPreview_Struct *)app->pBuffer; - const EQEmu::ItemData* item = database.GetItem(ips->itemid); + const EQ::ItemData* item = database.GetItem(ips->itemid); if (item) { auto outapp = new EQApplicationPacket(OP_ItemPreview, strlen(item->Name) + strlen(item->Lore) + @@ -8532,7 +8748,7 @@ void Client::Handle_OP_ItemPreview(const EQApplicationPacket *app) void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) { - using EQEmu::spells::CastingSlot; + using EQ::spells::CastingSlot; if (app->size != sizeof(ItemVerifyRequest_Struct)) { LogError("OP size error: OP_ItemVerifyRequest expected:[{}] got:[{}]", sizeof(ItemVerifyRequest_Struct), app->size); @@ -8567,14 +8783,14 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) return; } - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + const EQ::ItemInstance* inst = m_inv[slot_id]; if (!inst) { Message(0, "Error: item not found in inventory slot #%i", slot_id); DeleteItemInInventory(slot_id, 0, true); return; } - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if (!item) { Message(0, "Error: item not found in inventory slot #%i", slot_id); DeleteItemInInventory(slot_id, 0, true); @@ -8613,9 +8829,9 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) LogDebug("OP ItemVerifyRequest: spell=[{}], target=[{}], inv=[{}]", spell_id, target_id, slot_id); - if (m_inv.SupportsClickCasting(slot_id) || ((item->ItemType == EQEmu::item::ItemTypePotion || item->PotionBelt) && m_inv.SupportsPotionBeltCasting(slot_id))) // sanity check + if (m_inv.SupportsClickCasting(slot_id) || ((item->ItemType == EQ::item::ItemTypePotion || item->PotionBelt) && m_inv.SupportsPotionBeltCasting(slot_id))) // sanity check { - EQEmu::ItemInstance* p_inst = (EQEmu::ItemInstance*)inst; + EQ::ItemInstance* p_inst = (EQ::ItemInstance*)inst; parse->EventItem(EVENT_ITEM_CLICK, this, p_inst, nullptr, "", slot_id); inst = m_inv[slot_id]; @@ -8626,43 +8842,43 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) int r; bool tryaug = false; - EQEmu::ItemInstance* clickaug = nullptr; - EQEmu::ItemData* augitem = nullptr; + EQ::ItemInstance* clickaug = nullptr; + EQ::ItemData* augitem = nullptr; - for (r = EQEmu::invaug::SOCKET_BEGIN; r <= EQEmu::invaug::SOCKET_END; r++) { - const EQEmu::ItemInstance* aug_i = inst->GetAugment(r); + for (r = EQ::invaug::SOCKET_BEGIN; r <= EQ::invaug::SOCKET_END; r++) { + const EQ::ItemInstance* aug_i = inst->GetAugment(r); if (!aug_i) continue; - const EQEmu::ItemData* aug = aug_i->GetItem(); + const EQ::ItemData* aug = aug_i->GetItem(); if (!aug) continue; - if ((aug->Click.Type == EQEmu::item::ItemEffectClick) || (aug->Click.Type == EQEmu::item::ItemEffectExpendable) || (aug->Click.Type == EQEmu::item::ItemEffectEquipClick) || (aug->Click.Type == EQEmu::item::ItemEffectClick2)) + if ((aug->Click.Type == EQ::item::ItemEffectClick) || (aug->Click.Type == EQ::item::ItemEffectExpendable) || (aug->Click.Type == EQ::item::ItemEffectEquipClick) || (aug->Click.Type == EQ::item::ItemEffectClick2)) { tryaug = true; - clickaug = (EQEmu::ItemInstance*)aug_i; - augitem = (EQEmu::ItemData*)aug; + clickaug = (EQ::ItemInstance*)aug_i; + augitem = (EQ::ItemData*)aug; spell_id = aug->Click.Effect; break; } } - if ((spell_id <= 0) && (item->ItemType != EQEmu::item::ItemTypeFood && item->ItemType != EQEmu::item::ItemTypeDrink && item->ItemType != EQEmu::item::ItemTypeAlcohol && item->ItemType != EQEmu::item::ItemTypeSpell)) + if ((spell_id <= 0) && (item->ItemType != EQ::item::ItemTypeFood && item->ItemType != EQ::item::ItemTypeDrink && item->ItemType != EQ::item::ItemTypeAlcohol && item->ItemType != EQ::item::ItemTypeSpell)) { LogDebug("Item with no effect right clicked by [{}]", GetName()); } else if (inst->IsClassCommon()) { - if (!RuleB(Skills, RequireTomeHandin) && item->ItemType == EQEmu::item::ItemTypeSpell && (strstr((const char*)item->Name, "Tome of ") || strstr((const char*)item->Name, "Skill: "))) + if (!RuleB(Skills, RequireTomeHandin) && item->ItemType == EQ::item::ItemTypeSpell && (strstr((const char*)item->Name, "Tome of ") || strstr((const char*)item->Name, "Skill: "))) { DeleteItemInInventory(slot_id, 1, true); TrainDiscipline(item->ID); } - else if (item->ItemType == EQEmu::item::ItemTypeSpell) + else if (item->ItemType == EQ::item::ItemTypeSpell) { return; } - else if ((item->Click.Type == EQEmu::item::ItemEffectClick) || (item->Click.Type == EQEmu::item::ItemEffectExpendable) || (item->Click.Type == EQEmu::item::ItemEffectEquipClick) || (item->Click.Type == EQEmu::item::ItemEffectClick2)) + else if ((item->Click.Type == EQ::item::ItemEffectClick) || (item->Click.Type == EQ::item::ItemEffectExpendable) || (item->Click.Type == EQ::item::ItemEffectEquipClick) || (item->Click.Type == EQ::item::ItemEffectClick2)) { if (inst->GetCharges() == 0) { @@ -8722,9 +8938,9 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) } else { - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD && !inst->IsEquipable(GetBaseRace(), GetClass())) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD && !inst->IsEquipable(GetBaseRace(), GetClass())) { - if (item->ItemType != EQEmu::item::ItemTypeFood && item->ItemType != EQEmu::item::ItemTypeDrink && item->ItemType != EQEmu::item::ItemTypeAlcohol) + if (item->ItemType != EQ::item::ItemTypeFood && item->ItemType != EQ::item::ItemTypeDrink && item->ItemType != EQ::item::ItemTypeAlcohol) { LogDebug("Error: unknown item->Click.Type ([{}])", item->Click.Type); } @@ -8733,15 +8949,15 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app) /* //This is food/drink - consume it - if (item->ItemType == EQEmu::item::ItemTypeFood && m_pp.hunger_level < 5000) + if (item->ItemType == EQ::item::ItemTypeFood && m_pp.hunger_level < 5000) { Consume(item, item->ItemType, slot_id, false); } - else if (item->ItemType == EQEmu::item::ItemTypeDrink && m_pp.thirst_level < 5000) + else if (item->ItemType == EQ::item::ItemTypeDrink && m_pp.thirst_level < 5000) { Consume(item, item->ItemType, slot_id, false); } - else if (item->ItemType == EQEmu::item::ItemTypeAlcohol) + else if (item->ItemType == EQ::item::ItemTypeAlcohol) { #if EQDEBUG >= 1 LogDebug("Drinking Alcohol from slot:[{}]", slot_id); @@ -8801,6 +9017,23 @@ void Client::Handle_OP_KeyRing(const EQApplicationPacket *app) KeyRingList(); } +void Client::Handle_OP_KickPlayers(const EQApplicationPacket *app) +{ + auto buf = reinterpret_cast(app->pBuffer); + if (buf->kick_expedition) + { + auto expedition = GetExpedition(); + if (expedition) + { + expedition->DzKickPlayers(this); + } + } + else if (buf->kick_task) + { + // todo: shared tasks + } +} + void Client::Handle_OP_LDoNButton(const EQApplicationPacket *app) { if (app->size < sizeof(bool)) @@ -8846,14 +9079,14 @@ void Client::Handle_OP_LDoNDisarmTraps(const EQApplicationPacket *app) Mob * target = GetTarget(); if (target->IsNPC()) { - if (HasSkill(EQEmu::skills::SkillDisarmTraps)) + if (HasSkill(EQ::skills::SkillDisarmTraps)) { if (DistanceSquaredNoZ(m_Position, target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse)) { Message(Chat::Red, "%s is too far away.", target->GetCleanName()); return; } - HandleLDoNDisarm(target->CastToNPC(), GetSkill(EQEmu::skills::SkillDisarmTraps), LDoNTypeMechanical); + HandleLDoNDisarm(target->CastToNPC(), GetSkill(EQ::skills::SkillDisarmTraps), LDoNTypeMechanical); } else Message(Chat::Red, "You do not have the disarm trap skill."); @@ -8879,14 +9112,14 @@ void Client::Handle_OP_LDoNPickLock(const EQApplicationPacket *app) Mob * target = GetTarget(); if (target->IsNPC()) { - if (HasSkill(EQEmu::skills::SkillPickLock)) + if (HasSkill(EQ::skills::SkillPickLock)) { if (DistanceSquaredNoZ(m_Position, target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse)) { Message(Chat::Red, "%s is too far away.", target->GetCleanName()); return; } - HandleLDoNPickLock(target->CastToNPC(), GetSkill(EQEmu::skills::SkillPickLock), LDoNTypeMechanical); + HandleLDoNPickLock(target->CastToNPC(), GetSkill(EQ::skills::SkillPickLock), LDoNTypeMechanical); } else Message(Chat::Red, "You do not have the pick locks skill."); @@ -8898,14 +9131,14 @@ void Client::Handle_OP_LDoNSenseTraps(const EQApplicationPacket *app) Mob * target = GetTarget(); if (target->IsNPC()) { - if (HasSkill(EQEmu::skills::SkillSenseTraps)) + if (HasSkill(EQ::skills::SkillSenseTraps)) { if (DistanceSquaredNoZ(m_Position, target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse)) { Message(Chat::Red, "%s is too far away.", target->GetCleanName()); return; } - HandleLDoNSenseTraps(target->CastToNPC(), GetSkill(EQEmu::skills::SkillSenseTraps), LDoNTypeMechanical); + HandleLDoNSenseTraps(target->CastToNPC(), GetSkill(EQ::skills::SkillSenseTraps), LDoNTypeMechanical); } else Message(Chat::Red, "You do not have the sense traps skill."); @@ -8982,7 +9215,7 @@ void Client::Handle_OP_LFGCommand(const EQApplicationPacket *app) LFGFromLevel = lfg->FromLevel; LFGToLevel = lfg->ToLevel; LFGMatchFilter = lfg->MatchFilter; - strcpy(LFGComments, lfg->Comments); + strn0cpy(LFGComments, lfg->Comments, sizeof(LFGComments)); break; default: Message(0, "Error: unknown LFG value %i", lfg->value); @@ -9261,7 +9494,7 @@ void Client::Handle_OP_LoadSpellSet(const EQApplicationPacket *app) } int i; LoadSpellSet_Struct* ss = (LoadSpellSet_Struct*)app->pBuffer; - for (i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; i++) { + for (i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++) { if (ss->spell[i] != 0xFFFFFFFF) UnmemSpell(i, true); } @@ -9379,7 +9612,7 @@ void Client::Handle_OP_MemorizeSpell(const EQApplicationPacket *app) void Client::Handle_OP_Mend(const EQApplicationPacket *app) { - if (!HasSkill(EQEmu::skills::SkillMend)) + if (!HasSkill(EQ::skills::SkillMend)) return; if (!p_timers.Expired(&database, pTimerMend, false)) { @@ -9390,7 +9623,7 @@ void Client::Handle_OP_Mend(const EQApplicationPacket *app) int mendhp = GetMaxHP() / 4; int currenthp = GetHP(); - if (zone->random.Int(0, 199) < (int)GetSkill(EQEmu::skills::SkillMend)) { + if (zone->random.Int(0, 199) < (int)GetSkill(EQ::skills::SkillMend)) { int criticalchance = spellbonuses.CriticalMend + itembonuses.CriticalMend + aabonuses.CriticalMend; @@ -9409,7 +9642,7 @@ void Client::Handle_OP_Mend(const EQApplicationPacket *app) 0 skill - 25% chance to worsen 20 skill - 23% chance to worsen 50 skill - 16% chance to worsen */ - if ((GetSkill(EQEmu::skills::SkillMend) <= 75) && (zone->random.Int(GetSkill(EQEmu::skills::SkillMend), 100) < 75) && (zone->random.Int(1, 3) == 1)) + if ((GetSkill(EQ::skills::SkillMend) <= 75) && (zone->random.Int(GetSkill(EQ::skills::SkillMend), 100) < 75) && (zone->random.Int(1, 3) == 1)) { SetHP(currenthp > mendhp ? (GetHP() - mendhp) : 1); SendHPUpdate(); @@ -9419,7 +9652,7 @@ void Client::Handle_OP_Mend(const EQApplicationPacket *app) MessageString(Chat::LightBlue, MEND_FAIL); } - CheckIncreaseSkill(EQEmu::skills::SkillMend, nullptr, 10); + CheckIncreaseSkill(EQ::skills::SkillMend, nullptr, 10); return; } @@ -9468,7 +9701,7 @@ void Client::Handle_OP_MercenaryCommand(const EQApplicationPacket *app) //check to see if selected option is a valid stance slot (option is the slot the stance is in, not the actual stance) if (option >= 0 && option < numStances) { - merc->SetStance((EQEmu::constants::StanceType)mercTemplate->Stances[option]); + merc->SetStance((EQ::constants::StanceType)mercTemplate->Stances[option]); GetMercInfo().Stance = mercTemplate->Stances[option]; Log(Logs::General, Logs::Mercenaries, "Set Stance: %u for %s (%s)", merc->GetStance(), merc->GetName(), GetName()); @@ -9812,19 +10045,17 @@ void Client::Handle_OP_MoveItem(const EQApplicationPacket *app) MoveItem_Struct* mi = (MoveItem_Struct*)app->pBuffer; if (spellend_timer.Enabled() && casting_spell_id && !IsBardSong(casting_spell_id)) { - if (mi->from_slot != mi->to_slot && (mi->from_slot <= EQEmu::invslot::GENERAL_END || mi->from_slot > 39) && IsValidSlot(mi->from_slot) && IsValidSlot(mi->to_slot)) + if (mi->from_slot != mi->to_slot && (mi->from_slot <= EQ::invslot::GENERAL_END || mi->from_slot > 39) && IsValidSlot(mi->from_slot) && IsValidSlot(mi->to_slot)) { - char *detect = nullptr; - const EQEmu::ItemInstance *itm_from = GetInv().GetItem(mi->from_slot); - const EQEmu::ItemInstance *itm_to = GetInv().GetItem(mi->to_slot); - MakeAnyLenString(&detect, "Player issued a move item from %u(item id %u) to %u(item id %u) while casting %u.", + const EQ::ItemInstance *itm_from = GetInv().GetItem(mi->from_slot); + const EQ::ItemInstance *itm_to = GetInv().GetItem(mi->to_slot); + auto detect = fmt::format("Player issued a move item from {}(item id {}) to {}(item id {}) while casting {}.", mi->from_slot, itm_from ? itm_from->GetID() : 0, mi->to_slot, itm_to ? itm_to->GetID() : 0, casting_spell_id); database.SetMQDetectionFlag(AccountName(), GetName(), detect, zone->GetShortName()); - safe_delete_array(detect); Kick("Inventory desync"); // Kick client to prevent client and server from getting out-of-sync inventory slots return; } @@ -9833,8 +10064,8 @@ void Client::Handle_OP_MoveItem(const EQApplicationPacket *app) // Illegal bagslot usage checks. Currently, user only receives a message if this check is triggered. bool mi_hack = false; - if (mi->from_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN && mi->from_slot <= EQEmu::invbag::CURSOR_BAG_END) { - if (mi->from_slot >= EQEmu::invbag::CURSOR_BAG_BEGIN) { mi_hack = true; } + if (mi->from_slot >= EQ::invbag::GENERAL_BAGS_BEGIN && mi->from_slot <= EQ::invbag::CURSOR_BAG_END) { + if (mi->from_slot >= EQ::invbag::CURSOR_BAG_BEGIN) { mi_hack = true; } else { int16 from_parent = m_inv.CalcSlotId(mi->from_slot); if (!m_inv[from_parent]) { mi_hack = true; } @@ -9843,8 +10074,8 @@ void Client::Handle_OP_MoveItem(const EQApplicationPacket *app) } } - if (mi->to_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN && mi->to_slot <= EQEmu::invbag::CURSOR_BAG_END) { - if (mi->to_slot >= EQEmu::invbag::CURSOR_BAG_BEGIN) { mi_hack = true; } + if (mi->to_slot >= EQ::invbag::GENERAL_BAGS_BEGIN && mi->to_slot <= EQ::invbag::CURSOR_BAG_END) { + if (mi->to_slot >= EQ::invbag::CURSOR_BAG_BEGIN) { mi_hack = true; } else { int16 to_parent = m_inv.CalcSlotId(mi->to_slot); if (!m_inv[to_parent]) { mi_hack = true; } @@ -10042,6 +10273,11 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) mypet->SetPetRegroup(false); SetPetCommandState(PET_BUTTON_REGROUP, 0); } + + // fix GUI sit button to be unpressed and stop sitting regen + SetPetCommandState(PET_BUTTON_SIT, 0); + mypet->SetAppearance(eaStanding); + zone->AddAggroMob(); // classic acts like qattack int hate = 1; @@ -10083,6 +10319,11 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) mypet->SetPetRegroup(false); SetPetCommandState(PET_BUTTON_REGROUP, 0); } + + // fix GUI sit button to be unpressed and stop sitting regen + SetPetCommandState(PET_BUTTON_SIT, 0); + mypet->SetAppearance(eaStanding); + zone->AddAggroMob(); mypet->AddToHateList(GetTarget(), 1, 0, true, false, false, SPELL_UNKNOWN, true); MessageString(Chat::PetResponse, PET_ATTACKING, mypet->GetCleanName(), GetTarget()->GetCleanName()); @@ -10143,6 +10384,11 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if ((mypet->GetPetType() == petAnimation && aabonuses.PetCommands[PetCommand]) || mypet->GetPetType() != petAnimation) { if (mypet->IsNPC()) { + + // Set Sit button to unpressed - send stand anim/end hpregen + SetPetCommandState(PET_BUTTON_SIT, 0); + mypet->SendAppearancePacket(AT_Anim, ANIM_STAND); + mypet->SayString(this, Chat::PetResponse, PET_GUARDINGLIFE); mypet->SetPetOrder(SPO_Guard); mypet->CastToNPC()->SaveGuardSpot(mypet->GetPosition()); @@ -10162,7 +10408,11 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if ((mypet->GetPetType() == petAnimation && aabonuses.PetCommands[PetCommand]) || mypet->GetPetType() != petAnimation) { mypet->SayString(this, Chat::PetResponse, PET_FOLLOWING); mypet->SetPetOrder(SPO_Follow); + + // fix GUI sit button to be unpressed - send stand anim/end hpregen + SetPetCommandState(PET_BUTTON_SIT, 0); mypet->SendAppearancePacket(AT_Anim, ANIM_STAND); + if (mypet->IsPetStop()) { mypet->SetPetStop(false); SetPetCommandState(PET_BUTTON_STOP, 0); @@ -10205,7 +10455,11 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if ((mypet->GetPetType() == petAnimation && aabonuses.PetCommands[PetCommand]) || mypet->GetPetType() != petAnimation) { mypet->SayString(this, Chat::PetResponse, PET_GUARDME_STRING); mypet->SetPetOrder(SPO_Follow); + + // Set Sit button to unpressed - send stand anim/end hpregen + SetPetCommandState(PET_BUTTON_SIT, 0); mypet->SendAppearancePacket(AT_Anim, ANIM_STAND); + if (mypet->IsPetStop()) { mypet->SetPetStop(false); SetPetCommandState(PET_BUTTON_STOP, 0); @@ -10240,6 +10494,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if ((mypet->GetPetType() == petAnimation && aabonuses.PetCommands[PetCommand]) || mypet->GetPetType() != petAnimation) { mypet->SayString(this, Chat::PetResponse, PET_SIT_STRING); + SetPetCommandState(PET_BUTTON_SIT, 0); mypet->SetPetOrder(SPO_Follow); mypet->SendAppearancePacket(AT_Anim, ANIM_STAND); } @@ -10250,6 +10505,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if ((mypet->GetPetType() == petAnimation && aabonuses.PetCommands[PetCommand]) || mypet->GetPetType() != petAnimation) { mypet->SayString(this, Chat::PetResponse, PET_SIT_STRING); + SetPetCommandState(PET_BUTTON_SIT, 1); mypet->SetPetOrder(SPO_Sit); mypet->SetRunAnimSpeed(0); if (!mypet->UseBardSpellLogic()) //maybe we can have a bard pet @@ -10262,16 +10518,16 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if (aabonuses.PetCommands[PetCommand] && mypet->IsNPC()) { if (mypet->IsHeld()) { - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_HOLD_SET_OFF); mypet->SetHeld(false); } else { - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_HOLD_SET_ON); - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) mypet->SayString(this, Chat::PetResponse, PET_NOW_HOLDING); else mypet->SayString(this, Chat::PetResponse, PET_ON_HOLD); @@ -10285,10 +10541,10 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) } case PET_HOLD_ON: { if (aabonuses.PetCommands[PetCommand] && mypet->IsNPC() && !mypet->IsHeld()) { - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_HOLD_SET_ON); - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) mypet->SayString(this, Chat::PetResponse, PET_NOW_HOLDING); else mypet->SayString(this, Chat::PetResponse, PET_ON_HOLD); @@ -10300,7 +10556,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) } case PET_HOLD_OFF: { if (aabonuses.PetCommands[PetCommand] && mypet->IsNPC() && mypet->IsHeld()) { - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_HOLD_SET_OFF); mypet->SetHeld(false); } @@ -10310,13 +10566,13 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) if (aabonuses.PetCommands[PetCommand] && mypet->IsNPC()) { if (mypet->IsGHeld()) { - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) MessageString(Chat::PetResponse, PET_OFF_GHOLD); mypet->SetGHeld(false); } else { - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) { MessageString(Chat::PetResponse, PET_ON_GHOLD); mypet->SayString(this, Chat::PetResponse, PET_GHOLD_ON_MSG); } else { @@ -10331,7 +10587,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) } case PET_GHOLD_ON: { if (aabonuses.PetCommands[PetCommand] && mypet->IsNPC()) { - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) { + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) { MessageString(Chat::PetResponse, PET_ON_GHOLD); mypet->SayString(this, Chat::PetResponse, PET_GHOLD_ON_MSG); } else { @@ -10345,7 +10601,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) } case PET_GHOLD_OFF: { if (aabonuses.PetCommands[PetCommand] && mypet->IsNPC() && mypet->IsGHeld()) { - if (m_ClientVersionBit & EQEmu::versions::maskUFAndLater) + if (m_ClientVersionBit & EQ::versions::maskUFAndLater) MessageString(Chat::PetResponse, PET_OFF_GHOLD); mypet->SetGHeld(false); } @@ -10357,13 +10613,13 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) break; if (mypet->IsNoCast()) { MessageString(Chat::PetResponse, PET_CASTING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_SPELLHOLD_SET_OFF); mypet->SetNoCast(false); } else { MessageString(Chat::PetResponse, PET_NOT_CASTING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_SPELLHOLD_SET_ON); mypet->SetNoCast(true); } @@ -10376,7 +10632,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) break; if (!mypet->IsNoCast()) { MessageString(Chat::PetResponse, PET_NOT_CASTING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_SPELLHOLD_SET_ON); mypet->SetNoCast(true); } @@ -10389,7 +10645,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) break; if (mypet->IsNoCast()) { MessageString(Chat::PetResponse, PET_CASTING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_SPELLHOLD_SET_OFF); mypet->SetNoCast(false); } @@ -10402,13 +10658,13 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) break; if (mypet->IsFocused()) { MessageString(Chat::PetResponse, PET_NOT_FOCUSING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_FOCUS_SET_OFF); mypet->SetFocused(false); } else { MessageString(Chat::PetResponse, PET_NOW_FOCUSING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_FOCUS_SET_ON); mypet->SetFocused(true); } @@ -10421,7 +10677,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) break; if (!mypet->IsFocused()) { MessageString(Chat::PetResponse, PET_NOW_FOCUSING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_FOCUS_SET_ON); mypet->SetFocused(true); } @@ -10434,7 +10690,7 @@ void Client::Handle_OP_PetCommands(const EQApplicationPacket *app) break; if (mypet->IsFocused()) { MessageString(Chat::PetResponse, PET_NOT_FOCUSING); - if (m_ClientVersionBit & EQEmu::versions::maskSoDAndLater) + if (m_ClientVersionBit & EQ::versions::maskSoDAndLater) MessageString(Chat::PetResponse, PET_FOCUS_SET_OFF); mypet->SetFocused(false); } @@ -10723,7 +10979,7 @@ void Client::Handle_OP_PickPocket(const EQApplicationPacket *app) DumpPacket(app); } - if (!HasSkill(EQEmu::skills::SkillPickPockets)) + if (!HasSkill(EQ::skills::SkillPickPockets)) { return; } @@ -10748,7 +11004,7 @@ void Client::Handle_OP_PickPocket(const EQApplicationPacket *app) pick_out->coin = 0; pick_out->from = victim->GetID(); pick_out->to = GetID(); - pick_out->myskill = GetSkill(EQEmu::skills::SkillPickPockets); + pick_out->myskill = GetSkill(EQ::skills::SkillPickPockets); pick_out->type = 0; //if we do not send this packet the client will lock up and require the player to relog. QueuePacket(outapp); @@ -10761,7 +11017,7 @@ void Client::Handle_OP_PickPocket(const EQApplicationPacket *app) pick_out->coin = 0; pick_out->from = victim->GetID(); pick_out->to = GetID(); - pick_out->myskill = GetSkill(EQEmu::skills::SkillPickPockets); + pick_out->myskill = GetSkill(EQ::skills::SkillPickPockets); pick_out->type = 0; //if we do not send this packet the client will lock up and require the player to relog. QueuePacket(outapp); @@ -10777,7 +11033,7 @@ void Client::Handle_OP_PickPocket(const EQApplicationPacket *app) pick_out->coin = 0; pick_out->from = victim->GetID(); pick_out->to = GetID(); - pick_out->myskill = GetSkill(EQEmu::skills::SkillPickPockets); + pick_out->myskill = GetSkill(EQ::skills::SkillPickPockets); pick_out->type = 0; //if we do not send this packet the client will lock up and require the player to relog. QueuePacket(outapp); @@ -10811,9 +11067,9 @@ void Client::Handle_OP_PopupResponse(const EQApplicationPacket *app) return; break; - case EQEmu::popupresponse::MOB_INFO_DISMISS: - this->SetDisplayMobInfoWindow(false); - this->Message(Chat::Yellow, "[DevTools] Window snoozed in this zone..."); + case EQ::popupresponse::MOB_INFO_DISMISS: + SetDisplayMobInfoWindow(false); + Message(Chat::Yellow, "[DevTools] Window snoozed in this zone..."); break; default: break; @@ -10839,13 +11095,13 @@ void Client::Handle_OP_PotionBelt(const EQApplicationPacket *app) } MovePotionToBelt_Struct *mptbs = (MovePotionToBelt_Struct*)app->pBuffer; - if (!EQEmu::ValueWithin(mptbs->SlotNumber, 0U, 3U)) { + if (!EQ::ValueWithin(mptbs->SlotNumber, 0U, 3U)) { LogDebug("Client::Handle_OP_PotionBelt mptbs->SlotNumber out of range"); return; } if (mptbs->Action == 0) { - const EQEmu::ItemData *BaseItem = database.GetItem(mptbs->ItemID); + const EQ::ItemData *BaseItem = database.GetItem(mptbs->ItemID); if (BaseItem) { m_pp.potionbelt.Items[mptbs->SlotNumber].ID = BaseItem->ID; m_pp.potionbelt.Items[mptbs->SlotNumber].Icon = BaseItem->Icon; @@ -11006,30 +11262,30 @@ void Client::Handle_OP_QueryUCSServerStatus(const EQApplicationPacket *app) std::string buffer; std::string MailKey = database.GetMailKey(CharacterID(), true); - EQEmu::versions::UCSVersion ConnectionType = EQEmu::versions::ucsUnknown; + EQ::versions::UCSVersion ConnectionType = EQ::versions::ucsUnknown; // chat server packet switch (ClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: - ConnectionType = EQEmu::versions::ucsTitaniumChat; + case EQ::versions::ClientVersion::Titanium: + ConnectionType = EQ::versions::ucsTitaniumChat; break; - case EQEmu::versions::ClientVersion::SoF: - ConnectionType = EQEmu::versions::ucsSoFCombined; + case EQ::versions::ClientVersion::SoF: + ConnectionType = EQ::versions::ucsSoFCombined; break; - case EQEmu::versions::ClientVersion::SoD: - ConnectionType = EQEmu::versions::ucsSoDCombined; + case EQ::versions::ClientVersion::SoD: + ConnectionType = EQ::versions::ucsSoDCombined; break; - case EQEmu::versions::ClientVersion::UF: - ConnectionType = EQEmu::versions::ucsUFCombined; + case EQ::versions::ClientVersion::UF: + ConnectionType = EQ::versions::ucsUFCombined; break; - case EQEmu::versions::ClientVersion::RoF: - ConnectionType = EQEmu::versions::ucsRoFCombined; + case EQ::versions::ClientVersion::RoF: + ConnectionType = EQ::versions::ucsRoFCombined; break; - case EQEmu::versions::ClientVersion::RoF2: - ConnectionType = EQEmu::versions::ucsRoF2Combined; + case EQ::versions::ClientVersion::RoF2: + ConnectionType = EQ::versions::ucsRoF2Combined; break; default: - ConnectionType = EQEmu::versions::ucsUnknown; + ConnectionType = EQ::versions::ucsUnknown; break; } @@ -11051,8 +11307,8 @@ void Client::Handle_OP_QueryUCSServerStatus(const EQApplicationPacket *app) // mail server packet switch (ClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: - ConnectionType = EQEmu::versions::ucsTitaniumMail; + case EQ::versions::ClientVersion::Titanium: + ConnectionType = EQ::versions::ucsTitaniumMail; break; default: // retain value from previous switch @@ -11738,7 +11994,7 @@ void Client::Handle_OP_ReadBook(const EQApplicationPacket *app) } BookRequest_Struct* book = (BookRequest_Struct*)app->pBuffer; ReadBook(book); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { EQApplicationPacket EndOfBook(OP_FinishWindow, 0); QueuePacket(&EndOfBook); @@ -11850,6 +12106,7 @@ void Client::Handle_OP_RecipesFavorite(const EQApplicationPacket *app) ) OR (tr.must_learn & 0x3 = 0) ) + %s GROUP BY tr.id HAVING @@ -11862,10 +12119,12 @@ void Client::Handle_OP_RecipesFavorite(const EQApplicationPacket *app) ) ) > 0 AND SUM(tre.componentcount) <= %u + LIMIT 100 ), favoriteIDs.c_str(), + ContentFilterCriteria::apply().c_str(), containers.c_str(), combineObjectSlots ); @@ -11948,6 +12207,7 @@ void Client::Handle_OP_RecipesSearch(const EQApplicationPacket *app) ) OR (tr.must_learn & 0x3 = 0) ) + {} GROUP BY tr.id HAVING @@ -11960,12 +12220,14 @@ void Client::Handle_OP_RecipesSearch(const EQApplicationPacket *app) ) ) > 0 AND SUM(tre.componentcount) <= {} + LIMIT 200 ), search_clause, p_recipes_search_struct->mintrivial, p_recipes_search_struct->maxtrivial, + ContentFilterCriteria::apply(), containers_where_clause, combine_object_slots ); @@ -12245,8 +12507,8 @@ void Client::Handle_OP_Sacrifice(const EQApplicationPacket *app) void Client::Handle_OP_SafeFallSuccess(const EQApplicationPacket *app) // bit of a misnomer, sent whenever safe fall is used (success of fail) { - if (HasSkill(EQEmu::skills::SkillSafeFall)) //this should only get called if the client has safe fall, but just in case... - CheckIncreaseSkill(EQEmu::skills::SkillSafeFall, nullptr); //check for skill up + if (HasSkill(EQ::skills::SkillSafeFall)) //this should only get called if the client has safe fall, but just in case... + CheckIncreaseSkill(EQ::skills::SkillSafeFall, nullptr); //check for skill up } void Client::Handle_OP_SafePoint(const EQApplicationPacket *app) @@ -12283,19 +12545,19 @@ void Client::Handle_OP_SelectTribute(const EQApplicationPacket *app) void Client::Handle_OP_SenseHeading(const EQApplicationPacket *app) { - if (!HasSkill(EQEmu::skills::SkillSenseHeading)) + if (!HasSkill(EQ::skills::SkillSenseHeading)) return; int chancemod = 0; - CheckIncreaseSkill(EQEmu::skills::SkillSenseHeading, nullptr, chancemod); + CheckIncreaseSkill(EQ::skills::SkillSenseHeading, nullptr, chancemod); return; } void Client::Handle_OP_SenseTraps(const EQApplicationPacket *app) { - if (!HasSkill(EQEmu::skills::SkillSenseTraps)) + if (!HasSkill(EQ::skills::SkillSenseTraps)) return; if (!p_timers.Expired(&database, pTimerSenseTraps, false)) { @@ -12303,7 +12565,7 @@ void Client::Handle_OP_SenseTraps(const EQApplicationPacket *app) return; } - int reuse = SenseTrapsReuseTime - GetSkillReuseTime(EQEmu::skills::SkillSenseTraps); + int reuse = SenseTrapsReuseTime - GetSkillReuseTime(EQ::skills::SkillSenseTraps); if (reuse < 1) reuse = 1; @@ -12313,10 +12575,10 @@ void Client::Handle_OP_SenseTraps(const EQApplicationPacket *app) float trap_curdist = 0; Trap* trap = entity_list.FindNearbyTrap(this, 800, trap_curdist); - CheckIncreaseSkill(EQEmu::skills::SkillSenseTraps, nullptr); + CheckIncreaseSkill(EQ::skills::SkillSenseTraps, nullptr); if (trap && trap->skill > 0) { - int uskill = GetSkill(EQEmu::skills::SkillSenseTraps); + int uskill = GetSkill(EQ::skills::SkillSenseTraps); if ((zone->random.Int(0, 99) + uskill) >= (zone->random.Int(0, 99) + trap->skill*0.75)) { auto diff = trap->m_Position - glm::vec3(GetPosition()); @@ -12415,8 +12677,8 @@ void Client::Handle_OP_SetServerFilter(const EQApplicationPacket *app) void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) { // if the character has a start city, don't let them use the command - if (m_pp.binds[4].zoneId != 0 && m_pp.binds[4].zoneId != 189) { - Message(Chat::Yellow, "Your home city has already been set.", m_pp.binds[4].zoneId, content_db.GetZoneName(m_pp.binds[4].zoneId)); + if (m_pp.binds[4].zone_id != 0 && m_pp.binds[4].zone_id != 189) { + Message(Chat::Yellow, "Your home city has already been set.", m_pp.binds[4].zone_id, ZoneName(m_pp.binds[4].zone_id)); return; } @@ -12426,44 +12688,73 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) return; } - float x(0), y(0), z(0); - uint32 zoneid = 0; - uint32 startCity = (uint32)strtol((const char*)app->pBuffer, nullptr, 10); - - std::string query = StringFormat("SELECT zone_id, bind_id, x, y, z FROM start_zones " - "WHERE player_class=%i AND player_deity=%i AND player_race=%i", - m_pp.class_, m_pp.deity, m_pp.race); + float x = 0.0f, y = 0.0f, z = 0.0f, heading = 0.0f; + uint32 zone_id = 0; + uint32 start_city = (uint32)strtol((const char*)app->pBuffer, nullptr, 10); + std::string query = fmt::format( + SQL( + SELECT + `zone_id`, `bind_id`, `x`, `y`, `z`, `heading` + FROM + `start_zones` + WHERE + player_class = {} + AND + player_deity = {} + AND + player_race = {} {} + ), + m_pp.class_, + m_pp.deity, + m_pp.race, + ContentFilterCriteria::apply().c_str() + ); auto results = content_db.QueryDatabase(query); if (!results.Success()) { LogError("No valid start zones found for /setstartcity"); return; } - bool validCity = false; + bool valid_city = false; for (auto row = results.begin(); row != results.end(); ++row) { if (atoi(row[1]) != 0) - zoneid = atoi(row[1]); + zone_id = atoi(row[1]); else - zoneid = atoi(row[0]); + zone_id = atoi(row[0]); - if (zoneid != startCity) + if (zone_id != start_city) continue; - validCity = true; + valid_city = true; x = atof(row[2]); y = atof(row[3]); z = atof(row[4]); + heading = atof(row[5]); } - if (validCity) { + if (valid_city) { Message(Chat::Yellow, "Your home city has been set"); - SetStartZone(startCity, x, y, z); + SetStartZone(start_city, x, y, z, heading); return; } - query = StringFormat("SELECT zone_id, bind_id FROM start_zones " - "WHERE player_class=%i AND player_deity=%i AND player_race=%i", - m_pp.class_, m_pp.deity, m_pp.race); + query = fmt::format( + SQL( + SELECT + `zone_id`, `bind_id` + FROM + `start_zones` + WHERE + player_class = {} + AND + player_deity = {} + AND + player_race = {} + ), + m_pp.class_, + m_pp.deity, + m_pp.race + ); results = content_db.QueryDatabase(query); if (!results.Success()) return; @@ -12472,13 +12763,12 @@ void Client::Handle_OP_SetStartCity(const EQApplicationPacket *app) for (auto row = results.begin(); row != results.end(); ++row) { if (atoi(row[1]) != 0) - zoneid = atoi(row[1]); + zone_id = atoi(row[1]); else - zoneid = atoi(row[0]); + zone_id = atoi(row[0]); - char* name = nullptr; - content_db.GetZoneLongName(content_db.GetZoneName(zoneid), &name); - Message(Chat::Yellow, "%d - %s", zoneid, name); + std::string zone_long_name = zone_store.GetZoneLongName(zone_id); + Message(Chat::Yellow, "%d - %s", zone_id, zone_long_name.c_str()); } } @@ -12535,13 +12825,13 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app) Shielding_Struct* shield = (Shielding_Struct*)app->pBuffer; shield_target = entity_list.GetMob(shield->target_id); bool ack = false; - EQEmu::ItemInstance* inst = GetInv().GetItem(EQEmu::invslot::slotSecondary); + EQ::ItemInstance* inst = GetInv().GetItem(EQ::invslot::slotSecondary); if (!shield_target) return; if (inst) { - const EQEmu::ItemData* shield = inst->GetItem(); - if (shield && shield->ItemType == EQEmu::item::ItemTypeShield) + const EQ::ItemData* shield = inst->GetItem(); + if (shield && shield->ItemType == EQ::item::ItemTypeShield) { for (int x = 0; x < 2; x++) { @@ -12644,7 +12934,7 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app) break; } } - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; uint32 prevcharges = 0; if (item_id == 0) { //check to see if its on the temporary table std::list tmp_merlist = zone->tmpmerchanttable[tmp->GetNPCTypeID()]; @@ -12705,7 +12995,7 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app) else charges = item->MaxCharges; - EQEmu::ItemInstance* inst = database.CreateItem(item, charges); + EQ::ItemInstance* inst = database.CreateItem(item, charges); int SinglePrice = 0; if (RuleB(Merchant, UsePriceMod)) @@ -12730,12 +13020,10 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app) if (!TakeMoneyFromPP(mpo->price)) { - char *hacker_str = nullptr; - MakeAnyLenString(&hacker_str, "Vendor Cheat: attempted to buy %i of %i: %s that cost %d cp but only has %d pp %d gp %d sp %d cp\n", + auto hacker_str = fmt::format("Vendor Cheat: attempted to buy {} of {}: {} that cost {} cp but only has {} pp {} gp {} sp {} cp", mpo->quantity, item->ID, item->Name, mpo->price, m_pp.platinum, m_pp.gold, m_pp.silver, m_pp.copper); database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName()); - safe_delete_array(hacker_str); safe_delete(outapp); safe_delete(inst); return; @@ -12748,8 +13036,8 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app) // shouldn't we be reimbursing if these two fail? //make sure we are not completely full... - if (freeslotid == EQEmu::invslot::slotCursor) { - if (m_inv.GetItem(EQEmu::invslot::slotCursor) != nullptr) { + if (freeslotid == EQ::invslot::slotCursor) { + if (m_inv.GetItem(EQ::invslot::slotCursor) != nullptr) { Message(Chat::Red, "You do not have room for any more items."); safe_delete(outapp); safe_delete(inst); @@ -12826,7 +13114,7 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app) qsaudit->items[0].item_id = item->ID; qsaudit->items[0].charges = mpo->quantity; - const EQEmu::ItemInstance* audit_inst = m_inv[freeslotid]; + const EQ::ItemInstance* audit_inst = m_inv[freeslotid]; if (audit_inst) { qsaudit->items[0].aug_1 = audit_inst->GetAugmentItemID(0); @@ -12891,8 +13179,8 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) uint32 itemid = GetItemIDAt(mp->itemslot); if (itemid == 0) return; - const EQEmu::ItemData* item = database.GetItem(itemid); - EQEmu::ItemInstance* inst = GetInv().GetItem(mp->itemslot); + const EQ::ItemData* item = database.GetItem(itemid); + EQ::ItemInstance* inst = GetInv().GetItem(mp->itemslot); if (!item || !inst) { Message(Chat::Red, "You seemed to have misplaced that item.."); return; @@ -12956,7 +13244,7 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app) int freeslot = 0; if (charges > 0 && (freeslot = zone->SaveTempItem(vendor->CastToNPC()->MerchantType, vendor->GetNPCTypeID(), itemid, charges, true)) > 0) { - EQEmu::ItemInstance* inst2 = inst->Clone(); + EQ::ItemInstance* inst2 = inst->Clone(); while (true) { if (inst2 == nullptr) @@ -13146,7 +13434,7 @@ void Client::Handle_OP_ShopRequest(const EQApplicationPacket *app) void Client::Handle_OP_Sneak(const EQApplicationPacket *app) { - if (!HasSkill(EQEmu::skills::SkillSneak) && GetSkill(EQEmu::skills::SkillSneak) == 0) { + if (!HasSkill(EQ::skills::SkillSneak) && GetSkill(EQ::skills::SkillSneak) == 0) { return; //You cannot sneak if you do not have sneak } @@ -13170,9 +13458,9 @@ void Client::Handle_OP_Sneak(const EQApplicationPacket *app) safe_delete(outapp); } else { - CheckIncreaseSkill(EQEmu::skills::SkillSneak, nullptr, 5); + CheckIncreaseSkill(EQ::skills::SkillSneak, nullptr, 5); } - float hidechance = ((GetSkill(EQEmu::skills::SkillSneak) / 300.0f) + .25) * 100; + float hidechance = ((GetSkill(EQ::skills::SkillSneak) / 300.0f) + .25) * 100; float random = zone->random.Real(0, 99); if (!was && random < hidechance) { sneaking = true; @@ -13213,14 +13501,12 @@ void Client::Handle_OP_SpawnAppearance(const EQApplicationPacket *app) if (sa->type == AT_Invis) { if (sa->parameter != 0) { - if (!HasSkill(EQEmu::skills::SkillHide) && GetSkill(EQEmu::skills::SkillHide) == 0) + if (!HasSkill(EQ::skills::SkillHide) && GetSkill(EQ::skills::SkillHide) == 0) { - if (ClientVersion() < EQEmu::versions::ClientVersion::SoF) + if (ClientVersion() < EQ::versions::ClientVersion::SoF) { - char *hack_str = nullptr; - MakeAnyLenString(&hack_str, "Player sent OP_SpawnAppearance with AT_Invis: %i", sa->parameter); + auto hack_str = fmt::format("Player sent OP_SpawnAppearance with AT_Invis: {}", sa->parameter); database.SetMQDetectionFlag(this->account_name, this->name, hack_str, zone->GetShortName()); - safe_delete_array(hack_str); } } return; @@ -13317,12 +13603,10 @@ void Client::Handle_OP_SpawnAppearance(const EQApplicationPacket *app) if (sa->parameter != 0) { - if (!HasSkill(EQEmu::skills::SkillSneak)) + if (!HasSkill(EQ::skills::SkillSneak)) { - char *hack_str = nullptr; - MakeAnyLenString(&hack_str, "Player sent OP_SpawnAppearance with AT_Sneak: %i", sa->parameter); + auto hack_str = fmt::format("Player sent OP_SpawnAppearance with AT_Sneak: {}", sa->parameter); database.SetMQDetectionFlag(this->account_name, this->name, hack_str, zone->GetShortName()); - safe_delete_array(hack_str); } return; } @@ -13331,10 +13615,8 @@ void Client::Handle_OP_SpawnAppearance(const EQApplicationPacket *app) } else if (sa->type == AT_Size) { - char *hack_str = nullptr; - MakeAnyLenString(&hack_str, "Player sent OP_SpawnAppearance with AT_Size: %i", sa->parameter); + auto hack_str = fmt::format("Player sent OP_SpawnAppearance with AT_Size: {}", sa->parameter); database.SetMQDetectionFlag(this->account_name, this->name, hack_str, zone->GetShortName()); - safe_delete_array(hack_str); } else if (sa->type == AT_Light) // client emitting light (lightstone, shiny shield) { @@ -13487,7 +13769,7 @@ void Client::Handle_OP_SwapSpell(const EQApplicationPacket *app) const SwapSpell_Struct* swapspell = (const SwapSpell_Struct*)app->pBuffer; int swapspelltemp; - const auto sbs = EQEmu::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize; + const auto sbs = EQ::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize; if (swapspell->from_slot < 0 || swapspell->from_slot >= sbs) return; if (swapspell->to_slot < 0 || swapspell->to_slot >= sbs) @@ -13674,11 +13956,9 @@ void Client::Handle_OP_TargetCommand(const EQApplicationPacket *app) else if (GetTarget()->GetBodyType() == BT_NoTarget2 || GetTarget()->GetBodyType() == BT_Special || GetTarget()->GetBodyType() == BT_NoTarget) { - char *hacker_str = nullptr; - MakeAnyLenString(&hacker_str, "%s attempting to target something untargetable, %s bodytype: %i\n", + auto hacker_str = fmt::format("{} attempting to target something untargetable, {} bodytype: {}", GetName(), GetTarget()->GetName(), (int)GetTarget()->GetBodyType()); database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName()); - safe_delete_array(hacker_str); SetTarget((Mob*)nullptr); return; } @@ -13698,13 +13978,15 @@ void Client::Handle_OP_TargetCommand(const EQApplicationPacket *app) { if (DistanceSquared(m_Position, GetTarget()->GetPosition()) > (zone->newzone_data.maxclip*zone->newzone_data.maxclip)) { - char *hacker_str = nullptr; - MakeAnyLenString(&hacker_str, "%s attempting to target something beyond the clip plane of %.2f units," - " from (%.2f, %.2f, %.2f) to %s (%.2f, %.2f, %.2f)", GetName(), - (zone->newzone_data.maxclip*zone->newzone_data.maxclip), - GetX(), GetY(), GetZ(), GetTarget()->GetName(), GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ()); + auto hacker_str = fmt::format( + "{} attempting to target something beyond the clip plane of {:.2f} " + "units, from ({:.2f}, {:.2f}, {:.2f}) to {} ({:.2f}, {:.2f}, " + "{:.2f})", + GetName(), + (zone->newzone_data.maxclip * zone->newzone_data.maxclip), GetX(), + GetY(), GetZ(), GetTarget()->GetName(), GetTarget()->GetX(), + GetTarget()->GetY(), GetTarget()->GetZ()); database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName()); - safe_delete_array(hacker_str); SetTarget(nullptr); return; } @@ -13712,13 +13994,13 @@ void Client::Handle_OP_TargetCommand(const EQApplicationPacket *app) } else if (DistanceSquared(m_Position, GetTarget()->GetPosition()) > (zone->newzone_data.maxclip*zone->newzone_data.maxclip)) { - char *hacker_str = nullptr; - MakeAnyLenString(&hacker_str, "%s attempting to target something beyond the clip plane of %.2f units," - " from (%.2f, %.2f, %.2f) to %s (%.2f, %.2f, %.2f)", GetName(), - (zone->newzone_data.maxclip*zone->newzone_data.maxclip), - GetX(), GetY(), GetZ(), GetTarget()->GetName(), GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ()); + auto hacker_str = + fmt::format("{} attempting to target something beyond the clip plane of {:.2f} " + "units, from ({:.2f}, {:.2f}, {:.2f}) to {} ({:.2f}, {:.2f}, {:.2f})", + GetName(), (zone->newzone_data.maxclip * zone->newzone_data.maxclip), + GetX(), GetY(), GetZ(), GetTarget()->GetName(), GetTarget()->GetX(), + GetTarget()->GetY(), GetTarget()->GetZ()); database.SetMQDetectionFlag(AccountName(), GetName(), hacker_str, zone->GetShortName()); - safe_delete_array(hacker_str); SetTarget(nullptr); return; } @@ -13744,8 +14026,8 @@ void Client::Handle_OP_TaskHistoryRequest(const EQApplicationPacket *app) } TaskHistoryRequest_Struct *ths = (TaskHistoryRequest_Struct*)app->pBuffer; - if (RuleB(TaskSystem, EnableTaskSystem) && taskstate) - taskstate->SendTaskHistory(this, ths->TaskIndex); + if (RuleB(TaskSystem, EnableTaskSystem) && task_state) + task_state->SendTaskHistory(this, ths->TaskIndex); } void Client::Handle_OP_Taunt(const EQApplicationPacket *app) @@ -13789,10 +14071,10 @@ void Client::Handle_OP_Track(const EQApplicationPacket *app) if (GetClass() != RANGER && GetClass() != DRUID && GetClass() != BARD) return; - if (GetSkill(EQEmu::skills::SkillTracking) == 0) - SetSkill(EQEmu::skills::SkillTracking, 1); + if (GetSkill(EQ::skills::SkillTracking) == 0) + SetSkill(EQ::skills::SkillTracking, 1); else - CheckIncreaseSkill(EQEmu::skills::SkillTracking, nullptr, 15); + CheckIncreaseSkill(EQ::skills::SkillTracking, nullptr, 15); if (!entity_list.MakeTrackPacket(this)) LogError("Unable to generate OP_Track packet requested by client"); @@ -14077,7 +14359,7 @@ void Client::Handle_OP_Trader(const EQApplicationPacket *app) TradeItemsValid = false; break; } - const EQEmu::ItemData *Item = database.GetItem(gis->Items[i]); + const EQ::ItemData *Item = database.GetItem(gis->Items[i]); if (!Item) { Message(Chat::Red, "Unexpected error. Unable to start trader mode"); @@ -14117,7 +14399,7 @@ void Client::Handle_OP_Trader(const EQApplicationPacket *app) this->Trader_StartTrader(); // This refreshes the Trader window to display the End Trader button - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { auto outapp = new EQApplicationPacket(OP_Trader, sizeof(TraderStatus_Struct)); TraderStatus_Struct* tss = (TraderStatus_Struct*)outapp->pBuffer; @@ -14208,12 +14490,19 @@ void Client::Handle_OP_TradeRequest(const EQApplicationPacket *app) // Client requesting a trade session from an npc/client // Trade session not started until OP_TradeRequestAck is sent - CommonBreakInvisible(); - - // Pass trade request on to recipient TradeRequest_Struct* msg = (TradeRequest_Struct*)app->pBuffer; Mob* tradee = entity_list.GetMob(msg->to_mob_id); + // If the tradee is an untargettable mob - ignore + // Helps in cases where servers use invisible_man, body type 11 for quests + // and the client opens a trade by mistake. + if (tradee && (tradee->GetBodyType() == 11)) { + return; + } + + CommonBreakInvisible(); + + // Pass trade request on to recipient if (tradee && tradee->IsClient()) { tradee->CastToClient()->QueuePacket(app); } @@ -14613,7 +14902,7 @@ void Client::Handle_OP_WearChange(const EQApplicationPacket *app) return; // Hero Forge ID needs to be fixed here as RoF2 appears to send an incorrect value. - if (wc->hero_forge_model != 0 && wc->wear_slot_id >= 0 && wc->wear_slot_id < EQEmu::textures::weaponPrimary) + if (wc->hero_forge_model != 0 && wc->wear_slot_id >= 0 && wc->wear_slot_id < EQ::textures::weaponPrimary) wc->hero_forge_model = GetHerosForgeModel(wc->wear_slot_id); // we could maybe ignore this and just send our own from moveitem diff --git a/zone/client_packet.h b/zone/client_packet.h index 9605dc8cf..3951a1761 100644 --- a/zone/client_packet.h +++ b/zone/client_packet.h @@ -101,6 +101,15 @@ void Handle_OP_DuelResponse2(const EQApplicationPacket *app); void Handle_OP_DumpName(const EQApplicationPacket *app); void Handle_OP_Dye(const EQApplicationPacket *app); + void Handle_OP_DzAddPlayer(const EQApplicationPacket *app); + void Handle_OP_DzChooseZoneReply(const EQApplicationPacket *app); + void Handle_OP_DzExpeditionInviteResponse(const EQApplicationPacket *app); + void Handle_OP_DzListTimers(const EQApplicationPacket *app); + void Handle_OP_DzMakeLeader(const EQApplicationPacket *app); + void Handle_OP_DzPlayerList(const EQApplicationPacket *app); + void Handle_OP_DzRemovePlayer(const EQApplicationPacket *app); + void Handle_OP_DzSwapPlayer(const EQApplicationPacket *app); + void Handle_OP_DzQuit(const EQApplicationPacket *app); void Handle_OP_Emote(const EQApplicationPacket *app); void Handle_OP_EndLootRequest(const EQApplicationPacket *app); void Handle_OP_EnvDamage(const EQApplicationPacket *app); @@ -174,6 +183,7 @@ void Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app); void Handle_OP_Jump(const EQApplicationPacket *app); void Handle_OP_KeyRing(const EQApplicationPacket *app); + void Handle_OP_KickPlayers(const EQApplicationPacket *app); void Handle_OP_LDoNButton(const EQApplicationPacket *app); void Handle_OP_LDoNDisarmTraps(const EQApplicationPacket *app); void Handle_OP_LDoNInspect(const EQApplicationPacket *app); diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 9b7a0ecce..9c2175b27 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -44,6 +44,7 @@ #include "../common/spdat.h" #include "../common/string_util.h" #include "event_codes.h" +#include "expedition.h" #include "guild_mgr.h" #include "map.h" #include "petitions.h" @@ -53,6 +54,7 @@ #include "worldserver.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" extern QueryServ* QServ; extern Zone* zone; @@ -112,7 +114,7 @@ bool Client::Process() { HandleRespawnFromHover(0); } - if (IsTracking() && (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) && TrackingTimer.Check()) + if (IsTracking() && (ClientVersion() >= EQ::versions::ClientVersion::SoD) && TrackingTimer.Check()) DoTracking(); // SendHPUpdate calls hpupdate_timer.Start so it can delay this timer, so lets not reset with the check @@ -129,9 +131,9 @@ bool Client::Process() { CheckManaEndUpdate(); if (dead && dead_timer.Check()) { - database.MoveCharacterToZone(GetName(), content_db.GetZoneName(m_pp.binds[0].zoneId)); + database.MoveCharacterToZone(GetName(), m_pp.binds[0].zone_id); - m_pp.zone_id = m_pp.binds[0].zoneId; + m_pp.zone_id = m_pp.binds[0].zone_id; m_pp.zoneInstance = m_pp.binds[0].instance_id; m_pp.x = m_pp.binds[0].x; m_pp.y = m_pp.binds[0].y; @@ -156,8 +158,14 @@ bool Client::Process() { CalcItemScale(); } - if (TaskPeriodic_Timer.Check() && taskstate) - taskstate->TaskPeriodicChecks(this); + if (TaskPeriodic_Timer.Check() && task_state) + task_state->TaskPeriodicChecks(this); + + if (dynamiczone_removal_timer.Check() && zone && zone->GetInstanceID() != 0) + { + dynamiczone_removal_timer.Disable(); + GoToDzSafeReturnOrBind(zone->GetDynamicZone()); + } if (linkdead_timer.Check()) { LeaveGroup(); @@ -171,6 +179,13 @@ bool Client::Process() { if (myraid) { myraid->MemberZoned(this); } + + Expedition* expedition = GetExpedition(); + if (expedition) + { + expedition->SetMemberStatus(this, DynamicZoneMemberStatus::Offline); + } + return false; //delete client } @@ -256,9 +271,9 @@ bool Client::Process() { * Used in aggro checks */ if (mob_close_scan_timer.Check()) { - entity_list.ScanCloseMobs(close_mobs, this); + entity_list.ScanCloseMobs(close_mobs, this, is_client_moving); } - + bool may_use_attacks = false; /* Things which prevent us from attacking: @@ -286,10 +301,10 @@ bool Client::Process() { } if (AutoFireEnabled()) { - EQEmu::ItemInstance *ranged = GetInv().GetItem(EQEmu::invslot::slotRange); + EQ::ItemInstance *ranged = GetInv().GetItem(EQ::invslot::slotRange); if (ranged) { - if (ranged->GetItem() && ranged->GetItem()->ItemType == EQEmu::item::ItemTypeBow) { + if (ranged->GetItem() && ranged->GetItem()->ItemType == EQ::item::ItemTypeBow) { if (ranged_timer.Check(false)) { if (GetTarget() && (GetTarget()->IsNPC() || GetTarget()->IsClient())) { if (GetTarget()->InFrontMob(this, GetTarget()->GetX(), GetTarget()->GetY())) { @@ -309,7 +324,7 @@ bool Client::Process() { ranged_timer.Start(); } } - else if (ranged->GetItem() && (ranged->GetItem()->ItemType == EQEmu::item::ItemTypeLargeThrowing || ranged->GetItem()->ItemType == EQEmu::item::ItemTypeSmallThrowing)) { + else if (ranged->GetItem() && (ranged->GetItem()->ItemType == EQ::item::ItemTypeLargeThrowing || ranged->GetItem()->ItemType == EQ::item::ItemTypeSmallThrowing)) { if (ranged_timer.Check(false)) { if (GetTarget() && (GetTarget()->IsNPC() || GetTarget()->IsClient())) { if (GetTarget()->InFrontMob(this, GetTarget()->GetX(), GetTarget()->GetY())) { @@ -374,11 +389,11 @@ bool Client::Process() { } else if (auto_attack_target->GetHP() > -10) // -10 so we can watch people bleed in PvP { - EQEmu::ItemInstance *wpn = GetInv().GetItem(EQEmu::invslot::slotPrimary); - TryWeaponProc(wpn, auto_attack_target, EQEmu::invslot::slotPrimary); - TriggerDefensiveProcs(auto_attack_target, EQEmu::invslot::slotPrimary, false); + EQ::ItemInstance *wpn = GetInv().GetItem(EQ::invslot::slotPrimary); + TryWeaponProc(wpn, auto_attack_target, EQ::invslot::slotPrimary); + TriggerDefensiveProcs(auto_attack_target, EQ::invslot::slotPrimary, false); - DoAttackRounds(auto_attack_target, EQEmu::invslot::slotPrimary); + DoAttackRounds(auto_attack_target, EQ::invslot::slotPrimary); if (CheckAATimer(aaTimerRampage)) { entity_list.AEAttack(this, 30); } @@ -413,12 +428,12 @@ bool Client::Process() { //you can't see your target } else if (auto_attack_target->GetHP() > -10) { - CheckIncreaseSkill(EQEmu::skills::SkillDualWield, auto_attack_target, -10); + CheckIncreaseSkill(EQ::skills::SkillDualWield, auto_attack_target, -10); if (CheckDualWield()) { - EQEmu::ItemInstance *wpn = GetInv().GetItem(EQEmu::invslot::slotSecondary); - TryWeaponProc(wpn, auto_attack_target, EQEmu::invslot::slotSecondary); + EQ::ItemInstance *wpn = GetInv().GetItem(EQ::invslot::slotSecondary); + TryWeaponProc(wpn, auto_attack_target, EQ::invslot::slotSecondary); - DoAttackRounds(auto_attack_target, EQEmu::invslot::slotSecondary); + DoAttackRounds(auto_attack_target, EQ::invslot::slotSecondary); } } } @@ -559,6 +574,12 @@ bool Client::Process() { client_state = CLIENT_LINKDEAD; AI_Start(CLIENT_LD_TIMEOUT); SendAppearancePacket(AT_Linkdead, 1); + + Expedition* expedition = GetExpedition(); + if (expedition) + { + expedition->SetMemberStatus(this, DynamicZoneMemberStatus::LinkDead); + } } } @@ -690,6 +711,12 @@ void Client::OnDisconnect(bool hard_disconnect) { } } + Expedition* expedition = GetExpedition(); + if (expedition && !bZoning) + { + expedition->SetMemberStatus(this, DynamicZoneMemberStatus::Offline); + } + RemoveAllAuras(); Mob *Other = trade->With(); @@ -722,10 +749,10 @@ void Client::BulkSendInventoryItems() { // LINKDEAD TRADE ITEMS // Move trade slot items back into normal inventory..need them there now for the proceeding validity checks - for (int16 slot_id = EQEmu::invslot::TRADE_BEGIN; slot_id <= EQEmu::invslot::TRADE_END; slot_id++) { - EQEmu::ItemInstance* inst = m_inv.PopItem(slot_id); + for (int16 slot_id = EQ::invslot::TRADE_BEGIN; slot_id <= EQ::invslot::TRADE_END; slot_id++) { + EQ::ItemInstance* inst = m_inv.PopItem(slot_id); if(inst) { - bool is_arrow = (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false; + bool is_arrow = (inst->GetItem()->ItemType == EQ::item::ItemTypeArrow) ? true : false; int16 free_slot_id = m_inv.FindFreeSlot(inst->IsClassBag(), true, inst->GetItem()->Size, is_arrow); LogInventory("Incomplete Trade Transaction: Moving [{}] from slot [{}] to [{}]", inst->GetItem()->Name, slot_id, free_slot_id); PutItemInInventory(free_slot_id, *inst, false); @@ -744,12 +771,12 @@ void Client::BulkSendInventoryItems() RemoveDuplicateLore(false); MoveSlotNotAllowed(false); - EQEmu::OutBuffer ob; - EQEmu::OutBuffer::pos_type last_pos = ob.tellp(); + EQ::OutBuffer ob; + EQ::OutBuffer::pos_type last_pos = ob.tellp(); // Possessions items - for (int16 slot_id = EQEmu::invslot::POSSESSIONS_BEGIN; slot_id <= EQEmu::invslot::POSSESSIONS_END; slot_id++) { - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + for (int16 slot_id = EQ::invslot::POSSESSIONS_BEGIN; slot_id <= EQ::invslot::POSSESSIONS_END; slot_id++) { + const EQ::ItemInstance* inst = m_inv[slot_id]; if (!inst) continue; @@ -757,13 +784,13 @@ void Client::BulkSendInventoryItems() if (ob.tellp() == last_pos) LogInventory("Serialization failed on item slot [{}] during BulkSendInventoryItems. Item skipped", slot_id); - + last_pos = ob.tellp(); } // Bank items - for (int16 slot_id = EQEmu::invslot::BANK_BEGIN; slot_id <= EQEmu::invslot::BANK_END; slot_id++) { - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + for (int16 slot_id = EQ::invslot::BANK_BEGIN; slot_id <= EQ::invslot::BANK_END; slot_id++) { + const EQ::ItemInstance* inst = m_inv[slot_id]; if (!inst) continue; @@ -776,8 +803,8 @@ void Client::BulkSendInventoryItems() } // SharedBank items - for (int16 slot_id = EQEmu::invslot::SHARED_BANK_BEGIN; slot_id <= EQEmu::invslot::SHARED_BANK_END; slot_id++) { - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + for (int16 slot_id = EQ::invslot::SHARED_BANK_BEGIN; slot_id <= EQ::invslot::SHARED_BANK_END; slot_id++) { + const EQ::ItemInstance* inst = m_inv[slot_id]; if (!inst) continue; @@ -797,12 +824,12 @@ void Client::BulkSendInventoryItems() } void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { - const EQEmu::ItemData* handyitem = nullptr; + const EQ::ItemData* handyitem = nullptr; uint32 numItemSlots = 80; //The max number of items passed in the transaction. - if (m_ClientVersionBit & EQEmu::versions::maskRoFAndLater) { // RoF+ can send 200 items + if (m_ClientVersionBit & EQ::versions::maskRoFAndLater) { // RoF+ can send 200 items numItemSlots = 200; } - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; std::list merlist = zone->merchanttable[merchant_id]; std::list::const_iterator itr; Mob* merch = entity_list.GetMobByNpcTypeID(npcid); @@ -836,7 +863,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { else { cur_fac_level = GetModCharacterFactionLevel(fac); } - + if (cur_fac_level < ml.faction_required) continue; @@ -851,7 +878,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { int charges = 1; if (item->IsClassCommon()) charges = item->MaxCharges; - EQEmu::ItemInstance* inst = database.CreateItem(item, charges); + EQ::ItemInstance* inst = database.CreateItem(item, charges); if (inst) { if (RuleB(Merchant, UsePriceMod)) { inst->SetPrice((item->Price * (RuleR(Merchant, SellCostMod)) * item->SellRate * Client::CalcPriceMod(merch, false))); @@ -892,7 +919,7 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) { // charges=ml.charges; //else charges = item->MaxCharges; - EQEmu::ItemInstance* inst = database.CreateItem(item, charges); + EQ::ItemInstance* inst = database.CreateItem(item, charges); if (inst) { if (RuleB(Merchant, UsePriceMod)) { inst->SetPrice((item->Price * (RuleR(Merchant, SellCostMod)) * item->SellRate * Client::CalcPriceMod(merch, false))); @@ -1066,11 +1093,11 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app) switch(memspell->scribing) { case memSpellScribing: { // scribing spell to book - const EQEmu::ItemInstance* inst = m_inv[EQEmu::invslot::slotCursor]; + const EQ::ItemInstance* inst = m_inv[EQ::invslot::slotCursor]; if (inst && inst->IsClassCommon()) { - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if (RuleB(Character, RestrictSpellScribing) && !item->IsEquipable(GetRace(), GetClass())) { MessageString(Chat::Red, CANNOT_USE_ITEM); @@ -1080,7 +1107,7 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app) if(item && item->Scroll.Effect == (int32)(memspell->spell_id)) { ScribeSpell(memspell->spell_id, memspell->slot); - DeleteItemInInventory(EQEmu::invslot::slotCursor, 1, true); + DeleteItemInInventory(EQ::invslot::slotCursor, 1, true); } else Message(0,"Scribing spell: inst exists but item does not or spell ids do not match."); @@ -1119,7 +1146,7 @@ void Client::CancelSneakHide() // The later clients send back a OP_Hide (this has a size but data is 0) // as well as OP_SpawnAppearance with AT_Invis and one with AT_Sneak // So we don't have to handle any of those flags - if (ClientVersionBit() & EQEmu::versions::maskSoFAndEarlier) + if (ClientVersionBit() & EQ::versions::maskSoFAndEarlier) sneaking = false; } } @@ -1170,7 +1197,7 @@ void Client::OPMoveCoin(const EQApplicationPacket* app) { return; } - + // could just do a range, but this is clearer and explicit if ( @@ -1235,11 +1262,10 @@ void Client::OPMoveCoin(const EQApplicationPacket* app) NPC *banker = entity_list.GetClosestBanker(this, distance); if(!banker || distance > USE_NPC_RANGE2) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "Player tried to make use of a banker(coin move) but %s is non-existant or too far away (%u units).", - banker ? banker->GetName() : "UNKNOWN NPC", distance); + auto hacked_string = fmt::format("Player tried to make use of a banker(coin move) but " + "{} is non-existant or too far away ({} units).", + banker ? banker->GetName() : "UNKNOWN NPC", distance); database.SetMQDetectionFlag(AccountName(), GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); return; } @@ -1267,11 +1293,11 @@ void Client::OPMoveCoin(const EQApplicationPacket* app) NPC *banker = entity_list.GetClosestBanker(this, distance); if(!banker || distance > USE_NPC_RANGE2) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "Player tried to make use of a banker(shared coin move) but %s is non-existant or too far away (%u units).", - banker ? banker->GetName() : "UNKNOWN NPC", distance); + auto hacked_string = + fmt::format("Player tried to make use of a banker(shared coin move) but {} is " + "non-existant or too far away ({} units).", + banker ? banker->GetName() : "UNKNOWN NPC", distance); database.SetMQDetectionFlag(AccountName(), GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); return; } if(mc->cointype1 == COINTYPE_PP) // there's only platinum here @@ -1323,11 +1349,10 @@ void Client::OPMoveCoin(const EQApplicationPacket* app) NPC *banker = entity_list.GetClosestBanker(this, distance); if(!banker || distance > USE_NPC_RANGE2) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "Player tried to make use of a banker(coin move) but %s is non-existant or too far away (%u units).", - banker ? banker->GetName() : "UNKNOWN NPC", distance); + auto hacked_string = fmt::format("Player tried to make use of a banker(coin move) but " + "{} is non-existant or too far away ({} units).", + banker ? banker->GetName() : "UNKNOWN NPC", distance); database.SetMQDetectionFlag(AccountName(), GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); return; } switch(mc->cointype2) @@ -1367,11 +1392,11 @@ void Client::OPMoveCoin(const EQApplicationPacket* app) NPC *banker = entity_list.GetClosestBanker(this, distance); if(!banker || distance > USE_NPC_RANGE2) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "Player tried to make use of a banker(shared coin move) but %s is non-existant or too far away (%u units).", - banker ? banker->GetName() : "UNKNOWN NPC", distance); + auto hacked_string = + fmt::format("Player tried to make use of a banker(shared coin move) but {} is " + "non-existant or too far away ({} units).", + banker ? banker->GetName() : "UNKNOWN NPC", distance); database.SetMQDetectionFlag(AccountName(), GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); return; } if(mc->cointype2 == COINTYPE_PP) // there's only platinum here @@ -1486,19 +1511,19 @@ void Client::OPGMTraining(const EQApplicationPacket *app) // if this for-loop acts up again (crashes linux), try enabling the before and after #pragmas //#pragma GCC push_options //#pragma GCC optimize ("O0") - for (int sk = EQEmu::skills::Skill1HBlunt; sk <= EQEmu::skills::HIGHEST_SKILL; ++sk) { - if (sk == EQEmu::skills::SkillTinkering && GetRace() != GNOME) { + for (int sk = EQ::skills::Skill1HBlunt; sk <= EQ::skills::HIGHEST_SKILL; ++sk) { + if (sk == EQ::skills::SkillTinkering && GetRace() != GNOME) { gmtrain->skills[sk] = 0; //Non gnomes can't tinker! } else { - gmtrain->skills[sk] = GetMaxSkillAfterSpecializationRules((EQEmu::skills::SkillType)sk, MaxSkill((EQEmu::skills::SkillType)sk, GetClass(), RuleI(Character, MaxLevel))); + gmtrain->skills[sk] = GetMaxSkillAfterSpecializationRules((EQ::skills::SkillType)sk, MaxSkill((EQ::skills::SkillType)sk, GetClass(), RuleI(Character, MaxLevel))); //this is the highest level that the trainer can train you to, this is enforced clientside so we can't just //Set it to 1 with CanHaveSkill or you wont be able to train past 1. } } - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF2 && GetClass() == BERSERKER) { - gmtrain->skills[EQEmu::skills::Skill1HPiercing] = gmtrain->skills[EQEmu::skills::Skill2HPiercing]; - gmtrain->skills[EQEmu::skills::Skill2HPiercing] = 0; + if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && GetClass() == BERSERKER) { + gmtrain->skills[EQ::skills::Skill1HPiercing] = gmtrain->skills[EQ::skills::Skill2HPiercing]; + gmtrain->skills[EQ::skills::Skill2HPiercing] = 0; } //#pragma GCC pop_options @@ -1587,14 +1612,14 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app) else if (gmskill->skillbank == 0x00) { // normal skills go here - if (gmskill->skill_id > EQEmu::skills::HIGHEST_SKILL) + if (gmskill->skill_id > EQ::skills::HIGHEST_SKILL) { std::cout << "Wrong Training Skill (abilities)" << std::endl; DumpPacket(app); return; } - EQEmu::skills::SkillType skill = (EQEmu::skills::SkillType)gmskill->skill_id; + EQ::skills::SkillType skill = (EQ::skills::SkillType)gmskill->skill_id; if(!CanHaveSkill(skill)) { LogSkills("Tried to train skill [{}], which is not allowed", skill); @@ -1619,27 +1644,27 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app) SetSkill(skill, t_level); } else { switch(skill) { - case EQEmu::skills::SkillBrewing: - case EQEmu::skills::SkillMakePoison: - case EQEmu::skills::SkillTinkering: - case EQEmu::skills::SkillResearch: - case EQEmu::skills::SkillAlchemy: - case EQEmu::skills::SkillBaking: - case EQEmu::skills::SkillTailoring: - case EQEmu::skills::SkillBlacksmithing: - case EQEmu::skills::SkillFletching: - case EQEmu::skills::SkillJewelryMaking: - case EQEmu::skills::SkillPottery: + case EQ::skills::SkillBrewing: + case EQ::skills::SkillMakePoison: + case EQ::skills::SkillTinkering: + case EQ::skills::SkillResearch: + case EQ::skills::SkillAlchemy: + case EQ::skills::SkillBaking: + case EQ::skills::SkillTailoring: + case EQ::skills::SkillBlacksmithing: + case EQ::skills::SkillFletching: + case EQ::skills::SkillJewelryMaking: + case EQ::skills::SkillPottery: if(skilllevel >= RuleI(Skills, MaxTrainTradeskills)) { MessageString(Chat::Red, MORE_SKILLED_THAN_I, pTrainer->GetCleanName()); return; } break; - case EQEmu::skills::SkillSpecializeAbjure: - case EQEmu::skills::SkillSpecializeAlteration: - case EQEmu::skills::SkillSpecializeConjuration: - case EQEmu::skills::SkillSpecializeDivination: - case EQEmu::skills::SkillSpecializeEvocation: + case EQ::skills::SkillSpecializeAbjure: + case EQ::skills::SkillSpecializeAlteration: + case EQ::skills::SkillSpecializeConjuration: + case EQ::skills::SkillSpecializeDivination: + case EQ::skills::SkillSpecializeEvocation: if(skilllevel >= RuleI(Skills, MaxTrainSpecializations)) { MessageString(Chat::Red, MORE_SKILLED_THAN_I, pTrainer->GetCleanName()); return; @@ -1656,7 +1681,7 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app) return; } - if (gmskill->skill_id >= EQEmu::skills::SkillSpecializeAbjure && gmskill->skill_id <= EQEmu::skills::SkillSpecializeEvocation) + if (gmskill->skill_id >= EQ::skills::SkillSpecializeAbjure && gmskill->skill_id <= EQ::skills::SkillSpecializeEvocation) { int MaxSpecSkill = GetMaxSkillAfterSpecializationRules(skill, MaxSkillValue); if (skilllevel >= MaxSpecSkill) @@ -1680,7 +1705,7 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app) } } - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoF) { + if (ClientVersion() >= EQ::versions::ClientVersion::SoF) { // The following packet decreases the skill points left in the Training Window and // produces the 'You have increased your skill / learned the basics of' message. // @@ -1694,7 +1719,7 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app) gmtsc->SkillID += 100; } else - gmtsc->NewSkill = (GetRawSkill((EQEmu::skills::SkillType)gmtsc->SkillID) == 1); + gmtsc->NewSkill = (GetRawSkill((EQ::skills::SkillType)gmtsc->SkillID) == 1); gmtsc->Cost = Cost; @@ -1775,8 +1800,8 @@ void Client::DoManaRegen() { if (GetMana() >= max_mana && spellbonuses.ManaRegen >= 0) return; - if (GetMana() < max_mana && (IsSitting() || CanMedOnHorse()) && HasSkill(EQEmu::skills::SkillMeditate)) - CheckIncreaseSkill(EQEmu::skills::SkillMeditate, nullptr, -5); + if (GetMana() < max_mana && (IsSitting() || CanMedOnHorse()) && HasSkill(EQ::skills::SkillMeditate)) + CheckIncreaseSkill(EQ::skills::SkillMeditate, nullptr, -5); SetMana(GetMana() + CalcManaRegen()); CheckManaEndUpdate(); @@ -1794,11 +1819,11 @@ void Client::DoStaminaHungerUpdate() if (GetHorseId() != 0) loss *= 3; - m_pp.hunger_level = EQEmu::Clamp(m_pp.hunger_level - loss, 0, 6000); - m_pp.thirst_level = EQEmu::Clamp(m_pp.thirst_level - loss, 0, 6000); + m_pp.hunger_level = EQ::Clamp(m_pp.hunger_level - loss, 0, 6000); + m_pp.thirst_level = EQ::Clamp(m_pp.thirst_level - loss, 0, 6000); if (spellbonuses.hunger) { - m_pp.hunger_level = EQEmu::ClampLower(m_pp.hunger_level, 3500); - m_pp.thirst_level = EQEmu::ClampLower(m_pp.thirst_level, 3500); + m_pp.hunger_level = EQ::ClampLower(m_pp.hunger_level, 3500); + m_pp.thirst_level = EQ::ClampLower(m_pp.thirst_level, 3500); } sta->food = m_pp.hunger_level; sta->water = m_pp.thirst_level; @@ -1971,7 +1996,7 @@ void Client::HandleRespawnFromHover(uint32 Option) BindStruct* b = &m_pp.binds[0]; default_to_bind = new RespawnOption; default_to_bind->name = "Bind Location"; - default_to_bind->zone_id = b->zoneId; + default_to_bind->zone_id = b->zone_id; default_to_bind->instance_id = b->instance_id; default_to_bind->x = b->x; default_to_bind->y = b->y; @@ -2087,7 +2112,7 @@ void Client::HandleRespawnFromHover(uint32 Option) m_pp.zone_id = chosen->zone_id; m_pp.zoneInstance = chosen->instance_id; - database.MoveCharacterToZone(CharacterID(), content_db.GetZoneName(chosen->zone_id)); + database.MoveCharacterToZone(CharacterID(), chosen->zone_id); Save(); @@ -2113,7 +2138,7 @@ void Client::ClearHover() entity_list.QueueClients(this, outapp, false); safe_delete(outapp); - if (IsClient() && CastToClient()->ClientVersionBit() & EQEmu::versions::maskUFAndLater) + if (IsClient() && CastToClient()->ClientVersionBit() & EQ::versions::maskUFAndLater) { EQApplicationPacket *outapp = MakeBuffsPacket(false); CastToClient()->FastQueuePacket(&outapp); diff --git a/zone/command.cpp b/zone/command.cpp index 66be91b64..20cb4856f 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -24,7 +24,7 @@ 2. Add the function in this file. 3. In the command_init function you must add a call to command_add for your function. - + Notes: If you want an alias for your command, add an entry to the `command_settings` table in your database. The access level you set with command_add is the default setting if the command isn't @@ -57,9 +57,11 @@ #include "../common/eqemu_logsys.h" #include "../common/profanity_manager.h" #include "../common/net/eqstream.h" +#include "../common/repositories/dynamic_zones_repository.h" #include "data_bucket.h" #include "command.h" +#include "expedition.h" #include "guild_mgr.h" #include "map.h" #include "qglobals.h" @@ -72,10 +74,11 @@ #include "fastmath.h" #include "mob_movement_manager.h" #include "npc_scale_manager.h" +#include "../common/content/world_content_service.h" extern QueryServ* QServ; extern WorldServer worldserver; -extern TaskManager *taskmanager; +extern TaskManager *task_manager; extern FastMath g_Math; void CatchSignal(int sig_num); @@ -177,6 +180,7 @@ int command_init(void) command_add("castspell", "[spellid] - Cast a spell", 50, command_castspell) || command_add("chat", "[channel num] [message] - Send a channel message to all zones", 200, command_chat) || command_add("checklos", "- Check for line of sight to your target", 50, command_checklos) || + command_add("copycharacter", "[source_char_name] [dest_char_name] [dest_account_name] Copies character to destination account", 250, command_copycharacter) || command_add("corpse", "- Manipulate corpses, use with no arguments for help", 50, command_corpse) || command_add("corpsefix", "Attempts to bring corpses from underneath the ground within close proximity of the player", 0, command_corpsefix) || command_add("crashtest", "- Crash the zoneserver", 255, command_crashtest) || @@ -196,16 +200,21 @@ int command_init(void) command_add("disarmtrap", "Analog for ldon disarm trap for the newer clients since we still don't have it working.", 80, command_disarmtrap) || command_add("distance", "- Reports the distance between you and your target.", 80, command_distance) || command_add("doanim", "[animnum] [type] - Send an EmoteAnim for you or your target", 50, command_doanim) || + command_add("dz", "Manage expeditions and dynamic zone instances", 80, command_dz) || + command_add("dzkickplayers", "Removes all players from current expedition. (/kickplayers alternative for pre-RoF clients)", 0, command_dzkickplayers) || + command_add("editmassrespawn", "[name-search] [second-value] - Mass (Zone wide) NPC respawn timer editing command", 100, command_editmassrespawn) || command_add("emote", "['name'/'world'/'zone'] [type] [message] - Send an emote message", 80, command_emote) || command_add("emotesearch", "Searches NPC Emotes", 80, command_emotesearch) || command_add("emoteview", "Lists all NPC Emotes", 80, command_emoteview) || command_add("enablerecipe", "[recipe_id] - Enables a recipe using the recipe id.", 80, command_enablerecipe) || + command_add("endurance", "Restores you or your target's endurance.", 50, command_endurance) || command_add("equipitem", "[slotid(0-21)] - Equip the item on your cursor into the specified slot", 50, command_equipitem) || command_add("face", "- Change the face of your target", 80, command_face) || command_add("faction", "[Find (criteria | all ) | Review (criteria | all) | Reset (id)] - Resets Player's Faction", 80, command_faction) || - command_add("findaliases", "[search term]- Searches for available command aliases, by alias or command", 0, command_findaliases) || + command_add("findaliases", "[search criteria]- Searches for available command aliases, by alias or command", 0, command_findaliases) || command_add("findnpctype", "[search criteria] - Search database NPC types", 100, command_findnpctype) || - command_add("findspell", "[searchstring] - Search for a spell", 50, command_findspell) || + command_add("findrace", "[search criteria] - Search for a race", 50, command_findrace) || + command_add("findspell", "[search criteria] - Search for a spell", 50, command_findspell) || command_add("findzone", "[search criteria] - Search database zones", 100, command_findzone) || command_add("fixmob", "[race|gender|texture|helm|face|hair|haircolor|beard|beardcolor|heritage|tattoo|detail] [next|prev] - Manipulate appearance of your target", 80, command_fixmob) || command_add("flag", "[status] [acctname] - Refresh your admin status, or set an account's admin status if arguments provided", 0, command_flag) || @@ -215,6 +224,7 @@ int command_init(void) command_add("fov", "- Check wether you're behind or in your target's field of view", 80, command_fov) || command_add("freeze", "- Freeze your target", 80, command_freeze) || command_add("gassign", "[id] - Assign targetted NPC to predefined wandering grid id", 100, command_gassign) || + command_add("gearup", "Developer tool to quickly equip a character", 200, command_gearup) || command_add("gender", "[0/1/2] - Change your or your target's gender to male/female/neuter", 50, command_gender) || command_add("getplayerburiedcorpsecount", "- Get the target's total number of buried player corpses.", 100, command_getplayerburiedcorpsecount) || command_add("getvariable", "[varname] - Get the value of a variable from the database", 200, command_getvariable) || @@ -382,6 +392,7 @@ int command_init(void) command_add("showspellslist", "Shows spell list of targeted NPC", 100, command_showspellslist) || command_add("showstats", "- Show details about you or your target", 50, command_showstats) || command_add("showzonegloballoot", "Show GlobalLoot entires on this zone", 50, command_showzonegloballoot) || + command_add("showzonepoints", "Show zone points for current zone", 50, command_showzonepoints) || command_add("shutdown", "- Shut this zone process down", 150, command_shutdown) || command_add("size", "[size] - Change size of you or your target", 50, command_size) || command_add("spawn", "[name] [race] [level] [material] [hp] [gender] [class] [priweapon] [secweapon] [merchantid] - Spawn an NPC", 10, command_spawn) || @@ -429,6 +440,7 @@ int command_init(void) command_add("wp", "[add/delete] [grid_num] [pause] [wp_num] [-h] - Add/delete a waypoint to/from a wandering grid", 170, command_wp) || command_add("wpadd", "[pause] [-h] - Add your current location as a waypoint to your NPC target's AI path", 170, command_wpadd) || command_add("wpinfo", "- Show waypoint info about your NPC target", 170, command_wpinfo) || + command_add("worldwide", "Performs world-wide GM functions such as cast (can be extended for other commands). Use caution", 250, command_worldwide) || command_add("xtargets", "Show your targets Extended Targets and optionally set how many xtargets they can have.", 250, command_xtargets) || command_add("zclip", "[min] [max] - modifies and resends zhdr packet", 80, command_zclip) || command_add("zcolor", "[red] [green] [blue] - Change sky color", 80, command_zcolor) || @@ -496,7 +508,7 @@ int command_init(void) working_cl_iter.first.c_str() ); } - + continue; } @@ -506,7 +518,7 @@ int command_init(void) working_cl_iter.first.c_str(), cs_iter->second.first ); - + if (cs_iter->second.second.empty()) { continue; } @@ -521,7 +533,7 @@ int command_init(void) "command_init(): Warning: Alias [{}] already exists as a command - skipping!", alias_iter.c_str() ); - + continue; } @@ -728,6 +740,42 @@ void command_logcommand(Client *c, const char *message) /* * commands go below here */ +void command_worldwide(Client *c, const Seperator *sep) +{ + std::string sub_command; + if (sep->arg[1]) { + sub_command = sep->arg[1]; + } + + if (sub_command == "cast") { + if (sep->arg[2][0] && Seperator::IsNumber(sep->arg[2])) { + int spell_id = atoi(sep->arg[2]); + quest_manager.WorldWideCastSpell(spell_id, 0, 0); + worldserver.SendEmoteMessage(0, 0, 15, fmt::format(" A GM has cast [{}] world-wide!", GetSpellName(spell_id)).c_str()); + } + else { + c->Message(Chat::Yellow, "Usage: #worldwide cast [spellid]"); + } + } + + if (!sep->arg[1]) { + c->Message(Chat::White, "This command is used to perform world-wide tasks"); + c->Message(Chat::White, "Usage: #worldwide cast [spellid]"); + } +} +void command_endurance(Client *c, const Seperator *sep) +{ + Mob *t; + + t = c->GetTarget() ? c->GetTarget() : c; + + if (t->IsClient()) + t->CastToClient()->SetEndurance(t->CastToClient()->GetMaxEndurance()); + else + t->SetEndurance(t->GetMaxEndurance()); + + t->Message(Chat::White, "Your endurance has been refilled."); +} void command_setstat(Client* c, const Seperator* sep){ if(sep->arg[1][0] && sep->arg[2][0] && c->GetTarget()!=0 && c->GetTarget()->IsClient()){ c->GetTarget()->CastToClient()->SetStats(atoi(sep->arg[1]),atoi(sep->arg[2])); @@ -1170,7 +1218,7 @@ void command_zone(Client *c, const Seperator *sep) return; } - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); if(zoneid == 0) { c->Message(Chat::White, "Unable to locate zone '%s'", sep->arg[1]); return; @@ -1288,7 +1336,7 @@ void command_peqzone(Client *c, const Seperator *sep) if (sep->IsNumber(1)) { zoneid = atoi(sep->arg[1]); - destzone = database.GetPEQZone(zoneid, 0); + destzone = content_db.GetPEQZone(zoneid, 0); if(destzone == 0){ c->Message(Chat::Red, "You cannot use this command to enter that zone!"); return; @@ -1305,8 +1353,8 @@ void command_peqzone(Client *c, const Seperator *sep) return; } else { - zoneid = content_db.GetZoneID(sep->arg[1]); - destzone = database.GetPEQZone(zoneid, 0); + zoneid = ZoneID(sep->arg[1]); + destzone = content_db.GetPEQZone(zoneid, 0); if(zoneid == 0) { c->Message(Chat::White, "Unable to locate zone '%s'", sep->arg[1]); return; @@ -1343,7 +1391,7 @@ void command_movechar(Client *c, const Seperator *sep) if (tmp) { if (c->Admin() >= commandMovecharSelfOnly || tmp == c->AccountID()) - if (!database.MoveCharacterToZone((char*) sep->arg[1], (char*) sep->arg[2])) + if (!database.MoveCharacterToZone((char*) sep->arg[1], ZoneID(sep->arg[2]))) c->Message(Chat::White, "Character Move Failed!"); else c->Message(Chat::White, "Character has been moved."); @@ -1562,12 +1610,12 @@ void command_list(Client *c, const Seperator *sep) "#goto %.0f %0.f %.0f", entity->GetX(), entity->GetY(), - entity->GetZ()); + entity->GetZ() + (entity->IsBoat() ? 50 : 0)); c->Message( 0, "| %s | ID %5d | %s | x %.0f | y %0.f | z %.0f", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), entity->GetID(), entity->GetName(), entity->GetX(), @@ -1608,7 +1656,7 @@ void command_list(Client *c, const Seperator *sep) c->Message( 0, "| %s | ID %5d | %s | x %.0f | y %0.f | z %.0f", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), entity->GetID(), entity->GetName(), entity->GetX(), @@ -1649,7 +1697,7 @@ void command_list(Client *c, const Seperator *sep) c->Message( 0, "| %s | ID %5d | %s | x %.0f | y %0.f | z %.0f", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), entity->GetID(), entity->GetName(), entity->GetX(), @@ -1690,7 +1738,7 @@ void command_list(Client *c, const Seperator *sep) c->Message( 0, "| %s | Entity ID %5d | Door ID %i | %s | x %.0f | y %0.f | z %.0f", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), entity->GetID(), entity->GetDoorID(), entity->GetDoorName(), @@ -1732,7 +1780,7 @@ void command_list(Client *c, const Seperator *sep) c->Message( 0, "| %s | Entity ID %5d | Object DBID %i | %s | x %.0f | y %0.f | z %.0f", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Goto").c_str(), entity->GetID(), entity->GetDBID(), entity->GetModelName(), @@ -1757,7 +1805,7 @@ void command_list(Client *c, const Seperator *sep) else { c->Message(Chat::White, "Usage of #list"); c->Message(Chat::White, "- #list [npcs|players|corpses|doors|objects] [search]"); - c->Message(Chat::White, "- Example: #list npc (Blank for all)"); + c->Message(Chat::White, "- Example: #list npcs (Blank for all)"); } } @@ -2104,7 +2152,7 @@ void command_zheader(Client *c, const Seperator *sep) if(sep->arg[1][0]==0) { c->Message(Chat::White, "Usage: #zheader "); } - else if(content_db.GetZoneID(sep->argplus[1])==0) + else if(ZoneID(sep->argplus[1])==0) c->Message(Chat::White, "Invalid Zone Name: %s", sep->argplus[1]); else { @@ -2436,10 +2484,10 @@ void command_grid(Client *c, const Seperator *sep) } std::string query = StringFormat( - "SELECT `x`, `y`, `z`, `heading`, `number`, `pause` " + "SELECT `x`, `y`, `z`, `heading`, `number` " "FROM `grid_entries` " "WHERE `zoneid` = %u and `gridid` = %i " - "ORDER BY `number` ", + "ORDER BY `number`", zone->GetZoneID(), target->CastToNPC()->GetGrid() ); @@ -2469,18 +2517,31 @@ void command_grid(Client *c, const Seperator *sep) /** * Spawn grid nodes */ - for (auto row = results.begin(); row != results.end(); ++row) { - auto node_position = glm::vec4(atof(row[0]), atof(row[1]), atof(row[2]), atof(row[3])); + std::map, int32> zoffset; - NPC *npc = NPC::SpawnGridNodeNPC( - target->GetCleanName(), - node_position, - static_cast(target->CastToNPC()->GetGrid()), - static_cast(atoi(row[4])), - static_cast(atoi(row[5])) - ); - npc->SetFlyMode(GravityBehavior::Flying); - npc->GMMove(node_position.x, node_position.y, node_position.z, node_position.w); + for (auto row = results.begin(); row != results.end(); ++row) { + glm::vec4 node_position = glm::vec4(atof(row[0]), atof(row[1]), atof(row[2]), atof(row[3])); + + std::vector node_loc { + node_position.x, + node_position.y, + node_position.z + }; + + // If we already have a node at this location, set the z offset + // higher from the existing one so we can see it. Adjust so if + // there is another at the same spot we adjust again. + auto search = zoffset.find(node_loc); + if (search != zoffset.end()) { + search->second = search->second + 3; + } + else { + zoffset[node_loc] = 0.0; + } + + node_position.z += zoffset[node_loc]; + + NPC::SpawnGridNodeNPC(node_position,atoi(row[4]),zoffset[node_loc]); } } else if (strcasecmp("delete", sep->arg[1]) == 0) { @@ -2582,9 +2643,7 @@ void command_flymode(Client *c, const Seperator *sep) { Mob *t = c; - if (strlen(sep->arg[1]) == 1 && !(sep->arg[1][0] == '0' || sep->arg[1][0] == '1' || sep->arg[1][0] == '2' || sep->arg[1][0] == '3' || sep->arg[1][0] == '4' || sep->arg[1][0] == '5')) - c->Message(Chat::White, "#flymode [0/1/2/3/4/5]"); - else { + if (strlen(sep->arg[1]) == 1 && sep->IsNumber(1) && atoi(sep->arg[1]) >= 0 && atoi(sep->arg[1]) <= 5) { if (c->GetTarget()) { t = c->GetTarget(); } @@ -2611,9 +2670,12 @@ void command_flymode(Client *c, const Seperator *sep) else if (sep->arg[1][0] == '5') { c->Message(Chat::White, "Setting %s to Levitating While Running", t->GetName()); } + } else { + c->Message(Chat::White, "#flymode [0/1/2/3/4/5]"); } } + void command_showskills(Client *c, const Seperator *sep) { Client *t=c; @@ -2622,10 +2684,50 @@ void command_showskills(Client *c, const Seperator *sep) t=c->GetTarget()->CastToClient(); c->Message(Chat::White, "Skills for %s", t->GetName()); - for (EQEmu::skills::SkillType i = EQEmu::skills::Skill1HBlunt; i <= EQEmu::skills::HIGHEST_SKILL; i = (EQEmu::skills::SkillType)(i + 1)) + for (EQ::skills::SkillType i = EQ::skills::Skill1HBlunt; i <= EQ::skills::HIGHEST_SKILL; i = (EQ::skills::SkillType)(i + 1)) c->Message(Chat::White, "Skill [%d] is at [%d] - %u", i, t->GetSkill(i), t->GetRawSkill(i)); } +void command_findrace(Client *c, const Seperator *sep) +{ + if (sep->arg[1][0] == 0) { + c->Message(Chat::White, "Usage: #findrace [race name]"); + } else if (Seperator::IsNumber(sep->argplus[1])) { + int search_id = atoi(sep->argplus[1]); + std::string race_name = GetRaceIDName(search_id); + if (race_name != std::string("")) { + c->Message(Chat::White, "Race %d: %s", search_id, race_name.c_str()); + return; + } + } else { + const char *search_criteria = sep->argplus[1]; + int found_count = 0; + char race_name[64]; + char search_string[65]; + strn0cpy(search_string, search_criteria, sizeof(search_string)); + strupr(search_string); + char *string_location; + for (int race_id = RACE_HUMAN_1; race_id <= RT_PEGASUS_3; race_id++) { + strn0cpy(race_name, GetRaceIDName(race_id), sizeof(race_name)); + strupr(race_name); + string_location = strstr(race_name, search_string); + if (string_location != nullptr) { + c->Message(Chat::White, "Race %d: %s", race_id, GetRaceIDName(race_id)); + found_count++; + } + + if (found_count == 20) { + break; + } + } + if (found_count == 20) { + c->Message(Chat::White, "20 Races found... max reached."); + } else { + c->Message(Chat::White, "%i Race(s) found.", found_count); + } + } +} + void command_findspell(Client *c, const Seperator *sep) { if (sep->arg[1][0] == 0) @@ -2691,14 +2793,14 @@ void command_castspell(Client *c, const Seperator *sep) else if (c->GetTarget() == 0) if(c->Admin() >= commandInstacast) - c->SpellFinished(spellid, 0, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spellid].ResistDiff); + c->SpellFinished(spellid, 0, EQ::spells::CastingSlot::Item, 0, -1, spells[spellid].ResistDiff); else - c->CastSpell(spellid, 0, EQEmu::spells::CastingSlot::Item, 0); + c->CastSpell(spellid, 0, EQ::spells::CastingSlot::Item, 0); else if(c->Admin() >= commandInstacast) - c->SpellFinished(spellid, c->GetTarget(), EQEmu::spells::CastingSlot::Item, 0, -1, spells[spellid].ResistDiff); + c->SpellFinished(spellid, c->GetTarget(), EQ::spells::CastingSlot::Item, 0, -1, spells[spellid].ResistDiff); else - c->CastSpell(spellid, c->GetTarget()->GetID(), EQEmu::spells::CastingSlot::Item, 0); + c->CastSpell(spellid, c->GetTarget()->GetID(), EQ::spells::CastingSlot::Item, 0); } } @@ -2770,20 +2872,20 @@ void command_setskill(Client *c, const Seperator *sep) c->Message(Chat::White, "Error: #setskill: Target must be a client."); } else if ( - !sep->IsNumber(1) || atoi(sep->arg[1]) < 0 || atoi(sep->arg[1]) > EQEmu::skills::HIGHEST_SKILL || + !sep->IsNumber(1) || atoi(sep->arg[1]) < 0 || atoi(sep->arg[1]) > EQ::skills::HIGHEST_SKILL || !sep->IsNumber(2) || atoi(sep->arg[2]) < 0 || atoi(sep->arg[2]) > HIGHEST_CAN_SET_SKILL ) { c->Message(Chat::White, "Usage: #setskill skill x "); - c->Message(Chat::White, " skill = 0 to %d", EQEmu::skills::HIGHEST_SKILL); + c->Message(Chat::White, " skill = 0 to %d", EQ::skills::HIGHEST_SKILL); c->Message(Chat::White, " x = 0 to %d", HIGHEST_CAN_SET_SKILL); } else { LogInfo("Set skill request from [{}], target:[{}] skill_id:[{}] value:[{}]", c->GetName(), c->GetTarget()->GetName(), atoi(sep->arg[1]), atoi(sep->arg[2]) ); int skill_num = atoi(sep->arg[1]); uint16 skill_value = atoi(sep->arg[2]); - if (skill_num <= EQEmu::skills::HIGHEST_SKILL) - c->GetTarget()->CastToClient()->SetSkill((EQEmu::skills::SkillType)skill_num, skill_value); + if (skill_num <= EQ::skills::HIGHEST_SKILL) + c->GetTarget()->CastToClient()->SetSkill((EQ::skills::SkillType)skill_num, skill_value); } } @@ -2801,7 +2903,7 @@ void command_setskillall(Client *c, const Seperator *sep) if (c->Admin() >= commandSetSkillsOther || c->GetTarget()==c || c->GetTarget()==0) { LogInfo("Set ALL skill request from [{}], target:[{}]", c->GetName(), c->GetTarget()->GetName()); uint16 level = atoi(sep->arg[1]); - for (EQEmu::skills::SkillType skill_num = EQEmu::skills::Skill1HBlunt; skill_num <= EQEmu::skills::HIGHEST_SKILL; skill_num = (EQEmu::skills::SkillType)(skill_num + 1)) { + for (EQ::skills::SkillType skill_num = EQ::skills::Skill1HBlunt; skill_num <= EQ::skills::HIGHEST_SKILL; skill_num = (EQ::skills::SkillType)(skill_num + 1)) { c->GetTarget()->CastToClient()->SetSkill(skill_num, level); } } @@ -2831,6 +2933,119 @@ void command_race(Client *c, const Seperator *sep) } } +void command_gearup(Client *c, const Seperator *sep) +{ + std::string tool_table_name = "tool_gearup_armor_sets"; + + if (!database.DoesTableExist(tool_table_name)) { + c->Message( + Chat::Red, + fmt::format( + "Table [{}] does not exist, please source in the optional SQL required for this tool", + tool_table_name + ).c_str() + ); + return; + } + + std::string expansion_arg = sep->arg[1]; + std::string expansion_filter; + if (expansion_arg.length() > 0) { + expansion_filter = fmt::format("and `expansion` = {}", expansion_arg); + } + + auto results = database.QueryDatabase( + fmt::format( + SQL ( + select + item_id, + slot + from + {} + where + `class` = {} + and `level` = {} + {} + order by score desc, expansion desc + ), + tool_table_name, + c->GetClass(), + c->GetLevel(), + expansion_filter + ) + ); + + std::set equipped; + for (auto row = results.begin(); row != results.end(); ++row) { + int item_id = atoi(row[0]); + int slot_id = atoi(row[1]); + + if (equipped.find(slot_id) != equipped.end()) { + if (slot_id == EQ::invslot::slotEar1) { + slot_id = EQ::invslot::slotEar2; + } + if (slot_id == EQ::invslot::slotFinger1) { + slot_id = EQ::invslot::slotFinger2; + } + if (slot_id == EQ::invslot::slotWrist1) { + slot_id = EQ::invslot::slotWrist2; + } + } + + if (equipped.find(slot_id) == equipped.end()) { + if (c->CastToMob()->CanClassEquipItem(item_id)) { + equipped.insert(slot_id); + c->SummonItem( + item_id, + 0, 0, 0, 0, 0, 0, 0, 0, + slot_id + ); + } + } + } + + if (expansion_arg.empty()) { + results = database.QueryDatabase( + fmt::format( + SQL ( + select + expansion + from + {} + where + class = {} + and level = {} + group by + expansion; + ), + tool_table_name, + c->GetClass(), + c->GetLevel() + ) + ); + + c->Message(Chat::White, "Choose armor from a specific era"); + std::string message; + for (auto row = results.begin(); row != results.end(); ++row) { + int expansion = atoi(row[0]); + message += "[" + EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format("#gearup {}", expansion), + false, + Expansion::ExpansionName[expansion] + ) + "] "; + + if (message.length() > 2000) { + c->Message(Chat::White, message.c_str()); + message = ""; + } + } + if (message.length() > 0) { + c->Message(Chat::White, message.c_str()); + } + } + +} + void command_gender(Client *c, const Seperator *sep) { Mob *t=c->CastToMob(); @@ -2990,7 +3205,7 @@ void command_spawneditmass(Client *c, const Seperator *sep) if (found_count > 0) { c->Message( Chat::Yellow, "To apply these changes, click <%s> or type [%s]", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), saylink.c_str() ); } @@ -3058,14 +3273,14 @@ void command_texture(Client *c, const Seperator *sep) // Player Races Wear Armor, so Wearchange is sent instead int i; if (!c->GetTarget()) - for (i = EQEmu::textures::textureBegin; i <= EQEmu::textures::LastTintableTexture; i++) + for (i = EQ::textures::textureBegin; i <= EQ::textures::LastTintableTexture; i++) { c->SendTextureWC(i, texture); } else if ((c->GetTarget()->GetModel() > 0 && c->GetTarget()->GetModel() <= 12) || c->GetTarget()->GetModel() == 128 || c->GetTarget()->GetModel() == 130 || c->GetTarget()->GetModel() == 330 || c->GetTarget()->GetModel() == 522) { - for (i = EQEmu::textures::textureBegin; i <= EQEmu::textures::LastTintableTexture; i++) + for (i = EQ::textures::textureBegin; i <= EQ::textures::LastTintableTexture; i++) { c->GetTarget()->SendTextureWC(i, texture); } @@ -3247,15 +3462,15 @@ void command_peekinv(Client *c, const Seperator *sep) static const char* scope_prefix[] = { "equip", "gen", "cursor", "limbo", "trib", "bank", "shbank", "trade", "world" }; static const int16 scope_range[][2] = { - { EQEmu::invslot::EQUIPMENT_BEGIN, EQEmu::invslot::EQUIPMENT_END }, - { EQEmu::invslot::GENERAL_BEGIN, EQEmu::invslot::GENERAL_END }, - { EQEmu::invslot::slotCursor, EQEmu::invslot::slotCursor }, - { EQEmu::invslot::SLOT_INVALID, EQEmu::invslot::SLOT_INVALID }, - { EQEmu::invslot::TRIBUTE_BEGIN, EQEmu::invslot::TRIBUTE_END }, - { EQEmu::invslot::BANK_BEGIN, EQEmu::invslot::BANK_END }, - { EQEmu::invslot::SHARED_BANK_BEGIN, EQEmu::invslot::SHARED_BANK_END }, - { EQEmu::invslot::TRADE_BEGIN, EQEmu::invslot::TRADE_END }, - { EQEmu::invslot::SLOT_BEGIN, (EQEmu::invtype::WORLD_SIZE - 1) } + { EQ::invslot::EQUIPMENT_BEGIN, EQ::invslot::EQUIPMENT_END }, + { EQ::invslot::GENERAL_BEGIN, EQ::invslot::GENERAL_END }, + { EQ::invslot::slotCursor, EQ::invslot::slotCursor }, + { EQ::invslot::SLOT_INVALID, EQ::invslot::SLOT_INVALID }, + { EQ::invslot::TRIBUTE_BEGIN, EQ::invslot::TRIBUTE_END }, + { EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END }, + { EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END }, + { EQ::invslot::TRADE_BEGIN, EQ::invslot::TRADE_END }, + { EQ::invslot::SLOT_BEGIN, (EQ::invtype::WORLD_SIZE - 1) } }; static const bool scope_bag[] = { false, true, true, true, false, true, true, true, true }; @@ -3295,13 +3510,13 @@ void command_peekinv(Client *c, const Seperator *sep) if (c->GetTarget()) targetClient = c->GetTarget()->CastToClient(); - const EQEmu::ItemInstance* inst_main = nullptr; - const EQEmu::ItemInstance* inst_sub = nullptr; - const EQEmu::ItemInstance* inst_aug = nullptr; - const EQEmu::ItemData* item_data = nullptr; + const EQ::ItemInstance* inst_main = nullptr; + const EQ::ItemInstance* inst_sub = nullptr; + const EQ::ItemInstance* inst_aug = nullptr; + const EQ::ItemData* item_data = nullptr; - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemInst); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemInst); c->Message(Chat::White, "Displaying inventory for %s...", targetClient->GetName()); @@ -3324,7 +3539,7 @@ void command_peekinv(Client *c, const Seperator *sep) } for (int16 indexMain = scope_range[scopeIndex][0]; indexMain <= scope_range[scopeIndex][1]; ++indexMain) { - if (indexMain == EQEmu::invslot::SLOT_INVALID) + if (indexMain == EQ::invslot::SLOT_INVALID) continue; inst_main = ((scopeBit & peekWorld) ? objectTradeskill->GetItem(indexMain) : targetClient->GetInv().GetItem(indexMain)); @@ -3342,14 +3557,14 @@ void command_peekinv(Client *c, const Seperator *sep) (item_data == nullptr), "%sSlot: %i, Item: %i (%s), Charges: %i", scope_prefix[scopeIndex], - ((scopeBit & peekWorld) ? (EQEmu::invslot::WORLD_BEGIN + indexMain) : indexMain), + ((scopeBit & peekWorld) ? (EQ::invslot::WORLD_BEGIN + indexMain) : indexMain), ((item_data == nullptr) ? 0 : item_data->ID), linker.GenerateLink().c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges()) ); if (inst_main && inst_main->IsClassCommon()) { - for (uint8 indexAug = EQEmu::invaug::SOCKET_BEGIN; indexAug <= EQEmu::invaug::SOCKET_END; ++indexAug) { + for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) { inst_aug = inst_main->GetItem(indexAug); if (!inst_aug) // extant only continue; @@ -3362,7 +3577,7 @@ void command_peekinv(Client *c, const Seperator *sep) ".%sAugSlot: %i (Slot #%i, Aug idx #%i), Item: %i (%s), Charges: %i", scope_prefix[scopeIndex], INVALID_INDEX, - ((scopeBit & peekWorld) ? (EQEmu::invslot::WORLD_BEGIN + indexMain) : indexMain), + ((scopeBit & peekWorld) ? (EQ::invslot::WORLD_BEGIN + indexMain) : indexMain), indexAug, ((item_data == nullptr) ? 0 : item_data->ID), linker.GenerateLink().c_str(), @@ -3374,7 +3589,7 @@ void command_peekinv(Client *c, const Seperator *sep) if (!scope_bag[scopeIndex] || !(inst_main && inst_main->IsClassBag())) continue; - for (uint8 indexSub = EQEmu::invbag::SLOT_BEGIN; indexSub <= EQEmu::invbag::SLOT_END; ++indexSub) { + for (uint8 indexSub = EQ::invbag::SLOT_BEGIN; indexSub <= EQ::invbag::SLOT_END; ++indexSub) { inst_sub = inst_main->GetItem(indexSub); if (!inst_sub) // extant only continue; @@ -3386,8 +3601,8 @@ void command_peekinv(Client *c, const Seperator *sep) (item_data == nullptr), "..%sBagSlot: %i (Slot #%i, Bag idx #%i), Item: %i (%s), Charges: %i", scope_prefix[scopeIndex], - ((scopeBit & peekWorld) ? INVALID_INDEX : EQEmu::InventoryProfile::CalcSlotId(indexMain, indexSub)), - ((scopeBit & peekWorld) ? (EQEmu::invslot::WORLD_BEGIN + indexMain) : indexMain), + ((scopeBit & peekWorld) ? INVALID_INDEX : EQ::InventoryProfile::CalcSlotId(indexMain, indexSub)), + ((scopeBit & peekWorld) ? (EQ::invslot::WORLD_BEGIN + indexMain) : indexMain), indexSub, ((item_data == nullptr) ? 0 : item_data->ID), linker.GenerateLink().c_str(), @@ -3395,7 +3610,7 @@ void command_peekinv(Client *c, const Seperator *sep) ); if (inst_sub->IsClassCommon()) { - for (uint8 indexAug = EQEmu::invaug::SOCKET_BEGIN; indexAug <= EQEmu::invaug::SOCKET_END; ++indexAug) { + for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) { inst_aug = inst_sub->GetItem(indexAug); if (!inst_aug) // extant only continue; @@ -3408,7 +3623,7 @@ void command_peekinv(Client *c, const Seperator *sep) "...%sAugSlot: %i (Slot #%i, Sub idx #%i, Aug idx #%i), Item: %i (%s), Charges: %i", scope_prefix[scopeIndex], INVALID_INDEX, - ((scopeBit & peekWorld) ? INVALID_INDEX : EQEmu::InventoryProfile::CalcSlotId(indexMain, indexSub)), + ((scopeBit & peekWorld) ? INVALID_INDEX : EQ::InventoryProfile::CalcSlotId(indexMain, indexSub)), indexSub, indexAug, ((item_data == nullptr) ? 0 : item_data->ID), @@ -3448,7 +3663,7 @@ void command_peekinv(Client *c, const Seperator *sep) ); if (inst_main && inst_main->IsClassCommon()) { - for (uint8 indexAug = EQEmu::invaug::SOCKET_BEGIN; indexAug <= EQEmu::invaug::SOCKET_END; ++indexAug) { + for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) { inst_aug = inst_main->GetItem(indexAug); if (!inst_aug) // extant only continue; @@ -3473,7 +3688,7 @@ void command_peekinv(Client *c, const Seperator *sep) if (!scope_bag[scopeIndex] || !(inst_main && inst_main->IsClassBag())) continue; - for (uint8 indexSub = EQEmu::invbag::SLOT_BEGIN; indexSub <= EQEmu::invbag::SLOT_END; ++indexSub) { + for (uint8 indexSub = EQ::invbag::SLOT_BEGIN; indexSub <= EQ::invbag::SLOT_END; ++indexSub) { inst_sub = inst_main->GetItem(indexSub); if (!inst_sub) continue; @@ -3495,7 +3710,7 @@ void command_peekinv(Client *c, const Seperator *sep) ); if (inst_sub->IsClassCommon()) { - for (uint8 indexAug = EQEmu::invaug::SOCKET_BEGIN; indexAug <= EQEmu::invaug::SOCKET_END; ++indexAug) { + for (uint8 indexAug = EQ::invaug::SOCKET_BEGIN; indexAug <= EQ::invaug::SOCKET_END; ++indexAug) { inst_aug = inst_sub->GetItem(indexAug); if (!inst_aug) // extant only continue; @@ -3555,7 +3770,7 @@ void command_interrogateinv(Client *c, const Seperator *sep) } Client* target = nullptr; - std::map instmap; + std::map instmap; bool log = false; bool silent = false; bool error = false; @@ -4061,7 +4276,7 @@ void command_faction(Client *c, const Seperator *sep) std::string fvalue = rrow[2]; _ctr2++; std::string resetlink = fmt::format("#faction reset {}", f_id); - c->Message(Chat::Yellow, "Reset: %s id: %s (%s)", EQEmu::SayLinkEngine::GenerateQuestSaylink(resetlink, false, cname.c_str()).c_str(), std::to_string(f_id).c_str(), fvalue.c_str()); + c->Message(Chat::Yellow, "Reset: %s id: %s (%s)", EQ::SayLinkEngine::GenerateQuestSaylink(resetlink, false, cname.c_str()).c_str(), std::to_string(f_id).c_str(), fvalue.c_str()); } std::string response = _ctr2 > 0 ? fmt::format("Found {} matching factions", _ctr2).c_str() : "No faction hits found."; c->Message(Chat::Yellow, response.c_str()); @@ -4123,7 +4338,8 @@ void command_findzone(Client *c, const Seperator *sep) */ if (id == 0) { query = fmt::format( - "SELECT zoneidnumber, short_name, long_name, version FROM zone WHERE long_name LIKE '%{}%'", + "SELECT zoneidnumber, short_name, long_name, version FROM zone WHERE long_name LIKE '%{}%' OR `short_name` LIKE '%{}%'", + EscapeString(sep->arg[1]), EscapeString(sep->arg[1]) ); } @@ -4156,8 +4372,8 @@ void command_findzone(Client *c, const Seperator *sep) break; } - std::string command_zone = EQEmu::SayLinkEngine::GenerateQuestSaylink("#zone " + short_name, false, "zone"); - std::string command_gmzone = EQEmu::SayLinkEngine::GenerateQuestSaylink( + std::string command_zone = EQ::SayLinkEngine::GenerateQuestSaylink("#zone " + short_name, false, "zone"); + std::string command_gmzone = EQ::SayLinkEngine::GenerateQuestSaylink( fmt::format("#gmzone {} {}", short_name, version), false, "gmzone" @@ -4166,10 +4382,11 @@ void command_findzone(Client *c, const Seperator *sep) c->Message( Chat::White, fmt::format( - "[{}] [{}] [{}] Version ({}) [{}]", + "[{}] [{}] [{}] ID ({}) Version ({}) [{}]", (version == 0 ? command_zone : "zone"), command_gmzone, short_name, + zone_id, version, long_name ).c_str() @@ -4244,7 +4461,7 @@ void command_reloadworld(Client *c, const Seperator *sep) c->Message(Chat::White, "Reloading quest cache worldwide."); else c->Message(Chat::White, "Reloading quest cache and repopping zones worldwide."); - + auto pack = new ServerPacket(ServerOP_ReloadWorld, sizeof(ReloadWorld_Struct)); ReloadWorld_Struct* RW = (ReloadWorld_Struct*) pack->pBuffer; RW->Option = world_repop; @@ -4289,7 +4506,7 @@ void command_zoneshutdown(Client *c, const Seperator *sep) if (sep->arg[1][0] >= '0' && sep->arg[1][0] <= '9') s->ZoneServerID = atoi(sep->arg[1]); else - s->zoneid = content_db.GetZoneID(sep->arg[1]); + s->zoneid = ZoneID(sep->arg[1]); worldserver.SendPacket(pack); safe_delete(pack); } @@ -4307,7 +4524,7 @@ void command_zonebootup(Client *c, const Seperator *sep) ServerZoneStateChange_struct* s = (ServerZoneStateChange_struct *) pack->pBuffer; s->ZoneServerID = atoi(sep->arg[1]); strcpy(s->adminname, c->GetName()); - s->zoneid = content_db.GetZoneID(sep->arg[2]); + s->zoneid = ZoneID(sep->arg[2]); s->makestatic = (bool) (strcasecmp(sep->arg[3], "static") == 0); worldserver.SendPacket(pack); safe_delete(pack); @@ -4407,16 +4624,16 @@ void command_listpetition(Client *c, const Seperator *sep) void command_equipitem(Client *c, const Seperator *sep) { uint32 slot_id = atoi(sep->arg[1]); - if (sep->IsNumber(1) && (slot_id >= EQEmu::invslot::EQUIPMENT_BEGIN && slot_id <= EQEmu::invslot::EQUIPMENT_END)) { - const EQEmu::ItemInstance* from_inst = c->GetInv().GetItem(EQEmu::invslot::slotCursor); - const EQEmu::ItemInstance* to_inst = c->GetInv().GetItem(slot_id); // added (desync issue when forcing stack to stack) + if (sep->IsNumber(1) && (slot_id >= EQ::invslot::EQUIPMENT_BEGIN && slot_id <= EQ::invslot::EQUIPMENT_END)) { + const EQ::ItemInstance* from_inst = c->GetInv().GetItem(EQ::invslot::slotCursor); + const EQ::ItemInstance* to_inst = c->GetInv().GetItem(slot_id); // added (desync issue when forcing stack to stack) bool partialmove = false; int16 movecount; if (from_inst && from_inst->IsClassCommon()) { auto outapp = new EQApplicationPacket(OP_MoveItem, sizeof(MoveItem_Struct)); MoveItem_Struct* mi = (MoveItem_Struct*)outapp->pBuffer; - mi->from_slot = EQEmu::invslot::slotCursor; + mi->from_slot = EQ::invslot::slotCursor; mi->to_slot = slot_id; // mi->number_in_stack = from_inst->GetCharges(); // replaced with con check for stacking @@ -4490,7 +4707,7 @@ void command_zonelock(Client *c, const Seperator *sep) worldserver.SendPacket(pack); } else if (strcasecmp(sep->arg[1], "lock") == 0 && c->Admin() >= commandLockZones) { - uint16 tmp = content_db.GetZoneID(sep->arg[2]); + uint16 tmp = ZoneID(sep->arg[2]); if (tmp) { s->op = 1; s->zoneID = tmp; @@ -4500,7 +4717,7 @@ void command_zonelock(Client *c, const Seperator *sep) c->Message(Chat::White, "Usage: #zonelock lock [zonename]"); } else if (strcasecmp(sep->arg[1], "unlock") == 0 && c->Admin() >= commandLockZones) { - uint16 tmp = content_db.GetZoneID(sep->arg[2]); + uint16 tmp = ZoneID(sep->arg[2]); if (tmp) { s->op = 2; s->zoneID = tmp; @@ -4521,6 +4738,38 @@ void command_zonelock(Client *c, const Seperator *sep) safe_delete(pack); } +void command_copycharacter(Client *c, const Seperator *sep) +{ + if (sep->argnum < 3) { + c->Message( + Chat::White, + "Usage: [source_character_name] [destination_character_name] [destination_account_name]" + ); + return; + } + + std::string source_character_name = sep->arg[1]; + std::string destination_character_name = sep->arg[2]; + std::string destination_account_name = sep->arg[3]; + + bool result = database.CopyCharacter( + source_character_name, + destination_character_name, + destination_account_name + ); + + c->Message( + Chat::Yellow, + fmt::format( + "Character Copy [{}] to [{}] via account [{}] [{}]", + source_character_name, + destination_character_name, + destination_account_name, + result ? "Success" : "Failed" + ).c_str() + ); +} + void command_corpse(Client *c, const Seperator *sep) { Mob *target=c->GetTarget(); @@ -4631,6 +4880,10 @@ void command_corpse(Client *c, const Seperator *sep) c->Message(Chat::White, "Insufficient status to depop player corpse."); } + else if (strcasecmp(sep->arg[1], "moveallgraveyard") == 0) { + int count = entity_list.MovePlayerCorpsesToGraveyard(true); + c->Message(Chat::White, "Moved [%d] player corpse(s) to zone graveyard", count); + } else if (sep->arg[1][0] == 0 || strcasecmp(sep->arg[1], "help") == 0) { c->Message(Chat::White, "#Corpse Sub-Commands:"); c->Message(Chat::White, " DeleteNPCCorpses"); @@ -4638,6 +4891,7 @@ void command_corpse(Client *c, const Seperator *sep) c->Message(Chat::White, " ListNPC"); c->Message(Chat::White, " ListPlayer"); c->Message(Chat::White, " Lock - GM locks the corpse - cannot be looted by non-GM"); + c->Message(Chat::White, " MoveAllGraveyard - move all player corpses to zone's graveyard or non-instance"); c->Message(Chat::White, " UnLock"); c->Message(Chat::White, " RemoveCash"); c->Message(Chat::White, " InspectLoot"); @@ -4907,7 +5161,7 @@ void command_gmzone(Client *c, const Seperator *sep) const char *zone_short_name = sep->arg[1]; auto zone_version = static_cast(sep->arg[2] ? atoi(sep->arg[2]) : 0); std::string identifier = "gmzone"; - uint32 zone_id = content_db.GetZoneID(zone_short_name); + uint32 zone_id = ZoneID(zone_short_name); uint32 duration = 100000000; uint16 instance_id = 0; @@ -4945,7 +5199,7 @@ void command_gmzone(Client *c, const Seperator *sep) } if (instance_id > 0) { - float target_x = -1, target_y = -1, target_z = -1; + float target_x = -1, target_y = -1, target_z = -1, target_heading = -1; int16 min_status = 0; uint8 min_level = 0; @@ -4955,6 +5209,7 @@ void command_gmzone(Client *c, const Seperator *sep) &target_x, &target_y, &target_z, + &target_heading, &min_status, &min_level )) { @@ -4964,7 +5219,7 @@ void command_gmzone(Client *c, const Seperator *sep) c->Message(Chat::Yellow, "Zoning to private GM instance (%s) (%u)", zone_short_name, instance_id); c->AssignToInstance(instance_id); - c->MovePC(zone_id, instance_id, target_x, target_y, target_z, 0, 1); + c->MovePC(zone_id, instance_id, target_x, target_y, target_z, target_heading, 1); } } @@ -5148,7 +5403,7 @@ void command_memspell(Client *c, const Seperator *sep) { slot = atoi(sep->arg[1]) - 1; spell_id = atoi(sep->arg[2]); - if (slot > EQEmu::spells::SPELL_GEM_COUNT || spell_id >= SPDAT_RECORDS) + if (slot > EQ::spells::SPELL_GEM_COUNT || spell_id >= SPDAT_RECORDS) { c->Message(Chat::White, "Error: #MemSpell: Arguement out of range"); } @@ -5159,7 +5414,6 @@ void command_memspell(Client *c, const Seperator *sep) } } } - void command_save(Client *c, const Seperator *sep) { if (c->GetTarget() == 0) @@ -5194,6 +5448,153 @@ void command_showzonegloballoot(Client *c, const Seperator *sep) zone->ShowZoneGlobalLoot(c); } +void command_showzonepoints(Client *c, const Seperator *sep) +{ + auto &mob_list = entity_list.GetMobList(); + for (auto itr : mob_list) { + Mob *mob = itr.second; + if (mob->IsNPC() && mob->GetRace() == 2254) { + mob->Depop(); + } + } + + int found_zone_points = 0; + + c->Message(Chat::White, "Listing zone points..."); + c->SendChatLineBreak(); + + for (auto &virtual_zone_point : zone->virtual_zone_point_list) { + std::string zone_long_name = zone_store.GetZoneLongName(virtual_zone_point.target_zone_id); + + c->Message( + Chat::White, + fmt::format( + "Virtual Zone Point x [{}] y [{}] z [{}] h [{}] width [{}] height [{}] | To [{}] ({}) x [{}] y [{}] z [{}] h [{}]", + virtual_zone_point.x, + virtual_zone_point.y, + virtual_zone_point.z, + virtual_zone_point.heading, + virtual_zone_point.width, + virtual_zone_point.height, + zone_long_name.c_str(), + virtual_zone_point.target_zone_id, + virtual_zone_point.target_x, + virtual_zone_point.target_y, + virtual_zone_point.target_z, + virtual_zone_point.target_heading + ).c_str() + ); + + std::string node_name = fmt::format("ZonePoint To [{}]", zone_long_name); + + float half_width = ((float) virtual_zone_point.width / 2); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x + half_width, + (float) virtual_zone_point.y + half_width, + virtual_zone_point.z, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x + half_width, + (float) virtual_zone_point.y - half_width, + virtual_zone_point.z, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x - half_width, + (float) virtual_zone_point.y - half_width, + virtual_zone_point.z, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x - half_width, + (float) virtual_zone_point.y + half_width, + virtual_zone_point.z, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x + half_width, + (float) virtual_zone_point.y + half_width, + (float) virtual_zone_point.z + (float) virtual_zone_point.height, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x + half_width, + (float) virtual_zone_point.y - half_width, + (float) virtual_zone_point.z + (float) virtual_zone_point.height, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x - half_width, + (float) virtual_zone_point.y - half_width, + (float) virtual_zone_point.z + (float) virtual_zone_point.height, + virtual_zone_point.heading + )); + + NPC::SpawnZonePointNodeNPC(node_name, glm::vec4( + (float) virtual_zone_point.x - half_width, + (float) virtual_zone_point.y + half_width, + (float) virtual_zone_point.z + (float) virtual_zone_point.height, + virtual_zone_point.heading + )); + + found_zone_points++; + } + + LinkedListIterator iterator(zone->zone_point_list); + iterator.Reset(); + while (iterator.MoreElements()) { + ZonePoint *zone_point = iterator.GetData(); + std::string zone_long_name = zone_store.GetZoneLongName(zone_point->target_zone_id); + std::string node_name = fmt::format("ZonePoint To [{}]", zone_long_name); + + NPC::SpawnZonePointNodeNPC( + node_name, glm::vec4( + zone_point->x, + zone_point->y, + zone_point->z, + zone_point->heading + ) + ); + + c->Message( + Chat::White, + fmt::format( + "Client Side Zone Point x [{}] y [{}] z [{}] h [{}] number [{}] | To [{}] ({}) x [{}] y [{}] z [{}] h [{}]", + zone_point->x, + zone_point->y, + zone_point->z, + zone_point->heading, + zone_point->number, + zone_long_name.c_str(), + zone_point->target_zone_id, + zone_point->target_x, + zone_point->target_y, + zone_point->target_z, + zone_point->target_heading + ).c_str() + ); + + iterator.Advance(); + + found_zone_points++; + } + + if (found_zone_points == 0) { + c->Message(Chat::White, "There were no zone points found..."); + } + + c->SendChatLineBreak(); + +} + void command_mystats(Client *c, const Seperator *sep) { if (c->GetTarget() && c->GetPet()) { @@ -5240,45 +5641,21 @@ void command_depopzone(Client *c, const Seperator *sep) void command_devtools(Client *c, const Seperator *sep) { - std::string menu_commands_search; - std::string window_toggle_command; - - /** - * Search entity commands - */ - menu_commands_search += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#list npcs", false, "NPC") + "] "; - menu_commands_search += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#list players", false, "Players") + "] "; - menu_commands_search += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#list corpses", false, "Corpses") + "] "; - menu_commands_search += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#list doors", false, "Doors") + "] "; - menu_commands_search += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#list objects", false, "Objects") + "] "; - - std::string dev_tools_window_key = StringFormat("%i-dev-tools-window-disabled", c->AccountID()); + std::string dev_tools_key = StringFormat("%i-dev-tools-disabled", c->AccountID()); /** * Handle window toggle */ - if (strcasecmp(sep->arg[1], "disable_window") == 0) { - DataBucket::SetData(dev_tools_window_key, "true"); - c->SetDevToolsWindowEnabled(false); + if (strcasecmp(sep->arg[1], "disable") == 0) { + DataBucket::SetData(dev_tools_key, "true"); + c->SetDevToolsEnabled(false); } - if (strcasecmp(sep->arg[1], "enable_window") == 0) { - DataBucket::DeleteData(dev_tools_window_key); - c->SetDevToolsWindowEnabled(true); + if (strcasecmp(sep->arg[1], "enable") == 0) { + DataBucket::DeleteData(dev_tools_key); + c->SetDevToolsEnabled(true); } - /** - * Show window status - */ - window_toggle_command = "Disabled [" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#devtools enable_window", false, "Enable") + "] "; - if (c->IsDevToolsWindowEnabled()) { - window_toggle_command = "Enabled [" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#devtools disable_window", false, "Disable") + "] "; - } - - /** - * Print menu - */ - c->Message(Chat::White, "| [Devtools] Window %s", window_toggle_command.c_str()); - c->Message(Chat::White, "| [Devtools] Search %s", menu_commands_search.c_str()); + c->ShowDevToolsMenu(); } void command_repop(Client *c, const Seperator *sep) @@ -5516,7 +5893,7 @@ void command_proximity(Client *c, const Seperator *sep) points.push_back(p); } - if (c->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) { + if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) { c->SendPathPacket(points); } } @@ -5693,7 +6070,7 @@ void command_killallnpcs(Client *c, const Seperator *sep) continue; } - entity->Damage(c, 1000000000, 0, EQEmu::skills::SkillDragonPunch); + entity->Damage(c, 1000000000, 0, EQ::skills::SkillDragonPunch); count++; } @@ -5729,7 +6106,7 @@ void command_damage(Client *c, const Seperator *sep) if (nkdmg > 2100000000) c->Message(Chat::White, "Enter a value less then 2,100,000,000."); else - c->GetTarget()->Damage(c, nkdmg, SPELL_UNKNOWN, EQEmu::skills::SkillHandtoHand, false); + c->GetTarget()->Damage(c, nkdmg, SPELL_UNKNOWN, EQ::skills::SkillHandtoHand, false); } } @@ -5919,7 +6296,7 @@ void command_goto(Client *c, const Seperator *sep) void command_iteminfo(Client *c, const Seperator *sep) { - auto inst = c->GetInv()[EQEmu::invslot::slotCursor]; + auto inst = c->GetInv()[EQ::invslot::slotCursor]; if (!inst) { c->Message(Chat::Red, "Error: You need an item on your cursor for this command"); return; @@ -5931,8 +6308,8 @@ void command_iteminfo(Client *c, const Seperator *sep) return; } - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemInst); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemInst); linker.SetItemInst(inst); c->Message(Chat::White, "*** Item Info for [%s] ***", linker.GenerateLink().c_str()); @@ -6497,6 +6874,326 @@ void command_doanim(Client *c, const Seperator *sep) c->DoAnim(atoi(sep->arg[1]),atoi(sep->arg[2])); } +void command_dz(Client* c, const Seperator* sep) +{ + if (!c || !zone) { + return; + } + + if (strcasecmp(sep->arg[1], "expedition") == 0) + { + if (strcasecmp(sep->arg[2], "list") == 0) + { + std::vector expeditions; + for (const auto& expedition : zone->expedition_cache) + { + expeditions.emplace_back(expedition.second.get()); + } + + std::sort(expeditions.begin(), expeditions.end(), + [](const Expedition* lhs, const Expedition* rhs) { + return lhs->GetID() < rhs->GetID(); + }); + + c->Message(Chat::White, fmt::format("Total Active Expeditions: [{}]", expeditions.size()).c_str()); + for (const auto& expedition : expeditions) + { + auto leader_saylink = EQ::SayLinkEngine::GenerateQuestSaylink(fmt::format( + "#goto {}", expedition->GetLeaderName()), false, expedition->GetLeaderName()); + auto zone_saylink = EQ::SayLinkEngine::GenerateQuestSaylink(fmt::format( + "#zoneinstance {}", expedition->GetDynamicZone().GetInstanceID()), false, "zone"); + + auto seconds = expedition->GetDynamicZone().GetSecondsRemaining(); + + c->Message(Chat::White, fmt::format( + "expedition id: [{}] dz id: [{}] name: [{}] leader: [{}] {}: [{}]:[{}]:[{}]:[{}] members: [{}] remaining: [{:02}:{:02}:{:02}]", + expedition->GetID(), + expedition->GetDynamicZone().GetID(), + expedition->GetName(), + leader_saylink, + zone_saylink, + ZoneName(expedition->GetDynamicZone().GetZoneID()), + expedition->GetDynamicZone().GetZoneID(), + expedition->GetDynamicZone().GetInstanceID(), + expedition->GetDynamicZone().GetZoneVersion(), + expedition->GetMemberCount(), + seconds / 3600, // hours + (seconds / 60) % 60, // minutes + seconds % 60 // seconds + ).c_str()); + } + } + else if (strcasecmp(sep->arg[2], "reload") == 0) + { + Expedition::CacheAllFromDatabase(); + c->Message(Chat::White, fmt::format( + "Reloaded [{}] expeditions to cache from database.", zone->expedition_cache.size() + ).c_str()); + } + else if (strcasecmp(sep->arg[2], "destroy") == 0 && sep->IsNumber(3)) + { + auto expedition_id = std::strtoul(sep->arg[3], nullptr, 10); + auto expedition = Expedition::FindCachedExpeditionByID(expedition_id); + if (expedition) + { + c->Message(Chat::White, fmt::format("Destroying expedition [{}] ({})", + expedition_id, expedition->GetName()).c_str()); + expedition->RemoveAllMembers(); + } + else + { + c->Message(Chat::Red, fmt::format("Failed to destroy expedition [{}]", sep->arg[3]).c_str()); + } + } + else if (strcasecmp(sep->arg[2], "unlock") == 0 && sep->IsNumber(3)) + { + auto expedition_id = std::strtoul(sep->arg[3], nullptr, 10); + auto expedition = Expedition::FindCachedExpeditionByID(expedition_id); + if (expedition) + { + c->Message(Chat::White, fmt::format("Unlocking expedition [{}]", expedition_id).c_str()); + expedition->SetLocked(false, ExpeditionLockMessage::None, true); + } + else + { + c->Message(Chat::Red, fmt::format("Failed to find expedition [{}]", sep->arg[3]).c_str()); + } + } + } + else if (strcasecmp(sep->arg[1], "list") == 0) + { + auto dz_list = DynamicZonesRepository::AllDzInstancePlayerCounts(database); + c->Message(Chat::White, fmt::format("Total Dynamic Zones: [{}]", dz_list.size()).c_str()); + + auto now = std::chrono::system_clock::now(); + + for (const auto& dz : dz_list) + { + auto expire_time = std::chrono::system_clock::from_time_t(dz.start_time + dz.duration); + auto remaining = std::chrono::duration_cast(expire_time - now); + auto seconds = std::max(0, static_cast(remaining.count())); + bool is_expired = now > expire_time; + + if (!is_expired || strcasecmp(sep->arg[2], "all") == 0) + { + auto zone_saylink = is_expired ? "zone" : EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format("#zoneinstance {}", dz.instance), false, "zone"); + + c->Message(Chat::White, fmt::format( + "dz id: [{}] type: [{}] {}: [{}]:[{}]:[{}] members: [{}] remaining: [{:02}:{:02}:{:02}]", + dz.id, + dz.type, + zone_saylink, + dz.zone, + dz.instance, + dz.version, + dz.player_count, + seconds / 3600, // hours + (seconds / 60) % 60, // minutes + seconds % 60 // seconds + ).c_str()); + } + } + } + else if (strcasecmp(sep->arg[1], "lockouts") == 0) + { + if (strcasecmp(sep->arg[2], "remove") == 0 && sep->arg[3][0] != '\0') + { + if (sep->arg[5][0] == '\0') + { + c->Message(Chat::White, fmt::format( + "Removing [{}] lockouts on [{}].", sep->arg[4][0] ? sep->arg[4] : "all", sep->arg[3] + ).c_str()); + } + else + { + c->Message(Chat::White, fmt::format( + "Removing [{}]:[{}] lockout on [{}].", sep->arg[4], sep->arg[5], sep->arg[3] + ).c_str()); + } + Expedition::RemoveLockoutsByCharacterName(sep->arg[3], sep->arg[4], sep->arg[5]); + } + } + else if (strcasecmp(sep->arg[1], "makeleader") == 0 && sep->IsNumber(2) && sep->arg[3][0] != '\0') + { + auto expedition_id = std::strtoul(sep->arg[2], nullptr, 10); + auto expedition = Expedition::FindCachedExpeditionByID(expedition_id); + if (expedition) + { + auto char_name = FormatName(sep->arg[3]); + c->Message(Chat::White, fmt::format("Setting expedition [{}] leader to [{}]", expedition_id, char_name).c_str()); + expedition->SendWorldMakeLeaderRequest(c->CharacterID(), char_name); + } + else + { + c->Message(Chat::Red, fmt::format("Failed to find expedition [{}]", expedition_id).c_str()); + } + } + else + { + c->Message(Chat::White, "#dz usage:"); + c->Message(Chat::White, "#dz expedition list - list expeditions in current zone cache"); + c->Message(Chat::White, "#dz expedition reload - reload expedition zone cache from database"); + c->Message(Chat::White, "#dz expedition destroy - destroy expedition globally (must be in cache)"); + c->Message(Chat::White, "#dz expedition unlock - unlock expedition"); + c->Message(Chat::White, "#dz list [all] - list dynamic zone instances from database -- 'all' includes expired"); + c->Message(Chat::White, "#dz lockouts remove - delete all of character's expedition lockouts"); + c->Message(Chat::White, "#dz lockouts remove \"\" - delete lockouts by expedition"); + c->Message(Chat::White, "#dz lockouts remove \"\" \"\" - delete lockout by expedition event"); + c->Message(Chat::White, "#dz makeleader - set new expedition leader"); + } +} + +void command_dzkickplayers(Client* c, const Seperator* sep) +{ + if (c) + { + auto expedition = c->GetExpedition(); + if (expedition) + { + expedition->DzKickPlayers(c); + } + } +} + +void command_editmassrespawn(Client* c, const Seperator* sep) +{ + if (strcasecmp(sep->arg[1], "usage") == 0) { + c->Message(Chat::White, "#editmassrespawn [exact_match: =]npc_type_name new_respawn_seconds (apply)"); + return; + } + + std::string search_npc_type; + if (sep->arg[1]) { + search_npc_type = sep->arg[1]; + } + + int change_respawn_seconds = 0; + if (sep->arg[2] && sep->IsNumber(2)) { + change_respawn_seconds = atoi(sep->arg[2]); + } + + bool change_apply = false; + if (sep->arg[3] && strcasecmp(sep->arg[3], "apply") == 0) { + change_apply = true; + } + + std::string search_encapsulator = "%"; + if (search_npc_type[0] == '=') { + + search_npc_type = search_npc_type.substr(1); + search_encapsulator = ""; + } + + std::string query = fmt::format( + SQL( + SELECT npc_types.id, spawn2.spawngroupID, spawn2.id, npc_types.name, spawn2.respawntime + FROM spawn2 + INNER JOIN spawnentry ON spawn2.spawngroupID = spawnentry.spawngroupID + INNER JOIN npc_types ON spawnentry.npcID = npc_types.id + WHERE spawn2.zone LIKE '{}' + AND spawn2.version = '{}' + AND npc_types.name LIKE '{}{}{}' + ORDER BY npc_types.id, spawn2.spawngroupID, spawn2.id + ), + zone->GetShortName(), + zone->GetInstanceVersion(), + search_encapsulator, + search_npc_type, + search_encapsulator + ); + + std::string status = "(Searching)"; + if (change_apply) { + status = "(Applying)"; + } + + int results_count = 0; + + auto results = content_db.QueryDatabase(query); + if (results.Success() && results.RowCount()) { + + results_count = results.RowCount(); + + for (auto row : results) { + c->Message( + Chat::Yellow, + fmt::format( + "NPC (npcid:{}) (sgid:{}) (s2id:{}) [{}] Respawn: Current [{}] New [{}] {}", + row[0], + row[1], + row[2], + row[3], + row[4], + change_respawn_seconds, + status + ).c_str() + ); + } + + c->Message(Chat::Yellow, "Found (%i) NPC's that match this search...", results_count); + + if (change_respawn_seconds > 0) { + + if (change_apply) { + + results = content_db.QueryDatabase( + fmt::format( + SQL( + UPDATE spawn2 + SET respawntime = '{}' + WHERE id IN ( + SELECT spawn2.id + FROM spawn2 + INNER JOIN spawnentry ON spawn2.spawngroupID = spawnentry.spawngroupID + INNER JOIN npc_types ON spawnentry.npcID = npc_types.id + WHERE spawn2.zone LIKE '{}' + AND spawn2.version = '{}' + AND npc_types.name LIKE '{}{}{}' + ) + ), + change_respawn_seconds, + zone->GetShortName(), + zone->GetInstanceVersion(), + search_encapsulator, + search_npc_type, + search_encapsulator + ) + ); + + if (results.Success()) { + + c->Message(Chat::Yellow, "Changes applied to (%i) NPC 'Spawn2' entries", results_count); + zone->Repop(); + } + else { + + c->Message(Chat::Yellow, "Found (0) NPC's that match this search..."); + } + } + else { + + std::string saylink = fmt::format( + "#editmassrespawn {}{} {} apply", + (search_encapsulator.empty() ? "=" : ""), + search_npc_type, + change_respawn_seconds + ); + + c->Message( + Chat::Yellow, "To apply these changes, click <%s> or type [%s]", + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), + saylink.c_str() + ); + } + } + } + else { + + c->Message(Chat::Yellow, "Found (0) NPC's that match this search..."); + } +} + void command_randomfeatures(Client *c, const Seperator *sep) { Mob *target=c->GetTarget(); @@ -6859,7 +7556,7 @@ void command_scribespells(Client *c, const Seperator *sep) int spell_id = 0; int count = 0; - for ( ; spell_id < SPDAT_RECORDS && book_slot < EQEmu::spells::SPELLBOOK_SIZE; ++spell_id) { + for ( ; spell_id < SPDAT_RECORDS && book_slot < EQ::spells::SPELLBOOK_SIZE; ++spell_id) { if (book_slot == -1) { t->Message( 13, @@ -6882,8 +7579,8 @@ void command_scribespells(Client *c, const Seperator *sep) c->Message(Chat::Red, "FATAL ERROR: Spell id out-of-range (id: %i, min: 0, max: %i)", spell_id, SPDAT_RECORDS); return; } - if (book_slot < 0 || book_slot >= EQEmu::spells::SPELLBOOK_SIZE) { - c->Message(Chat::Red, "FATAL ERROR: Book slot out-of-range (slot: %i, min: 0, max: %i)", book_slot, EQEmu::spells::SPELLBOOK_SIZE); + if (book_slot < 0 || book_slot >= EQ::spells::SPELLBOOK_SIZE) { + c->Message(Chat::Red, "FATAL ERROR: Book slot out-of-range (slot: %i, min: 0, max: %i)", book_slot, EQ::spells::SPELLBOOK_SIZE); return; } @@ -7118,9 +7815,9 @@ void command_summonitem(Client *c, const Seperator *sep) std::string cmd_msg = sep->msg; size_t link_open = cmd_msg.find('\x12'); size_t link_close = cmd_msg.find_last_of('\x12'); - if (link_open != link_close && (cmd_msg.length() - link_open) > EQEmu::constants::SAY_LINK_BODY_SIZE) { - EQEmu::SayLinkBody_Struct link_body; - EQEmu::saylink::DegenerateLinkBody(link_body, cmd_msg.substr(link_open + 1, EQEmu::constants::SAY_LINK_BODY_SIZE)); + if (link_open != link_close && (cmd_msg.length() - link_open) > EQ::constants::SAY_LINK_BODY_SIZE) { + EQ::SayLinkBody_Struct link_body; + EQ::saylink::DegenerateLinkBody(link_body, cmd_msg.substr(link_open + 1, EQ::constants::SAY_LINK_BODY_SIZE)); itemid = link_body.item_id; } else if (!sep->IsNumber(1)) { @@ -7136,7 +7833,7 @@ void command_summonitem(Client *c, const Seperator *sep) } int16 item_status = 0; - const EQEmu::ItemData* item = database.GetItem(itemid); + const EQ::ItemData* item = database.GetItem(itemid); if (item) { item_status = static_cast(item->MinStatus); } @@ -7204,7 +7901,7 @@ void command_giveitem(Client *c, const Seperator *sep) Client *t = c->GetTarget()->CastToClient(); uint32 itemid = atoi(sep->arg[1]); int16 item_status = 0; - const EQEmu::ItemData* item = database.GetItem(itemid); + const EQ::ItemData* item = database.GetItem(itemid); if(item) { item_status = static_cast(item->MinStatus); } @@ -7257,9 +7954,9 @@ void command_itemsearch(Client *c, const Seperator *sep) { const char *search_criteria=sep->argplus[1]; - const EQEmu::ItemData* item = nullptr; - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemData); + const EQ::ItemData* item = nullptr; + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); if (Seperator::IsNumber(search_criteria)) { item = database.GetItem(atoi(search_criteria)); @@ -7275,13 +7972,6 @@ void command_itemsearch(Client *c, const Seperator *sep) return; } - std::vector amounts = { - "1", - "10", - "100", - "1000" - }; - int count = 0; char sName[64]; char sCriteria[255]; @@ -7295,14 +7985,25 @@ void command_itemsearch(Client *c, const Seperator *sep) pdest = strstr(sName, sCriteria); if (pdest != nullptr) { linker.SetItemData(item); - - std::string saylink_commands; - for (auto &amount : amounts) { - saylink_commands += EQEmu::SayLinkEngine::GenerateQuestSaylink( - "#si " + std::to_string(item->ID) + " " + amount, + std::string item_id = std::to_string(item->ID); + std::string saylink_commands = + "[" + + EQ::SayLinkEngine::GenerateQuestSaylink( + "#si " + item_id, false, - "[" + amount + "] " - ); + "X" + ) + + "] "; + if (item->Stackable && item->StackSize > 1) { + std::string stack_size = std::to_string(item->StackSize); + saylink_commands += + "[" + + EQ::SayLinkEngine::GenerateQuestSaylink( + "#si " + item_id + " " + stack_size, + false, + stack_size + ) + + "]"; } c->Message( @@ -7310,8 +8011,8 @@ void command_itemsearch(Client *c, const Seperator *sep) fmt::format( " Summon {} [{}] [{}]", saylink_commands, - item->ID, - linker.GenerateLink() + linker.GenerateLink(), + item->ID ).c_str() ); @@ -7389,14 +8090,10 @@ void command_setcrystals(Client *c, const Seperator *sep) else if(!strcasecmp(sep->arg[1], "radiant")) { t->SetRadiantCrystals(atoi(sep->arg[2])); - t->SendCrystalCounts(); - t->SaveCurrency(); } else if(!strcasecmp(sep->arg[1], "ebon")) { t->SetEbonCrystals(atoi(sep->arg[2])); - t->SendCrystalCounts(); - t->SaveCurrency(); } else { @@ -7807,10 +8504,10 @@ void command_npcemote(Client *c, const Seperator *sep) void command_npceditmass(Client *c, const Seperator *sep) { if (strcasecmp(sep->arg[1], "usage") == 0) { - c->Message(Chat::White, "#npceditmass search_column [exact_match: =]search_value change_column change_value"); + c->Message(Chat::White, "#npceditmass search_column [exact_match: =]search_value change_column change_value (apply)"); return; } - + std::string query = SQL( SELECT COLUMN_NAME @@ -7931,7 +8628,7 @@ void command_npceditmass(Client *c, const Seperator *sep) continue; } } - + c->Message( Chat::Yellow, fmt::format( @@ -7955,7 +8652,7 @@ void command_npceditmass(Client *c, const Seperator *sep) std::string saylink = fmt::format( "#npceditmass {} {}{} {} {} apply", search_column, - (exact_match ? '=' : '\0'), + (exact_match ? "=" : ""), search_value, change_column, change_value @@ -7986,7 +8683,7 @@ void command_npceditmass(Client *c, const Seperator *sep) if (found_count > 0) { c->Message( Chat::Yellow, "To apply these changes, click <%s> or type [%s]", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), saylink.c_str() ); } @@ -8082,6 +8779,8 @@ void command_npcedit(Client *c, const Seperator *sep) c->Message(Chat::White, "#npcedit version - Set an NPC's version"); c->Message(Chat::White, "#npcedit slow_mitigation - Set an NPC's slow mitigation"); c->Message(Chat::White, "#npcedit flymode - Set an NPC's flymode [0 = ground, 1 = flying, 2 = levitate, 3 = water, 4 = floating]"); + c->Message(Chat::White, "#npcedit raidtarget - Set an NPCs raid_target field"); + c->Message(Chat::White, "#npcedit respawntime - Set an NPCs respawn timer in seconds"); } @@ -8680,6 +9379,24 @@ void command_npcedit(Client *c, const Seperator *sep) return; } + if (strcasecmp(sep->arg[1], "raidtarget") == 0) { + if (sep->arg[2][0] && sep->IsNumber(sep->arg[2]) && atoi(sep->arg[2]) >= 0) { + c->Message(Chat::Yellow, "NPCID %u is %s as a raid target.", npcTypeID, atoi(sep->arg[2]) == 0 ? "no longer designated" : "now designated"); + std::string query = StringFormat("UPDATE npc_types SET raid_target = %i WHERE id = %i", atoi(sep->arg[2]), npcTypeID); + content_db.QueryDatabase(query); + return; + } + } + + if (strcasecmp(sep->arg[1], "respawntime") == 0) { + if (sep->arg[2][0] && sep->IsNumber(sep->arg[2]) && atoi(sep->arg[2]) > 0) { + c->Message(Chat::Yellow, "NPCID %u (spawngroup %i) respawn time set to %i.", npcTypeID, c->GetTarget()->CastToNPC()->GetSpawnGroupId(), atoi(sep->arg[2])); + std::string query = StringFormat("UPDATE spawn2 SET respawntime = %i WHERE spawngroupID = %i AND version = %i", atoi(sep->arg[2]), c->GetTarget()->CastToNPC()->GetSpawnGroupId(), zone->GetInstanceVersion()); + content_db.QueryDatabase(query); + return; + } + } + if((sep->arg[1][0] == 0 || strcasecmp(sep->arg[1],"*")==0) || ((c->GetTarget()==0) || (c->GetTarget()->IsClient()))) c->Message(Chat::White, "Type #npcedit help for more info"); @@ -8774,9 +9491,9 @@ void command_path(Client *c, const Seperator *sep) } void Client::Undye() { - for (int cur_slot = EQEmu::textures::textureBegin; cur_slot <= EQEmu::textures::LastTexture; cur_slot++) { + for (int cur_slot = EQ::textures::textureBegin; cur_slot <= EQ::textures::LastTexture; cur_slot++) { uint8 slot2=SlotConvert(cur_slot); - EQEmu::ItemInstance* inst = m_inv.GetItem(slot2); + EQ::ItemInstance* inst = m_inv.GetItem(slot2); if(inst != nullptr) { inst->SetColor(inst->GetItem()->Color); @@ -8815,30 +9532,30 @@ void command_ucs(Client *c, const Seperator *sep) std::string buffer; std::string MailKey = database.GetMailKey(c->CharacterID(), true); - EQEmu::versions::UCSVersion ConnectionType = EQEmu::versions::ucsUnknown; + EQ::versions::UCSVersion ConnectionType = EQ::versions::ucsUnknown; // chat server packet switch (c->ClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: - ConnectionType = EQEmu::versions::ucsTitaniumChat; + case EQ::versions::ClientVersion::Titanium: + ConnectionType = EQ::versions::ucsTitaniumChat; break; - case EQEmu::versions::ClientVersion::SoF: - ConnectionType = EQEmu::versions::ucsSoFCombined; + case EQ::versions::ClientVersion::SoF: + ConnectionType = EQ::versions::ucsSoFCombined; break; - case EQEmu::versions::ClientVersion::SoD: - ConnectionType = EQEmu::versions::ucsSoDCombined; + case EQ::versions::ClientVersion::SoD: + ConnectionType = EQ::versions::ucsSoDCombined; break; - case EQEmu::versions::ClientVersion::UF: - ConnectionType = EQEmu::versions::ucsUFCombined; + case EQ::versions::ClientVersion::UF: + ConnectionType = EQ::versions::ucsUFCombined; break; - case EQEmu::versions::ClientVersion::RoF: - ConnectionType = EQEmu::versions::ucsRoFCombined; + case EQ::versions::ClientVersion::RoF: + ConnectionType = EQ::versions::ucsRoFCombined; break; - case EQEmu::versions::ClientVersion::RoF2: - ConnectionType = EQEmu::versions::ucsRoF2Combined; + case EQ::versions::ClientVersion::RoF2: + ConnectionType = EQ::versions::ucsRoF2Combined; break; default: - ConnectionType = EQEmu::versions::ucsUnknown; + ConnectionType = EQ::versions::ucsUnknown; break; } @@ -8860,8 +9577,8 @@ void command_ucs(Client *c, const Seperator *sep) // mail server packet switch (c->ClientVersion()) { - case EQEmu::versions::ClientVersion::Titanium: - ConnectionType = EQEmu::versions::ucsTitaniumMail; + case EQ::versions::ClientVersion::Titanium: + ConnectionType = EQ::versions::ucsTitaniumMail; break; default: // retain value from previous switch @@ -9067,7 +9784,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } if(zoneid < 1) { @@ -9092,7 +9809,7 @@ void command_flagedit(Client *c, const Seperator *sep) { return; } - c->Message(Chat::Yellow, "Success! Zone %s now requires a flag, named %s", content_db.GetZoneName(zoneid), flag_name); + c->Message(Chat::Yellow, "Success! Zone %s now requires a flag, named %s", ZoneName(zoneid), flag_name); return; } @@ -9101,7 +9818,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } @@ -9119,7 +9836,7 @@ void command_flagedit(Client *c, const Seperator *sep) { return; } - c->Message(Chat::Yellow, "Success! Zone %s no longer requires a flag.", content_db.GetZoneName(zoneid)); + c->Message(Chat::Yellow, "Success! Zone %s no longer requires a flag.", ZoneName(zoneid)); return; } @@ -9143,7 +9860,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } if(zoneid < 1) { @@ -9166,7 +9883,7 @@ void command_flagedit(Client *c, const Seperator *sep) { if(sep->arg[2][0] != '\0') { zoneid = atoi(sep->arg[2]); if(zoneid < 1) { - zoneid = content_db.GetZoneID(sep->arg[2]); + zoneid = ZoneID(sep->arg[2]); } } if(zoneid < 1) { @@ -9433,76 +10150,135 @@ void command_rules(Client *c, const Seperator *sep) { void command_task(Client *c, const Seperator *sep) { //super-command for managing tasks if(sep->arg[1][0] == '\0' || !strcasecmp(sep->arg[1], "help")) { - c->Message(Chat::White, "Syntax: #task [subcommand]."); - c->Message(Chat::White, "-- Task System Commands --"); - c->Message(Chat::White, "...show - List active tasks for a client"); - c->Message(Chat::White, "...update [Count]"); - c->Message(Chat::White, "...reloadall - Reload all Task information from the database"); - c->Message(Chat::White, "...reload task - Reload Task and Activity informnation for a single task"); - c->Message(Chat::White, "...reload lists - Reload goal/reward list information"); - c->Message(Chat::White, "...reload prox - Reload proximity information"); - c->Message(Chat::White, "...reload sets - Reload task set information"); + c->Message(Chat::White, "Syntax: #task [subcommand]"); + c->Message(Chat::White, "------------------------------------------------"); + c->Message(Chat::White, "# Task System Commands"); + c->Message(Chat::White, "------------------------------------------------"); + c->Message( + Chat::White, + fmt::format( + "--- [{}] List active tasks for a client", + EQ::SayLinkEngine::GenerateQuestSaylink("#task show", false, "show") + ).c_str() + ); + c->Message(Chat::White, "--- update [count] | Updates task"); + c->Message(Chat::White, "--- assign | Assigns task to client"); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload all Task information from the database", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reloadall", false, "reloadall") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload Task and Activity information for a single task", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload task", false, "reload task") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload goal/reward list information", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload lists", false, "reload lists") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload proximity information", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload prox", false, "reload prox") + ).c_str() + ); + c->Message( + Chat::White, + fmt::format( + "--- [{}] Reload task set information", + EQ::SayLinkEngine::GenerateQuestSaylink("#task reload sets", false, "reload sets") + ).c_str() + ); return; } - if(!strcasecmp(sep->arg[1], "show")) { - if(c->GetTarget() && c->GetTarget()->IsClient()) - c->GetTarget()->CastToClient()->ShowClientTasks(); - else - c->ShowClientTasks(); + Client *client_target = c; + if (c->GetTarget() && c->GetTarget()->IsClient()) { + client_target = c->GetTarget()->CastToClient(); + } + if (!strcasecmp(sep->arg[1], "show")) { + c->ShowClientTasks(client_target); return; } - if(!strcasecmp(sep->arg[1], "update")) { - if(sep->argnum>=3) { - int TaskID = atoi(sep->arg[2]); - int ActivityID = atoi(sep->arg[3]); - int Count=1; + if (!strcasecmp(sep->arg[1], "update")) { + if (sep->argnum >= 3) { + int task_id = atoi(sep->arg[2]); + int activity_id = atoi(sep->arg[3]); + int count = 1; - if(sep->argnum>=4) { - Count = atoi(sep->arg[4]); - if(Count <= 0) - Count = 1; + if (sep->argnum >= 4) { + count = atoi(sep->arg[4]); + if (count <= 0) { + count = 1; + } } - c->Message(Chat::Yellow, "Updating Task %i, Activity %i, Count %i", TaskID, ActivityID, Count); - c->UpdateTaskActivity(TaskID, ActivityID, Count); + c->Message( + Chat::Yellow, + "Updating Task [%i] Activity [%i] Count [%i] for client [%s]", + task_id, + activity_id, + count, + client_target->GetCleanName() + ); + client_target->UpdateTaskActivity(task_id, activity_id, count); + c->ShowClientTasks(client_target); } return; } - if(!strcasecmp(sep->arg[1], "reloadall")) { + + if (!strcasecmp(sep->arg[1], "assign")) { + int task_id = atoi(sep->arg[2]); + if ((task_id > 0) && (task_id < MAXTASKS)) { + client_target->AssignTask(task_id, 0, false); + c->Message(Chat::Yellow, "Assigned task [%i] to [%s]", task_id, client_target->GetCleanName()); + } + return; + } + + if (!strcasecmp(sep->arg[1], "reloadall")) { c->Message(Chat::Yellow, "Sending reloadtasks to world"); worldserver.SendReloadTasks(RELOADTASKS); c->Message(Chat::Yellow, "Back again"); return; } - if(!strcasecmp(sep->arg[1], "reload")) { - if(sep->arg[2][0] != '\0') { - if(!strcasecmp(sep->arg[2], "lists")) { + if (!strcasecmp(sep->arg[1], "reload")) { + if (sep->arg[2][0] != '\0') { + if (!strcasecmp(sep->arg[2], "lists")) { c->Message(Chat::Yellow, "Sending reload lists to world"); worldserver.SendReloadTasks(RELOADTASKGOALLISTS); - c->Message(Chat::Yellow, "Back again"); + c->Message(Chat::Yellow, "Reloaded"); return; } - if(!strcasecmp(sep->arg[2], "prox")) { + if (!strcasecmp(sep->arg[2], "prox")) { c->Message(Chat::Yellow, "Sending reload proximities to world"); worldserver.SendReloadTasks(RELOADTASKPROXIMITIES); - c->Message(Chat::Yellow, "Back again"); + c->Message(Chat::Yellow, "Reloaded"); return; } - if(!strcasecmp(sep->arg[2], "sets")) { + if (!strcasecmp(sep->arg[2], "sets")) { c->Message(Chat::Yellow, "Sending reload task sets to world"); worldserver.SendReloadTasks(RELOADTASKSETS); - c->Message(Chat::Yellow, "Back again"); + c->Message(Chat::Yellow, "Reloaded"); return; } - if(!strcasecmp(sep->arg[2], "task") && (sep->arg[3][0] != '\0')) { - int TaskID = atoi(sep->arg[3]); - if((TaskID > 0) && (TaskID < MAXTASKS)) { - c->Message(Chat::Yellow, "Sending reload task %i to world"); - worldserver.SendReloadTasks(RELOADTASKS, TaskID); - c->Message(Chat::Yellow, "Back again"); + if (!strcasecmp(sep->arg[2], "task") && (sep->arg[3][0] != '\0')) { + int task_id = atoi(sep->arg[3]); + if ((task_id > 0) && (task_id < MAXTASKS)) { + c->Message(Chat::Yellow, "Sending reload task %i to world", task_id); + worldserver.SendReloadTasks(RELOADTASKS, task_id); + c->Message(Chat::Yellow, "Reloaded"); return; } } @@ -9631,7 +10407,7 @@ void command_setgraveyard(Client *c, const Seperator *sep) return; } - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); if(zoneid > 0) { graveyard_id = content_db.CreateGraveyardRecord(zoneid, t->GetPosition()); @@ -9667,7 +10443,7 @@ void command_deletegraveyard(Client *c, const Seperator *sep) return; } - zoneid = content_db.GetZoneID(sep->arg[1]); + zoneid = ZoneID(sep->arg[1]); graveyard_id = content_db.GetZoneGraveyardID(zoneid, 0); if(zoneid > 0 && graveyard_id > 0) { @@ -10072,12 +10848,12 @@ void command_instance(Client *c, const Seperator *sep) } else { - zone_id = content_db.GetZoneID(sep->arg[2]); + zone_id = ZoneID(sep->arg[2]); } uint32 version = atoi(sep->arg[3]); uint32 duration = atoi(sep->arg[4]); - zn = content_db.GetZoneName(zone_id); + zn = ZoneName(zone_id); if(!zn) { @@ -10232,7 +11008,7 @@ void command_setstartzone(Client *c, const Seperator *sep) startzone = 0; } else { - startzone = content_db.GetZoneID(sep->arg[1]); + startzone = ZoneID(sep->arg[1]); if(startzone == 0) { c->Message(Chat::White, "Unable to locate zone '%s'", sep->arg[1]); return; @@ -11749,16 +12525,16 @@ void command_max_all_skills(Client *c, const Seperator *sep) { if(c) { - for (int i = 0; i <= EQEmu::skills::HIGHEST_SKILL; ++i) + for (int i = 0; i <= EQ::skills::HIGHEST_SKILL; ++i) { - if (i >= EQEmu::skills::SkillSpecializeAbjure && i <= EQEmu::skills::SkillSpecializeEvocation) + if (i >= EQ::skills::SkillSpecializeAbjure && i <= EQ::skills::SkillSpecializeEvocation) { - c->SetSkill((EQEmu::skills::SkillType)i, 50); + c->SetSkill((EQ::skills::SkillType)i, 50); } else { - int max_skill_level = database.GetSkillCap(c->GetClass(), (EQEmu::skills::SkillType)i, c->GetLevel()); - c->SetSkill((EQEmu::skills::SkillType)i, max_skill_level); + int max_skill_level = content_db.GetSkillCap(c->GetClass(), (EQ::skills::SkillType)i, c->GetLevel()); + c->SetSkill((EQ::skills::SkillType)i, max_skill_level); } } } @@ -11844,14 +12620,14 @@ void command_disarmtrap(Client *c, const Seperator *sep) if(target->IsNPC()) { - if (c->HasSkill(EQEmu::skills::SkillDisarmTraps)) + if (c->HasSkill(EQ::skills::SkillDisarmTraps)) { if(DistanceSquaredNoZ(c->GetPosition(), target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse)) { c->Message(Chat::Red, "%s is too far away.", target->GetCleanName()); return; } - c->HandleLDoNDisarm(target->CastToNPC(), c->GetSkill(EQEmu::skills::SkillDisarmTraps), LDoNTypeMechanical); + c->HandleLDoNDisarm(target->CastToNPC(), c->GetSkill(EQ::skills::SkillDisarmTraps), LDoNTypeMechanical); } else c->Message(Chat::Red, "You do not have the disarm trap skill."); @@ -11869,14 +12645,14 @@ void command_sensetrap(Client *c, const Seperator *sep) if(target->IsNPC()) { - if (c->HasSkill(EQEmu::skills::SkillSenseTraps)) + if (c->HasSkill(EQ::skills::SkillSenseTraps)) { if(DistanceSquaredNoZ(c->GetPosition(), target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse)) { c->Message(Chat::Red, "%s is too far away.", target->GetCleanName()); return; } - c->HandleLDoNSenseTraps(target->CastToNPC(), c->GetSkill(EQEmu::skills::SkillSenseTraps), LDoNTypeMechanical); + c->HandleLDoNSenseTraps(target->CastToNPC(), c->GetSkill(EQ::skills::SkillSenseTraps), LDoNTypeMechanical); } else c->Message(Chat::Red, "You do not have the sense traps skill."); @@ -11894,14 +12670,14 @@ void command_picklock(Client *c, const Seperator *sep) if(target->IsNPC()) { - if (c->HasSkill(EQEmu::skills::SkillPickLock)) + if (c->HasSkill(EQ::skills::SkillPickLock)) { if(DistanceSquaredNoZ(c->GetPosition(), target->GetPosition()) > RuleI(Adventure, LDoNTrapDistanceUse)) { c->Message(Chat::Red, "%s is too far away.", target->GetCleanName()); return; } - c->HandleLDoNPickLock(target->CastToNPC(), c->GetSkill(EQEmu::skills::SkillPickLock), LDoNTypeMechanical); + c->HandleLDoNPickLock(target->CastToNPC(), c->GetSkill(EQ::skills::SkillPickLock), LDoNTypeMechanical); } else c->Message(Chat::Red, "You do not have the pick locks skill."); @@ -11917,27 +12693,27 @@ void command_profanity(Client *c, const Seperator *sep) // do nothing } else if (arg1.compare("clear") == 0) { - EQEmu::ProfanityManager::DeleteProfanityList(&database); + EQ::ProfanityManager::DeleteProfanityList(&database); auto pack = new ServerPacket(ServerOP_RefreshCensorship); worldserver.SendPacket(pack); safe_delete(pack); } else if (arg1.compare("add") == 0) { - if (!EQEmu::ProfanityManager::AddProfanity(&database, sep->arg[2])) + if (!EQ::ProfanityManager::AddProfanity(&database, sep->arg[2])) c->Message(Chat::Red, "Could not add '%s' to the profanity list.", sep->arg[2]); auto pack = new ServerPacket(ServerOP_RefreshCensorship); worldserver.SendPacket(pack); safe_delete(pack); } else if (arg1.compare("del") == 0) { - if (!EQEmu::ProfanityManager::RemoveProfanity(&database, sep->arg[2])) + if (!EQ::ProfanityManager::RemoveProfanity(&database, sep->arg[2])) c->Message(Chat::Red, "Could not delete '%s' from the profanity list.", sep->arg[2]); auto pack = new ServerPacket(ServerOP_RefreshCensorship); worldserver.SendPacket(pack); safe_delete(pack); } else if (arg1.compare("reload") == 0) { - if (!EQEmu::ProfanityManager::UpdateProfanityList(&database)) + if (!EQ::ProfanityManager::UpdateProfanityList(&database)) c->Message(Chat::Red, "Could not reload the profanity list."); auto pack = new ServerPacket(ServerOP_RefreshCensorship); worldserver.SendPacket(pack); @@ -11948,7 +12724,7 @@ void command_profanity(Client *c, const Seperator *sep) } std::string popup; - const auto &list = EQEmu::ProfanityManager::GetProfanityList(); + const auto &list = EQ::ProfanityManager::GetProfanityList(); for (const auto &iter : list) { popup.append(iter); popup.append("
"); @@ -12098,7 +12874,7 @@ void command_zopp(Client *c, const Seperator *sep) uint32 itemid = atoi(sep->arg[3]); int16 charges = sep->argnum == 4 ? atoi(sep->arg[4]) : 1; // defaults to 1 charge if not specified - const EQEmu::ItemData* FakeItem = database.GetItem(itemid); + const EQ::ItemData* FakeItem = database.GetItem(itemid); if (!FakeItem) { c->Message(Chat::Red, "Error: Item [%u] is not a valid item id.", itemid); @@ -12106,7 +12882,7 @@ void command_zopp(Client *c, const Seperator *sep) } int16 item_status = 0; - const EQEmu::ItemData* item = database.GetItem(itemid); + const EQ::ItemData* item = database.GetItem(itemid); if(item) { item_status = static_cast(item->MinStatus); } @@ -12120,7 +12896,7 @@ void command_zopp(Client *c, const Seperator *sep) c->Message(Chat::White, "Processing request..results may cause unpredictable behavior."); } - EQEmu::ItemInstance* FakeItemInst = database.CreateItem(FakeItem, charges); + EQ::ItemInstance* FakeItemInst = database.CreateItem(FakeItem, charges); c->SendItemPacket(slotid, FakeItemInst, packettype); c->Message(Chat::White, "Sending zephyr op packet to client - [%s] %s (%u) with %i %s to slot %i.", packettype == ItemPacketTrade ? "Trade" : "Summon", FakeItem->Name, itemid, charges, @@ -12652,15 +13428,27 @@ void command_hotfix(Client *c, const Seperator *sep) c->Message(Chat::White, "Creating and applying hotfix"); std::thread t1( [c, hotfix_name]() { -#ifdef WIN32 - if(hotfix_name.length() > 0) { - if(system(StringFormat("shared_memory -hotfix=%s", hotfix_name.c_str()).c_str())); - } else { - if(system(StringFormat("shared_memory").c_str())); - } -#else - std::string shared_memory_path = "./shared_memory"; + std::string shared_memory_path; + +#ifdef WIN32 + shared_memory_path = "shared_memory"; + if (file_exists("bin/shared_memory.exe")) { + shared_memory_path = "bin\\shared_memory.exe"; + } + + std::string hotfix_command; + if (hotfix_name.length() > 0) { + hotfix_command = fmt::format("\"{}\" -hotfix={}", shared_memory_path, hotfix_name); + } + else { + hotfix_command = fmt::format("\"{}\"", shared_memory_path, hotfix_name); + } + + LogInfo("Running hotfix command [{}]", hotfix_command); + if (system(hotfix_command.c_str())) {} +#else + shared_memory_path = "./shared_memory"; if (file_exists("./bin/shared_memory")) { shared_memory_path = "./bin/shared_memory"; } @@ -12878,7 +13666,7 @@ void command_scale(Client *c, const Seperator *sep) c->Message(Chat::Yellow, "Found (%i) NPC's that match this search...", found_count); c->Message( Chat::Yellow, "To apply these changes, click <%s> or type %s", - EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Apply").c_str(), saylink.c_str() ); } @@ -12947,7 +13735,7 @@ void command_databuckets(Client *c, const Seperator *sep) _ctr++; std::string del_saylink = StringFormat("#databuckets delete %s", key.c_str()); c->Message(Chat::White, "%s : %s", - EQEmu::SayLinkEngine::GenerateQuestSaylink(del_saylink, false, "Delete").c_str(), key.c_str(), " Value: ", value.c_str()); + EQ::SayLinkEngine::GenerateQuestSaylink(del_saylink, false, "Delete").c_str(), key.c_str(), " Value: ", value.c_str()); } window_text.append("
"); c->SendPopupToClient(window_title.c_str(), window_text.c_str()); @@ -12967,24 +13755,83 @@ void command_databuckets(Client *c, const Seperator *sep) void command_who(Client *c, const Seperator *sep) { std::string query = - "SELECT\n" - " character_data.account_id,\n" - " character_data.name,\n" - " character_data.zone_id,\n" - " COALESCE((select zone.short_name from zone where zoneidnumber = character_data.zone_id LIMIT 1), \"Not Found\") as zone_name,\n" - " character_data.zone_instance,\n" - " COALESCE((select guilds.name from guilds where id = ((select guild_id from guild_members where char_id = character_data.id))), \"\") as guild_name,\n" - " character_data.level,\n" - " character_data.race,\n" - " character_data.class,\n" - " COALESCE((select account.status from account where account.id = character_data.account_id LIMIT 1), 0) as account_status,\n" - " COALESCE((select account.name from account where account.id = character_data.account_id LIMIT 1), \"\") as account_name,\n" - " COALESCE((select account_ip.ip from account_ip where account_ip.accid = character_data.account_id ORDER BY account_ip.lastused DESC LIMIT 1), \"\") as account_ip\n" - "FROM\n" - " character_data\n" - "WHERE\n" - " last_login > (UNIX_TIMESTAMP() - 600)\n" - "ORDER BY character_data.name;"; + SQL ( + SELECT + character_data.account_id, + character_data.name, + character_data.zone_id, + character_data.zone_instance, + COALESCE( + ( + select + guilds.name + from + guilds + where + id = ( + ( + select + guild_id + from + guild_members + where + char_id = character_data.id + ) + ) + ), + "" + ) as guild_name, + character_data.level, + character_data.race, + character_data.class, + COALESCE( + ( + select + account.status + from + account + where + account.id = character_data.account_id + LIMIT + 1 + ), 0 + ) as account_status, + COALESCE( + ( + select + account.name + from + account + where + account.id = character_data.account_id + LIMIT + 1 + ), + 0 + ) as account_name, + COALESCE( + ( + select + account_ip.ip + from + account_ip + where + account_ip.accid = character_data.account_id + ORDER BY + account_ip.lastused DESC + LIMIT + 1 + ), + "" + ) as account_ip + FROM + character_data + WHERE + last_login > (UNIX_TIMESTAMP() - 600) + ORDER BY + character_data.name; + ) + ; auto results = database.QueryDatabase(query); if (!results.Success()) @@ -13007,19 +13854,18 @@ void command_who(Client *c, const Seperator *sep) c->Message(Chat::Magenta, "--------------------"); for (auto row = results.begin(); row != results.end(); ++row) { - auto account_id = static_cast(atoi(row[0])); - std::string player_name = row[1]; - auto zone_id = static_cast(atoi(row[2])); - std::string zone_short_name = row[3]; - auto zone_instance = static_cast(atoi(row[4])); - std::string guild_name = row[5]; - auto player_level = static_cast(atoi(row[6])); - auto player_race = static_cast(atoi(row[7])); - auto player_class = static_cast(atoi(row[8])); - auto account_status = static_cast(atoi(row[9])); - std::string account_name = row[10]; - std::string account_ip = row[11]; - + auto account_id = static_cast(atoi(row[0])); + std::string player_name = row[1]; + auto zone_id = static_cast(atoi(row[2])); + std::string zone_short_name = ZoneName(zone_id); + auto zone_instance = static_cast(atoi(row[3])); + std::string guild_name = row[4]; + auto player_level = static_cast(atoi(row[5])); + auto player_race = static_cast(atoi(row[6])); + auto player_class = static_cast(atoi(row[7])); + auto account_status = static_cast(atoi(row[8])); + std::string account_name = row[9]; + std::string account_ip = row[10]; std::string base_class_name = GetClassIDName(static_cast(player_class), 1); std::string displayed_race_name = GetRaceIDName(static_cast(player_race)); @@ -13042,7 +13888,7 @@ void command_who(Client *c, const Seperator *sep) std::string displayed_guild_name; if (guild_name.length() > 0) { - displayed_guild_name = EQEmu::SayLinkEngine::GenerateQuestSaylink( + displayed_guild_name = EQ::SayLinkEngine::GenerateQuestSaylink( StringFormat( "#who \"%s\"", guild_name.c_str()), @@ -13051,7 +13897,7 @@ void command_who(Client *c, const Seperator *sep) ); } - std::string goto_saylink = EQEmu::SayLinkEngine::GenerateQuestSaylink( + std::string goto_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( StringFormat("#goto %s", player_name.c_str()), false, "Goto" ); @@ -13061,15 +13907,15 @@ void command_who(Client *c, const Seperator *sep) 5, "%s[%u %s] %s (%s) %s ZONE: %s (%u) (%s) (%s) (%s)", (account_status > 0 ? "* GM * " : ""), player_level, - EQEmu::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", base_class_name.c_str()), false, display_class_name).c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", base_class_name.c_str()), false, display_class_name).c_str(), player_name.c_str(), - EQEmu::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", displayed_race_name.c_str()), false, displayed_race_name).c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", displayed_race_name.c_str()), false, displayed_race_name).c_str(), displayed_guild_name.c_str(), - EQEmu::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", zone_short_name.c_str()), false, zone_short_name).c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", zone_short_name.c_str()), false, zone_short_name).c_str(), zone_instance, goto_saylink.c_str(), - EQEmu::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", account_name.c_str()), false, account_name).c_str(), - EQEmu::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", account_ip.c_str()), false, account_ip).c_str() + EQ::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", account_name.c_str()), false, account_name).c_str(), + EQ::SayLinkEngine::GenerateQuestSaylink(StringFormat("#who %s", account_ip.c_str()), false, account_ip).c_str() ); found_count++; @@ -13274,7 +14120,7 @@ void command_bot(Client *c, const Seperator *sep) bot_message = bot_message.substr(bot_message.find_first_not_of("#bot")); bot_message[0] = BOT_COMMAND_CHAR; } - + if (bot_command_dispatch(c, bot_message.c_str()) == -2) { if (parse->PlayerHasQuestSub(EVENT_BOT_COMMAND)) { int i = parse->EventPlayer(EVENT_BOT_COMMAND, c, bot_message, 0); diff --git a/zone/command.h b/zone/command.h index e1b028bb1..303e0f132 100644 --- a/zone/command.h +++ b/zone/command.h @@ -71,6 +71,7 @@ void command_chat(Client *c, const Seperator *sep); void command_checklos(Client *c, const Seperator *sep); void command_clearinvsnapshots(Client *c, const Seperator *sep); void command_connectworldserver(Client *c, const Seperator *sep); +void command_copycharacter(Client *c, const Seperator *sep); void command_corpse(Client *c, const Seperator *sep); void command_corpsefix(Client *c, const Seperator *sep); void command_crashtest(Client *c, const Seperator *sep); @@ -91,15 +92,20 @@ void command_disablerecipe(Client *c, const Seperator *sep); void command_disarmtrap(Client *c, const Seperator *sep); void command_distance(Client *c, const Seperator *sep); void command_doanim(Client *c, const Seperator *sep); +void command_dz(Client *c, const Seperator *sep); +void command_dzkickplayers(Client *c, const Seperator *sep); +void command_editmassrespawn(Client* c, const Seperator* sep); void command_emote(Client *c, const Seperator *sep); void command_emotesearch(Client* c, const Seperator *sep); void command_emoteview(Client* c, const Seperator *sep); void command_enablerecipe(Client *c, const Seperator *sep); +void command_endurance(Client *c, const Seperator *sep); void command_equipitem(Client *c, const Seperator *sep); void command_face(Client *c, const Seperator *sep); void command_faction(Client *c, const Seperator *sep); void command_findaliases(Client *c, const Seperator *sep); void command_findnpctype(Client *c, const Seperator *sep); +void command_findrace(Client *c, const Seperator *sep); void command_findspell(Client *c, const Seperator *sep); void command_findzone(Client *c, const Seperator *sep); void command_fixmob(Client *c, const Seperator *sep); @@ -110,6 +116,7 @@ void command_flymode(Client *c, const Seperator *sep); void command_fov(Client *c, const Seperator *sep); void command_freeze(Client *c, const Seperator *sep); void command_gassign(Client *c, const Seperator *sep); +void command_gearup(Client *c, const Seperator *sep); void command_gender(Client *c, const Seperator *sep); void command_getplayerburiedcorpsecount(Client *c, const Seperator *sep); void command_getvariable(Client *c, const Seperator *sep); @@ -286,6 +293,7 @@ void command_showskills(Client *c, const Seperator *sep); void command_showspellslist(Client *c, const Seperator *sep); void command_showstats(Client *c, const Seperator *sep); void command_showzonegloballoot(Client *c, const Seperator *sep); +void command_showzonepoints(Client *c, const Seperator *sep); void command_shutdown(Client *c, const Seperator *sep); void command_size(Client *c, const Seperator *sep); void command_spawn(Client *c, const Seperator *sep); @@ -337,6 +345,7 @@ void command_worldshutdown(Client *c, const Seperator *sep); void command_wp(Client *c, const Seperator *sep); void command_wpadd(Client *c, const Seperator *sep); void command_wpinfo(Client *c, const Seperator *sep); +void command_worldwide(Client *c, const Seperator *sep); void command_xtargets(Client *c, const Seperator *sep); void command_zclip(Client *c, const Seperator *sep); void command_zcolor(Client *c, const Seperator *sep); diff --git a/zone/common.h b/zone/common.h index 2d97527fc..fd513bdde 100644 --- a/zone/common.h +++ b/zone/common.h @@ -195,7 +195,11 @@ enum { COUNTER_AVOID_DAMAGE = 44, PROX_AGGRO = 45, IMMUNE_RANGED_ATTACKS = 46, - MAX_SPECIAL_ATTACK = 47 + IMMUNE_DAMAGE_CLIENT = 47, + IMMUNE_DAMAGE_NPC = 48, + IMMUNE_AGGRO_CLIENT = 49, + IMMUNE_AGGRO_NPC = 50, + MAX_SPECIAL_ATTACK = 51 }; typedef enum { //fear states @@ -268,7 +272,7 @@ enum class LootRequestType : uint8 { Self, AllowedPVE, AllowedPVPAll, - AllowedPVPSingle, // can make this 'AllowedPVPVariable' and allow values between 1 and EQEmu::invtype::POSSESSIONS_SIZE + AllowedPVPSingle, // can make this 'AllowedPVPVariable' and allow values between 1 and EQ::invtype::POSSESSIONS_SIZE AllowedPVPDefined, }; @@ -385,8 +389,8 @@ struct StatBonuses { int32 inhibitmelee; float AggroRange; // when calculate just replace original value with this float AssistRange; - int32 skillmod[EQEmu::skills::HIGHEST_SKILL + 1]; - int32 skillmodmax[EQEmu::skills::HIGHEST_SKILL + 1]; + int32 skillmod[EQ::skills::HIGHEST_SKILL + 1]; + int32 skillmodmax[EQ::skills::HIGHEST_SKILL + 1]; int effective_casting_level; int adjusted_casting_skill; // SPA 112 for fizzles int reflect_chance; // chance to reflect incoming spell @@ -403,7 +407,7 @@ struct StatBonuses { int32 StrikeThrough; // PoP: Strike Through % int32 MeleeMitigation; //i = Shielding int32 MeleeMitigationEffect; //i = Spell Effect Melee Mitigation - int32 CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 2]; //i + int32 CriticalHitChance[EQ::skills::HIGHEST_SKILL + 2]; //i int32 CriticalSpellChance; //i int32 SpellCritDmgIncrease; //i int32 SpellCritDmgIncNoStack; // increase @@ -430,10 +434,10 @@ struct StatBonuses { int32 MeleeSkillCheck; //i uint8 MeleeSkillCheckSkill; int32 HitChance; //HitChance/15 == % increase i = Accuracy (Item: Accuracy) - int32 HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 2]; //Spell effect Chance to Hit, straight percent increase - int32 DamageModifier[EQEmu::skills::HIGHEST_SKILL + 2]; //i - int32 DamageModifier2[EQEmu::skills::HIGHEST_SKILL + 2]; //i - int32 MinDamageModifier[EQEmu::skills::HIGHEST_SKILL + 2]; //i + int32 HitChanceEffect[EQ::skills::HIGHEST_SKILL + 2]; //Spell effect Chance to Hit, straight percent increase + int32 DamageModifier[EQ::skills::HIGHEST_SKILL + 2]; //i + int32 DamageModifier2[EQ::skills::HIGHEST_SKILL + 2]; //i + int32 MinDamageModifier[EQ::skills::HIGHEST_SKILL + 2]; //i int32 ProcChance; // ProcChance/10 == % increase i = CombatEffects int32 ProcChanceSPA; // ProcChance from spell effects int32 ExtraAttackChance; @@ -441,13 +445,13 @@ struct StatBonuses { int32 DivineSaveChance[2]; // Second Chance (base1 = chance, base2 = spell on trigger) uint32 DeathSave[4]; // Death Pact [0](value = 1 partial 2 = full) [1]=slot [2]=LvLimit [3]=HealAmt int32 FlurryChance; - int32 Accuracy[EQEmu::skills::HIGHEST_SKILL + 2]; //Accuracy/15 == % increase [Spell Effect: Accuracy) + int32 Accuracy[EQ::skills::HIGHEST_SKILL + 2]; //Accuracy/15 == % increase [Spell Effect: Accuracy) int32 HundredHands; //extra haste, stacks with all other haste i int32 MeleeLifetap; //i int32 Vampirism; //i int32 HealRate; // Spell effect that influences effectiveness of heals int32 MaxHPChange; // Spell Effect - int16 SkillDmgTaken[EQEmu::skills::HIGHEST_SKILL + 2]; // All Skills + -1 + int16 SkillDmgTaken[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1 int32 HealAmt; // Item Effect int32 SpellDmg; // Item Effect int32 Clairvoyance; // Item Effect @@ -456,9 +460,9 @@ struct StatBonuses { uint32 SpellTriggers[MAX_SPELL_TRIGGER]; // Innate/Spell/Item Spells that trigger when you cast uint32 SpellOnKill[MAX_SPELL_TRIGGER*3]; // Chance to proc after killing a mob uint32 SpellOnDeath[MAX_SPELL_TRIGGER*2]; // Chance to have effect cast when you die - int32 CritDmgMod[EQEmu::skills::HIGHEST_SKILL + 2]; // All Skills + -1 - int32 SkillReuseTime[EQEmu::skills::HIGHEST_SKILL + 1]; // Reduces skill timers - int32 SkillDamageAmount[EQEmu::skills::HIGHEST_SKILL + 2]; // All Skills + -1 + int32 CritDmgMod[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1 + int32 SkillReuseTime[EQ::skills::HIGHEST_SKILL + 1]; // Reduces skill timers + int32 SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1 int32 TwoHandBluntBlock; // chance to block when wielding two hand blunt weapon uint32 ItemManaRegenCap; // Increases the amount of mana you have can over the cap(aa effect) int32 GravityEffect; // Indictor of spell effect @@ -481,7 +485,7 @@ struct StatBonuses { uint8 FocusEffects[HIGHEST_FOCUS+1]; // Stores the focus effectid for each focustype you have. int16 FocusEffectsWorn[HIGHEST_FOCUS+1]; // Optional to allow focus effects to be applied additively from worn slot bool NegateEffects; // Check if you contain a buff with negate effect. (only spellbonuses) - int32 SkillDamageAmount2[EQEmu::skills::HIGHEST_SKILL + 2]; // Adds skill specific damage + int32 SkillDamageAmount2[EQ::skills::HIGHEST_SKILL + 2]; // Adds skill specific damage uint32 NegateAttacks[3]; // 0 = bool HasEffect 1 = Buff Slot 2 = Max damage absorbed per hit uint32 MitigateMeleeRune[4]; // 0 = Mitigation value 1 = Buff Slot 2 = Max mitigation per hit 3 = Rune Amt uint32 MeleeThresholdGuard[3]; // 0 = Mitigation value 1 = Buff Slot 2 = Min damage to trigger. @@ -514,7 +518,7 @@ struct StatBonuses { int32 Metabolism; // Food/drink consumption rates. bool Sanctuary; // Sanctuary effect, lowers place on hate list until cast on others. int32 FactionModPct; // Modifies amount of faction gained. - bool LimitToSkill[EQEmu::skills::HIGHEST_SKILL + 2]; // Determines if we need to search for a skill proc. + bool LimitToSkill[EQ::skills::HIGHEST_SKILL + 2]; // Determines if we need to search for a skill proc. uint32 SkillProc[MAX_SKILL_PROCS]; // Max number of spells containing skill_procs. uint32 SkillProcSuccess[MAX_SKILL_PROCS]; // Max number of spells containing skill_procs_success. uint32 PC_Pet_Rampage[2]; // 0= % chance to rampage, 1=damage modifier @@ -549,7 +553,7 @@ struct StatBonuses { int32 CombatStability; // Melee damage mitigation. int32 DoubleRiposte; // Chance to double riposte int32 GiveDoubleRiposte[3]; // 0=Regular Chance, 1=Skill Attack Chance, 2=Skill - uint32 RaiseSkillCap[EQEmu::skills::HIGHEST_SKILL + 1]; // Raise a specific skill cap (base1= value, base2=skill) + uint32 RaiseSkillCap[EQ::skills::HIGHEST_SKILL + 1]; // Raise a specific skill cap (base1= value, base2=skill) int32 Ambidexterity; // Increase chance to duel wield by adding bonus 'skill'. int32 PetMaxHP; // Increase the max hp of your pet. int32 PetFlurry; // Chance for pet to flurry. @@ -578,7 +582,7 @@ struct StatBonuses { uint16 extra_xtargets; // extra xtarget entries bool ShroudofStealth; // rogue improved invisiblity uint16 ReduceFallDamage; // reduce fall damage by percent - int32 ReduceTradeskillFail[EQEmu::skills::HIGHEST_SKILL + 1]; // Reduces chance for trade skills to fail by percent. + int32 ReduceTradeskillFail[EQ::skills::HIGHEST_SKILL + 1]; // Reduces chance for trade skills to fail by percent. uint8 TradeSkillMastery; // Allow number of tradeskills to exceed 200 skill. int16 NoBreakAESneak; // Percent value int16 FeignedCastOnChance; // Percent Value @@ -697,7 +701,7 @@ struct MercData { uint32 NPCID; }; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -739,7 +743,7 @@ public: private: // Send item data for trade item to other person involved in trade - void SendItemData(const EQEmu::ItemInstance* inst, int16 dest_slot_id); + void SendItemData(const EQ::ItemInstance* inst, int16 dest_slot_id); uint32 with_id; Mob* owner; @@ -783,7 +787,14 @@ struct DamageHitInfo { int offense; int tohit; int hand; - EQEmu::skills::SkillType skill; + EQ::skills::SkillType skill; +}; + +struct ExpeditionInvite +{ + uint32_t expedition_id; + std::string inviter_name; + std::string swap_remove_name; }; #endif diff --git a/zone/corpse.cpp b/zone/corpse.cpp index 9ab4fed0b..5113b6fdf 100644 --- a/zone/corpse.cpp +++ b/zone/corpse.cpp @@ -38,6 +38,7 @@ Child of the Mob class. #include "corpse.h" #include "entity.h" +#include "expedition.h" #include "groups.h" #include "mob.h" #include "raids.h" @@ -141,7 +142,7 @@ Corpse* Corpse::LoadCharacterCorpseEntity(uint32 in_dbid, uint32 in_charid, std: pc->consented_guild_id = guild_consent_id; pc->UpdateEquipmentLight(); // itemlist populated above..need to determine actual values - + safe_delete_array(pcs); return pc; @@ -153,7 +154,7 @@ Corpse::Corpse(NPC* in_npc, ItemList* in_itemlist, uint32 in_npctypeid, const NP in_npc->GetDeity(),in_npc->GetLevel(),in_npc->GetNPCTypeID(),in_npc->GetSize(),0, in_npc->GetPosition(), in_npc->GetInnateLightType(), in_npc->GetTexture(),in_npc->GetHelmTexture(), 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,EQEmu::TintProfile(),0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,EQ::TintProfile(),0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0, (*in_npctypedata)->use_model, false), corpse_decay_timer(in_decaytime), corpse_rez_timer(0), @@ -245,7 +246,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob ( client->GetPP().drakkin_heritage, // uint32 in_drakkin_heritage, client->GetPP().drakkin_tattoo, // uint32 in_drakkin_tattoo, client->GetPP().drakkin_details, // uint32 in_drakkin_details, - EQEmu::TintProfile(), // uint32 in_armor_tint[_MaterialCount], + EQ::TintProfile(), // uint32 in_armor_tint[_MaterialCount], 0xff, // uint8 in_aa_title, 0, // uint8 in_see_invis, // see through invis 0, // uint8 in_see_invis_undead, // see through invis vs. undead @@ -273,7 +274,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob ( int i; PlayerProfile_Struct *pp = &client->GetPP(); - EQEmu::ItemInstance *item = nullptr; + EQ::ItemInstance *item = nullptr; /* Check if Zone has Graveyard First */ if(!zone->HasGraveyard()) { @@ -325,7 +326,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob ( // cash // Let's not move the cash when 'RespawnFromHover = true' && 'client->GetClientVersion() < EQClientSoF' since the client doesn't. // (change to first client that supports 'death hover' mode, if not SoF.) - if (!RuleB(Character, RespawnFromHover) || client->ClientVersion() < EQEmu::versions::ClientVersion::SoF) { + if (!RuleB(Character, RespawnFromHover) || client->ClientVersion() < EQ::versions::ClientVersion::SoF) { SetCash(pp->copper, pp->silver, pp->gold, pp->platinum); pp->copper = 0; pp->silver = 0; @@ -339,12 +340,12 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob ( // TODO soulbound items need not be added to corpse, but they need // to go into the regular slots on the player, out of bags std::list removed_list; - + // ideally, we would start at invslot::slotGeneral1 and progress to invslot::slotCursor.. // ..then regress and process invslot::EQUIPMENT_BEGIN through invslot::EQUIPMENT_END... // without additional work to database loading of player corpses, this order is not // currently preserved and a re-work of this processing loop is not warranted. - for (i = EQEmu::invslot::POSSESSIONS_BEGIN; i <= EQEmu::invslot::POSSESSIONS_END; ++i) { + for (i = EQ::invslot::POSSESSIONS_BEGIN; i <= EQ::invslot::POSSESSIONS_END; ++i) { item = client->GetInv().GetItem(i); if (item == nullptr) { continue; } @@ -402,7 +403,7 @@ Corpse::Corpse(Client* client, int32 in_rezexp) : Mob ( Save(); } -void Corpse::MoveItemToCorpse(Client *client, EQEmu::ItemInstance *inst, int16 equipSlot, std::list &removedList) +void Corpse::MoveItemToCorpse(Client *client, EQ::ItemInstance *inst, int16 equipSlot, std::list &removedList) { AddItem( inst->GetItem()->ID, @@ -420,10 +421,10 @@ void Corpse::MoveItemToCorpse(Client *client, EQEmu::ItemInstance *inst, int16 e while (true) { if (!inst->IsClassBag()) { break; } - if (equipSlot < EQEmu::invslot::GENERAL_BEGIN || equipSlot > EQEmu::invslot::slotCursor) { break; } + if (equipSlot < EQ::invslot::GENERAL_BEGIN || equipSlot > EQ::invslot::slotCursor) { break; } - for (int16 sub_index = EQEmu::invbag::SLOT_BEGIN; sub_index <= EQEmu::invbag::SLOT_END; ++sub_index) { - int16 real_bag_slot = EQEmu::InventoryProfile::CalcSlotId(equipSlot, sub_index); + for (int16 sub_index = EQ::invbag::SLOT_BEGIN; sub_index <= EQ::invbag::SLOT_END; ++sub_index) { + int16 real_bag_slot = EQ::InventoryProfile::CalcSlotId(equipSlot, sub_index); auto bag_inst = client->GetInv().GetItem(real_bag_slot); if (bag_inst == nullptr) { continue; } @@ -485,7 +486,7 @@ in_helmtexture, 0, 0, 0, -EQEmu::TintProfile(), +EQ::TintProfile(), 0xff, 0, 0, @@ -621,7 +622,7 @@ bool Corpse::Save() { end = itemlist.end(); for (; cur != end; ++cur) { ServerLootItem_Struct* item = *cur; - memcpy((char*)&dbpc->items[x++], (char*)item, sizeof(ServerLootItem_Struct)); + memcpy((char*)&dbpc->items[x++], (char*)item, sizeof(player_lootitem::ServerLootItem_Struct)); } /* Create New Corpse*/ @@ -722,8 +723,8 @@ ServerLootItem_Struct* Corpse::GetItem(uint16 lootslot, ServerLootItem_Struct** } } - if (sitem && bag_item_data && EQEmu::InventoryProfile::SupportsContainers(sitem->equip_slot)) { - int16 bagstart = EQEmu::InventoryProfile::CalcSlotId(sitem->equip_slot, EQEmu::invbag::SLOT_BEGIN); + if (sitem && bag_item_data && EQ::InventoryProfile::SupportsContainers(sitem->equip_slot)) { + int16 bagstart = EQ::InventoryProfile::CalcSlotId(sitem->equip_slot, EQ::invbag::SLOT_BEGIN); cur = itemlist.begin(); end = itemlist.end(); @@ -777,8 +778,8 @@ void Corpse::RemoveItem(ServerLootItem_Struct* item_data) is_corpse_changed = true; itemlist.erase(iter); - uint8 material = EQEmu::InventoryProfile::CalcMaterialFromSlot(sitem->equip_slot); // autos to unsigned char - if (material != EQEmu::textures::materialInvalid) + uint8 material = EQ::InventoryProfile::CalcMaterialFromSlot(sitem->equip_slot); // autos to unsigned char + if (material != EQ::textures::materialInvalid) SendWearChange(material); UpdateEquipmentLight(); @@ -825,22 +826,7 @@ bool Corpse::Process() { } if (corpse_graveyard_timer.Check()) { - if (zone->HasGraveyard()) { - Save(); - player_corpse_depop = true; - database.SendCharacterCorpseToGraveyard(corpse_db_id, zone->graveyard_zoneid(), - (zone->GetZoneID() == zone->graveyard_zoneid()) ? zone->GetInstanceID() : 0, zone->GetGraveyardPoint()); - corpse_graveyard_timer.Disable(); - auto pack = new ServerPacket(ServerOP_SpawnPlayerCorpse, sizeof(SpawnPlayerCorpse_Struct)); - SpawnPlayerCorpse_Struct* spc = (SpawnPlayerCorpse_Struct*)pack->pBuffer; - spc->player_corpse_id = corpse_db_id; - spc->zone_id = zone->graveyard_zoneid(); - worldserver.SendPacket(pack); - safe_delete(pack); - LogDebug("Moved [{}] player corpse to the designated graveyard in zone [{}]", this->GetName(), content_db.GetZoneName(zone->graveyard_zoneid())); - corpse_db_id = 0; - } - + MovePlayerCorpseToGraveyard(); corpse_graveyard_timer.Disable(); return false; } @@ -941,7 +927,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a SendLootReqErrorPacket(client, LootResponse::TooFar); return; } - + if (being_looted_by != 0xFFFFFFFF && being_looted_by != client->GetID()) { SendLootReqErrorPacket(client, LootResponse::SomeoneElse); return; @@ -1061,9 +1047,9 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a if (pkitem->RecastDelay) pkinst->SetRecastTimestamp(timestamps.count(pkitem->RecastType) ? timestamps.at(pkitem->RecastType) : 0); - LogInventory("MakeLootRequestPackets() Slot [{}], Item [{}]", EQEmu::invslot::CORPSE_BEGIN, pkitem->Name); + LogInventory("MakeLootRequestPackets() Slot [{}], Item [{}]", EQ::invslot::CORPSE_BEGIN, pkitem->Name); - client->SendItemPacket(EQEmu::invslot::CORPSE_BEGIN, pkinst, ItemPacketLoot); + client->SendItemPacket(EQ::invslot::CORPSE_BEGIN, pkinst, ItemPacketLoot); safe_delete(pkinst); } else { @@ -1076,29 +1062,28 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a return; } - auto loot_slot = EQEmu::invslot::CORPSE_BEGIN; + auto loot_slot = EQ::invslot::CORPSE_BEGIN; auto corpse_mask = client->GetInv().GetLookup()->CorpseBitmask; - + for (auto item_data : itemlist) { // every loot session must either set all items' lootslots to 'invslot::SLOT_INVALID' // or to a valid enumerated client-versioned corpse slot (lootslot is not equip_slot) item_data->lootslot = 0xFFFF; - + // align server and client corpse slot mappings so translators can function properly - while (loot_slot <= EQEmu::invslot::CORPSE_END && (((uint64)1 << loot_slot) & corpse_mask) == 0) + while (loot_slot <= EQ::invslot::CORPSE_END && (((uint64)1 << loot_slot) & corpse_mask) == 0) ++loot_slot; - - if (loot_slot > EQEmu::invslot::CORPSE_END) + if (loot_slot > EQ::invslot::CORPSE_END) continue; if (IsPlayerCorpse()) { - if (loot_request_type == LootRequestType::AllowedPVPSingle && loot_slot != EQEmu::invslot::CORPSE_BEGIN) + if (loot_request_type == LootRequestType::AllowedPVPSingle && loot_slot != EQ::invslot::CORPSE_BEGIN) continue; - if (item_data->equip_slot < EQEmu::invslot::POSSESSIONS_BEGIN || item_data->equip_slot > EQEmu::invslot::POSSESSIONS_END) + if (item_data->equip_slot < EQ::invslot::POSSESSIONS_BEGIN || item_data->equip_slot > EQ::invslot::POSSESSIONS_END) continue; } - + const auto *item = database.GetItem(item_data->item_id); auto inst = database.CreateItem( item, @@ -1121,7 +1106,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a client->SendItemPacket(loot_slot, inst, ItemPacketLoot); safe_delete(inst); - + item_data->lootslot = loot_slot++; } @@ -1130,7 +1115,7 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a // This is required for the 'Loot All' feature to work for SoD clients. I expect it is to tell the client that the // server has now sent all the items on the corpse. - if (client->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (client->ClientVersion() >= EQ::versions::ClientVersion::SoD) SendLootReqErrorPacket(client, LootResponse::LootAll); } @@ -1202,8 +1187,8 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) return; } - const EQEmu::ItemData *item = nullptr; - EQEmu::ItemInstance *inst = nullptr; + const EQ::ItemData *item = nullptr; + EQ::ItemInstance *inst = nullptr; ServerLootItem_Struct *item_data = nullptr, *bag_item_data[10] = {}; memset(bag_item_data, 0, sizeof(bag_item_data)); @@ -1244,8 +1229,8 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) } if (inst->IsAugmented()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { - EQEmu::ItemInstance *itm = inst->GetAugment(i); + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { + EQ::ItemInstance *itm = inst->GetAugment(i); if (itm) { if (client->CheckLoreConflict(itm->GetItem())) { client->MessageString(Chat::White, LOOT_LORE_ERROR); @@ -1265,7 +1250,7 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) snprintf(buf, 87, "%d %d %s", inst->GetItem()->ID, inst->GetCharges(), EntityList::RemoveNumbers(q_corpse_name)); buf[87] = '\0'; - std::vector args; + std::vector args; args.push_back(inst); args.push_back(this); if (parse->EventPlayer(EVENT_LOOT, client, buf, 0, &args) != 0) { @@ -1276,6 +1261,20 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) return; } + if (zone && zone->GetInstanceID() != 0) + { + // expeditions may prevent looting based on client's lockouts + auto expedition = Expedition::FindCachedExpeditionByZoneInstance(zone->GetZoneID(), zone->GetInstanceID()); + if (expedition && !expedition->CanClientLootCorpse(client, GetNPCTypeID(), GetID())) + { + client->MessageString(Chat::Red, LOOT_NOT_ALLOWED, inst->GetItem()->Name); + client->QueuePacket(app); + SendEndLootErrorPacket(client); + ResetLooter(); + delete inst; + return; + } + } // do we want this to have a fail option too? parse->EventItem(EVENT_LOOT, client, inst, this, buf, 0); @@ -1300,10 +1299,10 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) /* First add it to the looter - this will do the bag contents too */ if (lootitem->auto_loot > 0) { if (!client->AutoPutLootInInventory(*inst, true, true, bag_item_data)) - client->PutLootInInventory(EQEmu::invslot::slotCursor, *inst, bag_item_data); + client->PutLootInInventory(EQ::invslot::slotCursor, *inst, bag_item_data); } else { - client->PutLootInInventory(EQEmu::invslot::slotCursor, *inst, bag_item_data); + client->PutLootInInventory(EQ::invslot::slotCursor, *inst, bag_item_data); } /* Update any tasks that have an activity to loot this item */ @@ -1322,7 +1321,7 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) /* Remove Bag Contents */ if (item->IsClassBag() && (GetPlayerKillItem() != -1 || GetPlayerKillItem() != 1)) { - for (int i = EQEmu::invbag::SLOT_BEGIN; i <= EQEmu::invbag::SLOT_END; i++) { + for (int i = EQ::invbag::SLOT_BEGIN; i <= EQ::invbag::SLOT_END; i++) { if (bag_item_data[i]) { /* Delete needs to be before RemoveItem because its deletes the pointer for * item_data/bag_item_data */ @@ -1340,8 +1339,8 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app) } /* Send message with item link to groups and such */ - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemInst); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemInst); linker.SetItemInst(inst); linker.GenerateLink(); @@ -1400,7 +1399,7 @@ void Corpse::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { ns->spawn.NPC = 2; UpdateActiveLight(); - ns->spawn.light = m_Light.Type[EQEmu::lightsource::LightActive]; + ns->spawn.light = m_Light.Type[EQ::lightsource::LightActive]; } void Corpse::QueryLoot(Client* to) { @@ -1417,12 +1416,12 @@ void Corpse::QueryLoot(Client* to) { ServerLootItem_Struct* sitem = *cur; if (IsPlayerCorpse()) { - if (sitem->equip_slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN && sitem->equip_slot <= EQEmu::invbag::CURSOR_BAG_END) + if (sitem->equip_slot >= EQ::invbag::GENERAL_BAGS_BEGIN && sitem->equip_slot <= EQ::invbag::CURSOR_BAG_END) sitem->lootslot = 0xFFFF; else x < corpselootlimit ? sitem->lootslot = x : sitem->lootslot = 0xFFFF; - const EQEmu::ItemData* item = database.GetItem(sitem->item_id); + const EQ::ItemData* item = database.GetItem(sitem->item_id); if (item) to->Message((sitem->lootslot == 0xFFFF), "LootSlot: %i (EquipSlot: %i) Item: %s (%d), Count: %i", static_cast(sitem->lootslot), sitem->equip_slot, item->Name, item->ID, sitem->charges); @@ -1436,7 +1435,7 @@ void Corpse::QueryLoot(Client* to) { } else { sitem->lootslot=y; - const EQEmu::ItemData* item = database.GetItem(sitem->item_id); + const EQ::ItemData* item = database.GetItem(sitem->item_id); if (item) to->Message(Chat::White, "LootSlot: %i Item: %s (%d), Count: %i", sitem->lootslot, item->Name, item->ID, sitem->charges); @@ -1540,11 +1539,11 @@ void Corpse::Spawn() { uint32 Corpse::GetEquippedItemFromTextureSlot(uint8 material_slot) const { int16 invslot; - if (material_slot > EQEmu::textures::LastTexture) { + if (material_slot > EQ::textures::LastTexture) { return 0; } - invslot = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + invslot = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); if(invslot == INVALID_INDEX) // GetWornItem() should be returning a 0 for any invalid index... return 0; @@ -1552,9 +1551,9 @@ uint32 Corpse::GetEquippedItemFromTextureSlot(uint8 material_slot) const { } uint32 Corpse::GetEquipmentColor(uint8 material_slot) const { - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; - if (material_slot > EQEmu::textures::LastTexture) { + if (material_slot > EQ::textures::LastTexture) { return 0; } @@ -1568,38 +1567,38 @@ uint32 Corpse::GetEquipmentColor(uint8 material_slot) const { void Corpse::UpdateEquipmentLight() { - m_Light.Type[EQEmu::lightsource::LightEquipment] = 0; - m_Light.Level[EQEmu::lightsource::LightEquipment] = 0; + m_Light.Type[EQ::lightsource::LightEquipment] = 0; + m_Light.Level[EQ::lightsource::LightEquipment] = 0; for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { - if ((*iter)->equip_slot < EQEmu::invslot::EQUIPMENT_BEGIN || (*iter)->equip_slot > EQEmu::invslot::EQUIPMENT_END) { continue; } - if ((*iter)->equip_slot == EQEmu::invslot::slotAmmo) { continue; } - + if ((*iter)->equip_slot < EQ::invslot::EQUIPMENT_BEGIN || (*iter)->equip_slot > EQ::invslot::EQUIPMENT_END) { continue; } + if ((*iter)->equip_slot == EQ::invslot::slotAmmo) { continue; } + auto item = database.GetItem((*iter)->item_id); if (item == nullptr) { continue; } - - if (EQEmu::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQEmu::lightsource::LightEquipment])) - m_Light.Type[EQEmu::lightsource::LightEquipment] = item->Light; + + if (EQ::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQ::lightsource::LightEquipment])) + m_Light.Type[EQ::lightsource::LightEquipment] = item->Light; } - + uint8 general_light_type = 0; for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { - if ((*iter)->equip_slot < EQEmu::invslot::GENERAL_BEGIN || (*iter)->equip_slot > EQEmu::invslot::GENERAL_END) { continue; } - + if ((*iter)->equip_slot < EQ::invslot::GENERAL_BEGIN || (*iter)->equip_slot > EQ::invslot::GENERAL_END) { continue; } + auto item = database.GetItem((*iter)->item_id); if (item == nullptr) { continue; } - + if (!item->IsClassCommon()) { continue; } if (item->Light < 9 || item->Light > 13) { continue; } - if (EQEmu::lightsource::TypeToLevel(item->Light)) + if (EQ::lightsource::TypeToLevel(item->Light)) general_light_type = item->Light; } - if (EQEmu::lightsource::IsLevelGreater(general_light_type, m_Light.Type[EQEmu::lightsource::LightEquipment])) - m_Light.Type[EQEmu::lightsource::LightEquipment] = general_light_type; + if (EQ::lightsource::IsLevelGreater(general_light_type, m_Light.Type[EQ::lightsource::LightEquipment])) + m_Light.Type[EQ::lightsource::LightEquipment] = general_light_type; - m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); + m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } void Corpse::AddLooter(Mob* who) { @@ -1629,3 +1628,53 @@ void Corpse::LoadPlayerCorpseDecayTime(uint32 corpse_db_id){ corpse_graveyard_timer.SetTimer(3000); } } + +void Corpse::SendWorldSpawnPlayerCorpseInZone(uint32_t zone_id) +{ + auto pack = std::make_unique(ServerOP_SpawnPlayerCorpse, sizeof(SpawnPlayerCorpse_Struct)); + SpawnPlayerCorpse_Struct* spc = reinterpret_cast(pack->pBuffer); + spc->player_corpse_id = corpse_db_id; + spc->zone_id = zone_id; + worldserver.SendPacket(pack.get()); +} + +bool Corpse::MovePlayerCorpseToGraveyard() +{ + if (IsPlayerCorpse() && zone && zone->HasGraveyard()) + { + Save(); + + uint16_t instance_id = (zone->GetZoneID() == zone->graveyard_zoneid()) ? zone->GetInstanceID() : 0; + database.SendCharacterCorpseToGraveyard(corpse_db_id, zone->graveyard_zoneid(), instance_id, zone->GetGraveyardPoint()); + SendWorldSpawnPlayerCorpseInZone(zone->graveyard_zoneid()); + + corpse_db_id = 0; + player_corpse_depop = true; + corpse_graveyard_timer.Disable(); + + LogDebug("Moved [{}] player corpse to the designated graveyard in zone [{}]", GetName(), ZoneName(zone->graveyard_zoneid())); + return true; + } + + return false; +} + +bool Corpse::MovePlayerCorpseToNonInstance() +{ + if (IsPlayerCorpse() && zone && zone->GetInstanceID() != 0) + { + Save(); + + database.SendCharacterCorpseToNonInstance(corpse_db_id); + SendWorldSpawnPlayerCorpseInZone(zone->GetZoneID()); + + corpse_db_id = 0; + player_corpse_depop = true; + corpse_graveyard_timer.Disable(); + + LogDebug("Moved [{}] player corpse to non-instance version of zone [{}]", GetName(), ZoneName(zone->GetZoneID())); + return true; + } + + return false; +} diff --git a/zone/corpse.h b/zone/corpse.h index d453c7e9e..cd564e80d 100644 --- a/zone/corpse.h +++ b/zone/corpse.h @@ -30,7 +30,7 @@ class Raid; struct ExtraAttackOptions; struct NPCType; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -51,9 +51,9 @@ class Corpse : public Mob { static Corpse* LoadCharacterCorpseEntity(uint32 in_dbid, uint32 in_charid, std::string in_charname, const glm::vec4& position, std::string time_of_death, bool rezzed, bool was_at_graveyard, uint32 guild_consent_id); /* Corpse: General */ - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill) { return true; } - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) { return; } - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = true, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) { return false; } + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill) { return true; } + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) { return; } + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = true, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) { return false; } virtual bool HasRaid() { return false; } virtual bool HasGroup() { return false; } virtual Raid* GetRaid() { return 0; } @@ -79,6 +79,9 @@ class Corpse : public Mob { void SetConsentGuildID(uint32 guild_id) { if (IsPlayerCorpse()) { consented_guild_id = guild_id; } } void AddConsentName(std::string consent_player_name); void RemoveConsentName(std::string consent_player_name); + void SendWorldSpawnPlayerCorpseInZone(uint32_t zone_id); + bool MovePlayerCorpseToGraveyard(); + bool MovePlayerCorpseToNonInstance(); void Delete(); void Bury(); @@ -138,7 +141,7 @@ class Corpse : public Mob { virtual void UpdateEquipmentLight(); protected: - void MoveItemToCorpse(Client *client, EQEmu::ItemInstance *inst, int16 equipSlot, std::list &removedList); + void MoveItemToCorpse(Client *client, EQ::ItemInstance *inst, int16 equipSlot, std::list &removedList); private: bool is_player_corpse; /* Determines if Player Corpse or not */ @@ -167,7 +170,7 @@ private: Timer corpse_delay_timer; Timer corpse_graveyard_timer; Timer loot_cooldown_timer; /* Delay between loot actions on the corpse entity */ - EQEmu::TintProfile item_tint; + EQ::TintProfile item_tint; std::vector consented_player_names; LootRequestType loot_request_type; diff --git a/zone/data_bucket.cpp b/zone/data_bucket.cpp index 1ccb21953..13dccef66 100644 --- a/zone/data_bucket.cpp +++ b/zone/data_bucket.cpp @@ -2,6 +2,7 @@ #include #include "../common/string_util.h" #include "zonedb.h" +#include "zone_store.h" #include #include #include @@ -101,6 +102,29 @@ std::string DataBucket::GetDataExpires(std::string bucket_key) { return std::string(row[0]); } +std::string DataBucket::GetDataRemaining(std::string bucket_key) { + if (DataBucket::GetDataExpires(bucket_key).empty()) { + return "0"; + } + std::string query = fmt::format( + "SELECT (`expires` - UNIX_TIMESTAMP()) AS `remaining` from `data_buckets` WHERE `key` = '{}' AND (`expires` > {} OR `expires` = 0) LIMIT 1", + bucket_key.c_str(), + (long long) std::time(nullptr) + ); + + auto results = database.QueryDatabase(query); + if (!results.Success()) { + return std::string(); + } + + if (results.RowCount() != 1) + return std::string(); + + auto row = results.begin(); + + return std::string(row[0]); +} + /** * Checks for bucket existence by bucket_name key * @param bucket_key @@ -172,4 +196,4 @@ uint32 DataBucket::ParseStringTimeToInt(std::string time_string) duration = unit * 31556926; return duration; -} \ No newline at end of file +} diff --git a/zone/data_bucket.h b/zone/data_bucket.h index 88a344637..51d9c643b 100644 --- a/zone/data_bucket.h +++ b/zone/data_bucket.h @@ -15,6 +15,7 @@ public: static bool DeleteData(std::string bucket_key); static std::string GetData(std::string bucket_key); static std::string GetDataExpires(std::string bucket_key); + static std::string GetDataRemaining(std::string bucket_key); private: static uint64 DoesBucketExist(std::string bucket_key); static uint32 ParseStringTimeToInt(std::string time_string); diff --git a/zone/doors.cpp b/zone/doors.cpp index 6cb0617fd..ba3d36d21 100644 --- a/zone/doors.cpp +++ b/zone/doors.cpp @@ -28,6 +28,8 @@ #include "string_ids.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" +#include "../common/repositories/criteria/content_filter_criteria.h" #include #include @@ -205,12 +207,14 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { } } + // todo: if IsDzDoor() call Client::MovePCDynamicZone(target_zone_id) (for systems that use dzs) + uint32 required_key_item = GetKeyItem(); uint8 disable_add_to_key_ring = GetNoKeyring(); uint32 player_has_key = 0; uint32 player_key = 0; - const EQEmu::ItemInstance *lock_pick_item = sender->GetInv().GetItem(EQEmu::invslot::slotCursor); + const EQ::ItemInstance *lock_pick_item = sender->GetInv().GetItem(EQ::invslot::slotCursor); player_has_key = static_cast(sender->GetInv().HasItem(required_key_item, 1)); if (player_has_key != INVALID_INDEX) { @@ -320,10 +324,10 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { * Try Lock pick */ else if (lock_pick_item != nullptr) { - if (sender->GetSkill(EQEmu::skills::SkillPickLock)) { - if (lock_pick_item->GetItem()->ItemType == EQEmu::item::ItemTypeLockPick) { - float player_pick_lock_skill = sender->GetSkill(EQEmu::skills::SkillPickLock); - sender->CheckIncreaseSkill(EQEmu::skills::SkillPickLock, nullptr, 1); + if (sender->GetSkill(EQ::skills::SkillPickLock)) { + if (lock_pick_item->GetItem()->ItemType == EQ::item::ItemTypeLockPick) { + float player_pick_lock_skill = sender->GetSkill(EQ::skills::SkillPickLock); + sender->CheckIncreaseSkill(EQ::skills::SkillPickLock, nullptr, 1); LogSkills("Client has lockpicks: skill=[{}]", player_pick_lock_skill); @@ -451,7 +455,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { if (!disable_add_to_key_ring) { sender->KeyRingAdd(player_key); } - if (content_db.GetZoneID(destination_zone_name) == zone->GetZoneID()) { + if (ZoneID(destination_zone_name) == zone->GetZoneID()) { sender->MovePC( zone->GetZoneID(), zone->GetInstanceID(), @@ -462,7 +466,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { ); } else { sender->MovePC( - content_db.GetZoneID(destination_zone_name), + ZoneID(destination_zone_name), static_cast(destination_instance_id), m_Destination.x, m_Destination.y, @@ -473,7 +477,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { } if ((!IsDoorOpen() || open_type == 58) && (!required_key_item)) { - if (content_db.GetZoneID(destination_zone_name) == zone->GetZoneID()) { + if (ZoneID(destination_zone_name) == zone->GetZoneID()) { sender->MovePC( zone->GetZoneID(), zone->GetInstanceID(), @@ -484,7 +488,7 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { ); } else { sender->MovePC( - content_db.GetZoneID(destination_zone_name), + ZoneID(destination_zone_name), static_cast(this->destination_instance_id), m_Destination.x, m_Destination.y, @@ -716,10 +720,12 @@ bool ZoneDatabase::LoadDoors(int32 door_count, Door *into, const char *zone_name " WHERE " " zone = '%s' " " AND ( version = % u OR version = - 1 ) " + " %s " " ORDER BY " " doorid ASC ", zone_name, - version + version, + ContentFilterCriteria::apply().c_str() ); auto results = QueryDatabase(query); if (!results.Success()) { diff --git a/zone/dynamic_zone.cpp b/zone/dynamic_zone.cpp new file mode 100644 index 000000000..0b19e5ade --- /dev/null +++ b/zone/dynamic_zone.cpp @@ -0,0 +1,216 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "dynamic_zone.h" +#include "client.h" +#include "expedition.h" +#include "worldserver.h" +#include "../common/eqemu_logsys.h" + +extern WorldServer worldserver; + +// message string 8312 added in September 08 2020 Test patch (used by both dz and shared tasks) +const char* const CREATE_NOT_ALL_ADDED = "Not all players in your {} were added to the {}. The {} can take a maximum of {} players, and your {} has {}."; + +DynamicZone::DynamicZone( + uint32_t zone_id, uint32_t version, uint32_t duration, DynamicZoneType type) +{ + m_zone_id = zone_id; + m_zone_version = version; + m_duration = std::chrono::seconds(duration); + m_type = type; +} + +Database& DynamicZone::GetDatabase() +{ + return database; +} + +uint16_t DynamicZone::GetCurrentInstanceID() +{ + return zone ? static_cast(zone->GetInstanceID()) : 0; +} + +uint16_t DynamicZone::GetCurrentZoneID() +{ + return zone ? static_cast(zone->GetZoneID()) : 0; +} + +DynamicZone* DynamicZone::FindDynamicZoneByID(uint32_t dz_id) +{ + auto expedition = Expedition::FindCachedExpeditionByDynamicZoneID(dz_id); + if (expedition) + { + return &expedition->GetDynamicZone(); + } + // todo: other system caches + return nullptr; +} + +void DynamicZone::StartAllClientRemovalTimers() +{ + for (const auto& client_iter : entity_list.GetClientList()) + { + if (client_iter.second) + { + client_iter.second->SetDzRemovalTimer(true); + } + } +} + +void DynamicZone::SendInstanceRemoveAllCharacters() +{ + // just remove all clients in bulk instead of only characters assigned to the instance + if (IsCurrentZoneDzInstance()) + { + DynamicZone::StartAllClientRemovalTimers(); + } + else if (GetInstanceID() != 0) + { + auto pack = CreateServerRemoveAllCharactersPacket(); + worldserver.SendPacket(pack.get()); + } +} + +void DynamicZone::SendInstanceAddRemoveCharacter(uint32_t character_id, bool removed) +{ + // if removing, sets removal timer on client inside the instance + if (IsCurrentZoneDzInstance()) + { + Client* client = entity_list.GetClientByCharID(character_id); + if (client) + { + client->SetDzRemovalTimer(removed); + } + } + else if (GetInstanceID() != 0) + { + auto pack = CreateServerAddRemoveCharacterPacket(character_id, removed); + worldserver.SendPacket(pack.get()); + } +} + +bool DynamicZone::IsCurrentZoneDzInstance() const +{ + return (zone && zone->GetInstanceID() != 0 && zone->GetInstanceID() == GetInstanceID()); +} + +void DynamicZone::SetSecondsRemaining(uint32_t seconds_remaining) +{ + // async + constexpr uint32_t pack_size = sizeof(ServerDzSetDuration_Struct); + auto pack = std::make_unique(ServerOP_DzSetSecondsRemaining, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->dz_id = GetID(); + buf->seconds = seconds_remaining; + worldserver.SendPacket(pack.get()); +} + +void DynamicZone::SetUpdatedDuration(uint32_t new_duration) +{ + // preserves original start time, just modifies duration and expire time + m_duration = std::chrono::seconds(new_duration); + m_expire_time = m_start_time + m_duration; + + LogDynamicZones("Updated zone [{}]:[{}] seconds remaining: [{}]", + m_zone_id, m_instance_id, GetSecondsRemaining()); + + if (zone && IsCurrentZoneDzInstance()) + { + zone->SetInstanceTimer(GetSecondsRemaining()); + } +} + +void DynamicZone::SendGlobalLocationChange(uint16_t server_opcode, const DynamicZoneLocation& location) +{ + auto pack = CreateServerDzLocationPacket(server_opcode, location); + worldserver.SendPacket(pack.get()); +} + +void DynamicZone::HandleWorldMessage(ServerPacket* pack) +{ + switch (pack->opcode) + { + case ServerOP_DzAddRemoveCharacter: + { + auto buf = reinterpret_cast(pack->pBuffer); + Client* client = entity_list.GetClientByCharID(buf->character_id); + if (client) + { + client->SetDzRemovalTimer(buf->remove); // instance kick timer + } + break; + } + case ServerOP_DzRemoveAllCharacters: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (buf->remove) + { + DynamicZone::StartAllClientRemovalTimers(); + } + break; + } + case ServerOP_DzDurationUpdate: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto dz = DynamicZone::FindDynamicZoneByID(buf->dz_id); + if (dz) + { + dz->SetUpdatedDuration(buf->seconds); + } + break; + } + case ServerOP_DzSetCompass: + case ServerOP_DzSetSafeReturn: + case ServerOP_DzSetZoneIn: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto dz = DynamicZone::FindDynamicZoneByID(buf->dz_id); + if (dz) + { + if (pack->opcode == ServerOP_DzSetCompass) + { + dz->SetCompass(buf->zone_id, buf->x, buf->y, buf->z, false); + } + else if (pack->opcode == ServerOP_DzSetSafeReturn) + { + dz->SetSafeReturn(buf->zone_id, buf->x, buf->y, buf->z, buf->heading, false); + } + else if (pack->opcode == ServerOP_DzSetZoneIn) + { + dz->SetZoneInLocation(buf->x, buf->y, buf->z, buf->heading, false); + } + } + } + break; + } + } +} + +void DynamicZone::ProcessCompassChange(const DynamicZoneLocation& location) +{ + DynamicZoneBase::ProcessCompassChange(location); + if (m_on_compass_change) + { + m_on_compass_change(); + } +} diff --git a/zone/dynamic_zone.h b/zone/dynamic_zone.h new file mode 100644 index 000000000..3b421330a --- /dev/null +++ b/zone/dynamic_zone.h @@ -0,0 +1,68 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef DYNAMIC_ZONE_H +#define DYNAMIC_ZONE_H + +#include "../common/dynamic_zone_base.h" +#include +#include +#include +#include +#include + +class Database; +class ServerPacket; + +extern const char* const CREATE_NOT_ALL_ADDED; + +class DynamicZone : public DynamicZoneBase +{ +public: + using DynamicZoneBase::DynamicZoneBase; // inherit base constructors + + DynamicZone() = default; + DynamicZone(uint32_t zone_id, uint32_t version, uint32_t duration, DynamicZoneType type); + + static DynamicZone* FindDynamicZoneByID(uint32_t dz_id); + static void HandleWorldMessage(ServerPacket* pack); + + void SetSecondsRemaining(uint32_t seconds_remaining) override; + + bool IsCurrentZoneDzInstance() const; + void RegisterOnCompassChange(const std::function& on_change) { m_on_compass_change = on_change; } + void SetUpdatedDuration(uint32_t seconds); + +protected: + uint16_t GetCurrentInstanceID() override; + uint16_t GetCurrentZoneID() override; + Database& GetDatabase() override; + void ProcessCompassChange(const DynamicZoneLocation& location) override; + void SendInstanceAddRemoveCharacter(uint32_t character_id, bool remove) override; + void SendInstanceRemoveAllCharacters() override; + void SendGlobalLocationChange(uint16_t server_opcode, const DynamicZoneLocation& location) override; + +private: + static void StartAllClientRemovalTimers(); + + std::function m_on_compass_change; +}; + +#endif diff --git a/zone/effects.cpp b/zone/effects.cpp index 7e2ecdbc7..b095c84a3 100644 --- a/zone/effects.cpp +++ b/zone/effects.cpp @@ -28,6 +28,7 @@ #include "string_ids.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" #include "position.h" float Mob::GetActSpellRange(uint16 spell_id, float range, bool IsBard) @@ -432,14 +433,14 @@ int32 Client::GetActSpellCasttime(uint16 spell_id, int32 casttime) bool Client::TrainDiscipline(uint32 itemid) { //get the item info - const EQEmu::ItemData *item = database.GetItem(itemid); + const EQ::ItemData *item = database.GetItem(itemid); if(item == nullptr) { Message(Chat::Red, "Unable to find the tome you turned in!"); LogError("Unable to find turned in tome id [{}]\n", (unsigned long)itemid); return(false); } - if (!item->IsClassCommon() || item->ItemType != EQEmu::item::ItemTypeSpell) { + if (!item->IsClassCommon() || item->ItemType != EQ::item::ItemTypeSpell) { Message(Chat::Red, "Invalid item type, you cannot learn from this item."); //summon them the item back... SummonItem(itemid); @@ -554,7 +555,7 @@ int Client::GetDiscSlotBySpellID(int32 spellid) if(m_pp.disciplines.values[i] == spellid) return i; } - + return -1; } @@ -645,9 +646,9 @@ bool Client::UseDiscipline(uint32 spell_id, uint32 target) { } if (reduced_recast > 0) - CastSpell(spell_id, target, EQEmu::spells::CastingSlot::Discipline, -1, -1, 0, -1, (uint32)DiscTimer, reduced_recast); + CastSpell(spell_id, target, EQ::spells::CastingSlot::Discipline, -1, -1, 0, -1, (uint32)DiscTimer, reduced_recast); else{ - CastSpell(spell_id, target, EQEmu::spells::CastingSlot::Discipline); + CastSpell(spell_id, target, EQ::spells::CastingSlot::Discipline); return true; } @@ -655,11 +656,39 @@ bool Client::UseDiscipline(uint32 spell_id, uint32 target) { } else { - CastSpell(spell_id, target, EQEmu::spells::CastingSlot::Discipline); + CastSpell(spell_id, target, EQ::spells::CastingSlot::Discipline); } return(true); } +uint32 Client::GetDisciplineTimer(uint32 timer_id) { + pTimerType disc_timer_id = pTimerDisciplineReuseStart + timer_id; + uint32 disc_timer = 0; + if (GetPTimers().Enabled((uint32)disc_timer_id)) { + disc_timer = GetPTimers().GetRemainingTime(disc_timer_id); + } + return disc_timer; +} + +void Client::ResetDisciplineTimer(uint32 timer_id) { + pTimerType disc_timer_id = pTimerDisciplineReuseStart + timer_id; + if (GetPTimers().Enabled((uint32)disc_timer_id)) { + GetPTimers().Clear(&database, (uint32)disc_timer_id); + } + SendDisciplineTimer(timer_id, 0); +} + +bool Client::HasDisciplineLearned(uint16 spell_id) { + bool has_learned = false; + for (auto index = 0; index < MAX_PP_DISCIPLINES; ++index) { + if (GetPP().disciplines.values[index] == spell_id) { + has_learned = true; + break; + } + } + return has_learned; +} + void Client::SendDisciplineTimer(uint32 timer_id, uint32 duration) { if (timer_id < MAX_DISCIPLINE_TIMERS) @@ -888,6 +917,9 @@ void EntityList::AESpell( } } + current_mob->CalcSpellPowerDistanceMod(spell_id, distance_to_target); + caster_mob->SpellOnTarget(spell_id, current_mob, false, true, resist_adjust); + /** * Increment hit count if max targets */ @@ -897,9 +929,6 @@ void EntityList::AESpell( break; } } - - current_mob->CalcSpellPowerDistanceMod(spell_id, distance_to_target); - caster_mob->SpellOnTarget(spell_id, current_mob, false, true, resist_adjust); } LogAoeCast("Done iterating [{}]", caster_mob->GetCleanName()); diff --git a/zone/embparser.cpp b/zone/embparser.cpp index f89c09ad4..c19ac6671 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -165,8 +165,8 @@ void PerlembParser::ReloadQuests() } int PerlembParser::EventCommon( - QuestEventID event, uint32 objid, const char *data, NPC *npcmob, EQEmu::ItemInstance *item_inst, Mob *mob, - uint32 extradata, bool global, std::vector *extra_pointers + QuestEventID event, uint32 objid, const char *data, NPC *npcmob, EQ::ItemInstance *item_inst, Mob *mob, + uint32 extradata, bool global, std::vector *extra_pointers ) { if (!perl) { @@ -266,7 +266,7 @@ int PerlembParser::EventCommon( int PerlembParser::EventNPC( QuestEventID evt, NPC *npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers + std::vector *extra_pointers ) { return EventCommon(evt, npc->GetNPCTypeID(), data.c_str(), npc, nullptr, init, extra_data, false, extra_pointers); @@ -274,7 +274,7 @@ int PerlembParser::EventNPC( int PerlembParser::EventGlobalNPC( QuestEventID evt, NPC *npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers + std::vector *extra_pointers ) { return EventCommon(evt, npc->GetNPCTypeID(), data.c_str(), npc, nullptr, init, extra_data, true, extra_pointers); @@ -282,7 +282,7 @@ int PerlembParser::EventGlobalNPC( int PerlembParser::EventPlayer( QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers + std::vector *extra_pointers ) { return EventCommon(evt, 0, data.c_str(), nullptr, nullptr, client, extra_data, false, extra_pointers); @@ -290,15 +290,15 @@ int PerlembParser::EventPlayer( int PerlembParser::EventGlobalPlayer( QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers + std::vector *extra_pointers ) { return EventCommon(evt, 0, data.c_str(), nullptr, nullptr, client, extra_data, true, extra_pointers); } int PerlembParser::EventItem( - QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers + QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers ) { // needs pointer validation on 'item' argument @@ -307,7 +307,7 @@ int PerlembParser::EventItem( int PerlembParser::EventSpell( QuestEventID evt, NPC *npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers + std::vector *extra_pointers ) { return EventCommon(evt, 0, itoa(spell_id), npc, nullptr, client, extra_data, false, extra_pointers); @@ -416,7 +416,7 @@ bool PerlembParser::SpellHasQuestSub(uint32 spell_id, QuestEventID evt) return (perl->SubExists(package_name.str().c_str(), subname)); } -bool PerlembParser::ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt) +bool PerlembParser::ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt) { std::stringstream package_name; package_name << "qst_item_" << itm->GetID(); @@ -564,7 +564,7 @@ void PerlembParser::LoadGlobalPlayerScript(std::string filename) global_player_quest_status_ = questLoaded; } -void PerlembParser::LoadItemScript(std::string filename, EQEmu::ItemInstance *item) +void PerlembParser::LoadItemScript(std::string filename, EQ::ItemInstance *item) { if (item == nullptr) { return; @@ -776,7 +776,7 @@ int PerlembParser::SendCommands( uint32 npcid, Mob *other, Mob *mob, - EQEmu::ItemInstance *item_inst + EQ::ItemInstance *item_inst ) { if (!perl) { @@ -852,7 +852,7 @@ int PerlembParser::SendCommands( //only export QuestItem if it's an item quest if (item_inst) { - EQEmu::ItemInstance *curi = quest_manager.GetQuestItem(); + EQ::ItemInstance *curi = quest_manager.GetQuestItem(); snprintf(namebuf, 64, "%s::questitem", pkgprefix); SV *questitem = get_sv(namebuf, true); sv_setref_pv(questitem, "QuestItem", curi); @@ -959,6 +959,9 @@ void PerlembParser::MapFunctions() "package Raid;" "&boot_Raid;" //load our Raid XS + "package Inventory;" + "&boot_Inventory;" // load inventory XS + "package QuestItem;" "&boot_QuestItem;" // load quest Item XS @@ -971,6 +974,9 @@ void PerlembParser::MapFunctions() "package Doors;" "&boot_Doors;" // load quest Doors XS + "package Expedition;" + "&boot_Expedition;" + #endif "package main;" "}" @@ -979,7 +985,7 @@ void PerlembParser::MapFunctions() void PerlembParser::GetQuestTypes( bool &isPlayerQuest, bool &isGlobalPlayerQuest, bool &isGlobalNPC, bool &isItemQuest, - bool &isSpellQuest, QuestEventID event, NPC *npcmob, EQEmu::ItemInstance *item_inst, Mob *mob, bool global + bool &isSpellQuest, QuestEventID event, NPC *npcmob, EQ::ItemInstance *item_inst, Mob *mob, bool global ) { if (event == EVENT_SPELL_EFFECT_CLIENT || @@ -1018,7 +1024,7 @@ void PerlembParser::GetQuestPackageName( uint32 objid, const char *data, NPC *npcmob, - EQEmu::ItemInstance *item_inst, + EQ::ItemInstance *item_inst, bool global ) { @@ -1033,8 +1039,8 @@ void PerlembParser::GetQuestPackageName( } } else if (isItemQuest) { - // need a valid EQEmu::ItemInstance pointer check here..unsure how to cancel this process - const EQEmu::ItemData *item = item_inst->GetItem(); + // need a valid EQ::ItemInstance pointer check here..unsure how to cancel this process + const EQ::ItemData *item = item_inst->GetItem(); package_name = "qst_item_"; package_name += itoa(item->ID); } @@ -1263,13 +1269,12 @@ void PerlembParser::ExportItemVariables(std::string &package_name, Mob *mob) //start with an empty hash perl->eval(std::string("%").append(hashname).append(" = ();").c_str()); - for (int slot = EQEmu::invslot::EQUIPMENT_BEGIN; slot <= EQEmu::invslot::GENERAL_END; slot++) { - char *hi_decl = nullptr; + for (int slot = EQ::invslot::EQUIPMENT_BEGIN; slot <= EQ::invslot::GENERAL_END; slot++) { int itemid = mob->CastToClient()->GetItemIDAt(slot); if (itemid != -1 && itemid != 0) { - MakeAnyLenString(&hi_decl, "push (@{$%s{%d}},%d);", hashname.c_str(), itemid, slot); - perl->eval(hi_decl); - safe_delete_array(hi_decl); + // this is really ugly with fmtlib, I think I did it right + auto hi_decl = fmt::format("push (@{{${0}{{{1}}}}},{2});", hashname, itemid, slot); + perl->eval(hi_decl.c_str()); } } } @@ -1277,19 +1282,18 @@ void PerlembParser::ExportItemVariables(std::string &package_name, Mob *mob) if (mob && mob->IsClient()) { std::string hashname = package_name + std::string("::oncursor"); perl->eval(std::string("%").append(hashname).append(" = ();").c_str()); - char *hi_decl = nullptr; - int itemid = mob->CastToClient()->GetItemIDAt(EQEmu::invslot::slotCursor); + int itemid = mob->CastToClient()->GetItemIDAt(EQ::invslot::slotCursor); if (itemid != -1 && itemid != 0) { - MakeAnyLenString(&hi_decl, "push (@{$%s{%d}},%d);", hashname.c_str(), itemid, EQEmu::invslot::slotCursor); - perl->eval(hi_decl); - safe_delete_array(hi_decl); + // this is really ugly with fmtlib, I think I did it right + auto hi_decl = fmt::format("push (@{{${0}{{{1}}}}},{2});", hashname, itemid, EQ::invslot::slotCursor); + perl->eval(hi_decl.c_str()); } } } void PerlembParser::ExportEventVariables( std::string &package_name, QuestEventID event, uint32 objid, const char *data, - NPC *npcmob, EQEmu::ItemInstance *item_inst, Mob *mob, uint32 extradata, std::vector *extra_pointers + NPC *npcmob, EQ::ItemInstance *item_inst, Mob *mob, uint32 extradata, std::vector *extra_pointers ) { switch (event) { @@ -1308,7 +1312,7 @@ void PerlembParser::ExportEventVariables( if (extra_pointers) { size_t sz = extra_pointers->size(); for (size_t i = 0; i < sz; ++i) { - EQEmu::ItemInstance *inst = EQEmu::any_cast(extra_pointers->at(i)); + EQ::ItemInstance *inst = EQ::any_cast(extra_pointers->at(i)); std::string var_name = "item"; var_name += std::to_string(i + 1); @@ -1476,7 +1480,7 @@ void PerlembParser::ExportEventVariables( case EVENT_SCALE_CALC: case EVENT_ITEM_ENTER_ZONE: { - // need a valid EQEmu::ItemInstance pointer check here..unsure how to cancel this process + // need a valid EQ::ItemInstance pointer check here..unsure how to cancel this process ExportVar(package_name.c_str(), "itemid", objid); ExportVar(package_name.c_str(), "itemname", item_inst->GetItem()->Name); break; @@ -1484,7 +1488,7 @@ void PerlembParser::ExportEventVariables( case EVENT_ITEM_CLICK_CAST: case EVENT_ITEM_CLICK: { - // need a valid EQEmu::ItemInstance pointer check here..unsure how to cancel this process + // need a valid EQ::ItemInstance pointer check here..unsure how to cancel this process ExportVar(package_name.c_str(), "itemid", objid); ExportVar(package_name.c_str(), "itemname", item_inst->GetItem()->Name); ExportVar(package_name.c_str(), "slotid", extradata); diff --git a/zone/embparser.h b/zone/embparser.h index 1e4c9c391..ed7989a99 100644 --- a/zone/embparser.h +++ b/zone/embparser.h @@ -31,7 +31,7 @@ class Mob; class Client; class NPC; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -49,30 +49,30 @@ public: ~PerlembParser(); virtual int EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventGlobalNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventGlobalPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers); - virtual int EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); + virtual int EventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); virtual int EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual bool HasQuestSub(uint32 npcid, QuestEventID evt); virtual bool HasGlobalQuestSub(QuestEventID evt); virtual bool PlayerHasQuestSub(QuestEventID evt); virtual bool GlobalPlayerHasQuestSub(QuestEventID evt); virtual bool SpellHasQuestSub(uint32 spell_id, QuestEventID evt); - virtual bool ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt); + virtual bool ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt); virtual void LoadNPCScript(std::string filename, int npc_id); virtual void LoadGlobalNPCScript(std::string filename); virtual void LoadPlayerScript(std::string filename); virtual void LoadGlobalPlayerScript(std::string filename); - virtual void LoadItemScript(std::string filename, EQEmu::ItemInstance *item); + virtual void LoadItemScript(std::string filename, EQ::ItemInstance *item); virtual void LoadSpellScript(std::string filename, uint32 spell_id); virtual void AddVar(std::string name, std::string val); @@ -90,16 +90,16 @@ private: void ExportVar(const char *pkgprefix, const char *varname, float value); void ExportVarComplex(const char *pkgprefix, const char *varname, const char *value); - int EventCommon(QuestEventID event, uint32 objid, const char * data, NPC* npcmob, EQEmu::ItemInstance* item_inst, Mob* mob, - uint32 extradata, bool global, std::vector *extra_pointers); - int SendCommands(const char *pkgprefix, const char *event, uint32 npcid, Mob* other, Mob* mob, EQEmu::ItemInstance *item_inst); + int EventCommon(QuestEventID event, uint32 objid, const char * data, NPC* npcmob, EQ::ItemInstance* item_inst, Mob* mob, + uint32 extradata, bool global, std::vector *extra_pointers); + int SendCommands(const char *pkgprefix, const char *event, uint32 npcid, Mob* other, Mob* mob, EQ::ItemInstance *item_inst); void MapFunctions(); void GetQuestTypes(bool &isPlayerQuest, bool &isGlobalPlayerQuest, bool &isGlobalNPC, bool &isItemQuest, - bool &isSpellQuest, QuestEventID event, NPC* npcmob, EQEmu::ItemInstance* item_inst, Mob* mob, bool global); + bool &isSpellQuest, QuestEventID event, NPC* npcmob, EQ::ItemInstance* item_inst, Mob* mob, bool global); void GetQuestPackageName(bool &isPlayerQuest, bool &isGlobalPlayerQuest, bool &isGlobalNPC, bool &isItemQuest, bool &isSpellQuest, std::string &package_name, QuestEventID event, uint32 objid, const char * data, - NPC* npcmob, EQEmu::ItemInstance* item_inst, bool global); + NPC* npcmob, EQ::ItemInstance* item_inst, bool global); void ExportCharID(const std::string &package_name, int &char_id, NPC *npcmob, Mob *mob); void ExportQGlobals(bool isPlayerQuest, bool isGlobalPlayerQuest, bool isGlobalNPC, bool isItemQuest, bool isSpellQuest, std::string &package_name, NPC *npcmob, Mob *mob, int char_id); @@ -108,7 +108,7 @@ private: void ExportZoneVariables(std::string &package_name); void ExportItemVariables(std::string &package_name, Mob *mob); void ExportEventVariables(std::string &package_name, QuestEventID event, uint32 objid, const char * data, - NPC* npcmob, EQEmu::ItemInstance* item_inst, Mob* mob, uint32 extradata, std::vector *extra_pointers); + NPC* npcmob, EQ::ItemInstance* item_inst, Mob* mob, uint32 extradata, std::vector *extra_pointers); std::map npc_quest_status_; PerlQuestStatus global_npc_quest_status_; diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index efdc09803..f0ba69526 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -17,6 +17,7 @@ */ #include "../common/features.h" +#include "../common/content/world_content_service.h" #ifdef EMBPERL #ifdef EMBPERL_XS @@ -28,6 +29,7 @@ #include "embparser.h" #include "embxs.h" #include "entity.h" +#include "expedition.h" #include "queryserv.h" #include "questmgr.h" #include "zone.h" @@ -102,6 +104,23 @@ XS(XS_EntityList_new) { XSRETURN(1); } +//Any creation of new inventory gets the curreny inventory +XS(XS_Inventory_new); +XS(XS_Inventory_new) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::Inventory::new()"); + + EQ::InventoryProfile* RETVAL; + + RETVAL = quest_manager.GetInventory(); + ST(0) = sv_newmortal(); + if (RETVAL) + sv_setref_pv(ST(0), "Inventory", (void *) RETVAL); + + XSRETURN(1); +} + //Any creation of new quest items gets the current quest item XS(XS_QuestItem_new); XS(XS_QuestItem_new) { @@ -109,7 +128,7 @@ XS(XS_QuestItem_new) { if (items != 1) Perl_croak(aTHX_ "Usage: quest::QuestItem::new()"); - EQEmu::ItemInstance *RETVAL; + EQ::ItemInstance *RETVAL; RETVAL = quest_manager.GetQuestItem(); ST(0) = sv_newmortal(); @@ -372,7 +391,7 @@ XS(XS__getinventoryslotid) { if (items != 1) Perl_croak(aTHX_ "Usage: quest::getinventoryslotid(string identifier)"); - int16 RETVAL = EQEmu::invslot::SLOT_INVALID; + int16 RETVAL = EQ::invslot::SLOT_INVALID; dXSTARG; std::string identifier = (Const_char *)SvPV_nolen(ST(0)); @@ -380,89 +399,89 @@ XS(XS__getinventoryslotid) { identifier[i] = std::tolower(identifier[i]); if (identifier.find('.') == std::string::npos) { - if (identifier == "invalid") RETVAL = EQEmu::invslot::SLOT_INVALID; - else if (identifier == "charm") RETVAL = EQEmu::invslot::slotCharm; - else if (identifier == "ear1") RETVAL = EQEmu::invslot::slotEar1; - else if (identifier == "head") RETVAL = EQEmu::invslot::slotHead; - else if (identifier == "face") RETVAL = EQEmu::invslot::slotFace; - else if (identifier == "ear2") RETVAL = EQEmu::invslot::slotEar2; - else if (identifier == "neck") RETVAL = EQEmu::invslot::slotNeck; - else if (identifier == "shoulders") RETVAL = EQEmu::invslot::slotShoulders; - else if (identifier == "arms") RETVAL = EQEmu::invslot::slotArms; - else if (identifier == "back") RETVAL = EQEmu::invslot::slotBack; - else if (identifier == "wrist1") RETVAL = EQEmu::invslot::slotWrist1; - else if (identifier == "wrist2") RETVAL = EQEmu::invslot::slotWrist2; - else if (identifier == "range") RETVAL = EQEmu::invslot::slotRange; - else if (identifier == "hands") RETVAL = EQEmu::invslot::slotHands; - else if (identifier == "primary") RETVAL = EQEmu::invslot::slotPrimary; - else if (identifier == "secondary") RETVAL = EQEmu::invslot::slotSecondary; - else if (identifier == "finger1") RETVAL = EQEmu::invslot::slotFinger1; - else if (identifier == "finger2") RETVAL = EQEmu::invslot::slotFinger2; - else if (identifier == "chest") RETVAL = EQEmu::invslot::slotChest; - else if (identifier == "legs") RETVAL = EQEmu::invslot::slotLegs; - else if (identifier == "feet") RETVAL = EQEmu::invslot::slotFeet; - else if (identifier == "waist") RETVAL = EQEmu::invslot::slotWaist; - else if (identifier == "powersource") RETVAL = EQEmu::invslot::slotPowerSource; - else if (identifier == "ammo") RETVAL = EQEmu::invslot::slotAmmo; - else if (identifier == "general1") RETVAL = EQEmu::invslot::slotGeneral1; - else if (identifier == "general2") RETVAL = EQEmu::invslot::slotGeneral2; - else if (identifier == "general3") RETVAL = EQEmu::invslot::slotGeneral3; - else if (identifier == "general4") RETVAL = EQEmu::invslot::slotGeneral4; - else if (identifier == "general5") RETVAL = EQEmu::invslot::slotGeneral5; - else if (identifier == "general6") RETVAL = EQEmu::invslot::slotGeneral6; - else if (identifier == "general7") RETVAL = EQEmu::invslot::slotGeneral7; - else if (identifier == "general8") RETVAL = EQEmu::invslot::slotGeneral8; - else if (identifier == "general9") RETVAL = EQEmu::invslot::slotGeneral9; - else if (identifier == "general10") RETVAL = EQEmu::invslot::slotGeneral10; - else if (identifier == "cursor") RETVAL = EQEmu::invslot::slotCursor; - else if (identifier == "tradeskill") RETVAL = EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; - else if (identifier == "augment") RETVAL = EQEmu::invslot::SLOT_AUGMENT_GENERIC_RETURN; + if (identifier == "invalid") RETVAL = EQ::invslot::SLOT_INVALID; + else if (identifier == "charm") RETVAL = EQ::invslot::slotCharm; + else if (identifier == "ear1") RETVAL = EQ::invslot::slotEar1; + else if (identifier == "head") RETVAL = EQ::invslot::slotHead; + else if (identifier == "face") RETVAL = EQ::invslot::slotFace; + else if (identifier == "ear2") RETVAL = EQ::invslot::slotEar2; + else if (identifier == "neck") RETVAL = EQ::invslot::slotNeck; + else if (identifier == "shoulders") RETVAL = EQ::invslot::slotShoulders; + else if (identifier == "arms") RETVAL = EQ::invslot::slotArms; + else if (identifier == "back") RETVAL = EQ::invslot::slotBack; + else if (identifier == "wrist1") RETVAL = EQ::invslot::slotWrist1; + else if (identifier == "wrist2") RETVAL = EQ::invslot::slotWrist2; + else if (identifier == "range") RETVAL = EQ::invslot::slotRange; + else if (identifier == "hands") RETVAL = EQ::invslot::slotHands; + else if (identifier == "primary") RETVAL = EQ::invslot::slotPrimary; + else if (identifier == "secondary") RETVAL = EQ::invslot::slotSecondary; + else if (identifier == "finger1") RETVAL = EQ::invslot::slotFinger1; + else if (identifier == "finger2") RETVAL = EQ::invslot::slotFinger2; + else if (identifier == "chest") RETVAL = EQ::invslot::slotChest; + else if (identifier == "legs") RETVAL = EQ::invslot::slotLegs; + else if (identifier == "feet") RETVAL = EQ::invslot::slotFeet; + else if (identifier == "waist") RETVAL = EQ::invslot::slotWaist; + else if (identifier == "powersource") RETVAL = EQ::invslot::slotPowerSource; + else if (identifier == "ammo") RETVAL = EQ::invslot::slotAmmo; + else if (identifier == "general1") RETVAL = EQ::invslot::slotGeneral1; + else if (identifier == "general2") RETVAL = EQ::invslot::slotGeneral2; + else if (identifier == "general3") RETVAL = EQ::invslot::slotGeneral3; + else if (identifier == "general4") RETVAL = EQ::invslot::slotGeneral4; + else if (identifier == "general5") RETVAL = EQ::invslot::slotGeneral5; + else if (identifier == "general6") RETVAL = EQ::invslot::slotGeneral6; + else if (identifier == "general7") RETVAL = EQ::invslot::slotGeneral7; + else if (identifier == "general8") RETVAL = EQ::invslot::slotGeneral8; + else if (identifier == "general9") RETVAL = EQ::invslot::slotGeneral9; + else if (identifier == "general10") RETVAL = EQ::invslot::slotGeneral10; + else if (identifier == "cursor") RETVAL = EQ::invslot::slotCursor; + else if (identifier == "tradeskill") RETVAL = EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE; + else if (identifier == "augment") RETVAL = EQ::invslot::SLOT_AUGMENT_GENERIC_RETURN; } else { - if (identifier == "possessions.begin") RETVAL = EQEmu::invslot::POSSESSIONS_BEGIN; - else if (identifier == "possessions.end") RETVAL = EQEmu::invslot::POSSESSIONS_END; - else if (identifier == "equipment.begin") RETVAL = EQEmu::invslot::EQUIPMENT_BEGIN; - else if (identifier == "equipment.end") RETVAL = EQEmu::invslot::EQUIPMENT_END; - else if (identifier == "general.begin") RETVAL = EQEmu::invslot::GENERAL_BEGIN; - else if (identifier == "general.end") RETVAL = EQEmu::invslot::GENERAL_END; - else if (identifier == "possessionsbags.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN; - else if (identifier == "possessionsbags.end") RETVAL = EQEmu::invbag::CURSOR_BAG_END; - else if (identifier == "generalbags.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN; - else if (identifier == "generalbags.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_END; - else if (identifier == "general1bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN; - else if (identifier == "general1bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 9; - else if (identifier == "general2bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 10; - else if (identifier == "general2bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 19; - else if (identifier == "general3bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 20; - else if (identifier == "general3bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 29; - else if (identifier == "general4bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 30; - else if (identifier == "general4bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 39; - else if (identifier == "general5bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 40; - else if (identifier == "general5bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 49; - else if (identifier == "general6bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 50; - else if (identifier == "general6bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 59; - else if (identifier == "general7bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 60; - else if (identifier == "general7bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 69; - else if (identifier == "general8bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 70; - else if (identifier == "general8bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 79; - else if (identifier == "general9bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 80; - else if (identifier == "general9bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 89; - else if (identifier == "general10bag.begin") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 90; - else if (identifier == "general10bag.end") RETVAL = EQEmu::invbag::GENERAL_BAGS_BEGIN + 99; - else if (identifier == "cursorbag.begin") RETVAL = EQEmu::invbag::CURSOR_BAG_BEGIN; - else if (identifier == "cursorbag.end") RETVAL = EQEmu::invbag::CURSOR_BAG_END; - else if (identifier == "bank.begin") RETVAL = EQEmu::invslot::BANK_BEGIN; - else if (identifier == "bank.end") RETVAL = EQEmu::invslot::BANK_END; - else if (identifier == "bankbags.begin") RETVAL = EQEmu::invbag::BANK_BAGS_BEGIN; - else if (identifier == "bankbags.end") RETVAL = EQEmu::invbag::BANK_BAGS_END; - else if (identifier == "sharedbank.begin") RETVAL = EQEmu::invslot::SHARED_BANK_BEGIN; - else if (identifier == "sharedbank.end") RETVAL = EQEmu::invslot::SHARED_BANK_END; - else if (identifier == "sharedbankbags.begin") RETVAL = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN; - else if (identifier == "sharedbankbags.end") RETVAL = EQEmu::invbag::SHARED_BANK_BAGS_END; - else if (identifier == "bagslot.begin") RETVAL = EQEmu::invbag::SLOT_BEGIN; - else if (identifier == "bagslot.end") RETVAL = EQEmu::invbag::SLOT_END; - else if (identifier == "augsocket.begin") RETVAL = EQEmu::invaug::SOCKET_BEGIN; - else if (identifier == "augsocket.end") RETVAL = EQEmu::invaug::SOCKET_END; + if (identifier == "possessions.begin") RETVAL = EQ::invslot::POSSESSIONS_BEGIN; + else if (identifier == "possessions.end") RETVAL = EQ::invslot::POSSESSIONS_END; + else if (identifier == "equipment.begin") RETVAL = EQ::invslot::EQUIPMENT_BEGIN; + else if (identifier == "equipment.end") RETVAL = EQ::invslot::EQUIPMENT_END; + else if (identifier == "general.begin") RETVAL = EQ::invslot::GENERAL_BEGIN; + else if (identifier == "general.end") RETVAL = EQ::invslot::GENERAL_END; + else if (identifier == "possessionsbags.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN; + else if (identifier == "possessionsbags.end") RETVAL = EQ::invbag::CURSOR_BAG_END; + else if (identifier == "generalbags.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN; + else if (identifier == "generalbags.end") RETVAL = EQ::invbag::GENERAL_BAGS_END; + else if (identifier == "general1bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN; + else if (identifier == "general1bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 9; + else if (identifier == "general2bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 10; + else if (identifier == "general2bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 19; + else if (identifier == "general3bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 20; + else if (identifier == "general3bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 29; + else if (identifier == "general4bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 30; + else if (identifier == "general4bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 39; + else if (identifier == "general5bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 40; + else if (identifier == "general5bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 49; + else if (identifier == "general6bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 50; + else if (identifier == "general6bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 59; + else if (identifier == "general7bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 60; + else if (identifier == "general7bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 69; + else if (identifier == "general8bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 70; + else if (identifier == "general8bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 79; + else if (identifier == "general9bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 80; + else if (identifier == "general9bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 89; + else if (identifier == "general10bag.begin") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 90; + else if (identifier == "general10bag.end") RETVAL = EQ::invbag::GENERAL_BAGS_BEGIN + 99; + else if (identifier == "cursorbag.begin") RETVAL = EQ::invbag::CURSOR_BAG_BEGIN; + else if (identifier == "cursorbag.end") RETVAL = EQ::invbag::CURSOR_BAG_END; + else if (identifier == "bank.begin") RETVAL = EQ::invslot::BANK_BEGIN; + else if (identifier == "bank.end") RETVAL = EQ::invslot::BANK_END; + else if (identifier == "bankbags.begin") RETVAL = EQ::invbag::BANK_BAGS_BEGIN; + else if (identifier == "bankbags.end") RETVAL = EQ::invbag::BANK_BAGS_END; + else if (identifier == "sharedbank.begin") RETVAL = EQ::invslot::SHARED_BANK_BEGIN; + else if (identifier == "sharedbank.end") RETVAL = EQ::invslot::SHARED_BANK_END; + else if (identifier == "sharedbankbags.begin") RETVAL = EQ::invbag::SHARED_BANK_BAGS_BEGIN; + else if (identifier == "sharedbankbags.end") RETVAL = EQ::invbag::SHARED_BANK_BAGS_END; + else if (identifier == "bagslot.begin") RETVAL = EQ::invbag::SLOT_BEGIN; + else if (identifier == "bagslot.end") RETVAL = EQ::invbag::SLOT_END; + else if (identifier == "augsocket.begin") RETVAL = EQ::invaug::SOCKET_BEGIN; + else if (identifier == "augsocket.end") RETVAL = EQ::invaug::SOCKET_END; } XSprePUSH; PUSHu((IV)RETVAL); @@ -530,6 +549,32 @@ XS(XS__zone) { XSRETURN_EMPTY; } +XS(XS__zonegroup); +XS(XS__zonegroup) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::zonegroup(string zone_name)"); + + char *zone_name = (char *) SvPV_nolen(ST(0)); + + quest_manager.ZoneGroup(zone_name); + + XSRETURN_EMPTY; +} + +XS(XS__zoneraid); +XS(XS__zoneraid) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::zoneraid(string zone_name)"); + + char *zone_name = (char *) SvPV_nolen(ST(0)); + + quest_manager.ZoneRaid(zone_name); + + XSRETURN_EMPTY; +} + XS(XS__settimer); XS(XS__settimer) { dXSARGS; @@ -822,6 +867,75 @@ XS(XS__isdisctome) { XSRETURN(1); } +XS(XS__getracename); +XS(XS__getracename) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getracename(uint16 race_id)"); + + dXSTARG; + uint16 race_id = (int) SvIV(ST(0)); + std::string race_name = quest_manager.getracename(race_id); + + sv_setpv(TARG, race_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__getspellname); +XS(XS__getspellname) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getspellname(uint32 spell_id)"); + + dXSTARG; + uint32 spell_id = (int) SvIV(ST(0)); + std::string spell_name = quest_manager.getspellname(spell_id); + + sv_setpv(TARG, spell_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__get_spell_level); +XS(XS__get_spell_level) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::get_spell_level(uint16 spell_id, uint8 class_id)"); + + dXSTARG; + uint16 spell_id = (int)SvIV(ST(0)); + uint8 class_id = (int)SvIV(ST(1)); + uint8 spell_level = IsValidSpell(spell_id) ? GetSpellLevel(spell_id, class_id) : 0; + uint8 server_max_level = RuleI(Character, MaxLevel); + + if (spell_level && spell_level > server_max_level) + spell_level = 0; + + XSprePUSH; + PUSHu((UV)spell_level); + + XSRETURN(1); +} + +XS(XS__getskillname); +XS(XS__getskillname) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getskillname(int skill_id)"); + + dXSTARG; + int skill_id = (int) SvIV(ST(0)); + std::string skill_name = quest_manager.getskillname(skill_id); + + sv_setpv(TARG, skill_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + XS(XS__safemove); XS(XS__safemove) { dXSARGS; @@ -1381,14 +1495,19 @@ XS(XS__ding) { XS(XS__rebind); XS(XS__rebind) { dXSARGS; - if (items != 4) - Perl_croak(aTHX_ "Usage: quest::rebind(int zone_id, float x, float y, float z)"); - - int zone_id = (int) SvIV(ST(0)); - auto location = glm::vec3((float) SvNV(ST(1)), (float) SvNV(ST(2)), (float) SvNV(ST(3))); - - quest_manager.rebind(zone_id, location); + if (items < 4 || items > 5) + Perl_croak(aTHX_ "Usage: quest::rebind(int zone_id, float x, float y, float z, [float heading])"); + int zone_id = (int) SvIV(ST(0)); + float target_x = (float) SvNV(ST(1)); + float target_y = (float) SvNV(ST(2)); + float target_z = (float) SvNV(ST(3)); + if (items > 4) { + float target_heading = (float) SvNV(ST(4)); + quest_manager.rebind(zone_id, glm::vec4(target_x, target_y, target_z, target_heading)); + } else { + quest_manager.rebind(zone_id, glm::vec3(target_x, target_y, target_z)); + } XSRETURN_EMPTY; } @@ -1475,12 +1594,12 @@ XS(XS__addldonpoints) { if (items != 2) Perl_croak(aTHX_ "Usage: quest::addldonpoints(int points, int theme_id)"); - long points = (long) SvIV(ST(0)); - unsigned long theme_id = (unsigned long) SvUV(ST(1)); +long points = (long)SvIV(ST(0)); +unsigned long theme_id = (unsigned long)SvUV(ST(1)); - quest_manager.addldonpoints(points, theme_id); +quest_manager.addldonpoints(points, theme_id); - XSRETURN_EMPTY; +XSRETURN_EMPTY; } XS(XS__addldonwin); @@ -1489,8 +1608,8 @@ XS(XS__addldonwin) { if (items != 2) Perl_croak(aTHX_ "Usage: quest::addldonwin(int wins, int theme_id)"); - long wins = (long) SvIV(ST(0)); - unsigned long theme_id = (unsigned long) SvUV(ST(1)); + long wins = (long)SvIV(ST(0)); + unsigned long theme_id = (unsigned long)SvUV(ST(1)); quest_manager.addldonwin(wins, theme_id); @@ -1503,8 +1622,8 @@ XS(XS__addldonloss) { if (items != 2) Perl_croak(aTHX_ "Usage: quest::addldonloss(int losses, int theme_id)"); - long losses = (long) SvIV(ST(0)); - unsigned long theme_id = (unsigned long) SvUV(ST(1)); + long losses = (long)SvIV(ST(0)); + unsigned long theme_id = (unsigned long)SvUV(ST(1)); quest_manager.addldonloss(losses, theme_id); @@ -1517,7 +1636,7 @@ XS(XS__setnexthpevent) { if (items != 1) Perl_croak(aTHX_ "Usage: quest::setnexthpevent(int at_mob_percentage)"); - int at = (int) SvIV(ST(0)); + int at = (int)SvIV(ST(0)); quest_manager.setnexthpevent(at); @@ -1530,7 +1649,7 @@ XS(XS__setnextinchpevent) { if (items != 1) Perl_croak(aTHX_ "Usage: quest::setnextinchpevent(int at_mob_percentage)"); - int at = (int) SvIV(ST(0)); + int at = (int)SvIV(ST(0)); quest_manager.setnextinchpevent(at); @@ -1543,7 +1662,7 @@ XS(XS__sethp) { if (items != 1) Perl_croak(aTHX_ "Usage: quest::sethp(int mob_health_percentage [0-100])"); - int hpperc = (int) SvIV(ST(0)); + int hpperc = (int)SvIV(ST(0)); quest_manager.sethp(hpperc); @@ -1556,29 +1675,41 @@ XS(XS__respawn) { if (items != 2) Perl_croak(aTHX_ "Usage: quest::respawn(int npc_type_id, int grid_id)"); - int npc_type_id = (int) SvIV(ST(0)); - int grid_id = (int) SvIV(ST(1)); + int npc_type_id = (int)SvIV(ST(0)); + int grid_id = (int)SvIV(ST(1)); quest_manager.respawn(npc_type_id, grid_id); XSRETURN_EMPTY; } +//64 bit windows seems to optimize something poorly here causing access violations. +//If you don't do anything with index before passing it to perl it gets optimized out +//Disabling optimization right now for msvc on this function is the best solution. +#ifdef _MSC_VER +#pragma optimize( "", off ) +#endif + XS(XS__ChooseRandom); XS(XS__ChooseRandom) { dXSARGS; if (items < 1) Perl_croak(aTHX_ "Usage: quest::ChooseRandom(option1, option2, option3, option4, option5...[no limit])"); + dXSTARG; int index = zone->random.Int(0, items - 1); + SV* RETVAL = ST(index); - SV *tmp = ST(0); - ST(0) = ST(index); - ST(index) = tmp; + XSprePUSH; + PUSHs(RETVAL); XSRETURN(1); //return 1 element from the stack (ST(0)) } +#ifdef _MSC_VER +#pragma optimize( "", on ) +#endif + XS(XS__set_proximity); XS(XS__set_proximity) { dXSARGS; @@ -1984,6 +2115,19 @@ XS(XS__repopzone) { XSRETURN_EMPTY; } +XS(XS__processmobswhilezoneempty); +XS(XS__processmobswhilezoneempty) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::processmobswhilezoneempty(bool on)"); + + bool ProcessingOn = ((int) SvIV(ST(0))) == 0 ? false : true; + + quest_manager.processmobswhilezoneempty(ProcessingOn); + + XSRETURN_EMPTY; +} + XS(XS__npcrace); XS(XS__npcrace) { dXSARGS; @@ -2342,7 +2486,6 @@ XS(XS__updatetaskactivity) { XS(XS__resettaskactivity); XS(XS__resettaskactivity) { dXSARGS; - unsigned int task, activity; if (items == 2) { int task_id = (int) SvIV(ST(0)); int activity_id = (int) SvIV(ST(1)); @@ -2613,6 +2756,23 @@ XS(XS__istaskappropriate) { XSRETURN(1); } +XS(XS__gettaskname); +XS(XS__gettaskname) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: quest::gettaskname(uint32 task_id)"); + } + + dXSTARG; + uint32 task_id = (int) SvIV(ST(0)); + std::string task_name = quest_manager.gettaskname(task_id); + + sv_setpv(TARG, task_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + XS(XS__popup); // prototype to pass -Wmissing-prototypes XS(XS__popup) { dXSARGS; @@ -2676,6 +2836,29 @@ XS(XS__we) { XSRETURN_EMPTY; } +XS(XS__message); +XS(XS__message) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::message(int color, string message)"); + + int color = (int) SvIV(ST(0)); + char *message = (char *) SvPV_nolen(ST(1)); + quest_manager.message(color, message); + XSRETURN_EMPTY; +} + +XS(XS__whisper); +XS(XS__whisper) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::whisper(string message)"); + + char *message = (char *) SvPV_nolen(ST(0)); + quest_manager.whisper(message); + XSRETURN_EMPTY; +} + XS(XS__getlevel); XS(XS__getlevel) { dXSARGS; @@ -2775,7 +2958,7 @@ XS(XS__ModifyNPCStat); XS(XS__ModifyNPCStat) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: quest::ModifyNPCStat(string key, string value)"); + Perl_croak(aTHX_ "Usage: quest::modifynpcstat(string key, string value)"); quest_manager.ModifyNPCStat(SvPV_nolen(ST(0)), SvPV_nolen(ST(1))); @@ -2797,6 +2980,67 @@ XS(XS__collectitems) { XSRETURN_IV(quantity); } +XS(XS__countitem); +XS(XS__countitem) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::countitem(int item_id)"); + + uint32 item_id = (int) SvIV(ST(0)); + + int quantity = quest_manager.countitem(item_id); + + XSRETURN_IV(quantity); +} + +XS(XS__removeitem); +XS(XS__removeitem) { + dXSARGS; + if (items < 1 || items > 2) + Perl_croak(aTHX_ "Usage: quest::removeitem(int item_id, [int quantity = 1])"); + + uint32 item_id = (int) SvIV(ST(0)); + uint32 quantity = 1; + if (items > 1) + quantity = (int) SvIV(ST(1)); + + quest_manager.removeitem(item_id, quantity); + + XSRETURN_EMPTY; +} + +XS(XS__getitemname); +XS(XS__getitemname) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getitemname(uint32 item_id)"); + + dXSTARG; + uint32 item_id = (int) SvIV(ST(0)); + std::string item_name = quest_manager.getitemname(item_id); + + sv_setpv(TARG, item_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__getnpcnamebyid); +XS(XS__getnpcnamebyid) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getnpcnamebyid(uint32 npc_id)"); + + dXSTARG; + uint32 npc_id = (int) SvIV(ST(0)); + auto npc_name = quest_manager.getnpcnamebyid(npc_id); + + sv_setpv(TARG, npc_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + XS(XS__UpdateSpawnTimer); XS(XS__UpdateSpawnTimer) { dXSARGS; @@ -3063,6 +3307,25 @@ XS(XS__RemoveFromInstanceByCharID) { XSRETURN_EMPTY; } +XS(XS__CheckInstanceByCharID); +XS(XS__CheckInstanceByCharID) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: quest::CheckInstanceByCharID(uint16 instance_id, uint32 char_id)"); + } + + bool RETVAL; + dXSTARG; + + uint16 instance_id = (int) SvUV(ST(0)); + uint32 char_id = (int) SvUV(ST(1)); + RETVAL = quest_manager.CheckInstanceByCharID(instance_id, char_id); + XSprePUSH; + PUSHu((IV) RETVAL); + + XSRETURN(1); +} + XS(XS__RemoveAllFromInstance); XS(XS__RemoveAllFromInstance) { dXSARGS; @@ -3151,6 +3414,94 @@ XS(XS__saylink) { XSRETURN(1); } +XS(XS__getcharnamebyid); +XS(XS__getcharnamebyid) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getcharnamebyid(uint32 char_id)"); + dXSTARG; + + Const_char *RETVAL; + uint32 char_id = (int) SvUV(ST(0)); + auto name = quest_manager.getcharnamebyid(char_id); + + RETVAL = name.c_str(); + + sv_setpv(TARG, RETVAL); + XSprePUSH; + PUSHTARG; +} + +XS(XS__getcharidbyname); +XS(XS__getcharidbyname) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getcharidbyname(string name)"); + dXSTARG; + + uint32 RETVAL; + const char *name = (const char *) SvPV_nolen(ST(0)); + + RETVAL = quest_manager.getcharidbyname(name); + XSprePUSH; + PUSHu((UV)RETVAL); + + XSRETURN(1); +} + +XS(XS__getclassname); +XS(XS__getclassname) { + dXSARGS; + if (items < 1 || items > 2) + Perl_croak(aTHX_ "Usage: quest::getclassname(uint8 class_id, [uint8 level = 0])"); + dXSTARG; + + std::string RETVAL; + uint8 class_id = (int) SvUV(ST(0)); + uint8 level = 0; + if (items > 1) + level = (int) SvUV(ST(1)); + + RETVAL = quest_manager.getclassname(class_id, level); + sv_setpv(TARG, RETVAL.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__getcurrencyitemid); +XS(XS__getcurrencyitemid) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getcurrencyitemid(int currency_id)"); + dXSTARG; + + int RETVAL; + int currency_id = (int) SvUV(ST(0)); + + RETVAL = quest_manager.getcurrencyitemid(currency_id); + + XSprePUSH; + PUSHi((IV)RETVAL); + XSRETURN(1); +} + +XS(XS__getcurrencyid); +XS(XS__getcurrencyid) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::getcurrencyid(uint32 item_id)"); + dXSTARG; + + int RETVAL; + uint32 item_id = (int) SvUV(ST(0)); + + RETVAL = quest_manager.getcurrencyid(item_id); + XSprePUSH; + PUSHi((IV)RETVAL); + XSRETURN(1); +} + XS(XS__getguildnamebyid); XS(XS__getguildnamebyid) { dXSARGS; @@ -3466,10 +3817,41 @@ XS(XS__GetZoneLongName) { if (items != 1) Perl_croak(aTHX_ "Usage: quest::GetZoneLongName(string zone)"); dXSTARG; - char *zone = (char *) SvPV_nolen(ST(0)); - Const_char *RETVAL = quest_manager.GetZoneLongName(zone); - sv_setpv(TARG, RETVAL); + std::string zone = (std::string) SvPV_nolen(ST(0)); + std::string RETVAL = quest_manager.GetZoneLongName(zone); + + sv_setpv(TARG, RETVAL.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__GetZoneLongNameByID); +XS(XS__GetZoneLongNameByID) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::GetZoneLongNameByID(uint32 zone_id)"); + + dXSTARG; + uint32 zone_id = (uint32) SvUV(ST(0)); + std::string zone_long_name = quest_manager.GetZoneLongNameByID(zone_id); + sv_setpv(TARG, zone_long_name.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__GetZoneShortName); +XS(XS__GetZoneShortName) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::GetZoneShortName(uint32 zone_id)"); + + dXSTARG; + uint32 zone_id = (uint32) SvUV(ST(0)); + std::string zone_short_name = quest_manager.GetZoneShortName(zone_id); + sv_setpv(TARG, zone_short_name.c_str()); XSprePUSH; PUSHTARG; XSRETURN(1); @@ -3488,19 +3870,883 @@ XS(XS__GetTimeSeconds) { XSRETURN_UV(seconds); } +XS(XS__crosszoneassigntaskbycharid); +XS(XS__crosszoneassigntaskbycharid) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneassigntaskbycharid(int character_id, uint32 task_id, [bool enforce_level_requirement = false])"); + { + int character_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvIV(ST(1)); + bool enforce_level_requirement = false; + + if (items == 3) { + enforce_level_requirement = (bool) SvTRUE(ST(2)); + } + quest_manager.CrossZoneAssignTaskByCharID(character_id, task_id, enforce_level_requirement); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneassigntaskbygroupid); +XS(XS__crosszoneassigntaskbygroupid) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneassigntaskbygroupid(int group_id, uint32 task_id, [bool enforce_level_requirement = false])"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvIV(ST(1)); + bool enforce_level_requirement = false; + + if (items == 3) { + enforce_level_requirement = (bool) SvTRUE(ST(2)); + } + quest_manager.CrossZoneAssignTaskByGroupID(group_id, task_id, enforce_level_requirement); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneassigntaskbyraidid); +XS(XS__crosszoneassigntaskbyraidid) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneassigntaskbyraidid(int raid_id, uint32 task_id, [bool enforce_level_requirement = false])");\ + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvIV(ST(1)); + bool enforce_level_requirement = false; + + if (items == 3) { + enforce_level_requirement = (bool) SvTRUE(ST(2)); + } + quest_manager.CrossZoneAssignTaskByRaidID(raid_id, task_id, enforce_level_requirement); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneassigntaskbyguildid); +XS(XS__crosszoneassigntaskbyguildid) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneassigntaskbyguildid(int guild_id, uint32 task_id, [bool enforce_level_requirement = false])"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvIV(ST(1)); + bool enforce_level_requirement = false; + + if (items == 3) { + enforce_level_requirement = (bool) SvTRUE(ST(2)); + } + quest_manager.CrossZoneAssignTaskByGuildID(guild_id, task_id, enforce_level_requirement); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonecastspellbycharid); +XS(XS__crosszonecastspellbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonecastspellbycharid(int character_id, uint32 spell_id)"); + { + int character_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvIV(ST(1)); + quest_manager.CrossZoneCastSpellByCharID(character_id, spell_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonecastspellbygroupid); +XS(XS__crosszonecastspellbygroupid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonecastspellbygroupid(int group_id, uint32 spell_id)"); + { + int group_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvIV(ST(1)); + quest_manager.CrossZoneCastSpellByGroupID(group_id, spell_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonecastspellbyraidid); +XS(XS__crosszonecastspellbyraidid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonecastspellbyraidid(int raid_id, uint32 spell_id)"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvIV(ST(1)); + quest_manager.CrossZoneCastSpellByRaidID(raid_id, spell_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonecastspellbyguildid); +XS(XS__crosszonecastspellbyguildid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonecastspellbyguildid(int guild_id, uint32 spell_id)"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneCastSpellByGuildID(guild_id, spell_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonedisabletaskbycharid); +XS(XS__crosszonedisabletaskbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonedisabletaskbycharid(int character_id, uint32 task_id)"); + { + int char_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneDisableTaskByCharID(char_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonedisabletaskbygroupid); +XS(XS__crosszonedisabletaskbygroupid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonedisabletaskbygroupid(int group_id, uint32 task_id)"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneDisableTaskByGroupID(group_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonedisabletaskbyraidid); +XS(XS__crosszonedisabletaskbyraidid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonedisabletaskbyraidid(int raid_id, uint32 task_id)"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneDisableTaskByRaidID(raid_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonedisabletaskbyguildid); +XS(XS__crosszonedisabletaskbyguildid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonedisabletaskbyguildid(int guild_id, uint32 task_id)"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneDisableTaskByGuildID(guild_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneenabletaskbycharid); +XS(XS__crosszoneenabletaskbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneenabletaskbycharid(int character_id, uint32 task_id)"); + { + int char_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneEnableTaskByCharID(char_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneenabletaskbygroupid); +XS(XS__crosszoneenabletaskbygroupid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneenabletaskbygroupid(int group_id, uint32 task_id)"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneEnableTaskByGroupID(group_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneenabletaskbyraidid); +XS(XS__crosszoneenabletaskbyraidid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneenabletaskbyraidid(int raid_id, uint32 task_id)"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneEnableTaskByRaidID(raid_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneenabletaskbyguildid); +XS(XS__crosszoneenabletaskbyguildid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneenabletaskbyguildid(int guild_id, uint32 task_id)"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneEnableTaskByGuildID(guild_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonefailtaskbycharid); +XS(XS__crosszonefailtaskbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonefailtaskbycharid(int character_id, uint32 task_id)"); + { + int char_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneFailTaskByCharID(char_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonefailtaskbygroupid); +XS(XS__crosszonefailtaskbygroupid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonefailtaskbygroupid(int group_id, uint32 task_id)"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneFailTaskByGroupID(group_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonefailtaskbyraidid); +XS(XS__crosszonefailtaskbyraidid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonefailtaskbyraidid(int raid_id, uint32 task_id)"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneFailTaskByRaidID(raid_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonefailtaskbyguildid); +XS(XS__crosszonefailtaskbyguildid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonefailtaskbyguildid(int guild_id, uint32 task_id)"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneFailTaskByGuildID(guild_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonemarqueebycharid); +XS(XS__crosszonemarqueebycharid) { + dXSARGS; + + if (items != 7) + Perl_croak(aTHX_ "Usage: quest::crosszonemarqueebycharid(int character_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message)"); + + if (items == 7) { + int character_id = (int) SvIV(ST(0)); + int type = (int) SvIV(ST(1)); + int priority = (int) SvIV(ST(2)); + int fade_in = (int) SvIV(ST(3)); + int fade_out = (int) SvIV(ST(4)); + int duration = (int) SvIV(ST(5)); + char *message = (char *) SvPV_nolen(ST(6)); + quest_manager.CrossZoneMarqueeByCharID(character_id, type, priority, fade_in, fade_out, duration, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemarqueebygroupid); +XS(XS__crosszonemarqueebygroupid) { + dXSARGS; + + if (items != 7) + Perl_croak(aTHX_ "Usage: quest::crosszonemarqueebygroupid(int group_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message)"); + + if (items == 7) { + int group_id = (int) SvIV(ST(0)); + int type = (int) SvIV(ST(1)); + int priority = (int) SvIV(ST(2)); + int fade_in = (int) SvIV(ST(3)); + int fade_out = (int) SvIV(ST(4)); + int duration = (int) SvIV(ST(5)); + char *message = (char *) SvPV_nolen(ST(6)); + quest_manager.CrossZoneMarqueeByGroupID(group_id, type, priority, fade_in, fade_out, duration, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemarqueebyraidid); +XS(XS__crosszonemarqueebyraidid) { + dXSARGS; + + if (items != 7) + Perl_croak(aTHX_ "Usage: quest::crosszonemarqueebyraidid(int raid_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message)"); + + if (items == 7) { + int raid_id = (int) SvIV(ST(0)); + int type = (int) SvIV(ST(1)); + int priority = (int) SvIV(ST(2)); + int fade_in = (int) SvIV(ST(3)); + int fade_out = (int) SvIV(ST(4)); + int duration = (int) SvIV(ST(5)); + char *message = (char *) SvPV_nolen(ST(6)); + quest_manager.CrossZoneMarqueeByRaidID(raid_id, type, priority, fade_in, fade_out, duration, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemarqueebyguildid); +XS(XS__crosszonemarqueebyguildid) { + dXSARGS; + + if (items != 7) + Perl_croak(aTHX_ "Usage: quest::crosszonemarqueebyguildid(int guild_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message)"); + + if (items == 7) { + int guild_id = (int) SvIV(ST(0)); + int type = (int) SvIV(ST(1)); + int priority = (int) SvIV(ST(2)); + int fade_in = (int) SvIV(ST(3)); + int fade_out = (int) SvIV(ST(4)); + int duration = (int) SvIV(ST(5)); + char *message = (char *) SvPV_nolen(ST(6)); + quest_manager.CrossZoneMarqueeByGuildID(guild_id, type, priority, fade_in, fade_out, duration, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemessageplayerbyname); +XS(XS__crosszonemessageplayerbyname) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonemessageplayerbyname(uint32 type, string name, string message)"); + + if (items == 3) { + uint32 type = (uint32) SvUV(ST(0)); + char *name = (char *) SvPV_nolen(ST(1)); + char *message = (char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneMessagePlayerByName(type, name, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemessageplayerbygroupid); +XS(XS__crosszonemessageplayerbygroupid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonemessageplayerbygroupid(uint32 type, int group_id, string message)"); + + if (items == 3) { + uint32 type = (uint32) SvUV(ST(0)); + int group_id = (int) SvIV(ST(1)); + char *message = (char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneMessagePlayerByGroupID(type, group_id, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemessageplayerbyraidid); +XS(XS__crosszonemessageplayerbyraidid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonemessageplayerbyraidid(uint32 type, int raid_id, string message)"); + + if (items == 3) { + uint32 type = (uint32) SvUV(ST(0)); + int raid_id = (int) SvIV(ST(1)); + char *message = (char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneMessagePlayerByRaidID(type, raid_id, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemessageplayerbyguildid); +XS(XS__crosszonemessageplayerbyguildid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonemessageplayerbyguildid(uint32 type, int guild_id, string message)"); + + if (items == 3) { + uint32 type = (uint32) SvUV(ST(0)); + int guild_id = (int) SvIV(ST(1)); + char *message = (char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneMessagePlayerByGuildID(type, guild_id, message); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveplayerbycharid); +XS(XS__crosszonemoveplayerbycharid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveplayerbycharid(int character_id, string zone_short_name)"); + + if (items == 2) { + int character_id = (int) SvIV(ST(0)); + char *zone_short_name = (char *) SvPV_nolen(ST(1)); + quest_manager.CrossZoneMovePlayerByCharID(character_id, zone_short_name); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveplayerbygroupid); +XS(XS__crosszonemoveplayerbygroupid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveplayerbygroupid(int group_id, string zone_short_name)"); + + if (items == 2) { + int group_id = (int) SvIV(ST(0)); + char *zone_short_name = (char *) SvPV_nolen(ST(1)); + quest_manager.CrossZoneMovePlayerByGroupID(group_id, zone_short_name); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveplayerbyraidid); +XS(XS__crosszonemoveplayerbyraidid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveplayerbyraidid(int raid_id, string zone_short_name)"); + + if (items == 2) { + int raid_id = (int) SvIV(ST(0)); + char *zone_short_name = (char *) SvPV_nolen(ST(1)); + quest_manager.CrossZoneMovePlayerByRaidID(raid_id, zone_short_name); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveplayerbyguildid); +XS(XS__crosszonemoveplayerbyguildid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveplayerbyguildid(int guild_id, string zone_short_name)"); + + if (items == 2) { + int guild_id = (int) SvIV(ST(0)); + char *zone_short_name = (char *) SvPV_nolen(ST(1)); + quest_manager.CrossZoneMovePlayerByGuildID(guild_id, zone_short_name); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveinstancebycharid); +XS(XS__crosszonemoveinstancebycharid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveinstancebycharid(int character_id, uint16 instance_id)"); + + if (items == 2) { + int character_id = (int) SvIV(ST(0)); + uint16 instance_id = (uint16) SvUV(ST(1)); + quest_manager.CrossZoneMoveInstanceByCharID(character_id, instance_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveinstancebygroupid); +XS(XS__crosszonemoveinstancebygroupid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveinstancebygroupid(int group_id, uint16 instance_id)"); + + if (items == 2) { + int group_id = (int) SvIV(ST(0)); + uint16 instance_id = (uint16) SvUV(ST(1)); + quest_manager.CrossZoneMoveInstanceByGroupID(group_id, instance_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveinstancebyraidid); +XS(XS__crosszonemoveinstancebyraidid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveinstancebyraidid(int raid_id, uint16 instance_id)"); + + if (items == 2) { + int raid_id = (int) SvIV(ST(0)); + uint16 instance_id = (uint16) SvUV(ST(1)); + quest_manager.CrossZoneMoveInstanceByRaidID(raid_id, instance_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonemoveinstancebyguildid); +XS(XS__crosszonemoveinstancebyguildid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonemoveinstancebyguildid(int guild_id, uint16 instance_id)"); + + if (items == 2) { + int guild_id = (int) SvIV(ST(0)); + uint16 instance_id = (uint16) SvUV(ST(1)); + quest_manager.CrossZoneMoveInstanceByGuildID(guild_id, instance_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovespellbycharid); +XS(XS__crosszoneremovespellbycharid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovespellbycharid(int character_id, uint32 spell_id)"); + + if (items == 2) { + int character_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveSpellByCharID(character_id, spell_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovespellbygroupid); +XS(XS__crosszoneremovespellbygroupid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovespellbygroupid(int group_id, uint32 spell_id)"); + + if (items == 2) { + int group_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveSpellByGroupID(group_id, spell_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovespellbyraidid); +XS(XS__crosszoneremovespellbyraidid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovespellbyraidid(int raid_id, uint32 spell_id)"); + + if (items == 2) { + int raid_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveSpellByRaidID(raid_id, spell_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovespellbyguildid); +XS(XS__crosszoneremovespellbyguildid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovespellbyguildid(int guild_id, uint32 spell_id)"); + + if (items == 2) { + int guild_id = (int) SvIV(ST(0)); + uint32 spell_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveSpellByGuildID(guild_id, spell_id); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovetaskbycharid); +XS(XS__crosszoneremovetaskbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovetaskbycharid(int character_id, uint32 task_id)"); + { + int char_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveTaskByCharID(char_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovetaskbygroupid); +XS(XS__crosszoneremovetaskbygroupid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovetaskbygroupid(int group_id, uint32 task_id)"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveTaskByGroupID(group_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovetaskbyraidid); +XS(XS__crosszoneremovetaskbyraidid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovetaskbyraidid(int raid_id, uint32 task_id)"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveTaskByRaidID(raid_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneremovetaskbyguildid); +XS(XS__crosszoneremovetaskbyguildid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszoneremovetaskbyguildid(int guild_id, uint32 task_id)"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneRemoveTaskByGuildID(guild_id, task_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneresetactivitybycharid); +XS(XS__crosszoneresetactivitybycharid) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneresetactivitybycharid(int char_id, uint32 task_id, int activity_id)"); + { + int char_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + quest_manager.CrossZoneResetActivityByCharID(char_id, task_id, activity_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneresetactivitybygroupid); +XS(XS__crosszoneresetactivitybygroupid) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneresetactivitybygroupid(int group_id, uint32 task_id, int activity_id)"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + quest_manager.CrossZoneResetActivityByGroupID(group_id, task_id, activity_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneresetactivitybyraidid); +XS(XS__crosszoneresetactivitybyraidid) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneresetactivitybyraidid(int raid_id, uint32 task_id, int activity_id)"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + quest_manager.CrossZoneResetActivityByRaidID(raid_id, task_id, activity_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneresetactivitybyguildid); +XS(XS__crosszoneresetactivitybyguildid) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszoneresetactivitybyguildid(int guild_id, uint32 task_id, int activity_id)"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + quest_manager.CrossZoneResetActivityByGuildID(guild_id, task_id, activity_id); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszonesetentityvariablebynpctypeid); +XS(XS__crosszonesetentityvariablebynpctypeid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebynpctypeid(int npc_type_id, string key, string value)"); + + if (items == 3) { + uint32 npc_type_id = (uint32) SvUV(ST(0)); + const char *key = (const char *) SvPV_nolen(ST(1)); + const char *str_value = (const char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneSetEntityVariableByNPCTypeID(npc_type_id, key, str_value); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesetentityvariablebyclientname); +XS(XS__crosszonesetentityvariablebyclientname) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebyclientname(string client_name, string key, string value)"); + + if (items == 3) { + const char *client_name = (const char *) SvPV_nolen(ST(0)); + const char *key = (const char *) SvPV_nolen(ST(1)); + const char *str_value = (const char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneSetEntityVariableByClientName(client_name, key, str_value); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesetentityvariablebygroupid); +XS(XS__crosszonesetentityvariablebygroupid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebygroupid(int group_id, string key, string value)"); + + if (items == 3) { + int group_id = SvIV(ST(0)); + const char *key = (const char *) SvPV_nolen(ST(1)); + const char *str_value = (const char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneSetEntityVariableByGroupID(group_id, key, str_value); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesetentityvariablebyraidid); +XS(XS__crosszonesetentityvariablebyraidid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebyraidid(int raid_id, string key, string value)"); + + if (items == 3) { + int raid_id = SvIV(ST(0)); + const char *key = (const char *) SvPV_nolen(ST(1)); + const char *str_value = (const char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneSetEntityVariableByRaidID(raid_id, key, str_value); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesetentityvariablebyguildid); +XS(XS__crosszonesetentityvariablebyguildid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebyguildid(int guild_id, string key, string value)"); + + if (items == 3) { + int guild_id = SvIV(ST(0)); + const char *key = (const char *) SvPV_nolen(ST(1)); + const char *str_value = (const char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneSetEntityVariableByGuildID(guild_id, key, str_value); + } + + XSRETURN_EMPTY; +} + XS(XS__crosszonesignalclientbycharid); XS(XS__crosszonesignalclientbycharid) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbycharid(int character_id, int value)"); + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbycharid(int character_id, uint32 signal)"); if (items == 2) { - int char_id = (int) SvIV(ST(0)); - uint32 int_value = (uint32) SvIV(ST(1)); - quest_manager.CrossZoneSignalPlayerByCharID(char_id, int_value); - } else { - Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbycharid(int character_id, int value)"); + int char_id = (int) SvIV(ST(0)); + uint32 signal = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneSignalPlayerByCharID(char_id, signal); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesignalclientbygroupid); +XS(XS__crosszonesignalclientbygroupid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbygroupid(int group_id, uint32 signal)"); + + if (items == 2) { + int group_id = (int) SvIV(ST(0)); + uint32 signal = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneSignalPlayerByGroupID(group_id, signal); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesignalclientbyraidid); +XS(XS__crosszonesignalclientbyraidid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbyraidid(int raid_id, uint32 signal)"); + + if (items == 2) { + int raid_id = (int) SvIV(ST(0)); + uint32 signal = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneSignalPlayerByRaidID(raid_id, signal); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszonesignalclientbyguildid); +XS(XS__crosszonesignalclientbyguildid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbyguildid(int guild_id, uint32 signal)"); + + if (items == 2) { + int guild_id = (int) SvIV(ST(0)); + uint32 signal = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneSignalPlayerByGuildID(guild_id, signal); } XSRETURN_EMPTY; @@ -3511,32 +4757,471 @@ XS(XS__crosszonesignalclientbyname) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbycharid(string name, int value)"); + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbyname(string name, uint32 signal)"); if (items == 2) { - char *name = (char *) SvPV_nolen(ST(0)); - uint32 int_value = (uint32) SvIV(ST(1)); - quest_manager.CrossZoneSignalPlayerByName(name, int_value); - } else { - Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbycharid(string name, int value)"); + char *name = (char *) SvPV_nolen(ST(0)); + uint32 signal = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneSignalPlayerByName(name, signal); } XSRETURN_EMPTY; } - -XS(XS__crosszonemessageplayerbyname); -XS(XS__crosszonemessageplayerbyname) { +XS(XS__crosszonesignalnpcbynpctypeid); +XS(XS__crosszonesignalnpcbynpctypeid) { dXSARGS; - if (items != 3) - Perl_croak(aTHX_ "Usage: quest::crosszonemessageplayerbyname(int channel_id, string name, string message)"); + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonesignalnpcbynpctypeid(uint32 npc_type_id, uint32 value)"); - if (items == 3) { - uint32 channel_id = (uint32) SvIV(ST(0)); - char *name = (char *) SvPV_nolen(ST(1)); - char *message = (char *) SvPV_nolen(ST(2)); - quest_manager.CrossZoneMessagePlayerByName(channel_id, name, message); + if (items == 2) { + uint32 npc_type_id = (uint32) SvUV(ST(0)); + uint32 int_value = (uint32) SvUV(ST(1)); + quest_manager.CrossZoneSignalNPCByNPCTypeID(npc_type_id, int_value); + } + + XSRETURN_EMPTY; +} + +XS(XS__crosszoneupdateactivitybycharid); +XS(XS__crosszoneupdateactivitybycharid) { + dXSARGS; + if (items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: quest::crosszoneupdateactivitybycharid(int char_id, uint32 task_id, int activity_id, [int activity_count = 1])"); + { + int char_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + int activity_count = 1; + if (items == 4) { + activity_count = (int) SvIV(ST(3)); + } + quest_manager.CrossZoneUpdateActivityByCharID(char_id, task_id, activity_id, activity_count); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneupdateactivitybygroupid); +XS(XS__crosszoneupdateactivitybygroupid) { + dXSARGS; + if (items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: quest::crosszoneupdateactivitybygroupid(int group_id, uint32 task_id, int activity_id, [int activity_count = 1])"); + { + int group_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + int activity_count = 1; + if (items == 4) { + activity_count = (int) SvIV(ST(3)); + } + quest_manager.CrossZoneUpdateActivityByGroupID(group_id, task_id, activity_id, activity_count); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneupdateactivitybyraidid); +XS(XS__crosszoneupdateactivitybyraidid) { + dXSARGS; + if (items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: quest::crosszoneupdateactivitybyraidid(int raid_id, uint32 task_id, int activity_id, [int activity_count = 1])"); + { + int raid_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + int activity_count = 1; + if (items == 4) { + activity_count = (int) SvIV(ST(3)); + } + quest_manager.CrossZoneUpdateActivityByRaidID(raid_id, task_id, activity_id, activity_count); + } + XSRETURN_EMPTY; +} + +XS(XS__crosszoneupdateactivitybyguildid); +XS(XS__crosszoneupdateactivitybyguildid) { + dXSARGS; + if (items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: quest::crosszoneupdateactivitybyguildid(int guild_id, uint32 task_id, int activity_id, [int activity_count = 1])"); + { + int guild_id = (int) SvIV(ST(0)); + uint32 task_id = (uint32) SvUV(ST(1)); + int activity_id = (int) SvIV(ST(2)); + int activity_count = 1; + if (items == 4) { + activity_count = (int) SvIV(ST(3)); + } + quest_manager.CrossZoneUpdateActivityByGuildID(guild_id, task_id, activity_id, activity_count); + } + XSRETURN_EMPTY; +} + +XS(XS__worldwideassigntask); +XS(XS__worldwideassigntask) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwideassigntask(uint32 task_id, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideAssignTask(task_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidecastspell); +XS(XS__worldwidecastspell) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwidecastspell(uint32 spell_id, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 spell_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideCastSpell(spell_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidedisabletask); +XS(XS__worldwidedisabletask) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwidedisabletask(uint32 task_id, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideDisableTask(task_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwideenabletask); +XS(XS__worldwideenabletask) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwideenabletask(uint32 task_id, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideEnableTask(task_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidefailtask); +XS(XS__worldwidefailtask) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwidefailtask(uint32 task_id, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideFailTask(task_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidemarquee); +XS(XS__worldwidemarquee) { + dXSARGS; + if (items < 6 || items > 8) + Perl_croak(aTHX_ "Usage: quest::worldwidemarquee(uint32 color_id, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, string message, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 color_id = (uint32) SvUV(ST(0)); + uint32 priority = (uint32) SvUV(ST(1)); + uint32 fade_in = (uint32) SvUV(ST(2)); + uint32 fade_out = (uint32) SvUV(ST(3)); + uint32 duration = (uint32) SvUV(ST(4)); + char *message = (char *) SvPV_nolen(ST(5)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 7) { + min_status = (uint8) SvUV(ST(6)); + } + + if (items == 8) { + max_status = (uint8) SvUV(ST(7)); + } + quest_manager.WorldWideMarquee(color_id, priority, fade_in, fade_out, duration, message, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidemessage); +XS(XS__worldwidemessage) { + dXSARGS; + if (items < 2 || items > 4) + Perl_croak(aTHX_ "Usage: quest::worldwidemessage(uint32 type, string message, [uint8 min_status = 0, uint8 max_status = 0])"); + { + uint32 type = (uint32)SvUV(ST(0)); + const char *message = (const char*) SvPV_nolen(ST(1)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 3) { + min_status = (uint8) SvUV(ST(2)); + } + + if (items == 4) { + max_status = (uint8) SvUV(ST(3)); + } + quest_manager.WorldWideMessage(type, message, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidemove); +XS(XS__worldwidemove) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwidemove(string zone_short_name, [uint8 min_status = 0, uint8 max_status = 0])"); + + if (items == 1) { + const char *zone_short_name = (const char*) SvPV_nolen(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideMove(zone_short_name, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidemoveinstance); +XS(XS__worldwidemoveinstance) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwidemoveinstance(uint16 instance_id, [uint8 min_status = 0, uint max_status = 0])"); + { + uint16 instance_id = (uint16) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideMoveInstance(instance_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwideremovespell); +XS(XS__worldwideremovespell) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwideremovespell(uint32 spell_id, [uint8 min_status = 0, uint max_status = 0])"); + { + uint32 spell_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideRemoveSpell(spell_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwideremovetask); +XS(XS__worldwideremovetask) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwideremovetask(uint32 task_id, [uint8 min_status = 0, uint max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(2)); + } + quest_manager.WorldWideRemoveTask(task_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwideresetactivity); +XS(XS__worldwideresetactivity) { + dXSARGS; + if (items < 2 || items > 4) + Perl_croak(aTHX_ "Usage: quest::worldwideresetactivity(uint32 task_id, int activity_id, [uint8 min_status = 0, uint max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + int activity_id = (int) SvIV(ST(1)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 3) { + min_status = (uint8) SvUV(ST(2)); + } + + if (items == 4) { + max_status = (uint8) SvUV(ST(3)); + } + quest_manager.WorldWideResetActivity(task_id, activity_id, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidesetentityvariableclient); +XS(XS__worldwidesetentityvariableclient) { + dXSARGS; + if (items < 2 || items > 4) + Perl_croak(aTHX_ "Usage: quest::worldwidesetentityvariableclient(string variable_name, string variable_value, [uint8 min_status = 0, uint max_status = 0])"); + { + const char *variable_name = (const char*) SvPV_nolen(ST(0)); + const char *variable_value = (const char*) SvPV_nolen(ST(1)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 3) { + min_status = (uint8) SvUV(ST(2)); + } + + if (items == 4) { + max_status = (uint8) SvUV(ST(3)); + } + quest_manager.WorldWideSetEntityVariableClient(variable_name, variable_value, min_status, max_status); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidesetentityvariablenpc); +XS(XS__worldwidesetentityvariablenpc) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::worldwidesetentityvariablenpc(string variable_name, string variable_value)"); + { + const char *variable_name = (const char*) SvPV_nolen(ST(0)); + const char *variable_value = (const char*) SvPV_nolen(ST(1)); + quest_manager.WorldWideSetEntityVariableNPC(variable_name, variable_value); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidesignalnpc); +XS(XS__worldwidesignalnpc) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: quest::worldwidesignalnpc(uint32 signal)"); + { + uint32 signal = (uint32) SvUV(ST(0)); + quest_manager.WorldWideSignalNPC(signal); + } + + XSRETURN_EMPTY; +} + +XS(XS__worldwidesignalclient); +XS(XS__worldwidesignalclient) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: quest::worldwidesignalclient(uint32 signal, [uint8 min_status = 0, uint max_status = 0])"); + { + uint32 signal = (uint32) SvUV(ST(0)); + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 2) { + min_status = (uint8) SvUV(ST(1)); + } + + if (items == 3) { + max_status = (uint8) SvUV(ST(1)); + } + quest_manager.WorldWideSignalClient(signal, min_status, max_status); + } + + XSRETURN_EMPTY; +} +XS(XS__worldwideupdateactivity); +XS(XS__worldwideupdateactivity) { + dXSARGS; + if (items < 2 || items > 5) + Perl_croak(aTHX_ "Usage: quest::worldwideupdateactivity(uint32 task_id, int activity_id, [int activity_count = 1, uint8 min_status = 0, uint max_status = 0])"); + { + uint32 task_id = (uint32) SvUV(ST(0)); + int activity_id = (int) SvIV(ST(1)); + int activity_count = 1; + uint8 min_status = 0; + uint8 max_status = 0; + if (items == 3) { + activity_count = (int) SvIV(ST(2)); + } + + if (items == 4) { + min_status = (uint8) SvUV(ST(3)); + } + + if (items == 5) { + max_status = (uint8) SvUV(ST(4)); + } + quest_manager.WorldWideUpdateActivity(task_id, activity_id, activity_count, min_status, max_status); } XSRETURN_EMPTY; @@ -3627,74 +5312,7 @@ XS(XS__qs_player_event) { XSRETURN_EMPTY; } -XS(XS__crosszonesetentityvariablebynpctypeid); -XS(XS__crosszonesetentityvariablebynpctypeid) { - dXSARGS; - if (items != 3) - Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebynpctypeid(int npc_type_id, string key, string value)"); - - if (items == 3) { - uint32 npc_type_id = (uint32) SvIV(ST(0)); - const char *key = (const char *) SvPV_nolen(ST(1)); - const char *str_value = (const char *) SvPV_nolen(ST(2)); - quest_manager.CrossZoneSetEntityVariableByNPCTypeID(npc_type_id, key, str_value); - } - - XSRETURN_EMPTY; -} - -XS(XS__crosszonesetentityvariablebyclientname); -XS(XS__crosszonesetentityvariablebyclientname) { - dXSARGS; - - if (items != 3) - Perl_croak(aTHX_ "Usage: quest::crosszonesetentityvariablebyclientname(string client_name, string key, string value)"); - - if (items == 3) { - const char *client_name = (const char *) SvPV_nolen(ST(0)); - const char *key = (const char *) SvPV_nolen(ST(1)); - const char *str_value = (const char *) SvPV_nolen(ST(2)); - quest_manager.CrossZoneSetEntityVariableByClientName(client_name, key, str_value); - } - - XSRETURN_EMPTY; -} - -XS(XS__crosszonesignalnpcbynpctypeid); -XS(XS__crosszonesignalnpcbynpctypeid) { - dXSARGS; - - if (items != 2) - Perl_croak(aTHX_ "Usage: quest::crosszonesignalnpcbynpctypeid(uint32 npc_type_id, uint32 value)"); - - if (items == 2) { - uint32 npc_type_id = (uint32) SvIV(ST(0)); - uint32 int_value = (uint32) SvIV(ST(1)); - quest_manager.CrossZoneSignalNPCByNPCTypeID(npc_type_id, int_value); - } - - XSRETURN_EMPTY; -} - -XS(XS__worldwidemarquee); -XS(XS__worldwidemarquee) { - dXSARGS; - if (items != 6) - Perl_croak(aTHX_ "Usage: quest::worldwidemarquee(uint32 color_id, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, string message)"); - - if (items == 6) { - uint32 color_id = (uint32) SvIV(ST(0)); - uint32 priority = (uint32) SvIV(ST(1)); - uint32 fade_in = (uint32) SvIV(ST(2)); - uint32 fade_out = (uint32) SvIV(ST(3)); - uint32 duration = (uint32) SvIV(ST(4)); - char *message = (char *) SvPV_nolen(ST(5)); - quest_manager.WorldWideMarquee(color_id, priority, fade_in, fade_out, duration, message); - } - - XSRETURN_EMPTY; -} XS(XS__log); XS(XS__log) { @@ -3705,7 +5323,7 @@ XS(XS__log) { else { uint8 log_category = (uint8)SvIV(ST(0)); std::string log_message = (std::string) SvPV_nolen(ST(1)); - + if (log_category >= Logs::MaxCategoryID) { return; } @@ -3774,11 +5392,11 @@ XS(XS__set_rule) { dXSARGS; if (items != 2) Perl_croak(aTHX_ "Usage: quest::set_rule(string rule_name, string rule_value)"); - + std::string rule_name = (std::string) SvPV_nolen(ST(0)); std::string rule_value = (std::string) SvPV_nolen(ST(1)); RuleManager::Instance()->SetRule(rule_name.c_str(), rule_value.c_str()); - + XSRETURN_EMPTY; } @@ -3863,6 +5481,1078 @@ XS(XS__delete_data) { } +XS(XS__IsClassicEnabled); +XS(XS__IsClassicEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_classic_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsClassicEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheRuinsOfKunarkEnabled); +XS(XS__IsTheRuinsOfKunarkEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_ruins_of_kunark_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheRuinsOfKunarkEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheScarsOfVeliousEnabled); +XS(XS__IsTheScarsOfVeliousEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_scars_of_velious_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheScarsOfVeliousEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheShadowsOfLuclinEnabled); +XS(XS__IsTheShadowsOfLuclinEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_shadows_of_luclin_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheShadowsOfLuclinEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsThePlanesOfPowerEnabled); +XS(XS__IsThePlanesOfPowerEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_planes_of_power_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsThePlanesOfPowerEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheLegacyOfYkeshaEnabled); +XS(XS__IsTheLegacyOfYkeshaEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_legacy_of_ykesha_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheLegacyOfYkeshaEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsLostDungeonsOfNorrathEnabled); +XS(XS__IsLostDungeonsOfNorrathEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_lost_dungeons_of_norrath_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsLostDungeonsOfNorrathEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsGatesOfDiscordEnabled); +XS(XS__IsGatesOfDiscordEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_gates_of_discord_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsGatesOfDiscordEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsOmensOfWarEnabled); +XS(XS__IsOmensOfWarEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_omens_of_war_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsOmensOfWarEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsDragonsOfNorrathEnabled); +XS(XS__IsDragonsOfNorrathEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_dragons_of_norrath_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsDragonsOfNorrathEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsDepthsOfDarkhollowEnabled); +XS(XS__IsDepthsOfDarkhollowEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_depths_of_darkhollow_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsDepthsOfDarkhollowEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsProphecyOfRoEnabled); +XS(XS__IsProphecyOfRoEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_prophecy_of_ro_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsProphecyOfRoEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheSerpentsSpineEnabled); +XS(XS__IsTheSerpentsSpineEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_serpents_spine_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheSerpentsSpineEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheBuriedSeaEnabled); +XS(XS__IsTheBuriedSeaEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_buried_sea_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheBuriedSeaEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsSecretsOfFaydwerEnabled); +XS(XS__IsSecretsOfFaydwerEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_secrets_of_faydwer_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsSecretsOfFaydwerEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsSeedsOfDestructionEnabled); +XS(XS__IsSeedsOfDestructionEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_seeds_of_destruction_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsSeedsOfDestructionEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsUnderfootEnabled); +XS(XS__IsUnderfootEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_underfoot_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsUnderfootEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsHouseOfThuleEnabled); +XS(XS__IsHouseOfThuleEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_house_of_thule_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsHouseOfThuleEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsVeilOfAlarisEnabled); +XS(XS__IsVeilOfAlarisEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_veil_of_alaris_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsVeilOfAlarisEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsRainOfFearEnabled); +XS(XS__IsRainOfFearEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_rain_of_fear_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsRainOfFearEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCallOfTheForsakenEnabled); +XS(XS__IsCallOfTheForsakenEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_call_of_the_forsaken_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCallOfTheForsakenEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheDarkendSeaEnabled); +XS(XS__IsTheDarkendSeaEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_darkend_sea_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheDarkendSeaEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheBrokenMirrorEnabled); +XS(XS__IsTheBrokenMirrorEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_broken_mirror_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheBrokenMirrorEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsEmpiresOfKunarkEnabled); +XS(XS__IsEmpiresOfKunarkEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_empires_of_kunark_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsEmpiresOfKunarkEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsRingOfScaleEnabled); +XS(XS__IsRingOfScaleEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_ring_of_scale_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsRingOfScaleEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTheBurningLandsEnabled); +XS(XS__IsTheBurningLandsEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_the_burning_lands_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTheBurningLandsEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsTormentOfVeliousEnabled); +XS(XS__IsTormentOfVeliousEnabled) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_torment_of_velious_enabled()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsTormentOfVeliousEnabled(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionClassic); +XS(XS__IsCurrentExpansionClassic) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_classic()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionClassic(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheRuinsOfKunark); +XS(XS__IsCurrentExpansionTheRuinsOfKunark) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_ruins_of_kunark()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheRuinsOfKunark(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheScarsOfVelious); +XS(XS__IsCurrentExpansionTheScarsOfVelious) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_scars_of_velious()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheScarsOfVelious(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheShadowsOfLuclin); +XS(XS__IsCurrentExpansionTheShadowsOfLuclin) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_shadows_of_luclin()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheShadowsOfLuclin(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionThePlanesOfPower); +XS(XS__IsCurrentExpansionThePlanesOfPower) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_planes_of_power()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionThePlanesOfPower(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheLegacyOfYkesha); +XS(XS__IsCurrentExpansionTheLegacyOfYkesha) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_legacy_of_ykesha()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheLegacyOfYkesha(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionLostDungeonsOfNorrath); +XS(XS__IsCurrentExpansionLostDungeonsOfNorrath) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_lost_dungeons_of_norrath()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionLostDungeonsOfNorrath(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionGatesOfDiscord); +XS(XS__IsCurrentExpansionGatesOfDiscord) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_gates_of_discord()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionGatesOfDiscord(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionOmensOfWar); +XS(XS__IsCurrentExpansionOmensOfWar) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_omens_of_war()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionOmensOfWar(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionDragonsOfNorrath); +XS(XS__IsCurrentExpansionDragonsOfNorrath) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_dragons_of_norrath()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionDragonsOfNorrath(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionDepthsOfDarkhollow); +XS(XS__IsCurrentExpansionDepthsOfDarkhollow) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_depths_of_darkhollow()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionDepthsOfDarkhollow(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionProphecyOfRo); +XS(XS__IsCurrentExpansionProphecyOfRo) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_prophecy_of_ro()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionProphecyOfRo(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheSerpentsSpine); +XS(XS__IsCurrentExpansionTheSerpentsSpine) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_serpents_spine()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheSerpentsSpine(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheBuriedSea); +XS(XS__IsCurrentExpansionTheBuriedSea) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_buried_sea()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheBuriedSea(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionSecretsOfFaydwer); +XS(XS__IsCurrentExpansionSecretsOfFaydwer) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_secrets_of_faydwer()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionSecretsOfFaydwer(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionSeedsOfDestruction); +XS(XS__IsCurrentExpansionSeedsOfDestruction) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_seeds_of_destruction()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionSeedsOfDestruction(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionUnderfoot); +XS(XS__IsCurrentExpansionUnderfoot) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_underfoot()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionUnderfoot(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionHouseOfThule); +XS(XS__IsCurrentExpansionHouseOfThule) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_house_of_thule()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionHouseOfThule(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionVeilOfAlaris); +XS(XS__IsCurrentExpansionVeilOfAlaris) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_veil_of_alaris()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionVeilOfAlaris(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionRainOfFear); +XS(XS__IsCurrentExpansionRainOfFear) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_rain_of_fear()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionRainOfFear(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionCallOfTheForsaken); +XS(XS__IsCurrentExpansionCallOfTheForsaken) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_call_of_the_forsaken()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionCallOfTheForsaken(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheDarkendSea); +XS(XS__IsCurrentExpansionTheDarkendSea) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_darkend_sea()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheDarkendSea(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheBrokenMirror); +XS(XS__IsCurrentExpansionTheBrokenMirror) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_broken_mirror()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheBrokenMirror(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionEmpiresOfKunark); +XS(XS__IsCurrentExpansionEmpiresOfKunark) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_empires_of_kunark()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionEmpiresOfKunark(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionRingOfScale); +XS(XS__IsCurrentExpansionRingOfScale) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_ring_of_scale()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionRingOfScale(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTheBurningLands); +XS(XS__IsCurrentExpansionTheBurningLands) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_the_burning_lands()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTheBurningLands(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsCurrentExpansionTormentOfVelious); +XS(XS__IsCurrentExpansionTormentOfVelious) { + dXSARGS; + if (items >= 1) { + Perl_croak(aTHX_ "Usage: quest::is_current_expansion_torment_of_velious()"); + } + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsCurrentExpansionTormentOfVelious(); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__IsContentFlagEnabled); +XS(XS__IsContentFlagEnabled) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: quest::is_content_flag_enabled(string flag_name)"); + } + + std::string flag_name = (std::string) SvPV_nolen(ST(0)); + + bool RETVAL; dXSTARG; + RETVAL = content_service.IsContentFlagEnabled(flag_name); + XSprePUSH; PUSHu((IV) RETVAL); XSRETURN(1); +} + +XS(XS__SetContentFlag); +XS(XS__SetContentFlag) +{ + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: quest::set_content_flag(string flag_name, enabled)"); + } + + std::string flag_name = (std::string) SvPV_nolen(ST(0)); + bool enabled = (int) SvIV(ST(1)) != 0; + ZoneStore::SetContentFlag(flag_name, enabled); + XSRETURN_EMPTY; +} + +XS(XS__get_expedition); +XS(XS__get_expedition) { + dXSARGS; + if (items != 0) { + Perl_croak(aTHX_ "Usage: quest::get_expedition()"); + } + + Expedition* RETVAL = nullptr; + if (zone && zone->GetInstanceID() != 0) + { + RETVAL = Expedition::FindCachedExpeditionByZoneInstance(zone->GetZoneID(), zone->GetInstanceID()); + } + + EXTEND(sp, 1); // grow stack, function had 0 arguments + ST(0) = sv_newmortal(); // PUSHs(sv_newmortal()); + if (RETVAL) { + sv_setref_pv(ST(0), "Expedition", (void*)RETVAL); + } + + XSRETURN(1); +} + +XS(XS__get_expedition_by_char_id); +XS(XS__get_expedition_by_char_id) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: quest::get_expedition_by_char_id(uint32 character_id)"); + } + + uint32 character_id = (int)SvUV(ST(0)); + + Expedition* RETVAL = Expedition::FindCachedExpeditionByCharacterID(character_id); + + ST(0) = sv_newmortal(); + if (RETVAL) { + sv_setref_pv(ST(0), "Expedition", (void*)RETVAL); + } + + XSRETURN(1); +} + +XS(XS__get_expedition_by_dz_id); +XS(XS__get_expedition_by_dz_id) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: quest::get_expedition_by_dz_id(uint32 dynamic_zone_id)"); + } + + uint32 dz_id = (int)SvUV(ST(0)); + + Expedition* RETVAL = Expedition::FindCachedExpeditionByDynamicZoneID(dz_id); + + ST(0) = sv_newmortal(); + if (RETVAL) { + sv_setref_pv(ST(0), "Expedition", (void*)RETVAL); + } + + XSRETURN(1); +} + +XS(XS__get_expedition_by_zone_instance); +XS(XS__get_expedition_by_zone_instance) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: quest::GetExpeditionByZoneInstance(uint16 zone_id, uint16 instance_id)"); + } + + uint16 zone_id = (uint16)SvUV(ST(0)); + uint16 instance_id = (uint16)SvUV(ST(1)); + + Expedition* RETVAL = Expedition::FindCachedExpeditionByZoneInstance(zone_id, instance_id); + + ST(0) = sv_newmortal(); + if (RETVAL) { + sv_setref_pv(ST(0), "Expedition", (void*)RETVAL); + } + + XSRETURN(1); +} + +XS(XS__get_expedition_lockout_by_char_id); +XS(XS__get_expedition_lockout_by_char_id) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: quest::get_expedition_lockout_by_char_id(uint32 character_id, string expedition_name, string event_name)"); + } + + uint32_t character_id = static_cast(SvUV(ST(0))); + std::string expedition_name = SvPV_nolen(ST(1)); + std::string event_name = SvPV_nolen(ST(2)); + + auto lockouts = Expedition::GetExpeditionLockoutsByCharacterID(character_id); + auto it = std::find_if(lockouts.begin(), lockouts.end(), [&](const ExpeditionLockoutTimer& lockout) { + return lockout.IsSameLockout(expedition_name, event_name); + }); + + // mortalize so its refcnt is auto decremented on function exit to avoid leak + HV* hash = (HV*)sv_2mortal((SV*)newHV()); // hash refcnt +1 (mortal -1) + + if (it != lockouts.end()) + { + hv_store(hash, "remaining", strlen("remaining"), newSVuv(it->GetSecondsRemaining()), 0); + hv_store(hash, "uuid", strlen("uuid"), newSVpv(it->GetExpeditionUUID().c_str(), 0), 0); + } + + ST(0) = sv_2mortal(newRV((SV*)hash)); // hash refcnt: 2 (-1 mortal), reference: 1 (-1 mortal) + XSRETURN(1); +} + +XS(XS__get_expedition_lockouts_by_char_id); +XS(XS__get_expedition_lockouts_by_char_id) { + dXSARGS; + if (items != 1 && items != 2) { + Perl_croak(aTHX_ "Usage: quest::get_expedition_lockouts_by_char_id(uint32 character_id, [string expedition_name])"); + } + + HV* hash = newHV(); // hash refcnt +1 (non-mortal, newRV_noinc to not inc) + SV* hash_ref = nullptr; // for expedition event hash if filtering on expedition + + uint32_t character_id = static_cast(SvUV(ST(0))); + std::string expedition_name; + if (items == 2) + { + expedition_name = SvPV_nolen(ST(1)); + } + + auto lockouts = Expedition::GetExpeditionLockoutsByCharacterID(character_id); + + for (const auto& lockout : lockouts) + { + uint32_t name_len = static_cast(lockout.GetExpeditionName().size()); + uint32_t event_len = static_cast(lockout.GetEventName().size()); + + // hashes are stored through references inside other hashes/arrays. we need + // to wrap newHV in newRV references when inserting nested hash values. + // we use newRV_noinc to not increment the hash's ref count; rv will own it + + SV** entry = hv_fetch(hash, lockout.GetExpeditionName().c_str(), name_len, false); + if (!entry) + { + // create expedition entry in hash with its value as ref to event hash + SV* event_hash_ref = newRV_noinc((SV*)newHV()); // ref takes ownership + if (!expedition_name.empty() && lockout.GetExpeditionName() == expedition_name) + { + hash_ref = event_hash_ref; // save ref for filtered expedition return + } + entry = hv_store(hash, lockout.GetExpeditionName().c_str(), name_len, event_hash_ref, 0); + } + + // *entry is a reference to expedition's event hash (which it owns). the + // event entry in the hash will contain ref to a lockout detail hash + if (entry && SvROK(*entry) && SvTYPE(SvRV(*entry)) == SVt_PVHV) // is ref to hash type + { + HV* details_hash = newHV(); // refcnt +1, reference will take ownership + hv_store(details_hash, "remaining", strlen("remaining"), newSVuv(lockout.GetSecondsRemaining()), 0); + hv_store(details_hash, "uuid", strlen("uuid"), newSVpv(lockout.GetExpeditionUUID().c_str(), 0), 0); + + HV* event_hash = (HV*)SvRV(*entry); + hv_store(event_hash, lockout.GetEventName().c_str(), event_len, + (SV*)newRV_noinc((SV*)details_hash), 0); + } + } + + SV* rv = &PL_sv_undef; + + if (!expedition_name.empty()) + { + rv = hash_ref ? sv_2mortal(hash_ref) : &PL_sv_undef; // ref that owns event hash for expedition + } + else + { + rv = sv_2mortal(newRV_noinc((SV*)hash)); // takes ownership of expedition hash + } + + ST(0) = rv; + XSRETURN(1); +} + +XS(XS__add_expedition_lockout_all_clients); +XS(XS__add_expedition_lockout_all_clients) { + dXSARGS; + if (items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: quest::add_expedition_lockout_all_clients(string expedition_name, string event_name, uint32 seconds, [string uuid])"); + } + + std::string expedition_name = SvPV_nolen(ST(0)); + std::string event_name = SvPV_nolen(ST(1)); + uint32_t seconds = static_cast(SvUV(ST(2))); + std::string uuid; + + if (items == 4) + { + uuid = SvPV_nolen(ST(3)); + } + + auto lockout = ExpeditionLockoutTimer::CreateLockout(expedition_name, event_name, seconds, uuid); + Expedition::AddLockoutClients(lockout); + + XSRETURN_EMPTY; +} + +XS(XS__add_expedition_lockout_by_char_id); +XS(XS__add_expedition_lockout_by_char_id) { + dXSARGS; + if (items != 4 && items != 5) { + Perl_croak(aTHX_ "Usage: quest::add_expedition_lockout_by_char_id(uint32 character_id, string expedition_name, string event_name, uint32 seconds, [string uuid])"); + } + + std::string uuid; + if (items == 5) + { + uuid = SvPV_nolen(ST(4)); + } + + uint32_t character_id = static_cast(SvUV(ST(0))); + std::string expedition_name = SvPV_nolen(ST(1)); + std::string event_name = SvPV_nolen(ST(2)); + uint32_t seconds = static_cast(SvUV(ST(3))); + + Expedition::AddLockoutByCharacterID(character_id, expedition_name, event_name, seconds, uuid); + + XSRETURN_EMPTY; +} + +XS(XS__remove_expedition_lockout_by_char_id); +XS(XS__remove_expedition_lockout_by_char_id) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: quest::remove_expedition_lockout_by_char_id(uint32 character_id, string expedition_name, string event_name)"); + } + + uint32_t character_id = static_cast(SvUV(ST(0))); + std::string expedition_name = SvPV_nolen(ST(1)); + std::string event_name = SvPV_nolen(ST(2)); + + Expedition::RemoveLockoutsByCharacterID(character_id, expedition_name, event_name); + + XSRETURN_EMPTY; +} + +XS(XS__remove_all_expedition_lockouts_by_char_id); +XS(XS__remove_all_expedition_lockouts_by_char_id) { + dXSARGS; + if (items != 1 && items != 2) { + Perl_croak(aTHX_ "Usage: quest::remove_expedition_lockout_by_char_id(uint32 character_id, [string expedition_name])"); + } + + std::string expedition_name; + if (items == 2) + { + expedition_name = SvPV_nolen(ST(1)); + } + + uint32_t character_id = static_cast(SvUV(ST(0))); + Expedition::RemoveLockoutsByCharacterID(character_id, expedition_name); + + XSRETURN_EMPTY; +} + +XS(XS__createitem); +XS(XS__createitem) { + dXSARGS; + if (items < 1 || items > 9) { + Perl_croak(aTHX_ "Usage: quest::createitem(uint32 item_id, [int16 charges = 0, uint32 augment_one = 0, uint32 augment_two = 0, uint32 augment_three = 0, uint32 augment_four = 0, uint32 augment_five = 0, uint32 augment_six = 0, bool attuned = false])"); + } + + EQ::ItemInstance* RETVAL = nullptr; + uint32 item_id = (uint32)SvUV(ST(0)); + int16 charges = 0; + uint32 augment_one = 0; + uint32 augment_two = 0; + uint32 augment_three = 0; + uint32 augment_four = 0; + uint32 augment_five = 0; + uint32 augment_six = 0; + bool attuned = false; + if (items > 1) + charges = (int16)SvIV(ST(1)); + if (items > 2) + augment_one = (uint32)SvUV(ST(2)); + if (items > 3) + augment_two = (uint32)SvUV(ST(3)); + if (items > 4) + augment_three = (uint32)SvUV(ST(4)); + if (items > 5) + augment_four = (uint32)SvUV(ST(5)); + if (items > 6) + augment_five = (uint32)SvUV(ST(6)); + if (items > 7) + augment_six = (uint32)SvUV(ST(7)); + if (items > 8) + attuned = (bool)SvNV(ST(8)); + + if (database.GetItem(item_id)) { + RETVAL = database.CreateItem(item_id, charges, augment_one, augment_two, augment_three, augment_four, augment_five, augment_six, attuned); + } + + ST(0) = sv_newmortal(); + if (RETVAL) { + sv_setref_pv(ST(0), "QuestItem", (void*)RETVAL); + } + XSRETURN(1); +} + +XS(XS__secondstotime); +XS(XS__secondstotime) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: quest::secondstotime(int duration)"); + } + + dXSTARG; + std::string time_string; + int duration = (int) SvIV(ST(0)); + time_string = quest_manager.secondstotime(duration); + sv_setpv(TARG, time_string.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__gethexcolorcode); +XS(XS__gethexcolorcode) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: quest::gethexcolorcode(std::string color_name)"); + } + + dXSTARG; + std::string hex_color_code; + std::string color_name = SvPV_nolen(ST(0)); + hex_color_code = quest_manager.gethexcolorcode(color_name); + sv_setpv(TARG, hex_color_code.c_str()); + XSprePUSH; + PUSHTARG; + XSRETURN(1); +} + +XS(XS__getaaexpmodifierbycharid); +XS(XS__getaaexpmodifierbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::getaaexpmodifierbycharid(uint32 character_id, uint32 zone_id)"); + + dXSTARG; + double aa_modifier; + uint32 character_id = (uint32) SvUV(ST(0)); + uint32 zone_id = (uint32) SvUV(ST(1)); + aa_modifier = quest_manager.GetAAEXPModifierByCharID(character_id, zone_id); + XSprePUSH; + PUSHn((double) aa_modifier); + XSRETURN(1); +} + +XS(XS__getexpmodifierbycharid); +XS(XS__getexpmodifierbycharid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::getexpmodifierbycharid(uint32 character_id, uint32 zone_id)"); + + dXSTARG; + double exp_modifier; + uint32 character_id = (uint32) SvUV(ST(0)); + uint32 zone_id = (uint32) SvUV(ST(1)); + exp_modifier = quest_manager.GetEXPModifierByCharID(character_id, zone_id); + XSprePUSH; + PUSHn((double) exp_modifier); + XSRETURN(1); +} + +XS(XS__setaaexpmodifierbycharid); +XS(XS__setaaexpmodifierbycharid) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: quest::setaaexpmodifierbycharid(uint32 character_id, uint32 zone_id, float aa_modifier)"); + } + uint32 character_id = (uint32) SvUV(ST(0)); + uint32 zone_id = (uint32) SvUV(ST(1)); + double aa_modifier = (double) SvNV(ST(2)); + quest_manager.SetAAEXPModifierByCharID(character_id, zone_id, aa_modifier); + XSRETURN_EMPTY; +} + +XS(XS__setexpmodifierbycharid); +XS(XS__setexpmodifierbycharid) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: quest::setexpmodifierbycharid(uint32 character_id, uint32 zone_id, float exp_modifier)"); + } + uint32 character_id = (uint32) SvUV(ST(0)); + uint32 zone_id = (uint32) SvUV(ST(1)); + double exp_modifier = (double) SvNV(ST(2)); + quest_manager.SetEXPModifierByCharID(character_id, zone_id, exp_modifier); + XSRETURN_EMPTY; +} + /* This is the callback perl will look for to setup the quest package's XSUBs @@ -3911,6 +6601,8 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "GetTimeSeconds"), XS__GetTimeSeconds, file); newXS(strcpy(buf, "GetZoneID"), XS__GetZoneID, file); newXS(strcpy(buf, "GetZoneLongName"), XS__GetZoneLongName, file); + newXS(strcpy(buf, "GetZoneLongNameByID"), XS__GetZoneLongNameByID, file); + newXS(strcpy(buf, "GetZoneShortName"), XS__GetZoneShortName, file); newXS(strcpy(buf, "set_rule"), XS__set_rule, file); newXS(strcpy(buf, "get_rule"), XS__get_rule, file); newXS(strcpy(buf, "get_data"), XS__get_data, file); @@ -3927,11 +6619,14 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "RemoveAllFromInstance"), XS__RemoveAllFromInstance, file); newXS(strcpy(buf, "RemoveFromInstance"), XS__RemoveFromInstance, file); newXS(strcpy(buf, "RemoveFromInstanceByCharID"), XS__RemoveFromInstanceByCharID, file); + newXS(strcpy(buf, "CheckInstanceByCharID"), XS__CheckInstanceByCharID, file); newXS(strcpy(buf, "SendMail"), XS__SendMail, file); newXS(strcpy(buf, "SetRunning"), XS__SetRunning, file); newXS(strcpy(buf, "activespeakactivity"), XS__activespeakactivity, file); newXS(strcpy(buf, "activespeaktask"), XS__activespeaktask, file); newXS(strcpy(buf, "activetasksinset"), XS__activetasksinset, file); + newXS(strcpy(buf, "add_expedition_lockout_all_clients"), XS__add_expedition_lockout_all_clients, file); + newXS(strcpy(buf, "add_expedition_lockout_by_char_id"), XS__add_expedition_lockout_by_char_id, file); newXS(strcpy(buf, "addldonloss"), XS__addldonpoints, file); newXS(strcpy(buf, "addldonpoints"), XS__addldonpoints, file); newXS(strcpy(buf, "addldonwin"), XS__addldonpoints, file); @@ -3951,17 +6646,91 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "clearspawntimers"), XS__clearspawntimers, file); newXS(strcpy(buf, "collectitems"), XS__collectitems, file); newXS(strcpy(buf, "completedtasksinset"), XS__completedtasksinset, file); + newXS(strcpy(buf, "countitem"), XS__countitem, file); newXS(strcpy(buf, "createdoor"), XS__CreateDoor, file); newXS(strcpy(buf, "creategroundobject"), XS__CreateGroundObject, file); newXS(strcpy(buf, "creategroundobjectfrommodel"), XS__CreateGroundObjectFromModel, file); newXS(strcpy(buf, "createguild"), XS__createguild, file); + newXS(strcpy(buf, "createitem"), XS__createitem, file); + newXS(strcpy(buf, "crosszoneassigntaskbycharid"), XS__crosszoneassigntaskbycharid, file); + newXS(strcpy(buf, "crosszoneassigntaskbygroupid"), XS__crosszoneassigntaskbygroupid, file); + newXS(strcpy(buf, "crosszoneassigntaskbyraidid"), XS__crosszoneassigntaskbyraidid, file); + newXS(strcpy(buf, "crosszoneassigntaskbyguildid"), XS__crosszoneassigntaskbyguildid, file); + newXS(strcpy(buf, "crosszonecastspellbycharid"), XS__crosszonecastspellbycharid, file); + newXS(strcpy(buf, "crosszonecastspellbygroupid"), XS__crosszonecastspellbygroupid, file); + newXS(strcpy(buf, "crosszonecastspellbyraidid"), XS__crosszonecastspellbyraidid, file); + newXS(strcpy(buf, "crosszonecastspellbyguildid"), XS__crosszonecastspellbyguildid, file); + newXS(strcpy(buf, "crosszonedisabletaskbycharid"), XS__crosszonedisabletaskbycharid, file); + newXS(strcpy(buf, "crosszonedisabletaskbygroupid"), XS__crosszonedisabletaskbygroupid, file); + newXS(strcpy(buf, "crosszonedisabletaskbyraidid"), XS__crosszonedisabletaskbyraidid, file); + newXS(strcpy(buf, "crosszonedisabletaskbyguildid"), XS__crosszonedisabletaskbyguildid, file); + newXS(strcpy(buf, "crosszoneenabletaskbycharid"), XS__crosszoneenabletaskbycharid, file); + newXS(strcpy(buf, "crosszoneenabletaskbygroupid"), XS__crosszoneenabletaskbygroupid, file); + newXS(strcpy(buf, "crosszoneenabletaskbyraidid"), XS__crosszoneenabletaskbyraidid, file); + newXS(strcpy(buf, "crosszoneenabletaskbyguildid"), XS__crosszoneenabletaskbyguildid, file); + newXS(strcpy(buf, "crosszonefailtaskbycharid"), XS__crosszonefailtaskbycharid, file); + newXS(strcpy(buf, "crosszonefailtaskbygroupid"), XS__crosszonefailtaskbygroupid, file); + newXS(strcpy(buf, "crosszonefailtaskbyraidid"), XS__crosszonefailtaskbyraidid, file); + newXS(strcpy(buf, "crosszonefailtaskbyguildid"), XS__crosszonefailtaskbyguildid, file); + newXS(strcpy(buf, "crosszonemarqueebycharid"), XS__crosszonemarqueebycharid, file); + newXS(strcpy(buf, "crosszonemarqueebygroupid"), XS__crosszonemarqueebygroupid, file); + newXS(strcpy(buf, "crosszonemarqueebyraidid"), XS__crosszonemarqueebyraidid, file); + newXS(strcpy(buf, "crosszonemarqueebyguildid"), XS__crosszonemarqueebyguildid, file); newXS(strcpy(buf, "crosszonemessageplayerbyname"), XS__crosszonemessageplayerbyname, file); + newXS(strcpy(buf, "crosszonemessageplayerbygroupid"), XS__crosszonemessageplayerbygroupid, file); + newXS(strcpy(buf, "crosszonemessageplayerbyraidid"), XS__crosszonemessageplayerbyraidid, file); + newXS(strcpy(buf, "crosszonemessageplayerbyguildid"), XS__crosszonemessageplayerbyguildid, file); + newXS(strcpy(buf, "crosszonemoveplayerbycharid"), XS__crosszonemoveplayerbycharid, file); + newXS(strcpy(buf, "crosszonemoveplayerbygroupid"), XS__crosszonemoveplayerbygroupid, file); + newXS(strcpy(buf, "crosszonemoveplayerbyraidid"), XS__crosszonemoveplayerbyraidid, file); + newXS(strcpy(buf, "crosszonemoveplayerbyguildid"), XS__crosszonemoveplayerbyguildid, file); + newXS(strcpy(buf, "crosszonemoveinstancebycharid"), XS__crosszonemoveinstancebycharid, file); + newXS(strcpy(buf, "crosszonemoveinstancebygroupid"), XS__crosszonemoveinstancebygroupid, file); + newXS(strcpy(buf, "crosszonemoveinstancebyraidid"), XS__crosszonemoveinstancebyraidid, file); + newXS(strcpy(buf, "crosszonemoveinstancebyguildid"), XS__crosszonemoveinstancebyguildid, file); + newXS(strcpy(buf, "crosszoneremovespellbycharid"), XS__crosszoneremovespellbycharid, file); + newXS(strcpy(buf, "crosszoneremovespellbygroupid"), XS__crosszoneremovespellbygroupid, file); + newXS(strcpy(buf, "crosszoneremovespellbyraidid"), XS__crosszoneremovespellbyraidid, file); + newXS(strcpy(buf, "crosszoneremovespellbyguildid"), XS__crosszoneremovespellbyguildid, file); + newXS(strcpy(buf, "crosszoneremovetaskbycharid"), XS__crosszoneremovetaskbycharid, file); + newXS(strcpy(buf, "crosszoneremovetaskbygroupid"), XS__crosszoneremovetaskbygroupid, file); + newXS(strcpy(buf, "crosszoneremovetaskbyraidid"), XS__crosszoneremovetaskbyraidid, file); + newXS(strcpy(buf, "crosszoneremovetaskbyguildid"), XS__crosszoneremovetaskbyguildid, file); + newXS(strcpy(buf, "crosszoneresetactivitybycharid"), XS__crosszoneresetactivitybycharid, file); + newXS(strcpy(buf, "crosszoneresetactivitybygroupid"), XS__crosszoneresetactivitybygroupid, file); + newXS(strcpy(buf, "crosszoneresetactivitybyraidid"), XS__crosszoneresetactivitybyraidid, file); + newXS(strcpy(buf, "crosszoneresetactivitybyguildid"), XS__crosszoneresetactivitybyguildid, file); newXS(strcpy(buf, "crosszonesetentityvariablebynpctypeid"), XS__crosszonesetentityvariablebynpctypeid, file); newXS(strcpy(buf, "crosszonesetentityvariablebyclientname"), XS__crosszonesetentityvariablebyclientname, file); + newXS(strcpy(buf, "crosszonesetentityvariablebygroupid"), XS__crosszonesetentityvariablebygroupid, file); + newXS(strcpy(buf, "crosszonesetentityvariablebyraidid"), XS__crosszonesetentityvariablebyraidid, file); + newXS(strcpy(buf, "crosszonesetentityvariablebyguildid"), XS__crosszonesetentityvariablebyguildid, file); newXS(strcpy(buf, "crosszonesignalclientbycharid"), XS__crosszonesignalclientbycharid, file); + newXS(strcpy(buf, "crosszonesignalclientbygroupid"), XS__crosszonesignalclientbygroupid, file); + newXS(strcpy(buf, "crosszonesignalclientbyraidid"), XS__crosszonesignalclientbyraidid, file); + newXS(strcpy(buf, "crosszonesignalclientbyguildid"), XS__crosszonesignalclientbyguildid, file); newXS(strcpy(buf, "crosszonesignalclientbyname"), XS__crosszonesignalclientbyname, file); newXS(strcpy(buf, "crosszonesignalnpcbynpctypeid"), XS__crosszonesignalnpcbynpctypeid, file); + newXS(strcpy(buf, "crosszoneupdateactivitybycharid"), XS__crosszoneupdateactivitybycharid, file); + newXS(strcpy(buf, "crosszoneupdateactivitybygroupid"), XS__crosszoneupdateactivitybygroupid, file); + newXS(strcpy(buf, "crosszoneupdateactivitybyraidid"), XS__crosszoneupdateactivitybyraidid, file); + newXS(strcpy(buf, "crosszoneupdateactivitybyguildid"), XS__crosszoneupdateactivitybyguildid, file); + newXS(strcpy(buf, "worldwidecastspell"), XS__worldwidecastspell, file); + newXS(strcpy(buf, "worldwidedisabletask"), XS__worldwidedisabletask, file); + newXS(strcpy(buf, "worldwideenabletask"), XS__worldwideenabletask, file); + newXS(strcpy(buf, "worldwidefailtask"), XS__worldwidefailtask, file); newXS(strcpy(buf, "worldwidemarquee"), XS__worldwidemarquee, file); + newXS(strcpy(buf, "worldwidemessage"), XS__worldwidemessage, file); + newXS(strcpy(buf, "worldwidemove"), XS__worldwidemove, file); + newXS(strcpy(buf, "worldwidemoveinstance"), XS__worldwidemoveinstance, file); + newXS(strcpy(buf, "worldwideremovespell"), XS__worldwideremovespell, file); + newXS(strcpy(buf, "worldwideremovetask"), XS__worldwideremovetask, file); + newXS(strcpy(buf, "worldwideresetactivity"), XS__worldwideresetactivity, file); + newXS(strcpy(buf, "worldwidesetentityvariableclient"), XS__worldwidesetentityvariableclient, file); + newXS(strcpy(buf, "worldwidesetentityvariablenpc"), XS__worldwidesetentityvariablenpc, file); + newXS(strcpy(buf, "worldwidesignalclient"), XS__worldwidesignalclient, file); + newXS(strcpy(buf, "worldwidesignalnpc"), XS__worldwidesignalnpc, file); + newXS(strcpy(buf, "worldwideupdateactivity"), XS__worldwideupdateactivity, file); newXS(strcpy(buf, "debug"), XS__debug, file); newXS(strcpy(buf, "delglobal"), XS__delglobal, file); newXS(strcpy(buf, "depop"), XS__depop, file); @@ -3990,18 +6759,39 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "follow"), XS__follow, file); newXS(strcpy(buf, "forcedoorclose"), XS__forcedoorclose, file); newXS(strcpy(buf, "forcedooropen"), XS__forcedooropen, file); + newXS(strcpy(buf, "getaaexpmodifierbycharid"), XS__getaaexpmodifierbycharid, file); + newXS(strcpy(buf, "getcharidbyname"), XS__getcharidbyname, file); + newXS(strcpy(buf, "getclassname"), XS__getclassname, file); + newXS(strcpy(buf, "gethexcolorcode"), XS__gethexcolorcode, file); + newXS(strcpy(buf, "getcurrencyid"), XS__getcurrencyid, file); + newXS(strcpy(buf, "getexpmodifierbycharid"), XS__getexpmodifierbycharid, file); + newXS(strcpy(buf, "get_expedition"), XS__get_expedition, file); + newXS(strcpy(buf, "get_expedition_by_char_id"), XS__get_expedition_by_char_id, file); + newXS(strcpy(buf, "get_expedition_by_dz_id"), XS__get_expedition_by_dz_id, file); + newXS(strcpy(buf, "get_expedition_by_zone_instance"), XS__get_expedition_by_zone_instance, file); + newXS(strcpy(buf, "get_expedition_lockout_by_char_id"), XS__get_expedition_lockout_by_char_id, file); + newXS(strcpy(buf, "get_expedition_lockouts_by_char_id"), XS__get_expedition_lockouts_by_char_id, file); newXS(strcpy(buf, "getinventoryslotid"), XS__getinventoryslotid, file); + newXS(strcpy(buf, "getitemname"), XS__getitemname, file); newXS(strcpy(buf, "getItemName"), XS_qc_getItemName, file); + newXS(strcpy(buf, "getnpcnamebyid"), XS__getnpcnamebyid, file); newXS(strcpy(buf, "get_spawn_condition"), XS__get_spawn_condition, file); + newXS(strcpy(buf, "getcharnamebyid"), XS__getcharnamebyid, file); + newXS(strcpy(buf, "getcurrencyitemid"), XS__getcurrencyitemid, file); newXS(strcpy(buf, "getguildnamebyid"), XS__getguildnamebyid, file); newXS(strcpy(buf, "getguildidbycharid"), XS__getguildidbycharid, file); newXS(strcpy(buf, "getgroupidbycharid"), XS__getgroupidbycharid, file); newXS(strcpy(buf, "getraididbycharid"), XS__getraididbycharid, file); + newXS(strcpy(buf, "getracename"), XS__getracename, file); + newXS(strcpy(buf, "getspellname"), XS__getspellname, file); + newXS(strcpy(buf, "get_spell_level"), XS__get_spell_level, file); + newXS(strcpy(buf, "getskillname"), XS__getskillname, file); newXS(strcpy(buf, "getlevel"), XS__getlevel, file); newXS(strcpy(buf, "getplayerburiedcorpsecount"), XS__getplayerburiedcorpsecount, file); newXS(strcpy(buf, "getplayercorpsecount"), XS__getplayercorpsecount, file); newXS(strcpy(buf, "getplayercorpsecountbyzoneid"), XS__getplayercorpsecountbyzoneid, file); newXS(strcpy(buf, "gettaskactivitydonecount"), XS__gettaskactivitydonecount, file); + newXS(strcpy(buf, "gettaskname"), XS__gettaskname, file); newXS(strcpy(buf, "givecash"), XS__givecash, file); newXS(strcpy(buf, "gmmove"), XS__gmmove, file); newXS(strcpy(buf, "gmsay"), XS__gmsay, file); @@ -4020,6 +6810,7 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "log"), XS__log, file); newXS(strcpy(buf, "log_combat"), XS__log_combat, file); newXS(strcpy(buf, "me"), XS__me, file); + newXS(strcpy(buf, "message"), XS__message, file); newXS(strcpy(buf, "modifynpcstat"), XS__ModifyNPCStat, file); newXS(strcpy(buf, "movegrp"), XS__movegrp, file); newXS(strcpy(buf, "movepc"), XS__movepc, file); @@ -4040,12 +6831,16 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "playersize"), XS__playersize, file); newXS(strcpy(buf, "playertexture"), XS__playertexture, file); newXS(strcpy(buf, "popup"), XS__popup, file); + newXS(strcpy(buf, "processmobswhilezoneempty"), XS__processmobswhilezoneempty, file); newXS(strcpy(buf, "pvp"), XS__pvp, file); newXS(strcpy(buf, "qs_player_event"), XS__qs_player_event, file); newXS(strcpy(buf, "qs_send_query"), XS__qs_send_query, file); newXS(strcpy(buf, "rain"), XS__rain, file); newXS(strcpy(buf, "rebind"), XS__rebind, file); newXS(strcpy(buf, "reloadzonestaticdata"), XS__reloadzonestaticdata, file); + newXS(strcpy(buf, "remove_all_expedition_lockouts_by_char_id"), XS__remove_all_expedition_lockouts_by_char_id, file); + newXS(strcpy(buf, "remove_expedition_lockout_by_char_id"), XS__remove_expedition_lockout_by_char_id, file); + newXS(strcpy(buf, "removeitem"), XS__removeitem, file); newXS(strcpy(buf, "removetitle"), XS__removetitle, file); newXS(strcpy(buf, "repopzone"), XS__repopzone, file); newXS(strcpy(buf, "resettaskactivity"), XS__resettaskactivity, file); @@ -4056,11 +6851,14 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "say"), XS__say, file); newXS(strcpy(buf, "saylink"), XS__saylink, file); newXS(strcpy(buf, "scribespells"), XS__scribespells, file); + newXS(strcpy(buf, "secondstotime"), XS__secondstotime, file); newXS(strcpy(buf, "selfcast"), XS__selfcast, file); + newXS(strcpy(buf, "setaaexpmodifierbycharid"), XS__setaaexpmodifierbycharid, file); newXS(strcpy(buf, "set_proximity"), XS__set_proximity, file); newXS(strcpy(buf, "set_zone_flag"), XS__set_zone_flag, file); newXS(strcpy(buf, "setallskill"), XS__setallskill, file); newXS(strcpy(buf, "setanim"), XS__setanim, file); + newXS(strcpy(buf, "setexpmodifierbycharid"), XS__setexpmodifierbycharid, file); newXS(strcpy(buf, "setglobal"), XS__setglobal, file); newXS(strcpy(buf, "setguild"), XS__setguild, file); newXS(strcpy(buf, "sethp"), XS__sethp, file); @@ -4112,9 +6910,76 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "voicetell"), XS__voicetell, file); newXS(strcpy(buf, "we"), XS__we, file); newXS(strcpy(buf, "wearchange"), XS__wearchange, file); + newXS(strcpy(buf, "whisper"), XS__whisper, file); newXS(strcpy(buf, "write"), XS__write, file); newXS(strcpy(buf, "ze"), XS__ze, file); newXS(strcpy(buf, "zone"), XS__zone, file); + newXS(strcpy(buf, "zonegroup"), XS__zonegroup, file); + newXS(strcpy(buf, "zoneraid"), XS__zoneraid, file); + + /** + * Expansions + */ + newXS(strcpy(buf, "is_classic_enabled"), XS__IsClassicEnabled, file); + newXS(strcpy(buf, "is_the_ruins_of_kunark_enabled"), XS__IsTheRuinsOfKunarkEnabled, file); + newXS(strcpy(buf, "is_the_scars_of_velious_enabled"), XS__IsTheScarsOfVeliousEnabled, file); + newXS(strcpy(buf, "is_the_shadows_of_luclin_enabled"), XS__IsTheShadowsOfLuclinEnabled, file); + newXS(strcpy(buf, "is_the_planes_of_power_enabled"), XS__IsThePlanesOfPowerEnabled, file); + newXS(strcpy(buf, "is_the_legacy_of_ykesha_enabled"), XS__IsTheLegacyOfYkeshaEnabled, file); + newXS(strcpy(buf, "is_lost_dungeons_of_norrath_enabled"), XS__IsLostDungeonsOfNorrathEnabled, file); + newXS(strcpy(buf, "is_gates_of_discord_enabled"), XS__IsGatesOfDiscordEnabled, file); + newXS(strcpy(buf, "is_omens_of_war_enabled"), XS__IsOmensOfWarEnabled, file); + newXS(strcpy(buf, "is_dragons_of_norrath_enabled"), XS__IsDragonsOfNorrathEnabled, file); + newXS(strcpy(buf, "is_depths_of_darkhollow_enabled"), XS__IsDepthsOfDarkhollowEnabled, file); + newXS(strcpy(buf, "is_prophecy_of_ro_enabled"), XS__IsProphecyOfRoEnabled, file); + newXS(strcpy(buf, "is_the_serpents_spine_enabled"), XS__IsTheSerpentsSpineEnabled, file); + newXS(strcpy(buf, "is_the_buried_sea_enabled"), XS__IsTheBuriedSeaEnabled, file); + newXS(strcpy(buf, "is_secrets_of_faydwer_enabled"), XS__IsSecretsOfFaydwerEnabled, file); + newXS(strcpy(buf, "is_seeds_of_destruction_enabled"), XS__IsSeedsOfDestructionEnabled, file); + newXS(strcpy(buf, "is_underfoot_enabled"), XS__IsUnderfootEnabled, file); + newXS(strcpy(buf, "is_house_of_thule_enabled"), XS__IsHouseOfThuleEnabled, file); + newXS(strcpy(buf, "is_veil_of_alaris_enabled"), XS__IsVeilOfAlarisEnabled, file); + newXS(strcpy(buf, "is_rain_of_fear_enabled"), XS__IsRainOfFearEnabled, file); + newXS(strcpy(buf, "is_call_of_the_forsaken_enabled"), XS__IsCallOfTheForsakenEnabled, file); + newXS(strcpy(buf, "is_the_darkend_sea_enabled"), XS__IsTheDarkendSeaEnabled, file); + newXS(strcpy(buf, "is_the_broken_mirror_enabled"), XS__IsTheBrokenMirrorEnabled, file); + newXS(strcpy(buf, "is_empires_of_kunark_enabled"), XS__IsEmpiresOfKunarkEnabled, file); + newXS(strcpy(buf, "is_ring_of_scale_enabled"), XS__IsRingOfScaleEnabled, file); + newXS(strcpy(buf, "is_the_burning_lands_enabled"), XS__IsTheBurningLandsEnabled, file); + newXS(strcpy(buf, "is_torment_of_velious_enabled"), XS__IsTormentOfVeliousEnabled, file); + newXS(strcpy(buf, "is_current_expansion_classic"), XS__IsCurrentExpansionClassic, file); + newXS(strcpy(buf, "is_current_expansion_the_ruins_of_kunark"), XS__IsCurrentExpansionTheRuinsOfKunark, file); + newXS(strcpy(buf, "is_current_expansion_the_scars_of_velious"), XS__IsCurrentExpansionTheScarsOfVelious, file); + newXS(strcpy(buf, "is_current_expansion_the_shadows_of_luclin"), XS__IsCurrentExpansionTheShadowsOfLuclin, file); + newXS(strcpy(buf, "is_current_expansion_the_planes_of_power"), XS__IsCurrentExpansionThePlanesOfPower, file); + newXS(strcpy(buf, "is_current_expansion_the_legacy_of_ykesha"), XS__IsCurrentExpansionTheLegacyOfYkesha, file); + newXS(strcpy(buf, "is_current_expansion_lost_dungeons_of_norrath"), XS__IsCurrentExpansionLostDungeonsOfNorrath, file); + newXS(strcpy(buf, "is_current_expansion_gates_of_discord"), XS__IsCurrentExpansionGatesOfDiscord, file); + newXS(strcpy(buf, "is_current_expansion_omens_of_war"), XS__IsCurrentExpansionOmensOfWar, file); + newXS(strcpy(buf, "is_current_expansion_dragons_of_norrath"), XS__IsCurrentExpansionDragonsOfNorrath, file); + newXS(strcpy(buf, "is_current_expansion_depths_of_darkhollow"), XS__IsCurrentExpansionDepthsOfDarkhollow, file); + newXS(strcpy(buf, "is_current_expansion_prophecy_of_ro"), XS__IsCurrentExpansionProphecyOfRo, file); + newXS(strcpy(buf, "is_current_expansion_the_serpents_spine"), XS__IsCurrentExpansionTheSerpentsSpine, file); + newXS(strcpy(buf, "is_current_expansion_the_buried_sea"), XS__IsCurrentExpansionTheBuriedSea, file); + newXS(strcpy(buf, "is_current_expansion_secrets_of_faydwer"), XS__IsCurrentExpansionSecretsOfFaydwer, file); + newXS(strcpy(buf, "is_current_expansion_seeds_of_destruction"), XS__IsCurrentExpansionSeedsOfDestruction, file); + newXS(strcpy(buf, "is_current_expansion_underfoot"), XS__IsCurrentExpansionUnderfoot, file); + newXS(strcpy(buf, "is_current_expansion_house_of_thule"), XS__IsCurrentExpansionHouseOfThule, file); + newXS(strcpy(buf, "is_current_expansion_veil_of_alaris"), XS__IsCurrentExpansionVeilOfAlaris, file); + newXS(strcpy(buf, "is_current_expansion_rain_of_fear"), XS__IsCurrentExpansionRainOfFear, file); + newXS(strcpy(buf, "is_current_expansion_call_of_the_forsaken"), XS__IsCurrentExpansionCallOfTheForsaken, file); + newXS(strcpy(buf, "is_current_expansion_the_darkend_sea"), XS__IsCurrentExpansionTheDarkendSea, file); + newXS(strcpy(buf, "is_current_expansion_the_broken_mirror"), XS__IsCurrentExpansionTheBrokenMirror, file); + newXS(strcpy(buf, "is_current_expansion_empires_of_kunark"), XS__IsCurrentExpansionEmpiresOfKunark, file); + newXS(strcpy(buf, "is_current_expansion_ring_of_scale"), XS__IsCurrentExpansionRingOfScale, file); + newXS(strcpy(buf, "is_current_expansion_the_burning_lands"), XS__IsCurrentExpansionTheBurningLands, file); + newXS(strcpy(buf, "is_current_expansion_torment_of_velious"), XS__IsCurrentExpansionTormentOfVelious, file); + + /** + * Content flags + */ + newXS(strcpy(buf, "is_content_flag_enabled"), XS__IsContentFlagEnabled, file); + newXS(strcpy(buf, "set_content_flag"), XS__SetContentFlag, file); XSRETURN_YES; } diff --git a/zone/embperl.cpp b/zone/embperl.cpp index c7ebb8060..b05a429a1 100644 --- a/zone/embperl.cpp +++ b/zone/embperl.cpp @@ -32,11 +32,13 @@ EXTERN_C XS(boot_Corpse); EXTERN_C XS(boot_EntityList); EXTERN_C XS(boot_Group); EXTERN_C XS(boot_Raid); +EXTERN_C XS(boot_Inventory); EXTERN_C XS(boot_QuestItem); EXTERN_C XS(boot_HateEntry); EXTERN_C XS(boot_Object); EXTERN_C XS(boot_Doors); EXTERN_C XS(boot_PerlPacket); +EXTERN_C XS(boot_Expedition); #endif #endif @@ -83,10 +85,12 @@ EXTERN_C void xs_init(pTHX) newXS(strcpy(buf, "PerlPacket::boot_PerlPacket"), boot_PerlPacket, file); newXS(strcpy(buf, "Group::boot_Group"), boot_Group, file); newXS(strcpy(buf, "Raid::boot_Raid"), boot_Raid, file); + newXS(strcpy(buf, "Inventory::boot_Inventory"), boot_Inventory, file); newXS(strcpy(buf, "QuestItem::boot_QuestItem"), boot_QuestItem, file); newXS(strcpy(buf, "HateEntry::boot_HateEntry"), boot_HateEntry, file); newXS(strcpy(buf, "Object::boot_Object"), boot_Object, file); newXS(strcpy(buf, "Doors::boot_Doors"), boot_Doors, file); + newXS(strcpy(buf, "Expedition::boot_Expedition"), boot_Expedition, file); ; #endif #endif diff --git a/zone/embxs.cpp b/zone/embxs.cpp index 4571a8f8f..d22f3ecac 100644 --- a/zone/embxs.cpp +++ b/zone/embxs.cpp @@ -33,7 +33,7 @@ const char *getItemName(unsigned itemid) { - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; item = database.GetItem(itemid); if (item) diff --git a/zone/encounter.cpp b/zone/encounter.cpp index 7d37844b6..5eba3b028 100644 --- a/zone/encounter.cpp +++ b/zone/encounter.cpp @@ -36,7 +36,7 @@ Encounter::Encounter(const char* enc_name) :Mob ( nullptr, nullptr, 0, 0, 0, INVISIBLE_MAN, 0, BT_NoTarget, 0, 0, 0, 0, 0, glm::vec4(0,0,0,0), 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EQEmu::TintProfile(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EQ::TintProfile(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false ) { encounter_name[0] = 0; diff --git a/zone/encounter.h b/zone/encounter.h index eeeba8e0f..026da2e79 100644 --- a/zone/encounter.h +++ b/zone/encounter.h @@ -34,9 +34,9 @@ public: ~Encounter(); //abstract virtual function implementations required by base abstract class - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill) { return true; } - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) { return; } - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill) { return true; } + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) { return; } + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) { return false; } diff --git a/zone/entity.cpp b/zone/entity.cpp index b13fb5649..5cc12dc72 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -32,6 +32,8 @@ #include "../common/features.h" #include "../common/guilds.h" +#include "entity.h" +#include "dynamic_zone.h" #include "guild_mgr.h" #include "petitions.h" #include "quest_parser_collection.h" @@ -498,11 +500,32 @@ void EntityList::MobProcess() size_t sz = mob_list.size(); #ifdef IDLE_WHEN_EMPTY - if (numclients > 0 || - mob->GetWanderType() == 4 || mob->GetWanderType() == 6) { - // Normal processing, or assuring that spawns that should - // path and depop do that. Otherwise all of these type mobs - // will be up and at starting positions when idle zone wakes up. + static int old_client_count=0; + static Timer *mob_settle_timer = new Timer(); + + if (numclients == 0 && old_client_count > 0 && + RuleI(Zone, SecondsBeforeIdle) > 0) { + // Start Timer to allow any mobs that chased chars from zone + // to return home. + mob_settle_timer->Start(RuleI(Zone, SecondsBeforeIdle) * 1000); + } + + old_client_count = numclients; + + // Disable settle timer if someone zones into empty zone + if (numclients > 0 || mob_settle_timer->Check()) { + mob_settle_timer->Disable(); + } + + Spawn2* s2 = mob->CastToNPC()->respawn2; + + // Perform normal mob processing if any of these are true: + // -- zone is not empty + // -- a quest has turned it on for this zone while zone is idle + // -- the entity's spawn2 point is marked as path_while_zone_idle + // -- the zone is newly empty and we're allowing mobs to settle + if (zone->process_mobs_while_empty || numclients > 0 || + (s2 && s2->PathWhenZoneIdle()) || mob_settle_timer->Enabled()) { mob_dead = !mob->Process(); } else { @@ -581,6 +604,8 @@ void EntityList::EncounterProcess() auto it = encounter_list.begin(); while (it != encounter_list.end()) { if (!it->second->Process()) { + // if Process is returning false here, we probably just got called from ReloadQuests .. oh well + parse->RemoveEncounter(it->second->GetEncounterName()); safe_delete(it->second); free_ids.push(it->first); it = encounter_list.erase(it); @@ -693,6 +718,8 @@ void EntityList::AddNPC(NPC *npc, bool SendSpawnPacket, bool dontqueue) npc_list.insert(std::pair(npc->GetID(), npc)); mob_list.insert(std::pair(npc->GetID(), npc)); + entity_list.ScanCloseMobs(npc->close_mobs, npc, true); + /* Zone controller process EVENT_SPAWN_ZONE */ if (RuleB(Zone, UseZoneController)) { if (entity_list.GetNPCByNPCTypeID(ZONE_CONTROLLER_NPC_ID) && npc->GetNPCTypeID() != ZONE_CONTROLLER_NPC_ID){ @@ -931,12 +958,12 @@ bool EntityList::MakeDoorSpawnPacket(EQApplicationPacket *app, Client *client) memcpy(new_door.name, door->GetDoorName(), 32); auto position = door->GetPosition(); - + new_door.xPos = position.x; new_door.yPos = position.y; new_door.zPos = position.z; new_door.heading = position.w; - + new_door.incline = door->GetIncline(); new_door.size = door->GetSize(); new_door.doorId = door->GetDoorID(); @@ -1097,6 +1124,22 @@ NPC *EntityList::GetNPCByNPCTypeID(uint32 npc_id) return nullptr; } +NPC *EntityList::GetNPCBySpawnID(uint32 spawn_id) +{ + if (spawn_id == 0 || npc_list.empty()) { + return nullptr; + } + + auto it = npc_list.begin(); + while (it != npc_list.end()) { + if (it->second->GetSpawnGroupId() == spawn_id) { + return it->second; + } + ++it; + } + return nullptr; +} + Mob *EntityList::GetMob(uint16 get_id) { Entity *ent = nullptr; @@ -1287,8 +1330,8 @@ void EntityList::SendZoneSpawnsBulk(Client *client) const glm::vec4 &client_position = client->GetPosition(); const float distance_max = (600.0 * 600.0); - for (auto it = mob_list.begin(); it != mob_list.end(); ++it) { - spawn = it->second; + for (auto & it : mob_list) { + spawn = it.second; if (spawn && spawn->GetID() > 0 && spawn->Spawned()) { if (!spawn->ShouldISpawnFor(client)) { continue; @@ -1563,7 +1606,7 @@ void EntityList::QueueClientsByTarget(Mob *sender, const EQApplicationPacket *ap } } -void EntityList::QueueClientsByXTarget(Mob *sender, const EQApplicationPacket *app, bool iSendToSender, EQEmu::versions::ClientVersionBitmask client_version_bits) +void EntityList::QueueClientsByXTarget(Mob *sender, const EQApplicationPacket *app, bool iSendToSender, EQ::versions::ClientVersionBitmask client_version_bits) { auto it = client_list.begin(); while (it != client_list.end()) { @@ -1693,7 +1736,7 @@ void EntityList::QueueClientsStatus(Mob *sender, const EQApplicationPacket *app, void EntityList::DuelMessage(Mob *winner, Mob *loser, bool flee) { if (winner->GetLevelCon(winner->GetLevel(), loser->GetLevel()) > 2) { - std::vector args; + std::vector args; args.push_back(winner); args.push_back(loser); @@ -1984,17 +2027,26 @@ Raid *EntityList::GetRaidByID(uint32 id) Raid *EntityList::GetRaidByClient(Client* client) { - std::list::iterator iterator; + if (client->p_raid_instance) { + return client->p_raid_instance; + } + std::list::iterator iterator; iterator = raid_list.begin(); while (iterator != raid_list.end()) { - for (int x = 0; x < MAX_RAID_MEMBERS; x++) - if ((*iterator)->members[x].member) - if((*iterator)->members[x].member == client) + for (auto &member : (*iterator)->members) { + if (member.member) { + if (member.member == client) { + client->p_raid_instance = *iterator; return *iterator; + } + } + } + ++iterator; } + return nullptr; } @@ -2086,7 +2138,7 @@ void EntityList::QueueClientsGuildBankItemUpdate(const GuildBankItemUpdate_Struc memcpy(outgbius, gbius, sizeof(GuildBankItemUpdate_Struct)); - const EQEmu::ItemData *Item = database.GetItem(gbius->ItemID); + const EQ::ItemData *Item = database.GetItem(gbius->ItemID); auto it = client_list.begin(); while (it != client_list.end()) { @@ -2432,7 +2484,7 @@ void EntityList::RemoveAllGroups() while (group_list.size()) { auto group = group_list.front(); group_list.pop_front(); - delete group; + safe_delete(group); } #if EQDEBUG >= 5 CheckGroupList (__FILE__, __LINE__); @@ -2444,7 +2496,7 @@ void EntityList::RemoveAllRaids() while (raid_list.size()) { auto raid = raid_list.front(); raid_list.pop_front(); - delete raid; + safe_delete(raid); } } @@ -2462,7 +2514,11 @@ void EntityList::RemoveAllDoors() void EntityList::DespawnAllDoors() { auto outapp = new EQApplicationPacket(OP_RemoveAllDoors, 0); - this->QueueClients(0,outapp); + for (auto it = client_list.begin(); it != client_list.end(); ++it) { + if (it->second) { + it->second->QueuePacket(outapp, true, Client::CLIENT_CONNECTED); + } + } safe_delete(outapp); } @@ -2473,7 +2529,7 @@ void EntityList::RespawnAllDoors() if (it->second) { auto outapp = new EQApplicationPacket(); MakeDoorSpawnPacket(outapp, it->second); - it->second->FastQueuePacket(&outapp); + it->second->FastQueuePacket(&outapp, true, Client::CLIENT_CONNECTED); } ++it; } @@ -2513,6 +2569,7 @@ void EntityList::RemoveAllEncounters() { auto it = encounter_list.begin(); while (it != encounter_list.end()) { + parse->RemoveEncounter(it->second->GetEncounterName()); safe_delete(it->second); free_ids.push(it->first); it = encounter_list.erase(it); @@ -2609,7 +2666,6 @@ bool EntityList::RemoveMobFromCloseLists(Mob *mob) auto it = mob_list.begin(); while (it != mob_list.end()) { - LogEntityManagement( "Removing mob [{}] from [{}] close list entity_id ({})", mob->GetCleanName(), @@ -2643,10 +2699,44 @@ void EntityList::RemoveAuraFromMobs(Mob *aura) } /** + * The purpose of this system is so that we cache relevant entities that are "close" + * + * In general; it becomes incredibly expensive to run zone-wide checks against every single mob in the zone when in reality + * we only care about entities closest to us + * + * A very simple example of where this is relevant is Aggro, the below example is skewed because the overall implementation + * of Aggro was also tweaked in conjunction with close lists. We also scan more aggressively when entities are moving (1-6 seconds) + * versus 60 seconds when idle. We also have entities that are moving add themselves to those closest to them so that their close + * lists remain always up to date + * + * Before: Aggro checks for NPC to Client aggro | (40 clients in zone) x (525 npcs) x 2 (times a second) = 2,520,000 checks a minute + * After: Aggro checks for NPC to Client aggro | (40 clients in zone) x (20-30 npcs) x 2 (times a second) = 144,000 checks a minute (This is actually far less today) + * + * Places in the code where this logic makes a huge impact + * + * Aggro checks (zone wide -> close) + * Aura processing (zone wide -> close) + * AE Taunt (zone wide -> close) + * AOE Spells (zone wide -> close) + * Bard Pulse AOE (zone wide -> close) + * Mass Group Buff (zone wide -> close) + * AE Attack (zone wide -> close) + * Packet QueueCloseClients (zone wide -> close) + * Check Close Beneficial Spells (Buffs; should I heal other npcs) (zone wide -> close) + * AI Yell for Help (NPC Assist other NPCs) (zone wide -> close) + * + * All of the above makes a tremendous impact on the bottom line of cpu cycle performance because we run an order of magnitude + * less checks by focusing our hot path logic down to a very small subset of relevant entities instead of looping an entire + * entity list (zone wide) + * * @param close_mobs * @param scanning_mob */ -void EntityList::ScanCloseMobs(std::unordered_map &close_mobs, Mob *scanning_mob) +void EntityList::ScanCloseMobs( + std::unordered_map &close_mobs, + Mob *scanning_mob, + bool add_self_to_other_lists +) { float scan_range = RuleI(Range, MobCloseScanDistance) * RuleI(Range, MobCloseScanDistance); @@ -2664,11 +2754,23 @@ void EntityList::ScanCloseMobs(std::unordered_map &close_mobs, Mo } float distance = DistanceSquared(scanning_mob->GetPosition(), mob->GetPosition()); - if (distance <= scan_range) { - close_mobs.insert(std::pair(mob->GetID(), mob)); - } - else if (mob->GetAggroRange() >= scan_range) { + if (distance <= scan_range || mob->GetAggroRange() >= scan_range) { close_mobs.insert(std::pair(mob->GetID(), mob)); + + if (add_self_to_other_lists && scanning_mob->GetID() > 0) { + bool has_mob = false; + + for (auto &cm: mob->close_mobs) { + if (scanning_mob->GetID() == cm.first) { + has_mob = true; + break; + } + } + + if (!has_mob) { + mob->close_mobs.insert(std::pair(scanning_mob->GetID(), scanning_mob)); + } + } } } @@ -2774,7 +2876,7 @@ bool EntityList::RemoveGroup(uint32 delete_id) } auto group = *it; group_list.erase(it); - delete group; + safe_delete(group); return true; } @@ -2786,7 +2888,7 @@ bool EntityList::RemoveRaid(uint32 delete_id) return false; auto raid = *it; raid_list.erase(it); - delete raid; + safe_delete(raid); return true; } @@ -2902,7 +3004,7 @@ void EntityList::Depop(bool StartSpawnTimer) if (own && own->IsClient()) continue; - if (pnpc->IsHorse) + if (pnpc->IsHorse()) continue; if (pnpc->IsFindable()) @@ -3277,13 +3379,15 @@ void EntityList::Evade(Mob *who) void EntityList::ClearAggro(Mob* targ) { Client *c = nullptr; - if (targ->IsClient()) + if (targ->IsClient()) { c = targ->CastToClient(); + } auto it = npc_list.begin(); while (it != npc_list.end()) { if (it->second->CheckAggro(targ)) { - if (c) + if (c) { c->RemoveXTarget(it->second, false); + } it->second->RemoveFromHateList(targ); } if (c && it->second->IsOnFeignMemory(c)) { @@ -3294,6 +3398,32 @@ void EntityList::ClearAggro(Mob* targ) } } +//removes "targ" from all hate lists of mobs that are water only. +void EntityList::ClearWaterAggro(Mob* targ) +{ + Client *c = nullptr; + if (targ->IsClient()) { + c = targ->CastToClient(); + } + auto it = npc_list.begin(); + while (it != npc_list.end()) { + if (it->second->IsUnderwaterOnly()) { + if (it->second->CheckAggro(targ)) { + if (c) { + c->RemoveXTarget(it->second, false); + } + it->second->RemoveFromHateList(targ); + } + if (c && it->second->IsOnFeignMemory(c)) { + it->second->RemoveFromFeignMemory(c); //just in case we feigned + c->RemoveXTarget(it->second, false); + } + } + ++it; + } +} + + void EntityList::ClearFeignAggro(Mob *targ) { auto it = npc_list.begin(); @@ -3306,7 +3436,7 @@ void EntityList::ClearFeignAggro(Mob *targ) } if (targ->IsClient()) { - std::vector args; + std::vector args; args.push_back(it->second); int i = parse->EventPlayer(EVENT_FEIGN_DEATH, targ->CastToClient(), "", 0, &args); if (i != 0) { @@ -3373,11 +3503,11 @@ bool EntityList::MakeTrackPacket(Client *client) float MobDistance; if (client->GetClass() == DRUID) - distance = (client->GetSkill(EQEmu::skills::SkillTracking) * 10); + distance = (client->GetSkill(EQ::skills::SkillTracking) * 10); else if (client->GetClass() == RANGER) - distance = (client->GetSkill(EQEmu::skills::SkillTracking) * 12); + distance = (client->GetSkill(EQ::skills::SkillTracking) * 12); else if (client->GetClass() == BARD) - distance = (client->GetSkill(EQEmu::skills::SkillTracking) * 7); + distance = (client->GetSkill(EQ::skills::SkillTracking) * 7); if (distance <= 0) return false; if (distance < 300) @@ -3479,18 +3609,21 @@ void EntityList::AddHealAggro(Mob *target, Mob *caster, uint16 hate) void EntityList::OpenDoorsNear(Mob *who) { + if (!who->CanOpenDoors()) { + return; + } - for (auto it = door_list.begin();it != door_list.end(); ++it) { - Doors *cdoor = it->second; - if (!cdoor || cdoor->IsDoorOpen()) + for (auto &it : door_list) { + Doors *door = it.second; + if (!door || door->IsDoorOpen()) { continue; + } - auto diff = who->GetPosition() - cdoor->GetPosition(); - - float curdist = diff.x * diff.x + diff.y * diff.y; - - if (diff.z * diff.z < 10 && curdist <= 100) - cdoor->Open(who); + auto diff = who->GetPosition() - door->GetPosition(); + float distance = diff.x * diff.x + diff.y * diff.y; + if (diff.z * diff.z < 10 && distance <= 100) { + door->Open(who); + } } } @@ -3638,10 +3771,10 @@ void EntityList::ProcessMove(Client *c, const glm::vec3& location) for (auto iter = events.begin(); iter != events.end(); ++iter) { quest_proximity_event& evt = (*iter); if (evt.npc) { - std::vector args; + std::vector args; parse->EventNPC(evt.event_id, evt.npc, evt.client, "", 0, &args); } else { - std::vector args; + std::vector args; args.push_back(&evt.area_id); args.push_back(&evt.area_type); parse->EventPlayer(evt.event_id, evt.client, "", 0, &args); @@ -3697,7 +3830,7 @@ void EntityList::ProcessMove(NPC *n, float x, float y, float z) { for (auto iter = events.begin(); iter != events.end(); ++iter) { quest_proximity_event &evt = (*iter); - std::vector args; + std::vector args; args.push_back(&evt.area_id); args.push_back(&evt.area_type); parse->EventNPC(evt.event_id, evt.npc, evt.client, "", 0, &args); @@ -3776,22 +3909,24 @@ void EntityList::ProcessProximitySay(const char *Message, Client *c, uint8 langu void EntityList::SaveAllClientsTaskState() { - if (!taskmanager) + if (!task_manager) { return; + } auto it = client_list.begin(); while (it != client_list.end()) { Client *client = it->second; - if (client->IsTaskStateLoaded()) + if (client->IsTaskStateLoaded()) { client->SaveTaskState(); + } ++it; } } -void EntityList::ReloadAllClientsTaskState(int TaskID) +void EntityList::ReloadAllClientsTaskState(int task_id) { - if (!taskmanager) + if (!task_manager) return; auto it = client_list.begin(); @@ -3800,11 +3935,11 @@ void EntityList::ReloadAllClientsTaskState(int TaskID) if (client->IsTaskStateLoaded()) { // If we have been passed a TaskID, only reload the client state if they have // that Task active. - if ((!TaskID) || (TaskID && client->IsTaskActive(TaskID))) { + if ((!task_id) || (task_id && client->IsTaskActive(task_id))) { Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Reloading Task State For Client %s", client->GetName()); client->RemoveClientTaskState(); client->LoadClientTaskState(); - taskmanager->SendActiveTasksToClient(client); + task_manager->SendActiveTasksToClient(client); } } ++it; @@ -4011,8 +4146,13 @@ void EntityList::AddTempPetsToHateList(Mob *owner, Mob* other, bool bFrenzy) NPC* n = it->second; if (n->GetSwarmInfo()) { if (n->GetSwarmInfo()->owner_id == owner->GetID()) { - if (!n->GetSpecialAbility(IMMUNE_AGGRO)) + if ( + !n->GetSpecialAbility(IMMUNE_AGGRO) && + !(n->GetSpecialAbility(IMMUNE_AGGRO_CLIENT) && other->IsClient()) && + !(n->GetSpecialAbility(IMMUNE_AGGRO_NPC) && other->IsNPC()) + ) { n->hate_list.AddEntToHateList(other, 0, 0, bFrenzy); + } } } ++it; @@ -4190,11 +4330,11 @@ void EntityList::GroupMessage(uint32 gid, const char *from, const char *message) uint16 EntityList::CreateGroundObject(uint32 itemid, const glm::vec4& position, uint32 decay_time) { - const EQEmu::ItemData *is = database.GetItem(itemid); + const EQ::ItemData *is = database.GetItem(itemid); if (!is) return 0; - auto i = new EQEmu::ItemInstance(is, is->MaxCharges); + auto i = new EQ::ItemInstance(is, is->MaxCharges); if (!i) return 0; @@ -4776,7 +4916,7 @@ void EntityList::UpdateFindableNPCState(NPC *n, bool Remove) auto it = client_list.begin(); while (it != client_list.end()) { Client *c = it->second; - if (c && (c->ClientVersion() >= EQEmu::versions::ClientVersion::SoD)) + if (c && (c->ClientVersion() >= EQ::versions::ClientVersion::SoD)) c->QueuePacket(outapp); ++it; @@ -5096,6 +5236,8 @@ void EntityList::ReloadMerchants() { * If we have a distance requested that is greater than our scanning distance * then we return the full list * + * See comments @EntityList::ScanCloseMobs for system explanation + * * @param mob * @param distance * @return @@ -5109,3 +5251,56 @@ std::unordered_map &EntityList::GetCloseMobList(Mob *mob, float d return mob_list; } +void EntityList::GateAllClientsToSafeReturn() +{ + DynamicZone* dz = zone ? zone->GetDynamicZone() : nullptr; + + for (const auto& client_list_iter : client_list) + { + if (client_list_iter.second) + { + // falls back to gating clients to bind if dz invalid + client_list_iter.second->GoToDzSafeReturnOrBind(dz); + } + } +} + +int EntityList::MovePlayerCorpsesToGraveyard(bool force_move_from_instance) +{ + if (!zone) + { + return 0; + } + + int moved_count = 0; + + for (auto it = corpse_list.begin(); it != corpse_list.end();) + { + bool moved = false; + if (it->second && it->second->IsPlayerCorpse()) + { + if (zone->HasGraveyard()) + { + moved = it->second->MovePlayerCorpseToGraveyard(); + } + else if (force_move_from_instance && zone->GetInstanceID() != 0) + { + moved = it->second->MovePlayerCorpseToNonInstance(); + } + } + + if (moved) + { + safe_delete(it->second); + free_ids.push(it->first); + it = corpse_list.erase(it); + ++moved_count; + } + else + { + ++it; + } + } + + return moved_count; +} diff --git a/zone/entity.h b/zone/entity.h index 505f34963..b4855b42e 100644 --- a/zone/entity.h +++ b/zone/entity.h @@ -49,6 +49,7 @@ class Raid; class Spawn2; class Trap; +struct DynamicZoneSafeReturn; struct GuildBankItemUpdate_Struct; struct NewSpawn_Struct; struct QGlobal; @@ -166,6 +167,7 @@ public: return nullptr; } NPC *GetNPCByNPCTypeID(uint32 npc_id); + NPC *GetNPCBySpawnID(uint32 spawn_id); inline Merc *GetMercByID(uint16 id) { auto it = merc_list.find(id); @@ -393,14 +395,14 @@ public: void QueueClientsByTarget(Mob* sender, const EQApplicationPacket* app, bool iSendToSender = true, Mob* SkipThisMob = 0, bool ackreq = true, bool HoTT = true, uint32 ClientVersionBits = 0xFFFFFFFF, bool inspect_buffs = false); - void QueueClientsByXTarget(Mob* sender, const EQApplicationPacket* app, bool iSendToSender = true, EQEmu::versions::ClientVersionBitmask client_version_bits = EQEmu::versions::ClientVersionBitmask::maskAllClients); + void QueueClientsByXTarget(Mob* sender, const EQApplicationPacket* app, bool iSendToSender = true, EQ::versions::ClientVersionBitmask client_version_bits = EQ::versions::ClientVersionBitmask::maskAllClients); void QueueToGroupsForNPCHealthAA(Mob* sender, const EQApplicationPacket* app); void QueueManaged(Mob* sender, const EQApplicationPacket* app, bool ignore_sender=false, bool ackreq = true); void AEAttack( Mob *attacker, float distance, - int Hand = EQEmu::invslot::slotPrimary, + int Hand = EQ::invslot::slotPrimary, int count = 0, bool is_from_spell = false ); @@ -447,6 +449,7 @@ public: void Process(); void ClearAggro(Mob* targ); + void ClearWaterAggro(Mob* targ); void ClearFeignAggro(Mob* targ); void ClearZoneFeignAggro(Client* targ); void AggroZone(Mob* who, uint32 hate = 0); @@ -479,7 +482,7 @@ public: void SendGroupJoin(uint32 gid, const char *name); void SaveAllClientsTaskState(); - void ReloadAllClientsTaskState(int TaskID=0); + void ReloadAllClientsTaskState(int task_id=0); uint16 CreateGroundObject(uint32 itemid, const glm::vec4& position, uint32 decay_time = 300000); uint16 CreateGroundObjectFromModel(const char *model, const glm::vec4& position, uint8 type = 0x00, uint32 decay_time = 0); uint16 CreateDoor(const char *model, const glm::vec4& position, uint8 type = 0, uint16 size = 100); @@ -494,6 +497,8 @@ public: void UpdateFindableNPCState(NPC *n, bool Remove); void HideCorpses(Client *c, uint8 CurrentMode, uint8 NewMode); + void GateAllClientsToSafeReturn(); + uint16 GetClientCount(); void GetMobList(std::list &m_list); void GetNPCList(std::list &n_list); @@ -521,13 +526,19 @@ public: void RefreshAutoXTargets(Client *c); void RefreshClientXTargets(Client *c); void SendAlternateAdvancementStats(); - void ScanCloseMobs(std::unordered_map &close_mobs, Mob *scanning_mob); + void ScanCloseMobs( + std::unordered_map &close_mobs, + Mob *scanning_mob, + bool add_self_to_other_lists = false + ); void GetTrapInfo(Client* client); bool IsTrapGroupSpawned(uint32 trap_id, uint8 group); void UpdateAllTraps(bool respawn, bool repopnow = false); void ClearTrapPointers(); + int MovePlayerCorpsesToGraveyard(bool force_move_from_instance = false); + protected: friend class Zone; void Depop(bool StartSpawnTimer = false); @@ -580,7 +591,7 @@ private: bool Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, float iRange, uint32 iSpellTypes); // TODO: Evaluate this closesly in hopes to eliminate void ShowSpawnWindow(Client* client, int Distance, bool NamedOnly); // TODO: Implement ShowSpawnWindow in the bot class but it needs entity list stuff - + void ScanCloseClientMobs(std::unordered_map& close_mobs, Mob* scanning_mob); private: std::list bot_list; diff --git a/zone/exp.cpp b/zone/exp.cpp index ed510bbf9..9b4df5492 100644 --- a/zone/exp.cpp +++ b/zone/exp.cpp @@ -194,6 +194,10 @@ uint32 Client::CalcEXP(uint8 conlevel) { } } + if (RuleR(Character, FinalExpMultiplier) >= 0) { + in_add_exp *= RuleR(Character, FinalExpMultiplier); + } + return in_add_exp; } @@ -211,7 +215,15 @@ uint32 Client::GetExperienceForKill(Mob *against) if (against && against->IsNPC()) { uint32 level = (uint32)against->GetLevel(); - return EXP_FORMULA; + uint32 ret = EXP_FORMULA; + + auto mod = against->GetKillExpMod(); + if(mod >= 0) { + ret *= mod; + ret /= 100; + } + + return ret; } return 0; @@ -311,6 +323,14 @@ void Client::CalculateStandardAAExp(uint32 &add_aaxp, uint8 conlevel, bool resex } } + if (RuleR(Character, FinalExpMultiplier) >= 0) { + add_aaxp *= RuleR(Character, FinalExpMultiplier); + } + + if (RuleB(Character, EnableCharacterEXPMods)) { + add_aaxp *= GetAAEXPModifier(this->GetZoneID()); + } + add_aaxp = (uint32)(RuleR(Character, AAExpMultiplier) * add_aaxp * aatotalmod); } @@ -466,6 +486,14 @@ void Client::CalculateExp(uint32 in_add_exp, uint32 &add_exp, uint32 &add_aaxp, } } + if (RuleR(Character, FinalExpMultiplier) >= 0) { + add_exp *= RuleR(Character, FinalExpMultiplier); + } + + if (RuleB(Character, EnableCharacterEXPMods)) { + add_exp *= GetEXPModifier(this->GetZoneID()); + } + add_exp = GetEXP() + add_exp; } @@ -563,22 +591,22 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) { } if (isrezzexp) { - if (RuleI(Character, ShowExpValues) > 0) + if (RuleI(Character, ShowExpValues) > 0) Message(Chat::Experience, "You regain %s experience from resurrection. %s", exp_amount_message.c_str(), exp_percent_message.c_str()); else MessageString(Chat::Experience, REZ_REGAIN); } else { if (membercount > 1) { - if (RuleI(Character, ShowExpValues) > 0) + if (RuleI(Character, ShowExpValues) > 0) Message(Chat::Experience, "You have gained %s party experience! %s", exp_amount_message.c_str(), exp_percent_message.c_str()); else MessageString(Chat::Experience, GAIN_GROUPXP); } else if (IsRaidGrouped()) { - if (RuleI(Character, ShowExpValues) > 0) + if (RuleI(Character, ShowExpValues) > 0) Message(Chat::Experience, "You have gained %s raid experience! %s", exp_amount_message.c_str(), exp_percent_message.c_str()); else MessageString(Chat::Experience, GAIN_RAIDEXP); - } + } else { - if (RuleI(Character, ShowExpValues) > 0) + if (RuleI(Character, ShowExpValues) > 0) Message(Chat::Experience, "You have gained %s experience! %s", exp_amount_message.c_str(), exp_percent_message.c_str()); else MessageString(Chat::Experience, GAIN_XP); } @@ -652,12 +680,22 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) { m_pp.aapoints += last_unspentAA; //figure out how many points were actually gained - /*uint32 gained = m_pp.aapoints - last_unspentAA;*/ //unused + uint32 gained = (m_pp.aapoints - last_unspentAA); //Message(Chat::Yellow, "You have gained %d skill points!!", m_pp.aapoints - last_unspentAA); - char val1[20]={0}; - MessageString(Chat::Experience, GAIN_ABILITY_POINT, ConvertArray(m_pp.aapoints, val1),m_pp.aapoints == 1 ? "" : "(s)"); //You have gained an ability point! You now have %1 ability point%2. - + char val1[20] = { 0 }; + char val2[20] = { 0 }; + if (gained == 1 && m_pp.aapoints == 1) + MessageString(Chat::Experience, GAIN_SINGLE_AA_SINGLE_AA, ConvertArray(m_pp.aapoints, val1)); //You have gained an ability point! You now have %1 ability point. + else if (gained == 1 && m_pp.aapoints > 1) + MessageString(Chat::Experience, GAIN_SINGLE_AA_MULTI_AA, ConvertArray(m_pp.aapoints, val1)); //You have gained an ability point! You now have %1 ability points. + else + MessageString(Chat::Experience, GAIN_MULTI_AA_MULTI_AA, ConvertArray(gained, val1), ConvertArray(m_pp.aapoints, val2)); //You have gained %1 ability point(s)! You now have %2 ability point(s). + + if (RuleB(AA, SoundForAAEarned)) { + SendSound(); + } + /* QS: PlayerLogAARate */ if (RuleB(QueryServ, PlayerLogAARate)){ int add_points = (m_pp.aapoints - last_unspentAA); @@ -703,7 +741,8 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) { else Message(Chat::Yellow, "Welcome to level %i!", check_level); - if (check_level == RuleI(Character, DeathItemLossLevel)) + if (check_level == RuleI(Character, DeathItemLossLevel) && + m_ClientVersionBit & EQ::versions::maskUFAndEarlier) MessageString(Chat::Yellow, CORPSE_ITEM_LOST); if (check_level == RuleI(Character, DeathExpLossLevel)) @@ -798,7 +837,7 @@ void Client::SetLevel(uint8 set_level, bool command) /* QS: PlayerLogLevels */ if (RuleB(QueryServ, PlayerLogLevels)){ std::string event_desc = StringFormat("Leveled UP :: to Level:%i from Level:%i in zoneid:%i instid:%i", set_level, m_pp.level, this->GetZoneID(), this->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Levels, this->CharacterID(), event_desc); + QServ->PlayerLogEvent(Player_Log_Levels, this->CharacterID(), event_desc); } } else if (set_level < m_pp.level){ @@ -836,7 +875,7 @@ void Client::SetLevel(uint8 set_level, bool command) SetHP(CalcMaxHP()); // Why not, lets give them a free heal } - if (RuleI(World, PVPMinLevel) > 0 && level >= RuleI(World, PVPMinLevel) && m_pp.pvp == 0) SetPVP(true); + if (RuleI(World, PVPMinLevel) > 0 && level >= RuleI(World, PVPMinLevel) && m_pp.pvp == 0) SetPVP(true); DoTributeUpdate(); SendHPUpdate(); @@ -940,32 +979,34 @@ uint32 Client::GetEXPForLevel(uint16 check_level) return finalxp; } -void Client::AddLevelBasedExp(uint8 exp_percentage, uint8 max_level, bool ignore_mods) -{ +void Client::AddLevelBasedExp(uint8 exp_percentage, uint8 max_level, bool ignore_mods) +{ uint32 award; uint32 xp_for_level; - if (exp_percentage > 100) - { - exp_percentage = 100; - } + if (exp_percentage > 100) + { + exp_percentage = 100; + } if (!max_level || GetLevel() < max_level) - { - max_level = GetLevel(); - } + { + max_level = GetLevel(); + } xp_for_level = GetEXPForLevel(max_level + 1) - GetEXPForLevel(max_level); - award = xp_for_level * exp_percentage / 100; + award = xp_for_level * exp_percentage / 100; - if(RuleB(Zone, LevelBasedEXPMods) && !ignore_mods) - { - if(zone->level_exp_mod[GetLevel()].ExpMod) - { + if (RuleB(Zone, LevelBasedEXPMods) && !ignore_mods) { + if (zone->level_exp_mod[GetLevel()].ExpMod) { award *= zone->level_exp_mod[GetLevel()].ExpMod; } } + if (RuleR(Character, FinalExpMultiplier) >= 0) { + award *= RuleR(Character, FinalExpMultiplier); + } + uint32 newexp = GetEXP() + award; SetEXP(newexp, GetAAXP()); } @@ -1123,7 +1164,7 @@ uint32 Client::GetCharMaxLevelFromQGlobal() { while(iter != globalMap.end()) { if((*iter).name.compare("CharMaxLevel") == 0){ return atoi((*iter).value.c_str()); - } + } ++iter; ++gcount; } diff --git a/zone/expedition.cpp b/zone/expedition.cpp new file mode 100644 index 000000000..cb6fa4199 --- /dev/null +++ b/zone/expedition.cpp @@ -0,0 +1,2037 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition.h" +#include "expedition_database.h" +#include "expedition_request.h" +#include "client.h" +#include "string_ids.h" +#include "worldserver.h" +#include "zonedb.h" +#include "../common/eqemu_logsys.h" +#include "../common/expedition_lockout_timer.h" +#include "../common/repositories/expedition_lockouts_repository.h" +#include "../common/repositories/expedition_members_repository.h" +#include "../common/util/uuid.h" + +extern WorldServer worldserver; +extern Zone* zone; + +// message string 8271 (not in emu clients) +const char* const DZ_YOU_NOT_ASSIGNED = "You could not use this command because you are not currently assigned to a dynamic zone."; +// message string 9265 (not in emu clients) +const char* const EXPEDITION_OTHER_BELONGS = "{} attempted to create an expedition but {} already belongs to one."; +// lockout warnings were added to live in March 11 2020 patch +const char* const DZADD_INVITE_WARNING = "Warning! You will be given replay timers for the following events if you enter %s:"; +const char* const DZADD_INVITE_WARNING_TIMER = "%s - %sD:%sH:%sM"; +// various expeditions re-use these strings when locking +constexpr char LOCK_CLOSE[] = "Your expedition is nearing its close. You cannot bring any additional people into your expedition at this time."; +constexpr char LOCK_BEGIN[] = "The trial has begun. You cannot bring any additional people into your expedition at this time."; + +const int32_t Expedition::REPLAY_TIMER_ID = -1; +const int32_t Expedition::EVENT_TIMER_ID = 1; + +Expedition::Expedition( + uint32_t id, const std::string& uuid, DynamicZone&& dz, const std::string& expedition_name, + const DynamicZoneMember& leader +) : ExpeditionBase(id, uuid, expedition_name, leader) +{ + SetDynamicZone(std::move(dz)); +} + +void Expedition::SetDynamicZone(DynamicZone&& dz) +{ + dz.SetName(GetName()); + dz.SetLeaderName(GetLeaderName()); + + m_dynamiczone = std::move(dz); + m_dynamiczone.RegisterOnCompassChange([this]() { SendCompassUpdateToZoneMembers(); }); +} + +Expedition* Expedition::TryCreate( + Client* requester, DynamicZone& dynamiczone, ExpeditionRequest& request) +{ + if (!requester || !zone) + { + return nullptr; + } + + // request parses leader, members list, and lockouts while validating + if (!request.Validate(requester)) + { + LogExpeditionsModerate("[{}] request by [{}] denied", request.GetExpeditionName(), requester->GetName()); + return nullptr; + } + + dynamiczone.SetMinPlayers(request.GetMinPlayers()); + dynamiczone.SetMaxPlayers(request.GetMaxPlayers()); + + auto dynamic_zone_id = dynamiczone.Create(); + if (dynamic_zone_id == 0) + { + // live uses this message when trying to enter an instance that isn't ready + // we can use it as the client error message if instance creation fails + requester->MessageString(Chat::Red, DZ_PREVENT_ENTERING); + LogExpeditions("Failed to create a dynamic zone instance for expedition"); + return nullptr; + } + + std::string expedition_uuid = EQ::Util::UUID::Generate().ToString(); + + // unique expedition ids are created from database via auto-increment column + auto expedition_id = ExpeditionDatabase::InsertExpedition( + expedition_uuid, + dynamiczone.GetID(), + request.GetExpeditionName(), + request.GetLeaderID(), + request.GetMinPlayers(), + request.GetMaxPlayers() + ); + + if (expedition_id) + { + auto expedition = std::make_unique( + expedition_id, + expedition_uuid, + std::move(dynamiczone), + request.GetExpeditionName(), + DynamicZoneMember{ request.GetLeaderID(), request.GetLeaderName() } + ); + + LogExpeditions( + "Created [{}] [{}] instance id: [{}] leader: [{}] minplayers: [{}] maxplayers: [{}]", + expedition->GetID(), + expedition->GetName(), + expedition->GetDynamicZone().GetInstanceID(), + expedition->GetLeaderName(), + expedition->GetDynamicZone().GetMinPlayers(), + expedition->GetDynamicZone().GetMaxPlayers() + ); + + expedition->SaveMembers(request); + expedition->SaveLockouts(request); + + auto inserted = zone->expedition_cache.emplace(expedition_id, std::move(expedition)); + + inserted.first->second->SendUpdatesToZoneMembers(); + inserted.first->second->SendWorldExpeditionUpdate(ServerOP_ExpeditionCreate); // cache in other zones + inserted.first->second->SendLeaderMessage(request.GetLeaderClient(), + Chat::System, EXPEDITION_AVAILABLE, { request.GetExpeditionName() }); + + if (!request.GetNotAllAddedMessage().empty()) + { + Client::SendCrossZoneMessage(request.GetLeaderClient(), request.GetLeaderName(), + Chat::System, request.GetNotAllAddedMessage()); + } + + return inserted.first->second.get(); + } + + return nullptr; +} + +void Expedition::CacheExpeditions( + std::vector&& expedition_entries) +{ + if (!zone) + { + return; + } + + // bulk load expedition dzs, members, and internal lockouts before caching + std::vector expedition_ids; + std::vector dynamic_zone_ids; + for (const auto& entry : expedition_entries) + { + expedition_ids.emplace_back(entry.id); + dynamic_zone_ids.emplace_back(entry.dynamic_zone_id); + } + + auto dynamic_zones = DynamicZonesRepository::GetWithInstance(database, dynamic_zone_ids); + auto expedition_members = ExpeditionMembersRepository::GetWithNames(database, expedition_ids); + auto expedition_lockouts = ExpeditionLockoutsRepository::GetWithTimestamp(database, expedition_ids); + + for (auto& entry : expedition_entries) + { + auto expedition = std::make_unique(); + expedition->LoadRepositoryResult(std::move(entry)); + + auto dz_entry_iter = std::find_if(dynamic_zones.begin(), dynamic_zones.end(), + [&](const DynamicZonesRepository::DynamicZoneInstance& dz_entry) { + return dz_entry.id == entry.dynamic_zone_id; + }); + + if (dz_entry_iter != dynamic_zones.end()) + { + expedition->SetDynamicZone(std::move(*dz_entry_iter)); + } + + for (auto& member : expedition_members) + { + if (member.expedition_id == expedition->GetID()) + { + expedition->AddMemberFromRepositoryResult(std::move(member)); + } + } + + for (auto& lockout_entry : expedition_lockouts) + { + if (lockout_entry.expedition_id == expedition->GetID()) + { + ExpeditionLockoutTimer lockout{ + std::move(lockout_entry.from_expedition_uuid), + expedition->GetName(), + std::move(lockout_entry.event_name), + static_cast(lockout_entry.expire_time), + static_cast(lockout_entry.duration) + }; + + std::string event_name = lockout.GetEventName(); // copy for key since we're moving it + expedition->m_lockouts.emplace(std::move(event_name), std::move(lockout)); + } + } + + // stored on expedition in db but on dz in memory cache + expedition->GetDynamicZone().SetMinPlayers(entry.min_players); + expedition->GetDynamicZone().SetMaxPlayers(entry.max_players); + + expedition->SendWorldExpeditionUpdate(ServerOP_ExpeditionGetMemberStatuses); + + auto inserted = zone->expedition_cache.emplace(entry.id, std::move(expedition)); + inserted.first->second->SendUpdatesToZoneMembers(); + } +} + +void Expedition::CacheFromDatabase(uint32_t expedition_id) +{ + if (zone && expedition_id != 0) + { + BenchTimer benchmark; + + auto expedition = ExpeditionsRepository::GetWithLeaderName(database, expedition_id); + CacheExpeditions({ std::move(expedition) }); + + LogExpeditions("Caching new expedition [{}] took [{}s]", expedition_id, benchmark.elapsed()); + } +} + +bool Expedition::CacheAllFromDatabase() +{ + if (!zone) + { + return false; + } + + BenchTimer benchmark; + + auto expeditions = ExpeditionsRepository::GetAllWithLeaderName(database); + zone->expedition_cache.clear(); + zone->expedition_cache.reserve(expeditions.size()); + + CacheExpeditions(std::move(expeditions)); + + LogExpeditions("Caching [{}] expedition(s) took [{}s]", zone->expedition_cache.size(), benchmark.elapsed()); + + return true; +} + +void Expedition::SaveLockouts(ExpeditionRequest& request) +{ + m_lockouts = request.GetLockouts(); + ExpeditionDatabase::InsertLockouts(m_id, m_lockouts); +} + +void Expedition::SaveMembers(ExpeditionRequest& request) +{ + m_members = request.GetMembers(); + + std::vector member_ids; + for (const auto& member : m_members) + { + member_ids.emplace_back(member.id); + } + + ExpeditionDatabase::InsertMembers(m_id, m_members); + m_dynamiczone.SaveInstanceMembersToDatabase(member_ids); +} + +Expedition* Expedition::FindCachedExpeditionByCharacterID(uint32_t character_id) +{ + if (zone) + { + for (const auto& expedition : zone->expedition_cache) + { + if (expedition.second->HasMember(character_id)) + { + return expedition.second.get(); + } + } + } + return nullptr; +} + +Expedition* Expedition::FindCachedExpeditionByCharacterName(const std::string& char_name) +{ + if (zone) + { + for (const auto& expedition : zone->expedition_cache) + { + if (expedition.second->HasMember(char_name)) + { + return expedition.second.get(); + } + } + } + return nullptr; +} + +Expedition* Expedition::FindCachedExpeditionByDynamicZoneID(uint32_t dz_id) +{ + if (zone && dz_id != 0) + { + for (const auto& cached_expedition : zone->expedition_cache) + { + if (cached_expedition.second->GetDynamicZone().GetID() == dz_id) + { + return cached_expedition.second.get(); + } + } + } + return nullptr; +} + +Expedition* Expedition::FindCachedExpeditionByID(uint32_t expedition_id) +{ + if (zone && expedition_id) + { + auto expedition_cache_iter = zone->expedition_cache.find(expedition_id); + if (expedition_cache_iter != zone->expedition_cache.end()) + { + return expedition_cache_iter->second.get(); + } + } + return nullptr; +} + +Expedition* Expedition::FindCachedExpeditionByZoneInstance(uint32_t zone_id, uint32_t instance_id) +{ + if (zone && zone_id != 0 && instance_id != 0) + { + for (const auto& cached_expedition : zone->expedition_cache) + { + if (cached_expedition.second->GetDynamicZone().GetZoneID() == zone_id && + cached_expedition.second->GetDynamicZone().GetInstanceID() == instance_id) + { + return cached_expedition.second.get(); + } + } + } + return nullptr; +} + +bool Expedition::HasLockout(const std::string& event_name) +{ + return (m_lockouts.find(event_name) != m_lockouts.end()); +} + +bool Expedition::HasReplayLockout() +{ + return HasLockout(DZ_REPLAY_TIMER_NAME); +} + +void Expedition::SetReplayLockoutOnMemberJoin(bool add_on_join, bool update_db) +{ + m_add_replay_on_join = add_on_join; + + if (update_db) + { + ExpeditionDatabase::UpdateReplayLockoutOnJoin(m_id, add_on_join); + SendWorldSettingChanged(ServerOP_ExpeditionReplayOnJoin, m_add_replay_on_join); + } +} + +void Expedition::AddReplayLockout(uint32_t seconds) +{ + AddLockout(DZ_REPLAY_TIMER_NAME, seconds); +} + +void Expedition::AddLockout(const std::string& event_name, uint32_t seconds) +{ + auto lockout = ExpeditionLockoutTimer::CreateLockout(m_expedition_name, event_name, seconds, m_uuid); + AddLockout(lockout); +} + +void Expedition::AddLockout(const ExpeditionLockoutTimer& lockout, bool members_only) +{ + if (!members_only) + { + ExpeditionDatabase::InsertLockout(m_id, lockout); + } + ExpeditionDatabase::InsertMembersLockout(m_members, lockout); + + ProcessLockoutUpdate(lockout, false, members_only); + SendWorldLockoutUpdate(lockout, false, members_only); +} + +void Expedition::AddLockoutDuration(const std::string& event_name, int seconds, bool members_only) +{ + // lockout timers use unsigned durations to define intent but we may need + // to insert a new lockout while still supporting timer reductions + auto lockout = ExpeditionLockoutTimer::CreateLockout( + m_expedition_name, event_name, std::max(0, seconds), m_uuid); + + if (!members_only) + { + auto it = m_lockouts.find(event_name); + if (it != m_lockouts.end()) + { + it->second.AddLockoutTime(seconds); + ExpeditionDatabase::InsertLockout(m_id, it->second); // replaces current one + } + else + { + ExpeditionDatabase::InsertLockout(m_id, lockout); + } + } + + // processing lockout duration applies multiplier again in client methods, + // update database with modified value now but pass original on + int modified_seconds = static_cast(seconds * RuleR(Expedition, LockoutDurationMultiplier)); + ExpeditionDatabase::AddLockoutDuration(m_members, lockout, modified_seconds); + + ProcessLockoutDuration(lockout, seconds, members_only); + SendWorldLockoutDuration(lockout, seconds, members_only); +} + +void Expedition::AddReplayLockoutDuration(int seconds, bool members_only) +{ + AddLockoutDuration(DZ_REPLAY_TIMER_NAME, seconds, members_only); +} + +void Expedition::UpdateLockoutDuration( + const std::string& event_name, uint32_t seconds, bool members_only) +{ + // some live expeditions update existing lockout timers during progression + auto it = m_lockouts.find(event_name); + if (it != m_lockouts.end()) + { + seconds = static_cast(seconds * RuleR(Expedition, LockoutDurationMultiplier)); + + uint64_t expire_time = it->second.GetStartTime() + seconds; + AddLockout({ m_uuid, m_expedition_name, event_name, expire_time, seconds }, members_only); + } +} + +void Expedition::RemoveLockout(const std::string& event_name) +{ + ExpeditionDatabase::DeleteLockout(m_id, event_name); + ExpeditionDatabase::DeleteMembersLockout(m_members, m_expedition_name, event_name); + + ExpeditionLockoutTimer lockout{m_uuid, m_expedition_name, event_name, 0, 0}; + ProcessLockoutUpdate(lockout, true); + SendWorldLockoutUpdate(lockout, true); +} + +bool Expedition::AddMember(const std::string& add_char_name, uint32_t add_char_id) +{ + if (HasMember(add_char_id)) + { + return false; + } + + ExpeditionDatabase::InsertMember(m_id, add_char_id); + m_dynamiczone.AddCharacter(add_char_id); + + ProcessMemberAdded(add_char_name, add_char_id); + SendWorldMemberChanged(add_char_name, add_char_id, false); + + return true; +} + +void Expedition::RemoveAllMembers(bool enable_removal_timers) +{ + m_dynamiczone.RemoveAllCharacters(enable_removal_timers); + + ExpeditionDatabase::DeleteAllMembers(m_id); + + SendUpdatesToZoneMembers(true); + SendWorldExpeditionUpdate(ServerOP_ExpeditionMembersRemoved); + + m_members.clear(); +} + +bool Expedition::RemoveMember(const std::string& remove_char_name) +{ + auto member = GetMemberData(remove_char_name); + if (!member.IsValid()) + { + return false; + } + + ExpeditionDatabase::DeleteMember(m_id, member.id); + m_dynamiczone.RemoveCharacter(member.id); + + ProcessMemberRemoved(member.name, member.id); + SendWorldMemberChanged(member.name, member.id, true); + + return true; +} + +void Expedition::SwapMember(Client* add_client, const std::string& remove_char_name) +{ + if (!add_client || remove_char_name.empty()) + { + return; + } + + auto member = GetMemberData(remove_char_name); + if (!member.IsValid()) + { + return; + } + + // make remove and add atomic to avoid racing with separate world messages + ExpeditionDatabase::DeleteMember(m_id, member.id); + ExpeditionDatabase::InsertMember(m_id, add_client->CharacterID()); + m_dynamiczone.RemoveCharacter(member.id); + m_dynamiczone.AddCharacter(add_client->CharacterID()); + + ProcessMemberRemoved(member.name, member.id); + ProcessMemberAdded(add_client->GetName(), add_client->CharacterID()); + SendWorldMemberSwapped(member.name, member.id, add_client->GetName(), add_client->CharacterID()); +} + +void Expedition::SetMemberStatus(Client* client, DynamicZoneMemberStatus status) +{ + if (client) + { + SendMemberStatusToZoneMembers(client->CharacterID(), status); + SendWorldMemberStatus(client->CharacterID(), status); + } +} + +void Expedition::SendMemberStatusToZoneMembers(uint32_t update_member_id, DynamicZoneMemberStatus status) +{ + auto member_data = GetMemberData(update_member_id); + if (!member_data.IsValid()) + { + return; + } + + // if zone already had this member status cached avoid packet update to clients + bool changed = SetInternalMemberStatus(update_member_id, status); + if (changed) + { + member_data = GetMemberData(update_member_id); // rules may override status + auto outapp_member_status = CreateMemberListStatusPacket(member_data.name, member_data.status); + for (auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->QueuePacket(outapp_member_status.get()); + } + } + } +} + +void Expedition::SendClientExpeditionInvite( + Client* client, const std::string& inviter_name, const std::string& swap_remove_name) +{ + if (!client) + { + return; + } + + LogExpeditionsModerate( + "Sending expedition [{}] invite to player [{}] inviter [{}] swap name [{}]", + m_id, client->GetName(), inviter_name, swap_remove_name + ); + + client->SetPendingExpeditionInvite({ m_id, inviter_name, swap_remove_name }); + + client->MessageString(Chat::System, EXPEDITION_ASKED_TO_JOIN, + m_leader.name.c_str(), m_expedition_name.c_str()); + + // live (as of March 11 2020 patch) sends warnings for lockouts added + // during current expedition that client would receive on entering dz + bool warned = false; + for (const auto& lockout_iter : m_lockouts) + { + // live doesn't issue a warning for the dz's replay timer + const ExpeditionLockoutTimer& lockout = lockout_iter.second; + if (!lockout.IsReplayTimer() && !lockout.IsExpired() && lockout.IsFromExpedition(m_uuid) && + !client->HasExpeditionLockout(m_expedition_name, lockout.GetEventName())) + { + if (!warned) + { + client->Message(Chat::System, DZADD_INVITE_WARNING, m_expedition_name.c_str()); + warned = true; + } + + auto time_remaining = lockout.GetDaysHoursMinutesRemaining(); + client->Message( + Chat::System, DZADD_INVITE_WARNING_TIMER, + lockout.GetEventName().c_str(), + time_remaining.days.c_str(), + time_remaining.hours.c_str(), + time_remaining.mins.c_str() + ); + } + } + + auto outapp = CreateInvitePacket(inviter_name, swap_remove_name); + client->QueuePacket(outapp.get()); +} + +void Expedition::SendLeaderMessage( + Client* leader_client, uint16_t chat_type, uint32_t string_id, const std::initializer_list& args) +{ + Client::SendCrossZoneMessageString(leader_client, m_leader.name, chat_type, string_id, args); +} + +bool Expedition::ProcessAddConflicts(Client* leader_client, Client* add_client, bool swapping) +{ + if (!add_client) // a null leader_client is handled by SendLeaderMessage fallback + { + return true; + } + + bool has_conflict = false; + + if (m_dynamiczone.IsCurrentZoneDzInstance()) + { + SendLeaderMessage(leader_client, Chat::Red, DZADD_LEAVE_ZONE_FIRST, { add_client->GetName() }); + has_conflict = true; + } + + auto expedition_id = add_client->GetExpeditionID(); + if (expedition_id) + { + auto string_id = (expedition_id == GetID()) ? DZADD_ALREADY_PART : DZADD_ALREADY_ASSIGNED; + SendLeaderMessage(leader_client, Chat::Red, string_id, { add_client->GetName() }); + has_conflict = true; + } + + // check any extra event lockouts for this expedition that the client has and expedition doesn't + auto client_lockouts = add_client->GetExpeditionLockouts(m_expedition_name); + for (const auto& client_lockout : client_lockouts) + { + if (client_lockout.IsReplayTimer()) + { + // client with a replay lockout is allowed only if the replay timer was from this expedition + if (client_lockout.GetExpeditionUUID() != GetUUID()) + { + has_conflict = true; + + auto time_remaining = client_lockout.GetDaysHoursMinutesRemaining(); + SendLeaderMessage(leader_client, Chat::Red, DZADD_REPLAY_TIMER, { + add_client->GetName(), + time_remaining.days, + time_remaining.hours, + time_remaining.mins + }); + } + } + else + { + bool is_missing_lockout = (m_lockouts.find(client_lockout.GetEventName()) == m_lockouts.end()); + if (is_missing_lockout) + { + has_conflict = true; + + auto time_remaining = client_lockout.GetDaysHoursMinutesRemaining(); + SendLeaderMessage(leader_client, Chat::Red, DZADD_EVENT_TIMER, { + add_client->GetName(), + client_lockout.GetEventName(), + time_remaining.days, + time_remaining.hours, + time_remaining.mins, + client_lockout.GetEventName() + }); + } + } + } + + // member swapping integrity is handled by invite response + if (!swapping) + { + auto member_count = ExpeditionDatabase::GetMemberCount(m_id); + if (member_count == 0) + { + has_conflict = true; + } + else if (member_count >= GetDynamicZone().GetMaxPlayers()) + { + SendLeaderMessage(leader_client, Chat::Red, DZADD_EXCEED_MAX, { + fmt::format_int(GetDynamicZone().GetMaxPlayers()).str() }); + has_conflict = true; + } + } + + auto invite_id = add_client->GetPendingExpeditionInviteID(); + if (invite_id) + { + auto string_id = (invite_id == GetID()) ? DZADD_PENDING : DZADD_PENDING_OTHER; + SendLeaderMessage(leader_client, Chat::Red, string_id, { add_client->GetName() }); + has_conflict = true; + } + + return has_conflict; +} + +void Expedition::DzInviteResponse(Client* add_client, bool accepted, const std::string& swap_remove_name) +{ + if (!add_client) + { + return; + } + + LogExpeditionsModerate( + "Invite response by [{}] accepted [{}] swap_name [{}]", + add_client->GetName(), accepted, swap_remove_name + ); + + // a null leader_client is handled by SendLeaderMessage fallbacks + // note current leader receives invite reply messages (if leader changed) + Client* leader_client = entity_list.GetClientByCharID(m_leader.id); + + if (!accepted) + { + SendLeaderMessage(leader_client, Chat::Red, EXPEDITION_INVITE_DECLINED, { add_client->GetName() }); + return; + } + + bool was_swap_invite = !swap_remove_name.empty(); + bool has_conflicts = m_is_locked; + + if (m_is_locked) + { + SendLeaderMessage(leader_client, Chat::Red, DZADD_NOT_ALLOWING); + } + else + { + has_conflicts = ProcessAddConflicts(leader_client, add_client, was_swap_invite); + } + + // error if swapping and character was already removed before the accept + if (was_swap_invite) + { + auto swap_member = GetMemberData(swap_remove_name); + if (!swap_member.IsValid() || !ExpeditionDatabase::HasMember(m_id, swap_member.id)) + { + has_conflicts = true; + } + } + + if (has_conflicts) + { + SendLeaderMessage(leader_client, Chat::Red, EXPEDITION_INVITE_ERROR, { add_client->GetName() }); + } + else + { + SendLeaderMessage(leader_client, Chat::Yellow, EXPEDITION_INVITE_ACCEPTED, { add_client->GetName() }); + + // replay timers are optionally added to new members on join with fresh expire time + if (m_add_replay_on_join) + { + auto replay_lockout = m_lockouts.find(DZ_REPLAY_TIMER_NAME); + if (replay_lockout != m_lockouts.end() && + replay_lockout->second.IsFromExpedition(m_uuid) && + !add_client->HasExpeditionLockout(m_expedition_name, DZ_REPLAY_TIMER_NAME)) + { + ExpeditionLockoutTimer replay_timer = replay_lockout->second; // copy + replay_timer.Reset(); + add_client->AddExpeditionLockout(replay_timer, true); + } + } + + if (was_swap_invite) + { + SwapMember(add_client, swap_remove_name); + } + else + { + AddMember(add_client->GetName(), add_client->CharacterID()); + } + } +} + +bool Expedition::ConfirmLeaderCommand(Client* requester) +{ + if (!requester) + { + return false; + } + + if (!m_leader.IsValid()) + { + requester->MessageString(Chat::Red, UNABLE_RETRIEVE_LEADER); // unconfirmed message + return false; + } + + if (m_leader.id != requester->CharacterID()) + { + requester->MessageString(Chat::System, EXPEDITION_NOT_LEADER, m_leader.name.c_str()); + return false; + } + + return true; +} + +void Expedition::TryAddClient( + Client* add_client, const std::string& inviter_name, const std::string& swap_remove_name, + Client* leader_client) +{ + if (!add_client) + { + return; + } + + LogExpeditionsModerate( + "Add player request for expedition [{}] by inviter [{}] add name [{}] swap name [{}]", + m_id, inviter_name, add_client->GetName(), swap_remove_name + ); + + // null leader client handled by ProcessAddConflicts/SendLeaderMessage fallbacks + if (!leader_client) + { + leader_client = entity_list.GetClientByName(inviter_name.c_str()); + } + + bool has_conflicts = ProcessAddConflicts(leader_client, add_client, !swap_remove_name.empty()); + if (!has_conflicts) + { + // live uses the original unsanitized input string in invite messages + uint32_t string_id = swap_remove_name.empty() ? DZADD_INVITE : DZSWAP_INVITE; + SendLeaderMessage(leader_client, Chat::Yellow, string_id, { add_client->GetName() }); + SendClientExpeditionInvite(add_client, inviter_name.c_str(), swap_remove_name); + } + else if (swap_remove_name.empty()) // swap command doesn't result in this message + { + SendLeaderMessage(leader_client, Chat::Red, DZADD_INVITE_FAIL, { add_client->GetName() }); + } +} + +void Expedition::DzAddPlayer( + Client* requester, const std::string& add_char_name, const std::string& swap_remove_name) +{ + if (!requester || !ConfirmLeaderCommand(requester)) + { + return; + } + + bool invite_failed = false; + + if (m_is_locked) + { + requester->MessageString(Chat::Red, DZADD_NOT_ALLOWING); + invite_failed = true; + } + else if (add_char_name.empty()) + { + requester->MessageString(Chat::Red, DZADD_NOT_ONLINE, add_char_name.c_str()); + invite_failed = true; + } + else + { + auto member_data = GetMemberData(add_char_name); + if (member_data.IsValid()) + { + // live prioritizes offline message before already a member message + if (member_data.status == DynamicZoneMemberStatus::Offline) + { + requester->MessageString(Chat::Red, DZADD_NOT_ONLINE, add_char_name.c_str()); + } + else + { + requester->MessageString(Chat::Red, DZADD_ALREADY_PART, add_char_name.c_str()); + } + invite_failed = true; + } + } + + if (invite_failed) + { + requester->MessageString(Chat::Red, DZADD_INVITE_FAIL, FormatName(add_char_name).c_str()); + return; + } + + Client* add_client = entity_list.GetClientByName(add_char_name.c_str()); + if (add_client) + { + // client is online in this zone + TryAddClient(add_client, requester->GetName(), swap_remove_name, requester); + } + else + { + // forward to world to check if client is online and perform cross-zone invite + SendWorldAddPlayerInvite(requester->GetName(), swap_remove_name, FormatName(add_char_name)); + } +} + +void Expedition::DzAddPlayerContinue( + std::string inviter_name, std::string add_name, std::string swap_remove_name) +{ + // continuing expedition invite from leader in another zone + Client* add_client = entity_list.GetClientByName(add_name.c_str()); + if (add_client) + { + TryAddClient(add_client, inviter_name, swap_remove_name); + } +} + +void Expedition::DzMakeLeader(Client* requester, std::string new_leader_name) +{ + if (!requester || !ConfirmLeaderCommand(requester)) + { + return; + } + + if (new_leader_name.empty()) + { + requester->MessageString(Chat::Red, DZMAKELEADER_NOT_ONLINE, new_leader_name.c_str()); + return; + } + + // leader can only be changed by world + SendWorldMakeLeaderRequest(requester->CharacterID(), FormatName(new_leader_name)); +} + +void Expedition::DzRemovePlayer(Client* requester, std::string char_name) +{ + if (!requester || !ConfirmLeaderCommand(requester)) + { + return; + } + + // live only seems to enforce min_players for requesting expeditions, no need to check here + bool removed = RemoveMember(char_name); + if (!removed) + { + requester->MessageString(Chat::Red, EXPEDITION_NOT_MEMBER, FormatName(char_name).c_str()); + } + else + { + requester->MessageString(Chat::Yellow, EXPEDITION_REMOVED, FormatName(char_name).c_str(), m_expedition_name.c_str()); + } +} + +void Expedition::DzQuit(Client* requester) +{ + if (requester) + { + RemoveMember(requester->GetName()); + } +} + +void Expedition::DzSwapPlayer( + Client* requester, std::string remove_char_name, std::string add_char_name) +{ + if (!requester || !ConfirmLeaderCommand(requester)) + { + return; + } + + if (remove_char_name.empty() || !HasMember(remove_char_name)) + { + requester->MessageString(Chat::Red, DZSWAP_CANNOT_REMOVE, FormatName(remove_char_name).c_str()); + return; + } + + DzAddPlayer(requester, add_char_name, remove_char_name); +} + +void Expedition::DzPlayerList(Client* requester) +{ + if (requester) + { + requester->MessageString(Chat::Yellow, EXPEDITION_LEADER, m_leader.name.c_str()); + + std::string member_names; + for (const auto& member : m_members) + { + fmt::format_to(std::back_inserter(member_names), "{}, ", member.name); + } + + if (member_names.size() > 1) + { + member_names.erase(member_names.length() - 2); // trailing comma and space + } + + requester->MessageString(Chat::Yellow, EXPEDITION_MEMBERS, member_names.c_str()); + } +} + +void Expedition::DzKickPlayers(Client* requester) +{ + if (!requester || !ConfirmLeaderCommand(requester)) + { + return; + } + + RemoveAllMembers(); + requester->MessageString(Chat::Red, EXPEDITION_REMOVED, "Everyone", m_expedition_name.c_str()); +} + +void Expedition::SetLocked( + bool lock_expedition, ExpeditionLockMessage lock_msg, bool update_db, uint32_t msg_color) +{ + m_is_locked = lock_expedition; + + if (m_is_locked && lock_msg != ExpeditionLockMessage::None && m_dynamiczone.IsCurrentZoneDzInstance()) + { + auto msg = (lock_msg == ExpeditionLockMessage::Close) ? LOCK_CLOSE : LOCK_BEGIN; + for (const auto& client_iter : entity_list.GetClientList()) + { + if (client_iter.second) + { + client_iter.second->Message(msg_color, msg); + } + } + } + + if (update_db) + { + ExpeditionDatabase::UpdateLockState(m_id, lock_expedition); + SendWorldSettingChanged(ServerOP_ExpeditionLockState, m_is_locked); + } +} + +void Expedition::ProcessLeaderChanged(uint32_t new_leader_id) +{ + auto new_leader = GetMemberData(new_leader_id); + if (!new_leader.IsValid()) + { + LogExpeditions("Processed invalid new leader id [{}] for expedition [{}]", new_leader_id, m_id); + return; + } + + LogExpeditionsModerate("Replaced [{}] leader [{}] with [{}]", m_id, m_leader.name, new_leader.name); + + m_leader = new_leader; + m_dynamiczone.SetLeaderName(m_leader.name); + + // update each client's expedition window in this zone + auto outapp_leader = CreateLeaderNamePacket(); + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->QueuePacket(outapp_leader.get()); + + if (member.id == new_leader_id && RuleB(Expedition, AlwaysNotifyNewLeaderOnChange)) + { + member_client->MessageString(Chat::Yellow, DZMAKELEADER_YOU); + } + } + } +} + +void Expedition::ProcessMakeLeader(Client* old_leader_client, Client* new_leader_client, + const std::string& new_leader_name, bool is_success, bool is_online) +{ + if (old_leader_client) + { + // success flag is set by world to indicate new leader set to an online member + if (is_success) + { + old_leader_client->MessageString(Chat::Yellow, DZMAKELEADER_NAME, new_leader_name.c_str()); + } + else if (!is_online) + { + old_leader_client->MessageString(Chat::Red, DZMAKELEADER_NOT_ONLINE, new_leader_name.c_str()); + } + else + { + old_leader_client->MessageString(Chat::Red, EXPEDITION_NOT_MEMBER, new_leader_name.c_str()); + } + } + + if (is_success && new_leader_client && !RuleB(Expedition, AlwaysNotifyNewLeaderOnChange)) + { + new_leader_client->MessageString(Chat::Yellow, DZMAKELEADER_YOU); + } +} + +void Expedition::ProcessMemberAdded(const std::string& char_name, uint32_t added_char_id) +{ + AddInternalMember({ added_char_id, char_name, DynamicZoneMemberStatus::Online }); + + // adds the member to this expedition and notifies both leader and new member + Client* leader_client = entity_list.GetClientByCharID(m_leader.id); + if (leader_client) + { + leader_client->MessageString(Chat::Yellow, EXPEDITION_MEMBER_ADDED, char_name.c_str(), m_expedition_name.c_str()); + } + + Client* member_client = entity_list.GetClientByCharID(added_char_id); + if (member_client) + { + member_client->SetExpeditionID(GetID()); + member_client->SendDzCompassUpdate(); + member_client->QueuePacket(CreateInfoPacket().get()); + member_client->MessageString(Chat::Yellow, EXPEDITION_MEMBER_ADDED, char_name.c_str(), m_expedition_name.c_str()); + } + + SendMemberListToZoneMembers(); +} + +void Expedition::ProcessMemberRemoved(const std::string& removed_char_name, uint32_t removed_char_id) +{ + if (m_members.empty()) + { + return; + } + + auto outapp_member_name = CreateMemberListNamePacket(removed_char_name, true); + + for (auto it = m_members.begin(); it != m_members.end();) + { + bool is_removed = (it->name == removed_char_name); + + Client* member_client = entity_list.GetClientByCharID(it->id); + if (member_client) + { + // all members receive the removed player name packet + member_client->QueuePacket(outapp_member_name.get()); + + if (is_removed) + { + // live doesn't clear expedition info on clients removed while inside dz. + // it instead let's the dz kick timer do it even if character zones out + // before it triggers. for simplicity we'll always clear immediately + member_client->SetExpeditionID(0); + member_client->SendDzCompassUpdate(); + member_client->QueuePacket(CreateInfoPacket(true).get()); + member_client->MessageString(Chat::Yellow, EXPEDITION_REMOVED, + it->name.c_str(), m_expedition_name.c_str()); + } + } + + it = is_removed ? m_members.erase(it) : it + 1; + } + + LogExpeditionsDetail( + "Processed member [{}] ({}) removal from [{}], cache member count: [{}]", + removed_char_name, removed_char_id, m_id, m_members.size() + ); +} + +void Expedition::ProcessLockoutDuration( + const ExpeditionLockoutTimer& lockout, int seconds, bool members_only) +{ + if (!members_only) + { + auto it = m_lockouts.find(lockout.GetEventName()); + if (it != m_lockouts.end()) + { + it->second.AddLockoutTime(seconds); + } + else + { + m_lockouts[lockout.GetEventName()] = lockout; + } + } + + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->AddExpeditionLockoutDuration(m_expedition_name, + lockout.GetEventName(), seconds, m_uuid); + } + } + + if (m_dynamiczone.IsCurrentZoneDzInstance()) + { + AddLockoutDurationClients(lockout, seconds, GetID()); + } +} + +void Expedition::AddLockoutDurationClients( + const ExpeditionLockoutTimer& lockout, int seconds, uint32_t exclude_id) +{ + std::vector lockout_clients; + for (const auto& client_iter : entity_list.GetClientList()) + { + Client* client = client_iter.second; + if (client && (exclude_id == 0 || client->GetExpeditionID() != exclude_id)) + { + lockout_clients.emplace_back(client->CharacterID(), client->GetName()); + client->AddExpeditionLockoutDuration(m_expedition_name, + lockout.GetEventName(), seconds, m_uuid); + } + } + + if (!lockout_clients.empty()) + { + int modified_seconds = static_cast(seconds * RuleR(Expedition, LockoutDurationMultiplier)); + ExpeditionDatabase::AddLockoutDuration(lockout_clients, lockout, modified_seconds); + } +} + +void Expedition::ProcessLockoutUpdate( + const ExpeditionLockoutTimer& lockout, bool remove, bool members_only) +{ + if (!members_only) + { + if (!remove) + { + m_lockouts[lockout.GetEventName()] = lockout; + } + else + { + m_lockouts.erase(lockout.GetEventName()); + } + } + + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + if (!remove) + { + member_client->AddExpeditionLockout(lockout); + } + else + { + member_client->RemoveExpeditionLockout(m_expedition_name, lockout.GetEventName()); + } + } + } + + // if this is the expedition's dz instance, all clients inside the zone need + // to receive added lockouts. this is done on live to avoid exploits where + // members leave the expedition but haven't been kicked from zone yet + if (!remove && m_dynamiczone.IsCurrentZoneDzInstance()) + { + AddLockoutClients(lockout, GetID()); + } +} + +void Expedition::AddLockoutClients( + const ExpeditionLockoutTimer& lockout, uint32_t exclude_expedition_id) +{ + std::vector lockout_clients; + for (const auto& client_iter : entity_list.GetClientList()) + { + Client* client = client_iter.second; + if (client && (exclude_expedition_id == 0 || client->GetExpeditionID() != exclude_expedition_id)) + { + lockout_clients.emplace_back(client->CharacterID(), client->GetName()); + client->AddExpeditionLockout(lockout); + } + } + + if (!lockout_clients.empty()) + { + ExpeditionDatabase::InsertMembersLockout(lockout_clients, lockout); + } +} + +void Expedition::SendMemberListToZoneMembers() +{ + auto outapp_members = CreateMemberListPacket(false); + + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->QueuePacket(outapp_members.get()); + } + } +} + +void Expedition::SendUpdatesToZoneMembers(bool clear, bool message_on_clear) +{ + if (!m_members.empty()) + { + auto outapp_info = CreateInfoPacket(clear); + auto outapp_members = CreateMemberListPacket(clear); + + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->SetExpeditionID(clear ? 0 : GetID()); + member_client->SendDzCompassUpdate(); + member_client->QueuePacket(outapp_info.get()); + member_client->QueuePacket(outapp_members.get()); + member_client->SendExpeditionLockoutTimers(); + if (clear && message_on_clear) + { + member_client->MessageString(Chat::Yellow, EXPEDITION_REMOVED, + member_client->GetName(), m_expedition_name.c_str()); + } + } + } + } +} + +void Expedition::SendClientExpeditionInfo(Client* client) +{ + if (client) + { + client->QueuePacket(CreateInfoPacket().get()); + client->QueuePacket(CreateMemberListPacket().get()); + } +} + +void Expedition::SendWorldPendingInvite(const ExpeditionInvite& invite, const std::string& add_name) +{ + LogExpeditions( + "Character [{}] saving pending invite from [{}] to expedition [{}] in world", + add_name, invite.inviter_name, invite.expedition_id + ); + + SendWorldAddPlayerInvite(invite.inviter_name, invite.swap_remove_name, add_name, true); +} + +std::unique_ptr Expedition::CreateExpireWarningPacket(uint32_t minutes_remaining) +{ + uint32_t outsize = sizeof(ExpeditionExpireWarning); + auto outapp = std::make_unique(OP_DzExpeditionEndsWarning, outsize); + auto buf = reinterpret_cast(outapp->pBuffer); + buf->minutes_remaining = minutes_remaining; + return outapp; +} + +std::unique_ptr Expedition::CreateInfoPacket(bool clear) +{ + uint32_t outsize = sizeof(DynamicZoneInfo_Struct); + auto outapp = std::make_unique(OP_DzExpeditionInfo, outsize); + auto info = reinterpret_cast(outapp->pBuffer); + if (!clear) + { + info->assigned = true; + strn0cpy(info->dz_name, m_expedition_name.c_str(), sizeof(info->dz_name)); + strn0cpy(info->leader_name, m_leader.name.c_str(), sizeof(info->leader_name)); + info->max_players = GetDynamicZone().GetMaxPlayers(); + } + return outapp; +} + +std::unique_ptr Expedition::CreateInvitePacket( + const std::string& inviter_name, const std::string& swap_remove_name) +{ + uint32_t outsize = sizeof(ExpeditionInvite_Struct); + auto outapp = std::make_unique(OP_DzExpeditionInvite, outsize); + auto outbuf = reinterpret_cast(outapp->pBuffer); + strn0cpy(outbuf->inviter_name, inviter_name.c_str(), sizeof(outbuf->inviter_name)); + strn0cpy(outbuf->expedition_name, m_expedition_name.c_str(), sizeof(outbuf->expedition_name)); + strn0cpy(outbuf->swap_name, swap_remove_name.c_str(), sizeof(outbuf->swap_name)); + outbuf->swapping = !swap_remove_name.empty(); + outbuf->dz_zone_id = m_dynamiczone.GetZoneID(); + outbuf->dz_instance_id = m_dynamiczone.GetInstanceID(); + return outapp; +} + +std::unique_ptr Expedition::CreateMemberListPacket(bool clear) +{ + uint32_t member_count = clear ? 0 : static_cast(m_members.size()); + uint32_t member_entries_size = sizeof(DynamicZoneMemberEntry_Struct) * member_count; + uint32_t outsize = sizeof(DynamicZoneMemberList_Struct) + member_entries_size; + auto outapp = std::make_unique(OP_DzMemberList, outsize); + auto buf = reinterpret_cast(outapp->pBuffer); + + buf->member_count = member_count; + + if (!clear) + { + for (auto i = 0; i < m_members.size(); ++i) + { + strn0cpy(buf->members[i].name, m_members[i].name.c_str(), sizeof(buf->members[i].name)); + buf->members[i].online_status = static_cast(m_members[i].status); + } + } + + return outapp; +} + +std::unique_ptr Expedition::CreateMemberListNamePacket( + const std::string& name, bool remove_name) +{ + uint32_t outsize = sizeof(DynamicZoneMemberListName_Struct); + auto outapp = std::make_unique(OP_DzMemberListName, outsize); + auto buf = reinterpret_cast(outapp->pBuffer); + buf->add_name = !remove_name; + strn0cpy(buf->name, name.c_str(), sizeof(buf->name)); + return outapp; +} + +std::unique_ptr Expedition::CreateMemberListStatusPacket( + const std::string& name, DynamicZoneMemberStatus status) +{ + // member list status uses member list struct with a single entry + uint32_t outsize = sizeof(DynamicZoneMemberList_Struct) + sizeof(DynamicZoneMemberEntry_Struct); + auto outapp = std::make_unique(OP_DzMemberListStatus, outsize); + auto buf = reinterpret_cast(outapp->pBuffer); + buf->member_count = 1; + + auto entry = static_cast(buf->members); + strn0cpy(entry->name, name.c_str(), sizeof(entry->name)); + entry->online_status = static_cast(status); + + return outapp; +} + +std::unique_ptr Expedition::CreateLeaderNamePacket() +{ + uint32_t outsize = sizeof(DynamicZoneLeaderName_Struct); + auto outapp = std::make_unique(OP_DzSetLeaderName, outsize); + auto buf = reinterpret_cast(outapp->pBuffer); + strn0cpy(buf->leader_name, m_leader.name.c_str(), sizeof(buf->leader_name)); + return outapp; +} + +void Expedition::SendWorldExpeditionUpdate(uint16_t server_opcode) +{ + uint32_t pack_size = sizeof(ServerExpeditionID_Struct); + auto pack = std::make_unique(server_opcode, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldAddPlayerInvite( + const std::string& inviter_name, const std::string& swap_remove_name, const std::string& add_name, bool pending) +{ + auto server_opcode = pending ? ServerOP_ExpeditionSaveInvite : ServerOP_ExpeditionDzAddPlayer; + uint32_t pack_size = sizeof(ServerDzCommand_Struct); + auto pack = std::make_unique(server_opcode, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->is_char_online = false; + strn0cpy(buf->requester_name, inviter_name.c_str(), sizeof(buf->requester_name)); + strn0cpy(buf->target_name, add_name.c_str(), sizeof(buf->target_name)); + strn0cpy(buf->remove_name, swap_remove_name.c_str(), sizeof(buf->remove_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldLockoutDuration( + const ExpeditionLockoutTimer& lockout, int seconds, bool members_only) +{ + uint32_t pack_size = sizeof(ServerExpeditionLockout_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionLockoutDuration, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->expire_time = lockout.GetExpireTime(); + buf->duration = lockout.GetDuration(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + buf->members_only = members_only; + buf->seconds_adjust = seconds; + strn0cpy(buf->event_name, lockout.GetEventName().c_str(), sizeof(buf->event_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldLockoutUpdate( + const ExpeditionLockoutTimer& lockout, bool remove, bool members_only) +{ + uint32_t pack_size = sizeof(ServerExpeditionLockout_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionLockout, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->expire_time = lockout.GetExpireTime(); + buf->duration = lockout.GetDuration(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + buf->remove = remove; + buf->members_only = members_only; + strn0cpy(buf->event_name, lockout.GetEventName().c_str(), sizeof(buf->event_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldMakeLeaderRequest(uint32_t requester_id, const std::string& new_leader_name) +{ + uint32_t pack_size = sizeof(ServerDzCommandMakeLeader_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionDzMakeLeader, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->requester_id = requester_id; + strn0cpy(buf->new_leader_name, new_leader_name.c_str(), sizeof(buf->new_leader_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldMemberChanged(const std::string& char_name, uint32_t char_id, bool remove) +{ + // notify other zones of added or removed member + uint32_t pack_size = sizeof(ServerExpeditionMemberChange_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionMemberChange, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + buf->removed = remove; + buf->char_id = char_id; + strn0cpy(buf->char_name, char_name.c_str(), sizeof(buf->char_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status) +{ + uint32_t pack_size = sizeof(ServerExpeditionMemberStatus_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionMemberStatus, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + buf->status = static_cast(status); + buf->character_id = character_id; + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldMemberSwapped( + const std::string& remove_char_name, uint32_t remove_char_id, const std::string& add_char_name, uint32_t add_char_id) +{ + uint32_t pack_size = sizeof(ServerExpeditionMemberSwap_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionMemberSwap, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + buf->add_char_id = add_char_id; + buf->remove_char_id = remove_char_id; + strn0cpy(buf->add_char_name, add_char_name.c_str(), sizeof(buf->add_char_name)); + strn0cpy(buf->remove_char_name, remove_char_name.c_str(), sizeof(buf->remove_char_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldSettingChanged(uint16_t server_opcode, bool setting_value) +{ + uint32_t pack_size = sizeof(ServerExpeditionSetting_Struct); + auto pack = std::make_unique(server_opcode, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->expedition_id = GetID(); + buf->sender_zone_id = zone ? zone->GetZoneID() : 0; + buf->sender_instance_id = zone ? zone->GetInstanceID() : 0; + buf->enabled = setting_value; + worldserver.SendPacket(pack.get()); +} + +void Expedition::SendWorldCharacterLockout( + uint32_t character_id, const ExpeditionLockoutTimer& lockout, bool remove) +{ + uint32_t pack_size = sizeof(ServerExpeditionCharacterLockout_Struct); + auto pack = std::make_unique(ServerOP_ExpeditionCharacterLockout, pack_size); + auto buf = reinterpret_cast(pack->pBuffer); + buf->remove = remove; + buf->character_id = character_id; + buf->expire_time = lockout.GetExpireTime(); + buf->duration = lockout.GetDuration(); + strn0cpy(buf->uuid, lockout.GetExpeditionUUID().c_str(), sizeof(buf->uuid)); + strn0cpy(buf->expedition_name, lockout.GetExpeditionName().c_str(), sizeof(buf->expedition_name)); + strn0cpy(buf->event_name, lockout.GetEventName().c_str(), sizeof(buf->event_name)); + worldserver.SendPacket(pack.get()); +} + +void Expedition::AddLockoutByCharacterID( + uint32_t character_id, const std::string& expedition_name, const std::string& event_name, + uint32_t seconds, const std::string& uuid) +{ + if (character_id) + { + auto lockout = ExpeditionLockoutTimer::CreateLockout(expedition_name, event_name, seconds, uuid); + ExpeditionDatabase::InsertCharacterLockouts(character_id, { lockout }); + SendWorldCharacterLockout(character_id, lockout, false); + } +} + +void Expedition::AddLockoutByCharacterName( + const std::string& character_name, const std::string& expedition_name, const std::string& event_name, + uint32_t seconds, const std::string& uuid) +{ + if (!character_name.empty()) + { + uint32_t character_id = database.GetCharacterID(character_name.c_str()); + AddLockoutByCharacterID(character_id, expedition_name, event_name, seconds, uuid); + } +} + +bool Expedition::HasLockoutByCharacterID( + uint32_t character_id, const std::string& expedition_name, const std::string& event_name) +{ + auto lockouts = Expedition::GetExpeditionLockoutsByCharacterID(character_id); + return std::any_of(lockouts.begin(), lockouts.end(), [&](const ExpeditionLockoutTimer& lockout) { + return lockout.IsSameLockout(expedition_name, event_name); + }); +} + +bool Expedition::HasLockoutByCharacterName( + const std::string& character_name, const std::string& expedition_name, const std::string& event_name) +{ + if (!character_name.empty()) + { + uint32_t character_id = database.GetCharacterID(character_name.c_str()); + return HasLockoutByCharacterID(character_id, expedition_name, event_name); + } + return false; +} + +void Expedition::RemoveLockoutsByCharacterID( + uint32_t character_id, const std::string& expedition_name, const std::string& event_name) +{ + if (character_id) + { + if (!event_name.empty()) + { + ExpeditionDatabase::DeleteCharacterLockout(character_id, expedition_name, event_name); + } + else if (!expedition_name.empty()) + { + ExpeditionDatabase::DeleteAllCharacterLockouts(character_id, expedition_name); + } + else + { + ExpeditionDatabase::DeleteAllCharacterLockouts(character_id); + } + + ExpeditionLockoutTimer lockout{{}, expedition_name, event_name, 0, 0}; + SendWorldCharacterLockout(character_id, lockout, true); + } +} + +void Expedition::RemoveLockoutsByCharacterName( + const std::string& character_name, const std::string& expedition_name, const std::string& event_name) +{ + if (!character_name.empty()) + { + uint32_t character_id = database.GetCharacterID(character_name.c_str()); + RemoveLockoutsByCharacterID(character_id, expedition_name, event_name); + } +} + +void Expedition::HandleWorldMessage(ServerPacket* pack) +{ + switch (pack->opcode) + { + case ServerOP_ExpeditionCreate: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + Expedition::CacheFromDatabase(buf->expedition_id); + } + break; + } + case ServerOP_ExpeditionDeleted: + { + // sent by world when it deletes expired or empty expeditions + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (zone && expedition) + { + expedition->SendUpdatesToZoneMembers(true, false); // any members silently removed + + LogExpeditionsModerate("Deleting expedition [{}] from zone cache", buf->expedition_id); + zone->expedition_cache.erase(buf->expedition_id); + } + break; + } + case ServerOP_ExpeditionMembersRemoved: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->SendUpdatesToZoneMembers(true); + expedition->m_members.clear(); + } + } + break; + } + case ServerOP_ExpeditionLeaderChanged: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->ProcessLeaderChanged(buf->leader_id); + } + break; + } + case ServerOP_ExpeditionLockout: + case ServerOP_ExpeditionLockoutDuration: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + ExpeditionLockoutTimer lockout{ expedition->GetUUID(), expedition->GetName(), + buf->event_name, buf->expire_time, buf->duration }; + + if (pack->opcode == ServerOP_ExpeditionLockout) + { + expedition->ProcessLockoutUpdate(lockout, buf->remove, buf->members_only); + } + else if (pack->opcode == ServerOP_ExpeditionLockoutDuration) + { + expedition->ProcessLockoutDuration(lockout, buf->seconds_adjust, buf->members_only); + } + } + } + break; + } + case ServerOP_ExpeditionMemberChange: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + if (buf->removed) + { + expedition->ProcessMemberRemoved(buf->char_name, buf->char_id); + } + else + { + expedition->ProcessMemberAdded(buf->char_name, buf->char_id); + } + } + } + break; + } + case ServerOP_ExpeditionMemberSwap: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->ProcessMemberRemoved(buf->remove_char_name, buf->remove_char_id); + expedition->ProcessMemberAdded(buf->add_char_name, buf->add_char_id); + } + } + break; + } + case ServerOP_ExpeditionMemberStatus: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + auto status = static_cast(buf->status); + expedition->SendMemberStatusToZoneMembers(buf->character_id, status); + } + } + break; + } + case ServerOP_ExpeditionLockState: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->SetLocked(buf->enabled, static_cast(buf->lock_msg)); + } + } + break; + } + case ServerOP_ExpeditionReplayOnJoin: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (zone && !zone->IsZone(buf->sender_zone_id, buf->sender_instance_id)) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->SetReplayLockoutOnMemberJoin(buf->enabled); + } + } + break; + } + case ServerOP_ExpeditionGetMemberStatuses: + { + // reply from world for online member statuses request + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + for (uint32_t i = 0; i < buf->count; ++i) + { + auto status = static_cast(buf->entries[i].online_status); + expedition->SetInternalMemberStatus(buf->entries[i].character_id, status); + } + expedition->SendMemberListToZoneMembers(); + } + break; + } + case ServerOP_ExpeditionDzAddPlayer: + { + auto buf = reinterpret_cast(pack->pBuffer); + if (buf->is_char_online) + { + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->DzAddPlayerContinue(buf->requester_name, buf->target_name, buf->remove_name); + } + } + else + { + Client* leader = entity_list.GetClientByName(buf->requester_name); + if (leader) + { + std::string target_name = FormatName(buf->target_name); + leader->MessageString(Chat::Red, DZADD_NOT_ONLINE, target_name.c_str()); + leader->MessageString(Chat::Red, DZADD_INVITE_FAIL, target_name.c_str()); + } + } + break; + } + case ServerOP_ExpeditionDzMakeLeader: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + auto old_leader_client = entity_list.GetClientByCharID(buf->requester_id); + auto new_leader_client = entity_list.GetClientByName(buf->new_leader_name); + expedition->ProcessMakeLeader(old_leader_client, new_leader_client, + buf->new_leader_name, buf->is_success, buf->is_online); + } + break; + } + case ServerOP_ExpeditionCharacterLockout: + { + auto buf = reinterpret_cast(pack->pBuffer); + Client* client = entity_list.GetClientByCharID(buf->character_id); + if (client) + { + if (!buf->remove) + { + client->AddExpeditionLockout(ExpeditionLockoutTimer{ + buf->uuid, buf->expedition_name, buf->event_name, buf->expire_time, buf->duration + }); + } + else if (buf->event_name[0] != '\0') + { + client->RemoveExpeditionLockout(buf->expedition_name, buf->event_name); + } + else + { + client->RemoveAllExpeditionLockouts(buf->expedition_name); + } + } + break; + } + case ServerOP_ExpeditionExpireWarning: + { + auto buf = reinterpret_cast(pack->pBuffer); + auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id); + if (expedition) + { + expedition->SendMembersExpireWarning(buf->minutes_remaining); + } + break; + } + } +} + +void Expedition::SendCompassUpdateToZoneMembers() +{ + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->SendDzCompassUpdate(); + } + } +} + +bool Expedition::CanClientLootCorpse(Client* client, uint32_t npc_type_id, uint32_t spawn_id) +{ + if (client && m_dynamiczone.IsCurrentZoneDzInstance()) + { + // entity id takes priority, falls back to checking by npc type if not set + std::string event_name = GetLootEventBySpawnID(spawn_id); + if (event_name.empty()) + { + event_name = GetLootEventByNPCTypeID(npc_type_id); + } + + if (!event_name.empty()) + { + auto client_lockout = client->GetExpeditionLockout(GetName(), event_name); + if (!client_lockout || client_lockout->GetExpeditionUUID() != GetUUID()) + { + // client lockout not received in this expedition, prevent looting + LogExpeditions( + "Character [{}] denied looting npc [{}] spawn [{}] for lockout event [{}]", + client->CharacterID(), npc_type_id, spawn_id, event_name + ); + return false; + } + } + } + + return true; +} + +void Expedition::SetLootEventByNPCTypeID(uint32_t npc_type_id, const std::string& event_name) +{ + if (npc_type_id && m_dynamiczone.IsCurrentZoneDzInstance()) + { + LogExpeditions("Setting loot event [{}] for npc type id [{}]", event_name, npc_type_id); + m_npc_loot_events[npc_type_id] = event_name; + } +} + +void Expedition::SetLootEventBySpawnID(uint32_t spawn_id, const std::string& event_name) +{ + if (spawn_id && m_dynamiczone.IsCurrentZoneDzInstance()) + { + LogExpeditions("Setting loot event [{}] for entity id [{}]", event_name, spawn_id); + m_spawn_loot_events[spawn_id] = event_name; + } +} + +std::string Expedition::GetLootEventByNPCTypeID(uint32_t npc_type_id) +{ + std::string event_name; + + if (npc_type_id && m_dynamiczone.IsCurrentZoneDzInstance()) + { + auto it = m_npc_loot_events.find(npc_type_id); + if (it != m_npc_loot_events.end()) + { + event_name = it->second; + } + } + + return event_name; +} + +std::string Expedition::GetLootEventBySpawnID(uint32_t spawn_id) +{ + std::string event_name; + + if (spawn_id && m_dynamiczone.IsCurrentZoneDzInstance()) + { + auto it = m_spawn_loot_events.find(spawn_id); + if (it != m_spawn_loot_events.end()) + { + event_name = it->second; + } + } + + return event_name; +} + +std::vector Expedition::GetExpeditionLockoutsByCharacterID(uint32_t character_id) +{ + std::vector lockouts; + if (character_id == 0) + { + return lockouts; + } + + auto client = entity_list.GetClientByCharID(character_id); + if (client) + { + lockouts = client->GetExpeditionLockouts(); + } + else + { + lockouts = ExpeditionDatabase::LoadCharacterLockouts(character_id); + } + + return lockouts; +} + +void Expedition::SendMembersExpireWarning(uint32_t minutes_remaining) +{ + // expeditions warn members in all zones not just the dz + auto outapp = CreateExpireWarningPacket(minutes_remaining); + for (const auto& member : m_members) + { + Client* member_client = entity_list.GetClientByCharID(member.id); + if (member_client) + { + member_client->QueuePacket(outapp.get()); + member_client->MessageString(Chat::Yellow, EXPEDITION_MIN_REMAIN, + fmt::format_int(minutes_remaining).c_str()); + } + } +} + +void Expedition::SyncCharacterLockouts( + uint32_t character_id, std::vector& client_lockouts) +{ + // adds missing event lockouts to client for this expedition and updates + // client timers that are both shorter and from another expedition + BenchTimer benchmark; + + bool modified = false; + + for (const auto& lockout_iter : m_lockouts) + { + const ExpeditionLockoutTimer& lockout = lockout_iter.second; + if (lockout.IsReplayTimer() || lockout.IsExpired() || lockout.GetExpeditionUUID() != m_uuid) + { + continue; + } + + auto client_lockout_iter = std::find_if(client_lockouts.begin(), client_lockouts.end(), + [&](const ExpeditionLockoutTimer& client_lockout) { + return client_lockout.IsSameLockout(lockout); + }); + + if (client_lockout_iter == client_lockouts.end()) + { + modified = true; + client_lockouts.emplace_back(lockout); // insert missing + } + else if (client_lockout_iter->GetSecondsRemaining() < lockout.GetSecondsRemaining() && + client_lockout_iter->GetExpeditionUUID() != m_uuid) + { + // only update lockout timer not uuid so loot event apis still work + modified = true; + client_lockout_iter->SetDuration(lockout.GetDuration()); + client_lockout_iter->SetExpireTime(lockout.GetExpireTime()); + } + } + + if (modified) + { + ExpeditionDatabase::InsertCharacterLockouts(character_id, client_lockouts); + } + + LogExpeditionsDetail("Syncing character lockouts with expedition took [{}] s", benchmark.elapsed()); +} diff --git a/zone/expedition.h b/zone/expedition.h new file mode 100644 index 000000000..b3404d696 --- /dev/null +++ b/zone/expedition.h @@ -0,0 +1,185 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EXPEDITION_H +#define EXPEDITION_H + +#include "dynamic_zone.h" +#include "../common/expedition_base.h" +#include "../common/expedition_lockout_timer.h" +#include "../common/repositories/expeditions_repository.h" +#include +#include +#include +#include +#include + +class Client; +class EQApplicationPacket; +struct ExpeditionInvite; +class ExpeditionRequest; +class ServerPacket; + +extern const char* const DZ_YOU_NOT_ASSIGNED; +extern const char* const EXPEDITION_OTHER_BELONGS; + +enum class ExpeditionLockMessage : uint8_t +{ + None = 0, + Close, + Begin +}; + +class Expedition : public ExpeditionBase +{ +public: + Expedition() = default; + Expedition(uint32_t id, const std::string& uuid, DynamicZone&& dz, const std::string& expedition_name, + const DynamicZoneMember& leader); + + static Expedition* TryCreate(Client* requester, DynamicZone& dynamiczone, ExpeditionRequest& request); + + static void CacheFromDatabase(uint32_t expedition_id); + static bool CacheAllFromDatabase(); + static Expedition* FindCachedExpeditionByCharacterID(uint32_t character_id); + static Expedition* FindCachedExpeditionByCharacterName(const std::string& char_name); + static Expedition* FindCachedExpeditionByDynamicZoneID(uint32_t dz_id); + static Expedition* FindCachedExpeditionByID(uint32_t expedition_id); + static Expedition* FindCachedExpeditionByZoneInstance(uint32_t zone_id, uint32_t instance_id); + static std::vector GetExpeditionLockoutsByCharacterID(uint32_t character_id); + static void HandleWorldMessage(ServerPacket* pack); + static void AddLockoutByCharacterID(uint32_t character_id, const std::string& expedition_name, + const std::string& event_name, uint32_t seconds, const std::string& uuid = {}); + static void AddLockoutByCharacterName(const std::string& character_name, const std::string& expedition_name, + const std::string& event_name, uint32_t seconds, const std::string& uuid = {}); + static bool HasLockoutByCharacterID(uint32_t character_id, + const std::string& expedition_name, const std::string& event_name); + static bool HasLockoutByCharacterName(const std::string& character_name, + const std::string& expedition_name, const std::string& event_name); + static void RemoveLockoutsByCharacterID(uint32_t character_id, + const std::string& expedition_name = {}, const std::string& event_name = {}); + static void RemoveLockoutsByCharacterName(const std::string& character_name, + const std::string& expedition_name = {}, const std::string& event_name = {}); + static void AddLockoutClients(const ExpeditionLockoutTimer& lockout, uint32_t exclude_id = 0); + + DynamicZone& GetDynamicZone() { return m_dynamiczone; } + const std::unordered_map& GetLockouts() const { return m_lockouts; } + + bool AddMember(const std::string& add_char_name, uint32_t add_char_id); + void RemoveAllMembers(bool enable_removal_timers = true); + bool RemoveMember(const std::string& remove_char_name); + void SetMemberStatus(Client* client, DynamicZoneMemberStatus status); + void SwapMember(Client* add_client, const std::string& remove_char_name); + + bool IsLocked() const { return m_is_locked; } + void SetLocked(bool lock_expedition, ExpeditionLockMessage lock_msg, + bool update_db = false, uint32_t msg_color = Chat::Yellow); + + void AddLockout(const std::string& event_name, uint32_t seconds); + void AddLockoutDuration(const std::string& event_name, int seconds, bool members_only = true); + void AddReplayLockout(uint32_t seconds); + void AddReplayLockoutDuration(int seconds, bool members_only = true); + bool HasLockout(const std::string& event_name); + bool HasReplayLockout(); + void RemoveLockout(const std::string& event_name); + void SetReplayLockoutOnMemberJoin(bool add_on_join, bool update_db = false); + void SyncCharacterLockouts(uint32_t character_id, std::vector& client_lockouts); + void UpdateLockoutDuration(const std::string& event_name, uint32_t seconds, bool members_only = true); + + bool CanClientLootCorpse(Client* client, uint32_t npc_type_id, uint32_t spawn_id); + std::string GetLootEventByNPCTypeID(uint32_t npc_id); + std::string GetLootEventBySpawnID(uint32_t spawn_id); + void SetLootEventByNPCTypeID(uint32_t npc_type_id, const std::string& event_name); + void SetLootEventBySpawnID(uint32_t spawn_id, const std::string& event_name); + + void SendClientExpeditionInfo(Client* client); + void SendWorldMakeLeaderRequest(uint32_t requester_id, const std::string& new_leader_name); + void SendWorldPendingInvite(const ExpeditionInvite& invite, const std::string& add_name); + + void DzAddPlayer(Client* requester, const std::string& add_char_name, const std::string& swap_remove_name = {}); + void DzAddPlayerContinue(std::string leader_name, std::string add_char_name, std::string swap_remove_name = {}); + void DzInviteResponse(Client* add_client, bool accepted, const std::string& swap_remove_name); + void DzMakeLeader(Client* requester, std::string new_leader_name); + void DzPlayerList(Client* requester); + void DzRemovePlayer(Client* requester, std::string remove_char_name); + void DzSwapPlayer(Client* requester, std::string remove_char_name, std::string add_char_name); + void DzQuit(Client* requester); + void DzKickPlayers(Client* requester); + + static const int32_t REPLAY_TIMER_ID; + static const int32_t EVENT_TIMER_ID; + +private: + static void CacheExpeditions(std::vector&& expeditions); + static void SendWorldCharacterLockout(uint32_t character_id, const ExpeditionLockoutTimer& lockout, bool remove); + + void AddLockout(const ExpeditionLockoutTimer& lockout, bool members_only = false); + void AddLockoutDurationClients(const ExpeditionLockoutTimer& lockout, int seconds, uint32_t exclude_id = 0); + bool ConfirmLeaderCommand(Client* requester); + bool ProcessAddConflicts(Client* leader_client, Client* add_client, bool swapping); + void ProcessLeaderChanged(uint32_t new_leader_id); + void ProcessLockoutDuration(const ExpeditionLockoutTimer& lockout, int seconds, bool members_only = false); + void ProcessLockoutUpdate(const ExpeditionLockoutTimer& lockout, bool remove, bool members_only = false); + void ProcessMakeLeader(Client* old_leader, Client* new_leader, + const std::string& new_leader_name, bool is_success, bool is_online); + void ProcessMemberAdded(const std::string& added_char_name, uint32_t added_char_id); + void ProcessMemberRemoved(const std::string& removed_char_name, uint32_t removed_char_id); + void SaveLockouts(ExpeditionRequest& request); + void SaveMembers(ExpeditionRequest& request); + void SendClientExpeditionInvite( + Client* client, const std::string& inviter_name, const std::string& swap_remove_name); + void SendLeaderMessage(Client* leader_client, uint16_t chat_type, uint32_t string_id, + const std::initializer_list& args = {}); + void SendMemberListToZoneMembers(); + void SendMemberStatusToZoneMembers(uint32_t update_character_id, DynamicZoneMemberStatus status); + void SendMembersExpireWarning(uint32_t minutes); + void SendUpdatesToZoneMembers(bool clear = false, bool message_on_clear = true); + void SendCompassUpdateToZoneMembers(); + void SendWorldExpeditionUpdate(uint16_t server_opcode); + void SendWorldAddPlayerInvite(const std::string& inviter_name, const std::string& swap_remove_name, + const std::string& add_name, bool pending = false); + void SendWorldLockoutDuration( + const ExpeditionLockoutTimer& lockout, int seconds, bool members_only = false); + void SendWorldLockoutUpdate( + const ExpeditionLockoutTimer& lockout, bool remove, bool members_only = false); + void SendWorldMemberChanged(const std::string& char_name, uint32_t char_id, bool remove); + void SendWorldMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status); + void SendWorldMemberSwapped(const std::string& remove_char_name, uint32_t remove_char_id, + const std::string& add_char_name, uint32_t add_char_id); + void SendWorldSettingChanged(uint16_t server_opcode, bool setting_value); + void SetDynamicZone(DynamicZone&& dz); + void TryAddClient(Client* add_client, const std::string& inviter_name, + const std::string& swap_remove_name, Client* leader_client = nullptr); + + std::unique_ptr CreateExpireWarningPacket(uint32_t minutes_remaining); + std::unique_ptr CreateInfoPacket(bool clear = false); + std::unique_ptr CreateInvitePacket(const std::string& inviter_name, const std::string& swap_remove_name); + std::unique_ptr CreateMemberListPacket(bool clear = false); + std::unique_ptr CreateMemberListNamePacket(const std::string& name, bool remove_name); + std::unique_ptr CreateMemberListStatusPacket(const std::string& name, DynamicZoneMemberStatus status); + std::unique_ptr CreateLeaderNamePacket(); + + DynamicZone m_dynamiczone { DynamicZoneType::Expedition }; + std::unordered_map m_lockouts; + std::unordered_map m_npc_loot_events; // only valid inside dz zone + std::unordered_map m_spawn_loot_events; // only valid inside dz zone +}; + +#endif diff --git a/zone/expedition_database.cpp b/zone/expedition_database.cpp new file mode 100644 index 000000000..af6948f5f --- /dev/null +++ b/zone/expedition_database.cpp @@ -0,0 +1,544 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition_database.h" +#include "expedition.h" +#include "zonedb.h" +#include "../common/database.h" +#include "../common/expedition_lockout_timer.h" +#include "../common/string_util.h" +#include + +uint32_t ExpeditionDatabase::InsertExpedition( + const std::string& uuid, uint32_t dz_id, const std::string& expedition_name, + uint32_t leader_id, uint32_t min_players, uint32_t max_players) +{ + LogExpeditionsDetail( + "Inserting new expedition [{}] leader [{}] uuid [{}]", expedition_name, leader_id, uuid + ); + + std::string query = fmt::format(SQL( + INSERT INTO expeditions + (uuid, dynamic_zone_id, expedition_name, leader_id, min_players, max_players) + VALUES + ('{}', {}, '{}', {}, {}, {}); + ), uuid, dz_id, EscapeString(expedition_name), leader_id, min_players, max_players); + + auto results = database.QueryDatabase(query); + if (!results.Success()) + { + LogExpeditions("Failed to obtain an expedition id for [{}]", expedition_name); + return 0; + } + + return results.LastInsertedID(); +} + +std::vector ExpeditionDatabase::LoadCharacterLockouts(uint32_t character_id) +{ + LogExpeditionsDetail("Loading character [{}] lockouts", character_id); + + std::vector lockouts; + + auto query = fmt::format(SQL( + SELECT + from_expedition_uuid, + expedition_name, + event_name, + UNIX_TIMESTAMP(expire_time), + duration + FROM character_expedition_lockouts + WHERE character_id = {} AND expire_time > NOW(); + ), character_id); + + auto results = database.QueryDatabase(query); + if (results.Success()) + { + for (auto row = results.begin(); row != results.end(); ++row) + { + lockouts.emplace_back( + row[0], // expedition_uuid + row[1], // expedition_name + row[2], // event_name + strtoull(row[3], nullptr, 10), // expire_time + static_cast(strtoul(row[4], nullptr, 10)) // duration + ); + } + } + + return lockouts; +} + +std::vector ExpeditionDatabase::LoadCharacterLockouts( + uint32_t character_id, const std::string& expedition_name) +{ + LogExpeditionsDetail("Loading character [{}] lockouts for [{}]", character_id, expedition_name); + + std::vector lockouts; + + auto query = fmt::format(SQL( + SELECT + from_expedition_uuid, + event_name, + UNIX_TIMESTAMP(expire_time), + duration + FROM character_expedition_lockouts + WHERE + character_id = {} + AND expire_time > NOW() + AND expedition_name = '{}'; + ), character_id, EscapeString(expedition_name)); + + auto results = database.QueryDatabase(query); + if (results.Success()) + { + for (auto row = results.begin(); row != results.end(); ++row) + { + lockouts.emplace_back( + row[0], // expedition_uuid + expedition_name, + row[1], // event_name + strtoull(row[2], nullptr, 10), // expire_time + static_cast(strtoul(row[3], nullptr, 10)) // duration + ); + } + } + + return lockouts; +} + +void ExpeditionDatabase::DeleteAllCharacterLockouts(uint32_t character_id) +{ + LogExpeditionsDetail("Deleting all character [{}] lockouts", character_id); + + if (character_id != 0) + { + std::string query = fmt::format(SQL( + DELETE FROM character_expedition_lockouts + WHERE character_id = {}; + ), character_id); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::DeleteAllCharacterLockouts( + uint32_t character_id, const std::string& expedition_name) +{ + LogExpeditionsDetail("Deleting all character [{}] lockouts for [{}]", character_id, expedition_name); + + if (character_id != 0 && !expedition_name.empty()) + { + std::string query = fmt::format(SQL( + DELETE FROM character_expedition_lockouts + WHERE character_id = {} AND expedition_name = '{}'; + ), character_id, EscapeString(expedition_name)); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::DeleteCharacterLockout( + uint32_t character_id, const std::string& expedition_name, const std::string& event_name) +{ + LogExpeditionsDetail( + "Deleting character [{}] lockout: [{}]:[{}]", character_id, expedition_name, event_name + ); + + auto query = fmt::format(SQL( + DELETE FROM character_expedition_lockouts + WHERE + character_id = {} + AND expedition_name = '{}' + AND event_name = '{}'; + ), character_id, EscapeString(expedition_name), EscapeString(event_name)); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::DeleteMembersLockout( + const std::vector& members, + const std::string& expedition_name, const std::string& event_name) +{ + LogExpeditionsDetail("Deleting members lockout: [{}]:[{}]", expedition_name, event_name); + + std::string query_character_ids; + for (const auto& member : members) + { + fmt::format_to(std::back_inserter(query_character_ids), "{},", member.id); + } + + if (!query_character_ids.empty()) + { + query_character_ids.pop_back(); // trailing comma + + auto query = fmt::format(SQL( + DELETE FROM character_expedition_lockouts + WHERE character_id + IN ({}) + AND expedition_name = '{}' + AND event_name = '{}'; + ), query_character_ids, EscapeString(expedition_name), EscapeString(event_name)); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::DeleteLockout(uint32_t expedition_id, const std::string& event_name) +{ + LogExpeditionsDetail("Deleting expedition [{}] lockout event [{}]", expedition_id, event_name); + + auto query = fmt::format(SQL( + DELETE FROM expedition_lockouts + WHERE expedition_id = {} AND event_name = '{}'; + ), expedition_id, EscapeString(event_name)); + + database.QueryDatabase(query); +} + +uint32_t ExpeditionDatabase::GetExpeditionIDFromCharacterID(uint32_t character_id) +{ + LogExpeditionsDetail("Getting expedition id for character [{}]", character_id); + + uint32_t expedition_id = 0; + auto query = fmt::format(SQL( + SELECT expedition_id FROM expedition_members + WHERE character_id = {} AND is_current_member = TRUE; + ), character_id); + + auto results = database.QueryDatabase(query); + if (results.Success() && results.RowCount() > 0) + { + auto row = results.begin(); + expedition_id = strtoul(row[0], nullptr, 10); + } + return expedition_id; +} + +uint32_t ExpeditionDatabase::GetMemberCount(uint32_t expedition_id) +{ + LogExpeditionsDetail("Getting expedition [{}] member count from db", expedition_id); + + uint32_t member_count = 0; + if (expedition_id != 0) + { + auto query = fmt::format(SQL( + SELECT COUNT(*) + FROM expedition_members + WHERE expedition_id = {} AND is_current_member = TRUE; + ), expedition_id); + + auto results = database.QueryDatabase(query); + if (results.Success() && results.RowCount() > 0) + { + auto row = results.begin(); + member_count = strtoul(row[0], nullptr, 10); + } + } + return member_count; +} + +bool ExpeditionDatabase::HasMember(uint32_t expedition_id, uint32_t character_id) +{ + LogExpeditionsDetail("Checking db expedition [{}] for character [{}]", expedition_id, character_id); + + if (expedition_id == 0 || character_id == 0) + { + return false; + } + + auto query = fmt::format(SQL( + SELECT id + FROM expedition_members + WHERE expedition_id = {} AND character_id = {} AND is_current_member = TRUE; + ), expedition_id, character_id); + + auto results = database.QueryDatabase(query); + return (results.Success() && results.RowCount() > 0); +} + +void ExpeditionDatabase::InsertCharacterLockouts(uint32_t character_id, + const std::vector& lockouts) +{ + LogExpeditionsDetail("Inserting [{}] lockouts for character [{}]", lockouts.size(), character_id); + + std::string insert_values; + for (const auto& lockout : lockouts) + { + fmt::format_to(std::back_inserter(insert_values), + "({}, FROM_UNIXTIME({}), {}, '{}', '{}', '{}'),", + character_id, + lockout.GetExpireTime(), + lockout.GetDuration(), + lockout.GetExpeditionUUID(), + EscapeString(lockout.GetExpeditionName()), + EscapeString(lockout.GetEventName()) + ); + } + + if (!insert_values.empty()) + { + insert_values.pop_back(); // trailing comma + + auto query = fmt::format(SQL( + INSERT INTO character_expedition_lockouts + (character_id, expire_time, duration, from_expedition_uuid, expedition_name, event_name) + VALUES {} + ON DUPLICATE KEY UPDATE + from_expedition_uuid = VALUES(from_expedition_uuid), + expire_time = VALUES(expire_time), + duration = VALUES(duration); + ), insert_values); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::InsertMembersLockout( + const std::vector& members, const ExpeditionLockoutTimer& lockout) +{ + LogExpeditionsDetail( + "Inserting members lockout [{}]:[{}] with expire time [{}]", + lockout.GetExpeditionName(), lockout.GetEventName(), lockout.GetExpireTime() + ); + + std::string insert_values; + for (const auto& member : members) + { + fmt::format_to(std::back_inserter(insert_values), + "({}, FROM_UNIXTIME({}), {}, '{}', '{}', '{}'),", + member.id, + lockout.GetExpireTime(), + lockout.GetDuration(), + lockout.GetExpeditionUUID(), + EscapeString(lockout.GetExpeditionName()), + EscapeString(lockout.GetEventName()) + ); + } + + if (!insert_values.empty()) + { + insert_values.pop_back(); // trailing comma + + auto query = fmt::format(SQL( + INSERT INTO character_expedition_lockouts + (character_id, expire_time, duration, from_expedition_uuid, expedition_name, event_name) + VALUES {} + ON DUPLICATE KEY UPDATE + from_expedition_uuid = VALUES(from_expedition_uuid), + expire_time = VALUES(expire_time), + duration = VALUES(duration); + ), insert_values); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::InsertLockout( + uint32_t expedition_id, const ExpeditionLockoutTimer& lockout) +{ + LogExpeditionsDetail( + "Inserting expedition [{}] lockout: [{}]:[{}] expire time: [{}]", + expedition_id, lockout.GetExpeditionName(), lockout.GetEventName(), lockout.GetExpireTime() + ); + + auto query = fmt::format(SQL( + INSERT INTO expedition_lockouts + (expedition_id, from_expedition_uuid, event_name, expire_time, duration) + VALUES + ({}, '{}', '{}', FROM_UNIXTIME({}), {}) + ON DUPLICATE KEY UPDATE + from_expedition_uuid = VALUES(from_expedition_uuid), + expire_time = VALUES(expire_time), + duration = VALUES(duration); + ), + expedition_id, + lockout.GetExpeditionUUID(), + EscapeString(lockout.GetEventName()), + lockout.GetExpireTime(), + lockout.GetDuration() + ); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::InsertLockouts( + uint32_t expedition_id, const std::unordered_map& lockouts) +{ + LogExpeditionsDetail("Inserting expedition [{}] lockouts", expedition_id); + + std::string insert_values; + for (const auto& lockout : lockouts) + { + fmt::format_to(std::back_inserter(insert_values), + "({}, '{}', '{}', FROM_UNIXTIME({}), {}),", + expedition_id, + lockout.second.GetExpeditionUUID(), + EscapeString(lockout.second.GetEventName()), + lockout.second.GetExpireTime(), + lockout.second.GetDuration() + ); + } + + if (!insert_values.empty()) + { + insert_values.pop_back(); // trailing comma + + auto query = fmt::format(SQL( + INSERT INTO expedition_lockouts + (expedition_id, from_expedition_uuid, event_name, expire_time, duration) + VALUES {} + ON DUPLICATE KEY UPDATE + from_expedition_uuid = VALUES(from_expedition_uuid), + expire_time = VALUES(expire_time), + duration = VALUES(duration); + ), insert_values); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::InsertMember(uint32_t expedition_id, uint32_t character_id) +{ + LogExpeditionsDetail("Inserting character [{}] into expedition [{}]", character_id, expedition_id); + + auto query = fmt::format(SQL( + INSERT INTO expedition_members + (expedition_id, character_id) + VALUES + ({}, {}) + ON DUPLICATE KEY UPDATE is_current_member = TRUE; + ), expedition_id, character_id); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::InsertMembers( + uint32_t expedition_id, const std::vector& members) +{ + LogExpeditionsDetail("Inserting characters into expedition [{}]", expedition_id); + + std::string insert_values; + for (const auto& member : members) + { + fmt::format_to(std::back_inserter(insert_values), + "({}, {}),", + expedition_id, member.id + ); + } + + if (!insert_values.empty()) + { + insert_values.pop_back(); // trailing comma + + auto query = fmt::format(SQL( + INSERT INTO expedition_members + (expedition_id, character_id) + VALUES {} + ON DUPLICATE KEY UPDATE is_current_member = TRUE; + ), insert_values); + + database.QueryDatabase(query); + } +} + +void ExpeditionDatabase::UpdateLockState(uint32_t expedition_id, bool is_locked) +{ + LogExpeditionsDetail("Updating lock state [{}] for expedition [{}]", is_locked, expedition_id); + + auto query = fmt::format(SQL( + UPDATE expeditions SET is_locked = {} WHERE id = {}; + ), is_locked, expedition_id); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::DeleteMember(uint32_t expedition_id, uint32_t character_id) +{ + LogExpeditionsDetail("Removing member [{}] from expedition [{}]", character_id, expedition_id); + + auto query = fmt::format(SQL( + UPDATE expedition_members SET is_current_member = FALSE + WHERE expedition_id = {} AND character_id = {}; + ), expedition_id, character_id); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::DeleteAllMembers(uint32_t expedition_id) +{ + LogExpeditionsDetail("Removing all members of expedition [{}]", expedition_id); + + auto query = fmt::format(SQL( + UPDATE expedition_members SET is_current_member = FALSE WHERE expedition_id = {}; + ), expedition_id); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::UpdateReplayLockoutOnJoin(uint32_t expedition_id, bool add_on_join) +{ + LogExpeditionsDetail("Updating replay lockout on join [{}] for expedition [{}]", add_on_join, expedition_id); + + auto query = fmt::format(SQL( + UPDATE expeditions SET add_replay_on_join = {} WHERE id = {}; + ), add_on_join, expedition_id); + + database.QueryDatabase(query); +} + +void ExpeditionDatabase::AddLockoutDuration(const std::vector& members, + const ExpeditionLockoutTimer& lockout, int seconds) +{ + LogExpeditionsDetail( + "Adding duration [{}] seconds to members lockouts [{}]:[{}]", + seconds, lockout.GetExpeditionName(), lockout.GetEventName()); + + std::string insert_values; + for (const auto& member : members) + { + fmt::format_to(std::back_inserter(insert_values), + "({}, FROM_UNIXTIME({}), {}, '{}', '{}', '{}'),", + member.id, + lockout.GetExpireTime(), + lockout.GetDuration(), + lockout.GetExpeditionUUID(), + EscapeString(lockout.GetExpeditionName()), + EscapeString(lockout.GetEventName()) + ); + } + + if (!insert_values.empty()) + { + insert_values.pop_back(); // trailing comma + + auto query = fmt::format(SQL( + INSERT INTO character_expedition_lockouts + (character_id, expire_time, duration, from_expedition_uuid, expedition_name, event_name) + VALUES {} + ON DUPLICATE KEY UPDATE + from_expedition_uuid = VALUES(from_expedition_uuid), + expire_time = DATE_ADD(expire_time, INTERVAL {} SECOND), + duration = GREATEST(0, CAST(duration AS SIGNED) + {}); + ), insert_values, seconds, seconds); + + database.QueryDatabase(query); + } +} diff --git a/zone/expedition_database.h b/zone/expedition_database.h new file mode 100644 index 000000000..cce81c0fc --- /dev/null +++ b/zone/expedition_database.h @@ -0,0 +1,71 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EXPEDITION_DATABASE_H +#define EXPEDITION_DATABASE_H + +#include +#include +#include +#include +#include +#include + +class Expedition; +class ExpeditionLockoutTimer; +struct DynamicZoneMember; +class MySQLRequestResult; + +namespace ExpeditionDatabase +{ + uint32_t InsertExpedition( + const std::string& uuid, uint32_t instance_id, const std::string& expedition_name, + uint32_t leader_id, uint32_t min_players, uint32_t max_players); + std::vector LoadCharacterLockouts(uint32_t character_id); + std::vector LoadCharacterLockouts(uint32_t character_id, + const std::string& expedition_name); + void DeleteAllMembers(uint32_t expedition_id); + void DeleteMember(uint32_t expedition_id, uint32_t character_id); + void DeleteAllCharacterLockouts(uint32_t character_id); + void DeleteAllCharacterLockouts(uint32_t character_id, const std::string& expedition_name); + void DeleteCharacterLockout(uint32_t character_id, const std::string& expedition_name, + const std::string& event_name); + void DeleteLockout(uint32_t expedition_id, const std::string& event_name); + void DeleteMembersLockout(const std::vector& members, + const std::string& expedition_name, const std::string& event_name); + uint32_t GetExpeditionIDFromCharacterID(uint32_t character_id); + uint32_t GetMemberCount(uint32_t expedition_id); + bool HasMember(uint32_t expedition_id, uint32_t character_id); + void InsertCharacterLockouts(uint32_t character_id, + const std::vector& lockouts); + void InsertMembersLockout(const std::vector& members, + const ExpeditionLockoutTimer& lockout); + void InsertLockout(uint32_t expedition_id, const ExpeditionLockoutTimer& lockout); + void InsertLockouts(uint32_t expedition_id, + const std::unordered_map& lockouts); + void InsertMember(uint32_t expedition_id, uint32_t character_id); + void InsertMembers(uint32_t expedition_id, const std::vector& members); + void UpdateLockState(uint32_t expedition_id, bool is_locked); + void UpdateReplayLockoutOnJoin(uint32_t expedition_id, bool add_on_join); + void AddLockoutDuration(const std::vector& members, + const ExpeditionLockoutTimer& lockout, int seconds); +}; + +#endif diff --git a/zone/expedition_request.cpp b/zone/expedition_request.cpp new file mode 100644 index 000000000..a1a2aa48e --- /dev/null +++ b/zone/expedition_request.cpp @@ -0,0 +1,369 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "expedition_request.h" +#include "client.h" +#include "expedition.h" +#include "groups.h" +#include "raids.h" +#include "string_ids.h" +#include "../common/expedition_lockout_timer.h" +#include "../common/repositories/character_expedition_lockouts_repository.h" +#include "../common/repositories/expeditions_repository.h" + +constexpr char SystemName[] = "expedition"; + +ExpeditionRequest::ExpeditionRequest(std::string expedition_name, + uint32_t min_players, uint32_t max_players, bool disable_messages +) : + m_expedition_name(std::move(expedition_name)), + m_min_players(min_players), + m_max_players(max_players), + m_disable_messages(disable_messages) +{ +} + +bool ExpeditionRequest::Validate(Client* requester) +{ + m_requester = requester; + if (!m_requester) + { + return false; + } + + // a message is sent to leader for every member that fails a requirement + + BenchTimer benchmark; + + bool requirements_met = false; + + Raid* raid = m_requester->GetRaid(); + Group* group = m_requester->GetGroup(); + if (raid) + { + requirements_met = CanRaidRequest(raid); + } + else if (group) + { + requirements_met = CanGroupRequest(group); + } + else // solo request + { + m_leader = m_requester; + m_leader_id = m_requester->CharacterID(); + m_leader_name = m_requester->GetName(); + requirements_met = CanMembersJoin({m_leader_name}); + } + + auto elapsed = benchmark.elapsed(); + LogExpeditions("Create validation for [{}] members took [{}s]", m_members.size(), elapsed); + + return requirements_met; +} + +bool ExpeditionRequest::CanRaidRequest(Raid* raid) +{ + m_leader = raid->GetLeader(); + m_leader_name = raid->leadername; + m_leader_id = m_leader ? m_leader->CharacterID() : database.GetCharacterID(raid->leadername); + + // live (as of September 16, 2020) supports creation even if raid count exceeds + // expedition max. members are added up to the max ordered by group number. + auto raid_members = raid->GetMembers(); + + if (raid_members.size() > m_max_players) + { + // stable_sort not needed, order within a raid group may not be what is displayed + std::sort(raid_members.begin(), raid_members.end(), + [&](const RaidMember& lhs, const RaidMember& rhs) { + if (m_leader_name == lhs.membername) { // leader always added first + return true; + } else if (m_leader_name == rhs.membername) { + return false; + } + return lhs.GroupNumber < rhs.GroupNumber; + }); + + m_not_all_added_msg = fmt::format(CREATE_NOT_ALL_ADDED, "raid", SystemName, + SystemName, m_max_players, "raid", raid_members.size()); + } + + // live still performs conflict checks for all members even those beyond max + std::vector member_names; + for (int i = 0; i < raid_members.size(); ++i) + { + member_names.emplace_back(raid_members[i].membername); + } + + return CanMembersJoin(member_names); +} + +bool ExpeditionRequest::CanGroupRequest(Group* group) +{ + m_leader = nullptr; + if (group->GetLeader() && group->GetLeader()->IsClient()) + { + m_leader = group->GetLeader()->CastToClient(); + } + + // Group::GetLeaderName() is broken if group formed across zones, ask database instead + m_leader_name = m_leader ? m_leader->GetName() : GetGroupLeaderName(group->GetID()); // group->GetLeaderName(); + m_leader_id = m_leader ? m_leader->CharacterID() : database.GetCharacterID(m_leader_name.c_str()); + + std::vector member_names; + member_names.emplace_back(m_leader_name); // leader always added first + + for (int i = 0; i < MAX_GROUP_MEMBERS; ++i) + { + if (group->membername[i][0] && m_leader_name != group->membername[i]) + { + member_names.emplace_back(group->membername[i]); + } + } + + if (member_names.size() > m_max_players) + { + m_not_all_added_msg = fmt::format(CREATE_NOT_ALL_ADDED, "group", SystemName, + SystemName, m_max_players, "group", member_names.size()); + } + + return CanMembersJoin(member_names); +} + +std::string ExpeditionRequest::GetGroupLeaderName(uint32_t group_id) +{ + char leader_name_buffer[64] = { 0 }; + database.GetGroupLeadershipInfo(group_id, leader_name_buffer); + return std::string(leader_name_buffer); +} + +bool ExpeditionRequest::CanMembersJoin(const std::vector& member_names) +{ + if (member_names.empty()) + { + return false; + } + + bool requirements_met = true; + + if (CheckMembersForConflicts(member_names)) + { + requirements_met = false; + } + + // live only checks player count requirement after other expensive checks pass (?) + // maybe it's done intentionally as a way to preview lockout conflicts + if (requirements_met) + { + requirements_met = IsPlayerCountValidated(); + } + + return requirements_met; +} + +bool ExpeditionRequest::SaveLeaderLockouts(const std::vector& lockouts) +{ + bool has_replay_lockout = false; + + for (const auto& lockout : lockouts) + { + if (!lockout.IsExpired()) + { + m_lockouts[lockout.GetEventName()] = lockout; + + if (lockout.IsReplayTimer()) + { + has_replay_lockout = true; + } + } + } + + return has_replay_lockout; +} + +bool ExpeditionRequest::CheckMembersForConflicts(const std::vector& member_names) +{ + // order of member_names is preserved by queries for use with max member truncation + auto entries = ExpeditionsRepository::GetCharactersWithExpedition(database, member_names); + if (entries.empty()) + { + LogExpeditions("Failed to load members for expedition request"); + return true; + } + + bool is_solo = (member_names.size() == 1); + bool has_conflicts = false; + + std::vector character_ids; + for (const auto& character : entries) + { + if (is_solo && character.expedition_id != 0) + { + // live doesn't bother checking replay lockout here + SendLeaderMemberInExpedition(character.name, is_solo); + return true; + } + + m_members.emplace_back(character.id, character.name, DynamicZoneMemberStatus::Online); + character_ids.emplace_back(character.id); + } + + auto member_lockouts = CharacterExpeditionLockoutsRepository::GetManyCharacterLockoutTimers( + database, character_ids, m_expedition_name, DZ_REPLAY_TIMER_NAME); + + // on live if leader has a replay lockout it never checks for event conflicts + bool leader_has_replay_lockout = false; + auto lockout_iter = member_lockouts.find(m_leader_id); + if (lockout_iter != member_lockouts.end()) + { + leader_has_replay_lockout = SaveLeaderLockouts(lockout_iter->second); + } + + for (const auto& character : entries) + { + if (character.expedition_id != 0) + { + has_conflicts = true; + SendLeaderMemberInExpedition(character.name, is_solo); + } + + auto lockout_iter = member_lockouts.find(character.id); + if (lockout_iter != member_lockouts.end()) + { + for (const auto& lockout : lockout_iter->second) + { + if (!lockout.IsExpired()) + { + // replay timers were sorted by query so they show up before event conflicts + if (lockout.IsReplayTimer()) + { + has_conflicts = true; + SendLeaderMemberReplayLockout(character.name, lockout, is_solo); + } + else if (!leader_has_replay_lockout && character.id != m_leader_id && + m_lockouts.find(lockout.GetEventName()) == m_lockouts.end()) + { + // leader doesn't have this lockout + has_conflicts = true; + SendLeaderMemberEventLockout(character.name, lockout); + } + } + } + } + } + + return has_conflicts; +} + +void ExpeditionRequest::SendLeaderMessage( + uint16_t chat_type, uint32_t string_id, const std::initializer_list& args) +{ + if (!m_disable_messages) + { + Client::SendCrossZoneMessageString(m_leader, m_leader_name, chat_type, string_id, args); + } +} + +void ExpeditionRequest::SendLeaderMemberInExpedition(const std::string& member_name, bool is_solo) +{ + if (m_disable_messages) + { + return; + } + + if (is_solo) + { + SendLeaderMessage(Chat::Red, EXPEDITION_YOU_BELONG); + } + else if (m_requester) + { + std::string message = fmt::format(EXPEDITION_OTHER_BELONGS, m_requester->GetName(), member_name); + Client::SendCrossZoneMessage(m_leader, m_leader_name, Chat::Red, message); + } +} + +void ExpeditionRequest::SendLeaderMemberReplayLockout( + const std::string& member_name, const ExpeditionLockoutTimer& lockout, bool is_solo) +{ + if (m_disable_messages) + { + return; + } + + auto time_remaining = lockout.GetDaysHoursMinutesRemaining(); + if (is_solo) + { + SendLeaderMessage(Chat::Red, EXPEDITION_YOU_PLAYED_HERE, { + time_remaining.days, time_remaining.hours, time_remaining.mins + }); + } + else + { + SendLeaderMessage(Chat::Red, EXPEDITION_REPLAY_TIMER, { + member_name, time_remaining.days, time_remaining.hours, time_remaining.mins + }); + } +} + +void ExpeditionRequest::SendLeaderMemberEventLockout( + const std::string& member_name, const ExpeditionLockoutTimer& lockout) +{ + if (m_disable_messages) + { + return; + } + + auto time_remaining = lockout.GetDaysHoursMinutesRemaining(); + SendLeaderMessage(Chat::Red, EXPEDITION_EVENT_TIMER, { + member_name, + lockout.GetEventName(), + time_remaining.days, + time_remaining.hours, + time_remaining.mins, + lockout.GetEventName() + }); +} + +bool ExpeditionRequest::IsPlayerCountValidated() +{ + // note: offline group members count towards requirement but not added to expedition + bool requirements_met = true; + + auto bypass_status = RuleI(Expedition, MinStatusToBypassPlayerCountRequirements); + auto gm_bypass = (m_requester && m_requester->GetGM() && m_requester->Admin() >= bypass_status); + + if (m_members.size() > m_max_players) + { + // members were sorted at start, truncate after conflict checks to act like live + m_members.resize(m_max_players); + } + else if (!gm_bypass && m_members.size() < m_min_players) + { + requirements_met = false; + + SendLeaderMessage(Chat::System, REQUIRED_PLAYER_COUNT, { + fmt::format_int(m_members.size()).str(), + fmt::format_int(m_min_players).str(), + fmt::format_int(m_max_players).str() + }); + } + + return requirements_met; +} diff --git a/zone/expedition_request.h b/zone/expedition_request.h new file mode 100644 index 000000000..64c594d3c --- /dev/null +++ b/zone/expedition_request.h @@ -0,0 +1,79 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EXPEDITION_REQUEST_H +#define EXPEDITION_REQUEST_H + +#include "expedition.h" +#include "../common/expedition_lockout_timer.h" +#include +#include +#include +#include + +class Client; +class Group; +class Raid; + +class ExpeditionRequest +{ +public: + ExpeditionRequest(std::string expedition_name, uint32_t min_players, + uint32_t max_players, bool disable_messages = false); + + bool Validate(Client* requester); + + const std::string& GetExpeditionName() const { return m_expedition_name; } + Client* GetLeaderClient() const { return m_leader; } + uint32_t GetLeaderID() const { return m_leader_id; } + const std::string& GetLeaderName() const { return m_leader_name; } + const std::string& GetNotAllAddedMessage() const { return m_not_all_added_msg; } + uint32_t GetMinPlayers() const { return m_min_players; } + uint32_t GetMaxPlayers() const { return m_max_players; } + std::vector GetMembers() const { return m_members; } + std::unordered_map GetLockouts() const { return m_lockouts; } + +private: + bool CanMembersJoin(const std::vector& member_names); + bool CanRaidRequest(Raid* raid); + bool CanGroupRequest(Group* group); + bool CheckMembersForConflicts(const std::vector& member_names); + std::string GetGroupLeaderName(uint32_t group_id); + bool IsPlayerCountValidated(); + bool SaveLeaderLockouts(const std::vector& leader_lockouts); + void SendLeaderMemberInExpedition(const std::string& member_name, bool is_solo); + void SendLeaderMemberReplayLockout(const std::string& member_name, const ExpeditionLockoutTimer& lockout, bool is_solo); + void SendLeaderMemberEventLockout(const std::string& member_name, const ExpeditionLockoutTimer& lockout); + void SendLeaderMessage(uint16_t chat_type, uint32_t string_id, const std::initializer_list& args = {}); + + Client* m_requester = nullptr; + Client* m_leader = nullptr; + uint32_t m_leader_id = 0; + uint32_t m_min_players = 0; + uint32_t m_max_players = 0; + bool m_disable_messages = false; + std::string m_expedition_name; + std::string m_leader_name; + std::string m_not_all_added_msg; + std::vector m_members; + std::unordered_map m_lockouts; +}; + +#endif diff --git a/zone/forage.cpp b/zone/forage.cpp index f14f1f968..75ae00197 100644 --- a/zone/forage.cpp +++ b/zone/forage.cpp @@ -30,6 +30,8 @@ #include "titles.h" #include "water_map.h" #include "zonedb.h" +#include "zone_store.h" +#include "../common/repositories/criteria/content_filter_criteria.h" #include @@ -54,9 +56,25 @@ uint32 ZoneDatabase::GetZoneForage(uint32 ZoneID, uint8 skill) { } uint32 chancepool = 0; - std::string query = StringFormat("SELECT itemid, chance FROM " - "forage WHERE zoneid = '%i' and level <= '%i' " - "LIMIT %i", ZoneID, skill, FORAGE_ITEM_LIMIT); + std::string query = fmt::format( + SQL( + SELECT + itemid, + chance + FROM + forage + WHERE + zoneid = '{}' + and level <= '{}' + {} + LIMIT + {} + ), + ZoneID, + skill, + ContentFilterCriteria::apply(), + FORAGE_ITEM_LIMIT + ); auto results = QueryDatabase(query); if (!results.Success()) { return 0; @@ -109,9 +127,24 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, chance[c]=0; } - std::string query = StringFormat("SELECT itemid, chance, npc_id, npc_chance " - "FROM fishing WHERE (zoneid = '%i' || zoneid = 0) AND skill_level <= '%i'", - ZoneID, skill); + std::string query = fmt::format( + SQL( + SELECT + itemid, + chance, + npc_id, + npc_chance + FROM + fishing + WHERE + (zoneid = '{}' || zoneid = 0) + AND skill_level <= '{}' + {} + ), + ZoneID, + skill, + ContentFilterCriteria::apply() + ); auto results = QueryDatabase(query); if (!results.Success()) { return 0; @@ -153,21 +186,21 @@ uint32 ZoneDatabase::GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, //we need this function to immediately determine, after we receive OP_Fishing, if we can even try to fish, otherwise we have to wait a while to get the failure bool Client::CanFish() { //make sure we still have a fishing pole on: - const EQEmu::ItemInstance* Pole = m_inv[EQEmu::invslot::slotPrimary]; - int32 bslot = m_inv.HasItemByUse(EQEmu::item::ItemTypeFishingBait, 1, invWhereWorn | invWherePersonal); - const EQEmu::ItemInstance* Bait = nullptr; + const EQ::ItemInstance* Pole = m_inv[EQ::invslot::slotPrimary]; + int32 bslot = m_inv.HasItemByUse(EQ::item::ItemTypeFishingBait, 1, invWhereWorn | invWherePersonal); + const EQ::ItemInstance* Bait = nullptr; if (bslot != INVALID_INDEX) Bait = m_inv.GetItem(bslot); - if (!Pole || !Pole->IsClassCommon() || Pole->GetItem()->ItemType != EQEmu::item::ItemTypeFishingPole) { - if (m_inv.HasItemByUse(EQEmu::item::ItemTypeFishingPole, 1, invWhereWorn | invWherePersonal | invWhereBank | invWhereSharedBank | invWhereTrading | invWhereCursor)) //We have a fishing pole somewhere, just not equipped + if (!Pole || !Pole->IsClassCommon() || Pole->GetItem()->ItemType != EQ::item::ItemTypeFishingPole) { + if (m_inv.HasItemByUse(EQ::item::ItemTypeFishingPole, 1, invWhereWorn | invWherePersonal | invWhereBank | invWhereSharedBank | invWhereTrading | invWhereCursor)) //We have a fishing pole somewhere, just not equipped MessageString(Chat::Skills, FISHING_EQUIP_POLE); //You need to put your fishing pole in your primary hand. else //We don't have a fishing pole anywhere MessageString(Chat::Skills, FISHING_NO_POLE); //You can't fish without a fishing pole, go buy one. return false; } - if (!Bait || !Bait->IsClassCommon() || Bait->GetItem()->ItemType != EQEmu::item::ItemTypeFishingBait) { + if (!Bait || !Bait->IsClassCommon() || Bait->GetItem()->ItemType != EQ::item::ItemTypeFishingBait) { MessageString(Chat::Skills, FISHING_NO_BAIT); //You can't fish without fishing bait, go buy some. return false; } @@ -249,16 +282,16 @@ void Client::GoFish() //success formula is not researched at all - int fishing_skill = GetSkill(EQEmu::skills::SkillFishing); //will take into account skill bonuses on pole & bait + int fishing_skill = GetSkill(EQ::skills::SkillFishing); //will take into account skill bonuses on pole & bait //make sure we still have a fishing pole on: - int32 bslot = m_inv.HasItemByUse(EQEmu::item::ItemTypeFishingBait, 1, invWhereWorn | invWherePersonal); - const EQEmu::ItemInstance* Bait = nullptr; + int32 bslot = m_inv.HasItemByUse(EQ::item::ItemTypeFishingBait, 1, invWhereWorn | invWherePersonal); + const EQ::ItemInstance* Bait = nullptr; if (bslot != INVALID_INDEX) Bait = m_inv.GetItem(bslot); //if the bait isnt equipped, need to add its skill bonus - if (bslot >= EQEmu::invslot::GENERAL_BEGIN && Bait != nullptr && Bait->GetItem()->SkillModType == EQEmu::skills::SkillFishing) { + if (bslot >= EQ::invslot::GENERAL_BEGIN && Bait != nullptr && Bait->GetItem()->SkillModType == EQ::skills::SkillFishing) { fishing_skill += Bait->GetItem()->SkillModValue; } @@ -312,17 +345,17 @@ void Client::GoFish() food_id = (RuleB(Character, UseNoJunkFishing) ? 13019 : common_fish_ids[index]); } - const EQEmu::ItemData* food_item = database.GetItem(food_id); + const EQ::ItemData* food_item = database.GetItem(food_id); if (food_item) { - if (food_item->ItemType != EQEmu::item::ItemTypeFood) { + if (food_item->ItemType != EQ::item::ItemTypeFood) { MessageString(Chat::Skills, FISHING_SUCCESS); } else { MessageString(Chat::Skills, FISHING_SUCCESS_FISH_NAME, food_item->Name); } - EQEmu::ItemInstance* inst = database.CreateItem(food_item, 1); + EQ::ItemInstance* inst = database.CreateItem(food_item, 1); if (inst != nullptr) { if (CheckLoreConflict(inst->GetItem())) { @@ -332,16 +365,16 @@ void Client::GoFish() else { PushItemOnCursor(*inst); - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketLimbo); + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketLimbo); if (RuleB(TaskSystem, EnableTaskSystem)) UpdateTasksForItem(ActivityFish, food_id); safe_delete(inst); - inst = m_inv.GetItem(EQEmu::invslot::slotCursor); + inst = m_inv.GetItem(EQ::invslot::slotCursor); } if (inst) { - std::vector args; + std::vector args; args.push_back(inst); parse->EventPlayer(EVENT_FISH_SUCCESS, this, "", inst->GetID(), &args); } @@ -368,21 +401,26 @@ void Client::GoFish() //chance to break fishing pole... //this is potentially exploitable in that they can fish //and then swap out items in primary slot... too lazy to fix right now - if (zone->random.Int(0, 49) == 1) { - MessageString(Chat::Skills, FISHING_POLE_BROKE); //Your fishing pole broke! - DeleteItemInInventory(EQEmu::invslot::slotPrimary, 0, true); + const EQ::ItemInstance* Pole = m_inv[EQ::invslot::slotPrimary]; + + if (Pole) { + const EQ::ItemData* fishing_item = Pole->GetItem(); + if (fishing_item && fishing_item->SubType == 0 && zone->random.Int(0, 49) == 1) { + MessageString(Chat::Skills, FISHING_POLE_BROKE); //Your fishing pole broke! + DeleteItemInInventory(EQ::invslot::slotPrimary, 0, true); + } } - if (CheckIncreaseSkill(EQEmu::skills::SkillFishing, nullptr, 5)) + if (CheckIncreaseSkill(EQ::skills::SkillFishing, nullptr, 5)) { - if (title_manager.IsNewTradeSkillTitleAvailable(EQEmu::skills::SkillFishing, GetRawSkill(EQEmu::skills::SkillFishing))) + if (title_manager.IsNewTradeSkillTitleAvailable(EQ::skills::SkillFishing, GetRawSkill(EQ::skills::SkillFishing))) NotifyNewTitlesAvailable(); } } void Client::ForageItem(bool guarantee) { - int skill_level = GetSkill(EQEmu::skills::SkillForage); + int skill_level = GetSkill(EQ::skills::SkillForage); //be wary of the string ids in switch below when changing this. uint32 common_food_ids[MAX_COMMON_FOOD_IDS] = { @@ -412,7 +450,7 @@ void Client::ForageItem(bool guarantee) { foragedfood = common_food_ids[index]; } - const EQEmu::ItemData* food_item = database.GetItem(foragedfood); + const EQ::ItemData* food_item = database.GetItem(foragedfood); if(!food_item) { LogError("nullptr returned from database.GetItem in ClientForageItem"); @@ -423,10 +461,10 @@ void Client::ForageItem(bool guarantee) { stringid = FORAGE_GRUBS; else switch(food_item->ItemType) { - case EQEmu::item::ItemTypeFood: + case EQ::item::ItemTypeFood: stringid = FORAGE_FOOD; break; - case EQEmu::item::ItemTypeDrink: + case EQ::item::ItemTypeDrink: if(strstr(food_item->Name, "ater")) stringid = FORAGE_WATER; else @@ -437,7 +475,7 @@ void Client::ForageItem(bool guarantee) { } MessageString(Chat::Skills, stringid); - EQEmu::ItemInstance* inst = database.CreateItem(food_item, 1); + EQ::ItemInstance* inst = database.CreateItem(food_item, 1); if(inst != nullptr) { // check to make sure it isn't a foraged lore item if(CheckLoreConflict(inst->GetItem())) @@ -447,16 +485,16 @@ void Client::ForageItem(bool guarantee) { } else { PushItemOnCursor(*inst); - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketLimbo); + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketLimbo); if(RuleB(TaskSystem, EnableTaskSystem)) UpdateTasksForItem(ActivityForage, foragedfood); safe_delete(inst); - inst = m_inv.GetItem(EQEmu::invslot::slotCursor); + inst = m_inv.GetItem(EQ::invslot::slotCursor); } if(inst) { - std::vector args; + std::vector args; args.push_back(inst); parse->EventPlayer(EVENT_FORAGE_SUCCESS, this, "", inst->GetID(), &args); } @@ -473,7 +511,7 @@ void Client::ForageItem(bool guarantee) { parse->EventPlayer(EVENT_FORAGE_FAILURE, this, "", 0); } - CheckIncreaseSkill(EQEmu::skills::SkillForage, nullptr, 5); + CheckIncreaseSkill(EQ::skills::SkillForage, nullptr, 5); } diff --git a/zone/groups.cpp b/zone/groups.cpp index e29deca43..13188dcb9 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -18,6 +18,7 @@ #include "../common/global_define.h" #include "../common/eqemu_logsys.h" +#include "expedition.h" #include "masterentity.h" #include "npc_ai.h" #include "../common/packet_functions.h" @@ -407,7 +408,7 @@ void Group::SendHPManaEndPacketsTo(Mob *member) safe_delete_array(hpapp.pBuffer); hpapp.size = 0; - if (member->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (member->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobManaUpdate); MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer; @@ -438,7 +439,7 @@ void Group::SendHPPacketsFrom(Mob *member) for(i = 0; i < MAX_GROUP_MEMBERS; i++) { if(members[i] && members[i] != member && members[i]->IsClient()) { members[i]->CastToClient()->QueuePacket(&hp_app); - if (members[i]->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (members[i]->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobManaUpdate); MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer; mana_update->spawn_id = member->GetID(); @@ -463,7 +464,7 @@ void Group::SendManaPacketFrom(Mob *member) uint32 i; for (i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] && members[i] != member && members[i]->IsClient()) { - if (members[i]->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (members[i]->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobManaUpdate); MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer; mana_update->spawn_id = member->GetID(); @@ -484,7 +485,7 @@ void Group::SendEndurancePacketFrom(Mob* member) uint32 i; for (i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] && members[i] != member && members[i]->IsClient()) { - if (members[i]->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (members[i]->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD) { MobEnduranceUpdate_Struct *endurance_update = (MobEnduranceUpdate_Struct *)outapp.pBuffer; endurance_update->spawn_id = member->GetID(); endurance_update->endurance = member->GetEndurancePercent(); @@ -498,6 +499,9 @@ void Group::SendEndurancePacketFrom(Mob* member) //if the group was in the zone already bool Group::UpdatePlayer(Mob* update){ + if (!update) + return false; + bool updateSuccess = false; VerifyGroup(); @@ -621,7 +625,7 @@ bool Group::DelMemberOOZ(const char *Name) { if(GroupCount() < 3) { UnDelegateMarkNPC(NPCMarkerName.c_str()); - if (GetLeader() && GetLeader()->IsClient() && GetLeader()->CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoD) { + if (GetLeader() && GetLeader()->IsClient() && GetLeader()->CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoD) { UnDelegateMainAssist(MainAssistName.c_str()); } ClearAllNPCMarks(); @@ -786,7 +790,7 @@ bool Group::DelMember(Mob* oldmember, bool ignoresender) if(GroupCount() < 3) { UnDelegateMarkNPC(NPCMarkerName.c_str()); - if (GetLeader() && GetLeader()->IsClient() && GetLeader()->CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoD) { + if (GetLeader() && GetLeader()->IsClient() && GetLeader()->CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoD) { UnDelegateMainAssist(MainAssistName.c_str()); } ClearAllNPCMarks(); @@ -1002,14 +1006,14 @@ void Group::DisbandGroup(bool joinraid) { database.ClearGroup(GetID()); } - entity_list.RemoveGroup(GetID()); - if(Leader && (Leader->IsLFP())) { Leader->UpdateLFP(); } + SetLeader(nullptr); safe_delete(outapp); + entity_list.RemoveGroup(GetID()); } void Group::GetMemberList(std::list& member_list, bool clear_list) @@ -1682,7 +1686,7 @@ void Group::NotifyMainTank(Client *c, uint8 toggle) if(!MainTankName.size()) return; - if (c->ClientVersion() < EQEmu::versions::ClientVersion::SoD) + if (c->ClientVersion() < EQ::versions::ClientVersion::SoD) { if(toggle) c->Message(Chat::White, "%s is now Main Tank.", MainTankName.c_str()); @@ -1722,7 +1726,7 @@ void Group::NotifyMainAssist(Client *c, uint8 toggle) if(!MainAssistName.size()) return; - if (c->ClientVersion() < EQEmu::versions::ClientVersion::SoD) + if (c->ClientVersion() < EQ::versions::ClientVersion::SoD) { auto outapp = new EQApplicationPacket(OP_DelegateAbility, sizeof(DelegateAbility_Struct)); @@ -1777,7 +1781,7 @@ void Group::NotifyPuller(Client *c, uint8 toggle) if(!PullerName.size()) return; - if (c->ClientVersion() < EQEmu::versions::ClientVersion::SoD) + if (c->ClientVersion() < EQ::versions::ClientVersion::SoD) { if(toggle) c->Message(Chat::White, "%s is now Puller.", PullerName.c_str()); @@ -2343,7 +2347,7 @@ void Group::ChangeLeader(Mob* newleader) for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] && members[i]->IsClient()) { - if (members[i]->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (members[i]->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD) members[i]->CastToClient()->SendGroupLeaderChangePacket(newleader->GetName()); members[i]->CastToClient()->QueuePacket(outapp); @@ -2499,3 +2503,24 @@ void Group::QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_r } } } + +bool Group::DoesAnyMemberHaveExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, int max_check_count) +{ + if (max_check_count <= 0) + { + max_check_count = MAX_GROUP_MEMBERS; + } + + for (int i = 0; i < MAX_GROUP_MEMBERS && i < max_check_count; ++i) + { + if (membername[i][0]) + { + if (Expedition::HasLockoutByCharacterName(membername[i], expedition_name, event_name)) + { + return true; + } + } + } + return false; +} diff --git a/zone/groups.h b/zone/groups.h index 0d39409e0..57dfdbfb6 100644 --- a/zone/groups.h +++ b/zone/groups.h @@ -153,6 +153,8 @@ public: inline int GetMentorPercent() { return mentor_percent; } inline Client *GetMentoree() { return mentoree; } + bool DoesAnyMemberHaveExpeditionLockout(const std::string& expedition_name, const std::string& event_name, int max_check_count = 0); + Mob* members[MAX_GROUP_MEMBERS]; char membername[MAX_GROUP_MEMBERS][64]; uint8 MemberRoles[MAX_GROUP_MEMBERS]; diff --git a/zone/guild.cpp b/zone/guild.cpp index 324223acf..17ca7e61f 100644 --- a/zone/guild.cpp +++ b/zone/guild.cpp @@ -63,7 +63,7 @@ void Client::SendGuildMOTD(bool GetGuildMOTDReply) { void Client::SendGuildURL() { - if (ClientVersion() < EQEmu::versions::ClientVersion::SoF) + if (ClientVersion() < EQ::versions::ClientVersion::SoF) return; if(IsInAGuild()) @@ -85,7 +85,7 @@ void Client::SendGuildURL() void Client::SendGuildChannel() { - if (ClientVersion() < EQEmu::versions::ClientVersion::SoF) + if (ClientVersion() < EQ::versions::ClientVersion::SoF) return; if(IsInAGuild()) @@ -108,7 +108,7 @@ void Client::SendGuildChannel() void Client::SendGuildRanks() { - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) return; int permissions = 30 + 1; //Static number of permissions in all EQ clients as of May 2014 @@ -152,7 +152,7 @@ void Client::SendGuildSpawnAppearance() { uint8 rank = guild_mgr.GetDisplayedRank(GuildID(), GuildRank(), CharacterID()); LogGuilds("Sending spawn appearance for guild [{}] at rank [{}]", GuildID(), rank); SendAppearancePacket(AT_GuildID, GuildID()); - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { switch (rank) { case 0: { rank = 5; break; } // GUILD_MEMBER 0 @@ -253,7 +253,7 @@ void Client::RefreshGuildInfo() if((guild_id != OldGuildID) && GuildBanks) { // Unsure about this for RoF+ ... But they don't have that action anymore so fuck it - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) ClearGuildBank(); if(guild_id != GUILD_NONE) diff --git a/zone/guild_mgr.cpp b/zone/guild_mgr.cpp index 200f67d90..c63effea5 100644 --- a/zone/guild_mgr.cpp +++ b/zone/guild_mgr.cpp @@ -24,6 +24,7 @@ #include "guild_mgr.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" ZoneGuildManager guild_mgr; GuildBankManager *GuildBanks; @@ -322,7 +323,7 @@ void ZoneGuildManager::ProcessWorldPacket(ServerPacket *pack) { else if(c != nullptr && s->guild_id != GUILD_NONE) { //char is in zone, and has changed into a new guild, send MOTD. c->SendGuildMOTD(); - if (c->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (c->ClientVersion() >= EQ::versions::ClientVersion::RoF) { c->SendGuildRanks(); } @@ -690,10 +691,10 @@ void GuildBankManager::SendGuildBank(Client *c) auto &guild_bank = *Iterator; // RoF+ uses a bulk list packet -- This is also how the Action 0 of older clients basically works - if (c->ClientVersionBit() & EQEmu::versions::maskRoFAndLater) { + if (c->ClientVersionBit() & EQ::versions::maskRoFAndLater) { auto outapp = new EQApplicationPacket(OP_GuildBankItemList, sizeof(GuildBankItemListEntry_Struct) * 240); for (int i = 0; i < GUILD_BANK_DEPOSIT_AREA_SIZE; ++i) { - const EQEmu::ItemData *Item = database.GetItem(guild_bank->Items.DepositArea[i].ItemID); + const EQ::ItemData *Item = database.GetItem(guild_bank->Items.DepositArea[i].ItemID); if (Item) { outapp->WriteUInt8(1); outapp->WriteUInt32(guild_bank->Items.DepositArea[i].Permissions); @@ -717,7 +718,7 @@ void GuildBankManager::SendGuildBank(Client *c) outapp->SetWritePosition(outapp->GetWritePosition() + 20); // newer clients have 40 deposit slots, keep them 0 for now for (int i = 0; i < GUILD_BANK_MAIN_AREA_SIZE; ++i) { - const EQEmu::ItemData *Item = database.GetItem(guild_bank->Items.MainArea[i].ItemID); + const EQ::ItemData *Item = database.GetItem(guild_bank->Items.MainArea[i].ItemID); if (Item) { outapp->WriteUInt8(1); outapp->WriteUInt32(guild_bank->Items.MainArea[i].Permissions); @@ -748,7 +749,7 @@ void GuildBankManager::SendGuildBank(Client *c) { if(guild_bank->Items.DepositArea[i].ItemID > 0) { - const EQEmu::ItemData *Item = database.GetItem(guild_bank->Items.DepositArea[i].ItemID); + const EQ::ItemData *Item = database.GetItem(guild_bank->Items.DepositArea[i].ItemID); if(!Item) continue; @@ -784,7 +785,7 @@ void GuildBankManager::SendGuildBank(Client *c) { if(guild_bank->Items.MainArea[i].ItemID > 0) { - const EQEmu::ItemData *Item = database.GetItem(guild_bank->Items.MainArea[i].ItemID); + const EQ::ItemData *Item = database.GetItem(guild_bank->Items.MainArea[i].ItemID); if(!Item) continue; @@ -915,7 +916,7 @@ bool GuildBankManager::AddItem(uint32 GuildID, uint8 Area, uint32 ItemID, int32 return false; } - const EQEmu::ItemData *Item = database.GetItem(ItemID); + const EQ::ItemData *Item = database.GetItem(ItemID); GuildBankItemUpdate_Struct gbius; @@ -981,7 +982,7 @@ int GuildBankManager::Promote(uint32 guildID, int slotID) (*iter)->Items.DepositArea[slotID].ItemID = 0; - const EQEmu::ItemData *Item = database.GetItem((*iter)->Items.MainArea[mainSlot].ItemID); + const EQ::ItemData *Item = database.GetItem((*iter)->Items.MainArea[mainSlot].ItemID); GuildBankItemUpdate_Struct gbius; @@ -1037,7 +1038,7 @@ void GuildBankManager::SetPermissions(uint32 guildID, uint16 slotID, uint32 perm else (*iter)->Items.MainArea[slotID].WhoFor[0] = '\0'; - const EQEmu::ItemData *Item = database.GetItem((*iter)->Items.MainArea[slotID].ItemID); + const EQ::ItemData *Item = database.GetItem((*iter)->Items.MainArea[slotID].ItemID); GuildBankItemUpdate_Struct gbius; @@ -1061,7 +1062,7 @@ void GuildBankManager::SetPermissions(uint32 guildID, uint16 slotID, uint32 perm entity_list.QueueClientsGuildBankItemUpdate(&gbius, guildID); } -EQEmu::ItemInstance* GuildBankManager::GetItem(uint32 GuildID, uint16 Area, uint16 SlotID, uint32 Quantity) +EQ::ItemInstance* GuildBankManager::GetItem(uint32 GuildID, uint16 Area, uint16 SlotID, uint32 Quantity) { auto Iterator = GetGuildBank(GuildID); @@ -1070,7 +1071,7 @@ EQEmu::ItemInstance* GuildBankManager::GetItem(uint32 GuildID, uint16 Area, uint GuildBankItem* BankArea = nullptr; - EQEmu::ItemInstance* inst = nullptr; + EQ::ItemInstance* inst = nullptr; if(Area == GuildBankDepositArea) { @@ -1168,7 +1169,7 @@ bool GuildBankManager::DeleteItem(uint32 guildID, uint16 area, uint16 slotID, ui bool deleted = true; - const EQEmu::ItemData *Item = database.GetItem(BankArea[slotID].ItemID); + const EQ::ItemData *Item = database.GetItem(BankArea[slotID].ItemID); if(!Item->Stackable || (quantity >= BankArea[slotID].Quantity)) { std::string query = StringFormat("DELETE FROM `guild_bank` WHERE `guildid` = %i " @@ -1229,7 +1230,7 @@ bool GuildBankManager::MergeStacks(uint32 GuildID, uint16 SlotID) if(BankArea[SlotID].ItemID == 0) return false; - const EQEmu::ItemData *Item = database.GetItem(BankArea[SlotID].ItemID); + const EQ::ItemData *Item = database.GetItem(BankArea[SlotID].ItemID); if(!Item->Stackable) return false; @@ -1327,7 +1328,7 @@ bool GuildBankManager::SplitStack(uint32 GuildID, uint16 SlotID, uint32 Quantity if(BankArea[SlotID].Quantity <= Quantity || Quantity == 0) return false; - const EQEmu::ItemData *Item = database.GetItem(BankArea[SlotID].ItemID); + const EQ::ItemData *Item = database.GetItem(BankArea[SlotID].ItemID); if(!Item->Stackable) return false; diff --git a/zone/guild_mgr.h b/zone/guild_mgr.h index abd11fd9f..60f9ba98f 100644 --- a/zone/guild_mgr.h +++ b/zone/guild_mgr.h @@ -117,7 +117,7 @@ public: bool AddItem(uint32 GuildID, uint8 Area, uint32 ItemID, int32 QtyOrCharges, const char *Donator, uint8 Permissions, const char *WhoFor); int Promote(uint32 GuildID, int SlotID); void SetPermissions(uint32 GuildID, uint16 SlotID, uint32 Permissions, const char *MemberName); - EQEmu::ItemInstance* GetItem(uint32 GuildID, uint16 Area, uint16 SlotID, uint32 Quantity); + EQ::ItemInstance* GetItem(uint32 GuildID, uint16 Area, uint16 SlotID, uint32 Quantity); bool DeleteItem(uint32 GuildID, uint16 Area, uint16 SlotID, uint32 Quantity); bool HasItem(uint32 GuildID, uint32 ItemID); bool IsAreaFull(uint32 GuildID, uint16 Area); diff --git a/zone/hate_list.cpp b/zone/hate_list.cpp index 6b26cba8a..b4b6725bb 100644 --- a/zone/hate_list.cpp +++ b/zone/hate_list.cpp @@ -297,7 +297,7 @@ int HateList::GetHateRatio(Mob *top, Mob *other) if (!top_entry || top_entry->stored_hate_amount < 1) return 999; // shouldn't happen if you call it right :P - return EQEmu::Clamp(static_cast((other_entry->stored_hate_amount * 100) / top_entry->stored_hate_amount), 1, 999); + return EQ::Clamp(static_cast((other_entry->stored_hate_amount * 100) / top_entry->stored_hate_amount), 1, 999); } // skip is used to ignore a certain mob on the list @@ -675,10 +675,12 @@ int HateList::AreaRampage(Mob *caster, Mob *target, int count, ExtraAttackOption std::vector id_list; for (auto &h : list) { if (h->entity_on_hatelist && h->entity_on_hatelist != caster && h->entity_on_hatelist != target && - caster->CombatRange(h->entity_on_hatelist)) + caster->CombatRange(h->entity_on_hatelist, 1.0, true)) { id_list.push_back(h->entity_on_hatelist->GetID()); - if (count != -1 && id_list.size() > count) + } + if (count != -1 && id_list.size() > count) { break; + } } for (auto &id : id_list) { @@ -688,7 +690,6 @@ int HateList::AreaRampage(Mob *caster, Mob *target, int count, ExtraAttackOption caster->ProcessAttackRounds(mob, opts); } } - return hit_count; } @@ -784,3 +785,15 @@ void HateList::RemoveStaleEntries(int time_ms, float dist) } } +std::list HateList::GetHateListByDistance(int distance) +{ + std::list hate_list; + int squared_distance = (distance * distance); + for (auto hate_iterator : list) { + auto hate_entry = hate_iterator->entity_on_hatelist; + if (distance == 0 || (distance > 0 && DistanceSquaredNoZ(hate_owner->GetPosition(), hate_entry->GetPosition()) <= squared_distance)) { + hate_list.push_back(hate_iterator); + } + } + return hate_list; +} diff --git a/zone/hate_list.h b/zone/hate_list.h index 44613bdea..71c1f31cf 100644 --- a/zone/hate_list.h +++ b/zone/hate_list.h @@ -60,6 +60,7 @@ public: int32 GetEntHateAmount(Mob *ent, bool in_damage = false); std::list& GetHateList() { return list; } + std::list GetHateListByDistance(int distance = 0); void AddEntToHateList(Mob *ent, int32 in_hate = 0, int32 in_damage = 0, bool in_is_frenzied = false, bool add_to_hate_list_if_not_exist = true); void DoFactionHits(int32 npc_faction_level_id); diff --git a/zone/horse.cpp b/zone/horse.cpp index 0a23995ad..a31c58901 100644 --- a/zone/horse.cpp +++ b/zone/horse.cpp @@ -36,7 +36,7 @@ Horse::Horse(Client *_owner, uint16 spell_id, const glm::vec4& position) strn0cpy(name, _owner->GetCleanName(), 55); strcat(name,"`s_Mount00"); - IsHorse = true; + is_horse = true; owner = _owner; } diff --git a/zone/inventory.cpp b/zone/inventory.cpp index 3ee86df47..b3d3b6d2b 100644 --- a/zone/inventory.cpp +++ b/zone/inventory.cpp @@ -23,6 +23,7 @@ #include "quest_parser_collection.h" #include "worldserver.h" #include "zonedb.h" +#include "zone_store.h" extern WorldServer worldserver; @@ -31,11 +32,11 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { if (itemnum == 0) return 0; uint32 x = 0; - EQEmu::ItemInstance *cur = nullptr; + EQ::ItemInstance *cur = nullptr; int i; if(where_to_check & invWhereWorn) { - for (i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; i++) { + for (i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -50,18 +51,18 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { } if(where_to_check & invWhereCursor) { - if (GetItemIDAt(EQEmu::invslot::slotCursor) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(EQEmu::invslot::slotCursor) != INVALID_ID)) { - cur = m_inv.GetItem(EQEmu::invslot::slotCursor); + if (GetItemIDAt(EQ::invslot::slotCursor) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(EQ::invslot::slotCursor) != INVALID_ID)) { + cur = m_inv.GetItem(EQ::invslot::slotCursor); if(cur && cur->GetItem()->Stackable) { x += cur->GetCharges(); } else { x++; } - DeleteItemInInventory(EQEmu::invslot::slotCursor, 0, true); + DeleteItemInInventory(EQ::invslot::slotCursor, 0, true); } - for (i = EQEmu::invbag::CURSOR_BAG_BEGIN; i <= EQEmu::invbag::CURSOR_BAG_END; i++) { + for (i = EQ::invbag::CURSOR_BAG_BEGIN; i <= EQ::invbag::CURSOR_BAG_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -76,7 +77,7 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { } if(where_to_check & invWherePersonal) { - for (i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++) { + for (i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -89,7 +90,7 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { } } - for (i = EQEmu::invbag::GENERAL_BAGS_BEGIN; i <= EQEmu::invbag::GENERAL_BAGS_END; i++) { + for (i = EQ::invbag::GENERAL_BAGS_BEGIN; i <= EQ::invbag::GENERAL_BAGS_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -98,13 +99,13 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { x++; } - DeleteItemInInventory(i, 0, ((((uint64)1 << (EQEmu::invslot::GENERAL_BEGIN + ((i - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT))) & GetInv().GetLookup()->PossessionsBitmask) != 0)); + DeleteItemInInventory(i, 0, ((((uint64)1 << (EQ::invslot::GENERAL_BEGIN + ((i - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT))) & GetInv().GetLookup()->PossessionsBitmask) != 0)); } } } if(where_to_check & invWhereBank) { - for (i = EQEmu::invslot::BANK_BEGIN; i <= EQEmu::invslot::BANK_END; i++) { + for (i = EQ::invslot::BANK_BEGIN; i <= EQ::invslot::BANK_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -113,11 +114,11 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { x++; } - DeleteItemInInventory(i, 0, ((i - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank)); + DeleteItemInInventory(i, 0, ((i - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank)); } } - for (i = EQEmu::invbag::BANK_BAGS_BEGIN; i <= EQEmu::invbag::BANK_BAGS_END; i++) { + for (i = EQ::invbag::BANK_BAGS_BEGIN; i <= EQ::invbag::BANK_BAGS_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -126,13 +127,13 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { x++; } - DeleteItemInInventory(i, 0, (((i - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT) >= GetInv().GetLookup()->InventoryTypeSize.Bank)); + DeleteItemInInventory(i, 0, (((i - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT) >= GetInv().GetLookup()->InventoryTypeSize.Bank)); } } } if(where_to_check & invWhereSharedBank) { - for (i = EQEmu::invslot::SHARED_BANK_BEGIN; i <= EQEmu::invslot::SHARED_BANK_END; i++) { + for (i = EQ::invslot::SHARED_BANK_BEGIN; i <= EQ::invslot::SHARED_BANK_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -145,7 +146,7 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { } } - for (i = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN; i <= EQEmu::invbag::SHARED_BANK_BAGS_END; i++) { + for (i = EQ::invbag::SHARED_BANK_BAGS_BEGIN; i <= EQ::invbag::SHARED_BANK_BAGS_END; i++) { if (GetItemIDAt(i) == itemnum || (itemnum == 0xFFFE && GetItemIDAt(i) != INVALID_ID)) { cur = m_inv.GetItem(i); if(cur && cur->GetItem()->Stackable) { @@ -163,7 +164,7 @@ uint32 Client::NukeItem(uint32 itemnum, uint8 where_to_check) { } -bool Client::CheckLoreConflict(const EQEmu::ItemData* item) +bool Client::CheckLoreConflict(const EQ::ItemData* item) { if (!item) { return false; } if (!item->LoreFlag) { return false; } @@ -181,7 +182,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // TODO: update calling methods and script apis to handle a failure return - const EQEmu::ItemData* item = database.GetItem(item_id); + const EQ::ItemData* item = database.GetItem(item_id); // make sure the item exists if(item == nullptr) { @@ -222,7 +223,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, } */ - uint32 augments[EQEmu::invaug::SOCKET_COUNT] = { aug1, aug2, aug3, aug4, aug5, aug6 }; + uint32 augments[EQ::invaug::SOCKET_COUNT] = { aug1, aug2, aug3, aug4, aug5, aug6 }; uint32 classes = item->Classes; uint32 races = item->Races; @@ -231,9 +232,9 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, bool enforcewear = RuleB(Inventory, EnforceAugmentWear); bool enforcerestr = RuleB(Inventory, EnforceAugmentRestriction); bool enforceusable = RuleB(Inventory, EnforceAugmentUsability); - - for (int iter = EQEmu::invaug::SOCKET_BEGIN; iter <= EQEmu::invaug::SOCKET_END; ++iter) { - const EQEmu::ItemData* augtest = database.GetItem(augments[iter]); + + for (int iter = EQ::invaug::SOCKET_BEGIN; iter <= EQ::invaug::SOCKET_END; ++iter) { + const EQ::ItemData* augtest = database.GetItem(augments[iter]); if(augtest == nullptr) { if(augments[iter]) { @@ -249,7 +250,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, if(CheckLoreConflict(augtest)) { // DuplicateLoreMessage(augtest->ID); Message(Chat::Red, "You already have a lore %s (%u) in your inventory.", augtest->Name, augtest->ID); - + return false; } // check that augment is an actual augment @@ -257,7 +258,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, Message(Chat::Red, "%s (%u) (Aug%i) is not an actual augment.", augtest->Name, augtest->ID, iter + 1); LogInventory("Player [{}] on account [{}] attempted to use a non-augment item (Aug[{}]) as an augment.\n(Item: [{}], Aug1: [{}], Aug2: [{}], Aug3: [{}], Aug4: [{}], Aug5: [{}], Aug6: [{}])\n", GetName(), account_name, item->ID, (iter + 1), aug1, aug2, aug3, aug4, aug5, aug6); - + return false; } @@ -276,7 +277,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // check for augment type allowance if(enforcewear) { - if ((item->AugSlotType[iter] == EQEmu::item::AugTypeNone) || !(((uint32)1 << (item->AugSlotType[iter] - 1)) & augtest->AugType)) { + if ((item->AugSlotType[iter] == EQ::item::AugTypeNone) || !(((uint32)1 << (item->AugSlotType[iter] - 1)) & augtest->AugType)) { Message(Chat::Red, "Augment %u (Aug%i) is not acceptable wear on Item %u.", augments[iter], iter + 1, item->ID); LogInventory("Player [{}] on account [{}] attempted to augment an item with an unacceptable augment type (Aug[{}]).\n(Item: [{}], Aug1: [{}], Aug2: [{}], Aug3: [{}], Aug4: [{}], Aug5: [{}], Aug6: [{}])\n", GetName(), account_name, (iter + 1), item->ID, aug1, aug2, aug3, aug4, aug5, aug6); @@ -299,153 +300,153 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, uint8 it = item->ItemType; switch(augtest->AugRestrict) { - case EQEmu::item::AugRestrictionAny: + case EQ::item::AugRestrictionAny: break; - case EQEmu::item::AugRestrictionArmor: + case EQ::item::AugRestrictionArmor: switch(it) { - case EQEmu::item::ItemTypeArmor: + case EQ::item::ItemTypeArmor: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestrictionWeapons: + case EQ::item::AugRestrictionWeapons: switch(it) { - case EQEmu::item::ItemType1HSlash: - case EQEmu::item::ItemType1HBlunt: - case EQEmu::item::ItemType1HPiercing: - case EQEmu::item::ItemTypeMartial: - case EQEmu::item::ItemType2HSlash: - case EQEmu::item::ItemType2HBlunt: - case EQEmu::item::ItemType2HPiercing: - case EQEmu::item::ItemTypeBow: + case EQ::item::ItemType1HSlash: + case EQ::item::ItemType1HBlunt: + case EQ::item::ItemType1HPiercing: + case EQ::item::ItemTypeMartial: + case EQ::item::ItemType2HSlash: + case EQ::item::ItemType2HBlunt: + case EQ::item::ItemType2HPiercing: + case EQ::item::ItemTypeBow: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction1HWeapons: + case EQ::item::AugRestriction1HWeapons: switch(it) { - case EQEmu::item::ItemType1HSlash: - case EQEmu::item::ItemType1HBlunt: - case EQEmu::item::ItemType1HPiercing: - case EQEmu::item::ItemTypeMartial: + case EQ::item::ItemType1HSlash: + case EQ::item::ItemType1HBlunt: + case EQ::item::ItemType1HPiercing: + case EQ::item::ItemTypeMartial: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction2HWeapons: + case EQ::item::AugRestriction2HWeapons: switch(it) { - case EQEmu::item::ItemType2HSlash: - case EQEmu::item::ItemType2HBlunt: - case EQEmu::item::ItemType2HPiercing: - case EQEmu::item::ItemTypeBow: + case EQ::item::ItemType2HSlash: + case EQ::item::ItemType2HBlunt: + case EQ::item::ItemType2HPiercing: + case EQ::item::ItemTypeBow: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction1HSlash: + case EQ::item::AugRestriction1HSlash: switch(it) { - case EQEmu::item::ItemType1HSlash: + case EQ::item::ItemType1HSlash: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction1HBlunt: + case EQ::item::AugRestriction1HBlunt: switch(it) { - case EQEmu::item::ItemType1HBlunt: + case EQ::item::ItemType1HBlunt: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestrictionPiercing: + case EQ::item::AugRestrictionPiercing: switch(it) { - case EQEmu::item::ItemType1HPiercing: + case EQ::item::ItemType1HPiercing: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestrictionHandToHand: + case EQ::item::AugRestrictionHandToHand: switch(it) { - case EQEmu::item::ItemTypeMartial: + case EQ::item::ItemTypeMartial: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction2HSlash: + case EQ::item::AugRestriction2HSlash: switch(it) { - case EQEmu::item::ItemType2HSlash: + case EQ::item::ItemType2HSlash: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction2HBlunt: + case EQ::item::AugRestriction2HBlunt: switch(it) { - case EQEmu::item::ItemType2HBlunt: + case EQ::item::ItemType2HBlunt: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction2HPierce: + case EQ::item::AugRestriction2HPierce: switch(it) { - case EQEmu::item::ItemType2HPiercing: + case EQ::item::ItemType2HPiercing: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestrictionBows: + case EQ::item::AugRestrictionBows: switch(it) { - case EQEmu::item::ItemTypeBow: + case EQ::item::ItemTypeBow: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestrictionShields: + case EQ::item::AugRestrictionShields: switch(it) { - case EQEmu::item::ItemTypeShield: + case EQ::item::ItemTypeShield: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction1HSlash1HBluntOrHandToHand: + case EQ::item::AugRestriction1HSlash1HBluntOrHandToHand: switch(it) { - case EQEmu::item::ItemType1HSlash: - case EQEmu::item::ItemType1HBlunt: - case EQEmu::item::ItemTypeMartial: + case EQ::item::ItemType1HSlash: + case EQ::item::ItemType1HBlunt: + case EQ::item::ItemTypeMartial: break; default: restrictfail = true; break; } break; - case EQEmu::item::AugRestriction1HBluntOrHandToHand: + case EQ::item::AugRestriction1HBluntOrHandToHand: switch(it) { - case EQEmu::item::ItemType1HBlunt: - case EQEmu::item::ItemTypeMartial: + case EQ::item::ItemType1HBlunt: + case EQ::item::ItemTypeMartial: break; default: restrictfail = true; @@ -453,9 +454,9 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, } break; // These 3 are in-work - case EQEmu::item::AugRestrictionUnknown1: - case EQEmu::item::AugRestrictionUnknown2: - case EQEmu::item::AugRestrictionUnknown3: + case EQ::item::AugRestrictionUnknown1: + case EQ::item::AugRestrictionUnknown2: + case EQ::item::AugRestrictionUnknown3: default: restrictfail = true; break; @@ -504,7 +505,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // validation passed..so, set the charges and create the actual item // if the item is stackable and the charge amount is -1 or 0 then set to 1 charge. - // removed && item->MaxCharges == 0 if -1 or 0 was passed max charges is irrelevant + // removed && item->MaxCharges == 0 if -1 or 0 was passed max charges is irrelevant if(charges <= 0 && item->Stackable) charges = 1; @@ -514,7 +515,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // in any other situation just use charges as passed - EQEmu::ItemInstance* inst = database.CreateItem(item, charges); + EQ::ItemInstance* inst = database.CreateItem(item, charges); if(inst == nullptr) { Message(Chat::Red, "An unknown server error has occurred and your item was not created."); @@ -526,7 +527,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, } // add any validated augments - for (int iter = EQEmu::invaug::SOCKET_BEGIN; iter <= EQEmu::invaug::SOCKET_END; ++iter) { + for (int iter = EQ::invaug::SOCKET_BEGIN; iter <= EQ::invaug::SOCKET_END; ++iter) { if(augments[iter]) inst->PutAugment(&database, iter, augments[iter]); } @@ -534,13 +535,13 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, // attune item if(attuned && inst->GetItem()->Attuneable) inst->SetAttuned(true); - + inst->SetOrnamentIcon(ornament_icon); inst->SetOrnamentationIDFile(ornament_idfile); inst->SetOrnamentHeroModel(ornament_hero_model); // check to see if item is usable in requested slot - if (enforceusable && (to_slot >= EQEmu::invslot::EQUIPMENT_BEGIN && to_slot <= EQEmu::invslot::EQUIPMENT_END)) { + if (enforceusable && (to_slot >= EQ::invslot::EQUIPMENT_BEGIN && to_slot <= EQ::invslot::EQUIPMENT_END)) { uint32 slottest = to_slot; if(!(slots & ((uint32)1 << slottest))) { @@ -548,14 +549,14 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, LogInventory("Player [{}] on account [{}] attempted to equip an item unusable in slot [{}] - moved to cursor.\n(Item: [{}], Aug1: [{}], Aug2: [{}], Aug3: [{}], Aug4: [{}], Aug5: [{}], Aug6: [{}])\n", GetName(), account_name, to_slot, item->ID, aug1, aug2, aug3, aug4, aug5, aug6); - to_slot = EQEmu::invslot::slotCursor; + to_slot = EQ::invslot::slotCursor; } } // put item into inventory - if (to_slot == EQEmu::invslot::slotCursor) { + if (to_slot == EQ::invslot::slotCursor) { PushItemOnCursor(*inst); - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketLimbo); + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketLimbo); } else { PutItemInInventory(to_slot, *inst, true); @@ -569,7 +570,7 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2, DiscoverItem(item_id); /* // Augments should have been discovered prior to being placed on an item. - for (int iter = AUG_BEGIN; iter < EQEmu::constants::ITEM_COMMON_SIZE; ++iter) { + for (int iter = AUG_BEGIN; iter < EQ::constants::ITEM_COMMON_SIZE; ++iter) { if(augments[iter] && !IsDiscovered(augments[iter])) DiscoverItem(augments[iter]); } @@ -584,7 +585,7 @@ void Client::DropItem(int16 slot_id, bool recurse) { LogInventory("[{}] (char_id: [{}]) Attempting to drop item from slot [{}] on the ground", GetCleanName(), CharacterID(), slot_id); - + if(GetInv().CheckNoDrop(slot_id, recurse) && RuleI(World, FVNoDropFlag) == 0 || RuleI(Character, MinStatusForNoDropExemptions) < Admin() && RuleI(World, FVNoDropFlag) == 2) { @@ -617,7 +618,7 @@ void Client::DropItem(int16 slot_id, bool recurse) } // Take control of item in client inventory - EQEmu::ItemInstance *inst = m_inv.PopItem(slot_id); + EQ::ItemInstance *inst = m_inv.PopItem(slot_id); if(inst) { if (LogSys.log_settings[Logs::Inventory].is_category_enabled) { LogInventory("DropItem() Processing - full item parse:"); @@ -657,7 +658,7 @@ void Client::DropItem(int16 slot_id, bool recurse) } // Save client inventory change to database - if (slot_id == EQEmu::invslot::slotCursor) { + if (slot_id == EQ::invslot::slotCursor) { SendCursorBuffer(); auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); database.SaveCursor(CharacterID(), s, e); @@ -679,7 +680,7 @@ void Client::DropItem(int16 slot_id, bool recurse) safe_delete(inst); } -void Client::DropItemQS(EQEmu::ItemInstance* inst, bool pickup) { +void Client::DropItemQS(EQ::ItemInstance* inst, bool pickup) { if (RuleB(QueryServ, PlayerDropItems)) { QSPlayerDropItem_Struct qs_audit; std::list event_details; @@ -704,8 +705,8 @@ void Client::DropItemQS(EQEmu::ItemInstance* inst, bool pickup) { event_details.push_back(detail); if (inst->IsClassBag()) { - for (uint8 sub_slot = EQEmu::invbag::SLOT_BEGIN; (sub_slot <= EQEmu::invbag::SLOT_END); ++sub_slot) { // this is to catch ALL items - const EQEmu::ItemInstance* bag_inst = inst->GetItem(sub_slot); + for (uint8 sub_slot = EQ::invbag::SLOT_BEGIN; (sub_slot <= EQ::invbag::SLOT_END); ++sub_slot) { // this is to catch ALL items + const EQ::ItemInstance* bag_inst = inst->GetItem(sub_slot); if (bag_inst) { detail = new QSDropItems_Struct; detail->item_id = bag_inst->GetID(); @@ -748,7 +749,7 @@ void Client::DropItemQS(EQEmu::ItemInstance* inst, bool pickup) { } // Drop inst -void Client::DropInst(const EQEmu::ItemInstance* inst) +void Client::DropInst(const EQ::ItemInstance* inst) { if (!inst) { // Item doesn't exist in inventory! @@ -771,26 +772,26 @@ void Client::DropInst(const EQEmu::ItemInstance* inst) // Returns a slot's item ID (returns INVALID_ID if not found) int32 Client::GetItemIDAt(int16 slot_id) { - if (slot_id <= EQEmu::invslot::POSSESSIONS_END && slot_id >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (slot_id <= EQ::invslot::POSSESSIONS_END && slot_id >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask) == 0) return INVALID_ID; } - else if (slot_id <= EQEmu::invbag::GENERAL_BAGS_END && slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (slot_id <= EQ::invbag::GENERAL_BAGS_END && slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) == 0) return INVALID_ID; } - else if (slot_id <= EQEmu::invslot::BANK_END && slot_id >= EQEmu::invslot::BANK_BEGIN) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) + else if (slot_id <= EQ::invslot::BANK_END && slot_id >= EQ::invslot::BANK_BEGIN) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) return INVALID_ID; } - else if (slot_id <= EQEmu::invbag::BANK_BAGS_END && slot_id >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + else if (slot_id <= EQ::invbag::BANK_BAGS_END && slot_id >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= GetInv().GetLookup()->InventoryTypeSize.Bank) return INVALID_ID; } - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + const EQ::ItemInstance* inst = m_inv[slot_id]; if (inst) return inst->GetItem()->ID; @@ -801,26 +802,26 @@ int32 Client::GetItemIDAt(int16 slot_id) { // Returns an augment's ID that's in an item (returns INVALID_ID if not found) // Pass in the slot ID of the item and which augslot you want to check (0-5) int32 Client::GetAugmentIDAt(int16 slot_id, uint8 augslot) { - if (slot_id <= EQEmu::invslot::POSSESSIONS_END && slot_id >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (slot_id <= EQ::invslot::POSSESSIONS_END && slot_id >= EQ::invslot::POSSESSIONS_BEGIN) { if ((((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask) == 0) return INVALID_ID; } - else if (slot_id <= EQEmu::invbag::GENERAL_BAGS_END && slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (slot_id <= EQ::invbag::GENERAL_BAGS_END && slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) == 0) return INVALID_ID; } - else if (slot_id <= EQEmu::invslot::BANK_END && slot_id >= EQEmu::invslot::BANK_BEGIN) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) + else if (slot_id <= EQ::invslot::BANK_END && slot_id >= EQ::invslot::BANK_BEGIN) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) return INVALID_ID; } - else if (slot_id <= EQEmu::invbag::BANK_BAGS_END && slot_id >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + else if (slot_id <= EQ::invbag::BANK_BAGS_END && slot_id >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= GetInv().GetLookup()->InventoryTypeSize.Bank) return INVALID_ID; } - const EQEmu::ItemInstance* inst = m_inv[slot_id]; + const EQ::ItemInstance* inst = m_inv[slot_id]; if (inst && inst->GetAugmentItemID(augslot)) { return inst->GetAugmentItemID(augslot); } @@ -834,7 +835,7 @@ void Client::SendCursorBuffer() // Temporary work-around for the RoF+ Client Buffer // Instead of dealing with client moving items in cursor buffer, // we can just send the next item in the cursor buffer to the cursor. - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) { return; } + if (ClientVersion() < EQ::versions::ClientVersion::RoF) { return; } if (GetInv().CursorEmpty()) { return; } auto test_inst = GetInv().GetCursorItem(); @@ -855,11 +856,11 @@ void Client::SendCursorBuffer() GetName(), test_item->Name, test_item->ID); MessageString(Chat::Loot, 290); parse->EventItem(EVENT_DESTROY_ITEM, this, test_inst, nullptr, "", 0); - DeleteItemInInventory(EQEmu::invslot::slotCursor); + DeleteItemInInventory(EQ::invslot::slotCursor); SendCursorBuffer(); } else { - SendItemPacket(EQEmu::invslot::slotCursor, test_inst, ItemPacketLimbo); + SendItemPacket(EQ::invslot::slotCursor, test_inst, ItemPacketLimbo); } } @@ -912,11 +913,11 @@ void Client::DeleteItemInInventory(int16 slot_id, int8 quantity, bool client_upd qsaudit->items[parent_offset].aug_5 = m_inv[slot_id]->GetAugmentItemID(5); if (m_inv[slot_id]->IsClassBag()) { - for (uint8 bag_idx = EQEmu::invbag::SLOT_BEGIN; bag_idx < m_inv[slot_id]->GetItem()->BagSlots; bag_idx++) { - EQEmu::ItemInstance* bagitem = m_inv[slot_id]->GetItem(bag_idx); + for (uint8 bag_idx = EQ::invbag::SLOT_BEGIN; bag_idx < m_inv[slot_id]->GetItem()->BagSlots; bag_idx++) { + EQ::ItemInstance* bagitem = m_inv[slot_id]->GetItem(bag_idx); if(bagitem) { - int16 bagslot_id = EQEmu::InventoryProfile::CalcSlotId(slot_id, bag_idx); + int16 bagslot_id = EQ::InventoryProfile::CalcSlotId(slot_id, bag_idx); qsaudit->items[++parent_offset].char_slot = bagslot_id; qsaudit->items[parent_offset].item_id = bagitem->GetID(); @@ -937,8 +938,8 @@ void Client::DeleteItemInInventory(int16 slot_id, int8 quantity, bool client_upd bool isDeleted = m_inv.DeleteItem(slot_id, quantity); - const EQEmu::ItemInstance* inst = nullptr; - if (slot_id == EQEmu::invslot::slotCursor) { + const EQ::ItemInstance* inst = nullptr; + if (slot_id == EQ::invslot::slotCursor) { auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); if(update_db) database.SaveCursor(character_id, s, e); @@ -984,13 +985,13 @@ void Client::DeleteItemInInventory(int16 slot_id, int8 quantity, bool client_upd } } -bool Client::PushItemOnCursor(const EQEmu::ItemInstance& inst, bool client_update) +bool Client::PushItemOnCursor(const EQ::ItemInstance& inst, bool client_update) { LogInventory("Putting item [{}] ([{}]) on the cursor", inst.GetItem()->Name, inst.GetItem()->ID); m_inv.PushCursor(inst); if (client_update) { - SendItemPacket(EQEmu::invslot::slotCursor, &inst, ItemPacketLimbo); + SendItemPacket(EQ::invslot::slotCursor, &inst, ItemPacketLimbo); } auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); @@ -1001,10 +1002,10 @@ bool Client::PushItemOnCursor(const EQEmu::ItemInstance& inst, bool client_updat // Any items already there will be removed from user's inventory // (Also saves changes back to the database: this may be optimized in the future) // client_update: Sends packet to client -bool Client::PutItemInInventory(int16 slot_id, const EQEmu::ItemInstance& inst, bool client_update) { +bool Client::PutItemInInventory(int16 slot_id, const EQ::ItemInstance& inst, bool client_update) { LogInventory("Putting item [{}] ([{}]) into slot [{}]", inst.GetItem()->Name, inst.GetItem()->ID, slot_id); - if (slot_id == EQEmu::invslot::slotCursor) { // don't trust macros before conditional statements... + if (slot_id == EQ::invslot::slotCursor) { // don't trust macros before conditional statements... return PushItemOnCursor(inst, client_update); } else { @@ -1013,11 +1014,11 @@ bool Client::PutItemInInventory(int16 slot_id, const EQEmu::ItemInstance& inst, if (client_update) { - SendItemPacket(slot_id, &inst, ((slot_id == EQEmu::invslot::slotCursor) ? ItemPacketLimbo : ItemPacketTrade)); - //SendWearChange(EQEmu::InventoryProfile::CalcMaterialFromSlot(slot_id)); + SendItemPacket(slot_id, &inst, ((slot_id == EQ::invslot::slotCursor) ? ItemPacketLimbo : ItemPacketTrade)); + //SendWearChange(EQ::InventoryProfile::CalcMaterialFromSlot(slot_id)); } - - if (slot_id == EQEmu::invslot::slotCursor) { + + if (slot_id == EQ::invslot::slotCursor) { auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); return database.SaveCursor(this->CharacterID(), s, e); } @@ -1029,13 +1030,13 @@ bool Client::PutItemInInventory(int16 slot_id, const EQEmu::ItemInstance& inst, // a lot of wasted checks and calls coded above... } -void Client::PutLootInInventory(int16 slot_id, const EQEmu::ItemInstance &inst, ServerLootItem_Struct** bag_item_data) +void Client::PutLootInInventory(int16 slot_id, const EQ::ItemInstance &inst, ServerLootItem_Struct** bag_item_data) { LogInventory("Putting loot item [{}] ([{}]) into slot [{}]", inst.GetItem()->Name, inst.GetItem()->ID, slot_id); bool cursor_empty = m_inv.CursorEmpty(); - if (slot_id == EQEmu::invslot::slotCursor) { + if (slot_id == EQ::invslot::slotCursor) { m_inv.PushCursor(inst); auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); database.SaveCursor(this->CharacterID(), s, e); @@ -1046,21 +1047,21 @@ void Client::PutLootInInventory(int16 slot_id, const EQEmu::ItemInstance &inst, } // Subordinate items in cursor buffer must be sent via ItemPacketSummonItem or we just overwrite the visible cursor and desync the client - if (slot_id == EQEmu::invslot::slotCursor && !cursor_empty) { + if (slot_id == EQ::invslot::slotCursor && !cursor_empty) { // RoF+ currently has a specialized cursor handler - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendItemPacket(slot_id, &inst, ItemPacketLimbo); } else { SendLootItemInPacket(&inst, slot_id); } - + if (bag_item_data) { - for (int index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; ++index) { + for (int index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; ++index) { if (bag_item_data[index] == nullptr) continue; - const EQEmu::ItemInstance *bagitem = database.CreateItem( + const EQ::ItemInstance *bagitem = database.CreateItem( bag_item_data[index]->item_id, bag_item_data[index]->charges, bag_item_data[index]->aug_1, @@ -1074,14 +1075,14 @@ void Client::PutLootInInventory(int16 slot_id, const EQEmu::ItemInstance &inst, // Dump bag contents to cursor in the event that owning bag is not the first cursor item // (This assumes that the data passed is correctly associated..no safety checks are implemented) - if (slot_id == EQEmu::invslot::slotCursor && !cursor_empty) { + if (slot_id == EQ::invslot::slotCursor && !cursor_empty) { LogInventory("Putting bag loot item [{}] ([{}]) into slot [{}] (non-empty cursor override)", - inst.GetItem()->Name, inst.GetItem()->ID, EQEmu::invslot::slotCursor); + inst.GetItem()->Name, inst.GetItem()->ID, EQ::invslot::slotCursor); - PutLootInInventory(EQEmu::invslot::slotCursor, *bagitem); + PutLootInInventory(EQ::invslot::slotCursor, *bagitem); } else { - auto bag_slot = EQEmu::InventoryProfile::CalcSlotId(slot_id, index); + auto bag_slot = EQ::InventoryProfile::CalcSlotId(slot_id, index); LogInventory("Putting bag loot item [{}] ([{}]) into slot [{}] (bag slot [{}])", inst.GetItem()->Name, inst.GetItem()->ID, bag_slot, index); @@ -1094,16 +1095,16 @@ void Client::PutLootInInventory(int16 slot_id, const EQEmu::ItemInstance &inst, CalcBonuses(); } -bool Client::TryStacking(EQEmu::ItemInstance* item, uint8 type, bool try_worn, bool try_cursor) { +bool Client::TryStacking(EQ::ItemInstance* item, uint8 type, bool try_worn, bool try_cursor) { if(!item || !item->IsStackable() || item->GetCharges()>=item->GetItem()->StackSize) return false; int16 i; uint32 item_id = item->GetItem()->ID; - for (i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++) { + for (i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { if (((uint64)1 << i) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; - EQEmu::ItemInstance* tmp_inst = m_inv.GetItem(i); + EQ::ItemInstance* tmp_inst = m_inv.GetItem(i); if(tmp_inst && tmp_inst->GetItem()->ID == item_id && tmp_inst->GetCharges() < tmp_inst->GetItem()->StackSize){ MoveItemCharges(*item, i, type); CalcBonuses(); @@ -1113,13 +1114,13 @@ bool Client::TryStacking(EQEmu::ItemInstance* item, uint8 type, bool try_worn, b return true; } } - for (i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++) { + for (i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { if (((uint64)1 << i) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; - for (uint8 j = EQEmu::invbag::SLOT_BEGIN; j <= EQEmu::invbag::SLOT_END; j++) { - uint16 slotid = EQEmu::InventoryProfile::CalcSlotId(i, j); - EQEmu::ItemInstance* tmp_inst = m_inv.GetItem(slotid); + for (uint8 j = EQ::invbag::SLOT_BEGIN; j <= EQ::invbag::SLOT_END; j++) { + uint16 slotid = EQ::InventoryProfile::CalcSlotId(i, j); + EQ::ItemInstance* tmp_inst = m_inv.GetItem(slotid); if(tmp_inst && tmp_inst->GetItem()->ID == item_id && tmp_inst->GetCharges() < tmp_inst->GetItem()->StackSize) { MoveItemCharges(*item, slotid, type); @@ -1137,38 +1138,62 @@ bool Client::TryStacking(EQEmu::ItemInstance* item, uint8 type, bool try_worn, b // Locate an available space in inventory to place an item // and then put the item there // The change will be saved to the database -bool Client::AutoPutLootInInventory(EQEmu::ItemInstance& inst, bool try_worn, bool try_cursor, ServerLootItem_Struct** bag_item_data) +bool Client::AutoPutLootInInventory(EQ::ItemInstance& inst, bool try_worn, bool try_cursor, ServerLootItem_Struct** bag_item_data) { // #1: Try to auto equip - if (try_worn && inst.IsEquipable(GetBaseRace(), GetClass()) && inst.GetItem()->ReqLevel <= level && (!inst.GetItem()->Attuneable || inst.IsAttuned()) && inst.GetItem()->ItemType != EQEmu::item::ItemTypeAugmentation) { - for (int16 i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; i++) { + if (try_worn && inst.IsEquipable(GetBaseRace(), GetClass()) && inst.GetItem()->ReqLevel <= level && (!inst.GetItem()->Attuneable || inst.IsAttuned()) && inst.GetItem()->ItemType != EQ::item::ItemTypeAugmentation) { + for (int16 i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; i++) { if (((uint64)1 << i) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; if (!m_inv[i]) { - if (i == EQEmu::invslot::slotPrimary && inst.IsWeapon()) { // If item is primary slot weapon + if (i == EQ::invslot::slotPrimary && inst.IsWeapon()) { // If item is primary slot weapon if (inst.GetItem()->IsType2HWeapon()) { // and uses 2hs \ 2hb \ 2hp - if (m_inv[EQEmu::invslot::slotSecondary]) { // and if secondary slot is not empty + if (m_inv[EQ::invslot::slotSecondary]) { // and if secondary slot is not empty continue; // Can't auto-equip } } } - if (i == EQEmu::invslot::slotSecondary && m_inv[EQEmu::invslot::slotPrimary]) { // check to see if primary slot is a two hander - if (m_inv[EQEmu::invslot::slotPrimary]->GetItem()->IsType2HWeapon()) - continue; + if( i == EQ::invslot::slotPrimary && m_inv[EQ::invslot::slotSecondary] ) { + uint8 instrument = m_inv[EQ::invslot::slotSecondary]->GetItem()->ItemType; + if( + instrument == EQ::item::ItemTypeWindInstrument || + instrument == EQ::item::ItemTypeStringedInstrument || + instrument == EQ::item::ItemTypeBrassInstrument || + instrument == EQ::item::ItemTypePercussionInstrument + ) { + LogInventory("Cannot equip a primary item with [{}] already in the secondary.", m_inv[EQ::invslot::slotSecondary]->GetItem()->Name); + continue; // Do not auto-equip Primary when instrument is in Secondary + } } - if (i == EQEmu::invslot::slotSecondary && inst.IsWeapon() && !CanThisClassDualWield()) { + if (i == EQ::invslot::slotSecondary && m_inv[EQ::invslot::slotPrimary]) { // check to see if primary slot is a two hander + uint8 instrument = inst.GetItem()->ItemType; + if( + instrument == EQ::item::ItemTypeWindInstrument || + instrument == EQ::item::ItemTypeStringedInstrument || + instrument == EQ::item::ItemTypeBrassInstrument || + instrument == EQ::item::ItemTypePercussionInstrument + ) { + LogInventory("Cannot equip a secondary instrument with [{}] already in the primary.", m_inv[EQ::invslot::slotPrimary]->GetItem()->Name); + continue; // Do not auto-equip instrument in Secondary when Primary is equipped. + } + + uint8 use = m_inv[EQ::invslot::slotPrimary]->GetItem()->ItemType; + if(use == EQ::item::ItemType2HSlash || use == EQ::item::ItemType2HBlunt || use == EQ::item::ItemType2HPiercing) { + continue; + } + } + if (i == EQ::invslot::slotSecondary && inst.IsWeapon() && !CanThisClassDualWield()) { continue; } if (inst.IsEquipable(i)) { // Equippable at this slot? //send worn to everyone... PutLootInInventory(i, inst); - uint8 worn_slot_material = EQEmu::InventoryProfile::CalcMaterialFromSlot(i); - if (worn_slot_material != EQEmu::textures::materialInvalid) { + uint8 worn_slot_material = EQ::InventoryProfile::CalcMaterialFromSlot(i); + if (worn_slot_material != EQ::textures::materialInvalid) { SendWearChange(worn_slot_material); } - parse->EventItem(EVENT_EQUIP_ITEM, this, &inst, nullptr, "", i); return true; } @@ -1183,7 +1208,7 @@ bool Client::AutoPutLootInInventory(EQEmu::ItemInstance& inst, bool try_worn, bo } // #3: put it in inventory - bool is_arrow = (inst.GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false; + bool is_arrow = (inst.GetItem()->ItemType == EQ::item::ItemTypeArrow) ? true : false; int16 slot_id = m_inv.FindFreeSlot(inst.IsClassBag(), try_cursor, inst.GetItem()->Size, is_arrow); if (slot_id != INVALID_INDEX) { PutLootInInventory(slot_id, inst, bag_item_data); @@ -1194,9 +1219,9 @@ bool Client::AutoPutLootInInventory(EQEmu::ItemInstance& inst, bool try_worn, bo } // helper function for AutoPutLootInInventory -void Client::MoveItemCharges(EQEmu::ItemInstance &from, int16 to_slot, uint8 type) +void Client::MoveItemCharges(EQ::ItemInstance &from, int16 to_slot, uint8 type) { - EQEmu::ItemInstance *tmp_inst = m_inv.GetItem(to_slot); + EQ::ItemInstance *tmp_inst = m_inv.GetItem(to_slot); if(tmp_inst && tmp_inst->GetCharges() < tmp_inst->GetItem()->StackSize) { // this is how much room is left on the item we're stacking onto @@ -1208,7 +1233,7 @@ void Client::MoveItemCharges(EQEmu::ItemInstance &from, int16 to_slot, uint8 typ tmp_inst->SetCharges(tmp_inst->GetCharges() + charges_to_move); from.SetCharges(from.GetCharges() - charges_to_move); SendLootItemInPacket(tmp_inst, to_slot); - if (to_slot == EQEmu::invslot::slotCursor) { + if (to_slot == EQ::invslot::slotCursor) { auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); database.SaveCursor(this->CharacterID(), s, e); } @@ -1245,7 +1270,7 @@ bool MakeItemLink(char* &ret_link, const ItemData *item, uint32 aug0, uint32 aug //int hash = GetItemLinkHash(inst); //eventually this will work (currently crashes zone), but for now we'll skip the extra overhead int hash = NOT_USED; - + // Tested with UF and RoF..there appears to be a problem with using non-augment arguments below... // Currently, enabling them causes misalignments in what the client expects. I haven't looked // into it further to determine the cause..but, the function is setup to accept the parameters. @@ -1329,13 +1354,14 @@ bool MakeItemLink(char* &ret_link, const ItemData *item, uint32 aug0, uint32 aug } #endif -int Client::GetItemLinkHash(const EQEmu::ItemInstance* inst) { +int Client::GetItemLinkHash(const EQ::ItemInstance* inst) { +#if 0 //pre-Titanium: http://eqitems.13th-floor.org/phpBB2/viewtopic.php?t=70&postdays=0&postorder=asc //Titanium: http://eqitems.13th-floor.org/phpBB2/viewtopic.php?t=145 if (!inst) //have to have an item to make the hash return 0; - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); char* hash_str = 0; /*register */int hash = 0; @@ -1415,10 +1441,12 @@ int Client::GetItemLinkHash(const EQEmu::ItemInstance* inst) { safe_delete_array(hash_str); return hash; +#endif + return 0; } -// This appears to still be in use... The core of this should be incorporated into class EQEmu::SayLinkEngine -void Client::SendItemLink(const EQEmu::ItemInstance* inst, bool send_to_all) +// This appears to still be in use... The core of this should be incorporated into class EQ::SayLinkEngine +void Client::SendItemLink(const EQ::ItemInstance* inst, bool send_to_all) { /* @@ -1429,7 +1457,7 @@ packet with the item number in it, but I cant seem to find it right now if (!inst) return; - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); const char* name2 = &item->Name[0]; auto outapp = new EQApplicationPacket(OP_ItemLinkText, strlen(name2) + 68); char buffer2[135] = {0}; @@ -1458,35 +1486,35 @@ packet with the item number in it, but I cant seem to find it right now safe_delete(outapp); } -void Client::SendLootItemInPacket(const EQEmu::ItemInstance* inst, int16 slot_id) +void Client::SendLootItemInPacket(const EQ::ItemInstance* inst, int16 slot_id) { SendItemPacket(slot_id,inst, ItemPacketTrade); } bool Client::IsValidSlot(uint32 slot) { - if (slot <= EQEmu::invslot::POSSESSIONS_END && slot >= EQEmu::invslot::POSSESSIONS_BEGIN) { + if (slot <= EQ::invslot::POSSESSIONS_END && slot >= EQ::invslot::POSSESSIONS_BEGIN) { return ((((uint64)1 << slot) & GetInv().GetLookup()->PossessionsBitmask) != 0); } - else if (slot <= EQEmu::invbag::GENERAL_BAGS_END && slot >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + else if (slot <= EQ::invbag::GENERAL_BAGS_END && slot >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); return ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) != 0); } - else if (slot <= EQEmu::invslot::BANK_END && slot >= EQEmu::invslot::BANK_BEGIN) { - return ((slot - EQEmu::invslot::BANK_BEGIN) < GetInv().GetLookup()->InventoryTypeSize.Bank); + else if (slot <= EQ::invslot::BANK_END && slot >= EQ::invslot::BANK_BEGIN) { + return ((slot - EQ::invslot::BANK_BEGIN) < GetInv().GetLookup()->InventoryTypeSize.Bank); } - else if (slot <= EQEmu::invbag::BANK_BAGS_END && slot >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (slot - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + else if (slot <= EQ::invbag::BANK_BAGS_END && slot >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (slot - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; return (temp_slot < GetInv().GetLookup()->InventoryTypeSize.Bank); } else if ( (slot == (uint32)INVALID_INDEX) || - (slot == (uint32)EQEmu::invslot::slotCursor) || - (slot <= EQEmu::invbag::CURSOR_BAG_END && slot >= EQEmu::invbag::CURSOR_BAG_BEGIN) || - (slot <= EQEmu::invslot::TRIBUTE_END && slot >= EQEmu::invslot::TRIBUTE_BEGIN) || - (slot <= EQEmu::invslot::SHARED_BANK_END && slot >= EQEmu::invslot::SHARED_BANK_BEGIN) || - (slot <= EQEmu::invbag::SHARED_BANK_BAGS_END && slot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN) || - (slot <= EQEmu::invslot::TRADE_END && slot >= EQEmu::invslot::TRADE_BEGIN) || - (slot <= EQEmu::invslot::WORLD_END && slot >= EQEmu::invslot::WORLD_BEGIN) + (slot == (uint32)EQ::invslot::slotCursor) || + (slot <= EQ::invbag::CURSOR_BAG_END && slot >= EQ::invbag::CURSOR_BAG_BEGIN) || + (slot <= EQ::invslot::TRIBUTE_END && slot >= EQ::invslot::TRIBUTE_BEGIN) || + (slot <= EQ::invslot::SHARED_BANK_END && slot >= EQ::invslot::SHARED_BANK_BEGIN) || + (slot <= EQ::invbag::SHARED_BANK_BAGS_END && slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) || + (slot <= EQ::invslot::TRADE_END && slot >= EQ::invslot::TRADE_BEGIN) || + (slot <= EQ::invslot::WORLD_END && slot >= EQ::invslot::WORLD_BEGIN) ) { return true; } @@ -1496,10 +1524,10 @@ bool Client::IsValidSlot(uint32 slot) { bool Client::IsBankSlot(uint32 slot) { - if ((slot >= EQEmu::invslot::BANK_BEGIN && slot <= EQEmu::invslot::BANK_END) || - (slot >= EQEmu::invbag::BANK_BAGS_BEGIN && slot <= EQEmu::invbag::BANK_BAGS_END) || - (slot >= EQEmu::invslot::SHARED_BANK_BEGIN && slot <= EQEmu::invslot::SHARED_BANK_END) || - (slot >= EQEmu::invbag::SHARED_BANK_BAGS_BEGIN && slot <= EQEmu::invbag::SHARED_BANK_BAGS_END)) + if ((slot >= EQ::invslot::BANK_BEGIN && slot <= EQ::invslot::BANK_END) || + (slot >= EQ::invbag::BANK_BAGS_BEGIN && slot <= EQ::invbag::BANK_BAGS_END) || + (slot >= EQ::invslot::SHARED_BANK_BEGIN && slot <= EQ::invslot::SHARED_BANK_END) || + (slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN && slot <= EQ::invbag::SHARED_BANK_BAGS_END)) { return true; } @@ -1533,10 +1561,10 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { if (move_in->from_slot == move_in->to_slot) { // Item summon, no further processing needed if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) { return true; } // Can't do RoF+ + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { return true; } // Can't do RoF+ - if (move_in->to_slot == EQEmu::invslot::slotCursor) { - auto test_inst = m_inv.GetItem(EQEmu::invslot::slotCursor); + if (move_in->to_slot == EQ::invslot::slotCursor) { + auto test_inst = m_inv.GetItem(EQ::invslot::slotCursor); if (test_inst == nullptr) { return true; } auto test_item = test_inst->GetItem(); if (test_item == nullptr) { return true; } @@ -1555,18 +1583,18 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { GetName(), test_item->Name, test_item->ID); MessageString(Chat::Loot, 290); parse->EventItem(EVENT_DESTROY_ITEM, this, test_inst, nullptr, "", 0); - DeleteItemInInventory(EQEmu::invslot::slotCursor, 0, true); + DeleteItemInInventory(EQ::invslot::slotCursor, 0, true); } } return true; } if (move_in->to_slot == (uint32)INVALID_INDEX) { - if (move_in->from_slot == (uint32)EQEmu::invslot::slotCursor) { + if (move_in->from_slot == (uint32)EQ::invslot::slotCursor) { LogInventory("Client destroyed item from cursor slot [{}]", move_in->from_slot); if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit - EQEmu::ItemInstance *inst = m_inv.GetItem(EQEmu::invslot::slotCursor); + EQ::ItemInstance *inst = m_inv.GetItem(EQ::invslot::slotCursor); if(inst) { parse->EventItem(EVENT_DESTROY_ITEM, this, inst, nullptr, "", 0); } @@ -1585,9 +1613,9 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { } if (auto_attack) { - if (move_in->from_slot == EQEmu::invslot::slotPrimary || move_in->from_slot == EQEmu::invslot::slotSecondary || move_in->from_slot == EQEmu::invslot::slotRange) + if (move_in->from_slot == EQ::invslot::slotPrimary || move_in->from_slot == EQ::invslot::slotSecondary || move_in->from_slot == EQ::invslot::slotRange) SetAttackTimer(); - else if (move_in->to_slot == EQEmu::invslot::slotPrimary || move_in->to_slot == EQEmu::invslot::slotSecondary || move_in->to_slot == EQEmu::invslot::slotRange) + else if (move_in->to_slot == EQ::invslot::slotPrimary || move_in->to_slot == EQ::invslot::slotSecondary || move_in->to_slot == EQ::invslot::slotRange) SetAttackTimer(); } @@ -1601,11 +1629,10 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { if(!banker || distance > USE_NPC_RANGE2) { - char *hacked_string = nullptr; - MakeAnyLenString(&hacked_string, "Player tried to make use of a banker(items) but %s is non-existant or too far away (%u units).", - banker ? banker->GetName() : "UNKNOWN NPC", distance); + auto hacked_string = fmt::format("Player tried to make use of a banker(items) but {} is " + "non-existant or too far away ({} units).", + banker ? banker->GetName() : "UNKNOWN NPC", distance); database.SetMQDetectionFlag(AccountName(), GetName(), hacked_string, zone->GetShortName()); - safe_delete_array(hacked_string); Kick("Inventory desync"); // Kicking player to avoid item loss do to client and server inventories not being sync'd return false; } @@ -1614,8 +1641,8 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { //Setup uint32 srcitemid = 0; uint32 dstitemid = 0; - EQEmu::ItemInstance* src_inst = m_inv.GetItem(src_slot_id); - EQEmu::ItemInstance* dst_inst = m_inv.GetItem(dst_slot_id); + EQ::ItemInstance* src_inst = m_inv.GetItem(src_slot_id); + EQ::ItemInstance* dst_inst = m_inv.GetItem(dst_slot_id); if (src_inst){ LogInventory("Src slot [{}] has item [{}] ([{}]) with [{}] charges in it", src_slot_id, src_inst->GetItem()->Name, src_inst->GetItem()->ID, src_inst->GetCharges()); srcitemid = src_inst->GetItem()->ID; @@ -1631,17 +1658,17 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { dstitemid = dst_inst->GetItem()->ID; } if (Trader && srcitemid>0){ - EQEmu::ItemInstance* srcbag; - EQEmu::ItemInstance* dstbag; + EQ::ItemInstance* srcbag; + EQ::ItemInstance* dstbag; uint32 srcbagid =0; uint32 dstbagid = 0; - if (src_slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN && src_slot_id <= EQEmu::invbag::GENERAL_BAGS_END) { + if (src_slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN && src_slot_id <= EQ::invbag::GENERAL_BAGS_END) { srcbag = m_inv.GetItem(((int)(src_slot_id / 10)) - 3); if (srcbag) srcbagid = srcbag->GetItem()->ID; } - if (dst_slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN && dst_slot_id <= EQEmu::invbag::GENERAL_BAGS_END) { + if (dst_slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN && dst_slot_id <= EQ::invbag::GENERAL_BAGS_END) { dstbag = m_inv.GetItem(((int)(dst_slot_id / 10)) - 3); if (dstbag) dstbagid = dstbag->GetItem()->ID; @@ -1654,7 +1681,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { // Step 2: Validate item in from_slot // After this, we can assume src_inst is a valid ptr - if (!src_inst && (src_slot_id < EQEmu::invslot::WORLD_BEGIN || src_slot_id > EQEmu::invslot::WORLD_END)) { + if (!src_inst && (src_slot_id < EQ::invslot::WORLD_BEGIN || src_slot_id > EQ::invslot::WORLD_END)) { if (dst_inst) { // If there is no source item, but there is a destination item, // move the slots around before deleting the invalid source slot item, @@ -1668,32 +1695,32 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { return false; } //verify shared bank transactions in the database - if (src_inst && src_slot_id >= EQEmu::invslot::SHARED_BANK_BEGIN && src_slot_id <= EQEmu::invbag::SHARED_BANK_BAGS_END) { + if (src_inst && src_slot_id >= EQ::invslot::SHARED_BANK_BEGIN && src_slot_id <= EQ::invbag::SHARED_BANK_BAGS_END) { if(!database.VerifyInventory(account_id, src_slot_id, src_inst)) { LogError("Player [{}] on account [{}] was found exploiting the shared bank.\n", GetName(), account_name); DeleteItemInInventory(dst_slot_id,0,true); return(false); } - if (src_slot_id >= EQEmu::invslot::SHARED_BANK_BEGIN && src_slot_id <= EQEmu::invslot::SHARED_BANK_END && src_inst->IsClassBag()){ - for (uint8 idx = EQEmu::invbag::SLOT_BEGIN; idx <= EQEmu::invbag::SLOT_END; idx++) { - const EQEmu::ItemInstance* baginst = src_inst->GetItem(idx); - if (baginst && !database.VerifyInventory(account_id, EQEmu::InventoryProfile::CalcSlotId(src_slot_id, idx), baginst)){ - DeleteItemInInventory(EQEmu::InventoryProfile::CalcSlotId(src_slot_id, idx), 0, false); + if (src_slot_id >= EQ::invslot::SHARED_BANK_BEGIN && src_slot_id <= EQ::invslot::SHARED_BANK_END && src_inst->IsClassBag()){ + for (uint8 idx = EQ::invbag::SLOT_BEGIN; idx <= EQ::invbag::SLOT_END; idx++) { + const EQ::ItemInstance* baginst = src_inst->GetItem(idx); + if (baginst && !database.VerifyInventory(account_id, EQ::InventoryProfile::CalcSlotId(src_slot_id, idx), baginst)){ + DeleteItemInInventory(EQ::InventoryProfile::CalcSlotId(src_slot_id, idx), 0, false); } } } } - if (dst_inst && dst_slot_id >= EQEmu::invslot::SHARED_BANK_BEGIN && dst_slot_id <= EQEmu::invbag::SHARED_BANK_BAGS_END) { + if (dst_inst && dst_slot_id >= EQ::invslot::SHARED_BANK_BEGIN && dst_slot_id <= EQ::invbag::SHARED_BANK_BAGS_END) { if(!database.VerifyInventory(account_id, dst_slot_id, dst_inst)) { LogError("Player [{}] on account [{}] was found exploting the shared bank.\n", GetName(), account_name); DeleteItemInInventory(src_slot_id,0,true); return(false); } - if (dst_slot_id >= EQEmu::invslot::SHARED_BANK_BEGIN && dst_slot_id <= EQEmu::invslot::SHARED_BANK_END && dst_inst->IsClassBag()){ - for (uint8 idx = EQEmu::invbag::SLOT_BEGIN; idx <= EQEmu::invbag::SLOT_END; idx++) { - const EQEmu::ItemInstance* baginst = dst_inst->GetItem(idx); - if (baginst && !database.VerifyInventory(account_id, EQEmu::InventoryProfile::CalcSlotId(dst_slot_id, idx), baginst)){ - DeleteItemInInventory(EQEmu::InventoryProfile::CalcSlotId(dst_slot_id, idx), 0, false); + if (dst_slot_id >= EQ::invslot::SHARED_BANK_BEGIN && dst_slot_id <= EQ::invslot::SHARED_BANK_END && dst_inst->IsClassBag()){ + for (uint8 idx = EQ::invbag::SLOT_BEGIN; idx <= EQ::invbag::SLOT_END; idx++) { + const EQ::ItemInstance* baginst = dst_inst->GetItem(idx); + if (baginst && !database.VerifyInventory(account_id, EQ::InventoryProfile::CalcSlotId(dst_slot_id, idx), baginst)){ + DeleteItemInInventory(EQ::InventoryProfile::CalcSlotId(dst_slot_id, idx), 0, false); } } } @@ -1702,14 +1729,14 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { // Check for No Drop Hacks Mob* with = trade->With(); - if (((with && with->IsClient() && dst_slot_id >= EQEmu::invslot::TRADE_BEGIN && dst_slot_id <= EQEmu::invslot::TRADE_END) || - (dst_slot_id >= EQEmu::invslot::SHARED_BANK_BEGIN && dst_slot_id <= EQEmu::invbag::SHARED_BANK_BAGS_END)) + if (((with && with->IsClient() && dst_slot_id >= EQ::invslot::TRADE_BEGIN && dst_slot_id <= EQ::invslot::TRADE_END) || + (dst_slot_id >= EQ::invslot::SHARED_BANK_BEGIN && dst_slot_id <= EQ::invbag::SHARED_BANK_BAGS_END)) && GetInv().CheckNoDrop(src_slot_id) && RuleI(World, FVNoDropFlag) == 0 || RuleI(Character, MinStatusForNoDropExemptions) < Admin() && RuleI(World, FVNoDropFlag) == 2) { auto ndh_inst = m_inv[src_slot_id]; std::string ndh_item_data; if (ndh_inst == nullptr) { - ndh_item_data.append("[nullptr on EQEmu::ItemInstance*]"); + ndh_item_data.append("[nullptr on EQ::ItemInstance*]"); } else { auto ndh_item = ndh_inst->GetItem(); @@ -1733,9 +1760,9 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { // Step 3: Check for interaction with World Container (tradeskills) if(m_tradeskill_object != nullptr) { - if (src_slot_id >= EQEmu::invslot::WORLD_BEGIN && src_slot_id <= EQEmu::invslot::WORLD_END) { + if (src_slot_id >= EQ::invslot::WORLD_BEGIN && src_slot_id <= EQ::invslot::WORLD_END) { // Picking up item from world container - EQEmu::ItemInstance* inst = m_tradeskill_object->PopItem(EQEmu::InventoryProfile::CalcBagIdx(src_slot_id)); + EQ::ItemInstance* inst = m_tradeskill_object->PopItem(EQ::InventoryProfile::CalcBagIdx(src_slot_id)); if (inst) { PutItemInInventory(dst_slot_id, *inst, false); safe_delete(inst); @@ -1745,10 +1772,10 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { return true; } - else if (dst_slot_id >= EQEmu::invslot::WORLD_BEGIN && dst_slot_id <= EQEmu::invslot::WORLD_END) { + else if (dst_slot_id >= EQ::invslot::WORLD_BEGIN && dst_slot_id <= EQ::invslot::WORLD_END) { // Putting item into world container, which may swap (or pile onto) with existing item - uint8 world_idx = EQEmu::InventoryProfile::CalcBagIdx(dst_slot_id); - EQEmu::ItemInstance* world_inst = m_tradeskill_object->PopItem(world_idx); + uint8 world_idx = EQ::InventoryProfile::CalcBagIdx(dst_slot_id); + EQ::ItemInstance* world_inst = m_tradeskill_object->PopItem(world_idx); // Case 1: No item in container, unidirectional "Put" if (world_inst == nullptr) { @@ -1756,8 +1783,8 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { m_inv.DeleteItem(src_slot_id); } else { - const EQEmu::ItemData* world_item = world_inst->GetItem(); - const EQEmu::ItemData* src_item = src_inst->GetItem(); + const EQ::ItemData* world_item = world_inst->GetItem(); + const EQ::ItemData* src_item = src_inst->GetItem(); if (world_item && src_item) { // Case 2: Same item on cursor, stacks, transfer of charges needed if ((world_item->ID == src_item->ID) && src_inst->IsStackable()) { @@ -1788,7 +1815,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { else { // Case 3: Swap the item on user with item in world container // World containers don't follow normal rules for swapping - EQEmu::ItemInstance* inv_inst = m_inv.PopItem(src_slot_id); + EQ::ItemInstance* inv_inst = m_inv.PopItem(src_slot_id); m_tradeskill_object->PutItem(world_idx, inv_inst); m_inv.PutItem(src_slot_id, *world_inst); safe_delete(inv_inst); @@ -1797,7 +1824,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { } safe_delete(world_inst); - if (src_slot_id == EQEmu::invslot::slotCursor) + if (src_slot_id == EQ::invslot::slotCursor) { if (dstitemid == 0) { @@ -1818,15 +1845,15 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { } // Step 4: Check for entity trade - if (dst_slot_id >= EQEmu::invslot::TRADE_BEGIN && dst_slot_id <= EQEmu::invslot::TRADE_END) { - if (src_slot_id != EQEmu::invslot::slotCursor) { + if (dst_slot_id >= EQ::invslot::TRADE_BEGIN && dst_slot_id <= EQ::invslot::TRADE_END) { + if (src_slot_id != EQ::invslot::slotCursor) { Kick("Trade with non-cursor item"); return false; } if (with) { LogInventory("Trade item move from slot [{}] to slot [{}] (trade with [{}])", src_slot_id, dst_slot_id, with->GetName()); // Fill Trade list with items from cursor - if (!m_inv[EQEmu::invslot::slotCursor]) { + if (!m_inv[EQ::invslot::slotCursor]) { Message(Chat::Red, "Error: Cursor item not located on server!"); return false; } @@ -1846,7 +1873,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { if(RuleB(QueryServ, PlayerLogMoves)) { QSSwapItemAuditor(move_in); } // QS Audit SummonItem(src_inst->GetID(), src_inst->GetCharges()); - DeleteItemInInventory(EQEmu::invslot::slotCursor); + DeleteItemInInventory(EQ::invslot::slotCursor); return true; } @@ -1896,7 +1923,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { // Nothing in destination slot: split stack into two if ((int16)move_in->number_in_stack >= src_inst->GetCharges()) { // Move entire stack - EQEmu::InventoryProfile::SwapItemFailState fail_state = EQEmu::InventoryProfile::swapInvalid; + EQ::InventoryProfile::SwapItemFailState fail_state = EQ::InventoryProfile::swapInvalid; if (!m_inv.SwapItem(src_slot_id, dst_slot_id, fail_state)) { return false; } LogInventory("Move entire stack from [{}] to [{}] with stack size [{}]. Dest empty", src_slot_id, dst_slot_id, move_in->number_in_stack); } @@ -1904,7 +1931,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { // Split into two src_inst->SetCharges(src_inst->GetCharges() - move_in->number_in_stack); LogInventory("Split stack of [{}] ([{}]) from slot [{}] to [{}] with stack size [{}]. Src keeps [{}]", src_inst->GetItem()->Name, src_inst->GetItem()->ID, src_slot_id, dst_slot_id, move_in->number_in_stack, src_inst->GetCharges()); - EQEmu::ItemInstance* inst = database.CreateItem(src_inst->GetItem(), move_in->number_in_stack); + EQ::ItemInstance* inst = database.CreateItem(src_inst->GetItem(), move_in->number_in_stack); m_inv.PutItem(dst_slot_id, *inst); safe_delete(inst); } @@ -1912,12 +1939,12 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { } else { // Not dealing with charges - just do direct swap - if (src_inst && (dst_slot_id <= EQEmu::invslot::EQUIPMENT_END) && dst_slot_id >= EQEmu::invslot::EQUIPMENT_BEGIN) { + if (src_inst && (dst_slot_id <= EQ::invslot::EQUIPMENT_END) && dst_slot_id >= EQ::invslot::EQUIPMENT_BEGIN) { if (src_inst->GetItem()->Attuneable) { src_inst->SetAttuned(true); } if (src_inst->IsAugmented()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { if (src_inst->GetAugment(i)) { if (src_inst->GetAugment(i)->GetItem()->Attuneable) { src_inst->GetAugment(i)->SetAttuned(true); @@ -1928,14 +1955,14 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { SetMaterial(dst_slot_id,src_inst->GetItem()->ID); } - EQEmu::InventoryProfile::SwapItemFailState fail_state = EQEmu::InventoryProfile::swapInvalid; + EQ::InventoryProfile::SwapItemFailState fail_state = EQ::InventoryProfile::swapInvalid; if (!m_inv.SwapItem(src_slot_id, dst_slot_id, fail_state, GetBaseRace(), GetBaseClass(), GetDeity(), GetLevel())) { const char* fail_message = "The selected slot was invalid."; - if (fail_state == EQEmu::InventoryProfile::swapRaceClass || fail_state == EQEmu::InventoryProfile::swapDeity) + if (fail_state == EQ::InventoryProfile::swapRaceClass || fail_state == EQ::InventoryProfile::swapDeity) fail_message = "Your class, deity and/or race may not equip that item."; - else if (fail_state == EQEmu::InventoryProfile::swapLevel) + else if (fail_state == EQ::InventoryProfile::swapLevel) fail_message = "You are not sufficient level to use this item."; - + if (fail_message) Message(Chat::Red, "%s", fail_message); @@ -1944,7 +1971,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { LogInventory("Moving entire item from slot [{}] to slot [{}]", src_slot_id, dst_slot_id); - if (src_slot_id <= EQEmu::invslot::EQUIPMENT_END) { + if (src_slot_id <= EQ::invslot::EQUIPMENT_END) { if(src_inst) { parse->EventItem(EVENT_UNEQUIP_ITEM, this, src_inst, nullptr, "", src_slot_id); } @@ -1954,7 +1981,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { } } - if (dst_slot_id <= EQEmu::invslot::EQUIPMENT_END) { + if (dst_slot_id <= EQ::invslot::EQUIPMENT_END) { if(dst_inst) { parse->EventItem(EVENT_UNEQUIP_ITEM, this, dst_inst, nullptr, "", dst_slot_id); } @@ -1966,12 +1993,12 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { } int matslot = SlotConvert2(dst_slot_id); - if (dst_slot_id <= EQEmu::invslot::EQUIPMENT_END && matslot != EQEmu::textures::armorHead) { // think this is to allow the client to update with /showhelm + if (dst_slot_id <= EQ::invslot::EQUIPMENT_END && matslot != EQ::textures::armorHead) { // think this is to allow the client to update with /showhelm SendWearChange(matslot); } // Step 7: Save change to the database - if (src_slot_id == EQEmu::invslot::slotCursor) { + if (src_slot_id == EQ::invslot::slotCursor) { // If not swapping another item to cursor and stacking items were depleted if (dstitemid == 0 || all_to_stack == true) { @@ -1984,7 +2011,7 @@ bool Client::SwapItem(MoveItem_Struct* move_in) { database.SaveInventory(character_id, m_inv.GetItem(src_slot_id), src_slot_id); } - if (dst_slot_id == EQEmu::invslot::slotCursor) { + if (dst_slot_id == EQ::invslot::slotCursor) { auto s = m_inv.cursor_cbegin(), e = m_inv.cursor_cend(); database.SaveCursor(character_id, s, e); } @@ -2008,12 +2035,12 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) { LogInventory("Inventory desyncronization. (charname: [{}], source: [{}], destination: [{}])", GetName(), move_slots->from_slot, move_slots->to_slot); Message(Chat::Yellow, "Inventory Desyncronization detected: Resending slot data..."); - if (move_slots->from_slot >= EQEmu::invslot::EQUIPMENT_BEGIN && move_slots->from_slot <= EQEmu::invbag::CURSOR_BAG_END) { - int16 resync_slot = (EQEmu::InventoryProfile::CalcSlotId(move_slots->from_slot) == INVALID_INDEX) ? move_slots->from_slot : EQEmu::InventoryProfile::CalcSlotId(move_slots->from_slot); + if (move_slots->from_slot >= EQ::invslot::EQUIPMENT_BEGIN && move_slots->from_slot <= EQ::invbag::CURSOR_BAG_END) { + int16 resync_slot = (EQ::InventoryProfile::CalcSlotId(move_slots->from_slot) == INVALID_INDEX) ? move_slots->from_slot : EQ::InventoryProfile::CalcSlotId(move_slots->from_slot); if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) { // This prevents the client from crashing when closing any 'phantom' bags - const EQEmu::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' - EQEmu::ItemInstance* token_inst = database.CreateItem(token_struct, 1); + const EQ::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' + EQ::ItemInstance* token_inst = database.CreateItem(token_struct, 1); SendItemPacket(resync_slot, token_inst, ItemPacketTrade); @@ -2034,11 +2061,11 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) { else { Message(Chat::Red, "Could not resyncronize source slot %i.", move_slots->from_slot); } } else { - int16 resync_slot = (EQEmu::InventoryProfile::CalcSlotId(move_slots->from_slot) == INVALID_INDEX) ? move_slots->from_slot : EQEmu::InventoryProfile::CalcSlotId(move_slots->from_slot); + int16 resync_slot = (EQ::InventoryProfile::CalcSlotId(move_slots->from_slot) == INVALID_INDEX) ? move_slots->from_slot : EQ::InventoryProfile::CalcSlotId(move_slots->from_slot); if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) { if(m_inv[resync_slot]) { - const EQEmu::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' - EQEmu::ItemInstance* token_inst = database.CreateItem(token_struct, 1); + const EQ::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' + EQ::ItemInstance* token_inst = database.CreateItem(token_struct, 1); SendItemPacket(resync_slot, token_inst, ItemPacketTrade); SendItemPacket(resync_slot, m_inv[resync_slot], ItemPacketTrade); @@ -2051,11 +2078,11 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) { else { Message(Chat::Red, "Could not resyncronize source slot %i.", move_slots->from_slot); } } - if (move_slots->to_slot >= EQEmu::invslot::EQUIPMENT_BEGIN && move_slots->to_slot <= EQEmu::invbag::CURSOR_BAG_END) { - int16 resync_slot = (EQEmu::InventoryProfile::CalcSlotId(move_slots->to_slot) == INVALID_INDEX) ? move_slots->to_slot : EQEmu::InventoryProfile::CalcSlotId(move_slots->to_slot); + if (move_slots->to_slot >= EQ::invslot::EQUIPMENT_BEGIN && move_slots->to_slot <= EQ::invbag::CURSOR_BAG_END) { + int16 resync_slot = (EQ::InventoryProfile::CalcSlotId(move_slots->to_slot) == INVALID_INDEX) ? move_slots->to_slot : EQ::InventoryProfile::CalcSlotId(move_slots->to_slot); if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) { - const EQEmu::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' - EQEmu::ItemInstance* token_inst = database.CreateItem(token_struct, 1); + const EQ::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' + EQ::ItemInstance* token_inst = database.CreateItem(token_struct, 1); SendItemPacket(resync_slot, token_inst, ItemPacketTrade); @@ -2076,11 +2103,11 @@ void Client::SwapItemResync(MoveItem_Struct* move_slots) { else { Message(Chat::Red, "Could not resyncronize destination slot %i.", move_slots->to_slot); } } else { - int16 resync_slot = (EQEmu::InventoryProfile::CalcSlotId(move_slots->to_slot) == INVALID_INDEX) ? move_slots->to_slot : EQEmu::InventoryProfile::CalcSlotId(move_slots->to_slot); + int16 resync_slot = (EQ::InventoryProfile::CalcSlotId(move_slots->to_slot) == INVALID_INDEX) ? move_slots->to_slot : EQ::InventoryProfile::CalcSlotId(move_slots->to_slot); if (IsValidSlot(resync_slot) && resync_slot != INVALID_INDEX) { if(m_inv[resync_slot]) { - const EQEmu::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' - EQEmu::ItemInstance* token_inst = database.CreateItem(token_struct, 1); + const EQ::ItemData* token_struct = database.GetItem(22292); // 'Copper Coin' + EQ::ItemInstance* token_inst = database.CreateItem(token_struct, 1); SendItemPacket(resync_slot, token_inst, ItemPacketTrade); SendItemPacket(resync_slot, m_inv[resync_slot], ItemPacketTrade); @@ -2119,7 +2146,7 @@ void Client::QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call) { move_count = 0; - const EQEmu::ItemInstance* from_inst = m_inv[postaction_call?to_slot_id:from_slot_id]; + const EQ::ItemInstance* from_inst = m_inv[postaction_call?to_slot_id:from_slot_id]; if(from_inst) { qsaudit->items[move_count].from_slot = from_slot_id; @@ -2132,13 +2159,13 @@ void Client::QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call) { qsaudit->items[move_count].aug_4 = from_inst->GetAugmentItemID(4); qsaudit->items[move_count++].aug_5 = from_inst->GetAugmentItemID(5); - if (from_inst->IsType(EQEmu::item::ItemClassBag)) { - for (uint8 bag_idx = EQEmu::invbag::SLOT_BEGIN; bag_idx < from_inst->GetItem()->BagSlots; bag_idx++) { - const EQEmu::ItemInstance* from_baginst = from_inst->GetItem(bag_idx); + if (from_inst->IsType(EQ::item::ItemClassBag)) { + for (uint8 bag_idx = EQ::invbag::SLOT_BEGIN; bag_idx < from_inst->GetItem()->BagSlots; bag_idx++) { + const EQ::ItemInstance* from_baginst = from_inst->GetItem(bag_idx); if(from_baginst) { - qsaudit->items[move_count].from_slot = EQEmu::InventoryProfile::CalcSlotId(from_slot_id, bag_idx); - qsaudit->items[move_count].to_slot = EQEmu::InventoryProfile::CalcSlotId(to_slot_id, bag_idx); + qsaudit->items[move_count].from_slot = EQ::InventoryProfile::CalcSlotId(from_slot_id, bag_idx); + qsaudit->items[move_count].to_slot = EQ::InventoryProfile::CalcSlotId(to_slot_id, bag_idx); qsaudit->items[move_count].item_id = from_baginst->GetID(); qsaudit->items[move_count].charges = from_baginst->GetCharges(); qsaudit->items[move_count].aug_1 = from_baginst->GetAugmentItemID(1); @@ -2152,7 +2179,7 @@ void Client::QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call) { } if(to_slot_id != from_slot_id) { - const EQEmu::ItemInstance* to_inst = m_inv[postaction_call?from_slot_id:to_slot_id]; + const EQ::ItemInstance* to_inst = m_inv[postaction_call?from_slot_id:to_slot_id]; if(to_inst) { qsaudit->items[move_count].from_slot = to_slot_id; @@ -2165,13 +2192,13 @@ void Client::QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call) { qsaudit->items[move_count].aug_4 = to_inst->GetAugmentItemID(4); qsaudit->items[move_count++].aug_5 = to_inst->GetAugmentItemID(5); - if (to_inst->IsType(EQEmu::item::ItemClassBag)) { - for (uint8 bag_idx = EQEmu::invbag::SLOT_BEGIN; bag_idx < to_inst->GetItem()->BagSlots; bag_idx++) { - const EQEmu::ItemInstance* to_baginst = to_inst->GetItem(bag_idx); + if (to_inst->IsType(EQ::item::ItemClassBag)) { + for (uint8 bag_idx = EQ::invbag::SLOT_BEGIN; bag_idx < to_inst->GetItem()->BagSlots; bag_idx++) { + const EQ::ItemInstance* to_baginst = to_inst->GetItem(bag_idx); if(to_baginst) { - qsaudit->items[move_count].from_slot = EQEmu::InventoryProfile::CalcSlotId(to_slot_id, bag_idx); - qsaudit->items[move_count].to_slot = EQEmu::InventoryProfile::CalcSlotId(from_slot_id, bag_idx); + qsaudit->items[move_count].from_slot = EQ::InventoryProfile::CalcSlotId(to_slot_id, bag_idx); + qsaudit->items[move_count].to_slot = EQ::InventoryProfile::CalcSlotId(from_slot_id, bag_idx); qsaudit->items[move_count].item_id = to_baginst->GetID(); qsaudit->items[move_count].charges = to_baginst->GetCharges(); qsaudit->items[move_count].aug_1 = to_baginst->GetAugmentItemID(1); @@ -2192,18 +2219,18 @@ void Client::QSSwapItemAuditor(MoveItem_Struct* move_in, bool postaction_call) { safe_delete(qspack); } -void Client::DyeArmor(EQEmu::TintProfile* dye){ +void Client::DyeArmor(EQ::TintProfile* dye){ int16 slot=0; - for (int i = EQEmu::textures::textureBegin; i <= EQEmu::textures::LastTintableTexture; i++) { + for (int i = EQ::textures::textureBegin; i <= EQ::textures::LastTintableTexture; i++) { if ((m_pp.item_tint.Slot[i].Color & 0x00FFFFFF) != (dye->Slot[i].Color & 0x00FFFFFF)) { slot = m_inv.HasItem(32557, 1, invWherePersonal); if (slot != INVALID_INDEX){ DeleteItemInInventory(slot,1,true); uint8 slot2=SlotConvert(i); - EQEmu::ItemInstance* inst = this->m_inv.GetItem(slot2); + EQ::ItemInstance* inst = this->m_inv.GetItem(slot2); if(inst){ uint32 armor_color = ((uint32)dye->Slot[i].Red << 16) | ((uint32)dye->Slot[i].Green << 8) | ((uint32)dye->Slot[i].Blue); - inst->SetColor(armor_color); + inst->SetColor(armor_color); database.SaveCharacterMaterialColor(this->CharacterID(), i, armor_color); database.SaveInventory(CharacterID(),inst,slot2); if(dye->Slot[i].UseTint) @@ -2225,15 +2252,31 @@ void Client::DyeArmor(EQEmu::TintProfile* dye){ auto outapp = new EQApplicationPacket(OP_Dye, 0); QueuePacket(outapp); safe_delete(outapp); - + +} + +void Client::DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue, uint8 use_tint) { + uint8 item_slot = SlotConvert(slot); + EQ::ItemInstance* item_instance = this->m_inv.GetItem(item_slot); + if (item_instance) { + uint32 armor_color = ((uint32)red << 16) | ((uint32)green << 8) | ((uint32)blue); + item_instance->SetColor(armor_color); + database.SaveCharacterMaterialColor(this->CharacterID(), slot, armor_color); + database.SaveInventory(CharacterID(), item_instance, item_slot); + m_pp.item_tint.Slot[slot].UseTint = (use_tint ? 0xFF : 0x00); + } + m_pp.item_tint.Slot[slot].Red = red; + m_pp.item_tint.Slot[slot].Green = green; + m_pp.item_tint.Slot[slot].Blue = blue; + SendWearChange(slot); } #if 0 bool Client::DecreaseByItemType(uint32 type, uint8 amt) { const ItemData* TempItem = 0; - EQEmu::ItemInstance* ins; + EQ::ItemInstance* ins; int x; - for(x=EQEmu::legacy::POSSESSIONS_BEGIN; x <= EQEmu::legacy::POSSESSIONS_END; x++) + for(x=EQ::legacy::POSSESSIONS_BEGIN; x <= EQ::legacy::POSSESSIONS_END; x++) { TempItem = 0; ins = GetInv().GetItem(x); @@ -2255,7 +2298,7 @@ bool Client::DecreaseByItemType(uint32 type, uint8 amt) { return true; } } - for(x=EQEmu::legacy::GENERAL_BAGS_BEGIN; x <= EQEmu::legacy::GENERAL_BAGS_END; x++) + for(x=EQ::legacy::GENERAL_BAGS_BEGIN; x <= EQ::legacy::GENERAL_BAGS_END; x++) { TempItem = 0; ins = GetInv().GetItem(x); @@ -2282,12 +2325,12 @@ bool Client::DecreaseByItemType(uint32 type, uint8 amt) { #endif bool Client::DecreaseByID(uint32 type, uint8 amt) { - const EQEmu::ItemData* TempItem = nullptr; - EQEmu::ItemInstance* ins = nullptr; + const EQ::ItemData* TempItem = nullptr; + EQ::ItemInstance* ins = nullptr; int x; int num = 0; - for (x = EQEmu::invslot::POSSESSIONS_BEGIN; x <= EQEmu::invslot::POSSESSIONS_END; ++x) { + for (x = EQ::invslot::POSSESSIONS_BEGIN; x <= EQ::invslot::POSSESSIONS_END; ++x) { if (num >= amt) break; if (((uint64)1 << x) & GetInv().GetLookup()->PossessionsBitmask == 0) @@ -2301,10 +2344,10 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { num += ins->GetCharges(); } - for (x = EQEmu::invbag::GENERAL_BAGS_BEGIN; x <= EQEmu::invbag::GENERAL_BAGS_END; ++x) { + for (x = EQ::invbag::GENERAL_BAGS_BEGIN; x <= EQ::invbag::GENERAL_BAGS_END; ++x) { if (num >= amt) break; - if ((((uint64)1 << (EQEmu::invslot::GENERAL_BEGIN + ((x - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT))) & GetInv().GetLookup()->PossessionsBitmask) == 0) + if ((((uint64)1 << (EQ::invslot::GENERAL_BEGIN + ((x - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT))) & GetInv().GetLookup()->PossessionsBitmask) == 0) continue; TempItem = nullptr; @@ -2315,10 +2358,10 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { num += ins->GetCharges(); } - for (x = EQEmu::invbag::CURSOR_BAG_BEGIN; x <= EQEmu::invbag::CURSOR_BAG_END; ++x) { + for (x = EQ::invbag::CURSOR_BAG_BEGIN; x <= EQ::invbag::CURSOR_BAG_END; ++x) { if (num >= amt) break; - + TempItem = nullptr; ins = GetInv().GetItem(x); if (ins) @@ -2331,7 +2374,7 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { return false; - for (x = EQEmu::invslot::POSSESSIONS_BEGIN; x <= EQEmu::invslot::POSSESSIONS_END; ++x) { + for (x = EQ::invslot::POSSESSIONS_BEGIN; x <= EQ::invslot::POSSESSIONS_END; ++x) { if (amt < 1) break; if (((uint64)1 << x) & GetInv().GetLookup()->PossessionsBitmask == 0) @@ -2343,7 +2386,7 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { TempItem = ins->GetItem(); if (TempItem && TempItem->ID != type) continue; - + if (ins->GetCharges() < amt) { amt -= ins->GetCharges(); DeleteItemInInventory(x, amt, true); @@ -2354,10 +2397,10 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { } } - for (x = EQEmu::invbag::GENERAL_BAGS_BEGIN; x <= EQEmu::invbag::GENERAL_BAGS_END; ++x) { + for (x = EQ::invbag::GENERAL_BAGS_BEGIN; x <= EQ::invbag::GENERAL_BAGS_END; ++x) { if (amt < 1) break; - if ((((uint64)1 << (EQEmu::invslot::GENERAL_BEGIN + ((x - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT))) & GetInv().GetLookup()->PossessionsBitmask) == 0) + if ((((uint64)1 << (EQ::invslot::GENERAL_BEGIN + ((x - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT))) & GetInv().GetLookup()->PossessionsBitmask) == 0) continue; TempItem = nullptr; @@ -2377,7 +2420,7 @@ bool Client::DecreaseByID(uint32 type, uint8 amt) { } } - for (x = EQEmu::invbag::CURSOR_BAG_BEGIN; x <= EQEmu::invbag::CURSOR_BAG_END; ++x) { + for (x = EQ::invbag::CURSOR_BAG_BEGIN; x <= EQ::invbag::CURSOR_BAG_END; ++x) { if (amt < 1) break; @@ -2448,7 +2491,7 @@ static uint32 GetDisenchantedBagID(uint8 bag_slots) } } -static bool CopyBagContents(EQEmu::ItemInstance* new_bag, const EQEmu::ItemInstance* old_bag) +static bool CopyBagContents(EQ::ItemInstance* new_bag, const EQ::ItemInstance* old_bag) { if (!new_bag || !old_bag) { return false; } if (new_bag->GetItem()->BagSlots < old_bag->GetItem()->BagSlots) { return false; } @@ -2473,7 +2516,7 @@ static bool CopyBagContents(EQEmu::ItemInstance* new_bag, const EQEmu::ItemInsta void Client::DisenchantSummonedBags(bool client_update) { - for (auto slot_id = EQEmu::invslot::GENERAL_BEGIN; slot_id <= EQEmu::invslot::GENERAL_END; ++slot_id) { + for (auto slot_id = EQ::invslot::GENERAL_BEGIN; slot_id <= EQ::invslot::GENERAL_END; ++slot_id) { if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; // not useable this session - will be disenchanted once player logs in on client that doesn't exclude affected slots @@ -2497,8 +2540,8 @@ void Client::DisenchantSummonedBags(bool client_update) safe_delete(new_inst); } - for (auto slot_id = EQEmu::invslot::BANK_BEGIN; slot_id <= EQEmu::invslot::BANK_END; ++slot_id) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) + for (auto slot_id = EQ::invslot::BANK_BEGIN; slot_id <= EQ::invslot::BANK_END; ++slot_id) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) continue; auto inst = m_inv[slot_id]; @@ -2521,7 +2564,7 @@ void Client::DisenchantSummonedBags(bool client_update) safe_delete(new_inst); } - for (auto slot_id = EQEmu::invslot::SHARED_BANK_BEGIN; slot_id <= EQEmu::invslot::SHARED_BANK_END; ++slot_id) { + for (auto slot_id = EQ::invslot::SHARED_BANK_BEGIN; slot_id <= EQ::invslot::SHARED_BANK_END; ++slot_id) { auto inst = m_inv[slot_id]; if (!inst) { continue; } if (!IsSummonedBagID(inst->GetItem()->ID)) { continue; } @@ -2534,7 +2577,7 @@ void Client::DisenchantSummonedBags(bool client_update) if (!new_item) { continue; } auto new_inst = database.CreateBaseItem(new_item); if (!new_inst) { continue; } - + if (CopyBagContents(new_inst, inst)) { LogInventory("Disenchant Summoned Bags: Replacing [{}] with [{}] in slot [{}]", inst->GetItem()->Name, new_inst->GetItem()->Name, slot_id); PutItemInInventory(slot_id, *new_inst, client_update); @@ -2543,7 +2586,7 @@ void Client::DisenchantSummonedBags(bool client_update) } while (!m_inv.CursorEmpty()) { - auto inst = m_inv[EQEmu::invslot::slotCursor]; + auto inst = m_inv[EQ::invslot::slotCursor]; if (!inst) { break; } if (!IsSummonedBagID(inst->GetItem()->ID)) { break; } if (!inst->GetItem()->IsClassBag()) { break; } @@ -2557,14 +2600,14 @@ void Client::DisenchantSummonedBags(bool client_update) if (!new_inst) { break; } if (CopyBagContents(new_inst, inst)) { - LogInventory("Disenchant Summoned Bags: Replacing [{}] with [{}] in slot [{}]", inst->GetItem()->Name, new_inst->GetItem()->Name, EQEmu::invslot::slotCursor); - std::list local; + LogInventory("Disenchant Summoned Bags: Replacing [{}] with [{}] in slot [{}]", inst->GetItem()->Name, new_inst->GetItem()->Name, EQ::invslot::slotCursor); + std::list local; local.push_front(new_inst); - m_inv.PopItem(EQEmu::invslot::slotCursor); + m_inv.PopItem(EQ::invslot::slotCursor); safe_delete(inst); while (!m_inv.CursorEmpty()) { - auto limbo_inst = m_inv.PopItem(EQEmu::invslot::slotCursor); + auto limbo_inst = m_inv.PopItem(EQ::invslot::slotCursor); if (limbo_inst == nullptr) { continue; } local.push_back(limbo_inst); } @@ -2590,7 +2633,7 @@ void Client::DisenchantSummonedBags(bool client_update) void Client::RemoveNoRent(bool client_update) { - for (auto slot_id = EQEmu::invslot::EQUIPMENT_BEGIN; slot_id <= EQEmu::invslot::EQUIPMENT_END; ++slot_id) { + for (auto slot_id = EQ::invslot::EQUIPMENT_BEGIN; slot_id <= EQ::invslot::EQUIPMENT_END; ++slot_id) { if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; @@ -2601,7 +2644,7 @@ void Client::RemoveNoRent(bool client_update) } } - for (auto slot_id = EQEmu::invslot::GENERAL_BEGIN; slot_id <= EQEmu::invslot::GENERAL_END; ++slot_id) { + for (auto slot_id = EQ::invslot::GENERAL_BEGIN; slot_id <= EQ::invslot::GENERAL_END; ++slot_id) { if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; @@ -2612,8 +2655,8 @@ void Client::RemoveNoRent(bool client_update) } } - for (auto slot_id = EQEmu::invbag::GENERAL_BAGS_BEGIN; slot_id <= EQEmu::invbag::CURSOR_BAG_END; ++slot_id) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + for (auto slot_id = EQ::invbag::GENERAL_BAGS_BEGIN; slot_id <= EQ::invbag::CURSOR_BAG_END; ++slot_id) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) == 0) continue; @@ -2624,8 +2667,8 @@ void Client::RemoveNoRent(bool client_update) } } - for (auto slot_id = EQEmu::invslot::BANK_BEGIN; slot_id <= EQEmu::invslot::BANK_END; ++slot_id) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) + for (auto slot_id = EQ::invslot::BANK_BEGIN; slot_id <= EQ::invslot::BANK_END; ++slot_id) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) continue; auto inst = m_inv[slot_id]; @@ -2635,8 +2678,8 @@ void Client::RemoveNoRent(bool client_update) } } - for (auto slot_id = EQEmu::invbag::BANK_BAGS_BEGIN; slot_id <= EQEmu::invbag::BANK_BAGS_END; ++slot_id) { - auto temp_slot = (slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + for (auto slot_id = EQ::invbag::BANK_BAGS_BEGIN; slot_id <= EQ::invbag::BANK_BAGS_END; ++slot_id) { + auto temp_slot = (slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= GetInv().GetLookup()->InventoryTypeSize.Bank) continue; @@ -2647,7 +2690,7 @@ void Client::RemoveNoRent(bool client_update) } } - for (auto slot_id = EQEmu::invslot::SHARED_BANK_BEGIN; slot_id <= EQEmu::invslot::SHARED_BANK_END; ++slot_id) { + for (auto slot_id = EQ::invslot::SHARED_BANK_BEGIN; slot_id <= EQ::invslot::SHARED_BANK_END; ++slot_id) { auto inst = m_inv[slot_id]; if(inst && !inst->GetItem()->NoRent) { LogInventory("NoRent Timer Lapse: Deleting [{}] from slot [{}]", inst->GetItem()->Name, slot_id); @@ -2655,7 +2698,7 @@ void Client::RemoveNoRent(bool client_update) } } - for (auto slot_id = EQEmu::invbag::SHARED_BANK_BAGS_BEGIN; slot_id <= EQEmu::invbag::SHARED_BANK_BAGS_END; ++slot_id) { + for (auto slot_id = EQ::invbag::SHARED_BANK_BAGS_BEGIN; slot_id <= EQ::invbag::SHARED_BANK_BAGS_END; ++slot_id) { auto inst = m_inv[slot_id]; if(inst && !inst->GetItem()->NoRent) { LogInventory("NoRent Timer Lapse: Deleting [{}] from slot [{}]", inst->GetItem()->Name, slot_id); @@ -2664,10 +2707,10 @@ void Client::RemoveNoRent(bool client_update) } if (!m_inv.CursorEmpty()) { - std::list local; + std::list local; while (!m_inv.CursorEmpty()) { - auto inst = m_inv.PopItem(EQEmu::invslot::slotCursor); + auto inst = m_inv.PopItem(EQ::invslot::slotCursor); if (inst == nullptr) { continue; } local.push_back(inst); } @@ -2693,7 +2736,7 @@ void Client::RemoveNoRent(bool client_update) // Two new methods to alleviate perpetual login desyncs void Client::RemoveDuplicateLore(bool client_update) { - for (auto slot_id = EQEmu::invslot::EQUIPMENT_BEGIN; slot_id <= EQEmu::invslot::EQUIPMENT_END; ++slot_id) { + for (auto slot_id = EQ::invslot::EQUIPMENT_BEGIN; slot_id <= EQ::invslot::EQUIPMENT_END; ++slot_id) { if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; @@ -2708,8 +2751,8 @@ void Client::RemoveDuplicateLore(bool client_update) } safe_delete(inst); } - - for (auto slot_id = EQEmu::invslot::GENERAL_BEGIN; slot_id <= EQEmu::invslot::GENERAL_END; ++slot_id) { + + for (auto slot_id = EQ::invslot::GENERAL_BEGIN; slot_id <= EQ::invslot::GENERAL_END; ++slot_id) { if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; @@ -2725,8 +2768,8 @@ void Client::RemoveDuplicateLore(bool client_update) safe_delete(inst); } - for (auto slot_id = EQEmu::invbag::GENERAL_BAGS_BEGIN; slot_id <= EQEmu::invbag::CURSOR_BAG_END; ++slot_id) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); + for (auto slot_id = EQ::invbag::GENERAL_BAGS_BEGIN; slot_id <= EQ::invbag::CURSOR_BAG_END; ++slot_id) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); if ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) == 0) continue; @@ -2742,8 +2785,8 @@ void Client::RemoveDuplicateLore(bool client_update) safe_delete(inst); } - for (auto slot_id = EQEmu::invslot::BANK_BEGIN; slot_id <= EQEmu::invslot::BANK_END; ++slot_id) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) + for (auto slot_id = EQ::invslot::BANK_BEGIN; slot_id <= EQ::invslot::BANK_END; ++slot_id) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) continue; auto inst = m_inv.PopItem(slot_id); @@ -2758,8 +2801,8 @@ void Client::RemoveDuplicateLore(bool client_update) safe_delete(inst); } - for (auto slot_id = EQEmu::invbag::BANK_BAGS_BEGIN; slot_id <= EQEmu::invbag::BANK_BAGS_END; ++slot_id) { - auto temp_slot = (slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; + for (auto slot_id = EQ::invbag::BANK_BAGS_BEGIN; slot_id <= EQ::invbag::BANK_BAGS_END; ++slot_id) { + auto temp_slot = (slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; if (temp_slot >= GetInv().GetLookup()->InventoryTypeSize.Bank) continue; @@ -2778,11 +2821,11 @@ void Client::RemoveDuplicateLore(bool client_update) // Shared Bank and Shared Bank Containers are not checked due to their allowing duplicate lore items if (!m_inv.CursorEmpty()) { - std::list local_1; - std::list local_2; + std::list local_1; + std::list local_2; while (!m_inv.CursorEmpty()) { - auto inst = m_inv.PopItem(EQEmu::invslot::slotCursor); + auto inst = m_inv.PopItem(EQ::invslot::slotCursor); if (inst == nullptr) { continue; } local_1.push_back(inst); } @@ -2823,10 +2866,10 @@ void Client::RemoveDuplicateLore(bool client_update) void Client::MoveSlotNotAllowed(bool client_update) { - for (auto slot_id = EQEmu::invslot::EQUIPMENT_BEGIN; slot_id <= EQEmu::invslot::EQUIPMENT_END; ++slot_id) { + for (auto slot_id = EQ::invslot::EQUIPMENT_BEGIN; slot_id <= EQ::invslot::EQUIPMENT_END; ++slot_id) { if(m_inv[slot_id] && !m_inv[slot_id]->IsSlotAllowed(slot_id)) { auto inst = m_inv.PopItem(slot_id); - bool is_arrow = (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false; + bool is_arrow = (inst->GetItem()->ItemType == EQ::item::ItemTypeArrow) ? true : false; int16 free_slot_id = m_inv.FindFreeSlot(inst->IsClassBag(), true, inst->GetItem()->Size, is_arrow); LogInventory("Slot Assignment Error: Moving [{}] from slot [{}] to [{}]", inst->GetItem()->Name, slot_id, free_slot_id); PutItemInInventory(free_slot_id, *inst, client_update); @@ -2836,13 +2879,13 @@ void Client::MoveSlotNotAllowed(bool client_update) } // added this check to move any client-based excluded slots - //for (auto slot_id = EQEmu::invslot::POSSESSIONS_BEGIN; slot_id <= EQEmu::invslot::POSSESSIONS_END; ++slot_id) { + //for (auto slot_id = EQ::invslot::POSSESSIONS_BEGIN; slot_id <= EQ::invslot::POSSESSIONS_END; ++slot_id) { // if (((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask != 0) // continue; // if (m_inv[slot_id]) { // this is currently dangerous for bag-based movements since limbo does not save bag slots // auto inst = m_inv.PopItem(slot_id); - // bool is_arrow = (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false; + // bool is_arrow = (inst->GetItem()->ItemType == EQ::item::ItemTypeArrow) ? true : false; // int16 free_slot_id = m_inv.FindFreeSlot(inst->IsClassBag(), true, inst->GetItem()->Size, is_arrow); // LogInventory("Slot Assignment Error: Moving [{}] from slot [{}] to [{}]", inst->GetItem()->Name, slot_id, free_slot_id); // PutItemInInventory(free_slot_id, *inst, client_update); @@ -2860,13 +2903,13 @@ uint32 Client::GetEquippedItemFromTextureSlot(uint8 material_slot) const { int16 inventory_slot; - const EQEmu::ItemInstance *item; + const EQ::ItemInstance *item; - if (material_slot > EQEmu::textures::LastTexture) { + if (material_slot > EQ::textures::LastTexture) { return 0; } - inventory_slot = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + inventory_slot = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); if (inventory_slot == INVALID_INDEX) { return 0; } @@ -2897,10 +2940,10 @@ int32 Client::GetEquipmentMaterial(uint8 material_slot) uint32 Client::GetEquipmentColor(uint8 material_slot) const { - if (material_slot > EQEmu::textures::LastTexture) + if (material_slot > EQ::textures::LastTexture) return 0; - const EQEmu::ItemData *item = database.GetItem(GetEquippedItemFromTextureSlot(material_slot)); + const EQ::ItemData *item = database.GetItem(GetEquippedItemFromTextureSlot(material_slot)); if(item != nullptr) return ((m_pp.item_tint.Slot[material_slot].UseTint) ? m_pp.item_tint.Slot[material_slot].Color : item->Color); @@ -2908,28 +2951,38 @@ uint32 Client::GetEquipmentColor(uint8 material_slot) const } // Send an item packet (including all subitems of the item) -void Client::SendItemPacket(int16 slot_id, const EQEmu::ItemInstance* inst, ItemPacketType packet_type) +void Client::SendItemPacket(int16 slot_id, const EQ::ItemInstance* inst, ItemPacketType packet_type) { if (!inst) return; - if (slot_id <= EQEmu::invslot::POSSESSIONS_END && slot_id >= EQEmu::invslot::POSSESSIONS_BEGIN) { - if ((((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask) == 0) - return; - } - else if (slot_id <= EQEmu::invbag::GENERAL_BAGS_END && slot_id >= EQEmu::invbag::GENERAL_BAGS_BEGIN) { - auto temp_slot = EQEmu::invslot::GENERAL_BEGIN + ((slot_id - EQEmu::invbag::GENERAL_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT); - if ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) == 0) - return; - } - else if (slot_id <= EQEmu::invslot::BANK_END && slot_id >= EQEmu::invslot::BANK_BEGIN) { - if ((slot_id - EQEmu::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) - return; - } - else if (slot_id <= EQEmu::invbag::BANK_BAGS_END && slot_id >= EQEmu::invbag::BANK_BAGS_BEGIN) { - auto temp_slot = (slot_id - EQEmu::invbag::BANK_BAGS_BEGIN) / EQEmu::invbag::SLOT_COUNT; - if (temp_slot >= GetInv().GetLookup()->InventoryTypeSize.Bank) - return; + if (packet_type != ItemPacketMerchant) { + if (slot_id <= EQ::invslot::POSSESSIONS_END && slot_id >= EQ::invslot::POSSESSIONS_BEGIN) { + if ((((uint64)1 << slot_id) & GetInv().GetLookup()->PossessionsBitmask) == 0) { + LogError("Item not sent to merchant : slot [{}]", slot_id); + return; + } + } + else if (slot_id <= EQ::invbag::GENERAL_BAGS_END && slot_id >= EQ::invbag::GENERAL_BAGS_BEGIN) { + auto temp_slot = EQ::invslot::GENERAL_BEGIN + ((slot_id - EQ::invbag::GENERAL_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT); + if ((((uint64)1 << temp_slot) & GetInv().GetLookup()->PossessionsBitmask) == 0) { + LogError("Item not sent to merchant2 : slot [{}]", slot_id); + return; + } + } + else if (slot_id <= EQ::invslot::BANK_END && slot_id >= EQ::invslot::BANK_BEGIN) { + if ((slot_id - EQ::invslot::BANK_BEGIN) >= GetInv().GetLookup()->InventoryTypeSize.Bank) { + LogError("Item not sent to merchant3 : slot [{}]", slot_id); + return; + } + } + else if (slot_id <= EQ::invbag::BANK_BAGS_END && slot_id >= EQ::invbag::BANK_BAGS_BEGIN) { + auto temp_slot = (slot_id - EQ::invbag::BANK_BAGS_BEGIN) / EQ::invbag::SLOT_COUNT; + if (temp_slot >= GetInv().GetLookup()->InventoryTypeSize.Bank) { + LogError("Item not sent to merchant4 : slot [{}]", slot_id); + return; + } + } } // Serialize item into |-delimited string (Titanium- uses '|' delimiter .. newer clients use pure data serialization) @@ -2952,7 +3005,7 @@ void Client::SendItemPacket(int16 slot_id, const EQEmu::ItemInstance* inst, Item FastQueuePacket(&outapp); } -EQApplicationPacket* Client::ReturnItemPacket(int16 slot_id, const EQEmu::ItemInstance* inst, ItemPacketType packet_type) +EQApplicationPacket* Client::ReturnItemPacket(int16 slot_id, const EQ::ItemInstance* inst, ItemPacketType packet_type) { if (!inst) return nullptr; @@ -2982,13 +3035,13 @@ static int16 BandolierSlotToWeaponSlot(int BandolierSlot) switch (BandolierSlot) { case bandolierPrimary: - return EQEmu::invslot::slotPrimary; + return EQ::invslot::slotPrimary; case bandolierSecondary: - return EQEmu::invslot::slotSecondary; + return EQ::invslot::slotSecondary; case bandolierRange: - return EQEmu::invslot::slotRange; + return EQ::invslot::slotRange; default: - return EQEmu::invslot::slotAmmo; + return EQ::invslot::slotAmmo; } } @@ -3002,8 +3055,8 @@ void Client::CreateBandolier(const EQApplicationPacket *app) LogInventory("Char: [{}] Creating Bandolier Set [{}], Set Name: [{}]", GetName(), bs->Number, bs->Name); strcpy(m_pp.bandoliers[bs->Number].Name, bs->Name); - const EQEmu::ItemInstance* InvItem = nullptr; - const EQEmu::ItemData *BaseItem = nullptr; + const EQ::ItemInstance* InvItem = nullptr; + const EQ::ItemData *BaseItem = nullptr; int16 WeaponSlot = 0; database.DeleteCharacterBandolier(this->CharacterID(), bs->Number); @@ -3033,7 +3086,7 @@ void Client::RemoveBandolier(const EQApplicationPacket *app) memset(m_pp.bandoliers[bds->Number].Name, 0, 32); for(int i = bandolierPrimary; i <= bandolierAmmo; i++) { m_pp.bandoliers[bds->Number].Items[i].ID = 0; - m_pp.bandoliers[bds->Number].Items[i].Icon = 0; + m_pp.bandoliers[bds->Number].Items[i].Icon = 0; } database.DeleteCharacterBandolier(this->CharacterID(), bds->Number); } @@ -3047,7 +3100,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) LogInventory("Char: [{}] activating set [{}]", GetName(), bss->Number); int16 slot = 0; int16 WeaponSlot = 0; - EQEmu::ItemInstance *BandolierItems[4]; // Temporary holding area for the weapons we pull out of their inventory + EQ::ItemInstance *BandolierItems[4]; // Temporary holding area for the weapons we pull out of their inventory // First we pull the items for this bandolier set out of their inventory, this makes space to put the // currently equipped items back. @@ -3063,13 +3116,13 @@ void Client::SetBandolier(const EQApplicationPacket *app) // removed 'invWhereCursor' argument from above and implemented slots 30, 331-340 checks here if (slot == INVALID_INDEX) { - if (m_inv.GetItem(EQEmu::invslot::slotCursor)) { - if (m_inv.GetItem(EQEmu::invslot::slotCursor)->GetItem()->ID == m_pp.bandoliers[bss->Number].Items[BandolierSlot].ID && - m_inv.GetItem(EQEmu::invslot::slotCursor)->GetCharges() >= 1) { // '> 0' the same, but this matches Inventory::_HasItem conditional check - slot = EQEmu::invslot::slotCursor; + if (m_inv.GetItem(EQ::invslot::slotCursor)) { + if (m_inv.GetItem(EQ::invslot::slotCursor)->GetItem()->ID == m_pp.bandoliers[bss->Number].Items[BandolierSlot].ID && + m_inv.GetItem(EQ::invslot::slotCursor)->GetCharges() >= 1) { // '> 0' the same, but this matches Inventory::_HasItem conditional check + slot = EQ::invslot::slotCursor; } - else if (m_inv.GetItem(EQEmu::invslot::slotCursor)->GetItem()->ItemClass == 1) { - for(int16 CursorBagSlot = EQEmu::invbag::CURSOR_BAG_BEGIN; CursorBagSlot <= EQEmu::invbag::CURSOR_BAG_END; CursorBagSlot++) { + else if (m_inv.GetItem(EQ::invslot::slotCursor)->GetItem()->ItemClass == 1) { + for(int16 CursorBagSlot = EQ::invbag::CURSOR_BAG_BEGIN; CursorBagSlot <= EQ::invbag::CURSOR_BAG_END; CursorBagSlot++) { if (m_inv.GetItem(CursorBagSlot)) { if (m_inv.GetItem(CursorBagSlot)->GetItem()->ID == m_pp.bandoliers[bss->Number].Items[BandolierSlot].ID && m_inv.GetItem(CursorBagSlot)->GetCharges() >= 1) { // ditto @@ -3112,7 +3165,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) BandolierItems[BandolierSlot] = 0; if (slot == INVALID_INDEX) { LogInventory("Character does not have required bandolier item for slot [{}]", WeaponSlot); - EQEmu::ItemInstance *InvItem = m_inv.PopItem(WeaponSlot); + EQ::ItemInstance *InvItem = m_inv.PopItem(WeaponSlot); if(InvItem) { // If there was an item in that weapon slot, put it in the inventory LogInventory("returning item [{}] in weapon slot [{}] to inventory", @@ -3146,7 +3199,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) // if the player has this item in their inventory, and it is not already where it needs to be if(BandolierItems[BandolierSlot]) { // Pull the item that we are going to replace - EQEmu::ItemInstance *InvItem = m_inv.PopItem(WeaponSlot); + EQ::ItemInstance *InvItem = m_inv.PopItem(WeaponSlot); // Put the item specified in the bandolier where it needs to be m_inv.PutItem(WeaponSlot, *BandolierItems[BandolierSlot]); @@ -3166,7 +3219,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) else { // This bandolier set has no item for this slot, so take whatever is in the weapon slot and // put it in the player's inventory. - EQEmu::ItemInstance *InvItem = m_inv.PopItem(WeaponSlot); + EQ::ItemInstance *InvItem = m_inv.PopItem(WeaponSlot); if(InvItem) { LogInventory("Bandolier has no item for slot [{}], returning item [{}] to inventory", WeaponSlot, InvItem->GetItem()->Name); // If there was an item in that weapon slot, put it in the inventory @@ -3184,7 +3237,7 @@ void Client::SetBandolier(const EQApplicationPacket *app) CalcBonuses(); } -bool Client::MoveItemToInventory(EQEmu::ItemInstance *ItemToReturn, bool UpdateClient) { +bool Client::MoveItemToInventory(EQ::ItemInstance *ItemToReturn, bool UpdateClient) { // This is a support function for Client::SetBandolier, however it can be used anywhere it's functionality is required. // @@ -3215,11 +3268,11 @@ bool Client::MoveItemToInventory(EQEmu::ItemInstance *ItemToReturn, bool UpdateC // if(ItemToReturn->IsStackable()) { - for (int16 i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::slotCursor; i++) { // changed slot max to 30 from 29. client will stack into slot 30 (bags too) before moving. + for (int16 i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::slotCursor; i++) { // changed slot max to 30 from 29. client will stack into slot 30 (bags too) before moving. if (((uint64)1 << i) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; - EQEmu::ItemInstance* InvItem = m_inv.GetItem(i); + EQ::ItemInstance* InvItem = m_inv.GetItem(i); if(InvItem && (InvItem->GetItem()->ID == ItemID) && (InvItem->GetCharges() < InvItem->GetItem()->StackSize)) { @@ -3243,12 +3296,12 @@ bool Client::MoveItemToInventory(EQEmu::ItemInstance *ItemToReturn, bool UpdateC // if (InvItem && InvItem->IsClassBag()) { - int16 BaseSlotID = EQEmu::InventoryProfile::CalcSlotId(i, EQEmu::invbag::SLOT_BEGIN); + int16 BaseSlotID = EQ::InventoryProfile::CalcSlotId(i, EQ::invbag::SLOT_BEGIN); uint8 BagSize=InvItem->GetItem()->BagSlots; uint8 BagSlot; - for (BagSlot = EQEmu::invbag::SLOT_BEGIN; BagSlot < BagSize; BagSlot++) { + for (BagSlot = EQ::invbag::SLOT_BEGIN; BagSlot < BagSize; BagSlot++) { InvItem = m_inv.GetItem(BaseSlotID + BagSlot); if (InvItem && (InvItem->GetItem()->ID == ItemID) && (InvItem->GetCharges() < InvItem->GetItem()->StackSize)) { @@ -3276,11 +3329,11 @@ bool Client::MoveItemToInventory(EQEmu::ItemInstance *ItemToReturn, bool UpdateC // We have tried stacking items, now just try and find an empty slot. - for (int16 i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::slotCursor; i++) { // changed slot max to 30 from 29. client will move into slot 30 (bags too) before pushing onto cursor. + for (int16 i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::slotCursor; i++) { // changed slot max to 30 from 29. client will move into slot 30 (bags too) before pushing onto cursor. if (((uint64)1 << i) & GetInv().GetLookup()->PossessionsBitmask == 0) continue; - EQEmu::ItemInstance* InvItem = m_inv.GetItem(i); + EQ::ItemInstance* InvItem = m_inv.GetItem(i); if (!InvItem) { // Found available slot in personal inventory @@ -3295,13 +3348,13 @@ bool Client::MoveItemToInventory(EQEmu::ItemInstance *ItemToReturn, bool UpdateC return true; } - if (InvItem->IsClassBag() && EQEmu::InventoryProfile::CanItemFitInContainer(ItemToReturn->GetItem(), InvItem->GetItem())) { + if (InvItem->IsClassBag() && EQ::InventoryProfile::CanItemFitInContainer(ItemToReturn->GetItem(), InvItem->GetItem())) { - int16 BaseSlotID = EQEmu::InventoryProfile::CalcSlotId(i, EQEmu::invbag::SLOT_BEGIN); + int16 BaseSlotID = EQ::InventoryProfile::CalcSlotId(i, EQ::invbag::SLOT_BEGIN); uint8 BagSize=InvItem->GetItem()->BagSlots; - for (uint8 BagSlot = EQEmu::invbag::SLOT_BEGIN; BagSlot < BagSize; BagSlot++) { + for (uint8 BagSlot = EQ::invbag::SLOT_BEGIN; BagSlot < BagSize; BagSlot++) { InvItem = m_inv.GetItem(BaseSlotID + BagSlot); @@ -3336,30 +3389,30 @@ bool Client::InterrogateInventory(Client* requester, bool log, bool silent, bool if (!requester) return false; - std::map instmap; + std::map instmap; // build reference map - for (int16 index = EQEmu::invslot::POSSESSIONS_BEGIN; index <= EQEmu::invslot::POSSESSIONS_END; ++index) { + for (int16 index = EQ::invslot::POSSESSIONS_BEGIN; index <= EQ::invslot::POSSESSIONS_END; ++index) { auto inst = m_inv[index]; if (inst == nullptr) { continue; } instmap[index] = inst; } - for (int16 index = EQEmu::invslot::TRIBUTE_BEGIN; index <= EQEmu::invslot::TRIBUTE_END; ++index) { + for (int16 index = EQ::invslot::TRIBUTE_BEGIN; index <= EQ::invslot::TRIBUTE_END; ++index) { auto inst = m_inv[index]; if (inst == nullptr) { continue; } instmap[index] = inst; } - for (int16 index = EQEmu::invslot::BANK_BEGIN; index <= EQEmu::invslot::BANK_END; ++index) { + for (int16 index = EQ::invslot::BANK_BEGIN; index <= EQ::invslot::BANK_END; ++index) { auto inst = m_inv[index]; if (inst == nullptr) { continue; } instmap[index] = inst; } - for (int16 index = EQEmu::invslot::SHARED_BANK_BEGIN; index <= EQEmu::invslot::SHARED_BANK_END; ++index) { + for (int16 index = EQ::invslot::SHARED_BANK_BEGIN; index <= EQ::invslot::SHARED_BANK_END; ++index) { auto inst = m_inv[index]; if (inst == nullptr) { continue; } instmap[index] = inst; } - for (int16 index = EQEmu::invslot::TRADE_BEGIN; index <= EQEmu::invslot::TRADE_END; ++index) { + for (int16 index = EQ::invslot::TRADE_BEGIN; index <= EQ::invslot::TRADE_END; ++index) { auto inst = m_inv[index]; if (inst == nullptr) { continue; } instmap[index] = inst; @@ -3367,10 +3420,10 @@ bool Client::InterrogateInventory(Client* requester, bool log, bool silent, bool auto tsobject = GetTradeskillObject(); if (tsobject != nullptr) { - for (int16 index = EQEmu::invslot::SLOT_BEGIN; index < EQEmu::invtype::WORLD_SIZE; ++index) { + for (int16 index = EQ::invslot::SLOT_BEGIN; index < EQ::invtype::WORLD_SIZE; ++index) { auto inst = tsobject->GetItem(index); if (inst == nullptr) { continue; } - instmap[EQEmu::invslot::WORLD_BEGIN + index] = inst; + instmap[EQ::invslot::WORLD_BEGIN + index] = inst; } } @@ -3426,7 +3479,7 @@ bool Client::InterrogateInventory(Client* requester, bool log, bool silent, bool return true; } -void Client::InterrogateInventory_(bool errorcheck, Client* requester, int16 head, int16 index, const EQEmu::ItemInstance* inst, const EQEmu::ItemInstance* parent, bool log, bool silent, bool &error, int depth) +void Client::InterrogateInventory_(bool errorcheck, Client* requester, int16 head, int16 index, const EQ::ItemInstance* inst, const EQ::ItemInstance* parent, bool log, bool silent, bool &error, int depth) { if (depth >= 10) { LogDebug("[CLIENT] Client::InterrogateInventory_() - Recursion count has exceeded the maximum allowable (You have a REALLY BIG PROBLEM!!)"); @@ -3439,7 +3492,7 @@ void Client::InterrogateInventory_(bool errorcheck, Client* requester, int16 hea } else { if (inst) { - for (int16 sub = EQEmu::invbag::SLOT_BEGIN; (sub <= EQEmu::invbag::SLOT_END) && (!error); ++sub) { // treat any EQEmu::ItemInstance as having the max internal slots available + for (int16 sub = EQ::invbag::SLOT_BEGIN; (sub <= EQ::invbag::SLOT_END) && (!error); ++sub) { // treat any EQ::ItemInstance as having the max internal slots available if (inst->GetItem(sub)) InterrogateInventory_(true, requester, head, sub, inst->GetItem(sub), inst, log, silent, error, depth + 1); } @@ -3469,7 +3522,7 @@ void Client::InterrogateInventory_(bool errorcheck, Client* requester, int16 hea } if (inst) { - for (int16 sub = EQEmu::invbag::SLOT_BEGIN; (sub <= EQEmu::invbag::SLOT_END); ++sub) { + for (int16 sub = EQ::invbag::SLOT_BEGIN; (sub <= EQ::invbag::SLOT_END); ++sub) { if (inst->GetItem(sub)) InterrogateInventory_(false, requester, head, sub, inst->GetItem(sub), inst, log, silent, error, depth + 1); } @@ -3479,14 +3532,14 @@ void Client::InterrogateInventory_(bool errorcheck, Client* requester, int16 hea return; } -bool Client::InterrogateInventory_error(int16 head, int16 index, const EQEmu::ItemInstance* inst, const EQEmu::ItemInstance* parent, int depth) +bool Client::InterrogateInventory_error(int16 head, int16 index, const EQ::ItemInstance* inst, const EQ::ItemInstance* parent, int depth) { // very basic error checking - can be elaborated upon if more in-depth testing is needed... if ( - (head >= EQEmu::invslot::EQUIPMENT_BEGIN && head <= EQEmu::invslot::EQUIPMENT_END) || - (head >= EQEmu::invslot::TRIBUTE_BEGIN && head <= EQEmu::invslot::TRIBUTE_END) || - (head >= EQEmu::invslot::WORLD_BEGIN && head <= EQEmu::invslot::WORLD_END) || + (head >= EQ::invslot::EQUIPMENT_BEGIN && head <= EQ::invslot::EQUIPMENT_END) || + (head >= EQ::invslot::TRIBUTE_BEGIN && head <= EQ::invslot::TRIBUTE_END) || + (head >= EQ::invslot::WORLD_BEGIN && head <= EQ::invslot::WORLD_END) || (head >= 8000 && head <= 8101)) { switch (depth) { @@ -3497,9 +3550,9 @@ bool Client::InterrogateInventory_error(int16 head, int16 index, const EQEmu::It case 1: // requirement: parent is common and inst is augment if ((!parent) || (!inst)) return true; - if (!parent->IsType(EQEmu::item::ItemClassCommon)) + if (!parent->IsType(EQ::item::ItemClassCommon)) return true; - if (index > EQEmu::invaug::SOCKET_END) + if (index > EQ::invaug::SOCKET_END) return true; break; default: // requirement: none (something bad happened...) @@ -3507,11 +3560,11 @@ bool Client::InterrogateInventory_error(int16 head, int16 index, const EQEmu::It } } else if ( - (head >= EQEmu::invslot::GENERAL_BEGIN && head <= EQEmu::invslot::GENERAL_END) || - (head == EQEmu::invslot::slotCursor) || - (head >= EQEmu::invslot::BANK_BEGIN && head <= EQEmu::invslot::BANK_END) || - (head >= EQEmu::invslot::SHARED_BANK_BEGIN && head <= EQEmu::invslot::SHARED_BANK_END) || - (head >= EQEmu::invslot::TRADE_BEGIN && head <= EQEmu::invslot::TRADE_END)) { + (head >= EQ::invslot::GENERAL_BEGIN && head <= EQ::invslot::GENERAL_END) || + (head == EQ::invslot::slotCursor) || + (head >= EQ::invslot::BANK_BEGIN && head <= EQ::invslot::BANK_END) || + (head >= EQ::invslot::SHARED_BANK_BEGIN && head <= EQ::invslot::SHARED_BANK_END) || + (head >= EQ::invslot::TRADE_BEGIN && head <= EQ::invslot::TRADE_END)) { switch (depth) { case 0: // requirement: inst is extant @@ -3521,28 +3574,28 @@ bool Client::InterrogateInventory_error(int16 head, int16 index, const EQEmu::It case 1: // requirement: parent is common and inst is augment ..or.. parent is container and inst is extant if ((!parent) || (!inst)) return true; - if (parent->IsType(EQEmu::item::ItemClassBag)) + if (parent->IsType(EQ::item::ItemClassBag)) break; if (parent->IsClassBook()) return true; if (parent->IsClassCommon()) { if (!(inst->GetItem()->AugType > 0)) return true; - if (index > EQEmu::invaug::SOCKET_END) + if (index > EQ::invaug::SOCKET_END) return true; } break; case 2: // requirement: parent is common and inst is augment if ((!parent) || (!inst)) return true; - if (parent->IsType(EQEmu::item::ItemClassBag)) + if (parent->IsType(EQ::item::ItemClassBag)) return true; if (parent->IsClassBook()) return true; if (parent->IsClassCommon()) { if (!(inst->GetItem()->AugType > 0)) return true; - if (index > EQEmu::invaug::SOCKET_END) + if (index > EQ::invaug::SOCKET_END) return true; } break; @@ -3557,40 +3610,40 @@ bool Client::InterrogateInventory_error(int16 head, int16 index, const EQEmu::It return false; } -void EQEmu::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, std::string value) { - EQEmu::ItemInstance *inst = GetItem(slot_id); +void EQ::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, std::string value) { + EQ::ItemInstance *inst = GetItem(slot_id); if(inst) { inst->SetCustomData(identifier, value); database.SaveInventory(character_id, inst, slot_id); } } -void EQEmu::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, int value) { - EQEmu::ItemInstance *inst = GetItem(slot_id); +void EQ::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, int value) { + EQ::ItemInstance *inst = GetItem(slot_id); if(inst) { inst->SetCustomData(identifier, value); database.SaveInventory(character_id, inst, slot_id); } } -void EQEmu::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, float value) { - EQEmu::ItemInstance *inst = GetItem(slot_id); +void EQ::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, float value) { + EQ::ItemInstance *inst = GetItem(slot_id); if(inst) { inst->SetCustomData(identifier, value); database.SaveInventory(character_id, inst, slot_id); } } -void EQEmu::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, bool value) { - EQEmu::ItemInstance *inst = GetItem(slot_id); +void EQ::InventoryProfile::SetCustomItemData(uint32 character_id, int16 slot_id, std::string identifier, bool value) { + EQ::ItemInstance *inst = GetItem(slot_id); if(inst) { inst->SetCustomData(identifier, value); database.SaveInventory(character_id, inst, slot_id); } } -std::string EQEmu::InventoryProfile::GetCustomItemData(int16 slot_id, std::string identifier) { - EQEmu::ItemInstance *inst = GetItem(slot_id); +std::string EQ::InventoryProfile::GetCustomItemData(int16 slot_id, std::string identifier) { + EQ::ItemInstance *inst = GetItem(slot_id); if(inst) { return inst->GetCustomData(identifier); } diff --git a/zone/loottables.cpp b/zone/loottables.cpp index 0e5ba8d60..b4e0f00f0 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -26,7 +26,10 @@ #include "mob.h" #include "npc.h" #include "zonedb.h" +#include "zone_store.h" #include "global_loot_manager.h" +#include "../common/repositories/criteria/content_filter_criteria.h" +#include "../common/say_link.h" #include #include @@ -61,7 +64,7 @@ void ZoneDatabase::AddLootTableToNPC(NPC* npc,uint32 loottable_id, ItemList* ite uint32 cash = 0; if (!bGlobal) { - if(max_cash > 0 && lts->avgcoin > 0 && EQEmu::ValueWithin(lts->avgcoin, min_cash, max_cash)) { + if(max_cash > 0 && lts->avgcoin > 0 && EQ::ValueWithin(lts->avgcoin, min_cash, max_cash)) { float upper_chance = (float)(lts->avgcoin - min_cash) / (float)(max_cash - min_cash); float avg_cash_roll = (float)zone->random.Real(0.0, 1.0); @@ -114,110 +117,128 @@ void ZoneDatabase::AddLootTableToNPC(NPC* npc,uint32 loottable_id, ItemList* ite // Called by AddLootTableToNPC // maxdrops = size of the array npcd -void ZoneDatabase::AddLootDropToNPC(NPC* npc,uint32 lootdrop_id, ItemList* itemlist, uint8 droplimit, uint8 mindrop) { - const LootDrop_Struct* lds = GetLootDrop(lootdrop_id); - if (!lds) { +void ZoneDatabase::AddLootDropToNPC(NPC *npc, uint32 lootdrop_id, ItemList *item_list, uint8 droplimit, uint8 mindrop) +{ + const LootDrop_Struct *loot_drop = GetLootDrop(lootdrop_id); + if (!loot_drop) { return; } - if(lds->NumEntries == 0) + if (loot_drop->NumEntries == 0) { return; + } - if(droplimit == 0 && mindrop == 0) { - for(uint32 i = 0; i < lds->NumEntries; ++i) { - int charges = lds->Entries[i].multiplier; - for(int j = 0; j < charges; ++j) { - if(zone->random.Real(0.0, 100.0) <= lds->Entries[i].chance) { - const EQEmu::ItemData* dbitem = GetItem(lds->Entries[i].item_id); - npc->AddLootDrop(dbitem, itemlist, lds->Entries[i].item_charges, lds->Entries[i].minlevel, - lds->Entries[i].maxlevel, lds->Entries[i].equip_item > 0 ? true : false, false); + if (droplimit == 0 && mindrop == 0) { + for (uint32 i = 0; i < loot_drop->NumEntries; ++i) { + int charges = loot_drop->Entries[i].multiplier; + for (int j = 0; j < charges; ++j) { + if (zone->random.Real(0.0, 100.0) <= loot_drop->Entries[i].chance && + npc->MeetsLootDropLevelRequirements(loot_drop->Entries[i])) { + const EQ::ItemData *database_item = GetItem(loot_drop->Entries[i].item_id); + npc->AddLootDrop( + database_item, + item_list, + loot_drop->Entries[i] + ); } } } return; } - if(lds->NumEntries > 100 && droplimit == 0) { + if (loot_drop->NumEntries > 100 && droplimit == 0) { droplimit = 10; } - if(droplimit < mindrop) { + if (droplimit < mindrop) { droplimit = mindrop; } - float roll_t = 0.0f; - float roll_t_min = 0.0f; - bool active_item_list = false; - for(uint32 i = 0; i < lds->NumEntries; ++i) { - const EQEmu::ItemData* db_item = GetItem(lds->Entries[i].item_id); - if(db_item) { - roll_t += lds->Entries[i].chance; + float roll_t = 0.0f; + float roll_t_min = 0.0f; + bool active_item_list = false; + for (uint32 i = 0; i < loot_drop->NumEntries; ++i) { + const EQ::ItemData *db_item = GetItem(loot_drop->Entries[i].item_id); + if (db_item) { + roll_t += loot_drop->Entries[i].chance; active_item_list = true; } } roll_t_min = roll_t; - roll_t = EQEmu::ClampLower(roll_t, 100.0f); + roll_t = EQ::ClampLower(roll_t, 100.0f); - if(!active_item_list) { + if (!active_item_list) { return; } - for(int i = 0; i < mindrop; ++i) { - float roll = (float)zone->random.Real(0.0, roll_t_min); - for(uint32 j = 0; j < lds->NumEntries; ++j) { - const EQEmu::ItemData* db_item = GetItem(lds->Entries[j].item_id); - if(db_item) { - if(roll < lds->Entries[j].chance) { - npc->AddLootDrop(db_item, itemlist, lds->Entries[j].item_charges, lds->Entries[j].minlevel, - lds->Entries[j].maxlevel, lds->Entries[j].equip_item > 0 ? true : false, false); + for (int i = 0; i < mindrop; ++i) { + float roll = (float) zone->random.Real(0.0, roll_t_min); + for (uint32 j = 0; j < loot_drop->NumEntries; ++j) { + const EQ::ItemData *db_item = GetItem(loot_drop->Entries[j].item_id); + if (db_item) { + if (roll < loot_drop->Entries[j].chance && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) { + npc->AddLootDrop( + db_item, + item_list, + loot_drop->Entries[j] + ); - int charges = (int)lds->Entries[i].multiplier; - charges = EQEmu::ClampLower(charges, 1); + int charges = (int) loot_drop->Entries[i].multiplier; + charges = EQ::ClampLower(charges, 1); - for(int k = 1; k < charges; ++k) { - float c_roll = (float)zone->random.Real(0.0, 100.0); - if(c_roll <= lds->Entries[i].chance) { - npc->AddLootDrop(db_item, itemlist, lds->Entries[j].item_charges, lds->Entries[j].minlevel, - lds->Entries[j].maxlevel, lds->Entries[j].equip_item > 0 ? true : false, false); + for (int k = 1; k < charges; ++k) { + float c_roll = (float) zone->random.Real(0.0, 100.0); + if (c_roll <= loot_drop->Entries[i].chance) { + npc->AddLootDrop( + db_item, + item_list, + loot_drop->Entries[i] + ); } } - j = lds->NumEntries; + j = loot_drop->NumEntries; break; } else { - roll -= lds->Entries[j].chance; + roll -= loot_drop->Entries[j].chance; } } } } - for(int i = mindrop; i < droplimit; ++i) { - float roll = (float)zone->random.Real(0.0, roll_t); - for(uint32 j = 0; j < lds->NumEntries; ++j) { - const EQEmu::ItemData* db_item = GetItem(lds->Entries[j].item_id); - if(db_item) { - if(roll < lds->Entries[j].chance) { - npc->AddLootDrop(db_item, itemlist, lds->Entries[j].item_charges, lds->Entries[j].minlevel, - lds->Entries[j].maxlevel, lds->Entries[j].equip_item > 0 ? true : false, false); + for (int i = mindrop; i < droplimit; ++i) { + float roll = (float) zone->random.Real(0.0, roll_t); + for (uint32 j = 0; j < loot_drop->NumEntries; ++j) { + const EQ::ItemData *db_item = GetItem(loot_drop->Entries[j].item_id); + if (db_item) { + if (roll < loot_drop->Entries[j].chance && npc->MeetsLootDropLevelRequirements(loot_drop->Entries[j])) { + npc->AddLootDrop( + db_item, + item_list, + loot_drop->Entries[j] + ); - int charges = (int)lds->Entries[i].multiplier; - charges = EQEmu::ClampLower(charges, 1); + int charges = (int) loot_drop->Entries[i].multiplier; + charges = EQ::ClampLower(charges, 1); - for(int k = 1; k < charges; ++k) { - float c_roll = (float)zone->random.Real(0.0, 100.0); - if(c_roll <= lds->Entries[i].chance) { - npc->AddLootDrop(db_item, itemlist, lds->Entries[j].item_charges, lds->Entries[j].minlevel, - lds->Entries[j].maxlevel, lds->Entries[j].equip_item > 0 ? true : false, false); + for (int k = 1; k < charges; ++k) { + float c_roll = (float) zone->random.Real(0.0, 100.0); + if (c_roll <= loot_drop->Entries[i].chance) { + npc->AddLootDrop( + db_item, + item_list, + loot_drop->Entries[i] + ); } } - j = lds->NumEntries; + j = loot_drop->NumEntries; break; } else { - roll -= lds->Entries[j].chance; + roll -= loot_drop->Entries[j].chance; } } } @@ -229,46 +250,119 @@ void ZoneDatabase::AddLootDropToNPC(NPC* npc,uint32 lootdrop_id, ItemList* iteml // npc->SendAppearancePacket(AT_Light, npc->GetActiveLightValue()); } -//if itemlist is null, just send wear changes -void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 charges, uint8 minlevel, uint8 maxlevel, bool equipit, bool wearchange, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6) { - if(item2 == nullptr) - return; - - //make sure we are doing something... - if(!itemlist && !wearchange) - return; - - auto item = new ServerLootItem_Struct; -#if EQDEBUG>=11 - LogDebug("Adding drop to npc: [{}], Item: [{}]", GetName(), item2->ID); -#endif - - EQApplicationPacket* outapp = nullptr; - WearChange_Struct* wc = nullptr; - if(wearchange) { - outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct)); - wc = (WearChange_Struct*)outapp->pBuffer; - wc->spawn_id = GetID(); - wc->material=0; +bool NPC::MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop) +{ + if (loot_drop.npc_min_level > 0 && GetLevel() < loot_drop.npc_min_level) { + LogLootDetail( + "NPC [{}] does not meet loot_drop level requirements (min_level) level [{}] current [{}] for item [{}]", + GetCleanName(), + loot_drop.npc_min_level, + GetLevel(), + database.CreateItemLink(loot_drop.item_id) + ); + return false; } - item->item_id = item2->ID; - item->charges = charges; - item->aug_1 = aug1; - item->aug_2 = aug2; - item->aug_3 = aug3; - item->aug_4 = aug4; - item->aug_5 = aug5; - item->aug_6 = aug6; - item->attuned = 0; - item->min_level = minlevel; - item->max_level = maxlevel; - item->equip_slot = EQEmu::invslot::SLOT_INVALID; + if (loot_drop.npc_max_level > 0 && GetLevel() > loot_drop.npc_max_level) { + LogLootDetail( + "NPC [{}] does not meet loot_drop level requirements (max_level) level [{}] current [{}] for item [{}]", + GetCleanName(), + loot_drop.npc_max_level, + GetLevel(), + database.CreateItemLink(loot_drop.item_id) + ); + return false; + } - if (equipit) { + return true; +} + +LootDropEntries_Struct NPC::NewLootDropEntry() +{ + LootDropEntries_Struct loot_drop{}; + loot_drop.item_id = 0; + loot_drop.item_charges = 1; + loot_drop.equip_item = 1; + loot_drop.chance = 0; + loot_drop.trivial_min_level = 0; + loot_drop.trivial_max_level = 0; + loot_drop.npc_min_level = 0; + loot_drop.npc_max_level = 0; + loot_drop.multiplier = 0; + + return loot_drop; +} + +//if itemlist is null, just send wear changes +void NPC::AddLootDrop( + const EQ::ItemData *item2, + ItemList *itemlist, + LootDropEntries_Struct loot_drop, + bool wear_change, + uint32 aug1, + uint32 aug2, + uint32 aug3, + uint32 aug4, + uint32 aug5, + uint32 aug6 +) +{ + if (item2 == nullptr) { + return; + } + + //make sure we are doing something... + if (!itemlist && !wear_change) { + return; + } + + auto item = new ServerLootItem_Struct; + + if (LogSys.log_settings[Logs::Loot].is_category_enabled == 1) { + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); + linker.SetItemData(item2); + + LogLoot( + "[NPC::AddLootDrop] NPC [{}] Item ({}) [{}] charges [{}] chance [{}] trivial min/max [{}/{}] npc min/max [{}/{}]", + GetName(), + item2->ID, + linker.GenerateLink(), + loot_drop.item_charges, + loot_drop.chance, + loot_drop.trivial_min_level, + loot_drop.trivial_max_level, + loot_drop.npc_min_level, + loot_drop.npc_max_level + ); + } + + EQApplicationPacket *outapp = nullptr; + WearChange_Struct *p_wear_change_struct = nullptr; + if (wear_change) { + outapp = new EQApplicationPacket(OP_WearChange, sizeof(WearChange_Struct)); + p_wear_change_struct = (WearChange_Struct *) outapp->pBuffer; + p_wear_change_struct->spawn_id = GetID(); + p_wear_change_struct->material = 0; + } + + item->item_id = item2->ID; + item->charges = loot_drop.item_charges; + item->aug_1 = aug1; + item->aug_2 = aug2; + item->aug_3 = aug3; + item->aug_4 = aug4; + item->aug_5 = aug5; + item->aug_6 = aug6; + item->attuned = 0; + item->trivial_min_level = loot_drop.trivial_min_level; + item->trivial_max_level = loot_drop.trivial_max_level; + item->equip_slot = EQ::invslot::SLOT_INVALID; + + if (loot_drop.equip_item > 0) { uint8 eslot = 0xFF; char newid[20]; - const EQEmu::ItemData* compitem = nullptr; + const EQ::ItemData* compitem = nullptr; bool found = false; // track if we found an empty slot we fit into int32 foundslot = -1; // for multi-slot items @@ -282,7 +376,7 @@ void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 ch // it is an improvement. if (!item2->NoPet) { - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; !found && i <= EQEmu::invslot::EQUIPMENT_END; i++) { + for (int i = EQ::invslot::EQUIPMENT_BEGIN; !found && i <= EQ::invslot::EQUIPMENT_END; i++) { uint32 slots = (1 << i); if (item2->Slots & slots) { if(equipment[i]) @@ -323,7 +417,7 @@ void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 ch // @merth: IDFile size has been increased, this needs to change uint16 emat; if(item2->Material <= 0 - || (item2->Slots & ((1 << EQEmu::invslot::slotPrimary) | (1 << EQEmu::invslot::slotSecondary)))) { + || (item2->Slots & ((1 << EQ::invslot::slotPrimary) | (1 << EQ::invslot::slotSecondary)))) { memset(newid, 0, sizeof(newid)); for(int i=0;i<7;i++){ if (!isalpha(item2->IDFile[i])){ @@ -337,11 +431,11 @@ void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 ch emat = item2->Material; } - if (foundslot == EQEmu::invslot::slotPrimary) { + if (foundslot == EQ::invslot::slotPrimary) { if (item2->Proc.Effect != 0) CastToMob()->AddProcToWeapon(item2->Proc.Effect, true); - eslot = EQEmu::textures::weaponPrimary; + eslot = EQ::textures::weaponPrimary; if (item2->Damage > 0) { SendAddPlayerState(PlayerState::PrimaryWeaponEquipped); if (!RuleB(Combat, ClassicNPCBackstab)) @@ -350,37 +444,37 @@ void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 ch if (item2->IsType2HWeapon()) SetTwoHanderEquipped(true); } - else if (foundslot == EQEmu::invslot::slotSecondary + else if (foundslot == EQ::invslot::slotSecondary && (GetOwner() != nullptr || (CanThisClassDualWield() && zone->random.Roll(NPC_DW_CHANCE)) || (item2->Damage==0)) && - (item2->IsType1HWeapon() || item2->ItemType == EQEmu::item::ItemTypeShield || item2->ItemType == EQEmu::item::ItemTypeLight)) + (item2->IsType1HWeapon() || item2->ItemType == EQ::item::ItemTypeShield || item2->ItemType == EQ::item::ItemTypeLight)) { if (item2->Proc.Effect!=0) CastToMob()->AddProcToWeapon(item2->Proc.Effect, true); - eslot = EQEmu::textures::weaponSecondary; + eslot = EQ::textures::weaponSecondary; if (item2->Damage > 0) SendAddPlayerState(PlayerState::SecondaryWeaponEquipped); } - else if (foundslot == EQEmu::invslot::slotHead) { - eslot = EQEmu::textures::armorHead; + else if (foundslot == EQ::invslot::slotHead) { + eslot = EQ::textures::armorHead; } - else if (foundslot == EQEmu::invslot::slotChest) { - eslot = EQEmu::textures::armorChest; + else if (foundslot == EQ::invslot::slotChest) { + eslot = EQ::textures::armorChest; } - else if (foundslot == EQEmu::invslot::slotArms) { - eslot = EQEmu::textures::armorArms; + else if (foundslot == EQ::invslot::slotArms) { + eslot = EQ::textures::armorArms; } - else if (foundslot == EQEmu::invslot::slotWrist1 || foundslot == EQEmu::invslot::slotWrist2) { - eslot = EQEmu::textures::armorWrist; + else if (foundslot == EQ::invslot::slotWrist1 || foundslot == EQ::invslot::slotWrist2) { + eslot = EQ::textures::armorWrist; } - else if (foundslot == EQEmu::invslot::slotHands) { - eslot = EQEmu::textures::armorHands; + else if (foundslot == EQ::invslot::slotHands) { + eslot = EQ::textures::armorHands; } - else if (foundslot == EQEmu::invslot::slotLegs) { - eslot = EQEmu::textures::armorLegs; + else if (foundslot == EQ::invslot::slotLegs) { + eslot = EQ::textures::armorLegs; } - else if (foundslot == EQEmu::invslot::slotFeet) { - eslot = EQEmu::textures::armorFeet; + else if (foundslot == EQ::invslot::slotFeet) { + eslot = EQ::textures::armorFeet; } /* @@ -401,9 +495,9 @@ void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 ch //if we found an open slot it goes in... if(eslot != 0xFF) { - if(wearchange) { - wc->wear_slot_id = eslot; - wc->material = emat; + if(wear_change) { + p_wear_change_struct->wear_slot_id = eslot; + p_wear_change_struct->material = emat; } } @@ -413,32 +507,55 @@ void NPC::AddLootDrop(const EQEmu::ItemData *item2, ItemList* itemlist, int16 ch } } - if(itemlist != nullptr) + if (itemlist != nullptr) { itemlist->push_back(item); - else - safe_delete(item); + } + else safe_delete(item); - if(wearchange && outapp) { + if (wear_change && outapp) { entity_list.QueueClients(this, outapp); safe_delete(outapp); } UpdateEquipmentLight(); - if (UpdateActiveLight()) + if (UpdateActiveLight()) { SendAppearancePacket(AT_Light, GetActiveLightType()); + } } -void NPC::AddItem(const EQEmu::ItemData* item, uint16 charges, bool equipitem) { +void NPC::AddItem(const EQ::ItemData *item, uint16 charges, bool equipitem) +{ //slot isnt needed, its determined from the item. - AddLootDrop(item, &itemlist, charges, 1, 255, equipitem, equipitem); + auto loot_drop_entry = NPC::NewLootDropEntry(); + loot_drop_entry.equip_item = static_cast(equipitem ? 1 : 0); + loot_drop_entry.item_charges = charges; + + AddLootDrop(item, &itemlist, loot_drop_entry, true); } -void NPC::AddItem(uint32 itemid, uint16 charges, bool equipitem, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6) { +void NPC::AddItem( + uint32 itemid, + uint16 charges, + bool equipitem, + uint32 aug1, + uint32 aug2, + uint32 aug3, + uint32 aug4, + uint32 aug5, + uint32 aug6 +) +{ //slot isnt needed, its determined from the item. - const EQEmu::ItemData * i = database.GetItem(itemid); - if(i == nullptr) + const EQ::ItemData *i = database.GetItem(itemid); + if (i == nullptr) { return; - AddLootDrop(i, &itemlist, charges, 1, 255, equipitem, equipitem, aug1, aug2, aug3, aug4, aug5, aug6); + } + + auto loot_drop_entry = NPC::NewLootDropEntry(); + loot_drop_entry.equip_item = static_cast(equipitem ? 1 : 0); + loot_drop_entry.item_charges = charges; + + AddLootDrop(i, &itemlist, loot_drop_entry, true, aug1, aug2, aug3, aug4, aug5, aug6); } void NPC::AddLootTable() { @@ -463,42 +580,70 @@ void NPC::CheckGlobalLootTables() void ZoneDatabase::LoadGlobalLoot() { - auto query = StringFormat("SELECT id, loottable_id, description, min_level, max_level, rare, raid, race, " - "class, bodytype, zone, hot_zone FROM global_loot WHERE enabled = 1"); + auto query = fmt::format( + SQL + ( + SELECT + id, + loottable_id, + description, + min_level, + max_level, + rare, + raid, + race, + class, + bodytype, + zone, + hot_zone + FROM + global_loot + WHERE + enabled = 1 + {} + ), + ContentFilterCriteria::apply() + ); auto results = QueryDatabase(query); - if (!results.Success() || results.RowCount() == 0) + if (!results.Success() || results.RowCount() == 0) { return; + } // we might need this, lets not keep doing it in a loop - auto zoneid = std::to_string(zone->GetZoneID()); - for (auto row = results.begin(); row != results.end(); ++row) { + auto zoneid = std::to_string(zone->GetZoneID()); + for (auto row = results.begin(); row != results.end(); ++row) { // checking zone limits if (row[10]) { auto zones = SplitString(row[10], '|'); auto it = std::find(zones.begin(), zones.end(), zoneid); - if (it == zones.end()) // not in here, skip + if (it == zones.end()) { // not in here, skip continue; + } } GlobalLootEntry e(atoi(row[0]), atoi(row[1]), row[2] ? row[2] : ""); auto min_level = atoi(row[3]); - if (min_level) + if (min_level) { e.AddRule(GlobalLoot::RuleTypes::LevelMin, min_level); + } auto max_level = atoi(row[4]); - if (max_level) + if (max_level) { e.AddRule(GlobalLoot::RuleTypes::LevelMax, max_level); + } // null is not used - if (row[5]) + if (row[5]) { e.AddRule(GlobalLoot::RuleTypes::Rare, atoi(row[5])); + } // null is not used - if (row[6]) + if (row[6]) { e.AddRule(GlobalLoot::RuleTypes::Raid, atoi(row[6])); + } if (row[7]) { auto races = SplitString(row[7], '|'); @@ -522,8 +667,9 @@ void ZoneDatabase::LoadGlobalLoot() } // null is not used - if (row[11]) + if (row[11]) { e.AddRule(GlobalLoot::RuleTypes::HotZone, atoi(row[11])); + } zone->AddGlobalLootEntry(e); } diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 9d0873360..6b6265ce5 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -4,7 +4,10 @@ #include #include "client.h" +#include "dynamic_zone.h" +#include "expedition_request.h" #include "lua_client.h" +#include "lua_expedition.h" #include "lua_npc.h" #include "lua_item.h" #include "lua_iteminst.h" @@ -12,6 +15,7 @@ #include "lua_group.h" #include "lua_raid.h" #include "lua_packet.h" +#include "../common/expedition_lockout_timer.h" struct InventoryWhere { }; @@ -65,9 +69,24 @@ void Lua_Client::WorldKick() { self->WorldKick(); } -bool Lua_Client::GetAnon() { - Lua_Safe_Call_Bool(); - return self->GetAnon() != 0; +int Lua_Client::GetAFK() { + Lua_Safe_Call_Int(); + return self->GetAFK(); +} + +void Lua_Client::SetAFK(uint8 afk_flag) { + Lua_Safe_Call_Void(); + self->SetAFK(afk_flag); +} + +int Lua_Client::GetAnon() { + Lua_Safe_Call_Int(); + return self->GetAnon(); +} + +void Lua_Client::SetAnon(uint8 anon_flag) { + Lua_Safe_Call_Void(); + self->SetAnon(anon_flag); } void Lua_Client::Duck() { @@ -75,6 +94,16 @@ void Lua_Client::Duck() { self->Duck(); } +void Lua_Client::DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue) { + Lua_Safe_Call_Void(); + self->DyeArmorBySlot(slot, red, green, blue); +} + +void Lua_Client::DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue, uint8 use_tint) { + Lua_Safe_Call_Void(); + self->DyeArmorBySlot(slot, red, green, blue, use_tint); +} + void Lua_Client::Stand() { Lua_Safe_Call_Void(); self->Stand(); @@ -90,6 +119,11 @@ void Lua_Client::SetPVP(bool v) { self->SetPVP(v); } +void Lua_Client::SendToGuildHall() { + Lua_Safe_Call_Void(); + self->SendToGuildHall(); +} + bool Lua_Client::GetPVP() { Lua_Safe_Call_Bool(); return self->GetPVP(); @@ -115,6 +149,16 @@ void Lua_Client::SetBaseGender(int v) { self->SetBaseGender(v); } +int Lua_Client::GetClassBitmask() { + Lua_Safe_Call_Int(); + return GetPlayerClassBit(self->GetClass()); +} + +int Lua_Client::GetRaceBitmask() { + Lua_Safe_Call_Int(); + return GetPlayerRaceBit(self->GetBaseRace()); +} + int Lua_Client::GetBaseFace() { Lua_Safe_Call_Int(); return self->GetBaseFace(); @@ -125,11 +169,6 @@ int Lua_Client::GetLanguageSkill(int skill_id) { return self->GetLanguageSkill(skill_id); } -const char *Lua_Client::GetLastName() { - Lua_Safe_Call_String(); - return self->GetLastName(); -} - int Lua_Client::GetLDoNPointsTheme(int theme) { Lua_Safe_Call_Int(); return self->GetLDoNPointsTheme(theme); @@ -260,6 +299,11 @@ void Lua_Client::SetBindPoint(int to_zone, int to_instance, float new_x, float n self->SetBindPoint(0, to_zone, to_instance, glm::vec3(new_x, new_y, new_z)); } +void Lua_Client::SetBindPoint(int to_zone, int to_instance, float new_x, float new_y, float new_z, float new_heading) { + Lua_Safe_Call_Void(); + self->SetBindPoint2(0, to_zone, to_instance, glm::vec4(new_x, new_y, new_z, new_heading)); +} + float Lua_Client::GetBindX() { Lua_Safe_Call_Real(); return self->GetBindX(); @@ -310,6 +354,21 @@ uint32 Lua_Client::GetBindZoneID(int index) { return self->GetBindZoneID(index); } +float Lua_Client::GetTargetRingX() { + Lua_Safe_Call_Real(); + return self->GetTargetRingX(); +} + +float Lua_Client::GetTargetRingY() { + Lua_Safe_Call_Real(); + return self->GetTargetRingY(); +} + +float Lua_Client::GetTargetRingZ() { + Lua_Safe_Call_Real(); + return self->GetTargetRingZ(); +} + void Lua_Client::MovePC(int zone, float x, float y, float z, float heading) { Lua_Safe_Call_Void(); self->MovePC(zone, x, y, z, heading); @@ -320,6 +379,36 @@ void Lua_Client::MovePCInstance(int zone, int instance, float x, float y, float self->MovePC(zone, instance, x, y, z, heading); } +void Lua_Client::MoveZone(const char *zone_short_name) { + Lua_Safe_Call_Void(); + self->MoveZone(zone_short_name); +} + +void Lua_Client::MoveZoneGroup(const char *zone_short_name) { + Lua_Safe_Call_Void(); + self->MoveZoneGroup(zone_short_name); +} + +void Lua_Client::MoveZoneRaid(const char *zone_short_name) { + Lua_Safe_Call_Void(); + self->MoveZoneRaid(zone_short_name); +} + +void Lua_Client::MoveZoneInstance(uint16 instance_id) { + Lua_Safe_Call_Void(); + self->MoveZoneInstance(instance_id); +} + +void Lua_Client::MoveZoneInstanceGroup(uint16 instance_id) { + Lua_Safe_Call_Void(); + self->MoveZoneInstanceGroup(instance_id); +} + +void Lua_Client::MoveZoneInstanceRaid(uint16 instance_id) { + Lua_Safe_Call_Void(); + self->MoveZoneInstanceRaid(instance_id); +} + void Lua_Client::ChangeLastName(const char *in) { Lua_Safe_Call_Void(); self->ChangeLastName(in); @@ -437,27 +526,27 @@ void Lua_Client::IncreaseLanguageSkill(int skill_id, int value) { int Lua_Client::GetRawSkill(int skill_id) { Lua_Safe_Call_Int(); - return self->GetRawSkill(static_cast(skill_id)); + return self->GetRawSkill(static_cast(skill_id)); } bool Lua_Client::HasSkill(int skill_id) { Lua_Safe_Call_Bool(); - return self->HasSkill(static_cast(skill_id)); + return self->HasSkill(static_cast(skill_id)); } bool Lua_Client::CanHaveSkill(int skill_id) { Lua_Safe_Call_Bool(); - return self->CanHaveSkill(static_cast(skill_id)); + return self->CanHaveSkill(static_cast(skill_id)); } void Lua_Client::SetSkill(int skill_id, int value) { Lua_Safe_Call_Void(); - self->SetSkill(static_cast(skill_id), value); + self->SetSkill(static_cast(skill_id), value); } void Lua_Client::AddSkill(int skill_id, int value) { Lua_Safe_Call_Void(); - self->AddSkill(static_cast(skill_id), value); + self->AddSkill(static_cast(skill_id), value); } void Lua_Client::CheckSpecializeIncrease(int spell_id) { @@ -467,12 +556,12 @@ void Lua_Client::CheckSpecializeIncrease(int spell_id) { void Lua_Client::CheckIncreaseSkill(int skill_id, Lua_Mob target) { Lua_Safe_Call_Void(); - self->CheckIncreaseSkill(static_cast(skill_id), target); + self->CheckIncreaseSkill(static_cast(skill_id), target); } void Lua_Client::CheckIncreaseSkill(int skill_id, Lua_Mob target, int chance_mod) { Lua_Safe_Call_Void(); - self->CheckIncreaseSkill(static_cast(skill_id), target, chance_mod); + self->CheckIncreaseSkill(static_cast(skill_id), target, chance_mod); } void Lua_Client::SetLanguageSkill(int language, int value) { @@ -482,7 +571,7 @@ void Lua_Client::SetLanguageSkill(int language, int value) { int Lua_Client::MaxSkill(int skill_id) { Lua_Safe_Call_Int(); - return self->MaxSkill(static_cast(skill_id)); + return self->MaxSkill(static_cast(skill_id)); } bool Lua_Client::IsMedding() { @@ -560,6 +649,132 @@ int Lua_Client::MemmedCount() { return self->MemmedCount(); } +luabind::object Lua_Client::GetLearnableDisciplines(lua_State* L) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto learnable_disciplines = self->GetLearnableDisciplines(); + int index = 0; + for (auto spell_id : learnable_disciplines) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetLearnableDisciplines(lua_State* L, uint8 min_level) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto learnable_disciplines = self->GetLearnableDisciplines(min_level); + int index = 0; + for (auto spell_id : learnable_disciplines) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetLearnableDisciplines(lua_State* L, uint8 min_level, uint8 max_level) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto learnable_disciplines = self->GetLearnableDisciplines(min_level, max_level); + int index = 0; + for (auto spell_id : learnable_disciplines) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetLearnedDisciplines(lua_State* L) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto learned_disciplines = self->GetLearnedDisciplines(); + int index = 0; + for (auto spell_id : learned_disciplines) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetMemmedSpells(lua_State* L) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto memmed_spells = self->GetMemmedSpells(); + int index = 0; + for (auto spell_id : memmed_spells) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetScribeableSpells(lua_State* L) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto scribeable_spells = self->GetScribeableSpells(); + int index = 0; + for (auto spell_id : scribeable_spells) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetScribeableSpells(lua_State* L, uint8 min_level) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto scribeable_spells = self->GetScribeableSpells(min_level); + int index = 0; + for (auto spell_id : scribeable_spells) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetScribeableSpells(lua_State* L, uint8 min_level, uint8 max_level) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto scribeable_spells = self->GetScribeableSpells(min_level, max_level); + int index = 0; + for (auto spell_id : scribeable_spells) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + +luabind::object Lua_Client::GetScribedSpells(lua_State* L) { + auto lua_table = luabind::newtable(L); + if (d_) { + auto self = reinterpret_cast(d_); + auto scribed_spells = self->GetScribedSpells(); + int index = 0; + for (auto spell_id : scribed_spells) { + lua_table[index] = spell_id; + index++; + } + } + return lua_table; +} + void Lua_Client::ScribeSpell(int spell_id, int slot) { Lua_Safe_Call_Void(); self->ScribeSpell(spell_id, slot); @@ -840,11 +1055,26 @@ void Lua_Client::ResetTrade() { self->ResetTrade(); } +uint32 Lua_Client::GetDisciplineTimer(uint32 timer_id) { + Lua_Safe_Call_Int(); + return self->GetDisciplineTimer(timer_id); +} + +void Lua_Client::ResetDisciplineTimer(uint32 timer_id) { + Lua_Safe_Call_Void(); + self->ResetDisciplineTimer(timer_id); +} + bool Lua_Client::UseDiscipline(int spell_id, int target_id) { Lua_Safe_Call_Bool(); return self->UseDiscipline(spell_id, target_id); } +bool Lua_Client::HasDisciplineLearned(uint16 spell_id) { + Lua_Safe_Call_Bool(); + return self->HasDisciplineLearned(spell_id); +} + int Lua_Client::GetCharacterFactionLevel(int faction_id) { Lua_Safe_Call_Int(); return self->GetCharacterFactionLevel(faction_id); @@ -985,6 +1215,16 @@ void Lua_Client::AddCrystals(uint32 radiant, uint32 ebon) { self->AddCrystals(radiant, ebon); } +void Lua_Client::SetEbonCrystals(uint32 value) { + Lua_Safe_Call_Void(); + self->SetEbonCrystals(value); +} + +void Lua_Client::SetRadiantCrystals(uint32 value) { + Lua_Safe_Call_Void(); + self->SetRadiantCrystals(value); +} + uint32 Lua_Client::GetPVPPoints() { Lua_Safe_Call_Int(); return self->GetPVPPoints(); @@ -1105,6 +1345,11 @@ int Lua_Client::GetNextAvailableSpellBookSlot() { return self->GetNextAvailableSpellBookSlot(); } +uint32 Lua_Client::GetSpellIDByBookSlot(int slot_id) { + Lua_Safe_Call_Int(); + return self->GetSpellIDByBookSlot(slot_id); +} + int Lua_Client::GetNextAvailableSpellBookSlot(int start) { Lua_Safe_Call_Int(); return self->GetNextAvailableSpellBookSlot(start); @@ -1205,6 +1450,11 @@ void Lua_Client::OpenLFGuildWindow() { self->OpenLFGuildWindow(); } +void Lua_Client::NotifyNewTitlesAvailable() { + Lua_Safe_Call_Void(); + self->NotifyNewTitlesAvailable(); +} + void Lua_Client::Signal(uint32 id) { Lua_Safe_Call_Void(); self->Signal(id); @@ -1257,13 +1507,13 @@ Lua_Raid Lua_Client::GetRaid() { bool Lua_Client::PutItemInInventory(int slot_id, Lua_ItemInst inst) { Lua_Safe_Call_Bool(); - EQEmu::ItemInstance *rinst = inst; + EQ::ItemInstance *rinst = inst; return self->PutItemInInventory(slot_id, *rinst, true); } bool Lua_Client::PushItemOnCursor(Lua_ItemInst inst) { Lua_Safe_Call_Bool(); - EQEmu::ItemInstance *rinst = inst; + EQ::ItemInstance *rinst = inst; return self->PushItemOnCursor(*rinst, true); } @@ -1569,7 +1819,269 @@ int Lua_Client::GetClientMaxLevel() { return self->GetClientMaxLevel(); } +DynamicZoneLocation GetDynamicZoneLocationFromTable(const luabind::object& lua_table) +{ + DynamicZoneLocation zone_location; + if (luabind::type(lua_table) == LUA_TTABLE) + { + luabind::object lua_zone = lua_table["zone"]; + + // default invalid/missing args to 0 + uint32_t zone_id = 0; + if (luabind::type(lua_zone) == LUA_TSTRING) + { + zone_id = ZoneID(luabind::object_cast(lua_zone)); + } + else if (luabind::type(lua_zone) == LUA_TNUMBER) + { + zone_id = luabind::object_cast(lua_zone); + } + + float x = (luabind::type(lua_table["x"]) != LUA_TNIL) ? luabind::object_cast(lua_table["x"]) : 0.0f; + float y = (luabind::type(lua_table["y"]) != LUA_TNIL) ? luabind::object_cast(lua_table["y"]) : 0.0f; + float z = (luabind::type(lua_table["z"]) != LUA_TNIL) ? luabind::object_cast(lua_table["z"]) : 0.0f; + float h = (luabind::type(lua_table["h"]) != LUA_TNIL) ? luabind::object_cast(lua_table["h"]) : 0.0f; + + zone_location = { zone_id, x, y, z, h }; + } + + return zone_location; +} + +Lua_Expedition Lua_Client::CreateExpedition(luabind::object expedition_table) { + Lua_Safe_Call_Class(Lua_Expedition); + + if (luabind::type(expedition_table) != LUA_TTABLE) + { + return nullptr; + } + + // luabind will catch thrown cast_failed exceptions for invalid/missing args + luabind::object instance_info = expedition_table["instance"]; + luabind::object zone = instance_info["zone"]; + + uint32_t zone_id = 0; + if (luabind::type(zone) == LUA_TSTRING) + { + zone_id = ZoneID(luabind::object_cast(zone)); + } + else if (luabind::type(zone) == LUA_TNUMBER) + { + zone_id = luabind::object_cast(zone); + } + + uint32_t zone_version = luabind::object_cast(instance_info["version"]); + uint32_t zone_duration = luabind::object_cast(instance_info["duration"]); + + DynamicZone dz{ zone_id, zone_version, zone_duration, DynamicZoneType::Expedition }; + + // the dz_info table supports optional hash entries for 'compass', 'safereturn', and 'zonein' data + if (luabind::type(expedition_table["compass"]) == LUA_TTABLE) + { + auto compass_loc = GetDynamicZoneLocationFromTable(expedition_table["compass"]); + dz.SetCompass(compass_loc); + } + + if (luabind::type(expedition_table["safereturn"]) == LUA_TTABLE) + { + auto safereturn_loc = GetDynamicZoneLocationFromTable(expedition_table["safereturn"]); + dz.SetSafeReturn(safereturn_loc); + } + + if (luabind::type(expedition_table["zonein"]) == LUA_TTABLE) + { + auto zonein_loc = GetDynamicZoneLocationFromTable(expedition_table["zonein"]); + dz.SetZoneInLocation(zonein_loc); + } + + luabind::object expedition_info = expedition_table["expedition"]; + + std::string expedition_name = luabind::object_cast(expedition_info["name"]); + uint32_t min_players = luabind::object_cast(expedition_info["min_players"]); + uint32_t max_players = luabind::object_cast(expedition_info["max_players"]); + bool disable_messages = false; + + if (luabind::type(expedition_info["disable_messages"]) == LUA_TBOOLEAN) + { + disable_messages = luabind::object_cast(expedition_info["disable_messages"]); + } + + ExpeditionRequest request{ expedition_name, min_players, max_players, disable_messages }; + + return self->CreateExpedition(dz, request); +} + +Lua_Expedition Lua_Client::CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players) { + Lua_Safe_Call_Class(Lua_Expedition); + return self->CreateExpedition(zone_name, version, duration, expedition_name, min_players, max_players); +} + +Lua_Expedition Lua_Client::CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool disable_messages) { + Lua_Safe_Call_Class(Lua_Expedition); + return self->CreateExpedition(zone_name, version, duration, expedition_name, min_players, max_players, disable_messages); +} + +Lua_Expedition Lua_Client::GetExpedition() { + Lua_Safe_Call_Class(Lua_Expedition); + return self->GetExpedition(); +} + +luabind::object Lua_Client::GetExpeditionLockouts(lua_State* L) +{ + auto lua_table = luabind::newtable(L); + if (d_) + { + auto self = reinterpret_cast(d_); + auto lockouts = self->GetExpeditionLockouts(); + + for (const auto& lockout : lockouts) + { + auto lockout_table = lua_table[lockout.GetExpeditionName()]; + if (luabind::type(lockout_table) != LUA_TTABLE) + { + lockout_table = luabind::newtable(L); + } + lockout_table[lockout.GetEventName()] = lockout.GetSecondsRemaining(); + } + } + return lua_table; +} + +luabind::object Lua_Client::GetExpeditionLockouts(lua_State* L, std::string expedition_name) +{ + auto lua_table = luabind::newtable(L); + if (d_) + { + auto self = reinterpret_cast(d_); + auto lockouts = self->GetExpeditionLockouts(); + + for (const auto& lockout : lockouts) + { + if (lockout.GetExpeditionName() == expedition_name) + { + lua_table[lockout.GetEventName()] = lockout.GetSecondsRemaining(); + } + } + } + return lua_table; +} + +std::string Lua_Client::GetLockoutExpeditionUUID(std::string expedition_name, std::string event_name) { + Lua_Safe_Call_String(); + std::string uuid; + auto lockout = self->GetExpeditionLockout(expedition_name, event_name); + if (lockout) + { + uuid = lockout->GetExpeditionUUID(); + } + return uuid; +} + +void Lua_Client::AddExpeditionLockout(std::string expedition_name, std::string event_name, uint32 seconds) { + Lua_Safe_Call_Void(); + self->AddNewExpeditionLockout(expedition_name, event_name, seconds); +} + +void Lua_Client::AddExpeditionLockout(std::string expedition_name, std::string event_name, uint32 seconds, std::string uuid) { + Lua_Safe_Call_Void(); + self->AddNewExpeditionLockout(expedition_name, event_name, seconds, uuid); +} + +void Lua_Client::AddExpeditionLockoutDuration(std::string expedition_name, std::string event_name, int seconds) { + Lua_Safe_Call_Void(); + self->AddExpeditionLockoutDuration(expedition_name, event_name, seconds, {}, true); +} + +void Lua_Client::AddExpeditionLockoutDuration(std::string expedition_name, std::string event_name, int seconds, std::string uuid) { + Lua_Safe_Call_Void(); + self->AddExpeditionLockoutDuration(expedition_name, event_name, seconds, uuid, true); +} + +void Lua_Client::RemoveAllExpeditionLockouts() { + Lua_Safe_Call_Void(); + self->RemoveAllExpeditionLockouts({}, true); +} + +void Lua_Client::RemoveAllExpeditionLockouts(std::string expedition_name) { + Lua_Safe_Call_Void(); + self->RemoveAllExpeditionLockouts(expedition_name, true); +} + +void Lua_Client::RemoveExpeditionLockout(std::string expedition_name, std::string event_name) { + Lua_Safe_Call_Void(); + self->RemoveExpeditionLockout(expedition_name, event_name, true); +} + +bool Lua_Client::HasExpeditionLockout(std::string expedition_name, std::string event_name) { + Lua_Safe_Call_Bool(); + return self->HasExpeditionLockout(expedition_name, event_name); +} + +void Lua_Client::MovePCDynamicZone(uint32 zone_id) { + Lua_Safe_Call_Void(); + return self->MovePCDynamicZone(zone_id); +} + +void Lua_Client::MovePCDynamicZone(uint32 zone_id, int zone_version) { + Lua_Safe_Call_Void(); + return self->MovePCDynamicZone(zone_id, zone_version); +} + +void Lua_Client::MovePCDynamicZone(uint32 zone_id, int zone_version, bool msg_if_invalid) { + Lua_Safe_Call_Void(); + return self->MovePCDynamicZone(zone_id, zone_version, msg_if_invalid); +} + +void Lua_Client::MovePCDynamicZone(std::string zone_name) { + Lua_Safe_Call_Void(); + return self->MovePCDynamicZone(zone_name); +} + +void Lua_Client::MovePCDynamicZone(std::string zone_name, int zone_version) { + Lua_Safe_Call_Void(); + return self->MovePCDynamicZone(zone_name, zone_version); +} + +void Lua_Client::MovePCDynamicZone(std::string zone_name, int zone_version, bool msg_if_invalid) { + Lua_Safe_Call_Void(); + return self->MovePCDynamicZone(zone_name, zone_version, msg_if_invalid); +} + +void Lua_Client::Fling(float value, float target_x, float target_y, float target_z) { + Lua_Safe_Call_Void(); + self->Fling(value, target_x, target_y, target_z); +} + +void Lua_Client::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los) { + Lua_Safe_Call_Void(); + self->Fling(value, target_x, target_y, target_z, ignore_los); +} + +void Lua_Client::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clipping) { + Lua_Safe_Call_Void(); + self->Fling(value, target_x, target_y, target_z, ignore_los, clipping); +} + +double Lua_Client::GetAAEXPModifier(uint32 zone_id) { + Lua_Safe_Call_Real(); + return self->GetAAEXPModifier(zone_id); +} + +double Lua_Client::GetEXPModifier(uint32 zone_id) { + Lua_Safe_Call_Real(); + return self->GetEXPModifier(zone_id); +} + +void Lua_Client::SetAAEXPModifier(uint32 zone_id, double aa_modifier) { + Lua_Safe_Call_Void(); + self->SetAAEXPModifier(zone_id, aa_modifier); +} + +void Lua_Client::SetEXPModifier(uint32 zone_id, double exp_modifier) { + Lua_Safe_Call_Void(); + self->SetEXPModifier(zone_id, exp_modifier); +} luabind::scope lua_register_client() { return luabind::class_("Client") @@ -1584,8 +2096,14 @@ luabind::scope lua_register_client() { .def("Disconnect", (void(Lua_Client::*)(void))&Lua_Client::Disconnect) .def("IsLD", (bool(Lua_Client::*)(void))&Lua_Client::IsLD) .def("WorldKick", (void(Lua_Client::*)(void))&Lua_Client::WorldKick) - .def("GetAnon", (bool(Lua_Client::*)(void))&Lua_Client::GetAnon) + .def("SendToGuildHall", (void(Lua_Client::*)(void))&Lua_Client::SendToGuildHall) + .def("GetAFK", (int(Lua_Client::*)(void))&Lua_Client::GetAFK) + .def("SetAFK", (void(Lua_Client::*)(uint8))&Lua_Client::SetAFK) + .def("GetAnon", (int(Lua_Client::*)(void))&Lua_Client::GetAnon) + .def("SetAnon", (void(Lua_Client::*)(uint8))&Lua_Client::SetAnon) .def("Duck", (void(Lua_Client::*)(void))&Lua_Client::Duck) + .def("DyeArmorBySlot", (void(Lua_Client::*)(uint8,uint8,uint8,uint8))&Lua_Client::DyeArmorBySlot) + .def("DyeArmorBySlot", (void(Lua_Client::*)(uint8,uint8,uint8,uint8,uint8))&Lua_Client::DyeArmorBySlot) .def("Stand", (void(Lua_Client::*)(void))&Lua_Client::Stand) .def("SetGM", (void(Lua_Client::*)(bool))&Lua_Client::SetGM) .def("SetPVP", (void(Lua_Client::*)(bool))&Lua_Client::SetPVP) @@ -1594,9 +2112,10 @@ luabind::scope lua_register_client() { .def("SetBaseClass", (void(Lua_Client::*)(int))&Lua_Client::SetBaseClass) .def("SetBaseRace", (void(Lua_Client::*)(int))&Lua_Client::SetBaseRace) .def("SetBaseGender", (void(Lua_Client::*)(int))&Lua_Client::SetBaseGender) + .def("GetClassBitmask", (int(Lua_Client::*)(void))&Lua_Client::GetClassBitmask) + .def("GetRaceBitmask", (int(Lua_Client::*)(void))&Lua_Client::GetRaceBitmask) .def("GetBaseFace", (int(Lua_Client::*)(void))&Lua_Client::GetBaseFace) .def("GetLanguageSkill", (int(Lua_Client::*)(int))&Lua_Client::GetLanguageSkill) - .def("GetLastName", (const char *(Lua_Client::*)(void))&Lua_Client::GetLastName) .def("GetLDoNPointsTheme", (int(Lua_Client::*)(int))&Lua_Client::GetLDoNPointsTheme) .def("GetBaseSTR", (int(Lua_Client::*)(void))&Lua_Client::GetBaseSTR) .def("GetBaseSTA", (int(Lua_Client::*)(void))&Lua_Client::GetBaseSTA) @@ -1622,7 +2141,8 @@ luabind::scope lua_register_client() { .def("SetBindPoint", (void(Lua_Client::*)(int,int))&Lua_Client::SetBindPoint) .def("SetBindPoint", (void(Lua_Client::*)(int,int,float))&Lua_Client::SetBindPoint) .def("SetBindPoint", (void(Lua_Client::*)(int,int,float,float))&Lua_Client::SetBindPoint) - .def("SetBindPoint", (void(Lua_Client::*)(int,int,float,float, float))&Lua_Client::SetBindPoint) + .def("SetBindPoint", (void(Lua_Client::*)(int,int,float,float,float))&Lua_Client::SetBindPoint) + .def("SetBindPoint", (void(Lua_Client::*)(int,int,float,float,float,float))&Lua_Client::SetBindPoint) .def("GetBindX", (float(Lua_Client::*)(void))&Lua_Client::GetBindX) .def("GetBindX", (float(Lua_Client::*)(int))&Lua_Client::GetBindX) .def("GetBindY", (float(Lua_Client::*)(void))&Lua_Client::GetBindY) @@ -1633,10 +2153,19 @@ luabind::scope lua_register_client() { .def("GetBindHeading", (float(Lua_Client::*)(int))&Lua_Client::GetBindHeading) .def("GetBindZoneID", (uint32(Lua_Client::*)(void))&Lua_Client::GetBindZoneID) .def("GetBindZoneID", (uint32(Lua_Client::*)(int))&Lua_Client::GetBindZoneID) + .def("GetTargetRingX", (float(Lua_Client::*)(void))&Lua_Client::GetTargetRingX) + .def("GetTargetRingY", (float(Lua_Client::*)(void))&Lua_Client::GetTargetRingY) + .def("GetTargetRingZ", (float(Lua_Client::*)(void))&Lua_Client::GetTargetRingZ) .def("SetPrimaryWeaponOrnamentation", (void(Lua_Client::*)(uint32))&Lua_Client::SetPrimaryWeaponOrnamentation) .def("SetSecondaryWeaponOrnamentation", (void(Lua_Client::*)(uint32))&Lua_Client::SetSecondaryWeaponOrnamentation) .def("MovePC", (void(Lua_Client::*)(int,float,float,float,float))&Lua_Client::MovePC) .def("MovePCInstance", (void(Lua_Client::*)(int,int,float,float,float,float))&Lua_Client::MovePCInstance) + .def("MoveZone", (void(Lua_Client::*)(const char*))&Lua_Client::MoveZone) + .def("MoveZoneGroup", (void(Lua_Client::*)(const char*))&Lua_Client::MoveZoneGroup) + .def("MoveZoneRaid", (void(Lua_Client::*)(const char*))&Lua_Client::MoveZoneRaid) + .def("MoveZoneInstance", (void(Lua_Client::*)(uint16))&Lua_Client::MoveZoneInstance) + .def("MoveZoneInstanceGroup", (void(Lua_Client::*)(uint16))&Lua_Client::MoveZoneInstanceGroup) + .def("MoveZoneInstanceRaid", (void(Lua_Client::*)(uint16))&Lua_Client::MoveZoneInstanceRaid) .def("ChangeLastName", (void(Lua_Client::*)(const char *in))&Lua_Client::ChangeLastName) .def("GetFactionLevel", (int(Lua_Client::*)(uint32,uint32,uint32,uint32,uint32,uint32,Lua_NPC))&Lua_Client::GetFactionLevel) .def("SetFactionLevel", (void(Lua_Client::*)(uint32,uint32,int,int,int))&Lua_Client::SetFactionLevel) @@ -1685,6 +2214,15 @@ luabind::scope lua_register_client() { .def("UnmemSpellAll", (void(Lua_Client::*)(bool))&Lua_Client::UnmemSpellAll) .def("FindMemmedSpellBySlot", (uint16(Lua_Client::*)(int))&Lua_Client::FindMemmedSpellBySlot) .def("MemmedCount", (int(Lua_Client::*)(void))&Lua_Client::MemmedCount) + .def("GetLearnableDisciplines", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetLearnableDisciplines) + .def("GetLearnableDisciplines", (luabind::object(Lua_Client::*)(lua_State* L,uint8))&Lua_Client::GetLearnableDisciplines) + .def("GetLearnableDisciplines", (luabind::object(Lua_Client::*)(lua_State* L,uint8,uint8))&Lua_Client::GetLearnableDisciplines) + .def("GetLearnedDisciplines", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetLearnedDisciplines) + .def("GetMemmedSpells", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetMemmedSpells) + .def("GetScribedSpells", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetScribedSpells) + .def("GetScribeableSpells", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetScribeableSpells) + .def("GetScribeableSpells", (luabind::object(Lua_Client::*)(lua_State* L,uint8))&Lua_Client::GetScribeableSpells) + .def("GetScribeableSpells", (luabind::object(Lua_Client::*)(lua_State* L,uint8,uint8))&Lua_Client::GetScribeableSpells) .def("ScribeSpell", (void(Lua_Client::*)(int,int))&Lua_Client::ScribeSpell) .def("ScribeSpell", (void(Lua_Client::*)(int,int,bool))&Lua_Client::ScribeSpell) .def("UnscribeSpell", (void(Lua_Client::*)(int))&Lua_Client::UnscribeSpell) @@ -1741,7 +2279,10 @@ luabind::scope lua_register_client() { .def("ForageItem", (void(Lua_Client::*)(bool))&Lua_Client::ForageItem) .def("CalcPriceMod", (float(Lua_Client::*)(Lua_Mob,bool))&Lua_Client::CalcPriceMod) .def("ResetTrade", (void(Lua_Client::*)(void))&Lua_Client::ResetTrade) + .def("GetDisciplineTimer", (uint32(Lua_Client::*)(uint32))&Lua_Client::GetDisciplineTimer) + .def("ResetDisciplineTimer", (void(Lua_Client::*)(uint32))&Lua_Client::ResetDisciplineTimer) .def("UseDiscipline", (bool(Lua_Client::*)(int,int))&Lua_Client::UseDiscipline) + .def("HasDisciplineLearned", (bool(Lua_Client::*)(uint16))&Lua_Client::HasDisciplineLearned) .def("GetCharacterFactionLevel", (int(Lua_Client::*)(int))&Lua_Client::GetCharacterFactionLevel) .def("SetZoneFlag", (void(Lua_Client::*)(int))&Lua_Client::SetZoneFlag) .def("ClearZoneFlag", (void(Lua_Client::*)(int))&Lua_Client::ClearZoneFlag) @@ -1770,6 +2311,8 @@ luabind::scope lua_register_client() { .def("KeyRingCheck", (bool(Lua_Client::*)(uint32))&Lua_Client::KeyRingCheck) .def("AddPVPPoints", (void(Lua_Client::*)(uint32))&Lua_Client::AddPVPPoints) .def("AddCrystals", (void(Lua_Client::*)(uint32,uint32))&Lua_Client::AddCrystals) + .def("SetEbonCrystals", (void(Lua_Client::*)(uint32))&Lua_Client::SetEbonCrystals) + .def("SetRadiantCrystals", (void(Lua_Client::*)(uint32))&Lua_Client::SetRadiantCrystals) .def("GetPVPPoints", (uint32(Lua_Client::*)(void))&Lua_Client::GetPVPPoints) .def("GetRadiantCrystals", (uint32(Lua_Client::*)(void))&Lua_Client::GetRadiantCrystals) .def("GetEbonCrystals", (uint32(Lua_Client::*)(void))&Lua_Client::GetEbonCrystals) @@ -1795,6 +2338,7 @@ luabind::scope lua_register_client() { .def("ClearCompassMark",(void(Lua_Client::*)(void))&Lua_Client::ClearCompassMark) .def("GetNextAvailableSpellBookSlot", (int(Lua_Client::*)(void))&Lua_Client::GetNextAvailableSpellBookSlot) .def("GetNextAvailableSpellBookSlot", (int(Lua_Client::*)(int))&Lua_Client::GetNextAvailableSpellBookSlot) + .def("GetSpellIDByBookSlot", (uint32(Lua_Client::*)(int))& Lua_Client::GetSpellIDByBookSlot) .def("FindSpellBookSlotBySpellID", (int(Lua_Client::*)(int))&Lua_Client::FindSpellBookSlotBySpellID) .def("UpdateTaskActivity", (void(Lua_Client::*)(int,int,int))&Lua_Client::UpdateTaskActivity) .def("AssignTask", (void(Lua_Client::*)(int,int))&Lua_Client::AssignTask) @@ -1814,6 +2358,7 @@ luabind::scope lua_register_client() { .def("GetAllMoney", (uint64(Lua_Client::*)(void))&Lua_Client::GetAllMoney) .def("GetMoney", (uint32(Lua_Client::*)(uint8, uint8))&Lua_Client::GetMoney) .def("OpenLFGuildWindow", (void(Lua_Client::*)(void))&Lua_Client::OpenLFGuildWindow) + .def("NotifyNewTitlesAvailable", (void(Lua_Client::*)(void))&Lua_Client::NotifyNewTitlesAvailable) .def("Signal", (void(Lua_Client::*)(uint32))&Lua_Client::Signal) .def("AddAlternateCurrencyValue", (void(Lua_Client::*)(uint32,int))&Lua_Client::AddAlternateCurrencyValue) .def("SetAlternateCurrencyValue", (void(Lua_Client::*)(uint32,int))&Lua_Client::SetAlternateCurrencyValue) @@ -1862,7 +2407,35 @@ luabind::scope lua_register_client() { .def("EnableAreaRegens", &Lua_Client::EnableAreaRegens) .def("DisableAreaRegens", &Lua_Client::DisableAreaRegens) .def("SetClientMaxLevel", (void(Lua_Client::*)(int))&Lua_Client::SetClientMaxLevel) - .def("GetClientMaxLevel", (int(Lua_Client::*)(void))&Lua_Client::GetClientMaxLevel); + .def("GetClientMaxLevel", (int(Lua_Client::*)(void))&Lua_Client::GetClientMaxLevel) + .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(luabind::object))&Lua_Client::CreateExpedition) + .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(std::string, uint32, uint32, std::string, uint32, uint32))&Lua_Client::CreateExpedition) + .def("CreateExpedition", (Lua_Expedition(Lua_Client::*)(std::string, uint32, uint32, std::string, uint32, uint32, bool))&Lua_Client::CreateExpedition) + .def("GetExpedition", (Lua_Expedition(Lua_Client::*)(void))&Lua_Client::GetExpedition) + .def("GetExpeditionLockouts", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetExpeditionLockouts) + .def("GetExpeditionLockouts", (luabind::object(Lua_Client::*)(lua_State* L, std::string))&Lua_Client::GetExpeditionLockouts) + .def("GetLockoutExpeditionUUID", (std::string(Lua_Client::*)(std::string, std::string))&Lua_Client::GetLockoutExpeditionUUID) + .def("AddExpeditionLockout", (void(Lua_Client::*)(std::string, std::string, uint32))&Lua_Client::AddExpeditionLockout) + .def("AddExpeditionLockout", (void(Lua_Client::*)(std::string, std::string, uint32, std::string))&Lua_Client::AddExpeditionLockout) + .def("AddExpeditionLockoutDuration", (void(Lua_Client::*)(std::string, std::string, int))&Lua_Client::AddExpeditionLockoutDuration) + .def("AddExpeditionLockoutDuration", (void(Lua_Client::*)(std::string, std::string, int, std::string))&Lua_Client::AddExpeditionLockoutDuration) + .def("RemoveAllExpeditionLockouts", (void(Lua_Client::*)(void))&Lua_Client::RemoveAllExpeditionLockouts) + .def("RemoveAllExpeditionLockouts", (void(Lua_Client::*)(std::string))&Lua_Client::RemoveAllExpeditionLockouts) + .def("RemoveExpeditionLockout", (void(Lua_Client::*)(std::string, std::string))&Lua_Client::RemoveExpeditionLockout) + .def("HasExpeditionLockout", (bool(Lua_Client::*)(std::string, std::string))&Lua_Client::HasExpeditionLockout) + .def("MovePCDynamicZone", (void(Lua_Client::*)(uint32))&Lua_Client::MovePCDynamicZone) + .def("MovePCDynamicZone", (void(Lua_Client::*)(uint32, int))&Lua_Client::MovePCDynamicZone) + .def("MovePCDynamicZone", (void(Lua_Client::*)(uint32, int, bool))&Lua_Client::MovePCDynamicZone) + .def("MovePCDynamicZone", (void(Lua_Client::*)(std::string))&Lua_Client::MovePCDynamicZone) + .def("MovePCDynamicZone", (void(Lua_Client::*)(std::string, int))&Lua_Client::MovePCDynamicZone) + .def("MovePCDynamicZone", (void(Lua_Client::*)(std::string, int, bool))&Lua_Client::MovePCDynamicZone) + .def("Fling", (void(Lua_Client::*)(float,float,float,float))&Lua_Client::Fling) + .def("Fling", (void(Lua_Client::*)(float,float,float,float,bool))&Lua_Client::Fling) + .def("Fling", (void(Lua_Client::*)(float,float,float,float,bool,bool))&Lua_Client::Fling) + .def("GetAAEXPModifier", (double(Lua_Client::*)(uint32))&Lua_Client::GetAAEXPModifier) + .def("GetEXPModifier", (double(Lua_Client::*)(uint32))&Lua_Client::GetEXPModifier) + .def("SetAAEXPModifier", (void(Lua_Client::*)(uint32,double))&Lua_Client::SetAAEXPModifier) + .def("SetEXPModifier", (void(Lua_Client::*)(uint32,double))&Lua_Client::SetEXPModifier); } luabind::scope lua_register_inventory_where() { diff --git a/zone/lua_client.h b/zone/lua_client.h index aef0378cb..bfd0f6b84 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -5,6 +5,7 @@ #include "lua_mob.h" class Client; +class Lua_Expedition; class Lua_Group; class Lua_Raid; class Lua_Inventory; @@ -39,8 +40,14 @@ public: void Disconnect(); bool IsLD(); void WorldKick(); - bool GetAnon(); + void SendToGuildHall(); + int GetAnon(); + void SetAnon(uint8 anon_flag); + int GetAFK(); + void SetAFK(uint8 afk_flag); void Duck(); + void DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue); + void DyeArmorBySlot(uint8 slot, uint8 red, uint8 green, uint8 blue, uint8 use_tint); void Stand(); void SetGM(bool v); void SetPVP(bool v); @@ -48,10 +55,11 @@ public: bool GetGM(); void SetBaseClass(int v); void SetBaseRace(int v); - void SetBaseGender(int v); + void SetBaseGender(int v); + int GetClassBitmask(); + int GetRaceBitmask(); int GetBaseFace(); int GetLanguageSkill(int skill_id); - const char *GetLastName(); int GetLDoNPointsTheme(int theme); int GetBaseSTR(); int GetBaseSTA(); @@ -62,6 +70,10 @@ public: int GetBaseWIS(); int GetWeight(); uint32 GetEXP(); + double GetEXPModifier(uint32 zone_id); + double GetAAEXPModifier(uint32 zone_id); + void SetAAEXPModifier(uint32 zone_id, double aa_modifier); + void SetEXPModifier(uint32 zone_id, double exp_modifier); uint32 GetAAExp(); uint32 GetAAPercent(); uint32 GetTotalSecondsPlayed(); @@ -78,6 +90,7 @@ public: void SetBindPoint(int to_zone, int to_instance, float new_x); void SetBindPoint(int to_zone, int to_instance, float new_x, float new_y); void SetBindPoint(int to_zone, int to_instance, float new_x, float new_y, float new_z); + void SetBindPoint(int to_zone, int to_instance, float new_x, float new_y, float new_z, float new_heading); float GetBindX(); float GetBindX(int index); float GetBindY(); @@ -88,8 +101,17 @@ public: float GetBindHeading(int index); uint32 GetBindZoneID(); uint32 GetBindZoneID(int index); + float GetTargetRingX(); + float GetTargetRingY(); + float GetTargetRingZ(); void MovePC(int zone, float x, float y, float z, float heading); void MovePCInstance(int zone, int instance, float x, float y, float z, float heading); + void MoveZone(const char *zone_short_name); + void MoveZoneGroup(const char *zone_short_name); + void MoveZoneRaid(const char *zone_short_name); + void MoveZoneInstance(uint16 instance_id); + void MoveZoneInstanceGroup(uint16 instance_id); + void MoveZoneInstanceRaid(uint16 instance_id); void ChangeLastName(const char *in); int GetFactionLevel(uint32 char_id, uint32 npc_id, uint32 race, uint32 class_, uint32 deity, uint32 faction, Lua_NPC npc); void SetFactionLevel(uint32 char_id, uint32 npc_id, int char_class, int char_race, int char_deity); @@ -137,6 +159,15 @@ public: void UnmemSpellAll(bool update_client); uint16 FindMemmedSpellBySlot(int slot); int MemmedCount(); + luabind::object GetLearnableDisciplines(lua_State* L); + luabind::object GetLearnableDisciplines(lua_State* L, uint8 min_level); + luabind::object GetLearnableDisciplines(lua_State* L, uint8 min_level, uint8 max_level); + luabind::object GetLearnedDisciplines(lua_State* L); + luabind::object GetMemmedSpells(lua_State* L); + luabind::object GetScribedSpells(lua_State* L); + luabind::object GetScribeableSpells(lua_State* L); + luabind::object GetScribeableSpells(lua_State* L, uint8 min_level); + luabind::object GetScribeableSpells(lua_State* L, uint8 min_level, uint8 max_level); void ScribeSpell(int spell_id, int slot); void ScribeSpell(int spell_id, int slot, bool update_client); void UnscribeSpell(int slot); @@ -195,7 +226,10 @@ public: void ForageItem(bool guarantee); float CalcPriceMod(Lua_Mob other, bool reverse); void ResetTrade(); + uint32 GetDisciplineTimer(uint32 timer_id); + void ResetDisciplineTimer(uint32 timer_id); bool UseDiscipline(int spell_id, int target_id); + bool HasDisciplineLearned(uint16 spell_id); int GetCharacterFactionLevel(int faction_id); void SetZoneFlag(int zone_id); void ClearZoneFlag(int zone_id); @@ -220,10 +254,13 @@ public: void SetStartZone(int zone_id, float x); void SetStartZone(int zone_id, float x, float y); void SetStartZone(int zone_id, float x, float y, float z); + void SetStartZone(int zone_id, float x, float y, float z, float heading); void KeyRingAdd(uint32 item); bool KeyRingCheck(uint32 item); void AddPVPPoints(uint32 points); void AddCrystals(uint32 radiant, uint32 ebon); + void SetEbonCrystals(uint32 value); + void SetRadiantCrystals(uint32 value); uint32 GetPVPPoints(); uint32 GetRadiantCrystals(); uint32 GetEbonCrystals(); @@ -249,6 +286,7 @@ public: void ClearCompassMark(); int GetNextAvailableSpellBookSlot(); int GetNextAvailableSpellBookSlot(int start); + uint32 GetSpellIDByBookSlot(int book_slot); int FindSpellBookSlotBySpellID(int spell_id); void UpdateTaskActivity(int task, int activity, int count); void AssignTask(int task, int npc_id); @@ -268,6 +306,7 @@ public: uint64 GetAllMoney(); uint32 GetMoney(uint8 type, uint8 subtype); void OpenLFGuildWindow(); + void NotifyNewTitlesAvailable(); void Signal(uint32 id); void AddAlternateCurrencyValue(uint32 currency, int amount); void SetAlternateCurrencyValue(uint32 currency, int amount); @@ -317,12 +356,36 @@ public: void EnableAreaRegens(int value); void DisableAreaRegens(); - void SetPrimaryWeaponOrnamentation(uint32 model_id); void SetSecondaryWeaponOrnamentation(uint32 model_id); void SetClientMaxLevel(int value); int GetClientMaxLevel(); + + Lua_Expedition CreateExpedition(luabind::object expedition_info); + Lua_Expedition CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players); + Lua_Expedition CreateExpedition(std::string zone_name, uint32 version, uint32 duration, std::string expedition_name, uint32 min_players, uint32 max_players, bool disable_messages); + Lua_Expedition GetExpedition(); + luabind::object GetExpeditionLockouts(lua_State* L); + luabind::object GetExpeditionLockouts(lua_State* L, std::string expedition_name); + std::string GetLockoutExpeditionUUID(std::string expedition_name, std::string event_name); + void AddExpeditionLockout(std::string expedition_name, std::string event_name, uint32 seconds); + void AddExpeditionLockout(std::string expedition_name, std::string event_name, uint32 seconds, std::string uuid); + void AddExpeditionLockoutDuration(std::string expedition_name, std::string event_name, int seconds); + void AddExpeditionLockoutDuration(std::string expedition_name, std::string event_name, int seconds, std::string uuid); + void RemoveAllExpeditionLockouts(); + void RemoveAllExpeditionLockouts(std::string expedition_name); + void RemoveExpeditionLockout(std::string expedition_name, std::string event_name); + bool HasExpeditionLockout(std::string expedition_name, std::string event_name); + void MovePCDynamicZone(uint32 zone_id); + void MovePCDynamicZone(uint32 zone_id, int zone_version); + void MovePCDynamicZone(uint32 zone_id, int zone_version, bool msg_if_invalid); + void MovePCDynamicZone(std::string zone_name); + void MovePCDynamicZone(std::string zone_name, int zone_version); + void MovePCDynamicZone(std::string zone_name, int zone_version, bool msg_if_invalid); + void Fling(float value, float target_x, float target_y, float target_z); + void Fling(float value, float target_x, float target_y, float target_z, bool ignore_los); + void Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clipping); }; #endif diff --git a/zone/lua_entity_list.cpp b/zone/lua_entity_list.cpp index abfc020d6..e4f2b207d 100644 --- a/zone/lua_entity_list.cpp +++ b/zone/lua_entity_list.cpp @@ -80,6 +80,11 @@ Lua_NPC Lua_EntityList::GetNPCByNPCTypeID(int npc_type) { return Lua_NPC(self->GetNPCByNPCTypeID(npc_type)); } +Lua_NPC Lua_EntityList::GetNPCBySpawnID(uint32 spawn_id) { + Lua_Safe_Call_Class(Lua_NPC); + return Lua_NPC(self->GetNPCBySpawnID(spawn_id)); +} + Lua_Client Lua_EntityList::GetClientByName(const char *name) { Lua_Safe_Call_Class(Lua_Client); return Lua_Client(self->GetClientByName(name)); @@ -449,6 +454,7 @@ luabind::scope lua_register_entity_list() { .def("IsMobSpawnedByNpcTypeID", (bool(Lua_EntityList::*)(int))&Lua_EntityList::IsMobSpawnedByNpcTypeID) .def("GetNPCByID", (Lua_NPC(Lua_EntityList::*)(int))&Lua_EntityList::GetNPCByID) .def("GetNPCByNPCTypeID", (Lua_NPC(Lua_EntityList::*)(int))&Lua_EntityList::GetNPCByNPCTypeID) + .def("GetNPCBySpawnID", (Lua_NPC(Lua_EntityList::*)(int))&Lua_EntityList::GetNPCBySpawnID) .def("GetClientByName", (Lua_Client(Lua_EntityList::*)(const char*))&Lua_EntityList::GetClientByName) .def("GetClientByAccID", (Lua_Client(Lua_EntityList::*)(uint32))&Lua_EntityList::GetClientByAccID) .def("GetClientByID", (Lua_Client(Lua_EntityList::*)(int))&Lua_EntityList::GetClientByID) diff --git a/zone/lua_entity_list.h b/zone/lua_entity_list.h index 6b0074674..04030e58e 100644 --- a/zone/lua_entity_list.h +++ b/zone/lua_entity_list.h @@ -54,6 +54,7 @@ public: bool IsMobSpawnedByNpcTypeID(int npc_type); Lua_NPC GetNPCByID(int id); Lua_NPC GetNPCByNPCTypeID(int npc_type); + Lua_NPC GetNPCBySpawnID(uint32 spawn_id); Lua_Client GetClientByName(const char *name); Lua_Client GetClientByAccID(uint32 acct_id); Lua_Client GetClientByID(int id); diff --git a/zone/lua_expedition.cpp b/zone/lua_expedition.cpp new file mode 100644 index 000000000..f19e417ff --- /dev/null +++ b/zone/lua_expedition.cpp @@ -0,0 +1,307 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifdef LUA_EQEMU + +#include "lua_expedition.h" +#include "expedition.h" +#include "zone_store.h" +#include "lua.hpp" +#include +#include + +void Lua_Expedition::AddLockout(std::string event_name, uint32_t seconds) { + Lua_Safe_Call_Void(); + self->AddLockout(event_name, seconds); +} + +void Lua_Expedition::AddLockoutDuration(std::string event_name, int seconds) { + Lua_Safe_Call_Void(); + self->AddLockoutDuration(event_name, seconds); +} + +void Lua_Expedition::AddLockoutDuration(std::string event_name, int seconds, bool members_only) { + Lua_Safe_Call_Void(); + self->AddLockoutDuration(event_name, seconds, members_only); +} + +void Lua_Expedition::AddReplayLockout(uint32_t seconds) { + Lua_Safe_Call_Void(); + self->AddReplayLockout(seconds); +} + +void Lua_Expedition::AddReplayLockoutDuration(int seconds) { + Lua_Safe_Call_Void(); + self->AddReplayLockoutDuration(seconds); +} + +void Lua_Expedition::AddReplayLockoutDuration(int seconds, bool members_only) { + Lua_Safe_Call_Void(); + self->AddReplayLockoutDuration(seconds, members_only); +} + +uint32_t Lua_Expedition::GetDynamicZoneID() { + Lua_Safe_Call_Int(); + return self->GetDynamicZone().GetID(); +} + +uint32_t Lua_Expedition::GetID() { + Lua_Safe_Call_Int(); + return self->GetID(); +} + +int Lua_Expedition::GetInstanceID() { + Lua_Safe_Call_Int(); + return self->GetDynamicZone().GetInstanceID(); +} + +std::string Lua_Expedition::GetLeaderName() { + Lua_Safe_Call_String(); + return self->GetLeaderName(); +} + +luabind::object Lua_Expedition::GetLockouts(lua_State* L) { + luabind::object lua_table = luabind::newtable(L); + + if (d_) + { + auto self = reinterpret_cast(d_); + auto lockouts = self->GetLockouts(); + for (const auto& lockout : lockouts) + { + lua_table[lockout.first] = lockout.second.GetSecondsRemaining(); + } + } + return lua_table; +} + +std::string Lua_Expedition::GetLootEventByNPCTypeID(uint32_t npc_type_id) { + Lua_Safe_Call_String(); + return self->GetLootEventByNPCTypeID(npc_type_id); +} + +std::string Lua_Expedition::GetLootEventBySpawnID(uint32_t spawn_id) { + Lua_Safe_Call_String(); + return self->GetLootEventBySpawnID(spawn_id); +} + +uint32_t Lua_Expedition::GetMemberCount() { + Lua_Safe_Call_Int(); + return self->GetMemberCount(); +} + +luabind::object Lua_Expedition::GetMembers(lua_State* L) { + luabind::object lua_table = luabind::newtable(L); + + if (d_) + { + auto self = reinterpret_cast(d_); + for (const auto& member : self->GetMembers()) + { + lua_table[member.name] = member.id; + } + } + return lua_table; +} + +std::string Lua_Expedition::GetName() { + Lua_Safe_Call_String(); + return self->GetName(); +} + +int Lua_Expedition::GetSecondsRemaining() { + Lua_Safe_Call_Int(); + return self->GetDynamicZone().GetSecondsRemaining(); +} + +std::string Lua_Expedition::GetUUID() { + Lua_Safe_Call_String(); + return self->GetUUID(); +} + +int Lua_Expedition::GetZoneID() { + Lua_Safe_Call_Int(); + return self->GetDynamicZone().GetZoneID(); +} + +std::string Lua_Expedition::GetZoneName() { + Lua_Safe_Call_String(); + return ZoneName(self->GetDynamicZone().GetZoneID()); +} + +int Lua_Expedition::GetZoneVersion() { + Lua_Safe_Call_Int(); + return self->GetDynamicZone().GetZoneVersion(); +} + +bool Lua_Expedition::HasLockout(std::string event_name) { + Lua_Safe_Call_Bool(); + return self->HasLockout(event_name); +} + +bool Lua_Expedition::HasReplayLockout() { + Lua_Safe_Call_Bool(); + return self->HasReplayLockout(); +} + +bool Lua_Expedition::IsLocked() { + Lua_Safe_Call_Bool(); + return self->IsLocked(); +} + +void Lua_Expedition::RemoveCompass() { + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetCompass(0, 0, 0, 0, true); +} + +void Lua_Expedition::RemoveLockout(std::string event_name) { + Lua_Safe_Call_Void(); + self->RemoveLockout(event_name); +} + +void Lua_Expedition::SetCompass(uint32_t zone_id, float x, float y, float z) { + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetCompass(zone_id, x, y, z, true); +} + +void Lua_Expedition::SetCompass(std::string zone_name, float x, float y, float z) { + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetCompass(ZoneID(zone_name), x, y, z, true); +} + +void Lua_Expedition::SetLocked(bool lock_expedition) { + Lua_Safe_Call_Void(); + self->SetLocked(lock_expedition, ExpeditionLockMessage::None, true); +} + +void Lua_Expedition::SetLocked(bool lock_expedition, int lock_msg) { + Lua_Safe_Call_Void(); + self->SetLocked(lock_expedition, static_cast(lock_msg), true); +} + +void Lua_Expedition::SetLocked(bool lock_expedition, int lock_msg, uint32_t msg_color) { + Lua_Safe_Call_Void(); + self->SetLocked(lock_expedition, static_cast(lock_msg), true, msg_color); +} + +void Lua_Expedition::SetLootEventByNPCTypeID(uint32_t npc_type_id, std::string event_name) { + Lua_Safe_Call_Void(); + self->SetLootEventByNPCTypeID(npc_type_id, event_name); +} + +void Lua_Expedition::SetLootEventBySpawnID(uint32_t spawn_id, std::string event_name) { + Lua_Safe_Call_Void(); + self->SetLootEventBySpawnID(spawn_id, event_name); +} + +void Lua_Expedition::SetReplayLockoutOnMemberJoin(bool enable) { + Lua_Safe_Call_Void(); + self->SetReplayLockoutOnMemberJoin(enable, true); +} + +void Lua_Expedition::SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading) { + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetSafeReturn(zone_id, x, y, z, heading, true); +} + +void Lua_Expedition::SetSafeReturn(std::string zone_name, float x, float y, float z, float heading) { + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetSafeReturn(ZoneID(zone_name), x, y, z, heading, true); +} + +void Lua_Expedition::SetSecondsRemaining(uint32_t seconds_remaining) +{ + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetSecondsRemaining(seconds_remaining); +} + +void Lua_Expedition::SetZoneInLocation(float x, float y, float z, float heading) { + Lua_Safe_Call_Void(); + self->GetDynamicZone().SetZoneInLocation(x, y, z, heading, true); +} + +void Lua_Expedition::UpdateLockoutDuration(std::string event_name, uint32_t duration) { + Lua_Safe_Call_Void(); + self->UpdateLockoutDuration(event_name, duration); +} + +void Lua_Expedition::UpdateLockoutDuration(std::string event_name, uint32_t duration, bool members_only) { + Lua_Safe_Call_Void(); + self->UpdateLockoutDuration(event_name, duration, members_only); +} + +luabind::scope lua_register_expedition() { + return luabind::class_("Expedition") + .def(luabind::constructor<>()) + .property("null", &Lua_Expedition::Null) + .property("valid", &Lua_Expedition::Valid) + .def("AddLockout", (void(Lua_Expedition::*)(std::string, uint32_t))&Lua_Expedition::AddLockout) + .def("AddLockoutDuration", (void(Lua_Expedition::*)(std::string, int))&Lua_Expedition::AddLockoutDuration) + .def("AddLockoutDuration", (void(Lua_Expedition::*)(std::string, int, bool))&Lua_Expedition::AddLockoutDuration) + .def("AddReplayLockout", (void(Lua_Expedition::*)(uint32_t))&Lua_Expedition::AddReplayLockout) + .def("AddReplayLockoutDuration", (void(Lua_Expedition::*)(int))&Lua_Expedition::AddReplayLockoutDuration) + .def("AddReplayLockoutDuration", (void(Lua_Expedition::*)(int, bool))&Lua_Expedition::AddReplayLockoutDuration) + .def("GetDynamicZoneID", &Lua_Expedition::GetDynamicZoneID) + .def("GetID", (uint32_t(Lua_Expedition::*)(void))&Lua_Expedition::GetID) + .def("GetInstanceID", (int(Lua_Expedition::*)(void))&Lua_Expedition::GetInstanceID) + .def("GetLeaderName", (std::string(Lua_Expedition::*)(void))&Lua_Expedition::GetLeaderName) + .def("GetLockouts", &Lua_Expedition::GetLockouts) + .def("GetLootEventByNPCTypeID", (std::string(Lua_Expedition::*)(uint32_t))&Lua_Expedition::GetLootEventByNPCTypeID) + .def("GetLootEventBySpawnID", (std::string(Lua_Expedition::*)(uint32_t))&Lua_Expedition::GetLootEventBySpawnID) + .def("GetMemberCount", (uint32_t(Lua_Expedition::*)(void))&Lua_Expedition::GetMemberCount) + .def("GetMembers", &Lua_Expedition::GetMembers) + .def("GetName", (std::string(Lua_Expedition::*)(void))&Lua_Expedition::GetName) + .def("GetSecondsRemaining", (int(Lua_Expedition::*)(void))&Lua_Expedition::GetSecondsRemaining) + .def("GetUUID", (std::string(Lua_Expedition::*)(void))&Lua_Expedition::GetUUID) + .def("GetZoneID", (int(Lua_Expedition::*)(void))&Lua_Expedition::GetZoneID) + .def("GetZoneName", &Lua_Expedition::GetZoneName) + .def("GetZoneVersion", &Lua_Expedition::GetZoneVersion) + .def("HasLockout", (bool(Lua_Expedition::*)(std::string))&Lua_Expedition::HasLockout) + .def("HasReplayLockout", (bool(Lua_Expedition::*)(void))&Lua_Expedition::HasReplayLockout) + .def("IsLocked", &Lua_Expedition::IsLocked) + .def("RemoveCompass", (void(Lua_Expedition::*)(void))&Lua_Expedition::RemoveCompass) + .def("RemoveLockout", (void(Lua_Expedition::*)(std::string))&Lua_Expedition::RemoveLockout) + .def("SetCompass", (void(Lua_Expedition::*)(uint32_t, float, float, float))&Lua_Expedition::SetCompass) + .def("SetCompass", (void(Lua_Expedition::*)(std::string, float, float, float))&Lua_Expedition::SetCompass) + .def("SetLocked", (void(Lua_Expedition::*)(bool))&Lua_Expedition::SetLocked) + .def("SetLocked", (void(Lua_Expedition::*)(bool, int))&Lua_Expedition::SetLocked) + .def("SetLocked", (void(Lua_Expedition::*)(bool, int, uint32_t))&Lua_Expedition::SetLocked) + .def("SetLootEventByNPCTypeID", (void(Lua_Expedition::*)(uint32_t, std::string))&Lua_Expedition::SetLootEventByNPCTypeID) + .def("SetLootEventBySpawnID", (void(Lua_Expedition::*)(uint32_t, std::string))&Lua_Expedition::SetLootEventBySpawnID) + .def("SetReplayLockoutOnMemberJoin", (void(Lua_Expedition::*)(bool))&Lua_Expedition::SetReplayLockoutOnMemberJoin) + .def("SetSafeReturn", (void(Lua_Expedition::*)(uint32_t, float, float, float, float))&Lua_Expedition::SetSafeReturn) + .def("SetSafeReturn", (void(Lua_Expedition::*)(std::string, float, float, float, float))&Lua_Expedition::SetSafeReturn) + .def("SetSecondsRemaining", &Lua_Expedition::SetSecondsRemaining) + .def("SetZoneInLocation", (void(Lua_Expedition::*)(float, float, float, float))&Lua_Expedition::SetZoneInLocation) + .def("UpdateLockoutDuration", (void(Lua_Expedition::*)(std::string, uint32_t))&Lua_Expedition::UpdateLockoutDuration) + .def("UpdateLockoutDuration", (void(Lua_Expedition::*)(std::string, uint32_t, bool))&Lua_Expedition::UpdateLockoutDuration); +} + +luabind::scope lua_register_expedition_lock_messages() { + return luabind::class_("ExpeditionLockMessage") + .enum_("constants") + [ + luabind::value("None", static_cast(ExpeditionLockMessage::None)), + luabind::value("Close", static_cast(ExpeditionLockMessage::Close)), + luabind::value("Begin", static_cast(ExpeditionLockMessage::Begin)) + ]; +} + +#endif // LUA_EQEMU diff --git a/zone/lua_expedition.h b/zone/lua_expedition.h new file mode 100644 index 000000000..d154f9323 --- /dev/null +++ b/zone/lua_expedition.h @@ -0,0 +1,99 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_LUA_EXPEDITION_H +#define EQEMU_LUA_EXPEDITION_H +#ifdef LUA_EQEMU + +#include "lua_ptr.h" +#include "../common/types.h" +#include + +class Expedition; +class Lua_Client; +struct lua_State; + +namespace luabind { + struct scope; + namespace adl { + class object; + } + using adl::object; +} + +luabind::scope lua_register_expedition(); +luabind::scope lua_register_expedition_lock_messages(); + +class Lua_Expedition : public Lua_Ptr +{ + typedef Expedition NativeType; +public: + Lua_Expedition() : Lua_Ptr(nullptr) { } + Lua_Expedition(Expedition *d) : Lua_Ptr(d) { } + virtual ~Lua_Expedition() { } + + operator Expedition*() { + return reinterpret_cast(GetLuaPtrData()); + } + + void AddLockout(std::string event_name, uint32_t seconds); + void AddLockoutDuration(std::string event_name, int seconds); + void AddLockoutDuration(std::string event_name, int seconds, bool members_only); + void AddReplayLockout(uint32_t seconds); + void AddReplayLockoutDuration(int seconds); + void AddReplayLockoutDuration(int seconds, bool members_only); + uint32_t GetDynamicZoneID(); + uint32_t GetID(); + int GetInstanceID(); + std::string GetLeaderName(); + luabind::object GetLockouts(lua_State* L); + std::string GetLootEventByNPCTypeID(uint32_t npc_type_id); + std::string GetLootEventBySpawnID(uint32_t spawn_id); + uint32_t GetMemberCount(); + luabind::object GetMembers(lua_State* L); + std::string GetName(); + int GetSecondsRemaining(); + std::string GetUUID(); + int GetZoneID(); + std::string GetZoneName(); + int GetZoneVersion(); + bool HasLockout(std::string event_name); + bool HasReplayLockout(); + bool IsLocked(); + void RemoveCompass(); + void RemoveLockout(std::string event_name); + void SetCompass(uint32_t zone_id, float x, float y, float z); + void SetCompass(std::string zone_name, float x, float y, float z); + void SetLocked(bool lock_expedition); + void SetLocked(bool lock_expedition, int lock_msg); + void SetLocked(bool lock_expedition, int lock_msg, uint32_t color); + void SetLootEventByNPCTypeID(uint32_t npc_type_id, std::string event_name); + void SetLootEventBySpawnID(uint32_t spawn_id, std::string event_name); + void SetReplayLockoutOnMemberJoin(bool enable); + void SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading); + void SetSafeReturn(std::string zone_name, float x, float y, float z, float heading); + void SetSecondsRemaining(uint32_t seconds_remaining); + void SetZoneInLocation(float x, float y, float z, float heading); + void UpdateLockoutDuration(std::string event_name, uint32_t duration); + void UpdateLockoutDuration(std::string event_name, uint32_t duration, bool members_only); +}; + +#endif // LUA_EQEMU +#endif // EQEMU_LUA_EXPEDITION_H diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 69e262199..e01e32549 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -7,6 +7,7 @@ #include #include +#include "../common/content/world_content_service.h" #include "../common/timer.h" #include "../common/eqemu_logsys.h" #include "../common/classes.h" @@ -17,12 +18,14 @@ #include "lua_client.h" #include "lua_npc.h" #include "lua_entity_list.h" +#include "lua_expedition.h" #include "quest_parser_collection.h" #include "questmgr.h" #include "qglobals.h" #include "encounter.h" #include "lua_encounter.h" #include "data_bucket.h" +#include "expedition.h" struct Events { }; struct Factions { }; @@ -71,7 +74,7 @@ void load_encounter_with_data(std::string name, std::string info_str) { entity_list.AddEncounter(enc); lua_encounters[name] = enc; lua_encounters_loaded[name] = true; - std::vector info_ptrs; + std::vector info_ptrs; info_ptrs.push_back(&info_str); parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, "", 0, &info_ptrs); } @@ -133,7 +136,7 @@ void unload_encounter_with_data(std::string name, std::string info_str) { lua_encounters[name]->Depop(); lua_encounters.erase(name); lua_encounters_loaded.erase(name); - std::vector info_ptrs; + std::vector info_ptrs; info_ptrs.push_back(&info_str); parse->EventEncounter(EVENT_ENCOUNTER_UNLOAD, name, "", 0, &info_ptrs); } @@ -389,10 +392,26 @@ void lua_repop_zone() { quest_manager.repopzone(); } +void lua_process_mobs_while_zone_empty(bool on) { + quest_manager.processmobswhilezoneempty(on); +} + bool lua_is_disc_tome(int item_id) { return quest_manager.isdisctome(item_id); } +std::string lua_get_race_name(uint32 race_id) { + return quest_manager.getracename(race_id); +} + +std::string lua_get_spell_name(uint32 spell_id) { + return quest_manager.getspellname(spell_id); +} + +std::string lua_get_skill_name(int skill_id) { + return quest_manager.getskillname(skill_id); +} + void lua_safe_move() { quest_manager.safemove(); } @@ -729,6 +748,10 @@ bool lua_is_task_appropriate(int task) { return quest_manager.istaskappropriate(task); } +std::string lua_get_task_name(uint32 task_id) { + return quest_manager.gettaskname(task_id); +} + void lua_popup(const char *title, const char *text, uint32 id, uint32 buttons, uint32 duration) { quest_manager.popup(title, text, id, buttons, duration); } @@ -745,6 +768,14 @@ void lua_world_emote(int type, const char *str) { quest_manager.we(type, str); } +void lua_message(int color, const char *message) { + quest_manager.message(color, message); +} + +void lua_whisper(const char *message) { + quest_manager.whisper(message); +} + int lua_get_level(int type) { return quest_manager.getlevel(type); } @@ -781,6 +812,18 @@ int lua_collect_items(uint32 item_id, bool remove) { return quest_manager.collectitems(item_id, remove); } +int lua_count_item(uint32 item_id) { + return quest_manager.countitem(item_id); +} + +void lua_remove_item(uint32 item_id) { + quest_manager.removeitem(item_id); +} + +void lua_remove_item(uint32 item_id, uint32 quantity) { + quest_manager.removeitem(item_id, quantity); +} + void lua_update_spawn_timer(uint32 id, uint32 new_time) { quest_manager.UpdateSpawnTimer(id, new_time); } @@ -803,6 +846,10 @@ std::string lua_item_link(int item_id) { return quest_manager.varlink(text, item_id); } +std::string lua_get_item_name(uint32 item_id) { + return quest_manager.getitemname(item_id); +} + std::string lua_say_link(const char *phrase, bool silent, const char *link_name) { char text[256] = { 0 }; strncpy(text, phrase, 255); @@ -854,6 +901,30 @@ bool lua_delete_data(std::string bucket_key) { return DataBucket::DeleteData(bucket_key); } +std::string lua_get_char_name_by_id(uint32 char_id) { + return database.GetCharNameByID(char_id); +} + +uint32 lua_get_char_id_by_name(const char* name) { + return quest_manager.getcharidbyname(name); +} + +std::string lua_get_class_name(uint8 class_id) { + return quest_manager.getclassname(class_id); +} + +std::string lua_get_class_name(uint8 class_id, uint8 level) { + return quest_manager.getclassname(class_id, level); +} + +int lua_get_currency_id(uint32 item_id) { + return quest_manager.getcurrencyid(item_id); +} + +int lua_get_currency_item_id(int currency_id) { + return quest_manager.getcurrencyitemid(currency_id); +} + const char *lua_get_guild_name_by_id(uint32 guild_id) { return quest_manager.getguildnamebyid(guild_id); } @@ -866,6 +937,10 @@ int lua_get_group_id_by_char_id(uint32 char_id) { return database.GetGroupIDByCharID(char_id); } +std::string lua_get_npc_name_by_id(uint32 npc_id) { + return quest_manager.getnpcnamebyid(npc_id); +} + int lua_get_raid_id_by_char_id(uint32 char_id) { return database.GetRaidIDByCharID(char_id); } @@ -922,6 +997,10 @@ void lua_remove_from_instance_by_char_id(uint32 instance_id, uint32 char_id) { quest_manager.RemoveFromInstanceByCharID(instance_id, char_id); } +bool lua_check_instance_by_char_id(uint32 instance_id, uint32 char_id) { + return quest_manager.CheckInstanceByCharID(instance_id, char_id); +} + void lua_remove_all_from_instance(uint32 instance_id) { quest_manager.RemoveAllFromInstance(instance_id); } @@ -966,24 +1045,480 @@ void lua_send_mail(const char *to, const char *from, const char *subject, const quest_manager.SendMail(to, from, subject, message); } -void lua_cross_zone_signal_client_by_char_id(uint32 player_id, int signal) { - quest_manager.CrossZoneSignalPlayerByCharID(player_id, signal); +void lua_cross_zone_assign_task_by_char_id(int character_id, uint32 task_id) { + quest_manager.CrossZoneAssignTaskByCharID(character_id, task_id); } -void lua_cross_zone_signal_client_by_name(const char *player, int signal) { - quest_manager.CrossZoneSignalPlayerByName(player, signal); +void lua_cross_zone_assign_task_by_char_id(int character_id, uint32 task_id, bool enforce_level_requirement) { + quest_manager.CrossZoneAssignTaskByCharID(character_id, task_id, enforce_level_requirement); } -void lua_cross_zone_message_player_by_name(uint32 type, const char *player, const char *message) { - quest_manager.CrossZoneMessagePlayerByName(type, player, message); +void lua_cross_zone_assign_task_by_group_id(int group_id, uint32 task_id) { + quest_manager.CrossZoneAssignTaskByGroupID(group_id, task_id); } -void lua_cross_zone_set_entity_variable_by_client_name(const char *player, const char *id, const char *m_var) { - quest_manager.CrossZoneSetEntityVariableByClientName(player, id, m_var); +void lua_cross_zone_assign_task_by_group_id(int group_id, uint32 task_id, bool enforce_level_requirement) { + quest_manager.CrossZoneAssignTaskByGroupID(group_id, task_id, enforce_level_requirement); } -void lua_world_wide_marquee(uint32 type, uint32 priority, uint32 fadein, uint32 fadeout, uint32 duration, const char *message) { - quest_manager.WorldWideMarquee(type, priority, fadein, fadeout, duration, message); +void lua_cross_zone_assign_task_by_raid_id(int raid_id, uint32 task_id) { + quest_manager.CrossZoneAssignTaskByRaidID(raid_id, task_id); +} + +void lua_cross_zone_assign_task_by_raid_id(int raid_id, uint32 task_id, bool enforce_level_requirement) { + quest_manager.CrossZoneAssignTaskByRaidID(raid_id, task_id, enforce_level_requirement); +} + +void lua_cross_zone_assign_task_by_guild_id(int guild_id, uint32 task_id) { + quest_manager.CrossZoneAssignTaskByGuildID(guild_id, task_id); +} + +void lua_cross_zone_assign_task_by_guild_id(int guild_id, uint32 task_id, bool enforce_level_requirement) { + quest_manager.CrossZoneAssignTaskByGuildID(guild_id, task_id, enforce_level_requirement); +} + +void lua_cross_zone_cast_spell_by_char_id(int character_id, uint32 spell_id) { + quest_manager.CrossZoneCastSpellByCharID(character_id, spell_id); +} + +void lua_cross_zone_cast_spell_by_group_id(int group_id, uint32 spell_id) { + quest_manager.CrossZoneCastSpellByGroupID(group_id, spell_id); +} + +void lua_cross_zone_cast_spell_by_raid_id(int raid_id, uint32 spell_id) { + quest_manager.CrossZoneCastSpellByRaidID(raid_id, spell_id); +} + +void lua_cross_zone_cast_spell_by_guild_id(int guild_id, uint32 spell_id) { + quest_manager.CrossZoneCastSpellByGuildID(guild_id, spell_id); +} + +void lua_cross_zone_disable_task_by_char_id(int character_id, uint32 task_id) { + quest_manager.CrossZoneDisableTaskByCharID(character_id, task_id); +} + +void lua_cross_zone_disable_task_by_group_id(int group_id, uint32 task_id) { + quest_manager.CrossZoneDisableTaskByGroupID(group_id, task_id); +} + +void lua_cross_zone_disable_task_by_raid_id(int raid_id, uint32 task_id) { + quest_manager.CrossZoneDisableTaskByRaidID(raid_id, task_id); +} + +void lua_cross_zone_disable_task_by_guild_id(int guild_id, uint32 task_id) { + quest_manager.CrossZoneDisableTaskByGuildID(guild_id, task_id); +} + +void lua_cross_zone_enable_task_by_char_id(int character_id, uint32 task_id) { + quest_manager.CrossZoneEnableTaskByCharID(character_id, task_id); +} + +void lua_cross_zone_enable_task_by_group_id(int group_id, uint32 task_id) { + quest_manager.CrossZoneEnableTaskByGroupID(group_id, task_id); +} + +void lua_cross_zone_enable_task_by_raid_id(int raid_id, uint32 task_id) { + quest_manager.CrossZoneEnableTaskByRaidID(raid_id, task_id); +} + +void lua_cross_zone_enable_task_by_guild_id(int guild_id, uint32 task_id) { + quest_manager.CrossZoneEnableTaskByGuildID(guild_id, task_id); +} + +void lua_cross_zone_fail_task_by_char_id(int character_id, uint32 task_id) { + quest_manager.CrossZoneFailTaskByCharID(character_id, task_id); +} + +void lua_cross_zone_fail_task_by_group_id(int group_id, uint32 task_id) { + quest_manager.CrossZoneFailTaskByGroupID(group_id, task_id); +} + +void lua_cross_zone_fail_task_by_raid_id(int raid_id, uint32 task_id) { + quest_manager.CrossZoneFailTaskByRaidID(raid_id, task_id); +} + +void lua_cross_zone_fail_task_by_guild_id(int guild_id, uint32 task_id) { + quest_manager.CrossZoneFailTaskByGuildID(guild_id, task_id); +} + +void lua_cross_zone_marquee_by_char_id(int character_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + quest_manager.CrossZoneMarqueeByCharID(character_id, type, priority, fade_in, fade_out, duration, message); +} + +void lua_cross_zone_marquee_by_group_id(int group_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + quest_manager.CrossZoneMarqueeByGroupID(group_id, type, priority, fade_in, fade_out, duration, message); +} + +void lua_cross_zone_marquee_by_raid_id(int raid_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + quest_manager.CrossZoneMarqueeByRaidID(raid_id, type, priority, fade_in, fade_out, duration, message); +} + +void lua_cross_zone_marquee_by_guild_id(int guild_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + quest_manager.CrossZoneMarqueeByGuildID(guild_id, type, priority, fade_in, fade_out, duration, message); +} + +void lua_cross_zone_message_player_by_name(uint32 type, const char *character_name, const char *message) { + quest_manager.CrossZoneMessagePlayerByName(type, character_name, message); +} + +void lua_cross_zone_message_player_by_group_id(uint32 type, int group_id, const char *message) { + quest_manager.CrossZoneMessagePlayerByGroupID(type, group_id, message); +} + +void lua_cross_zone_message_player_by_raid_id(uint32 type, int raid_id, const char *message) { + quest_manager.CrossZoneMessagePlayerByRaidID(type, raid_id, message); +} + +void lua_cross_zone_message_player_by_guild_id(uint32 type, int guild_id, const char *message) { + quest_manager.CrossZoneMessagePlayerByGuildID(type, guild_id, message); +} + +void lua_cross_zone_move_player_by_char_id(int character_id, const char *zone_short_name) { + quest_manager.CrossZoneMovePlayerByCharID(character_id, zone_short_name); +} + +void lua_cross_zone_move_player_by_group_id(int group_id, const char *zone_short_name) { + quest_manager.CrossZoneMovePlayerByGroupID(group_id, zone_short_name); +} + +void lua_cross_zone_move_player_by_raid_id(int raid_id, const char *zone_short_name) { + quest_manager.CrossZoneMovePlayerByRaidID(raid_id, zone_short_name); +} + +void lua_cross_zone_move_player_by_guild_id(int guild_id, const char *zone_short_name) { + quest_manager.CrossZoneMovePlayerByGuildID(guild_id, zone_short_name); +} + +void lua_cross_zone_move_instance_by_char_id(int character_id, uint16 instance_id) { + quest_manager.CrossZoneMoveInstanceByCharID(character_id, instance_id); +} + +void lua_cross_zone_move_instance_by_group_id(int group_id, uint16 instance_id) { + quest_manager.CrossZoneMoveInstanceByGroupID(group_id, instance_id); +} + +void lua_cross_zone_move_instance_by_raid_id(int raid_id, uint16 instance_id) { + quest_manager.CrossZoneMoveInstanceByRaidID(raid_id, instance_id); +} + +void lua_cross_zone_move_instance_by_guild_id(int guild_id, uint16 instance_id) { + quest_manager.CrossZoneMoveInstanceByGuildID(guild_id, instance_id); +} + +void lua_cross_zone_remove_spell_by_char_id(int character_id, uint32 spell_id) { + quest_manager.CrossZoneRemoveSpellByCharID(character_id, spell_id); +} + +void lua_cross_zone_remove_spell_by_group_id(int group_id, uint32 spell_id) { + quest_manager.CrossZoneRemoveSpellByGroupID(group_id, spell_id); +} + +void lua_cross_zone_remove_spell_by_raid_id(int raid_id, uint32 spell_id) { + quest_manager.CrossZoneRemoveSpellByRaidID(raid_id, spell_id); +} + +void lua_cross_zone_remove_spell_by_guild_id(int guild_id, uint32 spell_id) { + quest_manager.CrossZoneRemoveSpellByGuildID(guild_id, spell_id); +} + +void lua_cross_zone_remove_task_by_char_id(int character_id, uint32 task_id) { + quest_manager.CrossZoneRemoveTaskByCharID(character_id, task_id); +} + +void lua_cross_zone_remove_task_by_group_id(int group_id, uint32 task_id) { + quest_manager.CrossZoneRemoveTaskByGroupID(group_id, task_id); +} + +void lua_cross_zone_remove_task_by_raid_id(int raid_id, uint32 task_id) { + quest_manager.CrossZoneRemoveTaskByRaidID(raid_id, task_id); +} + +void lua_cross_zone_remove_task_by_guild_id(int guild_id, uint32 task_id) { + quest_manager.CrossZoneRemoveTaskByGuildID(guild_id, task_id); +} + +void lua_cross_zone_reset_activity_by_char_id(int character_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneResetActivityByCharID(character_id, task_id, activity_id); +} + +void lua_cross_zone_reset_activity_by_group_id(int group_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneResetActivityByGroupID(group_id, task_id, activity_id); +} + +void lua_cross_zone_reset_activity_by_raid_id(int raid_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneResetActivityByRaidID(raid_id, task_id, activity_id); +} + +void lua_cross_zone_reset_activity_by_guild_id(int guild_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneResetActivityByGuildID(guild_id, task_id, activity_id); +} + +void lua_cross_zone_set_entity_variable_by_client_name(const char *character_name, const char *variable_name, const char *variable_value) { + quest_manager.CrossZoneSetEntityVariableByClientName(character_name, variable_name, variable_value); +} + +void lua_cross_zone_set_entity_variable_by_group_id(int group_id, const char *variable_name, const char *variable_value) { + quest_manager.CrossZoneSetEntityVariableByGroupID(group_id, variable_name, variable_value); +} + +void lua_cross_zone_set_entity_variable_by_raid_id(int raid_id, const char *variable_name, const char *variable_value) { + quest_manager.CrossZoneSetEntityVariableByRaidID(raid_id, variable_name, variable_value); +} + +void lua_cross_zone_set_entity_variable_by_guild_id(int guild_id, const char *variable_name, const char *variable_value) { + quest_manager.CrossZoneSetEntityVariableByGuildID(guild_id, variable_name, variable_value); +} + +void lua_cross_zone_signal_client_by_char_id(uint32 character_id, int signal) { + quest_manager.CrossZoneSignalPlayerByCharID(character_id, signal); +} + +void lua_cross_zone_signal_client_by_group_id(uint32 group_id, int signal) { + quest_manager.CrossZoneSignalPlayerByGroupID(group_id, signal); +} + +void lua_cross_zone_signal_client_by_raid_id(uint32 raid_id, int signal) { + quest_manager.CrossZoneSignalPlayerByRaidID(raid_id, signal); +} + +void lua_cross_zone_signal_client_by_guild_id(uint32 guild_id, int signal) { + quest_manager.CrossZoneSignalPlayerByGuildID(guild_id, signal); +} + +void lua_cross_zone_signal_client_by_name(const char *character_name, int signal) { + quest_manager.CrossZoneSignalPlayerByName(character_name, signal); +} + +void lua_cross_zone_signal_npc_by_npctype_id(uint32 npctype_id, int signal) { + quest_manager.CrossZoneSignalNPCByNPCTypeID(npctype_id, signal); +} + +void lua_cross_zone_update_activity_by_char_id(int character_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneUpdateActivityByCharID(character_id, task_id, activity_id); +} + +void lua_cross_zone_update_activity_by_char_id(int character_id, uint32 task_id, int activity_id, int activity_count) { + quest_manager.CrossZoneUpdateActivityByCharID(character_id, task_id, activity_id, activity_count); +} + +void lua_cross_zone_update_activity_by_group_id(int group_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneUpdateActivityByGroupID(group_id, task_id, activity_id); +} + +void lua_cross_zone_update_activity_by_group_id(int group_id, uint32 task_id, int activity_id, int activity_count) { + quest_manager.CrossZoneUpdateActivityByGroupID(group_id, task_id, activity_id, activity_count); +} + +void lua_cross_zone_update_activity_by_raid_id(int raid_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneUpdateActivityByRaidID(raid_id, task_id, activity_id); +} + +void lua_cross_zone_update_activity_by_raid_id(int raid_id, uint32 task_id, int activity_id, int activity_count) { + quest_manager.CrossZoneUpdateActivityByRaidID(raid_id, task_id, activity_id, activity_count); +} + +void lua_cross_zone_update_activity_by_guild_id(int guild_id, uint32 task_id, int activity_id) { + quest_manager.CrossZoneUpdateActivityByGuildID(guild_id, task_id, activity_id); +} + +void lua_cross_zone_update_activity_by_guild_id(int guild_id, uint32 task_id, int activity_id, int activity_count) { + quest_manager.CrossZoneUpdateActivityByGuildID(guild_id, task_id, activity_id, activity_count); +} + +void lua_world_wide_assign_task(uint32 task_id) { + quest_manager.WorldWideAssignTask(task_id); +} + +void lua_world_wide_assign_task(uint32 task_id, bool enforce_level_requirement) { + quest_manager.WorldWideAssignTask(task_id, enforce_level_requirement); +} + +void lua_world_wide_assign_task(uint32 task_id, bool enforce_level_requirement, uint8 min_status) { + quest_manager.WorldWideAssignTask(task_id, enforce_level_requirement, min_status); +} + +void lua_world_wide_assign_task(uint32 task_id, bool enforce_level_requirement, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideAssignTask(task_id, enforce_level_requirement, min_status, max_status); +} + +void lua_world_wide_cast_spell(uint32 spell_id) { + quest_manager.WorldWideCastSpell(spell_id); +} + +void lua_world_wide_cast_spell(uint32 spell_id, uint8 min_status) { + quest_manager.WorldWideCastSpell(spell_id, min_status); +} + +void lua_world_wide_cast_spell(uint32 spell_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideCastSpell(spell_id, min_status, max_status); +} + +void lua_world_wide_disable_task(uint32 task_id) { + quest_manager.WorldWideDisableTask(task_id); +} + +void lua_world_wide_disable_task(uint32 task_id, uint8 min_status) { + quest_manager.WorldWideDisableTask(task_id, min_status); +} + +void lua_world_wide_disable_task(uint32 task_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideDisableTask(task_id, min_status, max_status); +} + +void lua_world_wide_enable_task(uint32 task_id) { + quest_manager.WorldWideEnableTask(task_id); +} + +void lua_world_wide_enable_task(uint32 task_id, uint8 min_status) { + quest_manager.WorldWideEnableTask(task_id, min_status); +} + +void lua_world_wide_enable_task(uint32 task_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideEnableTask(task_id, min_status, max_status); +} + +void lua_world_wide_fail_task(uint32 task_id) { + quest_manager.WorldWideFailTask(task_id); +} + +void lua_world_wide_fail_task(uint32 task_id, uint8 min_status) { + quest_manager.WorldWideFailTask(task_id, min_status); +} + +void lua_world_wide_fail_task(uint32 task_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideFailTask(task_id, min_status, max_status); +} + +void lua_world_wide_marquee(uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + quest_manager.WorldWideMarquee(type, priority, fade_in, fade_out, duration, message); +} + +void lua_world_wide_marquee(uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message, uint8 min_status) { + quest_manager.WorldWideMarquee(type, priority, fade_in, fade_out, duration, message, min_status); +} + +void lua_world_wide_marquee(uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideMarquee(type, priority, fade_in, fade_out, duration, message, min_status, max_status); +} + +void lua_world_wide_message(uint32 type, const char *message) { + quest_manager.WorldWideMessage(type, message); +} + +void lua_world_wide_message(uint32 type, const char *message, uint8 min_status) { + quest_manager.WorldWideMessage(type, message, min_status); +} + +void lua_world_wide_message(uint32 type, const char *message, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideMessage(type, message, min_status, max_status); +} + +void lua_world_wide_move(const char *zone_short_name) { + quest_manager.WorldWideMove(zone_short_name); +} + +void lua_world_wide_move(const char *zone_short_name, uint8 min_status) { + quest_manager.WorldWideMove(zone_short_name, min_status); +} + +void lua_world_wide_move(const char *zone_short_name, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideMove(zone_short_name, min_status, max_status); +} + +void lua_world_wide_move_instance(uint16 instance_id) { + quest_manager.WorldWideMoveInstance(instance_id); +} + +void lua_world_wide_move_instance(uint16 instance_id, uint8 min_status) { + quest_manager.WorldWideMoveInstance(instance_id, min_status); +} + +void lua_world_wide_move_instance(uint16 instance_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideMoveInstance(instance_id, min_status, max_status); +} + +void lua_world_wide_remove_spell(uint32 spell_id) { + quest_manager.WorldWideRemoveSpell(spell_id); +} + +void lua_world_wide_remove_spell(uint32 spell_id, uint8 min_status) { + quest_manager.WorldWideRemoveSpell(spell_id, min_status); +} + +void lua_world_wide_remove_spell(uint32 spell_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideRemoveSpell(spell_id, min_status, max_status); +} + +void lua_world_wide_remove_task(uint32 task_id) { + quest_manager.WorldWideRemoveTask(task_id); +} + +void lua_world_wide_remove_task(uint32 task_id, uint8 min_status) { + quest_manager.WorldWideRemoveTask(task_id, min_status); +} + +void lua_world_wide_remove_task(uint32 task_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideRemoveTask(task_id, min_status, max_status); +} + +void lua_world_wide_reset_activity(uint32 task_id, int activity_id) { + quest_manager.WorldWideResetActivity(task_id, activity_id); +} + +void lua_world_wide_reset_activity(uint32 task_id, int activity_id, uint8 min_status) { + quest_manager.WorldWideResetActivity(task_id, activity_id, min_status); +} + +void lua_world_wide_reset_activity(uint32 task_id, int activity_id, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideResetActivity(task_id, activity_id, min_status, max_status); +} + +void lua_world_wide_set_entity_variable_client(const char *variable_name, const char *variable_value) { + quest_manager.WorldWideSetEntityVariableClient(variable_name, variable_value); +} + +void lua_world_wide_set_entity_variable_client(const char *variable_name, const char *variable_value, uint8 min_status) { + quest_manager.WorldWideSetEntityVariableClient(variable_name, variable_value, min_status); +} + +void lua_world_wide_set_entity_variable_client(const char *variable_name, const char *variable_value, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideSetEntityVariableClient(variable_name, variable_value, min_status, max_status); +} + +void lua_world_wide_set_entity_variable_npc(const char *variable_name, const char *variable_value) { + quest_manager.WorldWideSetEntityVariableNPC(variable_name, variable_value); +} + +void lua_world_wide_signal_client(uint32 signal) { + quest_manager.WorldWideSignalClient(signal); +} + +void lua_world_wide_signal_client(uint32 signal, uint8 min_status) { + quest_manager.WorldWideSignalClient(signal, min_status); +} + +void lua_world_wide_signal_client(uint32 signal, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideSignalClient(signal, min_status, max_status); +} + +void lua_world_wide_signal_npc(uint32 signal) { + quest_manager.WorldWideSignalNPC(signal); +} + +void lua_world_wide_update_activity(uint32 task_id, int activity_id) { + quest_manager.WorldWideUpdateActivity(task_id, activity_id); +} + +void lua_world_wide_update_activity(uint32 task_id, int activity_id, int activity_count) { + quest_manager.WorldWideUpdateActivity(task_id, activity_id, activity_count); +} + +void lua_world_wide_update_activity(uint32 task_id, int activity_id, int activity_count, uint8 min_status) { + quest_manager.WorldWideUpdateActivity(task_id, activity_id, activity_count, min_status); +} + +void lua_world_wide_update_activity(uint32 task_id, int activity_id, int activity_count, uint8 min_status, uint8 max_status) { + quest_manager.WorldWideUpdateActivity(task_id, activity_id, activity_count, min_status, max_status); } luabind::adl::object lua_get_qglobals(lua_State *L, Lua_NPC npc, Lua_Client client) { @@ -1054,6 +1589,18 @@ Lua_EntityList lua_get_entity_list() { return Lua_EntityList(&entity_list); } +void lua_zone(const char* zone_name) { + quest_manager.Zone(zone_name); +} + +void lua_zone_group(const char* zone_name) { + quest_manager.ZoneGroup(zone_name); +} + +void lua_zone_raid(const char* zone_name) { + quest_manager.ZoneRaid(zone_name); +} + int lua_get_zone_id() { if(!zone) return 0; @@ -1061,6 +1608,10 @@ int lua_get_zone_id() { return zone->GetZoneID(); } +int lua_get_zone_id_by_name(const char* zone_name) { + return ZoneID(zone_name); +} + const char *lua_get_zone_long_name() { if(!zone) return ""; @@ -1068,6 +1619,16 @@ const char *lua_get_zone_long_name() { return zone->GetLongName(); } +const char *lua_get_zone_long_name_by_name(const char* zone_name) { + return ZoneLongName( + ZoneID(zone_name) + ); +} + +const char *lua_get_zone_long_name_by_id(uint32 zone_id) { + return ZoneLongName(zone_id); +} + const char *lua_get_zone_short_name() { if(!zone) return ""; @@ -1075,6 +1636,10 @@ const char *lua_get_zone_short_name() { return zone->GetShortName(); } +const char *lua_get_zone_short_name_by_id(uint32 zone_id) { + return ZoneName(zone_id); +} + int lua_get_zone_instance_id() { if(!zone) return 0; @@ -1167,6 +1732,7 @@ void lua_add_spawn_point(luabind::adl::object table) { uint32 variance; uint32 timeleft = 0; uint32 grid = 0; + bool path_when_zone_idle = false; int condition_id = 0; int condition_min_value = 0; bool enabled = true; @@ -1276,6 +1842,14 @@ void lua_add_spawn_point(luabind::adl::object table) { } } + cur = table["path_when_zone_idle"]; + if(luabind::type(cur) != LUA_TNIL) { + try { + path_when_zone_idle = luabind::object_cast(cur); + } catch(luabind::cast_failed &) { + } + } + cur = table["condition_id"]; if(luabind::type(cur) != LUA_TNIL) { try { @@ -1310,8 +1884,10 @@ void lua_add_spawn_point(luabind::adl::object table) { lua_remove_spawn_point(spawn2_id); - auto t = new Spawn2(spawn2_id, spawngroup_id, x, y, z, heading, respawn, variance, timeleft, grid, - condition_id, condition_min_value, enabled, static_cast(animation)); + auto t = new Spawn2(spawn2_id, spawngroup_id, x, y, z, heading, respawn, + variance, timeleft, grid, path_when_zone_idle, condition_id, + condition_min_value, enabled, static_cast(animation)); + zone->spawn2_list.Insert(t); } } @@ -1413,6 +1989,370 @@ void lua_update_zone_header(std::string type, std::string value) { quest_manager.UpdateZoneHeader(type, value); } +/** + * Expansions + */ + +bool lua_is_classic_enabled() { + return content_service.IsClassicEnabled(); +} + +bool lua_is_the_ruins_of_kunark_enabled() { + return content_service.IsTheRuinsOfKunarkEnabled(); +} + +bool lua_is_the_scars_of_velious_enabled() { + return content_service.IsTheScarsOfVeliousEnabled(); +} + +bool lua_is_the_shadows_of_luclin_enabled() { + return content_service.IsTheShadowsOfLuclinEnabled(); +} + +bool lua_is_the_planes_of_power_enabled() { + return content_service.IsThePlanesOfPowerEnabled(); +} + +bool lua_is_the_legacy_of_ykesha_enabled() { + return content_service.IsTheLegacyOfYkeshaEnabled(); +} + +bool lua_is_lost_dungeons_of_norrath_enabled() { + return content_service.IsLostDungeonsOfNorrathEnabled(); +} + +bool lua_is_gates_of_discord_enabled() { + return content_service.IsGatesOfDiscordEnabled(); +} + +bool lua_is_omens_of_war_enabled() { + return content_service.IsOmensOfWarEnabled(); +} + +bool lua_is_dragons_of_norrath_enabled() { + return content_service.IsDragonsOfNorrathEnabled(); +} + +bool lua_is_depths_of_darkhollow_enabled() { + return content_service.IsDepthsOfDarkhollowEnabled(); +} + +bool lua_is_prophecy_of_ro_enabled() { + return content_service.IsProphecyOfRoEnabled(); +} + +bool lua_is_the_serpents_spine_enabled() { + return content_service.IsTheSerpentsSpineEnabled(); +} + +bool lua_is_the_buried_sea_enabled() { + return content_service.IsTheBuriedSeaEnabled(); +} + +bool lua_is_secrets_of_faydwer_enabled() { + return content_service.IsSecretsOfFaydwerEnabled(); +} + +bool lua_is_seeds_of_destruction_enabled() { + return content_service.IsSeedsOfDestructionEnabled(); +} + +bool lua_is_underfoot_enabled() { + return content_service.IsUnderfootEnabled(); +} + +bool lua_is_house_of_thule_enabled() { + return content_service.IsHouseOfThuleEnabled(); +} + +bool lua_is_veil_of_alaris_enabled() { + return content_service.IsVeilOfAlarisEnabled(); +} + +bool lua_is_rain_of_fear_enabled() { + return content_service.IsRainOfFearEnabled(); +} + +bool lua_is_call_of_the_forsaken_enabled() { + return content_service.IsCallOfTheForsakenEnabled(); +} + +bool lua_is_the_darkend_sea_enabled() { + return content_service.IsTheDarkendSeaEnabled(); +} + +bool lua_is_the_broken_mirror_enabled() { + return content_service.IsTheBrokenMirrorEnabled(); +} + +bool lua_is_empires_of_kunark_enabled() { + return content_service.IsEmpiresOfKunarkEnabled(); +} + +bool lua_is_ring_of_scale_enabled() { + return content_service.IsRingOfScaleEnabled(); +} + +bool lua_is_the_burning_lands_enabled() { + return content_service.IsTheBurningLandsEnabled(); +} + +bool lua_is_torment_of_velious_enabled() { + return content_service.IsTormentOfVeliousEnabled(); +} + +bool lua_is_current_expansion_classic() { + return content_service.IsCurrentExpansionClassic(); +} + +bool lua_is_current_expansion_the_ruins_of_kunark() { + return content_service.IsCurrentExpansionTheRuinsOfKunark(); +} + +bool lua_is_current_expansion_the_scars_of_velious() { + return content_service.IsCurrentExpansionTheScarsOfVelious(); +} + +bool lua_is_current_expansion_the_shadows_of_luclin() { + return content_service.IsCurrentExpansionTheShadowsOfLuclin(); +} + +bool lua_is_current_expansion_the_planes_of_power() { + return content_service.IsCurrentExpansionThePlanesOfPower(); +} + +bool lua_is_current_expansion_the_legacy_of_ykesha() { + return content_service.IsCurrentExpansionTheLegacyOfYkesha(); +} + +bool lua_is_current_expansion_lost_dungeons_of_norrath() { + return content_service.IsCurrentExpansionLostDungeonsOfNorrath(); +} + +bool lua_is_current_expansion_gates_of_discord() { + return content_service.IsCurrentExpansionGatesOfDiscord(); +} + +bool lua_is_current_expansion_omens_of_war() { + return content_service.IsCurrentExpansionOmensOfWar(); +} + +bool lua_is_current_expansion_dragons_of_norrath() { + return content_service.IsCurrentExpansionDragonsOfNorrath(); +} + +bool lua_is_current_expansion_depths_of_darkhollow() { + return content_service.IsCurrentExpansionDepthsOfDarkhollow(); +} + +bool lua_is_current_expansion_prophecy_of_ro() { + return content_service.IsCurrentExpansionProphecyOfRo(); +} + +bool lua_is_current_expansion_the_serpents_spine() { + return content_service.IsCurrentExpansionTheSerpentsSpine(); +} + +bool lua_is_current_expansion_the_buried_sea() { + return content_service.IsCurrentExpansionTheBuriedSea(); +} + +bool lua_is_current_expansion_secrets_of_faydwer() { + return content_service.IsCurrentExpansionSecretsOfFaydwer(); +} + +bool lua_is_current_expansion_seeds_of_destruction() { + return content_service.IsCurrentExpansionSeedsOfDestruction(); +} + +bool lua_is_current_expansion_underfoot() { + return content_service.IsCurrentExpansionUnderfoot(); +} + +bool lua_is_current_expansion_house_of_thule() { + return content_service.IsCurrentExpansionHouseOfThule(); +} + +bool lua_is_current_expansion_veil_of_alaris() { + return content_service.IsCurrentExpansionVeilOfAlaris(); +} + +bool lua_is_current_expansion_rain_of_fear() { + return content_service.IsCurrentExpansionRainOfFear(); +} + +bool lua_is_current_expansion_call_of_the_forsaken() { + return content_service.IsCurrentExpansionCallOfTheForsaken(); +} + +bool lua_is_current_expansion_the_darkend_sea() { + return content_service.IsCurrentExpansionTheDarkendSea(); +} + +bool lua_is_current_expansion_the_broken_mirror() { + return content_service.IsCurrentExpansionTheBrokenMirror(); +} + +bool lua_is_current_expansion_empires_of_kunark() { + return content_service.IsCurrentExpansionEmpiresOfKunark(); +} + +bool lua_is_current_expansion_ring_of_scale() { + return content_service.IsCurrentExpansionRingOfScale(); +} + +bool lua_is_current_expansion_the_burning_lands() { + return content_service.IsCurrentExpansionTheBurningLands(); +} + +bool lua_is_current_expansion_torment_of_velious() { + return content_service.IsCurrentExpansionTormentOfVelious(); +} + +bool lua_is_content_flag_enabled(std::string content_flag){ + return content_service.IsContentFlagEnabled(content_flag); +} + +void lua_set_content_flag(std::string flag_name, bool enabled){ + ZoneStore::SetContentFlag(flag_name, enabled); +} + +Lua_Expedition lua_get_expedition() { + if (zone && zone->GetInstanceID() != 0) + { + return Expedition::FindCachedExpeditionByZoneInstance(zone->GetZoneID(), zone->GetInstanceID()); + } + return nullptr; +} + +Lua_Expedition lua_get_expedition_by_char_id(uint32 char_id) { + return Expedition::FindCachedExpeditionByCharacterID(char_id); +} + +Lua_Expedition lua_get_expedition_by_dz_id(uint32 dz_id) { + return Expedition::FindCachedExpeditionByDynamicZoneID(dz_id); +} + +Lua_Expedition lua_get_expedition_by_zone_instance(uint32 zone_id, uint32 instance_id) { + return Expedition::FindCachedExpeditionByZoneInstance(zone_id, instance_id); +} + +luabind::object lua_get_expedition_lockout_by_char_id(lua_State* L, uint32 char_id, std::string expedition_name, std::string event_name) { + luabind::adl::object lua_table = luabind::newtable(L); + + auto lockouts = Expedition::GetExpeditionLockoutsByCharacterID(char_id); + + auto it = std::find_if(lockouts.begin(), lockouts.end(), [&](const ExpeditionLockoutTimer& lockout) { + return lockout.IsSameLockout(expedition_name, event_name); + }); + + if (it != lockouts.end()) + { + lua_table["remaining"] = it->GetSecondsRemaining(); + lua_table["uuid"] = it->GetExpeditionUUID(); + } + + return lua_table; +} + +luabind::object lua_get_expedition_lockouts_by_char_id(lua_State* L, uint32 char_id) { + luabind::adl::object lua_table = luabind::newtable(L); + + auto lockouts = Expedition::GetExpeditionLockoutsByCharacterID(char_id); + for (const auto& lockout : lockouts) + { + auto lockout_table = lua_table[lockout.GetExpeditionName()]; + if (luabind::type(lockout_table) != LUA_TTABLE) + { + lockout_table = luabind::newtable(L); + } + + auto event_table = lockout_table[lockout.GetEventName()]; + if (luabind::type(event_table) != LUA_TTABLE) + { + event_table = luabind::newtable(L); + } + + event_table["remaining"] = lockout.GetSecondsRemaining(); + event_table["uuid"] = lockout.GetExpeditionUUID(); + } + return lua_table; +} + +luabind::object lua_get_expedition_lockouts_by_char_id(lua_State* L, uint32 char_id, std::string expedition_name) { + luabind::adl::object lua_table = luabind::newtable(L); + + auto lockouts = Expedition::GetExpeditionLockoutsByCharacterID(char_id); + for (const auto& lockout : lockouts) + { + if (lockout.GetExpeditionName() == expedition_name) + { + auto event_table = lua_table[lockout.GetEventName()]; + if (luabind::type(event_table) != LUA_TTABLE) + { + event_table = luabind::newtable(L); + } + event_table["remaining"] = lockout.GetSecondsRemaining(); + event_table["uuid"] = lockout.GetExpeditionUUID(); + } + } + return lua_table; +} + +void lua_add_expedition_lockout_all_clients(std::string expedition_name, std::string event_name, uint32 seconds) { + auto lockout = ExpeditionLockoutTimer::CreateLockout(expedition_name, event_name, seconds); + Expedition::AddLockoutClients(lockout); +} + +void lua_add_expedition_lockout_all_clients(std::string expedition_name, std::string event_name, uint32 seconds, std::string uuid) { + auto lockout = ExpeditionLockoutTimer::CreateLockout(expedition_name, event_name, seconds, uuid); + Expedition::AddLockoutClients(lockout); +} + +void lua_add_expedition_lockout_by_char_id(uint32 char_id, std::string expedition_name, std::string event_name, uint32 seconds) { + Expedition::AddLockoutByCharacterID(char_id, expedition_name, event_name, seconds); +} + +void lua_add_expedition_lockout_by_char_id(uint32 char_id, std::string expedition_name, std::string event_name, uint32 seconds, std::string uuid) { + Expedition::AddLockoutByCharacterID(char_id, expedition_name, event_name, seconds, uuid); +} + +void lua_remove_expedition_lockout_by_char_id(uint32 char_id, std::string expedition_name, std::string event_name) { + Expedition::RemoveLockoutsByCharacterID(char_id, expedition_name, event_name); +} + +void lua_remove_all_expedition_lockouts_by_char_id(uint32 char_id) { + Expedition::RemoveLockoutsByCharacterID(char_id); +} + +void lua_remove_all_expedition_lockouts_by_char_id(uint32 char_id, std::string expedition_name) { + Expedition::RemoveLockoutsByCharacterID(char_id, expedition_name); +} + +std::string lua_seconds_to_time(int duration) { + return quest_manager.secondstotime(duration); +} + +std::string lua_get_hex_color_code(std::string color_name) { + return quest_manager.gethexcolorcode(color_name); +} + +double lua_get_aa_exp_modifier_by_char_id(uint32 character_id, uint32 zone_id) { + return database.GetAAEXPModifier(character_id, zone_id); +} + +double lua_get_exp_modifier_by_char_id(uint32 character_id, uint32 zone_id) { + return database.GetEXPModifier(character_id, zone_id); +} + +void lua_set_aa_exp_modifier_by_char_id(uint32 character_id, uint32 zone_id, double aa_modifier) { + database.SetAAEXPModifier(character_id, zone_id, aa_modifier); +} + +void lua_set_exp_modifier_by_char_id(uint32 character_id, uint32 zone_id, double exp_modifier) { + database.SetEXPModifier(character_id, zone_id, exp_modifier); +} + #define LuaCreateNPCParse(name, c_type, default_value) do { \ cur = table[#name]; \ if(luabind::type(cur) != LUA_TNIL) { \ @@ -1643,7 +2583,11 @@ luabind::scope lua_register_general() { luabind::def("depop_all", (void(*)(int))&lua_depop_all), luabind::def("depop_zone", &lua_depop_zone), luabind::def("repop_zone", &lua_repop_zone), + luabind::def("process_mobs_while_zone_empty", &lua_process_mobs_while_zone_empty), luabind::def("is_disc_tome", &lua_is_disc_tome), + luabind::def("get_race_name", (std::string(*)(uint16))&lua_get_race_name), + luabind::def("get_spell_name", (std::string(*)(uint32))&lua_get_spell_name), + luabind::def("get_skill_name", (std::string(*)(int))&lua_get_skill_name), luabind::def("safe_move", &lua_safe_move), luabind::def("rain", &lua_rain), luabind::def("snow", &lua_snow), @@ -1711,10 +2655,13 @@ luabind::scope lua_register_general() { luabind::def("active_tasks_in_set", &lua_active_tasks_in_set), luabind::def("completed_tasks_in_set", &lua_completed_tasks_in_set), luabind::def("is_task_appropriate", &lua_is_task_appropriate), + luabind::def("get_task_name", (std::string(*)(uint32))&lua_get_task_name), luabind::def("popup", &lua_popup), luabind::def("clear_spawn_timers", &lua_clear_spawn_timers), luabind::def("zone_emote", &lua_zone_emote), luabind::def("world_emote", &lua_world_emote), + luabind::def("message", &lua_message), + luabind::def("whisper", &lua_whisper), luabind::def("get_level", &lua_get_level), luabind::def("create_ground_object", (void(*)(uint32,float,float,float,float))&lua_create_ground_object), luabind::def("create_ground_object", (void(*)(uint32,float,float,float,float,uint32))&lua_create_ground_object), @@ -1724,11 +2671,15 @@ luabind::scope lua_register_general() { luabind::def("create_door", &lua_create_door), luabind::def("modify_npc_stat", &lua_modify_npc_stat), luabind::def("collect_items", &lua_collect_items), + luabind::def("count_item", &lua_count_item), + luabind::def("remove_item", (void(*)(uint32))&lua_remove_item), + luabind::def("remove_item", (void(*)(uint32,uint32))&lua_remove_item), luabind::def("update_spawn_timer", &lua_update_spawn_timer), luabind::def("merchant_set_item", (void(*)(uint32,uint32))&lua_merchant_set_item), luabind::def("merchant_set_item", (void(*)(uint32,uint32,uint32))&lua_merchant_set_item), luabind::def("merchant_count_item", &lua_merchant_count_item), luabind::def("item_link", &lua_item_link), + luabind::def("get_item_name", (std::string(*)(uint32))&lua_get_item_name), luabind::def("say_link", (std::string(*)(const char*,bool,const char*))&lua_say_link), luabind::def("say_link", (std::string(*)(const char*,bool))&lua_say_link), luabind::def("say_link", (std::string(*)(const char*))&lua_say_link), @@ -1739,9 +2690,16 @@ luabind::scope lua_register_general() { luabind::def("set_data", (void(*)(std::string, std::string))&lua_set_data), luabind::def("set_data", (void(*)(std::string, std::string, std::string))&lua_set_data), luabind::def("delete_data", (bool(*)(std::string))&lua_delete_data), + luabind::def("get_char_name_by_id", &lua_get_char_name_by_id), + luabind::def("get_char_id_by_name", (uint32(*)(const char*))&lua_get_char_id_by_name), + luabind::def("get_class_name", (std::string(*)(uint8))&lua_get_class_name), + luabind::def("get_class_name", (std::string(*)(uint8,uint8))&lua_get_class_name), + luabind::def("get_currency_id", &lua_get_currency_id), + luabind::def("get_currency_item_id", &lua_get_currency_item_id), luabind::def("get_guild_name_by_id", &lua_get_guild_name_by_id), luabind::def("get_guild_id_by_char_id", &lua_get_guild_id_by_char_id), luabind::def("get_group_id_by_char_id", &lua_get_group_id_by_char_id), + luabind::def("get_npc_name_by_id", &lua_get_npc_name_by_id), luabind::def("get_raid_id_by_char_id", &lua_get_raid_id_by_char_id), luabind::def("create_instance", &lua_create_instance), luabind::def("destroy_instance", &lua_destroy_instance), @@ -1757,6 +2715,7 @@ luabind::scope lua_register_general() { luabind::def("assign_raid_to_instance", &lua_assign_raid_to_instance), luabind::def("remove_from_instance", &lua_remove_from_instance), luabind::def("remove_from_instance_by_char_id", &lua_remove_from_instance_by_char_id), + luabind::def("check_instance_by_char_id", (bool(*)(uint16, uint32))&lua_check_instance_by_char_id), luabind::def("remove_all_from_instance", &lua_remove_all_from_instance), luabind::def("flag_instance_by_group_leader", &lua_flag_instance_by_group_leader), luabind::def("flag_instance_by_raid_leader", &lua_flag_instance_by_raid_leader), @@ -1768,19 +2727,140 @@ luabind::scope lua_register_general() { luabind::def("wear_change", &lua_wear_change), luabind::def("voice_tell", &lua_voice_tell), luabind::def("send_mail", &lua_send_mail), - luabind::def("cross_zone_signal_client_by_char_id", &lua_cross_zone_signal_client_by_char_id), - luabind::def("cross_zone_signal_client_by_name", &lua_cross_zone_signal_client_by_name), + luabind::def("cross_zone_assign_task_by_char_id", (void(*)(int,uint32))&lua_cross_zone_assign_task_by_char_id), + luabind::def("cross_zone_assign_task_by_char_id", (void(*)(int,uint32,bool))&lua_cross_zone_assign_task_by_char_id), + luabind::def("cross_zone_assign_task_by_group_id", (void(*)(int,uint32))&lua_cross_zone_assign_task_by_group_id), + luabind::def("cross_zone_assign_task_by_group_id", (void(*)(int,uint32,bool))&lua_cross_zone_assign_task_by_group_id), + luabind::def("cross_zone_assign_task_by_raid_id", (void(*)(int,uint32))&lua_cross_zone_assign_task_by_raid_id), + luabind::def("cross_zone_assign_task_by_raid_id", (void(*)(int,uint32,bool))&lua_cross_zone_assign_task_by_raid_id), + luabind::def("cross_zone_assign_task_by_guild_id", (void(*)(int,uint32))&lua_cross_zone_assign_task_by_guild_id), + luabind::def("cross_zone_assign_task_by_guild_id", (void(*)(int,uint32,bool))&lua_cross_zone_assign_task_by_guild_id), + luabind::def("cross_zone_cast_spell_by_char_id", &lua_cross_zone_cast_spell_by_char_id), + luabind::def("cross_zone_cast_spell_by_group_id", &lua_cross_zone_cast_spell_by_group_id), + luabind::def("cross_zone_cast_spell_by_raid_id", &lua_cross_zone_cast_spell_by_raid_id), + luabind::def("cross_zone_cast_spell_by_guild_id", &lua_cross_zone_cast_spell_by_guild_id), + luabind::def("cross_zone_disable_task_by_char_id", &lua_cross_zone_disable_task_by_char_id), + luabind::def("cross_zone_disable_task_by_group_id", &lua_cross_zone_disable_task_by_group_id), + luabind::def("cross_zone_disable_task_by_raid_id", &lua_cross_zone_disable_task_by_raid_id), + luabind::def("cross_zone_disable_task_by_guild_id", &lua_cross_zone_disable_task_by_guild_id), + luabind::def("cross_zone_enable_task_by_char_id", &lua_cross_zone_enable_task_by_char_id), + luabind::def("cross_zone_enable_task_by_group_id", &lua_cross_zone_enable_task_by_group_id), + luabind::def("cross_zone_enable_task_by_raid_id", &lua_cross_zone_enable_task_by_raid_id), + luabind::def("cross_zone_enable_task_by_guild_id", &lua_cross_zone_enable_task_by_guild_id), + luabind::def("cross_zone_fail_task_by_char_id", &lua_cross_zone_fail_task_by_char_id), + luabind::def("cross_zone_fail_task_by_group_id", &lua_cross_zone_fail_task_by_group_id), + luabind::def("cross_zone_fail_task_by_raid_id", &lua_cross_zone_fail_task_by_raid_id), + luabind::def("cross_zone_fail_task_by_guild_id", &lua_cross_zone_fail_task_by_guild_id), + luabind::def("cross_zone_marquee_by_char_id", &lua_cross_zone_marquee_by_char_id), + luabind::def("cross_zone_marquee_by_group_id", &lua_cross_zone_marquee_by_group_id), + luabind::def("cross_zone_marquee_by_raid_id", &lua_cross_zone_marquee_by_raid_id), + luabind::def("cross_zone_marquee_by_guild_id", &lua_cross_zone_marquee_by_guild_id), luabind::def("cross_zone_message_player_by_name", &lua_cross_zone_message_player_by_name), + luabind::def("cross_zone_message_player_by_group_id", &lua_cross_zone_message_player_by_group_id), + luabind::def("cross_zone_message_player_by_raid_id", &lua_cross_zone_message_player_by_raid_id), + luabind::def("cross_zone_message_player_by_guild_id", &lua_cross_zone_message_player_by_guild_id), + luabind::def("cross_zone_move_player_by_char_id", &lua_cross_zone_move_player_by_char_id), + luabind::def("cross_zone_move_player_by_group_id", &lua_cross_zone_move_player_by_group_id), + luabind::def("cross_zone_move_player_by_raid_id", &lua_cross_zone_move_player_by_raid_id), + luabind::def("cross_zone_move_player_by_guild_id", &lua_cross_zone_move_player_by_guild_id), + luabind::def("cross_zone_move_instance_by_char_id", &lua_cross_zone_move_instance_by_char_id), + luabind::def("cross_zone_move_instance_by_group_id", &lua_cross_zone_move_instance_by_group_id), + luabind::def("cross_zone_move_instance_by_raid_id", &lua_cross_zone_move_instance_by_raid_id), + luabind::def("cross_zone_move_instance_by_guild_id", &lua_cross_zone_move_instance_by_guild_id), + luabind::def("cross_zone_remove_spell_by_char_id", &lua_cross_zone_remove_spell_by_char_id), + luabind::def("cross_zone_remove_spell_by_group_id", &lua_cross_zone_remove_spell_by_group_id), + luabind::def("cross_zone_remove_spell_by_raid_id", &lua_cross_zone_remove_spell_by_raid_id), + luabind::def("cross_zone_remove_spell_by_guild_id", &lua_cross_zone_remove_spell_by_guild_id), + luabind::def("cross_zone_remove_task_by_char_id", &lua_cross_zone_remove_task_by_char_id), + luabind::def("cross_zone_remove_task_by_group_id", &lua_cross_zone_remove_task_by_group_id), + luabind::def("cross_zone_remove_task_by_raid_id", &lua_cross_zone_remove_task_by_raid_id), + luabind::def("cross_zone_remove_task_by_guild_id", &lua_cross_zone_remove_task_by_guild_id), + luabind::def("cross_zone_reset_activity_by_char_id", &lua_cross_zone_reset_activity_by_char_id), + luabind::def("cross_zone_reset_activity_by_group_id", &lua_cross_zone_reset_activity_by_group_id), + luabind::def("cross_zone_reset_activity_by_raid_id", &lua_cross_zone_reset_activity_by_raid_id), + luabind::def("cross_zone_reset_activity_by_guild_id", &lua_cross_zone_reset_activity_by_guild_id), luabind::def("cross_zone_set_entity_variable_by_client_name", &lua_cross_zone_set_entity_variable_by_client_name), - luabind::def("world_wide_marquee", &lua_world_wide_marquee), + luabind::def("cross_zone_set_entity_variable_by_group_id", &lua_cross_zone_set_entity_variable_by_group_id), + luabind::def("cross_zone_set_entity_variable_by_raid_id", &lua_cross_zone_set_entity_variable_by_raid_id), + luabind::def("cross_zone_set_entity_variable_by_guild_id", &lua_cross_zone_set_entity_variable_by_guild_id), + luabind::def("cross_zone_signal_client_by_char_id", &lua_cross_zone_signal_client_by_char_id), + luabind::def("cross_zone_signal_client_by_group_id", &lua_cross_zone_signal_client_by_group_id), + luabind::def("cross_zone_signal_client_by_raid_id", &lua_cross_zone_signal_client_by_raid_id), + luabind::def("cross_zone_signal_client_by_guild_id", &lua_cross_zone_signal_client_by_guild_id), + luabind::def("cross_zone_signal_client_by_name", &lua_cross_zone_signal_client_by_name), + luabind::def("cross_zone_signal_npc_by_npctype_id", &lua_cross_zone_signal_npc_by_npctype_id), + luabind::def("cross_zone_update_activity_by_char_id", (void(*)(int,uint32,int))&lua_cross_zone_update_activity_by_char_id), + luabind::def("cross_zone_update_activity_by_char_id", (void(*)(int,uint32,int,int))&lua_cross_zone_update_activity_by_char_id), + luabind::def("cross_zone_update_activity_by_group_id", (void(*)(int,uint32,int))&lua_cross_zone_update_activity_by_group_id), + luabind::def("cross_zone_update_activity_by_group_id", (void(*)(int,uint32,int,int))&lua_cross_zone_update_activity_by_group_id), + luabind::def("cross_zone_update_activity_by_raid_id", (void(*)(int,uint32,int))&lua_cross_zone_update_activity_by_raid_id), + luabind::def("cross_zone_update_activity_by_raid_id", (void(*)(int,uint32,int,int))&lua_cross_zone_update_activity_by_raid_id), + luabind::def("cross_zone_update_activity_by_guild_id", (void(*)(int,uint32,int))&lua_cross_zone_update_activity_by_guild_id), + luabind::def("cross_zone_update_activity_by_guild_id", (void(*)(int,uint32,int,int))&lua_cross_zone_update_activity_by_guild_id), + luabind::def("world_wide_assign_task", (void(*)(uint32))&lua_world_wide_assign_task), + luabind::def("world_wide_assign_task", (void(*)(uint32,bool))&lua_world_wide_assign_task), + luabind::def("world_wide_assign_task", (void(*)(uint32,bool,uint8))&lua_world_wide_assign_task), + luabind::def("world_wide_assign_task", (void(*)(uint32,bool,uint8,uint8))&lua_world_wide_assign_task), + luabind::def("world_wide_cast_spell", (void(*)(uint32))&lua_world_wide_cast_spell), + luabind::def("world_wide_cast_spell", (void(*)(uint32,uint8))&lua_world_wide_cast_spell), + luabind::def("world_wide_cast_spell", (void(*)(uint32,uint8,uint8))&lua_world_wide_cast_spell), + luabind::def("world_wide_disable_task", (void(*)(uint32))&lua_world_wide_disable_task), + luabind::def("world_wide_disable_task", (void(*)(uint32,uint8))&lua_world_wide_disable_task), + luabind::def("world_wide_disable_task", (void(*)(uint32,uint8,uint8))&lua_world_wide_disable_task), + luabind::def("world_wide_enable_task", (void(*)(uint32))&lua_world_wide_enable_task), + luabind::def("world_wide_enable_task", (void(*)(uint32,uint8))&lua_world_wide_enable_task), + luabind::def("world_wide_enable_task", (void(*)(uint32,uint8,uint8))&lua_world_wide_enable_task), + luabind::def("world_wide_fail_task", (void(*)(uint32))&lua_world_wide_fail_task), + luabind::def("world_wide_fail_task", (void(*)(uint32,uint8))&lua_world_wide_fail_task), + luabind::def("world_wide_fail_task", (void(*)(uint32,uint8,uint8))&lua_world_wide_fail_task), + luabind::def("world_wide_marquee", (void(*)(uint32,uint32,uint32,uint32,uint32,const char*))&lua_world_wide_marquee), + luabind::def("world_wide_marquee", (void(*)(uint32,uint32,uint32,uint32,uint32,const char*,uint8))&lua_world_wide_marquee), + luabind::def("world_wide_marquee", (void(*)(uint32,uint32,uint32,uint32,uint32,const char*,uint8,uint8))&lua_world_wide_marquee), + luabind::def("world_wide_message", (void(*)(uint32,const char*))&lua_world_wide_message), + luabind::def("world_wide_message", (void(*)(uint32,const char*,uint8))&lua_world_wide_message), + luabind::def("world_wide_message", (void(*)(uint32,const char*,uint8,uint8))&lua_world_wide_message), + luabind::def("world_wide_move", (void(*)(const char*))&lua_world_wide_move), + luabind::def("world_wide_move", (void(*)(const char*,uint8))&lua_world_wide_move), + luabind::def("world_wide_move", (void(*)(const char*,uint8,uint8))&lua_world_wide_move), + luabind::def("world_wide_move_instance", (void(*)(uint16))&lua_world_wide_move_instance), + luabind::def("world_wide_move_instance", (void(*)(uint16,uint8))&lua_world_wide_move_instance), + luabind::def("world_wide_move_instance", (void(*)(uint16,uint8,uint8))&lua_world_wide_move_instance), + luabind::def("world_wide_remove_spell", (void(*)(uint32))&lua_world_wide_remove_spell), + luabind::def("world_wide_remove_spell", (void(*)(uint32,uint8))&lua_world_wide_remove_spell), + luabind::def("world_wide_remove_spell", (void(*)(uint32,uint8,uint8))&lua_world_wide_remove_spell), + luabind::def("world_wide_remove_task", (void(*)(uint32))&lua_world_wide_remove_task), + luabind::def("world_wide_remove_task", (void(*)(uint32,uint8))&lua_world_wide_remove_task), + luabind::def("world_wide_remove_task", (void(*)(uint32,uint8,uint8))&lua_world_wide_remove_task), + luabind::def("world_wide_reset_activity", (void(*)(uint32,int))&lua_world_wide_reset_activity), + luabind::def("world_wide_reset_activity", (void(*)(uint32,int,uint8))&lua_world_wide_reset_activity), + luabind::def("world_wide_reset_activity", (void(*)(uint32,int,uint8,uint8))&lua_world_wide_reset_activity), + luabind::def("world_wide_set_entity_variable_client", (void(*)(const char*,const char*))&lua_world_wide_set_entity_variable_client), + luabind::def("world_wide_set_entity_variable_client", (void(*)(const char*,const char*,uint8))&lua_world_wide_set_entity_variable_client), + luabind::def("world_wide_set_entity_variable_client", (void(*)(const char*,const char*,uint8,uint8))&lua_world_wide_set_entity_variable_client), + luabind::def("world_wide_set_entity_variable_npc", &lua_world_wide_set_entity_variable_npc), + luabind::def("world_wide_signal_client", (void(*)(uint32))&lua_world_wide_signal_client), + luabind::def("world_wide_signal_client", (void(*)(uint32,uint8))&lua_world_wide_signal_client), + luabind::def("world_wide_signal_client", (void(*)(uint32,uint8,uint8))&lua_world_wide_signal_client), + luabind::def("world_wide_signal_npc", &lua_world_wide_signal_npc), + luabind::def("world_wide_update_activity", (void(*)(uint32,int))&lua_world_wide_update_activity), + luabind::def("world_wide_update_activity", (void(*)(uint32,int,int))&lua_world_wide_update_activity), + luabind::def("world_wide_update_activity", (void(*)(uint32,int,int,uint8))&lua_world_wide_update_activity), + luabind::def("world_wide_update_activity", (void(*)(uint32,int,int,uint8,uint8))&lua_world_wide_update_activity), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC,Lua_Client))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_Client))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*))&lua_get_qglobals), luabind::def("get_entity_list", &lua_get_entity_list), + luabind::def("zone", &lua_zone), + luabind::def("zone_group", &lua_zone_group), + luabind::def("zone_raid", &lua_zone_raid), luabind::def("get_zone_id", &lua_get_zone_id), + luabind::def("get_zone_id_by_name", &lua_get_zone_id_by_name), luabind::def("get_zone_long_name", &lua_get_zone_long_name), + luabind::def("get_zone_long_name_by_name", &lua_get_zone_long_name_by_name), + luabind::def("get_zone_long_name_by_id", &lua_get_zone_long_name_by_id), luabind::def("get_zone_short_name", &lua_get_zone_short_name), + luabind::def("get_zone_short_name_by_id", &lua_get_zone_short_name_by_id), luabind::def("get_zone_instance_id", &lua_get_zone_instance_id), luabind::def("get_zone_instance_version", &lua_get_zone_instance_version), luabind::def("get_zone_weather", &lua_get_zone_weather), @@ -1806,12 +2886,98 @@ luabind::scope lua_register_general() { luabind::def("disable_recipe", &lua_disable_recipe), luabind::def("clear_npctype_cache", &lua_clear_npctype_cache), luabind::def("reloadzonestaticdata", &lua_reloadzonestaticdata), + luabind::def("update_zone_header", &lua_update_zone_header), luabind::def("clock", &lua_clock), luabind::def("create_npc", &lua_create_npc), luabind::def("log", (void(*)(int, std::string))&lua_log), luabind::def("debug", (void(*)(std::string))&lua_debug), luabind::def("debug", (void(*)(std::string, int))&lua_debug), - luabind::def("log_combat", (void(*)(std::string))&lua_log_combat) + luabind::def("log_combat", (void(*)(std::string))&lua_log_combat), + luabind::def("seconds_to_time", &lua_seconds_to_time), + luabind::def("get_hex_color_code", &lua_get_hex_color_code), + luabind::def("get_aa_exp_modifier_by_char_id", &lua_get_aa_exp_modifier_by_char_id), + luabind::def("get_exp_modifier_by_char_id", &lua_get_exp_modifier_by_char_id), + luabind::def("set_aa_exp_modifier_by_char_id", &lua_set_aa_exp_modifier_by_char_id), + luabind::def("set_exp_modifier_by_char_id", &lua_set_exp_modifier_by_char_id), + + /** + * Expansions + */ + luabind::def("is_classic_enabled", &lua_is_classic_enabled), + luabind::def("is_the_ruins_of_kunark_enabled", &lua_is_the_ruins_of_kunark_enabled), + luabind::def("is_the_scars_of_velious_enabled", &lua_is_the_scars_of_velious_enabled), + luabind::def("is_the_shadows_of_luclin_enabled", &lua_is_the_shadows_of_luclin_enabled), + luabind::def("is_the_planes_of_power_enabled", &lua_is_the_planes_of_power_enabled), + luabind::def("is_the_legacy_of_ykesha_enabled", &lua_is_the_legacy_of_ykesha_enabled), + luabind::def("is_lost_dungeons_of_norrath_enabled", &lua_is_lost_dungeons_of_norrath_enabled), + luabind::def("is_gates_of_discord_enabled", &lua_is_gates_of_discord_enabled), + luabind::def("is_omens_of_war_enabled", &lua_is_omens_of_war_enabled), + luabind::def("is_dragons_of_norrath_enabled", &lua_is_dragons_of_norrath_enabled), + luabind::def("is_depths_of_darkhollow_enabled", &lua_is_depths_of_darkhollow_enabled), + luabind::def("is_prophecy_of_ro_enabled", &lua_is_prophecy_of_ro_enabled), + luabind::def("is_the_serpents_spine_enabled", &lua_is_the_serpents_spine_enabled), + luabind::def("is_the_buried_sea_enabled", &lua_is_the_buried_sea_enabled), + luabind::def("is_secrets_of_faydwer_enabled", &lua_is_secrets_of_faydwer_enabled), + luabind::def("is_seeds_of_destruction_enabled", &lua_is_seeds_of_destruction_enabled), + luabind::def("is_underfoot_enabled", &lua_is_underfoot_enabled), + luabind::def("is_house_of_thule_enabled", &lua_is_house_of_thule_enabled), + luabind::def("is_veil_of_alaris_enabled", &lua_is_veil_of_alaris_enabled), + luabind::def("is_rain_of_fear_enabled", &lua_is_rain_of_fear_enabled), + luabind::def("is_call_of_the_forsaken_enabled", &lua_is_call_of_the_forsaken_enabled), + luabind::def("is_the_darkend_sea_enabled", &lua_is_the_darkend_sea_enabled), + luabind::def("is_the_broken_mirror_enabled", &lua_is_the_broken_mirror_enabled), + luabind::def("is_empires_of_kunark_enabled", &lua_is_empires_of_kunark_enabled), + luabind::def("is_ring_of_scale_enabled", &lua_is_ring_of_scale_enabled), + luabind::def("is_the_burning_lands_enabled", &lua_is_the_burning_lands_enabled), + luabind::def("is_torment_of_velious_enabled", &lua_is_torment_of_velious_enabled), + luabind::def("is_current_expansion_classic", &lua_is_current_expansion_classic), + luabind::def("is_current_expansion_the_ruins_of_kunark", &lua_is_current_expansion_the_ruins_of_kunark), + luabind::def("is_current_expansion_the_scars_of_velious", &lua_is_current_expansion_the_scars_of_velious), + luabind::def("is_current_expansion_the_shadows_of_luclin", &lua_is_current_expansion_the_shadows_of_luclin), + luabind::def("is_current_expansion_the_planes_of_power", &lua_is_current_expansion_the_planes_of_power), + luabind::def("is_current_expansion_the_legacy_of_ykesha", &lua_is_current_expansion_the_legacy_of_ykesha), + luabind::def("is_current_expansion_lost_dungeons_of_norrath", &lua_is_current_expansion_lost_dungeons_of_norrath), + luabind::def("is_current_expansion_gates_of_discord", &lua_is_current_expansion_gates_of_discord), + luabind::def("is_current_expansion_omens_of_war", &lua_is_current_expansion_omens_of_war), + luabind::def("is_current_expansion_dragons_of_norrath", &lua_is_current_expansion_dragons_of_norrath), + luabind::def("is_current_expansion_depths_of_darkhollow", &lua_is_current_expansion_depths_of_darkhollow), + luabind::def("is_current_expansion_prophecy_of_ro", &lua_is_current_expansion_prophecy_of_ro), + luabind::def("is_current_expansion_the_serpents_spine", &lua_is_current_expansion_the_serpents_spine), + luabind::def("is_current_expansion_the_buried_sea", &lua_is_current_expansion_the_buried_sea), + luabind::def("is_current_expansion_secrets_of_faydwer", &lua_is_current_expansion_secrets_of_faydwer), + luabind::def("is_current_expansion_seeds_of_destruction", &lua_is_current_expansion_seeds_of_destruction), + luabind::def("is_current_expansion_underfoot", &lua_is_current_expansion_underfoot), + luabind::def("is_current_expansion_house_of_thule", &lua_is_current_expansion_house_of_thule), + luabind::def("is_current_expansion_veil_of_alaris", &lua_is_current_expansion_veil_of_alaris), + luabind::def("is_current_expansion_rain_of_fear", &lua_is_current_expansion_rain_of_fear), + luabind::def("is_current_expansion_call_of_the_forsaken", &lua_is_current_expansion_call_of_the_forsaken), + luabind::def("is_current_expansion_the_darkend_sea", &lua_is_current_expansion_the_darkend_sea), + luabind::def("is_current_expansion_the_broken_mirror", &lua_is_current_expansion_the_broken_mirror), + luabind::def("is_current_expansion_empires_of_kunark", &lua_is_current_expansion_empires_of_kunark), + luabind::def("is_current_expansion_ring_of_scale", &lua_is_current_expansion_ring_of_scale), + luabind::def("is_current_expansion_the_burning_lands", &lua_is_current_expansion_the_burning_lands), + luabind::def("is_current_expansion_torment_of_velious", &lua_is_current_expansion_torment_of_velious), + + /** + * Content flags + */ + luabind::def("is_content_flag_enabled", (bool(*)(std::string))&lua_is_content_flag_enabled), + luabind::def("set_content_flag", (void(*)(std::string, bool))&lua_set_content_flag), + + luabind::def("get_expedition", &lua_get_expedition), + luabind::def("get_expedition_by_char_id", &lua_get_expedition_by_char_id), + luabind::def("get_expedition_by_dz_id", &lua_get_expedition_by_dz_id), + luabind::def("get_expedition_by_zone_instance", &lua_get_expedition_by_zone_instance), + luabind::def("get_expedition_lockout_by_char_id", &lua_get_expedition_lockout_by_char_id), + luabind::def("get_expedition_lockouts_by_char_id", (luabind::object(*)(lua_State*, uint32))&lua_get_expedition_lockouts_by_char_id), + luabind::def("get_expedition_lockouts_by_char_id", (luabind::object(*)(lua_State*, uint32, std::string))&lua_get_expedition_lockouts_by_char_id), + luabind::def("add_expedition_lockout_all_clients", (void(*)(std::string, std::string, uint32))&lua_add_expedition_lockout_all_clients), + luabind::def("add_expedition_lockout_all_clients", (void(*)(std::string, std::string, uint32, std::string))&lua_add_expedition_lockout_all_clients), + luabind::def("add_expedition_lockout_by_char_id", (void(*)(uint32, std::string, std::string, uint32))&lua_add_expedition_lockout_by_char_id), + luabind::def("add_expedition_lockout_by_char_id", (void(*)(uint32, std::string, std::string, uint32, std::string))&lua_add_expedition_lockout_by_char_id), + luabind::def("remove_expedition_lockout_by_char_id", &lua_remove_expedition_lockout_by_char_id), + luabind::def("remove_all_expedition_lockouts_by_char_id", (void(*)(uint32))&lua_remove_all_expedition_lockouts_by_char_id), + luabind::def("remove_all_expedition_lockouts_by_char_id", (void(*)(uint32, std::string))&lua_remove_all_expedition_lockouts_by_char_id) ]; } @@ -1932,95 +3098,95 @@ luabind::scope lua_register_slot() { return luabind::class_("Slot") .enum_("constants") [ - luabind::value("Charm", static_cast(EQEmu::invslot::slotCharm)), - luabind::value("Ear1", static_cast(EQEmu::invslot::slotEar1)), - luabind::value("Head", static_cast(EQEmu::invslot::slotHead)), - luabind::value("Face", static_cast(EQEmu::invslot::slotFace)), - luabind::value("Ear2", static_cast(EQEmu::invslot::slotEar2)), - luabind::value("Neck", static_cast(EQEmu::invslot::slotNeck)), - luabind::value("Shoulders", static_cast(EQEmu::invslot::slotShoulders)), - luabind::value("Arms", static_cast(EQEmu::invslot::slotArms)), - luabind::value("Back", static_cast(EQEmu::invslot::slotBack)), - luabind::value("Wrist1", static_cast(EQEmu::invslot::slotWrist1)), - luabind::value("Wrist2", static_cast(EQEmu::invslot::slotWrist2)), - luabind::value("Range", static_cast(EQEmu::invslot::slotRange)), - luabind::value("Hands", static_cast(EQEmu::invslot::slotHands)), - luabind::value("Primary", static_cast(EQEmu::invslot::slotPrimary)), - luabind::value("Secondary", static_cast(EQEmu::invslot::slotSecondary)), - luabind::value("Finger1", static_cast(EQEmu::invslot::slotFinger1)), - luabind::value("Finger2", static_cast(EQEmu::invslot::slotFinger2)), - luabind::value("Chest", static_cast(EQEmu::invslot::slotChest)), - luabind::value("Legs", static_cast(EQEmu::invslot::slotLegs)), - luabind::value("Feet", static_cast(EQEmu::invslot::slotFeet)), - luabind::value("Waist", static_cast(EQEmu::invslot::slotWaist)), - luabind::value("PowerSource", static_cast(EQEmu::invslot::slotPowerSource)), - luabind::value("Ammo", static_cast(EQEmu::invslot::slotAmmo)), - luabind::value("General1", static_cast(EQEmu::invslot::slotGeneral1)), - luabind::value("General2", static_cast(EQEmu::invslot::slotGeneral2)), - luabind::value("General3", static_cast(EQEmu::invslot::slotGeneral3)), - luabind::value("General4", static_cast(EQEmu::invslot::slotGeneral4)), - luabind::value("General5", static_cast(EQEmu::invslot::slotGeneral5)), - luabind::value("General6", static_cast(EQEmu::invslot::slotGeneral6)), - luabind::value("General7", static_cast(EQEmu::invslot::slotGeneral7)), - luabind::value("General8", static_cast(EQEmu::invslot::slotGeneral8)), - luabind::value("General9", static_cast(EQEmu::invslot::slotGeneral9)), - luabind::value("General10", static_cast(EQEmu::invslot::slotGeneral10)), - luabind::value("Cursor", static_cast(EQEmu::invslot::slotCursor)), - luabind::value("PossessionsBegin", static_cast(EQEmu::invslot::POSSESSIONS_BEGIN)), - luabind::value("PossessionsEnd", static_cast(EQEmu::invslot::POSSESSIONS_END)), - luabind::value("EquipmentBegin", static_cast(EQEmu::invslot::EQUIPMENT_BEGIN)), - luabind::value("EquipmentEnd", static_cast(EQEmu::invslot::EQUIPMENT_END)), - luabind::value("GeneralBegin", static_cast(EQEmu::invslot::GENERAL_BEGIN)), - luabind::value("GeneralEnd", static_cast(EQEmu::invslot::GENERAL_END)), - luabind::value("PossessionsBagsBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN)), - luabind::value("PossessionsBagsEnd", static_cast(EQEmu::invbag::CURSOR_BAG_END)), - luabind::value("GeneralBagsBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN)), - luabind::value("GeneralBagsEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_END)), - luabind::value("General1BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN)), - luabind::value("General1BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 9), - luabind::value("General2BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 10), - luabind::value("General2BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 19), - luabind::value("General3BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 20), - luabind::value("General3BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 29), - luabind::value("General4BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 30), - luabind::value("General4BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 39), - luabind::value("General5BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 40), - luabind::value("General5BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 49), - luabind::value("General6BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 50), - luabind::value("General6BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 59), - luabind::value("General7BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 60), - luabind::value("General7BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 69), - luabind::value("General8BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 70), - luabind::value("General8BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 79), - luabind::value("General9BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 80), - luabind::value("General9BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 89), - luabind::value("General10BagBegin", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 90), - luabind::value("General10BagEnd", static_cast(EQEmu::invbag::GENERAL_BAGS_BEGIN) + 99), - luabind::value("CursorBagBegin", static_cast(EQEmu::invbag::CURSOR_BAG_BEGIN)), - luabind::value("CursorBagEnd", static_cast(EQEmu::invbag::CURSOR_BAG_END)), - luabind::value("Tradeskill", static_cast(EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE)), - luabind::value("Augment", static_cast(EQEmu::invslot::SLOT_AUGMENT_GENERIC_RETURN)), - luabind::value("BankBegin", static_cast(EQEmu::invslot::BANK_BEGIN)), - luabind::value("BankEnd", static_cast(EQEmu::invslot::BANK_END)), - luabind::value("BankBagsBegin", static_cast(EQEmu::invbag::BANK_BAGS_BEGIN)), - luabind::value("BankBagsEnd", static_cast(EQEmu::invbag::BANK_BAGS_END)), - luabind::value("SharedBankBegin", static_cast(EQEmu::invslot::SHARED_BANK_BEGIN)), - luabind::value("SharedBankEnd", static_cast(EQEmu::invslot::SHARED_BANK_END)), - luabind::value("SharedBankBagsBegin", static_cast(EQEmu::invbag::SHARED_BANK_BAGS_BEGIN)), - luabind::value("SharedBankBagsEnd", static_cast(EQEmu::invbag::SHARED_BANK_BAGS_END)), - luabind::value("BagSlotBegin", static_cast(EQEmu::invbag::SLOT_BEGIN)), - luabind::value("BagSlotEnd", static_cast(EQEmu::invbag::SLOT_END)), - luabind::value("AugSocketBegin", static_cast(EQEmu::invaug::SOCKET_BEGIN)), - luabind::value("AugSocketEnd", static_cast(EQEmu::invaug::SOCKET_END)), - luabind::value("Invalid", static_cast(EQEmu::invslot::SLOT_INVALID)), + luabind::value("Charm", static_cast(EQ::invslot::slotCharm)), + luabind::value("Ear1", static_cast(EQ::invslot::slotEar1)), + luabind::value("Head", static_cast(EQ::invslot::slotHead)), + luabind::value("Face", static_cast(EQ::invslot::slotFace)), + luabind::value("Ear2", static_cast(EQ::invslot::slotEar2)), + luabind::value("Neck", static_cast(EQ::invslot::slotNeck)), + luabind::value("Shoulders", static_cast(EQ::invslot::slotShoulders)), + luabind::value("Arms", static_cast(EQ::invslot::slotArms)), + luabind::value("Back", static_cast(EQ::invslot::slotBack)), + luabind::value("Wrist1", static_cast(EQ::invslot::slotWrist1)), + luabind::value("Wrist2", static_cast(EQ::invslot::slotWrist2)), + luabind::value("Range", static_cast(EQ::invslot::slotRange)), + luabind::value("Hands", static_cast(EQ::invslot::slotHands)), + luabind::value("Primary", static_cast(EQ::invslot::slotPrimary)), + luabind::value("Secondary", static_cast(EQ::invslot::slotSecondary)), + luabind::value("Finger1", static_cast(EQ::invslot::slotFinger1)), + luabind::value("Finger2", static_cast(EQ::invslot::slotFinger2)), + luabind::value("Chest", static_cast(EQ::invslot::slotChest)), + luabind::value("Legs", static_cast(EQ::invslot::slotLegs)), + luabind::value("Feet", static_cast(EQ::invslot::slotFeet)), + luabind::value("Waist", static_cast(EQ::invslot::slotWaist)), + luabind::value("PowerSource", static_cast(EQ::invslot::slotPowerSource)), + luabind::value("Ammo", static_cast(EQ::invslot::slotAmmo)), + luabind::value("General1", static_cast(EQ::invslot::slotGeneral1)), + luabind::value("General2", static_cast(EQ::invslot::slotGeneral2)), + luabind::value("General3", static_cast(EQ::invslot::slotGeneral3)), + luabind::value("General4", static_cast(EQ::invslot::slotGeneral4)), + luabind::value("General5", static_cast(EQ::invslot::slotGeneral5)), + luabind::value("General6", static_cast(EQ::invslot::slotGeneral6)), + luabind::value("General7", static_cast(EQ::invslot::slotGeneral7)), + luabind::value("General8", static_cast(EQ::invslot::slotGeneral8)), + luabind::value("General9", static_cast(EQ::invslot::slotGeneral9)), + luabind::value("General10", static_cast(EQ::invslot::slotGeneral10)), + luabind::value("Cursor", static_cast(EQ::invslot::slotCursor)), + luabind::value("PossessionsBegin", static_cast(EQ::invslot::POSSESSIONS_BEGIN)), + luabind::value("PossessionsEnd", static_cast(EQ::invslot::POSSESSIONS_END)), + luabind::value("EquipmentBegin", static_cast(EQ::invslot::EQUIPMENT_BEGIN)), + luabind::value("EquipmentEnd", static_cast(EQ::invslot::EQUIPMENT_END)), + luabind::value("GeneralBegin", static_cast(EQ::invslot::GENERAL_BEGIN)), + luabind::value("GeneralEnd", static_cast(EQ::invslot::GENERAL_END)), + luabind::value("PossessionsBagsBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN)), + luabind::value("PossessionsBagsEnd", static_cast(EQ::invbag::CURSOR_BAG_END)), + luabind::value("GeneralBagsBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN)), + luabind::value("GeneralBagsEnd", static_cast(EQ::invbag::GENERAL_BAGS_END)), + luabind::value("General1BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN)), + luabind::value("General1BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 9), + luabind::value("General2BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 10), + luabind::value("General2BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 19), + luabind::value("General3BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 20), + luabind::value("General3BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 29), + luabind::value("General4BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 30), + luabind::value("General4BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 39), + luabind::value("General5BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 40), + luabind::value("General5BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 49), + luabind::value("General6BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 50), + luabind::value("General6BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 59), + luabind::value("General7BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 60), + luabind::value("General7BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 69), + luabind::value("General8BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 70), + luabind::value("General8BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 79), + luabind::value("General9BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 80), + luabind::value("General9BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 89), + luabind::value("General10BagBegin", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 90), + luabind::value("General10BagEnd", static_cast(EQ::invbag::GENERAL_BAGS_BEGIN) + 99), + luabind::value("CursorBagBegin", static_cast(EQ::invbag::CURSOR_BAG_BEGIN)), + luabind::value("CursorBagEnd", static_cast(EQ::invbag::CURSOR_BAG_END)), + luabind::value("Tradeskill", static_cast(EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE)), + luabind::value("Augment", static_cast(EQ::invslot::SLOT_AUGMENT_GENERIC_RETURN)), + luabind::value("BankBegin", static_cast(EQ::invslot::BANK_BEGIN)), + luabind::value("BankEnd", static_cast(EQ::invslot::BANK_END)), + luabind::value("BankBagsBegin", static_cast(EQ::invbag::BANK_BAGS_BEGIN)), + luabind::value("BankBagsEnd", static_cast(EQ::invbag::BANK_BAGS_END)), + luabind::value("SharedBankBegin", static_cast(EQ::invslot::SHARED_BANK_BEGIN)), + luabind::value("SharedBankEnd", static_cast(EQ::invslot::SHARED_BANK_END)), + luabind::value("SharedBankBagsBegin", static_cast(EQ::invbag::SHARED_BANK_BAGS_BEGIN)), + luabind::value("SharedBankBagsEnd", static_cast(EQ::invbag::SHARED_BANK_BAGS_END)), + luabind::value("BagSlotBegin", static_cast(EQ::invbag::SLOT_BEGIN)), + luabind::value("BagSlotEnd", static_cast(EQ::invbag::SLOT_END)), + luabind::value("AugSocketBegin", static_cast(EQ::invaug::SOCKET_BEGIN)), + luabind::value("AugSocketEnd", static_cast(EQ::invaug::SOCKET_END)), + luabind::value("Invalid", static_cast(EQ::invslot::SLOT_INVALID)), - luabind::value("Shoulder", static_cast(EQEmu::invslot::slotShoulders)), // deprecated - luabind::value("Bracer1", static_cast(EQEmu::invslot::slotWrist1)), // deprecated - luabind::value("Bracer2", static_cast(EQEmu::invslot::slotWrist2)), // deprecated - luabind::value("Ring1", static_cast(EQEmu::invslot::slotFinger1)), // deprecated - luabind::value("Ring2", static_cast(EQEmu::invslot::slotFinger2)), // deprecated - luabind::value("PersonalBegin", static_cast(EQEmu::invslot::GENERAL_BEGIN)), // deprecated - luabind::value("PersonalEnd", static_cast(EQEmu::invslot::GENERAL_END)), // deprecated + luabind::value("Shoulder", static_cast(EQ::invslot::slotShoulders)), // deprecated + luabind::value("Bracer1", static_cast(EQ::invslot::slotWrist1)), // deprecated + luabind::value("Bracer2", static_cast(EQ::invslot::slotWrist2)), // deprecated + luabind::value("Ring1", static_cast(EQ::invslot::slotFinger1)), // deprecated + luabind::value("Ring2", static_cast(EQ::invslot::slotFinger2)), // deprecated + luabind::value("PersonalBegin", static_cast(EQ::invslot::GENERAL_BEGIN)), // deprecated + luabind::value("PersonalEnd", static_cast(EQ::invslot::GENERAL_END)), // deprecated luabind::value("CursorEnd", 0xFFFE) // deprecated (not in use..and never valid vis-a-vis client behavior) ]; } @@ -2029,20 +3195,20 @@ luabind::scope lua_register_material() { return luabind::class_("Material") .enum_("constants") [ - luabind::value("Head", static_cast(EQEmu::textures::armorHead)), - luabind::value("Chest", static_cast(EQEmu::textures::armorChest)), - luabind::value("Arms", static_cast(EQEmu::textures::armorArms)), - luabind::value("Wrist", static_cast(EQEmu::textures::armorWrist)), - luabind::value("Hands", static_cast(EQEmu::textures::armorHands)), - luabind::value("Legs", static_cast(EQEmu::textures::armorLegs)), - luabind::value("Feet", static_cast(EQEmu::textures::armorFeet)), - luabind::value("Primary", static_cast(EQEmu::textures::weaponPrimary)), - luabind::value("Secondary", static_cast(EQEmu::textures::weaponSecondary)), - luabind::value("Count", static_cast(EQEmu::textures::materialCount)), - luabind::value("Invalid", static_cast(EQEmu::textures::materialInvalid)), + luabind::value("Head", static_cast(EQ::textures::armorHead)), + luabind::value("Chest", static_cast(EQ::textures::armorChest)), + luabind::value("Arms", static_cast(EQ::textures::armorArms)), + luabind::value("Wrist", static_cast(EQ::textures::armorWrist)), + luabind::value("Hands", static_cast(EQ::textures::armorHands)), + luabind::value("Legs", static_cast(EQ::textures::armorLegs)), + luabind::value("Feet", static_cast(EQ::textures::armorFeet)), + luabind::value("Primary", static_cast(EQ::textures::weaponPrimary)), + luabind::value("Secondary", static_cast(EQ::textures::weaponSecondary)), + luabind::value("Count", static_cast(EQ::textures::materialCount)), + luabind::value("Invalid", static_cast(EQ::textures::materialInvalid)), - luabind::value("Bracer", static_cast(EQEmu::textures::armorWrist)), // deprecated - luabind::value("Max", static_cast(EQEmu::textures::materialCount)) // deprecated + luabind::value("Bracer", static_cast(EQ::textures::armorWrist)), // deprecated + luabind::value("Max", static_cast(EQ::textures::materialCount)) // deprecated ]; } @@ -2050,14 +3216,14 @@ luabind::scope lua_register_client_version() { return luabind::class_("ClientVersion") .enum_("constants") [ - luabind::value("Unknown", static_cast(EQEmu::versions::ClientVersion::Unknown)), - luabind::value("Titanium", static_cast(EQEmu::versions::ClientVersion::Titanium)), - luabind::value("SoF", static_cast(EQEmu::versions::ClientVersion::SoF)), - luabind::value("SoD", static_cast(EQEmu::versions::ClientVersion::SoD)), - luabind::value("Underfoot", static_cast(EQEmu::versions::ClientVersion::UF)), // deprecated - luabind::value("UF", static_cast(EQEmu::versions::ClientVersion::UF)), - luabind::value("RoF", static_cast(EQEmu::versions::ClientVersion::RoF)), - luabind::value("RoF2", static_cast(EQEmu::versions::ClientVersion::RoF2)) + luabind::value("Unknown", static_cast(EQ::versions::ClientVersion::Unknown)), + luabind::value("Titanium", static_cast(EQ::versions::ClientVersion::Titanium)), + luabind::value("SoF", static_cast(EQ::versions::ClientVersion::SoF)), + luabind::value("SoD", static_cast(EQ::versions::ClientVersion::SoD)), + luabind::value("Underfoot", static_cast(EQ::versions::ClientVersion::UF)), // deprecated + luabind::value("UF", static_cast(EQ::versions::ClientVersion::UF)), + luabind::value("RoF", static_cast(EQ::versions::ClientVersion::RoF)), + luabind::value("RoF2", static_cast(EQ::versions::ClientVersion::RoF2)) ]; } @@ -2130,86 +3296,92 @@ luabind::scope lua_register_skills() { return luabind::class_("Skill") .enum_("constants") [ - luabind::value("1HBlunt", EQEmu::skills::Skill1HBlunt), - luabind::value("1HSlashing", EQEmu::skills::Skill1HSlashing), - luabind::value("2HBlunt", EQEmu::skills::Skill2HBlunt), - luabind::value("2HSlashing", EQEmu::skills::Skill2HSlashing), - luabind::value("Abjuration", EQEmu::skills::SkillAbjuration), - luabind::value("Alteration", EQEmu::skills::SkillAlteration), - luabind::value("ApplyPoison", EQEmu::skills::SkillApplyPoison), - luabind::value("Archery", EQEmu::skills::SkillArchery), - luabind::value("Backstab", EQEmu::skills::SkillBackstab), - luabind::value("BindWound", EQEmu::skills::SkillBindWound), - luabind::value("Bash", EQEmu::skills::SkillBash), - luabind::value("Block", EQEmu::skills::SkillBlock), - luabind::value("BrassInstruments", EQEmu::skills::SkillBrassInstruments), - luabind::value("Channeling", EQEmu::skills::SkillChanneling), - luabind::value("Conjuration", EQEmu::skills::SkillConjuration), - luabind::value("Defense", EQEmu::skills::SkillDefense), - luabind::value("Disarm", EQEmu::skills::SkillDisarm), - luabind::value("DisarmTraps", EQEmu::skills::SkillDisarmTraps), - luabind::value("Divination", EQEmu::skills::SkillDivination), - luabind::value("Dodge", EQEmu::skills::SkillDodge), - luabind::value("DoubleAttack", EQEmu::skills::SkillDoubleAttack), - luabind::value("DragonPunch", EQEmu::skills::SkillDragonPunch), - luabind::value("TailRake", EQEmu::skills::SkillTailRake), - luabind::value("DualWield", EQEmu::skills::SkillDualWield), - luabind::value("EagleStrike", EQEmu::skills::SkillEagleStrike), - luabind::value("Evocation", EQEmu::skills::SkillEvocation), - luabind::value("FeignDeath", EQEmu::skills::SkillFeignDeath), - luabind::value("FlyingKick", EQEmu::skills::SkillFlyingKick), - luabind::value("Forage", EQEmu::skills::SkillForage), - luabind::value("HandtoHand", EQEmu::skills::SkillHandtoHand), - luabind::value("Hide", EQEmu::skills::SkillHide), - luabind::value("Kick", EQEmu::skills::SkillKick), - luabind::value("Meditate", EQEmu::skills::SkillMeditate), - luabind::value("Mend", EQEmu::skills::SkillMend), - luabind::value("Offense", EQEmu::skills::SkillOffense), - luabind::value("Parry", EQEmu::skills::SkillParry), - luabind::value("PickLock", EQEmu::skills::SkillPickLock), - luabind::value("1HPiercing", EQEmu::skills::Skill1HPiercing), - luabind::value("Riposte", EQEmu::skills::SkillRiposte), - luabind::value("RoundKick", EQEmu::skills::SkillRoundKick), - luabind::value("SafeFall", EQEmu::skills::SkillSafeFall), - luabind::value("SenseHeading", EQEmu::skills::SkillSenseHeading), - luabind::value("Singing", EQEmu::skills::SkillSinging), - luabind::value("Sneak", EQEmu::skills::SkillSneak), - luabind::value("SpecializeAbjure", EQEmu::skills::SkillSpecializeAbjure), - luabind::value("SpecializeAlteration", EQEmu::skills::SkillSpecializeAlteration), - luabind::value("SpecializeConjuration", EQEmu::skills::SkillSpecializeConjuration), - luabind::value("SpecializeDivination", EQEmu::skills::SkillSpecializeDivination), - luabind::value("SpecializeEvocation", EQEmu::skills::SkillSpecializeEvocation), - luabind::value("PickPockets", EQEmu::skills::SkillPickPockets), - luabind::value("StringedInstruments", EQEmu::skills::SkillStringedInstruments), - luabind::value("Swimming", EQEmu::skills::SkillSwimming), - luabind::value("Throwing", EQEmu::skills::SkillThrowing), - luabind::value("TigerClaw", EQEmu::skills::SkillTigerClaw), - luabind::value("Tracking", EQEmu::skills::SkillTracking), - luabind::value("WindInstruments", EQEmu::skills::SkillWindInstruments), - luabind::value("Fishing", EQEmu::skills::SkillFishing), - luabind::value("MakePoison", EQEmu::skills::SkillMakePoison), - luabind::value("Tinkering", EQEmu::skills::SkillTinkering), - luabind::value("Research", EQEmu::skills::SkillResearch), - luabind::value("Alchemy", EQEmu::skills::SkillAlchemy), - luabind::value("Baking", EQEmu::skills::SkillBaking), - luabind::value("Tailoring", EQEmu::skills::SkillTailoring), - luabind::value("SenseTraps", EQEmu::skills::SkillSenseTraps), - luabind::value("Blacksmithing", EQEmu::skills::SkillBlacksmithing), - luabind::value("Fletching", EQEmu::skills::SkillFletching), - luabind::value("Brewing", EQEmu::skills::SkillBrewing), - luabind::value("AlcoholTolerance", EQEmu::skills::SkillAlcoholTolerance), - luabind::value("Begging", EQEmu::skills::SkillBegging), - luabind::value("JewelryMaking", EQEmu::skills::SkillJewelryMaking), - luabind::value("Pottery", EQEmu::skills::SkillPottery), - luabind::value("PercussionInstruments", EQEmu::skills::SkillPercussionInstruments), - luabind::value("Intimidation", EQEmu::skills::SkillIntimidation), - luabind::value("Berserking", EQEmu::skills::SkillBerserking), - luabind::value("Taunt", EQEmu::skills::SkillTaunt), - luabind::value("Frenzy", EQEmu::skills::SkillFrenzy), - luabind::value("RemoveTraps", EQEmu::skills::SkillRemoveTraps), - luabind::value("TripleAttack", EQEmu::skills::SkillTripleAttack), - luabind::value("2HPiercing", EQEmu::skills::Skill2HPiercing), - luabind::value("HIGHEST_SKILL", EQEmu::skills::HIGHEST_SKILL) + luabind::value("1HBlunt", EQ::skills::Skill1HBlunt), + luabind::value("Blunt1H", EQ::skills::Skill1HBlunt), + luabind::value("1HSlashing", EQ::skills::Skill1HSlashing), + luabind::value("Slashing1H", EQ::skills::Skill1HSlashing), + luabind::value("2HBlunt", EQ::skills::Skill2HBlunt), + luabind::value("Blunt2H", EQ::skills::Skill2HBlunt), + luabind::value("2HSlashing", EQ::skills::Skill2HSlashing), + luabind::value("Slashing2H", EQ::skills::Skill2HSlashing), + luabind::value("Abjuration", EQ::skills::SkillAbjuration), + luabind::value("Alteration", EQ::skills::SkillAlteration), + luabind::value("ApplyPoison", EQ::skills::SkillApplyPoison), + luabind::value("Archery", EQ::skills::SkillArchery), + luabind::value("Backstab", EQ::skills::SkillBackstab), + luabind::value("BindWound", EQ::skills::SkillBindWound), + luabind::value("Bash", EQ::skills::SkillBash), + luabind::value("Block", EQ::skills::SkillBlock), + luabind::value("BrassInstruments", EQ::skills::SkillBrassInstruments), + luabind::value("Channeling", EQ::skills::SkillChanneling), + luabind::value("Conjuration", EQ::skills::SkillConjuration), + luabind::value("Defense", EQ::skills::SkillDefense), + luabind::value("Disarm", EQ::skills::SkillDisarm), + luabind::value("DisarmTraps", EQ::skills::SkillDisarmTraps), + luabind::value("Divination", EQ::skills::SkillDivination), + luabind::value("Dodge", EQ::skills::SkillDodge), + luabind::value("DoubleAttack", EQ::skills::SkillDoubleAttack), + luabind::value("DragonPunch", EQ::skills::SkillDragonPunch), + luabind::value("TailRake", EQ::skills::SkillTailRake), + luabind::value("DualWield", EQ::skills::SkillDualWield), + luabind::value("EagleStrike", EQ::skills::SkillEagleStrike), + luabind::value("Evocation", EQ::skills::SkillEvocation), + luabind::value("FeignDeath", EQ::skills::SkillFeignDeath), + luabind::value("FlyingKick", EQ::skills::SkillFlyingKick), + luabind::value("Forage", EQ::skills::SkillForage), + luabind::value("HandtoHand", EQ::skills::SkillHandtoHand), + luabind::value("Hide", EQ::skills::SkillHide), + luabind::value("Kick", EQ::skills::SkillKick), + luabind::value("Meditate", EQ::skills::SkillMeditate), + luabind::value("Mend", EQ::skills::SkillMend), + luabind::value("Offense", EQ::skills::SkillOffense), + luabind::value("Parry", EQ::skills::SkillParry), + luabind::value("PickLock", EQ::skills::SkillPickLock), + luabind::value("1HPiercing", EQ::skills::Skill1HPiercing), + luabind::value("Piercing1H", EQ::skills::Skill1HPiercing), + luabind::value("Riposte", EQ::skills::SkillRiposte), + luabind::value("RoundKick", EQ::skills::SkillRoundKick), + luabind::value("SafeFall", EQ::skills::SkillSafeFall), + luabind::value("SenseHeading", EQ::skills::SkillSenseHeading), + luabind::value("Singing", EQ::skills::SkillSinging), + luabind::value("Sneak", EQ::skills::SkillSneak), + luabind::value("SpecializeAbjure", EQ::skills::SkillSpecializeAbjure), + luabind::value("SpecializeAlteration", EQ::skills::SkillSpecializeAlteration), + luabind::value("SpecializeConjuration", EQ::skills::SkillSpecializeConjuration), + luabind::value("SpecializeDivination", EQ::skills::SkillSpecializeDivination), + luabind::value("SpecializeEvocation", EQ::skills::SkillSpecializeEvocation), + luabind::value("PickPockets", EQ::skills::SkillPickPockets), + luabind::value("StringedInstruments", EQ::skills::SkillStringedInstruments), + luabind::value("Swimming", EQ::skills::SkillSwimming), + luabind::value("Throwing", EQ::skills::SkillThrowing), + luabind::value("TigerClaw", EQ::skills::SkillTigerClaw), + luabind::value("Tracking", EQ::skills::SkillTracking), + luabind::value("WindInstruments", EQ::skills::SkillWindInstruments), + luabind::value("Fishing", EQ::skills::SkillFishing), + luabind::value("MakePoison", EQ::skills::SkillMakePoison), + luabind::value("Tinkering", EQ::skills::SkillTinkering), + luabind::value("Research", EQ::skills::SkillResearch), + luabind::value("Alchemy", EQ::skills::SkillAlchemy), + luabind::value("Baking", EQ::skills::SkillBaking), + luabind::value("Tailoring", EQ::skills::SkillTailoring), + luabind::value("SenseTraps", EQ::skills::SkillSenseTraps), + luabind::value("Blacksmithing", EQ::skills::SkillBlacksmithing), + luabind::value("Fletching", EQ::skills::SkillFletching), + luabind::value("Brewing", EQ::skills::SkillBrewing), + luabind::value("AlcoholTolerance", EQ::skills::SkillAlcoholTolerance), + luabind::value("Begging", EQ::skills::SkillBegging), + luabind::value("JewelryMaking", EQ::skills::SkillJewelryMaking), + luabind::value("Pottery", EQ::skills::SkillPottery), + luabind::value("PercussionInstruments", EQ::skills::SkillPercussionInstruments), + luabind::value("Intimidation", EQ::skills::SkillIntimidation), + luabind::value("Berserking", EQ::skills::SkillBerserking), + luabind::value("Taunt", EQ::skills::SkillTaunt), + luabind::value("Frenzy", EQ::skills::SkillFrenzy), + luabind::value("RemoveTraps", EQ::skills::SkillRemoveTraps), + luabind::value("TripleAttack", EQ::skills::SkillTripleAttack), + luabind::value("2HPiercing", EQ::skills::Skill2HPiercing), + luabind::value("Piercing2H", EQ::skills::Skill2HPiercing), + luabind::value("HIGHEST_SKILL", EQ::skills::HIGHEST_SKILL) ]; } @@ -2294,7 +3466,24 @@ luabind::scope lua_register_message_types() { return luabind::class_("MT") .enum_("constants") [ + luabind::value("White", Chat::White), + luabind::value("DimGray", Chat::DimGray), + luabind::value("Default", Chat::Default), + luabind::value("Green", Chat::Green), + luabind::value("BrightBlue", Chat::BrightBlue), + luabind::value("LightBlue", Chat::LightBlue), + luabind::value("Magenta", Chat::Magenta), + luabind::value("Gray", Chat::Gray), + luabind::value("LightGray", Chat::LightGray), luabind::value("NPCQuestSay", Chat::NPCQuestSay), + luabind::value("DarkGray", Chat::DarkGray), + luabind::value("Red", Chat::Red), + luabind::value("Lime", Chat::Lime), + luabind::value("Yellow", Chat::Yellow), + luabind::value("Blue", Chat::Blue), + luabind::value("LightNavy", Chat::LightNavy), + luabind::value("Cyan", Chat::Cyan), + luabind::value("Black", Chat::Black), luabind::value("Say", Chat::Say), luabind::value("Tell", Chat::Tell), luabind::value("Group", Chat::Group), diff --git a/zone/lua_group.cpp b/zone/lua_group.cpp index f297d72f1..2cac41418 100644 --- a/zone/lua_group.cpp +++ b/zone/lua_group.cpp @@ -107,6 +107,18 @@ Lua_Mob Lua_Group::GetMember(int index) { return self->members[index]; } +bool Lua_Group::DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name) +{ + Lua_Safe_Call_Bool(); + return self->DoesAnyMemberHaveExpeditionLockout(expedition_name, event_name); +} + +bool Lua_Group::DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name, int max_check_count) +{ + Lua_Safe_Call_Bool(); + return self->DoesAnyMemberHaveExpeditionLockout(expedition_name, event_name, max_check_count); +} + luabind::scope lua_register_group() { return luabind::class_("Group") .def(luabind::constructor<>()) @@ -129,7 +141,9 @@ luabind::scope lua_register_group() { .def("GetLowestLevel", (int(Lua_Group::*)(void))&Lua_Group::GetLowestLevel) .def("TeleportGroup", (void(Lua_Group::*)(Lua_Mob,uint32,uint32,float,float,float,float))&Lua_Group::TeleportGroup) .def("GetID", (int(Lua_Group::*)(void))&Lua_Group::GetID) - .def("GetMember", (Lua_Mob(Lua_Group::*)(int))&Lua_Group::GetMember); + .def("GetMember", (Lua_Mob(Lua_Group::*)(int))&Lua_Group::GetMember) + .def("DoesAnyMemberHaveExpeditionLockout", (bool(Lua_Group::*)(std::string, std::string))&Lua_Group::DoesAnyMemberHaveExpeditionLockout) + .def("DoesAnyMemberHaveExpeditionLockout", (bool(Lua_Group::*)(std::string, std::string, int))&Lua_Group::DoesAnyMemberHaveExpeditionLockout); } #endif diff --git a/zone/lua_group.h b/zone/lua_group.h index e1aa2a11d..46bc48f50 100644 --- a/zone/lua_group.h +++ b/zone/lua_group.h @@ -44,6 +44,8 @@ public: void TeleportGroup(Lua_Mob sender, uint32 zone_id, uint32 instance_id, float x, float y, float z, float h); int GetID(); Lua_Mob GetMember(int index); + bool DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name); + bool DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name, int max_check_count); }; #endif diff --git a/zone/lua_inventory.cpp b/zone/lua_inventory.cpp index dd4e1cc6b..1eba6e6f6 100644 --- a/zone/lua_inventory.cpp +++ b/zone/lua_inventory.cpp @@ -20,7 +20,7 @@ Lua_ItemInst Lua_Inventory::GetItem(int slot_id, int bag_slot) { int Lua_Inventory::PutItem(int slot_id, Lua_ItemInst item) { Lua_Safe_Call_Int(); - EQEmu::ItemInstance *inst = item; + EQ::ItemInstance *inst = item; if(!inst) { return 0; } @@ -30,7 +30,7 @@ int Lua_Inventory::PutItem(int slot_id, Lua_ItemInst item) { int Lua_Inventory::PushCursor(Lua_ItemInst item) { Lua_Safe_Call_Int(); - EQEmu::ItemInstance *inst = item; + EQ::ItemInstance *inst = item; if(!inst) { return 0; } @@ -40,7 +40,7 @@ int Lua_Inventory::PushCursor(Lua_ItemInst item) { bool Lua_Inventory::SwapItem(int source_slot, int destination_slot) { Lua_Safe_Call_Bool(); - EQEmu::InventoryProfile::SwapItemFailState fail_state = EQEmu::InventoryProfile::swapInvalid; + EQ::InventoryProfile::SwapItemFailState fail_state = EQ::InventoryProfile::swapInvalid; return self->SwapItem(source_slot, destination_slot, fail_state); } diff --git a/zone/lua_inventory.h b/zone/lua_inventory.h index 272e142de..b64e9c48c 100644 --- a/zone/lua_inventory.h +++ b/zone/lua_inventory.h @@ -7,7 +7,7 @@ class Lua_ItemInst; class Lua_Item; -namespace EQEmu +namespace EQ { class InventoryProfile; } @@ -23,16 +23,16 @@ luabind::scope lua_register_inventory(); // of database calls and can lead to lost items, duplicated items and/or // desync'd inventories, if not handled correctly. -class Lua_Inventory : public Lua_Ptr +class Lua_Inventory : public Lua_Ptr { - typedef EQEmu::InventoryProfile NativeType; + typedef EQ::InventoryProfile NativeType; public: Lua_Inventory() : Lua_Ptr(nullptr) { } - Lua_Inventory(EQEmu::InventoryProfile *d) : Lua_Ptr(d) { } + Lua_Inventory(EQ::InventoryProfile *d) : Lua_Ptr(d) { } virtual ~Lua_Inventory() { } - operator EQEmu::InventoryProfile*() { - return reinterpret_cast(GetLuaPtrData()); + operator EQ::InventoryProfile*() { + return reinterpret_cast(GetLuaPtrData()); } Lua_ItemInst GetItem(int slot_id); diff --git a/zone/lua_item.cpp b/zone/lua_item.cpp index 67e7a1bd4..5ee5f5d69 100644 --- a/zone/lua_item.cpp +++ b/zone/lua_item.cpp @@ -7,7 +7,7 @@ #include "lua_item.h" Lua_Item::Lua_Item(uint32 item_id) { - const EQEmu::ItemData *t = database.GetItem(item_id); + const EQ::ItemData *t = database.GetItem(item_id); SetLuaPtrData(t); } diff --git a/zone/lua_item.h b/zone/lua_item.h index d5a32c41f..6a55c80b3 100644 --- a/zone/lua_item.h +++ b/zone/lua_item.h @@ -4,7 +4,7 @@ #include "lua_ptr.h" -namespace EQEmu +namespace EQ { struct ItemData; } @@ -15,17 +15,17 @@ namespace luabind { luabind::scope lua_register_item(); -class Lua_Item : public Lua_Ptr +class Lua_Item : public Lua_Ptr { - typedef const EQEmu::ItemData NativeType; + typedef const EQ::ItemData NativeType; public: Lua_Item(uint32 item_id); Lua_Item() : Lua_Ptr(nullptr) { } - Lua_Item(const EQEmu::ItemData *d) : Lua_Ptr(d) { } + Lua_Item(const EQ::ItemData *d) : Lua_Ptr(d) { } virtual ~Lua_Item() { } - operator const EQEmu::ItemData*() { - return reinterpret_cast(GetLuaPtrData()); + operator const EQ::ItemData*() { + return reinterpret_cast(GetLuaPtrData()); } int GetMinStatus(); diff --git a/zone/lua_iteminst.cpp b/zone/lua_iteminst.cpp index 7844a64bb..ba3c8a2c6 100644 --- a/zone/lua_iteminst.cpp +++ b/zone/lua_iteminst.cpp @@ -21,7 +21,7 @@ Lua_ItemInst::Lua_ItemInst(int item_id, int charges) { Lua_ItemInst& Lua_ItemInst::operator=(const Lua_ItemInst& o) { if(o.cloned_) { cloned_ = true; - d_ = new EQEmu::ItemInstance(*o.d_); + d_ = new EQ::ItemInstance(*o.d_); } else { cloned_ = false; d_ = o.d_; @@ -32,7 +32,7 @@ Lua_ItemInst& Lua_ItemInst::operator=(const Lua_ItemInst& o) { Lua_ItemInst::Lua_ItemInst(const Lua_ItemInst& o) { if(o.cloned_) { cloned_ = true; - d_ = new EQEmu::ItemInstance(*o.d_); + d_ = new EQ::ItemInstance(*o.d_); } else { cloned_ = false; d_ = o.d_; @@ -41,7 +41,7 @@ Lua_ItemInst::Lua_ItemInst(const Lua_ItemInst& o) { bool Lua_ItemInst::IsType(int item_class) { Lua_Safe_Call_Bool(); - return self->IsType(static_cast(item_class)); + return self->IsType(static_cast(item_class)); } bool Lua_ItemInst::IsStackable() { diff --git a/zone/lua_iteminst.h b/zone/lua_iteminst.h index 98943d6dc..7614bea5d 100644 --- a/zone/lua_iteminst.h +++ b/zone/lua_iteminst.h @@ -6,7 +6,7 @@ class Lua_Item; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -17,21 +17,21 @@ namespace luabind { luabind::scope lua_register_iteminst(); -class Lua_ItemInst : public Lua_Ptr +class Lua_ItemInst : public Lua_Ptr { - typedef EQEmu::ItemInstance NativeType; + typedef EQ::ItemInstance NativeType; public: Lua_ItemInst(int item_id); Lua_ItemInst(int item_id, int charges); Lua_ItemInst() : Lua_Ptr(nullptr), cloned_(false) { } - Lua_ItemInst(EQEmu::ItemInstance *d) : Lua_Ptr(d), cloned_(false) { } - Lua_ItemInst(EQEmu::ItemInstance *d, bool cloned) : Lua_Ptr(d), cloned_(cloned) { } + Lua_ItemInst(EQ::ItemInstance *d) : Lua_Ptr(d), cloned_(false) { } + Lua_ItemInst(EQ::ItemInstance *d, bool cloned) : Lua_Ptr(d), cloned_(cloned) { } Lua_ItemInst& operator=(const Lua_ItemInst& o); Lua_ItemInst(const Lua_ItemInst& o); - virtual ~Lua_ItemInst() { if(cloned_) { EQEmu::ItemInstance *ptr = GetLuaPtrData(); if(ptr) { delete ptr; } } } + virtual ~Lua_ItemInst() { if(cloned_) { EQ::ItemInstance *ptr = GetLuaPtrData(); if(ptr) { delete ptr; } } } - operator EQEmu::ItemInstance*() { - return reinterpret_cast(GetLuaPtrData()); + operator EQ::ItemInstance*() { + return reinterpret_cast(GetLuaPtrData()); } bool IsType(int item_class); diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 4860ae1e8..2948c8c71 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -179,22 +179,22 @@ bool Lua_Mob::Attack(Lua_Mob other, int hand, bool from_riposte, bool is_striket void Lua_Mob::Damage(Lua_Mob from, int damage, int spell_id, int attack_skill) { Lua_Safe_Call_Void(); - return self->Damage(from, damage, spell_id, static_cast(attack_skill)); + return self->Damage(from, damage, spell_id, static_cast(attack_skill)); } void Lua_Mob::Damage(Lua_Mob from, int damage, int spell_id, int attack_skill, bool avoidable) { Lua_Safe_Call_Void(); - return self->Damage(from, damage, spell_id, static_cast(attack_skill), avoidable); + return self->Damage(from, damage, spell_id, static_cast(attack_skill), avoidable); } void Lua_Mob::Damage(Lua_Mob from, int damage, int spell_id, int attack_skill, bool avoidable, int buffslot) { Lua_Safe_Call_Void(); - return self->Damage(from, damage, spell_id, static_cast(attack_skill), avoidable, buffslot); + return self->Damage(from, damage, spell_id, static_cast(attack_skill), avoidable, buffslot); } void Lua_Mob::Damage(Lua_Mob from, int damage, int spell_id, int attack_skill, bool avoidable, int buffslot, bool buff_tic) { Lua_Safe_Call_Void(); - return self->Damage(from, damage, spell_id, static_cast(attack_skill), avoidable, buffslot, buff_tic); + return self->Damage(from, damage, spell_id, static_cast(attack_skill), avoidable, buffslot, buff_tic); } void Lua_Mob::RangedAttack(Lua_Mob other) { @@ -372,6 +372,11 @@ int Lua_Mob::GetRace() { return self->GetRace(); } +const char *Lua_Mob::GetRaceName() { + Lua_Safe_Call_String(); + return GetRaceIDName(self->GetRace()); +} + int Lua_Mob::GetGender() { Lua_Safe_Call_Int(); return self->GetGender(); @@ -442,6 +447,11 @@ int Lua_Mob::GetClass() { return self->GetClass(); } +const char *Lua_Mob::GetClassName() { + Lua_Safe_Call_String(); + return GetClassIDName(self->GetClass()); +} + int Lua_Mob::GetLevel() { Lua_Safe_Call_Int(); return self->GetLevel(); @@ -532,6 +542,11 @@ int Lua_Mob::GetAC() { return self->GetAC(); } +int Lua_Mob::GetDisplayAC() { + Lua_Safe_Call_Int(); + return self->GetDisplayAC(); +} + int Lua_Mob::GetATK() { Lua_Safe_Call_Int(); return self->GetATK(); @@ -853,28 +868,28 @@ bool Lua_Mob::CastSpell(int spell_id, int target_id) { bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot) { Lua_Safe_Call_Bool(); - return self->CastSpell(spell_id, target_id, static_cast(slot)); + return self->CastSpell(spell_id, target_id, static_cast(slot)); } bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time) { Lua_Safe_Call_Bool(); - return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time); + return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time); } bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, int mana_cost) { Lua_Safe_Call_Bool(); - return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost); + return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost); } bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, int mana_cost, int item_slot) { Lua_Safe_Call_Bool(); - return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost, nullptr, static_cast(item_slot)); + return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost, nullptr, static_cast(item_slot)); } bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, int mana_cost, int item_slot, int timer, int timer_duration) { Lua_Safe_Call_Bool(); - return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost, nullptr, static_cast(item_slot), + return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost, nullptr, static_cast(item_slot), static_cast(timer), static_cast(timer_duration)); } @@ -883,7 +898,7 @@ bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, in Lua_Safe_Call_Bool(); int16 res = resist_adjust; - return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost, nullptr, static_cast(item_slot), + return self->CastSpell(spell_id, target_id, static_cast(slot), cast_time, mana_cost, nullptr, static_cast(item_slot), static_cast(timer), static_cast(timer_duration), &res); } @@ -894,27 +909,27 @@ bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target) { bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target, int slot) { Lua_Safe_Call_Bool(); - return self->SpellFinished(spell_id, target, static_cast(slot)); + return self->SpellFinished(spell_id, target, static_cast(slot)); } bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target, int slot, int mana_used) { Lua_Safe_Call_Bool(); - return self->SpellFinished(spell_id, target, static_cast(slot), mana_used); + return self->SpellFinished(spell_id, target, static_cast(slot), mana_used); } bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target, int slot, int mana_used, uint32 inventory_slot) { Lua_Safe_Call_Bool(); - return self->SpellFinished(spell_id, target, static_cast(slot), mana_used, inventory_slot); + return self->SpellFinished(spell_id, target, static_cast(slot), mana_used, inventory_slot); } bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target, int slot, int mana_used, uint32 inventory_slot, int resist_adjust) { Lua_Safe_Call_Bool(); - return self->SpellFinished(spell_id, target, static_cast(slot), mana_used, inventory_slot, resist_adjust); + return self->SpellFinished(spell_id, target, static_cast(slot), mana_used, inventory_slot, resist_adjust); } bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target, int slot, int mana_used, uint32 inventory_slot, int resist_adjust, bool proc) { Lua_Safe_Call_Bool(); - return self->SpellFinished(spell_id, target, static_cast(slot), mana_used, inventory_slot, resist_adjust, proc); + return self->SpellFinished(spell_id, target, static_cast(slot), mana_used, inventory_slot, resist_adjust, proc); } void Lua_Mob::SendBeginCast(int spell_id, int cast_time) { @@ -1349,22 +1364,22 @@ bool Lua_Mob::CombatRange(Lua_Mob other) { void Lua_Mob::DoSpecialAttackDamage(Lua_Mob other, int skill, int max_damage) { Lua_Safe_Call_Void(); - self->DoSpecialAttackDamage(other, static_cast(skill), max_damage); + self->DoSpecialAttackDamage(other, static_cast(skill), max_damage); } void Lua_Mob::DoSpecialAttackDamage(Lua_Mob other, int skill, int max_damage, int min_damage) { Lua_Safe_Call_Void(); - self->DoSpecialAttackDamage(other, static_cast(skill), max_damage, min_damage); + self->DoSpecialAttackDamage(other, static_cast(skill), max_damage, min_damage); } void Lua_Mob::DoSpecialAttackDamage(Lua_Mob other, int skill, int max_damage, int min_damage, int hate_override) { Lua_Safe_Call_Void(); - self->DoSpecialAttackDamage(other, static_cast(skill), max_damage, min_damage, hate_override); + self->DoSpecialAttackDamage(other, static_cast(skill), max_damage, min_damage, hate_override); } void Lua_Mob::DoSpecialAttackDamage(Lua_Mob other, int skill, int max_damage, int min_damage, int hate_override, int reuse_time) { Lua_Safe_Call_Void(); - self->DoSpecialAttackDamage(other, static_cast(skill), max_damage, min_damage, hate_override, reuse_time); + self->DoSpecialAttackDamage(other, static_cast(skill), max_damage, min_damage, hate_override, reuse_time); } void Lua_Mob::DoThrowingAttackDmg(Lua_Mob other) { @@ -1400,22 +1415,22 @@ void Lua_Mob::DoThrowingAttackDmg(Lua_Mob other, Lua_ItemInst range_weapon, Lua_ void Lua_Mob::DoMeleeSkillAttackDmg(Lua_Mob other, int weapon_damage, int skill) { Lua_Safe_Call_Void(); - self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill)); + self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill)); } void Lua_Mob::DoMeleeSkillAttackDmg(Lua_Mob other, int weapon_damage, int skill, int chance_mod) { Lua_Safe_Call_Void(); - self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill), chance_mod); + self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill), chance_mod); } void Lua_Mob::DoMeleeSkillAttackDmg(Lua_Mob other, int weapon_damage, int skill, int chance_mod, int focus) { Lua_Safe_Call_Void(); - self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill), chance_mod, focus); + self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill), chance_mod, focus); } void Lua_Mob::DoMeleeSkillAttackDmg(Lua_Mob other, int weapon_damage, int skill, int chance_mod, int focus, bool can_riposte) { Lua_Safe_Call_Void(); - self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill), chance_mod, focus, can_riposte); + self->DoMeleeSkillAttackDmg(other, weapon_damage, static_cast(skill), chance_mod, focus, can_riposte); } void Lua_Mob::DoArcheryAttackDmg(Lua_Mob other) { @@ -1879,17 +1894,17 @@ void Lua_Mob::SetTargetable(bool on) { void Lua_Mob::ModSkillDmgTaken(int skill, int value) { Lua_Safe_Call_Void(); - self->ModSkillDmgTaken(static_cast(skill), value); + self->ModSkillDmgTaken(static_cast(skill), value); } int Lua_Mob::GetModSkillDmgTaken(int skill) { Lua_Safe_Call_Int(); - return self->GetModSkillDmgTaken(static_cast(skill)); + return self->GetModSkillDmgTaken(static_cast(skill)); } int Lua_Mob::GetSkillDmgTaken(int skill) { Lua_Safe_Call_Int(); - return self->GetSkillDmgTaken(static_cast(skill)); + return self->GetSkillDmgTaken(static_cast(skill)); } int Lua_Mob::GetFcDamageAmtIncoming(Lua_Mob caster, uint32 spell_id, bool use_skill, uint16 skill) @@ -1951,7 +1966,7 @@ int Lua_Mob::GetFlurryChance() { int Lua_Mob::GetSkill(int skill) { Lua_Safe_Call_Int(); - return self->GetSkill(static_cast(skill)); + return self->GetSkill(static_cast(skill)); } int Lua_Mob::GetSpecialAbility(int ability) { @@ -2252,6 +2267,86 @@ void Lua_Mob::CheckNumHitsRemaining(int type, int32 buff_slot, uint16 spell_id) self->CheckNumHitsRemaining((NumHit)type, buff_slot, spell_id); } +void Lua_Mob::DeleteBucket(std::string bucket_name) +{ + Lua_Safe_Call_Void(); + self->DeleteBucket(bucket_name); +} + +std::string Lua_Mob::GetBucket(std::string bucket_name) +{ + Lua_Safe_Call_String(); + return self->GetBucket(bucket_name); +} + +std::string Lua_Mob::GetBucketExpires(std::string bucket_name) +{ + Lua_Safe_Call_String(); + return self->GetBucketExpires(bucket_name); +} + +std::string Lua_Mob::GetBucketKey() +{ + Lua_Safe_Call_String(); + return self->GetBucketKey(); +} + +std::string Lua_Mob::GetBucketRemaining(std::string bucket_name) +{ + Lua_Safe_Call_String(); + return self->GetBucketRemaining(bucket_name); +} + +void Lua_Mob::SetBucket(std::string bucket_name, std::string bucket_value) +{ + Lua_Safe_Call_Void(); + self->SetBucket(bucket_name, bucket_value); +} + +void Lua_Mob::SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration) +{ + Lua_Safe_Call_Void(); + self->SetBucket(bucket_name, bucket_value, expiration); +} + +bool Lua_Mob::IsHorse() +{ + Lua_Safe_Call_Bool(); + return self->IsHorse(); +} + +Lua_Mob Lua_Mob::GetHateClosest() { + Lua_Safe_Call_Class(Lua_Mob); + return Lua_Mob(self->GetHateClosest()); +} + +Lua_HateList Lua_Mob::GetHateListByDistance() { + Lua_Safe_Call_Class(Lua_HateList); + Lua_HateList ret; + auto list = self->GetHateListByDistance(); + for (auto hate_entry : list) { + Lua_HateEntry entry(hate_entry); + ret.entries.push_back(entry); + } + return ret; +} + +Lua_HateList Lua_Mob::GetHateListByDistance(int distance) { + Lua_Safe_Call_Class(Lua_HateList); + Lua_HateList ret; + auto list = self->GetHateListByDistance(distance); + for (auto hate_entry : list) { + Lua_HateEntry entry(hate_entry); + ret.entries.push_back(entry); + } + return ret; +} + +const char *Lua_Mob::GetLastName() { + Lua_Safe_Call_String(); + return self->GetLastName(); +} + luabind::scope lua_register_mob() { return luabind::class_("Mob") .def(luabind::constructor<>()) @@ -2311,6 +2406,7 @@ luabind::scope lua_register_mob() { .def("GetBaseGender", &Lua_Mob::GetBaseGender) .def("GetDeity", &Lua_Mob::GetDeity) .def("GetRace", &Lua_Mob::GetRace) + .def("GetRaceName", &Lua_Mob::GetRaceName) .def("GetGender", &Lua_Mob::GetGender) .def("GetTexture", &Lua_Mob::GetTexture) .def("GetHelmTexture", &Lua_Mob::GetHelmTexture) @@ -2325,6 +2421,7 @@ luabind::scope lua_register_mob() { .def("GetDrakkinTattoo", &Lua_Mob::GetDrakkinTattoo) .def("GetDrakkinDetails", &Lua_Mob::GetDrakkinDetails) .def("GetClass", &Lua_Mob::GetClass) + .def("GetClassName", &Lua_Mob::GetClassName) .def("GetLevel", &Lua_Mob::GetLevel) .def("GetCleanName", &Lua_Mob::GetCleanName) .def("GetTarget", &Lua_Mob::GetTarget) @@ -2344,6 +2441,7 @@ luabind::scope lua_register_mob() { .def("SetMana", &Lua_Mob::SetMana) .def("GetManaRatio", &Lua_Mob::GetManaRatio) .def("GetAC", &Lua_Mob::GetAC) + .def("GetDisplayAC", &Lua_Mob::GetDisplayAC) .def("GetATK", &Lua_Mob::GetATK) .def("GetSTR", &Lua_Mob::GetSTR) .def("GetSTA", &Lua_Mob::GetSTA) @@ -2415,9 +2513,12 @@ luabind::scope lua_register_mob() { .def("GetPet", &Lua_Mob::GetPet) .def("GetOwner", &Lua_Mob::GetOwner) .def("GetHateList", &Lua_Mob::GetHateList) + .def("GetHateListByDistance", (Lua_HateList(Lua_Mob::*)(void))&Lua_Mob::GetHateListByDistance) + .def("GetHateListByDistance", (Lua_HateList(Lua_Mob::*)(int))&Lua_Mob::GetHateListByDistance) .def("GetHateTop", (Lua_Mob(Lua_Mob::*)(void))&Lua_Mob::GetHateTop) .def("GetHateDamageTop", (Lua_Mob(Lua_Mob::*)(Lua_Mob))&Lua_Mob::GetHateDamageTop) .def("GetHateRandom", (Lua_Mob(Lua_Mob::*)(void))&Lua_Mob::GetHateRandom) + .def("GetHateClosest", &Lua_Mob::GetHateClosest) .def("AddToHateList", (void(Lua_Mob::*)(Lua_Mob))&Lua_Mob::AddToHateList) .def("AddToHateList", (void(Lua_Mob::*)(Lua_Mob,int))&Lua_Mob::AddToHateList) .def("AddToHateList", (void(Lua_Mob::*)(Lua_Mob,int,int))&Lua_Mob::AddToHateList) @@ -2639,7 +2740,16 @@ luabind::scope lua_register_mob() { .def("TryFinishingBlow", &Lua_Mob::TryFinishingBlow) .def("GetBodyType", &Lua_Mob::GetBodyType) .def("GetOrigBodyType", &Lua_Mob::GetOrigBodyType) - .def("CheckNumHitsRemaining", &Lua_Mob::CheckNumHitsRemaining); + .def("CheckNumHitsRemaining", &Lua_Mob::CheckNumHitsRemaining) + .def("DeleteBucket", (void(Lua_Mob::*)(std::string))&Lua_Mob::DeleteBucket) + .def("GetBucket", (std::string(Lua_Mob::*)(std::string))&Lua_Mob::GetBucket) + .def("GetBucketExpires", (std::string(Lua_Mob::*)(std::string))&Lua_Mob::GetBucketExpires) + .def("GetBucketKey", (std::string(Lua_Mob::*)(void))&Lua_Mob::GetBucketKey) + .def("GetBucketRemaining", (std::string(Lua_Mob::*)(std::string))&Lua_Mob::GetBucketRemaining) + .def("SetBucket", (void(Lua_Mob::*)(std::string,std::string))&Lua_Mob::SetBucket) + .def("SetBucket", (void(Lua_Mob::*)(std::string,std::string,std::string))&Lua_Mob::SetBucket) + .def("IsHorse", &Lua_Mob::IsHorse) + .def("GetLastName", &Lua_Mob::GetLastName); } luabind::scope lua_register_special_abilities() { @@ -2690,7 +2800,11 @@ luabind::scope lua_register_special_abilities() { luabind::value("ignore_root_aggro_rules", static_cast(IGNORE_ROOT_AGGRO_RULES)), luabind::value("casting_resist_diff", static_cast(CASTING_RESIST_DIFF)), luabind::value("counter_avoid_damage", static_cast(COUNTER_AVOID_DAMAGE)), - luabind::value("immune_ranged_attacks", static_cast(IMMUNE_RANGED_ATTACKS)) + luabind::value("immune_ranged_attacks", static_cast(IMMUNE_RANGED_ATTACKS)), + luabind::value("immune_damage_client", static_cast(IMMUNE_DAMAGE_CLIENT)), + luabind::value("immune_damage_npc", static_cast(IMMUNE_DAMAGE_NPC)), + luabind::value("immune_aggro_client", static_cast(IMMUNE_AGGRO_CLIENT)), + luabind::value("immune_aggro_npc", static_cast(IMMUNE_AGGRO_NPC)) ]; } diff --git a/zone/lua_mob.h b/zone/lua_mob.h index 592ac6243..dbb3c8110 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -92,6 +92,8 @@ public: int GetBaseGender(); int GetDeity(); int GetRace(); + const char *GetClassName(); + const char *GetRaceName(); int GetGender(); int GetTexture(); int GetHelmTexture(); @@ -108,6 +110,7 @@ public: int GetClass(); int GetLevel(); const char *GetCleanName(); + const char *GetLastName(); Lua_Mob GetTarget(); void SetTarget(Lua_Mob t); double GetHPRatio(); @@ -124,6 +127,7 @@ public: int SetMana(int mana); double GetManaRatio(); int GetAC(); + int GetDisplayAC(); int GetATK(); int GetSTR(); int GetSTA(); @@ -195,9 +199,12 @@ public: Lua_Mob GetPet(); Lua_Mob GetOwner(); Lua_HateList GetHateList(); + Lua_HateList GetHateListByDistance(); + Lua_HateList GetHateListByDistance(int distance); Lua_Mob GetHateTop(); Lua_Mob GetHateDamageTop(Lua_Mob other); Lua_Mob GetHateRandom(); + Lua_Mob GetHateClosest(); void AddToHateList(Lua_Mob other); void AddToHateList(Lua_Mob other, int hate); void AddToHateList(Lua_Mob other, int hate, int damage); @@ -422,6 +429,15 @@ public: int GetBodyType(); int GetOrigBodyType(); void CheckNumHitsRemaining(int type, int32 buff_slot, uint16 spell_id); + + void DeleteBucket(std::string bucket_name); + std::string GetBucket(std::string bucket_name); + std::string GetBucketExpires(std::string bucket_name); + std::string GetBucketKey(); + std::string GetBucketRemaining(std::string bucket_name); + void SetBucket(std::string bucket_name, std::string bucket_value); + void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration); + bool IsHorse(); }; #endif diff --git a/zone/lua_mod.cpp b/zone/lua_mod.cpp index 8dc77f4f7..382f8adba 100644 --- a/zone/lua_mod.cpp +++ b/zone/lua_mod.cpp @@ -95,7 +95,7 @@ void GetDamageHitInfo(luabind::adl::object &ret, DamageHitInfo &hit) { } if (luabind::type(skill) == LUA_TNUMBER) { - hit.skill = (EQEmu::skills::SkillType)luabind::object_cast(skill); + hit.skill = (EQ::skills::SkillType)luabind::object_cast(skill); } } } diff --git a/zone/lua_npc.cpp b/zone/lua_npc.cpp index bf52b9276..c47870653 100644 --- a/zone/lua_npc.cpp +++ b/zone/lua_npc.cpp @@ -237,6 +237,11 @@ void Lua_NPC::SetTaunting(bool t) { self->SetTaunting(t); } +bool Lua_NPC::IsTaunting() { + Lua_Safe_Call_Bool(); + return self->IsTaunting(); +} + void Lua_NPC::PickPocket(Lua_Client thief) { Lua_Safe_Call_Void(); self->PickPocket(thief); @@ -553,6 +558,18 @@ void Lua_NPC::RecalculateSkills() self->RecalculateSkills(); } +void Lua_NPC::ScaleNPC(uint8 npc_level) +{ + Lua_Safe_Call_Void(); + self->ScaleNPC(npc_level); +} + +bool Lua_NPC::IsRaidTarget() +{ + Lua_Safe_Call_Bool(); + return self->IsRaidTarget(); +} + luabind::scope lua_register_npc() { return luabind::class_("NPC") .def(luabind::constructor<>()) @@ -602,6 +619,7 @@ luabind::scope lua_register_npc() { .def("SetPetSpellID", (void(Lua_NPC::*)(int))&Lua_NPC::SetPetSpellID) .def("GetMaxDamage", (uint32(Lua_NPC::*)(int))&Lua_NPC::GetMaxDamage) .def("SetTaunting", (void(Lua_NPC::*)(bool))&Lua_NPC::SetTaunting) + .def("IsTaunting", (bool(Lua_NPC::*)(void))&Lua_NPC::IsTaunting) .def("PickPocket", (void(Lua_NPC::*)(Lua_Client))&Lua_NPC::PickPocket) .def("StartSwarmTimer", (void(Lua_NPC::*)(uint32))&Lua_NPC::StartSwarmTimer) .def("DoClassAttacks", (void(Lua_NPC::*)(Lua_Mob))&Lua_NPC::DoClassAttacks) @@ -664,7 +682,9 @@ luabind::scope lua_register_npc() { .def("MerchantCloseShop", (void(Lua_NPC::*)(void))&Lua_NPC::MerchantCloseShop) .def("GetRawAC", (int(Lua_NPC::*)(void))&Lua_NPC::GetRawAC) .def("GetAvoidanceRating", &Lua_NPC::GetAvoidanceRating) - .def("RecalculateSkills", (void(Lua_NPC::*)(void))&Lua_NPC::RecalculateSkills); + .def("RecalculateSkills", (void(Lua_NPC::*)(void))&Lua_NPC::RecalculateSkills) + .def("ScaleNPC", (void(Lua_NPC::*)(uint8))&Lua_NPC::ScaleNPC) + .def("IsRaidTarget", (bool(Lua_NPC::*)(void))&Lua_NPC::IsRaidTarget); } #endif diff --git a/zone/lua_npc.h b/zone/lua_npc.h index 1c7c879f7..00c4623cb 100644 --- a/zone/lua_npc.h +++ b/zone/lua_npc.h @@ -73,6 +73,7 @@ public: void SetPetSpellID(int id); uint32 GetMaxDamage(int level); void SetTaunting(bool t); + bool IsTaunting(); void PickPocket(Lua_Client thief); void StartSwarmTimer(uint32 duration); void DoClassAttacks(Lua_Mob target); @@ -135,6 +136,8 @@ public: void SetSimpleRoamBox(float box_size, float move_distance); void SetSimpleRoamBox(float box_size, float move_distance, int move_delay); void RecalculateSkills(); + void ScaleNPC(uint8 npc_level); + bool IsRaidTarget(); }; #endif diff --git a/zone/lua_packet.cpp b/zone/lua_packet.cpp index 648d6fa87..4936259e6 100644 --- a/zone/lua_packet.cpp +++ b/zone/lua_packet.cpp @@ -788,16 +788,18 @@ luabind::scope lua_register_packet_opcodes() { luabind::value("DzRemovePlayer", static_cast(OP_DzRemovePlayer)), luabind::value("DzSwapPlayer", static_cast(OP_DzSwapPlayer)), luabind::value("DzMakeLeader", static_cast(OP_DzMakeLeader)), - luabind::value("DzJoinExpeditionConfirm", static_cast(OP_DzJoinExpeditionConfirm)), - luabind::value("DzJoinExpeditionReply", static_cast(OP_DzJoinExpeditionReply)), + luabind::value("DzExpeditionInvite", static_cast(OP_DzExpeditionInvite)), + luabind::value("DzExpeditionInviteResponse", static_cast(OP_DzExpeditionInviteResponse)), luabind::value("DzExpeditionInfo", static_cast(OP_DzExpeditionInfo)), - luabind::value("DzMemberStatus", static_cast(OP_DzMemberStatus)), - luabind::value("DzLeaderStatus", static_cast(OP_DzLeaderStatus)), + luabind::value("DzMemberListName", static_cast(OP_DzMemberListName)), + luabind::value("DzMemberListStatus", static_cast(OP_DzMemberListStatus)), + luabind::value("DzSetLeaderName", static_cast(OP_DzSetLeaderName)), luabind::value("DzExpeditionEndsWarning", static_cast(OP_DzExpeditionEndsWarning)), - luabind::value("DzExpeditionList", static_cast(OP_DzExpeditionList)), + luabind::value("DzExpeditionLockoutTimers", static_cast(OP_DzExpeditionLockoutTimers)), luabind::value("DzMemberList", static_cast(OP_DzMemberList)), luabind::value("DzCompass", static_cast(OP_DzCompass)), luabind::value("DzChooseZone", static_cast(OP_DzChooseZone)), + luabind::value("DzChooseZoneReply", static_cast(OP_DzChooseZoneReply)), luabind::value("BuffCreate", static_cast(OP_BuffCreate)), luabind::value("GuildStatus", static_cast(OP_GuildStatus)), luabind::value("BuffRemoveRequest", static_cast(OP_BuffRemoveRequest)), diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index 620ee14d1..59b10d4bf 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -19,6 +19,7 @@ #include "lua_parser.h" #include "lua_bit.h" #include "lua_entity.h" +#include "lua_expedition.h" #include "lua_item.h" #include "lua_iteminst.h" #include "lua_mob.h" @@ -246,7 +247,7 @@ LuaParser::~LuaParser() { } int LuaParser::EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -265,7 +266,7 @@ int LuaParser::EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, } int LuaParser::EventGlobalNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -283,7 +284,7 @@ int LuaParser::EventGlobalNPC(QuestEventID evt, NPC* npc, Mob *init, std::string } int LuaParser::_EventNPC(std::string package_name, QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers, luabind::adl::object *l_func) { + std::vector *extra_pointers, luabind::adl::object *l_func) { const char *sub_name = LuaEvents[evt]; int start = lua_gettop(L); @@ -342,7 +343,7 @@ int LuaParser::_EventNPC(std::string package_name, QuestEventID evt, NPC* npc, M } int LuaParser::EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -360,7 +361,7 @@ int LuaParser::EventPlayer(QuestEventID evt, Client *client, std::string data, u } int LuaParser::EventGlobalPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -378,7 +379,7 @@ int LuaParser::EventGlobalPlayer(QuestEventID evt, Client *client, std::string d } int LuaParser::_EventPlayer(std::string package_name, QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers, luabind::adl::object *l_func) { + std::vector *extra_pointers, luabind::adl::object *l_func) { const char *sub_name = LuaEvents[evt]; int start = lua_gettop(L); @@ -434,8 +435,8 @@ int LuaParser::_EventPlayer(std::string package_name, QuestEventID evt, Client * return 0; } -int LuaParser::EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +int LuaParser::EventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -454,8 +455,8 @@ int LuaParser::EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance * return _EventItem(package_name, evt, client, item, mob, data, extra_data, extra_pointers); } -int LuaParser::_EventItem(std::string package_name, QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, - std::string data, uint32 extra_data, std::vector *extra_pointers, luabind::adl::object *l_func) { +int LuaParser::_EventItem(std::string package_name, QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, + std::string data, uint32 extra_data, std::vector *extra_pointers, luabind::adl::object *l_func) { const char *sub_name = LuaEvents[evt]; int start = lua_gettop(L); @@ -518,7 +519,7 @@ int LuaParser::_EventItem(std::string package_name, QuestEventID evt, Client *cl } int LuaParser::EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -534,7 +535,7 @@ int LuaParser::EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spe } int LuaParser::_EventSpell(std::string package_name, QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers, luabind::adl::object *l_func) { + std::vector *extra_pointers, luabind::adl::object *l_func) { const char *sub_name = LuaEvents[evt]; int start = lua_gettop(L); @@ -598,7 +599,7 @@ int LuaParser::_EventSpell(std::string package_name, QuestEventID evt, NPC* npc, return 0; } -int LuaParser::EventEncounter(QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, std::vector *extra_pointers) { +int LuaParser::EventEncounter(QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -614,7 +615,7 @@ int LuaParser::EventEncounter(QuestEventID evt, std::string encounter_name, std: } int LuaParser::_EventEncounter(std::string package_name, QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { const char *sub_name = LuaEvents[evt]; int start = lua_gettop(L); @@ -718,7 +719,7 @@ bool LuaParser::SpellHasQuestSub(uint32 spell_id, QuestEventID evt) { return HasFunction(subname, package_name); } -bool LuaParser::ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt) { +bool LuaParser::ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt) { if (itm == nullptr) { return false; } @@ -764,7 +765,7 @@ void LuaParser::LoadGlobalPlayerScript(std::string filename) { LoadScript(filename, "global_player"); } -void LuaParser::LoadItemScript(std::string filename, EQEmu::ItemInstance *item) { +void LuaParser::LoadItemScript(std::string filename, EQ::ItemInstance *item) { if (item == nullptr) return; std::string package_name = "item_"; @@ -987,6 +988,16 @@ void LuaParser::ReloadQuests() { } } +/* + * This function is intended only to clean up lua_encounters when the Encounter object is + * about to be destroyed. It won't clean up memory else where, since the caller of this + * function is responsible for that + */ +void LuaParser::RemoveEncounter(const std::string &name) +{ + lua_encounters.erase(name); +} + void LuaParser::LoadScript(std::string filename, std::string package_name) { auto iter = loaded_.find(package_name); if(iter != loaded_.end()) { @@ -1108,7 +1119,9 @@ void LuaParser::MapFunctions(lua_State *L) { lua_register_ruler(), lua_register_ruleb(), lua_register_journal_speakmode(), - lua_register_journal_mode() + lua_register_journal_mode(), + lua_register_expedition(), + lua_register_expedition_lock_messages() ]; } catch(std::exception &ex) { @@ -1118,7 +1131,7 @@ void LuaParser::MapFunctions(lua_State *L) { } int LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -1164,7 +1177,7 @@ int LuaParser::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::stri } int LuaParser::DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -1192,8 +1205,8 @@ int LuaParser::DispatchEventPlayer(QuestEventID evt, Client *client, std::string return ret; } -int LuaParser::DispatchEventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +int LuaParser::DispatchEventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; @@ -1239,7 +1252,7 @@ int LuaParser::DispatchEventItem(QuestEventID evt, Client *client, EQEmu::ItemIn } int LuaParser::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { evt = ConvertLuaEvent(evt); if(evt >= _LargestEventID) { return 0; diff --git a/zone/lua_parser.h b/zone/lua_parser.h index eb57faa96..d058daf13 100644 --- a/zone/lua_parser.h +++ b/zone/lua_parser.h @@ -18,7 +18,7 @@ struct lua_State; class Client; class NPC; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -37,33 +37,33 @@ public: ~LuaParser(); virtual int EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventGlobalNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventGlobalPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers); - virtual int EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); + virtual int EventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); virtual int EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int EventEncounter(QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual bool HasQuestSub(uint32 npc_id, QuestEventID evt); virtual bool HasGlobalQuestSub(QuestEventID evt); virtual bool PlayerHasQuestSub(QuestEventID evt); virtual bool GlobalPlayerHasQuestSub(QuestEventID evt); virtual bool SpellHasQuestSub(uint32 spell_id, QuestEventID evt); - virtual bool ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt); + virtual bool ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt); virtual bool EncounterHasQuestSub(std::string encounter_name, QuestEventID evt); virtual void LoadNPCScript(std::string filename, int npc_id); virtual void LoadGlobalNPCScript(std::string filename); virtual void LoadPlayerScript(std::string filename); virtual void LoadGlobalPlayerScript(std::string filename); - virtual void LoadItemScript(std::string filename, EQEmu::ItemInstance *item); + virtual void LoadItemScript(std::string filename, EQ::ItemInstance *item); virtual void LoadSpellScript(std::string filename, uint32 spell_id); virtual void LoadEncounterScript(std::string filename, std::string encounter_name); @@ -71,16 +71,17 @@ public: virtual std::string GetVar(std::string name); virtual void Init(); virtual void ReloadQuests(); + virtual void RemoveEncounter(const std::string &name); virtual uint32 GetIdentifier() { return 0xb0712acc; } virtual int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); virtual int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers); - virtual int DispatchEventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); + virtual int DispatchEventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); static LuaParser* Instance() { static LuaParser inst; @@ -106,15 +107,15 @@ private: LuaParser& operator=(const LuaParser&); int _EventNPC(std::string package_name, QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); + std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); int _EventPlayer(std::string package_name, QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); - int _EventItem(std::string package_name, QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, - uint32 extra_data, std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); + std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); + int _EventItem(std::string package_name, QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, + uint32 extra_data, std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); int _EventSpell(std::string package_name, QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); + std::vector *extra_pointers, luabind::adl::object *l_func = nullptr); int _EventEncounter(std::string package_name, QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void LoadScript(std::string filename, std::string package_name); void MapFunctions(lua_State *L); diff --git a/zone/lua_parser_events.cpp b/zone/lua_parser_events.cpp index 3ca9edad7..9a1a2c67f 100644 --- a/zone/lua_parser_events.cpp +++ b/zone/lua_parser_events.cpp @@ -28,7 +28,7 @@ //NPC void handle_npc_event_say(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { npc->DoQuestPause(init); Lua_Client l_client(reinterpret_cast(init)); @@ -44,7 +44,7 @@ void handle_npc_event_say(QuestInterface *parse, lua_State* L, NPC* npc, Mob *in } void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Client l_client(reinterpret_cast(init)); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); @@ -58,7 +58,7 @@ void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob * size_t sz = extra_pointers->size(); for(size_t i = 0; i < sz; ++i) { std::string prefix = "item" + std::to_string(i + 1); - EQEmu::ItemInstance *inst = EQEmu::any_cast(extra_pointers->at(i)); + EQ::ItemInstance *inst = EQ::any_cast(extra_pointers->at(i)); Lua_ItemInst l_inst = inst; luabind::adl::object l_inst_o = luabind::adl::object(L, l_inst); @@ -83,7 +83,7 @@ void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob * } void handle_npc_event_hp(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(extra_data == 1) { lua_pushinteger(L, -1); lua_setfield(L, -2, "hp_event"); @@ -100,7 +100,7 @@ void handle_npc_event_hp(QuestInterface *parse, lua_State* L, NPC* npc, Mob *ini } void handle_npc_single_mob(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Mob l_mob(init); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); @@ -108,7 +108,7 @@ void handle_npc_single_mob(QuestInterface *parse, lua_State* L, NPC* npc, Mob *i } void handle_npc_single_client(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Client l_client(reinterpret_cast(init)); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); @@ -116,7 +116,7 @@ void handle_npc_single_client(QuestInterface *parse, lua_State* L, NPC* npc, Mob } void handle_npc_single_npc(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_NPC l_npc(reinterpret_cast(init)); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); l_npc_o.push(L); @@ -124,7 +124,7 @@ void handle_npc_single_npc(QuestInterface *parse, lua_State* L, NPC* npc, Mob *i } void handle_npc_task_accepted(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Client l_client(reinterpret_cast(init)); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); @@ -135,7 +135,7 @@ void handle_npc_task_accepted(QuestInterface *parse, lua_State* L, NPC* npc, Mob } void handle_npc_popup(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Mob l_mob(init); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); @@ -146,7 +146,7 @@ void handle_npc_popup(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, } void handle_npc_waypoint(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Mob l_mob(init); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); @@ -157,7 +157,7 @@ void handle_npc_waypoint(QuestInterface *parse, lua_State* L, NPC* npc, Mob *ini } void handle_npc_hate(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Mob l_mob(init); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); @@ -169,19 +169,19 @@ void handle_npc_hate(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, s void handle_npc_signal(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, std::stoi(data)); lua_setfield(L, -2, "signal"); } void handle_npc_timer(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushstring(L, data.c_str()); lua_setfield(L, -2, "timer"); } void handle_npc_death(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Lua_Mob l_mob(init); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); l_mob_o.push(L); @@ -209,7 +209,7 @@ void handle_npc_death(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, } void handle_npc_cast(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int spell_id = std::stoi(data); if(IsValidSpell(spell_id)) { Lua_Spell l_spell(&spells[spell_id]); @@ -225,21 +225,21 @@ void handle_npc_cast(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, s } void handle_npc_area(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(0))); lua_setfield(L, -2, "area_id"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(1))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(1))); lua_setfield(L, -2, "area_type"); } void handle_npc_null(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { } //Player void handle_player_say(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushstring(L, data.c_str()); lua_setfield(L, -2, "message"); @@ -248,7 +248,7 @@ void handle_player_say(QuestInterface *parse, lua_State* L, Client* client, std: } void handle_player_environmental_damage(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers){ + std::vector *extra_pointers){ Seperator sep(data.c_str()); lua_pushinteger(L, std::stoi(sep.arg[0])); lua_setfield(L, -2, "env_damage"); @@ -261,7 +261,7 @@ void handle_player_environmental_damage(QuestInterface *parse, lua_State* L, Cli } void handle_player_death(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Seperator sep(data.c_str()); Mob *o = entity_list.GetMobID(std::stoi(sep.arg[0])); @@ -291,14 +291,14 @@ void handle_player_death(QuestInterface *parse, lua_State* L, Client* client, st } void handle_player_timer(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushstring(L, data.c_str()); lua_setfield(L, -2, "timer"); } void handle_player_discover_item(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - const EQEmu::ItemData *item = database.GetItem(extra_data); + std::vector *extra_pointers) { + const EQ::ItemData *item = database.GetItem(extra_data); if(item) { Lua_Item l_item(item); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); @@ -313,51 +313,51 @@ void handle_player_discover_item(QuestInterface *parse, lua_State* L, Client* cl } void handle_player_fish_forage_success(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_ItemInst l_item(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_ItemInst l_item(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); l_item_o.push(L); lua_setfield(L, -2, "item"); } void handle_player_click_object(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_Object l_object(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_Object l_object(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_object_o = luabind::adl::object(L, l_object); l_object_o.push(L); lua_setfield(L, -2, "object"); } void handle_player_click_door(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_Door l_door(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_Door l_door(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_door_o = luabind::adl::object(L, l_door); l_door_o.push(L); lua_setfield(L, -2, "door"); } void handle_player_signal(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, std::stoi(data)); lua_setfield(L, -2, "signal"); } void handle_player_popup_response(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, std::stoi(data)); lua_setfield(L, -2, "popup_id"); } void handle_player_pick_up(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_ItemInst l_item(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_ItemInst l_item(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); l_item_o.push(L); lua_setfield(L, -2, "item"); } void handle_player_cast(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int spell_id = std::stoi(data); if(IsValidSpell(spell_id)) { Lua_Spell l_spell(&spells[spell_id]); @@ -373,48 +373,48 @@ void handle_player_cast(QuestInterface *parse, lua_State* L, Client* client, std } void handle_player_task_fail(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, std::stoi(data)); lua_setfield(L, -2, "task_id"); } void handle_player_zone(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, std::stoi(data)); lua_setfield(L, -2, "zone_id"); } void handle_player_duel_win(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_Client l_client(EQEmu::any_cast(extra_pointers->at(1))); + std::vector *extra_pointers) { + Lua_Client l_client(EQ::any_cast(extra_pointers->at(1))); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "other"); } void handle_player_duel_loss(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_Client l_client(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_Client l_client(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_client_o = luabind::adl::object(L, l_client); l_client_o.push(L); lua_setfield(L, -2, "other"); } void handle_player_loot(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_ItemInst l_item(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_ItemInst l_item(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); l_item_o.push(L); lua_setfield(L, -2, "item"); - Lua_Corpse l_corpse(EQEmu::any_cast(extra_pointers->at(1))); + Lua_Corpse l_corpse(EQ::any_cast(extra_pointers->at(1))); luabind::adl::object l_corpse_o = luabind::adl::object(L, l_corpse); l_corpse_o.push(L); lua_setfield(L, -2, "corpse"); } void handle_player_task_stage_complete(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Seperator sep(data.c_str()); lua_pushinteger(L, std::stoi(sep.arg[0])); lua_setfield(L, -2, "task_id"); @@ -424,7 +424,7 @@ void handle_player_task_stage_complete(QuestInterface *parse, lua_State* L, Clie } void handle_player_task_update(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Seperator sep(data.c_str()); lua_pushinteger(L, std::stoi(sep.arg[0])); lua_setfield(L, -2, "count"); @@ -437,7 +437,7 @@ void handle_player_task_update(QuestInterface *parse, lua_State* L, Client* clie } void handle_player_command(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { Seperator sep(data.c_str(), ' ', 10, 100, true); std::string command(sep.arg[0] + 1); lua_pushstring(L, command.c_str()); @@ -456,7 +456,7 @@ void handle_player_command(QuestInterface *parse, lua_State* L, Client* client, } void handle_player_combine(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, extra_data); lua_setfield(L, -2, "recipe_id"); @@ -465,24 +465,24 @@ void handle_player_combine(QuestInterface *parse, lua_State* L, Client* client, } void handle_player_feign(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_NPC l_npc(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_NPC l_npc(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); l_npc_o.push(L); lua_setfield(L, -2, "other"); } void handle_player_area(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(0))); lua_setfield(L, -2, "area_id"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(1))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(1))); lua_setfield(L, -2, "area_type"); } void handle_player_respawn(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushinteger(L, std::stoi(data)); lua_setfield(L, -2, "option"); @@ -491,8 +491,8 @@ void handle_player_respawn(QuestInterface *parse, lua_State* L, Client* client, } void handle_player_packet(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_Packet l_packet(EQEmu::any_cast(extra_pointers->at(0))); + std::vector *extra_pointers) { + Lua_Packet l_packet(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_packet_o = luabind::adl::object(L, l_packet); l_packet_o.push(L); lua_setfield(L, -2, "packet"); @@ -502,10 +502,10 @@ void handle_player_packet(QuestInterface *parse, lua_State* L, Client* client, s } void handle_player_null(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { } -void handle_player_use_skill(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, std::vector *extra_pointers) { +void handle_player_use_skill(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, std::vector *extra_pointers) { Seperator sep(data.c_str()); lua_pushinteger(L, std::stoi(sep.arg[0])); lua_setfield(L, -2, "skill_id"); @@ -515,7 +515,7 @@ void handle_player_use_skill(QuestInterface *parse, lua_State* L, Client* client } void handle_player_combine_validate(QuestInterface* parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector* extra_pointers) { + std::vector* extra_pointers) { Seperator sep(data.c_str()); lua_pushinteger(L, extra_data); lua_setfield(L, -2, "recipe_id"); @@ -540,7 +540,7 @@ void handle_player_combine_validate(QuestInterface* parse, lua_State* L, Client* } void handle_player_bot_command(QuestInterface* parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector* extra_pointers) { + std::vector* extra_pointers) { Seperator sep(data.c_str(), ' ', 10, 100, true); std::string bot_command(sep.arg[0] + 1); lua_pushstring(L, bot_command.c_str()); @@ -559,20 +559,20 @@ void handle_player_bot_command(QuestInterface* parse, lua_State* L, Client* clie } //Item -void handle_item_click(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +void handle_item_click(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { lua_pushinteger(L, extra_data); lua_setfield(L, -2, "slot_id"); } -void handle_item_timer(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +void handle_item_timer(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { lua_pushstring(L, data.c_str()); lua_setfield(L, -2, "timer"); } -void handle_item_proc(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +void handle_item_proc(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { Lua_Mob l_mob(mob); luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob); @@ -592,8 +592,8 @@ void handle_item_proc(QuestInterface *parse, lua_State* L, Client* client, EQEmu } } -void handle_item_loot(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +void handle_item_loot(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { if(mob && mob->IsCorpse()) { Lua_Corpse l_corpse(mob->CastToCorpse()); luabind::adl::object l_corpse_o = luabind::adl::object(L, l_corpse); @@ -607,15 +607,15 @@ void handle_item_loot(QuestInterface *parse, lua_State* L, Client* client, EQEmu } } -void handle_item_equip(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +void handle_item_equip(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { lua_pushinteger(L, extra_data); lua_setfield(L, -2, "slot_id"); } -void handle_item_augment(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_ItemInst l_item(EQEmu::any_cast(extra_pointers->at(0))); +void handle_item_augment(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { + Lua_ItemInst l_item(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); l_item_o.push(L); lua_setfield(L, -2, "aug"); @@ -624,9 +624,9 @@ void handle_item_augment(QuestInterface *parse, lua_State* L, Client* client, EQ lua_setfield(L, -2, "slot_id"); } -void handle_item_augment_insert(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_ItemInst l_item(EQEmu::any_cast(extra_pointers->at(0))); +void handle_item_augment_insert(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { + Lua_ItemInst l_item(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); l_item_o.push(L); lua_setfield(L, -2, "item"); @@ -635,9 +635,9 @@ void handle_item_augment_insert(QuestInterface *parse, lua_State* L, Client* cli lua_setfield(L, -2, "slot_id"); } -void handle_item_augment_remove(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { - Lua_ItemInst l_item(EQEmu::any_cast(extra_pointers->at(0))); +void handle_item_augment_remove(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { + Lua_ItemInst l_item(EQ::any_cast(extra_pointers->at(0))); luabind::adl::object l_item_o = luabind::adl::object(L, l_item); l_item_o.push(L); lua_setfield(L, -2, "item"); @@ -645,17 +645,17 @@ void handle_item_augment_remove(QuestInterface *parse, lua_State* L, Client* cli lua_pushinteger(L, extra_data); lua_setfield(L, -2, "slot_id"); - lua_pushboolean(L, *EQEmu::any_cast(extra_pointers->at(1))); + lua_pushboolean(L, *EQ::any_cast(extra_pointers->at(1))); lua_setfield(L, -2, "destroyed"); } -void handle_item_null(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +void handle_item_null(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { } //Spell void handle_spell_effect(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(npc) { Lua_Mob l_npc(npc); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); @@ -672,7 +672,7 @@ void handle_spell_effect(QuestInterface *parse, lua_State* L, NPC* npc, Client* lua_setfield(L, -2, "target"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(0))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(0))); lua_setfield(L, -2, "buff_slot"); lua_pushinteger(L, extra_data); @@ -680,7 +680,7 @@ void handle_spell_effect(QuestInterface *parse, lua_State* L, NPC* npc, Client* } void handle_spell_tic(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(npc) { Lua_Mob l_npc(npc); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); @@ -697,13 +697,13 @@ void handle_spell_tic(QuestInterface *parse, lua_State* L, NPC* npc, Client* cli lua_setfield(L, -2, "target"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(0))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(0))); lua_setfield(L, -2, "tics_remaining"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(1))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(1))); lua_setfield(L, -2, "caster_level"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(2))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(2))); lua_setfield(L, -2, "buff_slot"); lua_pushinteger(L, extra_data); @@ -711,7 +711,7 @@ void handle_spell_tic(QuestInterface *parse, lua_State* L, NPC* npc, Client* cli } void handle_spell_fade(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(npc) { Lua_Mob l_npc(npc); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); @@ -731,12 +731,12 @@ void handle_spell_fade(QuestInterface *parse, lua_State* L, NPC* npc, Client* cl lua_pushinteger(L, extra_data); lua_setfield(L, -2, "buff_slot"); - lua_pushinteger(L, *EQEmu::any_cast(extra_pointers->at(0))); + lua_pushinteger(L, *EQ::any_cast(extra_pointers->at(0))); lua_setfield(L, -2, "caster_id"); } void handle_translocate_finish(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(npc) { Lua_Mob l_npc(npc); luabind::adl::object l_npc_o = luabind::adl::object(L, l_npc); @@ -755,17 +755,17 @@ void handle_translocate_finish(QuestInterface *parse, lua_State* L, NPC* npc, Cl } void handle_spell_null(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { } void handle_encounter_timer(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { lua_pushstring(L, data.c_str()); lua_setfield(L, -2, "timer"); } void handle_encounter_load(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if (encounter) { Lua_Encounter l_enc(encounter); luabind::adl::object l_enc_o = luabind::adl::object(L, l_enc); @@ -773,23 +773,23 @@ void handle_encounter_load(QuestInterface *parse, lua_State* L, Encounter* encou lua_setfield(L, -2, "encounter"); } if (extra_pointers) { - std::string *str = EQEmu::any_cast(extra_pointers->at(0)); + std::string *str = EQ::any_cast(extra_pointers->at(0)); lua_pushstring(L, str->c_str()); lua_setfield(L, -2, "data"); } } void handle_encounter_unload(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if (extra_pointers) { - std::string *str = EQEmu::any_cast(extra_pointers->at(0)); + std::string *str = EQ::any_cast(extra_pointers->at(0)); lua_pushstring(L, str->c_str()); lua_setfield(L, -2, "data"); } } void handle_encounter_null(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { } diff --git a/zone/lua_parser_events.h b/zone/lua_parser_events.h index 9eeeb11cb..0f826a421 100644 --- a/zone/lua_parser_events.h +++ b/zone/lua_parser_events.h @@ -2,148 +2,148 @@ #define _EQE_LUA_PARSER_EVENTS_H #ifdef LUA_EQEMU -typedef void(*NPCArgumentHandler)(QuestInterface*, lua_State*, NPC*, Mob*, std::string, uint32, std::vector*); -typedef void(*PlayerArgumentHandler)(QuestInterface*, lua_State*, Client*, std::string, uint32, std::vector*); -typedef void(*ItemArgumentHandler)(QuestInterface*, lua_State*, Client*, EQEmu::ItemInstance*, Mob*, std::string, uint32, std::vector*); -typedef void(*SpellArgumentHandler)(QuestInterface*, lua_State*, NPC*, Client*, uint32, uint32, std::vector*); -typedef void(*EncounterArgumentHandler)(QuestInterface*, lua_State*, Encounter* encounter, std::string, uint32, std::vector*); +typedef void(*NPCArgumentHandler)(QuestInterface*, lua_State*, NPC*, Mob*, std::string, uint32, std::vector*); +typedef void(*PlayerArgumentHandler)(QuestInterface*, lua_State*, Client*, std::string, uint32, std::vector*); +typedef void(*ItemArgumentHandler)(QuestInterface*, lua_State*, Client*, EQ::ItemInstance*, Mob*, std::string, uint32, std::vector*); +typedef void(*SpellArgumentHandler)(QuestInterface*, lua_State*, NPC*, Client*, uint32, uint32, std::vector*); +typedef void(*EncounterArgumentHandler)(QuestInterface*, lua_State*, Encounter* encounter, std::string, uint32, std::vector*); //NPC void handle_npc_event_say(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_event_trade(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_event_hp(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_single_mob(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_single_client(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_single_npc(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_task_accepted(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_popup(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_waypoint(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_hate(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_signal(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_timer(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_death(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_cast(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_area(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_npc_null(QuestInterface *parse, lua_State* L, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); //Player void handle_player_say(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_environmental_damage(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_death(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_timer(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_discover_item(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_fish_forage_success(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_click_object(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_click_door(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_signal(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_popup_response(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_pick_up(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_cast(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_task_fail(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_zone(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_duel_win(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_duel_loss(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_loot(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_task_stage_complete(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_task_update(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_command(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_combine(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_feign(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_area(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_respawn(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_packet(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_null(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_use_skill(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_player_combine_validate(QuestInterface* parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector* extra_pointers); + std::vector* extra_pointers); void handle_player_bot_command(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); //Item -void handle_item_click(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_timer(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_proc(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_loot(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_equip(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_augment(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_augment_insert(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_augment_remove(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); -void handle_item_null(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); +void handle_item_click(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_timer(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_proc(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_loot(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_equip(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_augment(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_augment_insert(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_augment_remove(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); +void handle_item_null(QuestInterface *parse, lua_State* L, Client* client, EQ::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); //Spell void handle_spell_effect(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_spell_tic(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_spell_fade(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_translocate_finish(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_spell_null(QuestInterface *parse, lua_State* L, NPC* npc, Client* client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); //Encounter void handle_encounter_timer(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_encounter_load(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_encounter_unload(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); void handle_encounter_null(QuestInterface *parse, lua_State* L, Encounter* encounter, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); #endif #endif diff --git a/zone/lua_raid.cpp b/zone/lua_raid.cpp index c181b8bd2..78f6bb1b6 100644 --- a/zone/lua_raid.cpp +++ b/zone/lua_raid.cpp @@ -4,7 +4,6 @@ #include #include -#include "raid.h" #include "masterentity.h" #include "lua_raid.h" #include "lua_entity.h" @@ -132,6 +131,17 @@ int Lua_Raid::GetGroupNumber(int index) { return self->members[index].GroupNumber; } +bool Lua_Raid::DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name) +{ + Lua_Safe_Call_Bool(); + return self->DoesAnyMemberHaveExpeditionLockout(expedition_name, event_name); +} + +bool Lua_Raid::DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name, int max_check_count) +{ + Lua_Safe_Call_Bool(); + return self->DoesAnyMemberHaveExpeditionLockout(expedition_name, event_name, max_check_count); +} luabind::scope lua_register_raid() { return luabind::class_("Raid") @@ -158,7 +168,9 @@ luabind::scope lua_register_raid() { .def("TeleportRaid", (int(Lua_Raid::*)(Lua_Mob,uint32,uint32,float,float,float,float))&Lua_Raid::TeleportRaid) .def("GetID", (int(Lua_Raid::*)(void))&Lua_Raid::GetID) .def("GetMember", (Lua_Client(Lua_Raid::*)(int))&Lua_Raid::GetMember) - .def("GetGroupNumber", (int(Lua_Raid::*)(int))&Lua_Raid::GetGroupNumber); + .def("GetGroupNumber", (int(Lua_Raid::*)(int))&Lua_Raid::GetGroupNumber) + .def("DoesAnyMemberHaveExpeditionLockout", (bool(Lua_Raid::*)(std::string, std::string))&Lua_Raid::DoesAnyMemberHaveExpeditionLockout) + .def("DoesAnyMemberHaveExpeditionLockout", (bool(Lua_Raid::*)(std::string, std::string, int))&Lua_Raid::DoesAnyMemberHaveExpeditionLockout); } #endif diff --git a/zone/lua_raid.h b/zone/lua_raid.h index bc10a729c..9eb100f59 100644 --- a/zone/lua_raid.h +++ b/zone/lua_raid.h @@ -48,6 +48,8 @@ public: int GetID(); Lua_Client GetMember(int index); int GetGroupNumber(int index); + bool DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name); + bool DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name, int max_check_count); }; #endif diff --git a/zone/main.cpp b/zone/main.cpp index c7c03a33a..b81a41f5b 100644 --- a/zone/main.cpp +++ b/zone/main.cpp @@ -1,45 +1,39 @@ -/* 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 -*/ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ #define DONT_SHARED_OPCODES #define PLATFORM_ZONE 1 #include "../common/global_define.h" -#include "../common/features.h" -#include "../common/queue.h" #include "../common/timer.h" #include "../common/eq_packet_structs.h" #include "../common/mutex.h" -#include "../common/version.h" -#include "../common/packet_dump_file.h" #include "../common/opcodemgr.h" #include "../common/guilds.h" #include "../common/eq_stream_ident.h" #include "../common/patches/patches.h" #include "../common/rulesys.h" #include "../common/profanity_manager.h" -#include "../common/misc_functions.h" #include "../common/string_util.h" -#include "../common/platform.h" #include "../common/crash.h" -#include "../common/ipc_mutex.h" #include "../common/memory_mapped_file.h" -#include "../common/eqemu_exception.h" #include "../common/spdat.h" #include "../common/eqemu_logsys.h" @@ -53,30 +47,23 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #ifdef BOTS #include "bot_command.h" #endif -#include "zone_config.h" +#include "zonedb.h" +#include "zone_store.h" #include "titles.h" #include "guild_mgr.h" -#include "tasks.h" +#include "task_manager.h" #include "quest_parser_collection.h" #include "embparser.h" #include "lua_parser.h" #include "questmgr.h" #include "npc_scale_manager.h" -#include "../common/event/event_loop.h" -#include "../common/event/timer.h" #include "../common/net/eqstream.h" -#include "../common/net/servertalk_server.h" +#include "../common/content/world_content_service.h" -#include -#include -#include #include -#include #include #include -#include -#include #include #ifdef _CRTDBG_MAP_ALLOC @@ -90,23 +77,33 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #else #include #include "../common/unix.h" +#include "zone_store.h" +#include "zone_event_scheduler.h" + #endif volatile bool RunLoops = true; +#ifdef __FreeBSD__ +#include +#endif + extern volatile bool is_zone_loaded; EntityList entity_list; WorldServer worldserver; +ZoneStore zone_store; uint32 numclients = 0; char errorname[32]; extern Zone* zone; npcDecayTimes_Struct npcCorpseDecayTimes[100]; TitleManager title_manager; -QueryServ *QServ = 0; -TaskManager *taskmanager = 0; +QueryServ *QServ = 0; +TaskManager *task_manager = 0; NpcScaleManager *npc_scale_manager; QuestParserCollection *parse = 0; -EQEmuLogSys LogSys; +EQEmuLogSys LogSys; +ZoneEventScheduler event_scheduler; +WorldContentService content_service; const SPDat_Spell_Struct* spells; int32 SPDAT_RECORDS = -1; const ZoneConfig *Config; @@ -246,7 +243,8 @@ int main(int argc, char** argv) { Config->ContentDbUsername.c_str(), Config->ContentDbPassword.c_str(), Config->ContentDbName.c_str(), - Config->ContentDbPort + Config->ContentDbPort, + "content" )) { LogError("Cannot continue without a content database connection"); return 1; @@ -264,12 +262,6 @@ int main(int argc, char** argv) { guild_mgr.SetDatabase(&database); GuildBanks = nullptr; - /** - * NPC Scale Manager - */ - npc_scale_manager = new NpcScaleManager; - npc_scale_manager->LoadScaleData(); - #ifdef _EQDEBUG _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif @@ -308,7 +300,8 @@ int main(int argc, char** argv) { } LogInfo("Loading zone names"); - content_db.LoadZoneNames(); + + zone_store.LoadZones(); LogInfo("Loading items"); if (!database.LoadItems(hotfix_name)) { @@ -327,7 +320,7 @@ int main(int argc, char** argv) { return 1; } LogInfo("Loading skill caps"); - if (!database.LoadSkillCaps(std::string(hotfix_name))) { + if (!content_db.LoadSkillCaps(std::string(hotfix_name))) { LogError("Loading skill caps failed!"); return 1; } @@ -360,12 +353,12 @@ int main(int argc, char** argv) { database.GetDecayTimes(npcCorpseDecayTimes); LogInfo("Loading profanity list"); - if (!EQEmu::ProfanityManager::LoadProfanityList(&database)) + if (!EQ::ProfanityManager::LoadProfanityList(&database)) LogError("Loading profanity list failed!"); LogInfo("Loading commands"); int retval = command_init(); - if (retval<0) + if (retval < 0) LogError("Command loading failed"); else LogInfo("{} commands loaded", retval); @@ -388,10 +381,16 @@ int main(int argc, char** argv) { } } - EQEmu::InitializeDynamicLookups(); + EQ::InitializeDynamicLookups(); LogInfo("Initialized dynamic dictionary entries"); } + content_service.SetExpansionContext(); + + ZoneStore::LoadContentFlags(); + + event_scheduler.SetDatabase(&database)->LoadScheduledEvents(); + #ifdef BOTS LogInfo("Loading bot commands"); int botretval = bot_command_init(); @@ -405,10 +404,15 @@ int main(int argc, char** argv) { LogError("Bot spell casting chances loading failed"); #endif + /** + * NPC Scale Manager + */ + npc_scale_manager = new NpcScaleManager; + npc_scale_manager->LoadScaleData(); + if (RuleB(TaskSystem, EnableTaskSystem)) { - Log(Logs::General, Logs::Tasks, "[INIT] Loading Tasks"); - taskmanager = new TaskManager; - taskmanager->LoadTasks(); + task_manager = new TaskManager; + task_manager->LoadTasks(); } parse = new QuestParserCollection(); @@ -430,6 +434,7 @@ int main(int argc, char** argv) { parse->ReloadQuests(); worldserver.Connect(); + worldserver.SetScheduler(&event_scheduler); Timer InterserverTimer(INTERSERVER_TIMER); // does MySQL pings and auto-reconnect #ifdef EQPROFILE @@ -441,17 +446,19 @@ int main(int argc, char** argv) { if (!strlen(zone_name) || !strcmp(zone_name, ".")) { LogInfo("Entering sleep mode"); } - else if (!Zone::Bootup(content_db.GetZoneID(zone_name), instance_id, true)) { + else if (!Zone::Bootup(ZoneID(zone_name), instance_id, true)) { LogError("Zone Bootup failed :: Zone::Bootup"); - zone = 0; + zone = nullptr; } //register all the patches we have avaliable with the stream identifier. EQStreamIdentifier stream_identifier; RegisterAllPatches(stream_identifier); -#ifndef WIN32 +#ifdef __linux__ LogDebug("Main thread running with thread id [{}]", pthread_self()); +#elif defined(__FreeBSD__) + LogDebug("Main thread running with thread id [{}]", pthread_getthreadid_np()); #endif bool worldwasconnected = worldserver.Connected(); @@ -482,7 +489,7 @@ int main(int argc, char** argv) { */ if (!websocker_server_opened && Config->ZonePort != 0) { LogInfo("Websocket Server listener started ([{}]:[{}])", Config->TelnetIP.c_str(), Config->ZonePort); - ws_server.reset(new EQ::Net::WebsocketServer(Config->TelnetIP, Config->ZonePort)); + ws_server = std::make_unique(Config->TelnetIP, Config->ZonePort); RegisterApiService(ws_server); websocker_server_opened = true; } @@ -499,7 +506,7 @@ int main(int argc, char** argv) { opts.daybreak_options.resend_delay_min = RuleI(Network, ResendDelayMinMS); opts.daybreak_options.resend_delay_max = RuleI(Network, ResendDelayMaxMS); opts.daybreak_options.outgoing_data_rate = RuleR(Network, ClientDataRate); - eqsm.reset(new EQ::Net::EQStreamManager(opts)); + eqsm = std::make_unique(opts); eqsf_open = true; eqsm->OnNewConnection([&stream_identifier](std::shared_ptr stream) { @@ -539,11 +546,11 @@ int main(int argc, char** argv) { entity_list.CorpseProcess(); entity_list.TrapProcess(); entity_list.RaidProcess(); - entity_list.Process(); entity_list.MobProcess(); entity_list.BeaconProcess(); entity_list.EncounterProcess(); + event_scheduler.Process(zone, &content_service); if (zone) { if (!zone->Process()) { @@ -585,7 +592,8 @@ int main(int argc, char** argv) { if (zone != 0) Zone::Shutdown(true); //Fix for Linux world server problem. - safe_delete(taskmanager); + safe_delete(task_manager); + safe_delete(npc_scale_manager); command_deinit(); #ifdef BOTS bot_command_deinit(); @@ -596,19 +604,19 @@ int main(int argc, char** argv) { return 0; } +void Shutdown() +{ + Zone::Shutdown(true); + LogInfo("Shutting down..."); + LogSys.CloseFileLogs(); + EQ::EventLoop::Get().Shutdown(); +} + void CatchSignal(int sig_num) { #ifdef _WINDOWS LogInfo("Recieved signal: [{}]", sig_num); #endif - RunLoops = false; -} - -void Shutdown() -{ - Zone::Shutdown(true); - RunLoops = false; - LogInfo("Shutting down..."); - LogSys.CloseFileLogs(); + Shutdown(); } /* Update Window Title with relevant information */ diff --git a/zone/map.cpp b/zone/map.cpp index dbfa3928e..3d35aeabc 100644 --- a/zone/map.cpp +++ b/zone/map.cpp @@ -403,7 +403,7 @@ bool Map::LoadV2(FILE *f) { std::vector buffer; buffer.resize(buffer_size); - uint32 v = EQEmu::InflateData(&data[0], data_size, &buffer[0], buffer_size); + uint32 v = EQ::InflateData(&data[0], data_size, &buffer[0], buffer_size); char *buf = &buffer[0]; uint32 vert_count; diff --git a/zone/merc.cpp b/zone/merc.cpp index 2a165ec71..1da2cd1ae 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -50,7 +50,7 @@ Merc::Merc(const NPCType* d, float x, float y, float z, float heading) _baseFR = d->FR; _basePR = d->PR; _baseCorrup = d->Corrup; - _OwnerClientVersion = static_cast(EQEmu::versions::ClientVersion::Titanium); + _OwnerClientVersion = static_cast(EQ::versions::ClientVersion::Titanium); RestRegenHP = 0; RestRegenMana = 0; RestRegenEndurance = 0; @@ -66,15 +66,15 @@ Merc::Merc(const NPCType* d, float x, float y, float z, float heading) memset(equipment, 0, sizeof(equipment)); SetMercID(0); - SetStance(EQEmu::constants::stanceBalanced); + SetStance(EQ::constants::stanceBalanced); rest_timer.Disable(); if (GetClass() == ROGUE) evade_timer.Start(); int r; - for (r = 0; r <= EQEmu::skills::HIGHEST_SKILL; r++) { - skills[r] = database.GetSkillCap(GetClass(), (EQEmu::skills::SkillType)r, GetLevel()); + for (r = 0; r <= EQ::skills::HIGHEST_SKILL; r++) { + skills[r] = content_db.GetSkillCap(GetClass(), (EQ::skills::SkillType)r, GetLevel()); } size = d->size; @@ -217,12 +217,12 @@ void Merc::CalcItemBonuses(StatBonuses* newbon) { unsigned int i; //should not include 21 (SLOT_AMMO) - for (i = EQEmu::invslot::BONUS_BEGIN; i <= EQEmu::invslot::BONUS_STAT_END; i++) { - if (i == EQEmu::invslot::slotAmmo) + for (i = EQ::invslot::BONUS_BEGIN; i <= EQ::invslot::BONUS_STAT_END; i++) { + if (i == EQ::invslot::slotAmmo) continue; if (equipment[i] == 0) continue; - const EQEmu::ItemData * itm = database.GetItem(equipment[i]); + const EQ::ItemData * itm = database.GetItem(equipment[i]); if (itm) AddItemBonuses(itm, newbon); } @@ -240,7 +240,7 @@ void Merc::CalcItemBonuses(StatBonuses* newbon) { SetAttackTimer(); } -void Merc::AddItemBonuses(const EQEmu::ItemData *item, StatBonuses* newbon) { +void Merc::AddItemBonuses(const EQ::ItemData *item, StatBonuses* newbon) { if(GetLevel() < item->ReqLevel) { @@ -453,11 +453,11 @@ void Merc::AddItemBonuses(const EQEmu::ItemData *item, StatBonuses* newbon) { else newbon->DSMitigation += item->DSMitigation; } - if (item->Worn.Effect>0 && (item->Worn.Type == EQEmu::item::ItemEffectWorn)) { // latent effects + if (item->Worn.Effect>0 && (item->Worn.Type == EQ::item::ItemEffectWorn)) { // latent effects ApplySpellsBonuses(item->Worn.Effect, item->Worn.Level, newbon, 0, item->Worn.Type); } - if (item->Focus.Effect>0 && (item->Focus.Type == EQEmu::item::ItemEffectFocus)) { // focus effects + if (item->Focus.Effect>0 && (item->Focus.Type == EQ::item::ItemEffectFocus)) { // focus effects ApplySpellsBonuses(item->Focus.Effect, item->Focus.Level, newbon, 0); } @@ -509,7 +509,7 @@ void Merc::AddItemBonuses(const EQEmu::ItemData *item, StatBonuses* newbon) { } } - if (item->SkillModValue != 0 && item->SkillModType <= EQEmu::skills::HIGHEST_SKILL){ + if (item->SkillModValue != 0 && item->SkillModType <= EQ::skills::HIGHEST_SKILL){ if ((item->SkillModValue > 0 && newbon->skillmod[item->SkillModType] < item->SkillModValue) || (item->SkillModValue < 0 && newbon->skillmod[item->SkillModType] > item->SkillModValue)) { @@ -563,7 +563,7 @@ void Merc::AddItemBonuses(const EQEmu::ItemData *item, StatBonuses* newbon) { } } - if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= EQEmu::skills::HIGHEST_SKILL) { + if (item->ExtraDmgSkill != 0 && item->ExtraDmgSkill <= EQ::skills::HIGHEST_SKILL) { if((newbon->SkillDamageAmount[item->ExtraDmgSkill] + item->ExtraDmgAmt) > RuleI(Character, ItemExtraDmgCap)) newbon->SkillDamageAmount[item->ExtraDmgSkill] = RuleI(Character, ItemExtraDmgCap); else @@ -928,8 +928,8 @@ int32 Merc::CalcBaseManaRegen() int32 regen = 0; if (IsSitting()) { - if (HasSkill(EQEmu::skills::SkillMeditate)) - regen = (((GetSkill(EQEmu::skills::SkillMeditate) / 10) + (clevel - (clevel / 4))) / 4) + 4; + if (HasSkill(EQ::skills::SkillMeditate)) + regen = (((GetSkill(EQ::skills::SkillMeditate) / 10) + (clevel - (clevel / 4))) / 4) + 4; else regen = 2; } @@ -945,9 +945,9 @@ int32 Merc::CalcManaRegen() if (IsSitting()) { BuffFadeBySitModifier(); - if (HasSkill(EQEmu::skills::SkillMeditate)) { + if (HasSkill(EQ::skills::SkillMeditate)) { this->_medding = true; - regen = ((GetSkill(EQEmu::skills::SkillMeditate) / 10) + mana_regen); + regen = ((GetSkill(EQ::skills::SkillMeditate) / 10) + mana_regen); regen += spellbonuses.ManaRegen + itembonuses.ManaRegen; } else @@ -1015,7 +1015,7 @@ int32 Merc::CalcBaseEndurance() int32 sta_end = 0; int Stats = 0; - if (GetClientVersion() >= static_cast(EQEmu::versions::ClientVersion::SoD) && RuleB(Character, SoDClientUseSoDHPManaEnd)) { + if (GetClientVersion() >= static_cast(EQ::versions::ClientVersion::SoD) && RuleB(Character, SoDClientUseSoDHPManaEnd)) { int HeroicStats = 0; Stats = ((GetSTR() + GetSTA() + GetDEX() + GetAGI()) / 4); @@ -1175,17 +1175,17 @@ void Merc::CalcRestState() { RestRegenEndurance = 6 * (GetMaxEndurance() / zone->newzone_data.FastRegenEndurance); } -bool Merc::HasSkill(EQEmu::skills::SkillType skill_id) const { +bool Merc::HasSkill(EQ::skills::SkillType skill_id) const { return((GetSkill(skill_id) > 0) && CanHaveSkill(skill_id)); } -bool Merc::CanHaveSkill(EQEmu::skills::SkillType skill_id) const { - return(database.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)) > 0); +bool Merc::CanHaveSkill(EQ::skills::SkillType skill_id) const { + return(content_db.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)) > 0); //if you don't have it by max level, then odds are you never will? } -uint16 Merc::MaxSkill(EQEmu::skills::SkillType skillid, uint16 class_, uint16 level) const { - return(database.GetSkillCap(class_, skillid, level)); +uint16 Merc::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { + return(content_db.GetSkillCap(class_, skillid, level)); } void Merc::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { @@ -1207,7 +1207,7 @@ void Merc::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { ns->spawn.show_name = true; UpdateActiveLight(); - ns->spawn.light = m_Light.Type[EQEmu::lightsource::LightActive]; + ns->spawn.light = m_Light.Type[EQ::lightsource::LightActive]; /* // Wear Slots are not setup for Mercs yet @@ -1518,12 +1518,12 @@ void Merc::AI_Process() { // Hate redux actions if (evade_timer.Check(false)) { // Attempt to evade - int timer_duration = (HideReuseTime - GetSkillReuseTime(EQEmu::skills::SkillHide)) * 1000; + int timer_duration = (HideReuseTime - GetSkillReuseTime(EQ::skills::SkillHide)) * 1000; if (timer_duration < 0) timer_duration = 0; evade_timer.Start(timer_duration); - if (zone->random.Int(0, 260) < (int)GetSkill(EQEmu::skills::SkillHide)) + if (zone->random.Int(0, 260) < (int)GetSkill(EQ::skills::SkillHide)) RogueEvade(GetTarget()); return; @@ -1590,24 +1590,24 @@ void Merc::AI_Process() { //try main hand first if(attack_timer.Check()) { - Attack(GetTarget(), EQEmu::invslot::slotPrimary); + Attack(GetTarget(), EQ::invslot::slotPrimary); bool tripleSuccess = false; if(GetOwner() && GetTarget() && CanThisClassDoubleAttack()) { if(GetOwner()) { - Attack(GetTarget(), EQEmu::invslot::slotPrimary, true); + Attack(GetTarget(), EQ::invslot::slotPrimary, true); } if(GetOwner() && GetTarget() && GetSpecialAbility(SPECATK_TRIPLE)) { tripleSuccess = true; - Attack(GetTarget(), EQEmu::invslot::slotPrimary, true); + Attack(GetTarget(), EQ::invslot::slotPrimary, true); } //quad attack, does this belong here?? if(GetOwner() && GetTarget() && GetSpecialAbility(SPECATK_QUAD)) { - Attack(GetTarget(), EQEmu::invslot::slotPrimary, true); + Attack(GetTarget(), EQ::invslot::slotPrimary, true); } } @@ -1619,8 +1619,8 @@ void Merc::AI_Process() { if(zone->random.Roll(flurrychance)) { MessageString(Chat::NPCFlurry, YOU_FLURRY); - Attack(GetTarget(), EQEmu::invslot::slotPrimary, false); - Attack(GetTarget(), EQEmu::invslot::slotPrimary, false); + Attack(GetTarget(), EQ::invslot::slotPrimary, false); + Attack(GetTarget(), EQ::invslot::slotPrimary, false); } } @@ -1629,7 +1629,7 @@ void Merc::AI_Process() { if (GetTarget() && ExtraAttackChanceBonus) { if(zone->random.Roll(ExtraAttackChanceBonus)) { - Attack(GetTarget(), EQEmu::invslot::slotPrimary, false); + Attack(GetTarget(), EQ::invslot::slotPrimary, false); } } } @@ -1653,23 +1653,23 @@ void Merc::AI_Process() { bool bIsFist = true; // why are we checking 'weapontype' when we know it's set to '0' above? - if (bIsFist || ((weapontype != EQEmu::item::ItemType2HSlash) && (weapontype != EQEmu::item::ItemType2HPiercing) && (weapontype != EQEmu::item::ItemType2HBlunt))) + if (bIsFist || ((weapontype != EQ::item::ItemType2HSlash) && (weapontype != EQ::item::ItemType2HPiercing) && (weapontype != EQ::item::ItemType2HBlunt))) { float DualWieldProbability = 0.0f; int16 Ambidexterity = aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity; - DualWieldProbability = (GetSkill(EQEmu::skills::SkillDualWield) + GetLevel() + Ambidexterity) / 400.0f; // 78.0 max + DualWieldProbability = (GetSkill(EQ::skills::SkillDualWield) + GetLevel() + Ambidexterity) / 400.0f; // 78.0 max int16 DWBonus = spellbonuses.DualWieldChance + itembonuses.DualWieldChance; DualWieldProbability += DualWieldProbability*float(DWBonus)/ 100.0f; // Max 78% of DW if (zone->random.Roll(DualWieldProbability)) { - Attack(GetTarget(), EQEmu::invslot::slotSecondary); // Single attack with offhand + Attack(GetTarget(), EQ::invslot::slotSecondary); // Single attack with offhand if(CanThisClassDoubleAttack()) { if(GetTarget() && GetTarget()->GetHP() > -10) - Attack(GetTarget(), EQEmu::invslot::slotSecondary); // Single attack with offhand + Attack(GetTarget(), EQ::invslot::slotSecondary); // Single attack with offhand } } } @@ -1993,7 +1993,7 @@ bool Merc::AIDoSpellCast(uint16 spellid, Mob* tar, int32 mana_cost, uint32* oDon SentPositionPacket(0.0f, 0.0f, 0.0f, 0.0f, 0); SetMoving(false); - result = CastSpell(spellid, tar->GetID(), EQEmu::spells::CastingSlot::Gem2, -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, 0); + result = CastSpell(spellid, tar->GetID(), EQ::spells::CastingSlot::Gem2, -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, 0); if(IsCasting() && IsSitting()) Stand(); @@ -2154,16 +2154,9 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) { } if(castedSpell) { - char* gmsg = nullptr; - if(tar && tar != this) { // [tar] was implicitly valid at this point..this change is to catch any bad logic //we don't need spam of bots healing themselves - MakeAnyLenString(&gmsg, "Casting %s on %s.", spells[selectedMercSpell.spellid].name, tar->GetCleanName()); - if(gmsg) - { - MercGroupSay(this, gmsg); - safe_delete_array(gmsg); - } + MercGroupSay(this, "Casting %s on %s.", spells[selectedMercSpell.spellid].name, tar->GetCleanName()); } } @@ -2348,7 +2341,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) { continue; } - if (spells[selectedMercSpell.spellid].skill == EQEmu::skills::SkillBackstab && spells[selectedMercSpell.spellid].targettype == ST_Self) { + if (spells[selectedMercSpell.spellid].skill == EQ::skills::SkillBackstab && spells[selectedMercSpell.spellid].targettype == ST_Self) { if(!hidden) { continue; } @@ -2577,15 +2570,15 @@ int16 Merc::GetFocusEffect(focusType type, uint16 spell_id) { //Check if item focus effect exists for the client. if (itembonuses.FocusEffects[type]){ - const EQEmu::ItemData* TempItem = nullptr; - const EQEmu::ItemData* UsedItem = nullptr; + const EQ::ItemData* TempItem = nullptr; + const EQ::ItemData* UsedItem = nullptr; uint16 UsedFocusID = 0; int16 Total = 0; int16 focus_max = 0; int16 focus_max_real = 0; //item focus - for (int x = EQEmu::invslot::EQUIPMENT_BEGIN; x <= EQEmu::invslot::EQUIPMENT_END; ++x) + for (int x = EQ::invslot::EQUIPMENT_BEGIN; x <= EQ::invslot::EQUIPMENT_END; ++x) { TempItem = nullptr; if (equipment[x] == 0) @@ -3669,13 +3662,13 @@ MercSpell Merc::GetBestMercSpellForAENuke(Merc* caster, Mob* tar) { switch(caster->GetStance()) { - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurnAE: initialCastChance = 50; break; - case EQEmu::constants::stanceBalanced: + case EQ::constants::stanceBalanced: initialCastChance = 25; break; - case EQEmu::constants::stanceBurn: + case EQ::constants::stanceBurn: initialCastChance = 0; break; } @@ -3717,11 +3710,11 @@ MercSpell Merc::GetBestMercSpellForTargetedAENuke(Merc* caster, Mob* tar) { switch(caster->GetStance()) { - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurnAE: numTargetsCheck = 1; break; - case EQEmu::constants::stanceBalanced: - case EQEmu::constants::stanceBurn: + case EQ::constants::stanceBalanced: + case EQ::constants::stanceBurn: numTargetsCheck = 2; break; } @@ -3769,11 +3762,11 @@ MercSpell Merc::GetBestMercSpellForPBAENuke(Merc* caster, Mob* tar) { switch(caster->GetStance()) { - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurnAE: numTargetsCheck = 2; break; - case EQEmu::constants::stanceBalanced: - case EQEmu::constants::stanceBurn: + case EQ::constants::stanceBalanced: + case EQ::constants::stanceBurn: numTargetsCheck = 3; break; } @@ -3820,11 +3813,11 @@ MercSpell Merc::GetBestMercSpellForAERainNuke(Merc* caster, Mob* tar) { switch(caster->GetStance()) { - case EQEmu::constants::stanceBurnAE: + case EQ::constants::stanceBurnAE: numTargetsCheck = 1; break; - case EQEmu::constants::stanceBalanced: - case EQEmu::constants::stanceBurn: + case EQ::constants::stanceBalanced: + case EQ::constants::stanceBurn: numTargetsCheck = 2; break; } @@ -4045,7 +4038,7 @@ bool Merc::UseDiscipline(int32 spell_id, int32 target) { if(IsCasting()) InterruptSpell(); - CastSpell(spell_id, target, EQEmu::spells::CastingSlot::Discipline); + CastSpell(spell_id, target, EQ::spells::CastingSlot::Discipline); return(true); } @@ -4461,25 +4454,25 @@ void Merc::DoClassAttacks(Mob *target) { if(zone->random.Int(0, 100) > 25) //tested on live, warrior mobs both kick and bash, kick about 75% of the time, casting doesn't seem to make a difference. { DoAnim(animKick, 0, false); - int32 dmg = GetBaseSkillDamage(EQEmu::skills::SkillKick); + int32 dmg = GetBaseSkillDamage(EQ::skills::SkillKick); - if (GetWeaponDamage(target, (const EQEmu::ItemData*)nullptr) <= 0) + if (GetWeaponDamage(target, (const EQ::ItemData*)nullptr) <= 0) dmg = DMG_INVULNERABLE; reuse = KickReuseTime * 1000; - DoSpecialAttackDamage(target, EQEmu::skills::SkillKick, dmg, 1, -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillKick, dmg, 1, -1, reuse); did_attack = true; } else { DoAnim(animTailRake, 0, false); - int32 dmg = GetBaseSkillDamage(EQEmu::skills::SkillBash); + int32 dmg = GetBaseSkillDamage(EQ::skills::SkillBash); - if (GetWeaponDamage(target, (const EQEmu::ItemData*)nullptr) <= 0) + if (GetWeaponDamage(target, (const EQ::ItemData*)nullptr) <= 0) dmg = DMG_INVULNERABLE; reuse = BashReuseTime * 1000; - DoSpecialAttackDamage(target, EQEmu::skills::SkillBash, dmg, 1, -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillBash, dmg, 1, -1, reuse); did_attack = true; } } @@ -4501,7 +4494,7 @@ bool Merc::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, boo return NPC::Attack(other, Hand, bRiposte, IsStrikethrough, IsFromSpell, opts); } -void Merc::Damage(Mob* other, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) +void Merc::Damage(Mob* other, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable, int8 buffslot, bool iBuffTic, eSpecialAttacks special) { if(IsDead() || IsCorpse()) return; @@ -4542,7 +4535,7 @@ Mob* Merc::GetOwnerOrSelf() { return Result; } -bool Merc::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::SkillType attack_skill) +bool Merc::Death(Mob* killerMob, int32 damage, uint16 spell, EQ::skills::SkillType attack_skill) { if(!NPC::Death(killerMob, damage, spell, attack_skill)) { @@ -4798,7 +4791,12 @@ Merc* Merc::LoadMerc(Client *c, MercTemplate* merc_template, uint32 merchant_id, tmpsize = c->GetMercInfo().MercSize; } - sprintf(npc_type->lastname, "%s's Mercenary", c->GetName()); + std::string tmp_lastname = c->GetName(); + tmp_lastname += "'s Mercenary"; + + // not sure what to do if too long + if (tmp_lastname.length() < sizeof(npc_type->lastname)) + strn0cpy(npc_type->lastname, tmp_lastname.c_str(), sizeof(npc_type->lastname)); npc_type->gender = tmpgender; npc_type->size = tmpsize; npc_type->loottable_id = 0; // Loottable has to be 0, otherwise we'll be leavin' some corpses! @@ -5062,12 +5060,12 @@ void Merc::ScaleStats(int scalepercent, bool setmax) { void Merc::UpdateMercAppearance() { // Copied from Bot Code: uint32 itemID = 0; - uint8 materialFromSlot = EQEmu::textures::materialInvalid; - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; ++i) { + uint8 materialFromSlot = EQ::textures::materialInvalid; + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; ++i) { itemID = equipment[i]; if(itemID != 0) { - materialFromSlot = EQEmu::InventoryProfile::CalcMaterialFromSlot(i); - if (materialFromSlot != EQEmu::textures::materialInvalid) + materialFromSlot = EQ::InventoryProfile::CalcMaterialFromSlot(i); + if (materialFromSlot != EQ::textures::materialInvalid) this->SendWearChange(materialFromSlot); } } @@ -5078,18 +5076,18 @@ void Merc::UpdateMercAppearance() { void Merc::UpdateEquipmentLight() { - m_Light.Type[EQEmu::lightsource::LightEquipment] = 0; - m_Light.Level[EQEmu::lightsource::LightEquipment] = 0; + m_Light.Type[EQ::lightsource::LightEquipment] = 0; + m_Light.Level[EQ::lightsource::LightEquipment] = 0; - for (int index = EQEmu::invslot::EQUIPMENT_BEGIN; index <= EQEmu::invslot::EQUIPMENT_END; ++index) { - if (index == EQEmu::invslot::slotAmmo) { continue; } + for (int index = EQ::invslot::EQUIPMENT_BEGIN; index <= EQ::invslot::EQUIPMENT_END; ++index) { + if (index == EQ::invslot::slotAmmo) { continue; } auto item = database.GetItem(equipment[index]); if (item == nullptr) { continue; } - if (EQEmu::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQEmu::lightsource::LightEquipment])) { - m_Light.Type[EQEmu::lightsource::LightEquipment] = item->Light; - m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); + if (EQ::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQ::lightsource::LightEquipment])) { + m_Light.Type[EQ::lightsource::LightEquipment] = item->Light; + m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } } @@ -5101,14 +5099,14 @@ void Merc::UpdateEquipmentLight() if (!item->IsClassCommon()) { continue; } if (item->Light < 9 || item->Light > 13) { continue; } - if (EQEmu::lightsource::TypeToLevel(item->Light)) + if (EQ::lightsource::TypeToLevel(item->Light)) general_light_type = item->Light; } - if (EQEmu::lightsource::IsLevelGreater(general_light_type, m_Light.Type[EQEmu::lightsource::LightEquipment])) - m_Light.Type[EQEmu::lightsource::LightEquipment] = general_light_type; + if (EQ::lightsource::IsLevelGreater(general_light_type, m_Light.Type[EQ::lightsource::LightEquipment])) + m_Light.Type[EQ::lightsource::LightEquipment] = general_light_type; - m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); + m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } void Merc::AddItem(uint8 slot, uint32 item_id) { @@ -5164,109 +5162,109 @@ void Client::SendMercResponsePackets(uint32 ResponseType) SendMercMerchantResponsePacket(6); break; case 7: //You must dismiss your suspended mercenary before purchasing a new one! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(7); else //You have the maximum number of mercenaries. You must dismiss one before purchasing a new one! SendMercMerchantResponsePacket(6); break; case 8: //You can not purchase a mercenary because your group is full! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(8); else SendMercMerchantResponsePacket(7); break; case 9: //You can not purchase a mercenary because you are in combat! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) //Mercenary failed to spawn! SendMercMerchantResponsePacket(3); else SendMercMerchantResponsePacket(8); break; case 10: //You have recently dismissed a mercenary and must wait a few more seconds before you can purchase a new one! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) //Mercenary failed to spawn! SendMercMerchantResponsePacket(3); else SendMercMerchantResponsePacket(9); break; case 11: //An error occurred created your mercenary! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(9); else SendMercMerchantResponsePacket(10); break; case 12: //Upkeep Charge Message - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(10); else SendMercMerchantResponsePacket(11); break; case 13: // ??? - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(11); else SendMercMerchantResponsePacket(12); break; case 14: //You ran out of funds to pay for your mercenary! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(12); else SendMercMerchantResponsePacket(13); break; case 15: // ??? - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(13); else SendMercMerchantResponsePacket(14); break; case 16: //Your mercenary is about to be suspended due to insufficient funds! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(14); else SendMercMerchantResponsePacket(15); break; case 17: //There is no mercenary liaison nearby! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(15); else SendMercMerchantResponsePacket(16); break; case 18: //You are too far from the liaison! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(16); else SendMercMerchantResponsePacket(17); break; case 19: //You do not meet the requirements for that mercenary! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) SendMercMerchantResponsePacket(17); else SendMercMerchantResponsePacket(18); break; case 20: //You are unable to interact with the liaison! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) //You are too far from the liaison! SendMercMerchantResponsePacket(16); else SendMercMerchantResponsePacket(19); break; case 21: //You do not have a high enough membership level to purchase this mercenary! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) //You do not meet the requirements for that mercenary! SendMercMerchantResponsePacket(17); else SendMercMerchantResponsePacket(20); break; case 22: //Your purchase has failed because this mercenary requires a Gold membership! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) //You do not meet the requirements for that mercenary! SendMercMerchantResponsePacket(17); else SendMercMerchantResponsePacket(21); break; case 23: //Your purchase has failed because this mercenary requires at least a Silver membership! - if (ClientVersion() < EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() < EQ::versions::ClientVersion::RoF) //You do not meet the requirements for that mercenary! SendMercMerchantResponsePacket(17); else @@ -5649,7 +5647,7 @@ void Client::SpawnMerc(Merc* merc, bool setMaxStats) { merc->SetSuspended(false); SetMerc(merc); merc->Unsuspend(setMaxStats); - merc->SetStance((EQEmu::constants::StanceType)GetMercInfo().Stance); + merc->SetStance((EQ::constants::StanceType)GetMercInfo().Stance); Log(Logs::General, Logs::Mercenaries, "SpawnMerc Success for %s.", GetName()); @@ -6106,7 +6104,7 @@ void Client::UpdateMercLevel() { void Client::SendMercMerchantResponsePacket(int32 response_type) { // This response packet brings up the Mercenary Manager window - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) { auto outapp = new EQApplicationPacket(OP_MercenaryHire, sizeof(MercenaryMerchantResponse_Struct)); MercenaryMerchantResponse_Struct* mmr = (MercenaryMerchantResponse_Struct*)outapp->pBuffer; diff --git a/zone/merc.h b/zone/merc.h index 0fdc05f7a..efd27f703 100644 --- a/zone/merc.h +++ b/zone/merc.h @@ -12,7 +12,7 @@ struct MercTemplate; struct NPCType; struct NewSpawn_Struct; -namespace EQEmu +namespace EQ { struct ItemData; } @@ -52,9 +52,9 @@ public: virtual ~Merc(); //abstract virtual function implementations requird by base abstract class - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill); - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill); + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr); virtual bool HasRaid() { return false; } virtual bool HasGroup() { return (GetGroup() ? true : false); } @@ -163,16 +163,16 @@ public: uint8 GetTierID() { return _TierID; } uint32 GetCostFormula() { return _CostFormula; } uint32 GetMercNameType() { return _NameType; } - EQEmu::constants::StanceType GetStance() { return _currentStance; } + EQ::constants::StanceType GetStance() { return _currentStance; } int GetHatedCount() { return _hatedCount; } inline const uint8 GetClientVersion() const { return _OwnerClientVersion; } virtual void SetTarget(Mob* mob); - bool HasSkill(EQEmu::skills::SkillType skill_id) const; - bool CanHaveSkill(EQEmu::skills::SkillType skill_id) const; - uint16 MaxSkill(EQEmu::skills::SkillType skillid, uint16 class_, uint16 level) const; - inline uint16 MaxSkill(EQEmu::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } + bool HasSkill(EQ::skills::SkillType skill_id) const; + bool CanHaveSkill(EQ::skills::SkillType skill_id) const; + uint16 MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const; + inline uint16 MaxSkill(EQ::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } virtual void DoClassAttacks(Mob *target); void CheckHateList(); bool CheckTaunt(); @@ -253,7 +253,7 @@ public: void SetMercNameType( uint8 nametype ) { _NameType = nametype; } void SetClientVersion(uint8 clientVersion) { _OwnerClientVersion = clientVersion; } void SetSuspended(bool suspended) { _suspended = suspended; } - void SetStance( EQEmu::constants::StanceType stance ) { _currentStance = stance; } + void SetStance( EQ::constants::StanceType stance ) { _currentStance = stance; } void SetHatedCount( int count ) { _hatedCount = count; } void Sit(); @@ -270,7 +270,7 @@ public: protected: void CalcItemBonuses(StatBonuses* newbon); - void AddItemBonuses(const EQEmu::ItemData *item, StatBonuses* newbon); + void AddItemBonuses(const EQ::ItemData *item, StatBonuses* newbon); int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat); int16 GetFocusEffect(focusType type, uint16 spell_id); @@ -280,8 +280,8 @@ protected: Timer evade_timer; // can be moved to pTimers at some point - uint16 skills[EQEmu::skills::HIGHEST_SKILL + 1]; - uint32 equipment[EQEmu::invslot::EQUIPMENT_COUNT]; //this is an array of item IDs + uint16 skills[EQ::skills::HIGHEST_SKILL + 1]; + uint32 equipment[EQ::invslot::EQUIPMENT_COUNT]; //this is an array of item IDs uint16 d_melee_texture1; //this is an item Material value uint16 d_melee_texture2; //this is an item Material value (offhand) uint8 prim_melee_type; //Sets the Primary Weapon attack message and animation @@ -373,9 +373,9 @@ private: uint8 _CostFormula; uint8 _NameType; uint8 _OwnerClientVersion; - EQEmu::constants::StanceType _currentStance; + EQ::constants::StanceType _currentStance; - EQEmu::InventoryProfile m_inv; + EQ::InventoryProfile m_inv; int32 max_end; int32 cur_end; bool _medding; diff --git a/zone/mob.cpp b/zone/mob.cpp index 5d25c42f0..0138bdbfd 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -20,6 +20,7 @@ #include "../common/string_util.h" #include "../common/misc_functions.h" +#include "data_bucket.h" #include "quest_parser_collection.h" #include "string_ids.h" #include "worldserver.h" @@ -77,7 +78,7 @@ Mob::Mob( uint32 in_drakkin_heritage, uint32 in_drakkin_tattoo, uint32 in_drakkin_details, - EQEmu::TintProfile in_armor_tint, + EQ::TintProfile in_armor_tint, uint8 in_aa_title, uint8 in_see_invis, // see through invis/ivu uint8 in_see_invis_undead, @@ -115,10 +116,10 @@ Mob::Mob( tmHidden(-1), mitigation_ac(0), m_specialattacks(eSpecialAttacks::None), - attack_anim_timer(1000), + attack_anim_timer(500), position_update_melee_push_timer(500), hate_list_cleanup_timer(6000), - mob_scan_close(6000), + mob_close_scan_timer(6000), mob_check_moving_timer(1000) { mMovementManager = &MobMovementManager::Get(); @@ -130,6 +131,7 @@ Mob::Mob( AI_Init(); SetMoving(false); moved = false; + turning = false; m_RewindLocation = glm::vec3(); m_RelativePosition = glm::vec4(); @@ -199,10 +201,10 @@ Mob::Mob( runspeed = 1.25f; } - m_Light.Type[EQEmu::lightsource::LightInnate] = in_light; - m_Light.Level[EQEmu::lightsource::LightInnate] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightInnate]); - m_Light.Type[EQEmu::lightsource::LightActive] = m_Light.Type[EQEmu::lightsource::LightInnate]; - m_Light.Level[EQEmu::lightsource::LightActive] = m_Light.Level[EQEmu::lightsource::LightInnate]; + m_Light.Type[EQ::lightsource::LightInnate] = in_light; + m_Light.Level[EQ::lightsource::LightInnate] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightInnate]); + m_Light.Type[EQ::lightsource::LightActive] = m_Light.Type[EQ::lightsource::LightInnate]; + m_Light.Level[EQ::lightsource::LightActive] = m_Light.Level[EQ::lightsource::LightInnate]; texture = in_texture; helmtexture = in_helmtexture; @@ -254,7 +256,7 @@ Mob::Mob( INT = in_int; WIS = in_wis; CHA = in_cha; - MR = CR = FR = DR = PR = Corrup = 0; + MR = CR = FR = DR = PR = Corrup = PhR = 0; ExtraHaste = 0; bEnraged = false; shield_target = nullptr; @@ -300,7 +302,7 @@ Mob::Mob( RangedProcs[j].level_override = -1; } - for (int i = EQEmu::textures::textureBegin; i < EQEmu::textures::materialCount; i++) { + for (int i = EQ::textures::textureBegin; i < EQ::textures::materialCount; i++) { armor_tint.Slot[i].Color = in_armor_tint.Slot[i].Color; } @@ -312,7 +314,7 @@ Mob::Mob( isgrouped = false; israidgrouped = false; - IsHorse = false; + is_horse = false; entity_id_being_looted = 0; _appearance = eaStanding; @@ -444,7 +446,7 @@ Mob::Mob( m_AllowBeneficial = false; m_DisableMelee = false; - for (int i = 0; i < EQEmu::skills::HIGHEST_SKILL + 2; i++) { + for (int i = 0; i < EQ::skills::HIGHEST_SKILL + 2; i++) { SkillDmgTaken_Mod[i] = 0; } @@ -463,7 +465,9 @@ Mob::Mob( m_manual_follow = false; #endif - mob_scan_close.Trigger(); + mob_close_scan_timer.Trigger(); + + SetCanOpenDoors(true); } Mob::~Mob() @@ -501,7 +505,7 @@ Mob::~Mob() if (HasTempPetsActive()) { entity_list.DestroyTempPets(this); } - + entity_list.UnMarkNPC(GetID()); UninitializeBuffSlots(); @@ -1147,7 +1151,7 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) ns->spawn.findable = findable?1:0; UpdateActiveLight(); - ns->spawn.light = m_Light.Type[EQEmu::lightsource::LightActive]; + ns->spawn.light = m_Light.Type[EQ::lightsource::LightActive]; if (IsNPC() && race == ERUDITE) ns->spawn.showhelm = 1; @@ -1197,24 +1201,27 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) else ns->spawn.flymode = flymode; - if(IsBoat()) { - ns->spawn.flymode = GravityBehavior::Floating; - } - ns->spawn.lastName[0] = '\0'; strn0cpy(ns->spawn.lastName, lastname, sizeof(ns->spawn.lastName)); //for (i = 0; i < _MaterialCount; i++) - for (i = 0; i < 9; i++) - { + for (i = 0; i < 9; i++) { // Only Player Races Wear Armor - if (Mob::IsPlayerRace(race) || i > 6) - { - ns->spawn.equipment.Slot[i].Material = GetEquipmentMaterial(i); - ns->spawn.equipment.Slot[i].EliteModel = IsEliteMaterialItem(i); + if (Mob::IsPlayerRace(race) || i > 6) { + ns->spawn.equipment.Slot[i].Material = GetEquipmentMaterial(i); + ns->spawn.equipment.Slot[i].EliteModel = IsEliteMaterialItem(i); ns->spawn.equipment.Slot[i].HerosForgeModel = GetHerosForgeModel(i); - ns->spawn.equipment_tint.Slot[i].Color = GetEquipmentColor(i); + ns->spawn.equipment_tint.Slot[i].Color = GetEquipmentColor(i); + } + } + + if (texture > 0) { + for (i = 0; i < 9; i++) { + if (i == EQ::textures::weaponPrimary || i == EQ::textures::weaponSecondary || texture == 255) { + continue; + } + ns->spawn.equipment.Slot[i].Material = texture; } } @@ -1363,7 +1370,7 @@ void Mob::SendHPUpdate(bool skip_self /*= false*/, bool force_update_all /*= fal (skip_self ? "true" : "false") ); - if (!skip_self || this->CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (!skip_self || this->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD) { auto client_packet = new EQApplicationPacket(OP_HPUpdate, sizeof(SpawnHPUpdate_Struct)); auto *hp_packet_client = (SpawnHPUpdate_Struct *) client_packet->pBuffer; @@ -1419,7 +1426,7 @@ void Mob::SendHPUpdate(bool skip_self /*= false*/, bool force_update_all /*= fal /** * Update those who have us targeted */ - entity_list.QueueClientsByTarget(this, &hp_packet, false, 0, false, true, EQEmu::versions::maskAllClients); + entity_list.QueueClientsByTarget(this, &hp_packet, false, 0, false, true, EQ::versions::maskAllClients); /** * Update those who have us on x-target @@ -1639,27 +1646,29 @@ void Mob::ShowStats(Client* client) client->Message(Chat::White, " AggroRange: %1.0f AssistRange: %1.0f", GetAggroRange(), GetAssistRange()); } - client->Message(Chat::White, " compute_tohit: %i TotalToHit: %i", compute_tohit(EQEmu::skills::SkillHandtoHand), GetTotalToHit(EQEmu::skills::SkillHandtoHand, 0)); + client->Message(Chat::White, " compute_tohit: %i TotalToHit: %i", compute_tohit(EQ::skills::SkillHandtoHand), GetTotalToHit(EQ::skills::SkillHandtoHand, 0)); client->Message(Chat::White, " compute_defense: %i TotalDefense: %i", compute_defense(), GetTotalDefense()); - client->Message(Chat::White, " offense: %i mitigation ac: %i", offense(EQEmu::skills::SkillHandtoHand), GetMitigationAC()); + client->Message(Chat::White, " offense: %i mitigation ac: %i", offense(EQ::skills::SkillHandtoHand), GetMitigationAC()); } } -void Mob::DoAnim(const int animnum, int type, bool ackreq, eqFilterType filter) { - if (!attack_anim_timer.Check()) +void Mob::DoAnim(const int animnum, int type, bool ackreq, eqFilterType filter) +{ + if (!attack_anim_timer.Check()) { return; + } auto outapp = new EQApplicationPacket(OP_Animation, sizeof(Animation_Struct)); - Animation_Struct* anim = (Animation_Struct*)outapp->pBuffer; + auto *anim = (Animation_Struct *) outapp->pBuffer; anim->spawnid = GetID(); - if(type == 0){ + if (type == 0) { anim->action = animnum; - anim->speed = 10; + anim->speed = 10; } else { anim->action = animnum; - anim->speed = type; + anim->speed = type; } entity_list.QueueCloseClients( @@ -1729,6 +1738,7 @@ void Mob::GMMove(float x, float y, float z, float heading, bool SendUpdate) { m_Position.x = x; m_Position.y = y; m_Position.z = z; + SetHeading(heading); mMovementManager->SendCommandToClients(this, 0.0, 0.0, 0.0, 0.0, 0, ClientRangeAny); if (IsNPC()) { @@ -1755,78 +1765,69 @@ void Mob::SendIllusionPacket( float in_size ) { - uint8 new_texture = in_texture; - uint8 new_helmtexture = in_helmtexture; - uint8 new_haircolor; - uint8 new_beardcolor; - uint8 new_eyecolor1; - uint8 new_eyecolor2; - uint8 new_hairstyle; - uint8 new_luclinface; - uint8 new_beard; - uint8 new_aa_title; + uint8 new_texture = in_texture; + uint8 new_helmtexture = in_helmtexture; + uint8 new_haircolor; + uint8 new_beardcolor; + uint8 new_eyecolor1; + uint8 new_eyecolor2; + uint8 new_hairstyle; + uint8 new_luclinface; + uint8 new_beard; + uint8 new_aa_title; uint32 new_drakkin_heritage; uint32 new_drakkin_tattoo; uint32 new_drakkin_details; race = in_race; - if (race == 0) - { + if (race == 0) { race = (use_model) ? use_model : GetBaseRace(); - } + } - if (in_gender != 0xFF) - { + if (in_gender != 0xFF) { gender = in_gender; - } - else - { + } + else { gender = (in_race) ? GetDefaultGender(race, gender) : GetBaseGender(); - } + } - if (in_texture == 0xFF && !IsPlayerRace(in_race)) - { + if (in_texture == 0xFF && !IsPlayerRace(in_race)) { new_texture = GetTexture(); - } + } - if (in_helmtexture == 0xFF && !IsPlayerRace(in_race)) - { + if (in_helmtexture == 0xFF && !IsPlayerRace(in_race)) { new_helmtexture = GetHelmTexture(); - } + } - new_haircolor = (in_haircolor == 0xFF) ? GetHairColor() : in_haircolor; - new_beardcolor = (in_beardcolor == 0xFF) ? GetBeardColor() : in_beardcolor; - new_eyecolor1 = (in_eyecolor1 == 0xFF) ? GetEyeColor1() : in_eyecolor1; - new_eyecolor2 = (in_eyecolor2 == 0xFF) ? GetEyeColor2() : in_eyecolor2; - new_hairstyle = (in_hairstyle == 0xFF) ? GetHairStyle() : in_hairstyle; - new_luclinface = (in_luclinface == 0xFF) ? GetLuclinFace() : in_luclinface; - new_beard = (in_beard == 0xFF) ? GetBeard() : in_beard; - new_drakkin_heritage = - (in_drakkin_heritage == 0xFFFFFFFF) ? GetDrakkinHeritage() : in_drakkin_heritage; - new_drakkin_tattoo = - (in_drakkin_tattoo == 0xFFFFFFFF) ? GetDrakkinTattoo() : in_drakkin_tattoo; - new_drakkin_details = - (in_drakkin_details == 0xFFFFFFFF) ? GetDrakkinDetails() : in_drakkin_details; - new_aa_title = in_aa_title; - size = (in_size <= 0.0f) ? GetSize() : in_size; + new_haircolor = (in_haircolor == 0xFF) ? GetHairColor() : in_haircolor; + new_beardcolor = (in_beardcolor == 0xFF) ? GetBeardColor() : in_beardcolor; + new_eyecolor1 = (in_eyecolor1 == 0xFF) ? GetEyeColor1() : in_eyecolor1; + new_eyecolor2 = (in_eyecolor2 == 0xFF) ? GetEyeColor2() : in_eyecolor2; + new_hairstyle = (in_hairstyle == 0xFF) ? GetHairStyle() : in_hairstyle; + new_luclinface = (in_luclinface == 0xFF) ? GetLuclinFace() : in_luclinface; + new_beard = (in_beard == 0xFF) ? GetBeard() : in_beard; + new_drakkin_heritage = (in_drakkin_heritage == 0xFFFFFFFF) ? GetDrakkinHeritage() : in_drakkin_heritage; + new_drakkin_tattoo = (in_drakkin_tattoo == 0xFFFFFFFF) ? GetDrakkinTattoo() : in_drakkin_tattoo; + new_drakkin_details = (in_drakkin_details == 0xFFFFFFFF) ? GetDrakkinDetails() : in_drakkin_details; + new_aa_title = in_aa_title; // Reset features to Base from the Player Profile if (IsClient() && in_race == 0) { - race = CastToClient()->GetBaseRace(); - gender = CastToClient()->GetBaseGender(); - new_texture = texture = 0xFF; - new_helmtexture = helmtexture = 0xFF; - new_haircolor = haircolor = CastToClient()->GetBaseHairColor(); - new_beardcolor = beardcolor = CastToClient()->GetBaseBeardColor(); - new_eyecolor1 = eyecolor1 = CastToClient()->GetBaseEyeColor(); - new_eyecolor2 = eyecolor2 = CastToClient()->GetBaseEyeColor(); - new_hairstyle = hairstyle = CastToClient()->GetBaseHairStyle(); - new_luclinface = luclinface = CastToClient()->GetBaseFace(); - new_beard = beard = CastToClient()->GetBaseBeard(); - new_aa_title = aa_title = 0xFF; - new_drakkin_heritage = drakkin_heritage = CastToClient()->GetBaseHeritage(); - new_drakkin_tattoo = drakkin_tattoo = CastToClient()->GetBaseTattoo(); - new_drakkin_details = drakkin_details = CastToClient()->GetBaseDetails(); + race = CastToClient()->GetBaseRace(); + gender = CastToClient()->GetBaseGender(); + new_texture = texture = 0xFF; + new_helmtexture = helmtexture = 0xFF; + new_haircolor = haircolor = CastToClient()->GetBaseHairColor(); + new_beardcolor = beardcolor = CastToClient()->GetBaseBeardColor(); + new_eyecolor1 = eyecolor1 = CastToClient()->GetBaseEyeColor(); + new_eyecolor2 = eyecolor2 = CastToClient()->GetBaseEyeColor(); + new_hairstyle = hairstyle = CastToClient()->GetBaseHairStyle(); + new_luclinface = luclinface = CastToClient()->GetBaseFace(); + new_beard = beard = CastToClient()->GetBaseBeard(); + new_aa_title = aa_title = 0xFF; + new_drakkin_heritage = drakkin_heritage = CastToClient()->GetBaseHeritage(); + new_drakkin_tattoo = drakkin_tattoo = CastToClient()->GetBaseTattoo(); + new_drakkin_details = drakkin_details = CastToClient()->GetBaseDetails(); switch (race) { case OGRE: size = 9; @@ -1857,6 +1858,21 @@ void Mob::SendIllusionPacket( } } + // update internal values for mob + size = (in_size <= 0.0f) ? GetSize() : in_size; + texture = new_texture; + helmtexture = new_helmtexture; + haircolor = new_haircolor; + beardcolor = new_beardcolor; + eyecolor1 = new_eyecolor1; + eyecolor2 = new_eyecolor2; + hairstyle = new_hairstyle; + luclinface = new_luclinface; + beard = new_beard; + drakkin_heritage = new_drakkin_heritage; + drakkin_tattoo = new_drakkin_tattoo; + drakkin_details = new_drakkin_details; + auto outapp = new EQApplicationPacket(OP_Illusion, sizeof(Illusion_Struct)); Illusion_Struct *is = (Illusion_Struct *) outapp->pBuffer; is->spawnid = GetID(); @@ -1881,9 +1897,10 @@ void Mob::SendIllusionPacket( safe_delete(outapp); /* Refresh armor and tints after send illusion packet */ - this->SendArmorAppearance(); + SendArmorAppearance(); - LogSpells("Illusion: Race = [{}], Gender = [{}], Texture = [{}], HelmTexture = [{}], HairColor = [{}], BeardColor = [{}], EyeColor1 = [{}], EyeColor2 = [{}], HairStyle = [{}], Face = [{}], DrakkinHeritage = [{}], DrakkinTattoo = [{}], DrakkinDetails = [{}], Size = [{}]", + LogSpells( + "Illusion: Race [{}] Gender [{}] Texture [{}] HelmTexture [{}] HairColor [{}] BeardColor [{}] EyeColor1 [{}] EyeColor2 [{}] HairStyle [{}] Face [{}] DrakkinHeritage [{}] DrakkinTattoo [{}] DrakkinDetails [{}] Size [{}]", race, gender, new_texture, @@ -1897,7 +1914,8 @@ void Mob::SendIllusionPacket( new_drakkin_heritage, new_drakkin_tattoo, new_drakkin_details, - size); + size + ); } bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables) @@ -2110,8 +2128,8 @@ bool Mob::IsPlayerRace(uint16 in_race) { } uint16 Mob::GetFactionRace() { - uint16 current_race = GetRace(); - if (IsPlayerRace(current_race) || current_race == TREE || + uint16 current_race = GetRace(); + if (IsPlayerRace(current_race) || current_race == TREE || current_race == MINOR_ILL_OBJ) { return current_race; } @@ -2368,18 +2386,18 @@ void Mob::SetAppearance(EmuAppearance app, bool iIgnoreSelf) { bool Mob::UpdateActiveLight() { - uint8 old_light_level = m_Light.Level[EQEmu::lightsource::LightActive]; + uint8 old_light_level = m_Light.Level[EQ::lightsource::LightActive]; - m_Light.Type[EQEmu::lightsource::LightActive] = 0; - m_Light.Level[EQEmu::lightsource::LightActive] = 0; + m_Light.Type[EQ::lightsource::LightActive] = 0; + m_Light.Level[EQ::lightsource::LightActive] = 0; - if (EQEmu::lightsource::IsLevelGreater((m_Light.Type[EQEmu::lightsource::LightInnate] & 0x0F), m_Light.Type[EQEmu::lightsource::LightActive])) { m_Light.Type[EQEmu::lightsource::LightActive] = m_Light.Type[EQEmu::lightsource::LightInnate]; } - if (m_Light.Level[EQEmu::lightsource::LightEquipment] > m_Light.Level[EQEmu::lightsource::LightActive]) { m_Light.Type[EQEmu::lightsource::LightActive] = m_Light.Type[EQEmu::lightsource::LightEquipment]; } // limiter in property handler - if (m_Light.Level[EQEmu::lightsource::LightSpell] > m_Light.Level[EQEmu::lightsource::LightActive]) { m_Light.Type[EQEmu::lightsource::LightActive] = m_Light.Type[EQEmu::lightsource::LightSpell]; } // limiter in property handler + if (EQ::lightsource::IsLevelGreater((m_Light.Type[EQ::lightsource::LightInnate] & 0x0F), m_Light.Type[EQ::lightsource::LightActive])) { m_Light.Type[EQ::lightsource::LightActive] = m_Light.Type[EQ::lightsource::LightInnate]; } + if (m_Light.Level[EQ::lightsource::LightEquipment] > m_Light.Level[EQ::lightsource::LightActive]) { m_Light.Type[EQ::lightsource::LightActive] = m_Light.Type[EQ::lightsource::LightEquipment]; } // limiter in property handler + if (m_Light.Level[EQ::lightsource::LightSpell] > m_Light.Level[EQ::lightsource::LightActive]) { m_Light.Type[EQ::lightsource::LightActive] = m_Light.Type[EQ::lightsource::LightSpell]; } // limiter in property handler - m_Light.Level[EQEmu::lightsource::LightActive] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightActive]); + m_Light.Level[EQ::lightsource::LightActive] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightActive]); - return (m_Light.Level[EQEmu::lightsource::LightActive] != old_light_level); + return (m_Light.Level[EQ::lightsource::LightActive] != old_light_level); } void Mob::ChangeSize(float in_size = 0, bool bNoRestriction) { @@ -2403,7 +2421,7 @@ void Mob::ChangeSize(float in_size = 0, bool bNoRestriction) { if (in_size > 255.0) in_size = 255.0; //End of Size Code - this->size = in_size; + size = in_size; SendAppearancePacket(AT_Size, (uint32) in_size); } @@ -2511,20 +2529,20 @@ void Mob::SetZone(uint32 zone_id, uint32 instance_id) } void Mob::Kill() { - Death(this, 0, SPELL_UNKNOWN, EQEmu::skills::SkillHandtoHand); + Death(this, 0, SPELL_UNKNOWN, EQ::skills::SkillHandtoHand); } bool Mob::CanThisClassDualWield(void) const { if(!IsClient()) { - return(GetSkill(EQEmu::skills::SkillDualWield) > 0); + return(GetSkill(EQ::skills::SkillDualWield) > 0); } - else if (CastToClient()->HasSkill(EQEmu::skills::SkillDualWield)) { - const EQEmu::ItemInstance* pinst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); - const EQEmu::ItemInstance* sinst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotSecondary); + else if (CastToClient()->HasSkill(EQ::skills::SkillDualWield)) { + const EQ::ItemInstance* pinst = CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); + const EQ::ItemInstance* sinst = CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); // 2HS, 2HB, or 2HP if(pinst && pinst->IsWeapon()) { - const EQEmu::ItemData* item = pinst->GetItem(); + const EQ::ItemData* item = pinst->GetItem(); if (item->IsType2HWeapon()) return false; @@ -2548,12 +2566,12 @@ bool Mob::CanThisClassDualWield(void) const { bool Mob::CanThisClassDoubleAttack(void) const { if(!IsClient()) { - return(GetSkill(EQEmu::skills::SkillDoubleAttack) > 0); + return(GetSkill(EQ::skills::SkillDoubleAttack) > 0); } else { if(aabonuses.GiveDoubleAttack || itembonuses.GiveDoubleAttack || spellbonuses.GiveDoubleAttack) { return true; } - return(CastToClient()->HasSkill(EQEmu::skills::SkillDoubleAttack)); + return(CastToClient()->HasSkill(EQ::skills::SkillDoubleAttack)); } } @@ -2562,7 +2580,7 @@ bool Mob::CanThisClassTripleAttack() const if (!IsClient()) return false; // When they added the real triple attack skill, mobs lost the ability to triple else - return CastToClient()->HasSkill(EQEmu::skills::SkillTripleAttack); + return CastToClient()->HasSkill(EQ::skills::SkillTripleAttack); } bool Mob::IsWarriorClass(void) const @@ -2601,36 +2619,36 @@ bool Mob::IsWarriorClass(void) const bool Mob::CanThisClassParry(void) const { if(!IsClient()) { - return(GetSkill(EQEmu::skills::SkillParry) > 0); + return(GetSkill(EQ::skills::SkillParry) > 0); } else { - return(CastToClient()->HasSkill(EQEmu::skills::SkillParry)); + return(CastToClient()->HasSkill(EQ::skills::SkillParry)); } } bool Mob::CanThisClassDodge(void) const { if(!IsClient()) { - return(GetSkill(EQEmu::skills::SkillDodge) > 0); + return(GetSkill(EQ::skills::SkillDodge) > 0); } else { - return(CastToClient()->HasSkill(EQEmu::skills::SkillDodge)); + return(CastToClient()->HasSkill(EQ::skills::SkillDodge)); } } bool Mob::CanThisClassRiposte(void) const { if(!IsClient()) { - return(GetSkill(EQEmu::skills::SkillRiposte) > 0); + return(GetSkill(EQ::skills::SkillRiposte) > 0); } else { - return(CastToClient()->HasSkill(EQEmu::skills::SkillRiposte)); + return(CastToClient()->HasSkill(EQ::skills::SkillRiposte)); } } bool Mob::CanThisClassBlock(void) const { if(!IsClient()) { - return(GetSkill(EQEmu::skills::SkillBlock) > 0); + return(GetSkill(EQ::skills::SkillBlock) > 0); } else { - return(CastToClient()->HasSkill(EQEmu::skills::SkillBlock)); + return(CastToClient()->HasSkill(EQ::skills::SkillBlock)); } } /* @@ -2807,6 +2825,11 @@ bool Mob::HateSummon() { } void Mob::FaceTarget(Mob* mob_to_face /*= 0*/) { + + if (IsBoat()) { + return; + } + Mob* faced_mob = mob_to_face; if(!faced_mob) { if(!GetTarget()) { @@ -2881,7 +2904,7 @@ uint32 Mob::RandomTimer(int min, int max) uint32 Mob::IsEliteMaterialItem(uint8 material_slot) const { - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; item = database.GetItem(GetEquippedItemFromTextureSlot(material_slot)); if(item != 0) @@ -3111,7 +3134,7 @@ int32 Mob::GetActSpellCasttime(uint16 spell_id, int32 casttime) { return casttime; } -void Mob::ExecWeaponProc(const EQEmu::ItemInstance *inst, uint16 spell_id, Mob *on, int level_override) { +void Mob::ExecWeaponProc(const EQ::ItemInstance *inst, uint16 spell_id, Mob *on, int level_override) { // Changed proc targets to look up based on the spells goodEffect flag. // This should work for the majority of weapons. if(spell_id == SPELL_UNKNOWN || on->GetSpecialAbility(NO_HARM_FROM_CLIENT)) { @@ -3119,6 +3142,12 @@ void Mob::ExecWeaponProc(const EQEmu::ItemInstance *inst, uint16 spell_id, Mob * return; } + if (on->GetSpecialAbility(IMMUNE_DAMAGE_CLIENT) && IsClient()) + return; + + if (on->GetSpecialAbility(IMMUNE_DAMAGE_NPC) && IsNPC()) + return; + if (IsNoCast()) return; @@ -3132,9 +3161,9 @@ void Mob::ExecWeaponProc(const EQEmu::ItemInstance *inst, uint16 spell_id, Mob * if(inst && IsClient()) { //const cast is dirty but it would require redoing a ton of interfaces at this point - //It should be safe as we don't have any truly const EQEmu::ItemInstance floating around anywhere. + //It should be safe as we don't have any truly const EQ::ItemInstance floating around anywhere. //So we'll live with it for now - int i = parse->EventItem(EVENT_WEAPON_PROC, CastToClient(), const_cast(inst), on, "", spell_id); + int i = parse->EventItem(EVENT_WEAPON_PROC, CastToClient(), const_cast(inst), on, "", spell_id); if(i != 0) { return; } @@ -3150,12 +3179,12 @@ void Mob::ExecWeaponProc(const EQEmu::ItemInstance *inst, uint16 spell_id, Mob * twinproc = true; if (IsBeneficialSpell(spell_id) && (!IsNPC() || (IsNPC() && CastToNPC()->GetInnateProcSpellID() != spell_id))) { // NPC innate procs don't take this path ever - SpellFinished(spell_id, this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff, true, level_override); + SpellFinished(spell_id, this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff, true, level_override); if(twinproc) SpellOnTarget(spell_id, this, false, false, 0, true, level_override); } else if(!(on->IsClient() && on->CastToClient()->dead)) { //dont proc on dead clients - SpellFinished(spell_id, on, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff, true, level_override); + SpellFinished(spell_id, on, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff, true, level_override); if(twinproc) SpellOnTarget(spell_id, on, false, false, 0, true, level_override); } @@ -3368,19 +3397,19 @@ void Mob::TriggerDefensiveProcs(Mob *on, uint16 hand, bool FromSkillProc, int da uint16 skillinuse = 0; switch (damage) { case (-1): - skillinuse = EQEmu::skills::SkillBlock; + skillinuse = EQ::skills::SkillBlock; break; case (-2): - skillinuse = EQEmu::skills::SkillParry; + skillinuse = EQ::skills::SkillParry; break; case (-3): - skillinuse = EQEmu::skills::SkillRiposte; + skillinuse = EQ::skills::SkillRiposte; break; case (-4): - skillinuse = EQEmu::skills::SkillDodge; + skillinuse = EQ::skills::SkillDodge; break; } @@ -3496,7 +3525,7 @@ void Mob::TriggerOnCast(uint32 focus_spell, uint32 spell_id, bool aa_trigger) trigger_spell_id = CastToClient()->CalcAAFocus(focusTriggerOnCast, *rank, spell_id); if (IsValidSpell(trigger_spell_id) && GetTarget()) - SpellFinished(trigger_spell_id, GetTarget(), EQEmu::spells::CastingSlot::Item, 0, -1, + SpellFinished(trigger_spell_id, GetTarget(), EQ::spells::CastingSlot::Item, 0, -1, spells[trigger_spell_id].ResistDiff); } @@ -3504,7 +3533,7 @@ void Mob::TriggerOnCast(uint32 focus_spell, uint32 spell_id, bool aa_trigger) trigger_spell_id = CalcFocusEffect(focusTriggerOnCast, focus_spell, spell_id); if (IsValidSpell(trigger_spell_id) && GetTarget()) { - SpellFinished(trigger_spell_id, GetTarget(), EQEmu::spells::CastingSlot::Item, 0, -1, + SpellFinished(trigger_spell_id, GetTarget(), EQ::spells::CastingSlot::Item, 0, -1, spells[trigger_spell_id].ResistDiff); CheckNumHitsRemaining(NumHit::MatchingSpells, -1, focus_spell); } @@ -3535,7 +3564,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect) { // If we trigger an effect then its over. if (IsValidSpell(spells[spell_id].base2[i])){ - SpellFinished(spells[spell_id].base2[i], target, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[i]].ResistDiff); + SpellFinished(spells[spell_id].base2[i], target, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[i]].ResistDiff); return true; } } @@ -3554,7 +3583,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect) if(zone->random.Int(0, 100) <= spells[spell_id].base[effect]) { if (IsValidSpell(spells[spell_id].base2[effect])){ - SpellFinished(spells[spell_id].base2[effect], target, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[effect]].ResistDiff); + SpellFinished(spells[spell_id].base2[effect], target, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[effect]].ResistDiff); return true; //Only trigger once of these per spell effect. } } @@ -3631,7 +3660,7 @@ void Mob::TryTriggerOnValueAmount(bool IsHP, bool IsMana, bool IsEndur, bool IsP } if (use_spell){ - SpellFinished(spells[spell_id].base[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spells[spell_id].base[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); if(!TryFadeEffect(e)) BuffFadeBySlot(e); @@ -3659,7 +3688,7 @@ void Mob::TryTwincast(Mob *caster, Mob *target, uint32 spell_id) if(zone->random.Roll(focus)) { Message(Chat::Spells,"You twincast %s!", spells[spell_id].name); - SpellFinished(spell_id, target, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spell_id, target, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } } } @@ -3677,7 +3706,7 @@ void Mob::TryTwincast(Mob *caster, Mob *target, uint32 spell_id) { if(zone->random.Roll(focus)) { - SpellFinished(spell_id, target, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spell_id, target, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } } } @@ -3745,15 +3774,15 @@ int32 Mob::GetVulnerability(Mob* caster, uint32 spell_id, uint32 ticsremaining) return value; } -int16 Mob::GetSkillDmgTaken(const EQEmu::skills::SkillType skill_used, ExtraAttackOptions *opts) +int16 Mob::GetSkillDmgTaken(const EQ::skills::SkillType skill_used, ExtraAttackOptions *opts) { int skilldmg_mod = 0; // All skill dmg mod + Skill specific - skilldmg_mod += itembonuses.SkillDmgTaken[EQEmu::skills::HIGHEST_SKILL + 1] + spellbonuses.SkillDmgTaken[EQEmu::skills::HIGHEST_SKILL + 1] + + skilldmg_mod += itembonuses.SkillDmgTaken[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.SkillDmgTaken[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDmgTaken[skill_used] + spellbonuses.SkillDmgTaken[skill_used]; - skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[EQEmu::skills::HIGHEST_SKILL + 1]; + skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[EQ::skills::HIGHEST_SKILL + 1]; if (opts) skilldmg_mod += opts->skilldmgtaken_bonus_flat; @@ -3805,10 +3834,10 @@ bool Mob::TryFadeEffect(int slot) if(IsValidSpell(spell_id)) { if (IsBeneficialSpell(spell_id)) { - SpellFinished(spell_id, this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spell_id, this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } else if(!(IsClient() && CastToClient()->dead)) { - SpellFinished(spell_id, this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spell_id, this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } return true; } @@ -3842,7 +3871,7 @@ void Mob::TrySympatheticProc(Mob *target, uint32 spell_id) SpellFinished(focus_trigger, target); else - SpellFinished(focus_trigger, this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[focus_trigger].ResistDiff); + SpellFinished(focus_trigger, this, EQ::spells::CastingSlot::Item, 0, -1, spells[focus_trigger].ResistDiff); } // For detrimental spells, if the triggered spell is beneficial, then it will land on the caster // if the triggered spell is also detrimental, then it will land on the target @@ -3852,7 +3881,7 @@ void Mob::TrySympatheticProc(Mob *target, uint32 spell_id) SpellFinished(focus_trigger, this); else - SpellFinished(focus_trigger, target, EQEmu::spells::CastingSlot::Item, 0, -1, spells[focus_trigger].ResistDiff); + SpellFinished(focus_trigger, target, EQ::spells::CastingSlot::Item, 0, -1, spells[focus_trigger].ResistDiff); } CheckNumHitsRemaining(NumHit::MatchingSpells, -1, focus_spell); @@ -3860,11 +3889,11 @@ void Mob::TrySympatheticProc(Mob *target, uint32 spell_id) int32 Mob::GetItemStat(uint32 itemid, const char *identifier) { - const EQEmu::ItemInstance* inst = database.CreateItem(itemid); + const EQ::ItemInstance* inst = database.CreateItem(itemid); if (!inst) return 0; - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if (!item) return 0; @@ -4502,7 +4531,7 @@ void Mob::TrySpellOnKill(uint8 level, uint16 spell_id) if (IsValidSpell(spells[spell_id].base2[i]) && spells[spell_id].max[i] <= level) { if(zone->random.Roll(spells[spell_id].base[i])) - SpellFinished(spells[spell_id].base2[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[i]].ResistDiff); + SpellFinished(spells[spell_id].base2[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[i]].ResistDiff); } } } @@ -4517,17 +4546,17 @@ void Mob::TrySpellOnKill(uint8 level, uint16 spell_id) if(aabonuses.SpellOnKill[i] && IsValidSpell(aabonuses.SpellOnKill[i]) && (level >= aabonuses.SpellOnKill[i + 2])) { if(zone->random.Roll(static_cast(aabonuses.SpellOnKill[i + 1]))) - SpellFinished(aabonuses.SpellOnKill[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnKill[i]].ResistDiff); + SpellFinished(aabonuses.SpellOnKill[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnKill[i]].ResistDiff); } if(itembonuses.SpellOnKill[i] && IsValidSpell(itembonuses.SpellOnKill[i]) && (level >= itembonuses.SpellOnKill[i + 2])){ if(zone->random.Roll(static_cast(itembonuses.SpellOnKill[i + 1]))) - SpellFinished(itembonuses.SpellOnKill[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnKill[i]].ResistDiff); + SpellFinished(itembonuses.SpellOnKill[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnKill[i]].ResistDiff); } if(spellbonuses.SpellOnKill[i] && IsValidSpell(spellbonuses.SpellOnKill[i]) && (level >= spellbonuses.SpellOnKill[i + 2])) { if(zone->random.Roll(static_cast(spellbonuses.SpellOnKill[i + 1]))) - SpellFinished(spellbonuses.SpellOnKill[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnKill[i]].ResistDiff); + SpellFinished(spellbonuses.SpellOnKill[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnKill[i]].ResistDiff); } } @@ -4544,19 +4573,19 @@ bool Mob::TrySpellOnDeath() for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) { if(IsClient() && aabonuses.SpellOnDeath[i] && IsValidSpell(aabonuses.SpellOnDeath[i])) { if(zone->random.Roll(static_cast(aabonuses.SpellOnDeath[i + 1]))) { - SpellFinished(aabonuses.SpellOnDeath[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnDeath[i]].ResistDiff); + SpellFinished(aabonuses.SpellOnDeath[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SpellOnDeath[i]].ResistDiff); } } if(itembonuses.SpellOnDeath[i] && IsValidSpell(itembonuses.SpellOnDeath[i])) { if(zone->random.Roll(static_cast(itembonuses.SpellOnDeath[i + 1]))) { - SpellFinished(itembonuses.SpellOnDeath[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[itembonuses.SpellOnDeath[i]].ResistDiff); + SpellFinished(itembonuses.SpellOnDeath[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[itembonuses.SpellOnDeath[i]].ResistDiff); } } if(spellbonuses.SpellOnDeath[i] && IsValidSpell(spellbonuses.SpellOnDeath[i])) { if(zone->random.Roll(static_cast(spellbonuses.SpellOnDeath[i + 1]))) { - SpellFinished(spellbonuses.SpellOnDeath[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spellbonuses.SpellOnDeath[i]].ResistDiff); + SpellFinished(spellbonuses.SpellOnDeath[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spellbonuses.SpellOnDeath[i]].ResistDiff); } } } @@ -4573,7 +4602,7 @@ int16 Mob::GetCritDmgMod(uint16 skill) int critDmg_mod = 0; // All skill dmg mod + Skill specific - critDmg_mod += itembonuses.CritDmgMod[EQEmu::skills::HIGHEST_SKILL + 1] + spellbonuses.CritDmgMod[EQEmu::skills::HIGHEST_SKILL + 1] + aabonuses.CritDmgMod[EQEmu::skills::HIGHEST_SKILL + 1] + + critDmg_mod += itembonuses.CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.CritDmgMod[skill] + spellbonuses.CritDmgMod[skill] + aabonuses.CritDmgMod[skill]; return critDmg_mod; @@ -4615,7 +4644,7 @@ int Mob::GetCriticalChanceBonus(uint16 skill) int critical_chance = 0; // All skills + Skill specific - critical_chance += itembonuses.CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] + spellbonuses.CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] + aabonuses.CriticalHitChance[EQEmu::skills::HIGHEST_SKILL + 1] + + critical_chance += itembonuses.CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.CriticalHitChance[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.CriticalHitChance[skill] + spellbonuses.CriticalHitChance[skill] + aabonuses.CriticalHitChance[skill]; if(critical_chance < -100) @@ -4629,10 +4658,10 @@ int16 Mob::GetMeleeDamageMod_SE(uint16 skill) int dmg_mod = 0; // All skill dmg mod + Skill specific - dmg_mod += itembonuses.DamageModifier[EQEmu::skills::HIGHEST_SKILL + 1] + spellbonuses.DamageModifier[EQEmu::skills::HIGHEST_SKILL + 1] + aabonuses.DamageModifier[EQEmu::skills::HIGHEST_SKILL + 1] + + dmg_mod += itembonuses.DamageModifier[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.DamageModifier[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.DamageModifier[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.DamageModifier[skill] + spellbonuses.DamageModifier[skill] + aabonuses.DamageModifier[skill]; - dmg_mod += itembonuses.DamageModifier2[EQEmu::skills::HIGHEST_SKILL + 1] + spellbonuses.DamageModifier2[EQEmu::skills::HIGHEST_SKILL + 1] + aabonuses.DamageModifier2[EQEmu::skills::HIGHEST_SKILL + 1] + + dmg_mod += itembonuses.DamageModifier2[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.DamageModifier2[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.DamageModifier2[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.DamageModifier2[skill] + spellbonuses.DamageModifier2[skill] + aabonuses.DamageModifier2[skill]; if(dmg_mod < -100) @@ -4646,7 +4675,7 @@ int16 Mob::GetMeleeMinDamageMod_SE(uint16 skill) int dmg_mod = 0; dmg_mod = itembonuses.MinDamageModifier[skill] + spellbonuses.MinDamageModifier[skill] + - itembonuses.MinDamageModifier[EQEmu::skills::HIGHEST_SKILL + 1] + spellbonuses.MinDamageModifier[EQEmu::skills::HIGHEST_SKILL + 1]; + itembonuses.MinDamageModifier[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.MinDamageModifier[EQ::skills::HIGHEST_SKILL + 1]; if(dmg_mod < -100) dmg_mod = -100; @@ -4678,10 +4707,10 @@ int16 Mob::GetSkillDmgAmt(uint16 skill) int skill_dmg = 0; // All skill dmg(only spells do this) + Skill specific - skill_dmg += spellbonuses.SkillDamageAmount[EQEmu::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDamageAmount[EQEmu::skills::HIGHEST_SKILL + 1] + aabonuses.SkillDamageAmount[EQEmu::skills::HIGHEST_SKILL + 1] + skill_dmg += spellbonuses.SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDamageAmount[skill] + spellbonuses.SkillDamageAmount[skill] + aabonuses.SkillDamageAmount[skill]; - skill_dmg += spellbonuses.SkillDamageAmount2[EQEmu::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDamageAmount2[EQEmu::skills::HIGHEST_SKILL + 1] + skill_dmg += spellbonuses.SkillDamageAmount2[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDamageAmount2[EQ::skills::HIGHEST_SKILL + 1] + itembonuses.SkillDamageAmount2[skill] + spellbonuses.SkillDamageAmount2[skill]; return skill_dmg; @@ -4701,7 +4730,7 @@ void Mob::MeleeLifeTap(int32 damage) { if (lifetap_amt > 0) HealDamage(lifetap_amt); //Heal self for modified damage amount. else - Damage(this, -lifetap_amt, 0, EQEmu::skills::SkillEvocation, false); //Dmg self for modified damage amount. + Damage(this, -lifetap_amt, 0, EQ::skills::SkillEvocation, false); //Dmg self for modified damage amount. } } @@ -4870,7 +4899,8 @@ bool Mob::IsBoat() const { race == RACE_SHIP_404 || race == RACE_MERCHANT_SHIP_550 || race == RACE_PIRATE_SHIP_551 || - race == RACE_GHOST_SHIP_552 + race == RACE_GHOST_SHIP_552 || + race == RACE_BOAT_533 ); } @@ -4904,21 +4934,21 @@ void Mob::SetBodyType(bodyType new_body, bool overwrite_orig) { } -void Mob::ModSkillDmgTaken(EQEmu::skills::SkillType skill_num, int value) +void Mob::ModSkillDmgTaken(EQ::skills::SkillType skill_num, int value) { if (skill_num == ALL_SKILLS) - SkillDmgTaken_Mod[EQEmu::skills::HIGHEST_SKILL + 1] = value; + SkillDmgTaken_Mod[EQ::skills::HIGHEST_SKILL + 1] = value; - else if (skill_num >= 0 && skill_num <= EQEmu::skills::HIGHEST_SKILL) + else if (skill_num >= 0 && skill_num <= EQ::skills::HIGHEST_SKILL) SkillDmgTaken_Mod[skill_num] = value; } -int16 Mob::GetModSkillDmgTaken(const EQEmu::skills::SkillType skill_num) +int16 Mob::GetModSkillDmgTaken(const EQ::skills::SkillType skill_num) { if (skill_num == ALL_SKILLS) - return SkillDmgTaken_Mod[EQEmu::skills::HIGHEST_SKILL + 1]; + return SkillDmgTaken_Mod[EQ::skills::HIGHEST_SKILL + 1]; - else if (skill_num >= 0 && skill_num <= EQEmu::skills::HIGHEST_SKILL) + else if (skill_num >= 0 && skill_num <= EQ::skills::HIGHEST_SKILL) return SkillDmgTaken_Mod[skill_num]; return 0; @@ -5010,56 +5040,56 @@ void Mob::SlowMitigation(Mob* caster) uint16 Mob::GetSkillByItemType(int ItemType) { switch (ItemType) { - case EQEmu::item::ItemType1HSlash: - return EQEmu::skills::Skill1HSlashing; - case EQEmu::item::ItemType2HSlash: - return EQEmu::skills::Skill2HSlashing; - case EQEmu::item::ItemType1HPiercing: - return EQEmu::skills::Skill1HPiercing; - case EQEmu::item::ItemType1HBlunt: - return EQEmu::skills::Skill1HBlunt; - case EQEmu::item::ItemType2HBlunt: - return EQEmu::skills::Skill2HBlunt; - case EQEmu::item::ItemType2HPiercing: - if (IsClient() && CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::RoF2) - return EQEmu::skills::Skill1HPiercing; + case EQ::item::ItemType1HSlash: + return EQ::skills::Skill1HSlashing; + case EQ::item::ItemType2HSlash: + return EQ::skills::Skill2HSlashing; + case EQ::item::ItemType1HPiercing: + return EQ::skills::Skill1HPiercing; + case EQ::item::ItemType1HBlunt: + return EQ::skills::Skill1HBlunt; + case EQ::item::ItemType2HBlunt: + return EQ::skills::Skill2HBlunt; + case EQ::item::ItemType2HPiercing: + if (IsClient() && CastToClient()->ClientVersion() < EQ::versions::ClientVersion::RoF2) + return EQ::skills::Skill1HPiercing; else - return EQEmu::skills::Skill2HPiercing; - case EQEmu::item::ItemTypeBow: - return EQEmu::skills::SkillArchery; - case EQEmu::item::ItemTypeLargeThrowing: - case EQEmu::item::ItemTypeSmallThrowing: - return EQEmu::skills::SkillThrowing; - case EQEmu::item::ItemTypeMartial: - return EQEmu::skills::SkillHandtoHand; + return EQ::skills::Skill2HPiercing; + case EQ::item::ItemTypeBow: + return EQ::skills::SkillArchery; + case EQ::item::ItemTypeLargeThrowing: + case EQ::item::ItemTypeSmallThrowing: + return EQ::skills::SkillThrowing; + case EQ::item::ItemTypeMartial: + return EQ::skills::SkillHandtoHand; default: - return EQEmu::skills::SkillHandtoHand; + return EQ::skills::SkillHandtoHand; } } -uint8 Mob::GetItemTypeBySkill(EQEmu::skills::SkillType skill) +uint8 Mob::GetItemTypeBySkill(EQ::skills::SkillType skill) { switch (skill) { - case EQEmu::skills::SkillThrowing: - return EQEmu::item::ItemTypeSmallThrowing; - case EQEmu::skills::SkillArchery: - return EQEmu::item::ItemTypeArrow; - case EQEmu::skills::Skill1HSlashing: - return EQEmu::item::ItemType1HSlash; - case EQEmu::skills::Skill2HSlashing: - return EQEmu::item::ItemType2HSlash; - case EQEmu::skills::Skill1HPiercing: - return EQEmu::item::ItemType1HPiercing; - case EQEmu::skills::Skill2HPiercing: // watch for undesired client behavior - return EQEmu::item::ItemType2HPiercing; - case EQEmu::skills::Skill1HBlunt: - return EQEmu::item::ItemType1HBlunt; - case EQEmu::skills::Skill2HBlunt: - return EQEmu::item::ItemType2HBlunt; - case EQEmu::skills::SkillHandtoHand: - return EQEmu::item::ItemTypeMartial; + case EQ::skills::SkillThrowing: + return EQ::item::ItemTypeSmallThrowing; + case EQ::skills::SkillArchery: + return EQ::item::ItemTypeArrow; + case EQ::skills::Skill1HSlashing: + return EQ::item::ItemType1HSlash; + case EQ::skills::Skill2HSlashing: + return EQ::item::ItemType2HSlash; + case EQ::skills::Skill1HPiercing: + return EQ::item::ItemType1HPiercing; + case EQ::skills::Skill2HPiercing: // watch for undesired client behavior + return EQ::item::ItemType2HPiercing; + case EQ::skills::Skill1HBlunt: + return EQ::item::ItemType1HBlunt; + case EQ::skills::Skill2HBlunt: + return EQ::item::ItemType2HBlunt; + case EQ::skills::SkillHandtoHand: + return EQ::item::ItemTypeMartial; default: - return EQEmu::item::ItemTypeMartial; + return EQ::item::ItemTypeMartial; } } @@ -5623,7 +5653,7 @@ int32 Mob::GetSpellStat(uint32 spell_id, const char *identifier, uint8 slot) bool Mob::CanClassEquipItem(uint32 item_id) { - const EQEmu::ItemData* itm = nullptr; + const EQ::ItemData* itm = nullptr; itm = database.GetItem(item_id); if (!itm) @@ -5679,9 +5709,9 @@ int32 Mob::GetMeleeMitigation() { } /* this is the mob being attacked. - * Pass in the weapon's EQEmu::ItemInstance + * Pass in the weapon's EQ::ItemInstance */ -int Mob::ResistElementalWeaponDmg(const EQEmu::ItemInstance *item) +int Mob::ResistElementalWeaponDmg(const EQ::ItemInstance *item) { if (!item) return 0; @@ -5831,9 +5861,9 @@ int Mob::ResistElementalWeaponDmg(const EQEmu::ItemInstance *item) } /* this is the mob being attacked. - * Pass in the weapon's EQEmu::ItemInstance + * Pass in the weapon's EQ::ItemInstance */ -int Mob::CheckBaneDamage(const EQEmu::ItemInstance *item) +int Mob::CheckBaneDamage(const EQ::ItemInstance *item) { if (!item) return 0; @@ -5898,7 +5928,7 @@ bool Mob::LeaveHealRotationTargetPool() m_target_of_heal_rotation->RemoveTargetFromPool(this); m_target_of_heal_rotation.reset(); - + return !IsHealRotationTarget(); } @@ -5934,3 +5964,61 @@ float Mob::HealRotationExtendedHealFrequency() return m_target_of_heal_rotation->ExtendedHealFrequency(this); } #endif + +bool Mob::CanOpenDoors() const +{ + return m_can_open_doors; +} + +void Mob::SetCanOpenDoors(bool can_open) +{ + m_can_open_doors = can_open; +} + +void Mob::DeleteBucket(std::string bucket_name) { + std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name); + DataBucket::DeleteData(full_bucket_name); +} + +std::string Mob::GetBucket(std::string bucket_name) { + std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name); + std::string bucket_value = DataBucket::GetData(full_bucket_name); + if (!bucket_value.empty()) { + return bucket_value; + } + return std::string(); +} + +std::string Mob::GetBucketExpires(std::string bucket_name) { + std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name); + std::string bucket_expiration = DataBucket::GetDataExpires(full_bucket_name); + if (!bucket_expiration.empty()) { + return bucket_expiration; + } + return std::string(); +} + +std::string Mob::GetBucketKey() { + if (IsClient()) { + return fmt::format("character-{}", CastToClient()->CharacterID()); + } else if (IsNPC()) { + return fmt::format("npc-{}", GetNPCTypeID()); + } + return std::string(); +} + +std::string Mob::GetBucketRemaining(std::string bucket_name) { + std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name); + std::string bucket_remaining = DataBucket::GetDataRemaining(full_bucket_name); + if (!bucket_remaining.empty() && atoi(bucket_remaining.c_str()) > 0) { + return bucket_remaining; + } else if (atoi(bucket_remaining.c_str()) == 0) { + return "0"; + } + return std::string(); +} + +void Mob::SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration) { + std::string full_bucket_name = fmt::format("{}-{}", GetBucketKey(), bucket_name); + DataBucket::SetData(full_bucket_name, bucket_value, expiration); +} diff --git a/zone/mob.h b/zone/mob.h index f1c128080..791c5a3e7 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -54,7 +54,7 @@ class MobMovementManager; const int COLLISION_BOX_SIZE = 8; -namespace EQEmu +namespace EQ { struct ItemData; class ItemInstance; @@ -145,7 +145,7 @@ public: uint32 in_drakkin_heritage, uint32 in_drakkin_tattoo, uint32 in_drakkin_details, - EQEmu::TintProfile in_armor_tint, + EQ::TintProfile in_armor_tint, uint8 in_aa_title, uint8 in_see_invis, // see through invis uint8 in_see_invis_undead, // see through invis vs. undead @@ -172,8 +172,8 @@ public: void DisplayInfo(Mob *mob); std::unordered_map close_mobs; - Timer mob_scan_close; - Timer mob_check_moving_timer; + Timer mob_close_scan_timer; + Timer mob_check_moving_timer; //Somewhat sorted: needs documenting! @@ -193,26 +193,27 @@ public: virtual void RangedAttack(Mob* other) { } virtual void ThrowingAttack(Mob* other) { } // 13 = Primary (default), 14 = secondary - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) = 0; void DoAttack(Mob *other, DamageHitInfo &hit, ExtraAttackOptions *opts = nullptr); int MonkSpecialAttack(Mob* other, uint8 skill_used); virtual void TryBackstab(Mob *other,int ReuseTime = 10); bool AvoidDamage(Mob *attacker, DamageHitInfo &hit); - int compute_tohit(EQEmu::skills::SkillType skillinuse); - int GetTotalToHit(EQEmu::skills::SkillType skill, int chance_mod); // compute_tohit + spell bonuses + int compute_tohit(EQ::skills::SkillType skillinuse); + int GetTotalToHit(EQ::skills::SkillType skill, int chance_mod); // compute_tohit + spell bonuses int compute_defense(); int GetTotalDefense(); // compute_defense + spell bonuses bool CheckHitChance(Mob* attacker, DamageHitInfo &hit); void TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions *opts = nullptr); void TryPetCriticalHit(Mob *defender, DamageHitInfo &hit); virtual bool TryFinishingBlow(Mob *defender, int &damage); - int TryHeadShot(Mob* defender, EQEmu::skills::SkillType skillInUse); - int TryAssassinate(Mob* defender, EQEmu::skills::SkillType skillInUse); + int TryHeadShot(Mob* defender, EQ::skills::SkillType skillInUse); + int TryAssassinate(Mob* defender, EQ::skills::SkillType skillInUse); virtual void DoRiposte(Mob* defender); void ApplyMeleeDamageMods(uint16 skill, int &damage, Mob * defender = nullptr, ExtraAttackOptions *opts = nullptr); - int ACSum(); - int offense(EQEmu::skills::SkillType skill); + int ACSum(bool skip_caps = false); + inline int GetDisplayAC() { return 1000 * (ACSum(true) + compute_defense()) / 847; } + int offense(EQ::skills::SkillType skill); int GetBestMeleeSkill(); void CalcAC() { mitigation_ac = ACSum(); } int GetACSoftcap(); @@ -221,7 +222,7 @@ public: inline int GetMitigationAC() { return mitigation_ac; } void MeleeMitigation(Mob *attacker, DamageHitInfo &hit, ExtraAttackOptions *opts = nullptr); double RollD20(int offense, int mitigation); // CALL THIS FROM THE DEFENDER - bool CombatRange(Mob* other); + bool CombatRange(Mob* other, float fixed_size_mod = 1.0, bool aeRampage = false); virtual inline bool IsBerserk() { return false; } // only clients void RogueEvade(Mob *other); void CommonOutgoingHitSuccess(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions *opts = nullptr); @@ -251,11 +252,11 @@ public: ************************************************ */ - EQEmu::InternalTextureProfile mob_texture_profile = {}; + EQ::InternalTextureProfile mob_texture_profile = {}; bool IsInvisible(Mob* other = 0) const; - EQEmu::skills::SkillType AttackAnimation(int Hand, const EQEmu::ItemInstance* weapon, EQEmu::skills::SkillType skillinuse = EQEmu::skills::Skill1HBlunt); + EQ::skills::SkillType AttackAnimation(int Hand, const EQ::ItemInstance* weapon, EQ::skills::SkillType skillinuse = EQ::skills::Skill1HBlunt); inline bool GetSeeInvisible(uint8 see_invis); inline bool SeeHide() const { return see_hide; } @@ -275,7 +276,7 @@ public: void ChangeSize(float in_size, bool bNoRestriction = false); void DoAnim(const int animnum, int type=0, bool ackreq = true, eqFilterType filter = FilterNone); - void ProjectileAnimation(Mob* to, int item_id, bool IsArrow = false, float speed = 0, float angle = 0, float tilt = 0, float arc = 0, const char *IDFile = nullptr, EQEmu::skills::SkillType skillInUse = EQEmu::skills::SkillArchery); + void ProjectileAnimation(Mob* to, int item_id, bool IsArrow = false, float speed = 0, float angle = 0, float tilt = 0, float arc = 0, const char *IDFile = nullptr, EQ::skills::SkillType skillInUse = EQ::skills::SkillArchery); void SendAppearanceEffect(uint32 parm1, uint32 parm2, uint32 parm3, uint32 parm4, uint32 parm5, Client *specific_target=nullptr); void SendLevelAppearance(); void SendStunAppearance(); @@ -285,7 +286,7 @@ public: //Song bool UseBardSpellLogic(uint16 spell_id = 0xffff, int slot = -1); - bool ApplyNextBardPulse(uint16 spell_id, Mob *spell_target, EQEmu::spells::CastingSlot slot); + bool ApplyNextBardPulse(uint16 spell_id, Mob *spell_target, EQ::spells::CastingSlot slot); void BardPulse(uint16 spell_id, Mob *caster); //Spell @@ -309,31 +310,31 @@ public: int level_override = -1); int GetResist(uint8 resist_type); int ResistPhysical(int level_diff, uint8 caster_level); - int ResistElementalWeaponDmg(const EQEmu::ItemInstance *item); - int CheckBaneDamage(const EQEmu::ItemInstance *item); + int ResistElementalWeaponDmg(const EQ::ItemInstance *item); + int CheckBaneDamage(const EQ::ItemInstance *item); uint16 GetSpecializeSkillValue(uint16 spell_id) const; void SendSpellBarDisable(); void SendSpellBarEnable(uint16 spellid); void ZeroCastingVars(); virtual void SpellProcess(); - virtual bool CastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlot slot = EQEmu::spells::CastingSlot::Item, int32 casttime = -1, + virtual bool CastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot = EQ::spells::CastingSlot::Item, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, int16 *resist_adjust = nullptr, uint32 aa_id = 0); - virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, EQEmu::spells::CastingSlot slot = EQEmu::spells::CastingSlot::Item, int32 casttime = -1, + virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot = EQ::spells::CastingSlot::Item, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, int16 resist_adjust = 0, uint32 aa_id = 0); - void CastedSpellFinished(uint16 spell_id, uint32 target_id, EQEmu::spells::CastingSlot slot, uint16 mana_used, + void CastedSpellFinished(uint16 spell_id, uint32 target_id, EQ::spells::CastingSlot slot, uint16 mana_used, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0); - bool SpellFinished(uint16 spell_id, Mob *target, EQEmu::spells::CastingSlot slot = EQEmu::spells::CastingSlot::Item, uint16 mana_used = 0, + bool SpellFinished(uint16 spell_id, Mob *target, EQ::spells::CastingSlot slot = EQ::spells::CastingSlot::Item, uint16 mana_used = 0, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0, bool isproc = false, int level_override = -1); void SendBeginCast(uint16 spell_id, uint32 casttime); virtual bool SpellOnTarget(uint16 spell_id, Mob* spelltar, bool reflect = false, bool use_resist_adjust = false, int16 resist_adjust = 0, bool isproc = false, int level_override = -1); virtual bool SpellEffect(Mob* caster, uint16 spell_id, float partial = 100, int level_override = -1); virtual bool DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_center, - CastAction_type &CastAction, EQEmu::spells::CastingSlot slot, bool isproc = false); + CastAction_type &CastAction, EQ::spells::CastingSlot slot, bool isproc = false); virtual bool CheckFizzle(uint16 spell_id); virtual bool CheckSpellLevelRestriction(uint16 spell_id); virtual bool IsImmuneToSpell(uint16 spell_id, Mob *caster); @@ -432,7 +433,7 @@ public: void SetTwoHanderEquipped(bool val) { has_twohanderequipped = val; } bool CanFacestab() { return can_facestab; } void SetFacestab(bool val) { can_facestab = val; } - virtual uint16 GetSkill(EQEmu::skills::SkillType skill_num) const { return 0; } + virtual uint16 GetSkill(EQ::skills::SkillType skill_num) const { return 0; } virtual uint32 GetEquippedItemFromTextureSlot(uint8 material_slot) const { return(0); } virtual int32 GetEquipmentMaterial(uint8 material_slot) const; virtual int32 GetHerosForgeModel(uint8 material_slot) const; @@ -440,8 +441,8 @@ public: virtual uint32 IsEliteMaterialItem(uint8 material_slot) const; bool CanClassEquipItem(uint32 item_id); bool AffectedBySpellExcludingSlot(int slot, int effect); - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill) = 0; - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill) = 0; + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None) = 0; inline virtual void SetHP(int32 hp) { if (hp >= max_hp) current_hp = max_hp; else current_hp = hp;} bool ChangeHP(Mob* other, int32 amount, uint16 spell_id = 0, int8 buffslot = -1, bool iBuffTic = false); @@ -453,7 +454,7 @@ public: virtual inline uint8 GetBaseGender() const { return base_gender; } virtual uint16 GetFactionRace(); virtual inline uint16 GetDeity() const { return deity; } - virtual EQEmu::deity::DeityTypeBit GetDeityBit() { return EQEmu::deity::ConvertDeityTypeToDeityTypeBit((EQEmu::deity::DeityType)deity); } + virtual EQ::deity::DeityTypeBit GetDeityBit() { return EQ::deity::ConvertDeityTypeToDeityTypeBit((EQ::deity::DeityType)deity); } inline uint16 GetRace() const { return race; } inline uint16 GetModel() const { return (use_model == 0) ? race : use_model; } inline uint8 GetGender() const { return gender; } @@ -483,7 +484,7 @@ public: inline void ChangeDrakkinHeritage(uint8 in) { drakkin_heritage = in; } inline void ChangeDrakkinTattoo(uint8 in) { drakkin_tattoo = in; } inline void ChangeDrakkinDetails(uint8 in) { drakkin_details = in; } - inline uint32 GetArmorTint(uint8 i) const { return armor_tint.Slot[(i < EQEmu::textures::materialCount) ? i : 0].Color; } + inline uint32 GetArmorTint(uint8 i) const { return armor_tint.Slot[(i < EQ::textures::materialCount) ? i : 0].Color; } inline uint8 GetClass() const { return class_; } inline uint8 GetLevel() const { return level; } inline uint8 GetOrigLevel() const { return orig_level; } @@ -641,6 +642,7 @@ public: Mob* GetHateDamageTop(Mob* other) { return hate_list.GetDamageTopOnHateList(other);} Mob* GetHateRandom() { return hate_list.GetRandomEntOnHateList();} Mob* GetHateMost() { return hate_list.GetEntWithMostHateOnList();} + Mob* GetHateClosest() { return hate_list.GetClosestEntOnHateList(this); } bool IsEngaged() { return(!hate_list.IsHateListEmpty()); } bool HasPrimaryAggro() { return PrimaryAggro; } bool HasAssistAggro() { return AssistAggro; } @@ -655,6 +657,7 @@ public: bool IsOnFeignMemory(Client *attacker) const; void PrintHateListToClient(Client *who) { hate_list.PrintHateListToClient(who); } std::list& GetHateList() { return hate_list.GetHateList(); } + std::list GetHateListByDistance(int distance = 0) { return hate_list.GetHateListByDistance(distance); } bool CheckLosFN(Mob* other); bool CheckLosFN(float posX, float posY, float posZ, float mobSize); static bool CheckLosFN(glm::vec3 posWatcher, float sizeWatcher, glm::vec3 posTarget, float sizeTarget); @@ -680,7 +683,7 @@ public: static uint8 GetDefaultGender(uint16 in_race, uint8 in_gender = 0xFF); static bool IsPlayerRace(uint16 in_race); uint16 GetSkillByItemType(int ItemType); - uint8 GetItemTypeBySkill(EQEmu::skills::SkillType skill); + uint8 GetItemTypeBySkill(EQ::skills::SkillType skill); virtual void MakePet(uint16 spell_id, const char* pettype, const char *petname = nullptr); virtual void MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, const char *petname = nullptr, float in_size = 0.0f); bool IsWarriorClass() const; @@ -694,6 +697,7 @@ public: bool PlotPositionOnArcInFrontOfTarget(Mob *target, float &x_dest, float &y_dest, float &z_dest, float distance, float min_deg = 5.0f, float max_deg = 150.0f); bool PlotPositionOnArcBehindTarget(Mob *target, float &x_dest, float &y_dest, float &z_dest, float distance); bool PlotPositionBehindMeFacingTarget(Mob *target, float &x_dest, float &y_dest, float &z_dest, float min_dist = 1.0f, float max_dist = 5.0f); + virtual int GetKillExpMod() const { return 100; } // aura functions void MakeAura(uint16 spell_id); @@ -709,7 +713,7 @@ public: inline AuraMgr &GetAuraMgr() { return aura_mgr; } // mainly used for zone db loading/saving //Procs - void TriggerDefensiveProcs(Mob *on, uint16 hand = EQEmu::invslot::slotPrimary, bool FromSkillProc = false, int damage = 0); + void TriggerDefensiveProcs(Mob *on, uint16 hand = EQ::invslot::slotPrimary, bool FromSkillProc = false, int damage = 0); bool AddRangedProc(uint16 spell_id, uint16 iChance = 3, uint16 base_spell_id = SPELL_UNKNOWN); bool RemoveRangedProc(uint16 spell_id, bool bAll = false); bool HasRangedProcs() const; @@ -796,7 +800,7 @@ public: int32 GetVulnerability(Mob* caster, uint32 spell_id, uint32 ticsremaining); int32 GetFcDamageAmtIncoming(Mob *caster, uint32 spell_id, bool use_skill = false, uint16 skill=0); int32 GetFocusIncoming(focusType type, int effect, Mob *caster, uint32 spell_id); - int16 GetSkillDmgTaken(const EQEmu::skills::SkillType skill_used, ExtraAttackOptions *opts = nullptr); + int16 GetSkillDmgTaken(const EQ::skills::SkillType skill_used, ExtraAttackOptions *opts = nullptr); void DoKnockback(Mob *caster, uint32 pushback, uint32 pushup); int16 CalcResistChanceBonus(); int16 CalcFearResistChance(); @@ -829,8 +833,8 @@ public: inline void SetSpellPowerDistanceMod(int16 value) { SpellPowerDistanceMod = value; }; int32 GetSpellStat(uint32 spell_id, const char *identifier, uint8 slot = 0); - void ModSkillDmgTaken(EQEmu::skills::SkillType skill_num, int value); - int16 GetModSkillDmgTaken(const EQEmu::skills::SkillType skill_num); + void ModSkillDmgTaken(EQ::skills::SkillType skill_num, int value); + int16 GetModSkillDmgTaken(const EQ::skills::SkillType skill_num); void ModVulnerability(uint8 resist, int16 value); int16 GetModVulnerability(const uint8 resist); @@ -856,17 +860,17 @@ public: bool IsDestructibleObject() { return destructibleobject; } void SetDestructibleObject(bool in) { destructibleobject = in; } - inline uint8 GetInnateLightType() { return m_Light.Type[EQEmu::lightsource::LightInnate]; } - inline uint8 GetEquipmentLightType() { return m_Light.Type[EQEmu::lightsource::LightEquipment]; } - inline uint8 GetSpellLightType() { return m_Light.Type[EQEmu::lightsource::LightSpell]; } + inline uint8 GetInnateLightType() { return m_Light.Type[EQ::lightsource::LightInnate]; } + inline uint8 GetEquipmentLightType() { return m_Light.Type[EQ::lightsource::LightEquipment]; } + inline uint8 GetSpellLightType() { return m_Light.Type[EQ::lightsource::LightSpell]; } - virtual void UpdateEquipmentLight() { m_Light.Type[EQEmu::lightsource::LightEquipment] = 0; m_Light.Level[EQEmu::lightsource::LightEquipment] = 0; } - inline void SetSpellLightType(uint8 light_type) { m_Light.Type[EQEmu::lightsource::LightSpell] = (light_type & 0x0F); m_Light.Level[EQEmu::lightsource::LightSpell] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightSpell]); } + virtual void UpdateEquipmentLight() { m_Light.Type[EQ::lightsource::LightEquipment] = 0; m_Light.Level[EQ::lightsource::LightEquipment] = 0; } + inline void SetSpellLightType(uint8 light_type) { m_Light.Type[EQ::lightsource::LightSpell] = (light_type & 0x0F); m_Light.Level[EQ::lightsource::LightSpell] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightSpell]); } - inline uint8 GetActiveLightType() { return m_Light.Type[EQEmu::lightsource::LightActive]; } + inline uint8 GetActiveLightType() { return m_Light.Type[EQ::lightsource::LightActive]; } bool UpdateActiveLight(); // returns true if change, false if no change - EQEmu::LightSourceProfile* GetLightProfile() { return &m_Light; } + EQ::LightSourceProfile* GetLightProfile() { return &m_Light; } Mob* GetPet(); void SetPet(Mob* newpet); @@ -899,6 +903,7 @@ public: inline void SetPetOwnerClient(bool value) { pet_owner_client = value; } inline bool IsTempPet() const { return _IsTempPet; } inline void SetTempPet(bool value) { _IsTempPet = value; } + inline bool IsHorse() { return is_horse; } inline const bodyType GetBodyType() const { return bodytype; } inline const bodyType GetOrigBodyType() const { return orig_bodytype; } @@ -917,7 +922,7 @@ public: virtual int GetHaste(); int32 GetMeleeMitigation(); - uint8 GetWeaponDamageBonus(const EQEmu::ItemData* weapon, bool offhand = false); + uint8 GetWeaponDamageBonus(const EQ::ItemData* weapon, bool offhand = false); const DamageTable &GetDamageTable() const; void ApplyDamageTable(DamageHitInfo &hit); virtual int GetHandToHandDamage(void); @@ -942,11 +947,11 @@ public: int32 AffectMagicalDamage(int32 damage, uint16 spell_id, const bool iBuffTic, Mob* attacker); int32 ReduceAllDamage(int32 damage); - void DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int base_damage, int min_damage = 0, int32 hate_override = -1, int ReuseTime = 10); - virtual void DoThrowingAttackDmg(Mob* other, const EQEmu::ItemInstance* RangeWeapon = nullptr, const EQEmu::ItemData* AmmoItem = nullptr, uint16 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, int AmmoSlot = 0, float speed = 4.0f); - void DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, EQEmu::skills::SkillType skillinuse, int16 chance_mod = 0, int16 focus = 0, bool CanRiposte = false, int ReuseTime = 0); - virtual void DoArcheryAttackDmg(Mob* other, const EQEmu::ItemInstance* RangeWeapon = nullptr, const EQEmu::ItemInstance* Ammo = nullptr, uint16 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, uint32 ammo_id = 0, const EQEmu::ItemData *AmmoItem = nullptr, int AmmoSlot = 0, float speed = 4.0f); - bool TryProjectileAttack(Mob* other, const EQEmu::ItemData *item, EQEmu::skills::SkillType skillInUse, uint16 weapon_dmg, const EQEmu::ItemInstance* RangeWeapon, const EQEmu::ItemInstance* Ammo, int AmmoSlot, float speed); + void DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int base_damage, int min_damage = 0, int32 hate_override = -1, int ReuseTime = 10); + virtual void DoThrowingAttackDmg(Mob* other, const EQ::ItemInstance* RangeWeapon = nullptr, const EQ::ItemData* AmmoItem = nullptr, uint16 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, int AmmoSlot = 0, float speed = 4.0f); + void DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, EQ::skills::SkillType skillinuse, int16 chance_mod = 0, int16 focus = 0, bool CanRiposte = false, int ReuseTime = 0); + virtual void DoArcheryAttackDmg(Mob* other, const EQ::ItemInstance* RangeWeapon = nullptr, const EQ::ItemInstance* Ammo = nullptr, uint16 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, uint32 ammo_id = 0, const EQ::ItemData *AmmoItem = nullptr, int AmmoSlot = 0, float speed = 4.0f); + bool TryProjectileAttack(Mob* other, const EQ::ItemData *item, EQ::skills::SkillType skillInUse, uint16 weapon_dmg, const EQ::ItemInstance* RangeWeapon, const EQ::ItemInstance* Ammo, int AmmoSlot, float speed); void ProjectileAttack(); inline bool HasProjectileAttack() const { return ActiveProjectileATK; } inline void SetProjectileAttack(bool value) { ActiveProjectileATK = value; } @@ -1083,7 +1088,7 @@ public: // HP Event inline int GetNextHPEvent() const { return nexthpevent; } void SetNextHPEvent( int hpevent ); - void SendItemAnimation(Mob *to, const EQEmu::ItemData *item, EQEmu::skills::SkillType skillInUse, float velocity = 4.0); + void SendItemAnimation(Mob *to, const EQ::ItemData *item, EQ::skills::SkillType skillInUse, float velocity = 4.0); inline int& GetNextIncHPEvent() { return nextinchpevent; } void SetNextIncHPEvent( int inchpevent ); @@ -1136,7 +1141,7 @@ public: bool HasSpellEffect(int effectid); int mod_effect_value(int effect_value, uint16 spell_id, int effect_type, Mob* caster, uint16 caster_id); - float mod_hit_chance(float chancetohit, EQEmu::skills::SkillType skillinuse, Mob* attacker); + float mod_hit_chance(float chancetohit, EQ::skills::SkillType skillinuse, Mob* attacker); float mod_riposte_chance(float ripostchance, Mob* attacker); float mod_block_chance(float blockchance, Mob* attacker); float mod_parry_chance(float parrychance, Mob* attacker); @@ -1147,11 +1152,11 @@ public: int32 mod_kick_damage(int32 dmg); int32 mod_bash_damage(int32 dmg); int32 mod_frenzy_damage(int32 dmg); - int32 mod_monk_special_damage(int32 ndamage, EQEmu::skills::SkillType skill_type); + int32 mod_monk_special_damage(int32 ndamage, EQ::skills::SkillType skill_type); int32 mod_backstab_damage(int32 ndamage); - int mod_archery_bonus_chance(int bonuschance, const EQEmu::ItemInstance* RangeWeapon); - uint32 mod_archery_bonus_damage(uint32 MaxDmg, const EQEmu::ItemInstance* RangeWeapon); - int32 mod_archery_damage(int32 TotalDmg, bool hasbonus, const EQEmu::ItemInstance* RangeWeapon); + int mod_archery_bonus_chance(int bonuschance, const EQ::ItemInstance* RangeWeapon); + uint32 mod_archery_bonus_damage(uint32 MaxDmg, const EQ::ItemInstance* RangeWeapon); + int32 mod_archery_damage(int32 TotalDmg, bool hasbonus, const EQ::ItemInstance* RangeWeapon); uint16 mod_throwing_damage(uint16 MaxDmg); int32 mod_cast_time(int32 cast_time); int mod_buff_duration(int res, Mob* caster, Mob* target, uint16 spell_id); @@ -1166,7 +1171,7 @@ public: uint32 Tune_GetMeanDamage(Mob* GM, Mob *attacker, int32 damage, int32 minhit, ExtraAttackOptions *opts = nullptr, int Msg = 0,int ac_override=0, int atk_override=0, int add_ac=0, int add_atk = 0); void Tune_FindATKByPctMitigation(Mob* defender, Mob *attacker, float pct_mitigation, int interval = 50, int max_loop = 100, int ac_override=0,int Msg =0); void Tune_FindACByPctMitigation(Mob* defender, Mob *attacker, float pct_mitigation, int interval = 50, int max_loop = 100, int atk_override=0,int Msg =0); - float Tune_CheckHitChance(Mob* defender, Mob* attacker, EQEmu::skills::SkillType skillinuse, int Hand, int16 chance_mod, int Msg = 1, int acc_override = 0, int avoid_override = 0, int add_acc = 0, int add_avoid = 0); + float Tune_CheckHitChance(Mob* defender, Mob* attacker, EQ::skills::SkillType skillinuse, int Hand, int16 chance_mod, int Msg = 1, int acc_override = 0, int avoid_override = 0, int add_acc = 0, int add_avoid = 0); void Tune_FindAccuaryByHitChance(Mob* defender, Mob *attacker, float hit_chance, int interval, int max_loop, int avoid_override, int Msg = 0); void Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_chance, int interval, int max_loop, int acc_override, int Msg = 0); @@ -1187,12 +1192,21 @@ public: void AddAssistCap() { ++npc_assist_cap; } void DelAssistCap() { --npc_assist_cap; } void ResetAssistCap() { npc_assist_cap = 0; } - int GetWeaponDamage(Mob *against, const EQEmu::ItemData *weapon_item); - int GetWeaponDamage(Mob *against, const EQEmu::ItemInstance *weapon_item, uint32 *hate = nullptr); + int GetWeaponDamage(Mob *against, const EQ::ItemData *weapon_item); + int GetWeaponDamage(Mob *against, const EQ::ItemInstance *weapon_item, uint32 *hate = nullptr); int32 GetHPRegen() const; int32 GetManaRegen() const; + bool CanOpenDoors() const; + void SetCanOpenDoors(bool can_open); + + void DeleteBucket(std::string bucket_name); + std::string GetBucket(std::string bucket_name); + std::string GetBucketExpires(std::string bucket_name); + std::string GetBucketKey(); + std::string GetBucketRemaining(std::string bucket_name); + void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration = ""); #ifdef BOTS // Bots HealRotation methods @@ -1214,7 +1228,7 @@ public: #endif protected: - void CommonDamage(Mob* other, int &damage, const uint16 spell_id, const EQEmu::skills::SkillType attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic, eSpecialAttacks specal = eSpecialAttacks::None); + void CommonDamage(Mob* other, int &damage, const uint16 spell_id, const EQ::skills::SkillType attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic, eSpecialAttacks specal = eSpecialAttacks::None); static uint16 GetProcID(uint16 spell_id, uint8 effect_index); float _GetMovementSpeed(int mod) const; int _GetWalkSpeed() const; @@ -1231,7 +1245,7 @@ protected: std::vector RampageArray; std::map m_EntityVariables; - int16 SkillDmgTaken_Mod[EQEmu::skills::HIGHEST_SKILL + 2]; + int16 SkillDmgTaken_Mod[EQ::skills::HIGHEST_SKILL + 2]; int16 Vulnerability_Mod[HIGHEST_RESIST+2]; bool m_AllowBeneficial; bool m_DisableMelee; @@ -1341,19 +1355,19 @@ protected: void TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success = false, uint16 hand = 0, bool IsDefensive = false); // hand = SlotCharm? bool PassLimitToSkill(uint16 spell_id, uint16 skill); bool PassLimitClass(uint32 Classes_, uint16 Class_); - void TryDefensiveProc(Mob *on, uint16 hand = EQEmu::invslot::slotPrimary); - void TryWeaponProc(const EQEmu::ItemInstance* inst, const EQEmu::ItemData* weapon, Mob *on, uint16 hand = EQEmu::invslot::slotPrimary); - void TrySpellProc(const EQEmu::ItemInstance* inst, const EQEmu::ItemData* weapon, Mob *on, uint16 hand = EQEmu::invslot::slotPrimary); - void TryWeaponProc(const EQEmu::ItemInstance* weapon, Mob *on, uint16 hand = EQEmu::invslot::slotPrimary); - void ExecWeaponProc(const EQEmu::ItemInstance* weapon, uint16 spell_id, Mob *on, int level_override = -1); - virtual float GetProcChances(float ProcBonus, uint16 hand = EQEmu::invslot::slotPrimary); - virtual float GetDefensiveProcChances(float &ProcBonus, float &ProcChance, uint16 hand = EQEmu::invslot::slotPrimary, Mob *on = nullptr); + void TryDefensiveProc(Mob *on, uint16 hand = EQ::invslot::slotPrimary); + void TryWeaponProc(const EQ::ItemInstance* inst, const EQ::ItemData* weapon, Mob *on, uint16 hand = EQ::invslot::slotPrimary); + void TrySpellProc(const EQ::ItemInstance* inst, const EQ::ItemData* weapon, Mob *on, uint16 hand = EQ::invslot::slotPrimary); + void TryWeaponProc(const EQ::ItemInstance* weapon, Mob *on, uint16 hand = EQ::invslot::slotPrimary); + void ExecWeaponProc(const EQ::ItemInstance* weapon, uint16 spell_id, Mob *on, int level_override = -1); + virtual float GetProcChances(float ProcBonus, uint16 hand = EQ::invslot::slotPrimary); + virtual float GetDefensiveProcChances(float &ProcBonus, float &ProcChance, uint16 hand = EQ::invslot::slotPrimary, Mob *on = nullptr); virtual float GetSkillProcChances(uint16 ReuseTime, uint16 hand = 0); // hand = MainCharm? uint16 GetWeaponSpeedbyHand(uint16 hand); #ifdef BOTS virtual #endif - int GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target = nullptr); + int GetBaseSkillDamage(EQ::skills::SkillType skill, Mob *target = nullptr); virtual int16 GetFocusEffect(focusType type, uint16 spell_id) { return 0; } void CalculateNewFearpoint(); float FindGroundZ(float new_x, float new_y, float z_offset=0.0); @@ -1379,7 +1393,7 @@ protected: // ideally we should use real models, but this should be quick and work mostly glm::vec4 m_CollisionBox[COLLISION_BOX_SIZE]; - EQEmu::LightSourceProfile m_Light; + EQ::LightSourceProfile m_Light; float fixedZ; EmuAppearance _appearance; @@ -1403,7 +1417,7 @@ protected: int attacked_count; bool delaytimer; uint16 casting_spell_targetid; - EQEmu::spells::CastingSlot casting_spell_slot; + EQ::spells::CastingSlot casting_spell_slot; uint16 casting_spell_mana; uint32 casting_spell_inventory_slot; uint32 casting_spell_timer; @@ -1413,7 +1427,7 @@ protected: uint32 casting_spell_aa_id; bool casting_spell_checks; uint16 bardsong; - EQEmu::spells::CastingSlot bardsong_slot; + EQ::spells::CastingSlot bardsong_slot; uint32 bardsong_target_id; bool ActiveProjectileATK; @@ -1438,7 +1452,7 @@ protected: uint32 drakkin_heritage; uint32 drakkin_tattoo; uint32 drakkin_details; - EQEmu::TintProfile armor_tint; + EQ::TintProfile armor_tint; uint8 aa_title; @@ -1472,6 +1486,7 @@ public: bool GetWasSpawnedInWater() const; void SetSpawnedInWater(bool spawned_in_water); + bool turning; protected: @@ -1567,7 +1582,7 @@ protected: glm::vec3 m_TargetRing; // we might want to do this differently, we gotta do max NPC buffs ... which is 97 - uint32 m_spellHitsLeft[EQEmu::spells::TOTAL_BUFFS]; // Used to track which spells will have their numhits incremented when spell finishes casting + uint32 m_spellHitsLeft[EQ::spells::TOTAL_BUFFS]; // Used to track which spells will have their numhits incremented when spell finishes casting GravityBehavior flymode; bool m_targetable; int QGVarDuration(const char *fmt); @@ -1580,18 +1595,21 @@ protected: std::unordered_map> aa_ranks; Timer aa_timers[aaTimerMax]; - - bool IsHorse; + + bool is_horse; AuraMgr aura_mgr; AuraMgr trap_mgr; + bool m_can_open_doors; + MobMovementManager *mMovementManager; private: void _StopSong(); //this is not what you think it is Mob* target; + #ifdef BOTS std::shared_ptr m_target_of_heal_rotation; diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 708c03fa6..306c6dd64 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -117,7 +117,8 @@ bool NPC::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes, bool bInnates ( (spells[AIspells[i].spellid].targettype == ST_HateList || spells[AIspells[i].spellid].targettype == ST_AETargetHateList) || ( - (spells[AIspells[i].spellid].targettype==ST_AECaster || spells[AIspells[i].spellid].targettype==ST_AEBard) + // note: I think this check is actually wrong and we should be checking range instead in all cases, BUT if range is 0, range check is skipped? Works for now + (spells[AIspells[i].spellid].targettype==ST_AECaster || spells[AIspells[i].spellid].targettype==ST_AEBard || spells[AIspells[i].spellid].targettype==ST_AEClientV1) && dist2 <= spells[AIspells[i].spellid].aoerange*spells[AIspells[i].spellid].aoerange ) || dist2 <= spells[AIspells[i].spellid].range*spells[AIspells[i].spellid].range @@ -144,7 +145,7 @@ bool NPC::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes, bool bInnates int min_hp = AIspells[i].min_hp; // well 0 is default, so no special case here int max_hp = AIspells[i].max_hp ? AIspells[i].max_hp : RuleI(Spells, AI_HealHPPct); - if (EQEmu::ValueWithin(hp_ratio, min_hp, max_hp) || (tar->IsClient() && hp_ratio <= 99)) { // not sure about client bit, leaving it + if (EQ::ValueWithin(hp_ratio, min_hp, max_hp) || (tar->IsClient() && hp_ratio <= 99)) { // not sure about client bit, leaving it uint32 tempTime = 0; AIDoSpellCast(i, tar, mana_cost, &tempTime); tar->SetDontHealMeBefore(tempTime); @@ -375,7 +376,7 @@ bool NPC::AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgain #endif casting_spell_AIindex = i; - return CastSpell(AIspells[i].spellid, tar->GetID(), EQEmu::spells::CastingSlot::Gem2, AIspells[i].manacost == -2 ? 0 : -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, &(AIspells[i].resist_adjust)); + return CastSpell(AIspells[i].spellid, tar->GetID(), EQ::spells::CastingSlot::Gem2, AIspells[i].manacost == -2 ? 0 : -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, &(AIspells[i].resist_adjust)); } void Mob::AI_Init() @@ -434,23 +435,27 @@ void Mob::AI_Start(uint32 iMoveDelay) { time_until_can_move = 0; pAIControlled = true; - AI_think_timer = std::unique_ptr(new Timer(AIthink_duration)); + AI_think_timer = std::make_unique(AIthink_duration); AI_think_timer->Trigger(); - AI_walking_timer = std::unique_ptr(new Timer(0)); - AI_movement_timer = std::unique_ptr(new Timer(AImovement_duration)); - AI_target_check_timer = std::unique_ptr(new Timer(AItarget_check_duration)); - AI_feign_remember_timer = std::unique_ptr(new Timer(AIfeignremember_delay)); - AI_scan_door_open_timer = std::unique_ptr(new Timer(AI_scan_door_open_interval)); + AI_walking_timer = std::make_unique(0); + AI_movement_timer = std::make_unique(AImovement_duration); + AI_target_check_timer = std::make_unique(AItarget_check_duration); + AI_feign_remember_timer = std::make_unique(AIfeignremember_delay); + AI_scan_door_open_timer = std::make_unique(AI_scan_door_open_interval); + + if (GetBodyType() == BT_Animal && !RuleB(NPC, AnimalsOpenDoors)) { + SetCanOpenDoors(false); + } if(!RuleB(Aggro, NPCAggroMaxDistanceEnabled)) { hate_list_cleanup_timer.Disable(); } if (CastToNPC()->WillAggroNPCs()) - AI_scan_area_timer = std::unique_ptr(new Timer(RandomTimer(RuleI(NPC, NPCToNPCAggroTimerMin), RuleI(NPC, NPCToNPCAggroTimerMax)))); - - AI_check_signal_timer = std::unique_ptr(new Timer(AI_check_signal_timer_delay)); + AI_scan_area_timer = std::make_unique(RandomTimer(RuleI(NPC, NPCToNPCAggroTimerMin), RuleI(NPC, NPCToNPCAggroTimerMax))); + + AI_check_signal_timer = std::make_unique(AI_check_signal_timer_delay); if (GetAggroRange() == 0) @@ -483,10 +488,10 @@ void NPC::AI_Start(uint32 iMoveDelay) { return; if (AIspells.empty()) { - AIautocastspell_timer = std::unique_ptr(new Timer(1000)); + AIautocastspell_timer = std::make_unique(1000); AIautocastspell_timer->Disable(); } else { - AIautocastspell_timer = std::unique_ptr(new Timer(500)); + AIautocastspell_timer = std::make_unique(500); AIautocastspell_timer->Start(RandomTimer(0, 300), false); } @@ -635,11 +640,11 @@ void Client::AI_SpellCast() } uint32 spell_to_cast = 0xFFFFFFFF; - EQEmu::spells::CastingSlot slot_to_use = EQEmu::spells::CastingSlot::Item; + EQ::spells::CastingSlot slot_to_use = EQ::spells::CastingSlot::Item; if(valid_spells.size() == 1) { spell_to_cast = valid_spells[0]; - slot_to_use = static_cast(slots[0]); + slot_to_use = static_cast(slots[0]); } else if(valid_spells.empty()) { @@ -649,7 +654,7 @@ void Client::AI_SpellCast() { uint32 idx = zone->random.Int(0, (valid_spells.size()-1)); spell_to_cast = valid_spells[idx]; - slot_to_use = static_cast(slots[idx]); + slot_to_use = static_cast(slots[idx]); } if(IsMezSpell(spell_to_cast) || IsFearSpell(spell_to_cast)) @@ -747,6 +752,13 @@ void Client::AI_Process() RunTo(m_FearWalkTarget.x, m_FearWalkTarget.y, m_FearWalkTarget.z); } } + if (RuleB(Character, ProcessFearedProximity) && proximity_timer.Check()) { + entity_list.ProcessMove(this, glm::vec3(GetX(), GetY(), GetZ())); + if (RuleB(TaskSystem, EnableTaskSystem) && RuleB(TaskSystem, EnableTaskProximity)) + ProcessTaskProximities(GetX(), GetY(), GetZ()); + + m_Proximity = glm::vec3(GetX(), GetY(), GetZ()); + } return; } @@ -796,7 +808,7 @@ void Client::AI_Process() if (GetTarget() && !IsStunned() && !IsMezzed() && !GetFeigned()) { if (attack_timer.Check()) { // Should charmed clients not be procing? - DoAttackRounds(GetTarget(), EQEmu::invslot::slotPrimary); + DoAttackRounds(GetTarget(), EQ::invslot::slotPrimary); } } @@ -804,7 +816,7 @@ void Client::AI_Process() if (attack_dw_timer.Check()) { if (CheckDualWield()) { // Should charmed clients not be procing? - DoAttackRounds(GetTarget(), EQEmu::invslot::slotSecondary); + DoAttackRounds(GetTarget(), EQ::invslot::slotSecondary); } } } @@ -876,49 +888,49 @@ void Mob::ProcessForcedMovement() if (AI_movement_timer->Check()) { bool bPassed = true; glm::vec3 normal; - + // no zone map = fucked if (zone->HasMap()) { // in front m_CollisionBox[0].x = m_Position.x + 3.0f * g_Math.FastSin(0.0f); m_CollisionBox[0].y = m_Position.y + 3.0f * g_Math.FastCos(0.0f); m_CollisionBox[0].z = m_Position.z; - + // 45 right front m_CollisionBox[1].x = m_Position.x + 3.0f * g_Math.FastSin(64.0f); m_CollisionBox[1].y = m_Position.y + 3.0f * g_Math.FastCos(64.0f); m_CollisionBox[1].z = m_Position.z; - + // to right m_CollisionBox[2].x = m_Position.x + 3.0f * g_Math.FastSin(128.0f); m_CollisionBox[2].y = m_Position.y + 3.0f * g_Math.FastCos(128.0f); m_CollisionBox[2].z = m_Position.z; - + // 45 right back m_CollisionBox[3].x = m_Position.x + 3.0f * g_Math.FastSin(192.0f); m_CollisionBox[3].y = m_Position.y + 3.0f * g_Math.FastCos(192.0f); m_CollisionBox[3].z = m_Position.z; - + // behind m_CollisionBox[4].x = m_Position.x + 3.0f * g_Math.FastSin(256.0f); m_CollisionBox[4].y = m_Position.y + 3.0f * g_Math.FastCos(256.0f); m_CollisionBox[4].z = m_Position.z; - + // 45 left back m_CollisionBox[5].x = m_Position.x + 3.0f * g_Math.FastSin(320.0f); m_CollisionBox[5].y = m_Position.y + 3.0f * g_Math.FastCos(320.0f); m_CollisionBox[5].z = m_Position.z; - + // to left m_CollisionBox[6].x = m_Position.x + 3.0f * g_Math.FastSin(384.0f); m_CollisionBox[6].y = m_Position.y + 3.0f * g_Math.FastCos(384.0f); m_CollisionBox[6].z = m_Position.z; - + // 45 left front m_CollisionBox[7].x = m_Position.x + 3.0f * g_Math.FastSin(448.0f); m_CollisionBox[7].y = m_Position.y + 3.0f * g_Math.FastCos(448.0f); m_CollisionBox[7].z = m_Position.z; - + // collision happened, need to move along the wall float distance = 0.0f, shortest = std::numeric_limits::infinity(); glm::vec3 tmp_nrm; @@ -932,7 +944,7 @@ void Mob::ProcessForcedMovement() } } } - + if (bPassed) { ForcedMovement = 0; Teleport(m_Position + m_Delta); @@ -970,23 +982,25 @@ void Mob::AI_Process() { engaged = false; } - if (moving) { + if (moving && CanOpenDoors()) { if (AI_scan_door_open_timer->Check()) { - auto &door_list = entity_list.GetDoorsList(); for (auto itr : door_list) { Doors *door = itr.second; - if (door->GetKeyItem()) + if (door->GetKeyItem()) { continue; + } - if (door->GetLockpick()) + if (door->GetLockpick()) { continue; + } - if (door->IsDoorOpen()) + if (door->IsDoorOpen()) { continue; + } - float distance = DistanceSquared(this->m_Position, door->GetPosition()); + float distance = DistanceSquared(m_Position, door->GetPosition()); float distance_scan_door_open = 20; if (distance <= (distance_scan_door_open * distance_scan_door_open)) { @@ -995,8 +1009,9 @@ void Mob::AI_Process() { * Make sure we're opening a door within height relevance and not platforms * above or below */ - if (std::abs(this->m_Position.z - door->GetPosition().z) > 10) + if (std::abs(this->m_Position.z - door->GetPosition().z) > 10) { continue; + } door->ForceOpen(this); } @@ -1152,7 +1167,7 @@ void Mob::AI_Process() { //try main hand first if (attack_timer.Check()) { DoMainHandAttackRounds(target); - TriggerDefensiveProcs(target, EQEmu::invslot::slotPrimary, false); + TriggerDefensiveProcs(target, EQ::invslot::slotPrimary, false); bool specialed = false; // NPCs can only do one of these a round if (GetSpecialAbility(SPECATK_FLURRY)) { @@ -1312,7 +1327,10 @@ void Mob::AI_Process() { FaceTarget(); } } - else if (AI_movement_timer->Check() && target) { + // mob/npc waits until call for help complete, others can move + else if (AI_movement_timer->Check() && target && + (GetOwnerID() || IsBot() || + CastToNPC()->GetCombatEvent())) { if (!IsRooted()) { LogAI("Pursuing [{}] while engaged", target->GetName()); RunTo(target->GetX(), target->GetY(), target->GetZ()); @@ -1542,10 +1560,10 @@ void NPC::AI_DoMovement() { // Check if we're already moving to a WP // If so, if we're not moving we have arrived and need to set delay - if (GetCWP() == EQEmu::WaypointStatus::RoamBoxPauseInProgress && !IsMoving()) { + if (GetCWP() == EQ::WaypointStatus::RoamBoxPauseInProgress && !IsMoving()) { // We have arrived - int roambox_move_delay = EQEmu::ClampLower(GetRoamboxDelay(), GetRoamboxMinDelay()); + int roambox_move_delay = EQ::ClampLower(GetRoamboxDelay(), GetRoamboxMinDelay()); int move_delay_max = (roambox_move_delay > 0 ? roambox_move_delay : (int) GetRoamboxMinDelay() * 4); int random_timer = RandomTimer( GetRoamboxMinDelay(), @@ -1572,8 +1590,8 @@ void NPC::AI_DoMovement() { auto move_x = static_cast(zone->random.Real(-roambox_distance, roambox_distance)); auto move_y = static_cast(zone->random.Real(-roambox_distance, roambox_distance)); - roambox_destination_x = EQEmu::Clamp((GetX() + move_x), roambox_min_x, roambox_max_x); - roambox_destination_y = EQEmu::Clamp((GetY() + move_y), roambox_min_y, roambox_max_y); + roambox_destination_x = EQ::Clamp((GetX() + move_x), roambox_min_x, roambox_max_x); + roambox_destination_y = EQ::Clamp((GetY() + move_y), roambox_min_y, roambox_max_y); /** * If our roambox was configured with large distances, chances of hitting the min or max end of @@ -1594,11 +1612,12 @@ void NPC::AI_DoMovement() { * if the roam box was sloppily configured */ if (!this->GetWasSpawnedInWater()) { + roambox_destination_z = GetGroundZ(roambox_destination_x, roambox_destination_y); if (zone->HasMap() && zone->HasWaterMap()) { auto position = glm::vec3( roambox_destination_x, roambox_destination_y, - (m_Position.z - 15) + roambox_destination_z ); /** @@ -1618,6 +1637,19 @@ void NPC::AI_DoMovement() { } } } + else { // Mob was in water, make sure new spot is in water also + roambox_destination_z = m_Position.z; + auto position = glm::vec3( + roambox_destination_x, + roambox_destination_y, + m_Position.z + 15 + ); + if (zone->HasWaterMap() && !zone->watermap->InLiquid(position)) { + roambox_destination_x = m_SpawnPoint.x; + roambox_destination_y = m_SpawnPoint.y; + roambox_destination_z = m_SpawnPoint.z; + } + } PathfinderOptions opts; opts.smooth_path = true; @@ -1632,7 +1664,7 @@ void NPC::AI_DoMovement() { glm::vec3( roambox_destination_x, roambox_destination_y, - GetGroundZ(roambox_destination_x, roambox_destination_y) + roambox_destination_z ), partial, stuck, @@ -1648,8 +1680,6 @@ void NPC::AI_DoMovement() { return; } - roambox_destination_z = 0; - Log( Logs::General, Logs::NPCRoamBox, @@ -1665,7 +1695,7 @@ void NPC::AI_DoMovement() { roambox_destination_z ); - SetCurrentWP(EQEmu::WaypointStatus::RoamBoxPauseInProgress); + SetCurrentWP(EQ::WaypointStatus::RoamBoxPauseInProgress); NavigateTo(roambox_destination_x, roambox_destination_y, roambox_destination_z); } @@ -1679,7 +1709,7 @@ void NPC::AI_DoMovement() { int32 gridno = CastToNPC()->GetGrid(); - if (gridno > 0 || cur_wp == EQEmu::WaypointStatus::QuestControlNoGrid) { + if (gridno > 0 || cur_wp == EQ::WaypointStatus::QuestControlNoGrid) { if (pause_timer_complete == true) { // time to pause at wp is over AI_SetupNextWaypoint(); } // endif (pause_timer_complete==true) @@ -1700,7 +1730,9 @@ void NPC::AI_DoMovement() { // reached our randomly selected destination; force a pause if (cur_wp_pause == 0) { - if (Waypoints.size() > 0 && Waypoints[0].pause) + if (Waypoints.size() >= cur_wp && Waypoints[cur_wp].pause) + cur_wp_pause = Waypoints[cur_wp].pause; + else if (Waypoints.size() > 0 && Waypoints[0].pause) cur_wp_pause = Waypoints[0].pause; else cur_wp_pause = 38; @@ -1718,7 +1750,7 @@ void NPC::AI_DoMovement() { if (cur_wp_pause > 0 && m_CurrentWayPoint.w >= 0.0) { RotateTo(m_CurrentWayPoint.w); } - + //kick off event_waypoint arrive char temp[16]; sprintf(temp, "%d", cur_wp); @@ -1729,10 +1761,10 @@ void NPC::AI_DoMovement() { // as that is where roamer is unset and we don't want // the next trip through to move again based on grid stuff. doMove = false; - if (cur_wp == EQEmu::WaypointStatus::QuestControlNoGrid) { + if (cur_wp == EQ::WaypointStatus::QuestControlNoGrid) { AI_SetupNextWaypoint(); } - + // wipe feign memory since we reached our first waypoint if (cur_wp == 1) ClearFeignMemory(); @@ -1750,7 +1782,7 @@ void NPC::AI_DoMovement() { m_CurrentWayPoint.y, m_CurrentWayPoint.z ); - + } } } // endif (gridno > 0) @@ -1759,15 +1791,15 @@ void NPC::AI_DoMovement() { if (pause_timer_complete == true) { // time to pause has ended SetGrid(0 - GetGrid()); // revert to AI control LogPathing("Quest pathing is finished. Resuming on grid [{}]", GetGrid()); - + SetAppearance(eaStanding, false); - + CalculateNewWaypoint(); } } } - else if (IsGuarding()) { + else if (IsGuarding()) { bool at_gp = IsPositionEqualWithinCertainZ(m_Position, m_GuardPoint, 15.0f); if (at_gp) { @@ -1827,22 +1859,22 @@ void NPC::AI_SetupNextWaypoint() { cur_wp ); //if we were under quest control (with no grid), we are done now.. - if (cur_wp == EQEmu::WaypointStatus::QuestControlNoGrid) { + if (cur_wp == EQ::WaypointStatus::QuestControlNoGrid) { LogPathing("Non-grid quest mob has reached its quest ordered waypoint. Leaving pathing mode"); roamer = false; cur_wp = 0; } - + SetAppearance(eaStanding, false); - + entity_list.OpenDoorsNear(this); - + if (!DistractedFromGrid) { //kick off event_waypoint depart char temp[16]; sprintf(temp, "%d", cur_wp); parse->EventNPC(EVENT_WAYPOINT_DEPART, CastToNPC(), nullptr, temp, 0); - + //setup our next waypoint, if we are still on our normal grid //remember that the quest event above could have done anything it wanted with our grid if (GetGrid() > 0) { @@ -1912,7 +1944,7 @@ void Mob::AI_Event_NoLongerEngaged() { time_until_can_move += minLastFightingDelayMoving; else time_until_can_move += zone->random.Int(minLastFightingDelayMoving, maxLastFightingDelayMoving); - + StopNavigation(); ClearRampage(); @@ -2104,7 +2136,7 @@ bool Mob::Flurry(ExtraAttackOptions *opts) int num_attacks = GetSpecialAbilityParam(SPECATK_FLURRY, 1); num_attacks = num_attacks > 0 ? num_attacks : RuleI(Combat, MaxFlurryHits); for (int i = 0; i < num_attacks; i++) - Attack(target, EQEmu::invslot::slotPrimary, false, false, false, opts); + Attack(target, EQ::invslot::slotPrimary, false, false, false, opts); } return true; } @@ -2457,7 +2489,7 @@ create table npc_spells_entries ( ); */ -bool IsSpellInList(DBnpcspells_Struct* spell_list, int16 iSpellID); +bool IsSpellInList(DBnpcspells_Struct* spell_list, uint16 iSpellID); bool IsSpellEffectInList(DBnpcspellseffects_Struct* spelleffect_list, uint16 iSpellEffectID, int32 base, int32 limit, int32 max); bool NPC::AI_AddNPCSpells(uint32 iDBSpellsID) { @@ -2729,14 +2761,14 @@ bool IsSpellEffectInList(DBnpcspellseffects_Struct* spelleffect_list, uint16 iSp return false; } -bool IsSpellInList(DBnpcspells_Struct* spell_list, int16 iSpellID) { +bool IsSpellInList(DBnpcspells_Struct* spell_list, uint16 iSpellID) { auto it = std::find_if(spell_list->entries.begin(), spell_list->entries.end(), [iSpellID](const DBnpcspells_entries_Struct &a) { return a.spellid == iSpellID; }); return it != spell_list->entries.end(); } // adds a spell to the list, taking into account priority and resorting list as needed. -void NPC::AddSpellToNPCList(int16 iPriority, int16 iSpellID, uint32 iType, +void NPC::AddSpellToNPCList(int16 iPriority, uint16 iSpellID, uint32 iType, int16 iManaCost, int32 iRecastDelay, int16 iResistAdjust, int8 min_hp, int8 max_hp) { @@ -2763,7 +2795,7 @@ void NPC::AddSpellToNPCList(int16 iPriority, int16 iSpellID, uint32 iType, AIautocastspell_timer->Start(RandomTimer(0, 300), false); } -void NPC::RemoveSpellFromNPCList(int16 spell_id) +void NPC::RemoveSpellFromNPCList(uint16 spell_id) { auto iter = AIspells.begin(); while(iter != AIspells.end()) diff --git a/zone/mob_appearance.cpp b/zone/mob_appearance.cpp index fe4e07eee..c02d27e11 100644 --- a/zone/mob_appearance.cpp +++ b/zone/mob_appearance.cpp @@ -27,6 +27,7 @@ #include "mob.h" #include "quest_parser_collection.h" #include "zonedb.h" +#include "zone_store.h" #ifdef BOTS #include "bot.h" @@ -52,47 +53,47 @@ void Mob::SetMobTextureProfile(uint8 material_slot, uint16 texture, uint32 color ); switch (material_slot) { - case EQEmu::textures::armorHead: + case EQ::textures::armorHead: mob_texture_profile.Head.Material = texture; mob_texture_profile.Head.HerosForgeModel = hero_forge_model; mob_texture_profile.Head.Color = color; break; - case EQEmu::textures::armorChest: + case EQ::textures::armorChest: mob_texture_profile.Chest.Material = texture; mob_texture_profile.Chest.HerosForgeModel = hero_forge_model; mob_texture_profile.Chest.Color = color; break; - case EQEmu::textures::armorArms: + case EQ::textures::armorArms: mob_texture_profile.Arms.Material = texture; mob_texture_profile.Arms.HerosForgeModel = hero_forge_model; mob_texture_profile.Arms.Color = color; break; - case EQEmu::textures::armorWrist: + case EQ::textures::armorWrist: mob_texture_profile.Wrist.Material = texture; mob_texture_profile.Wrist.HerosForgeModel = hero_forge_model; mob_texture_profile.Wrist.Color = color; break; - case EQEmu::textures::armorHands: + case EQ::textures::armorHands: mob_texture_profile.Hands.Material = texture; mob_texture_profile.Hands.HerosForgeModel = hero_forge_model; mob_texture_profile.Hands.Color = color; break; - case EQEmu::textures::armorLegs: + case EQ::textures::armorLegs: mob_texture_profile.Legs.Material = texture; mob_texture_profile.Legs.HerosForgeModel = hero_forge_model; mob_texture_profile.Legs.Color = color; break; - case EQEmu::textures::armorFeet: + case EQ::textures::armorFeet: mob_texture_profile.Feet.Material = texture; mob_texture_profile.Feet.HerosForgeModel = hero_forge_model; mob_texture_profile.Feet.Color = color; break; - case EQEmu::textures::weaponPrimary: + case EQ::textures::weaponPrimary: mob_texture_profile.Primary.Material = texture; mob_texture_profile.Primary.HerosForgeModel = hero_forge_model; mob_texture_profile.Primary.Color = color; break; - case EQEmu::textures::weaponSecondary: + case EQ::textures::weaponSecondary: mob_texture_profile.Secondary.Material = texture; mob_texture_profile.Secondary.HerosForgeModel = hero_forge_model; mob_texture_profile.Secondary.Color = color; @@ -111,23 +112,23 @@ void Mob::SetMobTextureProfile(uint8 material_slot, uint16 texture, uint32 color int32 Mob::GetTextureProfileMaterial(uint8 material_slot) const { switch (material_slot) { - case EQEmu::textures::armorHead: + case EQ::textures::armorHead: return mob_texture_profile.Head.Material; - case EQEmu::textures::armorChest: + case EQ::textures::armorChest: return mob_texture_profile.Chest.Material; - case EQEmu::textures::armorArms: + case EQ::textures::armorArms: return mob_texture_profile.Arms.Material; - case EQEmu::textures::armorWrist: + case EQ::textures::armorWrist: return mob_texture_profile.Wrist.Material; - case EQEmu::textures::armorHands: + case EQ::textures::armorHands: return mob_texture_profile.Hands.Material; - case EQEmu::textures::armorLegs: + case EQ::textures::armorLegs: return mob_texture_profile.Legs.Material; - case EQEmu::textures::armorFeet: + case EQ::textures::armorFeet: return mob_texture_profile.Feet.Material; - case EQEmu::textures::weaponPrimary: + case EQ::textures::weaponPrimary: return mob_texture_profile.Primary.Material; - case EQEmu::textures::weaponSecondary: + case EQ::textures::weaponSecondary: return mob_texture_profile.Secondary.Material; default: return 0; @@ -143,23 +144,23 @@ int32 Mob::GetTextureProfileMaterial(uint8 material_slot) const int32 Mob::GetTextureProfileColor(uint8 material_slot) const { switch (material_slot) { - case EQEmu::textures::armorHead: + case EQ::textures::armorHead: return mob_texture_profile.Head.Color; - case EQEmu::textures::armorChest: + case EQ::textures::armorChest: return mob_texture_profile.Chest.Color; - case EQEmu::textures::armorArms: + case EQ::textures::armorArms: return mob_texture_profile.Arms.Color; - case EQEmu::textures::armorWrist: + case EQ::textures::armorWrist: return mob_texture_profile.Wrist.Color; - case EQEmu::textures::armorHands: + case EQ::textures::armorHands: return mob_texture_profile.Hands.Color; - case EQEmu::textures::armorLegs: + case EQ::textures::armorLegs: return mob_texture_profile.Legs.Color; - case EQEmu::textures::armorFeet: + case EQ::textures::armorFeet: return mob_texture_profile.Feet.Color; - case EQEmu::textures::weaponPrimary: + case EQ::textures::weaponPrimary: return mob_texture_profile.Primary.Color; - case EQEmu::textures::weaponSecondary: + case EQ::textures::weaponSecondary: return mob_texture_profile.Secondary.Color; default: return 0; @@ -175,23 +176,23 @@ int32 Mob::GetTextureProfileColor(uint8 material_slot) const int32 Mob::GetTextureProfileHeroForgeModel(uint8 material_slot) const { switch (material_slot) { - case EQEmu::textures::armorHead: + case EQ::textures::armorHead: return mob_texture_profile.Head.HerosForgeModel; - case EQEmu::textures::armorChest: + case EQ::textures::armorChest: return mob_texture_profile.Chest.HerosForgeModel; - case EQEmu::textures::armorArms: + case EQ::textures::armorArms: return mob_texture_profile.Arms.HerosForgeModel; - case EQEmu::textures::armorWrist: + case EQ::textures::armorWrist: return mob_texture_profile.Wrist.HerosForgeModel; - case EQEmu::textures::armorHands: + case EQ::textures::armorHands: return mob_texture_profile.Hands.HerosForgeModel; - case EQEmu::textures::armorLegs: + case EQ::textures::armorLegs: return mob_texture_profile.Legs.HerosForgeModel; - case EQEmu::textures::armorFeet: + case EQ::textures::armorFeet: return mob_texture_profile.Feet.HerosForgeModel; - case EQEmu::textures::weaponPrimary: + case EQ::textures::weaponPrimary: return mob_texture_profile.Primary.HerosForgeModel; - case EQEmu::textures::weaponSecondary: + case EQ::textures::weaponSecondary: return mob_texture_profile.Secondary.HerosForgeModel; default: return 0; @@ -230,18 +231,18 @@ int32 Mob::GetEquipmentMaterial(uint8 material_slot) const * Handle primary / secondary texture */ bool is_primary_or_secondary_weapon = - material_slot == EQEmu::textures::weaponPrimary || - material_slot == EQEmu::textures::weaponSecondary; + material_slot == EQ::textures::weaponPrimary || + material_slot == EQ::textures::weaponSecondary; if (is_primary_or_secondary_weapon) { if (this->IsClient()) { - int16 inventory_slot = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + int16 inventory_slot = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); if (inventory_slot == INVALID_INDEX) { return 0; } - const EQEmu::ItemInstance *item_instance = CastToClient()->m_inv[inventory_slot]; + const EQ::ItemInstance *item_instance = CastToClient()->m_inv[inventory_slot]; if (item_instance) { if (item_instance->GetOrnamentationAug(ornamentation_augment_type)) { item = item_instance->GetOrnamentationAug(ornamentation_augment_type)->GetItem(); @@ -273,7 +274,7 @@ int32 Mob::GetEquipmentMaterial(uint8 material_slot) const */ uint32 Mob::GetEquipmentColor(uint8 material_slot) const { - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; if (armor_tint.Slot[material_slot].Color) { return armor_tint.Slot[material_slot].Color; @@ -294,15 +295,15 @@ uint32 Mob::GetEquipmentColor(uint8 material_slot) const int32 Mob::GetHerosForgeModel(uint8 material_slot) const { uint32 hero_model = 0; - if (material_slot >= 0 && material_slot < EQEmu::textures::weaponPrimary) { + if (material_slot >= 0 && material_slot < EQ::textures::weaponPrimary) { uint32 ornamentation_aug_type = RuleI(Character, OrnamentationAugmentType); - const EQEmu::ItemData *item = database.GetItem(GetEquippedItemFromTextureSlot(material_slot)); - int16 invslot = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + const EQ::ItemData *item = database.GetItem(GetEquippedItemFromTextureSlot(material_slot)); + int16 invslot = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); if (item != nullptr && invslot != INVALID_INDEX) { if (IsClient()) { - const EQEmu::ItemInstance *inst = CastToClient()->m_inv[invslot]; + const EQ::ItemInstance *inst = CastToClient()->m_inv[invslot]; if (inst) { if (inst->GetOrnamentationAug(ornamentation_aug_type)) { item = inst->GetOrnamentationAug(ornamentation_aug_type)->GetItem(); @@ -352,7 +353,7 @@ uint32 NPC::GetEquippedItemFromTextureSlot(uint8 material_slot) const return 0; } - int16 inventory_slot = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + int16 inventory_slot = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); if (inventory_slot == INVALID_INDEX) { return 0; } @@ -383,8 +384,8 @@ void Mob::SendArmorAppearance(Client *one_client) if (IsPlayerRace(race)) { if (!IsClient()) { - for (uint8 i = 0; i <= EQEmu::textures::materialCount; ++i) { - const EQEmu::ItemData *item = database.GetItem(GetEquippedItemFromTextureSlot(i)); + for (uint8 i = 0; i <= EQ::textures::materialCount; ++i) { + const EQ::ItemData *item = database.GetItem(GetEquippedItemFromTextureSlot(i)); if (item != nullptr) { SendWearChange(i, one_client); } @@ -392,7 +393,7 @@ void Mob::SendArmorAppearance(Client *one_client) } } - for (uint8 i = 0; i <= EQEmu::textures::materialCount; ++i) { + for (uint8 i = 0; i <= EQ::textures::materialCount; ++i) { if (GetTextureProfileMaterial(i)) { SendWearChange(i, one_client); } @@ -419,7 +420,7 @@ void Mob::SendWearChange(uint8 material_slot, Client *one_client) #ifdef BOTS if (IsBot()) { - auto item_inst = CastToBot()->GetBotItem(EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot)); + auto item_inst = CastToBot()->GetBotItem(EQ::InventoryProfile::CalcSlotFromMaterial(material_slot)); if (item_inst) wear_change->color.Color = item_inst->GetColor(); else @@ -545,4 +546,4 @@ void Mob::WearChange(uint8 material_slot, uint16 texture, uint32 color, uint32 h entity_list.QueueClients(this, outapp); safe_delete(outapp); -} \ No newline at end of file +} diff --git a/zone/mob_info.cpp b/zone/mob_info.cpp index edac37768..5b7011f33 100644 --- a/zone/mob_info.cpp +++ b/zone/mob_info.cpp @@ -225,16 +225,20 @@ inline std::string GetMobAttributeByString(Mob *mob, const std::string &attribut return std::to_string(mob->GetMaxBuffSlots()); } + if (attribute == "can_open_doors") { + return std::to_string(mob->CanOpenDoors()); + } + if (attribute == "curbuffslots") { return std::to_string(mob->GetCurrentBuffSlots()); } if (attribute == "tohit") { - return std::to_string(mob->compute_tohit(EQEmu::skills::SkillHandtoHand)); + return std::to_string(mob->compute_tohit(EQ::skills::SkillHandtoHand)); } if (attribute == "total_to_hit") { - return std::to_string(mob->GetTotalToHit(EQEmu::skills::SkillHandtoHand, 0)); + return std::to_string(mob->GetTotalToHit(EQ::skills::SkillHandtoHand, 0)); } if (attribute == "defense") { @@ -246,7 +250,7 @@ inline std::string GetMobAttributeByString(Mob *mob, const std::string &attribut } if (attribute == "offense") { - return std::to_string(mob->offense(EQEmu::skills::SkillHandtoHand)); + return std::to_string(mob->offense(EQ::skills::SkillHandtoHand)); } if (attribute == "mitigation_ac") { @@ -553,7 +557,7 @@ inline std::string WriteDisplayInfoSection( * "total_to_hit" = "Total To Hit" */ if (attribute_name.find('_') != std::string::npos) { - std::vector split_string = split(attribute_name, '_'); + auto split_string = SplitString(attribute_name, '_'); std::string new_attribute_name; for (std::string &string_value : split_string) { new_attribute_name += ucfirst(string_value) + " "; @@ -606,24 +610,24 @@ inline void NPCCommandsMenu(Client* client, NPC* npc) std::string menu_commands; if (npc->GetGrid() > 0) { - menu_commands += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#grid show", false, "Grid Points") + "] "; + menu_commands += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#grid show", false, "Grid Points") + "] "; } if (npc->GetEmoteID() > 0) { std::string saylink = StringFormat("#emotesearch %u", npc->GetEmoteID()); - menu_commands += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Emotes") + "] "; + menu_commands += "[" + EQ::SayLinkEngine::GenerateQuestSaylink(saylink, false, "Emotes") + "] "; } if (npc->GetLoottableID() > 0) { - menu_commands += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#npcloot show", false, "Loot") + "] "; + menu_commands += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#npcloot show", false, "Loot") + "] "; } if (npc->IsProximitySet()) { - menu_commands += "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#proximity show", false, "Proximity") + "] "; + menu_commands += "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#proximity show", false, "Proximity") + "] "; } if (menu_commands.length() > 0) { - std::string dev_menu = "[" + EQEmu::SayLinkEngine::GenerateQuestSaylink("#devtools", false, "DevTools") + "] ";; + std::string dev_menu = "[" + EQ::SayLinkEngine::GenerateQuestSaylink("#devtools", false, "DevTools") + "] ";; client->Message(Chat::White, "| %s [Show Commands] %s", dev_menu.c_str(), menu_commands.c_str()); } } @@ -640,7 +644,7 @@ void Mob::DisplayInfo(Mob *mob) Client *client = this->CastToClient(); - if (!client->IsDevToolsWindowEnabled()) { + if (!client->IsDevToolsEnabled()) { return; } @@ -770,6 +774,7 @@ void Mob::DisplayInfo(Mob *mob) "spells_id", "curbuffslots", "maxbuffslots", + "can_open_doors", }; window_text += WriteDisplayInfoSection(mob, "NPC Attributes", npc_attributes, 1, true); @@ -823,7 +828,7 @@ void Mob::DisplayInfo(Mob *mob) client->SendFullPopup( "GM: Entity Info", window_text.c_str(), - EQEmu::popupresponse::MOB_INFO_DISMISS, + EQ::popupresponse::MOB_INFO_DISMISS, 0, 100, 0, diff --git a/zone/mob_movement_manager.cpp b/zone/mob_movement_manager.cpp index 4ac0c7f23..c323a13c2 100644 --- a/zone/mob_movement_manager.cpp +++ b/zone/mob_movement_manager.cpp @@ -63,6 +63,7 @@ public: if (!m_started) { m_started = true; + mob->turning = true; mob->SetMoving(true); if (dist > 15.0f && rotate_to_speed > 0.0 && rotate_to_speed <= 25.0) { //send basic rotation @@ -84,6 +85,7 @@ public: mob->SetHeading(to); mob->SetMoving(false); mob_movement_manager->SendCommandToClients(mob, 0.0, 0.0, 0.0, 0.0, 0, ClientRangeCloseMedium); + mob->turning = false; return true; } @@ -263,6 +265,146 @@ protected: double m_total_v_dist; }; +class FlyToCommand : public IMovementCommand { +public: + FlyToCommand(float x, float y, float z, MobMovementMode mob_movement_mode) + { + m_distance_moved_since_correction = 0.0; + m_move_to_x = x; + m_move_to_y = y; + m_move_to_z = z; + m_move_to_mode = mob_movement_mode; + m_last_sent_time = 0.0; + m_last_sent_speed = 0; + m_started = false; + m_total_h_dist = 0.0; + m_total_v_dist = 0.0; + } + + virtual ~FlyToCommand() + { + + } + + /** + * @param mob_movement_manager + * @param mob + * @return + */ + virtual bool Process(MobMovementManager *mob_movement_manager, Mob *mob) + { + if (!mob->IsAIControlled()) { + return true; + } + + //Send a movement packet when you start moving + double current_time = static_cast(Timer::GetCurrentTime()) / 1000.0; + int current_speed = 0; + + if (m_move_to_mode == MovementRunning) { + if (mob->IsFeared()) { + current_speed = mob->GetFearSpeed(); + } + else { + current_speed = mob->GetRunspeed(); + } + } + else { + current_speed = mob->GetWalkspeed(); + } + + if (!m_started) { + m_started = true; + //rotate to the point + mob->SetMoving(true); + mob->SetHeading(mob->CalculateHeadingToTarget(m_move_to_x, m_move_to_y)); + + m_last_sent_speed = current_speed; + m_last_sent_time = current_time; + m_total_h_dist = DistanceNoZ(mob->GetPosition(), glm::vec4(m_move_to_x, m_move_to_y, 0.0f, 0.0f)); + m_total_v_dist = m_move_to_z - mob->GetZ(); + mob_movement_manager->SendCommandToClients(mob, 0.0, 0.0, 0.0, 0.0, current_speed, ClientRangeCloseMedium); + } + + //When speed changes + if (current_speed != m_last_sent_speed) { + m_distance_moved_since_correction = 0.0; + m_last_sent_speed = current_speed; + m_last_sent_time = current_time; + mob_movement_manager->SendCommandToClients(mob, 0.0, 0.0, 0.0, 0.0, current_speed, ClientRangeCloseMedium); + } + + //If x seconds have passed without sending an update. + if (current_time - m_last_sent_time >= 0.5) { + m_distance_moved_since_correction = 0.0; + m_last_sent_speed = current_speed; + m_last_sent_time = current_time; + mob_movement_manager->SendCommandToClients(mob, 0.0, 0.0, 0.0, 0.0, current_speed, ClientRangeCloseMedium); + } + + auto &p = mob->GetPosition(); + glm::vec2 tar(m_move_to_x, m_move_to_y); + glm::vec2 pos(p.x, p.y); + double len = glm::distance(pos, tar); + if (len == 0) { + return true; + } + + mob->SetMoved(true); + + glm::vec2 dir = tar - pos; + glm::vec2 ndir = glm::normalize(dir); + double distance_moved = frame_time * current_speed * 0.4f * 1.45f; + + if (distance_moved > len) { + if (mob->IsNPC()) { + entity_list.ProcessMove(mob->CastToNPC(), m_move_to_x, m_move_to_y, m_move_to_z); + } + + mob->SetPosition(m_move_to_x, m_move_to_y, m_move_to_z); + + if (RuleB(Map, FixZWhenPathing)) { + mob->FixZ(); + } + return true; + } + else { + glm::vec2 npos = pos + (ndir * static_cast(distance_moved)); + + len -= distance_moved; + double total_distance_traveled = m_total_h_dist - len; + double start_z = m_move_to_z - m_total_v_dist; + double z_at_pos = start_z + (m_total_v_dist * (total_distance_traveled / m_total_h_dist)); + + if (mob->IsNPC()) { + entity_list.ProcessMove(mob->CastToNPC(), npos.x, npos.y, z_at_pos); + } + + mob->SetPosition(npos.x, npos.y, z_at_pos); + } + + return false; + } + + virtual bool Started() const + { + return m_started; + } + +protected: + double m_distance_moved_since_correction; + double m_move_to_x; + double m_move_to_y; + double m_move_to_z; + MobMovementMode m_move_to_mode; + bool m_started; + + double m_last_sent_time; + int m_last_sent_speed; + double m_total_h_dist; + double m_total_v_dist; +}; + class SwimToCommand : public MoveToCommand { public: SwimToCommand(float x, float y, float z, MobMovementMode mob_movement_mode) : MoveToCommand(x, y, z, mob_movement_mode) @@ -429,6 +571,7 @@ public: } mob_movement_manager->SendCommandToClients(mob, 0.0, 0.0, 0.0, 0.0, 0, ClientRangeCloseMedium); } + return true; } @@ -464,7 +607,7 @@ public: mob->WipeHateList(); mob->Heal(); - return true; + return false; } virtual bool Started() const @@ -538,7 +681,7 @@ struct MobMovementManager::Implementation { MobMovementManager::MobMovementManager() { - _impl.reset(new Implementation()); + _impl = std::make_unique(); } MobMovementManager::~MobMovementManager() @@ -921,6 +1064,8 @@ void MobMovementManager::FillCommandStruct( */ void MobMovementManager::UpdatePath(Mob *who, float x, float y, float z, MobMovementMode mob_movement_mode) { + Mob *target=who->GetTarget(); + if (!zone->HasMap() || !zone->HasWaterMap()) { auto iter = _impl->Entries.find(who); auto &ent = (*iter); @@ -936,6 +1081,27 @@ void MobMovementManager::UpdatePath(Mob *who, float x, float y, float z, MobMove else if (who->IsUnderwaterOnly()) { UpdatePathUnderwater(who, x, y, z, mob_movement_mode); } + // If we can fly, and we have a target and we have LoS, simply fly to them. + // if we ever lose LoS we go back to mesh run mode. + else if (target && who->GetFlyMode() == GravityBehavior::Flying && + who->CheckLosFN(x,y,z,target->GetSize())) { + auto iter = _impl->Entries.find(who); + auto &ent = (*iter); + + PushFlyTo(ent.second, x, y, z, mob_movement_mode); + PushStopMoving(ent.second); + } + // Below for npcs that can traverse land or water so they don't sink + else if (who->GetFlyMode() == GravityBehavior::Water && + zone->watermap->InLiquid(who->GetPosition()) && + zone->watermap->InLiquid(glm::vec3(x, y, z)) && + zone->zonemap->CheckLoS(who->GetPosition(), glm::vec3(x, y, z))) { + auto iter = _impl->Entries.find(who); + auto &ent = (*iter); + + PushSwimTo(ent.second, x, y, z, mob_movement_mode); + PushStopMoving(ent.second); + } else { UpdatePathGround(who, x, y, z, mob_movement_mode); } @@ -1062,7 +1228,7 @@ void MobMovementManager::UpdatePathGround(Mob *who, float x, float y, float z, M ) ); } - else { + else if(!next_node.teleport) { if (zone->watermap->InLiquid(previous_pos)) { PushSwimTo(ent.second, next_node.pos.x, next_node.pos.y, next_node.pos.z, mode); } @@ -1182,7 +1348,7 @@ void MobMovementManager::UpdatePathUnderwater(Mob *who, float x, float y, float next_node.pos.y )); } - else { + else if(!next_node.teleport) { PushSwimTo(ent.second, next_node.pos.x, next_node.pos.y, next_node.pos.z, movement_mode); } } @@ -1206,7 +1372,9 @@ void MobMovementManager::UpdatePathBoat(Mob *who, float x, float y, float z, Mob { auto eiter = _impl->Entries.find(who); auto &ent = (*eiter); + float to = who->CalculateHeadingToTarget(x, y); + PushRotateTo(ent.second, who, to, mode); PushSwimTo(ent.second, x, y, z, mode); PushStopMoving(ent.second); } @@ -1275,6 +1443,18 @@ void MobMovementManager::PushRotateTo(MobMovementEntry &ent, Mob *who, float to, ent.Commands.push_back(std::unique_ptr(new RotateToCommand(to, diff > 0 ? 1.0 : -1.0, mob_movement_mode))); } +/** + * @param ent + * @param x + * @param y + * @param z + * @param mob_movement_mode + */ +void MobMovementManager::PushFlyTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mob_movement_mode) +{ + ent.Commands.push_back(std::unique_ptr(new FlyToCommand(x, y, z, mob_movement_mode))); +} + /** * @param mob_movement_entry */ diff --git a/zone/mob_movement_manager.h b/zone/mob_movement_manager.h index ff7e08436..85d062804 100644 --- a/zone/mob_movement_manager.h +++ b/zone/mob_movement_manager.h @@ -85,6 +85,7 @@ private: void PushTeleportTo(MobMovementEntry &ent, float x, float y, float z, float heading); void PushMoveTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mob_movement_mode); void PushSwimTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mob_movement_mode); + void PushFlyTo(MobMovementEntry &ent, float x, float y, float z, MobMovementMode mob_movement_mode); void PushRotateTo(MobMovementEntry &ent, Mob *who, float to, MobMovementMode mob_movement_mode); void PushStopMoving(MobMovementEntry &mob_movement_entry); void PushEvadeCombat(MobMovementEntry &mob_movement_entry); diff --git a/zone/mod_functions.cpp b/zone/mod_functions.cpp index ca9a5e107..b4951f76d 100644 --- a/zone/mod_functions.cpp +++ b/zone/mod_functions.cpp @@ -9,7 +9,7 @@ class Spawn2; struct Consider_Struct; struct DBTradeskillRecipe_Struct; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -29,7 +29,7 @@ void Zone::mod_repop() { return; } void NPC::mod_prespawn(Spawn2 *sp) { return; } //Base damage from NPC::Attack -int NPC::mod_npc_damage(int damage, EQEmu::skills::SkillType skillinuse, int hand, const EQEmu::ItemData* weapon, Mob* other) { return(damage); } +int NPC::mod_npc_damage(int damage, EQ::skills::SkillType skillinuse, int hand, const EQ::ItemData* weapon, Mob* other) { return(damage); } //Mob c has been given credit for a kill. This is called after the regular EVENT_KILLED_MERIT event. void NPC::mod_npc_killed_merit(Mob* c) { return; } @@ -38,7 +38,7 @@ void NPC::mod_npc_killed_merit(Mob* c) { return; } void NPC::mod_npc_killed(Mob* oos) { return; } //Base damage from Client::Attack - can cover myriad skill types -int Client::mod_client_damage(int damage, EQEmu::skills::SkillType skillinuse, int hand, const EQEmu::ItemInstance* weapon, Mob* other) { return(damage); } +int Client::mod_client_damage(int damage, EQ::skills::SkillType skillinuse, int hand, const EQ::ItemInstance* weapon, Mob* other) { return(damage); } //message is char[4096], don't screw it up. Return true for normal behavior, false to return immediately. // Channels: @@ -58,7 +58,7 @@ bool Client::mod_client_message(char* message, uint8 chan_num) { return(true); } //Skillup override. When this is called the regular skillup check has failed. Return false to proceed with default behavior. //This will NOT allow a client to increase skill past a cap. -bool Client::mod_can_increase_skill(EQEmu::skills::SkillType skillid, Mob* against_who) { return(false); } +bool Client::mod_can_increase_skill(EQ::skills::SkillType skillid, Mob* against_who) { return(false); } //chance of general skill increase, rolled against 0-99 where higher chance is better. int16 Client::mod_increase_skill_chance(int16 chance, Mob* against_who) { return(chance); } @@ -91,7 +91,7 @@ float Client::mod_tradeskill_chance(float chance, DBTradeskillRecipe_Struct *spe float Client::mod_tradeskill_skillup(float chance_stage2) { return(chance_stage2); } //Tribute value override -int32 Client::mod_tribute_item_value(int32 pts, const EQEmu::ItemInstance* item) { return(pts); } +int32 Client::mod_tribute_item_value(int32 pts, const EQ::ItemInstance* item) { return(pts); } //Death reporting void Client::mod_client_death_npc(Mob* killerMob) { return; } @@ -107,14 +107,14 @@ int32 Client::mod_client_xp(int32 in_xp, NPC *npc) { return(in_xp); } uint32 Client::mod_client_xp_for_level(uint32 xp, uint16 check_level) { return(xp); } //Food and drink values as computed by consume requests. Return < 0 to abort the request. -int Client::mod_food_value(const EQEmu::ItemData *item, int change) { return(change); } -int Client::mod_drink_value(const EQEmu::ItemData *item, int change) { return(change); } +int Client::mod_food_value(const EQ::ItemData *item, int change) { return(change); } +int Client::mod_drink_value(const EQ::ItemData *item, int change) { return(change); } //effect_vallue - Spell effect value as calculated by default formulas. You will want to ignore effects that don't lend themselves to scaling - pet ID's, gate coords, etc. int Mob::mod_effect_value(int effect_value, uint16 spell_id, int effect_type, Mob* caster, uint16 caster_id) { return(effect_value); } //chancetohit - 0 to 100 percent - set over 1000 for a guaranteed hit -float Mob::mod_hit_chance(float chancetohit, EQEmu::skills::SkillType skillinuse, Mob* attacker) { return(chancetohit); } +float Mob::mod_hit_chance(float chancetohit, EQ::skills::SkillType skillinuse, Mob* attacker) { return(chancetohit); } //Final riposte chance float Mob::mod_riposte_chance(float ripostechance, Mob* attacker) { return(ripostechance); } @@ -146,19 +146,19 @@ int32 Mob::mod_bash_damage(int32 dmg) { return(dmg); } int32 Mob::mod_frenzy_damage(int32 dmg) { return(dmg); } //Special attack damage after all other bonuses are applied. -int32 Mob::mod_monk_special_damage(int32 ndamage, EQEmu::skills::SkillType skill_type) { return(ndamage); } +int32 Mob::mod_monk_special_damage(int32 ndamage, EQ::skills::SkillType skill_type) { return(ndamage); } //ndamage - Backstab damage as calculated by default formulas int32 Mob::mod_backstab_damage(int32 ndamage) { return(ndamage); } -//Chance for 50+ archery bonus damage if Combat:UseArcheryBonusRoll is true. Base is Combat:ArcheryBonusChance -int Mob::mod_archery_bonus_chance(int bonuschance, const EQEmu::ItemInstance* RangeWeapon) { return(bonuschance); } +//Chance for 50+ archery bonus damage if Combat:UseArcheryBonusRoll is true. +int Mob::mod_archery_bonus_chance(int bonuschance, const EQ::ItemInstance* RangeWeapon) { return(bonuschance); } //Archery bonus damage -uint32 Mob::mod_archery_bonus_damage(uint32 MaxDmg, const EQEmu::ItemInstance* RangeWeapon) { return(MaxDmg); } +uint32 Mob::mod_archery_bonus_damage(uint32 MaxDmg, const EQ::ItemInstance* RangeWeapon) { return(MaxDmg); } //Final archery damage including bonus if it was applied. -int32 Mob::mod_archery_damage(int32 TotalDmg, bool hasbonus, const EQEmu::ItemInstance* RangeWeapon) { return(TotalDmg); } +int32 Mob::mod_archery_damage(int32 TotalDmg, bool hasbonus, const EQ::ItemInstance* RangeWeapon) { return(TotalDmg); } //Thrown weapon damage after all other calcs uint16 Mob::mod_throwing_damage(uint16 MaxDmg) { return(MaxDmg); } diff --git a/zone/mod_functions_base.cpp b/zone/mod_functions_base.cpp index e9e172997..5323ca32a 100644 --- a/zone/mod_functions_base.cpp +++ b/zone/mod_functions_base.cpp @@ -8,6 +8,7 @@ #include "zone.h" #include "spawngroup.h" #include "zonedb.h" +#include "zone_store.h" #include "npc.h" #include "mob.h" #include "client.h" @@ -151,7 +152,7 @@ int32 Mob::mod_monk_special_damage(int32 ndamage, SkillType skill_type) { return //ndamage - Backstab damage as calculated by default formulas int32 Mob::mod_backstab_damage(int32 ndamage) { return(ndamage); } -//Chance for 50+ archery bonus damage if Combat:UseArcheryBonusRoll is true. Base is Combat:ArcheryBonusChance +//Chance for 50+ archery bonus damage if Combat:UseArcheryBonusRoll is true. int Mob::mod_archery_bonus_chance(int bonuschance, const ItemInst* RangeWeapon) { return(bonuschance); } //Archery bonus damage diff --git a/zone/npc.cpp b/zone/npc.cpp index 44cdd1344..9bea0ec67 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -230,9 +230,14 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi adventure_template_id = npc_type_data->adventure_template; flymode = iflymode; + // If server has set a flymode in db honor it over all else. + // If server has not set a flymde in db, and this is a boat - force floating. if (npc_type_data->flymode >= 0) { flymode = static_cast(npc_type_data->flymode); } + else if (IsBoat()) { + flymode = GravityBehavior::Floating; + } guard_anim = eaStanding; roambox_distance = 0; @@ -279,6 +284,19 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi entity_list.MakeNameUnique(name); npc_aggro = npc_type_data->npc_aggro; + + AISpellVar.fail_recast = static_cast(RuleI(Spells, AI_SpellCastFinishedFailRecast)); + AISpellVar.engaged_no_sp_recast_min = static_cast(RuleI(Spells, AI_EngagedNoSpellMinRecast)); + AISpellVar.engaged_no_sp_recast_max = static_cast(RuleI(Spells, AI_EngagedNoSpellMaxRecast)); + AISpellVar.engaged_beneficial_self_chance = static_cast (RuleI(Spells, AI_EngagedBeneficialSelfChance)); + AISpellVar.engaged_beneficial_other_chance = static_cast (RuleI(Spells, AI_EngagedBeneficialOtherChance)); + AISpellVar.engaged_detrimental_chance = static_cast (RuleI(Spells, AI_EngagedDetrimentalChance)); + AISpellVar.pursue_no_sp_recast_min = static_cast(RuleI(Spells, AI_PursueNoSpellMinRecast)); + AISpellVar.pursue_no_sp_recast_max = static_cast(RuleI(Spells, AI_PursueNoSpellMaxRecast)); + AISpellVar.pursue_detrimental_chance = static_cast (RuleI(Spells, AI_PursueDetrimentalChance)); + AISpellVar.idle_no_sp_recast_min = static_cast(RuleI(Spells, AI_IdleNoSpellMinRecast)); + AISpellVar.idle_no_sp_recast_max = static_cast(RuleI(Spells, AI_IdleNoSpellMaxRecast)); + AISpellVar.idle_beneficial_chance = static_cast (RuleI(Spells, AI_IdleBeneficialChance)); AI_Init(); AI_Start(); @@ -303,8 +321,8 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi //give NPCs skill values... int r; - for (r = 0; r <= EQEmu::skills::HIGHEST_SKILL; r++) { - skills[r] = database.GetSkillCap(GetClass(), (EQEmu::skills::SkillType)r, moblevel); + for (r = 0; r <= EQ::skills::HIGHEST_SKILL; r++) { + skills[r] = content_db.GetSkillCap(GetClass(), (EQ::skills::SkillType)r, moblevel); } // some overrides -- really we need to be able to set skills for mobs in the DB // There are some known low level SHM/BST pets that do not follow this, which supports @@ -319,15 +337,15 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi } else { if (moblevel > 50) { - skills[EQEmu::skills::SkillDoubleAttack] = 250; - skills[EQEmu::skills::SkillDualWield] = 250; + skills[EQ::skills::SkillDoubleAttack] = 250; + skills[EQ::skills::SkillDualWield] = 250; } else if (moblevel > 3) { - skills[EQEmu::skills::SkillDoubleAttack] = moblevel * 5; - skills[EQEmu::skills::SkillDualWield] = skills[EQEmu::skills::SkillDoubleAttack]; + skills[EQ::skills::SkillDoubleAttack] = moblevel * 5; + skills[EQ::skills::SkillDualWield] = skills[EQ::skills::SkillDoubleAttack]; } else { - skills[EQEmu::skills::SkillDoubleAttack] = moblevel * 5; + skills[EQ::skills::SkillDoubleAttack] = moblevel * 5; } } @@ -392,18 +410,10 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi SetMana(GetMaxMana()); - AISpellVar.fail_recast = static_cast(RuleI(Spells, AI_SpellCastFinishedFailRecast)); - AISpellVar.engaged_no_sp_recast_min = static_cast(RuleI(Spells, AI_EngagedNoSpellMinRecast)); - AISpellVar.engaged_no_sp_recast_max = static_cast(RuleI(Spells, AI_EngagedNoSpellMaxRecast)); - AISpellVar.engaged_beneficial_self_chance = static_cast (RuleI(Spells, AI_EngagedBeneficialSelfChance)); - AISpellVar.engaged_beneficial_other_chance = static_cast (RuleI(Spells, AI_EngagedBeneficialOtherChance)); - AISpellVar.engaged_detrimental_chance = static_cast (RuleI(Spells, AI_EngagedDetrimentalChance)); - AISpellVar.pursue_no_sp_recast_min = static_cast(RuleI(Spells, AI_PursueNoSpellMinRecast)); - AISpellVar.pursue_no_sp_recast_max = static_cast(RuleI(Spells, AI_PursueNoSpellMaxRecast)); - AISpellVar.pursue_detrimental_chance = static_cast (RuleI(Spells, AI_PursueDetrimentalChance)); - AISpellVar.idle_no_sp_recast_min = static_cast(RuleI(Spells, AI_IdleNoSpellMinRecast)); - AISpellVar.idle_no_sp_recast_max = static_cast(RuleI(Spells, AI_IdleNoSpellMaxRecast)); - AISpellVar.idle_beneficial_chance = static_cast (RuleI(Spells, AI_IdleBeneficialChance)); + if (GetBodyType() == BT_Animal && !RuleB(NPC, AnimalsOpenDoors)) { + m_can_open_doors = false; + } + } float NPC::GetRoamboxMaxX() const @@ -527,7 +537,7 @@ void NPC::SetTarget(Mob* mob) { if (owner) { auto client = owner->CastToClient(); - if (client->ClientVersionBit() & EQEmu::versions::maskUFAndLater) { + if (client->ClientVersionBit() & EQ::versions::maskUFAndLater) { auto app = new EQApplicationPacket(OP_PetHoTT, sizeof(ClientTarget_Struct)); auto ct = (ClientTarget_Struct *)app->pBuffer; ct->new_target = mob ? mob->GetID() : 0; @@ -576,25 +586,33 @@ void NPC::RemoveItem(uint32 item_id, uint16 quantity, uint16 slot) { } } -void NPC::CheckMinMaxLevel(Mob *them) +void NPC::CheckTrivialMinMaxLevelDrop(Mob *killer) { - if(them == nullptr || !them->IsClient()) + if (killer == nullptr || !killer->IsClient()) { return; + } - uint16 themlevel = them->GetLevel(); - uint8 material; + uint16 killer_level = killer->GetLevel(); + uint8 material; auto cur = itemlist.begin(); - while(cur != itemlist.end()) - { - if(!(*cur)) + while (cur != itemlist.end()) { + if (!(*cur)) { return; + } - if(themlevel < (*cur)->min_level || themlevel > (*cur)->max_level) - { - material = EQEmu::InventoryProfile::CalcMaterialFromSlot((*cur)->equip_slot); - if (material != EQEmu::textures::materialInvalid) + uint16 trivial_min_level = (*cur)->trivial_min_level; + uint16 trivial_max_level = (*cur)->trivial_max_level; + bool fits_trivial_criteria = ( + (trivial_min_level > 0 && killer_level < trivial_min_level) || + (trivial_max_level > 0 && killer_level > trivial_max_level) + ); + + if (fits_trivial_criteria) { + material = EQ::InventoryProfile::CalcMaterialFromSlot((*cur)->equip_slot); + if (material != EQ::textures::materialInvalid) { SendWearChange(material); + } cur = itemlist.erase(cur); continue; @@ -603,8 +621,9 @@ void NPC::CheckMinMaxLevel(Mob *them) } UpdateEquipmentLight(); - if (UpdateActiveLight()) + if (UpdateActiveLight()) { SendAppearancePacket(AT_Light, GetActiveLightType()); + } } void NPC::ClearItemList() { @@ -637,8 +656,8 @@ void NPC::QueryLoot(Client* to) continue; } - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkLootItem); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkLootItem); linker.SetLootData(*cur); to->Message( @@ -647,8 +666,8 @@ void NPC::QueryLoot(Client* to) item_count, linker.GenerateLink().c_str(), (*cur)->item_id, - (*cur)->min_level, - (*cur)->max_level + (*cur)->trivial_min_level, + (*cur)->trivial_max_level ); } @@ -694,11 +713,6 @@ void NPC::RemoveCash() { bool NPC::Process() { - if (IsStunned() && stunned_timer.Check()) { - Mob::UnStun(); - this->spun_timer.Disable(); - } - if (p_depop) { Mob* owner = entity_list.GetMob(this->ownerid); @@ -712,24 +726,34 @@ bool NPC::Process() return false; } - SpellProcess(); - - if (mob_scan_close.Check()) { - - entity_list.ScanCloseMobs(close_mobs, this); - - if (moving) { - mob_scan_close.Disable(); - mob_scan_close.Start(RandomTimer(3000, 6000)); - } - else { - mob_scan_close.Disable(); - mob_scan_close.Start(RandomTimer(6000, 60000)); - } + if (IsStunned() && stunned_timer.Check()) { + Mob::UnStun(); + this->spun_timer.Disable(); } - if (mob_check_moving_timer.Check() && moving) { - mob_scan_close.Trigger(); + SpellProcess(); + + if (mob_close_scan_timer.Check()) { + entity_list.ScanCloseMobs(close_mobs, this, IsMoving()); + } + + const uint16 npc_mob_close_scan_timer_moving = 6000; + const uint16 npc_mob_close_scan_timer_idle = 60000; + + if (mob_check_moving_timer.Check()) { + if (moving) { + if (mob_close_scan_timer.GetRemainingTime() > npc_mob_close_scan_timer_moving) { + LogAIScanCloseDetail("NPC [{}] Restarting with moving timer", GetCleanName()); + mob_close_scan_timer.Disable(); + mob_close_scan_timer.Start(npc_mob_close_scan_timer_moving); + mob_close_scan_timer.Trigger(); + } + } + else if (mob_close_scan_timer.GetDuration() == npc_mob_close_scan_timer_moving) { + LogAIScanCloseDetail("NPC [{}] Restarting with idle timer", GetCleanName()); + mob_close_scan_timer.Disable(); + mob_close_scan_timer.Start(npc_mob_close_scan_timer_idle); + } } if (tic_timer.Check()) { @@ -790,7 +814,7 @@ bool NPC::Process() if (GetMana() < GetMaxMana()) { if (RuleB(NPC, UseMeditateBasedManaRegen)) { int32 npc_idle_mana_regen_bonus = 2; - uint16 meditate_skill = GetSkill(EQEmu::skills::SkillMeditate); + uint16 meditate_skill = GetSkill(EQ::skills::SkillMeditate); if (!IsEngaged() && meditate_skill > 0) { uint8 clevel = GetLevel(); npc_idle_mana_regen_bonus = @@ -892,6 +916,10 @@ bool NPC::Process() if (assist_timer.Check() && IsEngaged() && !Charmed() && !HasAssistAggro() && NPCAssistCap() < RuleI(Combat, NPCAssistCap)) { + // Some cases like flash of light used for aggro haven't set target + if (!GetTarget()) { + SetTarget(hate_list.GetEntWithMostHateOnList(this)); + } AIYellForHelp(this, GetTarget()); if (NPCAssistCap() > 0 && !assist_cap_timer.Enabled()) assist_cap_timer.Start(RuleI(Combat, NPCAssistCapTimer)); @@ -916,18 +944,18 @@ uint32 NPC::CountLoot() { void NPC::UpdateEquipmentLight() { - m_Light.Type[EQEmu::lightsource::LightEquipment] = 0; - m_Light.Level[EQEmu::lightsource::LightEquipment] = 0; + m_Light.Type[EQ::lightsource::LightEquipment] = 0; + m_Light.Level[EQ::lightsource::LightEquipment] = 0; - for (int index = EQEmu::invslot::EQUIPMENT_BEGIN; index <= EQEmu::invslot::EQUIPMENT_END; ++index) { - if (index == EQEmu::invslot::slotAmmo) { continue; } + for (int index = EQ::invslot::EQUIPMENT_BEGIN; index <= EQ::invslot::EQUIPMENT_END; ++index) { + if (index == EQ::invslot::slotAmmo) { continue; } auto item = database.GetItem(equipment[index]); if (item == nullptr) { continue; } - if (EQEmu::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQEmu::lightsource::LightEquipment])) { - m_Light.Type[EQEmu::lightsource::LightEquipment] = item->Light; - m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); + if (EQ::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQ::lightsource::LightEquipment])) { + m_Light.Type[EQ::lightsource::LightEquipment] = item->Light; + m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } } @@ -939,14 +967,14 @@ void NPC::UpdateEquipmentLight() if (!item->IsClassCommon()) { continue; } if (item->Light < 9 || item->Light > 13) { continue; } - if (EQEmu::lightsource::TypeToLevel(item->Light)) + if (EQ::lightsource::TypeToLevel(item->Light)) general_light_type = item->Light; } - if (EQEmu::lightsource::IsLevelGreater(general_light_type, m_Light.Type[EQEmu::lightsource::LightEquipment])) - m_Light.Type[EQEmu::lightsource::LightEquipment] = general_light_type; + if (EQ::lightsource::IsLevelGreater(general_light_type, m_Light.Type[EQ::lightsource::LightEquipment])) + m_Light.Type[EQ::lightsource::LightEquipment] = general_light_type; - m_Light.Level[EQEmu::lightsource::LightEquipment] = EQEmu::lightsource::TypeToLevel(m_Light.Type[EQEmu::lightsource::LightEquipment]); + m_Light.Level[EQ::lightsource::LightEquipment] = EQ::lightsource::TypeToLevel(m_Light.Type[EQ::lightsource::LightEquipment]); } void NPC::Depop(bool StartSpawnTimer) { @@ -954,15 +982,18 @@ void NPC::Depop(bool StartSpawnTimer) { if(emoteid != 0) this->DoNPCEmote(ONDESPAWN,emoteid); p_depop = true; - if (StartSpawnTimer) { - if (respawn2 != 0) { + if (respawn2) + { + if (StartSpawnTimer) { respawn2->DeathReset(); + } else { + respawn2->Depop(); } } } bool NPC::DatabaseCastAccepted(int spell_id) { - for (int i=0; i < 12; i++) { + for (int i=0; i < EFFECT_COUNT; i++) { switch(spells[spell_id].effectid[i]) { case SE_Stamina: { if(IsEngaged() && GetHPRatio() < 100) @@ -1068,14 +1099,20 @@ bool NPC::SpawnZoneController() return true; } -NPC * NPC::SpawnGridNodeNPC(std::string name, const glm::vec4 &position, uint32 grid_id, uint32 grid_number, uint32 pause) { +void NPC::SpawnGridNodeNPC(const glm::vec4 &position, int32 grid_number, int32 zoffset) { + auto npc_type = new NPCType; memset(npc_type, 0, sizeof(NPCType)); - sprintf(npc_type->name, "%u_%u", grid_id, grid_number); - sprintf(npc_type->lastname, "Number: %u Grid: %u Pause: %u", grid_number, grid_id, pause); + std::string str_zoffset = numberToWords(zoffset); + std::string str_number = numberToWords(grid_number); - npc_type->current_hp = 4000000; + strcpy(npc_type->name, str_number.c_str()); + if (zoffset != 0) { + strcat(npc_type->name, "(Stacked)"); + } + + npc_type->current_hp = 4000000; npc_type->max_hp = 4000000; npc_type->race = 2254; npc_type->gender = 2; @@ -1095,11 +1132,50 @@ NPC * NPC::SpawnGridNodeNPC(std::string name, const glm::vec4 &position, uint32 auto node_position = glm::vec4(position.x, position.y, position.z, position.w); auto npc = new NPC(npc_type, nullptr, node_position, GravityBehavior::Flying); + + npc->name[strlen(npc->name)-3] = (char) NULL; + npc->GiveNPCTypeData(npc_type); - entity_list.AddNPC(npc, true, true); + entity_list.AddNPC(npc); +} - return npc; +void NPC::SpawnZonePointNodeNPC(std::string name, const glm::vec4 &position) +{ + auto npc_type = new NPCType; + memset(npc_type, 0, sizeof(NPCType)); + + char node_name[64]; + strn0cpy(node_name, name.c_str(), 64); + + strcpy(npc_type->name, entity_list.MakeNameUnique(node_name)); + + npc_type->current_hp = 4000000; + npc_type->max_hp = 4000000; + npc_type->race = 2254; + npc_type->gender = 2; + npc_type->class_ = 9; + npc_type->deity = 1; + npc_type->level = 200; + npc_type->npc_id = 0; + npc_type->loottable_id = 0; + npc_type->texture = 1; + npc_type->light = 1; + npc_type->size = 5; + npc_type->runspeed = 0; + npc_type->merchanttype = 1; + npc_type->bodytype = 1; + npc_type->show_name = true; + npc_type->findable = true; + + auto node_position = glm::vec4(position.x, position.y, position.z, position.w); + auto npc = new NPC(npc_type, nullptr, node_position, GravityBehavior::Flying); + + npc->name[strlen(npc->name)-3] = (char) NULL; + + npc->GiveNPCTypeData(npc_type); + + entity_list.AddNPC(npc); } NPC * NPC::SpawnNodeNPC(std::string name, std::string last_name, const glm::vec4 &position) { @@ -1586,34 +1662,34 @@ int32 NPC::GetEquipmentMaterial(uint8 material_slot) const return texture_profile_material; } - if (material_slot >= EQEmu::textures::materialCount) { + if (material_slot >= EQ::textures::materialCount) { return 0; } - int16 invslot = EQEmu::InventoryProfile::CalcSlotFromMaterial(material_slot); + int16 invslot = EQ::InventoryProfile::CalcSlotFromMaterial(material_slot); if (invslot == INVALID_INDEX) { return 0; } if (equipment[invslot] == 0) { switch (material_slot) { - case EQEmu::textures::armorHead: + case EQ::textures::armorHead: return helmtexture; - case EQEmu::textures::armorChest: + case EQ::textures::armorChest: return texture; - case EQEmu::textures::armorArms: + case EQ::textures::armorArms: return armtexture; - case EQEmu::textures::armorWrist: + case EQ::textures::armorWrist: return bracertexture; - case EQEmu::textures::armorHands: + case EQ::textures::armorHands: return handtexture; - case EQEmu::textures::armorLegs: + case EQ::textures::armorLegs: return legtexture; - case EQEmu::textures::armorFeet: + case EQ::textures::armorFeet: return feettexture; - case EQEmu::textures::weaponPrimary: + case EQ::textures::weaponPrimary: return d_melee_texture1; - case EQEmu::textures::weaponSecondary: + case EQ::textures::weaponSecondary: return d_melee_texture2; default: //they have nothing in the slot, and its not a special slot... they get nothing. @@ -1641,7 +1717,7 @@ uint32 NPC::GetMaxDamage(uint8 tlevel) void NPC::PickPocket(Client* thief) { - thief->CheckIncreaseSkill(EQEmu::skills::SkillPickPockets, nullptr, 5); + thief->CheckIncreaseSkill(EQ::skills::SkillPickPockets, nullptr, 5); //make sure were allowed to target them: int over_level = GetLevel(); @@ -1661,7 +1737,7 @@ void NPC::PickPocket(Client* thief) return; } - int steal_skill = thief->GetSkill(EQEmu::skills::SkillPickPockets); + int steal_skill = thief->GetSkill(EQ::skills::SkillPickPockets); int steal_chance = steal_skill * 100 / (5 * over_level + 5); // Determine whether to steal money or an item. @@ -1671,7 +1747,7 @@ void NPC::PickPocket(Client* thief) // still needs to have FindFreeSlot vs PutItemInInventory issue worked out while (steal_item) { - std::vector> loot_selection; // + std::vector> loot_selection; // for (auto item_iter : itemlist) { if (!item_iter || !item_iter->item_id) continue; @@ -1688,12 +1764,12 @@ void NPC::PickPocket(Client* thief) } int random = zone->random.Int(0, (loot_selection.size() - 1)); - uint16 slot_id = thief->GetInv().FindFreeSlot(false, true, (loot_selection[random].first->Size), (loot_selection[random].first->ItemType == EQEmu::item::ItemTypeArrow)); + uint16 slot_id = thief->GetInv().FindFreeSlot(false, true, (loot_selection[random].first->Size), (loot_selection[random].first->ItemType == EQ::item::ItemTypeArrow)); if (slot_id == INVALID_INDEX) { steal_item = false; break; } - + auto item_inst = database.CreateItem(loot_selection[random].first, loot_selection[random].second); if (item_inst == nullptr) { steal_item = false; @@ -1719,7 +1795,7 @@ void NPC::PickPocket(Client* thief) while (!steal_item && has_coin) { uint32 coin_amount = zone->random.Int(1, (steal_skill / 25) + 1); - + int coin_type = PickPocketPlatinum; while (coin_type <= PickPocketCopper) { if (money[coin_type]) { @@ -1769,12 +1845,12 @@ void NPC::PickPocket(Client* thief) void NPC::Disarm(Client* client, int chance) { // disarm primary if available, otherwise disarm secondary - const EQEmu::ItemData* weapon = NULL; + const EQ::ItemData* weapon = NULL; uint8 eslot = 0xFF; - if (equipment[EQEmu::invslot::slotPrimary] != 0) - eslot = EQEmu::invslot::slotPrimary; - else if (equipment[EQEmu::invslot::slotSecondary] != 0) - eslot = EQEmu::invslot::slotSecondary; + if (equipment[EQ::invslot::slotPrimary] != 0) + eslot = EQ::invslot::slotPrimary; + else if (equipment[EQ::invslot::slotSecondary] != 0) + eslot = EQ::invslot::slotSecondary; if (eslot != 0xFF) { if (zone->random.Int(0, 1000) <= chance) { weapon = database.GetItem(equipment[eslot]); @@ -1792,7 +1868,7 @@ void NPC::Disarm(Client* client, int chance) { break; } } - EQEmu::ItemInstance *inst = NULL; + EQ::ItemInstance *inst = NULL; inst = database.CreateItem(weapon->ID, charges); // Remove item from loot table RemoveItem(weapon->ID); @@ -1808,19 +1884,19 @@ void NPC::Disarm(Client* client, int chance) { } // Update Appearance equipment[eslot] = 0; - int matslot = eslot == EQEmu::invslot::slotPrimary ? EQEmu::textures::weaponPrimary : EQEmu::textures::weaponSecondary; + int matslot = eslot == EQ::invslot::slotPrimary ? EQ::textures::weaponPrimary : EQ::textures::weaponSecondary; if (matslot != -1) SendWearChange(matslot); - if ((CastToMob()->GetBodyType() == BT_Humanoid || CastToMob()->GetBodyType() == BT_Summoned) && eslot == EQEmu::invslot::slotPrimary) + if ((CastToMob()->GetBodyType() == BT_Humanoid || CastToMob()->GetBodyType() == BT_Summoned) && eslot == EQ::invslot::slotPrimary) Say("Ahh! My weapon!"); client->MessageString(Chat::Skills, DISARM_SUCCESS, this->GetCleanName()); if (chance != 1000) - client->CheckIncreaseSkill(EQEmu::skills::SkillDisarm, nullptr, 4); + client->CheckIncreaseSkill(EQ::skills::SkillDisarm, nullptr, 4); return; } client->MessageString(Chat::Skills, DISARM_FAILED); if (chance != 1000) - client->CheckIncreaseSkill(EQEmu::skills::SkillDisarm, nullptr, 2); + client->CheckIncreaseSkill(EQ::skills::SkillDisarm, nullptr, 2); return; } client->MessageString(Chat::Skills, DISARM_FAILED); @@ -2182,8 +2258,12 @@ void NPC::PetOnSpawn(NewSpawn_Struct* ns) if (RuleB(Pets, UnTargetableSwarmPet)) { ns->spawn.bodytype = 11; - if(!IsCharmed() && swarmOwner->IsClient()) - sprintf(ns->spawn.lastName, "%s's Pet", swarmOwner->GetName()); + if(!IsCharmed() && swarmOwner->IsClient()) { + std::string tmp_lastname = swarmOwner->GetName(); + tmp_lastname += "'s Pet"; + if (tmp_lastname.size() < sizeof(ns->spawn.lastName)) + strn0cpy(ns->spawn.lastName, tmp_lastname.c_str(), sizeof(ns->spawn.lastName)); + } } } else if(GetOwnerID()) @@ -2195,7 +2275,10 @@ void NPC::PetOnSpawn(NewSpawn_Struct* ns) if(client) { SetPetOwnerClient(true); - sprintf(ns->spawn.lastName, "%s's Pet", client->GetName()); + std::string tmp_lastname = client->GetName(); + tmp_lastname += "'s Pet"; + if (tmp_lastname.size() < sizeof(ns->spawn.lastName)) + strn0cpy(ns->spawn.lastName, tmp_lastname.c_str(), sizeof(ns->spawn.lastName)); } } } @@ -2443,18 +2526,27 @@ void NPC::LevelScale() { if (RuleB(NPC, NewLevelScaling)) { if (scalerate == 0 || maxlevel <= 25) { - // pre-pop seems to scale by 20 HP increments while newer by 100 - // We also don't want 100 increments on newer noobie zones, check level - if (zone->GetZoneID() < 200 || level < 48) { - max_hp += (random_level - level) * 20; - base_hp += (random_level - level) * 20; - } else { - max_hp += (random_level - level) * 100; - base_hp += (random_level - level) * 100; + // Don't add HP to dynamically scaled NPCs since this will be calculated later + if (max_hp > 0 || skip_auto_scale) + { + // pre-pop seems to scale by 20 HP increments while newer by 100 + // We also don't want 100 increments on newer noobie zones, check level + if (zone->GetZoneID() < 200 || level < 48) { + max_hp += (random_level - level) * 20; + base_hp += (random_level - level) * 20; + } else { + max_hp += (random_level - level) * 100; + base_hp += (random_level - level) * 100; + } + + current_hp = max_hp; } - current_hp = max_hp; - max_dmg += (random_level - level) * 2; + // Don't add max_dmg to dynamically scaled NPCs since this will be calculated later + if (max_dmg > 0 || skip_auto_scale) + { + max_dmg += (random_level - level) * 2; + } } else { uint8 scale_adjust = 1; @@ -2749,7 +2841,7 @@ FACTION_VALUE NPC::CheckNPCFactionAlly(int32 other_faction) { // I believe that the assumption is, barring no entry in npc_faction_entries // that two npcs on like faction con ally to each other. This catches cases - // where an npc is on a faction but has no hits (hence no entry in + // where an npc is on a faction but has no hits (hence no entry in // npc_faction_entries). if (GetPrimaryFaction() == other_faction) @@ -3129,6 +3221,11 @@ bool NPC::AICheckCloseBeneficialSpells( */ void NPC::AIYellForHelp(Mob *sender, Mob *attacker) { + LogAIYellForHelp("Mob[{}] Target[{}]", + (sender == nullptr ? "NULL MOB" : GetCleanName()), + (attacker == nullptr ? "NULL TARGET" : attacker->GetCleanName()) + ); + if (!sender || !attacker) { return; } @@ -3137,11 +3234,14 @@ void NPC::AIYellForHelp(Mob *sender, Mob *attacker) * If we dont have a faction set, we're gonna be indiff to everybody */ if (sender->GetPrimaryFaction() == 0) { + LogAIYellForHelp("No Primary Faction"); return; } - if (sender->HasAssistAggro()) + if (sender->HasAssistAggro()) { + LogAIYellForHelp("I have assist aggro"); return; + } LogAIYellForHelp( "NPC [{}] ID [{}] is starting to scan", @@ -3158,6 +3258,19 @@ void NPC::AIYellForHelp(Mob *sender, Mob *attacker) } float assist_range = (mob->GetAssistRange() * mob->GetAssistRange()); + + // Implement optional sneak-pull + if (RuleB(Combat, EnableSneakPull) && attacker->sneaking) { + assist_range = RuleI(Combat, SneakPullAssistRange); + if (attacker->IsClient()) { + float clientx = attacker->GetX(); + float clienty = attacker->GetY(); + if (attacker->CastToClient()->BehindMob(mob, clientx, clienty)) { + assist_range = 0; + } + } + } + if (distance > assist_range) { continue; } @@ -3193,17 +3306,16 @@ void NPC::AIYellForHelp(Mob *sender, Mob *attacker) * then jump in if they are our friend */ if (mob->GetLevel() >= 50 || attacker->GetLevelCon(mob->GetLevel()) != CON_GRAY) { - bool use_primary_faction = false; if (mob->GetPrimaryFaction() == sender->CastToNPC()->GetPrimaryFaction()) { const NPCFactionList *cf = content_db.GetNPCFactionEntry(mob->CastToNPC()->GetNPCFactionID()); if (cf) { - if (cf->assistprimaryfaction != 0) { - use_primary_faction = true; + if (cf->assistprimaryfaction == 0) { + continue; //Same faction and ignore primary assist } } } - if (use_primary_faction || sender->GetReverseFactionCon(mob) <= FACTION_AMIABLE) { + if (sender->GetReverseFactionCon(mob) <= FACTION_AMIABLE) { //attacking someone on same faction, or a friend //Father Nitwit: make sure we can see them. if (mob->CheckLosFN(sender)) { @@ -3227,8 +3339,8 @@ void NPC::AIYellForHelp(Mob *sender, Mob *attacker) void NPC::RecalculateSkills() { int r; - for (r = 0; r <= EQEmu::skills::HIGHEST_SKILL; r++) { - skills[r] = database.GetSkillCap(GetClass(), (EQEmu::skills::SkillType)r, level); + for (r = 0; r <= EQ::skills::HIGHEST_SKILL; r++) { + skills[r] = content_db.GetSkillCap(GetClass(), (EQ::skills::SkillType)r, level); } // some overrides -- really we need to be able to set skills for mobs in the DB @@ -3236,15 +3348,23 @@ void NPC::RecalculateSkills() // the theory of needing to be able to set skills for each mob separately if (!IsBot()) { if (level > 50) { - skills[EQEmu::skills::SkillDoubleAttack] = 250; - skills[EQEmu::skills::SkillDualWield] = 250; + skills[EQ::skills::SkillDoubleAttack] = 250; + skills[EQ::skills::SkillDualWield] = 250; } else if (level > 3) { - skills[EQEmu::skills::SkillDoubleAttack] = level * 5; - skills[EQEmu::skills::SkillDualWield] = skills[EQEmu::skills::SkillDoubleAttack]; + skills[EQ::skills::SkillDoubleAttack] = level * 5; + skills[EQ::skills::SkillDualWield] = skills[EQ::skills::SkillDoubleAttack]; } else { - skills[EQEmu::skills::SkillDoubleAttack] = level * 5; + skills[EQ::skills::SkillDoubleAttack] = level * 5; } } } + +void NPC::ScaleNPC(uint8 npc_level) { + if (GetLevel() != npc_level) { + SetLevel(npc_level); + } + npc_scale_manager->ResetNPCScaling(this); + npc_scale_manager->ScaleNPC(this); +} diff --git a/zone/npc.h b/zone/npc.h index 7c108b4b7..b23d15568 100644 --- a/zone/npc.h +++ b/zone/npc.h @@ -23,7 +23,9 @@ #include "mob.h" #include "qglobals.h" #include "zonedb.h" +#include "zone_store.h" #include "zonedump.h" +#include "../common/loottable.h" #include #include @@ -95,7 +97,7 @@ class Raid; class Spawn2; class Aura; -namespace EQEmu +namespace EQ { struct ItemData; } @@ -112,12 +114,13 @@ public: virtual ~NPC(); static NPC *SpawnNodeNPC(std::string name, std::string last_name, const glm::vec4 &position); - static NPC *SpawnGridNodeNPC(std::string name, const glm::vec4 &position, uint32 grid_id, uint32 grid_number, uint32 pause); + static void SpawnGridNodeNPC(const glm::vec4 &position, int32 grid_number, int32 zoffset); + static void SpawnZonePointNodeNPC(std::string name, const glm::vec4 &position); //abstract virtual function implementations requird by base abstract class - virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill); - virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQEmu::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); - virtual bool Attack(Mob* other, int Hand = EQEmu::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, + virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill); + virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None); + virtual bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false, bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr); virtual bool HasRaid() { return false; } virtual bool HasGroup() { return false; } @@ -149,7 +152,7 @@ public: void LevelScale(); virtual void SetTarget(Mob* mob); - virtual uint16 GetSkill(EQEmu::skills::SkillType skill_num) const { if (skill_num <= EQEmu::skills::HIGHEST_SKILL) { return skills[skill_num]; } return 0; } + virtual uint16 GetSkill(EQ::skills::SkillType skill_num) const { if (skill_num <= EQ::skills::HIGHEST_SKILL) { return skills[skill_num]; } return 0; } void CalcItemBonuses(StatBonuses *newbon); virtual void CalcBonuses(); @@ -168,15 +171,15 @@ public: virtual void RangedAttack(Mob* other); virtual void ThrowingAttack(Mob* other) { } int32 GetNumberOfAttacks() const { return attack_count; } - void DoRangedAttackDmg(Mob* other, bool Launch = true, int16 damage_mod = 0, int16 chance_mod = 0, EQEmu::skills::SkillType skill = EQEmu::skills::SkillArchery, float speed = 4.0f, const char *IDFile = nullptr); + void DoRangedAttackDmg(Mob* other, bool Launch = true, int16 damage_mod = 0, int16 chance_mod = 0, EQ::skills::SkillType skill = EQ::skills::SkillArchery, float speed = 4.0f, const char *IDFile = nullptr); bool DatabaseCastAccepted(int spell_id); bool IsFactionListAlly(uint32 other_faction); FACTION_VALUE CheckNPCFactionAlly(int32 other_faction); virtual FACTION_VALUE GetReverseFactionCon(Mob* iOther); - void GoToBind(uint8 bindnum = 0) { GMMove(m_SpawnPoint.x, m_SpawnPoint.y, m_SpawnPoint.z, m_SpawnPoint.w); } - void Gate(uint8 bindnum = 0); + void GoToBind(uint8 bind_number = 0) { GMMove(m_SpawnPoint.x, m_SpawnPoint.y, m_SpawnPoint.z, m_SpawnPoint.w); } + void Gate(uint8 bind_number = 0); void GetPetState(SpellBuff_Struct *buffs, uint32 *items, char *name); void SetPetState(SpellBuff_Struct *buffs, uint32 *items); @@ -185,14 +188,14 @@ public: virtual void SpellProcess(); virtual void FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho); - void AddItem(const EQEmu::ItemData* item, uint16 charges, bool equipitem = true); + void AddItem(const EQ::ItemData* item, uint16 charges, bool equipitem = true); void AddItem(uint32 itemid, uint16 charges, bool equipitem = true, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0); void AddLootTable(); void AddLootTable(uint32 ldid); void CheckGlobalLootTables(); void DescribeAggro(Client *towho, Mob *mob, bool verbose); void RemoveItem(uint32 item_id, uint16 quantity = 0, uint16 slot = 0); - void CheckMinMaxLevel(Mob *them); + void CheckTrivialMinMaxLevelDrop(Mob *killer); void ClearItemList(); ServerLootItem_Struct* GetItem(int slot_id); void AddCash(uint16 in_copper, uint16 in_silver, uint16 in_gold, uint16 in_platinum); @@ -290,7 +293,22 @@ public: void PickPocket(Client* thief); void Disarm(Client* client, int chance); void StartSwarmTimer(uint32 duration) { swarm_timer.Start(duration); } - void AddLootDrop(const EQEmu::ItemData*dbitem, ItemList* itemlistconst, int16 charges, uint8 minlevel, uint8 maxlevel, bool equipit, bool wearchange = false, uint32 aug1 = 0, uint32 aug2 = 0, uint32 aug3 = 0, uint32 aug4 = 0, uint32 aug5 = 0, uint32 aug6 = 0); + + void AddLootDrop( + const EQ::ItemData *item2, + ItemList *itemlist, + LootDropEntries_Struct loot_drop, + bool wear_change = false, + uint32 aug1 = 0, + uint32 aug2 = 0, + uint32 aug3 = 0, + uint32 aug4 = 0, + uint32 aug5 = 0, + uint32 aug6 = 0 + ); + + bool MeetsLootDropLevelRequirements(LootDropEntries_Struct loot_drop); + virtual void DoClassAttacks(Mob *target); void CheckSignal(); inline bool IsNotTargetableWithHotkey() const { return no_target_hotkey; } @@ -404,10 +422,12 @@ public: void SetCombatEvent(bool b) { combat_event = b; } /* Only allows players that killed corpse to loot */ - const bool HasPrivateCorpse() const { return NPCTypedata->private_corpse; } + const bool HasPrivateCorpse() const { return NPCTypedata_ours ? NPCTypedata_ours->private_corpse : NPCTypedata->private_corpse; } - virtual const bool IsUnderwaterOnly() const { return NPCTypedata->underwater; } - const char* GetRawNPCTypeName() const { return NPCTypedata->name; } + virtual const bool IsUnderwaterOnly() const { return NPCTypedata_ours ? NPCTypedata_ours->underwater : NPCTypedata->underwater; } + const char* GetRawNPCTypeName() const { return NPCTypedata_ours ? NPCTypedata_ours->name : NPCTypedata->name; } + + virtual int GetKillExpMod() const { return NPCTypedata_ours ? NPCTypedata_ours->exp_mod : NPCTypedata->exp_mod; } void ChangeLastName(const char* in_lastname); void ClearLastName(); @@ -417,9 +437,9 @@ public: void NPCSlotTexture(uint8 slot, uint16 texture); // Sets new material values for slots uint32 GetAdventureTemplate() const { return adventure_template_id; } - void AddSpellToNPCList(int16 iPriority, int16 iSpellID, uint32 iType, int16 iManaCost, int32 iRecastDelay, int16 iResistAdjust, int8 min_hp, int8 max_hp); + void AddSpellToNPCList(int16 iPriority, uint16 iSpellID, uint32 iType, int16 iManaCost, int32 iRecastDelay, int16 iResistAdjust, int8 min_hp, int8 max_hp); void AddSpellEffectToNPCList(uint16 iSpellEffectID, int32 base, int32 limit, int32 max); - void RemoveSpellFromNPCList(int16 spell_id); + void RemoveSpellFromNPCList(uint16 spell_id); Timer *GetRefaceTimer() const { return reface_timer; } const uint32 GetAltCurrencyType() const { return NPCTypedata->alt_currency_type; } @@ -443,7 +463,7 @@ public: uint32 GetSpawnKillCount(); int GetScore(); void mod_prespawn(Spawn2 *sp); - int mod_npc_damage(int damage, EQEmu::skills::SkillType skillinuse, int hand, const EQEmu::ItemData* weapon, Mob* other); + int mod_npc_damage(int damage, EQ::skills::SkillType skillinuse, int hand, const EQ::ItemData* weapon, Mob* other); void mod_npc_killed_merit(Mob* c); void mod_npc_killed(Mob* oos); void AISpellsList(Client *c); @@ -476,8 +496,11 @@ public: inline bool IsSkipAutoScale() const { return skip_auto_scale; } + void ScaleNPC(uint8 npc_level); + void RecalculateSkills(); + static LootDropEntries_Struct NewLootDropEntry(); protected: const NPCType* NPCTypedata; @@ -512,7 +535,7 @@ protected: uint32 npc_spells_id; uint8 casting_spell_AIindex; - + uint32* pDontCastBefore_casting_spell; std::vector AIspells; bool HasAISpell; @@ -587,9 +610,9 @@ protected: uint32 roambox_delay; uint32 roambox_min_delay; - uint16 skills[EQEmu::skills::HIGHEST_SKILL + 1]; + uint16 skills[EQ::skills::HIGHEST_SKILL + 1]; - uint32 equipment[EQEmu::invslot::EQUIPMENT_COUNT]; //this is an array of item IDs + uint32 equipment[EQ::invslot::EQUIPMENT_COUNT]; //this is an array of item IDs uint32 herosforgemodel; //this is the Hero Forge Armor Model (i.e 63 or 84 or 203) uint16 d_melee_texture1; @@ -619,12 +642,11 @@ protected: bool ignore_despawn; //NPCs with this set to 1 will ignore the despawn value in spawngroup - private: - uint32 loottable_id; - bool skip_global_loot; - bool skip_auto_scale; - bool p_depop; + uint32 loottable_id; + bool skip_global_loot; + bool skip_auto_scale; + bool p_depop; }; #endif diff --git a/zone/npc_scale_manager.cpp b/zone/npc_scale_manager.cpp index 191d2540f..158ac299b 100644 --- a/zone/npc_scale_manager.cpp +++ b/zone/npc_scale_manager.cpp @@ -164,6 +164,16 @@ void NpcScaleManager::ScaleNPC(NPC *npc) } } +void NpcScaleManager::ResetNPCScaling(NPC *npc) { + for (const auto &scaling_stat : scaling_stats) { + std::string stat_name = fmt::format("modify_stat_{}", scaling_stat); + std::string reset_value = "0"; + if (npc->EntityVariableExists(stat_name.c_str())) { + npc->ModifyNPCStat(scaling_stat.c_str(), reset_value.c_str()); + } + } +} + bool NpcScaleManager::LoadScaleData() { auto results = content_db.QueryDatabase( diff --git a/zone/npc_scale_manager.h b/zone/npc_scale_manager.h index 1135ee8a2..2b52de1e4 100644 --- a/zone/npc_scale_manager.h +++ b/zone/npc_scale_manager.h @@ -87,6 +87,7 @@ public: }; void ScaleNPC(NPC * npc); + void ResetNPCScaling(NPC * npc); bool IsAutoScaled(NPC * npc); bool LoadScaleData(); diff --git a/zone/object.cpp b/zone/object.cpp index 3361b0e44..88038bbe8 100644 --- a/zone/object.cpp +++ b/zone/object.cpp @@ -26,6 +26,8 @@ #include "quest_parser_collection.h" #include "zonedb.h" +#include "zone_store.h" +#include "../common/repositories/criteria/content_filter_criteria.h" #include @@ -37,7 +39,7 @@ extern Zone* zone; extern EntityList entity_list; // Loading object from database -Object::Object(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const EQEmu::ItemInstance* inst) +Object::Object(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const EQ::ItemInstance* inst) : respawn_timer(0), decay_timer(300000) { @@ -69,7 +71,7 @@ Object::Object(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, } //creating a re-ocurring ground spawn. -Object::Object(const EQEmu::ItemInstance* inst, char* name,float max_x,float min_x,float max_y,float min_y,float z,float heading,uint32 respawntimer) +Object::Object(const EQ::ItemInstance* inst, char* name,float max_x,float min_x,float max_y,float min_y,float z,float heading,uint32 respawntimer) : respawn_timer(respawntimer * 1000), decay_timer(300000) { @@ -102,7 +104,7 @@ Object::Object(const EQEmu::ItemInstance* inst, char* name,float max_x,float min } // Loading object from client dropping item on ground -Object::Object(Client* client, const EQEmu::ItemInstance* inst) +Object::Object(Client* client, const EQ::ItemInstance* inst) : respawn_timer(0), decay_timer(300000) { user = nullptr; @@ -120,7 +122,7 @@ Object::Object(Client* client, const EQEmu::ItemInstance* inst) m_data.heading = client->GetHeading(); m_data.x = client->GetX(); m_data.y = client->GetY(); - if (client->ClientVersion() >= EQEmu::versions::ClientVersion::RoF2) + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF2) { // RoF2 places items at player's Z, which is 0.625 of their height. m_data.z = client->GetZ() - (client->GetSize() * 0.625f); @@ -141,7 +143,7 @@ Object::Object(Client* client, const EQEmu::ItemInstance* inst) // Set object name if (inst) { - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if (item && item->IDFile) { if (strlen(item->IDFile) == 0) { strcpy(m_data.object_name, DEFAULT_OBJECT_NAME); @@ -164,7 +166,7 @@ Object::Object(Client* client, const EQEmu::ItemInstance* inst) } } -Object::Object(const EQEmu::ItemInstance *inst, float x, float y, float z, float heading, uint32 decay_time) +Object::Object(const EQ::ItemInstance *inst, float x, float y, float z, float heading, uint32 decay_time) : respawn_timer(0), decay_timer(decay_time) { user = nullptr; @@ -197,7 +199,7 @@ Object::Object(const EQEmu::ItemInstance *inst, float x, float y, float z, float // Set object name if (inst) { - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if (item && item->IDFile) { if (strlen(item->IDFile) == 0) { strcpy(m_data.object_name, DEFAULT_OBJECT_NAME); @@ -225,7 +227,7 @@ Object::Object(const char *model, float x, float y, float z, float heading, uint { user = nullptr; last_user = nullptr; - EQEmu::ItemInstance* inst = new EQEmu::ItemInstance(ItemInstWorldContainer); + EQ::ItemInstance* inst = new EQ::ItemInstance(ItemInstWorldContainer); // Initialize members m_id = 0; @@ -327,8 +329,8 @@ void Object::Delete(bool reset_state) } } -const EQEmu::ItemInstance* Object::GetItem(uint8 index) { - if (index < EQEmu::invtype::WORLD_SIZE) { +const EQ::ItemInstance* Object::GetItem(uint8 index) { + if (index < EQ::invtype::WORLD_SIZE) { return m_inst->GetItem(index); } @@ -336,14 +338,14 @@ const EQEmu::ItemInstance* Object::GetItem(uint8 index) { } // Add item to object (only logical for world tradeskill containers -void Object::PutItem(uint8 index, const EQEmu::ItemInstance* inst) +void Object::PutItem(uint8 index, const EQ::ItemInstance* inst) { if (index > 9) { LogError("Object::PutItem: Invalid index specified ([{}])", index); return; } - if (m_inst && m_inst->IsType(EQEmu::item::ItemClassBag)) { + if (m_inst && m_inst->IsType(EQ::item::ItemClassBag)) { if (inst) { m_inst->PutItem(index, *inst); } @@ -363,12 +365,12 @@ void Object::Close() { last_user = user; // put any remaining items from the world container back into the player's inventory to avoid item loss // if they close the container without removing all items - EQEmu::ItemInstance* container = this->m_inst; + EQ::ItemInstance* container = this->m_inst; if(container != nullptr) { - for (uint8 i = EQEmu::invbag::SLOT_BEGIN; i <= EQEmu::invbag::SLOT_END; i++) + for (uint8 i = EQ::invbag::SLOT_BEGIN; i <= EQ::invbag::SLOT_END; i++) { - EQEmu::ItemInstance* inst = container->PopItem(i); + EQ::ItemInstance* inst = container->PopItem(i); if(inst != nullptr) { user->MoveItemToInventory(inst, true); @@ -384,7 +386,7 @@ void Object::Close() { // Remove item from container void Object::DeleteItem(uint8 index) { - if (m_inst && m_inst->IsType(EQEmu::item::ItemClassBag)) { + if (m_inst && m_inst->IsType(EQ::item::ItemClassBag)) { m_inst->DeleteItem(index); // This is _highly_ inefficient, but for now it will work: Save entire object to database @@ -393,11 +395,11 @@ void Object::DeleteItem(uint8 index) } // Pop item out of container -EQEmu::ItemInstance* Object::PopItem(uint8 index) +EQ::ItemInstance* Object::PopItem(uint8 index) { - EQEmu::ItemInstance* inst = nullptr; + EQ::ItemInstance* inst = nullptr; - if (m_inst && m_inst->IsType(EQEmu::item::ItemClassBag)) { + if (m_inst && m_inst->IsType(EQ::item::ItemClassBag)) { inst = m_inst->PopItem(index); // This is _highly_ inefficient, but for now it will work: Save entire object to database @@ -460,8 +462,8 @@ void Object::RandomSpawn(bool send_packet) { m_data.x = zone->random.Real(m_min_x, m_max_x); m_data.y = zone->random.Real(m_min_y, m_max_y); - - if(m_data.z == BEST_Z_INVALID) { + + if (m_data.z == BEST_Z_INVALID && zone->HasMap()) { glm::vec3 me; me.x = m_data.x; me.y = m_data.y; @@ -470,11 +472,11 @@ void Object::RandomSpawn(bool send_packet) { float best_z = zone->zonemap->FindClosestZ(me, &hit); if (best_z != BEST_Z_INVALID) { m_data.z = best_z + 0.1f; - } + } } LogInfo("Object::RandomSpawn([{}]): [{}] ([{}], [{}], [{}])", m_data.object_name, m_inst->GetID(), m_data.x, m_data.y, m_data.z); - + respawn_timer.Disable(); if(send_packet) { @@ -510,7 +512,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) char buf[10]; snprintf(buf, 9, "%u", item->ID); buf[9] = '\0'; - std::vector args; + std::vector args; args.push_back(m_inst); if(parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, buf, this->GetID(), &args)) { @@ -520,7 +522,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) co->drop_id = 0; entity_list.QueueClients(nullptr, outapp, false); safe_delete(outapp); - + // No longer using a tradeskill object sender->SetTradeskillObject(nullptr); user = nullptr; @@ -530,11 +532,11 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) // Transfer item to client - sender->PutItemInInventory(EQEmu::invslot::slotCursor, *m_inst, false); - sender->SendItemPacket(EQEmu::invslot::slotCursor, m_inst, ItemPacketTrade); + sender->PutItemInInventory(EQ::invslot::slotCursor, *m_inst, false); + sender->SendItemPacket(EQ::invslot::slotCursor, m_inst, ItemPacketTrade); if(cursordelete) // delete the item if it's a duplicate lore. We have to do this because the client expects the item packet - sender->DeleteItemInInventory(EQEmu::invslot::slotCursor); + sender->DeleteItemInInventory(EQ::invslot::slotCursor); sender->DropItemQS(m_inst, true); @@ -577,7 +579,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) else { coa->open = 0x00; - if (sender->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) { + if (sender->ClientVersion() >= EQ::versions::ClientVersion::RoF) { coa->drop_id = 0xFFFFFFFF; sender->Message(Chat::White, "Someone else is using that. Try again later."); } @@ -598,7 +600,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) // Send items inside of container - if (m_inst && m_inst->IsType(EQEmu::item::ItemClassBag)) { + if (m_inst && m_inst->IsType(EQ::item::ItemClassBag)) { //Clear out no-drop and no-rent items first if different player opens it if(user != last_user) @@ -607,8 +609,8 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) auto outapp = new EQApplicationPacket(OP_ClientReady, 0); sender->QueuePacket(outapp); safe_delete(outapp); - for (uint8 i = EQEmu::invbag::SLOT_BEGIN; i <= EQEmu::invbag::SLOT_END; i++) { - const EQEmu::ItemInstance* inst = m_inst->GetItem(i); + for (uint8 i = EQ::invbag::SLOT_BEGIN; i <= EQ::invbag::SLOT_END; i++) { + const EQ::ItemInstance* inst = m_inst->GetItem(i); if (inst) { //sender->GetInv().PutItem(i+4000,inst); sender->SendItemPacket(i, inst, ItemPacketWorldContainer); @@ -621,7 +623,7 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) } // Add new Zone Object (theoretically only called for items dropped to ground) -uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& object, const EQEmu::ItemInstance* inst) +uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& object, const EQ::ItemInstance* inst) { uint32 database_id = 0; uint32 item_id = 0; @@ -651,15 +653,16 @@ uint32 ZoneDatabase::AddObject(uint32 type, uint32 icon, const Object_Struct& ob return 0; } - // Save container contents, if container - if (inst && inst->IsType(EQEmu::item::ItemClassBag)) - SaveWorldContainer(object.zone_id, database_id, inst); + // Save container contents, if container + if (inst && inst->IsType(EQ::item::ItemClassBag)) { + SaveWorldContainer(object.zone_id, database_id, inst); + } return database_id; } // Update information about existing object in database -void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const EQEmu::ItemInstance* inst) +void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const EQ::ItemInstance* inst) { uint32 item_id = 0; int16 charges = 0; @@ -669,43 +672,53 @@ void ZoneDatabase::UpdateObject(uint32 id, uint32 type, uint32 icon, const Objec charges = inst->GetCharges(); } - // SQL Escape object_name - uint32 len = strlen(object.object_name) * 2 + 1; - auto object_name = new char[len]; - DoEscapeString(object_name, object.object_name, strlen(object.object_name)); + if (inst && !inst->IsType(EQ::item::ItemClassBag)) { + uint32 len = strlen(object.object_name) * 2 + 1; + auto object_name = new char[len]; + DoEscapeString(object_name, object.object_name, strlen(object.object_name)); - // Save new record for object - std::string query = StringFormat("UPDATE object SET " - "zoneid = %i, xpos = %f, ypos = %f, zpos = %f, heading = %f, " - "itemid = %i, charges = %i, objectname = '%s', type = %i, icon = %i, " - "size = %f, tilt_x = %f, tilt_y = %f " - "WHERE id = %i", - object.zone_id, object.x, object.y, object.z, object.heading, - item_id, charges, object_name, type, icon, - object.size, object.tilt_x, object.tilt_y, id); - safe_delete_array(object_name); - auto results = QueryDatabase(query); - if (!results.Success()) { - LogError("Unable to update object: [{}]", results.ErrorMessage().c_str()); - return; + // Save new record for object + std::string query = StringFormat( + "UPDATE object SET " + "zoneid = %i, xpos = %f, ypos = %f, zpos = %f, heading = %f, " + "itemid = %i, charges = %i, objectname = '%s', type = %i, icon = %i, " + "size = %f, tilt_x = %f, tilt_y = %f " + "WHERE id = %i", + object.zone_id, object.x, object.y, object.z, object.heading, + item_id, charges, object_name, type, icon, + object.size, object.tilt_x, object.tilt_y, id + ); + safe_delete_array(object_name); + auto results = QueryDatabase(query); + if (!results.Success()) { + LogError("Unable to update object: [{}]", results.ErrorMessage().c_str()); + return; + } } - // Save container contents, if container - if (inst && inst->IsType(EQEmu::item::ItemClassBag)) - SaveWorldContainer(object.zone_id, id, inst); + // Save container contents, if container + if (inst && inst->IsType(EQ::item::ItemClassBag)) { + SaveWorldContainer(object.zone_id, id, inst); + } } // Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Ground_Spawns* gs) { - std::string query = StringFormat("SELECT max_x, max_y, max_z, " - "min_x, min_y, heading, name, " - "item, max_allowed, respawn_timer " - "FROM ground_spawns " - "WHERE zoneid = %i AND (version = %u OR version = -1) " - "LIMIT 50", zone_id, version); - auto results = QueryDatabase(query); - if (!results.Success()) { + std::string query = StringFormat( + "SELECT max_x, max_y, max_z, " + "min_x, min_y, heading, name, " + "item, max_allowed, respawn_timer " + "FROM ground_spawns " + "WHERE zoneid = %i AND (version = %u OR version = -1) %s " + "LIMIT 50", + zone_id, + version, + ContentFilterCriteria::apply().c_str() + ); + + auto results = QueryDatabase(query); + if (!results.Success()) { return gs; } @@ -727,7 +740,10 @@ Ground_Spawns* ZoneDatabase::LoadGroundSpawns(uint32 zone_id, int16 version, Gro void ZoneDatabase::DeleteObject(uint32 id) { - // delete record of object + if (id == 0) { + return; + } + std::string query = StringFormat("DELETE FROM object WHERE id = %i", id); auto results = QueryDatabase(query); if (!results.Success()) { @@ -951,7 +967,7 @@ uint32 Object::GetItemID() return 0; } - const EQEmu::ItemData* item = this->m_inst->GetItem(); + const EQ::ItemData* item = this->m_inst->GetItem(); if (item == 0) { diff --git a/zone/object.h b/zone/object.h index ce64ee47e..1ab4463f1 100644 --- a/zone/object.h +++ b/zone/object.h @@ -30,7 +30,7 @@ class Client; class EQApplicationPacket; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -73,7 +73,7 @@ IT10714_ACTORDEF=Augmentation Sealer IT10725_ACTORDEF=Shuriken */ -#define OT_DROPPEDITEM EQEmu::item::BagTypeLargeBag +#define OT_DROPPEDITEM EQ::item::BagTypeLargeBag // Icon values: //0x0453 a pie @@ -93,11 +93,11 @@ class Object: public Entity { public: // Loading object from database - Object(uint32 id, uint32 type, uint32 icon, const Object_Struct& data, const EQEmu::ItemInstance* inst); - Object(const EQEmu::ItemInstance* inst, char* name,float max_x,float min_x,float max_y,float min_y,float z,float heading,uint32 respawntimer); + Object(uint32 id, uint32 type, uint32 icon, const Object_Struct& data, const EQ::ItemInstance* inst); + Object(const EQ::ItemInstance* inst, char* name,float max_x,float min_x,float max_y,float min_y,float z,float heading,uint32 respawntimer); // Loading object from client dropping item on ground - Object(Client* client, const EQEmu::ItemInstance* inst); - Object(const EQEmu::ItemInstance *inst, float x, float y, float z, float heading, uint32 decay_time = 300000); + Object(Client* client, const EQ::ItemInstance* inst); + Object(const EQ::ItemInstance *inst, float x, float y, float z, float heading, uint32 decay_time = 300000); Object(const char *model, float x, float y, float z, float heading, uint8 type, uint32 decay_time = 0); // Destructor @@ -112,7 +112,7 @@ public: static void HandleAugmentation(Client* user, const AugmentItem_Struct* in_augment, Object *worldo); static void HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac); - static EQEmu::skills::SkillType TypeToSkill(uint32 type); + static EQ::skills::SkillType TypeToSkill(uint32 type); // Packet functions void CreateSpawnPacket(EQApplicationPacket* app); @@ -124,10 +124,10 @@ public: void StartDecay() {decay_timer.Start();} // Container functions - const EQEmu::ItemInstance* GetItem(uint8 index); - void PutItem(uint8 index, const EQEmu::ItemInstance* inst); + const EQ::ItemInstance* GetItem(uint8 index); + void PutItem(uint8 index, const EQ::ItemInstance* inst); void DeleteItem(uint8 index); // Item inside container - EQEmu::ItemInstance* PopItem(uint8 index); // Pop item out of container + EQ::ItemInstance* PopItem(uint8 index); // Pop item out of container // Override base class implementations virtual bool IsObject() const { return true; } @@ -180,7 +180,7 @@ protected: void RandomSpawn(bool send_packet = false); //spawn this ground spawn at a random place Object_Struct m_data; // Packet data - EQEmu::ItemInstance *m_inst; // Item representing object + EQ::ItemInstance *m_inst; // Item representing object bool m_inuse; // Currently in use by a client? uint32 m_id; // Database key, different than drop_id uint32 m_type; // Object Type, ie, forge, oven, dropped item, etc (ref: ContainerUseTypes) diff --git a/zone/pathfinder_nav_mesh.cpp b/zone/pathfinder_nav_mesh.cpp index 998515a35..c644a45e0 100644 --- a/zone/pathfinder_nav_mesh.cpp +++ b/zone/pathfinder_nav_mesh.cpp @@ -20,7 +20,7 @@ struct PathfinderNavmesh::Implementation PathfinderNavmesh::PathfinderNavmesh(const std::string &path) { - m_impl.reset(new Implementation()); + m_impl = std::make_unique(); m_impl->nav_mesh = nullptr; m_impl->query = nullptr; Load(path); @@ -432,7 +432,7 @@ void PathfinderNavmesh::Load(const std::string &path) std::vector buffer; buffer.resize(buffer_size); - uint32_t v = EQEmu::InflateData(&data[0], data_size, &buffer[0], buffer_size); + uint32_t v = EQ::InflateData(&data[0], data_size, &buffer[0], buffer_size); fclose(f); char *buf = &buffer[0]; diff --git a/zone/pathing.cpp b/zone/pathing.cpp index ee5f0138a..1513cd5d6 100644 --- a/zone/pathing.cpp +++ b/zone/pathing.cpp @@ -40,14 +40,14 @@ void CullPoints(std::vector &points) { } void Client::SendPathPacket(const std::vector &points) { - EQEmu::Any data(points); + EQ::Any data(points); EQ::Task([=](EQ::Task::ResolveFn resolve, EQ::Task::RejectFn reject) { - auto points = EQEmu::any_cast>(data); + auto points = EQ::any_cast>(data); CullPoints(points); resolve(points); }) - .Then([this](const EQEmu::Any &result) { - auto points = EQEmu::any_cast>(result); + .Then([this](const EQ::Any &result) { + auto points = EQ::any_cast>(result); if (points.size() < 2) { if (Admin() > 10) { Message(Chat::System, "Too few points"); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 2390dea3a..4d675d8fb 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -37,28 +37,34 @@ #endif #include "client.h" +#include "expedition.h" #include "titles.h" #ifdef THIS /* this macro seems to leak out on some systems */ #undef THIS #endif +#define VALIDATE_THIS_IS_CLIENT \ + do { \ + if (sv_derived_from(ST(0), "Client")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Client*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Client"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_Client_SendSound); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SendSound) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::SendSound(THIS)"); + Perl_croak(aTHX_ "Usage: Client::SendSound(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendSound(); } XSRETURN_EMPTY; @@ -68,20 +74,12 @@ XS(XS_Client_Save); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Save) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::Save(THIS, uint8 commit_now)"); + Perl_croak(aTHX_ "Usage: Client::Save(THIS, uint8 commit_now)"); // @categories Script Utility { Client *THIS; bool RETVAL; uint8 iCommitNow = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->Save(iCommitNow); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -93,18 +91,10 @@ XS(XS_Client_SaveBackup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SaveBackup) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::SaveBackup(THIS)"); + Perl_croak(aTHX_ "Usage: Client::SaveBackup(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SaveBackup(); } XSRETURN_EMPTY; @@ -114,19 +104,11 @@ XS(XS_Client_Connected); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Connected) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Connected(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Connected(THIS)"); // @categories Script Utility { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->Connected(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -138,19 +120,11 @@ XS(XS_Client_InZone); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_InZone) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::InZone(THIS)"); + Perl_croak(aTHX_ "Usage: Client::InZone(THIS)"); // @categories Script Utility { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->InZone(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -162,18 +136,10 @@ XS(XS_Client_Kick); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Kick) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Kick(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Kick(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->Kick("Perl Quest"); } XSRETURN_EMPTY; @@ -183,18 +149,10 @@ XS(XS_Client_Disconnect); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Disconnect) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Disconnect(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Disconnect(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->Disconnect(); } XSRETURN_EMPTY; @@ -204,19 +162,11 @@ XS(XS_Client_IsLD); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsLD) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsLD(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsLD(THIS)"); // @categories Account and Character { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsLD(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -228,41 +178,38 @@ XS(XS_Client_WorldKick); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_WorldKick) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::WorldKick(THIS)"); + Perl_croak(aTHX_ "Usage: Client::WorldKick(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->WorldKick(); } XSRETURN_EMPTY; } +XS(XS_Client_SendToGuildHall); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_SendToGuildHall) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::SendToGuildHall(THIS)"); // @categories Script Utility, Guild + { + Client *THIS; + VALIDATE_THIS_IS_CLIENT; + THIS->SendToGuildHall(); + } + XSRETURN_EMPTY; +} + XS(XS_Client_GetAnon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAnon) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetAnon(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetAnon(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAnon(); XSprePUSH; PUSHu((UV) RETVAL); @@ -270,43 +217,93 @@ XS(XS_Client_GetAnon) { XSRETURN(1); } +XS(XS_Client_SetAnon); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_SetAnon) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::SetAnon(THIS, uint8 anon_flag)"); // @categories Account and Character, Stats and Attributes + { + Client *THIS; + uint8 anon_flag = (uint8) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + THIS->SetAnon(anon_flag); + } + XSRETURN_EMPTY; +} + +XS(XS_Client_GetAFK); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_GetAFK) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetAFK(THIS)"); // @categories Account and Character, Stats and Attributes + { + Client *THIS; + uint8 RETVAL; + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + RETVAL = THIS->GetAFK(); + XSprePUSH; + PUSHu((UV) RETVAL); + } + XSRETURN(1); +} + +XS(XS_Client_SetAFK); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_SetAFK) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::SetAFK(THIS, uint8 afk_flag)"); // @categories Account and Character, Stats and Attributes + { + Client *THIS; + uint8 afk_flag = (uint8) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + THIS->SetAFK(afk_flag); + } + XSRETURN_EMPTY; +} + XS(XS_Client_Duck); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Duck) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Duck(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Duck(THIS)"); // @categories Account and Character { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->Duck(); } XSRETURN_EMPTY; } +XS(XS_Client_DyeArmorBySlot); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_DyeArmorBySlot) { + dXSARGS; + if (items != 5 && items != 6) + Perl_croak(aTHX_ "Usage: Client::DyeArmorBySlot(THIS, uint8 slot, uint8 red, uint8 green, uint8 blue, [uint8 use_tint = 0x00])"); // @categories Account and Character, Inventory and Items + { + Client *THIS; + uint8 slot = (uint8) SvUV(ST(1)); + uint8 red = (uint8) SvUV(ST(2)); + uint8 green = (uint8) SvUV(ST(3)); + uint8 blue = (uint8) SvUV(ST(4)); + uint8 use_tint = 0x00; + if (items == 6) { + use_tint = (uint8) SvUV(ST(5)); + } + VALIDATE_THIS_IS_CLIENT; + THIS->DyeArmorBySlot(slot, red, green, blue, use_tint); + } + XSRETURN_EMPTY; +} + XS(XS_Client_Stand); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Stand) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Stand(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Stand(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->Stand(); } XSRETURN_EMPTY; @@ -316,19 +313,11 @@ XS(XS_Client_SetGM); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetGM) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetGM(THIS, bool toggle)"); + Perl_croak(aTHX_ "Usage: Client::SetGM(THIS, bool toggle)"); // @categories Account and Character { Client *THIS; bool toggle = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetGM(toggle); } XSRETURN_EMPTY; @@ -338,19 +327,11 @@ XS(XS_Client_SetPVP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetPVP) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetPVP(THIS, bool toggle)"); + Perl_croak(aTHX_ "Usage: Client::SetPVP(THIS, bool toggle)"); // @categories Account and Character { Client *THIS; bool toggle = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetPVP(toggle); } XSRETURN_EMPTY; @@ -360,19 +341,11 @@ XS(XS_Client_GetPVP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetPVP) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetPVP(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetPVP(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetPVP(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -384,19 +357,11 @@ XS(XS_Client_GetGM); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetGM) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetGM(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetGM(THIS)"); // @categories Account and Character { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetGM(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -408,19 +373,11 @@ XS(XS_Client_SetBaseClass); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetBaseClass) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetBaseClass(THIS, uint32 class_id)"); + Perl_croak(aTHX_ "Usage: Client::SetBaseClass(THIS, uint32 class_id)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint32 i = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetBaseClass(i); } XSRETURN_EMPTY; @@ -430,19 +387,11 @@ XS(XS_Client_SetBaseRace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetBaseRace) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetBaseRace(THIS, uint32 race_id)"); + Perl_croak(aTHX_ "Usage: Client::SetBaseRace(THIS, uint32 race_id)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint32 i = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetBaseRace(i); } XSRETURN_EMPTY; @@ -452,19 +401,11 @@ XS(XS_Client_SetBaseGender); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetBaseGender) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetBaseGender(THIS, uint32 gender_id)"); + Perl_croak(aTHX_ "Usage: Client::SetBaseGender(THIS, uint32 gender_id)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint32 i = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetBaseGender(i); } XSRETURN_EMPTY; @@ -474,20 +415,12 @@ XS(XS_Client_GetBaseFace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseFace) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseFace(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseFace(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseFace(); XSprePUSH; PUSHu((UV) RETVAL); @@ -499,21 +432,13 @@ XS(XS_Client_GetLanguageSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetLanguageSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetLanguageSkill(THIS, uint16 lanuage_id)"); + Perl_croak(aTHX_ "Usage: Client::GetLanguageSkill(THIS, uint16 lanuage_id)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; uint16 n = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetLanguageSkill(n); XSprePUSH; PUSHu((UV) RETVAL); @@ -521,51 +446,17 @@ XS(XS_Client_GetLanguageSkill) { XSRETURN(1); } -XS(XS_Client_GetLastName); /* prototype to pass -Wmissing-prototypes */ -XS(XS_Client_GetLastName) { - dXSARGS; - if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetLastName(THIS)"); - { - Client *THIS; - Const_char *RETVAL; - dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - RETVAL = THIS->GetLastName(); - sv_setpv(TARG, RETVAL); - XSprePUSH; - PUSHTARG; - } - XSRETURN(1); -} - XS(XS_Client_GetLDoNPointsTheme); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetLDoNPointsTheme) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetLDoNPointsTheme(THIS, int32 theme)"); + Perl_croak(aTHX_ "Usage: Client::GetLDoNPointsTheme(THIS, int32 theme)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; int32 theme_out = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetLDoNPointsTheme(theme_out); XSprePUSH; PUSHu((UV) RETVAL); @@ -577,20 +468,12 @@ XS(XS_Client_GetBaseSTR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseSTR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseSTR(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseSTR(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseSTR(); XSprePUSH; PUSHu((UV) RETVAL); @@ -602,20 +485,12 @@ XS(XS_Client_GetBaseSTA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseSTA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseSTA(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseSTA(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseSTA(); XSprePUSH; PUSHu((UV) RETVAL); @@ -627,20 +502,12 @@ XS(XS_Client_GetBaseCHA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseCHA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseCHA(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseCHA(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseCHA(); XSprePUSH; PUSHu((UV) RETVAL); @@ -652,20 +519,12 @@ XS(XS_Client_GetBaseDEX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseDEX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseDEX(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseDEX(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseDEX(); XSprePUSH; PUSHu((UV) RETVAL); @@ -677,20 +536,12 @@ XS(XS_Client_GetBaseINT); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseINT) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseINT(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseINT(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseINT(); XSprePUSH; PUSHu((UV) RETVAL); @@ -702,20 +553,12 @@ XS(XS_Client_GetBaseAGI); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseAGI) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseAGI(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseAGI(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseAGI(); XSprePUSH; PUSHu((UV) RETVAL); @@ -727,20 +570,12 @@ XS(XS_Client_GetBaseWIS); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBaseWIS) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBaseWIS(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBaseWIS(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBaseWIS(); XSprePUSH; PUSHu((UV) RETVAL); @@ -752,20 +587,12 @@ XS(XS_Client_GetWeight); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetWeight) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetWeight(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetWeight(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetWeight(); XSprePUSH; PUSHu((UV) RETVAL); @@ -777,20 +604,12 @@ XS(XS_Client_GetEXP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetEXP) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetEXP(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetEXP(THIS)"); // @categories Experience and Level { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetEXP(); XSprePUSH; PUSHu((UV) RETVAL); @@ -802,20 +621,12 @@ XS(XS_Client_GetAAExp); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAAExp) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetAAExp(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetAAExp(THIS)"); // @categories Alternative Advancement, Experience and Level { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAAXP(); XSprePUSH; PUSHu((UV) RETVAL); @@ -827,20 +638,12 @@ XS(XS_Client_GetAAPercent); XS(XS_Client_GetAAPercent) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetAAPercent(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetAAPercent(THIS)"); // @categories Alternative Advancement, Experience and Level { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAAPercent(); XSprePUSH; PUSHu((UV) RETVAL); @@ -852,20 +655,12 @@ XS(XS_Client_GetTotalSecondsPlayed); /* prototype to pass -Wmissing-prototypes * XS(XS_Client_GetTotalSecondsPlayed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetTotalSecondsPlayed(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetTotalSecondsPlayed(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetTotalSecondsPlayed(); XSprePUSH; PUSHu((UV) RETVAL); @@ -877,21 +672,13 @@ XS(XS_Client_UpdateLDoNPoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UpdateLDoNPoints) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::UpdateLDoNPoints(THIS, int32 points, uint32 theme)"); + Perl_croak(aTHX_ "Usage: Client::UpdateLDoNPoints(THIS, int32 points, uint32 theme)"); // @categories Currency and Points { Client *THIS; bool RETVAL; int32 points = (int32) SvIV(ST(1)); uint32 theme = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->UpdateLDoNPoints(points, theme); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -903,19 +690,11 @@ XS(XS_Client_SetDeity); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetDeity) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetDeity(THIS, uint32 deity_id)"); + Perl_croak(aTHX_ "Usage: Client::SetDeity(THIS, uint32 deity_id)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint32 i = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetDeity(i); } XSRETURN_EMPTY; @@ -925,21 +704,13 @@ XS(XS_Client_AddEXP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AddEXP) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Client::AddEXP(THIS, uint32 experience_points)"); + Perl_croak(aTHX_ "Usage: Client::AddEXP(THIS, uint32 experience_points)"); // @categories Experience and Level { Client *THIS; uint32 add_exp = (uint32) SvUV(ST(1)); uint8 conlevel; bool resexp; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) conlevel = 0xFF; else { @@ -961,21 +732,13 @@ XS(XS_Client_SetEXP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetEXP) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Client::SetEXP(THIS, uint32 experience_points, uint32 aa_experience_points, [bool resexp=false])"); + Perl_croak(aTHX_ "Usage: Client::SetEXP(THIS, uint32 experience_points, uint32 aa_experience_points, [bool resexp=false])"); // @categories Experience and Level { Client *THIS; uint32 set_exp = (uint32) SvUV(ST(1)); uint32 set_aaxp = (uint32) SvUV(ST(2)); bool resexp; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 4) resexp = false; else { @@ -990,55 +753,28 @@ XS(XS_Client_SetEXP) { XS(XS_Client_SetBindPoint); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetBindPoint) { dXSARGS; - if (items < 1 || items > 6) - Perl_croak(aTHX_ "Usage: Client::SetBindPoint(THIS, int to_zone = -1, int to_instance = 0, float new_x = 0.0f, float new_y = 0.0f, float new_z = 0.0f)"); + if (items < 1 || items > 7) + Perl_croak(aTHX_ "Usage: Client::SetBindPoint(THIS, [int to_zone = -1, int to_instance = 0, float new_x = 0.0f, float new_y = 0.0f, float new_z = 0.0f, float new_heading = 0.0f])"); // @categories Account and Character, Stats and Attributes { Client *THIS; - int to_zone; - int to_instance; - float new_x; - float new_y; - float new_z; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - if (items < 2) - to_zone = -1; - else { + int to_zone = -1; + int to_instance = 0; + float new_x = 0.0f, new_y = 0.0f, new_z = 0.0f, new_heading = 0.0f; + VALIDATE_THIS_IS_CLIENT; + if (items > 1) to_zone = (int) SvIV(ST(1)); - } - - if (items < 3) - to_instance = 0; - else { + if (items > 2) to_instance = (int) SvIV(ST(2)); - } - - if (items < 4) - new_x = 0.0f; - else { + if (items > 3) new_x = (float) SvNV(ST(3)); - } - - if (items < 5) - new_y = 0.0f; - else { + if (items > 4) new_y = (float) SvNV(ST(4)); - } - - if (items < 6) - new_z = 0.0f; - else { + if (items > 5) new_z = (float) SvNV(ST(5)); - } + if (items > 6) + new_heading = (float) SvNV(ST(6)); - THIS->SetBindPoint(0, to_zone, to_instance, glm::vec3(new_x, new_y, new_z)); + THIS->SetBindPoint2(0, to_zone, to_instance, glm::vec4(new_x, new_y, new_z, new_heading)); } XSRETURN_EMPTY; } @@ -1047,21 +783,13 @@ XS(XS_Client_GetBindX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBindX) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::GetBindX(int index = 0)"); + Perl_croak(aTHX_ "Usage: Client::GetBindX(int index = 0)"); // @categories Account and Character { Client *THIS; int index = 0; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items == 1) index = 0; else if (items == 2) { @@ -1079,21 +807,13 @@ XS(XS_Client_GetBindY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBindY) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::GetBindY(int index = 0)"); + Perl_croak(aTHX_ "Usage: Client::GetBindY(int index = 0)"); // @categories Account and Character { Client *THIS; int index = 0; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items == 1) index = 0; else if (items == 2) { @@ -1111,21 +831,13 @@ XS(XS_Client_GetBindZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBindZ) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::GetBindZ(int index = 0)"); + Perl_croak(aTHX_ "Usage: Client::GetBindZ(int index = 0)"); // @categories Account and Character { Client *THIS; int index = 0; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items == 1) index = 0; else if (items == 2) { @@ -1143,21 +855,13 @@ XS(XS_Client_GetBindHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBindHeading) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::GetBindHeading(int index = 0)"); + Perl_croak(aTHX_ "Usage: Client::GetBindHeading(int index = 0)"); // @categories Account and Character { Client *THIS; int index = 0; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items == 1) index = 0; else if (items == 2) { @@ -1175,21 +879,13 @@ XS(XS_Client_GetBindZoneID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBindZoneID) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::GetBindZoneID(int index = 0)"); + Perl_croak(aTHX_ "Usage: Client::GetBindZoneID(int index = 0)"); // @categories Account and Character { Client *THIS; uint32 index = 0; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items == 1) index = 0; else if (items == 2) { @@ -1208,7 +904,7 @@ XS(XS_Client_MovePC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_MovePC) { dXSARGS; if (items != 6) - Perl_croak(aTHX_ "Usage: Client::MovePC(THIS, uint32 zone_id, float x, float y, float z, float heading)"); + Perl_croak(aTHX_ "Usage: Client::MovePC(THIS, uint32 zone_id, float x, float y, float z, float heading)"); // @categories Script Utility { Client *THIS; uint32 zoneID = (uint32) SvUV(ST(1)); @@ -1216,15 +912,7 @@ XS(XS_Client_MovePC) { float y = (float) SvNV(ST(3)); float z = (float) SvNV(ST(4)); float heading = (float) SvNV(ST(5)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (THIS->IsClient()) { THIS->MovePC(zoneID, x, y, z, heading); } else { @@ -1254,7 +942,7 @@ XS(XS_Client_MovePCInstance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_MovePCInstance) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Client::MovePCInstance(THIS, uint32 zone_id, uint32 instance_id, float x, float y, float z, float heading)"); + Perl_croak(aTHX_ "Usage: Client::MovePCInstance(THIS, uint32 zone_id, uint32 instance_id, float x, float y, float z, float heading)"); // @categories Adventures and Expeditions, Script Utility { Client *THIS; uint32 zoneID = (uint32) SvUV(ST(1)); @@ -1263,15 +951,7 @@ XS(XS_Client_MovePCInstance) { float y = (float) SvNV(ST(4)); float z = (float) SvNV(ST(5)); float heading = (float) SvNV(ST(6)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (THIS->IsClient()) { THIS->MovePC(zoneID, instanceID, x, y, z, heading); } else { @@ -1298,23 +978,219 @@ XS(XS_Client_MovePCInstance) { XSRETURN_EMPTY; } +XS(XS_Client_MoveZone); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_MoveZone) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::MoveZone(THIS, string zone_short_name)"); // @categories Script Utility + { + Client *THIS; + const char *zone_short_name = (const char *) SvPV_nolen(ST(1)); + VALIDATE_THIS_IS_CLIENT; + if (THIS->IsClient()) { + THIS->MoveZone(zone_short_name); + } else { + if (THIS->IsMerc()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZone) attempted to process a type Merc reference"); + } +#ifdef BOTS + else if (THIS->IsBot()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZone) attempted to process a type Bot reference"); + } +#endif + else if (THIS->IsNPC()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZone) attempted to process a type NPC reference"); + } + else { + LogDebug("[CLIENT] Perl(XS_Client_MoveZone) attempted to process an Unknown type reference"); + } + + Perl_croak(aTHX_ "THIS is not of type Client"); + } + + } + XSRETURN_EMPTY; +} + +XS(XS_Client_MoveZoneGroup); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_MoveZoneGroup) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::MoveZoneGroup(THIS, string zone_short_name)"); // @categories Script Utility, Group + { + Client *THIS; + const char *zone_short_name = (const char *) SvPV_nolen(ST(1)); + VALIDATE_THIS_IS_CLIENT; + if (THIS->IsClient()) { + THIS->MoveZoneGroup(zone_short_name); + } else { + if (THIS->IsMerc()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneGroup) attempted to process a type Merc reference"); + } +#ifdef BOTS + else if (THIS->IsBot()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneGroup) attempted to process a type Bot reference"); + } +#endif + else if (THIS->IsNPC()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneGroup) attempted to process a type NPC reference"); + } + else { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneGroup) attempted to process an Unknown type reference"); + } + + Perl_croak(aTHX_ "THIS is not of type Client"); + } + + } + XSRETURN_EMPTY; +} + +XS(XS_Client_MoveZoneRaid); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_MoveZoneRaid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::MoveZoneRaid(THIS, string zone_short_name)"); // @categories Script Utility, Raid + { + Client *THIS; + const char *zone_short_name = (const char *) SvPV_nolen(ST(1)); + VALIDATE_THIS_IS_CLIENT; + if (THIS->IsClient()) { + THIS->MoveZoneRaid(zone_short_name); + } else { + if (THIS->IsMerc()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneRaid) attempted to process a type Merc reference"); + } +#ifdef BOTS + else if (THIS->IsBot()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneRaid) attempted to process a type Bot reference"); + } +#endif + else if (THIS->IsNPC()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneRaid) attempted to process a type NPC reference"); + } + else { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneRaid) attempted to process an Unknown type reference"); + } + + Perl_croak(aTHX_ "THIS is not of type Client"); + } + + } + XSRETURN_EMPTY; +} + +XS(XS_Client_MoveZoneInstance); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_MoveZoneInstance) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::MoveZoneInstance(THIS, uint16 instance_id)"); // @categories Adventures and Expeditions, Script Utility + { + Client *THIS; + uint16 instance_id = (uint16) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + if (THIS->IsClient()) { + THIS->MoveZoneInstance(instance_id); + } else { + if (THIS->IsMerc()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstance) attempted to process a type Merc reference"); + } +#ifdef BOTS + else if (THIS->IsBot()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstance) attempted to process a type Bot reference"); + } +#endif + else if (THIS->IsNPC()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstance) attempted to process a type NPC reference"); + } + else { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstance) attempted to process an Unknown type reference"); + } + + Perl_croak(aTHX_ "THIS is not of type Client"); + } + + } + XSRETURN_EMPTY; +} + +XS(XS_Client_MoveZoneInstanceGroup); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_MoveZoneInstanceGroup) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::MoveZoneInstanceGroup(THIS, uint16 instance_id)"); // @categories Adventures and Expeditions, Script Utility, Group + { + Client *THIS; + uint16 instance_id = (uint16) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + if (THIS->IsClient()) { + THIS->MoveZoneInstanceGroup(instance_id); + } else { + if (THIS->IsMerc()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceGroup) attempted to process a type Merc reference"); + } +#ifdef BOTS + else if (THIS->IsBot()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceGroup) attempted to process a type Bot reference"); + } +#endif + else if (THIS->IsNPC()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceGroup) attempted to process a type NPC reference"); + } + else { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceGroup) attempted to process an Unknown type reference"); + } + + Perl_croak(aTHX_ "THIS is not of type Client"); + } + + } + XSRETURN_EMPTY; +} + +XS(XS_Client_MoveZoneInstanceRaid); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_MoveZoneInstanceRaid) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::MoveZoneInstanceRaid(THIS, uint16 instance_id)"); // @categories Adventures and Expeditions, Script Utility, Raid + { + Client *THIS; + uint16 instance_id = (uint16) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + if (THIS->IsClient()) { + THIS->MoveZoneInstanceRaid(instance_id); + } else { + if (THIS->IsMerc()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceRaid) attempted to process a type Merc reference"); + } +#ifdef BOTS + else if (THIS->IsBot()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceRaid) attempted to process a type Bot reference"); + } +#endif + else if (THIS->IsNPC()) { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceRaid) attempted to process a type NPC reference"); + } + else { + LogDebug("[CLIENT] Perl(XS_Client_MoveZoneInstanceRaid) attempted to process an Unknown type reference"); + } + + Perl_croak(aTHX_ "THIS is not of type Client"); + } + + } + XSRETURN_EMPTY; +} + XS(XS_Client_ChangeLastName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ChangeLastName) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::ChangeLastName(THIS, string last_name)"); + Perl_croak(aTHX_ "Usage: Client::ChangeLastName(THIS, string last_name)"); // @categories Account and Character { Client *THIS; char *in_lastname = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->ChangeLastName(in_lastname); } XSRETURN_EMPTY; @@ -1324,7 +1200,7 @@ XS(XS_Client_GetFactionLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetFactionLevel) { dXSARGS; if (items != 8) - Perl_croak(aTHX_ "Usage: Client::GetFactionLevel(THIS, uint32 character_id, uint32 npc_id, uint32 player_race_id, uint32 player_class_id, uint32 player_deity_id, uint32 player_faction_id, Mob*)"); + Perl_croak(aTHX_ "Usage: Client::GetFactionLevel(THIS, uint32 character_id, uint32 npc_id, uint32 player_race_id, uint32 player_class_id, uint32 player_deity_id, uint32 player_faction_id, Mob*)"); // @categories Faction { Client *THIS; FACTION_VALUE RETVAL; @@ -1336,15 +1212,7 @@ XS(XS_Client_GetFactionLevel) { uint32 p_deity = (uint32) SvUV(ST(5)); int32 pFaction = (int32) SvIV(ST(6)); Mob *tnpc; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (sv_derived_from(ST(7), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(7))); tnpc = INT2PTR(Mob *, tmp); @@ -1364,7 +1232,7 @@ XS(XS_Client_SetFactionLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetFactionLevel) { dXSARGS; if (items != 6) - Perl_croak(aTHX_ "Usage: Client::SetFactionLevel(THIS, uint32 character_id, uint32 npc_id, uint8 character_class, uint8 character_race, uint8 character_deity)"); + Perl_croak(aTHX_ "Usage: Client::SetFactionLevel(THIS, uint32 character_id, uint32 npc_id, uint8 character_class, uint8 character_race, uint8 character_deity)"); // @categories Faction { Client *THIS; uint32 char_id = (uint32) SvUV(ST(1)); @@ -1372,15 +1240,7 @@ XS(XS_Client_SetFactionLevel) { uint8 char_class = (uint8) SvUV(ST(3)); uint8 char_race = (uint8) SvUV(ST(4)); uint8 char_deity = (uint8) SvUV(ST(5)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetFactionLevel(char_id, npc_id, char_class, char_race, char_deity); } XSRETURN_EMPTY; @@ -1390,7 +1250,7 @@ XS(XS_Client_SetFactionLevel2); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetFactionLevel2) { dXSARGS; if (items < 7 || items > 8) - Perl_croak(aTHX_ "Usage: Client::SetFactionLevel2(THIS, uint32 character_id, int32 faction_id, uint8 character_class, uint8 character_race, uint8 character_deity, int32 value, uint8 temp)"); + Perl_croak(aTHX_ "Usage: Client::SetFactionLevel2(THIS, uint32 character_id, int32 faction_id, uint8 character_class, uint8 character_race, uint8 character_deity, int32 value, uint8 temp)"); // @categories Faction { Client *THIS; uint32 char_id = (uint32) SvUV(ST(1)); @@ -1400,15 +1260,7 @@ XS(XS_Client_SetFactionLevel2) { uint8 char_deity = (uint8) SvUV(ST(5)); int32 value = (int32) SvIV(ST(6)); uint8 temp; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items == 7) temp = 0; else { @@ -1424,20 +1276,12 @@ XS(XS_Client_GetRawItemAC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetRawItemAC) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetRawItemAC(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetRawItemAC(THIS)"); // @categories Inventory and Items { Client *THIS; int16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetRawItemAC(); XSprePUSH; PUSHi((IV) RETVAL); @@ -1449,20 +1293,12 @@ XS(XS_Client_AccountID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AccountID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::AccountID(THIS)"); + Perl_croak(aTHX_ "Usage: Client::AccountID(THIS)"); // @categories Account and Character { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->AccountID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1474,20 +1310,12 @@ XS(XS_Client_AccountName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AccountName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::AccountName(THIS)"); + Perl_croak(aTHX_ "Usage: Client::AccountName(THIS)"); // @categories Account and Character { Client *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->AccountName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -1500,20 +1328,12 @@ XS(XS_Client_Admin); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Admin) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Admin(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Admin(THIS)"); // @categories Account and Character { Client *THIS; int16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->Admin(); XSprePUSH; PUSHi((IV) RETVAL); @@ -1525,20 +1345,12 @@ XS(XS_Client_CharacterID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_CharacterID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::CharacterID(THIS)"); + Perl_croak(aTHX_ "Usage: Client::CharacterID(THIS)"); // @categories Account and Character { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->CharacterID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1550,19 +1362,11 @@ XS(XS_Client_UpdateAdmin); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UpdateAdmin) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::UpdateAdmin(THIS, bool from_db = true)"); + Perl_croak(aTHX_ "Usage: Client::UpdateAdmin(THIS, bool from_db = true)"); // @categories Account and Character { Client *THIS; bool iFromDB; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 2) iFromDB = true; else { @@ -1578,19 +1382,11 @@ XS(XS_Client_UpdateWho); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UpdateWho) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::UpdateWho(THIS, uint8 remove = 0)"); + Perl_croak(aTHX_ "Usage: Client::UpdateWho(THIS, uint8 remove = 0)"); // @categories Script Utility { Client *THIS; uint8 remove; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 2) remove = 0; else { @@ -1606,20 +1402,12 @@ XS(XS_Client_GuildRank); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GuildRank) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GuildRank(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GuildRank(THIS)"); // @categories Account and Character, Guild { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GuildRank(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1631,20 +1419,12 @@ XS(XS_Client_GuildID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GuildID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GuildID(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GuildID(THIS)"); // @categories Account and Character, Guild { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GuildID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1656,20 +1436,12 @@ XS(XS_Client_GetFace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetFace) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetFace(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetFace(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetFace(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1681,21 +1453,13 @@ XS(XS_Client_TakeMoneyFromPP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_TakeMoneyFromPP) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::TakeMoneyFromPP(THIS, uint32 copper, bool update_client = false)"); + Perl_croak(aTHX_ "Usage: Client::TakeMoneyFromPP(THIS, uint32 copper, bool update_client = false)"); // @categories Currency and Points { Client *THIS; bool RETVAL; bool updateclient = false; uint32 copper = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 2) updateclient = (bool) SvTRUE(ST(2)); @@ -1710,7 +1474,7 @@ XS(XS_Client_AddMoneyToPP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AddMoneyToPP) { dXSARGS; if (items != 6) - Perl_croak(aTHX_ "Usage: Client::AddMoneyToPP(THIS, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client)"); + Perl_croak(aTHX_ "Usage: Client::AddMoneyToPP(THIS, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, bool update_client)"); // @categories Currency and Points { Client *THIS; uint32 copper = (uint32) SvUV(ST(1)); @@ -1718,15 +1482,7 @@ XS(XS_Client_AddMoneyToPP) { uint32 gold = (uint32) SvUV(ST(3)); uint32 platinum = (uint32) SvUV(ST(4)); bool updateclient = (bool) SvTRUE(ST(5)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AddMoneyToPP(copper, silver, gold, platinum, updateclient); } XSRETURN_EMPTY; @@ -1736,19 +1492,11 @@ XS(XS_Client_TGB); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_TGB) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::TGB(THIS)"); + Perl_croak(aTHX_ "Usage: Client::TGB(THIS)"); // @categories Spells and Disciplines { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->TGB(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1760,20 +1508,12 @@ XS(XS_Client_GetSkillPoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetSkillPoints) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetSkillPoints(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetSkillPoints(THIS)"); // @categories Skills and Recipes { Client *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetSkillPoints(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1785,19 +1525,11 @@ XS(XS_Client_SetSkillPoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetSkillPoints) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetSkillPoints(THIS, inp)"); + Perl_croak(aTHX_ "Usage: Client::SetSkillPoints(THIS, inp)"); // @categories Skills and Recipes { Client *THIS; int inp = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetSkillPoints(inp); } XSRETURN_EMPTY; @@ -1807,20 +1539,12 @@ XS(XS_Client_IncreaseSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IncreaseSkill) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::IncreaseSkill(THIS, int skill_id, int value = 1)"); + Perl_croak(aTHX_ "Usage: Client::IncreaseSkill(THIS, int skill_id, int value = 1)"); // @categories Skills and Recipes { Client *THIS; int skill_id = (int) SvIV(ST(1)); int value; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) value = 1; else { @@ -1836,20 +1560,12 @@ XS(XS_Client_IncreaseLanguageSkill); /* prototype to pass -Wmissing-prototypes * XS(XS_Client_IncreaseLanguageSkill) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::IncreaseLanguageSkill(THIS, int skill_id, int value = 1)"); + Perl_croak(aTHX_ "Usage: Client::IncreaseLanguageSkill(THIS, int skill_id, int value = 1)"); // @categories Skills and Recipes { Client *THIS; int skill_id = (int) SvIV(ST(1)); int value; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) value = 1; else { @@ -1861,51 +1577,17 @@ XS(XS_Client_IncreaseLanguageSkill) { XSRETURN_EMPTY; } -XS(XS_Client_GetSkill); /* prototype to pass -Wmissing-prototypes */ -XS(XS_Client_GetSkill) { - dXSARGS; - if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetSkill(THIS, uint16 skill_id)"); - { - Client *THIS; - uint16 RETVAL; - dXSTARG; - EQEmu::skills::SkillType skill_id = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - RETVAL = THIS->GetSkill(skill_id); - XSprePUSH; - PUSHu((UV) RETVAL); - } - XSRETURN(1); -} - XS(XS_Client_GetRawSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetRawSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetRawSkill(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: Client::GetRawSkill(THIS, int skill_id)"); // @categories Skills and Recipes { Client *THIS; uint32 RETVAL; dXSTARG; - EQEmu::skills::SkillType skill_id = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::skills::SkillType skill_id = (EQ::skills::SkillType) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetRawSkill(skill_id); XSprePUSH; PUSHu((UV) RETVAL); @@ -1917,20 +1599,12 @@ XS(XS_Client_HasSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_HasSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::HasSkill(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: Client::HasSkill(THIS, int skill_id)"); // @categories Skills and Recipes { Client *THIS; bool RETVAL; - EQEmu::skills::SkillType skill_id = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::skills::SkillType skill_id = (EQ::skills::SkillType) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->HasSkill(skill_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1942,20 +1616,12 @@ XS(XS_Client_CanHaveSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_CanHaveSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::CanHaveSkill(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: Client::CanHaveSkill(THIS, int skill_id)"); // @categories Skills and Recipes { Client *THIS; bool RETVAL; - EQEmu::skills::SkillType skill_id = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::skills::SkillType skill_id = (EQ::skills::SkillType) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->CanHaveSkill(skill_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1967,20 +1633,12 @@ XS(XS_Client_SetSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetSkill) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetSkill(THIS, int skill_id, uint16 value)"); + Perl_croak(aTHX_ "Usage: Client::SetSkill(THIS, int skill_id, uint16 value)"); // @categories Skills and Recipes { Client *THIS; - EQEmu::skills::SkillType skill_num = (EQEmu::skills::SkillType) SvUV(ST(1)); + EQ::skills::SkillType skill_num = (EQ::skills::SkillType) SvUV(ST(1)); uint16 value = (uint16) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetSkill(skill_num, value); } XSRETURN_EMPTY; @@ -1990,20 +1648,12 @@ XS(XS_Client_AddSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AddSkill) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::AddSkill(THIS, int skill_id, uint16 value)"); + Perl_croak(aTHX_ "Usage: Client::AddSkill(THIS, int skill_id, uint16 value)"); // @categories Skills and Recipes { Client *THIS; - EQEmu::skills::SkillType skillid = (EQEmu::skills::SkillType) SvUV(ST(1)); + EQ::skills::SkillType skillid = (EQ::skills::SkillType) SvUV(ST(1)); uint16 value = (uint16) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AddSkill(skillid, value); } XSRETURN_EMPTY; @@ -2013,19 +1663,11 @@ XS(XS_Client_CheckSpecializeIncrease); /* prototype to pass -Wmissing-prototypes XS(XS_Client_CheckSpecializeIncrease) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::CheckSpecializeIncrease(THIS, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::CheckSpecializeIncrease(THIS, uint16 spell_id)"); // @categories Spells and Disciplines { Client *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->CheckSpecializeIncrease(spell_id); } XSRETURN_EMPTY; @@ -2035,21 +1677,13 @@ XS(XS_Client_CheckIncreaseSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_CheckIncreaseSkill) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::CheckIncreaseSkill(THIS, int skill_id, int chance_modifier = 0)"); + Perl_croak(aTHX_ "Usage: Client::CheckIncreaseSkill(THIS, int skill_id, int chance_modifier = 0)"); // @categories Skills and Recipes { Client *THIS; bool RETVAL; - EQEmu::skills::SkillType skillid = (EQEmu::skills::SkillType) SvUV(ST(1)); + EQ::skills::SkillType skillid = (EQ::skills::SkillType) SvUV(ST(1)); int chancemodi; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) chancemodi = 0; else { @@ -2067,20 +1701,12 @@ XS(XS_Client_SetLanguageSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetLanguageSkill) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetLanguageSkill(THIS, int language_id, int value)"); + Perl_croak(aTHX_ "Usage: Client::SetLanguageSkill(THIS, int language_id, int value)"); // @categories Account and Character, Skills and Recipes, Stats and Attributes { Client *THIS; int langid = (int) SvIV(ST(1)); int value = (int) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetLanguageSkill(langid, value); } XSRETURN_EMPTY; @@ -2091,23 +1717,15 @@ XS(XS_Client_MaxSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_MaxSkill) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Client::MaxSkill(THIS, uint16 skill_id, uint16 class_id, uint16 level)"); + Perl_croak(aTHX_ "Usage: Client::MaxSkill(THIS, uint16 skill_id, uint16 class_id, uint16 level)"); // @categories Skills and Recipes { Client *THIS; uint16 RETVAL; - EQEmu::skills::SkillType skillid = (EQEmu::skills::SkillType) SvUV(ST(1)); + EQ::skills::SkillType skillid = (EQ::skills::SkillType) SvUV(ST(1)); uint16 class_ = 0; uint16 level = 0; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 2) class_ = (uint16) SvUV(ST(2)); else @@ -2129,18 +1747,10 @@ XS(XS_Client_GMKill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GMKill) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GMKill(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GMKill(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->GMKill(); } XSRETURN_EMPTY; @@ -2150,19 +1760,11 @@ XS(XS_Client_IsMedding); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsMedding) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsMedding(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsMedding(THIS)"); // @categories Account and Character { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsMedding(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2174,20 +1776,12 @@ XS(XS_Client_GetDuelTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetDuelTarget) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetDuelTarget(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetDuelTarget(THIS)"); // @categories Account and Character, Script Utility { Client *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetDuelTarget(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2199,19 +1793,11 @@ XS(XS_Client_IsDueling); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsDueling) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsDueling(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsDueling(THIS)"); // @categories Account and Character { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsDueling(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2223,19 +1809,11 @@ XS(XS_Client_SetDuelTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetDuelTarget) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetDuelTarget(THIS, set_id)"); + Perl_croak(aTHX_ "Usage: Client::SetDuelTarget(THIS, set_id)"); // @categories Account and Character { Client *THIS; uint16 set_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetDuelTarget(set_id); } XSRETURN_EMPTY; @@ -2245,19 +1823,11 @@ XS(XS_Client_SetDueling); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetDueling) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetDueling(THIS, duel)"); + Perl_croak(aTHX_ "Usage: Client::SetDueling(THIS, duel)"); // @categories Account and Character, Script Utility { Client *THIS; bool duel = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetDueling(duel); } XSRETURN_EMPTY; @@ -2267,18 +1837,10 @@ XS(XS_Client_ResetAA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ResetAA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::ResetAA(THIS)"); + Perl_croak(aTHX_ "Usage: Client::ResetAA(THIS)"); // @categories Alternative Advancement { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->ResetAA(); } XSRETURN_EMPTY; @@ -2288,21 +1850,13 @@ XS(XS_Client_MemSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_MemSpell) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Client::MemSpell(THIS, uint16 spell_id, int slot, [bool update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::MemSpell(THIS, uint16 spell_id, int slot, [bool update_client = true])"); // @categories Spells and Disciplines { Client *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); int slot = (int) SvIV(ST(2)); bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 4) update_client = true; else { @@ -2318,20 +1872,12 @@ XS(XS_Client_UnmemSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UnmemSpell) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::UnmemSpell(THIS, int slot, [bool update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::UnmemSpell(THIS, int slot, [bool update_client = true])"); // @categories Spells and Disciplines { Client *THIS; int slot = (int) SvIV(ST(1)); bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) update_client = true; else { @@ -2347,19 +1893,11 @@ XS(XS_Client_UnmemSpellBySpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UnmemSpellBySpellID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::UnmemSpellBySpellID(THIS, int32 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::UnmemSpellBySpellID(THIS, int32 spell_id)"); // @categories Spells and Disciplines { Client *THIS; int32 spell_id = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->UnmemSpellBySpellID(spell_id); } XSRETURN_EMPTY; @@ -2369,19 +1907,11 @@ XS(XS_Client_UnmemSpellAll); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UnmemSpellAll) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::UnmemSpellAll(THIS, [bool update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::UnmemSpellAll(THIS, [bool update_client = true])"); // @categories Spells and Disciplines { Client *THIS; bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 2) update_client = true; else { @@ -2397,21 +1927,13 @@ XS(XS_Client_FindMemmedSpellBySlot); /* prototype to pass -Wmissing-prototypes * XS(XS_Client_FindMemmedSpellBySlot) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::FindMemmedSpellBySlot(THIS, int slot)"); + Perl_croak(aTHX_ "Usage: Client::FindMemmedSpellBySlot(THIS, int slot)"); // @categories Account and Character, Spells and Disciplines { Client *THIS; uint16 RETVAL; dXSTARG; int slot = SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->FindMemmedSpellBySlot(slot); XSprePUSH; PUSHu((UV) RETVAL); @@ -2423,23 +1945,15 @@ XS(XS_Client_MemmedCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_MemmedCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::MemmedCount(THIS)"); + Perl_croak(aTHX_ "Usage: Client::MemmedCount(THIS)"); // @categories Spells and Disciplines { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->MemmedCount(); XSprePUSH; - PUSHu((UV) RETVAL); + PUSHu((UV) RETVAL); } XSRETURN(1); } @@ -2448,21 +1962,13 @@ XS(XS_Client_ScribeSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ScribeSpell) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Client::ScribeSpell(THIS, uint16 spell_id, int slot, [bool update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::ScribeSpell(THIS, uint16 spell_id, int slot, [bool update_client = true])"); // @categories Spells and Disciplines { Client *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); int slot = (int) SvIV(ST(2)); bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 4) update_client = true; else { @@ -2478,20 +1984,12 @@ XS(XS_Client_UnscribeSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UnscribeSpell) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::UnscribeSpell(THIS, int slot, [bool update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::UnscribeSpell(THIS, int slot, [bool update_client = true])"); // @categories Spells and Disciplines { Client *THIS; int slot = (int) SvIV(ST(1)); bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) update_client = true; else { @@ -2511,15 +2009,7 @@ XS(XS_Client_UnscribeSpellAll) { { Client *THIS; bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 2) update_client = true; else { @@ -2535,19 +2025,11 @@ XS(XS_Client_TrainDiscBySpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_TrainDiscBySpellID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::TrainDiscBySpellID(THIS, int32 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::TrainDiscBySpellID(THIS, int32 spell_id)"); // @categories Spells and Disciplines { Client *THIS; int32 spell_id = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->TrainDiscBySpellID(spell_id); } XSRETURN_EMPTY; @@ -2557,21 +2039,13 @@ XS(XS_Client_GetDiscSlotBySpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetDiscSlotBySpellID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetDiscSlotBySpellID(THIS, int32 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::GetDiscSlotBySpellID(THIS, int32 spell_id)"); // @categories Spells and Disciplines { Client *THIS; int RETVAL; int32 spell_id = (int32) SvIV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetDiscSlotBySpellID(spell_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -2583,20 +2057,12 @@ XS(XS_Client_UntrainDisc); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UntrainDisc) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Client::UntrainDisc(THIS, int slot, [bool update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::UntrainDisc(THIS, int slot, [bool update_client = true])"); // @categories Spells and Disciplines { Client *THIS; int slot = (int) SvIV(ST(1)); bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) update_client = true; else { @@ -2612,19 +2078,11 @@ XS(XS_Client_UntrainDiscAll); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UntrainDiscAll) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::UntrainDiscAll(THIS, [update_client = true])"); + Perl_croak(aTHX_ "Usage: Client::UntrainDiscAll(THIS, [update_client = true])"); // @categories Spells and Disciplines { Client *THIS; bool update_client; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 2) update_client = true; else { @@ -2641,20 +2099,11 @@ XS(XS_Client_IsStanding) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsStanding(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsStanding(THIS)"); // @categories Account and Character { Client * THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(Client *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Client"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsStanding(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2666,19 +2115,11 @@ XS(XS_Client_IsSitting); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsSitting) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsSitting(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsSitting(THIS)"); // @categories Account and Character { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsSitting(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2691,20 +2132,11 @@ XS(XS_Client_IsCrouching) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsCrouching(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsCrouching(THIS)"); // @categories Account and Character { Client * THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(Client *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Client"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsCrouching(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2716,19 +2148,11 @@ XS(XS_Client_IsBecomeNPC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsBecomeNPC) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsBecomeNPC(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsBecomeNPC(THIS)"); // @categories Account and Character { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsBecomeNPC(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2740,20 +2164,12 @@ XS(XS_Client_GetBecomeNPCLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetBecomeNPCLevel) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetBecomeNPCLevel(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetBecomeNPCLevel(THIS)"); // @categories Experience and Level { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetBecomeNPCLevel(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2765,19 +2181,11 @@ XS(XS_Client_SetBecomeNPC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetBecomeNPC) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetBecomeNPC(THIS, flag)"); + Perl_croak(aTHX_ "Usage: Client::SetBecomeNPC(THIS, flag)"); // @categories Account and Character, Stats and Attributes { Client *THIS; bool flag = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetBecomeNPC(flag); } XSRETURN_EMPTY; @@ -2787,19 +2195,11 @@ XS(XS_Client_SetBecomeNPCLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetBecomeNPCLevel) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetBecomeNPCLevel(THIS, level)"); + Perl_croak(aTHX_ "Usage: Client::SetBecomeNPCLevel(THIS, level)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint8 level = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetBecomeNPCLevel(level); } XSRETURN_EMPTY; @@ -2809,19 +2209,11 @@ XS(XS_Client_SetFeigned); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetFeigned) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetFeigned(THIS, in_feigned)"); + Perl_croak(aTHX_ "Usage: Client::SetFeigned(THIS, in_feigned)"); // @categories Script Utility { Client *THIS; bool in_feigned = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetFeigned(in_feigned); } XSRETURN_EMPTY; @@ -2831,19 +2223,11 @@ XS(XS_Client_GetFeigned); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetFeigned) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetFeigned(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetFeigned(THIS)"); // @categories Script Utility { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetFeigned(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2855,19 +2239,11 @@ XS(XS_Client_AutoSplitEnabled); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AutoSplitEnabled) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::AutoSplitEnabled(THIS)"); + Perl_croak(aTHX_ "Usage: Client::AutoSplitEnabled(THIS)"); // @categories Currency and Points { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->AutoSplitEnabled(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2879,19 +2255,11 @@ XS(XS_Client_SetHorseId); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetHorseId) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetHorseId(THIS, horseid_in)"); + Perl_croak(aTHX_ "Usage: Client::SetHorseId(THIS, horseid_in)"); // @categories Script Utility { Client *THIS; uint16 horseid_in = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetHorseId(horseid_in); } XSRETURN_EMPTY; @@ -2901,20 +2269,12 @@ XS(XS_Client_GetHorseId); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetHorseId) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetHorseId(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetHorseId(THIS)"); // @categories Account and Character, Script Utility { Client *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetHorseId(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2926,22 +2286,14 @@ XS(XS_Client_NukeItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_NukeItem) { dXSARGS; if (items != 3 && items != 2) - Perl_croak(aTHX_ "Usage: Client::NukeItem(THIS, uint32 item_id, [uint8 slot_to_check])"); + Perl_croak(aTHX_ "Usage: Client::NukeItem(THIS, uint32 item_id, [uint8 slot_to_check])"); // @categories Inventory and Items { Client *THIS; uint32 RETVAL; dXSTARG; uint32 itemnum = (uint32) SvUV(ST(1)); uint8 where_to_check; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) { where_to_check = 0xFF; } @@ -2960,20 +2312,12 @@ XS(XS_Client_SetTint); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetTint) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetTint(THIS, int16 slot_id, uint32 color)"); + Perl_croak(aTHX_ "Usage: Client::SetTint(THIS, int16 slot_id, uint32 color)"); // @categories Inventory and Items { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); uint32 color = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetTint(slot_id, color); } XSRETURN_EMPTY; @@ -2983,20 +2327,12 @@ XS(XS_Client_SetMaterial); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetMaterial) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetMaterial(THIS, int16 slot_id, uint32 item_id)"); + Perl_croak(aTHX_ "Usage: Client::SetMaterial(THIS, int16 slot_id, uint32 item_id)"); // @categories Inventory and Items { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); uint32 item_id = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetMaterial(slot_id, item_id); } XSRETURN_EMPTY; @@ -3006,18 +2342,10 @@ XS(XS_Client_Undye); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Undye) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Undye(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Undye(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->Undye(); } XSRETURN_EMPTY; @@ -3027,21 +2355,13 @@ XS(XS_Client_GetItemIDAt); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetItemIDAt) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetItemIDAt(THIS, int16 slot_id)"); + Perl_croak(aTHX_ "Usage: Client::GetItemIDAt(THIS, int16 slot_id)"); // @categories Inventory and Items { Client *THIS; int32 RETVAL; dXSTARG; int16 slot_id = (int16) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetItemIDAt(slot_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -3053,22 +2373,14 @@ XS(XS_Client_GetAugmentIDAt); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAugmentIDAt) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::GetAugmentIDAt(THIS, int16 slot_id, int16 aug_slot)"); + Perl_croak(aTHX_ "Usage: Client::GetAugmentIDAt(THIS, int16 slot_id, int16 aug_slot)"); // @categories Inventory and Items { Client *THIS; int32 RETVAL; dXSTARG; int16 slot_id = (int16) SvIV(ST(1)); int16 augslot = (uint8) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAugmentIDAt(slot_id, augslot); XSprePUSH; PUSHi((IV) RETVAL); @@ -3080,21 +2392,13 @@ XS(XS_Client_DeleteItemInInventory); /* prototype to pass -Wmissing-prototypes * XS(XS_Client_DeleteItemInInventory) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Client::DeleteItemInInventory(THIS, int16 slot_id, [int8 quantity = 0], [bool client_update = false])"); + Perl_croak(aTHX_ "Usage: Client::DeleteItemInInventory(THIS, int16 slot_id, [int8 quantity = 0], [bool client_update = false])"); // @categories Inventory and Items { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); int8 quantity; bool client_update; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 3) quantity = 0; else { @@ -3116,7 +2420,7 @@ XS(XS_Client_SummonItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SummonItem) { dXSARGS; if (items < 2 || items > 10) - Perl_croak(aTHX_ "Usage: Client::SummonItem(THIS, uint32 item_id, [int16 charges = -1], [bool attune = false], [uint32 aug1 = 0], [uint32 aug2 = 0], [uint32 aug3 = 0], [uint32 aug4 = 0], [uint32 aug5 = 0], [uint16 slot_id = cursor])"); + Perl_croak(aTHX_ "Usage: Client::SummonItem(THIS, uint32 item_id, [int16 charges = -1], [bool attune = false], [uint32 aug1 = 0], [uint32 aug2 = 0], [uint32 aug3 = 0], [uint32 aug4 = 0], [uint32 aug5 = 0], [uint16 slot_id = cursor])"); // @categories Inventory and Items, Script Utility { Client *THIS; uint32 item_id = (uint32) SvUV(ST(1)); @@ -3127,16 +2431,8 @@ XS(XS_Client_SummonItem) { uint32 aug3 = 0; uint32 aug4 = 0; uint32 aug5 = 0; - uint16 slot_id = EQEmu::invslot::slotCursor; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + uint16 slot_id = EQ::invslot::slotCursor; + VALIDATE_THIS_IS_CLIENT; if (items > 2) { charges = (int16) SvIV(ST(2)); } @@ -3171,20 +2467,12 @@ XS(XS_Client_SetStats); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetStats) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetStats(THIS, uint8 type, uint16 increase_val)"); + Perl_croak(aTHX_ "Usage: Client::SetStats(THIS, uint8 type, uint16 increase_val)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint8 type = (uint8) SvUV(ST(1)); int16 increase_val = (int16) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetStats(type, increase_val); } XSRETURN_EMPTY; @@ -3194,20 +2482,12 @@ XS(XS_Client_IncStats); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IncStats) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::IncStats(THIS, uint8 type, uint16 increase_val)"); + Perl_croak(aTHX_ "Usage: Client::IncStats(THIS, uint8 type, uint16 increase_val)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint8 type = (uint8) SvUV(ST(1)); int16 increase_val = (int16) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->IncStats(type, increase_val); } XSRETURN_EMPTY; @@ -3217,19 +2497,11 @@ XS(XS_Client_DropItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_DropItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::DropItem(THIS, int16 slot_id)"); + Perl_croak(aTHX_ "Usage: Client::DropItem(THIS, int16 slot_id)"); // @categories Inventory and Items { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->DropItem(slot_id); } XSRETURN_EMPTY; @@ -3239,18 +2511,10 @@ XS(XS_Client_BreakInvis); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_BreakInvis) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::BreakInvis(THIS)"); + Perl_croak(aTHX_ "Usage: Client::BreakInvis(THIS)"); // @categories Spells and Disciplines, Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->BreakInvis(); } XSRETURN_EMPTY; @@ -3260,19 +2524,11 @@ XS(XS_Client_GetGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetGroup) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetGroup(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetGroup(THIS)"); // @categories Account and Character, Group { Client *THIS; Group *RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetGroup(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Group", (void *) RETVAL); @@ -3284,18 +2540,10 @@ XS(XS_Client_LeaveGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_LeaveGroup) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::LeaveGroup(THIS)"); + Perl_croak(aTHX_ "Usage: Client::LeaveGroup(THIS)"); // @categories Account and Character, Group { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->LeaveGroup(); } XSRETURN_EMPTY; @@ -3305,19 +2553,11 @@ XS(XS_Client_GetRaid); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetRaid) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetRaid(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetRaid(THIS)"); // @categories Account and Character, Raid { Client *THIS; Raid *RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetRaid(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Raid", (void *) RETVAL); @@ -3329,19 +2569,11 @@ XS(XS_Client_IsGrouped); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsGrouped) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsGrouped(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsGrouped(THIS)"); // @categories Account and Character, Group { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsGrouped(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3353,19 +2585,11 @@ XS(XS_Client_IsRaidGrouped); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsRaidGrouped) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::IsRaidGrouped(THIS)"); + Perl_croak(aTHX_ "Usage: Client::IsRaidGrouped(THIS)"); // @categories Account and Character, Group, Raid { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsRaidGrouped(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3377,19 +2601,11 @@ XS(XS_Client_Hungry); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Hungry) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Hungry(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Hungry(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->Hungry(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3401,19 +2617,11 @@ XS(XS_Client_Thirsty); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Thirsty) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Thirsty(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Thirsty(THIS)"); // @categories Script Utility { Client *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->Thirsty(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3425,21 +2633,13 @@ XS(XS_Client_GetInstrumentMod); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetInstrumentMod) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetInstrumentMod(THIS, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::GetInstrumentMod(THIS, uint16 spell_id)"); // @categories Spells and Disciplines { Client *THIS; uint16 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetInstrumentMod(spell_id); XSprePUSH; PUSHu((UV) RETVAL); @@ -3451,21 +2651,13 @@ XS(XS_Client_DecreaseByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_DecreaseByID) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::DecreaseByID(THIS, uint32 type, unit8 amount)"); + Perl_croak(aTHX_ "Usage: Client::DecreaseByID(THIS, uint32 type, unit8 amount)"); // @categories Script Utility { Client *THIS; bool RETVAL; uint32 type = (uint32) SvUV(ST(1)); uint8 amt = (uint8) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->DecreaseByID(type, amt); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3477,21 +2669,13 @@ XS(XS_Client_SlotConvert2); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SlotConvert2) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SlotConvert2(THIS, uint8 slot)"); + Perl_croak(aTHX_ "Usage: Client::SlotConvert2(THIS, uint8 slot)"); // @categories Inventory and Items { Client *THIS; uint8 RETVAL; dXSTARG; uint8 slot = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->SlotConvert2(slot); XSprePUSH; PUSHu((UV) RETVAL); @@ -3503,18 +2687,10 @@ XS(XS_Client_Escape); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Escape) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::Escape(THIS)"); + Perl_croak(aTHX_ "Usage: Client::Escape(THIS)"); // @categories Account and Character, Skills and Recipes { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->Escape(); } XSRETURN_EMPTY; @@ -3524,18 +2700,10 @@ XS(XS_Client_RemoveNoRent); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_RemoveNoRent) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::RemoveNoRent(THIS)"); + Perl_croak(aTHX_ "Usage: Client::RemoveNoRent(THIS)"); // @categories Inventory and Items { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->RemoveNoRent(); } XSRETURN_EMPTY; @@ -3545,18 +2713,10 @@ XS(XS_Client_GoFish); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GoFish) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GoFish(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GoFish(THIS)"); // @categories Skills and Recipes { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->GoFish(); } XSRETURN_EMPTY; @@ -3566,18 +2726,10 @@ XS(XS_Client_ForageItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ForageItem) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::ForageItem(THIS)"); + Perl_croak(aTHX_ "Usage: Client::ForageItem(THIS)"); // @categories Skills and Recipes { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->ForageItem(); } XSRETURN_EMPTY; @@ -3587,22 +2739,14 @@ XS(XS_Client_CalcPriceMod); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_CalcPriceMod) { dXSARGS; if (items < 1 || items > 3) - Perl_croak(aTHX_ "Usage: Client::CalcPriceMod(THIS, Mob*, [bool reverse = false])"); + Perl_croak(aTHX_ "Usage: Client::CalcPriceMod(THIS, Mob*, [bool reverse = false])"); // @categories Currency and Points { Client *THIS; float RETVAL; dXSTARG; Mob *other; bool reverse; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items < 2) other = 0; else { @@ -3632,18 +2776,10 @@ XS(XS_Client_ResetTrade); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ResetTrade) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::ResetTrade(THIS)"); + Perl_croak(aTHX_ "Usage: Client::ResetTrade(THIS)"); // @categories Script Utility { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->ResetTrade(); } XSRETURN_EMPTY; @@ -3653,21 +2789,13 @@ XS(XS_Client_UseDiscipline); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UseDiscipline) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::UseDiscipline(THIS, int32 spell_id, int32 target)"); + Perl_croak(aTHX_ "Usage: Client::UseDiscipline(THIS, int32 spell_id, int32 target)"); // @categories Spells and Disciplines { Client *THIS; bool RETVAL; uint32 spell_id = (uint32) SvUV(ST(1)); uint32 target = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->UseDiscipline(spell_id, target); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3675,25 +2803,49 @@ XS(XS_Client_UseDiscipline) { XSRETURN(1); } +XS(XS_Client_GetDisciplineTimer); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_GetDisciplineTimer) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::GetDisciplineTimer(THIS, uint32 timer_id)"); // @categories Spells and Disciplines + { + Client *THIS; + uint32 RETVAL; + dXSTARG; + uint32 timer_id = (uint32) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + RETVAL = THIS->GetDisciplineTimer(timer_id); + XSprePUSH; + PUSHu((UV) RETVAL); + } + XSRETURN(1); +} + +XS(XS_Client_ResetDisciplineTimer); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_ResetDisciplineTimer) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::ResetDisciplineTimer(THIS, uint32 timer_id)"); // @categories Spells and Disciplines + { + Client *THIS; + uint32 timer_id = (uint32) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + THIS->ResetDisciplineTimer(timer_id); + } + XSRETURN_EMPTY; +} + XS(XS_Client_GetCharacterFactionLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetCharacterFactionLevel) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetCharacterFactionLevel(THIS, int32 faction_id)"); + Perl_croak(aTHX_ "Usage: Client::GetCharacterFactionLevel(THIS, int32 faction_id)"); // @categories Faction { Client *THIS; int32 RETVAL; dXSTARG; int32 faction_id = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetCharacterFactionLevel(faction_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -3705,19 +2857,11 @@ XS(XS_Client_SetZoneFlag); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetZoneFlag) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetZoneFlag(THIS, uint32 zone_id)"); + Perl_croak(aTHX_ "Usage: Client::SetZoneFlag(THIS, uint32 zone_id)"); // @categories Account and Character, Zones { Client *THIS; uint32 zone_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetZoneFlag(zone_id); } XSRETURN_EMPTY; @@ -3727,19 +2871,11 @@ XS(XS_Client_ClearZoneFlag); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ClearZoneFlag) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::ClearZoneFlag(THIS, uint32 zone_id)"); + Perl_croak(aTHX_ "Usage: Client::ClearZoneFlag(THIS, uint32 zone_id)"); // @categories Script Utility { Client *THIS; uint32 zone_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->ClearZoneFlag(zone_id); } XSRETURN_EMPTY; @@ -3749,20 +2885,12 @@ XS(XS_Client_HasZoneFlag); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_HasZoneFlag) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::HasZoneFlag(THIS, uint32 zone_id)"); + Perl_croak(aTHX_ "Usage: Client::HasZoneFlag(THIS, uint32 zone_id)"); // @categories Account and Character { Client *THIS; bool RETVAL; uint32 zone_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->HasZoneFlag(zone_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3774,19 +2902,11 @@ XS(XS_Client_SendZoneFlagInfo); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SendZoneFlagInfo) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SendZoneFlagInfo(THIS, Client* to)"); + Perl_croak(aTHX_ "Usage: Client::SendZoneFlagInfo(THIS, Client* to)"); // @categories Account and Character, Zones { Client *THIS; Client *to; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); to = INT2PTR(Client *, tmp); @@ -3804,18 +2924,10 @@ XS(XS_Client_LoadZoneFlags); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_LoadZoneFlags) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::LoadZoneFlags(THIS)"); + Perl_croak(aTHX_ "Usage: Client::LoadZoneFlags(THIS)"); // @categories Zones { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->LoadZoneFlags(); } XSRETURN_EMPTY; @@ -3825,20 +2937,12 @@ XS(XS_Client_SetAATitle); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetAATitle) { dXSARGS; if ((items < 2) || (items > 3)) - Perl_croak(aTHX_ "Usage: Client::SetAATitle(THIS, string text, [bool save = false])"); + Perl_croak(aTHX_ "Usage: Client::SetAATitle(THIS, string text, [bool save = false])"); // @categories Alternative Advancement { Client *THIS; char *txt = (char *) SvPV_nolen(ST(1)); bool SaveTitle = false; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (strlen(txt) > 31) Perl_croak(aTHX_ "Title must be 31 characters or less"); @@ -3857,20 +2961,12 @@ XS(XS_Client_GetClientVersion); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetClientVersion) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetClientVersion(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetClientVersion(THIS)"); // @categories Script Utility { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = static_cast(THIS->ClientVersion()); XSprePUSH; PUSHu((UV) RETVAL); @@ -3882,20 +2978,12 @@ XS(XS_Client_GetClientVersionBit); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetClientVersionBit) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetClientVersionBit(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetClientVersionBit(THIS)"); // @categories Script Utility { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->ClientVersionBit(); XSprePUSH; PUSHu((UV) RETVAL); @@ -3907,20 +2995,12 @@ XS(XS_Client_SetTitleSuffix); XS(XS_Client_SetTitleSuffix) { dXSARGS; if ((items < 2) || (items > 3)) - Perl_croak(aTHX_ "Usage: Client::SetTitleSuffix(THIS, string text, [bool save = false])"); + Perl_croak(aTHX_ "Usage: Client::SetTitleSuffix(THIS, string text, [bool save = false])"); // @categories Account and Character { Client *THIS; char *txt = (char *) SvPV_nolen(ST(1)); bool SaveSuffix = false; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (strlen(txt) > 31) Perl_croak(aTHX_ "Title must be 31 characters or less"); @@ -3939,19 +3019,11 @@ XS(XS_Client_SetAAPoints); XS(XS_Client_SetAAPoints) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetAAPoints(THIS, uint32 points)"); + Perl_croak(aTHX_ "Usage: Client::SetAAPoints(THIS, uint32 points)"); // @categories Alternative Advancement { Client *THIS; uint32 points = SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetAAPoints(points); } XSRETURN_EMPTY; @@ -3961,20 +3033,12 @@ XS(XS_Client_GetAAPoints); XS(XS_Client_GetAAPoints) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetAAPoints(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetAAPoints(THIS)"); // @categories Alternative Advancement, Experience and Level dXSTARG; { Client *THIS; uint32 RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAAPoints(); XSprePUSH; PUSHu((UV) RETVAL); @@ -3986,20 +3050,12 @@ XS(XS_Client_GetSpentAA); XS(XS_Client_GetSpentAA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetSpentAA(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetSpentAA(THIS)"); // @categories Alternative Advancement dXSTARG; { Client *THIS; uint32 RETVAL; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetSpentAA(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4011,19 +3067,11 @@ XS(XS_Client_AddAAPoints); XS(XS_Client_AddAAPoints) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::AddAAPoints(THIS, uint32 points)"); + Perl_croak(aTHX_ "Usage: Client::AddAAPoints(THIS, uint32 points)"); // @categories Alternative Advancement { Client *THIS; uint32 points = SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AddAAPoints(points); } XSRETURN_EMPTY; @@ -4033,18 +3081,10 @@ XS(XS_Client_RefundAA); XS(XS_Client_RefundAA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::RefundAA(THIS)"); + Perl_croak(aTHX_ "Usage: Client::RefundAA(THIS)"); // @categories Alternative Advancement { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->RefundAA(); } XSRETURN_EMPTY; @@ -4054,21 +3094,13 @@ XS(XS_Client_GetModCharacterFactionLevel); /* prototype to pass -Wmissing-protot XS(XS_Client_GetModCharacterFactionLevel) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetModCharacterFactionLevel(THIS, int32 faction_id)"); + Perl_croak(aTHX_ "Usage: Client::GetModCharacterFactionLevel(THIS, int32 faction_id)"); // @categories Faction { Client *THIS; int32 RETVAL; dXSTARG; int32 faction_id = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetModCharacterFactionLevel(faction_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -4080,20 +3112,12 @@ XS(XS_Client_GetLDoNWins); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetLDoNWins) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetLDoNWins(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetLDoNWins(THIS)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetLDoNWins(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4105,20 +3129,12 @@ XS(XS_Client_GetLDoNLosses); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetLDoNLosses) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetLDoNLosses(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetLDoNLosses(THIS)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetLDoNLosses(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4130,21 +3146,13 @@ XS(XS_Client_GetLDoNWinsTheme); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetLDoNWinsTheme) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetLDoNWinsTheme(THIS, int32 theme)"); + Perl_croak(aTHX_ "Usage: Client::GetLDoNWinsTheme(THIS, int32 theme)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; int32 theme_out = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetLDoNWinsTheme(theme_out); XSprePUSH; PUSHu((UV) RETVAL); @@ -4156,21 +3164,13 @@ XS(XS_Client_GetLDoNLossesTheme); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetLDoNLossesTheme) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetLDoNLossesTheme(THIS, int32 theme)"); + Perl_croak(aTHX_ "Usage: Client::GetLDoNLossesTheme(THIS, int32 theme)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; int32 theme_out = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetLDoNLossesTheme(theme_out); XSprePUSH; PUSHu((UV) RETVAL); @@ -4182,20 +3182,12 @@ XS(XS_Client_GetItemAt); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetItemAt) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetItemAt(THIS, uint32 slot)"); + Perl_croak(aTHX_ "Usage: Client::GetItemAt(THIS, uint32 slot)"); // @categories Inventory and Items { Client *THIS; - EQEmu::ItemInstance *RETVAL; + EQ::ItemInstance *RETVAL; uint32 slot = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetInv().GetItem(slot); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "QuestItem", (void *) RETVAL); @@ -4207,22 +3199,14 @@ XS(XS_Client_GetAugmentAt); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAugmentAt) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::GetAugmentAt(THIS, uint32 slot, uint32 aug_slot)"); + Perl_croak(aTHX_ "Usage: Client::GetAugmentAt(THIS, uint32 slot, uint32 aug_slot)"); // @categories Inventory and Items { Client *THIS; - EQEmu::ItemInstance *RETVAL; + EQ::ItemInstance *RETVAL; uint32 slot = (int32) SvIV(ST(1)); uint32 aug_slot = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - EQEmu::ItemInstance *inst = THIS->GetInv().GetItem(slot); + VALIDATE_THIS_IS_CLIENT; + EQ::ItemInstance *inst = THIS->GetInv().GetItem(slot); if (inst) { RETVAL = inst->GetAugment(aug_slot); } else { @@ -4239,20 +3223,12 @@ XS(XS_Client_GetStartZone); XS(XS_Client_GetStartZone) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetStartZone(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetStartZone(THIS)"); // @categories Account and Character { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetStartZone(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4263,31 +3239,22 @@ XS(XS_Client_GetStartZone) { XS(XS_Client_SetStartZone); XS(XS_Client_SetStartZone) { dXSARGS; - if (items != 2 && items != 5) - Perl_croak(aTHX_ - "Usage: Client::SetStartZone(THIS, uint32 zone_id, [float x = 0], [float y = 0], [float z = 0])"); + if (items != 2 && items != 5 && items != 6) + Perl_croak(aTHX_ "Usage: Client::SetStartZone(THIS, uint32 zone_id, [float x = 0, float y = 0, float z = 0, [float heading = 0]])"); { Client *THIS; uint32 zoneid = (uint32) SvUV(ST(1)); - float x = 0; - float y = 0; - float z = 0; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + float x = 0.0f, y = 0.0f, z = 0.0f, heading = 0.0f; + VALIDATE_THIS_IS_CLIENT; if (items == 5) { - x = SvNV(ST(2)); - y = SvNV(ST(3)); - z = SvNV(ST(4)); + x = (float) SvNV(ST(2)); + y = (float) SvNV(ST(3)); + z = (float) SvNV(ST(4)); } + if (items == 6) + heading = (float) SvNV(ST(5)); - THIS->SetStartZone(zoneid, x, y, z); + THIS->SetStartZone(zoneid, x, y, z, heading); } XSRETURN_EMPTY; } @@ -4296,19 +3263,11 @@ XS(XS_Client_KeyRingAdd); XS(XS_Client_KeyRingAdd) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::KeyRingAdd(THIS, uint32 item_id)"); + Perl_croak(aTHX_ "Usage: Client::KeyRingAdd(THIS, uint32 item_id)"); // @categories Account and Character, Inventory and Items { Client *THIS; uint32 item_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->KeyRingAdd(item_id);; } XSRETURN_EMPTY; @@ -4318,20 +3277,12 @@ XS(XS_Client_KeyRingCheck); XS(XS_Client_KeyRingCheck) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::KeyRingCheck(THIS, uint32 item_id)"); + Perl_croak(aTHX_ "Usage: Client::KeyRingCheck(THIS, uint32 item_id)"); // @categories Account and Character, Inventory and Items { Client *THIS; bool RETVAL; uint32 item_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->KeyRingCheck(item_id);; ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4343,19 +3294,11 @@ XS(XS_Client_AddPVPPoints); XS(XS_Client_AddPVPPoints) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::AddPVPPoints(THIS, uint32 points)"); + Perl_croak(aTHX_ "Usage: Client::AddPVPPoints(THIS, uint32 points)"); // @categories Currency and Points { Client *THIS; uint32 Points = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AddPVPPoints(Points); } XSRETURN_EMPTY; @@ -4365,43 +3308,55 @@ XS(XS_Client_AddCrystals); XS(XS_Client_AddCrystals) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::AddCrystals(THIS, uint32 radiant_count, uint32 ebon_count)"); + Perl_croak(aTHX_ "Usage: Client::AddCrystals(THIS, uint32 radiant_count, uint32 ebon_count)"); // @categories Currency and Points { Client *THIS; uint32 Radiant = (uint32) SvUV(ST(1)); uint32 Ebon = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AddCrystals(Radiant, Ebon); } XSRETURN_EMPTY; } +XS(XS_Client_SetEbonCrystals); +XS(XS_Client_SetEbonCrystals) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::SetEbonCrystals(THIS, uint32 value)"); + { + Client *THIS; + uint32 value = (uint32) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + THIS->SetEbonCrystals(value); + } + XSRETURN_EMPTY; +} + +XS(XS_Client_SetRadiantCrystals); +XS(XS_Client_SetRadiantCrystals) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::SetRadiantCrystals(THIS, uint32 value)"); + { + Client *THIS; + uint32 value = (uint32) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + THIS->SetRadiantCrystals(value); + } + XSRETURN_EMPTY; +} + XS(XS_Client_GetPVPPoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetPVPPoints) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetPVPPoints(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetPVPPoints(THIS)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetPVPPoints(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4413,20 +3368,12 @@ XS(XS_Client_GetRadiantCrystals); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetRadiantCrystals) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetRadiantCrystals(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetRadiantCrystals(THIS)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetRadiantCrystals(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4438,20 +3385,12 @@ XS(XS_Client_GetEbonCrystals); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetEbonCrystals) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetEbonCrystals(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetEbonCrystals(THIS)"); // @categories Currency and Points { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetEbonCrystals(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4463,20 +3402,12 @@ XS(XS_Client_ReadBook); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ReadBook) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::ReadBook(THIS, char* book_test, uint8 type)"); + Perl_croak(aTHX_ "Usage: Client::ReadBook(THIS, char* book_test, uint8 type)"); // @categories Script Utility { Client *THIS; char *in_txt = (char *) SvPV_nolen(ST(1)); uint8 type = (uint8) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->QuestReadBook(in_txt, type); } XSRETURN_EMPTY; @@ -4486,20 +3417,12 @@ XS(XS_Client_UpdateGroupAAs); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UpdateGroupAAs) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::UpdateGroupAAs(THIS, int32 points, uint32 type)"); + Perl_croak(aTHX_ "Usage: Client::UpdateGroupAAs(THIS, int32 points, uint32 type)"); // @categories Alternative Advancement, Group { Client *THIS; int32 points = (int32) SvIV(ST(1)); uint32 type = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->UpdateGroupAAs(points, type); } XSRETURN(1); @@ -4509,20 +3432,12 @@ XS(XS_Client_GetGroupPoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetGroupPoints) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetGroupPoints(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetGroupPoints(THIS)"); // @categories Account and Character, Group { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetGroupPoints(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4534,20 +3449,12 @@ XS(XS_Client_GetRaidPoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetRaidPoints) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetRaidPoints(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetRaidPoints(THIS)"); // @categories Account and Character, Raid { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetRaidPoints(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4559,19 +3466,11 @@ XS(XS_Client_LearnRecipe); XS(XS_Client_LearnRecipe) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::LearnRecipe(THIS, uint32 recipe_id)"); + Perl_croak(aTHX_ "Usage: Client::LearnRecipe(THIS, uint32 recipe_id)"); // @categories Skills and Recipes { Client *THIS; uint32 recipe_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->LearnRecipe(recipe_id);; } XSRETURN_EMPTY; @@ -4581,20 +3480,12 @@ XS(XS_Client_GetEndurance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetEndurance) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetEndurance(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetEndurance(THIS)"); // @categories Stats and Attributes { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetEndurance(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4606,20 +3497,12 @@ XS(XS_Client_GetMaxEndurance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetMaxEndurance) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetMaxEndurance(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetMaxEndurance(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetMaxEndurance(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4631,20 +3514,12 @@ XS(XS_Client_GetEnduranceRatio); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetEnduranceRatio) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetEnduranceRatio(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetEnduranceRatio(THIS)"); // @categories Stats and Attributes { Client *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetEndurancePercent(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4656,19 +3531,11 @@ XS(XS_Client_SetEndurance); XS(XS_Client_SetEndurance) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetEndurance(THIS, Endurance)"); + Perl_croak(aTHX_ "Usage: Client::SetEndurance(THIS, Endurance)"); // @categories Account and Character, Stats and Attributes { Client *THIS; int32 Endurance = (int32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetEndurance(Endurance); } XSRETURN_EMPTY; @@ -4678,20 +3545,12 @@ XS(XS_Client_SendOPTranslocateConfirm); XS(XS_Client_SendOPTranslocateConfirm) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SendOPTranslocateConfirm(THIS, Mob* caster, int32 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::SendOPTranslocateConfirm(THIS, Mob* caster, int32 spell_id)"); // @categories Script Utility { Client *THIS; Mob *caster = nullptr; int32 spell_id = (int32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); caster = INT2PTR(Mob *, tmp); @@ -4709,21 +3568,13 @@ XS(XS_Client_NPCSpawn); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_NPCSpawn) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Client::NPCSpawn(THIS, NPC*, string option, uint32 respawn_time=1200)"); + Perl_croak(aTHX_ "Usage: Client::NPCSpawn(THIS, NPC*, string option, uint32 respawn_time=1200)"); // @categories Script Utility, Spawns { Client *THIS; NPC *target_npc = nullptr; Const_char *option = (Const_char *) SvPV_nolen(ST(2)); uint32 respawntime = 1200; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (sv_derived_from(ST(1), "NPC")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target_npc = INT2PTR(NPC *, tmp); @@ -4744,20 +3595,12 @@ XS(XS_Client_GetIP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetIP) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetIP(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetIP(THIS)"); // @categories Script Utility { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetIP(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4769,24 +3612,16 @@ XS(XS_Client_AddLevelBasedExp); XS(XS_Client_AddLevelBasedExp) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Client::AddLevelBasedExp(THIS, uint8 exp_percentage, uint8 max_level = 0, bool ignore_mods = false)"); + Perl_croak(aTHX_ "Usage: Client::AddLevelBasedExp(THIS, uint8 exp_percentage, uint8 max_level = 0, bool ignore_mods = false)"); // @categories Experience and Level { Client *THIS; uint8 exp_percentage = (uint8) SvUV(ST(1)); uint8 max_level = 0; bool ignore_mods = false; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 2) max_level = (uint8) SvUV(ST(2)); - + if (items > 3) ignore_mods = (bool) SvTRUE(ST(3)); @@ -4799,19 +3634,11 @@ XS(XS_Client_IncrementAA); XS(XS_Client_IncrementAA) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::IncrementAA(THIS, uint32 aa_skill_id)"); + Perl_croak(aTHX_ "Usage: Client::IncrementAA(THIS, uint32 aa_skill_id)"); // @categories Alternative Advancement { Client *THIS; uint32 aaskillid = SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->IncrementAlternateAdvancementRank(aaskillid); } XSRETURN_EMPTY; @@ -4821,22 +3648,14 @@ XS(XS_Client_GrantAlternateAdvancementAbility); /* prototype to pass -Wmissing-p XS(XS_Client_GrantAlternateAdvancementAbility) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Client::GrantAlternateAdvancementAbility(THIS, int aa_id, int points, [bool ignore_cost = false])"); + Perl_croak(aTHX_ "Usage: Client::GrantAlternateAdvancementAbility(THIS, int aa_id, int points, [bool ignore_cost = false])"); // @categories Alternative Advancement { Client *THIS; bool RETVAL; int aa_id = (int) SvIV(ST(1)); int points = (int) SvIV(ST(2)); bool ignore_cost = false; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 3) { ignore_cost = (bool) SvTRUE(ST(3)); } @@ -4852,21 +3671,13 @@ XS(XS_Client_GetAALevel); XS(XS_Client_GetAALevel) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetAALevel(THIS, uint32 aa_skill_id)"); + Perl_croak(aTHX_ "Usage: Client::GetAALevel(THIS, uint32 aa_skill_id)"); // @categories Alternative Advancement, Experience and Level { Client *THIS; uint32 RETVAL; dXSTARG; uint32 aaskillid = SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAA(aaskillid); XSprePUSH; PUSHu((UV) RETVAL); @@ -4878,21 +3689,13 @@ XS(XS_Client_MarkCompassLoc); XS(XS_Client_MarkCompassLoc) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Client::MarkCompassLoc(THIS, float x, float y, float z)"); + Perl_croak(aTHX_ "Usage: Client::MarkCompassLoc(THIS, float x, float y, float z)"); // @categories Adventures and Expeditions { Client *THIS; float x = SvNV(ST(1)); float y = SvNV(ST(2)); float z = SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->MarkSingleCompassLoc(x, y, z); } XSRETURN_EMPTY; @@ -4902,18 +3705,10 @@ XS(XS_Client_ClearCompassMark); XS(XS_Client_ClearCompassMark) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::ClearCompassMark(THIS)"); + Perl_croak(aTHX_ "Usage: Client::ClearCompassMark(THIS)"); // @categories Adventures and Expeditions { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->MarkSingleCompassLoc(0, 0, 0, 0); } XSRETURN_EMPTY; @@ -4923,21 +3718,13 @@ XS(XS_Client_GetFreeSpellBookSlot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetFreeSpellBookSlot) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::GetFreeSpellBookSlot(THIS, uint32 start_slot = 0)"); + Perl_croak(aTHX_ "Usage: Client::GetFreeSpellBookSlot(THIS, uint32 start_slot = 0)"); // @categories Spells and Disciplines { Client *THIS; int RETVAL; uint32 start_slot = 0; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 1) start_slot = SvUV(ST(1)); @@ -4952,21 +3739,13 @@ XS(XS_Client_GetSpellBookSlotBySpellID); /* prototype to pass -Wmissing-prototyp XS(XS_Client_GetSpellBookSlotBySpellID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetSpellBookSlotBySpellID(THIS, uint32 spell_id)"); + Perl_croak(aTHX_ "Usage: Client::GetSpellBookSlotBySpellID(THIS, uint32 spell_id)"); // @categories Spells and Disciplines { Client *THIS; int RETVAL; uint32 spell_id = SvUV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->FindSpellBookSlotBySpellID(spell_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -4974,11 +3753,29 @@ XS(XS_Client_GetSpellBookSlotBySpellID) { XSRETURN(1); } +XS(XS_Client_GetSpellIDByBookSlot); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_GetSpellIDByBookSlot) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::GetSpellIDByBookSlot(THIS, int slot_id)"); + { + Client* THIS; + int RETVAL; + int slot_id = SvUV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + RETVAL = THIS->GetSpellIDByBookSlot(slot_id); + XSprePUSH; + PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + XS(XS_Client_UpdateTaskActivity); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UpdateTaskActivity) { dXSARGS; if (items < 4) - Perl_croak(aTHX_ "Usage: Client::UpdateTaskActivity(THIS, int task_id, int activity_id, int count, [bool ignore_quest_update = false])"); + Perl_croak(aTHX_ "Usage: Client::UpdateTaskActivity(THIS, int task_id, int activity_id, int count, [bool ignore_quest_update = false])"); // @categories Tasks and Activities { bool ignore_quest_update = false; @@ -4991,15 +3788,7 @@ XS(XS_Client_UpdateTaskActivity) { if (items == 5) { ignore_quest_update = (bool) SvTRUE(ST(4)); } - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->UpdateTaskActivity(TaskID, ActivityID, Count, ignore_quest_update); } XSRETURN_EMPTY; @@ -5009,22 +3798,14 @@ XS(XS_Client_GetTaskActivityDoneCount); /* prototype to pass -Wmissing-prototype XS(XS_Client_GetTaskActivityDoneCount) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::GetTaskActivityDoneCount(THIS, int task_id, int activity_id)"); + Perl_croak(aTHX_ "Usage: Client::GetTaskActivityDoneCount(THIS, int task_id, int activity_id)"); // @categories Tasks and Activities { Client *THIS; int RETVAL; int TaskID = (int) SvIV(ST(1)); int ActivityID = (int) SvIV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetTaskActivityDoneCountFromTaskID(TaskID, ActivityID); XSprePUSH; @@ -5037,7 +3818,7 @@ XS(XS_Client_AssignTask); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AssignTask) { dXSARGS; if (items != 3 && items != 4) - Perl_croak(aTHX_ "Usage: Client::AssignTask(THIS, int task_id, int npc_id, [bool enforce_level_requirement = false])"); + Perl_croak(aTHX_ "Usage: Client::AssignTask(THIS, int task_id, int npc_id, [bool enforce_level_requirement = false])"); // @categories Tasks and Activities { Client *THIS; int TaskID = (int) SvIV(ST(1)); @@ -5048,14 +3829,7 @@ XS(XS_Client_AssignTask) { enforce_level_requirement = true; } } - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AssignTask(TaskID, NPCID, enforce_level_requirement); } XSRETURN_EMPTY; @@ -5065,19 +3839,11 @@ XS(XS_Client_FailTask); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_FailTask) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::FailTask(THIS, int task_id)"); + Perl_croak(aTHX_ "Usage: Client::FailTask(THIS, int task_id)"); // @categories Tasks and Activities { Client *THIS; int TaskID = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->FailTask(TaskID); } XSRETURN_EMPTY; @@ -5087,20 +3853,12 @@ XS(XS_Client_IsTaskCompleted); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsTaskCompleted) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::IsTaskCompleted(THIS, int task_id)"); + Perl_croak(aTHX_ "Usage: Client::IsTaskCompleted(THIS, int task_id)"); // @categories Tasks and Activities { Client *THIS; int RETVAL; int TaskID = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsTaskCompleted(TaskID); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5112,20 +3870,12 @@ XS(XS_Client_IsTaskActive); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsTaskActive) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::IsTaskActive(THIS, int task_id)"); + Perl_croak(aTHX_ "Usage: Client::IsTaskActive(THIS, int task_id)"); // @categories Tasks and Activities { Client *THIS; bool RETVAL; int TaskID = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsTaskActive(TaskID); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5137,21 +3887,13 @@ XS(XS_Client_IsTaskActivityActive); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_IsTaskActivityActive) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::IsTaskActivityActive(THIS, int task_id, int activity_id)"); + Perl_croak(aTHX_ "Usage: Client::IsTaskActivityActive(THIS, int task_id, int activity_id)"); // @categories Tasks and Activities { Client *THIS; bool RETVAL; int TaskID = (int) SvIV(ST(1)); int ActivityID = (int) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->IsTaskActivityActive(TaskID, ActivityID); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5163,20 +3905,12 @@ XS(XS_Client_GetCorpseCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetCorpseCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetCorpseCount(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetCorpseCount(THIS)"); // @categories Account and Character, Corpse { Client *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetCorpseCount(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5188,21 +3922,13 @@ XS(XS_Client_GetCorpseID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetCorpseID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetCorpseID(THIS, uint8 corpse)"); + Perl_croak(aTHX_ "Usage: Client::GetCorpseID(THIS, uint8 corpse)"); // @categories Account and Character, Corpse { Client *THIS; uint8 corpse = (uint8) SvIV(ST(1)); uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetCorpseID(corpse); XSprePUSH; PUSHi((IV) RETVAL); @@ -5214,22 +3940,14 @@ XS(XS_Client_GetCorpseItemAt); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetCorpseItemAt) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::GetCorpseItemAt(THIS, uint32 corpse_id, uint16 slot_id)"); + Perl_croak(aTHX_ "Usage: Client::GetCorpseItemAt(THIS, uint32 corpse_id, uint16 slot_id)"); // @categories Inventory and Items, Corpse { Client *THIS; uint32 corpse_id = (uint32) SvIV(ST(1)); uint16 slotid = (uint16) SvIV(ST(2)); uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetCorpseItemAt(corpse_id, slotid); XSprePUSH; PUSHi((IV) RETVAL); @@ -5241,19 +3959,11 @@ XS(XS_Client_AssignToInstance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_AssignToInstance) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::AssignToInstance(THIS, uint16 instance_id)"); + Perl_croak(aTHX_ "Usage: Client::AssignToInstance(THIS, uint16 instance_id)"); // @categories Adventures and Expeditions { Client *THIS; uint16 instance_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AssignToInstance(instance_id); } XSRETURN_EMPTY; @@ -5263,19 +3973,11 @@ XS(XS_Client_RemoveFromInstance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_RemoveFromInstance) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::RemoveFromInstance(THIS, uint16 instance_id)"); + Perl_croak(aTHX_ "Usage: Client::RemoveFromInstance(THIS, uint16 instance_id)"); // @categories Adventures and Expeditions { Client *THIS; uint16 instance_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->RemoveFromInstance(instance_id); } XSRETURN_EMPTY; @@ -5288,15 +3990,7 @@ XS(XS_Client_Freeze) { Perl_croak(aTHX_ "Usage: Client:Freeze(THIS)"); { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendAppearancePacket(AT_Anim, ANIM_FREEZE); } XSRETURN_EMPTY; @@ -5309,15 +4003,7 @@ XS(XS_Client_UnFreeze) { Perl_croak(aTHX_ "Usage: Client:UnFreeze(THIS)"); { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendAppearancePacket(AT_Anim, ANIM_STAND); } XSRETURN_EMPTY; @@ -5328,20 +4014,12 @@ XS(XS_Client_GetAggroCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAggroCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetAggroCount(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetAggroCount(THIS)"); // @categories Script Utility, Hate and Aggro { Client *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAggroCount(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5354,20 +4032,12 @@ XS(XS_Client_GetCarriedMoney); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetCarriedMoney) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetCarriedMoney(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetCarriedMoney(THIS)"); // @categories Currency and Points { Client *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetCarriedMoney(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5380,20 +4050,12 @@ XS(XS_Client_GetAllMoney); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAllMoney) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetAllMoney(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetAllMoney(THIS)"); // @categories Currency and Points { Client *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAllMoney(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5406,20 +4068,12 @@ XS(XS_Client_GetItemInInventory); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetItemInInventory) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetItemInInventory(THIS, int16 slot_id)"); + Perl_croak(aTHX_ "Usage: Client::GetItemInInventory(THIS, int16 slot_id)"); // @categories Inventory and Items { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); - EQEmu::ItemInstance *RETVAL = nullptr; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::ItemInstance *RETVAL = nullptr; + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetInv().GetItem(slot_id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "QuestItem", (void *) RETVAL); @@ -5431,21 +4085,13 @@ XS(XS_Client_SetCustomItemData); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetCustomItemData) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Client::SetCustomItemData(THIS, int16 slot_id, string identifier, string value)"); + Perl_croak(aTHX_ "Usage: Client::SetCustomItemData(THIS, int16 slot_id, string identifier, string value)"); // @categories Inventory and Items { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); Const_char *identifier = SvPV_nolen(ST(2)); Const_char *value = SvPV_nolen(ST(3)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->GetInv().SetCustomItemData(THIS->CharacterID(), slot_id, std::string(identifier), std::string(value)); } XSRETURN_EMPTY; @@ -5455,22 +4101,14 @@ XS(XS_Client_GetCustomItemData); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetCustomItemData) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::GetCustomItemData(THIS, int16 slot_id, string identifier)"); + Perl_croak(aTHX_ "Usage: Client::GetCustomItemData(THIS, int16 slot_id, string identifier)"); // @categories Inventory and Items, Corpse { Client *THIS; int16 slot_id = (int16) SvIV(ST(1)); Const_char *identifier = SvPV_nolen(ST(2)); Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; std::string ret_val = THIS->GetInv().GetCustomItemData(slot_id, std::string(identifier)); RETVAL = ret_val.c_str(); sv_setpv(TARG, RETVAL); @@ -5484,41 +4122,24 @@ XS(XS_Client_OpenLFGuildWindow); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_OpenLFGuildWindow) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::OpenLFGuildWindow(THIS)"); + Perl_croak(aTHX_ "Usage: Client::OpenLFGuildWindow(THIS)"); // @categories Script Utility, Guild { Client *THIS; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->OpenLFGuildWindow(); } XSRETURN_EMPTY; } -XS(XS_Client_SignalClient); /* prototype to pass -Wmissing-prototypes */ -XS(XS_Client_SignalClient) { +XS(XS_Client_NotifyNewTitlesAvailable); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_NotifyNewTitlesAvailable) { dXSARGS; - if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SignalClient(THIS, uint32 data)"); + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::NotifyNewTitlesAvailable(THIS)"); // @categories Account and Character { Client *THIS; - uint32 data = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - THIS->Signal(data); + VALIDATE_THIS_IS_CLIENT; + THIS->NotifyNewTitlesAvailable(); } XSRETURN_EMPTY; } @@ -5527,20 +4148,12 @@ XS(XS_Client_AddAlternateCurrencyValue); /* prototype to pass -Wmissing-prototyp XS(XS_Client_AddAlternateCurrencyValue) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::AddAlternateCurrencyValue(THIS, uint32 currency_id, int32 amount)"); + Perl_croak(aTHX_ "Usage: Client::AddAlternateCurrencyValue(THIS, uint32 currency_id, int32 amount)"); // @categories Currency and Points { Client *THIS; uint32 currency_id = (uint32) SvUV(ST(1)); int32 amount = (int32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->AddAlternateCurrencyValue(currency_id, amount); } XSRETURN_EMPTY; @@ -5550,20 +4163,12 @@ XS(XS_Client_SetAlternateCurrencyValue); /* prototype to pass -Wmissing-prototyp XS(XS_Client_SetAlternateCurrencyValue) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetAlternateCurrencyValue(THIS, uint32 currency_id, int32 amount)"); + Perl_croak(aTHX_ "Usage: Client::SetAlternateCurrencyValue(THIS, uint32 currency_id, int32 amount)"); // @categories Currency and Points { Client *THIS; uint32 currency_id = (uint32) SvUV(ST(1)); int32 amount = (int32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetAlternateCurrencyValue(currency_id, amount); } XSRETURN_EMPTY; @@ -5573,21 +4178,13 @@ XS(XS_Client_GetAlternateCurrencyValue); /* prototype to pass -Wmissing-prototyp XS(XS_Client_GetAlternateCurrencyValue) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetAlternateCurrencyValue(THIS, uint32 currency_id)"); + Perl_croak(aTHX_ "Usage: Client::GetAlternateCurrencyValue(THIS, uint32 currency_id)"); // @categories Currency and Points { Client *THIS; uint32 currency_id = (uint32) SvUV(ST(1)); int32 RETVAL = 0; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAlternateCurrencyValue(currency_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -5599,19 +4196,11 @@ XS(XS_Client_SendWebLink); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SendWebLink) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::SendWebLink(THIS, string website_url)"); + Perl_croak(aTHX_ "Usage: Client::SendWebLink(THIS, string website_url)"); // @categories Script Utility { Client *THIS; char *website = nullptr; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 1) { website = (char *) SvPV_nolen(ST(1)); } THIS->SendWebLink(website); @@ -5623,20 +4212,12 @@ XS(XS_Client_GetInstanceID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetInstanceID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetInstanceID(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetInstanceID(THIS)"); // @categories Adventures and Expeditions { Client *THIS; int8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetInstanceID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -5648,20 +4229,12 @@ XS(XS_Client_HasSpellScribed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_HasSpellScribed) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::HasSpellScribed(THIS, int spell_id)"); + Perl_croak(aTHX_ "Usage: Client::HasSpellScribed(THIS, int spell_id)"); // @categories Spells and Disciplines { Client *THIS; bool RETVAL; int spell_id = (int) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->HasSpellScribed(spell_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5673,7 +4246,7 @@ XS(XS_Client_SetAccountFlag); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetAccountFlag) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetAccountFlag(THIS, string flag, string value)"); + Perl_croak(aTHX_ "Usage: Client::SetAccountFlag(THIS, string flag, string value)"); // @categories Account and Character { Client *THIS; //char* flag = (char *)SvPV_nolen(ST(1)); @@ -5681,15 +4254,7 @@ XS(XS_Client_SetAccountFlag) { std::string flag((char *) SvPV_nolen(ST(1))); std::string value((char *) SvTRUE(ST(2))); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetAccountFlag(flag, value); } XSRETURN_EMPTY; @@ -5699,7 +4264,7 @@ XS(XS_Client_GetAccountFlag); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetAccountFlag) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::GetAccountFlag(THIS, string flag)"); + Perl_croak(aTHX_ "Usage: Client::GetAccountFlag(THIS, string flag)"); // @categories Account and Character { Client *THIS; //char* flag = (char *)SvPV_nolen(ST(1)); @@ -5707,15 +4272,7 @@ XS(XS_Client_GetAccountFlag) { std::string flag((char *) SvPV_nolen(ST(1))); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; std::string value = THIS->GetAccountFlag(flag); sv_setpv(TARG, value.c_str()); @@ -5729,20 +4286,12 @@ XS(XS_Client_GetHunger); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetHunger) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetHunger(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetHunger(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetHunger(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5754,20 +4303,12 @@ XS(XS_Client_GetThirst); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetThirst) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetThirst(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetThirst(THIS)"); // @categories Account and Character, Stats and Attributes { Client *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetThirst(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5779,19 +4320,11 @@ XS(XS_Client_SetHunger); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetHunger) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetHunger(THIS, in_hunger)"); + Perl_croak(aTHX_ "Usage: Client::SetHunger(THIS, in_hunger)"); // @categories Script Utility, Stats and Attributes { Client *THIS; int32 in_hunger = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetHunger(in_hunger); } XSRETURN_EMPTY; @@ -5801,19 +4334,11 @@ XS(XS_Client_SetThirst); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetThirst) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SetThirst(THIS, int32 in_thirst)"); + Perl_croak(aTHX_ "Usage: Client::SetThirst(THIS, int32 in_thirst)"); // @categories Account and Character, Stats and Attributes { Client *THIS; int32 in_thirst = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetThirst(in_thirst); } XSRETURN_EMPTY; @@ -5823,19 +4348,11 @@ XS(XS_Client_SendTargetCommand); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SendTargetCommand) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SendTargetCommand(THIS, int32 entity_id)"); + Perl_croak(aTHX_ "Usage: Client::SendTargetCommand(THIS, int32 entity_id)"); // @categories Script Utility { Client *THIS; int32 in_entid = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendTargetCommand(in_entid); } XSRETURN_EMPTY; @@ -5845,20 +4362,12 @@ XS(XS_Client_SetConsumption); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SetConsumption) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SetHunger(THIS, int32 hunger_amount, int32 thirst_amount)"); + Perl_croak(aTHX_ "Usage: Client::SetHunger(THIS, int32 hunger_amount, int32 thirst_amount)"); // @categories Script Utility, Stats and Attributes { Client *THIS; int32 in_hunger = (uint32) SvUV(ST(1)); int32 in_thirst = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetConsumption(in_hunger, in_thirst); } XSRETURN_EMPTY; @@ -5868,18 +4377,11 @@ XS(XS_Client_SilentMessage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SilentMessage) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Client::SilentMessage(THIS, string message)"); + Perl_croak(aTHX_ "Usage: Client::SilentMessage(THIS, string message)"); // @categories Script Utility { Client *THIS; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); + VALIDATE_THIS_IS_CLIENT; if (THIS->GetTarget() != NULL) { if (THIS->GetTarget()->IsNPC()) { if (DistanceSquaredNoZ(THIS->GetPosition(), THIS->GetTarget()->GetPosition()) <= 200) { @@ -5898,19 +4400,11 @@ XS(XS_Client_PlayMP3); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_PlayMP3) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Client::PlayMP3(THIS, string file_name)"); + Perl_croak(aTHX_ "Usage: Client::PlayMP3(THIS, string file_name)"); // @categories Script Utility { Client *THIS; char *fname = nullptr; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 1) { fname = (char *) SvPV_nolen(ST(1)); } THIS->PlayMP3(fname); @@ -5922,21 +4416,13 @@ XS(XS_Client_ExpeditionMessage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_ExpeditionMessage) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::ExpeditionMessage(THIS, int expedition_id, string message)"); + Perl_croak(aTHX_ "Usage: Client::ExpeditionMessage(THIS, int expedition_id, string message)"); // @categories Adventures and Expeditions { Client *THIS; int ExpdID = (int) SvUV(ST(1)); const char *Message = (const char *) SvPV_nolen(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->ExpeditionSay(Message, ExpdID); } XSRETURN_EMPTY; @@ -5948,7 +4434,7 @@ XS(XS_Client_SendMarqueeMessage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SendMarqueeMessage) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Client::SendMarqueeMessage(THIS, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, string msg)"); + Perl_croak(aTHX_ "Usage: Client::SendMarqueeMessage(THIS, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, string msg)"); // @categories Script Utility { Client *THIS; uint32 type = (uint32) SvUV(ST(1)); @@ -5958,15 +4444,7 @@ XS(XS_Client_SendMarqueeMessage) { uint32 duration = (uint32) SvUV(ST(5)); std::string msg = (std::string) SvPV_nolen(ST(6)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendMarqueeMessage(type, priority, fade_in, fade_out, duration, msg); } XSRETURN_EMPTY; @@ -5976,21 +4454,13 @@ XS(XS_Client_SendColoredText); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_SendColoredText) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Client::SendColoredText(uint32 color, string message)"); + Perl_croak(aTHX_ "Usage: Client::SendColoredText(uint32 color, string message)"); // @categories Script Utility { Client *THIS; uint32 color = (uint32) SvUV(ST(1)); std::string msg = (std::string) SvPV_nolen(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendColoredText(color, msg); } XSRETURN_EMPTY; @@ -6006,15 +4476,7 @@ XS(XS_Client_SendSpellAnim) { uint16 targetid = (uint16) SvUV(ST(1)); uint16 spell_id = (uint16) SvUV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SendSpellAnim(targetid, spell_id); } XSRETURN_EMPTY; @@ -6024,20 +4486,12 @@ XS(XS_Client_GetTargetRingX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetTargetRingX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetTargetRingX(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetTargetRingX(THIS)"); // @categories Script Utility { Client *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetTargetRingX(); XSprePUSH; PUSHn((double) RETVAL); @@ -6049,20 +4503,12 @@ XS(XS_Client_GetTargetRingY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetTargetRingY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetTargetRingY(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetTargetRingY(THIS)"); // @categories Script Utility { Client *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetTargetRingY(); XSprePUSH; PUSHn((double) RETVAL); @@ -6074,20 +4520,12 @@ XS(XS_Client_GetTargetRingZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_GetTargetRingZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Client::GetTargetRingZ(THIS)"); + Perl_croak(aTHX_ "Usage: Client::GetTargetRingZ(THIS)"); // @categories Script Utility { Client *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetTargetRingZ(); XSprePUSH; PUSHn((double) RETVAL); @@ -6107,15 +4545,7 @@ XS(XS_Client_CalcEXP) { if (items == 2) conlevel = (uint16) SvUV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->CalcEXP(conlevel); XSprePUSH; PUSHi((IV) RETVAL); @@ -6127,7 +4557,7 @@ XS(XS_Client_QuestReward); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_QuestReward) { dXSARGS; if (items < 1 || items > 9) - Perl_croak(aTHX_ "Usage: Client::QuestReward(THIS, int32 mob, int32 copper, int32 silver, int32 gold, int32 platinum, int32 item_id, int32 exp, [bool faction = false])"); + Perl_croak(aTHX_ "Usage: Client::QuestReward(THIS, int32 mob, int32 copper, int32 silver, int32 gold, int32 platinum, int32 item_id, int32 exp, [bool faction = false])"); // @categories Currency and Points, Experience and Level, Inventory and Items, Faction { Client *THIS; Mob *mob = nullptr; @@ -6180,16 +4610,7 @@ XS(XS_Client_GetMoney) { uint8 type = (uint8) SvUV(ST(1)); uint8 subtype = (uint8) SvUV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetMoney(type, subtype); XSprePUSH; PUSHn((uint32) RETVAL); @@ -6206,16 +4627,7 @@ XS(XS_Client_GetAccountAge) { Client *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetAccountAge(); XSprePUSH; PUSHn((int) RETVAL); @@ -6227,7 +4639,7 @@ XS(XS_Client_Popup2); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_Popup2) { dXSARGS; if (items < 3 || items > 10) - Perl_croak(aTHX_ "Usage: Client::SendFullPopup(THIS, string title, string text, uint32 popup_id, uint32 negative_id, uint32 buttons, uint32 duration, string button_name_0, string button_name_1, uint32 sound_controls)"); + Perl_croak(aTHX_ "Usage: Client::Popup2(THIS, string title, string text, uint32 popup_id, uint32 negative_id, uint32 buttons, uint32 duration, string button_name_0, string button_name_1, uint32 sound_controls)"); // @categories Script Utility { Client *THIS; char *Title = (char *) SvPV_nolen(ST(1)); @@ -6239,15 +4651,7 @@ XS(XS_Client_Popup2) { char *ButtonName0 = 0; char *ButtonName1 = 0; uint32 SoundControls = 0; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; if (items > 3) { PopupID = (uint32) SvUV(ST(3)); } if (items > 4) { NegativeID = (uint32) SvUV(ST(4)); } if (items > 5) { Buttons = (uint32) SvUV(ST(5)); } @@ -6268,23 +4672,12 @@ XS(XS_Client_SetPrimaryWeaponOrnamentation) { dXSARGS; if (items != 2) { - Perl_croak(aTHX_ "Usage: Client::SetPrimaryWeaponOrnamentation(THIS, model_id)"); + Perl_croak(aTHX_ "Usage: Client::SetPrimaryWeaponOrnamentation(THIS, model_id)"); // @categories Account and Character, Inventory and Items } { Client *THIS; uint32 model_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } - else { - Perl_croak(aTHX_ "THIS is not of type Client"); - } - if (THIS == nullptr) { - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - } - + VALIDATE_THIS_IS_CLIENT; THIS->SetPrimaryWeaponOrnamentation(model_id); } XSRETURN_EMPTY; @@ -6295,23 +4688,12 @@ XS(XS_Client_SetSecondaryWeaponOrnamentation) { dXSARGS; if (items != 2) { - Perl_croak(aTHX_ "Usage: Client::SetSecondaryWeaponOrnamentation(THIS, model_id)"); + Perl_croak(aTHX_ "Usage: Client::SetSecondaryWeaponOrnamentation(THIS, model_id)"); // @categories Account and Character, Inventory and Items } { Client *THIS; uint32 model_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Client *, tmp); - } - else { - Perl_croak(aTHX_ "THIS is not of type Client"); - } - if (THIS == nullptr) { - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - } - + VALIDATE_THIS_IS_CLIENT; THIS->SetSecondaryWeaponOrnamentation(model_id); } XSRETURN_EMPTY; @@ -6325,16 +4707,7 @@ XS(XS_Client_SetClientMaxLevel) { { Client* THIS; int in_level = (int)SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(Client*, tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; THIS->SetClientMaxLevel(in_level); } XSRETURN_EMPTY; @@ -6349,16 +4722,7 @@ XS(XS_Client_GetClientMaxLevel) { Client* THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Client")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(Client*, tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Client"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CLIENT; RETVAL = THIS->GetClientMaxLevel(); XSprePUSH; PUSHu((UV)RETVAL); @@ -6366,6 +4730,565 @@ XS(XS_Client_GetClientMaxLevel) { XSRETURN(1); } +XS(XS_Client_CreateExpedition); +XS(XS_Client_CreateExpedition) { + dXSARGS; + if (items != 7 && items != 8) { + Perl_croak(aTHX_ "Usage: Client::CreateExpedition(THIS, string zone_name, uint32 zone_version, uint32 duration, string expedition_name, uint32 min_players, uint32 max_players, [bool disable_messages = false])"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string zone_name(SvPV_nolen(ST(1))); + uint32 zone_version = (uint32)SvUV(ST(2)); + uint32 duration = (uint32)SvUV(ST(3)); + std::string expedition_name(SvPV_nolen(ST(4))); + uint32 min_players = (uint32)SvUV(ST(5)); + uint32 max_players = (uint32)SvUV(ST(6)); + bool disable_messages = (items > 7) ? (bool)SvTRUE(ST(7)) : false; + + Expedition* RETVAL = THIS->CreateExpedition(zone_name, zone_version, duration, + expedition_name, min_players, max_players, disable_messages); + + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "Expedition", (void*)RETVAL); + + XSRETURN(1); +} + +XS(XS_Client_GetExpedition); +XS(XS_Client_GetExpedition) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Client::GetExpedition(THIS)"); + } + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + Expedition* RETVAL = THIS->GetExpedition(); + + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "Expedition", (void*)RETVAL); + + XSRETURN(1); +} + +XS(XS_Client_GetExpeditionLockouts); +XS(XS_Client_GetExpeditionLockouts) { + dXSARGS; + if (items != 1 && items != 2) { + Perl_croak(aTHX_ "Usage: Client::GetExpeditionLockouts(THIS, [string expedition_name])"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + HV* hash = newHV(); + SV* hash_ref = nullptr; // for expedition event hash if filtering on expedition + + std::string expedition_name; + if (items == 2) + { + expedition_name = SvPV_nolen(ST(1)); + } + + auto lockouts = THIS->GetExpeditionLockouts(); + + for (const auto& lockout : lockouts) + { + uint32_t name_len = static_cast(lockout.GetExpeditionName().size()); + uint32_t event_len = static_cast(lockout.GetEventName().size()); + + SV** entry = hv_fetch(hash, lockout.GetExpeditionName().c_str(), name_len, false); + if (!entry) + { + SV* event_hash_ref = newRV_noinc((SV*)newHV()); // takes ownership of hash + if (!expedition_name.empty() && lockout.GetExpeditionName() == expedition_name) + { + hash_ref = event_hash_ref; // save ref to event hash for return + } + entry = hv_store(hash, lockout.GetExpeditionName().c_str(), name_len, event_hash_ref, 0); + } + + if (entry && SvROK(*entry) && SvTYPE(SvRV(*entry)) == SVt_PVHV) + { + HV* event_hash = (HV*)SvRV(*entry); + hv_store(event_hash, lockout.GetEventName().c_str(), event_len, + newSVuv(lockout.GetSecondsRemaining()), 0); + } + } + + SV* rv = &PL_sv_undef; + + if (!expedition_name.empty()) + { + rv = hash_ref ? sv_2mortal(hash_ref) : &PL_sv_undef; // ref that owns event hash for expedition + } + else + { + rv = sv_2mortal(newRV_noinc((SV*)hash)); // owns expedition hash + } + + ST(0) = rv; + XSRETURN(1); +} + +XS(XS_Client_GetLockoutExpeditionUUID); +XS(XS_Client_GetLockoutExpeditionUUID) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: Client::GetLockoutExpeditionUUID(THIS, string expedition_name, string event_name)"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string expedition_name = SvPV_nolen(ST(1)); + std::string event_name = SvPV_nolen(ST(2)); + + auto lockout = THIS->GetExpeditionLockout(expedition_name, event_name); + if (lockout) + { + XSRETURN_PV(lockout->GetExpeditionUUID().c_str()); + } + + XSRETURN_UNDEF; +} + +XS(XS_Client_AddExpeditionLockout); +XS(XS_Client_AddExpeditionLockout) { + dXSARGS; + if (items != 4 && items != 5) { + Perl_croak(aTHX_ "Usage: Client::AddExpeditionLockout(THIS, string expedition_name, string event_name, uint32 seconds, [string uuid])"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string expedition_name(SvPV_nolen(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + uint32 seconds = (uint32)SvUV(ST(3)); + std::string uuid; + + if (items == 5) + { + uuid = SvPV_nolen(ST(4)); + } + + THIS->AddNewExpeditionLockout(expedition_name, event_name, seconds, uuid); + + XSRETURN_EMPTY; +} + +XS(XS_Client_AddExpeditionLockoutDuration); +XS(XS_Client_AddExpeditionLockoutDuration) { + dXSARGS; + if (items != 4 && items != 5) { + Perl_croak(aTHX_ "Usage: Client::AddExpeditionLockoutDuration(THIS, string expedition_name, string event_name, int seconds, [string uuid])"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string expedition_name(SvPV_nolen(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + int seconds = static_cast(SvUV(ST(3))); + std::string uuid; + + if (items == 5) + { + uuid = SvPV_nolen(ST(4)); + } + + THIS->AddExpeditionLockoutDuration(expedition_name, event_name, seconds, uuid, true); + + XSRETURN_EMPTY; +} + +XS(XS_Client_RemoveAllExpeditionLockouts); +XS(XS_Client_RemoveAllExpeditionLockouts) { + dXSARGS; + if (items != 1 && items != 2) { + Perl_croak(aTHX_ "Usage: Client::RemoveAllExpeditionLockouts(THIS, [string expedition_name])"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string expedition_name; + if (items == 2) + { + expedition_name = SvPV_nolen(ST(1)); + } + + THIS->RemoveAllExpeditionLockouts(expedition_name, true); + + XSRETURN_EMPTY; +} + +XS(XS_Client_RemoveExpeditionLockout); +XS(XS_Client_RemoveExpeditionLockout) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: Client::RemoveExpeditionLockout(THIS, string expedition_name, string event_name)"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string expedition_name(SvPV_nolen(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + + THIS->RemoveExpeditionLockout(expedition_name, event_name, true); + + XSRETURN_EMPTY; +} + +XS(XS_Client_HasExpeditionLockout); +XS(XS_Client_HasExpeditionLockout) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: Client::HasExpeditionLockout(THIS, string expedition_name, string event_name)"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + std::string expedition_name(SvPV_nolen(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + + bool result = THIS->HasExpeditionLockout(expedition_name, event_name); + ST(0) = boolSV(result); + + XSRETURN(1); +} + +XS(XS_Client_MovePCDynamicZone); +XS(XS_Client_MovePCDynamicZone) { + dXSARGS; + if (items != 2 && items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: Client::MovePCDynamicZone(THIS, uint32 zone_id | string zone_name, [int zone_version = -1], [bool message_if_invalid = true])"); + } + + Client* THIS = nullptr; + VALIDATE_THIS_IS_CLIENT; + + if (SvTYPE(ST(1)) == SVt_PV) + { + std::string zone_name(SvPV_nolen(ST(1))); + int zone_version = (items >= 3) ? static_cast(SvIV(ST(2))) : -1; + if (items == 4) + { + THIS->MovePCDynamicZone(zone_name, zone_version, (bool)SvTRUE(ST(3))); + } + else + { + THIS->MovePCDynamicZone(zone_name, zone_version); + } + } + else if (SvTYPE(ST(1)) == SVt_IV) + { + uint32 zone_id = (uint32)SvUV(ST(1)); + int zone_version = (items >= 3) ? static_cast(SvIV(ST(2))) : -1; + if (items == 3) + { + THIS->MovePCDynamicZone(zone_id, zone_version, (bool)SvTRUE(ST(2))); + } + else + { + THIS->MovePCDynamicZone(zone_id, zone_version); + } + } + else + { + Perl_croak(aTHX_ "Client::MovePCDynamicZone expected an integer or string"); + } + + XSRETURN_EMPTY; +} + +XS(XS_Client_Fling); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_Fling) { + dXSARGS; + if (items < 5 || items > 7) + Perl_croak(aTHX_ "Usage: Client::Fling(THIS, value, target_x, target_y, target_z, ignore_los, clipping)"); + { + Client* THIS; + float value = (float) SvNV(ST(1)); + float target_x = (float) SvNV(ST(2)); + float target_y = (float) SvNV(ST(3)); + float target_z = (float) SvNV(ST(4)); + bool ignore_los = false; + bool clipping = false; + VALIDATE_THIS_IS_CLIENT; + if (items > 5) + ignore_los = (bool) SvTRUE(ST(5)); + + if (items > 6) + clipping = (bool) SvTRUE(ST(6)); + + THIS->Fling(value, target_x, target_y, target_z, ignore_los, clipping); + } + XSRETURN_EMPTY; +} + +XS(XS_Client_HasDisciplineLearned); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_HasDisciplineLearned) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::HasDisciplineLearned(THIS, uint16 spell_id)"); + { + Client *THIS; + bool has_learned; + uint16 spell_id = (uint16) SvUV(ST(1)); + VALIDATE_THIS_IS_CLIENT; + has_learned = THIS->HasDisciplineLearned(spell_id); + ST(0) = boolSV(has_learned); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Client_GetClassBitmask); +XS(XS_Client_GetClassBitmask) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetClassBitmask(THIS)"); + { + Client* THIS; + int client_bitmask = 0; + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + client_bitmask = GetPlayerClassBit(THIS->GetClass()); + XSprePUSH; + PUSHu((UV) client_bitmask); + } + XSRETURN(1); +} + +XS(XS_Client_GetRaceBitmask); +XS(XS_Client_GetRaceBitmask) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetRaceBitmask(THIS)"); // @categories Stats and Attributes + { + Client* THIS; + int client_bitmask = 0; + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + client_bitmask = GetPlayerRaceBit(THIS->GetBaseRace()); + XSprePUSH; + PUSHu((UV) client_bitmask); + } + XSRETURN(1); +} + +XS(XS_Client_GetLearnableDisciplines); +XS(XS_Client_GetLearnableDisciplines) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: Client::GetLearnableDisciplines(THIS, [uint8 min_level, uint8 max_level])"); + + uint8 min_level = 1; + uint8 max_level = 0; + if (items > 1) + min_level = (uint8)SvUV(ST(1)); + if (items > 2) + max_level = (uint8)SvUV(ST(2)); + + Client* THIS; + VALIDATE_THIS_IS_CLIENT; + auto learnable_disciplines = THIS->GetLearnableDisciplines(min_level, max_level); + auto learnable_size = learnable_disciplines.size(); + if (learnable_size > 0) { + EXTEND(sp, learnable_size); + for (int index = 0; index < learnable_size; ++index) { + ST(index) = sv_2mortal(newSVuv(learnable_disciplines[index])); + } + XSRETURN(learnable_size); + } + SV* return_value = &PL_sv_undef; + ST(0) = return_value; + XSRETURN(1); +} + +XS(XS_Client_GetLearnedDisciplines); +XS(XS_Client_GetLearnedDisciplines) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetLearnedDisciplines(THIS)"); + + Client* THIS; + VALIDATE_THIS_IS_CLIENT; + auto learned_disciplines = THIS->GetLearnedDisciplines(); + auto learned_size = learned_disciplines.size(); + if (learned_size > 0) { + EXTEND(sp, learned_size); + for (int index = 0; index < learned_size; ++index) { + ST(index) = sv_2mortal(newSVuv(learned_disciplines[index])); + } + XSRETURN(learned_size); + } + SV* return_value = &PL_sv_undef; + ST(0) = return_value; + XSRETURN(1); +} + +XS(XS_Client_GetMemmedSpells); +XS(XS_Client_GetMemmedSpells) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetMemmedSpells(THIS)"); + + Client* THIS; + VALIDATE_THIS_IS_CLIENT; + auto memmed_spells = THIS->GetMemmedSpells(); + auto memmed_size = memmed_spells.size(); + if (memmed_size > 0) { + EXTEND(sp, memmed_size); + for (int index = 0; index < memmed_size; ++index) { + ST(index) = sv_2mortal(newSVuv(memmed_spells[index])); + } + XSRETURN(memmed_size); + } + SV* return_value = &PL_sv_undef; + ST(0) = return_value; + XSRETURN(1); +} + +XS(XS_Client_GetScribeableSpells); +XS(XS_Client_GetScribeableSpells) { + dXSARGS; + if (items < 1 || items > 3) + Perl_croak(aTHX_ "Usage: Client::GetScribeableSpells(THIS, [uint8 min_level, uint8 max_level])"); + + uint8 min_level = 1; + uint8 max_level = 0; + if (items > 1) + min_level = (uint8)SvUV(ST(1)); + if (items > 2) + max_level = (uint8)SvUV(ST(2)); + + Client* THIS; + VALIDATE_THIS_IS_CLIENT; + auto scribeable_spells = THIS->GetScribeableSpells(min_level, max_level); + auto scribeable_size = scribeable_spells.size(); + if (scribeable_size > 0) { + EXTEND(sp, scribeable_size); + for (int index = 0; index < scribeable_size; ++index) { + ST(index) = sv_2mortal(newSVuv(scribeable_spells[index])); + } + XSRETURN(scribeable_size); + } + SV* return_value = &PL_sv_undef; + ST(0) = return_value; + XSRETURN(1); +} + +XS(XS_Client_GetScribedSpells); +XS(XS_Client_GetScribedSpells) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetScribedSpells(THIS)"); + + Client* THIS; + VALIDATE_THIS_IS_CLIENT; + auto scribed_spells = THIS->GetScribedSpells(); + auto scribed_size = scribed_spells.size(); + if (scribed_size > 0) { + EXTEND(sp, scribed_size); + for (int index = 0; index < scribed_size; ++index) { + ST(index) = sv_2mortal(newSVuv(scribed_spells[index])); + } + XSRETURN(scribed_size); + } + SV* return_value = &PL_sv_undef; + ST(0) = return_value; + XSRETURN(1); +} + +XS(XS_Client_GetInventory); +XS(XS_Client_GetInventory) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::GetInventory(THIS)"); + { + Client* THIS; + EQ::InventoryProfile* RETVAL; + VALIDATE_THIS_IS_CLIENT; + RETVAL = &THIS->GetInv(); + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "Inventory", (void *) RETVAL); + } + XSRETURN(1); +} + +XS(XS_Client_GetAAEXPModifier); +XS(XS_Client_GetAAEXPModifier) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::GetAAEXPModifier(THIS, uint32 zone_id)"); + { + Client* THIS; + double aa_modifier = 1.0f; + uint32 zone_id = (uint32)SvUV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + aa_modifier = THIS->GetAAEXPModifier(zone_id); + XSprePUSH; + PUSHn((double) aa_modifier); + } + XSRETURN(1); +} + +XS(XS_Client_GetEXPModifier); +XS(XS_Client_GetEXPModifier) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Client::GetEXPModifier(THIS, uint32 zone_id)"); + { + Client* THIS; + double exp_modifier = 1.0f; + uint32 zone_id = (uint32)SvUV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_CLIENT; + exp_modifier = THIS->GetEXPModifier(zone_id); + XSprePUSH; + PUSHn((double) exp_modifier); + } + XSRETURN(1); +} + +XS(XS_Client_SetAAEXPModifier); +XS(XS_Client_SetAAEXPModifier) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: Client::SetAAEXPModifier(THIS, uint32 zone_id, float aa_modifier)"); + { + Client* THIS; + uint32 zone_id = (uint32)SvUV(ST(1)); + double aa_modifier = (double) SvNV(ST(2)); + VALIDATE_THIS_IS_CLIENT; + THIS->SetAAEXPModifier(zone_id, aa_modifier); + } + XSRETURN_EMPTY; +} + +XS(XS_Client_SetEXPModifier); +XS(XS_Client_SetEXPModifier) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: Client::SetEXPModifier(THIS, uint32 zone_id, float exp_modifier)"); + { + Client* THIS; + uint32 zone_id = (uint32)SvUV(ST(1)); + double exp_modifier = (double) SvNV(ST(2)); + VALIDATE_THIS_IS_CLIENT; + THIS->SetEXPModifier(zone_id, exp_modifier); + } + XSRETURN_EMPTY; +} #ifdef __cplusplus extern "C" @@ -6393,6 +5316,8 @@ XS(boot_Client) { newXSproto(strcpy(buf, "AddAlternateCurrencyValue"), XS_Client_AddAlternateCurrencyValue, file, "$$$"); newXSproto(strcpy(buf, "AddCrystals"), XS_Client_AddCrystals, file, "$$"); newXSproto(strcpy(buf, "AddEXP"), XS_Client_AddEXP, file, "$$;$$"); + newXSproto(strcpy(buf, "AddExpeditionLockout"), XS_Client_AddExpeditionLockout, file, "$$$$;$"); + newXSproto(strcpy(buf, "AddExpeditionLockoutDuration"), XS_Client_AddExpeditionLockoutDuration, file, "$$$$;$"); newXSproto(strcpy(buf, "AddLevelBasedExp"), XS_Client_AddLevelBasedExp, file, "$$;$$"); newXSproto(strcpy(buf, "AddMoneyToPP"), XS_Client_AddMoneyToPP, file, "$$$$$$"); newXSproto(strcpy(buf, "AddPVPPoints"), XS_Client_AddPVPPoints, file, "$$"); @@ -6411,23 +5336,28 @@ XS(boot_Client) { newXSproto(strcpy(buf, "CheckSpecializeIncrease"), XS_Client_CheckSpecializeIncrease, file, "$$"); newXSproto(strcpy(buf, "ClearCompassMark"), XS_Client_ClearCompassMark, file, "$"); newXSproto(strcpy(buf, "ClearZoneFlag"), XS_Client_ClearZoneFlag, file, "$$"); + newXSproto(strcpy(buf, "CreateExpedition"), XS_Client_CreateExpedition, file, "$$$$$$$;$"); newXSproto(strcpy(buf, "Connected"), XS_Client_Connected, file, "$"); newXSproto(strcpy(buf, "DecreaseByID"), XS_Client_DecreaseByID, file, "$$$"); newXSproto(strcpy(buf, "DeleteItemInInventory"), XS_Client_DeleteItemInInventory, file, "$$;$$"); newXSproto(strcpy(buf, "Disconnect"), XS_Client_Disconnect, file, "$"); newXSproto(strcpy(buf, "DropItem"), XS_Client_DropItem, file, "$$"); newXSproto(strcpy(buf, "Duck"), XS_Client_Duck, file, "$"); + newXSproto(strcpy(buf, "DyeArmorBySlot"), XS_Client_DyeArmorBySlot, file, "$$$$$;$"); newXSproto(strcpy(buf, "Escape"), XS_Client_Escape, file, "$"); newXSproto(strcpy(buf, "ExpeditionMessage"), XS_Client_ExpeditionMessage, file, "$$$"); newXSproto(strcpy(buf, "FailTask"), XS_Client_FailTask, file, "$$"); + newXSproto(strcpy(buf, "Fling"), XS_Client_Fling, file, "$$$$$;$$"); newXSproto(strcpy(buf, "ForageItem"), XS_Client_ForageItem, file, "$"); newXSproto(strcpy(buf, "Freeze"), XS_Client_Freeze, file, "$"); newXSproto(strcpy(buf, "GetAAExp"), XS_Client_GetAAExp, file, "$"); + newXSproto(strcpy(buf, "GetAAEXPModifier"), XS_Client_GetAAEXPModifier, file, "$$"); newXSproto(strcpy(buf, "GetAALevel"), XS_Client_GetAALevel, file, "$$"); newXSproto(strcpy(buf, "GetAAPercent"), XS_Client_GetAAPercent, file, "$"); newXSproto(strcpy(buf, "GetAAPoints"), XS_Client_GetAAPoints, file, "$$"); newXSproto(strcpy(buf, "GetAccountAge"), XS_Client_GetAccountAge, file, "$"); newXSproto(strcpy(buf, "GetAccountFlag"), XS_Client_GetAccountFlag, file, "$$"); + newXSproto(strcpy(buf, "GetAFK"), XS_Client_GetAFK, file, "$"); newXSproto(strcpy(buf, "GetAggroCount"), XS_Client_GetAggroCount, file, "$"); newXSproto(strcpy(buf, "GetAllMoney"), XS_Client_GetAllMoney, file, "$"); newXSproto(strcpy(buf, "GetAlternateCurrencyValue"), XS_Client_GetAlternateCurrencyValue, file, "$$"); @@ -6450,6 +5380,7 @@ XS(boot_Client) { newXSproto(strcpy(buf, "GetBindZoneID"), XS_Client_GetBindZoneID, file, "$$"); newXSproto(strcpy(buf, "GetCarriedMoney"), XS_Client_GetCarriedMoney, file, "$"); newXSproto(strcpy(buf, "GetCharacterFactionLevel"), XS_Client_GetCharacterFactionLevel, file, "$$"); + newXSproto(strcpy(buf, "GetClassBitmask"), XS_Client_GetClassBitmask, file, "$"); newXSproto(strcpy(buf, "GetClientMaxLevel"), XS_Client_GetClientMaxLevel, file, "$"); newXSproto(strcpy(buf, "GetClientVersion"), XS_Client_GetClientVersion, file, "$"); newXSproto(strcpy(buf, "GetClientVersionBit"), XS_Client_GetClientVersionBit, file, "$"); @@ -6457,12 +5388,16 @@ XS(boot_Client) { newXSproto(strcpy(buf, "GetCorpseID"), XS_Client_GetCorpseID, file, "$$"); newXSproto(strcpy(buf, "GetCorpseItemAt"), XS_Client_GetCorpseItemAt, file, "$$$"); newXSproto(strcpy(buf, "GetCustomItemData"), XS_Client_GetCustomItemData, file, "$$$"); + newXSproto(strcpy(buf, "GetDisciplineTimer"), XS_Client_GetDisciplineTimer, file, "$$"); newXSproto(strcpy(buf, "GetDiscSlotBySpellID"), XS_Client_GetDiscSlotBySpellID, file, "$$"); newXSproto(strcpy(buf, "GetDuelTarget"), XS_Client_GetDuelTarget, file, "$"); newXSproto(strcpy(buf, "GetEbonCrystals"), XS_Client_GetEbonCrystals, file, "$"); newXSproto(strcpy(buf, "GetEndurance"), XS_Client_GetEndurance, file, "$"); newXSproto(strcpy(buf, "GetEnduranceRatio"), XS_Client_GetEnduranceRatio, file, "$"); newXSproto(strcpy(buf, "GetEXP"), XS_Client_GetEXP, file, "$"); + newXSproto(strcpy(buf, "GetEXPModifier"), XS_Client_GetEXPModifier, file, "$$"); + newXSproto(strcpy(buf, "GetExpedition"), XS_Client_GetExpedition, file, "$"); + newXSproto(strcpy(buf, "GetExpeditionLockouts"), XS_Client_GetExpeditionLockouts, file, "$;$"); newXSproto(strcpy(buf, "GetFace"), XS_Client_GetFace, file, "$"); newXSproto(strcpy(buf, "GetFactionLevel"), XS_Client_GetFactionLevel, file, "$$$$$$$$"); newXSproto(strcpy(buf, "GetFeigned"), XS_Client_GetFeigned, file, "$"); @@ -6474,35 +5409,42 @@ XS(boot_Client) { newXSproto(strcpy(buf, "GetHunger"), XS_Client_GetHunger, file, "$$"); newXSproto(strcpy(buf, "GetInstanceID"), XS_Client_GetInstanceID, file, "$$"); newXSproto(strcpy(buf, "GetInstrumentMod"), XS_Client_GetInstrumentMod, file, "$$"); + newXSproto(strcpy(buf, "GetInventory"), XS_Client_GetInventory, file, "$"); newXSproto(strcpy(buf, "GetIP"), XS_Client_GetIP, file, "$"); newXSproto(strcpy(buf, "GetItemAt"), XS_Client_GetItemAt, file, "$$"); newXSproto(strcpy(buf, "GetItemIDAt"), XS_Client_GetItemIDAt, file, "$$"); newXSproto(strcpy(buf, "GetItemInInventory"), XS_Client_GetItemInInventory, file, "$$"); newXSproto(strcpy(buf, "GetLanguageSkill"), XS_Client_GetLanguageSkill, file, "$$"); - newXSproto(strcpy(buf, "GetLastName"), XS_Client_GetLastName, file, "$"); newXSproto(strcpy(buf, "GetLDoNLosses"), XS_Client_GetLDoNLosses, file, "$"); newXSproto(strcpy(buf, "GetLDoNLossesTheme"), XS_Client_GetLDoNLossesTheme, file, "$$"); newXSproto(strcpy(buf, "GetLDoNPointsTheme"), XS_Client_GetLDoNPointsTheme, file, "$"); newXSproto(strcpy(buf, "GetLDoNWins"), XS_Client_GetLDoNWins, file, "$"); newXSproto(strcpy(buf, "GetLDoNWinsTheme"), XS_Client_GetLDoNWinsTheme, file, "$$"); + newXSproto(strcpy(buf, "GetLearnableDisciplines"), XS_Client_GetLearnableDisciplines, file, "$;$$"); + newXSproto(strcpy(buf, "GetLearnedDisciplines"), XS_Client_GetLearnedDisciplines, file, "$"); + newXSproto(strcpy(buf, "GetLockoutExpeditionUUID"), XS_Client_GetLockoutExpeditionUUID, file, "$$$"); newXSproto(strcpy(buf, "GetMaxEndurance"), XS_Client_GetMaxEndurance, file, "$"); + newXSproto(strcpy(buf, "GetMemmedSpells"), XS_Client_GetMemmedSpells, file, "$"); newXSproto(strcpy(buf, "GetModCharacterFactionLevel"), XS_Client_GetModCharacterFactionLevel, file, "$$"); newXSproto(strcpy(buf, "GetMoney"), XS_Client_GetMoney, file, "$$$"); newXSproto(strcpy(buf, "GetPVP"), XS_Client_GetPVP, file, "$"); newXSproto(strcpy(buf, "GetPVPPoints"), XS_Client_GetPVPPoints, file, "$"); + newXSproto(strcpy(buf, "GetRaceBitmask"), XS_Client_GetRaceBitmask, file, "$"); newXSproto(strcpy(buf, "GetRadiantCrystals"), XS_Client_GetRadiantCrystals, file, "$"); newXSproto(strcpy(buf, "GetRaid"), XS_Client_GetRaid, file, "$"); newXSproto(strcpy(buf, "GetRaidPoints"), XS_Client_GetRaidPoints, file, "$"); newXSproto(strcpy(buf, "GetRawItemAC"), XS_Client_GetRawItemAC, file, "$"); newXSproto(strcpy(buf, "GetRawSkill"), XS_Client_GetRawSkill, file, "$$"); - newXSproto(strcpy(buf, "GetSkill"), XS_Client_GetSkill, file, "$$"); + newXSproto(strcpy(buf, "GetScribeableSpells"), XS_Client_GetScribeableSpells, file, "$;$$"); + newXSproto(strcpy(buf, "GetScribedSpells"), XS_Client_GetScribedSpells, file, "$"); newXSproto(strcpy(buf, "GetSkillPoints"), XS_Client_GetSkillPoints, file, "$"); newXSproto(strcpy(buf, "GetSpellBookSlotBySpellID"), XS_Client_GetSpellBookSlotBySpellID, file, "$$"); + newXSproto(strcpy(buf, "GetSpellIDByBookSlot"), XS_Client_GetSpellIDByBookSlot, file, "$$"); newXSproto(strcpy(buf, "GetSpentAA"), XS_Client_GetSpentAA, file, "$$"); newXSproto(strcpy(buf, "GetStartZone"), XS_Client_GetStartZone, file, "$"); - newXSproto(strcpy(buf, "GetTargetRingX"), XS_Client_GetTargetRingX, file, "$$"); - newXSproto(strcpy(buf, "GetTargetRingY"), XS_Client_GetTargetRingY, file, "$$"); - newXSproto(strcpy(buf, "GetTargetRingZ"), XS_Client_GetTargetRingZ, file, "$$"); + newXSproto(strcpy(buf, "GetTargetRingX"), XS_Client_GetTargetRingX, file, "$"); + newXSproto(strcpy(buf, "GetTargetRingY"), XS_Client_GetTargetRingY, file, "$"); + newXSproto(strcpy(buf, "GetTargetRingZ"), XS_Client_GetTargetRingZ, file, "$"); newXSproto(strcpy(buf, "GetTaskActivityDoneCount"), XS_Client_GetTaskActivityDoneCount, file, "$$$"); newXSproto(strcpy(buf, "GetThirst"), XS_Client_GetThirst, file, "$$"); newXSproto(strcpy(buf, "GetTotalSecondsPlayed"), XS_Client_GetTotalSecondsPlayed, file, "$"); @@ -6512,6 +5454,8 @@ XS(boot_Client) { newXSproto(strcpy(buf, "GrantAlternateAdvancementAbility"), XS_Client_GrantAlternateAdvancementAbility, file, "$$$;$"); newXSproto(strcpy(buf, "GuildID"), XS_Client_GuildID, file, "$"); newXSproto(strcpy(buf, "GuildRank"), XS_Client_GuildRank, file, "$"); + newXSproto(strcpy(buf, "HasDisciplineLearned"), XS_Client_HasDisciplineLearned, file, "$$"); + newXSproto(strcpy(buf, "HasExpeditionLockout"), XS_Client_HasExpeditionLockout, file, "$$$"); newXSproto(strcpy(buf, "HasSkill"), XS_Client_HasSkill, file, "$$"); newXSproto(strcpy(buf, "HasSpellScribed"), XS_Client_HasSkill, file, "$$"); newXSproto(strcpy(buf, "HasZoneFlag"), XS_Client_HasZoneFlag, file, "$$"); @@ -6543,17 +5487,28 @@ XS(boot_Client) { newXSproto(strcpy(buf, "MaxSkill"), XS_Client_MaxSkill, file, "$$;$$"); newXSproto(strcpy(buf, "MemSpell"), XS_Client_MemSpell, file, "$$$;$"); newXSproto(strcpy(buf, "MovePC"), XS_Client_MovePC, file, "$$$$$$"); + newXSproto(strcpy(buf, "MovePCDynamicZone"), XS_Client_MovePCDynamicZone, file, "$$;$$"); newXSproto(strcpy(buf, "MovePCInstance"), XS_Client_MovePCInstance, file, "$$$$$$$"); + newXSproto(strcpy(buf, "MoveZone"), XS_Client_MoveZone, file, "$$"); + newXSproto(strcpy(buf, "MoveZoneGroup"), XS_Client_MoveZoneGroup, file, "$$"); + newXSproto(strcpy(buf, "MoveZoneRaid"), XS_Client_MoveZoneRaid, file, "$$"); + newXSproto(strcpy(buf, "MoveZoneInstance"), XS_Client_MoveZoneInstance, file, "$$"); + newXSproto(strcpy(buf, "MoveZoneInstanceGroup"), XS_Client_MoveZoneInstanceGroup, file, "$$"); + newXSproto(strcpy(buf, "MoveZoneInstanceRaid"), XS_Client_MoveZoneInstanceRaid, file, "$$"); newXSproto(strcpy(buf, "NPCSpawn"), XS_Client_NPCSpawn, file, "$$$;$"); newXSproto(strcpy(buf, "NukeItem"), XS_Client_NukeItem, file, "$$;$"); newXSproto(strcpy(buf, "OpenLFGuildWindow"), XS_Client_OpenLFGuildWindow, file, "$"); + newXSproto(strcpy(buf, "NotifyNewTitlesAvailable"), XS_Client_NotifyNewTitlesAvailable, file, "$"); newXSproto(strcpy(buf, "PlayMP3"), XS_Client_PlayMP3, file, "$;$"); newXSproto(strcpy(buf, "Popup2"), XS_Client_Popup2, file, "$$$;$$$$$$$"); newXSproto(strcpy(buf, "QuestReward"), XS_Client_QuestReward, file, "$$;$$$$$$$"); newXSproto(strcpy(buf, "ReadBook"), XS_Client_ReadBook, file, "$$$"); newXSproto(strcpy(buf, "RefundAA"), XS_Client_RefundAA, file, "$$"); + newXSproto(strcpy(buf, "RemoveAllExpeditionLockouts"), XS_Client_RemoveAllExpeditionLockouts, file, "$;$"); + newXSproto(strcpy(buf, "RemoveExpeditionLockout"), XS_Client_RemoveExpeditionLockout, file, "$$$"); newXSproto(strcpy(buf, "RemoveNoRent"), XS_Client_RemoveNoRent, file, "$"); newXSproto(strcpy(buf, "ResetAA"), XS_Client_ResetAA, file, "$"); + newXSproto(strcpy(buf, "ResetDisciplineTimer"), XS_Client_ResetDisciplineTimer, file, "$$"); newXSproto(strcpy(buf, "ResetTrade"), XS_Client_ResetTrade, file, "$"); newXSproto(strcpy(buf, "Save"), XS_Client_Save, file, "$$"); newXSproto(strcpy(buf, "SaveBackup"), XS_Client_SaveBackup, file, "$"); @@ -6564,26 +5519,32 @@ XS(boot_Client) { newXSproto(strcpy(buf, "SendSound"), XS_Client_SendSound, file, "$"); newXSproto(strcpy(buf, "SendSpellAnim"), XS_Client_SendSpellAnim, file, "$$$"); newXSproto(strcpy(buf, "SendTargetCommand"), XS_Client_SendTargetCommand, file, "$$"); + newXSproto(strcpy(buf, "SendToGuildHall"), XS_Client_SendToGuildHall, file, "$"); newXSproto(strcpy(buf, "SendWebLink"), XS_Client_SendWebLink, file, "$:$"); newXSproto(strcpy(buf, "SendZoneFlagInfo"), XS_Client_SendZoneFlagInfo, file, "$$"); + newXSproto(strcpy(buf, "SetAAEXPModifier"), XS_Client_SetAAEXPModifier, file, "$$$"); newXSproto(strcpy(buf, "SetAAPoints"), XS_Client_SetAAPoints, file, "$$"); newXSproto(strcpy(buf, "SetAATitle"), XS_Client_SetAATitle, file, "$$;$"); newXSproto(strcpy(buf, "SetAccountFlag"), XS_Client_SetAccountFlag, file, "$$"); + newXSproto(strcpy(buf, "SetAFK"), XS_Client_SetAFK, file, "$$"); + newXSproto(strcpy(buf, "SetAnon"), XS_Client_SetAnon, file, "$$"); newXSproto(strcpy(buf, "SetAlternateCurrencyValue"), XS_Client_SetAlternateCurrencyValue, file, "$$$"); newXSproto(strcpy(buf, "SetBaseClass"), XS_Client_SetBaseClass, file, "$$"); newXSproto(strcpy(buf, "SetBaseGender"), XS_Client_SetBaseGender, file, "$$"); newXSproto(strcpy(buf, "SetBaseRace"), XS_Client_SetBaseRace, file, "$$"); newXSproto(strcpy(buf, "SetBecomeNPC"), XS_Client_SetBecomeNPC, file, "$$"); newXSproto(strcpy(buf, "SetBecomeNPCLevel"), XS_Client_SetBecomeNPCLevel, file, "$$"); - newXSproto(strcpy(buf, "SetBindPoint"), XS_Client_SetBindPoint, file, "$;$$$$$"); + newXSproto(strcpy(buf, "SetBindPoint"), XS_Client_SetBindPoint, file, "$;$$$$$$"); newXSproto(strcpy(buf, "SetConsumption"), XS_Client_SetConsumption, file, "$$$"); newXSproto(strcpy(buf, "SetClientMaxLevel"), XS_Client_SetClientMaxLevel, file, "$$"); newXSproto(strcpy(buf, "SetCustomItemData"), XS_Client_SetCustomItemData, file, "$$$$"); newXSproto(strcpy(buf, "SetDeity"), XS_Client_SetDeity, file, "$$"); newXSproto(strcpy(buf, "SetDueling"), XS_Client_SetDueling, file, "$$"); newXSproto(strcpy(buf, "SetDuelTarget"), XS_Client_SetDuelTarget, file, "$$"); + newXSproto(strcpy(buf, "SetEbonCrystals"), XS_Client_SetEbonCrystals, file, "$$"); newXSproto(strcpy(buf, "SetEndurance"), XS_Client_SetEndurance, file, "$$"); newXSproto(strcpy(buf, "SetEXP"), XS_Client_SetEXP, file, "$$$;$"); + newXSproto(strcpy(buf, "SetEXPModifier"), XS_Client_SetEXPModifier, file, "$$$"); newXSproto(strcpy(buf, "SetFactionLevel"), XS_Client_SetFactionLevel, file, "$$$$$$"); newXSproto(strcpy(buf, "SetFactionLevel2"), XS_Client_SetFactionLevel2, file, "$$$$$$$"); newXSproto(strcpy(buf, "SetFeigned"), XS_Client_SetFeigned, file, "$$"); @@ -6594,16 +5555,16 @@ XS(boot_Client) { newXSproto(strcpy(buf, "SetMaterial"), XS_Client_SetMaterial, file, "$$$"); newXSproto(strcpy(buf, "SetPrimaryWeaponOrnamentation"), XS_Client_SetPrimaryWeaponOrnamentation, file, "$$"); newXSproto(strcpy(buf, "SetPVP"), XS_Client_SetPVP, file, "$$"); + newXSproto(strcpy(buf, "SetRadiantCrystals"), XS_Client_SetRadiantCrystals, file, "$$"); newXSproto(strcpy(buf, "SetSecondaryWeaponOrnamentation"), XS_Client_SetSecondaryWeaponOrnamentation, file, "$$"); newXSproto(strcpy(buf, "SetSkill"), XS_Client_SetSkill, file, "$$$"); newXSproto(strcpy(buf, "SetSkillPoints"), XS_Client_SetSkillPoints, file, "$$"); - newXSproto(strcpy(buf, "SetStartZone"), XS_Client_SetStartZone, file, "$$"); + newXSproto(strcpy(buf, "SetStartZone"), XS_Client_SetStartZone, file, "$$;$$$$"); newXSproto(strcpy(buf, "SetStats"), XS_Client_SetStats, file, "$$$"); newXSproto(strcpy(buf, "SetThirst"), XS_Client_SetThirst, file, "$$"); newXSproto(strcpy(buf, "SetTint"), XS_Client_SetTint, file, "$$$"); newXSproto(strcpy(buf, "SetTitleSuffix"), XS_Client_SetTitleSuffix, file, "$$;$"); newXSproto(strcpy(buf, "SetZoneFlag"), XS_Client_SetZoneFlag, file, "$$"); - newXSproto(strcpy(buf, "SignalClient"), XS_Client_SignalClient, file, "$"); newXSproto(strcpy(buf, "SilentMessage"), XS_Client_SilentMessage, file, "$$"); newXSproto(strcpy(buf, "SlotConvert2"), XS_Client_SlotConvert2, file, "$$"); newXSproto(strcpy(buf, "Stand"), XS_Client_Stand, file, "$"); diff --git a/zone/perl_doors.cpp b/zone/perl_doors.cpp index 8c4f4ea98..b922b5091 100644 --- a/zone/perl_doors.cpp +++ b/zone/perl_doors.cpp @@ -42,24 +42,29 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_DOOR \ + do { \ + if (sv_derived_from(ST(0), "Doors")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Doors*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Doors"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_Doors_GetDoorDBID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetDoorDBID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetDoorDBID(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetDoorDBID(THIS)"); // @categories Doors { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetDoorDBID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -71,20 +76,12 @@ XS(XS_Doors_GetDoorID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetDoorID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetDoorID(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetDoorID(THIS)"); // @categories Doors { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetDoorID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -96,20 +93,12 @@ XS(XS_Doors_GetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetID(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetID(THIS)"); // @categories Doors { Doors *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetEntityID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -121,20 +110,12 @@ XS(XS_Doors_GetX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetX(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetX(THIS)"); // @categories Doors { Doors *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetPosition().x; XSprePUSH; PUSHn((double) RETVAL); @@ -146,20 +127,12 @@ XS(XS_Doors_GetY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetY(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetY(THIS)"); // @categories Doors { Doors *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetPosition().y; XSprePUSH; PUSHn((double) RETVAL); @@ -171,20 +144,12 @@ XS(XS_Doors_GetZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetZ(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetZ(THIS)"); // @categories Doors { Doors *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetPosition().z; XSprePUSH; PUSHn((double) RETVAL); @@ -196,20 +161,12 @@ XS(XS_Doors_GetHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetHeading) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetHeading(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetHeading(THIS)"); // @categories Doors { Doors *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetPosition().w; XSprePUSH; PUSHn((double) RETVAL); @@ -221,20 +178,12 @@ XS(XS_Doors_GetOpenType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetOpenType) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetOpenType(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetOpenType(THIS)"); // @categories Doors { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetOpenType(); XSprePUSH; PUSHu((UV) RETVAL); @@ -246,20 +195,12 @@ XS(XS_Doors_GetLockpick); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetLockpick) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetLockpick(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetLockpick(THIS)"); // @categories Doors, Skills and Recipes { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetLockpick(); XSprePUSH; PUSHu((UV) RETVAL); @@ -271,20 +212,12 @@ XS(XS_Doors_GetKeyItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetKeyItem) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetKeyItem(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetKeyItem(THIS)"); // @categories Doors { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetKeyItem(); XSprePUSH; PUSHu((UV) RETVAL); @@ -296,19 +229,11 @@ XS(XS_Doors_GetNoKeyring); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetNoKeyring) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::GetNoKeyring(THIS, uint8 type)"); + Perl_croak(aTHX_ "Usage: Doors::GetNoKeyring(THIS, uint8 type)"); // @categories Doors { Doors *THIS; uint8 type = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->GetNoKeyring(); } XSRETURN_EMPTY; @@ -318,20 +243,12 @@ XS(XS_Doors_GetIncline); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetIncline) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetIncline(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetIncline(THIS)"); // @categories Doors { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetIncline(); XSprePUSH; PUSHu((UV) RETVAL); @@ -348,15 +265,7 @@ XS(XS_Doors_GetSize) { Doors *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetSize(); XSprePUSH; PUSHu((UV) RETVAL); @@ -369,19 +278,11 @@ XS(XS_Doors_SetOpenType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetOpenType) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetOpenType(THIS, uint32 open_type)"); + Perl_croak(aTHX_ "Usage: Doors::SetOpenType(THIS, uint32 open_type)"); // @categories Doors { Doors *THIS; uint32 type = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetOpenType(type); } XSRETURN_EMPTY; @@ -391,19 +292,11 @@ XS(XS_Doors_SetLockpick); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetLockpick) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetLockpick(THIS, uint32 lockpick_type)"); + Perl_croak(aTHX_ "Usage: Doors::SetLockpick(THIS, uint32 lockpick_type)"); // @categories Doors { Doors *THIS; uint32 type = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetLockpick(type); } XSRETURN_EMPTY; @@ -413,19 +306,11 @@ XS(XS_Doors_SetKeyItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetKeyItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetKeyItem(THIS, uint32 key_item_id)"); + Perl_croak(aTHX_ "Usage: Doors::SetKeyItem(THIS, uint32 key_item_id)"); // @categories Doors { Doors *THIS; uint32 type = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetKeyItem(type); } XSRETURN_EMPTY; @@ -435,19 +320,11 @@ XS(XS_Doors_SetNoKeyring); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetNoKeyring) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetNoKeyring(THIS, uint8 no_key_ring)"); + Perl_croak(aTHX_ "Usage: Doors::SetNoKeyring(THIS, uint8 no_key_ring)"); // @categories Doors { Doors *THIS; uint8 type = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetNoKeyring(type); } XSRETURN_EMPTY; @@ -457,19 +334,11 @@ XS(XS_Doors_SetIncline); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetIncline) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetIncline(THIS, uint32 incline)"); + Perl_croak(aTHX_ "Usage: Doors::SetIncline(THIS, uint32 incline)"); // @categories Doors { Doors *THIS; uint32 type = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetIncline(type); } XSRETURN_EMPTY; @@ -479,19 +348,11 @@ XS(XS_Doors_SetSize); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetSize) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetSize(THIS, uint32 size)"); + Perl_croak(aTHX_ "Usage: Doors::SetSize(THIS, uint32 size)"); // @categories Doors { Doors *THIS; uint32 type = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetSize(type); } XSRETURN_EMPTY; @@ -501,21 +362,13 @@ XS(XS_Doors_SetLocation); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetLocation) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Doors::SetLocation(THIS, float x, float y, float z)"); + Perl_croak(aTHX_ "Usage: Doors::SetLocation(THIS, float x, float y, float z)"); // @categories Doors { Doors *THIS; float x = (float) SvNV(ST(1)); float y = (float) SvNV(ST(2)); float z = (float) SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->SetLocation(x, y, z); } XSRETURN_EMPTY; @@ -525,18 +378,11 @@ XS(XS_Doors_SetX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetX) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetX(THIS, float x)"); + Perl_croak(aTHX_ "Usage: Doors::SetX(THIS, float x)"); // @categories Doors { Doors *THIS; float x = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); + VALIDATE_THIS_IS_DOOR; auto position = THIS->GetPosition(); position.x = x; THIS->SetPosition(position); @@ -548,19 +394,11 @@ XS(XS_Doors_SetY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetY) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetY(THIS, float y)"); + Perl_croak(aTHX_ "Usage: Doors::SetY(THIS, float y)"); // @categories Doors { Doors *THIS; float y = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; auto position = THIS->GetPosition(); position.y = y; THIS->SetPosition(position); @@ -572,19 +410,11 @@ XS(XS_Doors_SetZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetZ) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetZ(THIS, float z)"); + Perl_croak(aTHX_ "Usage: Doors::SetZ(THIS, float z)"); // @categories Doors { Doors *THIS; float z = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; auto position = THIS->GetPosition(); position.z = z; THIS->SetPosition(position); @@ -596,19 +426,11 @@ XS(XS_Doors_SetHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetHeading) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Doors::SetHeading(THIS, float heading)"); + Perl_croak(aTHX_ "Usage: Doors::SetHeading(THIS, float heading)"); // @categories Doors { Doors *THIS; float heading = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; auto position = THIS->GetPosition(); position.w = heading; THIS->SetPosition(position); @@ -620,19 +442,11 @@ XS(XS_Doors_SetModelName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_SetModelName) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Doors::SetModelName(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Doors::SetModelName(THIS, string name)"); // @categories Doors { Doors *THIS; char *name = nullptr; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; if (items > 1) { name = (char *) SvPV_nolen(ST(1)); } THIS->SetDoorName(name); @@ -643,20 +457,12 @@ XS(XS_Doors_GetModelName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_GetModelName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::GetModelName(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::GetModelName(THIS)"); // @categories Doors { Doors *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; RETVAL = THIS->GetDoorName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -669,18 +475,10 @@ XS(XS_Doors_CreateDatabaseEntry); /* prototype to pass -Wmissing-prototypes */ XS(XS_Doors_CreateDatabaseEntry) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Doors::InsertDoor(THIS)"); + Perl_croak(aTHX_ "Usage: Doors::InsertDoor(THIS)"); // @categories Doors { Doors *THIS; - - if (sv_derived_from(ST(0), "Doors")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Doors *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Doors"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_DOOR; THIS->CreateDatabaseEntry(); } XSRETURN_EMPTY; diff --git a/zone/perl_entity.cpp b/zone/perl_entity.cpp index 0f7fe21c7..c2b3d6a32 100644 --- a/zone/perl_entity.cpp +++ b/zone/perl_entity.cpp @@ -43,25 +43,29 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_ENTITY \ + do { \ + if (sv_derived_from(ST(0), "EntityList")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(EntityList*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type EntityList"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); XS(XS_EntityList_GetMobID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetMobID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetMobID(THIS, id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetMobID(THIS, id)"); // @categories Script Utility { EntityList *THIS; Mob *RETVAL; uint16 id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetMobID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -78,15 +82,7 @@ XS(XS_EntityList_GetMob) { EntityList *THIS; Mob *RETVAL; char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetMob(name); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -98,20 +94,12 @@ XS(XS_EntityList_GetMobByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetMobByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetMobByID(THIS, id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetMobByID(THIS, id)"); // @categories Script Utility { EntityList *THIS; Mob *RETVAL; uint16 id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetMob(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -123,20 +111,12 @@ XS(XS_EntityList_GetMobByNpcTypeID); /* prototype to pass -Wmissing-prototypes * XS(XS_EntityList_GetMobByNpcTypeID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetMobByNpcTypeID(THIS, get_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetMobByNpcTypeID(THIS, get_id)"); // @categories Script Utility { EntityList *THIS; Mob *RETVAL; uint32 get_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetMobByNpcTypeID(get_id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -148,20 +128,12 @@ XS(XS_EntityList_IsMobSpawnedByNpcTypeID); /* prototype pass -Wmissing-prototype XS(XS_EntityList_IsMobSpawnedByNpcTypeID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::ValidMobByNpcTypeID(THIS, get_id)"); + Perl_croak(aTHX_ "Usage: EntityList::ValidMobByNpcTypeID(THIS, get_id)"); // @categories Script Utility { EntityList *THIS; bool RETVAL; uint32 get_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->IsMobSpawnedByNpcTypeID(get_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -173,20 +145,12 @@ XS(XS_EntityList_GetNPCByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetNPCByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetNPCByID(THIS, id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetNPCByID(THIS, id)"); // @categories Script Utility { EntityList *THIS; NPC *RETVAL; uint16 id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetNPCByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "NPC", (void *) RETVAL); @@ -198,20 +162,12 @@ XS(XS_EntityList_GetNPCByNPCTypeID); /* prototype to pass -Wmissing-prototypes * XS(XS_EntityList_GetNPCByNPCTypeID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetNPCByNPCTypeID(THIS, npc_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetNPCByNPCTypeID(THIS, npc_id)"); // @categories Script Utility { EntityList *THIS; NPC *RETVAL; uint32 npc_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetNPCByNPCTypeID(npc_id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "NPC", (void *) RETVAL); @@ -219,24 +175,33 @@ XS(XS_EntityList_GetNPCByNPCTypeID) { XSRETURN(1); } +XS(XS_EntityList_GetNPCBySpawnID); /* prototype to pass -Wmissing-prototypes */ +XS(XS_EntityList_GetNPCBySpawnID) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: EntityList::GetNPCBySpawnID(THIS, spawn_id)"); // @categories Script Utility, Spawns + { + EntityList *THIS; + NPC *RETVAL; + uint32 spawn_id = (uint32) SvUV(ST(1)); + VALIDATE_THIS_IS_ENTITY; + RETVAL = THIS->GetNPCBySpawnID(spawn_id); + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "NPC", (void *) RETVAL); + } + XSRETURN(1); +} + XS(XS_EntityList_GetClientByName); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetClientByName) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetClientByName(THIS, name)"); + Perl_croak(aTHX_ "Usage: EntityList::GetClientByName(THIS, name)"); // @categories Account and Character, Script Utility { EntityList *THIS; Client *RETVAL; char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetClientByName(name); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -248,20 +213,12 @@ XS(XS_EntityList_GetClientByAccID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetClientByAccID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetClientByAccID(THIS, uint32 account_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetClientByAccID(THIS, uint32 account_id)"); // @categories Account and Character, Script Utility { EntityList *THIS; Client *RETVAL; uint32 accid = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetClientByAccID(accid); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -273,20 +230,12 @@ XS(XS_EntityList_GetClientByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetClientByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetClientByID(THIS, uint16 client_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetClientByID(THIS, uint16 client_id)"); // @categories Account and Character, Script Utility { EntityList *THIS; Client *RETVAL; uint16 id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetClientByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -298,20 +247,12 @@ XS(XS_EntityList_GetClientByCharID); /* prototype to pass -Wmissing-prototypes * XS(XS_EntityList_GetClientByCharID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetClientByCharID(THIS, uint32 character_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetClientByCharID(THIS, uint32 character_id)"); // @categories Account and Character, Script Utility { EntityList *THIS; Client *RETVAL; uint32 iCharID = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetClientByCharID(iCharID); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -323,20 +264,12 @@ XS(XS_EntityList_GetClientByWID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetClientByWID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetClientByWID(THIS, uint32 wid)"); + Perl_croak(aTHX_ "Usage: EntityList::GetClientByWID(THIS, uint32 wid)"); // @categories Account and Character, Script Utility { EntityList *THIS; Client *RETVAL; uint32 iWID = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetClientByWID(iWID); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -348,20 +281,12 @@ XS(XS_EntityList_GetObjectByDBID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetObjectByDBID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetObjectByDBID(THIS, uint32 database_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetObjectByDBID(THIS, uint32 database_id)"); // @categories Script Utility, Objects { EntityList *THIS; Object *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetObjectByDBID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Object", (void *) RETVAL); @@ -373,20 +298,12 @@ XS(XS_EntityList_GetObjectByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetObjectByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetObjectByID(THIS, uint32 entity_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetObjectByID(THIS, uint32 entity_id)"); // @categories Script Utility, Objects { EntityList *THIS; Object *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetObjectByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Object", (void *) RETVAL); @@ -398,20 +315,12 @@ XS(XS_EntityList_GetDoorsByDBID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetDoorsByDBID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetDoorsByDBID(THIS, uint32 database_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetDoorsByDBID(THIS, uint32 database_id)"); // @categories Script Utility, Doors { EntityList *THIS; Doors *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetDoorsByDBID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Doors", (void *) RETVAL); @@ -423,20 +332,12 @@ XS(XS_EntityList_GetDoorsByDoorID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetDoorsByDoorID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetDoorsByDoorID(THIS, uint32 door_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetDoorsByDoorID(THIS, uint32 door_id)"); // @categories Script Utility, Doors { EntityList *THIS; Doors *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetDoorsByDoorID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Doors", (void *) RETVAL); @@ -448,20 +349,12 @@ XS(XS_EntityList_GetDoorsByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetDoorsByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetDoorsByID(THIS, uint32 entity_id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetDoorsByID(THIS, uint32 entity_id)"); // @categories Script Utility, Doors { EntityList *THIS; Doors *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetDoorsByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Doors", (void *) RETVAL); @@ -473,20 +366,12 @@ XS(XS_EntityList_FindDoor); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_FindDoor) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::FindDoor(THIS, uint32 door_id)"); + Perl_croak(aTHX_ "Usage: EntityList::FindDoor(THIS, uint32 door_id)"); // @categories Script Utility, Doors { EntityList *THIS; Doors *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->FindDoor(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Doors", (void *) RETVAL); @@ -498,20 +383,12 @@ XS(XS_EntityList_GetGroupByMob); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetGroupByMob) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetGroupByMob(THIS, Mob* mob)"); + Perl_croak(aTHX_ "Usage: EntityList::GetGroupByMob(THIS, Mob* mob)"); // @categories Account and Character, Script Utility, Group { EntityList *THIS; Group *RETVAL; Mob *mob; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -531,20 +408,12 @@ XS(XS_EntityList_GetGroupByClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetGroupByClient) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetGroupByClient(THIS, Client* client)"); + Perl_croak(aTHX_ "Usage: EntityList::GetGroupByClient(THIS, Client* client)"); // @categories Account and Character, Script Utility, Group { EntityList *THIS; Group *RETVAL; Client *client; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); client = INT2PTR(Client *, tmp); @@ -564,20 +433,12 @@ XS(XS_EntityList_GetGroupByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetGroupByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetGroupByID(THIS, id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetGroupByID(THIS, id)"); // @categories Account and Character, Script Utility, Group { EntityList *THIS; Group *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetGroupByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Group", (void *) RETVAL); @@ -589,20 +450,12 @@ XS(XS_EntityList_GetGroupByLeaderName); /* prototype to pass -Wmissing-prototype XS(XS_EntityList_GetGroupByLeaderName) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetGroupByLeaderName(THIS, leader)"); + Perl_croak(aTHX_ "Usage: EntityList::GetGroupByLeaderName(THIS, leader)"); // @categories Account and Character, Script Utility, Group { EntityList *THIS; Group *RETVAL; char *leader = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetGroupByLeaderName(leader); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Group", (void *) RETVAL); @@ -614,20 +467,12 @@ XS(XS_EntityList_GetRaidByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetRaidByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetRaidByID(THIS, id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetRaidByID(THIS, id)"); // @categories Script Utility, Raid { EntityList *THIS; Raid *RETVAL; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetRaidByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Raid", (void *) RETVAL); @@ -639,20 +484,12 @@ XS(XS_EntityList_GetRaidByClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetRaidByClient) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetRaidByClient(THIS, client)"); + Perl_croak(aTHX_ "Usage: EntityList::GetRaidByClient(THIS, client)"); // @categories Account and Character, Script Utility, Raid { EntityList *THIS; Raid *RETVAL; Client *client; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); client = INT2PTR(Client *, tmp); @@ -672,20 +509,12 @@ XS(XS_EntityList_GetCorpseByOwner); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetCorpseByOwner) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetCorpseByOwner(THIS, client)"); + Perl_croak(aTHX_ "Usage: EntityList::GetCorpseByOwner(THIS, client)"); // @categories Script Utility, Corpse { EntityList *THIS; Corpse *RETVAL; Client *client; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); client = INT2PTR(Client *, tmp); @@ -705,20 +534,12 @@ XS(XS_EntityList_GetCorpseByID); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetCorpseByID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetCorpseByID(THIS, id)"); + Perl_croak(aTHX_ "Usage: EntityList::GetCorpseByID(THIS, id)"); // @categories Script Utility, Corpse { EntityList *THIS; Corpse *RETVAL; uint16 id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetCorpseByID(id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Corpse", (void *) RETVAL); @@ -730,20 +551,12 @@ XS(XS_EntityList_GetCorpseByName); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetCorpseByName) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::GetCorpseByName(THIS, name)"); + Perl_croak(aTHX_ "Usage: EntityList::GetCorpseByName(THIS, name)"); // @categories Script Utility, Corpse { EntityList *THIS; Corpse *RETVAL; char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->GetCorpseByName(name); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Corpse", (void *) RETVAL); @@ -755,18 +568,10 @@ XS(XS_EntityList_ClearClientPetitionQueue); /* prototype to pass -Wmissing-proto XS(XS_EntityList_ClearClientPetitionQueue) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::ClearClientPetitionQueue(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::ClearClientPetitionQueue(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->ClearClientPetitionQueue(); } XSRETURN_EMPTY; @@ -776,20 +581,12 @@ XS(XS_EntityList_CanAddHateForMob); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_CanAddHateForMob) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::CanAddHateForMob(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: EntityList::CanAddHateForMob(THIS, Mob* target)"); // @categories Script Utility, Hate and Aggro { EntityList *THIS; bool RETVAL; Mob *p; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); p = INT2PTR(Mob *, tmp); @@ -809,18 +606,10 @@ XS(XS_EntityList_Clear); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_Clear) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::Clear(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::Clear(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->Clear(); } XSRETURN_EMPTY; @@ -830,20 +619,12 @@ XS(XS_EntityList_RemoveMob); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveMob) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveMob(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveMob(THIS, delete_id)"); // @categories Script Utility { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveMob(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -855,20 +636,12 @@ XS(XS_EntityList_RemoveClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveClient) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveClient(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveClient(THIS, delete_id)"); // @categories Account and Character, Script Utility { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveClient(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -880,20 +653,12 @@ XS(XS_EntityList_RemoveNPC); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveNPC) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveNPC(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveNPC(THIS, delete_id)"); // @categories Script Utility { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveNPC(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -905,20 +670,12 @@ XS(XS_EntityList_RemoveGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveGroup) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveGroup(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveGroup(THIS, delete_id)"); // @categories Script Utility, Group { EntityList *THIS; bool RETVAL; uint32 delete_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveGroup(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -930,20 +687,12 @@ XS(XS_EntityList_RemoveCorpse); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveCorpse) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveCorpse(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveCorpse(THIS, delete_id)"); // @categories Corpse { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveCorpse(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -955,20 +704,12 @@ XS(XS_EntityList_RemoveDoor); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveDoor) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveDoor(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveDoor(THIS, delete_id)"); // @categories Doors { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveDoor(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -980,20 +721,12 @@ XS(XS_EntityList_RemoveTrap); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveTrap) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveTrap(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveTrap(THIS, delete_id)"); // @categories Script Utility { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveTrap(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1005,20 +738,12 @@ XS(XS_EntityList_RemoveObject); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveObject) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveObject(THIS, delete_id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveObject(THIS, delete_id)"); // @categories Script Utility, Objects { EntityList *THIS; bool RETVAL; uint16 delete_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->RemoveObject(delete_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1030,18 +755,10 @@ XS(XS_EntityList_RemoveAllMobs); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllMobs) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllMobs(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllMobs(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllMobs(); } XSRETURN_EMPTY; @@ -1051,18 +768,10 @@ XS(XS_EntityList_RemoveAllClients); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllClients) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllClients(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllClients(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllClients(); } XSRETURN_EMPTY; @@ -1072,18 +781,10 @@ XS(XS_EntityList_RemoveAllNPCs); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllNPCs) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllNPCs(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllNPCs(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllNPCs(); } XSRETURN_EMPTY; @@ -1093,18 +794,10 @@ XS(XS_EntityList_RemoveAllGroups); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllGroups) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllGroups(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllGroups(THIS)"); // @categories Group { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllGroups(); } XSRETURN_EMPTY; @@ -1114,18 +807,10 @@ XS(XS_EntityList_RemoveAllCorpses); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllCorpses) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllCorpses(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllCorpses(THIS)"); // @categories Corpse { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllCorpses(); } XSRETURN_EMPTY; @@ -1135,18 +820,10 @@ XS(XS_EntityList_RemoveAllDoors); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllDoors) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllDoors(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllDoors(THIS)"); // @categories Doors { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllDoors(); } XSRETURN_EMPTY; @@ -1156,18 +833,10 @@ XS(XS_EntityList_RemoveAllTraps); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllTraps) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllTraps(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllTraps(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllTraps(); } XSRETURN_EMPTY; @@ -1177,18 +846,10 @@ XS(XS_EntityList_RemoveAllObjects); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveAllObjects) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::RemoveAllObjects(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveAllObjects(THIS)"); // @categories Objects { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveAllObjects(); } XSRETURN_EMPTY; @@ -1198,21 +859,13 @@ XS(XS_EntityList_Message); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_Message) { dXSARGS; if (items < 4) - Perl_croak(aTHX_ "Usage: EntityList::Message(THIS, uint32 guild_id, uint32 emote_color_type, string message)"); + Perl_croak(aTHX_ "Usage: EntityList::Message(THIS, uint32 guild_id, uint32 emote_color_type, string message)"); // @categories Script Utility { EntityList *THIS; uint32 to_guilddbid = (uint32) SvUV(ST(1)); uint32 type = (uint32) SvUV(ST(2)); char *message = (char *) SvPV_nolen(ST(3)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->Message(to_guilddbid, type, message); } XSRETURN_EMPTY; @@ -1222,22 +875,14 @@ XS(XS_EntityList_MessageStatus); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_MessageStatus) { dXSARGS; if (items < 5) - Perl_croak(aTHX_ "Usage: EntityList::MessageStatus(THIS, uint32 guild_id, uint32 emote_color_type, string message)"); + Perl_croak(aTHX_ "Usage: EntityList::MessageStatus(THIS, uint32 guild_id, uint32 emote_color_type, string message)"); // @categories Script Utility { EntityList *THIS; uint32 to_guilddbid = (uint32) SvUV(ST(1)); int to_minstatus = (int) SvIV(ST(2)); uint32 type = (uint32) SvUV(ST(3)); char *message = (char *) SvPV_nolen(ST(4)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->MessageStatus(to_guilddbid, to_minstatus, type, message); } XSRETURN_EMPTY; @@ -1255,15 +900,7 @@ XS(XS_EntityList_MessageClose) { float dist = (float) SvNV(ST(3)); uint32 type = (uint32) SvUV(ST(4)); char *message = (char *) SvPV_nolen(ST(5)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); sender = INT2PTR(Mob *, tmp); @@ -1281,19 +918,11 @@ XS(XS_EntityList_RemoveFromTargets); /* prototype to pass -Wmissing-prototypes * XS(XS_EntityList_RemoveFromTargets) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveFromTargets(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveFromTargets(THIS, Mob* target)"); // @categories Script Utility { EntityList *THIS; Mob *mob; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -1311,20 +940,12 @@ XS(XS_EntityList_ReplaceWithTarget); /* prototype to pass -Wmissing-prototypes * XS(XS_EntityList_ReplaceWithTarget) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: EntityList::ReplaceWithTarget(THIS, Mob* old_mob, Mob* new_target)"); + Perl_croak(aTHX_ "Usage: EntityList::ReplaceWithTarget(THIS, Mob* old_mob, Mob* new_target)"); // @categories Script Utility { EntityList *THIS; Mob *pOldMob; Mob *pNewTarget; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); pOldMob = INT2PTR(Mob *, tmp); @@ -1350,19 +971,11 @@ XS(XS_EntityList_OpenDoorsNear); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_OpenDoorsNear) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::OpenDoorsNear(THIS, NPC* opener)"); + Perl_croak(aTHX_ "Usage: EntityList::OpenDoorsNear(THIS, NPC* opener)"); // @categories Script Utility, Doors { EntityList *THIS; Mob *opener; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); opener = INT2PTR(Mob *, tmp); @@ -1380,21 +993,13 @@ XS(XS_EntityList_MakeNameUnique); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_MakeNameUnique) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::MakeNameUnique(THIS, string name)"); + Perl_croak(aTHX_ "Usage: EntityList::MakeNameUnique(THIS, string name)"); // @categories Script Utility { EntityList *THIS; char *RETVAL; dXSTARG; char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->MakeNameUnique(name); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -1425,20 +1030,12 @@ XS(XS_EntityList_SignalMobsByNPCID); /* prototype to pass -Wmissing-prototypes * XS(XS_EntityList_SignalMobsByNPCID) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: EntityList::SignalMobsByNPCID(THIS, uint32 npc_type_id, int signal_id)"); + Perl_croak(aTHX_ "Usage: EntityList::SignalMobsByNPCID(THIS, uint32 npc_type_id, int signal_id)"); // @categories Script Utility { EntityList *THIS; uint32 npc_type = (uint32) SvUV(ST(1)); int signal_id = (int) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->SignalMobsByNPCID(npc_type, signal_id); } XSRETURN_EMPTY; @@ -1448,19 +1045,11 @@ XS(XS_EntityList_RemoveEntity); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_RemoveEntity) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::RemoveEntity(THIS, uint16 id)"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveEntity(THIS, uint16 id)"); // @categories Script Utility { EntityList *THIS; uint16 id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; THIS->RemoveEntity(id); } XSRETURN_EMPTY; @@ -1470,20 +1059,12 @@ XS(XS_EntityList_DeleteNPCCorpses); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_DeleteNPCCorpses) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::DeleteNPCCorpses(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::DeleteNPCCorpses(THIS)"); // @categories Corpse { EntityList *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->DeleteNPCCorpses(); XSprePUSH; PUSHi((IV) RETVAL); @@ -1495,20 +1076,12 @@ XS(XS_EntityList_DeletePlayerCorpses); /* prototype to pass -Wmissing-prototypes XS(XS_EntityList_DeletePlayerCorpses) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::DeletePlayerCorpses(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::DeletePlayerCorpses(THIS)"); // @categories Account and Character, Corpse { EntityList *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; RETVAL = THIS->DeletePlayerCorpses(); XSprePUSH; PUSHi((IV) RETVAL); @@ -1520,19 +1093,11 @@ XS(XS_EntityList_HalveAggro); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_HalveAggro) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::HalveAggro(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: EntityList::HalveAggro(THIS, Mob* target)"); // @categories Script Utility, Hate and Aggro { EntityList *THIS; Mob *who; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); who = INT2PTR(Mob *, tmp); @@ -1550,19 +1115,11 @@ XS(XS_EntityList_DoubleAggro); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_DoubleAggro) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::DoubleAggro(THIS, *Mob target)"); + Perl_croak(aTHX_ "Usage: EntityList::DoubleAggro(THIS, *Mob target)"); // @categories Script Utility { EntityList *THIS; Mob *who; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); who = INT2PTR(Mob *, tmp); @@ -1580,19 +1137,11 @@ XS(XS_EntityList_ClearFeignAggro); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_ClearFeignAggro) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::ClearFeignAggro(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: EntityList::ClearFeignAggro(THIS, Mob* target)"); // @categories Script Utility { EntityList *THIS; Mob *targ; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); targ = INT2PTR(Mob *, tmp); @@ -1610,20 +1159,12 @@ XS(XS_EntityList_Fighting); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_Fighting) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::Fighting(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: EntityList::Fighting(THIS, Mob* target)"); // @categories Script Utility { EntityList *THIS; bool RETVAL; Mob *targ; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); targ = INT2PTR(Mob *, tmp); @@ -1643,20 +1184,12 @@ XS(XS_EntityList_RemoveFromHateLists); /* prototype to pass -Wmissing-prototypes XS(XS_EntityList_RemoveFromHateLists) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: EntityList::RemoveFromHateLists(THIS, Mob* mob, [bool set_to_one = false])"); + Perl_croak(aTHX_ "Usage: EntityList::RemoveFromHateLists(THIS, Mob* mob, [bool set_to_one = false])"); // @categories Script Utility, Hate and Aggro { EntityList *THIS; Mob *mob; bool settoone; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -1680,22 +1213,14 @@ XS(XS_EntityList_MessageGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_MessageGroup) { dXSARGS; if (items < 5) - Perl_croak(aTHX_ "Usage: EntityList::MessageGroup(THIS, Mob* sender, bool skip_close, uint32 emote_color_type, string message)"); + Perl_croak(aTHX_ "Usage: EntityList::MessageGroup(THIS, Mob* sender, bool skip_close, uint32 emote_color_type, string message)"); // @categories Script Utility, Group { EntityList *THIS; Mob *sender; bool skipclose = (bool) SvTRUE(ST(2)); uint32 type = (uint32) SvUV(ST(3)); char *message = (char *) SvPV_nolen(ST(4)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); sender = INT2PTR(Mob *, tmp); @@ -1713,7 +1238,7 @@ XS(XS_EntityList_GetRandomClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_GetRandomClient) { dXSARGS; if ((items < 5) || (items > 6)) - Perl_croak(aTHX_ "Usage: EntityList::GetRandomClient(THIS, float x, float y, float z, float distance, [Client* exclude_client = nullptr])"); + Perl_croak(aTHX_ "Usage: EntityList::GetRandomClient(THIS, float x, float y, float z, float distance, [Client* exclude_client = nullptr])"); // @categories Account and Character, Script Utility { EntityList *THIS; Client *RETVAL, *c = nullptr; @@ -1721,16 +1246,7 @@ XS(XS_EntityList_GetRandomClient) { float y = (float) SvNV(ST(2)); float z = (float) SvNV(ST(3)); float d = (float) SvNV(ST(4)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; if (items == 6) { if (sv_derived_from(ST(5), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(5))); @@ -1749,19 +1265,10 @@ XS(XS_EntityList_GetMobList) { dXSARGS; int num_mobs = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::GetMobList(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::GetMobList(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; std::list mob_list; entity_list.GetMobList(mob_list); auto iter = mob_list.begin(); @@ -1783,19 +1290,10 @@ XS(XS_EntityList_GetClientList) { dXSARGS; int num_clients = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::GetClientList(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::GetClientList(THIS)"); // @categories Account and Character, Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; std::list client_list; entity_list.GetClientList(client_list); auto iter = client_list.begin(); @@ -1817,19 +1315,10 @@ XS(XS_EntityList_GetNPCList) { dXSARGS; int num_npcs = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::GetNPCList(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::GetNPCList(THIS)"); // @categories Script Utility { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; std::list npc_list; entity_list.GetNPCList(npc_list); auto iter = npc_list.begin(); @@ -1851,19 +1340,10 @@ XS(XS_EntityList_GetCorpseList) { dXSARGS; int num_corpses = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::GetCorpseList(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::GetCorpseList(THIS)"); // @categories Script Utility, Corpse { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; std::list corpse_list; entity_list.GetCorpseList(corpse_list); auto iter = corpse_list.begin(); @@ -1885,19 +1365,10 @@ XS(XS_EntityList_GetObjectList) { dXSARGS; int num_objects = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::GetObjectList(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::GetObjectList(THIS)"); // @categories Script Utility, Objects { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; std::list object_list; entity_list.GetObjectList(object_list); auto iter = object_list.begin(); @@ -1919,19 +1390,10 @@ XS(XS_EntityList_GetDoorsList) { dXSARGS; int num_objects = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: EntityList::GetDoorsList(THIS)"); + Perl_croak(aTHX_ "Usage: EntityList::GetDoorsList(THIS)"); // @categories Script Utility, Doors { EntityList *THIS; - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; std::list door_list; entity_list.GetDoorsList(door_list); auto iter = door_list.begin(); @@ -1952,20 +1414,11 @@ XS(XS_EntityList_SignalAllClients); /* prototype to pass -Wmissing-prototypes */ XS(XS_EntityList_SignalAllClients) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: EntityList::SignalAllClients(THIS, uint32 data)"); + Perl_croak(aTHX_ "Usage: EntityList::SignalAllClients(THIS, uint32 data)"); // @categories Script Utility { EntityList *THIS; uint32 data = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "EntityList")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EntityList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EntityList"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ENTITY; entity_list.SignalAllClients(data); } XSRETURN_EMPTY; @@ -1998,6 +1451,7 @@ XS(boot_EntityList) { newXSproto(strcpy(buf, "IsMobSpawnedByNpcTypeID"), XS_EntityList_IsMobSpawnedByNpcTypeID, file, "$$"); newXSproto(strcpy(buf, "GetNPCByID"), XS_EntityList_GetNPCByID, file, "$$"); newXSproto(strcpy(buf, "GetNPCByNPCTypeID"), XS_EntityList_GetNPCByNPCTypeID, file, "$$"); + newXSproto(strcpy(buf, "GetNPCBySpawnID"), XS_EntityList_GetNPCBySpawnID, file, "$$"); newXSproto(strcpy(buf, "GetClientByName"), XS_EntityList_GetClientByName, file, "$$"); newXSproto(strcpy(buf, "GetClientByAccID"), XS_EntityList_GetClientByAccID, file, "$$"); newXSproto(strcpy(buf, "GetClientByID"), XS_EntityList_GetClientByID, file, "$$"); diff --git a/zone/perl_expedition.cpp b/zone/perl_expedition.cpp new file mode 100644 index 000000000..c0c483cfb --- /dev/null +++ b/zone/perl_expedition.cpp @@ -0,0 +1,691 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "../common/features.h" + +#ifdef EMBPERL_XS_CLASSES + +#include "expedition.h" +#include "zone_store.h" +#include "embperl.h" +#include "../common/global_define.h" + +#ifdef seed +#undef seed +#endif + +#ifdef THIS /* this macro seems to leak out on some systems */ +#undef THIS +#endif + +#define VALIDATE_THIS_IS_EXPEDITION \ + do { \ + if (sv_derived_from(ST(0), "Expedition")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Expedition*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Expedition"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + +XS(XS_Expedition_AddLockout); +XS(XS_Expedition_AddLockout) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: Expedition::AddLockout(THIS, string event_name, uint32 seconds)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + std::string event_name(SvPV_nolen(ST(1))); + uint32_t seconds = static_cast(SvUV(ST(2))); + + THIS->AddLockout(event_name, seconds); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_AddLockoutDuration); +XS(XS_Expedition_AddLockoutDuration) { + dXSARGS; + if (items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: Expedition::AddLockout(THIS, string event_name, int seconds, [bool members_only = true])"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + std::string event_name(SvPV_nolen(ST(1))); + int seconds = static_cast(SvUV(ST(2))); + if (items == 4) + { + bool members_only = (bool)SvTRUE(ST(3)); + THIS->AddLockoutDuration(event_name, seconds, members_only); + } + else + { + THIS->AddLockoutDuration(event_name, seconds); + } + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_AddReplayLockout); +XS(XS_Expedition_AddReplayLockout) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::AddReplayLockout(THIS, uint32 seconds)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + uint32_t seconds = static_cast(SvUV(ST(1))); + + THIS->AddReplayLockout(seconds); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_AddReplayLockoutDuration); +XS(XS_Expedition_AddReplayLockoutDuration) { + dXSARGS; + if (items != 2 && items != 3) { + Perl_croak(aTHX_ "Usage: Expedition::AddReplayLockoutDuration(THIS, int seconds, [bool members_only = true])"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + int seconds = static_cast(SvUV(ST(1))); + if (items == 3) + { + bool members_only = (bool)SvTRUE(ST(2)); + THIS->AddReplayLockoutDuration(seconds, members_only); + } + else + { + THIS->AddReplayLockoutDuration(seconds); + } + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_GetDynamicZoneID); +XS(XS_Expedition_GetDynamicZoneID) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetDynamicZoneID(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetDynamicZone().GetID()); +} + +XS(XS_Expedition_GetID); +XS(XS_Expedition_GetID) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetID(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetID()); +} + +XS(XS_Expedition_GetInstanceID); +XS(XS_Expedition_GetInstanceID) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetInstanceID(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetDynamicZone().GetInstanceID()); +} + +XS(XS_Expedition_GetLeaderName); +XS(XS_Expedition_GetLeaderName) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetLeaderName(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_PV(THIS->GetLeaderName().c_str()); +} + +XS(XS_Expedition_GetLockouts); +XS(XS_Expedition_GetLockouts) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetLockouts(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + HV* hash = newHV(); + + auto lockouts = THIS->GetLockouts(); + for (const auto& lockout : lockouts) + { + hv_store(hash, lockout.first.c_str(), static_cast(lockout.first.size()), + newSVuv(lockout.second.GetSecondsRemaining()), 0); + } + + ST(0) = sv_2mortal(newRV_noinc((SV*)hash)); // take ownership of hash (refcnt remains 1) + XSRETURN(1); +} + +XS(XS_Expedition_GetLootEventByNPCTypeID); +XS(XS_Expedition_GetLootEventByNPCTypeID) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::GetLootEventByNPCTypeID(THIS, uint32 npc_type_id)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + uint32_t npc_type_id = static_cast(SvUV(ST(1))); + + XSRETURN_PV(THIS->GetLootEventByNPCTypeID(npc_type_id).c_str()); +} + +XS(XS_Expedition_GetLootEventBySpawnID); +XS(XS_Expedition_GetLootEventBySpawnID) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::GetLootEventBySpawnID(THIS, uint32 spawn_id)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + uint32_t spawn_id = static_cast(SvUV(ST(1))); + + XSRETURN_PV(THIS->GetLootEventBySpawnID(spawn_id).c_str()); +} + +XS(XS_Expedition_GetMemberCount); +XS(XS_Expedition_GetMemberCount) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetMemberCount(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetMemberCount()); +} + +XS(XS_Expedition_GetMembers); +XS(XS_Expedition_GetMembers) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetMembers(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + HV* hash = newHV(); + + auto members = THIS->GetMembers(); + for (const auto& member : members) + { + hv_store(hash, member.name.c_str(), static_cast(member.name.size()), + newSVuv(member.id), 0); + } + + ST(0) = sv_2mortal(newRV_noinc((SV*)hash)); + XSRETURN(1); +} + +XS(XS_Expedition_GetName); +XS(XS_Expedition_GetName) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetName(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_PV(THIS->GetName().c_str()); +} + +XS(XS_Expedition_GetSecondsRemaining); +XS(XS_Expedition_GetSecondsRemaining) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetSecondsRemaining(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetDynamicZone().GetSecondsRemaining()); +} + +XS(XS_Expedition_GetUUID); +XS(XS_Expedition_GetUUID) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetUUID(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_PV(THIS->GetUUID().c_str()); +} + +XS(XS_Expedition_GetZoneID); +XS(XS_Expedition_GetZoneID) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetZoneID(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetDynamicZone().GetZoneID()); +} + +XS(XS_Expedition_GetZoneName); +XS(XS_Expedition_GetZoneName) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetZoneName(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_PV(ZoneName(THIS->GetDynamicZone().GetZoneID())); +} + +XS(XS_Expedition_GetZoneVersion); +XS(XS_Expedition_GetZoneVersion) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::GetZoneVersion(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + XSRETURN_UV(THIS->GetDynamicZone().GetZoneVersion()); +} + +XS(XS_Expedition_HasLockout); +XS(XS_Expedition_HasLockout) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::HasLockout(THIS, string event_name)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + std::string event_name(SvPV_nolen(ST(1))); + + bool result = THIS->HasLockout(event_name); + ST(0) = boolSV(result); + XSRETURN(1); +} + +XS(XS_Expedition_HasReplayLockout); +XS(XS_Expedition_HasReplayLockout) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::HasReplayLockout(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + bool result = THIS->HasReplayLockout(); + ST(0) = boolSV(result); + XSRETURN(1); +} + +XS(XS_Expedition_IsLocked); +XS(XS_Expedition_IsLocked) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::IsLocked(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + ST(0) = boolSV(THIS->IsLocked()); + XSRETURN(1); +} + +XS(XS_Expedition_RemoveCompass); +XS(XS_Expedition_RemoveCompass) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Expedition::RemoveCompass(THIS)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + THIS->GetDynamicZone().SetCompass(0, 0, 0, 0, true); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_RemoveLockout); +XS(XS_Expedition_RemoveLockout) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::RemoveLockout(THIS, string event_name)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + std::string event_name(SvPV_nolen(ST(1))); + + THIS->RemoveLockout(event_name); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetCompass); +XS(XS_Expedition_SetCompass) { + dXSARGS; + if (items != 5) { + Perl_croak(aTHX_ "Usage: Expedition::SetCompass(THIS, uint32 zone_id | string zone_name, float x, float y, float z)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + float x = static_cast(SvNV(ST(2))); + float y = static_cast(SvNV(ST(3))); + float z = static_cast(SvNV(ST(4))); + + if (SvTYPE(ST(1)) == SVt_PV) + { + std::string zone_name(SvPV_nolen(ST(1))); + THIS->GetDynamicZone().SetCompass(ZoneID(zone_name), x, y, z, true); + } + else if (SvTYPE(ST(1)) == SVt_IV) + { + uint32_t zone_id = static_cast(SvUV(ST(1))); + THIS->GetDynamicZone().SetCompass(zone_id, x, y, z, true); + } + else + { + Perl_croak(aTHX_ "Expedition::SetCompass expected an integer or string"); + } + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetLocked); +XS(XS_Expedition_SetLocked) { + dXSARGS; + if (items != 2 && items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: Expedition::SetLocked(THIS, bool locked, [int lock_msg = 0], [uint32 color = 15])"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + bool locked = (bool)SvTRUE(ST(1)); + int lock_msg = (items == 3) ? static_cast(SvIV(ST(2))) : 0; + if (items == 4) + { + THIS->SetLocked(locked, static_cast(lock_msg), true, (uint32)SvUV(ST(3))); + } + else + { + THIS->SetLocked(locked, static_cast(lock_msg), true); + } + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetLootEventByNPCTypeID); +XS(XS_Expedition_SetLootEventByNPCTypeID) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: Expedition::SetLootEventByNPCTypeID(THIS, uint32 npc_type_id, string event_name)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + uint32_t npc_type_id = static_cast(SvUV(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + + THIS->SetLootEventByNPCTypeID(npc_type_id, event_name); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetLootEventBySpawnID); +XS(XS_Expedition_SetLootEventBySpawnID) { + dXSARGS; + if (items != 3) { + Perl_croak(aTHX_ "Usage: Expedition::SetLootEventBySpawnID(THIS, uint32 spawn_id, string event_name)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + uint32_t spawn_id = static_cast(SvUV(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + + THIS->SetLootEventBySpawnID(spawn_id, event_name); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetReplayLockoutOnMemberJoin); +XS(XS_Expedition_SetReplayLockoutOnMemberJoin) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::SetReplayLockoutOnMemberJoin(THIS, bool enable)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + bool enable = (bool)SvTRUE(ST(1)); + + THIS->SetReplayLockoutOnMemberJoin(enable, true); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetSafeReturn); +XS(XS_Expedition_SetSafeReturn) { + dXSARGS; + if (items != 6) { + Perl_croak(aTHX_ "Usage: Expedition::SetSafeReturn(THIS, uint32 zone_id | string zone_name, float x, float y, float z, float heading)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + float x = static_cast(SvNV(ST(2))); + float y = static_cast(SvNV(ST(3))); + float z = static_cast(SvNV(ST(4))); + float heading = static_cast(SvNV(ST(5))); + + if (SvTYPE(ST(1)) == SVt_PV) + { + std::string zone_name(SvPV_nolen(ST(1))); + THIS->GetDynamicZone().SetSafeReturn(ZoneID(zone_name), x, y, z, heading, true); + } + else if (SvTYPE(ST(1)) == SVt_IV) + { + uint32_t zone_id = static_cast(SvUV(ST(1))); + THIS->GetDynamicZone().SetSafeReturn(zone_id, x, y, z, heading, true); + } + else + { + Perl_croak(aTHX_ "Expedition::SetSafeReturn expected an integer or string"); + } + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetSecondsRemaining); +XS(XS_Expedition_SetSecondsRemaining) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Expedition::SetSecondsRemaining(THIS, uint32 seconds_remaining)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + uint32_t seconds_remaining = static_cast(SvUV(ST(1))); + THIS->GetDynamicZone().SetSecondsRemaining(seconds_remaining); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_SetZoneInLocation); +XS(XS_Expedition_SetZoneInLocation) { + dXSARGS; + if (items != 5) { + Perl_croak(aTHX_ "Usage: Expedition::SetZoneInLocation(THIS, float x, float y, float z, float heading)"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + float x = static_cast(SvNV(ST(1))); + float y = static_cast(SvNV(ST(2))); + float z = static_cast(SvNV(ST(3))); + float heading = static_cast(SvNV(ST(4))); + + THIS->GetDynamicZone().SetZoneInLocation(x, y, z, heading, true); + + XSRETURN_EMPTY; +} + +XS(XS_Expedition_UpdateLockoutDuration); +XS(XS_Expedition_UpdateLockoutDuration) { + dXSARGS; + if (items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: Expedition::UpdateLockoutDuration(THIS, string event_name, uint32 seconds, [bool members_only = true])"); + } + + Expedition* THIS = nullptr; + VALIDATE_THIS_IS_EXPEDITION; + + std::string event_name(SvPV_nolen(ST(1))); + uint32_t seconds = static_cast(SvUV(ST(2))); + + if (items == 4) + { + bool members_only = (bool)SvTRUE(ST(3)); + THIS->UpdateLockoutDuration(event_name, seconds, members_only); + } + else + { + THIS->UpdateLockoutDuration(event_name, seconds); + } + + XSRETURN_EMPTY; +} + +XS(boot_Expedition); +XS(boot_Expedition) { + dXSARGS; + char file[256]; + strncpy(file, __FILE__, 256); + file[255] = 0; + + if (items != 1) { + fprintf(stderr, "boot_Expedition does not take any arguments."); + } + char buf[128]; + + XS_VERSION_BOOTCHECK; + newXSproto(strcpy(buf, "AddLockout"), XS_Expedition_AddLockout, file, "$$$"); + newXSproto(strcpy(buf, "AddLockoutDuration"), XS_Expedition_AddLockoutDuration, file, "$$$;$"); + newXSproto(strcpy(buf, "AddReplayLockout"), XS_Expedition_AddReplayLockout, file, "$$"); + newXSproto(strcpy(buf, "AddReplayLockoutDuration"), XS_Expedition_AddReplayLockoutDuration, file, "$$;$"); + newXSproto(strcpy(buf, "GetDynamicZoneID"), XS_Expedition_GetDynamicZoneID, file, "$"); + newXSproto(strcpy(buf, "GetID"), XS_Expedition_GetID, file, "$"); + newXSproto(strcpy(buf, "GetInstanceID"), XS_Expedition_GetInstanceID, file, "$"); + newXSproto(strcpy(buf, "GetLeaderName"), XS_Expedition_GetLeaderName, file, "$"); + newXSproto(strcpy(buf, "GetLockouts"), XS_Expedition_GetLockouts, file, "$"); + newXSproto(strcpy(buf, "GetLootEventByNPCTypeID"), XS_Expedition_GetLootEventByNPCTypeID, file, "$$"); + newXSproto(strcpy(buf, "GetLootEventBySpawnID"), XS_Expedition_GetLootEventBySpawnID, file, "$$"); + newXSproto(strcpy(buf, "GetMemberCount"), XS_Expedition_GetMemberCount, file, "$"); + newXSproto(strcpy(buf, "GetMembers"), XS_Expedition_GetMembers, file, "$"); + newXSproto(strcpy(buf, "GetName"), XS_Expedition_GetName, file, "$"); + newXSproto(strcpy(buf, "GetSecondsRemaining"), XS_Expedition_GetSecondsRemaining, file, "$"); + newXSproto(strcpy(buf, "GetUUID"), XS_Expedition_GetUUID, file, "$"); + newXSproto(strcpy(buf, "GetZoneID"), XS_Expedition_GetZoneID, file, "$"); + newXSproto(strcpy(buf, "GetZoneName"), XS_Expedition_GetZoneName, file, "$"); + newXSproto(strcpy(buf, "GetZoneVersion"), XS_Expedition_GetZoneVersion, file, "$"); + newXSproto(strcpy(buf, "HasLockout"), XS_Expedition_HasLockout, file, "$$"); + newXSproto(strcpy(buf, "HasReplayLockout"), XS_Expedition_HasReplayLockout, file, "$"); + newXSproto(strcpy(buf, "IsLocked"), XS_Expedition_IsLocked, file, "$"); + newXSproto(strcpy(buf, "RemoveCompass"), XS_Expedition_RemoveCompass, file, "$"); + newXSproto(strcpy(buf, "RemoveLockout"), XS_Expedition_RemoveLockout, file, "$$"); + newXSproto(strcpy(buf, "SetCompass"), XS_Expedition_SetCompass, file, "$$$$$"); + newXSproto(strcpy(buf, "SetLocked"), XS_Expedition_SetLocked, file, "$$;$$"); + newXSproto(strcpy(buf, "SetLootEventByNPCTypeID"), XS_Expedition_SetLootEventByNPCTypeID, file, "$$$"); + newXSproto(strcpy(buf, "SetLootEventBySpawnID"), XS_Expedition_SetLootEventBySpawnID, file, "$$$"); + newXSproto(strcpy(buf, "SetReplayLockoutOnMemberJoin"), XS_Expedition_SetReplayLockoutOnMemberJoin, file, "$$"); + newXSproto(strcpy(buf, "SetSafeReturn"), XS_Expedition_SetSafeReturn, file, "$$$$$$"); + newXSproto(strcpy(buf, "SetSecondsRemaining"), XS_Expedition_SetSecondsRemaining, file, "$$"); + newXSproto(strcpy(buf, "SetZoneInLocation"), XS_Expedition_SetZoneInLocation, file, "$$$$$"); + newXSproto(strcpy(buf, "UpdateLockoutDuration"), XS_Expedition_UpdateLockoutDuration, file, "$$$;$"); + + HV* stash = gv_stashpvs("ExpeditionLockMessage", GV_ADD); + newCONSTSUB(stash, "None", newSViv(static_cast(ExpeditionLockMessage::None))); + newCONSTSUB(stash, "Close", newSViv(static_cast(ExpeditionLockMessage::Close))); + newCONSTSUB(stash, "Begin", newSViv(static_cast(ExpeditionLockMessage::Begin))); + + XSRETURN_YES; +} + +#endif //EMBPERL_XS_CLASSES diff --git a/zone/perl_groups.cpp b/zone/perl_groups.cpp index c23246b4a..70c321a21 100644 --- a/zone/perl_groups.cpp +++ b/zone/perl_groups.cpp @@ -42,23 +42,27 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_GROUP \ + do { \ + if (sv_derived_from(ST(0), "Group")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Group*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Group"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); XS(XS_Group_DisbandGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_DisbandGroup) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Group::DisbandGroup(THIS)"); + Perl_croak(aTHX_ "Usage: Group::DisbandGroup(THIS)"); // @categories Script Utility, Group { Group *THIS; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; THIS->DisbandGroup(); } XSRETURN_EMPTY; @@ -68,20 +72,12 @@ XS(XS_Group_IsGroupMember); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_IsGroupMember) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::IsGroupMember(THIS, client)"); + Perl_croak(aTHX_ "Usage: Group::IsGroupMember(THIS, client)"); // @categories Account and Character, Script Utility, Group { Group *THIS; bool RETVAL; Mob *client; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); client = INT2PTR(Mob *, tmp); @@ -101,20 +97,12 @@ XS(XS_Group_CastGroupSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_CastGroupSpell) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Group::CastGroupSpell(THIS, Mob* caster, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Group::CastGroupSpell(THIS, Mob* caster, uint16 spell_id)"); // @categories Account and Character, Script Utility, Group { Group *THIS; Mob *caster; uint16 spellid = (uint16) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); caster = INT2PTR(Mob *, tmp); @@ -132,20 +120,12 @@ XS(XS_Group_SplitExp); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_SplitExp) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Group::SplitExp(THIS, uint32 exp, Mob* other)"); + Perl_croak(aTHX_ "Usage: Group::SplitExp(THIS, uint32 exp, Mob* other)"); // @categories Account and Character, Script Utility, Group { Group *THIS; uint32 exp = (uint32) SvUV(ST(1)); Mob *other; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(2), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(2))); other = INT2PTR(Mob *, tmp); @@ -163,21 +143,13 @@ XS(XS_Group_GroupMessage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GroupMessage) { dXSARGS; if ((items != 3) && (items != 4)) // the 3 item version is kept for backwards compatability - Perl_croak(aTHX_ "Usage: Group::GroupMessage(THIS, Mob* sender, uint8 language, string message)"); + Perl_croak(aTHX_ "Usage: Group::GroupMessage(THIS, Mob* sender, uint8 language, string message)"); // @categories Script Utility, Group { Group *THIS; Mob *sender; uint8 language; char *message; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); sender = INT2PTR(Mob *, tmp); @@ -204,21 +176,13 @@ XS(XS_Group_GetTotalGroupDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GetTotalGroupDamage) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::GetTotalGroupDamage(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Group::GetTotalGroupDamage(THIS, Mob* other)"); // @categories Script Utility, Group { Group *THIS; uint32 RETVAL; dXSTARG; Mob *other; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -238,22 +202,14 @@ XS(XS_Group_SplitMoney); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_SplitMoney) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: Group::SplitMoney(THIS, uint32 copper, uint32 silver, uint32 gold, uint32 platinum)"); + Perl_croak(aTHX_ "Usage: Group::SplitMoney(THIS, uint32 copper, uint32 silver, uint32 gold, uint32 platinum)"); // @categories Currency and Points, Script Utility, Group { Group *THIS; uint32 copper = (uint32) SvUV(ST(1)); uint32 silver = (uint32) SvUV(ST(2)); uint32 gold = (uint32) SvUV(ST(3)); uint32 platinum = (uint32) SvUV(ST(4)); - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; THIS->SplitMoney(copper, silver, gold, platinum); } XSRETURN_EMPTY; @@ -263,19 +219,11 @@ XS(XS_Group_SetLeader); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_SetLeader) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::SetLeader(THIS, Mob* new_leader)"); + Perl_croak(aTHX_ "Usage: Group::SetLeader(THIS, Mob* new_leader)"); // @categories Account and Character, Script Utility, Group { Group *THIS; Mob *newleader; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); newleader = INT2PTR(Mob *, tmp); @@ -293,19 +241,11 @@ XS(XS_Group_GetLeader); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GetLeader) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Group::GetLeader(THIS)"); + Perl_croak(aTHX_ "Usage: Group::GetLeader(THIS)"); // @categories Account and Character, Script Utility, Group { Group *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; RETVAL = THIS->GetLeader(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -317,20 +257,12 @@ XS(XS_Group_GetLeaderName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GetLeaderName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Group::GetLeaderName(THIS)"); + Perl_croak(aTHX_ "Usage: Group::GetLeaderName(THIS)"); // @categories Account and Character, Script Utility, Group { Group *THIS; const char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; RETVAL = THIS->GetLeaderName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -343,19 +275,11 @@ XS(XS_Group_SendHPPacketsTo); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_SendHPPacketsTo) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::SendHPPacketsTo(THIS, Mob* new_member)"); + Perl_croak(aTHX_ "Usage: Group::SendHPPacketsTo(THIS, Mob* new_member)"); // @categories Script Utility, Group { Group *THIS; Mob *newmember; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); newmember = INT2PTR(Mob *, tmp); @@ -373,19 +297,11 @@ XS(XS_Group_SendHPPacketsFrom); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_SendHPPacketsFrom) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::SendHPPacketsFrom(THIS, Mob* new_member)"); + Perl_croak(aTHX_ "Usage: Group::SendHPPacketsFrom(THIS, Mob* new_member)"); // @categories Script Utility, Group { Group *THIS; Mob *newmember; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); newmember = INT2PTR(Mob *, tmp); @@ -403,20 +319,12 @@ XS(XS_Group_IsLeader); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_IsLeader) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::IsLeader(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: Group::IsLeader(THIS, Mob* target)"); // @categories Account and Character, Script Utility, Group { Group *THIS; bool RETVAL; Mob *leadertest; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); leadertest = INT2PTR(Mob *, tmp); @@ -436,20 +344,12 @@ XS(XS_Group_GroupCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GroupCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Group::GroupCount(THIS)"); + Perl_croak(aTHX_ "Usage: Group::GroupCount(THIS)"); // @categories Script Utility, Group { Group *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; RETVAL = THIS->GroupCount(); XSprePUSH; PUSHu((UV) RETVAL); @@ -461,20 +361,12 @@ XS(XS_Group_GetHighestLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GetHighestLevel) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Group::GetHighestLevel(THIS)"); + Perl_croak(aTHX_ "Usage: Group::GetHighestLevel(THIS)"); // @categories Script Utility, Group { Group *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; RETVAL = THIS->GetHighestLevel(); XSprePUSH; PUSHu((UV) RETVAL); @@ -486,7 +378,7 @@ XS(XS_Group_TeleportGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_TeleportGroup) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Group::TeleportGroup(THIS, Mob* sender, uint32 zone_id, float x, float y, float z, float heading)"); + Perl_croak(aTHX_ "Usage: Group::TeleportGroup(THIS, Mob* sender, uint32 zone_id, float x, float y, float z, float heading)"); // @categories Script Utility, Group { Group *THIS; Mob *sender; @@ -495,15 +387,7 @@ XS(XS_Group_TeleportGroup) { float y = (float) SvNV(ST(4)); float z = (float) SvNV(ST(5)); float heading = (float) SvNV(ST(6)); - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); sender = INT2PTR(Mob *, tmp); @@ -521,20 +405,12 @@ XS(XS_Group_GetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Group_GetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Group::GetID(THIS)"); + Perl_croak(aTHX_ "Usage: Group::GetID(THIS)"); // @categories Script Utility, Group { Group *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; RETVAL = THIS->GetID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -546,21 +422,13 @@ XS(XS_Group_GetMember); XS(XS_Group_GetMember) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Group::GetMember(THIS, int group_index)"); + Perl_croak(aTHX_ "Usage: Group::GetMember(THIS, int group_index)"); // @categories Account and Character, Script Utility, Group { Group *THIS; Mob *member; Client *RETVAL = nullptr; dXSTARG; - - if (sv_derived_from(ST(0), "Group")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Group *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Group"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_GROUP; int index = (int) SvUV(ST(1)); if (index < 0 || index > 5) RETVAL = nullptr; @@ -576,6 +444,24 @@ XS(XS_Group_GetMember) { XSRETURN(1); } +XS(XS_Group_DoesAnyMemberHaveExpeditionLockout); +XS(XS_Group_DoesAnyMemberHaveExpeditionLockout) { + dXSARGS; + if (items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: Group::DoesAnyMemberHaveExpeditionLockout(THIS, string expedition_name, string event_name, [int max_check_count = 0])"); + } + + Group* THIS = nullptr; + VALIDATE_THIS_IS_GROUP; + std::string expedition_name(SvPV_nolen(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + int max_check_count = (items == 4) ? static_cast(SvIV(ST(3))) : 0; + + bool result = THIS->DoesAnyMemberHaveExpeditionLockout(expedition_name, event_name, max_check_count); + ST(0) = boolSV(result); + XSRETURN(1); +} + #ifdef __cplusplus extern "C" #endif @@ -612,6 +498,7 @@ XS(boot_Group) { newXSproto(strcpy(buf, "TeleportGroup"), XS_Group_TeleportGroup, file, "$$$$$$$"); newXSproto(strcpy(buf, "GetID"), XS_Group_GetID, file, "$"); newXSproto(strcpy(buf, "GetMember"), XS_Group_GetMember, file, "$$"); + newXSproto(strcpy(buf, "DoesAnyMemberHaveExpeditionLockout"), XS_Group_DoesAnyMemberHaveExpeditionLockout, file, "$$$;$"); XSRETURN_YES; } diff --git a/zone/perl_hateentry.cpp b/zone/perl_hateentry.cpp index 85b5d67dd..cd98648fa 100644 --- a/zone/perl_hateentry.cpp +++ b/zone/perl_hateentry.cpp @@ -35,23 +35,28 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_HATE \ + do { \ + if (sv_derived_from(ST(0), "HateEntry")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(struct_HateList*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type HateEntry"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_HateEntry_GetEnt); /* prototype to pass -Wmissing-prototypes */ XS(XS_HateEntry_GetEnt) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: HateEntry::GetData(THIS)"); + Perl_croak(aTHX_ "Usage: HateEntry::GetData(THIS)"); // @categories Script Utility, Hate and Aggro { struct_HateList *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "HateEntry")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(struct_HateList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type tHateEntry"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_HATE; RETVAL = THIS->entity_on_hatelist; ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -63,20 +68,12 @@ XS(XS_HateEntry_GetHate); /* prototype to pass -Wmissing-prototypes */ XS(XS_HateEntry_GetHate) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: HateEntry::GetHate(THIS)"); + Perl_croak(aTHX_ "Usage: HateEntry::GetHate(THIS)"); // @categories Script Utility, Hate and Aggro { struct_HateList *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "HateEntry")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(struct_HateList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type tHateEntry"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_HATE; RETVAL = THIS->stored_hate_amount; XSprePUSH; PUSHi((IV) RETVAL); @@ -88,20 +85,12 @@ XS(XS_HateEntry_GetDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_HateEntry_GetDamage) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: HateEntry::GetDamage(THIS)"); + Perl_croak(aTHX_ "Usage: HateEntry::GetDamage(THIS)"); // @categories Script Utility, Hate and Aggro { struct_HateList *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "HateEntry")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(struct_HateList *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type tHateEntry"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_HATE; RETVAL = THIS->hatelist_damage; XSprePUSH; PUSHi((IV) RETVAL); diff --git a/zone/perl_inventory.cpp b/zone/perl_inventory.cpp new file mode 100644 index 000000000..56452873c --- /dev/null +++ b/zone/perl_inventory.cpp @@ -0,0 +1,481 @@ +/* +* This file was generated automatically by xsubpp version 1.9508 from the +* contents of tmp. Do not edit this file, edit tmp instead. +* +* ANY CHANGES MADE HERE WILL BE LOST! +* +*/ + + +/* EQEMu: Everquest Server Emulator + Copyright (C) 2001-2004 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 +*/ + +#include "../common/features.h" +#include "client.h" + +#ifdef EMBPERL_XS_CLASSES + +#include "../common/global_define.h" +#include "embperl.h" + +#ifdef seed +#undef seed +#endif + +#include "../common/inventory_profile.h" + +#ifdef THIS /* this macro seems to leak out on some systems */ +#undef THIS +#endif + +#define VALIDATE_THIS_IS_INVENTORY \ + do { \ + if (sv_derived_from(ST(0), "Inventory")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(EQ::InventoryProfile*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type EQ::InventoryProfile"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + +XS(XS_Inventory_CanItemFitInContainer); +XS(XS_Inventory_CanItemFitInContainer) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: Inventory::CanItemFitInContainer(THIS, ItemInstance item_to_check, ItemInstance container_to_check)"); + { + EQ::InventoryProfile* THIS; + bool can_fit = false; + EQ::ItemInstance* item_to_check = (EQ::ItemInstance*)SvIV((SV*)SvRV(ST(1))); + EQ::ItemInstance* container_to_check = (EQ::ItemInstance*)SvIV((SV*)SvRV(ST(2))); + const EQ::ItemData* item_data = item_to_check->GetItem(); + const EQ::ItemData* container_data = container_to_check->GetItem(); + VALIDATE_THIS_IS_INVENTORY; + can_fit = THIS->CanItemFitInContainer(item_data, container_data); + ST(0) = boolSV(can_fit); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Inventory_CheckNoDrop); +XS(XS_Inventory_CheckNoDrop) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::CheckNoDrop(THIS, int16 slot_id)"); + { + EQ::InventoryProfile* THIS; + bool no_drop = false; + int16 slot_id = (int16)SvIV(ST(1)); + VALIDATE_THIS_IS_INVENTORY; + no_drop = THIS->CheckNoDrop(slot_id); + ST(0) = boolSV(no_drop); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Inventory_DeleteItem); +XS(XS_Inventory_DeleteItem) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Inventory::DeleteItem(THIS, int16 slot_id, [uint8 quantity = 0])"); + { + EQ::InventoryProfile* THIS; + bool item_deleted = false; + int16 slot_id = (int16)SvIV(ST(1)); + uint8 quantity = 0; + VALIDATE_THIS_IS_INVENTORY; + if (items > 2) + quantity = (uint8)SvUV(ST(2)); + + item_deleted = THIS->DeleteItem(slot_id, quantity); + ST(0) = boolSV(item_deleted); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Inventory_FindFreeSlot); +XS(XS_Inventory_FindFreeSlot) { + dXSARGS; + if (items < 3 || items > 5) + Perl_croak(aTHX_ "Usage: Inventory::FindFreeSlot(THIS, bool is_for_bag, bool try_cursor, [uint8 min_size = 0, bool is_arrow = false])"); + { + EQ::InventoryProfile* THIS; + int16 free_slot; + bool is_for_bag = (bool)SvNV(ST(1)); + bool try_cursor = (bool)SvNV(ST(2)); + uint8 min_size = 0; + bool is_arrow = false; + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (items > 3) + min_size = (uint8)SvUV(ST(3)); + if (items > 4) + is_arrow = (bool)SvNV(ST(4)); + + free_slot = THIS->FindFreeSlot(is_for_bag, try_cursor, min_size, is_arrow); + XSprePUSH; + PUSHi((IV)free_slot); + } + XSRETURN(1); +} + +XS(XS_Inventory_GetBagIndex); +XS(XS_Inventory_GetBagIndex) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::GetBagIndex(THIS, int16 slot_id)"); + { + EQ::InventoryProfile* THIS; + uint8 bag_index; + int16 slot_id = (int16)SvIV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + bag_index = THIS->CalcBagIdx(slot_id); + XSprePUSH; + PUSHu((UV)bag_index); + } + XSRETURN(1); +} + +XS(XS_Inventory_GetItem); +XS(XS_Inventory_GetItem) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::GetItem(THIS, int16 slot_id)"); + { + EQ::InventoryProfile* THIS; + EQ::ItemInstance* item; + int16 slot_id = (int16)SvIV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + item = THIS->GetItem(slot_id); + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "QuestItem", (void*)item); + } + XSRETURN(1); +} + +XS(XS_Inventory_GetMaterialFromSlot); +XS(XS_Inventory_GetMaterialFromSlot) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::GetMaterialFromSlot(THIS, int16 slot_id)"); + { + EQ::InventoryProfile* THIS; + uint8 material; + int16 slot_id = (int16)SvIV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + material = THIS->CalcMaterialFromSlot(slot_id); + XSprePUSH; + PUSHu((UV)material); + } + XSRETURN(1); +} + +XS(XS_Inventory_GetSlotByItemInst); +XS(XS_Inventory_GetSlotByItemInst) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::GetSlotByItemInst(THIS, ItemInstance item)"); + { + EQ::InventoryProfile* THIS; + int slot_id; + EQ::ItemInstance* item = (EQ::ItemInstance*)SvIV((SV*)SvRV(ST(1))); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + slot_id = THIS->GetSlotByItemInst(item); + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_GetSlotFromMaterial); +XS(XS_Inventory_GetSlotFromMaterial) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::GetSlotFromMaterial(THIS, uint8 material)"); + { + EQ::InventoryProfile* THIS; + int16 slot_id; + uint8 material = (uint8)SvUV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + slot_id = THIS->CalcSlotFromMaterial(material); + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_GetSlotID); +XS(XS_Inventory_GetSlotID) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Inventory::GetSlotID(THIS, int16 slot_id, [uint8 bag_index])"); + { + EQ::InventoryProfile* THIS; + int16 slot_id = (int16)SvIV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (items == 2) + slot_id = THIS->CalcSlotId(slot_id); + + if (items == 3) { + uint8 bag_index = (uint8)SvUV(ST(2)); + slot_id = THIS->CalcSlotId(slot_id, bag_index); + } + + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_HasItem); +XS(XS_Inventory_HasItem) { + dXSARGS; + if (items < 2 || items > 4) + Perl_croak(aTHX_ "Usage: Inventory::HasItem(THIS, uint32 item_id, [uint8 quantity, uint8 where])"); + { + EQ::InventoryProfile* THIS; + int16 slot_id; + uint32 item_id = (uint32)SvUV(ST(1)); + uint8 quantity = 0; + uint8 where_to_look = 0xFF; + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (items > 2) + quantity = (uint8)SvUV(ST(2)); + if (items > 3) + where_to_look = (uint8)SvUV(ST(3)); + + slot_id = THIS->HasItem(item_id, quantity, where_to_look); + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_HasItemByLoreGroup); +XS(XS_Inventory_HasItemByLoreGroup) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Inventory::HasItemByLoreGroup(THIS, uint32 loregroup, [uint8 where])"); + { + EQ::InventoryProfile* THIS; + int16 slot_id; + uint32 loregroup = (uint32)SvUV(ST(1)); + uint8 where_to_look = 0xFF; + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (items > 2) + where_to_look = (uint8)SvUV(ST(2)); + + slot_id = THIS->HasItemByLoreGroup(loregroup, where_to_look); + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_HasItemByUse); +XS(XS_Inventory_HasItemByUse) { + dXSARGS; + if (items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: Inventory::HasItemByUse(THIS, uint8 use, uint8 quantity, [uint8 where])"); + { + EQ::InventoryProfile* THIS; + int16 slot_id; + uint8 item_use = (uint8)SvUV(ST(1)); + uint8 quantity = (uint8)SvUV(ST(2)); + uint8 where_to_look = 0xFF; + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (items > 3) + where_to_look = (uint8)SvUV(ST(3)); + + slot_id = THIS->HasItemByUse(item_use, quantity, where_to_look); + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_HasSpaceForItem); +XS(XS_Inventory_HasSpaceForItem) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: Inventory::HasSpaceForItem(THIS, ItemInstance item_to_check, uint8 quantity)"); + { + EQ::InventoryProfile* THIS; + bool has_space = false; + EQ::ItemInstance* item_to_check = (EQ::ItemInstance*)SvIV((SV*)SvRV(ST(1))); + uint8 quantity = (uint8)SvUV(ST(2)); + const EQ::ItemData* item_data = item_to_check->GetItem(); + VALIDATE_THIS_IS_INVENTORY; + has_space = THIS->HasSpaceForItem(item_data, quantity); + ST(0) = boolSV(has_space); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Inventory_PopItem); +XS(XS_Inventory_PopItem) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::PopItem(THIS, int16 slot_id)"); + { + EQ::InventoryProfile* THIS; + EQ::ItemInstance* item; + int16 slot_id = (int16)SvIV(ST(1)); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + item = THIS->PopItem(slot_id); + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "QuestItem", (void*)item); + } + XSRETURN(1); +} + +XS(XS_Inventory_SupportsContainers); +XS(XS_Inventory_SupportsContainers) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::SupportsContainers(THIS, int16 slot_id)"); + { + EQ::InventoryProfile* THIS; + bool supports_containers = false; + int16 slot_id = (int16)SvIV(ST(1)); + VALIDATE_THIS_IS_INVENTORY; + supports_containers = THIS->SupportsContainers(slot_id); + ST(0) = boolSV(supports_containers); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Inventory_SwapItem); +XS(XS_Inventory_SwapItem) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: Inventory::SwapItem(THIS, int16 source_slot_id, int16 destination_slot_id)"); + { + EQ::InventoryProfile* THIS; + bool item_swapped = false; + int16 source_slot_id = (int16)SvIV(ST(1)); + int16 destination_slot_id = (int16)SvIV(ST(2)); + EQ::InventoryProfile::SwapItemFailState fail_state = EQ::InventoryProfile::swapInvalid; + VALIDATE_THIS_IS_INVENTORY; + item_swapped = THIS->SwapItem(source_slot_id, destination_slot_id, fail_state); + ST(0) = boolSV(item_swapped); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Inventory_PushCursor); +XS(XS_Inventory_PushCursor) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Inventory::PushCursor(THIS, ItemInstance item)"); + { + EQ::InventoryProfile* THIS; + int16 slot_id; + EQ::ItemInstance* item = (EQ::ItemInstance*)SvIV((SV*)SvRV(ST(1))); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (item) + slot_id = THIS->PushCursor(*item); + else + slot_id = 0; + + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +XS(XS_Inventory_PutItem); +XS(XS_Inventory_PutItem) { + dXSARGS; + if (items != 3) + Perl_croak(aTHX_ "Usage: Inventory::PutItem(THIS, int16 slot_id, ItemInstance item)"); + { + EQ::InventoryProfile* THIS; + int16 slot_id = (int16)SvUV(ST(1)); + EQ::ItemInstance* item = (EQ::ItemInstance*)SvIV((SV*)SvRV(ST(2))); + dXSTARG; + VALIDATE_THIS_IS_INVENTORY; + if (item) + slot_id = THIS->PutItem(slot_id, *item); + else + slot_id = 0; + + XSprePUSH; + PUSHi((IV)slot_id); + } + XSRETURN(1); +} + +#ifdef __cplusplus +extern "C" +#endif + +XS(boot_Inventory); +XS(boot_Inventory) { + dXSARGS; + char file[256]; + strncpy(file, __FILE__, 256); + file[255] = 0; + if (items != 1) + fprintf(stderr, "boot_quest does not take any arguments."); + + char buf[128]; + XS_VERSION_BOOTCHECK; + newXSproto(strcpy(buf, "CanItemFitInContainer"), XS_Inventory_CanItemFitInContainer, file, "$$$"); + newXSproto(strcpy(buf, "CheckNoDrop"), XS_Inventory_CheckNoDrop, file, "$$"); + newXSproto(strcpy(buf, "DeleteItem"), XS_Inventory_DeleteItem, file, "$$;$"); + newXSproto(strcpy(buf, "FindFreeSlot"), XS_Inventory_FindFreeSlot, file, "$$$;$$"); + newXSproto(strcpy(buf, "GetBagIndex"), XS_Inventory_GetBagIndex, file, "$$"); + newXSproto(strcpy(buf, "GetItem"), XS_Inventory_GetItem, file, "$$;$"); + newXSproto(strcpy(buf, "GetMaterialFromSlot"), XS_Inventory_GetMaterialFromSlot, file, "$$"); + newXSproto(strcpy(buf, "GetSlotByItemInst"), XS_Inventory_GetSlotByItemInst, file, "$$"); + newXSproto(strcpy(buf, "GetSlotFromMaterial"), XS_Inventory_GetSlotFromMaterial, file, "$$"); + newXSproto(strcpy(buf, "GetSlotID"), XS_Inventory_GetSlotID, file, "$$;$"); + newXSproto(strcpy(buf, "HasItem"), XS_Inventory_HasItem, file, "$$;$$"); + newXSproto(strcpy(buf, "HasItemByLoreGroup"), XS_Inventory_HasItemByLoreGroup, file, "$$;$"); + newXSproto(strcpy(buf, "HasItemByUse"), XS_Inventory_HasItemByUse, file, "$$;$$"); + newXSproto(strcpy(buf, "HasSpaceForItem"), XS_Inventory_HasSpaceForItem, file, "$$$"); + newXSproto(strcpy(buf, "PopItem"), XS_Inventory_PopItem, file, "$$"); + newXSproto(strcpy(buf, "PushCursor"), XS_Inventory_PushCursor, file, "$$"); + newXSproto(strcpy(buf, "PutItem"), XS_Inventory_PutItem, file, "$$$"); + newXSproto(strcpy(buf, "SupportsContainers"), XS_Inventory_SupportsContainers, file, "$$"); + newXSproto(strcpy(buf, "SwapItem"), XS_Inventory_SwapItem, file, "$$$"); + XSRETURN_YES; +} + +#endif //EMBPERL_XS_CLASSES diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index cf6ef4be7..fb4606d27 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -46,24 +46,28 @@ typedef const char Const_char; #undef THIS #endif +#define VALIDATE_THIS_IS_MOB \ + do { \ + if (sv_derived_from(ST(0), "Mob")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Mob*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Mob"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); XS(XS_Mob_IsClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsClient) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsClient(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsClient(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsClient(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -75,19 +79,11 @@ XS(XS_Mob_IsNPC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsNPC) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsNPC(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsNPC(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsNPC(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -99,20 +95,11 @@ XS(XS_Mob_IsBot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsBot) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsBot(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsBot(THIS)"); // @categories Script Utility { Mob* THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsBot(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -124,19 +111,11 @@ XS(XS_Mob_IsMob); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsMob) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsMob(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsMob(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsMob(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -148,19 +127,11 @@ XS(XS_Mob_IsCorpse); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsCorpse) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsCorpse(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsCorpse(THIS)"); // @categories Script Utility, Corpse { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsCorpse(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -172,19 +143,11 @@ XS(XS_Mob_IsPlayerCorpse); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsPlayerCorpse) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsPlayerCorpse(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsPlayerCorpse(THIS)"); // @categories Corpse { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsPlayerCorpse(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -196,19 +159,11 @@ XS(XS_Mob_IsNPCCorpse); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsNPCCorpse) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsNPCCorpse(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsNPCCorpse(THIS)"); // @categories Corpse { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsNPCCorpse(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -220,19 +175,11 @@ XS(XS_Mob_IsObject); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsObject) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsObject(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsObject(THIS)"); // @categories Objects { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsObject(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -244,19 +191,11 @@ XS(XS_Mob_IsDoor); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsDoor) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsDoor(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsDoor(THIS)"); // @categories Script Utility, Doors { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsDoor(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -268,19 +207,11 @@ XS(XS_Mob_IsTrap); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsTrap) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsTrap(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsTrap(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsTrap(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -292,19 +223,11 @@ XS(XS_Mob_IsBeacon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsBeacon) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsBeacon(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsBeacon(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsBeacon(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -316,19 +239,11 @@ XS(XS_Mob_CastToClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CastToClient) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CastToClient(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CastToClient(THIS)"); // @categories Account and Character, Script Utility { Mob *THIS; Client *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CastToClient(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -340,19 +255,11 @@ XS(XS_Mob_CastToNPC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CastToNPC) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CastToNPC(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CastToNPC(THIS)"); // @categories Script Utility { Mob *THIS; NPC *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CastToNPC(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "NPC", (void *) RETVAL); @@ -364,19 +271,11 @@ XS(XS_Mob_CastToMob); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CastToMob) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CastToMob(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CastToMob(THIS)"); // @categories Script Utility { Mob *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CastToMob(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -388,19 +287,11 @@ XS(XS_Mob_CastToCorpse); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CastToCorpse) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CastToCorpse(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CastToCorpse(THIS)"); // @categories Script Utility, Corpse { Mob *THIS; Corpse *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CastToCorpse(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Corpse", (void *) RETVAL); @@ -412,20 +303,12 @@ XS(XS_Mob_GetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetID(THIS)"); // @categories Script Utility { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -437,20 +320,12 @@ XS(XS_Mob_GetName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetName(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetName(THIS)"); // @categories Script Utility { Mob *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -463,19 +338,11 @@ XS(XS_Mob_Depop); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Depop) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Mob::Depop(THIS, StartSpawnTimer = true)"); + Perl_croak(aTHX_ "Usage: Mob::Depop(THIS, StartSpawnTimer = true)"); // @categories Spawns { Mob *THIS; bool StartSpawnTimer; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 2) StartSpawnTimer = true; else { @@ -491,19 +358,11 @@ XS(XS_Mob_RogueAssassinate); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_RogueAssassinate) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::RogueAssassinate(THIS, other)"); + Perl_croak(aTHX_ "Usage: Mob::RogueAssassinate(THIS, other)"); // @categories Script Utility { Mob *THIS; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -521,22 +380,14 @@ XS(XS_Mob_BehindMob); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_BehindMob) { dXSARGS; if (items < 1 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::BehindMob(THIS, Mob* other = 0, [float x = 0.0f], [float y= 0.0f])"); + Perl_croak(aTHX_ "Usage: Mob::BehindMob(THIS, Mob* other = 0, [float x = 0.0f], [float y= 0.0f])"); // @categories Script Utility { Mob *THIS; bool RETVAL; Mob *other; float playerx; float playery; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 2) other = 0; else { @@ -572,20 +423,12 @@ XS(XS_Mob_SetLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetLevel) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::SetLevel(THIS, uint8 in_level, [bool command = false])"); + Perl_croak(aTHX_ "Usage: Mob::SetLevel(THIS, uint8 in_level, [bool command = false])"); // @categories Stats and Attributes { Mob *THIS; uint8 in_level = (uint8) SvUV(ST(1)); bool command; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) command = false; else { @@ -601,21 +444,13 @@ XS(XS_Mob_GetSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetSkill(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetSkill(THIS, int skill_id)"); // @categories Skills and Recipes, Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - EQEmu::skills::SkillType skill_num = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::skills::SkillType skill_num = (EQ::skills::SkillType) SvUV(ST(1)); + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSkill(skill_num); XSprePUSH; PUSHu((UV) RETVAL); @@ -627,19 +462,11 @@ XS(XS_Mob_SendWearChange); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SendWearChange) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SendWearChange(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::SendWearChange(THIS, uint8 material_slot)"); // @categories Script Utility { Mob *THIS; uint8 material_slot = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendWearChange(material_slot); } XSRETURN_EMPTY; @@ -649,21 +476,13 @@ XS(XS_Mob_GetEquipment); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetEquipment) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetEquipment(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetEquipment(THIS, uint8 material_slot)"); // @categories Inventory and Items { Mob *THIS; int32 RETVAL; dXSTARG; uint8 material_slot = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetEquippedItemFromTextureSlot(material_slot); XSprePUSH; PUSHi((IV) RETVAL); @@ -675,21 +494,13 @@ XS(XS_Mob_GetEquipmentMaterial); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetEquipmentMaterial) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetEquipmentMaterial(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetEquipmentMaterial(THIS, uint8 material_slot)"); // @categories Inventory and Items { Mob *THIS; int32 RETVAL; dXSTARG; uint8 material_slot = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetEquipmentMaterial(material_slot); XSprePUSH; PUSHi((IV) RETVAL); @@ -701,21 +512,13 @@ XS(XS_Mob_GetEquipmentColor); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetEquipmentColor) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetEquipmentColor(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetEquipmentColor(THIS, uint8 material_slot)"); // @categories Inventory and Items { Mob *THIS; int32 RETVAL; dXSTARG; uint8 material_slot = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetEquipmentColor(material_slot); XSprePUSH; PUSHi((IV) RETVAL); @@ -727,21 +530,13 @@ XS(XS_Mob_GetArmorTint); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetArmorTint) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetArmorTint(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetArmorTint(THIS, uint8 material_slot)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; uint8 material_slot = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetArmorTint(material_slot); XSprePUSH; PUSHi((IV) RETVAL); @@ -753,19 +548,11 @@ XS(XS_Mob_IsMoving); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsMoving) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsMoving(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsMoving(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsMoving(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -777,18 +564,10 @@ XS(XS_Mob_GoToBind); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GoToBind) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GoToBind(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GoToBind(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->GoToBind(); } XSRETURN_EMPTY; @@ -798,18 +577,10 @@ XS(XS_Mob_Gate); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Gate) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::Gate(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::Gate(THIS)"); // @categories Spells and Disciplines { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Gate(); } XSRETURN_EMPTY; @@ -819,22 +590,14 @@ XS(XS_Mob_Attack); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Attack) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::Attack(THIS, Mob* other, [int hand = 13 [prim|sec]], [bool from_riposte = false])"); + Perl_croak(aTHX_ "Usage: Mob::Attack(THIS, Mob* other, [int hand = 13 [prim|sec]], [bool from_riposte = false])"); // @categories Script Utility, Hate and Aggro { Mob *THIS; bool RETVAL; Mob *other; int Hand; bool FromRiposte; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -866,25 +629,17 @@ XS(XS_Mob_Damage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Damage) { dXSARGS; if (items < 5 || items > 8) - Perl_croak(aTHX_ "Usage: Mob::Damage(THIS, Mob* from, int32 damage, uint16 spell_id, int attack_skill, [bool avoidable = true], [int8 buffslot = -1], [bool buff_tic = false])"); + Perl_croak(aTHX_ "Usage: Mob::Damage(THIS, Mob* from, int32 damage, uint16 spell_id, int attack_skill, [bool avoidable = true], [int8 buffslot = -1], [bool buff_tic = false])"); // @categories Script Utility { Mob *THIS; Mob *from; int32 damage = (int32) SvIV(ST(2)); uint16 spell_id = (uint16) SvUV(ST(3)); - EQEmu::skills::SkillType attack_skill = (EQEmu::skills::SkillType) SvUV(ST(4)); + EQ::skills::SkillType attack_skill = (EQ::skills::SkillType) SvUV(ST(4)); bool avoidable; int8 buffslot; bool iBuffTic; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); from = INT2PTR(Mob *, tmp); @@ -920,19 +675,11 @@ XS(XS_Mob_RangedAttack); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_RangedAttack) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::RangedAttack(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Mob::RangedAttack(THIS, Mob* other)"); // @categories Skills and Recipes, Script Utility { Mob *THIS; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -950,19 +697,11 @@ XS(XS_Mob_ThrowingAttack); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ThrowingAttack) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::ThrowingAttack(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Mob::ThrowingAttack(THIS, Mob* other)"); // @categories Skills and Recipes, Script Utility { Mob *THIS; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -980,18 +719,10 @@ XS(XS_Mob_Heal); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Heal) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::Heal(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::Heal(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Heal(); } XSRETURN_EMPTY; @@ -1002,20 +733,12 @@ XS(XS_Mob_HealDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_HealDamage) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::HealDamage(THIS, int32 amount, [Mob* caster = 0])"); + Perl_croak(aTHX_ "Usage: Mob::HealDamage(THIS, int32 amount, [Mob* caster = 0])"); // @categories Script Utility { Mob *THIS; int32 heal_amt = (int32) SvIV(ST(1)); Mob *caster = nullptr; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items == 3) { if (sv_derived_from(ST(2), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(2))); @@ -1035,18 +758,10 @@ XS(XS_Mob_SetMaxHP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetMaxHP) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::SetMaxHP(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::SetMaxHP(THIS)"); // @categories Stats and Attributes { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetMaxHP(); } XSRETURN_EMPTY; @@ -1056,21 +771,13 @@ XS(XS_Mob_GetLevelCon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetLevelCon) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetLevelCon(THIS, uint8 other_level)"); + Perl_croak(aTHX_ "Usage: Mob::GetLevelCon(THIS, uint8 other_level)"); // @categories Stats and Attributes { Mob *THIS; uint32 RETVAL; dXSTARG; uint8 iOtherLevel = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetLevelCon(iOtherLevel); XSprePUSH; PUSHu((UV) RETVAL); @@ -1082,19 +789,11 @@ XS(XS_Mob_SetHP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetHP) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetHP(THIS, int32 hp)"); + Perl_croak(aTHX_ "Usage: Mob::SetHP(THIS, int32 hp)"); // @categories Stats and Attributes { Mob *THIS; int32 hp = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetHP(hp); } XSRETURN_EMPTY; @@ -1104,20 +803,12 @@ XS(XS_Mob_DoAnim); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DoAnim) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::DoAnim(THIS, int animation_number, [int type = 0])"); + Perl_croak(aTHX_ "Usage: Mob::DoAnim(THIS, int animation_number, [int type = 0])"); // @categories Script Utility { Mob *THIS; int animnum = (int) SvIV(ST(1)); int type; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) type = 0; else { @@ -1133,20 +824,12 @@ XS(XS_Mob_ChangeSize); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ChangeSize) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::ChangeSize(THIS, float in_size, [bool no_restriction = false])"); + Perl_croak(aTHX_ "Usage: Mob::ChangeSize(THIS, float in_size, [bool no_restriction = false])"); // @categories Script Utility { Mob *THIS; float in_size = (float) SvNV(ST(1)); bool bNoRestriction; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) bNoRestriction = false; else { @@ -1160,47 +843,31 @@ XS(XS_Mob_ChangeSize) { XS(XS_Mob_RandomizeFeatures); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_RandomizeFeatures) { - dXSARGS; - if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::RandomizeFeatures(THIS, bool send_illusion, set_variables)"); - { - Mob *THIS; - bool send_illusion = (bool) SvNV(ST(1)); - bool set_variables = (bool) SvNV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - THIS->RandomizeFeatures(send_illusion, set_variables); - } - XSRETURN_EMPTY; + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Mob::RandomizeFeatures(THIS, bool send_illusion, set_variables)"); // @categories Script Utility + { + Mob *THIS; + bool send_illusion = (bool) SvNV(ST(1)); + bool set_variables = (bool) SvNV(ST(2)); + VALIDATE_THIS_IS_MOB; + THIS->RandomizeFeatures(send_illusion, set_variables); + } + XSRETURN_EMPTY; } XS(XS_Mob_GMMove); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GMMove) { dXSARGS; if (items < 4 || items > 5) - Perl_croak(aTHX_ "Usage: Mob::GMMove(THIS, float x, float y, float z, [float heading = 0.01])"); + Perl_croak(aTHX_ "Usage: Mob::GMMove(THIS, float x, float y, float z, [float heading = 0.01])"); // @categories Script Utility { Mob *THIS; float x = (float) SvNV(ST(1)); float y = (float) SvNV(ST(2)); float z = (float) SvNV(ST(3)); float heading; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 5) heading = 0.01; else { @@ -1216,19 +883,11 @@ XS(XS_Mob_HasProcs); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_HasProcs) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HasProcs(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HasProcs(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasProcs(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1240,20 +899,12 @@ XS(XS_Mob_IsInvisible); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsInvisible) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Mob::IsInvisible(THIS, [Mob* other = 0])"); + Perl_croak(aTHX_ "Usage: Mob::IsInvisible(THIS, [Mob* other = 0])"); // @categories Script Utility { Mob *THIS; bool RETVAL; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 2) other = 0; else { @@ -1277,19 +928,11 @@ XS(XS_Mob_SetInvisible); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetInvisible) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetInvisible(THIS, uint8 state)"); + Perl_croak(aTHX_ "Usage: Mob::SetInvisible(THIS, uint8 state)"); // @categories Script Utility { Mob *THIS; uint8 state = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetInvisible(state); } XSRETURN_EMPTY; @@ -1299,20 +942,12 @@ XS(XS_Mob_FindBuff); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_FindBuff) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::FindBuff(THIS, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Mob::FindBuff(THIS, uint16 spell_id)"); // @categories Spells and Disciplines, Script Utility { Mob *THIS; bool RETVAL; uint16 spellid = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->FindBuff(spellid); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1324,21 +959,13 @@ XS(XS_Mob_FindBuffBySlot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_FindBuffBySlot) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::FindBuffBySlot(THIS, int slot)"); + Perl_croak(aTHX_ "Usage: Mob::FindBuffBySlot(THIS, int slot)"); // @categories Spells and Disciplines, Script Utility { Mob *THIS; uint16 RETVAL; dXSTARG; int slot = SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->FindBuffBySlot(slot); XSprePUSH; PUSHu((UV) RETVAL); @@ -1350,20 +977,12 @@ XS(XS_Mob_BuffCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_BuffCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::BuffCount(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::BuffCount(THIS)"); // @categories Script Utility, Spells and Disciplines { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->BuffCount(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1375,22 +994,14 @@ XS(XS_Mob_FindType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_FindType) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::FindType(THIS, uint8 type, [bool offensive = false], [uint16 threshold = 100])"); + Perl_croak(aTHX_ "Usage: Mob::FindType(THIS, uint8 type, [bool offensive = false], [uint16 threshold = 100])"); // @categories Script Utility { Mob *THIS; bool RETVAL; uint8 type = (uint8) SvUV(ST(1)); bool bOffensive; uint16 threshold; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) bOffensive = false; else { @@ -1414,21 +1025,13 @@ XS(XS_Mob_GetBuffSlotFromType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetBuffSlotFromType) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetBuffSlotFromType(THIS, uint16 type)"); + Perl_croak(aTHX_ "Usage: Mob::GetBuffSlotFromType(THIS, uint16 type)"); // @categories Spells and Disciplines, Script Utility { Mob *THIS; int8 RETVAL; dXSTARG; uint16 type = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBuffSlotFromType(type); XSprePUSH; PUSHi((IV) RETVAL); @@ -1440,21 +1043,13 @@ XS(XS_Mob_MakePet); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_MakePet) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::MakePet(THIS, uint16 spell_id, string pet_type, [string name = nullptr])"); + Perl_croak(aTHX_ "Usage: Mob::MakePet(THIS, uint16 spell_id, string pet_type, [string name = nullptr])"); // @categories Pet { Mob *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); char *pettype = (char *) SvPV_nolen(ST(2)); char *name; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 4) name = nullptr; else { @@ -1470,7 +1065,7 @@ XS(XS_Mob_MakeTempPet); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_MakeTempPet) { dXSARGS; if (items < 2 || items > 6) - Perl_croak(aTHX_ "Usage: Mob::MakeTempPet(THIS, uint16 spell_id, [string name = nullptr], [uint32 duration = 0], [Mob* target = nullptr], [bool sticktarg = 0])"); + Perl_croak(aTHX_ "Usage: Mob::MakeTempPet(THIS, uint16 spell_id, [string name = nullptr], [uint32 duration = 0], [Mob* target = nullptr], [bool sticktarg = 0])"); // @categories Pet { Mob *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); @@ -1478,15 +1073,7 @@ XS(XS_Mob_MakeTempPet) { uint32 duration; Mob *target; bool sticktarg; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) name = nullptr; else @@ -1520,7 +1107,7 @@ XS(XS_Mob_TypesTempPet); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_TypesTempPet) { dXSARGS; if (items < 2 || items > 7) - Perl_croak(aTHX_ "Usage: Mob::TypesTempPet(THIS, uint32 type_id, [string name = nullptr], [uint32 duration = 0], [bool follow = 0], [Mob* target = nullptr], [bool stick_targ = 0])"); + Perl_croak(aTHX_ "Usage: Mob::TypesTempPet(THIS, uint32 type_id, [string name = nullptr], [uint32 duration = 0], [bool follow = 0], [Mob* target = nullptr], [bool stick_targ = 0])"); // @categories Pet { Mob *THIS; uint32 typesid = (uint32) SvUV(ST(1)); @@ -1529,15 +1116,7 @@ XS(XS_Mob_TypesTempPet) { bool follow; Mob *target; bool sticktarg; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) name = nullptr; else @@ -1578,20 +1157,12 @@ XS(XS_Mob_GetBaseRace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetBaseRace) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetBaseRace(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetBaseRace(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBaseRace(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1603,20 +1174,12 @@ XS(XS_Mob_GetBaseGender); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetBaseGender) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetBaseGender(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetBaseGender(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBaseGender(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1628,20 +1191,12 @@ XS(XS_Mob_GetDeity); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDeity) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetDeity(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetDeity(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetDeity(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1653,20 +1208,12 @@ XS(XS_Mob_GetRace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetRace) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetRace(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetRace(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetRace(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1678,20 +1225,12 @@ XS(XS_Mob_GetGender); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetGender) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetGender(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetGender(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetGender(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1703,20 +1242,12 @@ XS(XS_Mob_GetTexture); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetTexture) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetTexture(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetTexture(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetTexture(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1728,20 +1259,12 @@ XS(XS_Mob_GetHelmTexture); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHelmTexture) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHelmTexture(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHelmTexture(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHelmTexture(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1753,20 +1276,12 @@ XS(XS_Mob_GetHairColor); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHairColor) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHairColor(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHairColor(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHairColor(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1778,20 +1293,12 @@ XS(XS_Mob_GetBeardColor); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetBeardColor) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetBeardColor(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetBeardColor(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBeardColor(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1803,20 +1310,12 @@ XS(XS_Mob_GetEyeColor1); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetEyeColor1) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetEyeColor1(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetEyeColor1(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetEyeColor1(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1828,20 +1327,12 @@ XS(XS_Mob_GetEyeColor2); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetEyeColor2) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetEyeColor2(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetEyeColor2(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetEyeColor2(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1853,20 +1344,12 @@ XS(XS_Mob_GetHairStyle); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHairStyle) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHairStyle(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHairStyle(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHairStyle(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1878,20 +1361,12 @@ XS(XS_Mob_GetLuclinFace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetLuclinFace) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetLuclinFace(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetLuclinFace(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetLuclinFace(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1903,20 +1378,12 @@ XS(XS_Mob_GetBeard); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetBeard) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetBeard(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetBeard(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBeard(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1928,20 +1395,12 @@ XS(XS_Mob_GetDrakkinHeritage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDrakkinHeritage) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetDrakkinHeritage(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetDrakkinHeritage(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetDrakkinHeritage(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1953,20 +1412,12 @@ XS(XS_Mob_GetDrakkinTattoo); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDrakkinTattoo) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetDrakkinTattoo(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetDrakkinTattoo(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetDrakkinTattoo(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1978,20 +1429,12 @@ XS(XS_Mob_GetDrakkinDetails); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDrakkinDetails) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetDrakkinDetails(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetDrakkinDetails(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetDrakkinDetails(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2003,20 +1446,12 @@ XS(XS_Mob_GetClass); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetClass) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetClass(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetClass(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetClass(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2028,20 +1463,12 @@ XS(XS_Mob_GetLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetLevel) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetLevel(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetLevel(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetLevel(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2053,20 +1480,12 @@ XS(XS_Mob_GetCleanName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetCleanName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetCleanName(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetCleanName(THIS)"); // @categories Script Utility { Mob *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCleanName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -2079,19 +1498,11 @@ XS(XS_Mob_GetTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetTarget) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetTarget(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetTarget(THIS)"); // @categories Script Utility { Mob *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetTarget(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -2103,19 +1514,11 @@ XS(XS_Mob_SetTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetTarget) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetTarget(THIS, mob)"); + Perl_croak(aTHX_ "Usage: Mob::SetTarget(THIS, mob)"); // @categories Script Utility { Mob *THIS; Mob *mob; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -2133,20 +1536,12 @@ XS(XS_Mob_GetHPRatio); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHPRatio) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHPRatio(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHPRatio(THIS)"); // @categories Stats and Attributes { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHPRatio(); XSprePUSH; PUSHn((double) RETVAL); @@ -2158,19 +1553,11 @@ XS(XS_Mob_IsWarriorClass); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsWarriorClass) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsWarriorClass(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsWarriorClass(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsWarriorClass(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2182,20 +1569,12 @@ XS(XS_Mob_GetHP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHP) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHP(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHP(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHP(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2207,20 +1586,12 @@ XS(XS_Mob_GetMaxHP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxHP) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxHP(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxHP(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxHP(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2232,20 +1603,12 @@ XS(XS_Mob_GetItemHPBonuses); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetItemHPBonuses) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetItemHPBonuses(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetItemHPBonuses(THIS)"); // @categories Inventory and Items, Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetItemHPBonuses(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2257,20 +1620,12 @@ XS(XS_Mob_GetSpellHPBonuses); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSpellHPBonuses) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetSpellHPBonuses(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetSpellHPBonuses(THIS)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSpellHPBonuses(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2282,21 +1637,13 @@ XS(XS_Mob_GetSpellIDFromSlot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSpellIDFromSlot) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetSpellIDFromSlot(THIS, slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetSpellIDFromSlot(THIS, slot)"); // @categories Spells and Disciplines { Mob *THIS; int RETVAL; dXSTARG; uint8 slot = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (slot > THIS->GetMaxBuffSlots()) RETVAL = -1; else @@ -2312,20 +1659,12 @@ XS(XS_Mob_GetWalkspeed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWalkspeed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWalkspeed(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWalkspeed(THIS)"); // @categories Stats and Attributes { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetWalkspeed(); XSprePUSH; PUSHn((double) RETVAL); @@ -2337,20 +1676,12 @@ XS(XS_Mob_GetRunspeed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetRunspeed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetRunspeed(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetRunspeed(THIS)"); // @categories Stats and Attributes { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetRunspeed(); XSprePUSH; PUSHn((double) RETVAL); @@ -2362,21 +1693,13 @@ XS(XS_Mob_GetCasterLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetCasterLevel) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetCasterLevel(THIS, spell_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetCasterLevel(THIS, spell_id)"); // @categories Stats and Attributes { Mob *THIS; int RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCasterLevel(spell_id); XSprePUSH; PUSHi((IV) RETVAL); @@ -2388,20 +1711,12 @@ XS(XS_Mob_GetMaxMana); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxMana) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxMana(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxMana(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxMana(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2413,20 +1728,12 @@ XS(XS_Mob_GetMana); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMana) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMana(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMana(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMana(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2438,19 +1745,11 @@ XS(XS_Mob_SetMana); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetMana) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetMana(THIS, amount)"); + Perl_croak(aTHX_ "Usage: Mob::SetMana(THIS, amount)"); // @categories Stats and Attributes { Mob *THIS; int32 amount = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetMana(amount); } XSRETURN_EMPTY; @@ -2460,20 +1759,12 @@ XS(XS_Mob_GetManaRatio); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetManaRatio) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetManaRatio(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetManaRatio(THIS)"); // @categories Stats and Attributes { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetManaRatio(); XSprePUSH; PUSHn((double) RETVAL); @@ -2485,20 +1776,12 @@ XS(XS_Mob_GetAC); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAC) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetAC(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetAC(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAC(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2506,24 +1789,33 @@ XS(XS_Mob_GetAC) { XSRETURN(1); } +XS(XS_Mob_GetDisplayAC); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_GetDisplayAC) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::GetDisplayAC(THIS)"); + { + Mob *THIS; + uint32 RETVAL; + dXSTARG; + VALIDATE_THIS_IS_MOB; + RETVAL = THIS->GetDisplayAC(); + XSprePUSH; + PUSHu((UV) RETVAL); + } + XSRETURN(1); +} + XS(XS_Mob_GetATK); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetATK) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetATK(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetATK(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetATK(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2535,20 +1827,12 @@ XS(XS_Mob_GetSTR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSTR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetSTR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetSTR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSTR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2560,20 +1844,12 @@ XS(XS_Mob_GetSTA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSTA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetSTA(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetSTA(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSTA(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2585,20 +1861,12 @@ XS(XS_Mob_GetDEX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDEX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetDEX(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetDEX(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetDEX(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2610,20 +1878,12 @@ XS(XS_Mob_GetAGI); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAGI) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetAGI(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetAGI(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAGI(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2635,20 +1895,12 @@ XS(XS_Mob_GetINT); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetINT) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetINT(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetINT(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetINT(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2660,20 +1912,12 @@ XS(XS_Mob_GetWIS); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWIS) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWIS(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWIS(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetWIS(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2685,20 +1929,12 @@ XS(XS_Mob_GetCHA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetCHA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetCHA(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetCHA(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCHA(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2710,20 +1946,12 @@ XS(XS_Mob_GetMR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2735,20 +1963,12 @@ XS(XS_Mob_GetFR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetFR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetFR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetFR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetFR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2760,20 +1980,12 @@ XS(XS_Mob_GetDR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetDR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetDR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetDR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2785,20 +1997,12 @@ XS(XS_Mob_GetPR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetPR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetPR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetPR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetPR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2810,20 +2014,12 @@ XS(XS_Mob_GetCR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetCR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetCR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetCR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2835,20 +2031,12 @@ XS(XS_Mob_GetCorruption); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetCorruption) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetCorruption(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetCorruption(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCorrup(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2860,20 +2048,12 @@ XS(XS_Mob_GetPhR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetPhR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetPhR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetPhR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetPhR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2885,20 +2065,12 @@ XS(XS_Mob_GetMaxSTR); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxSTR) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxSTR(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxSTR(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxSTR(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2910,20 +2082,12 @@ XS(XS_Mob_GetMaxSTA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxSTA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxSTA(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxSTA(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxSTA(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2935,20 +2099,12 @@ XS(XS_Mob_GetMaxDEX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxDEX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxDEX(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxDEX(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxDEX(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2960,20 +2116,12 @@ XS(XS_Mob_GetMaxAGI); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxAGI) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxAGI(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxAGI(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxAGI(); XSprePUSH; PUSHi((IV) RETVAL); @@ -2985,20 +2133,12 @@ XS(XS_Mob_GetMaxINT); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxINT) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxINT(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxINT(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxINT(); XSprePUSH; PUSHi((IV) RETVAL); @@ -3010,20 +2150,12 @@ XS(XS_Mob_GetMaxWIS); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxWIS) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxWIS(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxWIS(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxWIS(); XSprePUSH; PUSHi((IV) RETVAL); @@ -3035,20 +2167,12 @@ XS(XS_Mob_GetMaxCHA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetMaxCHA) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMaxCHA(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMaxCHA(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMaxCHA(); XSprePUSH; PUSHi((IV) RETVAL); @@ -3060,22 +2184,14 @@ XS(XS_Mob_GetActSpellRange); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetActSpellRange) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetActSpellRange(THIS, uint16 spell_id, float range)"); + Perl_croak(aTHX_ "Usage: Mob::GetActSpellRange(THIS, uint16 spell_id, float range)"); // @categories Spells and Disciplines { Mob *THIS; float RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); float range = (float) SvNV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetActSpellRange(spell_id, range); XSprePUSH; PUSHn((double) RETVAL); @@ -3087,22 +2203,14 @@ XS(XS_Mob_GetActSpellDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetActSpellDamage) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetActSpellDamage(THIS, uint16 spell_id, int32 value)"); + Perl_croak(aTHX_ "Usage: Mob::GetActSpellDamage(THIS, uint16 spell_id, int32 value)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); int32 value = (int32) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetActSpellDamage(spell_id, value); XSprePUSH; PUSHi((IV) RETVAL); @@ -3114,22 +2222,14 @@ XS(XS_Mob_GetActSpellHealing); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetActSpellHealing) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetActSpellHealing(THIS, uint16 spell_id, int32 value)"); + Perl_croak(aTHX_ "Usage: Mob::GetActSpellHealing(THIS, uint16 spell_id, int32 value)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); int32 value = (int32) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetActSpellHealing(spell_id, value); XSprePUSH; PUSHi((IV) RETVAL); @@ -3141,22 +2241,14 @@ XS(XS_Mob_GetActSpellCost); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetActSpellCost) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetActSpellCost(THIS, uint16 spell_id, int32 cost)"); + Perl_croak(aTHX_ "Usage: Mob::GetActSpellCost(THIS, uint16 spell_id, int32 cost)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); int32 cost = (int32) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetActSpellCost(spell_id, cost); XSprePUSH; PUSHi((IV) RETVAL); @@ -3168,22 +2260,14 @@ XS(XS_Mob_GetActSpellDuration); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetActSpellDuration) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetActSpellDuration(THIS, uint16 spell_id, int32 duration)"); + Perl_croak(aTHX_ "Usage: Mob::GetActSpellDuration(THIS, uint16 spell_id, int32 duration)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); int32 duration = (int32) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetActSpellDuration(spell_id, duration); XSprePUSH; PUSHi((IV) RETVAL); @@ -3195,22 +2279,14 @@ XS(XS_Mob_GetActSpellCasttime); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetActSpellCasttime) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetActSpellCasttime(THIS, uint16 spell_id, uint32 cast_time)"); + Perl_croak(aTHX_ "Usage: Mob::GetActSpellCasttime(THIS, uint16 spell_id, uint32 cast_time)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); int32 casttime = (int32) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetActSpellCasttime(spell_id, casttime); XSprePUSH; PUSHi((IV) RETVAL); @@ -3222,7 +2298,7 @@ XS(XS_Mob_ResistSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ResistSpell) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Mob::ResistSpell(THIS, uint8 resist_type, uint16 spell_id, [Mob* caster = nullptr])"); + Perl_croak(aTHX_ "Usage: Mob::ResistSpell(THIS, uint8 resist_type, uint16 spell_id, [Mob* caster = nullptr])"); // @categories Spells and Disciplines, Script Utility { Mob *THIS; double RETVAL; @@ -3230,15 +2306,7 @@ XS(XS_Mob_ResistSpell) { uint8 ressit_type = (uint8) SvUV(ST(1)); uint16 spell_id = (uint16) SvUV(ST(2)); Mob *caster; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(3), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(3))); caster = INT2PTR(Mob *, tmp); @@ -3258,21 +2326,13 @@ XS(XS_Mob_GetSpecializeSkillValue); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSpecializeSkillValue) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetSpecializeSkillValue(THIS, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetSpecializeSkillValue(THIS, uint16 spell_id)"); // @categories Skills and Recipes, Spells and Disciplines { Mob *THIS; uint16 RETVAL; dXSTARG; uint16 spell_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSpecializeSkillValue(spell_id); XSprePUSH; PUSHu((UV) RETVAL); @@ -3284,20 +2344,12 @@ XS(XS_Mob_GetNPCTypeID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetNPCTypeID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetNPCTypeID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetNPCTypeID(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetNPCTypeID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -3309,19 +2361,11 @@ XS(XS_Mob_IsTargeted); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsTargeted) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsTargeted(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsTargeted(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsTargeted(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -3333,20 +2377,12 @@ XS(XS_Mob_GetX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetX(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetX(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetX(); XSprePUSH; PUSHn((double) RETVAL); @@ -3358,20 +2394,12 @@ XS(XS_Mob_GetY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetY(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetY(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetY(); XSprePUSH; PUSHn((double) RETVAL); @@ -3383,20 +2411,12 @@ XS(XS_Mob_GetZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetZ(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetZ(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetZ(); XSprePUSH; PUSHn((double) RETVAL); @@ -3408,20 +2428,12 @@ XS(XS_Mob_GetHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHeading) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHeading(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHeading(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHeading(); XSprePUSH; PUSHn((double) RETVAL); @@ -3434,20 +2446,12 @@ XS(XS_Mob_GetWaypointX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWaypointX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWaypointX(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWaypointX(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCurrentWayPoint().x; XSprePUSH; PUSHn((double) RETVAL); @@ -3459,20 +2463,12 @@ XS(XS_Mob_GetWaypointY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWaypointY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWaypointY(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWaypointY(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCurrentWayPoint().y; XSprePUSH; PUSHn((double) RETVAL); @@ -3484,20 +2480,12 @@ XS(XS_Mob_GetWaypointZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWaypointZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWaypointZ(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWaypointZ(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCurrentWayPoint().z; XSprePUSH; PUSHn((double) RETVAL); @@ -3509,20 +2497,12 @@ XS(XS_Mob_GetWaypointH); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWaypointH) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWaypointH(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWaypointH(THIS)"); // @categories Script Utility { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCurrentWayPoint().w; XSprePUSH; PUSHn((double) RETVAL); @@ -3534,20 +2514,12 @@ XS(XS_Mob_GetWaypointPause); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWaypointPause) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWaypointPause(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWaypointPause(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCWPP(); XSprePUSH; PUSHu((UV) RETVAL); @@ -3559,20 +2531,12 @@ XS(XS_Mob_GetWaypointID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetWaypointID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetWaypointID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetWaypointID(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetCWP(); XSprePUSH; PUSHu((UV) RETVAL); @@ -3584,19 +2548,11 @@ XS(XS_Mob_SetCurrentWP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetCurrentWP) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetCurrentWP(THIS, waypoint)"); + Perl_croak(aTHX_ "Usage: Mob::SetCurrentWP(THIS, waypoint)"); // @categories Script Utility { Mob *THIS; uint16 waypoint = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetCurrentWP(waypoint); } XSRETURN_EMPTY; @@ -3606,20 +2562,12 @@ XS(XS_Mob_GetSize); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSize) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetSize(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetSize(THIS)"); // @categories Stats and Attributes { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSize(); XSprePUSH; PUSHn((double) RETVAL); @@ -3631,19 +2579,11 @@ XS(XS_Mob_SetFollowID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetFollowID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetFollowID(THIS, id)"); + Perl_croak(aTHX_ "Usage: Mob::SetFollowID(THIS, id)"); // @categories Script Utility { Mob *THIS; uint32 id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetFollowID(id); } XSRETURN_EMPTY; @@ -3653,20 +2593,12 @@ XS(XS_Mob_GetFollowID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetFollowID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetFollowID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetFollowID(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetFollowID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -3678,20 +2610,12 @@ XS(XS_Mob_Message); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Message) { dXSARGS; if (items < 3) - Perl_croak(aTHX_ "Usage: Mob::Message(THIS, uint32 emote_color_type, string message)"); + Perl_croak(aTHX_ "Usage: Mob::Message(THIS, uint32 emote_color_type, string message)"); // @categories Script Utility { Mob *THIS; uint32 type = (uint32) SvUV(ST(1)); char *message = (char *) SvPV_nolen(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Message(type, message); } XSRETURN_EMPTY; @@ -3701,21 +2625,13 @@ XS(XS_Mob_Message_StringID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Message_StringID) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::Message_StringID(THIS, uint32 emote_color_type, uint32 string_id, [uint32 distance = 0])"); + Perl_croak(aTHX_ "Usage: Mob::Message_StringID(THIS, uint32 emote_color_type, uint32 string_id, [uint32 distance = 0])"); // @categories Script Utility { Mob *THIS; uint32 type = (uint32) SvUV(ST(1)); uint32 string_id = (uint32) SvUV(ST(2)); uint32 distance; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 4) distance = 0; else { @@ -3731,19 +2647,11 @@ XS(XS_Mob_Say); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Say) { dXSARGS; if (items < 2) - Perl_croak(aTHX_ "Usage: Mob::Say(THIS, string message)"); + Perl_croak(aTHX_ "Usage: Mob::Say(THIS, string message)"); // @categories Script Utility { Mob *THIS; char *format = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Say(format); } XSRETURN_EMPTY; @@ -3753,19 +2661,11 @@ XS(XS_Mob_Shout); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Shout) { dXSARGS; if (items < 2) - Perl_croak(aTHX_ "Usage: Mob::Shout(THIS, string message)"); + Perl_croak(aTHX_ "Usage: Mob::Shout(THIS, string message)"); // @categories Script Utility { Mob *THIS; char *format = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Shout(format); } XSRETURN_EMPTY; @@ -3775,19 +2675,11 @@ XS(XS_Mob_Emote); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Emote) { dXSARGS; if (items < 2) - Perl_croak(aTHX_ "Usage: Mob::Emote(THIS, string message)"); + Perl_croak(aTHX_ "Usage: Mob::Emote(THIS, string message)"); // @categories Script Utility { Mob *THIS; char *format = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Emote(format); } XSRETURN_EMPTY; @@ -3797,19 +2689,11 @@ XS(XS_Mob_InterruptSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_InterruptSpell) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Mob::InterruptSpell(THIS, [uint16 spell_id = 0xFFFF])"); + Perl_croak(aTHX_ "Usage: Mob::InterruptSpell(THIS, [uint16 spell_id = 0xFFFF])"); // @categories Script Utility { Mob *THIS; uint16 spellid; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 2) spellid = 0xFFFF; else { @@ -3825,28 +2709,20 @@ XS(XS_Mob_CastSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CastSpell) { dXSARGS; if (items < 3 || items > 7) - Perl_croak(aTHX_ "Usage: Mob::CastSpell(THIS, uint16 spell_id, uint16 target_id, [int slot = 22], [int32 cast_time = -1], [int32 mana_cost = -1], [int16 resist_adjust = 0])"); + Perl_croak(aTHX_ "Usage: Mob::CastSpell(THIS, uint16 spell_id, uint16 target_id, [int slot = 22], [int32 cast_time = -1], [int32 mana_cost = -1], [int16 resist_adjust = 0])"); // @categories Spells and Disciplines { Mob *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); uint16 target_id = (uint16) SvUV(ST(2)); - EQEmu::spells::CastingSlot slot; + EQ::spells::CastingSlot slot; int32 casttime; int32 mana_cost; int16 resist_adjust; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 4) - slot = EQEmu::spells::CastingSlot::Item; + slot = EQ::spells::CastingSlot::Item; else { - slot = static_cast(SvUV(ST(3))); + slot = static_cast(SvUV(ST(3))); } if (items < 5) @@ -3881,22 +2757,14 @@ XS(XS_Mob_SpellFinished); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SpellFinished) { dXSARGS; if (items < 2 || items > 5) - Perl_croak(aTHX_ "Usage: Mob::SpellFinished(uint16 spell_id, [Mob* spell_target = this], [uint16 mana_cost = 0], [uint16 resist_diff = 0])"); + Perl_croak(aTHX_ "Usage: Mob::SpellFinished(uint16 spell_id, [Mob* spell_target = this], [uint16 mana_cost = 0], [uint16 resist_diff = 0])"); // @categories Spells and Disciplines { Mob *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); Mob *spell_target; uint16 mana_cost = 0; int16 resist_diff; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; spell_target = THIS; if (items > 2) { @@ -3919,7 +2787,7 @@ XS(XS_Mob_SpellFinished) { resist_diff = spells[spell_id].ResistDiff; } - THIS->SpellFinished(spell_id, spell_target, EQEmu::spells::CastingSlot::Item, mana_cost, -1, resist_diff); + THIS->SpellFinished(spell_id, spell_target, EQ::spells::CastingSlot::Item, mana_cost, -1, resist_diff); } XSRETURN_EMPTY; } @@ -3928,21 +2796,13 @@ XS(XS_Mob_IsImmuneToSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsImmuneToSpell) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::IsImmuneToSpell(THIS, uint16 spell_id, [Mob* caster = nullptr])"); + Perl_croak(aTHX_ "Usage: Mob::IsImmuneToSpell(THIS, uint16 spell_id, [Mob* caster = nullptr])"); // @categories Spells and Disciplines, Script Utility { Mob *THIS; bool RETVAL; uint16 spell_id = (uint16) SvUV(ST(1)); Mob *caster; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(2), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(2))); caster = INT2PTR(Mob *, tmp); @@ -3962,19 +2822,11 @@ XS(XS_Mob_BuffFadeBySpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_BuffFadeBySpellID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::BuffFadeBySpellID(THIS, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Mob::BuffFadeBySpellID(THIS, uint16 spell_id)"); // @categories Script Utility, Spells and Disciplines { Mob *THIS; uint16 spell_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->BuffFadeBySpellID(spell_id); } XSRETURN_EMPTY; @@ -3984,20 +2836,12 @@ XS(XS_Mob_BuffFadeByEffect); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_BuffFadeByEffect) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::BuffFadeByEffect(THIS, int effect_id, int skip_slot = -1)"); + Perl_croak(aTHX_ "Usage: Mob::BuffFadeByEffect(THIS, int effect_id, int skip_slot = -1)"); // @categories Script Utility, Spells and Disciplines { Mob *THIS; int effectid = (int) SvIV(ST(1)); int skipslot; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) skipslot = -1; else { @@ -4013,18 +2857,10 @@ XS(XS_Mob_BuffFadeAll); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_BuffFadeAll) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::BuffFadeAll(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::BuffFadeAll(THIS)"); // @categories Script Utility, Spells and Disciplines { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->BuffFadeAll(); } XSRETURN_EMPTY; @@ -4034,20 +2870,12 @@ XS(XS_Mob_BuffFadeBySlot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_BuffFadeBySlot) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::BuffFadeBySlot(THIS, int slot, bool recalc_bonuses = true)"); + Perl_croak(aTHX_ "Usage: Mob::BuffFadeBySlot(THIS, int slot, bool recalc_bonuses = true)"); // @categories Script Utility, Spells and Disciplines { Mob *THIS; int slot = (int) SvIV(ST(1)); bool iRecalcBonuses; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) iRecalcBonuses = true; else { @@ -4063,7 +2891,7 @@ XS(XS_Mob_CanBuffStack); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CanBuffStack) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::CanBuffStack(THIS, uint16 spell_id, uint8 caster_level, [bool fail_if_overwritten = false])"); + Perl_croak(aTHX_ "Usage: Mob::CanBuffStack(THIS, uint16 spell_id, uint8 caster_level, [bool fail_if_overwritten = false])"); // @categories Script Utility, Spells and Disciplines { Mob *THIS; int RETVAL; @@ -4071,15 +2899,7 @@ XS(XS_Mob_CanBuffStack) { uint16 spellid = (uint16) SvUV(ST(1)); uint8 caster_level = (uint8) SvUV(ST(2)); bool iFailIfOverwrite; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 4) iFailIfOverwrite = false; else { @@ -4097,19 +2917,11 @@ XS(XS_Mob_IsCasting); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsCasting) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsCasting(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsCasting(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsCasting(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4121,20 +2933,12 @@ XS(XS_Mob_CastingSpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CastingSpellID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CastingSpellID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CastingSpellID(THIS)"); // @categories Spells and Disciplines { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CastingSpellID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4146,20 +2950,12 @@ XS(XS_Mob_SetAppearance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetAppearance) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::SetAppearance(THIS, int appearance [0|1|2|3|4], [ignore_self = true])"); + Perl_croak(aTHX_ "Usage: Mob::SetAppearance(THIS, int appearance [0|1|2|3|4], [ignore_self = true])"); // @categories Stats and Attributes { Mob *THIS; EmuAppearance app = (EmuAppearance) SvUV(ST(1)); bool iIgnoreSelf; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 3) iIgnoreSelf = true; else { @@ -4175,20 +2971,12 @@ XS(XS_Mob_GetAppearance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAppearance) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetAppearance(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetAppearance(THIS)"); // @categories Stats and Attributes { Mob *THIS; EmuAppearance RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAppearance(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4200,20 +2988,12 @@ XS(XS_Mob_GetRunAnimSpeed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetRunAnimSpeed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetRunAnimSpeed(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetRunAnimSpeed(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetRunAnimSpeed(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4225,19 +3005,11 @@ XS(XS_Mob_SetRunAnimSpeed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetRunAnimSpeed) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetRunAnimSpeed(THIS, int8 speed)"); + Perl_croak(aTHX_ "Usage: Mob::SetRunAnimSpeed(THIS, int8 speed)"); // @categories Stats and Attributes { Mob *THIS; int8 in = (int8) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetRunAnimSpeed(in); } XSRETURN_EMPTY; @@ -4247,19 +3019,11 @@ XS(XS_Mob_SetPetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetPetID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetPetID(THIS, uint16 new_pet_id)"); + Perl_croak(aTHX_ "Usage: Mob::SetPetID(THIS, uint16 new_pet_id)"); // @categories Pet { Mob *THIS; uint16 NewPetID = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetPetID(NewPetID); } XSRETURN_EMPTY; @@ -4269,20 +3033,12 @@ XS(XS_Mob_GetPetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetPetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetPetID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetPetID(THIS)"); // @categories Script Utility, Pet { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetPetID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4294,19 +3050,11 @@ XS(XS_Mob_SetOwnerID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetOwnerID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetOwnerID(THIS, uint16 new_owner_id)"); + Perl_croak(aTHX_ "Usage: Mob::SetOwnerID(THIS, uint16 new_owner_id)"); // @categories Pet { Mob *THIS; uint16 NewOwnerID = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetOwnerID(NewOwnerID); } XSRETURN_EMPTY; @@ -4316,20 +3064,12 @@ XS(XS_Mob_GetOwnerID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetOwnerID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetOwnerID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetOwnerID(THIS)"); // @categories Script Utility, Pet { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetOwnerID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4341,20 +3081,12 @@ XS(XS_Mob_GetPetType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetPetType) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetPetType(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetPetType(THIS)"); // @categories Script Utility, Pet { Mob *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetPetType(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4366,20 +3098,12 @@ XS(XS_Mob_GetBodyType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetBodyType) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetBodyType(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetBodyType(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBodyType(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4395,15 +3119,7 @@ XS(XS_Mob_Stun) { { Mob *THIS; int duration = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Stun(duration); } XSRETURN_EMPTY; @@ -4413,18 +3129,10 @@ XS(XS_Mob_Spin); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Spin) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::Spin(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::Spin(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Spin(); } XSRETURN_EMPTY; @@ -4434,18 +3142,10 @@ XS(XS_Mob_Kill); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Kill) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::Kill(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::Kill(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Kill(); } XSRETURN_EMPTY; @@ -4455,19 +3155,11 @@ XS(XS_Mob_SetInvul); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetInvul) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetInvul(THIS, bool set_invulnerable)"); + Perl_croak(aTHX_ "Usage: Mob::SetInvul(THIS, bool set_invulnerable)"); // @categories Script Utility { Mob *THIS; bool invul = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetInvul(invul); } XSRETURN_EMPTY; @@ -4477,19 +3169,11 @@ XS(XS_Mob_GetInvul); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetInvul) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetInvul(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetInvul(THIS)"); // @categories Script Utility, Stats and Attributes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetInvul(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4501,19 +3185,11 @@ XS(XS_Mob_SetExtraHaste); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetExtraHaste) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetExtraHaste(THIS, int haste)"); + Perl_croak(aTHX_ "Usage: Mob::SetExtraHaste(THIS, int haste)"); // @categories Script Utility, Stats and Attributes { Mob *THIS; int Haste = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetExtraHaste(Haste); } XSRETURN_EMPTY; @@ -4523,20 +3199,12 @@ XS(XS_Mob_GetHaste); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHaste) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHaste(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHaste(THIS)"); // @categories Stats and Attributes { Mob *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHaste(); XSprePUSH; PUSHi((IV) RETVAL); @@ -4548,20 +3216,12 @@ XS(XS_Mob_GetHandToHandDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHandToHandDamage) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHandToHandDamage(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHandToHandDamage(THIS)"); // @categories Stats and Attributes { Mob *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHandToHandDamage(); XSprePUSH; PUSHi((IV) RETVAL); @@ -4573,19 +3233,11 @@ XS(XS_Mob_CanThisClassDoubleAttack); /* prototype to pass -Wmissing-prototypes * XS(XS_Mob_CanThisClassDoubleAttack) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CanThisClassDoubleAttack(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CanThisClassDoubleAttack(THIS)"); // @categories Skills and Recipes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CanThisClassDoubleAttack(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4597,19 +3249,11 @@ XS(XS_Mob_CanThisClassDualWield); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CanThisClassDualWield) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CanThisClassDualWield(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CanThisClassDualWield(THIS)"); // @categories Skills and Recipes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CanThisClassDualWield(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4621,19 +3265,11 @@ XS(XS_Mob_CanThisClassRiposte); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CanThisClassRiposte) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CanThisClassRiposte(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CanThisClassRiposte(THIS)"); // @categories Skills and Recipes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CanThisClassRiposte(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4645,19 +3281,11 @@ XS(XS_Mob_CanThisClassDodge); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CanThisClassDodge) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CanThisClassDodge(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CanThisClassDodge(THIS)"); // @categories Skills and Recipes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CanThisClassDodge(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4669,19 +3297,11 @@ XS(XS_Mob_CanThisClassParry); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CanThisClassParry) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::CanThisClassParry(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::CanThisClassParry(THIS)"); // @categories Skills and Recipes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CanThisClassParry(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4693,20 +3313,12 @@ XS(XS_Mob_GetHandToHandDelay); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHandToHandDelay) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHandToHandDelay(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHandToHandDelay(THIS)"); // @categories Stats and Attributes { Mob *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHandToHandDelay(); XSprePUSH; PUSHi((IV) RETVAL); @@ -4718,20 +3330,12 @@ XS(XS_Mob_GetClassLevelFactor); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetClassLevelFactor) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetClassLevelFactor(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetClassLevelFactor(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetClassLevelFactor(); XSprePUSH; PUSHu((UV) RETVAL); @@ -4743,18 +3347,10 @@ XS(XS_Mob_Mesmerize); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Mesmerize) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::Mesmerize(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::Mesmerize(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->Mesmerize(); } XSRETURN_EMPTY; @@ -4764,19 +3360,11 @@ XS(XS_Mob_IsMezzed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsMezzed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsMezzed(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsMezzed(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsMezzed(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4788,19 +3376,11 @@ XS(XS_Mob_IsStunned); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsStunned) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsStunned(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsStunned(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsStunned(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4813,18 +3393,10 @@ XS(XS_Mob_StartEnrage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_StartEnrage) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::StartEnrage(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::StartEnrage(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->StartEnrage(); } XSRETURN_EMPTY; @@ -4834,19 +3406,11 @@ XS(XS_Mob_IsEnraged); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsEnraged) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsEnraged(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsEnraged(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsEnraged(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4858,21 +3422,13 @@ XS(XS_Mob_GetReverseFactionCon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetReverseFactionCon) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetReverseFactionCon(THIS, iOther)"); + Perl_croak(aTHX_ "Usage: Mob::GetReverseFactionCon(THIS, iOther)"); // @categories Faction { Mob *THIS; FACTION_VALUE RETVAL; dXSTARG; Mob *iOther; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); iOther = INT2PTR(Mob *, tmp); @@ -4892,19 +3448,11 @@ XS(XS_Mob_IsAIControlled); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsAIControlled) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsAIControlled(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsAIControlled(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsAIControlled(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -4916,20 +3464,12 @@ XS(XS_Mob_GetAggroRange); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAggroRange) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetAggroRange(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetAggroRange(THIS)"); // @categories Stats and Attributes, Hate and Aggro { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAggroRange(); XSprePUSH; PUSHn((double) RETVAL); @@ -4941,20 +3481,12 @@ XS(XS_Mob_GetAssistRange); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAssistRange) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetAssistRange(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetAssistRange(THIS)"); // @categories Stats and Attributes, Hate and Aggro { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAssistRange(); XSprePUSH; PUSHn((double) RETVAL); @@ -4966,19 +3498,11 @@ XS(XS_Mob_SetPetOrder); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetPetOrder) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetPetOrder(THIS, i)"); + Perl_croak(aTHX_ "Usage: Mob::SetPetOrder(THIS, i)"); // @categories Pet { Mob *THIS; Mob::eStandingPetOrder i = (Mob::eStandingPetOrder) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetPetOrder(i); } XSRETURN_EMPTY; @@ -4988,20 +3512,12 @@ XS(XS_Mob_GetPetOrder); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetPetOrder) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetPetOrder(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetPetOrder(THIS)"); // @categories Script Utility, Pet { Mob *THIS; Mob::eStandingPetOrder RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetPetOrder(); XSprePUSH; PUSHi((IV) RETVAL); @@ -5013,19 +3529,11 @@ XS(XS_Mob_IsRoamer); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsRoamer) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsRoamer(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsRoamer(THIS)"); // @categories Script Utility, Spawns { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsRoamer(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5037,19 +3545,11 @@ XS(XS_Mob_IsRooted); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsRooted) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsRooted(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsRooted(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsRooted(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5061,7 +3561,7 @@ XS(XS_Mob_AddToHateList); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_AddToHateList) { dXSARGS; if (items < 2 || items > 7) - Perl_croak(aTHX_ "Usage: Mob::AddToHateList(THIS, Mob* other, [int32 hate = 0], [int32 damage = 0], [bool yell_for_help = true], [bool frenzy = false], [bool buff_tic = false])"); + Perl_croak(aTHX_ "Usage: Mob::AddToHateList(THIS, Mob* other, [int32 hate = 0], [int32 damage = 0], [bool yell_for_help = true], [bool frenzy = false], [bool buff_tic = false])"); // @categories Hate and Aggro { Mob *THIS; Mob *other; @@ -5070,15 +3570,7 @@ XS(XS_Mob_AddToHateList) { bool iYellForHelp; bool bFrenzy; bool iBuffTic; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -5126,21 +3618,13 @@ XS(XS_Mob_SetHate); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetHate) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::SetHate(THIS, Mob* other, [int32 hate = 0], [int32 damage = 0])"); + Perl_croak(aTHX_ "Usage: Mob::SetHate(THIS, Mob* other, [int32 hate = 0], [int32 damage = 0])"); // @categories Hate and Aggro { Mob *THIS; Mob *other; int32 hate; int32 damage; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -5170,19 +3654,11 @@ XS(XS_Mob_HalveAggro); XS(XS_Mob_HalveAggro) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::HalveAggro(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Mob::HalveAggro(THIS, Mob* other)"); // @categories Hate and Aggro { Mob *THIS; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -5200,19 +3676,11 @@ XS(XS_Mob_DoubleAggro); XS(XS_Mob_DoubleAggro) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::DoubleAggro(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Mob::DoubleAggro(THIS, Mob* other)"); // @categories Hate and Aggro { Mob *THIS; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -5230,22 +3698,14 @@ XS(XS_Mob_GetHateAmount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHateAmount) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::GetHateAmount(THIS, Mob* mob, [bool is_damage = false])"); + Perl_croak(aTHX_ "Usage: Mob::GetHateAmount(THIS, Mob* mob, [bool is_damage = false])"); // @categories Hate and Aggro { Mob *THIS; uint32 RETVAL; dXSTARG; Mob *tmob; bool is_dam; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); tmob = INT2PTR(Mob *, tmp); @@ -5271,21 +3731,13 @@ XS(XS_Mob_GetDamageAmount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetDamageAmount) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetDamageAmount(THIS, Mob* target_mob)"); + Perl_croak(aTHX_ "Usage: Mob::GetDamageAmount(THIS, Mob* target_mob)"); // @categories Stats and Attributes { Mob *THIS; uint32 RETVAL; dXSTARG; Mob *tmob; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); tmob = INT2PTR(Mob *, tmp); @@ -5305,19 +3757,11 @@ XS(XS_Mob_GetHateTop); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHateTop) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHateTop(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHateTop(THIS)"); // @categories Hate and Aggro { Mob *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHateTop(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -5329,20 +3773,12 @@ XS(XS_Mob_GetHateDamageTop); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHateDamageTop) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetHateDamageTop(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Mob::GetHateDamageTop(THIS, Mob* other)"); // @categories Hate and Aggro { Mob *THIS; Mob *RETVAL; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -5362,19 +3798,11 @@ XS(XS_Mob_GetHateRandom); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetHateRandom) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHateRandom(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHateRandom(THIS)"); // @categories Hate and Aggro { Mob *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHateRandom(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -5386,19 +3814,11 @@ XS(XS_Mob_IsEngaged); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsEngaged) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsEngaged(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsEngaged(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsEngaged(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5410,19 +3830,11 @@ XS(XS_Mob_HateSummon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_HateSummon) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HateSummon(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HateSummon(THIS)"); // @categories Hate and Aggro { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HateSummon(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -5434,19 +3846,11 @@ XS(XS_Mob_FaceTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_FaceTarget) { dXSARGS; if (items < 1 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::FaceTarget(THIS, [Mob* target = 0])"); + Perl_croak(aTHX_ "Usage: Mob::FaceTarget(THIS, [Mob* target = 0])"); // @categories Script Utility { Mob *THIS; Mob *MobToFace; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items < 2) MobToFace = 0; else { @@ -5468,19 +3872,11 @@ XS(XS_Mob_SetHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetHeading) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetHeading(THIS, float heading)"); + Perl_croak(aTHX_ "Usage: Mob::SetHeading(THIS, float heading)"); // @categories Script Utility { Mob *THIS; float iHeading = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetHeading(iHeading); } XSRETURN_EMPTY; @@ -5490,18 +3886,10 @@ XS(XS_Mob_WipeHateList); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_WipeHateList) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::WipeHateList(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::WipeHateList(THIS)"); // @categories Hate and Aggro { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->WipeHateList(); } XSRETURN_EMPTY; @@ -5511,20 +3899,12 @@ XS(XS_Mob_CheckAggro); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CheckAggro) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::CheckAggro(THIS, Mob* other)"); + Perl_croak(aTHX_ "Usage: Mob::CheckAggro(THIS, Mob* other)"); // @categories Hate and Aggro { Mob *THIS; bool RETVAL; Mob *other; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -5544,22 +3924,14 @@ XS(XS_Mob_CalculateHeadingToTarget); /* prototype to pass -Wmissing-prototypes * XS(XS_Mob_CalculateHeadingToTarget) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::CalculateHeadingToTarget(THIS, float x, float y)"); + Perl_croak(aTHX_ "Usage: Mob::CalculateHeadingToTarget(THIS, float x, float y)"); // @categories Script Utility { Mob *THIS; int8 RETVAL; dXSTARG; float in_x = (float) SvNV(ST(1)); float in_y = (float) SvNV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CalculateHeadingToTarget(in_x, in_y); XSprePUSH; PUSHi((IV) RETVAL); @@ -5578,17 +3950,7 @@ XS(XS_Mob_RunTo) { float x = (float)SvNV(ST(1)); float y = (float)SvNV(ST(2)); float z = (float)SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *)SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_MOB; THIS->RunTo(x, y, z); } XSRETURN_EMPTY; @@ -5605,17 +3967,7 @@ XS(XS_Mob_WalkTo) { float x = (float)SvNV(ST(1)); float y = (float)SvNV(ST(2)); float z = (float)SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *)SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_MOB; THIS->WalkTo(x, y, z); } XSRETURN_EMPTY; @@ -5625,22 +3977,13 @@ XS(XS_Mob_NavigateTo); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_NavigateTo) { dXSARGS; if (items < 4 || items > 5) - Perl_croak(aTHX_ "Usage: Mob::NavigateTo(THIS, float x, float y, float z)"); + Perl_croak(aTHX_ "Usage: Mob::NavigateTo(THIS, float x, float y, float z)"); // @categories Script Utility { Mob *THIS; float x = (float) SvNV(ST(1)); float y = (float) SvNV(ST(2)); float z = (float) SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_MOB; THIS->NavigateTo(x, y, z); } XSRETURN_EMPTY; @@ -5654,17 +3997,7 @@ XS(XS_Mob_StopNavigation) { "Usage: Mob::StopNavigation(THIS)"); { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *)SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_MOB; THIS->StopNavigation(); } XSRETURN_EMPTY; @@ -5674,7 +4007,7 @@ XS(XS_Mob_CalculateDistance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CalculateDistance) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Mob::CalculateDistance(THIS, float x, float y, float z)"); + Perl_croak(aTHX_ "Usage: Mob::CalculateDistance(THIS, float x, float y, float z)"); // @categories Script Utility { Mob *THIS; float RETVAL; @@ -5682,15 +4015,7 @@ XS(XS_Mob_CalculateDistance) { float x = (float) SvNV(ST(1)); float y = (float) SvNV(ST(2)); float z = (float) SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CalculateDistance(x, y, z); XSprePUSH; PUSHn((double) RETVAL); @@ -5702,21 +4027,13 @@ XS(XS_Mob_SendTo); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SendTo) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Mob::SendTo(THIS, float new_x, float new_y, float new_z)"); + Perl_croak(aTHX_ "Usage: Mob::SendTo(THIS, float new_x, float new_y, float new_z)"); // @categories Script Utility { Mob *THIS; float new_x = (float) SvNV(ST(1)); float new_y = (float) SvNV(ST(2)); float new_z = (float) SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendTo(new_x, new_y, new_z); } XSRETURN_EMPTY; @@ -5726,21 +4043,13 @@ XS(XS_Mob_SendToFixZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SendToFixZ) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Mob::SendToFixZ(THIS, float new_x, float new_y, float new_z)"); + Perl_croak(aTHX_ "Usage: Mob::SendToFixZ(THIS, float new_x, float new_y, float new_z)"); // @categories Script Utility { Mob *THIS; float new_x = (float) SvNV(ST(1)); float new_y = (float) SvNV(ST(2)); float new_z = (float) SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendToFixZ(new_x, new_y, new_z); } XSRETURN_EMPTY; @@ -5750,22 +4059,14 @@ XS(XS_Mob_NPCSpecialAttacks); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_NPCSpecialAttacks) { dXSARGS; if (items < 3 || items > 5) - Perl_croak(aTHX_ "Usage: Mob::NPCSpecialAttacks(THIS, string abilities_string, int perm_tag, [bool reset = true], [bool remove = true])"); + Perl_croak(aTHX_ "Usage: Mob::NPCSpecialAttacks(THIS, string abilities_string, int perm_tag, [bool reset = true], [bool remove = true])"); // @categories Stats and Attributes { Mob *THIS; char *parse = (char *) SvPV_nolen(ST(1)); int permtag = (int) SvIV(ST(2)); bool reset = items == 4 ? (bool) SvTRUE(ST(3)) : true; bool remove = items == 5 ? (bool) SvTRUE(ST(4)) : false; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->NPCSpecialAttacks(parse, permtag, reset, remove); } XSRETURN_EMPTY; @@ -5775,20 +4076,12 @@ XS(XS_Mob_DontHealMeBefore); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DontHealMeBefore) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::DontHealMeBefore(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::DontHealMeBefore(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->DontHealMeBefore(); XSprePUSH; PUSHu((UV) RETVAL); @@ -5800,20 +4093,12 @@ XS(XS_Mob_DontBuffMeBefore); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DontBuffMeBefore) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::DontBuffMeBefore(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::DontBuffMeBefore(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->DontBuffMeBefore(); XSprePUSH; PUSHu((UV) RETVAL); @@ -5825,20 +4110,12 @@ XS(XS_Mob_DontDotMeBefore); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DontDotMeBefore) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::DontDotMeBefore(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::DontDotMeBefore(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->DontDotMeBefore(); XSprePUSH; PUSHu((UV) RETVAL); @@ -5850,20 +4127,12 @@ XS(XS_Mob_DontRootMeBefore); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DontRootMeBefore) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::DontRootMeBefore(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::DontRootMeBefore(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->DontRootMeBefore(); XSprePUSH; PUSHu((UV) RETVAL); @@ -5875,20 +4144,12 @@ XS(XS_Mob_DontSnareMeBefore); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DontSnareMeBefore) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::DontSnareMeBefore(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::DontSnareMeBefore(THIS)"); // @categories Script Utility { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->DontSnareMeBefore(); XSprePUSH; PUSHu((UV) RETVAL); @@ -5900,21 +4161,13 @@ XS(XS_Mob_GetResist); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetResist) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetResist(THIS, type)"); + Perl_croak(aTHX_ "Usage: Mob::GetResist(THIS, type)"); // @categories Stats and Attributes { Mob *THIS; int16 RETVAL; dXSTARG; uint8 type = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetResist(type); XSprePUSH; PUSHi((IV) RETVAL); @@ -5926,19 +4179,11 @@ XS(XS_Mob_GetShieldTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetShieldTarget) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetShieldTarget(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetShieldTarget(THIS)"); // @categories Script Utility { Mob *THIS; Mob *RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetShieldTarget(); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Mob", (void *) RETVAL); @@ -5950,19 +4195,11 @@ XS(XS_Mob_SetShieldTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetShieldTarget) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetShieldTarget(THIS, mob)"); + Perl_croak(aTHX_ "Usage: Mob::SetShieldTarget(THIS, mob)"); // @categories Script Utility { Mob *THIS; Mob *mob; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -5980,19 +4217,11 @@ XS(XS_Mob_Charmed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_Charmed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::Charmed(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::Charmed(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->Charmed(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -6004,21 +4233,13 @@ XS(XS_Mob_GetLevelHP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetLevelHP) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetLevelHP(THIS, uint8 level)"); + Perl_croak(aTHX_ "Usage: Mob::GetLevelHP(THIS, uint8 level)"); // @categories Stats and Attributes { Mob *THIS; uint32 RETVAL; dXSTARG; uint8 tlevel = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetLevelHP(tlevel); XSprePUSH; PUSHu((UV) RETVAL); @@ -6030,20 +4251,12 @@ XS(XS_Mob_GetZoneID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetZoneID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetZoneID(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetZoneID(THIS)"); // @categories Zones { Mob *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetZoneID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -6055,21 +4268,13 @@ XS(XS_Mob_CheckAggroAmount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CheckAggroAmount) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::CheckAggroAmount(THIS, uint16 spell_id)"); + Perl_croak(aTHX_ "Usage: Mob::CheckAggroAmount(THIS, uint16 spell_id)"); // @categories Hate and Aggro { Mob *THIS; uint32 RETVAL; dXSTARG; uint16 spellid = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CheckAggroAmount(spellid, nullptr); XSprePUSH; PUSHu((UV) RETVAL); @@ -6081,22 +4286,14 @@ XS(XS_Mob_CheckHealAggroAmount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CheckHealAggroAmount) { dXSARGS; if (items != 2 && items != 3) - Perl_croak(aTHX_ "Usage: Mob::CheckHealAggroAmount(THIS, uint16 spell_id, uint32 possible_heal_amt)"); + Perl_croak(aTHX_ "Usage: Mob::CheckHealAggroAmount(THIS, uint16 spell_id, uint32 possible_heal_amt)"); // @categories Hate and Aggro { Mob *THIS; uint32 RETVAL; dXSTARG; uint16 spellid = (uint16) SvUV(ST(1)); uint32 possible = 0; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items == 3) { possible = (uint32) SvUV(ST(2)); } @@ -6112,21 +4309,13 @@ XS(XS_Mob_GetAA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAA) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetAA(THIS, uint32 rank_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetAA(THIS, uint32 rank_id)"); // @categories Alternative Advancement { Mob *THIS; uint32 RETVAL; dXSTARG; uint32 rank_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAA(rank_id); XSprePUSH; PUSHu((UV) RETVAL); @@ -6138,21 +4327,13 @@ XS(XS_Mob_GetAAByAAID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAAByAAID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetAAByAAID(THIS, uint32 aa_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetAAByAAID(THIS, uint32 aa_id)"); // @categories Alternative Advancement { Mob *THIS; uint32 RETVAL; dXSTARG; uint32 aa_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAAByAAID(aa_id); XSprePUSH; PUSHu((UV) RETVAL); @@ -6164,22 +4345,14 @@ XS(XS_Mob_SetAA); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetAA) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::SetAA(THIS, int aa_id, int points, [int charges = 0])"); + Perl_croak(aTHX_ "Usage: Mob::SetAA(THIS, int aa_id, int points, [int charges = 0])"); // @categories Alternative Advancement, Script Utility { Mob *THIS; bool RETVAL; int aa_id = (int) SvIV(ST(1)); int points = (int) SvIV(ST(2)); int charges = (items == 4) ? (int) SvIV(ST(3)) : 0; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->SetAA(aa_id, points, charges); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -6191,19 +4364,11 @@ XS(XS_Mob_DivineAura); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DivineAura) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::DivineAura(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::DivineAura(THIS)"); // @categories Spells and Disciplines { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->DivineAura(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -6215,19 +4380,11 @@ XS(XS_Mob_AddFeignMemory); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_AddFeignMemory) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::AddFeignMemory(THIS, Client* attacker)"); + Perl_croak(aTHX_ "Usage: Mob::AddFeignMemory(THIS, Client* attacker)"); // @categories Script Utility { Mob *THIS; Client *attacker; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); attacker = INT2PTR(Client *, tmp); @@ -6245,19 +4402,11 @@ XS(XS_Mob_RemoveFromFeignMemory); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_RemoveFromFeignMemory) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::RemoveFromFeignMemory(THIS, Client* attacker)"); + Perl_croak(aTHX_ "Usage: Mob::RemoveFromFeignMemory(THIS, Client* attacker)"); // @categories Script Utility, Hate and Aggro { Mob *THIS; Client *attacker; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); attacker = INT2PTR(Client *, tmp); @@ -6275,18 +4424,10 @@ XS(XS_Mob_ClearFeignMemory); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ClearFeignMemory) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::ClearFeignMemory(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::ClearFeignMemory(THIS)"); // @categories Script Utility, Hate and Aggro { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->ClearFeignMemory(); } XSRETURN_EMPTY; @@ -6296,19 +4437,11 @@ XS(XS_Mob_SetOOCRegen); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetOOCRegen) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetOOCRegen(THIS, int32 new_ooc_regen)"); + Perl_croak(aTHX_ "Usage: Mob::SetOOCRegen(THIS, int32 new_ooc_regen)"); // @categories Stats and Attributes { Mob *THIS; int32 newoocregen = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetOOCRegen(newoocregen); } XSRETURN_EMPTY; @@ -6318,21 +4451,13 @@ XS(XS_Mob_GetEntityVariable); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetEntityVariable) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetEntityVariable(THIS, string id)"); + Perl_croak(aTHX_ "Usage: Mob::GetEntityVariable(THIS, string id)"); // @categories Script Utility { Mob *THIS; Const_char *id = SvPV_nolen(ST(1)); Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetEntityVariable(id); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -6350,15 +4475,7 @@ XS(XS_Mob_EntityVariableExists) { Mob *THIS; Const_char *id = SvPV_nolen(ST(1)); bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->EntityVariableExists(id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -6370,20 +4487,12 @@ XS(XS_Mob_SetEntityVariable); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetEntityVariable) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::SetEntityVariable(THIS, string id, string var)"); + Perl_croak(aTHX_ "Usage: Mob::SetEntityVariable(THIS, string id, string var)"); // @categories Script Utility { Mob *THIS; Const_char *id = SvPV_nolen(ST(1)); const char *var = (const char *) SvPV_nolen(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetEntityVariable(id, var); } XSRETURN_EMPTY; @@ -6394,19 +4503,10 @@ XS(XS_Mob_GetHateList) { dXSARGS; int num_entries = 0; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetHateList(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetHateList(THIS)"); // @categories Hate and Aggro { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; auto hate_list = THIS->GetHateList(); auto iter = hate_list.begin(); @@ -6426,20 +4526,12 @@ XS(XS_Mob_SignalClient); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SignalClient) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::SignalClient(THIS, Client* client, uint32 data)"); + Perl_croak(aTHX_ "Usage: Mob::SignalClient(THIS, Client* client, uint32 data)"); // @categories Script Utility { Mob *THIS; Client *client = nullptr; uint32 data = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); client = INT2PTR(Client *, tmp); @@ -6457,20 +4549,12 @@ XS(XS_Mob_CombatRange); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CombatRange) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::CombatRange(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: Mob::CombatRange(THIS, Mob* target)"); // @categories Script Utility { Mob *THIS; Mob *target = nullptr; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -6490,23 +4574,15 @@ XS(XS_Mob_DoSpecialAttackDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DoSpecialAttackDamage) { dXSARGS; if (items < 4 || items > 6) - Perl_croak(aTHX_ "Usage: Mob::DoSpecialAttackDamage(THIS, Mob* target, int skill, int32 max_damage, [int32 min_damage = 1], [int32 hate_override = -11])"); + Perl_croak(aTHX_ "Usage: Mob::DoSpecialAttackDamage(THIS, Mob* target, int skill, int32 max_damage, [int32 min_damage = 1], [int32 hate_override = -11])"); // @categories Script Utility, Skills and Attributes { Mob *THIS; Mob *target; - EQEmu::skills::SkillType attack_skill = (EQEmu::skills::SkillType) SvUV(ST(2)); + EQ::skills::SkillType attack_skill = (EQ::skills::SkillType) SvUV(ST(2)); int32 max_damage = (int32) SvIV(ST(3)); int32 min_damage = 1; int32 hate_override = -11; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -6532,20 +4608,12 @@ XS(XS_Mob_CheckLoS); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CheckLoS) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::CheckLoS(THIS, Mob*)"); + Perl_croak(aTHX_ "Usage: Mob::CheckLoS(THIS, Mob*)"); // @categories Script Utility { Mob *THIS; Mob *mob; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -6565,7 +4633,7 @@ XS(XS_Mob_CheckLoSToLoc); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CheckLoSToLoc) { dXSARGS; if (items != 4 && items != 5) - Perl_croak(aTHX_ "Usage: Mob::CheckLoSToLoc(THIS, float x, float y, float z, float mob_size)"); + Perl_croak(aTHX_ "Usage: Mob::CheckLoSToLoc(THIS, float x, float y, float z, float mob_size)"); // @categories Script Utility { Mob *THIS; float loc_x = (float) SvNV(ST(1)); @@ -6579,15 +4647,7 @@ XS(XS_Mob_CheckLoSToLoc) { } else { mob_size = 6; } - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CheckLosFN(loc_x, loc_y, loc_z, mob_size); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -6599,7 +4659,7 @@ XS(XS_Mob_FindGroundZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_FindGroundZ) { dXSARGS; if (items != 3 && items != 4) - Perl_croak(aTHX_ "Usage: Mob::FindGroundZ(THIS, float x, float y, float z_offset)"); + Perl_croak(aTHX_ "Usage: Mob::FindGroundZ(THIS, float x, float y, float z_offset)"); // @categories Script Utility { Mob *THIS; float new_x = (float) SvNV(ST(1)); @@ -6613,15 +4673,7 @@ XS(XS_Mob_FindGroundZ) { } else { z_offset = 10; } - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetGroundZ(new_x, new_y, z_offset); XSprePUSH; PUSHn((double) RETVAL); @@ -6633,7 +4685,7 @@ XS(XS_Mob_ProjectileAnim); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ProjectileAnim) { dXSARGS; if (items < 3 || items > 9) - Perl_croak(aTHX_ "Usage: Mob::ProjectileAnim(THIS, Mob* mob, int item_id, [bool is_arrow = false], [float speed = 0], [float angle = 0], [float tilt = 0], [float arc = 0])"); + Perl_croak(aTHX_ "Usage: Mob::ProjectileAnim(THIS, Mob* mob, int item_id, [bool is_arrow = false], [float speed = 0], [float angle = 0], [float tilt = 0], [float arc = 0])"); // @categories Script Utility { Mob *THIS; @@ -6645,15 +4697,7 @@ XS(XS_Mob_ProjectileAnim) { float tilt = 0; float arc = 0; char *IDFile = nullptr; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); mob = INT2PTR(Mob *, tmp); @@ -6690,20 +4734,12 @@ XS(XS_Mob_HasNPCSpecialAtk); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_HasNPCSpecialAtk) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::HasNPCSpecialAtk(THIS, string ability_string)"); + Perl_croak(aTHX_ "Usage: Mob::HasNPCSpecialAtk(THIS, string ability_string)"); // @categories Stats and Attributes { Mob *THIS; char *parse = (char *) SvPV_nolen(ST(1)); bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasNPCSpecialAtk(parse); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -6715,7 +4751,7 @@ XS(XS_Mob_SendAppearanceEffect); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SendAppearanceEffect) { dXSARGS; if (items < 2 || items > 7) - Perl_croak(aTHX_ "Usage: Mob::SendAppearanceEffect(THIS, int32 param_1, [int32 param_2 = 0], [int32 param_3 = 0], [int32 param_4 = 0], [int32 param_5 = 0], [Client* single_client_to_send_to = null])"); + Perl_croak(aTHX_ "Usage: Mob::SendAppearanceEffect(THIS, int32 param_1, [int32 param_2 = 0], [int32 param_3 = 0], [int32 param_4 = 0], [int32 param_5 = 0], [Client* single_client_to_send_to = null])"); // @categories Script Utility { Mob *THIS; int32 parm1 = (int32) SvIV(ST(1)); @@ -6724,15 +4760,7 @@ XS(XS_Mob_SendAppearanceEffect) { int32 parm4 = 0; int32 parm5 = 0; Client *client = nullptr; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 2) { parm2 = (int32) SvIV(ST(2)); } if (items > 3) { parm3 = (int32) SvIV(ST(3)); } if (items > 4) { parm4 = (int32) SvIV(ST(4)); } @@ -6756,19 +4784,11 @@ XS(XS_Mob_SetFlyMode); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetFlyMode) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetFlyMode(THIS, uint8 flymode[0|1|2|3|4|5])"); + Perl_croak(aTHX_ "Usage: Mob::SetFlyMode(THIS, uint8 flymode[0|1|2|3|4|5])"); // @categories Script Utility { Mob *THIS; GravityBehavior flymode = (GravityBehavior) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetFlyMode(flymode); } XSRETURN_EMPTY; @@ -6778,19 +4798,11 @@ XS(XS_Mob_SetTexture); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetTexture) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetTexture(THIS, int32 texture)"); + Perl_croak(aTHX_ "Usage: Mob::SetTexture(THIS, int32 texture)"); // @categories Stats and Attributes { Mob *THIS; int32 texture = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendIllusionPacket(THIS->GetRace(), 0xFF, texture); } XSRETURN_EMPTY; @@ -6800,19 +4812,11 @@ XS(XS_Mob_SetRace); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetRace) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetRace(THIS, int32 race)"); + Perl_croak(aTHX_ "Usage: Mob::SetRace(THIS, int32 race)"); // @categories Stats and Attributes { Mob *THIS; int32 race = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendIllusionPacket(race); } XSRETURN_EMPTY; @@ -6822,19 +4826,11 @@ XS(XS_Mob_SetGender); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetGender) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetGender(THIS, int32 gender)"); + Perl_croak(aTHX_ "Usage: Mob::SetGender(THIS, int32 gender)"); // @categories Stats and Attributes { Mob *THIS; int32 gender = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendIllusionPacket(THIS->GetRace(), gender); } XSRETURN_EMPTY; @@ -6844,7 +4840,7 @@ XS(XS_Mob_SendIllusion); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SendIllusion) { dXSARGS; if (items < 2 || items > 14) - Perl_croak(aTHX_ "Usage: Mob::SendIllusion(THIS, uint16 race, [uint8 gender = 0xFF], [uint8 texture face = 0xFF], [uint8 hairstyle = 0xFF], [uint8 hair_color = 0xFF], [uint8 beard = 0xFF], [uint8 beard_color =FF], [uint32 drakkin_tattoo = 0xFFFFFFFF], [uint32 drakkin_details = 0xFFFFFFFF], [float size = -1])"); + Perl_croak(aTHX_ "Usage: Mob::SendIllusion(THIS, uint16 race, [uint8 gender = 0xFF], [uint8 texture face = 0xFF], [uint8 hairstyle = 0xFF], [uint8 hair_color = 0xFF], [uint8 beard = 0xFF], [uint8 beard_color =FF], [uint32 drakkin_tattoo = 0xFFFFFFFF], [uint32 drakkin_details = 0xFFFFFFFF], [float size = -1])"); // @categories Script Utility { Mob *THIS; uint16 race = (uint16) SvIV(ST(1)); @@ -6860,15 +4856,7 @@ XS(XS_Mob_SendIllusion) { uint32 drakkin_tattoo = 0xFFFFFFFF; uint32 drakkin_details = 0xFFFFFFFF; float size = -1.0f; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 2) { gender = (uint8) SvIV(ST(2)); } if (items > 3) { texture = (uint8) SvIV(ST(3)); } if (items > 4) { helmtexture = (uint8) SvIV(ST(4)); } @@ -6892,7 +4880,7 @@ XS(XS_Mob_CameraEffect); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CameraEffect) { dXSARGS; if (items < 2 || items > 5) - Perl_croak(aTHX_ "Usage: Mob::CameraEffect(THIS, uint32 duration, [uint32 intensity = 0], [Client* single_client = nullptr], [bool is_world_wide = false])"); + Perl_croak(aTHX_ "Usage: Mob::CameraEffect(THIS, uint32 duration, [uint32 intensity = 0], [Client* single_client = nullptr], [bool is_world_wide = false])"); // @categories Script Utility { Mob *THIS; uint32 duration = (uint32) SvUV(ST(1)); @@ -6900,15 +4888,7 @@ XS(XS_Mob_CameraEffect) { Client *client = nullptr; bool global = false; bool nullcli = false; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 2) { intensity = (uint32) SvUV(ST(2)); } if (items > 3) { if (sv_derived_from(ST(3), "Client")) { @@ -6934,7 +4914,7 @@ XS(XS_Mob_SpellEffect); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SpellEffect) { dXSARGS; if (items < 2 || items > 8) - Perl_croak(aTHX_ "Usage: Mob::SpellEffect(THIS, uint32 effect, [uint32 duration = 5000], [uint32 finish_delay = 0], [bool zone_wide = false], [uint32 unk20 = 3000], [bool perm_effect = false], [Client* single_client])"); + Perl_croak(aTHX_ "Usage: Mob::SpellEffect(THIS, uint32 effect, [uint32 duration = 5000], [uint32 finish_delay = 0], [bool zone_wide = false], [uint32 unk20 = 3000], [bool perm_effect = false], [Client* single_client])"); // @categories Spells and Disciplines { Mob *THIS; uint32 effect = (uint32) SvUV(ST(1)); @@ -6944,16 +4924,7 @@ XS(XS_Mob_SpellEffect) { uint32 unk20 = 3000; bool perm_effect = false; Client *client = nullptr; - - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 2) { duration = (uint32) SvUV(ST(2)); } if (items > 3) { finish_delay = (uint32) SvUV(ST(3)); } if (items > 4) { zone_wide = (bool) SvTRUE(ST(4)); } @@ -6980,19 +4951,11 @@ XS(XS_Mob_TempName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_TempName) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Mob::TempName(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Mob::TempName(THIS, string name)"); // @categories Script Utility { Mob *THIS; char *name = nullptr; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 1) { name = (char *) SvPV_nolen(ST(1)); } THIS->TempName(name); @@ -7004,22 +4967,14 @@ XS(XS_Mob_GetItemStat); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetItemStat) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetItemStat(THIS, uint32 item_id, string stat)"); + Perl_croak(aTHX_ "Usage: Mob::GetItemStat(THIS, uint32 item_id, string stat)"); // @categories Inventory and Items, Stats and Attributes { Mob *THIS; int32 RETVAL; uint32 itemid = (uint32) SvUV(ST(1)); Const_char *stat = (Const_char *) SvPV_nolen(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetItemStat(itemid, stat); XSprePUSH; PUSHi((IV) RETVAL); @@ -7038,15 +4993,7 @@ XS(XS_Mob_GetGlobal) { std::string ret_val = "Undefined"; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (THIS->GetGlobal(varname) != "Undefined") ret_val = THIS->GetGlobal(varname); @@ -7070,15 +5017,7 @@ XS(XS_Mob_SetGlobal) { int options = (int) SvIV(ST(3)); char *duration = (char *) SvPV_nolen(ST(4)); Mob *other = nullptr; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 5) { if (sv_derived_from(ST(5), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(5))); @@ -7107,15 +5046,7 @@ XS(XS_Mob_TarGlobal) { int npcid = (int) SvIV(ST(4)); int charid = (int) SvIV(ST(5)); int zoneid = (int) SvIV(ST(6)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->TarGlobal(varname, value, duration, npcid, charid, zoneid); } XSRETURN_EMPTY; @@ -7129,15 +5060,7 @@ XS(XS_Mob_DelGlobal) { { Mob *THIS; char *varname = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->DelGlobal(varname); } XSRETURN_EMPTY; @@ -7147,22 +5070,14 @@ XS(XS_Mob_SetSlotTint); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetSlotTint) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: Mob::SetSlotTint(THIS, uint8 material_slot, uint8 red_tint, uint8 green_tint, uint8 blue_tint)"); + Perl_croak(aTHX_ "Usage: Mob::SetSlotTint(THIS, uint8 material_slot, uint8 red_tint, uint8 green_tint, uint8 blue_tint)"); // @categories Stats and Attributes { Mob *THIS; uint8 material_slot = (uint8) SvIV(ST(1)); uint8 red_tint = (uint8) SvIV(ST(2)); uint8 green_tint = (uint8) SvIV(ST(3)); uint8 blue_tint = (uint8) SvIV(ST(4)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetSlotTint(material_slot, red_tint, green_tint, blue_tint); } XSRETURN_EMPTY; @@ -7172,22 +5087,14 @@ XS(XS_Mob_WearChange); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_WearChange) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::WearChange(THIS, uint8 material_slot, uint16 texture, [uint32 color = 0, uint32 hero_forge_model = 0])"); + Perl_croak(aTHX_ "Usage: Mob::WearChange(THIS, uint8 material_slot, uint16 texture, [uint32 color = 0, uint32 hero_forge_model = 0])"); // @categories Script Utility { Mob *THIS; uint8 material_slot = (uint8) SvIV(ST(1)); uint16 texture = (uint16) SvUV(ST(2)); uint32 color = 0; uint32 hero_forge_model = 0; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 3) { color = (uint32) SvUV(ST(3)); } @@ -7204,21 +5111,13 @@ XS(XS_Mob_DoKnockback); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DoKnockback) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Mob::DoKnockback(THIS, Mob* caster, uint32 push_back_amount, uint32 push_up_amount)"); + Perl_croak(aTHX_ "Usage: Mob::DoKnockback(THIS, Mob* caster, uint32 push_back_amount, uint32 push_up_amount)"); // @categories Script Utility { Mob *THIS; Mob *caster; uint32 pushback = (uint16) SvUV(ST(2)); uint32 pushup = (uint16) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); caster = INT2PTR(Mob *, tmp); @@ -7236,19 +5135,11 @@ XS(XS_Mob_RemoveNimbusEffect); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_RemoveNimbusEffect) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::RemoveNimbusEffect(THIS, int32 effect_id)"); + Perl_croak(aTHX_ "Usage: Mob::RemoveNimbusEffect(THIS, int32 effect_id)"); // @categories Script Utility { Mob *THIS; int32 effectid = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->RemoveNimbusEffect(effectid); } XSRETURN_EMPTY; @@ -7258,19 +5149,11 @@ XS(XS_Mob_SetRunning); XS(XS_Mob_SetRunning) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetRunning(THIS, bool value)"); + Perl_croak(aTHX_ "Usage: Mob::SetRunning(THIS, bool value)"); // @categories Script Utility { Mob *THIS; bool value = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetRunning(value); } XSRETURN_EMPTY; @@ -7280,20 +5163,12 @@ XS(XS_Mob_IsRunning); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsRunning) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsRunning(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsRunning(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsRunning(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -7305,20 +5180,12 @@ XS(XS_Mob_SetBodyType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetBodyType) { dXSARGS; if (items < 2 || items > 3) - Perl_croak(aTHX_ "Usage: Mob::SetBodyType(THIS, int32 type, [bool overwrite_orig = false])"); + Perl_croak(aTHX_ "Usage: Mob::SetBodyType(THIS, int32 type, [bool overwrite_orig = false])"); // @categories Stats and Attributes { Mob *THIS; int32 type = (int32) SvIV(ST(1)); bool overwrite_orig = false; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items == 3) { overwrite_orig = (bool) SvTRUE(ST(2)); } @@ -7332,19 +5199,11 @@ XS(XS_Mob_SetDeltas); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetDeltas) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: Mob::SetDeltas(THIS, float delta_x, float delta_y, float delta_z, float delta_h)"); + Perl_croak(aTHX_ "Usage: Mob::SetDeltas(THIS, float delta_x, float delta_y, float delta_z, float delta_h)"); // @categories Script Utility { Mob *THIS; auto delta = glm::vec4((float) SvNV(ST(1)), (float) SvNV(ST(2)), (float) SvNV(ST(3)), (float) SvNV(ST(4))); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetDelta(delta); } XSRETURN_EMPTY; @@ -7354,19 +5213,11 @@ XS(XS_Mob_SetLD); XS(XS_Mob_SetLD) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetLD(THIS, bool value)"); + Perl_croak(aTHX_ "Usage: Mob::SetLD(THIS, bool value)"); // @categories Script Utility { Mob *THIS; bool value = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SendAppearancePacket(AT_Linkdead, value); } XSRETURN_EMPTY; @@ -7376,19 +5227,11 @@ XS(XS_Mob_SetTargetable); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetTargetable) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetTargetable(THIS, bool targetable)"); + Perl_croak(aTHX_ "Usage: Mob::SetTargetable(THIS, bool targetable)"); // @categories Stats and Attributes { Mob *THIS; bool on = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetTargetable(on); } XSRETURN_EMPTY; @@ -7398,20 +5241,12 @@ XS(XS_Mob_ModSkillDmgTaken); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ModSkillDmgTaken) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::ModSkillDmgTaken(THIS, int skill, int16 value)"); + Perl_croak(aTHX_ "Usage: Mob::ModSkillDmgTaken(THIS, int skill, int16 value)"); // @categories Skills and Recipes, Script Utility { Mob *THIS; - EQEmu::skills::SkillType skill_num = (EQEmu::skills::SkillType) SvUV(ST(1)); + EQ::skills::SkillType skill_num = (EQ::skills::SkillType) SvUV(ST(1)); int16 value = (int16) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->ModSkillDmgTaken(skill_num, value); } XSRETURN_EMPTY; @@ -7421,21 +5256,13 @@ XS(XS_Mob_GetModSkillDmgTaken); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetModSkillDmgTaken) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetModSkillDmgTaken(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetModSkillDmgTaken(THIS, int skill_id)"); // @categories Stats and Attributes { Mob *THIS; int16 RETVAL; dXSTARG; - EQEmu::skills::SkillType skill_num = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::skills::SkillType skill_num = (EQ::skills::SkillType) SvUV(ST(1)); + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetModSkillDmgTaken(skill_num); XSprePUSH; PUSHi((IV) RETVAL); @@ -7447,21 +5274,13 @@ XS(XS_Mob_GetSkillDmgTaken); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSkillDmgTaken) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetSkillDmgTaken(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetSkillDmgTaken(THIS, int skill_id)"); // @categories Skills and Recipes, Script Utility { Mob *THIS; int32 RETVAL; dXSTARG; - EQEmu::skills::SkillType skill_num = (EQEmu::skills::SkillType) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::skills::SkillType skill_num = (EQ::skills::SkillType) SvUV(ST(1)); + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSkillDmgTaken(skill_num); XSprePUSH; PUSHu((UV) RETVAL); @@ -7473,19 +5292,11 @@ XS(XS_Mob_SetAllowBeneficial); XS(XS_Mob_SetAllowBeneficial) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetAllowBeneficial(THIS, bool value)"); + Perl_croak(aTHX_ "Usage: Mob::SetAllowBeneficial(THIS, bool value)"); // @categories Stats and Attributes { Mob *THIS; bool value = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetAllowBeneficial(value); } XSRETURN_EMPTY; @@ -7495,19 +5306,11 @@ XS(XS_Mob_GetAllowBeneficial); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetAllowBeneficial) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetAllowBeneficial(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetAllowBeneficial(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetAllowBeneficial(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -7519,21 +5322,13 @@ XS(XS_Mob_IsBeneficialAllowed); XS(XS_Mob_IsBeneficialAllowed) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::IsBeneficialAllowed(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: Mob::IsBeneficialAllowed(THIS, Mob* target)"); // @categories Stats and Attributes { dXSTARG; Mob *THIS; Mob *target; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -7553,20 +5348,12 @@ XS(XS_Mob_ModVulnerability); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ModVulnerability) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::ModVulnerability(THIS, uint8 resist, int16 value)"); + Perl_croak(aTHX_ "Usage: Mob::ModVulnerability(THIS, uint8 resist, int16 value)"); // @categories Stats and Attributes { Mob *THIS; uint8 resist = (uint8) SvIV(ST(1)); int16 value = (int16) SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->ModVulnerability(resist, value); } XSRETURN_EMPTY; @@ -7576,21 +5363,13 @@ XS(XS_Mob_GetModVulnerability); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetModVulnerability) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetModVulnerability(THIS, uint8 resist)"); + Perl_croak(aTHX_ "Usage: Mob::GetModVulnerability(THIS, uint8 resist)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; uint8 resist = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetModVulnerability(resist); XSprePUSH; PUSHi((IV) RETVAL); @@ -7602,24 +5381,16 @@ XS(XS_Mob_DoMeleeSkillAttackDmg); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DoMeleeSkillAttackDmg) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Mob::DoMeleeSkillAttackDmg(THIS, Mob* target, uint16 weapon_damage, int skill, int16 chance_mod, int16 focus, uint8 can_riposte)"); + Perl_croak(aTHX_ "Usage: Mob::DoMeleeSkillAttackDmg(THIS, Mob* target, uint16 weapon_damage, int skill, int16 chance_mod, int16 focus, uint8 can_riposte)"); // @categories Script Utility, Skills and Attributes { Mob *THIS; Mob *target; uint16 weapon_damage = (uint16) SvIV(ST(2)); - EQEmu::skills::SkillType skill = (EQEmu::skills::SkillType) SvUV(ST(3)); + EQ::skills::SkillType skill = (EQ::skills::SkillType) SvUV(ST(3)); int16 chance_mod = (int16) SvIV(ST(4)); int16 focus = (int16) SvIV(ST(5)); uint8 CanRiposte = (uint8) SvIV(ST(6)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -7637,24 +5408,16 @@ XS(XS_Mob_DoArcheryAttackDmg); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DoArcheryAttackDmg) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Mob::DoArcheryAttackDmg(THIS, Mob* target, [range_weapon_item_instance = nullptr], [ammo_item_instance = nullptr], uint16 weapon_damage, int16 chance_mod, int16 focus)"); + Perl_croak(aTHX_ "Usage: Mob::DoArcheryAttackDmg(THIS, Mob* target, [range_weapon_item_instance = nullptr], [ammo_item_instance = nullptr], uint16 weapon_damage, int16 chance_mod, int16 focus)"); // @categories Script Utility, Skills and Attributes { Mob *THIS; Mob *target; - EQEmu::ItemInstance *RangeWeapon = nullptr; - EQEmu::ItemInstance *Ammo = nullptr; + EQ::ItemInstance *RangeWeapon = nullptr; + EQ::ItemInstance *Ammo = nullptr; uint16 weapon_damage = (uint16) SvIV(ST(4)); int16 chance_mod = (int16) SvIV(ST(5)); int16 focus = (int16) SvIV(ST(6)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -7672,24 +5435,16 @@ XS(XS_Mob_DoThrowingAttackDmg); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DoThrowingAttackDmg) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Mob::DoThrowingAttackDmg(THIS, Mob* target, [range_weapon_item_instance = nullptr], [ammo_item_instance = nullptr], uint16 weapon_damage, int16 chance_mod, int16 focus)"); + Perl_croak(aTHX_ "Usage: Mob::DoThrowingAttackDmg(THIS, Mob* target, [range_weapon_item_instance = nullptr], [ammo_item_instance = nullptr], uint16 weapon_damage, int16 chance_mod, int16 focus)"); // @categories Script Utility, Skills and Attributes { Mob *THIS; Mob *target; - EQEmu::ItemInstance *RangeWeapon = nullptr; - EQEmu::ItemData *item = nullptr; + EQ::ItemInstance *RangeWeapon = nullptr; + EQ::ItemData *item = nullptr; uint16 weapon_damage = (uint16) SvIV(ST(4)); int16 chance_mod = (int16) SvIV(ST(5)); int16 focus = (int16) SvIV(ST(6)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -7707,19 +5462,11 @@ XS(XS_Mob_SetDisableMelee); XS(XS_Mob_SetDisableMelee) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetDisableMelee(THIS, bool value)"); + Perl_croak(aTHX_ "Usage: Mob::SetDisableMelee(THIS, bool value)"); // @categories Script Utility, Stats and Attributes { Mob *THIS; bool value = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetDisableMelee(value); } XSRETURN_EMPTY; @@ -7729,19 +5476,11 @@ XS(XS_Mob_IsMeleeDisabled); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_IsMeleeDisabled) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsMeleeDisabled(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsMeleeDisabled(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsMeleeDisabled(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -7753,19 +5492,11 @@ XS(XS_Mob_SetFlurryChance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetFlurryChance) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::SetFlurryChance(THIS, uint8 value)"); + Perl_croak(aTHX_ "Usage: Mob::SetFlurryChance(THIS, uint8 value)"); // @categories Stats and Attributes { Mob *THIS; uint8 value = (uint8) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetFlurryChance(value); } XSRETURN_EMPTY; @@ -7775,20 +5506,12 @@ XS(XS_Mob_GetFlurryChance); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetFlurryChance) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetFlurryChance(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetFlurryChance(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetFlurryChance(); XSprePUSH; PUSHu((UV) RETVAL); @@ -7800,7 +5523,7 @@ XS(XS_Mob_GetSpellStat); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSpellStat) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::GetSpellStat(THIS, uint32 spell_id, string stat, uint8 slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetSpellStat(THIS, uint32 spell_id, string stat, uint8 slot)"); // @categories Spells and Disciplines { Mob *THIS; int32 RETVAL; @@ -7808,15 +5531,7 @@ XS(XS_Mob_GetSpellStat) { Const_char *stat = (Const_char *) SvPV_nolen(ST(2)); uint8 slot = (uint8) SvUV(ST(3)); dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items > 4) { slot = 0; } @@ -7831,21 +5546,13 @@ XS(XS_Mob_GetSpecialAbility); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSpecialAbility) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetSpecialAbility(THIS, int special_ability)"); + Perl_croak(aTHX_ "Usage: Mob::GetSpecialAbility(THIS, int special_ability)"); // @categories Stats and Attributes { int RETVAL; Mob *THIS; int ability = SvIV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSpecialAbility(ability); XSprePUSH; PUSHi((IV) RETVAL); @@ -7857,22 +5564,14 @@ XS(XS_Mob_GetSpecialAbilityParam); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_GetSpecialAbilityParam) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::GetSpecialAbilityParam(THIS, int special_ability, int param)"); + Perl_croak(aTHX_ "Usage: Mob::GetSpecialAbilityParam(THIS, int special_ability, int param)"); // @categories Stats and Attributes { int RETVAL; Mob *THIS; int ability = SvIV(ST(1)); int param = SvIV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetSpecialAbilityParam(ability, param); XSprePUSH; PUSHi((IV) RETVAL); @@ -7884,20 +5583,12 @@ XS(XS_Mob_SetSpecialAbility); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetSpecialAbility) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Mob::SetSpecialAbility(THIS, int ability, int value)"); + Perl_croak(aTHX_ "Usage: Mob::SetSpecialAbility(THIS, int ability, int value)"); // @categories Stats and Attributes { Mob *THIS; int ability = SvIV(ST(1)); int value = SvIV(ST(2)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetSpecialAbility(ability, value); } XSRETURN_EMPTY; @@ -7907,21 +5598,13 @@ XS(XS_Mob_SetSpecialAbilityParam); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_SetSpecialAbilityParam) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Mob::SetSpecialAbilityParam(THIS, int ability, int param, int value)"); + Perl_croak(aTHX_ "Usage: Mob::SetSpecialAbilityParam(THIS, int ability, int param, int value)"); // @categories Stats and Attributes { Mob *THIS; int ability = SvIV(ST(1)); int param = SvIV(ST(2)); int value = SvIV(ST(3)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->SetSpecialAbilityParam(ability, param, value); } XSRETURN_EMPTY; @@ -7931,18 +5614,10 @@ XS(XS_Mob_ClearSpecialAbilities); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ClearSpecialAbilities) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::ClearSpecialAbilities(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::ClearSpecialAbilities(THIS)"); // @categories Script Utility { Mob *THIS; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->ClearSpecialAbilities(); } XSRETURN_EMPTY; @@ -7952,19 +5627,11 @@ XS(XS_Mob_ProcessSpecialAbilities); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_ProcessSpecialAbilities) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::ProcessSpecialAbilities(THIS, string str)"); + Perl_croak(aTHX_ "Usage: Mob::ProcessSpecialAbilities(THIS, string str)"); // @categories Script Utility { Mob *THIS; const char *str = (const char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; THIS->ProcessSpecialAbilities(str); } XSRETURN_EMPTY; @@ -7974,20 +5641,12 @@ XS(XS_Mob_CanClassEquipItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_CanClassEquipItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::CanClassEquipItem(THIS, uint32 item_id)"); + Perl_croak(aTHX_ "Usage: Mob::CanClassEquipItem(THIS, uint32 item_id)"); // @categories Inventory and Items, Script Utility { Mob *THIS; bool RETVAL; uint32 item_id = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->CanClassEquipItem(item_id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -7999,19 +5658,11 @@ XS(XS_Mob_IsFeared); XS(XS_Mob_IsFeared) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsFeared(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsFeared(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsFeared(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8023,19 +5674,11 @@ XS(XS_Mob_IsBlind); XS(XS_Mob_IsBlind) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsBlind(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsBlind(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsBlind(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8047,21 +5690,12 @@ XS(XS_Mob_SeeInvisible); XS(XS_Mob_SeeInvisible) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::SeeInvisible(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::SeeInvisible(THIS)"); // @categories Stats and Attributes { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->SeeInvisible(); XSprePUSH; PUSHu((UV) RETVAL); @@ -8073,19 +5707,11 @@ XS(XS_Mob_SeeInvisibleUndead); XS(XS_Mob_SeeInvisibleUndead) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::SeeInvisibleUndead(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::SeeInvisibleUndead(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->SeeInvisibleUndead(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8097,19 +5723,11 @@ XS(XS_Mob_SeeHide); XS(XS_Mob_SeeHide) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::SeeHide(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::SeeHide(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->SeeHide(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8121,19 +5739,11 @@ XS(XS_Mob_SeeImprovedHide); XS(XS_Mob_SeeImprovedHide) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::SeeImprovedHide(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::SeeImprovedHide(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->SeeImprovedHide(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8145,21 +5755,12 @@ XS(XS_Mob_GetNimbusEffect1); XS(XS_Mob_GetNimbusEffect1) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetNimbusEffect1(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetNimbusEffect1(THIS)"); // @categories Script Utility { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetNimbusEffect1(); XSprePUSH; PUSHu((UV) RETVAL); @@ -8171,21 +5772,12 @@ XS(XS_Mob_GetNimbusEffect2); XS(XS_Mob_GetNimbusEffect2) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetNimbusEffect2(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetNimbusEffect2(THIS)"); // @categories Script Utility { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetNimbusEffect2(); XSprePUSH; PUSHu((UV) RETVAL); @@ -8197,21 +5789,12 @@ XS(XS_Mob_GetNimbusEffect3); XS(XS_Mob_GetNimbusEffect3) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetNimbusEffect3(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetNimbusEffect3(THIS)"); // @categories Script Utility { Mob *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetNimbusEffect3(); XSprePUSH; PUSHu((UV) RETVAL); @@ -8223,19 +5806,11 @@ XS(XS_Mob_IsTargetable); XS(XS_Mob_IsTargetable) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsTargetable(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsTargetable(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsTargetable(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8247,19 +5822,11 @@ XS(XS_Mob_HasShieldEquiped); XS(XS_Mob_HasShieldEquiped) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HasShieldEquiped(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HasShieldEquiped(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasShieldEquiped(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8271,19 +5838,11 @@ XS(XS_Mob_HasTwoHandBluntEquiped); XS(XS_Mob_HasTwoHandBluntEquiped) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HasTwoHandBluntEquiped(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HasTwoHandBluntEquiped(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasTwoHandBluntEquiped(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8295,19 +5854,11 @@ XS(XS_Mob_HasTwoHanderEquipped); XS(XS_Mob_HasTwoHanderEquipped) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HasTwoHanderEquipped(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HasTwoHanderEquipped(THIS)"); // @categories Stats and Attributes { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasTwoHanderEquipped(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8319,22 +5870,13 @@ XS(XS_Mob_GetHerosForgeModel); XS(XS_Mob_GetHerosForgeModel) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetHerosForgeModel(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::GetHerosForgeModel(THIS, uint8 material_slot)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; uint8 material_slot = (uint8) SvUV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetHerosForgeModel(material_slot); XSprePUSH; PUSHi((IV) RETVAL); @@ -8346,22 +5888,13 @@ XS(XS_Mob_IsEliteMaterialItem); XS(XS_Mob_IsEliteMaterialItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::IsEliteMaterialItem(THIS, uint8 material_slot)"); + Perl_croak(aTHX_ "Usage: Mob::IsEliteMaterialItem(THIS, uint8 material_slot)"); // @categories Script Utility, Stats and Attributes { Mob *THIS; uint32 RETVAL; uint8 material_slot = (uint8) SvUV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsEliteMaterialItem(material_slot); XSprePUSH; PUSHu((UV) RETVAL); @@ -8373,21 +5906,12 @@ XS(XS_Mob_GetBaseSize); XS(XS_Mob_GetBaseSize) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetBaseSize(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetBaseSize(THIS)"); // @categories Stats and Attributes { Mob *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetBaseSize(); XSprePUSH; PUSHn((double) RETVAL); @@ -8399,19 +5923,11 @@ XS(XS_Mob_HasOwner); XS(XS_Mob_HasOwner) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HasOwner(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HasOwner(THIS)"); // @categories Pet { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasOwner(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8423,19 +5939,11 @@ XS(XS_Mob_IsPet); XS(XS_Mob_IsPet) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsPet(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsPet(THIS)"); // @categories Pet { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsPet(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8447,19 +5955,11 @@ XS(XS_Mob_HasPet); XS(XS_Mob_HasPet) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::HasPet(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::HasPet(THIS)"); // @categories Pet { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->HasPet(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8471,19 +5971,11 @@ XS(XS_Mob_IsSilenced); XS(XS_Mob_IsSilenced) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsSilenced(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsSilenced(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsSilenced(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8495,19 +5987,11 @@ XS(XS_Mob_IsAmnesiad); XS(XS_Mob_IsAmnesiad) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::IsAmnesiad(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::IsAmnesiad(THIS)"); // @categories Script Utility { Mob *THIS; bool RETVAL; - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->IsAmnesiad(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -8519,21 +6003,12 @@ XS(XS_Mob_GetMeleeMitigation); XS(XS_Mob_GetMeleeMitigation) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Mob::GetMeleeMitigation(THIS)"); + Perl_croak(aTHX_ "Usage: Mob::GetMeleeMitigation(THIS)"); // @categories Stats and Attributes { Mob *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob*, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; RETVAL = THIS->GetMeleeMitigation(); XSprePUSH; PUSHi((IV) RETVAL); @@ -8545,22 +6020,13 @@ XS(XS_Mob_TryMoveAlong); XS(XS_Mob_TryMoveAlong) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Mob::TryMoveAlong(THIS, float distance, float angle, bool send)"); + Perl_croak(aTHX_ "Usage: Mob::TryMoveAlong(THIS, float distance, float angle, bool send)"); // @categories Script Utility { Mob *THIS; float distance = (float) SvNV(ST(1)); float angle = (float) SvNV(ST(2)); bool send = true; - - if (sv_derived_from(ST(0), "Mob")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Mob *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Mob"); - - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_MOB; if (items == 4) send = (bool) SvTRUE(ST(3)); @@ -8569,6 +6035,224 @@ XS(XS_Mob_TryMoveAlong) { XSRETURN_EMPTY; } +XS(XS_Mob_GetClassName); +XS(XS_Mob_GetClassName) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::GetClassName(THIS)"); + { + Mob* THIS; + Const_char *class_name; + dXSTARG; + VALIDATE_THIS_IS_MOB; + class_name = GetClassIDName(THIS->GetClass()); + sv_setpv(TARG, class_name); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + +XS(XS_Mob_GetRaceName); +XS(XS_Mob_GetRaceName) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::GetRaceName(THIS)"); + { + Mob* THIS; + Const_char *race_name; + dXSTARG; + VALIDATE_THIS_IS_MOB; + race_name = GetRaceIDName(THIS->GetRace()); + sv_setpv(TARG, race_name); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + +XS(XS_Mob_DeleteBucket); +XS(XS_Mob_DeleteBucket) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Mob::DeleteBucket(THIS, std::string bucket_name)"); // @categories Script Utility + { + Mob* THIS; + std::string bucket_name = (std::string) SvPV_nolen(ST(1)); + VALIDATE_THIS_IS_MOB; + THIS->DeleteBucket(bucket_name); + } + XSRETURN_EMPTY; +} + +XS(XS_Mob_GetBucket); +XS(XS_Mob_GetBucket) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Mob::GetBucket(THIS, std::string bucket_name)"); // @categories Script Utility + { + Mob* THIS; + dXSTARG; + std::string bucket_name = (std::string) SvPV_nolen(ST(1)); + std::string bucket_value; + VALIDATE_THIS_IS_MOB; + bucket_value = THIS->GetBucket(bucket_name); + sv_setpv(TARG, bucket_value.c_str()); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + +XS(XS_Mob_GetBucketExpires); +XS(XS_Mob_GetBucketExpires) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Mob::GetBucketExpires(THIS, std::string bucket_name)"); // @categories Script Utility + { + Mob* THIS; + dXSTARG; + std::string bucket_name = (std::string) SvPV_nolen(ST(1)); + std::string bucket_expiration; + VALIDATE_THIS_IS_MOB; + bucket_expiration = THIS->GetBucketExpires(bucket_name); + sv_setpv(TARG, bucket_expiration.c_str()); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + +XS(XS_Mob_GetBucketKey); +XS(XS_Mob_GetBucketKey) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::GetBucketKey(THIS)"); // @categories Script Utility + { + Mob* THIS; + dXSTARG; + std::string bucket_key; + VALIDATE_THIS_IS_MOB; + bucket_key = THIS->GetBucketKey(); + sv_setpv(TARG, bucket_key.c_str()); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + +XS(XS_Mob_GetBucketRemaining); +XS(XS_Mob_GetBucketRemaining) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: Mob::GetBucketRemaining(THIS, std::string bucket_name)"); // @categories Script Utility + { + Mob* THIS; + dXSTARG; + std::string bucket_name = (std::string) SvPV_nolen(ST(1)); + std::string bucket_remaining; + VALIDATE_THIS_IS_MOB; + bucket_remaining = THIS->GetBucketRemaining(bucket_name); + sv_setpv(TARG, bucket_remaining.c_str()); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + +XS(XS_Mob_SetBucket); +XS(XS_Mob_SetBucket) { + dXSARGS; + if (items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: Mob::SetBucket(THIS, std::string bucket_name, std::string bucket_value, [std::string expiration])"); // @categories Script Utility + { + Mob* THIS; + std::string key = (std::string) SvPV_nolen(ST(1)); + std::string value = (std::string) SvPV_nolen(ST(2)); + std::string expiration; + VALIDATE_THIS_IS_MOB; + if (items == 4) + expiration = (std::string) SvPV_nolen(ST(3)); + + THIS->SetBucket(key, value, expiration); + } + XSRETURN_EMPTY; +} + +XS(XS_Mob_IsHorse); +XS(XS_Mob_IsHorse) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::IsHorse(THIS)"); // @categories Script Utility + { + Mob *THIS; + bool RETVAL; + VALIDATE_THIS_IS_MOB; + RETVAL = THIS->IsHorse(); + ST(0) = boolSV(RETVAL); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Mob_GetHateListByDistance); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_GetHateListByDistance) { + dXSARGS; + int num_entries = 0; + if (items < 1 || items > 2) + Perl_croak(aTHX_ "Usage: Mob::GetHateListByDistance(THIS, int distance)"); // @categories Hate and Aggro + { + Mob *THIS; + int distance = 0; + VALIDATE_THIS_IS_MOB; + if (items == 2) + distance = (int) SvIV(ST(1)); + + auto list = THIS->GetHateListByDistance(distance); + for (auto hate_entry : list) { + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "HateEntry", (void *) hate_entry); + XPUSHs(ST(0)); + num_entries++; + } + } + XSRETURN(num_entries); +} + +XS(XS_Mob_GetHateClosest); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_GetHateClosest) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::GetHateClosest(THIS)"); // @categories Hate and Aggro + { + Mob *THIS; + Mob *closest_mob; + VALIDATE_THIS_IS_MOB; + closest_mob = THIS->GetHateClosest(); + ST(0) = sv_newmortal(); + sv_setref_pv(ST(0), "Mob", (void *) closest_mob); + } + XSRETURN(1); +} + +XS(XS_Mob_GetLastName); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_GetLastName) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Mob::GetLastName(THIS)"); // @categories Script Utility + { + Mob *THIS; + Const_char *last_name; + dXSTARG; + VALIDATE_THIS_IS_MOB; + last_name = THIS->GetLastName(); + sv_setpv(TARG, last_name); + XSprePUSH; + PUSHTARG; + } + XSRETURN(1); +} + #ifdef __cplusplus extern "C" #endif @@ -8598,6 +6282,7 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "IsDoor"), XS_Mob_IsDoor, file, "$"); newXSproto(strcpy(buf, "IsTrap"), XS_Mob_IsTrap, file, "$"); newXSproto(strcpy(buf, "IsBeacon"), XS_Mob_IsBeacon, file, "$"); + newXSproto(strcpy(buf, "IsHorse"), XS_Mob_IsHorse, file, "$"); newXSproto(strcpy(buf, "CastToClient"), XS_Mob_CastToClient, file, "$"); newXSproto(strcpy(buf, "CastToNPC"), XS_Mob_CastToNPC, file, "$"); newXSproto(strcpy(buf, "CastToMob"), XS_Mob_CastToMob, file, "$"); @@ -8643,6 +6328,7 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "GetBaseGender"), XS_Mob_GetBaseGender, file, "$"); newXSproto(strcpy(buf, "GetDeity"), XS_Mob_GetDeity, file, "$"); newXSproto(strcpy(buf, "GetRace"), XS_Mob_GetRace, file, "$"); + newXSproto(strcpy(buf, "GetRaceName"), XS_Mob_GetRaceName, file, "$"); newXSproto(strcpy(buf, "GetGender"), XS_Mob_GetGender, file, "$"); newXSproto(strcpy(buf, "GetTexture"), XS_Mob_GetTexture, file, "$"); newXSproto(strcpy(buf, "GetHelmTexture"), XS_Mob_GetHelmTexture, file, "$"); @@ -8657,6 +6343,7 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "GetDrakkinTattoo"), XS_Mob_GetDrakkinTattoo, file, "$"); newXSproto(strcpy(buf, "GetDrakkinDetails"), XS_Mob_GetDrakkinDetails, file, "$"); newXSproto(strcpy(buf, "GetClass"), XS_Mob_GetClass, file, "$"); + newXSproto(strcpy(buf, "GetClassName"), XS_Mob_GetClassName, file, "$"); newXSproto(strcpy(buf, "GetLevel"), XS_Mob_GetLevel, file, "$"); newXSproto(strcpy(buf, "GetCleanName"), XS_Mob_GetCleanName, file, "$"); newXSproto(strcpy(buf, "GetTarget"), XS_Mob_GetTarget, file, "$"); @@ -8676,6 +6363,7 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "SetMana"), XS_Mob_SetMana, file, "$$"); newXSproto(strcpy(buf, "GetManaRatio"), XS_Mob_GetManaRatio, file, "$"); newXSproto(strcpy(buf, "GetAC"), XS_Mob_GetAC, file, "$"); + newXSproto(strcpy(buf, "GetDisplayAC"), XS_Mob_GetDisplayAC, file, "$"); newXSproto(strcpy(buf, "GetATK"), XS_Mob_GetATK, file, "$"); newXSproto(strcpy(buf, "GetSTR"), XS_Mob_GetSTR, file, "$"); newXSproto(strcpy(buf, "GetSTA"), XS_Mob_GetSTA, file, "$"); @@ -8859,7 +6547,6 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "SetDeltas"), XS_Mob_SetDeltas, file, "$$$$$"); newXSproto(strcpy(buf, "SetLD"), XS_Mob_SetLD, file, "$$"); newXSproto(strcpy(buf, "SetTargetable"), XS_Mob_SetTargetable, file, "$$"); - newXSproto(strcpy(buf, "MakeTempPet"), XS_Mob_MakeTempPet, file, "$$;$$$$"); newXSproto(strcpy(buf, "ModSkillDmgTaken"), XS_Mob_ModSkillDmgTaken, file, "$$$"); newXSproto(strcpy(buf, "GetModSkillDmgTaken"), XS_Mob_GetModSkillDmgTaken, file, "$$"); newXSproto(strcpy(buf, "GetSkillDmgTaken"), XS_Mob_GetSkillDmgTaken, file, "$$"); @@ -8906,6 +6593,15 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "IsAmnesiad"), XS_Mob_IsAmnesiad, file, "$"); newXSproto(strcpy(buf, "GetMeleeMitigation"), XS_Mob_GetMeleeMitigation, file, "$"); newXSproto(strcpy(buf, "TryMoveAlong"), XS_Mob_TryMoveAlong, file, "$$$;$"); + newXSproto(strcpy(buf, "DeleteBucket"), XS_Mob_DeleteBucket, file, "$$"); + newXSproto(strcpy(buf, "GetBucket"), XS_Mob_GetBucket, file, "$$"); + newXSproto(strcpy(buf, "GetBucketExpires"), XS_Mob_GetBucketExpires, file, "$$"); + newXSproto(strcpy(buf, "GetBucketKey"), XS_Mob_GetBucketKey, file, "$"); + newXSproto(strcpy(buf, "GetBucketRemaining"), XS_Mob_GetBucketRemaining, file, "$$"); + newXSproto(strcpy(buf, "SetBucket"), XS_Mob_SetBucket, file, "$$$;$"); + newXSproto(strcpy(buf, "GetHateClosest"), XS_Mob_GetHateClosest, file, "$"); + newXSproto(strcpy(buf, "GetHateListByDistance"), XS_Mob_GetHateListByDistance, file, "$;$"); + newXSproto(strcpy(buf, "GetLastName"), XS_Mob_GetLastName, file, "$"); XSRETURN_YES; } diff --git a/zone/perl_npc.cpp b/zone/perl_npc.cpp index 1d40474f3..99cd83b86 100644 --- a/zone/perl_npc.cpp +++ b/zone/perl_npc.cpp @@ -44,24 +44,28 @@ typedef const char Const_char; #undef THIS #endif +#define VALIDATE_THIS_IS_NPC \ + do { \ + if (sv_derived_from(ST(0), "NPC")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(NPC*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type NPC"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); XS(XS_NPC_SignalNPC); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SignalNPC) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SignalNPC(THIS, int signal_id)"); + Perl_croak(aTHX_ "Usage: NPC::SignalNPC(THIS, int signal_id)"); // @categories Script Utility { NPC *THIS; int _signal_id = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SignalNPC(_signal_id); } XSRETURN_EMPTY; @@ -71,21 +75,13 @@ XS(XS_NPC_CheckNPCFactionAlly); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_CheckNPCFactionAlly) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::CheckNPCFactionAlly(THIS, int32 faction_id)"); + Perl_croak(aTHX_ "Usage: NPC::CheckNPCFactionAlly(THIS, int32 faction_id)"); // @categories Faction { NPC *THIS; FACTION_VALUE RETVAL; dXSTARG; int32 other_faction = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->CheckNPCFactionAlly(other_faction); XSprePUSH; PUSHi((IV) RETVAL); @@ -97,7 +93,7 @@ XS(XS_NPC_AddItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_AddItem) { dXSARGS; if (items < 2 || items > 10) - Perl_croak(aTHX_ "Usage: NPC::AddItem(THIS, uint32 item_id, [uint16 charges = 0], [bool equip_item = true], [uint32 aug1 = 0], [uint32 aug2 = 0], [uint32 aug3 = 0], [uint32 aug4 = 0], [uint32 aug5 = 0], [uint32 aug6 = 0])"); + Perl_croak(aTHX_ "Usage: NPC::AddItem(THIS, uint32 item_id, [uint16 charges = 0], [bool equip_item = true], [uint32 aug1 = 0], [uint32 aug2 = 0], [uint32 aug3 = 0], [uint32 aug4 = 0], [uint32 aug5 = 0], [uint32 aug6 = 0])"); // @categories Inventory and Items { NPC *THIS; uint32 itemid = (uint32) SvUV(ST(1)); @@ -109,15 +105,7 @@ XS(XS_NPC_AddItem) { uint32 aug4 = 0; uint32 aug5 = 0; uint32 aug6 = 0; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (items > 2) charges = (uint16) SvUV(ST(2)); if (items > 3) @@ -144,18 +132,10 @@ XS(XS_NPC_AddLootTable); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_AddLootTable) { dXSARGS; if (items < 1) - Perl_croak(aTHX_ "Usage: NPC::AddLootTable(THIS, [uint32 loottable_id])"); + Perl_croak(aTHX_ "Usage: NPC::AddLootTable(THIS, [uint32 loottable_id])"); // @categories Inventory and Items { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; uint32 loottable_id = 0; if (items > 1) { @@ -172,21 +152,13 @@ XS(XS_NPC_RemoveItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_RemoveItem) { dXSARGS; if (items < 2 || items > 4) - Perl_croak(aTHX_ "Usage: NPC::RemoveItem(THIS, uint32 item_id, [uint16 quantity = 0], [uint16 slot_id = 0])"); + Perl_croak(aTHX_ "Usage: NPC::RemoveItem(THIS, uint32 item_id, [uint16 quantity = 0], [uint16 slot_id = 0])"); // @categories Inventory and Items { NPC *THIS; uint32 item_id = (uint32) SvUV(ST(1)); uint16 quantity; uint16 slot; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (items < 3) quantity = 0; else { @@ -208,18 +180,10 @@ XS(XS_NPC_ClearItemList); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_ClearItemList) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::ClearItemList(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::ClearItemList(THIS)"); // @categories Inventory and Items { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->ClearItemList(); } XSRETURN_EMPTY; @@ -229,22 +193,14 @@ XS(XS_NPC_AddCash); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_AddCash) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: NPC::AddCash(THIS, uint16 copper, uint16 silver, uint16 gold, uint16 platinum)"); + Perl_croak(aTHX_ "Usage: NPC::AddCash(THIS, uint16 copper, uint16 silver, uint16 gold, uint16 platinum)"); // @categories Currency and Points { NPC *THIS; uint16 in_copper = (uint16) SvUV(ST(1)); uint16 in_silver = (uint16) SvUV(ST(2)); uint16 in_gold = (uint16) SvUV(ST(3)); uint16 in_platinum = (uint16) SvUV(ST(4)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->AddCash(in_copper, in_silver, in_gold, in_platinum); } XSRETURN_EMPTY; @@ -254,18 +210,10 @@ XS(XS_NPC_RemoveCash); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_RemoveCash) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::RemoveCash(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::RemoveCash(THIS)"); // @categories Currency and Points { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->RemoveCash(); } XSRETURN_EMPTY; @@ -275,20 +223,12 @@ XS(XS_NPC_CountLoot); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_CountLoot) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::CountLoot(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::CountLoot(THIS)"); // @categories Inventory and Items { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->CountLoot(); XSprePUSH; PUSHu((UV) RETVAL); @@ -300,20 +240,12 @@ XS(XS_NPC_GetLoottableID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetLoottableID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetLoottableID(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetLoottableID(THIS)"); // @categories Stats and Attributes { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetLoottableID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -325,20 +257,12 @@ XS(XS_NPC_GetCopper); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetCopper) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetCopper(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetCopper(THIS)"); // @categories Currency and Points { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetCopper(); XSprePUSH; PUSHu((UV) RETVAL); @@ -350,20 +274,12 @@ XS(XS_NPC_GetSilver); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSilver) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSilver(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSilver(THIS)"); // @categories Currency and Points { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSilver(); XSprePUSH; PUSHu((UV) RETVAL); @@ -375,20 +291,12 @@ XS(XS_NPC_GetGold); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetGold) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetGold(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetGold(THIS)"); // @categories Currency and Points { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetGold(); XSprePUSH; PUSHu((UV) RETVAL); @@ -400,20 +308,12 @@ XS(XS_NPC_GetPlatinum); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetPlatinum) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetPlatinum(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetPlatinum(THIS)"); // @categories Currency and Points { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetPlatinum(); XSprePUSH; PUSHu((UV) RETVAL); @@ -425,19 +325,11 @@ XS(XS_NPC_SetCopper); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetCopper) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetCopper(THIS, uint32 copper_amount)"); + Perl_croak(aTHX_ "Usage: NPC::SetCopper(THIS, uint32 copper_amount)"); // @categories Currency and Points { NPC *THIS; uint32 amt = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetCopper(amt); } XSRETURN_EMPTY; @@ -447,19 +339,11 @@ XS(XS_NPC_SetSilver); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSilver) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSilver(THIS, uint32 silver_amount)"); + Perl_croak(aTHX_ "Usage: NPC::SetSilver(THIS, uint32 silver_amount)"); // @categories Currency and Points { NPC *THIS; uint32 amt = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSilver(amt); } XSRETURN_EMPTY; @@ -469,19 +353,11 @@ XS(XS_NPC_SetGold); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetGold) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetGold(THIS, uint32 gold_amount)"); + Perl_croak(aTHX_ "Usage: NPC::SetGold(THIS, uint32 gold_amount)"); // @categories Currency and Points { NPC *THIS; uint32 amt = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetGold(amt); } XSRETURN_EMPTY; @@ -491,19 +367,11 @@ XS(XS_NPC_SetPlatinum); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetPlatinum) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetPlatinum(THIS, uint32 platinum_amount)"); + Perl_croak(aTHX_ "Usage: NPC::SetPlatinum(THIS, uint32 platinum_amount)"); // @categories Currency and Points { NPC *THIS; uint32 amt = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetPlatinum(amt); } XSRETURN_EMPTY; @@ -513,19 +381,11 @@ XS(XS_NPC_SetGrid); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetGrid) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetGrid(THIS, int32 grid_id)"); + Perl_croak(aTHX_ "Usage: NPC::SetGrid(THIS, int32 grid_id)"); // @categories Script Utility { NPC *THIS; int32 grid_ = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetGrid(grid_); } XSRETURN_EMPTY; @@ -535,19 +395,11 @@ XS(XS_NPC_SetSaveWaypoint); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSaveWaypoint) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSaveWaypoint(THIS, uint16 waypoint)"); + Perl_croak(aTHX_ "Usage: NPC::SetSaveWaypoint(THIS, uint16 waypoint)"); // @categories Script Utility { NPC *THIS; uint16 waypoint = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSaveWaypoint(waypoint); } XSRETURN_EMPTY; @@ -557,19 +409,11 @@ XS(XS_NPC_SetSp2); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSp2) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSp2(THIS, uint32 set_spawn_group_id)"); + Perl_croak(aTHX_ "Usage: NPC::SetSp2(THIS, uint32 set_spawn_group_id)"); // @categories Spawns { NPC *THIS; uint32 sg2 = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSpawnGroupId(sg2); } XSRETURN_EMPTY; @@ -579,20 +423,12 @@ XS(XS_NPC_GetWaypointMax); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetWaypointMax) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetWaypointMax(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetWaypointMax(THIS)"); // @categories Script Utility { NPC *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetWaypointMax(); XSprePUSH; PUSHu((UV) RETVAL); @@ -604,20 +440,12 @@ XS(XS_NPC_GetGrid); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetGrid) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetGrid(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetGrid(THIS)"); // @categories Script Utility, Spawns { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetGrid(); XSprePUSH; PUSHi((IV) RETVAL); @@ -629,20 +457,12 @@ XS(XS_NPC_GetSp2); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSp2) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSp2(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSp2(THIS)"); // @categories Spawns { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnGroupId(); XSprePUSH; PUSHu((UV) RETVAL); @@ -654,20 +474,12 @@ XS(XS_NPC_GetNPCFactionID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetNPCFactionID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetNPCFactionID(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetNPCFactionID(THIS)"); // @categories Faction, Stats and Attributes { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetNPCFactionID(); XSprePUSH; PUSHi((IV) RETVAL); @@ -679,20 +491,12 @@ XS(XS_NPC_GetPrimaryFaction); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetPrimaryFaction) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetPrimaryFaction(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetPrimaryFaction(THIS)"); // @categories Faction, Stats and Attributes { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetPrimaryFaction(); XSprePUSH; PUSHi((IV) RETVAL); @@ -704,21 +508,13 @@ XS(XS_NPC_GetNPCHate); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetNPCHate) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::GetNPCHate(THIS, Mob* entity)"); + Perl_croak(aTHX_ "Usage: NPC::GetNPCHate(THIS, Mob* entity)"); // @categories Hate and Aggro { NPC *THIS; int32 RETVAL; dXSTARG; Mob *in_ent; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); in_ent = INT2PTR(Mob *, tmp); @@ -738,20 +534,12 @@ XS(XS_NPC_IsOnHatelist); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_IsOnHatelist) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::IsOnHatelist(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: NPC::IsOnHatelist(THIS, Mob* target)"); // @categories Hate and Aggro { NPC *THIS; bool RETVAL; Mob *p; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); p = INT2PTR(Mob *, tmp); @@ -771,19 +559,11 @@ XS(XS_NPC_RemoveFromHateList); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_RemoveFromHateList) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::RemoveFromHateList(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: NPC::RemoveFromHateList(THIS, Mob* target)"); // @categories Hate and Aggro { NPC *THIS; Mob *ent; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); ent = INT2PTR(Mob *, tmp); @@ -803,19 +583,11 @@ XS(XS_NPC_SetNPCFactionID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetNPCFactionID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetNPCFactionID(THIS, int32 faction_id)"); + Perl_croak(aTHX_ "Usage: NPC::SetNPCFactionID(THIS, int32 faction_id)"); // @categories Faction { NPC *THIS; int32 in = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetNPCFactionID(in); } XSRETURN_EMPTY; @@ -825,20 +597,12 @@ XS(XS_NPC_GetMaxDMG); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetMaxDMG) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetMaxDMG(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetMaxDMG(THIS)"); // @categories Stats and Attributes { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetMaxDMG(); XSprePUSH; PUSHu((UV) RETVAL); @@ -855,15 +619,7 @@ XS(XS_NPC_GetMinDMG) { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetMinDMG(); XSprePUSH; PUSHu((UV) RETVAL); @@ -876,19 +632,11 @@ XS(XS_NPC_IsAnimal); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_IsAnimal) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::IsAnimal(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::IsAnimal(THIS)"); // @categories Stats and Attributes { NPC *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->IsAnimal(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -900,20 +648,12 @@ XS(XS_NPC_GetPetSpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetPetSpellID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetPetSpellID(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetPetSpellID(THIS)"); // @categories Stats and Attributes, Pet { NPC *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetPetSpellID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -925,19 +665,11 @@ XS(XS_NPC_SetPetSpellID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetPetSpellID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetPetSpellID(THIS, uint16 amount)"); + Perl_croak(aTHX_ "Usage: NPC::SetPetSpellID(THIS, uint16 amount)"); // @categories Pet { NPC *THIS; uint16 amt = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetPetSpellID(amt); } XSRETURN_EMPTY; @@ -947,21 +679,13 @@ XS(XS_NPC_GetMaxDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetMaxDamage) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::GetMaxDamage(THIS, uint8 target_level)"); + Perl_croak(aTHX_ "Usage: NPC::GetMaxDamage(THIS, uint8 target_level)"); // @categories Stats and Attributes { NPC *THIS; uint32 RETVAL; dXSTARG; uint8 tlevel = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetMaxDamage(tlevel); XSprePUSH; PUSHu((UV) RETVAL); @@ -973,41 +697,41 @@ XS(XS_NPC_SetTaunting); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetTaunting) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetTaunting(THIS, bool toggle)"); + Perl_croak(aTHX_ "Usage: NPC::SetTaunting(THIS, bool toggle)"); // @categories Script Utility { NPC *THIS; bool toggle = (bool) SvTRUE(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetTaunting(toggle); } XSRETURN_EMPTY; } +XS(XS_NPC_IsTaunting); /* prototype to pass -Wmissing-prototypes */ +XS(XS_NPC_IsTaunting) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: NPC::IsTaunting(THIS)"); + { + NPC *THIS; + bool RETVAL; + VALIDATE_THIS_IS_NPC; + RETVAL = THIS->IsTaunting(); + ST(0) = boolSV(RETVAL); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + XS(XS_NPC_PickPocket); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_PickPocket) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::PickPocket(THIS, Client* thief)"); + Perl_croak(aTHX_ "Usage: NPC::PickPocket(THIS, Client* thief)"); // @categories Skills and Recipes { NPC *THIS; Client *thief; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); thief = INT2PTR(Client *, tmp); @@ -1025,19 +749,11 @@ XS(XS_NPC_StartSwarmTimer); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_StartSwarmTimer) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::StartSwarmTimer(THIS, uint32 duration)"); + Perl_croak(aTHX_ "Usage: NPC::StartSwarmTimer(THIS, uint32 duration)"); // @categories Script Utility, Pet { NPC *THIS; uint32 duration = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->StartSwarmTimer(duration); } XSRETURN_EMPTY; @@ -1047,19 +763,11 @@ XS(XS_NPC_DoClassAttacks); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_DoClassAttacks) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::DoClassAttacks(THIS, Mob* target)"); + Perl_croak(aTHX_ "Usage: NPC::DoClassAttacks(THIS, Mob* target)"); // @categories Script Utility { NPC *THIS; Mob *target; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); target = INT2PTR(Mob *, tmp); @@ -1082,15 +790,7 @@ XS(XS_NPC_GetMaxWp) { NPC *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetMaxWp(); XSprePUSH; PUSHi((IV) RETVAL); @@ -1102,19 +802,11 @@ XS(XS_NPC_DisplayWaypointInfo); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_DisplayWaypointInfo) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::DisplayWaypointInfo(THIS, Client* target)"); + Perl_croak(aTHX_ "Usage: NPC::DisplayWaypointInfo(THIS, Client* target)"); // @categories Script Utility { NPC *THIS; Client *to; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); to = INT2PTR(Client *, tmp); @@ -1132,18 +824,10 @@ XS(XS_NPC_CalculateNewWaypoint); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_CalculateNewWaypoint) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::CalculateNewWaypoint(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::CalculateNewWaypoint(THIS)"); // @categories Script Utility { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->CalculateNewWaypoint(); } XSRETURN_EMPTY; @@ -1153,19 +837,11 @@ XS(XS_NPC_AssignWaypoints); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_AssignWaypoints) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::AssignWaypoints(THIS, uint32 grid_id)"); + Perl_croak(aTHX_ "Usage: NPC::AssignWaypoints(THIS, uint32 grid_id)"); // @categories Script Utility { NPC *THIS; uint32 grid = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->AssignWaypoints(grid); } XSRETURN_EMPTY; @@ -1175,18 +851,10 @@ XS(XS_NPC_SetWaypointPause); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetWaypointPause) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::SetWaypointPause(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::SetWaypointPause(THIS)"); // @categories Script Utility { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetWaypointPause(); } XSRETURN_EMPTY; @@ -1196,19 +864,11 @@ XS(XS_NPC_UpdateWaypoint); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_UpdateWaypoint) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::UpdateWaypoint(THIS, int wp_index)"); + Perl_croak(aTHX_ "Usage: NPC::UpdateWaypoint(THIS, int wp_index)"); // @categories Script Utility { NPC *THIS; int wp_index = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->UpdateWaypoint(wp_index); } XSRETURN_EMPTY; @@ -1218,18 +878,10 @@ XS(XS_NPC_StopWandering); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_StopWandering) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::StopWandering(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::StopWandering(THIS)"); // @categories Script Utility { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->StopWandering(); } XSRETURN_EMPTY; @@ -1239,18 +891,10 @@ XS(XS_NPC_ResumeWandering); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_ResumeWandering) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::ResumeWandering(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::ResumeWandering(THIS)"); // @categories Script Utility { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->ResumeWandering(); } XSRETURN_EMPTY; @@ -1260,19 +904,11 @@ XS(XS_NPC_PauseWandering); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_PauseWandering) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::PauseWandering(THIS, int pause_time)"); + Perl_croak(aTHX_ "Usage: NPC::PauseWandering(THIS, int pause_time)"); // @categories Script Utility { NPC *THIS; int pausetime = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->PauseWandering(pausetime); } XSRETURN_EMPTY; @@ -1282,33 +918,19 @@ XS(XS_NPC_MoveTo); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_MoveTo) { dXSARGS; if (items != 4 && items != 5 && items != 6) - Perl_croak(aTHX_ "Usage: NPC::MoveTo(THIS, float x, float y, float z, [float heading], [bool save_guard_location = false])"); + Perl_croak(aTHX_ "Usage: NPC::MoveTo(THIS, float x, float y, float z, [float heading], [bool save_guard_location = false])"); // @categories Script Utility { NPC *THIS; float mtx = (float) SvNV(ST(1)); float mty = (float) SvNV(ST(2)); float mtz = (float) SvNV(ST(3)); - float mth; - bool saveguard; - + float mth = 0; + bool saveguard = false; + VALIDATE_THIS_IS_NPC; if (items > 4) mth = (float) SvNV(ST(4)); - else - mth = 0; - if (items > 5) saveguard = (bool) SvTRUE(ST(5)); - else - saveguard = false; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - auto position = glm::vec4(mtx, mty, mtz, mth); THIS->MoveTo(position, saveguard); } @@ -1319,18 +941,10 @@ XS(XS_NPC_NextGuardPosition); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_NextGuardPosition) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::NextGuardPosition(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::NextGuardPosition(THIS)"); // @categories Script Utility { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->NextGuardPosition(); } XSRETURN_EMPTY; @@ -1340,22 +954,14 @@ XS(XS_NPC_SaveGuardSpot); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SaveGuardSpot) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: NPC::SaveGuardSpot(THIS, x, y, z, heading)"); + Perl_croak(aTHX_ "Usage: NPC::SaveGuardSpot(THIS, x, y, z, heading)"); // @categories Script Utility { NPC *THIS; float x = (float)SvNV(ST(1)); float y = (float)SvNV(ST(2)); float z = (float)SvNV(ST(3)); float heading = (float)SvNV(ST(4)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SaveGuardSpot(glm::vec4(x, y, z, heading)); } XSRETURN_EMPTY; @@ -1365,19 +971,11 @@ XS(XS_NPC_IsGuarding); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_IsGuarding) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::IsGuarding(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::IsGuarding(THIS)"); // @categories Script Utility { NPC *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->IsGuarding(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1389,7 +987,7 @@ XS(XS_NPC_AI_SetRoambox); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_AI_SetRoambox) { dXSARGS; if (items < 6 || items > 8) - Perl_croak(aTHX_ "Usage: NPC::AI_SetRoambox(THIS, float distance, float max_x, float min_x, float max_y, float min_y, [uint32 max_delay = 2500], [uint32 min_delay = 2500])"); + Perl_croak(aTHX_ "Usage: NPC::AI_SetRoambox(THIS, float distance, float max_x, float min_x, float max_y, float min_y, [uint32 max_delay = 2500], [uint32 min_delay = 2500])"); // @categories Script Utility { NPC *THIS; float iDist = (float) SvNV(ST(1)); @@ -1399,15 +997,7 @@ XS(XS_NPC_AI_SetRoambox) { float iMinY = (float) SvNV(ST(5)); uint32 iDelay; uint32 iMinDelay; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (items < 7) { iMinDelay = 2500; iDelay = 2500; @@ -1428,20 +1018,12 @@ XS(XS_NPC_GetNPCSpellsID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetNPCSpellsID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetNPCSpellsID(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetNPCSpellsID(THIS)"); // @categories Stats and Attributes { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetNPCSpellsID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1453,20 +1035,12 @@ XS(XS_NPC_GetSpawnPointID); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpawnPointID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointID(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointID(THIS)"); // @categories Spawns { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnPointID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1478,21 +1052,12 @@ XS(XS_NPC_GetSpawnPointX); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpawnPointX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointX(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointX(THIS)"); // @categories Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnPoint().x; XSprePUSH; PUSHn((double) RETVAL); @@ -1504,21 +1069,12 @@ XS(XS_NPC_GetSpawnPointY); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpawnPointY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointY(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointY(THIS)"); // @categories Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnPoint().y; XSprePUSH; PUSHn((double) RETVAL); @@ -1530,21 +1086,12 @@ XS(XS_NPC_GetSpawnPointZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpawnPointZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointZ(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointZ(THIS)"); // @categories Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnPoint().z; XSprePUSH; PUSHn((double) RETVAL); @@ -1556,21 +1103,12 @@ XS(XS_NPC_GetSpawnPointH); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpawnPointH) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointH(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpawnPointH(THIS)"); // @categories Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnPoint().w; XSprePUSH; PUSHn((double) RETVAL); @@ -1582,21 +1120,12 @@ XS(XS_NPC_GetGuardPointX); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetGuardPointX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetGuardPointX(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetGuardPointX(THIS)"); // @categories Script Utility, Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetGuardPoint().x; XSprePUSH; PUSHn((double) RETVAL); @@ -1608,21 +1137,12 @@ XS(XS_NPC_GetGuardPointY); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetGuardPointY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetGuardPointY(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetGuardPointY(THIS)"); // @categories Script Utility, Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetGuardPoint().y; XSprePUSH; PUSHn((double) RETVAL); @@ -1634,21 +1154,12 @@ XS(XS_NPC_GetGuardPointZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetGuardPointZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetGuardPointZ(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetGuardPointZ(THIS)"); // @categories Script Utility, Spawns { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetGuardPoint().z; XSprePUSH; PUSHn((double) RETVAL); @@ -1660,19 +1171,11 @@ XS(XS_NPC_SetPrimSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetPrimSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetPrimSkill(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: NPC::SetPrimSkill(THIS, int skill_id)"); // @categories Stats and Attributes { NPC *THIS; int skill_id = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetPrimSkill(skill_id); } XSRETURN_EMPTY; @@ -1682,19 +1185,11 @@ XS(XS_NPC_SetSecSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSecSkill) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSecSkill(THIS, int skill_id)"); + Perl_croak(aTHX_ "Usage: NPC::SetSecSkill(THIS, int skill_id)"); // @categories Stats and Attributes { NPC *THIS; int skill_id = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSecSkill(skill_id); } XSRETURN_EMPTY; @@ -1704,20 +1199,12 @@ XS(XS_NPC_GetPrimSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetPrimSkill) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetPrimSkill(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetPrimSkill(THIS)"); // @categories Stats and Attributes { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetPrimSkill(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1729,20 +1216,12 @@ XS(XS_NPC_GetSecSkill); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSecSkill) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSecSkill(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSecSkill(THIS)"); // @categories Stats and Attributes { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSecSkill(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1754,20 +1233,12 @@ XS(XS_NPC_GetSwarmOwner); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSwarmOwner) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSwarmOwner(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSwarmOwner(THIS)"); // @categories Pet { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSwarmOwner(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1779,20 +1250,12 @@ XS(XS_NPC_GetSwarmTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSwarmTarget) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSwarmTarget(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSwarmTarget(THIS)"); // @categories Pet { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSwarmTarget(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1804,19 +1267,11 @@ XS(XS_NPC_SetSwarmTarget); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSwarmTarget) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSwarmTarget(THIS, int target_id)"); + Perl_croak(aTHX_ "Usage: NPC::SetSwarmTarget(THIS, int target_id)"); // @categories Pet { NPC *THIS; int target_id = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSwarmTarget(target_id); } XSRETURN_EMPTY; @@ -1826,20 +1281,12 @@ XS(XS_NPC_ModifyNPCStat); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_ModifyNPCStat) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: NPC::ModifyNPCStat(THIS, string key, string value)"); + Perl_croak(aTHX_ "Usage: NPC::ModifyNPCStat(THIS, string key, string value)"); // @categories Stats and Attributes { NPC *THIS; Const_char *identifier = (Const_char *) SvPV_nolen(ST(1)); Const_char *newValue = (Const_char *) SvPV_nolen(ST(2)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->ModifyNPCStat(identifier, newValue); } XSRETURN_EMPTY; @@ -1849,7 +1296,7 @@ XS(XS_NPC_AddSpellToNPCList); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_AddSpellToNPCList) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: NPC::AddAISpell(THIS, int priority, int spell_id, int type, int mana_cost, int recast_delay, int resist_adjust)"); + Perl_croak(aTHX_ "Usage: NPC::AddAISpell(THIS, int priority, int spell_id, int type, int mana_cost, int recast_delay, int resist_adjust)"); // @categories Spells and Disciplines, Script Utility { NPC *THIS; int priority = (int) SvIV(ST(1)); @@ -1858,15 +1305,7 @@ XS(XS_NPC_AddSpellToNPCList) { int mana_cost = (int) SvIV(ST(4)); int recast_delay = (int) SvIV(ST(5)); int resist_adjust = (int) SvIV(ST(6)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->AddSpellToNPCList(priority, spell_id, type, mana_cost, recast_delay, resist_adjust, 0, 0); } XSRETURN_EMPTY; @@ -1876,19 +1315,11 @@ XS(XS_NPC_RemoveSpellFromNPCList); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_RemoveSpellFromNPCList) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::RemoveAISpell(THIS, int spell_id)"); + Perl_croak(aTHX_ "Usage: NPC::RemoveAISpell(THIS, int spell_id)"); // @categories Spells and Disciplines { NPC *THIS; int spell_id = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->RemoveSpellFromNPCList(spell_id); } XSRETURN_EMPTY; @@ -1898,19 +1329,11 @@ XS(XS_NPC_SetSpellFocusDMG); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSpellFocusDMG) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSpellFocusDMG(THIS, int new_spell_focus_dmg)"); + Perl_croak(aTHX_ "Usage: NPC::SetSpellFocusDMG(THIS, int new_spell_focus_dmg)"); // @categories Stats and Attributes { NPC *THIS; int32 NewSpellFocusDMG = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSpellFocusDMG(NewSpellFocusDMG); } XSRETURN_EMPTY; @@ -1920,20 +1343,12 @@ XS(XS_NPC_GetSpellFocusDMG); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpellFocusDMG) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpellFocusDMG(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpellFocusDMG(THIS)"); // @categories Spells and Disciplines { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpellFocusDMG(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1945,19 +1360,11 @@ XS(XS_NPC_SetSpellFocusHeal); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSpellFocusHeal) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::SetSpellFocusHeal(THIS, int32 new_spell_focus_heal)"); + Perl_croak(aTHX_ "Usage: NPC::SetSpellFocusHeal(THIS, int32 new_spell_focus_heal)"); // @categories Stats and Attributes { NPC *THIS; int32 NewSpellFocusHeal = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->SetSpellFocusHeal(NewSpellFocusHeal); } XSRETURN_EMPTY; @@ -1967,20 +1374,12 @@ XS(XS_NPC_GetSpellFocusHeal); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpellFocusHeal) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpellFocusHeal(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpellFocusHeal(THIS)"); // @categories Spells and Disciplines { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpellFocusHeal(); XSprePUSH; PUSHu((UV) RETVAL); @@ -1992,20 +1391,12 @@ XS(XS_NPC_GetSlowMitigation); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSlowMitigation) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSlowMitigation(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSlowMitigation(THIS)"); // @categories Stats and Attributes { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSlowMitigation(); XSprePUSH; PUSHn((double) RETVAL); @@ -2017,20 +1408,12 @@ XS(XS_NPC_GetAttackSpeed); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetAttackSpeed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetAttackSpeed(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetAttackSpeed(THIS)"); // @categories Stats and Attributes { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetAttackSpeed(); XSprePUSH; PUSHn((double) RETVAL); @@ -2042,20 +1425,12 @@ XS(XS_NPC_GetAttackDelay); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetAttackDelay) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetAttackDelay(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetAttackDelay(THIS)"); // @categories Stats and Attributes { NPC *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetAttackDelay(); XSprePUSH; PUSHn((double) RETVAL); @@ -2067,20 +1442,12 @@ XS(XS_NPC_GetAccuracyRating); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetAccuracyRating) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetAccuracyRating(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetAccuracyRating(THIS)"); // @categories Stats and Attributes { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetAccuracyRating(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2092,20 +1459,12 @@ XS(XS_NPC_GetAvoidanceRating); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetAvoidanceRating) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetAvoidanceyRating(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetAvoidanceRating(THIS)"); // @categories Stats and Attributes { NPC *THIS; int32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetAvoidanceRating(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2117,20 +1476,12 @@ XS(XS_NPC_GetSpawnKillCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetSpawnKillCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetSpawnKillCount(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetSpawnKillCount(THIS)"); // @categories Spawns { NPC *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetSpawnKillCount(); XSprePUSH; PUSHu((UV) RETVAL); @@ -2142,20 +1493,12 @@ XS(XS_NPC_GetScore); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetScore) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetScore(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetScore(THIS)"); // @categories Script Utility { NPC *THIS; int RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetScore(); XSprePUSH; PUSHi((UV) RETVAL); @@ -2167,18 +1510,11 @@ XS(XS_NPC_MerchantOpenShop); XS(XS_NPC_MerchantOpenShop) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::MerchantOpenShop(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::MerchantOpenShop(THIS)"); // @categories Script Utility { NPC *THIS; dXSTARG; - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->MerchantOpenShop(); } XSRETURN_EMPTY; @@ -2188,18 +1524,11 @@ XS(XS_NPC_MerchantCloseShop); XS(XS_NPC_MerchantCloseShop) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::MerchantCloseShop(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::MerchantCloseShop(THIS)"); // @categories Script Utility { NPC *THIS; dXSTARG; - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->MerchantCloseShop(); } XSRETURN_EMPTY; @@ -2209,21 +1538,13 @@ XS(XS_NPC_AddMeleeProc); XS(XS_NPC_AddMeleeProc) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: NPC::AddMeleeProc(THIS, int spell_id, int chance)"); + Perl_croak(aTHX_ "Usage: NPC::AddMeleeProc(THIS, int spell_id, int chance)"); // @categories Script Utility { NPC *THIS; int spell_id = (int) SvIV(ST(1)); int chance = (int) SvIV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->AddProcToWeapon(spell_id, true, chance); } XSRETURN_EMPTY; @@ -2233,21 +1554,13 @@ XS(XS_NPC_AddRangedProc); XS(XS_NPC_AddRangedProc) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: NPC::AddRangedProc(THIS, int spell_id, int chance)"); + Perl_croak(aTHX_ "Usage: NPC::AddRangedProc(THIS, int spell_id, int chance)"); // @categories Script Utility { NPC *THIS; int spell_id = (int) SvIV(ST(1)); int chance = (int) SvIV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->AddRangedProc(spell_id, chance); } XSRETURN_EMPTY; @@ -2257,21 +1570,13 @@ XS(XS_NPC_AddDefensiveProc); XS(XS_NPC_AddDefensiveProc) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: NPC::AddDefensiveProc(THIS, int spell_id, int chance)"); + Perl_croak(aTHX_ "Usage: NPC::AddDefensiveProc(THIS, int spell_id, int chance)"); // @categories Script Utility { NPC *THIS; int spell_id = (int) SvIV(ST(1)); int chance = (int) SvIV(ST(2)); dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->AddDefensiveProc(spell_id, chance); } XSRETURN_EMPTY; @@ -2281,20 +1586,12 @@ XS(XS_NPC_RemoveMeleeProc); XS(XS_NPC_RemoveMeleeProc) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::RemoveMeleeProc(THIS, int spell_id)"); + Perl_croak(aTHX_ "Usage: NPC::RemoveMeleeProc(THIS, int spell_id)"); // @categories Script Utility { NPC *THIS; int spell_id = (int) SvIV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->RemoveProcFromWeapon(spell_id, false); } XSRETURN_EMPTY; @@ -2304,20 +1601,12 @@ XS(XS_NPC_RemoveRangedProc); XS(XS_NPC_RemoveRangedProc) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::RemoveRangedProc(THIS, int spell_id)"); + Perl_croak(aTHX_ "Usage: NPC::RemoveRangedProc(THIS, int spell_id)"); // @categories Script Utility { NPC *THIS; int spell_id = (int) SvIV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->RemoveRangedProc(spell_id, false); } XSRETURN_EMPTY; @@ -2327,20 +1616,12 @@ XS(XS_NPC_RemoveDefensiveProc); XS(XS_NPC_RemoveDefensiveProc) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::RemoveDefensiveProc(THIS, int spell_id)"); + Perl_croak(aTHX_ "Usage: NPC::RemoveDefensiveProc(THIS, int spell_id)"); // @categories Script Utility { NPC *THIS; int spell_id = (int) SvIV(ST(1)); dXSTARG; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == NULL) - Perl_croak(aTHX_ "THIS is NULL, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->RemoveDefensiveProc(spell_id, false); } XSRETURN_EMPTY; @@ -2350,19 +1631,11 @@ XS(XS_NPC_ChangeLastName); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_ChangeLastName) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: NPC::ChangeLastName(THIS, string name)"); + Perl_croak(aTHX_ "Usage: NPC::ChangeLastName(THIS, string name)"); // @categories Script Utility { NPC *THIS; char *name = nullptr; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; if (items > 1) { name = (char *) SvPV_nolen(ST(1)); } THIS->ChangeLastName(name); @@ -2374,18 +1647,10 @@ XS(XS_NPC_ClearLastName); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_ClearLastName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::ClearLastName(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::ClearLastName(THIS)"); // @categories Script Utility { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->ClearLastName(); } XSRETURN_EMPTY; @@ -2395,19 +1660,11 @@ XS(XS_NPC_GetCombatState); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_GetCombatState) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: NPC::GetCombatState(THIS)"); + Perl_croak(aTHX_ "Usage: NPC::GetCombatState(THIS)"); // @categories Script Utility { NPC *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; RETVAL = THIS->GetCombatEvent(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -2419,7 +1676,7 @@ XS(XS_NPC_SetSimpleRoamBox); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_SetSimpleRoamBox) { dXSARGS; if (items < 2) - Perl_croak(aTHX_ "Usage: NPC::SetSimpleRoamBox(THIS, box_size, move_distance, move_delay)"); + Perl_croak(aTHX_ "Usage: NPC::SetSimpleRoamBox(THIS, box_size, move_distance, move_delay)"); // @categories Script Utility { NPC *THIS; @@ -2434,18 +1691,7 @@ XS(XS_NPC_SetSimpleRoamBox) { if (items >= 4) { move_delay = (int) SvIV(ST(3)); } - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } - else { - Perl_croak(aTHX_ "THIS is not of type NPC"); - } - if (THIS == nullptr) { - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - } - + VALIDATE_THIS_IS_NPC; THIS->SetSimpleRoamBox(box_size, move_distance, move_delay); } XSRETURN_EMPTY; @@ -2455,24 +1701,46 @@ XS(XS_NPC_SetSimpleRoamBox) { XS(XS_NPC_RecalculateSkills); /* prototype to pass -Wmissing-prototypes */ XS(XS_NPC_RecalculateSkills) { dXSARGS; - if (items != 2) - Perl_croak(aTHX_ "Usage: NPC::RecalculateSkills(THIS)"); + if (items != 1) + Perl_croak(aTHX_ "Usage: NPC::RecalculateSkills(THIS)"); // @categories Skills and Recipes { NPC *THIS; - - if (sv_derived_from(ST(0), "NPC")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(NPC *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type NPC"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_NPC; THIS->RecalculateSkills(); } XSRETURN_EMPTY; } +XS(XS_NPC_ScaleNPC); /* prototype to pass -Wmissing-prototypes */ +XS(XS_NPC_ScaleNPC) { + dXSARGS; + if (items != 2) + Perl_croak(aTHX_ "Usage: NPC::ScaleNPC(THIS, uint8 npc_level)"); + { + NPC *THIS; + uint8 npc_level = (uint8) SvUV(ST(1)); + VALIDATE_THIS_IS_NPC; + THIS->ScaleNPC(npc_level); + } + XSRETURN_EMPTY; +} + +XS(XS_NPC_IsRaidTarget); /* prototype to pass -Wmissing-prototypes */ +XS(XS_NPC_IsRaidTarget) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: NPC::IsRaidTarget(THIS)"); // @categories Stats and Attributes + { + NPC *THIS; + bool is_raid_target; + VALIDATE_THIS_IS_NPC; + is_raid_target = THIS->IsRaidTarget(); + ST(0) = boolSV(is_raid_target); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + #ifdef __cplusplus extern "C" #endif @@ -2528,6 +1796,7 @@ XS(boot_NPC) { newXSproto(strcpy(buf, "SetPetSpellID"), XS_NPC_SetPetSpellID, file, "$$"); newXSproto(strcpy(buf, "GetMaxDamage"), XS_NPC_GetMaxDamage, file, "$$"); newXSproto(strcpy(buf, "SetTaunting"), XS_NPC_SetTaunting, file, "$$"); + newXSproto(strcpy(buf, "IsTaunting"), XS_NPC_IsTaunting, file, "$"); newXSproto(strcpy(buf, "PickPocket"), XS_NPC_PickPocket, file, "$$"); newXSproto(strcpy(buf, "StartSwarmTimer"), XS_NPC_StartSwarmTimer, file, "$$"); newXSproto(strcpy(buf, "DoClassAttacks"), XS_NPC_DoClassAttacks, file, "$$"); @@ -2588,6 +1857,8 @@ XS(boot_NPC) { newXSproto(strcpy(buf, "GetCombatState"), XS_NPC_GetCombatState, file, "$"); newXSproto(strcpy(buf, "SetSimpleRoamBox"), XS_NPC_SetSimpleRoamBox, file, "$$;$$"); newXSproto(strcpy(buf, "RecalculateSkills"), XS_NPC_RecalculateSkills, file, "$"); + newXSproto(strcpy(buf, "ScaleNPC"), XS_NPC_ScaleNPC, file, "$$"); + newXSproto(strcpy(buf, "IsRaidTarget"), XS_NPC_IsRaidTarget, file, "$"); XSRETURN_YES; } diff --git a/zone/perl_object.cpp b/zone/perl_object.cpp index df2589de4..c1e5d76db 100644 --- a/zone/perl_object.cpp +++ b/zone/perl_object.cpp @@ -42,23 +42,28 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_OBJECT \ + do { \ + if (sv_derived_from(ST(0), "Object")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Object*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Object"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_Object_IsGroundSpawn); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_IsGroundSpawn) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::IsGroundSpawn(THIS)"); + Perl_croak(aTHX_ "Usage: Object::IsGroundSpawn(THIS)"); // @categories Objects { Object *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->IsGroundSpawn(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -71,18 +76,10 @@ XS(XS_Object_Close); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_Close) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::Close(THIS)"); + Perl_croak(aTHX_ "Usage: Object::Close(THIS)"); // @categories Objects { Object *THIS; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->Close(); } XSRETURN_EMPTY; @@ -93,19 +90,11 @@ XS(XS_Object_Delete); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_Delete) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Object::Delete(THIS, [bool reset_state = false])"); + Perl_croak(aTHX_ "Usage: Object::Delete(THIS, [bool reset_state = false])"); // @categories Objects { Object *THIS; bool reset_state; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; if (items < 2) reset_state = false; else { @@ -120,18 +109,10 @@ XS(XS_Object_StartDecay); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_StartDecay) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::StartDecay(THIS)"); + Perl_croak(aTHX_ "Usage: Object::StartDecay(THIS)"); // @categories Objects { Object *THIS; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->StartDecay(); } XSRETURN_EMPTY; @@ -142,19 +123,11 @@ XS(XS_Object_DeleteItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_DeleteItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::DeleteItem(THIS, uint8 index)"); + Perl_croak(aTHX_ "Usage: Object::DeleteItem(THIS, uint8 index)"); // @categories Objects { Object *THIS; uint8 index = (uint8) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->DeleteItem(index); } XSRETURN_EMPTY; @@ -164,19 +137,11 @@ XS(XS_Object_IsObject); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_IsObject) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::IsObject(THIS)"); + Perl_croak(aTHX_ "Usage: Object::IsObject(THIS)"); // @categories Objects { Object *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->IsObject(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -189,19 +154,11 @@ XS(XS_Object_Save); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_Save) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::Save(THIS)"); + Perl_croak(aTHX_ "Usage: Object::Save(THIS)"); // @categories Objects { Object *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->Save(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -214,19 +171,11 @@ XS(XS_Object_SetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetID(THIS, uint16 id)"); + Perl_croak(aTHX_ "Usage: Object::SetID(THIS, uint16 id)"); // @categories Objects { Object *THIS; uint16 set_id = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetID(set_id); } XSRETURN_EMPTY; @@ -237,18 +186,10 @@ XS(XS_Object_ClearUser); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_ClearUser) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::ClearUser(THIS)"); + Perl_croak(aTHX_ "Usage: Object::ClearUser(THIS)"); // @categories Objects { Object *THIS; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->ClearUser(); } XSRETURN_EMPTY; @@ -259,20 +200,12 @@ XS(XS_Object_GetDBID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetDBID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetDBID(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetDBID(THIS)"); // @categories Objects { Object *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetDBID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -284,20 +217,12 @@ XS(XS_Object_GetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetID(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetID(THIS)"); // @categories Objects { Object *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -309,20 +234,12 @@ XS(XS_Object_GetX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetX) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetX(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetX(THIS)"); // @categories Objects { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetX(); XSprePUSH; PUSHn((double) RETVAL); @@ -334,20 +251,12 @@ XS(XS_Object_GetY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetY) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetY(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetY(THIS)"); // @categories Objects { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetY(); XSprePUSH; PUSHn((double) RETVAL); @@ -359,20 +268,12 @@ XS(XS_Object_GetZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetZ) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetZ(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetZ(THIS)"); // @categories Objects { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetZ(); XSprePUSH; PUSHn((double) RETVAL); @@ -384,20 +285,12 @@ XS(XS_Object_GetHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetHeading) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetHeading(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetHeading(THIS)"); // @categories Objects { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetHeadingData(); XSprePUSH; PUSHn((double) RETVAL); @@ -409,20 +302,12 @@ XS(XS_Object_VarSave); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_VarSave) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::VarSave(THIS)"); + Perl_croak(aTHX_ "Usage: Object::VarSave(THIS)"); // @categories Objects { Object *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->VarSave(); XSprePUSH; PUSHu((UV) RETVAL); @@ -435,20 +320,12 @@ XS(XS_Object_GetType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetType) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetType(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetType(THIS)"); // @categories Objects { Object *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetType(); XSprePUSH; PUSHu((UV) RETVAL); @@ -461,19 +338,11 @@ XS(XS_Object_SetType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetType) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetType(THIS, uint32 type)"); + Perl_croak(aTHX_ "Usage: Object::SetType(THIS, uint32 type)"); // @categories Objects { Object *THIS; uint32 type = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetType(type); } XSRETURN_EMPTY; @@ -484,20 +353,12 @@ XS(XS_Object_GetIcon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetIcon) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetIcon(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetIcon(THIS)"); // @categories Objects { Object *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetIcon(); XSprePUSH; PUSHu((UV) RETVAL); @@ -510,19 +371,11 @@ XS(XS_Object_SetIcon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetIcon) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetIcon(THIS, uint32 icon)"); + Perl_croak(aTHX_ "Usage: Object::SetIcon(THIS, uint32 icon)"); // @categories Objects { Object *THIS; uint32 icon = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetIcon(icon); } XSRETURN_EMPTY; @@ -533,20 +386,12 @@ XS(XS_Object_GetItemID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetItemID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetItemID(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetItemID(THIS)"); // @categories Objects { Object *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetItemID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -559,19 +404,11 @@ XS(XS_Object_SetItemID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetItemID) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetItemID(THIS, uint32 item_id)"); + Perl_croak(aTHX_ "Usage: Object::SetItemID(THIS, uint32 item_id)"); // @categories Objects { Object *THIS; uint32 itemid = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetItemID(itemid); } XSRETURN_EMPTY; @@ -581,21 +418,13 @@ XS(XS_Object_SetLocation); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetLocation) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Object::SetLocation(THIS, float x, float y, float z)"); + Perl_croak(aTHX_ "Usage: Object::SetLocation(THIS, float x, float y, float z)"); // @categories Objects { Object *THIS; float x = (float) SvNV(ST(1)); float y = (float) SvNV(ST(2)); float z = (float) SvNV(ST(3)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetLocation(x, y, z); } XSRETURN_EMPTY; @@ -605,19 +434,11 @@ XS(XS_Object_SetX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetX) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetX(THIS, float x)"); + Perl_croak(aTHX_ "Usage: Object::SetX(THIS, float x)"); // @categories Objects { Object *THIS; float pos = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetX(pos); } XSRETURN_EMPTY; @@ -627,19 +448,11 @@ XS(XS_Object_SetY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetY) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetY(THIS, float y)"); + Perl_croak(aTHX_ "Usage: Object::SetY(THIS, float y)"); // @categories Objects { Object *THIS; float pos = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetY(pos); } XSRETURN_EMPTY; @@ -649,19 +462,11 @@ XS(XS_Object_SetZ); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetZ) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetZ(THIS, float z)"); + Perl_croak(aTHX_ "Usage: Object::SetZ(THIS, float z)"); // @categories Objects { Object *THIS; float pos = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetZ(pos); } XSRETURN_EMPTY; @@ -671,19 +476,11 @@ XS(XS_Object_SetHeading); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetHeading) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetHeading(THIS, float heading)"); + Perl_croak(aTHX_ "Usage: Object::SetHeading(THIS, float heading)"); // @categories Objects { Object *THIS; float heading = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetHeading(heading); } XSRETURN_EMPTY; @@ -693,19 +490,11 @@ XS(XS_Object_SetModelName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetModelName) { dXSARGS; if (items < 1 || items > 2) - Perl_croak(aTHX_ "Usage: Object::SetModelName(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Object::SetModelName(THIS, string name)"); // @categories Objects { Object *THIS; char *name = nullptr; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; if (items > 1) { name = (char *) SvPV_nolen(ST(1)); } THIS->SetModelName(name); @@ -716,20 +505,12 @@ XS(XS_Object_GetModelName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetModelName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetModelName(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetModelName(THIS)"); // @categories Objects { Object *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetModelName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -742,19 +523,11 @@ XS(XS_Object_Repop); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_Repop) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::Repop(THIS)"); + Perl_croak(aTHX_ "Usage: Object::Repop(THIS)"); // @categories Objects { Object *THIS; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - THIS->Repop(); + VALIDATE_THIS_IS_OBJECT; THIS->Repop(); } XSRETURN_EMPTY; } @@ -763,19 +536,11 @@ XS(XS_Object_Depop); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_Depop) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::Depop(THIS)"); + Perl_croak(aTHX_ "Usage: Object::Depop(THIS)"); // @categories Objects { Object *THIS; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - THIS->Depop(); + VALIDATE_THIS_IS_OBJECT; THIS->Depop(); } XSRETURN_EMPTY; } @@ -785,21 +550,13 @@ XS(XS_Object_GetEntityVariable); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetEntityVariable) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::GetEntityVariable(THIS, string key)"); + Perl_croak(aTHX_ "Usage: Object::GetEntityVariable(THIS, string key)"); // @categories Objects { Object *THIS; Const_char *id = SvPV_nolen(ST(1)); Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetEntityVariable(id); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -812,20 +569,12 @@ XS(XS_Object_EntityVariableExists); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_EntityVariableExists) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::EntityVariableExists(THIS, string key)"); + Perl_croak(aTHX_ "Usage: Object::EntityVariableExists(THIS, string key)"); // @categories Objects { Object *THIS; Const_char *id = SvPV_nolen(ST(1)); bool RETVAL; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->EntityVariableExists(id); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -837,20 +586,12 @@ XS(XS_Object_SetEntityVariable); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetEntityVariable) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Object::SetEntityVariable(THIS, string key, string var)"); + Perl_croak(aTHX_ "Usage: Object::SetEntityVariable(THIS, string key, string var)"); // @categories Objects { Object *THIS; Const_char *id = SvPV_nolen(ST(1)); const char *var = (const char *) SvPV_nolen(ST(2)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetEntityVariable(id, var); } XSRETURN_EMPTY; @@ -860,20 +601,12 @@ XS(XS_Object_GetSolidType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetSolidType) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetSolidType(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetSolidType(THIS)"); // @categories Objects { Object *THIS; uint16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetSolidType(); XSprePUSH; PUSHu((UV) RETVAL); @@ -886,19 +619,11 @@ XS(XS_Object_SetSolidType); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetSolidType) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetSolidType(THIS, uint16 type)"); + Perl_croak(aTHX_ "Usage: Object::SetSolidType(THIS, uint16 type)"); // @categories Objects { Object *THIS; uint16 type = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetSolidType(type); } XSRETURN_EMPTY; @@ -908,20 +633,12 @@ XS(XS_Object_GetSize); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_GetSize) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Object::GetSize(THIS)"); + Perl_croak(aTHX_ "Usage: Object::GetSize(THIS)"); // @categories Objects { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetSize(); XSprePUSH; PUSHn((double) RETVAL); @@ -934,19 +651,11 @@ XS(XS_Object_SetSize); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetSize) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetSize(THIS, float size)"); + Perl_croak(aTHX_ "Usage: Object::SetSize(THIS, float size)"); // @categories Objects { Object *THIS; float size = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetSize(size); } XSRETURN_EMPTY; @@ -956,19 +665,11 @@ XS(XS_Object_SetTiltX); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetTiltX) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetTiltX(THIS, float tilt_x)"); + Perl_croak(aTHX_ "Usage: Object::SetTiltX(THIS, float tilt_x)"); // @categories Objects { Object *THIS; float pos = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetTiltX(pos); } XSRETURN_EMPTY; @@ -978,19 +679,11 @@ XS(XS_Object_SetTiltY); /* prototype to pass -Wmissing-prototypes */ XS(XS_Object_SetTiltY) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Object::SetTiltY(THIS, float tilt_y)"); + Perl_croak(aTHX_ "Usage: Object::SetTiltY(THIS, float tilt_y)"); // @categories Objects { Object *THIS; float pos = (float) SvNV(ST(1)); - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; THIS->SetTiltY(pos); } XSRETURN_EMPTY; @@ -1005,15 +698,7 @@ XS(XS_Object_GetTiltX) { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetTiltX(); XSprePUSH; PUSHn((double) RETVAL); @@ -1030,15 +715,7 @@ XS(XS_Object_GetTiltY) { Object *THIS; float RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Object")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Object *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Object"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_OBJECT; RETVAL = THIS->GetTiltY(); XSprePUSH; PUSHn((double) RETVAL); diff --git a/zone/perl_perlpacket.cpp b/zone/perl_perlpacket.cpp index f23cf36d7..36fb97440 100644 --- a/zone/perl_perlpacket.cpp +++ b/zone/perl_perlpacket.cpp @@ -41,6 +41,19 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_PACKET \ + do { \ + if (sv_derived_from(ST(0), "PerlPacket")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(PerlPacket*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type PerlPacket"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_PerlPacket_new); /* prototype to pass -Wmissing-prototypes */ XS(XS_PerlPacket_new) { @@ -80,16 +93,7 @@ XS(XS_PerlPacket_DESTROY) Perl_croak(aTHX_ "Usage: PerlPacket::DESTROY(THIS)"); { PerlPacket * THIS; - - if (SvROK(ST(0))) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not a reference"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; delete THIS; } XSRETURN_EMPTY; @@ -105,16 +109,7 @@ XS(XS_PerlPacket_SetOpcode) PerlPacket * THIS; bool RETVAL; char * opcode = (char *)SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; RETVAL = THIS->SetOpcode(opcode); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -131,16 +126,7 @@ XS(XS_PerlPacket_Resize) { PerlPacket * THIS; uint32 len = (uint32)SvUV(ST(1)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->Resize(len); } XSRETURN_EMPTY; @@ -155,16 +141,7 @@ XS(XS_PerlPacket_SendTo) { PerlPacket * THIS; Client * who; - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV*)SvRV(ST(1))); who = INT2PTR(Client *,tmp); @@ -187,16 +164,7 @@ XS(XS_PerlPacket_SendToAll) Perl_croak(aTHX_ "Usage: PerlPacket::SendToAll(THIS)"); { PerlPacket * THIS; - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SendToAll(); } XSRETURN_EMPTY; @@ -210,16 +178,7 @@ XS(XS_PerlPacket_Zero) Perl_croak(aTHX_ "Usage: PerlPacket::Zero(THIS)"); { PerlPacket * THIS; - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->Zero(); } XSRETURN_EMPTY; @@ -235,16 +194,7 @@ XS(XS_PerlPacket_FromArray) PerlPacket * THIS; int * numbers; uint32 length = (uint32)SvUV(ST(2)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; AV *av_numbers; if (SvROK(ST(1)) && SvTYPE(SvRV(ST(1)))==SVt_PVAV) av_numbers = (AV*)SvRV(ST(1)); @@ -277,16 +227,7 @@ XS(XS_PerlPacket_SetByte) PerlPacket * THIS; uint32 pos = (uint32)SvUV(ST(1)); uint8 val = (uint8)SvUV(ST(2)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetByte(pos, val); } XSRETURN_EMPTY; @@ -302,16 +243,7 @@ XS(XS_PerlPacket_SetShort) PerlPacket * THIS; uint32 pos = (uint32)SvUV(ST(1)); uint16 val = (uint16)SvUV(ST(2)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetShort(pos, val); } XSRETURN_EMPTY; @@ -327,16 +259,7 @@ XS(XS_PerlPacket_SetLong) PerlPacket * THIS; uint32 pos = (uint32)SvUV(ST(1)); uint32 val = (uint32)SvUV(ST(2)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetLong(pos, val); } XSRETURN_EMPTY; @@ -352,16 +275,7 @@ XS(XS_PerlPacket_SetFloat) PerlPacket * THIS; uint32 pos = (uint32)SvUV(ST(1)); float val = (float)SvNV(ST(2)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetFloat(pos, val); } XSRETURN_EMPTY; @@ -377,16 +291,7 @@ XS(XS_PerlPacket_SetString) PerlPacket * THIS; uint32 pos = (uint32)SvUV(ST(1)); char * str = (char *)SvPV_nolen(ST(2)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetString(pos, str); } XSRETURN_EMPTY; @@ -403,16 +308,7 @@ XS(XS_PerlPacket_SetEQ1319) uint32 pos = (uint32)SvUV(ST(1)); float part13 = (float)SvNV(ST(2)); float part19 = (float)SvNV(ST(3)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetEQ1319(pos, part13, part19); } XSRETURN_EMPTY; @@ -429,16 +325,7 @@ XS(XS_PerlPacket_SetEQ1913) uint32 pos = (uint32)SvUV(ST(1)); float part19 = (float)SvNV(ST(2)); float part13 = (float)SvNV(ST(3)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; THIS->SetEQ1913(pos, part19, part13); } XSRETURN_EMPTY; @@ -455,16 +342,7 @@ XS(XS_PerlPacket_GetByte) uint8 RETVAL; dXSTARG; uint32 pos = (uint32)SvUV(ST(1)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; RETVAL = THIS->GetByte(pos); XSprePUSH; PUSHu((UV)RETVAL); } @@ -482,16 +360,7 @@ XS(XS_PerlPacket_GetShort) uint16 RETVAL; dXSTARG; uint32 pos = (uint32)SvUV(ST(1)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; RETVAL = THIS->GetShort(pos); XSprePUSH; PUSHu((UV)RETVAL); } @@ -509,16 +378,7 @@ XS(XS_PerlPacket_GetLong) uint32 RETVAL; dXSTARG; uint32 pos = (uint32)SvUV(ST(1)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; RETVAL = THIS->GetLong(pos); XSprePUSH; PUSHu((UV)RETVAL); } @@ -536,16 +396,7 @@ XS(XS_PerlPacket_GetFloat) float RETVAL; dXSTARG; uint32 pos = (uint32)SvUV(ST(1)); - - if (sv_derived_from(ST(0), "PerlPacket")) { - IV tmp = SvIV((SV*)SvRV(ST(0))); - THIS = INT2PTR(PerlPacket *,tmp); - } - else - Perl_croak(aTHX_ "THIS is not of type PerlPacket"); - if(THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_PACKET; RETVAL = THIS->GetFloat(pos); XSprePUSH; PUSHn((double)RETVAL); } diff --git a/zone/perl_player_corpse.cpp b/zone/perl_player_corpse.cpp index 69be0f48c..8979d2102 100644 --- a/zone/perl_player_corpse.cpp +++ b/zone/perl_player_corpse.cpp @@ -42,25 +42,29 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_CORPSE \ + do { \ + if (sv_derived_from(ST(0), "Corpse")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Corpse*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Corpse"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); XS(XS_Corpse_GetCharID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetCharID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetCharID(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetCharID(THIS)"); // @categories Account and Character, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetCharID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -72,20 +76,12 @@ XS(XS_Corpse_GetDecayTime); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetDecayTime) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetDecayTime(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetDecayTime(THIS)"); // @categories Script Utility, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetDecayTime(); XSprePUSH; PUSHu((UV) RETVAL); @@ -97,18 +93,10 @@ XS(XS_Corpse_Lock); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_Lock) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::Lock(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::Lock(THIS)"); // @categories Corpse { Corpse *THIS; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->Lock(); } XSRETURN_EMPTY; @@ -118,18 +106,10 @@ XS(XS_Corpse_UnLock); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_UnLock) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::UnLock(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::UnLock(THIS)"); // @categories Corpse { Corpse *THIS; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->UnLock(); } XSRETURN_EMPTY; @@ -139,19 +119,11 @@ XS(XS_Corpse_IsLocked); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_IsLocked) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::IsLocked(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::IsLocked(THIS)"); // @categories Corpse { Corpse *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->IsLocked(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -163,18 +135,10 @@ XS(XS_Corpse_ResetLooter); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_ResetLooter) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::ResetLooter(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::ResetLooter(THIS)"); // @categories Corpse { Corpse *THIS; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->ResetLooter(); } XSRETURN_EMPTY; @@ -184,20 +148,12 @@ XS(XS_Corpse_GetDBID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetDBID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetDBID(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetDBID(THIS)"); // @categories Script Utility, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetCorpseDBID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -209,20 +165,12 @@ XS(XS_Corpse_GetOwnerName); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetOwnerName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetOwnerName(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetOwnerName(THIS)"); // @categories Account and Character, Corpse { Corpse *THIS; char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetOwnerName(); sv_setpv(TARG, RETVAL); XSprePUSH; @@ -235,19 +183,11 @@ XS(XS_Corpse_SetDecayTimer); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_SetDecayTimer) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Corpse::SetDecayTimer(THIS, uint32 decay_time)"); + Perl_croak(aTHX_ "Usage: Corpse::SetDecayTimer(THIS, uint32 decay_time)"); // @categories Corpse { Corpse *THIS; uint32 decaytime = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->SetDecayTimer(decaytime); } XSRETURN_EMPTY; @@ -257,19 +197,11 @@ XS(XS_Corpse_IsEmpty); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_IsEmpty) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::IsEmpty(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::IsEmpty(THIS)"); // @categories Inventory and Items, Corpse { Corpse *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->IsEmpty(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -281,21 +213,13 @@ XS(XS_Corpse_AddItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_AddItem) { dXSARGS; if (items < 3 || items > 4) - Perl_croak(aTHX_ "Usage: Corpse::AddItem(THIS, uint32 item_id, uint16 charges, [unt16 slot = 0])"); + Perl_croak(aTHX_ "Usage: Corpse::AddItem(THIS, uint32 item_id, uint16 charges, [unt16 slot = 0])"); // @categories Inventory and Items, Corpse { Corpse *THIS; uint32 itemnum = (uint32) SvUV(ST(1)); uint16 charges = (uint16) SvUV(ST(2)); int16 slot; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; if (items < 4) slot = 0; else { @@ -311,21 +235,13 @@ XS(XS_Corpse_GetWornItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetWornItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Corpse::GetWornItem(THIS, equipSlot)"); + Perl_croak(aTHX_ "Usage: Corpse::GetWornItem(THIS, equipSlot)"); // @categories Inventory and Items, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; int16 equipSlot = (int16) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetWornItem(equipSlot); XSprePUSH; PUSHu((UV) RETVAL); @@ -337,19 +253,11 @@ XS(XS_Corpse_RemoveItem); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_RemoveItem) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Corpse::RemoveItem(THIS, uint16 loot_slot)"); + Perl_croak(aTHX_ "Usage: Corpse::RemoveItem(THIS, uint16 loot_slot)"); // @categories Inventory and Items, Corpse { Corpse *THIS; uint16 lootslot = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->RemoveItem(lootslot); } XSRETURN_EMPTY; @@ -359,22 +267,14 @@ XS(XS_Corpse_SetCash); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_SetCash) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: Corpse::SetCash(THIS, uint16 copper, uint16 silver, uint16 gold, uint16 platinum)"); + Perl_croak(aTHX_ "Usage: Corpse::SetCash(THIS, uint16 copper, uint16 silver, uint16 gold, uint16 platinum)"); // @categories Currency and Points, Corpse { Corpse *THIS; uint16 in_copper = (uint16) SvUV(ST(1)); uint16 in_silver = (uint16) SvUV(ST(2)); uint16 in_gold = (uint16) SvUV(ST(3)); uint16 in_platinum = (uint16) SvUV(ST(4)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->SetCash(in_copper, in_silver, in_gold, in_platinum); } XSRETURN_EMPTY; @@ -384,18 +284,10 @@ XS(XS_Corpse_RemoveCash); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_RemoveCash) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::RemoveCash(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::RemoveCash(THIS)"); // @categories Currency and Points, Corpse { Corpse *THIS; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->RemoveCash(); } XSRETURN_EMPTY; @@ -405,20 +297,12 @@ XS(XS_Corpse_CountItems); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_CountItems) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::CountItems(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::CountItems(THIS)"); // @categories Inventory and Items, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->CountItems(); XSprePUSH; PUSHu((UV) RETVAL); @@ -430,18 +314,10 @@ XS(XS_Corpse_Delete); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_Delete) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::Delete(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::Delete(THIS)"); // @categories Corpse { Corpse *THIS; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->Delete(); } XSRETURN_EMPTY; @@ -451,20 +327,12 @@ XS(XS_Corpse_GetCopper); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetCopper) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetCopper(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetCopper(THIS)"); // @categories Currency and Points, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetCopper(); XSprePUSH; PUSHu((UV) RETVAL); @@ -476,20 +344,12 @@ XS(XS_Corpse_GetSilver); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetSilver) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetSilver(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetSilver(THIS)"); // @categories Currency and Points, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetSilver(); XSprePUSH; PUSHu((UV) RETVAL); @@ -501,20 +361,12 @@ XS(XS_Corpse_GetGold); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetGold) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetGold(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetGold(THIS)"); // @categories Currency and Points, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetGold(); XSprePUSH; PUSHu((UV) RETVAL); @@ -526,20 +378,12 @@ XS(XS_Corpse_GetPlatinum); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_GetPlatinum) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::GetPlatinum(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::GetPlatinum(THIS)"); // @categories Currency and Points, Corpse { Corpse *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->GetPlatinum(); XSprePUSH; PUSHu((UV) RETVAL); @@ -551,20 +395,12 @@ XS(XS_Corpse_Summon); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_Summon) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Corpse::Summon(THIS, Client* client, bool is_spell)"); + Perl_croak(aTHX_ "Usage: Corpse::Summon(THIS, Client* client, bool is_spell)"); // @categories Corpse { Corpse *THIS; Client *client; bool spell = (bool) SvTRUE(ST(2)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; if (sv_derived_from(ST(1), "Client")) { IV tmp = SvIV((SV *) SvRV(ST(1))); client = INT2PTR(Client *, tmp); @@ -582,20 +418,12 @@ XS(XS_Corpse_CastRezz); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_CastRezz) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Corpse::CastRezz(THIS, uint16 spell_id, [Mob* caster = nullptr])"); + Perl_croak(aTHX_ "Usage: Corpse::CastRezz(THIS, uint16 spell_id, [Mob* caster = nullptr])"); // @categories Spells and Disciplines, Corpse { Corpse *THIS; uint16 spellid = (uint16) SvUV(ST(1)); Mob *Caster; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; if (sv_derived_from(ST(2), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(2))); Caster = INT2PTR(Mob *, tmp); @@ -613,18 +441,10 @@ XS(XS_Corpse_CompleteRezz); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_CompleteRezz) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::CompleteRezz(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::CompleteRezz(THIS)"); // @categories Spells and Disciplines, Corpse { Corpse *THIS; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; THIS->CompleteResurrection(); } XSRETURN_EMPTY; @@ -634,20 +454,12 @@ XS(XS_Corpse_CanMobLoot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_CanMobLoot) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Corpse::CanMobLoot(THIS, int character_id)"); + Perl_croak(aTHX_ "Usage: Corpse::CanMobLoot(THIS, int character_id)"); // @categories Script Utility, Corpse { Corpse *THIS; bool RETVAL; int charid = (int) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->CanPlayerLoot(charid); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -659,20 +471,12 @@ XS(XS_Corpse_AllowMobLoot); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_AllowMobLoot) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Corpse::AllowMobLoot(THIS, Mob* them, uint8 slot)"); + Perl_croak(aTHX_ "Usage: Corpse::AllowMobLoot(THIS, Mob* them, uint8 slot)"); // @categories Account and Character, Corpse { Corpse *THIS; Mob *them; uint8 slot = (uint8) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); them = INT2PTR(Mob *, tmp); @@ -690,19 +494,11 @@ XS(XS_Corpse_AddLooter); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_AddLooter) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Corpse::AddLooter(THIS, Mob* who)"); + Perl_croak(aTHX_ "Usage: Corpse::AddLooter(THIS, Mob* who)"); // @categories Account and Character, Corpse { Corpse *THIS; Mob *who; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); who = INT2PTR(Mob *, tmp); @@ -720,19 +516,11 @@ XS(XS_Corpse_IsRezzed); /* prototype to pass -Wmissing-prototypes */ XS(XS_Corpse_IsRezzed) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Corpse::IsRezzed(THIS)"); + Perl_croak(aTHX_ "Usage: Corpse::IsRezzed(THIS)"); // @categories Corpse { Corpse *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "Corpse")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Corpse *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Corpse"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_CORPSE; RETVAL = THIS->IsRezzed(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); diff --git a/zone/perl_questitem.cpp b/zone/perl_questitem.cpp index 6d728e65e..e1029b33a 100644 --- a/zone/perl_questitem.cpp +++ b/zone/perl_questitem.cpp @@ -34,24 +34,29 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_ITEM \ + do { \ + if (sv_derived_from(ST(0), "QuestItem")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(EQ::ItemInstance*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type EQ::ItemInstance"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); + XS(XS_QuestItem_GetName); XS(XS_QuestItem_GetName) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: QuestItem::GetName(THIS)"); + Perl_croak(aTHX_ "Usage: QuestItem::GetName(THIS)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; Const_char *RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetItem()->Name; sv_setpv(TARG, RETVAL); XSprePUSH; @@ -64,19 +69,11 @@ XS(XS_QuestItem_SetScale); XS(XS_QuestItem_SetScale) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: QuestItem::SetScale(THIS, float scale_multiplier)"); + Perl_croak(aTHX_ "Usage: QuestItem::SetScale(THIS, float scale_multiplier)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; float Mult; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; Mult = (float) SvNV(ST(1)); if (THIS->IsScaling()) { @@ -90,20 +87,12 @@ XS(XS_QuestItem_ItemSay); XS(XS_QuestItem_ItemSay) { dXSARGS; if (items != 2 && items != 3) - Perl_croak(aTHX_ "Usage: QuestItem::ItemSay(THIS, string text [int language_id])"); + Perl_croak(aTHX_ "Usage: QuestItem::ItemSay(THIS, string text [int language_id])"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; Const_char *text; int lang = 0; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; text = SvPV_nolen(ST(1)); if (items == 3) lang = (int) SvUV(ST(2)); @@ -117,21 +106,13 @@ XS(XS_QuestItem_IsType); /* prototype to pass -Wmissing-prototypes */ XS(XS_QuestItem_IsType) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: QuestItem::IsType(THIS, type)"); + Perl_croak(aTHX_ "Usage: QuestItem::IsType(THIS, type)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; bool RETVAL; uint32 type = (int32) SvIV(ST(1)); - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - RETVAL = THIS->IsType((EQEmu::item::ItemClass) type); + VALIDATE_THIS_IS_ITEM; + RETVAL = THIS->IsType((EQ::item::ItemClass) type); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); } @@ -142,19 +123,11 @@ XS(XS_QuestItem_IsAttuned); /* prototype to pass -Wmissing-prototypes */ XS(XS_QuestItem_IsAttuned) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: QuestItem::IsAttuned(THIS)"); + Perl_croak(aTHX_ "Usage: QuestItem::IsAttuned(THIS)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; bool RETVAL; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->IsAttuned(); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -166,20 +139,12 @@ XS(XS_QuestItem_GetCharges); /* prototype to pass -Wmissing-prototypes */ XS(XS_QuestItem_GetCharges) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: QuestItem::GetCharges(THIS)"); + Perl_croak(aTHX_ "Usage: QuestItem::GetCharges(THIS)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; int16 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetCharges(); XSprePUSH; PUSHi((IV) RETVAL); @@ -191,20 +156,12 @@ XS(XS_QuestItem_GetAugment); /* prototype to pass -Wmissing-prototypes */ XS(XS_QuestItem_GetAugment) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: QuestItem::GetAugment(THIS, int16 slot_id)"); + Perl_croak(aTHX_ "Usage: QuestItem::GetAugment(THIS, int16 slot_id)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; int16 slot_id = (int16) SvIV(ST(1)); - EQEmu::ItemInstance *RETVAL; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + EQ::ItemInstance *RETVAL; + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetAugment(slot_id); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "QuestItem", (void *) RETVAL); @@ -216,20 +173,12 @@ XS(XS_QuestItem_GetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_QuestItem_GetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: QuestItem::GetID(THIS)"); + Perl_croak(aTHX_ "Usage: QuestItem::GetID(THIS)"); // @categories Inventory and Items { - EQEmu::ItemInstance *THIS; + EQ::ItemInstance *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "QuestItem")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(EQEmu::ItemInstance *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type EQEmu::ItemInstance"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_ITEM; RETVAL = THIS->GetItem()->ID; XSprePUSH; PUSHi((IV) RETVAL); diff --git a/zone/perl_raids.cpp b/zone/perl_raids.cpp index 670d445e5..452741be6 100644 --- a/zone/perl_raids.cpp +++ b/zone/perl_raids.cpp @@ -43,25 +43,29 @@ #undef THIS #endif +#define VALIDATE_THIS_IS_RAID \ + do { \ + if (sv_derived_from(ST(0), "Raid")) { \ + IV tmp = SvIV((SV*)SvRV(ST(0))); \ + THIS = INT2PTR(Raid*, tmp); \ + } else { \ + Perl_croak(aTHX_ "THIS is not of type Raid"); \ + } \ + if (THIS == nullptr) { \ + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); \ + } \ + } while (0); XS(XS_Raid_IsRaidMember); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_IsRaidMember) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::IsRaidMember(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Raid::IsRaidMember(THIS, string name)"); // @categories Raid { Raid *THIS; bool RETVAL; const char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->IsRaidMember(name); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -73,21 +77,13 @@ XS(XS_Raid_CastGroupSpell); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_CastGroupSpell) { dXSARGS; if (items != 4) - Perl_croak(aTHX_ "Usage: Raid::CastGroupSpell(THIS, Mob* caster, uint16 spell_id, uint32 group_id)"); + Perl_croak(aTHX_ "Usage: Raid::CastGroupSpell(THIS, Mob* caster, uint16 spell_id, uint32 group_id)"); // @categories Group, Raid { Raid *THIS; Mob *caster; uint16 spellid = (uint16) SvUV(ST(2)); uint32 gid = (uint32) SvUV(ST(3)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); caster = INT2PTR(Mob *, tmp); @@ -105,21 +101,13 @@ XS(XS_Raid_GroupCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GroupCount) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::GroupCount(THIS, uint32 group_id)"); + Perl_croak(aTHX_ "Usage: Raid::GroupCount(THIS, uint32 group_id)"); // @categories Group, Raid { Raid *THIS; uint8 RETVAL; dXSTARG; uint32 gid = (uint32) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->GroupCount(gid); XSprePUSH; PUSHu((UV) RETVAL); @@ -131,20 +119,12 @@ XS(XS_Raid_RaidCount); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_RaidCount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Raid::RaidCount(THIS)"); + Perl_croak(aTHX_ "Usage: Raid::RaidCount(THIS)"); // @categories Raid { Raid *THIS; uint8 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->RaidCount(); XSprePUSH; PUSHu((UV) RETVAL); @@ -156,21 +136,13 @@ XS(XS_Raid_GetGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GetGroup) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::GetGroup(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Raid::GetGroup(THIS, string name)"); // @categories Group, Raid { Raid *THIS; uint32 RETVAL; dXSTARG; const char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->GetGroup(name); XSprePUSH; PUSHu((UV) RETVAL); @@ -182,20 +154,12 @@ XS(XS_Raid_SplitExp); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_SplitExp) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Raid::SplitExp(THIS, uint32 experience, [Mob* other = nullptr])"); + Perl_croak(aTHX_ "Usage: Raid::SplitExp(THIS, uint32 experience, [Mob* other = nullptr])"); // @categories Experience and Level, Raid { Raid *THIS; uint32 exp = (uint32) SvUV(ST(1)); Mob *other; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; if (sv_derived_from(ST(2), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(2))); other = INT2PTR(Mob *, tmp); @@ -213,21 +177,13 @@ XS(XS_Raid_GetTotalRaidDamage); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GetTotalRaidDamage) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::GetTotalRaidDamage(THIS, [Mob* other = nullptr])"); + Perl_croak(aTHX_ "Usage: Raid::GetTotalRaidDamage(THIS, [Mob* other = nullptr])"); // @categories Raid { Raid *THIS; uint32 RETVAL; dXSTARG; Mob *other; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); other = INT2PTR(Mob *, tmp); @@ -247,7 +203,7 @@ XS(XS_Raid_SplitMoney); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_SplitMoney) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: Raid::SplitMoney(THIS, uint32 gid, uint32 copper, uint32 silver, uint32 gold, uint32 platinum)"); + Perl_croak(aTHX_ "Usage: Raid::SplitMoney(THIS, uint32 gid, uint32 copper, uint32 silver, uint32 gold, uint32 platinum)"); // @categories Currency and Points, Raid { Raid *THIS; uint32 gid = (uint32) SvUV(ST(1)); @@ -255,15 +211,7 @@ XS(XS_Raid_SplitMoney) { uint32 silver = (uint32) SvUV(ST(3)); uint32 gold = (uint32) SvUV(ST(4)); uint32 platinum = (uint32) SvUV(ST(5)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; THIS->SplitMoney(gid, copper, silver, gold, platinum); } XSRETURN_EMPTY; @@ -273,20 +221,12 @@ XS(XS_Raid_BalanceHP); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_BalanceHP) { dXSARGS; if (items != 3) - Perl_croak(aTHX_ "Usage: Raid::BalanceHP(THIS, int32 penalty, uint32 group_id)"); + Perl_croak(aTHX_ "Usage: Raid::BalanceHP(THIS, int32 penalty, uint32 group_id)"); // @categories Raid { Raid *THIS; int32 penalty = (int32) SvUV(ST(1)); uint32 gid = (uint32) SvUV(ST(2)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; THIS->BalanceHP(penalty, gid); } XSRETURN_EMPTY; @@ -296,20 +236,12 @@ XS(XS_Raid_IsLeader); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_IsLeader) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::IsLeader(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Raid::IsLeader(THIS, string name)"); // @categories Raid { Raid *THIS; bool RETVAL; const char *name = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->IsLeader(name); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -321,20 +253,12 @@ XS(XS_Raid_IsGroupLeader); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_IsGroupLeader) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::IsGroupLeader(THIS, string name)"); + Perl_croak(aTHX_ "Usage: Raid::IsGroupLeader(THIS, string name)"); // @categories Group, Raid { Raid *THIS; bool RETVAL; const char *who = (char *) SvPV_nolen(ST(1)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->IsGroupLeader(who); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -346,20 +270,12 @@ XS(XS_Raid_GetHighestLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GetHighestLevel) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Raid::GetHighestLevel(THIS)"); + Perl_croak(aTHX_ "Usage: Raid::GetHighestLevel(THIS)"); // @categories Raid { Raid *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->GetHighestLevel(); XSprePUSH; PUSHu((UV) RETVAL); @@ -371,20 +287,12 @@ XS(XS_Raid_GetLowestLevel); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GetLowestLevel) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Raid::GetLowestLevel(THIS)"); + Perl_croak(aTHX_ "Usage: Raid::GetLowestLevel(THIS)"); // @categories Raid { Raid *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->GetLowestLevel(); XSprePUSH; PUSHu((UV) RETVAL); @@ -396,20 +304,12 @@ XS(XS_Raid_GetClientByIndex); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GetClientByIndex) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::GetClientByIndex(THIS, uint16 raid_indez)"); + Perl_croak(aTHX_ "Usage: Raid::GetClientByIndex(THIS, uint16 raid_indez)"); // @categories Raid { Raid *THIS; Client *RETVAL; uint16 index = (uint16) SvUV(ST(1)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->GetClientByIndex(index); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Client", (void *) RETVAL); @@ -421,7 +321,7 @@ XS(XS_Raid_TeleportGroup); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_TeleportGroup) { dXSARGS; if (items != 8) - Perl_croak(aTHX_ "Usage: Raid::TeleportGroup(THIS, Mob* sender, uint32 zone_id, float x, float y, float z, float heading, uint32 group_id)"); + Perl_croak(aTHX_ "Usage: Raid::TeleportGroup(THIS, Mob* sender, uint32 zone_id, float x, float y, float z, float heading, uint32 group_id)"); // @categories Group, Raid { Raid *THIS; Mob *sender; @@ -431,15 +331,7 @@ XS(XS_Raid_TeleportGroup) { float z = (float) SvNV(ST(5)); float heading = (float) SvNV(ST(6)); uint32 gid = (uint32) SvUV(ST(7)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); sender = INT2PTR(Mob *, tmp); @@ -457,7 +349,7 @@ XS(XS_Raid_TeleportRaid); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_TeleportRaid) { dXSARGS; if (items != 7) - Perl_croak(aTHX_ "Usage: Raid::TeleportRaid(THIS, Mob* sender, uint32 zone_id, float x, float y, float z, float heading)"); + Perl_croak(aTHX_ "Usage: Raid::TeleportRaid(THIS, Mob* sender, uint32 zone_id, float x, float y, float z, float heading)"); // @categories Raid { Raid *THIS; Mob *sender; @@ -466,15 +358,7 @@ XS(XS_Raid_TeleportRaid) { float y = (float) SvNV(ST(4)); float z = (float) SvNV(ST(5)); float heading = (float) SvNV(ST(6)); - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; if (sv_derived_from(ST(1), "Mob")) { IV tmp = SvIV((SV *) SvRV(ST(1))); sender = INT2PTR(Mob *, tmp); @@ -492,20 +376,12 @@ XS(XS_Raid_GetID); /* prototype to pass -Wmissing-prototypes */ XS(XS_Raid_GetID) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: Raid::GetID(THIS)"); + Perl_croak(aTHX_ "Usage: Raid::GetID(THIS)"); // @categories Raid { Raid *THIS; uint32 RETVAL; dXSTARG; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; RETVAL = THIS->GetID(); XSprePUSH; PUSHu((UV) RETVAL); @@ -517,20 +393,12 @@ XS(XS_Raid_GetMember); XS(XS_Raid_GetMember) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Raid::GetMember(THIS, int raid_index)"); + Perl_croak(aTHX_ "Usage: Raid::GetMember(THIS, int raid_index)"); // @categories Raid { Raid *THIS; Client *RETVAL = nullptr; dXSTARG; - - if (sv_derived_from(ST(0), "Raid")) { - IV tmp = SvIV((SV *) SvRV(ST(0))); - THIS = INT2PTR(Raid *, tmp); - } else - Perl_croak(aTHX_ "THIS is not of type Raid"); - if (THIS == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - + VALIDATE_THIS_IS_RAID; int index = (int) SvUV(ST(1)); if (index < 0 || index > 71) RETVAL = nullptr; @@ -545,6 +413,24 @@ XS(XS_Raid_GetMember) { XSRETURN(1); } +XS(XS_Raid_DoesAnyMemberHaveExpeditionLockout); +XS(XS_Raid_DoesAnyMemberHaveExpeditionLockout) { + dXSARGS; + if (items != 3 && items != 4) { + Perl_croak(aTHX_ "Usage: Raid::DoesAnyMemberHaveExpeditionLockout(THIS, string expedition_name, string event_name, [int max_check_count = 0])"); + } + + Raid* THIS = nullptr; + VALIDATE_THIS_IS_RAID; + std::string expedition_name(SvPV_nolen(ST(1))); + std::string event_name(SvPV_nolen(ST(2))); + int max_check_count = (items == 4) ? static_cast(SvIV(ST(3))) : 0; + + bool result = THIS->DoesAnyMemberHaveExpeditionLockout(expedition_name, event_name, max_check_count); + ST(0) = boolSV(result); + XSRETURN(1); +} + #ifdef __cplusplus extern "C" #endif @@ -581,6 +467,7 @@ XS(boot_Raid) { newXSproto(strcpy(buf, "TeleportRaid"), XS_Raid_TeleportRaid, file, "$$$$$$$"); newXSproto(strcpy(buf, "GetID"), XS_Raid_GetID, file, "$"); newXSproto(strcpy(buf, "GetMember"), XS_Raid_GetMember, file, "$$"); + newXSproto(strcpy(buf, "DoesAnyMemberHaveExpeditionLockout"), XS_Raid_DoesAnyMemberHaveExpeditionLockout, file, "$$$;$"); XSRETURN_YES; } diff --git a/zone/petitions.h b/zone/petitions.h index 057169d45..4a6e9d2ff 100644 --- a/zone/petitions.h +++ b/zone/petitions.h @@ -25,6 +25,7 @@ #include "client.h" #include "zonedb.h" +#include "zone_store.h" class Client; diff --git a/zone/pets.cpp b/zone/pets.cpp index 6a5ae12ca..e88f0f246 100644 --- a/zone/pets.cpp +++ b/zone/pets.cpp @@ -27,6 +27,7 @@ #include "pets.h" #include "zonedb.h" +#include "zone_store.h" #include @@ -230,7 +231,7 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, memcpy(npc_type, base, sizeof(NPCType)); // If pet power is set to -1 in the DB, use stat scaling - if ((this->IsClient() + if ((this->IsClient() #ifdef BOTS || this->IsBot() #endif @@ -385,15 +386,15 @@ void Mob::MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, // the base items for the pet. These are always loaded // so that a rank 1 suspend minion does not kill things // like the special back items some focused pets may receive. - uint32 petinv[EQEmu::invslot::EQUIPMENT_COUNT]; + uint32 petinv[EQ::invslot::EQUIPMENT_COUNT]; memset(petinv, 0, sizeof(petinv)); - const EQEmu::ItemData *item = nullptr; + const EQ::ItemData *item = nullptr; if (content_db.GetBasePetItems(record.equipmentset, petinv)) { - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; i++) + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; i++) if (petinv[i]) { item = database.GetItem(petinv[i]); - npc->AddLootDrop(item, &npc->itemlist, 0, 1, 127, true, true); + npc->AddLootDrop(item, &npc->itemlist, NPC::NewLootDropEntry(), true); } } @@ -432,7 +433,21 @@ Pet::Pet(NPCType *type_data, Mob *owner, PetType type, uint16 spell_id, int16 po petpower = power; SetOwnerID(owner->GetID()); SetPetSpellID(spell_id); - taunting = true; + + // All pets start at false on newer clients. The client + // turns it on and tracks the state. + taunting=false; + + // Older clients didn't track state, and default taunting is on (per @mackal) + // Familiar and animation pets don't get taunt until an AA. + if (owner && owner->IsClient()) { + if (!(owner->CastToClient()->ClientVersionBit() & EQ::versions::maskUFAndLater)) { + if ((typeofpet != petFamiliar && typeofpet != petAnimation) || + aabonuses.PetCommands[PET_TAUNT]) { + taunting=true; + } + } + } // Class should use npc constructor to set light properties } @@ -524,10 +539,10 @@ void NPC::GetPetState(SpellBuff_Struct *pet_buffs, uint32 *items, char *name) { strn0cpy(name, GetName(), 64); //save their items, we only care about what they are actually wearing - memcpy(items, equipment, sizeof(uint32) * EQEmu::invslot::EQUIPMENT_COUNT); + memcpy(items, equipment, sizeof(uint32) * EQ::invslot::EQUIPMENT_COUNT); //save their buffs. - for (int i=EQEmu::invslot::EQUIPMENT_BEGIN; i < GetPetMaxTotalSlots(); i++) { + for (int i=EQ::invslot::EQUIPMENT_BEGIN; i < GetPetMaxTotalSlots(); i++) { if (buffs[i].spellid != SPELL_UNKNOWN) { pet_buffs[i].spellid = buffs[i].spellid; pet_buffs[i].effect_type = i+1; @@ -612,19 +627,19 @@ void NPC::SetPetState(SpellBuff_Struct *pet_buffs, uint32 *items) { } //restore their equipment... - for (i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; i++) { - if(items[i] == 0) + for (i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; i++) { + if (items[i] == 0) { continue; + } - const EQEmu::ItemData* item2 = database.GetItem(items[i]); + const EQ::ItemData *item2 = database.GetItem(items[i]); if (item2) { - bool noDrop=(item2->NoDrop == 0); // Field is reverse logic - bool petCanHaveNoDrop = (RuleB(Pets, CanTakeNoDrop) && - _CLIENTPET(this) && GetPetType() <= petOther); + bool noDrop = (item2->NoDrop == 0); // Field is reverse logic + bool petCanHaveNoDrop = (RuleB(Pets, CanTakeNoDrop) && _CLIENTPET(this) && GetPetType() <= petOther); if (!noDrop || petCanHaveNoDrop) { - AddLootDrop(item2, &itemlist, 0, 1, 255, true, true); + AddLootDrop(item2, &itemlist, NPC::NewLootDropEntry(), true); } } } @@ -679,7 +694,7 @@ bool ZoneDatabase::GetBasePetItems(int32 equipmentset, uint32 *items) { { slot = atoi(row[0]); - if (slot > EQEmu::invslot::EQUIPMENT_END) + if (slot > EQ::invslot::EQUIPMENT_END) continue; if (items[slot] == 0) diff --git a/zone/quest.cpp b/zone/quest.cpp deleted file mode 100644 index fb2d9f851..000000000 --- a/zone/quest.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* EQEMu: Everquest Server Emulator - Copyright (C) 2001-2002 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 -*/ -#include "../common/debug.h" -#include -#include -#include -#include - -// Disgrace: for windows compile -#ifdef WIN32 - #include - #define snprintf _snprintf -#else - #include "../common/unix.h" -#endif - -#include "quest.h" - -pquest_entry Quest::m_pQuests; -int Quest::m_nQuests; - -Quest::Quest() -{ - m_pQuests = NULL; - m_nQuests = 0; -} - -Quest::~Quest() -{ - for( int i=0;i *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual int EventGlobalNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual int EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual int EventGlobalPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } - virtual int EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } + virtual int EventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { return 0; } virtual int EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual int EventEncounter(QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual bool HasQuestSub(uint32 npcid, QuestEventID evt) { return false; } virtual bool HasGlobalQuestSub(QuestEventID evt) { return false; } virtual bool PlayerHasQuestSub(QuestEventID evt) { return false; } virtual bool GlobalPlayerHasQuestSub(QuestEventID evt) { return false; } virtual bool SpellHasQuestSub(uint32 spell_id, QuestEventID evt) { return false; } - virtual bool ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt) { return false; } + virtual bool ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt) { return false; } virtual bool EncounterHasQuestSub(std::string encounter_name, QuestEventID evt) { return false; } virtual void LoadNPCScript(std::string filename, int npc_id) { } virtual void LoadGlobalNPCScript(std::string filename) { } virtual void LoadPlayerScript(std::string filename) { } virtual void LoadGlobalPlayerScript(std::string filename) { } - virtual void LoadItemScript(std::string filename, EQEmu::ItemInstance *item) { } + virtual void LoadItemScript(std::string filename, EQ::ItemInstance *item) { } virtual void LoadSpellScript(std::string filename, uint32 spell_id) { } virtual void LoadEncounterScript(std::string filename, std::string encounter_name) { } virtual int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } - virtual int DispatchEventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } + virtual int DispatchEventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { return 0; } virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { return 0; } + std::vector *extra_pointers) { return 0; } virtual void AddVar(std::string name, std::string val) { } virtual std::string GetVar(std::string name) { return std::string(); } virtual void Init() { } virtual void ReloadQuests() { } virtual uint32 GetIdentifier() = 0; + virtual void RemoveEncounter(const std::string &name) { } //TODO: Set maximum quest errors instead of hard coding it virtual void GetErrors(std::list &err) { diff --git a/zone/quest_parser_collection.cpp b/zone/quest_parser_collection.cpp index 9815a5ebb..625425839 100644 --- a/zone/quest_parser_collection.cpp +++ b/zone/quest_parser_collection.cpp @@ -89,6 +89,14 @@ void QuestParserCollection::ReloadQuests(bool reset_timers) { } } +void QuestParserCollection::RemoveEncounter(const std::string name) { + auto iter = _load_precedence.begin(); + while(iter != _load_precedence.end()) { + (*iter)->RemoveEncounter(name); + ++iter; + } +} + bool QuestParserCollection::HasQuestSub(uint32 npcid, QuestEventID evt) { return HasQuestSubLocal(npcid, evt) || HasQuestSubGlobal(evt); } @@ -201,7 +209,7 @@ bool QuestParserCollection::SpellHasQuestSub(uint32 spell_id, QuestEventID evt) return false; } -bool QuestParserCollection::ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt) { +bool QuestParserCollection::ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt) { if (itm == nullptr) return false; @@ -238,7 +246,7 @@ bool QuestParserCollection::ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEvent } int QuestParserCollection::EventNPC(QuestEventID evt, NPC *npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int rd = DispatchEventNPC(evt, npc, init, data, extra_data, extra_pointers); int rl = EventNPCLocal(evt, npc, init, data, extra_data, extra_pointers); int rg = EventNPCGlobal(evt, npc, init, data, extra_data, extra_pointers); @@ -256,7 +264,7 @@ int QuestParserCollection::EventNPC(QuestEventID evt, NPC *npc, Mob *init, std:: } int QuestParserCollection::EventNPCLocal(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { auto iter = _npc_quest_status.find(npc->GetNPCTypeID()); if(iter != _npc_quest_status.end()) { //loaded or failed to load @@ -279,7 +287,7 @@ int QuestParserCollection::EventNPCLocal(QuestEventID evt, NPC* npc, Mob *init, } int QuestParserCollection::EventNPCGlobal(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(_global_npc_quest_status != QuestUnloaded && _global_npc_quest_status != QuestFailedToLoad) { auto qiter = _interfaces.find(_global_npc_quest_status); return qiter->second->EventGlobalNPC(evt, npc, init, data, extra_data, extra_pointers); @@ -299,7 +307,7 @@ int QuestParserCollection::EventNPCGlobal(QuestEventID evt, NPC* npc, Mob *init, } int QuestParserCollection::EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int rd = DispatchEventPlayer(evt, client, data, extra_data, extra_pointers); int rl = EventPlayerLocal(evt, client, data, extra_data, extra_pointers); int rg = EventPlayerGlobal(evt, client, data, extra_data, extra_pointers); @@ -317,7 +325,7 @@ int QuestParserCollection::EventPlayer(QuestEventID evt, Client *client, std::st } int QuestParserCollection::EventPlayerLocal(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(_player_quest_status == QuestUnloaded) { std::string filename; QuestInterface *qi = GetQIByPlayerQuest(filename); @@ -336,7 +344,7 @@ int QuestParserCollection::EventPlayerLocal(QuestEventID evt, Client *client, st } int QuestParserCollection::EventPlayerGlobal(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { if(_global_player_quest_status == QuestUnloaded) { std::string filename; QuestInterface *qi = GetQIByGlobalPlayerQuest(filename); @@ -354,8 +362,8 @@ int QuestParserCollection::EventPlayerGlobal(QuestEventID evt, Client *client, s return 0; } -int QuestParserCollection::EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers) { +int QuestParserCollection::EventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers) { // needs pointer validation check on 'item' argument std::string item_script; @@ -403,7 +411,7 @@ int QuestParserCollection::EventItem(QuestEventID evt, Client *client, EQEmu::It } int QuestParserCollection::EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { auto iter = _spell_quest_status.find(spell_id); if(iter != _spell_quest_status.end()) { //loaded or failed to load @@ -440,7 +448,7 @@ int QuestParserCollection::EventSpell(QuestEventID evt, NPC* npc, Client *client } int QuestParserCollection::EventEncounter(QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { auto iter = _encounter_quest_status.find(encounter_name); if(iter != _encounter_quest_status.end()) { //loaded or failed to load @@ -993,7 +1001,7 @@ void QuestParserCollection::GetErrors(std::list &err) { } int QuestParserCollection::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { @@ -1007,7 +1015,7 @@ int QuestParserCollection::DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *ini } int QuestParserCollection::DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { @@ -1020,8 +1028,8 @@ int QuestParserCollection::DispatchEventPlayer(QuestEventID evt, Client *client, return ret; } -int QuestParserCollection::DispatchEventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, - uint32 extra_data, std::vector *extra_pointers) { +int QuestParserCollection::DispatchEventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, + uint32 extra_data, std::vector *extra_pointers) { int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { @@ -1035,7 +1043,7 @@ int QuestParserCollection::DispatchEventItem(QuestEventID evt, Client *client, E } int QuestParserCollection::DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers) { + std::vector *extra_pointers) { int ret = 0; auto iter = _load_precedence.begin(); while(iter != _load_precedence.end()) { diff --git a/zone/quest_parser_collection.h b/zone/quest_parser_collection.h index 196cfffc2..082b5b6f4 100644 --- a/zone/quest_parser_collection.h +++ b/zone/quest_parser_collection.h @@ -48,7 +48,7 @@ class Mob; class NPC; class QuestInterface; -namespace EQEmu +namespace EQ { class Any; class ItemInstance; @@ -65,22 +65,23 @@ public: void AddVar(std::string name, std::string val); void Init(); void ReloadQuests(bool reset_timers = true); + void RemoveEncounter(const std::string name); bool HasQuestSub(uint32 npcid, QuestEventID evt); bool PlayerHasQuestSub(QuestEventID evt); bool SpellHasQuestSub(uint32 spell_id, QuestEventID evt); - bool ItemHasQuestSub(EQEmu::ItemInstance *itm, QuestEventID evt); + bool ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt); int EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers = nullptr); + std::vector *extra_pointers = nullptr); int EventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers = nullptr); - int EventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers = nullptr); + std::vector *extra_pointers = nullptr); + int EventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers = nullptr); int EventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers = nullptr); + std::vector *extra_pointers = nullptr); int EventEncounter(QuestEventID evt, std::string encounter_name, std::string data, uint32 extra_data, - std::vector *extra_pointers = nullptr); + std::vector *extra_pointers = nullptr); void GetErrors(std::list &err); @@ -111,10 +112,10 @@ private: bool PlayerHasQuestSubLocal(QuestEventID evt); bool PlayerHasQuestSubGlobal(QuestEventID evt); - int EventNPCLocal(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers); - int EventNPCGlobal(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers); - int EventPlayerLocal(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers); - int EventPlayerGlobal(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers); + int EventNPCLocal(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers); + int EventNPCGlobal(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, std::vector *extra_pointers); + int EventPlayerLocal(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers); + int EventPlayerGlobal(QuestEventID evt, Client *client, std::string data, uint32 extra_data, std::vector *extra_pointers); QuestInterface *GetQIByNPCQuest(uint32 npcid, std::string &filename); QuestInterface *GetQIByGlobalNPCQuest(std::string &filename); @@ -125,13 +126,13 @@ private: QuestInterface *GetQIByEncounterQuest(std::string encounter_name, std::string &filename); int DispatchEventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); int DispatchEventPlayer(QuestEventID evt, Client *client, std::string data, uint32 extra_data, - std::vector *extra_pointers); - int DispatchEventItem(QuestEventID evt, Client *client, EQEmu::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); + int DispatchEventItem(QuestEventID evt, Client *client, EQ::ItemInstance *item, Mob *mob, std::string data, uint32 extra_data, + std::vector *extra_pointers); int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, - std::vector *extra_pointers); + std::vector *extra_pointers); std::map _interfaces; std::map _extensions; diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 853623e3b..561f3eb3a 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -35,6 +35,7 @@ #include "worldserver.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" #include #include @@ -54,7 +55,7 @@ QuestManager quest_manager; #define QuestManagerCurrentQuestVars() \ Mob *owner = nullptr; \ Client *initiator = nullptr; \ - EQEmu::ItemInstance* questitem = nullptr; \ + EQ::ItemInstance* questitem = nullptr; \ bool depop_npc = false; \ std::string encounter; \ do { \ @@ -116,7 +117,7 @@ void QuestManager::Process() { } } -void QuestManager::StartQuest(Mob *_owner, Client *_initiator, EQEmu::ItemInstance* _questitem, std::string encounter) { +void QuestManager::StartQuest(Mob *_owner, Client *_initiator, EQ::ItemInstance* _questitem, std::string encounter) { running_quest run; run.owner = _owner; run.initiator = _initiator; @@ -370,14 +371,14 @@ void QuestManager::castspell(int spell_id, int target_id) { if (owner) { Mob *tgt = entity_list.GetMob(target_id); if(tgt != nullptr) - owner->SpellFinished(spell_id, tgt, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + owner->SpellFinished(spell_id, tgt, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } } void QuestManager::selfcast(int spell_id) { QuestManagerCurrentQuestVars(); if (initiator) - initiator->SpellFinished(spell_id, initiator, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + initiator->SpellFinished(spell_id, initiator, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } void QuestManager::addloot(int item_id, int charges, bool equipitem, int aug1, int aug2, int aug3, int aug4, int aug5, int aug6) { @@ -397,7 +398,7 @@ void QuestManager::Zone(const char *zone_name) { ztz->response = 0; ztz->current_zone_id = zone->GetZoneID(); ztz->current_instance_id = zone->GetInstanceID(); - ztz->requested_zone_id = content_db.GetZoneID(zone_name); + ztz->requested_zone_id = ZoneID(zone_name); ztz->admin = initiator->Admin(); strcpy(ztz->name, initiator->GetName()); ztz->guild_id = initiator->GuildID(); @@ -407,6 +408,84 @@ void QuestManager::Zone(const char *zone_name) { } } +void QuestManager::ZoneGroup(const char *zone_name) { + QuestManagerCurrentQuestVars(); + if (initiator && initiator->IsClient()) { + if (!initiator->GetGroup()) { + auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct)); + ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer; + ztz->response = 0; + ztz->current_zone_id = zone->GetZoneID(); + ztz->current_instance_id = zone->GetInstanceID(); + ztz->requested_zone_id = ZoneID(zone_name); + ztz->admin = initiator->Admin(); + strcpy(ztz->name, initiator->GetName()); + ztz->guild_id = initiator->GuildID(); + ztz->ignorerestrictions = 3; + worldserver.SendPacket(pack); + safe_delete(pack); + } else { + auto client_group = initiator->GetGroup(); + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct)); + ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer; + ztz->response = 0; + ztz->current_zone_id = zone->GetZoneID(); + ztz->current_instance_id = zone->GetInstanceID(); + ztz->requested_zone_id = ZoneID(zone_name); + ztz->admin = group_member->Admin(); + strcpy(ztz->name, group_member->GetName()); + ztz->guild_id = group_member->GuildID(); + ztz->ignorerestrictions = 3; + worldserver.SendPacket(pack); + safe_delete(pack); + } + } + } + } +} + +void QuestManager::ZoneRaid(const char *zone_name) { + QuestManagerCurrentQuestVars(); + if (initiator && initiator->IsClient()) { + if (!initiator->GetRaid()) { + auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct)); + ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer; + ztz->response = 0; + ztz->current_zone_id = zone->GetZoneID(); + ztz->current_instance_id = zone->GetInstanceID(); + ztz->requested_zone_id = ZoneID(zone_name); + ztz->admin = initiator->Admin(); + strcpy(ztz->name, initiator->GetName()); + ztz->guild_id = initiator->GuildID(); + ztz->ignorerestrictions = 3; + worldserver.SendPacket(pack); + safe_delete(pack); + } else { + auto client_raid = initiator->GetRaid(); + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct)); + ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer; + ztz->response = 0; + ztz->current_zone_id = zone->GetZoneID(); + ztz->current_instance_id = zone->GetInstanceID(); + ztz->requested_zone_id = ZoneID(zone_name); + ztz->admin = raid_member->Admin(); + strcpy(ztz->name, raid_member->GetName()); + ztz->guild_id = raid_member->GuildID(); + ztz->ignorerestrictions = 3; + worldserver.SendPacket(pack); + safe_delete(pack); + } + } + } + } +} + void QuestManager::settimer(const char *timer_name, int seconds) { QuestManagerCurrentQuestVars(); @@ -455,7 +534,7 @@ void QuestManager::settimerMS(const char *timer_name, int milliseconds) { QTimerList.push_back(QuestTimer(milliseconds, owner, timer_name)); } -void QuestManager::settimerMS(const char *timer_name, int milliseconds, EQEmu::ItemInstance *inst) { +void QuestManager::settimerMS(const char *timer_name, int milliseconds, EQ::ItemInstance *inst) { if (inst) { inst->SetTimer(timer_name, milliseconds); } @@ -498,7 +577,7 @@ void QuestManager::stoptimer(const char *timer_name) { } } -void QuestManager::stoptimer(const char *timer_name, EQEmu::ItemInstance *inst) { +void QuestManager::stoptimer(const char *timer_name, EQ::ItemInstance *inst) { if (inst) { inst->StopTimer(timer_name); } @@ -536,7 +615,7 @@ void QuestManager::stopalltimers() { } } -void QuestManager::stopalltimers(EQEmu::ItemInstance *inst) { +void QuestManager::stopalltimers(EQ::ItemInstance *inst) { if (inst) { inst->ClearTimers(); } @@ -639,9 +718,9 @@ void QuestManager::resumetimer(const char *timer_name) { bool QuestManager::ispausedtimer(const char *timer_name) { QuestManagerCurrentQuestVars(); - + std::list::iterator pcur = PTimerList.begin(), pend; - + pend = PTimerList.end(); while (pcur != pend) { @@ -778,6 +857,15 @@ void QuestManager::repopzone() { } } +void QuestManager::processmobswhilezoneempty(bool on) { + if(zone) { + zone->process_mobs_while_empty = on; + } + else { + LogQuests("QuestManager::processmobswhilezoneempty called with nullptr zone. Probably syntax error in quest file"); + } +} + void QuestManager::settarget(const char *type, int target_id) { QuestManagerCurrentQuestVars(); if (!owner || !owner->IsNPC()) @@ -847,12 +935,12 @@ void QuestManager::traindisc(int discipline_tome_item_id) { } bool QuestManager::isdisctome(int item_id) { - const EQEmu::ItemData *item = database.GetItem(item_id); + const EQ::ItemData *item = database.GetItem(item_id); if(item == nullptr) { return(false); } - if (!item->IsClassCommon() || item->ItemType != EQEmu::item::ItemTypeSpell) { + if (!item->IsClassCommon() || item->ItemType != EQ::item::ItemTypeSpell) { return(false); } @@ -906,6 +994,31 @@ bool QuestManager::isdisctome(int item_id) { return(true); } +std::string QuestManager::getracename(uint16 race_id) { + return GetRaceIDName(race_id); +} + +std::string QuestManager::getspellname(uint32 spell_id) { + if (!IsValidSpell(spell_id)) { + return "INVALID SPELL ID IN GETSPELLNAME"; + } + + std::string spell_name = GetSpellName(spell_id); + return spell_name; +} + +std::string QuestManager::getskillname(int skill_id) { + if (skill_id >= 0 && skill_id < EQ::skills::SkillCount) { + std::map Skills = EQ::skills::GetSkillTypeMap(); + for (auto skills_iter : Skills) { + if (skill_id == skills_iter.first) { + return skills_iter.second; + } + } + } + return std::string(); +} + void QuestManager::safemove() { QuestManagerCurrentQuestVars(); if (initiator && initiator->IsClient()) @@ -975,174 +1088,64 @@ void QuestManager::permagender(int gender_id) { uint16 QuestManager::scribespells(uint8 max_level, uint8 min_level) { QuestManagerCurrentQuestVars(); int book_slot = initiator->GetNextAvailableSpellBookSlot(); - int spell_id = 0; - int count = 0; - - uint32 char_id = initiator->CharacterID(); - bool SpellGlobalRule = RuleB(Spells, EnableSpellGlobals); - bool SpellBucketRule = RuleB(Spells, EnableSpellBuckets); - bool SpellGlobalCheckResult = false; - bool SpellBucketCheckResult = false; - - for ( ; spell_id < SPDAT_RECORDS && book_slot < EQEmu::spells::SPELLBOOK_SIZE; ++spell_id) { - if (book_slot == -1) { - initiator->Message( - 13, - "Unable to scribe spell %s (%i) to spellbook: no more spell book slots available.", - ((spell_id >= 0 && spell_id < SPDAT_RECORDS) ? spells[spell_id].name : "Out-of-range"), - spell_id - ); + std::vector spell_ids = initiator->GetScribeableSpells(min_level, max_level); + int spell_count = spell_ids.size(); + int spells_learned = 0; + if (spell_count > 0) { + for (auto spell_id : spell_ids) { + if (book_slot == -1) { + initiator->Message( + Chat::Red, + "Unable to scribe spell %s (%i) to Spell Book: Spell Book is Full.", spells[spell_id].name, spell_id + ); + break; + } - break; + if (initiator->HasSpellScribed(spell_id)) + continue; + + initiator->ScribeSpell(spell_id, book_slot); + book_slot = initiator->GetNextAvailableSpellBookSlot(book_slot); + spells_learned++; } - if (spell_id < 0 || spell_id >= SPDAT_RECORDS) { - initiator->Message(Chat::Red, "FATAL ERROR: Spell id out-of-range (id: %i, min: 0, max: %i)", spell_id, SPDAT_RECORDS); - return count; - } - if (book_slot < 0 || book_slot >= EQEmu::spells::SPELLBOOK_SIZE) { - initiator->Message(Chat::Red, "FATAL ERROR: Book slot out-of-range (slot: %i, min: 0, max: %i)", book_slot, EQEmu::spells::SPELLBOOK_SIZE); - return count; - } - - while (true) { - if (spells[spell_id].classes[WARRIOR] == 0) // check if spell exists - break; - if (spells[spell_id].classes[initiator->GetPP().class_ - 1] > max_level) // maximum level - break; - if (spells[spell_id].classes[initiator->GetPP().class_ - 1] < min_level) // minimum level - break; - if (spells[spell_id].skill == 52) - break; - if (spells[spell_id].effectid[EFFECT_COUNT - 1] == 10) - break; - - uint16 spell_id_ = (uint16)spell_id; - if ((spell_id_ != spell_id) || (spell_id != spell_id_)) { - initiator->Message(Chat::Red, "FATAL ERROR: Type conversion data loss with spell_id (%i != %u)", spell_id, spell_id_); - return count; - } - - if (!IsDiscipline(spell_id_) && !initiator->HasSpellScribed(spell_id)) { // isn't a discipline & we don't already have it scribed - if (SpellGlobalRule) { - // bool to see if the character has the required QGlobal to scribe it if one exists in the Spell_Globals table - SpellGlobalCheckResult = initiator->SpellGlobalCheck(spell_id_, char_id); - if (SpellGlobalCheckResult) { - initiator->ScribeSpell(spell_id_, book_slot); - ++count; - } - } - else if (SpellBucketRule) { - // bool to see if the character has the required bucket to train it if one exists in the spell_buckets table - SpellBucketCheckResult = initiator->SpellBucketCheck(spell_id_, char_id); - if (SpellBucketCheckResult) { - initiator->ScribeSpell(spell_id_, book_slot); - ++count; - } - } - else { - initiator->ScribeSpell(spell_id_, book_slot); - ++count; - } - } - - break; - } - - book_slot = initiator->GetNextAvailableSpellBookSlot(book_slot); } - return count; // how many spells were scribed successfully + if (spells_learned > 0) { + std::string spell_message = (spells_learned == 1 ? "a new spell" : fmt::format("{} new spells", spells_learned)); + initiator->Message(Chat::White, fmt::format("You have learned {}!", spell_message).c_str()); + } + return spells_learned; } uint16 QuestManager::traindiscs(uint8 max_level, uint8 min_level) { QuestManagerCurrentQuestVars(); - int spell_id = 0; - int count = 0; + int character_id = initiator->CharacterID(); + std::vector spell_ids = initiator->GetLearnableDisciplines(min_level, max_level); + int discipline_count = spell_ids.size(); + int disciplines_learned = 0; + if (discipline_count > 0) { + for (auto spell_id : spell_ids) { + if (initiator->HasDisciplineLearned(spell_id)) + continue; - uint32 char_id = initiator->CharacterID(); - bool SpellGlobalRule = RuleB(Spells, EnableSpellGlobals); - bool SpellBucketRule = RuleB(Spells, EnableSpellBuckets); - bool SpellGlobalCheckResult = false; - bool SpellBucketCheckResult = false; - - bool change = false; - - for( ; spell_id < SPDAT_RECORDS; ++spell_id) { - if (spell_id < 0 || spell_id >= SPDAT_RECORDS) { - initiator->Message(Chat::Red, "FATAL ERROR: Spell id out-of-range (id: %i, min: 0, max: %i)", spell_id, SPDAT_RECORDS); - return count; - } - - while (true) { - if (spells[spell_id].classes[WARRIOR] == 0) // check if spell exists - break; - if (spells[spell_id].classes[initiator->GetPP().class_ - 1] > max_level) // maximum level - break; - if (spells[spell_id].classes[initiator->GetPP().class_ - 1] < min_level) // minimum level - break; - if (spells[spell_id].skill == 52) - break; - if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effectid[EFFECT_COUNT - 1] == 10) - break; - - uint16 spell_id_ = (uint16)spell_id; - if ((spell_id_ != spell_id) || (spell_id != spell_id_)) { - initiator->Message(Chat::Red, "FATAL ERROR: Type conversion data loss with spell_id (%i != %u)", spell_id, spell_id_); - return count; - } - - if (!IsDiscipline(spell_id_)) - break; - - for (uint32 r = 0; r < MAX_PP_DISCIPLINES; r++) { - if (initiator->GetPP().disciplines.values[r] == spell_id_) { - initiator->Message(Chat::Red, "You already know this discipline."); - break; // continue the 1st loop - } - else if (initiator->GetPP().disciplines.values[r] == 0) { - if (SpellGlobalRule) { - // bool to see if the character has the required QGlobal to train it if one exists in the Spell_Globals table - SpellGlobalCheckResult = initiator->SpellGlobalCheck(spell_id_, char_id); - if (SpellGlobalCheckResult) { - initiator->GetPP().disciplines.values[r] = spell_id_; - database.SaveCharacterDisc(char_id, r, spell_id_); - change = true; - initiator->Message(Chat::White, "You have learned a new discipline!"); - ++count; // success counter - } - break; // continue the 1st loop - } - else if (SpellBucketRule) { - // bool to see if the character has the required bucket to train it if one exists in the spell_buckets table - SpellBucketCheckResult = initiator->SpellBucketCheck(spell_id_, char_id); - if (SpellBucketCheckResult) { - initiator->GetPP().disciplines.values[r] = spell_id_; - database.SaveCharacterDisc(char_id, r, spell_id_); - change = true; - initiator->Message(Chat::White, "You have learned a new discipline!"); - ++count; - } - break; - } - else { - initiator->GetPP().disciplines.values[r] = spell_id_; - database.SaveCharacterDisc(char_id, r, spell_id_); - change = true;; - initiator->Message(Chat::White, "You have learned a new discipline!"); - ++count; // success counter - break; // continue the 1st loop - } + for (uint32 index = 0; index < MAX_PP_DISCIPLINES; index++) { + if (initiator->GetPP().disciplines.values[index] == 0) { + initiator->GetPP().disciplines.values[index] = spell_id; + database.SaveCharacterDisc(character_id, index, spell_id); + disciplines_learned++; + break; } } - - break; } } - if (change) + if (disciplines_learned > 0) { + std::string discipline_message = (disciplines_learned == 1 ? "a new discipline" : fmt::format("{} new disciplines", disciplines_learned)); initiator->SendDisciplineUpdate(); + initiator->Message(Chat::White, fmt::format("You have learned {}!", discipline_message).c_str()); + } - return count; // how many disciplines were learned successfully + return disciplines_learned; } void QuestManager::unscribespells() { @@ -1261,10 +1264,10 @@ void QuestManager::doanim(int anim_id) { void QuestManager::addskill(int skill_id, int value) { QuestManagerCurrentQuestVars(); - if (skill_id < 0 || skill_id > EQEmu::skills::HIGHEST_SKILL) + if (skill_id < 0 || skill_id > EQ::skills::HIGHEST_SKILL) return; if (initiator && initiator->IsClient()) - initiator->AddSkill((EQEmu::skills::SkillType) skill_id, value); + initiator->AddSkill((EQ::skills::SkillType) skill_id, value); } void QuestManager::setlanguage(int skill_id, int value) { @@ -1275,10 +1278,10 @@ void QuestManager::setlanguage(int skill_id, int value) { void QuestManager::setskill(int skill_id, int value) { QuestManagerCurrentQuestVars(); - if (skill_id < 0 || skill_id > EQEmu::skills::HIGHEST_SKILL) + if (skill_id < 0 || skill_id > EQ::skills::HIGHEST_SKILL) return; if (initiator && initiator->IsClient()) - initiator->SetSkill((EQEmu::skills::SkillType) skill_id, value); + initiator->SetSkill((EQ::skills::SkillType) skill_id, value); } void QuestManager::setallskill(int value) { @@ -1286,8 +1289,8 @@ void QuestManager::setallskill(int value) { if (!initiator) return; if (initiator && initiator->IsClient()) { - EQEmu::skills::SkillType sk; - for (sk = EQEmu::skills::Skill1HBlunt; sk <= EQEmu::skills::HIGHEST_SKILL; sk = (EQEmu::skills::SkillType)(sk + 1)) { + EQ::skills::SkillType sk; + for (sk = EQ::skills::Skill1HBlunt; sk <= EQ::skills::HIGHEST_SKILL; sk = (EQ::skills::SkillType)(sk + 1)) { initiator->SetSkill(sk, value); } } @@ -1413,12 +1416,12 @@ void QuestManager::settime(uint8 new_hour, uint8 new_min, bool update_world /*= void QuestManager::itemlink(int item_id) { QuestManagerCurrentQuestVars(); if (initiator) { - const EQEmu::ItemData* item = database.GetItem(item_id); + const EQ::ItemData* item = database.GetItem(item_id); if (item == nullptr) return; - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemData); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); linker.SetItemData(item); initiator->Message(Chat::White, "%s tells you, %s", owner->GetCleanName(), linker.GenerateLink().c_str()); @@ -1526,7 +1529,7 @@ int QuestManager::InsertQuestGlobal(int charid, int npcid, int zoneid, const cha /* Create new qglobal data and update zone processes */ pack = new ServerPacket(ServerOP_QGlobalUpdate, sizeof(ServerQGlobalUpdate_Struct)); - ServerQGlobalUpdate_Struct *qgu = (ServerQGlobalUpdate_Struct*)pack->pBuffer; + ServerQGlobalUpdate_Struct *qgu = (ServerQGlobalUpdate_Struct*) pack->pBuffer; qgu->npc_id = npcid; qgu->char_id = charid; qgu->zone_id = zoneid; @@ -1670,10 +1673,17 @@ void QuestManager::ding() { } -void QuestManager::rebind(int zoneid, const glm::vec3& location) { +void QuestManager::rebind(int zone_id, const glm::vec3& location) { QuestManagerCurrentQuestVars(); if(initiator && initiator->IsClient()) { - initiator->SetBindPoint(0, zoneid, 0, location); + initiator->SetBindPoint(0, zone_id, 0, location); + } +} + +void QuestManager::rebind(int zone_id, const glm::vec4& location) { + QuestManagerCurrentQuestVars(); + if(initiator && initiator->IsClient()) { + initiator->SetBindPoint2(0, zone_id, 0, location); } } @@ -1883,7 +1893,7 @@ void QuestManager::clear_zone_flag(int zone_id) { void QuestManager::sethp(int hpperc) { QuestManagerCurrentQuestVars(); int newhp = (owner->GetMaxHP() * (100 - hpperc)) / 100; - owner->Damage(owner, newhp, SPELL_UNKNOWN, EQEmu::skills::SkillHandtoHand, false, 0, false); + owner->Damage(owner, newhp, SPELL_UNKNOWN, EQ::skills::SkillHandtoHand, false, 0, false); } bool QuestManager::summonburiedplayercorpse(uint32 char_id, const glm::vec4& position) { @@ -1915,7 +1925,7 @@ int QuestManager::getplayercorpsecount(uint32 char_id) { return database.CountCharacterCorpses(char_id); } return 0; - + } int QuestManager::getplayercorpsecountbyzoneid(uint32 char_id, uint32 zone_id) { @@ -2237,27 +2247,27 @@ bool QuestManager::createBot(const char *name, const char *lastname, uint8 level void QuestManager::taskselector(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && task_manager) initiator->TaskQuestSetSelector(owner, taskcount, tasks); } void QuestManager::enabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) initiator->EnableTask(taskcount, tasks); } void QuestManager::disabletask(int taskcount, int *tasks) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) initiator->DisableTask(taskcount, tasks); } bool QuestManager::istaskenabled(int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) return initiator->IsTaskEnabled(taskid); return false; @@ -2266,7 +2276,7 @@ bool QuestManager::istaskenabled(int taskid) { void QuestManager::tasksetselector(int tasksetid) { QuestManagerCurrentQuestVars(); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSetSelector called for task set %i", tasksetid); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && taskmanager) + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && owner && task_manager) initiator->TaskSetSelector(owner, tasksetid); } @@ -2355,8 +2365,8 @@ int QuestManager::enabledtaskcount(int taskset) { int QuestManager::firsttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) - return taskmanager->FirstTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) + return task_manager->FirstTaskInSet(taskset); return -1; } @@ -2364,8 +2374,8 @@ int QuestManager::firsttaskinset(int taskset) { int QuestManager::lasttaskinset(int taskset) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) - return taskmanager->LastTaskInSet(taskset); + if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) + return task_manager->LastTaskInSet(taskset); return -1; } @@ -2373,8 +2383,8 @@ int QuestManager::lasttaskinset(int taskset) { int QuestManager::nexttaskinset(int taskset, int taskid) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) - return taskmanager->NextTaskInSet(taskset, taskid); + if(RuleB(TaskSystem, EnableTaskSystem) && task_manager) + return task_manager->NextTaskInSet(taskset, taskid); return -1; } @@ -2426,12 +2436,22 @@ int QuestManager::completedtasksinset(int taskset) { bool QuestManager::istaskappropriate(int task) { QuestManagerCurrentQuestVars(); - if(RuleB(TaskSystem, EnableTaskSystem) && initiator && taskmanager) - return taskmanager->AppropriateLevel(task, initiator->GetLevel()); + if(RuleB(TaskSystem, EnableTaskSystem) && initiator && task_manager) + return task_manager->ValidateLevel(task, initiator->GetLevel()); return false; } +std::string QuestManager::gettaskname(uint32 task_id) { + QuestManagerCurrentQuestVars(); + + if (RuleB(TaskSystem, EnableTaskSystem)) { + return task_manager->GetTaskName(task_id); + } + + return std::string(); +} + void QuestManager::clearspawntimers() { if(!zone) return; @@ -2457,6 +2477,24 @@ void QuestManager::we(int type, const char *str) { worldserver.SendEmoteMessage(0, 0, type, str); } +void QuestManager::message(int color, const char *message) { + QuestManagerCurrentQuestVars(); + if (!initiator) + return; + + initiator->Message(color, message); +} + +void QuestManager::whisper(const char *message) { + QuestManagerCurrentQuestVars(); + if (!initiator || !owner) + return; + + std::string mob_name = owner->GetCleanName(); + std::string new_message = fmt::format("{} whispers, '{}'", mob_name, message); + initiator->Message(315, new_message.c_str()); +} + int QuestManager::getlevel(uint8 type) { QuestManagerCurrentQuestVars(); @@ -2532,7 +2570,7 @@ int QuestManager::collectitems_processSlot(int16 slot_id, uint32 item_id, bool remove) { QuestManagerCurrentQuestVars(); - EQEmu::ItemInstance *item = nullptr; + EQ::ItemInstance *item = nullptr; int quantity = 0; item = initiator->GetInv().GetItem(slot_id); @@ -2567,12 +2605,12 @@ int QuestManager::collectitems(uint32 item_id, bool remove) int quantity = 0; int slot_id; - for (slot_id = EQEmu::invslot::GENERAL_BEGIN; slot_id <= EQEmu::invslot::GENERAL_END; ++slot_id) + for (slot_id = EQ::invslot::GENERAL_BEGIN; slot_id <= EQ::invslot::GENERAL_END; ++slot_id) { quantity += collectitems_processSlot(slot_id, item_id, remove); } - for (slot_id = EQEmu::invbag::GENERAL_BAGS_BEGIN; slot_id <= EQEmu::invbag::GENERAL_BAGS_END; ++slot_id) + for (slot_id = EQ::invbag::GENERAL_BAGS_BEGIN; slot_id <= EQ::invbag::GENERAL_BAGS_END; ++slot_id) { quantity += collectitems_processSlot(slot_id, item_id, remove); } @@ -2580,6 +2618,69 @@ int QuestManager::collectitems(uint32 item_id, bool remove) return quantity; } +int QuestManager::countitem(uint32 item_id) { + QuestManagerCurrentQuestVars(); + int quantity = 0; + EQ::ItemInstance *item = nullptr; + static const int16 slots[][2] = { + { EQ::invslot::POSSESSIONS_BEGIN, EQ::invslot::POSSESSIONS_END }, + { EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END }, + { EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END}, + { EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END }, + { EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END }, + { EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END }, + { EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END }, + }; + const size_t size = sizeof(slots) / sizeof(slots[0]); + for (int slot_index = 0; slot_index < size; ++slot_index) { + for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) { + item = initiator->GetInv().GetItem(slot_id); + if (item && item->GetID() == item_id) { + quantity += item->IsStackable() ? item->GetCharges() : 1; + } + } + } + + return quantity; +} + +void QuestManager::removeitem(uint32 item_id, uint32 quantity) { + QuestManagerCurrentQuestVars(); + EQ::ItemInstance *item = nullptr; + static const int16 slots[][2] = { + { EQ::invslot::POSSESSIONS_BEGIN, EQ::invslot::POSSESSIONS_END }, + { EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END }, + { EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END}, + { EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END }, + { EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END }, + { EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END }, + { EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END }, + }; + int removed_count = 0; + const size_t size = sizeof(slots) / sizeof(slots[0]); + for (int slot_index = 0; slot_index < size; ++slot_index) { + for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) { + if (removed_count == quantity) + break; + + item = initiator->GetInv().GetItem(slot_id); + if (item && item->GetID() == item_id) { + int stack_size = item->IsStackable() ? item->GetCharges() : 1; + if ((removed_count + stack_size) <= quantity) { + removed_count += stack_size; + initiator->DeleteItemInInventory(slot_id, stack_size, true); + } else { + int amount_left = (quantity - removed_count); + if (amount_left > 0 && stack_size >= amount_left) { + removed_count += amount_left; + initiator->DeleteItemInInventory(slot_id, amount_left, true); + } + } + } + } + } +} + void QuestManager::UpdateSpawnTimer(uint32 id, uint32 newTime) { bool found = false; @@ -2606,7 +2707,7 @@ void QuestManager::UpdateSpawnTimer(uint32 id, uint32 newTime) //Spawn wasn't in this zone... //Tell the other zones to update their spawn time for this spawn point auto pack = new ServerPacket(ServerOP_UpdateSpawn, sizeof(UpdateSpawnTimer_Struct)); - UpdateSpawnTimer_Struct *ust = (UpdateSpawnTimer_Struct*)pack->pBuffer; + UpdateSpawnTimer_Struct *ust = (UpdateSpawnTimer_Struct*) pack->pBuffer; ust->id = id; ust->duration = newTime; worldserver.SendPacket(pack); @@ -2621,7 +2722,7 @@ void QuestManager::MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity) if (merchant == 0 || !merchant->IsNPC() || (merchant->GetClass() != MERCHANT)) return; // don't do anything if NPCid isn't a merchant - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; item = database.GetItem(itemid); if (!item) return; // if the item id doesn't correspond to a real item, do nothing @@ -2634,7 +2735,7 @@ uint32 QuestManager::MerchantCountItem(uint32 NPCid, uint32 itemid) { if (merchant == 0 || !merchant->IsNPC() || (merchant->GetClass() != MERCHANT)) return 0; // if it isn't a merchant, it doesn't have any items - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; item = database.GetItem(itemid); if (!item) return 0; // if it isn't a valid item, the merchant doesn't have any @@ -2657,12 +2758,12 @@ uint32 QuestManager::MerchantCountItem(uint32 NPCid, uint32 itemid) { // Item Link for use in Variables - "my $example_link = quest::varlink(item_id);" const char* QuestManager::varlink(char* perltext, int item_id) { QuestManagerCurrentQuestVars(); - const EQEmu::ItemData* item = database.GetItem(item_id); + const EQ::ItemData* item = database.GetItem(item_id); if (!item) return "INVALID ITEM ID IN VARLINK"; - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemData); + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); linker.SetItemData(item); strcpy(perltext, linker.GenerateLink().c_str()); @@ -2670,12 +2771,30 @@ const char* QuestManager::varlink(char* perltext, int item_id) { return perltext; } +std::string QuestManager::getitemname(uint32 item_id) { + const EQ::ItemData* item_data = database.GetItem(item_id); + if (!item_data) { + return "INVALID ITEM ID IN GETITEMNAME"; + } + + std::string item_name = item_data->Name; + return item_name; +} + +std::string QuestManager::getnpcnamebyid(uint32 npc_id) { + std::string res; + if (npc_id > 0) { + res = database.GetNPCNameByID(npc_id); + } + return res; +} + uint16 QuestManager::CreateInstance(const char *zone, int16 version, uint32 duration) { QuestManagerCurrentQuestVars(); if(initiator) { - uint32 zone_id = content_db.GetZoneID(zone); + uint32 zone_id = ZoneID(zone); if(zone_id == 0) return 0; @@ -2709,7 +2828,7 @@ void QuestManager::UpdateInstanceTimer(uint16 instance_id, uint32 new_duration) if (results.Success()) { auto pack = new ServerPacket(ServerOP_InstanceUpdateTime, sizeof(ServerInstanceUpdateTime_Struct)); - ServerInstanceUpdateTime_Struct *ut = (ServerInstanceUpdateTime_Struct*)pack->pBuffer; + ServerInstanceUpdateTime_Struct *ut = (ServerInstanceUpdateTime_Struct*) pack->pBuffer; ut->instance_id = instance_id; ut->new_duration = new_duration; worldserver.SendPacket(pack); @@ -2728,10 +2847,10 @@ uint32 QuestManager::GetInstanceTimer() { uint32 QuestManager::GetInstanceTimerByID(uint16 instance_id) { if (instance_id == 0) return 0; - + std::string query = StringFormat("SELECT ((start_time + duration) - UNIX_TIMESTAMP()) AS `remaining` FROM `instance_list` WHERE `id` = %lu", (unsigned long)instance_id); auto results = database.QueryDatabase(query); - + if (results.Success()) { auto row = results.begin(); uint32 timer = atoi(row[0]); @@ -2745,13 +2864,13 @@ uint16 QuestManager::GetInstanceID(const char *zone, int16 version) QuestManagerCurrentQuestVars(); if (initiator) { - return database.GetInstanceID(zone, initiator->CharacterID(), version); + return database.GetInstanceID(ZoneID(zone), initiator->CharacterID(), version); } return 0; } uint16 QuestManager::GetInstanceIDByCharID(const char *zone, int16 version, uint32 char_id) { - return database.GetInstanceID(zone, char_id, version); + return database.GetInstanceID(ZoneID(zone), char_id, version); } void QuestManager::AssignToInstance(uint16 instance_id) @@ -2811,6 +2930,10 @@ void QuestManager::RemoveFromInstanceByCharID(uint16 instance_id, uint32 char_id database.RemoveClientFromInstance(instance_id, char_id); } +bool QuestManager::CheckInstanceByCharID(uint16 instance_id, uint32 char_id) { + return database.CharacterInInstanceGroup(instance_id, char_id); +} + void QuestManager::RemoveAllFromInstance(uint16 instance_id) { QuestManagerCurrentQuestVars(); @@ -2866,7 +2989,47 @@ std::string QuestManager::saylink(char *saylink_text, bool silent, const char *l { QuestManagerCurrentQuestVars(); - return EQEmu::SayLinkEngine::GenerateQuestSaylink(saylink_text, silent, link_name); + return EQ::SayLinkEngine::GenerateQuestSaylink(saylink_text, silent, link_name); +} + +std::string QuestManager::getcharnamebyid(uint32 char_id) { + std::string res; + if (char_id > 0) { + res = database.GetCharNameByID(char_id); + } + return res; +} + +uint32 QuestManager::getcharidbyname(const char* name) { + return database.GetCharacterID(name); +} + +std::string QuestManager::getclassname(uint8 class_id, uint8 level) { + return GetClassIDName(class_id, level); +} + +int QuestManager::getcurrencyid(uint32 item_id) { + auto iter = zone->AlternateCurrencies.begin(); + while (iter != zone->AlternateCurrencies.end()) { + if (item_id == (*iter).item_id) { + return (*iter).id; + } + ++iter; + } + return 0; +} + +int QuestManager::getcurrencyitemid(int currency_id) { + if (currency_id > 0) { + auto iter = zone->AlternateCurrencies.begin(); + while (iter != zone->AlternateCurrencies.end()) { + if (currency_id == (*iter).id) { + return (*iter).item_id; + } + ++iter; + } + } + return 0; } const char* QuestManager::getguildnamebyid(int guild_id) { @@ -3060,96 +3223,884 @@ uint16 QuestManager::CreateDoor(const char* model, float x, float y, float z, fl } int32 QuestManager::GetZoneID(const char *zone) { - return static_cast(content_db.GetZoneID(zone)); + return static_cast(ZoneID(zone)); } -const char* QuestManager::GetZoneLongName(const char *zone) { - char *long_name; - content_db.GetZoneLongName(zone, &long_name); - std::string ln = long_name; - safe_delete_array(long_name); - - return ln.c_str(); +std::string QuestManager::GetZoneLongName(std::string zone_short_name) +{ + return ZoneLongName(ZoneID(zone_short_name)); } -void QuestManager::CrossZoneSignalNPCByNPCTypeID(uint32 npctype_id, uint32 data){ - auto pack = new ServerPacket(ServerOP_CZSignalNPC, sizeof(CZNPCSignal_Struct)); - CZNPCSignal_Struct* CZSN = (CZNPCSignal_Struct*)pack->pBuffer; - CZSN->npctype_id = npctype_id; - CZSN->data = data; +std::string QuestManager::GetZoneLongNameByID(uint32 zone_id) { + return ZoneLongName(zone_id); +} + +std::string QuestManager::GetZoneShortName(uint32 zone_id) { + return ZoneName(zone_id); +} + +void QuestManager::CrossZoneAssignTaskByCharID(int character_id, uint32 task_id, bool enforce_level_requirement) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskAssignPlayer, sizeof(CZTaskAssignPlayer_Struct)); + CZTaskAssignPlayer_Struct* CZTA = (CZTaskAssignPlayer_Struct*) pack->pBuffer; + CZTA->npc_entity_id = owner->GetID(); + CZTA->character_id = character_id; + CZTA->task_id = task_id; + CZTA->enforce_level_requirement = enforce_level_requirement; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneAssignTaskByGroupID(int group_id, uint32 task_id, bool enforce_level_requirement) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskAssignGroup, sizeof(CZTaskAssignGroup_Struct)); + CZTaskAssignGroup_Struct* CZTA = (CZTaskAssignGroup_Struct*) pack->pBuffer; + CZTA->npc_entity_id = owner->GetID(); + CZTA->group_id = group_id; + CZTA->task_id = task_id; + CZTA->enforce_level_requirement = enforce_level_requirement; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneAssignTaskByRaidID(int raid_id, uint32 task_id, bool enforce_level_requirement) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskAssignRaid, sizeof(CZTaskAssignRaid_Struct)); + CZTaskAssignRaid_Struct* CZTA = (CZTaskAssignRaid_Struct*) pack->pBuffer; + CZTA->npc_entity_id = owner->GetID(); + CZTA->raid_id = raid_id; + CZTA->task_id = task_id; + CZTA->enforce_level_requirement = enforce_level_requirement; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneAssignTaskByGuildID(int guild_id, uint32 task_id, bool enforce_level_requirement) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskAssignGuild, sizeof(CZTaskAssignGuild_Struct)); + CZTaskAssignGuild_Struct* CZTA = (CZTaskAssignGuild_Struct*) pack->pBuffer; + CZTA->npc_entity_id = owner->GetID(); + CZTA->guild_id = guild_id; + CZTA->task_id = task_id; + CZTA->enforce_level_requirement = enforce_level_requirement; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneCastSpellByCharID(int character_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZCastSpellPlayer, sizeof(CZCastSpellPlayer_Struct)); + CZCastSpellPlayer_Struct* CZCS = (CZCastSpellPlayer_Struct*) pack->pBuffer; + CZCS->character_id = character_id; + CZCS->spell_id = spell_id; worldserver.SendPacket(pack); safe_delete(pack); } -void QuestManager::CrossZoneSignalPlayerByCharID(int charid, uint32 data){ +void QuestManager::CrossZoneCastSpellByGroupID(int group_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZCastSpellGroup, sizeof(CZCastSpellGroup_Struct)); + CZCastSpellGroup_Struct* CZCS = (CZCastSpellGroup_Struct*) pack->pBuffer; + CZCS->group_id = group_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneCastSpellByRaidID(int raid_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZCastSpellRaid, sizeof(CZCastSpellRaid_Struct)); + CZCastSpellRaid_Struct* CZCS = (CZCastSpellRaid_Struct*) pack->pBuffer; + CZCS->raid_id = raid_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneCastSpellByGuildID(int guild_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZCastSpellGuild, sizeof(CZCastSpellGuild_Struct)); + CZCastSpellGuild_Struct* CZCS = (CZCastSpellGuild_Struct*) pack->pBuffer; + CZCS->guild_id = guild_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneDisableTaskByCharID(int character_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskDisablePlayer, sizeof(CZTaskDisablePlayer_Struct)); + CZTaskDisablePlayer_Struct* CZTD = (CZTaskDisablePlayer_Struct*) pack->pBuffer; + CZTD->character_id = character_id; + CZTD->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneDisableTaskByGroupID(int group_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskDisableGroup, sizeof(CZTaskDisableGroup_Struct)); + CZTaskDisableGroup_Struct* CZTD = (CZTaskDisableGroup_Struct*) pack->pBuffer; + CZTD->group_id = group_id; + CZTD->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneDisableTaskByRaidID(int raid_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskDisableRaid, sizeof(CZTaskDisableRaid_Struct)); + CZTaskDisableRaid_Struct* CZTD = (CZTaskDisableRaid_Struct*) pack->pBuffer; + CZTD->raid_id = raid_id; + CZTD->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneDisableTaskByGuildID(int guild_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskDisableGuild, sizeof(CZTaskDisableGuild_Struct)); + CZTaskDisableGuild_Struct* CZTD = (CZTaskDisableGuild_Struct*) pack->pBuffer; + CZTD->guild_id = guild_id; + CZTD->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneEnableTaskByCharID(int character_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskEnablePlayer, sizeof(CZTaskEnablePlayer_Struct)); + CZTaskEnablePlayer_Struct* CZTE = (CZTaskEnablePlayer_Struct*) pack->pBuffer; + CZTE->character_id = character_id; + CZTE->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneEnableTaskByGroupID(int group_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskEnableGroup, sizeof(CZTaskEnableGroup_Struct)); + CZTaskEnableGroup_Struct* CZTE = (CZTaskEnableGroup_Struct*) pack->pBuffer; + CZTE->group_id = group_id; + CZTE->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneEnableTaskByRaidID(int raid_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskEnableRaid, sizeof(CZTaskEnableRaid_Struct)); + CZTaskEnableRaid_Struct* CZTE = (CZTaskEnableRaid_Struct*) pack->pBuffer; + CZTE->raid_id = raid_id; + CZTE->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneEnableTaskByGuildID(int guild_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskEnableGuild, sizeof(CZTaskEnableGuild_Struct)); + CZTaskEnableGuild_Struct* CZTE = (CZTaskEnableGuild_Struct*) pack->pBuffer; + CZTE->guild_id = guild_id; + CZTE->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneFailTaskByCharID(int character_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskFailPlayer, sizeof(CZTaskFailPlayer_Struct)); + CZTaskFailPlayer_Struct* CZTF = (CZTaskFailPlayer_Struct*) pack->pBuffer; + CZTF->character_id = character_id; + CZTF->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneFailTaskByGroupID(int group_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskFailGroup, sizeof(CZTaskFailGroup_Struct)); + CZTaskFailGroup_Struct* CZTF = (CZTaskFailGroup_Struct*) pack->pBuffer; + CZTF->group_id = group_id; + CZTF->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneFailTaskByRaidID(int raid_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskFailRaid, sizeof(CZTaskFailRaid_Struct)); + CZTaskFailRaid_Struct* CZTF = (CZTaskFailRaid_Struct*) pack->pBuffer; + CZTF->raid_id = raid_id; + CZTF->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneFailTaskByGuildID(int guild_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskFailGuild, sizeof(CZTaskFailGuild_Struct)); + CZTaskFailGuild_Struct* CZTF = (CZTaskFailGuild_Struct*) pack->pBuffer; + CZTF->guild_id = guild_id; + CZTF->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMarqueeByCharID(int character_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMarqueePlayer, sizeof(CZMarqueePlayer_Struct) + message_len); + CZMarqueePlayer_Struct* CZMS = (CZMarqueePlayer_Struct*) pack->pBuffer; + CZMS->character_id = character_id; + CZMS->type = type; + CZMS->priority = priority; + CZMS->fade_in = fade_in; + CZMS->fade_out = fade_out; + CZMS->duration = duration; + strn0cpy(CZMS->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMarqueeByGroupID(int group_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMarqueeGroup, sizeof(CZMarqueeGroup_Struct) + message_len); + CZMarqueeGroup_Struct* CZMS = (CZMarqueeGroup_Struct*) pack->pBuffer; + CZMS->group_id = group_id; + CZMS->type = type; + CZMS->priority = priority; + CZMS->fade_in = fade_in; + CZMS->fade_out = fade_out; + CZMS->duration = duration; + strn0cpy(CZMS->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMarqueeByRaidID(int raid_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMarqueeRaid, sizeof(CZMarqueeRaid_Struct) + message_len); + CZMarqueeRaid_Struct* CZMS = (CZMarqueeRaid_Struct*) pack->pBuffer; + CZMS->raid_id = raid_id; + CZMS->type = type; + CZMS->priority = priority; + CZMS->fade_in = fade_in; + CZMS->fade_out = fade_out; + CZMS->duration = duration; + strn0cpy(CZMS->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMarqueeByGuildID(int guild_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMarqueeGuild, sizeof(CZMarqueeGuild_Struct) + message_len); + CZMarqueeGuild_Struct* CZMS = (CZMarqueeGuild_Struct*) pack->pBuffer; + CZMS->guild_id = guild_id; + CZMS->type = type; + CZMS->priority = priority; + CZMS->fade_in = fade_in; + CZMS->fade_out = fade_out; + CZMS->duration = duration; + strn0cpy(CZMS->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMessagePlayerByName(uint32 type, const char *character_name, const char *message) { + uint32 message_len = strlen(character_name) + 1; + uint32 message_len2 = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMessagePlayer, sizeof(CZMessagePlayer_Struct) + message_len + message_len2); + CZMessagePlayer_Struct* CZSC = (CZMessagePlayer_Struct*) pack->pBuffer; + CZSC->type = type; + strn0cpy(CZSC->character_name, character_name, 64); + strn0cpy(CZSC->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMessagePlayerByGroupID(uint32 type, int group_id, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMessageGroup, sizeof(CZMessageGroup_Struct) + message_len); + CZMessageGroup_Struct* CZGM = (CZMessageGroup_Struct*) pack->pBuffer; + CZGM->type = type; + CZGM->group_id = group_id; + strn0cpy(CZGM->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMessagePlayerByRaidID(uint32 type, int raid_id, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMessageRaid, sizeof(CZMessageRaid_Struct) + message_len); + CZMessageRaid_Struct* CZRM = (CZMessageRaid_Struct*) pack->pBuffer; + CZRM->type = type; + CZRM->raid_id = raid_id; + strn0cpy(CZRM->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMessagePlayerByGuildID(uint32 type, int guild_id, const char *message) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_CZMessageGuild, sizeof(CZMessageGuild_Struct) + message_len); + CZMessageGuild_Struct* CZGM = (CZMessageGuild_Struct*) pack->pBuffer; + CZGM->type = type; + CZGM->guild_id = guild_id; + strn0cpy(CZGM->message, message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMovePlayerByCharID(int character_id, const char *zone_short_name) { + uint32 message_len = strlen(zone_short_name) + 1; + auto pack = new ServerPacket(ServerOP_CZMovePlayer, sizeof(CZMovePlayer_Struct) + message_len); + CZMovePlayer_Struct* CZGM = (CZMovePlayer_Struct*) pack->pBuffer; + CZGM->character_id = character_id; + strn0cpy(CZGM->zone_short_name, zone_short_name, 32); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMovePlayerByGroupID(int group_id, const char *zone_short_name) { + uint32 message_len = strlen(zone_short_name) + 1; + auto pack = new ServerPacket(ServerOP_CZMoveGroup, sizeof(CZMoveGroup_Struct) + message_len); + CZMoveGroup_Struct* CZGM = (CZMoveGroup_Struct*) pack->pBuffer; + CZGM->group_id = group_id; + strn0cpy(CZGM->zone_short_name, zone_short_name, 32); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMovePlayerByRaidID(int raid_id, const char *zone_short_name) { + uint32 message_len = strlen(zone_short_name) + 1; + auto pack = new ServerPacket(ServerOP_CZMoveRaid, sizeof(CZMoveRaid_Struct) + message_len); + CZMoveRaid_Struct* CZRM = (CZMoveRaid_Struct*) pack->pBuffer; + CZRM->raid_id = raid_id; + strn0cpy(CZRM->zone_short_name, zone_short_name, 32); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMovePlayerByGuildID(int guild_id, const char *zone_short_name) { + uint32 message_len = strlen(zone_short_name) + 1; + auto pack = new ServerPacket(ServerOP_CZMoveGuild, sizeof(CZMoveGuild_Struct) + message_len); + CZMoveGuild_Struct* CZGM = (CZMoveGuild_Struct*) pack->pBuffer; + CZGM->guild_id = guild_id; + strn0cpy(CZGM->zone_short_name, zone_short_name, 32); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMoveInstanceByCharID(int character_id, uint16 instance_id) { + auto pack = new ServerPacket(ServerOP_CZMoveInstancePlayer, sizeof(CZMoveInstancePlayer_Struct)); + CZMoveInstancePlayer_Struct* CZMS = (CZMoveInstancePlayer_Struct*) pack->pBuffer; + CZMS->character_id = character_id; + CZMS->instance_id = instance_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMoveInstanceByGroupID(int group_id, uint16 instance_id) { + auto pack = new ServerPacket(ServerOP_CZMoveInstanceGroup, sizeof(CZMoveInstanceGroup_Struct)); + CZMoveInstanceGroup_Struct* CZMS = (CZMoveInstanceGroup_Struct*) pack->pBuffer; + CZMS->group_id = group_id; + CZMS->instance_id = instance_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMoveInstanceByRaidID(int raid_id, uint16 instance_id) { + auto pack = new ServerPacket(ServerOP_CZMoveInstanceRaid, sizeof(CZMoveInstanceRaid_Struct)); + CZMoveInstanceRaid_Struct* CZMS = (CZMoveInstanceRaid_Struct*) pack->pBuffer; + CZMS->raid_id = raid_id; + CZMS->instance_id = instance_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneMoveInstanceByGuildID(int guild_id, uint16 instance_id) { + auto pack = new ServerPacket(ServerOP_CZMoveInstanceGuild, sizeof(CZMoveInstanceGuild_Struct)); + CZMoveInstanceGuild_Struct* CZMS = (CZMoveInstanceGuild_Struct*) pack->pBuffer; + CZMS->guild_id = guild_id; + CZMS->instance_id = instance_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveSpellByCharID(int character_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZRemoveSpellPlayer, sizeof(CZRemoveSpellPlayer_Struct)); + CZRemoveSpellPlayer_Struct* CZCS = (CZRemoveSpellPlayer_Struct*) pack->pBuffer; + CZCS->character_id = character_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveSpellByGroupID(int group_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZRemoveSpellGroup, sizeof(CZRemoveSpellGroup_Struct)); + CZRemoveSpellGroup_Struct* CZCS = (CZRemoveSpellGroup_Struct*) pack->pBuffer; + CZCS->group_id = group_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveSpellByRaidID(int raid_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZRemoveSpellRaid, sizeof(CZRemoveSpellRaid_Struct)); + CZRemoveSpellRaid_Struct* CZCS = (CZRemoveSpellRaid_Struct*) pack->pBuffer; + CZCS->raid_id = raid_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveSpellByGuildID(int guild_id, uint32 spell_id) { + auto pack = new ServerPacket(ServerOP_CZRemoveSpellGuild, sizeof(CZRemoveSpellGuild_Struct)); + CZRemoveSpellGuild_Struct* CZCS = (CZRemoveSpellGuild_Struct*) pack->pBuffer; + CZCS->guild_id = guild_id; + CZCS->spell_id = spell_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveTaskByCharID(int character_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskRemovePlayer, sizeof(CZTaskRemovePlayer_Struct)); + CZTaskRemovePlayer_Struct* CZCS = (CZTaskRemovePlayer_Struct*) pack->pBuffer; + CZCS->character_id = character_id; + CZCS->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveTaskByGroupID(int group_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskRemoveGroup, sizeof(CZTaskRemoveGroup_Struct)); + CZTaskRemoveGroup_Struct* CZCS = (CZTaskRemoveGroup_Struct*) pack->pBuffer; + CZCS->group_id = group_id; + CZCS->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveTaskByRaidID(int raid_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskRemoveRaid, sizeof(CZTaskRemoveRaid_Struct)); + CZTaskRemoveRaid_Struct* CZCS = (CZTaskRemoveRaid_Struct*) pack->pBuffer; + CZCS->raid_id = raid_id; + CZCS->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneRemoveTaskByGuildID(int guild_id, uint32 task_id) { + auto pack = new ServerPacket(ServerOP_CZTaskRemoveGuild, sizeof(CZTaskRemoveGuild_Struct)); + CZTaskRemoveGuild_Struct* CZCS = (CZTaskRemoveGuild_Struct*) pack->pBuffer; + CZCS->guild_id = guild_id; + CZCS->task_id = task_id; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneResetActivityByCharID(int character_id, uint32 task_id, int activity_id) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityResetPlayer, sizeof(CZResetActivityPlayer_Struct)); + CZResetActivityPlayer_Struct* CZCA = (CZResetActivityPlayer_Struct*) pack->pBuffer; + CZCA->character_id = character_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneResetActivityByGroupID(int group_id, uint32 task_id, int activity_id) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityResetGroup, sizeof(CZResetActivityGroup_Struct)); + CZResetActivityGroup_Struct* CZCA = (CZResetActivityGroup_Struct*) pack->pBuffer; + CZCA->group_id = group_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneResetActivityByRaidID(int raid_id, uint32 task_id, int activity_id) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityResetRaid, sizeof(CZResetActivityRaid_Struct)); + CZResetActivityRaid_Struct* CZCA = (CZResetActivityRaid_Struct*) pack->pBuffer; + CZCA->raid_id = raid_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneResetActivityByGuildID(int guild_id, uint32 task_id, int activity_id) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityResetGuild, sizeof(CZResetActivityGuild_Struct)); + CZResetActivityGuild_Struct* CZCA = (CZResetActivityGuild_Struct*) pack->pBuffer; + CZCA->guild_id = guild_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneSignalNPCByNPCTypeID(uint32 npctype_id, uint32 signal) { + auto pack = new ServerPacket(ServerOP_CZSignalNPC, sizeof(CZNPCSignal_Struct)); + CZNPCSignal_Struct* CZSN = (CZNPCSignal_Struct*) pack->pBuffer; + CZSN->npctype_id = npctype_id; + CZSN->signal = signal; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSignalPlayerByCharID(int character_id, uint32 signal) { auto pack = new ServerPacket(ServerOP_CZSignalClient, sizeof(CZClientSignal_Struct)); CZClientSignal_Struct* CZSC = (CZClientSignal_Struct*) pack->pBuffer; - CZSC->charid = charid; - CZSC->data = data; + CZSC->character_id = character_id; + CZSC->signal = signal; worldserver.SendPacket(pack); safe_delete(pack); } -void QuestManager::CrossZoneSignalPlayerByName(const char *CharName, uint32 data){ - uint32 message_len = strlen(CharName) + 1; +void QuestManager::CrossZoneSetEntityVariableByClientName(const char *character_name, const char *variable_name, const char *variable_value) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + uint32 message_len3 = strlen(character_name) + 1; + auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByClientName, sizeof(CZSetEntVarByClientName_Struct) + message_len + message_len2 + message_len3); + CZSetEntVarByClientName_Struct* CZ = (CZSetEntVarByClientName_Struct*) pack->pBuffer; + strn0cpy(CZ->character_name, character_name, 64); + strn0cpy(CZ->variable_name, variable_name, 256); + strn0cpy(CZ->variable_value, variable_value, 256); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSetEntityVariableByGroupID(int group_id, const char *variable_name, const char *variable_value) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByGroupID, sizeof(CZSetEntVarByGroupID_Struct) + message_len + message_len2); + CZSetEntVarByGroupID_Struct* CZ = (CZSetEntVarByGroupID_Struct*) pack->pBuffer; + CZ->group_id = group_id; + strn0cpy(CZ->variable_name, variable_name, 256); + strn0cpy(CZ->variable_value, variable_value, 256); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSetEntityVariableByRaidID(int raid_id, const char *variable_name, const char *variable_value) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByRaidID, sizeof(CZSetEntVarByRaidID_Struct) + message_len + message_len2); + CZSetEntVarByRaidID_Struct* CZ = (CZSetEntVarByRaidID_Struct*) pack->pBuffer; + CZ->raid_id = raid_id; + strn0cpy(CZ->variable_name, variable_name, 256); + strn0cpy(CZ->variable_value, variable_value, 256); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSetEntityVariableByGuildID(int guild_id, const char *variable_name, const char *variable_value) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByGuildID, sizeof(CZSetEntVarByGuildID_Struct) + message_len + message_len2); + CZSetEntVarByGuildID_Struct* CZ = (CZSetEntVarByGuildID_Struct*) pack->pBuffer; + CZ->guild_id = guild_id; + strn0cpy(CZ->variable_name, variable_name, 256); + strn0cpy(CZ->variable_value, variable_value, 256); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *variable_name, const char *variable_value) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByNPCTypeID, sizeof(CZSetEntVarByNPCTypeID_Struct) + message_len + message_len2); + CZSetEntVarByNPCTypeID_Struct* CZSNBYNID = (CZSetEntVarByNPCTypeID_Struct*) pack->pBuffer; + CZSNBYNID->npctype_id = npctype_id; + strn0cpy(CZSNBYNID->variable_name, variable_name, 256); + strn0cpy(CZSNBYNID->variable_value, variable_value, 256); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSignalPlayerByGroupID(int group_id, uint32 signal) { + auto pack = new ServerPacket(ServerOP_CZSignalGroup, sizeof(CZGroupSignal_Struct)); + CZGroupSignal_Struct* CZGS = (CZGroupSignal_Struct*) pack->pBuffer; + CZGS->group_id = group_id; + CZGS->signal = signal; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSignalPlayerByRaidID(int raid_id, uint32 signal) { + auto pack = new ServerPacket(ServerOP_CZSignalRaid, sizeof(CZRaidSignal_Struct)); + CZRaidSignal_Struct* CZRS = (CZRaidSignal_Struct*) pack->pBuffer; + CZRS->raid_id = raid_id; + CZRS->signal = signal; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSignalPlayerByGuildID(int guild_id, uint32 signal) { + auto pack = new ServerPacket(ServerOP_CZSignalGuild, sizeof(CZGuildSignal_Struct)); + CZGuildSignal_Struct* CZGS = (CZGuildSignal_Struct*) pack->pBuffer; + CZGS->guild_id = guild_id; + CZGS->signal = signal; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::CrossZoneSignalPlayerByName(const char *character_name, uint32 signal) { + uint32 message_len = strlen(character_name) + 1; auto pack = new ServerPacket(ServerOP_CZSignalClientByName, sizeof(CZClientSignalByName_Struct) + message_len); CZClientSignalByName_Struct* CZSC = (CZClientSignalByName_Struct*) pack->pBuffer; - strn0cpy(CZSC->Name, CharName, 64); - CZSC->data = data; + strn0cpy(CZSC->character_name, character_name, 64); + CZSC->signal = signal; worldserver.SendPacket(pack); safe_delete(pack); } -void QuestManager::CrossZoneMessagePlayerByName(uint32 Type, const char *CharName, const char *Message){ - uint32 message_len = strlen(CharName) + 1; - uint32 message_len2 = strlen(Message) + 1; - auto pack = - new ServerPacket(ServerOP_CZMessagePlayer, sizeof(CZMessagePlayer_Struct) + message_len + message_len2); - CZMessagePlayer_Struct* CZSC = (CZMessagePlayer_Struct*) pack->pBuffer; - CZSC->Type = Type; - strn0cpy(CZSC->CharName, CharName, 64); - strn0cpy(CZSC->Message, Message, 512); +void QuestManager::CrossZoneUpdateActivityByCharID(int character_id, uint32 task_id, int activity_id, int activity_count) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityUpdatePlayer, sizeof(CZTaskActivityUpdatePlayer_Struct)); + CZTaskActivityUpdatePlayer_Struct* CZCA = (CZTaskActivityUpdatePlayer_Struct*) pack->pBuffer; + CZCA->character_id = character_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + CZCA->activity_count = activity_count; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneUpdateActivityByGroupID(int group_id, uint32 task_id, int activity_id, int activity_count) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityUpdateGroup, sizeof(CZTaskActivityUpdateGroup_Struct)); + CZTaskActivityUpdateGroup_Struct* CZCA = (CZTaskActivityUpdateGroup_Struct*) pack->pBuffer; + CZCA->group_id = group_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + CZCA->activity_count = activity_count; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneUpdateActivityByRaidID(int raid_id, uint32 task_id, int activity_id, int activity_count) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityUpdateRaid, sizeof(CZTaskActivityUpdateRaid_Struct)); + CZTaskActivityUpdateRaid_Struct* CZCA = (CZTaskActivityUpdateRaid_Struct*) pack->pBuffer; + CZCA->raid_id = raid_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + CZCA->activity_count = activity_count; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::CrossZoneUpdateActivityByGuildID(int guild_id, uint32 task_id, int activity_id, int activity_count) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_CZTaskActivityUpdateGuild, sizeof(CZTaskActivityUpdateGuild_Struct)); + CZTaskActivityUpdateGuild_Struct* CZCA = (CZTaskActivityUpdateGuild_Struct*) pack->pBuffer; + CZCA->guild_id = guild_id; + CZCA->task_id = task_id; + CZCA->activity_id = activity_id; + CZCA->activity_count = activity_count; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::WorldWideAssignTask(uint32 task_id, bool enforce_level_requirement, uint8 min_status, uint8 max_status) { + QuestManagerCurrentQuestVars(); + if (initiator && owner) { + auto pack = new ServerPacket(ServerOP_WWAssignTask, sizeof(WWAssignTask_Struct)); + WWAssignTask_Struct* WWTA = (WWAssignTask_Struct*) pack->pBuffer; + WWTA->npc_entity_id = owner->GetID(); + WWTA->task_id = task_id; + WWTA->enforce_level_requirement = enforce_level_requirement; + WWTA->min_status = min_status; + WWTA->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); + } +} + +void QuestManager::WorldWideCastSpell(uint32 spell_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWCastSpell, sizeof(WWCastSpell_Struct)); + WWCastSpell_Struct* WWCS = (WWCastSpell_Struct*) pack->pBuffer; + WWCS->spell_id = spell_id; + WWCS->min_status = min_status; + WWCS->max_status = max_status; worldserver.SendPacket(pack); safe_delete(pack); } -void QuestManager::CrossZoneSetEntityVariableByClientName(const char *CharName, const char *id, const char *m_var){ - uint32 message_len = strlen(id) + 1; - uint32 message_len2 = strlen(m_var) + 1; - uint32 message_len3 = strlen(CharName) + 1; - auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByClientName, - sizeof(CZSetEntVarByClientName_Struct) + message_len + message_len2 + message_len3); - CZSetEntVarByClientName_Struct* CZ = (CZSetEntVarByClientName_Struct*)pack->pBuffer; - strn0cpy(CZ->CharName, CharName, 64); - strn0cpy(CZ->id, id, 256); - strn0cpy(CZ->m_var, m_var, 256); +void QuestManager::WorldWideDisableTask(uint32 task_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWDisableTask, sizeof(WWDisableTask_Struct)); + WWDisableTask_Struct* WWDT = (WWDisableTask_Struct*) pack->pBuffer; + WWDT->task_id = task_id; + WWDT->min_status = min_status; + WWDT->max_status = max_status; worldserver.SendPacket(pack); safe_delete(pack); } -void QuestManager::CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *id, const char *m_var){ - uint32 message_len = strlen(id) + 1; - uint32 message_len2 = strlen(m_var) + 1; - auto pack = new ServerPacket(ServerOP_CZSetEntityVariableByNPCTypeID, - sizeof(CZSetEntVarByNPCTypeID_Struct) + message_len + message_len2); - CZSetEntVarByNPCTypeID_Struct* CZSNBYNID = (CZSetEntVarByNPCTypeID_Struct*)pack->pBuffer; - CZSNBYNID->npctype_id = npctype_id; - strn0cpy(CZSNBYNID->id, id, 256); - strn0cpy(CZSNBYNID->m_var, m_var, 256); +void QuestManager::WorldWideEnableTask(uint32 task_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWEnableTask, sizeof(WWEnableTask_Struct)); + WWEnableTask_Struct* WWET = (WWEnableTask_Struct*) pack->pBuffer; + WWET->task_id = task_id; + WWET->min_status = min_status; + WWET->max_status = max_status; worldserver.SendPacket(pack); safe_delete(pack); } -void QuestManager::WorldWideMarquee(uint32 Type, uint32 Priority, uint32 FadeIn, uint32 FadeOut, uint32 Duration, const char *Message) { - uint32 message_len = strlen(Message) + 1; +void QuestManager::WorldWideFailTask(uint32 task_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWFailTask, sizeof(WWFailTask_Struct)); + WWFailTask_Struct* WWFT = (WWFailTask_Struct*) pack->pBuffer; + WWFT->task_id = task_id; + WWFT->min_status = min_status; + WWFT->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideMarquee(uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message, uint8 min_status, uint8 max_status) { + uint32 message_len = strlen(message) + 1; auto pack = new ServerPacket(ServerOP_WWMarquee, sizeof(WWMarquee_Struct) + message_len); WWMarquee_Struct* WWMS = (WWMarquee_Struct*) pack->pBuffer; - WWMS->Type = Type; - WWMS->Priority = Priority; - WWMS->FadeIn = FadeIn; - WWMS->FadeOut = FadeOut; - WWMS->Duration = Duration; - strn0cpy(WWMS->Message, Message, 512); + WWMS->type = type; + WWMS->priority = priority; + WWMS->fade_in = fade_in; + WWMS->fade_out = fade_out; + WWMS->duration = duration; + strn0cpy(WWMS->message, message, 512); + WWMS->min_status = min_status; + WWMS->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideMessage(uint32 type, const char *message, uint8 min_status, uint8 max_status) { + uint32 message_len = strlen(message) + 1; + auto pack = new ServerPacket(ServerOP_WWMessage, sizeof(WWMessage_Struct) + message_len); + WWMessage_Struct* WWMS = (WWMessage_Struct*) pack->pBuffer; + WWMS->type = type; + strn0cpy(WWMS->message, message, 512); + WWMS->min_status = min_status; + WWMS->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideMove(const char *zone_short_name, uint8 min_status, uint8 max_status) { + uint32 message_len = strlen(zone_short_name) + 1; + auto pack = new ServerPacket(ServerOP_WWMove, sizeof(WWMove_Struct) + message_len); + WWMove_Struct* WWMS = (WWMove_Struct*) pack->pBuffer;; + strn0cpy(WWMS->zone_short_name, zone_short_name, 32); + WWMS->min_status = min_status; + WWMS->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideMoveInstance(uint16 instance_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWMoveInstance, sizeof(WWMoveInstance_Struct)); + WWMoveInstance_Struct* WWMS = (WWMoveInstance_Struct*) pack->pBuffer; + WWMS->instance_id = instance_id; + WWMS->min_status = min_status; + WWMS->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideRemoveSpell(uint32 spell_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWRemoveSpell, sizeof(WWRemoveSpell_Struct)); + WWRemoveSpell_Struct* WWRS = (WWRemoveSpell_Struct*) pack->pBuffer; + WWRS->spell_id = spell_id; + WWRS->min_status = min_status; + WWRS->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideRemoveTask(uint32 task_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWRemoveTask, sizeof(WWRemoveTask_Struct)); + WWRemoveTask_Struct* WWRT = (WWRemoveTask_Struct*) pack->pBuffer; + WWRT->task_id = task_id; + WWRT->min_status = min_status; + WWRT->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideResetActivity(uint32 task_id, int activity_id, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWResetActivity, sizeof(WWResetActivity_Struct)); + WWResetActivity_Struct* WWRA = (WWResetActivity_Struct*) pack->pBuffer; + WWRA->task_id = task_id; + WWRA->activity_id = activity_id; + WWRA->min_status = min_status; + WWRA->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideSetEntityVariableClient(const char *variable_name, const char *variable_value, uint8 min_status, uint8 max_status) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + auto pack = new ServerPacket(ServerOP_WWSetEntityVariableClient, sizeof(WWSetEntVarClient_Struct) + message_len + message_len2); + WWSetEntVarClient_Struct* WWSC = (WWSetEntVarClient_Struct*) pack->pBuffer; + strn0cpy(WWSC->variable_name, variable_name, 256); + strn0cpy(WWSC->variable_value, variable_value, 256); + WWSC->min_status = min_status; + WWSC->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideSetEntityVariableNPC(const char *variable_name, const char *variable_value) { + uint32 message_len = strlen(variable_name) + 1; + uint32 message_len2 = strlen(variable_value) + 1; + auto pack = new ServerPacket(ServerOP_WWSetEntityVariableNPC, sizeof(WWSetEntVarNPC_Struct) + message_len + message_len2); + WWSetEntVarNPC_Struct* WWSN = (WWSetEntVarNPC_Struct*) pack->pBuffer; + strn0cpy(WWSN->variable_name, variable_name, 256); + strn0cpy(WWSN->variable_value, variable_value, 256); + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideSignalClient(uint32 signal, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWSignalClient, sizeof(WWSignalClient_Struct)); + WWSignalClient_Struct* WWSC = (WWSignalClient_Struct*) pack->pBuffer; + WWSC->signal = signal; + WWSC->min_status = min_status; + WWSC->max_status = max_status; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideSignalNPC(uint32 signal) { + auto pack = new ServerPacket(ServerOP_WWSignalNPC, sizeof(WWSignalNPC_Struct)); + WWSignalNPC_Struct* WWSN = (WWSignalNPC_Struct*) pack->pBuffer; + WWSN->signal = signal; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void QuestManager::WorldWideUpdateActivity(uint32 task_id, int activity_id, int activity_count, uint8 min_status, uint8 max_status) { + auto pack = new ServerPacket(ServerOP_WWUpdateActivity, sizeof(WWUpdateActivity_Struct)); + WWUpdateActivity_Struct* WWUA = (WWUpdateActivity_Struct*) pack->pBuffer; + WWUA->task_id = task_id; + WWUA->activity_id = activity_id; + WWUA->activity_count = activity_count; + WWUA->min_status = min_status; + WWUA->max_status = max_status; worldserver.SendPacket(pack); safe_delete(pack); } @@ -3210,7 +4161,16 @@ Mob *QuestManager::GetOwner() const { return nullptr; } -EQEmu::ItemInstance *QuestManager::GetQuestItem() const { +EQ::InventoryProfile *QuestManager::GetInventory() const { + if(!quests_running_.empty()) { + running_quest e = quests_running_.top(); + return &e.initiator->GetInv(); + } + + return nullptr; +} + +EQ::ItemInstance *QuestManager::GetQuestItem() const { if(!quests_running_.empty()) { running_quest e = quests_running_.top(); return e.questitem; @@ -3299,3 +4259,376 @@ void QuestManager::UpdateZoneHeader(std::string type, std::string value) { entity_list.QueueClients(0, outapp); safe_delete(outapp); } + +EQ::ItemInstance *QuestManager::CreateItem(uint32 item_id, int16 charges, uint32 augment_one, uint32 augment_two, uint32 augment_three, uint32 augment_four, uint32 augment_five, uint32 augment_six, bool attuned) const { + if (database.GetItem(item_id)) { + return database.CreateItem(item_id, charges, augment_one, augment_two, augment_three, augment_four, augment_five, augment_six, attuned); + } + return nullptr; +} + +std::string QuestManager::secondstotime(int duration) { + int timer_length = duration; + int hours = int(timer_length / 3600); + timer_length %= 3600; + int minutes = int(timer_length / 60); + timer_length %= 60; + int seconds = timer_length; + std::string time_string = "Unknown"; + std::string hour_string = (hours == 1 ? "Hour" : "Hours"); + std::string minute_string = (minutes == 1 ? "Minute" : "Minutes"); + std::string second_string = (seconds == 1 ? "Second" : "Seconds"); + if (hours > 0 && minutes > 0 && seconds > 0) { + time_string = fmt::format("{} {}, {} {}, and {} {}", hours, hour_string, minutes, minute_string, seconds, second_string); + } else if (hours > 0 && minutes > 0 && seconds == 0) { + time_string = fmt::format("{} {} and {} {}", hours, hour_string, minutes, minute_string); + } else if (hours > 0 && minutes == 0 && seconds > 0) { + time_string = fmt::format("{} {} and {} {}", hours, hour_string, seconds, second_string); + } else if (hours > 0 && minutes == 0 && seconds == 0) { + time_string = fmt::format("{} {}", hours, hour_string); + } else if (hours == 0 && minutes > 0 && seconds > 0) { + time_string = fmt::format("{} {} and {} {}", minutes, minute_string, seconds, second_string); + } else if (hours == 0 && minutes > 0 && seconds == 0) { + time_string = fmt::format("{} {}", minutes, minute_string); + } else if (hours == 0 && minutes == 0 && seconds > 0) { + time_string = fmt::format("{} {}", seconds, second_string); + } + return time_string; +} + +std::string QuestManager::gethexcolorcode(std::string color_name) { + static const std::map colors = { + { "Black", "#000000" }, + { "Brown", "#804000" }, + { "Burgundy", "#800000" }, + { "Cadet Blue", "#77BFC7" }, + { "Cadet Blue1", "#4C787E" }, + { "Chartreuse", "#8AFB17" }, + { "Chartreuse1", "#7FE817" }, + { "Chartreuse2", "#6CC417" }, + { "Chartreuse3", "#437C17" }, + { "Chocolate", "#C85A17" }, + { "Coral", "#F76541" }, + { "Coral1", "#E55B3C" }, + { "Coral2", "#C34A2C" }, + { "Cornflower Blue", "#151B8D" }, + { "Cyan", "#00FFFF" }, + { "Cyan1", "#57FEFF" }, + { "Cyan2", "#50EBEC" }, + { "Cyan3", "#46C7C7" }, + { "Cyan4", "#307D7E" }, + { "Dark Blue", "#0000A0" }, + { "Dark Goldenrod", "#AF7817" }, + { "Dark Goldenrod1", "#FBB117" }, + { "Dark Goldenrod2", "#E8A317" }, + { "Dark Goldenrod3", "#C58917" }, + { "Dark Goldenrod4", "#7F5217" }, + { "Dark Green", "#254117" }, + { "Dark Grey", "#808080" }, + { "Dark Olive Green", "#CCFB5D" }, + { "Dark Olive Green2", "#BCE954" }, + { "Dark Olive Green3", "#A0C544" }, + { "Dark Olive Green4", "#667C26" }, + { "Dark Orange", "#F88017" }, + { "Dark Orange1", "#F87217" }, + { "Dark Orange2", "#E56717" }, + { "Dark Orange3", "#7E3117" }, + { "Dark Orange3", "#C35617" }, + { "Dark Orchid", "#7D1B7E" }, + { "Dark Orchid1", "#B041FF" }, + { "Dark Orchid2", "#A23BEC" }, + { "Dark Orchid3", "#8B31C7" }, + { "Dark Orchid4", "#571B7e" }, + { "Dark Purple", "#800080" }, + { "Dark Salmon", "#E18B6B" }, + { "Dark Sea Green", "#8BB381" }, + { "Dark Sea Green1", "#C3FDB8" }, + { "Dark Sea Green2", "#B5EAAA" }, + { "Dark Sea Green3", "#99C68E" }, + { "Dark Sea Green4", "#617C58" }, + { "Dark Slate Blue", "#2B3856" }, + { "Dark Slate Gray", "#25383C" }, + { "Dark Slate Gray1", "#9AFEFF" }, + { "Dark Slate Gray2", "#8EEBEC" }, + { "Dark Slate Gray3", "#78c7c7" }, + { "Dark Slate Gray4", "#4C7D7E" }, + { "Dark Turquoise", "#3B9C9C" }, + { "Dark Violet", "#842DCE" }, + { "Deep Pink", "#F52887" }, + { "Deep Pink1", "#E4287C" }, + { "Deep Pink2", "#C12267" }, + { "Deep Pink3", "#7D053F" }, + { "Deep Sky Blue", "#3BB9FF" }, + { "Deep Sky Blue1", "#38ACEC" }, + { "Deep Sky Blue2", "#3090C7" }, + { "Deep Sky Blue3", "#25587E" }, + { "Dim Gray", "#463E41" }, + { "Dodger Blue", "#1589FF" }, + { "Dodger Blue1", "#157DEC" }, + { "Dodger Blue2", "#1569C7" }, + { "Dodger Blue3", "#153E7E" }, + { "Firebrick", "#800517" }, + { "Firebrick1", "#F62817" }, + { "Firebrick2", "#E42217" }, + { "Firebrick3", "#C11B17" }, + { "Forest Green", "#4E9258" }, + { "Forest Green1", "#808000" }, + { "Gold", "#D4A017" }, + { "Gold1", "#FDD017" }, + { "Gold2", "#EAC117" }, + { "Gold3", "#C7A317" }, + { "Gold4", "#806517" }, + { "Goldenrod", "#EDDA74" }, + { "Goldenrod1", "#FBB917" }, + { "Goldenrod2", "#E9AB17" }, + { "Goldenrod3", "#C68E17" }, + { "Goldenrod4", "#805817" }, + { "Grass Green", "#408080" }, + { "Gray", "#736F6E" }, + { "Gray1", "#150517" }, + { "Gray2", "#250517" }, + { "Gray3", "#2B1B17" }, + { "Gray4", "#302217" }, + { "Gray5", "#302226" }, + { "Gray6", "#342826" }, + { "Gray7", "#34282C" }, + { "Gray8", "#382D2C" }, + { "Gray9", "#3b3131" }, + { "Gray10", "#3E3535" }, + { "Gray11", "#413839" }, + { "Gray12", "#41383C" }, + { "Gray13", "#463E3F" }, + { "Gray14", "#4A4344" }, + { "Gray15", "#4C4646" }, + { "Gray16", "#4E4848" }, + { "Gray17", "#504A4B" }, + { "Gray18", "#544E4F" }, + { "Gray19", "#565051" }, + { "Gray19", "#595454" }, + { "Gray20", "#5C5858" }, + { "Gray21", "#5F5A59" }, + { "Gray22", "#625D5D" }, + { "Gray23", "#646060" }, + { "Gray24", "#666362" }, + { "Gray25", "#696565" }, + { "Gray26", "#6D6968" }, + { "Gray27", "#6E6A6B" }, + { "Gray28", "#726E6D" }, + { "Gray29", "#747170" }, + { "Green", "#00FF00" }, + { "Green1", "#5FFB17" }, + { "Green2", "#59E817" }, + { "Green3", "#4CC417" }, + { "Green4", "#347C17" }, + { "Green Yellow", "#B1FB17" }, + { "Hot Pink", "#F660AB" }, + { "Hot Pink1", "#F665AB" }, + { "Hot Pink2", "#E45E9D" }, + { "Hot Pink3", "#C25283" }, + { "Hot Pink4", "#7D2252" }, + { "Indian Red", "#F75D59" }, + { "Indian Red2", "#E55451" }, + { "Indian Red3", "#C24641" }, + { "Indian Red4", "#7E2217" }, + { "Khaki", "#ADA96E" }, + { "Khaki1", "#FFF380" }, + { "Khaki2", "#EDE275" }, + { "Khaki3", "#C9BE62" }, + { "Khaki4", "#827839" }, + { "Lavender", "#E3E4FA" }, + { "Lavender Blush", "#FDEEF4" }, + { "Lavender Blush1", "#EBDDE2" }, + { "Lavender Blush2", "#C8BBBE" }, + { "Lavender Blush3", "#817679" }, + { "Lawn Green", "#87F717" }, + { "Lemon Chiffon", "#FFF8C6" }, + { "Lemon Chiffon1", "#ECE5B6" }, + { "Lemon Chiffon2", "#C9C299" }, + { "Lemon Chiffon3", "#827B60" }, + { "Light Blue", "#0000FF" }, + { "Light Blue1", "#ADDFFF" }, + { "Light Blue2", "#BDEDFF" }, + { "Light Blue3", "#AFDCEC" }, + { "Light Blue4", "#95B9C7" }, + { "Light Blue5", "#5E767E" }, + { "Light Coral", "#E77471" }, + { "Light Cyan", "#E0FFFF" }, + { "Light Cyan1", "#CFECEC" }, + { "Light Cyan2", "#AFC7C7" }, + { "Light Cyan3", "#717D7D" }, + { "Light Golden", "#ECD672" }, + { "Light Goldenrod", "#ECD872" }, + { "Light Goldenrod1", "#FFE87C" }, + { "Light Goldenrod2", "#C8B560" }, + { "Light Goldenrod3", "#817339" }, + { "Light Goldenrod Yellow", "#FAF8CC" }, + { "Light Grey", "#C0C0C0" }, + { "Light Pink", "#FAAFBA" }, + { "Light Pink1", "#F9A7B0" }, + { "Light Pink2", "#E799A3" }, + { "Light Pink3", "#C48189" }, + { "Light Pink4", "#7F4E52" }, + { "Light Purple", "#FF0080" }, + { "Light Salmon", "#F9966B" }, + { "Light Salmon1", "#E78A61" }, + { "Light Salmon2", "#C47451" }, + { "Light Salmon3", "#7F462C" }, + { "Light Sea Green", "#3EA99F" }, + { "Light Sky Blue", "#82CAFA" }, + { "Light Sky Blue1", "#A0CFEC" }, + { "Light Sky Blue2", "#87AFC7" }, + { "Light Sky Blue3", "#566D7E" }, + { "Light Slate Blue", "#736AFF" }, + { "Light Slate Gray", "#6D7B8D" }, + { "Light Steel Blue", "#728FCE" }, + { "Light Steel Blue1", "#C6DEFF" }, + { "Light Steel Blue2", "#B7CEEC" }, + { "Light Steel Blue3", "#646D7E" }, + { "Lime Green", "#41A317" }, + { "Magenta", "#FF00FF" }, + { "Magenta1", "#F433FF" }, + { "Magenta2", "#E238EC" }, + { "Magenta3", "#C031C7" }, + { "Maroon", "#810541" }, + { "Maroon1", "#F535AA" }, + { "Maroon2", "#E3319D" }, + { "Maroon3", "#C12283" }, + { "Maroon4", "#7D0552" }, + { "Medium Aquamarine", "#348781" }, + { "Medium Forest Green", "#347235" }, + { "Medium Orchid", "#B048B5" }, + { "Medium Orchid1", "#D462FF" }, + { "Medium Orchid2", "#C45AEC" }, + { "Medium Orchid3", "#A74AC7" }, + { "Medium Orchid4", "#6A287E" }, + { "Medium Purple", "#8467D7" }, + { "Medium Purple1", "#9E7BFF" }, + { "Medium Purple2", "#9172EC" }, + { "Medium Purple3", "#7A5DC7" }, + { "Medium Purple4", "#4E387E" }, + { "Medium Sea Green", "#306754" }, + { "Medium Slate Blue", "#5E5A80" }, + { "Medium Spring Green", "#348017" }, + { "Medium Turquoise", "#48CCCD" }, + { "Medium Violet Red", "#CA226B" }, + { "Midnight Blue", "#151B54" }, + { "Orange", "#FF8040" }, + { "Pale Turquoise", "#92C7C7" }, + { "Pale Turquoise1", "#5E7D7E" }, + { "Pale Violet Red", "#D16587" }, + { "Pale Violet Red1", "#F778A1" }, + { "Pale Violet Red2", "#E56E94" }, + { "Pale Violet Red3", "#C25A7C" }, + { "Pale Violet Red4", "#7E354D" }, + { "Pastel Green", "#00FF00" }, + { "Pink", "#FAAFBE" }, + { "Pink1", "#FF00FF" }, + { "Pink2", "#E7A1B0" }, + { "Pink3", "#C48793" }, + { "Pink4", "#7F525D" }, + { "Plum", "#B93B8F" }, + { "Plum1", "#F9B7FF" }, + { "Plum2", "#E6A9EC" }, + { "Plum3", "#C38EC7" }, + { "Plum4", "#7E587E" }, + { "Purple", "#8E35EF" }, + { "Purple1", "#893BFF" }, + { "Purple2", "#7F38EC" }, + { "Purple3", "#6C2DC7" }, + { "Purple4", "#461B7E" }, + { "Red", "#FF0000" }, + { "Red1", "#F62217" }, + { "Red2", "#E41B17" }, + { "Rosy Brown", "#B38481" }, + { "Rosy Brown1", "#FBBBB9" }, + { "Rosy Brown2", "#E8ADAA" }, + { "Rosy Brown3", "#C5908E" }, + { "Rosy Brown4", "#7F5A58" }, + { "Royal Blue", "#2B60DE" }, + { "Royal Blue1", "#306EFF" }, + { "Royal Blue2", "#2B65EC" }, + { "Royal Blue3", "#2554C7" }, + { "Royal Blue4", "#15317E" }, + { "Salmon1", "#F88158" }, + { "Salmon2", "#E67451" }, + { "Salmon3", "#C36241" }, + { "Salmon4", "#7E3817" }, + { "Sandy Brown", "#EE9A4D" }, + { "Sea Green", "#4E8975" }, + { "Sea Green1", "#6AFB92" }, + { "Sea Green2", "#64E986" }, + { "Sea Green3", "#54C571" }, + { "Sea Green4", "#387C44" }, + { "Sienna", "#8A4117" }, + { "Sienna1", "#F87431" }, + { "Sienna2", "#E66C2C" }, + { "Sienna3", "#C35817" }, + { "Sienna4", "#7E3517" }, + { "Sky Blue", "#82CAFF" }, + { "Sky Blue1", "#6698FF" }, + { "Sky Blue2", "#79BAEC" }, + { "Sky Blue3", "#659EC7" }, + { "Sky Blue4", "#41627E" }, + { "Slate Blue", "#357EC7" }, + { "Slate Blue1", "#737CA1" }, + { "Slate Blue2", "#6960EC" }, + { "Slate Blue3", "#342D7E" }, + { "Slate Gray", "#657383" }, + { "Slate Gray1", "#C2DFFF" }, + { "Slate Gray2", "#B4CFEC" }, + { "Slate Gray3", "#98AFC7" }, + { "Slate Gray4", "#616D7E" }, + { "Spring Green", "#4AA02C" }, + { "Spring Green1", "#5EFB6E" }, + { "Spring Green2", "#57E964" }, + { "Spring Green3", "#4CC552" }, + { "Spring Green4", "#347C2C" }, + { "Steel Blue", "#4863A0" }, + { "Steel Blue1", "#5CB3FF" }, + { "Steel Blue2", "#56A5EC" }, + { "Steel Blue3", "#488AC7" }, + { "Steel Blue4", "#2B547E" }, + { "Thistle", "#D2B9D3" }, + { "Thistle1", "#FCDFFF" }, + { "Thistle2", "#E9CFEC" }, + { "Thistle3", "#C6AEC7" }, + { "Thistle4", "#806D7E" }, + { "Turquoise", "#00FFFF" }, + { "Turquoise1", "#43C6DB" }, + { "Turquoise2", "#52F3FF" }, + { "Turquoise3", "#4EE2EC" }, + { "Turquoise4", "#43BFC7" }, + { "Violet", "#8D38C9" }, + { "Violet Red", "#F6358A" }, + { "Violet Red1", "#F6358A" }, + { "Violet Red2", "#E4317F" }, + { "Violet Red3", "#C12869" }, + { "Violet Red4", "#7D0541" }, + { "White", "#FFFFFF" }, + { "Yellow", "#FFFF00" }, + { "Yellow1", "#FFFC17" }, + { "Yellow Green", "#52D017" } + }; + for (auto color : colors) { + if (!strcasecmp(color.first.c_str(), color_name.c_str())) { + return color.second; + } + } + + return std::string(); +} + +double QuestManager::GetAAEXPModifierByCharID(uint32 character_id, uint32 zone_id) const { + return database.GetAAEXPModifier(character_id, zone_id); +} +double QuestManager::GetEXPModifierByCharID(uint32 character_id, uint32 zone_id) const { + return database.GetEXPModifier(character_id, zone_id); +} + +void QuestManager::SetAAEXPModifierByCharID(uint32 character_id, uint32 zone_id, double aa_modifier) { + database.SetAAEXPModifier(character_id, zone_id, aa_modifier); +} + +void QuestManager::SetEXPModifierByCharID(uint32 character_id, uint32 zone_id, double exp_modifier) { + database.SetEXPModifier(character_id, zone_id, exp_modifier); +} diff --git a/zone/questmgr.h b/zone/questmgr.h index 2aa1df109..95166886f 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -28,7 +28,7 @@ class Client; class Mob; class NPC; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -37,7 +37,7 @@ class QuestManager { struct running_quest { Mob *owner; Client *initiator; - EQEmu::ItemInstance* questitem; + EQ::ItemInstance* questitem; bool depop_npc; std::string encounter; }; @@ -51,7 +51,7 @@ public: QuestManager(); virtual ~QuestManager(); - void StartQuest(Mob *_owner, Client *_initiator = nullptr, EQEmu::ItemInstance* _questitem = nullptr, std::string encounter = ""); + void StartQuest(Mob *_owner, Client *_initiator = nullptr, EQ::ItemInstance* _questitem = nullptr, std::string encounter = ""); void EndQuest(); bool QuestsRunning() { return !quests_running_.empty(); } @@ -65,6 +65,7 @@ public: void say(const char *str, Journal::Options &opts); void me(const char *str); void summonitem(uint32 itemid, int16 charges = -1); + EQ::ItemInstance* CreateItem(uint32 item_id, int16 charges = 0, uint32 augment_one = 0, uint32 augment_two = 0, uint32 augment_three = 0, uint32 augment_four = 0, uint32 augment_five = 0, uint32 augment_six = 0, bool attuned = false) const; void write(const char *file, const char *str); Mob* spawn2(int npc_type, int grid, int unused, const glm::vec4& position); Mob* unique_spawn(int npc_type, int grid, int unused, const glm::vec4& position); @@ -77,15 +78,17 @@ public: void selfcast(int spell_id); void addloot(int item_id, int charges = 0, bool equipitem = true, int aug1 = 0, int aug2 = 0, int aug3 = 0, int aug4 = 0, int aug5 = 0, int aug6 = 0); void Zone(const char *zone_name); + void ZoneGroup(const char *zone_name); + void ZoneRaid(const char *zone_name); void settimer(const char *timer_name, int seconds); void settimerMS(const char *timer_name, int milliseconds); - void settimerMS(const char *timer_name, int milliseconds, EQEmu::ItemInstance *inst); + void settimerMS(const char *timer_name, int milliseconds, EQ::ItemInstance *inst); void settimerMS(const char *timer_name, int milliseconds, Mob *mob); void stoptimer(const char *timer_name); - void stoptimer(const char *timer_name, EQEmu::ItemInstance *inst); + void stoptimer(const char *timer_name, EQ::ItemInstance *inst); void stoptimer(const char *timer_name, Mob *mob); void stopalltimers(); - void stopalltimers(EQEmu::ItemInstance *inst); + void stopalltimers(EQ::ItemInstance *inst); void stopalltimers(Mob *mob); void pausetimer(const char *timer_name); void resumetimer(const char *timer_name); @@ -99,6 +102,7 @@ public: void depopall(int npc_type = 0); void depopzone(bool StartSpawnTimer = true); void repopzone(); + void processmobswhilezoneempty(bool on); void settarget(const char *type, int target_id); void follow(int entity_id, int distance); void sfollow(); @@ -107,6 +111,9 @@ public: void level(int newlevel); void traindisc(int discipline_tome_item_id); bool isdisctome(int item_id); + std::string getracename(uint16 race_id); + std::string getspellname(uint32 spell_id); + std::string getskillname(int skill_id); void safemove(); void rain(int weather); void snow(int weather); @@ -144,7 +151,8 @@ public: void targlobal(const char *varname, const char *value, const char *duration, int npcid, int charid, int zoneid); void delglobal(const char *varname); void ding(); - void rebind(int zoneid, const glm::vec3& location); + void rebind(int zone_id, const glm::vec3& location); + void rebind(int zone_id, const glm::vec4& location); void start(int wp); void stop(); void pause(int duration); @@ -213,12 +221,18 @@ public: int activetasksinset(int taskset); int completedtasksinset(int taskset); bool istaskappropriate(int task); + std::string gettaskname(uint32 task_id); void clearspawntimers(); void ze(int type, const char *str); void we(int type, const char *str); + void message(int color, const char *message); + void whisper(const char *message); int getlevel(uint8 type); int collectitems(uint32 item_id, bool remove); int collectitems_processSlot(int16 slot_id, uint32 item_id, bool remove); + int countitem(uint32 item_id); + void removeitem(uint32 item_id, uint32 quantity = 1); + std::string getitemname(uint32 item_id); void enabletitle(int titleset); bool checktitle(int titlecheck); void removetitle(int titlecheck); @@ -242,6 +256,7 @@ public: void AssignRaidToInstance(uint16 instance_id); void RemoveFromInstance(uint16 instance_id); void RemoveFromInstanceByCharID(uint16 instance_id, uint32 char_id); + bool CheckInstanceByCharID(uint16 instance_id, uint32 char_id); //void RemoveGroupFromInstance(uint16 instance_id); //potentially useful but not implmented at this time. //void RemoveRaidFromInstance(uint16 instance_id); //potentially useful but not implmented at this time. void RemoveAllFromInstance(uint16 instance_id); @@ -250,9 +265,15 @@ public: void FlagInstanceByRaidLeader(uint32 zone, int16 version); const char* varlink(char* perltext, int item_id); std::string saylink(char *saylink_text, bool silent, const char *link_name); + std::string getcharnamebyid(uint32 char_id); + uint32 getcharidbyname(const char* name); + std::string getclassname(uint8 class_id, uint8 level = 0); + int getcurrencyid(uint32 item_id); + int getcurrencyitemid(int currency_id); const char* getguildnamebyid(int guild_id); int getguildidbycharid(uint32 char_id); int getgroupidbycharid(uint32 char_id); + std::string getnpcnamebyid(uint32 npc_id); int getraididbycharid(uint32 char_id); void SetRunning(bool val); bool IsRunning(); @@ -264,23 +285,105 @@ public: void SendMail(const char *to, const char *from, const char *subject, const char *message); uint16 CreateDoor( const char* model, float x, float y, float z, float heading, uint8 opentype, uint16 size); int32 GetZoneID(const char *zone); - const char *GetZoneLongName(const char *zone); - void CrossZoneSignalPlayerByCharID(int charid, uint32 data); - void CrossZoneSignalNPCByNPCTypeID(uint32 npctype_id, uint32 data); - void CrossZoneSignalPlayerByName(const char *CharName, uint32 data); - void CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *id, const char *m_var); - void CrossZoneSetEntityVariableByClientName(const char *CharName, const char *id, const char *m_var); - void CrossZoneMessagePlayerByName(uint32 Type, const char *CharName, const char *Message); - void WorldWideMarquee(uint32 Type, uint32 Priority, uint32 FadeIn, uint32 FadeOut, uint32 Duration, const char *Message); + static std::string GetZoneLongName(std::string zone_short_name); + static std::string GetZoneLongNameByID(uint32 zone_id); + static std::string GetZoneShortName(uint32 zone_id); + void CrossZoneAssignTaskByCharID(int character_id, uint32 task_id, bool enforce_level_requirement = false); + void CrossZoneAssignTaskByGroupID(int group_id, uint32 task_id, bool enforce_level_requirement = false); + void CrossZoneAssignTaskByRaidID(int raid_id, uint32 task_id, bool enforce_level_requirement = false); + void CrossZoneAssignTaskByGuildID(int guild_id, uint32 task_id, bool enforce_level_requirement = false); + void CrossZoneCastSpellByCharID(int character_id, uint32 spell_id); + void CrossZoneCastSpellByGroupID(int group_id, uint32 spell_id); + void CrossZoneCastSpellByRaidID(int raid_id, uint32 spell_id); + void CrossZoneCastSpellByGuildID(int guild_id, uint32 spell_id); + void CrossZoneDisableTaskByCharID(int character_id, uint32 task_id); + void CrossZoneDisableTaskByGroupID(int group_id, uint32 task_id); + void CrossZoneDisableTaskByRaidID(int raid_id, uint32 task_id); + void CrossZoneDisableTaskByGuildID(int guild_id, uint32 task_id); + void CrossZoneEnableTaskByCharID(int character_id, uint32 task_id); + void CrossZoneEnableTaskByGroupID(int group_id, uint32 task_id); + void CrossZoneEnableTaskByRaidID(int raid_id, uint32 task_id); + void CrossZoneEnableTaskByGuildID(int guild_id, uint32 task_id); + void CrossZoneFailTaskByCharID(int character_id, uint32 task_id); + void CrossZoneFailTaskByGroupID(int group_id, uint32 task_id); + void CrossZoneFailTaskByRaidID(int raid_id, uint32 task_id); + void CrossZoneFailTaskByGuildID(int guild_id, uint32 task_id); + void CrossZoneMarqueeByCharID(int character_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message); + void CrossZoneMarqueeByGroupID(int group_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message); + void CrossZoneMarqueeByRaidID(int raid_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message); + void CrossZoneMarqueeByGuildID(int guild_id, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message); + void CrossZoneMessagePlayerByName(uint32 type, const char *character_name, const char *message); + void CrossZoneMessagePlayerByGroupID(uint32 type, int group_id, const char *message); + void CrossZoneMessagePlayerByRaidID(uint32 type, int raid_id, const char *message); + void CrossZoneMessagePlayerByGuildID(uint32 type, int guild_id, const char *message); + void CrossZoneMovePlayerByCharID(int character_id, const char *zone_short_name); + void CrossZoneMovePlayerByGroupID(int group_id, const char *zone_short_name); + void CrossZoneMovePlayerByRaidID(int raid_id, const char *zone_short_name); + void CrossZoneMovePlayerByGuildID(int guild_id, const char *zone_short_name); + void CrossZoneMoveInstanceByCharID(int character_id, uint16 instance_id); + void CrossZoneMoveInstanceByGroupID(int group_id, uint16 instance_id); + void CrossZoneMoveInstanceByRaidID(int raid_id, uint16 instance_id); + void CrossZoneMoveInstanceByGuildID(int guild_id, uint16 instance_id); + void CrossZoneRemoveSpellByCharID(int character_id, uint32 spell_id); + void CrossZoneRemoveSpellByGroupID(int group_id, uint32 spell_id); + void CrossZoneRemoveSpellByRaidID(int raid_id, uint32 spell_id); + void CrossZoneRemoveSpellByGuildID(int guild_id, uint32 spell_id); + void CrossZoneRemoveTaskByCharID(int character_id, uint32 task_id); + void CrossZoneRemoveTaskByGroupID(int group_id, uint32 task_id); + void CrossZoneRemoveTaskByRaidID(int raid_id, uint32 task_id); + void CrossZoneRemoveTaskByGuildID(int guild_id, uint32 task_id); + void CrossZoneResetActivityByCharID(int character_id, uint32 task_id, int activity_id); + void CrossZoneResetActivityByGroupID(int group_id, uint32 task_id, int activity_id); + void CrossZoneResetActivityByRaidID(int raid_id, uint32 task_id, int activity_id); + void CrossZoneResetActivityByGuildID(int guild_id, uint32 task_id, int activity_id); + void CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *variable_name, const char *variable_value); + void CrossZoneSetEntityVariableByClientName(const char *character_name, const char *variable_name, const char *variable_value); + void CrossZoneSetEntityVariableByGroupID(int group_id, const char *variable_name, const char *variable_value); + void CrossZoneSetEntityVariableByRaidID(int raid_id, const char *variable_name, const char *variable_value); + void CrossZoneSetEntityVariableByGuildID(int guild_id, const char *variable_name, const char *variable_value); + void CrossZoneSignalPlayerByCharID(int charid, uint32 signal); + void CrossZoneSignalPlayerByGroupID(int group_id, uint32 signal); + void CrossZoneSignalPlayerByRaidID(int raid_id, uint32 signal); + void CrossZoneSignalPlayerByGuildID(int guild_id, uint32 signal); + void CrossZoneSignalNPCByNPCTypeID(uint32 npctype_id, uint32 signal); + void CrossZoneSignalPlayerByName(const char *character_name, uint32 signal); + void CrossZoneUpdateActivityByCharID(int character_id, uint32 task_id, int activity_id, int activity_count = 1); + void CrossZoneUpdateActivityByGroupID(int group_id, uint32 task_id, int activity_id, int activity_count = 1); + void CrossZoneUpdateActivityByRaidID(int raid_id, uint32 task_id, int activity_id, int activity_count = 1); + void CrossZoneUpdateActivityByGuildID(int guild_id, uint32 task_id, int activity_id, int activity_count = 1); + void WorldWideAssignTask(uint32 task_id, bool enforce_level_requirement = false, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideCastSpell(uint32 spell_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideDisableTask(uint32 task_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideEnableTask(uint32 task_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideFailTask(uint32 task_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideMarquee(uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char *message, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideMessage(uint32 type, const char *message, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideMove(const char *zone_short_name, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideMoveInstance(uint16 instance_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideRemoveSpell(uint32 spell_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideRemoveTask(uint32 task_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideResetActivity(uint32 task_id, int activity_id, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideSetEntityVariableClient(const char *variable_name, const char *variable_value, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideSetEntityVariableNPC(const char *variable_name, const char *variable_value); + void WorldWideSignalClient(uint32 signal, uint8 min_status = 0, uint8 max_status = 0); + void WorldWideSignalNPC(uint32 signal); + void WorldWideUpdateActivity(uint32 task_id, int activity_id, int activity_count = 1, uint8 min_status = 0, uint8 max_status = 0); bool EnableRecipe(uint32 recipe_id); bool DisableRecipe(uint32 recipe_id); void ClearNPCTypeCache(int npctype_id); void ReloadZoneStaticData(); + std::string secondstotime(int duration); + std::string gethexcolorcode(std::string color_name); + double GetAAEXPModifierByCharID(uint32 character_id, uint32 zone_id) const; + double GetEXPModifierByCharID(uint32 character_id, uint32 zone_id) const; + void SetAAEXPModifierByCharID(uint32 character_id, uint32 zone_id, double aa_modifier); + void SetEXPModifierByCharID(uint32 character_id, uint32 zone_id, double exp_modifier); Client *GetInitiator() const; NPC *GetNPC() const; Mob *GetOwner() const; - EQEmu::ItemInstance *GetQuestItem() const; + EQ::InventoryProfile* GetInventory() const; + EQ::ItemInstance *GetQuestItem() const; std::string GetEncounter() const; inline bool ProximitySayInUse() { return HaveProximitySays; } diff --git a/zone/raid.h b/zone/raid.h deleted file mode 100644 index fad4b9fa2..000000000 --- a/zone/raid.h +++ /dev/null @@ -1,161 +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 */ - -/* Parser needs these defines always, even if USE_RAID is not defined */ -#define RAID_TYPE_0 1 /* Striping */ -#define RAID_TYPE_x 2 /* Some new modes */ -#define RAID_TYPE_y 3 - -#define RAID_DEFAULT_CHUNKS 4 -#define RAID_DEFAULT_CHUNKSIZE 256*1024 /* 256kB */ - -extern const char *raid_type_string[]; - -#ifdef __cplusplus -extern "C" { -#endif -const char *my_raid_type(int raid_type); -#ifdef __cplusplus -} -#endif - -#if defined(USE_RAID) && !defined(DONT_USE_RAID) - -#ifdef __GNUC__ -#pragma interface /* gcc class implementation */ -#endif -#include "my_dir.h" - -/* Trap all occurences of my_...() in source and use our wrapper around this function */ - -#ifdef MAP_TO_USE_RAID -#define my_read(A,B,C,D) my_raid_read(A,B,C,D) -#define my_write(A,B,C,D) my_raid_write(A,B,C,D) -#define my_pwrite(A,B,C,D,E) my_raid_pwrite(A,B,C,D,E) -#define my_pread(A,B,C,D,E) my_raid_pread(A,B,C,D,E) -#define my_chsize(A,B,C) my_raid_chsize(A,B,C) -#define my_close(A,B) my_raid_close(A,B) -#define my_tell(A,B) my_raid_tell(A,B) -#define my_seek(A,B,C,D) my_raid_seek(A,B,C,D) -#define my_lock(A,B,C,D,E) my_raid_lock(A,B,C,D,E) -#define my_fstat(A,B,C) my_raid_fstat(A,B,C) -#endif /* MAP_TO_USE_RAID */ - -#ifdef __cplusplus -extern "C" { -#endif - -void init_raid(void); -void end_raid(void); - -bool is_raid(File fd); -File my_raid_create(const char *FileName, int CreateFlags, int access_flags, - uint raid_type, uint raid_chunks, ulong raid_chunksize, - myf MyFlags); -File my_raid_open(const char *FileName, int Flags, - uint raid_type, uint raid_chunks, ulong raid_chunksize, - myf MyFlags); -int my_raid_rename(const char *from, const char *to, uint raid_chunks, - myf MyFlags); -int my_raid_delete(const char *from, uint raid_chunks, myf MyFlags); -int my_raid_redel(const char *old_name, const char *new_name, - uint raid_chunks, myf MyFlags); - -my_off_t my_raid_seek(File fd, my_off_t pos, int whence, myf MyFlags); -my_off_t my_raid_tell(File fd, myf MyFlags); - -uint my_raid_write(File,const byte *Buffer, uint Count, myf MyFlags); -uint my_raid_read(File Filedes, byte *Buffer, uint Count, myf MyFlags); - -uint my_raid_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset, - myf MyFlags); -uint my_raid_pwrite(int Filedes, const byte *Buffer, uint Count, - my_off_t offset, myf MyFlags); - -int my_raid_lock(File,int locktype, my_off_t start, my_off_t length, - myf MyFlags); -int my_raid_chsize(File fd, my_off_t newlength, myf MyFlags); -int my_raid_close(File, myf MyFlags); -int my_raid_fstat(int Filedes, struct stat *buf, myf MyFlags); - -#ifdef __cplusplus -} - -class RaidName { - public: - RaidName(const char *FileName); - ~RaidName(); - bool IsRaid(); - int Rename(const char * from, const char * to, myf MyFlags); - private: - uint _raid_type; /* RAID_TYPE_0 or RAID_TYPE_1 or RAID_TYPE_5 */ - uint _raid_chunks; /* 1..n */ - ulong _raid_chunksize; /* 1..n in bytes */ -}; - -class RaidFd { - public: - RaidFd(uint raid_type, uint raid_chunks , ulong raid_chunksize); - ~RaidFd(); - File Create(const char *FileName, int CreateFlags, int access_flags, - myf MyFlags); - File Open(const char *FileName, int Flags, myf MyFlags); - my_off_t Seek(my_off_t pos,int whence,myf MyFlags); - my_off_t Tell(myf MyFlags); - int Write(const byte *Buffer, uint Count, myf MyFlags); - int Read(const byte *Buffer, uint Count, myf MyFlags); - int Lock(int locktype, my_off_t start, my_off_t length, myf MyFlags); - int Chsize(File fd, my_off_t newlength, myf MyFlags); - int Fstat(int fd, MY_STAT *stat_area, myf MyFlags ); - int Close(myf MyFlags); - static bool IsRaid(File fd); - static DYNAMIC_ARRAY _raid_map; /* Map of RaidFD* */ - private: - - uint _raid_type; /* RAID_TYPE_0 or RAID_TYPE_1 or RAID_TYPE_5 */ - uint _raid_chunks; /* 1..n */ - ulong _raid_chunksize; /* 1..n in bytes */ - - ulong _total_block; /* We are operating with block no x (can be 0..many). */ - uint _this_block; /* can be 0.._raid_chunks */ - uint _remaining_bytes; /* Maximum bytes that can be written in this block */ - - my_off_t _position; - my_off_t _size; /* Cached file size for faster seek(SEEK_END) */ - File _fd; - File *_fd_vector; /* Array of File */ - off_t *_seek_vector; /* Array of cached seek positions */ - - inline void Calculate() - { - DBUG_ENTER("RaidFd::_Calculate"); - DBUG_PRINT("info",("_position: %lu _raid_chunksize: %d, _size: %lu", - (ulong) _position, _raid_chunksize, (ulong) _size)); - - _total_block = (ulong) (_position / _raid_chunksize); - _this_block = _total_block % _raid_chunks; /* can be 0.._raid_chunks */ - _remaining_bytes = (uint) (_raid_chunksize - (_position - _total_block * _raid_chunksize)); - DBUG_PRINT("info", - ("_total_block: %d this_block: %d _remaining_bytes:%d", - _total_block, _this_block, _remaining_bytes)); - DBUG_VOID_RETURN; - } -}; - -#endif /* __cplusplus */ -#endif /* USE_RAID */ - diff --git a/zone/raids.cpp b/zone/raids.cpp index a4e1535d3..55e6d9e55 100644 --- a/zone/raids.cpp +++ b/zone/raids.cpp @@ -20,6 +20,7 @@ #include "client.h" #include "entity.h" +#include "expedition.h" #include "groups.h" #include "mob.h" #include "raids.h" @@ -177,6 +178,7 @@ void Raid::RemoveMember(const char *characterName) if(client) { client->SetRaidGrouped(false); client->LeaveRaidXTargets(this); + client->p_raid_instance = nullptr; } auto pack = new ServerPacket(ServerOP_RaidRemove, sizeof(ServerRaidGeneralAction_Struct)); @@ -278,6 +280,8 @@ void Raid::SetRaidLeader(const char *wasLead, const char *name) Client *c = entity_list.GetClientByName(name); if(c) SetLeader(c); + else + SetLeader(nullptr); //sanity check, should never get hit but we want to prefer to NOT crash if we do VerifyRaid and leader never gets set there (raid without a leader?) LearnMembers(); VerifyRaid(); @@ -1078,8 +1082,9 @@ void Raid::SendRaidRemoveAll(const char *who) void Raid::SendRaidDisband(Client *to) { - if(!to) + if (!to) { return; + } auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(RaidGeneral_Struct)); RaidGeneral_Struct *rg = (RaidGeneral_Struct*)outapp->pBuffer; @@ -1547,6 +1552,11 @@ void Raid::VerifyRaid() SetLeader(members[x].member); strn0cpy(leadername, members[x].membername, 64); } + else + { + //should never happen, but maybe it is? + SetLeader(nullptr); + } } } } @@ -1556,6 +1566,11 @@ void Raid::MemberZoned(Client *c) if(!c) return; + if (leader == c) + { + leader = nullptr; + } + // Raid::GetGroup() goes over the members as well, this way we go over once uint32 gid = RAID_GROUPLESS; for(int x = 0; x < MAX_RAID_MEMBERS; x++) @@ -1590,7 +1605,7 @@ void Raid::SendHPManaEndPacketsTo(Client *client) safe_delete_array(hp_packet.pBuffer); hp_packet.size = 0; - if (client->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (client->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobManaUpdate); MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer; @@ -1614,7 +1629,7 @@ void Raid::SendHPManaEndPacketsFrom(Mob *mob) return; uint32 group_id = 0; - + if(mob->IsClient()) group_id = this->GetGroup(mob->CastToClient()); @@ -1622,18 +1637,18 @@ void Raid::SendHPManaEndPacketsFrom(Mob *mob) EQApplicationPacket outapp(OP_MobManaUpdate, sizeof(MobManaUpdate_Struct)); mob->CreateHPPacket(&hpapp); - + for(int x = 0; x < MAX_RAID_MEMBERS; x++) { if(members[x].member) { if(!mob->IsClient() || ((members[x].member != mob->CastToClient()) && (members[x].GroupNumber == group_id))) { members[x].member->QueuePacket(&hpapp, false); - if (members[x].member->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (members[x].member->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobManaUpdate); MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer; mana_update->spawn_id = mob->GetID(); mana_update->mana = mob->GetManaPercent(); members[x].member->QueuePacket(&outapp, false); - + outapp.SetOpcode(OP_MobEnduranceUpdate); MobEnduranceUpdate_Struct *endurance_update = (MobEnduranceUpdate_Struct *)outapp.pBuffer; endurance_update->endurance = mob->GetEndurancePercent(); @@ -1659,7 +1674,7 @@ void Raid::SendManaPacketFrom(Mob *mob) for (int x = 0; x < MAX_RAID_MEMBERS; x++) { if (members[x].member) { if (!mob->IsClient() || ((members[x].member != mob->CastToClient()) && (members[x].GroupNumber == group_id))) { - if (members[x].member->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (members[x].member->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobManaUpdate); MobManaUpdate_Struct *mana_update = (MobManaUpdate_Struct *)outapp.pBuffer; mana_update->spawn_id = mob->GetID(); @@ -1686,7 +1701,7 @@ void Raid::SendEndurancePacketFrom(Mob *mob) for (int x = 0; x < MAX_RAID_MEMBERS; x++) { if (members[x].member) { if (!mob->IsClient() || ((members[x].member != mob->CastToClient()) && (members[x].GroupNumber == group_id))) { - if (members[x].member->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (members[x].member->ClientVersion() >= EQ::versions::ClientVersion::SoD) { outapp.SetOpcode(OP_MobEnduranceUpdate); MobEnduranceUpdate_Struct *endurance_update = (MobEnduranceUpdate_Struct *)outapp.pBuffer; endurance_update->spawn_id = mob->GetID(); @@ -1835,3 +1850,42 @@ void Raid::QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_re } } } + +std::vector Raid::GetMembers() const +{ + std::vector raid_members; + for (int i = 0; i < MAX_RAID_MEMBERS; ++i) + { + if (members[i].membername[0]) + { + raid_members.emplace_back(members[i]); + } + } + return raid_members; +} + +bool Raid::DoesAnyMemberHaveExpeditionLockout( + const std::string& expedition_name, const std::string& event_name, int max_check_count) +{ + auto raid_members = GetMembers(); + + if (max_check_count > 0) + { + // priority is leader, group number, then ungrouped members + std::sort(raid_members.begin(), raid_members.end(), + [&](const RaidMember& lhs, const RaidMember& rhs) { + if (lhs.IsRaidLeader) { + return true; + } else if (rhs.IsRaidLeader) { + return false; + } + return lhs.GroupNumber < rhs.GroupNumber; + }); + + raid_members.resize(max_check_count); + } + + return std::any_of(raid_members.begin(), raid_members.end(), [&](const RaidMember& raid_member) { + return Expedition::HasLockoutByCharacterName(raid_member.membername, expedition_name, event_name); + }); +} diff --git a/zone/raids.h b/zone/raids.h index 26ba90a02..a04d1eb54 100644 --- a/zone/raids.h +++ b/zone/raids.h @@ -239,6 +239,10 @@ public: void QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_required = true, bool ignore_sender = true, float distance = 0, bool group_only = true); + bool DoesAnyMemberHaveExpeditionLockout(const std::string& expedition_name, const std::string& event_name, int max_check_count = 0); + + std::vector GetMembers() const; + RaidMember members[MAX_RAID_MEMBERS]; char leadername[64]; protected: diff --git a/zone/spawn2.cpp b/zone/spawn2.cpp index 3571effe9..b6689d715 100644 --- a/zone/spawn2.cpp +++ b/zone/spawn2.cpp @@ -26,6 +26,7 @@ #include "worldserver.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" extern EntityList entity_list; extern Zone* zone; @@ -69,7 +70,8 @@ CREATE TABLE spawn_events ( Spawn2::Spawn2(uint32 in_spawn2_id, uint32 spawngroup_id, float in_x, float in_y, float in_z, float in_heading, uint32 respawn, uint32 variance, uint32 timeleft, uint32 grid, - uint16 in_cond_id, int16 in_min_value, bool in_enabled, EmuAppearance anim) + bool in_path_when_zone_idle, uint16 in_cond_id, int16 in_min_value, + bool in_enabled, EmuAppearance anim) : timer(100000), killcount(0) { spawn2_id = in_spawn2_id; @@ -81,6 +83,7 @@ Spawn2::Spawn2(uint32 in_spawn2_id, uint32 spawngroup_id, respawn_ = respawn; variance_ = variance; grid_ = grid; + path_when_zone_idle = in_path_when_zone_idle; condition_id = in_cond_id; condition_min_value = in_min_value; npcthis = nullptr; @@ -461,7 +464,7 @@ bool ZoneDatabase::PopulateZoneSpawnListClose(uint32 zoneid, LinkedList } } - const char *zone_name = content_db.GetZoneName(zoneid); + const char *zone_name = ZoneName(zoneid); std::string query = StringFormat( "SELECT " "id, " @@ -473,6 +476,7 @@ bool ZoneDatabase::PopulateZoneSpawnListClose(uint32 zoneid, LinkedList "respawntime, " "variance, " "pathgrid, " + "path_when_zone_idle, " "_condition, " "cond_value, " "enabled, " @@ -493,7 +497,7 @@ bool ZoneDatabase::PopulateZoneSpawnListClose(uint32 zoneid, LinkedList uint32 spawn_time_left = 0; Spawn2* new_spawn = 0; - bool perl_enabled = atoi(row[11]) == 1 ? true : false; + bool perl_enabled = atoi(row[12]) == 1 ? true : false; if (spawn_times.count(atoi(row[0])) != 0) spawn_time_left = spawn_times[atoi(row[0])]; @@ -507,21 +511,22 @@ bool ZoneDatabase::PopulateZoneSpawnListClose(uint32 zoneid, LinkedList if (mob_distance > repop_distance) continue; - new_spawn = new Spawn2( // - atoi(row[0]), // uint32 in_spawn2_id - atoi(row[1]), // uint32 spawngroup_id - atof(row[2]), // float in_x - atof(row[3]), // float in_y - atof(row[4]), // float in_z - atof(row[5]), // float in_heading - atoi(row[6]), // uint32 respawn - atoi(row[7]), // uint32 variance - spawn_time_left, // uint32 timeleft - atoi(row[8]), // uint32 grid - atoi(row[9]), // uint16 in_cond_id - atoi(row[10]), // int16 in_min_value - perl_enabled, // bool in_enabled - (EmuAppearance)atoi(row[12]) // EmuAppearance anim + new_spawn = new Spawn2( + atoi(row[0]), // uint32 in_spawn2_id + atoi(row[1]), // uint32 spawngroup_id + atof(row[2]), // float in_x + atof(row[3]), // float in_y + atof(row[4]), // float in_z + atof(row[5]), // float in_heading + atoi(row[6]), // uint32 respawn + atoi(row[7]), // uint32 variance + spawn_time_left, // uint32 timeleft + atoi(row[8]), // uint32 grid + (bool)atoi(row[9]), // bool path_when_zone_idle + atoi(row[10]), // uint16 in_cond_id + atoi(row[11]), // int16 in_min_value + perl_enabled, // bool in_enabled + (EmuAppearance)atoi(row[13]) // EmuAppearance anim ); spawn2_list.Insert(new_spawn); @@ -565,7 +570,7 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa } } - const char *zone_name = content_db.GetZoneName(zoneid); + const char *zone_name = ZoneName(zoneid); std::string query = StringFormat( "SELECT " "id, " @@ -577,6 +582,7 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa "respawntime, " "variance, " "pathgrid, " + "path_when_zone_idle, " "_condition, " "cond_value, " "enabled, " @@ -595,28 +601,29 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa for (auto row = results.begin(); row != results.end(); ++row) { - uint32 spawn_time_left = 0; - Spawn2* new_spawn = 0; - bool perl_enabled = atoi(row[11]) == 1 ? true : false; + uint32 spawn_time_left = 0; + Spawn2* new_spawn = 0; + bool perl_enabled = atoi(row[12]) == 1 ? true : false; if (spawn_times.count(atoi(row[0])) != 0) spawn_time_left = spawn_times[atoi(row[0])]; - new_spawn = new Spawn2( // - atoi(row[0]), // uint32 in_spawn2_id - atoi(row[1]), // uint32 spawngroup_id - atof(row[2]), // float in_x - atof(row[3]), // float in_y - atof(row[4]), // float in_z - atof(row[5]), // float in_heading - atoi(row[6]), // uint32 respawn - atoi(row[7]), // uint32 variance - spawn_time_left, // uint32 timeleft - atoi(row[8]), // uint32 grid - atoi(row[9]), // uint16 in_cond_id - atoi(row[10]), // int16 in_min_value - perl_enabled, // bool in_enabled - (EmuAppearance)atoi(row[12]) // EmuAppearance anim + new_spawn = new Spawn2( + atoi(row[0]), // uint32 in_spawn2_id + atoi(row[1]), // uint32 spawngroup_id + atof(row[2]), // float in_x + atof(row[3]), // float in_y + atof(row[4]), // float in_z + atof(row[5]), // float in_heading + atoi(row[6]), // uint32 respawn + atoi(row[7]), // uint32 variance + spawn_time_left, // uint32 timeleft + atoi(row[8]), // uint32 grid + (bool)atoi(row[9]), // bool path_when_zone_idle + atoi(row[10]), // uint16 in_cond_id + atoi(row[11]), // int16 in_min_value + perl_enabled, // bool in_enabled + (EmuAppearance)atoi(row[13]) // EmuAppearance anim ); spawn2_list.Insert(new_spawn); @@ -631,9 +638,10 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa Spawn2* ZoneDatabase::LoadSpawn2(LinkedList &spawn2_list, uint32 spawn2id, uint32 timeleft) { std::string query = StringFormat("SELECT id, spawngroupID, x, y, z, heading, " - "respawntime, variance, pathgrid, _condition, " - "cond_value, enabled, animation FROM spawn2 " - "WHERE id = %i", spawn2id); + "respawntime, variance, pathgrid, " + "path_when_zone_idle, _condition, " + "cond_value, enabled, animation FROM spawn2 " + "WHERE id = %i", spawn2id); auto results = QueryDatabase(query); if (!results.Success()) { return nullptr; @@ -645,11 +653,12 @@ Spawn2* ZoneDatabase::LoadSpawn2(LinkedList &spawn2_list, uint32 spawn2 auto row = results.begin(); - bool perl_enabled = atoi(row[11]) == 1 ? true : false; + bool perl_enabled = atoi(row[12]) == 1 ? true : false; - auto newSpawn = new Spawn2(atoi(row[0]), atoi(row[1]), atof(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), - atoi(row[6]), atoi(row[7]), timeleft, atoi(row[8]), atoi(row[9]), atoi(row[10]), - perl_enabled, (EmuAppearance)atoi(row[12])); + auto newSpawn = new Spawn2(atoi(row[0]), atoi(row[1]), atof(row[2]), + atof(row[3]), atof(row[4]), atof(row[5]), atoi(row[6]), atoi(row[7]), + timeleft, atoi(row[8]), (bool) atoi(row[9]), atoi(row[10]), + atoi(row[11]), perl_enabled, (EmuAppearance)atoi(row[13])); spawn2_list.Insert(newSpawn); @@ -910,7 +919,7 @@ void SpawnConditionManager::UpdateDBEvent(SpawnEvent &event) { event.next.day, event.next.month, event.next.year, event.enabled? 1: 0, event.strict? 1: 0, event.id); - content_db.QueryDatabase(query); + database.QueryDatabase(query); } void SpawnConditionManager::UpdateDBCondition(const char* zone_name, uint32 instance_id, uint16 cond_id, int16 value) { @@ -929,7 +938,7 @@ bool SpawnConditionManager::LoadDBEvent(uint32 event_id, SpawnEvent &event, std: "next_month, next_year, enabled, " "action, argument, strict, zone " "FROM spawn_events WHERE id = %d", event_id); - auto results = content_db.QueryDatabase(query); + auto results = database.QueryDatabase(query); if (!results.Success()) { return false; } @@ -1009,7 +1018,7 @@ bool SpawnConditionManager::LoadSpawnConditions(const char* zone_name, uint32 in query = StringFormat("SELECT id, cond_id, period, next_minute, next_hour, " "next_day, next_month, next_year, enabled, action, argument, strict " "FROM spawn_events WHERE zone = '%s'", zone_name); - results = content_db.QueryDatabase(query); + results = database.QueryDatabase(query); if (!results.Success()) { return false; } @@ -1217,7 +1226,7 @@ void SpawnConditionManager::SetCondition(const char *zone_short, uint32 instance auto pack = new ServerPacket(ServerOP_SpawnCondition, sizeof(ServerSpawnCondition_Struct)); ServerSpawnCondition_Struct* ssc = (ServerSpawnCondition_Struct*)pack->pBuffer; - ssc->zoneID = content_db.GetZoneID(zone_short); + ssc->zoneID = ZoneID(zone_short); ssc->instanceID = instance_id; ssc->condition_id = condition_id; ssc->value = new_value; @@ -1349,7 +1358,7 @@ void SpawnConditionManager::ToggleEvent(uint32 event_id, bool enabled, bool stri auto pack = new ServerPacket(ServerOP_SpawnEvent, sizeof(ServerSpawnEvent_Struct)); ServerSpawnEvent_Struct* sse = (ServerSpawnEvent_Struct*)pack->pBuffer; - sse->zoneID = content_db.GetZoneID(zone_short_name.c_str()); + sse->zoneID = ZoneID(zone_short_name.c_str()); sse->event_id = event_id; worldserver.SendPacket(pack); diff --git a/zone/spawn2.h b/zone/spawn2.h index bf6530876..3f8b2e8ee 100644 --- a/zone/spawn2.h +++ b/zone/spawn2.h @@ -32,7 +32,7 @@ public: Spawn2(uint32 spawn2_id, uint32 spawngroup_id, float x, float y, float z, float heading, uint32 respawn, uint32 variance, - uint32 timeleft = 0, uint32 grid = 0, + uint32 timeleft = 0, uint32 grid = 0, bool in_path_when_zone_idle=false, uint16 cond_id = SC_AlwaysEnabled, int16 min_value = 0, bool in_enabled = true, EmuAppearance anim = eaStanding); ~Spawn2(); @@ -54,6 +54,7 @@ public: float GetY() { return y; } float GetZ() { return z; } float GetHeading() { return heading; } + bool PathWhenZoneIdle() { return path_when_zone_idle; } void SetRespawnTimer(uint32 newrespawntime) { respawn_ = newrespawntime; }; void SetVariance(uint32 newvariance) { variance_ = newvariance; } const uint32 GetVariance() const { return variance_; } @@ -86,6 +87,7 @@ private: float heading; uint32 variance_; uint32 grid_; + bool path_when_zone_idle; uint16 condition_id; int16 condition_min_value; bool enabled; diff --git a/zone/spawngroup.cpp b/zone/spawngroup.cpp index d1a83995f..c337bfac0 100644 --- a/zone/spawngroup.cpp +++ b/zone/spawngroup.cpp @@ -24,6 +24,8 @@ #include "spawngroup.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" +#include "../common/repositories/criteria/content_filter_criteria.h" extern EntityList entity_list; extern Zone *zone; @@ -76,12 +78,9 @@ uint32 SpawnGroup::GetNPCType(uint16 in_filter) return (0); } - std::list::iterator cur, end; - std::list possible; - cur = list_.begin(); - end = list_.end(); - for (; cur != end; ++cur) { - SpawnEntry *se = *cur; + std::list possible; + for (auto &it : list_) { + auto se = it.get(); if (!entity_list.LimitCheckType(se->NPCType, se->npc_spawn_limit)) { continue; @@ -93,6 +92,7 @@ uint32 SpawnGroup::GetNPCType(uint16 in_filter) totalchance += se->chance; possible.push_back(se); } + if (totalchance == 0) { return 0; } @@ -100,10 +100,7 @@ uint32 SpawnGroup::GetNPCType(uint16 in_filter) int32 roll = 0; roll = zone->random.Int(0, totalchance - 1); - cur = possible.begin(); - end = possible.end(); - for (; cur != end; ++cur) { - SpawnEntry *se = *cur; + for (auto se : possible) { if (roll < se->chance) { npcType = se->NPCType; break; @@ -115,42 +112,28 @@ uint32 SpawnGroup::GetNPCType(uint16 in_filter) return npcType; } -void SpawnGroup::AddSpawnEntry(SpawnEntry *newEntry) +void SpawnGroup::AddSpawnEntry(std::unique_ptr &newEntry) { - list_.push_back(newEntry); + list_.push_back(std::move(newEntry)); } SpawnGroup::~SpawnGroup() { - std::list::iterator cur, end; - cur = list_.begin(); - end = list_.end(); - for (; cur != end; ++cur) { - SpawnEntry *tmp = *cur; - safe_delete(tmp); - } list_.clear(); } SpawnGroupList::~SpawnGroupList() { - std::map::iterator cur, end; - cur = m_spawn_groups.begin(); - end = m_spawn_groups.end(); - for (; cur != end; ++cur) { - SpawnGroup *tmp = cur->second; - safe_delete(tmp); - } m_spawn_groups.clear(); } -void SpawnGroupList::AddSpawnGroup(SpawnGroup *new_group) +void SpawnGroupList::AddSpawnGroup(std::unique_ptr &new_group) { if (new_group == nullptr) { return; } - m_spawn_groups[new_group->id] = new_group; + m_spawn_groups[new_group->id] = std::move(new_group); } SpawnGroup *SpawnGroupList::GetSpawnGroup(uint32 in_id) @@ -159,7 +142,7 @@ SpawnGroup *SpawnGroupList::GetSpawnGroup(uint32 in_id) return nullptr; } - return (m_spawn_groups[in_id]); + return (m_spawn_groups[in_id].get()); } bool SpawnGroupList::RemoveSpawnGroup(uint32 in_id) @@ -208,10 +191,13 @@ bool ZoneDatabase::LoadSpawnGroups(const char *zone_name, uint16 version, SpawnG WHERE spawn2.spawngroupID = spawngroup.ID AND - spawn2.version = {} and zone = '{}' + (spawn2.version = {} OR version = -1) + AND zone = '{}' + {} ), version, - zone_name + zone_name, + ContentFilterCriteria::apply() ); auto results = QueryDatabase(query); @@ -220,7 +206,7 @@ bool ZoneDatabase::LoadSpawnGroups(const char *zone_name, uint16 version, SpawnG } for (auto row = results.begin(); row != results.end(); ++row) { - auto new_spawn_group = new SpawnGroup( + auto new_spawn_group = std::make_unique( atoi(row[0]), row[1], atoi(row[2]), @@ -268,7 +254,7 @@ bool ZoneDatabase::LoadSpawnGroups(const char *zone_name, uint16 version, SpawnG } for (auto row = results.begin(); row != results.end(); ++row) { - auto new_spawn_entry = new SpawnEntry( + auto new_spawn_entry = std::make_unique( atoi(row[1]), atoi(row[2]), atoi(row[3]), @@ -278,7 +264,6 @@ bool ZoneDatabase::LoadSpawnGroups(const char *zone_name, uint16 version, SpawnG SpawnGroup *spawn_group = spawn_group_list->GetSpawnGroup(atoi(row[0])); if (!spawn_group) { - safe_delete(new_spawn_entry); continue; } @@ -333,7 +318,7 @@ bool ZoneDatabase::LoadSpawnGroupsByID(int spawn_group_id, SpawnGroupList *spawn row[3] ); - auto new_spawn_group = new SpawnGroup( + auto new_spawn_group = std::make_unique( atoi(row[0]), row[1], atoi(row[2]), @@ -376,7 +361,7 @@ bool ZoneDatabase::LoadSpawnGroupsByID(int spawn_group_id, SpawnGroupList *spawn } for (auto row = results.begin(); row != results.end(); ++row) { - auto new_spawn_entry = new SpawnEntry( + auto new_spawn_entry = std::make_unique( atoi(row[1]), atoi(row[2]), atoi(row[3]), @@ -394,7 +379,6 @@ bool ZoneDatabase::LoadSpawnGroupsByID(int spawn_group_id, SpawnGroupList *spawn SpawnGroup *spawn_group = spawn_group_list->GetSpawnGroup(atoi(row[0])); if (!spawn_group) { - safe_delete(new_spawn_entry); continue; } diff --git a/zone/spawngroup.h b/zone/spawngroup.h index a1068cea0..20b84b734 100644 --- a/zone/spawngroup.h +++ b/zone/spawngroup.h @@ -22,6 +22,7 @@ #include #include +#include class SpawnEntry { public: @@ -55,7 +56,7 @@ public: ~SpawnGroup(); uint32 GetNPCType(uint16 condition_value_filter=1); - void AddSpawnEntry(SpawnEntry *newEntry); + void AddSpawnEntry(std::unique_ptr &newEntry); uint32 id; bool wp_spawns; // if true, spawn NPCs at a random waypoint location (if spawnpoint has a grid) instead of the spawnpoint's loc float roamdist; @@ -66,7 +67,7 @@ public: uint32 despawn_timer; private: char name_[120]; - std::list list_; + std::list> list_; uint8 group_spawn_limit; //max # of this entry which can be spawned by this group }; @@ -75,14 +76,13 @@ public: SpawnGroupList() {} ~SpawnGroupList(); - void AddSpawnGroup(SpawnGroup *new_group); + void AddSpawnGroup(std::unique_ptr &new_group); SpawnGroup *GetSpawnGroup(uint32 id); bool RemoveSpawnGroup(uint32 in_id); void ClearSpawnGroups(); void ReloadSpawnGroups(); private: - //LinkedList list_; - std::map m_spawn_groups; + std::map> m_spawn_groups; }; #endif diff --git a/zone/special_attacks.cpp b/zone/special_attacks.cpp index 9334e4f6c..717bc4fbf 100644 --- a/zone/special_attacks.cpp +++ b/zone/special_attacks.cpp @@ -29,15 +29,15 @@ extern double frame_time; -int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) +int Mob::GetBaseSkillDamage(EQ::skills::SkillType skill, Mob *target) { - int base = EQEmu::skills::GetBaseDamage(skill); + int base = EQ::skills::GetBaseDamage(skill); auto skill_level = GetSkill(skill); switch (skill) { - case EQEmu::skills::SkillDragonPunch: - case EQEmu::skills::SkillEagleStrike: - case EQEmu::skills::SkillTigerClaw: - case EQEmu::skills::SkillRoundKick: + case EQ::skills::SkillDragonPunch: + case EQ::skills::SkillEagleStrike: + case EQ::skills::SkillTigerClaw: + case EQ::skills::SkillRoundKick: if (skill_level >= 25) base++; if (skill_level >= 75) @@ -47,8 +47,8 @@ int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) if (skill_level >= 175) base++; return base; - case EQEmu::skills::SkillFrenzy: - if (IsClient() && CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary)) { + case EQ::skills::SkillFrenzy: + if (IsClient() && CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary)) { if (GetLevel() > 15) base += GetLevel() - 15; if (base > 23) @@ -61,11 +61,11 @@ int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) base++; } return base; - case EQEmu::skills::SkillFlyingKick: { + case EQ::skills::SkillFlyingKick: { float skill_bonus = skill_level / 9.0f; float ac_bonus = 0.0f; if (IsClient()) { - auto inst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotFeet); + auto inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotFeet); if (inst) ac_bonus = inst->GetItemArmorClass(true) / 25.0f; } @@ -73,12 +73,12 @@ int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) ac_bonus = skill_bonus; return static_cast(ac_bonus + skill_bonus); } - case EQEmu::skills::SkillKick: { + case EQ::skills::SkillKick: { // there is some base *= 4 case in here? float skill_bonus = skill_level / 10.0f; float ac_bonus = 0.0f; if (IsClient()) { - auto inst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotFeet); + auto inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotFeet); if (inst) ac_bonus = inst->GetItemArmorClass(true) / 25.0f; } @@ -86,15 +86,15 @@ int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) ac_bonus = skill_bonus; return static_cast(ac_bonus + skill_bonus); } - case EQEmu::skills::SkillBash: { + case EQ::skills::SkillBash: { float skill_bonus = skill_level / 10.0f; float ac_bonus = 0.0f; - const EQEmu::ItemInstance *inst = nullptr; + const EQ::ItemInstance *inst = nullptr; if (IsClient()) { if (HasShieldEquiped()) - inst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotSecondary); + inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); else if (HasTwoHanderEquipped()) - inst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); + inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); } if (inst) ac_bonus = inst->GetItemArmorClass(true) / 25.0f; @@ -104,13 +104,13 @@ int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) ac_bonus = skill_bonus; return static_cast(ac_bonus + skill_bonus); } - case EQEmu::skills::SkillBackstab: { + case EQ::skills::SkillBackstab: { float skill_bonus = static_cast(skill_level) * 0.02f; base = 3; // There seems to be a base 3 for NPCs or some how BS w/o weapon? // until we get a better inv system for NPCs they get nerfed! if (IsClient()) { - auto *inst = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); - if (inst && inst->GetItem() && inst->GetItem()->ItemType == EQEmu::item::ItemType1HPiercing) { + auto *inst = CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); + if (inst && inst->GetItem() && inst->GetItem()->ItemType == EQ::item::ItemType1HPiercing) { base = inst->GetItemBackstabDamage(true); if (!inst->GetItemBackstabDamage()) base += inst->GetItemWeaponDamage(true); @@ -136,7 +136,7 @@ int Mob::GetBaseSkillDamage(EQEmu::skills::SkillType skill, Mob *target) } } -void Mob::DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int32 base_damage, int32 min_damage, +void Mob::DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int32 base_damage, int32 min_damage, int32 hate_override, int ReuseTime) { // this really should go through the same code as normal melee damage to @@ -159,21 +159,21 @@ void Mob::DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int32 if (who->GetInvul() || who->GetSpecialAbility(IMMUNE_MELEE)) my_hit.damage_done = DMG_INVULNERABLE; - if (who->GetSpecialAbility(IMMUNE_MELEE_EXCEPT_BANE) && skill != EQEmu::skills::SkillBackstab) + if (who->GetSpecialAbility(IMMUNE_MELEE_EXCEPT_BANE) && skill != EQ::skills::SkillBackstab) my_hit.damage_done = DMG_INVULNERABLE; uint32 hate = my_hit.base_damage; if (hate_override > -1) hate = hate_override; - if (skill == EQEmu::skills::SkillBash) { + if (skill == EQ::skills::SkillBash) { if (IsClient()) { - EQEmu::ItemInstance *item = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotSecondary); + EQ::ItemInstance *item = CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); if (item) { - if (item->GetItem()->ItemType == EQEmu::item::ItemTypeShield) { + if (item->GetItem()->ItemType == EQ::item::ItemTypeShield) { hate += item->GetItem()->AC; } - const EQEmu::ItemData *itm = item->GetItem(); + const EQ::ItemData *itm = item->GetItem(); auto fbash = GetFuriousBash(itm->Focus.Effect); hate = hate * (100 + fbash) / 100; if (fbash) @@ -185,19 +185,19 @@ void Mob::DoSpecialAttackDamage(Mob *who, EQEmu::skills::SkillType skill, int32 my_hit.offense = offense(my_hit.skill); my_hit.tohit = GetTotalToHit(my_hit.skill, 0); - my_hit.hand = EQEmu::invslot::slotPrimary; // Avoid checks hand for throwing/archery exclusion, primary should + my_hit.hand = EQ::invslot::slotPrimary; // Avoid checks hand for throwing/archery exclusion, primary should // work for most - if (skill == EQEmu::skills::SkillThrowing || skill == EQEmu::skills::SkillArchery) - my_hit.hand = EQEmu::invslot::slotRange; + if (skill == EQ::skills::SkillThrowing || skill == EQ::skills::SkillArchery) + my_hit.hand = EQ::invslot::slotRange; DoAttack(who, my_hit); - who->AddToHateList(this, hate, 0, false); + who->AddToHateList(this, hate, 0); if (my_hit.damage_done > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skill && IsValidSpell(aabonuses.SkillAttackProc[2])) { float chance = aabonuses.SkillAttackProc[0] / 1000.0f; if (zone->random.Roll(chance)) - SpellFinished(aabonuses.SkillAttackProc[2], who, EQEmu::spells::CastingSlot::Item, 0, -1, + SpellFinished(aabonuses.SkillAttackProc[2], who, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SkillAttackProc[2]].ResistDiff); } @@ -228,13 +228,13 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) pTimerType timer = pTimerCombatAbility; // RoF2+ Tiger Claw is unlinked from other monk skills, if they ever do that for other classes there will need // to be more checks here - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF2 && ca_atk->m_skill == EQEmu::skills::SkillTigerClaw) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF2 && ca_atk->m_skill == EQ::skills::SkillTigerClaw) timer = pTimerCombatAbility2; bool CanBypassSkillCheck = false; - if (ca_atk->m_skill == EQEmu::skills::SkillBash) { // SLAM - Bash without a shield equipped + if (ca_atk->m_skill == EQ::skills::SkillBash) { // SLAM - Bash without a shield equipped switch (GetRace()) { case OGRE: @@ -247,7 +247,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) } /* Check to see if actually have skill */ - if (!MaxSkill(static_cast(ca_atk->m_skill)) && !CanBypassSkillCheck) + if (!MaxSkill(static_cast(ca_atk->m_skill)) && !CanBypassSkillCheck) return; if (GetTarget()->GetID() != ca_atk->m_target) @@ -259,8 +259,8 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) // These two are not subject to the combat ability timer, as they // allready do their checking in conjunction with the attack timer // throwing weapons - if (ca_atk->m_atk == EQEmu::invslot::slotRange) { - if (ca_atk->m_skill == EQEmu::skills::SkillThrowing) { + if (ca_atk->m_atk == EQ::invslot::slotRange) { + if (ca_atk->m_skill == EQ::skills::SkillThrowing) { SetAttackTimer(); ThrowingAttack(GetTarget()); if (CheckDoubleRangedAttack()) @@ -268,7 +268,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) return; } // ranged attack (archery) - if (ca_atk->m_skill == EQEmu::skills::SkillArchery) { + if (ca_atk->m_skill == EQ::skills::SkillArchery) { SetAttackTimer(); RangedAttack(GetTarget()); if (CheckDoubleRangedAttack()) @@ -302,38 +302,38 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) // not sure what the '100' indicates..if ->m_atk is not used as 'slot' reference, then change SlotRange above back to '11' if (ca_atk->m_atk == 100 && - ca_atk->m_skill == EQEmu::skills::SkillBash) { // SLAM - Bash without a shield equipped + ca_atk->m_skill == EQ::skills::SkillBash) { // SLAM - Bash without a shield equipped if (GetTarget() != this) { - CheckIncreaseSkill(EQEmu::skills::SkillBash, GetTarget(), 10); + CheckIncreaseSkill(EQ::skills::SkillBash, GetTarget(), 10); DoAnim(animTailRake, 0, false); int32 ht = 0; - if (GetWeaponDamage(GetTarget(), GetInv().GetItem(EQEmu::invslot::slotSecondary)) <= 0 && - GetWeaponDamage(GetTarget(), GetInv().GetItem(EQEmu::invslot::slotShoulders)) <= 0) + if (GetWeaponDamage(GetTarget(), GetInv().GetItem(EQ::invslot::slotSecondary)) <= 0 && + GetWeaponDamage(GetTarget(), GetInv().GetItem(EQ::invslot::slotShoulders)) <= 0) dmg = -5; else - ht = dmg = GetBaseSkillDamage(EQEmu::skills::SkillBash, GetTarget()); + ht = dmg = GetBaseSkillDamage(EQ::skills::SkillBash, GetTarget()); ReuseTime = BashReuseTime - 1 - skill_reduction; ReuseTime = (ReuseTime * HasteMod) / 100; - DoSpecialAttackDamage(GetTarget(), EQEmu::skills::SkillBash, dmg, 0, ht, ReuseTime); + DoSpecialAttackDamage(GetTarget(), EQ::skills::SkillBash, dmg, 0, ht, ReuseTime); if (ReuseTime > 0) p_timers.Start(timer, ReuseTime); } return; } - if (ca_atk->m_atk == 100 && ca_atk->m_skill == EQEmu::skills::SkillFrenzy) { - CheckIncreaseSkill(EQEmu::skills::SkillFrenzy, GetTarget(), 10); + if (ca_atk->m_atk == 100 && ca_atk->m_skill == EQ::skills::SkillFrenzy) { + CheckIncreaseSkill(EQ::skills::SkillFrenzy, GetTarget(), 10); int AtkRounds = 1; - int32 max_dmg = GetBaseSkillDamage(EQEmu::skills::SkillFrenzy, GetTarget()); + int32 max_dmg = GetBaseSkillDamage(EQ::skills::SkillFrenzy, GetTarget()); DoAnim(anim2HSlashing, 0, false); max_dmg = mod_frenzy_damage(max_dmg); if (GetClass() == BERSERKER) { - int chance = GetLevel() * 2 + GetSkill(EQEmu::skills::SkillFrenzy); + int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy); if (zone->random.Roll0(450) < chance) AtkRounds++; if (zone->random.Roll0(450) < chance) @@ -345,7 +345,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) while (AtkRounds > 0) { if (GetTarget()) - DoSpecialAttackDamage(GetTarget(), EQEmu::skills::SkillFrenzy, max_dmg, 0, max_dmg, ReuseTime); + DoSpecialAttackDamage(GetTarget(), EQ::skills::SkillFrenzy, max_dmg, 0, max_dmg, ReuseTime); AtkRounds--; } @@ -359,20 +359,20 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) case WARRIOR: case RANGER: case BEASTLORD: - if (ca_atk->m_atk != 100 || ca_atk->m_skill != EQEmu::skills::SkillKick) + if (ca_atk->m_atk != 100 || ca_atk->m_skill != EQ::skills::SkillKick) break; if (GetTarget() != this) { - CheckIncreaseSkill(EQEmu::skills::SkillKick, GetTarget(), 10); + CheckIncreaseSkill(EQ::skills::SkillKick, GetTarget(), 10); DoAnim(animKick, 0, false); int32 ht = 0; - if (GetWeaponDamage(GetTarget(), GetInv().GetItem(EQEmu::invslot::slotFeet)) <= 0) + if (GetWeaponDamage(GetTarget(), GetInv().GetItem(EQ::invslot::slotFeet)) <= 0) dmg = -5; else - ht = dmg = GetBaseSkillDamage(EQEmu::skills::SkillKick, GetTarget()); + ht = dmg = GetBaseSkillDamage(EQ::skills::SkillKick, GetTarget()); ReuseTime = KickReuseTime - 1 - skill_reduction; - DoSpecialAttackDamage(GetTarget(), EQEmu::skills::SkillKick, dmg, 0, ht, ReuseTime); + DoSpecialAttackDamage(GetTarget(), EQ::skills::SkillKick, dmg, 0, ht, ReuseTime); } break; case MONK: { @@ -383,11 +383,11 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) if (wuchance) { const int MonkSPA[5] = { - EQEmu::skills::SkillFlyingKick, - EQEmu::skills::SkillDragonPunch, - EQEmu::skills::SkillEagleStrike, - EQEmu::skills::SkillTigerClaw, - EQEmu::skills::SkillRoundKick + EQ::skills::SkillFlyingKick, + EQ::skills::SkillDragonPunch, + EQ::skills::SkillEagleStrike, + EQ::skills::SkillTigerClaw, + EQ::skills::SkillRoundKick }; int extra = 0; // always 1/4 of the double attack chance, 25% at rank 5 (100/4) @@ -415,12 +415,12 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk) // hackish... but we return a huge reuse time if this is an // invalid skill, otherwise, we can safely assume it is a // valid monk skill and just cast it to a SkillType - CheckIncreaseSkill((EQEmu::skills::SkillType)ca_atk->m_skill, GetTarget(), 10); + CheckIncreaseSkill((EQ::skills::SkillType)ca_atk->m_skill, GetTarget(), 10); } break; } case ROGUE: { - if (ca_atk->m_atk != 100 || ca_atk->m_skill != EQEmu::skills::SkillBackstab) + if (ca_atk->m_atk != 100 || ca_atk->m_skill != EQ::skills::SkillBackstab) break; ReuseTime = BackstabReuseTime-1 - skill_reduction; TryBackstab(GetTarget(), ReuseTime); @@ -448,50 +448,50 @@ int Mob::MonkSpecialAttack(Mob *other, uint8 unchecked_type) int32 max_dmg = 0; int32 min_dmg = 0; int reuse = 0; - EQEmu::skills::SkillType skill_type; // to avoid casting... even though it "would work" - uint8 itemslot = EQEmu::invslot::slotFeet; + EQ::skills::SkillType skill_type; // to avoid casting... even though it "would work" + uint8 itemslot = EQ::invslot::slotFeet; if (IsNPC()) { auto *npc = CastToNPC(); min_dmg = npc->GetMinDamage(); } switch (unchecked_type) { - case EQEmu::skills::SkillFlyingKick: - skill_type = EQEmu::skills::SkillFlyingKick; + case EQ::skills::SkillFlyingKick: + skill_type = EQ::skills::SkillFlyingKick; max_dmg = GetBaseSkillDamage(skill_type); min_dmg = 0; // revamped FK formula is missing the min mod? DoAnim(animFlyingKick, 0, false); reuse = FlyingKickReuseTime; break; - case EQEmu::skills::SkillDragonPunch: - skill_type = EQEmu::skills::SkillDragonPunch; + case EQ::skills::SkillDragonPunch: + skill_type = EQ::skills::SkillDragonPunch; max_dmg = GetBaseSkillDamage(skill_type); - itemslot = EQEmu::invslot::slotHands; + itemslot = EQ::invslot::slotHands; DoAnim(animTailRake, 0, false); reuse = TailRakeReuseTime; break; - case EQEmu::skills::SkillEagleStrike: - skill_type = EQEmu::skills::SkillEagleStrike; + case EQ::skills::SkillEagleStrike: + skill_type = EQ::skills::SkillEagleStrike; max_dmg = GetBaseSkillDamage(skill_type); - itemslot = EQEmu::invslot::slotHands; + itemslot = EQ::invslot::slotHands; DoAnim(animEagleStrike, 0, false); reuse = EagleStrikeReuseTime; break; - case EQEmu::skills::SkillTigerClaw: - skill_type = EQEmu::skills::SkillTigerClaw; + case EQ::skills::SkillTigerClaw: + skill_type = EQ::skills::SkillTigerClaw; max_dmg = GetBaseSkillDamage(skill_type); - itemslot = EQEmu::invslot::slotHands; + itemslot = EQ::invslot::slotHands; DoAnim(animTigerClaw, 0, false); reuse = TigerClawReuseTime; break; - case EQEmu::skills::SkillRoundKick: - skill_type = EQEmu::skills::SkillRoundKick; + case EQ::skills::SkillRoundKick: + skill_type = EQ::skills::SkillRoundKick; max_dmg = GetBaseSkillDamage(skill_type); DoAnim(animRoundKick, 0, false); reuse = RoundKickReuseTime; break; - case EQEmu::skills::SkillKick: - skill_type = EQEmu::skills::SkillKick; + case EQ::skills::SkillKick: + skill_type = EQ::skills::SkillKick; max_dmg = GetBaseSkillDamage(skill_type); DoAnim(animKick, 0, false); reuse = KickReuseTime; @@ -506,7 +506,7 @@ int Mob::MonkSpecialAttack(Mob *other, uint8 unchecked_type) max_dmg = DMG_INVULNERABLE; } } else { - if (GetWeaponDamage(other, (const EQEmu::ItemData *)nullptr) <= 0) { + if (GetWeaponDamage(other, (const EQ::ItemData *)nullptr) <= 0) { max_dmg = DMG_INVULNERABLE; } } @@ -532,8 +532,8 @@ void Mob::TryBackstab(Mob *other, int ReuseTime) { //make sure we have a proper weapon if we are a client. if(IsClient()) { - const EQEmu::ItemInstance *wpn = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); - if (!wpn || (wpn->GetItem()->ItemType != EQEmu::item::ItemType1HPiercing)){ + const EQ::ItemInstance *wpn = CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); + if (!wpn || (wpn->GetItem()->ItemType != EQ::item::ItemType1HPiercing)){ MessageString(Chat::Red, BACKSTAB_WEAPON); return; } @@ -571,7 +571,7 @@ void Mob::TryBackstab(Mob *other, int ReuseTime) { } if(IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillBackstab, other, 10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillBackstab, other, 10); } //Live AA - Chaotic Backstab @@ -583,11 +583,11 @@ void Mob::TryBackstab(Mob *other, int ReuseTime) { // Live actually added SPA 473 which grants chance to double here when they revamped chaotic/seized RogueBackstab(other, true, ReuseTime); if(IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillBackstab, other, 10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillBackstab, other, 10); m_specialattacks = eSpecialAttacks::None; } else { //We do a single regular attack if we attack from the front without chaotic stab - Attack(other, EQEmu::invslot::slotPrimary); + Attack(other, EQ::invslot::slotPrimary); } } @@ -601,17 +601,17 @@ void Mob::RogueBackstab(Mob* other, bool min_damage, int ReuseTime) // make sure we can hit (bane, magical, etc) if (IsClient()) { - const EQEmu::ItemInstance *wpn = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); + const EQ::ItemInstance *wpn = CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); if (!GetWeaponDamage(other, wpn)) return; - } else if (!GetWeaponDamage(other, (const EQEmu::ItemData*)nullptr)){ + } else if (!GetWeaponDamage(other, (const EQ::ItemData*)nullptr)){ return; } - int base_damage = GetBaseSkillDamage(EQEmu::skills::SkillBackstab, other); + int base_damage = GetBaseSkillDamage(EQ::skills::SkillBackstab, other); hate = base_damage; - DoSpecialAttackDamage(other, EQEmu::skills::SkillBackstab, base_damage, 0, hate, ReuseTime); + DoSpecialAttackDamage(other, EQ::skills::SkillBackstab, base_damage, 0, hate, ReuseTime); DoAnim(anim1HPiercing, 0, false); } @@ -620,10 +620,10 @@ void Mob::RogueAssassinate(Mob* other) { //can you dodge, parry, etc.. an assassinate?? //if so, use DoSpecialAttackDamage(other, BACKSTAB, 32000); instead - if (GetWeaponDamage(other, IsClient() ? CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary) : (const EQEmu::ItemInstance*)nullptr) > 0){ - other->Damage(this, 32000, SPELL_UNKNOWN, EQEmu::skills::SkillBackstab); + if (GetWeaponDamage(other, IsClient() ? CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary) : (const EQ::ItemInstance*)nullptr) > 0){ + other->Damage(this, 32000, SPELL_UNKNOWN, EQ::skills::SkillBackstab); }else{ - other->Damage(this, -5, SPELL_UNKNOWN, EQEmu::skills::SkillBackstab); + other->Damage(this, -5, SPELL_UNKNOWN, EQ::skills::SkillBackstab); } DoAnim(anim1HPiercing, 0, false); //piercing animation } @@ -640,34 +640,34 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) { //Message(0, "Error: Timer not up. Attack %d, ranged %d", attack_timer.GetRemainingTime(), ranged_timer.GetRemainingTime()); return; } - const EQEmu::ItemInstance* RangeWeapon = m_inv[EQEmu::invslot::slotRange]; + const EQ::ItemInstance* RangeWeapon = m_inv[EQ::invslot::slotRange]; //locate ammo - int ammo_slot = EQEmu::invslot::slotAmmo; - const EQEmu::ItemInstance* Ammo = m_inv[EQEmu::invslot::slotAmmo]; + int ammo_slot = EQ::invslot::slotAmmo; + const EQ::ItemInstance* Ammo = m_inv[EQ::invslot::slotAmmo]; if (!RangeWeapon || !RangeWeapon->IsClassCommon()) { - LogCombat("Ranged attack canceled. Missing or invalid ranged weapon ([{}]) in slot [{}]", GetItemIDAt(EQEmu::invslot::slotRange), EQEmu::invslot::slotRange); - Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have no bow!", GetItemIDAt(EQEmu::invslot::slotRange)); + LogCombat("Ranged attack canceled. Missing or invalid ranged weapon ([{}]) in slot [{}]", GetItemIDAt(EQ::invslot::slotRange), EQ::invslot::slotRange); + Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have no bow!", GetItemIDAt(EQ::invslot::slotRange)); return; } if (!Ammo || !Ammo->IsClassCommon()) { - LogCombat("Ranged attack canceled. Missing or invalid ammo item ([{}]) in slot [{}]", GetItemIDAt(EQEmu::invslot::slotAmmo), EQEmu::invslot::slotAmmo); - Message(0, "Error: Ammo: GetItem(%i)==0, you have no ammo!", GetItemIDAt(EQEmu::invslot::slotAmmo)); + LogCombat("Ranged attack canceled. Missing or invalid ammo item ([{}]) in slot [{}]", GetItemIDAt(EQ::invslot::slotAmmo), EQ::invslot::slotAmmo); + Message(0, "Error: Ammo: GetItem(%i)==0, you have no ammo!", GetItemIDAt(EQ::invslot::slotAmmo)); return; } - const EQEmu::ItemData* RangeItem = RangeWeapon->GetItem(); - const EQEmu::ItemData* AmmoItem = Ammo->GetItem(); + const EQ::ItemData* RangeItem = RangeWeapon->GetItem(); + const EQ::ItemData* AmmoItem = Ammo->GetItem(); - if (RangeItem->ItemType != EQEmu::item::ItemTypeBow) { + if (RangeItem->ItemType != EQ::item::ItemTypeBow) { LogCombat("Ranged attack canceled. Ranged item is not a bow. type [{}]", RangeItem->ItemType); Message(0, "Error: Rangeweapon: Item %d is not a bow.", RangeWeapon->GetID()); return; } - if (AmmoItem->ItemType != EQEmu::item::ItemTypeArrow) { + if (AmmoItem->ItemType != EQ::item::ItemTypeArrow) { LogCombat("Ranged attack canceled. Ammo item is not an arrow. type [{}]", AmmoItem->ItemType); - Message(0, "Error: Ammo: type %d != %d, you have the wrong type of ammo!", AmmoItem->ItemType, EQEmu::item::ItemTypeArrow); + Message(0, "Error: Ammo: type %d != %d, you have the wrong type of ammo!", AmmoItem->ItemType, EQ::item::ItemTypeArrow); return; } @@ -678,18 +678,18 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) { //first look for quivers int r; bool found = false; - for (r = EQEmu::invslot::GENERAL_BEGIN; r <= EQEmu::invslot::GENERAL_END; r++) { - const EQEmu::ItemInstance *pi = m_inv[r]; + for (r = EQ::invslot::GENERAL_BEGIN; r <= EQ::invslot::GENERAL_END; r++) { + const EQ::ItemInstance *pi = m_inv[r]; if (pi == nullptr || !pi->IsClassBag()) continue; - const EQEmu::ItemData* bagitem = pi->GetItem(); - if (!bagitem || bagitem->BagType != EQEmu::item::BagTypeQuiver) + const EQ::ItemData* bagitem = pi->GetItem(); + if (!bagitem || bagitem->BagType != EQ::item::BagTypeQuiver) continue; //we found a quiver, look for the ammo in it int i; for (i = 0; i < bagitem->BagSlots; i++) { - EQEmu::ItemInstance* baginst = pi->GetItem(i); + EQ::ItemInstance* baginst = pi->GetItem(i); if(!baginst) continue; //empty if(baginst->GetID() == Ammo->GetID()) { @@ -756,13 +756,13 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) { LogCombat("Endless Quiver prevented ammo consumption"); } - CheckIncreaseSkill(EQEmu::skills::SkillArchery, GetTarget(), -15); + CheckIncreaseSkill(EQ::skills::SkillArchery, GetTarget(), -15); CommonBreakInvisibleFromCombat(); } -void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, const EQEmu::ItemInstance *Ammo, +void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, const EQ::ItemInstance *Ammo, uint16 weapon_damage, int16 chance_mod, int16 focus, int ReuseTime, uint32 range_id, - uint32 ammo_id, const EQEmu::ItemData *AmmoItem, int AmmoSlot, float speed) + uint32 ammo_id, const EQ::ItemData *AmmoItem, int AmmoSlot, float speed) { if ((other == nullptr || ((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead)) || @@ -770,9 +770,9 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, return; } - const EQEmu::ItemInstance *_RangeWeapon = nullptr; - const EQEmu::ItemInstance *_Ammo = nullptr; - const EQEmu::ItemData *ammo_lost = nullptr; + const EQ::ItemInstance *_RangeWeapon = nullptr; + const EQ::ItemInstance *_Ammo = nullptr; + const EQ::ItemData *ammo_lost = nullptr; /* If LaunchProjectile is false this function will do archery damage on target, @@ -795,7 +795,7 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, if (!RangeWeapon && !Ammo && range_id && ammo_id) { if (IsClient()) { - _RangeWeapon = CastToClient()->m_inv[EQEmu::invslot::slotRange]; + _RangeWeapon = CastToClient()->m_inv[EQ::invslot::slotRange]; if (_RangeWeapon && _RangeWeapon->GetItem() && _RangeWeapon->GetItem()->ID == range_id) RangeWeapon = _RangeWeapon; @@ -809,7 +809,7 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, } } } else if (AmmoItem) { - SendItemAnimation(other, AmmoItem, EQEmu::skills::SkillArchery); + SendItemAnimation(other, AmmoItem, EQ::skills::SkillArchery); } LogCombat("Ranged attack hit [{}]", other->GetName()); @@ -826,7 +826,7 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, } if (LaunchProjectile) { // 1: Shoot the Projectile once we calculate weapon damage. - TryProjectileAttack(other, AmmoItem, EQEmu::skills::SkillArchery, (WDmg + ADmg), RangeWeapon, + TryProjectileAttack(other, AmmoItem, EQ::skills::SkillArchery, (WDmg + ADmg), RangeWeapon, Ammo, AmmoSlot, speed); return; } @@ -858,10 +858,10 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, my_hit.min_damage = 0; my_hit.damage_done = 1; - my_hit.skill = EQEmu::skills::SkillArchery; + my_hit.skill = EQ::skills::SkillArchery; my_hit.offense = offense(my_hit.skill); my_hit.tohit = GetTotalToHit(my_hit.skill, chance_mod); - my_hit.hand = EQEmu::invslot::slotRange; + my_hit.hand = EQ::invslot::slotRange; DoAttack(other, my_hit); TotalDmg = my_hit.damage_done; @@ -870,16 +870,16 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, } if (IsClient() && !CastToClient()->GetFeigned()) - other->AddToHateList(this, hate, 0, false); + other->AddToHateList(this, hate, 0); - other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQEmu::skills::SkillArchery); + other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillArchery); // Skill Proc Success if (TotalDmg > 0 && HasSkillProcSuccess() && other && !other->HasDied()) { if (ReuseTime) - TrySkillProc(other, EQEmu::skills::SkillArchery, ReuseTime); + TrySkillProc(other, EQ::skills::SkillArchery, ReuseTime); else - TrySkillProc(other, EQEmu::skills::SkillArchery, 0, true, EQEmu::invslot::slotRange); + TrySkillProc(other, EQ::skills::SkillArchery, 0, true, EQ::invslot::slotRange); } // end of old fuck @@ -888,26 +888,26 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, // Weapon Proc if (RangeWeapon && other && !other->HasDied()) - TryWeaponProc(RangeWeapon, other, EQEmu::invslot::slotRange); + TryWeaponProc(RangeWeapon, other, EQ::invslot::slotRange); // Ammo Proc if (ammo_lost) - TryWeaponProc(nullptr, ammo_lost, other, EQEmu::invslot::slotRange); + TryWeaponProc(nullptr, ammo_lost, other, EQ::invslot::slotRange); else if (Ammo && other && !other->HasDied()) - TryWeaponProc(Ammo, other, EQEmu::invslot::slotRange); + TryWeaponProc(Ammo, other, EQ::invslot::slotRange); // Skill Proc if (HasSkillProcs() && other && !other->HasDied()) { if (ReuseTime) - TrySkillProc(other, EQEmu::skills::SkillArchery, ReuseTime); + TrySkillProc(other, EQ::skills::SkillArchery, ReuseTime); else - TrySkillProc(other, EQEmu::skills::SkillArchery, 0, false, EQEmu::invslot::slotRange); + TrySkillProc(other, EQ::skills::SkillArchery, 0, false, EQ::invslot::slotRange); } } -bool Mob::TryProjectileAttack(Mob *other, const EQEmu::ItemData *item, EQEmu::skills::SkillType skillInUse, - uint16 weapon_dmg, const EQEmu::ItemInstance *RangeWeapon, - const EQEmu::ItemInstance *Ammo, int AmmoSlot, float speed) +bool Mob::TryProjectileAttack(Mob *other, const EQ::ItemData *item, EQ::skills::SkillType skillInUse, + uint16 weapon_dmg, const EQ::ItemInstance *RangeWeapon, + const EQ::ItemInstance *Ammo, int AmmoSlot, float speed) { if (!other) return false; @@ -994,7 +994,7 @@ void Mob::ProjectileAttack() if (ProjectileAtk[i].hit_increment <= ProjectileAtk[i].increment) { if (target) { if (IsNPC()) { - if (ProjectileAtk[i].skill == EQEmu::skills::SkillConjuration) { + if (ProjectileAtk[i].skill == EQ::skills::SkillConjuration) { if (IsValidSpell(ProjectileAtk[i].wpn_dmg)) SpellOnTarget(ProjectileAtk[i].wpn_dmg, target, false, true, spells[ProjectileAtk[i].wpn_dmg].ResistDiff, @@ -1002,19 +1002,19 @@ void Mob::ProjectileAttack() } else { CastToNPC()->DoRangedAttackDmg( target, false, ProjectileAtk[i].wpn_dmg, 0, - static_cast(ProjectileAtk[i].skill)); + static_cast(ProjectileAtk[i].skill)); } } else { - if (ProjectileAtk[i].skill == EQEmu::skills::SkillArchery) + if (ProjectileAtk[i].skill == EQ::skills::SkillArchery) DoArcheryAttackDmg(target, nullptr, nullptr, ProjectileAtk[i].wpn_dmg, 0, 0, 0, ProjectileAtk[i].ranged_id, ProjectileAtk[i].ammo_id, nullptr, ProjectileAtk[i].ammo_slot); - else if (ProjectileAtk[i].skill == EQEmu::skills::SkillThrowing) + else if (ProjectileAtk[i].skill == EQ::skills::SkillThrowing) DoThrowingAttackDmg(target, nullptr, nullptr, ProjectileAtk[i].wpn_dmg, 0, 0, 0, ProjectileAtk[i].ranged_id, ProjectileAtk[i].ammo_slot); - else if (ProjectileAtk[i].skill == EQEmu::skills::SkillConjuration && + else if (ProjectileAtk[i].skill == EQ::skills::SkillConjuration && IsValidSpell(ProjectileAtk[i].wpn_dmg)) SpellOnTarget(ProjectileAtk[i].wpn_dmg, target, false, true, spells[ProjectileAtk[i].wpn_dmg].ResistDiff, true); @@ -1139,7 +1139,7 @@ void NPC::RangedAttack(Mob* other) } } -void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 chance_mod, EQEmu::skills::SkillType skill, float speed, const char *IDFile) +void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 chance_mod, EQ::skills::SkillType skill, float speed, const char *IDFile) { if ((other == nullptr || (other->HasDied())) || @@ -1151,7 +1151,7 @@ void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 cha return; } - EQEmu::skills::SkillType skillInUse = static_cast(GetRangedSkill()); + EQ::skills::SkillType skillInUse = static_cast(GetRangedSkill()); if (skill != skillInUse) skillInUse = skill; @@ -1192,7 +1192,7 @@ void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 cha my_hit.skill = skill; my_hit.offense = offense(my_hit.skill); my_hit.tohit = GetTotalToHit(my_hit.skill, chance_mod); - my_hit.hand = EQEmu::invslot::slotRange; + my_hit.hand = EQ::invslot::slotRange; DoAttack(other, my_hit); @@ -1200,22 +1200,22 @@ void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 cha if (TotalDmg > 0) { TotalDmg += TotalDmg * damage_mod / 100; - other->AddToHateList(this, TotalDmg, 0, false); + other->AddToHateList(this, TotalDmg, 0); } else { - other->AddToHateList(this, 0, 0, false); + other->AddToHateList(this, 0, 0); } other->Damage(this, TotalDmg, SPELL_UNKNOWN, skillInUse); if (TotalDmg > 0 && HasSkillProcSuccess() && !other->HasDied()) - TrySkillProc(other, skillInUse, 0, true, EQEmu::invslot::slotRange); + TrySkillProc(other, skillInUse, 0, true, EQ::invslot::slotRange); //try proc on hits and misses if(other && !other->HasDied()) - TrySpellProc(nullptr, (const EQEmu::ItemData*)nullptr, other, EQEmu::invslot::slotRange); + TrySpellProc(nullptr, (const EQ::ItemData*)nullptr, other, EQ::invslot::slotRange); if (HasSkillProcs() && other && !other->HasDied()) - TrySkillProc(other, skillInUse, 0, false, EQEmu::invslot::slotRange); + TrySkillProc(other, skillInUse, 0, false, EQ::invslot::slotRange); } void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51 @@ -1231,19 +1231,19 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51 return; } - int ammo_slot = EQEmu::invslot::slotRange; - const EQEmu::ItemInstance* RangeWeapon = m_inv[EQEmu::invslot::slotRange]; + int ammo_slot = EQ::invslot::slotRange; + const EQ::ItemInstance* RangeWeapon = m_inv[EQ::invslot::slotRange]; if (!RangeWeapon || !RangeWeapon->IsClassCommon()) { - LogCombat("Ranged attack canceled. Missing or invalid ranged weapon ([{}]) in slot [{}]", GetItemIDAt(EQEmu::invslot::slotRange), EQEmu::invslot::slotRange); - Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing to throw!", GetItemIDAt(EQEmu::invslot::slotRange)); + LogCombat("Ranged attack canceled. Missing or invalid ranged weapon ([{}]) in slot [{}]", GetItemIDAt(EQ::invslot::slotRange), EQ::invslot::slotRange); + Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing to throw!", GetItemIDAt(EQ::invslot::slotRange)); return; } - const EQEmu::ItemData* item = RangeWeapon->GetItem(); - if (item->ItemType != EQEmu::item::ItemTypeLargeThrowing && item->ItemType != EQEmu::item::ItemTypeSmallThrowing) { + const EQ::ItemData* item = RangeWeapon->GetItem(); + if (item->ItemType != EQ::item::ItemTypeLargeThrowing && item->ItemType != EQ::item::ItemTypeSmallThrowing) { LogCombat("Ranged attack canceled. Ranged item [{}] is not a throwing weapon. type [{}]", item->ItemType); - Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing useful to throw!", GetItemIDAt(EQEmu::invslot::slotRange)); + Message(0, "Error: Rangeweapon: GetItem(%i)==0, you have nothing useful to throw!", GetItemIDAt(EQ::invslot::slotRange)); return; } @@ -1251,11 +1251,11 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51 if(RangeWeapon->GetCharges() == 1) { //first check ammo - const EQEmu::ItemInstance* AmmoItem = m_inv[EQEmu::invslot::slotAmmo]; + const EQ::ItemInstance* AmmoItem = m_inv[EQ::invslot::slotAmmo]; if(AmmoItem != nullptr && AmmoItem->GetID() == RangeWeapon->GetID()) { //more in the ammo slot, use it RangeWeapon = AmmoItem; - ammo_slot = EQEmu::invslot::slotAmmo; + ammo_slot = EQ::invslot::slotAmmo; LogCombat("Using ammo from ammo slot, stack at slot [{}]. [{}] in stack", ammo_slot, RangeWeapon->GetCharges()); } else { //look through our inventory for more @@ -1301,7 +1301,7 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51 CommonBreakInvisibleFromCombat(); } -void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon, const EQEmu::ItemData *AmmoItem, +void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, const EQ::ItemData *AmmoItem, uint16 weapon_damage, int16 chance_mod, int16 focus, int ReuseTime, uint32 range_id, int AmmoSlot, float speed) { @@ -1311,8 +1311,8 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon return; } - const EQEmu::ItemInstance *_RangeWeapon = nullptr; - const EQEmu::ItemData *ammo_lost = nullptr; + const EQ::ItemInstance *_RangeWeapon = nullptr; + const EQ::ItemData *ammo_lost = nullptr; /* If LaunchProjectile is false this function will do archery damage on target, @@ -1337,7 +1337,7 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon } } } else if (AmmoItem) { - SendItemAnimation(other, AmmoItem, EQEmu::skills::SkillThrowing); + SendItemAnimation(other, AmmoItem, EQ::skills::SkillThrowing); } LogCombat("Throwing attack hit [{}]", other->GetName()); @@ -1351,7 +1351,7 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon WDmg = GetWeaponDamage(other, AmmoItem); if (LaunchProjectile) { - TryProjectileAttack(other, AmmoItem, EQEmu::skills::SkillThrowing, WDmg, RangeWeapon, + TryProjectileAttack(other, AmmoItem, EQ::skills::SkillThrowing, WDmg, RangeWeapon, nullptr, AmmoSlot, speed); return; } @@ -1370,10 +1370,10 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon my_hit.min_damage = 0; my_hit.damage_done = 1; - my_hit.skill = EQEmu::skills::SkillThrowing; + my_hit.skill = EQ::skills::SkillThrowing; my_hit.offense = offense(my_hit.skill); my_hit.tohit = GetTotalToHit(my_hit.skill, chance_mod); - my_hit.hand = EQEmu::invslot::slotRange; + my_hit.hand = EQ::invslot::slotRange; DoAttack(other, my_hit); TotalDmg = my_hit.damage_done; @@ -1384,15 +1384,15 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon } if (IsClient() && !CastToClient()->GetFeigned()) - other->AddToHateList(this, WDmg, 0, false); + other->AddToHateList(this, WDmg, 0); - other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQEmu::skills::SkillThrowing); + other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillThrowing); if (TotalDmg > 0 && HasSkillProcSuccess() && other && !other->HasDied()) { if (ReuseTime) - TrySkillProc(other, EQEmu::skills::SkillThrowing, ReuseTime); + TrySkillProc(other, EQ::skills::SkillThrowing, ReuseTime); else - TrySkillProc(other, EQEmu::skills::SkillThrowing, 0, true, EQEmu::invslot::slotRange); + TrySkillProc(other, EQ::skills::SkillThrowing, 0, true, EQ::invslot::slotRange); } // end old shit @@ -1401,22 +1401,22 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQEmu::ItemInstance *RangeWeapon // Throwing item Proc if (ammo_lost) - TryWeaponProc(nullptr, ammo_lost, other, EQEmu::invslot::slotRange); + TryWeaponProc(nullptr, ammo_lost, other, EQ::invslot::slotRange); else if (RangeWeapon && other && !other->HasDied()) - TryWeaponProc(RangeWeapon, other, EQEmu::invslot::slotRange); + TryWeaponProc(RangeWeapon, other, EQ::invslot::slotRange); if (HasSkillProcs() && other && !other->HasDied()) { if (ReuseTime) - TrySkillProc(other, EQEmu::skills::SkillThrowing, ReuseTime); + TrySkillProc(other, EQ::skills::SkillThrowing, ReuseTime); else - TrySkillProc(other, EQEmu::skills::SkillThrowing, 0, false, EQEmu::invslot::slotRange); + TrySkillProc(other, EQ::skills::SkillThrowing, 0, false, EQ::invslot::slotRange); } if (IsClient()) { - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillThrowing, GetTarget()); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillThrowing, GetTarget()); } } -void Mob::SendItemAnimation(Mob *to, const EQEmu::ItemData *item, EQEmu::skills::SkillType skillInUse, float velocity) { +void Mob::SendItemAnimation(Mob *to, const EQ::ItemData *item, EQ::skills::SkillType skillInUse, float velocity) { auto outapp = new EQApplicationPacket(OP_SomeItemPacketMaybe, sizeof(Arrow_Struct)); Arrow_Struct *as = (Arrow_Struct *) outapp->pBuffer; as->type = 1; @@ -1462,11 +1462,11 @@ void Mob::SendItemAnimation(Mob *to, const EQEmu::ItemData *item, EQEmu::skills: safe_delete(outapp); } -void Mob::ProjectileAnimation(Mob* to, int item_id, bool IsArrow, float speed, float angle, float tilt, float arc, const char *IDFile, EQEmu::skills::SkillType skillInUse) { +void Mob::ProjectileAnimation(Mob* to, int item_id, bool IsArrow, float speed, float angle, float tilt, float arc, const char *IDFile, EQ::skills::SkillType skillInUse) { if (!to) return; - const EQEmu::ItemData* item = nullptr; + const EQ::ItemData* item = nullptr; uint8 item_type = 0; if(!item_id) { @@ -1592,12 +1592,12 @@ void NPC::DoClassAttacks(Mob *target) { } break; case MONK: case MONKGM: { - uint8 satype = EQEmu::skills::SkillKick; - if (level > 29) { satype = EQEmu::skills::SkillFlyingKick; } - else if (level > 24) { satype = EQEmu::skills::SkillDragonPunch; } - else if (level > 19) { satype = EQEmu::skills::SkillEagleStrike; } - else if (level > 9) { satype = EQEmu::skills::SkillTigerClaw; } - else if (level > 4) { satype = EQEmu::skills::SkillRoundKick; } + uint8 satype = EQ::skills::SkillKick; + if (level > 29) { satype = EQ::skills::SkillFlyingKick; } + else if (level > 24) { satype = EQ::skills::SkillDragonPunch; } + else if (level > 19) { satype = EQ::skills::SkillEagleStrike; } + else if (level > 9) { satype = EQ::skills::SkillTigerClaw; } + else if (level > 4) { satype = EQ::skills::SkillRoundKick; } reuse = MonkSpecialAttack(target, satype); reuse *= 1000; @@ -1608,24 +1608,24 @@ void NPC::DoClassAttacks(Mob *target) { if(level >= RuleI(Combat, NPCBashKickLevel)){ if(zone->random.Roll(75)) { //tested on live, warrior mobs both kick and bash, kick about 75% of the time, casting doesn't seem to make a difference. DoAnim(animKick, 0, false); - int32 dmg = GetBaseSkillDamage(EQEmu::skills::SkillKick); + int32 dmg = GetBaseSkillDamage(EQ::skills::SkillKick); - if (GetWeaponDamage(target, (const EQEmu::ItemData*)nullptr) <= 0) + if (GetWeaponDamage(target, (const EQ::ItemData*)nullptr) <= 0) dmg = DMG_INVULNERABLE; reuse = (KickReuseTime + 3) * 1000; - DoSpecialAttackDamage(target, EQEmu::skills::SkillKick, dmg, GetMinDamage(), -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillKick, dmg, GetMinDamage(), -1, reuse); did_attack = true; } else { DoAnim(animTailRake, 0, false); - int32 dmg = GetBaseSkillDamage(EQEmu::skills::SkillBash); + int32 dmg = GetBaseSkillDamage(EQ::skills::SkillBash); - if (GetWeaponDamage(target, (const EQEmu::ItemData*)nullptr) <= 0) + if (GetWeaponDamage(target, (const EQ::ItemData*)nullptr) <= 0) dmg = DMG_INVULNERABLE; reuse = (BashReuseTime + 3) * 1000; - DoSpecialAttackDamage(target, EQEmu::skills::SkillBash, dmg, GetMinDamage(), -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillBash, dmg, GetMinDamage(), -1, reuse); did_attack = true; } } @@ -1633,11 +1633,11 @@ void NPC::DoClassAttacks(Mob *target) { } case BERSERKER: case BERSERKERGM:{ int AtkRounds = 1; - int32 max_dmg = GetBaseSkillDamage(EQEmu::skills::SkillFrenzy); + int32 max_dmg = GetBaseSkillDamage(EQ::skills::SkillFrenzy); DoAnim(anim2HSlashing, 0, false); if (GetClass() == BERSERKER) { - int chance = GetLevel() * 2 + GetSkill(EQEmu::skills::SkillFrenzy); + int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy); if (zone->random.Roll0(450) < chance) AtkRounds++; if (zone->random.Roll0(450) < chance) @@ -1646,7 +1646,7 @@ void NPC::DoClassAttacks(Mob *target) { while (AtkRounds > 0) { if (GetTarget()) - DoSpecialAttackDamage(GetTarget(), EQEmu::skills::SkillFrenzy, max_dmg, GetMinDamage(), -1, reuse); + DoSpecialAttackDamage(GetTarget(), EQ::skills::SkillFrenzy, max_dmg, GetMinDamage(), -1, reuse); AtkRounds--; } @@ -1658,13 +1658,13 @@ void NPC::DoClassAttacks(Mob *target) { //kick if(level >= RuleI(Combat, NPCBashKickLevel)){ DoAnim(animKick, 0, false); - int32 dmg = GetBaseSkillDamage(EQEmu::skills::SkillKick); + int32 dmg = GetBaseSkillDamage(EQ::skills::SkillKick); - if (GetWeaponDamage(target, (const EQEmu::ItemData*)nullptr) <= 0) + if (GetWeaponDamage(target, (const EQ::ItemData*)nullptr) <= 0) dmg = DMG_INVULNERABLE; reuse = (KickReuseTime + 3) * 1000; - DoSpecialAttackDamage(target, EQEmu::skills::SkillKick, dmg, GetMinDamage(), -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillKick, dmg, GetMinDamage(), -1, reuse); did_attack = true; } break; @@ -1674,13 +1674,13 @@ void NPC::DoClassAttacks(Mob *target) { case PALADIN: case PALADINGM:{ if(level >= RuleI(Combat, NPCBashKickLevel)){ DoAnim(animTailRake, 0, false); - int32 dmg = GetBaseSkillDamage(EQEmu::skills::SkillBash); + int32 dmg = GetBaseSkillDamage(EQ::skills::SkillBash); - if (GetWeaponDamage(target, (const EQEmu::ItemData*)nullptr) <= 0) + if (GetWeaponDamage(target, (const EQ::ItemData*)nullptr) <= 0) dmg = DMG_INVULNERABLE; reuse = (BashReuseTime + 3) * 1000; - DoSpecialAttackDamage(target, EQEmu::skills::SkillBash, dmg, GetMinDamage(), -1, reuse); + DoSpecialAttackDamage(target, EQ::skills::SkillBash, dmg, GetMinDamage(), -1, reuse); did_attack = true; } break; @@ -1721,43 +1721,43 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) case WARRIOR: case RANGER: case BEASTLORD: - skill_to_use = EQEmu::skills::SkillKick; + skill_to_use = EQ::skills::SkillKick; break; case BERSERKER: - skill_to_use = EQEmu::skills::SkillFrenzy; + skill_to_use = EQ::skills::SkillFrenzy; break; case SHADOWKNIGHT: case PALADIN: - skill_to_use = EQEmu::skills::SkillBash; + skill_to_use = EQ::skills::SkillBash; break; case MONK: if(GetLevel() >= 30) { - skill_to_use = EQEmu::skills::SkillFlyingKick; + skill_to_use = EQ::skills::SkillFlyingKick; } else if(GetLevel() >= 25) { - skill_to_use = EQEmu::skills::SkillDragonPunch; + skill_to_use = EQ::skills::SkillDragonPunch; } else if(GetLevel() >= 20) { - skill_to_use = EQEmu::skills::SkillEagleStrike; + skill_to_use = EQ::skills::SkillEagleStrike; } else if(GetLevel() >= 10) { - skill_to_use = EQEmu::skills::SkillTigerClaw; + skill_to_use = EQ::skills::SkillTigerClaw; } else if(GetLevel() >= 5) { - skill_to_use = EQEmu::skills::SkillRoundKick; + skill_to_use = EQ::skills::SkillRoundKick; } else { - skill_to_use = EQEmu::skills::SkillKick; + skill_to_use = EQ::skills::SkillKick; } break; case ROGUE: - skill_to_use = EQEmu::skills::SkillBackstab; + skill_to_use = EQ::skills::SkillBackstab; break; } } @@ -1768,18 +1768,18 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) if(skill_to_use == -1) return; - int dmg = GetBaseSkillDamage(static_cast(skill_to_use), GetTarget()); + int dmg = GetBaseSkillDamage(static_cast(skill_to_use), GetTarget()); - if (skill_to_use == EQEmu::skills::SkillBash) { + if (skill_to_use == EQ::skills::SkillBash) { if (ca_target!=this) { DoAnim(animTailRake, 0, false); - if (GetWeaponDamage(ca_target, GetInv().GetItem(EQEmu::invslot::slotSecondary)) <= 0 && GetWeaponDamage(ca_target, GetInv().GetItem(EQEmu::invslot::slotShoulders)) <= 0) + if (GetWeaponDamage(ca_target, GetInv().GetItem(EQ::invslot::slotSecondary)) <= 0 && GetWeaponDamage(ca_target, GetInv().GetItem(EQ::invslot::slotShoulders)) <= 0) dmg = DMG_INVULNERABLE; ReuseTime = (BashReuseTime - 1) / HasteMod; - DoSpecialAttackDamage(ca_target, EQEmu::skills::SkillBash, dmg, 0, -1, ReuseTime); + DoSpecialAttackDamage(ca_target, EQ::skills::SkillBash, dmg, 0, -1, ReuseTime); if(ReuseTime > 0 && !IsRiposte) { p_timers.Start(pTimerCombatAbility, ReuseTime); @@ -1788,8 +1788,8 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) return; } - if (skill_to_use == EQEmu::skills::SkillFrenzy) { - CheckIncreaseSkill(EQEmu::skills::SkillFrenzy, GetTarget(), 10); + if (skill_to_use == EQ::skills::SkillFrenzy) { + CheckIncreaseSkill(EQ::skills::SkillFrenzy, GetTarget(), 10); int AtkRounds = 1; DoAnim(anim2HSlashing, 0, false); @@ -1797,7 +1797,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) // bards can do riposte frenzy for some reason if (!IsRiposte && GetClass() == BERSERKER) { - int chance = GetLevel() * 2 + GetSkill(EQEmu::skills::SkillFrenzy); + int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy); if (zone->random.Roll0(450) < chance) AtkRounds++; if (zone->random.Roll0(450) < chance) @@ -1806,7 +1806,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) while(AtkRounds > 0) { if (ca_target!=this) - DoSpecialAttackDamage(ca_target, EQEmu::skills::SkillFrenzy, dmg, 0, dmg, ReuseTime); + DoSpecialAttackDamage(ca_target, EQ::skills::SkillFrenzy, dmg, 0, dmg, ReuseTime); AtkRounds--; } @@ -1816,20 +1816,20 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) return; } - if (skill_to_use == EQEmu::skills::SkillKick){ + if (skill_to_use == EQ::skills::SkillKick){ if(ca_target!=this){ DoAnim(animKick, 0, false); - if (GetWeaponDamage(ca_target, GetInv().GetItem(EQEmu::invslot::slotFeet)) <= 0) + if (GetWeaponDamage(ca_target, GetInv().GetItem(EQ::invslot::slotFeet)) <= 0) dmg = DMG_INVULNERABLE; ReuseTime = KickReuseTime-1; - DoSpecialAttackDamage(ca_target, EQEmu::skills::SkillKick, dmg, 0, -1, ReuseTime); + DoSpecialAttackDamage(ca_target, EQ::skills::SkillKick, dmg, 0, -1, ReuseTime); } } - if (skill_to_use == EQEmu::skills::SkillFlyingKick || skill_to_use == EQEmu::skills::SkillDragonPunch || skill_to_use == EQEmu::skills::SkillEagleStrike || skill_to_use == EQEmu::skills::SkillTigerClaw || skill_to_use == EQEmu::skills::SkillRoundKick) { + if (skill_to_use == EQ::skills::SkillFlyingKick || skill_to_use == EQ::skills::SkillDragonPunch || skill_to_use == EQ::skills::SkillEagleStrike || skill_to_use == EQ::skills::SkillTigerClaw || skill_to_use == EQ::skills::SkillRoundKick) { ReuseTime = MonkSpecialAttack(ca_target, skill_to_use) - 1; MonkSpecialAttack(ca_target, skill_to_use); @@ -1839,9 +1839,9 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) //Live AA - Technique of Master Wu int wuchance = itembonuses.DoubleSpecialAttack + spellbonuses.DoubleSpecialAttack + aabonuses.DoubleSpecialAttack; if (wuchance) { - const int MonkSPA[5] = {EQEmu::skills::SkillFlyingKick, EQEmu::skills::SkillDragonPunch, - EQEmu::skills::SkillEagleStrike, EQEmu::skills::SkillTigerClaw, - EQEmu::skills::SkillRoundKick}; + const int MonkSPA[5] = {EQ::skills::SkillFlyingKick, EQ::skills::SkillDragonPunch, + EQ::skills::SkillEagleStrike, EQ::skills::SkillTigerClaw, + EQ::skills::SkillRoundKick}; int extra = 0; // always 1/4 of the double attack chance, 25% at rank 5 (100/4) while (wuchance > 0) { @@ -1865,7 +1865,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte) } } - if (skill_to_use == EQEmu::skills::SkillBackstab){ + if (skill_to_use == EQ::skills::SkillBackstab){ ReuseTime = BackstabReuseTime-1; if (IsRiposte) @@ -1892,7 +1892,7 @@ void Mob::Taunt(NPC *who, bool always_succeed, int chance_bonus, bool FromSpell, return; if (!always_succeed && IsClient()) - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillTaunt, who, 10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillTaunt, who, 10); Mob *hate_top = who->GetHateMost(); @@ -1936,8 +1936,8 @@ void Mob::Taunt(NPC *who, bool always_succeed, int chance_bonus, bool FromSpell, // result. if (IsClient() && !always_succeed) tauntchance -= (RuleR(Combat, TauntSkillFalloff) * - (CastToClient()->MaxSkill(EQEmu::skills::SkillTaunt) - - GetSkill(EQEmu::skills::SkillTaunt))); + (CastToClient()->MaxSkill(EQ::skills::SkillTaunt) - + GetSkill(EQ::skills::SkillTaunt))); if (tauntchance < 1) tauntchance = 1.0f; @@ -1966,10 +1966,10 @@ void Mob::Taunt(NPC *who, bool always_succeed, int chance_bonus, bool FromSpell, } if (HasSkillProcs()) - TrySkillProc(who, EQEmu::skills::SkillTaunt, TauntReuseTime * 1000); + TrySkillProc(who, EQ::skills::SkillTaunt, TauntReuseTime * 1000); if (Success && HasSkillProcSuccess()) - TrySkillProc(who, EQEmu::skills::SkillTaunt, TauntReuseTime * 1000, true); + TrySkillProc(who, EQ::skills::SkillTaunt, TauntReuseTime * 1000, true); } void Mob::InstillDoubt(Mob *who) { @@ -1988,14 +1988,14 @@ void Mob::InstillDoubt(Mob *who) { return; if(IsClient()) { - CastToClient()->CheckIncreaseSkill(EQEmu::skills::SkillIntimidation, who, 10); + CastToClient()->CheckIncreaseSkill(EQ::skills::SkillIntimidation, who, 10); } //I think this formula needs work int value = 0; //user's bonus - value += GetSkill(EQEmu::skills::SkillIntimidation) + GetCHA() / 4; + value += GetSkill(EQ::skills::SkillIntimidation) + GetCHA() / 4; //target's counters value -= target->GetLevel()*4 + who->GetWIS()/4; @@ -2017,11 +2017,11 @@ void Mob::InstillDoubt(Mob *who) { } } -int Mob::TryHeadShot(Mob *defender, EQEmu::skills::SkillType skillInUse) +int Mob::TryHeadShot(Mob *defender, EQ::skills::SkillType skillInUse) { // Only works on YOUR target. if (defender && defender->GetBodyType() == BT_Humanoid && !defender->IsClient() && - skillInUse == EQEmu::skills::SkillArchery && GetTarget() == defender) { + skillInUse == EQ::skills::SkillArchery && GetTarget() == defender) { uint32 HeadShot_Dmg = aabonuses.HeadShot[1] + spellbonuses.HeadShot[1] + itembonuses.HeadShot[1]; uint8 HeadShot_Level = 0; // Get Highest Headshot Level HeadShot_Level = std::max({aabonuses.HSLevel[0], spellbonuses.HSLevel[0], itembonuses.HSLevel[0]}); @@ -2048,12 +2048,12 @@ int Mob::TryHeadShot(Mob *defender, EQEmu::skills::SkillType skillInUse) return 0; } -int Mob::TryAssassinate(Mob *defender, EQEmu::skills::SkillType skillInUse) +int Mob::TryAssassinate(Mob *defender, EQ::skills::SkillType skillInUse) { if (defender && (defender->GetBodyType() == BT_Humanoid) && !defender->IsClient() && GetLevel() >= 60 && - (skillInUse == EQEmu::skills::SkillBackstab || skillInUse == EQEmu::skills::SkillThrowing)) { + (skillInUse == EQ::skills::SkillBackstab || skillInUse == EQ::skills::SkillThrowing)) { int chance = GetDEX(); - if (skillInUse == EQEmu::skills::SkillBackstab) { + if (skillInUse == EQ::skills::SkillBackstab) { chance = 100 * chance / (chance + 3500); if (IsClient()) chance += CastToClient()->GetHeroicDEX(); @@ -2061,7 +2061,7 @@ int Mob::TryAssassinate(Mob *defender, EQEmu::skills::SkillType skillInUse) int norm = aabonuses.AssassinateLevel[1]; if (norm > 0) chance = chance * norm / 100; - } else if (skillInUse == EQEmu::skills::SkillThrowing) { + } else if (skillInUse == EQ::skills::SkillThrowing) { if (chance > 255) chance = 260; else @@ -2094,7 +2094,7 @@ int Mob::TryAssassinate(Mob *defender, EQEmu::skills::SkillType skillInUse) return 0; } -void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQEmu::skills::SkillType skillinuse, int16 chance_mod, +void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQ::skills::SkillType skillinuse, int16 chance_mod, int16 focus, bool CanRiposte, int ReuseTime) { if (!CanDoSpecialAttack(other)) @@ -2106,8 +2106,8 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQEmu::skills: TODO: We need to stop moving skill 98, it's suppose to just be a dummy skill AFAIK Spells using offense should use the skill of your primary, if you can use it, otherwise h2h */ - if (skillinuse == EQEmu::skills::SkillBegging) - skillinuse = EQEmu::skills::SkillOffense; + if (skillinuse == EQ::skills::SkillBegging) + skillinuse = EQ::skills::SkillOffense; int damage = 0; uint32 hate = 0; @@ -2118,15 +2118,15 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQEmu::skills: if (focus) // From FcBaseEffects weapon_damage += weapon_damage * focus / 100; - if (skillinuse == EQEmu::skills::SkillBash) { + if (skillinuse == EQ::skills::SkillBash) { if (IsClient()) { - EQEmu::ItemInstance *item = - CastToClient()->GetInv().GetItem(EQEmu::invslot::slotSecondary); + EQ::ItemInstance *item = + CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); if (item) { - if (item->GetItem()->ItemType == EQEmu::item::ItemTypeShield) { + if (item->GetItem()->ItemType == EQ::item::ItemTypeShield) { hate += item->GetItem()->AC; } - const EQEmu::ItemData *itm = item->GetItem(); + const EQ::ItemData *itm = item->GetItem(); hate = hate * (100 + GetFuriousBash(itm->Focus.Effect)) / 100; } } @@ -2141,7 +2141,7 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQEmu::skills: my_hit.offense = offense(my_hit.skill); my_hit.tohit = GetTotalToHit(my_hit.skill, chance_mod); // slot range exclude ripe etc ... - my_hit.hand = CanRiposte ? EQEmu::invslot::slotRange : EQEmu::invslot::slotPrimary; + my_hit.hand = CanRiposte ? EQ::invslot::slotRange : EQ::invslot::slotPrimary; if (IsNPC()) my_hit.min_damage = CastToNPC()->GetMinDamage(); @@ -2153,17 +2153,17 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQEmu::skills: } bool CanSkillProc = true; - if (skillinuse == EQEmu::skills::SkillOffense) { // Hack to allow damage to display. - skillinuse = EQEmu::skills::SkillTigerClaw; //'strike' your opponent - Arbitrary choice for message. + if (skillinuse == EQ::skills::SkillOffense) { // Hack to allow damage to display. + skillinuse = EQ::skills::SkillTigerClaw; //'strike' your opponent - Arbitrary choice for message. CanSkillProc = false; // Disable skill procs } - other->AddToHateList(this, hate, 0, false); + other->AddToHateList(this, hate, 0); if (damage > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skillinuse && IsValidSpell(aabonuses.SkillAttackProc[2])) { float chance = aabonuses.SkillAttackProc[0] / 1000.0f; if (zone->random.Roll(chance)) - SpellFinished(aabonuses.SkillAttackProc[2], other, EQEmu::spells::CastingSlot::Item, 0, -1, + SpellFinished(aabonuses.SkillAttackProc[2], other, EQ::spells::CastingSlot::Item, 0, -1, spells[aabonuses.SkillAttackProc[2]].ResistDiff); } diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 63a4a113f..b6c2f9cf8 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -49,7 +49,7 @@ extern WorldServer worldserver; bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_override) { int caster_level, buffslot, effect, effect_value, i; - EQEmu::ItemInstance *SummonedItem=nullptr; + EQ::ItemInstance *SummonedItem=nullptr; #ifdef SPELL_EFFECT_SPAM #define _EDLEN 200 char effect_desc[_EDLEN]; @@ -65,7 +65,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove bool c_override = false; if (caster && caster->IsClient() && GetCastedSpellInvSlot() > 0) { - const EQEmu::ItemInstance *inst = caster->CastToClient()->GetInv().GetItem(GetCastedSpellInvSlot()); + const EQ::ItemInstance *inst = caster->CastToClient()->GetInv().GetItem(GetCastedSpellInvSlot()); if (inst) { if (inst->GetItem()->Click.Level > 0) { caster_level = inst->GetItem()->Click.Level; @@ -149,7 +149,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove if (spells[spell_id].EndurUpkeep > 0) SetEndurUpkeep(true); - if (IsClient() && CastToClient()->ClientVersionBit() & EQEmu::versions::maskUFAndLater) + if (IsClient() && CastToClient()->ClientVersionBit() & EQ::versions::maskUFAndLater) { EQApplicationPacket *outapp = MakeBuffsPacket(false); CastToClient()->FastQueuePacket(&outapp); @@ -158,7 +158,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove if(IsNPC()) { - std::vector args; + std::vector args; args.push_back(&buffslot); int i = parse->EventSpell(EVENT_SPELL_EFFECT_NPC, CastToNPC(), nullptr, spell_id, caster ? caster->GetID() : 0, &args); if(i != 0){ @@ -168,7 +168,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove } else if(IsClient()) { - std::vector args; + std::vector args; args.push_back(&buffslot); int i = parse->EventSpell(EVENT_SPELL_EFFECT_CLIENT, nullptr, CastToClient(), spell_id, caster ? caster->GetID() : 0, &args); if(i != 0){ @@ -627,7 +627,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove snprintf(effect_desc, _EDLEN, "Flesh To Bone"); #endif if(IsClient()){ - EQEmu::ItemInstance* transI = CastToClient()->GetInv().GetItem(EQEmu::invslot::slotCursor); + EQ::ItemInstance* transI = CastToClient()->GetInv().GetItem(EQ::invslot::slotCursor); if (transI && transI->IsClassCommon() && transI->IsStackable()){ uint32 fcharges = transI->GetCharges(); //Does it sound like meat... maybe should check if it looks like meat too... @@ -637,7 +637,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove strstr(transI->GetItem()->Name, "Flesh") || strstr(transI->GetItem()->Name, "parts") || strstr(transI->GetItem()->Name, "Parts")){ - CastToClient()->DeleteItemInInventory(EQEmu::invslot::slotCursor, fcharges, true); + CastToClient()->DeleteItemInInventory(EQ::invslot::slotCursor, fcharges, true); CastToClient()->SummonItem(13073, fcharges); } else{ @@ -774,6 +774,13 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove caster->SetPet(this); SetOwnerID(caster->GetID()); SetPetOrder(SPO_Follow); + SetAppearance(eaStanding); + // Client has saved previous pet sit/stand - make all new pets + // stand on charm. + if (caster->IsClient()) { + caster->CastToClient()->SetPetCommandState(PET_BUTTON_SIT,0); + } + SetPetType(petCharmed); if(caster->IsClient()){ @@ -829,7 +836,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove #endif if(IsClient()) { - if (CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoDAndLater) + if (CastToClient()->ClientVersionBit() & EQ::versions::maskSoDAndLater) { bodyType bt = BT_Undead; @@ -1152,7 +1159,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove case SE_SummonItem: { - const EQEmu::ItemData *item = database.GetItem(spell.base[i]); + const EQ::ItemData *item = database.GetItem(spell.base[i]); #ifdef SPELL_EFFECT_SPAM const char *itemname = item ? item->Name : "*Unknown Item*"; snprintf(effect_desc, _EDLEN, "Summon Item: %s (id %d)", itemname, spell.base[i]); @@ -1177,7 +1184,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove if (SummonedItem) { c->PushItemOnCursor(*SummonedItem); - c->SendItemPacket(EQEmu::invslot::slotCursor, SummonedItem, ItemPacketLimbo); + c->SendItemPacket(EQ::invslot::slotCursor, SummonedItem, ItemPacketLimbo); safe_delete(SummonedItem); } SummonedItem = database.CreateItem(spell.base[i], charges); @@ -1188,7 +1195,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove } case SE_SummonItemIntoBag: { - const EQEmu::ItemData *item = database.GetItem(spell.base[i]); + const EQ::ItemData *item = database.GetItem(spell.base[i]); #ifdef SPELL_EFFECT_SPAM const char *itemname = item ? item->Name : "*Unknown Item*"; snprintf(effect_desc, _EDLEN, "Summon Item In Bag: %s (id %d)", itemname, spell.base[i]); @@ -1217,7 +1224,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove if (charges < 1) charges = 1; - EQEmu::ItemInstance *SubItem = database.CreateItem(spell.base[i], charges); + EQ::ItemInstance *SubItem = database.CreateItem(spell.base[i], charges); if (SubItem != nullptr) { SummonedItem->PutItem(slot, *SubItem); safe_delete(SubItem); @@ -1245,15 +1252,18 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove MakePet(spell_id, spell.teleport_zone); // TODO: we need to sync the states for these clients ... // Will fix buttons for now - if (IsClient()) { + Mob *pet=GetPet(); + if (IsClient() && pet) { auto c = CastToClient(); - if (c->ClientVersionBit() & EQEmu::versions::maskUFAndLater) { + if (c->ClientVersionBit() & EQ::versions::maskUFAndLater) { c->SetPetCommandState(PET_BUTTON_SIT, 0); c->SetPetCommandState(PET_BUTTON_STOP, 0); c->SetPetCommandState(PET_BUTTON_REGROUP, 0); c->SetPetCommandState(PET_BUTTON_FOLLOW, 1); c->SetPetCommandState(PET_BUTTON_GUARD, 0); - c->SetPetCommandState(PET_BUTTON_TAUNT, 1); + // Creating pet from spell - taunt always false + // If suspended pet - that will be restore there + // If logging in, client will send toggle c->SetPetCommandState(PET_BUTTON_HOLD, 0); c->SetPetCommandState(PET_BUTTON_GHOLD, 0); c->SetPetCommandState(PET_BUTTON_FOCUS, 0); @@ -1466,7 +1476,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove } } - for (int x = EQEmu::textures::textureBegin; x <= EQEmu::textures::LastTintableTexture; x++) + for (int x = EQ::textures::textureBegin; x <= EQ::textures::LastTintableTexture; x++) SendWearChange(x); if (caster == this && spell.id != 287 && spell.id != 601 && @@ -1492,7 +1502,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove ); caster->SendAppearancePacket(AT_Size, static_cast(caster->GetTarget()->GetSize())); - for (int x = EQEmu::textures::textureBegin; x <= EQEmu::textures::LastTintableTexture; x++) + for (int x = EQ::textures::textureBegin; x <= EQ::textures::LastTintableTexture; x++) caster->SendWearChange(x); } } @@ -1670,7 +1680,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove #endif // This is handled by the client prior to SoD. // - if (IsClient() && (CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoDAndLater)) + if (IsClient() && (CastToClient()->ClientVersionBit() & EQ::versions::maskSoDAndLater)) CastToClient()->LocateCorpse(); break; @@ -2278,7 +2288,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove snprintf(effect_desc, _EDLEN, "Rampage"); #endif if(caster) - entity_list.AEAttack(caster, 30, EQEmu::invslot::slotPrimary, 0, true); // on live wars dont get a duration ramp, its a one shot deal + entity_list.AEAttack(caster, 30, EQ::invslot::slotPrimary, 0, true); // on live wars dont get a duration ramp, its a one shot deal break; } @@ -2329,10 +2339,10 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove focus = caster->GetFocusEffect(focusFcBaseEffects, spell_id); switch(spells[spell_id].skill) { - case EQEmu::skills::SkillThrowing: + case EQ::skills::SkillThrowing: caster->DoThrowingAttackDmg(this, nullptr, nullptr, spells[spell_id].base[i],spells[spell_id].base2[i], focus, ReuseTime); break; - case EQEmu::skills::SkillArchery: + case EQ::skills::SkillArchery: caster->DoArcheryAttackDmg(this, nullptr, nullptr, spells[spell_id].base[i],spells[spell_id].base2[i],focus, ReuseTime); break; default: @@ -2532,7 +2542,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove case SE_FcTimerRefresh: { if(IsClient()) { - for (unsigned int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; ++i) { + for (unsigned int i = 0; i < EQ::spells::SPELL_GEM_COUNT; ++i) { if(IsValidSpell(CastToClient()->m_pp.mem_spells[i])) { if (CalcFocusEffect(focusFcTimerRefresh, spell_id, CastToClient()->m_pp.mem_spells[i])){ CastToClient()->m_pp.spellSlotRefresh[i] = 1; @@ -2801,7 +2811,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove if (caster && IsValidSpell(spells[spell_id].base2[i])){ if(zone->random.Roll(spells[spell_id].base[i])) - caster->SpellFinished(spells[spell_id].base2[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[i]].ResistDiff); + caster->SpellFinished(spells[spell_id].base2[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].base2[i]].ResistDiff); } break; } @@ -3080,7 +3090,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove if (SummonedItem) { Client *c=CastToClient(); c->PushItemOnCursor(*SummonedItem); - c->SendItemPacket(EQEmu::invslot::slotCursor, SummonedItem, ItemPacketLimbo); + c->SendItemPacket(EQ::invslot::slotCursor, SummonedItem, ItemPacketLimbo); safe_delete(SummonedItem); } @@ -3105,7 +3115,7 @@ int Mob::CalcSpellEffectValue(uint16 spell_id, int effect_id, int caster_level, effect_value = CalcSpellEffectValue_formula(formula, base, max, caster_level, spell_id, ticsremaining); // this doesn't actually need to be a song to get mods, just the right skill - if (EQEmu::skills::IsBardInstrumentSkill(spells[spell_id].skill) && + if (EQ::skills::IsBardInstrumentSkill(spells[spell_id].skill) && spells[spell_id].effectid[effect_id] != SE_AttackSpeed && spells[spell_id].effectid[effect_id] != SE_AttackSpeed2 && spells[spell_id].effectid[effect_id] != SE_AttackSpeed3 && @@ -3464,7 +3474,7 @@ void Mob::BuffProcess() LogSpells("Buff [{}] in slot [{}] has [{}] tics remaining", buffs[buffs_i].spellid, buffs_i, buffs[buffs_i].ticsremaining); } } - else if (IsClient() && !(CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoFAndLater)) + else if (IsClient() && !(CastToClient()->ClientVersionBit() & EQ::versions::maskSoFAndLater)) { buffs[buffs_i].UpdateClient = true; } @@ -3476,7 +3486,7 @@ void Mob::BuffProcess() { CastToClient()->SendBuffDurationPacket(buffs[buffs_i], buffs_i); // Hack to get UF to play nicer, RoF seems fine without it - if (CastToClient()->ClientVersion() == EQEmu::versions::ClientVersion::UF && buffs[buffs_i].numhits > 0) + if (CastToClient()->ClientVersion() == EQ::versions::ClientVersion::UF && buffs[buffs_i].numhits > 0) CastToClient()->SendBuffNumHitPacket(buffs[buffs_i], buffs_i); buffs[buffs_i].UpdateClient = false; } @@ -3495,7 +3505,7 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) const SPDat_Spell_Struct &spell = spells[buff.spellid]; if (IsNPC()) { - std::vector args; + std::vector args; args.push_back(&buff.ticsremaining); args.push_back(&buff.casterlevel); args.push_back(&slot); @@ -3505,7 +3515,7 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) return; } } else { - std::vector args; + std::vector args; args.push_back(&buff.ticsremaining); args.push_back(&buff.casterlevel); args.push_back(&slot); @@ -3686,13 +3696,13 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) if (!IsBardSong(buff.spellid)) { double break_chance = 2.0; if (caster) { - break_chance -= (2 * (((double)caster->GetSkill(EQEmu::skills::SkillDivination) + + break_chance -= (2 * (((double)caster->GetSkill(EQ::skills::SkillDivination) + ((double)caster->GetLevel() * 3.0)) / 650.0)); } else { break_chance -= (2 * - (((double)GetSkill(EQEmu::skills::SkillDivination) + ((double)GetLevel() * 3.0)) / + (((double)GetSkill(EQ::skills::SkillDivination) + ((double)GetLevel() * 3.0)) / 650.0)); } @@ -3724,14 +3734,14 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) case SE_CastOnFadeEffectNPC: case SE_CastOnFadeEffectAlways: { if (buff.ticsremaining == 0) { - SpellFinished(spells[buff.spellid].base[i], this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spells[buff.spellid].base[i]].ResistDiff); + SpellFinished(spells[buff.spellid].base[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[buff.spellid].base[i]].ResistDiff); } break; } case SE_LocateCorpse: { // This is handled by the client prior to SoD. - if (IsClient() && (CastToClient()->ClientVersionBit() & EQEmu::versions::maskSoDAndLater)) + if (IsClient() && (CastToClient()->ClientVersionBit() & EQ::versions::maskSoDAndLater)) CastToClient()->LocateCorpse(); } @@ -3812,12 +3822,12 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) } if(IsClient()) { - std::vector args; + std::vector args; args.push_back(&buffs[slot].casterid); parse->EventSpell(EVENT_SPELL_FADE, nullptr, CastToClient(), buffs[slot].spellid, slot, &args); } else if(IsNPC()) { - std::vector args; + std::vector args; args.push_back(&buffs[slot].casterid); parse->EventSpell(EVENT_SPELL_FADE, CastToNPC(), nullptr, buffs[slot].spellid, slot, &args); @@ -3889,7 +3899,7 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) else{ SendAppearancePacket(AT_Size, 6); } - for (int x = EQEmu::textures::textureBegin; x <= EQEmu::textures::LastTintableTexture; x++){ + for (int x = EQ::textures::textureBegin; x <= EQ::textures::LastTintableTexture; x++){ SendWearChange(x); } break; @@ -4155,7 +4165,7 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) { EQApplicationPacket *outapp = MakeBuffsPacket(); - entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQEmu::versions::maskSoDAndLater); + entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQ::versions::maskSoDAndLater); if(IsClient() && GetTarget() == this) { CastToClient()->QueuePacket(outapp); } @@ -4165,11 +4175,11 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) if (IsNPC()) { EQApplicationPacket *outapp = MakeBuffsPacket(); - entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQEmu::versions::maskSoDAndLater, true); + entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQ::versions::maskSoDAndLater, true); safe_delete(outapp); } - if (IsClient() && CastToClient()->ClientVersionBit() & EQEmu::versions::maskUFAndLater) + if (IsClient() && CastToClient()->ClientVersionBit() & EQ::versions::maskUFAndLater) { EQApplicationPacket *outapp = MakeBuffsPacket(false); CastToClient()->FastQueuePacket(&outapp); @@ -5170,7 +5180,7 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo if (Caston_spell_id) { if (IsValidSpell(Caston_spell_id) && (Caston_spell_id != spell_id)) - SpellFinished(Caston_spell_id, this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[Caston_spell_id].ResistDiff); + SpellFinished(Caston_spell_id, this, EQ::spells::CastingSlot::Item, 0, -1, spells[Caston_spell_id].ResistDiff); } return (value * lvlModifier / 100); @@ -5189,15 +5199,15 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { //item focus if (itembonuses.FocusEffects[type]){ - const EQEmu::ItemData* TempItem = nullptr; + const EQ::ItemData* TempItem = nullptr; - for (int x = EQEmu::invslot::EQUIPMENT_BEGIN; x <= EQEmu::invslot::EQUIPMENT_END; x++) + for (int x = EQ::invslot::EQUIPMENT_BEGIN; x <= EQ::invslot::EQUIPMENT_END; x++) { if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) continue; TempItem = nullptr; - EQEmu::ItemInstance* ins = GetInv().GetItem(x); + EQ::ItemInstance* ins = GetInv().GetItem(x); if (!ins) continue; TempItem = ins->GetItem(); @@ -5211,16 +5221,16 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { } } - for (int y = EQEmu::invaug::SOCKET_BEGIN; y <= EQEmu::invaug::SOCKET_END; ++y) + for (int y = EQ::invaug::SOCKET_BEGIN; y <= EQ::invaug::SOCKET_END; ++y) { if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) continue; - EQEmu::ItemInstance *aug = nullptr; + EQ::ItemInstance *aug = nullptr; aug = ins->GetAugment(y); if(aug) { - const EQEmu::ItemData* TempItemAug = aug->GetItem(); + const EQ::ItemData* TempItemAug = aug->GetItem(); if (TempItemAug && TempItemAug->Focus.Effect > 0 && IsValidSpell(TempItemAug->Focus.Effect)) { proc_spellid = CalcFocusEffect(type, TempItemAug->Focus.Effect, spell_id); if (IsValidSpell(proc_spellid)){ @@ -5318,18 +5328,18 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) //Check if item focus effect exists for the client. if (itembonuses.FocusEffects[type]){ - const EQEmu::ItemData* TempItem = nullptr; - const EQEmu::ItemData* UsedItem = nullptr; + const EQ::ItemData* TempItem = nullptr; + const EQ::ItemData* UsedItem = nullptr; uint16 UsedFocusID = 0; int16 Total = 0; int16 focus_max = 0; int16 focus_max_real = 0; //item focus - for (int x = EQEmu::invslot::EQUIPMENT_BEGIN; x <= EQEmu::invslot::EQUIPMENT_END; x++) + for (int x = EQ::invslot::EQUIPMENT_BEGIN; x <= EQ::invslot::EQUIPMENT_END; x++) { TempItem = nullptr; - EQEmu::ItemInstance* ins = GetInv().GetItem(x); + EQ::ItemInstance* ins = GetInv().GetItem(x); if (!ins) continue; TempItem = ins->GetItem(); @@ -5360,13 +5370,13 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) } } - for (int y = EQEmu::invaug::SOCKET_BEGIN; y <= EQEmu::invaug::SOCKET_END; ++y) + for (int y = EQ::invaug::SOCKET_BEGIN; y <= EQ::invaug::SOCKET_END; ++y) { - EQEmu::ItemInstance *aug = nullptr; + EQ::ItemInstance *aug = nullptr; aug = ins->GetAugment(y); if(aug) { - const EQEmu::ItemData* TempItemAug = aug->GetItem(); + const EQ::ItemData* TempItemAug = aug->GetItem(); if (TempItemAug && TempItemAug->Focus.Effect > 0 && TempItemAug->Focus.Effect != SPELL_UNKNOWN) { if(rand_effectiveness) { focus_max = CalcFocusEffect(type, TempItemAug->Focus.Effect, spell_id, true); @@ -5398,10 +5408,10 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) } //Tribute Focus - for (int x = EQEmu::invslot::TRIBUTE_BEGIN; x <= EQEmu::invslot::TRIBUTE_END; ++x) + for (int x = EQ::invslot::TRIBUTE_BEGIN; x <= EQ::invslot::TRIBUTE_END; ++x) { TempItem = nullptr; - EQEmu::ItemInstance* ins = GetInv().GetItem(x); + EQ::ItemInstance* ins = GetInv().GetItem(x); if (!ins) continue; TempItem = ins->GetItem(); @@ -5590,16 +5600,16 @@ int16 NPC::GetFocusEffect(focusType type, uint16 spell_id) { if (RuleB(Spells, NPC_UseFocusFromItems) && itembonuses.FocusEffects[type]){ - const EQEmu::ItemData* TempItem = nullptr; - const EQEmu::ItemData* UsedItem = nullptr; + const EQ::ItemData* TempItem = nullptr; + const EQ::ItemData* UsedItem = nullptr; uint16 UsedFocusID = 0; int16 Total = 0; int16 focus_max = 0; int16 focus_max_real = 0; //item focus - for (int i = EQEmu::invslot::EQUIPMENT_BEGIN; i <= EQEmu::invslot::EQUIPMENT_END; i++){ - const EQEmu::ItemData *cur = database.GetItem(equipment[i]); + for (int i = EQ::invslot::EQUIPMENT_BEGIN; i <= EQ::invslot::EQUIPMENT_END; i++){ + const EQ::ItemData *cur = database.GetItem(equipment[i]); if(!cur) continue; @@ -6702,7 +6712,7 @@ bool Mob::TrySpellProjectile(Mob* spell_target, uint16 spell_id, float speed){ ProjectileAtk[slot].origin_x = GetX(); ProjectileAtk[slot].origin_y = GetY(); ProjectileAtk[slot].origin_z = GetZ(); - ProjectileAtk[slot].skill = EQEmu::skills::SkillConjuration; + ProjectileAtk[slot].skill = EQ::skills::SkillConjuration; ProjectileAtk[slot].speed_mod = speed_mod; SetProjectileAttack(true); @@ -6758,7 +6768,7 @@ void Mob::ResourceTap(int32 damage, uint16 spellid) if (damage > 0) HealDamage(damage); else - Damage(this, -damage, 0, EQEmu::skills::SkillEvocation, false); + Damage(this, -damage, 0, EQ::skills::SkillEvocation, false); } if (spells[spellid].base2[i] == 1) // Mana Tap @@ -6801,10 +6811,10 @@ void Mob::TryTriggerThreshHold(int32 damage, int effect_id, Mob* attacker){ if (IsValidSpell(spell_id)) { if (IsBeneficialSpell(spell_id)) - SpellFinished(spell_id, this, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spell_id, this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); else if(attacker) - SpellFinished(spell_id, attacker, EQEmu::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); + SpellFinished(spell_id, attacker, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].ResistDiff); } } } @@ -6875,7 +6885,7 @@ void Mob::CalcSpellPowerDistanceMod(uint16 spell_id, float range, Mob* caster) else distance = sqrt(range); - distance = EQEmu::Clamp(distance, spells[spell_id].min_dist, spells[spell_id].max_dist); + distance = EQ::Clamp(distance, spells[spell_id].min_dist, spells[spell_id].max_dist); float dm_range = spells[spell_id].max_dist - spells[spell_id].min_dist; float dm_mod_interval = spells[spell_id].max_dist_mod - spells[spell_id].min_dist_mod; diff --git a/zone/spells.cpp b/zone/spells.cpp index 5b8ee33f8..13c7ff1cf 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -101,6 +101,7 @@ Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org) #endif #include "mob_movement_manager.h" +#include "client.h" extern Zone* zone; @@ -108,7 +109,7 @@ extern volatile bool is_zone_loaded; extern WorldServer worldserver; extern FastMath g_Math; -using EQEmu::spells::CastingSlot; +using EQ::spells::CastingSlot; // this is run constantly for every mob void Mob::SpellProcess() @@ -245,12 +246,12 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, CastingSlot slot, //Added to prevent MQ2 exploitation of equipping normally-unequippable/clickable items with effects and clicking them for benefits. if(item_slot && IsClient() && (slot == CastingSlot::Item || slot == CastingSlot::PotionBelt)) { - EQEmu::ItemInstance *itm = CastToClient()->GetInv().GetItem(item_slot); + EQ::ItemInstance *itm = CastToClient()->GetInv().GetItem(item_slot); int bitmask = 1; bitmask = bitmask << (CastToClient()->GetClass() - 1); if( itm && itm->GetItem()->Classes != 65535 ) { - if ((itm->GetItem()->Click.Type == EQEmu::item::ItemEffectEquipClick) && !(itm->GetItem()->Classes & bitmask)) { - if (CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoF) { + if ((itm->GetItem()->Click.Type == EQ::item::ItemEffectEquipClick) && !(itm->GetItem()->Classes & bitmask)) { + if (CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoF) { // They are casting a spell from an item that requires equipping but shouldn't let them equip it LogError("HACKER: [{}] (account: [{}]) attempted to click an equip-only effect on item [{}] (id: [{}]) which they shouldn't be able to equip!", CastToClient()->GetCleanName(), CastToClient()->AccountName(), itm->GetItem()->Name, itm->GetItem()->ID); @@ -261,15 +262,15 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, CastingSlot slot, } return(false); } - if ((itm->GetItem()->Click.Type == EQEmu::item::ItemEffectClick2) && !(itm->GetItem()->Classes & bitmask)) { - if (CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoF) { + if ((itm->GetItem()->Click.Type == EQ::item::ItemEffectClick2) && !(itm->GetItem()->Classes & bitmask)) { + if (CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoF) { // They are casting a spell from an item that they don't meet the race/class requirements to cast LogError("HACKER: [{}] (account: [{}]) attempted to click a race/class restricted effect on item [{}] (id: [{}]) which they shouldn't be able to click!", CastToClient()->GetCleanName(), CastToClient()->AccountName(), itm->GetItem()->Name, itm->GetItem()->ID); database.SetHackerFlag(CastToClient()->AccountName(), CastToClient()->GetCleanName(), "Clicking race/class restricted item with an invalid class"); } else { - if (CastToClient()->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::RoF) { // Line 181 in eqstr_us.txt was changed in RoF+ Message(Chat::Yellow, "Your race, class, or deity cannot use this item."); @@ -282,8 +283,8 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, CastingSlot slot, return(false); } } - if (itm && (itm->GetItem()->Click.Type == EQEmu::item::ItemEffectEquipClick) && item_slot > EQEmu::invslot::EQUIPMENT_END){ - if (CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoF) { + if (itm && (itm->GetItem()->Click.Type == EQ::item::ItemEffectEquipClick) && item_slot > EQ::invslot::EQUIPMENT_END){ + if (CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoF) { // They are attempting to cast a must equip clicky without having it equipped LogError("HACKER: [{}] (account: [{}]) attempted to click an equip-only effect on item [{}] (id: [{}]) without equiping it!", CastToClient()->GetCleanName(), CastToClient()->AccountName(), itm->GetItem()->Name, itm->GetItem()->ID); database.SetHackerFlag(CastToClient()->AccountName(), CastToClient()->GetCleanName(), "Clicking equip-only item without equiping it"); @@ -611,16 +612,16 @@ bool Mob::DoCastingChecks() uint16 Mob::GetSpecializeSkillValue(uint16 spell_id) const { switch(spells[spell_id].skill) { - case EQEmu::skills::SkillAbjuration: - return(GetSkill(EQEmu::skills::SkillSpecializeAbjure)); - case EQEmu::skills::SkillAlteration: - return(GetSkill(EQEmu::skills::SkillSpecializeAlteration)); - case EQEmu::skills::SkillConjuration: - return(GetSkill(EQEmu::skills::SkillSpecializeConjuration)); - case EQEmu::skills::SkillDivination: - return(GetSkill(EQEmu::skills::SkillSpecializeDivination)); - case EQEmu::skills::SkillEvocation: - return(GetSkill(EQEmu::skills::SkillSpecializeEvocation)); + case EQ::skills::SkillAbjuration: + return(GetSkill(EQ::skills::SkillSpecializeAbjure)); + case EQ::skills::SkillAlteration: + return(GetSkill(EQ::skills::SkillSpecializeAlteration)); + case EQ::skills::SkillConjuration: + return(GetSkill(EQ::skills::SkillSpecializeConjuration)); + case EQ::skills::SkillDivination: + return(GetSkill(EQ::skills::SkillSpecializeDivination)); + case EQ::skills::SkillEvocation: + return(GetSkill(EQ::skills::SkillSpecializeEvocation)); default: //wtf... break; @@ -639,20 +640,20 @@ void Client::CheckSpecializeIncrease(uint16 spell_id) { */ switch(spells[spell_id].skill) { - case EQEmu::skills::SkillAbjuration: - CheckIncreaseSkill(EQEmu::skills::SkillSpecializeAbjure, nullptr); + case EQ::skills::SkillAbjuration: + CheckIncreaseSkill(EQ::skills::SkillSpecializeAbjure, nullptr); break; - case EQEmu::skills::SkillAlteration: - CheckIncreaseSkill(EQEmu::skills::SkillSpecializeAlteration, nullptr); + case EQ::skills::SkillAlteration: + CheckIncreaseSkill(EQ::skills::SkillSpecializeAlteration, nullptr); break; - case EQEmu::skills::SkillConjuration: - CheckIncreaseSkill(EQEmu::skills::SkillSpecializeConjuration, nullptr); + case EQ::skills::SkillConjuration: + CheckIncreaseSkill(EQ::skills::SkillSpecializeConjuration, nullptr); break; - case EQEmu::skills::SkillDivination: - CheckIncreaseSkill(EQEmu::skills::SkillSpecializeDivination, nullptr); + case EQ::skills::SkillDivination: + CheckIncreaseSkill(EQ::skills::SkillSpecializeDivination, nullptr); break; - case EQEmu::skills::SkillEvocation: - CheckIncreaseSkill(EQEmu::skills::SkillSpecializeEvocation, nullptr); + case EQ::skills::SkillEvocation: + CheckIncreaseSkill(EQ::skills::SkillSpecializeEvocation, nullptr); break; default: //wtf... @@ -672,48 +673,48 @@ void Client::CheckSongSkillIncrease(uint16 spell_id){ switch(spells[spell_id].skill) { - case EQEmu::skills::SkillSinging: - CheckIncreaseSkill(EQEmu::skills::SkillSinging, nullptr, -15); + case EQ::skills::SkillSinging: + CheckIncreaseSkill(EQ::skills::SkillSinging, nullptr, -15); break; - case EQEmu::skills::SkillPercussionInstruments: + case EQ::skills::SkillPercussionInstruments: if(this->itembonuses.percussionMod > 0) { - if (GetRawSkill(EQEmu::skills::SkillPercussionInstruments) > 0) // no skill increases if not trained in the instrument - CheckIncreaseSkill(EQEmu::skills::SkillPercussionInstruments, nullptr, -15); + if (GetRawSkill(EQ::skills::SkillPercussionInstruments) > 0) // no skill increases if not trained in the instrument + CheckIncreaseSkill(EQ::skills::SkillPercussionInstruments, nullptr, -15); else MessageString(Chat::Red,NO_INSTRUMENT_SKILL); // tell the client that they need instrument training } else - CheckIncreaseSkill(EQEmu::skills::SkillSinging, nullptr, -15); + CheckIncreaseSkill(EQ::skills::SkillSinging, nullptr, -15); break; - case EQEmu::skills::SkillStringedInstruments: + case EQ::skills::SkillStringedInstruments: if(this->itembonuses.stringedMod > 0) { - if (GetRawSkill(EQEmu::skills::SkillStringedInstruments) > 0) - CheckIncreaseSkill(EQEmu::skills::SkillStringedInstruments, nullptr, -15); + if (GetRawSkill(EQ::skills::SkillStringedInstruments) > 0) + CheckIncreaseSkill(EQ::skills::SkillStringedInstruments, nullptr, -15); else MessageString(Chat::Red,NO_INSTRUMENT_SKILL); } else - CheckIncreaseSkill(EQEmu::skills::SkillSinging, nullptr, -15); + CheckIncreaseSkill(EQ::skills::SkillSinging, nullptr, -15); break; - case EQEmu::skills::SkillWindInstruments: + case EQ::skills::SkillWindInstruments: if(this->itembonuses.windMod > 0) { - if (GetRawSkill(EQEmu::skills::SkillWindInstruments) > 0) - CheckIncreaseSkill(EQEmu::skills::SkillWindInstruments, nullptr, -15); + if (GetRawSkill(EQ::skills::SkillWindInstruments) > 0) + CheckIncreaseSkill(EQ::skills::SkillWindInstruments, nullptr, -15); else MessageString(Chat::Red,NO_INSTRUMENT_SKILL); } else - CheckIncreaseSkill(EQEmu::skills::SkillSinging, nullptr, -15); + CheckIncreaseSkill(EQ::skills::SkillSinging, nullptr, -15); break; - case EQEmu::skills::SkillBrassInstruments: + case EQ::skills::SkillBrassInstruments: if(this->itembonuses.brassMod > 0) { - if (GetRawSkill(EQEmu::skills::SkillBrassInstruments) > 0) - CheckIncreaseSkill(EQEmu::skills::SkillBrassInstruments, nullptr, -15); + if (GetRawSkill(EQ::skills::SkillBrassInstruments) > 0) + CheckIncreaseSkill(EQ::skills::SkillBrassInstruments, nullptr, -15); else MessageString(Chat::Red,NO_INSTRUMENT_SKILL); } else - CheckIncreaseSkill(EQEmu::skills::SkillSinging, nullptr, -15); + CheckIncreaseSkill(EQ::skills::SkillSinging, nullptr, -15); break; default: break; @@ -967,7 +968,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo uint16 mana_used, uint32 inventory_slot, int16 resist_adjust) { bool IsFromItem = false; - EQEmu::ItemInstance *item = nullptr; + EQ::ItemInstance *item = nullptr; if(IsClient() && slot != CastingSlot::Item && slot != CastingSlot::PotionBelt && spells[spell_id].recast_time > 1000) { // 10 is item if(!CastToClient()->GetPTimers().Expired(&database, pTimerSpellStart + spell_id, false)) { @@ -1037,8 +1038,10 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo // So long recast bard songs need special bard logic, although the effects don't repulse like other songs // This is basically a hack to get that effect // You can hold down the long recast spells, but you only get the effects once + // Songs with mana cost also do not repulse + // AAs that use SE_TemporaryPets or SE_Familiar also do not repulse // TODO fuck bards. - if (spells[spell_id].recast_time == 0) { + if (spells[spell_id].recast_time == 0 && spells[spell_id].mana == 0 && !IsEffectInSpell(spell_id, SE_TemporaryPets) && !IsEffectInSpell(spell_id, SE_Familiar)) { bardsong = spell_id; bardsong_slot = slot; //NOTE: theres a lot more target types than this to think about... @@ -1081,7 +1084,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo channelbonuses += spellbonuses.ChannelChanceSpells + itembonuses.ChannelChanceSpells + aabonuses.ChannelChanceSpells; // max 93% chance at 252 skill - channelchance = 30 + GetSkill(EQEmu::skills::SkillChanneling) / 400.0f * 100; + channelchance = 30 + GetSkill(EQ::skills::SkillChanneling) / 400.0f * 100; channelchance -= attacked_count * 2; channelchance += channelchance * channelbonuses / 100.0f; } @@ -1095,7 +1098,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo channelbonuses += spellbonuses.ChannelChanceSpells + itembonuses.ChannelChanceSpells + aabonuses.ChannelChanceSpells; // max 93% chance at 252 skill - channelchance = 30 + GetSkill(EQEmu::skills::SkillChanneling) / 400.0f * 100; + channelchance = 30 + GetSkill(EQ::skills::SkillChanneling) / 400.0f * 100; channelchance -= attacked_count * 2; channelchance += channelchance * channelbonuses / 100.0f; } @@ -1127,7 +1130,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo } } - LogSpells("Checking Interruption: spell x: [{}] spell y: [{}] cur x: [{}] cur y: [{}] channelchance [{}] channeling skill [{}]\n", GetSpellX(), GetSpellY(), GetX(), GetY(), channelchance, GetSkill(EQEmu::skills::SkillChanneling)); + LogSpells("Checking Interruption: spell x: [{}] spell y: [{}] cur x: [{}] cur y: [{}] channelchance [{}] channeling skill [{}]\n", GetSpellX(), GetSpellY(), GetX(), GetY(), channelchance, GetSkill(EQ::skills::SkillChanneling)); if(!spells[spell_id].uninterruptable && zone->random.Real(0, 100) > channelchance) { LogSpells("Casting of [{}] canceled: interrupted", spell_id); @@ -1241,7 +1244,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo missingreags=true; } - const EQEmu::ItemData *item = database.GetItem(component); + const EQ::ItemData *item = database.GetItem(component); if(item) { c->MessageString(Chat::Red, MISSING_SPELL_COMP_ITEM, item->Name); LogSpells("Spell [{}]: Canceled. Missing required reagent [{}] ([{}])", spell_id, item->Name, component); @@ -1305,7 +1308,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo && inventory_slot != 0xFFFFFFFF) // 10 is an item { bool fromaug = false; - EQEmu::ItemData* augitem = nullptr; + EQ::ItemData* augitem = nullptr; uint32 recastdelay = 0; uint32 recasttype = 0; @@ -1313,12 +1316,12 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo if (item == nullptr) break; - for (int r = EQEmu::invaug::SOCKET_BEGIN; r <= EQEmu::invaug::SOCKET_END; r++) { - const EQEmu::ItemInstance* aug_i = item->GetAugment(r); + for (int r = EQ::invaug::SOCKET_BEGIN; r <= EQ::invaug::SOCKET_END; r++) { + const EQ::ItemInstance* aug_i = item->GetAugment(r); if (!aug_i) continue; - const EQEmu::ItemData* aug = aug_i->GetItem(); + const EQ::ItemData* aug = aug_i->GetItem(); if (!aug) continue; @@ -1439,11 +1442,11 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo SetMana(GetMana()); // skills - if (EQEmu::skills::IsCastingSkill(spells[spell_id].skill)) { + if (EQ::skills::IsCastingSkill(spells[spell_id].skill)) { c->CheckIncreaseSkill(spells[spell_id].skill, nullptr); // increased chance of gaining channel skill if you regained concentration - c->CheckIncreaseSkill(EQEmu::skills::SkillChanneling, nullptr, regain_conc ? 5 : 0); + c->CheckIncreaseSkill(EQ::skills::SkillChanneling, nullptr, regain_conc ? 5 : 0); c->CheckSpecializeIncrease(spell_id); } @@ -2352,7 +2355,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, ui SpellOnTarget(spell_id, spell_target); #ifdef GROUP_BUFF_PETS //pet too - if (spells[spell_id].targettype != ST_GroupNoPets && spell_target->GetPet() && HasPetAffinity() && !spell_target->GetPet()->IsCharmed()) + if (spells[spell_id].targettype != ST_GroupNoPets && spell_target->GetPet() && spell_target->HasPetAffinity() && !spell_target->GetPet()->IsCharmed()) SpellOnTarget(spell_id, spell_target->GetPet()); #endif } @@ -2388,8 +2391,6 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, ui } } - DoAnim(spells[spell_id].CastingAnim, 0, true, IsClient() ? FilterPCSpells : FilterNPCSpells); - // Set and send the nimbus effect if this spell has one int NimbusEffect = GetNimbusEffect(spell_id); if(NimbusEffect) { @@ -2422,7 +2423,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, ui auto end_cost = spells[spell_id].EndurCost; if (mgb) end_cost *= 2; - SetEndurance(GetEndurance() - EQEmu::ClampUpper(end_cost, GetEndurance())); + SetEndurance(GetEndurance() - EQ::ClampUpper(end_cost, GetEndurance())); TryTriggerOnValueAmount(false, false, true); } if (mgb) @@ -2465,7 +2466,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, ui if(IsClient() && (slot == CastingSlot::Item || slot == CastingSlot::PotionBelt)) { - EQEmu::ItemInstance *itm = CastToClient()->GetInv().GetItem(inventory_slot); + EQ::ItemInstance *itm = CastToClient()->GetInv().GetItem(inventory_slot); if(itm && itm->GetItem()->RecastDelay > 0){ auto recast_type = itm->GetItem()->RecastType; CastToClient()->GetPTimers().Start((pTimerItemStart + recast_type), itm->GetItem()->RecastDelay); @@ -2639,8 +2640,6 @@ bool Mob::ApplyNextBardPulse(uint16 spell_id, Mob *spell_target, CastingSlot slo } } - //do we need to do this??? - DoAnim(spells[spell_id].CastingAnim, 0, true, IsClient() ? FilterPCSpells : FilterNPCSpells); if(IsClient()) CastToClient()->CheckSongSkillIncrease(spell_id); @@ -2648,6 +2647,12 @@ bool Mob::ApplyNextBardPulse(uint16 spell_id, Mob *spell_target, CastingSlot slo } void Mob::BardPulse(uint16 spell_id, Mob *caster) { + // so for Solon's Song of the Sirens (725) if we're repulsing, we need to skip + // other charms have mana and don't repulse + // This is probably not the ideal place for this, but it will work + if (IsCharmed() && GetOwner() == caster && IsEffectInSpell(spell_id, SE_Charm)) { + return; + } int buffs_i; int buff_count = GetMaxTotalSlots(); for (buffs_i = 0; buffs_i < buff_count; buffs_i++) { @@ -3335,7 +3340,7 @@ int Mob::AddBuff(Mob *caster, uint16 spell_id, int duration, int32 level_overrid { EQApplicationPacket *outapp = MakeBuffsPacket(); - entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQEmu::versions::maskSoDAndLater); + entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQ::versions::maskSoDAndLater); if(IsClient() && GetTarget() == this) CastToClient()->QueuePacket(outapp); @@ -3345,7 +3350,7 @@ int Mob::AddBuff(Mob *caster, uint16 spell_id, int duration, int32 level_overrid if (IsNPC()) { EQApplicationPacket *outapp = MakeBuffsPacket(); - entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQEmu::versions::maskSoDAndLater, true); + entity_list.QueueClientsByTarget(this, outapp, false, nullptr, true, false, EQ::versions::maskSoDAndLater, true); safe_delete(outapp); } @@ -3426,6 +3431,8 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r bool isproc, int level_override) { + bool is_damage_or_lifetap_spell = IsDamageSpell(spell_id) || IsLifetapSpell(spell_id); + // well we can't cast a spell on target without a target if(!spelltar) { @@ -3967,9 +3974,6 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r // send to people in the area, ignoring caster and target //live dosent send this to anybody but the caster //entity_list.QueueCloseClients(spelltar, action_packet, true, 200, this, true, spelltar->IsClient() ? FILTER_PCSPELLS : FILTER_NPCSPELLS); - - // TEMPORARY - this is the message for the spell. - // double message on effects that use ChangeHP - working on this message_packet = new EQApplicationPacket(OP_Damage, sizeof(CombatDamage_Struct)); CombatDamage_Struct *cd = (CombatDamage_Struct *)message_packet->pBuffer; cd->target = action->target; @@ -3980,7 +3984,9 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r cd->hit_heading = action->hit_heading; cd->hit_pitch = action->hit_pitch; cd->damage = 0; - if(!IsEffectInSpell(spell_id, SE_BindAffinity)){ + + auto spellOwner = GetOwnerOrSelf(); + if(!IsEffectInSpell(spell_id, SE_BindAffinity) && !is_damage_or_lifetap_spell){ entity_list.QueueCloseClients( spelltar, /* Sender */ message_packet, /* Packet */ @@ -3990,6 +3996,13 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r true, /* Packet ACK */ (spelltar->IsClient() ? FilterPCSpells : FilterNPCSpells) /* Message Filter Type: (8 or 9) */ ); + } else if (is_damage_or_lifetap_spell && spellOwner->IsClient()) { + spellOwner->CastToClient()->QueuePacket( + message_packet, + true, + Mob::CLIENT_CONNECTINGALL, + (spelltar->IsClient() ? FilterPCSpells : FilterNPCSpells) + ); } safe_delete(action_packet); safe_delete(message_packet); @@ -4518,7 +4531,7 @@ float Mob::ResistSpell(uint8 resist_type, uint16 spell_id, Mob *caster, bool use // JULY 24, 2002 changes int level = GetLevel(); - if (IsPetOwnerClient() && caster->IsNPC() && !caster->IsPetOwnerClient()) { + if (RuleB(Spells,July242002PetResists) && IsPetOwnerClient() && caster->IsNPC() && !caster->IsPetOwnerClient()) { auto owner = GetOwner(); if (owner != nullptr) { target_resist = std::max(target_resist, owner->GetResist(resist_type)); @@ -4911,11 +4924,13 @@ void Mob::Stun(int duration) if(stunned && stunned_timer.GetRemainingTime() > uint32(duration)) return; - if(IsValidSpell(casting_spell_id) && !spells[casting_spell_id].uninterruptable) { + auto spell_id = bardsong ? bardsong : casting_spell_id; + + if(IsValidSpell(spell_id) && !spells[spell_id].uninterruptable) { int persistent_casting = spellbonuses.PersistantCasting + itembonuses.PersistantCasting + aabonuses.PersistantCasting; if(zone->random.Int(0,99) > persistent_casting) - InterruptSpell(); + InterruptSpell(spell_id); } if(duration > 0) @@ -4971,9 +4986,11 @@ void Mob::Mesmerize() { mezzed = true; - if (casting_spell_id) - InterruptSpell(); + auto spell_id = bardsong ? bardsong : casting_spell_id; + if (spell_id) + InterruptSpell(spell_id); + StopNavigation(); } @@ -5026,7 +5043,7 @@ void Client::MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message) void Client::MemSpell(uint16 spell_id, int slot, bool update_client) { - if(slot >= EQEmu::spells::SPELL_GEM_COUNT || slot < 0) + if(slot >= EQ::spells::SPELL_GEM_COUNT || slot < 0) return; if(update_client) @@ -5048,7 +5065,7 @@ void Client::MemSpell(uint16 spell_id, int slot, bool update_client) void Client::UnmemSpell(int slot, bool update_client) { - if(slot > EQEmu::spells::SPELL_GEM_COUNT || slot < 0) + if(slot > EQ::spells::SPELL_GEM_COUNT || slot < 0) return; LogSpells("Spell [{}] forgotten from slot [{}]", m_pp.mem_spells[slot], slot); @@ -5064,7 +5081,7 @@ void Client::UnmemSpell(int slot, bool update_client) void Client::UnmemSpellBySpellID(int32 spell_id) { - for(int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; i++) { + for(int i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++) { if(m_pp.mem_spells[i] == spell_id) { UnmemSpell(i, true); break; @@ -5076,11 +5093,18 @@ void Client::UnmemSpellAll(bool update_client) { int i; - for(i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; i++) + for(i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++) if(m_pp.mem_spells[i] != 0xFFFFFFFF) UnmemSpell(i, update_client); } +uint32 Client::GetSpellIDByBookSlot(int book_slot) { + if (book_slot <= EQ::spells::SPELLBOOK_SIZE) { + return GetSpellByBookSlot(book_slot); + } + return -1; //default +} + uint16 Client::FindMemmedSpellBySlot(int slot) { if (m_pp.mem_spells[slot] != 0xFFFFFFFF) return m_pp.mem_spells[slot]; @@ -5090,7 +5114,7 @@ uint16 Client::FindMemmedSpellBySlot(int slot) { int Client::MemmedCount() { int memmed_count = 0; - for (int i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; i++) + for (int i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++) if (m_pp.mem_spells[i] != 0xFFFFFFFF) memmed_count++; @@ -5100,7 +5124,7 @@ int Client::MemmedCount() { void Client::ScribeSpell(uint16 spell_id, int slot, bool update_client) { - if(slot >= EQEmu::spells::SPELLBOOK_SIZE || slot < 0) + if(slot >= EQ::spells::SPELLBOOK_SIZE || slot < 0) return; if(update_client) @@ -5121,14 +5145,14 @@ void Client::ScribeSpell(uint16 spell_id, int slot, bool update_client) void Client::UnscribeSpell(int slot, bool update_client) { - if(slot >= EQEmu::spells::SPELLBOOK_SIZE || slot < 0) + if(slot >= EQ::spells::SPELLBOOK_SIZE || slot < 0) return; LogSpells("Spell [{}] erased from spell book slot [{}]", m_pp.spell_book[slot], slot); m_pp.spell_book[slot] = 0xFFFFFFFF; database.DeleteCharacterSpell(this->CharacterID(), m_pp.spell_book[slot], slot); - if(update_client && slot < EQEmu::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize) + if(update_client && slot < EQ::spells::DynamicLookup(ClientVersion(), GetGM())->SpellbookSize) { auto outapp = new EQApplicationPacket(OP_DeleteSpell, sizeof(DeleteSpell_Struct)); DeleteSpell_Struct* del = (DeleteSpell_Struct*)outapp->pBuffer; @@ -5141,7 +5165,7 @@ void Client::UnscribeSpell(int slot, bool update_client) void Client::UnscribeSpellAll(bool update_client) { - for(int i = 0; i < EQEmu::spells::SPELLBOOK_SIZE; i++) + for(int i = 0; i < EQ::spells::SPELLBOOK_SIZE; i++) { if(m_pp.spell_book[i] != 0xFFFFFFFF) UnscribeSpell(i, update_client); @@ -5175,7 +5199,7 @@ void Client::UntrainDiscAll(bool update_client) } int Client::GetNextAvailableSpellBookSlot(int starting_slot) { - for (int i = starting_slot; i < EQEmu::spells::SPELLBOOK_SIZE; i++) { //using starting_slot should help speed this up when we're iterating through a bunch of spells + for (int i = starting_slot; i < EQ::spells::SPELLBOOK_SIZE; i++) { //using starting_slot should help speed this up when we're iterating through a bunch of spells if (!IsValidSpell(GetSpellByBookSlot(i))) return i; } @@ -5184,7 +5208,7 @@ int Client::GetNextAvailableSpellBookSlot(int starting_slot) { } int Client::FindSpellBookSlotBySpellID(uint16 spellid) { - for(int i = 0; i < EQEmu::spells::SPELLBOOK_SIZE; i++) { + for(int i = 0; i < EQ::spells::SPELLBOOK_SIZE; i++) { if(m_pp.spell_book[i] == spellid) return i; } @@ -5535,7 +5559,7 @@ bool Mob::UseBardSpellLogic(uint16 spell_id, int slot) spell_id != SPELL_UNKNOWN && slot != -1 && GetClass() == BARD && - slot <= EQEmu::spells::SPELL_GEM_COUNT && + slot <= EQ::spells::SPELL_GEM_COUNT && IsBardSong(spell_id) ); } @@ -5599,7 +5623,7 @@ void Client::SendBuffDurationPacket(Buffs_Struct &buff, int slot) void Client::SendBuffNumHitPacket(Buffs_Struct &buff, int slot) { // UF+ use this packet - if (ClientVersion() < EQEmu::versions::ClientVersion::UF) + if (ClientVersion() < EQ::versions::ClientVersion::UF) return; EQApplicationPacket *outapp = nullptr; outapp = new EQApplicationPacket(OP_BuffCreate, sizeof(BuffIcon_Struct) + sizeof(BuffIconEntry_Struct)); @@ -5656,7 +5680,7 @@ void Mob::SendBuffsToClient(Client *c) if(!c) return; - if (c->ClientVersionBit() & EQEmu::versions::maskSoDAndLater) + if (c->ClientVersionBit() & EQ::versions::maskSoDAndLater) { EQApplicationPacket *outapp = MakeBuffsPacket(); c->FastQueuePacket(&outapp); @@ -5744,12 +5768,12 @@ int Client::GetCurrentBuffSlots() const numbuffs++; if (GetLevel() > 74) numbuffs++; - return EQEmu::ClampUpper(numbuffs, EQEmu::spells::StaticLookup(m_ClientVersion)->LongBuffs); + return EQ::ClampUpper(numbuffs, EQ::spells::StaticLookup(m_ClientVersion)->LongBuffs); } int Client::GetCurrentSongSlots() const { - return EQEmu::spells::StaticLookup(m_ClientVersion)->ShortBuffs; // AAs dont affect this + return EQ::spells::StaticLookup(m_ClientVersion)->ShortBuffs; // AAs dont affect this } void Client::InitializeBuffSlots() @@ -5996,3 +6020,4 @@ bool Client::IsLinkedSpellReuseTimerReady(uint32 timer_id) return GetPTimers().Expired(&database, pTimerLinkedSpellReuseStart + timer_id, false); } + diff --git a/zone/string_ids.h b/zone/string_ids.h index e543007a0..25c62d6b2 100644 --- a/zone/string_ids.h +++ b/zone/string_ids.h @@ -293,8 +293,47 @@ #define TRADESKILL_MISSING_ITEM 3455 //You are missing a %1. #define TRADESKILL_MISSING_COMPONENTS 3456 //Sorry, but you don't have everything you need for this recipe in your general inventory. #define TRADESKILL_LEARN_RECIPE 3457 //You have learned the recipe %1! -#define EXPEDITION_MIN_REMAIN 3551 //You only have %1 minutes remaining before this expedition comes to an end. +#define EXPEDITION_YOU_BELONG 3500 //You cannot create this expedition since you already belong to another. +#define EXPEDITION_YOU_PLAYED_HERE 3501 //You cannot create this expedition for another %1d:%2h:%3m since you have recently played here. +#define REQUIRED_PLAYER_COUNT 3503 //You do not meet the player count requirement. You have %1 players. You must have at least %2 and no more than %3. +#define EXPEDITION_REPLAY_TIMER 3504 //%1 cannot be added to this expedition for another %2D:%3H:%4M since they have recently played in this area. +#define EXPEDITION_AVAILABLE 3507 //%1 is now available to you. +#define DZADD_INVITE 3508 //Sending an invitation to: %1. +#define DZ_PREVENT_ENTERING 3510 //A strange magical presence prevents you from entering. It's too dangerous to enter at the moment. +#define DZADD_INVITE_FAIL 3511 //%1 could not be invited to join you. +#define UNABLE_RETRIEVE_LEADER 3512 //Unable to retrieve information on the leader to check permissions. +#define EXPEDITION_NOT_LEADER 3513 //You are not the expedition leader, only %1 can issue this command. +#define EXPEDITION_NOT_MEMBER 3514 //%1 is not a member of this expedition. +#define EXPEDITION_REMOVED 3516 //%1 has been removed from %2. +#define DZSWAP_INVITE 3517 //Sending an invitation to: %1. They must accept in order to swap party members. +#define DZMAKELEADER_NOT_ONLINE 3518 //%1 is not currently online. You can only transfer leadership to an online member of the expedition you are in. +#define DZLIST_REPLAY_TIMER 3519 //You have %1d:%2h:%3m remaining until you may enter %4. +#define DZMAKELEADER_NAME 3520 //%1 has been made the leader for this expedition. +#define DZMAKELEADER_YOU 3521 //You have been made the leader of this expedition. +#define EXPEDITION_INVITE_ACCEPTED 3522 //%1 has accepted your offer to join your expedition. +#define EXPEDITION_MEMBER_ADDED 3523 //%1 has been added to %2. +#define EXPEDITION_INVITE_ERROR 3524 //%1 accepted your offer to join your expedition but could not due to error(s). +#define EXPEDITION_INVITE_DECLINED 3525 //%1 has declined your offer to join your expedition. +#define EXPEDITION_ASKED_TO_JOIN 3527 //%1 has asked you to join the expedition: %2. Would you like to join? +#define DYNAMICZONE_WAY_IS_BLOCKED 3528 //The way is blocked to you. Perhaps you would be able to enter if there was a reason to come here. +#define EXPEDITION_NO_TIMERS 3529 //You have no outstanding timers. +#define EXPEDITION_MIN_REMAIN 3551 //You only have %1 minutes remaining before this expedition comes to an end. +#define EXPEDITION_LEADER 3552 //Expedition Leader: %1 +#define EXPEDITION_MEMBERS 3553 //Expedition Members: %1 +#define EXPEDITION_EVENT_TIMER 3561 //%1 cannot be added to this expedition since they have recently experienced %2. They must wait another %3D:%4H:%5M until they can experience it again. They may be added to the expedition later, once %2 has been completed. #define LOOT_NOT_ALLOWED 3562 //You are not allowed to loot the item: %1. +#define DZ_UNABLE_RETRIEVE_LEADER 3583 //Unable to retrieve dynamic zone leader to check permissions. +#define DZADD_NOT_ALLOWING 3585 //The expedition is not allowing players to be added. +#define DZADD_NOT_ONLINE 3586 //%1 is not currently online. A player needs to be online to be added to a Dynamic Zone +#define DZADD_EXCEED_MAX 3587 //You can not add another player since you currently have the maximum number of players allowed (%1) in this zone. +#define DZADD_ALREADY_PART 3588 //You can not add %1 since they are already part of this zone. +#define DZADD_LEAVE_ZONE_FIRST 3589 //You can not add %1 since they first need to leave the zone before being allowed back in. +#define DZADD_ALREADY_ASSIGNED 3590 //%1 can not be added to this dynamic zone since they are already assigned to another dynamic zone. +#define DZADD_REPLAY_TIMER 3591 //%1 can not be added to this dynamic zone for another %2D:%3H:%4M since they have recently played this zone. +#define DZADD_EVENT_TIMER 3592 //%1 can not be added to this dynamic zone since they have recently experienced %2. They must wait for another %3D:%4H:%5M, or until event %2 has occurred. +#define DZADD_PENDING 3593 //%1 currently has an outstanding invitation to join this Dynamic Zone. +#define DZADD_PENDING_OTHER 3594 //%1 currently has an outstanding invitation to join another Dynamic Zone. Players may only have one invitation outstanding. +#define DZSWAP_CANNOT_REMOVE 3595 //%1 can not be removed from this dynamic zone since they are not assigned to it. #define NOT_YOUR_TRAP 3671 //You cannot remove this, you are only allowed to remove traps you have set. #define NO_CAST_ON_PET 4045 //You cannot cast this spell on your pet. #define REWIND_WAIT 4059 //You must wait a bit longer before using the rewind command again. @@ -310,6 +349,7 @@ #define WHOALL_NO_RESULTS 5029 //There are no players in EverQuest that match those who filters. #define TELL_QUEUED_MESSAGE 5045 //You told %1 '%T2. %3' #define TOLD_NOT_ONLINE 5046 //%1 is not online at this time. +#define ZONING_NO_EXPANSION 5052 //The zone that you are attempting to enter is part of an expansion that you do not yet own. You may need to return to the Login screen and enter an account key for that expansion. If you have received this message in error, please /petition or send an email to EQAccounts@soe.sony.com #define PETITION_NO_DELETE 5053 //You do not have a petition in the queue. #define PETITION_DELETED 5054 //Your petition was successfully deleted. #define ALREADY_IN_RAID 5060 //%1 is already in a raid. @@ -363,6 +403,9 @@ #define LDON_NO_LOCKPICK 7564 //You must have a lock pick in your inventory to do this. #define LDON_WAS_NOT_LOCKED 7565 //%1 was not locked. #define LDON_WAS_NOT_TRAPPED 7566 //%1 was not trapped +#define GAIN_SINGLE_AA_SINGLE_AA 8019 //You have gained an ability point! You now have %1 ability point. +#define GAIN_SINGLE_AA_MULTI_AA 8020 //You have gained an ability point! You now have %1 ability points. +#define GAIN_MULTI_AA_MULTI_AA 8021 //You have gained %1 ability point(s)! You now have %2 ability point(s). #define GAIN_GROUP_LEADERSHIP_POINT 8585 // #define GAIN_RAID_LEADERSHIP_POINT 8589 // #define MAX_GROUP_LEADERSHIP_POINTS 8584 // diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp new file mode 100644 index 000000000..3ded9eb27 --- /dev/null +++ b/zone/task_client_state.cpp @@ -0,0 +1,2177 @@ +#include "../common/global_define.h" +#include "../common/misc_functions.h" +#include "../common/repositories/character_activities_repository.h" +#include "../common/repositories/character_tasks_repository.h" +#include "../common/repositories/completed_tasks_repository.h" +#include "../common/rulesys.h" +#include "client.h" +#include "queryserv.h" +#include "quest_parser_collection.h" +#include "task_client_state.h" +#include "zonedb.h" + +extern QueryServ *QServ; + +ClientTaskState::ClientTaskState() +{ + m_active_task_count = 0; + m_last_completed_task_loaded = 0; + m_checked_touch_activities = false; + + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + m_active_quests[i].slot = i; + m_active_quests[i].task_id = TASKSLOTEMPTY; + } + + m_active_task.slot = 0; + m_active_task.task_id = TASKSLOTEMPTY; + // TODO: shared task +} + +ClientTaskState::~ClientTaskState() +{ +} + +void ClientTaskState::SendTaskHistory(Client *client, int task_index) +{ + + LogTasks("[SendTaskHistory] Task history requested for completed task index [{}]", task_index); + + // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. + + int adjusted_task_index = task_index; + if (m_completed_tasks.size() > 50) { + adjusted_task_index += (m_completed_tasks.size() - 50); + } + + if ((adjusted_task_index < 0) || (adjusted_task_index >= (int) m_completed_tasks.size())) { + return; + } + + int task_id = m_completed_tasks[adjusted_task_index].task_id; + if ((task_id < 0) || (task_id > MAXTASKS)) { + return; + } + + TaskInformation *p_task_data = task_manager->m_task_data[task_id]; + + if (p_task_data == nullptr) { + return; + } + + TaskHistoryReplyHeader_Struct *task_history_reply; + TaskHistoryReplyData1_Struct *task_history_reply_data_1; + TaskHistoryReplyData2_Struct *task_history_reply_data_2; + + char *reply; + + int completed_activity_count = 0; + int packet_length = sizeof(TaskHistoryReplyHeader_Struct); + + for (int i = 0; i < p_task_data->activity_count; i++) { + if (m_completed_tasks[adjusted_task_index].activity_done[i]) { + completed_activity_count++; + packet_length = packet_length + sizeof(TaskHistoryReplyData1_Struct) + + p_task_data->activity_information[i].target_name.size() + 1 + + p_task_data->activity_information[i].item_list.size() + 1 + + sizeof(TaskHistoryReplyData2_Struct) + + p_task_data->activity_information[i].description_override.size() + 1; + } + } + + auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, packet_length); + + task_history_reply = (TaskHistoryReplyHeader_Struct *) outapp->pBuffer; + + // We use the TaskIndex the client sent in the request + task_history_reply->TaskID = task_index; + task_history_reply->ActivityCount = completed_activity_count; + + reply = (char *) task_history_reply + sizeof(TaskHistoryReplyHeader_Struct); + + for (int i = 0; i < p_task_data->activity_count; i++) { + if (m_completed_tasks[adjusted_task_index].activity_done[i]) { + task_history_reply_data_1 = (TaskHistoryReplyData1_Struct *) reply; + task_history_reply_data_1->ActivityType = p_task_data->activity_information[i].activity_type; + reply = (char *) task_history_reply_data_1 + sizeof(TaskHistoryReplyData1_Struct); + VARSTRUCT_ENCODE_STRING(reply, p_task_data->activity_information[i].target_name.c_str()); + VARSTRUCT_ENCODE_STRING(reply, p_task_data->activity_information[i].item_list.c_str()); + task_history_reply_data_2 = (TaskHistoryReplyData2_Struct *) reply; + task_history_reply_data_2->GoalCount = p_task_data->activity_information[i].goal_count; + task_history_reply_data_2->unknown04 = 0xffffffff; + task_history_reply_data_2->unknown08 = 0xffffffff; + task_history_reply_data_2->ZoneID = p_task_data->activity_information[i].zone_ids.empty() ? 0 + : p_task_data->activity_information[i].zone_ids.front(); + task_history_reply_data_2->unknown16 = 0x00000000; + reply = (char *) task_history_reply_data_2 + sizeof(TaskHistoryReplyData2_Struct); + VARSTRUCT_ENCODE_STRING(reply, p_task_data->activity_information[i].description_override.c_str()); + } + } + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +void ClientTaskState::EnableTask(int character_id, int task_count, int *task_list) +{ + // Check if the Task is already enabled for this client + std::vector tasks_enabled; + + for (int i = 0; i < task_count; i++) { + auto iterator = m_enabled_tasks.begin(); + bool add_task = true; + + while (iterator != m_enabled_tasks.end()) { + // If this task is already enabled, stop looking + if ((*iterator) == task_list[i]) { + add_task = false; + break; + } + // Our list of enabled tasks is sorted, so we can quit if we find a taskid higher than + // the one we are looking for. + if ((*iterator) > task_list[i]) { + break; + } + ++iterator; + } + + if (add_task) { + m_enabled_tasks.insert(iterator, task_list[i]); + // Make a note of the task we enabled, for later SQL generation + tasks_enabled.push_back(task_list[i]); + } + } + + LogTasksDetail("[EnableTask] New enabled task list"); + for (int enabled_task : m_enabled_tasks) { + LogTasksDetail("[EnableTask] enabled [{}] character_id [{}]", enabled_task, character_id); + } + + if (tasks_enabled.empty()) { + return; + } + + std::stringstream query_stream; + query_stream << "REPLACE INTO character_enabledtasks (charid, taskid) VALUES "; + for (unsigned int i = 0; i < tasks_enabled.size(); i++) { + query_stream << (i ? ", " : "") << StringFormat("(%i, %i)", character_id, tasks_enabled[i]); + } + + std::string query = query_stream.str(); + if (!tasks_enabled.empty()) { + database.QueryDatabase(query); + } + else { + LogTasks("[EnableTask] Called for character_id [{}] but, no tasks exist", character_id); + } +} + +void ClientTaskState::DisableTask(int character_id, int task_count, int *task_list) +{ + + // Check if the Task is enabled for this client + std::vector tasks_disabled; + + for (int task_id = 0; task_id < task_count; task_id++) { + auto iterator = m_enabled_tasks.begin(); + bool removeTask = false; + + while (iterator != m_enabled_tasks.end()) { + if ((*iterator) == task_list[task_id]) { + removeTask = true; + break; + } + + if ((*iterator) > task_list[task_id]) { + break; + } + + ++iterator; + } + + if (removeTask) { + m_enabled_tasks.erase(iterator); + tasks_disabled.push_back(task_list[task_id]); + } + } + + LogTasks("[DisableTask] New enabled task list "); + for (int enabled_task : m_enabled_tasks) { + LogTasks("[DisableTask] enabled_tasks [{}]", enabled_task); + } + + if (tasks_disabled.empty()) { + return; + } + + std::stringstream queryStream; + queryStream << StringFormat("DELETE FROM character_enabledtasks WHERE charid = %i AND (", character_id); + + for (unsigned int i = 0; i < tasks_disabled.size(); i++) + queryStream + << (i ? StringFormat("taskid = %i ", tasks_disabled[i]) : StringFormat( + "OR taskid = %i ", + tasks_disabled[i] + )); + + queryStream << ")"; + + std::string query = queryStream.str(); + + if (tasks_disabled.size()) { + database.QueryDatabase(query); + } + else { + LogTasks( + "[DisableTask] DisableTask called for character_id [{}] ... but, no tasks exist", + character_id + ); + } +} + +bool ClientTaskState::IsTaskEnabled(int task_id) +{ + std::vector::iterator iterator; + + iterator = m_enabled_tasks.begin(); + + while (iterator != m_enabled_tasks.end()) { + if ((*iterator) == task_id) { return true; } + if ((*iterator) > task_id) { break; } + ++iterator; + } + + return false; +} + +int ClientTaskState::EnabledTaskCount(int task_set_id) +{ + + // Return the number of tasks in TaskSet that this character is enabled for. + + unsigned int enabled_task_index = 0; + unsigned int task_set_index = 0; + int enabled_task_count = 0; + + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { return -1; } + + while ((enabled_task_index < m_enabled_tasks.size()) && + (task_set_index < task_manager->m_task_sets[task_set_id].size())) { + + if (m_enabled_tasks[enabled_task_index] == task_manager->m_task_sets[task_set_id][task_set_index]) { + enabled_task_count++; + enabled_task_index++; + task_set_index++; + continue; + } + + if (m_enabled_tasks[enabled_task_index] < task_manager->m_task_sets[task_set_id][task_set_index]) { + enabled_task_index++; + } + else { + task_set_index++; + } + + } + + return enabled_task_count; +} + +int ClientTaskState::ActiveTasksInSet(int task_set_id) +{ + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { + return -1; + } + + int active_task_in_set_count = 0; + + for (int task_id : task_manager->m_task_sets[task_set_id]) { + if (IsTaskActive(task_id)) { + active_task_in_set_count++; + } + } + + return active_task_in_set_count; +} + +int ClientTaskState::CompletedTasksInSet(int task_set_id) +{ + if ((task_set_id <= 0) || (task_set_id >= MAXTASKSETS)) { + return -1; + } + + int completed_tasks_count = 0; + + for (int i : task_manager->m_task_sets[task_set_id]) { + if (IsTaskCompleted(i)) { + completed_tasks_count++; + } + } + + return completed_tasks_count; +} + +bool ClientTaskState::HasSlotForTask(TaskInformation *task) +{ + if (task == nullptr) { + return false; + } + + switch (task->type) { + case TaskType::Task: + return m_active_task.task_id == TASKSLOTEMPTY; + case TaskType::Shared: + return false; // todo + case TaskType::Quest: + for (auto &active_quest : m_active_quests) { + if (active_quest.task_id == TASKSLOTEMPTY) { + return true; + } + } + case TaskType::E: + return false; // removed on live + } + + return false; +} + +int ClientTaskState::GetActiveTaskID(int index) +{ + // Return the task_id from the client's specified Active Task slot. + if ((index < 0) || (index >= MAXACTIVEQUESTS)) { + return 0; + } + + return m_active_quests[index].task_id; +} + +static void DeleteCompletedTaskFromDatabase(int character_id, int task_id) +{ + LogTasks("[DeleteCompletedTasksFromDatabase] character_id [{}], task_id [{}]", character_id, task_id); + + CompletedTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} and taskid = {}", character_id, task_id) + ); +} + +bool ClientTaskState::UnlockActivities(int character_id, ClientTaskInformation &task_info) +{ + bool all_activities_complete = true; + + TaskInformation *p_task_data = task_manager->m_task_data[task_info.task_id]; + if (p_task_data == nullptr) { + return true; + } + + // On loading the client state, all activities that are not completed, are + // marked as hidden. For Sequential (non-stepped) mode, we mark the first + // activity_information as active if not complete. + LogTasks( + "character_id [{}] task_id [{}] sequence_mode [{}]", + character_id, + task_info.task_id, + p_task_data->sequence_mode + ); + + if (p_task_data->sequence_mode == ActivitiesSequential) { + if (task_info.activity[0].activity_state != ActivityCompleted) { + task_info.activity[0].activity_state = ActivityActive; + } + + // Enable the next Hidden task. + for (int i = 0; i < p_task_data->activity_count; i++) { + if ((task_info.activity[i].activity_state == ActivityActive) && + (!p_task_data->activity_information[i].optional)) { + all_activities_complete = false; + break; + } + + if (task_info.activity[i].activity_state == ActivityHidden) { + task_info.activity[i].activity_state = ActivityActive; + all_activities_complete = false; + break; + } + } + + if (all_activities_complete && RuleB(TaskSystem, RecordCompletedTasks)) { + if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { + LogTasks("KeepOneRecord enabled"); + auto iterator = m_completed_tasks.begin(); + int erased_elements = 0; + while (iterator != m_completed_tasks.end()) { + int task_id = (*iterator).task_id; + if (task_id == task_info.task_id) { + iterator = m_completed_tasks.erase(iterator); + erased_elements++; + } + else { + ++iterator; + } + } + + LogTasks("Erased Element count is [{}]", erased_elements); + + if (erased_elements) { + m_last_completed_task_loaded -= erased_elements; + DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); + } + } + + CompletedTaskInformation completed_task_information{}; + completed_task_information.task_id = task_info.task_id; + completed_task_information.completed_time = time(nullptr); + + for (int i = 0; i < p_task_data->activity_count; i++) { + completed_task_information.activity_done[i] = (task_info.activity[i].activity_state == ActivityCompleted); + } + + m_completed_tasks.push_back(completed_task_information); + } + + LogTasks("Returning sequential task, AllActivitiesComplete is [{}]", all_activities_complete); + + return all_activities_complete; + } + + // Stepped Mode + // TODO: This code is probably more complex than it needs to be + + bool current_step_complete = true; + + LogTasks( + "[UnlockActivities] Current step [{}] last_step [{}]", + task_info.current_step, + p_task_data->last_step + ); + + // If current_step is -1, this is the first call to this method since loading the + // client state. Unlock all activities with a step number of 0 + + if (task_info.current_step == -1) { + for (int i = 0; i < p_task_data->activity_count; i++) { + + if (p_task_data->activity_information[i].step_number == 0 && + task_info.activity[i].activity_state == ActivityHidden) { + task_info.activity[i].activity_state = ActivityActive; + // task_info.activity_information[i].updated=true; + } + } + task_info.current_step = 0; + } + + for (int current_step = task_info.current_step; current_step <= p_task_data->last_step; current_step++) { + for (int activity = 0; activity < p_task_data->activity_count; activity++) { + if (p_task_data->activity_information[activity].step_number == (int) task_info.current_step) { + if ((task_info.activity[activity].activity_state != ActivityCompleted) && + (!p_task_data->activity_information[activity].optional)) { + current_step_complete = false; + all_activities_complete = false; + break; + } + } + } + if (!current_step_complete) { + break; + } + task_info.current_step++; + } + + if (all_activities_complete) { + if (RuleB(TaskSystem, RecordCompletedTasks)) { + // If we are only keeping one completed record per task, and the player has done + // the same task again, erase the previous completed entry for this task. + if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { + LogTasksDetail("[UnlockActivities] KeepOneRecord enabled"); + auto iterator = m_completed_tasks.begin(); + int erased_elements = 0; + + while (iterator != m_completed_tasks.end()) { + int task_id = (*iterator).task_id; + if (task_id == task_info.task_id) { + iterator = m_completed_tasks.erase(iterator); + erased_elements++; + } + else { + ++iterator; + } + } + + LogTasksDetail("[UnlockActivities] Erased Element count is [{}]", erased_elements); + + if (erased_elements) { + m_last_completed_task_loaded -= erased_elements; + DeleteCompletedTaskFromDatabase(character_id, task_info.task_id); + } + } + + CompletedTaskInformation completed_task_information{}; + completed_task_information.task_id = task_info.task_id; + completed_task_information.completed_time = time(nullptr); + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + completed_task_information.activity_done[activity_id] = + (task_info.activity[activity_id].activity_state == ActivityCompleted); + } + + m_completed_tasks.push_back(completed_task_information); + } + return true; + } + + // Mark all non-completed tasks in the current step as active + for (int activity = 0; activity < p_task_data->activity_count; activity++) { + if ((p_task_data->activity_information[activity].step_number == (int) task_info.current_step) && + (task_info.activity[activity].activity_state == ActivityHidden)) { + task_info.activity[activity].activity_state = ActivityActive; + task_info.activity[activity].updated = true; + } + } + + return false; +} + +void ClientTaskState::UpdateTasksOnKill(Client *client, int npc_type_id) +{ + UpdateTasksByNPC(client, ActivityKill, npc_type_id); +} + +bool ClientTaskState::UpdateTasksOnSpeakWith(Client *client, int npc_type_id) +{ + return UpdateTasksByNPC(client, ActivitySpeakWith, npc_type_id); +} + +bool ClientTaskState::UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id) +{ + + int is_updating = false; + + // If the client has no tasks, there is nothing further to check. + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return false; + } + + // loop over the union of tasks and quests + for (auto &active_task : m_active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active kill activities for this p_task_data + auto p_task_data = task_manager->m_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return false; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + // We are only interested in Kill activities + if (activity_info->activity_type != activity_type) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UPDATE] character [{}] task_id [{}] activity_id [{}] activity_type [{}] for NPC [{}] failed zone check", + client->GetName(), + current_task->task_id, + activity_id, + activity_type, + npc_type_id + ); + continue; + } + // Is the activity_information to kill this type of NPC ? + switch (activity_info->goal_method) { + case METHODSINGLEID: + if (activity_info->goal_id != npc_type_id) { + continue; + } + break; + + case METHODLIST: + if (!task_manager->m_goal_list_manager.IsInList( + activity_info->goal_id, + npc_type_id + )) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active p_task_data to kill this type of NPC, so increment the done count + LogTasksDetail("Calling increment done count ByNPC"); + IncrementDoneCount(client, p_task_data, current_task->slot, activity_id); + is_updating = true; + } + } + + return is_updating; +} + +int ClientTaskState::ActiveSpeakTask(int npc_type_id) +{ + + // This method is to be used from Perl quests only and returns the task_id of the first + // active task found which has an active SpeakWith activity_information for this NPC. + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return 0; + } + + // loop over the union of tasks and quests + for (auto &active_task : m_active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + continue; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + if (activity_info->activity_type != ActivitySpeakWith) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + continue; + } + // Is the activity_information to speak with this type of NPC ? + if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { + return current_task->task_id; + } + } + } + + return 0; +} + +int ClientTaskState::ActiveSpeakActivity(int npc_type_id, int task_id) +{ + + // This method is to be used from Perl quests only and returns the activity_id of the first + // active activity_information found in the specified task which is to SpeakWith this NPC. + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return -1; + } + if (task_id <= 0 || task_id >= MAXTASKS) { + return -1; + } + + // loop over the union of tasks and quests + for (auto &active_task : m_active_tasks) { + auto current_task = &active_task; + if (current_task->task_id != task_id) { + continue; + } + + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + continue; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + if (activity_info->activity_type != ActivitySpeakWith) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + continue; + } + + // Is the activity_information to speak with this type of NPC ? + if (activity_info->goal_method == METHODQUEST && activity_info->goal_id == npc_type_id) { + return activity_id; + } + } + return 0; + } + return 0; +} + +void ClientTaskState::UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count) +{ + + // This method updates the client's task activities of the specified type which relate + // to the specified item. + // + // Type should be one of ActivityLoot, ActivityTradeSkill, ActivityFish or ActivityForage + + // If the client has no tasks, there is nothing further to check. + + LogTasks( + "[UpdateTasksForItem] activity_type [{}] item_id [{}]", + activity_type, + item_id + ); + + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return; + } + + // loop over the union of tasks and quests + for (auto &active_task : m_active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active loot activities for this task + + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + // We are only interested in the ActivityType we were called with + if (activity_info->activity_type != (int) activity_type) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UpdateTasksForItem] Error: Character [{}] activity_information type [{}] for Item [{}] failed zone check", + client->GetName(), + activity_type, + item_id + ); + continue; + } + // Is the activity_information related to this item ? + // + switch (activity_info->goal_method) { + + case METHODSINGLEID: + if (activity_info->goal_id != item_id) { continue; } + break; + + case METHODLIST: + if (!task_manager->m_goal_list_manager.IsInList( + activity_info->goal_id, + item_id + )) { continue; } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active task related to this item, so increment the done count + LogTasksDetail("[UpdateTasksForItem] Calling increment done count ForItem"); + IncrementDoneCount(client, p_task_data, current_task->slot, activity_id, count); + } + } +} + +void ClientTaskState::UpdateTasksOnExplore(Client *client, int explore_id) +{ + LogTasks("[UpdateTasksOnExplore] explore_id [{}]", explore_id); + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return; + } + + // loop over the union of tasks and quests + for (auto &active_task : m_active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active explore activities for this task + + TaskInformation *task_data = task_manager->m_task_data[current_task->task_id]; + if (task_data == nullptr) { + return; + } + + for (int activity_id = 0; activity_id < task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + // We are only interested in explore activities + if (activity_info->activity_type != ActivityExplore) { + continue; + } + if (!activity_info->CheckZone(zone->GetZoneID())) { + LogTasks( + "[UpdateTasksOnExplore] character [{}] explore_id [{}] failed zone check", + client->GetName(), + explore_id + ); + continue; + } + // Is the activity_information to explore this area id ? + switch (activity_info->goal_method) { + + case METHODSINGLEID: + if (activity_info->goal_id != explore_id) { + continue; + } + break; + + case METHODLIST: + if (!task_manager->m_goal_list_manager.IsInList( + activity_info->goal_id, + explore_id + )) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + + // We found an active task to explore this area, so set done count to goal count + // (Only a goal count of 1 makes sense for explore activities?) + LogTasks( + "[UpdateTasksOnExplore] character [{}] explore_id [{}] increment on explore", + client->GetName(), + explore_id + ); + + IncrementDoneCount( + client, + task_data, + current_task->slot, + activity_id, + activity_info->goal_count - current_task->activity[activity_id].done_count + ); + } + } +} + +bool ClientTaskState::UpdateTasksOnDeliver( + Client *client, + std::list &items, + int cash, + int npc_type_id +) +{ + bool is_updated = false; + + LogTasks("[UpdateTasksOnDeliver] [{}]", npc_type_id); + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return false; + } + + // loop over the union of tasks and quests + for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { + auto current_task = &m_active_tasks[i]; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active deliver activities for this task + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return false; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (client_activity->activity_state != ActivityActive) { + continue; + } + + // We are only interested in Deliver activities + if (activity_info->activity_type != ActivityDeliver && + activity_info->activity_type != ActivityGiveCash) { + continue; + } + // Is there a zone restriction on the activity_information ? + if (!activity_info->CheckZone(zone->GetZoneID())) { + Log( + Logs::General, Logs::Tasks, + "[UPDATE] Char: %s Deliver activity_information failed zone check (current zone %i, need zone " + "%s", + client->GetName(), zone->GetZoneID(), activity_info->zones.c_str()); + continue; + } + // Is the activity_information to deliver to this NPCTypeID ? + if (activity_info->deliver_to_npc != npc_type_id) { + continue; + } + // Is the activity_information related to these items ? + // + if ((activity_info->activity_type == ActivityGiveCash) && cash) { + LogTasks("[UpdateTasksOnDeliver] Increment on GiveCash"); + IncrementDoneCount(client, p_task_data, i, activity_id, cash); + is_updated = true; + } + else { + for (auto &item : items) { + switch (activity_info->goal_method) { + case METHODSINGLEID: + if (activity_info->goal_id != item->GetID()) { + continue; + } + break; + + case METHODLIST: + if (!task_manager->m_goal_list_manager.IsInList( + activity_info->goal_id, + item->GetID())) { + continue; + } + break; + + default: + // If METHODQUEST, don't updated the activity_information here + continue; + } + // We found an active task related to this item, so increment the done count + LogTasks("[UpdateTasksOnDeliver] Increment on GiveItem"); + IncrementDoneCount( + client, + p_task_data, + current_task->slot, + activity_id, + item->GetCharges() <= 0 ? 1 : item->GetCharges() + ); + is_updated = true; + } + } + } + } + + return is_updated; +} + +void ClientTaskState::UpdateTasksOnTouch(Client *client, int zone_id) +{ + // If the client has no tasks, there is nothing further to check. + + LogTasks("[UpdateTasksOnTouch] [{}] ", zone_id); + if (!task_manager || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { // could be better ... + return; + } + + // loop over the union of tasks and quests + for (auto &active_task : m_active_tasks) { + auto current_task = &active_task; + if (current_task->task_id == TASKSLOTEMPTY) { + continue; + } + + // Check if there are any active explore activities for this task + TaskInformation *p_task_data = task_manager->m_task_data[current_task->task_id]; + if (p_task_data == nullptr) { + return; + } + + for (int activity_id = 0; activity_id < p_task_data->activity_count; activity_id++) { + ClientActivityInformation *client_activity = ¤t_task->activity[activity_id]; + ActivityInformation *activity_info = &p_task_data->activity_information[activity_id]; + + // We are not interested in completed or hidden activities + if (current_task->activity[activity_id].activity_state != ActivityActive) { + continue; + } + // We are only interested in touch activities + if (activity_info->activity_type != ActivityTouch) { + continue; + } + if (activity_info->goal_method != METHODSINGLEID) { + continue; + } + if (!activity_info->CheckZone(zone_id)) { + LogTasks( + "[UpdateTasksOnTouch] character [{}] Touch activity_information failed zone check", + client->GetName() + ); + continue; + } + + // We found an active task to zone into this zone, so set done count to goal count + // (Only a goal count of 1 makes sense for touch activities?) + LogTasks("[UpdateTasksOnTouch] Increment on Touch"); + IncrementDoneCount( + client, + p_task_data, + current_task->slot, + activity_id, + activity_info->goal_count - current_task->activity[activity_id].done_count + ); + } + } +} + +void ClientTaskState::IncrementDoneCount( + Client *client, + TaskInformation *task_information, + int task_index, + int activity_id, + int count, + bool ignore_quest_update +) +{ + Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); + + auto info = GetClientTaskInfo(task_information->type, task_index); + if (info == nullptr) { + return; + } + + info->activity[activity_id].done_count += count; + + if (info->activity[activity_id].done_count > task_information->activity_information[activity_id].goal_count) { + info->activity[activity_id].done_count = task_information->activity_information[activity_id].goal_count; + } + + if (!ignore_quest_update) { + char buf[24]; + snprintf( + buf, + 23, + "%d %d %d", + info->activity[activity_id].done_count, + info->activity[activity_id].activity_id, + info->task_id + ); + buf[23] = '\0'; + parse->EventPlayer(EVENT_TASK_UPDATE, client, buf, 0); + } + + info->activity[activity_id].updated = true; + // Have we reached the goal count for this activity_information ? + if (info->activity[activity_id].done_count >= task_information->activity_information[activity_id].goal_count) { + Log( + Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for activity_information %i", + info->activity[activity_id].done_count, + task_information->activity_information[activity_id].goal_count, + activity_id + ); + + // Flag the activity_information as complete + info->activity[activity_id].activity_state = ActivityCompleted; + // Unlock subsequent activities for this task + bool task_complete = UnlockActivities(client->CharacterID(), *info); + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", task_complete); + // and by the 'Task Stage Completed' message + client->SendTaskActivityComplete(info->task_id, activity_id, task_index, task_information->type); + // Send the updated task/activity_information list to the client + task_manager->SendSingleActiveTaskToClient(client, *info, task_complete, false); + // Inform the client the task has been updated, both by a chat message + client->Message(Chat::White, "Your task '%s' has been updated.", task_information->title.c_str()); + + if (task_information->activity_information[activity_id].goal_method != METHODQUEST) { + if (!ignore_quest_update) { + char buf[24]; + snprintf(buf, 23, "%d %d", info->task_id, info->activity[activity_id].activity_id); + buf[23] = '\0'; + parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, client, buf, 0); + } + /* QS: PlayerLogTaskUpdates :: Update */ + if (RuleB(QueryServ, PlayerLogTaskUpdates)) { + std::string event_desc = StringFormat( + "Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", + info->task_id, + info->activity[activity_id].activity_id, + info->activity[activity_id].done_count, + client->GetZoneID(), + client->GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); + } + } + + // If this task is now complete, the Completed tasks will have been + // updated in UnlockActivities. Send the completed task list to the + // client. This is the same sequence the packets are sent on live. + if (task_complete) { + char buf[24]; + snprintf( + buf, + 23, + "%d %d %d", + info->activity[activity_id].done_count, + info->activity[activity_id].activity_id, + info->task_id + ); + buf[23] = '\0'; + parse->EventPlayer(EVENT_TASK_COMPLETE, client, buf, 0); + + /* QS: PlayerLogTaskUpdates :: Complete */ + if (RuleB(QueryServ, PlayerLogTaskUpdates)) { + std::string event_desc = StringFormat( + "Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", + info->task_id, + info->activity[activity_id].activity_id, + info->activity[activity_id].done_count, + client->GetZoneID(), + client->GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_Task_Updates, client->CharacterID(), event_desc); + } + + task_manager->SendCompletedTasksToClient(client, this); + client->SendTaskActivityComplete(info->task_id, 0, task_index, task_information->type, 0); + task_manager->SaveClientState(client, this); + //c->SendTaskComplete(TaskIndex); + client->CancelTask(task_index, task_information->type); + //if(Task->reward_method != METHODQUEST) RewardTask(c, Task); + // If Experience and/or cash rewards are set, reward them from the task even if reward_method is METHODQUEST + RewardTask(client, task_information); + //RemoveTask(c, TaskIndex); + + } + + } + else { + // Send an updated packet for this single activity_information + task_manager->SendTaskActivityLong( + client, + info->task_id, + activity_id, + task_index, + task_information->activity_information[activity_id].optional + ); + task_manager->SaveClientState(client, this); + } +} + +void ClientTaskState::RewardTask(Client *client, TaskInformation *task_information) +{ + + if (!task_information || !client) { + return; + } + + const EQ::ItemData *item_data; + std::vector reward_list; + + switch (task_information->reward_method) { + case METHODSINGLEID: { + if (task_information->reward_id) { + client->SummonItem(task_information->reward_id); + item_data = database.GetItem(task_information->reward_id); + if (item_data) { + client->Message(Chat::Yellow, "You receive %s as a reward.", item_data->Name); + } + } + break; + } + case METHODLIST: { + reward_list = task_manager->m_goal_list_manager.GetListContents(task_information->reward_id); + for (int item_id : reward_list) { + client->SummonItem(item_id); + item_data = database.GetItem(item_id); + if (item_data) { + client->Message(Chat::Yellow, "You receive %s as a reward.", item_data->Name); + } + } + break; + } + default: { + // Nothing special done for METHODQUEST + break; + } + } + + if (!task_information->completion_emote.empty()) { + client->SendColoredText( + Chat::Yellow, + task_information->completion_emote + ); + } // unsure if they use this packet or color, should work + + // just use normal NPC faction ID stuff + if (task_information->faction_reward) { + client->SetFactionLevel( + client->CharacterID(), + task_information->faction_reward, + client->GetBaseClass(), + client->GetBaseRace(), + client->GetDeity() + ); + } + + if (task_information->cash_reward) { + int platinum, gold, silver, copper; + + copper = task_information->cash_reward; + client->AddMoneyToPP(copper, true); + + platinum = copper / 1000; + copper = copper - (platinum * 1000); + gold = copper / 100; + copper = copper - (gold * 100); + silver = copper / 10; + copper = copper - (silver * 10); + + std::string cash_message; + + if (platinum > 0) { + cash_message = "You receive "; + cash_message += itoa(platinum); + cash_message += " platinum"; + } + if (gold > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; + } + else { + cash_message += ","; + } + cash_message += itoa(gold); + cash_message += " gold"; + } + if (silver > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; + } + else { + cash_message += ","; + } + cash_message += itoa(silver); + cash_message += " silver"; + } + if (copper > 0) { + if (cash_message.length() == 0) { + cash_message = "You receive "; + } + else { + cash_message += ","; + } + cash_message += itoa(copper); + cash_message += " copper"; + } + cash_message += " pieces."; + client->Message(Chat::Yellow, cash_message.c_str()); + } + int32 experience_reward = task_information->experience_reward; + if (experience_reward > 0) { + client->AddEXP(experience_reward); + } + if (experience_reward < 0) { + uint32 pos_reward = experience_reward * -1; + // Minimal Level Based Exp reward Setting is 101 (1% exp at level 1) + if (pos_reward > 100 && pos_reward < 25700) { + uint8 max_level = pos_reward / 100; + uint8 exp_percent = pos_reward - (max_level * 100); + client->AddLevelBasedExp(exp_percent, max_level); + } + } + + client->SendSound(); +} + +bool ClientTaskState::IsTaskActive(int task_id) +{ + if (m_active_task.task_id == task_id) { + return true; + } + + if (m_active_task_count == 0 || task_id == 0) { + return false; + } + + for (auto &active_quest : m_active_quests) { + if (active_quest.task_id == task_id) { + return true; + } + } + + return false; +} + +void ClientTaskState::FailTask(Client *client, int task_id) +{ + LogTasks( + "[FailTask] Failing task for character [{}] task_id [{}] task_count [{}]", + client->GetCleanName(), + task_id, + m_active_task_count + ); + + if (m_active_task.task_id == task_id) { + client->SendTaskFailed(task_id, 0, TaskType::Task); + // Remove the task from the client + client->CancelTask(0, TaskType::Task); + return; + } + + // TODO: shared tasks + + if (m_active_task_count == 0) { + return; + } + + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (m_active_quests[i].task_id == task_id) { + client->SendTaskFailed(m_active_quests[i].task_id, i, TaskType::Quest); + // Remove the task from the client + client->CancelTask(i, TaskType::Quest); + return; + } + } +} + +// TODO: Shared tasks +bool ClientTaskState::IsTaskActivityActive(int task_id, int activity_id) +{ + LogTasks("[IsTaskActivityActive] task_id [{}] activity_id [{}]", task_id, activity_id); + + // Quick sanity check + if (activity_id < 0) { + return false; + } + if (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY) { + return false; + } + + int active_task_index = -1; + auto task_type = TaskType::Task; + + if (m_active_task.task_id == task_id) { + active_task_index = 0; + } + + if (active_task_index == -1) { + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (m_active_quests[i].task_id == task_id) { + active_task_index = i; + task_type = TaskType::Quest; + break; + } + } + } + + // The client does not have this task + if (active_task_index == -1) { + return false; + } + + auto info = GetClientTaskInfo(task_type, active_task_index); + + if (info == nullptr) { + return false; + } + + TaskInformation *p_task_data = task_manager->m_task_data[info->task_id]; + + // The task is invalid + if (p_task_data == nullptr) { + return false; + } + + // The activity_id is out of range + if (activity_id >= p_task_data->activity_count) { + return false; + } + + LogTasks( + "[IsTaskActivityActive] (Update) task_id [{}] activity_id [{}] activity_state [{}]", + task_id, + activity_id, + info->activity[activity_id].activity_state + ); + + return (info->activity[activity_id].activity_state == ActivityActive); +} + +void ClientTaskState::UpdateTaskActivity( + Client *client, + int task_id, + int activity_id, + int count, + bool ignore_quest_update /*= false*/) +{ + LogTasks( + "[UpdateTaskActivity] Increment done count (pre) on UpdateTaskActivity task_id [{}] activity_id [{}] count [{}]", + task_id, + activity_id, + count + ); + + // Quick sanity check + if (activity_id < 0 || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { + return; + } + + int active_task_index = -1; + auto type = TaskType::Task; + + if (m_active_task.task_id == task_id) { + active_task_index = 0; + } + + if (active_task_index == -1) { + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (m_active_quests[i].task_id == task_id) { + active_task_index = i; + type = TaskType::Quest; + break; + } + } + } + + // The client does not have this task + if (active_task_index == -1) { + return; + } + + auto info = GetClientTaskInfo(type, active_task_index); + if (info == nullptr) { + return; + } + + TaskInformation *p_task_data = task_manager->m_task_data[info->task_id]; + + // The task is invalid + if (p_task_data == nullptr) { + return; + } + + // The activity_id is out of range + if (activity_id >= p_task_data->activity_count) { + return; + } + + // The activity_information is not currently active + if (info->activity[activity_id].activity_state == ActivityHidden) { + return; + } + + LogTasks( + "[UpdateTaskActivity] Increment done count (done) on UpdateTaskActivity task_id [{}] activity_id [{}] count [{}]", + task_id, + activity_id, + count + ); + + IncrementDoneCount(client, p_task_data, active_task_index, activity_id, count, ignore_quest_update); +} + +void ClientTaskState::ResetTaskActivity(Client *client, int task_id, int activity_id) +{ + LogTasks( + "[ResetTaskActivity] (pre) client [{}] task_id [{}] activity_id [{}]", + client->GetCleanName(), + task_id, + activity_id + ); + + // Quick sanity check + if (activity_id < 0 || (m_active_task_count == 0 && m_active_task.task_id == TASKSLOTEMPTY)) { + return; + } + + int active_task_index = -1; + auto type = TaskType::Task; + if (m_active_task.task_id == task_id) { + active_task_index = 0; + } + + if (active_task_index == -1) { + for (int i = 0; i < MAXACTIVEQUESTS; i++) { + if (m_active_quests[i].task_id == task_id) { + active_task_index = i; + type = TaskType::Quest; + break; + } + } + } + + // The client does not have this task + if (active_task_index == -1) { + return; + } + + auto info = GetClientTaskInfo(type, active_task_index); + if (info == nullptr) { + return; + } + + TaskInformation *p_task_data = task_manager->m_task_data[info->task_id]; + if (p_task_data == nullptr) { + return; + } + + // The activity_id is out of range + if (activity_id >= p_task_data->activity_count) { + return; + } + + // The activity_information is not currently active + if (info->activity[activity_id].activity_state == ActivityHidden) { + return; + } + + LogTasks( + "[ResetTaskActivity] (IncrementDoneCount) client [{}] task_id [{}] activity_id [{}]", + client->GetCleanName(), + task_id, + activity_id + ); + + IncrementDoneCount( + client, + p_task_data, + active_task_index, + activity_id, + (info->activity[activity_id].done_count * -1), + false + ); +} + +void ClientTaskState::ShowClientTasks(Client *client) +{ + client->Message(Chat::White, "------------------------------------------------"); + client->Message(Chat::White, "# Task Information | Client [%s]", client->GetCleanName()); +// client->Message(Chat::White, "------------------------------------------------"); + if (m_active_task.task_id != TASKSLOTEMPTY) { + client->Message( + Chat::White, + "Task: %i %s", + m_active_task.task_id, + task_manager->m_task_data[m_active_task.task_id]->title.c_str() + ); + client->Message( + Chat::White, + " description: [%s]\n", + task_manager->m_task_data[m_active_task.task_id]->description.c_str() + ); + for (int activity_id = 0; activity_id < task_manager->GetActivityCount(m_active_task.task_id); activity_id++) { + client->Message( + Chat::White, + " activity_information: %2d, done_count: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", + m_active_task.activity[activity_id].activity_id, + m_active_task.activity[activity_id].done_count, + m_active_task.activity[activity_id].activity_state + ); + } + } + + for (auto &active_quest : m_active_quests) { + if (active_quest.task_id == TASKSLOTEMPTY) { + continue; + } + + client->Message(Chat::White, "------------------------------------------------"); + client->Message( + Chat::White, "# Quest | task_id [%i] title [%s]", + active_quest.task_id, + task_manager->m_task_data[active_quest.task_id]->title.c_str() + ); + client->Message(Chat::White, "------------------------------------------------"); + + client->Message( + Chat::White, + " -- Description [%s]\n", + task_manager->m_task_data[active_quest.task_id]->description.c_str() + ); + + for (int activity_id = 0; activity_id < task_manager->GetActivityCount(active_quest.task_id); activity_id++) { + std::vector update_increments = {"1", "5", "50"}; + std::string update_saylinks; + + for (auto &increment: update_increments) { + auto task_update_saylink = EQ::SayLinkEngine::GenerateQuestSaylink( + fmt::format( + "#task update {} {} {}", + active_quest.task_id, + active_quest.activity[activity_id].activity_id, + increment + ), + false, + increment + ); + + update_saylinks += "[" + task_update_saylink + "] "; + } + + client->Message( + Chat::White, + " --- activity_id [%i] done_count [%i] state [%d] (0=hidden 1=active 2=complete) | Update %s", + active_quest.activity[activity_id].activity_id, + active_quest.activity[activity_id].done_count, + active_quest.activity[activity_id].activity_state, + update_saylinks.c_str() + ); + } + } + + client->Message(Chat::White, "------------------------------------------------"); +} + +// TODO: Shared Task +int ClientTaskState::TaskTimeLeft(int task_id) +{ + if (m_active_task.task_id == task_id) { + int time_now = time(nullptr); + + TaskInformation *p_task_data = task_manager->m_task_data[task_id]; + if (p_task_data == nullptr) { + return -1; + } + + if (!p_task_data->duration) { + return -1; + } + + int time_left = (m_active_task.accepted_time + p_task_data->duration - time_now); + + return (time_left > 0 ? time_left : 0); + } + + if (m_active_task_count == 0) { + return -1; + } + + for (auto &active_quest : m_active_quests) { + if (active_quest.task_id != task_id) { + continue; + } + + int time_now = time(nullptr); + + TaskInformation *p_task_data = task_manager->m_task_data[active_quest.task_id]; + if (p_task_data == nullptr) { + return -1; + } + + if (!p_task_data->duration) { + return -1; + } + + int time_left = (active_quest.accepted_time + p_task_data->duration - time_now); + + // If Timeleft is negative, return 0, else return the number of seconds left + + return (time_left > 0 ? time_left : 0); + } + + return -1; +} + +int ClientTaskState::IsTaskCompleted(int task_id) +{ + + // Returns: -1 if RecordCompletedTasks is not true + // +1 if the task has been completed + // 0 if the task has not been completed + + if (!(RuleB(TaskSystem, RecordCompletedTasks))) { + return -1; + } + + for (auto &completed_task : m_completed_tasks) { + LogTasks("[IsTaskCompleted] Comparing compelted task [{}] with [{}]", completed_task.task_id, task_id); + if (completed_task.task_id == task_id) { + return 1; + } + } + + return 0; +} + +bool ClientTaskState::TaskOutOfTime(TaskType task_type, int index) +{ + // Returns true if the Task in the specified slot has a time limit that has been exceeded. + auto info = GetClientTaskInfo(task_type, index); + if (info == nullptr) { + return false; + } + + // make sure the task_id is at least maybe in our array + if (info->task_id <= 0 || info->task_id >= MAXTASKS) { + return false; + } + + int time_now = time(nullptr); + TaskInformation *task_data = task_manager->m_task_data[info->task_id]; + if (task_data == nullptr) { + return false; + } + + return (task_data->duration && (info->accepted_time + task_data->duration <= time_now)); +} + +void ClientTaskState::TaskPeriodicChecks(Client *client) +{ + if (m_active_task.task_id != TASKSLOTEMPTY) { + if (TaskOutOfTime(TaskType::Task, 0)) { + // Send Red Task Failed Message + client->SendTaskFailed(m_active_task.task_id, 0, TaskType::Task); + // Remove the task from the client + client->CancelTask(0, TaskType::Task); + // It is a conscious decision to only fail one task per call to this method, + // otherwise the player will not see all the failed messages where multiple + // tasks fail at the same time. + return; + } + } + + // TODO: shared tasks -- although that will probably be manager in world checking and telling zones to fail us + + if (m_active_task_count == 0) { + return; + } + + // Check for tasks that have failed because they have not been completed in the specified time + // + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { + if (m_active_quests[task_index].task_id == TASKSLOTEMPTY) { + continue; + } + + if (TaskOutOfTime(TaskType::Quest, task_index)) { + // Send Red Task Failed Message + client->SendTaskFailed(m_active_quests[task_index].task_id, task_index, TaskType::Quest); + // Remove the task from the client + client->CancelTask(task_index, TaskType::Quest); + // It is a conscious decision to only fail one task per call to this method, + // otherwise the player will not see all the failed messages where multiple + // tasks fail at the same time. + break; + } + } + + // Check for activities that require zoning into a specific zone. + // This is done in this method because it gives an extra few seconds for the client screen to display + // the zone before we send the 'Task activity_information Completed' message. + // + if (!m_checked_touch_activities) { + UpdateTasksOnTouch(client, zone->GetZoneID()); + m_checked_touch_activities = true; + } +} + +bool ClientTaskState::IsTaskActivityCompleted(TaskType task_type, int index, int activity_id) +{ + switch (task_type) { + case TaskType::Task: + if (index != 0) { + return false; + } + return m_active_task.activity[activity_id].activity_state == ActivityCompleted; + case TaskType::Shared: + return false; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return m_active_quests[index].activity[activity_id].activity_state == ActivityCompleted; + } + default: + return false; + } + +} + +// should we be defaulting to hidden? +ActivityState ClientTaskState::GetTaskActivityState(TaskType task_type, int index, int activity_id) +{ + switch (task_type) { + case TaskType::Task: + if (index != 0) { + return ActivityHidden; + } + return m_active_task.activity[activity_id].activity_state; + case TaskType::Shared: + return ActivityHidden; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return m_active_quests[index].activity[activity_id].activity_state; + } + default: + return ActivityHidden; + } +} + +int ClientTaskState::GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id) +{ + switch (task_type) { + case TaskType::Task: + if (index != 0) { + return 0; + } + return m_active_task.activity[activity_id].done_count; + case TaskType::Shared: + return 0; // TODO: shared tasks + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + return m_active_quests[index].activity[activity_id].done_count; + } + default: + return 0; + } +} + +int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id) +{ + if (m_active_task.task_id == task_id) { + return m_active_task.activity[activity_id].done_count; + } + + // TODO: shared tasks + + int active_task_index = -1; + + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { + if (m_active_quests[task_index].task_id == task_id) { + active_task_index = task_index; + break; + } + } + + if (active_task_index == -1) { + return 0; + } + + if (m_active_quests[active_task_index].activity[activity_id].done_count) { + return m_active_quests[active_task_index].activity[activity_id].done_count; + } + else { + return 0; + } +} + +int ClientTaskState::GetTaskStartTime(TaskType task_type, int index) +{ + switch (task_type) { + case TaskType::Task: + return m_active_task.accepted_time; + case TaskType::Quest: + return m_active_quests[index].accepted_time; + case TaskType::Shared: // TODO + default: + return -1; + } +} + +void ClientTaskState::CancelAllTasks(Client *client) +{ + + // This method exists solely to be called during #task reloadall + // It removes tasks from the in-game client state ready for them to be + // resent to the client, in case an updated task fails to load + + CancelTask(client, 0, TaskType::Task, false); + m_active_task.task_id = TASKSLOTEMPTY; + + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) + if (m_active_quests[task_index].task_id != TASKSLOTEMPTY) { + CancelTask(client, task_index, TaskType::Quest, false); + m_active_quests[task_index].task_id = TASKSLOTEMPTY; + } + + // TODO: shared +} + +void ClientTaskState::CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db) +{ + auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); + + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; + cts->SequenceNumber = sequence_number; + cts->type = static_cast(task_type); + + Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask"); + + client->QueuePacket(outapp); + safe_delete(outapp); + + if (remove_from_db) { + RemoveTask(client, sequence_number, task_type); + } +} + +void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType task_type) +{ + int character_id = client->CharacterID(); + Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequence_number); + + int task_id = -1; + switch (task_type) { + case TaskType::Task: + if (sequence_number == 0) { + task_id = m_active_task.task_id; + } + break; + case TaskType::Quest: + if (sequence_number < MAXACTIVEQUESTS) { + task_id = m_active_quests[sequence_number].task_id; + } + break; + case TaskType::Shared: // TODO: + default: + break; + } + + CharacterActivitiesRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {}", character_id, task_id) + ); + + CharacterTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {} AND type = {}", character_id, task_id, static_cast(task_type)) + ); + + switch (task_type) { + case TaskType::Task: + m_active_task.task_id = TASKSLOTEMPTY; + break; + case TaskType::Shared: + break; // TODO: shared tasks + case TaskType::Quest: + m_active_quests[sequence_number].task_id = TASKSLOTEMPTY; + m_active_task_count--; + break; + default: + break; + } +} + +void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) +{ + auto task_type = task_manager->GetTaskType(task_id); + int character_id = client->CharacterID(); + + CharacterActivitiesRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {}", character_id, task_id) + ); + + CharacterTasksRepository::DeleteWhere( + database, + fmt::format("charid = {} AND taskid = {} AND type = {}", character_id, task_id, (int) task_type) + ); + + switch (task_type) { + case TaskType::Task: { + if (m_active_task.task_id == task_id) { + auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; + cts->SequenceNumber = 0; + cts->type = static_cast(task_type); + LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); + client->QueuePacket(outapp); + safe_delete(outapp); + m_active_task.task_id = TASKSLOTEMPTY; + } + break; + } + case TaskType::Shared: { + break; // TODO: shared tasks + } + case TaskType::Quest: { + for (int active_quest = 0; active_quest < MAXACTIVEQUESTS; active_quest++) { + if (m_active_quests[active_quest].task_id == task_id) { + auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); + CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; + cts->SequenceNumber = active_quest; + cts->type = static_cast(task_type); + LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); + m_active_quests[active_quest].task_id = TASKSLOTEMPTY; + m_active_task_count--; + client->QueuePacket(outapp); + safe_delete(outapp); + } + } + } + default: { + break; + } + } +} + +void ClientTaskState::AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement) +{ + if (!task_manager || task_id < 0 || task_id >= MAXTASKS) { + client->Message(Chat::Red, "Task system not functioning, or task_id %i out of range.", task_id); + return; + } + + auto task = task_manager->m_task_data[task_id]; + + if (task == nullptr) { + client->Message(Chat::Red, "Invalid task_id %i", task_id); + return; + } + + bool max_tasks = false; + + switch (task->type) { + case TaskType::Task: + if (m_active_task.task_id != TASKSLOTEMPTY) { + max_tasks = true; + } + break; + case TaskType::Shared: // TODO: shared tasks + // if (something) + max_tasks = true; + break; + case TaskType::Quest: + if (m_active_task_count == MAXACTIVEQUESTS) { + max_tasks = true; + } + break; + default: + break; + } + + if (max_tasks) { + client->Message( + Chat::Red, + "You already have the maximum allowable number of active tasks (%i)", + MAXACTIVEQUESTS + ); + return; + } + + // only Quests can have more than one, so don't need to check others + if (task->type == TaskType::Quest) { + for (auto &active_quest : m_active_quests) { + if (active_quest.task_id == task_id) { + client->Message(Chat::Red, "You have already been assigned this task."); + return; + } + } + } + + if (enforce_level_requirement && !task_manager->ValidateLevel(task_id, client->GetLevel())) { + client->Message(Chat::Red, "You are outside the level range of this task."); + return; + } + + if (!task_manager->IsTaskRepeatable(task_id) && IsTaskCompleted(task_id)) { + return; + } + + // We do it this way, because when the Client cancels a task, it retains the sequence number of the remaining + // tasks in it's window, until something causes the TaskDescription packets to be sent again. We could just + // resend all the active task data to the client when it cancels a task, but that could be construed as a + // waste of bandwidth. + // + ClientTaskInformation *active_slot = nullptr; + switch (task->type) { + case TaskType::Task: + active_slot = &m_active_task; + break; + case TaskType::Shared: // TODO: shared + active_slot = nullptr; + break; + case TaskType::Quest: + for (int task_index = 0; task_index < MAXACTIVEQUESTS; task_index++) { + Log(Logs::General, Logs::Tasks, + "[UPDATE] ClientTaskState Looking for free slot in slot %i, found task_id of %i", task_index, + m_active_quests[task_index].task_id); + if (m_active_quests[task_index].task_id == 0) { + active_slot = &m_active_quests[task_index]; + break; + } + } + break; + default: + break; + } + + // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere + if (active_slot == nullptr) { + client->Message( + Chat::Red, + "You already have the maximum allowable number of active tasks (%i)", + MAXACTIVEQUESTS + ); + return; + } + + active_slot->task_id = task_id; + active_slot->accepted_time = time(nullptr); + active_slot->updated = true; + active_slot->current_step = -1; + + for (int activity_id = 0; activity_id < task_manager->m_task_data[task_id]->activity_count; activity_id++) { + active_slot->activity[activity_id].activity_id = activity_id; + active_slot->activity[activity_id].done_count = 0; + active_slot->activity[activity_id].activity_state = ActivityHidden; + active_slot->activity[activity_id].updated = true; + } + + UnlockActivities(client->CharacterID(), *active_slot); + + if (task->type == TaskType::Quest) { + m_active_task_count++; + } + + task_manager->SendSingleActiveTaskToClient(client, *active_slot, false, true); + client->Message( + Chat::White, + "You have been assigned the task '%s'.", + task_manager->m_task_data[task_id]->title.c_str() + ); + task_manager->SaveClientState(client, this); + std::string buf = std::to_string(task_id); + + NPC *npc = entity_list.GetID(npc_type_id)->CastToNPC(); + if (npc) { + parse->EventNPC(EVENT_TASK_ACCEPTED, npc, client, buf.c_str(), 0); + } +} + +void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, float z) +{ + float last_x = client->ProximityX(); + float last_y = client->ProximityY(); + float last_z = client->ProximityZ(); + + if ((last_x == x) && (last_y == y) && (last_z == z)) { + return; + } + + LogTasksDetail("[ProcessTaskProximities] Checking proximities for Position x[{}] y[{}] z[{}]", x, y, z); + int explore_id = task_manager->m_proximity_manager.CheckProximities(x, y, z); + if (explore_id > 0) { + LogTasksDetail( + "[ProcessTaskProximities] Position x[{}] y[{}] z[{}] is within proximity explore_id [{}]", + x, + y, + z, + explore_id + ); + + UpdateTasksOnExplore(client, explore_id); + } +} diff --git a/zone/task_client_state.h b/zone/task_client_state.h new file mode 100644 index 000000000..6812e99c6 --- /dev/null +++ b/zone/task_client_state.h @@ -0,0 +1,111 @@ +#ifndef EQEMU_TASK_CLIENT_STATE_H +#define EQEMU_TASK_CLIENT_STATE_H + +#include "tasks.h" +#include "../common/types.h" +#include +#include +#include +#include + +class ClientTaskState { + +public: + ClientTaskState(); + ~ClientTaskState(); + void ShowClientTasks(Client *client); + inline int GetActiveTaskCount() { return m_active_task_count; } + int GetActiveTaskID(int index); + bool IsTaskActivityCompleted(TaskType task_type, int index, int activity_id); + int GetTaskActivityDoneCount(TaskType task_type, int index, int activity_id); + int GetTaskActivityDoneCountFromTaskID(int task_id, int activity_id); + int GetTaskStartTime(TaskType task_type, int index); + void AcceptNewTask(Client *client, int task_id, int npc_type_id, bool enforce_level_requirement = false); + void FailTask(Client *client, int task_id); + int TaskTimeLeft(int task_id); + int IsTaskCompleted(int task_id); + bool IsTaskActive(int task_id); + bool IsTaskActivityActive(int task_id, int activity_id); + ActivityState GetTaskActivityState(TaskType task_type, int index, int activity_id); + void UpdateTaskActivity(Client *client, int task_id, int activity_id, int count, bool ignore_quest_update = false); + void ResetTaskActivity(Client *client, int task_id, int activity_id); + void CancelTask(Client *client, int sequence_number, TaskType task_type, bool remove_from_db = true); + void CancelAllTasks(Client *client); + void RemoveTask(Client *client, int sequence_number, TaskType task_type); + void RemoveTaskByTaskID(Client *client, uint32 task_id); + bool UpdateTasksByNPC(Client *client, int activity_type, int npc_type_id); + void UpdateTasksOnKill(Client *client, int npc_type_id); + void UpdateTasksForItem(Client *client, ActivityType activity_type, int item_id, int count = 1); + void UpdateTasksOnExplore(Client *client, int explore_id); + bool UpdateTasksOnSpeakWith(Client *client, int npc_type_id); + bool UpdateTasksOnDeliver(Client *client, std::list &items, int cash, int npc_type_id); + void UpdateTasksOnTouch(Client *client, int zone_id); + void ProcessTaskProximities(Client *client, float x, float y, float z); + bool TaskOutOfTime(TaskType task_type, int index); + void TaskPeriodicChecks(Client *client); + void SendTaskHistory(Client *client, int task_index); + void RewardTask(Client *client, TaskInformation *task_information); + void EnableTask(int character_id, int task_count, int *task_list); + void DisableTask(int character_id, int task_count, int *task_list); + bool IsTaskEnabled(int task_id); + int EnabledTaskCount(int task_set_id); + int ActiveSpeakTask(int npc_type_id); + int ActiveSpeakActivity(int npc_type_id, int task_id); + int ActiveTasksInSet(int task_set_id); + int CompletedTasksInSet(int task_set_id); + bool HasSlotForTask(TaskInformation *task); + + inline bool HasFreeTaskSlot() { return m_active_task.task_id == TASKSLOTEMPTY; } + + friend class TaskManager; + +private: + bool UnlockActivities(int character_id, ClientTaskInformation &task_info); + void IncrementDoneCount( + Client *client, + TaskInformation *task_information, + int task_index, + int activity_id, + int count = 1, + bool ignore_quest_update = false + ); + + inline ClientTaskInformation *GetClientTaskInfo(TaskType task_type, int index) + { + ClientTaskInformation *info = nullptr; + switch (task_type) { + case TaskType::Task: + if (index == 0) { + info = &m_active_task; + } + break; + case TaskType::Shared: + break; + case TaskType::Quest: + if (index < MAXACTIVEQUESTS) { + info = &m_active_quests[index]; + } + break; + default: + break; + } + return info; + } + + union { // easier to loop over + struct { + ClientTaskInformation m_active_task; // only one + ClientTaskInformation m_active_quests[MAXACTIVEQUESTS]; + }; + ClientTaskInformation m_active_tasks[MAXACTIVEQUESTS + 1]; + }; + // Shared tasks should be limited to 1 as well + int m_active_task_count; + std::vector m_enabled_tasks; + std::vector m_completed_tasks; + int m_last_completed_task_loaded; + bool m_checked_touch_activities; +}; + + +#endif //EQEMU_TASK_CLIENT_STATE_H diff --git a/zone/task_goal_list_manager.cpp b/zone/task_goal_list_manager.cpp new file mode 100644 index 000000000..9a641c6eb --- /dev/null +++ b/zone/task_goal_list_manager.cpp @@ -0,0 +1,149 @@ +#include "../common/global_define.h" +#include "../common/misc_functions.h" +#include "../common/repositories/goallists_repository.h" +#include "../common/rulesys.h" +#include "client.h" +#include "mob.h" +#include "quest_parser_collection.h" +#include "task_goal_list_manager.h" +#include "tasks.h" +#include "zonedb.h" + +TaskGoalListManager::TaskGoalListManager() +{ + m_goal_lists_count = 0; +} + +TaskGoalListManager::~TaskGoalListManager() {} + +bool TaskGoalListManager::LoadLists() +{ + m_task_goal_lists.clear(); + m_goal_lists_count = 0; + + std::string query = "SELECT `listid`, COUNT(`entry`) FROM `goallists` GROUP by `listid` ORDER BY `listid`"; + auto results = content_db.QueryDatabase(query); + if (!results.Success()) { + return false; + } + + m_goal_lists_count = results.RowCount(); + LogTasks("Loaded [{}] GoalLists", m_goal_lists_count); + + m_task_goal_lists.reserve(m_goal_lists_count); + + int list_index = 0; + for (auto row = results.begin(); row != results.end(); ++row) { + int list_id = atoi(row[0]); + int list_size = atoi(row[1]); + + m_task_goal_lists.push_back({list_id, 0, 0}); + + m_task_goal_lists[list_index].GoalItemEntries.reserve(list_size); + + list_index++; + } + + auto goal_lists = GoallistsRepository::GetWhere(content_db, "TRUE ORDER BY listid, entry ASC"); + for (list_index = 0; list_index < m_goal_lists_count; list_index++) { + + int list_id = m_task_goal_lists[list_index].ListID; + + for (auto &entry: goal_lists) { + if (entry.listid == list_id) { + if (entry.entry < m_task_goal_lists[list_index].Min) { + m_task_goal_lists[list_index].Min = entry.entry; + } + + if (entry.entry > m_task_goal_lists[list_index].Max) { + m_task_goal_lists[list_index].Max = entry.entry; + } + + m_task_goal_lists[list_index].GoalItemEntries.push_back(entry.entry); + + LogTasksDetail( + "Goal list index [{}] loading list [{}] entry [{}]", + list_index, + list_id, + entry.entry + ); + } + } + } + + return true; + +} + +int TaskGoalListManager::GetListByID(int list_id) +{ + + // Find the list with the specified ListID and return the index + auto it = std::find_if( + m_task_goal_lists.begin(), + m_task_goal_lists.end(), + [list_id](const TaskGoalList_Struct &t) { return t.ListID == list_id; } + ); + + if (it == m_task_goal_lists.end()) { + return -1; + } + + return std::distance(m_task_goal_lists.begin(), it); +} + +int TaskGoalListManager::GetFirstEntry(int list_id) +{ + int list_by_id = GetListByID(list_id); + + if ((list_by_id < 0) || (list_by_id >= m_goal_lists_count)) { + return -1; + } + + if (m_task_goal_lists[list_by_id].GoalItemEntries.empty()) { + return -1; + } + + return m_task_goal_lists[list_by_id].GoalItemEntries[0]; +} + +std::vector TaskGoalListManager::GetListContents(int list_index) +{ + std::vector list_contents; + int list_by_id = GetListByID(list_index); + + if ((list_by_id < 0) || (list_by_id >= m_goal_lists_count)) { + return list_contents; + } + + list_contents = m_task_goal_lists[list_by_id].GoalItemEntries; + + return list_contents; +} + +bool TaskGoalListManager::IsInList(int list_id, int entry) +{ + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", list_id, entry); + + int list_index = GetListByID(list_id); + + if ((list_index < 0) || (list_index >= m_goal_lists_count)) { + return false; + } + + if ((entry < m_task_goal_lists[list_index].Min) || (entry > m_task_goal_lists[list_index].Max)) { + return false; + } + + int first_entry = 0; + auto &task = m_task_goal_lists[list_index]; + auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), entry); + + if (it == task.GoalItemEntries.end()) { + return false; + } + + Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", list_index, entry); + + return true; +} diff --git a/zone/task_goal_list_manager.h b/zone/task_goal_list_manager.h new file mode 100644 index 000000000..11146f6e3 --- /dev/null +++ b/zone/task_goal_list_manager.h @@ -0,0 +1,37 @@ +#ifndef EQEMU_TASK_GOAL_LIST_MANAGER_H +#define EQEMU_TASK_GOAL_LIST_MANAGER_H + +#include "tasks.h" +#include "../common/types.h" +#include +#include +#include +#include + +struct TaskGoalList_Struct { + int ListID; + int Min, Max; + std::vector GoalItemEntries; +}; + +// This is used for handling lists, loading them from the database, searching them. +// Used for lists of NPCs to kill, items to loot, etc, as well as lists of items to +// reward the player with on completion of the task. +class TaskGoalListManager { + +public: + TaskGoalListManager(); + ~TaskGoalListManager(); + bool LoadLists(); + int GetListByID(int list_id); + bool IsInList(int list_id, int entry); + int GetFirstEntry(int list_id); + std::vector GetListContents(int list_index); + +private: + std::vector m_task_goal_lists; + int m_goal_lists_count; +}; + + +#endif //EQEMU_TASK_GOAL_LIST_MANAGER_H diff --git a/zone/task_manager.cpp b/zone/task_manager.cpp new file mode 100644 index 000000000..b16d95a4e --- /dev/null +++ b/zone/task_manager.cpp @@ -0,0 +1,1656 @@ +#include "../common/global_define.h" +#include "../common/misc_functions.h" +#include "../common/repositories/character_activities_repository.h" +#include "../common/repositories/character_tasks_repository.h" +#include "../common/repositories/completed_tasks_repository.h" +#include "../common/repositories/task_activities_repository.h" +#include "../common/repositories/tasks_repository.h" +#include "../common/repositories/tasksets_repository.h" +#include "client.h" +#include "string_ids.h" +#include "task_manager.h" + +TaskManager::TaskManager() +{ + for (auto &task : m_task_data) { + task = nullptr; + } +} + +TaskManager::~TaskManager() +{ + for (auto &task : m_task_data) { + if (task != nullptr) { + safe_delete(task); + } + } +} + +bool TaskManager::LoadTaskSets() +{ + // Clear all task sets in memory. Done so we can reload them on the fly if required by just calling + // this method again. + for (auto &task_set : m_task_sets) { + task_set.clear(); + } + + auto rows = TasksetsRepository::GetWhere( + content_db, + fmt::format( + "`id` > 0 AND `id` < {} AND `taskid` >= 0 AND `taskid` < {} ORDER BY `id`, `taskid` ASC", + MAXTASKSETS, + MAXTASKS + ) + ); + + for (auto &task_set: rows) { + m_task_sets[task_set.id].push_back(task_set.taskid); + LogTasksDetail("[LoadTaskSets] Adding task_id [{}] to task_set [{}]", task_set.taskid, task_set.id); + } + + return true; +} + +void TaskManager::ReloadGoalLists() +{ + if (!m_goal_list_manager.LoadLists()) { + Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); + } +} + +bool TaskManager::LoadTasks(int single_task) +{ + std::string task_query_filter = fmt::format("id = {}", single_task); + std::string query; + if (single_task == 0) { + if (!m_goal_list_manager.LoadLists()) { + LogTasks("[TaskManager::LoadTasks] LoadLists failed"); + } + + if (!LoadTaskSets()) { + LogTasks("[TaskManager::LoadTasks] LoadTaskSets failed"); + } + + task_query_filter = fmt::format("id < {}", MAXTASKS); + } + + // load task level data + auto repo_tasks = TasksRepository::GetWhere(content_db, task_query_filter); + + for (auto &task: repo_tasks) { + int task_id = task.id; + + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + // This shouldn't happen, as the SELECT is bounded by MAXTASKS + LogError("[TASKS]Task ID [{}] out of range while loading tasks from database", task_id); + continue; + } + + // load task data + m_task_data[task_id] = new TaskInformation; + m_task_data[task_id]->type = static_cast(task.type); + m_task_data[task_id]->duration = task.duration; + m_task_data[task_id]->duration_code = static_cast(task.duration_code); + m_task_data[task_id]->title = task.title; + m_task_data[task_id]->description = task.description; + m_task_data[task_id]->reward = task.reward; + m_task_data[task_id]->reward_id = task.rewardid; + m_task_data[task_id]->cash_reward = task.cashreward; + m_task_data[task_id]->experience_reward = task.xpreward; + m_task_data[task_id]->reward_method = (TaskMethodType) task.rewardmethod; + m_task_data[task_id]->faction_reward = task.faction_reward; + m_task_data[task_id]->min_level = task.minlevel; + m_task_data[task_id]->max_level = task.maxlevel; + m_task_data[task_id]->repeatable = task.repeatable; + m_task_data[task_id]->completion_emote = task.completion_emote; + m_task_data[task_id]->activity_count = 0; + m_task_data[task_id]->sequence_mode = ActivitiesSequential; + m_task_data[task_id]->last_step = 0; + + LogTasksDetail( + "[LoadTasks] (Task) task_id [{}] type [{}] duration [{}] duration_code [{}] title [{}] description [{}] " + " reward [{}] rewardid [{}] cashreward [{}] xpreward [{}] rewardmethod [{}] faction_reward [{}] minlevel [{}] " + " maxlevel [{}] repeatable [{}] completion_emote [{}] ", + task.id, + task.type, + task.duration, + task.duration_code, + task.title, + task.description, + task.reward, + task.rewardid, + task.cashreward, + task.xpreward, + task.rewardmethod, + task.faction_reward, + task.minlevel, + task.maxlevel, + task.repeatable, + task.completion_emote + ); + } + + LogTasks("Loaded [{}] Tasks", repo_tasks.size()); + + std::string activities_query_filter = fmt::format( + "taskid = {} and activityid < {} ORDER BY taskid, activityid ASC", + single_task, + MAXACTIVITIESPERTASK + ); + + // if loading only a single task + if (single_task == 0) { + activities_query_filter = fmt::format( + "taskid < {} and activityid < {} ORDER BY taskid, activityid ASC", + MAXTASKS, + MAXACTIVITIESPERTASK + ); + } + + // load activity data + auto task_activities = TaskActivitiesRepository::GetWhere(content_db, activities_query_filter); + for (auto &task_activity: task_activities) { + int task_id = task_activity.taskid; + int step = task_activity.step; + int activity_id = task_activity.activityid; + + if ((task_id <= 0) || (task_id >= MAXTASKS) || (activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { + + // This shouldn't happen, as the SELECT is bounded by MAXTASKS + LogTasks( + "[LoadTasks] Error: Task or activity_information ID ([{}], [{}]) out of range while loading activities from database", + task_id, + activity_id + ); + continue; + } + + if (m_task_data[task_id] == nullptr) { + LogTasks( + "[LoadTasks] Error: activity_information for non-existent task ([{}], [{}]) while loading activities from database", + task_id, + activity_id + ); + continue; + } + + // create pointer to activity data since declarations get unruly long + int activity_index = m_task_data[task_id]->activity_count; + ActivityInformation *activity_data = &m_task_data[task_id]->activity_information[activity_index]; + + m_task_data[task_id]->activity_information[m_task_data[task_id]->activity_count].step_number = step; + + if (step != 0) { + m_task_data[task_id]->sequence_mode = ActivitiesStepped; + } + + if (step > m_task_data[task_id]->last_step) { + m_task_data[task_id]->last_step = step; + } + + // Task Activities MUST be numbered sequentially from 0. If not, log an error + // and set the task to nullptr. Subsequent activities for this task will raise + // ERR_NOTASK errors. + // Change to (activityID != (Tasks[taskID]->activity_count + 1)) to index from 1 + if (activity_id != m_task_data[task_id]->activity_count) { + LogTasks( + "[LoadTasks] Error: Activities for Task [{}] (activity_id [{}]) are not sequential starting at 0. Not loading task ", + task_id, + activity_id + ); + m_task_data[task_id] = nullptr; + continue; + } + + // set activity data + activity_data->activity_type = task_activity.activitytype; + activity_data->target_name = task_activity.target_name; + activity_data->item_list = task_activity.item_list; + activity_data->skill_list = task_activity.skill_list; + activity_data->skill_id = std::stoi(task_activity.skill_list); // for older clients + activity_data->spell_list = task_activity.spell_list; + activity_data->spell_id = std::stoi(task_activity.spell_list); // for older clients + activity_data->description_override = task_activity.description_override; + activity_data->goal_id = task_activity.goalid; + activity_data->goal_method = (TaskMethodType) task_activity.goalmethod; + activity_data->goal_count = task_activity.goalcount; + activity_data->deliver_to_npc = task_activity.delivertonpc; + + // zones + activity_data->zones = task_activity.zones; + auto zones = SplitString( + task_activity.zones, + ';' + ); + + for (auto &&e : zones) { + activity_data->zone_ids.push_back(std::stoi(e)); + } + + activity_data->optional = task_activity.optional; + + LogTasksDetail( + "[LoadTasks] (Activity) task_id [{}] activity_id [{}] slot [{}] activity_type [{}] goal_id [{}] goal_method [{}] goal_count [{}] zones [{}]" + " target_name [{}] item_list [{}] skill_list [{}] spell_list [{}] description_override [{}]", + task_id, + activity_id, + m_task_data[task_id]->activity_count, + activity_data->activity_type, + activity_data->goal_id, + activity_data->goal_method, + activity_data->goal_count, + activity_data->zones.c_str(), + activity_data->target_name.c_str(), + activity_data->item_list.c_str(), + activity_data->skill_list.c_str(), + activity_data->spell_list.c_str(), + activity_data->description_override.c_str() + ); + + m_task_data[task_id]->activity_count++; + } + + LogTasks("Loaded [{}] Task Activities", task_activities.size()); + + return true; +} + +bool TaskManager::SaveClientState(Client *client, ClientTaskState *client_task_state) +{ + // I am saving the slot in the ActiveTasks table, because unless a Task is cancelled/completed, the client + // doesn't seem to like tasks moving slots between zoning and you can end up with 'bogus' activities if the task + // previously in that slot had more activities than the one now occupying it. Hopefully retaining the slot + // number for the duration of a session will overcome this. + if (!client || !client_task_state) { + return false; + } + + const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; + + int character_id = client->CharacterID(); + + LogTasks("[SaveClientState] character_id [{}]", character_id); + + if (client_task_state->m_active_task_count > 0 || + client_task_state->m_active_task.task_id != TASKSLOTEMPTY) { // TODO: tasks + for (auto &active_task : client_task_state->m_active_tasks) { + int task_id = active_task.task_id; + if (task_id == TASKSLOTEMPTY) { + continue; + } + + int slot = active_task.slot; + if (active_task.updated) { + + LogTasks( + "[SaveClientState] character_id [{}] updating task_index [{}] task_id [{}]", + character_id, + slot, + task_id + ); + + std::string query = StringFormat( + "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " + "VALUES (%i, %i, %i, %i, %i)", + character_id, + task_id, + slot, + static_cast(m_task_data[task_id]->type), + active_task.accepted_time + ); + + auto results = database.QueryDatabase(query); + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + } + else { + active_task.updated = false; + } + } + + std::string query = + "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " + "VALUES "; + + int updated_activity_count = 0; + + for (int activity_index = 0; activity_index < m_task_data[task_id]->activity_count; ++activity_index) { + if (!active_task.activity[activity_index].updated) { + continue; + } + + LogTasks( + "[SaveClientState] Updating activity character_id [{}] updating task_index [{}] task_id [{}] activity_index [{}]", + character_id, + slot, + task_id, + activity_index + ); + + if (updated_activity_count == 0) { + query += + StringFormat( + "(%i, %i, %i, %i, %i)", character_id, task_id, activity_index, + active_task.activity[activity_index].done_count, + active_task.activity[activity_index].activity_state == + ActivityCompleted + ); + } + else { + query += + StringFormat( + ", (%i, %i, %i, %i, %i)", character_id, task_id, activity_index, + active_task.activity[activity_index].done_count, + active_task.activity[activity_index].activity_state == + ActivityCompleted + ); + } + + updated_activity_count++; + } + + if (updated_activity_count == 0) { + continue; + } + + auto results = database.QueryDatabase(query); + + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + continue; + } + + active_task.updated = false; + for (int activity_index = 0; + activity_index < m_task_data[task_id]->activity_count; + ++activity_index) + active_task.activity[activity_index].updated = false; + } + } + + if (!RuleB(TaskSystem, RecordCompletedTasks) || + (client_task_state->m_completed_tasks.size() <= (unsigned int) client_task_state->m_last_completed_task_loaded)) { + client_task_state->m_last_completed_task_loaded = client_task_state->m_completed_tasks.size(); + return true; + } + + const char *completed_task_query = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " + "VALUES (%i, %i, %i, %i)"; + + for (unsigned int task_index = client_task_state->m_last_completed_task_loaded; + task_index < client_task_state->m_completed_tasks.size(); + task_index++) { + + int task_id = client_task_state->m_completed_tasks[task_index].task_id; + + if ((task_id <= 0) || (task_id >= MAXTASKS) || (m_task_data[task_id] == nullptr)) { + continue; + } + + // First we save a record with an activity_id of -1. + // This indicates this task was completed at the given time. We infer that all + // none optional activities were completed. + // + std::string query = StringFormat( + completed_task_query, + character_id, + client_task_state->m_completed_tasks[task_index].completed_time, + task_id, + -1 + ); + + auto results = database.QueryDatabase(query); + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + continue; + } + + // If the Rule to record non-optional task completion is not enabled, don't save it + if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) { + continue; + } + + // Insert one record for each completed optional task. + for (int activity_id = 0; activity_id < m_task_data[task_id]->activity_count; activity_id++) { + if (!m_task_data[task_id]->activity_information[activity_id].optional || + !client_task_state->m_completed_tasks[task_index].activity_done[activity_id]) { + continue; + } + + query = StringFormat( + completed_task_query, + character_id, + client_task_state->m_completed_tasks[task_index].completed_time, + task_id, activity_id + ); + + results = database.QueryDatabase(query); + if (!results.Success()) { + LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); + } + } + } + + client_task_state->m_last_completed_task_loaded = client_task_state->m_completed_tasks.size(); + return true; +} + +int TaskManager::FirstTaskInSet(int task_set) +{ + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } + + if (m_task_sets[task_set].empty()) { + return 0; + } + + auto iterator = m_task_sets[task_set].begin(); + while (iterator != m_task_sets[task_set].end()) { + if ((*iterator) > 0) { + return (*iterator); + } + ++iterator; + } + + return 0; +} + +int TaskManager::LastTaskInSet(int task_set) +{ + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } + + if (m_task_sets[task_set].empty()) { + return 0; + } + + return m_task_sets[task_set][m_task_sets[task_set].size() - 1]; +} + +int TaskManager::NextTaskInSet(int task_set, int task_id) +{ + if ((task_set <= 0) || (task_set >= MAXTASKSETS)) { + return 0; + } + + if (m_task_sets[task_set].empty()) { + return 0; + } + + for (int i : m_task_sets[task_set]) { + if (i > task_id) { + return i; + } + } + + return 0; +} + +bool TaskManager::ValidateLevel(int task_id, int player_level) +{ + if (m_task_data[task_id] == nullptr) { + return false; + } + + if (m_task_data[task_id]->min_level && (player_level < m_task_data[task_id]->min_level)) { + return false; + } + + if (m_task_data[task_id]->max_level && (player_level > m_task_data[task_id]->max_level)) { + return false; + } + + return true; +} + +std::string TaskManager::GetTaskName(uint32 task_id) +{ + if (task_id > 0 && task_id < MAXTASKS) { + if (m_task_data[task_id] != nullptr) { + return m_task_data[task_id]->title; + } + } + + return std::string(); +} + +TaskType TaskManager::GetTaskType(uint32 task_id) +{ + if (task_id > 0 && task_id < MAXTASKS) { + if (m_task_data[task_id] != nullptr) { + return m_task_data[task_id]->type; + } + } + return TaskType::Task; +} + +void TaskManager::TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id) +{ + int task_list[MAXCHOOSERENTRIES]; + int task_list_index = 0; + int player_level = client->GetLevel(); + + LogTasks( + "TaskSetSelector called for task_set_id [{}] EnableTaskSize is [{}]", + task_set_id, + client_task_state->m_enabled_tasks.size() + ); + + if (task_set_id <= 0 || task_set_id >= MAXTASKSETS) { + return; + } + + if (m_task_sets[task_set_id].empty()) { + // I think this is suppose to be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName() + ); + return; + } + + bool all_enabled = false; + + // A task_id of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. + if (m_task_sets[task_set_id][0] == 0) { + LogTasks("[TaskSetSelector] TaskSets[{}][0] == 0. All Tasks in Set enabled.", task_set_id); + all_enabled = true; + } + + auto iterator = m_task_sets[task_set_id].begin(); + if (all_enabled) { + ++iterator; + } // skip first when all enabled since it's useless data + + while (iterator != m_task_sets[task_set_id].end() && task_list_index < MAXCHOOSERENTRIES) { + auto task = *iterator; + // verify level, we're not currently on it, repeatable status, if it's a (shared) task + // we aren't currently on another, and if it's enabled if not all_enabled + if ((all_enabled || client_task_state->IsTaskEnabled(task)) && ValidateLevel(task, player_level) && + !client_task_state->IsTaskActive(task) && client_task_state->HasSlotForTask(m_task_data[task]) && + // this slot checking is a bit silly, but we allow mixing of task types ... + (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { + task_list[task_list_index++] = task; + } + + ++iterator; + } + + if (task_list_index > 0) { + SendTaskSelector(client, mob, task_list_index, task_list); + } + else { + // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName() + ); + } +} + +// unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle +// we do however still want it to check the other stuff like level, active, room, etc +void TaskManager::TaskQuestSetSelector( + Client *client, + ClientTaskState *client_task_state, + Mob *mob, + int count, + int *tasks +) +{ + int task_list[MAXCHOOSERENTRIES]; + int task_list_index = 0; + int player_level = client->GetLevel(); + + LogTasks("[UPDATE] TaskQuestSetSelector called for array size [{}]", count); + + if (count <= 0) { + return; + } + + for (int i = 0; i < count; ++i) { + auto task = tasks[i]; + // verify level, we're not currently on it, repeatable status, if it's a (shared) task + // we aren't currently on another, and if it's enabled if not all_enabled + if (ValidateLevel(task, player_level) && !client_task_state->IsTaskActive(task) && + client_task_state->HasSlotForTask(m_task_data[task]) && + // this slot checking is a bit silly, but we allow mixing of task types ... + (IsTaskRepeatable(task) || !client_task_state->IsTaskCompleted(task))) { + task_list[task_list_index++] = task; + } + } + + if (task_list_index > 0) { + SendTaskSelector(client, mob, task_list_index, task_list); + } + else { + // TODO: check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow + mob->SayString( + client, + Chat::Yellow, + MAX_ACTIVE_TASKS, + client->GetName() + ); + } +} + +// sends task selector to client +void TaskManager::SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list) +{ + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { + SendTaskSelectorNew(client, mob, task_count, task_list); + return; + } + // Titanium OpCode: 0x5e7c + LogTasks("TaskSelector for [{}] Tasks", task_count); + int player_level = client->GetLevel(); + + // Check if any of the tasks exist + for (int i = 0; i < task_count; i++) { + if (m_task_data[task_list[i]] != nullptr) { + break; + } + } + + int valid_task_count = 0; + + for (int i = 0; i < task_count; i++) { + if (!ValidateLevel(task_list[i], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[i])) { + continue; + } + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { + continue; + } + + valid_task_count++; + } + + if (valid_task_count == 0) { + return; + } + + SerializeBuffer buf(50 * valid_task_count); + + buf.WriteUInt32(valid_task_count); + buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do? + buf.WriteUInt32(mob->GetID()); + + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[task_index])) { + continue; + } + if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { + continue; + } + + buf.WriteUInt32(task_list[task_index]); // task_id + + // affects color, difficulty? + if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + buf.WriteFloat(1.0f); + } + buf.WriteUInt32(m_task_data[task_list[task_index]]->duration); + buf.WriteUInt32(static_cast(m_task_data[task_list[task_index]]->duration_code)); + + buf.WriteString(m_task_data[task_list[task_index]]->title); // max 64 with null + buf.WriteString(m_task_data[task_list[task_index]]->description); // max 4000 with null + + // Has reward set flag + if (client->ClientVersion() != EQ::versions::ClientVersion::Titanium) { + buf.WriteUInt8(0); + } + + buf.WriteUInt32(m_task_data[task_list[task_index]]->activity_count); + + for (int activity_index = 0; + activity_index < m_task_data[task_list[task_index]]->activity_count; + ++activity_index) { + buf.WriteUInt32(activity_index); // ActivityNumber + auto &activity = m_task_data[task_list[task_index]]->activity_information[activity_index]; + buf.WriteUInt32(activity.activity_type); + buf.WriteUInt32(0); // solo, group, raid? + buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) + buf.WriteString(activity.item_list); // max length 64 in these clients + buf.WriteUInt32(activity.goal_count); + buf.WriteInt32(activity.skill_id); + buf.WriteInt32(activity.spell_id); + buf.WriteInt32(activity.zone_ids.empty() ? 0 : activity.zone_ids.front()); + buf.WriteString(activity.description_override); + } + } + + auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +void TaskManager::SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list) +{ + LogTasks("SendTaskSelectorNew for [{}] Tasks", task_count); + + int player_level = client->GetLevel(); + + // Check if any of the tasks exist + for (int i = 0; i < task_count; i++) { + if (m_task_data[task_list[i]] != nullptr) { + break; + } + } + + int valid_tasks_count = 0; + for (int task_index = 0; task_index < task_count; task_index++) { + if (!ValidateLevel(task_list[task_index], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[task_index])) { + continue; + } + if (!IsTaskRepeatable(task_list[task_index]) && client->IsTaskCompleted(task_list[task_index])) { + continue; + } + + valid_tasks_count++; + } + + if (valid_tasks_count == 0) { + return; + } + + SerializeBuffer buf(50 * valid_tasks_count); + + buf.WriteUInt32(valid_tasks_count); // TaskCount + buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P + // so I guess an NPC can only offer one type of quests or we can only open a selection with one type :P (so quest call can tell us I guess) + // this is also sent in OP_TaskDescription + buf.WriteUInt32(mob->GetID()); // TaskGiver + + for (int i = 0; i < task_count; i++) { // max 40 + if (!ValidateLevel(task_list[i], player_level)) { + continue; + } + if (client->IsTaskActive(task_list[i])) { + continue; + } + if (!IsTaskRepeatable(task_list[i]) && client->IsTaskCompleted(task_list[i])) { + continue; + } + + buf.WriteUInt32(task_list[i]); // task_id + buf.WriteFloat(1.0f); // affects color, difficulty? + buf.WriteUInt32(m_task_data[task_list[i]]->duration); + buf.WriteUInt32(static_cast(m_task_data[task_list[i]]->duration_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited + + buf.WriteString(m_task_data[task_list[i]]->title); // max 64 with null + buf.WriteString(m_task_data[task_list[i]]->description); // max 4000 with null + + buf.WriteUInt8(0); // Has reward set flag + buf.WriteUInt32(m_task_data[task_list[i]]->activity_count); // activity_count + + for (int j = 0; j < m_task_data[task_list[i]]->activity_count; ++j) { + buf.WriteUInt32(j); // ActivityNumber + auto &activity = m_task_data[task_list[i]]->activity_information[j]; + buf.WriteUInt32(activity.activity_type); // ActivityType + buf.WriteUInt32(0); // solo, group, raid? + buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) + + // this string is item names + buf.WriteLengthString(activity.item_list); + + buf.WriteUInt32(activity.goal_count); // GoalCount + + // this string is skill IDs? probably one of the "use on" tasks + buf.WriteLengthString(activity.skill_list); + + // this string is spell IDs? probably one of the "use on" tasks + buf.WriteLengthString(activity.spell_list); + + //buf.WriteString(itoa(Tasks[TaskList[i]]->activity_information[activity_id].ZoneID)); + buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; + buf.WriteString(activity.description_override); // max length 128 -- overrides the automatic descriptions + // this doesn't appear to be shown to the client at all and isn't the same as zones ... defaults to '0' though + buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used + } + } + + auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +int TaskManager::GetActivityCount(int task_id) +{ + if ((task_id > 0) && (task_id < MAXTASKS)) { + if (m_task_data[task_id]) { return m_task_data[task_id]->activity_count; } + } + + return 0; +} + +void TaskManager::ExplainTask(Client *client, int task_id) +{ + + // TODO: This method is not finished (hardly started). It was intended to + // explain in English, what each activity_information did, conditions for step unlocking, etc. + // + return; + + if (!client) { return; } + + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + client->Message(Chat::White, "task_id out-of-range."); + return; + } + + if (m_task_data[task_id] == nullptr) { + client->Message(Chat::White, "Task does not exist."); + return; + } + + char explanation[1000], *ptr; + client->Message(Chat::White, "Task %4i: title: %s", task_id, m_task_data[task_id]->description.c_str()); + client->Message(Chat::White, "%3i Activities", m_task_data[task_id]->activity_count); + ptr = explanation; + for (int i = 0; i < m_task_data[task_id]->activity_count; i++) { + + sprintf(ptr, "Act: %3i: ", i); + ptr = ptr + strlen(ptr); + switch (m_task_data[task_id]->activity_information[i].activity_type) { + case ActivityDeliver: + sprintf(ptr, "Deliver"); + break; + } + + } +} + +bool TaskManager::IsTaskRepeatable(int task_id) +{ + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + return false; + } + + TaskInformation *task_data = task_manager->m_task_data[task_id]; + if (task_data == nullptr) { + return false; + } + + return task_data->repeatable; +} + +void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state) +{ + int packet_length = 4; + + //vector::const_iterator iterator; + // The client only display the first 50 Completed Tasks send, so send the 50 most recent + int first_task_to_send = 0; + int last_task_to_send = client_task_state->m_completed_tasks.size(); + + if (client_task_state->m_completed_tasks.size() > 50) { + first_task_to_send = client_task_state->m_completed_tasks.size() - 50; + } + + LogTasks( + "[SendCompletedTasksToClient] completed task count [{}] first tank to send is [{}] last is [{}]", + client_task_state->m_completed_tasks.size(), + first_task_to_send, + last_task_to_send + ); + + /* + for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { + int task_id = (*iterator).task_id; + if(Tasks[task_id] == nullptr) continue; + PacketLength = PacketLength + 8 + strlen(Tasks[task_id]->title) + 1; + } + */ + for (int i = first_task_to_send; i < last_task_to_send; i++) { + int TaskID = client_task_state->m_completed_tasks[i].task_id; + if (m_task_data[TaskID] == nullptr) { continue; } + packet_length = packet_length + 8 + m_task_data[TaskID]->title.size() + 1; + } + + auto outapp = new EQApplicationPacket(OP_CompletedTasks, packet_length); + char *buf = (char *) outapp->pBuffer; + + //*(uint32 *)buf = activity_state->CompletedTasks.size(); + *(uint32 *) buf = last_task_to_send - first_task_to_send; + buf = buf + 4; + //for(iterator=activity_state->CompletedTasks.begin(); iterator!=activity_state->CompletedTasks.end(); iterator++) { + // int task_id = (*iterator).task_id; + for (int i = first_task_to_send; i < last_task_to_send; i++) { + int task_id = client_task_state->m_completed_tasks[i].task_id; + if (m_task_data[task_id] == nullptr) { continue; } + *(uint32 *) buf = task_id; + buf = buf + 4; + + sprintf(buf, "%s", m_task_data[task_id]->title.c_str()); + buf = buf + strlen(buf) + 1; + //*(uint32 *)buf = (*iterator).CompletedTime; + *(uint32 *) buf = client_task_state->m_completed_tasks[i].completed_time; + buf = buf + 4; + } + + c->QueuePacket(outapp); + safe_delete(outapp); +} + +void TaskManager::SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index) +{ + // This activity_information Packet is sent for activities that have not yet been unlocked and appear as ??? + // in the client. + + TaskActivityShort_Struct *task_activity_short; + if (client->ClientVersionBit() & EQ::versions::maskRoFAndLater) { + auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); + outapp->WriteUInt32(client_task_index); + outapp->WriteUInt32(static_cast(m_task_data[task_id]->type)); + outapp->WriteUInt32(task_id); + outapp->WriteUInt32(activity_id); + outapp->WriteUInt32(0); + outapp->WriteUInt32(0xffffffff); + outapp->WriteUInt8(0); + client->FastQueuePacket(&outapp); + + return; + } + + auto outapp = new EQApplicationPacket(OP_TaskActivity, sizeof(TaskActivityShort_Struct)); + + task_activity_short = (TaskActivityShort_Struct *) outapp->pBuffer; + task_activity_short->TaskSequenceNumber = client_task_index; + task_activity_short->unknown2 = static_cast(m_task_data[task_id]->type); + task_activity_short->TaskID = task_id; + task_activity_short->ActivityID = activity_id; + task_activity_short->unknown3 = 0x000000; + task_activity_short->ActivityType = 0xffffffff; + task_activity_short->unknown4 = 0x00000000; + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +void TaskManager::SendTaskActivityLong( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete +) +{ + + if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) { + SendTaskActivityNew(client, task_id, activity_id, client_task_index, optional, task_complete); + return; + } + + SerializeBuffer buf(100); + + buf.WriteUInt32(client_task_index); + buf.WriteUInt32(static_cast(m_task_data[task_id]->type)); + buf.WriteUInt32(task_id); + buf.WriteUInt32(activity_id); + buf.WriteUInt32(0); // unknown3 + + // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes + // no difference to the client. All activity_information updates will be done based on our interal activity_information types. + if ((m_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + m_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].activity_type); + } + else { + buf.WriteUInt32(ActivityCastOn); + } // w/e! + + buf.WriteUInt32(optional); + buf.WriteUInt32(0); // solo, group, raid + + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].target_name); // target name string + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].item_list); // item name list + + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].goal_count); + } + else { + // For our internal type GiveCash, where the goal count has the amount of cash that must be given, + // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just + // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity_information is complete, 0 otherwise. + // The text3 field should decribe the exact activity_information goal, e.g. give 3500gp to Hasten Bootstrutter. + buf.WriteUInt32(1); + } + + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].skill_id); + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].spell_id); + buf.WriteUInt32( + m_task_data[task_id]->activity_information[activity_id].zone_ids.empty() ? 0 + : m_task_data[task_id]->activity_information[activity_id].zone_ids.front()); + buf.WriteUInt32(0); + + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].description_override); + + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(client->GetTaskActivityDoneCount(m_task_data[task_id]->type, client_task_index, activity_id)); + } + else { + // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. + buf.WriteUInt32((client->GetTaskActivityDoneCount(m_task_data[task_id]->type, client_task_index, activity_id) >= + m_task_data[task_id]->activity_information[activity_id].goal_count)); + } + + buf.WriteUInt32(1); // unknown + + auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); + +} + +// Used only by RoF+ Clients +void TaskManager::SendTaskActivityNew( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete +) +{ + SerializeBuffer buf(100); + + buf.WriteUInt32(client_task_index); // TaskSequenceNumber + buf.WriteUInt32(static_cast(m_task_data[task_id]->type)); // task type + buf.WriteUInt32(task_id); + buf.WriteUInt32(activity_id); + buf.WriteUInt32(0); // unknown3 + + // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity_information description, so it makes + // no difference to the client. All activity_information updates will be done based on our interal activity_information types. + if ((m_task_data[task_id]->activity_information[activity_id].activity_type > 0) && + m_task_data[task_id]->activity_information[activity_id].activity_type < 100) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].activity_type); + } + else { + buf.WriteUInt32(ActivityCastOn); + } // w/e! + + buf.WriteUInt8(optional); + buf.WriteUInt32(0); // solo, group, raid + + // One of these unknown fields maybe related to the 'Use On' activity_information types + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].target_name); // target name string + + buf.WriteLengthString(m_task_data[task_id]->activity_information[activity_id].item_list); // item name list + + // Goal Count + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32(m_task_data[task_id]->activity_information[activity_id].goal_count); + } + else { + buf.WriteUInt32(1); + } // GoalCount + + // skill ID list ; separated + buf.WriteLengthString(m_task_data[task_id]->activity_information[activity_id].skill_list); + + // spelll ID list ; separated -- unsure wtf we're doing here + buf.WriteLengthString(m_task_data[task_id]->activity_information[activity_id].spell_list); + + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].zones); + buf.WriteUInt32(0); // unknown7 + + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].description_override); // description override + + if (m_task_data[task_id]->activity_information[activity_id].activity_type != ActivityGiveCash) { + buf.WriteUInt32( + client->GetTaskActivityDoneCount( + m_task_data[task_id]->type, + client_task_index, + activity_id + )); // done_count + } + else { + // For internal activity_information types, done_count is either 1 if the activity_information is complete, 0 otherwise. + buf.WriteUInt32((client->GetTaskActivityDoneCount(m_task_data[task_id]->type, client_task_index, activity_id) >= + m_task_data[task_id]->activity_information[activity_id].goal_count)); + } + + buf.WriteUInt8(1); // unknown9 + + buf.WriteString(m_task_data[task_id]->activity_information[activity_id].zones); + + auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); + + client->QueuePacket(outapp); + safe_delete(outapp); + +} + +void TaskManager::SendActiveTasksToClient(Client *client, bool task_complete) +{ + auto state = client->GetTaskState(); + if (!state) { + return; + } + + for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { + int task_id = state->m_active_tasks[task_index].task_id; + if ((task_id == 0) || (m_task_data[task_id] == 0)) { + continue; + } + int start_time = state->m_active_tasks[task_index].accepted_time; + + SendActiveTaskDescription( + client, task_id, state->m_active_tasks[task_index], start_time, m_task_data[task_id]->duration, + false + ); + LogTasks("[SendActiveTasksToClient] task_id [{}] activity_count [{}]", task_id, GetActivityCount(task_id)); + + int sequence = 0; + int fixed_index = m_task_data[task_id]->type == TaskType::Task ? 0 : task_index - 1; // hmmm fuck + for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { + if (client->GetTaskActivityState(m_task_data[task_id]->type, fixed_index, activity_id) != ActivityHidden) { + LogTasks( + "[SendActiveTasksToClient] (Long Update) task_id [{}] activity_id [{}] fixed_index [{}] task_complete [{}]", + task_id, + activity_id, + fixed_index, + task_complete ? "true" : "false" + ); + + if (activity_id == GetActivityCount(task_id) - 1) { + SendTaskActivityLong( + client, + task_id, + activity_id, + fixed_index, + m_task_data[task_id]->activity_information[activity_id].optional, + task_complete + ); + } + else { + SendTaskActivityLong( + client, + task_id, + activity_id, + fixed_index, + m_task_data[task_id]->activity_information[activity_id].optional, + 0 + ); + } + } + else { + LogTasks( + "[SendActiveTasksToClient] (Short Update) task_id [{}] activity_id [{}] fixed_index [{}]", + task_id, + activity_id, + fixed_index + ); + + SendTaskActivityShort(client, task_id, activity_id, fixed_index); + } + sequence++; + } + } +} + +void TaskManager::SendSingleActiveTaskToClient( + Client *client, ClientTaskInformation &task_info, bool task_complete, + bool bring_up_task_journal +) +{ + int task_id = task_info.task_id; + if (task_id == 0 || m_task_data[task_id] == nullptr) { + return; + } + + int start_time = task_info.accepted_time; + SendActiveTaskDescription( + client, + task_id, + task_info, + start_time, + m_task_data[task_id]->duration, + bring_up_task_journal + ); + Log(Logs::General, + Logs::Tasks, + "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", + task_id, + GetActivityCount(task_id)); + + for (int activity_id = 0; activity_id < GetActivityCount(task_id); activity_id++) { + if (task_info.activity[activity_id].activity_state != ActivityHidden) { + LogTasks("[SendSingleActiveTaskToClient] Long [{}] [{}] complete [{}]", + task_id, + activity_id, + task_complete); + if (activity_id == GetActivityCount(task_id) - 1) { + SendTaskActivityLong( + client, task_id, activity_id, task_info.slot, + m_task_data[task_id]->activity_information[activity_id].optional, task_complete + ); + } + else { + SendTaskActivityLong( + client, task_id, activity_id, task_info.slot, + m_task_data[task_id]->activity_information[activity_id].optional, 0 + ); + } + } + else { + LogTasks("[SendSingleActiveTaskToClient] Short [{}] [{}]", task_id, activity_id); + SendTaskActivityShort(client, task_id, activity_id, task_info.slot); + } + } +} + +void TaskManager::SendActiveTaskDescription( + Client *client, + int task_id, + ClientTaskInformation &task_info, + int start_time, + int duration, + bool bring_up_task_journal +) +{ + if ((task_id < 1) || (task_id >= MAXTASKS) || !m_task_data[task_id]) { + return; + } + + int packet_length = sizeof(TaskDescriptionHeader_Struct) + m_task_data[task_id]->title.length() + 1 + + sizeof(TaskDescriptionData1_Struct) + m_task_data[task_id]->description.length() + 1 + + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); + + // If there is an item make the reward text into a link to the item (only the first item if a list + // is specified). I have been unable to get multiple item links to work. + // + if (m_task_data[task_id]->reward_id && m_task_data[task_id]->item_link.empty()) { + int item_id = 0; + // If the reward is a list of items, and the first entry on the list is valid + if (m_task_data[task_id]->reward_method == METHODSINGLEID) { + item_id = m_task_data[task_id]->reward_id; + } + else if (m_task_data[task_id]->reward_method == METHODLIST) { + item_id = m_goal_list_manager.GetFirstEntry(m_task_data[task_id]->reward_id); + if (item_id < 0) { + item_id = 0; + } + } + + if (item_id) { + const EQ::ItemData *reward_item = database.GetItem(item_id); + + EQ::SayLinkEngine linker; + linker.SetLinkType(EQ::saylink::SayLinkItemData); + linker.SetItemData(reward_item); + linker.SetTaskUse(); + m_task_data[task_id]->item_link = linker.GenerateLink(); + } + } + + packet_length += m_task_data[task_id]->reward.length() + 1 + m_task_data[task_id]->item_link.length() + 1; + + char *Ptr; + TaskDescriptionHeader_Struct *task_description_header; + TaskDescriptionData1_Struct *tdd1; + TaskDescriptionData2_Struct *tdd2; + TaskDescriptionTrailer_Struct *tdt; + + auto outapp = new EQApplicationPacket(OP_TaskDescription, packet_length); + + task_description_header = (TaskDescriptionHeader_Struct *) outapp->pBuffer; + + task_description_header->SequenceNumber = task_info.slot; + task_description_header->TaskID = task_id; + task_description_header->open_window = bring_up_task_journal; + task_description_header->task_type = static_cast(m_task_data[task_id]->type); + task_description_header->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task + + Ptr = (char *) task_description_header + sizeof(TaskDescriptionHeader_Struct); + + sprintf(Ptr, "%s", m_task_data[task_id]->title.c_str()); + Ptr += m_task_data[task_id]->title.length() + 1; + + tdd1 = (TaskDescriptionData1_Struct *) Ptr; + + tdd1->Duration = duration; + tdd1->dur_code = static_cast(m_task_data[task_id]->duration_code); + + tdd1->StartTime = start_time; + + Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); + + sprintf(Ptr, "%s", m_task_data[task_id]->description.c_str()); + Ptr += m_task_data[task_id]->description.length() + 1; + + tdd2 = (TaskDescriptionData2_Struct *) Ptr; + + // we have this reward stuff! + // if we ever don't hardcode this, TaskDescriptionTrailer_Struct will need to be fixed since + // "has_reward_selection" is after this bool! Smaller packet when this is 0 + tdd2->has_rewards = 1; + + tdd2->coin_reward = m_task_data[task_id]->cash_reward; + tdd2->xp_reward = m_task_data[task_id]->experience_reward ? 1 : 0; // just booled + tdd2->faction_reward = m_task_data[task_id]->faction_reward ? 1 : 0; // faction booled + + Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); + + // we actually have 2 strings here. One is max length 96 and not parsed for item links + // We actually skipped past that string incorrectly before, so TODO: fix item link string + sprintf(Ptr, "%s", m_task_data[task_id]->reward.c_str()); + Ptr += m_task_data[task_id]->reward.length() + 1; + + // second string is parsed for item links + sprintf(Ptr, "%s", m_task_data[task_id]->item_link.c_str()); + Ptr += m_task_data[task_id]->item_link.length() + 1; + + tdt = (TaskDescriptionTrailer_Struct *) Ptr; + tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... + tdt->has_reward_selection = 0; // TODO: new rewards window + + client->QueuePacket(outapp); + safe_delete(outapp); +} + +bool TaskManager::LoadClientState(Client *client, ClientTaskState *client_task_state) +{ + if (!client || !client_task_state) { + return false; + } + + int character_id = client->CharacterID(); + + client_task_state->m_active_task_count = 0; + + LogTasks("[LoadClientState] for character_id [{}]", character_id); + + auto character_tasks = CharacterTasksRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY acceptedtime", character_id) + ); + + for (auto &character_task: character_tasks) { + int task_id = character_task.taskid; + int slot = character_task.slot; + auto type = static_cast(character_task.type); + + if ((task_id < 0) || (task_id >= MAXTASKS)) { + LogTasks( + "[LoadClientState] Error: task_id [{}] out of range while loading character tasks from database", + task_id + ); + continue; + } + + // client data bucket pointer + auto task_info = client_task_state->GetClientTaskInfo(type, slot); + if (task_info == nullptr) { + LogTasks( + "[LoadClientState] Error: slot [{}] out of range while loading character tasks from database", + slot + ); + continue; + } + + if (task_info->task_id != TASKSLOTEMPTY) { + LogTasks("[LoadClientState] Error: slot [{}] for task [{}] is already occupied", slot, task_id); + continue; + } + + task_info->task_id = task_id; + task_info->current_step = -1; + task_info->accepted_time = character_task.acceptedtime; + task_info->updated = false; + + for (auto &i : task_info->activity) { + i.activity_id = -1; + } + + if (type == TaskType::Quest) { + ++client_task_state->m_active_task_count; + } + + LogTasks( + "[LoadClientState] character_id [{}] task_id [{}] accepted_time [{}]", + character_id, + task_id, + character_task.acceptedtime + ); + } + + // Load Activities + LogTasks("[LoadClientState] Loading activities for character_id [{}]", character_id); + + auto character_activities = CharacterActivitiesRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY `taskid` ASC, `activityid` ASC", character_id) + ); + + for (auto &character_activity: character_activities) { + int task_id = character_activity.taskid; + if ((task_id < 0) || (task_id >= MAXTASKS)) { + LogTasks( + "[LoadClientState] Error: task_id [{}] out of range while loading character activities from database character_id [{}]", + task_id, + character_id + ); + continue; + } + + int activity_id = character_activity.activityid; + if ((activity_id < 0) || (activity_id >= MAXACTIVITIESPERTASK)) { + LogTasks( + "[LoadClientState] Error: activity_id [{}] out of range while loading character activities from database character_id [{}]", + activity_id, + character_id + ); + + continue; + } + + ClientTaskInformation *task_info = nullptr; + if (client_task_state->m_active_task.task_id == task_id) { + task_info = &client_task_state->m_active_task; + } + + // wasn't task + if (task_info == nullptr) { + for (auto &active_quest : client_task_state->m_active_quests) { + if (active_quest.task_id == task_id) { + task_info = &active_quest; + } + } + } + + if (task_info == nullptr) { + LogTasks( + "[LoadClientState] Error: activity_id [{}] found for task_id [{}] which client does not have character_id [{}]", + activity_id, + task_id, + character_id + ); + + continue; + } + + task_info->activity[activity_id].activity_id = activity_id; + task_info->activity[activity_id].done_count = character_activity.donecount; + if (character_activity.completed) { + task_info->activity[activity_id].activity_state = ActivityCompleted; + } + else { + task_info->activity[activity_id].activity_state = ActivityHidden; + } + + task_info->activity[activity_id].updated = false; + + LogTasks( + "[LoadClientState] character_id [{}] task_id [{}] activity_id [{}] done_count [{}] completed [{}]", + character_id, + task_id, + activity_id, + character_activity.donecount, + character_activity.completed + ); + } + + if (RuleB(TaskSystem, RecordCompletedTasks)) { + CompletedTaskInformation completed_task_information{}; + + for (bool &i : completed_task_information.activity_done) { + i = false; + } + + int previous_task_id = -1; + int previous_completed_time = -1; + + auto character_completed_tasks = CompletedTasksRepository::GetWhere( + database, + fmt::format("charid = {} ORDER BY completedtime, taskid, activityid", character_id) + ); + + for (auto &character_completed_task: character_completed_tasks) { + int task_id = character_completed_task.taskid; + if ((task_id <= 0) || (task_id >= MAXTASKS)) { + LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", task_id); + continue; + } + + // An activity_id of -1 means mark all the none optional activities in the + // task as complete. If the Rule to record optional activities is enabled, + // subsequent records for this task will flag any optional tasks that were + // completed. + int activity_id = character_completed_task.activityid; + if ((activity_id < -1) || (activity_id >= MAXACTIVITIESPERTASK)) { + LogError("[TASKS]activity_information ID [{}] out of range while loading completed tasks from database", + activity_id); + continue; + } + + int completed_time = character_completed_task.completedtime; + if ((previous_task_id != -1) && + ((task_id != previous_task_id) || (completed_time != previous_completed_time))) { + client_task_state->m_completed_tasks.push_back(completed_task_information); + for (bool &activity_done : completed_task_information.activity_done) { + activity_done = false; + } + } + + completed_task_information.task_id = previous_task_id = task_id; + completed_task_information.completed_time = previous_completed_time = completed_time; + + // If activity_id is -1, Mark all the non-optional tasks as completed. + if (activity_id < 0) { + TaskInformation *task = m_task_data[task_id]; + if (task == nullptr) { + continue; + } + + for (int i = 0; i < task->activity_count; i++) { + if (!task->activity_information[i].optional) { + completed_task_information.activity_done[i] = true; + } + } + } + else { + completed_task_information.activity_done[activity_id] = true; + } + } + + if (previous_task_id != -1) { + client_task_state->m_completed_tasks.push_back(completed_task_information); + } + + client_task_state->m_last_completed_task_loaded = client_task_state->m_completed_tasks.size(); + } + + std::string query = StringFormat( + "SELECT `taskid` FROM character_enabledtasks " + "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " + "ORDER BY `taskid` ASC", + character_id, MAXTASKS + ); + + auto results = database.QueryDatabase(query); + if (results.Success()) { + for (auto row = results.begin(); row != results.end(); ++row) { + int task_id = atoi(row[0]); + client_task_state->m_enabled_tasks.push_back(task_id); + LogTasksDetail("[LoadClientState] Adding task_id [{}] to enabled tasks", task_id); + } + } + + // Check that there is an entry in the client task state for every activity_information in each task + // This should only break if a ServerOP adds or deletes activites for a task that players already + // have active, or due to a bug. + for (int task_index = 0; task_index < MAXACTIVEQUESTS + 1; task_index++) { + int task_id = client_task_state->m_active_tasks[task_index].task_id; + if (task_id == TASKSLOTEMPTY) { + continue; + } + if (!m_task_data[task_id]) { + client->Message( + Chat::Red, + "Active Task Slot %i, references a task (%i), that does not exist. " + "Removing from memory. Contact a GM to resolve this.", + task_index, + task_id + ); + + LogError("[LoadClientState] Character [{}] has task [{}] which does not exist", character_id, task_id); + client_task_state->m_active_tasks[task_index].task_id = TASKSLOTEMPTY; + continue; + } + for (int activity_index = 0; activity_index < m_task_data[task_id]->activity_count; activity_index++) { + if (client_task_state->m_active_tasks[task_index].activity[activity_index].activity_id != activity_index) { + client->Message( + Chat::Red, + "Active Task %i, %s. activity_information count does not match expected value." + "Removing from memory. Contact a GM to resolve this.", + task_id, m_task_data[task_id]->title.c_str() + ); + + LogTasks( + "[LoadClientState] Fatal error in character [{}] task state. activity_information [{}] for Task [{}] either missing from client state or from task", + character_id, + activity_index, + task_id + ); + client_task_state->m_active_tasks[task_index].task_id = TASKSLOTEMPTY; + break; + } + } + } + + if (client_task_state->m_active_task.task_id != TASKSLOTEMPTY) { + client_task_state->UnlockActivities(character_id, client_task_state->m_active_task); + } + + // TODO: shared + for (auto &active_quest : client_task_state->m_active_quests) { + if (active_quest.task_id != TASKSLOTEMPTY) { + client_task_state->UnlockActivities(character_id, active_quest); + } + } + + LogTasks("[LoadClientState] for Character ID [{}] DONE!", character_id); + + return true; +} diff --git a/zone/task_manager.h b/zone/task_manager.h new file mode 100644 index 000000000..f1fe41bd9 --- /dev/null +++ b/zone/task_manager.h @@ -0,0 +1,98 @@ +#ifndef EQEMU_TASK_MANAGER_H +#define EQEMU_TASK_MANAGER_H + +#include "tasks.h" +#include "task_client_state.h" +#include "task_proximity_manager.h" +#include "task_goal_list_manager.h" +#include "../common/types.h" +#include +#include +#include +#include + +class Client; + +class Mob; + +class TaskManager { + +public: + TaskManager(); + ~TaskManager(); + int GetActivityCount(int task_id); + bool LoadTasks(int single_task = 0); + void ReloadGoalLists(); + inline void LoadProximities(int zone_id) + { + m_proximity_manager.LoadProximities(zone_id); + } + bool LoadTaskSets(); + bool LoadClientState(Client *client, ClientTaskState *client_task_state); + bool SaveClientState(Client *client, ClientTaskState *client_task_state); + void SendTaskSelector(Client *client, Mob *mob, int task_count, int *task_list); + void SendTaskSelectorNew(Client *client, Mob *mob, int task_count, int *task_list); + bool ValidateLevel(int task_id, int player_level); + std::string GetTaskName(uint32 task_id); + TaskType GetTaskType(uint32 task_id); + void TaskSetSelector(Client *client, ClientTaskState *client_task_state, Mob *mob, int task_set_id); + // task list provided by QuestManager (perl/lua) + void TaskQuestSetSelector( + Client *client, + ClientTaskState *client_task_state, + Mob *mob, + int count, + int *tasks + ); + void SendActiveTasksToClient(Client *client, bool task_complete = false); + void SendSingleActiveTaskToClient( + Client *client, + ClientTaskInformation &task_info, + bool task_complete, + bool bring_up_task_journal = false + ); + void SendTaskActivityShort(Client *client, int task_id, int activity_id, int client_task_index); + void SendTaskActivityLong( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete = false + ); + void SendTaskActivityNew( + Client *client, + int task_id, + int activity_id, + int client_task_index, + bool optional, + bool task_complete = false + ); + void SendCompletedTasksToClient(Client *c, ClientTaskState *client_task_state); + void ExplainTask(Client *client, int task_id); + int FirstTaskInSet(int task_set); + int LastTaskInSet(int task_set); + int NextTaskInSet(int task_set, int task_id); + bool IsTaskRepeatable(int task_id); + + friend class ClientTaskState; + + +private: + TaskGoalListManager m_goal_list_manager; + TaskProximityManager m_proximity_manager; + TaskInformation *m_task_data[MAXTASKS]{}; + std::vector m_task_sets[MAXTASKSETS]; + void SendActiveTaskDescription( + Client *client, + int task_id, + ClientTaskInformation &task_info, + int start_time, + int duration, + bool bring_up_task_journal = false + ); + +}; + + +#endif //EQEMU_TASK_MANAGER_H diff --git a/zone/task_proximity_manager.cpp b/zone/task_proximity_manager.cpp new file mode 100644 index 000000000..ee46acbcb --- /dev/null +++ b/zone/task_proximity_manager.cpp @@ -0,0 +1,80 @@ +#include "../common/global_define.h" +#include "../common/repositories/proximities_repository.h" +#include "../common/rulesys.h" +#include "client.h" +#include "mob.h" +#include "quest_parser_collection.h" +#include "task_proximity_manager.h" +#include "tasks.h" +#include "zonedb.h" + +TaskProximityManager::TaskProximityManager() +{ + + +} + +TaskProximityManager::~TaskProximityManager() +{ + + +} + +bool TaskProximityManager::LoadProximities(int zone_id) +{ + TaskProximity proximity{}; + m_task_proximities.clear(); + + auto proximities = ProximitiesRepository::GetWhere( + content_db, + fmt::format("zoneid = {} ORDER BY `zoneid` ASC", zone_id) + ); + + for (auto &row: proximities) { + proximity.explore_id = row.exploreid; + proximity.min_x = row.minx; + proximity.max_x = row.maxx; + proximity.min_y = row.miny; + proximity.max_y = row.maxy; + proximity.min_z = row.minz; + proximity.max_z = row.maxz; + + m_task_proximities.push_back(proximity); + } + + LogTasks("Loaded [{}] Task Proximities", proximities.size()); + + return true; +} + +int TaskProximityManager::CheckProximities(float x, float y, float z) +{ + for (auto &task_proximity : m_task_proximities) { + + TaskProximity *p_proximity = &task_proximity; + + Log( + Logs::General, + Logs::Tasks, + "[Proximity] Checking %8.3f, %8.3f, %8.3f against %8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f", + x, + y, + z, + p_proximity->min_x, + p_proximity->max_x, + p_proximity->min_y, + p_proximity->max_y, + p_proximity->min_z, + p_proximity->max_z + ); + + if (x < p_proximity->min_x || x > p_proximity->max_x || y < p_proximity->min_y || y > p_proximity->max_y || + z < p_proximity->min_z || z > p_proximity->max_z) { + continue; + } + + return p_proximity->explore_id; + } + + return 0; +} diff --git a/zone/task_proximity_manager.h b/zone/task_proximity_manager.h new file mode 100644 index 000000000..a3fe44c07 --- /dev/null +++ b/zone/task_proximity_manager.h @@ -0,0 +1,27 @@ +#ifndef EQEMU_TASK_PROXIMITY_MANAGER_H +#define EQEMU_TASK_PROXIMITY_MANAGER_H + +struct TaskProximity { + int explore_id; + float min_x; + float max_x; + float min_y; + float max_y; + float min_z; + float max_z; +}; + +// This class is used for managing proximities so that Quest NPC proximities don't need to be used. +class TaskProximityManager { + +public: + TaskProximityManager(); + ~TaskProximityManager(); + bool LoadProximities(int zone_id); + int CheckProximities(float x, float y, float z); + +private: + std::vector m_task_proximities; +}; + +#endif //EQEMU_TASK_PROXIMITY_MANAGER_H diff --git a/zone/tasks.cpp b/zone/tasks.cpp index bbee65c1e..4f240bab5 100644 --- a/zone/tasks.cpp +++ b/zone/tasks.cpp @@ -1,2465 +1,38 @@ - -/* EQEMu: Everquest Server Emulator -Copyright (C) 2001-2008 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 -*/ - #include "../common/global_define.h" -#include "tasks.h" - -#include - -#ifdef _WINDOWS -#define strcasecmp _stricmp -#endif - #include "../common/misc_functions.h" #include "../common/rulesys.h" #include "../common/string_util.h" -#include "../common/say_link.h" - #include "client.h" -#include "entity.h" -#include "mob.h" -#include "string_ids.h" - #include "queryserv.h" #include "quest_parser_collection.h" +#include "tasks.h" +#include "zonedb.h" -extern QueryServ* QServ; +extern QueryServ *QServ; -TaskManager::TaskManager() { - for(int i=0; i 0 AND `id` < %i " - "AND `taskid` >= 0 AND `taskid` < %i " - "ORDER BY `id`, `taskid` ASC", - MAXTASKSETS, MAXTASKS - ); - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - LogError("Error in TaskManager::LoadTaskSets: [{}]", results.ErrorMessage().c_str()); - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int taskSet = atoi(row[0]); - int taskID = atoi(row[1]); - - TaskSets[taskSet].push_back(taskID); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Adding TaskID %4i to TaskSet %4i", taskID, taskSet); - } - - return true; -} - -bool TaskManager::LoadSingleTask(int TaskID) { - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskManager::LoadSingleTask(%i)", TaskID); - - if((TaskID <= 0) || (TaskID >= MAXTASKS)) return false; - - // If this task already exists in memory, free all the dynamically allocated strings. - if(Tasks[TaskID]) { - safe_delete(Tasks[TaskID]); - } - - return LoadTasks(TaskID); -} - -void TaskManager::ReloadGoalLists() { - - if(!GoalListManager.LoadLists()) - Log(Logs::Detail, Logs::Tasks,"TaskManager::LoadTasks LoadLists failed"); -} - -bool TaskManager::LoadTasks(int singleTask) -{ - // If TaskID !=0, then just load the task specified. - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskManager::LoadTasks Called"); - - std::string query; - if (singleTask == 0) { - if (!GoalListManager.LoadLists()) - Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadLists failed"); - - if (!LoadTaskSets()) - Log(Logs::Detail, Logs::Tasks, "TaskManager::LoadTasks LoadTaskSets failed"); - - query = StringFormat("SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," - "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` < %i", - MAXTASKS); - } else - query = StringFormat("SELECT `id`, `type`, `duration`, `duration_code`, `title`, `description`, " - "`reward`, `rewardid`, `cashreward`, `xpreward`, `rewardmethod`, `faction_reward`," - "`minlevel`, `maxlevel`, `repeatable`, `completion_emote` FROM `tasks` WHERE `id` = %i", - singleTask); - - const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::LoadTasks: %s"; - - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - - if ((taskID <= 0) || (taskID >= MAXTASKS)) { - // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError("[TASKS]Task ID [{}] out of range while loading tasks from database", taskID); - continue; + if (RuleB(TaskSystem, EnableTaskSystem) && task_manager) { + if (task_state) { + safe_delete(task_state); } - Tasks[taskID] = new TaskInformation; - Tasks[taskID]->type = static_cast(atoi(row[1])); - Tasks[taskID]->Duration = atoi(row[2]); - Tasks[taskID]->dur_code = static_cast(atoi(row[3])); - Tasks[taskID]->Title = row[4]; - Tasks[taskID]->Description = row[5]; - Tasks[taskID]->Reward = row[6]; - Tasks[taskID]->RewardID = atoi(row[7]); - Tasks[taskID]->CashReward = atoi(row[8]); - Tasks[taskID]->XPReward = atoi(row[9]); - Tasks[taskID]->RewardMethod = (TaskMethodType)atoi(row[10]); - Tasks[taskID]->faction_reward = atoi(row[11]); - Tasks[taskID]->MinLevel = atoi(row[12]); - Tasks[taskID]->MaxLevel = atoi(row[13]); - Tasks[taskID]->Repeatable = atoi(row[14]); - Tasks[taskID]->completion_emote = row[15]; - Tasks[taskID]->ActivityCount = 0; - Tasks[taskID]->SequenceMode = ActivitiesSequential; - Tasks[taskID]->LastStep = 0; - - Log(Logs::General, Logs::Tasks, - "[GLOBALLOAD] TaskID: %5i, Duration: %8i, Reward: %s MinLevel %i MaxLevel %i " - "Repeatable: %s", - taskID, Tasks[taskID]->Duration, Tasks[taskID]->Reward.c_str(), - Tasks[taskID]->MinLevel, Tasks[taskID]->MaxLevel, Tasks[taskID]->Repeatable ? "Yes" : "No"); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Title: %s", Tasks[taskID]->Title.c_str()); - } - - if (singleTask == 0) - query = - StringFormat("SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " - "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " - "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` < " - "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - MAXTASKS, MAXACTIVITIESPERTASK); - else - query = - StringFormat("SELECT `taskid`, `step`, `activityid`, `activitytype`, `target_name`, `item_list`, " - "`skill_list`, `spell_list`, `description_override`, `goalid`, `goalmethod`, " - "`goalcount`, `delivertonpc`, `zones`, `optional` FROM `task_activities` WHERE `taskid` = " - "%i AND `activityid` < %i ORDER BY taskid, activityid ASC", - singleTask, MAXACTIVITIESPERTASK); - results = content_db.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - int step = atoi(row[1]); - - int activityID = atoi(row[2]); - - if ((taskID <= 0) || (taskID >= MAXTASKS) || (activityID < 0) || (activityID >= MAXACTIVITIESPERTASK)) { - // This shouldn't happen, as the SELECT is bounded by MAXTASKS - LogError("[TASKS]Task or Activity ID ([{}], [{}]) out of range while loading activities from database", taskID, activityID); - continue; - } - - if (Tasks[taskID] == nullptr) { - LogError("[TASKS]Activity for non-existent task ([{}], [{}]) while loading activities from database", - taskID, activityID); - continue; - } - - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].StepNumber = step; - - if (step != 0) - Tasks[taskID]->SequenceMode = ActivitiesStepped; - - if (step > Tasks[taskID]->LastStep) - Tasks[taskID]->LastStep = step; - - // Task Activities MUST be numbered sequentially from 0. If not, log an error - // and set the task to nullptr. Subsequent activities for this task will raise - // ERR_NOTASK errors. - // Change to (activityID != (Tasks[taskID]->ActivityCount + 1)) to index from 1 - if (activityID != Tasks[taskID]->ActivityCount) { - LogError("[TASKS]Activities for Task [{}] are not sequential starting at 0. Not loading task", taskID, - activityID); - Tasks[taskID] = nullptr; - continue; - } - - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Type = atoi(row[3]); - - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].target_name = row[4]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].item_list = row[5]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].skill_list = row[6]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].skill_id = atoi(row[6]); // for older clients - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].spell_list = row[7]; - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].spell_id = atoi(row[7]); // for older clients - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].desc_override = row[8]; - - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalID = atoi(row[9]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalMethod = (TaskMethodType)atoi(row[10]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalCount = atoi(row[11]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].DeliverToNPC = atoi(row[12]); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones = row[13]; - auto zones = SplitString(Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones, ';'); - for (auto && e : zones) - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].ZoneIDs.push_back(std::stoi(e)); - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Optional = atoi(row[14]); - - Log(Logs::General, Logs::Tasks, - "[GLOBALLOAD] Activity Slot %2i: ID %i for Task %5i. Type: %3i, GoalID: %8i, " - "GoalMethod: %i, GoalCount: %3i, Zones:%s", - Tasks[taskID]->ActivityCount, activityID, taskID, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].Type, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalID, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalMethod, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].GoalCount, - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].zones.c_str()); - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] target_name: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].target_name.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] item_list: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].item_list.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] skill_list: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].skill_list.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] spell_list: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].spell_list.c_str()); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] description_override: %s", - Tasks[taskID]->Activity[Tasks[taskID]->ActivityCount].desc_override.c_str()); - - Tasks[taskID]->ActivityCount++; - } - - return true; -} - -bool TaskManager::SaveClientState(Client *c, ClientTaskState *state) -{ - // I am saving the slot in the ActiveTasks table, because unless a Task is cancelled/completed, the client - // doesn't seem to like tasks moving slots between zoning and you can end up with 'bogus' activities if the task - // previously in that slot had more activities than the one now occupying it. Hopefully retaining the slot - // number for the duration of a session will overcome this. - if (!c || !state) - return false; - - const char *ERR_MYSQLERROR = "[TASKS]Error in TaskManager::SaveClientState %s"; - - int characterID = c->CharacterID(); - - Log(Logs::Detail, Logs::Tasks, "TaskManager::SaveClientState for character ID %d", characterID); - - if (state->ActiveTaskCount > 0 || state->ActiveTask.TaskID != TASKSLOTEMPTY) { // TODO: tasks - for (int task = 0; task < MAXACTIVEQUESTS + 1; task++) { - int taskID = state->ActiveTasks[task].TaskID; - if (taskID == TASKSLOTEMPTY) - continue; - - int slot = state->ActiveTasks[task].slot; - - if (state->ActiveTasks[task].Updated) { - - Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState for character ID %d, Updating TaskIndex " - "%i TaskID %i", - characterID, slot, taskID); - - std::string query = StringFormat( - "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime) " - "VALUES (%i, %i, %i, %i, %i)", - characterID, taskID, slot, static_cast(Tasks[taskID]->type), - state->ActiveTasks[task].AcceptedTime); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } else { - state->ActiveTasks[task].Updated = false; - } - } - - std::string query = - "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " - "VALUES "; - - int updatedActivityCount = 0; - for (int activityIndex = 0; activityIndex < Tasks[taskID]->ActivityCount; ++activityIndex) { - - if (!state->ActiveTasks[task].Activity[activityIndex].Updated) - continue; - - Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientSate for character ID %d, Updating Activity " - "%i, %i", - characterID, slot, activityIndex); - - if (updatedActivityCount == 0) - query += - StringFormat("(%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, - state->ActiveTasks[task].Activity[activityIndex].DoneCount, - state->ActiveTasks[task].Activity[activityIndex].State == - ActivityCompleted); - else - query += - StringFormat(", (%i, %i, %i, %i, %i)", characterID, taskID, activityIndex, - state->ActiveTasks[task].Activity[activityIndex].DoneCount, - state->ActiveTasks[task].Activity[activityIndex].State == - ActivityCompleted); - - updatedActivityCount++; - } - - if (updatedActivityCount == 0) - continue; - - Log(Logs::General, Logs::Tasks, "[CLIENTSAVE] Executing query %s", query.c_str()); - auto results = database.QueryDatabase(query); - - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - continue; - } - - state->ActiveTasks[task].Updated = false; - for (int activityIndex = 0; activityIndex < Tasks[taskID]->ActivityCount; ++activityIndex) - state->ActiveTasks[task].Activity[activityIndex].Updated = false; - } - } - - if (!RuleB(TaskSystem, RecordCompletedTasks) || - (state->CompletedTasks.size() <= (unsigned int)state->LastCompletedTaskLoaded)) { - state->LastCompletedTaskLoaded = state->CompletedTasks.size(); - return true; - } - - const char *completedTaskQuery = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " - "VALUES (%i, %i, %i, %i)"; - - for (unsigned int i = state->LastCompletedTaskLoaded; i < state->CompletedTasks.size(); i++) { - - Log(Logs::General, Logs::Tasks, - "[CLIENTSAVE] TaskManager::SaveClientState Saving Completed Task at slot %i", i); - int taskID = state->CompletedTasks[i].TaskID; - - if ((taskID <= 0) || (taskID >= MAXTASKS) || (Tasks[taskID] == nullptr)) - continue; - - // First we save a record with an ActivityID of -1. - // This indicates this task was completed at the given time. We infer that all - // none optional activities were completed. - // - std::string query = - StringFormat(completedTaskQuery, characterID, state->CompletedTasks[i].CompletedTime, taskID, -1); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - continue; - } - - // If the Rule to record non-optional task completion is not enabled, don't save it - if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) - continue; - - // Insert one record for each completed optional task. - - for (int j = 0; j < Tasks[taskID]->ActivityCount; j++) { - if (!Tasks[taskID]->Activity[j].Optional || !state->CompletedTasks[i].ActivityDone[j]) - continue; - - query = StringFormat(completedTaskQuery, characterID, state->CompletedTasks[i].CompletedTime, - taskID, j); - results = database.QueryDatabase(query); - if (!results.Success()) - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } - } - - state->LastCompletedTaskLoaded = state->CompletedTasks.size(); - return true; -} - -void Client::LoadClientTaskState() { - - if(RuleB(TaskSystem, EnableTaskSystem) && taskmanager) { - if(taskstate) - safe_delete(taskstate); - - taskstate = new ClientTaskState; - if(!taskmanager->LoadClientState(this, taskstate)) { - safe_delete(taskstate); + task_state = new ClientTaskState; + if (!task_manager->LoadClientState(this, task_state)) { + safe_delete(task_state); } else { - taskmanager->SendActiveTasksToClient(this); - taskmanager->SendCompletedTasksToClient(this, taskstate); + task_manager->SendActiveTasksToClient(this); + task_manager->SendCompletedTasksToClient(this, task_state); } } - } -void Client::RemoveClientTaskState() { - - if(taskstate) { - taskstate->CancelAllTasks(this); - safe_delete(taskstate); - } -} - -bool TaskManager::LoadClientState(Client *c, ClientTaskState *state) +void Client::RemoveClientTaskState() { - if (!c || !state) - return false; - - int characterID = c->CharacterID(); - - state->ActiveTaskCount = 0; - - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] TaskManager::LoadClientState for character ID %d", characterID); - - std::string query = StringFormat("SELECT `taskid`, `slot`,`type`, `acceptedtime` " - "FROM `character_tasks` " - "WHERE `charid` = %i ORDER BY acceptedtime", - characterID); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load Tasks: [{}]", - results.ErrorMessage().c_str()); - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - int slot = atoi(row[1]); - TaskType type = static_cast(atoi(row[2])); - - if ((taskID < 0) || (taskID >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading character tasks from database", taskID); - continue; - } - - auto task_info = state->GetClientTaskInfo(type, slot); - - if (task_info == nullptr) { - LogError("[TASKS] Slot [{}] out of range while loading character tasks from database", slot); - continue; - } - - if (task_info->TaskID != TASKSLOTEMPTY) { - LogError("[TASKS] Slot [{}] for Task [{}]s is already occupied", slot, - taskID); - continue; - } - - int acceptedtime = atoi(row[3]); - - task_info->TaskID = taskID; - task_info->CurrentStep = -1; - task_info->AcceptedTime = acceptedtime; - task_info->Updated = false; - - for (int i = 0; i < MAXACTIVITIESPERTASK; i++) - task_info->Activity[i].ActivityID = -1; - - if (type == TaskType::Quest) - ++state->ActiveTaskCount; - - Log(Logs::General, Logs::Tasks, - "[CLIENTLOAD] TaskManager::LoadClientState. Char: %i Task ID %i, Accepted Time: %8X", characterID, - taskID, acceptedtime); - } - - // Load Activities - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] LoadClientState. Loading activities for character ID %d", - characterID); - - query = StringFormat("SELECT `taskid`, `activityid`, `donecount`, `completed` " - "FROM `character_activities` " - "WHERE `charid` = %i " - "ORDER BY `taskid` ASC, `activityid` ASC", - characterID); - results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load Activities: [{}]", - results.ErrorMessage().c_str()); - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - if ((taskID < 0) || (taskID >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading character activities from database", taskID); - continue; - } - - int activityID = atoi(row[1]); - if ((activityID < 0) || (activityID >= MAXACTIVITIESPERTASK)) { - LogError("[TASKS]Activity ID [{}] out of range while loading character activities from database", - activityID); - continue; - } - - ClientTaskInformation *task_info = nullptr; - - if (state->ActiveTask.TaskID == taskID) - task_info = &state->ActiveTask; - - // wasn't task - if (task_info == nullptr) - for (int i = 0; i < MAXACTIVEQUESTS; i++) - if (state->ActiveQuests[i].TaskID == taskID) - task_info = &state->ActiveQuests[i]; - - if (task_info == nullptr) { - LogError("[TASKS]Activity [{}] found for task [{}] which client does not have", activityID, taskID); - continue; - } - - int doneCount = atoi(row[2]); - bool completed = atoi(row[3]); - task_info->Activity[activityID].ActivityID = activityID; - task_info->Activity[activityID].DoneCount = doneCount; - if (completed) - task_info->Activity[activityID].State = ActivityCompleted; - else - task_info->Activity[activityID].State = ActivityHidden; - - task_info->Activity[activityID].Updated = false; - - Log(Logs::General, Logs::Tasks, - "[CLIENTLOAD] TaskManager::LoadClientState. Char: %i Task ID %i, ActivityID: %i, DoneCount: %i, " - "Completed: %i", - characterID, taskID, activityID, doneCount, completed); - } - - if (RuleB(TaskSystem, RecordCompletedTasks)) { - query = StringFormat("SELECT `taskid`, `activityid`, `completedtime` " - "FROM `completed_tasks` " - "WHERE `charid` = %i ORDER BY completedtime, taskid, activityid", - characterID); - results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load completed tasks: [{}]", - results.ErrorMessage().c_str()); - return false; - } - - CompletedTaskInformation cti; - - for (int i = 0; i < MAXACTIVITIESPERTASK; i++) - cti.ActivityDone[i] = false; - - int previousTaskID = -1; - int previousCompletedTime = -1; - - for (auto row = results.begin(); row != results.end(); ++row) { - - int taskID = atoi(row[0]); - if ((taskID <= 0) || (taskID >= MAXTASKS)) { - LogError("[TASKS]Task ID [{}] out of range while loading completed tasks from database", - taskID); - continue; - } - - // An ActivityID of -1 means mark all the none optional activities in the - // task as complete. If the Rule to record optional activities is enabled, - // subsequent records for this task will flag any optional tasks that were - // completed. - int activityID = atoi(row[1]); - if ((activityID < -1) || (activityID >= MAXACTIVITIESPERTASK)) { - LogError("[TASKS]Activity ID [{}] out of range while loading completed tasks from database", - activityID); - continue; - } - - int completedTime = atoi(row[2]); - if ((previousTaskID != -1) && - ((taskID != previousTaskID) || (completedTime != previousCompletedTime))) { - state->CompletedTasks.push_back(cti); - for (int i = 0; i < MAXACTIVITIESPERTASK; i++) - cti.ActivityDone[i] = false; - } - - cti.TaskID = previousTaskID = taskID; - cti.CompletedTime = previousCompletedTime = completedTime; - - // If ActivityID is -1, Mark all the non-optional tasks as completed. - if (activityID < 0) { - TaskInformation *task = Tasks[taskID]; - if (task == nullptr) - continue; - - for (int i = 0; i < task->ActivityCount; i++) - if (!task->Activity[i].Optional) - cti.ActivityDone[i] = true; - } else - cti.ActivityDone[activityID] = true; - } - - if (previousTaskID != -1) - state->CompletedTasks.push_back(cti); - - state->LastCompletedTaskLoaded = state->CompletedTasks.size(); - } - - query = StringFormat("SELECT `taskid` FROM character_enabledtasks " - "WHERE `charid` = %i AND `taskid` >0 AND `taskid` < %i " - "ORDER BY `taskid` ASC", - characterID, MAXTASKS); - results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS]Error in TaskManager::LoadClientState load enabled tasks: [{}]", - results.ErrorMessage().c_str()); - } else { - for (auto row = results.begin(); row != results.end(); ++row) { - int taskID = atoi(row[0]); - state->EnabledTasks.push_back(taskID); - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] Adding TaskID %i to enabled tasks", taskID); - } - } - - // Check that there is an entry in the client task state for every activity in each task - // This should only break if a ServerOP adds or deletes activites for a task that players already - // have active, or due to a bug. - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - int taskID = state->ActiveTasks[i].TaskID; - if (taskID == TASKSLOTEMPTY) - continue; - if (!Tasks[taskID]) { - c->Message(Chat::Red, - "Active Task Slot %i, references a task (%i), that does not exist. " - "Removing from memory. Contact a GM to resolve this.", - i, taskID); - - LogError("[TASKS]Character [{}] has task [{}] which does not exist", - characterID, taskID); - state->ActiveTasks[i].TaskID = TASKSLOTEMPTY; - continue; - } - for (int j = 0; j < Tasks[taskID]->ActivityCount; j++) { - - if (state->ActiveTasks[i].Activity[j].ActivityID != j) { - c->Message(Chat::Red, - "Active Task %i, %s. Activity count does not match expected value." - "Removing from memory. Contact a GM to resolve this.", - taskID, Tasks[taskID]->Title.c_str()); - - LogError("[TASKS]Fatal error in character [{}] task state. Activity [{}] for Task [{}] either missing from client state or from task", - characterID, j, taskID); - state->ActiveTasks[i].TaskID = TASKSLOTEMPTY; - break; - } - } - } - - if (state->ActiveTask.TaskID != TASKSLOTEMPTY) - state->UnlockActivities(characterID, state->ActiveTask); - // TODO: shared - for (int i = 0; i < MAXACTIVEQUESTS; i++) - if (state->ActiveQuests[i].TaskID != TASKSLOTEMPTY) - state->UnlockActivities(characterID, state->ActiveQuests[i]); - - Log(Logs::General, Logs::Tasks, "[CLIENTLOAD] LoadClientState for Character ID %d DONE!", characterID); - return true; -} - -void ClientTaskState::EnableTask(int characterID, int taskCount, int *tasks) { - - // Check if the Task is already enabled for this client - // - std::vector tasksEnabled; - - for(int i=0; i tasks[i]) - break; - ++iterator; - } - - if(addTask) { - EnabledTasks.insert(iterator, tasks[i]); - // Make a note of the task we enabled, for later SQL generation - tasksEnabled.push_back(tasks[i]); - } - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] New enabled task list "); - for(unsigned int i=0; i tasksDisabled; - - for(int i=0; i taskList[i]) - break; - - ++iterator; - } - - if(removeTask) { - EnabledTasks.erase(iterator); - tasksDisabled.push_back(taskList[i]); - } - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] New enabled task list "); - for(unsigned int i=0; i::iterator Iterator; - - Iterator = EnabledTasks.begin(); - - while(Iterator != EnabledTasks.end()) { - if((*Iterator) == TaskID) return true; - if((*Iterator) > TaskID) break; - ++Iterator; - } - - return false; -} - -int ClientTaskState::EnabledTaskCount(int TaskSetID) { - - // Return the number of tasks in TaskSet that this character is enabled for. - - unsigned int EnabledTaskIndex = 0; - unsigned int TaskSetIndex = 0; - int EnabledTaskCount = 0; - - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return -1; - - while((EnabledTaskIndex < EnabledTasks.size()) && (TaskSetIndex < taskmanager->TaskSets[TaskSetID].size())) { - - if(EnabledTasks[EnabledTaskIndex] == taskmanager->TaskSets[TaskSetID][TaskSetIndex]) { - - EnabledTaskCount++; - EnabledTaskIndex++; - TaskSetIndex++; - continue; - } - - if(EnabledTasks[EnabledTaskIndex] < taskmanager->TaskSets[TaskSetID][TaskSetIndex]) - EnabledTaskIndex++; - else - TaskSetIndex++; - - } - - return EnabledTaskCount; -} -int ClientTaskState::ActiveTasksInSet(int TaskSetID) { - - - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return -1; - - int Count = 0; - - for(unsigned int i=0; iTaskSets[TaskSetID].size(); i++) - if(IsTaskActive(taskmanager->TaskSets[TaskSetID][i])) - Count++; - - return Count; -} - -int ClientTaskState::CompletedTasksInSet(int TaskSetID) { - - - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return -1; - - int Count = 0; - - for(unsigned int i=0; iTaskSets[TaskSetID].size(); i++) - if(IsTaskCompleted(taskmanager->TaskSets[TaskSetID][i])) - Count++; - - return Count; -} - -bool ClientTaskState::HasSlotForTask(TaskInformation *task) -{ - if (task == nullptr) - return false; - - switch (task->type) { - case TaskType::Task: - return ActiveTask.TaskID == TASKSLOTEMPTY; - case TaskType::Shared: - return false; // todo - case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; ++i) - if (ActiveQuests[i].TaskID == TASKSLOTEMPTY) - return true; - case TaskType::E: - return false; // removed on live - } - - return false; -} - -int TaskManager::FirstTaskInSet(int TaskSetID) { - - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return 0; - - if(TaskSets[TaskSetID].empty()) return 0; - - auto Iterator = TaskSets[TaskSetID].begin(); - - while(Iterator != TaskSets[TaskSetID].end()) { - if((*Iterator) > 0) - return (*Iterator); - ++Iterator; - } - - return 0; -} - -int TaskManager::LastTaskInSet(int TaskSetID) { - - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return 0; - - if(TaskSets[TaskSetID].empty()) return 0; - - return TaskSets[TaskSetID][TaskSets[TaskSetID].size()-1]; -} - -int TaskManager::NextTaskInSet(int TaskSetID, int TaskID) { - - if((TaskSetID<=0) || (TaskSetID>=MAXTASKSETS)) return 0; - - if(TaskSets[TaskSetID].empty()) return 0; - - for(unsigned int i=0; i TaskID) return TaskSets[TaskSetID][i]; - } - - return 0; -} - -bool TaskManager::AppropriateLevel(int TaskID, int PlayerLevel) { - - if(Tasks[TaskID] == nullptr) return false; - - if(Tasks[TaskID]->MinLevel && (PlayerLevel < Tasks[TaskID]->MinLevel)) return false; - - if(Tasks[TaskID]->MaxLevel && (PlayerLevel > Tasks[TaskID]->MaxLevel)) return false; - - return true; - -} - -int TaskManager::GetTaskMinLevel(int TaskID) -{ - if (Tasks[TaskID]->MinLevel) - { - return Tasks[TaskID]->MinLevel; - } - - return -1; -} - -int TaskManager::GetTaskMaxLevel(int TaskID) -{ - if (Tasks[TaskID]->MaxLevel) - { - return Tasks[TaskID]->MaxLevel; - } - - return -1; -} - -void TaskManager::TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, int TaskSetID) -{ - int TaskList[MAXCHOOSERENTRIES]; - int TaskListIndex = 0; - int PlayerLevel = c->GetLevel(); - - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSetSelector called for taskset %i. EnableTaskSize is %i", - TaskSetID, state->EnabledTasks.size()); - - if (TaskSetID <= 0 || TaskSetID >= MAXTASKSETS) - return; - - if (TaskSets[TaskSetID].empty()) { - mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // I think this is suppose to be yellow - return; - } - - bool all_enabled = false; - - // A TaskID of 0 in a TaskSet indicates that all Tasks in the set are enabled for all players. - if (TaskSets[TaskSetID][0] == 0) { - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSets[%i][0] == 0. All Tasks in Set enabled.", TaskSetID); - all_enabled = true; - } - - auto Iterator = TaskSets[TaskSetID].begin(); - - if (all_enabled) - ++Iterator; // skip first when all enabled since it's useless data - - while (Iterator != TaskSets[TaskSetID].end() && TaskListIndex < MAXCHOOSERENTRIES) { - auto task = *Iterator; - // verify level, we're not currently on it, repeatable status, if it's a (shared) task - // we aren't currently on another, and if it's enabled if not all_enabled - if ((all_enabled || state->IsTaskEnabled(task)) && AppropriateLevel(task, PlayerLevel) && - !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) - TaskList[TaskListIndex++] = task; - - ++Iterator; - } - - if (TaskListIndex > 0) { - SendTaskSelector(c, mob, TaskListIndex, TaskList); - } else { - mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow - } - - return; -} - -// unlike the non-Quest version of this function, it does not check enabled, that is assumed the responsibility of the quest to handle -// we do however still want it to check the other stuff like level, active, room, etc -void TaskManager::TaskQuestSetSelector(Client *c, ClientTaskState *state, Mob *mob, int count, int *tasks) -{ - int TaskList[MAXCHOOSERENTRIES]; - int TaskListIndex = 0; - int PlayerLevel = c->GetLevel(); - - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskQuestSetSelector called for array size %d", count); - - if (count <= 0) - return; - - for (int i = 0; i < count; ++i) { - auto task = tasks[i]; - // verify level, we're not currently on it, repeatable status, if it's a (shared) task - // we aren't currently on another, and if it's enabled if not all_enabled - if (AppropriateLevel(task, PlayerLevel) && - !state->IsTaskActive(task) && state->HasSlotForTask(Tasks[task]) && // this slot checking is a bit silly, but we allow mixing of task types ... - (IsTaskRepeatable(task) || !state->IsTaskCompleted(task))) - TaskList[TaskListIndex++] = task; - } - - if (TaskListIndex > 0) { - SendTaskSelector(c, mob, TaskListIndex, TaskList); - } else { - mob->SayString(c, Chat::Yellow, MAX_ACTIVE_TASKS, c->GetName()); // check color, I think this might be only for (Shared) Tasks, w/e -- think should be yellow - } - - return; -} - -void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList) { - - if (c->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) - { - SendTaskSelectorNew(c, mob, TaskCount, TaskList); - return; - } - // Titanium OpCode: 0x5e7c - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSelector for %i Tasks", TaskCount); - int PlayerLevel = c->GetLevel(); - - // Check if any of the tasks exist - for (int i = 0; i < TaskCount; i++) { - if (Tasks[TaskList[i]] != nullptr) - break; - } - - int ValidTasks = 0; - - for (int i = 0; i < TaskCount; i++) { - if (!AppropriateLevel(TaskList[i], PlayerLevel)) - continue; - if (c->IsTaskActive(TaskList[i])) - continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) - continue; - - ValidTasks++; - } - - if (ValidTasks == 0) - return; - - SerializeBuffer buf(50 * ValidTasks); - - - buf.WriteUInt32(ValidTasks); - buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do? - buf.WriteUInt32(mob->GetID()); - - for (int i = 0; i < TaskCount; i++) { - if (!AppropriateLevel(TaskList[i], PlayerLevel)) - continue; - if (c->IsTaskActive(TaskList[i])) - continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) - continue; - - buf.WriteUInt32(TaskList[i]); // TaskID - if (c->ClientVersion() != EQEmu::versions::ClientVersion::Titanium) - buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(Tasks[TaskList[i]]->Duration); - buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->dur_code)); - - buf.WriteString(Tasks[TaskList[i]]->Title); // max 64 with null - buf.WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null - - if (c->ClientVersion() != EQEmu::versions::ClientVersion::Titanium) - buf.WriteUInt8(0); // Has reward set flag - - buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount); - - for (int j = 0; j < Tasks[TaskList[i]]->ActivityCount; ++j) { - buf.WriteUInt32(j); // ActivityNumber - auto &activity = Tasks[TaskList[i]]->Activity[j]; - buf.WriteUInt32(activity.Type); - buf.WriteUInt32(0); // solo, group, raid? - buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) - - buf.WriteString(activity.item_list); // max length 64 in these clients - - buf.WriteUInt32(activity.GoalCount); - - buf.WriteInt32(activity.skill_id); - buf.WriteInt32(activity.spell_id); - buf.WriteInt32(activity.ZoneIDs.empty() ? 0 : activity.ZoneIDs.front()); - buf.WriteString(activity.desc_override); - } - } - - auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); - - c->QueuePacket(outapp); - safe_delete(outapp); - -} - -void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *TaskList) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSelector for %i Tasks", TaskCount); - - int PlayerLevel = c->GetLevel(); - - // Check if any of the tasks exist - for (int i = 0; i < TaskCount; i++) - if (Tasks[TaskList[i]] != nullptr) - break; - - int ValidTasks = 0; - - for (int i = 0; i < TaskCount; i++) { - if (!AppropriateLevel(TaskList[i], PlayerLevel)) - continue; - if (c->IsTaskActive(TaskList[i])) - continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) - continue; - - ValidTasks++; - } - - if (ValidTasks == 0) - return; - - SerializeBuffer buf(50 * ValidTasks); - - buf.WriteUInt32(ValidTasks); // TaskCount - buf.WriteUInt32(2); // Type, valid values: 0-3. 0 = Task, 1 = Shared Task, 2 = Quest, 3 = ??? -- should fix maybe some day, but we let more than 1 type through :P - // so I guess an NPC can only offer one type of quests or we can only open a selection with one type :P (so quest call can tell us I guess) - // this is also sent in OP_TaskDescription - buf.WriteUInt32(mob->GetID()); // TaskGiver - - for (int i = 0; i < TaskCount; i++) { // max 40 - if (!AppropriateLevel(TaskList[i], PlayerLevel)) - continue; - if (c->IsTaskActive(TaskList[i])) - continue; - if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) - continue; - - buf.WriteUInt32(TaskList[i]); // TaskID - buf.WriteFloat(1.0f); // affects color, difficulty? - buf.WriteUInt32(Tasks[TaskList[i]]->Duration); - buf.WriteUInt32(static_cast(Tasks[TaskList[i]]->dur_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited - - buf.WriteString(Tasks[TaskList[i]]->Title); // max 64 with null - buf.WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null - - buf.WriteUInt8(0); // Has reward set flag - buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount); // ActivityCount - - for (int j = 0; j < Tasks[TaskList[i]]->ActivityCount; ++j) { - buf.WriteUInt32(j); // ActivityNumber - auto &activity = Tasks[TaskList[i]]->Activity[j]; - buf.WriteUInt32(activity.Type); // ActivityType - buf.WriteUInt32(0); // solo, group, raid? - buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar) - - // this string is item names - buf.WriteLengthString(activity.item_list); - - buf.WriteUInt32(activity.GoalCount); // GoalCount - - // this string is skill IDs? probably one of the "use on" tasks - buf.WriteLengthString(activity.skill_list); - - // this string is spell IDs? probably one of the "use on" tasks - buf.WriteLengthString(activity.spell_list); - - //buf.WriteString(itoa(Tasks[TaskList[i]]->Activity[ActivityID].ZoneID)); - buf.WriteString(activity.zones); // Zone number in ascii max length 64, can be multiple with separated by ; - buf.WriteString(activity.desc_override); // max length 128 -- overrides the automatic descriptions - // this doesn't appear to be shown to the client at all and isn't the same as zones ... defaults to '0' though - buf.WriteString(activity.zones); // Zone number in ascii max length 64, probably can be separated by ; too, haven't found it used - } - } - - auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf); - - c->QueuePacket(outapp); - safe_delete(outapp); - -} - -int TaskManager::GetActivityCount(int TaskID) { - - // Return the total number of activities in a particular task. - - if((TaskID>0) && (TaskIDActivityCount; - - return 0; - -} - -void TaskManager::ExplainTask(Client*c, int TaskID) { - - // TODO: This method is not finished (hardly started). It was intended to - // explain in English, what each activity did, conditions for step unlocking, etc. - // - return; - - if(!c) return; - - if((TaskID<=0) || (TaskID>=MAXTASKS)) { - c->Message(Chat::White, "TaskID out-of-range."); - return; - } - - if(Tasks[TaskID] == nullptr) { - c->Message(Chat::White, "Task does not exist."); - return; - } - - char Explanation[1000], *ptr; - c->Message(Chat::White, "Task %4i: Title: %s", TaskID, Tasks[TaskID]->Description.c_str()); - c->Message(Chat::White, "%3i Activities", Tasks[TaskID]->ActivityCount); - ptr = Explanation; - for(int i=0; iActivityCount; i++) { - - sprintf(ptr, "Act: %3i: ", i); ptr = ptr + strlen(ptr); - switch(Tasks[TaskID]->Activity[i].Type) { - case ActivityDeliver: - sprintf(ptr, "Deliver"); - break; - } - - } -} - -ClientTaskState::ClientTaskState() { - - ActiveTaskCount = 0; - LastCompletedTaskLoaded = 0; - CheckedTouchActivities = false; - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - ActiveQuests[i].slot = i; - ActiveQuests[i].TaskID = TASKSLOTEMPTY; - } - - ActiveTask.slot = 0; - ActiveTask.TaskID = TASKSLOTEMPTY; - // TODO: shared task -} - -ClientTaskState::~ClientTaskState() { -} - - -int ClientTaskState::GetActiveTaskID(int index) { - - // Return the TaskID from the client's specified Active Task slot. - - if((index<0) || (index>=MAXACTIVEQUESTS)) return 0; - - return ActiveQuests[index].TaskID; -} - -static void DeleteCompletedTaskFromDatabase(int charID, int taskID) { - - Log(Logs::General, Logs::Tasks, "[UPDATE] DeleteCompletedTasksFromDatabase. CharID = %i, TaskID = %i", charID, taskID); - - const std::string query = StringFormat("DELETE FROM completed_tasks WHERE charid=%i AND taskid = %i", charID, taskID); - auto results = database.QueryDatabase(query); - if(!results.Success()) { - return; - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] Delete query %s", query.c_str()); -} - -bool ClientTaskState::UnlockActivities(int CharID, ClientTaskInformation &task_info) -{ - bool AllActivitiesComplete = true; - - TaskInformation* Task = taskmanager->Tasks[task_info.TaskID]; - - if (Task == nullptr) - return true; - - // On loading the client state, all activities that are not completed, are - // marked as hidden. For Sequential (non-stepped) mode, we mark the first - // activity as active if not complete. - Log(Logs::General, Logs::Tasks, "[UPDATE] CharID: %i Task: %i Sequence mode is %i", - CharID, task_info.TaskID, Task->SequenceMode); - - if (Task->SequenceMode == ActivitiesSequential) { - if (task_info.Activity[0].State != ActivityCompleted) - task_info.Activity[0].State = ActivityActive; - - // Enable the next Hidden task. - for (int i = 0; i < Task->ActivityCount; i++) { - if ((task_info.Activity[i].State == ActivityActive) && - (!Task->Activity[i].Optional)) { - AllActivitiesComplete = false; - break; - } - - if (task_info.Activity[i].State == ActivityHidden) { - task_info.Activity[i].State = ActivityActive; - AllActivitiesComplete = false; - break; - } - } - - if (AllActivitiesComplete && RuleB(TaskSystem, RecordCompletedTasks)) { - if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] KeepOneRecord enabled"); - auto Iterator = CompletedTasks.begin(); - int ErasedElements = 0; - while (Iterator != CompletedTasks.end()) { - int TaskID = (*Iterator).TaskID; - if (TaskID == task_info.TaskID) { - Iterator = CompletedTasks.erase(Iterator); - ErasedElements++; - } else - ++Iterator; - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] Erased Element count is %i", ErasedElements); - - if (ErasedElements) { - LastCompletedTaskLoaded -= ErasedElements; - DeleteCompletedTaskFromDatabase(CharID, task_info.TaskID); - } - } - - CompletedTaskInformation cti; - cti.TaskID = task_info.TaskID; - cti.CompletedTime = time(nullptr); - - for (int i = 0; i < Task->ActivityCount; i++) - cti.ActivityDone[i] = (task_info.Activity[i].State == ActivityCompleted); - - CompletedTasks.push_back(cti); - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] Returning sequential task, AllActivitiesComplete is %i", - AllActivitiesComplete); - - return AllActivitiesComplete; - } - - // Stepped Mode - // TODO: This code is probably more complex than it needs to be - - bool CurrentStepComplete = true; - - Log(Logs::General, Logs::Tasks, "[UPDATE] Current Step is %i, Last Step is %i", task_info.CurrentStep, - Task->LastStep); - // If CurrentStep is -1, this is the first call to this method since loading the - // client state. Unlock all activities with a step number of 0 - - if (task_info.CurrentStep == -1) { - for (int i = 0; i < Task->ActivityCount; i++) { - if (Task->Activity[i].StepNumber == 0 && task_info.Activity[i].State == ActivityHidden) { - task_info.Activity[i].State = ActivityActive; - // task_info.Activity[i].Updated=true; - } - } - task_info.CurrentStep = 0; - } - - for (int Step = task_info.CurrentStep; Step <= Task->LastStep; Step++) { - for (int Activity = 0; Activity < Task->ActivityCount; Activity++) { - if (Task->Activity[Activity].StepNumber == (int)task_info.CurrentStep) { - if ((task_info.Activity[Activity].State != ActivityCompleted) && - (!Task->Activity[Activity].Optional)) { - CurrentStepComplete = false; - AllActivitiesComplete = false; - break; - } - } - } - if (!CurrentStepComplete) - break; - task_info.CurrentStep++; - } - - if (AllActivitiesComplete) { - if (RuleB(TaskSystem, RecordCompletedTasks)) { - // If we are only keeping one completed record per task, and the player has done - // the same task again, erase the previous completed entry for this task. - if (RuleB(TasksSystem, KeepOneRecordPerCompletedTask)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] KeepOneRecord enabled"); - auto Iterator = CompletedTasks.begin(); - int ErasedElements = 0; - - while (Iterator != CompletedTasks.end()) { - int TaskID = (*Iterator).TaskID; - if (TaskID == task_info.TaskID) { - Iterator = CompletedTasks.erase(Iterator); - ErasedElements++; - } else - ++Iterator; - } - - Log(Logs::General, Logs::Tasks, "[UPDATE] Erased Element count is %i", ErasedElements); - - if (ErasedElements) { - LastCompletedTaskLoaded -= ErasedElements; - DeleteCompletedTaskFromDatabase(CharID, task_info.TaskID); - } - } - - CompletedTaskInformation cti; - cti.TaskID = task_info.TaskID; - cti.CompletedTime = time(nullptr); - - for (int i = 0; i < Task->ActivityCount; i++) - cti.ActivityDone[i] = (task_info.Activity[i].State == ActivityCompleted); - - CompletedTasks.push_back(cti); - } - return true; - } - - // Mark all non-completed tasks in the current step as active - // - for (int Activity = 0; Activity < Task->ActivityCount; Activity++) { - if ((Task->Activity[Activity].StepNumber == (int)task_info.CurrentStep) && - (task_info.Activity[Activity].State == ActivityHidden)) { - task_info.Activity[Activity].State = ActivityActive; - task_info.Activity[Activity].Updated = true; - } - } - - return false; -} - -void ClientTaskState::UpdateTasksOnKill(Client *c, int NPCTypeID) { - - UpdateTasksByNPC(c, ActivityKill, NPCTypeID); - -} - -bool ClientTaskState::UpdateTasksOnSpeakWith(Client *c, int NPCTypeID) { - - return UpdateTasksByNPC(c, ActivitySpeakWith, NPCTypeID); - -} - -bool ClientTaskState::UpdateTasksByNPC(Client *c, int ActivityType, int NPCTypeID) { - - int Ret = false; - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasks for NPCTypeID: %d", NPCTypeID); - - // If the client has no tasks, there is nothing further to check. - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return false; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) - continue; - - // Check if there are any active kill activities for this task - - auto Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - return false; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in Kill activities - if (Task->Activity[j].Type != ActivityType) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Task: %i, Activity %i, Activity type %i for NPC %i failed zone " - "check", - c->GetName(), cur_task->TaskID, j, ActivityType, NPCTypeID); - continue; - } - // Is the activity to kill this type of NPC ? - switch (Task->Activity[j].GoalMethod) { - - case METHODSINGLEID: - if (Task->Activity[j].GoalID != NPCTypeID) - continue; - break; - - case METHODLIST: - if (!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, NPCTypeID)) - continue; - break; - - default: - // If METHODQUEST, don't update the activity here - continue; - } - // We found an active task to kill this type of NPC, so increment the done count - Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ByNPC"); - IncrementDoneCount(c, Task, cur_task->slot, j); - Ret = true; - } - } - - return Ret; -} - -int ClientTaskState::ActiveSpeakTask(int NPCTypeID) { - - // This method is to be used from Perl quests only and returns the TaskID of the first - // active task found which has an active SpeakWith activity for this NPC. - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return 0; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) - continue; - - TaskInformation* Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - continue; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - if (Task->Activity[j].Type != ActivitySpeakWith) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) - continue; - // Is the activity to speak with this type of NPC ? - if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID) - return cur_task->TaskID; - } - } - return 0; -} - -int ClientTaskState::ActiveSpeakActivity(int NPCTypeID, int TaskID) { - - // This method is to be used from Perl quests only and returns the ActivityID of the first - // active activity found in the specified task which is to SpeakWith this NPC. - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return -1; - if (TaskID <= 0 || TaskID >= MAXTASKS) - return -1; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID != TaskID) - continue; - - TaskInformation* Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - continue; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - if (Task->Activity[j].Type != ActivitySpeakWith) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) - continue; - // Is the activity to speak with this type of NPC ? - if (Task->Activity[j].GoalMethod == METHODQUEST && Task->Activity[j].GoalID == NPCTypeID) - return j; - } - return 0; - } - return 0; -} - -void ClientTaskState::UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count) { - - // This method updates the client's task activities of the specified type which relate - // to the specified item. - // - // Type should be one of ActivityLoot, ActivityTradeSkill, ActivityFish or ActivityForage - - // If the client has no tasks, there is nothing further to check. - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForItem(%d,%d)", Type, ItemID); - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) - continue; - - // Check if there are any active loot activities for this task - - TaskInformation* Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - return; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in the ActivityType we were called with - if (Task->Activity[j].Type != (int)Type) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Activity type %i for Item %i failed zone check", - c->GetName(), Type, ItemID); - continue; - } - // Is the activity related to this item ? - // - switch(Task->Activity[j].GoalMethod) { - - case METHODSINGLEID: - if(Task->Activity[j].GoalID != ItemID) continue; - break; - - case METHODLIST: - if(!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, ItemID)) continue; - break; - - default: - // If METHODQUEST, don't update the activity here - continue; - } - // We found an active task related to this item, so increment the done count - Log(Logs::General, Logs::Tasks, "[UPDATE] Calling increment done count ForItem"); - IncrementDoneCount(c, Task, cur_task->slot, j, Count); - } - } - - return; -} - -void ClientTaskState::UpdateTasksOnExplore(Client *c, int ExploreID) -{ - - // If the client has no tasks, there is nothing further to check. - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnExplore(%i)", ExploreID); - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) - continue; - - // Check if there are any active explore activities for this task - - TaskInformation *Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - return; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in explore activities - if (Task->Activity[j].Type != ActivityExplore) - continue; - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Explore exploreid %i failed zone check", c->GetName(), - ExploreID); - continue; - } - // Is the activity to explore this area id ? - switch (Task->Activity[j].GoalMethod) { - - case METHODSINGLEID: - if (Task->Activity[j].GoalID != ExploreID) - continue; - break; - - case METHODLIST: - if (!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, ExploreID)) - continue; - break; - - default: - // If METHODQUEST, don't update the activity here - continue; - } - // We found an active task to explore this area, so set done count to goal count - // (Only a goal count of 1 makes sense for explore activities?) - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on explore"); - IncrementDoneCount(c, Task, cur_task->slot, j, - Task->Activity[j].GoalCount - cur_task->Activity[j].DoneCount); - } - } - - return; -} - -bool ClientTaskState::UpdateTasksOnDeliver(Client *c, std::list &Items, int Cash, int NPCTypeID) -{ - bool Ret = false; - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksForOnDeliver(%d)", NPCTypeID); - - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return false; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) - continue; - - // Check if there are any active deliver activities for this task - - TaskInformation *Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - return false; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in Deliver activities - if (Task->Activity[j].Type != ActivityDeliver && Task->Activity[j].Type != ActivityGiveCash) - continue; - // Is there a zone restriction on the activity ? - if (!Task->Activity[j].CheckZone(zone->GetZoneID())) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] Char: %s Deliver activity failed zone check (current zone %i, need zone " - "%s", - c->GetName(), zone->GetZoneID(), Task->Activity[j].zones.c_str()); - continue; - } - // Is the activity to deliver to this NPCTypeID ? - if (Task->Activity[j].DeliverToNPC != NPCTypeID) - continue; - // Is the activity related to these items ? - // - if ((Task->Activity[j].Type == ActivityGiveCash) && Cash) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveCash"); - IncrementDoneCount(c, Task, i, j, Cash); - Ret = true; - } else { - for (auto &k : Items) { - switch (Task->Activity[j].GoalMethod) { - - case METHODSINGLEID: - if (Task->Activity[j].GoalID != k->GetID()) - continue; - break; - - case METHODLIST: - if (!taskmanager->GoalListManager.IsInList(Task->Activity[j].GoalID, - k->GetID())) - continue; - break; - - default: - // If METHODQUEST, don't update the activity here - continue; - } - // We found an active task related to this item, so increment the done count - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on GiveItem"); - IncrementDoneCount(c, Task, cur_task->slot, j, k->GetCharges() <= 0 ? 1 : k->GetCharges()); - Ret = true; - } - } - } - } - - return Ret; -} - -void ClientTaskState::UpdateTasksOnTouch(Client *c, int ZoneID) -{ - // If the client has no tasks, there is nothing further to check. - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState::UpdateTasksOnTouch(%i)", ZoneID); - if (!taskmanager || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) // could be better ... - return; - - // loop over the union of tasks and quests - for (int i = 0; i < MAXACTIVEQUESTS + 1; i++) { - auto cur_task = &ActiveTasks[i]; - if (cur_task->TaskID == TASKSLOTEMPTY) - continue; - - // Check if there are any active explore activities for this task - - TaskInformation *Task = taskmanager->Tasks[cur_task->TaskID]; - - if (Task == nullptr) - return; - - for (int j = 0; j < Task->ActivityCount; j++) { - // We are not interested in completed or hidden activities - if (cur_task->Activity[j].State != ActivityActive) - continue; - // We are only interested in touch activities - if (Task->Activity[j].Type != ActivityTouch) - continue; - if (Task->Activity[j].GoalMethod != METHODSINGLEID) - continue; - if (!Task->Activity[j].CheckZone(ZoneID)) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Char: %s Touch activity failed zone check", - c->GetName()); - continue; - } - // We found an active task to zone into this zone, so set done count to goal count - // (Only a goal count of 1 makes sense for touch activities?) - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment on Touch"); - IncrementDoneCount(c, Task, cur_task->slot, j, - Task->Activity[j].GoalCount - cur_task->Activity[j].DoneCount); - } - } - - return; -} - -void ClientTaskState::IncrementDoneCount(Client *c, TaskInformation *Task, int TaskIndex, int ActivityID, int Count, - bool ignore_quest_update) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] IncrementDoneCount"); - - auto info = GetClientTaskInfo(Task->type, TaskIndex); - - if (info == nullptr) - return; - - info->Activity[ActivityID].DoneCount += Count; - - if(info->Activity[ActivityID].DoneCount > Task->Activity[ActivityID].GoalCount) - info->Activity[ActivityID].DoneCount = Task->Activity[ActivityID].GoalCount; - - if (!ignore_quest_update){ - char buf[24]; - snprintf(buf, 23, "%d %d %d", info->Activity[ActivityID].DoneCount, info->Activity[ActivityID].ActivityID, info->TaskID); - buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_UPDATE, c, buf, 0); - } - - info->Activity[ActivityID].Updated=true; - // Have we reached the goal count for this activity ? - if(info->Activity[ActivityID].DoneCount >= Task->Activity[ActivityID].GoalCount) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Done (%i) = Goal (%i) for Activity %i", - info->Activity[ActivityID].DoneCount, - Task->Activity[ActivityID].GoalCount, - ActivityID); - - // Flag the activity as complete - info->Activity[ActivityID].State = ActivityCompleted; - // Unlock subsequent activities for this task - bool TaskComplete = UnlockActivities(c->CharacterID(), *info); - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskCompleted is %i", TaskComplete); - // and by the 'Task Stage Completed' message - c->SendTaskActivityComplete(info->TaskID, ActivityID, TaskIndex, Task->type); - // Send the updated task/activity list to the client - taskmanager->SendSingleActiveTaskToClient(c, *info, TaskComplete, false); - // Inform the client the task has been updated, both by a chat message - c->Message(Chat::White, "Your task '%s' has been updated.", Task->Title.c_str()); - - if(Task->Activity[ActivityID].GoalMethod != METHODQUEST) { - if (!ignore_quest_update){ - char buf[24]; - snprintf(buf, 23, "%d %d", info->TaskID, info->Activity[ActivityID].ActivityID); - buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_STAGE_COMPLETE, c, buf, 0); - } - /* QS: PlayerLogTaskUpdates :: Update */ - if (RuleB(QueryServ, PlayerLogTaskUpdates)){ - std::string event_desc = StringFormat("Task Stage Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", info->TaskID, info->Activity[ActivityID].ActivityID, info->Activity[ActivityID].DoneCount, c->GetZoneID(), c->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Task_Updates, c->CharacterID(), event_desc); - } - } - - // If this task is now complete, the Completed tasks will have been - // updated in UnlockActivities. Send the completed task list to the - // client. This is the same sequence the packets are sent on live. - if(TaskComplete) { - char buf[24]; - snprintf(buf, 23, "%d %d %d", info->Activity[ActivityID].DoneCount, info->Activity[ActivityID].ActivityID, info->TaskID); - buf[23] = '\0'; - parse->EventPlayer(EVENT_TASK_COMPLETE, c, buf, 0); - - /* QS: PlayerLogTaskUpdates :: Complete */ - if (RuleB(QueryServ, PlayerLogTaskUpdates)){ - std::string event_desc = StringFormat("Task Complete :: taskid:%i activityid:%i donecount:%i in zoneid:%i instid:%i", info->TaskID, info->Activity[ActivityID].ActivityID, info->Activity[ActivityID].DoneCount, c->GetZoneID(), c->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_Task_Updates, c->CharacterID(), event_desc); - } - - taskmanager->SendCompletedTasksToClient(c, this); - c->SendTaskActivityComplete(info->TaskID, 0, TaskIndex, Task->type, 0); - taskmanager->SaveClientState(c, this); - //c->SendTaskComplete(TaskIndex); - c->CancelTask(TaskIndex, Task->type); - //if(Task->RewardMethod != METHODQUEST) RewardTask(c, Task); - // If Experience and/or cash rewards are set, reward them from the task even if RewardMethod is METHODQUEST - RewardTask(c, Task); - //RemoveTask(c, TaskIndex); - - } - - } else { - // Send an update packet for this single activity - taskmanager->SendTaskActivityLong(c, info->TaskID, ActivityID, TaskIndex, - Task->Activity[ActivityID].Optional); - } -} - -void ClientTaskState::RewardTask(Client *c, TaskInformation *Task) { - - if(!Task || !c) return; - - const EQEmu::ItemData* Item; - std::vector RewardList; - - switch(Task->RewardMethod) { - - case METHODSINGLEID: - { - if(Task->RewardID) { - c->SummonItem(Task->RewardID); - Item = database.GetItem(Task->RewardID); - if(Item) - c->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); - } - break; - } - case METHODLIST: - { - RewardList = taskmanager->GoalListManager.GetListContents(Task->RewardID); - for(unsigned int i=0; iSummonItem(RewardList[i]); - Item = database.GetItem(RewardList[i]); - if(Item) - c->Message(Chat::Yellow, "You receive %s as a reward.", Item->Name); - } - break; - } - default: - { - // Nothing special done for METHODQUEST - break; - } - } - - if (!Task->completion_emote.empty()) - c->SendColoredText(Chat::Yellow, Task->completion_emote); // unsure if they use this packet or color, should work - - // just use normal NPC faction ID stuff - if (Task->faction_reward) - c->SetFactionLevel(c->CharacterID(), Task->faction_reward, c->GetBaseClass(), c->GetBaseRace(), c->GetDeity()); - - if(Task->CashReward) { - int Plat, Gold, Silver, Copper; - - Copper = Task->CashReward; - c->AddMoneyToPP(Copper, true); - - Plat = Copper / 1000; - Copper = Copper - (Plat * 1000); - Gold = Copper / 100; - Copper = Copper - (Gold * 100); - Silver = Copper / 10; - Copper = Copper - (Silver * 10); - - std::string CashMessage; - - if (Plat>0){ - CashMessage = "You receive "; - CashMessage += itoa(Plat); - CashMessage += " platinum"; - } - if (Gold>0){ - if (CashMessage.length()==0){ - CashMessage = "You receive "; - } - else{ - CashMessage += ","; - } - CashMessage += itoa(Gold); - CashMessage += " gold"; - } - if(Silver>0){ - if (CashMessage.length()==0){ - CashMessage = "You receive "; - } - else{ - CashMessage += ","; - } - CashMessage += itoa(Silver); - CashMessage += " silver"; - } - if(Copper>0){ - if (CashMessage.length()==0){ - CashMessage = "You receive "; - } - else{ - CashMessage += ","; - } - CashMessage += itoa(Copper); - CashMessage += " copper"; - } - CashMessage += " pieces."; - c->Message(Chat::Yellow,CashMessage.c_str()); - } - int32 EXPReward = Task->XPReward; - if(EXPReward > 0) { - c->AddEXP(EXPReward); - } - if(EXPReward < 0) { - uint32 PosReward = EXPReward * -1; - // Minimal Level Based Exp Reward Setting is 101 (1% exp at level 1) - if (PosReward > 100 && PosReward < 25700) { - uint8 MaxLevel = PosReward / 100; - uint8 ExpPercent = PosReward - (MaxLevel * 100); - c->AddLevelBasedExp(ExpPercent, MaxLevel); - } - } - - c->SendSound(); -} - -bool ClientTaskState::IsTaskActive(int TaskID) -{ - if (ActiveTask.TaskID == TaskID) - return true; - - if (ActiveTaskCount == 0 || TaskID == 0) - return false; - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) - return true; - } - - return false; -} - -void ClientTaskState::FailTask(Client *c, int TaskID) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] FailTask %i, ActiveTaskCount is %i", TaskID, ActiveTaskCount); - - if (ActiveTask.TaskID == TaskID) { - c->SendTaskFailed(TaskID, 0, TaskType::Task); - // Remove the task from the client - c->CancelTask(0, TaskType::Task); - return; - } - - // TODO: shared tasks - - if (ActiveTaskCount == 0) - return; - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { - c->SendTaskFailed(ActiveQuests[i].TaskID, i, TaskType::Quest); - // Remove the task from the client - c->CancelTask(i, TaskType::Quest); - return; - } - } -} - -// TODO: Shared tasks -bool ClientTaskState::IsTaskActivityActive(int TaskID, int ActivityID) -{ - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i).", TaskID, ActivityID); - // Quick sanity check - if (ActivityID < 0) - return false; - if (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY) - return false; - - int ActiveTaskIndex = -1; - auto type = TaskType::Task; - - if (ActiveTask.TaskID == TaskID) - ActiveTaskIndex = 0; - - if (ActiveTaskIndex == -1) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { - ActiveTaskIndex = i; - type = TaskType::Quest; - break; - } - } - } - - // The client does not have this task - if (ActiveTaskIndex == -1) - return false; - - auto info = GetClientTaskInfo(type, ActiveTaskIndex); - - if (info == nullptr) - return false; - - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; - - // The task is invalid - if (Task == nullptr) - return false; - - // The ActivityID is out of range - if (ActivityID >= Task->ActivityCount) - return false; - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState IsTaskActivityActive(%i, %i). State is %i ", TaskID, - ActivityID, info->Activity[ActivityID].State); - - return (info->Activity[ActivityID].State == ActivityActive); -} - -void ClientTaskState::UpdateTaskActivity(Client *c, int TaskID, int ActivityID, int Count, bool ignore_quest_update /*= false*/) -{ - - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, %i).", TaskID, ActivityID, - Count); - - // Quick sanity check - if (ActivityID < 0 || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) - return; - - int ActiveTaskIndex = -1; - auto type = TaskType::Task; - - if (ActiveTask.TaskID == TaskID) - ActiveTaskIndex = 0; - - if (ActiveTaskIndex == -1) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { - ActiveTaskIndex = i; - type = TaskType::Quest; - break; - } - } - } - - // The client does not have this task - if (ActiveTaskIndex == -1) - return; - - auto info = GetClientTaskInfo(type, ActiveTaskIndex); - - if (info == nullptr) - return; - - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; - - // The task is invalid - if (Task == nullptr) - return; - - // The ActivityID is out of range - if (ActivityID >= Task->ActivityCount) - return; - - // The Activity is not currently active - if (info->Activity[ActivityID].State != ActivityActive) - return; - Log(Logs::General, Logs::Tasks, "[UPDATE] Increment done count on UpdateTaskActivity"); - IncrementDoneCount(c, Task, ActiveTaskIndex, ActivityID, Count, ignore_quest_update); -} - -void ClientTaskState::ResetTaskActivity(Client *c, int TaskID, int ActivityID) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState UpdateTaskActivity(%i, %i, 0).", TaskID, ActivityID); - - // Quick sanity check - if (ActivityID < 0 || (ActiveTaskCount == 0 && ActiveTask.TaskID == TASKSLOTEMPTY)) - return; - - int ActiveTaskIndex = -1; - auto type = TaskType::Task; - - if (ActiveTask.TaskID == TaskID) - ActiveTaskIndex = 0; - - if (ActiveTaskIndex == -1) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { - ActiveTaskIndex = i; - type = TaskType::Quest; - break; - } - } - } - - // The client does not have this task - if (ActiveTaskIndex == -1) - return; - - auto info = GetClientTaskInfo(type, ActiveTaskIndex); - - if (info == nullptr) - return; - - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; - - // The task is invalid - if (Task == nullptr) - return; - - // The ActivityID is out of range - if (ActivityID >= Task->ActivityCount) - return; - - // The Activity is not currently active - if (info->Activity[ActivityID].State != ActivityActive) - return; - - Log(Logs::General, Logs::Tasks, "[UPDATE] ResetTaskActivityCount"); - - info->Activity[ActivityID].DoneCount = 0; - - info->Activity[ActivityID].Updated = true; - - // Send an update packet for this single activity - taskmanager->SendTaskActivityLong(c, info->TaskID, ActivityID, ActiveTaskIndex, - Task->Activity[ActivityID].Optional); -} - -void ClientTaskState::ShowClientTasks(Client *c) -{ - c->Message(Chat::White, "Task Information:"); - if (ActiveTask.TaskID != TASKSLOTEMPTY) { - c->Message(Chat::White, "Task: %i %s", ActiveTask.TaskID, taskmanager->Tasks[ActiveTask.TaskID]->Title.c_str()); - c->Message(Chat::White, " Description: [%s]\n", taskmanager->Tasks[ActiveTask.TaskID]->Description.c_str()); - for (int j = 0; j < taskmanager->GetActivityCount(ActiveTask.TaskID); j++) { - c->Message(Chat::White, " Activity: %2d, DoneCount: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - ActiveTask.Activity[j].ActivityID, ActiveTask.Activity[j].DoneCount, - ActiveTask.Activity[j].State); - } - } - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TASKSLOTEMPTY) - continue; - - c->Message(Chat::White, "Quest: %i %s", ActiveQuests[i].TaskID, - taskmanager->Tasks[ActiveQuests[i].TaskID]->Title.c_str()); - c->Message(Chat::White, " Description: [%s]\n", taskmanager->Tasks[ActiveQuests[i].TaskID]->Description.c_str()); - for (int j = 0; j < taskmanager->GetActivityCount(ActiveQuests[i].TaskID); j++) { - c->Message(Chat::White, " Activity: %2d, DoneCount: %2d, Status: %d (0=Hidden, 1=Active, 2=Complete)", - ActiveQuests[i].Activity[j].ActivityID, ActiveQuests[i].Activity[j].DoneCount, - ActiveQuests[i].Activity[j].State); - } - } -} - -// TODO: Shared Task -int ClientTaskState::TaskTimeLeft(int TaskID) -{ - if (ActiveTask.TaskID == TaskID) { - int Now = time(nullptr); - - TaskInformation *Task = taskmanager->Tasks[TaskID]; - - if (Task == nullptr) - return -1; - - if (!Task->Duration) - return -1; - - int TimeLeft = (ActiveTask.AcceptedTime + Task->Duration - Now); - - return (TimeLeft > 0 ? TimeLeft : 0); - } - - if (ActiveTaskCount == 0) - return -1; - - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - - if (ActiveQuests[i].TaskID != TaskID) - continue; - - int Now = time(nullptr); - - TaskInformation *Task = taskmanager->Tasks[ActiveQuests[i].TaskID]; - - if (Task == nullptr) - return -1; - - if (!Task->Duration) - return -1; - - int TimeLeft = (ActiveQuests[i].AcceptedTime + Task->Duration - Now); - - // If Timeleft is negative, return 0, else return the number of seconds left - - return (TimeLeft > 0 ? TimeLeft : 0); - } - - return -1; -} - -int ClientTaskState::IsTaskCompleted(int TaskID) { - - // Returns: -1 if RecordCompletedTasks is not true - // +1 if the task has been completed - // 0 if the task has not been completed - - if(!(RuleB(TaskSystem, RecordCompletedTasks))) return -1; - - for(unsigned int i=0; i= MAXTASKS)) return false; - - TaskInformation* Task = taskmanager->Tasks[TaskID]; - - if(Task == nullptr) return false; - - return Task->Repeatable; -} - -bool ClientTaskState::TaskOutOfTime(TaskType type, int Index) -{ - // Returns true if the Task in the specified slot has a time limit that has been exceeded. - auto info = GetClientTaskInfo(type, Index); - - if (info == nullptr) - return false; - - // make sure the TaskID is at least maybe in our array - if (info->TaskID <= 0 || info->TaskID >= MAXTASKS) - return false; - - int Now = time(nullptr); - - TaskInformation *Task = taskmanager->Tasks[info->TaskID]; - - if (Task == nullptr) - return false; - - return (Task->Duration && (info->AcceptedTime + Task->Duration <= Now)); -} - -void ClientTaskState::TaskPeriodicChecks(Client *c) -{ - if (ActiveTask.TaskID != TASKSLOTEMPTY) { - if (TaskOutOfTime(TaskType::Task, 0)) { - // Send Red Task Failed Message - c->SendTaskFailed(ActiveTask.TaskID, 0, TaskType::Task); - // Remove the task from the client - c->CancelTask(0, TaskType::Task); - // It is a conscious decision to only fail one task per call to this method, - // otherwise the player will not see all the failed messages where multiple - // tasks fail at the same time. - return; - } - } - - // TODO: shared tasks -- although that will probably be manager in world checking and telling zones to fail us - - if (ActiveTaskCount == 0) - return; - - // Check for tasks that have failed because they have not been completed in the specified time - // - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TASKSLOTEMPTY) - continue; - - if (TaskOutOfTime(TaskType::Quest, i)) { - // Send Red Task Failed Message - c->SendTaskFailed(ActiveQuests[i].TaskID, i, TaskType::Quest); - // Remove the task from the client - c->CancelTask(i, TaskType::Quest); - // It is a conscious decision to only fail one task per call to this method, - // otherwise the player will not see all the failed messages where multiple - // tasks fail at the same time. - break; - } - } - - // Check for activities that require zoning into a specific zone. - // This is done in this method because it gives an extra few seconds for the client screen to display - // the zone before we send the 'Task Activity Completed' message. - // - if (!CheckedTouchActivities) { - UpdateTasksOnTouch(c, zone->GetZoneID()); - CheckedTouchActivities = true; + if (task_state) { + task_state->CancelAllTasks(this); + safe_delete(task_state); } } @@ -2475,7 +48,7 @@ void Client::SendTaskComplete(int TaskIndex) { tcs = (TaskComplete_Struct*)outapp->pBuffer; // I have seen unknown0 as non-zero. It always seems to match the value in the first word of the - // Task Activity Complete packet sent immediately prior to it. + // Task activity_information Complete packet sent immediately prior to it. //tcs->unknown00 = 0x00000000; tcs->unknown00 = TaskIndex; // I have only seen 0x00000002 in the next field. This is a common 'unknown' value in the task packets. @@ -2493,1034 +66,58 @@ void Client::SendTaskComplete(int TaskIndex) { } #endif -void ClientTaskState::SendTaskHistory(Client *c, int TaskIndex) { - - Log(Logs::General, Logs::Tasks, "[UPDATE] Task History Requested for Completed Task Index %i", TaskIndex); - - // We only sent the most recent 50 completed tasks, so we need to offset the Index the client sent to us. - - int AdjustedTaskIndex = TaskIndex; - - if(CompletedTasks.size() > 50) - AdjustedTaskIndex += (CompletedTasks.size() - 50); - - if((AdjustedTaskIndex < 0) || (AdjustedTaskIndex >= (int)CompletedTasks.size())) return; - - int TaskID = CompletedTasks[AdjustedTaskIndex].TaskID; - - if((TaskID < 0) || (TaskID > MAXTASKS)) return; - - TaskInformation* Task = taskmanager->Tasks[TaskID]; - - if(Task == nullptr) return; - - TaskHistoryReplyHeader_Struct* ths; - TaskHistoryReplyData1_Struct* thd1; - TaskHistoryReplyData2_Struct* thd2; - - char *Ptr; - - int CompletedActivityCount = 0;; - - int PacketLength = sizeof(TaskHistoryReplyHeader_Struct); - - for(int i=0; iActivityCount; i++) { - if(CompletedTasks[AdjustedTaskIndex].ActivityDone[i]) { - CompletedActivityCount++; - PacketLength = PacketLength + sizeof(TaskHistoryReplyData1_Struct) + - Task->Activity[i].target_name.size() + 1 + - Task->Activity[i].item_list.size() + 1 + - sizeof(TaskHistoryReplyData2_Struct) + - Task->Activity[i].desc_override.size() + 1; - } - } - - auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, PacketLength); - - ths = (TaskHistoryReplyHeader_Struct*)outapp->pBuffer; - - // We use the TaskIndex the client sent in the request - ths->TaskID = TaskIndex; - - ths->ActivityCount = CompletedActivityCount; - - Ptr = (char *) ths + sizeof(TaskHistoryReplyHeader_Struct); - - for(int i=0; iActivityCount; i++) { - if(CompletedTasks[AdjustedTaskIndex].ActivityDone[i]) { - thd1 = (TaskHistoryReplyData1_Struct*)Ptr; - thd1->ActivityType = Task->Activity[i].Type; - Ptr = (char *)thd1 + sizeof(TaskHistoryReplyData1_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].target_name.c_str()); - VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].item_list.c_str()); - thd2 = (TaskHistoryReplyData2_Struct*)Ptr; - thd2->GoalCount = Task->Activity[i].GoalCount; - thd2->unknown04 = 0xffffffff; - thd2->unknown08 = 0xffffffff; - thd2->ZoneID = Task->Activity[i].ZoneIDs.empty() ? 0 : Task->Activity[i].ZoneIDs.front(); - thd2->unknown16 = 0x00000000; - Ptr = (char *)thd2 + sizeof(TaskHistoryReplyData2_Struct); - VARSTRUCT_ENCODE_STRING(Ptr, Task->Activity[i].desc_override.c_str()); - } - } - - - c->QueuePacket(outapp); - safe_delete(outapp); - - - -} - -void Client::SendTaskActivityComplete(int TaskID, int ActivityID, int TaskIndex, TaskType type, int TaskIncomplete) +void Client::SendTaskActivityComplete( + int task_id, + int activity_id, + int task_index, + TaskType task_type, + int task_incomplete +) { - // 0x54eb - - TaskActivityComplete_Struct* tac; + TaskActivityComplete_Struct *task_activity_complete; auto outapp = new EQApplicationPacket(OP_TaskActivityComplete, sizeof(TaskActivityComplete_Struct)); - tac = (TaskActivityComplete_Struct*)outapp->pBuffer; - - tac->TaskIndex = TaskIndex; - tac->TaskType = static_cast(type); - tac->TaskID = TaskID; - tac->ActivityID = ActivityID; - tac->task_completed = 0x00000001; - tac->stage_complete = TaskIncomplete; + task_activity_complete = (TaskActivityComplete_Struct *) outapp->pBuffer; + task_activity_complete->TaskIndex = task_index; + task_activity_complete->TaskType = static_cast(task_type); + task_activity_complete->TaskID = task_id; + task_activity_complete->ActivityID = activity_id; + task_activity_complete->task_completed = 0x00000001; + task_activity_complete->stage_complete = task_incomplete; QueuePacket(outapp); safe_delete(outapp); } -void Client::SendTaskFailed(int TaskID, int TaskIndex, TaskType type) +void Client::SendTaskFailed(int task_id, int task_index, TaskType task_type) { // 0x54eb char buf[24]; - snprintf(buf, 23, "%d", TaskID); + snprintf(buf, 23, "%d", task_id); buf[23] = '\0'; parse->EventPlayer(EVENT_TASK_FAIL, this, buf, 0); - TaskActivityComplete_Struct* tac; + TaskActivityComplete_Struct *task_activity_complete; auto outapp = new EQApplicationPacket(OP_TaskActivityComplete, sizeof(TaskActivityComplete_Struct)); - tac = (TaskActivityComplete_Struct*)outapp->pBuffer; + task_activity_complete = (TaskActivityComplete_Struct *) outapp->pBuffer; + task_activity_complete->TaskIndex = task_index; + task_activity_complete->TaskType = static_cast(task_type); + task_activity_complete->TaskID = task_id; + task_activity_complete->ActivityID = 0; + task_activity_complete->task_completed = 0; //Fail + task_activity_complete->stage_complete = 0; // 0 for task complete or failed. - tac->TaskIndex = TaskIndex; - tac->TaskType = static_cast(type); - tac->TaskID = TaskID; - tac->ActivityID = 0; - tac->task_completed = 0; //Fail - tac->stage_complete = 0; // 0 for task complete or failed. - - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskFailed"); + LogTasks("[SendTaskFailed] Sending failure to client [{}]", GetCleanName()); QueuePacket(outapp); safe_delete(outapp); } -void TaskManager::SendCompletedTasksToClient(Client *c, ClientTaskState *State) { - int PacketLength = 4; - - //vector::const_iterator iterator; - - // The client only display the first 50 Completed Tasks send, so send the 50 most recent - int FirstTaskToSend = 0; - int LastTaskToSend = State->CompletedTasks.size(); - - if(State->CompletedTasks.size() > 50) - FirstTaskToSend = State->CompletedTasks.size() - 50; - - Log(Logs::General, Logs::Tasks, "[UPDATE] Completed Task Count: %i, First Task to send is %i, Last is %i", - State->CompletedTasks.size(), FirstTaskToSend, LastTaskToSend); - /* - for(iterator=State->CompletedTasks.begin(); iterator!=State->CompletedTasks.end(); iterator++) { - int TaskID = (*iterator).TaskID; - if(Tasks[TaskID] == nullptr) continue; - PacketLength = PacketLength + 8 + strlen(Tasks[TaskID]->Title) + 1; - } - */ - for(int i = FirstTaskToSend; iCompletedTasks[i].TaskID; - if(Tasks[TaskID] == nullptr) continue; - PacketLength = PacketLength + 8 + Tasks[TaskID]->Title.size() + 1; - } - - auto outapp = new EQApplicationPacket(OP_CompletedTasks, PacketLength); - char *buf = (char*)outapp->pBuffer; - - //*(uint32 *)buf = State->CompletedTasks.size(); - *(uint32 *)buf = LastTaskToSend - FirstTaskToSend; - buf = buf + 4; - //for(iterator=State->CompletedTasks.begin(); iterator!=State->CompletedTasks.end(); iterator++) { - // int TaskID = (*iterator).TaskID; - for(int i = FirstTaskToSend; iCompletedTasks[i].TaskID; - if(Tasks[TaskID] == nullptr) continue; - *(uint32 *)buf = TaskID; - buf = buf + 4; - - sprintf(buf, "%s", Tasks[TaskID]->Title.c_str()); - buf = buf + strlen(buf) + 1; - //*(uint32 *)buf = (*iterator).CompletedTime; - *(uint32 *)buf = State->CompletedTasks[i].CompletedTime; - buf = buf + 4; - } - - - c->QueuePacket(outapp); - safe_delete(outapp); -} - - - -void TaskManager::SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex) -{ - // This Activity Packet is sent for activities that have not yet been unlocked and appear as ??? - // in the client. - - TaskActivityShort_Struct* tass; - - if (c->ClientVersionBit() & EQEmu::versions::maskRoFAndLater) - { - auto outapp = new EQApplicationPacket(OP_TaskActivity, 25); - outapp->WriteUInt32(ClientTaskIndex); - outapp->WriteUInt32(static_cast(Tasks[TaskID]->type)); - outapp->WriteUInt32(TaskID); - outapp->WriteUInt32(ActivityID); - outapp->WriteUInt32(0); - outapp->WriteUInt32(0xffffffff); - outapp->WriteUInt8(0); - c->FastQueuePacket(&outapp); - - return; - } - - auto outapp = new EQApplicationPacket(OP_TaskActivity, sizeof(TaskActivityShort_Struct)); - - tass = (TaskActivityShort_Struct*)outapp->pBuffer; - - tass->TaskSequenceNumber = ClientTaskIndex; - tass->unknown2 = static_cast(Tasks[TaskID]->type); - tass->TaskID = TaskID; - tass->ActivityID = ActivityID; - tass->unknown3 = 0x000000; - tass->ActivityType = 0xffffffff; - tass->unknown4 = 0x00000000; - - - c->QueuePacket(outapp); - safe_delete(outapp); -} - - - -void TaskManager::SendTaskActivityLong(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, bool Optional, bool TaskComplete) { - - if (c->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) - { - SendTaskActivityNew(c, TaskID, ActivityID, ClientTaskIndex, Optional, TaskComplete); - return; - } - - SerializeBuffer buf(100); - - buf.WriteUInt32(ClientTaskIndex); - buf.WriteUInt32(static_cast(Tasks[TaskID]->type)); - buf.WriteUInt32(TaskID); - buf.WriteUInt32(ActivityID); - buf.WriteUInt32(0); // unknown3 - - // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity description, so it makes - // no difference to the client. All activity updates will be done based on our interal activity types. - if((Tasks[TaskID]->Activity[ActivityID].Type > 0) && Tasks[TaskID]->Activity[ActivityID].Type < 100) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].Type); - else - buf.WriteUInt32(ActivityCastOn); // w/e! - - buf.WriteUInt32(Optional); - buf.WriteUInt32(0); // solo, group, raid - - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].target_name); // target name string - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].item_list); // item name list - - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].GoalCount); - else - // For our internal type GiveCash, where the goal count has the amount of cash that must be given, - // we don't want the donecount and goalcount fields cluttered up with potentially large numbers, so we just - // send a goalcount of 1, and a bit further down, a donecount of 1 if the activity is complete, 0 otherwise. - // The text3 field should decribe the exact activity goal, e.g. give 3500gp to Hasten Bootstrutter. - buf.WriteUInt32(1); - - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].skill_id); - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].spell_id); - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].ZoneIDs.empty() ? 0 : Tasks[TaskID]->Activity[ActivityID].ZoneIDs.front()); - buf.WriteUInt32(0); - - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].desc_override); - - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); - else - // For internal activity types, DoneCount is either 1 if the activity is complete, 0 otherwise. - buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= Tasks[TaskID]->Activity[ActivityID].GoalCount)); - - buf.WriteUInt32(1); // unknown - - auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); - - c->QueuePacket(outapp); - safe_delete(outapp); - -} - -// Used only by RoF+ Clients -void TaskManager::SendTaskActivityNew(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, bool Optional, bool TaskComplete) -{ - SerializeBuffer buf(100); - - buf.WriteUInt32(ClientTaskIndex); // TaskSequenceNumber - buf.WriteUInt32(static_cast(Tasks[TaskID]->type)); // task type - buf.WriteUInt32(TaskID); - buf.WriteUInt32(ActivityID); - buf.WriteUInt32(0); // unknown3 - - // We send our 'internal' types as ActivityCastOn. text3 should be set to the activity description, so it makes - // no difference to the client. All activity updates will be done based on our interal activity types. - if((Tasks[TaskID]->Activity[ActivityID].Type > 0) && Tasks[TaskID]->Activity[ActivityID].Type < 100) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].Type); - else - buf.WriteUInt32(ActivityCastOn); // w/e! - - buf.WriteUInt8(Optional); - buf.WriteUInt32(0); // solo, group, raid - - // One of these unknown fields maybe related to the 'Use On' activity types - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].target_name); // target name string - - buf.WriteLengthString(Tasks[TaskID]->Activity[ActivityID].item_list); // item name list - - // Goal Count - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(Tasks[TaskID]->Activity[ActivityID].GoalCount); - else - buf.WriteUInt32(1); // GoalCount - - // skill ID list ; separated - buf.WriteLengthString(Tasks[TaskID]->Activity[ActivityID].skill_list); - - // spelll ID list ; separated -- unsure wtf we're doing here - buf.WriteLengthString(Tasks[TaskID]->Activity[ActivityID].spell_list); - - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].zones); - buf.WriteUInt32(0); // unknown7 - - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].desc_override); // description override - - if(Tasks[TaskID]->Activity[ActivityID].Type != ActivityGiveCash) - buf.WriteUInt32(c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID)); // DoneCount - else - // For internal activity types, DoneCount is either 1 if the activity is complete, 0 otherwise. - buf.WriteUInt32((c->GetTaskActivityDoneCount(Tasks[TaskID]->type, ClientTaskIndex, ActivityID) >= Tasks[TaskID]->Activity[ActivityID].GoalCount)); - - buf.WriteUInt8(1); // unknown9 - - buf.WriteString(Tasks[TaskID]->Activity[ActivityID].zones); - - auto outapp = new EQApplicationPacket(OP_TaskActivity, buf); - - c->QueuePacket(outapp); - safe_delete(outapp); - -} - -void TaskManager::SendActiveTasksToClient(Client *c, bool TaskComplete) -{ - auto state = c->GetTaskState(); - if (!state) - return; - - for (int TaskIndex = 0; TaskIndex < MAXACTIVEQUESTS + 1; TaskIndex++) { - int TaskID = state->ActiveTasks[TaskIndex].TaskID; - if ((TaskID == 0) || (Tasks[TaskID] == 0)) - continue; - int StartTime = state->ActiveTasks[TaskIndex].AcceptedTime; - - SendActiveTaskDescription(c, TaskID, state->ActiveTasks[TaskIndex], StartTime, Tasks[TaskID]->Duration, - false); - Log(Logs::General, Logs::Tasks, "[UPDATE] SendActiveTasksToClient: Task %i, Activities: %i", TaskID, - GetActivityCount(TaskID)); - - int Sequence = 0; - int fixed_index = Tasks[TaskID]->type == TaskType::Task ? 0 : TaskIndex - 1; // hmmm fuck - for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { - if (c->GetTaskActivityState(Tasks[TaskID]->type, fixed_index, Activity) != ActivityHidden) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i, %i Complete=%i", TaskID, - Activity, fixed_index, TaskComplete); - if (Activity == GetActivityCount(TaskID) - 1) - SendTaskActivityLong(c, TaskID, Activity, fixed_index, - Tasks[TaskID]->Activity[Activity].Optional, TaskComplete); - else - SendTaskActivityLong(c, TaskID, Activity, fixed_index, - Tasks[TaskID]->Activity[Activity].Optional, 0); - } else { - Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i, %i", TaskID, Activity, - fixed_index); - SendTaskActivityShort(c, TaskID, Activity, fixed_index); - } - Sequence++; - } - } -} - -void TaskManager::SendSingleActiveTaskToClient(Client *c, ClientTaskInformation &task_info, bool TaskComplete, - bool BringUpTaskJournal) -{ - int TaskID = task_info.TaskID; - - if (TaskID == 0 || Tasks[TaskID] == nullptr) - return; - - int StartTime = task_info.AcceptedTime; - SendActiveTaskDescription(c, TaskID, task_info, StartTime, Tasks[TaskID]->Duration, BringUpTaskJournal); - Log(Logs::General, Logs::Tasks, "[UPDATE] SendSingleActiveTasksToClient: Task %i, Activities: %i", TaskID, GetActivityCount(TaskID)); - - for (int Activity = 0; Activity < GetActivityCount(TaskID); Activity++) { - if(task_info.Activity[Activity].State != ActivityHidden) { - Log(Logs::General, Logs::Tasks, "[UPDATE] Long: %i, %i Complete=%i", TaskID, Activity, TaskComplete); - if (Activity == GetActivityCount(TaskID) - 1) - SendTaskActivityLong(c, TaskID, Activity, task_info.slot, - Tasks[TaskID]->Activity[Activity].Optional, TaskComplete); - else - SendTaskActivityLong(c, TaskID, Activity, task_info.slot, - Tasks[TaskID]->Activity[Activity].Optional, 0); - } else { - Log(Logs::General, Logs::Tasks, "[UPDATE] Short: %i, %i", TaskID, Activity); - SendTaskActivityShort(c, TaskID, Activity, task_info.slot); - } - } -} - -void TaskManager::SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInformation &task_info, int StartTime, int Duration, bool BringUpTaskJournal) -{ - if ((TaskID < 1) || (TaskID >= MAXTASKS) || !Tasks[TaskID]) - return; - - int PacketLength = sizeof(TaskDescriptionHeader_Struct) + Tasks[TaskID]->Title.length() + 1 - + sizeof(TaskDescriptionData1_Struct) + Tasks[TaskID]->Description.length() + 1 - + sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct); - - // If there is an item make the Reward text into a link to the item (only the first item if a list - // is specified). I have been unable to get multiple item links to work. - // - if(Tasks[TaskID]->RewardID && Tasks[TaskID]->item_link.empty()) { - int ItemID = 0; - // If the reward is a list of items, and the first entry on the list is valid - if (Tasks[TaskID]->RewardMethod == METHODSINGLEID) { - ItemID = Tasks[TaskID]->RewardID; - } else if (Tasks[TaskID]->RewardMethod == METHODLIST) { - ItemID = GoalListManager.GetFirstEntry(Tasks[TaskID]->RewardID); - if (ItemID < 0) - ItemID = 0; - } - - if(ItemID) { - const EQEmu::ItemData* reward_item = database.GetItem(ItemID); - - EQEmu::SayLinkEngine linker; - linker.SetLinkType(EQEmu::saylink::SayLinkItemData); - linker.SetItemData(reward_item); - linker.SetTaskUse(); - Tasks[TaskID]->item_link = linker.GenerateLink(); - } - } - - PacketLength += Tasks[TaskID]->Reward.length() + 1 + Tasks[TaskID]->item_link.length() + 1; - - char *Ptr; - TaskDescriptionHeader_Struct* tdh; - TaskDescriptionData1_Struct* tdd1; - TaskDescriptionData2_Struct* tdd2; - TaskDescriptionTrailer_Struct* tdt; - - auto outapp = new EQApplicationPacket(OP_TaskDescription, PacketLength); - - tdh = (TaskDescriptionHeader_Struct*)outapp->pBuffer; - - tdh->SequenceNumber = task_info.slot; - tdh->TaskID = TaskID; - tdh->open_window = BringUpTaskJournal; - tdh->task_type = static_cast(Tasks[TaskID]->type); - tdh->reward_type = 0; // TODO: 4 says Radiant Crystals else Ebon Crystals when shared task - - Ptr = (char *) tdh + sizeof(TaskDescriptionHeader_Struct); - - sprintf(Ptr, "%s", Tasks[TaskID]->Title.c_str()); - Ptr += Tasks[TaskID]->Title.length() + 1; - - tdd1 = (TaskDescriptionData1_Struct*)Ptr; - - tdd1->Duration = Duration; - tdd1->dur_code = static_cast(Tasks[TaskID]->dur_code); - - tdd1->StartTime = StartTime; - - Ptr = (char *) tdd1 + sizeof(TaskDescriptionData1_Struct); - - sprintf(Ptr, "%s", Tasks[TaskID]->Description.c_str()); - Ptr += Tasks[TaskID]->Description.length() + 1; - - tdd2 = (TaskDescriptionData2_Struct*)Ptr; - - // we have this reward stuff! - // if we ever don't hardcode this, TaskDescriptionTrailer_Struct will need to be fixed since - // "has_reward_selection" is after this bool! Smaller packet when this is 0 - tdd2->has_rewards = 1; - - tdd2->coin_reward = Tasks[TaskID]->CashReward; - tdd2->xp_reward = Tasks[TaskID]->XPReward ? 1 : 0; // just booled - tdd2->faction_reward = Tasks[TaskID]->faction_reward ? 1 : 0; // faction booled - - Ptr = (char *) tdd2 + sizeof(TaskDescriptionData2_Struct); - - // we actually have 2 strings here. One is max length 96 and not parsed for item links - // We actually skipped past that string incorrectly before, so TODO: fix item link string - sprintf(Ptr, "%s", Tasks[TaskID]->Reward.c_str()); - Ptr += Tasks[TaskID]->Reward.length() + 1; - - // second string is parsed for item links - sprintf(Ptr, "%s", Tasks[TaskID]->item_link.c_str()); - Ptr += Tasks[TaskID]->item_link.length() + 1; - - tdt = (TaskDescriptionTrailer_Struct*)Ptr; - tdt->Points = 0x00000000; // Points Count TODO: this does have a visible affect on the client ... - tdt->has_reward_selection = 0; // TODO: new rewards window - - c->QueuePacket(outapp); - safe_delete(outapp); -} - -bool ClientTaskState::IsTaskActivityCompleted(TaskType type, int index, int ActivityID) -{ - switch (type) { - case TaskType::Task: - if (index != 0) - return false; - return ActiveTask.Activity[ActivityID].State == ActivityCompleted; - case TaskType::Shared: - return false; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - return ActiveQuests[index].Activity[ActivityID].State == ActivityCompleted; - default: - return false; - } - -} - -// should we be defaulting to hidden? -ActivityState ClientTaskState::GetTaskActivityState(TaskType type, int index, int ActivityID) -{ - switch (type) { - case TaskType::Task: - if (index != 0) - return ActivityHidden; - return ActiveTask.Activity[ActivityID].State; - case TaskType::Shared: - return ActivityHidden; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - return ActiveQuests[index].Activity[ActivityID].State; - default: - return ActivityHidden; - } -} - -int ClientTaskState::GetTaskActivityDoneCount(TaskType type, int index, int ActivityID) -{ - switch (type) { - case TaskType::Task: - if (index != 0) - return 0; - return ActiveTask.Activity[ActivityID].DoneCount; - case TaskType::Shared: - return 0; // TODO: shared tasks - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - return ActiveQuests[index].Activity[ActivityID].DoneCount; - default: - return 0; - } -} - -int ClientTaskState::GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID) -{ - if (ActiveTask.TaskID == TaskID) - return ActiveTask.Activity[ActivityID].DoneCount; - - // TODO: shared tasks - - int ActiveTaskIndex = -1; - for(int i=0; ipBuffer; - cts->SequenceNumber = SequenceNumber; - cts->type = static_cast(type); - - Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask"); - - c->QueuePacket(outapp); - safe_delete(outapp); - - if(RemoveFromDB) - RemoveTask(c, SequenceNumber, type); -} - -void ClientTaskState::RemoveTask(Client *c, int sequenceNumber, TaskType type) -{ - int characterID = c->CharacterID(); - Log(Logs::General, Logs::Tasks, "[UPDATE] ClientTaskState Cancel Task %i ", sequenceNumber); - - int task_id = -1; - switch (type) { - case TaskType::Task: - if (sequenceNumber == 0) - task_id = ActiveTask.TaskID; - break; - case TaskType::Quest: - if (sequenceNumber < MAXACTIVEQUESTS) - task_id = ActiveQuests[sequenceNumber].TaskID; - break; - case TaskType::Shared: // TODO: - default: - break; - } - - std::string query = StringFormat("DELETE FROM character_activities WHERE charid=%i AND taskid = %i", - characterID, task_id); - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", - results.ErrorMessage().c_str()); - return; - } - Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); - - query = StringFormat("DELETE FROM character_tasks WHERE charid=%i AND taskid = %i AND type=%i", characterID, - task_id, static_cast(type)); - results = database.QueryDatabase(query); - if (!results.Success()) - LogError("[TASKS] Error in CientTaskState::CancelTask [{}]", - results.ErrorMessage().c_str()); - - Log(Logs::General, Logs::Tasks, "[UPDATE] CancelTask: %s", query.c_str()); - - switch (type) { - case TaskType::Task: - ActiveTask.TaskID = TASKSLOTEMPTY; - break; - case TaskType::Shared: - break; // TODO: shared tasks - case TaskType::Quest: - ActiveQuests[sequenceNumber].TaskID = TASKSLOTEMPTY; - ActiveTaskCount--; - break; - default: - break; - } -} - -void ClientTaskState::AcceptNewTask(Client *c, int TaskID, int NPCID, bool enforce_level_requirement) -{ - if (!taskmanager || TaskID < 0 || TaskID >= MAXTASKS) { - c->Message(Chat::Red, "Task system not functioning, or TaskID %i out of range.", TaskID); - return; - } - - auto task = taskmanager->Tasks[TaskID]; - - if (task == nullptr) { - c->Message(Chat::Red, "Invalid TaskID %i", TaskID); - return; - } - - bool max_tasks = false; - - switch (task->type) { - case TaskType::Task: - if (ActiveTask.TaskID != TASKSLOTEMPTY) - max_tasks = true; - break; - case TaskType::Shared: // TODO: shared tasks - // if (something) - max_tasks = true; - break; - case TaskType::Quest: - if (ActiveTaskCount == MAXACTIVEQUESTS) - max_tasks = true; - break; - default: - break; - } - - if (max_tasks) { - c->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); - return; - } - - // only Quests can have more than one, so don't need to check others - if (task->type == TaskType::Quest) { - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - if (ActiveQuests[i].TaskID == TaskID) { - c->Message(Chat::Red, "You have already been assigned this task."); - return; - } - } - } - - if (enforce_level_requirement && !taskmanager->AppropriateLevel(TaskID, c->GetLevel())) { - c->Message(Chat::Red, "You are outside the level range of this task."); - return; - } - - if (!taskmanager->IsTaskRepeatable(TaskID) && IsTaskCompleted(TaskID)) - return; - - // We do it this way, because when the Client cancels a task, it retains the sequence number of the remaining - // tasks in it's window, until something causes the TaskDescription packets to be sent again. We could just - // resend all the active task data to the client when it cancels a task, but that could be construed as a - // waste of bandwidth. - // - ClientTaskInformation *active_slot = nullptr; - switch (task->type) { - case TaskType::Task: - active_slot = &ActiveTask; - break; - case TaskType::Shared: // TODO: shared - active_slot = nullptr; - break; - case TaskType::Quest: - for (int i = 0; i < MAXACTIVEQUESTS; i++) { - Log(Logs::General, Logs::Tasks, - "[UPDATE] ClientTaskState Looking for free slot in slot %i, found TaskID of %i", i, - ActiveQuests[i].TaskID); - if (ActiveQuests[i].TaskID == 0) { - active_slot = &ActiveQuests[i]; - break; - } - } - break; - default: - break; - } - - // This shouldn't happen unless there is a bug in the handling of ActiveTaskCount somewhere - if (active_slot == nullptr) { - c->Message(Chat::Red, "You already have the maximum allowable number of active tasks (%i)", MAXACTIVEQUESTS); - return; - } - - active_slot->TaskID = TaskID; - active_slot->AcceptedTime = time(nullptr); - active_slot->Updated = true; - active_slot->CurrentStep = -1; - - for (int i = 0; i < taskmanager->Tasks[TaskID]->ActivityCount; i++) { - active_slot->Activity[i].ActivityID = i; - active_slot->Activity[i].DoneCount = 0; - active_slot->Activity[i].State = ActivityHidden; - active_slot->Activity[i].Updated = true; - } - - UnlockActivities(c->CharacterID(), *active_slot); - - if (task->type == TaskType::Quest) - ActiveTaskCount++; - - taskmanager->SendSingleActiveTaskToClient(c, *active_slot, false, true); - c->Message(Chat::White, "You have been assigned the task '%s'.", taskmanager->Tasks[TaskID]->Title.c_str()); - - std::string buf = std::to_string(TaskID); - - NPC *npc = entity_list.GetID(NPCID)->CastToNPC(); - if(!npc) { - c->Message(Chat::Yellow, "Task Giver ID is %i", NPCID); - c->Message(Chat::Red, "Unable to find NPC to send EVENT_TASKACCEPTED to. Report this bug."); - return; - } - - taskmanager->SaveClientState(c, this); - parse->EventNPC(EVENT_TASK_ACCEPTED, npc, c, buf.c_str(), 0); -} - -void ClientTaskState::ProcessTaskProximities(Client *c, float X, float Y, float Z) { - - float LastX = c->ProximityX(); - float LastY = c->ProximityY(); - float LastZ = c->ProximityZ(); - - if((LastX==X) && (LastY==Y) && (LastZ==Z)) return; - - Log(Logs::General, Logs::Tasks, "[PROXIMITY] Checking proximities for Position %8.3f, %8.3f, %8.3f", X, Y, Z); - int ExploreID = taskmanager->ProximityManager.CheckProximities(X, Y, Z); - - if(ExploreID > 0) { - Log(Logs::General, Logs::Tasks, "[PROXIMITY] Position %8.3f, %8.3f, %8.3f is within proximity %i", X, Y, Z, ExploreID); - UpdateTasksOnExplore(c, ExploreID); - } -} - -TaskGoalListManager::TaskGoalListManager() -{ - NumberOfLists = 0; -} - -TaskGoalListManager::~TaskGoalListManager() {} - -bool TaskGoalListManager::LoadLists() -{ - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskGoalListManager::LoadLists Called"); - - TaskGoalLists.clear(); - - const char *ERR_MYSQLERROR = "Error in TaskGoalListManager::LoadLists: %s %s"; - - NumberOfLists = 0; - - std::string query = "SELECT `listid`, COUNT(`entry`) " - "FROM `goallists` GROUP by `listid` " - "ORDER BY `listid`"; - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - return false; - } - - NumberOfLists = results.RowCount(); - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Database returned a count of %i lists", NumberOfLists); - - TaskGoalLists.reserve(NumberOfLists); - - int listIndex = 0; - - for (auto row = results.begin(); row != results.end(); ++row) { - int listID = atoi(row[0]); - int listSize = atoi(row[1]); - TaskGoalLists.push_back({listID, 0, 0}); - - TaskGoalLists[listIndex].GoalItemEntries.reserve(listSize); - - listIndex++; - } - - for (int listIndex = 0; listIndex < NumberOfLists; listIndex++) { - - int listID = TaskGoalLists[listIndex].ListID; - auto size = TaskGoalLists[listIndex].GoalItemEntries.capacity(); // this was only done for manual memory management, shouldn't need to do this - query = StringFormat("SELECT `entry` from `goallists` " - "WHERE `listid` = %i " - "ORDER BY `entry` ASC LIMIT %i", - listID, size); - results = content_db.QueryDatabase(query); - if (!results.Success()) { - continue; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - - int entry = atoi(row[0]); - - if (entry < TaskGoalLists[listIndex].Min) - TaskGoalLists[listIndex].Min = entry; - - if (entry > TaskGoalLists[listIndex].Max) - TaskGoalLists[listIndex].Max = entry; - - TaskGoalLists[listIndex].GoalItemEntries.push_back(entry); - } - } - - return true; - -} - -int TaskGoalListManager::GetListByID(int ListID) { - - // Find the list with the specified ListID and return the index - auto it = std::find_if(TaskGoalLists.begin(), TaskGoalLists.end(), - [ListID](const TaskGoalList_Struct &t) { return t.ListID == ListID; }); - - if (it == TaskGoalLists.end()) - return -1; - - return std::distance(TaskGoalLists.begin(), it); -} - -int TaskGoalListManager::GetFirstEntry(int ListID) { - - int ListIndex = GetListByID(ListID); - - if((ListIndex < 0) || (ListIndex >= NumberOfLists)) return -1; - - if(TaskGoalLists[ListIndex].GoalItemEntries.empty()) return -1; - - return TaskGoalLists[ListIndex].GoalItemEntries[0]; -} - -std::vector TaskGoalListManager::GetListContents(int ListID) { - - std::vector ListContents; - - int ListIndex = GetListByID(ListID); - - if((ListIndex < 0) || (ListIndex >= NumberOfLists)) return ListContents; - - ListContents = TaskGoalLists[ListIndex].GoalItemEntries; - - return ListContents; - -} - -bool TaskGoalListManager::IsInList(int ListID, int Entry) -{ - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i)", ListID, Entry); - - int ListIndex = GetListByID(ListID); - - if ((ListIndex < 0) || (ListIndex >= NumberOfLists)) - return false; - - if ((Entry < TaskGoalLists[ListIndex].Min) || (Entry > TaskGoalLists[ListIndex].Max)) - return false; - - int FirstEntry = 0; - auto &task = TaskGoalLists[ListIndex]; - - auto it = std::find(task.GoalItemEntries.begin(), task.GoalItemEntries.end(), Entry); - - if (it == task.GoalItemEntries.end()) - return false; - - Log(Logs::General, Logs::Tasks, "[UPDATE] TaskGoalListManager::IsInList(%i, %i) returning true", ListIndex, - Entry); - return true; -} - -TaskProximityManager::TaskProximityManager() { - - -} - -TaskProximityManager::~TaskProximityManager() { - - -} - -bool TaskProximityManager::LoadProximities(int zoneID) { - TaskProximity proximity; - - Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] TaskProximityManager::LoadProximities Called for zone %i", zoneID); - TaskProximities.clear(); - - std::string query = StringFormat("SELECT `exploreid`, `minx`, `maxx`, " - "`miny`, `maxy`, `minz`, `maxz` " - "FROM `proximities` WHERE `zoneid` = %i " - "ORDER BY `zoneid` ASC", zoneID); - auto results = content_db.QueryDatabase(query); - if (!results.Success()) { - return false; - } - - for( auto row = results.begin(); row != results.end(); ++row) { - proximity.ExploreID = atoi(row[0]); - proximity.MinX = atof(row[1]); - proximity.MaxX = atof(row[2]); - proximity.MinY = atof(row[3]); - proximity.MaxY = atof(row[4]); - proximity.MinZ = atof(row[5]); - proximity.MaxZ = atof(row[6]); - - TaskProximities.push_back(proximity); - } - - return true; - -} - -int TaskProximityManager::CheckProximities(float X, float Y, float Z) { - - for(unsigned int i=0; iMinX, P->MaxX, P->MinY, P->MaxY, P->MinZ, P->MaxZ); - - if(X < P->MinX || X > P->MaxX || Y < P->MinY || Y > P->MaxY || - Z < P->MinZ || Z > P->MaxZ) continue; - - return P->ExploreID; - - } - - return 0; -} - diff --git a/zone/tasks.h b/zone/tasks.h index 0bc45c146..d3fed2c09 100644 --- a/zone/tasks.h +++ b/zone/tasks.h @@ -1,27 +1,7 @@ -/* EQEMu: Everquest Server Emulator -Copyright (C) 2001-2004 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 TASKS_H #define TASKS_H #include "../common/types.h" - #include #include #include @@ -29,301 +9,141 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) #define MAXTASKS 10000 #define MAXTASKSETS 1000 -// The Client has a hard cap of 19 active quests, 29 in SoD+ -#define MAXACTIVEQUESTS 19 -// The Max Chooser (Task Selector entries) is capped at 40 in the Titanium Client. -#define MAXCHOOSERENTRIES 40 -// The Client has a hard cap of 20 activities per task. -#define MAXACTIVITIESPERTASK 20 -// This is used to determine if a client's active task slot is empty. -#define TASKSLOTEMPTY 0 +#define MAXACTIVEQUESTS 19 // The Client has a hard cap of 19 active quests, 29 in SoD+ +#define MAXCHOOSERENTRIES 40 // The Max Chooser (Task Selector entries) is capped at 40 in the Titanium Client. +#define MAXACTIVITIESPERTASK 20 // The Client has a hard cap of 20 activities per task. +#define TASKSLOTEMPTY 0 // This is used to determine if a client's active task slot is empty. // Command Codes for worldserver ServerOP_ReloadTasks -// -#define RELOADTASKS 0 -#define RELOADTASKGOALLISTS 1 -#define RELOADTASKPROXIMITIES 2 -#define RELOADTASKSETS 3 +#define RELOADTASKS 0 +#define RELOADTASKGOALLISTS 1 +#define RELOADTASKPROXIMITIES 2 +#define RELOADTASKSETS 3 class Client; class Mob; -namespace EQEmu -{ +namespace EQ { class ItemInstance; } -struct TaskGoalList_Struct { - int ListID; - int Min, Max; - std::vector GoalItemEntries; -}; - -// This is used for handling lists, loading them from the database, searching them. -// Used for lists of NPCs to kill, items to loot, etc, as well as lists of items to -// reward the player with on completion of the task. -// -class TaskGoalListManager { - -public: - TaskGoalListManager(); - ~TaskGoalListManager(); - bool LoadLists(); - int GetListByID(int ListID); - bool IsInList(int ListID, int Entry); - int GetFirstEntry(int ListID); - std::vector GetListContents(int ListIndex); - -private: - - std::vector TaskGoalLists; - int NumberOfLists; -}; - -typedef struct { - int ExploreID; - float MinX, MaxX, MinY, MaxY, MinZ, MaxZ; -} TaskProximity; - -// This class is used for managing proximities so that Quest NPC proximities don't need to be used. -class TaskProximityManager { - -public: - TaskProximityManager(); - ~TaskProximityManager(); - bool LoadProximities(int ZoneID); - int CheckProximities(float X, float Y, float Z); - -private: - std::vector TaskProximities; -}; - -typedef enum { METHODSINGLEID = 0, METHODLIST = 1, METHODQUEST = 2 } TaskMethodType; +typedef enum { + METHODSINGLEID = 0, + METHODLIST = 1, + METHODQUEST = 2 +} TaskMethodType; struct ActivityInformation { - int StepNumber; - int Type; - std::string target_name; // name mob, location -- default empty - std::string item_list; // likely defaults to empty - std::string skill_list; // IDs ; separated -- default -1 - std::string spell_list; // IDs ; separated -- default 0 - std::string desc_override; // overrides auto generated description -- default empty - int skill_id; // older clients, first id from above - int spell_id; // older clients, first id from above - int GoalID; - TaskMethodType GoalMethod; - int GoalCount; - int DeliverToNPC; - std::vector ZoneIDs; - std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string - bool Optional; + int step_number; + int activity_type; + std::string target_name; // name mob, location -- default empty + std::string item_list; // likely defaults to empty + std::string skill_list; // IDs ; separated -- default -1 + std::string spell_list; // IDs ; separated -- default 0 + std::string description_override; // overrides auto generated description -- default empty + int skill_id; // older clients, first id from above + int spell_id; // older clients, first id from above + int goal_id; + TaskMethodType goal_method; + int goal_count; + int deliver_to_npc; + std::vector zone_ids; + std::string zones; // IDs ; searated, ZoneID is the first in this list for older clients -- default empty string + bool optional; - inline bool CheckZone(int zone_id) { - if (ZoneIDs.empty()) + inline bool CheckZone(int zone_id) + { + if (zone_ids.empty()) { return true; - return std::find(ZoneIDs.begin(), ZoneIDs.end(), zone_id) != ZoneIDs.end(); + } + return std::find(zone_ids.begin(), zone_ids.end(), zone_id) != zone_ids.end(); } }; -typedef enum { ActivitiesSequential = 0, ActivitiesStepped = 1 } SequenceType; +typedef enum { + ActivitiesSequential = 0, + ActivitiesStepped = 1 +} SequenceType; enum class TaskType { - Task = 0, // can have at max 1 - Shared = 1, // can have at max 1 - Quest = 2, // can have at max 19 or 29 depending on client - E = 3 // can have at max 19 or 29 depending on client, not present in live anymore + Task = 0, // can have at max 1 + Shared = 1, // can have at max 1 + Quest = 2, // can have at max 19 or 29 depending on client + E = 3 // can have at max 19 or 29 depending on client, not present in live anymore }; enum class DurationCode { - None = 0, - Short = 1, + None = 0, + Short = 1, Medium = 2, - Long = 3 + Long = 3 }; struct TaskInformation { - TaskType type; - int Duration; - DurationCode dur_code; // description for time investment for when Duration == 0 - std::string Title; // max length 64 - std::string Description; // max length 4000, 2048 on Tit - std::string Reward; - std::string item_link; // max length 128 older clients, item link gets own string - std::string completion_emote; // emote after completing task, yellow. Maybe should make more generic ... but yellow for now! - int RewardID; - int CashReward; // Expressed in copper - int XPReward; - int faction_reward; // just a npc_faction_id - TaskMethodType RewardMethod; - int ActivityCount; - SequenceType SequenceMode; - int LastStep; - short MinLevel; - short MaxLevel; - bool Repeatable; - ActivityInformation Activity[MAXACTIVITIESPERTASK]; + TaskType type; + int duration; + DurationCode duration_code; // description for time investment for when duration == 0 + std::string title; // max length 64 + std::string description; // max length 4000, 2048 on Tit + std::string reward; + std::string item_link; // max length 128 older clients, item link gets own string + std::string completion_emote; // emote after completing task, yellow. Maybe should make more generic ... but yellow for now! + int reward_id; + int cash_reward; // Expressed in copper + int experience_reward; + int faction_reward; // just a npc_faction_id + TaskMethodType reward_method; + int activity_count; + SequenceType sequence_mode; + int last_step; + short min_level; + short max_level; + bool repeatable; + ActivityInformation activity_information[MAXACTIVITIESPERTASK]; }; -typedef enum { ActivityHidden = 0, ActivityActive = 1, ActivityCompleted = 2 } ActivityState; - -typedef enum { ActivityDeliver = 1, ActivityKill = 2, ActivityLoot = 3, ActivitySpeakWith = 4, ActivityExplore = 5, - ActivityTradeSkill = 6, ActivityFish = 7, ActivityForage = 8, ActivityCastOn = 9, ActivitySkillOn = 10, - ActivityTouch = 11, ActivityCollect = 13, ActivityGiveCash = 100 } ActivityType; +typedef enum { + ActivityHidden = 0, + ActivityActive = 1, + ActivityCompleted = 2 +} ActivityState; +typedef enum { + ActivityDeliver = 1, + ActivityKill = 2, + ActivityLoot = 3, + ActivitySpeakWith = 4, + ActivityExplore = 5, + ActivityTradeSkill = 6, + ActivityFish = 7, + ActivityForage = 8, + ActivityCastOn = 9, + ActivitySkillOn = 10, + ActivityTouch = 11, + ActivityCollect = 13, + ActivityGiveCash = 100 +} ActivityType; struct ClientActivityInformation { - int ActivityID; - int DoneCount; - ActivityState State; - bool Updated; // Flag so we know if we need to update the database + int activity_id; + int done_count; + ActivityState activity_state; + bool updated; // Flag so we know if we need to updated the database }; struct ClientTaskInformation { - int slot; // intrusive, but makes things easier :P - int TaskID; - int CurrentStep; - int AcceptedTime; - bool Updated; - ClientActivityInformation Activity[MAXACTIVITIESPERTASK]; + int slot; // intrusive, but makes things easier :P + int task_id; + int current_step; + int accepted_time; + bool updated; + ClientActivityInformation activity[MAXACTIVITIESPERTASK]; }; struct CompletedTaskInformation { - int TaskID; - int CompletedTime; - bool ActivityDone[MAXACTIVITIESPERTASK]; -}; - -class ClientTaskState { - -public: - ClientTaskState(); - ~ClientTaskState(); - void ShowClientTasks(Client *c); - inline int GetActiveTaskCount() { return ActiveTaskCount; } - int GetActiveTaskID(int index); - bool IsTaskActivityCompleted(TaskType type, int index, int ActivityID); - int GetTaskActivityDoneCount(TaskType type, int index, int ActivityID); - int GetTaskActivityDoneCountFromTaskID(int TaskID, int ActivityID); - int GetTaskStartTime(TaskType type, int index); - void AcceptNewTask(Client *c, int TaskID, int NPCID, bool enforce_level_requirement = false); - void FailTask(Client *c, int TaskID); - int TaskTimeLeft(int TaskID); - int IsTaskCompleted(int TaskID); - bool IsTaskActive(int TaskID); - bool IsTaskActivityActive(int TaskID, int ActivityID); - ActivityState GetTaskActivityState(TaskType type, int index, int ActivityID); - void UpdateTaskActivity(Client *c, int TaskID, int ActivityID, int Count, bool ignore_quest_update = false); - void ResetTaskActivity(Client *c, int TaskID, int ActivityID); - void CancelTask(Client *c, int SequenceNumber, TaskType type, bool RemoveFromDB = true); - void CancelAllTasks(Client *c); - void RemoveTask(Client *c, int SequenceNumber, TaskType type); - bool UpdateTasksByNPC(Client *c, int ActivityType, int NPCTypeID); - void UpdateTasksOnKill(Client *c, int NPCTypeID); - void UpdateTasksForItem(Client *c, ActivityType Type, int ItemID, int Count=1); - void UpdateTasksOnExplore(Client *c, int ExploreID); - bool UpdateTasksOnSpeakWith(Client *c, int NPCTypeID); - bool UpdateTasksOnDeliver(Client *c, std::list& Items, int Cash, int NPCTypeID); - void UpdateTasksOnTouch(Client *c, int ZoneID); - void ProcessTaskProximities(Client *c, float X, float Y, float Z); - bool TaskOutOfTime(TaskType type, int Index); - void TaskPeriodicChecks(Client *c); - void SendTaskHistory(Client *c, int TaskIndex); - void RewardTask(Client *c, TaskInformation *Task); - void EnableTask(int CharID, int TaskCount, int *TaskList); - void DisableTask(int CharID, int TaskCount, int *TaskList); - bool IsTaskEnabled(int TaskID); - int EnabledTaskCount(int TaskSetID); - int ActiveSpeakTask(int NPCID); - int ActiveSpeakActivity(int NPCID, int TaskID); - int ActiveTasksInSet(int TaskSetID); - int CompletedTasksInSet(int TaskSetID); - bool HasSlotForTask(TaskInformation *task); - - inline bool HasFreeTaskSlot() { return ActiveTask.TaskID == TASKSLOTEMPTY; } - - friend class TaskManager; - -private: - bool UnlockActivities(int CharID, ClientTaskInformation &task_info); - void IncrementDoneCount(Client *c, TaskInformation *Task, int TaskIndex, int ActivityID, int Count = 1, bool ignore_quest_update = false); - inline ClientTaskInformation *GetClientTaskInfo(TaskType type, int index) - { - ClientTaskInformation *info = nullptr; - switch (type) { - case TaskType::Task: - if (index == 0) - info = &ActiveTask; - break; - case TaskType::Shared: - break; - case TaskType::Quest: - if (index < MAXACTIVEQUESTS) - info = &ActiveQuests[index]; - break; - default: - break; - } - return info; - } - int ActiveTaskCount; - union { // easier to loop over - struct { - ClientTaskInformation ActiveTask; // only one - ClientTaskInformation ActiveQuests[MAXACTIVEQUESTS]; - }; - ClientTaskInformation ActiveTasks[MAXACTIVEQUESTS + 1]; - }; - // Shared tasks should be limited to 1 as well - std::vector EnabledTasks; - std::vector CompletedTasks; - int LastCompletedTaskLoaded; - bool CheckedTouchActivities; -}; - - -class TaskManager { - -public: - TaskManager(); - ~TaskManager(); - int GetActivityCount(int TaskID); - bool LoadSingleTask(int TaskID); - bool LoadTasks(int SingleTask=0); - void ReloadGoalLists(); - inline void LoadProximities(int ZoneID) { ProximityManager.LoadProximities(ZoneID); } - bool LoadTaskSets(); - bool LoadClientState(Client *c, ClientTaskState *state); - bool SaveClientState(Client *c, ClientTaskState *state); - void SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *TaskList); - void SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *TaskList); - bool AppropriateLevel(int TaskID, int PlayerLevel); - int GetTaskMinLevel(int TaskID); - int GetTaskMaxLevel(int TaskID); - void TaskSetSelector(Client *c, ClientTaskState *state, Mob *mob, int TaskSetID); - void TaskQuestSetSelector(Client *c, ClientTaskState *state, Mob *mob, int count, int *tasks); // task list provided by QuestManager (perl/lua) - void SendActiveTasksToClient(Client *c, bool TaskComplete=false); - void SendSingleActiveTaskToClient(Client *c, ClientTaskInformation &task_info, bool TaskComplete, bool BringUpTaskJournal = false); - void SendTaskActivityShort(Client *c, int TaskID, int ActivityID, int ClientTaskIndex); - void SendTaskActivityLong(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, - bool Optional, bool TaskComplete=false); - void SendTaskActivityNew(Client *c, int TaskID, int ActivityID, int ClientTaskIndex, - bool Optional, bool TaskComplete=false); - void SendCompletedTasksToClient(Client *c, ClientTaskState *state); - void ExplainTask(Client *c, int TaskID); - int FirstTaskInSet(int TaskSet); - int LastTaskInSet(int TaskSet); - int NextTaskInSet(int TaskSet, int TaskID); - bool IsTaskRepeatable(int TaskID); - friend class ClientTaskState; - - -private: - TaskGoalListManager GoalListManager; - TaskProximityManager ProximityManager; - TaskInformation* Tasks[MAXTASKS]; - std::vector TaskSets[MAXTASKSETS]; - void SendActiveTaskDescription(Client *c, int TaskID, ClientTaskInformation &task_info, int StartTime, int Duration, bool BringUpTaskJournal=false); - + int task_id; + int completed_time; + bool activity_done[MAXACTIVITIESPERTASK]; }; #endif diff --git a/zone/titles.cpp b/zone/titles.cpp index 7b4537b88..a0cd10a12 100644 --- a/zone/titles.cpp +++ b/zone/titles.cpp @@ -47,7 +47,7 @@ bool TitleManager::LoadTitles() for (auto row = results.begin(); row != results.end(); ++row) { TitleEntry Title; Title.TitleID = atoi(row[0]); - Title.SkillID = (EQEmu::skills::SkillType) atoi(row[1]); + Title.SkillID = (EQ::skills::SkillType) atoi(row[1]); Title.MinSkillValue = atoi(row[2]); Title.MaxSkillValue = atoi(row[3]); Title.MinAAPoints = atoi(row[4]); @@ -188,10 +188,10 @@ bool TitleManager::IsClientEligibleForTitle(Client *c, std::vector:: if(Title->SkillID >= 0) { - if ((Title->MinSkillValue >= 0) && (c->GetRawSkill(static_cast(Title->SkillID)) < static_cast(Title->MinSkillValue))) + if ((Title->MinSkillValue >= 0) && (c->GetRawSkill(static_cast(Title->SkillID)) < static_cast(Title->MinSkillValue))) return false; - if ((Title->MaxSkillValue >= 0) && (c->GetRawSkill(static_cast(Title->SkillID)) > static_cast(Title->MaxSkillValue))) + if ((Title->MaxSkillValue >= 0) && (c->GetRawSkill(static_cast(Title->SkillID)) > static_cast(Title->MaxSkillValue))) return false; } diff --git a/zone/tradeskills.cpp b/zone/tradeskills.cpp index aba4a8a5d..52423b368 100644 --- a/zone/tradeskills.cpp +++ b/zone/tradeskills.cpp @@ -33,12 +33,13 @@ #include "string_ids.h" #include "titles.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/character_recipe_list_repository.h" #include "../common/repositories/tradeskill_recipe_repository.h" extern QueryServ* QServ; -static const EQEmu::skills::SkillType TradeskillUnknown = EQEmu::skills::Skill1HBlunt; /* an arbitrary non-tradeskill */ +static const EQ::skills::SkillType TradeskillUnknown = EQ::skills::Skill1HBlunt; /* an arbitrary non-tradeskill */ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augment, Object *worldo) { @@ -48,7 +49,7 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme return; } - EQEmu::ItemInstance* container = nullptr; + EQ::ItemInstance* container = nullptr; if (worldo) { @@ -57,23 +58,23 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme else { // Check to see if they have an inventory container type 53 that is used for this. - EQEmu::InventoryProfile& user_inv = user->GetInv(); - EQEmu::ItemInstance* inst = nullptr; + EQ::InventoryProfile& user_inv = user->GetInv(); + EQ::ItemInstance* inst = nullptr; inst = user_inv.GetItem(in_augment->container_slot); if (inst) { - const EQEmu::ItemData* item = inst->GetItem(); - if (item && inst->IsType(EQEmu::item::ItemClassBag) && item->BagType == 53) + const EQ::ItemData* item = inst->GetItem(); + if (item && inst->IsType(EQ::item::ItemClassBag) && item->BagType == 53) { // We have found an appropriate inventory augmentation sealer container = inst; // Verify that no more than two items are in container to guarantee no inadvertant wipes. uint8 itemsFound = 0; - for (uint8 i = EQEmu::invbag::SLOT_BEGIN; i < EQEmu::invtype::WORLD_SIZE; i++) + for (uint8 i = EQ::invbag::SLOT_BEGIN; i < EQ::invtype::WORLD_SIZE; i++) { - const EQEmu::ItemInstance* inst = container->GetItem(i); + const EQ::ItemInstance* inst = container->GetItem(i); if (inst) { itemsFound++; @@ -96,7 +97,7 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme return; } - EQEmu::ItemInstance *tobe_auged = nullptr, *auged_with = nullptr; + EQ::ItemInstance *tobe_auged = nullptr, *auged_with = nullptr; int8 slot=-1; // Verify 2 items in the augmentation device @@ -137,7 +138,7 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme bool deleteItems = false; - EQEmu::ItemInstance *itemOneToPush = nullptr, *itemTwoToPush = nullptr; + EQ::ItemInstance *itemOneToPush = nullptr, *itemTwoToPush = nullptr; // Adding augment if (in_augment->augment_slot == -1) @@ -147,9 +148,9 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme { tobe_auged->PutAugment(slot, *auged_with); - EQEmu::ItemInstance *aug = tobe_auged->GetAugment(slot); + EQ::ItemInstance *aug = tobe_auged->GetAugment(slot); if(aug) { - std::vector args; + std::vector args; args.push_back(aug); parse->EventItem(EVENT_AUGMENT_ITEM, user, tobe_auged, nullptr, "", slot, &args); @@ -167,9 +168,9 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme } else { - EQEmu::ItemInstance *old_aug = nullptr; - bool isSolvent = auged_with->GetItem()->ItemType == EQEmu::item::ItemTypeAugmentationSolvent; - if (!isSolvent && auged_with->GetItem()->ItemType != EQEmu::item::ItemTypeAugmentationDistiller) + EQ::ItemInstance *old_aug = nullptr; + bool isSolvent = auged_with->GetItem()->ItemType == EQ::item::ItemTypeAugmentationSolvent; + if (!isSolvent && auged_with->GetItem()->ItemType != EQ::item::ItemTypeAugmentationDistiller) { LogError("Player tried to remove an augment without a solvent or distiller"); user->Message(Chat::Red, "Error: Missing an augmentation solvent or distiller for removing this augment."); @@ -177,7 +178,7 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme return; } - EQEmu::ItemInstance *aug = tobe_auged->GetAugment(in_augment->augment_slot); + EQ::ItemInstance *aug = tobe_auged->GetAugment(in_augment->augment_slot); if (aug) { if (!isSolvent && auged_with->GetItem()->ID != aug->GetItem()->AugDistiller) { @@ -185,7 +186,7 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme user->Message(Chat::Red, "Error: Wrong augmentation distiller for safely removing this augment."); return; } - std::vector args; + std::vector args; args.push_back(aug); parse->EventItem(EVENT_UNAUGMENT_ITEM, user, tobe_auged, nullptr, "", slot, &args); @@ -224,12 +225,12 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme else { // Delete items in our inventory container... - for (uint8 i = EQEmu::invbag::SLOT_BEGIN; i < EQEmu::invtype::WORLD_SIZE; i++) + for (uint8 i = EQ::invbag::SLOT_BEGIN; i < EQ::invtype::WORLD_SIZE; i++) { - const EQEmu::ItemInstance* inst = container->GetItem(i); + const EQ::ItemInstance* inst = container->GetItem(i); if (inst) { - user->DeleteItemInInventory(EQEmu::InventoryProfile::CalcSlotId(in_augment->container_slot, i), 0, true); + user->DeleteItemInInventory(EQ::InventoryProfile::CalcSlotId(in_augment->container_slot, i), 0, true); } } // Explicitly mark container as cleared. @@ -258,57 +259,84 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob return; } - EQEmu::InventoryProfile& user_inv = user->GetInv(); - PlayerProfile_Struct& user_pp = user->GetPP(); - EQEmu::ItemInstance* container = nullptr; - EQEmu::ItemInstance* inst = nullptr; - uint8 c_type = 0xE8; - uint32 some_id = 0; - bool worldcontainer=false; + LogTradeskills( + "[HandleCombine] container_slot [{}] guildtribute_slot [{}]", + in_combine->container_slot, + in_combine->guildtribute_slot + ); - if (in_combine->container_slot == EQEmu::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { + EQ::InventoryProfile &user_inv = user->GetInv(); + PlayerProfile_Struct &user_pp = user->GetPP(); + EQ::ItemInstance *container = nullptr; + EQ::ItemInstance *inst = nullptr; + + uint8 c_type = 0xE8; + uint32 some_id = 0; + bool worldcontainer = false; + + + if (in_combine->container_slot == EQ::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE) { if(!worldo) { - user->Message(Chat::Red, "Error: Server is not aware of the tradeskill container you are attempting to use"); + user->Message( + Chat::Red, + "Error: Server is not aware of the tradeskill container you are attempting to use" + ); return; } - c_type = worldo->m_type; - inst = worldo->m_inst; - worldcontainer=true; + c_type = worldo->m_type; + inst = worldo->m_inst; + worldcontainer = true; // if we're a world container with an item, use that too if (inst) { - const EQEmu::ItemData* item = inst->GetItem(); - if (item) + const EQ::ItemData *item = inst->GetItem(); + if (item) { some_id = item->ID; + } } } else { inst = user_inv.GetItem(in_combine->container_slot); if (inst) { - const EQEmu::ItemData* item = inst->GetItem(); - if (item && inst->IsType(EQEmu::item::ItemClassBag)) { + const EQ::ItemData* item = inst->GetItem(); + if (item && inst->IsType(EQ::item::ItemClassBag)) { c_type = item->BagType; some_id = item->ID; } } } - if (!inst || !inst->IsType(EQEmu::item::ItemClassBag)) { + if (!inst || !inst->IsType(EQ::item::ItemClassBag)) { user->Message(Chat::Red, "Error: Server does not recognize specified tradeskill container"); return; } container = inst; - if (container->GetItem() && container->GetItem()->BagType == EQEmu::item::BagTypeTransformationmold) { - const EQEmu::ItemInstance* inst = container->GetItem(0); - bool AllowAll = RuleB(Inventory, AllowAnyWeaponTransformation); - if (inst && EQEmu::ItemInstance::CanTransform(inst->GetItem(), container->GetItem(), AllowAll)) { - const EQEmu::ItemData* new_weapon = inst->GetItem(); - user->DeleteItemInInventory(EQEmu::InventoryProfile::CalcSlotId(in_combine->container_slot, 0), 0, true); + if (container->GetItem() && container->GetItem()->BagType == EQ::item::BagTypeTransformationmold) { + const EQ::ItemInstance *inst = container->GetItem(0); + bool AllowAll = RuleB(Inventory, AllowAnyWeaponTransformation); + if (inst && EQ::ItemInstance::CanTransform(inst->GetItem(), container->GetItem(), AllowAll)) { + const EQ::ItemData *new_weapon = inst->GetItem(); + user->DeleteItemInInventory(EQ::InventoryProfile::CalcSlotId(in_combine->container_slot, 0), 0, true); container->Clear(); - user->SummonItem(new_weapon->ID, inst->GetCharges(), inst->GetAugmentItemID(0), inst->GetAugmentItemID(1), inst->GetAugmentItemID(2), inst->GetAugmentItemID(3), inst->GetAugmentItemID(4), inst->GetAugmentItemID(5), inst->IsAttuned(), EQEmu::invslot::slotCursor, container->GetItem()->Icon, atoi(container->GetItem()->IDFile + 2)); + user->SummonItem( + new_weapon->ID, + inst->GetCharges(), + inst->GetAugmentItemID(0), + inst->GetAugmentItemID(1), + inst->GetAugmentItemID(2), + inst->GetAugmentItemID(3), + inst->GetAugmentItemID(4), + inst->GetAugmentItemID(5), + inst->IsAttuned(), + EQ::invslot::slotCursor, + container->GetItem()->Icon, + atoi(container->GetItem()->IDFile + 2) + ); + user->MessageString(Chat::LightBlue, TRANSFORM_COMPLETE, inst->GetItem()->Name); - if (RuleB(Inventory, DeleteTransformationMold)) + if (RuleB(Inventory, DeleteTransformationMold)) { user->DeleteItemInInventory(in_combine->container_slot, 0, true); + } } else if (inst) { user->MessageString(Chat::LightBlue, TRANSFORM_FAILED, inst->GetItem()->Name); @@ -316,16 +344,25 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0); user->QueuePacket(outapp); safe_delete(outapp); + + LogTradeskills( + "[HandleCombine] inst_item [{}] container_item [{}]", + inst->GetItem()->ID, + container->GetItem()->ID + ); + return; } - if (container->GetItem() && container->GetItem()->BagType == EQEmu::item::BagTypeDetransformationmold) { - const EQEmu::ItemInstance* inst = container->GetItem(0); + if (container->GetItem() && container->GetItem()->BagType == EQ::item::BagTypeDetransformationmold) { + LogTradeskillsDetail("[HandleCombine] Check 1"); + + const EQ::ItemInstance* inst = container->GetItem(0); if (inst && inst->GetOrnamentationIcon() && inst->GetOrnamentationIcon()) { - const EQEmu::ItemData* new_weapon = inst->GetItem(); - user->DeleteItemInInventory(EQEmu::InventoryProfile::CalcSlotId(in_combine->container_slot, 0), 0, true); + const EQ::ItemData* new_weapon = inst->GetItem(); + user->DeleteItemInInventory(EQ::InventoryProfile::CalcSlotId(in_combine->container_slot, 0), 0, true); container->Clear(); - user->SummonItem(new_weapon->ID, inst->GetCharges(), inst->GetAugmentItemID(0), inst->GetAugmentItemID(1), inst->GetAugmentItemID(2), inst->GetAugmentItemID(3), inst->GetAugmentItemID(4), inst->GetAugmentItemID(5), inst->IsAttuned(), EQEmu::invslot::slotCursor, 0, 0); + user->SummonItem(new_weapon->ID, inst->GetCharges(), inst->GetAugmentItemID(0), inst->GetAugmentItemID(1), inst->GetAugmentItemID(2), inst->GetAugmentItemID(3), inst->GetAugmentItemID(4), inst->GetAugmentItemID(5), inst->IsAttuned(), EQ::invslot::slotCursor, 0, 0); user->MessageString(Chat::LightBlue, TRANSFORM_COMPLETE, inst->GetItem()->Name); } else if (inst) { @@ -339,6 +376,9 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob DBTradeskillRecipe_Struct spec; if (!content_db.GetTradeRecipe(container, c_type, some_id, user->CharacterID(), &spec)) { + + LogTradeskillsDetail("[HandleCombine] Check 2"); + user->MessageString(Chat::Emote,TRADESKILL_NOCOMBINE); auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0); user->QueuePacket(outapp); @@ -352,7 +392,10 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob // bit 2 (0x02): can try to experiment but not useable for auto-combine until learnt // bit 5 (0x10): no learn message, use unlisted flag to prevent it showing up on search // bit 6 (0x20): unlisted recipe flag - if ((spec.must_learn&0xF) == 1 && !spec.has_learnt) { + if ((spec.must_learn & 0xF) == 1 && !spec.has_learnt) { + + LogTradeskillsDetail("[HandleCombine] Check 3"); + // Made up message for the client. Just giving a DNC is the other option. user->Message(Chat::LightBlue, "You need to learn how to combine these first."); auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0); @@ -362,6 +405,9 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob } // Character does not have the required skill. if(spec.skill_needed > 0 && user->GetSkill(spec.tradeskill) < spec.skill_needed ) { + + LogTradeskillsDetail("Check 4"); + // Notify client. user->Message(Chat::LightBlue, "You are not skilled enough."); auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0); @@ -371,7 +417,7 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob } //changing from a switch to string of if's since we don't need to iterate through all of the skills in the SkillType enum - if (spec.tradeskill == EQEmu::skills::SkillAlchemy) { + if (spec.tradeskill == EQ::skills::SkillAlchemy) { if (user_pp.class_ != SHAMAN) { user->Message(Chat::Red, "This tradeskill can only be performed by a shaman."); return; @@ -381,13 +427,13 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob return; } } - else if (spec.tradeskill == EQEmu::skills::SkillTinkering) { + else if (spec.tradeskill == EQ::skills::SkillTinkering) { if (user_pp.race != GNOME) { user->Message(Chat::Red, "Only gnomes can tinker."); return; } } - else if (spec.tradeskill == EQEmu::skills::SkillMakePoison) { + else if (spec.tradeskill == EQ::skills::SkillMakePoison) { if (user_pp.class_ != ROGUE) { user->Message(Chat::Red, "Only rogues can mix poisons."); return; @@ -418,10 +464,10 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob safe_delete(outapp); database.DeleteWorldContainer(worldo->m_id, zone->GetZoneID()); } else{ - for (uint8 i = EQEmu::invbag::SLOT_BEGIN; i < EQEmu::invtype::WORLD_SIZE; i++) { - const EQEmu::ItemInstance* inst = container->GetItem(i); + for (uint8 i = EQ::invbag::SLOT_BEGIN; i < EQ::invtype::WORLD_SIZE; i++) { + const EQ::ItemInstance* inst = container->GetItem(i); if (inst) { - user->DeleteItemInInventory(EQEmu::InventoryProfile::CalcSlotId(in_combine->container_slot, i), 0, true); + user->DeleteItemInInventory(EQ::InventoryProfile::CalcSlotId(in_combine->container_slot, i), 0, true); } } container->Clear(); @@ -441,18 +487,21 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob // Replace the container on success if required. // - if(success && spec.replace_container) { - if(worldcontainer){ + if (success && spec.replace_container) { + if (worldcontainer) { //should report this error, but we dont have the recipe ID, so its not very useful LogError("Replace container combine executed in a world container"); } - else + else { user->DeleteItemInInventory(in_combine->container_slot, 0, true); + } } - if (success) + if (success) { parse->EventPlayer(EVENT_COMBINE_SUCCESS, user, spec.name.c_str(), spec.recipe_id); - else + } + else { parse->EventPlayer(EVENT_COMBINE_FAILURE, user, spec.name.c_str(), spec.recipe_id); + } } void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac) { @@ -518,7 +567,7 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac memset(counts, 0, sizeof(counts)); //search for all the items in their inventory - EQEmu::InventoryProfile& user_inv = user->GetInv(); + EQ::InventoryProfile& user_inv = user->GetInv(); uint8 count = 0; uint8 needcount = 0; @@ -554,7 +603,7 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac user->MessageString(Chat::Skills, TRADESKILL_MISSING_COMPONENTS); for (auto it = MissingItems.begin(); it != MissingItems.end(); ++it) { - const EQEmu::ItemData* item = database.GetItem(*it); + const EQ::ItemData* item = database.GetItem(*it); if(item) user->MessageString(Chat::Skills, TRADESKILL_MISSING_ITEM, item->Name); @@ -583,7 +632,7 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac return; } - const EQEmu::ItemInstance* inst = user_inv.GetItem(slot); + const EQ::ItemInstance* inst = user_inv.GetItem(slot); if (inst && !inst->IsStackable()) user->DeleteItemInInventory(slot, 0, true); @@ -621,84 +670,84 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac parse->EventPlayer(EVENT_COMBINE_FAILURE, user, spec.name.c_str(), spec.recipe_id); } -EQEmu::skills::SkillType Object::TypeToSkill(uint32 type) +EQ::skills::SkillType Object::TypeToSkill(uint32 type) { switch(type) { // grouped and ordered by SkillUseTypes name - new types need to be verified for proper SkillUseTypes and use /*SkillAlchemy*/ - case EQEmu::item::BagTypeMedicineBag: - return EQEmu::skills::SkillAlchemy; + case EQ::item::BagTypeMedicineBag: + return EQ::skills::SkillAlchemy; /*SkillBaking*/ - //case EQEmu::item::BagTypeMixingBowl: // No idea... - case EQEmu::item::BagTypeOven: - return EQEmu::skills::SkillBaking; + //case EQ::item::BagTypeMixingBowl: // No idea... + case EQ::item::BagTypeOven: + return EQ::skills::SkillBaking; /*SkillBlacksmithing*/ - case EQEmu::item::BagTypeForge: - //case EQEmu::item::BagTypeKoadaDalForge: - case EQEmu::item::BagTypeTeirDalForge: - case EQEmu::item::BagTypeOggokForge: - case EQEmu::item::BagTypeStormguardForge: - //case EQEmu::item::BagTypeAkanonForge: - //case EQEmu::item::BagTypeNorthmanForge: - //case EQEmu::item::BagTypeCabilisForge: - //case EQEmu::item::BagTypeFreeportForge: - //case EQEmu::item::BagTypeRoyalQeynosForge: - //case EQEmu::item::BagTypeTrollForge: - case EQEmu::item::BagTypeFierDalForge: - case EQEmu::item::BagTypeValeForge: - //case EQEmu::item::BagTypeErudForge: - //case EQEmu::item::BagTypeGuktaForge: - return EQEmu::skills::SkillBlacksmithing; + case EQ::item::BagTypeForge: + //case EQ::item::BagTypeKoadaDalForge: + case EQ::item::BagTypeTeirDalForge: + case EQ::item::BagTypeOggokForge: + case EQ::item::BagTypeStormguardForge: + //case EQ::item::BagTypeAkanonForge: + //case EQ::item::BagTypeNorthmanForge: + //case EQ::item::BagTypeCabilisForge: + //case EQ::item::BagTypeFreeportForge: + //case EQ::item::BagTypeRoyalQeynosForge: + //case EQ::item::BagTypeTrollForge: + case EQ::item::BagTypeFierDalForge: + case EQ::item::BagTypeValeForge: + //case EQ::item::BagTypeErudForge: + //case EQ::item::BagTypeGuktaForge: + return EQ::skills::SkillBlacksmithing; /*SkillBrewing*/ - //case EQEmu::item::BagTypeIceCreamChurn: // No idea... - case EQEmu::item::BagTypeBrewBarrel: - return EQEmu::skills::SkillBrewing; + //case EQ::item::BagTypeIceCreamChurn: // No idea... + case EQ::item::BagTypeBrewBarrel: + return EQ::skills::SkillBrewing; /*SkillFishing*/ - case EQEmu::item::BagTypeTackleBox: - return EQEmu::skills::SkillFishing; + case EQ::item::BagTypeTackleBox: + return EQ::skills::SkillFishing; /*SkillFletching*/ - case EQEmu::item::BagTypeFletchingKit: - //case EQEmu::item::BagTypeFierDalFletchingKit: - return EQEmu::skills::SkillFletching; + case EQ::item::BagTypeFletchingKit: + //case EQ::item::BagTypeFierDalFletchingKit: + return EQ::skills::SkillFletching; /*SkillJewelryMaking*/ - case EQEmu::item::BagTypeJewelersKit: - return EQEmu::skills::SkillJewelryMaking; + case EQ::item::BagTypeJewelersKit: + return EQ::skills::SkillJewelryMaking; /*SkillMakePoison*/ // This is a guess and needs to be verified... (Could be SkillAlchemy) - //case EQEmu::item::BagTypeMortar: + //case EQ::item::BagTypeMortar: // return SkillMakePoison; /*SkillPottery*/ - case EQEmu::item::BagTypePotteryWheel: - case EQEmu::item::BagTypeKiln: - //case EQEmu::item::BagTypeIksarPotteryWheel: - return EQEmu::skills::SkillPottery; + case EQ::item::BagTypePotteryWheel: + case EQ::item::BagTypeKiln: + //case EQ::item::BagTypeIksarPotteryWheel: + return EQ::skills::SkillPottery; /*SkillResearch*/ - //case EQEmu::item::BagTypeLexicon: - case EQEmu::item::BagTypeWizardsLexicon: - case EQEmu::item::BagTypeMagesLexicon: - case EQEmu::item::BagTypeNecromancersLexicon: - case EQEmu::item::BagTypeEnchantersLexicon: - //case EQEmu::item::BagTypeConcordanceofResearch: - return EQEmu::skills::SkillResearch; + //case EQ::item::BagTypeLexicon: + case EQ::item::BagTypeWizardsLexicon: + case EQ::item::BagTypeMagesLexicon: + case EQ::item::BagTypeNecromancersLexicon: + case EQ::item::BagTypeEnchantersLexicon: + //case EQ::item::BagTypeConcordanceofResearch: + return EQ::skills::SkillResearch; /*SkillTailoring*/ - case EQEmu::item::BagTypeSewingKit: - //case EQEmu::item::BagTypeHalflingTailoringKit: - //case EQEmu::item::BagTypeErudTailoringKit: - //case EQEmu::item::BagTypeFierDalTailoringKit: - return EQEmu::skills::SkillTailoring; + case EQ::item::BagTypeSewingKit: + //case EQ::item::BagTypeHalflingTailoringKit: + //case EQ::item::BagTypeErudTailoringKit: + //case EQ::item::BagTypeFierDalTailoringKit: + return EQ::skills::SkillTailoring; /*SkillTinkering*/ - case EQEmu::item::BagTypeToolBox: - return EQEmu::skills::SkillTinkering; + case EQ::item::BagTypeToolBox: + return EQ::skills::SkillTinkering; /*Undefined*/ default: @@ -739,7 +788,7 @@ void Client::SendTradeskillSearchResults( // Recipes that have either been made before or were // explicitly learned are excempt from that limit if (RuleB(Skills, UseLimitTradeskillSearchSkillDiff) && - ((int32) trivial - (int32) GetSkill((EQEmu::skills::SkillType) tradeskill)) > + ((int32) trivial - (int32) GetSkill((EQ::skills::SkillType) tradeskill)) > RuleI(Skills, MaxTradeskillSearchSkillDiff)) { LogTradeskills("Checking limit recipe_id [{}] name [{}]", recipe_id, name); @@ -897,34 +946,34 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { // If you want to customize the stage1 success rate do it here. // Remember: skillup_modifier is (float). Lower is better switch(spec->tradeskill) { - case EQEmu::skills::SkillFletching: + case EQ::skills::SkillFletching: skillup_modifier = RuleI(Character, TradeskillUpFletching); break; - case EQEmu::skills::SkillAlchemy: + case EQ::skills::SkillAlchemy: skillup_modifier = RuleI(Character, TradeskillUpAlchemy); break; - case EQEmu::skills::SkillJewelryMaking: + case EQ::skills::SkillJewelryMaking: skillup_modifier = RuleI(Character, TradeskillUpJewelcrafting); break; - case EQEmu::skills::SkillPottery: + case EQ::skills::SkillPottery: skillup_modifier = RuleI(Character, TradeskillUpPottery); break; - case EQEmu::skills::SkillBaking: + case EQ::skills::SkillBaking: skillup_modifier = RuleI(Character, TradeskillUpBaking); break; - case EQEmu::skills::SkillBrewing: + case EQ::skills::SkillBrewing: skillup_modifier = RuleI(Character, TradeskillUpBrewing); break; - case EQEmu::skills::SkillBlacksmithing: + case EQ::skills::SkillBlacksmithing: skillup_modifier = RuleI(Character, TradeskillUpBlacksmithing); break; - case EQEmu::skills::SkillResearch: + case EQ::skills::SkillResearch: skillup_modifier = RuleI(Character, TradeskillUpResearch); break; - case EQEmu::skills::SkillMakePoison: + case EQ::skills::SkillMakePoison: skillup_modifier = RuleI(Character, TradeskillUpMakePoison); break; - case EQEmu::skills::SkillTinkering: + case EQ::skills::SkillTinkering: skillup_modifier = RuleI(Character, TradeskillUpTinkering); break; default: @@ -935,11 +984,11 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { // Some tradeskills take the higher of one additional stat beside INT and WIS // to determine the skillup rate. Additionally these tradeskills do not have an // -15 modifier on their statbonus. - if (spec->tradeskill == EQEmu::skills::SkillFletching || spec->tradeskill == EQEmu::skills::SkillMakePoison) { + if (spec->tradeskill == EQ::skills::SkillFletching || spec->tradeskill == EQ::skills::SkillMakePoison) { thirdstat = GetDEX(); stat_modifier = 0; } - else if (spec->tradeskill == EQEmu::skills::SkillBlacksmithing) { + else if (spec->tradeskill == EQ::skills::SkillBlacksmithing) { thirdstat = GetSTR(); stat_modifier = 0; } @@ -992,8 +1041,8 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { aa_chance = spellbonuses.ReduceTradeskillFail[spec->tradeskill] + itembonuses.ReduceTradeskillFail[spec->tradeskill] + aabonuses.ReduceTradeskillFail[spec->tradeskill]; - const EQEmu::ItemData* item = nullptr; - + const EQ::ItemData* item = nullptr; + chance = mod_tradeskill_chance(chance, spec); if (((spec->tradeskill==75) || GetGM() || (chance > res)) || zone->random.Roll(aa_chance)) { @@ -1100,7 +1149,7 @@ bool Client::TradeskillExecute(DBTradeskillRecipe_Struct *spec) { return(false); } -void Client::CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, EQEmu::skills::SkillType tradeskill) +void Client::CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float skillup_modifier, uint16 success_modifier, EQ::skills::SkillType tradeskill) { uint16 current_raw_skill = GetRawSkill(tradeskill); @@ -1144,45 +1193,70 @@ void Client::CheckIncreaseTradeskill(int16 bonusstat, int16 stat_modifier, float LogTradeskills("[CheckIncreaseTradeskill] Stage2 chance was: [{}] percent. 0 percent means stage1 failed", chance_stage2); } -bool ZoneDatabase::GetTradeRecipe(const EQEmu::ItemInstance* container, uint8 c_type, uint32 some_id, - uint32 char_id, DBTradeskillRecipe_Struct *spec) +bool ZoneDatabase::GetTradeRecipe( + const EQ::ItemInstance *container, + uint8 c_type, + uint32 some_id, + uint32 char_id, + DBTradeskillRecipe_Struct *spec +) { - if (container == nullptr) + if (container == nullptr) { + LogTradeskills("[GetTradeRecipe] Container null"); return false; + } std::string containers;// make where clause segment for container(s) - if (some_id == 0) + if (some_id == 0) { containers = StringFormat("= %u", c_type); // world combiner so no item number - else - containers = StringFormat("IN (%u,%u)", c_type, some_id); // container in inventory + } + else { + containers = StringFormat("IN (%u,%u)", c_type, some_id); + } // container in inventory //Could prolly watch for stacks in this loop and handle them properly... //just increment sum and count accordingly - bool first = true; + bool first = true; std::string buf2; - uint32 count = 0; - uint32 sum = 0; - for (uint8 i = 0; i < 10; i++) { // TODO: need to determine if this is bound to world/item container size - const EQEmu::ItemInstance* inst = container->GetItem(i); - if (!inst) - continue; + uint32 count = 0; + uint32 sum = 0; + for (uint8 i = 0; i < 10; i++) { // TODO: need to determine if this is bound to world/item container size + LogTradeskills("[GetTradeRecipe] Fetching item [{}]", i); - const EQEmu::ItemData* item = GetItem(inst->GetItem()->ID); - if (!item) - continue; + const EQ::ItemInstance *inst = container->GetItem(i); + if (!inst) { + continue; + } - if(first) { - buf2 += StringFormat("%d", item->ID); - first = false; - } else - buf2 += StringFormat(",%d", item->ID); + const EQ::ItemData *item = database.GetItem(inst->GetItem()->ID); + if (!item) { + LogTradeskills("[GetTradeRecipe] item [{}] not found!", inst->GetItem()->ID); + continue; + } - sum += item->ID; - count++; + if (first) { + buf2 += StringFormat("%d", item->ID); + first = false; + } + else { + buf2 += StringFormat(",%d", item->ID); + } + + sum += item->ID; + count++; + + LogTradeskills( + "[GetTradeRecipe] Item in container index [{}] item [{}] found [{}]", + i, + item->ID, + count + ); } - if(count == 0) - return false; //no items == no recipe + //no items == no recipe + if (count == 0) { + return false; + } std::string query = StringFormat("SELECT tre.recipe_id " "FROM tradeskill_recipe_entries AS tre " @@ -1216,23 +1290,24 @@ bool ZoneDatabase::GetTradeRecipe(const EQEmu::ItemInstance* container, uint8 c_ //length limit on buf2 if(index == 214) { //Maximum number of recipe matches (19 * 215 = 4096) - LogError("GetTradeRecipe warning: Too many matches. Unable to search all recipe entries. Searched [{}] of [{}] possible entries", index + 1, results.RowCount()); + LogError("GetTradeRecipe warning: Too many matches. Unable to search all recipe entries. Searched [{}] of [{}] possible entries", index + 1, results.RowCount()); break; } } query = StringFormat("SELECT tre.recipe_id " "FROM tradeskill_recipe_entries AS tre " - "WHERE tre.recipe_id IN (%s) " - "GROUP BY tre.recipe_id HAVING sum(tre.componentcount) = %u " - "AND sum(tre.item_id * tre.componentcount) = %u", buf2.c_str(), count, sum); + "WHERE tre.recipe_id IN (%s) " + "GROUP BY tre.recipe_id HAVING sum(tre.componentcount) = %u " + "AND sum(tre.item_id * tre.componentcount) = %u", buf2.c_str(), count, sum + ); results = QueryDatabase(query); - if (!results.Success()) { - LogError("Error in GetTradeRecipe, re-query: [{}]", query.c_str()); - LogError("Error in GetTradeRecipe, error: [{}]", results.ErrorMessage().c_str()); - return false; - } - } + if (!results.Success()) { + LogError("Error in GetTradeRecipe, re-query: [{}]", query.c_str()); + LogError("Error in GetTradeRecipe, error: [{}]", results.ErrorMessage().c_str()); + return false; + } + } if (results.RowCount() < 1) return false; @@ -1294,28 +1369,38 @@ bool ZoneDatabase::GetTradeRecipe(const EQEmu::ItemInstance* container, uint8 c_ return GetTradeRecipe(recipe_id, c_type, some_id, char_id, spec); } - if (results.RowCount() == 0) - return GetTradeRecipe(recipe_id, c_type, some_id, char_id, spec); + if (results.RowCount() == 0) { + return GetTradeRecipe(recipe_id, c_type, some_id, char_id, spec); + } for (auto row = results.begin(); row != results.end(); ++row) { - int ccnt = 0; + int component_count = 0; - for (int x = EQEmu::invbag::SLOT_BEGIN; x < EQEmu::invtype::WORLD_SIZE; x++) { - const EQEmu::ItemInstance* inst = container->GetItem(x); + for (int x = EQ::invbag::SLOT_BEGIN; x < EQ::invtype::WORLD_SIZE; x++) { + const EQ::ItemInstance* inst = container->GetItem(x); if(!inst) continue; - const EQEmu::ItemData* item = GetItem(inst->GetItem()->ID); + const EQ::ItemData* item = database.GetItem(inst->GetItem()->ID); if (!item) continue; - if(item->ID == atoi(row[0])) - ccnt++; - } + if (item->ID == atoi(row[0])) { + component_count++; + } - if(ccnt != atoi(row[1])) - return false; - } + LogTradeskills( + "[GetTradeRecipe] Component count loop [{}] item [{}] recipe component_count [{}]", + component_count, + item->ID, + atoi(row[1]) + ); + } + + if (component_count != atoi(row[1])) { + return false; + } + } return GetTradeRecipe(recipe_id, c_type, some_id, char_id, spec); } @@ -1378,7 +1463,7 @@ bool ZoneDatabase::GetTradeRecipe( auto row = results.begin(); - spec->tradeskill = (EQEmu::skills::SkillType) atoi(row[1]); + spec->tradeskill = (EQ::skills::SkillType) atoi(row[1]); spec->skill_needed = (int16) atoi(row[2]); spec->trivial = (uint16) atoi(row[3]); spec->nofail = atoi(row[4]) ? true : false; @@ -1497,7 +1582,7 @@ void Client::LearnRecipe(uint32 recipe_id) return; } - auto tradeskill_recipe = TradeskillRecipeRepository::GetRecipe(recipe_id); + auto tradeskill_recipe = TradeskillRecipeRepository::FindOne(content_db, recipe_id); if (tradeskill_recipe.id == 0) { LogError("Invalid recipe [{}]", recipe_id); return; @@ -1526,32 +1611,32 @@ void Client::LearnRecipe(uint32 recipe_id) ); } -bool Client::CanIncreaseTradeskill(EQEmu::skills::SkillType tradeskill) { +bool Client::CanIncreaseTradeskill(EQ::skills::SkillType tradeskill) { uint32 rawskill = GetRawSkill(tradeskill); uint16 maxskill = MaxSkill(tradeskill); if (rawskill >= maxskill) //Max skill sanity check return false; - uint8 Baking = (GetRawSkill(EQEmu::skills::SkillBaking) > 200) ? 1 : 0; - uint8 Smithing = (GetRawSkill(EQEmu::skills::SkillBlacksmithing) > 200) ? 1 : 0; - uint8 Brewing = (GetRawSkill(EQEmu::skills::SkillBrewing) > 200) ? 1 : 0; - uint8 Fletching = (GetRawSkill(EQEmu::skills::SkillFletching) > 200) ? 1 : 0; - uint8 Jewelry = (GetRawSkill(EQEmu::skills::SkillJewelryMaking) > 200) ? 1 : 0; - uint8 Pottery = (GetRawSkill(EQEmu::skills::SkillPottery) > 200) ? 1 : 0; - uint8 Tailoring = (GetRawSkill(EQEmu::skills::SkillTailoring) > 200) ? 1 : 0; + uint8 Baking = (GetRawSkill(EQ::skills::SkillBaking) > 200) ? 1 : 0; + uint8 Smithing = (GetRawSkill(EQ::skills::SkillBlacksmithing) > 200) ? 1 : 0; + uint8 Brewing = (GetRawSkill(EQ::skills::SkillBrewing) > 200) ? 1 : 0; + uint8 Fletching = (GetRawSkill(EQ::skills::SkillFletching) > 200) ? 1 : 0; + uint8 Jewelry = (GetRawSkill(EQ::skills::SkillJewelryMaking) > 200) ? 1 : 0; + uint8 Pottery = (GetRawSkill(EQ::skills::SkillPottery) > 200) ? 1 : 0; + uint8 Tailoring = (GetRawSkill(EQ::skills::SkillTailoring) > 200) ? 1 : 0; uint8 SkillTotal = Baking + Smithing + Brewing + Fletching + Jewelry + Pottery + Tailoring; //Tradeskills above 200 //New Tanaan AA: Each level allows an additional tradeskill above 200 (first one is free) - uint8 aaLevel = spellbonuses.TradeSkillMastery + itembonuses.TradeSkillMastery + aabonuses.TradeSkillMastery; - + uint8 aaLevel = spellbonuses.TradeSkillMastery + itembonuses.TradeSkillMastery + aabonuses.TradeSkillMastery; + switch (tradeskill) { - case EQEmu::skills::SkillBaking: - case EQEmu::skills::SkillBlacksmithing: - case EQEmu::skills::SkillBrewing: - case EQEmu::skills::SkillFletching: - case EQEmu::skills::SkillJewelryMaking: - case EQEmu::skills::SkillPottery: - case EQEmu::skills::SkillTailoring: + case EQ::skills::SkillBaking: + case EQ::skills::SkillBlacksmithing: + case EQ::skills::SkillBrewing: + case EQ::skills::SkillFletching: + case EQ::skills::SkillJewelryMaking: + case EQ::skills::SkillPottery: + case EQ::skills::SkillTailoring: if (aaLevel == 6) break; //Maxed AA if (SkillTotal == 0) diff --git a/zone/trading.cpp b/zone/trading.cpp index 27e4cc112..1d75bd941 100644 --- a/zone/trading.cpp +++ b/zone/trading.cpp @@ -99,14 +99,14 @@ void Trade::AddEntity(uint16 trade_slot_id, uint32 stack_size) { // Item always goes into trade bucket from cursor Client* client = owner->CastToClient(); - EQEmu::ItemInstance* inst = client->GetInv().GetItem(EQEmu::invslot::slotCursor); + EQ::ItemInstance* inst = client->GetInv().GetItem(EQ::invslot::slotCursor); if (!inst) { client->Message(Chat::Red, "Error: Could not find item on your cursor!"); return; } - EQEmu::ItemInstance* inst2 = client->GetInv().GetItem(trade_slot_id); + EQ::ItemInstance* inst2 = client->GetInv().GetItem(trade_slot_id); // it looks like the original code attempted to allow stacking... // (it just didn't handle partial stack move actions) @@ -132,7 +132,7 @@ void Trade::AddEntity(uint16 trade_slot_id, uint32 stack_size) { if (_stack_size > 0) inst->SetCharges(_stack_size); else - client->DeleteItemInInventory(EQEmu::invslot::slotCursor); + client->DeleteItemInInventory(EQ::invslot::slotCursor); SendItemData(inst2, trade_slot_id); } @@ -147,7 +147,7 @@ void Trade::AddEntity(uint16 trade_slot_id, uint32 stack_size) { LogTrading("[{}] added item [{}] to trade slot [{}]", owner->GetName(), inst->GetItem()->Name, trade_slot_id); client->PutItemInInventory(trade_slot_id, *inst); - client->DeleteItemInInventory(EQEmu::invslot::slotCursor); + client->DeleteItemInInventory(EQ::invslot::slotCursor); } } @@ -159,7 +159,7 @@ Mob* Trade::With() } // Private Method: Send item data for trade item to other person involved in trade -void Trade::SendItemData(const EQEmu::ItemInstance* inst, int16 dest_slot_id) +void Trade::SendItemData(const EQ::ItemInstance* inst, int16 dest_slot_id) { if (inst == nullptr) return; @@ -172,13 +172,13 @@ void Trade::SendItemData(const EQEmu::ItemInstance* inst, int16 dest_slot_id) Client* with = mob->CastToClient(); Client* trader = owner->CastToClient(); if (with && with->IsClient()) { - with->SendItemPacket(dest_slot_id - EQEmu::invslot::TRADE_BEGIN, inst, ItemPacketTradeView); + with->SendItemPacket(dest_slot_id - EQ::invslot::TRADE_BEGIN, inst, ItemPacketTradeView); if (inst->GetItem()->ItemClass == 1) { - for (uint16 i = EQEmu::invbag::SLOT_BEGIN; i <= EQEmu::invbag::SLOT_END; i++) { - uint16 bagslot_id = EQEmu::InventoryProfile::CalcSlotId(dest_slot_id, i); - const EQEmu::ItemInstance* bagitem = trader->GetInv().GetItem(bagslot_id); + for (uint16 i = EQ::invbag::SLOT_BEGIN; i <= EQ::invbag::SLOT_END; i++) { + uint16 bagslot_id = EQ::InventoryProfile::CalcSlotId(dest_slot_id, i); + const EQ::ItemInstance* bagitem = trader->GetInv().GetItem(bagslot_id); if (bagitem) { - with->SendItemPacket(bagslot_id - EQEmu::invslot::TRADE_BEGIN, bagitem, ItemPacketTradeView); + with->SendItemPacket(bagslot_id - EQ::invslot::TRADE_BEGIN, bagitem, ItemPacketTradeView); } } } @@ -200,7 +200,7 @@ void Trade::LogTrade() uint8 item_count = 0; if (zone->tradevar != 0) { - for (uint16 i = EQEmu::invslot::TRADE_BEGIN; i <= EQEmu::invslot::TRADE_END; i++) { + for (uint16 i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_END; i++) { if (trader->GetInv().GetItem(i)) item_count++; } @@ -252,8 +252,8 @@ void Trade::LogTrade() if (item_count > 0) { strcat(logtext, "items {"); - for (uint16 i = EQEmu::invslot::TRADE_BEGIN; i <= EQEmu::invslot::TRADE_END; i++) { - const EQEmu::ItemInstance* inst = trader->GetInv().GetItem(i); + for (uint16 i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_END; i++) { + const EQ::ItemInstance* inst = trader->GetInv().GetItem(i); if (!comma) comma = true; @@ -268,7 +268,7 @@ void Trade::LogTrade() strcat(logtext, item_num); if (inst->IsClassBag()) { - for (uint8 j = EQEmu::invbag::SLOT_BEGIN; j <= EQEmu::invbag::SLOT_END; j++) { + for (uint8 j = EQ::invbag::SLOT_BEGIN; j <= EQ::invbag::SLOT_END; j++) { inst = trader->GetInv().GetItem(i, j); if (inst) { strcat(logtext, ","); @@ -304,8 +304,8 @@ void Trade::DumpTrade() return; Client* trader = owner->CastToClient(); - for (uint16 i = EQEmu::invslot::TRADE_BEGIN; i <= EQEmu::invslot::TRADE_END; i++) { - const EQEmu::ItemInstance* inst = trader->GetInv().GetItem(i); + for (uint16 i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_END; i++) { + const EQ::ItemInstance* inst = trader->GetInv().GetItem(i); if (inst) { LogTrading("Item [{}] (Charges=[{}], Slot=[{}], IsBag=[{}])", @@ -313,12 +313,12 @@ void Trade::DumpTrade() i, ((inst->IsClassBag()) ? "True" : "False")); if (inst->IsClassBag()) { - for (uint8 j = EQEmu::invbag::SLOT_BEGIN; j <= EQEmu::invbag::SLOT_END; j++) { + for (uint8 j = EQ::invbag::SLOT_BEGIN; j <= EQ::invbag::SLOT_END; j++) { inst = trader->GetInv().GetItem(i, j); if (inst) { LogTrading("\tBagItem [{}] (Charges=[{}], Slot=[{}])", inst->GetItem()->ID, inst->GetCharges(), - EQEmu::InventoryProfile::CalcSlotId(i, j)); + EQ::InventoryProfile::CalcSlotId(i, j)); } } } @@ -333,8 +333,8 @@ void Client::ResetTrade() { AddMoneyToPP(trade->cp, trade->sp, trade->gp, trade->pp, true); // step 1: process bags - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_END; ++trade_slot) { - const EQEmu::ItemInstance* inst = m_inv[trade_slot]; + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_END; ++trade_slot) { + const EQ::ItemInstance* inst = m_inv[trade_slot]; if (inst && inst->IsClassBag()) { int16 free_slot = m_inv.FindFreeSlotForTradeItem(inst); @@ -352,18 +352,18 @@ void Client::ResetTrade() { } // step 2a: process stackables - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_END; ++trade_slot) { - EQEmu::ItemInstance* inst = GetInv().GetItem(trade_slot); + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_END; ++trade_slot) { + EQ::ItemInstance* inst = GetInv().GetItem(trade_slot); if (inst && inst->IsStackable()) { while (true) { // there's no built-in safety check against an infinite loop..but, it should break on one of the conditional checks int16 free_slot = m_inv.FindFreeSlotForTradeItem(inst); - if ((free_slot == EQEmu::invslot::slotCursor) || (free_slot == INVALID_INDEX)) + if ((free_slot == EQ::invslot::slotCursor) || (free_slot == INVALID_INDEX)) break; - EQEmu::ItemInstance* partial_inst = GetInv().GetItem(free_slot); + EQ::ItemInstance* partial_inst = GetInv().GetItem(free_slot); if (!partial_inst) break; @@ -399,15 +399,15 @@ void Client::ResetTrade() { // step 2b: adjust trade stack bias // (if any partial stacks exist before the final stack, FindFreeSlotForTradeItem() will return that slot in step 3 and an overwrite will occur) - for (int16 trade_slot = EQEmu::invslot::TRADE_END; trade_slot >= EQEmu::invslot::TRADE_BEGIN; --trade_slot) { - EQEmu::ItemInstance* inst = GetInv().GetItem(trade_slot); + for (int16 trade_slot = EQ::invslot::TRADE_END; trade_slot >= EQ::invslot::TRADE_BEGIN; --trade_slot) { + EQ::ItemInstance* inst = GetInv().GetItem(trade_slot); if (inst && inst->IsStackable()) { - for (int16 bias_slot = EQEmu::invslot::TRADE_BEGIN; bias_slot <= EQEmu::invslot::TRADE_END; ++bias_slot) { + for (int16 bias_slot = EQ::invslot::TRADE_BEGIN; bias_slot <= EQ::invslot::TRADE_END; ++bias_slot) { if (bias_slot >= trade_slot) break; - EQEmu::ItemInstance* bias_inst = GetInv().GetItem(bias_slot); + EQ::ItemInstance* bias_inst = GetInv().GetItem(bias_slot); if (!bias_inst || (bias_inst->GetID() != inst->GetID()) || (bias_inst->GetCharges() >= bias_inst->GetItem()->StackSize)) continue; @@ -433,8 +433,8 @@ void Client::ResetTrade() { } // step 3: process everything else - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_END; ++trade_slot) { - const EQEmu::ItemInstance* inst = m_inv[trade_slot]; + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_END; ++trade_slot) { + const EQ::ItemInstance* inst = m_inv[trade_slot]; if (inst) { int16 free_slot = m_inv.FindFreeSlotForTradeItem(inst); @@ -488,8 +488,8 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st } // step 1: process bags - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_END; ++trade_slot) { - const EQEmu::ItemInstance* inst = m_inv[trade_slot]; + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_END; ++trade_slot) { + const EQ::ItemInstance* inst = m_inv[trade_slot]; if (inst && inst->IsClassBag()) { LogTrading("Giving container [{}] ([{}]) in slot [{}] to [{}]", inst->GetItem()->Name, inst->GetItem()->ID, trade_slot, other->GetName()); @@ -523,16 +523,16 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st else qs_audit->char1_count += detail->charges; - for (uint8 sub_slot = EQEmu::invbag::SLOT_BEGIN; (sub_slot <= EQEmu::invbag::SLOT_END); ++sub_slot) { // this is to catch ALL items - const EQEmu::ItemInstance* bag_inst = inst->GetItem(sub_slot); + for (uint8 sub_slot = EQ::invbag::SLOT_BEGIN; (sub_slot <= EQ::invbag::SLOT_END); ++sub_slot) { // this is to catch ALL items + const EQ::ItemInstance* bag_inst = inst->GetItem(sub_slot); if (bag_inst) { detail = new QSTradeItems_Struct; detail->from_id = this->character_id; - detail->from_slot = EQEmu::InventoryProfile::CalcSlotId(trade_slot, sub_slot); + detail->from_slot = EQ::InventoryProfile::CalcSlotId(trade_slot, sub_slot); detail->to_id = other->CharacterID(); - detail->to_slot = EQEmu::InventoryProfile::CalcSlotId(free_slot, sub_slot); + detail->to_slot = EQ::InventoryProfile::CalcSlotId(free_slot, sub_slot); detail->item_id = bag_inst->GetID(); detail->charges = (!bag_inst->IsStackable() ? 1 : bag_inst->GetCharges()); detail->aug_1 = bag_inst->GetAugmentItemID(1); @@ -571,18 +571,18 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st } // step 2a: process stackables - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_END; ++trade_slot) { - EQEmu::ItemInstance* inst = GetInv().GetItem(trade_slot); + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_END; ++trade_slot) { + EQ::ItemInstance* inst = GetInv().GetItem(trade_slot); if (inst && inst->IsStackable()) { while (true) { // there's no built-in safety check against an infinite loop..but, it should break on one of the conditional checks int16 partial_slot = other->GetInv().FindFreeSlotForTradeItem(inst); - if ((partial_slot == EQEmu::invslot::slotCursor) || (partial_slot == INVALID_INDEX)) + if ((partial_slot == EQ::invslot::slotCursor) || (partial_slot == INVALID_INDEX)) break; - EQEmu::ItemInstance* partial_inst = other->GetInv().GetItem(partial_slot); + EQ::ItemInstance* partial_inst = other->GetInv().GetItem(partial_slot); if (!partial_inst) break; @@ -653,15 +653,15 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st // step 2b: adjust trade stack bias // (if any partial stacks exist before the final stack, FindFreeSlotForTradeItem() will return that slot in step 3 and an overwrite will occur) - for (int16 trade_slot = EQEmu::invslot::TRADE_END; trade_slot >= EQEmu::invslot::TRADE_BEGIN; --trade_slot) { - EQEmu::ItemInstance* inst = GetInv().GetItem(trade_slot); + for (int16 trade_slot = EQ::invslot::TRADE_END; trade_slot >= EQ::invslot::TRADE_BEGIN; --trade_slot) { + EQ::ItemInstance* inst = GetInv().GetItem(trade_slot); if (inst && inst->IsStackable()) { - for (int16 bias_slot = EQEmu::invslot::TRADE_BEGIN; bias_slot <= EQEmu::invslot::TRADE_END; ++bias_slot) { + for (int16 bias_slot = EQ::invslot::TRADE_BEGIN; bias_slot <= EQ::invslot::TRADE_END; ++bias_slot) { if (bias_slot >= trade_slot) break; - EQEmu::ItemInstance* bias_inst = GetInv().GetItem(bias_slot); + EQ::ItemInstance* bias_inst = GetInv().GetItem(bias_slot); if (!bias_inst || (bias_inst->GetID() != inst->GetID()) || (bias_inst->GetCharges() >= bias_inst->GetItem()->StackSize)) continue; @@ -706,8 +706,8 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st } // step 3: process everything else - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_END; ++trade_slot) { - const EQEmu::ItemInstance* inst = m_inv[trade_slot]; + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_END; ++trade_slot) { + const EQ::ItemInstance* inst = m_inv[trade_slot]; if (inst) { LogTrading("Giving item [{}] ([{}]) in slot [{}] to [{}]", inst->GetItem()->Name, inst->GetItem()->ID, trade_slot, other->GetName()); @@ -742,8 +742,8 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st qs_audit->char1_count += detail->charges; // 'step 3' should never really see containers..but, just in case... - for (uint8 sub_slot = EQEmu::invbag::SLOT_BEGIN; (sub_slot <= EQEmu::invbag::SLOT_END); ++sub_slot) { // this is to catch ALL items - const EQEmu::ItemInstance* bag_inst = inst->GetItem(sub_slot); + for (uint8 sub_slot = EQ::invbag::SLOT_BEGIN; (sub_slot <= EQ::invbag::SLOT_END); ++sub_slot) { // this is to catch ALL items + const EQ::ItemInstance* bag_inst = inst->GetItem(sub_slot); if (bag_inst) { detail = new QSTradeItems_Struct; @@ -819,8 +819,8 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st } if(qs_log) { // This can be incorporated below when revisions are made - for (int16 trade_slot = EQEmu::invslot::TRADE_BEGIN; trade_slot <= EQEmu::invslot::TRADE_NPC_END; ++trade_slot) { - const EQEmu::ItemInstance* trade_inst = m_inv[trade_slot]; + for (int16 trade_slot = EQ::invslot::TRADE_BEGIN; trade_slot <= EQ::invslot::TRADE_NPC_END; ++trade_slot) { + const EQ::ItemInstance* trade_inst = m_inv[trade_slot]; if(trade_inst) { auto detail = new QSHandinItems_Struct; @@ -840,15 +840,15 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st qs_audit->char_count += detail->charges; if (trade_inst->IsClassBag()) { - for (uint8 sub_slot = EQEmu::invbag::SLOT_BEGIN; sub_slot < trade_inst->GetItem()->BagSlots; ++sub_slot) { - const EQEmu::ItemInstance* trade_baginst = trade_inst->GetItem(sub_slot); + for (uint8 sub_slot = EQ::invbag::SLOT_BEGIN; sub_slot < trade_inst->GetItem()->BagSlots; ++sub_slot) { + const EQ::ItemInstance* trade_baginst = trade_inst->GetItem(sub_slot); if(trade_baginst) { detail = new QSHandinItems_Struct; strcpy(detail->action_type, "HANDIN"); - detail->char_slot = EQEmu::InventoryProfile::CalcSlotId(trade_slot, sub_slot); + detail->char_slot = EQ::InventoryProfile::CalcSlotId(trade_slot, sub_slot); detail->item_id = trade_baginst->GetID(); detail->charges = (!trade_inst->IsStackable() ? 1 : trade_inst->GetCharges()); detail->aug_1 = trade_baginst->GetAugmentItemID(1); @@ -872,19 +872,19 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st quest_npc = true; } - std::vector item_list; - std::list items; - for (int i = EQEmu::invslot::TRADE_BEGIN; i <= EQEmu::invslot::TRADE_NPC_END; ++i) { - EQEmu::ItemInstance *inst = m_inv.GetItem(i); + std::vector item_list; + std::list items; + for (int i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_NPC_END; ++i) { + EQ::ItemInstance *inst = m_inv.GetItem(i); if(inst) { items.push_back(inst); item_list.push_back(inst); } else { - item_list.push_back((EQEmu::ItemInstance*)nullptr); + item_list.push_back((EQ::ItemInstance*)nullptr); continue; } - const EQEmu::ItemData* item = inst->GetItem(); + const EQ::ItemData* item = inst->GetItem(); if(item && quest_npc == false) { bool isPetAndCanHaveNoDrop = (RuleB(Pets, CanTakeNoDrop) && _CLIENTPET(tradingWith) && @@ -894,13 +894,22 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st (item->NoDrop != 0 || isPetAndCanHaveNoDrop))) { // pets need to look inside bags and try to equip items found there if (item->IsClassBag() && item->BagSlots > 0) { - for (int16 bslot = EQEmu::invbag::SLOT_BEGIN; bslot < item->BagSlots; bslot++) { - const EQEmu::ItemInstance* baginst = inst->GetItem(bslot); + for (int16 bslot = EQ::invbag::SLOT_BEGIN; bslot < item->BagSlots; bslot++) { + const EQ::ItemInstance* baginst = inst->GetItem(bslot); if (baginst) { - const EQEmu::ItemData* bagitem = baginst->GetItem(); + const EQ::ItemData* bagitem = baginst->GetItem(); if (bagitem && (GetGM() || (bagitem->NoDrop != 0 && baginst->IsAttuned() == false))) { - tradingWith->CastToNPC()->AddLootDrop(bagitem, &tradingWith->CastToNPC()->itemlist, - baginst->GetCharges(), 1, 127, true, true); + + auto loot_drop_entry = NPC::NewLootDropEntry(); + loot_drop_entry.equip_item = 1; + loot_drop_entry.item_charges = static_cast(baginst->GetCharges()); + + tradingWith->CastToNPC()->AddLootDrop( + bagitem, + &tradingWith->CastToNPC()->itemlist, + loot_drop_entry, + true + ); } else if (RuleB(NPC, ReturnNonQuestNoDropItems)) { PushItemOnCursor(*baginst, true); @@ -909,8 +918,16 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st } } - tradingWith->CastToNPC()->AddLootDrop(item, &tradingWith->CastToNPC()->itemlist, - inst->GetCharges(), 1, 127, true, true); + auto new_loot_drop_entry = NPC::NewLootDropEntry(); + new_loot_drop_entry.equip_item = 1; + new_loot_drop_entry.item_charges = static_cast(inst->GetCharges()); + + tradingWith->CastToNPC()->AddLootDrop( + item, + &tradingWith->CastToNPC()->itemlist, + new_loot_drop_entry, + true + ); } // Return NO DROP and Attuned items being handed into a non-quest NPC if the rule is true else if (RuleB(NPC, ReturnNonQuestNoDropItems)) { @@ -950,9 +967,9 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st tradingWith->FaceTarget(this); } - EQEmu::ItemInstance *insts[4] = { 0 }; - for (int i = EQEmu::invslot::TRADE_BEGIN; i <= EQEmu::invslot::TRADE_NPC_END; ++i) { - insts[i - EQEmu::invslot::TRADE_BEGIN] = m_inv.PopItem(i); + EQ::ItemInstance *insts[4] = { 0 }; + for (int i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_NPC_END; ++i) { + insts[i - EQ::invslot::TRADE_BEGIN] = m_inv.PopItem(i); database.SaveInventory(CharacterID(), nullptr, i); } @@ -971,8 +988,8 @@ bool Client::CheckTradeLoreConflict(Client* other) if (!other) return true; - for (int16 index = EQEmu::invslot::TRADE_BEGIN; index <= EQEmu::invslot::TRADE_END; ++index) { - const EQEmu::ItemInstance* inst = m_inv[index]; + for (int16 index = EQ::invslot::TRADE_BEGIN; index <= EQ::invslot::TRADE_END; ++index) { + const EQ::ItemInstance* inst = m_inv[index]; if (!inst || !inst->GetItem()) continue; @@ -980,8 +997,8 @@ bool Client::CheckTradeLoreConflict(Client* other) return true; } - for (int16 index = EQEmu::invbag::TRADE_BAGS_BEGIN; index <= EQEmu::invbag::TRADE_BAGS_END; ++index) { - const EQEmu::ItemInstance* inst = m_inv[index]; + for (int16 index = EQ::invbag::TRADE_BAGS_BEGIN; index <= EQ::invbag::TRADE_BAGS_END; ++index) { + const EQ::ItemInstance* inst = m_inv[index]; if (!inst || !inst->GetItem()) continue; @@ -994,8 +1011,8 @@ bool Client::CheckTradeLoreConflict(Client* other) bool Client::CheckTradeNonDroppable() { - for (int16 index = EQEmu::invslot::TRADE_BEGIN; index <= EQEmu::invslot::TRADE_END; ++index){ - const EQEmu::ItemInstance* inst = m_inv[index]; + for (int16 index = EQ::invslot::TRADE_BEGIN; index <= EQ::invslot::TRADE_END; ++index){ + const EQ::ItemInstance* inst = m_inv[index]; if (!inst) continue; @@ -1115,7 +1132,7 @@ void Client::Trader_EndTrader() { for(int i = 0; i < 80; i++) { if(gis->Items[i] != 0) { - if (Customer->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (Customer->ClientVersion() >= EQ::versions::ClientVersion::RoF) { // RoF+ use Item IDs for now tdis->ItemID = gis->Items[i]; @@ -1175,18 +1192,18 @@ void Client::SendTraderItem(uint32 ItemID, uint16 Quantity) { std::string Packet; int16 FreeSlotID=0; - const EQEmu::ItemData* item = database.GetItem(ItemID); + const EQ::ItemData* item = database.GetItem(ItemID); if(!item){ LogTrading("Bogus item deleted in Client::SendTraderItem!\n"); return; } - EQEmu::ItemInstance* inst = database.CreateItem(item, Quantity); + EQ::ItemInstance* inst = database.CreateItem(item, Quantity); if (inst) { - bool is_arrow = (inst->GetItem()->ItemType == EQEmu::item::ItemTypeArrow) ? true : false; + bool is_arrow = (inst->GetItem()->ItemType == EQ::item::ItemTypeArrow) ? true : false; FreeSlotID = m_inv.FindFreeSlot(false, true, inst->GetItem()->Size, is_arrow); PutItemInInventory(FreeSlotID, *inst); @@ -1200,16 +1217,16 @@ void Client::SendTraderItem(uint32 ItemID, uint16 Quantity) { void Client::SendSingleTraderItem(uint32 CharID, int SerialNumber) { - EQEmu::ItemInstance* inst= database.LoadSingleTraderItem(CharID, SerialNumber); + EQ::ItemInstance* inst= database.LoadSingleTraderItem(CharID, SerialNumber); if(inst) { - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor? + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor? safe_delete(inst); } } void Client::BulkSendTraderInventory(uint32 char_id) { - const EQEmu::ItemData *item; + const EQ::ItemData *item; TraderCharges_Struct* TraderItems = database.LoadTraderItemWithCharges(char_id); @@ -1221,7 +1238,7 @@ void Client::BulkSendTraderInventory(uint32 char_id) { item=database.GetItem(TraderItems->ItemID[i]); if (item && (item->NoDrop!=0)) { - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if (inst) { inst->SetSerialNumber(TraderItems->SerialNumber[i]); if(TraderItems->Charges[i] > 0) @@ -1233,7 +1250,7 @@ void Client::BulkSendTraderInventory(uint32 char_id) { } inst->SetPrice(TraderItems->ItemCost[i]); - SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor? + SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor? safe_delete(inst); } else @@ -1245,14 +1262,14 @@ void Client::BulkSendTraderInventory(uint32 char_id) { uint32 Client::FindTraderItemSerialNumber(int32 ItemID) { - EQEmu::ItemInstance* item = nullptr; + EQ::ItemInstance* item = nullptr; uint16 SlotID = 0; - for (int i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++){ + for (int i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++){ item = this->GetInv().GetItem(i); if (item && item->GetItem()->ID == 17899){ //Traders Satchel - for (int x = EQEmu::invbag::SLOT_BEGIN; x <= EQEmu::invbag::SLOT_END; x++) { + for (int x = EQ::invbag::SLOT_BEGIN; x <= EQ::invbag::SLOT_END; x++) { // we already have the parent bag and a contents iterator..why not just iterate the bag!?? - SlotID = EQEmu::InventoryProfile::CalcSlotId(i, x); + SlotID = EQ::InventoryProfile::CalcSlotId(i, x); item = this->GetInv().GetItem(SlotID); if (item) { if (item->GetID() == ItemID) @@ -1266,16 +1283,16 @@ uint32 Client::FindTraderItemSerialNumber(int32 ItemID) { return 0; } -EQEmu::ItemInstance* Client::FindTraderItemBySerialNumber(int32 SerialNumber){ +EQ::ItemInstance* Client::FindTraderItemBySerialNumber(int32 SerialNumber){ - EQEmu::ItemInstance* item = nullptr; + EQ::ItemInstance* item = nullptr; uint16 SlotID = 0; - for (int i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++){ + for (int i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++){ item = this->GetInv().GetItem(i); if(item && item->GetItem()->ID == 17899){ //Traders Satchel - for (int x = EQEmu::invbag::SLOT_BEGIN; x <= EQEmu::invbag::SLOT_END; x++) { + for (int x = EQ::invbag::SLOT_BEGIN; x <= EQ::invbag::SLOT_END; x++) { // we already have the parent bag and a contents iterator..why not just iterate the bag!?? - SlotID = EQEmu::InventoryProfile::CalcSlotId(i, x); + SlotID = EQ::InventoryProfile::CalcSlotId(i, x); item = this->GetInv().GetItem(SlotID); if(item) { if(item->GetSerialNumber() == SerialNumber) @@ -1292,7 +1309,7 @@ EQEmu::ItemInstance* Client::FindTraderItemBySerialNumber(int32 SerialNumber){ GetItems_Struct* Client::GetTraderItems(){ - const EQEmu::ItemInstance* item = nullptr; + const EQ::ItemInstance* item = nullptr; uint16 SlotID = INVALID_INDEX; auto gis = new GetItems_Struct; @@ -1301,16 +1318,16 @@ GetItems_Struct* Client::GetTraderItems(){ uint8 ndx = 0; - for (int i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++) { + for (int i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { if (ndx >= 80) break; item = this->GetInv().GetItem(i); if(item && item->GetItem()->ID == 17899){ //Traders Satchel - for (int x = EQEmu::invbag::SLOT_BEGIN; x <= EQEmu::invbag::SLOT_END; x++) { + for (int x = EQ::invbag::SLOT_BEGIN; x <= EQ::invbag::SLOT_END; x++) { if (ndx >= 80) break; - SlotID = EQEmu::InventoryProfile::CalcSlotId(i, x); + SlotID = EQ::InventoryProfile::CalcSlotId(i, x); item = this->GetInv().GetItem(SlotID); @@ -1328,13 +1345,13 @@ GetItems_Struct* Client::GetTraderItems(){ uint16 Client::FindTraderItem(int32 SerialNumber, uint16 Quantity){ - const EQEmu::ItemInstance* item= nullptr; + const EQ::ItemInstance* item= nullptr; uint16 SlotID = 0; - for (int i = EQEmu::invslot::GENERAL_BEGIN; i <= EQEmu::invslot::GENERAL_END; i++) { + for (int i = EQ::invslot::GENERAL_BEGIN; i <= EQ::invslot::GENERAL_END; i++) { item = this->GetInv().GetItem(i); if(item && item->GetItem()->ID == 17899){ //Traders Satchel - for (int x = EQEmu::invbag::SLOT_BEGIN; x <= EQEmu::invbag::SLOT_END; x++){ - SlotID = EQEmu::InventoryProfile::CalcSlotId(i, x); + for (int x = EQ::invbag::SLOT_BEGIN; x <= EQ::invbag::SLOT_END; x++){ + SlotID = EQ::InventoryProfile::CalcSlotId(i, x); item = this->GetInv().GetItem(SlotID); @@ -1371,7 +1388,7 @@ void Client::NukeTraderItem(uint16 Slot,int16 Charges,uint16 Quantity,Client* Cu tdis->Unknown000 = 0; tdis->TraderID = Customer->GetID(); - if (Customer->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (Customer->ClientVersion() >= EQ::versions::ClientVersion::RoF) { // RoF+ use Item IDs for now tdis->ItemID = itemid; @@ -1390,7 +1407,7 @@ void Client::NukeTraderItem(uint16 Slot,int16 Charges,uint16 Quantity,Client* Cu } // This updates the trader. Removes it from his trading bags. // - const EQEmu::ItemInstance* Inst = m_inv[Slot]; + const EQ::ItemInstance* Inst = m_inv[Slot]; database.SaveInventory(CharacterID(), Inst, Slot); @@ -1432,7 +1449,7 @@ void Client::TraderUpdate(uint16 SlotID,uint32 TraderID){ void Client::FindAndNukeTraderItem(int32 SerialNumber, uint16 Quantity, Client* Customer, uint16 TraderSlot){ - const EQEmu::ItemInstance* item= nullptr; + const EQ::ItemInstance* item= nullptr; bool Stackable = false; int16 Charges=0; @@ -1507,7 +1524,7 @@ void Client::ReturnTraderReq(const EQApplicationPacket* app, int16 TraderItemCha EQApplicationPacket* outapp = nullptr; - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { outapp = new EQApplicationPacket(OP_TraderShop, sizeof(TraderBuy_Struct)); } @@ -1519,7 +1536,7 @@ void Client::ReturnTraderReq(const EQApplicationPacket* app, int16 TraderItemCha TraderBuy_Struct* outtbs = (TraderBuy_Struct*)outapp->pBuffer; memcpy(outtbs, tbs, app->size); - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { // Convert Serial Number back to Item ID for RoF+ outtbs->ItemID = itemid; @@ -1584,10 +1601,10 @@ void Client::BuyTraderItem(TraderBuy_Struct* tbs, Client* Trader, const EQApplic outtbs->ItemID = tbs->ItemID; - const EQEmu::ItemInstance* BuyItem = nullptr; + const EQ::ItemInstance* BuyItem = nullptr; uint32 ItemID = 0; - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { // Convert Item ID to Serial Number for RoF+ ItemID = tbs->ItemID; @@ -1648,7 +1665,7 @@ void Client::BuyTraderItem(TraderBuy_Struct* tbs, Client* Trader, const EQApplic // This cannot overflow assuming MAX_TRANSACTION_VALUE, checked above, is the default of 2000000000 uint32 TotalCost = tbs->Price * outtbs->Quantity; - if (Trader->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (Trader->ClientVersion() >= EQ::versions::ClientVersion::RoF) { // RoF+ uses individual item price where older clients use total price outtbs->Price = tbs->Price; @@ -1699,7 +1716,7 @@ void Client::BuyTraderItem(TraderBuy_Struct* tbs, Client* Trader, const EQApplic Trader->FindAndNukeTraderItem(tbs->ItemID, outtbs->Quantity, this, 0); - if (ItemID > 0 && Trader->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ItemID > 0 && Trader->ClientVersion() >= EQ::versions::ClientVersion::RoF) { // Convert Serial Number back to ItemID for RoF+ outtbs->ItemID = ItemID; @@ -1717,7 +1734,7 @@ void Client::SendBazaarWelcome() auto row = results.begin(); EQApplicationPacket* outapp = nullptr; - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { outapp = new EQApplicationPacket(OP_TraderShop, sizeof(BazaarWelcome_Struct)); } @@ -1735,7 +1752,7 @@ void Client::SendBazaarWelcome() bws->Traders = atoi(row[0]); bws->Items = atoi(row[1]); - if (ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (ClientVersion() >= EQ::versions::ClientVersion::RoF) { bws->Unknown012 = GetID(); } @@ -2075,11 +2092,11 @@ static void UpdateTraderCustomerItemsAdded(uint32 CustomerID, TraderCharges_Stru if(!Customer) return; - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item) return; - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if(!inst) return; @@ -2103,7 +2120,7 @@ static void UpdateTraderCustomerItemsAdded(uint32 CustomerID, TraderCharges_Stru LogTrading("Sending price update for [{}], Serial No. [{}] with [{}] charges", item->Name, gis->SerialNumber[i], gis->Charges[i]); - Customer->SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor? + Customer->SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor? } } @@ -2119,7 +2136,7 @@ static void UpdateTraderCustomerPriceChanged(uint32 CustomerID, TraderCharges_St if(!Customer) return; - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item) return; @@ -2136,7 +2153,7 @@ static void UpdateTraderCustomerPriceChanged(uint32 CustomerID, TraderCharges_St for(int i = 0; i < 80; i++) { if(gis->ItemID[i] == ItemID) { - if (Customer->ClientVersion() >= EQEmu::versions::ClientVersion::RoF) + if (Customer->ClientVersion() >= EQ::versions::ClientVersion::RoF) { // RoF+ use Item IDs for now tdis->ItemID = gis->ItemID[i]; @@ -2160,7 +2177,7 @@ static void UpdateTraderCustomerPriceChanged(uint32 CustomerID, TraderCharges_St LogTrading("Sending price updates to customer [{}]", Customer->GetName()); - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if(!inst) return; @@ -2187,7 +2204,7 @@ static void UpdateTraderCustomerPriceChanged(uint32 CustomerID, TraderCharges_St LogTrading("Sending price update for [{}], Serial No. [{}] with [{}] charges", item->Name, gis->SerialNumber[i], gis->Charges[i]); - Customer->SendItemPacket(EQEmu::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor?? + Customer->SendItemPacket(EQ::invslot::slotCursor, inst, ItemPacketMerchant); // MainCursor?? } safe_delete(inst); } @@ -2278,7 +2295,7 @@ void Client::HandleTraderPriceUpdate(const EQApplicationPacket *app) { } - const EQEmu::ItemData *item = 0; + const EQ::ItemData *item = 0; if(IDOfItemToAdd) item = database.GetItem(IDOfItemToAdd); @@ -2444,7 +2461,7 @@ void Client::SendBuyerResults(char* searchString, uint32 searchID) { char *buf = (char *)outapp->pBuffer; - const EQEmu::ItemData* item = database.GetItem(itemID); + const EQ::ItemData* item = database.GetItem(itemID); if(!item) { safe_delete(outapp); @@ -2540,7 +2557,7 @@ void Client::ShowBuyLines(const EQApplicationPacket *app) { char *Buf = (char *)outapp->pBuffer; - const EQEmu::ItemData* item = database.GetItem(ItemID); + const EQ::ItemData* item = database.GetItem(ItemID); if(!item) { safe_delete(outapp); @@ -2584,7 +2601,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { /*uint32 BuyerID2 =*/ VARSTRUCT_SKIP_TYPE(uint32, Buf); //unused /*uint32 Unknown3 =*/ VARSTRUCT_SKIP_TYPE(uint32, Buf); //unused - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item || !Quantity || !Price || !QtyBuyerWants) return; @@ -2631,6 +2648,11 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { return; } + if(item->IsClassBag()) { + Message(Chat::Red, "That item is a Bag."); + return; + } + if(!item->Stackable) { for(uint32 i = 0; i < Quantity; i++) { @@ -2650,7 +2672,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { return; } - EQEmu::ItemInstance* ItemToTransfer = m_inv.PopItem(SellerSlot); + EQ::ItemInstance* ItemToTransfer = m_inv.PopItem(SellerSlot); if(!ItemToTransfer || !Buyer->MoveItemToInventory(ItemToTransfer, true)) { LogError("Unexpected error while moving item from seller to buyer"); @@ -2696,7 +2718,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { return; } - EQEmu::ItemInstance* ItemToTransfer = m_inv.PopItem(SellerSlot); + EQ::ItemInstance* ItemToTransfer = m_inv.PopItem(SellerSlot); if(!ItemToTransfer) { LogError("Unexpected error while moving item from seller to buyer"); @@ -2796,7 +2818,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { VARSTRUCT_ENCODE_TYPE(uint32, Buf, Quantity); VARSTRUCT_ENCODE_TYPE(uint32, Buf, Quantity * Price); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) { VARSTRUCT_ENCODE_TYPE(uint32, Buf, 0); // Think this is the upper 32 bits of a 64 bit price } @@ -2820,7 +2842,7 @@ void Client::SellToBuyer(const EQApplicationPacket *app) { VARSTRUCT_ENCODE_TYPE(uint32, Buf, Quantity); VARSTRUCT_ENCODE_TYPE(uint32, Buf, Quantity * Price); - if (Buyer->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (Buyer->ClientVersion() >= EQ::versions::ClientVersion::SoD) { VARSTRUCT_ENCODE_TYPE(uint32, Buf, 0); // Think this is the upper 32 bits of a 64 bit price } @@ -2975,7 +2997,7 @@ void Client::UpdateBuyLine(const EQApplicationPacket *app) { /*uint32 UnknownZ =*/ VARSTRUCT_SKIP_TYPE(uint32, Buf); //unused uint32 ItemCount = VARSTRUCT_DECODE_TYPE(uint32, Buf); - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item) return; @@ -2984,29 +3006,27 @@ void Client::UpdateBuyLine(const EQApplicationPacket *app) { LogTrading("UpdateBuyLine: Char: [{}] BuySlot: [{}] ItemID [{}] [{}] Quantity [{}] Toggle: [{}] Price [{}] ItemCount [{}] LoreConflict [{}]", GetName(), BuySlot, ItemID, item->Name, Quantity, ToggleOnOff, Price, ItemCount, LoreConflict); - if((item->NoDrop != 0) && !LoreConflict && (Quantity > 0) && HasMoney(Quantity * Price) && ToggleOnOff && (ItemCount == 0)) { + if((item->NoDrop != 0) && (!item->IsClassBag())&& !LoreConflict && (Quantity > 0) && HasMoney(Quantity * Price) && ToggleOnOff && (ItemCount == 0)) { LogTrading("Adding to database"); database.AddBuyLine(CharacterID(), BuySlot, ItemID, ItemName, Quantity, Price); QueuePacket(app); } else { - if(ItemCount > 0) + if(ItemCount > 0) { Message(Chat::Red, "Buy line %s disabled as Item Compensation is not currently supported.", ItemName); - - else if(Quantity <= 0) + } else if(Quantity <= 0) { Message(Chat::Red, "Buy line %s disabled as the quantity is invalid.", ItemName); - - else if(LoreConflict) + } else if(LoreConflict) { Message(Chat::Red, "Buy line %s disabled as the item is LORE and you have one already.", ItemName); - - else if(item->NoDrop == 0) + } else if(item->NoDrop == 0) { Message(Chat::Red, "Buy line %s disabled as the item is NODROP.", ItemName); - - else if(ToggleOnOff) + } else if(item->IsClassBag()) { + Message(Chat::Red, "Buy line %s disabled as the item is a Bag.", ItemName); + } else if(ToggleOnOff) { Message(Chat::Red, "Buy line %s disabled due to insufficient funds.", ItemName); - - else + } else { database.RemoveBuyLine(CharacterID(), BuySlot); + } auto outapp = new EQApplicationPacket(OP_Barter, 936); @@ -3039,7 +3059,7 @@ void Client::BuyerItemSearch(const EQApplicationPacket *app) { BuyerItemSearchResults_Struct* bisr = (BuyerItemSearchResults_Struct*)outapp->pBuffer; - const EQEmu::ItemData* item = 0; + const EQ::ItemData* item = 0; int Count=0; diff --git a/zone/trap.cpp b/zone/trap.cpp index 7d205e563..327f0ef80 100644 --- a/zone/trap.cpp +++ b/zone/trap.cpp @@ -24,6 +24,7 @@ #include "entity.h" #include "mob.h" #include "trap.h" +#include "../common/repositories/criteria/content_filter_criteria.h" /* @@ -104,7 +105,7 @@ bool Trap::Process() reset_timer.Disable(); charid = 0; } - + if (respawn_timer.Enabled() && respawn_timer.Check()) { detected = false; @@ -135,7 +136,7 @@ void Trap::Trigger(Mob* trigger) entity_list.MessageClose(trigger,false,100,13,"%s",message.c_str()); } if(hiddenTrigger){ - hiddenTrigger->SpellFinished(effectvalue, trigger, EQEmu::spells::CastingSlot::Item, 0, -1, spells[effectvalue].ResistDiff); + hiddenTrigger->SpellFinished(effectvalue, trigger, EQ::spells::CastingSlot::Item, 0, -1, spells[effectvalue].ResistDiff); } break; case trapTypeAlarm: @@ -225,13 +226,13 @@ void Trap::Trigger(Mob* trigger) safe_delete(outapp); } } - + if (trigger && trigger->IsClient()) { trigger->CastToClient()->trapid = trap_id; charid = trigger->CastToClient()->CharacterID(); } - + bool update = false; if (despawn_when_triggered) { @@ -242,16 +243,16 @@ void Trap::Trigger(Mob* trigger) { reset_timer.Start(5000); } - + if (triggered_number > 0) ++times_triggered; - + if (triggered_number > 0 && triggered_number <= times_triggered) { Log(Logs::General, Logs::Traps, "Triggered number for trap %d reached. %d/%d", trap_id, times_triggered, triggered_number); update = true; } - + if (update) { UpdateTrap(); @@ -290,7 +291,7 @@ Trap* EntityList::FindNearbyTrap(Mob* searcher, float max_dist, float &trap_curd } else trap_curdist = INVALID_INDEX; - + return current_trap; } @@ -399,9 +400,14 @@ void EntityList::ClearTrapPointers() bool ZoneDatabase::LoadTraps(const char* zonename, int16 version) { - std::string query = StringFormat("SELECT id, x, y, z, effect, effectvalue, effectvalue2, skill, " + std::string query = StringFormat( + "SELECT id, x, y, z, effect, effectvalue, effectvalue2, skill, " "maxzdiff, radius, chance, message, respawn_time, respawn_var, level, " - "`group`, triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND version=%u", zonename, version); + "`group`, triggered_number, despawn_when_triggered, undetectable FROM traps WHERE zone='%s' AND version=%u %s", + zonename, + version, + ContentFilterCriteria::apply().c_str() + ); auto results = QueryDatabase(query); if (!results.Success()) { diff --git a/zone/tribute.cpp b/zone/tribute.cpp index 3e80f5446..95640947e 100644 --- a/zone/tribute.cpp +++ b/zone/tribute.cpp @@ -66,7 +66,7 @@ void Client::ToggleTribute(bool enabled) { int r; uint32 cost = 0; uint32 level = GetLevel(); - for (r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) { + for (r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { uint32 tid = m_pp.tributes[r].tribute; if(tid == TRIBUTE_NONE) continue; @@ -119,7 +119,7 @@ void Client::DoTributeUpdate() { tis->tribute_master_id = tribute_master_id; //Dont know what this is for int r; - for (r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) { + for (r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { if(m_pp.tributes[r].tribute != TRIBUTE_NONE) { tis->tributes[r] = m_pp.tributes[r].tribute; tis->tiers[r] = m_pp.tributes[r].tier; @@ -134,24 +134,24 @@ void Client::DoTributeUpdate() { if(m_pp.tribute_active) { //send and equip tribute items... - for (r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) { + for (r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { uint32 tid = m_pp.tributes[r].tribute; if(tid == TRIBUTE_NONE) { - if (m_inv[EQEmu::invslot::TRIBUTE_BEGIN + r]) - DeleteItemInInventory(EQEmu::invslot::TRIBUTE_BEGIN + r, 0, false); + if (m_inv[EQ::invslot::TRIBUTE_BEGIN + r]) + DeleteItemInInventory(EQ::invslot::TRIBUTE_BEGIN + r, 0, false); continue; } if(tribute_list.count(tid) != 1) { - if (m_inv[EQEmu::invslot::TRIBUTE_BEGIN + r]) - DeleteItemInInventory(EQEmu::invslot::TRIBUTE_BEGIN + r, 0, false); + if (m_inv[EQ::invslot::TRIBUTE_BEGIN + r]) + DeleteItemInInventory(EQ::invslot::TRIBUTE_BEGIN + r, 0, false); continue; } //sanity check if(m_pp.tributes[r].tier >= MAX_TRIBUTE_TIERS) { - if (m_inv[EQEmu::invslot::TRIBUTE_BEGIN + r]) - DeleteItemInInventory(EQEmu::invslot::TRIBUTE_BEGIN + r, 0, false); + if (m_inv[EQ::invslot::TRIBUTE_BEGIN + r]) + DeleteItemInInventory(EQ::invslot::TRIBUTE_BEGIN + r, 0, false); m_pp.tributes[r].tier = 0; continue; } @@ -161,19 +161,19 @@ void Client::DoTributeUpdate() { uint32 item_id = tier.tribute_item_id; //summon the item for them - const EQEmu::ItemInstance* inst = database.CreateItem(item_id, 1); + const EQ::ItemInstance* inst = database.CreateItem(item_id, 1); if(inst == nullptr) continue; - PutItemInInventory(EQEmu::invslot::TRIBUTE_BEGIN + r, *inst, false); - SendItemPacket(EQEmu::invslot::TRIBUTE_BEGIN + r, inst, ItemPacketTributeItem); + PutItemInInventory(EQ::invslot::TRIBUTE_BEGIN + r, *inst, false); + SendItemPacket(EQ::invslot::TRIBUTE_BEGIN + r, inst, ItemPacketTributeItem); safe_delete(inst); } } else { //unequip tribute items... - for (r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) { - if (m_inv[EQEmu::invslot::TRIBUTE_BEGIN + r]) - DeleteItemInInventory(EQEmu::invslot::TRIBUTE_BEGIN + r, 0, false); + for (r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { + if (m_inv[EQ::invslot::TRIBUTE_BEGIN + r]) + DeleteItemInInventory(EQ::invslot::TRIBUTE_BEGIN + r, 0, false); } } CalcBonuses(); @@ -192,7 +192,7 @@ void Client::SendTributeTimer() { void Client::ChangeTributeSettings(TributeInfo_Struct *t) { int r; - for (r = 0; r < EQEmu::invtype::TRIBUTE_SIZE; r++) { + for (r = 0; r < EQ::invtype::TRIBUTE_SIZE; r++) { m_pp.tributes[r].tribute = TRIBUTE_NONE; @@ -239,7 +239,7 @@ void Client::SendTributeDetails(uint32 client_id, uint32 tribute_id) { //returns the number of points received from the tribute int32 Client::TributeItem(uint32 slot, uint32 quantity) { - const EQEmu::ItemInstance*inst = m_inv[slot]; + const EQ::ItemInstance*inst = m_inv[slot]; if(inst == nullptr) return(0); diff --git a/zone/tune.cpp b/zone/tune.cpp index 22ca90375..f22fe6a53 100644 --- a/zone/tune.cpp +++ b/zone/tune.cpp @@ -255,7 +255,7 @@ int32 Mob::Tune_MeleeMitigation(Mob* GM, Mob *attacker, int32 damage, int32 minh } if (RuleB(Combat, UseIntervalAC)) { - float softcap = (GetSkill(EQEmu::skills::SkillDefense) + GetLevel()) * + float softcap = (GetSkill(EQ::skills::SkillDefense) + GetLevel()) * RuleR(Combat, SoftcapFactor) * (1.0 + aa_mit); float mitigation_rating = 0.0; float attack_rating = 0.0; @@ -410,14 +410,14 @@ int32 Mob::Tune_MeleeMitigation(Mob* GM, Mob *attacker, int32 damage, int32 minh int tmp_armor = armor; if (GetClass() == WIZARD || GetClass() == MAGICIAN || GetClass() == NECROMANCER || GetClass() == ENCHANTER){ - mitigation_rating = ((GetSkill(EQEmu::skills::SkillDefense) + itembonuses.HeroicAGI / 10) / 4.0) + armor + 1; + mitigation_rating = ((GetSkill(EQ::skills::SkillDefense) + itembonuses.HeroicAGI / 10) / 4.0) + armor + 1; if (Msg >= 2) - GM->Message(Chat::White, "# + %.2f #### DEFENDER Armor Bonus [Defense Skill %i Heroic Agi %i]", mitigation_rating - tmp_armor, GetSkill(EQEmu::skills::SkillDefense), itembonuses.HeroicAGI); + GM->Message(Chat::White, "# + %.2f #### DEFENDER Armor Bonus [Defense Skill %i Heroic Agi %i]", mitigation_rating - tmp_armor, GetSkill(EQ::skills::SkillDefense), itembonuses.HeroicAGI); } else{ - mitigation_rating = ((GetSkill(EQEmu::skills::SkillDefense) + itembonuses.HeroicAGI / 10) / 3.0) + (armor * 1.333333) + 1; + mitigation_rating = ((GetSkill(EQ::skills::SkillDefense) + itembonuses.HeroicAGI / 10) / 3.0) + (armor * 1.333333) + 1; if (Msg >= 2) - GM->Message(Chat::White, "# + %.2f #### DEFENDER Armor Bonus [Defense Skill %i Heroic Agi %i]", mitigation_rating - tmp_armor, GetSkill(EQEmu::skills::SkillDefense), itembonuses.HeroicAGI); + GM->Message(Chat::White, "# + %.2f #### DEFENDER Armor Bonus [Defense Skill %i Heroic Agi %i]", mitigation_rating - tmp_armor, GetSkill(EQ::skills::SkillDefense), itembonuses.HeroicAGI); } mitigation_rating *= 0.847; @@ -443,16 +443,16 @@ int32 Mob::Tune_MeleeMitigation(Mob* GM, Mob *attacker, int32 damage, int32 minh if (attacker->IsClient()){ if (atk_override) - attack_rating = (atk_override + ((attacker->GetSTR() - 66) * 0.9) + (attacker->GetSkill(EQEmu::skills::SkillOffense)*1.345)); + attack_rating = (atk_override + ((attacker->GetSTR() - 66) * 0.9) + (attacker->GetSkill(EQ::skills::SkillOffense)*1.345)); else - attack_rating = ((attacker->CastToClient()->CalcATK() + add_atk) + ((attacker->GetSTR() - 66) * 0.9) + (attacker->GetSkill(EQEmu::skills::SkillOffense)*1.345)); + attack_rating = ((attacker->CastToClient()->CalcATK() + add_atk) + ((attacker->GetSTR() - 66) * 0.9) + (attacker->GetSkill(EQ::skills::SkillOffense)*1.345)); } else{ if (atk_override) - attack_rating = (atk_override + (attacker->GetSkill(EQEmu::skills::SkillOffense)*1.345) + ((attacker->GetSTR() - 66) * 0.9)); + attack_rating = (atk_override + (attacker->GetSkill(EQ::skills::SkillOffense)*1.345) + ((attacker->GetSTR() - 66) * 0.9)); else - attack_rating = ((attacker->GetATK() + add_atk) + (attacker->GetSkill(EQEmu::skills::SkillOffense)*1.345) + ((attacker->GetSTR() - 66) * 0.9)); + attack_rating = ((attacker->GetATK() + add_atk) + (attacker->GetSkill(EQ::skills::SkillOffense)*1.345) + ((attacker->GetSTR() - 66) * 0.9)); } attack_rating = attacker->mod_attack_rating(attack_rating, this); @@ -468,7 +468,7 @@ int32 Mob::Tune_MeleeMitigation(Mob* GM, Mob *attacker, int32 damage, int32 minh GM->Message(Chat::White, "# %i #### ATTACKER Worn/Equip ATK Bonus", attacker->itembonuses.ATK); GM->Message(Chat::White, "# %i #### ATTACKER Worn/Equip ATK Bonus", attacker->itembonuses.ATK); GM->Message(Chat::White, "# %.2f #### ATTACKER Strength Stat ATK Bonus [Stat Amt: %i]", ((attacker->GetSTR()-66) * 0.9),attacker->GetSTR()); - GM->Message(Chat::White, "# %.2f #### ATTACKER Offensive Skill ATK Bonus [Stat Amt: %i]", (attacker->GetSkill(EQEmu::skills::SkillOffense)*1.345), attacker->GetSkill(EQEmu::skills::SkillOffense)); + GM->Message(Chat::White, "# %.2f #### ATTACKER Offensive Skill ATK Bonus [Stat Amt: %i]", (attacker->GetSkill(EQ::skills::SkillOffense)*1.345), attacker->GetSkill(EQ::skills::SkillOffense)); } else{ @@ -476,7 +476,7 @@ int32 Mob::Tune_MeleeMitigation(Mob* GM, Mob *attacker, int32 damage, int32 minh GM->Message(Chat::White, "# %i #### ATTACKER SE_ATK(2) spell Bonus", attacker->spellbonuses.ATK); GM->Message(Chat::White, "# %i #### ATTACKER NPC ATK Stat", attacker->CastToNPC()->ATK); GM->Message(Chat::White, "# %.2f #### ATTACKER Strength Stat ATK Bonus [Stat Amt: %i]", ((attacker->GetSTR()-66) * 0.9),attacker->GetSTR()); - GM->Message(Chat::White, "# %.2f #### ATTACKER Offensive Skill ATK Bonus [Stat Amt: %i]", (attacker->GetSkill(EQEmu::skills::SkillOffense)*1.345), attacker->GetSkill(EQEmu::skills::SkillOffense)); + GM->Message(Chat::White, "# %.2f #### ATTACKER Offensive Skill ATK Bonus [Stat Amt: %i]", (attacker->GetSkill(EQ::skills::SkillOffense)*1.345), attacker->GetSkill(EQ::skills::SkillOffense)); } } @@ -582,13 +582,13 @@ int32 Client::Tune_GetMeleeMitDmg(Mob* GM, Mob *attacker, int32 damage, int32 mi int32 Client::GetMeleeDamage(Mob* other, bool GetMinDamage) { - int Hand = EQEmu::invslot::slotPrimary; + int Hand = EQ::invslot::slotPrimary; if (!other) return 0; - EQEmu::ItemInstance* weapon; - weapon = GetInv().GetItem(EQEmu::invslot::slotPrimary); + EQ::ItemInstance* weapon; + weapon = GetInv().GetItem(EQ::invslot::slotPrimary); if(weapon != nullptr) { if (!weapon->IsWeapon()) { @@ -596,7 +596,7 @@ int32 Client::GetMeleeDamage(Mob* other, bool GetMinDamage) } } - EQEmu::skills::SkillType skillinuse = AttackAnimation(Hand, weapon); + EQ::skills::SkillType skillinuse = AttackAnimation(Hand, weapon); int damage = 0; uint8 mylevel = GetLevel() ? GetLevel() : 1; @@ -620,16 +620,16 @@ int32 Client::GetMeleeDamage(Mob* other, bool GetMinDamage) max_hit = (RuleI(Combat, HitCapPre20)); CheckIncreaseSkill(skillinuse, other, -15); - CheckIncreaseSkill(EQEmu::skills::SkillOffense, other, -15); + CheckIncreaseSkill(EQ::skills::SkillOffense, other, -15); #ifndef EQEMU_NO_WEAPON_DAMAGE_BONUS int ucDamageBonus = 0; - if (Hand == EQEmu::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass()) + if (Hand == EQ::invslot::slotPrimary && GetLevel() >= 28 && IsWarriorClass()) { - ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQEmu::ItemData*) nullptr); + ucDamageBonus = GetWeaponDamageBonus(weapon ? weapon->GetItem() : (const EQ::ItemData*) nullptr); min_hit += (int) ucDamageBonus; max_hit += (int) ucDamageBonus; @@ -657,28 +657,28 @@ void Mob::Tune_FindAccuaryByHitChance(Mob* defender, Mob *attacker, float hit_ch float tmp_hit_chance = 0.0f; bool end = false; - EQEmu::skills::SkillType skillinuse = EQEmu::skills::SkillHandtoHand; + EQ::skills::SkillType skillinuse = EQ::skills::SkillHandtoHand; if (attacker->IsClient()) {//Will check first equiped weapon for skill. Ie. remove wepaons to assess bow. - EQEmu::ItemInstance* weapon; - weapon = attacker->CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); + EQ::ItemInstance* weapon; + weapon = attacker->CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); if(weapon && weapon->IsWeapon()){ - skillinuse = attacker->CastToClient()->AttackAnimation(EQEmu::invslot::slotPrimary, weapon); + skillinuse = attacker->CastToClient()->AttackAnimation(EQ::invslot::slotPrimary, weapon); } else { - weapon = attacker->CastToClient()->GetInv().GetItem(EQEmu::invslot::slotSecondary); + weapon = attacker->CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); if (weapon && weapon->IsWeapon()) - skillinuse = attacker->CastToClient()->AttackAnimation(EQEmu::invslot::slotSecondary, weapon); + skillinuse = attacker->CastToClient()->AttackAnimation(EQ::invslot::slotSecondary, weapon); else { - weapon = attacker->CastToClient()->GetInv().GetItem(EQEmu::invslot::slotRange); + weapon = attacker->CastToClient()->GetInv().GetItem(EQ::invslot::slotRange); if (weapon && weapon->IsWeapon()) - skillinuse = attacker->CastToClient()->AttackAnimation(EQEmu::invslot::slotRange, weapon); + skillinuse = attacker->CastToClient()->AttackAnimation(EQ::invslot::slotRange, weapon); } } } - tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQEmu::invslot::slotPrimary, 0, 0, 0, avoid_override); + tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQ::invslot::slotPrimary, 0, 0, 0, avoid_override); Message(0, "#Tune - Begin Parse [Interval %i Max Loop Iterations %i]", interval, max_loop); @@ -690,7 +690,7 @@ void Mob::Tune_FindAccuaryByHitChance(Mob* defender, Mob *attacker, float hit_ch for (int j=0; j < max_loop; j++) { - tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQEmu::invslot::slotPrimary, 0, false, 0, avoid_override, add_acc); + tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQ::invslot::slotPrimary, 0, false, 0, avoid_override, add_acc); if (Msg >= 3) Message(Chat::Yellow, "#Tune - Processing... [%i] [ACCURACY %i] Hit Chance %.2f ",j,add_acc,tmp_hit_chance); @@ -705,7 +705,7 @@ void Mob::Tune_FindAccuaryByHitChance(Mob* defender, Mob *attacker, float hit_ch if (end){ - Tune_CheckHitChance(defender, attacker, skillinuse, EQEmu::invslot::slotPrimary, 0, Msg, 0, avoid_override);//Display Stat Report + Tune_CheckHitChance(defender, attacker, skillinuse, EQ::invslot::slotPrimary, 0, Msg, 0, avoid_override);//Display Stat Report Message(0, " "); @@ -737,28 +737,28 @@ void Mob::Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_ float tmp_hit_chance = 0.0f; bool end = false; - EQEmu::skills::SkillType skillinuse = EQEmu::skills::SkillHandtoHand; + EQ::skills::SkillType skillinuse = EQ::skills::SkillHandtoHand; if (attacker->IsClient()) {//Will check first equiped weapon for skill. Ie. remove wepaons to assess bow. - EQEmu::ItemInstance* weapon; - weapon = attacker->CastToClient()->GetInv().GetItem(EQEmu::invslot::slotPrimary); + EQ::ItemInstance* weapon; + weapon = attacker->CastToClient()->GetInv().GetItem(EQ::invslot::slotPrimary); if(weapon && weapon->IsWeapon()){ - skillinuse = attacker->CastToClient()->AttackAnimation(EQEmu::invslot::slotPrimary, weapon); + skillinuse = attacker->CastToClient()->AttackAnimation(EQ::invslot::slotPrimary, weapon); } else { - weapon = attacker->CastToClient()->GetInv().GetItem(EQEmu::invslot::slotSecondary); + weapon = attacker->CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary); if (weapon && weapon->IsWeapon()) - skillinuse = attacker->CastToClient()->AttackAnimation(EQEmu::invslot::slotSecondary, weapon); + skillinuse = attacker->CastToClient()->AttackAnimation(EQ::invslot::slotSecondary, weapon); else { - weapon = attacker->CastToClient()->GetInv().GetItem(EQEmu::invslot::slotRange); + weapon = attacker->CastToClient()->GetInv().GetItem(EQ::invslot::slotRange); if (weapon && weapon->IsWeapon()) - skillinuse = attacker->CastToClient()->AttackAnimation(EQEmu::invslot::slotRange, weapon); + skillinuse = attacker->CastToClient()->AttackAnimation(EQ::invslot::slotRange, weapon); } } } - tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQEmu::invslot::slotPrimary, 0, 0, acc_override, 0); + tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQ::invslot::slotPrimary, 0, 0, acc_override, 0); Message(0, "#Tune - Begin Parse [Interval %i Max Loop Iterations %i]", interval, max_loop); Message(0, "#Tune - Processing... Find Avoidance for hit chance on defender of (%.0f) pct from attacker. [Current Hit Chance %.2f]", hit_chance, tmp_hit_chance); @@ -768,7 +768,7 @@ void Mob::Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_ for (int j=0; j < max_loop; j++) { - tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQEmu::invslot::slotPrimary, 0, 0, acc_override, 0, 0, add_avoid); + tmp_hit_chance = Tune_CheckHitChance(defender, attacker, skillinuse, EQ::invslot::slotPrimary, 0, 0, acc_override, 0, 0, add_avoid); if (Msg >= 3) Message(0, "#Tune - Processing... [%i] [AVOIDANCE %i] Hit Chance %.2f ",j,add_avoid,tmp_hit_chance); @@ -783,7 +783,7 @@ void Mob::Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_ if (end){ - Tune_CheckHitChance(defender, attacker, skillinuse, EQEmu::invslot::slotPrimary, 0, Msg, acc_override, 0);//Display Stat Report + Tune_CheckHitChance(defender, attacker, skillinuse, EQ::invslot::slotPrimary, 0, Msg, acc_override, 0);//Display Stat Report Message(0, " "); @@ -808,7 +808,7 @@ void Mob::Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_ } -float Mob::Tune_CheckHitChance(Mob* defender, Mob* attacker, EQEmu::skills::SkillType skillinuse, int Hand, int16 chance_mod, int Msg, int acc_override, int avoid_override, int add_acc, int add_avoid) +float Mob::Tune_CheckHitChance(Mob* defender, Mob* attacker, EQ::skills::SkillType skillinuse, int Hand, int16 chance_mod, int Msg, int acc_override, int avoid_override, int add_acc, int add_avoid) { float chancetohit = RuleR(Combat, BaseHitChance); @@ -896,9 +896,9 @@ float Mob::Tune_CheckHitChance(Mob* defender, Mob* attacker, EQEmu::skills::Skil if(defender->IsClient()) { - chancetohit += (RuleR(Combat, WeaponSkillFalloff) * (defender->CastToClient()->MaxSkill(EQEmu::skills::SkillDefense) - defender->GetSkill(EQEmu::skills::SkillDefense))); + chancetohit += (RuleR(Combat, WeaponSkillFalloff) * (defender->CastToClient()->MaxSkill(EQ::skills::SkillDefense) - defender->GetSkill(EQ::skills::SkillDefense))); if (Msg >= 2) - Message(0, "# + %.2f Total: %.2f #### DEFENDER Defense Skill Mod", (RuleR(Combat, WeaponSkillFalloff) * (defender->CastToClient()->MaxSkill(EQEmu::skills::SkillDefense) - defender->GetSkill(EQEmu::skills::SkillDefense))), chancetohit); + Message(0, "# + %.2f Total: %.2f #### DEFENDER Defense Skill Mod", (RuleR(Combat, WeaponSkillFalloff) * (defender->CastToClient()->MaxSkill(EQ::skills::SkillDefense) - defender->GetSkill(EQ::skills::SkillDefense))), chancetohit); } @@ -987,17 +987,17 @@ float Mob::Tune_CheckHitChance(Mob* defender, Mob* attacker, EQEmu::skills::Skil hitBonus += attacker->itembonuses.HitChanceEffect[skillinuse] + attacker->spellbonuses.HitChanceEffect[skillinuse]+ attacker->aabonuses.HitChanceEffect[skillinuse]+ - attacker->itembonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] + - attacker->spellbonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1] + - attacker->aabonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]; + attacker->itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] + + attacker->spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] + + attacker->aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]; if (Msg >= 2){ - if (attacker->aabonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]) - Message(0, "# %i #### ATTACKER SE_HitChance(184) AA Bonus [All Skills]", attacker->aabonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]); - if (attacker->spellbonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]) - Message(0, "# %i #### ATTACKER SE_HitChance(184) Spell Bonus [All Skills]", attacker->spellbonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]); - if (attacker->itembonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]) - Message(0, "# %i #### ATTACKER SE_HitChance(184) Worn Bonus [All Skills]", attacker->itembonuses.HitChanceEffect[EQEmu::skills::HIGHEST_SKILL + 1]); + if (attacker->aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]) + Message(0, "# %i #### ATTACKER SE_HitChance(184) AA Bonus [All Skills]", attacker->aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]); + if (attacker->spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]) + Message(0, "# %i #### ATTACKER SE_HitChance(184) Spell Bonus [All Skills]", attacker->spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]); + if (attacker->itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]) + Message(0, "# %i #### ATTACKER SE_HitChance(184) Worn Bonus [All Skills]", attacker->itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1]); if (attacker->itembonuses.HitChanceEffect[skillinuse]) Message(0, "# %i #### ATTACKER SE_HitChance(184) AA Bonus [Skill]", attacker->aabonuses.HitChanceEffect[skillinuse]); if (attacker->spellbonuses.HitChanceEffect[skillinuse]) @@ -1008,19 +1008,19 @@ float Mob::Tune_CheckHitChance(Mob* defender, Mob* attacker, EQEmu::skills::Skil //Accuracy = Spell Effect , HitChance = 'Accuracy' from Item Effect //Only AA derived accuracy can be skill limited. ie (Precision of the Pathfinder, Dead Aim) - hitBonus += (attacker->itembonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] + - attacker->spellbonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] + - attacker->aabonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1] + + hitBonus += (attacker->itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] + + attacker->spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] + + attacker->aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] + attacker->aabonuses.Accuracy[skillinuse] + attacker->itembonuses.HitChance) / 15.0f; //Item Mod 'Accuracy' if (Msg >= 2) { - if (attacker->aabonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]) - Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) AA Bonus [All Skills] [Stat Amt: %i]", static_cast(attacker->aabonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]) / 15.0f, attacker->aabonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]); - if (attacker->spellbonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]) - Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) Spell Bonus [All Skills] [Stat Amt: %i]", static_cast(attacker->spellbonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]) / 15.0f, attacker->spellbonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]); - if (attacker->itembonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]) - Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) Worn Bonus [All Skills] [Stat Amt: %i]", static_cast(attacker->itembonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]) / 15.0f, attacker->itembonuses.Accuracy[EQEmu::skills::HIGHEST_SKILL + 1]); + if (attacker->aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]) + Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) AA Bonus [All Skills] [Stat Amt: %i]", static_cast(attacker->aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]) / 15.0f, attacker->aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]); + if (attacker->spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]) + Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) Spell Bonus [All Skills] [Stat Amt: %i]", static_cast(attacker->spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]) / 15.0f, attacker->spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]); + if (attacker->itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]) + Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) Worn Bonus [All Skills] [Stat Amt: %i]", static_cast(attacker->itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]) / 15.0f, attacker->itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1]); if (attacker->aabonuses.Accuracy[skillinuse]) Message(0, "# %.2f #### ATTACKER SE_Accuracy(216) AA Bonus [Skill] [Stat Amt: %i]", static_cast(attacker->aabonuses.Accuracy[skillinuse])/15.0f,attacker->aabonuses.Accuracy[skillinuse]); if (attacker->itembonuses.HitChance) @@ -1052,7 +1052,7 @@ float Mob::Tune_CheckHitChance(Mob* defender, Mob* attacker, EQEmu::skills::Skil hitBonus += (add_acc / 15.0f); //Modifier from database } - if (skillinuse == EQEmu::skills::SkillArchery){ + if (skillinuse == EQ::skills::SkillArchery){ hitBonus -= hitBonus*RuleR(Combat, ArcheryHitPenalty); if (Msg >= 2) Message(0, "# %.2f pct #### RuleR(Combat, ArcheryHitPenalty) ", RuleR(Combat, ArcheryHitPenalty)); diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index fe470bd78..90fc25d1e 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -118,7 +118,7 @@ void NPC::ResumeWandering() { // we were paused by a quest AI_walking_timer->Disable(); SetGrid(0 - GetGrid()); - if (cur_wp == EQEmu::WaypointStatus::QuestControlGrid) + if (cur_wp == EQ::WaypointStatus::QuestControlGrid) { // got here by a MoveTo() cur_wp = save_wp; UpdateWaypoint(cur_wp); // have him head to last destination from here @@ -184,7 +184,7 @@ void NPC::MoveTo(const glm::vec4 &position, bool saveguardspot) AI_walking_timer->Disable(); // disable timer in case he is paused at a wp if (cur_wp >= 0) { // we've not already done a MoveTo() save_wp = cur_wp; // save the current waypoint - cur_wp = EQEmu::WaypointStatus::QuestControlGrid; + cur_wp = EQ::WaypointStatus::QuestControlGrid; } LogAI("MoveTo [{}], pausing regular grid wandering. Grid [{}], save_wp [{}]", to_string(static_cast(position)).c_str(), @@ -194,7 +194,7 @@ void NPC::MoveTo(const glm::vec4 &position, bool saveguardspot) else { // not on a grid roamer = true; save_wp = 0; - cur_wp = EQEmu::WaypointStatus::QuestControlNoGrid; + cur_wp = EQ::WaypointStatus::QuestControlNoGrid; LogAI("MoveTo [{}] without a grid", to_string(static_cast(position)).c_str()); } @@ -308,13 +308,12 @@ void NPC::CalculateNewWaypoint() { bool on_center = Waypoints[cur_wp].centerpoint; std::vector random_waypoints; - for (auto &w : Waypoints) + for (auto &wpl : Waypoints) { - wplist wpl = w; if (wpl.index != cur_wp && ((on_center && !wpl.centerpoint) || (!on_center && wpl.centerpoint))) { - random_waypoints.push_back(w); + random_waypoints.push_back(wpl); } } @@ -385,8 +384,47 @@ void NPC::CalculateNewWaypoint() { if (cur_wp == patrol) // reutilizing patrol member instead of making new member for this wander type; here we use it to save a random waypoint { + if (!Waypoints[cur_wp].centerpoint) + { + // if we have arrived at a waypoint that is NOT a centerpoint, then check for the existence of any centerpoint waypoint + // if any exists then randomly go to it otherwise go to one that exist. + std::vector random_centerpoints; + for (auto& wpl : Waypoints) + { + if (wpl.index != cur_wp && wpl.centerpoint) + { + random_centerpoints.push_back(wpl); + } + } + + if (random_centerpoints.size() == 1) + { + patrol = random_centerpoints[0].index; + break; + } + else if (random_centerpoints.size() > 1) + { + int windex = zone->random.Roll0(random_centerpoints.size()); + patrol = random_centerpoints[windex].index; + break; + } + } + while (patrol == cur_wp) - patrol = zone->random.Int(0, Waypoints.size() - 1); + { + // Setting a negative number in pause of the select waypoints will NOT be included in the group of waypoints to be random. + // This will cause the NPC to not stop and pause in any of the waypoints that is not part of random waypoints. + std::vector random_waypoints; + for (auto& wpl : Waypoints) + { + if (wpl.index != cur_wp && wpl.pause >= 0 && !wpl.centerpoint) + { + random_waypoints.push_back(wpl); + } + } + int windex = zone->random.Roll0(random_waypoints.size()); + patrol = random_waypoints[windex].index; + } } if (patrol > cur_wp) cur_wp = cur_wp + 1; @@ -991,7 +1029,7 @@ void ZoneDatabase::ModifyGrid(Client *client, bool remove, uint32 id, uint8 type return; } - std::string query = StringFormat("DELETE FROM grid where id=%i", id); + std::string query = StringFormat("DELETE FROM grid where id=%i and zoneid=%i", id, zoneid); auto results = QueryDatabase(query); query = StringFormat("DELETE FROM grid_entries WHERE zoneid = %i AND gridid = %i", zoneid, id); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 52338b6c8..545625d0d 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -35,12 +35,14 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/eq_packet_structs.h" #include "../common/misc_functions.h" #include "../common/rulesys.h" +#include "../common/say_link.h" #include "../common/servertalk.h" #include "../common/profanity_manager.h" #include "client.h" #include "corpse.h" #include "entity.h" +#include "expedition.h" #include "quest_parser_collection.h" #include "guild_mgr.h" #include "mob.h" @@ -53,11 +55,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "zone_config.h" #include "zone_reload.h" - extern EntityList entity_list; extern Zone* zone; extern volatile bool is_zone_loaded; -extern void CatchSignal(int); +extern void Shutdown(); extern WorldServer worldserver; extern PetitionList petition_list; extern uint32 numclients; @@ -78,14 +79,14 @@ WorldServer::~WorldServer() { void WorldServer::Connect() { - m_connection.reset(new EQ::Net::ServertalkClient(Config->WorldIP, Config->WorldTCPPort, false, "Zone", Config->SharedKey)); + m_connection = std::make_unique(Config->WorldIP, Config->WorldTCPPort, false, "Zone", Config->SharedKey); m_connection->OnConnect([this](EQ::Net::ServertalkClient *client) { OnConnected(); }); m_connection->OnMessage(std::bind(&WorldServer::HandleMessage, this, std::placeholders::_1, std::placeholders::_2)); - m_keepalive.reset(new EQ::Timer(2500, true, std::bind(&WorldServer::OnKeepAlive, this, std::placeholders::_1))); + m_keepalive = std::make_unique(2500, true, std::bind(&WorldServer::OnKeepAlive, this, std::placeholders::_1)); } bool WorldServer::SendPacket(ServerPacket *pack) @@ -192,8 +193,15 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) if (pack->size != sizeof(ServerConnectInfo)) break; ServerConnectInfo* sci = (ServerConnectInfo*)pack->pBuffer; - LogInfo("World assigned Port: [{}] for this zone", sci->port); - ZoneConfig::SetZonePort(sci->port); + + if (sci->port == 0) { + LogCritical("World did not have a port to assign from this server, the port range was not large enough."); + Shutdown(); + } + else { + LogInfo("World assigned Port: [{}] for this zone", sci->port); + ZoneConfig::SetZonePort(sci->port); + } break; } case ServerOP_ChannelMessage: { @@ -441,7 +449,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) entity_list.MessageStatus(sem->guilddbid, sem->minstatus, sem->type, (char*)sem->message); else { Client* client = entity_list.GetClientByName(sem->to); - if (client != 0) { + if (client) { char* newmessage = 0; if (strstr(sem->message, "^") == 0) client->Message(sem->type, (char*)sem->message); @@ -464,25 +472,21 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_Motd: { - ServerMotd_Struct* smotd = (ServerMotd_Struct*)pack->pBuffer; - EQApplicationPacket *outapp; - outapp = new EQApplicationPacket(OP_MOTD); - char tmp[500] = { 0 }; - sprintf(tmp, "%s", smotd->motd); + if (pack->size != sizeof(ServerMotd_Struct)) + break; - outapp->size = strlen(tmp) + 1; - outapp->pBuffer = new uchar[outapp->size]; - memset(outapp->pBuffer, 0, outapp->size); - strcpy((char*)outapp->pBuffer, tmp); + ServerMotd_Struct *smotd = (ServerMotd_Struct *)pack->pBuffer; + SerializeBuffer buf(100); + buf.WriteString(smotd->motd); - entity_list.QueueClients(0, outapp); - safe_delete(outapp); + auto outapp = std::make_unique(OP_MOTD, buf); + entity_list.QueueClients(0, outapp.get()); break; } case ServerOP_ShutdownAll: { entity_list.Save(); - CatchSignal(2); + Shutdown(); break; } case ServerOP_ZoneShutdown: { @@ -576,8 +580,8 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case ServerOP_ZonePlayer: { ServerZonePlayer_Struct* szp = (ServerZonePlayer_Struct*)pack->pBuffer; Client* client = entity_list.GetClientByName(szp->name); - printf("Zoning %s to %s(%u) - %u\n", client != nullptr ? client->GetCleanName() : "Unknown", szp->zone, content_db.GetZoneID(szp->zone), szp->instance_id); - if (client != 0) { + // printf("Zoning %s to %s(%u) - %u\n", client != nullptr ? client->GetCleanName() : "Unknown", szp->zone, ZoneID(szp->zone), szp->instance_id); + if (client) { if (strcasecmp(szp->adminname, szp->name) == 0) client->Message(Chat::White, "Zoning to: %s", szp->zone); else if (client->GetAnon() == 1 && client->Admin() > szp->adminrank) @@ -586,17 +590,17 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) SendEmoteMessage(szp->adminname, 0, 0, "Summoning %s to %s %1.1f, %1.1f, %1.1f", szp->name, szp->zone, szp->x_pos, szp->y_pos, szp->z_pos); } if (!szp->instance_id) { - client->MovePC(content_db.GetZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); + client->MovePC(ZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); } else { - if (database.GetInstanceID(client->CharacterID(), content_db.GetZoneID(szp->zone)) == 0) { + if (database.GetInstanceID(client->CharacterID(), ZoneID(szp->zone)) == 0) { client->AssignToInstance(szp->instance_id); - client->MovePC(content_db.GetZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); + client->MovePC(ZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); } else { - client->RemoveFromInstance(database.GetInstanceID(client->CharacterID(), content_db.GetZoneID(szp->zone))); + client->RemoveFromInstance(database.GetInstanceID(client->CharacterID(), ZoneID(szp->zone))); client->AssignToInstance(szp->instance_id); - client->MovePC(content_db.GetZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); + client->MovePC(ZoneID(szp->zone), szp->instance_id, szp->x_pos, szp->y_pos, szp->z_pos, client->GetHeading(), szp->ignorerestrictions, GMSummon); } } } @@ -605,7 +609,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case ServerOP_KickPlayer: { ServerKickPlayer_Struct* skp = (ServerKickPlayer_Struct*)pack->pBuffer; Client* client = entity_list.GetClientByName(skp->name); - if (client != 0) { + if (client) { if (skp->adminrank >= client->Admin()) { client->WorldKick(); if (is_zone_loaded) @@ -621,7 +625,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case ServerOP_KillPlayer: { ServerKillPlayer_Struct* skp = (ServerKillPlayer_Struct*)pack->pBuffer; Client* client = entity_list.GetClientByName(skp->target); - if (client != 0) { + if (client) { if (skp->admin >= client->Admin()) { client->GMKill(); if (is_zone_loaded) @@ -652,7 +656,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) case ServerOP_FlagUpdate: { Client* client = entity_list.GetClientByAccID(*((uint32*)pack->pBuffer)); - if (client != 0) { + if (client) { client->UpdateAdmin(); } break; @@ -666,7 +670,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; ServerGMGoto_Struct* gmg = (ServerGMGoto_Struct*)pack->pBuffer; Client* client = entity_list.GetClientByName(gmg->gotoname); - if (client != 0) { + if (client) { SendEmoteMessage(gmg->myname, 0, 13, "Summoning you to: %s @ %s, %1.1f, %1.1f, %1.1f", client->GetName(), zone->GetShortName(), client->GetX(), client->GetY(), client->GetZ()); auto outpack = new ServerPacket(ServerOP_ZonePlayer, sizeof(ServerZonePlayer_Struct)); ServerZonePlayer_Struct* szp = (ServerZonePlayer_Struct*)outpack->pBuffer; @@ -827,7 +831,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_RefreshCensorship: { - if (!EQEmu::ProfanityManager::LoadProfanityList(&database)) + if (!EQ::ProfanityManager::LoadProfanityList(&database)) LogError("Received request to refresh the profanity list..but, the action failed"); break; } @@ -919,7 +923,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) database.SetGroupLeaderName(group->GetID(), Inviter->GetName()); group->UpdateGroupAAs(); - if (Inviter->CastToClient()->ClientVersion() < EQEmu::versions::ClientVersion::SoD) + if (Inviter->CastToClient()->ClientVersion() < EQ::versions::ClientVersion::SoD) { auto outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); @@ -1007,7 +1011,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) if (group->GetID() != 0) entity_list.AddGroup(group, groupid); else - group = nullptr; + safe_delete(group); } if (group) @@ -1043,7 +1047,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) int mentor_percent; GroupLeadershipAA_Struct GLAA; memset(ln, 0, 64); - strcpy(ln, database.GetGroupLeadershipInfo(group->GetID(), ln, MainTankName, AssistName, PullerName, NPCMarkerName, mentoree_name, &mentor_percent, &GLAA)); + database.GetGroupLeadershipInfo(group->GetID(), ln, MainTankName, AssistName, PullerName, NPCMarkerName, mentoree_name, &mentor_percent, &GLAA); Client *lc = entity_list.GetClientByName(ln); if (lc) group->SetLeader(lc); @@ -1447,7 +1451,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) bool found_corpse = false; for (auto const& it : entity_list.GetCorpseList()) { if (it.second->IsPlayerCorpse() && strcmp(it.second->GetOwnerName(), s->ownername) == 0) { - if (s->consent_type == EQEmu::consent::Normal) { + if (s->consent_type == EQ::consent::Normal) { if (s->permission == 1) { it.second->AddConsentName(s->grantname); } @@ -1455,13 +1459,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) it.second->RemoveConsentName(s->grantname); } } - else if (s->consent_type == EQEmu::consent::Group) { + else if (s->consent_type == EQ::consent::Group) { it.second->SetConsentGroupID(s->consent_id); } - else if (s->consent_type == EQEmu::consent::Raid) { + else if (s->consent_type == EQ::consent::Raid) { it.second->SetConsentRaidID(s->consent_id); } - else if (s->consent_type == EQEmu::consent::Guild) { + else if (s->consent_type == EQ::consent::Guild) { it.second->SetConsentGuildID(s->consent_id); } found_corpse = true; @@ -1485,7 +1489,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) ServerOP_Consent_Struct* s = (ServerOP_Consent_Struct*)pack->pBuffer; Client* owner_client = entity_list.GetClientByName(s->ownername); Client* grant_client = nullptr; - if (s->consent_type == EQEmu::consent::Normal) { + if (s->consent_type == EQ::consent::Normal) { grant_client = entity_list.GetClientByName(s->grantname); } if (owner_client || grant_client) { @@ -1874,77 +1878,931 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } case ServerOP_UCSServerStatusReply: { - auto ucsss = (UCSServerStatus_Struct*)pack->pBuffer; - if (zone) + auto ucsss = (UCSServerStatus_Struct *) pack->pBuffer; + if (zone) { zone->SetUCSServerAvailable((ucsss->available != 0), ucsss->timestamp); - break; - } - case ServerOP_CZSetEntityVariableByNPCTypeID: - { - CZSetEntVarByNPCTypeID_Struct* CZM = (CZSetEntVarByNPCTypeID_Struct*)pack->pBuffer; - NPC* n = entity_list.GetNPCByNPCTypeID(CZM->npctype_id); - if (n != 0) { - n->SetEntityVariable(CZM->id, CZM->m_var); + LogInfo("UCS Server is now [{}]", (ucsss->available == 1 ? "online" : "offline")); } break; } - case ServerOP_CZSignalNPC: + case ServerOP_CZCastSpellPlayer: { - CZNPCSignal_Struct* CZCN = (CZNPCSignal_Struct*)pack->pBuffer; - NPC* n = entity_list.GetNPCByNPCTypeID(CZCN->npctype_id); - if (n != 0) { - n->SignalNPC(CZCN->data); + CZCastSpellPlayer_Struct* CZSC = (CZCastSpellPlayer_Struct*) pack->pBuffer; + Client* client = entity_list.GetClientByCharID(CZSC->character_id); + if (client) { + client->SpellFinished(CZSC->spell_id, client); } break; } - case ServerOP_CZSignalClient: + case ServerOP_CZCastSpellGroup: { - CZClientSignal_Struct* CZCS = (CZClientSignal_Struct*)pack->pBuffer; - Client* client = entity_list.GetClientByCharID(CZCS->charid); - if (client != 0) { - client->Signal(CZCS->data); + CZCastSpellGroup_Struct* CZSC = (CZCastSpellGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZSC->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->SpellFinished(CZSC->spell_id, group_member); + } + } } break; } - case ServerOP_CZSignalClientByName: + case ServerOP_CZCastSpellRaid: { - CZClientSignalByName_Struct* CZCS = (CZClientSignalByName_Struct*)pack->pBuffer; - Client* client = entity_list.GetClientByName(CZCS->Name); - if (client != 0) { - client->Signal(CZCS->data); + CZCastSpellRaid_Struct* CZSC = (CZCastSpellRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZSC->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->SpellFinished(CZSC->spell_id, raid_member); + } + } + } + break; + } + case ServerOP_CZCastSpellGuild: + { + CZCastSpellGuild_Struct* CZSC = (CZCastSpellGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZSC->guild_id) { + client.second->SpellFinished(CZSC->spell_id, client.second); + } + } + break; + } + case ServerOP_CZMarqueePlayer: + { + CZMarqueePlayer_Struct* CZMS = (CZMarqueePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZMS->character_id); + std::string message = CZMS->message; + if (client) { + client->SendMarqueeMessage(CZMS->type, CZMS->priority, CZMS->fade_in, CZMS->fade_out, CZMS->duration, message); + } + break; + } + case ServerOP_CZMarqueeGroup: + { + CZMarqueeGroup_Struct* CZMS = (CZMarqueeGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZMS->group_id); + std::string message = CZMS->message; + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->SendMarqueeMessage(CZMS->type, CZMS->priority, CZMS->fade_in, CZMS->fade_out, CZMS->duration, message); + } + } + } + break; + } + case ServerOP_CZMarqueeRaid: + { + CZMarqueeRaid_Struct* CZMS = (CZMarqueeRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZMS->raid_id); + std::string message = CZMS->message; + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->SendMarqueeMessage(CZMS->type, CZMS->priority, CZMS->fade_in, CZMS->fade_out, CZMS->duration, message); + } + } + } + break; + } + case ServerOP_CZMarqueeGuild: + { + CZMarqueeGuild_Struct* CZMS = (CZMarqueeGuild_Struct*) pack->pBuffer; + std::string message = CZMS->message; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZMS->guild_id) { + client.second->SendMarqueeMessage(CZMS->type, CZMS->priority, CZMS->fade_in, CZMS->fade_out, CZMS->duration, message); + } } break; } case ServerOP_CZMessagePlayer: { - CZMessagePlayer_Struct* CZCS = (CZMessagePlayer_Struct*)pack->pBuffer; - Client* client = entity_list.GetClientByName(CZCS->CharName); - if (client != 0) { - client->Message(CZCS->Type, CZCS->Message); + CZMessagePlayer_Struct* CZCS = (CZMessagePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByName(CZCS->character_name); + if (client) { + client->Message(CZCS->type, CZCS->message); + } + break; + } + case ServerOP_CZMessageGroup: + { + CZMessageGroup_Struct* CZGM = (CZMessageGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZGM->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->Message(CZGM->type, CZGM->message); + } + } + } + break; + } + case ServerOP_CZMessageRaid: + { + CZMessageRaid_Struct* CZRM = (CZMessageRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZRM->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->Message(CZRM->type, CZRM->message); + } + } + } + break; + } + case ServerOP_CZMessageGuild: + { + CZMessageGuild_Struct* CZGM = (CZMessageGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZGM->guild_id) { + client.second->Message(CZGM->type, CZGM->message); + } + } + break; + } + case ServerOP_CZMovePlayer: + { + CZMovePlayer_Struct* CZMP = (CZMovePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZMP->character_id); + if (client) { + client->MoveZone(CZMP->zone_short_name); + } + break; + } + case ServerOP_CZMoveGroup: + { + CZMoveGroup_Struct* CZMG = (CZMoveGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZMG->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->MoveZone(CZMG->zone_short_name); + } + } + } + break; + } + case ServerOP_CZMoveRaid: + { + CZMoveRaid_Struct* CZMR = (CZMoveRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZMR->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->MoveZone(CZMR->zone_short_name); + } + } + } + break; + } + case ServerOP_CZMoveGuild: + { + CZMoveGuild_Struct* CZMG = (CZMoveGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZMG->guild_id) { + client.second->MoveZone(CZMG->zone_short_name); + } + } + break; + } + + case ServerOP_CZMoveInstancePlayer: + { + CZMoveInstancePlayer_Struct* CZMP = (CZMoveInstancePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZMP->character_id); + if (client) { + client->MoveZoneInstance(CZMP->instance_id); + } + break; + } + case ServerOP_CZMoveInstanceGroup: + { + CZMoveInstanceGroup_Struct* CZMG = (CZMoveInstanceGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZMG->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->MoveZoneInstance(CZMG->instance_id); + } + } + } + break; + } + case ServerOP_CZMoveInstanceRaid: + { + CZMoveInstanceRaid_Struct* CZMR = (CZMoveInstanceRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZMR->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->MoveZoneInstance(CZMR->instance_id); + } + } + } + break; + } + case ServerOP_CZMoveInstanceGuild: + { + CZMoveInstanceGuild_Struct* CZMG = (CZMoveInstanceGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZMG->guild_id) { + client.second->MoveZoneInstance(CZMG->instance_id); + } + } + break; + } + case ServerOP_CZRemoveSpellPlayer: + { + CZRemoveSpellPlayer_Struct* CZRS = (CZRemoveSpellPlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZRS->character_id); + if (client) { + client->BuffFadeBySpellID(CZRS->spell_id); + } + break; + } + case ServerOP_CZRemoveSpellGroup: + { + CZRemoveSpellGroup_Struct* CZRS = (CZRemoveSpellGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZRS->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->BuffFadeBySpellID(CZRS->spell_id); + } + } + } + break; + } + case ServerOP_CZRemoveSpellRaid: + { + CZRemoveSpellRaid_Struct* CZRS = (CZRemoveSpellRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZRS->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->BuffFadeBySpellID(CZRS->spell_id); + } + } + } + break; + } + case ServerOP_CZRemoveSpellGuild: + { + CZRemoveSpellGuild_Struct* CZRS = (CZRemoveSpellGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZRS->guild_id) { + client.second->BuffFadeBySpellID(CZRS->spell_id); + } } break; } case ServerOP_CZSetEntityVariableByClientName: { - CZSetEntVarByClientName_Struct* CZCS = (CZSetEntVarByClientName_Struct*)pack->pBuffer; - Client* client = entity_list.GetClientByName(CZCS->CharName); - if (client != 0) { - client->SetEntityVariable(CZCS->id, CZCS->m_var); + CZSetEntVarByClientName_Struct* CZCS = (CZSetEntVarByClientName_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByName(CZCS->character_name); + if (client) { + client->SetEntityVariable(CZCS->variable_name, CZCS->variable_value); + } + break; + } + case ServerOP_CZSetEntityVariableByGroupID: + { + CZSetEntVarByGroupID_Struct* CZCS = (CZSetEntVarByGroupID_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZCS->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->SetEntityVariable(CZCS->variable_name, CZCS->variable_value); + } + } + } + break; + } + case ServerOP_CZSetEntityVariableByRaidID: + { + CZSetEntVarByRaidID_Struct* CZCS = (CZSetEntVarByRaidID_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZCS->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->SetEntityVariable(CZCS->variable_name, CZCS->variable_value); + } + } + } + break; + } + case ServerOP_CZSetEntityVariableByGuildID: + { + CZSetEntVarByGuildID_Struct* CZCS = (CZSetEntVarByGuildID_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZCS->guild_id) { + client.second->SetEntityVariable(CZCS->variable_name, CZCS->variable_value); + } + } + break; + } + case ServerOP_CZSetEntityVariableByNPCTypeID: + { + CZSetEntVarByNPCTypeID_Struct* CZM = (CZSetEntVarByNPCTypeID_Struct*) pack->pBuffer; + auto npc = entity_list.GetNPCByNPCTypeID(CZM->npctype_id); + if (npc != 0) { + npc->SetEntityVariable(CZM->variable_name, CZM->variable_value); + } + break; + } + case ServerOP_CZSignalNPC: + { + CZNPCSignal_Struct* CZCN = (CZNPCSignal_Struct*) pack->pBuffer; + auto npc = entity_list.GetNPCByNPCTypeID(CZCN->npctype_id); + if (npc != 0) { + npc->SignalNPC(CZCN->signal); + } + break; + } + case ServerOP_CZSignalClient: + { + CZClientSignal_Struct* CZCS = (CZClientSignal_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZCS->character_id); + if (client) { + client->Signal(CZCS->signal); + } + break; + } + case ServerOP_CZSignalGroup: + { + CZGroupSignal_Struct* CZGS = (CZGroupSignal_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZGS->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->Signal(CZGS->signal); + } + } + } + break; + } + case ServerOP_CZSignalRaid: + { + CZRaidSignal_Struct* CZRS = (CZRaidSignal_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZRS->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->Signal(CZRS->signal); + } + } + } + break; + } + case ServerOP_CZSignalGuild: + { + CZGuildSignal_Struct* CZGS = (CZGuildSignal_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZGS->guild_id) { + client.second->Signal(CZGS->signal); + } + } + break; + } + case ServerOP_CZSignalClientByName: + { + CZClientSignalByName_Struct* CZCS = (CZClientSignalByName_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByName(CZCS->character_name); + if (client) { + client->Signal(CZCS->signal); + } + break; + } + case ServerOP_CZTaskAssignPlayer: + { + CZTaskAssignPlayer_Struct* CZTA = (CZTaskAssignPlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZTA->character_id); + if (client) { + client->AssignTask(CZTA->task_id, CZTA->npc_entity_id, CZTA->enforce_level_requirement); + } + break; + } + case ServerOP_CZTaskAssignGroup: + { + CZTaskAssignGroup_Struct* CZTA = (CZTaskAssignGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZTA->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->AssignTask(CZTA->task_id, CZTA->npc_entity_id, CZTA->enforce_level_requirement); + } + } + } + break; + } + case ServerOP_CZTaskAssignRaid: + { + CZTaskAssignRaid_Struct* CZTA = (CZTaskAssignRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZTA->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->AssignTask(CZTA->task_id, CZTA->npc_entity_id, CZTA->enforce_level_requirement); + } + } + } + break; + } + case ServerOP_CZTaskAssignGuild: + { + CZTaskAssignGuild_Struct* CZTA = (CZTaskAssignGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZTA->guild_id) { + client.second->AssignTask(CZTA->task_id, CZTA->npc_entity_id, CZTA->enforce_level_requirement); + } + } + break; + } + case ServerOP_CZTaskActivityResetPlayer: + { + CZTaskActivityResetPlayer_Struct* CZRA = (CZTaskActivityResetPlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZRA->character_id); + if (client) { + client->ResetTaskActivity(CZRA->task_id, CZRA->activity_id); + } + break; + } + case ServerOP_CZTaskActivityResetGroup: + { + CZTaskActivityResetGroup_Struct* CZRA = (CZTaskActivityResetGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZRA->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->ResetTaskActivity(CZRA->task_id, CZRA->activity_id); + } + } + } + break; + } + case ServerOP_CZTaskActivityResetRaid: + { + CZTaskActivityResetRaid_Struct* CZRA = (CZTaskActivityResetRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZRA->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->ResetTaskActivity(CZRA->task_id, CZRA->activity_id); + } + } + } + break; + } + case ServerOP_CZTaskActivityResetGuild: + { + CZTaskActivityResetGuild_Struct* CZRA = (CZTaskActivityResetGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZRA->guild_id) { + client.second->ResetTaskActivity(CZRA->task_id, CZRA->activity_id); + } + } + break; + } + case ServerOP_CZTaskActivityUpdatePlayer: + { + CZTaskActivityUpdatePlayer_Struct* CZUA = (CZTaskActivityUpdatePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZUA->character_id); + if (client) { + client->UpdateTaskActivity(CZUA->task_id, CZUA->activity_id, CZUA->activity_count); + } + break; + } + case ServerOP_CZTaskActivityUpdateGroup: + { + CZTaskActivityUpdateGroup_Struct* CZUA = (CZTaskActivityUpdateGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZUA->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->UpdateTaskActivity(CZUA->task_id, CZUA->activity_id, CZUA->activity_count); + } + } + } + break; + } + case ServerOP_CZTaskActivityUpdateRaid: + { + CZTaskActivityUpdateRaid_Struct* CZUA = (CZTaskActivityUpdateRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZUA->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->UpdateTaskActivity(CZUA->task_id, CZUA->activity_id, CZUA->activity_count); + } + } + } + break; + } + case ServerOP_CZTaskActivityUpdateGuild: + { + CZTaskActivityUpdateGuild_Struct* CZUA = (CZTaskActivityUpdateGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZUA->guild_id) { + client.second->UpdateTaskActivity(CZUA->task_id, CZUA->activity_id, CZUA->activity_count); + } + } + break; + } + case ServerOP_CZTaskDisablePlayer: + { + CZTaskDisablePlayer_Struct* CZUA = (CZTaskDisablePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZUA->character_id); + if (client) { + client->DisableTask(1, reinterpret_cast(CZUA->task_id)); + } + break; + } + case ServerOP_CZTaskDisableGroup: + { + CZTaskDisableGroup_Struct* CZUA = (CZTaskDisableGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZUA->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->DisableTask(1, reinterpret_cast(CZUA->task_id)); + } + } + } + break; + } + case ServerOP_CZTaskDisableRaid: + { + CZTaskDisableRaid_Struct* CZUA = (CZTaskDisableRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZUA->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->DisableTask(1, reinterpret_cast(CZUA->task_id)); + } + } + } + break; + } + case ServerOP_CZTaskDisableGuild: + { + CZTaskDisableGuild_Struct* CZUA = (CZTaskDisableGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZUA->guild_id) { + client.second->DisableTask(1, reinterpret_cast(CZUA->task_id)); + } + } + break; + } + case ServerOP_CZTaskEnablePlayer: + { + CZTaskEnablePlayer_Struct* CZUA = (CZTaskEnablePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZUA->character_id); + if (client) { + client->EnableTask(1, reinterpret_cast(CZUA->task_id)); + } + break; + } + case ServerOP_CZTaskEnableGroup: + { + CZTaskEnableGroup_Struct* CZUA = (CZTaskEnableGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZUA->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->EnableTask(1, reinterpret_cast(CZUA->task_id)); + } + } + } + break; + } + case ServerOP_CZTaskEnableRaid: + { + CZTaskEnableRaid_Struct* CZUA = (CZTaskEnableRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZUA->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->EnableTask(1, reinterpret_cast(CZUA->task_id)); + } + } + } + break; + } + case ServerOP_CZTaskEnableGuild: + { + CZTaskEnableGuild_Struct* CZUA = (CZTaskEnableGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZUA->guild_id) { + client.second->EnableTask(1, reinterpret_cast(CZUA->task_id)); + } + } + break; + } + case ServerOP_CZTaskFailPlayer: + { + CZTaskFailPlayer_Struct* CZUA = (CZTaskFailPlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZUA->character_id); + if (client) { + client->FailTask(CZUA->task_id); + } + break; + } + case ServerOP_CZTaskFailGroup: + { + CZTaskFailGroup_Struct* CZUA = (CZTaskFailGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZUA->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->FailTask(CZUA->task_id); + } + } + } + break; + } + case ServerOP_CZTaskFailRaid: + { + CZTaskFailRaid_Struct* CZUA = (CZTaskFailRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZUA->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->FailTask(CZUA->task_id); + } + } + } + break; + } + case ServerOP_CZTaskFailGuild: + { + CZTaskFailGuild_Struct* CZUA = (CZTaskFailGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZUA->guild_id) { + client.second->FailTask(CZUA->task_id); + } + } + break; + } + case ServerOP_CZTaskRemovePlayer: + { + CZTaskRemovePlayer_Struct* CZTR = (CZTaskRemovePlayer_Struct*) pack->pBuffer; + auto client = entity_list.GetClientByCharID(CZTR->character_id); + if (client) { + client->RemoveTaskByTaskID(CZTR->task_id); + } + break; + } + case ServerOP_CZTaskRemoveGroup: + { + CZTaskRemoveGroup_Struct* CZTR = (CZTaskRemoveGroup_Struct*) pack->pBuffer; + auto client_group = entity_list.GetGroupByID(CZTR->group_id); + if (client_group) { + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->RemoveTaskByTaskID(CZTR->task_id); + } + } + } + break; + } + case ServerOP_CZTaskRemoveRaid: + { + CZTaskRemoveRaid_Struct* CZTR = (CZTaskRemoveRaid_Struct*) pack->pBuffer; + auto client_raid = entity_list.GetRaidByID(CZTR->raid_id); + if (client_raid) { + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->RemoveTaskByTaskID(CZTR->task_id); + } + } + } + break; + } + case ServerOP_CZTaskRemoveGuild: + { + CZTaskRemoveGuild_Struct* CZTR = (CZTaskRemoveGuild_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZTR->guild_id) { + client.second->RemoveTaskByTaskID(CZTR->task_id); + } + } + break; + } + case ServerOP_WWAssignTask: + { + WWAssignTask_Struct* WWAT = (WWAssignTask_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWAT->min_status && (client_status <= WWAT->max_status || WWAT->max_status == 0)) { + client.second->AssignTask(WWAT->task_id, WWAT->npc_entity_id, WWAT->enforce_level_requirement); + } + } + break; + } + case ServerOP_WWCastSpell: + { + WWCastSpell_Struct* WWCS = (WWCastSpell_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWCS->min_status && (client_status <= WWCS->max_status || WWCS->max_status == 0)) { + client.second->SpellFinished(WWCS->spell_id, client.second); + } + } + break; + } + case ServerOP_WWDisableTask: + { + WWDisableTask_Struct* WWDT = (WWDisableTask_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWDT->min_status && (client_status <= WWDT->max_status || WWDT->max_status == 0)) { + client.second->DisableTask(1, reinterpret_cast(WWDT->task_id)); + } + } + break; + } + case ServerOP_WWEnableTask: + { + WWEnableTask_Struct* WWET = (WWEnableTask_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWET->min_status && (client_status <= WWET->max_status || WWET->max_status == 0)) { + client.second->EnableTask(1, reinterpret_cast(WWET->task_id)); + } + } + break; + } + case ServerOP_WWFailTask: + { + WWFailTask_Struct* WWFT = (WWFailTask_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWFT->min_status && (client_status <= WWFT->max_status || WWFT->max_status == 0)) { + client.second->FailTask(WWFT->task_id); + } } break; } case ServerOP_WWMarquee: { - WWMarquee_Struct* WWMS = (WWMarquee_Struct*)pack->pBuffer; - std::list client_list; - entity_list.GetClientList(client_list); - auto iter = client_list.begin(); - std::string Message = WWMS->Message; - while (iter != client_list.end()) { - Client* client = (*iter); - client->SendMarqueeMessage(WWMS->Type, WWMS->Priority, WWMS->FadeIn, WWMS->FadeOut, WWMS->Duration, Message); - iter++; + WWMarquee_Struct* WWMS = (WWMarquee_Struct*) pack->pBuffer; + std::string message = WWMS->message; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWMS->min_status && (client_status <= WWMS->max_status || WWMS->max_status == 0)) { + client.second->SendMarqueeMessage(WWMS->type, WWMS->priority, WWMS->fade_in, WWMS->fade_out, WWMS->duration, message); + } } + break; + } + case ServerOP_WWMessage: + { + WWMessage_Struct* WWMS = (WWMessage_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWMS->min_status && (client_status <= WWMS->max_status || WWMS->max_status == 0)) { + client.second->Message(WWMS->type, WWMS->message); + } + } + break; + } + case ServerOP_WWMove: + { + WWMove_Struct* WWMS = (WWMove_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWMS->min_status && (client_status <= WWMS->max_status || WWMS->max_status == 0)) { + client.second->MoveZone(WWMS->zone_short_name); + } + } + break; + } + case ServerOP_WWMoveInstance: + { + WWMoveInstance_Struct* WWMS = (WWMoveInstance_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWMS->min_status && (client_status <= WWMS->max_status || WWMS->max_status == 0)) { + client.second->MoveZoneInstance(WWMS->instance_id); + } + } + break; + } + case ServerOP_WWRemoveSpell: + { + WWRemoveSpell_Struct* WWRS = (WWRemoveSpell_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWRS->min_status && (client_status <= WWRS->max_status || WWRS->max_status == 0)) { + client.second->BuffFadeBySpellID(WWRS->spell_id); + } + } + break; + } + case ServerOP_WWRemoveTask: + { + WWRemoveTask_Struct* WWRT = (WWRemoveTask_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWRT->min_status && (client_status <= WWRT->max_status || WWRT->max_status == 0)) { + client.second->RemoveTaskByTaskID(WWRT->task_id); + } + } + break; + } + case ServerOP_WWResetActivity: + { + WWResetActivity_Struct* WWRA = (WWResetActivity_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWRA->min_status && (client_status <= WWRA->max_status || WWRA->max_status == 0)) { + client.second->ResetTaskActivity(WWRA->task_id, WWRA->activity_id); + } + } + break; + } + case ServerOP_WWSetEntityVariableClient: + { + WWSetEntVarClient_Struct* WWSC = (WWSetEntVarClient_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWSC->min_status && (client_status <= WWSC->max_status || WWSC->max_status == 0)) { + client.second->SetEntityVariable(WWSC->variable_name, WWSC->variable_value); + } + } + break; + } + case ServerOP_WWSetEntityVariableNPC: + { + WWSetEntVarNPC_Struct* WWSN = (WWSetEntVarNPC_Struct*) pack->pBuffer; + for (auto &npc : entity_list.GetNPCList()) { + npc.second->SetEntityVariable(WWSN->variable_name, WWSN->variable_value); + } + break; + } + case ServerOP_WWSignalClient: + { + WWSignalClient_Struct* WWSC = (WWSignalClient_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWSC->min_status && (client_status <= WWSC->max_status || WWSC->max_status == 0)) { + client.second->Signal(WWSC->signal); + } + } + break; + } + case ServerOP_WWSignalNPC: + { + WWSignalNPC_Struct* WWSN = (WWSignalNPC_Struct*) pack->pBuffer; + for (auto &npc : entity_list.GetNPCList()) { + npc.second->SignalNPC(WWSN->signal); + } + break; + } + case ServerOP_WWUpdateActivity: + { + WWUpdateActivity_Struct* WWUA = (WWUpdateActivity_Struct*) pack->pBuffer; + for (auto &client : entity_list.GetClientList()) { + auto client_status = client.second->Admin(); + if (client_status >= WWUA->min_status && (client_status <= WWUA->max_status || WWUA->max_status == 0)) { + client.second->UpdateTaskActivity(WWUA->task_id, WWUA->activity_id, WWUA->activity_count); + } + } + break; } case ServerOP_ReloadWorld: @@ -1956,6 +2814,15 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } + case ServerOP_UpdateSchedulerEvents: { + LogScheduler("Received signal from world to update"); + if (m_zone_scheduler) { + m_zone_scheduler->LoadScheduledEvents(); + } + + break; + } + case ServerOP_HotReloadQuests: { if (!zone) { @@ -1972,14 +2839,18 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) std::string request_zone_short_name = hot_reload_quests->zone_short_name; std::string local_zone_short_name = zone->GetShortName(); + bool can_reload_global_script = (request_zone_short_name == "all" && RuleB(HotReload, QuestsAutoReloadGlobalScripts)); - if (request_zone_short_name == local_zone_short_name || request_zone_short_name == "all"){ + if (request_zone_short_name == local_zone_short_name || can_reload_global_script) { zone->SetQuestHotReloadQueued(true); + } else if (request_zone_short_name == "all") { + std::string reload_quest_saylink = EQ::SayLinkEngine::GenerateQuestSaylink("#reloadquest", false, "Locally"); + std::string reload_world_saylink = EQ::SayLinkEngine::GenerateQuestSaylink("#reloadworld", false, "Globally"); + worldserver.SendEmoteMessage(0, 0, 20, 15, "A quest, plugin, or global script has changed reload quests [%s] [%s].", reload_quest_saylink.c_str(), reload_world_saylink.c_str()); } break; } - case ServerOP_ChangeSharedMem: { std::string hotfix_name = std::string((char*)pack->pBuffer); @@ -2014,6 +2885,45 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } break; } + case ServerOP_CZClientMessageString: + { + auto buf = reinterpret_cast(pack->pBuffer); + Client* client = entity_list.GetClientByName(buf->character_name); + if (client) { + client->MessageString(buf); + } + break; + } + case ServerOP_ExpeditionCreate: + case ServerOP_ExpeditionDeleted: + case ServerOP_ExpeditionLeaderChanged: + case ServerOP_ExpeditionLockout: + case ServerOP_ExpeditionLockoutDuration: + case ServerOP_ExpeditionLockState: + case ServerOP_ExpeditionMemberChange: + case ServerOP_ExpeditionMemberSwap: + case ServerOP_ExpeditionMemberStatus: + case ServerOP_ExpeditionMembersRemoved: + case ServerOP_ExpeditionReplayOnJoin: + case ServerOP_ExpeditionGetMemberStatuses: + case ServerOP_ExpeditionDzAddPlayer: + case ServerOP_ExpeditionDzMakeLeader: + case ServerOP_ExpeditionCharacterLockout: + case ServerOP_ExpeditionExpireWarning: + { + Expedition::HandleWorldMessage(pack); + break; + } + case ServerOP_DzAddRemoveCharacter: + case ServerOP_DzRemoveAllCharacters: + case ServerOP_DzDurationUpdate: + case ServerOP_DzSetCompass: + case ServerOP_DzSetSafeReturn: + case ServerOP_DzSetZoneIn: + { + DynamicZone::HandleWorldMessage(pack); + break; + } default: { std::cout << " Unknown ZSopcode:" << (int)pack->opcode; std::cout << " size:" << pack->size << std::endl; @@ -2183,16 +3093,16 @@ void WorldServer::HandleReloadTasks(ServerPacket *pack) if (rts->Parameter == 0) { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload ALL tasks"); - safe_delete(taskmanager); - taskmanager = new TaskManager; - taskmanager->LoadTasks(); + safe_delete(task_manager); + task_manager = new TaskManager; + task_manager->LoadTasks(); if (zone) - taskmanager->LoadProximities(zone->GetZoneID()); + task_manager->LoadProximities(zone->GetZoneID()); entity_list.ReloadAllClientsTaskState(); } else { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload only task %i", rts->Parameter); - taskmanager->LoadTasks(rts->Parameter); + task_manager->LoadTasks(rts->Parameter); entity_list.ReloadAllClientsTaskState(rts->Parameter); } @@ -2201,18 +3111,18 @@ void WorldServer::HandleReloadTasks(ServerPacket *pack) case RELOADTASKPROXIMITIES: if (zone) { Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task proximities"); - taskmanager->LoadProximities(zone->GetZoneID()); + task_manager->LoadProximities(zone->GetZoneID()); } break; case RELOADTASKGOALLISTS: Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task goal lists"); - taskmanager->ReloadGoalLists(); + task_manager->ReloadGoalLists(); break; case RELOADTASKSETS: Log(Logs::General, Logs::Tasks, "[GLOBALLOAD] Reload task sets"); - taskmanager->LoadTaskSets(); + task_manager->LoadTaskSets(); break; default: @@ -2270,8 +3180,8 @@ void WorldServer::UpdateLFP(uint32 LeaderID, GroupLFPMemberEntry *LFPMembers) { void WorldServer::StopLFP(uint32 LeaderID) { - GroupLFPMemberEntry LFPMembers; - UpdateLFP(LeaderID, LFPOff, 0, 0, 0, 0, "", &LFPMembers); + GroupLFPMemberEntry LFPMembers[MAX_GROUP_MEMBERS]; + UpdateLFP(LeaderID, LFPOff, 0, 0, 0, 0, "", LFPMembers); } void WorldServer::HandleLFGMatches(ServerPacket *pack) { @@ -2399,3 +3309,13 @@ void WorldServer::OnKeepAlive(EQ::Timer *t) ServerPacket pack(ServerOP_KeepAlive, 0); SendPacket(&pack); } + +ZoneEventScheduler *WorldServer::GetScheduler() const +{ + return m_zone_scheduler; +} + +void WorldServer::SetScheduler(ZoneEventScheduler *scheduler) +{ + WorldServer::m_zone_scheduler = scheduler; +} diff --git a/zone/worldserver.h b/zone/worldserver.h index 1eee0b948..bcccb67b7 100644 --- a/zone/worldserver.h +++ b/zone/worldserver.h @@ -20,6 +20,7 @@ #include "../common/eq_packet_structs.h" #include "../common/net/servertalk_client_connection.h" +#include "zone_event_scheduler.h" class ServerPacket; class EQApplicationPacket; @@ -76,6 +77,11 @@ private: std::unique_ptr m_connection; std::unique_ptr m_keepalive; + + ZoneEventScheduler *m_zone_scheduler; +public: + ZoneEventScheduler *GetScheduler() const; + void SetScheduler(ZoneEventScheduler *scheduler); }; #endif diff --git a/zone/zone.cpp b/zone/zone.cpp index 7d1266f9e..2f974c35a 100755 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -37,6 +37,7 @@ #include "../common/string_util.h" #include "../common/eqemu_logsys.h" +#include "expedition.h" #include "guild_mgr.h" #include "map.h" #include "npc.h" @@ -56,6 +57,9 @@ #include "npc_scale_manager.h" #include "../common/data_verification.h" #include "zone_reload.h" +#include "../common/repositories/criteria/content_filter_criteria.h" +#include "../common/repositories/content_flags_repository.h" +#include "../common/repositories/zone_points_repository.h" #include #include @@ -83,7 +87,7 @@ Zone* zone = 0; void UpdateWindowTitle(char* iNewTitle); bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { - const char* zonename = content_db.GetZoneName(iZoneID); + const char* zonename = ZoneName(iZoneID); if (iZoneID == 0 || zonename == 0) return false; @@ -140,7 +144,7 @@ bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { if(iInstanceID != 0) { auto pack = new ServerPacket(ServerOP_AdventureZoneData, sizeof(uint16)); - *((uint16*)pack->pBuffer) = iInstanceID; + *((uint16*)pack->pBuffer) = iInstanceID; worldserver.SendPacket(pack); delete pack; } @@ -170,11 +174,14 @@ bool Zone::Bootup(uint32 iZoneID, uint32 iInstanceID, bool iStaticZone) { //this really loads the objects into entity_list bool Zone::LoadZoneObjects() { - std::string query = - StringFormat("SELECT id, zoneid, xpos, ypos, zpos, heading, itemid, charges, objectname, type, icon, " - "unknown08, unknown10, unknown20, unknown24, unknown76, size, tilt_x, tilt_y, display_name " - "FROM object WHERE zoneid = %i AND (version = %u OR version = -1)", - zoneid, instanceversion); + std::string query = StringFormat( + "SELECT id, zoneid, xpos, ypos, zpos, heading, itemid, charges, objectname, type, icon, " + "unknown08, unknown10, unknown20, unknown24, unknown76, size, tilt_x, tilt_y, display_name " + "FROM object WHERE zoneid = %i AND (version = %u OR version = -1) %s", + zoneid, + instanceversion, + ContentFilterCriteria::apply().c_str() + ); auto results = content_db.QueryDatabase(query); if (!results.Success()) { LogError("Error Loading Objects from DB: [{}]", @@ -186,7 +193,7 @@ bool Zone::LoadZoneObjects() for (auto row = results.begin(); row != results.end(); ++row) { if (atoi(row[9]) == 0) { // Type == 0 - Static Object - const char *shortname = content_db.GetZoneName(atoi(row[1]), false); // zoneid -> zone_shortname + const char *shortname = ZoneName(atoi(row[1]), false); // zoneid -> zone_shortname if (!shortname) continue; @@ -262,12 +269,22 @@ bool Zone::LoadZoneObjects() data.tilt_y = atof(row[18]); data.unknown084 = 0; - EQEmu::ItemInstance *inst = nullptr; + + glm::vec3 position; + position.x = data.x; + position.y = data.y; + position.z = data.z; + + if (zone->HasMap()) { + data.z = zone->zonemap->FindBestZ(position, nullptr); + } + + EQ::ItemInstance *inst = nullptr; // FatherNitwit: this dosent seem to work... // tradeskill containers do not have an itemid of 0... at least what I am seeing if (itemid == 0) { // Generic tradeskill container - inst = new EQEmu::ItemInstance(ItemInstWorldContainer); + inst = new EQ::ItemInstance(ItemInstWorldContainer); } else { // Groundspawn object inst = database.CreateItem(itemid); @@ -275,11 +292,11 @@ bool Zone::LoadZoneObjects() // Father Nitwit's fix... not perfect... if (inst == nullptr && type != OT_DROPPEDITEM) { - inst = new EQEmu::ItemInstance(ItemInstWorldContainer); + inst = new EQ::ItemInstance(ItemInstWorldContainer); } // Load child objects if container - if (inst && inst->IsType(EQEmu::item::ItemClassBag)) { + if (inst && inst->IsType(EQ::item::ItemClassBag)) { database.LoadWorldContainer(id, inst); } @@ -308,7 +325,7 @@ bool Zone::LoadGroundSpawns() { uint32 gsnumber=0; for(gsindex=0;gsindex<50;gsindex++){ if(groundspawn.spawn[gsindex].item>0 && groundspawn.spawn[gsindex].item merlist = merchanttable[merchantid]; - std::list::const_iterator itr; - uint32 i = 1; - for (itr = merlist.begin(); itr != merlist.end(); ++itr) { - MerchantList ml = *itr; - if (ml.item == item) - return 0; - - // Account for merchant lists with gaps in them. - if (ml.slot >= i) - i = ml.slot + 1; - } +void Zone::DumpMerchantList(uint32 npcid) { std::list tmp_merlist = tmpmerchanttable[npcid]; std::list::const_iterator tmp_itr; - bool update_charges = false; TempMerchantList ml; - while (freeslot == 0 && !update_charges) { - freeslot = i; - for (tmp_itr = tmp_merlist.begin(); tmp_itr != tmp_merlist.end(); ++tmp_itr) { - ml = *tmp_itr; - if (ml.item == item) { - update_charges = true; - freeslot = 0; - break; - } - if ((ml.slot == i) || (ml.origslot == i)) { - freeslot = 0; - } - } - i++; + + for (tmp_itr = tmp_merlist.begin(); tmp_itr != tmp_merlist.end(); ++tmp_itr) { + ml = *tmp_itr; + + LogInventory("slot[{}] Orig[{}] Item[{}] Charges[{}]", ml.slot, ml.origslot, ml.item, ml.charges); } - if (update_charges) { +} + +int Zone::SaveTempItem(uint32 merchantid, uint32 npcid, uint32 item, int32 charges, bool sold) { + + LogInventory("Transaction of [{}] [{}]", charges, item); + //DumpMerchantList(npcid); + // Iterate past main items. + // If the item being transacted is in this list, return 0; + std::list merlist = merchanttable[merchantid]; + std::list::const_iterator itr; + uint32 temp_slot_index = 1; + for (itr = merlist.begin(); itr != merlist.end(); ++itr) { + MerchantList ml = *itr; + if (ml.item == item) { + return 0; + } + + // Account for merchant lists with gaps in them. + if (ml.slot >= temp_slot_index) { + temp_slot_index = ml.slot + 1; + } + } + + LogInventory("Searching Temporary List. Main list ended at [{}]", temp_slot_index-1); + + // Now search the temporary list. + std::list tmp_merlist = tmpmerchanttable[npcid]; + std::list::const_iterator tmp_itr; + TempMerchantList ml; + uint32 first_empty_slot = 0; // Save 1st vacant slot while searching.. + bool found = false; + + for (tmp_itr = tmp_merlist.begin(); tmp_itr != tmp_merlist.end(); ++tmp_itr) { + ml = *tmp_itr; + + if (ml.item == item) { + found = true; + LogInventory("Item found in temp list at [{}] with [{}] charges", ml.origslot, ml.charges); + break; + } + } + + if (found) { tmp_merlist.clear(); std::list oldtmp_merlist = tmpmerchanttable[npcid]; for (tmp_itr = oldtmp_merlist.begin(); tmp_itr != oldtmp_merlist.end(); ++tmp_itr) { TempMerchantList ml2 = *tmp_itr; if(ml2.item != item) tmp_merlist.push_back(ml2); + else { + if (sold) { + LogInventory("Total charges is [{}] + [{}] charges", ml.charges, charges); + ml.charges = ml.charges + charges; + } + else { + ml.charges = charges; + LogInventory("new charges is [{}] charges", ml.charges); + } + + if (!ml.origslot) { + ml.origslot = ml.slot; + } + + if (charges > 0) { + database.SaveMerchantTemp(npcid, ml.origslot, item, ml.charges); + tmp_merlist.push_back(ml); + } + else { + database.DeleteMerchantTemp(npcid, ml.origslot); + } + } } - if (sold) - ml.charges = ml.charges + charges; - else - ml.charges = charges; - if (!ml.origslot) - ml.origslot = ml.slot; - if (charges > 0) { - database.SaveMerchantTemp(npcid, ml.origslot, item, ml.charges); - tmp_merlist.push_back(ml); - } - else { - database.DeleteMerchantTemp(npcid, ml.origslot); - } + tmpmerchanttable[npcid] = tmp_merlist; - - if (sold) - return ml.slot; - + //DumpMerchantList(npcid); + return ml.slot; } - if (freeslot) { - if (charges < 0) //sanity check only, shouldnt happen + else { + if (charges < 0) { //sanity check only, shouldnt happen charges = 0x7FFF; - database.SaveMerchantTemp(npcid, freeslot, item, charges); + } + + // Find an ununsed db slot # + std::list slots; + TempMerchantList ml3; + for (tmp_itr = tmp_merlist.begin(); tmp_itr != tmp_merlist.end(); ++tmp_itr) { + ml3 = *tmp_itr; + slots.push_back(ml3.origslot); + } + slots.sort(); + std::list::const_iterator slots_itr; + uint32 first_empty_slot = 0; + uint32 idx = temp_slot_index; + for (slots_itr = slots.begin(); slots_itr != slots.end(); ++slots_itr) { + if (!first_empty_slot && *slots_itr > idx) { + LogInventory("Popped [{}]", *slots_itr); + LogInventory("First Gap Found at [{}]", idx); + break; + } + + ++idx; + } + + first_empty_slot = idx; + + // Find an ununsed mslot + slots.clear(); + for (tmp_itr = tmp_merlist.begin(); tmp_itr != tmp_merlist.end(); ++tmp_itr) { + ml3 = *tmp_itr; + slots.push_back(ml3.slot); + } + slots.sort(); + uint32 first_empty_mslot=0; + idx = temp_slot_index; + for (slots_itr = slots.begin(); slots_itr != slots.end(); ++slots_itr) { + if (!first_empty_mslot && *slots_itr > idx) { + LogInventory("Popped [{}]", *slots_itr); + LogInventory("First Gap Found at [{}]", idx); + break; + } + + ++idx; + } + + first_empty_mslot = idx; + + database.SaveMerchantTemp(npcid, first_empty_slot, item, charges); tmp_merlist = tmpmerchanttable[npcid]; TempMerchantList ml2; ml2.charges = charges; + LogInventory("Adding slot [{}] with [{}] charges.", first_empty_mslot, charges); ml2.item = item; ml2.npcid = npcid; - ml2.slot = freeslot; - ml2.origslot = ml2.slot; + ml2.slot = first_empty_mslot; + ml2.origslot = first_empty_slot; tmp_merlist.push_back(ml2); tmpmerchanttable[npcid] = tmp_merlist; + //DumpMerchantList(npcid); + return ml2.slot; } - return freeslot; } uint32 Zone::GetTempMerchantQuantity(uint32 NPCID, uint32 Slot) { @@ -413,8 +505,10 @@ uint32 Zone::GetTempMerchantQuantity(uint32 NPCID, uint32 Slot) { std::list::const_iterator Iterator; for (Iterator = TmpMerchantList.begin(); Iterator != TmpMerchantList.end(); ++Iterator) - if ((*Iterator).slot == Slot) + if ((*Iterator).slot == Slot) { + LogInventory("Slot [{}] has [{}] charges.", Slot, (*Iterator).charges); return (*Iterator).charges; + } return 0; } @@ -498,73 +592,110 @@ void Zone::LoadTempMerchantData() void Zone::LoadNewMerchantData(uint32 merchantid) { std::list merlist; - std::string query = StringFormat("SELECT item, slot, faction_required, level_required, alt_currency_cost, " - "classes_required, probability FROM merchantlist WHERE merchantid=%d ORDER BY slot", merchantid); + + std::string query = fmt::format( + SQL( + SELECT + item, + slot, + faction_required, + level_required, + alt_currency_cost, + classes_required, + probability + FROM + merchantlist + WHERE + merchantid = {} + {} + ORDER BY + slot + ), + merchantid, + ContentFilterCriteria::apply() + ); + auto results = content_db.QueryDatabase(query); if (!results.Success()) { return; - } + } - for(auto row = results.begin(); row != results.end(); ++row) { - MerchantList ml; - ml.id = merchantid; - ml.item = atoul(row[0]); - ml.slot = atoul(row[1]); - ml.faction_required = atoul(row[2]); - ml.level_required = atoul(row[3]); - ml.alt_currency_cost = atoul(row[4]); - ml.classes_required = atoul(row[5]); - ml.probability = atoul(row[6]); - merlist.push_back(ml); - } + for (auto row = results.begin(); row != results.end(); ++row) { + MerchantList ml; + ml.id = merchantid; + ml.item = atoul(row[0]); + ml.slot = atoul(row[1]); + ml.faction_required = atoul(row[2]); + ml.level_required = atoul(row[3]); + ml.alt_currency_cost = atoul(row[4]); + ml.classes_required = atoul(row[5]); + ml.probability = atoul(row[6]); + merlist.push_back(ml); + } - merchanttable[merchantid] = merlist; + merchanttable[merchantid] = merlist; } void Zone::GetMerchantDataForZoneLoad() { LogInfo("Loading Merchant Lists"); - std::string query = StringFormat( - "SELECT " - "DISTINCT ml.merchantid, " - "ml.slot, " - "ml.item, " - "ml.faction_required, " - "ml.level_required, " - "ml.alt_currency_cost, " - "ml.classes_required, " - "ml.probability " - "FROM " - "merchantlist AS ml, " - "npc_types AS nt, " - "spawnentry AS se, " - "spawn2 AS s2 " - "WHERE nt.merchant_id = ml.merchantid AND nt.id = se.npcid " - "AND se.spawngroupid = s2.spawngroupid AND s2.zone = '%s' AND s2.version = %i " - "ORDER BY ml.slot ", GetShortName(), GetInstanceVersion()); + std::string query = fmt::format( + SQL ( + SELECT + DISTINCT merchantlist.merchantid, + merchantlist.slot, + merchantlist.item, + merchantlist.faction_required, + merchantlist.level_required, + merchantlist.alt_currency_cost, + merchantlist.classes_required, + merchantlist.probability + FROM + merchantlist, + npc_types, + spawnentry, + spawn2 + WHERE + npc_types.merchant_id = merchantlist.merchantid + AND npc_types.id = spawnentry.npcid + AND spawnentry.spawngroupid = spawn2.spawngroupid + AND spawn2.zone = '{}' + AND spawn2.version = {} + {} + ORDER BY + merchantlist.slot + ), + GetShortName(), + GetInstanceVersion(), + ContentFilterCriteria::apply("merchantlist") + ); + auto results = content_db.QueryDatabase(query); - std::map >::iterator cur; - uint32 npcid = 0; + + std::map >::iterator merchant_list; + + uint32 npc_id = 0; if (results.RowCount() == 0) { LogDebug("No Merchant Data found for [{}]", GetShortName()); return; } for (auto row = results.begin(); row != results.end(); ++row) { - MerchantList ml; - ml.id = atoul(row[0]); - if (npcid != ml.id) { - cur = merchanttable.find(ml.id); - if (cur == merchanttable.end()) { + MerchantList merchant_list_entry{}; + merchant_list_entry.id = atoul(row[0]); + if (npc_id != merchant_list_entry.id) { + merchant_list = merchanttable.find(merchant_list_entry.id); + if (merchant_list == merchanttable.end()) { std::list empty; - merchanttable[ml.id] = empty; - cur = merchanttable.find(ml.id); + merchanttable[merchant_list_entry.id] = empty; + merchant_list = merchanttable.find(merchant_list_entry.id); } - npcid = ml.id; + + npc_id = merchant_list_entry.id; } - auto iter = cur->second.begin(); + auto iter = merchant_list->second.begin(); bool found = false; - while (iter != cur->second.end()) { - if ((*iter).item == ml.id) { + while (iter != merchant_list->second.end()) { + if ((*iter).item == merchant_list_entry.id) { found = true; break; } @@ -575,14 +706,15 @@ void Zone::GetMerchantDataForZoneLoad() { continue; } - ml.slot = atoul(row[1]); - ml.item = atoul(row[2]); - ml.faction_required = atoul(row[3]); - ml.level_required = atoul(row[4]); - ml.alt_currency_cost = atoul(row[5]); - ml.classes_required = atoul(row[6]); - ml.probability = atoul(row[7]); - cur->second.push_back(ml); + merchant_list_entry.slot = atoul(row[1]); + merchant_list_entry.item = atoul(row[2]); + merchant_list_entry.faction_required = atoul(row[3]); + merchant_list_entry.level_required = atoul(row[4]); + merchant_list_entry.alt_currency_cost = atoul(row[5]); + merchant_list_entry.classes_required = atoul(row[6]); + merchant_list_entry.probability = atoul(row[7]); + + merchant_list->second.push_back(merchant_list_entry); } } @@ -728,12 +860,14 @@ void Zone::Shutdown(bool quiet) while (!zone->npctable.empty()) { itr = zone->npctable.begin(); delete itr->second; + itr->second = nullptr; zone->npctable.erase(itr); } while (!zone->merctable.empty()) { itr = zone->merctable.begin(); delete itr->second; + itr->second = nullptr; zone->merctable.erase(itr); } @@ -743,6 +877,7 @@ void Zone::Shutdown(bool quiet) while (!zone->ldon_trap_list.empty()) { itr4 = zone->ldon_trap_list.begin(); delete itr4->second; + itr4->second = nullptr; zone->ldon_trap_list.erase(itr4); } zone->ldon_trap_entry_list.clear(); @@ -766,7 +901,7 @@ void Zone::Shutdown(bool quiet) if (RuleB(Zone, KillProcessOnDynamicShutdown)) { LogInfo("[KillProcessOnDynamicShutdown] Shutting down"); - std::exit(EXIT_SUCCESS); + EQ::EventLoop::Get().Shutdown(); } } @@ -806,8 +941,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) spawn2_timer(1000), hot_reload_timer(1000), qglobal_purge_timer(30000), - hotzone_timer(120000), - m_SafePoint(0.0f,0.0f,0.0f), + m_SafePoint(0.0f,0.0f,0.0f,0.0f), m_Graveyard(0.0f,0.0f,0.0f,0.0f) { zoneid = in_zoneid; @@ -821,6 +955,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) default_ruleset = 0; is_zone_time_localized = false; + process_mobs_while_empty = false; loglevelvar = 0; merchantvar = 0; @@ -828,7 +963,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) lootvar = 0; if(RuleB(TaskSystem, EnableTaskSystem)) { - taskmanager->LoadProximities(zoneid); + task_manager->LoadProximities(zoneid); } short_name = strcpy(new char[strlen(in_short_name)+1], in_short_name); @@ -847,7 +982,7 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) { LogDebug("Graveyard ID is [{}]", graveyard_id()); bool GraveYardLoaded = content_db.GetZoneGraveyard(graveyard_id(), &pgraveyard_zoneid, &m_Graveyard.x, &m_Graveyard.y, &m_Graveyard.z, &m_Graveyard.w); - + if (GraveYardLoaded) { LogDebug("Loaded a graveyard for zone [{}]: graveyard zoneid is [{}] at [{}]", short_name, graveyard_zoneid(), to_string(m_Graveyard).c_str()); } @@ -1050,6 +1185,9 @@ bool Zone::Init(bool iStaticZone) { petition_list.ClearPetitions(); petition_list.ReadDatabase(); + LogInfo("Loading active Expeditions"); + Expedition::CacheAllFromDatabase(); + LogInfo("Loading timezone data"); zone->zone_time.setEQTimeZone(content_db.GetZoneTZ(zoneid, GetInstanceVersion())); @@ -1103,8 +1241,16 @@ void Zone::ReloadStaticData() { zone->LoadNPCEmotes(&NPCEmoteList); //load the zone config file. - if (!LoadZoneCFG(zone->GetShortName(), zone->GetInstanceVersion())) // try loading the zone name... - LoadZoneCFG(zone->GetFileName(), zone->GetInstanceVersion()); // if that fails, try the file name, then load defaults + if (!LoadZoneCFG(zone->GetShortName(), zone->GetInstanceVersion())) { // try loading the zone name... + LoadZoneCFG( + zone->GetFileName(), + zone->GetInstanceVersion() + ); + } // if that fails, try the file name, then load defaults + + content_service.SetExpansionContext(); + + ZoneStore::LoadContentFlags(); LogInfo("Zone Static Data Reloaded"); } @@ -1116,7 +1262,7 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_id) map_name = nullptr; if (!content_db.GetZoneCFG( - content_db.GetZoneID(filename), + ZoneID(filename), instance_id, &newzone_data, can_bind, @@ -1135,7 +1281,7 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_id) if (instance_id != 0) { safe_delete_array(map_name); if (!content_db.GetZoneCFG( - content_db.GetZoneID(filename), + ZoneID(filename), 0, &newzone_data, can_bind, @@ -1161,7 +1307,14 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_id) strcpy(newzone_data.zone_long_name, GetLongName()); strcpy(newzone_data.zone_short_name2, GetShortName()); - LogInfo("Successfully loaded Zone Config"); + LogInfo( + "Successfully loaded Zone Config for Zone [{}] ({}) Version [{}] Instance ID [{}]", + GetShortName(), + GetLongName(), + GetInstanceVersion(), + instance_id + ); + return true; } @@ -1270,7 +1423,7 @@ bool Zone::Process() { LinkedListIterator iterator(spawn2_list); - EQEmu::InventoryProfile::CleanDirty(); + EQ::InventoryProfile::CleanDirty(); iterator.Reset(); while (iterator.MoreElements()) { @@ -1339,7 +1492,17 @@ bool Zone::Process() { { if(Instance_Timer->Check()) { - entity_list.GateAllClients(); + // if this is a dynamic zone instance notify system associated with it + auto expedition = Expedition::FindCachedExpeditionByZoneInstance(GetZoneID(), GetInstanceID()); + if (expedition) + { + expedition->RemoveAllMembers(false); // entity list will teleport clients out immediately + } + + // instance shutting down, move corpses to graveyard or non-instanced zone at same coords + entity_list.MovePlayerCorpsesToGraveyard(true); + + entity_list.GateAllClientsToSafeReturn(); database.DeleteInstance(GetInstanceID()); Instance_Shutdown_Timer = new Timer(20000); //20 seconds } @@ -1349,20 +1512,29 @@ bool Zone::Process() { if(Instance_Warning_timer == nullptr) { uint32 rem_time = Instance_Timer->GetRemainingTime(); + uint32_t minutes_warning = 0; if(rem_time < 60000 && rem_time > 55000) { - entity_list.ExpeditionWarning(1); - Instance_Warning_timer = new Timer(10000); + minutes_warning = 1; } else if(rem_time < 300000 && rem_time > 295000) { - entity_list.ExpeditionWarning(5); - Instance_Warning_timer = new Timer(10000); + minutes_warning = 5; } else if(rem_time < 900000 && rem_time > 895000) { - entity_list.ExpeditionWarning(15); - Instance_Warning_timer = new Timer(10000); + minutes_warning = 15; + } + + if (minutes_warning > 0) + { + // expedition expire warnings are handled by world + auto expedition = Expedition::FindCachedExpeditionByZoneInstance(GetZoneID(), GetInstanceID()); + if (!expedition) + { + entity_list.ExpeditionWarning(minutes_warning); + Instance_Warning_timer = new Timer(10000); + } } } else if(Instance_Warning_timer->Check()) @@ -1409,8 +1581,6 @@ bool Zone::Process() { } } - if(hotzone_timer.Check()) { UpdateHotzone(); } - mMovementManager->Process(); return true; @@ -1563,6 +1733,7 @@ bool Zone::Depop(bool StartSpawnTimer) { while(!npctable.empty()) { itr = npctable.begin(); delete itr->second; + itr->second = nullptr; npctable.erase(itr); } @@ -1579,6 +1750,7 @@ void Zone::ClearNPCTypeCache(int id) { auto iter = npctable.begin(); while (iter != npctable.end()) { delete iter->second; + iter->second = nullptr; ++iter; } npctable.clear(); @@ -1588,6 +1760,7 @@ void Zone::ClearNPCTypeCache(int id) { while (iter != npctable.end()) { if (iter->first == (uint32)id) { delete iter->second; + iter->second = nullptr; npctable.erase(iter); return; } @@ -1715,8 +1888,7 @@ ZonePoint* Zone::GetClosestZonePoint(const glm::vec3& location, uint32 to, Clien { ZonePoint* zp = iterator.GetData(); uint32 mask_test = client->ClientVersionBit(); - if(!(zp->client_version_mask & mask_test)) - { + if (!(zp->client_version_mask & mask_test)) { iterator.Advance(); continue; } @@ -1757,7 +1929,7 @@ ZonePoint* Zone::GetClosestZonePoint(const glm::vec3& location, uint32 to, Clien ZonePoint* Zone::GetClosestZonePoint(const glm::vec3& location, const char* to_name, Client* client, float max_distance) { if(to_name == nullptr) return GetClosestZonePointWithoutZone(location.x, location.y, location.z, client, max_distance); - return GetClosestZonePoint(location, content_db.GetZoneID(to_name), client, max_distance); + return GetClosestZonePoint(location, ZoneID(to_name), client, max_distance); } ZonePoint* Zone::GetClosestZonePointWithoutZone(float x, float y, float z, Client* client, float max_distance) { @@ -1798,39 +1970,64 @@ ZonePoint* Zone::GetClosestZonePointWithoutZone(float x, float y, float z, Clien return closest_zp; } -bool ZoneDatabase::LoadStaticZonePoints(LinkedList* zone_point_list, const char* zonename, uint32 version) +bool ZoneDatabase::LoadStaticZonePoints(LinkedList *zone_point_list, const char *zonename, uint32 version) { zone_point_list->Clear(); zone->numzonepoints = 0; - std::string query = StringFormat("SELECT x, y, z, target_x, target_y, " - "target_z, target_zone_id, heading, target_heading, " - "number, target_instance, client_version_mask " - "FROM zone_points WHERE zone='%s' AND (version=%i OR version=-1) " - "ORDER BY number", - zonename, version); - auto results = QueryDatabase(query); - if (!results.Success()) { - return false; - } + zone->virtual_zone_point_list.clear(); - for (auto row = results.begin(); row != results.end(); ++row) { + auto zone_points = ZonePointsRepository::GetWhere(content_db, + fmt::format( + "zone = '{}' AND (version = {} OR version = -1) {} ORDER BY number", + zonename, + version, + ContentFilterCriteria::apply() + ) + ); + + for (auto &zone_point : zone_points) { auto zp = new ZonePoint; - zp->x = atof(row[0]); - zp->y = atof(row[1]); - zp->z = atof(row[2]); - zp->target_x = atof(row[3]); - zp->target_y = atof(row[4]); - zp->target_z = atof(row[5]); - zp->target_zone_id = atoi(row[6]); - zp->heading = atof(row[7]); - zp->target_heading = atof(row[8]); - zp->number = atoi(row[9]); - zp->target_zone_instance = atoi(row[10]); - zp->client_version_mask = (uint32)strtoul(row[11], nullptr, 0); + zp->x = zone_point.x; + zp->y = zone_point.y; + zp->z = zone_point.z; + zp->target_x = zone_point.target_x; + zp->target_y = zone_point.target_y; + zp->target_z = zone_point.target_z; + zp->target_zone_id = zone_point.target_zone_id; + zp->heading = zone_point.heading; + zp->target_heading = zone_point.target_heading; + zp->number = zone_point.number; + zp->target_zone_instance = zone_point.target_instance; + zp->client_version_mask = zone_point.client_version_mask; + zp->is_virtual = zone_point.is_virtual > 0; + zp->height = zone_point.height; + zp->width = zone_point.width; + + LogZonePoints( + "Loading ZP x [{}] y [{}] z [{}] heading [{}] target x y z zone_id instance_id [{}] [{}] [{}] [{}] [{}] number [{}] is_virtual [{}] height [{}] width [{}]", + zp->x, + zp->y, + zp->z, + zp->heading, + zp->target_x, + zp->target_y, + zp->target_z, + zp->target_zone_id, + zp->target_zone_instance, + zp->number, + zp->is_virtual ? "true" : "false", + zp->height, + zp->width + ); + + if (zone_point.is_virtual) { + zone->virtual_zone_point_list.emplace_back(zone_point); + safe_delete(zp); + continue; + } zone_point_list->Insert(zp); - zone->numzonepoints++; } @@ -2402,19 +2599,9 @@ uint32 Zone::GetSpawnKillCount(uint32 in_spawnid) { return 0; } -void Zone::UpdateHotzone() +void Zone::SetIsHotzone(bool is_hotzone) { - std::string query = StringFormat("SELECT hotzone FROM zone WHERE short_name = '%s'", GetShortName()); - auto results = content_db.QueryDatabase(query); - if (!results.Success()) - return; - - if (results.RowCount() == 0) - return; - - auto row = results.begin(); - - is_hotzone = atoi(row[0]) == 0 ? false: true; + Zone::is_hotzone = is_hotzone; } void Zone::RequestUCSServerStatus() { @@ -2482,7 +2669,7 @@ void Zone::CalculateNpcUpdateDistanceSpread() int x_spread = int(abs(max_x - min_x)); int y_spread = int(abs(max_y - min_y)); int combined_spread = int(abs((x_spread + y_spread) / 2)); - int update_distance = EQEmu::ClampLower(int(combined_spread / 4), int(zone->GetMaxMovementUpdateRange())); + int update_distance = EQ::ClampLower(int(combined_spread / 4), int(zone->GetMaxMovementUpdateRange())); SetNpcPositionUpdateDistance(update_distance); @@ -2513,3 +2700,36 @@ Timer Zone::GetInitgridsTimer() { return initgrids_timer; } + +uint32 Zone::GetInstanceTimeRemaining() const +{ + return instance_time_remaining; +} + +void Zone::SetInstanceTimeRemaining(uint32 instance_time_remaining) +{ + Zone::instance_time_remaining = instance_time_remaining; +} + +bool Zone::IsZone(uint32 zone_id, uint16 instance_id) const +{ + return (zoneid == zone_id && instanceid == instance_id); +} + +DynamicZone* Zone::GetDynamicZone() +{ + if (GetInstanceID() == 0) + { + return nullptr; + } + + auto expedition = Expedition::FindCachedExpeditionByZoneInstance(GetZoneID(), GetInstanceID()); + if (expedition) + { + return &expedition->GetDynamicZone(); + } + + // todo: tasks, missions, and quests with an associated dz for this instance id + + return nullptr; +} diff --git a/zone/zone.h b/zone/zone.h index bf986e6a1..c7c6daf12 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -25,8 +25,10 @@ #include "../common/random.h" #include "../common/string_util.h" #include "zonedb.h" +#include "zone_store.h" #include "../common/repositories/grid_repository.h" #include "../common/repositories/grid_entries_repository.h" +#include "../common/repositories/zone_points_repository.h" #include "qglobals.h" #include "spawn2.h" #include "spawngroup.h" @@ -34,6 +36,8 @@ #include "pathfinder_interface.h" #include "global_loot_manager.h" +class DynamicZone; + struct ZonePoint { float x; float y; @@ -47,6 +51,9 @@ struct ZonePoint { uint16 target_zone_id; int32 target_zone_instance; uint32 client_version_mask; + bool is_virtual; + int height; + int width; }; struct ZoneClientAuth_Struct { @@ -76,6 +83,7 @@ struct item_tick_struct { }; class Client; +class Expedition; class Map; class Mob; class WaterMap; @@ -96,6 +104,7 @@ public: AA::Ability *GetAlternateAdvancementAbilityByRank(int rank_id); AA::Rank *GetAlternateAdvancementRank(int rank_id); bool is_zone_time_localized; + bool process_mobs_while_empty; bool AggroLimitReached() { return (aggroedmobs > 10) ? true : false; } bool AllowMercs() const { return (allow_mercs); } bool CanBind() const { return (can_bind); } @@ -123,6 +132,7 @@ public: bool IsPVPZone() { return pvpzone; } bool IsSpellBlocked(uint32 spell_id, const glm::vec3 &location); bool IsUCSServerAvailable() { return m_ucss_available; } + bool IsZone(uint32 zone_id, uint16 instance_id) const; bool LoadGroundSpawns(); bool LoadZoneCFG(const char *filename, uint16 instance_id); bool LoadZoneObjects(); @@ -136,7 +146,7 @@ public: const char *GetSpellBlockedMessage(uint32 spell_id, const glm::vec3 &location); - EQEmu::Random random; + EQ::Random random; EQTime zone_time; ZonePoint *GetClosestZonePoint(const glm::vec3 &location, const char *to_name, Client *client, float max_distance = 40000.0f); @@ -157,7 +167,7 @@ public: inline const uint32 &graveyard_zoneid() { return pgraveyard_zoneid; } inline const uint32 GetInstanceID() const { return instanceid; } inline const uint32 GetZoneID() const { return zoneid; } - inline glm::vec3 GetSafePoint() { return m_SafePoint; } + inline glm::vec4 GetSafePoint() { return m_SafePoint; } inline glm::vec4 GetGraveyardPoint() { return m_Graveyard; } inline std::vector GetGlobalLootTables(NPC *mob) const { return m_global_loot.GetGlobalLootTables(mob); } inline Timer *GetInstanceTimer() { return Instance_Timer; } @@ -166,13 +176,17 @@ public: inline void ShowNPCGlobalLoot(Client *to, NPC *who) { m_global_loot.ShowNPCGlobalLoot(to, who); } inline void ShowZoneGlobalLoot(Client *to) { m_global_loot.ShowZoneGlobalLoot(to); } int GetZoneTotalBlockedSpells() { return zone_total_blocked_spells; } + void DumpMerchantList(uint32 npcid); int SaveTempItem(uint32 merchantid, uint32 npcid, uint32 item, int32 charges, bool sold = false); int32 MobsAggroCount() { return aggroedmobs; } + DynamicZone* GetDynamicZone(); + + IPathfinder *pathing; + LinkedList NPCEmoteList; + LinkedList spawn2_list; + LinkedList zone_point_list; + std::vector virtual_zone_point_list; - IPathfinder *pathing; - LinkedList NPCEmoteList; - LinkedList spawn2_list; - LinkedList zone_point_list; Map *zonemap; MercTemplate *GetMercTemplate(uint32 template_id); NewZone_Struct newzone_data; @@ -208,6 +222,8 @@ public: std::vector zone_grids; std::vector zone_grid_entries; + std::unordered_map> expedition_cache; + time_t weather_timer; Timer spawn2_timer; Timer hot_reload_timer; @@ -273,7 +289,6 @@ public: void SpawnConditionChanged(const SpawnCondition &c, int16 old_value); void SpawnStatus(Mob *client); void StartShutdownTimer(uint32 set_time = (RuleI(Zone, AutoShutdownDelay))); - void UpdateHotzone(); void UpdateQGlobal(uint32 qid, QGlobal newGlobal); void weatherSend(Client *client = nullptr); @@ -285,6 +300,8 @@ public: ZonePoint *GetClosestZonePointWithoutZone(float x, float y, float z, Client *client, float max_distance = 40000.0f); Timer GetInitgridsTimer(); + uint32 GetInstanceTimeRemaining() const; + void SetInstanceTimeRemaining(uint32 instance_time_remaining); /** * GMSay Callback for LogSys @@ -333,12 +350,12 @@ public: double GetMaxMovementUpdateRange() const { return max_movement_update_range; } - /** * Modding hooks */ void mod_init(); void mod_repop(); + void SetIsHotzone(bool is_hotzone); private: bool allow_mercs; @@ -359,7 +376,7 @@ private: char *map_name; char *short_name; char file_name[16]; - glm::vec3 m_SafePoint; + glm::vec4 m_SafePoint; glm::vec4 m_Graveyard; int default_ruleset; int zone_total_blocked_spells; @@ -368,6 +385,7 @@ private: uint8 zone_type; uint16 instanceversion; uint32 instanceid; + uint32 instance_time_remaining; uint32 pgraveyard_id, pgraveyard_zoneid; uint32 pMaxClients; uint32 zoneid; @@ -383,7 +401,6 @@ private: Timer *Weather_Timer; Timer autoshutdown_timer; Timer clientauth_timer; - Timer hotzone_timer; Timer initgrids_timer; Timer qglobal_purge_timer; ZoneSpellsBlocked *blocked_spells; @@ -391,4 +408,3 @@ private: }; #endif - diff --git a/zone/zone_event_scheduler.cpp b/zone/zone_event_scheduler.cpp new file mode 100644 index 000000000..4bdb2cd6f --- /dev/null +++ b/zone/zone_event_scheduler.cpp @@ -0,0 +1,160 @@ +#include "zone_event_scheduler.h" +#include "../common/rulesys.h" +#include + +void ZoneEventScheduler::Process(Zone *zone, WorldContentService *content_service) +{ + std::time_t time = std::time(nullptr); + std::tm *now = std::localtime(&time); + + // once a minute polling + if (m_last_polled_minute != now->tm_min) { + int month = (now->tm_mon + 1); + int year = (now->tm_year + 1900); + + LogSchedulerDetail( + "Polling year [{}] month [{}] day [{}] hour [{}] minute [{}]", + year, + month, + now->tm_mday, + now->tm_hour, + now->tm_min + ); + + // because stored active events could have a reference of time that has been changed since + // the time has been updated, we need to make sure we update internal fields so that + // the scheduler can properly end events if we set a new end date + SyncEventDataWithActiveEvents(); + + // active events + for (auto &e: m_active_events) { + LogSchedulerDetail("Looping active event [{}]", e.description); + + // if event becomes no longer active + if (!ValidateEventReadyToActivate(e)) { + LogSchedulerDetail("Looping active event validated [{}]", e.event_type); + if (e.event_type == ServerEvents::EVENT_TYPE_HOT_ZONE_ACTIVE) { + LogScheduler("Deactivating event [{}] disabling hotzone status", e.description); + if (search_deliminated_string(e.event_data, zone->GetShortName()) != std::string::npos) { + zone->SetIsHotzone(false); + } + RemoveActiveEvent(e); + } + + if (e.event_type == ServerEvents::EVENT_TYPE_RULE_CHANGE) { + LogScheduler("Deactivating event [{}] resetting rules to normal", e.description); + RuleManager::Instance()->LoadRules(m_database, RuleManager::Instance()->GetActiveRuleset(), true); + + // force active events clear and reapply all active events because we reset the entire state + // ideally if we could revert only the state of which was originally set we would only remove one active event + m_active_events.clear(); + } + + if (e.event_type == ServerEvents::EVENT_TYPE_CONTENT_FLAG_CHANGE) { + auto flag_name = e.event_data; + if (!flag_name.empty()) { + LogScheduler("Deactivating event [{}] resetting content flags", e.description); + content_service->ReloadContentFlags(*m_database); + } + + // force active events clear and reapply all active events because we reset the entire state + // ideally if we could revert only the state of which was originally set we would only remove one active event + m_active_events.clear(); + } + } + } + + // check for active + for (auto &e: m_events) { + + // discard uninteresting events as its less work to calculate time on events we don't care about + // different processes are interested in different events + if ( + e.event_type != ServerEvents::EVENT_TYPE_HOT_ZONE_ACTIVE && + e.event_type != ServerEvents::EVENT_TYPE_CONTENT_FLAG_CHANGE && + e.event_type != ServerEvents::EVENT_TYPE_RULE_CHANGE + ) { + continue; + } + + // the scheduler as of today manipulates events in memory and is preferred to be that way + // the scheduler changes temporary "state" in the server for a period of time for things such as + // hotzone activation, content flag activation, rule value activation + // when these events expire, the events become untoggled in memory + // there can be support for one-time events that are more suitable to run from worlds scheduler + // such as broadcasts, reloads + if (ValidateEventReadyToActivate(e) && !IsEventActive(e)) { + if (e.event_type == ServerEvents::EVENT_TYPE_HOT_ZONE_ACTIVE) { + if (search_deliminated_string(e.event_data, zone->GetShortName()) != std::string::npos) { + zone->SetIsHotzone(true); + LogScheduler("Activating Event [{}] Enabling zone as hotzone", e.description); + } + m_active_events.push_back(e); + } + + if (e.event_type == ServerEvents::EVENT_TYPE_RULE_CHANGE) { + auto params = SplitString(e.event_data, '='); + auto rule_key = params[0]; + auto rule_value = params[1]; + if (!rule_key.empty() && !rule_value.empty()) { + LogScheduler( + "Activating Event [{}] scheduled rule change, setting rule [{}] to [{}]", + e.description, + rule_key, + rule_value + ); + RuleManager::Instance()->SetRule(rule_key.c_str(), rule_value.c_str(), nullptr, false, true); + } + m_active_events.push_back(e); + } + + if (e.event_type == ServerEvents::EVENT_TYPE_CONTENT_FLAG_CHANGE) { + auto flag_name = e.event_data; + if (!flag_name.empty()) { + LogScheduler( + "Activating Event [{}] scheduled content flag change, setting flag [{}] to enabled", + e.description, + flag_name + ); + + auto flags = content_service->GetContentFlags(); + flags.push_back(flag_name); + content_service->SetContentFlags(flags); + m_active_events.push_back(e); + } + } + } + } + + m_last_polled_minute = now->tm_min; + } +} + +// because stored active events could have a reference of time that has been changed since +// the time has been updated, we need to make sure we update internal fields so that +// the scheduler can properly end events if we set a new end date +void ZoneEventScheduler::SyncEventDataWithActiveEvents() +{ + for (auto &a: m_active_events) { + for (auto &e: m_events) { + if (e.id == a.id) { + a.description = e.description; + a.event_type = e.event_type; + a.event_data = e.event_data; + a.minute_start = e.minute_start; + a.hour_start = e.hour_start; + a.day_start = e.day_start; + a.month_start = e.month_start; + a.year_start = e.year_start; + a.minute_end = e.minute_end; + a.hour_end = e.hour_end; + a.day_end = e.day_end; + a.month_end = e.month_end; + a.year_end = e.year_end; + a.cron_expression = e.cron_expression; + a.created_at = e.created_at; + a.deleted_at = e.deleted_at; + } + } + } +} diff --git a/zone/zone_event_scheduler.h b/zone/zone_event_scheduler.h new file mode 100644 index 000000000..a2e6c67ad --- /dev/null +++ b/zone/zone_event_scheduler.h @@ -0,0 +1,14 @@ +#ifndef EQEMU_ZONE_EVENT_SCHEDULER_H +#define EQEMU_ZONE_EVENT_SCHEDULER_H + +#include "../common/server_event_scheduler.h" +#include "zone.h" +#include "../common/content/world_content_service.h" + +class ZoneEventScheduler : public ServerEventScheduler { +public: + void Process(Zone *zone, WorldContentService *content_service); + void SyncEventDataWithActiveEvents(); +}; + +#endif //EQEMU_ZONE_EVENT_SCHEDULER_H diff --git a/zone/zone_store.cpp b/zone/zone_store.cpp new file mode 100644 index 000000000..467c3af25 --- /dev/null +++ b/zone/zone_store.cpp @@ -0,0 +1,180 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "zone_store.h" +#include "../common/repositories/content_flags_repository.h" +#include "../common/content/world_content_service.h" + +ZoneStore::ZoneStore() = default; +ZoneStore::~ZoneStore() = default; + +void ZoneStore::LoadZones() +{ + zones = ZoneRepository::All(content_db); +} + +/** + * @param in_zone_name + * @return + */ +uint32 ZoneStore::GetZoneID(const char *in_zone_name) +{ + if (in_zone_name == nullptr) { + return 0; + } + + std::string zone_name = str_tolower(in_zone_name); + + return GetZoneID(zone_name); +} + +/** + * @param zone_name + * @return + */ +uint32 ZoneStore::GetZoneID(std::string zone_name) +{ + for (auto &z: zones) { + if (z.short_name == zone_name) { + return z.zoneidnumber; + } + } + + return 0; +} + +/** + * @param zone_id + * @param error_unknown + * @return + */ +const char *ZoneStore::GetZoneName(uint32 zone_id, bool error_unknown) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.short_name.c_str(); + } + } + + if (error_unknown) { + return "UNKNOWN"; + } + + return nullptr; +} + +/** + * @param zone_id + * @return + */ +std::string ZoneStore::GetZoneName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.short_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @return + */ +std::string ZoneStore::GetZoneLongName(uint32 zone_id) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id) { + return z.long_name; + } + } + + return std::string(); +} + +/** + * @param zone_id + * @param version + * @return + */ +ZoneRepository::Zone ZoneStore::GetZone(uint32 zone_id, int version) +{ + for (auto &z: zones) { + if (z.zoneidnumber == zone_id && z.version == version) { + return z; + } + } + + return ZoneRepository::Zone(); +} + +/** + * @param in_zone_name + * @return + */ +ZoneRepository::Zone ZoneStore::GetZone(const char *in_zone_name) +{ + for (auto &z: zones) { + if (z.short_name == in_zone_name) { + return z; + } + } + + return ZoneRepository::Zone(); +} + +/** + * @return + */ +void ZoneStore::LoadContentFlags() +{ + content_service.ReloadContentFlags(database); +} + +/** + * Sets the value in the database and proceeds to load content flags into the server context again + * + * @param content_flag_name + * @param enabled + */ +void ZoneStore::SetContentFlag(const std::string &content_flag_name, bool enabled) +{ + auto content_flags = ContentFlagsRepository::GetWhere(database, + fmt::format("flag_name = '{}'", content_flag_name) + ); + + auto content_flag = ContentFlagsRepository::NewEntity(); + if (!content_flags.empty()) { + content_flag = content_flags.front(); + } + + content_flag.enabled = enabled ? 1 : 0; + content_flag.flag_name = content_flag_name; + + if (!content_flags.empty()) { + ContentFlagsRepository::UpdateOne(database, content_flag); + } + else { + ContentFlagsRepository::InsertOne(database, content_flag); + } + + LoadContentFlags(); +} diff --git a/zone/zone_store.h b/zone/zone_store.h new file mode 100644 index 000000000..8513c51fa --- /dev/null +++ b/zone/zone_store.h @@ -0,0 +1,67 @@ +/** + * EQEmulator: Everquest Server Emulator + * Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY except by those people which sell it, which + * are required to give you total support for your newly bought product; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef EQEMU_ZONE_STORE_H +#define EQEMU_ZONE_STORE_H + +#include "zonedb.h" +#include "../common/repositories/zone_repository.h" +#include "../common/repositories/base/base_content_flags_repository.h" + +class ZoneStore { +public: + ZoneStore(); + virtual ~ZoneStore(); + + std::vector zones; + + void LoadZones(); + + ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0); + ZoneRepository::Zone GetZone(const char *in_zone_name); + uint32 GetZoneID(const char *in_zone_name); + uint32 GetZoneID(std::string zone_name); + std::string GetZoneName(uint32 zone_id); + std::string GetZoneLongName(uint32 zone_id); + const char *GetZoneName(uint32 zone_id, bool error_unknown = false); + + static void LoadContentFlags(); + static void SetContentFlag(const std::string& content_flag_name, bool enabled); +}; + +extern ZoneStore zone_store; + +/** + * Global helpers + */ +inline uint32 ZoneID(const char *in_zone_name) { return zone_store.GetZoneID(in_zone_name); } +inline uint32 ZoneID(std::string zone_name) { return zone_store.GetZoneID(zone_name); } +inline const char *ZoneName(uint32 zone_id, bool error_unknown = false) +{ + return zone_store.GetZoneName( + zone_id, + error_unknown + ); +} +inline const char *ZoneLongName(uint32 zone_id) { return zone_store.GetZoneLongName(zone_id).c_str(); } +inline ZoneRepository::Zone GetZone(uint32 zone_id, int version = 0) { return zone_store.GetZone(zone_id, version); }; +inline ZoneRepository::Zone GetZone(const char *in_zone_name) { return zone_store.GetZone(in_zone_name); }; + +#endif //EQEMU_ZONE_STORE_H diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index b68fe2284..327e43058 100755 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -11,7 +11,9 @@ #include "merc.h" #include "zone.h" #include "zonedb.h" +#include "zone_store.h" #include "aura.h" +#include "../common/repositories/criteria/content_filter_criteria.h" #include #include @@ -83,19 +85,19 @@ bool ZoneDatabase::SaveZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct } bool ZoneDatabase::GetZoneCFG( - uint32 zoneid, - uint16 instance_id, - NewZone_Struct *zone_data, - bool &can_bind, - bool &can_combat, - bool &can_levitate, - bool &can_castoutdoor, - bool &is_city, - bool &is_hotzone, - bool &allow_mercs, + uint32 zoneid, + uint16 instance_id, + NewZone_Struct *zone_data, + bool &can_bind, + bool &can_combat, + bool &can_levitate, + bool &can_castoutdoor, + bool &is_city, + bool &is_hotzone, + bool &allow_mercs, double &max_movement_update_range, - uint8 &zone_type, - int &ruleset, + uint8 &zone_type, + int &ruleset, char **map_filename) { *map_filename = new char[100]; @@ -103,70 +105,74 @@ bool ZoneDatabase::GetZoneCFG( std::string query = StringFormat( "SELECT " - "ztype, " // 0 - "fog_red, " // 1 - "fog_green, " // 2 - "fog_blue, " // 3 - "fog_minclip, " // 4 - "fog_maxclip, " // 5 - "fog_red2, " // 6 - "fog_green2, " // 7 - "fog_blue2, " // 8 - "fog_minclip2, " // 9 - "fog_maxclip2, " // 10 - "fog_red3, " // 11 - "fog_green3, " // 12 - "fog_blue3, " // 13 - "fog_minclip3, " // 14 - "fog_maxclip3, " // 15 - "fog_red4, " // 16 - "fog_green4, " // 17 - "fog_blue4, " // 18 - "fog_minclip4, " // 19 - "fog_maxclip4, " // 20 - "fog_density, " // 21 - "sky, " // 22 - "zone_exp_multiplier, " // 23 - "safe_x, " // 24 - "safe_y, " // 25 - "safe_z, " // 26 - "underworld, " // 27 - "minclip, " // 28 - "maxclip, " // 29 - "time_type, " // 30 - "canbind, " // 31 - "cancombat, " // 32 - "canlevitate, " // 33 - "castoutdoor, " // 34 - "hotzone, " // 35 - "ruleset, " // 36 - "suspendbuffs, " // 37 - "map_file_name, " // 38 - "short_name, " // 39 - "rain_chance1, " // 40 - "rain_chance2, " // 41 - "rain_chance3, " // 42 - "rain_chance4, " // 43 - "rain_duration1, " // 44 - "rain_duration2, " // 45 - "rain_duration3, " // 46 - "rain_duration4, " // 47 - "snow_chance1, " // 48 - "snow_chance2, " // 49 - "snow_chance3, " // 50 - "snow_chance4, " // 51 - "snow_duration1, " // 52 - "snow_duration2, " // 53 - "snow_duration3, " // 54 - "snow_duration4, " // 55 - "gravity, " // 56 - "fast_regen_hp, " // 57 - "fast_regen_mana, " // 58 - "fast_regen_endurance, " // 59 - "npc_max_aggro_dist, " // 60 - "max_movement_update_range " // 61 - "FROM zone WHERE zoneidnumber = %i AND version = %i", - zoneid, instance_id); + "ztype, " // 0 + "fog_red, " // 1 + "fog_green, " // 2 + "fog_blue, " // 3 + "fog_minclip, " // 4 + "fog_maxclip, " // 5 + "fog_red2, " // 6 + "fog_green2, " // 7 + "fog_blue2, " // 8 + "fog_minclip2, " // 9 + "fog_maxclip2, " // 10 + "fog_red3, " // 11 + "fog_green3, " // 12 + "fog_blue3, " // 13 + "fog_minclip3, " // 14 + "fog_maxclip3, " // 15 + "fog_red4, " // 16 + "fog_green4, " // 17 + "fog_blue4, " // 18 + "fog_minclip4, " // 19 + "fog_maxclip4, " // 20 + "fog_density, " // 21 + "sky, " // 22 + "zone_exp_multiplier, " // 23 + "safe_x, " // 24 + "safe_y, " // 25 + "safe_z, " // 26 + "underworld, " // 27 + "minclip, " // 28 + "maxclip, " // 29 + "time_type, " // 30 + "canbind, " // 31 + "cancombat, " // 32 + "canlevitate, " // 33 + "castoutdoor, " // 34 + "hotzone, " // 35 + "ruleset, " // 36 + "suspendbuffs, " // 37 + "map_file_name, " // 38 + "short_name, " // 39 + "rain_chance1, " // 40 + "rain_chance2, " // 41 + "rain_chance3, " // 42 + "rain_chance4, " // 43 + "rain_duration1, " // 44 + "rain_duration2, " // 45 + "rain_duration3, " // 46 + "rain_duration4, " // 47 + "snow_chance1, " // 48 + "snow_chance2, " // 49 + "snow_chance3, " // 50 + "snow_chance4, " // 51 + "snow_duration1, " // 52 + "snow_duration2, " // 53 + "snow_duration3, " // 54 + "snow_duration4, " // 55 + "gravity, " // 56 + "fast_regen_hp, " // 57 + "fast_regen_mana, " // 58 + "fast_regen_endurance, " // 59 + "npc_max_aggro_dist, " // 60 + "max_movement_update_range, " // 61 + "underworld_teleport_index " // 62 + "FROM zone WHERE zoneidnumber = %i AND version = %i %s", + zoneid, + instance_id, + ContentFilterCriteria::apply().c_str() + ); auto results = QueryDatabase(query); if (!results.Success()) { strcpy(*map_filename, "default"); @@ -213,6 +219,7 @@ bool ZoneDatabase::GetZoneCFG( zone_data->FastRegenMana = atoi(row[58]); zone_data->FastRegenEndurance = atoi(row[59]); zone_data->NPCAggroMaxDist = atoi(row[60]); + zone_data->underworld_teleport_index = atoi(row[62]); int bindable = 0; bindable = atoi(row[31]); @@ -361,7 +368,7 @@ void ZoneDatabase::RegisterBug(BugReport_Struct* bug_report) { char* type_ = nullptr; char* target_ = nullptr; char* bug_ = nullptr; - + len = strlen(bug_report->reporter_name); if (len) { if (len > 63) // check against db column size @@ -427,7 +434,7 @@ void ZoneDatabase::RegisterBug(BugReport_Struct* bug_report) { safe_delete_array(type_); safe_delete_array(target_); safe_delete_array(bug_); - + QueryDatabase(query); } @@ -554,7 +561,7 @@ void ZoneDatabase::RegisterBug(Client* client, BugReport_Struct* bug_report) { " '%s')", zone->GetShortName(), client->ClientVersion(), - EQEmu::versions::ClientVersionName(client->ClientVersion()), + EQ::versions::ClientVersionName(client->ClientVersion()), client->AccountID(), client->CharacterID(), client->GetName(), @@ -571,11 +578,11 @@ void ZoneDatabase::RegisterBug(Client* client, BugReport_Struct* bug_report) { bug_report->target_id, (target_name_ ? target_name_ : ""), bug_report->optional_info_mask, - ((bug_report->optional_info_mask & EQEmu::bug::infoCanDuplicate) != 0 ? 1 : 0), - ((bug_report->optional_info_mask & EQEmu::bug::infoCrashBug) != 0 ? 1 : 0), - ((bug_report->optional_info_mask & EQEmu::bug::infoTargetInfo) != 0 ? 1 : 0), - ((bug_report->optional_info_mask & EQEmu::bug::infoCharacterFlags) != 0 ? 1 : 0), - ((bug_report->optional_info_mask & EQEmu::bug::infoUnknownValue) != 0 ? 1 : 0), + ((bug_report->optional_info_mask & EQ::bug::infoCanDuplicate) != 0 ? 1 : 0), + ((bug_report->optional_info_mask & EQ::bug::infoCrashBug) != 0 ? 1 : 0), + ((bug_report->optional_info_mask & EQ::bug::infoTargetInfo) != 0 ? 1 : 0), + ((bug_report->optional_info_mask & EQ::bug::infoCharacterFlags) != 0 ? 1 : 0), + ((bug_report->optional_info_mask & EQ::bug::infoUnknownValue) != 0 ? 1 : 0), (bug_report_ ? bug_report_ : ""), (system_info_ ? system_info_ : "") ); @@ -585,7 +592,7 @@ void ZoneDatabase::RegisterBug(Client* client, BugReport_Struct* bug_report) { safe_delete_array(target_name_); safe_delete_array(bug_report_); safe_delete_array(system_info_); - + auto result = QueryDatabase(query); // TODO: Entity dumping [RuleB(Bugs, DumpTargetEntity)] @@ -632,55 +639,8 @@ void ZoneDatabase::SetDoorPlace(uint8 value,uint8 door_id,const char* zone_name) door_isopen_array[door_id] = value; } -void ZoneDatabase::GetEventLogs(const char* name,char* target,uint32 account_id,uint8 eventid,char* detail,char* timestamp, CharacterEventLog_Struct* cel) -{ - char modifications[200]; - if(strlen(name) != 0) - sprintf(modifications,"charname=\'%s\'",name); - else if(account_id != 0) - sprintf(modifications,"accountid=%i",account_id); - - if(strlen(target) != 0) - sprintf(modifications,"%s AND target LIKE \'%%%s%%\'",modifications,target); - - if(strlen(detail) != 0) - sprintf(modifications,"%s AND description LIKE \'%%%s%%\'",modifications,detail); - - if(strlen(timestamp) != 0) - sprintf(modifications,"%s AND time LIKE \'%%%s%%\'",modifications,timestamp); - - if(eventid == 0) - eventid =1; - sprintf(modifications,"%s AND event_nid=%i",modifications,eventid); - - std::string query = StringFormat("SELECT id, accountname, accountid, status, charname, target, " - "time, descriptiontype, description FROM eventlog WHERE %s", modifications); - auto results = QueryDatabase(query); - if (!results.Success()) - return; - - int index = 0; - for (auto row = results.begin(); row != results.end(); ++row, ++index) { - if(index == 255) - break; - - cel->eld[index].id = atoi(row[0]); - strn0cpy(cel->eld[index].accountname,row[1],64); - cel->eld[index].account_id = atoi(row[2]); - cel->eld[index].status = atoi(row[3]); - strn0cpy(cel->eld[index].charactername,row[4],64); - strn0cpy(cel->eld[index].targetname,row[5],64); - sprintf(cel->eld[index].timestamp,"%s",row[6]); - strn0cpy(cel->eld[index].descriptiontype,row[7],64); - strn0cpy(cel->eld[index].details,row[8],128); - cel->eventid = eventid; - cel->count = index + 1; - } - -} - // Load child objects for a world container (i.e., forge, bag dropped to ground, etc) -void ZoneDatabase::LoadWorldContainer(uint32 parentid, EQEmu::ItemInstance* container) +void ZoneDatabase::LoadWorldContainer(uint32 parentid, EQ::ItemInstance* container) { if (!container) { LogError("Programming error: LoadWorldContainer passed nullptr pointer"); @@ -702,7 +662,7 @@ void ZoneDatabase::LoadWorldContainer(uint32 parentid, EQEmu::ItemInstance* cont uint8 index = (uint8)atoi(row[0]); uint32 item_id = (uint32)atoi(row[1]); int8 charges = (int8)atoi(row[2]); - uint32 aug[EQEmu::invaug::SOCKET_COUNT]; + uint32 aug[EQ::invaug::SOCKET_COUNT]; aug[0] = (uint32)atoi(row[3]); aug[1] = (uint32)atoi(row[4]); aug[2] = (uint32)atoi(row[5]); @@ -710,9 +670,9 @@ void ZoneDatabase::LoadWorldContainer(uint32 parentid, EQEmu::ItemInstance* cont aug[4] = (uint32)atoi(row[7]); aug[5] = (uint32)atoi(row[8]); - EQEmu::ItemInstance* inst = database.CreateItem(item_id, charges); + EQ::ItemInstance* inst = database.CreateItem(item_id, charges); if (inst && inst->GetItem()->IsClassCommon()) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) if (aug[i]) inst->PutAugment(&database, i, aug[i]); // Put item inside world container @@ -724,7 +684,7 @@ void ZoneDatabase::LoadWorldContainer(uint32 parentid, EQEmu::ItemInstance* cont } // Save child objects for a world container (i.e., forge, bag dropped to ground, etc) -void ZoneDatabase::SaveWorldContainer(uint32 zone_id, uint32 parent_id, const EQEmu::ItemInstance* container) +void ZoneDatabase::SaveWorldContainer(uint32 zone_id, uint32 parent_id, const EQ::ItemInstance* container) { // Since state is not saved for each world container action, we'll just delete // all and save from scratch .. we may come back later to optimize @@ -735,43 +695,53 @@ void ZoneDatabase::SaveWorldContainer(uint32 zone_id, uint32 parent_id, const EQ DeleteWorldContainer(parent_id,zone_id); // Save all 10 items, if they exist - for (uint8 index = EQEmu::invbag::SLOT_BEGIN; index <= EQEmu::invbag::SLOT_END; index++) { + for (uint8 index = EQ::invbag::SLOT_BEGIN; index <= EQ::invbag::SLOT_END; index++) { - EQEmu::ItemInstance* inst = container->GetItem(index); + EQ::ItemInstance* inst = container->GetItem(index); if (!inst) continue; uint32 item_id = inst->GetItem()->ID; - uint32 augslot[EQEmu::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; + uint32 augslot[EQ::invaug::SOCKET_COUNT] = { 0, 0, 0, 0, 0, 0 }; - if (inst->IsType(EQEmu::item::ItemClassCommon)) { - for (int i = EQEmu::invaug::SOCKET_BEGIN; i <= EQEmu::invaug::SOCKET_END; i++) { - EQEmu::ItemInstance *auginst=inst->GetAugment(i); + if (inst->IsType(EQ::item::ItemClassCommon)) { + for (int i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) { + EQ::ItemInstance *auginst=inst->GetAugment(i); augslot[i]=(auginst && auginst->GetItem()) ? auginst->GetItem()->ID : 0; } } - std::string query = StringFormat("REPLACE INTO object_contents " - "(zoneid, parentid, bagidx, itemid, charges, " - "augslot1, augslot2, augslot3, augslot4, augslot5, augslot6, droptime) " - "VALUES (%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, now())", - zone_id, parent_id, index, item_id, inst->GetCharges(), - augslot[0], augslot[1], augslot[2], augslot[3], augslot[4], augslot[5]); - auto results = QueryDatabase(query); - if (!results.Success()) - LogError("Error in ZoneDatabase::SaveWorldContainer: [{}]", results.ErrorMessage().c_str()); + std::string query = StringFormat( + "REPLACE INTO object_contents " + "(zoneid, parentid, bagidx, itemid, charges, " + "augslot1, augslot2, augslot3, augslot4, augslot5, augslot6, droptime) " + "VALUES (%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, now())", + zone_id, parent_id, index, item_id, inst->GetCharges(), + augslot[0], augslot[1], augslot[2], augslot[3], augslot[4], augslot[5] + ); - } + auto results = database.QueryDatabase(query); + if (!results.Success()) { + LogError("Error in ZoneDatabase::SaveWorldContainer: [{}]", results.ErrorMessage().c_str()); + } + + } } // Remove all child objects inside a world container (i.e., forge, bag dropped to ground, etc) void ZoneDatabase::DeleteWorldContainer(uint32 parent_id, uint32 zone_id) { - std::string query = StringFormat("DELETE FROM object_contents WHERE parentid = %i AND zoneid = %i", parent_id, zone_id); - auto results = QueryDatabase(query); - if (!results.Success()) + std::string query = StringFormat( + "DELETE FROM object_contents WHERE parentid = %i AND zoneid = %i", + parent_id, + zone_id + ); + + auto results = database.QueryDatabase(query); + if (!results.Success()) { LogError("Error in ZoneDatabase::DeleteWorldContainer: [{}]", results.ErrorMessage().c_str()); + } } @@ -826,7 +796,7 @@ TraderCharges_Struct* ZoneDatabase::LoadTraderItemWithCharges(uint32 char_id) return loadti; } -EQEmu::ItemInstance* ZoneDatabase::LoadSingleTraderItem(uint32 CharID, int SerialNumber) { +EQ::ItemInstance* ZoneDatabase::LoadSingleTraderItem(uint32 CharID, int SerialNumber) { std::string query = StringFormat("SELECT * FROM trader WHERE char_id = %i AND serialnumber = %i " "ORDER BY slot_id LIMIT 80", CharID, SerialNumber); auto results = QueryDatabase(query); @@ -844,7 +814,7 @@ EQEmu::ItemInstance* ZoneDatabase::LoadSingleTraderItem(uint32 CharID, int Seria int Charges = atoi(row[3]); int Cost = atoi(row[4]); - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item) { LogTrading("Unable to create item\n"); @@ -855,7 +825,7 @@ EQEmu::ItemInstance* ZoneDatabase::LoadSingleTraderItem(uint32 CharID, int Seria if (item->NoDrop == 0) return nullptr; - EQEmu::ItemInstance* inst = database.CreateItem(item); + EQ::ItemInstance* inst = database.CreateItem(item); if(!inst) { LogTrading("Unable to create item instance\n"); fflush(stdout); @@ -898,7 +868,7 @@ void ZoneDatabase::UpdateTraderItemPrice(int CharID, uint32 ItemID, uint32 Charg LogTrading("ZoneDatabase::UpdateTraderPrice([{}], [{}], [{}], [{}])", CharID, ItemID, Charges, NewPrice); - const EQEmu::ItemData *item = database.GetItem(ItemID); + const EQ::ItemData *item = database.GetItem(ItemID); if(!item) return; @@ -1223,12 +1193,12 @@ bool ZoneDatabase::LoadCharacterMemmedSpells(uint32 character_id, PlayerProfile_ auto results = database.QueryDatabase(query); int i = 0; /* Initialize Spells */ - for (i = 0; i < EQEmu::spells::SPELL_GEM_COUNT; i++){ + for (i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++){ pp->mem_spells[i] = 0xFFFFFFFF; } for (auto row = results.begin(); row != results.end(); ++row) { i = atoi(row[0]); - if (i < EQEmu::spells::SPELL_GEM_COUNT && atoi(row[1]) <= SPDAT_RECORDS){ + if (i < EQ::spells::SPELL_GEM_COUNT && atoi(row[1]) <= SPDAT_RECORDS){ pp->mem_spells[i] = atoi(row[1]); } } @@ -1244,10 +1214,10 @@ bool ZoneDatabase::LoadCharacterSpellBook(uint32 character_id, PlayerProfile_Str "`character_spells` " "WHERE `id` = %u ORDER BY `slot_id`", character_id); auto results = database.QueryDatabase(query); - + /* Initialize Spells */ - - memset(pp->spell_book, 0xFF, (sizeof(uint32) * EQEmu::spells::SPELLBOOK_SIZE)); + + memset(pp->spell_book, 0xFF, (sizeof(uint32) * EQ::spells::SPELLBOOK_SIZE)); // We have the ability to block loaded spells by max id on a per-client basis.. // but, we do not have to ability to keep players from using older clients after @@ -1258,11 +1228,11 @@ bool ZoneDatabase::LoadCharacterSpellBook(uint32 character_id, PlayerProfile_Str int idx = atoi(row[0]); int id = atoi(row[1]); - if (idx < 0 || idx >= EQEmu::spells::SPELLBOOK_SIZE) + if (idx < 0 || idx >= EQ::spells::SPELLBOOK_SIZE) continue; if (id < 3 || id > SPDAT_RECORDS) // 3 ("Summon Corpse") is the first scribable spell in spells_us.txt continue; - + pp->spell_book[idx] = id; } @@ -1406,11 +1376,11 @@ bool ZoneDatabase::LoadCharacterMaterialColor(uint32 character_id, PlayerProfile bool ZoneDatabase::LoadCharacterBandolier(uint32 character_id, PlayerProfile_Struct* pp) { std::string query = StringFormat("SELECT `bandolier_id`, `bandolier_slot`, `item_id`, `icon`, `bandolier_name` FROM `character_bandolier` WHERE `id` = %u LIMIT %u", - character_id, EQEmu::profile::BANDOLIERS_SIZE); + character_id, EQ::profile::BANDOLIERS_SIZE); auto results = database.QueryDatabase(query); int i = 0; int r = 0; int si = 0; - for (i = 0; i < EQEmu::profile::BANDOLIERS_SIZE; i++) { + for (i = 0; i < EQ::profile::BANDOLIERS_SIZE; i++) { pp->bandoliers[i].Name[0] = '\0'; - for (int si = 0; si < EQEmu::profile::BANDOLIER_ITEM_COUNT; si++) { + for (int si = 0; si < EQ::profile::BANDOLIER_ITEM_COUNT; si++) { pp->bandoliers[i].Items[si].ID = 0; pp->bandoliers[i].Items[si].Icon = 0; pp->bandoliers[i].Items[si].Name[0] = '\0'; @@ -1422,7 +1392,7 @@ bool ZoneDatabase::LoadCharacterBandolier(uint32 character_id, PlayerProfile_Str i = atoi(row[r]); /* Bandolier ID */ r++; si = atoi(row[r]); /* Bandolier Slot */ r++; - const EQEmu::ItemData* item_data = database.GetItem(atoi(row[r])); + const EQ::ItemData* item_data = database.GetItem(atoi(row[r])); if (item_data) { pp->bandoliers[i].Items[si].ID = item_data->ID; r++; pp->bandoliers[i].Items[si].Icon = atoi(row[r]); r++; // Must use db value in case an Ornamentation is assigned @@ -1444,7 +1414,7 @@ bool ZoneDatabase::LoadCharacterTribute(uint32 character_id, PlayerProfile_Struc std::string query = StringFormat("SELECT `tier`, `tribute` FROM `character_tribute` WHERE `id` = %u", character_id); auto results = database.QueryDatabase(query); int i = 0; - for (i = 0; i < EQEmu::invtype::TRIBUTE_SIZE; i++){ + for (i = 0; i < EQ::invtype::TRIBUTE_SIZE; i++){ pp->tributes[i].tribute = 0xFFFFFFFF; pp->tributes[i].tier = 0; } @@ -1463,10 +1433,10 @@ bool ZoneDatabase::LoadCharacterPotions(uint32 character_id, PlayerProfile_Struc { std::string query = StringFormat("SELECT `potion_id`, `item_id`, `icon` FROM `character_potionbelt` WHERE `id` = %u LIMIT %u", - character_id, EQEmu::profile::POTION_BELT_SIZE); + character_id, EQ::profile::POTION_BELT_SIZE); auto results = database.QueryDatabase(query); int i = 0; - for (i = 0; i < EQEmu::profile::POTION_BELT_SIZE; i++) { + for (i = 0; i < EQ::profile::POTION_BELT_SIZE; i++) { pp->potionbelt.Items[i].Icon = 0; pp->potionbelt.Items[i].ID = 0; pp->potionbelt.Items[i].Name[0] = '\0'; @@ -1474,7 +1444,7 @@ bool ZoneDatabase::LoadCharacterPotions(uint32 character_id, PlayerProfile_Struc for (auto row = results.begin(); row != results.end(); ++row) { i = atoi(row[0]); - const EQEmu::ItemData *item_data = database.GetItem(atoi(row[1])); + const EQ::ItemData *item_data = database.GetItem(atoi(row[1])); if (!item_data) continue; pp->potionbelt.Items[i].ID = item_data->ID; @@ -1500,7 +1470,7 @@ bool ZoneDatabase::LoadCharacterBindPoint(uint32 character_id, PlayerProfile_Str if (index < 0 || index > 4) continue; - pp->binds[index].zoneId = atoi(row[1]); + pp->binds[index].zone_id = atoi(row[1]); pp->binds[index].instance_id = atoi(row[2]); pp->binds[index].x = atoi(row[3]); pp->binds[index].y = atoi(row[4]); @@ -1523,10 +1493,10 @@ bool ZoneDatabase::SaveCharacterBindPoint(uint32 character_id, const BindStruct std::string query = StringFormat("REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot) VALUES (%u, " "%u, %u, %f, %f, %f, %f, %i)", - character_id, bind.zoneId, bind.instance_id, bind.x, bind.y, bind.z, bind.heading, bind_num); + character_id, bind.zone_id, bind.instance_id, bind.x, bind.y, bind.z, bind.heading, bind_num); LogDebug("ZoneDatabase::SaveCharacterBindPoint for character ID: [{}] zone_id: [{}] instance_id: [{}] position: [{}] [{}] [{}] [{}] bind_num: [{}]", - character_id, bind.zoneId, bind.instance_id, bind.x, bind.y, bind.z, bind.heading, bind_num); + character_id, bind.zone_id, bind.instance_id, bind.x, bind.y, bind.z, bind.heading, bind_num); auto results = QueryDatabase(query); if (!results.RowsAffected()) @@ -1563,7 +1533,7 @@ bool ZoneDatabase::SaveCharacterTribute(uint32 character_id, PlayerProfile_Struc std::string query = StringFormat("DELETE FROM `character_tribute` WHERE `id` = %u", character_id); QueryDatabase(query); /* Save Tributes only if we have values... */ - for (int i = 0; i < EQEmu::invtype::TRIBUTE_SIZE; i++){ + for (int i = 0; i < EQ::invtype::TRIBUTE_SIZE; i++){ if (pp->tributes[i].tribute >= 0 && pp->tributes[i].tribute != TRIBUTE_NONE){ std::string query = StringFormat("REPLACE INTO `character_tribute` (id, tier, tribute) VALUES (%u, %u, %u)", character_id, pp->tributes[i].tier, pp->tributes[i].tribute); QueryDatabase(query); @@ -1606,11 +1576,11 @@ bool ZoneDatabase::SaveCharacterLeadershipAA(uint32 character_id, PlayerProfile_ } bool ZoneDatabase::SaveCharacterData(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp, ExtendedProfile_Struct* m_epp){ - + /* If this is ever zero - the client hasn't fully loaded and potentially crashed during zone */ if (account_id <= 0) return false; - + std::string mail_key = database.GetMailKey(character_id); clock_t t = std::clock(); /* Function timer start */ @@ -2508,7 +2478,8 @@ const NPCType *ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load "npc_types.stuck_behavior, " "npc_types.model, " "npc_types.flymode, " - "npc_types.always_aggro " + "npc_types.always_aggro, " + "npc_types.exp_mod " "FROM npc_types %s", where_condition.c_str() ); @@ -2642,7 +2613,7 @@ const NPCType *ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load else { auto armorTint_row = armortint_results.begin(); - for (int index = EQEmu::textures::textureBegin; index <= EQEmu::textures::LastTexture; index++) { + for (int index = EQ::textures::textureBegin; index <= EQ::textures::LastTexture; index++) { temp_npctype_data->armor_tint.Slot[index].Color = atoi(armorTint_row[index * 3]) << 16; temp_npctype_data->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 1]) << 8; temp_npctype_data->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 2]); @@ -2653,7 +2624,7 @@ const NPCType *ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load } // Try loading npc_types tint fields if armor tint is 0 or query failed to get results if (armor_tint_id == 0) { - for (int index = EQEmu::textures::armorChest; index < EQEmu::textures::materialCount; index++) { + for (int index = EQ::textures::armorChest; index < EQ::textures::materialCount; index++) { temp_npctype_data->armor_tint.Slot[index].Color = temp_npctype_data->armor_tint.Slot[0].Color; // odd way to 'zero-out' the array... } } @@ -2711,6 +2682,7 @@ const NPCType *ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load temp_npctype_data->use_model = atoi(row[110]); temp_npctype_data->flymode = atoi(row[111]); temp_npctype_data->always_aggro = atoi(row[112]); + temp_npctype_data->exp_mod = atoi(row[113]); temp_npctype_data->skip_auto_scale = false; // hardcoded here for now @@ -2879,7 +2851,7 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client tmpNPCType->armor_tint.Slot[0].Color |= (tmpNPCType->armor_tint.Slot[0].Color) ? (0xFF << 24) : 0; if (armor_tint_id == 0) - for (int index = EQEmu::textures::armorChest; index <= EQEmu::textures::LastTexture; index++) + for (int index = EQ::textures::armorChest; index <= EQ::textures::LastTexture; index++) tmpNPCType->armor_tint.Slot[index].Color = tmpNPCType->armor_tint.Slot[0].Color; else if (tmpNPCType->armor_tint.Slot[0].Color == 0) { std::string armorTint_query = StringFormat("SELECT red1h, grn1h, blu1h, " @@ -2899,7 +2871,7 @@ const NPCType* ZoneDatabase::GetMercType(uint32 id, uint16 raceid, uint32 client else { auto armorTint_row = results.begin(); - for (int index = EQEmu::textures::textureBegin; index <= EQEmu::textures::LastTexture; index++) { + for (int index = EQ::textures::textureBegin; index <= EQ::textures::LastTexture; index++) { tmpNPCType->armor_tint.Slot[index].Color = atoi(armorTint_row[index * 3]) << 16; tmpNPCType->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 1]) << 8; tmpNPCType->armor_tint.Slot[index].Color |= atoi(armorTint_row[index * 3 + 2]); @@ -3258,7 +3230,7 @@ void ZoneDatabase::LoadMercEquipment(Merc *merc) { int itemCount = 0; for(auto row = results.begin(); row != results.end(); ++row) { - if (itemCount == EQEmu::invslot::EQUIPMENT_COUNT) + if (itemCount == EQ::invslot::EQUIPMENT_COUNT) break; if(atoi(row[0]) == 0) @@ -3397,7 +3369,7 @@ void ZoneDatabase::RefreshGroupFromDB(Client *client){ client->QueuePacket(outapp); safe_delete(outapp); - if (client->ClientVersion() >= EQEmu::versions::ClientVersion::SoD) { + if (client->ClientVersion() >= EQ::versions::ClientVersion::SoD) { group->NotifyMainTank(client, 1); group->NotifyPuller(client, 1); } @@ -3552,7 +3524,7 @@ void ZoneDatabase::ListAllInstances(Client* client, uint32 charid) client->Message(Chat::White, "%s is part of the following instances:", name); for (auto row = results.begin(); row != results.end(); ++row) { - client->Message(Chat::White, "%s - id: %lu, version: %lu", content_db.GetZoneName(atoi(row[1])), + client->Message(Chat::White, "%s - id: %lu, version: %lu", ZoneName(atoi(row[1])), (unsigned long)atoi(row[0]), (unsigned long)atoi(row[2])); } } @@ -3699,12 +3671,12 @@ void ZoneDatabase::LoadBuffs(Client *client) } // We load up to the most our client supports - max_slots = EQEmu::spells::StaticLookup(client->ClientVersion())->LongBuffs; + max_slots = EQ::spells::StaticLookup(client->ClientVersion())->LongBuffs; for (int index = 0; index < max_slots; ++index) { if (!IsValidSpell(buffs[index].spellid)) continue; - for (int effectIndex = 0; effectIndex < 12; ++effectIndex) { + for (int effectIndex = 0; effectIndex < EFFECT_COUNT; ++effectIndex) { if (spells[buffs[index].spellid].effectid[effectIndex] == SE_Charm) { buffs[index].spellid = SPELL_UNKNOWN; @@ -3773,13 +3745,14 @@ void ZoneDatabase::SavePetInfo(Client *client) continue; query = StringFormat("INSERT INTO `character_pet_info` " - "(`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`, `size`) " - "VALUES (%u, %u, '%s', %i, %u, %u, %u, %f) " + "(`char_id`, `pet`, `petname`, `petpower`, `spell_id`, `hp`, `mana`, `size`, `taunting`) " + "VALUES (%u, %u, '%s', %i, %u, %u, %u, %f, %u) " "ON DUPLICATE KEY UPDATE `petname` = '%s', `petpower` = %i, `spell_id` = %u, " - "`hp` = %u, `mana` = %u, `size` = %f", + "`hp` = %u, `mana` = %u, `size` = %f, `taunting` = %u", client->CharacterID(), pet, petinfo->Name, petinfo->petpower, petinfo->SpellID, - petinfo->HP, petinfo->Mana, petinfo->size, // and now the ON DUPLICATE ENTRIES - petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, petinfo->size); + petinfo->HP, petinfo->Mana, petinfo->size, (petinfo->taunting) ? 1 : 0, + // and now the ON DUPLICATE ENTRIES + petinfo->Name, petinfo->petpower, petinfo->SpellID, petinfo->HP, petinfo->Mana, petinfo->size, (petinfo->taunting) ? 1 : 0); results = database.QueryDatabase(query); if (!results.Success()) return; @@ -3808,7 +3781,7 @@ void ZoneDatabase::SavePetInfo(Client *client) query.clear(); // pet inventory! - for (int index = EQEmu::invslot::EQUIPMENT_BEGIN; index <= EQEmu::invslot::EQUIPMENT_END; index++) { + for (int index = EQ::invslot::EQUIPMENT_BEGIN; index <= EQ::invslot::EQUIPMENT_END; index++) { if (!petinfo->Items[index]) continue; @@ -3851,7 +3824,7 @@ void ZoneDatabase::LoadPetInfo(Client *client) memset(suspended, 0, sizeof(PetInfo)); std::string query = StringFormat("SELECT `pet`, `petname`, `petpower`, `spell_id`, " - "`hp`, `mana`, `size` FROM `character_pet_info` " + "`hp`, `mana`, `size` , `taunting` FROM `character_pet_info` " "WHERE `char_id` = %u", client->CharacterID()); auto results = database.QueryDatabase(query); @@ -3876,6 +3849,7 @@ void ZoneDatabase::LoadPetInfo(Client *client) pi->HP = atoul(row[4]); pi->Mana = atoul(row[5]); pi->size = atof(row[6]); + pi->taunting = (bool) atoi(row[7]); } query = StringFormat("SELECT `pet`, `slot`, `spell_id`, `caster_level`, `castername`, " @@ -3940,7 +3914,7 @@ void ZoneDatabase::LoadPetInfo(Client *client) continue; int slot = atoi(row[1]); - if (slot < EQEmu::invslot::EQUIPMENT_BEGIN || slot > EQEmu::invslot::EQUIPMENT_END) + if (slot < EQ::invslot::EQUIPMENT_BEGIN || slot > EQ::invslot::EQUIPMENT_END) continue; pi->Items[slot] = atoul(row[2]); @@ -4090,9 +4064,9 @@ bool ZoneDatabase::LoadFactionData() faction_array = new Faction *[max_faction + 1]; memset(faction_array, 0, (sizeof(Faction*) * (max_faction + 1))); - - std::vector faction_ids; - + + std::vector faction_ids; + // load factions query = "SELECT `id`, `name`, `base` FROM `faction_list`"; @@ -4120,13 +4094,13 @@ bool ZoneDatabase::LoadFactionData() faction_array[index]->base = atoi(fr_row[2]); faction_array[index]->min = MIN_PERSONAL_FACTION; faction_array[index]->max = MAX_PERSONAL_FACTION; - - faction_ids.push_back(index); + + faction_ids.push_back(fr_row[0]); } LogInfo("[{}] Faction(s) loaded...", faction_ids.size()); - const std::string faction_id_criteria(implode(",", std::pair('\'', '\''), faction_ids)); + const std::string faction_id_criteria(implode(",", faction_ids)); // load faction mins/maxes query = fmt::format("SELECT `client_faction_id`, `min`, `max` FROM `faction_base_data` WHERE `client_faction_id` IN ({})", faction_id_criteria); @@ -4156,7 +4130,7 @@ bool ZoneDatabase::LoadFactionData() else { LogInfo("Unable to load Faction Base data..."); } - + // load race, class and diety modifiers query = fmt::format("SELECT `faction_id`, `mod`, `mod_name` FROM `faction_list_mod` WHERE `faction_id` IN ({})", faction_id_criteria); @@ -4281,6 +4255,18 @@ uint32 ZoneDatabase::SendCharacterCorpseToGraveyard(uint32 dbid, uint32 zone_id, return dbid; } +void ZoneDatabase::SendCharacterCorpseToNonInstance(uint32 corpse_db_id) +{ + if (corpse_db_id != 0) + { + auto query = fmt::format(SQL( + UPDATE character_corpses SET instance_id = 0 WHERE id = {}; + ), corpse_db_id); + + QueryDatabase(query); + } +} + uint32 ZoneDatabase::GetCharacterCorpseDecayTimer(uint32 corpse_db_id){ std::string query = StringFormat("SELECT(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(time_of_death)) FROM `character_corpses` WHERE `id` = %d AND NOT `time_of_death` = 0", corpse_db_id); auto results = QueryDatabase(query); @@ -4879,7 +4865,7 @@ uint32 ZoneDatabase::LoadSaylinkID(const char* saylink_text, bool auto_insert) { if (!saylink_text || saylink_text[0] == '\0') return 0; - + std::string query = StringFormat("SELECT `id` FROM `saylink` WHERE `phrase` = '%s' LIMIT 1", saylink_text); auto results = QueryDatabase(query); if (!results.Success()) @@ -4904,6 +4890,88 @@ uint32 ZoneDatabase::SaveSaylinkID(const char* saylink_text) auto results = QueryDatabase(query); if (!results.Success()) return 0; - + return results.LastInsertedID(); } + +double ZoneDatabase::GetAAEXPModifier(uint32 character_id, uint32 zone_id) const { + std::string query = fmt::format( + SQL( + SELECT + `aa_modifier` + FROM + `character_exp_modifiers` + WHERE + `character_id` = {} + AND + (`zone_id` = {} OR `zone_id` = 0) + ORDER BY `zone_id` DESC + LIMIT 1 + ), + character_id, + zone_id + ); + auto results = database.QueryDatabase(query); + for (auto row = results.begin(); row != results.end(); ++row) { + return atof(row[0]); + } + return 1.0f; +} + +double ZoneDatabase::GetEXPModifier(uint32 character_id, uint32 zone_id) const { + std::string query = fmt::format( + SQL( + SELECT + `exp_modifier` + FROM + `character_exp_modifiers` + WHERE + `character_id` = {} + AND + (`zone_id` = {} OR `zone_id` = 0) + ORDER BY `zone_id` DESC + LIMIT 1 + ), + character_id, + zone_id + ); + auto results = database.QueryDatabase(query); + for (auto row = results.begin(); row != results.end(); ++row) { + return atof(row[0]); + } + return 1.0f; +} + +void ZoneDatabase::SetAAEXPModifier(uint32 character_id, uint32 zone_id, double aa_modifier) { + float exp_modifier = GetEXPModifier(character_id, zone_id); + std::string query = fmt::format( + SQL( + REPLACE INTO + `character_exp_modifiers` + VALUES + ({}, {}, {}, {}) + ), + character_id, + zone_id, + aa_modifier, + exp_modifier + ); + database.QueryDatabase(query); +} + +void ZoneDatabase::SetEXPModifier(uint32 character_id, uint32 zone_id, double exp_modifier) { + float aa_modifier = GetAAEXPModifier(character_id, zone_id); + std::string query = fmt::format( + SQL( + REPLACE INTO + `character_exp_modifiers` + VALUES + ({}, {}, {}, {}) + ), + character_id, + zone_id, + aa_modifier, + exp_modifier + ); + database.QueryDatabase(query); +} diff --git a/zone/zonedb.h b/zone/zonedb.h index cff2e14c1..d7e41ecb0 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -23,7 +23,6 @@ class Petition; class Spawn2; class SpawnGroupList; class Trap; -struct CharacterEventLog_Struct; struct Door; struct ExtendedProfile_Struct; struct NPCType; @@ -31,7 +30,7 @@ struct PlayerCorpse_Struct; struct ZonePoint; struct npcDecayTimes_Struct; -namespace EQEmu +namespace EQ { class ItemInstance; } @@ -52,7 +51,7 @@ struct wplist { #pragma pack(1) struct DBnpcspells_entries_Struct { - int16 spellid; + uint16 spellid; uint8 minlevel; uint8 maxlevel; uint32 type; @@ -106,7 +105,7 @@ struct DBnpcspellseffects_Struct { }; struct DBTradeskillRecipe_Struct { - EQEmu::skills::SkillType tradeskill; + EQ::skills::SkillType tradeskill; int16 skill_needed; uint16 trivial; bool nofail; @@ -153,8 +152,9 @@ struct PetInfo { uint32 Mana; float size; SpellBuff_Struct Buffs[PET_BUFF_COUNT]; - uint32 Items[EQEmu::invslot::EQUIPMENT_COUNT]; + uint32 Items[EQ::invslot::EQUIPMENT_COUNT]; char Name[64]; + bool taunting; }; struct ZoneSpellsBlocked { @@ -251,11 +251,11 @@ public: virtual ~ZoneDatabase(); /* Objects and World Containers */ - void LoadWorldContainer(uint32 parentid, EQEmu::ItemInstance* container); - void SaveWorldContainer(uint32 zone_id, uint32 parent_id, const EQEmu::ItemInstance* container); + void LoadWorldContainer(uint32 parentid, EQ::ItemInstance* container); + void SaveWorldContainer(uint32 zone_id, uint32 parent_id, const EQ::ItemInstance* container); void DeleteWorldContainer(uint32 parent_id,uint32 zone_id); - uint32 AddObject(uint32 type, uint32 icon, const Object_Struct& object, const EQEmu::ItemInstance* inst); - void UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const EQEmu::ItemInstance* inst); + uint32 AddObject(uint32 type, uint32 icon, const Object_Struct& object, const EQ::ItemInstance* inst); + void UpdateObject(uint32 id, uint32 type, uint32 icon, const Object_Struct& object, const EQ::ItemInstance* inst); void DeleteObject(uint32 id); Ground_Spawns* LoadGroundSpawns(uint32 zone_id, int16 version, Ground_Spawns* gs); @@ -266,7 +266,7 @@ public: void DeleteTraderItem(uint32 char_id); void DeleteTraderItem(uint32 char_id,uint16 slot_id); - EQEmu::ItemInstance* LoadSingleTraderItem(uint32 char_id, int uniqueid); + EQ::ItemInstance* LoadSingleTraderItem(uint32 char_id, int uniqueid); Trader_Struct* LoadTraderItem(uint32 char_id); TraderCharges_Struct* LoadTraderItemWithCharges(uint32 char_id); @@ -319,7 +319,7 @@ public: bool SaveCharacterAA(uint32 character_id, uint32 aa_id, uint32 current_level, uint32 charges); bool SaveCharacterBandolier(uint32 character_id, uint8 bandolier_id, uint8 bandolier_slot, uint32 item_id, uint32 icon, const char* bandolier_name); - bool SaveCharacterBindPoint(uint32 character_id, const BindStruct &bind, uint32 bind_num); + bool SaveCharacterBindPoint(uint32 character_id, const BindStruct &bind, uint32 bind_number); bool SaveCharacterCurrency(uint32 character_id, PlayerProfile_Struct* pp); bool SaveCharacterData(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp, ExtendedProfile_Struct* m_epp); bool SaveCharacterDisc(uint32 character_id, uint32 slot_id, uint32 disc_id); @@ -331,6 +331,11 @@ public: bool SaveCharacterSkill(uint32 character_id, uint32 skill_id, uint32 value); bool SaveCharacterSpell(uint32 character_id, uint32 spell_id, uint32 slot_id); bool SaveCharacterTribute(uint32 character_id, PlayerProfile_Struct* pp); + + double GetAAEXPModifier(uint32 character_id, uint32 zone_id) const; + double GetEXPModifier(uint32 character_id, uint32 zone_id) const; + void SetAAEXPModifier(uint32 character_id, uint32 zone_id, double aa_modifier); + void SetEXPModifier(uint32 character_id, uint32 zone_id, double exp_modifier); /* Character Inventory */ bool NoRentExpired(const char* name); @@ -375,6 +380,7 @@ public: uint32 GetCharacterCorpseID(uint32 char_id, uint8 corpse); uint32 GetCharacterCorpseItemAt(uint32 corpse_id, uint16 slotid); uint32 GetPlayerCorpseTimeLeft(uint8 corpse, uint8 type); + void SendCharacterCorpseToNonInstance(uint32 corpse_db_id); /* Faction */ bool GetNPCFactionList(uint32 npcfaction_id, int32* faction_id, int32* value, uint8* temp, int32* primary_faction = 0); @@ -453,7 +459,7 @@ public: bool GetPoweredPetEntry(const char *pet_type, int16 petpower, PetRecord *into); bool GetBasePetItems(int32 equipmentset, uint32 *items); void AddLootTableToNPC(NPC* npc, uint32 loottable_id, ItemList* itemlist, uint32* copper, uint32* silver, uint32* gold, uint32* plat); - void AddLootDropToNPC(NPC* npc, uint32 lootdrop_id, ItemList* itemlist, uint8 droplimit, uint8 mindrop); + void AddLootDropToNPC(NPC* npc, uint32 lootdrop_id, ItemList* item_list, uint8 droplimit, uint8 mindrop); uint32 GetMaxNPCSpellsID(); uint32 GetMaxNPCSpellsEffectsID(); bool GetAuraEntry(uint16 spell_id, AuraRecord &record); @@ -488,7 +494,7 @@ public: void DeleteMerchantTemp(uint32 npcid, uint32 slot); /* Tradeskills */ - bool GetTradeRecipe(const EQEmu::ItemInstance* container, uint8 c_type, uint32 some_id, uint32 char_id, DBTradeskillRecipe_Struct *spec); + bool GetTradeRecipe(const EQ::ItemInstance* container, uint8 c_type, uint32 some_id, uint32 char_id, DBTradeskillRecipe_Struct *spec); bool GetTradeRecipe(uint32 recipe_id, uint8 c_type, uint32 some_id, uint32 char_id, DBTradeskillRecipe_Struct *spec); uint32 GetZoneForage(uint32 ZoneID, uint8 skill); /* for foraging */ uint32 GetZoneFishing(uint32 ZoneID, uint8 skill, uint32 &npc_id, uint8 &npc_chance); @@ -549,7 +555,6 @@ public: * REALLY HAS NO BETTER SECTION */ bool logevents(const char* accountname,uint32 accountid,uint8 status,const char* charname,const char* target, const char* descriptiontype, const char* description,int event_nid); - void GetEventLogs(const char* name,char* target,uint32 account_id=0,uint8 eventid=0,char* detail=0,char* timestamp=0, CharacterEventLog_Struct* cel=0); uint32 GetKarma(uint32 acct_id); void UpdateKarma(uint32 acct_id, uint32 amount); diff --git a/zone/zonedump.h b/zone/zonedump.h index 0a1bcd07d..09f11b65b 100644 --- a/zone/zonedump.h +++ b/zone/zonedump.h @@ -86,7 +86,7 @@ struct NPCType uint32 drakkin_heritage; uint32 drakkin_tattoo; uint32 drakkin_details; - EQEmu::TintProfile armor_tint; + EQ::TintProfile armor_tint; uint32 min_dmg; uint32 max_dmg; uint32 charm_ac; @@ -148,6 +148,7 @@ struct NPCType uint16 use_model; int8 flymode; bool always_aggro; + int exp_mod; }; namespace player_lootitem { @@ -185,7 +186,7 @@ struct PlayerCorpse_Struct { uint32 silver; uint32 gold; uint32 plat; - EQEmu::TintProfile item_tint; + EQ::TintProfile item_tint; uint8 haircolor; uint8 beardcolor; uint8 eyecolor1; diff --git a/zone/zoning.cpp b/zone/zoning.cpp index eb5bc6805..0d088aadf 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -21,6 +21,7 @@ #include "../common/rulesys.h" #include "../common/string_util.h" +#include "expedition.h" #include "queryserv.h" #include "quest_parser_collection.h" #include "string_ids.h" @@ -35,6 +36,9 @@ extern QueryServ* QServ; extern WorldServer worldserver; extern Zone* zone; +#include "../common/repositories/zone_repository.h" +#include "../common/content/world_content_service.h" + void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { #ifdef BOTS @@ -74,11 +78,11 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { target_zone_id = zonesummon_id; break; case GateToBindPoint: - target_zone_id = m_pp.binds[0].zoneId; + target_zone_id = m_pp.binds[0].zone_id; target_instance_id = m_pp.binds[0].instance_id; break; case ZoneToBindPoint: - target_zone_id = m_pp.binds[0].zoneId; + target_zone_id = m_pp.binds[0].zone_id; target_instance_id = m_pp.binds[0].instance_id; break; case ZoneSolicited: //we told the client to zone somewhere, so we know where they are going. @@ -156,7 +160,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { } /* Check for Valid Zone */ - const char *target_zone_name = content_db.GetZoneName(target_zone_id); + const char *target_zone_name = ZoneName(target_zone_id); if(target_zone_name == nullptr) { //invalid zone... Message(Chat::Red, "Invalid target zone ID."); @@ -166,11 +170,21 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { } /* Load up the Safe Coordinates, restrictions and verify the zone name*/ - float safe_x, safe_y, safe_z; - int16 minstatus = 0; - uint8 minlevel = 0; + float safe_x, safe_y, safe_z, safe_heading; + int16 min_status = 0; + uint8 min_level = 0; char flag_needed[128]; - if(!content_db.GetSafePoints(target_zone_name, database.GetInstanceVersion(target_instance_id), &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_needed)) { + if(!content_db.GetSafePoints( + target_zone_name, + database.GetInstanceVersion(target_instance_id), + &safe_x, + &safe_y, + &safe_z, + &safe_heading, + &min_status, + &min_level, + flag_needed + )) { //invalid zone... Message(Chat::Red, "Invalid target zone while getting safe points."); LogError("Zoning [{}]: Unable to get safe coordinates for zone [{}]", GetName(), target_zone_name); @@ -185,41 +199,54 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { //handle circumvention of zone restrictions //we need the value when creating the outgoing packet as well. - uint8 ignorerestrictions = zonesummon_ignorerestrictions; + uint8 ignore_restrictions = zonesummon_ignorerestrictions; zonesummon_ignorerestrictions = 0; - float dest_x=0, dest_y=0, dest_z=0, dest_h; - dest_h = GetHeading(); + float target_x = 0, target_y = 0, target_z = 0, target_heading = 0; switch(zone_mode) { case EvacToSafeCoords: case ZoneToSafeCoords: - LogDebug("Zoning [{}] to safe coords ([{}],[{}],[{}]) in [{}] ([{}])", GetName(), safe_x, safe_y, safe_z, target_zone_name, target_zone_id); - dest_x = safe_x; - dest_y = safe_y; - dest_z = safe_z; + LogDebug( + "Zoning [{}] to safe coords ([{}], [{}], [{}], [{}]) in [{}] ([{}])", + GetName(), + safe_x, + safe_y, + safe_z, + safe_heading, + target_zone_name, + target_zone_id + ); + target_x = safe_x; + target_y = safe_y; + target_z = safe_z; + target_heading = safe_heading; break; case GMSummon: - dest_x = m_ZoneSummonLocation.x; - dest_y = m_ZoneSummonLocation.y; - dest_z = m_ZoneSummonLocation.z; - ignorerestrictions = 1; + target_x = m_ZoneSummonLocation.x; + target_y = m_ZoneSummonLocation.y; + target_z = m_ZoneSummonLocation.z; + target_heading = m_ZoneSummonLocation.w; + ignore_restrictions = 1; break; case GateToBindPoint: - dest_x = m_pp.binds[0].x; - dest_y = m_pp.binds[0].y; - dest_z = m_pp.binds[0].z; + target_x = m_pp.binds[0].x; + target_y = m_pp.binds[0].y; + target_z = m_pp.binds[0].z; + target_heading = m_pp.binds[0].heading; break; case ZoneToBindPoint: - dest_x = m_pp.binds[0].x; - dest_y = m_pp.binds[0].y; - dest_z = m_pp.binds[0].z; - ignorerestrictions = 1; //can always get to our bind point? seems exploitable + target_x = m_pp.binds[0].x; + target_y = m_pp.binds[0].y; + target_z = m_pp.binds[0].z; + target_heading = m_pp.binds[0].heading; + ignore_restrictions = 1; //can always get to our bind point? seems exploitable break; case ZoneSolicited: //we told the client to zone somewhere, so we know where they are going. //recycle zonesummon variables - dest_x = m_ZoneSummonLocation.x; - dest_y = m_ZoneSummonLocation.y; - dest_z = m_ZoneSummonLocation.z; + target_x = m_ZoneSummonLocation.x; + target_y = m_ZoneSummonLocation.y; + target_z = m_ZoneSummonLocation.z; + target_heading = m_ZoneSummonLocation.w; break; case ZoneUnsolicited: //client came up with this on its own. //client requested a zoning... what are the cases when this could happen? @@ -230,21 +257,24 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { //999999 is a placeholder for 'same as where they were from' if(zone_point->target_x == 999999) - dest_x = GetX(); + target_x = GetX(); else - dest_x = zone_point->target_x; + target_x = zone_point->target_x; + if(zone_point->target_y == 999999) - dest_y = GetY(); + target_y = GetY(); else - dest_y = zone_point->target_y; + target_y = zone_point->target_y; + if(zone_point->target_z == 999999) - dest_z=GetZ(); + target_z = GetZ(); else - dest_z = zone_point->target_z; + target_z = zone_point->target_z; + if(zone_point->target_heading == 999) - dest_h = GetHeading(); + target_heading = GetHeading(); else - dest_h = zone_point->target_heading; + target_heading = zone_point->target_heading; break; } @@ -268,12 +298,12 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { //not sure when we would use ZONE_ERROR_NOTREADY //enforce min status and level - if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel)) + if (!ignore_restrictions && (Admin() < min_status || GetLevel() < min_level)) { myerror = ZONE_ERROR_NOEXPERIENCE; } - if(!ignorerestrictions && flag_needed[0] != '\0') { + if(!ignore_restrictions && flag_needed[0] != '\0') { //the flag needed string is not empty, meaning a flag is required. if(Admin() < minStatusToIgnoreZoneFlags && !HasZoneFlag(target_zone_id)) { @@ -284,9 +314,62 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) { //TODO: ADVENTURE ENTRANCE CHECK + /** + * Expansion check + */ + if (content_service.GetCurrentExpansion() >= Expansion::Classic && !GetGM()) { + + /** + * Hit the zone cache first so we're not hitting the database every time someone attempts to zone + */ + bool meets_zone_expansion_check = false; + bool found_zone = false; + for (auto &z: zone_store.zones) { + if (z.short_name == target_zone_name && z.version == 0) { + found_zone = true; + if (z.expansion <= (content_service.GetCurrentExpansion() + 1)) { + meets_zone_expansion_check = true; + break; + } + } + } + + /** + * If we fail to find a cached zone lookup because someone just so happened to change some data, second attempt + * In 99% of cases we would never get here and this would be fallback + */ + if (!found_zone) { + auto zones = ZoneRepository::GetWhere(content_db, + fmt::format( + "expansion <= {} AND short_name = '{}' and version = 0", + (content_service.GetCurrentExpansion() + 1), + target_zone_name + ) + ); + + meets_zone_expansion_check = !zones.empty(); + } + + LogInfo( + "Checking zone request [{}] for expansion [{}] ({}) success [{}]", + target_zone_name, + (content_service.GetCurrentExpansion() + 1), + content_service.GetCurrentExpansionName(), + meets_zone_expansion_check ? "true" : "false" + ); + + if (!meets_zone_expansion_check) { + myerror = ZONE_ERROR_NOEXPANSION; + } + } + + if (content_service.GetCurrentExpansion() >= Expansion::Classic && GetGM()) { + LogInfo("[{}] Bypassing Expansion zone checks because GM status is set", GetCleanName()); + } + if(myerror == 1) { //we have successfully zoned - DoZoneSuccess(zc, target_zone_id, target_instance_id, dest_x, dest_y, dest_z, dest_h, ignorerestrictions); + DoZoneSuccess(zc, target_zone_id, target_instance_id, target_x, target_y, target_z, target_heading, ignore_restrictions); } else { LogError("Zoning [{}]: Rules prevent this char from zoning into [{}]", GetName(), target_zone_name); SendZoneError(zc, myerror); @@ -348,7 +431,17 @@ void Client::DoZoneSuccess(ZoneChange_Struct *zc, uint16 zone_id, uint32 instanc if(this->GetPet()) entity_list.RemoveFromHateLists(this->GetPet()); - LogInfo("Zoning [{}] to: [{}] ([{}]) - ([{}]) x [{}] y [{}] z [{}]", m_pp.name, content_db.GetZoneName(zone_id), zone_id, instance_id, dest_x, dest_y, dest_z); + if (GetPendingExpeditionInviteID() != 0) + { + // live re-invites if client zoned with a pending invite, save pending invite info in world + auto expedition = Expedition::FindCachedExpeditionByID(GetPendingExpeditionInviteID()); + if (expedition) + { + expedition->SendWorldPendingInvite(m_pending_expedition_invite, GetName()); + } + } + + LogInfo("Zoning [{}] to: [{}] ([{}]) - ([{}]) x [{}] y [{}] z [{}]", m_pp.name, ZoneName(zone_id), zone_id, instance_id, dest_x, dest_y, dest_z); //set the player's coordinates in the new zone so they have them //when they zone into it @@ -396,13 +489,13 @@ void Client::DoZoneSuccess(ZoneChange_Struct *zc, uint16 zone_id, uint32 instanc //reset to unsolicited. zone_mode = ZoneUnsolicited; - m_ZoneSummonLocation = glm::vec3(); + m_ZoneSummonLocation = glm::vec4(); zonesummon_id = 0; zonesummon_ignorerestrictions = 0; } void Client::MovePC(const char* zonename, float x, float y, float z, float heading, uint8 ignorerestrictions, ZoneMode zm) { - ProcessMovePC(content_db.GetZoneID(zonename), 0, x, y, z, heading, ignorerestrictions, zm); + ProcessMovePC(ZoneID(zonename), 0, x, y, z, heading, ignorerestrictions, zm); } //designed for in zone moving @@ -418,6 +511,95 @@ void Client::MovePC(uint32 zoneID, uint32 instanceID, float x, float y, float z, ProcessMovePC(zoneID, instanceID, x, y, z, heading, ignorerestrictions, zm); } +void Client::MoveZone(const char *zone_short_name) { + auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct)); + ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer; + ztz->response = 0; + ztz->current_zone_id = zone->GetZoneID(); + ztz->current_instance_id = zone->GetInstanceID(); + ztz->requested_zone_id = ZoneID(zone_short_name); + ztz->admin = Admin(); + strcpy(ztz->name, GetName()); + ztz->guild_id = GuildID(); + ztz->ignorerestrictions = 3; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void Client::MoveZoneGroup(const char *zone_short_name) { + if (!GetGroup()) { + MoveZone(zone_short_name); + } else { + auto client_group = GetGroup(); + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->MoveZone(zone_short_name); + } + } + } +} + +void Client::MoveZoneRaid(const char *zone_short_name) { + if (!GetRaid()) { + MoveZone(zone_short_name); + } else { + auto client_raid = GetRaid(); + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->MoveZone(zone_short_name); + } + } + } +} + +void Client::MoveZoneInstance(uint16 instance_id) { + if (!database.CharacterInInstanceGroup(instance_id, CharacterID())) { + database.AddClientToInstance(instance_id, CharacterID()); + } + auto pack = new ServerPacket(ServerOP_ZoneToZoneRequest, sizeof(ZoneToZone_Struct)); + ZoneToZone_Struct* ztz = (ZoneToZone_Struct*) pack->pBuffer; + ztz->response = 0; + ztz->current_zone_id = zone->GetZoneID(); + ztz->current_instance_id = zone->GetInstanceID(); + ztz->requested_zone_id = database.ZoneIDFromInstanceID(instance_id); + ztz->requested_instance_id = instance_id; + ztz->admin = Admin(); + strcpy(ztz->name, GetName()); + ztz->guild_id = GuildID(); + ztz->ignorerestrictions = 3; + worldserver.SendPacket(pack); + safe_delete(pack); +} + +void Client::MoveZoneInstanceGroup(uint16 instance_id) { + if (!GetGroup()) { + MoveZoneInstance(instance_id); + } else { + auto client_group = GetGroup(); + for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { + if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { + auto group_member = client_group->members[member_index]->CastToClient(); + group_member->MoveZoneInstance(instance_id); + } + } + } +} + +void Client::MoveZoneInstanceRaid(uint16 instance_id) { + if (!GetRaid()) { + MoveZoneInstance(instance_id); + } else { + auto client_raid = GetRaid(); + for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { + if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { + auto raid_member = client_raid->members[member_index].member->CastToClient(); + raid_member->MoveZoneInstance(instance_id); + } + } + } +} void Client::ProcessMovePC(uint32 zoneID, uint32 instance_id, float x, float y, float z, float heading, uint8 ignorerestrictions, ZoneMode zm) { @@ -434,7 +616,7 @@ void Client::ProcessMovePC(uint32 zoneID, uint32 instance_id, float x, float y, return; } - if(GetPetID() != 0) { + if(zm != SummonPC && GetPetID() != 0) { //if they have a pet and they are staying in zone, move with them Mob *p = GetPet(); if(p != nullptr){ @@ -482,7 +664,7 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z const char* pShortZoneName = nullptr; char* pZoneName = nullptr; - pShortZoneName = content_db.GetZoneName(zoneID); + pShortZoneName = ZoneName(zoneID); content_db.GetZoneLongName(pShortZoneName, &pZoneName); if(!pZoneName) { @@ -491,29 +673,24 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z return; } iZoneNameLength = strlen(pZoneName); - glm::vec3 safePoint; - + glm::vec4 zone_safe_point; switch(zm) { case EvacToSafeCoords: case ZoneToSafeCoords: - safePoint = zone->GetSafePoint(); - x = safePoint.x; - y = safePoint.y; - z = safePoint.z; - SetHeading(heading); + zone_safe_point = zone->GetSafePoint(); + x = zone_safe_point.x; + y = zone_safe_point.y; + z = zone_safe_point.z; + heading = zone_safe_point.w; break; case GMSummon: m_Position = glm::vec4(x, y, z, heading); - m_ZoneSummonLocation = glm::vec3(m_Position); - SetHeading(heading); - + m_ZoneSummonLocation = m_Position; zonesummon_id = zoneID; zonesummon_ignorerestrictions = 1; break; case ZoneSolicited: - m_ZoneSummonLocation = glm::vec3(x,y,z); - SetHeading(heading); - + m_ZoneSummonLocation = glm::vec4(x, y, z, heading); zonesummon_id = zoneID; zonesummon_ignorerestrictions = ignorerestrictions; break; @@ -528,23 +705,20 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z y = m_Position.y = m_pp.binds[0].y; z = m_Position.z = m_pp.binds[0].z; heading = m_pp.binds[0].heading; - zonesummon_ignorerestrictions = 1; - LogDebug("Player [{}] has died and will be zoned to bind point in zone: [{}] at LOC x=[{}], y=[{}], z=[{}], heading=[{}]", + LogDebug("Player [{}] has died and will be zoned to bind point in zone: [{}] at LOC x=[{}], y=[{}], z=[{}], heading=[{}]", GetName(), pZoneName, m_pp.binds[0].x, m_pp.binds[0].y, m_pp.binds[0].z, m_pp.binds[0].heading); break; case SummonPC: - m_ZoneSummonLocation = glm::vec3(x, y, z); - m_Position = glm::vec4(m_ZoneSummonLocation, 0.0f); - SetHeading(heading); + m_ZoneSummonLocation = glm::vec4(x, y, z, heading); + m_Position = m_ZoneSummonLocation; break; case Rewind: - LogDebug("[{}] has requested a /rewind from [{}], [{}], [{}], to [{}], [{}], [{}] in [{}]", GetName(), - m_Position.x, m_Position.y, m_Position.z, + LogDebug("[{}] has requested a /rewind from [{}], [{}], [{}], to [{}], [{}], [{}] in [{}]", GetName(), + m_Position.x, m_Position.y, m_Position.z, m_RewindLocation.x, m_RewindLocation.y, m_RewindLocation.z, zone->GetShortName()); - m_ZoneSummonLocation = glm::vec3(x, y, z); - m_Position = glm::vec4(m_ZoneSummonLocation, 0.0f); - SetHeading(heading); + m_ZoneSummonLocation = glm::vec4(x, y, z, heading); + m_Position = m_ZoneSummonLocation; break; default: LogError("Client::ZonePC() received a reguest to perform an unsupported client zone operation"); @@ -561,7 +735,7 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z if (entity == 0) { Message(Chat::Red, "Error: OP_EndLootRequest: Corpse not found (ent = 0)"); - if (ClientVersion() >= EQEmu::versions::ClientVersion::SoD) + if (ClientVersion() >= EQ::versions::ClientVersion::SoD) Corpse::SendEndLootErrorPacket(this); else Corpse::SendLootReqErrorPacket(this); @@ -588,7 +762,7 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z // If we are SoF and later and are respawning from hover, we want the real zone ID, else zero to use the old hack. // if(zone->GetZoneID() == zoneID) { - if ((ClientVersionBit() & EQEmu::versions::maskSoFAndLater) && (!RuleB(Character, RespawnFromHover) || !IsHoveringForRespawn())) + if ((ClientVersionBit() & EQ::versions::maskSoFAndLater) && (!RuleB(Character, RespawnFromHover) || !IsHoveringForRespawn())) gmg->bind_zone_id = 0; else gmg->bind_zone_id = zoneID; @@ -691,7 +865,7 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z { if(zm != EvacToSafeCoords && zm != ZoneToSafeCoords && zm != ZoneToBindPoint) { - m_ZoneSummonLocation = glm::vec3(); + m_ZoneSummonLocation = glm::vec4(); zonesummon_id = 0; zonesummon_ignorerestrictions = 0; zone_mode = ZoneUnsolicited; @@ -710,61 +884,100 @@ void Client::GoToSafeCoords(uint16 zone_id, uint16 instance_id) { } -void Mob::Gate(uint8 bindnum) { - GoToBind(bindnum); +void Mob::Gate(uint8 bind_number) { + GoToBind(bind_number); if (RuleB(NPC, NPCHealOnGate) && this->IsNPC() && this->GetHPRatio() <= RuleR(NPC, NPCHealOnGateAmount)) { auto HealAmount = (RuleR(NPC, NPCHealOnGateAmount) / 100); SetHP(int(this->GetMaxHP() * HealAmount)); } } -void Client::Gate(uint8 bindnum) { - Mob::Gate(bindnum); +void Client::Gate(uint8 bind_number) { + Mob::Gate(bind_number); } -void NPC::Gate(uint8 bindnum) { +void NPC::Gate(uint8 bind_number) { entity_list.MessageCloseString(this, true, RuleI(Range, SpellMessages), Chat::Spells, GATES, GetCleanName()); - Mob::Gate(bindnum); + Mob::Gate(bind_number); } -void Client::SetBindPoint(int bind_num, int to_zone, int to_instance, const glm::vec3 &location) +void Client::SetBindPoint(int bind_number, int to_zone, int to_instance, const glm::vec3 &location) { - if (bind_num < 0 || bind_num >= 4) - bind_num = 0; + if (bind_number < 0 || bind_number >= 4) + bind_number = 0; if (to_zone == -1) { - m_pp.binds[bind_num].zoneId = zone->GetZoneID(); - m_pp.binds[bind_num].instance_id = - (zone->GetInstanceID() != 0 && zone->IsInstancePersistent()) ? zone->GetInstanceID() : 0; - m_pp.binds[bind_num].x = m_Position.x; - m_pp.binds[bind_num].y = m_Position.y; - m_pp.binds[bind_num].z = m_Position.z; + m_pp.binds[bind_number].zone_id = zone->GetZoneID(); + m_pp.binds[bind_number].instance_id = (zone->GetInstanceID() != 0 && zone->IsInstancePersistent()) ? zone->GetInstanceID() : 0; + m_pp.binds[bind_number].x = m_Position.x; + m_pp.binds[bind_number].y = m_Position.y; + m_pp.binds[bind_number].z = m_Position.z; } else { - m_pp.binds[bind_num].zoneId = to_zone; - m_pp.binds[bind_num].instance_id = to_instance; - m_pp.binds[bind_num].x = location.x; - m_pp.binds[bind_num].y = location.y; - m_pp.binds[bind_num].z = location.z; + m_pp.binds[bind_number].zone_id = to_zone; + m_pp.binds[bind_number].instance_id = to_instance; + m_pp.binds[bind_number].x = location.x; + m_pp.binds[bind_number].y = location.y; + m_pp.binds[bind_number].z = location.z; } - database.SaveCharacterBindPoint(this->CharacterID(), m_pp.binds[bind_num], bind_num); + database.SaveCharacterBindPoint(this->CharacterID(), m_pp.binds[bind_number], bind_number); } -void Client::GoToBind(uint8 bindnum) { +void Client::SetBindPoint2(int bind_number, int to_zone, int to_instance, const glm::vec4 &location) +{ + if (bind_number < 0 || bind_number >= 4) + bind_number = 0; + + if (to_zone == -1) { + m_pp.binds[bind_number].zone_id = zone->GetZoneID(); + m_pp.binds[bind_number].instance_id = (zone->GetInstanceID() != 0 && zone->IsInstancePersistent()) ? zone->GetInstanceID() : 0; + m_pp.binds[bind_number].x = m_Position.x; + m_pp.binds[bind_number].y = m_Position.y; + m_pp.binds[bind_number].z = m_Position.z; + m_pp.binds[bind_number].heading = m_Position.w; + } else { + m_pp.binds[bind_number].zone_id = to_zone; + m_pp.binds[bind_number].instance_id = to_instance; + m_pp.binds[bind_number].x = location.x; + m_pp.binds[bind_number].y = location.y; + m_pp.binds[bind_number].z = location.z; + m_pp.binds[bind_number].heading = location.w; + } + database.SaveCharacterBindPoint(this->CharacterID(), m_pp.binds[bind_number], bind_number); +} + +void Client::GoToBind(uint8 bind_number) { // if the bind number is invalid, use the primary bind - if(bindnum > 4) - bindnum = 0; + if(bind_number > 4) + bind_number = 0; // move the client, which will zone them if needed. // ignore restrictions on the zone request..? - if(bindnum == 0) - MovePC(m_pp.binds[0].zoneId, m_pp.binds[0].instance_id, 0.0f, 0.0f, 0.0f, 0.0f, 1, GateToBindPoint); + if(bind_number == 0) + MovePC( + m_pp.binds[0].zone_id, + m_pp.binds[0].instance_id, + 0.0f, + 0.0f, + 0.0f, + 0.0f, + 1, + GateToBindPoint + ); else - MovePC(m_pp.binds[bindnum].zoneId, m_pp.binds[bindnum].instance_id, m_pp.binds[bindnum].x, m_pp.binds[bindnum].y, m_pp.binds[bindnum].z, m_pp.binds[bindnum].heading, 1); + MovePC( + m_pp.binds[bind_number].zone_id, + m_pp.binds[bind_number].instance_id, + m_pp.binds[bind_number].x, + m_pp.binds[bind_number].y, + m_pp.binds[bind_number].z, + m_pp.binds[bind_number].heading, + 1 + ); } void Client::GoToDeath() { - MovePC(m_pp.binds[0].zoneId, m_pp.binds[0].instance_id, 0.0f, 0.0f, 0.0f, 0.0f, 1, ZoneToBindPoint); + MovePC(m_pp.binds[0].zone_id, m_pp.binds[0].instance_id, 0.0f, 0.0f, 0.0f, 0.0f, 1, ZoneToBindPoint); } void Client::SetZoneFlag(uint32 zone_id) { @@ -826,26 +1039,28 @@ void Client::SendZoneFlagInfo(Client *to) const { to->Message(Chat::White, "Flags for %s:", GetName()); for(; cur != end; ++cur) { - uint32 zoneid = *cur; - - const char *short_name = content_db.GetZoneName(zoneid); - - char *long_name = nullptr; - content_db.GetZoneLongName(short_name, &long_name); - if(long_name == nullptr) - long_name = empty; - - float safe_x, safe_y, safe_z; - int16 minstatus = 0; - uint8 minlevel = 0; + uint32 zone_id = *cur; + const char* zone_short_name = ZoneName(zone_id); + std::string zone_long_name = zone_store.GetZoneLongName(zone_id); + float safe_x, safe_y, safe_z, safe_heading; + int16 min_status = 0; + uint8 min_level = 0; char flag_name[128]; - if(!content_db.GetSafePoints(short_name, 0, &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_name)) { + if(!content_db.GetSafePoints( + zone_short_name, + 0, + &safe_x, + &safe_y, + &safe_z, + &safe_heading, + &min_status, + &min_level, + flag_name + )) { strcpy(flag_name, "(ERROR GETTING NAME)"); } - to->Message(Chat::White, "Has Flag %s for zone %s (%d,%s)", flag_name, long_name, zoneid, short_name); - if(long_name != empty) - delete[] long_name; + to->Message(Chat::White, "Has Flag %s for zone %s (%d,%s)", flag_name, zone_long_name.c_str(), zone_id, zone_short_name); } } @@ -857,22 +1072,32 @@ bool Client::CanBeInZone() { if(Admin() >= RuleI(GM, MinStatusToZoneAnywhere)) return(true); - float safe_x, safe_y, safe_z; - int16 minstatus = 0; - uint8 minlevel = 0; + float safe_x, safe_y, safe_z, safe_heading; + int16 min_status = 0; + uint8 min_level = 0; char flag_needed[128]; - if(!content_db.GetSafePoints(zone->GetShortName(), zone->GetInstanceVersion(), &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_needed)) { + if(!content_db.GetSafePoints( + zone->GetShortName(), + zone->GetInstanceVersion(), + &safe_x, + &safe_y, + &safe_z, + &safe_heading, + &min_status, + &min_level, + flag_needed + )) { //this should not happen... LogDebug("[CLIENT] Unable to query zone info for ourself [{}]", zone->GetShortName()); return(false); } - if(GetLevel() < minlevel) { - LogDebug("[CLIENT] Character does not meet min level requirement ([{}] < [{}])!", GetLevel(), minlevel); + if(GetLevel() < min_level) { + LogDebug("[CLIENT] Character does not meet min level requirement ([{}] < [{}])!", GetLevel(), min_level); return(false); } - if(Admin() < minstatus) { - LogDebug("[CLIENT] Character does not meet min status requirement ([{}] < [{}])!", Admin(), minstatus); + if(Admin() < min_status) { + LogDebug("[CLIENT] Character does not meet min status requirement ([{}] < [{}])!", Admin(), min_status); return(false); }